diff -Nru mame-0.144/debian/changelog mame-0.145/debian/changelog --- mame-0.144/debian/changelog 2012-01-14 21:46:08.000000000 +0000 +++ mame-0.145/debian/changelog 2012-02-06 22:40:02.000000000 +0000 @@ -1,3 +1,11 @@ +mame (0.145-0ubuntu1) precise; urgency=low + + * New upstream release (LP: #927941) + * mame.install: generic pattern for dtd file in case it gets renamed + * rules: cope with new upstream changelog filename format: whatsnew_$(VER) + + -- Cesare Falco Mon, 06 Feb 2012 22:23:28 +0100 + mame (0.144-0ubuntu1) precise; urgency=low * New upstream release (LP: #913550) diff -Nru mame-0.144/debian/mame.install mame-0.145/debian/mame.install --- mame-0.144/debian/mame.install 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/debian/mame.install 2012-01-18 21:35:02.000000000 +0000 @@ -1,6 +1,6 @@ mame usr/games artwork/*.png usr/share/games/mame/artwork -hash/softwarelist.dtd usr/share/games/mame/hash +hash/*.dtd usr/share/games/mame/hash hash/*.xml usr/share/games/mame/hash src/osd/sdl/keymaps/*.txt usr/share/games/mame/keymaps debian/contrib/mame.ini etc/mame diff -Nru mame-0.144/debian/rules mame-0.145/debian/rules --- mame-0.144/debian/rules 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/debian/rules 2012-02-06 21:23:22.000000000 +0000 @@ -8,8 +8,8 @@ DEB_HOST_ARCH := $(shell dpkg-architecture -qDEB_HOST_ARCH) -VER=0.144 -MD5SUM=7440076e60cd5d61ea33df17fc00719a +VER=0.145 +MD5SUM=9ddcda5b26f42873c7c4d4d5dd6fccd5 # Override relevant make variables in original makefile DEB_MAME_OPTS = \ @@ -65,12 +65,12 @@ rm -rf obj/ override_dh_installchangelogs: - dh_installchangelogs --keep whatsnew.txt + dh_installchangelogs --keep whatsnew_$(subst .,,$(VER)).txt override_dh_installdocs: dh_installdocs --exclude=hlsl.txt \ --exclude=license.txt \ - --exclude=whatsnew.txt \ + --exclude=whatsnew_$(subst .,,$(VER)).txt \ --exclude=windows.txt override_dh_install: diff -Nru mame-0.144/hash/neogeo.xml mame-0.145/hash/neogeo.xml --- mame-0.144/hash/neogeo.xml 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/hash/neogeo.xml 2012-02-06 21:30:44.000000000 +0000 @@ -2,18 +2,18 @@ - + NAM-1975 (NGM-001)(NGH-001) @@ -478,33 +478,33 @@ - - + + - + - + - - - + + + - + - - - - - - - - + + + + + + + + @@ -976,32 +976,32 @@ - - + + - + - + - - + + - + - - - - - - - - + + + + + + + + @@ -1926,41 +1926,39 @@ - - + + - + - + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - @@ -2506,22 +2505,23 @@ - + - + - + - - + + + - + - + @@ -2944,9 +2944,9 @@ @@ -3500,7 +3500,7 @@ - + @@ -3801,6 +3801,7 @@ + @@ -3825,7 +3826,7 @@ - "Quiz King of Fighters (Korean release) + Quiz King of Fighters (Korean release) 1995 Saurus @@ -3870,11 +3871,11 @@ Super Sidekicks 3 - The Next Glory / Tokuten Ou 3 - eikoue no michi 1995 + SNK - SNK @@ -5409,23 +5410,23 @@ - + - + - + - + - - - - + + + + @@ -5446,23 +5447,23 @@ - + - + - + - + - - - - + + + + @@ -5478,23 +5479,23 @@ - + - + - + - + - - - - + + + + @@ -5841,20 +5842,20 @@ - + - + - + - + - - + + @@ -6377,9 +6378,9 @@ @@ -7102,7 +7103,7 @@ - + @@ -7146,7 +7147,7 @@ - + @@ -7192,7 +7193,7 @@ - + @@ -7235,7 +7236,7 @@ - + @@ -7271,12 +7272,12 @@ - - + + - + @@ -7290,14 +7291,14 @@ - - - - - - - - + + + + + + + + @@ -7326,7 +7327,7 @@ - + @@ -7370,8 +7371,8 @@ - - + + @@ -7414,7 +7415,7 @@ - + @@ -7450,30 +7451,30 @@ - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -7502,7 +7503,7 @@ - + @@ -7550,7 +7551,7 @@ - + @@ -7602,7 +7603,7 @@ - + @@ -7646,7 +7647,7 @@ - + @@ -7701,7 +7702,7 @@ - + @@ -7743,7 +7744,7 @@ - + @@ -7797,7 +7798,7 @@ - + @@ -7838,7 +7839,7 @@ - + @@ -7878,7 +7879,7 @@ - + @@ -7926,7 +7927,7 @@ - + @@ -7970,7 +7971,7 @@ - + @@ -8025,7 +8026,7 @@ - + @@ -8066,7 +8067,7 @@ - + @@ -8115,7 +8116,7 @@ - + @@ -8166,7 +8167,7 @@ - + @@ -8217,7 +8218,7 @@ - + @@ -8265,7 +8266,7 @@ - + @@ -8308,7 +8309,7 @@ - + @@ -8351,7 +8352,7 @@ - + @@ -8402,7 +8403,7 @@ - + @@ -8454,7 +8455,7 @@ - + @@ -8497,7 +8498,7 @@ - + @@ -8549,7 +8550,7 @@ - + @@ -8594,7 +8595,7 @@ - + @@ -8644,7 +8645,7 @@ - + @@ -8687,7 +8688,7 @@ - + @@ -8731,7 +8732,7 @@ - + @@ -9479,7 +9480,7 @@ - + @@ -9661,7 +9662,7 @@ - + @@ -9751,12 +9752,12 @@ - - + + - - + + @@ -9968,7 +9969,7 @@ - "The King of Fighters 2003 (bootleg, set 1) + The King of Fighters 2003 (bootleg, set 1) 2003 bootleg @@ -10129,7 +10130,7 @@ - + Digger Man (prototype) 2000 diff -Nru mame-0.144/hash/softwarelist.dtd mame-0.145/hash/softwarelist.dtd --- mame-0.144/hash/softwarelist.dtd 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/hash/softwarelist.dtd 2012-02-06 21:30:44.000000000 +0000 @@ -29,7 +29,6 @@ - diff -Nru mame-0.144/hash/stv.xml mame-0.145/hash/stv.xml --- mame-0.144/hash/stv.xml 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/hash/stv.xml 2012-02-06 21:30:44.000000000 +0000 @@ -196,12 +196,12 @@ Sega - - - - - - + + + + + + @@ -229,11 +229,11 @@ Sega - - - - - + + + + + @@ -650,11 +650,11 @@ Atlus - - - - - + + + + + diff -Nru mame-0.144/makefile mame-0.145/makefile --- mame-0.144/makefile 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/makefile 2012-02-06 21:30:44.000000000 +0000 @@ -362,7 +362,7 @@ SRC = src # build the targets in different object dirs, so they can co-exist -OBJ = obj/$(OSD)/$(FULLNAME) +OBJ = obj/$(PREFIX)$(OSD)$(SUFFIX)$(SUFFIX64)$(SUFFIXDEBUG)$(SUFFIXPROFILE) @@ -410,6 +410,10 @@ DEFS += -DUSE_NETWORK endif +# need to ensure FLAC functions are statically linked +DEFS += -DFLAC__NO_DLL + + #------------------------------------------------- # compile flags @@ -490,6 +494,9 @@ COBJFLAGS += \ -Wpointer-arith +# warnings only applicable to C++ compiles +CPPONLYFLAGS += \ + -Woverloaded-virtual #------------------------------------------------- @@ -565,8 +572,7 @@ # this variable #------------------------------------------------- -OBJDIRS = $(OBJ) - +OBJDIRS = $(OBJ) $(OBJ)/$(TARGET)/$(SUBTARGET) #------------------------------------------------- @@ -574,18 +580,19 @@ #------------------------------------------------- LIBEMU = $(OBJ)/libemu.a -LIBCPU = $(OBJ)/libcpu.a -LIBDASM = $(OBJ)/libdasm.a -LIBSOUND = $(OBJ)/libsound.a +LIBCPU = $(OBJ)/$(TARGET)/$(SUBTARGET)/libcpu.a +LIBDASM = $(OBJ)/$(TARGET)/$(SUBTARGET)/libdasm.a +LIBSOUND = $(OBJ)/$(TARGET)/$(SUBTARGET)/libsound.a LIBUTIL = $(OBJ)/libutil.a LIBOCORE = $(OBJ)/libocore.a LIBOSD = $(OBJ)/libosd.a VERSIONOBJ = $(OBJ)/version.o -DRIVLISTSRC = $(OBJ)/drivlist.c -DRIVLISTOBJ = $(OBJ)/drivlist.o -DEVLISTSRC = $(OBJ)/devlist.c -DEVLISTOBJ = $(OBJ)/devlist.o +EMUINFOOBJ = $(OBJ)/$(TARGET)/$(TARGET).o +DRIVLISTSRC = $(OBJ)/$(TARGET)/$(SUBTARGET)/drivlist.c +DRIVLISTOBJ = $(OBJ)/$(TARGET)/$(SUBTARGET)/drivlist.o +DEVLISTSRC = $(OBJ)/$(TARGET)/$(SUBTARGET)/devlist.c +DEVLISTOBJ = $(OBJ)/$(TARGET)/$(SUBTARGET)/devlist.o @@ -621,10 +628,7 @@ # add formats emulation library FORMATS_LIB = $(OBJ)/libformats.a -# add cothread library -COTHREAD = $(OBJ)/libco.a - - +JPEG_LIB = $(OBJ)/libjpeg.a #------------------------------------------------- # 'default' target needs to go here, before the @@ -635,6 +639,8 @@ all: default tools +FLAC_LIB = $(OBJ)/libflac.a +# $(OBJ)/libflac++.a #------------------------------------------------- @@ -656,6 +662,7 @@ # then the various core pieces include $(SRC)/$(TARGET)/$(SUBTARGET).mak +-include $(SRC)/$(TARGET)/osd/$(OSD)/$(OSD).mak include $(SRC)/emu/emu.mak include $(SRC)/lib/lib.mak include $(SRC)/build/build.mak @@ -725,9 +732,9 @@ ifndef EXECUTABLE_DEFINED # always recompile the version string -$(VERSIONOBJ): $(DRVLIBS) $(LIBOSD) $(LIBCPU) $(LIBEMU) $(LIBSOUND) $(LIBUTIL) $(EXPAT) $(ZLIB) $(SOFTFLOAT) $(FORMATS_LIB) $(COTHREAD) $(LIBOCORE) $(RESFILE) +$(VERSIONOBJ): $(DRVLIBS) $(LIBOSD) $(LIBCPU) $(LIBEMU) $(LIBSOUND) $(LIBUTIL) $(EXPAT) $(ZLIB) $(SOFTFLOAT) $(FORMATS_LIB) $(LIBOCORE) $(RESFILE) -$(EMULATOR): $(VERSIONOBJ) $(DRIVLISTOBJ) $(DEVLISTOBJ) $(DRVLIBS) $(LIBOSD) $(LIBCPU) $(LIBEMU) $(LIBDASM) $(LIBSOUND) $(LIBUTIL) $(EXPAT) $(SOFTFLOAT) $(FORMATS_LIB) $(COTHREAD) $(ZLIB) $(LIBOCORE) $(RESFILE) +$(EMULATOR): $(VERSIONOBJ) $(EMUINFOOBJ) $(DRIVLISTOBJ) $(DEVLISTOBJ) $(DRVLIBS) $(LIBOSD) $(LIBCPU) $(LIBEMU) $(LIBDASM) $(LIBSOUND) $(LIBUTIL) $(EXPAT) $(SOFTFLOAT) $(JPEG_LIB) $(FLAC_LIB) $(FORMATS_LIB) $(ZLIB) $(LIBOCORE) $(RESFILE) @echo Linking $@... $(LD) $(LDFLAGS) $(LDFLAGSEMULATOR) $^ $(LIBS) -o $@ ifeq ($(TARGETOS),win32) diff -Nru mame-0.144/src/build/makedep.c mame-0.145/src/build/makedep.c --- mame-0.144/src/build/makedep.c 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/src/build/makedep.c 2012-02-06 21:30:44.000000000 +0000 @@ -57,48 +57,46 @@ TYPE DEFINITIONS ***************************************************************************/ -typedef struct _include_path include_path; -struct _include_path +struct include_path { include_path * next; - const astring * path; + astring path; }; -typedef struct _exclude_path exclude_path; -struct _exclude_path +struct exclude_path { exclude_path * next; - const astring * path; + astring path; int pathlen; UINT8 recursive; }; -typedef struct _list_entry list_entry; -struct _list_entry +struct list_entry { list_entry * next; - const astring * name; + astring name; }; -typedef struct _file_entry file_entry; +struct file_entry; -typedef struct _dependency dependency; -struct _dependency +struct dependency { dependency * next; file_entry * file; }; -struct _file_entry +struct file_entry { - astring * name; + astring name; dependency * deplist; }; +typedef tagmap_t dependency_map; + /*************************************************************************** @@ -107,7 +105,7 @@ static include_path *incpaths; static exclude_path *excpaths; -static tagmap *file_map; +static tagmap_t file_map; @@ -115,25 +113,12 @@ PROTOTYPES ***************************************************************************/ -/* core output functions */ -static int recurse_dir(int srcrootlen, const astring *srcdir); -static file_entry *compute_dependencies(int srcrootlen, const astring *srcfile); - -/* path helpers */ -static astring *find_include_file(int srcrootlen, const astring *srcfile, const astring *filename); - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/* core output functions */ -static int recurse_dir(int srcrootlen, const astring *srcdir); -static file_entry *compute_dependencies(int srcrootlen, const astring *srcfile); +// core output functions +static int recurse_dir(int srcrootlen, astring &srcdir); +static file_entry &compute_dependencies(int srcrootlen, astring &srcfile); -/* path helpers */ -static astring *find_include_file(int srcrootlen, const astring *srcfile, const astring *filename); +// path helpers +static bool find_include_file(astring &srcincpath, int srcrootlen, const astring &srcfile, const astring &filename); @@ -145,82 +130,66 @@ main - main entry point -------------------------------------------------*/ +void usage(const char *argv0) +{ + fprintf(stderr, "Usage:\n%s [-Iincpath [-Iincpath [...]]]\n", argv0); + exit(1); +} + int main(int argc, char *argv[]) { include_path **incpathhead = &incpaths; exclude_path **excpathhead = &excpaths; - astring *srcdir = NULL; + astring srcdir; int unadorned = 0; - int result; - int argnum; - /* loop over arguments */ - for (argnum = 1; argnum < argc; argnum++) + // loop over arguments + for (int argnum = 1; argnum < argc; argnum++) { char *arg = argv[argnum]; - /* include path? */ + // include path? if (arg[0] == '-' && arg[1] == 'I') { - *incpathhead = (include_path *)malloc(sizeof(**incpathhead)); - if (*incpathhead != NULL) - { - (*incpathhead)->next = NULL; - (*incpathhead)->path = astring_replacechr(astring_dupc(&arg[2]), '/', PATH_SEPARATOR[0]); - incpathhead = &(*incpathhead)->next; - } + *incpathhead = new include_path; + (*incpathhead)->next = NULL; + (*incpathhead)->path.cpy(&arg[2]).replacechr('/', PATH_SEPARATOR[0]); + incpathhead = &(*incpathhead)->next; } - /* exclude path? */ + // exclude path? else if (arg[0] == '-' && arg[1] == 'X') { - *excpathhead = (exclude_path *)malloc(sizeof(**excpathhead)); - if (*excpathhead != NULL) - { - astring *path; - (*excpathhead)->next = NULL; - path = astring_replacechr(astring_dupc(&arg[2]), PATH_SEPARATOR[0], '/'); - (*excpathhead)->recursive = (astring_replacec(path, astring_len(path) - 4, "/...", "") != 0); - (*excpathhead)->path = path; - (*excpathhead)->pathlen = astring_len(path); - excpathhead = &(*excpathhead)->next; - } + *excpathhead = new exclude_path; + (*excpathhead)->next = NULL; + (*excpathhead)->path.cpy(&arg[2]).replacechr(PATH_SEPARATOR[0], '/'); + (*excpathhead)->recursive = ((*excpathhead)->path.replace((*excpathhead)->path.len() - 4, "/...", "") != 0); + (*excpathhead)->pathlen = (*excpathhead)->path.len(); + excpathhead = &(*excpathhead)->next; } - /* ignore -include which is used by sdlmame to include sdlprefix.h before all other includes */ + // ignore -include which is used by sdlmame to include sdlprefix.h before all other includes else if (strcmp(arg,"-include") == 0) { argnum++; } - /* other parameter */ + // other parameter else if (arg[0] != '-' && unadorned == 0) { - srcdir = astring_replacechr(astring_dupc(arg), '/', PATH_SEPARATOR[0]); + srcdir.cpy(arg).replacechr('/', PATH_SEPARATOR[0]); unadorned++; } else - goto usage; + usage(argv[0]); } - /* make sure we got 1 parameter */ - if (srcdir == NULL) - goto usage; - - /* create a tagmap for tracking files we've visited */ - file_map = tagmap_alloc(); - - /* recurse over subdirectories */ - result = recurse_dir(astring_len(srcdir), srcdir); - - /* free source and destination directories */ - tagmap_free(file_map); - astring_free(srcdir); - return result; + // make sure we got 1 parameter + if (srcdir.len() == 0) + usage(argv[0]); -usage: - fprintf(stderr, "Usage:\n%s [-Iincpath [-Iincpath [...]]]\n", argv[0]); - return 1; + // recurse over subdirectories + return recurse_dir(srcdir.len(), srcdir); } @@ -233,7 +202,7 @@ { const list_entry *entry1 = *(const list_entry **)p1; const list_entry *entry2 = *(const list_entry **)p2; - return strcmp(astring_c(entry1->name), astring_c(entry2->name)); + return entry1->name.cmp(entry2->name); } @@ -243,25 +212,22 @@ unless we already exist in the map -------------------------------------------------*/ -static void recurse_dependencies(file_entry *file, tagmap *map) +static void recurse_dependencies(file_entry &file, dependency_map &map) { - int filelen = astring_len(file->name); - exclude_path *exclude; - dependency *dep; - - /* skip if we're in an exclude path */ - for (exclude = excpaths; exclude != NULL; exclude = exclude->next) - if (exclude->pathlen < filelen && strncmp(astring_c(file->name), astring_c(exclude->path), exclude->pathlen) == 0) - if (exclude->recursive || astring_chr(file->name, exclude->pathlen + 1, '/') == -1) + // skip if we're in an exclude path + int filelen = file.name.len(); + for (exclude_path *exclude = excpaths; exclude != NULL; exclude = exclude->next) + if (exclude->pathlen < filelen && strncmp(file.name, exclude->path, exclude->pathlen) == 0) + if (exclude->recursive || file.name.chr(exclude->pathlen + 1, '/') == -1) return; - /* attempt to add; if we get an error, we're already present */ - if (tagmap_add(map, astring_c(file->name), file->name, FALSE) != TMERR_NONE) + // attempt to add; if we get an error, we're already present + if (map.add(file.name, 0) != TMERR_NONE) return; - /* recurse the list from there */ - for (dep = file->deplist; dep != NULL; dep = dep->next) - recurse_dependencies(dep->file, map); + // recurse the list from there + for (dependency *dep = file.deplist; dep != NULL; dep = dep->next) + recurse_dependencies(*dep->file, map); } @@ -269,122 +235,105 @@ recurse_dir - recurse through a directory -------------------------------------------------*/ -static int recurse_dir(int srcrootlen, const astring *srcdir) +static int recurse_dir(int srcrootlen, astring &srcdir) { static const osd_dir_entry_type typelist[] = { ENTTYPE_DIR, ENTTYPE_FILE }; int result = 0; - int entindex; - /* iterate first over directories, then over files */ - for (entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) + // iterate first over directories, then over files + for (int entindex = 0; entindex < ARRAY_LENGTH(typelist) && result == 0; entindex++) { osd_dir_entry_type entry_type = typelist[entindex]; - const osd_directory_entry *entry; - list_entry **listarray = NULL; - list_entry *list = NULL; - list_entry *curlist; - osd_directory *dir; - int found = 0; - /* open the directory and iterate through it */ - dir = osd_opendir(astring_c(srcdir)); + // open the directory and iterate through it + osd_directory *dir = osd_opendir(srcdir); if (dir == NULL) { result = 1; goto error; } - /* build up the list of files */ + // build up the list of files + const osd_directory_entry *entry; + list_entry *list = NULL; + int found = 0; while ((entry = osd_readdir(dir)) != NULL) if (entry->type == entry_type && entry->name[0] != '.') { - list_entry *lentry = (list_entry *)malloc(sizeof(*lentry)); - lentry->name = astring_dupc(entry->name); + list_entry *lentry = new list_entry; + lentry->name.cpy(entry->name); lentry->next = list; list = lentry; found++; } - /* close the directory */ + // close the directory osd_closedir(dir); - /* skip if nothing found */ + // skip if nothing found if (found == 0) continue; - /* allocate memory for sorting */ - listarray = (list_entry **)malloc(sizeof(list_entry *) * found); + // allocate memory for sorting + list_entry **listarray = new list_entry *[found]; found = 0; - for (curlist = list; curlist != NULL; curlist = curlist->next) + for (list_entry *curlist = list; curlist != NULL; curlist = curlist->next) listarray[found++] = curlist; - /* sort the list */ + // sort the list qsort(listarray, found, sizeof(listarray[0]), compare_list_entries); - /* rebuild the list */ + // rebuild the list list = NULL; while (--found >= 0) { listarray[found]->next = list; list = listarray[found]; } - free(listarray); + delete[] listarray; - /* iterate through each file */ - for (curlist = list; curlist != NULL && result == 0; curlist = curlist->next) + // iterate through each file + for (list_entry *curlist = list; curlist != NULL && result == 0; curlist = curlist->next) { - astring *srcfile; + astring srcfile; - /* build the source filename */ - srcfile = astring_alloc(); - astring_printf(srcfile, "%s%c%s", astring_c(srcdir), PATH_SEPARATOR[0], astring_c(curlist->name)); + // build the source filename + srcfile.printf("%s%c%s", srcdir.cstr(), PATH_SEPARATOR[0], curlist->name.cstr()); - /* if we have a file, output it */ + // if we have a file, output it if (entry_type == ENTTYPE_FILE) { - /* make sure we care, first */ - if (core_filename_ends_with(astring_c(curlist->name), ".c")) + // make sure we care, first + if (core_filename_ends_with(curlist->name, ".c")) { - tagmap *depend_map = tagmap_alloc(); - tagmap_entry *map_entry; - file_entry *file; - astring *target; - int taghash; + dependency_map depend_map; - /* find dependencies */ - file = compute_dependencies(srcrootlen, srcfile); + // find dependencies + file_entry &file = compute_dependencies(srcrootlen, srcfile); recurse_dependencies(file, depend_map); - /* convert the target from source to object (makes assumptions about rules) */ - target = astring_dup(file->name); - astring_replacec(target, 0, "src/", "$(OBJ)/"); - astring_replacec(target, 0, ".c", ".o"); - printf("\n%s : \\\n", astring_c(target)); - - /* iterate over the hashed dependencies and output them as well */ - for (taghash = 0; taghash < TAGMAP_HASH_SIZE; taghash++) - for (map_entry = depend_map->table[taghash]; map_entry != NULL; map_entry = map_entry->next) - printf("\t%s \\\n", astring_c((astring *)map_entry->object)); - - astring_free(target); - tagmap_free(depend_map); + // convert the target from source to object (makes assumptions about rules) + astring target(file.name); + target.replace(0, "src/", "$(OBJ)/"); + target.replace(0, ".c", ".o"); + printf("\n%s : \\\n", target.cstr()); + + // iterate over the hashed dependencies and output them as well + for (dependency_map::entry_t *entry = depend_map.first(); entry != NULL; entry = depend_map.next(entry)) + printf("\t%s \\\n", entry->tag().cstr()); } } - /* if we have a directory, recurse */ + // if we have a directory, recurse else result = recurse_dir(srcrootlen, srcfile); - - /* free memory for the names */ - astring_free(srcfile); } - /* free all the allocated entries */ + // free all the allocated entries while (list != NULL) { list_entry *next = list->next; - astring_free((astring *)list->name); - free(list); + delete list; list = next; } } @@ -399,84 +348,73 @@ HTML -------------------------------------------------*/ -static file_entry *compute_dependencies(int srcrootlen, const astring *srcfile) +static file_entry &compute_dependencies(int srcrootlen, astring &srcfile) { - astring *normalfile; + // see if we already have an entry + astring normalfile(srcfile); + normalfile.replacechr(PATH_SEPARATOR[0], '/'); + file_entry *foundfile = file_map.find(normalfile); + if (foundfile != NULL) + return *foundfile; + + // create a new header entry + file_entry &file = *new file_entry; + file.deplist = NULL; + file.name = normalfile; + file_map.add(file.name, &file); + + // read the source file UINT32 filelength; - file_entry *file; char *filedata; - int index; - - /* see if we already have an entry */ - normalfile = astring_dup(srcfile); - astring_replacechr(normalfile, PATH_SEPARATOR[0], '/'); - file = (file_entry *)tagmap_find(file_map, astring_c(normalfile)); - if (file != NULL) - return file; - - /* create a new header entry */ - file = (file_entry *)malloc(sizeof(*file)); - file->deplist = NULL; - file->name = normalfile; - tagmap_add(file_map, astring_c(file->name), file, FALSE); - - /* read the source file */ - if (core_fload(astring_c(srcfile), (void **)&filedata, &filelength) != FILERR_NONE) + if (core_fload(srcfile, (void **)&filedata, &filelength) != FILERR_NONE) { - fprintf(stderr, "Unable to read file '%s'\n", astring_c(srcfile)); + fprintf(stderr, "Unable to read file '%s'\n", srcfile.cstr()); return file; } - /* find the #include directives in this file */ - for (index = 0; index < filelength; index++) + // find the #include directives in this file + for (int index = 0; index < filelength; index++) if (filedata[index] == '#' && strncmp(&filedata[index + 1], "include", 7) == 0) { - astring *filename, *target; - int scan = index; - dependency *dep; - int start; - int just_continue = 0; - - /* first make sure we're not commented or quoted */ - for (scan = index; scan > 2 && filedata[scan] != 13 && filedata[scan] != 10; scan--) + // first make sure we're not commented or quoted + bool just_continue = false; + for (int scan = index; scan > 2 && filedata[scan] != 13 && filedata[scan] != 10; scan--) if ((filedata[scan] == '/' && filedata[scan - 1] == '/') || filedata[scan] == '"') { - just_continue = 1; + just_continue = true; break; } if (just_continue) continue; - /* scan forward to find the quotes or bracket */ + // scan forward to find the quotes or bracket index += 7; + int scan; for (scan = index; scan < filelength && filedata[scan] != '<' && filedata[scan] != '"' && filedata[scan] != 13 && filedata[scan] != 10; scan++) ; - /* ignore if not found or if it's bracketed */ + // ignore if not found or if it's bracketed if (scan >= filelength || filedata[scan] != '"') continue; - start = ++scan; + int start = ++scan; - /* find the closing quote */ + // find the closing quote while (scan < filelength && filedata[scan] != '"') scan++; if (scan >= filelength) continue; - /* find the include file */ - filename = astring_dupch(&filedata[start], scan - start); - target = find_include_file(srcrootlen, srcfile, filename); + // find the include file + astring filename(&filedata[start], scan - start); + astring target; - /* create a new dependency */ - if (target != NULL) + // create a new dependency + if (find_include_file(target, srcrootlen, srcfile, filename)) { - dep = (dependency *)malloc(sizeof(*dep)); - dep->next = file->deplist; - file->deplist = dep; - dep->file = compute_dependencies(srcrootlen, target); - astring_free(target); + dependency *dep = new dependency; + dep->next = file.deplist; + file.deplist = dep; + dep->file = &compute_dependencies(srcrootlen, target); } - - astring_free(filename); } osd_free(filedata); @@ -493,59 +431,51 @@ find_include_file - find an include file -------------------------------------------------*/ -static astring *find_include_file(int srcrootlen, const astring *srcfile, const astring *filename) +static bool find_include_file(astring &srcincpath, int srcrootlen, const astring &srcfile, const astring &filename) { - include_path *curpath; - - /* iterate over include paths and find the file */ - for (curpath = incpaths; curpath != NULL; curpath = curpath->next) + // iterate over include paths and find the file + for (include_path *curpath = incpaths; curpath != NULL; curpath = curpath->next) { - astring *srcincpath = astring_dup(curpath->path); - core_file *testfile; + // a '.' include path is specially treated + if (curpath->path == ".") + srcincpath.cpysubstr(srcfile, 0, srcfile.rchr(0, PATH_SEPARATOR[0])); + else + srcincpath.cpy(curpath->path); + + // append the filename piecemeal to account for directories int lastsepindex = 0; int sepindex; - - /* a '.' include path is specially treated */ - if (astring_cmpc(curpath->path, ".") == 0) - astring_cpysubstr(srcincpath, srcfile, 0, astring_rchr(srcfile, 0, PATH_SEPARATOR[0])); - - /* append the filename piecemeal to account for directories */ - while ((sepindex = astring_chr(filename, lastsepindex, '/')) != -1) + while ((sepindex = filename.chr(lastsepindex, '/')) != -1) { - astring *pathpart = astring_dupsubstr(filename, lastsepindex, sepindex - lastsepindex); + astring pathpart(filename, lastsepindex, sepindex - lastsepindex); - /* handle .. by removing a chunk from the incpath */ - if (astring_cmpc(pathpart, "..") == 0) + // handle .. by removing a chunk from the incpath + if (pathpart == "..") { - int sepindex_part = astring_rchr(srcincpath, 0, PATH_SEPARATOR[0]); + int sepindex_part = srcincpath.rchr(0, PATH_SEPARATOR[0]); if (sepindex_part != -1) - astring_substr(srcincpath, 0, sepindex_part); + srcincpath.substr(0, sepindex_part); } - /* otherwise, append a path separator and the pathpart */ + // otherwise, append a path separator and the pathpart else - astring_cat(astring_catc(srcincpath, PATH_SEPARATOR), pathpart); + srcincpath.cat(PATH_SEPARATOR).cat(pathpart); - /* advance past the previous index */ + // advance past the previous index lastsepindex = sepindex + 1; - - /* free the path part we extracted */ - astring_free(pathpart); } - /* now append the filename */ - astring_catsubstr(astring_catc(srcincpath, PATH_SEPARATOR), filename, lastsepindex, -1); + // now append the filename + srcincpath.cat(PATH_SEPARATOR).catsubstr(filename, lastsepindex, -1); - /* see if we can open it */ - if (core_fopen(astring_c(srcincpath), OPEN_FLAG_READ, &testfile) == FILERR_NONE) + // see if we can open it + core_file *testfile; + if (core_fopen(srcincpath, OPEN_FLAG_READ, &testfile) == FILERR_NONE) { - /* close the file */ + // close the file core_fclose(testfile); - return srcincpath; + return true; } - - /* free our include path */ - astring_free(srcincpath); } - return NULL; + return false; } diff -Nru mame-0.144/src/build/makedev.c mame-0.145/src/build/makedev.c --- mame-0.144/src/build/makedev.c 2012-01-13 15:34:16.000000000 +0000 +++ mame-0.145/src/build/makedev.c 2012-02-06 21:30:44.000000000 +0000 @@ -44,9 +44,12 @@ #define MAX_DEVICES 65536 +#define MAX_IGNORE 512 static const char *devlist[MAX_DEVICES]; static int devcount; +static const char *ignorelst[MAX_IGNORE]; +static int ignorecount; //------------------------------------------------- @@ -61,6 +64,20 @@ return strcmp(*item1, *item2); } +//------------------------------------------------- +// isignored - return info if item is in ignore +// list or not +//------------------------------------------------- + +bool isignored(const char *drivname) +{ + if (ignorecount>0) { + for(int i=0;i0) { + for(int i=0;i #include #include +#include #include "png.h" @@ -73,7 +74,7 @@ INT32 width; /* width from this character to the next */ INT32 xoffs, yoffs; /* X and Y offset from baseline to top,left of bitmap */ INT32 bmwidth, bmheight; /* width and height of bitmap */ - bitmap_t * bitmap; /* pointer to the bitmap containing the raw data */ + bitmap_argb32 * bitmap; /* pointer to the bitmap containing the raw data */ }; @@ -92,9 +93,9 @@ INLINE FUNCTIONS ***************************************************************************/ -INLINE int pixel_is_set(bitmap_t *bitmap, int y, int x) +INLINE int pixel_is_set(bitmap_argb32 &bitmap, int y, int x) { - return (*BITMAP_ADDR32(bitmap, y, x) & 0xffffff) == 0; + return (bitmap.pix32(y, x) & 0xffffff) == 0; } @@ -186,7 +187,7 @@ for (y = 0; y < ch->bmheight; y++) { int desty = y + font->height + font->yoffs - ch->yoffs - ch->bmheight; - const UINT32 *src = (desty >= 0 && desty < font->height) ? BITMAP_ADDR32(ch->bitmap, desty, 0) : NULL; + const UINT32 *src = (desty >= 0 && desty < font->height) ? &ch->bitmap->pix32(desty) : NULL; for (x = 0; x < ch->bmwidth; x++) { if (src != NULL && src[x] != 0) @@ -210,7 +211,7 @@ goto error; /* free the bitmap and texture */ - bitmap_free(ch->bitmap); + delete ch->bitmap; ch->bitmap = NULL; } @@ -257,26 +258,26 @@ characters in the given font -------------------------------------------------*/ -static int bitmap_to_chars(bitmap_t *bitmap, render_font *font) +static int bitmap_to_chars(bitmap_argb32 &bitmap, render_font *font) { int rowstart = 0; int x, y; /* loop over rows */ - while (rowstart < bitmap->height) + while (rowstart < bitmap.height()) { int rowend, baseline, colstart; int chstart; /* find the top of the row */ - for ( ; rowstart < bitmap->height; rowstart++) + for ( ; rowstart < bitmap.height(); rowstart++) if (pixel_is_set(bitmap, rowstart, 0)) break; - if (rowstart >= bitmap->height) + if (rowstart >= bitmap.height()) break; /* find the bottom of the row */ - for (rowend = rowstart + 1; rowend < bitmap->height; rowend++) + for (rowend = rowstart + 1; rowend < bitmap.height(); rowend++) if (!pixel_is_set(bitmap, rowend, 0)) { rowend--; @@ -324,20 +325,20 @@ /* scan the column to find characters */ colstart = 0; - while (colstart < bitmap->width) + while (colstart < bitmap.width()) { render_font_char *ch = &font->chars[chstart]; int colend; /* find the start of the character */ - for ( ; colstart < bitmap->width; colstart++) + for ( ; colstart < bitmap.width(); colstart++) if (pixel_is_set(bitmap, rowend + 2, colstart)) break; - if (colstart >= bitmap->width) + if (colstart >= bitmap.width()) break; /* find the end of the character */ - for (colend = colstart + 1; colend < bitmap->width; colend++) + for (colend = colstart + 1; colend < bitmap.width(); colend++) if (!pixel_is_set(bitmap, rowend + 2, colend)) { colend--; @@ -351,7 +352,7 @@ // printf(" Character %X - width = %d\n", chstart, colend - colstart + 1); /* allocate a bitmap */ - ch->bitmap = bitmap_alloc(colend - colstart + 1, font->height, BITMAP_FORMAT_ARGB32); + ch->bitmap = new(std::nothrow) bitmap_argb32(colend - colstart + 1, font->height); if (ch->bitmap == NULL) { fprintf(stderr, "Error allocating character bitmap (%dx%d)\n", colend - colstart + 1, font->height); @@ -361,14 +362,14 @@ /* plot the character */ for (y = rowstart; y <= rowend; y++) for (x = colstart; x <= colend; x++) - *BITMAP_ADDR32(ch->bitmap, y - rowstart, x - colstart) = pixel_is_set(bitmap, y, x) ? 0xffffffff : 0x00000000; + ch->bitmap->pix32(y - rowstart, x - colstart) = pixel_is_set(bitmap, y, x) ? 0xffffffff : 0x00000000; /* set the character parameters */ ch->width = colend - colstart + 1; ch->xoffs = 0; ch->yoffs = font->yoffs; - ch->bmwidth = ch->bitmap->width; - ch->bmheight = ch->bitmap->height; + ch->bmwidth = ch->bitmap->width(); + ch->bmheight = ch->bitmap->height(); } /* next character */ @@ -381,7 +382,7 @@ } /* return non-zero (TRUE) if we errored */ - return (rowstart < bitmap->height); + return (rowstart < bitmap.height()); } @@ -413,21 +414,19 @@ /* iterate over input files */ for (curarg = 1; curarg < argc - 1; curarg++) { + /* load the png file */ const char *pngname = argv[curarg]; - file_error filerr; - png_error pngerr; - bitmap_t *bitmap; core_file *file; - - /* load the png file */ - filerr = core_fopen(pngname, OPEN_FLAG_READ, &file); + file_error filerr = core_fopen(pngname, OPEN_FLAG_READ, &file); if (filerr != FILERR_NONE) { fprintf(stderr, "Error %d attempting to open PNG file\n", filerr); error = TRUE; break; } - pngerr = png_read_bitmap(file, &bitmap); + + bitmap_argb32 bitmap; + png_error pngerr = png_read_bitmap(file, bitmap); core_fclose(file); if (pngerr != PNGERR_NONE) { @@ -438,7 +437,6 @@ /* parse the PNG into characters */ error = bitmap_to_chars(bitmap, font); - bitmap_free(bitmap); if (error) break; } diff -Nru mame-0.144/src/emu/addrmap.c mame-0.145/src/emu/addrmap.c --- mame-0.144/src/emu/addrmap.c 2012-01-13 15:34:17.000000000 +0000 +++ mame-0.145/src/emu/addrmap.c 2012-02-06 21:30:27.000000000 +0000 @@ -45,29 +45,6 @@ //************************************************************************** //------------------------------------------------- -// set_tag - set the appropriate tag for a device -//------------------------------------------------- - -inline void map_handler_data::set_tag(const device_t &device, const char *tag) -{ - if (strcmp(tag, DEVICE_SELF) == 0) - m_tag = device.tag(); - else if (strcmp(tag, DEVICE_SELF_OWNER) == 0) - { - assert(device.owner() != NULL); - m_tag = device.owner()->tag(); - } - else - m_tag = device.subtag(m_derived_tag, tag); -} - - - -//************************************************************************** -// ADDRESS MAP ENTRY -//************************************************************************** - -//------------------------------------------------- // address_map_entry - constructor //------------------------------------------------- @@ -132,7 +109,7 @@ void address_map_entry::set_read_port(const device_t &device, const char *tag) { m_read.m_type = AMH_PORT; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); } @@ -144,7 +121,7 @@ void address_map_entry::set_write_port(const device_t &device, const char *tag) { m_write.m_type = AMH_PORT; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); } @@ -156,9 +133,9 @@ void address_map_entry::set_readwrite_port(const device_t &device, const char *tag) { m_read.m_type = AMH_PORT; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_write.m_type = AMH_PORT; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); } @@ -170,7 +147,7 @@ void address_map_entry::set_read_bank(const device_t &device, const char *tag) { m_read.m_type = AMH_BANK; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); } @@ -182,7 +159,7 @@ void address_map_entry::set_write_bank(const device_t &device, const char *tag) { m_write.m_type = AMH_BANK; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); } @@ -194,9 +171,9 @@ void address_map_entry::set_readwrite_bank(const device_t &device, const char *tag) { m_read.m_type = AMH_BANK; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_write.m_type = AMH_BANK; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); } @@ -213,10 +190,10 @@ assert(unitmask_is_appropriate(bits, mask, func.name())); m_read.m_type = AMH_DEVICE_SUBMAP; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_read.m_mask = mask; m_write.m_type = AMH_DEVICE_SUBMAP; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_write.m_mask = mask; m_submap_delegate = func; m_submap_bits = bits; @@ -267,7 +244,7 @@ m_read.m_bits = 8; m_read.m_mask = unitmask; m_read.m_name = string; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rdevice8 = func; } @@ -280,7 +257,7 @@ m_write.m_bits = 8; m_write.m_mask = unitmask; m_write.m_name = string; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wdevice8 = func; } @@ -300,7 +277,7 @@ m_read.m_bits = 8; m_read.m_mask = unitmask; m_read.m_name = func.name(); - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rproto8 = func; } @@ -313,7 +290,7 @@ m_write.m_bits = 8; m_write.m_mask = unitmask; m_write.m_name = func.name(); - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wproto8 = func; } @@ -369,7 +346,7 @@ m_read.m_bits = 16; m_read.m_mask = unitmask; m_read.m_name = string; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rdevice16 = func; } @@ -382,7 +359,7 @@ m_write.m_bits = 16; m_write.m_mask = unitmask; m_write.m_name = string; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wdevice16 = func; } @@ -402,7 +379,7 @@ m_read.m_bits = 16; m_read.m_mask = unitmask; m_read.m_name = func.name(); - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rproto16 = func; } @@ -415,7 +392,7 @@ m_write.m_bits = 16; m_write.m_mask = unitmask; m_write.m_name = func.name(); - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wproto16 = func; } @@ -471,7 +448,7 @@ m_read.m_bits = 32; m_read.m_mask = unitmask; m_read.m_name = string; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rdevice32 = func; } @@ -484,7 +461,7 @@ m_write.m_bits = 32; m_write.m_mask = unitmask; m_write.m_name = string; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wdevice32 = func; } @@ -504,7 +481,7 @@ m_read.m_bits = 32; m_read.m_mask = unitmask; m_read.m_name = func.name(); - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rproto32 = func; } @@ -517,7 +494,7 @@ m_write.m_bits = 32; m_write.m_mask = unitmask; m_write.m_name = func.name(); - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wproto32 = func; } @@ -573,7 +550,7 @@ m_read.m_bits = 64; m_read.m_mask = 0; m_read.m_name = string; - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rdevice64 = func; } @@ -586,7 +563,7 @@ m_write.m_bits = 64; m_write.m_mask = 0; m_write.m_name = string; - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wdevice64 = func; } @@ -606,7 +583,7 @@ m_read.m_bits = 64; m_read.m_mask = 0; m_read.m_name = func.name(); - m_read.set_tag(device, tag); + device.subtag(m_read.m_tag, tag); m_rproto64 = func; } @@ -619,7 +596,7 @@ m_write.m_bits = 64; m_write.m_mask = 0; m_write.m_name = func.name(); - m_write.set_tag(device, tag); + device.subtag(m_write.m_tag, tag); m_wproto64 = func; } diff -Nru mame-0.144/src/emu/addrmap.h mame-0.145/src/emu/addrmap.h --- mame-0.144/src/emu/addrmap.h 2012-01-13 15:34:17.000000000 +0000 +++ mame-0.145/src/emu/addrmap.h 2012-02-06 21:30:27.000000000 +0000 @@ -85,17 +85,13 @@ : m_type(AMH_NONE), m_bits(0), m_mask(0), - m_name(NULL), - m_tag(NULL) { } + m_name(NULL) { } map_handler_type m_type; // type of the handler UINT8 m_bits; // width of the handler in bits, or 0 for default UINT64 m_mask; // mask for which lanes apply const char * m_name; // name of the handler - const char * m_tag; // tag pointing to a reference - astring m_derived_tag; // string used to hold derived names - - void set_tag(const device_t &device, const char *tag); + astring m_tag; // path to the target tag }; diff -Nru mame-0.144/src/emu/audio/generic.c mame-0.145/src/emu/audio/generic.c --- mame-0.144/src/emu/audio/generic.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/audio/generic.c 2012-02-06 21:30:26.000000000 +0000 @@ -128,6 +128,15 @@ WRITE8_HANDLER( soundlatch4_w ) { latch_w(space, 3, data); } WRITE16_HANDLER( soundlatch4_word_w ) { latch_w(space, 3, data); } +WRITE8_MEMBER( driver_device::soundlatch_w ) { latch_w(&space, 0, data); } +WRITE16_MEMBER( driver_device::soundlatch_word_w ) { latch_w(&space, 0, data); } +WRITE8_MEMBER( driver_device::soundlatch2_w ) { latch_w(&space, 1, data); } +WRITE16_MEMBER( driver_device::soundlatch2_word_w ) { latch_w(&space, 1, data); } +WRITE8_MEMBER( driver_device::soundlatch3_w ) { latch_w(&space, 2, data); } +WRITE16_MEMBER( driver_device::soundlatch3_word_w ) { latch_w(&space, 2, data); } +WRITE8_MEMBER( driver_device::soundlatch4_w ) { latch_w(&space, 3, data); } +WRITE16_MEMBER( driver_device::soundlatch4_word_w ) { latch_w(&space, 3, data); } + /*------------------------------------------------- soundlatch_r - global read handlers for @@ -143,6 +152,15 @@ READ8_HANDLER( soundlatch4_r ) { return latch_r(space, 3); } READ16_HANDLER( soundlatch4_word_r ) { return latch_r(space, 3); } +READ8_MEMBER( driver_device::soundlatch_r ) { return latch_r(&space, 0); } +READ16_MEMBER( driver_device::soundlatch_word_r ) { return latch_r(&space, 0); } +READ8_MEMBER( driver_device::soundlatch2_r ) { return latch_r(&space, 1); } +READ16_MEMBER( driver_device::soundlatch2_word_r ) { return latch_r(&space, 1); } +READ8_MEMBER( driver_device::soundlatch3_r ) { return latch_r(&space, 2); } +READ16_MEMBER( driver_device::soundlatch3_word_r ) { return latch_r(&space, 2); } +READ8_MEMBER( driver_device::soundlatch4_r ) { return latch_r(&space, 3); } +READ16_MEMBER( driver_device::soundlatch4_word_r ) { return latch_r(&space, 3); } + /*------------------------------------------------- soundlatch_clear_w - global write handlers @@ -154,6 +172,11 @@ WRITE8_HANDLER( soundlatch3_clear_w ) { latch_clear(space, 2); } WRITE8_HANDLER( soundlatch4_clear_w ) { latch_clear(space, 3); } +WRITE8_MEMBER( driver_device::soundlatch_clear_w ) { latch_clear(&space, 0); } +WRITE8_MEMBER( driver_device::soundlatch2_clear_w ) { latch_clear(&space, 1); } +WRITE8_MEMBER( driver_device::soundlatch3_clear_w ) { latch_clear(&space, 2); } +WRITE8_MEMBER( driver_device::soundlatch4_clear_w ) { latch_clear(&space, 3); } + /*------------------------------------------------- soundlatch_setclearedvalue - set the "clear" diff -Nru mame-0.144/src/emu/audit.c mame-0.145/src/emu/audit.c --- mame-0.144/src/emu/audit.c 2012-01-13 15:34:17.000000000 +0000 +++ mame-0.145/src/emu/audit.c 2012-02-06 21:30:28.000000000 +0000 @@ -76,7 +76,7 @@ // temporary hack until romload is update: get the driver path and support it for // all searches -const char *driverpath = m_enumerator.config().devicelist().find("root")->searchpath(); +const char *driverpath = m_enumerator.config().root_device().searchpath(); // iterate over ROM sources and regions int found = 0; @@ -234,49 +234,60 @@ int found = 0; // iterate over sample entries - for (const device_t *device = m_enumerator.config().first_device(); device != NULL; device = device->next()) - if (device->type() == SAMPLES) + samples_device_iterator iter(m_enumerator.config().root_device()); + for (samples_device *device = iter.first(); device != NULL; device = iter.next()) + { + const samples_interface *intf = reinterpret_cast(device->static_config()); + if (intf->samplenames != NULL) { - const samples_interface *intf = reinterpret_cast(device->static_config()); - if (intf->samplenames != NULL) + // 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++) { - // by default we just search using the driver name - astring searchpath(m_enumerator.driver().name); + // starred entries indicate an additional searchpath + if (intf->samplenames[sampnum][0] == '*') + { + searchpath.cat(";").cat(&intf->samplenames[sampnum][1]); + continue; + } - // iterate over samples in this entry - for (int sampnum = 0; intf->samplenames[sampnum] != NULL; sampnum++) + required++; + + // 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])) { - // starred entries indicate an additional searchpath - if (intf->samplenames[sampnum][0] == '*') - { - searchpath.cat(";").cat(&intf->samplenames[sampnum][1]); - continue; - } + astring wholepath; + wholepath = curpath + ".flac"; - required++; + // attempt to access the file (.flac) + file_error filerr = file.open(wholepath); - // create a new record - audit_record &record = m_record_list.append(*global_alloc(audit_record(intf->samplenames[sampnum], audit_record::MEDIA_SAMPLE))); + if (filerr != FILERR_NONE) + { + wholepath = curpath + ".wav"; + // try again with .wav + filerr = file.open(wholepath); + } - // 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])) + if (filerr == FILERR_NONE) { - // attempt to access the file - file_error filerr = file.open(curpath); - if (filerr == FILERR_NONE) - { - record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_GOOD); - found++; - } - else - record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND); + record.set_status(audit_record::STATUS_GOOD, audit_record::SUBSTATUS_GOOD); + found++; } + else + record.set_status(audit_record::STATUS_NOT_FOUND, audit_record::SUBSTATUS_NOT_FOUND); } } } + } if (found == 0 && required > 0) { diff -Nru mame-0.144/src/emu/cheat.c mame-0.145/src/emu/cheat.c --- mame-0.144/src/emu/cheat.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/cheat.c 2012-02-06 21:30:28.000000000 +0000 @@ -1174,8 +1174,8 @@ // load the cheat file, MESS will load a crc32.xml ( eg. 01234567.xml ) // and MAME will load gamename.xml - device_image_interface *image = NULL; - for (bool gotone = machine().devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine().root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) if (image->exists()) { // if we are loading through software lists, try to load shortname.xml diff -Nru mame-0.144/src/emu/clifront.c mame-0.145/src/emu/clifront.c --- mame-0.144/src/emu/clifront.c 2012-01-13 15:34:17.000000000 +0000 +++ mame-0.145/src/emu/clifront.c 2012-02-06 21:30:28.000000000 +0000 @@ -166,7 +166,7 @@ // determine the base name of the EXE astring exename; - core_filename_extract_base(&exename, argv[0], TRUE); + core_filename_extract_base(exename, argv[0], true); // if we have a command, execute that if (strlen(m_options.command()) != 0) @@ -180,68 +180,65 @@ if (system == NULL && strlen(m_options.system_name()) > 0) throw emu_fatalerror(MAMERR_NO_SUCH_GAME, "Unknown system '%s'", m_options.system_name()); - if (strlen(m_options.software_name()) > 0) { + if (strlen(m_options.software_name()) > 0) + { machine_config config(*system, m_options); - if (!config.devicelist().first(SOFTWARE_LIST)) + software_list_device_iterator iter(config.root_device()); + if (iter.first() == NULL) throw emu_fatalerror(MAMERR_FATALERROR, "Error: unknown option: %s\n", m_options.software_name()); bool found = FALSE; - for (device_t *swlists = config.devicelist().first(SOFTWARE_LIST); swlists != NULL; swlists = swlists->typenext()) + for (software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(swlists)->inline_config(); - - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) + software_list *list = software_list_open(m_options, swlist->list_name(), FALSE, NULL); + if (list) { - if (swlist->list_name[i] && *swlist->list_name[i]) + software_info *swinfo = software_list_find(list, m_options.software_name(), NULL); + if (swinfo != NULL) { - software_list *list = software_list_open(m_options, swlist->list_name[i], FALSE, NULL); - - if (list) + // loop through all parts + for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) { - software_info *swinfo = software_list_find(list, m_options.software_name(), NULL); - if (swinfo!=NULL) { - for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) + const char *mount = software_part_get_feature(swpart, "automount"); + if (is_software_compatible(swpart, swlist)) + { + if (mount == NULL || strcmp(mount,"no") != 0) { - const char *mount = software_part_get_feature(swpart, "automount"); - if (mount==NULL || strcmp(mount,"no")!=0) { - // loop trough all parts - // search for a device with the right interface - const device_image_interface *image = NULL; - for (bool gotone = config.devicelist().first(image); gotone; gotone = image->next(image)) + // search for an image device with the right interface + image_interface_iterator imgiter(config.root_device()); + for (device_image_interface *image = imgiter.first(); image != NULL; image = imgiter.next()) + { + const char *interface = image->image_interface(); + if (interface != NULL) { - const char *interface = image->image_interface(); - if (interface != NULL) + if (!strcmp(interface, swpart->interface_)) { - if (!strcmp(interface, swpart->interface_)) + const char *option = m_options.value(image->brief_instance_name()); + // mount only if not already mounted + if (strlen(option) == 0) { - const char *option = m_options.value(image->brief_instance_name()); - // mount only if not already mounted - if (strlen(option)==0) { - astring val; - val.printf("%s:%s:%s",swlist->list_name[i],m_options.software_name(),swpart->name); - // call this in order to set slot devices according to mounting - m_options.parse_slot_devices(argc, argv, option_errors, image->instance_name(), val.cstr()); - } + astring val; + val.printf("%s:%s:%s",swlist->list_name(),m_options.software_name(),swpart->name); + // call this in order to set slot devices according to mounting + m_options.parse_slot_devices(argc, argv, option_errors, image->instance_name(), val.cstr()); break; } } } } } - software_list_close(list); found = TRUE; - break; } - } - software_list_close(list); } - if (found) break; + software_list_close(list); } + if (found) break; } - if (!found) { - software_display_matches(config.devicelist(),m_options, NULL,m_options.software_name()); + if (!found) + { + software_display_matches(config,m_options, NULL,m_options.software_name()); throw emu_fatalerror(MAMERR_FATALERROR, ""); } } @@ -268,7 +265,7 @@ // print them out fprintf(stderr, "\n\"%s\" approximately matches the following\n" - "supported " GAMESNOUN " (best match first):\n\n", m_options.system_name()); + "supported %s (best match first):\n\n", m_options.system_name(),emulator_info::get_gamesnoun()); 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); @@ -351,7 +348,7 @@ // 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()); + mame_printf_info("%-16s %s\n", drivlist.driver().name, core_filename_extract_base(filename, drivlist.driver().source_file).cstr()); } @@ -441,7 +438,7 @@ 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)); + mame_printf_info("%-16s %-16s %-16s\n", core_filename_extract_base(filename, drivlist.driver().source_file).cstr(), drivlist.driver().name, (clone_of == -1 ? "" : drivlist.driver(clone_of).name)); } } @@ -554,11 +551,8 @@ while (drivlist.next()) { // see if we have samples - const device_t *device; - for (device = drivlist.config().first_device(); device != NULL; device = device->next()) - if (device->type() == SAMPLES) - break; - if (device == NULL) + samples_device_iterator iter(drivlist.config().root_device()); + if (iter.first() == NULL) continue; // print a header @@ -568,16 +562,15 @@ mame_printf_info("Samples required for driver \"%s\".\n", drivlist.driver().name); // iterate over samples devices - for ( ; device != NULL; device = device->next()) - if (device->type() == SAMPLES) - { - // if the list is legit, walk it and print the sample info - const char *const *samplenames = reinterpret_cast(device->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]); - } + for (samples_device *device = iter.first(); device != NULL; device = iter.next()) + { + // if the list is legit, walk it and print the sample info + const char *const *samplenames = reinterpret_cast(device->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]); + } } } @@ -605,7 +598,8 @@ printf("Driver %s (%s):\n", drivlist.driver().name, drivlist.driver().description); // iterate through devices - for (const device_t *device = drivlist.config().first_device(); device != NULL; device = device->next()) + device_iterator iter(drivlist.config().root_device()); + for (const device_t *device = iter.first(); device != NULL; device = iter.next()) { printf(" %s ('%s')", device->name(), device->tag()); @@ -645,18 +639,18 @@ while (drivlist.next()) { // iterate - const device_slot_interface *slot = NULL; + slot_interface_iterator iter(drivlist.config().root_device()); bool first = true; - for (bool gotone = drivlist.config().devicelist().first(slot); gotone; gotone = slot->next(slot)) + for (const device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) { // output the line, up to the list of extensions - printf("%-13s%-10s ", first ? drivlist.driver().name : "", slot->device().tag()); + printf("%-13s%-10s ", first ? drivlist.driver().name : "", slot->device().tag()+1); // get the options and print them const slot_interface* intf = slot->get_slot_interfaces(); for (int i = 0; intf[i].name != NULL; i++) { - device_t *dev = (*intf[i].devtype)(drivlist.config(), "dummy", drivlist.config().devicelist().first(), 0); + device_t *dev = (*intf[i].devtype)(drivlist.config(), "dummy", &drivlist.config().root_device(), 0); dev->config_complete(); if (i==0) { printf("%-15s %s\n", intf[i].name,dev->name()); @@ -697,9 +691,9 @@ while (drivlist.next()) { // iterate - const device_image_interface *imagedev = NULL; + image_interface_iterator iter(drivlist.config().root_device()); bool first = true; - for (bool gotone = drivlist.config().devicelist().first(imagedev); gotone; gotone = imagedev->next(imagedev)) + for (const device_image_interface *imagedev = iter.first(); imagedev != NULL; imagedev = iter.next()) { // extract the shortname with parentheses astring paren_shortname; @@ -801,7 +795,7 @@ driver_enumerator dummy_drivlist(m_options); dummy_drivlist.next(); machine_config &config = dummy_drivlist.config(); - device_t *owner = config.devicelist().first(); + device_t *owner = &config.root_device(); // check if all are listed, note that empty one is included for (int i = 0; i < m_device_count; i++) { @@ -997,14 +991,12 @@ // first determine the maximum number of lists we might encounter int list_count = 0; while (drivlist.next()) - for (const device_t *dev = drivlist.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) - { - software_list_config *swlist = (software_list_config *)downcast(dev)->inline_config(); - - 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++; - } + { + software_list_device_iterator iter(drivlist.config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) + if (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) + list_count++; + } // allocate a list astring *lists = global_alloc_array(astring, list_count); @@ -1084,169 +1076,167 @@ drivlist.reset(); list_count = 0; while (drivlist.next()) - for (const device_t *dev = drivlist.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) + { + software_list_device_iterator iter(drivlist.config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(dev)->inline_config(); - - for (int listnum = 0; listnum < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; listnum++) + if (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) { - if (swlist->list_name[listnum] && *swlist->list_name[listnum] && swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM) + software_list *list = software_list_open(m_options, swlist->list_name(), FALSE, NULL); + + if ( list ) { - software_list *list = software_list_open(m_options, swlist->list_name[listnum], 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()) + seen_before = true; - if ( list ) + if (!seen_before) { - /* 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; + lists[list_count++] = swlist->list_name(); + software_list_parse( list, NULL, NULL ); - if (!seen_before) - { - lists[list_count++] = swlist->list_name[listnum]; - software_list_parse( list, NULL, NULL ); + fprintf(out, "\t\n", swlist->list_name(), xml_normalize_string(software_list_get_description(list)) ); - fprintf(out, "\t\n", swlist->list_name[listnum], xml_normalize_string(software_list_get_description(list)) ); + for ( software_info *swinfo = software_list_find( list, "*", NULL ); swinfo != NULL; swinfo = software_list_find( list, "*", swinfo ) ) + { + fprintf( out, "\t\tshortname ); + 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%s\n", xml_normalize_string(swinfo->longname) ); + fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->year ) ); + fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->publisher ) ); - 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 ) ) { - fprintf( out, "\t\tshortname ); - 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%s\n", xml_normalize_string(swinfo->longname) ); - fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->year ) ); - fprintf( out, "\t\t\t%s\n", xml_normalize_string( swinfo->publisher ) ); + fprintf( out, "\t\t\tname ); + if ( part->interface_ ) + fprintf( out, " interface=\"%s\"", part->interface_ ); - for ( software_part *part = software_find_part( swinfo, NULL, NULL ); part != NULL; part = software_part_next( part ) ) - { - fprintf( out, "\t\t\tname ); - if ( part->interface_ ) - fprintf( out, " interface=\"%s\"", part->interface_ ); + fprintf( out, ">\n"); - fprintf( out, ">\n"); + if ( part->featurelist ) + { + feature_list *flist = part->featurelist; - if ( part->featurelist ) + while( flist ) { - feature_list *flist = part->featurelist; - - while( flist ) - { - fprintf( out, "\t\t\t\t\n", flist->name, flist->value ); - flist = flist->next; - } + fprintf( out, "\t\t\t\t\n", flist->name, flist->value ); + flist = flist->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\n", ROMREGION_GETTAG(region), ROMREGION_GETLENGTH(region) ); - else - fprintf( out, "\t\t\t\t\n", ROMREGION_GETTAG(region) ); + if (!is_disk) + fprintf( out, "\t\t\t\t\n", ROMREGION_GETTAG(region), ROMREGION_GETLENGTH(region) ); + else + fprintf( out, "\t\t\t\t\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\tnext()) - 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\"" ); + 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, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes"); + if (!is_disk) + fprintf( out, " offset=\"0x%x\"", ROM_GETOFFSET(rom) ); - if ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(1)) - fprintf( out, " loadflag=\"load16_byte\"" ); + 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 ((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(3)) - fprintf( out, " loadflag=\"load32_byte\"" ); + if (is_disk) + fprintf( out, " writeable=\"%s\"", (ROM_GETFLAGS(rom) & DISK_READONLYMASK) ? "no" : "yes"); - 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(1)) + fprintf( out, " loadflag=\"load16_byte\"" ); - 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_SKIP(3)) + fprintf( out, " loadflag=\"load32_byte\"" ); - 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" ); - } - else if ( ROMENTRY_ISRELOAD(rom) ) + if (((ROM_GETFLAGS(rom) & ROM_SKIPMASK) == ROM_SKIP(2)) && ((ROM_GETFLAGS(rom) & ROM_GROUPMASK) == ROM_GROUPWORD)) { - fprintf( out, "\t\t\t\t\t\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\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\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\n" ); - else - fprintf( out, "\t\t\t\t\n" ); + fprintf( out, "/>\n" ); + } + else if ( ROMENTRY_ISRELOAD(rom) ) + { + fprintf( out, "\t\t\t\t\t\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) ); + } + else if ( ROMENTRY_ISCONTINUE(rom) ) + { + fprintf( out, "\t\t\t\t\t\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) ); + } + else if ( ROMENTRY_ISFILL(rom) ) + { + fprintf( out, "\t\t\t\t\t\n", ROM_GETLENGTH(rom), ROM_GETOFFSET(rom) ); + } } - fprintf( out, "\t\t\t\n" ); + if (!is_disk) + fprintf( out, "\t\t\t\t\n" ); + else + fprintf( out, "\t\t\t\t\n" ); } - fprintf( out, "\t\t\n" ); + fprintf( out, "\t\t\t\n" ); } - fprintf(out, "\t\n" ); + fprintf( out, "\t\t\n" ); } - software_list_close( list ); + fprintf(out, "\t\n" ); } + + software_list_close( list ); } } } + } if (list_count > 0) fprintf( out, "\n" ); @@ -1300,14 +1290,16 @@ if (strcmp(m_options.command(), CLICOMMAND_SHOWUSAGE) == 0) { astring helpstring; - mame_printf_info(USAGE "\n\nOptions:\n%s", exename, GAMENOUN, m_options.output_help(helpstring)); + emulator_info::printf_usage(exename, emulator_info::get_gamenoun()); + mame_printf_info("\n\nOptions:\n%s", m_options.output_help(helpstring)); return; } // validate? if (strcmp(m_options.command(), CLICOMMAND_VALIDATE) == 0) { - validate_drivers(m_options); + validity_checker valid(m_options); + valid.check_all(); return; } @@ -1322,8 +1314,8 @@ { // 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"); + if (file.open(emulator_info::get_configname(), ".ini") != FILERR_NONE) + throw emu_fatalerror("Unable to create file %s.ini\n",emulator_info::get_configname()); // generate the updated INI astring initext; @@ -1386,15 +1378,16 @@ void cli_frontend::display_help() { - mame_printf_info(APPLONGNAME " v%s - " FULLLONGNAME "\n" - COPYRIGHT_INFO "\n\n", build_version); - mame_printf_info("%s\n", DISCLAIMER); - mame_printf_info(USAGE "\n\n" - " " APPNAME " -showusage for a brief list of options\n" - " " APPNAME " -showconfig for a list of configuration options\n" - " " APPNAME " -listmedia for a full list of supported media\n" - " " APPNAME " -createconfig to create a " CONFIGNAME ".ini\n\n" - "For usage instructions, please consult the files config.txt and windows.txt.\n",APPNAME,GAMENOUN); + mame_printf_info("%s v%s - %s\n%s\n\n", emulator_info::get_applongname(),build_version,emulator_info::get_fulllongname(),emulator_info::get_copyright_info()); + mame_printf_info("%s\n", emulator_info::get_disclaimer()); + emulator_info::printf_usage(emulator_info::get_appname(),emulator_info::get_gamenoun()); + mame_printf_info("\n\n" + " %s -showusage for a brief list of options\n" + " %s -showconfig for a list of configuration options\n" + " %s -listmedia for a full list of supported media\n" + " %s -createconfig to create a %s.ini\n\n" + "For usage instructions, please consult the files config.txt and windows.txt.\n",emulator_info::get_appname(), + emulator_info::get_appname(),emulator_info::get_appname(),emulator_info::get_appname(),emulator_info::get_configname()); } @@ -1496,7 +1489,7 @@ { // output the name astring basename; - mame_printf_info("%-20s", core_filename_extract_base(&basename, name, FALSE)->cstr()); + mame_printf_info("%-20s", core_filename_extract_base(basename, name).cstr()); m_total++; // attempt to open as a CHD; fail if not @@ -1578,7 +1571,7 @@ // output the name m_total++; astring basename; - mame_printf_info("%-20s", core_filename_extract_base(&basename, name, FALSE)->cstr()); + mame_printf_info("%-20s", core_filename_extract_base(basename, name).cstr()); // see if we can find a match in the ROMs int found = find_by_hash(hashes, length); @@ -1639,35 +1632,29 @@ } // next iterate over softlists - for (const device_t *dev = m_drivlist.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) + software_list_device_iterator iter(m_drivlist.config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(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); + software_list *list = software_list_open(m_drivlist.options(), swlist->list_name(), FALSE, NULL); - // 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++; - } - } + 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); - software_list_close(list); - } + // 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(), swinfo->shortname, swinfo->longname); + found++; + } + } + software_list_close(list); } } diff -Nru mame-0.144/src/emu/cpu/arm7/arm7.c mame-0.145/src/emu/cpu/arm7/arm7.c --- mame-0.144/src/emu/cpu/arm7/arm7.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7.c 2012-02-06 21:30:23.000000000 +0000 @@ -38,12 +38,9 @@ #include "debugger.h" #include "arm7.h" #include "arm7core.h" //include arm7 core +#include "arm7thmb.h" +#include "arm7help.h" -#if 0 -#define LOG(x) mame_printf_debug x -#else -#define LOG(x) logerror x -#endif /* prototypes of coprocessor functions */ static WRITE32_DEVICE_HANDLER(arm7_do_callback); @@ -52,21 +49,10 @@ void arm7_dt_r_callback(arm_state *cpustate, UINT32 insn, UINT32 *prn, UINT32 (*read32)(arm_state *cpustate, UINT32 addr)); void arm7_dt_w_callback(arm_state *cpustate, UINT32 insn, UINT32 *prn, void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data)); -/* Macros that can be re-defined for custom cpu implementations - The core expects these to be defined */ -/* In this case, we are using the default arm7 handlers (supplied by the core) - - but simply changes these and define your own if needed for cpu implementation specific needs */ -#define READ8(addr) arm7_cpu_read8(cpustate, addr) -#define WRITE8(addr,data) arm7_cpu_write8(cpustate, addr,data) -#define READ16(addr) arm7_cpu_read16(cpustate, addr) -#define WRITE16(addr,data) arm7_cpu_write16(cpustate, addr,data) -#define READ32(addr) arm7_cpu_read32(cpustate, addr) -#define WRITE32(addr,data) arm7_cpu_write32(cpustate, addr,data) -#define PTR_READ32 &arm7_cpu_read32 -#define PTR_WRITE32 &arm7_cpu_write32 - -/* Macros that need to be defined according to the cpu implementation specific need */ -#define ARM7REG(reg) cpustate->sArmRegister[reg] -#define ARM7_ICOUNT cpustate->iCount +// holder for the co processor Data Transfer Read & Write Callback funcs +void (*arm7_coproc_dt_r_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, UINT32 (*read32)(arm_state *cpustate, UINT32 addr)); +void (*arm7_coproc_dt_w_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data)); + INLINE arm_state *get_safe_token(device_t *device) { @@ -109,21 +95,6 @@ ARM7REG(eCPSR) = val; } -INLINE INT64 saturate_qbit_overflow(arm_state *cpustate, INT64 res) -{ - if (res > 2147483647) // INT32_MAX - { // overflow high? saturate and set Q - res = 2147483647; - SET_CPSR(GET_CPSR | Q_MASK); - } - else if (res < (-2147483647-1)) // INT32_MIN - { // overflow low? saturate and set Q - res = (-2147483647-1); - SET_CPSR(GET_CPSR | Q_MASK); - } - - return res; -} /************************************************************************** * ARM TLB IMPLEMENTATION @@ -135,6 +106,13 @@ TLB_FINE, }; +enum +{ + FAULT_NONE = 0, + FAULT_DOMAIN, + FAULT_PERMISSION, +}; + INLINE UINT32 arm7_tlb_get_first_level_descriptor( arm_state *cpustate, UINT32 vaddr ) { UINT32 entry_paddr = ( COPRO_TLB_BASE & COPRO_TLB_BASE_MASK ) | ( ( vaddr & COPRO_TLB_VADDR_FLTI_MASK ) >> COPRO_TLB_VADDR_FLTI_MASK_SHIFT ); @@ -162,11 +140,96 @@ return cpustate->program->read_dword( desc_lvl2 ); } -INLINE UINT32 arm7_tlb_translate(arm_state *cpustate, UINT32 vaddr, int mode) +INLINE int detect_fault( arm_state *cpustate, int permission, int ap, int flags) +{ + switch (permission) + { + case 0 : // "No access - Any access generates a domain fault" + { + return FAULT_DOMAIN; + } + break; + case 1 : // "Client - Accesses are checked against the access permission bits in the section or page descriptor" + { + switch (ap) + { + case 0 : + { + int s = (COPRO_CTRL & COPRO_CTRL_SYSTEM) ? 1 : 0; + int r = (COPRO_CTRL & COPRO_CTRL_ROM) ? 1 : 0; + if (s == 0) + { + if (r == 0) // "Any access generates a permission fault" + { + return FAULT_PERMISSION; + } + else // "Any write generates a permission fault" + { + if (flags & ARM7_TLB_WRITE) + { + return FAULT_PERMISSION; + } + } + } + else + { + if (r == 0) // "Only Supervisor read permitted" + { + if ((GET_MODE == eARM7_MODE_USER) || (flags & ARM7_TLB_WRITE)) + { + return FAULT_PERMISSION; + } + } + else // "Reserved" -> assume same behaviour as S=0/R=0 case + { + return FAULT_PERMISSION; + } + } + } + break; + case 1 : // "Access allowed only in Supervisor mode" + { + if (GET_MODE == eARM7_MODE_USER) + { + return FAULT_PERMISSION; + } + } + break; + case 2 : // "Writes in User mode cause permission fault" + { + if ((GET_MODE == eARM7_MODE_USER) && (flags & ARM7_TLB_WRITE)) + { + return FAULT_PERMISSION; + } + } + break; + case 3 : // "All access types permitted in both modes" + { + return FAULT_NONE; + } + break; + } + } + break; + case 2 : // "Reserved - Reserved. Currently behaves like the no access mode" + { + return FAULT_DOMAIN; + } + break; + case 3 : // "Manager - Accesses are not checked against the access permission bits so a permission fault cannot be generated" + { + return FAULT_NONE; + } + break; + } + return FAULT_NONE; +} + +int arm7_tlb_translate(arm_state *cpustate, UINT32 *addr, int flags) { UINT32 desc_lvl1; UINT32 desc_lvl2 = 0; - UINT32 paddr; + UINT32 paddr, vaddr = *addr; UINT8 domain, permission; if (vaddr < 32 * 1024 * 1024) @@ -187,7 +250,8 @@ if ((R15 == (cpustate->mmu_enable_addr + 4)) || (R15 == (cpustate->mmu_enable_addr + 8))) { LOG( ( "ARM7: fetch flat, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); - return vaddr; + *addr = vaddr; + return TRUE; } else { @@ -202,58 +266,64 @@ { case COPRO_TLB_UNMAPPED: // Unmapped, generate a translation fault - if (mode == ARM7_TLB_ABORT_D) + if (flags & ARM7_TLB_ABORT_D) { - LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); - COPRO_FAULT_STATUS = (5 << 0); + LOG( ( "ARM7: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); + COPRO_FAULT_STATUS_D = (5 << 0); // 5 = section translation fault COPRO_FAULT_ADDRESS = vaddr; cpustate->pendingAbtD = 1; } - else if (mode == ARM7_TLB_ABORT_P) + else if (flags & ARM7_TLB_ABORT_P) { - LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); + LOG( ( "ARM7: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); cpustate->pendingAbtP = 1; } + return FALSE; break; case COPRO_TLB_COARSE_TABLE: // Entry is the physical address of a coarse second-level table - if (permission == 1) + if ((permission == 1) || (permission == 3)) { desc_lvl2 = arm7_tlb_get_second_level_descriptor( cpustate, TLB_COARSE, desc_lvl1, vaddr ); } else { - LOG( ( "domain %d permission = %d\n", domain, permission ) ); - LOG( ( "ARM7: Coarse Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15 ) ); + fatalerror("ARM7: Not Yet Implemented: Coarse Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x", vaddr, domain, R15); } break; case COPRO_TLB_SECTION_TABLE: + { // Entry is a section - if ((permission == 1) || (permission == 3)) + UINT8 ap = (desc_lvl1 >> 10) & 3; + int fault = detect_fault( cpustate, permission, ap, flags); + if (fault == FAULT_NONE) { paddr = ( desc_lvl1 & COPRO_TLB_SECTION_PAGE_MASK ) | ( vaddr & ~COPRO_TLB_SECTION_PAGE_MASK ); } else { - if (mode == ARM7_TLB_ABORT_D) + if (flags & ARM7_TLB_ABORT_D) { - LOG( ( "domain %d permission = %d\n", domain, permission ) ); - LOG( ( "ARM7: Section Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15 ) ); - COPRO_FAULT_STATUS = (9 << 0); + LOG( ( "ARM7: Section Table, Section %s fault on virtual address, vaddr = %08x, PC = %08x\n", (fault == FAULT_DOMAIN) ? "domain" : "permission", vaddr, R15 ) ); + COPRO_FAULT_STATUS_D = ((fault == FAULT_DOMAIN) ? (9 << 0) : (13 << 0)) | (domain << 4); // 9 = section domain fault, 13 = section permission fault COPRO_FAULT_ADDRESS = vaddr; cpustate->pendingAbtD = 1; + LOG( ( "vaddr %08X desc_lvl1 %08X domain %d permission %d ap %d s %d r %d mode %d read %d write %d\n", + vaddr, desc_lvl1, domain, permission, ap, (COPRO_CTRL & COPRO_CTRL_SYSTEM) ? 1 : 0, (COPRO_CTRL & COPRO_CTRL_ROM) ? 1 : 0, + GET_MODE, flags & ARM7_TLB_READ ? 1 : 0, flags & ARM7_TLB_WRITE ? 1 : 0) ); } - else if (mode == ARM7_TLB_ABORT_P) + else if (flags & ARM7_TLB_ABORT_P) { - LOG( ( "domain %d permission = %d\n", domain, permission ) ); - LOG( ( "ARM7: Section Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15 ) ); + LOG( ( "ARM7: Section Table, Section %s fault on virtual address, vaddr = %08x, PC = %08x\n", (fault == FAULT_DOMAIN) ? "domain" : "permission", vaddr, R15 ) ); cpustate->pendingAbtP = 1; } + return FALSE; } + } break; case COPRO_TLB_FINE_TABLE: // Entry is the physical address of a fine second-level table - LOG( ( "ARM7: Not Yet Implemented: fine second-level TLB lookup, PC = %08x, vaddr = %08x\n", R15, vaddr ) ); + fatalerror("ARM7: Not Yet Implemented: fine second-level TLB lookup, PC = %08x, vaddr = %08x", R15, vaddr); break; default: // Entry is the physical address of a three-legged termite-eaten table @@ -266,18 +336,19 @@ { case COPRO_TLB_UNMAPPED: // Unmapped, generate a translation fault - if (mode == ARM7_TLB_ABORT_D) + if (flags & ARM7_TLB_ABORT_D) { - LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) ); - COPRO_FAULT_STATUS = (7 << 0); + LOG( ( "ARM7: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) ); + COPRO_FAULT_STATUS_D = (7 << 0) | (domain << 4); // 7 = page translation fault COPRO_FAULT_ADDRESS = vaddr; cpustate->pendingAbtD = 1; } - else if (mode == ARM7_TLB_ABORT_P) + else if (flags & ARM7_TLB_ABORT_P) { - LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) ); + LOG( ( "ARM7: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) ); cpustate->pendingAbtP = 1; } + return FALSE; break; case COPRO_TLB_LARGE_PAGE: // Large page descriptor @@ -285,7 +356,34 @@ break; case COPRO_TLB_SMALL_PAGE: // Small page descriptor - paddr = ( desc_lvl2 & COPRO_TLB_SMALL_PAGE_MASK ) | ( vaddr & ~COPRO_TLB_SMALL_PAGE_MASK ); + { + UINT8 ap = ((((desc_lvl2 >> 4) & 0xFF) >> (((vaddr >> 10) & 3) << 1)) & 3); + int fault = detect_fault( cpustate, permission, ap, flags); + if (fault == FAULT_NONE) + { + paddr = ( desc_lvl2 & COPRO_TLB_SMALL_PAGE_MASK ) | ( vaddr & ~COPRO_TLB_SMALL_PAGE_MASK ); + } + else + { + if (flags & ARM7_TLB_ABORT_D) + { + // hapyfish expects a data abort when something tries to write to a read-only memory location from user mode + LOG( ( "ARM7: Page Table, Section %s fault on virtual address, vaddr = %08x, PC = %08x\n", (fault == FAULT_DOMAIN) ? "domain" : "permission", vaddr, R15 ) ); + COPRO_FAULT_STATUS_D = ((fault == FAULT_DOMAIN) ? (11 << 0) : (15 << 0)) | (domain << 4); // 11 = page domain fault, 15 = page permission fault + COPRO_FAULT_ADDRESS = vaddr; + cpustate->pendingAbtD = 1; + LOG( ( "vaddr %08X desc_lvl2 %08X domain %d permission %d ap %d s %d r %d mode %d read %d write %d\n", + vaddr, desc_lvl2, domain, permission, ap, (COPRO_CTRL & COPRO_CTRL_SYSTEM) ? 1 : 0, (COPRO_CTRL & COPRO_CTRL_ROM) ? 1 : 0, + GET_MODE, flags & ARM7_TLB_READ ? 1 : 0, flags & ARM7_TLB_WRITE ? 1 : 0) ); + } + else if (flags & ARM7_TLB_ABORT_P) + { + LOG( ( "ARM7: Page Table, Section %s fault on virtual address, vaddr = %08x, PC = %08x\n", (fault == FAULT_DOMAIN) ? "domain" : "permission", vaddr, R15 ) ); + cpustate->pendingAbtP = 1; + } + return FALSE; + } + } break; case COPRO_TLB_TINY_PAGE: // Tiny page descriptor @@ -297,8 +395,8 @@ break; } } - - return paddr; + *addr = paddr; + return TRUE; } static CPU_TRANSLATE( arm7 ) @@ -308,7 +406,7 @@ /* only applies to the program address space and only does something if the MMU's enabled */ if( space == AS_PROGRAM && ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) ) { - *address = arm7_tlb_translate(cpustate, *address, ARM7_TLB_NO_ABORT); + return arm7_tlb_translate(cpustate, address, 0); } return TRUE; } @@ -419,12 +517,149 @@ /* nothing to do here */ } +#define UNEXECUTED() \ + R15 += 4; \ + ARM7_ICOUNT +=2; /* Any unexecuted instruction only takes 1 cycle (page 193) */ \ + static CPU_EXECUTE( arm7 ) { -/* include the arm7 core execute code */ -#include "arm7exec.c" -} + UINT32 pc; + UINT32 insn; + arm_state *cpustate = get_safe_token(device); + + do + { + debugger_instruction_hook(cpustate->device, GET_PC); + /* handle Thumb instructions if active */ + if (T_IS_SET(GET_CPSR)) + { + UINT32 raddr; + + pc = R15; + + // "In Thumb state, bit [0] is undefined and must be ignored. Bits [31:1] contain the PC." + raddr = pc & (~1); + + if ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate(cpustate, &raddr, ARM7_TLB_ABORT_P | ARM7_TLB_READ)) + { + goto skip_exec; + } + } + + insn = cpustate->direct->read_decrypted_word(raddr); + thumb_handler[(insn & 0xffc0) >> 6](cpustate, pc, insn); + + } + else + { + UINT32 raddr; + + /* load 32 bit instruction */ + pc = GET_PC; + + // "In ARM state, bits [1:0] of r15 are undefined and must be ignored. Bits [31:2] contain the PC." + raddr = pc & (~3); + + if ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate(cpustate, &raddr, ARM7_TLB_ABORT_P | ARM7_TLB_READ)) + { + goto skip_exec; + } + } + +#if 0 + if (MODE26) + { + UINT32 temp1, temp2; + temp1 = GET_CPSR & 0xF00000C3; + temp2 = (R15 & 0xF0000000) | ((R15 & 0x0C000000) >> (26 - 6)) | (R15 & 0x00000003); + if (temp1 != temp2) fatalerror( "%08X: 32-bit and 26-bit modes are out of sync (%08X %08X)", pc, temp1, temp2); + } +#endif + + insn = cpustate->direct->read_decrypted_dword(raddr); + + /* process condition codes for this instruction */ + switch (insn >> INSN_COND_SHIFT) + { + case COND_EQ: + if (Z_IS_CLEAR(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_NE: + if (Z_IS_SET(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_CS: + if (C_IS_CLEAR(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_CC: + if (C_IS_SET(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_MI: + if (N_IS_CLEAR(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_PL: + if (N_IS_SET(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_VS: + if (V_IS_CLEAR(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_VC: + if (V_IS_SET(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_HI: + if (C_IS_CLEAR(GET_CPSR) || Z_IS_SET(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_LS: + if (C_IS_SET(GET_CPSR) && Z_IS_CLEAR(GET_CPSR)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_GE: + if (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) /* Use x ^ (x >> ...) method */ + { UNEXECUTED(); goto skip_exec; } + break; + case COND_LT: + if (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_GT: + if (Z_IS_SET(GET_CPSR) || (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK))) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_LE: + if (Z_IS_CLEAR(GET_CPSR) && (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK))) + { UNEXECUTED(); goto skip_exec; } + break; + case COND_NV: + { UNEXECUTED(); goto skip_exec; } + break; + } + /*******************************************************************/ + /* If we got here - condition satisfied, so decode the instruction */ + /*******************************************************************/ + ops_handler[((insn & 0xF000000) >> 24)](cpustate, insn); + } + +skip_exec: + + ARM7_CHECKIRQ; + + /* All instructions remove 3 cycles.. Others taking less / more will have adjusted this # prior to here */ + ARM7_ICOUNT -= 3; + } while (ARM7_ICOUNT > 0); +} static void set_irq_line(arm_state *cpustate, int irqline, int state) { @@ -783,6 +1018,8 @@ static WRITE32_DEVICE_HANDLER( arm7_do_callback ) { + arm_state *cpustate = get_safe_token(device); + cpustate->pendingUnd = 1; } static READ32_DEVICE_HANDLER( arm7_rt_r_callback ) @@ -791,7 +1028,7 @@ UINT32 opcode = offset; UINT8 cReg = ( opcode & INSN_COPRO_CREG ) >> INSN_COPRO_CREG_SHIFT; UINT8 op2 = ( opcode & INSN_COPRO_OP2 ) >> INSN_COPRO_OP2_SHIFT; -// UINT8 op3 = opcode & INSN_COPRO_OP3; + UINT8 op3 = opcode & INSN_COPRO_OP3; UINT8 cpnum = (opcode & INSN_COPRO_CPNUM) >> INSN_COPRO_CPNUM_SHIFT; UINT32 data = 0; @@ -862,9 +1099,18 @@ } else { - data = 0x41 | (1 << 23) | (7 << 12); - //data = (0x41 << 24) | (1 << 20) | (2 << 16) | (0x920 << 4) | (0 << 0); // ARM920T (S3C24xx) - //data = (0x41 << 24) | (0 << 20) | (1 << 16) | (0x710 << 4) | (0 << 0); // ARM7500 + if (device->type() == ARM920T) + { + data = (0x41 << 24) | (1 << 20) | (2 << 16) | (0x920 << 4) | (0 << 0); // ARM920T (S3C24xx) + } + else if (device->type() == ARM7500) + { + data = (0x41 << 24) | (0 << 20) | (1 << 16) | (0x710 << 4) | (0 << 0); // ARM7500 + } + else + { + data = 0x41 | (1 << 23) | (7 << 12); // <-- where did this come from? + } } break; @@ -923,7 +1169,11 @@ break; case 5: // Fault Status LOG( ( "arm7_rt_r_callback, Fault Status\n" ) ); - data = COPRO_FAULT_STATUS; + switch (op3) + { + case 0: data = COPRO_FAULT_STATUS_D; break; + case 1: data = COPRO_FAULT_STATUS_P; break; + } break; case 6: // Fault Address LOG( ( "arm7_rt_r_callback, Fault Address\n" ) ); @@ -966,7 +1216,9 @@ } else { - fatalerror("ARM7: Unhandled coprocessor %d\n", cpnum); + LOG( ("ARM7: Unhandled coprocessor %d\n", cpnum) ); + cpustate->pendingUnd = 1; + return; } } @@ -999,7 +1251,10 @@ } if (((data & COPRO_CTRL_MMU_EN) == 0) && ((COPRO_CTRL & COPRO_CTRL_MMU_EN) != 0)) { - R15 = arm7_tlb_translate( cpustate, R15, ARM7_TLB_NO_ABORT); + if (!arm7_tlb_translate( cpustate, &R15, 0)) + { + fatalerror("ARM7_MMU_ENABLE_HACK translate failed"); + } } #endif COPRO_CTRL = data & COPRO_CTRL_MASK; @@ -1014,7 +1269,11 @@ break; case 5: // Fault Status LOG( ( "arm7_rt_w_callback Fault Status = %08x (%d) (%d)\n", data, op2, op3 ) ); - COPRO_FAULT_STATUS = data; + switch (op3) + { + case 0: COPRO_FAULT_STATUS_D = data; break; + case 1: COPRO_FAULT_STATUS_P = data; break; + } break; case 6: // Fault Address LOG( ( "arm7_rt_w_callback Fault Address = %08x (%d) (%d)\n", data, op2, op3 ) ); @@ -1046,10 +1305,28 @@ void arm7_dt_r_callback(arm_state *cpustate, UINT32 insn, UINT32 *prn, UINT32 (*read32)(arm_state *cpustate, UINT32 addr)) { + UINT8 cpn = (insn >> 8) & 0xF; + if ((cpustate->archFlags & eARM_ARCHFLAGS_XSCALE) && (cpn == 0)) + { + LOG( ( "arm7_dt_r_callback: DSP Coprocessor 0 (CP0) not yet emulated (PC %08x)\n", GET_PC ) ); + } + else + { + cpustate->pendingUnd = 1; + } } void arm7_dt_w_callback(arm_state *cpustate, UINT32 insn, UINT32 *prn, void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data)) { + UINT8 cpn = (insn >> 8) & 0xF; + if ((cpustate->archFlags & eARM_ARCHFLAGS_XSCALE) && (cpn == 0)) + { + LOG( ( "arm7_dt_w_callback: DSP Coprocessor 0 (CP0) not yet emulated (PC %08x)\n", GET_PC ) ); + } + else + { + cpustate->pendingUnd = 1; + } } DEFINE_LEGACY_CPU_DEVICE(ARM7, arm7); diff -Nru mame-0.144/src/emu/cpu/arm7/arm7core.c mame-0.145/src/emu/cpu/arm7/arm7core.c --- mame-0.144/src/emu/cpu/arm7/arm7core.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7core.c 2012-02-06 21:30:23.000000000 +0000 @@ -36,7 +36,6 @@ Therefore, to use the core, you simpy include this file along with the .h file into your own cpu specific implementation, and therefore, this file shouldn't be compiled as part of your project directly. - Additionally, you will need to include arm7exec.c in your cpu's execute routine. For better or for worse, the code itself is very much intact from it's arm 2/3/6 origins from Bryan & Phil's work. I contemplated merging it in, but thought the fact that the CPSR is @@ -77,44 +76,20 @@ By Bryan McPhail (bmcphail@tendril.co.uk) and Phil Stroffolino *****************************************************************************/ -#define ARM7_DEBUG_CORE 0 /* Prototypes */ -// SJE: should these be inline? or are they too big to see any benefit? -static void HandleCoProcDO(arm_state *cpustate, UINT32 insn); -static void HandleCoProcRT(arm_state *cpustate, UINT32 insn); -static void HandleCoProcDT(arm_state *cpustate, UINT32 insn); -static void HandleHalfWordDT(arm_state *cpustate, UINT32 insn); -static void HandleSwap(arm_state *cpustate, UINT32 insn); -static void HandlePSRTransfer(arm_state *cpustate, UINT32 insn); -static void HandleALU(arm_state *cpustate, UINT32 insn); -static void HandleMul(arm_state *cpustate, UINT32 insn); -static void HandleUMulLong(arm_state *cpustate, UINT32 insn); -static void HandleSMulLong(arm_state *cpustate, UINT32 insn); -INLINE void HandleBranch(arm_state *cpustate, UINT32 insn); // pretty short, so inline should be ok -static void HandleMemSingle(arm_state *cpustate, UINT32 insn); -static void HandleMemBlock(arm_state *cpustate, UINT32 insn); -static UINT32 decodeShift(arm_state *cpustate, UINT32 insn, UINT32 *pCarry); -INLINE void SwitchMode(arm_state *cpustate, int); -static void arm7_check_irq_state(arm_state *cpustate); - -INLINE void arm7_cpu_write32(arm_state *cpustate, UINT32 addr, UINT32 data); -INLINE void arm7_cpu_write16(arm_state *cpustate, UINT32 addr, UINT16 data); -INLINE void arm7_cpu_write8(arm_state *cpustate, UINT32 addr, UINT8 data); -INLINE UINT32 arm7_cpu_read32(arm_state *cpustate, UINT32 addr); -INLINE UINT16 arm7_cpu_read16(arm_state *cpustate, UINT32 addr); -INLINE UINT8 arm7_cpu_read8(arm_state *cpustate, offs_t addr); +extern UINT32 decodeShift(arm_state *cpustate, UINT32 insn, UINT32 *pCarry); + +void arm7_check_irq_state(arm_state *cpustate); + /* Static Vars */ // Note: for multi-cpu implementation, this approach won't work w/o modification write32_device_func arm7_coproc_do_callback; // holder for the co processor Data Operations Callback func. read32_device_func arm7_coproc_rt_r_callback; // holder for the co processor Register Transfer Read Callback func. write32_device_func arm7_coproc_rt_w_callback; // holder for the co processor Register Transfer Write Callback Callback func. -// holder for the co processor Data Transfer Read & Write Callback funcs -void (*arm7_coproc_dt_r_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, UINT32 (*read32)(arm_state *cpustate, UINT32 addr)); -void (*arm7_coproc_dt_w_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data)); #ifdef UNUSED_DEFINITION // custom dasm callback handlers for co-processor instructions @@ -124,178 +99,6 @@ #endif -/*************************************************************************** - * Default Memory Handlers - ***************************************************************************/ -INLINE void arm7_cpu_write32(arm_state *cpustate, UINT32 addr, UINT32 data) -{ - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - addr &= ~3; - if ( cpustate->endian == ENDIANNESS_BIG ) - cpustate->program->write_dword(addr, data); - else - cpustate->program->write_dword(addr, data); -} - - -INLINE void arm7_cpu_write16(arm_state *cpustate, UINT32 addr, UINT16 data) -{ - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - addr &= ~1; - if ( cpustate->endian == ENDIANNESS_BIG ) - cpustate->program->write_word(addr, data); - else - cpustate->program->write_word(addr, data); -} - -INLINE void arm7_cpu_write8(arm_state *cpustate, UINT32 addr, UINT8 data) -{ - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - if ( cpustate->endian == ENDIANNESS_BIG ) - cpustate->program->write_byte(addr, data); - else - cpustate->program->write_byte(addr, data); -} - -INLINE UINT32 arm7_cpu_read32(arm_state *cpustate, offs_t addr) -{ - UINT32 result; - - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - if (addr & 3) - { - if ( cpustate->endian == ENDIANNESS_BIG ) - result = cpustate->program->read_dword(addr & ~3); - else - result = cpustate->program->read_dword(addr & ~3); - result = (result >> (8 * (addr & 3))) | (result << (32 - (8 * (addr & 3)))); - } - else - { - if ( cpustate->endian == ENDIANNESS_BIG ) - result = cpustate->program->read_dword(addr); - else - result = cpustate->program->read_dword(addr); - } - - return result; -} - -INLINE UINT16 arm7_cpu_read16(arm_state *cpustate, offs_t addr) -{ - UINT16 result; - - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - if ( cpustate->endian == ENDIANNESS_BIG ) - result = cpustate->program->read_word(addr & ~1); - else - result = cpustate->program->read_word(addr & ~1); - - if (addr & 1) - { - result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); - } - - return result; -} - -INLINE UINT8 arm7_cpu_read8(arm_state *cpustate, offs_t addr) -{ - if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D ); - } - - // Handle through normal 8 bit handler (for 32 bit cpu) - if ( cpustate->endian == ENDIANNESS_BIG ) - return cpustate->program->read_byte(addr); - else - return cpustate->program->read_byte(addr); -} - -/*************** - * helper funcs - ***************/ - -// TODO LD: -// - SIGN_BITS_DIFFER = THUMB_SIGN_BITS_DIFFER -// - do while (0) -// - HandleALUAddFlags = HandleThumbALUAddFlags except for PC incr -// - HandleALUSubFlags = HandleThumbALUSubFlags except for PC incr - -#define IsNeg(i) ((i) >> 31) -#define IsPos(i) ((~(i)) >> 31) - -/* Set NZCV flags for ADDS / SUBS */ -#define HandleALUAddFlags(rd, rn, op2) \ - if (insn & INSN_S) \ - SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ - | (((!SIGN_BITS_DIFFER(rn, op2)) && SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ - | (((IsNeg(rn) & IsNeg(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsNeg(op2) & IsPos(rd))) ? C_MASK : 0) \ - | HandleALUNZFlags(rd))); \ - R15 += 4; - -#define HandleThumbALUAddFlags(rd, rn, op2) \ - SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ - | (((!THUMB_SIGN_BITS_DIFFER(rn, op2)) && THUMB_SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ - | (((~(rn)) < (op2)) << C_BIT) \ - | HandleALUNZFlags(rd))); \ - R15 += 2; - -#define HandleALUSubFlags(rd, rn, op2) \ - if (insn & INSN_S) \ - SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ - | ((SIGN_BITS_DIFFER(rn, op2) && SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ - | (((IsNeg(rn) & IsPos(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsPos(op2) & IsPos(rd))) ? C_MASK : 0) \ - | HandleALUNZFlags(rd))); \ - R15 += 4; - -#define HandleThumbALUSubFlags(rd, rn, op2) \ - SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ - | ((THUMB_SIGN_BITS_DIFFER(rn, op2) && THUMB_SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ - | (((IsNeg(rn) & IsPos(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsPos(op2) & IsPos(rd))) ? C_MASK : 0) \ - | HandleALUNZFlags(rd))); \ - R15 += 2; - -/* Set NZC flags for logical operations. */ - -// This macro (which I didn't write) - doesn't make it obvious that the SIGN BIT = 31, just as the N Bit does, -// therefore, N is set by default -#define HandleALUNZFlags(rd) \ - (((rd) & SIGN_BIT) | ((!(rd)) << Z_BIT)) - - -// Long ALU Functions use bit 63 -#define HandleLongALUNZFlags(rd) \ - ((((rd) & ((UINT64)1 << 63)) >> 32) | ((!(rd)) << Z_BIT)) - -#define HandleALULogicalFlags(rd, sc) \ - if (insn & INSN_S) \ - SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | C_MASK)) \ - | HandleALUNZFlags(rd) \ - | (((sc) != 0) << C_BIT))); \ - R15 += 4; - // convert cpsr mode num into to text static const char modetext[ARM7_NUM_MODES][5] = { "USER", "FIRQ", "IRQ", "SVC", "ILL1", "ILL2", "ILL3", "ABT", @@ -306,261 +109,8 @@ return modetext[cpsr & MODE_FLAG]; } -// used to be functions, but no longer a need, so we'll use define for better speed. -#define GetRegister(cpustate, rIndex) ARM7REG(sRegisterTable[GET_MODE][rIndex]) -#define SetRegister(cpustate, rIndex, value) ARM7REG(sRegisterTable[GET_MODE][rIndex]) = value - -// I could prob. convert to macro, but Switchmode shouldn't occur that often in emulated code.. -INLINE void SwitchMode(arm_state *cpustate, int cpsr_mode_val) -{ - UINT32 cspr = GET_CPSR & ~MODE_FLAG; - SET_CPSR(cspr | cpsr_mode_val); -} - - -/* Decodes an Op2-style shifted-register form. If @carry@ is non-zero the - * shifter carry output will manifest itself as @*carry == 0@ for carry clear - * and @*carry != 0@ for carry set. - - SJE: Rules: - IF RC = 256, Result = no shift. - LSL 0 = Result = RM, Carry = Old Contents of CPSR C Bit - LSL(0,31) = Result shifted, least significant bit is in carry out - LSL 32 = Result of 0, Carry = Bit 0 of RM - LSL >32 = Result of 0, Carry out 0 - LSR 0 = LSR 32 (see below) - LSR 32 = Result of 0, Carry = Bit 31 of RM - LSR >32 = Result of 0, Carry out 0 - ASR >=32 = ENTIRE Result = bit 31 of RM - ROR 32 = Result = RM, Carry = Bit 31 of RM - ROR >32 = Same result as ROR n-32 until amount in range of 1-32 then follow rules -*/ - -static UINT32 decodeShift(arm_state *cpustate, UINT32 insn, UINT32 *pCarry) -{ - UINT32 k = (insn & INSN_OP2_SHIFT) >> INSN_OP2_SHIFT_SHIFT; // Bits 11-7 - UINT32 rm = GET_REGISTER(cpustate, insn & INSN_OP2_RM); - UINT32 t = (insn & INSN_OP2_SHIFT_TYPE) >> INSN_OP2_SHIFT_TYPE_SHIFT; - - if ((insn & INSN_OP2_RM) == 0xf) { - // "If a register is used to specify the shift amount the PC will be 12 bytes ahead." (instead of 8) - rm += t & 1 ? 12 : 8; - } - - /* All shift types ending in 1 are Rk, not #k */ - if (t & 1) - { -// LOG(("%08x: RegShift %02x %02x\n", R15, k >> 1, GET_REGISTER(cpustate, k >> 1))); -#if ARM7_DEBUG_CORE - if ((insn & 0x80) == 0x80) - LOG(("%08x: RegShift ERROR (p36)\n", R15)); -#endif - - // see p35 for check on this - //k = GET_REGISTER(cpustate, k >> 1) & 0x1f; - - // Keep only the bottom 8 bits for a Register Shift - k = GET_REGISTER(cpustate, k >> 1) & 0xff; - - if (k == 0) /* Register shift by 0 is a no-op */ - { -// LOG(("%08x: NO-OP Regshift\n", R15)); - /* TODO this is wrong for at least ROR by reg with lower - * 5 bits 0 but lower 8 bits non zero */ - if (pCarry) - *pCarry = GET_CPSR & C_MASK; - return rm; - } - } - /* Decode the shift type and perform the shift */ - switch (t >> 1) - { - case 0: /* LSL */ - // LSL 32 = Result of 0, Carry = Bit 0 of RM - // LSL >32 = Result of 0, Carry out 0 - if (k >= 32) - { - if (pCarry) - *pCarry = (k == 32) ? rm & 1 : 0; - return 0; - } - else - { - if (pCarry) - { - // LSL 0 = Result = RM, Carry = Old Contents of CPSR C Bit - // LSL (0,31) = Result shifted, least significant bit is in carry out - *pCarry = k ? (rm & (1 << (32 - k))) : (GET_CPSR & C_MASK); - } - return k ? LSL(rm, k) : rm; - } - break; - case 1: /* LSR */ - if (k == 0 || k == 32) - { - if (pCarry) - *pCarry = rm & SIGN_BIT; - return 0; - } - else if (k > 32) - { - if (pCarry) - *pCarry = 0; - return 0; - } - else - { - if (pCarry) - *pCarry = (rm & (1 << (k - 1))); - return LSR(rm, k); - } - break; - case 2: /* ASR */ - if (k == 0 || k > 32) - k = 32; - - if (pCarry) - *pCarry = (rm & (1 << (k - 1))); - if (k >= 32) - return rm & SIGN_BIT ? 0xffffffffu : 0; - else - { - if (rm & SIGN_BIT) - return LSR(rm, k) | (0xffffffffu << (32 - k)); - else - return LSR(rm, k); - } - break; - - case 3: /* ROR and RRX */ - if (k) - { - while (k > 32) - k -= 32; - if (pCarry) - *pCarry = rm & (1 << (k - 1)); - return ROR(rm, k); - } - else - { - /* RRX */ - if (pCarry) - *pCarry = (rm & 1); - return LSR(rm, 1) | ((GET_CPSR & C_MASK) << 2); - } - break; - } - - LOG(("%08x: Decodeshift error\n", R15)); - return 0; -} /* decodeShift */ - - -static int loadInc(arm_state *cpustate, UINT32 pat, UINT32 rbv, UINT32 s) -{ - int i, result; - UINT32 data; - - result = 0; - rbv &= ~3; - for (i = 0; i < 16; i++) - { - if ((pat >> i) & 1) - { - data = READ32(rbv += 4); - if (cpustate->pendingAbtD != 0) break; - if (i == 15) { - if (s) /* Pull full contents from stack */ - SET_REGISTER(cpustate, 15, data); - else /* Pull only address, preserve mode & status flags */ - if (MODE32) - SET_REGISTER(cpustate, 15, data); - else - { - SET_REGISTER(cpustate, 15, (GET_REGISTER(cpustate, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC)); - } - } else - SET_REGISTER(cpustate, i, data); - - result++; - } - } - return result; -} - -static int loadDec(arm_state *cpustate, UINT32 pat, UINT32 rbv, UINT32 s) -{ - int i, result; - UINT32 data; - - result = 0; - rbv &= ~3; - for (i = 15; i >= 0; i--) - { - if ((pat >> i) & 1) - { - data = READ32(rbv -= 4); - if (cpustate->pendingAbtD != 0) break; - if (i == 15) { - if (s) /* Pull full contents from stack */ - SET_REGISTER(cpustate, 15, data); - else /* Pull only address, preserve mode & status flags */ - if (MODE32) - SET_REGISTER(cpustate, 15, data); - else - { - SET_REGISTER(cpustate, 15, (GET_REGISTER(cpustate, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC)); - } - } - else - SET_REGISTER(cpustate, i, data); - result++; - } - } - return result; -} - -static int storeInc(arm_state *cpustate, UINT32 pat, UINT32 rbv) -{ - int i, result; - - result = 0; - for (i = 0; i < 16; i++) - { - if ((pat >> i) & 1) - { -#if ARM7_DEBUG_CORE - if (i == 15) /* R15 is plus 12 from address of STM */ - LOG(("%08x: StoreInc on R15\n", R15)); -#endif - WRITE32(rbv += 4, GET_REGISTER(cpustate, i)); - result++; - } - } - return result; -} /* storeInc */ - -static int storeDec(arm_state *cpustate, UINT32 pat, UINT32 rbv) -{ - int i, result; - - result = 0; - for (i = 15; i >= 0; i--) - { - if ((pat >> i) & 1) - { -#if ARM7_DEBUG_CORE - if (i == 15) /* R15 is plus 12 from address of STM */ - LOG(("%08x: StoreDec on R15\n", R15)); -#endif - WRITE32(rbv -= 4, GET_REGISTER(cpustate, i)); - result++; - } - } - return result; -} /* storeDec */ /*************************************************************************** * Main CPU Funcs @@ -600,11 +150,9 @@ R15 = 0; } -// Execute used to be here.. moved to separate file (arm7exec.c) to be included by cpu cores separately - // CPU CHECK IRQ STATE // Note: couldn't find any exact cycle counts for most of these exceptions -static void arm7_check_irq_state(arm_state *cpustate) +void arm7_check_irq_state(arm_state *cpustate) { UINT32 cpsr = GET_CPSR; /* save current CPSR */ UINT32 pc = R15 + 4; /* save old pc (already incremented in pipeline) */; @@ -764,1252 +312,3 @@ ARM7_CHECKIRQ; } - -/*************************************************************************** - * OPCODE HANDLING - ***************************************************************************/ - -// Co-Processor Data Operation -static void HandleCoProcDO(arm_state *cpustate, UINT32 insn) -{ - // This instruction simply instructs the co-processor to do something, no data is returned to ARM7 core - if (arm7_coproc_do_callback) - arm7_coproc_do_callback(cpustate->device, insn, 0, 0); // simply pass entire opcode to callback - since data format is actually dependent on co-proc implementation - else - LOG(("%08x: Co-Processor Data Operation executed, but no callback defined!\n", R15)); -} - -// Co-Processor Register Transfer - To/From Arm to Co-Proc -static void HandleCoProcRT(arm_state *cpustate, UINT32 insn) -{ - - /* xxxx 1110 oooL nnnn dddd cccc ppp1 mmmm */ - - // Load (MRC) data from Co-Proc to ARM7 register - if (insn & 0x00100000) // Bit 20 = Load or Store - { - if (arm7_coproc_rt_r_callback) - { - UINT32 res = arm7_coproc_rt_r_callback(cpustate->device, insn, 0); // RT Read handler must parse opcode & return appropriate result - SET_REGISTER(cpustate, (insn >> 12) & 0xf, res); - } - else - LOG(("%08x: Co-Processor Register Transfer executed, but no RT Read callback defined!\n", R15)); - } - // Store (MCR) data from ARM7 to Co-Proc register - else - { - if (arm7_coproc_rt_w_callback) - arm7_coproc_rt_w_callback(cpustate->device, insn, GET_REGISTER(cpustate, (insn >> 12) & 0xf), 0); - else - LOG(("%08x: Co-Processor Register Transfer executed, but no RT Write callback defined!\n", R15)); - } -} - -/* Data Transfer - To/From Arm to Co-Proc - Loading or Storing, the co-proc function is responsible to read/write from the base register supplied + offset - 8 bit immediate value Base Offset address is << 2 to get the actual # - - issues - #1 - the co-proc function, needs direct access to memory reads or writes (ie, so we must send a pointer to a func) - - #2 - the co-proc may adjust the base address (especially if it reads more than 1 word), so a pointer to the register must be used - but the old value of the register must be restored if write back is not set.. - - #3 - when post incrementing is used, it's up to the co-proc func. to add the offset, since the transfer - address supplied in that case, is simply the base. I suppose this is irrelevant if write back not set - but if co-proc reads multiple address, it must handle the offset adjustment itself. -*/ -// todo: test with valid instructions -static void HandleCoProcDT(arm_state *cpustate, UINT32 insn) -{ - UINT32 rn = (insn >> 16) & 0xf; - UINT32 rnv = GET_REGISTER(cpustate, rn); // Get Address Value stored from Rn - UINT32 ornv = rnv; // Keep value of Rn - UINT32 off = (insn & 0xff) << 2; // Offset is << 2 according to manual - UINT32 *prn = &ARM7REG(rn); // Pointer to our register, so it can be changed in the callback - - // Pointers to read32/write32 functions - void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data); - UINT32 (*read32)(arm_state *cpustate, UINT32 addr); - write32 = PTR_WRITE32; - read32 = PTR_READ32; - -#if ARM7_DEBUG_CORE - if (((insn >> 16) & 0xf) == 15 && (insn & 0x200000)) - LOG(("%08x: Illegal use of R15 as base for write back value!\n", R15)); -#endif - - // Pre-Increment base address (IF POST INCREMENT - CALL BACK FUNCTION MUST DO IT) - if ((insn & 0x1000000) && off) - { - // Up - Down bit - if (insn & 0x800000) - rnv += off; - else - rnv -= off; - } - - // Load (LDC) data from ARM7 memory to Co-Proc memory - if (insn & 0x00100000) - { - if (arm7_coproc_dt_r_callback) - arm7_coproc_dt_r_callback(cpustate, insn, prn, read32); - else - LOG(("%08x: Co-Processer Data Transfer executed, but no READ callback defined!\n", R15)); - } - // Store (STC) data from Co-Proc to ARM7 memory - else - { - if (arm7_coproc_dt_w_callback) - arm7_coproc_dt_w_callback(cpustate, insn, prn, write32); - else - LOG(("%08x: Co-Processer Data Transfer executed, but no WRITE callback defined!\n", R15)); - } - - // If writeback not used - ensure the original value of RN is restored in case co-proc callback changed value - if ((insn & 0x200000) == 0) - SET_REGISTER(cpustate, rn, ornv); -} - -INLINE void HandleBranch(arm_state *cpustate, UINT32 insn) -{ - UINT32 off = (insn & INSN_BRANCH) << 2; - - /* Save PC into LR if this is a branch with link */ - if (insn & INSN_BL) - { - SET_REGISTER(cpustate, 14, R15 + 4); - } - - /* Sign-extend the 24-bit offset in our calculations */ - if (off & 0x2000000u) - { - if (MODE32) - R15 -= ((~(off | 0xfc000000u)) + 1) - 8; - else - R15 = ((R15 - (((~(off | 0xfc000000u)) + 1) - 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC); - } - else - { - if (MODE32) - R15 += off + 8; - else - R15 = ((R15 + (off + 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC); - } -} - -static void HandleMemSingle(arm_state *cpustate, UINT32 insn) -{ - UINT32 rn, rnv, off, rd, rnv_old = 0; - - /* Fetch the offset */ - if (insn & INSN_I) - { - /* Register Shift */ - off = decodeShift(cpustate, insn, NULL); - } - else - { - /* Immediate Value */ - off = insn & INSN_SDT_IMM; - } - - /* Calculate Rn, accounting for PC */ - rn = (insn & INSN_RN) >> INSN_RN_SHIFT; - - if (insn & INSN_SDT_P) - { - /* Pre-indexed addressing */ - if (insn & INSN_SDT_U) - { - if ((MODE32) || (rn != eR15)) - rnv = (GET_REGISTER(cpustate, rn) + off); - else - rnv = (GET_PC + off); - } - else - { - if ((MODE32) || (rn != eR15)) - rnv = (GET_REGISTER(cpustate, rn) - off); - else - rnv = (GET_PC - off); - } - - if (insn & INSN_SDT_W) - { - rnv_old = GET_REGISTER(cpustate, rn); - SET_REGISTER(cpustate, rn, rnv); - - // check writeback??? - } - else if (rn == eR15) - { - rnv = rnv + 8; - } - } - else - { - /* Post-indexed addressing */ - if (rn == eR15) - { - if (MODE32) - rnv = R15 + 8; - else - rnv = GET_PC + 8; - } - else - { - rnv = GET_REGISTER(cpustate, rn); - } - } - - /* Do the transfer */ - rd = (insn & INSN_RD) >> INSN_RD_SHIFT; - if (insn & INSN_SDT_L) - { - /* Load */ - if (insn & INSN_SDT_B) - { - UINT32 data = READ8(rnv); - if (cpustate->pendingAbtD == 0) - { - SET_REGISTER(cpustate, rd, data); - } - } - else - { - UINT32 data = READ32(rnv); - if (cpustate->pendingAbtD == 0) - { - if (rd == eR15) - { - if (MODE32) - R15 = data - 4; - else - R15 = (R15 & ~0x03FFFFFC) /* N Z C V I F M1 M0 */ | ((data - 4) & 0x03FFFFFC); - // LDR, PC takes 2S + 2N + 1I (5 total cycles) - ARM7_ICOUNT -= 2; - } - else - { - SET_REGISTER(cpustate, rd, data); - } - } - } - } - else - { - /* Store */ - if (insn & INSN_SDT_B) - { -#if ARM7_DEBUG_CORE - if (rd == eR15) - LOG(("Wrote R15 in byte mode\n")); -#endif - - WRITE8(rnv, (UINT8) GET_REGISTER(cpustate, rd) & 0xffu); - } - else - { -#if ARM7_DEBUG_CORE - if (rd == eR15) - LOG(("Wrote R15 in 32bit mode\n")); -#endif - - //WRITE32(rnv, rd == eR15 ? R15 + 8 : GET_REGISTER(cpustate, rd)); - WRITE32(rnv, rd == eR15 ? R15 + 8 + 4 : GET_REGISTER(cpustate, rd)); // manual says STR rd = PC, +12 - } - // Store takes only 2 N Cycles, so add + 1 - ARM7_ICOUNT += 1; - } - - if (cpustate->pendingAbtD != 0) - { - if ((insn & INSN_SDT_P) && (insn & INSN_SDT_W)) - { - SET_REGISTER(cpustate, rn, rnv_old); - } - } - else - { - - /* Do post-indexing writeback */ - if (!(insn & INSN_SDT_P)/* && (insn & INSN_SDT_W)*/) - { - if (insn & INSN_SDT_U) - { - /* Writeback is applied in pipeline, before value is read from mem, - so writeback is effectively ignored */ - if (rd == rn) { - SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); - // todo: check for offs... ? - } - else { - - if ((insn & INSN_SDT_W) != 0) - LOG(("%08x: RegisterWritebackIncrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); - - SET_REGISTER(cpustate, rn, (rnv + off)); - } - } - else - { - /* Writeback is applied in pipeline, before value is read from mem, - so writeback is effectively ignored */ - if (rd == rn) { - SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); - } - else { - SET_REGISTER(cpustate, rn, (rnv - off)); - - if ((insn & INSN_SDT_W) != 0) - LOG(("%08x: RegisterWritebackDecrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); - } - } - } - - } - -// ARM7_CHECKIRQ - -} /* HandleMemSingle */ - -static void HandleHalfWordDT(arm_state *cpustate, UINT32 insn) -{ - UINT32 rn, rnv, off, rd, rnv_old = 0; - - // Immediate or Register Offset? - if (insn & 0x400000) { // Bit 22 - 1 = immediate, 0 = register - // imm. value in high nibble (bits 8-11) and lo nibble (bit 0-3) - off = (((insn >> 8) & 0x0f) << 4) | (insn & 0x0f); - } - else { - // register - off = GET_REGISTER(cpustate, insn & 0x0f); - } - - /* Calculate Rn, accounting for PC */ - rn = (insn & INSN_RN) >> INSN_RN_SHIFT; - - if (insn & INSN_SDT_P) - { - /* Pre-indexed addressing */ - if (insn & INSN_SDT_U) - { - rnv = (GET_REGISTER(cpustate, rn) + off); - } - else - { - rnv = (GET_REGISTER(cpustate, rn) - off); - } - - if (insn & INSN_SDT_W) - { - rnv_old = GET_REGISTER(cpustate, rn); - SET_REGISTER(cpustate, rn, rnv); - - // check writeback??? - } - else if (rn == eR15) - { - rnv = (rnv) + 8; - } - } - else - { - /* Post-indexed addressing */ - if (rn == eR15) - { - rnv = R15 + 8; - } - else - { - rnv = GET_REGISTER(cpustate, rn); - } - } - - /* Do the transfer */ - rd = (insn & INSN_RD) >> INSN_RD_SHIFT; - - /* Load */ - if (insn & INSN_SDT_L) - { - // Signed? - if (insn & 0x40) - { - UINT32 newval = 0; - - // Signed Half Word? - if (insn & 0x20) { - UINT16 signbyte, databyte; - databyte = READ16(rnv) & 0xFFFF; - signbyte = (databyte & 0x8000) ? 0xffff : 0; - newval = (UINT32)(signbyte << 16)|databyte; - } - // Signed Byte - else { - UINT8 databyte; - UINT32 signbyte; - databyte = READ8(rnv) & 0xff; - signbyte = (databyte & 0x80) ? 0xffffff : 0; - newval = (UINT32)(signbyte << 8)|databyte; - } - - if (cpustate->pendingAbtD == 0) - { - - // PC? - if (rd == eR15) - { - R15 = newval + 8; - // LDR(H,SH,SB) PC takes 2S + 2N + 1I (5 total cycles) - ARM7_ICOUNT -= 2; - - } - else - { - SET_REGISTER(cpustate, rd, newval); - R15 += 4; - } - - } - else - { - R15 += 4; - } - - } - // Unsigned Half Word - else - { - UINT32 newval = READ16(rnv); - - if (cpustate->pendingAbtD == 0) - { - - if (rd == eR15) - { - R15 = newval + 8; - // extra cycles for LDR(H,SH,SB) PC (5 total cycles) - ARM7_ICOUNT -= 2; - } - else - { - SET_REGISTER(cpustate, rd, newval); - R15 += 4; - } - - } - else - { - R15 += 4; - } - - } - - - } - /* Store or ARMv5+ dword insns */ - else - { - if ((insn & 0x60) == 0x40) // LDRD - { - SET_REGISTER(cpustate, rd, READ32(rnv)); - SET_REGISTER(cpustate, rd+1, READ32(rnv+4)); - R15 += 4; - } - else if ((insn & 0x60) == 0x60) // STRD - { - WRITE32(rnv, GET_REGISTER(cpustate, rd)); - WRITE32(rnv+4, GET_REGISTER(cpustate, rd+1)); - R15 += 4; - } - else - { - // WRITE16(rnv, rd == eR15 ? R15 + 8 : GET_REGISTER(cpustate, rd)); - WRITE16(rnv, rd == eR15 ? R15 + 8 + 4 : GET_REGISTER(cpustate, rd)); // manual says STR RD=PC, +12 of address - -// if R15 is not increased then e.g. "STRH R10, [R15,#$10]" will be executed over and over again -#if 0 - if (rn != eR15) -#endif - R15 += 4; - - // STRH takes 2 cycles, so we add + 1 - ARM7_ICOUNT += 1; - } - } - - if (cpustate->pendingAbtD != 0) - { - if ((insn & INSN_SDT_P) && (insn & INSN_SDT_W)) - { - SET_REGISTER(cpustate, rn, rnv_old); - } - } - else - { - - // SJE: No idea if this writeback code works or makes sense here.. - - /* Do post-indexing writeback */ - if (!(insn & INSN_SDT_P)/* && (insn & INSN_SDT_W)*/) - { - if (insn & INSN_SDT_U) - { - /* Writeback is applied in pipeline, before value is read from mem, - so writeback is effectively ignored */ - if (rd == rn) { - SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); - // todo: check for offs... ? - } - else { - - if ((insn & INSN_SDT_W) != 0) - LOG(("%08x: RegisterWritebackIncrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); - - SET_REGISTER(cpustate, rn, (rnv + off)); - } - } - else - { - /* Writeback is applied in pipeline, before value is read from mem, - so writeback is effectively ignored */ - if (rd == rn) { - SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); - } - else { - SET_REGISTER(cpustate, rn, (rnv - off)); - - if ((insn & INSN_SDT_W) != 0) - LOG(("%08x: RegisterWritebackDecrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); - } - } - } - - } - -} - -static void HandleSwap(arm_state *cpustate, UINT32 insn) -{ - UINT32 rn, rm, rd, tmp; - - rn = GET_REGISTER(cpustate, (insn >> 16) & 0xf); // reg. w/read address - rm = GET_REGISTER(cpustate, insn & 0xf); // reg. w/write address - rd = (insn >> 12) & 0xf; // dest reg - -#if ARM7_DEBUG_CORE - if (rn == 15 || rm == 15 || rd == 15) - LOG(("%08x: Illegal use of R15 in Swap Instruction\n", R15)); -#endif - - // can be byte or word - if (insn & 0x400000) - { - tmp = READ8(rn); - WRITE8(rn, rm); - SET_REGISTER(cpustate, rd, tmp); - } - else - { - tmp = READ32(rn); - WRITE32(rn, rm); - SET_REGISTER(cpustate, rd, tmp); - } - - R15 += 4; - // Instruction takes 1S+2N+1I cycles - so we subtract one more.. - ARM7_ICOUNT -= 1; -} - -static void HandlePSRTransfer(arm_state *cpustate, UINT32 insn) -{ - int reg = (insn & 0x400000) ? SPSR : eCPSR; // Either CPSR or SPSR - UINT32 newval, val = 0; - int oldmode = GET_CPSR & MODE_FLAG; - - // get old value of CPSR/SPSR - newval = GET_REGISTER(cpustate, reg); - - // MSR (bit 21 set) - Copy value to CPSR/SPSR - if ((insn & 0x00200000)) - { - // Immediate Value? - if (insn & INSN_I) { - // Value can be specified for a Right Rotate, 2x the value specified. - int by = (insn & INSN_OP2_ROTATE) >> INSN_OP2_ROTATE_SHIFT; - if (by) - val = ROR(insn & INSN_OP2_IMM, by << 1); - else - val = insn & INSN_OP2_IMM; - } - // Value from Register - else - { - val = GET_REGISTER(cpustate, insn & 0x0f); - } - - // apply field code bits - if (reg == eCPSR) - { - if (oldmode != eARM7_MODE_USER) - { - if (insn & 0x00010000) - { - newval = (newval & 0xffffff00) | (val & 0x000000ff); - } - if (insn & 0x00020000) - { - newval = (newval & 0xffff00ff) | (val & 0x0000ff00); - } - if (insn & 0x00040000) - { - newval = (newval & 0xff00ffff) | (val & 0x00ff0000); - } - } - - // status flags can be modified regardless of mode - if (insn & 0x00080000) - { - // TODO for non ARMv5E mask should be 0xf0000000 (ie mask Q bit) - newval = (newval & 0x00ffffff) | (val & 0xf8000000); - } - } - else // SPSR has stricter requirements - { - if (((GET_CPSR & 0x1f) > 0x10) && ((GET_CPSR & 0x1f) < 0x1f)) - { - if (insn & 0x00010000) - { - newval = (newval & 0xffffff00) | (val & 0xff); - } - if (insn & 0x00020000) - { - newval = (newval & 0xffff00ff) | (val & 0xff00); - } - if (insn & 0x00040000) - { - newval = (newval & 0xff00ffff) | (val & 0xff0000); - } - if (insn & 0x00080000) - { - // TODO for non ARMv5E mask should be 0xf0000000 (ie mask Q bit) - newval = (newval & 0x00ffffff) | (val & 0xf8000000); - } - } - } - -#if 0 - // force valid mode - newval |= 0x10; -#endif - - // Update the Register - if (reg == eCPSR) - SET_CPSR(newval); - else - SET_REGISTER(cpustate, reg, newval); - - // Switch to new mode if changed - if ((newval & MODE_FLAG) != oldmode) - SwitchMode(cpustate, GET_MODE); - - } - // MRS (bit 21 clear) - Copy CPSR or SPSR to specified Register - else - { - SET_REGISTER(cpustate, (insn >> 12)& 0x0f, GET_REGISTER(cpustate, reg)); - } -} - -static void HandleALU(arm_state *cpustate, UINT32 insn) -{ - UINT32 op2, sc = 0, rd, rn, opcode; - UINT32 by, rdn; - - // Normal Data Processing : 1S - // Data Processing with register specified shift : 1S + 1I - // Data Processing with PC written : 2S + 1N - // Data Processing with register specified shift and PC written : 2S + 1N + 1I - - opcode = (insn & INSN_OPCODE) >> INSN_OPCODE_SHIFT; - - rd = 0; - rn = 0; - - /* --------------*/ - /* Construct Op2 */ - /* --------------*/ - - /* Immediate constant */ - if (insn & INSN_I) - { - by = (insn & INSN_OP2_ROTATE) >> INSN_OP2_ROTATE_SHIFT; - if (by) - { - op2 = ROR(insn & INSN_OP2_IMM, by << 1); - sc = op2 & SIGN_BIT; - } - else - { - op2 = insn & INSN_OP2; // SJE: Shouldn't this be INSN_OP2_IMM? - sc = GET_CPSR & C_MASK; - } - } - /* Op2 = Register Value */ - else - { - op2 = decodeShift(cpustate, insn, (insn & INSN_S) ? &sc : NULL); - - // LD TODO sc will always be 0 if this applies - if (!(insn & INSN_S)) - sc = 0; - - // extra cycle (register specified shift) - ARM7_ICOUNT -= 1; - } - - // LD TODO this comment is wrong - /* Calculate Rn to account for pipelining */ - if ((opcode & 0xd) != 0xd) /* No Rn in MOV */ - { - if ((rn = (insn & INSN_RN) >> INSN_RN_SHIFT) == eR15) - { -#if ARM7_DEBUG_CORE - LOG(("%08x: Pipelined R15 (Shift %d)\n", R15, (insn & INSN_I ? 8 : insn & 0x10u ? 12 : 12))); -#endif - if (MODE32) - rn = R15 + 8; - else - rn = GET_PC + 8; - } - else - { - rn = GET_REGISTER(cpustate, rn); - } - } - - /* Perform the operation */ - - switch (opcode) - { - /* Arithmetic operations */ - case OPCODE_SBC: - rd = (rn - op2 - (GET_CPSR & C_MASK ? 0 : 1)); - HandleALUSubFlags(rd, rn, op2); - break; - case OPCODE_CMP: - case OPCODE_SUB: - rd = (rn - op2); - HandleALUSubFlags(rd, rn, op2); - break; - case OPCODE_RSC: - rd = (op2 - rn - (GET_CPSR & C_MASK ? 0 : 1)); - HandleALUSubFlags(rd, op2, rn); - break; - case OPCODE_RSB: - rd = (op2 - rn); - HandleALUSubFlags(rd, op2, rn); - break; - case OPCODE_ADC: - rd = (rn + op2 + ((GET_CPSR & C_MASK) >> C_BIT)); - HandleALUAddFlags(rd, rn, op2); - break; - case OPCODE_CMN: - case OPCODE_ADD: - rd = (rn + op2); - HandleALUAddFlags(rd, rn, op2); - break; - - /* Logical operations */ - case OPCODE_AND: - case OPCODE_TST: - rd = rn & op2; - HandleALULogicalFlags(rd, sc); - break; - case OPCODE_BIC: - rd = rn & ~op2; - HandleALULogicalFlags(rd, sc); - break; - case OPCODE_TEQ: - case OPCODE_EOR: - rd = rn ^ op2; - HandleALULogicalFlags(rd, sc); - break; - case OPCODE_ORR: - rd = rn | op2; - HandleALULogicalFlags(rd, sc); - break; - case OPCODE_MOV: - rd = op2; - HandleALULogicalFlags(rd, sc); - break; - case OPCODE_MVN: - rd = (~op2); - HandleALULogicalFlags(rd, sc); - break; - } - - /* Put the result in its register if not one of the test only opcodes (TST,TEQ,CMP,CMN) */ - rdn = (insn & INSN_RD) >> INSN_RD_SHIFT; - if ((opcode & 0xc) != 0x8) - { - // If Rd = R15, but S Flag not set, Result is placed in R15, but CPSR is not affected (page 44) - if (rdn == eR15 && !(insn & INSN_S)) - { - if (MODE32) - { - R15 = rd; - } - else - { - R15 = (R15 & ~0x03FFFFFC) | (rd & 0x03FFFFFC); - } - // extra cycles (PC written) - ARM7_ICOUNT -= 2; - } - else - { - // Rd = 15 and S Flag IS set, Result is placed in R15, and current mode SPSR moved to CPSR - if (rdn == eR15) { - - if (MODE32) - { - // When Rd is R15 and the S flag is set the result of the operation is placed in R15 and the SPSR corresponding to - // the current mode is moved to the CPSR. This allows state changes which automatically restore both PC and - // CPSR. --> This form of instruction should not be used in User mode. <-- - - if (GET_MODE != eARM7_MODE_USER) - { - // Update CPSR from SPSR - SET_CPSR(GET_REGISTER(cpustate, SPSR)); - SwitchMode(cpustate, GET_MODE); - } - - R15 = rd; - - } - else - { - UINT32 temp; - R15 = rd; //(R15 & 0x03FFFFFC) | (rd & 0xFC000003); - temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */; - SET_CPSR( temp); - SwitchMode( cpustate, temp & 3); - } - - // extra cycles (PC written) - ARM7_ICOUNT -= 2; - - /* IRQ masks may have changed in this instruction */ -// ARM7_CHECKIRQ; - } - else - /* S Flag is set - Write results to register & update CPSR (which was already handled using HandleALU flag macros) */ - SET_REGISTER(cpustate, rdn, rd); - } - } - // SJE: Don't think this applies any more.. (see page 44 at bottom) - /* TST & TEQ can affect R15 (the condition code register) with the S bit set */ - else if (rdn == eR15) - { - if (insn & INSN_S) { -#if ARM7_DEBUG_CORE - LOG(("%08x: TST class on R15 s bit set\n", R15)); -#endif - if (MODE32) - R15 = rd; - else - { - UINT32 temp; - R15 = (R15 & 0x03FFFFFC) | (rd & ~0x03FFFFFC); - temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */; - SET_CPSR( temp); - SwitchMode( cpustate, temp & 3); - } - - /* IRQ masks may have changed in this instruction */ -// ARM7_CHECKIRQ; - } - else - { -#if ARM7_DEBUG_CORE - LOG(("%08x: TST class on R15 no s bit set\n", R15)); -#endif - } - // extra cycles (PC written) - ARM7_ICOUNT -= 2; - } - - // compensate for the -3 at the end - ARM7_ICOUNT += 2; -} - -static void HandleMul(arm_state *cpustate, UINT32 insn) -{ - UINT32 r, rm, rs; - - // MUL takes 1S + mI and MLA 1S + (m+1)I cycles to execute, where S and I are as - // defined in 6.2 Cycle Types on page 6-2. - // m is the number of 8 bit multiplier array cycles required to complete the - // multiply, which is controlled by the value of the multiplier operand - // specified by Rs. - - rm = GET_REGISTER(cpustate, insn & INSN_MUL_RM); - rs = GET_REGISTER(cpustate, (insn & INSN_MUL_RS) >> INSN_MUL_RS_SHIFT); - - /* Do the basic multiply of Rm and Rs */ - r = rm * rs; - -#if ARM7_DEBUG_CORE - if ((insn & INSN_MUL_RM) == 0xf || - ((insn & INSN_MUL_RS) >> INSN_MUL_RS_SHIFT) == 0xf || - ((insn & INSN_MUL_RN) >> INSN_MUL_RN_SHIFT) == 0xf) - LOG(("%08x: R15 used in mult\n", R15)); -#endif - - /* Add on Rn if this is a MLA */ - if (insn & INSN_MUL_A) - { - r += GET_REGISTER(cpustate, (insn & INSN_MUL_RN) >> INSN_MUL_RN_SHIFT); - // extra cycle for MLA - ARM7_ICOUNT -= 1; - } - - /* Write the result */ - SET_REGISTER(cpustate, (insn & INSN_MUL_RD) >> INSN_MUL_RD_SHIFT, r); - - /* Set N and Z if asked */ - if (insn & INSN_S) - { - SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleALUNZFlags(r)); - } - - if (rs & SIGN_BIT) rs = -rs; - if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1; - else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2; - else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3; - else ARM7_ICOUNT -= 1 + 4; - - ARM7_ICOUNT += 3; -} - -// todo: add proper cycle counts -static void HandleSMulLong(arm_state *cpustate, UINT32 insn) -{ - INT32 rm, rs; - UINT32 rhi, rlo; - INT64 res = 0; - - // MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the - // number of 8 bit multiplier array cycles required to complete the multiply, which is - // controlled by the value of the multiplier operand specified by Rs. - - rm = (INT32)GET_REGISTER(cpustate, insn & 0xf); - rs = (INT32)GET_REGISTER(cpustate, ((insn >> 8) & 0xf)); - rhi = (insn >> 16) & 0xf; - rlo = (insn >> 12) & 0xf; - -#if ARM7_DEBUG_CORE - if ((insn & 0xf) == 15 || ((insn >> 8) & 0xf) == 15 || ((insn >> 16) & 0xf) == 15 || ((insn >> 12) & 0xf) == 15) - LOG(("%08x: Illegal use of PC as a register in SMULL opcode\n", R15)); -#endif - - /* Perform the multiplication */ - res = (INT64)rm * rs; - - /* Add on Rn if this is a MLA */ - if (insn & INSN_MUL_A) - { - INT64 acum = (INT64)((((INT64)(GET_REGISTER(cpustate, rhi))) << 32) | GET_REGISTER(cpustate, rlo)); - res += acum; - // extra cycle for MLA - ARM7_ICOUNT -= 1; - } - - /* Write the result (upper dword goes to RHi, lower to RLo) */ - SET_REGISTER(cpustate, rhi, res >> 32); - SET_REGISTER(cpustate, rlo, res & 0xFFFFFFFF); - - /* Set N and Z if asked */ - if (insn & INSN_S) - { - SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleLongALUNZFlags(res)); - } - - if (rs < 0) rs = -rs; - if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1 + 1; - else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2 + 1; - else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3 + 1; - else ARM7_ICOUNT -= 1 + 4 + 1; - - ARM7_ICOUNT += 3; -} - -// todo: add proper cycle counts -static void HandleUMulLong(arm_state *cpustate, UINT32 insn) -{ - UINT32 rm, rs; - UINT32 rhi, rlo; - UINT64 res = 0; - - // MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the - // number of 8 bit multiplier array cycles required to complete the multiply, which is - // controlled by the value of the multiplier operand specified by Rs. - - rm = (INT32)GET_REGISTER(cpustate, insn & 0xf); - rs = (INT32)GET_REGISTER(cpustate, ((insn >> 8) & 0xf)); - rhi = (insn >> 16) & 0xf; - rlo = (insn >> 12) & 0xf; - -#if ARM7_DEBUG_CORE - if (((insn & 0xf) == 15) || (((insn >> 8) & 0xf) == 15) || (((insn >> 16) & 0xf) == 15) || (((insn >> 12) & 0xf) == 15)) - LOG(("%08x: Illegal use of PC as a register in SMULL opcode\n", R15)); -#endif - - /* Perform the multiplication */ - res = (UINT64)rm * rs; - - /* Add on Rn if this is a MLA */ - if (insn & INSN_MUL_A) - { - UINT64 acum = (UINT64)((((UINT64)(GET_REGISTER(cpustate, rhi))) << 32) | GET_REGISTER(cpustate, rlo)); - res += acum; - // extra cycle for MLA - ARM7_ICOUNT -= 1; - } - - /* Write the result (upper dword goes to RHi, lower to RLo) */ - SET_REGISTER(cpustate, rhi, res >> 32); - SET_REGISTER(cpustate, rlo, res & 0xFFFFFFFF); - - /* Set N and Z if asked */ - if (insn & INSN_S) - { - SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleLongALUNZFlags(res)); - } - - if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1 + 1; - else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2 + 1; - else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3 + 1; - else ARM7_ICOUNT -= 1 + 4 + 1; - - ARM7_ICOUNT += 3; -} - -static void HandleMemBlock(arm_state *cpustate, UINT32 insn) -{ - UINT32 rb = (insn & INSN_RN) >> INSN_RN_SHIFT; - UINT32 rbp = GET_REGISTER(cpustate, rb); - int result; - -#if ARM7_DEBUG_CORE - if (rbp & 3) - LOG(("%08x: Unaligned Mem Transfer @ %08x\n", R15, rbp)); -#endif - - // Normal LDM instructions take nS + 1N + 1I and LDM PC takes (n+1)S + 2N + 1I - // incremental cycles, where S,N and I are as defined in 6.2 Cycle Types on page 6-2. - // STM instructions take (n-1)S + 2N incremental cycles to execute, where n is the - // number of words transferred. - - if (insn & INSN_BDT_L) - { - /* Loading */ - if (insn & INSN_BDT_U) - { - /* Incrementing */ - if (!(insn & INSN_BDT_P)) - { - rbp = rbp + (- 4); - } - - // S Flag Set, but R15 not in list = User Bank Transfer - if (insn & INSN_BDT_S && (insn & 0x8000) == 0) - { - // set to user mode - then do the transfer, and set back - int curmode = GET_MODE; - SwitchMode(cpustate, eARM7_MODE_USER); - LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); - result = loadInc(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S); - // todo - not sure if Writeback occurs on User registers also.. - SwitchMode(cpustate, curmode); - } - else - result = loadInc(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S); - - if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) - { -#if ARM7_DEBUG_CORE - if (rb == 15) - LOG(("%08x: Illegal LDRM writeback to r15\n", R15)); -#endif - // "A LDM will always overwrite the updated base if the base is in the list." (also for a user bank transfer?) - // GBA "V-Rally 3" expects R0 not to be overwritten with the updated base value [BP 8077B0C] - if (((insn >> rb) & 1) == 0) - { - SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) + result * 4); - } - } - - // R15 included? (NOTE: CPSR restore must occur LAST otherwise wrong registers restored!) - if ((insn & 0x8000) && (cpustate->pendingAbtD == 0)) { - R15 -= 4; // SJE: I forget why i did this? - // S - Flag Set? Signals transfer of current mode SPSR->CPSR - if (insn & INSN_BDT_S) - { - if (MODE32) - { - SET_CPSR(GET_REGISTER(cpustate, SPSR)); - SwitchMode(cpustate, GET_MODE); - } - else - { - UINT32 temp; -// LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR)); - temp = (GET_CPSR & 0x0FFFFF20) | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */; - SET_CPSR( temp); - SwitchMode(cpustate, temp & 3); - } - } - // LDM PC - takes 2 extra cycles - ARM7_ICOUNT -= 2; - } - } - else - { - /* Decrementing */ - if (!(insn & INSN_BDT_P)) - { - rbp = rbp - (- 4); - } - - // S Flag Set, but R15 not in list = User Bank Transfer - if (insn & INSN_BDT_S && ((insn & 0x8000) == 0)) - { - // set to user mode - then do the transfer, and set back - int curmode = GET_MODE; - SwitchMode(cpustate, eARM7_MODE_USER); - LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); - result = loadDec(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S); - // todo - not sure if Writeback occurs on User registers also.. - SwitchMode(cpustate, curmode); - } - else - result = loadDec(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S); - - if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) - { - if (rb == 0xf) - LOG(("%08x: Illegal LDRM writeback to r15\n", R15)); - // "A LDM will always overwrite the updated base if the base is in the list." (also for a user bank transfer?) - if (((insn >> rb) & 1) == 0) - { - SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) - result * 4); - } - } - - // R15 included? (NOTE: CPSR restore must occur LAST otherwise wrong registers restored!) - if ((insn & 0x8000) && (cpustate->pendingAbtD == 0)) { - R15 -= 4; // SJE: I forget why i did this? - // S - Flag Set? Signals transfer of current mode SPSR->CPSR - if (insn & INSN_BDT_S) - { - if (MODE32) - { - SET_CPSR(GET_REGISTER(cpustate, SPSR)); - SwitchMode(cpustate, GET_MODE); - } - else - { - UINT32 temp; -// LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR)); - temp = (GET_CPSR & 0x0FFFFF20) /* N Z C V I F M4 M3 M2 M1 M0 */ | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */; - SET_CPSR( temp); - SwitchMode(cpustate, temp & 3); - } - } - // LDM PC - takes 2 extra cycles - ARM7_ICOUNT -= 2; - } - } - // LDM (NO PC) takes (n)S + 1N + 1I cycles (n = # of register transfers) - ARM7_ICOUNT -= result + 1 + 1; - } /* Loading */ - else - { - /* Storing */ - if (insn & (1 << eR15)) - { -#if ARM7_DEBUG_CORE - LOG(("%08x: Writing R15 in strm\n", R15)); -#endif - /* special case handling if writing to PC */ - R15 += 12; - } - if (insn & INSN_BDT_U) - { - /* Incrementing */ - if (!(insn & INSN_BDT_P)) - { - rbp = rbp + (- 4); - } - - // S Flag Set = User Bank Transfer - if (insn & INSN_BDT_S) - { - // todo: needs to be tested.. - - // set to user mode - then do the transfer, and set back - int curmode = GET_MODE; - SwitchMode(cpustate, eARM7_MODE_USER); - LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); - result = storeInc(cpustate, insn & 0xffff, rbp); - // todo - not sure if Writeback occurs on User registers also.. - SwitchMode(cpustate, curmode); - } - else - result = storeInc(cpustate, insn & 0xffff, rbp); - - if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) - { - SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) + result * 4); - } - } - else - { - /* Decrementing */ - if (!(insn & INSN_BDT_P)) - { - rbp = rbp - (-4); - } - - // S Flag Set = User Bank Transfer - if (insn & INSN_BDT_S) - { - // set to user mode - then do the transfer, and set back - int curmode = GET_MODE; - SwitchMode(cpustate, eARM7_MODE_USER); - LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); - result = storeDec(cpustate, insn & 0xffff, rbp); - // todo - not sure if Writeback occurs on User registers also.. - SwitchMode(cpustate, curmode); - } - else - result = storeDec(cpustate, insn & 0xffff, rbp); - - if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) - { - SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) - result * 4); - } - } - if (insn & (1 << eR15)) - R15 -= 12; - - // STM takes (n-1)S + 2N cycles (n = # of register transfers) - ARM7_ICOUNT -= (result - 1) + 2; - } - - // We will specify the cycle count for each case, so remove the -3 that occurs at the end - ARM7_ICOUNT += 3; - -} /* HandleMemBlock */ diff -Nru mame-0.144/src/emu/cpu/arm7/arm7core.h mame-0.145/src/emu/cpu/arm7/arm7core.h --- mame-0.144/src/emu/cpu/arm7/arm7core.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7core.h 2012-02-06 21:30:23.000000000 +0000 @@ -34,6 +34,8 @@ #define __ARM7CORE_H__ #define ARM7_MMU_ENABLE_HACK 0 +#define ARM7_DEBUG_CORE 0 + /**************************************************************************************************** * INTERRUPT LINES/EXCEPTIONS @@ -139,7 +141,8 @@ #define COPRO_DOMAIN_ACCESS_CONTROL cpustate->domainAccessControl -#define COPRO_FAULT_STATUS cpustate->faultStatus +#define COPRO_FAULT_STATUS_D cpustate->faultStatus[0] +#define COPRO_FAULT_STATUS_P cpustate->faultStatus[1] #define COPRO_FAULT_ADDRESS cpustate->faultAddress @@ -149,7 +152,7 @@ #define ARM7COPRO_REGS \ UINT32 control; \ UINT32 tlbBase; \ - UINT32 faultStatus; \ + UINT32 faultStatus[2]; \ UINT32 faultAddress; \ UINT32 fcsePID; \ UINT32 domainAccessControl; @@ -389,12 +392,12 @@ #define THUMB_ADDSUB_RNIMM ((UINT16)0x01c0) #define THUMB_ADDSUB_RS ((UINT16)0x0038) #define THUMB_ADDSUB_RD ((UINT16)0x0007) -#define THUMB_INSN_ADDSUB ((UINT16)0x0800) #define THUMB_INSN_CMP ((UINT16)0x0800) #define THUMB_INSN_SUB ((UINT16)0x0800) #define THUMB_INSN_IMM_RD ((UINT16)0x0700) #define THUMB_INSN_IMM_S ((UINT16)0x0080) #define THUMB_INSN_IMM ((UINT16)0x00ff) +#define THUMB_INSN_ADDSUB ((UINT16)0x0800) #define THUMB_ADDSUB_TYPE ((UINT16)0x0600) #define THUMB_HIREG_OP ((UINT16)0x0300) #define THUMB_HIREG_H ((UINT16)0x00c0) @@ -503,16 +506,16 @@ #define MODE26 (!(GET_CPSR & 0x10)) #define GET_PC (MODE32 ? R15 : R15 & 0x03FFFFFC) -enum -{ - ARM7_TLB_NO_ABORT, - ARM7_TLB_ABORT_D, - ARM7_TLB_ABORT_P -}; +#define ARM7_TLB_ABORT_D (1 << 0) +#define ARM7_TLB_ABORT_P (1 << 1) +#define ARM7_TLB_READ (1 << 2) +#define ARM7_TLB_WRITE (1 << 3) /* At one point I thought these needed to be cpu implementation specific, but they don't.. */ #define GET_REGISTER(state, reg) GetRegister(state, reg) #define SET_REGISTER(state, reg, val) SetRegister(state, reg, val) +#define GET_MODE_REGISTER(state, mode, reg) GetModeRegister(state, mode, reg) +#define SET_MODE_REGISTER(state, mode, reg, val) SetModeRegister(state, mode, reg, val) #define ARM7_CHECKIRQ arm7_check_irq_state(cpustate) extern write32_device_func arm7_coproc_do_callback; diff -Nru mame-0.144/src/emu/cpu/arm7/arm7exec.c mame-0.145/src/emu/cpu/arm7/arm7exec.c --- mame-0.144/src/emu/cpu/arm7/arm7exec.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7exec.c 2012-02-06 21:30:23.000000000 +0000 @@ -1,1648 +1 @@ -/***************************************************************************** - * - * arm7exec.c - * Portable ARM7TDMI Core Emulator - * - * Copyright Steve Ellenoff, all rights reserved. - * - * - This source code is released as freeware for non-commercial purposes. - * - You are free to use and redistribute this code in modified or - * unmodified form, provided you list me in the credits. - * - If you modify this source code, you must add a notice to each modified - * source file that it has been changed. If you're a nice person, you - * will clearly mark each change too. :) - * - If you wish to use this for commercial purposes, please contact me at - * sellenoff@hotmail.com - * - The author of this copywritten work reserves the right to change the - * terms of its usage and license at any time, including retroactively - * - This entire notice must remain in the source code. - * - * This work is based on: - * #1) 'Atmel Corporation ARM7TDMI (Thumb) Datasheet - January 1999' - * #2) Arm 2/3/6 emulator By Bryan McPhail (bmcphail@tendril.co.uk) and Phil Stroffolino (MAME CORE 0.76) - * - *****************************************************************************/ -/****************************************************************************** - * Notes: - * This file contains the code to run during the CPU EXECUTE METHOD. - * It has been split into it's own file (from the arm7core.c) so it can be - * directly compiled into any cpu core that wishes to use it. - * - * It should be included as follows in your cpu core: - * - * CPU_EXECUTE( arm7 ) - * { - * #include "arm7exec.c" - * } - * -*****************************************************************************/ - -/* This implementation uses an improved switch() for hopefully faster opcode fetches compared to my last version -.. though there's still room for improvement. */ -{ - UINT32 pc; - UINT32 insn; - arm_state *cpustate = get_safe_token(device); - - do - { - debugger_instruction_hook(cpustate->device, GET_PC); - - /* handle Thumb instructions if active */ - if (T_IS_SET(GET_CPSR)) - { - UINT32 readword, addr, raddr; - UINT32 rm, rn, rs, rd, op2, imm, rrs, rrd; - INT32 offs; - - pc = R15; - - // "In Thumb state, bit [0] is undefined and must be ignored. Bits [31:1] contain the PC." - raddr = pc & (~1); - - if ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - raddr = arm7_tlb_translate(cpustate, raddr, ARM7_TLB_ABORT_P); - if (cpustate->pendingAbtP != 0) - { - goto skip_exec; - } - } - insn = cpustate->direct->read_decrypted_word(raddr); - ARM7_ICOUNT -= (3 - thumbCycles[insn >> 8]); - switch ((insn & THUMB_INSN_TYPE) >> THUMB_INSN_TYPE_SHIFT) - { - case 0x0: /* Logical shifting */ - SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); - if (insn & THUMB_SHIFT_R) /* Shift right */ - { - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrs = GET_REGISTER(cpustate, rs); - offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; - if (offs != 0) - { - SET_REGISTER(cpustate, rd, rrs >> offs); - if (rrs & (1 << (offs - 1))) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else - { - SET_REGISTER(cpustate, rd, 0); - if (rrs & 0x80000000) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - } - else /* Shift left */ - { - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrs = GET_REGISTER(cpustate, rs); - offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; - if (offs != 0) - { - SET_REGISTER(cpustate, rd, rrs << offs); - if (rrs & (1 << (31 - (offs - 1)))) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else - { - SET_REGISTER(cpustate, rd, rrs); - } - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - } - break; - case 0x1: /* Arithmetic */ - if (insn & THUMB_INSN_ADDSUB) - { - switch ((insn & THUMB_ADDSUB_TYPE) >> THUMB_ADDSUB_TYPE_SHIFT) - { - case 0x0: /* ADD Rd, Rs, Rn */ - rn = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT); - rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, rs + rn); - HandleThumbALUAddFlags(GET_REGISTER(cpustate, rd), rs, rn); - break; - case 0x1: /* SUB Rd, Rs, Rn */ - rn = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT); - rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, rs - rn); - HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), rs, rn); - break; - case 0x2: /* ADD Rd, Rs, #imm */ - imm = (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT; - rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, rs + imm); - HandleThumbALUAddFlags(GET_REGISTER(cpustate, rd), rs, imm); - break; - case 0x3: /* SUB Rd, Rs, #imm */ - imm = (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT; - rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, rs - imm); - HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), rs,imm); - break; - default: - fatalerror("%08x: G1 Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - } - else - { - /* ASR.. */ - //if (insn & THUMB_SHIFT_R) /* Shift right */ - { - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrs = GET_REGISTER(cpustate, rs); - offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; - if (offs == 0) - { - offs = 32; - } - if (offs >= 32) - { - if (rrs >> 31) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - SET_REGISTER(cpustate, rd, (rrs & 0x80000000) ? 0xFFFFFFFF : 0x00000000); - } - else - { - if ((rrs >> (offs - 1)) & 1) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - SET_REGISTER(cpustate, rd, - (rrs & 0x80000000) - ? ((0xFFFFFFFF << (32 - offs)) | (rrs >> offs)) - : (rrs >> offs)); - } - SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - } - } - break; - case 0x2: /* CMP / MOV */ - if (insn & THUMB_INSN_CMP) - { - rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); - op2 = insn & THUMB_INSN_IMM; - rd = rn - op2; - HandleThumbALUSubFlags(rd, rn, op2); - //mame_printf_debug("%08x: xxx Thumb instruction: CMP R%d (%08x), %02x (N=%d, Z=%d, C=%d, V=%d)\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT), op2, N_IS_SET(GET_CPSR) ? 1 : 0, Z_IS_SET(GET_CPSR) ? 1 : 0, C_IS_SET(GET_CPSR) ? 1 : 0, V_IS_SET(GET_CPSR) ? 1 : 0); - } - else - { - rd = (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT; - op2 = (insn & THUMB_INSN_IMM); - SET_REGISTER(cpustate, rd, op2); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - } - break; - case 0x3: /* ADD/SUB immediate */ - if (insn & THUMB_INSN_SUB) /* SUB Rd, #Offset8 */ - { - rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); - op2 = insn & THUMB_INSN_IMM; - //mame_printf_debug("%08x: Thumb instruction: SUB R%d, %02x\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, op2); - rd = rn - op2; - SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, rd); - HandleThumbALUSubFlags(rd, rn, op2); - } - else /* ADD Rd, #Offset8 */ - { - rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); - op2 = insn & THUMB_INSN_IMM; - rd = rn + op2; - //mame_printf_debug("%08x: Thumb instruction: ADD R%d, %02x\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, op2); - SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, rd); - HandleThumbALUAddFlags(rd, rn, op2); - } - break; - case 0x4: /* Rd & Rm instructions */ - switch ((insn & THUMB_GROUP4_TYPE) >> THUMB_GROUP4_TYPE_SHIFT) - { - case 0x0: - switch ((insn & THUMB_ALUOP_TYPE) >> THUMB_ALUOP_TYPE_SHIFT) - { - case 0x0: /* AND Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) & GET_REGISTER(cpustate, rs)); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x1: /* EOR Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) ^ GET_REGISTER(cpustate, rs)); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x2: /* LSL Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrd = GET_REGISTER(cpustate, rd); - offs = GET_REGISTER(cpustate, rs) & 0x000000ff; - if (offs > 0) - { - if (offs < 32) - { - SET_REGISTER(cpustate, rd, rrd << offs); - if (rrd & (1 << (31 - (offs - 1)))) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else if (offs == 32) - { - SET_REGISTER(cpustate, rd, 0); - if (rrd & 1) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else - { - SET_REGISTER(cpustate, rd, 0); - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x3: /* LSR Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrd = GET_REGISTER(cpustate, rd); - offs = GET_REGISTER(cpustate, rs) & 0x000000ff; - if (offs > 0) - { - if (offs < 32) - { - SET_REGISTER(cpustate, rd, rrd >> offs); - if (rrd & (1 << (offs - 1))) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else if (offs == 32) - { - SET_REGISTER(cpustate, rd, 0); - if (rrd & 0x80000000) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - else - { - SET_REGISTER(cpustate, rd, 0); - SET_CPSR(GET_CPSR & ~C_MASK); - } - } - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x4: /* ASR Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrs = GET_REGISTER(cpustate, rs)&0xff; - rrd = GET_REGISTER(cpustate, rd); - if (rrs != 0) - { - if (rrs >= 32) - { - if (rrd >> 31) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - SET_REGISTER(cpustate, rd, (GET_REGISTER(cpustate, rd) & 0x80000000) ? 0xFFFFFFFF : 0x00000000); - } - else - { - if ((rrd >> (rrs-1)) & 1) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - SET_REGISTER(cpustate, rd, (rrd & 0x80000000) - ? ((0xFFFFFFFF << (32 - rrs)) | (rrd >> rrs)) - : (rrd >> rrs)); - } - } - SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x5: /* ADC Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - op2=(GET_CPSR & C_MASK) ? 1 : 0; - rn=GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs) + op2; - HandleThumbALUAddFlags(rn, GET_REGISTER(cpustate, rd), (GET_REGISTER(cpustate, rs))); // ? - SET_REGISTER(cpustate, rd, rn); - break; - case 0x6: /* SBC Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - op2=(GET_CPSR & C_MASK) ? 0 : 1; - rn=GET_REGISTER(cpustate, rd) - GET_REGISTER(cpustate, rs) - op2; - HandleThumbALUSubFlags(rn, GET_REGISTER(cpustate, rd), (GET_REGISTER(cpustate, rs))); //? - SET_REGISTER(cpustate, rd, rn); - break; - case 0x7: /* ROR Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrd = GET_REGISTER(cpustate, rd); - imm = GET_REGISTER(cpustate, rs) & 0x0000001f; - SET_REGISTER(cpustate, rd, (rrd >> imm) | (rrd << (32 - imm))); - if (rrd & (1 << (imm - 1))) - { - SET_CPSR(GET_CPSR | C_MASK); - } - else - { - SET_CPSR(GET_CPSR & ~C_MASK); - } - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0x8: /* TST Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd) & GET_REGISTER(cpustate, rs))); - R15 += 2; - break; - case 0x9: /* NEG Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rrs = GET_REGISTER(cpustate, rs); - rn = 0 - rrs; - SET_REGISTER(cpustate, rd, rn); - HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), 0, rrs); - break; - case 0xa: /* CMP Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rn = GET_REGISTER(cpustate, rd) - GET_REGISTER(cpustate, rs); - HandleThumbALUSubFlags(rn, GET_REGISTER(cpustate, rd), GET_REGISTER(cpustate, rs)); - break; - case 0xb: /* CMN Rd, Rs - check flags, add dasm */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rn = GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs); - HandleThumbALUAddFlags(rn, GET_REGISTER(cpustate, rd), GET_REGISTER(cpustate, rs)); - break; - case 0xc: /* ORR Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) | GET_REGISTER(cpustate, rs)); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0xd: /* MUL Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - rn = GET_REGISTER(cpustate, rd) * GET_REGISTER(cpustate, rs); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_REGISTER(cpustate, rd, rn); - SET_CPSR(GET_CPSR | HandleALUNZFlags(rn)); - R15 += 2; - break; - case 0xe: /* BIC Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) & (~GET_REGISTER(cpustate, rs))); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - case 0xf: /* MVN Rd, Rs */ - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - op2 = GET_REGISTER(cpustate, rs); - SET_REGISTER(cpustate, rd, ~op2); - SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); - SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); - R15 += 2; - break; - default: - fatalerror("%08x: G4-0 Undefined Thumb instruction: %04x %x\n", pc, insn, (insn & THUMB_ALUOP_TYPE) >> THUMB_ALUOP_TYPE_SHIFT); - R15 += 2; - break; - } - break; - case 0x1: - switch ((insn & THUMB_HIREG_OP) >> THUMB_HIREG_OP_SHIFT) - { - case 0x0: /* ADD Rd, Rs */ - rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - rd = insn & THUMB_HIREG_RD; - switch ((insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT) - { - case 0x1: /* ADD Rd, HRs */ - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs+8)); - // emulate the effects of pre-fetch - if (rs == 7) - { - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) + 4); - } - break; - case 0x2: /* ADD HRd, Rs */ - SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + GET_REGISTER(cpustate, rs)); - if (rd == 7) - { - R15 += 2; - } - break; - case 0x3: /* Add HRd, HRs */ - SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + GET_REGISTER(cpustate, rs+8)); - // emulate the effects of pre-fetch - if (rs == 7) - { - SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + 4); - } - if (rd == 7) - { - R15 += 2; - } - break; - default: - fatalerror("%08x: G4-1-0 Undefined Thumb instruction: %04x %x\n", pc, insn, (insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT); - break; - } - R15 += 2; - break; - case 0x1: /* CMP */ - switch ((insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT) - { - case 0x0: /* CMP Rd, Rs */ - rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT)); - rd = GET_REGISTER(cpustate, insn & THUMB_HIREG_RD); - rn = rd - rs; - HandleThumbALUSubFlags(rn, rd, rs); - break; - case 0x1: /* CMP Rd, Hs */ - rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); - rd = GET_REGISTER(cpustate, insn & THUMB_HIREG_RD); - rn = rd - rs; - HandleThumbALUSubFlags(rn, rd, rs); - break; - case 0x2: /* CMP Hd, Rs */ - rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT)); - rd = GET_REGISTER(cpustate, (insn & THUMB_HIREG_RD) + 8); - rn = rd - rs; - HandleThumbALUSubFlags(rn, rd, rs); - break; - case 0x3: /* CMP Hd, Hs */ - rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); - rd = GET_REGISTER(cpustate, (insn & THUMB_HIREG_RD) + 8); - rn = rd - rs; - HandleThumbALUSubFlags(rn, rd, rs); - break; - default: - fatalerror("%08x: G4-1 Undefined Thumb instruction: %04x %x\n", pc, insn, (insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT); - R15 += 2; - break; - } - break; - case 0x2: /* MOV */ - switch ((insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT) - { - case 0x0: // MOV Rd, Rs (undefined) - // "The action of H1 = 0, H2 = 0 for Op = 00 (ADD), Op = 01 (CMP) and Op = 10 (MOV) is undefined, and should not be used." - rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - rd = insn & THUMB_HIREG_RD; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs)); - R15 += 2; - break; - case 0x1: // MOV Rd, Hs - rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - rd = insn & THUMB_HIREG_RD; - if (rs == 7) - { - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs + 8) + 4); - } - else - { - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs + 8)); - } - R15 += 2; - break; - case 0x2: // MOV Hd, Rs - rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - rd = insn & THUMB_HIREG_RD; - SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs)); - if (rd != 7) - { - R15 += 2; - } - else - { - R15 &= ~1; - } - break; - case 0x3: // MOV Hd, Hs - rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - rd = insn & THUMB_HIREG_RD; - if (rs == 7) - { - SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs+8)+4); - } - else - { - SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs+8)); - } - if (rd != 7) - { - R15 += 2; - } - if (rd == 7) - { - R15 &= ~1; - } - break; - default: - fatalerror("%08x: G4-2 Undefined Thumb instruction: %04x (%x)\n", pc, insn, (insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT); - R15 += 2; - break; - } - break; - case 0x3: - switch ((insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT) - { - case 0x0: - rd = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; - addr = GET_REGISTER(cpustate, rd); - if (addr & 1) - { - addr &= ~1; - } - else - { - SET_CPSR(GET_CPSR & ~T_MASK); - if (addr & 2) - { - addr += 2; - } - } - R15 = addr; - break; - case 0x1: - addr = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); - if ((((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8) == 15) - { - addr += 2; - } - if (addr & 1) - { - addr &= ~1; - } - else - { - SET_CPSR(GET_CPSR & ~T_MASK); - if (addr & 2) - { - addr += 2; - } - } - R15 = addr; - break; - default: - fatalerror("%08x: G4-3 Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - break; - default: - fatalerror("%08x: G4-x Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - break; - case 0x2: - case 0x3: - readword = READ32((R15 & ~2) + 4 + ((insn & THUMB_INSN_IMM) << 2)); - SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, readword); - R15 += 2; - break; - default: - fatalerror("%08x: G4-y Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - break; - case 0x5: /* LDR* STR* */ - switch ((insn & THUMB_GROUP5_TYPE) >> THUMB_GROUP5_TYPE_SHIFT) - { - case 0x0: /* STR Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - WRITE32(addr, GET_REGISTER(cpustate, rd)); - R15 += 2; - break; - case 0x1: /* STRH Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - WRITE16(addr, GET_REGISTER(cpustate, rd)); - R15 += 2; - break; - case 0x2: /* STRB Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - WRITE8(addr, GET_REGISTER(cpustate, rd)); - R15 += 2; - break; - case 0x3: /* LDSB Rd, [Rn, Rm] todo, add dasm */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - op2 = READ8(addr); - if (op2 & 0x00000080) - { - op2 |= 0xffffff00; - } - SET_REGISTER(cpustate, rd, op2); - R15 += 2; - break; - case 0x4: /* LDR Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - op2 = READ32(addr); - SET_REGISTER(cpustate, rd, op2); - R15 += 2; - break; - case 0x5: /* LDRH Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - op2 = READ16(addr); - SET_REGISTER(cpustate, rd, op2); - R15 += 2; - break; - case 0x6: /* LDRB Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - op2 = READ8(addr); - SET_REGISTER(cpustate, rd, op2); - R15 += 2; - break; - case 0x7: /* LDSH Rd, [Rn, Rm] */ - rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; - rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; - rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; - addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); - op2 = READ16(addr); - if (op2 & 0x00008000) - { - op2 |= 0xffff0000; - } - SET_REGISTER(cpustate, rd, op2); - R15 += 2; - break; - default: - fatalerror("%08x: G5 Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - break; - case 0x6: /* Word Store w/ Immediate Offset */ - if (insn & THUMB_LSOP_L) /* Load */ - { - rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = insn & THUMB_ADDSUB_RD; - offs = ((insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT) << 2; - SET_REGISTER(cpustate, rd, READ32(GET_REGISTER(cpustate, rn) + offs)); // fix - R15 += 2; - } - else /* Store */ - { - rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = insn & THUMB_ADDSUB_RD; - offs = ((insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT) << 2; - WRITE32(GET_REGISTER(cpustate, rn) + offs, GET_REGISTER(cpustate, rd)); - R15 += 2; - } - break; - case 0x7: /* Byte Store w/ Immeidate Offset */ - if (insn & THUMB_LSOP_L) /* Load */ - { - rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = insn & THUMB_ADDSUB_RD; - offs = (insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT; - SET_REGISTER(cpustate, rd, READ8(GET_REGISTER(cpustate, rn) + offs)); - R15 += 2; - } - else /* Store */ - { - rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = insn & THUMB_ADDSUB_RD; - offs = (insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT; - WRITE8(GET_REGISTER(cpustate, rn) + offs, GET_REGISTER(cpustate, rd)); - R15 += 2; - } - break; - case 0x8: /* Load/Store Halfword */ - if (insn & THUMB_HALFOP_L) /* Load */ - { - imm = (insn & THUMB_HALFOP_OFFS) >> THUMB_HALFOP_OFFS_SHIFT; - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - SET_REGISTER(cpustate, rd, READ16(GET_REGISTER(cpustate, rs) + (imm << 1))); - R15 += 2; - } - else /* Store */ - { - imm = (insn & THUMB_HALFOP_OFFS) >> THUMB_HALFOP_OFFS_SHIFT; - rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; - rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; - WRITE16(GET_REGISTER(cpustate, rs) + (imm << 1), GET_REGISTER(cpustate, rd)); - R15 += 2; - } - break; - case 0x9: /* Stack-Relative Load/Store */ - if (insn & THUMB_STACKOP_L) - { - rd = (insn & THUMB_STACKOP_RD) >> THUMB_STACKOP_RD_SHIFT; - offs = (UINT8)(insn & THUMB_INSN_IMM); - readword = READ32(GET_REGISTER(cpustate, 13) + ((UINT32)offs << 2)); - SET_REGISTER(cpustate, rd, readword); - R15 += 2; - } - else - { - rd = (insn & THUMB_STACKOP_RD) >> THUMB_STACKOP_RD_SHIFT; - offs = (UINT8)(insn & THUMB_INSN_IMM); - WRITE32(GET_REGISTER(cpustate, 13) + ((UINT32)offs << 2), GET_REGISTER(cpustate, rd)); - R15 += 2; - } - break; - case 0xa: /* Get relative address */ - if (insn & THUMB_RELADDR_SP) /* ADD Rd, SP, #nn */ - { - rd = (insn & THUMB_RELADDR_RD) >> THUMB_RELADDR_RD_SHIFT; - offs = (UINT8)(insn & THUMB_INSN_IMM) << 2; - SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, 13) + offs); - R15 += 2; - } - else /* ADD Rd, PC, #nn */ - { - rd = (insn & THUMB_RELADDR_RD) >> THUMB_RELADDR_RD_SHIFT; - offs = (UINT8)(insn & THUMB_INSN_IMM) << 2; - SET_REGISTER(cpustate, rd, ((R15 + 4) & ~2) + offs); - R15 += 2; - } - break; - case 0xb: /* Stack-Related Opcodes */ - switch ((insn & THUMB_STACKOP_TYPE) >> THUMB_STACKOP_TYPE_SHIFT) - { - case 0x0: /* ADD SP, #imm */ - addr = (insn & THUMB_INSN_IMM); - addr &= ~THUMB_INSN_IMM_S; - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + ((insn & THUMB_INSN_IMM_S) ? -(addr << 2) : (addr << 2))); - R15 += 2; - break; - case 0x4: /* PUSH {Rlist} */ - for (offs = 7; offs >= 0; offs--) - { - if (insn & (1 << offs)) - { - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); - WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, offs)); - } - } - R15 += 2; - break; - case 0x5: /* PUSH {Rlist}{LR} */ - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); - WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, 14)); - for (offs = 7; offs >= 0; offs--) - { - if (insn & (1 << offs)) - { - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); - WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, offs)); - } - } - R15 += 2; - break; - case 0xc: /* POP {Rlist} */ - for (offs = 0; offs < 8; offs++) - { - if (insn & (1 << offs)) - { - SET_REGISTER(cpustate, offs, READ32(GET_REGISTER(cpustate, 13))); - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); - } - } - R15 += 2; - break; - case 0xd: /* POP {Rlist}{PC} */ - for (offs = 0; offs < 8; offs++) - { - if (insn & (1 << offs)) - { - SET_REGISTER(cpustate, offs, READ32(GET_REGISTER(cpustate, 13))); - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); - } - } - R15 = READ32(GET_REGISTER(cpustate, 13)) & ~1; - SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); - break; - default: - fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - break; - case 0xc: /* Multiple Load/Store */ - { - UINT32 ld_st_address; - - rd = (insn & THUMB_MULTLS_BASE) >> THUMB_MULTLS_BASE_SHIFT; - - // "The address should normally be a word aligned quantity and non-word aligned addresses do not affect the instruction." - // "However, the bottom 2 bits of the address will appear on A[1:0] and might be interpreted by the memory system." - - // GBA "BB Ball" performs an unaligned read with A[1:0] = 2 and expects A[1] not to be ignored [BP 800B90A,(R4&3)!=0] - // GBA "Gadget Racers" performs an unaligned read with A[1:0] = 1 and expects A[0] to be ignored [BP B72,(R0&3)!=0] - - ld_st_address = GET_REGISTER(cpustate, rd); - - if (insn & THUMB_MULTLS) /* Load */ - { - int rd_in_list; - - rd_in_list = insn & (1 << rd); - for (offs = 0; offs < 8; offs++) - { - if (insn & (1 << offs)) - { - SET_REGISTER(cpustate, offs, READ32(ld_st_address & ~1)); - ld_st_address += 4; - } - } - if (!rd_in_list) - SET_REGISTER(cpustate, rd, ld_st_address); - R15 += 2; - } - else /* Store */ - { - for (offs = 0; offs < 8; offs++) - { - if (insn & (1 << offs)) - { - WRITE32(ld_st_address & ~3, GET_REGISTER(cpustate, offs)); - ld_st_address += 4; - } - } - SET_REGISTER(cpustate, rd, ld_st_address); - R15 += 2; - } - } - break; - case 0xd: /* Conditional Branch */ - offs = (INT8)(insn & THUMB_INSN_IMM); - switch ((insn & THUMB_COND_TYPE) >> THUMB_COND_TYPE_SHIFT) - { - case COND_EQ: - if (Z_IS_SET(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_NE: - if (Z_IS_CLEAR(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_CS: - if (C_IS_SET(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_CC: - if (C_IS_CLEAR(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_MI: - if (N_IS_SET(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_PL: - if (N_IS_CLEAR(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_VS: - if (V_IS_SET(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_VC: - if (V_IS_CLEAR(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_HI: - if (C_IS_SET(GET_CPSR) && Z_IS_CLEAR(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_LS: - if (C_IS_CLEAR(GET_CPSR) || Z_IS_SET(GET_CPSR)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_GE: - if (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_LT: - if (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_GT: - if (Z_IS_CLEAR(GET_CPSR) && !(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_LE: - if (Z_IS_SET(GET_CPSR) || !(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) - { - R15 += 4 + (offs << 1); - } - else - { - R15 += 2; - } - break; - case COND_AL: - fatalerror("%08x: Undefined Thumb instruction: %04x (ARM9 reserved)\n", pc, insn); - R15 += 2; - break; - case COND_NV: // SWI (this is sort of a "hole" in the opcode encoding) - cpustate->pendingSwi = 1; - ARM7_CHECKIRQ; - break; - } - break; - case 0xe: /* B #offs */ - if (insn & THUMB_BLOP_LO) - { - addr = GET_REGISTER(cpustate, 14); - addr += (insn & THUMB_BLOP_OFFS) << 1; - addr &= 0xfffffffc; - SET_REGISTER(cpustate, 14, (R15 + 4) | 1); - R15 = addr; - } - else - { - offs = (insn & THUMB_BRANCH_OFFS) << 1; - if (offs & 0x00000800) - { - offs |= 0xfffff800; - } - R15 += 4 + offs; - } - break; - case 0xf: /* BL */ - if (insn & THUMB_BLOP_LO) - { - addr = GET_REGISTER(cpustate, 14) & ~1; - addr += (insn & THUMB_BLOP_OFFS) << 1; - SET_REGISTER(cpustate, 14, (R15 + 2) | 1); - R15 = addr; - //R15 += 2; - } - else - { - addr = (insn & THUMB_BLOP_OFFS) << 12; - if (addr & (1 << 22)) - { - addr |= 0xff800000; - } - addr += R15 + 4; - SET_REGISTER(cpustate, 14, addr); - R15 += 2; - } - break; - default: - fatalerror("%08x: Undefined Thumb instruction: %04x\n", pc, insn); - R15 += 2; - break; - } - } - else - { - UINT32 raddr; - - /* load 32 bit instruction */ - pc = GET_PC; - - // "In ARM state, bits [1:0] of r15 are undefined and must be ignored. Bits [31:2] contain the PC." - raddr = pc & (~3); - - if ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) - { - raddr = arm7_tlb_translate(cpustate, raddr, ARM7_TLB_ABORT_P); - if (cpustate->pendingAbtP != 0) - { - goto skip_exec; - } - } - -#if 0 - if (MODE26) - { - UINT32 temp1, temp2; - temp1 = GET_CPSR & 0xF00000C3; - temp2 = (R15 & 0xF0000000) | ((R15 & 0x0C000000) >> (26 - 6)) | (R15 & 0x00000003); - if (temp1 != temp2) fatalerror( "%08X: 32-bit and 26-bit modes are out of sync (%08X %08X)", pc, temp1, temp2); - } -#endif - - insn = cpustate->direct->read_decrypted_dword(raddr); - - /* process condition codes for this instruction */ - switch (insn >> INSN_COND_SHIFT) - { - case COND_EQ: - if (Z_IS_CLEAR(GET_CPSR)) - goto L_Next; - break; - case COND_NE: - if (Z_IS_SET(GET_CPSR)) - goto L_Next; - break; - case COND_CS: - if (C_IS_CLEAR(GET_CPSR)) - goto L_Next; - break; - case COND_CC: - if (C_IS_SET(GET_CPSR)) - goto L_Next; - break; - case COND_MI: - if (N_IS_CLEAR(GET_CPSR)) - goto L_Next; - break; - case COND_PL: - if (N_IS_SET(GET_CPSR)) - goto L_Next; - break; - case COND_VS: - if (V_IS_CLEAR(GET_CPSR)) - goto L_Next; - break; - case COND_VC: - if (V_IS_SET(GET_CPSR)) - goto L_Next; - break; - case COND_HI: - if (C_IS_CLEAR(GET_CPSR) || Z_IS_SET(GET_CPSR)) - goto L_Next; - break; - case COND_LS: - if (C_IS_SET(GET_CPSR) && Z_IS_CLEAR(GET_CPSR)) - goto L_Next; - break; - case COND_GE: - if (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) /* Use x ^ (x >> ...) method */ - goto L_Next; - break; - case COND_LT: - if (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) - goto L_Next; - break; - case COND_GT: - if (Z_IS_SET(GET_CPSR) || (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK))) - goto L_Next; - break; - case COND_LE: - if (Z_IS_CLEAR(GET_CPSR) && (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK))) - goto L_Next; - break; - case COND_NV: - goto L_Next; - } - /*******************************************************************/ - /* If we got here - condition satisfied, so decode the instruction */ - /*******************************************************************/ - switch ((insn & 0xF000000) >> 24) - { - case 0: - case 1: - case 2: - case 3: - /* Branch and Exchange (BX) */ - if ((insn & 0x0ffffff0) == 0x012fff10) // bits 27-4 == 000100101111111111110001 - { - R15 = GET_REGISTER(cpustate, insn & 0x0f); - // If new PC address has A0 set, switch to Thumb mode - if (R15 & 1) { - SET_CPSR(GET_CPSR|T_MASK); - R15--; - } - } - else if ((insn & 0x0ff000f0) == 0x01600010) // CLZ - v5 - { - UINT32 rm = insn&0xf; - UINT32 rd = (insn>>12)&0xf; - - SET_REGISTER(cpustate, rd, count_leading_zeros(GET_REGISTER(cpustate, rm))); - - R15 += 4; - } - else if ((insn & 0x0ff000f0) == 0x01000050) // QADD - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); - INT64 res; - - res = saturate_qbit_overflow(cpustate, (INT64)src1 + (INT64)src2); - - SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); - R15 += 4; - } - else if ((insn & 0x0ff000f0) == 0x01400050) // QDADD - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); - INT64 res; - - // check if doubling operation will overflow - res = (INT64)src2 * 2; - saturate_qbit_overflow(cpustate, res); - - src2 *= 2; - res = saturate_qbit_overflow(cpustate, (INT64)src1 + (INT64)src2); - - SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); - R15 += 4; - } - else if ((insn & 0x0ff000f0) == 0x01200050) // QSUB - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); - INT64 res; - - res = saturate_qbit_overflow(cpustate, (INT64)src1 - (INT64)src2); - - SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); - R15 += 4; - } - else if ((insn & 0x0ff000f0) == 0x01600050) // QDSUB - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); - INT64 res; - - // check if doubling operation will overflow - res = (INT64)src2 * 2; - saturate_qbit_overflow(cpustate, res); - - src2 *= 2; - res = saturate_qbit_overflow(cpustate, (INT64)src1 - (INT64)src2); - - SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); - R15 += 4; - } - else if ((insn & 0x0ff00090) == 0x01000080) // SMLAxy - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); - INT32 res1; - - // select top and bottom halves of src1/src2 and sign extend if necessary - if (insn & 0x20) - { - src1 >>= 16; - } - else - { - src1 &= 0xffff; - if (src1 & 0x8000) - { - src1 |= 0xffff; - } - } - - if (insn & 0x40) - { - src2 >>= 16; - } - else - { - src2 &= 0xffff; - if (src2 & 0x8000) - { - src2 |= 0xffff; - } - } - - // do the signed multiply - res1 = src1 * src2; - // and the accumulate. NOTE: only the accumulate can cause an overflow, which is why we do it this way. - saturate_qbit_overflow(cpustate, (INT64)res1 + (INT64)GET_REGISTER(cpustate, (insn>>12)&0xf)); - - SET_REGISTER(cpustate, (insn>>16)&0xf, res1 + GET_REGISTER(cpustate, (insn>>12)&0xf)); - R15 += 4; - } - else if ((insn & 0x0ff00090) == 0x01400080) // SMLALxy - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); - INT64 dst; - - // select top and bottom halves of src1/src2 and sign extend if necessary - if (insn & 0x20) - { - src1 >>= 16; - } - else - { - src1 &= 0xffff; - if (src1 & 0x8000) - { - src1 |= 0xffff; - } - } - - if (insn & 0x40) - { - src2 >>= 16; - } - else - { - src2 &= 0xffff; - if (src2 & 0x8000) - { - src2 |= 0xffff; - } - } - - dst = (INT64)GET_REGISTER(cpustate, (insn>>12)&0xf); - dst |= (INT64)GET_REGISTER(cpustate, (insn>>16)&0xf)<<32; - - // do the multiply and accumulate - dst += (INT64)src1 * (INT64)src2; - - // write back the result - SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)(dst&0xffffffff)); - SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst>>32)); - } - else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); - INT32 res; - - // select top and bottom halves of src1/src2 and sign extend if necessary - if (insn & 0x20) - { - src1 >>= 16; - } - else - { - src1 &= 0xffff; - if (src1 & 0x8000) - { - src1 |= 0xffff; - } - } - - if (insn & 0x40) - { - src2 >>= 16; - } - else - { - src2 &= 0xffff; - if (src2 & 0x8000) - { - src2 |= 0xffff; - } - } - - res = src1 * src2; - SET_REGISTER(cpustart, (insn>>16)&0xf, res); - } - else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); - INT64 res; - - if (insn & 0x40) - { - src2 >>= 16; - } - else - { - src2 &= 0xffff; - if (src2 & 0x8000) - { - src2 |= 0xffff; - } - } - - res = (INT64)src1 * (INT64)src2; - res >>= 16; - SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); - } - else if ((insn & 0x0ff000b0) == 0x01200080) // SMLAWy - v5 - { - INT32 src1 = GET_REGISTER(cpustate, insn&0xf); - INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); - INT32 src3 = GET_REGISTER(cpustate, (insn>>12)&0xf); - INT64 res; - - if (insn & 0x40) - { - src2 >>= 16; - } - else - { - src2 &= 0xffff; - if (src2 & 0x8000) - { - src2 |= 0xffff; - } - } - - res = (INT64)src1 * (INT64)src2; - res >>= 16; - - // check for overflow and set the Q bit - saturate_qbit_overflow(cpustate, (INT64)src3 + res); - - // do the real accumulate - src3 += (INT32)res; - - // write the result back - SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); - } - else - /* Multiply OR Swap OR Half Word Data Transfer */ - if ((insn & 0x0e000000) == 0 && (insn & 0x80) && (insn & 0x10)) // bits 27-25=000 bit 7=1 bit 4=1 - { - /* Half Word Data Transfer */ - if (insn & 0x60) // bits = 6-5 != 00 - { - HandleHalfWordDT(cpustate, insn); - } - else - /* Swap */ - if (insn & 0x01000000) // bit 24 = 1 - { - HandleSwap(cpustate, insn); - } - /* Multiply Or Multiply Long */ - else - { - /* multiply long */ - if (insn & 0x800000) // Bit 23 = 1 for Multiply Long - { - /* Signed? */ - if (insn & 0x00400000) - HandleSMulLong(cpustate, insn); - else - HandleUMulLong(cpustate, insn); - } - /* multiply */ - else - { - HandleMul(cpustate, insn); - } - R15 += 4; - } - } - else - /* Data Processing OR PSR Transfer */ - if ((insn & 0x0c000000) == 0) // bits 27-26 == 00 - This check can only exist properly after Multiplication check above - { - /* PSR Transfer (MRS & MSR) */ - if (((insn & 0x00100000) == 0) && ((insn & 0x01800000) == 0x01000000)) // S bit must be clear, and bit 24,23 = 10 - { - HandlePSRTransfer(cpustate, insn); - ARM7_ICOUNT += 2; // PSR only takes 1 - S Cycle, so we add + 2, since at end, we -3.. - R15 += 4; - } - /* Data Processing */ - else - { - HandleALU(cpustate, insn); - } - } - break; - /* Data Transfer - Single Data Access */ - case 4: - case 5: - case 6: - case 7: - HandleMemSingle(cpustate, insn); - R15 += 4; - break; - /* Block Data Transfer/Access */ - case 8: - case 9: - HandleMemBlock(cpustate, insn); - R15 += 4; - break; - /* Branch or Branch & Link */ - case 0xa: - case 0xb: - HandleBranch(cpustate, insn); - break; - /* Co-Processor Data Transfer */ - case 0xc: - case 0xd: - HandleCoProcDT(cpustate, insn); - R15 += 4; - break; - /* Co-Processor Data Operation or Register Transfer */ - case 0xe: - if (insn & 0x10) - HandleCoProcRT(cpustate, insn); - else - HandleCoProcDO(cpustate, insn); - R15 += 4; - break; - /* Software Interrupt */ - case 0x0f: - cpustate->pendingSwi = 1; - ARM7_CHECKIRQ; - //couldn't find any cycle counts for SWI - break; - /* Undefined */ - default: - cpustate->pendingSwi = 1; - ARM7_CHECKIRQ; - ARM7_ICOUNT -= 1; //undefined takes 4 cycles (page 77) - LOG(("%08x: Undefined instruction\n",pc-4)); - L_Next: - R15 += 4; - ARM7_ICOUNT +=2; //Any unexecuted instruction only takes 1 cycle (page 193) - } - } - -skip_exec: - - ARM7_CHECKIRQ; - - /* All instructions remove 3 cycles.. Others taking less / more will have adjusted this # prior to here */ - ARM7_ICOUNT -= 3; - } while (ARM7_ICOUNT > 0); -} diff -Nru mame-0.144/src/emu/cpu/arm7/arm7help.h mame-0.145/src/emu/cpu/arm7/arm7help.h --- mame-0.144/src/emu/cpu/arm7/arm7help.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7help.h 2012-02-06 21:30:23.000000000 +0000 @@ -0,0 +1,242 @@ +/* ARM7 core helper Macros / Functions */ + +/* Macros that need to be defined according to the cpu implementation specific need */ +#define ARM7REG(reg) cpustate->sArmRegister[reg] +#define ARM7_ICOUNT cpustate->iCount + + +extern void SwitchMode(arm_state *cpustate, int cpsr_mode_val); + +#if 0 +#define LOG(x) mame_printf_debug x +#else +#define LOG(x) logerror x +#endif + +/*************** + * helper funcs + ***************/ + +// TODO LD: +// - SIGN_BITS_DIFFER = THUMB_SIGN_BITS_DIFFER +// - do while (0) +// - HandleALUAddFlags = HandleThumbALUAddFlags except for PC incr +// - HandleALUSubFlags = HandleThumbALUSubFlags except for PC incr + +#define IsNeg(i) ((i) >> 31) +#define IsPos(i) ((~(i)) >> 31) + +/* Set NZCV flags for ADDS / SUBS */ +#define HandleALUAddFlags(rd, rn, op2) \ + if (insn & INSN_S) \ + SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ + | (((!SIGN_BITS_DIFFER(rn, op2)) && SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ + | (((IsNeg(rn) & IsNeg(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsNeg(op2) & IsPos(rd))) ? C_MASK : 0) \ + | HandleALUNZFlags(rd))); \ + R15 += 4; + +#define HandleThumbALUAddFlags(rd, rn, op2) \ + SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ + | (((!THUMB_SIGN_BITS_DIFFER(rn, op2)) && THUMB_SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ + | (((~(rn)) < (op2)) << C_BIT) \ + | HandleALUNZFlags(rd))); \ + R15 += 2; + +#define HandleALUSubFlags(rd, rn, op2) \ + if (insn & INSN_S) \ + SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ + | ((SIGN_BITS_DIFFER(rn, op2) && SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ + | (((IsNeg(rn) & IsPos(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsPos(op2) & IsPos(rd))) ? C_MASK : 0) \ + | HandleALUNZFlags(rd))); \ + R15 += 4; + +#define HandleThumbALUSubFlags(rd, rn, op2) \ + SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | V_MASK | C_MASK)) \ + | ((THUMB_SIGN_BITS_DIFFER(rn, op2) && THUMB_SIGN_BITS_DIFFER(rn, rd)) << V_BIT) \ + | (((IsNeg(rn) & IsPos(op2)) | (IsNeg(rn) & IsPos(rd)) | (IsPos(op2) & IsPos(rd))) ? C_MASK : 0) \ + | HandleALUNZFlags(rd))); \ + R15 += 2; + +/* Set NZC flags for logical operations. */ + +// This macro (which I didn't write) - doesn't make it obvious that the SIGN BIT = 31, just as the N Bit does, +// therefore, N is set by default +#define HandleALUNZFlags(rd) \ + (((rd) & SIGN_BIT) | ((!(rd)) << Z_BIT)) + + +// Long ALU Functions use bit 63 +#define HandleLongALUNZFlags(rd) \ + ((((rd) & ((UINT64)1 << 63)) >> 32) | ((!(rd)) << Z_BIT)) + +#define HandleALULogicalFlags(rd, sc) \ + if (insn & INSN_S) \ + SET_CPSR(((GET_CPSR & ~(N_MASK | Z_MASK | C_MASK)) \ + | HandleALUNZFlags(rd) \ + | (((sc) != 0) << C_BIT))); \ + R15 += 4; + +void set_cpsr( arm_state *cpustate, UINT32 val); + +// used to be functions, but no longer a need, so we'll use define for better speed. +#define GetRegister(cpustate, rIndex) ARM7REG(sRegisterTable[GET_MODE][rIndex]) +#define SetRegister(cpustate, rIndex, value) ARM7REG(sRegisterTable[GET_MODE][rIndex]) = value + +#define GetModeRegister(cpustate, mode, rIndex) ARM7REG(sRegisterTable[mode][rIndex]) +#define SetModeRegister(cpustate, mode, rIndex, value) ARM7REG(sRegisterTable[mode][rIndex]) = value + +int arm7_tlb_translate(arm_state *cpustate, UINT32 *addr, int flags); +void arm7_check_irq_state(arm_state *cpustate); + +typedef const void (*arm7thumb_ophandler)(arm_state*, UINT32, UINT32); + +extern arm7thumb_ophandler thumb_handler[0x40*0x10]; + +typedef const void (*arm7ops_ophandler)(arm_state*, UINT32); + +extern arm7ops_ophandler ops_handler[0x10]; + +extern void (*arm7_coproc_dt_r_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, UINT32 (*read32)(arm_state *cpustate, UINT32 addr)); +extern void (*arm7_coproc_dt_w_callback)(arm_state *cpustate, UINT32 insn, UINT32 *prn, void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data)); + + +/*************************************************************************** + * Default Memory Handlers + ***************************************************************************/ +INLINE void arm7_cpu_write32(arm_state *cpustate, UINT32 addr, UINT32 data) +{ + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_WRITE )) + { + return; + } + } + + addr &= ~3; + if ( cpustate->endian == ENDIANNESS_BIG ) + cpustate->program->write_dword(addr, data); + else + cpustate->program->write_dword(addr, data); +} + + +INLINE void arm7_cpu_write16(arm_state *cpustate, UINT32 addr, UINT16 data) +{ + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_WRITE )) + { + return; + } + } + + addr &= ~1; + if ( cpustate->endian == ENDIANNESS_BIG ) + cpustate->program->write_word(addr, data); + else + cpustate->program->write_word(addr, data); +} + +INLINE void arm7_cpu_write8(arm_state *cpustate, UINT32 addr, UINT8 data) +{ + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_WRITE )) + { + return; + } + } + + if ( cpustate->endian == ENDIANNESS_BIG ) + cpustate->program->write_byte(addr, data); + else + cpustate->program->write_byte(addr, data); +} + +INLINE UINT32 arm7_cpu_read32(arm_state *cpustate, UINT32 addr) +{ + UINT32 result; + + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_READ )) + { + return 0; + } + } + + if (addr & 3) + { + if ( cpustate->endian == ENDIANNESS_BIG ) + result = cpustate->program->read_dword(addr & ~3); + else + result = cpustate->program->read_dword(addr & ~3); + result = (result >> (8 * (addr & 3))) | (result << (32 - (8 * (addr & 3)))); + } + else + { + if ( cpustate->endian == ENDIANNESS_BIG ) + result = cpustate->program->read_dword(addr); + else + result = cpustate->program->read_dword(addr); + } + + return result; +} + +INLINE UINT16 arm7_cpu_read16(arm_state *cpustate, UINT32 addr) +{ + UINT16 result; + + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_READ )) + { + return 0; + } + } + + if ( cpustate->endian == ENDIANNESS_BIG ) + result = cpustate->program->read_word(addr & ~1); + else + result = cpustate->program->read_word(addr & ~1); + + if (addr & 1) + { + result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); + } + + return result; +} + +INLINE UINT8 arm7_cpu_read8(arm_state *cpustate, UINT32 addr) +{ + if( COPRO_CTRL & COPRO_CTRL_MMU_EN ) + { + if (!arm7_tlb_translate( cpustate, &addr, ARM7_TLB_ABORT_D | ARM7_TLB_READ )) + { + return 0; + } + } + + // Handle through normal 8 bit handler (for 32 bit cpu) + if ( cpustate->endian == ENDIANNESS_BIG ) + return cpustate->program->read_byte(addr); + else + return cpustate->program->read_byte(addr); +} + + +/* Macros that can be re-defined for custom cpu implementations - The core expects these to be defined */ +/* In this case, we are using the default arm7 handlers (supplied by the core) + - but simply changes these and define your own if needed for cpu implementation specific needs */ +#define READ8(addr) arm7_cpu_read8(cpustate, addr) +#define WRITE8(addr,data) arm7_cpu_write8(cpustate, addr,data) +#define READ16(addr) arm7_cpu_read16(cpustate, addr) +#define WRITE16(addr,data) arm7_cpu_write16(cpustate, addr,data) +#define READ32(addr) arm7_cpu_read32(cpustate, addr) +#define WRITE32(addr,data) arm7_cpu_write32(cpustate, addr,data) +#define PTR_READ32 &arm7_cpu_read32 +#define PTR_WRITE32 &arm7_cpu_write32 + diff -Nru mame-0.144/src/emu/cpu/arm7/arm7ops.c mame-0.145/src/emu/cpu/arm7/arm7ops.c --- mame-0.144/src/emu/cpu/arm7/arm7ops.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7ops.c 2012-02-06 21:30:23.000000000 +0000 @@ -0,0 +1,1900 @@ +#include "emu.h" +#include "arm7core.h" +#include "arm7ops.h" +#include "arm7help.h" + +INLINE INT64 saturate_qbit_overflow(arm_state *cpustate, INT64 res) +{ + if (res > 2147483647) // INT32_MAX + { // overflow high? saturate and set Q + res = 2147483647; + SET_CPSR(GET_CPSR | Q_MASK); + } + else if (res < (-2147483647-1)) // INT32_MIN + { // overflow low? saturate and set Q + res = (-2147483647-1); + SET_CPSR(GET_CPSR | Q_MASK); + } + + return res; +} + +// I could prob. convert to macro, but Switchmode shouldn't occur that often in emulated code.. +void SwitchMode(arm_state *cpustate, int cpsr_mode_val) +{ + UINT32 cspr = GET_CPSR & ~MODE_FLAG; + SET_CPSR(cspr | cpsr_mode_val); +} + + +/* Decodes an Op2-style shifted-register form. If @carry@ is non-zero the + * shifter carry output will manifest itself as @*carry == 0@ for carry clear + * and @*carry != 0@ for carry set. + + SJE: Rules: + IF RC = 256, Result = no shift. + LSL 0 = Result = RM, Carry = Old Contents of CPSR C Bit + LSL(0,31) = Result shifted, least significant bit is in carry out + LSL 32 = Result of 0, Carry = Bit 0 of RM + LSL >32 = Result of 0, Carry out 0 + LSR 0 = LSR 32 (see below) + LSR 32 = Result of 0, Carry = Bit 31 of RM + LSR >32 = Result of 0, Carry out 0 + ASR >=32 = ENTIRE Result = bit 31 of RM + ROR 32 = Result = RM, Carry = Bit 31 of RM + ROR >32 = Same result as ROR n-32 until amount in range of 1-32 then follow rules +*/ + +UINT32 decodeShift(arm_state *cpustate, UINT32 insn, UINT32 *pCarry) +{ + UINT32 k = (insn & INSN_OP2_SHIFT) >> INSN_OP2_SHIFT_SHIFT; // Bits 11-7 + UINT32 rm = GET_REGISTER(cpustate, insn & INSN_OP2_RM); + UINT32 t = (insn & INSN_OP2_SHIFT_TYPE) >> INSN_OP2_SHIFT_TYPE_SHIFT; + + if ((insn & INSN_OP2_RM) == 0xf) { + // "If a register is used to specify the shift amount the PC will be 12 bytes ahead." (instead of 8) + rm += t & 1 ? 12 : 8; + } + + /* All shift types ending in 1 are Rk, not #k */ + if (t & 1) + { +// LOG(("%08x: RegShift %02x %02x\n", R15, k >> 1, GET_REGISTER(cpustate, k >> 1))); +#if ARM7_DEBUG_CORE + if ((insn & 0x80) == 0x80) + LOG(("%08x: RegShift ERROR (p36)\n", R15)); +#endif + + // see p35 for check on this + //k = GET_REGISTER(cpustate, k >> 1) & 0x1f; + + // Keep only the bottom 8 bits for a Register Shift + k = GET_REGISTER(cpustate, k >> 1) & 0xff; + + if (k == 0) /* Register shift by 0 is a no-op */ + { +// LOG(("%08x: NO-OP Regshift\n", R15)); + /* TODO this is wrong for at least ROR by reg with lower + * 5 bits 0 but lower 8 bits non zero */ + if (pCarry) + *pCarry = GET_CPSR & C_MASK; + return rm; + } + } + /* Decode the shift type and perform the shift */ + switch (t >> 1) + { + case 0: /* LSL */ + // LSL 32 = Result of 0, Carry = Bit 0 of RM + // LSL >32 = Result of 0, Carry out 0 + if (k >= 32) + { + if (pCarry) + *pCarry = (k == 32) ? rm & 1 : 0; + return 0; + } + else + { + if (pCarry) + { + // LSL 0 = Result = RM, Carry = Old Contents of CPSR C Bit + // LSL (0,31) = Result shifted, least significant bit is in carry out + *pCarry = k ? (rm & (1 << (32 - k))) : (GET_CPSR & C_MASK); + } + return k ? LSL(rm, k) : rm; + } + break; + + case 1: /* LSR */ + if (k == 0 || k == 32) + { + if (pCarry) + *pCarry = rm & SIGN_BIT; + return 0; + } + else if (k > 32) + { + if (pCarry) + *pCarry = 0; + return 0; + } + else + { + if (pCarry) + *pCarry = (rm & (1 << (k - 1))); + return LSR(rm, k); + } + break; + + case 2: /* ASR */ + if (k == 0 || k > 32) + k = 32; + + if (pCarry) + *pCarry = (rm & (1 << (k - 1))); + if (k >= 32) + return rm & SIGN_BIT ? 0xffffffffu : 0; + else + { + if (rm & SIGN_BIT) + return LSR(rm, k) | (0xffffffffu << (32 - k)); + else + return LSR(rm, k); + } + break; + + case 3: /* ROR and RRX */ + if (k) + { + while (k > 32) + k -= 32; + if (pCarry) + *pCarry = rm & (1 << (k - 1)); + return ROR(rm, k); + } + else + { + /* RRX */ + if (pCarry) + *pCarry = (rm & 1); + return LSR(rm, 1) | ((GET_CPSR & C_MASK) << 2); + } + break; + } + + LOG(("%08x: Decodeshift error\n", R15)); + return 0; +} /* decodeShift */ + + +static int loadInc(arm_state *cpustate, UINT32 pat, UINT32 rbv, UINT32 s, int mode) +{ + int i, result; + UINT32 data; + + result = 0; + rbv &= ~3; + for (i = 0; i < 16; i++) + { + if ((pat >> i) & 1) + { + if (cpustate->pendingAbtD == 0) // "Overwriting of registers stops when the abort happens." + { + data = READ32(rbv += 4); + if (i == 15) { + if (s) /* Pull full contents from stack */ + SET_MODE_REGISTER(cpustate, mode, 15, data); + else /* Pull only address, preserve mode & status flags */ + if (MODE32) + SET_MODE_REGISTER(cpustate, mode, 15, data); + else + { + SET_MODE_REGISTER(cpustate, mode, 15, (GET_MODE_REGISTER(cpustate, mode, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC)); + } + } else + SET_MODE_REGISTER(cpustate, mode, i, data); + } + result++; + } + } + return result; +} + +static int loadDec(arm_state *cpustate, UINT32 pat, UINT32 rbv, UINT32 s, int mode) +{ + int i, result; + UINT32 data; + + result = 0; + rbv &= ~3; + for (i = 15; i >= 0; i--) + { + if ((pat >> i) & 1) + { + if (cpustate->pendingAbtD == 0) // "Overwriting of registers stops when the abort happens." + { + data = READ32(rbv -= 4); + if (i == 15) { + if (s) /* Pull full contents from stack */ + SET_MODE_REGISTER(cpustate, mode, 15, data); + else /* Pull only address, preserve mode & status flags */ + if (MODE32) + SET_MODE_REGISTER(cpustate, mode, 15, data); + else + { + SET_MODE_REGISTER(cpustate, mode, 15, (GET_MODE_REGISTER(cpustate, mode, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC)); + } + } + else + SET_MODE_REGISTER(cpustate, mode, i, data); + } + result++; + } + } + return result; +} + +static int storeInc(arm_state *cpustate, UINT32 pat, UINT32 rbv, int mode) +{ + int i, result; + + result = 0; + for (i = 0; i < 16; i++) + { + if ((pat >> i) & 1) + { +#if ARM7_DEBUG_CORE + if (i == 15) /* R15 is plus 12 from address of STM */ + LOG(("%08x: StoreInc on R15\n", R15)); +#endif + WRITE32(rbv += 4, GET_MODE_REGISTER(cpustate, mode, i)); + result++; + } + } + return result; +} /* storeInc */ + +static int storeDec(arm_state *cpustate, UINT32 pat, UINT32 rbv, int mode) +{ + int i, result; + + result = 0; + for (i = 15; i >= 0; i--) + { + if ((pat >> i) & 1) + { +#if ARM7_DEBUG_CORE + if (i == 15) /* R15 is plus 12 from address of STM */ + LOG(("%08x: StoreDec on R15\n", R15)); +#endif + WRITE32(rbv -= 4, GET_MODE_REGISTER(cpustate, mode, i)); + result++; + } + } + return result; +} /* storeDec */ + +/*************************************************************************** + * OPCODE HANDLING + ***************************************************************************/ + +// Co-Processor Data Operation +static void HandleCoProcDO(arm_state *cpustate, UINT32 insn) +{ + // This instruction simply instructs the co-processor to do something, no data is returned to ARM7 core + if (arm7_coproc_do_callback) + arm7_coproc_do_callback(cpustate->device, insn, 0, 0); // simply pass entire opcode to callback - since data format is actually dependent on co-proc implementation + else + LOG(("%08x: Co-Processor Data Operation executed, but no callback defined!\n", R15)); +} + +// Co-Processor Register Transfer - To/From Arm to Co-Proc +static void HandleCoProcRT(arm_state *cpustate, UINT32 insn) +{ + + /* xxxx 1110 oooL nnnn dddd cccc ppp1 mmmm */ + + // Load (MRC) data from Co-Proc to ARM7 register + if (insn & 0x00100000) // Bit 20 = Load or Store + { + if (arm7_coproc_rt_r_callback) + { + UINT32 res = arm7_coproc_rt_r_callback(cpustate->device, insn, 0); // RT Read handler must parse opcode & return appropriate result + if (cpustate->pendingUnd == 0) + { + SET_REGISTER(cpustate, (insn >> 12) & 0xf, res); + } + } + else + LOG(("%08x: Co-Processor Register Transfer executed, but no RT Read callback defined!\n", R15)); + } + // Store (MCR) data from ARM7 to Co-Proc register + else + { + if (arm7_coproc_rt_w_callback) + arm7_coproc_rt_w_callback(cpustate->device, insn, GET_REGISTER(cpustate, (insn >> 12) & 0xf), 0); + else + LOG(("%08x: Co-Processor Register Transfer executed, but no RT Write callback defined!\n", R15)); + } +} + +/* Data Transfer - To/From Arm to Co-Proc + Loading or Storing, the co-proc function is responsible to read/write from the base register supplied + offset + 8 bit immediate value Base Offset address is << 2 to get the actual # + + issues - #1 - the co-proc function, needs direct access to memory reads or writes (ie, so we must send a pointer to a func) + - #2 - the co-proc may adjust the base address (especially if it reads more than 1 word), so a pointer to the register must be used + but the old value of the register must be restored if write back is not set.. + - #3 - when post incrementing is used, it's up to the co-proc func. to add the offset, since the transfer + address supplied in that case, is simply the base. I suppose this is irrelevant if write back not set + but if co-proc reads multiple address, it must handle the offset adjustment itself. +*/ +// todo: test with valid instructions +static void HandleCoProcDT(arm_state *cpustate, UINT32 insn) +{ + UINT32 rn = (insn >> 16) & 0xf; + UINT32 rnv = GET_REGISTER(cpustate, rn); // Get Address Value stored from Rn + UINT32 ornv = rnv; // Keep value of Rn + UINT32 off = (insn & 0xff) << 2; // Offset is << 2 according to manual + UINT32 *prn = &ARM7REG(rn); // Pointer to our register, so it can be changed in the callback + + // Pointers to read32/write32 functions + void (*write32)(arm_state *cpustate, UINT32 addr, UINT32 data); + UINT32 (*read32)(arm_state *cpustate, UINT32 addr); + write32 = PTR_WRITE32; + read32 = PTR_READ32; + +#if ARM7_DEBUG_CORE + if (((insn >> 16) & 0xf) == 15 && (insn & 0x200000)) + LOG(("%08x: Illegal use of R15 as base for write back value!\n", R15)); +#endif + + // Pre-Increment base address (IF POST INCREMENT - CALL BACK FUNCTION MUST DO IT) + if ((insn & 0x1000000) && off) + { + // Up - Down bit + if (insn & 0x800000) + rnv += off; + else + rnv -= off; + } + + // Load (LDC) data from ARM7 memory to Co-Proc memory + if (insn & 0x00100000) + { + if (arm7_coproc_dt_r_callback) + arm7_coproc_dt_r_callback(cpustate, insn, prn, read32); + else + LOG(("%08x: Co-Processer Data Transfer executed, but no READ callback defined!\n", R15)); + } + // Store (STC) data from Co-Proc to ARM7 memory + else + { + if (arm7_coproc_dt_w_callback) + arm7_coproc_dt_w_callback(cpustate, insn, prn, write32); + else + LOG(("%08x: Co-Processer Data Transfer executed, but no WRITE callback defined!\n", R15)); + } + + if (cpustate->pendingUnd != 0) return; + + // If writeback not used - ensure the original value of RN is restored in case co-proc callback changed value + if ((insn & 0x200000) == 0) + SET_REGISTER(cpustate, rn, ornv); +} + +INLINE void HandleBranch(arm_state *cpustate, UINT32 insn) +{ + UINT32 off = (insn & INSN_BRANCH) << 2; + + /* Save PC into LR if this is a branch with link */ + if (insn & INSN_BL) + { + SET_REGISTER(cpustate, 14, R15 + 4); + } + + /* Sign-extend the 24-bit offset in our calculations */ + if (off & 0x2000000u) + { + if (MODE32) + R15 -= ((~(off | 0xfc000000u)) + 1) - 8; + else + R15 = ((R15 - (((~(off | 0xfc000000u)) + 1) - 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC); + } + else + { + if (MODE32) + R15 += off + 8; + else + R15 = ((R15 + (off + 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC); + } +} + +static void HandleMemSingle(arm_state *cpustate, UINT32 insn) +{ + UINT32 rn, rnv, off, rd, rnv_old = 0; + + /* Fetch the offset */ + if (insn & INSN_I) + { + /* Register Shift */ + off = decodeShift(cpustate, insn, NULL); + } + else + { + /* Immediate Value */ + off = insn & INSN_SDT_IMM; + } + + /* Calculate Rn, accounting for PC */ + rn = (insn & INSN_RN) >> INSN_RN_SHIFT; + + if (insn & INSN_SDT_P) + { + /* Pre-indexed addressing */ + if (insn & INSN_SDT_U) + { + if ((MODE32) || (rn != eR15)) + rnv = (GET_REGISTER(cpustate, rn) + off); + else + rnv = (GET_PC + off); + } + else + { + if ((MODE32) || (rn != eR15)) + rnv = (GET_REGISTER(cpustate, rn) - off); + else + rnv = (GET_PC - off); + } + + if (insn & INSN_SDT_W) + { + rnv_old = GET_REGISTER(cpustate, rn); + SET_REGISTER(cpustate, rn, rnv); + + // check writeback??? + } + else if (rn == eR15) + { + rnv = rnv + 8; + } + } + else + { + /* Post-indexed addressing */ + if (rn == eR15) + { + if (MODE32) + rnv = R15 + 8; + else + rnv = GET_PC + 8; + } + else + { + rnv = GET_REGISTER(cpustate, rn); + } + } + + /* Do the transfer */ + rd = (insn & INSN_RD) >> INSN_RD_SHIFT; + if (insn & INSN_SDT_L) + { + /* Load */ + if (insn & INSN_SDT_B) + { + UINT32 data = READ8(rnv); + if (cpustate->pendingAbtD == 0) + { + SET_REGISTER(cpustate, rd, data); + } + } + else + { + UINT32 data = READ32(rnv); + if (cpustate->pendingAbtD == 0) + { + if (rd == eR15) + { + if (MODE32) + R15 = data - 4; + else + R15 = (R15 & ~0x03FFFFFC) /* N Z C V I F M1 M0 */ | ((data - 4) & 0x03FFFFFC); + // LDR, PC takes 2S + 2N + 1I (5 total cycles) + ARM7_ICOUNT -= 2; + } + else + { + SET_REGISTER(cpustate, rd, data); + } + } + } + } + else + { + /* Store */ + if (insn & INSN_SDT_B) + { +#if ARM7_DEBUG_CORE + if (rd == eR15) + LOG(("Wrote R15 in byte mode\n")); +#endif + + WRITE8(rnv, (UINT8) GET_REGISTER(cpustate, rd) & 0xffu); + } + else + { +#if ARM7_DEBUG_CORE + if (rd == eR15) + LOG(("Wrote R15 in 32bit mode\n")); +#endif + + //WRITE32(rnv, rd == eR15 ? R15 + 8 : GET_REGISTER(cpustate, rd)); + WRITE32(rnv, rd == eR15 ? R15 + 8 + 4 : GET_REGISTER(cpustate, rd)); // manual says STR rd = PC, +12 + } + // Store takes only 2 N Cycles, so add + 1 + ARM7_ICOUNT += 1; + } + + if (cpustate->pendingAbtD != 0) + { + if ((insn & INSN_SDT_P) && (insn & INSN_SDT_W)) + { + SET_REGISTER(cpustate, rn, rnv_old); + } + } + else + { + + /* Do post-indexing writeback */ + if (!(insn & INSN_SDT_P)/* && (insn & INSN_SDT_W)*/) + { + if (insn & INSN_SDT_U) + { + /* Writeback is applied in pipeline, before value is read from mem, + so writeback is effectively ignored */ + if (rd == rn) { + SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); + // todo: check for offs... ? + } + else { + + if ((insn & INSN_SDT_W) != 0) + LOG(("%08x: RegisterWritebackIncrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); + + SET_REGISTER(cpustate, rn, (rnv + off)); + } + } + else + { + /* Writeback is applied in pipeline, before value is read from mem, + so writeback is effectively ignored */ + if (rd == rn) { + SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); + } + else { + SET_REGISTER(cpustate, rn, (rnv - off)); + + if ((insn & INSN_SDT_W) != 0) + LOG(("%08x: RegisterWritebackDecrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); + } + } + } + + } + +// ARM7_CHECKIRQ + +} /* HandleMemSingle */ + +static void HandleHalfWordDT(arm_state *cpustate, UINT32 insn) +{ + UINT32 rn, rnv, off, rd, rnv_old = 0; + + // Immediate or Register Offset? + if (insn & 0x400000) { // Bit 22 - 1 = immediate, 0 = register + // imm. value in high nibble (bits 8-11) and lo nibble (bit 0-3) + off = (((insn >> 8) & 0x0f) << 4) | (insn & 0x0f); + } + else { + // register + off = GET_REGISTER(cpustate, insn & 0x0f); + } + + /* Calculate Rn, accounting for PC */ + rn = (insn & INSN_RN) >> INSN_RN_SHIFT; + + if (insn & INSN_SDT_P) + { + /* Pre-indexed addressing */ + if (insn & INSN_SDT_U) + { + rnv = (GET_REGISTER(cpustate, rn) + off); + } + else + { + rnv = (GET_REGISTER(cpustate, rn) - off); + } + + if (insn & INSN_SDT_W) + { + rnv_old = GET_REGISTER(cpustate, rn); + SET_REGISTER(cpustate, rn, rnv); + + // check writeback??? + } + else if (rn == eR15) + { + rnv = (rnv) + 8; + } + } + else + { + /* Post-indexed addressing */ + if (rn == eR15) + { + rnv = R15 + 8; + } + else + { + rnv = GET_REGISTER(cpustate, rn); + } + } + + /* Do the transfer */ + rd = (insn & INSN_RD) >> INSN_RD_SHIFT; + + /* Load */ + if (insn & INSN_SDT_L) + { + // Signed? + if (insn & 0x40) + { + UINT32 newval = 0; + + // Signed Half Word? + if (insn & 0x20) { + UINT16 signbyte, databyte; + databyte = READ16(rnv) & 0xFFFF; + signbyte = (databyte & 0x8000) ? 0xffff : 0; + newval = (UINT32)(signbyte << 16)|databyte; + } + // Signed Byte + else { + UINT8 databyte; + UINT32 signbyte; + databyte = READ8(rnv) & 0xff; + signbyte = (databyte & 0x80) ? 0xffffff : 0; + newval = (UINT32)(signbyte << 8)|databyte; + } + + if (cpustate->pendingAbtD == 0) + { + + // PC? + if (rd == eR15) + { + R15 = newval + 8; + // LDR(H,SH,SB) PC takes 2S + 2N + 1I (5 total cycles) + ARM7_ICOUNT -= 2; + + } + else + { + SET_REGISTER(cpustate, rd, newval); + R15 += 4; + } + + } + else + { + R15 += 4; + } + + } + // Unsigned Half Word + else + { + UINT32 newval = READ16(rnv); + + if (cpustate->pendingAbtD == 0) + { + + if (rd == eR15) + { + R15 = newval + 8; + // extra cycles for LDR(H,SH,SB) PC (5 total cycles) + ARM7_ICOUNT -= 2; + } + else + { + SET_REGISTER(cpustate, rd, newval); + R15 += 4; + } + + } + else + { + R15 += 4; + } + + } + + + } + /* Store or ARMv5+ dword insns */ + else + { + if ((insn & 0x60) == 0x40) // LDRD + { + SET_REGISTER(cpustate, rd, READ32(rnv)); + SET_REGISTER(cpustate, rd+1, READ32(rnv+4)); + R15 += 4; + } + else if ((insn & 0x60) == 0x60) // STRD + { + WRITE32(rnv, GET_REGISTER(cpustate, rd)); + WRITE32(rnv+4, GET_REGISTER(cpustate, rd+1)); + R15 += 4; + } + else + { + // WRITE16(rnv, rd == eR15 ? R15 + 8 : GET_REGISTER(cpustate, rd)); + WRITE16(rnv, rd == eR15 ? R15 + 8 + 4 : GET_REGISTER(cpustate, rd)); // manual says STR RD=PC, +12 of address + +// if R15 is not increased then e.g. "STRH R10, [R15,#$10]" will be executed over and over again +#if 0 + if (rn != eR15) +#endif + R15 += 4; + + // STRH takes 2 cycles, so we add + 1 + ARM7_ICOUNT += 1; + } + } + + if (cpustate->pendingAbtD != 0) + { + if ((insn & INSN_SDT_P) && (insn & INSN_SDT_W)) + { + SET_REGISTER(cpustate, rn, rnv_old); + } + } + else + { + + // SJE: No idea if this writeback code works or makes sense here.. + + /* Do post-indexing writeback */ + if (!(insn & INSN_SDT_P)/* && (insn & INSN_SDT_W)*/) + { + if (insn & INSN_SDT_U) + { + /* Writeback is applied in pipeline, before value is read from mem, + so writeback is effectively ignored */ + if (rd == rn) { + SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); + // todo: check for offs... ? + } + else { + + if ((insn & INSN_SDT_W) != 0) + LOG(("%08x: RegisterWritebackIncrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); + + SET_REGISTER(cpustate, rn, (rnv + off)); + } + } + else + { + /* Writeback is applied in pipeline, before value is read from mem, + so writeback is effectively ignored */ + if (rd == rn) { + SET_REGISTER(cpustate, rn, GET_REGISTER(cpustate, rd)); + } + else { + SET_REGISTER(cpustate, rn, (rnv - off)); + + if ((insn & INSN_SDT_W) != 0) + LOG(("%08x: RegisterWritebackDecrement %d %d %d\n", R15, (insn & INSN_SDT_P) != 0, (insn & INSN_SDT_W) != 0, (insn & INSN_SDT_U) != 0)); + } + } + } + + } + +} + +static void HandleSwap(arm_state *cpustate, UINT32 insn) +{ + UINT32 rn, rm, rd, tmp; + + rn = GET_REGISTER(cpustate, (insn >> 16) & 0xf); // reg. w/read address + rm = GET_REGISTER(cpustate, insn & 0xf); // reg. w/write address + rd = (insn >> 12) & 0xf; // dest reg + +#if ARM7_DEBUG_CORE + if (rn == 15 || rm == 15 || rd == 15) + LOG(("%08x: Illegal use of R15 in Swap Instruction\n", R15)); +#endif + + // can be byte or word + if (insn & 0x400000) + { + tmp = READ8(rn); + WRITE8(rn, rm); + SET_REGISTER(cpustate, rd, tmp); + } + else + { + tmp = READ32(rn); + WRITE32(rn, rm); + SET_REGISTER(cpustate, rd, tmp); + } + + R15 += 4; + // Instruction takes 1S+2N+1I cycles - so we subtract one more.. + ARM7_ICOUNT -= 1; +} + +static void HandlePSRTransfer(arm_state *cpustate, UINT32 insn) +{ + int reg = (insn & 0x400000) ? SPSR : eCPSR; // Either CPSR or SPSR + UINT32 newval, val = 0; + int oldmode = GET_CPSR & MODE_FLAG; + + // get old value of CPSR/SPSR + newval = GET_REGISTER(cpustate, reg); + + // MSR (bit 21 set) - Copy value to CPSR/SPSR + if ((insn & 0x00200000)) + { + // Immediate Value? + if (insn & INSN_I) { + // Value can be specified for a Right Rotate, 2x the value specified. + int by = (insn & INSN_OP2_ROTATE) >> INSN_OP2_ROTATE_SHIFT; + if (by) + val = ROR(insn & INSN_OP2_IMM, by << 1); + else + val = insn & INSN_OP2_IMM; + } + // Value from Register + else + { + val = GET_REGISTER(cpustate, insn & 0x0f); + } + + // apply field code bits + if (reg == eCPSR) + { + if (oldmode != eARM7_MODE_USER) + { + if (insn & 0x00010000) + { + newval = (newval & 0xffffff00) | (val & 0x000000ff); + } + if (insn & 0x00020000) + { + newval = (newval & 0xffff00ff) | (val & 0x0000ff00); + } + if (insn & 0x00040000) + { + newval = (newval & 0xff00ffff) | (val & 0x00ff0000); + } + } + + // status flags can be modified regardless of mode + if (insn & 0x00080000) + { + // TODO for non ARMv5E mask should be 0xf0000000 (ie mask Q bit) + newval = (newval & 0x00ffffff) | (val & 0xf8000000); + } + } + else // SPSR has stricter requirements + { + if (((GET_CPSR & 0x1f) > 0x10) && ((GET_CPSR & 0x1f) < 0x1f)) + { + if (insn & 0x00010000) + { + newval = (newval & 0xffffff00) | (val & 0xff); + } + if (insn & 0x00020000) + { + newval = (newval & 0xffff00ff) | (val & 0xff00); + } + if (insn & 0x00040000) + { + newval = (newval & 0xff00ffff) | (val & 0xff0000); + } + if (insn & 0x00080000) + { + // TODO for non ARMv5E mask should be 0xf0000000 (ie mask Q bit) + newval = (newval & 0x00ffffff) | (val & 0xf8000000); + } + } + } + +#if 0 + // force valid mode + newval |= 0x10; +#endif + + // Update the Register + if (reg == eCPSR) + SET_CPSR(newval); + else + SET_REGISTER(cpustate, reg, newval); + + // Switch to new mode if changed + if ((newval & MODE_FLAG) != oldmode) + SwitchMode(cpustate, GET_MODE); + + } + // MRS (bit 21 clear) - Copy CPSR or SPSR to specified Register + else + { + SET_REGISTER(cpustate, (insn >> 12)& 0x0f, GET_REGISTER(cpustate, reg)); + } +} + +static void HandleALU(arm_state *cpustate, UINT32 insn) +{ + UINT32 op2, sc = 0, rd, rn, opcode; + UINT32 by, rdn; + + // Normal Data Processing : 1S + // Data Processing with register specified shift : 1S + 1I + // Data Processing with PC written : 2S + 1N + // Data Processing with register specified shift and PC written : 2S + 1N + 1I + + opcode = (insn & INSN_OPCODE) >> INSN_OPCODE_SHIFT; + + rd = 0; + rn = 0; + + /* --------------*/ + /* Construct Op2 */ + /* --------------*/ + + /* Immediate constant */ + if (insn & INSN_I) + { + by = (insn & INSN_OP2_ROTATE) >> INSN_OP2_ROTATE_SHIFT; + if (by) + { + op2 = ROR(insn & INSN_OP2_IMM, by << 1); + sc = op2 & SIGN_BIT; + } + else + { + op2 = insn & INSN_OP2; // SJE: Shouldn't this be INSN_OP2_IMM? + sc = GET_CPSR & C_MASK; + } + } + /* Op2 = Register Value */ + else + { + op2 = decodeShift(cpustate, insn, (insn & INSN_S) ? &sc : NULL); + + // LD TODO sc will always be 0 if this applies + if (!(insn & INSN_S)) + sc = 0; + + // extra cycle (register specified shift) + ARM7_ICOUNT -= 1; + } + + // LD TODO this comment is wrong + /* Calculate Rn to account for pipelining */ + if ((opcode & 0xd) != 0xd) /* No Rn in MOV */ + { + if ((rn = (insn & INSN_RN) >> INSN_RN_SHIFT) == eR15) + { +#if ARM7_DEBUG_CORE + LOG(("%08x: Pipelined R15 (Shift %d)\n", R15, (insn & INSN_I ? 8 : insn & 0x10u ? 12 : 12))); +#endif + if (MODE32) + rn = R15 + 8; + else + rn = GET_PC + 8; + } + else + { + rn = GET_REGISTER(cpustate, rn); + } + } + + /* Perform the operation */ + + switch (opcode) + { + /* Arithmetic operations */ + case OPCODE_SBC: + rd = (rn - op2 - (GET_CPSR & C_MASK ? 0 : 1)); + HandleALUSubFlags(rd, rn, op2); + break; + case OPCODE_CMP: + case OPCODE_SUB: + rd = (rn - op2); + HandleALUSubFlags(rd, rn, op2); + break; + case OPCODE_RSC: + rd = (op2 - rn - (GET_CPSR & C_MASK ? 0 : 1)); + HandleALUSubFlags(rd, op2, rn); + break; + case OPCODE_RSB: + rd = (op2 - rn); + HandleALUSubFlags(rd, op2, rn); + break; + case OPCODE_ADC: + rd = (rn + op2 + ((GET_CPSR & C_MASK) >> C_BIT)); + HandleALUAddFlags(rd, rn, op2); + break; + case OPCODE_CMN: + case OPCODE_ADD: + rd = (rn + op2); + HandleALUAddFlags(rd, rn, op2); + break; + + /* Logical operations */ + case OPCODE_AND: + case OPCODE_TST: + rd = rn & op2; + HandleALULogicalFlags(rd, sc); + break; + case OPCODE_BIC: + rd = rn & ~op2; + HandleALULogicalFlags(rd, sc); + break; + case OPCODE_TEQ: + case OPCODE_EOR: + rd = rn ^ op2; + HandleALULogicalFlags(rd, sc); + break; + case OPCODE_ORR: + rd = rn | op2; + HandleALULogicalFlags(rd, sc); + break; + case OPCODE_MOV: + rd = op2; + HandleALULogicalFlags(rd, sc); + break; + case OPCODE_MVN: + rd = (~op2); + HandleALULogicalFlags(rd, sc); + break; + } + + /* Put the result in its register if not one of the test only opcodes (TST,TEQ,CMP,CMN) */ + rdn = (insn & INSN_RD) >> INSN_RD_SHIFT; + if ((opcode & 0xc) != 0x8) + { + // If Rd = R15, but S Flag not set, Result is placed in R15, but CPSR is not affected (page 44) + if (rdn == eR15 && !(insn & INSN_S)) + { + if (MODE32) + { + R15 = rd; + } + else + { + R15 = (R15 & ~0x03FFFFFC) | (rd & 0x03FFFFFC); + } + // extra cycles (PC written) + ARM7_ICOUNT -= 2; + } + else + { + // Rd = 15 and S Flag IS set, Result is placed in R15, and current mode SPSR moved to CPSR + if (rdn == eR15) { + + if (MODE32) + { + // When Rd is R15 and the S flag is set the result of the operation is placed in R15 and the SPSR corresponding to + // the current mode is moved to the CPSR. This allows state changes which automatically restore both PC and + // CPSR. --> This form of instruction should not be used in User mode. <-- + + if (GET_MODE != eARM7_MODE_USER) + { + // Update CPSR from SPSR + SET_CPSR(GET_REGISTER(cpustate, SPSR)); + SwitchMode(cpustate, GET_MODE); + } + + R15 = rd; + + } + else + { + UINT32 temp; + R15 = rd; //(R15 & 0x03FFFFFC) | (rd & 0xFC000003); + temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */; + SET_CPSR( temp); + SwitchMode( cpustate, temp & 3); + } + + // extra cycles (PC written) + ARM7_ICOUNT -= 2; + + /* IRQ masks may have changed in this instruction */ +// ARM7_CHECKIRQ; + } + else + /* S Flag is set - Write results to register & update CPSR (which was already handled using HandleALU flag macros) */ + SET_REGISTER(cpustate, rdn, rd); + } + } + // SJE: Don't think this applies any more.. (see page 44 at bottom) + /* TST & TEQ can affect R15 (the condition code register) with the S bit set */ + else if (rdn == eR15) + { + if (insn & INSN_S) { +#if ARM7_DEBUG_CORE + LOG(("%08x: TST class on R15 s bit set\n", R15)); +#endif + if (MODE32) + R15 = rd; + else + { + UINT32 temp; + R15 = (R15 & 0x03FFFFFC) | (rd & ~0x03FFFFFC); + temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */; + SET_CPSR( temp); + SwitchMode( cpustate, temp & 3); + } + + /* IRQ masks may have changed in this instruction */ +// ARM7_CHECKIRQ; + } + else + { +#if ARM7_DEBUG_CORE + LOG(("%08x: TST class on R15 no s bit set\n", R15)); +#endif + } + // extra cycles (PC written) + ARM7_ICOUNT -= 2; + } + + // compensate for the -3 at the end + ARM7_ICOUNT += 2; +} + +static void HandleMul(arm_state *cpustate, UINT32 insn) +{ + UINT32 r, rm, rs; + + // MUL takes 1S + mI and MLA 1S + (m+1)I cycles to execute, where S and I are as + // defined in 6.2 Cycle Types on page 6-2. + // m is the number of 8 bit multiplier array cycles required to complete the + // multiply, which is controlled by the value of the multiplier operand + // specified by Rs. + + rm = GET_REGISTER(cpustate, insn & INSN_MUL_RM); + rs = GET_REGISTER(cpustate, (insn & INSN_MUL_RS) >> INSN_MUL_RS_SHIFT); + + /* Do the basic multiply of Rm and Rs */ + r = rm * rs; + +#if ARM7_DEBUG_CORE + if ((insn & INSN_MUL_RM) == 0xf || + ((insn & INSN_MUL_RS) >> INSN_MUL_RS_SHIFT) == 0xf || + ((insn & INSN_MUL_RN) >> INSN_MUL_RN_SHIFT) == 0xf) + LOG(("%08x: R15 used in mult\n", R15)); +#endif + + /* Add on Rn if this is a MLA */ + if (insn & INSN_MUL_A) + { + r += GET_REGISTER(cpustate, (insn & INSN_MUL_RN) >> INSN_MUL_RN_SHIFT); + // extra cycle for MLA + ARM7_ICOUNT -= 1; + } + + /* Write the result */ + SET_REGISTER(cpustate, (insn & INSN_MUL_RD) >> INSN_MUL_RD_SHIFT, r); + + /* Set N and Z if asked */ + if (insn & INSN_S) + { + SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleALUNZFlags(r)); + } + + if (rs & SIGN_BIT) rs = -rs; + if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1; + else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2; + else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3; + else ARM7_ICOUNT -= 1 + 4; + + ARM7_ICOUNT += 3; +} + +// todo: add proper cycle counts +static void HandleSMulLong(arm_state *cpustate, UINT32 insn) +{ + INT32 rm, rs; + UINT32 rhi, rlo; + INT64 res = 0; + + // MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the + // number of 8 bit multiplier array cycles required to complete the multiply, which is + // controlled by the value of the multiplier operand specified by Rs. + + rm = (INT32)GET_REGISTER(cpustate, insn & 0xf); + rs = (INT32)GET_REGISTER(cpustate, ((insn >> 8) & 0xf)); + rhi = (insn >> 16) & 0xf; + rlo = (insn >> 12) & 0xf; + +#if ARM7_DEBUG_CORE + if ((insn & 0xf) == 15 || ((insn >> 8) & 0xf) == 15 || ((insn >> 16) & 0xf) == 15 || ((insn >> 12) & 0xf) == 15) + LOG(("%08x: Illegal use of PC as a register in SMULL opcode\n", R15)); +#endif + + /* Perform the multiplication */ + res = (INT64)rm * rs; + + /* Add on Rn if this is a MLA */ + if (insn & INSN_MUL_A) + { + INT64 acum = (INT64)((((INT64)(GET_REGISTER(cpustate, rhi))) << 32) | GET_REGISTER(cpustate, rlo)); + res += acum; + // extra cycle for MLA + ARM7_ICOUNT -= 1; + } + + /* Write the result (upper dword goes to RHi, lower to RLo) */ + SET_REGISTER(cpustate, rhi, res >> 32); + SET_REGISTER(cpustate, rlo, res & 0xFFFFFFFF); + + /* Set N and Z if asked */ + if (insn & INSN_S) + { + SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleLongALUNZFlags(res)); + } + + if (rs < 0) rs = -rs; + if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1 + 1; + else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2 + 1; + else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3 + 1; + else ARM7_ICOUNT -= 1 + 4 + 1; + + ARM7_ICOUNT += 3; +} + +// todo: add proper cycle counts +static void HandleUMulLong(arm_state *cpustate, UINT32 insn) +{ + UINT32 rm, rs; + UINT32 rhi, rlo; + UINT64 res = 0; + + // MULL takes 1S + (m+1)I and MLAL 1S + (m+2)I cycles to execute, where m is the + // number of 8 bit multiplier array cycles required to complete the multiply, which is + // controlled by the value of the multiplier operand specified by Rs. + + rm = (INT32)GET_REGISTER(cpustate, insn & 0xf); + rs = (INT32)GET_REGISTER(cpustate, ((insn >> 8) & 0xf)); + rhi = (insn >> 16) & 0xf; + rlo = (insn >> 12) & 0xf; + +#if ARM7_DEBUG_CORE + if (((insn & 0xf) == 15) || (((insn >> 8) & 0xf) == 15) || (((insn >> 16) & 0xf) == 15) || (((insn >> 12) & 0xf) == 15)) + LOG(("%08x: Illegal use of PC as a register in SMULL opcode\n", R15)); +#endif + + /* Perform the multiplication */ + res = (UINT64)rm * rs; + + /* Add on Rn if this is a MLA */ + if (insn & INSN_MUL_A) + { + UINT64 acum = (UINT64)((((UINT64)(GET_REGISTER(cpustate, rhi))) << 32) | GET_REGISTER(cpustate, rlo)); + res += acum; + // extra cycle for MLA + ARM7_ICOUNT -= 1; + } + + /* Write the result (upper dword goes to RHi, lower to RLo) */ + SET_REGISTER(cpustate, rhi, res >> 32); + SET_REGISTER(cpustate, rlo, res & 0xFFFFFFFF); + + /* Set N and Z if asked */ + if (insn & INSN_S) + { + SET_CPSR((GET_CPSR & ~(N_MASK | Z_MASK)) | HandleLongALUNZFlags(res)); + } + + if (rs < 0x00000100) ARM7_ICOUNT -= 1 + 1 + 1; + else if (rs < 0x00010000) ARM7_ICOUNT -= 1 + 2 + 1; + else if (rs < 0x01000000) ARM7_ICOUNT -= 1 + 3 + 1; + else ARM7_ICOUNT -= 1 + 4 + 1; + + ARM7_ICOUNT += 3; +} + +static void HandleMemBlock(arm_state *cpustate, UINT32 insn) +{ + UINT32 rb = (insn & INSN_RN) >> INSN_RN_SHIFT; + UINT32 rbp = GET_REGISTER(cpustate, rb); + int result; + +#if ARM7_DEBUG_CORE + if (rbp & 3) + LOG(("%08x: Unaligned Mem Transfer @ %08x\n", R15, rbp)); +#endif + + // Normal LDM instructions take nS + 1N + 1I and LDM PC takes (n+1)S + 2N + 1I + // incremental cycles, where S,N and I are as defined in 6.2 Cycle Types on page 6-2. + // STM instructions take (n-1)S + 2N incremental cycles to execute, where n is the + // number of words transferred. + + if (insn & INSN_BDT_L) + { + /* Loading */ + if (insn & INSN_BDT_U) + { + /* Incrementing */ + if (!(insn & INSN_BDT_P)) + { + rbp = rbp + (- 4); + } + + // S Flag Set, but R15 not in list = User Bank Transfer + if (insn & INSN_BDT_S && (insn & 0x8000) == 0) + { + // !! actually switching to user mode triggers a section permission fault in Happy Fish 302-in-1 (BP C0030DF4, press F5 ~16 times) !! + // set to user mode - then do the transfer, and set back + //int curmode = GET_MODE; + //SwitchMode(cpustate, eARM7_MODE_USER); + LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); + result = loadInc(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S, eARM7_MODE_USER); + // todo - not sure if Writeback occurs on User registers also.. + //SwitchMode(cpustate, curmode); + } + else + result = loadInc(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S, GET_MODE); + + if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) + { +#if ARM7_DEBUG_CORE + if (rb == 15) + LOG(("%08x: Illegal LDRM writeback to r15\n", R15)); +#endif + // "A LDM will always overwrite the updated base if the base is in the list." (also for a user bank transfer?) + // GBA "V-Rally 3" expects R0 not to be overwritten with the updated base value [BP 8077B0C] + if (((insn >> rb) & 1) == 0) + { + SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) + result * 4); + } + } + + // R15 included? (NOTE: CPSR restore must occur LAST otherwise wrong registers restored!) + if ((insn & 0x8000) && (cpustate->pendingAbtD == 0)) { + R15 -= 4; // SJE: I forget why i did this? + // S - Flag Set? Signals transfer of current mode SPSR->CPSR + if (insn & INSN_BDT_S) + { + if (MODE32) + { + SET_CPSR(GET_REGISTER(cpustate, SPSR)); + SwitchMode(cpustate, GET_MODE); + } + else + { + UINT32 temp; +// LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR)); + temp = (GET_CPSR & 0x0FFFFF20) | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */; + SET_CPSR( temp); + SwitchMode(cpustate, temp & 3); + } + } + // LDM PC - takes 2 extra cycles + ARM7_ICOUNT -= 2; + } + } + else + { + /* Decrementing */ + if (!(insn & INSN_BDT_P)) + { + rbp = rbp - (- 4); + } + + // S Flag Set, but R15 not in list = User Bank Transfer + if (insn & INSN_BDT_S && ((insn & 0x8000) == 0)) + { + // set to user mode - then do the transfer, and set back + //int curmode = GET_MODE; + //SwitchMode(cpustate, eARM7_MODE_USER); + LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); + result = loadDec(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S, eARM7_MODE_USER); + // todo - not sure if Writeback occurs on User registers also.. + //SwitchMode(cpustate, curmode); + } + else + result = loadDec(cpustate, insn & 0xffff, rbp, insn & INSN_BDT_S, GET_MODE); + + if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) + { + if (rb == 0xf) + LOG(("%08x: Illegal LDRM writeback to r15\n", R15)); + // "A LDM will always overwrite the updated base if the base is in the list." (also for a user bank transfer?) + if (((insn >> rb) & 1) == 0) + { + SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) - result * 4); + } + } + + // R15 included? (NOTE: CPSR restore must occur LAST otherwise wrong registers restored!) + if ((insn & 0x8000) && (cpustate->pendingAbtD == 0)) { + R15 -= 4; // SJE: I forget why i did this? + // S - Flag Set? Signals transfer of current mode SPSR->CPSR + if (insn & INSN_BDT_S) + { + if (MODE32) + { + SET_CPSR(GET_REGISTER(cpustate, SPSR)); + SwitchMode(cpustate, GET_MODE); + } + else + { + UINT32 temp; +// LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR)); + temp = (GET_CPSR & 0x0FFFFF20) /* N Z C V I F M4 M3 M2 M1 M0 */ | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */; + SET_CPSR( temp); + SwitchMode(cpustate, temp & 3); + } + } + // LDM PC - takes 2 extra cycles + ARM7_ICOUNT -= 2; + } + } + // LDM (NO PC) takes (n)S + 1N + 1I cycles (n = # of register transfers) + ARM7_ICOUNT -= result + 1 + 1; + } /* Loading */ + else + { + /* Storing */ + if (insn & (1 << eR15)) + { +#if ARM7_DEBUG_CORE + LOG(("%08x: Writing R15 in strm\n", R15)); +#endif + /* special case handling if writing to PC */ + R15 += 12; + } + if (insn & INSN_BDT_U) + { + /* Incrementing */ + if (!(insn & INSN_BDT_P)) + { + rbp = rbp + (- 4); + } + + // S Flag Set = User Bank Transfer + if (insn & INSN_BDT_S) + { + // todo: needs to be tested.. + + // set to user mode - then do the transfer, and set back + //int curmode = GET_MODE; + //SwitchMode(cpustate, eARM7_MODE_USER); + LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); + result = storeInc(cpustate, insn & 0xffff, rbp, eARM7_MODE_USER); + // todo - not sure if Writeback occurs on User registers also.. + //SwitchMode(cpustate, curmode); + } + else + result = storeInc(cpustate, insn & 0xffff, rbp, GET_MODE); + + if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) + { + SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) + result * 4); + } + } + else + { + /* Decrementing */ + if (!(insn & INSN_BDT_P)) + { + rbp = rbp - (-4); + } + + // S Flag Set = User Bank Transfer + if (insn & INSN_BDT_S) + { + // set to user mode - then do the transfer, and set back + //int curmode = GET_MODE; + //SwitchMode(cpustate, eARM7_MODE_USER); + LOG(("%08x: User Bank Transfer not fully tested - please check if working properly!\n", R15)); + result = storeDec(cpustate, insn & 0xffff, rbp, eARM7_MODE_USER); + // todo - not sure if Writeback occurs on User registers also.. + //SwitchMode(cpustate, curmode); + } + else + result = storeDec(cpustate, insn & 0xffff, rbp, GET_MODE); + + if ((insn & INSN_BDT_W) && (cpustate->pendingAbtD == 0)) + { + SET_REGISTER(cpustate, rb, GET_REGISTER(cpustate, rb) - result * 4); + } + } + if (insn & (1 << eR15)) + R15 -= 12; + + // STM takes (n-1)S + 2N cycles (n = # of register transfers) + ARM7_ICOUNT -= (result - 1) + 2; + } + + // We will specify the cycle count for each case, so remove the -3 that occurs at the end + ARM7_ICOUNT += 3; + +} /* HandleMemBlock */ + + +arm7ops_ophandler ops_handler[0x10] = +{ + arm7ops_0123, arm7ops_0123, arm7ops_0123, arm7ops_0123,arm7ops_4567,arm7ops_4567,arm7ops_4567,arm7ops_4567,arm7ops_89,arm7ops_89,arm7ops_ab,arm7ops_ab,arm7ops_cd,arm7ops_cd,arm7ops_e,arm7ops_f, +}; + +const void arm7ops_0123(arm_state *cpustate, UINT32 insn) +{ +//case 0: +//case 1: +//case 2: +//case 3: + /* Branch and Exchange (BX) */ + if ((insn & 0x0ffffff0) == 0x012fff10) // bits 27-4 == 000100101111111111110001 + { + R15 = GET_REGISTER(cpustate, insn & 0x0f); + // If new PC address has A0 set, switch to Thumb mode + if (R15 & 1) { + SET_CPSR(GET_CPSR|T_MASK); + R15--; + } + } + else if ((insn & 0x0ff000f0) == 0x01600010) // CLZ - v5 + { + UINT32 rm = insn&0xf; + UINT32 rd = (insn>>12)&0xf; + + SET_REGISTER(cpustate, rd, count_leading_zeros(GET_REGISTER(cpustate, rm))); + + R15 += 4; + } + else if ((insn & 0x0ff000f0) == 0x01000050) // QADD - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); + INT64 res; + + res = saturate_qbit_overflow(cpustate, (INT64)src1 + (INT64)src2); + + SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); + R15 += 4; + } + else if ((insn & 0x0ff000f0) == 0x01400050) // QDADD - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); + INT64 res; + + // check if doubling operation will overflow + res = (INT64)src2 * 2; + saturate_qbit_overflow(cpustate, res); + + src2 *= 2; + res = saturate_qbit_overflow(cpustate, (INT64)src1 + (INT64)src2); + + SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); + R15 += 4; + } + else if ((insn & 0x0ff000f0) == 0x01200050) // QSUB - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); + INT64 res; + + res = saturate_qbit_overflow(cpustate, (INT64)src1 - (INT64)src2); + + SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); + R15 += 4; + } + else if ((insn & 0x0ff000f0) == 0x01600050) // QDSUB - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>16)&0xf); + INT64 res; + + // check if doubling operation will overflow + res = (INT64)src2 * 2; + saturate_qbit_overflow(cpustate, res); + + src2 *= 2; + res = saturate_qbit_overflow(cpustate, (INT64)src1 - (INT64)src2); + + SET_REGISTER(cpustate, (insn>>12)&0xf, (INT32)res); + R15 += 4; + } + else if ((insn & 0x0ff00090) == 0x01000080) // SMLAxy - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); + INT32 res1; + + // select top and bottom halves of src1/src2 and sign extend if necessary + if (insn & 0x20) + { + src1 >>= 16; + } + else + { + src1 &= 0xffff; + if (src1 & 0x8000) + { + src1 |= 0xffff; + } + } + + if (insn & 0x40) + { + src2 >>= 16; + } + else + { + src2 &= 0xffff; + if (src2 & 0x8000) + { + src2 |= 0xffff; + } + } + + // do the signed multiply + res1 = src1 * src2; + // and the accumulate. NOTE: only the accumulate can cause an overflow, which is why we do it this way. + saturate_qbit_overflow(cpustate, (INT64)res1 + (INT64)GET_REGISTER(cpustate, (insn>>12)&0xf)); + + SET_REGISTER(cpustate, (insn>>16)&0xf, res1 + GET_REGISTER(cpustate, (insn>>12)&0xf)); + R15 += 4; + } + else if ((insn & 0x0ff00090) == 0x01400080) // SMLALxy - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); + INT64 dst; + + // select top and bottom halves of src1/src2 and sign extend if necessary + if (insn & 0x20) + { + src1 >>= 16; + } + else + { + src1 &= 0xffff; + if (src1 & 0x8000) + { + src1 |= 0xffff; + } + } + + if (insn & 0x40) + { + src2 >>= 16; + } + else + { + src2 &= 0xffff; + if (src2 & 0x8000) + { + src2 |= 0xffff; + } + } + + dst = (INT64)GET_REGISTER(cpustate, (insn>>12)&0xf); + dst |= (INT64)GET_REGISTER(cpustate, (insn>>16)&0xf)<<32; + + // do the multiply and accumulate + dst += (INT64)src1 * (INT64)src2; + + // write back the result + SET_REGISTER(cpustart, (insn>>12)&0xf, (UINT32)(dst&0xffffffff)); + SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)(dst>>32)); + } + else if ((insn & 0x0ff00090) == 0x01600080) // SMULxy - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); + INT32 res; + + // select top and bottom halves of src1/src2 and sign extend if necessary + if (insn & 0x20) + { + src1 >>= 16; + } + else + { + src1 &= 0xffff; + if (src1 & 0x8000) + { + src1 |= 0xffff; + } + } + + if (insn & 0x40) + { + src2 >>= 16; + } + else + { + src2 &= 0xffff; + if (src2 & 0x8000) + { + src2 |= 0xffff; + } + } + + res = src1 * src2; + SET_REGISTER(cpustart, (insn>>16)&0xf, res); + } + else if ((insn & 0x0ff000b0) == 0x012000a0) // SMULWy - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); + INT64 res; + + if (insn & 0x40) + { + src2 >>= 16; + } + else + { + src2 &= 0xffff; + if (src2 & 0x8000) + { + src2 |= 0xffff; + } + } + + res = (INT64)src1 * (INT64)src2; + res >>= 16; + SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); + } + else if ((insn & 0x0ff000b0) == 0x01200080) // SMLAWy - v5 + { + INT32 src1 = GET_REGISTER(cpustate, insn&0xf); + INT32 src2 = GET_REGISTER(cpustate, (insn>>8)&0xf); + INT32 src3 = GET_REGISTER(cpustate, (insn>>12)&0xf); + INT64 res; + + if (insn & 0x40) + { + src2 >>= 16; + } + else + { + src2 &= 0xffff; + if (src2 & 0x8000) + { + src2 |= 0xffff; + } + } + + res = (INT64)src1 * (INT64)src2; + res >>= 16; + + // check for overflow and set the Q bit + saturate_qbit_overflow(cpustate, (INT64)src3 + res); + + // do the real accumulate + src3 += (INT32)res; + + // write the result back + SET_REGISTER(cpustart, (insn>>16)&0xf, (UINT32)res); + } + else + /* Multiply OR Swap OR Half Word Data Transfer */ + if ((insn & 0x0e000000) == 0 && (insn & 0x80) && (insn & 0x10)) // bits 27-25=000 bit 7=1 bit 4=1 + { + /* Half Word Data Transfer */ + if (insn & 0x60) // bits = 6-5 != 00 + { + HandleHalfWordDT(cpustate, insn); + } + else + /* Swap */ + if (insn & 0x01000000) // bit 24 = 1 + { + HandleSwap(cpustate, insn); + } + /* Multiply Or Multiply Long */ + else + { + /* multiply long */ + if (insn & 0x800000) // Bit 23 = 1 for Multiply Long + { + /* Signed? */ + if (insn & 0x00400000) + HandleSMulLong(cpustate, insn); + else + HandleUMulLong(cpustate, insn); + } + /* multiply */ + else + { + HandleMul(cpustate, insn); + } + R15 += 4; + } + } + /* Data Processing OR PSR Transfer */ + else if ((insn & 0x0c000000) == 0) // bits 27-26 == 00 - This check can only exist properly after Multiplication check above + { + /* PSR Transfer (MRS & MSR) */ + if (((insn & 0x00100000) == 0) && ((insn & 0x01800000) == 0x01000000)) // S bit must be clear, and bit 24,23 = 10 + { + HandlePSRTransfer(cpustate, insn); + ARM7_ICOUNT += 2; // PSR only takes 1 - S Cycle, so we add + 2, since at end, we -3.. + R15 += 4; + } + /* Data Processing */ + else + { + HandleALU(cpustate, insn); + } + } +// break; +} + +const void arm7ops_4567(arm_state *cpustate, UINT32 insn) /* Data Transfer - Single Data Access */ +{ +//case 4: +//case 5: +//case 6: +//case 7: + HandleMemSingle(cpustate, insn); + R15 += 4; +// break; +} + +const void arm7ops_89(arm_state *cpustate, UINT32 insn) /* Block Data Transfer/Access */ +{ +//case 8: +//case 9: + HandleMemBlock(cpustate, insn); + R15 += 4; +// break; +} + +const void arm7ops_ab(arm_state *cpustate, UINT32 insn) /* Branch or Branch & Link */ +{ +//case 0xa: +//case 0xb: + HandleBranch(cpustate, insn); +// break; +} + +const void arm7ops_cd(arm_state *cpustate, UINT32 insn) /* Co-Processor Data Transfer */ +{ +//case 0xc: +//case 0xd: + HandleCoProcDT(cpustate, insn); + R15 += 4; +// break; +} + +const void arm7ops_e(arm_state *cpustate, UINT32 insn) /* Co-Processor Data Operation or Register Transfer */ +{ +//case 0xe: + if (insn & 0x10) + HandleCoProcRT(cpustate, insn); + else + HandleCoProcDO(cpustate, insn); + R15 += 4; +// break; +} + +const void arm7ops_f(arm_state *cpustate, UINT32 insn) /* Software Interrupt */ +{ + cpustate->pendingSwi = 1; + ARM7_CHECKIRQ; + //couldn't find any cycle counts for SWI +// break; +} diff -Nru mame-0.144/src/emu/cpu/arm7/arm7ops.h mame-0.145/src/emu/cpu/arm7/arm7ops.h --- mame-0.144/src/emu/cpu/arm7/arm7ops.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7ops.h 2012-02-06 21:30:23.000000000 +0000 @@ -0,0 +1,8 @@ + +const void arm7ops_0123(arm_state *cpustate, UINT32 insn); +const void arm7ops_4567(arm_state *cpustate, UINT32 insn); +const void arm7ops_89(arm_state *cpustate, UINT32 insn); +const void arm7ops_ab(arm_state *cpustate, UINT32 insn); +const void arm7ops_cd(arm_state *cpustate, UINT32 insn); +const void arm7ops_e(arm_state *cpustate, UINT32 insn); +const void arm7ops_f(arm_state *cpustate, UINT32 insn); diff -Nru mame-0.144/src/emu/cpu/arm7/arm7thmb.c mame-0.145/src/emu/cpu/arm7/arm7thmb.c --- mame-0.144/src/emu/cpu/arm7/arm7thmb.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7thmb.c 2012-02-06 21:30:23.000000000 +0000 @@ -0,0 +1,1686 @@ +#include "emu.h" +#include "arm7core.h" +#include "arm7thmb.h" +#include "arm7help.h" + +// this is our master dispatch jump table for THUMB mode, representing [(insn & 0xffc0) >> 6] bits of the 16-bit decoded instruction +arm7thumb_ophandler thumb_handler[0x40*0x10] = +{ +// #define THUMB_SHIFT_R ((UINT16)0x0800) + tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_0, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, tg00_1, +// #define THUMB_INSN_ADDSUB ((UINT16)0x0800) // #define THUMB_ADDSUB_TYPE ((UINT16)0x0600) + tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_0, tg01_10, tg01_10, tg01_10, tg01_10, tg01_10, tg01_10, tg01_10, tg01_10, tg01_11, tg01_11, tg01_11, tg01_11, tg01_11, tg01_11, tg01_11, tg01_11, tg01_12, tg01_12, tg01_12, tg01_12, tg01_12, tg01_12, tg01_12, tg01_12, tg01_13, tg01_13, tg01_13, tg01_13, tg01_13, tg01_13, tg01_13, tg01_13, +// #define THUMB_INSN_CMP ((UINT16)0x0800) + tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_0, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, tg02_1, +// #define THUMB_INSN_SUB ((UINT16)0x0800) + tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_0, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, tg03_1, +//#define THUMB_GROUP4_TYPE ((UINT16)0x0c00) //#define THUMB_ALUOP_TYPE ((UINT16)0x03c0) // #define THUMB_HIREG_OP ((UINT16)0x0300) // #define THUMB_HIREG_H ((UINT16)0x00c0) + tg04_00_00, tg04_00_01, tg04_00_02, tg04_00_03, tg04_00_04, tg04_00_05, tg04_00_06, tg04_00_07, tg04_00_08, tg04_00_09, tg04_00_0a, tg04_00_0b, tg04_00_0c, tg04_00_0d, tg04_00_0e, tg04_00_0f, tg04_01_00, tg04_01_01, tg04_01_02, tg04_01_03, tg04_01_10, tg04_01_11, tg04_01_12, tg04_01_13, tg04_01_20, tg04_01_21, tg04_01_22, tg04_01_23, tg04_01_30, tg04_01_31, tg04_01_32, tg04_01_33, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, tg04_0203, +//#define THUMB_GROUP5_TYPE ((UINT16)0x0e00) + tg05_0, tg05_0, tg05_0, tg05_0, tg05_0, tg05_0, tg05_0, tg05_0, tg05_1, tg05_1, tg05_1, tg05_1, tg05_1, tg05_1, tg05_1, tg05_1, tg05_2, tg05_2, tg05_2, tg05_2, tg05_2, tg05_2, tg05_2, tg05_2, tg05_3, tg05_3, tg05_3, tg05_3, tg05_3, tg05_3, tg05_3, tg05_3, tg05_4, tg05_4, tg05_4, tg05_4, tg05_4, tg05_4, tg05_4, tg05_4, tg05_5, tg05_5, tg05_5, tg05_5, tg05_5, tg05_5, tg05_5, tg05_5, tg05_6, tg05_6, tg05_6, tg05_6, tg05_6, tg05_6, tg05_6, tg05_6, tg05_7, tg05_7, tg05_7, tg05_7, tg05_7, tg05_7, tg05_7, tg05_7, +//#define THUMB_LSOP_L ((UINT16)0x0800) + tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_0, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, tg06_1, +//#define THUMB_LSOP_L ((UINT16)0x0800) + tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_0, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, tg07_1, +// #define THUMB_HALFOP_L ((UINT16)0x0800) + tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_0, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, tg08_1, +// #define THUMB_STACKOP_L ((UINT16)0x0800) + tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_0, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, tg09_1, +// #define THUMB_RELADDR_SP ((UINT16)0x0800) + tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_0, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, tg0a_1, +// #define THUMB_STACKOP_TYPE ((UINT16)0x0f00) + tg0b_0, tg0b_0, tg0b_0, tg0b_0, tg0b_1, tg0b_1, tg0b_1, tg0b_1, tg0b_2, tg0b_2, tg0b_2, tg0b_2, tg0b_3, tg0b_3, tg0b_3, tg0b_3, tg0b_4, tg0b_4, tg0b_4, tg0b_4, tg0b_5, tg0b_5, tg0b_5, tg0b_5, tg0b_6, tg0b_6, tg0b_6, tg0b_6, tg0b_7, tg0b_7, tg0b_7, tg0b_7, tg0b_8, tg0b_8, tg0b_8, tg0b_8, tg0b_9, tg0b_9, tg0b_9, tg0b_9, tg0b_a, tg0b_a, tg0b_a, tg0b_a, tg0b_b, tg0b_b, tg0b_b, tg0b_b, tg0b_c, tg0b_c, tg0b_c, tg0b_c, tg0b_d, tg0b_d, tg0b_d, tg0b_d, tg0b_e, tg0b_e, tg0b_e, tg0b_e, tg0b_f, tg0b_f, tg0b_f, tg0b_f, +// #define THUMB_MULTLS ((UINT16)0x0800) + tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_0, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, tg0c_1, +// #define THUMB_COND_TYPE ((UINT16)0x0f00) + tg0d_0, tg0d_0, tg0d_0, tg0d_0, tg0d_1, tg0d_1, tg0d_1, tg0d_1, tg0d_2, tg0d_2, tg0d_2, tg0d_2, tg0d_3, tg0d_3, tg0d_3, tg0d_3, tg0d_4, tg0d_4, tg0d_4, tg0d_4, tg0d_5, tg0d_5, tg0d_5, tg0d_5, tg0d_6, tg0d_6, tg0d_6, tg0d_6, tg0d_7, tg0d_7, tg0d_7, tg0d_7, tg0d_8, tg0d_8, tg0d_8, tg0d_8, tg0d_9, tg0d_9, tg0d_9, tg0d_9, tg0d_a, tg0d_a, tg0d_a, tg0d_a, tg0d_b, tg0d_b, tg0d_b, tg0d_b, tg0d_c, tg0d_c, tg0d_c, tg0d_c, tg0d_d, tg0d_d, tg0d_d, tg0d_d, tg0d_e, tg0d_e, tg0d_e, tg0d_e, tg0d_f, tg0d_f, tg0d_f, tg0d_f, +// #define THUMB_BLOP_LO ((UINT16)0x0800) + tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_0, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, tg0e_1, +// #define THUMB_BLOP_LO ((UINT16)0x0800) + tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_0, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, tg0f_1, +}; + + /* Shift operations */ + +const void tg00_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Shift left */ +{ + UINT32 rs, rd, rrs; + INT32 offs; + + SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrs = GET_REGISTER(cpustate, rs); + offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; + if (offs != 0) + { + SET_REGISTER(cpustate, rd, rrs << offs); + if (rrs & (1 << (31 - (offs - 1)))) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else + { + SET_REGISTER(cpustate, rd, rrs); + } + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; +} + +const void tg00_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Shift right */ +{ + UINT32 rs, rd, rrs; + INT32 offs; + + SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrs = GET_REGISTER(cpustate, rs); + offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; + if (offs != 0) + { + SET_REGISTER(cpustate, rd, rrs >> offs); + if (rrs & (1 << (offs - 1))) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else + { + SET_REGISTER(cpustate, rd, 0); + if (rrs & 0x80000000) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; +} + +/* Arithmetic */ + +const void tg01_0(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 rs, rd, rrs; + INT32 offs; + /* ASR.. */ + //if (insn & THUMB_SHIFT_R) /* Shift right */ + { + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrs = GET_REGISTER(cpustate, rs); + offs = (insn & THUMB_SHIFT_AMT) >> THUMB_SHIFT_AMT_SHIFT; + if (offs == 0) + { + offs = 32; + } + if (offs >= 32) + { + if (rrs >> 31) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + SET_REGISTER(cpustate, rd, (rrs & 0x80000000) ? 0xFFFFFFFF : 0x00000000); + } + else + { + if ((rrs >> (offs - 1)) & 1) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + SET_REGISTER(cpustate, rd, + (rrs & 0x80000000) + ? ((0xFFFFFFFF << (32 - offs)) | (rrs >> offs)) + : (rrs >> offs)); + } + SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + } +} + +const void tg01_10(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, Rs, Rn */ +{ + UINT32 rn, rs, rd; + + + rn = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT); + rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, rs + rn); + HandleThumbALUAddFlags(GET_REGISTER(cpustate, rd), rs, rn); + +} + +const void tg01_11(arm_state *cpustate, UINT32 pc, UINT32 insn) /* SUB Rd, Rs, Rn */ +{ + UINT32 rn, rs, rd; + + rn = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT); + rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, rs - rn); + HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), rs, rn); + +} + +const void tg01_12(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, Rs, #imm */ +{ + UINT32 rs, rd, imm; + + imm = (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT; + rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, rs + imm); + HandleThumbALUAddFlags(GET_REGISTER(cpustate, rd), rs, imm); + +} + +const void tg01_13(arm_state *cpustate, UINT32 pc, UINT32 insn) /* SUB Rd, Rs, #imm */ +{ + UINT32 rs, rd, imm; + + imm = (insn & THUMB_ADDSUB_RNIMM) >> THUMB_ADDSUB_RNIMM_SHIFT; + rs = GET_REGISTER(cpustate, (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT); + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, rs - imm); + HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), rs,imm); + +} + +/* CMP / MOV */ + +const void tg02_0(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 rd, op2; + + rd = (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT; + op2 = (insn & THUMB_INSN_IMM); + SET_REGISTER(cpustate, rd, op2); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; +} + +const void tg02_1(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 rn, rd, op2; + + rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); + op2 = insn & THUMB_INSN_IMM; + rd = rn - op2; + HandleThumbALUSubFlags(rd, rn, op2); + //mame_printf_debug("%08x: xxx Thumb instruction: CMP R%d (%08x), %02x (N=%d, Z=%d, C=%d, V=%d)\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT), op2, N_IS_SET(GET_CPSR) ? 1 : 0, Z_IS_SET(GET_CPSR) ? 1 : 0, C_IS_SET(GET_CPSR) ? 1 : 0, V_IS_SET(GET_CPSR) ? 1 : 0); +} + + + +/* ADD/SUB immediate */ + +const void tg03_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, #Offset8 */ +{ + UINT32 rn, rd, op2; + + rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); + op2 = insn & THUMB_INSN_IMM; + rd = rn + op2; + //mame_printf_debug("%08x: Thumb instruction: ADD R%d, %02x\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, op2); + SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, rd); + HandleThumbALUAddFlags(rd, rn, op2); +} + +const void tg03_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* SUB Rd, #Offset8 */ +{ + UINT32 rn, rd, op2; + + rn = GET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT); + op2 = insn & THUMB_INSN_IMM; + //mame_printf_debug("%08x: Thumb instruction: SUB R%d, %02x\n", pc, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, op2); + rd = rn - op2; + SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, rd); + HandleThumbALUSubFlags(rd, rn, op2); +} + + + +/* Rd & Rm instructions */ + +const void tg04_00_00(arm_state *cpustate, UINT32 pc, UINT32 insn) /* AND Rd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) & GET_REGISTER(cpustate, rs)); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_01(arm_state *cpustate, UINT32 pc, UINT32 insn) /* EOR Rd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) ^ GET_REGISTER(cpustate, rs)); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_02(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LSL Rd, Rs */ +{ + UINT32 rs, rd, rrd; + INT32 offs; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrd = GET_REGISTER(cpustate, rd); + offs = GET_REGISTER(cpustate, rs) & 0x000000ff; + if (offs > 0) + { + if (offs < 32) + { + SET_REGISTER(cpustate, rd, rrd << offs); + if (rrd & (1 << (31 - (offs - 1)))) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else if (offs == 32) + { + SET_REGISTER(cpustate, rd, 0); + if (rrd & 1) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else + { + SET_REGISTER(cpustate, rd, 0); + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_03(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LSR Rd, Rs */ +{ + UINT32 rs, rd, rrd; + INT32 offs; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrd = GET_REGISTER(cpustate, rd); + offs = GET_REGISTER(cpustate, rs) & 0x000000ff; + if (offs > 0) + { + if (offs < 32) + { + SET_REGISTER(cpustate, rd, rrd >> offs); + if (rrd & (1 << (offs - 1))) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else if (offs == 32) + { + SET_REGISTER(cpustate, rd, 0); + if (rrd & 0x80000000) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + else + { + SET_REGISTER(cpustate, rd, 0); + SET_CPSR(GET_CPSR & ~C_MASK); + } + } + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_04(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ASR Rd, Rs */ +{ + UINT32 rs, rd, rrs, rrd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrs = GET_REGISTER(cpustate, rs)&0xff; + rrd = GET_REGISTER(cpustate, rd); + if (rrs != 0) + { + if (rrs >= 32) + { + if (rrd >> 31) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + SET_REGISTER(cpustate, rd, (GET_REGISTER(cpustate, rd) & 0x80000000) ? 0xFFFFFFFF : 0x00000000); + } + else + { + if ((rrd >> (rrs-1)) & 1) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + SET_REGISTER(cpustate, rd, (rrd & 0x80000000) + ? ((0xFFFFFFFF << (32 - rrs)) | (rrd >> rrs)) + : (rrd >> rrs)); + } + } + SET_CPSR(GET_CPSR & ~(N_MASK | Z_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_05(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADC Rd, Rs */ +{ + UINT32 rn, rs, rd, op2; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + op2=(GET_CPSR & C_MASK) ? 1 : 0; + rn=GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs) + op2; + HandleThumbALUAddFlags(rn, GET_REGISTER(cpustate, rd), (GET_REGISTER(cpustate, rs))); // ? + SET_REGISTER(cpustate, rd, rn); + +} + +const void tg04_00_06(arm_state *cpustate, UINT32 pc, UINT32 insn) /* SBC Rd, Rs */ +{ + UINT32 rn, rs, rd, op2; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + op2=(GET_CPSR & C_MASK) ? 0 : 1; + rn=GET_REGISTER(cpustate, rd) - GET_REGISTER(cpustate, rs) - op2; + HandleThumbALUSubFlags(rn, GET_REGISTER(cpustate, rd), (GET_REGISTER(cpustate, rs))); //? + SET_REGISTER(cpustate, rd, rn); + +} + +const void tg04_00_07(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ROR Rd, Rs */ +{ + UINT32 rs, rd, imm, rrd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrd = GET_REGISTER(cpustate, rd); + imm = GET_REGISTER(cpustate, rs) & 0x0000001f; + SET_REGISTER(cpustate, rd, (rrd >> imm) | (rrd << (32 - imm))); + if (rrd & (1 << (imm - 1))) + { + SET_CPSR(GET_CPSR | C_MASK); + } + else + { + SET_CPSR(GET_CPSR & ~C_MASK); + } + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_08(arm_state *cpustate, UINT32 pc, UINT32 insn) /* TST Rd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd) & GET_REGISTER(cpustate, rs))); + R15 += 2; + +} + +const void tg04_00_09(arm_state *cpustate, UINT32 pc, UINT32 insn) /* NEG Rd, Rs */ +{ + UINT32 rn, rs, rd, rrs; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rrs = GET_REGISTER(cpustate, rs); + rn = 0 - rrs; + SET_REGISTER(cpustate, rd, rn); + HandleThumbALUSubFlags(GET_REGISTER(cpustate, rd), 0, rrs); + +} + +const void tg04_00_0a(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMP Rd, Rs */ +{ + UINT32 rn, rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rn = GET_REGISTER(cpustate, rd) - GET_REGISTER(cpustate, rs); + HandleThumbALUSubFlags(rn, GET_REGISTER(cpustate, rd), GET_REGISTER(cpustate, rs)); + +} + + +const void tg04_00_0b(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMN Rd, Rs - check flags, add dasm */ +{ + UINT32 rn, rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rn = GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs); + HandleThumbALUAddFlags(rn, GET_REGISTER(cpustate, rd), GET_REGISTER(cpustate, rs)); + +} + +const void tg04_00_0c(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ORR Rd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) | GET_REGISTER(cpustate, rs)); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +const void tg04_00_0d(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MUL Rd, Rs */ +{ + UINT32 rn, rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + rn = GET_REGISTER(cpustate, rd) * GET_REGISTER(cpustate, rs); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_REGISTER(cpustate, rd, rn); + SET_CPSR(GET_CPSR | HandleALUNZFlags(rn)); + R15 += 2; + +} + +const void tg04_00_0e(arm_state *cpustate, UINT32 pc, UINT32 insn) /* BIC Rd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) & (~GET_REGISTER(cpustate, rs))); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} +const void tg04_00_0f(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MVN Rd, Rs */ +{ + UINT32 rs, rd, op2; + + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + op2 = GET_REGISTER(cpustate, rs); + SET_REGISTER(cpustate, rd, ~op2); + SET_CPSR(GET_CPSR & ~(Z_MASK | N_MASK)); + SET_CPSR(GET_CPSR | HandleALUNZFlags(GET_REGISTER(cpustate, rd))); + R15 += 2; + +} + +/* ADD Rd, Rs group */ + +const void tg04_01_00(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 rs, rd; +// rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; +// rd = insn & THUMB_HIREG_RD; + + + fatalerror("%08x: G4-1-0 Undefined Thumb instruction: %04x %x\n", pc, insn, (insn & THUMB_HIREG_H) >> THUMB_HIREG_H_SHIFT); + + R15 += 2; + +} + +const void tg04_01_01(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, HRs */ +{ + UINT32 rs, rd; + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + + + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) + GET_REGISTER(cpustate, rs+8)); + // emulate the effects of pre-fetch + if (rs == 7) + { + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rd) + 4); + } + + R15 += 2; +} + +const void tg04_01_02(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD HRd, Rs */ +{ + UINT32 rs, rd; + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + + + SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + GET_REGISTER(cpustate, rs)); + if (rd == 7) + { + R15 += 2; + } + + R15 += 2; +} + +const void tg04_01_03(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Add HRd, HRs */ +{ + UINT32 rs, rd; + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + + + SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + GET_REGISTER(cpustate, rs+8)); + // emulate the effects of pre-fetch + if (rs == 7) + { + SET_REGISTER(cpustate, rd+8, GET_REGISTER(cpustate, rd+8) + 4); + } + if (rd == 7) + { + R15 += 2; + } + + R15 += 2; +} + + +const void tg04_01_10(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMP Rd, Rs */ +{ + UINT32 rn, rs, rd; + + rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT)); + rd = GET_REGISTER(cpustate, insn & THUMB_HIREG_RD); + rn = rd - rs; + HandleThumbALUSubFlags(rn, rd, rs); + +} + +const void tg04_01_11(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMP Rd, Hs */ +{ + UINT32 rn, rs, rd; + + rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); + rd = GET_REGISTER(cpustate, insn & THUMB_HIREG_RD); + rn = rd - rs; + HandleThumbALUSubFlags(rn, rd, rs); + +} + +const void tg04_01_12(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMP Hd, Rs */ +{ + UINT32 rn, rs, rd; + + rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT)); + rd = GET_REGISTER(cpustate, (insn & THUMB_HIREG_RD) + 8); + rn = rd - rs; + HandleThumbALUSubFlags(rn, rd, rs); + +} + +const void tg04_01_13(arm_state *cpustate, UINT32 pc, UINT32 insn) /* CMP Hd, Hs */ +{ + UINT32 rn, rs, rd; + + rs = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); + rd = GET_REGISTER(cpustate, (insn & THUMB_HIREG_RD) + 8); + rn = rd - rs; + HandleThumbALUSubFlags(rn, rd, rs); + +} + + /* MOV group */ + +// "The action of H1 = 0, H2 = 0 for Op = 00 (ADD), Op = 01 (CMP) and Op = 10 (MOV) is undefined, and should not be used." +const void tg04_01_20(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MOV Rd, Rs (undefined) */ +{ + UINT32 rs, rd; + + + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs)); + R15 += 2; + +} + +const void tg04_01_21(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MOV Rd, Hs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + if (rs == 7) + { + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs + 8) + 4); + } + else + { + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, rs + 8)); + } + R15 += 2; + +} + +const void tg04_01_22(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MOV Hd, Rs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs)); + if (rd != 7) + { + R15 += 2; + } + else + { + R15 &= ~1; + } + +} + +const void tg04_01_23(arm_state *cpustate, UINT32 pc, UINT32 insn) /* MOV Hd, Hs */ +{ + UINT32 rs, rd; + + rs = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + rd = insn & THUMB_HIREG_RD; + if (rs == 7) + { + SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs+8)+4); + } + else + { + SET_REGISTER(cpustate, rd + 8, GET_REGISTER(cpustate, rs+8)); + } + if (rd != 7) + { + R15 += 2; + } + if (rd == 7) + { + R15 &= ~1; + } + +} + + +const void tg04_01_30(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 addr; + UINT32 rd; + + + rd = (insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT; + addr = GET_REGISTER(cpustate, rd); + if (addr & 1) + { + addr &= ~1; + } + else + { + SET_CPSR(GET_CPSR & ~T_MASK); + if (addr & 2) + { + addr += 2; + } + } + R15 = addr; + +} + +const void tg04_01_31(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 addr; + + + addr = GET_REGISTER(cpustate, ((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8); + if ((((insn & THUMB_HIREG_RS) >> THUMB_HIREG_RS_SHIFT) + 8) == 15) + { + addr += 2; + } + if (addr & 1) + { + addr &= ~1; + } + else + { + SET_CPSR(GET_CPSR & ~T_MASK); + if (addr & 2) + { + addr += 2; + } + } + R15 = addr; + +} + +const void tg04_01_32(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// UINT32 rd; + + + fatalerror("%08x: G4-3 Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg04_01_33(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// UINT32 rd; + + + fatalerror("%08x: G4-3 Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + + + + + + +const void tg04_0203(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 readword; + + readword = READ32((R15 & ~2) + 4 + ((insn & THUMB_INSN_IMM) << 2)); + SET_REGISTER(cpustate, (insn & THUMB_INSN_IMM_RD) >> THUMB_INSN_IMM_RD_SHIFT, readword); + R15 += 2; +} + +/* LDR* STR* group */ + +const void tg05_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* STR Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + WRITE32(addr, GET_REGISTER(cpustate, rd)); + R15 += 2; + +} + +const void tg05_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* STRH Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + WRITE16(addr, GET_REGISTER(cpustate, rd)); + R15 += 2; + +} + +const void tg05_2(arm_state *cpustate, UINT32 pc, UINT32 insn) /* STRB Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + WRITE8(addr, GET_REGISTER(cpustate, rd)); + R15 += 2; + +} + +const void tg05_3(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LDSB Rd, [Rn, Rm] todo, add dasm */ +{ + UINT32 addr; + UINT32 rm, rn, rd, op2; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + op2 = READ8(addr); + if (op2 & 0x00000080) + { + op2 |= 0xffffff00; + } + SET_REGISTER(cpustate, rd, op2); + R15 += 2; + +} + +const void tg05_4(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LDR Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd, op2; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + op2 = READ32(addr); + SET_REGISTER(cpustate, rd, op2); + R15 += 2; + +} + +const void tg05_5(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LDRH Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd, op2; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + op2 = READ16(addr); + SET_REGISTER(cpustate, rd, op2); + R15 += 2; + +} + +const void tg05_6(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LDRB Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd, op2; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + op2 = READ8(addr); + SET_REGISTER(cpustate, rd, op2); + R15 += 2; + +} + +const void tg05_7(arm_state *cpustate, UINT32 pc, UINT32 insn) /* LDSH Rd, [Rn, Rm] */ +{ + UINT32 addr; + UINT32 rm, rn, rd, op2; + + rm = (insn & THUMB_GROUP5_RM) >> THUMB_GROUP5_RM_SHIFT; + rn = (insn & THUMB_GROUP5_RN) >> THUMB_GROUP5_RN_SHIFT; + rd = (insn & THUMB_GROUP5_RD) >> THUMB_GROUP5_RD_SHIFT; + addr = GET_REGISTER(cpustate, rn) + GET_REGISTER(cpustate, rm); + op2 = READ16(addr); + if (op2 & 0x00008000) + { + op2 |= 0xffff0000; + } + SET_REGISTER(cpustate, rd, op2); + R15 += 2; + +} + + /* Word Store w/ Immediate Offset */ + +const void tg06_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Store */ +{ + UINT32 rn, rd; + INT32 offs; + + rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = insn & THUMB_ADDSUB_RD; + offs = ((insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT) << 2; + WRITE32(GET_REGISTER(cpustate, rn) + offs, GET_REGISTER(cpustate, rd)); + R15 += 2; +} + +const void tg06_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Load */ +{ + UINT32 rn, rd; + INT32 offs; + + rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = insn & THUMB_ADDSUB_RD; + offs = ((insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT) << 2; + SET_REGISTER(cpustate, rd, READ32(GET_REGISTER(cpustate, rn) + offs)); // fix + R15 += 2; +} + +/* Byte Store w/ Immeidate Offset */ + +const void tg07_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Store */ +{ + UINT32 rn, rd; + INT32 offs; + + rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = insn & THUMB_ADDSUB_RD; + offs = (insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT; + WRITE8(GET_REGISTER(cpustate, rn) + offs, GET_REGISTER(cpustate, rd)); + R15 += 2; +} + +const void tg07_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Load */ +{ + UINT32 rn, rd; + INT32 offs; + + rn = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = insn & THUMB_ADDSUB_RD; + offs = (insn & THUMB_LSOP_OFFS) >> THUMB_LSOP_OFFS_SHIFT; + SET_REGISTER(cpustate, rd, READ8(GET_REGISTER(cpustate, rn) + offs)); + R15 += 2; +} + +/* Load/Store Halfword */ + +const void tg08_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Store */ +{ + UINT32 rs, rd, imm; + + imm = (insn & THUMB_HALFOP_OFFS) >> THUMB_HALFOP_OFFS_SHIFT; + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + WRITE16(GET_REGISTER(cpustate, rs) + (imm << 1), GET_REGISTER(cpustate, rd)); + R15 += 2; +} + +const void tg08_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Load */ +{ + UINT32 rs, rd, imm; + + imm = (insn & THUMB_HALFOP_OFFS) >> THUMB_HALFOP_OFFS_SHIFT; + rs = (insn & THUMB_ADDSUB_RS) >> THUMB_ADDSUB_RS_SHIFT; + rd = (insn & THUMB_ADDSUB_RD) >> THUMB_ADDSUB_RD_SHIFT; + SET_REGISTER(cpustate, rd, READ16(GET_REGISTER(cpustate, rs) + (imm << 1))); + R15 += 2; +} + + /* Stack-Relative Load/Store */ + +const void tg09_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Store */ +{ + UINT32 rd; + INT32 offs; + + rd = (insn & THUMB_STACKOP_RD) >> THUMB_STACKOP_RD_SHIFT; + offs = (UINT8)(insn & THUMB_INSN_IMM); + WRITE32(GET_REGISTER(cpustate, 13) + ((UINT32)offs << 2), GET_REGISTER(cpustate, rd)); + R15 += 2; +} + +const void tg09_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Load */ +{ + UINT32 readword; + UINT32 rd; + INT32 offs; + + rd = (insn & THUMB_STACKOP_RD) >> THUMB_STACKOP_RD_SHIFT; + offs = (UINT8)(insn & THUMB_INSN_IMM); + readword = READ32(GET_REGISTER(cpustate, 13) + ((UINT32)offs << 2)); + SET_REGISTER(cpustate, rd, readword); + R15 += 2; +} + + /* Get relative address */ + +const void tg0a_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, PC, #nn */ +{ + UINT32 rd; + INT32 offs; + + rd = (insn & THUMB_RELADDR_RD) >> THUMB_RELADDR_RD_SHIFT; + offs = (UINT8)(insn & THUMB_INSN_IMM) << 2; + SET_REGISTER(cpustate, rd, ((R15 + 4) & ~2) + offs); + R15 += 2; +} + +const void tg0a_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD Rd, SP, #nn */ +{ + UINT32 rd; + INT32 offs; + + rd = (insn & THUMB_RELADDR_RD) >> THUMB_RELADDR_RD_SHIFT; + offs = (UINT8)(insn & THUMB_INSN_IMM) << 2; + SET_REGISTER(cpustate, rd, GET_REGISTER(cpustate, 13) + offs); + R15 += 2; +} + + /* Stack-Related Opcodes */ + +const void tg0b_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* ADD SP, #imm */ +{ + UINT32 addr; + + + addr = (insn & THUMB_INSN_IMM); + addr &= ~THUMB_INSN_IMM_S; + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + ((insn & THUMB_INSN_IMM_S) ? -(addr << 2) : (addr << 2))); + R15 += 2; + +} + +const void tg0b_1(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_2(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_3(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_4(arm_state *cpustate, UINT32 pc, UINT32 insn) /* PUSH {Rlist} */ +{ + INT32 offs; + + for (offs = 7; offs >= 0; offs--) + { + if (insn & (1 << offs)) + { + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); + WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, offs)); + } + } + R15 += 2; + +} + +const void tg0b_5(arm_state *cpustate, UINT32 pc, UINT32 insn) /* PUSH {Rlist}{LR} */ +{ + INT32 offs; + + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); + WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, 14)); + for (offs = 7; offs >= 0; offs--) + { + if (insn & (1 << offs)) + { + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) - 4); + WRITE32(GET_REGISTER(cpustate, 13), GET_REGISTER(cpustate, offs)); + } + } + R15 += 2; + +} + +const void tg0b_6(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_7(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_8(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_9(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_a(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_b(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_c(arm_state *cpustate, UINT32 pc, UINT32 insn) /* POP {Rlist} */ +{ + INT32 offs; + + for (offs = 0; offs < 8; offs++) + { + if (insn & (1 << offs)) + { + SET_REGISTER(cpustate, offs, READ32(GET_REGISTER(cpustate, 13))); + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); + } + } + R15 += 2; + +} + +const void tg0b_d(arm_state *cpustate, UINT32 pc, UINT32 insn) /* POP {Rlist}{PC} */ +{ + INT32 offs; + + for (offs = 0; offs < 8; offs++) + { + if (insn & (1 << offs)) + { + SET_REGISTER(cpustate, offs, READ32(GET_REGISTER(cpustate, 13))); + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); + } + } + R15 = READ32(GET_REGISTER(cpustate, 13)) & ~1; + SET_REGISTER(cpustate, 13, GET_REGISTER(cpustate, 13) + 4); + +} + +const void tg0b_e(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +const void tg0b_f(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ +// UINT32 addr; +// INT32 offs; + + fatalerror("%08x: Gb Undefined Thumb instruction: %04x\n", pc, insn); + R15 += 2; + +} + +/* Multiple Load/Store */ + +// "The address should normally be a word aligned quantity and non-word aligned addresses do not affect the instruction." +// "However, the bottom 2 bits of the address will appear on A[1:0] and might be interpreted by the memory system." + +// GBA "BB Ball" performs an unaligned read with A[1:0] = 2 and expects A[1] not to be ignored [BP 800B90A,(R4&3)!=0] +// GBA "Gadget Racers" performs an unaligned read with A[1:0] = 1 and expects A[0] to be ignored [BP B72,(R0&3)!=0] + +const void tg0c_0(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Store */ +{ + UINT32 rd; + INT32 offs; + + UINT32 ld_st_address; + + rd = (insn & THUMB_MULTLS_BASE) >> THUMB_MULTLS_BASE_SHIFT; + + + ld_st_address = GET_REGISTER(cpustate, rd); + + for (offs = 0; offs < 8; offs++) + { + if (insn & (1 << offs)) + { + WRITE32(ld_st_address & ~3, GET_REGISTER(cpustate, offs)); + ld_st_address += 4; + } + } + SET_REGISTER(cpustate, rd, ld_st_address); + R15 += 2; +} + + +const void tg0c_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* Load */ +{ + UINT32 rd; + INT32 offs; + + UINT32 ld_st_address; + + rd = (insn & THUMB_MULTLS_BASE) >> THUMB_MULTLS_BASE_SHIFT; + + + ld_st_address = GET_REGISTER(cpustate, rd); + + + int rd_in_list; + + rd_in_list = insn & (1 << rd); + for (offs = 0; offs < 8; offs++) + { + if (insn & (1 << offs)) + { + SET_REGISTER(cpustate, offs, READ32(ld_st_address & ~1)); + ld_st_address += 4; + } + } + + if (!rd_in_list) + SET_REGISTER(cpustate, rd, ld_st_address); + + R15 += 2; +} + +/* Conditional Branch */ + +const void tg0d_0(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_EQ: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (Z_IS_SET(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_1(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_NE: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (Z_IS_CLEAR(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_2(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_CS: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (C_IS_SET(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_3(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_CC: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (C_IS_CLEAR(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_4(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_MI: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (N_IS_SET(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_5(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_PL: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (N_IS_CLEAR(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_6(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_VS: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (V_IS_SET(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_7(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_VC: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (V_IS_CLEAR(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_8(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_HI: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (C_IS_SET(GET_CPSR) && Z_IS_CLEAR(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_9(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_LS: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (C_IS_CLEAR(GET_CPSR) || Z_IS_SET(GET_CPSR)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_a(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_GE: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (!(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_b(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_LT: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (!(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_c(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_GT: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (Z_IS_CLEAR(GET_CPSR) && !(GET_CPSR & N_MASK) == !(GET_CPSR & V_MASK)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_d(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_LE: +{ + INT32 offs; + + offs = (INT8)(insn & THUMB_INSN_IMM); +//case + if (Z_IS_SET(GET_CPSR) || !(GET_CPSR & N_MASK) != !(GET_CPSR & V_MASK)) + { + R15 += 4 + (offs << 1); + } + else + { + R15 += 2; + } + +} + +const void tg0d_e(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_AL: +{ +// INT32 offs; + +// offs = (INT8)(insn & THUMB_INSN_IMM); +//case + fatalerror("%08x: Undefined Thumb instruction: %04x (ARM9 reserved)\n", pc, insn); + R15 += 2; + +} + +const void tg0d_f(arm_state *cpustate, UINT32 pc, UINT32 insn) // COND_NV: // SWI (this is sort of a "hole" in the opcode encoding) +{ +// INT32 offs; + +// offs = (INT8)(insn & THUMB_INSN_IMM); + +//case + cpustate->pendingSwi = 1; + ARM7_CHECKIRQ; + +} + + /* B #offs */ + +const void tg0e_0(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + INT32 offs; + + offs = (insn & THUMB_BRANCH_OFFS) << 1; + if (offs & 0x00000800) + { + offs |= 0xfffff800; + } + R15 += 4 + offs; +} + + +const void tg0e_1(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 addr; + + addr = GET_REGISTER(cpustate, 14); + addr += (insn & THUMB_BLOP_OFFS) << 1; + addr &= 0xfffffffc; + SET_REGISTER(cpustate, 14, (R15 + 4) | 1); + R15 = addr; +} + + /* BL */ + +const void tg0f_0(arm_state *cpustate, UINT32 pc, UINT32 insn) +{ + UINT32 addr; + + addr = (insn & THUMB_BLOP_OFFS) << 12; + if (addr & (1 << 22)) + { + addr |= 0xff800000; + } + addr += R15 + 4; + SET_REGISTER(cpustate, 14, addr); + R15 += 2; +} + + +const void tg0f_1(arm_state *cpustate, UINT32 pc, UINT32 insn) /* BL */ +{ + UINT32 addr; + + addr = GET_REGISTER(cpustate, 14) & ~1; + addr += (insn & THUMB_BLOP_OFFS) << 1; + SET_REGISTER(cpustate, 14, (R15 + 2) | 1); + R15 = addr; + //R15 += 2; +} diff -Nru mame-0.144/src/emu/cpu/arm7/arm7thmb.h mame-0.145/src/emu/cpu/arm7/arm7thmb.h --- mame-0.144/src/emu/cpu/arm7/arm7thmb.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/cpu/arm7/arm7thmb.h 2012-02-06 21:30:23.000000000 +0000 @@ -0,0 +1,104 @@ + + + +const void tg00_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg00_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg01_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg01_10(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg01_11(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg01_12(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg01_13(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg02_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg02_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg03_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg03_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_00(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_01(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_02(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_03(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_04(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_05(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_06(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_07(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_08(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_09(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0a(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0b(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0c(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0d(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0e(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_00_0f(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_00(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_01(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_02(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_03(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_10(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_11(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_12(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_13(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_20(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_21(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_22(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_23(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_30(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_31(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_32(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_01_33(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg04_0203(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_2(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_3(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_4(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_5(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_6(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg05_7(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg06_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg06_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg07_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg07_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg08_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg08_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg09_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg09_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0a_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0a_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_2(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_3(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_4(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_5(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_6(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_7(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_8(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_9(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_a(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_b(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_c(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_d(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_e(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0b_f(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0c_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0c_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_2(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_3(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_4(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_5(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_6(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_7(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_8(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_9(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_a(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_b(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_c(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_d(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_e(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0d_f(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0e_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0e_1(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0f_0(arm_state *cpustate, UINT32 pc, UINT32 insn); +const void tg0f_1(arm_state *cpustate, UINT32 pc, UINT32 insn); + diff -Nru mame-0.144/src/emu/cpu/cpu.mak mame-0.145/src/emu/cpu/cpu.mak --- mame-0.144/src/emu/cpu/cpu.mak 2012-01-13 15:34:17.000000000 +0000 +++ mame-0.145/src/emu/cpu/cpu.mak 2012-02-06 21:30:23.000000000 +0000 @@ -79,6 +79,8 @@ ifneq ($(filter ARM7,$(CPUS)),) OBJDIRS += $(CPUOBJ)/arm7 CPUOBJS += $(CPUOBJ)/arm7/arm7.o +CPUOBJS += $(CPUOBJ)/arm7/arm7thmb.o +CPUOBJS += $(CPUOBJ)/arm7/arm7ops.o DASMOBJS += $(CPUOBJ)/arm7/arm7dasm.o endif @@ -87,10 +89,20 @@ $(CPUOBJ)/arm7/arm7.o: $(CPUSRC)/arm7/arm7.c \ $(CPUSRC)/arm7/arm7.h \ - $(CPUSRC)/arm7/arm7exec.c \ + $(CPUSRC)/arm7/arm7help.h \ + $(CPUSRC)/arm7/arm7thmb.c \ + $(CPUSRC)/arm7/arm7ops.c \ $(CPUSRC)/arm7/arm7core.c +$(CPUOBJ)/arm7/arm7ops.o: $(CPUSRC)/arm7/arm7ops.c \ + $(CPUSRC)/arm7/arm7.h \ + $(CPUSRC)/arm7/arm7help.h \ + $(CPUSRC)/arm7/arm7core.h \ +$(CPUOBJ)/arm7/arm7thmb.o: $(CPUSRC)/arm7/arm7thmb.c \ + $(CPUSRC)/arm7/arm7.h \ + $(CPUSRC)/arm7/arm7help.h \ + $(CPUSRC)/arm7/arm7core.h \ #------------------------------------------------- # Advanced Digital Chips SE3208 diff -Nru mame-0.144/src/emu/cpu/e132xs/32xsdasm.c mame-0.145/src/emu/cpu/e132xs/32xsdasm.c --- mame-0.144/src/emu/cpu/e132xs/32xsdasm.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/e132xs/32xsdasm.c 2012-02-06 21:30:24.000000000 +0000 @@ -1643,8 +1643,8 @@ break; default: - sprintf(buffer, "Ext. OP $%x", extended_op); - logerror(buffer, "Illegal Extended Opcode: %x\n", extended_op); + sprintf(buffer, "Ext. OP $%X @ %X\n", extended_op, pc); + logerror(buffer, "Illegal Extended Opcode: %X @ %X\n", extended_op, pc); break; } diff -Nru mame-0.144/src/emu/cpu/esrip/esrip.c mame-0.145/src/emu/cpu/esrip/esrip.c --- mame-0.144/src/emu/cpu/esrip/esrip.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/esrip/esrip.c 2012-02-06 21:30:23.000000000 +0000 @@ -1618,7 +1618,7 @@ default: INVALID; } - cpustate->ct = res && 1; + cpustate->ct = res ? 1 : 0; } diff -Nru mame-0.144/src/emu/cpu/h6280/h6280ops.h mame-0.145/src/emu/cpu/h6280/h6280ops.h --- mame-0.144/src/emu/cpu/h6280/h6280ops.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/h6280/h6280ops.h 2012-02-06 21:30:23.000000000 +0000 @@ -27,7 +27,7 @@ #define P cpustate->p #define S cpustate->sp.b.l -#define TRANSLATED(addr) ((cpustate->mmr[(addr)>>13] << 13) | ((addr)&0x1fff)) +#define TRANSLATED(addr) ((cpustate->mmr[(addr)>>13&7] << 13) | ((addr)&0x1fff)) #define H6280_CYCLES(cyc) \ { \ cpustate->ICount -= ((cyc) * cpustate->clocks_per_cycle); \ diff -Nru mame-0.144/src/emu/cpu/hd61700/hd61700.c mame-0.145/src/emu/cpu/hd61700/hd61700.c --- mame-0.144/src/emu/cpu/hd61700/hd61700.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/hd61700/hd61700.c 2012-02-06 21:30:25.000000000 +0000 @@ -103,7 +103,7 @@ : cpu_device(mconfig, HD61700, "HD61700", tag, owner, clock), m_program_config("program", ENDIANNESS_BIG, 16, 18, -1) { - memset(&m_partial_frame_period, 0, sizeof(m_partial_frame_period)); + // ... } diff -Nru mame-0.144/src/emu/cpu/i386/i386.c mame-0.145/src/emu/cpu/i386/i386.c --- mame-0.144/src/emu/cpu/i386/i386.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386.c 2012-02-06 21:30:23.000000000 +0000 @@ -27,8 +27,8 @@ static void i286_task_switch(i386_state* cpustate, UINT16 selector, UINT8 nested); static void i386_task_switch(i386_state* cpustate, UINT16 selector, UINT8 nested); -#define FAULT(fault,error) {i386_trap_with_error(cpustate,fault,0,0,error); return;} -#define FAULT_EXP(fault,error) {i386_trap_with_error(cpustate,fault,0,trap_level+1,error); return;} +#define FAULT(fault,error) {cpustate->ext = 1; i386_trap_with_error(cpustate,fault,0,0,error); return;} +#define FAULT_EXP(fault,error) {cpustate->ext = 1; i386_trap_with_error(cpustate,fault,0,trap_level+1,error); return;} /*************************************************************************/ @@ -49,9 +49,9 @@ limit = cpustate->gdtr.limit; } - if (limit == 0 || seg->selector + 7 > limit) - return; entry = seg->selector & ~0x7; + if (limit == 0 || entry + 7 > limit) + return; v1 = READ32(cpustate, base + entry ); v2 = READ32(cpustate, base + entry + 4 ); @@ -62,6 +62,7 @@ if (seg->flags & 0x8000) seg->limit = (seg->limit << 12) | 0xfff; seg->d = (seg->flags & 0x4000) ? 1 : 0; + seg->valid = (seg->selector & ~3)?(true):(false); } static void i386_load_call_gate(i386_state* cpustate, I386_CALL_GATE *gate) @@ -79,10 +80,9 @@ limit = cpustate->gdtr.limit; } - if (limit == 0 || gate->segment + 7 > limit) - return; - entry = gate->segment & ~0x7; + if (limit == 0 || entry + 7 > limit) + return; v1 = READ32(cpustate, base + entry ); v2 = READ32(cpustate, base + entry + 4 ); @@ -107,11 +107,15 @@ cpustate->sreg[segment].base = cpustate->sreg[segment].selector << 4; cpustate->sreg[segment].limit = 0xffff; cpustate->sreg[segment].flags = (segment == CS) ? 0x009a : 0x0092; + cpustate->sreg[segment].d = 0; + cpustate->sreg[segment].valid = true; } } else { cpustate->sreg[segment].base = cpustate->sreg[segment].selector << 4; + cpustate->sreg[segment].d = 0; + cpustate->sreg[segment].valid = true; if( segment == CS && !cpustate->performed_intersegment_jump ) cpustate->sreg[segment].base |= 0xfff00000; @@ -167,7 +171,13 @@ f |= cpustate->IOP1 << 12; f |= cpustate->IOP2 << 13; f |= cpustate->NT << 14; - return (cpustate->eflags & cpustate->eflags_mask) | (f & 0xffff); + f |= cpustate->RF << 16; + f |= cpustate->VM << 17; + f |= cpustate->AC << 18; + f |= cpustate->VIF << 19; + f |= cpustate->VIP << 20; + f |= cpustate->ID << 21; + return (cpustate->eflags & ~cpustate->eflags_mask) | (f & cpustate->eflags_mask); } static void set_flags(i386_state *cpustate, UINT32 f ) @@ -184,6 +194,12 @@ cpustate->IOP1 = (f & 0x1000) ? 1 : 0; cpustate->IOP2 = (f & 0x2000) ? 1 : 0; cpustate->NT = (f & 0x4000) ? 1 : 0; + cpustate->RF = (f & 0x10000) ? 1 : 0; + cpustate->VM = (f & 0x20000) ? 1 : 0; + cpustate->AC = (f & 0x40000) ? 1 : 0; + cpustate->VIF = (f & 0x80000) ? 1 : 0; + cpustate->VIP = (f & 0x100000) ? 1 : 0; + cpustate->ID = (f & 0x200000) ? 1 : 0; cpustate->eflags = f & cpustate->eflags_mask; } @@ -323,12 +339,12 @@ return ea; } -static UINT32 GetEA(i386_state *cpustate,UINT8 modrm) +static UINT32 GetEA(i386_state *cpustate,UINT8 modrm, int rwn) { UINT8 segment; UINT32 ea; modrm_to_EA(cpustate, modrm, &ea, &segment ); - return i386_translate(cpustate, segment, ea ); + return i386_translate(cpustate, segment, ea, rwn ); } /* Check segment register for validity when changing privilege level after an RETF */ @@ -379,6 +395,149 @@ } } +static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset) +{ + if(PROTECTED_MODE && !V8086_MODE) + { + if((cpustate->sreg[seg].flags & 0x0018) == 0x0010 && cpustate->sreg[seg].flags & 0x0004) // if expand-down data segment + { + if(offset <= cpustate->sreg[seg].limit) + { + logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x (expand-down)\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset); + return 1; + } + } + else + { + if(offset > cpustate->sreg[seg].limit) + { + logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset); + return 1; + } + } + } + return 0; +} + +static void i386_protected_mode_sreg_load(i386_state *cpustate, UINT16 selector, UINT8 reg) +{ + // Checks done when MOV changes a segment register in protected mode + UINT8 CPL,RPL,DPL; + + CPL = cpustate->CPL; + RPL = selector & 0x0003; + + if(reg == SS) + { + I386_SREG stack; + + memset(&stack, 0, sizeof(stack)); + stack.selector = selector; + i386_load_protected_mode_segment(cpustate,&stack); + DPL = (stack.flags >> 5) & 0x03; + + if((selector & ~0x0003) == 0) + { + logerror("SReg Load (%08x): Selector is null.\n",cpustate->pc); + FAULT(FAULT_GP,0) + } + if(selector & 0x0004) // LDT + { + if((selector & ~0x0007) > cpustate->ldtr.limit) + { + logerror("SReg Load (%08x): Selector is out of LDT bounds.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + else // GDT + { + if((selector & ~0x0007) > cpustate->gdtr.limit) + { + logerror("SReg Load (%08x): Selector is out of GDT bounds.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + if (RPL != CPL) + { + logerror("SReg Load (%08x): Selector RPL does not equal CPL.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + if(((stack.flags & 0x0018) != 0x10) && (stack.flags & 0x0002) != 0) + { + logerror("SReg Load (%08x): Segment is not a writable data segment.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + if(DPL != CPL) + { + logerror("SReg Load (%08x): Segment DPL does not equal CPL.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + if(!(stack.flags & 0x0080)) + { + logerror("SReg Load (%08x): Segment is not present.\n",cpustate->pc); + FAULT(FAULT_SS,selector & ~0x03) + } + } + if(reg == DS || reg == ES || reg == FS || reg == GS) + { + I386_SREG desc; + + if((selector & ~0x0003) == 0) + { + cpustate->sreg[reg].selector = selector; + i386_load_segment_descriptor(cpustate, reg ); + return; + } + + memset(&desc, 0, sizeof(desc)); + desc.selector = selector; + i386_load_protected_mode_segment(cpustate,&desc); + DPL = (desc.flags >> 5) & 0x03; + + if(selector & 0x0004) // LDT + { + if((selector & ~0x0007) > cpustate->ldtr.limit) + { + logerror("SReg Load (%08x): Selector is out of LDT bounds.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + else // GDT + { + if((selector & ~0x0007) > cpustate->gdtr.limit) + { + logerror("SReg Load (%08x): Selector is out of GDT bounds.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + if((desc.flags & 0x0018) != 0x10) + { + if(((desc.flags & 0x0002) != 0) && ((desc.flags & 0x0018) != 0x18)) + { + logerror("SReg Load (%08x): Segment is not a data segment or readable code segment.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + if(((desc.flags & 0x0018) == 0x10) || ((!(desc.flags & 0x0004)) && ((desc.flags & 0x0018) == 0x18))) + { + // if data or non-conforming code segment + if((RPL > DPL) || (CPL > DPL)) + { + logerror("SReg Load (%08x): Selector RPL or CPL is not less or equal to segment DPL.\n",cpustate->pc); + FAULT(FAULT_GP,selector & ~0x03) + } + } + if(!(desc.flags & 0x0080)) + { + logerror("SReg Load (%08x): Segment is not present.\n",cpustate->pc); + FAULT(FAULT_NP,selector & ~0x03) + } + } + + cpustate->sreg[reg].selector = selector; + i386_load_segment_descriptor(cpustate, reg ); +} + static void i386_trap(i386_state *cpustate,int irq, int irq_gate, int trap_level) { /* I386 Interrupts/Traps/Faults: @@ -428,7 +587,7 @@ int type; UINT16 flags; I386_SREG desc; - UINT8 CPL = 0, DPL = 0; //, RPL = 0; + UINT8 CPL = cpustate->CPL, DPL = 0; //, RPL = 0; I386_CALL_GATE gate; /* 32-bit */ @@ -451,21 +610,27 @@ return; } - // TODO: support for EXT bit /* segment privilege checks */ - if(entry > cpustate->idtr.limit) + if(entry >= cpustate->idtr.limit) { - logerror("IRQ: Vector is past IDT limit.\n"); + logerror("IRQ (%08x): Vector %02xh is past IDT limit.\n",cpustate->pc,entry); FAULT_EXP(FAULT_GP,entry+2) } /* segment must be interrupt gate, trap gate, or task gate */ if(type != 0x05 && type != 0x06 && type != 0x07 && type != 0x0e && type != 0x0f) { - logerror("IRQ: Vector segment is not an interrupt, trap or task gate.\n"); + logerror("IRQ#%i (%08x): Vector segment %04x is not an interrupt, trap or task gate.\n",irq,cpustate->pc,segment); FAULT_EXP(FAULT_GP,entry+2) } - /* TODO: if software IRQ, then gate DPL must be less than CPL, else #GP(vector*8+2+EXT) */ + if(cpustate->ext == 0) // if software interrupt (caused by INT/INTO/INT3) + { + if(((flags >> 5) & 0x03) < CPL) + { + logerror("IRQ (%08x): Software IRQ - gate DPL is less than CPL.\n",cpustate->pc); + FAULT_EXP(FAULT_GP,entry+2) + } + } if((flags & 0x0080) == 0) { @@ -473,6 +638,56 @@ FAULT_EXP(FAULT_NP,entry+2) } + if(V8086_MODE) + { + UINT32 tempflags; + UINT32 tempESP,tempSS; + /* Interrupt for a Virtual 8086 task */ + + logerror("IRQ (%08x): Interrupt during V8086 task\n",cpustate->pc); + tempflags = get_flags(cpustate); + cpustate->VM = 0; + cpustate->TF = 0; + cpustate->NT = 0; + if(type == 0x0e || type == 0x06) + cpustate->IF = 0; + tempSS = cpustate->sreg[SS].selector; + tempESP = REG32(ESP); + /* Get privilege level 0 stack pointer from TSS */ + cpustate->sreg[SS].selector = i386_get_stack_segment(cpustate,0); + REG32(ESP) = i386_get_stack_ptr(cpustate,0); + i386_load_segment_descriptor(cpustate,SS); + PUSH32(cpustate,cpustate->sreg[GS].selector & 0xffff); + PUSH32(cpustate,cpustate->sreg[FS].selector & 0xffff); + PUSH32(cpustate,cpustate->sreg[DS].selector & 0xffff); + PUSH32(cpustate,cpustate->sreg[ES].selector & 0xffff); + cpustate->sreg[GS].selector = 0; + cpustate->sreg[FS].selector = 0; + cpustate->sreg[DS].selector = 0; + cpustate->sreg[ES].selector = 0; + i386_load_segment_descriptor(cpustate,GS); + i386_load_segment_descriptor(cpustate,FS); + i386_load_segment_descriptor(cpustate,DS); + i386_load_segment_descriptor(cpustate,ES); + PUSH32(cpustate,tempSS & 0xffff); + PUSH32(cpustate,tempESP); + PUSH32(cpustate,tempflags); + PUSH32(cpustate,cpustate->sreg[CS].selector & 0xffff); + if(irq == 3 || irq == 4 || irq == 9 || irq_gate == 1) + PUSH32(cpustate, cpustate->eip ); + else + PUSH32(cpustate, cpustate->prev_eip ); + + cpustate->sreg[CS].selector = segment; + cpustate->eip = offset; + // CPL set to CS RPL? + cpustate->CPL = segment & 0x03; + + i386_load_segment_descriptor(cpustate,CS); + CHANGE_PC(cpustate,cpustate->eip); + return; + } + if(type == 0x05) { /* Task gate */ @@ -524,14 +739,14 @@ if((segment & ~0x07) == 0) { logerror("IRQ: Gate segment is null.\n"); - FAULT_EXP(FAULT_GP,0) + FAULT_EXP(FAULT_GP,cpustate->ext) } if(segment & 0x04) { if((segment & ~0x07) > cpustate->ldtr.limit) { logerror("IRQ: Gate segment is past LDT limit.\n"); - FAULT_EXP(FAULT_GP,segment) + FAULT_EXP(FAULT_GP,(segment & 0x07)+cpustate->ext) } } else @@ -539,18 +754,18 @@ if((segment & ~0x07) > cpustate->gdtr.limit) { logerror("IRQ: Gate segment is past GDT limit.\n"); - FAULT_EXP(FAULT_GP,segment) + FAULT_EXP(FAULT_GP,(segment & 0x07)+cpustate->ext) } } if((desc.flags & 0x0018) != 0x18) { logerror("IRQ: Gate descriptor is not a code segment.\n"); - FAULT_EXP(FAULT_GP,segment) + FAULT_EXP(FAULT_GP,(segment & 0x07)+cpustate->ext) } if((desc.flags & 0x0080) == 0) { logerror("IRQ: Gate segment is not present.\n"); - FAULT_EXP(FAULT_NP,segment) + FAULT_EXP(FAULT_NP,(segment & 0x07)+cpustate->ext) } if((desc.flags & 0x0004) == 0 && (DPL < CPL)) { @@ -573,14 +788,14 @@ if((stack.selector & ~0x07) == 0) { logerror("IRQ: New stack selector is null.\n"); - FAULT_EXP(FAULT_GP,0) // #GP(EXT) + FAULT_EXP(FAULT_GP,cpustate->ext) } if(stack.selector & 0x04) { if((stack.selector & ~0x07) > cpustate->ldtr.base) { logerror("IRQ: New stack selector is past LDT limit.\n"); - FAULT_EXP(FAULT_TS,stack.selector & ~0x07) + FAULT_EXP(FAULT_TS,(stack.selector & ~0x07)+cpustate->ext) } } else @@ -588,28 +803,28 @@ if((stack.selector & ~0x07) > cpustate->gdtr.base) { logerror("IRQ: New stack selector is past GDT limit.\n"); - FAULT_EXP(FAULT_TS,stack.selector & ~0x07) // #TS(stack selector + EXT) + FAULT_EXP(FAULT_TS,(stack.selector & ~0x07)+cpustate->ext) } } if((stack.selector & 0x03) != DPL) { logerror("IRQ: New stack selector RPL is not equal to code segment DPL.\n"); - FAULT_EXP(FAULT_TS,stack.selector & ~0x07) // #TS(stack selector + EXT) + FAULT_EXP(FAULT_TS,(stack.selector & ~0x07)+cpustate->ext) } if(((stack.flags >> 5) & 0x03) != DPL) { logerror("IRQ: New stack segment DPL is not equal to code segment DPL.\n"); - FAULT_EXP(FAULT_TS,stack.selector & ~0x07) // #TS(stack selector + EXT) + FAULT_EXP(FAULT_TS,(stack.selector & ~0x07)+cpustate->ext) } if(((stack.flags & 0x0018) != 0x10) && (stack.flags & 0x0002) != 0) { logerror("IRQ: New stack segment is not a writable data segment.\n"); - FAULT_EXP(FAULT_TS,stack.selector & ~0x07) // #TS(stack selector + EXT) + FAULT_EXP(FAULT_TS,(stack.selector & ~0x07)+cpustate->ext) // #TS(stack selector + EXT) } if((stack.flags & 0x0080) == 0) { logerror("IRQ: New stack segment is not present.\n"); - FAULT_EXP(FAULT_SS,stack.selector & ~0x07) // #TS(stack selector + EXT) + FAULT_EXP(FAULT_SS,(stack.selector & ~0x07)+cpustate->ext) // #TS(stack selector + EXT) } if(type & 0x08) // 32-bit gate { @@ -728,7 +943,19 @@ { // for these exceptions, an error code is pushed onto the stack by the processor. // no error code is pushed for software interrupts, either. - PUSH32(cpustate,error); + if(PROTECTED_MODE) + { + UINT32 entry = irq * 8; + UINT32 v2,type; + v2 = READ32(cpustate, cpustate->idtr.base + entry + 4 ); + type = (v2>>8) & 0x1F; + if(type >= 9) + PUSH32(cpustate,error); + else + PUSH16(cpustate,error); + } + else + PUSH16(cpustate,error); } } @@ -837,7 +1064,7 @@ CHANGE_PC(cpustate,cpustate->eip); cpustate->CPL = cpustate->sreg[CS].selector & 0x03; - printf("286 Task Switch from selector %04x to %04x\n",old_task,selector); +// printf("286 Task Switch from selector %04x to %04x\n",old_task,selector); } static void i386_task_switch(i386_state *cpustate, UINT16 selector, UINT8 nested) @@ -952,7 +1179,7 @@ CHANGE_PC(cpustate,cpustate->eip); cpustate->CPL = cpustate->sreg[CS].selector & 0x03; - printf("386 Task Switch from selector %04x to %04x\n",old_task,selector); +// printf("386 Task Switch from selector %04x to %04x\n",old_task,selector); } static void i386_check_irq_line(i386_state *cpustate) @@ -975,7 +1202,7 @@ UINT32 offset = off; /* Check selector is not null */ - if((segment & ~0x07) == 0) + if((segment & ~0x03) == 0) { logerror("JMP: Segment is null.\n"); FAULT(FAULT_GP,0) @@ -1012,7 +1239,6 @@ if((desc.flags & 0x0004) == 0) { /* non-conforming */ - SetRPL = 1; if(RPL > CPL) { logerror("JMP: RPL %i is less than CPL %i\n",RPL,CPL); @@ -1033,6 +1259,7 @@ FAULT(FAULT_GP,segment & 0xfffc) } } + SetRPL = 1; if((desc.flags & 0x0080) == 0) { logerror("JMP: Segment is not present\n"); @@ -1251,9 +1478,9 @@ UINT32 offset = off; int x; - if((selector & ~0x07) == 0) + if((selector & ~0x03) == 0) { - logerror("CALL: Selector is null.\n"); + logerror("CALL (%08x): Selector is null.\n",cpustate->pc); FAULT(FAULT_GP,0) // #GP(0) } if(selector & 0x04) @@ -1261,7 +1488,7 @@ if((selector & ~0x07) > cpustate->ldtr.limit) { logerror("CALL: Selector is past LDT limit.\n"); - FAULT(FAULT_GP,selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,selector & ~0x03) // #GP(selector) } } else @@ -1269,7 +1496,7 @@ if((selector & ~0x07) > cpustate->gdtr.limit) { logerror("CALL: Selector is past GDT limit.\n"); - FAULT(FAULT_GP,selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,selector & ~0x03) // #GP(selector) } } @@ -1288,7 +1515,7 @@ if(DPL > CPL) { logerror("CALL: Code segment DPL %i is greater than CPL %i\n",DPL,CPL); - FAULT(FAULT_GP,selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,selector & ~0x03) // #GP(selector) } } else @@ -1297,19 +1524,19 @@ if(RPL > CPL) { logerror("CALL: RPL %i is greater than CPL %i\n",RPL,CPL); - FAULT(FAULT_GP,selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,selector & ~0x03) // #GP(selector) } if(DPL != CPL) { logerror("CALL: Code segment DPL %i is not equal to CPL %i\n",DPL,CPL); - FAULT(FAULT_GP,selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,selector & ~0x03) // #GP(selector) } - SetRPL = 1; } + SetRPL = 1; if((desc.flags & 0x0080) == 0) { - logerror("CALL: Code segment is not present.\n"); - FAULT(FAULT_NP,selector & ~0x07) // #NP(selector) + logerror("CALL (%08x): Code segment is not present.\n",cpustate->pc); + FAULT(FAULT_NP,selector & ~0x03) // #NP(selector) } if (operand32 != 0) // if 32-bit { @@ -1339,7 +1566,7 @@ if(desc.flags & 0x0010) { logerror("CALL: Segment is a data segment.\n"); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } else { @@ -1351,22 +1578,22 @@ if(DPL < CPL) { logerror("CALL: TSS: DPL is less than CPL.\n"); - FAULT(FAULT_TS,selector & ~0x07) // #TS(selector) + FAULT(FAULT_TS,selector & ~0x03) // #TS(selector) } if(DPL < RPL) { logerror("CALL: TSS: DPL is less than RPL.\n"); - FAULT(FAULT_TS,selector & ~0x07) // #TS(selector) + FAULT(FAULT_TS,selector & ~0x03) // #TS(selector) } if(desc.flags & 0x0002) { logerror("CALL: TSS: TSS is busy.\n"); - FAULT(FAULT_TS,selector & ~0x07) // #TS(selector) + FAULT(FAULT_TS,selector & ~0x03) // #TS(selector) } if(desc.flags & 0x0080) { logerror("CALL: TSS: Segment is not present.\n"); - FAULT(FAULT_NP,selector & ~0x07) // #NP(selector) + FAULT(FAULT_NP,selector & ~0x03) // #NP(selector) } if(desc.flags & 0x08) i386_task_switch(cpustate,desc.selector,1); @@ -1388,17 +1615,17 @@ if(DPL < CPL) { logerror("CALL: Call gate DPL %i is less than CPL %i.\n",DPL,CPL); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } if(DPL < RPL) { logerror("CALL: Call gate DPL %i is less than RPL %i.\n",DPL,RPL); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } if(gate.present == 0) { logerror("CALL: Call gate is not present.\n"); - FAULT(FAULT_NP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_NP,desc.selector & ~0x03) // #GP(selector) } desc.selector = gate.selector; if((gate.selector & ~0x07) == 0) @@ -1411,7 +1638,7 @@ if((desc.selector & ~0x07) > cpustate->ldtr.limit) { logerror("CALL: Call gate: Segment is past LDT limit\n"); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } } else @@ -1419,20 +1646,25 @@ if((desc.selector & ~0x07) > cpustate->gdtr.limit) { logerror("CALL: Call gate: Segment is past GDT limit\n"); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } } i386_load_protected_mode_segment(cpustate,&desc); if((desc.flags & 0x0018) != 0x18) { logerror("CALL: Call gate: Segment is not a code segment.\n"); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) } DPL = ((desc.flags >> 5) & 0x03); if(DPL > CPL) { logerror("CALL: Call gate: Segment DPL %i is greater than CPL %i.\n",DPL,CPL); - FAULT(FAULT_GP,desc.selector & ~0x07) // #GP(selector) + FAULT(FAULT_GP,desc.selector & ~0x03) // #GP(selector) + } + if((desc.flags & 0x0080) == 0) + { + logerror("CALL (%08x): Code segment is not present.\n",cpustate->pc); + FAULT(FAULT_NP,desc.selector & ~0x03) // #NP(selector) } if(DPL < CPL && (desc.flags & 0x0004) == 0) { @@ -1485,7 +1717,7 @@ } if((stack.flags & 0x0080) == 0) { - logerror("CALL: Call gate: Stack segment is not a writable data segment\n"); + logerror("CALL: Call gate: Stack segment is not present\n"); FAULT(FAULT_SS,stack.selector) // #SS(SS selector) } if(operand32 != 0) @@ -1588,6 +1820,7 @@ logerror("CALL: EIP is past segment limit.\n"); FAULT(FAULT_GP,0) // #GP(0) } + SetRPL = 1; } break; case 0x05: // task gate @@ -1684,15 +1917,21 @@ if(operand32 == 0) { - newEIP = POP16(cpustate) & 0xffff; - newCS = POP16(cpustate) & 0xffff; - REG16(SP) += count; + UINT32 ea = i386_translate(cpustate, SS, REG16(SP), 0); + newEIP = READ16(cpustate, ea) & 0xffff; + newCS = READ16(cpustate, ea+2) & 0xffff; + ea += count+4; + newESP = READ16(cpustate, ea) & 0xffff; + newSS = READ16(cpustate, ea+2) & 0xffff; } else { - newEIP = POP32(cpustate); - newCS = POP32(cpustate) & 0xffff; - REG32(ESP) += count; + UINT32 ea = i386_translate(cpustate, SS, REG32(ESP), 0); + newEIP = READ32(cpustate, ea); + newCS = READ32(cpustate, ea+4) & 0xffff; + ea += count+8; + newESP = READ32(cpustate, ea); + newSS = READ32(cpustate, ea+4) & 0xffff; } memset(&desc, 0, sizeof(desc)); @@ -1704,45 +1943,45 @@ if(RPL < CPL) { - logerror("RETF: Return segment RPL is less than CPL.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + logerror("RETF (%08x): Return segment RPL is less than CPL.\n",cpustate->pc); + FAULT(FAULT_GP,newCS & ~0x03) } if(RPL == CPL) { /* same privilege level */ - if((newCS & ~0x07) == 0) + if((newCS & ~0x03) == 0) { - logerror("RETF: Return segment RPL is less than CPL.\n"); + logerror("RETF: Return segment is null.\n"); FAULT(FAULT_GP,0) } if(newCS & 0x04) { - if((newCS & ~0x07) > cpustate->ldtr.limit) + if((newCS & ~0x07) >= cpustate->ldtr.limit) { logerror("RETF: Return segment is past LDT limit.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + FAULT(FAULT_GP,newCS & ~0x03) } } else { - if((newCS & ~0x07) > cpustate->gdtr.limit) + if((newCS & ~0x07) >= cpustate->gdtr.limit) { logerror("RETF: Return segment is past GDT limit.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + FAULT(FAULT_GP,newCS & ~0x03) } } if((desc.flags & 0x0018) != 0x0018) { logerror("RETF: Return segment is not a code segment.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + FAULT(FAULT_GP,newCS & ~0x03) } if(desc.flags & 0x0004) { if(DPL > CPL) { logerror("RETF: Conforming code segment DPL is greater than CPL.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + FAULT(FAULT_GP,newCS & ~0x03) } } else @@ -1750,13 +1989,13 @@ if(DPL != CPL) { logerror("RETF: Non-conforming code segment DPL does not equal CPL.\n"); - FAULT(FAULT_GP,newCS & ~0x07) + FAULT(FAULT_GP,newCS & ~0x03) } } if((desc.flags & 0x0080) == 0) { - logerror("RETF: Code segment is not present.\n"); - FAULT(FAULT_NP,newCS & ~0x07) + logerror("RETF (%08x): Code segment is not present.\n",cpustate->pc); + FAULT(FAULT_NP,newCS & ~0x03) } if(newEIP > desc.limit) { @@ -1765,39 +2004,43 @@ } if(operand32 == 0) { - if(REG16(SP) > (cpustate->sreg[SS].limit & 0xffff)) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+count+3) != 0) { - logerror("RETF: SP is past stack segment limit.\n"); + logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc); FAULT(FAULT_SS,0) } } else { - if(REG32(ESP) > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+count+7) != 0) { logerror("RETF: ESP is past stack segment limit.\n"); FAULT(FAULT_SS,0) } } + if(operand32 == 0) + REG16(SP) += (4+count); + else + REG32(ESP) += (8+count); } else if(RPL > CPL) { /* outer privilege level */ if(operand32 == 0) { - newESP = POP16(cpustate) & 0xffff; - newSS = POP16(cpustate); - if(newESP+8+count > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+count+7) != 0) { - logerror("RETF: SP is past stack segment limit.\n"); + logerror("RETF (%08x): SP is past stack segment limit.\n",cpustate->pc); FAULT(FAULT_SS,0) } } else { - newESP = POP32(cpustate); - newSS = POP32(cpustate); - if(newESP+16+count > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+count+15) != 0) { logerror("RETF: ESP is past stack segment limit.\n"); FAULT(FAULT_SS,0) @@ -1805,14 +2048,14 @@ } /* Check CS selector and descriptor */ - if((newCS & ~0x07) == 0) + if((newCS & ~0x03) == 0) { logerror("RETF: CS segment is null.\n"); FAULT(FAULT_GP,0) } if(newCS & 0x04) { - if((newCS & ~0x07) > cpustate->ldtr.limit) + if((newCS & ~0x07) >= cpustate->ldtr.limit) { logerror("RETF: CS segment selector is past LDT limit.\n"); FAULT(FAULT_GP,newCS & ~0x07) @@ -1820,7 +2063,7 @@ } else { - if((newCS & ~0x07) > cpustate->gdtr.limit) + if((newCS & ~0x07) >= cpustate->gdtr.limit) { logerror("RETF: CS segment selector is past GDT limit.\n"); FAULT(FAULT_GP,newCS & ~0x07) @@ -1870,7 +2113,7 @@ { if((newSS & ~0x07) > cpustate->ldtr.limit) { - logerror("RETF: SS segment selector is past LDT limit.\n"); + logerror("RETF (%08x): SS segment selector is past LDT limit.\n",cpustate->pc); FAULT(FAULT_GP,newSS & ~0x07) } } @@ -1878,7 +2121,7 @@ { if((newSS & ~0x07) > cpustate->gdtr.limit) { - logerror("RETF: SS segment selector is past GDT limit.\n"); + logerror("RETF (%08x): SS segment selector is past GDT limit.\n",cpustate->pc); FAULT(FAULT_GP,newSS & ~0x07) } } @@ -1906,17 +2149,12 @@ /* Load new SS:(E)SP */ if(operand32 == 0) - REG16(SP) = newESP & 0xffff; + REG16(SP) = (newESP+count) & 0xffff; else - REG32(ESP) = newESP; + REG32(ESP) = newESP+count; cpustate->sreg[SS].selector = newSS; i386_load_segment_descriptor(cpustate, SS ); - if(operand32 == 0) - REG16(SP) += count; - else - REG32(ESP) += count; - /* Check that DS, ES, FS and GS are valid for the new privilege level */ i386_check_sreg_validity(cpustate,DS); i386_check_sreg_validity(cpustate,ES); @@ -1938,41 +2176,70 @@ { UINT32 newCS, newEIP; UINT32 newSS, newESP; // when changing privilege - I386_SREG desc; + I386_SREG desc,stack; UINT8 CPL, RPL, DPL; UINT32 newflags; CPL = cpustate->CPL; if(operand32 == 0) { - newEIP = POP16(cpustate); - newCS = POP16(cpustate); - newflags = POP16(cpustate); + UINT32 ea = i386_translate(cpustate, SS, REG16(SP), 0); + newEIP = READ16(cpustate, ea) & 0xffff; + newCS = READ16(cpustate, ea+2) & 0xffff; + newflags = READ16(cpustate, ea+4) & 0xffff; + newESP = READ16(cpustate, ea+6) & 0xffff; + newSS = READ16(cpustate, ea+8) & 0xffff; } else { - newEIP = POP32(cpustate); - newCS = POP32(cpustate) & 0xffff; - newflags = POP32(cpustate); + UINT32 ea = i386_translate(cpustate, SS, REG32(ESP), 0); + newEIP = READ32(cpustate, ea); + newCS = READ32(cpustate, ea+4) & 0xffff; + newflags = READ32(cpustate, ea+8); + newESP = READ32(cpustate, ea+12); + newSS = READ32(cpustate, ea+16) & 0xffff; } if(V8086_MODE) { - logerror("IRET: Is in Virtual 8086 mode.\n"); - FAULT(FAULT_GP,0) + UINT32 oldflags = get_flags(cpustate); + if(!cpustate->IOP1 || !cpustate->IOP2) + { + logerror("IRET (%08x): Is in Virtual 8086 mode and IOPL != 3.\n",cpustate->pc); + FAULT(FAULT_GP,0) + } + /* Is this correct? The 80386 programmers' reference says IRET should always trigger #GP(0) in V86 mode */ + if(operand32 == 0) + { + cpustate->eip = newEIP & 0xffff; + cpustate->sreg[CS].selector = newCS & 0xffff; + newflags &= ~(3<<12); + newflags |= (((oldflags>>12)&3)<<12); // IOPL cannot be changed in V86 mode + set_flags(cpustate,(newflags & 0xffff) | (oldflags & ~0xffff)); + REG16(SP) += 6; + } + else + { + cpustate->eip = newEIP; + cpustate->sreg[CS].selector = newCS & 0xffff; + newflags &= ~(3<<12); + newflags |= 0x20000 | (((oldflags>>12)&3)<<12); // IOPL and VM cannot be changed in V86 mode + set_flags(cpustate,newflags); + REG32(ESP) += 12; + } } else if(NESTED_TASK) { UINT32 task = READ32(cpustate,cpustate->task.base); /* Task Return */ - popmessage("IRET: Nested task return."); + logerror("IRET (%08x): Nested task return.\n",cpustate->pc); /* Check back-link selector in TSS */ if(task & 0x04) { logerror("IRET: Task return: Back-linked TSS is not in GDT.\n"); FAULT(FAULT_TS,task & ~0x07) } - if((task & ~0x07) > cpustate->gdtr.limit) + if((task & ~0x07) >= cpustate->gdtr.limit) { logerror("IRET: Task return: Back-linked TSS is not in GDT.\n"); FAULT(FAULT_TS,task & ~0x07) @@ -1982,7 +2249,7 @@ i386_load_protected_mode_segment(cpustate,&desc); if((desc.flags & 0x001f) != 0x000b) { - logerror("IRET: Task return: Back-linked TSS is not a busy TSS.\n"); + logerror("IRET (%08x): Task return: Back-linked TSS is not a busy TSS.\n",cpustate->pc); FAULT(FAULT_TS,task & ~0x07) } if((desc.flags & 0x0080) == 0) @@ -2000,14 +2267,161 @@ { if(newflags & 0x00020000) // if returning to virtual 8086 mode { +// UINT8 SSRPL,SSDPL; + memset(&desc, 0, sizeof(desc)); + desc.selector = newCS; + i386_load_protected_mode_segment(cpustate,&desc); + DPL = (desc.flags >> 5) & 0x03; // descriptor privilege level + RPL = newCS & 0x03; + memset(&stack, 0, sizeof(stack)); + stack.selector = newSS; + i386_load_protected_mode_segment(cpustate,&stack); + //SSRPL = newSS & 0x03; + //SSDPL = (stack.flags >> 5) & 0x03; + /* Return to v86 mode */ - popmessage("IRET: Unimplemented return to Virtual 8086 mode."); + logerror("IRET (%08x): Returning to Virtual 8086 mode.\n",cpustate->pc); + // Should these be done at this point? The 386 programmers' reference is a bit confusing about this +/* if(RPL != 3) + { + logerror("IRET to V86 (%08x): Return CS RPL is not 3\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + if(operand32 == 0) + { + if(REG16(SP)+36 > cpustate->sreg[SS].limit) + { + logerror("IRET to V86 (%08x): Stack does not have enough room left\n",cpustate->pc); + FAULT(FAULT_SS,0); + } + } + else + { + if(REG32(ESP)+36 > cpustate->sreg[SS].limit) + { + logerror("IRET to V86 (%08x): Stack does not have enough space left\n",cpustate->pc); + FAULT(FAULT_SS,0); + } + } + // code segment checks + if((newCS & ~0x07) == 0) + { + logerror("IRET to V86 (%08x): Return CS selector is null\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + if(desc.flags & 0x04) + { // LDT + if(newCS > cpustate->ldtr.limit) + { + logerror("IRET to V86 (%08x): Return CS selector is past LDT limit\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + } + else + { // GDT + if(newCS > cpustate->gdtr.limit) + { + logerror("IRET to V86 (%08x): Return CS selector is past GDT limit\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + } + if((desc.flags & 0x18) != 0x18) + { + logerror("IRET to V86 (%08x): Return CS segment is not a code segment\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + if(DPL != 3) + { + logerror("IRET to V86 (%08x): Return CS segment does not have a DPL of 3\n",cpustate->pc); + FAULT(FAULT_GP,newCS); + } + if(!(desc.flags & 0x0080)) + { + logerror("IRET to V86 (%08x): Return CS segment is not present\n",cpustate->pc); + FAULT(FAULT_NP,newCS); + } + // Stack segment checks + if((newSS & ~0x07) == 0) + { + logerror("IRET to V86 (%08x): Return SS segment is null\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + if(desc.flags & 0x04) + { // LDT + if(newSS > cpustate->ldtr.limit) + { + logerror("IRET to V86 (%08x): Return SS selector is past LDT limit\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + } + else + { // GDT + if(newSS > cpustate->gdtr.limit) + { + logerror("IRET to V86 (%08x): Return SS selector is past GDT limit\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + } + if(SSRPL != RPL) + { + logerror("IRET to V86 (%08x): Return SS selector RPL is not equal to CS selector RPL\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + if(((stack.flags & 0x0018) != 0x10) && (!(stack.flags & 0x02))) + { + logerror("IRET to V86 (%08x): Return SS segment is not a writable data segment\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + if(SSDPL != RPL) + { + logerror("IRET to V86 (%08x): Return SS segment DPL is not equal to CS selector RPL\n",cpustate->pc); + FAULT(FAULT_GP,newSS); + } + if(!(stack.flags & 0x0080)) + { + logerror("IRET to V86 (%08x): Return SS segment is not present\n",cpustate->pc); + FAULT(FAULT_NP,newSS); + } + + if(newEIP > desc.limit) + { + logerror("IRET to V86 (%08x): New EIP is past CS segment limit\n",cpustate->pc); + FAULT(FAULT_GP,0); + } + */ + if(CPL != 0) + { + UINT32 oldflags = get_flags(cpustate); + newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); + } + set_flags(cpustate,newflags); + cpustate->eip = POP32(cpustate) & 0xffff; // high 16 bits are ignored + cpustate->sreg[CS].selector = POP32(cpustate) & 0xffff; + POP32(cpustate); // already set flags +// if(RPL > CPL) + { + newESP = POP32(cpustate); + newSS = POP32(cpustate) & 0xffff; + } + cpustate->sreg[ES].selector = POP32(cpustate) & 0xffff; + cpustate->sreg[DS].selector = POP32(cpustate) & 0xffff; + cpustate->sreg[FS].selector = POP32(cpustate) & 0xffff; + cpustate->sreg[GS].selector = POP32(cpustate) & 0xffff; + REG32(ESP) = newESP; // all 32 bits are loaded + cpustate->sreg[SS].selector = newSS; + i386_load_segment_descriptor(cpustate,ES); + i386_load_segment_descriptor(cpustate,DS); + i386_load_segment_descriptor(cpustate,FS); + i386_load_segment_descriptor(cpustate,GS); + i386_load_segment_descriptor(cpustate,SS); + cpustate->CPL = 3; // Virtual 8086 tasks are always run at CPL 3 } else { if(operand32 == 0) { - if(REG16(SP)+4 > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) != 0) { logerror("IRET: Data on stack is past SS limit.\n"); FAULT(FAULT_SS,0) @@ -2015,7 +2429,8 @@ } else { - if(REG32(ESP)+6 > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+7) != 0) { logerror("IRET: Data on stack is past SS limit.\n"); FAULT(FAULT_SS,0) @@ -2024,7 +2439,7 @@ RPL = newCS & 0x03; if(RPL < CPL) { - logerror("IRET: Return CS RPL is less than CPL.\n"); + logerror("IRET (%08x): Return CS RPL is less than CPL.\n",cpustate->pc); FAULT(FAULT_GP,newCS & ~0x07) } if(RPL == CPL) @@ -2032,28 +2447,30 @@ /* return to same privilege level */ if(operand32 == 0) { - if(REG16(SP)+6 > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+5) != 0) { - logerror("IRET: Data on stack is past SS limit.\n"); + logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc); FAULT(FAULT_SS,0) } } else { - if(REG32(ESP)+12 > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+11) != 0) { - logerror("IRET: Data on stack is past SS limit.\n"); + logerror("IRET (%08x): Data on stack is past SS limit.\n",cpustate->pc); FAULT(FAULT_SS,0) } } - if((newCS & ~0x07) == 0) + if((newCS & ~0x03) == 0) { logerror("IRET: Return CS selector is null.\n"); FAULT(FAULT_GP,0) } if(newCS & 0x04) { - if((newCS & ~0x07) > cpustate->ldtr.limit) + if((newCS & ~0x07) >= cpustate->ldtr.limit) { logerror("IRET: Return CS selector (%04x) is past LDT limit.\n",newCS); FAULT(FAULT_GP,newCS & ~0x07) @@ -2061,7 +2478,7 @@ } else { - if((newCS & ~0x07) > cpustate->gdtr.limit) + if((newCS & ~0x07) >= cpustate->gdtr.limit) { logerror("IRET: Return CS selector is past GDT limit.\n"); FAULT(FAULT_GP,newCS & ~0x07) @@ -2074,7 +2491,7 @@ RPL = newCS & 0x03; if((desc.flags & 0x0018) != 0x0018) { - logerror("IRET: Return CS segment is not a code segment.\n"); + logerror("IRET (%08x): Return CS segment is not a code segment.\n",cpustate->pc); FAULT(FAULT_GP,newCS & ~0x07) } if(desc.flags & 0x0004) @@ -2101,61 +2518,69 @@ if(newEIP > desc.limit) { logerror("IRET: Return EIP is past return CS limit.\n"); - FAULT(FAULT_GP,0) } + FAULT(FAULT_GP,0) + } + + if(CPL != 0) + { + UINT32 oldflags = get_flags(cpustate); + newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); + } if(operand32 == 0) { cpustate->eip = newEIP; cpustate->sreg[CS].selector = newCS; set_flags(cpustate,newflags); + REG16(SP) += 6; } else { cpustate->eip = newEIP; cpustate->sreg[CS].selector = newCS & 0xffff; set_flags(cpustate,newflags); + REG32(ESP) += 12; } } else if(RPL > CPL) { I386_SREG stack; /* return to outer privilege level */ + memset(&desc, 0, sizeof(desc)); + desc.selector = newCS; + i386_load_protected_mode_segment(cpustate,&desc); + DPL = (desc.flags >> 5) & 0x03; // descriptor privilege level + RPL = newCS & 0x03; + memset(&stack, 0, sizeof(stack)); + stack.selector = newSS; + i386_load_protected_mode_segment(cpustate,&stack); if(operand32 == 0) { - newESP = POP16(cpustate); - newSS = POP16(cpustate); - if(REG16(SP) > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+9) != 0) { - logerror("IRET: ESP is past SS limit.\n"); - FAULT(FAULT_SS,0) } + logerror("IRET: SP is past SS limit.\n"); + FAULT(FAULT_SS,0) + } } else { - newESP = POP32(cpustate); - newSS = POP32(cpustate) & 0xffff; - if(REG32(ESP) > cpustate->sreg[SS].limit) + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+19) != 0) { logerror("IRET: ESP is past SS limit.\n"); FAULT(FAULT_SS,0) } } - memset(&desc, 0, sizeof(desc)); - desc.selector = newCS; - i386_load_protected_mode_segment(cpustate,&desc); - DPL = (desc.flags >> 5) & 0x03; // descriptor privilege level - RPL = newCS & 0x03; - memset(&stack, 0, sizeof(stack)); - stack.selector = newSS; - i386_load_protected_mode_segment(cpustate,&stack); /* Check CS selector and descriptor */ - if((newCS & ~0x07) == 0) + if((newCS & ~0x03) == 0) { logerror("IRET: Return CS selector is null.\n"); FAULT(FAULT_GP,0) } if(newCS & 0x04) { - if((newCS & ~0x07) > cpustate->ldtr.limit) + if((newCS & ~0x07) >= cpustate->ldtr.limit) { logerror("IRET: Return CS selector is past LDT limit.\n"); FAULT(FAULT_GP,newCS & ~0x07); @@ -2163,7 +2588,7 @@ } else { - if((newCS & ~0x07) > cpustate->gdtr.limit) + if((newCS & ~0x07) >= cpustate->gdtr.limit) { logerror("IRET: Return CS selector is past GDT limit.\n"); FAULT(FAULT_GP,newCS & ~0x07); @@ -2198,14 +2623,14 @@ /* Check SS selector and descriptor */ DPL = (stack.flags >> 5) & 0x03; - if((newSS & ~0x07) == 0) + if((newSS & ~0x03) == 0) { logerror("IRET: Return SS selector is null.\n"); FAULT(FAULT_GP,0) } if(newSS & 0x04) { - if((newSS & ~0x07) > cpustate->ldtr.limit) + if((newSS & ~0x07) >= cpustate->ldtr.limit) { logerror("IRET: Return SS selector is past LDT limit.\n"); FAULT(FAULT_GP,newSS & ~0x07); @@ -2213,7 +2638,7 @@ } else { - if((newSS & ~0x07) > cpustate->gdtr.limit) + if((newSS & ~0x07) >= cpustate->gdtr.limit) { logerror("IRET: Return SS selector is past GDT limit.\n"); FAULT(FAULT_GP,newSS & ~0x07); @@ -2250,6 +2675,18 @@ FAULT(FAULT_GP,0) } +// if(operand32 == 0) +// REG16(SP) += 10; +// else +// REG32(ESP) += 20; + + // IOPL can only change if CPL is zero + if(CPL != 0) + { + UINT32 oldflags = get_flags(cpustate); + newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); + } + if(operand32 == 0) { cpustate->eip = newEIP & 0xffff; @@ -2571,10 +3008,12 @@ cpustate->sreg[CS].selector = 0xf000; cpustate->sreg[CS].base = 0xffff0000; cpustate->sreg[CS].limit = 0xffff; + cpustate->sreg[CS].valid = true; cpustate->sreg[DS].base = cpustate->sreg[ES].base = cpustate->sreg[FS].base = cpustate->sreg[GS].base = cpustate->sreg[SS].base = 0x00000000; cpustate->sreg[DS].limit = cpustate->sreg[ES].limit = cpustate->sreg[FS].limit = cpustate->sreg[GS].limit = cpustate->sreg[SS].limit = 0xffff; cpustate->sreg[DS].flags = cpustate->sreg[ES].flags = cpustate->sreg[FS].flags = cpustate->sreg[GS].flags = cpustate->sreg[SS].flags = 0x0092; + cpustate->sreg[DS].valid = cpustate->sreg[ES].valid = cpustate->sreg[FS].valid = cpustate->sreg[GS].valid = cpustate->sreg[SS].valid =true; cpustate->idtr.base = 0; cpustate->idtr.limit = 0x3ff; @@ -2583,7 +3022,7 @@ cpustate->cr[0] = 0x7fffffe0; // reserved bits set to 1 cpustate->eflags = 0; - cpustate->eflags_mask = 0x00030000; + cpustate->eflags_mask = 0x00037fd7; cpustate->eip = 0xfff0; // [11:8] Family @@ -2650,21 +3089,33 @@ while( cpustate->cycles > 0 ) { + i386_check_irq_line(cpustate); cpustate->operand_size = cpustate->sreg[CS].d; cpustate->address_size = cpustate->sreg[CS].d; + cpustate->operand_prefix = 0; + cpustate->address_prefix = 0; + + cpustate->ext = 1; cpustate->segment_prefix = 0; cpustate->prev_eip = cpustate->eip; debugger_instruction_hook(device, cpustate->pc); - i386_check_irq_line(cpustate); if(cpustate->delayed_interrupt_enable != 0) { cpustate->IF = 1; cpustate->delayed_interrupt_enable = 0; } - I386OP(decode_opcode)(cpustate); + try + { + I386OP(decode_opcode)(cpustate); + } + catch(UINT64 e) + { + cpustate->ext = 1; + i386_trap_with_error(cpustate,e&0xffffffff,0,0,e>>32); + } } cpustate->tsc += (cycles - cpustate->cycles); } @@ -2675,10 +3126,11 @@ { i386_state *cpustate = get_safe_token(device); int result = 1; + UINT32 error; if (space == AS_PROGRAM) { if (cpustate->cr[0] & 0x80000000) - result = translate_address(cpustate,address); + result = translate_address(cpustate,-1,address,&error); *address &= cpustate->a20_mask; } return result; @@ -3048,9 +3500,11 @@ cpustate->cr[0] = 0x00000010; cpustate->eflags = 0; - cpustate->eflags_mask = 0x00070000; + cpustate->eflags_mask = 0x00077fd7; cpustate->eip = 0xfff0; + x87_reset(cpustate); + // [11:8] Family // [ 7:4] Model // [ 3:0] Stepping ID @@ -3059,6 +3513,7 @@ REG32(EDX) = (4 << 8) | (0 << 4) | (3); build_opcode_table(cpustate, OP_I386 | OP_FPU | OP_I486); + build_x87_opcode_table(get_safe_token(device)); cpustate->cycle_table_rm = cycle_table_rm[CPU_CYCLES_I486]; cpustate->cycle_table_pm = cycle_table_pm[CPU_CYCLES_I486]; @@ -3074,18 +3529,11 @@ i386_state *cpustate = get_safe_token(device); switch (state) { - case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->fpu_status_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST0: ST(0).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST1: ST(1).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST2: ST(2).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST3: ST(3).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST4: ST(4).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST5: ST(5).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST6: ST(6).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST7: ST(7).f = info->i; break; + case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->x87_cw = info->i; break; + case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->x87_sw = info->i; break; + case CPUINFO_INT_REGISTER + X87_TAG: cpustate->x87_tw = info->i; break; - default: CPU_SET_INFO_CALL(i386); break; + default: CPU_SET_INFO_CALL(i386); break; } } @@ -3099,29 +3547,23 @@ case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(i486); break; case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(i486); break; - case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->fpu_control_word; break; - case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->fpu_status_word; break; - case CPUINFO_INT_REGISTER + X87_ST0: info->i = ST(0).f; break; - case CPUINFO_INT_REGISTER + X87_ST1: info->i = ST(1).f; break; - case CPUINFO_INT_REGISTER + X87_ST2: info->i = ST(2).f; break; - case CPUINFO_INT_REGISTER + X87_ST3: info->i = ST(3).f; break; - case CPUINFO_INT_REGISTER + X87_ST4: info->i = ST(4).f; break; - case CPUINFO_INT_REGISTER + X87_ST5: info->i = ST(5).f; break; - case CPUINFO_INT_REGISTER + X87_ST6: info->i = ST(6).f; break; - case CPUINFO_INT_REGISTER + X87_ST7: info->i = ST(7).f; break; + case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->x87_cw; break; + case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->x87_sw; break; + case CPUINFO_INT_REGISTER + X87_TAG: info->i = cpustate->x87_tw; break; case DEVINFO_STR_NAME: strcpy(info->s, "I486"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Intel 486"); break; - case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "FPU_CW: %04X", cpustate->fpu_control_word); break; - case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "FPU_SW: %04X", cpustate->fpu_status_word); break; - case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", ST(0).f); break; - case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", ST(1).f); break; - case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", ST(2).f); break; - case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", ST(3).f); break; - case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", ST(4).f); break; - case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", ST(5).f); break; - case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", ST(6).f); break; - case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", ST(7).f); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "Intel 486"); break; + case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "x87_CW: %04X", cpustate->x87_cw); break; + case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "x87_SW: %04X", cpustate->x87_sw); break; + case CPUINFO_STR_REGISTER + X87_TAG: sprintf(info->s, "x87_TAG:%04X", cpustate->x87_tw); break; + case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", fx80_to_double(ST(0))); break; + case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", fx80_to_double(ST(1))); break; + case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", fx80_to_double(ST(2))); break; + case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", fx80_to_double(ST(3))); break; + case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", fx80_to_double(ST(4))); break; + case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", fx80_to_double(ST(5))); break; + case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", fx80_to_double(ST(6))); break; + case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", fx80_to_double(ST(7))); break; default: CPU_GET_INFO_CALL(i386); break; } @@ -3164,10 +3606,12 @@ cpustate->a20_mask = ~0; cpustate->cr[0] = 0x00000010; - cpustate->eflags = 0; - cpustate->eflags_mask = 0x003b0000; + cpustate->eflags = 0x00200000; + cpustate->eflags_mask = 0x003f7fd7; cpustate->eip = 0xfff0; + x87_reset(cpustate); + // [11:8] Family // [ 7:4] Model // [ 3:0] Stepping ID @@ -3176,6 +3620,7 @@ REG32(EDX) = (5 << 8) | (2 << 4) | (5); build_opcode_table(cpustate, OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM); + build_x87_opcode_table(get_safe_token(device)); cpustate->cycle_table_rm = cycle_table_rm[CPU_CYCLES_PENTIUM]; cpustate->cycle_table_pm = cycle_table_pm[CPU_CYCLES_PENTIUM]; @@ -3206,18 +3651,11 @@ i386_state *cpustate = get_safe_token(device); switch (state) { - case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->fpu_status_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST0: ST(0).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST1: ST(1).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST2: ST(2).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST3: ST(3).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST4: ST(4).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST5: ST(5).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST6: ST(6).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST7: ST(7).f = info->i; break; + case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->x87_cw = info->i; break; + case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->x87_sw = info->i; break; + case CPUINFO_INT_REGISTER + X87_TAG: cpustate->x87_tw = info->i; break; - default: CPU_SET_INFO_CALL(i386); break; + default: CPU_SET_INFO_CALL(i386); break; } } @@ -3231,29 +3669,23 @@ case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(pentium); break; case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(pentium); break; - case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->fpu_control_word; break; - case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->fpu_status_word; break; - case CPUINFO_INT_REGISTER + X87_ST0: info->i = ST(0).f; break; - case CPUINFO_INT_REGISTER + X87_ST1: info->i = ST(1).f; break; - case CPUINFO_INT_REGISTER + X87_ST2: info->i = ST(2).f; break; - case CPUINFO_INT_REGISTER + X87_ST3: info->i = ST(3).f; break; - case CPUINFO_INT_REGISTER + X87_ST4: info->i = ST(4).f; break; - case CPUINFO_INT_REGISTER + X87_ST5: info->i = ST(5).f; break; - case CPUINFO_INT_REGISTER + X87_ST6: info->i = ST(6).f; break; - case CPUINFO_INT_REGISTER + X87_ST7: info->i = ST(7).f; break; + case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->x87_cw; break; + case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->x87_sw; break; + case CPUINFO_INT_REGISTER + X87_TAG: info->i = cpustate->x87_tw; break; case DEVINFO_STR_NAME: strcpy(info->s, "PENTIUM"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Intel Pentium"); break; - case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "FPU_CW: %04X", cpustate->fpu_control_word); break; - case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "FPU_SW: %04X", cpustate->fpu_status_word); break; - case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", ST(0).f); break; - case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", ST(1).f); break; - case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", ST(2).f); break; - case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", ST(3).f); break; - case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", ST(4).f); break; - case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", ST(5).f); break; - case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", ST(6).f); break; - case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", ST(7).f); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "Intel Pentium"); break; + case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "x87_CW: %04X", cpustate->x87_cw); break; + case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "x87_SW: %04X", cpustate->x87_sw); break; + case CPUINFO_STR_REGISTER + X87_TAG: sprintf(info->s, "x87_TAG:%04X", cpustate->x87_tw); break; + case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", fx80_to_double(ST(0))); break; + case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", fx80_to_double(ST(1))); break; + case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", fx80_to_double(ST(2))); break; + case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", fx80_to_double(ST(3))); break; + case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", fx80_to_double(ST(4))); break; + case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", fx80_to_double(ST(5))); break; + case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", fx80_to_double(ST(6))); break; + case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", fx80_to_double(ST(7))); break; default: CPU_GET_INFO_CALL(i386); break; } @@ -3296,10 +3728,12 @@ cpustate->a20_mask = ~0; cpustate->cr[0] = 0x00000010; - cpustate->eflags = 0; - cpustate->eflags_mask = 0x00270000; /* TODO: is this correct? */ + cpustate->eflags = 0x00200000; + cpustate->eflags_mask = 0x00277fd7; /* TODO: is this correct? */ cpustate->eip = 0xfff0; + x87_reset(cpustate); + // [11:8] Family // [ 7:4] Model // [ 3:0] Stepping ID @@ -3307,6 +3741,7 @@ REG32(EAX) = 0; REG32(EDX) = (4 << 8) | (4 << 4) | (1); /* TODO: is this correct? */ + build_x87_opcode_table(get_safe_token(device)); build_opcode_table(cpustate, OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM | OP_CYRIX); cpustate->cycle_table_rm = cycle_table_rm[CPU_CYCLES_MEDIAGX]; cpustate->cycle_table_pm = cycle_table_pm[CPU_CYCLES_MEDIAGX]; @@ -3333,18 +3768,10 @@ i386_state *cpustate = get_safe_token(device); switch (state) { - case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->fpu_control_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->fpu_status_word = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST0: ST(0).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST1: ST(1).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST2: ST(2).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST3: ST(3).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST4: ST(4).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST5: ST(5).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST6: ST(6).f = info->i; break; - case CPUINFO_INT_REGISTER + X87_ST7: ST(7).f = info->i; break; + case CPUINFO_INT_REGISTER + X87_CTRL: cpustate->x87_cw = info->i; break; + case CPUINFO_INT_REGISTER + X87_STATUS: cpustate->x87_sw = info->i; break; - default: CPU_SET_INFO_CALL(i386); break; + default: CPU_SET_INFO_CALL(i386); break; } } @@ -3358,29 +3785,23 @@ case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(mediagx); break; case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(mediagx); break; - case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->fpu_control_word; break; - case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->fpu_status_word; break; - case CPUINFO_INT_REGISTER + X87_ST0: info->i = ST(0).f; break; - case CPUINFO_INT_REGISTER + X87_ST1: info->i = ST(1).f; break; - case CPUINFO_INT_REGISTER + X87_ST2: info->i = ST(2).f; break; - case CPUINFO_INT_REGISTER + X87_ST3: info->i = ST(3).f; break; - case CPUINFO_INT_REGISTER + X87_ST4: info->i = ST(4).f; break; - case CPUINFO_INT_REGISTER + X87_ST5: info->i = ST(5).f; break; - case CPUINFO_INT_REGISTER + X87_ST6: info->i = ST(6).f; break; - case CPUINFO_INT_REGISTER + X87_ST7: info->i = ST(7).f; break; + case CPUINFO_INT_REGISTER + X87_CTRL: info->i = cpustate->x87_cw; break; + case CPUINFO_INT_REGISTER + X87_STATUS: info->i = cpustate->x87_sw; break; + case CPUINFO_INT_REGISTER + X87_TAG: info->i = cpustate->x87_tw; break; case DEVINFO_STR_NAME: strcpy(info->s, "MEDIAGX"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Cyrix MediaGX"); break; - case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "FPU_CW: %04X", cpustate->fpu_control_word); break; - case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "FPU_SW: %04X", cpustate->fpu_status_word); break; - case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", ST(0).f); break; - case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", ST(1).f); break; - case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", ST(2).f); break; - case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", ST(3).f); break; - case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", ST(4).f); break; - case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", ST(5).f); break; - case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", ST(6).f); break; - case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", ST(7).f); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "Cyrix MediaGX"); break; + case CPUINFO_STR_REGISTER + X87_CTRL: sprintf(info->s, "x87_CW: %04X", cpustate->x87_cw); break; + case CPUINFO_STR_REGISTER + X87_STATUS: sprintf(info->s, "x87_SW: %04X", cpustate->x87_sw); break; + case CPUINFO_STR_REGISTER + X87_TAG: sprintf(info->s, "x87_TAG: %04X", cpustate->x87_tw); break; + case CPUINFO_STR_REGISTER + X87_ST0: sprintf(info->s, "ST0: %f", fx80_to_double(ST(0))); break; + case CPUINFO_STR_REGISTER + X87_ST1: sprintf(info->s, "ST1: %f", fx80_to_double(ST(1))); break; + case CPUINFO_STR_REGISTER + X87_ST2: sprintf(info->s, "ST2: %f", fx80_to_double(ST(2))); break; + case CPUINFO_STR_REGISTER + X87_ST3: sprintf(info->s, "ST3: %f", fx80_to_double(ST(3))); break; + case CPUINFO_STR_REGISTER + X87_ST4: sprintf(info->s, "ST4: %f", fx80_to_double(ST(4))); break; + case CPUINFO_STR_REGISTER + X87_ST5: sprintf(info->s, "ST5: %f", fx80_to_double(ST(5))); break; + case CPUINFO_STR_REGISTER + X87_ST6: sprintf(info->s, "ST6: %f", fx80_to_double(ST(6))); break; + case CPUINFO_STR_REGISTER + X87_ST7: sprintf(info->s, "ST7: %f", fx80_to_double(ST(7))); break; default: CPU_GET_INFO_CALL(i386); break; } @@ -3390,3 +3811,4 @@ DEFINE_LEGACY_CPU_DEVICE(I486, i486); DEFINE_LEGACY_CPU_DEVICE(PENTIUM, pentium); DEFINE_LEGACY_CPU_DEVICE(MEDIAGX, mediagx); + diff -Nru mame-0.144/src/emu/cpu/i386/i386dasm.c mame-0.145/src/emu/cpu/i386/i386dasm.c --- mame-0.144/src/emu/cpu/i386/i386dasm.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386dasm.c 2012-02-06 21:30:23.000000000 +0000 @@ -1092,6 +1092,8 @@ static int address_size; static int operand_size; +static int address_prefix; +static int operand_prefix; static int max_length; static UINT64 pc; static UINT8 modrm; @@ -2000,7 +2002,7 @@ int i; UINT8 op2; - if (op->flags & SPECIAL64) + if ((op->flags & SPECIAL64) && (address_size == 2)) op = &x64_opcode_alt[op->flags >> 24]; switch( op->flags & FLAGS_MASK ) @@ -2021,18 +2023,25 @@ case OP_SIZE: rex = regex = sibex = rmex = 0; - if (operand_size < 2) + if (operand_size < 2 && operand_prefix == 0) + { operand_size ^= 1; + operand_prefix = 1; + } op2 = FETCH(); decode_opcode( s, &i386_opcode_table1[op2], op2 ); return; case ADDR_SIZE: rex = regex = sibex = rmex = 0; - if (curmode != 64) - address_size ^= 1; - else - address_size ^= 3; + if(address_prefix == 0) + { + if (curmode != 64) + address_size ^= 1; + else + address_size ^= 3; + address_prefix = 1; + } op2 = FETCH(); decode_opcode( s, &i386_opcode_table1[op2], op2 ); return; @@ -2163,6 +2172,8 @@ curmode = mode; pre0f = 0; rex = regex = sibex = rmex = 0; + address_prefix = 0; + operand_prefix = 0; op = FETCH(); diff -Nru mame-0.144/src/emu/cpu/i386/i386op16.c mame-0.145/src/emu/cpu/i386/i386op16.c --- mame-0.144/src/emu/cpu/i386/i386op16.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386op16.c 2012-02-06 21:30:23.000000000 +0000 @@ -124,7 +124,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = ADC16(cpustate, dst, src, cpustate->CF); @@ -144,7 +144,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = ADC16(cpustate, dst, src, cpustate->CF); @@ -174,7 +174,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = ADD16(cpustate,dst, src); @@ -194,7 +194,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = ADD16(cpustate,dst, src); @@ -224,7 +224,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = AND16(cpustate,dst, src); @@ -244,7 +244,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = AND16(cpustate,dst, src); @@ -271,7 +271,7 @@ if( modrm >= 0xc0 ) { src = LOAD_RM16(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); } @@ -287,9 +287,9 @@ dst = temp; CYCLES(cpustate,CYCLES_BSF); } + STORE_REG16(modrm, dst); } CYCLES(cpustate,CYCLES_BSF_BASE); - STORE_REG16(modrm, dst); } static void I386OP(bsr_r16_rm16)(i386_state *cpustate) // Opcode 0x0f bd @@ -300,7 +300,7 @@ if( modrm >= 0xc0 ) { src = LOAD_RM16(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); } @@ -316,9 +316,9 @@ dst = temp; CYCLES(cpustate,CYCLES_BSR); } + STORE_REG16(modrm, dst); } CYCLES(cpustate,CYCLES_BSR_BASE); - STORE_REG16(modrm, dst); } @@ -336,9 +336,11 @@ CYCLES(cpustate,CYCLES_BT_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT16 dst = READ16(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,0); UINT16 bit = LOAD_REG16(modrm); + ea += 2*(bit/16); + bit %= 16; + UINT16 dst = READ16(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -365,9 +367,11 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTC_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT16 dst = READ16(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 bit = LOAD_REG16(modrm); + ea += 2*(bit/16); + bit %= 16; + UINT16 dst = READ16(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -396,9 +400,11 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTR_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT16 dst = READ16(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 bit = LOAD_REG16(modrm); + ea += 2*(bit/16); + bit %= 16; + UINT16 dst = READ16(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -427,9 +433,11 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTS_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT16 dst = READ16(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 bit = LOAD_REG16(modrm); + ea += 2*(bit/16); + bit %= 16; + UINT16 dst = READ16(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -497,7 +505,7 @@ SUB16(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); SUB16(cpustate,dst, src); @@ -515,7 +523,7 @@ SUB16(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); SUB16(cpustate,dst, src); @@ -537,14 +545,14 @@ UINT32 eas, ead; UINT16 src, dst; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ16(cpustate,eas); dst = READ16(cpustate,ead); - SUB16(cpustate,dst, src); + SUB16(cpustate,src,dst); BUMP_SI(cpustate,2); BUMP_DI(cpustate,2); CYCLES(cpustate,CYCLES_CMPS); @@ -617,7 +625,7 @@ src = (INT32)(INT16)LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_IMUL16_REG_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = (INT32)(INT16)READ16(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL16_REG_MEM); /* TODO: Correct multiply timing */ } @@ -639,7 +647,7 @@ dst = (INT32)(INT16)LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_IMUL16_REG_IMM_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); dst = (INT32)(INT16)READ16(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL16_MEM_IMM_REG); /* TODO: Correct multiply timing */ } @@ -661,7 +669,7 @@ dst = (INT32)(INT16)LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_IMUL16_REG_IMM_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); dst = (INT32)(INT16)READ16(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL16_MEM_IMM_REG); /* TODO: Correct multiply timing */ } @@ -1064,7 +1072,8 @@ static void I386OP(jcxz16)(i386_state *cpustate) // Opcode 0xe3 { INT8 disp = FETCH(cpustate); - if( REG16(CX) == 0 ) { + int val = (cpustate->address_size)?(REG32(ECX) == 0):(REG16(CX) == 0); + if( val ) { if (cpustate->sreg[CS].d) { cpustate->eip += disp; @@ -1168,9 +1177,9 @@ { UINT32 eas; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } REG16(AX) = READ16(cpustate,eas); BUMP_SI(cpustate,2); @@ -1180,8 +1189,8 @@ static void I386OP(loop16)(i386_state *cpustate) // Opcode 0xe2 { INT8 disp = FETCH(cpustate); - REG16(CX)--; - if( REG16(CX) != 0 ) { + INT32 val = (cpustate->address_size)?(--REG32(ECX)):(--REG16(CX)); + if( val != 0 ) { if (cpustate->sreg[CS].d) { cpustate->eip += disp; @@ -1198,8 +1207,8 @@ static void I386OP(loopne16)(i386_state *cpustate) // Opcode 0xe0 { INT8 disp = FETCH(cpustate); - REG16(CX)--; - if( REG16(CX) != 0 && cpustate->ZF == 0 ) { + INT32 val = (cpustate->address_size)?(--REG32(ECX)):(--REG16(CX)); + if( val != 0 && cpustate->ZF == 0 ) { if (cpustate->sreg[CS].d) { cpustate->eip += disp; @@ -1216,8 +1225,8 @@ static void I386OP(loopz16)(i386_state *cpustate) // Opcode 0xe1 { INT8 disp = FETCH(cpustate); - REG16(CX)--; - if( REG16(CX) != 0 && cpustate->ZF != 0 ) { + INT32 val = (cpustate->address_size)?(--REG32(ECX)):(--REG16(CX)); + if( val != 0 && cpustate->ZF != 0 ) { if (cpustate->sreg[CS].d) { cpustate->eip += disp; @@ -1240,7 +1249,7 @@ STORE_RM16(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); WRITE16(cpustate,ea, src); CYCLES(cpustate,CYCLES_MOV_REG_MEM); @@ -1256,7 +1265,7 @@ STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOV_MEM_REG); @@ -1271,7 +1280,7 @@ STORE_RM16(modrm, value); CYCLES(cpustate,CYCLES_MOV_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 value = FETCH16(cpustate); WRITE16(cpustate,ea, value); CYCLES(cpustate,CYCLES_MOV_IMM_MEM); @@ -1288,9 +1297,9 @@ } /* TODO: Not sure if this is correct... */ if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 0 ); } REG16(AX) = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_MOV_MEM_ACC); @@ -1306,9 +1315,9 @@ } /* TODO: Not sure if this is correct... */ if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 1 ); } WRITE16(cpustate, ea, REG16(AX) ); CYCLES(cpustate,CYCLES_MOV_ACC_MEM); @@ -1367,11 +1376,11 @@ UINT32 eas, ead; UINT16 v; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); v = READ16(cpustate,eas); WRITE16(cpustate,ead, v); BUMP_SI(cpustate,2); @@ -1387,7 +1396,7 @@ STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); INT16 src = (INT8)READ8(cpustate,ea); STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_MEM_REG); @@ -1402,7 +1411,7 @@ STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT16 src = (UINT8)READ8(cpustate,ea); STORE_REG16(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_MEM_REG); @@ -1420,7 +1429,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = OR16(cpustate,dst, src); @@ -1440,7 +1449,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = OR16(cpustate,dst, src); @@ -1477,255 +1486,431 @@ static void I386OP(pop_ax)(i386_state *cpustate) // Opcode 0x58 { - REG16(AX) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(AX) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_cx)(i386_state *cpustate) // Opcode 0x59 { - REG16(CX) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(CX) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_dx)(i386_state *cpustate) // Opcode 0x5a { - REG16(DX) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(DX) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_bx)(i386_state *cpustate) // Opcode 0x5b { - REG16(BX) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(BX) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_sp)(i386_state *cpustate) // Opcode 0x5c { - REG16(SP) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(SP) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_bp)(i386_state *cpustate) // Opcode 0x5d { - REG16(BP) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(BP) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_si)(i386_state *cpustate) // Opcode 0x5e { - REG16(SI) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(SI) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_di)(i386_state *cpustate) // Opcode 0x5f { - REG16(DI) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + REG16(DI) = POP16(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_ds16)(i386_state *cpustate) // Opcode 0x1f { - cpustate->sreg[DS].selector = POP16(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,DS); - } else { - i386_load_segment_descriptor(cpustate,DS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + cpustate->sreg[DS].selector = POP16(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,DS); + } else { + i386_load_segment_descriptor(cpustate,DS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_es16)(i386_state *cpustate) // Opcode 0x07 { - cpustate->sreg[ES].selector = POP16(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,ES); - } else { - i386_load_segment_descriptor(cpustate,ES); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + cpustate->sreg[ES].selector = POP16(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,ES); + } else { + i386_load_segment_descriptor(cpustate,ES); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_fs16)(i386_state *cpustate) // Opcode 0x0f a1 { - cpustate->sreg[FS].selector = POP16(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,FS); - } else { - i386_load_segment_descriptor(cpustate,FS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + cpustate->sreg[FS].selector = POP16(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,FS); + } else { + i386_load_segment_descriptor(cpustate,FS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_gs16)(i386_state *cpustate) // Opcode 0x0f a9 { - cpustate->sreg[GS].selector = POP16(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,GS); - } else { - i386_load_segment_descriptor(cpustate,GS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + cpustate->sreg[GS].selector = POP16(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,GS); + } else { + i386_load_segment_descriptor(cpustate,GS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_ss16)(i386_state *cpustate) // Opcode 0x17 { + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); if(cpustate->IF != 0) // if external interrupts are enabled { cpustate->IF = 0; // reset IF for the next instruction cpustate->delayed_interrupt_enable = 1; } - cpustate->sreg[SS].selector = POP16(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,SS); - } else { - i386_load_segment_descriptor(cpustate,SS); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + cpustate->sreg[SS].selector = POP16(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,SS); + } else { + i386_load_segment_descriptor(cpustate,SS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_rm16)(i386_state *cpustate) // Opcode 0x8f { UINT8 modrm = FETCH(cpustate); - UINT16 value = POP16(cpustate); + UINT16 value; + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); - if( modrm >= 0xc0 ) { - STORE_RM16(modrm, value); - } else { - UINT32 ea = GetEA(cpustate,modrm); - WRITE16(cpustate,ea, value); + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + value = POP16(cpustate); + + if( modrm >= 0xc0 ) { + STORE_RM16(modrm, value); + } else { + UINT32 ea = GetEA(cpustate,modrm,1); + WRITE16(cpustate,ea, value); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_RM); } static void I386OP(popa)(i386_state *cpustate) // Opcode 0x61 { - REG16(DI) = POP16(cpustate); - REG16(SI) = POP16(cpustate); - REG16(BP) = POP16(cpustate); - REG16(SP) += 2; - REG16(BX) = POP16(cpustate); - REG16(DX) = POP16(cpustate); - REG16(CX) = POP16(cpustate); - REG16(AX) = POP16(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + + if(i386_limit_check(cpustate,SS,offset+15) == 0) + { + REG16(DI) = POP16(cpustate); + REG16(SI) = POP16(cpustate); + REG16(BP) = POP16(cpustate); + REG16(SP) += 2; + REG16(BX) = POP16(cpustate); + REG16(DX) = POP16(cpustate); + REG16(CX) = POP16(cpustate); + REG16(AX) = POP16(cpustate); + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POPA); } static void I386OP(popf)(i386_state *cpustate) // Opcode 0x9d { - UINT16 value = POP16(cpustate); - set_flags(cpustate,value); + UINT32 value; + UINT32 current = get_flags(cpustate); + UINT8 IOPL = (current >> 12) & 0x03; + UINT32 mask = 0x7fd5; + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + + // IOPL can only change if CPL is 0 + if(cpustate->CPL != 0) + mask &= ~0x00003000; + + // IF can only change if CPL is at least as privileged as IOPL + if(cpustate->CPL > IOPL) + mask &= ~0x00000200; + + if(V8086_MODE) + { + if(IOPL < 3) + { + logerror("POPFD(%08x): IOPL < 3 while in V86 mode.\n",cpustate->pc); + FAULT(FAULT_GP,0) // #GP(0) + } + mask &= ~0x00003000; // IOPL cannot be changed while in V8086 mode + } + + if(i386_limit_check(cpustate,SS,offset+1) == 0) + { + value = POP16(cpustate); + set_flags(cpustate,(current & ~mask) | (value & mask)); // mask out reserved bits + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POPF); } static void I386OP(push_ax)(i386_state *cpustate) // Opcode 0x50 { - PUSH16(cpustate, REG16(AX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(AX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_cx)(i386_state *cpustate) // Opcode 0x51 { - PUSH16(cpustate, REG16(CX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(CX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_dx)(i386_state *cpustate) // Opcode 0x52 { - PUSH16(cpustate, REG16(DX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(DX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_bx)(i386_state *cpustate) // Opcode 0x53 { - PUSH16(cpustate, REG16(BX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(BX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_sp)(i386_state *cpustate) // Opcode 0x54 { - PUSH16(cpustate, REG16(SP) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(SP) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_bp)(i386_state *cpustate) // Opcode 0x55 { - PUSH16(cpustate, REG16(BP) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(BP) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_si)(i386_state *cpustate) // Opcode 0x56 { - PUSH16(cpustate, REG16(SI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(SI) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_di)(i386_state *cpustate) // Opcode 0x57 { - PUSH16(cpustate, REG16(DI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, REG16(DI) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_cs16)(i386_state *cpustate) // Opcode 0x0e { - PUSH16(cpustate, cpustate->sreg[CS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[CS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_ds16)(i386_state *cpustate) // Opcode 0x1e { - PUSH16(cpustate, cpustate->sreg[DS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[DS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_es16)(i386_state *cpustate) // Opcode 0x06 { - PUSH16(cpustate, cpustate->sreg[ES].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[ES].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_fs16)(i386_state *cpustate) // Opcode 0x0f a0 { - PUSH16(cpustate, cpustate->sreg[FS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[FS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_gs16)(i386_state *cpustate) // Opcode 0x0f a8 { - PUSH16(cpustate, cpustate->sreg[GS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[GS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_ss16)(i386_state *cpustate) // Opcode 0x16 { - PUSH16(cpustate, cpustate->sreg[SS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, cpustate->sreg[SS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_i16)(i386_state *cpustate) // Opcode 0x68 { UINT16 value = FETCH16(cpustate); - PUSH16(cpustate,value); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate,value); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_IMM); } static void I386OP(pusha)(i386_state *cpustate) // Opcode 0x60 { UINT16 temp = REG16(SP); - PUSH16(cpustate, REG16(AX) ); - PUSH16(cpustate, REG16(CX) ); - PUSH16(cpustate, REG16(DX) ); - PUSH16(cpustate, REG16(BX) ); - PUSH16(cpustate, temp ); - PUSH16(cpustate, REG16(BP) ); - PUSH16(cpustate, REG16(SI) ); - PUSH16(cpustate, REG16(DI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-16) == 0) + { + PUSH16(cpustate, REG16(AX) ); + PUSH16(cpustate, REG16(CX) ); + PUSH16(cpustate, REG16(DX) ); + PUSH16(cpustate, REG16(BX) ); + PUSH16(cpustate, temp ); + PUSH16(cpustate, REG16(BP) ); + PUSH16(cpustate, REG16(SI) ); + PUSH16(cpustate, REG16(DI) ); + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSHA); } static void I386OP(pushf)(i386_state *cpustate) // Opcode 0x9c { - PUSH16(cpustate, get_flags(cpustate) & 0xffff ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-2) == 0) + PUSH16(cpustate, get_flags(cpustate) & 0xffff ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSHF); } @@ -1756,7 +1941,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = SBB16(cpustate, dst, src, cpustate->CF); @@ -1776,7 +1961,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = SBB16(cpustate, dst, src, cpustate->CF); @@ -1799,7 +1984,7 @@ { UINT32 eas; UINT16 src, dst; - eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ16(cpustate,eas); dst = REG16(AX); SUB16(cpustate,dst, src); @@ -1829,7 +2014,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_SHLD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT16 upper = LOAD_REG16(modrm); UINT8 shift = FETCH(cpustate); @@ -1871,7 +2056,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_SHLD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT16 upper = LOAD_REG16(modrm); UINT8 shift = REG8(CL); @@ -1909,7 +2094,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_SHRD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT16 upper = LOAD_REG16(modrm); UINT8 shift = FETCH(cpustate); @@ -1943,7 +2128,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_SHRD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT16 upper = LOAD_REG16(modrm); UINT8 shift = REG8(CL); @@ -1962,7 +2147,7 @@ static void I386OP(stosw)(i386_state *cpustate) // Opcode 0xab { UINT32 ead; - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); WRITE16(cpustate,ead, REG16(AX)); BUMP_DI(cpustate,2); CYCLES(cpustate,CYCLES_STOS); @@ -1979,7 +2164,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = SUB16(cpustate,dst, src); @@ -1999,7 +2184,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = SUB16(cpustate,dst, src); @@ -2042,7 +2227,7 @@ cpustate->OF = 0; CYCLES(cpustate,CYCLES_TEST_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = src & dst; @@ -2126,7 +2311,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_XCHG_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 src = READ16(cpustate,ea); UINT16 dst = LOAD_REG16(modrm); STORE_REG16(modrm, src); @@ -2146,7 +2331,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG16(modrm); dst = READ16(cpustate,ea); dst = XOR16(cpustate,dst, src); @@ -2166,7 +2351,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); dst = LOAD_REG16(modrm); dst = XOR16(cpustate,dst, src); @@ -2203,7 +2388,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = ADD16(cpustate,dst, src); @@ -2219,7 +2404,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = OR16(cpustate,dst, src); @@ -2235,7 +2420,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = ADC16(cpustate, dst, src, cpustate->CF); @@ -2251,7 +2436,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = SBB16(cpustate, dst, src, cpustate->CF); @@ -2267,7 +2452,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = AND16(cpustate,dst, src); @@ -2283,7 +2468,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = SUB16(cpustate,dst, src); @@ -2299,7 +2484,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = FETCH16(cpustate); dst = XOR16(cpustate,dst, src); @@ -2314,7 +2499,7 @@ SUB16(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ16(cpustate,ea); src = FETCH16(cpustate); SUB16(cpustate,dst, src); @@ -2340,7 +2525,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = ADD16(cpustate,dst, src); @@ -2356,7 +2541,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = OR16(cpustate,dst, src); @@ -2372,7 +2557,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = ADC16(cpustate, dst, src, cpustate->CF); @@ -2388,7 +2573,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = ((UINT16)(INT16)(INT8)FETCH(cpustate)); dst = SBB16(cpustate, dst, src, cpustate->CF); @@ -2404,7 +2589,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = AND16(cpustate,dst, src); @@ -2420,7 +2605,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = SUB16(cpustate,dst, src); @@ -2436,7 +2621,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); dst = XOR16(cpustate,dst, src); @@ -2451,7 +2636,7 @@ SUB16(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ16(cpustate,ea); src = (UINT16)(INT16)(INT8)FETCH(cpustate); SUB16(cpustate,dst, src); @@ -2473,7 +2658,7 @@ dst = i386_shift_rotate16(cpustate, modrm, dst, shift); STORE_RM16(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); shift = FETCH(cpustate) & 0x1f; dst = i386_shift_rotate16(cpustate, modrm, dst, shift); @@ -2491,7 +2676,7 @@ dst = i386_shift_rotate16(cpustate, modrm, dst, 1); STORE_RM16(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); dst = i386_shift_rotate16(cpustate, modrm, dst, 1); WRITE16(cpustate,ea, dst); @@ -2508,7 +2693,7 @@ dst = i386_shift_rotate16(cpustate, modrm, dst, REG8(CL)); STORE_RM16(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ16(cpustate,ea); dst = i386_shift_rotate16(cpustate, modrm, dst, REG8(CL)); WRITE16(cpustate,ea, dst); @@ -2530,7 +2715,7 @@ SetSZPF16(dst); CYCLES(cpustate,CYCLES_TEST_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT16 dst = READ16(cpustate,ea); UINT16 src = FETCH16(cpustate); dst &= src; @@ -2546,7 +2731,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_NOT_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); dst = ~dst; WRITE16(cpustate,ea, dst); @@ -2560,7 +2745,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_NEG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); dst = SUB16(cpustate, 0, dst ); WRITE16(cpustate,ea, dst); @@ -2575,7 +2760,7 @@ src = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_MUL16_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_MUL16_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2596,7 +2781,7 @@ src = (INT32)(INT16)LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_IMUL16_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = (INT32)(INT16)READ16(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL16_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2618,7 +2803,7 @@ src = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_DIV16_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_DIV16_ACC_MEM); } @@ -2638,7 +2823,9 @@ cpustate->CF = 1; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2650,7 +2837,7 @@ src = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_IDIV16_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_IDIV16_ACC_MEM); } @@ -2670,7 +2857,9 @@ cpustate->CF = 1; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2690,7 +2879,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_INC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); dst = INC16(cpustate,dst); WRITE16(cpustate,ea, dst); @@ -2704,7 +2893,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_DEC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); dst = DEC16(cpustate,dst); WRITE16(cpustate,ea, dst); @@ -2718,7 +2907,7 @@ address = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_CALL_REG); /* TODO: Timing = 7 + m */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_CALL_MEM); /* TODO: Timing = 10 + m */ } @@ -2736,7 +2925,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea + 0); selector = READ16(cpustate,ea + 2); CYCLES(cpustate,CYCLES_CALL_MEM_INTERSEG); /* TODO: Timing = 10 + m */ @@ -2765,7 +2954,7 @@ address = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_JMP_REG); /* TODO: Timing = 7 + m */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_JMP_MEM); /* TODO: Timing = 10 + m */ } @@ -2783,7 +2972,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea + 0); selector = READ16(cpustate,ea + 2); CYCLES(cpustate,CYCLES_JMP_MEM_INTERSEG); /* TODO: Timing = 10 + m */ @@ -2808,7 +2997,7 @@ if( modrm >= 0xc0 ) { value = LOAD_RM16(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); value = READ16(cpustate,ea); } PUSH16(cpustate,value); @@ -2837,11 +3026,10 @@ if ( PROTECTED_MODE && !V8086_MODE ) { if( modrm >= 0xc0 ) { - address = LOAD_RM16(modrm); - STORE_RM16(address, cpustate->ldtr.segment); + STORE_RM16(modrm, cpustate->ldtr.segment); CYCLES(cpustate,CYCLES_SLDT_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE16(cpustate, ea, cpustate->ldtr.segment); CYCLES(cpustate,CYCLES_SLDT_MEM); } @@ -2855,11 +3043,10 @@ if ( PROTECTED_MODE && !V8086_MODE ) { if( modrm >= 0xc0 ) { - address = LOAD_RM16(modrm); - STORE_RM16(address, cpustate->task.segment); + STORE_RM16(modrm, cpustate->task.segment); CYCLES(cpustate,CYCLES_STR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE16(cpustate, ea, cpustate->task.segment); CYCLES(cpustate,CYCLES_STR_MEM); } @@ -2872,12 +3059,14 @@ case 2: /* LLDT */ if ( PROTECTED_MODE && !V8086_MODE ) { + if(cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); cpustate->ldtr.segment = address; CYCLES(cpustate,CYCLES_LLDT_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); cpustate->ldtr.segment = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_LLDT_MEM); } @@ -2897,12 +3086,14 @@ case 3: /* LTR */ if ( PROTECTED_MODE && !V8086_MODE ) { + if(cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); cpustate->task.segment = address; CYCLES(cpustate,CYCLES_LTR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); cpustate->task.segment = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_LTR_MEM); } @@ -2927,7 +3118,7 @@ address = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_VERR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_VERR_MEM); } @@ -2990,7 +3181,7 @@ address = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_VERW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_VERW_MEM); } @@ -3058,9 +3249,9 @@ { if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->gdtr.limit); WRITE32(cpustate,ea + 2, cpustate->gdtr.base & 0xffffff); @@ -3072,11 +3263,11 @@ if (modrm >= 0xc0) { address = LOAD_RM16(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->idtr.limit); WRITE32(cpustate,ea + 2, cpustate->idtr.base & 0xffffff); @@ -3085,11 +3276,13 @@ } case 2: /* LGDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->gdtr.limit = READ16(cpustate,ea); cpustate->gdtr.base = READ32(cpustate,ea + 2) & 0xffffff; @@ -3098,11 +3291,13 @@ } case 3: /* LIDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->idtr.limit = READ16(cpustate,ea); cpustate->idtr.base = READ32(cpustate,ea + 2) & 0xffffff; @@ -3115,7 +3310,7 @@ STORE_RM16(modrm, cpustate->cr[0]); CYCLES(cpustate,CYCLES_SMSW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE16(cpustate,ea, cpustate->cr[0]); CYCLES(cpustate,CYCLES_SMSW_MEM); } @@ -3123,13 +3318,14 @@ } case 6: /* LMSW */ { - // TODO: Check for protection fault + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) UINT16 b; if( modrm >= 0xc0 ) { b = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_LMSW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); CYCLES(cpustate,CYCLES_LMSW_MEM); b = READ16(cpustate,ea); } @@ -3163,7 +3359,7 @@ CYCLES(cpustate,CYCLES_BT_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT16 dst = READ16(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3189,7 +3385,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTS_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3217,7 +3413,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTR_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3245,7 +3441,7 @@ STORE_RM16(modrm, dst); CYCLES(cpustate,CYCLES_BTC_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3281,14 +3477,14 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); seg.selector = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_LAR_MEM); } if(seg.selector == 0) { SetZF(0); // not a valid segment - logerror("i386: LAR: Selector %04x is invalid type.\n",seg.selector); + // logerror("i386 (%08x): LAR: Selector %04x is invalid type.\n",cpustate->pc,seg.selector); } else { @@ -3330,7 +3526,7 @@ UINT32 limit; I386_SREG seg; - if(PROTECTED_MODE) + if(PROTECTED_MODE && !V8086_MODE) { memset(&seg, 0, sizeof(seg)); if(modrm >= 0xc0) @@ -3339,7 +3535,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); seg.selector = READ16(cpustate,ea); } if(seg.selector == 0) @@ -3372,7 +3568,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); low = READ16(cpustate,ea + 0); high = READ16(cpustate,ea + 2); } @@ -3430,9 +3626,9 @@ { UINT32 ea; if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, REG16(BX) + REG8(AL) ); + ea = i386_translate(cpustate, cpustate->segment_override, REG16(BX) + REG8(AL), 0 ); } else { - ea = i386_translate(cpustate, DS, REG16(BX) + REG8(AL) ); + ea = i386_translate(cpustate, DS, REG16(BX) + REG8(AL), 0 ); } REG8(AL) = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_XLAT); @@ -3441,14 +3637,21 @@ static void I386OP(load_far_pointer16)(i386_state *cpustate, int s) { UINT8 modrm = FETCH(cpustate); + UINT16 selector; if( modrm >= 0xc0 ) { fatalerror("i386: load_far_pointer16 NYI"); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); STORE_REG16(modrm, READ16(cpustate,ea + 0)); - cpustate->sreg[s].selector = READ16(cpustate,ea + 2); - i386_load_segment_descriptor(cpustate, s ); + selector = READ16(cpustate,ea + 2); + if(PROTECTED_MODE && !(V8086_MODE)) + i386_protected_mode_sreg_load(cpustate,selector,s); + else + { + cpustate->sreg[s].selector = selector; + i386_load_segment_descriptor(cpustate, s ); + } } } diff -Nru mame-0.144/src/emu/cpu/i386/i386op32.c mame-0.145/src/emu/cpu/i386/i386op32.c --- mame-0.144/src/emu/cpu/i386/i386op32.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386op32.c 2012-02-06 21:30:23.000000000 +0000 @@ -126,7 +126,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = ADC32(cpustate, dst, src, cpustate->CF); @@ -146,7 +146,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = ADC32(cpustate, dst, src, cpustate->CF); @@ -176,7 +176,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = ADD32(cpustate,dst, src); @@ -196,7 +196,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = ADD32(cpustate,dst, src); @@ -226,7 +226,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = AND32(cpustate,dst, src); @@ -246,7 +246,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = AND32(cpustate,dst, src); @@ -273,7 +273,7 @@ if( modrm >= 0xc0 ) { src = LOAD_RM32(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); } @@ -289,9 +289,9 @@ dst = temp; CYCLES(cpustate,CYCLES_BSF); } + STORE_REG32(modrm, dst); } CYCLES(cpustate,CYCLES_BSF_BASE); - STORE_REG32(modrm, dst); } static void I386OP(bsr_r32_rm32)(i386_state *cpustate) // Opcode 0x0f bd @@ -302,7 +302,7 @@ if( modrm >= 0xc0 ) { src = LOAD_RM32(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); } @@ -318,9 +318,9 @@ dst = temp; CYCLES(cpustate,CYCLES_BSR); } + STORE_REG32(modrm, dst); } CYCLES(cpustate,CYCLES_BSR_BASE); - STORE_REG32(modrm, dst); } static void I386OP(bt_rm32_r32)(i386_state *cpustate) // Opcode 0x0f a3 @@ -337,9 +337,11 @@ CYCLES(cpustate,CYCLES_BT_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT32 dst = READ32(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 bit = LOAD_REG32(modrm); + ea += 4*(bit/32); + bit %= 32; + UINT32 dst = READ32(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -366,9 +368,11 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTC_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT32 dst = READ32(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 bit = LOAD_REG32(modrm); + ea += 4*(bit/32); + bit %= 32; + UINT32 dst = READ32(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -397,9 +401,11 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTR_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT32 dst = READ32(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 bit = LOAD_REG32(modrm); + ea += 4*(bit/32); + bit %= 32; + UINT32 dst = READ32(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -428,9 +434,11 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTS_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); - UINT32 dst = READ32(cpustate,ea); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 bit = LOAD_REG32(modrm); + ea += 4*(bit/32); + bit %= 32; + UINT32 dst = READ32(cpustate,ea); if( dst & (1 << bit) ) cpustate->CF = 1; @@ -468,7 +476,6 @@ static void I386OP(call_rel32)(i386_state *cpustate) // Opcode 0xe8 { INT32 disp = FETCH32(cpustate); - PUSH32(cpustate, cpustate->eip ); cpustate->eip += disp; CHANGE_PC(cpustate,cpustate->eip); @@ -495,7 +502,7 @@ SUB32(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); SUB32(cpustate,dst, src); @@ -513,7 +520,7 @@ SUB32(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); SUB32(cpustate,dst, src); @@ -534,14 +541,14 @@ { UINT32 eas, ead, src, dst; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ32(cpustate,eas); dst = READ32(cpustate,ead); - SUB32(cpustate,dst, src); + SUB32(cpustate,src,dst); BUMP_SI(cpustate,4); BUMP_DI(cpustate,4); CYCLES(cpustate,CYCLES_CMPS); @@ -610,7 +617,7 @@ src = (INT64)(INT32)LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_IMUL32_REG_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = (INT64)(INT32)READ32(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL32_REG_REG); /* TODO: Correct multiply timing */ } @@ -632,7 +639,7 @@ dst = (INT64)(INT32)LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_IMUL32_REG_IMM_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); dst = (INT64)(INT32)READ32(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL32_MEM_IMM_REG); /* TODO: Correct multiply timing */ } @@ -654,7 +661,7 @@ dst = (INT64)(INT32)LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_IMUL32_REG_IMM_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); dst = (INT64)(INT32)READ32(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL32_MEM_IMM_REG); /* TODO: Correct multiply timing */ } @@ -945,7 +952,8 @@ static void I386OP(jcxz32)(i386_state *cpustate) // Opcode 0xe3 { INT8 disp = FETCH(cpustate); - if( REG32(ECX) == 0 ) { + int val = (cpustate->address_size)?(REG32(ECX) == 0):(REG16(CX) == 0); + if( val ) { cpustate->eip += disp; CHANGE_PC(cpustate,cpustate->eip); CYCLES(cpustate,CYCLES_JCXZ); /* TODO: Timing = 9 + m */ @@ -1038,9 +1046,9 @@ { UINT32 eas; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } REG32(EAX) = READ32(cpustate,eas); BUMP_SI(cpustate,4); @@ -1089,7 +1097,7 @@ STORE_RM32(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); WRITE32(cpustate,ea, src); CYCLES(cpustate,CYCLES_MOV_REG_MEM); @@ -1105,7 +1113,7 @@ STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOV_MEM_REG); @@ -1120,7 +1128,7 @@ STORE_RM32(modrm, value); CYCLES(cpustate,CYCLES_MOV_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 value = FETCH32(cpustate); WRITE32(cpustate,ea, value); CYCLES(cpustate,CYCLES_MOV_IMM_MEM); @@ -1136,9 +1144,9 @@ offset = FETCH16(cpustate); } if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 0 ); } REG32(EAX) = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_MOV_MEM_ACC); @@ -1153,9 +1161,9 @@ offset = FETCH16(cpustate); } if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 1 ); } WRITE32(cpustate, ea, REG32(EAX) ); CYCLES(cpustate,CYCLES_MOV_ACC_MEM); @@ -1213,11 +1221,11 @@ { UINT32 eas, ead, v; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); v = READ32(cpustate,eas); WRITE32(cpustate,ead, v); BUMP_SI(cpustate,4); @@ -1233,7 +1241,7 @@ STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); INT32 src = (INT8)READ8(cpustate,ea); STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_MEM_REG); @@ -1248,7 +1256,7 @@ STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); INT32 src = (INT16)READ16(cpustate,ea); STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVSX_MEM_REG); @@ -1263,7 +1271,7 @@ STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 src = (UINT8)READ8(cpustate,ea); STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_MEM_REG); @@ -1278,7 +1286,7 @@ STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 src = (UINT16)READ16(cpustate,ea); STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_MOVZX_MEM_REG); @@ -1296,7 +1304,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = OR32(cpustate,dst, src); @@ -1316,7 +1324,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = OR32(cpustate,dst, src); @@ -1353,255 +1361,430 @@ static void I386OP(pop_eax)(i386_state *cpustate) // Opcode 0x58 { - REG32(EAX) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(EAX) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_ecx)(i386_state *cpustate) // Opcode 0x59 { - REG32(ECX) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(ECX) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_edx)(i386_state *cpustate) // Opcode 0x5a { - REG32(EDX) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(EDX) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_ebx)(i386_state *cpustate) // Opcode 0x5b { - REG32(EBX) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(EBX) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_esp)(i386_state *cpustate) // Opcode 0x5c { - REG32(ESP) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(ESP) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_ebp)(i386_state *cpustate) // Opcode 0x5d { - REG32(EBP) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(EBP) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_esi)(i386_state *cpustate) // Opcode 0x5e { - REG32(ESI) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(ESI) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_edi)(i386_state *cpustate) // Opcode 0x5f { - REG32(EDI) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + REG32(EDI) = POP32(cpustate); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_REG_SHORT); } static void I386OP(pop_ds32)(i386_state *cpustate) // Opcode 0x1f { - cpustate->sreg[DS].selector = POP32(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,DS); - } else { - i386_load_segment_descriptor(cpustate,DS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + cpustate->sreg[DS].selector = POP32(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,DS); + } else { + i386_load_segment_descriptor(cpustate,DS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_es32)(i386_state *cpustate) // Opcode 0x07 { - cpustate->sreg[ES].selector = POP32(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,ES); - } else { - i386_load_segment_descriptor(cpustate,ES); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + cpustate->sreg[ES].selector = POP32(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,ES); + } else { + i386_load_segment_descriptor(cpustate,ES); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_fs32)(i386_state *cpustate) // Opcode 0x0f a1 { - cpustate->sreg[FS].selector = POP32(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,FS); - } else { - i386_load_segment_descriptor(cpustate,FS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + cpustate->sreg[FS].selector = POP32(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,FS); + } else { + i386_load_segment_descriptor(cpustate,FS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_gs32)(i386_state *cpustate) // Opcode 0x0f a9 { - cpustate->sreg[GS].selector = POP32(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,GS); - } else { - i386_load_segment_descriptor(cpustate,GS); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + cpustate->sreg[GS].selector = POP32(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,GS); + } else { + i386_load_segment_descriptor(cpustate,GS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_ss32)(i386_state *cpustate) // Opcode 0x17 { + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); if(cpustate->IF != 0) // if external interrupts are enabled { cpustate->IF = 0; // reset IF for the next instruction cpustate->delayed_interrupt_enable = 1; } - cpustate->sreg[SS].selector = POP32(cpustate); - if( PROTECTED_MODE ) { - i386_load_segment_descriptor(cpustate,SS); - } else { - i386_load_segment_descriptor(cpustate,SS); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + cpustate->sreg[SS].selector = POP32(cpustate); + if( PROTECTED_MODE ) { + i386_load_segment_descriptor(cpustate,SS); + } else { + i386_load_segment_descriptor(cpustate,SS); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_SREG); } static void I386OP(pop_rm32)(i386_state *cpustate) // Opcode 0x8f { UINT8 modrm = FETCH(cpustate); - UINT32 value = POP32(cpustate); + UINT32 value; + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + value = POP32(cpustate); - if( modrm >= 0xc0 ) { - STORE_RM32(modrm, value); - } else { - UINT32 ea = GetEA(cpustate,modrm); - WRITE32(cpustate,ea, value); + if( modrm >= 0xc0 ) { + STORE_RM32(modrm, value); + } else { + UINT32 ea = GetEA(cpustate,modrm,1); + WRITE32(cpustate,ea, value); + } } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POP_RM); } static void I386OP(popad)(i386_state *cpustate) // Opcode 0x61 { - REG32(EDI) = POP32(cpustate); - REG32(ESI) = POP32(cpustate); - REG32(EBP) = POP32(cpustate); - REG32(ESP) += 4; - REG32(EBX) = POP32(cpustate); - REG32(EDX) = POP32(cpustate); - REG32(ECX) = POP32(cpustate); - REG32(EAX) = POP32(cpustate); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset+31) == 0) + { + REG32(EDI) = POP32(cpustate); + REG32(ESI) = POP32(cpustate); + REG32(EBP) = POP32(cpustate); + REG32(ESP) += 4; + REG32(EBX) = POP32(cpustate); + REG32(EDX) = POP32(cpustate); + REG32(ECX) = POP32(cpustate); + REG32(EAX) = POP32(cpustate); + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POPA); } static void I386OP(popfd)(i386_state *cpustate) // Opcode 0x9d { - UINT32 value = POP32(cpustate); - set_flags(cpustate,value); + UINT32 value; + UINT32 current = get_flags(cpustate); + UINT8 IOPL = (current >> 12) & 0x03; + UINT32 mask = 0x00257fd5; // VM, VIP and VIF cannot be set by POPF/POPFD + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + + // IOPL can only change if CPL is 0 + if(cpustate->CPL != 0) + mask &= ~0x00003000; + + // IF can only change if CPL is at least as privileged as IOPL + if(cpustate->CPL > IOPL) + mask &= ~0x00000200; + + if(V8086_MODE) + { + if(IOPL < 3) + { + logerror("POPFD(%08x): IOPL < 3 while in V86 mode.\n",cpustate->pc); + FAULT(FAULT_GP,0) // #GP(0) + } + mask &= ~0x00003000; // IOPL cannot be changed while in V8086 mode + } + + if(i386_limit_check(cpustate,SS,offset+3) == 0) + { + value = POP32(cpustate); + value &= ~0x00010000; // RF will always return zero + set_flags(cpustate,(current & ~mask) | (value & mask)); // mask out reserved bits + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_POPF); } static void I386OP(push_eax)(i386_state *cpustate) // Opcode 0x50 { - PUSH32(cpustate, REG32(EAX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(EAX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_ecx)(i386_state *cpustate) // Opcode 0x51 { - PUSH32(cpustate, REG32(ECX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(ECX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_edx)(i386_state *cpustate) // Opcode 0x52 { - PUSH32(cpustate, REG32(EDX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(EDX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_ebx)(i386_state *cpustate) // Opcode 0x53 { - PUSH32(cpustate, REG32(EBX) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(EBX) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_esp)(i386_state *cpustate) // Opcode 0x54 { - PUSH32(cpustate, REG32(ESP) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(ESP) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_ebp)(i386_state *cpustate) // Opcode 0x55 { - PUSH32(cpustate, REG32(EBP) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(EBP) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_esi)(i386_state *cpustate) // Opcode 0x56 { - PUSH32(cpustate, REG32(ESI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(ESI) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_edi)(i386_state *cpustate) // Opcode 0x57 { - PUSH32(cpustate, REG32(EDI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, REG32(EDI) ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_REG_SHORT); } static void I386OP(push_cs32)(i386_state *cpustate) // Opcode 0x0e { - PUSH32(cpustate, cpustate->sreg[CS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[CS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_ds32)(i386_state *cpustate) // Opcode 0x1e { - PUSH32(cpustate, cpustate->sreg[DS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[DS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_es32)(i386_state *cpustate) // Opcode 0x06 { - PUSH32(cpustate, cpustate->sreg[ES].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[ES].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_fs32)(i386_state *cpustate) // Opcode 0x0f a0 { - PUSH32(cpustate, cpustate->sreg[FS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[FS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_gs32)(i386_state *cpustate) // Opcode 0x0f a8 { - PUSH32(cpustate, cpustate->sreg[GS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[GS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_ss32)(i386_state *cpustate) // Opcode 0x16 { - PUSH32(cpustate, cpustate->sreg[SS].selector ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, cpustate->sreg[SS].selector ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_SREG); } static void I386OP(push_i32)(i386_state *cpustate) // Opcode 0x68 { UINT32 value = FETCH32(cpustate); - PUSH32(cpustate,value); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate,value); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSH_IMM); } static void I386OP(pushad)(i386_state *cpustate) // Opcode 0x60 { UINT32 temp = REG32(ESP); - PUSH32(cpustate, REG32(EAX) ); - PUSH32(cpustate, REG32(ECX) ); - PUSH32(cpustate, REG32(EDX) ); - PUSH32(cpustate, REG32(EBX) ); - PUSH32(cpustate, temp ); - PUSH32(cpustate, REG32(EBP) ); - PUSH32(cpustate, REG32(ESI) ); - PUSH32(cpustate, REG32(EDI) ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-32) == 0) + { + PUSH32(cpustate, REG32(EAX) ); + PUSH32(cpustate, REG32(ECX) ); + PUSH32(cpustate, REG32(EDX) ); + PUSH32(cpustate, REG32(EBX) ); + PUSH32(cpustate, temp ); + PUSH32(cpustate, REG32(EBP) ); + PUSH32(cpustate, REG32(ESI) ); + PUSH32(cpustate, REG32(EDI) ); + } + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSHA); } static void I386OP(pushfd)(i386_state *cpustate) // Opcode 0x9c { - PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff ); + UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); + if(i386_limit_check(cpustate,SS,offset-4) == 0) + PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff ); + else + FAULT(FAULT_SS,0) CYCLES(cpustate,CYCLES_PUSHF); } @@ -1632,7 +1815,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = SBB32(cpustate, dst, src, cpustate->CF); @@ -1652,7 +1835,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = SBB32(cpustate, dst, src, cpustate->CF); @@ -1674,7 +1857,7 @@ static void I386OP(scasd)(i386_state *cpustate) // Opcode 0xaf { UINT32 eas, src, dst; - eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ32(cpustate,eas); dst = REG32(EAX); SUB32(cpustate,dst, src); @@ -1700,7 +1883,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_SHLD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT32 upper = LOAD_REG32(modrm); UINT8 shift = FETCH(cpustate); @@ -1734,7 +1917,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_SHLD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT32 upper = LOAD_REG32(modrm); UINT8 shift = REG8(CL); @@ -1768,7 +1951,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_SHRD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT32 upper = LOAD_REG32(modrm); UINT8 shift = FETCH(cpustate); @@ -1802,7 +1985,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_SHRD_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT32 upper = LOAD_REG32(modrm); UINT8 shift = REG8(CL); @@ -1820,7 +2003,7 @@ static void I386OP(stosd)(i386_state *cpustate) // Opcode 0xab { - UINT32 eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + UINT32 eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); WRITE32(cpustate,eas, REG32(EAX)); BUMP_DI(cpustate,4); CYCLES(cpustate,CYCLES_STOS); @@ -1837,7 +2020,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = SUB32(cpustate,dst, src); @@ -1857,7 +2040,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = SUB32(cpustate,dst, src); @@ -1900,7 +2083,7 @@ cpustate->OF = 0; CYCLES(cpustate,CYCLES_TEST_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = src & dst; @@ -1984,11 +2167,11 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_XCHG_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 src = READ32(cpustate,ea); UINT32 dst = LOAD_REG32(modrm); - STORE_REG32(modrm, src); WRITE32(cpustate,ea, dst); + STORE_REG32(modrm, src); CYCLES(cpustate,CYCLES_XCHG_REG_MEM); } } @@ -2004,7 +2187,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG32(modrm); dst = READ32(cpustate,ea); dst = XOR32(cpustate,dst, src); @@ -2024,7 +2207,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); dst = LOAD_REG32(modrm); dst = XOR32(cpustate,dst, src); @@ -2061,7 +2244,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = ADD32(cpustate,dst, src); @@ -2077,7 +2260,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = OR32(cpustate,dst, src); @@ -2093,7 +2276,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = ADC32(cpustate, dst, src, cpustate->CF); @@ -2109,7 +2292,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = SBB32(cpustate, dst, src, cpustate->CF); @@ -2125,7 +2308,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = AND32(cpustate,dst, src); @@ -2141,7 +2324,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = SUB32(cpustate,dst, src); @@ -2157,7 +2340,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = FETCH32(cpustate); dst = XOR32(cpustate,dst, src); @@ -2172,7 +2355,7 @@ SUB32(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ32(cpustate,ea); src = FETCH32(cpustate); SUB32(cpustate,dst, src); @@ -2198,7 +2381,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = ADD32(cpustate,dst, src); @@ -2214,7 +2397,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = OR32(cpustate,dst, src); @@ -2230,7 +2413,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = ADC32(cpustate, dst, src, cpustate->CF); @@ -2246,7 +2429,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = ((UINT32)(INT32)(INT8)FETCH(cpustate)); dst = SBB32(cpustate, dst, src, cpustate->CF); @@ -2262,7 +2445,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = AND32(cpustate,dst, src); @@ -2278,7 +2461,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = SUB32(cpustate,dst, src); @@ -2294,7 +2477,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); dst = XOR32(cpustate,dst, src); @@ -2309,7 +2492,7 @@ SUB32(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ32(cpustate,ea); src = (UINT32)(INT32)(INT8)FETCH(cpustate); SUB32(cpustate,dst, src); @@ -2331,7 +2514,7 @@ dst = i386_shift_rotate32(cpustate, modrm, dst, shift); STORE_RM32(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); shift = FETCH(cpustate) & 0x1f; dst = i386_shift_rotate32(cpustate, modrm, dst, shift); @@ -2349,7 +2532,7 @@ dst = i386_shift_rotate32(cpustate, modrm, dst, 1); STORE_RM32(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); dst = i386_shift_rotate32(cpustate, modrm, dst, 1); WRITE32(cpustate,ea, dst); @@ -2366,7 +2549,7 @@ dst = i386_shift_rotate32(cpustate, modrm, dst, REG8(CL)); STORE_RM32(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ32(cpustate,ea); dst = i386_shift_rotate32(cpustate, modrm, dst, REG8(CL)); WRITE32(cpustate,ea, dst); @@ -2388,7 +2571,7 @@ SetSZPF32(dst); CYCLES(cpustate,CYCLES_TEST_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 dst = READ32(cpustate,ea); UINT32 src = FETCH32(cpustate); dst &= src; @@ -2404,7 +2587,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_NOT_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); dst = ~dst; WRITE32(cpustate,ea, dst); @@ -2418,7 +2601,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_NEG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); dst = SUB32(cpustate, 0, dst ); WRITE32(cpustate,ea, dst); @@ -2433,7 +2616,7 @@ src = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_MUL32_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_MUL32_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2454,7 +2637,7 @@ src = (INT64)(INT32)LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_IMUL32_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = (INT64)(INT32)READ32(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL32_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2476,7 +2659,7 @@ src = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_DIV32_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_DIV32_ACC_MEM); } @@ -2492,7 +2675,9 @@ REG32(EAX) = (UINT32)result; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2504,7 +2689,7 @@ src = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_IDIV32_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_IDIV32_ACC_MEM); } @@ -2520,7 +2705,9 @@ REG32(EAX) = (UINT32)result; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2540,7 +2727,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_INC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); dst = INC32(cpustate,dst); WRITE32(cpustate,ea, dst); @@ -2554,7 +2741,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_DEC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); dst = DEC32(cpustate,dst); WRITE32(cpustate,ea, dst); @@ -2568,7 +2755,7 @@ address = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_CALL_REG); /* TODO: Timing = 7 + m */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_CALL_MEM); /* TODO: Timing = 10 + m */ } @@ -2588,7 +2775,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ32(cpustate,ea + 0); selector = READ16(cpustate,ea + 4); CYCLES(cpustate,CYCLES_CALL_MEM_INTERSEG); /* TODO: Timing = 10 + m */ @@ -2616,7 +2803,7 @@ address = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_JMP_REG); /* TODO: Timing = 7 + m */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_JMP_MEM); /* TODO: Timing = 10 + m */ } @@ -2635,7 +2822,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); address = READ32(cpustate,ea + 0); selector = READ16(cpustate,ea + 4); CYCLES(cpustate,CYCLES_JMP_MEM_INTERSEG); /* TODO: Timing = 10 + m */ @@ -2660,7 +2847,7 @@ if( modrm >= 0xc0 ) { value = LOAD_RM32(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); value = READ32(cpustate,ea); } PUSH32(cpustate,value); @@ -2686,11 +2873,10 @@ if ( PROTECTED_MODE && !V8086_MODE ) { if( modrm >= 0xc0 ) { - address = LOAD_RM32(modrm); - STORE_RM32(address, cpustate->ldtr.segment); + STORE_RM32(modrm, cpustate->ldtr.segment); CYCLES(cpustate,CYCLES_SLDT_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE32(cpustate, ea, cpustate->ldtr.segment); CYCLES(cpustate,CYCLES_SLDT_MEM); } @@ -2704,11 +2890,10 @@ if ( PROTECTED_MODE && !V8086_MODE ) { if( modrm >= 0xc0 ) { - address = LOAD_RM32(modrm); - STORE_RM32(address, cpustate->task.segment); + STORE_RM32(modrm, cpustate->task.segment); CYCLES(cpustate,CYCLES_STR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE32(cpustate, ea, cpustate->task.segment); CYCLES(cpustate,CYCLES_STR_MEM); } @@ -2721,12 +2906,14 @@ case 2: /* LLDT */ if ( PROTECTED_MODE && !V8086_MODE ) { + if(cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); cpustate->ldtr.segment = address; CYCLES(cpustate,CYCLES_LLDT_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); cpustate->ldtr.segment = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_LLDT_MEM); } @@ -2746,12 +2933,14 @@ case 3: /* LTR */ if ( PROTECTED_MODE && !V8086_MODE ) { + if(cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); cpustate->task.segment = address; CYCLES(cpustate,CYCLES_LTR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); cpustate->task.segment = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_LTR_MEM); } @@ -2776,7 +2965,7 @@ address = LOAD_RM32(modrm); CYCLES(cpustate,CYCLES_VERR_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); address = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_VERR_MEM); } @@ -2839,7 +3028,7 @@ address = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_VERW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); address = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_VERW_MEM); } @@ -2906,9 +3095,9 @@ { if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->gdtr.limit); WRITE32(cpustate,ea + 2, cpustate->gdtr.base); @@ -2920,11 +3109,11 @@ if (modrm >= 0xc0) { address = LOAD_RM32(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->idtr.limit); WRITE32(cpustate,ea + 2, cpustate->idtr.base); @@ -2933,11 +3122,13 @@ } case 2: /* LGDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->gdtr.limit = READ16(cpustate,ea); cpustate->gdtr.base = READ32(cpustate,ea + 2); @@ -2946,17 +3137,32 @@ } case 3: /* LIDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate(cpustate, CS, address ); + ea = i386_translate(cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->idtr.limit = READ16(cpustate,ea); cpustate->idtr.base = READ32(cpustate,ea + 2); CYCLES(cpustate,CYCLES_LIDT); break; } + case 4: /* SMSW */ + { + if( modrm >= 0xc0 ) { + STORE_RM32(modrm, cpustate->cr[0] & 0xffff); + CYCLES(cpustate,CYCLES_SMSW_REG); + } else { + /* always 16-bit memory operand */ + ea = GetEA(cpustate,modrm,1); + WRITE16(cpustate,ea, cpustate->cr[0]); + CYCLES(cpustate,CYCLES_SMSW_MEM); + } + break; + } default: fatalerror("i386: unimplemented opcode 0x0f 01 /%d at %08X", (modrm >> 3) & 0x7, cpustate->eip - 2); break; @@ -2981,7 +3187,7 @@ CYCLES(cpustate,CYCLES_BT_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 dst = READ32(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3007,7 +3213,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTS_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3035,7 +3241,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTR_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3063,7 +3269,7 @@ STORE_RM32(modrm, dst); CYCLES(cpustate,CYCLES_BTC_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT8 bit = FETCH(cpustate); @@ -3099,7 +3305,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); seg.selector = READ32(cpustate,ea); CYCLES(cpustate,CYCLES_LAR_MEM); } @@ -3147,7 +3353,7 @@ UINT32 limit; I386_SREG seg; - if(PROTECTED_MODE) + if(PROTECTED_MODE && !V8086_MODE) { memset(&seg, 0, sizeof(seg)); if(modrm >= 0xc0) @@ -3156,7 +3362,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); seg.selector = READ32(cpustate,ea); } if(seg.selector == 0) @@ -3189,7 +3395,7 @@ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); low = READ32(cpustate,ea + 0); high = READ32(cpustate,ea + 4); } @@ -3247,9 +3453,9 @@ { UINT32 ea; if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, REG32(EBX) + REG8(AL) ); + ea = i386_translate(cpustate, cpustate->segment_override, REG32(EBX) + REG8(AL), 0 ); } else { - ea = i386_translate(cpustate, DS, REG32(EBX) + REG8(AL) ); + ea = i386_translate(cpustate, DS, REG32(EBX) + REG8(AL), 0 ); } REG8(AL) = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_XLAT); @@ -3258,14 +3464,21 @@ static void I386OP(load_far_pointer32)(i386_state *cpustate, int s) { UINT8 modrm = FETCH(cpustate); + UINT16 selector; if( modrm >= 0xc0 ) { fatalerror("i386: load_far_pointer32 NYI"); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); STORE_REG32(modrm, READ32(cpustate,ea + 0)); - cpustate->sreg[s].selector = READ16(cpustate,ea + 4); - i386_load_segment_descriptor(cpustate, s ); + selector = READ16(cpustate,ea + 4); + if(PROTECTED_MODE && !(V8086_MODE)) + i386_protected_mode_sreg_load(cpustate,selector,s); + else + { + cpustate->sreg[s].selector = selector; + i386_load_segment_descriptor(cpustate, s ); + } } } diff -Nru mame-0.144/src/emu/cpu/i386/i386ops.c mame-0.145/src/emu/cpu/i386/i386ops.c --- mame-0.144/src/emu/cpu/i386/i386ops.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386ops.c 2012-02-06 21:30:23.000000000 +0000 @@ -125,7 +125,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = ADC8(cpustate, dst, src, cpustate->CF); @@ -145,7 +145,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = ADC8(cpustate, dst, src, cpustate->CF); @@ -175,7 +175,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = ADD8(cpustate,dst, src); @@ -195,7 +195,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = ADD8(cpustate,dst, src); @@ -225,7 +225,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = AND8(cpustate,dst, src); @@ -245,7 +245,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = AND8(cpustate,dst, src); @@ -278,6 +278,12 @@ static void I386OP(cli)(i386_state *cpustate) // Opcode 0xfa { + if(PROTECTED_MODE) + { + UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1); + if(cpustate->CPL > IOPL) + FAULT(FAULT_GP,0); + } cpustate->IF = 0; CYCLES(cpustate,CYCLES_CLI); } @@ -298,7 +304,7 @@ SUB8(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); SUB8(cpustate,dst, src); @@ -316,7 +322,7 @@ SUB8(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); SUB8(cpustate,dst, src); @@ -338,11 +344,11 @@ UINT32 eas, ead; UINT8 src, dst; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ8(cpustate,eas); dst = READ8(cpustate,ead); SUB8(cpustate,dst, src); @@ -560,9 +566,9 @@ { UINT32 eas; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } REG8(AL) = READ8(cpustate,eas); BUMP_SI(cpustate,1); @@ -578,7 +584,7 @@ STORE_RM8(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); WRITE8(cpustate,ea, src); CYCLES(cpustate,CYCLES_MOV_REG_MEM); @@ -594,7 +600,7 @@ STORE_REG8(modrm, src); CYCLES(cpustate,CYCLES_MOV_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); STORE_REG8(modrm, src); CYCLES(cpustate,CYCLES_MOV_MEM_REG); @@ -609,7 +615,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_MOV_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 value = FETCH(cpustate); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_MOV_IMM_MEM); @@ -698,9 +704,9 @@ } /* TODO: Not sure if this is correct... */ if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 0 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 0 ); } REG8(AL) = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_MOV_IMM_MEM); @@ -716,9 +722,9 @@ } /* TODO: Not sure if this is correct... */ if( cpustate->segment_prefix ) { - ea = i386_translate(cpustate, cpustate->segment_override, offset ); + ea = i386_translate(cpustate, cpustate->segment_override, offset, 1 ); } else { - ea = i386_translate(cpustate, DS, offset ); + ea = i386_translate(cpustate, DS, offset, 1 ); } WRITE8(cpustate, ea, REG8(AL) ); CYCLES(cpustate,CYCLES_MOV_MEM_ACC); @@ -733,7 +739,7 @@ STORE_RM16(modrm, cpustate->sreg[s].selector); CYCLES(cpustate,CYCLES_MOV_SREG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE16(cpustate,ea, cpustate->sreg[s].selector); CYCLES(cpustate,CYCLES_MOV_SREG_MEM); } @@ -749,7 +755,7 @@ selector = LOAD_RM16(modrm); CYCLES(cpustate,CYCLES_MOV_REG_SREG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); selector = READ16(cpustate,ea); CYCLES(cpustate,CYCLES_MOV_MEM_SREG); } @@ -763,8 +769,13 @@ } } - cpustate->sreg[s].selector = selector; - i386_load_segment_descriptor(cpustate, s ); + if(PROTECTED_MODE && !(V8086_MODE)) // no checks in virtual 8086 mode? + i386_protected_mode_sreg_load(cpustate,selector,s); + else + { + cpustate->sreg[s].selector = selector; + i386_load_segment_descriptor(cpustate, s ); + } } static void I386OP(mov_al_i8)(i386_state *cpustate) // Opcode 0xb0 @@ -820,11 +831,11 @@ UINT32 eas, ead; UINT8 v; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); v = READ8(cpustate,eas); WRITE8(cpustate,ead, v); BUMP_SI(cpustate,1); @@ -843,7 +854,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = OR8(cpustate,dst, src); @@ -863,7 +874,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = OR8(cpustate,dst, src); @@ -905,25 +916,30 @@ UINT8 modrm = FETCH(cpustate); UINT8 flag = 0; - if( modrm >= 0xc0 ) { - src = LOAD_REG16(modrm); - dst = LOAD_RM16(modrm); - if( (dst&0x3) < (src&0x3) ) { - dst = (dst&0xfffc) | (src&0x3); - flag = 1; - STORE_RM16(modrm, dst); - } - } else { - UINT32 ea = GetEA(cpustate, modrm); - src = LOAD_REG16(modrm); - dst = READ16(cpustate, ea); - if( (dst&0x3) < (src&0x3) ) { - dst = (dst&0xfffc) | (src&0x3); - flag = 1; - WRITE16(cpustate, ea, dst); + if(PROTECTED_MODE && !V8086_MODE) + { + if( modrm >= 0xc0 ) { + src = LOAD_REG16(modrm); + dst = LOAD_RM16(modrm); + if( (dst&0x3) < (src&0x3) ) { + dst = (dst&0xfffc) | (src&0x3); + flag = 1; + STORE_RM16(modrm, dst); + } + } else { + UINT32 ea = GetEA(cpustate, modrm,1); + src = LOAD_REG16(modrm); + dst = READ16(cpustate, ea); + if( (dst&0x3) < (src&0x3) ) { + dst = (dst&0xfffc) | (src&0x3); + flag = 1; + WRITE16(cpustate, ea, dst); + } } + SetZF(flag); } - SetZF(flag); + else + i386_trap(cpustate, 6, 0, 0); // invalid opcode in real mode or v8086 mode } static void I386OP(push_i8)(i386_state *cpustate) // Opcode 0x6a @@ -940,7 +956,7 @@ UINT16 vw; UINT32 vd; - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); switch(size) { case 1: @@ -987,9 +1003,9 @@ UINT32 vd; if( cpustate->segment_prefix ) { - eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, cpustate->segment_override, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } else { - eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + eas = i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), 0 ); } switch(size) { @@ -1084,12 +1100,12 @@ if( cpustate->segment_prefix ) { // FIXME: the following does not work if both address override and segment override are used - i386_translate(cpustate, cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI) ); + i386_translate(cpustate, cpustate->segment_override, cpustate->sreg[cpustate->segment_prefix].d ? REG32(ESI) : REG16(SI), -1 ); } else { //eas = - i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI) ); + i386_translate(cpustate, DS, cpustate->address_size ? REG32(ESI) : REG16(SI), -1 ); } - i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), -1 ); switch(opcode) { @@ -1187,6 +1203,8 @@ /* if we run out of cycles to execute, and we are still in the repeat, we need * to exit this instruction in such a way to go right back into it when we have * time to execute cycles */ + if(flag && (invert_flag ? *flag : !*flag)) + return; cpustate->eip = cpustate->prev_eip; CHANGE_PC(cpustate,cpustate->eip); CYCLES_NUM(-cycle_base); @@ -1219,7 +1237,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = SBB8(cpustate, dst, src, cpustate->CF); @@ -1239,7 +1257,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = SBB8(cpustate, dst, src, cpustate->CF); @@ -1262,7 +1280,7 @@ { UINT32 eas; UINT8 src, dst; - eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + eas = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 0 ); src = READ8(cpustate,eas); dst = REG8(AL); SUB8(cpustate,dst, src); @@ -1291,7 +1309,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1308,7 +1326,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1325,7 +1343,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1342,7 +1360,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1359,7 +1377,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1376,7 +1394,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1393,7 +1411,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1410,7 +1428,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1427,7 +1445,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1444,7 +1462,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1461,7 +1479,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1478,7 +1496,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1495,7 +1513,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1512,7 +1530,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1529,7 +1547,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1546,7 +1564,7 @@ STORE_RM8(modrm, value); CYCLES(cpustate,CYCLES_SETCC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); WRITE8(cpustate,ea, value); CYCLES(cpustate,CYCLES_SETCC_MEM); } @@ -1566,6 +1584,12 @@ static void I386OP(sti)(i386_state *cpustate) // Opcode 0xfb { + if(PROTECTED_MODE) + { + UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1); + if(cpustate->CPL > IOPL) + FAULT(FAULT_GP,0); + } cpustate->delayed_interrupt_enable = 1; // IF is set after the next instruction. CYCLES(cpustate,CYCLES_STI); } @@ -1573,7 +1597,7 @@ static void I386OP(stosb)(i386_state *cpustate) // Opcode 0xaa { UINT32 ead; - ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI) ); + ead = i386_translate(cpustate, ES, cpustate->address_size ? REG32(EDI) : REG16(DI), 1 ); WRITE8(cpustate,ead, REG8(AL)); BUMP_DI(cpustate,1); CYCLES(cpustate,CYCLES_STOS); @@ -1590,7 +1614,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = SUB8(cpustate,dst, src); @@ -1610,7 +1634,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = SUB8(cpustate,dst, src); @@ -1653,7 +1677,7 @@ cpustate->OF = 0; CYCLES(cpustate,CYCLES_TEST_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = src & dst; @@ -1674,11 +1698,11 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_XCHG_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 src = READ8(cpustate,ea); UINT8 dst = LOAD_REG8(modrm); - STORE_REG8(modrm, src); WRITE8(cpustate,ea, dst); + STORE_REG8(modrm, src); CYCLES(cpustate,CYCLES_XCHG_REG_MEM); } } @@ -1694,7 +1718,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); src = LOAD_REG8(modrm); dst = READ8(cpustate,ea); dst = XOR8(cpustate,dst, src); @@ -1714,7 +1738,7 @@ STORE_REG8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); dst = LOAD_REG8(modrm); dst = XOR8(cpustate,dst, src); @@ -1751,7 +1775,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = ADD8(cpustate,dst, src); @@ -1767,7 +1791,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = OR8(cpustate,dst, src); @@ -1783,7 +1807,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = ADC8(cpustate, dst, src, cpustate->CF); @@ -1799,7 +1823,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = SBB8(cpustate, dst, src, cpustate->CF); @@ -1815,7 +1839,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = AND8(cpustate,dst, src); @@ -1831,7 +1855,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = SUB8(cpustate,dst, src); @@ -1847,7 +1871,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_ALU_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); src = FETCH(cpustate); dst = XOR8(cpustate,dst, src); @@ -1862,7 +1886,7 @@ SUB8(cpustate,dst, src); CYCLES(cpustate,CYCLES_CMP_REG_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); dst = READ8(cpustate,ea); src = FETCH(cpustate); SUB8(cpustate,dst, src); @@ -1884,7 +1908,7 @@ dst = i386_shift_rotate8(cpustate, modrm, dst, shift); STORE_RM8(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); shift = FETCH(cpustate) & 0x1f; dst = i386_shift_rotate8(cpustate, modrm, dst, shift); @@ -1902,7 +1926,7 @@ dst = i386_shift_rotate8(cpustate, modrm, dst, 1); STORE_RM8(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); dst = i386_shift_rotate8(cpustate, modrm, dst, 1); WRITE8(cpustate,ea, dst); @@ -1919,7 +1943,7 @@ dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL)); STORE_RM8(modrm, dst); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); dst = READ8(cpustate,ea); dst = i386_shift_rotate8(cpustate, modrm, dst, REG8(CL)); WRITE8(cpustate,ea, dst); @@ -1941,7 +1965,7 @@ SetSZPF8(dst); CYCLES(cpustate,CYCLES_TEST_IMM_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT8 dst = READ8(cpustate,ea); UINT8 src = FETCH(cpustate); dst &= src; @@ -1957,7 +1981,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_NOT_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 dst = READ8(cpustate,ea); dst = ~dst; WRITE8(cpustate,ea, dst); @@ -1971,7 +1995,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_NEG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 dst = READ8(cpustate,ea); dst = SUB8(cpustate, 0, dst ); WRITE8(cpustate,ea, dst); @@ -1986,7 +2010,7 @@ src = LOAD_RM8(modrm); CYCLES(cpustate,CYCLES_MUL8_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_MUL8_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2006,7 +2030,7 @@ src = (INT16)(INT8)LOAD_RM8(modrm); CYCLES(cpustate,CYCLES_IMUL8_ACC_REG); /* TODO: Correct multiply timing */ } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = (INT16)(INT8)READ8(cpustate,ea); CYCLES(cpustate,CYCLES_IMUL8_ACC_MEM); /* TODO: Correct multiply timing */ } @@ -2027,7 +2051,7 @@ src = LOAD_RM8(modrm); CYCLES(cpustate,CYCLES_DIV8_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_DIV8_ACC_MEM); } @@ -2047,7 +2071,9 @@ cpustate->CF = 1; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2059,7 +2085,7 @@ src = LOAD_RM8(modrm); CYCLES(cpustate,CYCLES_IDIV8_ACC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); src = READ8(cpustate,ea); CYCLES(cpustate,CYCLES_IDIV8_ACC_MEM); } @@ -2079,7 +2105,9 @@ cpustate->CF = 1; } } else { - /* TODO: Divide by zero */ + cpustate->ext = 0; + i386_trap(cpustate, 0, 0, 0); + cpustate->ext = 1; } } break; @@ -2099,7 +2127,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_INC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 dst = READ8(cpustate,ea); dst = INC8(cpustate,dst); WRITE8(cpustate,ea, dst); @@ -2113,7 +2141,7 @@ STORE_RM8(modrm, dst); CYCLES(cpustate,CYCLES_DEC_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 dst = READ8(cpustate,ea); dst = DEC8(cpustate,dst); WRITE8(cpustate,ea, dst); @@ -2126,7 +2154,7 @@ if( modrm >= 0xc0 ) { value = LOAD_RM8(modrm); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); value = READ8(cpustate,ea); } if( cpustate->operand_size ) { @@ -2195,13 +2223,21 @@ static void I386OP(operand_size)(i386_state *cpustate) // Opcode 0x66 { - cpustate->operand_size ^= 1; + if(cpustate->operand_prefix == 0) + { + cpustate->operand_size ^= 1; + cpustate->operand_prefix = 1; + } I386OP(decode_opcode)(cpustate); } static void I386OP(address_size)(i386_state *cpustate) // Opcode 0x67 { - cpustate->address_size ^= 1; + if(cpustate->address_prefix == 0) + { + cpustate->address_size ^= 1; + cpustate->address_prefix = 1; + } I386OP(decode_opcode)(cpustate); } @@ -2213,20 +2249,26 @@ static void I386OP(int3)(i386_state *cpustate) // Opcode 0xcc { CYCLES(cpustate,CYCLES_INT3); + cpustate->ext = 0; // not an external interrupt i386_trap(cpustate,3, 1, 0); + cpustate->ext = 1; } static void I386OP(int)(i386_state *cpustate) // Opcode 0xcd { int interrupt = FETCH(cpustate); CYCLES(cpustate,CYCLES_INT); + cpustate->ext = 0; // not an external interrupt i386_trap(cpustate,interrupt, 1, 0); + cpustate->ext = 1; } static void I386OP(into)(i386_state *cpustate) // Opcode 0xce { if( cpustate->OF ) { + cpustate->ext = 0; i386_trap(cpustate,4, 1, 0); + cpustate->ext = 1; CYCLES(cpustate,CYCLES_INTO_OF1); } else @@ -2241,7 +2283,7 @@ UINT8 modrm = FETCH(cpustate); if(modrm < 0xc0) { - i386_escape_ea = GetEA(cpustate,modrm); + i386_escape_ea = GetEA(cpustate,modrm,0); } CYCLES(cpustate,3); // TODO: confirm this (void) LOAD_RM8(modrm); @@ -2249,8 +2291,8 @@ static void I386OP(hlt)(i386_state *cpustate) // Opcode 0xf4 { - // TODO: We need to raise an exception in protected mode and when - // the current privilege level is not zero + if(PROTECTED_MODE && cpustate->CPL != 0) + FAULT(FAULT_GP,0); cpustate->halted = 1; CYCLES(cpustate,CYCLES_HLT); if (cpustate->cycles > 0) @@ -2366,6 +2408,12 @@ static void I386OP(lock)(i386_state *cpustate) // Opcode 0xf0 { + if(PROTECTED_MODE) + { + UINT8 IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1); + if(cpustate->CPL > IOPL) + FAULT(FAULT_GP,0); + } CYCLES(cpustate,CYCLES_LOCK); // TODO: Determine correct cycle count I386OP(decode_opcode)(cpustate); } diff -Nru mame-0.144/src/emu/cpu/i386/i386ops.h mame-0.145/src/emu/cpu/i386/i386ops.h --- mame-0.144/src/emu/cpu/i386/i386ops.h 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386ops.h 2012-02-06 21:30:23.000000000 +0000 @@ -244,14 +244,14 @@ { 0xDD, OP_I386, I386OP(escape), I386OP(escape), }, { 0xDE, OP_I386, I386OP(escape), I386OP(escape), }, { 0xDF, OP_I386, I386OP(escape), I386OP(escape), }, - { 0xD8, OP_FPU, I386OP(fpu_group_d8), I386OP(fpu_group_d8), }, - { 0xD9, OP_FPU, I386OP(fpu_group_d9), I386OP(fpu_group_d9), }, - { 0xDA, OP_FPU, I386OP(fpu_group_da), I386OP(fpu_group_da), }, - { 0xDB, OP_FPU, I386OP(fpu_group_db), I386OP(fpu_group_db), }, - { 0xDC, OP_FPU, I386OP(fpu_group_dc), I386OP(fpu_group_dc), }, - { 0xDD, OP_FPU, I386OP(fpu_group_dd), I386OP(fpu_group_dd), }, - { 0xDE, OP_FPU, I386OP(fpu_group_de), I386OP(fpu_group_de), }, - { 0xDF, OP_FPU, I386OP(fpu_group_df), I386OP(fpu_group_df), }, + { 0xD8, OP_FPU, I386OP(x87_group_d8), I386OP(x87_group_d8), }, + { 0xD9, OP_FPU, I386OP(x87_group_d9), I386OP(x87_group_d9), }, + { 0xDA, OP_FPU, I386OP(x87_group_da), I386OP(x87_group_da), }, + { 0xDB, OP_FPU, I386OP(x87_group_db), I386OP(x87_group_db), }, + { 0xDC, OP_FPU, I386OP(x87_group_dc), I386OP(x87_group_dc), }, + { 0xDD, OP_FPU, I386OP(x87_group_dd), I386OP(x87_group_dd), }, + { 0xDE, OP_FPU, I386OP(x87_group_de), I386OP(x87_group_de), }, + { 0xDF, OP_FPU, I386OP(x87_group_df), I386OP(x87_group_df), }, { 0xE0, OP_I386, I386OP(loopne16), I386OP(loopne32), }, { 0xE1, OP_I386, I386OP(loopz16), I386OP(loopz32), }, { 0xE2, OP_I386, I386OP(loop16), I386OP(loop32), }, @@ -293,7 +293,7 @@ { 0x07, OP_2BYTE|OP_I386, I386OP(loadall), I386OP(loadall), }, { 0x08, OP_2BYTE|OP_I486, I486OP(invd), I486OP(invd), }, { 0x09, OP_2BYTE|OP_I486, I486OP(wbinvd), I486OP(wbinvd), }, - { 0x0B, OP_2BYTE|OP_I386, I386OP(unimplemented), I386OP(unimplemented), }, + { 0x0B, OP_2BYTE|OP_PENTIUM, PENTIUMOP(ud2), PENTIUMOP(ud2), }, { 0x20, OP_2BYTE|OP_I386, I386OP(mov_r32_cr), I386OP(mov_r32_cr), }, { 0x21, OP_2BYTE|OP_I386, I386OP(mov_r32_dr), I386OP(mov_r32_dr), }, { 0x22, OP_2BYTE|OP_I386, I386OP(mov_cr_r32), I386OP(mov_cr_r32), }, @@ -348,7 +348,7 @@ { 0xAB, OP_2BYTE|OP_I386, I386OP(bts_rm16_r16), I386OP(bts_rm32_r32), }, { 0xAC, OP_2BYTE|OP_I386, I386OP(shrd16_i8), I386OP(shrd32_i8), }, { 0xAD, OP_2BYTE|OP_I386, I386OP(shrd16_cl), I386OP(shrd32_cl), }, - { 0xAE, OP_2BYTE|OP_I386, I386OP(invalid), I386OP(invalid), }, + { 0xAE, OP_2BYTE|OP_PENTIUM, PENTIUMOP(sse_group0fae), PENTIUMOP(sse_group0fae), }, { 0xAF, OP_2BYTE|OP_I386, I386OP(imul_r16_rm16), I386OP(imul_r32_rm32), }, { 0xB0, OP_2BYTE|OP_I486, I486OP(cmpxchg_rm8_r8), I486OP(cmpxchg_rm8_r8), }, { 0xB1, OP_2BYTE|OP_I486, I486OP(cmpxchg_rm16_r16), I486OP(cmpxchg_rm32_r32), }, diff -Nru mame-0.144/src/emu/cpu/i386/i386priv.h mame-0.145/src/emu/cpu/i386/i386priv.h --- mame-0.144/src/emu/cpu/i386/i386priv.h 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i386priv.h 2012-02-06 21:30:23.000000000 +0000 @@ -4,6 +4,8 @@ #define __I386_H__ #include "i386.h" +#include "../../../lib/softfloat/milieu.h" +#include "../../../lib/softfloat/softfloat.h" #define I386OP(XX) i386_##XX #define I486OP(XX) i486_##XX @@ -140,6 +142,7 @@ X87_CTRL, X87_STATUS, + X87_TAG, X87_ST0, X87_ST1, X87_ST2, @@ -167,6 +170,7 @@ UINT32 base; UINT32 limit; int d; // Operand size + bool valid; } I386_SREG; typedef struct @@ -225,6 +229,12 @@ UINT8 IOP1; UINT8 IOP2; UINT8 NT; + UINT8 RF; + UINT8 VM; + UINT8 AC; + UINT8 VIF; + UINT8 VIP; + UINT8 ID; UINT8 CPL; // current privilege level @@ -240,10 +250,14 @@ I386_SEG_DESC task; // Task register I386_SEG_DESC ldtr; // Local Descriptor Table Register + UINT8 ext; // external interrupt + int halted; int operand_size; int address_size; + int operand_prefix; + int address_prefix; int segment_prefix; int segment_override; @@ -266,15 +280,26 @@ UINT32 feature_flags; UINT64 tsc; + // FPU - X87_REG fpu_reg[8]; - UINT16 fpu_control_word; - UINT16 fpu_status_word; - UINT16 fpu_tag_word; - UINT64 fpu_data_ptr; - UINT64 fpu_inst_ptr; - UINT16 fpu_opcode; - int fpu_top; + floatx80 x87_reg[8]; + + UINT16 x87_cw; + UINT16 x87_sw; + UINT16 x87_tw; + UINT64 x87_data_ptr; + UINT64 x87_inst_ptr; + UINT16 x87_opcode; + + void (*opcode_table_x87_d8[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_d9[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_da[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_db[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_dc[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_dd[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_de[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table_x87_df[256])(i386_state *cpustate, UINT8 modrm); + void (*opcode_table1_16[256])(i386_state *cpustate); void (*opcode_table1_32[256])(i386_state *cpustate); @@ -296,11 +321,15 @@ } extern int i386_parity_table[256]; +static int i386_limit_check(i386_state *cpustate, int seg, UINT32 offset); + +#define FAULT_THROW(fault,error) { throw (UINT64)(fault | (UINT64)error << 32); } +#define PF_THROW(error) { cpustate->cr[2] = address; FAULT_THROW(FAULT_PF,error); } #define PROTECTED_MODE (cpustate->cr[0] & 0x1) #define STACK_32BIT (cpustate->sreg[SS].d) -#define V8086_MODE (cpustate->eflags & 0x00020000) -#define NESTED_TASK (cpustate->eflags & 0x00004000) +#define V8086_MODE (cpustate->VM) +#define NESTED_TASK (cpustate->NT) #define SetOF_Add32(r,s,d) (cpustate->OF = (((r) ^ (s)) & ((r) ^ (d)) & 0x80000000) ? 1: 0) #define SetOF_Add16(r,s,d) (cpustate->OF = (((r) ^ (s)) & ((r) ^ (d)) & 0x8000) ? 1 : 0) @@ -362,13 +391,25 @@ /***********************************************************************************/ -INLINE UINT32 i386_translate(i386_state *cpustate, int segment, UINT32 ip) +INLINE UINT32 i386_translate(i386_state *cpustate, int segment, UINT32 ip, int rwn) { - // TODO: segment limit + // TODO: segment limit access size, execution permission, handle exception thrown from exception handler + if(PROTECTED_MODE && !V8086_MODE && (rwn != -1)) + { + if(!(cpustate->sreg[segment].valid)) + FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0); + if(i386_limit_check(cpustate, segment, ip)) + FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0); + if((rwn == 0) && ((cpustate->sreg[segment].flags & 8) && !(cpustate->sreg[segment].flags & 2))) + FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0); + if((rwn == 1) && ((cpustate->sreg[segment].flags & 8) || !(cpustate->sreg[segment].flags & 2))) + FAULT_THROW((segment==SS)?FAULT_SS:FAULT_GP, 0); + } return cpustate->sreg[segment].base + ip; } -INLINE int translate_address(i386_state *cpustate, UINT32 *address) +// rwn; read = 0, write = 1, none = -1 +INLINE int translate_address(i386_state *cpustate, int rwn, UINT32 *address, UINT32 *error) { UINT32 a = *address; UINT32 pdbr = cpustate->cr[3] & 0xfffff000; @@ -376,39 +417,102 @@ UINT32 table = (a >> 12) & 0x3ff; UINT32 offset = a & 0xfff; UINT32 page_entry; + UINT32 ret = 1; + *error = 0; - // TODO: 4MB pages + // TODO: cr0 wp bit, 486 and higher UINT32 page_dir = cpustate->program->read_dword(pdbr + directory * 4); - if (!(cpustate->cr[4] & 0x10)) { - page_entry = cpustate->program->read_dword((page_dir & 0xfffff000) + (table * 4)); - *address = (page_entry & 0xfffff000) | offset; - } else { - if (page_dir & 0x80) - *address = (page_dir & 0xffc00000) | (a & 0x003fffff); - else { + if(page_dir & 1) + { + if (!(cpustate->cr[4] & 0x10)) + { page_entry = cpustate->program->read_dword((page_dir & 0xfffff000) + (table * 4)); - *address = (page_entry & 0xfffff000) | offset; + if(!(page_entry & 1)) + ret = 0; + else if(!(page_entry & 2) && cpustate->CPL && (rwn == 1)) + { + *error = 1; + ret = 0; + } + else + { + if(!(page_dir & 0x20) && (rwn != -1)) + cpustate->program->write_dword(pdbr + directory * 4, page_dir | 0x20); + if(!(page_entry & 0x40) && (rwn == 1)) + cpustate->program->write_dword((page_dir & 0xfffff000) + (table * 4), page_entry | 0x60); + else if(!(page_entry & 0x20) && (rwn != -1)) + cpustate->program->write_dword((page_dir & 0xfffff000) + (table * 4), page_entry | 0x20); + *address = (page_entry & 0xfffff000) | offset; + } + } + else + { + if (page_dir & 0x80) + { + if(!(page_dir & 2) && cpustate->CPL && (rwn == 1)) + { + *error = 1; + ret = 0; + } + else + { + if(!(page_dir & 0x40) && (rwn == 1)) + cpustate->program->write_dword(pdbr + directory * 4, page_dir | 0x60); + else if(!(page_dir & 0x20) && (rwn != -1)) + cpustate->program->write_dword(pdbr + directory * 4, page_dir | 0x20); + *address = (page_dir & 0xffc00000) | (a & 0x003fffff); + } + } + else + { + page_entry = cpustate->program->read_dword((page_dir & 0xfffff000) + (table * 4)); + if(!(page_entry & 1)) + ret = 0; + else if(!(page_entry & 2) && cpustate->CPL && (rwn == 1)) + { + *error = 1; + ret = 0; + } + else + { + if(!(page_dir & 0x20) && (rwn != -1)) + cpustate->program->write_dword(pdbr + directory * 4, page_dir | 0x20); + if(!(page_entry & 0x40) && (rwn == 1)) + cpustate->program->write_dword((page_dir & 0xfffff000) + (table * 4), page_entry | 0x60); + else if(!(page_entry & 0x20) && (rwn != -1)) + cpustate->program->write_dword((page_dir & 0xfffff000) + (table * 4), page_entry | 0x20); + *address = (page_entry & 0xfffff000) | offset; + } + } } } + else + ret = 0; + if(!ret) + { + if(rwn != -1) + *error |= ((rwn && 1)<<1) | ((cpustate->CPL==3)?1<<2:0); + return 0; + } return 1; } INLINE void CHANGE_PC(i386_state *cpustate, UINT32 pc) { - UINT32 address; - cpustate->pc = i386_translate(cpustate, CS, pc ); + UINT32 address, error; + cpustate->pc = i386_translate(cpustate, CS, pc, -1 ); address = cpustate->pc; if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + translate_address(cpustate,-1,&address,&error); } } INLINE void NEAR_BRANCH(i386_state *cpustate, INT32 offs) { - UINT32 address; + UINT32 address, error; /* TODO: limit */ cpustate->eip += offs; cpustate->pc += offs; @@ -417,18 +521,19 @@ if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + translate_address(cpustate,-1,&address,&error); } } INLINE UINT8 FETCH(i386_state *cpustate) { UINT8 value; - UINT32 address = cpustate->pc; + UINT32 address = cpustate->pc, error; if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } value = cpustate->direct->read_decrypted_byte(address & cpustate->a20_mask); @@ -439,7 +544,7 @@ INLINE UINT16 FETCH16(i386_state *cpustate) { UINT16 value; - UINT32 address = cpustate->pc; + UINT32 address = cpustate->pc, error; if( address & 0x1 ) { /* Unaligned read */ value = (FETCH(cpustate) << 0) | @@ -447,7 +552,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; value = cpustate->direct->read_decrypted_word(address); @@ -459,7 +565,7 @@ INLINE UINT32 FETCH32(i386_state *cpustate) { UINT32 value; - UINT32 address = cpustate->pc; + UINT32 address = cpustate->pc, error; if( cpustate->pc & 0x3 ) { /* Unaligned read */ value = (FETCH(cpustate) << 0) | @@ -469,7 +575,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -482,11 +589,12 @@ INLINE UINT8 READ8(i386_state *cpustate,UINT32 ea) { - UINT32 address = ea; + UINT32 address = ea, error; if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -495,7 +603,7 @@ INLINE UINT16 READ16(i386_state *cpustate,UINT32 ea) { UINT16 value; - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x1 ) { /* Unaligned read */ value = (READ8( cpustate, address+0 ) << 0) | @@ -503,7 +611,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -514,7 +623,7 @@ INLINE UINT32 READ32(i386_state *cpustate,UINT32 ea) { UINT32 value; - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x3 ) { /* Unaligned read */ value = (READ8( cpustate, address+0 ) << 0) | @@ -524,7 +633,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -536,7 +646,7 @@ INLINE UINT64 READ64(i386_state *cpustate,UINT32 ea) { UINT64 value; - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x7 ) { /* Unaligned read */ value = (((UINT64) READ8( cpustate, address+0 )) << 0) | @@ -550,7 +660,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,0,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -562,11 +673,12 @@ INLINE void WRITE8(i386_state *cpustate,UINT32 ea, UINT8 value) { - UINT32 address = ea; + UINT32 address = ea, error; if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,1,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -574,7 +686,7 @@ } INLINE void WRITE16(i386_state *cpustate,UINT32 ea, UINT16 value) { - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x1 ) { /* Unaligned write */ WRITE8( cpustate, address+0, value & 0xff ); @@ -582,7 +694,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,1,&address,&error)) + PF_THROW(error); } address &= cpustate->a20_mask; @@ -591,7 +704,7 @@ } INLINE void WRITE32(i386_state *cpustate,UINT32 ea, UINT32 value) { - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x3 ) { /* Unaligned write */ WRITE8( cpustate, address+0, value & 0xff ); @@ -601,7 +714,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,1,&address,&error)) + PF_THROW(error); } ea &= cpustate->a20_mask; @@ -611,7 +725,7 @@ INLINE void WRITE64(i386_state *cpustate,UINT32 ea, UINT64 value) { - UINT32 address = ea; + UINT32 address = ea, error; if( ea & 0x7 ) { /* Unaligned write */ WRITE8( cpustate, address+0, value & 0xff ); @@ -625,7 +739,8 @@ } else { if (cpustate->cr[0] & 0x80000000) // page translation enabled { - translate_address(cpustate,&address); + if(!translate_address(cpustate,1,&address,&error)) + PF_THROW(error); } ea &= cpustate->a20_mask; @@ -822,28 +937,32 @@ INLINE void PUSH16(i386_state *cpustate,UINT16 value) { - UINT32 ea; + UINT32 ea, new_esp; if( STACK_32BIT ) { - REG32(ESP) -= 2; - ea = i386_translate(cpustate, SS, REG32(ESP) ); + new_esp = REG32(ESP) - 2; + ea = i386_translate(cpustate, SS, new_esp, 1); WRITE16(cpustate, ea, value ); + REG32(ESP) = new_esp; } else { - REG16(SP) -= 2; - ea = i386_translate(cpustate, SS, REG16(SP) ); + new_esp = (REG16(SP) - 2) & 0xffff; + ea = i386_translate(cpustate, SS, new_esp, 1); WRITE16(cpustate, ea, value ); + REG16(SP) = new_esp; } } INLINE void PUSH32(i386_state *cpustate,UINT32 value) { - UINT32 ea; + UINT32 ea, new_esp; if( STACK_32BIT ) { - REG32(ESP) -= 4; - ea = i386_translate(cpustate, SS, REG32(ESP) ); + new_esp = REG32(ESP) - 4; + ea = i386_translate(cpustate, SS, new_esp, 1); WRITE32(cpustate, ea, value ); + REG32(ESP) = new_esp; } else { - REG16(SP) -= 4; - ea = i386_translate(cpustate, SS, REG16(SP) ); + new_esp = (REG16(SP) - 4) & 0xffff; + ea = i386_translate(cpustate, SS, new_esp, 1); WRITE32(cpustate, ea, value ); + REG16(SP) = new_esp; } } INLINE void PUSH8(i386_state *cpustate,UINT8 value) @@ -858,45 +977,51 @@ INLINE UINT8 POP8(i386_state *cpustate) { UINT8 value; - UINT32 ea; + UINT32 ea, new_esp; if( STACK_32BIT ) { - REG32(ESP) += 1; - ea = i386_translate(cpustate, SS, REG32(ESP) - 1); + new_esp = REG32(ESP) + 1; + ea = i386_translate(cpustate, SS, new_esp - 1, 0); value = READ8(cpustate, ea ); + REG32(ESP) = new_esp; } else { - REG16(SP) += 1; - ea = i386_translate(cpustate, SS, (REG16(SP) - 1) & 0xffff); + new_esp = REG16(SP) + 1; + ea = i386_translate(cpustate, SS, (new_esp - 1) & 0xffff, 0); value = READ8(cpustate, ea ); + REG16(SP) = new_esp; } return value; } INLINE UINT16 POP16(i386_state *cpustate) { UINT16 value; - UINT32 ea; + UINT32 ea, new_esp; if( STACK_32BIT ) { - REG32(ESP) += 2; - ea = i386_translate(cpustate, SS, REG32(ESP) - 2); + new_esp = REG32(ESP) + 2; + ea = i386_translate(cpustate, SS, new_esp - 2, 0); value = READ16(cpustate, ea ); + REG32(ESP) = new_esp; } else { - REG16(SP) += 2; - ea = i386_translate(cpustate, SS, (REG16(SP) - 2) & 0xffff); + new_esp = REG16(SP) + 2; + ea = i386_translate(cpustate, SS, (new_esp - 2) & 0xffff, 0); value = READ16(cpustate, ea ); + REG16(SP) = new_esp; } return value; } INLINE UINT32 POP32(i386_state *cpustate) { UINT32 value; - UINT32 ea; + UINT32 ea, new_esp; if( STACK_32BIT ) { - REG32(ESP) += 4; - ea = i386_translate(cpustate, SS, REG32(ESP) - 4); + new_esp = REG32(ESP) + 4; + ea = i386_translate(cpustate, SS, new_esp - 4, 0); value = READ32(cpustate, ea ); + REG32(ESP) = new_esp; } else { - REG16(SP) += 4; - ea = i386_translate(cpustate, SS, (REG16(SP) - 4) & 0xffff); + new_esp = REG16(SP) + 4; + ea = i386_translate(cpustate, SS, (new_esp - 4) & 0xffff, 0); value = READ32(cpustate, ea ); + REG16(SP) = new_esp; } return value; } @@ -923,13 +1048,42 @@ I/O ACCESS ***********************************************************************************/ +INLINE void check_ioperm(i386_state *cpustate, offs_t port, UINT8 mask) +{ + UINT8 IOPL, map; + UINT16 IOPB; + UINT32 address; + + if(!PROTECTED_MODE) + return; + + IOPL = cpustate->IOP1 | (cpustate->IOP2 << 1); + if(!V8086_MODE && (cpustate->CPL <= IOPL)) + return; + + if((cpustate->task.limit < 0x67) || ((cpustate->task.flags & 0xd) != 9)) + FAULT_THROW(FAULT_GP,0); + + address = cpustate->task.base; + IOPB = READ16(cpustate, address+0x66); + if((IOPB+(port/8)) >= cpustate->task.limit) + FAULT_THROW(FAULT_GP,0); + + map = READ8(cpustate, address+IOPB+(port/8)); + map >>= (port%8); + if(map & mask) + FAULT_THROW(FAULT_GP,0); +} + INLINE UINT8 READPORT8(i386_state *cpustate, offs_t port) { + check_ioperm(cpustate, port, 1); return cpustate->io->read_byte(port); } INLINE void WRITEPORT8(i386_state *cpustate, offs_t port, UINT8 value) { + check_ioperm(cpustate, port, 1); cpustate->io->write_byte(port, value); } @@ -942,6 +1096,7 @@ } else { + check_ioperm(cpustate, port, 3); return cpustate->io->read_word(port); } } @@ -955,6 +1110,7 @@ } else { + check_ioperm(cpustate, port, 3); cpustate->io->write_word(port, value); } } @@ -970,6 +1126,7 @@ } else { + check_ioperm(cpustate, port, 0xf); return cpustate->io->read_dword(port); } } @@ -985,9 +1142,44 @@ } else { + check_ioperm(cpustate, port, 0xf); cpustate->io->write_dword(port, value); } } +/*********************************************************************************** + MSR ACCESS +***********************************************************************************/ + +INLINE UINT64 MSR_READ(i386_state *cpustate, UINT32 offset,UINT8 *valid_msr) +{ + UINT64 res; + + *valid_msr = 0; + + switch(offset) + { + default: + logerror("RDMSR: unimplemented register called %08x at %08x\n",offset,cpustate->pc-2); + res = -1; + *valid_msr = 1; + break; + } + + return res; +} + +INLINE void MSR_WRITE(i386_state *cpustate, UINT32 offset, UINT64 data, UINT8 *valid_msr) +{ + *valid_msr = 0; + + switch(offset) + { + default: + logerror("WRMSR: unimplemented register called %08x (%08x%08x) at %08x\n",offset,(UINT32)(data >> 32),(UINT32)data,cpustate->pc-2); + *valid_msr = 1; + break; + } +} #endif /* __I386_H__ */ diff -Nru mame-0.144/src/emu/cpu/i386/i486ops.c mame-0.145/src/emu/cpu/i386/i486ops.c --- mame-0.144/src/emu/cpu/i386/i486ops.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/i486ops.c 2012-02-06 21:30:23.000000000 +0000 @@ -61,7 +61,8 @@ CYCLES(cpustate,CYCLES_CMPXCHG_REG_REG_F); } } else { - UINT32 ea = GetEA(cpustate,modrm); + // TODO: Check write if needed + UINT32 ea = GetEA(cpustate,modrm,0); UINT8 dst = READ8(cpustate,ea); UINT8 src = LOAD_REG8(modrm); @@ -94,7 +95,7 @@ CYCLES(cpustate,CYCLES_CMPXCHG_REG_REG_F); } } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT16 dst = READ16(cpustate,ea); UINT16 src = LOAD_REG16(modrm); @@ -127,7 +128,7 @@ CYCLES(cpustate,CYCLES_CMPXCHG_REG_REG_F); } } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,0); UINT32 dst = READ32(cpustate,ea); UINT32 src = LOAD_REG32(modrm); @@ -153,7 +154,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_XADD_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT8 dst = READ8(cpustate,ea); UINT8 src = LOAD_REG8(modrm); WRITE8(cpustate,ea, dst + src); @@ -172,7 +173,7 @@ STORE_REG16(modrm, dst); CYCLES(cpustate,CYCLES_XADD_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT16 dst = READ16(cpustate,ea); UINT16 src = LOAD_REG16(modrm); WRITE16(cpustate,ea, dst + src); @@ -191,7 +192,7 @@ STORE_REG32(modrm, dst); CYCLES(cpustate,CYCLES_XADD_REG_REG); } else { - UINT32 ea = GetEA(cpustate,modrm); + UINT32 ea = GetEA(cpustate,modrm,1); UINT32 dst = READ32(cpustate,ea); UINT32 src = LOAD_REG32(modrm); WRITE32(cpustate,ea, dst + src); @@ -212,9 +213,9 @@ { if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->gdtr.limit); WRITE32(cpustate,ea + 2, cpustate->gdtr.base & 0xffffff); @@ -226,11 +227,11 @@ if (modrm >= 0xc0) { address = LOAD_RM16(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->idtr.limit); WRITE32(cpustate,ea + 2, cpustate->idtr.base & 0xffffff); @@ -239,11 +240,13 @@ } case 2: /* LGDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->gdtr.limit = READ16(cpustate,ea); cpustate->gdtr.base = READ32(cpustate,ea + 2) & 0xffffff; @@ -252,11 +255,13 @@ } case 3: /* LIDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM16(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->idtr.limit = READ16(cpustate,ea); cpustate->idtr.base = READ32(cpustate,ea + 2) & 0xffffff; @@ -269,7 +274,7 @@ STORE_RM16(modrm, cpustate->cr[0]); CYCLES(cpustate,CYCLES_SMSW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); WRITE16(cpustate,ea, cpustate->cr[0]); CYCLES(cpustate,CYCLES_SMSW_MEM); } @@ -277,15 +282,16 @@ } case 6: /* LMSW */ { - // TODO: Check for protection fault UINT8 b; + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { b = LOAD_RM8(modrm); CYCLES(cpustate,CYCLES_LMSW_REG); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); CYCLES(cpustate,CYCLES_LMSW_MEM); - b = READ8(cpustate,ea); + b = READ8(cpustate,ea); } cpustate->cr[0] &= ~0x03; cpustate->cr[0] |= b & 0x03; @@ -313,9 +319,9 @@ { if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->gdtr.limit); WRITE32(cpustate,ea + 2, cpustate->gdtr.base); @@ -327,11 +333,11 @@ if (modrm >= 0xc0) { address = LOAD_RM32(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 1 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,1); } WRITE16(cpustate,ea, cpustate->idtr.limit); WRITE32(cpustate,ea + 2, cpustate->idtr.base); @@ -340,11 +346,13 @@ } case 2: /* LGDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->gdtr.limit = READ16(cpustate,ea); cpustate->gdtr.base = READ32(cpustate,ea + 2); @@ -353,17 +361,32 @@ } case 3: /* LIDT */ { + if(PROTECTED_MODE && cpustate->CPL) + FAULT(FAULT_GP,0) if( modrm >= 0xc0 ) { address = LOAD_RM32(modrm); - ea = i386_translate( cpustate, CS, address ); + ea = i386_translate( cpustate, CS, address, 0 ); } else { - ea = GetEA(cpustate,modrm); + ea = GetEA(cpustate,modrm,0); } cpustate->idtr.limit = READ16(cpustate,ea); cpustate->idtr.base = READ32(cpustate,ea + 2); CYCLES(cpustate,CYCLES_LIDT); break; } + case 4: /* SMSW */ + { + if( modrm >= 0xc0 ) { + STORE_RM32(modrm, cpustate->cr[0] & 0xffff); + CYCLES(cpustate,CYCLES_SMSW_REG); + } else { + /* always 16-bit memory operand */ + ea = GetEA(cpustate,modrm,1); + WRITE16(cpustate,ea, cpustate->cr[0]); + CYCLES(cpustate,CYCLES_SMSW_MEM); + } + break; + } case 7: /* INVLPG */ { // Nothing to do ? diff -Nru mame-0.144/src/emu/cpu/i386/pentops.c mame-0.145/src/emu/cpu/i386/pentops.c --- mame-0.144/src/emu/cpu/i386/pentops.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/pentops.c 2012-02-06 21:30:23.000000000 +0000 @@ -2,14 +2,33 @@ static void PENTIUMOP(rdmsr)(i386_state *cpustate) // Opcode 0x0f 32 { - // TODO + UINT64 data; + UINT8 valid_msr = 0; + + data = MSR_READ(cpustate,REG32(ECX),&valid_msr); + REG32(EDX) = data >> 32; + REG32(EAX) = data & 0xffffffff; + + if(cpustate->CPL != 0 || valid_msr == 0) // if current privilege level isn't 0 or the register isn't recognized ... + FAULT(FAULT_GP,0) // ... throw a general exception fault + CYCLES(cpustate,CYCLES_RDMSR); } static void PENTIUMOP(wrmsr)(i386_state *cpustate) // Opcode 0x0f 30 { - // TODO - CYCLES(cpustate,1); // TODO: correct cycle count + UINT64 data; + UINT8 valid_msr = 0; + + data = (UINT64)REG32(EAX); + data |= (UINT64)(REG32(EDX)) << 32; + + MSR_WRITE(cpustate,REG32(ECX),data,&valid_msr); + + if(cpustate->CPL != 0 || valid_msr == 0) // if current privilege level isn't 0 or the register isn't recognized + FAULT(FAULT_GP,0) // ... throw a general exception fault + + CYCLES(cpustate,1); // TODO: correct cycle count (~30-45) } static void PENTIUMOP(rdtsc)(i386_state *cpustate) // Opcode 0x0f 31 @@ -23,6 +42,8 @@ static void I386OP(cyrix_unknown)(i386_state *cpustate) // Opcode 0x0f 74 { + logerror("Unemulated 0x0f 0x74 opcode called\n"); + CYCLES(cpustate,1); } @@ -32,7 +53,7 @@ if( modm >= 0xc0 ) { fatalerror("pentium: cmpxchg8b_m64 - invalid modm"); } else { - UINT32 ea = GetEA(cpustate,modm); + UINT32 ea = GetEA(cpustate,modm,0); UINT64 value = READ64(cpustate,ea); UINT64 edx_eax = (((UINT64) REG32(EDX)) << 32) | REG32(EAX); UINT64 ecx_ebx = (((UINT64) REG32(ECX)) << 32) | REG32(EBX); @@ -50,4 +71,18 @@ } } +static void PENTIUMOP(sse_group0fae)(i386_state *cpustate) // Opcode 0x0f ae +{ + UINT8 modm = FETCH(cpustate); + if( modm == 0xf8 ) { + logerror("Unemulated SFENCE opcode called\n"); + CYCLES(cpustate,1); // sfence instruction + } else { + fatalerror("pentium: bad/unsupported 0f ae opcode"); + } +} +static void PENTIUMOP(ud2)(i386_state *cpustate) // Opcode 0x0f 0b +{ + i386_trap(cpustate, 6, 0, 0); +} diff -Nru mame-0.144/src/emu/cpu/i386/x87ops.c mame-0.145/src/emu/cpu/i386/x87ops.c --- mame-0.144/src/emu/cpu/i386/x87ops.c 2012-01-13 15:34:18.000000000 +0000 +++ mame-0.145/src/emu/cpu/i386/x87ops.c 2012-02-06 21:30:23.000000000 +0000 @@ -1,391 +1,4666 @@ -// Intel x87 FPU opcodes +/*************************************************************************** -#define ST(x) (cpustate->fpu_reg[(cpustate->fpu_top + (x)) & 7]) -#define FPU_INFINITY_DOUBLE U64(0x7ff0000000000000) -#define FPU_INFINITY_SINGLE (0x7f800000) -#define FPU_SIGN_BIT_DOUBLE U64(0x8000000000000000) -#define FPU_SIGN_BIT_SINGLE (0x80000000) + x87 FPU emulation -// FPU control word flags -#define FPU_MASK_INVALID_OP 0x0001 -#define FPU_MASK_DENORMAL_OP 0x0002 -#define FPU_MASK_ZERO_DIVIDE 0x0004 -#define FPU_MASK_OVERFLOW 0x0008 -#define FPU_MASK_UNDERFLOW 0x0010 -#define FPU_MASK_PRECISION 0x0020 + TODO: + - 80-bit precision for F2XM1, FYL2X, FPATAN + - Figure out why SoftFloat trig extensions produce bad values + - Cycle counts for all processors (currently using 486 counts) + - Precision-dependent cycle counts for divide instructions + - Last instruction, operand pointers etc. + - Fix FLDENV, FSTENV, FSAVE, FRSTOR and FPREM + - Status word C2 updates to reflect round up/down + - Handling of invalid and denormal numbers + - Remove redundant operand checks + - Exceptions + +***************************************************************************/ + +#include + + +/************************************* + * + * Defines + * + *************************************/ + +#define X87_SW_IE 0x0001 +#define X87_SW_DE 0x0002 +#define X87_SW_ZE 0x0004 +#define X87_SW_OE 0x0008 +#define X87_SW_UE 0x0010 +#define X87_SW_PE 0x0020 +#define X87_SW_SF 0x0040 +#define X87_SW_ES 0x0080 +#define X87_SW_C0 0x0100 +#define X87_SW_C1 0x0200 +#define X87_SW_C2 0x0400 +#define X87_SW_TOP_SHIFT 11 +#define X87_SW_TOP_MASK 7 +#define X87_SW_C3 0x4000 +#define X87_SW_BUSY 0x8000 + +#define X87_CW_IM 0x0001 +#define X87_CW_DM 0x0002 +#define X87_CW_ZM 0x0004 +#define X87_CW_OM 0x0008 +#define X87_CW_UM 0x0010 +#define X87_CW_PM 0x0020 +#define X87_CW_PC_SHIFT 8 +#define X87_CW_PC_MASK 3 +#define X87_CW_PC_SINGLE 0 +#define X87_CW_PC_DOUBLE 2 +#define X87_CW_PC_EXTEND 3 +#define X87_CW_RC_SHIFT 10 +#define X87_CW_RC_MASK 3 +#define X87_CW_RC_NEAREST 0 +#define X87_CW_RC_DOWN 1 +#define X87_CW_RC_UP 2 +#define X87_CW_RC_ZERO 3 + +#define X87_TW_MASK 3 +#define X87_TW_VALID 0 +#define X87_TW_ZERO 1 +#define X87_TW_SPECIAL 2 +#define X87_TW_EMPTY 3 + + +/************************************* + * + * Macros + * + *************************************/ + +#define ST_TO_PHYS(x) (((cpustate->x87_sw >> X87_SW_TOP_SHIFT) + (x)) & X87_SW_TOP_MASK) +#define ST(x) (cpustate->x87_reg[ST_TO_PHYS(x)]) +#define X87_TW_FIELD_SHIFT(x) ((x) << 1) +#define X87_TAG(x) ((cpustate->x87_tw >> X87_TW_FIELD_SHIFT(x)) & X87_TW_MASK) +#define X87_RC ((cpustate->x87_cw >> X87_CW_RC_SHIFT) & X87_CW_RC_MASK) +#define X87_IS_ST_EMPTY(x) (X87_TAG(ST_TO_PHYS(x)) == X87_TW_EMPTY) +#define X87_SW_C3_0 X87_SW_C0 + +#define UNIMPLEMENTED fatalerror("Unimplemented x87 op: %s (PC:%x)\n", __FUNCTION__, cpustate->pc) + + +/************************************* + * + * Constants + * + *************************************/ -// FPU status word flags -#define FPU_BUSY 0x8000 -#define FPU_C3 0x4000 -#define FPU_STACK_TOP_MASK 0x3800 -#define FPU_C2 0x0400 -#define FPU_C1 0x0200 -#define FPU_C0 0x0100 -#define FPU_ERROR_SUMMARY 0x0080 -#define FPU_STACK_FAULT 0x0040 -#define FPU_EXCEPTION_PRECISION 0x0020 -#define FPU_EXCEPTION_UNDERFLOW 0x0010 -#define FPU_EXCEPTION_OVERFLOW 0x0008 -#define FPU_EXCEPTION_ZERO_DIVIDE 0x0004 -#define FPU_EXCEPTION_DENORMAL_OP 0x0002 -#define FPU_EXCEPTION_INVALID_OP 0x0001 +static const floatx80 fx80_zero = { 0x0000, U64(0x0000000000000000) }; +static const floatx80 fx80_one = { 0x3fff, U64(0x8000000000000000) }; -INLINE void FPU_PUSH(i386_state *cpustate, X87_REG value) +static const floatx80 fx80_ninf = { 0xffff, U64(0x8000000000000000) }; +static const floatx80 fx80_inan = { 0xffff, U64(0xc000000000000000) }; + +/* Maps x87 round modes to SoftFloat round modes */ +static const int x87_to_sf_rc[4] = +{ + float_round_nearest_even, + float_round_down, + float_round_up, + float_round_to_zero, +}; + + +/************************************* + * + * SoftFloat helpers + * + *************************************/ + +extern flag floatx80_is_nan( floatx80 a ); + +INLINE int floatx80_is_zero(floatx80 fx) +{ + return (((fx.high & 0x7fff) == 0) && ((fx.low << 1) == 0)); +} + +INLINE int floatx80_is_inf(floatx80 fx) +{ + return (((fx.high & 0x7fff) == 0x7fff) && ((fx.low << 1) == 0)); +} + +INLINE int floatx80_is_denormal(floatx80 fx) +{ + return (((fx.high & 0x7fff) == 0) && + ((fx.low & U64(0x8000000000000000)) == 0) && + ((fx.low << 1) != 0)); +} + +INLINE floatx80 floatx80_abs(floatx80 fx) +{ + fx.high &= 0x7fff; + return fx; +} + +INLINE double fx80_to_double(floatx80 fx) +{ + UINT64 d = floatx80_to_float64(fx); + return *(double*)&d; +} + +INLINE floatx80 double_to_fx80(double in) +{ + return float64_to_floatx80(*(UINT64*)&in); +} + +INLINE floatx80 READ80(i386_state *cpustate, UINT32 ea) +{ + floatx80 t; + + t.low = READ64(cpustate, ea); + t.high = READ16(cpustate, ea + 8); + + return t; +} + +INLINE void WRITE80(i386_state *cpustate, UINT32 ea, floatx80 t) +{ + WRITE64(cpustate, ea, t.low); + WRITE16(cpustate, ea + 8, t.high); +} + + +/************************************* + * + * x87 stack handling + * + *************************************/ + +INLINE void x87_set_stack_top(i386_state *cpustate, int top) +{ + cpustate->x87_sw &= ~(X87_SW_TOP_MASK << X87_SW_TOP_SHIFT); + cpustate->x87_sw |= (top << X87_SW_TOP_SHIFT); +} + +INLINE void x87_set_tag(i386_state *cpustate, int reg, int tag) +{ + int shift = X87_TW_FIELD_SHIFT(reg); + + cpustate->x87_tw &= ~(X87_TW_MASK << shift); + cpustate->x87_tw |= (tag << shift); +} + +void x87_write_stack(i386_state *cpustate, int i, floatx80 value, int update_tag) +{ + ST(i) = value; + + if (update_tag) + { + int tag; + + if (floatx80_is_zero(value)) + { + tag = X87_TW_ZERO; + } + else if (floatx80_is_inf(value) || floatx80_is_nan(value)) + { + tag = X87_TW_SPECIAL; + } + else + { + tag = X87_TW_VALID; + } + + x87_set_tag(cpustate, ST_TO_PHYS(i), tag); + } +} + +INLINE void x87_set_stack_underflow(i386_state *cpustate) +{ + cpustate->x87_sw |= X87_SW_C1 | X87_SW_IE | X87_SW_SF; +} + +INLINE void x87_set_stack_overflow(i386_state *cpustate) +{ + cpustate->x87_sw &= ~X87_SW_C1; + cpustate->x87_sw |= X87_SW_IE | X87_SW_SF; +} + +int x87_inc_stack(i386_state *cpustate) +{ + int ret = 1; + + // Check for stack underflow + if (X87_IS_ST_EMPTY(0)) + { + ret = 0; + x87_set_stack_underflow(cpustate); + + // Don't update the stack if the exception is unmasked + if (~cpustate->x87_cw & X87_CW_IM) + return ret; + } + + x87_set_tag(cpustate, ST_TO_PHYS(0), X87_TW_EMPTY); + x87_set_stack_top(cpustate, ST_TO_PHYS(1)); + return ret; +} + +int x87_dec_stack(i386_state *cpustate) +{ + int ret = 1; + + // Check for stack overflow + if (!X87_IS_ST_EMPTY(7)) + { + ret = 0; + x87_set_stack_overflow(cpustate); + + // Don't update the stack if the exception is unmasked + if (~cpustate->x87_cw & X87_CW_IM) + return ret; + } + + x87_set_stack_top(cpustate, ST_TO_PHYS(7)); + return ret; +} + + +/************************************* + * + * Exception handling + * + *************************************/ + +int x87_check_exceptions(i386_state *cpustate) +{ + /* Update the exceptions from SoftFloat */ + if (float_exception_flags & float_flag_invalid) + { + cpustate->x87_sw |= X87_SW_IE; + float_exception_flags &= ~float_flag_invalid; + } + if (float_exception_flags & float_flag_overflow) + { + cpustate->x87_sw |= X87_SW_OE; + float_exception_flags &= ~float_flag_overflow; + } + if (float_exception_flags & float_flag_underflow) + { + cpustate->x87_sw |= X87_SW_UE; + float_exception_flags &= ~float_flag_underflow; + } + if (float_exception_flags & float_flag_inexact) + { + cpustate->x87_sw |= X87_SW_PE; + float_exception_flags &= ~float_flag_inexact; + } + + if ((cpustate->x87_sw & ~cpustate->x87_cw) & 0x3f) + { + // TODO + fatalerror("Unimplemented: unmasked x87 exception (CW:%.4x, SW:%.4x)", cpustate->x87_cw, cpustate->x87_sw); + return 0; + } + + return 1; +} + +INLINE void x87_write_cw(i386_state *cpustate, UINT16 cw) +{ + cpustate->x87_cw = cw; + + /* Update the SoftFloat rounding mode */ + float_rounding_mode = x87_to_sf_rc[(cpustate->x87_cw >> X87_CW_RC_SHIFT) & X87_CW_RC_MASK]; +} + +void x87_reset(i386_state *cpustate) +{ + x87_write_cw(cpustate, 0x0037f); + + cpustate->x87_sw = 0; + cpustate->x87_tw = 0xffff; + + // TODO: FEA=0, FDS=0, FIP=0 FOP=0 FCS=0 + cpustate->x87_data_ptr = 0; + cpustate->x87_inst_ptr = 0; + cpustate->x87_opcode = 0; +} + + +/************************************* + * + * Core arithmetic + * + *************************************/ + +static floatx80 x87_add(i386_state *cpustate, floatx80 a, floatx80 b) +{ + floatx80 result = { 0 }; + + switch ((cpustate->x87_cw >> X87_CW_PC_SHIFT) & X87_CW_PC_MASK) + { + case X87_CW_PC_SINGLE: + { + float32 a32 = floatx80_to_float32(a); + float32 b32 = floatx80_to_float32(b); + result = float32_to_floatx80(float32_add(a32, b32)); + break; + } + case X87_CW_PC_DOUBLE: + { + float64 a64 = floatx80_to_float64(a); + float64 b64 = floatx80_to_float64(b); + result = float64_to_floatx80(float64_add(a64, b64)); + break; + } + case X87_CW_PC_EXTEND: + { + result = floatx80_add(a, b); + break; + } + } + + return result; +} + +static floatx80 x87_sub(i386_state *cpustate, floatx80 a, floatx80 b) +{ + floatx80 result = { 0 }; + + switch ((cpustate->x87_cw >> X87_CW_PC_SHIFT) & X87_CW_PC_MASK) + { + case X87_CW_PC_SINGLE: + { + float32 a32 = floatx80_to_float32(a); + float32 b32 = floatx80_to_float32(b); + result = float32_to_floatx80(float32_sub(a32, b32)); + break; + } + case X87_CW_PC_DOUBLE: + { + float64 a64 = floatx80_to_float64(a); + float64 b64 = floatx80_to_float64(b); + result = float64_to_floatx80(float32_sub(a64, b64)); + break; + } + case X87_CW_PC_EXTEND: + { + result = floatx80_sub(a, b); + break; + } + } + + return result; +} + +static floatx80 x87_mul(i386_state *cpustate, floatx80 a, floatx80 b) +{ + floatx80 val = { 0 }; + + switch ((cpustate->x87_cw >> X87_CW_PC_SHIFT) & X87_CW_PC_MASK) + { + case X87_CW_PC_SINGLE: + { + float32 a32 = floatx80_to_float32(a); + float32 b32 = floatx80_to_float32(b); + val = float32_to_floatx80(float32_mul(a32, b32)); + break; + } + case X87_CW_PC_DOUBLE: + { + float64 a64 = floatx80_to_float64(a); + float64 b64 = floatx80_to_float64(b); + val = float64_to_floatx80(float64_mul(a64, b64)); + break; + } + case X87_CW_PC_EXTEND: + { + val = floatx80_mul(a, b); + break; + } + } + + return val; +} + + +static floatx80 x87_div(i386_state *cpustate, floatx80 a, floatx80 b) +{ + floatx80 val = { 0 }; + + switch ((cpustate->x87_cw >> X87_CW_PC_SHIFT) & X87_CW_PC_MASK) + { + case X87_CW_PC_SINGLE: + { + float32 a32 = floatx80_to_float32(a); + float32 b32 = floatx80_to_float32(b); + val = float32_to_floatx80(float32_div(a32, b32)); + break; + } + case X87_CW_PC_DOUBLE: + { + float64 a64 = floatx80_to_float64(a); + float64 b64 = floatx80_to_float64(b); + val = float64_to_floatx80(float64_div(a64, b64)); + break; + } + case X87_CW_PC_EXTEND: + { + val = floatx80_div(a, b); + break; + } + } + return val; +} + + +/************************************* + * + * Instructions + * + *************************************/ + +/************************************* + * + * Add + * + *************************************/ + +void x87_fadd_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fadd_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fadd_st_sti(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fadd_sti_st(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, i, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_faddp(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 8); +} + +void x87_fiadd_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 19); +} + +void x87_fiadd_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_add(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 20); +} + + +/************************************* + * + * Subtract + * + *************************************/ + +void x87_fsub_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsub_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsub_st_sti(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsub_sti_st(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, i, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsubp(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 8); +} + +void x87_fisub_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 19); +} + +void x87_fisub_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 20); +} + + +/************************************* + * + * Reverse Subtract + * + *************************************/ + +void x87_fsubr_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = float32_to_floatx80(m32real); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsubr_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = float64_to_floatx80(m64real); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsubr_st_sti(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsubr_sti_st(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, i, result, TRUE); + + CYCLES(cpustate, 8); +} + +void x87_fsubrp(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 8); +} + +void x87_fisubr_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = int32_to_floatx80(m32int); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 19); +} + +void x87_fisubr_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = int32_to_floatx80(m16int); + floatx80 b = ST(0); + + if ((floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + || (floatx80_is_inf(a) && floatx80_is_inf(b) && ((a.high ^ b.high) & 0x8000))) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_sub(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 20); +} + + +/************************************* + * + * Divide + * + *************************************/ + +void x87_fdiv_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdiv_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdiv_st_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, result, TRUE); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdiv_sti_st(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdivp(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fidiv_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fidiv_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + + +/************************************* + * + * Reverse Divide + * + *************************************/ + +void x87_fdivr_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = float32_to_floatx80(m32real); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdivr_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = float64_to_floatx80(m64real); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdivr_st_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(i); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, result, TRUE); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdivr_sti_st(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fdivrp(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + + +void x87_fidivr_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = int32_to_floatx80(m32int); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + +void x87_fidivr_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ32(cpustate, ea); + + floatx80 a = int32_to_floatx80(m16int); + floatx80 b = ST(0); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_div(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + // 73, 62, 35 + CYCLES(cpustate, 73); +} + + +/************************************* + * + * Multiply + * + *************************************/ + +void x87_fmul_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 11); +} + +void x87_fmul_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 14); +} + +void x87_fmul_st_sti(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 16); +} + +void x87_fmul_sti_st(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, i, result, TRUE); + + CYCLES(cpustate, 16); +} + +void x87_fmulp(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 16); +} + +void x87_fimul_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 22); +} + +void x87_fimul_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = x87_mul(cpustate, a, b); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 22); +} + + +/************************************* + * + * Miscellaneous arithmetic + * + *************************************/ + +void x87_fprem(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(1); + + cpustate->x87_sw &= ~X87_SW_C0; + + // TODO: Implement Cx bits + result = floatx80_rem(a, b); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 84); +} + +void x87_fprem1(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 a = ST(0); + floatx80 b = ST(1); + + cpustate->x87_sw &= ~X87_SW_C0; + + // TODO: Implement Cx bits + result = floatx80_rem(a, b); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 94); +} + +void x87_fsqrt(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 value = ST(0); + + if ((!floatx80_is_zero(value) && (value.high & 0x8000)) || + floatx80_is_denormal(value)) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + result = floatx80_sqrt(value); + } + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 8); +} + +/************************************* + * + * Trigonometric + * + *************************************/ + +void x87_f2xm1(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + // TODO: Inaccurate + double x = fx80_to_double(ST(0)); + double res = pow(2.0, x) - 1; + result = double_to_fx80(res); + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, result, TRUE); + } + + CYCLES(cpustate, 242); +} + +void x87_fyl2x(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 x = ST(0); + floatx80 y = ST(1); + + if (x.high & 0x8000) + { + cpustate->x87_sw |= X87_SW_IE; + result = fx80_inan; + } + else + { + // TODO: Inaccurate + double d64 = fx80_to_double(x); + double l2x = log(d64)/log(2.0); + result = floatx80_mul(double_to_fx80(l2x), y); + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 1, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 250); +} + +void x87_fyl2xp1(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + floatx80 x = ST(0); + floatx80 y = ST(1); + + // TODO: Inaccurate + double d64 = fx80_to_double(x); + double l2x1 = log(d64 + 1.0)/log(2.0); + result = floatx80_mul(double_to_fx80(l2x1), y); + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 1, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 313); +} + +void x87_fptan(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result1, result2; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result1 = fx80_inan; + result2 = fx80_inan; + } + else if (!X87_IS_ST_EMPTY(7)) + { + x87_set_stack_overflow(cpustate); + result1 = fx80_inan; + result2 = fx80_inan; + } + else + { + result1 = ST(0); + result2 = fx80_one; + +#if 0 // TODO: Function produces bad values + if (floatx80_ftan(result1) != -1) + cpustate->x87_sw &= ~X87_SW_C2; + else + cpustate->x87_sw |= X87_SW_C2; +#else + double x = fx80_to_double(result1); + x = tan(x); + result1 = double_to_fx80(x); + + cpustate->x87_sw &= ~X87_SW_C2; +#endif + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, result1, TRUE); + x87_dec_stack(cpustate); + x87_write_stack(cpustate, 0, result2, TRUE); + } + + CYCLES(cpustate, 244); +} + +void x87_fpatan(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + // TODO: Inaccurate + double val = atan(fx80_to_double(ST(1)) / fx80_to_double(ST(0))); + result = double_to_fx80(val); + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 1, result, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 289); +} + +void x87_fsin(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + result = ST(0); + +#if 0 // TODO: Function produces bad values + if (floatx80_fsin(result) != -1) + cpustate->x87_sw &= ~X87_SW_C2; + else + cpustate->x87_sw |= X87_SW_C2; +#else + double x = fx80_to_double(result); + x = sin(x); + result = double_to_fx80(x); + + cpustate->x87_sw &= ~X87_SW_C2; +#endif + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 241); +} + +void x87_fcos(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + result = ST(0); + +#if 0 // TODO: Function produces bad values + if (floatx80_fcos(result) != -1) + cpustate->x87_sw &= ~X87_SW_C2; + else + cpustate->x87_sw |= X87_SW_C2; +#else + double x = fx80_to_double(result); + x = cos(x); + result = double_to_fx80(x); + + cpustate->x87_sw &= ~X87_SW_C2; +#endif + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, result, TRUE); + + CYCLES(cpustate, 241); +} + +void x87_fsincos(i386_state *cpustate, UINT8 modrm) +{ + floatx80 s_result, c_result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + s_result = c_result = fx80_inan; + } + else if (!X87_IS_ST_EMPTY(7)) + { + x87_set_stack_overflow(cpustate); + s_result = c_result = fx80_inan; + } + else + { + extern int sf_fsincos(floatx80 a, floatx80 *sin_a, floatx80 *cos_a); + + s_result = c_result = ST(0); + +#if 0 // TODO: Function produces bad values + if (sf_fsincos(s_result, &s_result, &c_result) != -1) + cpustate->x87_sw &= ~X87_SW_C2; + else + cpustate->x87_sw |= X87_SW_C2; +#else + double s = fx80_to_double(s_result); + double c = fx80_to_double(c_result); + s = sin(s); + c = cos(c); + + s_result = double_to_fx80(s); + c_result = double_to_fx80(c); + + cpustate->x87_sw &= ~X87_SW_C2; +#endif + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, s_result, TRUE); + x87_dec_stack(cpustate); + x87_write_stack(cpustate, 0, c_result, TRUE); + } + + CYCLES(cpustate, 291); +} + + +/************************************* + * + * Load data + * + *************************************/ + +void x87_fld_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (x87_dec_stack(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + value = float32_to_floatx80(m32real); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (floatx80_is_signaling_nan(value) || floatx80_is_denormal(value)) + { + cpustate->x87_sw |= X87_SW_IE; + value = fx80_inan; + } + } + else + { + value = fx80_inan; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 3); +} + +void x87_fld_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (x87_dec_stack(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + value = float64_to_floatx80(m64real); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (floatx80_is_signaling_nan(value) || floatx80_is_denormal(value)) + { + cpustate->x87_sw |= X87_SW_IE; + value = fx80_inan; + } + } + else + { + value = fx80_inan; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 3); +} + +void x87_fld_m80real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (x87_dec_stack(cpustate)) + { + cpustate->x87_sw &= ~X87_SW_C1; + UINT32 ea = GetEA(cpustate, modrm, 0); + value = READ80(cpustate, ea); + } + else + { + value = fx80_inan; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 6); +} + +void x87_fld_sti(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (x87_dec_stack(cpustate)) + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST((modrm + 1) & 7); + } + else + { + value = fx80_inan; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 4); +} + +void x87_fild_m16int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (!x87_dec_stack(cpustate)) + { + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + value = int32_to_floatx80(m16int); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 13); +} + +void x87_fild_m32int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (!x87_dec_stack(cpustate)) + { + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + value = int32_to_floatx80(m32int); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 9); +} + +void x87_fild_m64int(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (!x87_dec_stack(cpustate)) + { + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT64 m64int = READ64(cpustate, ea); + value = int64_to_floatx80(m64int); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 10); +} + +void x87_fbld(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (!x87_dec_stack(cpustate)) + { + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64val = 0; + UINT16 sign; + + value = READ80(cpustate, ea); + + sign = value.high & 0x8000; + m64val += ((value.high >> 4) & 0xf) * 10; + m64val += ((value.high >> 0) & 0xf); + + for (int i = 60; i >= 0; i -= 4) + { + m64val *= 10; + m64val += (value.low >> i) & 0xf; + } + + value = int64_to_floatx80(m64val); + value.high |= sign; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 75); +} + + +/************************************* + * + * Store data + * + *************************************/ + +void x87_fst_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 m32real = floatx80_to_float32(value); + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE32(cpustate, ea, m32real); + } + + CYCLES(cpustate, 7); +} + +void x87_fst_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + { + UINT64 m64real = floatx80_to_float64(value); + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE64(cpustate, ea, m64real); + } + + CYCLES(cpustate, 8); +} + +void x87_fst_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, i, value, TRUE); + + CYCLES(cpustate, 3); +} + +void x87_fstp_m32real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 m32real = floatx80_to_float32(value); + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE32(cpustate, ea, m32real); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 7); +} + +void x87_fstp_m64real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + + if (x87_check_exceptions(cpustate)) + { + UINT64 m64real = floatx80_to_float64(value); + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE64(cpustate, ea, m64real); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 8); +} + +void x87_fstp_m80real(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE80(cpustate, ea, value); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 6); +} + +void x87_fstp_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, i, value, TRUE); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 3); +} + +void x87_fist_m16int(i386_state *cpustate, UINT8 modrm) +{ + INT16 m16int; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + m16int = -32768; + } + else + { + floatx80 fx80 = floatx80_round_to_int(ST(0)); + + floatx80 lowerLim = int32_to_floatx80(-32768); + floatx80 upperLim = int32_to_floatx80(32767); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (!floatx80_lt(fx80, lowerLim) && floatx80_le(fx80, upperLim)) + m16int = floatx80_to_int32(fx80); + else + m16int = -32768; + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE16(cpustate, ea, m16int); + } + + CYCLES(cpustate, 29); +} + +void x87_fist_m32int(i386_state *cpustate, UINT8 modrm) +{ + INT32 m32int; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + m32int = 0x80000000; + } + else + { + floatx80 fx80 = floatx80_round_to_int(ST(0)); + + floatx80 lowerLim = int32_to_floatx80(0x80000000); + floatx80 upperLim = int32_to_floatx80(0x7fffffff); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (!floatx80_lt(fx80, lowerLim) && floatx80_le(fx80, upperLim)) + m32int = floatx80_to_int32(fx80); + else + m32int = 0x80000000; + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE32(cpustate, ea, m32int); + } + + CYCLES(cpustate, 28); +} + +void x87_fistp_m16int(i386_state *cpustate, UINT8 modrm) +{ + INT16 m16int; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + m16int = (UINT16)0x8000; + } + else + { + floatx80 fx80 = floatx80_round_to_int(ST(0)); + + floatx80 lowerLim = int32_to_floatx80(-32768); + floatx80 upperLim = int32_to_floatx80(32767); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (!floatx80_lt(fx80, lowerLim) && floatx80_le(fx80, upperLim)) + m16int = floatx80_to_int32(fx80); + else + m16int = (UINT16)0x8000; + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE16(cpustate, ea, m16int); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 29); +} + +void x87_fistp_m32int(i386_state *cpustate, UINT8 modrm) +{ + INT32 m32int; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + m32int = 0x80000000; + } + else + { + floatx80 fx80 = floatx80_round_to_int(ST(0)); + + floatx80 lowerLim = int32_to_floatx80(0x80000000); + floatx80 upperLim = int32_to_floatx80(0x7fffffff); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (!floatx80_lt(fx80, lowerLim) && floatx80_le(fx80, upperLim)) + m32int = floatx80_to_int32(fx80); + else + m32int = 0x80000000; + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE32(cpustate, ea, m32int); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 29); +} + +void x87_fistp_m64int(i386_state *cpustate, UINT8 modrm) +{ + INT64 m64int; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + m64int = U64(0x8000000000000000); + } + else + { + floatx80 fx80 = floatx80_round_to_int(ST(0)); + + floatx80 lowerLim = int64_to_floatx80(U64(0x8000000000000000)); + floatx80 upperLim = int64_to_floatx80(U64(0x7fffffffffffffff)); + + cpustate->x87_sw &= ~X87_SW_C1; + + if (!floatx80_lt(fx80, lowerLim) && floatx80_le(fx80, upperLim)) + m64int = floatx80_to_int64(fx80); + else + m64int = U64(0x8000000000000000); + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE64(cpustate, ea, m64int); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 29); +} + +void x87_fbstp(i386_state *cpustate, UINT8 modrm) +{ + floatx80 result; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + result = fx80_inan; + } + else + { + UINT64 u64 = floatx80_to_int64(floatx80_abs(ST(0))); + result.low = 0; + + for (int i = 0; i < 64; i += 4) + { + result.low += (u64 % 10) << i; + u64 /= 10; + } + + result.high = (u64 % 10); + result.high += ((u64 / 10) % 10) << 4; + result.high |= ST(0).high & 0x8000; + } + + if (x87_check_exceptions(cpustate)) + { + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE80(cpustate, ea, result); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 175); +} + + +/************************************* + * + * Constant load + * + *************************************/ + +void x87_fld1(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + cpustate->x87_sw &= ~X87_SW_C1; + value = fx80_one; + tag = X87_TW_VALID; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 4); +} + +void x87_fldl2t(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + tag = X87_TW_VALID; + value.high = 0x4000; + + if (X87_RC == X87_CW_RC_UP) + value.low = U64(0xd49a784bcd1b8aff); + else + value.low = U64(0xd49a784bcd1b8afe); + + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 8); +} + +void x87_fldl2e(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + int rc = X87_RC; + tag = X87_TW_VALID; + value.high = 0x3fff; + + if (rc == X87_CW_RC_UP || rc == X87_CW_RC_NEAREST) + value.low = U64(0xb8aa3b295c17f0bc); + else + value.low = U64(0xb8aa3b295c17f0bb); + + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 8); +} + +void x87_fldpi(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + int rc = X87_RC; + tag = X87_TW_VALID; + value.high = 0x4000; + + if (rc == X87_CW_RC_UP || rc == X87_CW_RC_NEAREST) + value.low = U64(0xc90fdaa22168c235); + else + value.low = U64(0xc90fdaa22168c234); + + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 8); +} + +void x87_fldlg2(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + int rc = X87_RC; + tag = X87_TW_VALID; + value.high = 0x3ffd; + + if (rc == X87_CW_RC_UP || rc == X87_CW_RC_NEAREST) + value.low = U64(0x9a209a84fbcff799); + else + value.low = U64(0x9a209a84fbcff798); + + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 8); +} + +void x87_fldln2(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + int rc = X87_RC; + tag = X87_TW_VALID; + value.high = 0x3ffe; + + if (rc == X87_CW_RC_UP || rc == X87_CW_RC_NEAREST) + value.low = U64(0xb17217f7d1cf79ac); + else + value.low = U64(0xb17217f7d1cf79ab); + + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 8); +} + +void x87_fldz(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + int tag; + + if (x87_dec_stack(cpustate)) + { + value = fx80_zero; + tag = X87_TW_ZERO; + cpustate->x87_sw &= ~X87_SW_C1; + } + else + { + value = fx80_inan; + tag = X87_TW_SPECIAL; + } + + if (x87_check_exceptions(cpustate)) + { + x87_set_tag(cpustate, ST_TO_PHYS(0), tag); + x87_write_stack(cpustate, 0, value, FALSE); + } + + CYCLES(cpustate, 4); +} + + +/************************************* + * + * Miscellaneous + * + *************************************/ + +void x87_fnop(i386_state *cpustate, UINT8 modrm) +{ + CYCLES(cpustate, 3); +} + +void x87_fchs(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + value = ST(0); + value.high ^= 0x8000; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, FALSE); + + CYCLES(cpustate, 6); +} + +void x87_fabs(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + value = ST(0); + value.high &= 0x7fff; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, FALSE); + + CYCLES(cpustate, 6); +} + +void x87_fscale(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + value = ST(0); + + // Set the rounding mode to truncate + UINT16 old_cw = cpustate->x87_cw; + UINT16 new_cw = (old_cw & ~(X87_CW_RC_MASK << X87_CW_RC_SHIFT)) | (X87_CW_RC_ZERO << X87_CW_RC_SHIFT); + x87_write_cw(cpustate, new_cw); + + // Interpret ST(1) as an integer + UINT32 st1 = floatx80_to_int32(floatx80_round_to_int(ST(1))); + + // Restore the rounding mode + x87_write_cw(cpustate, old_cw); + + // Get the unbiased exponent of ST(0) + INT16 exp = (ST(0).high & 0x7fff) - 0x3fff; + + // Calculate the new exponent + exp = (exp + st1 + 0x3fff) & 0x7fff; + + // Write it back + value.high = (value.high & ~0x7fff) + exp; + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, FALSE); + + CYCLES(cpustate, 31); +} + +void x87_frndint(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + value = fx80_inan; + } + else + { + cpustate->x87_sw &= ~X87_SW_C1; + + value = floatx80_round_to_int(ST(0)); + } + + if (x87_check_exceptions(cpustate)) + x87_write_stack(cpustate, 0, value, TRUE); + + CYCLES(cpustate, 21); +} + +void x87_fxtract(i386_state *cpustate, UINT8 modrm) +{ + floatx80 sig80, exp80; + + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + sig80 = exp80 = fx80_inan; + } + else if (!X87_IS_ST_EMPTY(7)) + { + x87_set_stack_overflow(cpustate); + sig80 = exp80 = fx80_inan; + } + else + { + floatx80 value = ST(0); + + if (floatx80_eq(value, fx80_zero)) + { + cpustate->x87_sw |= X87_SW_ZE; + + exp80 = fx80_ninf; + sig80 = fx80_zero; + } + else + { + // Extract the unbiased exponent + exp80 = int32_to_floatx80((value.high & 0x7fff) - 0x3fff); + + // For the significand, replicate the original value and set its true exponent to 0. + sig80 = value; + sig80.high &= ~0x7fff; + sig80.high |= 0x3fff; + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_write_stack(cpustate, 0, exp80, TRUE); + x87_dec_stack(cpustate); + x87_write_stack(cpustate, 0, sig80, TRUE); + } + + CYCLES(cpustate, 21); +} + +/************************************* + * + * Comparison + * + *************************************/ + +void x87_ftst(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + if (floatx80_is_nan(ST(0))) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(ST(0), fx80_zero)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(ST(0), fx80_zero)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fxam(i386_state *cpustate, UINT8 modrm) +{ + floatx80 value = ST(0); + + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + // TODO: Unsupported and denormal values + if (X87_IS_ST_EMPTY(0)) + { + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C0; + } + else if (floatx80_is_zero(value)) + { + cpustate->x87_sw |= X87_SW_C3; + } + if (floatx80_is_nan(value)) + { + cpustate->x87_sw |= X87_SW_C0; + } + else if (floatx80_is_inf(value)) + { + cpustate->x87_sw |= X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw |= X87_SW_C2; + } + + if (value.high & 0x8000) + cpustate->x87_sw |= X87_SW_C1; + + CYCLES(cpustate, 8); +} + +void x87_ficom_m16int(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if (floatx80_is_nan(a)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 16); +} + +void x87_ficom_m32int(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if (floatx80_is_nan(a)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 15); +} + +void x87_ficomp_m16int(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT16 m16int = READ16(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m16int); + + if (floatx80_is_nan(a)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 16); +} + +void x87_ficomp_m32int(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + INT32 m32int = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = int32_to_floatx80(m32int); + + if (floatx80_is_nan(a)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 15); +} + + +void x87_fcom_m32real(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcom_m64real(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcom_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcomp_m32real(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT32 m32real = READ32(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float32_to_floatx80(m32real); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcomp_m64real(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT64 m64real = READ64(cpustate, ea); + + floatx80 a = ST(0); + floatx80 b = float64_to_floatx80(m64real); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcomp_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fcompp(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(1); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + { + x87_inc_stack(cpustate); + x87_inc_stack(cpustate); + } + + CYCLES(cpustate, 5); +} + + +/************************************* + * + * Unordererd comparison + * + *************************************/ + +void x87_fucom_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fucomp_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(i)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(i); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) + x87_inc_stack(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fucompp(i386_state *cpustate, UINT8 modrm) { - cpustate->fpu_top--; - if (cpustate->fpu_top < 0) + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + { + x87_set_stack_underflow(cpustate); + cpustate->x87_sw |= X87_SW_C3 | X87_SW_C2 | X87_SW_C0; + } + else + { + cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0); + + floatx80 a = ST(0); + floatx80 b = ST(1); + + if (floatx80_is_nan(a) || floatx80_is_nan(b)) + { + cpustate->x87_sw |= X87_SW_C0 | X87_SW_C2 | X87_SW_C3; + + if (floatx80_is_signaling_nan(a) || floatx80_is_signaling_nan(b)) + cpustate->x87_sw |= X87_SW_IE; + } + else + { + if (floatx80_eq(a, b)) + cpustate->x87_sw |= X87_SW_C3; + + if (floatx80_lt(a, b)) + cpustate->x87_sw |= X87_SW_C0; + } + } + + if (x87_check_exceptions(cpustate)) { - cpustate->fpu_top = 7; + x87_inc_stack(cpustate); + x87_inc_stack(cpustate); } - cpustate->fpu_reg[cpustate->fpu_top] = value; + CYCLES(cpustate, 4); +} + + +/************************************* + * + * Control + * + *************************************/ + +void x87_fdecstp(i386_state *cpustate, UINT8 modrm) +{ + cpustate->x87_sw &= ~X87_SW_C1; + + x87_dec_stack(cpustate); + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 3); +} + +void x87_fincstp(i386_state *cpustate, UINT8 modrm) +{ + cpustate->x87_sw &= ~X87_SW_C1; + + x87_inc_stack(cpustate); + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 3); +} + +void x87_fclex(i386_state *cpustate, UINT8 modrm) +{ + cpustate->x87_sw &= ~0x80ff; + + CYCLES(cpustate, 7); +} + +void x87_ffree(i386_state *cpustate, UINT8 modrm) +{ + x87_set_tag(cpustate, ST_TO_PHYS(modrm & 7), X87_TW_EMPTY); + + CYCLES(cpustate, 3); +} + +void x87_finit(i386_state *cpustate, UINT8 modrm) +{ + x87_reset(cpustate); + + CYCLES(cpustate, 17); +} + +void x87_fldcw(i386_state *cpustate, UINT8 modrm) +{ + UINT32 ea = GetEA(cpustate, modrm, 0); + UINT16 cw = READ16(cpustate, ea); + + x87_write_cw(cpustate, cw); + + x87_check_exceptions(cpustate); + + CYCLES(cpustate, 4); +} + +void x87_fstcw(i386_state *cpustate, UINT8 modrm) +{ + UINT32 ea = GetEA(cpustate, modrm, 1); + WRITE16(cpustate, ea, cpustate->x87_cw); + + CYCLES(cpustate, 3); } -INLINE X87_REG FPU_POP(i386_state *cpustate) +void x87_fldenv(i386_state *cpustate, UINT8 modrm) { - X87_REG value = cpustate->fpu_reg[cpustate->fpu_top]; + // TODO: Pointers and selectors + UINT32 ea = GetEA(cpustate, modrm, 0); + + if (cpustate->operand_size) + { + // 32-bit real/protected mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 4); + cpustate->x87_tw = READ16(cpustate, ea + 8); + } + else + { + // 16-bit real/protected mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 2); + cpustate->x87_tw = READ16(cpustate, ea + 4); + } - cpustate->fpu_tag_word |= 3 << (cpustate->fpu_top * 2); // set FPU register tag to 3 (empty) + x87_check_exceptions(cpustate); - cpustate->fpu_top++; - if (cpustate->fpu_top > 7) + CYCLES(cpustate,(cpustate->cr[0] & 1) ? 34 : 44); +} + +void x87_fstenv(i386_state *cpustate, UINT8 modrm) +{ + UINT32 ea = GetEA(cpustate, modrm, 1); + + // TODO: Pointers and selectors + switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1) { - cpustate->fpu_top = 0; + case 0: // 16-bit real mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 2, cpustate->x87_sw); + WRITE16(cpustate, ea + 4, cpustate->x87_tw); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + break; + case 1: // 16-bit protected mode + WRITE16(cpustate,ea + 0, cpustate->x87_cw); + WRITE16(cpustate,ea + 2, cpustate->x87_sw); + WRITE16(cpustate,ea + 4, cpustate->x87_tw); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + break; + case 2: // 32-bit real mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 4, cpustate->x87_sw); + WRITE16(cpustate, ea + 8, cpustate->x87_tw); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); + break; + case 3: // 32-bit protected mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 4, cpustate->x87_sw); + WRITE16(cpustate, ea + 8, cpustate->x87_tw); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); + break; } - return value; + CYCLES(cpustate,(cpustate->cr[0] & 1) ? 56 : 67); } -static void I386OP(fpu_group_d8)(i386_state *cpustate) // Opcode 0xd8 +void x87_fsave(i386_state *cpustate, UINT8 modrm) { - UINT8 modrm = FETCH(cpustate); - if (modrm < 0xc0) + UINT32 ea = GetEA(cpustate, modrm, 1); + + // TODO: Pointers and selectors + switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1) { - UINT32 ea = GetEA(cpustate,modrm); + case 0: // 16-bit real mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 2, cpustate->x87_sw); + WRITE16(cpustate, ea + 4, cpustate->x87_tw); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + ea += 14; + break; + case 1: // 16-bit protected mode + WRITE16(cpustate,ea + 0, cpustate->x87_cw); + WRITE16(cpustate,ea + 2, cpustate->x87_sw); + WRITE16(cpustate,ea + 4, cpustate->x87_tw); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + ea += 14; + break; + case 2: // 32-bit real mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 4, cpustate->x87_sw); + WRITE16(cpustate, ea + 8, cpustate->x87_tw); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); + ea += 28; + break; + case 3: // 32-bit protected mode + WRITE16(cpustate, ea + 0, cpustate->x87_cw); + WRITE16(cpustate, ea + 4, cpustate->x87_sw); + WRITE16(cpustate, ea + 8, cpustate->x87_tw); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); + ea += 28; + break; + } - switch ((modrm >> 3) & 0x7) - { - case 6: // FDIV - UINT32 src = READ32(cpustate,ea); - if(src == 0) - fatalerror("FPU: Unimplemented Divide-by-zero exception at %08X.\n", cpustate->pc-2); - ST(0).f = ST(0).f / src; - CYCLES(cpustate,1); // TODO + for (int i = 0; i < 8; ++i) + x87_write_stack(cpustate, i, READ80(cpustate, ea + i*10), FALSE); + + CYCLES(cpustate,(cpustate->cr[0] & 1) ? 56 : 67); +} + +void x87_frstor(i386_state *cpustate, UINT8 modrm) +{ + UINT32 ea = GetEA(cpustate, modrm, 0); + + // TODO: Pointers and selectors + switch((cpustate->cr[0] & 1)|(cpustate->operand_size & 1)<<1) + { + case 0: // 16-bit real mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 2); + cpustate->x87_tw = READ16(cpustate, ea + 4); +// WRITE16(cpustate, ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + ea += 14; + break; + case 1: // 16-bit protected mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 2); + cpustate->x87_tw = READ16(cpustate, ea + 4); +// WRITE16(cpustate,ea + 6, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate,ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate,ea + 10, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate,ea + 12, (cpustate->fpu_inst_ptr & 0x0f0000) >> 4); + ea += 14; + break; + case 2: // 32-bit real mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 4); + cpustate->x87_tw = READ16(cpustate, ea + 8); +// WRITE16(cpustate, ea + 12, cpustate->fpu_inst_ptr & 0xffff); +// WRITE16(cpustate, ea + 8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE16(cpustate, ea + 20, cpustate->fpu_data_ptr & 0xffff); +// WRITE16(cpustate, ea + 12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); +// WRITE32(cpustate, ea + 24, (cpustate->fpu_data_ptr >> 16) << 12); + ea += 28; + break; + case 3: // 32-bit protected mode + x87_write_cw(cpustate, READ16(cpustate, ea)); + cpustate->x87_sw = READ16(cpustate, ea + 4); + cpustate->x87_tw = READ16(cpustate, ea + 8); +// WRITE32(cpustate, ea + 12, cpustate->fpu_inst_ptr); +// WRITE32(cpustate, ea + 16, cpustate->fpu_opcode); +// WRITE32(cpustate, ea + 20, cpustate->fpu_data_ptr); +// WRITE32(cpustate, ea + 24, cpustate->fpu_inst_ptr); + ea += 28; break; - } } - else + + for (int i = 0; i < 8; ++i) + WRITE80(cpustate, ea + i*10, ST(i)); + + CYCLES(cpustate,(cpustate->cr[0] & 1) ? 34 : 44); +} + +void x87_fxch(i386_state *cpustate, UINT8 modrm) +{ + if (X87_IS_ST_EMPTY(0) || X87_IS_ST_EMPTY(1)) + x87_set_stack_underflow(cpustate); + + if (x87_check_exceptions(cpustate)) + { + floatx80 tmp = ST(0); + ST(0) = ST(1); + ST(1) = tmp; + + // Swap the tags + int tag0 = X87_TAG(ST_TO_PHYS(0)); + x87_set_tag(cpustate, ST_TO_PHYS(0), X87_TAG(ST_TO_PHYS(1))); + x87_set_tag(cpustate, ST_TO_PHYS(1), tag0); + } + + CYCLES(cpustate, 4); +} + +void x87_fxch_sti(i386_state *cpustate, UINT8 modrm) +{ + int i = modrm & 7; + + if (X87_IS_ST_EMPTY(0)) { - fatalerror("I386: FPU Op D8 %02X at %08X", modrm, cpustate->pc-2); + ST(0) = fx80_inan; + x87_set_tag(cpustate, ST_TO_PHYS(0), X87_TW_SPECIAL); + x87_set_stack_underflow(cpustate); } + if (X87_IS_ST_EMPTY(i)) + { + ST(i) = fx80_inan; + x87_set_tag(cpustate, ST_TO_PHYS(i), X87_TW_SPECIAL); + x87_set_stack_underflow(cpustate); + } + + if (x87_check_exceptions(cpustate)) + { + floatx80 tmp = ST(0); + ST(0) = ST(i); + ST(i) = tmp; + + // Swap the tags + int tag0 = X87_TAG(ST_TO_PHYS(0)); + x87_set_tag(cpustate, ST_TO_PHYS(0), X87_TAG(ST_TO_PHYS(i))); + x87_set_tag(cpustate, ST_TO_PHYS(i), tag0); + } + + CYCLES(cpustate, 4); +} + +void x87_fstsw_ax(i386_state *cpustate, UINT8 modrm) +{ + REG16(AX) = cpustate->x87_sw; + + CYCLES(cpustate, 3); +} + +void x87_fstsw_m2byte(i386_state *cpustate, UINT8 modrm) +{ + UINT32 ea = GetEA(cpustate, modrm, 1); + + WRITE16(cpustate, ea, cpustate->x87_sw); + + CYCLES(cpustate, 3); +} + +void x87_invalid(i386_state *cpustate, UINT8 modrm) +{ + // TODO + fatalerror("x87 invalid instruction (PC:%.4x)", cpustate->pc); +} + + + +/************************************* + * + * Instruction dispatch + * + *************************************/ + +static void I386OP(x87_group_d8)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_d8[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_d9)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_d9[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_da)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_da[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_db)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_db[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_dc)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_dc[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_dd)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_dd[modrm](cpustate, modrm); +} + +static void I386OP(x87_group_de)(i386_state *cpustate) +{ + UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_de[modrm](cpustate, modrm); } -static void I386OP(fpu_group_d9)(i386_state *cpustate) // Opcode 0xd9 +static void I386OP(x87_group_df)(i386_state *cpustate) { UINT8 modrm = FETCH(cpustate); + cpustate->opcode_table_x87_df[modrm](cpustate, modrm); +} + + +/************************************* + * + * Opcode table building + * + *************************************/ - if (modrm < 0xc0) +void build_x87_opcode_table_d8(i386_state *cpustate) +{ + int modrm = 0; + + for (modrm = 0; modrm < 0x100; ++modrm) { - UINT32 ea = GetEA(cpustate,modrm); + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - switch ((modrm >> 3) & 0x7) + if (modrm < 0xc0) { - case 5: // FLDCW + switch ((modrm >> 3) & 0x7) { - cpustate->fpu_control_word = READ16(cpustate,ea); - CYCLES(cpustate,1); // TODO - break; - } - - case 6: // FSTENV - { // TODO: 32-bit operand size - WRITE16(cpustate,ea, cpustate->fpu_control_word); - WRITE16(cpustate,ea+2, cpustate->fpu_status_word); - WRITE16(cpustate,ea+4, cpustate->fpu_tag_word); - WRITE16(cpustate,ea+6, cpustate->fpu_inst_ptr & 0xffff); - WRITE16(cpustate,ea+8, (cpustate->fpu_opcode & 0x07ff) | ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); - WRITE16(cpustate,ea+10, cpustate->fpu_data_ptr & 0xffff); - WRITE16(cpustate,ea+12, ((cpustate->fpu_inst_ptr & 0x0f0000) >> 4)); - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fadd_m32real; break; + case 0x01: ptr = x87_fmul_m32real; break; + case 0x02: ptr = x87_fcom_m32real; break; + case 0x03: ptr = x87_fcomp_m32real; break; + case 0x04: ptr = x87_fsub_m32real; break; + case 0x05: ptr = x87_fsubr_m32real; break; + case 0x06: ptr = x87_fdiv_m32real; break; + case 0x07: ptr = x87_fdivr_m32real; break; } - - case 7: // FSTCW + } + else + { + switch (modrm) { - WRITE16(cpustate,ea, cpustate->fpu_control_word); - CYCLES(cpustate,1); // TODO - break; + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: ptr = x87_fadd_st_sti; break; + case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: ptr = x87_fmul_st_sti; break; + case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: ptr = x87_fcom_sti; break; + case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: ptr = x87_fcomp_sti; break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: ptr = x87_fsub_st_sti; break; + case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: ptr = x87_fsubr_st_sti; break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: ptr = x87_fdiv_st_sti; break; + case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: ptr = x87_fdivr_st_sti; break; } - - default: - fatalerror("I386: FPU Op D9 %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_d8[modrm] = ptr; } - else +} + + +void build_x87_opcode_table_d9(i386_state *cpustate) +{ + int modrm = 0; + + for (modrm = 0; modrm < 0x100; ++modrm) { - switch (modrm & 0x3f) + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; + + if (modrm < 0xc0) { - // FLD - case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + switch ((modrm >> 3) & 0x7) { - X87_REG t = ST(modrm & 7); - FPU_PUSH(cpustate,t); - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fld_m32real; break; + case 0x02: ptr = x87_fst_m32real; break; + case 0x03: ptr = x87_fstp_m32real; break; + case 0x04: ptr = x87_fldenv; break; + case 0x05: ptr = x87_fldcw; break; + case 0x06: ptr = x87_fstenv; break; + case 0x07: ptr = x87_fstcw; break; } - - case 0x20: // FCHS + } + else + { + switch (modrm) { - ST(0).i ^= FPU_SIGN_BIT_DOUBLE; - CYCLES(cpustate,1); // TODO - break; + case 0xc0: + case 0xc1: + case 0xc2: + case 0xc3: + case 0xc4: + case 0xc5: + case 0xc6: + case 0xc7: ptr = x87_fld_sti; break; + + case 0xc8: + case 0xc9: + case 0xca: + case 0xcb: + case 0xcc: + case 0xcd: + case 0xce: + case 0xcf: ptr = x87_fxch_sti; break; + + case 0xd0: ptr = x87_fnop; break; + case 0xe0: ptr = x87_fchs; break; + case 0xe1: ptr = x87_fabs; break; + case 0xe4: ptr = x87_ftst; break; + case 0xe5: ptr = x87_fxam; break; + case 0xe8: ptr = x87_fld1; break; + case 0xe9: ptr = x87_fldl2t; break; + case 0xea: ptr = x87_fldl2e; break; + case 0xeb: ptr = x87_fldpi; break; + case 0xec: ptr = x87_fldlg2; break; + case 0xed: ptr = x87_fldln2; break; + case 0xee: ptr = x87_fldz; break; + case 0xf0: ptr = x87_f2xm1; break; + case 0xf1: ptr = x87_fyl2x; break; + case 0xf2: ptr = x87_fptan; break; + case 0xf3: ptr = x87_fpatan; break; + case 0xf4: ptr = x87_fxtract; break; + case 0xf5: ptr = x87_fprem1; break; + case 0xf6: ptr = x87_fdecstp; break; + case 0xf7: ptr = x87_fincstp; break; + case 0xf8: ptr = x87_fprem; break; + case 0xf9: ptr = x87_fyl2xp1; break; + case 0xfa: ptr = x87_fsqrt; break; + case 0xfb: ptr = x87_fsincos; break; + case 0xfc: ptr = x87_frndint; break; + case 0xfd: ptr = x87_fscale; break; + case 0xfe: ptr = x87_fsin; break; + case 0xff: ptr = x87_fcos; break; } + } - case 0x28: // FLD1 + cpustate->opcode_table_x87_d9[modrm] = ptr; + } +} + +void build_x87_opcode_table_da(i386_state *cpustate) +{ + int modrm = 0; + + for (modrm = 0; modrm < 0x100; ++modrm) + { + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; + + if (modrm < 0xc0) + { + switch ((modrm >> 3) & 0x7) { - X87_REG t; - t.f = 1.0; - FPU_PUSH(cpustate,t); - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fiadd_m32int; break; + case 0x01: ptr = x87_fimul_m32int; break; + case 0x02: ptr = x87_ficom_m32int; break; + case 0x03: ptr = x87_ficomp_m32int; break; + case 0x04: ptr = x87_fisub_m32int; break; + case 0x05: ptr = x87_fisubr_m32int; break; + case 0x06: ptr = x87_fidiv_m32int; break; + case 0x07: ptr = x87_fidivr_m32int; break; } - - case 0x2e: // FLDZ + } + else + { + switch (modrm) { - X87_REG t; - t.f = 0.0; - FPU_PUSH(cpustate,t); - CYCLES(cpustate,1); // TODO - break; + case 0xe9: ptr = x87_fucompp; break; } - default: - fatalerror("I386: FPU Op D9 %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_da[modrm] = ptr; } } -static void I386OP(fpu_group_da)(i386_state *cpustate) // Opcode 0xda -{ - UINT8 modrm = FETCH(cpustate); - fatalerror("I386: FPU Op DA %02X at %08X", modrm, cpustate->pc-2); -} -static void I386OP(fpu_group_db)(i386_state *cpustate) // Opcode 0xdb +void build_x87_opcode_table_db(i386_state *cpustate) { - UINT8 modrm = FETCH(cpustate); + int modrm = 0; - if (modrm < 0xc0) + for (modrm = 0; modrm < 0x100; ++modrm) { - fatalerror("I386: FPU Op DB %02X at %08X", modrm, cpustate->pc-2); - } - else - { - switch (modrm & 0x3f) - { - case 0x22: // FCLEX - { - // clears exception flags and busy bit. - cpustate->fpu_status_word &= ~0x80ff; + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - CYCLES(cpustate,1); // TODO - break; - } - case 0x23: // FINIT + if (modrm < 0xc0) + { + switch ((modrm >> 3) & 0x7) { - cpustate->fpu_control_word = 0x37f; - cpustate->fpu_status_word = 0; - cpustate->fpu_tag_word = 0xffff; - cpustate->fpu_data_ptr = 0; - cpustate->fpu_inst_ptr = 0; - cpustate->fpu_opcode = 0; - - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fild_m32int; break; + case 0x02: ptr = x87_fist_m32int; break; + case 0x03: ptr = x87_fistp_m32int; break; + case 0x05: ptr = x87_fld_m80real; break; + case 0x07: ptr = x87_fstp_m80real; break; } - - case 0x24: // FSETPM (treated as nop on 387+) + } + else + { + switch (modrm) { - CYCLES(cpustate,1); - break; + case 0xe0: ptr = x87_fnop; break; /* FENI */ + case 0xe1: ptr = x87_fnop; break; /* FDISI */ + case 0xe2: ptr = x87_fclex; break; + case 0xe3: ptr = x87_finit; break; + case 0xe4: ptr = x87_fnop; break; /* FSETPM */ } - - default: - fatalerror("I386: FPU Op DB %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_db[modrm] = ptr; } } -static void I386OP(fpu_group_dc)(i386_state *cpustate) // Opcode 0xdc + +void build_x87_opcode_table_dc(i386_state *cpustate) { - UINT8 modrm = FETCH(cpustate); + int modrm = 0; - if (modrm < 0xc0) + for (modrm = 0; modrm < 0x100; ++modrm) { - //UINT32 ea = GetEA(cpustate,modrm); + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - switch ((modrm >> 3) & 0x7) + if (modrm < 0xc0) { - default: - fatalerror("I386: FPU Op DC %02X at %08X", modrm, cpustate->pc-2); + switch ((modrm >> 3) & 0x7) + { + case 0x00: ptr = x87_fadd_m64real; break; + case 0x01: ptr = x87_fmul_m64real; break; + case 0x02: ptr = x87_fcom_m64real; break; + case 0x03: ptr = x87_fcomp_m64real; break; + case 0x04: ptr = x87_fsub_m64real; break; + case 0x05: ptr = x87_fsubr_m64real; break; + case 0x06: ptr = x87_fdiv_m64real; break; + case 0x07: ptr = x87_fdivr_m64real; break; + } } - } - else - { - switch (modrm & 0x3f) + else { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + switch (modrm) { - // FDIVR - if ((ST(modrm & 7).i & U64(0x7fffffffffffffff)) == 0) - { - // set result as infinity if zero divide is masked - if (cpustate->fpu_control_word & FPU_MASK_ZERO_DIVIDE) - { - ST(modrm & 7).i |= FPU_INFINITY_DOUBLE; - } - } - else - { - ST(modrm & 7).f = ST(0).f / ST(modrm & 7).f; - } - CYCLES(cpustate,1); // TODO - break; + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: ptr = x87_fadd_sti_st; break; + case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: ptr = x87_fmul_sti_st; break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: ptr = x87_fsubr_sti_st; break; + case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: ptr = x87_fsub_sti_st; break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: ptr = x87_fdivr_sti_st; break; + case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: ptr = x87_fdiv_sti_st; break; } - - default: - fatalerror("I386: FPU Op DC %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_dc[modrm] = ptr; } } -static void I386OP(fpu_group_dd)(i386_state *cpustate) // Opcode 0xdd + +void build_x87_opcode_table_dd(i386_state *cpustate) { - UINT8 modrm = FETCH(cpustate); + int modrm = 0; - if (modrm < 0xc0) + for (modrm = 0; modrm < 0x100; ++modrm) { - UINT32 ea = GetEA(cpustate,modrm); + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - switch ((modrm >> 3) & 0x7) + if (modrm < 0xc0) { - case 7: // FSTSW + switch ((modrm >> 3) & 0x7) { - WRITE16(cpustate,ea, (cpustate->fpu_status_word & ~FPU_STACK_TOP_MASK) | (cpustate->fpu_top << 10)); - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fld_m64real; break; + case 0x02: ptr = x87_fst_m64real; break; + case 0x03: ptr = x87_fstp_m64real; break; + case 0x04: ptr = x87_frstor; break; + case 0x06: ptr = x87_fsave; break; + case 0x07: ptr = x87_fstsw_m2byte; break; } - - default: - fatalerror("I386: FPU Op DD %02X at %08X", modrm, cpustate->pc-2); } - } - else - { - switch (modrm & 0x3f) + else { - default: - fatalerror("I386: FPU Op DD %02X at %08X", modrm, cpustate->pc-2); + switch (modrm) + { + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: ptr = x87_ffree; break; + case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: ptr = x87_fst_sti; break; + case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: ptr = x87_fstp_sti; break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: ptr = x87_fucom_sti; break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: ptr = x87_fucomp_sti; break; + } } + + cpustate->opcode_table_x87_dd[modrm] = ptr; } } -static void I386OP(fpu_group_de)(i386_state *cpustate) // Opcode 0xde + +void build_x87_opcode_table_de(i386_state *cpustate) { - UINT8 modrm = FETCH(cpustate); + int modrm = 0; - if (modrm < 0xc0) + for (modrm = 0; modrm < 0x100; ++modrm) { - // UINT32 ea = GetEA(cpustate,modrm); + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - switch ((modrm >> 3) & 0x7) - { - default: - fatalerror("I386: FPU Op DE %02X at %08X", modrm, cpustate->pc-2); - } - } - else - { - switch (modrm & 0x3f) + if (modrm < 0xc0) { - case 0x19: // FCOMPP + switch ((modrm >> 3) & 0x7) { - cpustate->fpu_status_word &= ~(FPU_C3 | FPU_C2 | FPU_C0); - if (ST(0).f > ST(1).f) - { - // C3 = 0, C2 = 0, C0 = 0 - } - else if (ST(0).f < ST(1).f) - { - cpustate->fpu_status_word |= FPU_C0; - } - else if (ST(0).f == ST(1).f) - { - cpustate->fpu_status_word |= FPU_C3; - } - else - { - // unordered - cpustate->fpu_status_word |= (FPU_C3 | FPU_C2 | FPU_C0); - } - FPU_POP(cpustate); - FPU_POP(cpustate); - CYCLES(cpustate,1); // TODO - break; + case 0x00: ptr = x87_fiadd_m16int; break; + case 0x01: ptr = x87_fimul_m16int; break; + case 0x02: ptr = x87_ficom_m16int; break; + case 0x03: ptr = x87_ficomp_m16int; break; + case 0x04: ptr = x87_fisub_m16int; break; + case 0x05: ptr = x87_fisubr_m16int; break; + case 0x06: ptr = x87_fidiv_m16int; break; + case 0x07: ptr = x87_fidivr_m16int; break; } - - // FDIVP - case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: + } + else + { + switch (modrm) { - if ((ST(0).i & U64(0x7fffffffffffffff)) == 0) - { - // set result as infinity if zero divide is masked - if (cpustate->fpu_control_word & FPU_MASK_ZERO_DIVIDE) - { - ST(modrm & 7).i |= FPU_INFINITY_DOUBLE; - } - } - else - { - ST(modrm & 7).f = ST(modrm & 7).f / ST(0).f; - } - FPU_POP(cpustate); - CYCLES(cpustate,1); // TODO - break; + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: ptr = x87_faddp; break; + case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: ptr = x87_fmulp; break; + case 0xd9: ptr = x87_fcompp; break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: ptr = x87_fsubrp; break; + case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: ptr = x87_fsubp; break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: ptr = x87_fdivrp; break; + case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: ptr = x87_fdivp; break; } - - default: - fatalerror("I386: FPU Op DE %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_de[modrm] = ptr; } } -static void I386OP(fpu_group_df)(i386_state *cpustate) // Opcode 0xdf + +void build_x87_opcode_table_df(i386_state *cpustate) { - UINT8 modrm = FETCH(cpustate); + int modrm = 0; - if (modrm < 0xc0) + for (modrm = 0; modrm < 0x100; ++modrm) { - // UINT32 ea = GetEA(cpustate,modrm); + void (*ptr)(i386_state *cpustate, UINT8 modrm) = x87_invalid; - switch ((modrm >> 3) & 0x7) + if (modrm < 0xc0) { - default: - fatalerror("I386: FPU Op DF %02X at %08X", modrm, cpustate->pc-2); + switch ((modrm >> 3) & 0x7) + { + case 0x00: ptr = x87_fild_m16int; break; + case 0x02: ptr = x87_fist_m16int; break; + case 0x03: ptr = x87_fistp_m16int; break; + case 0x04: ptr = x87_fbld; break; + case 0x05: ptr = x87_fild_m64int; break; + case 0x06: ptr = x87_fbstp; break; + case 0x07: ptr = x87_fistp_m64int; break; + } } - } - else - { - switch (modrm & 0x3f) + else { - case 0x20: // FSTSW AX + switch (modrm) { - REG16(AX) = (cpustate->fpu_status_word & ~FPU_STACK_TOP_MASK) | (cpustate->fpu_top << 10); - CYCLES(cpustate,1); // TODO - break; + case 0xe0: ptr = x87_fstsw_ax; break; } - - default: - fatalerror("I386: FPU Op DF %02X at %08X", modrm, cpustate->pc-2); } + + cpustate->opcode_table_x87_df[modrm] = ptr; } } + +void build_x87_opcode_table(i386_state *cpustate) +{ + build_x87_opcode_table_d8(cpustate); + build_x87_opcode_table_d9(cpustate); + build_x87_opcode_table_da(cpustate); + build_x87_opcode_table_db(cpustate); + build_x87_opcode_table_dc(cpustate); + build_x87_opcode_table_dd(cpustate); + build_x87_opcode_table_de(cpustate); + build_x87_opcode_table_df(cpustate); +} + diff -Nru mame-0.144/src/emu/cpu/m6502/m4510.c mame-0.145/src/emu/cpu/m6502/m4510.c --- mame-0.144/src/emu/cpu/m6502/m4510.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/m6502/m4510.c 2012-02-06 21:30:23.000000000 +0000 @@ -221,8 +221,10 @@ } else { - devcb_write8 nullcb = DEVCB_NULL; - cpustate->out_port_func.resolve(nullcb, *device); + devcb_read8 nullrcb = DEVCB_NULL; + devcb_write8 nullwcb = DEVCB_NULL; + cpustate->in_port_func.resolve(nullrcb, *device); + cpustate->out_port_func.resolve(nullwcb, *device); } } diff -Nru mame-0.144/src/emu/cpu/m68000/m68000.h mame-0.145/src/emu/cpu/m68000/m68000.h --- mame-0.144/src/emu/cpu/m68000/m68000.h 2012-01-13 15:34:19.000000000 +0000 +++ mame-0.145/src/emu/cpu/m68000/m68000.h 2012-02-06 21:30:25.000000000 +0000 @@ -94,6 +94,7 @@ DECLARE_LEGACY_CPU_DEVICE(M68000, m68000); DECLARE_LEGACY_CPU_DEVICE(M68008, m68008); +DECLARE_LEGACY_CPU_DEVICE(M68008PLCC, m68008plcc); DECLARE_LEGACY_CPU_DEVICE(M68010, m68010); DECLARE_LEGACY_CPU_DEVICE(M68EC020, m68ec020); DECLARE_LEGACY_CPU_DEVICE(M68020, m68020); diff -Nru mame-0.144/src/emu/cpu/m68000/m68kcpu.c mame-0.145/src/emu/cpu/m68000/m68kcpu.c --- mame-0.144/src/emu/cpu/m68000/m68kcpu.c 2012-01-13 15:34:19.000000000 +0000 +++ mame-0.145/src/emu/cpu/m68000/m68kcpu.c 2012-02-06 21:30:25.000000000 +0000 @@ -644,6 +644,7 @@ assert(device != NULL); assert(device->type() == M68000 || device->type() == M68008 || + device->type() == M68008PLCC || device->type() == M68010 || device->type() == M68EC020 || device->type() == M68020 || @@ -1857,8 +1858,26 @@ switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break; - case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 22; break; + case DEVINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break; + case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 20; break; + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(m68008); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "68008"); break; + + default: CPU_GET_INFO_CALL(m68k); break; + } +} + +CPU_GET_INFO( m68008plcc ) +{ + switch (state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break; + case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 22; break; /* --- the following bits of info are returned as pointers to data or functions --- */ case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(m68008); break; @@ -2506,6 +2525,7 @@ DEFINE_LEGACY_CPU_DEVICE(M68000, m68000); DEFINE_LEGACY_CPU_DEVICE(M68008, m68008); +DEFINE_LEGACY_CPU_DEVICE(M68008PLCC, m68008plcc); DEFINE_LEGACY_CPU_DEVICE(M68010, m68010); DEFINE_LEGACY_CPU_DEVICE(M68EC020, m68ec020); DEFINE_LEGACY_CPU_DEVICE(M68020, m68020); @@ -2519,4 +2539,3 @@ DEFINE_LEGACY_CPU_DEVICE(SCC68070, scc68070); DEFINE_LEGACY_CPU_DEVICE(M68340, m68340); DEFINE_LEGACY_CPU_DEVICE(MCF5206E, mcf5206e); - diff -Nru mame-0.144/src/emu/cpu/m68000/m68kfpu.c mame-0.145/src/emu/cpu/m68000/m68kfpu.c --- mame-0.144/src/emu/cpu/m68000/m68kfpu.c 2012-01-13 15:34:19.000000000 +0000 +++ mame-0.145/src/emu/cpu/m68000/m68kfpu.c 2012-02-06 21:30:25.000000000 +0000 @@ -1823,12 +1823,60 @@ m68k->fpu_just_reset = 1; } +static void m68040_do_fsave(m68ki_cpu_core *m68k, UINT32 addr, int reg, int inc) +{ + if (m68k->fpu_just_reset) + { + m68ki_write_32(m68k, addr, 0); + } + else + { + // we normally generate an IDLE frame + if(reg != -1) + REG_A(m68k)[reg] += inc ? 6*4 : -6*4; + perform_fsave(m68k, addr, inc); + } +} + +static void m68040_do_frestore(m68ki_cpu_core *m68k, UINT32 addr, int reg) +{ + UINT32 temp = m68ki_read_32(m68k, addr); + + // check for NULL frame + if (temp & 0xff000000) + { + // we don't handle non-NULL frames + m68k->fpu_just_reset = 0; + + if (reg != -1) + { + // how about an IDLE frame? + if ((temp & 0x00ff0000) == 0x00180000) + { + REG_A(m68k)[reg] += 6*4; + } // check UNIMP + else if ((temp & 0x00ff0000) == 0x00380000) + { + REG_A(m68k)[reg] += 14*4; + } // check BUSY + else if ((temp & 0x00ff0000) == 0x00b40000) + { + REG_A(m68k)[reg] += 45*4; + } + } + } + else + { + do_frestore_null(m68k); + } +} + void m68040_fpu_op1(m68ki_cpu_core *m68k) { int ea = m68k->ir & 0x3f; int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); - UINT32 addr, temp; + UINT32 addr; switch ((m68k->ir >> 6) & 0x3) { @@ -1838,50 +1886,47 @@ { case 2: // (An) addr = REG_A(m68k)[reg]; - - if (m68k->fpu_just_reset) - { - m68ki_write_32(m68k, addr, 0); - } - else - { - // we normally generate an IDLE frame - perform_fsave(m68k, addr, 1); - } + m68040_do_fsave(m68k, addr, -1, 1); break; case 3: // (An)+ - addr = EA_AY_PI_32(m68k); + addr = EA_AY_PI_32(m68k); + m68040_do_fsave(m68k, addr, reg, 1); + break; - if (m68k->fpu_just_reset) - { - m68ki_write_32(m68k, addr, 0); - } - else - { - // we normally generate an IDLE frame - REG_A(m68k)[reg] += 6*4; - perform_fsave(m68k, addr, 1); - } - break; + case 4: // -(An) + addr = EA_AY_PD_32(m68k); + m68040_do_fsave(m68k, addr, reg, 0); + break; - case 4: // -(An) - addr = EA_AY_PD_32(m68k); + case 5: // (D16, An) + addr = EA_AY_DI_16(m68k); + m68040_do_fsave(m68k, addr, -1, 0); + break; - if (m68k->fpu_just_reset) + case 7: // + switch (reg) + { + case 1: // (abs32) { - m68ki_write_32(m68k, addr, 0); + addr = EA_AL_32(m68k); + m68040_do_fsave(m68k, addr, -1, 1); + break; } - else + case 2: // (d16, PC) { - // we normally generate an IDLE frame - REG_A(m68k)[reg] -= 6*4; - perform_fsave(m68k, addr, 0); + addr = EA_PCDI_16(m68k); + m68040_do_fsave(m68k, addr, -1, 1); + break; } - break; + default: + fatalerror("M68kFPU: FSAVE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); + } + + break; - default: - fatalerror("M68kFPU: FSAVE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); + default: + fatalerror("M68kFPU: FSAVE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); } break; } @@ -1891,95 +1936,44 @@ { switch (mode) { - case 2: // (An) - addr = REG_A(m68k)[reg]; - temp = m68ki_read_32(m68k, addr); - - // check for NULL frame - if (temp & 0xff000000) - { - // we don't handle non-NULL frames and there's no pre/post inc/dec to do here - m68k->fpu_just_reset = 0; - } - else - { - do_frestore_null(m68k); - } - break; - - case 3: // (An)+ - addr = EA_AY_PI_32(m68k); - temp = m68ki_read_32(m68k, addr); - - // check for NULL frame - if (temp & 0xff000000) - { - m68k->fpu_just_reset = 0; + case 2: // (An) + addr = REG_A(m68k)[reg]; + m68040_do_frestore(m68k, addr, -1); + break; - // how about an IDLE frame? - if ((temp & 0x00ff0000) == 0x00180000) - { - REG_A(m68k)[reg] += 6*4; - } // check UNIMP - else if ((temp & 0x00ff0000) == 0x00380000) - { - REG_A(m68k)[reg] += 14*4; - } // check BUSY - else if ((temp & 0x00ff0000) == 0x00b40000) - { - REG_A(m68k)[reg] += 45*4; - } - } - else - { - do_frestore_null(m68k); - } - break; + case 3: // (An)+ + addr = EA_AY_PI_32(m68k); + m68040_do_frestore(m68k, addr, reg); + break; - case 5: // (D16, An) - addr = EA_AY_DI_16(m68k); - temp = m68ki_read_32(m68k, addr); + case 5: // (D16, An) + addr = EA_AY_DI_16(m68k); + m68040_do_frestore(m68k, addr, -1); + break; - // check for NULL frame - if (temp & 0xff000000) + case 7: // + switch (reg) + { + case 1: // (abs32) { - // we don't handle non-NULL frames and there's no pre/post inc/dec to do here - m68k->fpu_just_reset = 0; + addr = EA_AL_32(m68k); + m68040_do_frestore(m68k, addr, -1); + break; } - else + case 2: // (d16, PC) { - do_frestore_null(m68k); - } - break; - - case 7: // - switch (reg) - { - case 2: // (d16, PC) - { - addr = EA_PCDI_16(m68k);; - temp = m68ki_read_32(m68k, addr); - - // check for NULL frame - if (temp & 0xff000000) - { - // we don't handle non-NULL frames and there's no pre/post inc/dec to do here - m68k->fpu_just_reset = 0; - } - else - { - do_frestore_null(m68k); - } - break; - } - default: - fatalerror("M68kFPU: FRESTORE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); + addr = EA_PCDI_16(m68k); + m68040_do_frestore(m68k, addr, -1); + break; } + default: + fatalerror("M68kFPU: FRESTORE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); + } - break; + break; - default: - fatalerror("M68kFPU: FRESTORE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); + default: + fatalerror("M68kFPU: FRESTORE unhandled mode %d reg %d at %x\n", mode, reg, REG_PC(m68k)); } break; } diff -Nru mame-0.144/src/emu/cpu/m68000/m68kmmu.h mame-0.145/src/emu/cpu/m68000/m68kmmu.h --- mame-0.144/src/emu/cpu/m68000/m68kmmu.h 2012-01-13 15:34:19.000000000 +0000 +++ mame-0.145/src/emu/cpu/m68000/m68kmmu.h 2012-02-06 21:30:25.000000000 +0000 @@ -208,7 +208,7 @@ m68k->mmu_tmp_sr |= ((tbl_entry2 & 0x0100) && !(fc & 4)) ? M68K_MMU_SR_SUPERVISOR_ONLY : 0; m68k->mmu_tmp_sr |= tbl_entry2 & 0x0004 ? M68K_MMU_SR_WRITE_PROTECT : 0; - if (!ptest) + if (!ptest && dt != M68K_MMU_DF_DT0) { if (dt == M68K_MMU_DF_DT1 && !m68k->mmu_tmp_rw && !(m68k->mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT)) { @@ -794,7 +794,7 @@ } } - printf("680x0: PLOADing ATC with logical %08x => phys %08x\n", ltmp, ptmp); +// printf("680x0: PLOADing ATC with logical %08x => phys %08x\n", ltmp, ptmp); // FIXME: rw bit? pmmu_atc_add(m68k, ltmp, ptmp, modes & 0x07); return; diff -Nru mame-0.144/src/emu/cpu/m6805/6805ops.c mame-0.145/src/emu/cpu/m6805/6805ops.c --- mame-0.144/src/emu/cpu/m6805/6805ops.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/m6805/6805ops.c 2012-02-06 21:30:24.000000000 +0000 @@ -307,7 +307,7 @@ OP_HANDLER( clr_di ) { DIRECT; - CLR_NZC; SEZ; + CLR_NZ; SEZ; WM(EAD,0); } diff -Nru mame-0.144/src/emu/cpu/mb88xx/mb88xx.c mame-0.145/src/emu/cpu/mb88xx/mb88xx.c --- mame-0.144/src/emu/cpu/mb88xx/mb88xx.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/mb88xx/mb88xx.c 2012-02-06 21:30:25.000000000 +0000 @@ -247,7 +247,7 @@ static void set_irq_line(mb88_state *cpustate, int state) { /* on falling edge trigger interrupt */ - if ( (cpustate->pio & 0x04) && cpustate->nf == 0 && state != CLEAR_LINE ) + if ( (cpustate->pio & 0x04) && cpustate->nf && state == CLEAR_LINE ) { cpustate->pending_interrupt |= INT_CAUSE_EXTERNAL; } diff -Nru mame-0.144/src/emu/cpu/mcs48/mcs48.c mame-0.145/src/emu/cpu/mcs48/mcs48.c --- mame-0.144/src/emu/cpu/mcs48/mcs48.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/mcs48/mcs48.c 2012-02-06 21:30:24.000000000 +0000 @@ -1369,7 +1369,6 @@ case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = MCS48_INPUT_IRQ; break; case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break; case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break; - case CPUINFO_INT_CLOCK_DIVIDER: info->i = 3*5; break; case CPUINFO_INT_MIN_INSTRUCTION_BYTES: info->i = 1; break; case CPUINFO_INT_MAX_INSTRUCTION_BYTES: info->i = 2; break; case CPUINFO_INT_MIN_CYCLES: info->i = 1; break; @@ -1418,11 +1417,15 @@ CPU-SPECIFIC CONTEXT ACCESS ***************************************************************************/ -static void mcs48_generic_get_info(legacy_cpu_device *device, UINT32 state, cpuinfo *info, UINT8 features, int romsize, int ramsize, const char *name) +static void mcs48_generic_get_info(legacy_cpu_device *device, UINT32 state, cpuinfo *info, UINT8 features, int romsize, int ramsize, int cycle_states, const char *name) { switch (state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ + case CPUINFO_INT_CLOCK_DIVIDER: + info->i = 3 * cycle_states; + break; + case DEVINFO_INT_ADDRBUS_WIDTH + AS_DATA: if (ramsize == 64) info->i = 6; @@ -1494,31 +1497,31 @@ /* Official Intel MCS-48 parts */ -CPU_GET_INFO( i8021 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, "I8021"); } -CPU_GET_INFO( i8022 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, "I8022"); } -CPU_GET_INFO( i8035 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 64, "I8035"); } -CPU_GET_INFO( i8048 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, "I8048"); } -CPU_GET_INFO( i8648 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, "I8648"); } -CPU_GET_INFO( i8748 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, "I8748"); } -CPU_GET_INFO( i8039 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 128, "I8039"); } -CPU_GET_INFO( i8049 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, "I8049"); } -CPU_GET_INFO( i8749 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, "I8749"); } -CPU_GET_INFO( i8040 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 256, "I8040"); } -CPU_GET_INFO( i8050 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 4096, 256, "I8050"); } +CPU_GET_INFO( i8021 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, 10, "I8021"); } +CPU_GET_INFO( i8022 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, 10, "I8022"); } +CPU_GET_INFO( i8035 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 64, 5, "I8035"); } +CPU_GET_INFO( i8048 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, 5, "I8048"); } +CPU_GET_INFO( i8648 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, 5, "I8648"); } +CPU_GET_INFO( i8748 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, 5, "I8748"); } +CPU_GET_INFO( i8039 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 128, 5, "I8039"); } +CPU_GET_INFO( i8049 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, 5, "I8049"); } +CPU_GET_INFO( i8749 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, 5, "I8749"); } +CPU_GET_INFO( i8040 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 256, 5, "I8040"); } +CPU_GET_INFO( i8050 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 4096, 256, 5, "I8050"); } /* Official Intel UPI-41 parts */ -CPU_GET_INFO( i8041 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 1024, 128, "I8041"); } -CPU_GET_INFO( i8741 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 1024, 128, "I8741"); } -CPU_GET_INFO( i8042 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, "I8042"); } -CPU_GET_INFO( i8242 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, "I8242"); } -CPU_GET_INFO( i8742 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, "I8742"); } +CPU_GET_INFO( i8041 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 1024, 128, 5, "I8041"); } +CPU_GET_INFO( i8741 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 1024, 128, 5, "I8741"); } +CPU_GET_INFO( i8042 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, 5, "I8042"); } +CPU_GET_INFO( i8242 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, 5, "I8242"); } +CPU_GET_INFO( i8742 ) { mcs48_generic_get_info(device, state, info, UPI41_FEATURE, 2048, 256, 5, "I8742"); } /* Clones */ -CPU_GET_INFO( mb8884 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 64, "MB8884"); } -CPU_GET_INFO( n7751 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, "N7751"); } -CPU_GET_INFO( m58715 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, "M58715"); } +CPU_GET_INFO( mb8884 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 0, 64, 5, "MB8884"); } +CPU_GET_INFO( n7751 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 1024, 64, 5, "N7751"); } +CPU_GET_INFO( m58715 ) { mcs48_generic_get_info(device, state, info, MCS48_FEATURE, 2048, 128, 5, "M58715"); } /* Official Intel MCS-48 parts */ DEFINE_LEGACY_CPU_DEVICE(I8021, i8021); /* 1k internal ROM, 64 bytes internal RAM */ diff -Nru mame-0.144/src/emu/cpu/psx/psx.c mame-0.145/src/emu/cpu/psx/psx.c --- mame-0.144/src/emu/cpu/psx/psx.c 2012-01-13 15:34:20.000000000 +0000 +++ mame-0.145/src/emu/cpu/psx/psx.c 2012-02-06 21:30:23.000000000 +0000 @@ -3158,29 +3158,24 @@ psxcpu_device *psxcpu_device::getcpu( device_t &device, const char *cputag ) { - if( strcmp( cputag, DEVICE_SELF ) == 0 ) - { - return downcast( &device ); - } - - return downcast( device.siblingdevice( cputag ) ); + return downcast( device.subdevice( cputag ) ); } void psxcpu_device::irq_set( device_t &device, const char *cputag, UINT32 bitmask ) { - psxirq_device *irq = downcast( getcpu( device, cputag )->subdevice("irq") ); + psxirq_device *irq = getcpu( device, cputag )->subdevice("irq"); irq->set( bitmask ); } void psxcpu_device::install_sio_handler( device_t &device, const char *cputag, int n_port, psx_sio_handler p_f_sio_handler ) { - psxsio_device *sio = downcast( getcpu( device, cputag )->subdevice("sio") ); + psxsio_device *sio = getcpu( device, cputag )->subdevice("sio"); sio->install_handler( n_port, p_f_sio_handler ); } void psxcpu_device::sio_input( device_t &device, const char *cputag, int n_port, int n_mask, int n_data ) { - psxsio_device *sio = downcast( getcpu( device, cputag )->subdevice("sio") ); + psxsio_device *sio = getcpu( device, cputag )->subdevice("sio"); sio->input( n_port, n_mask, n_data ); } diff -Nru mame-0.144/src/emu/cpu/psx/psx.h mame-0.145/src/emu/cpu/psx/psx.h --- mame-0.144/src/emu/cpu/psx/psx.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/psx/psx.h 2012-02-06 21:30:23.000000000 +0000 @@ -105,10 +105,10 @@ //************************************************************************** #define MCFG_PSX_DMA_CHANNEL_READ( cputag, channel, handler ) \ - downcast( psxcpu_device::getcpu( *owner, cputag )->subdevice("dma") )->install_read_handler( channel, handler ); + psxcpu_device::getcpu( *owner, cputag )->subdevice("dma")->install_read_handler( channel, handler ); #define MCFG_PSX_DMA_CHANNEL_WRITE( cputag, channel, handler ) \ - downcast( psxcpu_device::getcpu( *owner, cputag )->subdevice("dma") )->install_write_handler( channel, handler ); + psxcpu_device::getcpu( *owner, cputag )->subdevice("dma")->install_write_handler( channel, handler ); diff -Nru mame-0.144/src/emu/cpu/rsp/rsp.c mame-0.145/src/emu/cpu/rsp/rsp.c --- mame-0.144/src/emu/cpu/rsp/rsp.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/rsp/rsp.c 2012-02-06 21:30:23.000000000 +0000 @@ -3123,19 +3123,19 @@ } } -void rspdrc_set_options(device_t *device, UINT32 options) +void rspdrc_flush_drc_cache(device_t *device) { } -void rspdrc_add_imem(device_t *device, void *base) +void rspdrc_set_options(device_t *device, UINT32 options) { } -void rspdrc_add_dmem(device_t *device, void *base) +void rspdrc_add_imem(device_t *device, UINT32 *base) { } -void rspdrc_flush_drc_cache(device_t *device) +void rspdrc_add_dmem(device_t *device, UINT32 *base) { } diff -Nru mame-0.144/src/emu/cpu/rsp/rspdrc.c mame-0.145/src/emu/cpu/rsp/rspdrc.c --- mame-0.144/src/emu/cpu/rsp/rspdrc.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/rsp/rspdrc.c 2012-02-06 21:30:23.000000000 +0000 @@ -303,13 +303,25 @@ CORE CALLBACKS ***************************************************************************/ +void rspdrc_add_imem(device_t *device, UINT32 *base) +{ + rsp_state *rsp = get_safe_token(device); + rsp->imem32 = base; + rsp->imem16 = (UINT16*)base; + rsp->imem8 = (UINT8*)base; +} + +void rspdrc_add_dmem(device_t *device, UINT32 *base) +{ + rsp_state *rsp = get_safe_token(device); + rsp->dmem32 = base; + rsp->dmem16 = (UINT16*)base; + rsp->dmem8 = (UINT8*)base; +} + INLINE UINT8 READ8(rsp_state *rsp, UINT32 address) { - UINT8 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address); - //printf("%04xr%02x\n",address & 0x1fff, ret); - return ret; + return rsp->dmem8[BYTE4_XOR_BE(address & 0xfff)]; } static void cfunc_read8(void *param) @@ -321,10 +333,10 @@ INLINE UINT16 READ16(rsp_state *rsp, UINT32 address) { UINT16 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address+0) << 8; - ret |= rsp->program->read_byte(address+1) << 0; - //printf("%04xr%04x\n",address & 0x1fff, ret); + address &= 0xfff; + ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 8; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)]; + //printf("%04xr%04x\n",address, ret); return ret; } @@ -337,12 +349,12 @@ INLINE UINT32 READ32(rsp_state *rsp, UINT32 address) { UINT32 ret; - address = 0x04000000 | (address & 0xfff); - ret = rsp->program->read_byte(address+0) << 24; - ret |= rsp->program->read_byte(address+1) << 16; - ret |= rsp->program->read_byte(address+2) << 8; - ret |= rsp->program->read_byte(address+3) << 0; - //printf("%04xr%08x\n",address & 0x1fff, ret); + address &= 0xfff; + ret = rsp->dmem8[BYTE4_XOR_BE(address)] << 24; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 1)] << 16; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 2)] << 8; + ret |= rsp->dmem8[BYTE4_XOR_BE(address + 3)]; + //printf("%04xr%08x\n",address, ret); return ret; } @@ -354,9 +366,9 @@ INLINE void WRITE8(rsp_state *rsp, UINT32 address, UINT8 data) { - address = 0x04000000 | (address & 0xfff); - //printf("%04x:%02x\n",address & 0x1fff, data); - rsp->program->write_byte(address, data); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data; + //printf("%04xw%02x\n",address, data); } static void cfunc_write8(void *param) @@ -367,11 +379,10 @@ INLINE void WRITE16(rsp_state *rsp, UINT32 address, UINT16 data) { - address = 0x04000000 | (address & 0xfff); - - //printf("%04x:%04x\n",address & 0x1fff, data); - rsp->program->write_byte(address + 0, (data >> 8) & 0xff); - rsp->program->write_byte(address + 1, (data >> 0) & 0xff); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 8; + rsp->dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff; + //printf("%04xw%04x\n",address, data); } static void cfunc_write16(void *param) @@ -382,13 +393,12 @@ INLINE void WRITE32(rsp_state *rsp, UINT32 address, UINT32 data) { - address = 0x04000000 | (address & 0xfff); - - //printf("%04x:%08x\n",address & 0x1fff, data); - rsp->program->write_byte(address + 0, (data >> 24) & 0xff); - rsp->program->write_byte(address + 1, (data >> 16) & 0xff); - rsp->program->write_byte(address + 2, (data >> 8) & 0xff); - rsp->program->write_byte(address + 3, (data >> 0) & 0xff); + address &= 0xfff; + rsp->dmem8[BYTE4_XOR_BE(address)] = data >> 24; + rsp->dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff; + rsp->dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff; + rsp->dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff; + //printf("%04xw%08x\n",address, data); } static void cfunc_write32(void *param) diff -Nru mame-0.144/src/emu/cpu/rsp/rsp.h mame-0.145/src/emu/cpu/rsp/rsp.h --- mame-0.144/src/emu/cpu/rsp/rsp.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/rsp/rsp.h 2012-02-06 21:30:23.000000000 +0000 @@ -88,8 +88,8 @@ void rspdrc_flush_drc_cache(device_t *device); void rspdrc_set_options(device_t *device, UINT32 options); -void rspdrc_add_imem(device_t *device, void *base); -void rspdrc_add_dmem(device_t *device, void *base); +void rspdrc_add_dmem(device_t *device, UINT32 *base); +void rspdrc_add_imem(device_t *device, UINT32 *base); /*************************************************************************** HELPER MACROS @@ -184,6 +184,14 @@ direct_read_data *direct; int icount; + UINT32 *dmem32; + UINT16 *dmem16; + UINT8 *dmem8; + + UINT32 *imem32; + UINT16 *imem16; + UINT8 *imem8; + rspimp_state* impstate; }; diff -Nru mame-0.144/src/emu/cpu/spc700/spc700ds.c mame-0.145/src/emu/cpu/spc700/spc700ds.c --- mame-0.144/src/emu/cpu/spc700/spc700ds.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/spc700/spc700ds.c 2012-02-06 21:30:26.000000000 +0000 @@ -123,7 +123,7 @@ /* 37 */ {AND , {A , DIY }}, /* 38 */ {AND , {DP , IMM }}, /* 39 */ {AND , {XI , YI }}, -/* 3A */ {INCW , {DI , IMP }}, +/* 3A */ {INCW , {DP , IMP }}, /* 3B */ {ROL , {DPX , IMP }}, /* 3C */ {ROL , {A , IMP }}, /* 3D */ {INC , {X , IMP }}, @@ -185,9 +185,9 @@ /* 75 */ {CMP , {A , ABX }}, /* 76 */ {CMP , {A , ABY }}, /* 77 */ {CMP , {A , DIY }}, -/* 78 */ {CMP , {IMM , DP }}, +/* 78 */ {CMP , {DP , IMM }}, /* 79 */ {CMP , {XI , YI }}, -/* 7A */ {ADDW , {DI , IMP }}, +/* 7A */ {ADDW , {DP , IMP }}, /* 7B */ {ROR , {DPX , IMP }}, /* 7C */ {ROR , {A , IMP }}, /* 7D */ {MOV , {A , X }}, @@ -208,7 +208,7 @@ /* 8C */ {DEC , {ABS , IMP }}, /* 8D */ {MOV , {Y , IMM }}, /* 8E */ {POP , {PSW , IMP }}, -/* 8F */ {MOV , {IMM , DP }}, +/* 8F */ {MOV , {DP , IMM }}, /* 90 */ {BCC , {REL , IMP }}, /* 91 */ {TCALL , {N9 , IMP }}, /* 92 */ {CLR1 , {DP4 , IMP }}, diff -Nru mame-0.144/src/emu/cpu/tms34010/tms34010.c mame-0.145/src/emu/cpu/tms34010/tms34010.c --- mame-0.144/src/emu/cpu/tms34010/tms34010.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/tms34010/tms34010.c 2012-02-06 21:30:24.000000000 +0000 @@ -959,7 +959,7 @@ { /* only do this if we have an incoming pixel clock */ /* also, only do it if the HEBLNK/HSBLNK values are stable */ - if (master && tms->config->scanline_callback != NULL) + if (master && (tms->config->scanline_callback_ind16 != NULL || tms->config->scanline_callback_rgb32 != NULL)) { int htotal = SMART_IOREG(tms, HTOTAL); if (htotal > 0 && vtotal > 0) @@ -1003,7 +1003,7 @@ } /* force a partial update within the visible area */ - if (vcount >= current_visarea.min_y && vcount <= current_visarea.max_y && tms->config->scanline_callback != NULL) + if (vcount >= current_visarea.min_y && vcount <= current_visarea.max_y && (tms->config->scanline_callback_ind16 != NULL || tms->config->scanline_callback_rgb32 != NULL)) tms->screen->update_partial(vcount); /* if we are in the visible area, increment DPYADR by DUDATE */ @@ -1078,28 +1078,29 @@ } -SCREEN_UPDATE( tms340x0 ) +SCREEN_UPDATE_IND16( tms340x0_ind16 ) { - pen_t blackpen = get_black_pen(screen->machine()); + pen_t blackpen = get_black_pen(screen.machine()); tms34010_display_params params; tms34010_state *tms = NULL; device_t *cpu; int x; /* find the owning CPU */ - for (cpu = screen->machine().devicelist().first(); cpu != NULL; cpu = cpu->next()) + device_iterator iter(screen.machine().root_device()); + for (cpu = iter.first(); cpu != NULL; cpu = iter.next()) { device_type type = cpu->type(); if (type == TMS34010 || type == TMS34020) { tms = get_safe_token(cpu); - if (tms->config != NULL && tms->config->scanline_callback != NULL && tms->screen == screen) + if (tms->config != NULL && tms->config->scanline_callback_ind16 != NULL && tms->screen == &screen) break; tms = NULL; } } if (tms == NULL) - fatalerror("Unable to locate matching CPU for screen '%s'\n", screen->tag()); + fatalerror("Unable to locate matching CPU for screen '%s'\n", screen.tag()); /* get the display parameters for the screen */ tms34010_get_display_params(tms->device, ¶ms); @@ -1108,31 +1109,69 @@ if (params.enabled) { /* call through to the callback */ - LOG((" Update: scan=%3d ROW=%04X COL=%04X\n", cliprect->min_y, params.rowaddr, params.coladdr)); - (*tms->config->scanline_callback)(*screen, bitmap, cliprect->min_y, ¶ms); + LOG((" Update: scan=%3d ROW=%04X COL=%04X\n", cliprect.min_y, params.rowaddr, params.coladdr)); + (*tms->config->scanline_callback_ind16)(screen, bitmap, cliprect.min_y, ¶ms); } /* otherwise, just blank the current scanline */ else - params.heblnk = params.hsblnk = cliprect->max_x + 1; + params.heblnk = params.hsblnk = cliprect.max_x + 1; /* blank out the blank regions */ - if (bitmap->bpp == 16) + UINT16 *dest = &bitmap.pix16(cliprect.min_y); + for (x = cliprect.min_x; x < params.heblnk; x++) + dest[x] = blackpen; + for (x = params.hsblnk; x <= cliprect.max_x; x++) + dest[x] = blackpen; + return 0; + +} + +SCREEN_UPDATE_RGB32( tms340x0_rgb32 ) +{ + pen_t blackpen = get_black_pen(screen.machine()); + tms34010_display_params params; + tms34010_state *tms = NULL; + device_t *cpu; + int x; + + /* find the owning CPU */ + device_iterator iter(screen.machine().root_device()); + for (cpu = iter.first(); cpu != NULL; cpu = iter.next()) { - UINT16 *dest = BITMAP_ADDR16(bitmap, cliprect->min_y, 0); - for (x = cliprect->min_x; x < params.heblnk; x++) - dest[x] = blackpen; - for (x = params.hsblnk; x <= cliprect->max_y; x++) - dest[x] = blackpen; - } - else if (bitmap->bpp == 32) - { - UINT32 *dest = BITMAP_ADDR32(bitmap, cliprect->min_y, 0); - for (x = cliprect->min_x; x < params.heblnk; x++) - dest[x] = blackpen; - for (x = params.hsblnk; x <= cliprect->max_y; x++) - dest[x] = blackpen; + device_type type = cpu->type(); + if (type == TMS34010 || type == TMS34020) + { + tms = get_safe_token(cpu); + if (tms->config != NULL && tms->config->scanline_callback_rgb32 != NULL && tms->screen == &screen) + break; + tms = NULL; + } + } + if (tms == NULL) + fatalerror("Unable to locate matching CPU for screen '%s'\n", screen.tag()); + + /* get the display parameters for the screen */ + tms34010_get_display_params(tms->device, ¶ms); + + /* if the display is enabled, call the scanline callback */ + if (params.enabled) + { + /* call through to the callback */ + LOG((" Update: scan=%3d ROW=%04X COL=%04X\n", cliprect.min_y, params.rowaddr, params.coladdr)); + (*tms->config->scanline_callback_rgb32)(screen, bitmap, cliprect.min_y, ¶ms); } + + /* otherwise, just blank the current scanline */ + else + params.heblnk = params.hsblnk = cliprect.max_x + 1; + + /* blank out the blank regions */ + UINT32 *dest = &bitmap.pix32(cliprect.min_y); + for (x = cliprect.min_x; x < params.heblnk; x++) + dest[x] = blackpen; + for (x = params.hsblnk; x <= cliprect.max_x; x++) + dest[x] = blackpen; return 0; } @@ -1270,7 +1309,7 @@ } // if (LOG_CONTROL_REGS) -// logerror("%s: %s = %04X (%d)\n", tms->device->machine().describe_context(), ioreg_name[offset], IOREG(tms, offset), tms->screen->vpos()); +// logerror("%s: %s = %04X (%d)\n", tms->device->machine().describe_context(), ioreg_name[offset], IOREG(tms, offset), tms->screen.vpos()); } @@ -1307,7 +1346,7 @@ IOREG(tms, offset) = data; // if (LOG_CONTROL_REGS) -// logerror("%s: %s = %04X (%d)\n", device->machine().describe_context(), ioreg020_name[offset], IOREG(tms, offset), tms->screen->vpos()); +// logerror("%s: %s = %04X (%d)\n", device->machine().describe_context(), ioreg020_name[offset], IOREG(tms, offset), tms->screen.vpos()); switch (offset) { diff -Nru mame-0.144/src/emu/cpu/tms34010/tms34010.h mame-0.145/src/emu/cpu/tms34010/tms34010.h --- mame-0.144/src/emu/cpu/tms34010/tms34010.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/tms34010/tms34010.h 2012-02-06 21:30:24.000000000 +0000 @@ -196,7 +196,8 @@ const char *screen_tag; /* the screen operated on */ UINT32 pixclock; /* the pixel clock (0 means don't adjust screen size) */ int pixperclock; /* pixels per clock */ - void (*scanline_callback)(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); + void (*scanline_callback_ind16)(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); + void (*scanline_callback_rgb32)(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); void (*output_int)(device_t *device, int state); /* output interrupt callback */ void (*to_shiftreg)(address_space *space, offs_t, UINT16 *); /* shift register write */ void (*from_shiftreg)(address_space *space, offs_t, UINT16 *); /* shift register read */ @@ -204,7 +205,8 @@ /* PUBLIC FUNCTIONS - 34010 */ -SCREEN_UPDATE( tms340x0 ); +SCREEN_UPDATE_IND16( tms340x0_ind16 ); +SCREEN_UPDATE_RGB32( tms340x0_rgb32 ); void tms34010_get_display_params(device_t *cpu, tms34010_display_params *params); DECLARE_LEGACY_CPU_DEVICE(TMS34010, tms34010); diff -Nru mame-0.144/src/emu/cpu/unsp/unspdasm.c mame-0.145/src/emu/cpu/unsp/unspdasm.c --- mame-0.144/src/emu/cpu/unsp/unspdasm.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/unsp/unspdasm.c 2012-02-06 21:30:23.000000000 +0000 @@ -207,7 +207,7 @@ // Far Jump case 0x2f: case 0x3f: case 0x6f: case 0x7f: - if (OPA == 7 && OPA == 2) + if (OPA == 7 && OP1 == 2) { print("goto %06x", ((OPIMM << 16) | imm16) << 1); } diff -Nru mame-0.144/src/emu/cpu/z180/z180.c mame-0.145/src/emu/cpu/z180/z180.c --- mame-0.144/src/emu/cpu/z180/z180.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/cpu/z180/z180.c 2012-02-06 21:30:23.000000000 +0000 @@ -377,7 +377,7 @@ #define Z180_STAT1_TDRE 0x02 #define Z180_STAT1_TIE 0x01 -#define Z180_STAT1_RESET 0x00 +#define Z180_STAT1_RESET 0x02 #define Z180_STAT1_RMASK 0xff #define Z180_STAT1_WMASK 0x0d diff -Nru mame-0.144/src/emu/crsshair.c mame-0.145/src/emu/crsshair.c --- mame-0.144/src/emu/crsshair.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/crsshair.c 2012-02-06 21:30:27.000000000 +0000 @@ -37,7 +37,7 @@ UINT8 used[MAX_PLAYERS]; /* usage per player */ UINT8 mode[MAX_PLAYERS]; /* visibility mode per player */ UINT8 visible[MAX_PLAYERS]; /* visibility per player */ - bitmap_t * bitmap[MAX_PLAYERS]; /* bitmap per player */ + bitmap_argb32 * bitmap[MAX_PLAYERS]; /* bitmap per player */ render_texture * texture[MAX_PLAYERS]; /* texture per player */ device_t *screen[MAX_PLAYERS]; /* the screen on which this player's crosshair is drawn */ float x[MAX_PLAYERS]; /* current X position */ @@ -155,7 +155,8 @@ rgb_t color = crosshair_colors[player]; /* if we have a bitmap and texture for this player, kill it */ - global_free(global.bitmap[player]); + if (global.bitmap[player] == NULL) + global.bitmap[player] = global_alloc(bitmap_argb32); machine.render().texture_free(global.texture[player]); emu_file crossfile(machine.options().crosshair_path(), OPEN_FLAG_READ); @@ -163,32 +164,32 @@ { /* look for user specified file */ sprintf(filename, "%s.png", global.name[player]); - global.bitmap[player] = render_load_png(crossfile, NULL, filename, NULL, NULL); + render_load_png(*global.bitmap[player], crossfile, NULL, filename); } else { /* look for default cross?.png in crsshair\game dir */ sprintf(filename, "cross%d.png", player + 1); - global.bitmap[player] = render_load_png(crossfile, machine.system().name, filename, NULL, NULL); + render_load_png(*global.bitmap[player], crossfile, machine.system().name, filename); /* look for default cross?.png in crsshair dir */ - if (global.bitmap[player] == NULL) - global.bitmap[player] = render_load_png(crossfile, NULL, filename, NULL, NULL); + if (!global.bitmap[player]->valid()) + render_load_png(*global.bitmap[player], crossfile, NULL, filename); } /* if that didn't work, use the built-in one */ - if (global.bitmap[player] == NULL) + if (!global.bitmap[player]->valid()) { /* allocate a blank bitmap to start with */ - global.bitmap[player] = global_alloc(bitmap_t(CROSSHAIR_RAW_SIZE, CROSSHAIR_RAW_SIZE, BITMAP_FORMAT_ARGB32)); - bitmap_fill(global.bitmap[player], NULL, MAKE_ARGB(0x00,0xff,0xff,0xff)); + global.bitmap[player]->allocate(CROSSHAIR_RAW_SIZE, CROSSHAIR_RAW_SIZE); + global.bitmap[player]->fill(MAKE_ARGB(0x00,0xff,0xff,0xff)); /* extract the raw source data to it */ for (y = 0; y < CROSSHAIR_RAW_SIZE / 2; y++) { /* assume it is mirrored vertically */ - UINT32 *dest0 = BITMAP_ADDR32(global.bitmap[player], y, 0); - UINT32 *dest1 = BITMAP_ADDR32(global.bitmap[player], CROSSHAIR_RAW_SIZE - 1 - y, 0); + UINT32 *dest0 = &global.bitmap[player]->pix32(y); + UINT32 *dest1 = &global.bitmap[player]->pix32(CROSSHAIR_RAW_SIZE - 1 - y); /* extract to two rows simultaneously */ for (x = 0; x < CROSSHAIR_RAW_SIZE; x++) @@ -199,7 +200,7 @@ /* create a texture to reference the bitmap */ global.texture[player] = machine.render().texture_alloc(render_texture::hq_scale); - global.texture[player]->set_bitmap(global.bitmap[player], NULL, TEXFORMAT_ARGB32); + global.texture[player]->set_bitmap(*global.bitmap[player], global.bitmap[player]->cliprect(), TEXFORMAT_ARGB32); } diff -Nru mame-0.144/src/emu/debug/debugcmd.c mame-0.145/src/emu/debug/debugcmd.c --- mame-0.144/src/emu/debug/debugcmd.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/debug/debugcmd.c 2012-02-06 21:30:26.000000000 +0000 @@ -390,10 +390,6 @@ static void debug_command_exit(running_machine &machine) { - /* turn off all traces */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) - device->debug()->trace(NULL, 0, NULL); - if (cheat.length) auto_free(machine, cheat.cheatmap); } @@ -545,8 +541,8 @@ } /* if we got a valid one, return */ - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) if (cpunum-- == 0) { *result = &exec->device(); @@ -982,8 +978,8 @@ cpu->debug()->ignore(false); /* then loop over CPUs and set the ignore flags on all other CPUs */ - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) if (&exec->device() != cpu) exec->device().debug()->ignore(true); debug_console_printf(machine, "Now focused on CPU '%s'\n", cpu->tag()); @@ -1002,8 +998,8 @@ astring buffer; /* loop over all executable devices */ - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) /* build up a comma-separated list */ if (!exec->device().debug()->observing()) @@ -1034,11 +1030,14 @@ for (int paramnum = 0; paramnum < params; paramnum++) { /* make sure this isn't the last live CPU */ - device_execute_interface *exec = NULL; - bool gotone; - for (gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + bool gotone = false; + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) if (&exec->device() != devicelist[paramnum] && exec->device().debug()->observing()) + { + gotone = true; break; + } if (!gotone) { debug_console_printf(machine, "Can't ignore all devices!\n"); @@ -1064,8 +1063,8 @@ astring buffer; /* loop over all executable devices */ - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) /* build up a comma-separated list */ if (exec->device().debug()->observing()) @@ -1214,7 +1213,8 @@ /* if 0 parameters, clear all */ if (params == 0) { - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) device->debug()->breakpoint_clear_all(); debug_console_printf(machine, "Cleared all breakpoints\n"); } @@ -1224,8 +1224,9 @@ return; else { + device_iterator iter(machine.root_device()); bool found = false; - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->breakpoint_clear(bpindex)) found = true; if (found) @@ -1248,7 +1249,8 @@ /* if 0 parameters, clear all */ if (params == 0) { - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) device->debug()->breakpoint_enable_all(ref); if (ref == 0) debug_console_printf(machine, "Disabled all breakpoints\n"); @@ -1261,8 +1263,9 @@ return; else { + device_iterator iter(machine.root_device()); bool found = false; - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->breakpoint_enable(bpindex, ref)) found = true; if (found) @@ -1284,7 +1287,8 @@ astring buffer; /* loop over all CPUs */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->breakpoint_first() != NULL) { debug_console_printf(machine, "Device '%s' breakpoints:\n", device->tag()); @@ -1372,7 +1376,8 @@ /* if 0 parameters, clear all */ if (params == 0) { - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) device->debug()->watchpoint_clear_all(); debug_console_printf(machine, "Cleared all watchpoints\n"); } @@ -1382,8 +1387,9 @@ return; else { + device_iterator iter(machine.root_device()); bool found = false; - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->watchpoint_clear(wpindex)) found = true; if (found) @@ -1406,7 +1412,8 @@ /* if 0 parameters, clear all */ if (params == 0) { - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) device->debug()->watchpoint_enable_all(ref); if (ref == 0) debug_console_printf(machine, "Disabled all watchpoints\n"); @@ -1419,8 +1426,9 @@ return; else { + device_iterator iter(machine.root_device()); bool found = false; - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->watchpoint_enable(wpindex, ref)) found = true; if (found) @@ -1442,7 +1450,8 @@ astring buffer; /* loop over all CPUs */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) if (device->debug()->watchpoint_first(spacenum) != NULL) { @@ -1484,7 +1493,8 @@ bool cleared = false; /* loop over CPUs and find live spots */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->hotspot_tracking_enabled()) { device->debug()->hotspot_track(0, 0); @@ -2498,7 +2508,8 @@ const char *filename = param[0]; int scrnum = (params > 1) ? atoi(param[1]) : 0; - screen_device *screen = downcast(machine.devicelist().find(SCREEN, scrnum)); + screen_device_iterator iter(machine.root_device()); + screen_device *screen = iter.byindex(scrnum); if ((screen == NULL) || !machine.render().is_live(*screen)) { @@ -2682,12 +2693,12 @@ static void execute_images(running_machine &machine, int ref, int params, const char **param) { - device_image_interface *img = NULL; - for (bool gotone = machine.devicelist().first(img); gotone; gotone = img->next(img)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *img = iter.first(); img != NULL; img = iter.next()) { debug_console_printf(machine, "%s: %s\n",img->brief_instance_name(),img->exists() ? img->filename() : "[empty slot]"); } - if (!machine.devicelist().first(img)) { + if (iter.first() == NULL) { debug_console_printf(machine, "No image devices in this driver\n"); } } @@ -2698,9 +2709,9 @@ static void execute_mount(running_machine &machine, int ref, int params, const char **param) { - device_image_interface *img = NULL; + image_interface_iterator iter(machine.root_device()); bool done = false; - for (bool gotone = machine.devicelist().first(img); gotone; gotone = img->next(img)) + for (device_image_interface *img = iter.first(); img != NULL; img = iter.next()) { if (strcmp(img->brief_instance_name(),param[0])==0) { if (img->load(param[1])==IMAGE_INIT_FAIL) { @@ -2722,9 +2733,9 @@ static void execute_unmount(running_machine &machine, int ref, int params, const char **param) { - device_image_interface *img = NULL; + image_interface_iterator iter(machine.root_device()); bool done = false; - for (bool gotone = machine.devicelist().first(img); gotone; gotone = img->next(img)) + for (device_image_interface *img = iter.first(); img != NULL; img = iter.next()) { if (strcmp(img->brief_instance_name(),param[0])==0) { img->unload(); diff -Nru mame-0.144/src/emu/debug/debugcpu.c mame-0.145/src/emu/debug/debugcpu.c --- mame-0.144/src/emu/debug/debugcpu.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/debug/debugcpu.c 2012-02-06 21:30:26.000000000 +0000 @@ -51,9 +51,6 @@ #include "xmlfile.h" #include #include -#if defined(SDLMAME_FREEBSD) || defined(SDLMAME_NETBSD) || defined(SDLMAME_OS2) -# undef tolower -#endif /*************************************************************************** @@ -204,7 +201,8 @@ { /* this can be called on exit even when no debugging is enabled, so make sure the devdebug is valid before proceeding */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug() != NULL) device->debug()->trace_flush(); } @@ -340,8 +338,9 @@ xml_set_attribute(systemnode, "name", machine.system().name); // for each device + device_iterator iter(machine.root_device()); bool found_comments = false; - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->debug()->comment_count() > 0) { // create a node for this device @@ -1084,7 +1083,8 @@ static void reset_transient_flags(running_machine &machine) { /* loop over CPUs and reset the transient flags */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) device->debug()->reset_transient_flag(); machine.debugcpu_data->m_stop_when_not_device = NULL; } @@ -1147,13 +1147,10 @@ static device_t *expression_get_device(running_machine &machine, const char *tag) { - device_t *device; - - for (device = machine.devicelist().first(); device != NULL; device = device->next()) - if (mame_stricmp(device->tag(), tag) == 0) - return device; - - return NULL; + // convert to lowercase then lookup the name (tags are enforced to be all lower case) + astring fullname(tag); + fullname.makelower(); + return machine.device(fullname); } @@ -1633,15 +1630,8 @@ running_machine &machine = *reinterpret_cast(table.globalref()); device_t *target = machine.debugcpu_data->visiblecpu; - device_execute_interface *exec = NULL; - int index = 0; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) - { - if (&exec->device() == target) - return index; - index++; - } - return 0; + execute_interface_iterator iter(machine.root_device()); + return iter.indexof(target->execute()); } @@ -1682,6 +1672,8 @@ memset(m_pc_history, 0, sizeof(m_pc_history)); memset(m_wplist, 0, sizeof(m_wplist)); + m_comment_change = 0; + // find out which interfaces we have to work with device.interface(m_exec); device.interface(m_memory); @@ -1691,9 +1683,12 @@ // set up state-related stuff if (m_state != NULL) { - // add a global symbol for the current instruction pointer + // add global symbol for cycles and totalcycles if (m_exec != NULL) + { m_symtable.add("cycles", NULL, get_cycles); + m_symtable.add("totalcycles", NULL, get_totalcycles); + } // add entries to enable/disable unmap reporting for each space if (m_memory != NULL) @@ -1709,7 +1704,7 @@ // add all registers into it astring tempstr; for (const device_state_entry *entry = m_state->state_first(); entry != NULL; entry = entry->next()) - m_symtable.add(tempstr.cpy(entry->symbol()).tolower(), (void *)(FPTR)entry->index(), get_state, set_state); + m_symtable.add(tempstr.cpy(entry->symbol()).makelower(), (void *)(FPTR)entry->index(), get_state, set_state); } // set up execution-related stuff @@ -1731,6 +1726,8 @@ device_debug::~device_debug() { + auto_free(m_device.machine(), m_trace); + // free breakpoints and watchpoints breakpoint_clear_all(); watchpoint_clear_all(); @@ -3053,8 +3050,7 @@ } // disassemble to our buffer - buffer.expand(200); - return disassemble(buffer.text, pc, opbuf, argbuf); + return disassemble(buffer.stringbuffer(200), pc, opbuf, argbuf); } @@ -3083,6 +3079,18 @@ //------------------------------------------------- +// get_totalcycles - getter callback for the +// 'totalcycles' symbol +//------------------------------------------------- + +UINT64 device_debug::get_totalcycles(symbol_table &table, void *ref) +{ + device_t *device = reinterpret_cast(table.globalref()); + return device->debug()->m_exec->total_cycles(); +} + + +//------------------------------------------------- // get_logunmap - getter callback for the logumap // symbols //------------------------------------------------- diff -Nru mame-0.144/src/emu/debug/debugcpu.h mame-0.145/src/emu/debug/debugcpu.h --- mame-0.144/src/emu/debug/debugcpu.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/debug/debugcpu.h 2012-02-06 21:30:26.000000000 +0000 @@ -243,6 +243,7 @@ // symbol get/set callbacks static UINT64 get_current_pc(symbol_table &table, void *ref); static UINT64 get_cycles(symbol_table &table, void *ref); + static UINT64 get_totalcycles(symbol_table &table, void *ref); static UINT64 get_logunmap(symbol_table &table, void *ref); static void set_logunmap(symbol_table &table, void *ref, UINT64 value); static UINT64 get_state(symbol_table &table, void *ref); diff -Nru mame-0.144/src/emu/debug/dvdisasm.c mame-0.145/src/emu/debug/dvdisasm.c --- mame-0.144/src/emu/debug/dvdisasm.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/debug/dvdisasm.c 2012-02-06 21:30:26.000000000 +0000 @@ -132,9 +132,9 @@ m_source_list.reset(); // iterate over devices with disassembly interfaces - device_disasm_interface *dasm = NULL; + disasm_interface_iterator iter(machine().root_device()); astring name; - for (bool gotone = machine().devicelist().first(dasm); gotone; gotone = dasm->next(dasm)) + for (device_disasm_interface *dasm = iter.first(); dasm != NULL; dasm = iter.next()) { name.printf("%s '%s'", dasm->device().name(), dasm->device().tag()); m_source_list.append(*auto_alloc(machine(), debug_view_disasm_source(name, dasm->device()))); diff -Nru mame-0.144/src/emu/debug/dvmemory.c mame-0.145/src/emu/debug/dvmemory.c --- mame-0.144/src/emu/debug/dvmemory.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/debug/dvmemory.c 2012-02-06 21:30:26.000000000 +0000 @@ -152,8 +152,8 @@ astring name; // first add all the devices' address spaces - device_memory_interface *memintf = NULL; - for (bool gotone = machine().devicelist().first(memintf); gotone; gotone = memintf->next(memintf)) + memory_interface_iterator iter(machine().root_device()); + for (device_memory_interface *memintf = iter.first(); memintf != NULL; memintf = iter.next()) for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) { address_space *space = memintf->space(spacenum); @@ -182,7 +182,7 @@ break; // if this is a single-entry global, add it - if (valcount > 1 && strstr(itemname, "globals/")) + if (strstr(itemname, "state->")) { name.cpy(strrchr(itemname, '/') + 1); m_source_list.append(*auto_alloc(machine(), debug_view_memory_source(name, base, valsize, valcount))); diff -Nru mame-0.144/src/emu/debug/dvstate.c mame-0.145/src/emu/debug/dvstate.c --- mame-0.144/src/emu/debug/dvstate.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/debug/dvstate.c 2012-02-06 21:30:26.000000000 +0000 @@ -103,9 +103,9 @@ m_source_list.reset(); // iterate over devices that have state interfaces - device_state_interface *state = NULL; + state_interface_iterator iter(machine().root_device()); astring name; - for (bool gotone = machine().devicelist().first(state); gotone; gotone = state->next(state)) + for (device_state_interface *state = iter.first(); state != NULL; state = iter.next()) { name.printf("%s '%s'", state->device().name(), state->device().tag()); m_source_list.append(*auto_alloc(machine(), debug_view_state_source(name, state->device()))); diff -Nru mame-0.144/src/emu/debug/express.c mame-0.145/src/emu/debug/express.c --- mame-0.144/src/emu/debug/express.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/debug/express.c 2012-02-06 21:30:26.000000000 +0000 @@ -955,15 +955,15 @@ // if we have an 0x prefix, we must be a hex value if (buffer[0] == '0' && buffer[1] == 'x') - return parse_number(token, &buffer[2], 16, expression_error::INVALID_NUMBER); + return parse_number(token, buffer.cstr() + 2, 16, expression_error::INVALID_NUMBER); // if we have a # prefix, we must be a decimal value if (buffer[0] == '#') - return parse_number(token, &buffer[1], 10, expression_error::INVALID_NUMBER); + return parse_number(token, buffer.cstr() + 1, 10, expression_error::INVALID_NUMBER); // if we have a $ prefix, we are a hex value if (buffer[0] == '$') - return parse_number(token, &buffer[1], 16, expression_error::INVALID_NUMBER); + return parse_number(token, buffer.cstr() + 1, 16, expression_error::INVALID_NUMBER); // check for a symbol match symbol_entry *symbol = m_symtable->find_deep(buffer); diff -Nru mame-0.144/src/emu/debugint/debugint.c mame-0.145/src/emu/debugint/debugint.c --- mame-0.144/src/emu/debugint/debugint.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/debugint/debugint.c 2012-02-06 21:30:28.000000000 +0000 @@ -58,8 +58,8 @@ MACROS ***************************************************************************/ -//#define NX(_dv, _x) ((float) (_x)/(float)rect_get_width(&(_dv)->bounds)) -//#define NY(_dv, _y) ((float) (_y)/(float)rect_get_height(&(_dv)->bounds)) +//#define NX(_dv, _x) ((float) (_x)/(float)(_dv)->bounds.width()) +//#define NY(_dv, _y) ((float) (_y)/(float)(_dv)->bounds.height()) #define NX(_dv, _x) ((float) (_x)/(float) (dv)->rt_width) #define NY(_dv, _y) ((float) (_y)/(float) (dv)->rt_height) @@ -166,10 +166,7 @@ this->state = flags | VIEW_STATE_NEEDS_UPDATE; // initial size - this->bounds.min_x = 0; - this->bounds.min_y = 0; - this->bounds.max_x = 300; - this->bounds.max_y = 300; + this->bounds.set(0, 300, 0, 300); /* specials */ switch (type) @@ -221,37 +218,6 @@ INLINE FUNCTIONS ***************************************************************************/ -INLINE int rect_get_width(rectangle *r) -{ - return r->max_x - r->min_x + 1; -} - -INLINE int rect_get_height(rectangle *r) -{ - return r->max_y - r->min_y + 1; -} - -INLINE void rect_set_width(rectangle *r, int width) -{ - r->max_x = r->min_x + width - 1; -} - -INLINE void rect_set_height(rectangle *r, int height) -{ - r->max_y = r->min_y + height - 1; -} - -INLINE void rect_move(rectangle *r, int x, int y) -{ - int dx = x - r->min_x; - int dy = y - r->min_y; - - r->min_x += dx; - r->max_x += dx; - r->min_y += dy; - r->max_y += dy; -} - INLINE int dview_is_state(DView *dv, int state) { return ((dv->state & state) ? TRUE : FALSE); @@ -316,47 +282,46 @@ static void dview_free(DView *dv) { - //astring_free(dv->title); LIST_REMOVE(list, dv, DView); auto_free(dv->machine(), dv); } -static void dview_get_rect(DView *dv, int type, rectangle *rect) +static void dview_get_rect(DView *dv, int type, rectangle &rect) { - *rect = dv->bounds; + rect = dv->bounds; switch (type) { case RECT_DVIEW: break; case RECT_DVIEW_CLIENT: - rect->min_x += BORDER_XTHICKNESS; - rect->max_x -= (BORDER_XTHICKNESS + dv->vsb.visible * VSB_WIDTH); - rect->min_y += 2 * BORDER_YTHICKNESS + TITLE_HEIGHT; - rect->max_y -= (BORDER_YTHICKNESS + dv->hsb.visible * HSB_HEIGHT); + rect.min_x += BORDER_XTHICKNESS; + rect.max_x -= (BORDER_XTHICKNESS + dv->vsb.visible * VSB_WIDTH); + rect.min_y += 2 * BORDER_YTHICKNESS + TITLE_HEIGHT; + rect.max_y -= (BORDER_YTHICKNESS + dv->hsb.visible * HSB_HEIGHT); break; case RECT_DVIEW_HSB: - rect->min_x += 0; - rect->max_x -= /* dv->vsb.visible * */ VSB_WIDTH; - rect->min_y = dv->bounds.max_y - HSB_HEIGHT; - rect->max_y -= 0; + rect.min_x += 0; + rect.max_x -= /* dv->vsb.visible * */ VSB_WIDTH; + rect.min_y = dv->bounds.max_y - HSB_HEIGHT; + rect.max_y -= 0; break; case RECT_DVIEW_VSB: - rect->min_x = dv->bounds.max_x - VSB_WIDTH; - rect->max_x -= 0; - rect->min_y += TITLE_HEIGHT; - rect->max_y -= /* dv->hsb.visible * */ HSB_HEIGHT; + rect.min_x = dv->bounds.max_x - VSB_WIDTH; + rect.max_x -= 0; + rect.min_y += TITLE_HEIGHT; + rect.max_y -= /* dv->hsb.visible * */ HSB_HEIGHT; break; case RECT_DVIEW_SIZE: - rect->min_x = dv->bounds.max_x - VSB_WIDTH; - rect->max_x -= 0; - rect->min_y = dv->bounds.max_y - HSB_HEIGHT; - rect->max_y -= 0; + rect.min_x = dv->bounds.max_x - VSB_WIDTH; + rect.max_x -= 0; + rect.min_y = dv->bounds.max_y - HSB_HEIGHT; + rect.max_y -= 0; break; case RECT_DVIEW_TITLE: - rect->min_x += 0; - rect->max_x -= 0; - rect->min_y += 0; - rect->max_y = rect->min_y + TITLE_HEIGHT - 1; + rect.min_x += 0; + rect.max_x -= 0; + rect.min_y += 0; + rect.max_y = rect.min_y + TITLE_HEIGHT - 1; break; default: assert_always(FALSE, "unknown rectangle type"); @@ -373,7 +338,7 @@ { rectangle r; - dview_get_rect(dv, rtype, &r); + dview_get_rect(dv, rtype, r); ui_draw_outlined_box(dv->container, NX(dv, x + r.min_x), NY(dv, y + r.min_y), NX(dv, x + r.min_x + w), NY(dv, y + r.min_y + h), bg); } @@ -382,7 +347,7 @@ { rectangle r; - dview_get_rect(dv, rtype, &r); + dview_get_rect(dv, rtype, r); dv->container->add_rect(NX(dv, x + r.min_x), NY(dv, y + r.min_y), NX(dv, x + r.min_x + w), NY(dv, y + r.min_y + h), col, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); @@ -392,13 +357,13 @@ { rectangle r; - dview_get_rect(dv, rtype, &r); + dview_get_rect(dv, rtype, r); dv->container->add_char( NX(dv, x + r.min_x), NY(dv, y + r.min_y), NY(dv, h), debug_font_aspect, - //(float) rect_get_height(&dv->bounds) / (float) rect_get_width(&dv->bounds), //render_get_ui_aspect(), + //(float) dv->bounds.height() / (float) dv->bounds->width(), //render_get_ui_aspect(), col, *debug_font, ch); @@ -408,8 +373,8 @@ { rectangle r; - dview_get_rect(dv, type, &r); - if (x >= r.min_x && x <= r.max_x && y >= r.min_y && y <= r.max_y) + dview_get_rect(dv, type, r); + if (r.contains(x, y)) return TRUE; return FALSE; } @@ -423,12 +388,12 @@ rectangle r; adjustment *sb = &dv->hsb; - dview_get_rect(dv, RECT_DVIEW_HSB, &r); + dview_get_rect(dv, RECT_DVIEW_HSB, r); dview_draw_outlined_box(dv, RECT_DVIEW_HSB, 0, 0, VSB_WIDTH,HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); - dview_draw_outlined_box(dv, RECT_DVIEW_HSB, rect_get_width(&r) - VSB_WIDTH, 0, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); + dview_draw_outlined_box(dv, RECT_DVIEW_HSB, r.width() - VSB_WIDTH, 0, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); - ts = (r.max_x - r.min_x + 1) - 2 * VSB_WIDTH; + ts = (r.width()) - 2 * VSB_WIDTH; sz = (ts * (sb->page_size)) / (sb->upper - sb->lower); ts = ts - sz; @@ -447,12 +412,12 @@ rectangle r; adjustment *sb = &dv->vsb; - dview_get_rect(dv, RECT_DVIEW_VSB, &r); + dview_get_rect(dv, RECT_DVIEW_VSB, r); - dview_draw_outlined_box(dv, RECT_DVIEW_VSB, 0, rect_get_height(&r) - HSB_HEIGHT, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); - dview_draw_outlined_box(dv, RECT_DVIEW_VSB, 0, 0, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); + dview_draw_outlined_box(dv, RECT_DVIEW_VSB, 0, r.height() - HSB_HEIGHT, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); + dview_draw_outlined_box(dv, RECT_DVIEW_VSB, 0, 0, VSB_WIDTH, HSB_HEIGHT, MAKE_ARGB(0xff, 0xff, 0x00, 0x00)); - ts = (r.max_y - r.min_y + 1) - 2 * HSB_HEIGHT; + ts = r.height() - 2 * HSB_HEIGHT; sz = (ts * (sb->page_size)) / (sb->upper - sb->lower); ts = ts - sz; @@ -466,10 +431,10 @@ { rectangle r; - dview_get_rect(dv, RECT_DVIEW_SIZE, &r); + dview_get_rect(dv, RECT_DVIEW_SIZE, r); dview_draw_outlined_box(dv, RECT_DVIEW_SIZE, 0, 0, - rect_get_width(&r),rect_get_height(&r), MAKE_ARGB(0xff, 0xff, 0xff, 0x00)); + r.width(),r.height(), MAKE_ARGB(0xff, 0xff, 0xff, 0x00)); } static void dview_set_title(DView *dv, astring title) @@ -487,12 +452,12 @@ rgb_t col = MAKE_ARGB(0xff,0x00,0x00,0xff); rectangle r; - dview_get_rect(dv, RECT_DVIEW_TITLE, &r); + dview_get_rect(dv, RECT_DVIEW_TITLE, r); if (dv == focus_view) col = MAKE_ARGB(0xff,0x00,0x7f,0x00); - dview_draw_outlined_box(dv, RECT_DVIEW_TITLE, 0, 0, rect_get_width(&dv->bounds), TITLE_HEIGHT, col); + dview_draw_outlined_box(dv, RECT_DVIEW_TITLE, 0, 0, dv->bounds.width(), TITLE_HEIGHT, col); if (!dv->title) return; @@ -562,13 +527,13 @@ rectangle r; int xt; - dview_get_rect(dv, RECT_DVIEW_HSB, &r); + dview_get_rect(dv, RECT_DVIEW_HSB, r); x -= r.min_x; - xt = (x - VSB_WIDTH) * (sb->upper - sb->lower) / (rect_get_width(&r) - 2 * dv->vsb.visible * VSB_WIDTH) + sb->lower; + xt = (x - VSB_WIDTH) * (sb->upper - sb->lower) / (r.width() - 2 * dv->vsb.visible * VSB_WIDTH) + sb->lower; if (x < VSB_WIDTH) sb->value -= sb->step_increment; - else if (x > rect_get_width(&r) - VSB_WIDTH) + else if (x > r.width() - VSB_WIDTH) sb->value += sb->step_increment; else if (xt < sb->value) sb->value -= sb->page_increment; @@ -601,13 +566,13 @@ rectangle r; int yt; - dview_get_rect(dv, RECT_DVIEW_VSB, &r); + dview_get_rect(dv, RECT_DVIEW_VSB, r); y -= r.min_y; - yt = (y - HSB_HEIGHT) * (sb->upper - sb->lower) / (rect_get_height(&r) - 2 * HSB_HEIGHT) + sb->lower; + yt = (y - HSB_HEIGHT) * (sb->upper - sb->lower) / (r.height() - 2 * HSB_HEIGHT) + sb->lower; if (y < HSB_HEIGHT) sb->value -= sb->step_increment; - else if (y > rect_get_height(&r) - HSB_HEIGHT) + else if (y > r.height() - HSB_HEIGHT) sb->value += sb->step_increment; else if (yt < sb->value) sb->value -= sb->page_increment; @@ -712,11 +677,11 @@ dview_draw_title(dv); - dview_get_rect(dv, RECT_DVIEW_CLIENT, &r); + dview_get_rect(dv, RECT_DVIEW_CLIENT, r); dview_draw_outlined_box(dv, RECT_DVIEW_CLIENT, 0, 0, - rect_get_width(&r) /*- (dv->vs ? VSB_WIDTH : 0)*/, - rect_get_height(&r) /*- (dv->hsb.visible ? HSB_HEIGHT : 0)*/, bg_base); + r.width() /*- (dv->vs ? VSB_WIDTH : 0)*/, + r.height() /*- (dv->hsb.visible ? HSB_HEIGHT : 0)*/, bg_base); /* background first */ viewdata = dv->view->viewdata(); @@ -785,8 +750,8 @@ dv->container->get_user_settings(rcus); rcus.m_xoffset = (float) dv->ofs_x / (float) dv->rt_width; rcus.m_yoffset = (float) dv->ofs_y / (float) dv->rt_height; - rcus.m_xscale = 1.0; //(float) rect_get_width(&dv->bounds) / (float) dv->rt_width; - rcus.m_yscale = 1.0; //(float) rect_get_height(&dv->bounds) / (float) dv->rt_height; + rcus.m_xscale = 1.0; //(float) dv->bounds.width() / (float) dv->rt_width; + rcus.m_yscale = 1.0; //(float) dv->bounds.height() / (float) dv->rt_height; dv->container->set_user_settings(rcus); //printf("%d %d %d %d\n", wpos.min_x, wpos.max_x, wpos.min_y, wpos.max_y); @@ -795,18 +760,18 @@ dv->hsb.visible = 0; dv->vsb.visible = 0; - dview_get_rect(dv, RECT_DVIEW_CLIENT, &r); + dview_get_rect(dv, RECT_DVIEW_CLIENT, r); - dv->hsb.visible = (size.x * debug_font_width > rect_get_width(&r) ? 1 : 0); - dv->vsb.visible = (size.y * debug_font_height > rect_get_height(&r) ? 1 : 0); - dview_get_rect(dv, RECT_DVIEW_CLIENT, &r); - - dv->hsb.visible = (size.x * debug_font_width > rect_get_width(&r) ? 1 : 0); - dv->vsb.visible = (size.y * debug_font_height > rect_get_height(&r) ? 1 : 0); - dview_get_rect(dv, RECT_DVIEW_CLIENT, &r); + dv->hsb.visible = (size.x * debug_font_width > r.width() ? 1 : 0); + dv->vsb.visible = (size.y * debug_font_height > r.height() ? 1 : 0); + dview_get_rect(dv, RECT_DVIEW_CLIENT, r); + + dv->hsb.visible = (size.x * debug_font_width > r.width() ? 1 : 0); + dv->vsb.visible = (size.y * debug_font_height > r.height() ? 1 : 0); + dview_get_rect(dv, RECT_DVIEW_CLIENT, r); - col.y = (rect_get_height(&r) - 2 * BORDER_YTHICKNESS /*+ debug_font_height - 1*/) / debug_font_height; - col.x = (rect_get_width(&r) - 2 * BORDER_XTHICKNESS /*+ debug_font_width - 1*/) / debug_font_width; + col.y = (r.height() - 2 * BORDER_YTHICKNESS /*+ debug_font_height - 1*/) / debug_font_height; + col.x = (r.width() - 2 * BORDER_XTHICKNESS /*+ debug_font_width - 1*/) / debug_font_width; vsize.y = size.y - pos.y; vsize.x = size.x - pos.x; @@ -831,7 +796,7 @@ dv->view->set_visible_size(vsize); if(dv->hsb.visible) { - int span = (rect_get_width(&r) - 2 * BORDER_XTHICKNESS) / debug_font_width; + int span = (r.width() - 2 * BORDER_XTHICKNESS) / debug_font_width; if(pos.x + span > size.x) pos.x = size.x - span; @@ -848,7 +813,7 @@ } if(dv->vsb.visible) { - int span = (rect_get_height(&r) - 2 * BORDER_YTHICKNESS) / debug_font_height; + int span = (r.height() - 2 * BORDER_YTHICKNESS) / debug_font_height; if(pos.y + span > size.y) pos.y = size.y - span; @@ -958,7 +923,7 @@ downcast(dv->view)->set_expression(str); break; case DVT_CONSOLE: - if(!dv->editor.str[(long)0]) + if(!dv->editor.str[(int)0]) debug_cpu_get_visible_cpu(dv->machine())->debug()->single_step(); else debug_console_execute_command(dv->machine(), str, 1); @@ -1159,15 +1124,23 @@ menu_main_populate - populate the main menu -------------------------------------------------*/ +class ui_menu_debug : public ui_menu { +public: + ui_menu_debug(running_machine &machine, render_container *container) : ui_menu(machine, container) {} + virtual ~ui_menu_debug() {} + virtual void populate() {} + virtual void handle() {} +}; + static void CreateMainMenu(running_machine &machine) { const char *subtext = ""; int rc; astring title; - if (menu != NULL) - ui_menu_free(menu); - menu = ui_menu_alloc(machine, &machine.render().ui_container(),NULL,NULL); + if (menu) + auto_free(machine, menu); + menu = auto_alloc_clear(machine, ui_menu_debug(machine, &machine.render().ui_container())); switch (focus_view->type) { @@ -1188,8 +1161,8 @@ break; } - ui_menu_item_append(menu, title.cat(focus_view->title), NULL, MENU_FLAG_DISABLE, NULL); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append(title.cat(focus_view->title), NULL, MENU_FLAG_DISABLE, NULL); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); switch (focus_view->type) { @@ -1202,38 +1175,38 @@ case DASM_RIGHTCOL_ENCRYPTED: subtext = "Enc Opcodes"; break; case DASM_RIGHTCOL_COMMENTS: subtext = "Comments"; break; } - ui_menu_item_append(menu, "View", subtext, MENU_FLAG_RIGHT_ARROW, (void *)on_view_opcodes_activate); - ui_menu_item_append(menu, "Run to cursor", NULL, 0, (void *)on_run_to_cursor_activate); + menu->item_append("View", subtext, MENU_FLAG_RIGHT_ARROW, (void *)on_view_opcodes_activate); + menu->item_append("Run to cursor", NULL, 0, (void *)on_run_to_cursor_activate); if (!dview_is_state(focus_view, VIEW_STATE_FOLLOW_CPU)) { - ui_menu_item_append(menu, "CPU", focus_view->view->source()->name(), MENU_FLAG_RIGHT_ARROW, (void *)on_disasm_cpu_activate); + menu->item_append("CPU", focus_view->view->source()->name(), MENU_FLAG_RIGHT_ARROW, (void *)on_disasm_cpu_activate); } - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); break; } } /* add input menu items */ - ui_menu_item_append(menu, "New Memory Window", NULL, 0, (void *)on_memory_window_activate); - ui_menu_item_append(menu, "New Disassembly Window", NULL, 0, (void *)on_disassembly_window_activate); - ui_menu_item_append(menu, "New Error Log Window", NULL, 0, (void *)on_log_window_activate); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Run", NULL, 0, (void *)on_run_activate); - ui_menu_item_append(menu, "Run to Next CPU", NULL, 0, (void *)on_run_cpu_activate); - ui_menu_item_append(menu, "Run until Next Interrupt on This CPU", NULL, 0, (void *)on_run_irq_activate); - ui_menu_item_append(menu, "Run until Next VBLANK", NULL, 0, (void *)on_run_vbl_activate); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Step Into", NULL, 0, (void *)on_step_into_activate); - ui_menu_item_append(menu, "Step Over", NULL, 0, (void *)on_step_over_activate); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Soft Reset", NULL, 0, (void *)on_soft_reset_activate); - ui_menu_item_append(menu, "Hard Reset", NULL, 0, (void *)on_hard_reset_activate); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append("New Memory Window", NULL, 0, (void *)on_memory_window_activate); + menu->item_append("New Disassembly Window", NULL, 0, (void *)on_disassembly_window_activate); + menu->item_append("New Error Log Window", NULL, 0, (void *)on_log_window_activate); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append("Run", NULL, 0, (void *)on_run_activate); + menu->item_append("Run to Next CPU", NULL, 0, (void *)on_run_cpu_activate); + menu->item_append("Run until Next Interrupt on This CPU", NULL, 0, (void *)on_run_irq_activate); + menu->item_append("Run until Next VBLANK", NULL, 0, (void *)on_run_vbl_activate); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append("Step Into", NULL, 0, (void *)on_step_into_activate); + menu->item_append("Step Over", NULL, 0, (void *)on_step_over_activate); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + menu->item_append("Soft Reset", NULL, 0, (void *)on_soft_reset_activate); + menu->item_append("Hard Reset", NULL, 0, (void *)on_hard_reset_activate); + menu->item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); if (!dview_is_state(focus_view, VIEW_STATE_FOLLOW_CPU)) - ui_menu_item_append(menu, "Close Window", NULL, 0, (void *)on_close_activate); - ui_menu_item_append(menu, "Exit", NULL, 0, (void *)on_exit_activate); + menu->item_append("Close Window", NULL, 0, (void *)on_close_activate); + menu->item_append("Exit", NULL, 0, (void *)on_exit_activate); } static int map_point(DView *dv, INT32 target_x, INT32 target_y, INT32 *mapped_x, INT32 *mapped_y) @@ -1355,10 +1328,10 @@ if (menu != NULL) { /* process the menu */ - event = ui_menu_process(machine, menu, 0); + event = menu->process(0); if (event != NULL && (event->iptkey == IPT_UI_SELECT || (event->iptkey == IPT_UI_RIGHT))) { - //ui_menu_free(menu); + //auto_free(machine, menu); //menu = NULL; ((void (*)(DView *, const ui_menu_event *)) event->itemref)(focus_view, event); //ui_menu_stack_push(ui_menu_alloc(machine, menu->container, (ui_menu_handler_func)event->itemref, NULL)); @@ -1366,7 +1339,7 @@ } else if (ui_input_pressed(machine, IPT_UI_CONFIGURE)) { - ui_menu_free(menu); + auto_free(machine, menu); menu = NULL; } } diff -Nru mame-0.144/src/emu/delegate.h mame-0.145/src/emu/delegate.h --- mame-0.144/src/emu/delegate.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/delegate.h 2012-02-06 21:30:28.000000000 +0000 @@ -157,20 +157,29 @@ // and member function pointer of the appropriate type and number of parameters; we use // partial template specialization to support fewer parameters by defaulting the later // parameters to the special type _noparam -template +template struct delegate_traits { - typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type); - typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type); - typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type); + typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type); + typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type); + typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type, _P5Type); }; // dummy class used to indicate a non-existant parameter class _noparam { }; +// specialization for 4 parameters +template +struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _noparam> +{ + typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type, _P4Type); + typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type, _P4Type); + typedef _ReturnType (_ClassType::*member_func_type)(_P1Type, _P2Type, _P3Type, _P4Type); +}; + // specialization for 3 parameters template -struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam> +struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam, _noparam> { typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type, _P3Type); typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type, _P3Type); @@ -179,7 +188,7 @@ // specialization for 2 parameters template -struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _noparam, _noparam> +struct delegate_traits<_ClassType, _ReturnType, _P1Type, _P2Type, _noparam, _noparam, _noparam> { typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type, _P2Type); typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type, _P2Type); @@ -188,7 +197,7 @@ // specialization for 1 parameter template -struct delegate_traits<_ClassType, _ReturnType, _P1Type, _noparam, _noparam, _noparam> +struct delegate_traits<_ClassType, _ReturnType, _P1Type, _noparam, _noparam, _noparam, _noparam> { typedef _ReturnType (*static_func_type)(_ClassType *, _P1Type); typedef _ReturnType (*static_ref_func_type)(_ClassType &, _P1Type); @@ -197,7 +206,7 @@ // specialization for no parameters template -struct delegate_traits<_ClassType, _ReturnType, _noparam, _noparam, _noparam, _noparam> +struct delegate_traits<_ClassType, _ReturnType, _noparam, _noparam, _noparam, _noparam, _noparam> { typedef _ReturnType (*static_func_type)(_ClassType *); typedef _ReturnType (*static_ref_func_type)(_ClassType &); @@ -259,16 +268,25 @@ }; -// ======================> delegate +// ======================> delegate_base // general delegate class template supporting up to 4 parameters -template +template class delegate_base { typedef delegate_generic_class *(*late_bind_func)(delegate_late_bind &object); - typedef typename delegate_traits::static_func_type generic_static_func; public: + // define our traits + template + struct traits + { + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::member_func_type member_func_type; + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::static_func_type static_func_type; + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::static_ref_func_type static_ref_func_type; + }; + typedef typename traits::static_func_type generic_static_func; + // generic constructor delegate_base() : m_name(NULL), @@ -297,7 +315,7 @@ // construct from member function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::member_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_callobject(reinterpret_cast(this)), @@ -307,7 +325,7 @@ // construct from static function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_callobject(NULL), @@ -316,7 +334,7 @@ // construct from static reference function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_callobject(NULL), @@ -355,6 +373,7 @@ _ReturnType operator()(_P1Type p1, _P2Type p2) const { return (*m_function)(m_callobject, p1, p2); } _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3) const { return (*m_function)(m_callobject, p1, p2, p3); } _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4) const { return (*m_function)(m_callobject, p1, p2, p3, p4); } + _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5) const { return (*m_function)(m_callobject, p1, p2, p3, p4, p5); } // late binding void late_bind(delegate_late_bind &object) { bind((*m_latebinder)(object)); } @@ -416,6 +435,15 @@ return (reinterpret_cast<_FunctionClass *>(_this->m_object)->*mfp)(p1, p2, p3, p4); } + template + static _ReturnType method_stub(delegate_generic_class *object, _P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5) + { + typedef _ReturnType (_FunctionClass::*mfptype)(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5); + delegate_base *_this = reinterpret_cast(object); + mfptype &mfp = _this->m_rawfunction.mfp(); + return (reinterpret_cast<_FunctionClass *>(_this->m_object)->*mfp)(p1, p2, p3, p4, p5); + } + // late binding helper template static delegate_generic_class *late_bind_helper(delegate_late_bind &object) @@ -493,15 +521,24 @@ }; -// ======================> delegate +// ======================> delegate_base -template +template class delegate_base { typedef delegate_generic_class *(*late_bind_func)(delegate_late_bind &object); - typedef typename delegate_traits::static_func_type generic_static_func; public: + // define our traits + template + struct traits + { + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::member_func_type member_func_type; + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::static_func_type static_func_type; + typedef typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type>::static_ref_func_type static_ref_func_type; + }; + typedef typename traits::static_func_type generic_static_func; + // generic constructor delegate_base() : m_name(NULL), @@ -527,7 +564,7 @@ // construct from member function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::member_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_function(NULL), @@ -536,7 +573,7 @@ // construct from static function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_function(reinterpret_cast(funcptr)), @@ -544,7 +581,7 @@ // construct from static reference function with object pointer template - delegate_base(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) + delegate_base(typename traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : m_name(name), m_object(NULL), m_function(reinterpret_cast(funcptr)), @@ -581,6 +618,7 @@ _ReturnType operator()(_P1Type p1, _P2Type p2) const { return (*m_function)(m_object, p1, p2); } _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3) const { return (*m_function)(m_object, p1, p2, p3); } _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4) const { return (*m_function)(m_object, p1, p2, p3, p4); } + _ReturnType operator()(_P1Type p1, _P2Type p2, _P3Type p3, _P4Type p4, _P5Type p5) const { return (*m_function)(m_object, p1, p2, p3, p4, p5); } // late binding void late_bind(delegate_late_bind &object) { bind((*m_latebinder)(object)); } @@ -626,13 +664,15 @@ class delegate<_ReturnType ()> : public delegate_base<_ReturnType> { typedef delegate_base<_ReturnType> basetype; + public: + // create a standard set of constructors delegate() : basetype() { } delegate(const basetype &src) : basetype(src) { } delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _noparam, _noparam, _noparam, _noparam>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _noparam, _noparam, _noparam, _noparam>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _noparam, _noparam, _noparam, _noparam>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } }; @@ -641,13 +681,15 @@ class delegate<_ReturnType (_P1Type)> : public delegate_base<_ReturnType, _P1Type> { typedef delegate_base<_ReturnType, _P1Type> basetype; + public: + // create a standard set of constructors delegate() : basetype() { } delegate(const basetype &src) : basetype(src) { } delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _noparam, _noparam, _noparam>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _noparam, _noparam, _noparam>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _noparam, _noparam, _noparam>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } }; @@ -656,13 +698,15 @@ class delegate<_ReturnType (_P1Type, _P2Type)> : public delegate_base<_ReturnType, _P1Type, _P2Type> { typedef delegate_base<_ReturnType, _P1Type, _P2Type> basetype; + public: + // create a standard set of constructors delegate() : basetype() { } delegate(const basetype &src) : basetype(src) { } delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _noparam, _noparam>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _noparam, _noparam>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _noparam, _noparam>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } }; @@ -671,13 +715,15 @@ class delegate<_ReturnType (_P1Type, _P2Type, _P3Type)> : public delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type> { typedef delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type> basetype; + public: + // create a standard set of constructors delegate() : basetype() { } delegate(const basetype &src) : basetype(src) { } delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _noparam>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } }; @@ -686,15 +732,37 @@ class delegate<_ReturnType (_P1Type, _P2Type, _P3Type, _P4Type)> : public delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type> { typedef delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type> basetype; + public: + // create a standard set of constructors delegate() : basetype() { } delegate(const basetype &src) : basetype(src) { } delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } - template delegate(typename delegate_traits<_FunctionClass, _ReturnType, _P1Type, _P2Type, _P3Type, _P4Type>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } }; +// specialize for 5 parameters +template +class delegate<_ReturnType (_P1Type, _P2Type, _P3Type, _P4Type, _P5Type)> : public delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type> +{ + typedef delegate_base<_ReturnType, _P1Type, _P2Type, _P3Type, _P4Type, _P5Type> basetype; + +public: + // create a standard set of constructors + delegate() : basetype() { } + delegate(const basetype &src) : basetype(src) { } + delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + template delegate(typename basetype::template traits<_FunctionClass>::static_ref_func_type funcptr, const char *name, _FunctionClass *object) : basetype(funcptr, name, object) { } + delegate &operator=(const basetype &src) { *static_cast(this) = src; return *this; } +}; + +// Some useful delegates + +typedef delegate line_cb_t; #endif /* __DELEGATE_H__ */ diff -Nru mame-0.144/src/emu/deprecat.h mame-0.145/src/emu/deprecat.h --- mame-0.144/src/emu/deprecat.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/deprecat.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/*************************************************************************** - - deprecat.h - - Definition of deprecated and obsolete constructs that should not - be used by new code, if at all possible. - - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - -***************************************************************************/ - -#pragma once - -#ifndef __DEPRECAT_H__ -#define __DEPRECAT_H__ - - -/************************************* - * - * Old way of allowing "VBLANK" - * interrupts to fire more than once - * a frame. - * - * These should be replaced with - * scanline based interrupts as - * it makes no sense to have more - * than one VBLANK interrupt - * per frame. - * - *************************************/ - -#define MCFG_CPU_VBLANK_INT_HACK(_func, _rate) \ - device_execute_interface::static_set_vblank_int(*device, _func, NULL, _rate); \ - - - -/************************************* - * - * Core timing - * - *************************************/ - -/* Returns the number of times the interrupt handler will be called before - the end of the current video frame. This is can be useful to interrupt - handlers to synchronize their operation. If you call this from outside - an interrupt handler, add 1 to the result, i.e. if it returns 0, it means - that the interrupt handler will be called once. */ -#define cpu_getiloops(dev) device_execute(dev)->iloops() - - - -#endif /* __DEPRECAT_H__ */ diff -Nru mame-0.144/src/emu/devcb.c mame-0.145/src/emu/devcb.c --- mame-0.144/src/emu/devcb.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/devcb.c 2012-02-06 21:30:26.000000000 +0000 @@ -96,17 +96,7 @@ device_t *devcb_resolver::resolve_device(int index, const char *tag, device_t ¤t) { - device_t *result = NULL; - - if (index == DEVCB_DEVICE_SELF) - result = ¤t; - else if (index == DEVCB_DEVICE_DRIVER) - result = current.machine().driver_data(); - else if (strcmp(tag, DEVICE_SELF_OWNER) == 0) - result = current.owner(); - else - result = current.siblingdevice(tag); - + device_t *result = current.siblingdevice(tag); if (result == NULL) throw emu_fatalerror("Unable to resolve device '%s' (requested by callback to %s '%s')", tag, current.name(), current.tag()); return result; diff -Nru mame-0.144/src/emu/devcb.h mame-0.145/src/emu/devcb.h --- mame-0.144/src/emu/devcb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/devcb.h 2012-02-06 21:30:26.000000000 +0000 @@ -93,14 +93,6 @@ DEVCB_TYPE_CONSTANT // constant value read }; -// for DEVCB_TYPE_DEVICE, some further differentiation -enum -{ - DEVCB_DEVICE_SELF, // ignore 'tag', refers to the device itself - DEVCB_DEVICE_DRIVER, // ignore 'tag', refers to the driver device - DEVCB_DEVICE_OTHER // device specified by 'tag' -}; - //************************************************************************** @@ -158,20 +150,20 @@ #define DEVCB_NULL { DEVCB_TYPE_NULL } // standard line or read/write handlers with the calling device passed -#define DEVCB_LINE(func) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_SELF, NULL, #func, func, NULL, NULL } -#define DEVCB_LINE_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_SELF, NULL, #cls "::" #memb, &devcb_line_stub, NULL, NULL } -#define DEVCB_HANDLER(func) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_SELF, NULL, #func, NULL, func, NULL } -#define DEVCB_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_SELF, NULL, #cls "::" #memb, NULL, &devcb_stub, NULL } +#define DEVCB_LINE(func) { DEVCB_TYPE_DEVICE, 0, "", #func, func, NULL, NULL } +#define DEVCB_LINE_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, 0, "", #cls "::" #memb, &devcb_line_stub, NULL, NULL } +#define DEVCB_HANDLER(func) { DEVCB_TYPE_DEVICE, 0, "", #func, NULL, func, NULL } +#define DEVCB_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, 0, "", #cls "::" #memb, NULL, &devcb_stub, NULL } // line or read/write handlers for the driver device -#define DEVCB_DRIVER_LINE_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_DRIVER, NULL, #cls "::" #memb, &devcb_line_stub, NULL, NULL } -#define DEVCB_DRIVER_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_DRIVER, NULL, #cls "::" #memb, NULL, &devcb_stub, NULL } +#define DEVCB_DRIVER_LINE_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, 0, ":", #cls "::" #memb, &devcb_line_stub, NULL, NULL } +#define DEVCB_DRIVER_MEMBER(cls,memb) { DEVCB_TYPE_DEVICE, 0, ":", #cls "::" #memb, NULL, &devcb_stub, NULL } // line or read/write handlers for another device -#define DEVCB_DEVICE_LINE(tag,func) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_OTHER, tag, #func, func, NULL, NULL } -#define DEVCB_DEVICE_LINE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_OTHER, tag, #cls "::" #memb, &devcb_line_stub, NULL, NULL } -#define DEVCB_DEVICE_HANDLER(tag,func) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_OTHER, tag, #func, NULL, func, NULL } -#define DEVCB_DEVICE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, DEVCB_DEVICE_OTHER, tag, #cls "::" #memb, NULL, &devcb_stub, NULL } +#define DEVCB_DEVICE_LINE(tag,func) { DEVCB_TYPE_DEVICE, 0, tag, #func, func, NULL, NULL } +#define DEVCB_DEVICE_LINE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, 0, tag, #cls "::" #memb, &devcb_line_stub, NULL, NULL } +#define DEVCB_DEVICE_HANDLER(tag,func) { DEVCB_TYPE_DEVICE, 0, tag, #func, NULL, func, NULL } +#define DEVCB_DEVICE_MEMBER(tag,cls,memb) { DEVCB_TYPE_DEVICE, 0, tag, #cls "::" #memb, NULL, &devcb_stub, NULL } // constant values #define DEVCB_CONSTANT(value) { DEVCB_TYPE_CONSTANT, value, NULL, NULL, NULL, NULL } diff -Nru mame-0.144/src/emu/devcpu.c mame-0.145/src/emu/devcpu.c --- mame-0.144/src/emu/devcpu.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/devcpu.c 2012-02-06 21:30:28.000000000 +0000 @@ -114,8 +114,6 @@ m_shortname = get_legacy_string(DEVINFO_STR_SHORTNAME); m_searchpath = m_shortname; - memset(&m_partial_frame_period, 0, sizeof(m_partial_frame_period)); - int tokenbytes = get_legacy_int(CPUINFO_INT_CONTEXT_SIZE); if (tokenbytes == 0) throw emu_fatalerror("Device %s specifies a 0 context size!\n", tag); diff -Nru mame-0.144/src/emu/device.c mame-0.145/src/emu/device.c --- mame-0.144/src/emu/device.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/device.c 2012-02-06 21:30:28.000000000 +0000 @@ -87,234 +87,6 @@ //************************************************************************** -// DEVICE LIST MANAGEMENT -//************************************************************************** - -//------------------------------------------------- -// device_list - device list constructor -//------------------------------------------------- - -device_list::device_list(resource_pool &pool) - : tagged_list(pool) -{ -} - - -//------------------------------------------------- -// set_machine_all - once the machine is created, -// tell every device about it -//------------------------------------------------- - -void device_list::set_machine_all(running_machine &machine) -{ - // add exit and reset callbacks - m_machine = &machine; - - // iterate over devices and set their machines as well - for (device_t *device = first(); device != NULL; device = device->next()) - device->set_machine(machine); -} - - -//------------------------------------------------- -// start_all - start all the devices in the -// list -//------------------------------------------------- - -void device_list::start_all() -{ - // add exit and reset callbacks - machine().add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(device_list::reset_all), this)); - machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(device_list::exit), this)); - - // add pre-save and post-load callbacks - machine().save().register_presave(save_prepost_delegate(FUNC(device_list::presave_all), this)); - machine().save().register_postload(save_prepost_delegate(FUNC(device_list::postload_all), this)); - - // start_new_devices does all the necessary work - start_new_devices(); -} - - -//------------------------------------------------- -// start_new_devices - start any unstarted devices -//------------------------------------------------- - -void device_list::start_new_devices() -{ - assert(m_machine != NULL); - - // iterate through the devices - device_t *nextdevice; - for (device_t *device = first(); device != NULL; device = nextdevice) - { - // see if this device is what we want - nextdevice = device->next(); - if (!device->started()) - { - // attempt to start the device, catching any expected exceptions - try - { - // if the device doesn't have a machine yet, set it first - if (device->m_machine == NULL) - device->set_machine(machine()); - - // now start the device - mame_printf_verbose("Starting %s '%s'\n", device->name(), device->tag()); - device->start(); - } - - // handle missing dependencies by moving the device to the end - catch (device_missing_dependencies &) - { - // if we're the end, fail - mame_printf_verbose(" (missing dependencies; rescheduling)\n"); - if (nextdevice == NULL) - throw emu_fatalerror("Circular dependency in device startup; unable to start %s '%s'\n", device->name(), device->tag()); - detach(*device); - append(device->tag(), *device); - } - } - } -} - - -//------------------------------------------------- -// reset_all - reset all devices in the list -//------------------------------------------------- - -void device_list::reset_all() -{ - // iterate over devices and reset them - for (device_t *device = first(); device != NULL; device = device->next()) - device->reset(); -} - - -//------------------------------------------------- -// stop_all - stop all the devices in the -// list -//------------------------------------------------- - -void device_list::stop_all() -{ - // iterate over devices and stop them - for (device_t *device = first(); device != NULL; device = device->next()) - device->stop(); - - // leave with no machine - m_machine = NULL; -} - - -//------------------------------------------------- -// first - return the first device of the given -// type -//------------------------------------------------- - -device_t *device_list::first(device_type type) const -{ - device_t *cur; - for (cur = super::first(); cur != NULL && cur->type() != type; cur = cur->next()) ; - return cur; -} - - -//------------------------------------------------- -// count - count the number of devices of the -// given type -//------------------------------------------------- - -int device_list::count(device_type type) const -{ - int num = 0; - for (const device_t *curdev = first(type); curdev != NULL; curdev = curdev->typenext()) num++; - return num; -} - - -//------------------------------------------------- -// indexof - return the index of the given device -// among its kind -//------------------------------------------------- - -int device_list::indexof(device_type type, device_t &object) const -{ - int num = 0; - for (device_t *cur = first(type); cur != NULL; cur = cur->typenext(), num++) - if (cur == &object) return num; - return -1; -} - - -//------------------------------------------------- -// indexof - return the index of the given device -// among its kind -//------------------------------------------------- - -int device_list::indexof(device_type type, const char *tag) const -{ - device_t *object = find(tag); - return (object != NULL && object->type() == type) ? indexof(type, *object) : -1; -} - - -//------------------------------------------------- -// find - find a device by type + index -//------------------------------------------------- - -device_t *device_list::find(device_type type, int index) const -{ - for (device_t *cur = first(type); cur != NULL; cur = cur->typenext()) - if (index-- == 0) return cur; - return NULL; -} - - -//------------------------------------------------- -// static_exit - tear down all the devices -//------------------------------------------------- - -void device_list::exit() -{ - // first let the debugger save comments - if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) - debug_comment_save(machine()); - - // stop all the devices before we go away - stop_all(); - - // then nuke the devices - reset(); -} - - -//------------------------------------------------- -// presave_all - tell all the devices we are -// about to save -//------------------------------------------------- - -void device_list::presave_all() -{ - for (device_t *device = first(); device != NULL; device = device->next()) - device->pre_save(); -} - - -//------------------------------------------------- -// postload_all - tell all the devices we just -// completed a load -//------------------------------------------------- - -void device_list::postload_all() -{ - for (device_t *device = first(); device != NULL; device = device->next()) - device->post_load(); -} - - - -//************************************************************************** // LIVE DEVICE MANAGEMENT //************************************************************************** @@ -325,63 +97,75 @@ //------------------------------------------------- device_t::device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) - : m_debug(NULL), + : m_type(type), + m_name(name), + m_owner(owner), + m_next(NULL), + m_interface_list(NULL), m_execute(NULL), m_memory(NULL), m_state(NULL), - m_next(NULL), - m_owner(owner), - m_interface_list(NULL), - m_type(type), m_configured_clock(clock), - m_machine_config(mconfig), - m_static_config(NULL), - m_input_defaults(NULL), - m_name(name), - m_started(false), - m_clock(clock), - m_region(NULL), m_unscaled_clock(clock), + m_clock(clock), m_clock_scale(1.0), m_attoseconds_per_clock((clock == 0) ? 0 : HZ_TO_ATTOSECONDS(clock)), + + m_debug(NULL), + m_region(NULL), + m_machine_config(mconfig), + m_static_config(NULL), + m_input_defaults(NULL), m_auto_finder_list(NULL), m_machine(NULL), m_save(NULL), - m_tag(tag), - m_config_complete(false) + m_basetag(tag), + m_config_complete(false), + m_started(false) { + if (owner != NULL) + m_tag.cpy((owner->owner() == NULL) ? "" : owner->tag()).cat(":").cat(tag); + else + m_tag.cpy(":"); + mame_printf_verbose("device '%s' created\n", this->tag()); static_set_clock(*this, clock); } device_t::device_t(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock) - : m_debug(NULL), + : m_type(type), + m_name(name), + m_shortname(shortname), + m_searchpath(shortname), + m_owner(owner), + m_next(NULL), + m_interface_list(NULL), m_execute(NULL), m_memory(NULL), m_state(NULL), - m_next(NULL), - m_owner(owner), - m_interface_list(NULL), - m_type(type), m_configured_clock(clock), - m_machine_config(mconfig), - m_static_config(NULL), - m_input_defaults(NULL), - m_name(name), - m_shortname(shortname), - m_searchpath(shortname), - m_started(false), - m_clock(clock), - m_region(NULL), m_unscaled_clock(clock), + m_clock(clock), m_clock_scale(1.0), m_attoseconds_per_clock((clock == 0) ? 0 : HZ_TO_ATTOSECONDS(clock)), + + m_debug(NULL), + m_region(NULL), + m_machine_config(mconfig), + m_static_config(NULL), + m_input_defaults(NULL), m_auto_finder_list(NULL), m_machine(NULL), m_save(NULL), - m_tag(tag), - m_config_complete(false) + m_basetag(tag), + m_config_complete(false), + m_started(false) { + if (owner != NULL) + m_tag.cpy((owner->owner() == NULL) ? "" : owner->tag()).cat(":").cat(tag); + else + m_tag.cpy(":"); + mame_printf_verbose("device '%s' created\n", this->tag()); static_set_clock(*this, clock); } @@ -406,43 +190,9 @@ if (this == NULL) return NULL; - // build a fully-qualified name - astring tempstring; - return machine().region(subtag(tempstring, _tag)); -} - - -//------------------------------------------------- -// subdevice - return a pointer to the given -// device that is owned by us -//------------------------------------------------- - -device_t *device_t::subdevice(const char *_tag) const -{ - // safety first - if (this == NULL) - return NULL; - - // build a fully-qualified name - astring tempstring; - return mconfig().devicelist().find((const char *)subtag(tempstring, _tag)); -} - - -//------------------------------------------------- -// siblingdevice - return a pointer to the given -// device that is owned by our same owner -//------------------------------------------------- - -device_t *device_t::siblingdevice(const char *_tag) const -{ - // safety first - if (this == NULL) - return NULL; - - // build a fully-qualified name - astring tempstring; - return mconfig().devicelist().find((const char *)siblingtag(tempstring, _tag)); + // build a fully-qualified name and look it up + astring fullpath; + return machine().region(subtag(fullpath, _tag)); } @@ -489,20 +239,14 @@ // configuration has been constructed //------------------------------------------------- -bool device_t::validity_check(emu_options &options, const game_driver &driver) const +void device_t::validity_check(validity_checker &valid) const { - bool error = false; - // validate via the interfaces for (device_interface *intf = m_interface_list; intf != NULL; intf = intf->interface_next()) - if (intf->interface_validity_check(options, driver)) - error = true; + intf->interface_validity_check(valid); // let the device itself validate - if (device_validity_check(options, driver)) - error = true; - - return error; + device_validity_check(valid); } @@ -519,6 +263,13 @@ // reset the device device_reset(); + // reset all child devices + for (device_t *child = m_subdevice_list.first(); child != NULL; child = child->next()) + child->reset(); + + // now allow for some post-child reset action + device_reset_after_children(); + // let the interfaces do their post-work for (device_interface *intf = m_interface_list; intf != NULL; intf = intf->interface_next()) intf->interface_post_reset(); @@ -780,10 +531,9 @@ // the configuration has been constructed //------------------------------------------------- -bool device_t::device_validity_check(emu_options &options, const game_driver &driver) const +void device_t::device_validity_check(validity_checker &valid) const { - // indicate no error by default - return false; + // do nothing by default } @@ -812,7 +562,6 @@ } - //------------------------------------------------- // input_ports - return a pointer to the implicit // input ports description for this device @@ -838,6 +587,19 @@ //------------------------------------------------- +// device_reset_after_children - hook to do +// reset logic that must happen after the children +// are reset; designed to be overriden by the +// actual device implementation +//------------------------------------------------- + +void device_t::device_reset_after_children() +{ + // do nothing by default +} + + +//------------------------------------------------- // device_stop - clean up anything that needs to // happen before the running_machine goes away //------------------------------------------------- @@ -908,6 +670,157 @@ //------------------------------------------------- +// subdevice_slow - perform a slow name lookup, +// caching the results +//------------------------------------------------- + +device_t *device_t::subdevice_slow(const char *tag) const +{ + // resolve the full path + astring fulltag; + subtag(fulltag, tag); + + // we presume the result is a rooted path; also doubled colons mess up our + // tree walk, so catch them early + assert(fulltag[0] == ':'); + assert(fulltag.find("::") == -1); + + // walk the device list to the final path + device_t *curdevice = &mconfig().root_device(); + if (fulltag.len() > 1) + for (int start = 1, end = fulltag.chr(start, ':'); start != 0 && curdevice != NULL; start = end + 1, end = fulltag.chr(start, ':')) + { + astring part(fulltag, start, (end == -1) ? -1 : end - start); + for (curdevice = curdevice->m_subdevice_list.first(); curdevice != NULL; curdevice = curdevice->next()) + if (part == curdevice->m_basetag) + break; + } + + // if we got a match, add to the fast map + if (curdevice != NULL) + { + m_device_map.add(tag, curdevice); + mame_printf_verbose("device '%s' adding mapping for '%s' => '%s'\n", this->tag(), tag, fulltag.cstr()); + } + return curdevice; +} + + +//------------------------------------------------- +// subtag - create a fully resolved path relative +// to our device based on the provided tag +//------------------------------------------------- + +astring &device_t::subtag(astring &result, const char *tag) const +{ + // if the tag begins with a colon, ignore our path and start from the root + if (*tag == ':') + { + tag++; + result.cpy(":"); + } + + // otherwise, start with our path + else + { + result.cpy(m_tag); + if (result != ":") + result.cat(":"); + } + + // iterate over the tag, look for special path characters to resolve + const char *caret; + while ((caret = strchr(tag, '^')) != NULL) + { + // copy everything up to there + result.cat(tag, caret - tag); + tag = caret + 1; + + // strip trailing colons + int len = result.len(); + while (result[--len] == ':') + result.substr(0, len); + + // remove the last path part, leaving the last colon + if (result != ":") + { + int lastcolon = result.rchr(0, ':'); + if (lastcolon != -1) + result.substr(0, lastcolon + 1); + } + } + + // copy everything else + result.cat(tag); + + // strip trailing colons up to the root + int len = result.len(); + while (len > 1 && result[--len] == ':') + result.substr(0, len); + return result; +} + + +//------------------------------------------------- +// add_subdevice - create a new device and add it +// as a subdevice +//------------------------------------------------- + +device_t *device_t::add_subdevice(device_type type, const char *tag, UINT32 clock) +{ + // allocate the device and append to our list + device_t *device = (*type)(mconfig(), tag, this, clock); + m_subdevice_list.append(*device); + + // apply any machine configuration owned by the device now + machine_config_constructor additions = device->machine_config_additions(); + if (additions != NULL) + (*additions)(const_cast(mconfig()), device); + return device; +} + + +//------------------------------------------------- +// add_subdevice - create a new device and use it +// to replace an existing subdevice +//------------------------------------------------- + +device_t *device_t::replace_subdevice(device_t &old, device_type type, const char *tag, UINT32 clock) +{ + // iterate over all devices and remove any references to the old device + device_iterator iter(mconfig().root_device()); + for (device_t *scan = iter.first(); scan != NULL; scan = iter.next()) + scan->m_device_map.remove(&old); + + // create a new device, and substitute it for the old one + device_t *device = (*type)(mconfig(), tag, this, clock); + m_subdevice_list.replace_and_remove(*device, old); + + // apply any machine configuration owned by the device now + machine_config_constructor additions = device->machine_config_additions(); + if (additions != NULL) + (*additions)(const_cast(mconfig()), device); + return device; +} + + +//------------------------------------------------- +// remove_subdevice - remove a given subdevice +//------------------------------------------------- + +void device_t::remove_subdevice(device_t &device) +{ + // iterate over all devices and remove any references + device_iterator iter(mconfig().root_device()); + for (device_t *scan = iter.first(); scan != NULL; scan = iter.next()) + scan->m_device_map.remove(&device); + + // remove from our list + m_subdevice_list.remove(device); +} + + +//------------------------------------------------- // register_auto_finder - add a new item to the // list of stuff to find after we go live //------------------------------------------------- @@ -1022,9 +935,8 @@ // constructed //------------------------------------------------- -bool device_interface::interface_validity_check(emu_options &options, const game_driver &driver) const +void device_interface::interface_validity_check(validity_checker &valid) const { - return false; } diff -Nru mame-0.144/src/emu/device.h mame-0.145/src/emu/device.h --- mame-0.144/src/emu/device.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/device.h 2012-02-06 21:30:28.000000000 +0000 @@ -78,6 +78,7 @@ device_t::static_set_input_default(*device, DEVICE_INPUT_DEFAULTS_NAME(_config)); \ + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -90,12 +91,14 @@ class device_execute_interface; class device_memory_interface; class device_state_interface; +class validity_checker; struct rom_entry; class machine_config; class emu_timer; typedef struct _input_device_default input_device_default; + // exception classes class device_missing_dependencies : public emu_exception { }; @@ -122,56 +125,6 @@ -// ======================> tagged_device_list - -// tagged_device_list is a tagged_list with additional searching based on type -class device_list : public tagged_list -{ - typedef tagged_list super; - -public: - // construction/destruction - device_list(resource_pool &pool = global_resource_pool); - - // getters - running_machine &machine() const { assert(m_machine != NULL); return *m_machine; } - - // bulk operations - void set_machine_all(running_machine &machine); - void start_all(); - void start_new_devices(); - void reset_all(); - void stop_all(); - - // pull the generic forms forward - using super::first; - using super::count; - using super::indexof; - using super::find; - - // provide type-specific overrides - device_t *first(device_type type) const; - int count(device_type type) const; - int indexof(device_type type, device_t &object) const; - int indexof(device_type type, const char *tag) const; - device_t *find(device_type type, int index) const; - - // provide interface-specific overrides - template - bool first(_InterfaceClass *&intf) const; - -private: - // internal helpers - void exit(); - void presave_all(); - void postload_all(); - - // internal state - running_machine *m_machine; -}; - - - // ======================> device_t // device_t represents a device @@ -185,6 +138,8 @@ friend class device_execute_interface; friend class simple_list; friend class device_list; + friend class machine_config; + friend class running_machine; protected: // construction/destruction @@ -195,12 +150,15 @@ public: // getters running_machine &machine() const { assert(m_machine != NULL); return *m_machine; } + const char *tag() const { return m_tag; } + const char *basetag() const { return m_basetag; } device_type type() const { return m_type; } - UINT32 configured_clock() const { return m_configured_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; } + device_t *owner() const { return m_owner; } + device_t *next() const { return m_next; } + UINT32 configured_clock() const { return m_configured_clock; } const void *static_config() const { return m_static_config; } const machine_config &mconfig() const { return m_machine_config; } const input_device_default *input_ports_defaults() const { return m_input_defaults; } @@ -208,21 +166,9 @@ machine_config_constructor machine_config_additions() const { return device_mconfig_additions(); } ioport_constructor input_ports() const { return device_input_ports(); } - // iteration helpers - device_t *next() const { return m_next; } - device_t *typenext() const; - device_t *owner() const { return m_owner; } - // interface helpers template bool interface(_DeviceClass *&intf) { intf = dynamic_cast<_DeviceClass *>(this); return (intf != NULL); } template bool interface(_DeviceClass *&intf) const { intf = dynamic_cast(this); return (intf != NULL); } - template bool next(_DeviceClass *&intf) const - { - for (device_t *cur = m_next; cur != NULL; cur = cur->m_next) - if (cur->interface(intf)) - return true; - return false; - } // specialized helpers for common core interfaces bool interface(device_execute_interface *&intf) { intf = m_execute; return (intf != NULL); } @@ -235,13 +181,14 @@ device_memory_interface &memory() const { assert(m_memory != NULL); return *m_memory; } // owned object helpers + device_t *first_subdevice() const { return m_subdevice_list.first(); } astring &subtag(astring &dest, const char *tag) const; - astring &siblingtag(astring &dest, const char *tag) const; + astring &siblingtag(astring &dest, const char *tag) const { return (this != NULL && m_owner != NULL) ? m_owner->subtag(dest, tag) : dest.cpy(tag); } const memory_region *subregion(const char *tag) const; device_t *subdevice(const char *tag) const; device_t *siblingdevice(const char *tag) const; - template inline _DeviceClass *subdevice(const char *tag) { return downcast<_DeviceClass *>(subdevice(tag)); } - template inline _DeviceClass *siblingdevice(const char *tag) { return downcast<_DeviceClass *>(siblingdevice(tag)); } + template inline _DeviceClass *subdevice(const char *tag) const { return downcast<_DeviceClass *>(subdevice(tag)); } + template inline _DeviceClass *siblingdevice(const char *tag) const { return downcast<_DeviceClass *>(siblingdevice(tag)); } const memory_region *region() const { return m_region; } // configuration helpers @@ -252,7 +199,7 @@ // state helpers void config_complete(); bool configured() const { return m_config_complete; } - bool validity_check(emu_options &options, const game_driver &driver) const; + void validity_check(validity_checker &valid) const; bool started() const { return m_started; } void reset(); @@ -297,10 +244,11 @@ virtual machine_config_constructor device_mconfig_additions() const; virtual ioport_constructor device_input_ports() const; virtual void device_config_complete(); - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const ATTR_COLD; + virtual void device_validity_check(validity_checker &valid) const ATTR_COLD; virtual void device_start() ATTR_COLD = 0; virtual void device_stop() ATTR_COLD; virtual void device_reset() ATTR_COLD; + virtual void device_reset_after_children() ATTR_COLD; virtual void device_pre_save() ATTR_COLD; virtual void device_post_load() ATTR_COLD; virtual void device_clock_changed(); @@ -309,37 +257,37 @@ //------------------- end derived class overrides - device_debug * m_debug; - - // core device interfaces for speed - device_execute_interface *m_execute; - device_memory_interface *m_memory; - device_state_interface *m_state; + // core device properties + const device_type m_type; // device type + astring m_name; // name of the device + astring m_shortname; // short name of the device + astring m_searchpath; // search path, used for media loading // device relationships - device_t * m_next; // next device (of any type/class) - device_t * m_owner; // device that owns us, or NULL if nobody + device_t * m_owner; // device that owns us + device_t * m_next; // next device by the same owner (of any type/class) + simple_list m_subdevice_list; // list of sub-devices we own + mutable tagmap_t m_device_map; // map of device names looked up and found + + // device interfaces device_interface * m_interface_list; // head of interface list + device_execute_interface *m_execute; // pre-cached pointer to execute interface + device_memory_interface *m_memory; // pre-cached pointer to memory interface + device_state_interface *m_state; // pre-cached pointer to state interface - const device_type m_type; // device type + // device clocks UINT32 m_configured_clock; // originally configured device clock + UINT32 m_unscaled_clock; // current unscaled device clock + UINT32 m_clock; // current device clock, after scaling + double m_clock_scale; // clock scale factor + attoseconds_t m_attoseconds_per_clock;// period in attoseconds + device_debug * m_debug; + const memory_region * m_region; // our device-local region const machine_config & m_machine_config; // reference to the machine's configuration const void * m_static_config; // static device configuration 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 - astring m_searchpath; // search path, used for media loading - - bool m_started; // true if the start function has succeeded - UINT32 m_clock; // device clock - const memory_region * m_region; // our device-local region - - UINT32 m_unscaled_clock; // unscaled clock - double m_clock_scale; // clock scale factor - attoseconds_t m_attoseconds_per_clock;// period in attoseconds - // helper class to request auto-object discovery in the constructor of a derived class class auto_finder_base { @@ -449,11 +397,19 @@ auto_finder_base * m_auto_finder_list; private: + // private helpers + device_t *add_subdevice(device_type type, const char *tag, UINT32 clock); + device_t *replace_subdevice(device_t &old, device_type type, const char *tag, UINT32 clock); + void remove_subdevice(device_t &device); + device_t *subdevice_slow(const char *tag) const; + // private state; accessor use required running_machine * m_machine; save_manager * m_save; - astring m_tag; // tag for this instance + astring m_tag; // full tag for this instance + astring m_basetag; // base part of the tag bool m_config_complete; // have we completed our configuration? + bool m_started; // true if the start function has succeeded }; @@ -483,7 +439,7 @@ // optional operation overrides virtual void interface_config_complete(); - virtual bool interface_validity_check(emu_options &options, const game_driver &driver) const; + virtual void interface_validity_check(validity_checker &valid) const; virtual void interface_pre_start(); virtual void interface_post_start(); virtual void interface_pre_reset(); @@ -502,43 +458,331 @@ }; +// ======================> device_iterator + +// helper class to iterate over the hierarchy of devices depth-first +class device_iterator +{ +public: + // construction + device_iterator(device_t &root, int maxdepth = 255) + : m_root(&root), + m_current(NULL), + m_curdepth(0), + m_maxdepth(maxdepth) { } + + // getters + device_t *current() const { return m_current; } + + // reset and return first item + device_t *first() + { + m_current = m_root; + return m_current; + } + + // advance depth-first + device_t *next() + { + // remember our starting position, and end immediately if we're NULL + device_t *start = m_current; + if (start == NULL) + return NULL; + + // search down first + if (m_curdepth < m_maxdepth) + { + m_current = start->first_subdevice(); + if (m_current != NULL) + { + m_curdepth++; + return m_current; + } + } + + // search next for neighbors up the ownership chain + while (m_curdepth > 0) + { + // found a neighbor? great! + m_current = start->next(); + if (m_current != NULL) + return m_current; + + // no? try our parent + start = start->owner(); + m_curdepth--; + } + + // returned to the top; we're done + return m_current = NULL; + } + + // return the number of items available + int count() + { + int result = 0; + for (device_t *item = first(); item != NULL; item = next()) + result++; + return result; + } + + // return the index of a given item in the virtual list + int indexof(device_t &device) + { + int index = 0; + for (device_t *item = first(); item != NULL; item = next(), index++) + if (item == &device) + return index; + return -1; + } + + // return the indexed item in the list + device_t *byindex(int index) + { + for (device_t *item = first(); item != NULL; item = next(), index--) + if (index == 0) + return item; + return NULL; + } + +private: + // internal state + device_t * m_root; + device_t * m_current; + int m_curdepth; + int m_maxdepth; +}; + + +// ======================> device_type_iterator + +// helper class to find devices of a given type in the device hierarchy +template +class device_type_iterator +{ +public: + // construction + device_type_iterator(device_t &root, int maxdepth = 255) + : m_iterator(root, maxdepth) { } + + // getters + _DeviceClass *current() const { return downcast<_DeviceClass *>(m_iterator.current()); } + + // reset and return first item + _DeviceClass *first() + { + for (device_t *device = m_iterator.first(); device != NULL; device = m_iterator.next()) + if (device->type() == _DeviceType) + return downcast<_DeviceClass *>(device); + return NULL; + } + + // advance depth-first + _DeviceClass *next() + { + for (device_t *device = m_iterator.next(); device != NULL; device = m_iterator.next()) + if (device->type() == _DeviceType) + return downcast<_DeviceClass *>(device); + return NULL; + } + + // return the number of items available + int count() + { + int result = 0; + for (_DeviceClass *item = first(); item != NULL; item = next()) + result++; + return result; + } + + // return the index of a given item in the virtual list + int indexof(_DeviceClass &device) + { + int index = 0; + for (_DeviceClass *item = first(); item != NULL; item = next(), index++) + if (item == &device) + return index; + return -1; + } + + // return the indexed item in the list + _DeviceClass *byindex(int index) + { + for (_DeviceClass *item = first(); item != NULL; item = next(), index--) + if (index == 0) + return item; + return NULL; + } + +private: + // internal state + device_iterator m_iterator; +}; + + +// ======================> device_interface_iterator + +// helper class to find devices with a given interface in the device hierarchy +// also works for findnig devices derived from a given subclass +template +class device_interface_iterator +{ +public: + // construction + device_interface_iterator(device_t &root, int maxdepth = 255) + : m_iterator(root, maxdepth), + m_current(NULL) { } + + // getters + _InterfaceClass *current() const { return m_current; } + + // reset and return first item + _InterfaceClass *first() + { + for (device_t *device = m_iterator.first(); device != NULL; device = m_iterator.next()) + if (device->interface(m_current)) + return m_current; + return NULL; + } + + // advance depth-first + _InterfaceClass *next() + { + for (device_t *device = m_iterator.next(); device != NULL; device = m_iterator.next()) + if (device->interface(m_current)) + return m_current; + return NULL; + } + + // return the number of items available + int count() + { + int result = 0; + for (_InterfaceClass *item = first(); item != NULL; item = next()) + result++; + return result; + } + + // return the index of a given item in the virtual list + int indexof(_InterfaceClass &intrf) + { + int index = 0; + for (_InterfaceClass *item = first(); item != NULL; item = next(), index++) + if (item == &intrf) + return index; + return -1; + } + + // return the indexed item in the list + _InterfaceClass *byindex(int index) + { + for (_InterfaceClass *item = first(); item != NULL; item = next(), index--) + if (index == 0) + return item; + return NULL; + } + +private: + // internal state + device_iterator m_iterator; + _InterfaceClass * m_current; +}; + + +// ======================> device_delegate + +// device_delegate is a delegate that wraps with a device tag and can be easily +// late bound without replicating logic everywhere +template +class device_delegate : public delegate<_Signature> +{ + typedef delegate<_Signature> basetype; + +public: + // provide same set of constructors as the base class, with additional device name + // parameter + device_delegate() : basetype(), m_device_name(NULL) { } + device_delegate(const basetype &src) : basetype(src), m_device_name(src.m_device_name) { } + device_delegate(const basetype &src, delegate_late_bind &object) : basetype(src, object), m_device_name(src.m_device_name) { } + template device_delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, const char *devname) : basetype(funcptr, name, (_FunctionClass *)0), m_device_name(devname) { } + template device_delegate(typename basetype::template traits<_FunctionClass>::member_func_type funcptr, const char *name, const char *devname, _FunctionClass *object) : basetype(funcptr, name, (_FunctionClass *)0), m_device_name(devname) { } + device_delegate(typename basetype::template traits::static_func_type funcptr, const char *name) : basetype(funcptr, name, (device_t *)0), m_device_name(NULL) { } + device_delegate(typename basetype::template traits::static_ref_func_type funcptr, const char *name) : basetype(funcptr, name, (device_t *)0), m_device_name(NULL) { } + device_delegate &operator=(const basetype &src) { *static_cast(this) = src; m_device_name = src.m_device_name; return *this; } + + // perform the binding + void bind_relative_to(device_t &search_root); + +private: + // internal state + const char *m_device_name; +}; + + //************************************************************************** // INLINE FUNCTIONS //************************************************************************** +//------------------------------------------------- +// subdevice - given a tag, find the device by +// name relative to this device +//------------------------------------------------- -// ======================> device config helpers - -// find the next device_t of the same type -inline device_t *device_t::typenext() const +inline device_t *device_t::subdevice(const char *tag) const { - device_t *cur; - for (cur = m_next; cur != NULL && cur->m_type != m_type; cur = cur->m_next) ; - return cur; + // safety first + if (this == NULL) + return NULL; + + // empty string or NULL means this device + if (tag == NULL || *tag == 0) + return const_cast(this); + + // do a quick lookup and return that if possible + device_t *quick = m_device_map.find(tag); + return (quick != NULL) ? quick : subdevice_slow(tag); } -// create a tag for an object that is owned by this device -inline astring &device_t::subtag(astring &dest, const char *_tag) const -{ - // temp. for now: don't include the root tag in the full tag name - return (this != NULL && m_owner != NULL) ? dest.cpy(m_tag).cat(":").cat(_tag) : dest.cpy(_tag); -} -// create a tag for an object that a sibling to this device -inline astring &device_t::siblingtag(astring &dest, const char *_tag) const +//------------------------------------------------- +// siblingdevice - given a tag, find the device +// by name relative to this device's parent +//------------------------------------------------- + +inline device_t *device_t::siblingdevice(const char *tag) const { - return (this != NULL && m_owner != NULL) ? m_owner->subtag(dest, _tag) : dest.cpy(_tag); + // safety first + if (this == NULL) + return NULL; + + // empty string or NULL means this device + if (tag == NULL || *tag == 0) + return const_cast(this); + + // leading caret implies the owner, just skip it + if (tag[0] == '^') tag++; + + // query relative to the parent + return (m_owner != NULL) ? m_owner->subdevice(tag) : NULL; } -template -bool device_list::first(_InterfaceClass *&intf) const +//------------------------------------------------- +// bind_relative_to - perform a late binding of +// a device_delegate +//------------------------------------------------- + +template +void device_delegate<_Signature>::bind_relative_to(device_t &search_root) { - for (device_t *cur = super::first(); cur != NULL; cur = cur->next()) - if (cur->interface(intf)) - return true; - return false; + if (!basetype::isnull()) + { + device_t *device = search_root.subdevice(m_device_name); + if (device == NULL) + throw emu_fatalerror("Unable to locate device '%s' relative to '%s'\n", m_device_name, search_root.tag()); + basetype::late_bind(*device); + } } #endif /* __DEVINTRF_H__ */ diff -Nru mame-0.144/src/emu/devimage.c mame-0.145/src/emu/devimage.c --- mame-0.144/src/emu/devimage.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/devimage.c 2012-02-06 21:30:28.000000000 +0000 @@ -174,8 +174,3 @@ { return reinterpret_cast(get_legacy_fct(DEVINFO_FCT_IMAGE_PARTIAL_HASH)); } - -void *legacy_image_device_base::get_device_specific_call() -{ - return (void*) get_legacy_fct(DEVINFO_FCT_DEVICE_SPECIFIC); -} diff -Nru mame-0.144/src/emu/devlegcy.c mame-0.145/src/emu/devlegcy.c --- mame-0.144/src/emu/devlegcy.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/devlegcy.c 2012-02-06 21:30:28.000000000 +0000 @@ -200,12 +200,11 @@ // checks on a device configuration //------------------------------------------------- -bool legacy_device_base::device_validity_check(emu_options &options, const game_driver &driver) const +void legacy_device_base::device_validity_check(validity_checker &valid) const { device_validity_check_func validity_func = reinterpret_cast(get_legacy_fct(DEVINFO_FCT_VALIDITY_CHECK)); if (validity_func != NULL) - return (*validity_func)(&driver, this, options); - return false; + (*validity_func)(&mconfig().gamedrv(), this, mconfig().options()); } @@ -239,7 +238,7 @@ void legacy_device_base::device_stop() { - if (m_started) + if (started()) { device_stop_func stop_func = reinterpret_cast(get_legacy_fct(DEVINFO_FCT_STOP)); if (stop_func != NULL) @@ -272,88 +271,3 @@ // should never get here fatalerror("legacy_sound_device_base::sound_stream_update called; not applicable to legacy sound devices\n"); } - - - -//************************************************************************** -// LEGACY MEMORY DEVICE -//************************************************************************** - -//------------------------------------------------- -// legacy_memory_device_base - constructor -//------------------------------------------------- - -legacy_memory_device_base::legacy_memory_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config) - : legacy_device_base(mconfig, type, tag, owner, clock, get_config), - device_memory_interface(mconfig, *this) -{ - memset(&m_space_config, 0, sizeof(m_space_config)); -} - - -//------------------------------------------------- -// device_config_complete - update configuration -// based on completed device setup -//------------------------------------------------- - -void legacy_memory_device_base::device_config_complete() -{ - m_space_config.m_name = "memory"; - m_space_config.m_endianness = static_cast(get_legacy_int(DEVINFO_INT_ENDIANNESS)); - m_space_config.m_databus_width = get_legacy_int(DEVINFO_INT_DATABUS_WIDTH); - m_space_config.m_addrbus_width = get_legacy_int(DEVINFO_INT_ADDRBUS_WIDTH); - m_space_config.m_addrbus_shift = get_legacy_int(DEVINFO_INT_ADDRBUS_SHIFT); - m_space_config.m_logaddr_width = m_space_config.m_addrbus_width; - m_space_config.m_page_shift = 0; - m_space_config.m_internal_map = reinterpret_cast(get_legacy_fct(DEVINFO_PTR_INTERNAL_MEMORY_MAP)); - m_space_config.m_default_map = reinterpret_cast(get_legacy_fct(DEVINFO_PTR_DEFAULT_MEMORY_MAP)); -} - - - -//************************************************************************** -// LEGACY NVRAM DEVICE -//************************************************************************** - -//------------------------------------------------- -// legacy_nvram_device_base - constructor -//------------------------------------------------- - -legacy_nvram_device_base::legacy_nvram_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config) - : legacy_device_base(mconfig, type, tag, owner, clock, get_config), - device_nvram_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// nvram_default - generate the default NVRAM -//------------------------------------------------- - -void legacy_nvram_device_base::nvram_default() -{ - device_nvram_func nvram_func = reinterpret_cast(get_legacy_fct(DEVINFO_FCT_NVRAM)); - (*nvram_func)(this, NULL, FALSE); -} - - -//------------------------------------------------- -// nvram_read - read NVRAM from the given file -//------------------------------------------------- - -void legacy_nvram_device_base::nvram_read(emu_file &file) -{ - device_nvram_func nvram_func = reinterpret_cast(get_legacy_fct(DEVINFO_FCT_NVRAM)); - (*nvram_func)(this, &file, FALSE); -} - - -//------------------------------------------------- -// nvram_write - write NVRAM to the given file -//------------------------------------------------- - -void legacy_nvram_device_base::nvram_write(emu_file &file) -{ - device_nvram_func nvram_func = reinterpret_cast(get_legacy_fct(DEVINFO_FCT_NVRAM)); - (*nvram_func)(this, &file, TRUE); -} diff -Nru mame-0.144/src/emu/devlegcy.h mame-0.145/src/emu/devlegcy.h --- mame-0.144/src/emu/devlegcy.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/devlegcy.h 2012-02-06 21:30:28.000000000 +0000 @@ -215,14 +215,10 @@ // reduced macros that are easier to use, and map to the above two macros #define DECLARE_LEGACY_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_device_base) #define DECLARE_LEGACY_SOUND_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_sound_device_base) -#define DECLARE_LEGACY_MEMORY_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_memory_device_base) -#define DECLARE_LEGACY_NVRAM_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_nvram_device_base) #define DECLARE_LEGACY_IMAGE_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_image_device_base) #define DEFINE_LEGACY_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_device_base) #define DEFINE_LEGACY_SOUND_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_sound_device_base) -#define DEFINE_LEGACY_MEMORY_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_memory_device_base) -#define DEFINE_LEGACY_NVRAM_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_nvram_device_base) #define DEFINE_LEGACY_IMAGE_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_image_device_base) @@ -251,11 +247,6 @@ #define DEVICE_EXECUTE(name) INT32 DEVICE_EXECUTE_NAME(name)(device_t *device, INT32 clocks) #define DEVICE_EXECUTE_CALL(name) DEVICE_EXECUTE_NAME(name)(device, clocks) -#define DEVICE_NVRAM_NAME(name) device_nvram_##name -#define DEVICE_NVRAM(name) void DEVICE_NVRAM_NAME(name)(device_t *device, emu_file *file, int read_or_write) -#define DEVICE_NVRAM_CALL(name) DEVICE_NVRAM_NAME(name)(device, file, read_or_write) - - //************************************************************************** // DEVICE_CONFIGURATION_MACROS @@ -429,7 +420,7 @@ virtual const rom_entry *device_rom_region() const { return reinterpret_cast(get_legacy_ptr(DEVINFO_PTR_ROM_REGION)); } virtual machine_config_constructor device_mconfig_additions() const { return reinterpret_cast(get_legacy_ptr(DEVINFO_PTR_MACHINE_CONFIG)); } virtual ioport_constructor device_input_ports() const { return reinterpret_cast(get_legacy_ptr(DEVINFO_PTR_INPUT_PORTS)); } - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); virtual void device_stop(); @@ -466,46 +457,6 @@ -// ======================> legacy_memory_device_base - -// legacy_memory_device is a legacy_device_base with a memory interface -class legacy_memory_device_base : public legacy_device_base, - public device_memory_interface -{ -protected: - // construction/destruction - legacy_memory_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config); - - // device overrides - virtual void device_config_complete(); - - // device_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == 0) ? &m_space_config : NULL; } - - // internal state - address_space_config m_space_config; -}; - - - -// ======================> legacy_nvram_device - -// legacy_nvram_device is a legacy_device_base with a nvram interface -class legacy_nvram_device_base : public legacy_device_base, - public device_nvram_interface -{ -protected: - // construction/destruction - legacy_nvram_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config); - - // device_nvram_interface overrides - virtual void nvram_default(); - virtual void nvram_read(emu_file &file); - virtual void nvram_write(emu_file &file); -}; - - - // ======================> legacy_image_device // legacy_image_device is a legacy_device_base with a image interface @@ -521,7 +472,6 @@ virtual void call_display_info(); virtual device_image_partialhash_func get_partial_hash() const; virtual void call_get_devices(); - virtual void *get_device_specific_call(); virtual iodevice_t image_type() const { return static_cast(get_legacy_int(DEVINFO_INT_IMAGE_TYPE)); } diff -Nru mame-0.144/src/emu/devtempl.h mame-0.145/src/emu/devtempl.h --- mame-0.144/src/emu/devtempl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/devtempl.h 2012-02-06 21:30:28.000000000 +0000 @@ -54,7 +54,6 @@ #define DT_HAS_RESET 0x0002 #define DT_HAS_STOP 0x0004 #define DT_HAS_EXECUTE 0x0008 -#define DT_HAS_NVRAM 0x0010 #define DT_HAS_CUSTOM_CONFIG 0x0040 #define DT_HAS_ROM_REGION 0x0080 #define DT_HAS_MACHINE_CONFIG 0x0100 @@ -123,9 +122,6 @@ #if ((DEVTEMPLATE_FEATURES) & DT_HAS_EXECUTE) static DEVICE_EXECUTE( DEVTEMPLATE_ID(,) ); #endif -#if ((DEVTEMPLATE_FEATURES) & DT_HAS_NVRAM) -static DEVICE_NVRAM( DEVTEMPLATE_ID(,) ); -#endif #if ((DEVTEMPLATE_FEATURES) & DT_HAS_CUSTOM_CONFIG) static DEVICE_CUSTOM_CONFIG( DEVTEMPLATE_ID(,) ); #endif @@ -211,10 +207,6 @@ #if ((DEVTEMPLATE_FEATURES) & DT_HAS_EXECUTE) case DEVINFO_FCT_EXECUTE: info->execute = DEVTEMPLATE_ID1(DEVICE_EXECUTE_NAME()); break; #endif -#if ((DEVTEMPLATE_FEATURES) & DT_HAS_NVRAM) - case DEVINFO_FCT_NVRAM: info->nvram = DEVTEMPLATE_ID1(DEVICE_NVRAM_NAME()); break; -#endif - /* --- the following bits of info are returned as NULL-terminated strings --- */ case DEVINFO_STR_NAME: strcpy(info->s, DEVTEMPLATE_NAME); break; #ifdef DEVTEMPLATE_SHORTNAME @@ -240,9 +232,6 @@ #if ((DEVTEMPLATE_DERIVED_FEATURES) & DT_HAS_EXECUTE) static DEVICE_EXECUTE( DEVTEMPLATE_DERIVED_ID(,) ); #endif -#if ((DEVTEMPLATE_DERIVED_FEATURES) & DT_HAS_NVRAM) -static DEVICE_NVRAM( DEVTEMPLATE_DERIVED_ID(,) ); -#endif #if ((DEVTEMPLATE_DERIVED_FEATURES) & DT_HAS_CUSTOM_CONFIG) static DEVICE_CUSTOM_CONFIG( DEVTEMPLATE_DERIVED_ID(,) ); #endif @@ -296,9 +285,6 @@ #if ((DEVTEMPLATE_DERIVED_FEATURES) & DT_HAS_EXECUTE) case DEVINFO_FCT_EXECUTE: info->execute = DEVTEMPLATE_DERIVED_ID1(DEVICE_EXECUTE_NAME()); break; #endif -#if ((DEVTEMPLATE_DERIVED_FEATURES) & DT_HAS_NVRAM) - case DEVINFO_FCT_NVRAM: info->nvram = DEVTEMPLATE_DERIVED_ID1(DEVICE_NVRAM_NAME()); break; -#endif /* --- the following bits of info are returned as NULL-terminated strings --- */ case DEVINFO_STR_NAME: strcpy(info->s, DEVTEMPLATE_DERIVED_NAME); break; @@ -313,7 +299,6 @@ #undef DT_HAS_RESET #undef DT_HAS_STOP #undef DT_HAS_EXECUTE -#undef DT_HAS_NVRAM #undef DT_HAS_CUSTOM_CONFIG #undef DT_HAS_ROM_REGION #undef DT_HAS_MACHINE_CONFIG diff -Nru mame-0.144/src/emu/didisasm.h mame-0.145/src/emu/didisasm.h --- mame-0.144/src/emu/didisasm.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/didisasm.h 2012-02-06 21:30:28.000000000 +0000 @@ -98,5 +98,8 @@ virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) = 0; }; +// iterator +typedef device_interface_iterator disasm_interface_iterator; + #endif /* __DIDISASM_H__ */ diff -Nru mame-0.144/src/emu/diexec.c mame-0.145/src/emu/diexec.c --- mame-0.144/src/emu/diexec.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/diexec.c 2012-02-06 21:30:26.000000000 +0000 @@ -73,10 +73,9 @@ device_execute_interface::device_execute_interface(const machine_config &mconfig, device_t &device) : device_interface(device), - m_cothread(cothread_entry_delegate(FUNC(device_execute_interface::run_thread_wrapper), this)), +// m_cothread(cothread_entry_delegate(FUNC(device_execute_interface::run_thread_wrapper), this)), m_disabled(false), m_vblank_interrupt(NULL), - m_vblank_interrupts_per_frame(0), m_vblank_interrupt_screen(NULL), m_timed_interrupt(NULL), m_timed_interrupt_period(attotime::zero), @@ -84,8 +83,6 @@ m_nextexec(NULL), m_driver_irq(0), m_timedint_timer(NULL), - m_iloops(0), - m_partial_frame_timer(NULL), m_profiler(PROFILER_IDLE), m_icountptr(NULL), m_cycles_running(0), @@ -143,7 +140,6 @@ if (!device.interface(exec)) throw emu_fatalerror("MCFG_DEVICE_VBLANK_INT called on device '%s' with no execute interface", device.tag()); exec->m_vblank_interrupt = function; - exec->m_vblank_interrupts_per_frame = rate; exec->m_vblank_interrupt_screen = tag; } @@ -377,19 +373,19 @@ // which just calls run and then returns to the // scheduler thread, over and over //------------------------------------------------- - +/* void device_execute_interface::run_thread_wrapper() { - // loop infinitely - device_scheduler &scheduler = device().machine().scheduler(); - while (1) + // loop infinitely + device_scheduler &scheduler = device().machine().scheduler(); + while (1) { - // call the classic run function, then swap back to the scheduler's thread - execute_run(); + // call the classic run function, then swap back to the scheduler's thread + execute_run(); scheduler.make_active(); } } - +*/ //------------------------------------------------- // execute_clocks_to_cycles - convert the number @@ -488,52 +484,22 @@ // constructed //------------------------------------------------- -bool device_execute_interface::interface_validity_check(emu_options &options, const game_driver &driver) const +void device_execute_interface::interface_validity_check(validity_checker &valid) const { - bool error = false; - - /* validate the interrupts */ + // validate the interrupts if (m_vblank_interrupt != NULL) { - if (device().mconfig().devicelist().count(SCREEN) == 0) - { - mame_printf_error("%s: %s device '%s' has a VBLANK interrupt, but the driver is screenless!\n", driver.source_file, driver.name, device().tag()); - error = true; - } - else if (m_vblank_interrupt_screen != NULL && m_vblank_interrupts_per_frame != 0) - { - mame_printf_error("%s: %s device '%s' has a new VBLANK interrupt handler with >1 interrupts!\n", driver.source_file, driver.name, device().tag()); - error = true; - } - else if (m_vblank_interrupt_screen != NULL && device().mconfig().devicelist().find(m_vblank_interrupt_screen) == NULL) - { - mame_printf_error("%s: %s device '%s' VBLANK interrupt with a non-existant screen tag (%s)!\n", driver.source_file, driver.name, device().tag(), m_vblank_interrupt_screen); - error = true; - } - else if (m_vblank_interrupt_screen == NULL && m_vblank_interrupts_per_frame == 0) - { - mame_printf_error("%s: %s device '%s' has a VBLANK interrupt handler with 0 interrupts!\n", driver.source_file, driver.name, device().tag()); - error = true; - } - } - else if (m_vblank_interrupts_per_frame != 0) - { - mame_printf_error("%s: %s device '%s' has no VBLANK interrupt handler but a non-0 interrupt count is given!\n", driver.source_file, driver.name, device().tag()); - error = true; + screen_device_iterator iter(device().mconfig().root_device()); + if (iter.first() == NULL) + mame_printf_error("VBLANK interrupt specified, but the driver is screenless\n"); + else if (m_vblank_interrupt_screen != NULL && device().siblingdevice(m_vblank_interrupt_screen) == NULL) + mame_printf_error("VBLANK interrupt references a non-existant screen tag '%s'\n", m_vblank_interrupt_screen); } if (m_timed_interrupt != NULL && m_timed_interrupt_period == attotime::zero) - { - mame_printf_error("%s: %s device '%s' has a timer interrupt handler with 0 period!\n", driver.source_file, driver.name, device().tag()); - error = true; - } + mame_printf_error("Timed interrupt handler specified with 0 period\n"); else if (m_timed_interrupt == NULL && m_timed_interrupt_period != attotime::zero) - { - mame_printf_error("%s: %s device '%s' has a no timer interrupt handler but has a non-0 period given!\n", driver.source_file, driver.name, device().tag()); - error = true; - } - - return error; + mame_printf_error("No timer interrupt handler specified, but has a non-0 period given\n"); } @@ -545,7 +511,8 @@ void device_execute_interface::interface_pre_start() { // fill in the initial states - int index = device().machine().devicelist().indexof(m_device); + execute_interface_iterator iter(device().machine().root_device()); + int index = iter.indexof(*this); m_suspend = SUSPEND_REASON_RESET; m_profiler = profile_type(index + PROFILER_DEVICE_FIRST); m_inttrigger = index + TRIGGER_INT; @@ -555,20 +522,17 @@ m_input[line].start(this, line); // allocate timers if we need them - if (m_vblank_interrupts_per_frame > 1) - m_partial_frame_timer = device().machine().scheduler().timer_alloc(FUNC(static_trigger_partial_frame_interrupt), (void *)this); if (m_timed_interrupt_period != attotime::zero) m_timedint_timer = device().machine().scheduler().timer_alloc(FUNC(static_trigger_periodic_interrupt), (void *)this); // register for save states - m_device.save_item(NAME(m_suspend)); - m_device.save_item(NAME(m_nextsuspend)); - m_device.save_item(NAME(m_eatcycles)); - m_device.save_item(NAME(m_nexteatcycles)); - m_device.save_item(NAME(m_trigger)); - m_device.save_item(NAME(m_totalcycles)); - m_device.save_item(NAME(m_localtime)); - m_device.save_item(NAME(m_iloops)); + device().save_item(NAME(m_suspend)); + device().save_item(NAME(m_nextsuspend)); + device().save_item(NAME(m_eatcycles)); + device().save_item(NAME(m_nexteatcycles)); + device().save_item(NAME(m_trigger)); + device().save_item(NAME(m_totalcycles)); + device().save_item(NAME(m_localtime)); } @@ -614,7 +578,7 @@ m_input[line].reset(); // reconfingure VBLANK interrupts - if (m_vblank_interrupts_per_frame > 0 || m_vblank_interrupt_screen != NULL) + if (m_vblank_interrupt_screen != NULL) { // get the screen that will trigger the VBLANK @@ -649,7 +613,7 @@ void device_execute_interface::interface_clock_changed() { // recompute cps and spc - m_cycles_per_second = clocks_to_cycles(m_device.clock()); + m_cycles_per_second = clocks_to_cycles(device().clock()); m_attoseconds_per_cycle = HZ_TO_ATTOSECONDS(m_cycles_per_second); // update the device's divisor @@ -682,14 +646,14 @@ { // get the default vector and acknowledge the interrupt if needed int vector = m_input[irqline].default_irq_callback(); - LOG(("static_standard_irq_callback('%s', %d) $%04x\n", m_device.tag(), irqline, vector)); + LOG(("static_standard_irq_callback('%s', %d) $%04x\n", device().tag(), irqline, vector)); // if there's a driver callback, run it to get the vector if (m_driver_irq != NULL) - vector = (*m_driver_irq)(&m_device, irqline); + vector = (*m_driver_irq)(&device(), irqline); // notify the debugger - debugger_interrupt_hook(&m_device, irqline); + debugger_interrupt_hook(&device(), irqline); return vector; } @@ -704,7 +668,7 @@ // if we don't have that information, compute it attoseconds_t basetick = m_attoseconds_per_cycle; if (basetick == 0) - basetick = HZ_TO_ATTOSECONDS(clocks_to_cycles(m_device.clock())); + basetick = HZ_TO_ATTOSECONDS(clocks_to_cycles(device().clock())); // apply the minimum cycle count return basetick * min_cycles(); @@ -734,51 +698,9 @@ if (!vblank_state) return; - // start the interrupt counter - if (!suspended(SUSPEND_REASON_DISABLE)) - m_iloops = 0; - else - m_iloops = -1; - // generate the interrupt callback if (!suspended(SUSPEND_REASON_HALT | SUSPEND_REASON_RESET | SUSPEND_REASON_DISABLE)) - (*m_vblank_interrupt)(&m_device); - - // if we have more than one interrupt per frame, start the timer now to trigger the rest of them - if (m_vblank_interrupts_per_frame > 1 && !suspended(SUSPEND_REASON_DISABLE)) - { - m_partial_frame_period = device().machine().primary_screen->frame_period() / m_vblank_interrupts_per_frame; - m_partial_frame_timer->adjust(m_partial_frame_period); - } -} - - -//------------------------------------------------- -// static_trigger_partial_frame_interrupt - -// called to trigger a partial frame interrupt -//------------------------------------------------- - -TIMER_CALLBACK( device_execute_interface::static_trigger_partial_frame_interrupt ) -{ - reinterpret_cast(ptr)->trigger_partial_frame_interrupt(); -} - -void device_execute_interface::trigger_partial_frame_interrupt() -{ - // when we hit 0, reset to the total count - if (m_iloops == 0) - m_iloops = m_vblank_interrupts_per_frame; - - // count one more "iloop" - m_iloops--; - - // call the interrupt handler if we're not suspended - if (!suspended(SUSPEND_REASON_HALT | SUSPEND_REASON_RESET | SUSPEND_REASON_DISABLE)) - (*m_vblank_interrupt)(&m_device); - - // set up to retrigger if there's more interrupts to generate - if (m_iloops > 1) - m_partial_frame_timer->adjust(m_partial_frame_period); + (*m_vblank_interrupt)(&device()); } @@ -796,7 +718,7 @@ { // bail if there is no routine if (m_timed_interrupt != NULL && !suspended(SUSPEND_REASON_HALT | SUSPEND_REASON_RESET | SUSPEND_REASON_DISABLE)) - (*m_timed_interrupt)(&m_device); + (*m_timed_interrupt)(&device()); } @@ -830,7 +752,7 @@ void device_execute_interface::device_input::start(device_execute_interface *execute, int linenum) { m_execute = execute; - m_device = &m_execute->m_device; + m_device = &m_execute->device(); m_linenum = linenum; reset(); diff -Nru mame-0.144/src/emu/diexec.h mame-0.145/src/emu/diexec.h --- mame-0.144/src/emu/diexec.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/diexec.h 2012-02-06 21:30:26.000000000 +0000 @@ -48,7 +48,7 @@ // set to 1 to execute on cothread instead of directly -#define USE_COTHREADS 1 +//#define USE_COTHREADS 1 //************************************************************************** @@ -144,6 +144,7 @@ class device_execute_interface : public device_interface { friend class device_scheduler; + friend class testcpu_state; public: // construction/destruction @@ -181,9 +182,6 @@ int input_state(int linenum) { return m_input[linenum].m_curstate; } void set_irq_callback(device_irq_callback callback); - // deprecated, but still needed for older drivers - int iloops() const { return m_iloops; } - // suspend/resume void suspend(UINT32 reason, bool eatcycles); void resume(UINT32 reason); @@ -204,11 +202,11 @@ UINT64 total_cycles() const; // required operation overrides -#if USE_COTHREADS - void run() { m_cothread.make_active(); } -#else +//#if USE_COTHREADS +// void run() { m_cothread.make_active(); } +//#else void run() { execute_run(); } -#endif +//#endif protected: // internal helpers @@ -230,7 +228,7 @@ virtual void execute_set_input(int linenum, int state); // interface-level overrides - virtual bool interface_validity_check(emu_options &options, const game_driver &driver) const; + virtual void interface_validity_check(validity_checker &valid) const; virtual void interface_pre_start(); virtual void interface_post_start(); virtual void interface_pre_reset(); @@ -272,12 +270,11 @@ }; // internal state - cothread m_cothread; // thread used for execution +// cothread m_cothread; // thread used for execution // configuration bool m_disabled; // disabled from executing? device_interrupt_func m_vblank_interrupt; // for interrupts tied to VBLANK - int m_vblank_interrupts_per_frame; // usually 1 const char * m_vblank_interrupt_screen; // the screen that causes the VBLANK interrupt device_interrupt_func m_timed_interrupt; // for interrupts not tied to VBLANK attotime m_timed_interrupt_period; // period for periodic interrupts @@ -291,11 +288,6 @@ device_input m_input[MAX_INPUT_LINES]; // data about inputs emu_timer * m_timedint_timer; // reference to this device's periodic interrupt timer - // these below are hacks to support multiple interrupts per frame - INT32 m_iloops; // number of interrupts remaining this frame - emu_timer * m_partial_frame_timer; // the timer that triggers partial frame interrupts - attotime m_partial_frame_period; // the length of one partial frame for interrupt purposes - // cycle counting and executing profile_type m_profiler; // profiler tag int * m_icountptr; // pointer to the icount @@ -324,15 +316,15 @@ void on_vblank(screen_device &screen, bool vblank_state); - static void static_trigger_partial_frame_interrupt(running_machine &machine, void *ptr, int param); - void trigger_partial_frame_interrupt(); - static void static_trigger_periodic_interrupt(running_machine &machine, void *ptr, int param); void trigger_periodic_interrupt(); attoseconds_t minimum_quantum() const; }; +// iterator +typedef device_interface_iterator execute_interface_iterator; + //************************************************************************** diff -Nru mame-0.144/src/emu/diimage.c mame-0.145/src/emu/diimage.c --- mame-0.144/src/emu/diimage.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/diimage.c 2012-02-06 21:30:28.000000000 +0000 @@ -40,7 +40,9 @@ #include "emu.h" #include "ui.h" #include "zippath.h" - +#include "uimenu.h" +#include "uiimage.h" +#include "uiswlist.h" //************************************************************************** // DEVICE CONFIG IMAGE INTERFACE @@ -80,6 +82,7 @@ m_full_software_name(NULL), m_software_info_ptr(NULL), m_software_part_ptr(NULL), + m_software_list_name(NULL), m_readonly(false), m_created(false), m_formatlist(NULL), @@ -107,7 +110,7 @@ //------------------------------------------------- // find_device_type - search trough list of -// device types to extact data +// device types to extract data //------------------------------------------------- const image_device_type_info *device_image_interface::find_device_type(iodevice_t type) @@ -182,7 +185,7 @@ image_error_t device_image_interface::set_image_filename(const char *filename) { m_image_name = filename; - zippath_parent(&m_working_directory, filename); + zippath_parent(m_working_directory, filename); m_basename.cpy(m_image_name); int loc1 = m_image_name.rchr(0,'\\'); @@ -190,7 +193,15 @@ int loc3 = m_image_name.rchr(0,':'); int loc = MAX(loc1,MAX(loc2,loc3)); if (loc!=-1) { - m_basename = m_basename.substr(loc + 1,m_basename.len()-loc); + if (loc == loc3) + { + // temp workaround for softlists now that m_image_name contains the part name too (e.g. list:gamename:cart) + astring tmpstr = astring(m_basename.substr(0,loc)); + int tmploc = tmpstr.rchr(0,':'); + m_basename = m_basename.substr(tmploc + 1,loc-tmploc); + } + else + m_basename = m_basename.substr(loc + 1,m_basename.len()-loc); } m_basename_noext = m_basename.cpy(m_basename); m_filetype = ""; @@ -352,7 +363,7 @@ /* did we successfully identify the directory? */ if (success) - zippath_combine(&m_working_directory, m_working_directory, subdir); + zippath_combine(m_working_directory, m_working_directory, subdir); return success; } @@ -532,10 +543,9 @@ -------------------------------------------------*/ void device_image_interface::battery_load(void *buffer, int length, int fill) { - astring *fname = astring_assemble_4(astring_alloc(), device().machine().system().name, PATH_SEPARATOR, m_basename_noext, ".nv"); + astring fname(device().machine().system().name, PATH_SEPARATOR, m_basename_noext, ".nv"); - image_battery_load_by_name(device().machine().options(), astring_c(fname), buffer, length, fill); - astring_free(fname); + image_battery_load_by_name(device().machine().options(), fname, buffer, length, fill); } /*------------------------------------------------- @@ -546,10 +556,9 @@ -------------------------------------------------*/ void device_image_interface::battery_save(const void *buffer, int length) { - astring *fname = astring_assemble_4(astring_alloc(), device().machine().system().name, PATH_SEPARATOR, m_basename_noext, ".nv"); + astring fname(device().machine().system().name, PATH_SEPARATOR, m_basename_noext, ".nv"); - image_battery_save_by_name(device().machine().options(), astring_c(fname), buffer, length); - astring_free(fname); + image_battery_save_by_name(device().machine().options(), fname, buffer, length); } //------------------------------------------------- @@ -605,7 +614,7 @@ astring revised_path; /* attempt to read the file */ - filerr = zippath_fopen(path, open_flags, &m_file, &revised_path); + filerr = zippath_fopen(path, open_flags, m_file, revised_path); /* did the open succeed? */ switch(filerr) @@ -649,6 +658,60 @@ return err; } +int device_image_interface::reopen_for_write(const char *path) +{ + if(m_file) + core_fclose(m_file); + + file_error filerr = FILERR_NOT_FOUND; + image_error_t err = IMAGE_ERROR_FILENOTFOUND; + astring revised_path; + + /* attempt to open the file for writing*/ + filerr = zippath_fopen(path, OPEN_FLAG_READ|OPEN_FLAG_WRITE|OPEN_FLAG_CREATE, m_file, revised_path); + + /* did the open succeed? */ + switch(filerr) + { + case FILERR_NONE: + /* success! */ + m_readonly = 0; + m_created = 1; + err = IMAGE_ERROR_SUCCESS; + break; + + case FILERR_NOT_FOUND: + case FILERR_ACCESS_DENIED: + /* file not found (or otherwise cannot open); continue */ + err = IMAGE_ERROR_FILENOTFOUND; + break; + + case FILERR_OUT_OF_MEMORY: + /* out of memory */ + err = IMAGE_ERROR_OUTOFMEMORY; + break; + + case FILERR_ALREADY_OPEN: + /* this shouldn't happen */ + err = IMAGE_ERROR_ALREADYOPEN; + break; + + case FILERR_FAILURE: + case FILERR_TOO_MANY_FILES: + case FILERR_INVALID_DATA: + default: + /* other errors */ + err = IMAGE_ERROR_INTERNAL; + break; + } + + /* if successful, set the file name */ + if (filerr == FILERR_NONE) + set_image_filename(revised_path); + + return err; +} + /*------------------------------------------------- determine_open_plan - determines which open flags to use, and in what order @@ -811,11 +874,11 @@ /* Check if there's a software list defined for this device and use that if we're not creating an image */ if (!filename_has_period) { - softload = load_software_part( device().machine().options(), this, path, &m_software_info_ptr, &m_software_part_ptr, &m_full_software_name ); + softload = load_software_part( device().machine().options(), this, path, &m_software_info_ptr, &m_software_part_ptr, &m_full_software_name, &m_software_list_name ); // if we had launched from softlist with a specified part, e.g. "shortname:part" // we would have recorded the wrong name, so record it again based on software_info - if (m_software_info_ptr && m_software_info_ptr->shortname) - m_err = set_image_filename(m_software_info_ptr->shortname); + if (m_software_info_ptr && m_full_software_name) + m_err = set_image_filename(m_full_software_name); m_from_swlist = TRUE; } @@ -991,6 +1054,7 @@ m_full_software_name = NULL; m_software_info_ptr = NULL; m_software_part_ptr = NULL; + m_software_list_name = NULL; } /*------------------------------------------------- @@ -1013,18 +1077,18 @@ void device_image_interface::update_names() { - const device_image_interface *image = NULL; + image_interface_iterator iter(device().mconfig().root_device()); int count = 0; int index = -1; - - for (bool gotone = device().mconfig().devicelist().first(image); gotone; gotone = image->next(image)) + for (const device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { if (this == image) index = count; if (image->image_type() == image_type()) count++; } - if (count > 1) { + if (count > 1) + { m_instance_name.printf("%s%d", device_typename(image_type()), index + 1); m_brief_instance_name.printf("%s%d", device_brieftypename(image_type()), index + 1); } @@ -1034,3 +1098,280 @@ m_brief_instance_name = device_brieftypename(image_type()); } } + +/*------------------------------------------------- + get_selection_menu - create the menu stack + for ui-level image selection +-------------------------------------------------*/ + +ui_menu *device_image_interface::get_selection_menu(running_machine &machine, render_container *container) +{ + return auto_alloc_clear(machine, ui_menu_control_device_image(machine, container, this)); +} + +ui_menu_control_device_image::ui_menu_control_device_image(running_machine &machine, render_container *container, device_image_interface *_image) : ui_menu(machine, container) +{ + image = _image; + + sld = 0; + if (image->software_list_name()) { + software_list_device_iterator iter(machine.config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) + { + if (strcmp(swlist->list_name(),image->software_list_name())==0) sld = swlist; + } + } + swi = image->software_entry(); + swp = image->part_entry(); + + if(swi) + { + state = START_OTHER_PART; + current_directory.cpy(image->working_directory()); + } + else + { + state = START_FILE; + + /* if the image exists, set the working directory to the parent directory */ + if (image->exists()) + { + current_file.cpy(image->filename()); + zippath_parent(current_directory, current_file); + } else + current_directory.cpy(image->working_directory()); + + /* check to see if the path exists; if not clear it */ + if (zippath_opendir(current_directory, NULL) != FILERR_NONE) + current_directory.reset(); + } +} + +ui_menu_control_device_image::~ui_menu_control_device_image() +{ +} + + + + +/*------------------------------------------------- + create_new_image - creates a new disk image +-------------------------------------------------*/ + +void ui_menu_control_device_image::test_create(bool &can_create, bool &need_confirm) +{ + astring path; + osd_directory_entry *entry; + osd_dir_entry_type file_type; + + /* assemble the full path */ + zippath_combine(path, current_directory, current_file); + + /* does a file or a directory exist at the path */ + entry = osd_stat(path); + file_type = (entry != NULL) ? entry->type : ENTTYPE_NONE; + + switch(file_type) + { + case ENTTYPE_NONE: + /* no file/dir here - always create */ + can_create = true; + need_confirm = false; + break; + + case ENTTYPE_FILE: + /* a file exists here - ask for permission from the user */ + can_create = true; + need_confirm = true; + break; + + case ENTTYPE_DIR: + /* a directory exists here - we can't save over it */ + ui_popup_time(5, "Cannot save over directory"); + can_create = false; + need_confirm = false; + break; + + default: + fatalerror("Unexpected"); + can_create = false; + need_confirm = false; + break; + } +} + +void ui_menu_control_device_image::load_software_part() +{ + astring temp_name(sld->list_name()); + temp_name.cat(":"); + temp_name.cat(swi->shortname); + temp_name.cat(":"); + temp_name.cat(swp->name); + hook_load(temp_name, true); +} + +void ui_menu_control_device_image::hook_load(astring name, bool softlist) +{ + image->load(name); + ui_menu::stack_pop(machine()); +} + +void ui_menu_control_device_image::populate() +{ +} + +void ui_menu_control_device_image::handle() +{ + switch(state) { + case START_FILE: { + bool can_create = false; + if(image->is_creatable()) { + zippath_directory *directory = NULL; + file_error err = zippath_opendir(current_directory, &directory); + can_create = err == FILERR_NONE && !zippath_is_zip(directory); + if(directory) + zippath_closedir(directory); + } + submenu_result = -1; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_selector(machine(), container, image, current_directory, current_file, true, true, can_create, &submenu_result))); + state = SELECT_FILE; + break; + } + + case START_SOFTLIST: + sld = 0; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software(machine(), container, image->image_interface(), &sld))); + state = SELECT_SOFTLIST; + break; + + case START_OTHER_PART: { + submenu_result = -1; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_parts(machine(), container, swi, swp->interface_, &swp, true, &submenu_result))); + state = SELECT_OTHER_PART; + break; + } + + case SELECT_SOFTLIST: + if(!sld) { + ui_menu::stack_pop(machine()); + break; + } + software_info_name = ""; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_list(machine(), container, sld, image->image_interface(), software_info_name))); + state = SELECT_PARTLIST; + break; + + case SELECT_PARTLIST: + swl = software_list_open(machine().options(), sld->list_name(), false, NULL); + swi = software_list_find(swl, software_info_name, NULL); + if(swinfo_has_multiple_parts(swi, image->image_interface())) { + submenu_result = -1; + swp = 0; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_parts(machine(), container, swi, image->image_interface(), &swp, false, &submenu_result))); + state = SELECT_ONE_PART; + } else { + swp = software_find_part(swi, NULL, NULL); + load_software_part(); + software_list_close(swl); + ui_menu::stack_pop(machine()); + } + break; + + case SELECT_ONE_PART: + switch(submenu_result) { + case ui_menu_software_parts::T_ENTRY: { + load_software_part(); + software_list_close(swl); + ui_menu::stack_pop(machine()); + break; + } + + case -1: // return to list + software_list_close(swl); + state = SELECT_SOFTLIST; + break; + + } + break; + + case SELECT_OTHER_PART: + switch(submenu_result) { + case ui_menu_software_parts::T_ENTRY: { + load_software_part(); + break; + } + + case ui_menu_software_parts::T_FMGR: + state = START_FILE; + handle(); + break; + + case -1: // return to system + ui_menu::stack_pop(machine()); + break; + + } + break; + + case SELECT_FILE: + switch(submenu_result) { + case ui_menu_file_selector::R_EMPTY: + image->unload(); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_file_selector::R_FILE: + hook_load(current_file, false); + break; + + case ui_menu_file_selector::R_CREATE: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_create(machine(), container, image, current_directory, current_file))); + state = CREATE_FILE; + break; + + case ui_menu_file_selector::R_SOFTLIST: + state = START_SOFTLIST; + handle(); + break; + + case -1: // return to system + ui_menu::stack_pop(machine()); + break; + } + break; + + case CREATE_FILE: { + bool can_create, need_confirm; + test_create(can_create, need_confirm); + if(can_create) { + if(need_confirm) { + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_confirm_save_as(machine(), container, &create_confirmed))); + state = CREATE_CONFIRM; + } else { + state = DO_CREATE; + handle(); + } + } else { + state = START_FILE; + handle(); + } + break; + } + + case CREATE_CONFIRM: { + state = create_confirmed ? DO_CREATE : START_FILE; + handle(); + break; + } + + case DO_CREATE: { + astring path; + zippath_combine(path, current_directory, current_file); + int err = image->create(path, 0, NULL); + if (err != 0) + popmessage("Error: %s", image->error()); + ui_menu::stack_pop(machine()); + break; + } + } +} diff -Nru mame-0.144/src/emu/diimage.h mame-0.145/src/emu/diimage.h --- mame-0.144/src/emu/diimage.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/diimage.h 2012-02-06 21:30:28.000000000 +0000 @@ -171,7 +171,6 @@ virtual void call_display() { } virtual void call_display_info() { } virtual void call_get_devices() { } - virtual void *get_device_specific_call() { return NULL; } virtual device_image_partialhash_func get_partial_hash() const { return NULL; } virtual iodevice_t image_type() const = 0; virtual bool is_readable() const = 0; @@ -183,6 +182,8 @@ virtual const char *file_extensions() const = 0; virtual const option_guide *create_option_guide() const = 0; + virtual ui_menu *get_selection_menu(running_machine &machine, class render_container *container); + const image_device_format *device_get_indexed_creatable_format(int index); const image_device_format *device_get_named_creatable_format(const char *format_name); const option_guide *device_get_creation_option_guide() { return create_option_guide(); } @@ -220,6 +221,7 @@ const software_info *software_entry() { return m_software_info_ptr; } const software_part *part_entry() { return m_software_part_ptr; } + const char *software_list_name() { return m_software_list_name; } void set_working_directory(const char *working_directory) { m_working_directory = working_directory; } const char * working_directory(); @@ -248,6 +250,8 @@ void unload(); bool create(const char *path, const image_device_format *create_format, option_resolution *create_args); bool load_software(char *swlist, char *swname, rom_entry *entry); + int reopen_for_write(const char *path); + protected: bool load_internal(const char *path, bool is_create, int create_format, option_resolution *create_args); void determine_open_plan(int is_create, UINT32 *open_plan); @@ -293,6 +297,7 @@ char *m_full_software_name; software_info *m_software_info_ptr; software_part *m_software_part_ptr; + char *m_software_list_name; /* info read from the hash file/software list */ astring m_longname; @@ -321,5 +326,38 @@ bool m_is_loading; }; +// iterator +typedef device_interface_iterator image_interface_iterator; + +class ui_menu_control_device_image : public ui_menu { +public: + ui_menu_control_device_image(running_machine &machine, render_container *container, device_image_interface *image); + virtual ~ui_menu_control_device_image(); + virtual void populate(); + virtual void handle(); + +protected: + enum { + START_FILE, START_OTHER_PART, START_SOFTLIST, SELECT_PARTLIST, SELECT_ONE_PART, SELECT_OTHER_PART, SELECT_FILE, CREATE_FILE, CREATE_CONFIRM, DO_CREATE, SELECT_SOFTLIST, + LAST_ID + }; + int state; + + device_image_interface *image; + astring current_directory; + astring current_file; + int submenu_result; + bool create_confirmed; + bool softlist_done; + const struct software_list *swl; + const software_info *swi; + const software_part *swp; + const class software_list_device *sld; + astring software_info_name; + + void test_create(bool &can_create, bool &need_confirm); + void load_software_part(); + virtual void hook_load(astring filename, bool softlist); +}; #endif /* __DIIMAGE_H__ */ diff -Nru mame-0.144/src/emu/dimemory.c mame-0.145/src/emu/dimemory.c --- mame-0.144/src/emu/dimemory.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/dimemory.c 2012-02-06 21:30:28.000000000 +0000 @@ -227,10 +227,9 @@ // checks on the memory configuration //------------------------------------------------- -bool device_memory_interface::interface_validity_check(emu_options &options, const game_driver &driver) const +void device_memory_interface::interface_validity_check(validity_checker &valid) const { bool detected_overlap = DETECT_OVERLAPPING_MEMORY ? false : true; - bool error = false; // loop over all address spaces for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) @@ -253,15 +252,9 @@ // validate the global map parameters if (map->m_spacenum != spacenum) - { - mame_printf_error("%s: %s device '%s' space %d has address space %d handlers!\n", driver.source_file, driver.name, device().tag(), spacenum, map->m_spacenum); - error = true; - } + mame_printf_error("Space %d has address space %d handlers!\n", spacenum, map->m_spacenum); if (map->m_databits != datawidth) - { - mame_printf_error("%s: %s device '%s' uses wrong memory handlers for %s space! (width = %d, memory = %08x)\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, datawidth, map->m_databits); - error = true; - } + mame_printf_error("Wrong memory handlers provided for %s space! (width = %d, memory = %08x)\n", spaceconfig->m_name, datawidth, map->m_databits); // loop over entries and look for errors for (address_map_entry *entry = map->m_entrylist.first(); entry != NULL; entry = entry->next()) @@ -278,7 +271,7 @@ ((entry->m_read.m_type != AMH_NONE && scan->m_read.m_type != AMH_NONE) || (entry->m_write.m_type != AMH_NONE && scan->m_write.m_type != AMH_NONE))) { - mame_printf_warning("%s: %s '%s' %s space has overlapping memory (%X-%X,%d,%d) vs (%X-%X,%d,%d)\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_read.m_type, entry->m_write.m_type, scan->m_addrstart, scan->m_addrend, scan->m_read.m_type, scan->m_write.m_type); + mame_printf_warning("%s space has overlapping memory (%X-%X,%d,%d) vs (%X-%X,%d,%d)\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_read.m_type, entry->m_write.m_type, scan->m_addrstart, scan->m_addrend, scan->m_read.m_type, scan->m_write.m_type); detected_overlap = true; break; } @@ -286,17 +279,11 @@ // look for inverted start/end pairs if (byteend < bytestart) - { - mame_printf_error("%s: %s wrong %s memory read handler start = %08x > end = %08x\n", driver.source_file, driver.name, spaceconfig->m_name, entry->m_addrstart, entry->m_addrend); - error = true; - } + mame_printf_error("Wrong %s memory read handler start = %08x > end = %08x\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend); // look for misaligned entries if ((bytestart & (alignunit - 1)) != 0 || (byteend & (alignunit - 1)) != (alignunit - 1)) - { - mame_printf_error("%s: %s wrong %s memory read handler start = %08x, end = %08x ALIGN = %d\n", driver.source_file, driver.name, spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, alignunit); - error = true; - } + mame_printf_error("Wrong %s memory read handler start = %08x, end = %08x ALIGN = %d\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, alignunit); // if this is a program space, auto-assign implicit ROM entries if (entry->m_read.m_type == AMH_ROM && entry->m_region == NULL) @@ -308,81 +295,54 @@ // if this entry references a memory region, validate it if (entry->m_region != NULL && entry->m_share == 0) { - // look for the region + // make sure we can resolve the full path to the region bool found = false; + astring entry_region; + device().siblingtag(entry_region, entry->m_region); + + // look for the region for (const rom_source *source = rom_first_source(device().mconfig()); source != NULL && !found; source = rom_next_source(*source)) - for (const rom_entry *romp = rom_first_region(*source); !ROMENTRY_ISEND(romp) && !found; romp++) + for (const rom_entry *romp = rom_first_region(*source); romp != NULL && !found; romp = rom_next_region(romp)) { - const char *regiontag_c = ROMREGION_GETTAG(romp); - if (regiontag_c != NULL) + astring fulltag; + rom_region_name(fulltag, &device().mconfig().gamedrv(), source, romp); + if (fulltag == entry_region) { - astring fulltag; - astring regiontag; - - // a leading : on a region name indicates an absolute region, so fix up accordingly - if (entry->m_region[0] == ':') - { - regiontag = &entry->m_region[1]; - } - else - { - if (strchr(entry->m_region,':')) { - regiontag = entry->m_region; - } else { - device().siblingtag(regiontag, entry->m_region); - } - } - rom_region_name(fulltag, &driver, source, romp); - if (fulltag.cmp(regiontag) == 0) - { - // verify the address range is within the region's bounds - offs_t length = ROMREGION_GETLENGTH(romp); - if (entry->m_rgnoffs + (byteend - bytestart + 1) > length) - { - mame_printf_error("%s: %s device '%s' %s space memory map entry %X-%X extends beyond region '%s' size (%X)\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region, length); - error = true; - } - found = true; - } + // verify the address range is within the region's bounds + offs_t length = ROMREGION_GETLENGTH(romp); + if (entry->m_rgnoffs + (byteend - bytestart + 1) > length) + mame_printf_error("%s space memory map entry %X-%X extends beyond region '%s' size (%X)\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region, length); + found = true; } } // error if not found if (!found) - { - mame_printf_error("%s: %s device '%s' %s space memory map entry %X-%X references non-existant region '%s'\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region); - error = true; - } + mame_printf_error("%s space memory map entry %X-%X references non-existant region '%s'\n", spaceconfig->m_name, entry->m_addrstart, entry->m_addrend, entry->m_region); } // make sure all devices exist - if ((entry->m_read.m_type == AMH_LEGACY_DEVICE_HANDLER && entry->m_read.m_tag != NULL && device().mconfig().devicelist().find(entry->m_read.m_tag) == NULL) || - (entry->m_write.m_type == AMH_LEGACY_DEVICE_HANDLER && entry->m_write.m_tag != NULL && device().mconfig().devicelist().find(entry->m_write.m_tag) == NULL)) - { - mame_printf_error("%s: %s device '%s' %s space memory map entry references nonexistant device '%s'\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, entry->m_write.m_tag); - error = true; - } + if (entry->m_read.m_type == AMH_LEGACY_DEVICE_HANDLER && entry->m_read.m_tag && device().siblingdevice(entry->m_read.m_tag) == NULL) + mame_printf_error("%s space memory map entry references nonexistant device '%s'\n", spaceconfig->m_name, entry->m_read.m_tag.cstr()); + if (entry->m_write.m_type == AMH_LEGACY_DEVICE_HANDLER && entry->m_write.m_tag && device().siblingdevice(entry->m_write.m_tag) == NULL) + mame_printf_error("%s space memory map entry references nonexistant device '%s'\n", spaceconfig->m_name, entry->m_write.m_tag.cstr()); // make sure ports exist // if ((entry->m_read.m_type == AMH_PORT && entry->m_read.m_tag != NULL && portlist.find(entry->m_read.m_tag) == NULL) || // (entry->m_write.m_type == AMH_PORT && entry->m_write.m_tag != NULL && portlist.find(entry->m_write.m_tag) == NULL)) -// { -// mame_printf_error("%s: %s device '%s' %s space memory map entry references nonexistant port tag '%s'\n", driver.source_file, driver.name, device().tag(), spaceconfig->m_name, entry->m_read.tag); -// error = true; -// } +// mame_printf_error("%s space memory map entry references nonexistant port tag '%s'\n", spaceconfig->m_name, entry->m_read.m_tag.cstr()); // validate bank and share tags - if (entry->m_read.m_type == AMH_BANK && !validate_tag(driver, "bank", entry->m_read.m_tag)) - error = true ; - if (entry->m_write.m_type == AMH_BANK && !validate_tag(driver, "bank", entry->m_write.m_tag)) - error = true; - if (entry->m_share != NULL && !validate_tag(driver, "share", entry->m_share)) - error = true; + if (entry->m_read.m_type == AMH_BANK) + valid.validate_tag(entry->m_read.m_tag); + if (entry->m_write.m_type == AMH_BANK) + valid.validate_tag(entry->m_write.m_tag); + if (entry->m_share != NULL) + valid.validate_tag(entry->m_share); } // release the address map global_free(map); } } - return error; } diff -Nru mame-0.144/src/emu/dimemory.h mame-0.145/src/emu/dimemory.h --- mame-0.144/src/emu/dimemory.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/dimemory.h 2012-02-06 21:30:28.000000000 +0000 @@ -134,13 +134,16 @@ virtual bool memory_readop(offs_t offset, int size, UINT64 &value); // interface-level overrides - virtual bool interface_validity_check(emu_options &options, const game_driver &driver) const; + virtual void interface_validity_check(validity_checker &valid) const; // configuration address_map_constructor m_address_map[ADDRESS_SPACES]; // address maps for each address space address_space * m_addrspace[ADDRESS_SPACES]; // reported address spaces }; +// iterator +typedef device_interface_iterator memory_interface_iterator; + //************************************************************************** diff -Nru mame-0.144/src/emu/dinetwork.c mame-0.145/src/emu/dinetwork.c --- mame-0.144/src/emu/dinetwork.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/dinetwork.c 2012-02-06 21:30:26.000000000 +0000 @@ -8,6 +8,7 @@ m_dev = NULL; m_bandwidth = bandwidth; set_mac("\0\0\0\0\0\0"); + m_intf = 0; } device_network_interface::~device_network_interface() @@ -46,6 +47,9 @@ void device_network_interface::set_interface(int id) { m_dev = open_netdev(id, this, (int)(m_bandwidth*1000000/8.0/1500)); - if(!m_dev) + if(!m_dev) { logerror("Network interface %d not found\n", id); + id = -1; + } + m_intf = id; } diff -Nru mame-0.144/src/emu/dinetwork.h mame-0.145/src/emu/dinetwork.h --- mame-0.144/src/emu/dinetwork.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/dinetwork.h 2012-02-06 21:30:26.000000000 +0000 @@ -15,6 +15,7 @@ const char *get_mac() { return m_mac; } bool get_promisc() { return m_promisc; } + int get_interface() { return m_intf; } int send(UINT8 *buf, int len); virtual void recv_cb(UINT8 *buf, int len); @@ -25,5 +26,11 @@ char m_mac[6]; float m_bandwidth; class netdev *m_dev; + int m_intf; }; + + +// iterator +typedef device_interface_iterator network_interface_iterator; + #endif diff -Nru mame-0.144/src/emu/dinvram.h mame-0.145/src/emu/dinvram.h --- mame-0.144/src/emu/dinvram.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/dinvram.h 2012-02-06 21:30:28.000000000 +0000 @@ -74,5 +74,8 @@ virtual void nvram_write(emu_file &file) = 0; }; +// iterator +typedef device_interface_iterator nvram_interface_iterator; + #endif /* __DINVRAM_H__ */ diff -Nru mame-0.144/src/emu/dislot.c mame-0.145/src/emu/dislot.c --- mame-0.144/src/emu/dislot.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/dislot.c 2012-02-06 21:30:27.000000000 +0000 @@ -32,12 +32,12 @@ { const char *subtag; device_t *dev = NULL; - if (!device().mconfig().options().exists(device().tag())) { + if (!device().mconfig().options().exists(device().tag()+1)) { subtag = m_default_card; } else { - subtag = device().mconfig().options().value(device().tag()); + subtag = device().mconfig().options().value(device().tag()+1); } - if (subtag) { + if (subtag && strlen(subtag)>0) { device_slot_card_interface *intf = NULL; dev = device().subdevice(subtag); if (dev!=NULL && !dev->interface(intf)) diff -Nru mame-0.144/src/emu/dislot.h mame-0.145/src/emu/dislot.h --- mame-0.144/src/emu/dislot.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/dislot.h 2012-02-06 21:30:27.000000000 +0000 @@ -35,6 +35,8 @@ { NULL, NULL } \ }; +#define SLOT_INTERFACE_EXTERN(name) extern const slot_interface slot_interface_##name[] + class device_slot_card_interface; class device_slot_interface : public device_interface @@ -46,7 +48,8 @@ static void static_set_slot_info(device_t &device, const slot_interface *slots_info, const char *default_card,const input_device_default *default_input); const slot_interface* get_slot_interfaces() const { return m_slot_interfaces; }; - virtual const char * get_default_card(const device_list &devlist, emu_options &options) const { return m_default_card; }; + const char * get_default_card(const machine_config &config, emu_options &options) const { return m_default_card; }; + virtual const char * get_default_card_software(const machine_config &config, emu_options &options) const { return NULL; }; const input_device_default *input_ports_defaults() const { return m_input_defaults; } device_t* get_card_device(); protected: @@ -55,6 +58,9 @@ const slot_interface *m_slot_interfaces; }; +// iterator +typedef device_interface_iterator slot_interface_iterator; + // ======================> device_slot_card_interface class device_slot_card_interface : public device_interface diff -Nru mame-0.144/src/emu/disound.c mame-0.145/src/emu/disound.c --- mame-0.144/src/emu/disound.c 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/disound.c 2012-02-06 21:30:26.000000000 +0000 @@ -103,6 +103,17 @@ //------------------------------------------------- +// stream_alloc - allocate a stream implicitly +// associated with this device +//------------------------------------------------- + +sound_stream *device_sound_interface::stream_alloc(int inputs, int outputs, int sample_rate) +{ + return device().machine().sound().stream_alloc(*this, inputs, outputs, sample_rate); +} + + +//------------------------------------------------- // inputs - return the total number of inputs // for the given device //------------------------------------------------- @@ -221,30 +232,21 @@ // constructed //------------------------------------------------- -bool device_sound_interface::interface_validity_check(emu_options &options, const game_driver &driver) const +void device_sound_interface::interface_validity_check(validity_checker &valid) const { - bool error = false; - // loop over all the routes for (const sound_route *route = first_route(); route != NULL; route = route->next()) { // find a device with the requested tag - const device_t *target = device().mconfig().devicelist().find(route->m_target.cstr()); + const device_t *target = device().siblingdevice(route->m_target.cstr()); if (target == NULL) - { - mame_printf_error("%s: %s attempting to route sound to non-existant device '%s'\n", driver.source_file, driver.name, route->m_target.cstr()); - error = true; - } + mame_printf_error("Attempting to route sound to non-existant device '%s'\n", route->m_target.cstr()); // if it's not a speaker or a sound device, error const device_sound_interface *sound; if (target != NULL && target->type() != SPEAKER && !target->interface(sound)) - { - mame_printf_error("%s: %s attempting to route sound to a non-sound device '%s' (%s)\n", driver.source_file, driver.name, route->m_target.cstr(), target->name()); - error = true; - } + mame_printf_error("Attempting to route sound to a non-sound device '%s' (%s)\n", route->m_target.cstr(), target->name()); } - return error; } @@ -256,8 +258,8 @@ void device_sound_interface::interface_pre_start() { // scan all the sound devices - device_sound_interface *sound = NULL; - for (bool gotone = m_device.machine().devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator iter(m_device.machine().root_device()); + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) { // scan each route on the device for (const sound_route *route = sound->first_route(); route != NULL; route = route->next()) @@ -271,7 +273,7 @@ // now iterate through devices again and assign any auto-allocated inputs m_auto_allocated_inputs = 0; - for (bool gotone = m_device.machine().devicelist().first(sound); gotone; gotone = sound->next(sound)) + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) { // scan each route on the device for (const sound_route *route = sound->first_route(); route != NULL; route = route->next()) @@ -296,8 +298,8 @@ void device_sound_interface::interface_post_start() { // iterate over all the sound devices - device_sound_interface *sound = NULL; - for (bool gotone = m_device.machine().devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator iter(m_device.machine().root_device()); + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) { // scan each route on the device for (const sound_route *route = sound->first_route(); route != NULL; route = route->next()) diff -Nru mame-0.144/src/emu/disound.h mame-0.145/src/emu/disound.h --- mame-0.144/src/emu/disound.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/disound.h 2012-02-06 21:30:26.000000000 +0000 @@ -126,6 +126,9 @@ // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) = 0; + // stream creation + sound_stream *stream_alloc(int inputs, int outputs, int sample_rate); + // helpers int inputs() const; int outputs() const; @@ -135,7 +138,7 @@ protected: // optional operation overrides - virtual bool interface_validity_check(emu_options &options, const game_driver &driver) const; + virtual void interface_validity_check(validity_checker &valid) const; virtual void interface_pre_start(); virtual void interface_post_start(); virtual void interface_pre_reset(); @@ -146,5 +149,7 @@ int m_auto_allocated_inputs; // number of auto-allocated inputs targeting us }; +// iterator +typedef device_interface_iterator sound_interface_iterator; #endif /* __DISOUND_H__ */ diff -Nru mame-0.144/src/emu/distate.c mame-0.145/src/emu/distate.c --- mame-0.144/src/emu/distate.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/distate.c 2012-02-06 21:30:26.000000000 +0000 @@ -489,7 +489,7 @@ // of indexed state from a string //------------------------------------------------- -void device_state_interface::set_state(int index, const char *string) +void device_state_interface::set_state_string(int index, const char *string) { // NULL or out-of-range entry is a no-op const device_state_entry *entry = state_find_entry(index); @@ -517,7 +517,7 @@ assert(symbol != NULL); // allocate new entry - device_state_entry *entry = auto_alloc(device().machine(), device_state_entry(index, symbol, data, size)); + device_state_entry *entry = global_alloc(device_state_entry(index, symbol, data, size)); // append to the end of the list m_state_list.append(*entry); diff -Nru mame-0.144/src/emu/distate.h mame-0.145/src/emu/distate.h --- mame-0.144/src/emu/distate.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/distate.h 2012-02-06 21:30:26.000000000 +0000 @@ -161,7 +161,7 @@ // state setters void set_state(int index, UINT64 value); - void set_state(int index, const char *string); + void set_state_string(int index, const char *string); public: // protected eventually @@ -195,6 +195,9 @@ // fast access to common entries }; +// iterator +typedef device_interface_iterator state_interface_iterator; + //************************************************************************** diff -Nru mame-0.144/src/emu/drawgfx.c mame-0.145/src/emu/drawgfx.c --- mame-0.144/src/emu/drawgfx.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/drawgfx.c 2012-02-06 21:30:26.000000000 +0000 @@ -17,9 +17,11 @@ GLOBAL VARIABLES ***************************************************************************/ -/* if this line errors during compile, the size of NO_PRIORITY is wrong and I need to use something else */ +// if this line errors during compile, the size of NO_PRIORITY is wrong and I need to use something else UINT8 no_priority_size_is_wrong[2 * (sizeof(NO_PRIORITY) == 3) - 1]; +bitmap_ind8 drawgfx_dummy_priority_bitmap; + /*************************************************************************** @@ -39,7 +41,7 @@ offset -------------------------------------------------*/ -INLINE int readbit(const UINT8 *src, unsigned int bitnum) +static inline int readbit(const UINT8 *src, unsigned int bitnum) { return src[bitnum / 8] & (0x80 >> (bitnum % 8)); } @@ -51,9 +53,9 @@ than the width -------------------------------------------------*/ -INLINE INT32 normalize_xscroll(bitmap_t *bitmap, INT32 xscroll) +static inline INT32 normalize_xscroll(bitmap_t &bitmap, INT32 xscroll) { - return (xscroll >= 0) ? xscroll % bitmap->width : (bitmap->width - (-xscroll) % bitmap->width); + return (xscroll >= 0) ? xscroll % bitmap.width() : (bitmap.width() - (-xscroll) % bitmap.width()); } @@ -63,9 +65,9 @@ than the height -------------------------------------------------*/ -INLINE INT32 normalize_yscroll(bitmap_t *bitmap, INT32 yscroll) +static inline INT32 normalize_yscroll(bitmap_t &bitmap, INT32 yscroll) { - return (yscroll >= 0) ? yscroll % bitmap->height : (bitmap->height - (-yscroll) % bitmap->height); + return (yscroll >= 0) ? yscroll % bitmap.height() : (bitmap.height() - (-yscroll) % bitmap.height()); } @@ -84,11 +86,11 @@ const gfx_decode_entry *gfxdecodeinfo = machine.config().m_gfxdecodeinfo; int curgfx; - /* skip if nothing to do */ + // skip if nothing to do if (gfxdecodeinfo == NULL) return; - /* loop over all elements */ + // loop over all elements for (curgfx = 0; curgfx < MAX_GFX_ELEMENTS && gfxdecodeinfo[curgfx].gfxlayout != NULL; curgfx++) { const gfx_decode_entry *gfxdecode = &gfxdecodeinfo[curgfx]; @@ -108,26 +110,26 @@ gfx_layout glcopy; int j; - /* make a copy of the layout */ + // make a copy of the layout glcopy = *gfxdecode->gfxlayout; - /* copy the X and Y offsets into temporary arrays */ + // copy the X and Y offsets into temporary arrays memcpy(extxoffs, glcopy.xoffset, sizeof(glcopy.xoffset)); memcpy(extyoffs, glcopy.yoffset, sizeof(glcopy.yoffset)); - /* if there are extended offsets, copy them over top */ + // if there are extended offsets, copy them over top if (glcopy.extxoffs != NULL) memcpy(extxoffs, glcopy.extxoffs, glcopy.width * sizeof(extxoffs[0])); if (glcopy.extyoffs != NULL) memcpy(extyoffs, glcopy.extyoffs, glcopy.height * sizeof(extyoffs[0])); - /* always use the extended offsets here */ + // always use the extended offsets here glcopy.extxoffs = extxoffs; glcopy.extyoffs = extyoffs; extpoffs = glcopy.planeoffset; - /* expand X and Y by the scale factors */ + // expand X and Y by the scale factors if (xscale > 1) { width *= xscale; @@ -141,17 +143,17 @@ extyoffs[j] = extyoffs[j / yscale]; } - /* if the character count is a region fraction, compute the effective total */ + // if the character count is a region fraction, compute the effective total if (IS_FRAC(total)) { assert(region_length != 0); total = region_length / charincrement * FRAC_NUM(total) / FRAC_DEN(total); } - /* for non-raw graphics, decode the X and Y offsets */ + // for non-raw graphics, decode the X and Y offsets if (!israw) { - /* loop over all the planes, converting fractions */ + // loop over all the planes, converting fractions for (j = 0; j < planes; j++) { UINT32 value1 = extpoffs[j]; @@ -162,7 +164,7 @@ } } - /* loop over all the X/Y offsets, converting fractions */ + // loop over all the X/Y offsets, converting fractions for (j = 0; j < width; j++) { UINT32 value2 = extxoffs[j]; @@ -184,7 +186,7 @@ } } - /* otherwise, just use the line modulo */ + // otherwise, just use the line modulo else { int base = gfxdecode->start; @@ -200,12 +202,12 @@ } } - /* update glcopy */ + // update glcopy glcopy.width = width; glcopy.height = height; glcopy.total = total; - /* allocate the graphics */ + // allocate the graphics machine.gfx[curgfx] = gfx_element_alloc(machine, &glcopy, (region_base != NULL) ? region_base + gfxdecode->start : NULL, gfxdecode->total_color_codes, gfxdecode->color_codes_start); } } @@ -226,10 +228,10 @@ UINT32 total = gl->total; gfx_element *gfx; - /* allocate memory for the gfx_element structure */ + // allocate memory for the gfx_element structure gfx = auto_alloc_clear(machine, gfx_element(machine)); - /* fill in the data */ + // fill in the data gfx->width = width; gfx->height = height; @@ -244,7 +246,7 @@ gfx->srcdata = srcdata; - /* copy the layout */ + // copy the layout gfx->layout = *gl; if (gfx->layout.extxoffs != NULL) { @@ -276,38 +278,36 @@ } } - /* allocate a pen usage array for entries with 32 pens or less */ + // allocate a pen usage array for entries with 32 pens or less if (gfx->color_depth <= 32) gfx->pen_usage = auto_alloc_array(machine, UINT32, gfx->total_elements); - /* allocate a dirty array */ + // allocate a dirty array gfx->dirty = auto_alloc_array(machine, UINT8, gfx->total_elements); memset(gfx->dirty, 1, gfx->total_elements * sizeof(*gfx->dirty)); - /* raw graphics case */ + // raw graphics case if (israw) { - /* modulos are determined for us by the layout */ + // modulos are determined for us by the layout gfx->line_modulo = (gl->extyoffs ? gl->extyoffs[0] : gl->yoffset[0]) / 8; gfx->char_modulo = gl->charincrement / 8; - /* don't free the data because we will get a pointer at decode time */ + // don't free the data because we will get a pointer at decode time gfx->flags |= GFX_ELEMENT_DONT_FREE; - if (planes <= 4) - gfx->flags |= GFX_ELEMENT_PACKED; - /* RAW graphics must have a pointer up front */ + // RAW graphics must have a pointer up front gfx->gfxdata = (UINT8 *)gfx->srcdata; } - /* decoded graphics case */ + // decoded graphics case else { - /* we get to pick our own modulos */ + // we get to pick our own modulos gfx->line_modulo = gfx->origwidth; gfx->char_modulo = gfx->line_modulo * gfx->origheight; - /* allocate memory for the data */ + // allocate memory for the data gfx->gfxdata = auto_alloc_array(machine, UINT8, gfx->total_elements * gfx->char_modulo); } @@ -332,11 +332,11 @@ void gfx_element_free(gfx_element *gfx) { - /* ignore NULL frees */ + // ignore NULL frees if (gfx == NULL) return; - /* free our data */ + // free our data auto_free(gfx->machine(), gfx->layout.extyoffs); auto_free(gfx->machine(), gfx->layout.extxoffs); auto_free(gfx->machine(), gfx->pen_usage); @@ -392,31 +392,19 @@ UINT32 usage = 0; int x, y; - /* if nothing allocated, don't do it */ + // if nothing allocated, don't do it if (gfx->pen_usage == NULL) return; - /* packed case */ - if (gfx->flags & GFX_ELEMENT_PACKED) - for (y = 0; y < gfx->origheight; y++) - { - for (x = 0; x < gfx->origwidth/2; x++) - usage |= (1 << (dp[x] & 0x0f)) | (1 << (dp[x] >> 4)); - - dp += gfx->line_modulo; - } - - /* unpacked case */ - else - for (y = 0; y < gfx->origheight; y++) - { - for (x = 0; x < gfx->origwidth; x++) - usage |= 1 << dp[x]; + for (y = 0; y < gfx->origheight; y++) + { + for (x = 0; x < gfx->origwidth; x++) + usage |= 1 << dp[x]; - dp += gfx->line_modulo; - } + dp += gfx->line_modulo; + } - /* store the final result */ + // store the final result gfx->pen_usage[code] = usage; } @@ -440,54 +428,29 @@ if (!israw) { - /* zap the data to 0 */ + // zap the data to 0 memset(dp, 0, gfx->char_modulo); + for (plane = 0; plane < planes; plane++) + { + int planebit = 1 << (planes - 1 - plane); + int planeoffs = code * charincrement + poffset[plane]; - /* packed case */ - if (gfx->flags & GFX_ELEMENT_PACKED) - for (plane = 0; plane < planes; plane++) - { - int planebit = 1 << (planes - 1 - plane); - int planeoffs = code * charincrement + poffset[plane]; - - for (y = 0; y < gfx->origheight; y++) - { - int yoffs = planeoffs + yoffset[y]; - - dp = gfx->gfxdata + code * gfx->char_modulo + y * gfx->line_modulo; - for (x = 0; x < gfx->origwidth; x += 2) - { - if (readbit(src, yoffs + xoffset[x+0])) - dp[x+0] |= planebit; - if (readbit(src, yoffs + xoffset[x+1])) - dp[x+1] |= planebit; - } - } - } - - /* unpacked case */ - else - for (plane = 0; plane < planes; plane++) + for (y = 0; y < gfx->origheight; y++) { - int planebit = 1 << (planes - 1 - plane); - int planeoffs = code * charincrement + poffset[plane]; + int yoffs = planeoffs + yoffset[y]; - for (y = 0; y < gfx->origheight; y++) - { - int yoffs = planeoffs + yoffset[y]; - - dp = gfx->gfxdata + code * gfx->char_modulo + y * gfx->line_modulo; - for (x = 0; x < gfx->origwidth; x++) - if (readbit(src, yoffs + xoffset[x])) - dp[x] |= planebit; - } + dp = gfx->gfxdata + code * gfx->char_modulo + y * gfx->line_modulo; + for (x = 0; x < gfx->origwidth; x++) + if (readbit(src, yoffs + xoffset[x])) + dp[x] |= planebit; } + } } - /* compute pen usage */ + // compute pen usage calc_penusage(gfx, code); - /* no longer dirty */ + // no longer dirty gfx->dirty[code] = 0; } @@ -501,26 +464,22 @@ no transparency -------------------------------------------------*/ -void drawgfx_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* get final code and color, and grab lookup tables */ + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); +} - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); +void drawgfx_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty) +{ + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); } @@ -529,51 +488,60 @@ a single transparent pen -------------------------------------------------*/ -void drawgfx_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* special case invalid pens to opaque */ + // special case invalid pens to opaque if (transpen > 0xff) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~(1 << transpen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << transpen)) == 0) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; +void drawgfx_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 transpen) +{ + // special case invalid pens to opaque + if (transpen > 0xff) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - /* use pen usage to optimize */ + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~(1 << transpen)) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & (1 << transpen)) == 0) - { - drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - return; - } + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); } - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); } @@ -583,28 +551,32 @@ lookups -------------------------------------------------*/ -void drawgfx_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + // early out if completely transparent + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) + return; - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ +void drawgfx_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 transpen) +{ + // early out if completely transparent code %= gfx->total_elements; - - /* early out if completely transparent */ if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); + // render + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); } @@ -614,51 +586,60 @@ a mask -------------------------------------------------*/ -void drawgfx_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transmask) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* special case 0 mask to opaque */ + // special case 0 mask to opaque if (transmask == 0) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~transmask) == 0) + return; + + // fully opaque; draw as such + if ((usage & transmask) == 0) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; +void drawgfx_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 transmask) +{ + // special case 0 mask to opaque + if (transmask == 0) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - /* use pen usage to optimize */ + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~transmask) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & transmask) == 0) - { - drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - return; - } + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); } - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); } @@ -668,28 +649,30 @@ transparent, opaque, or shadowing -------------------------------------------------*/ -void drawgfx_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, const UINT8 *pentable, const pen_t *shadowtable) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); assert(pentable != NULL); - /* get final code and color, and grab lookup tables */ + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16, NO_PRIORITY); +} - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32, NO_PRIORITY); +void drawgfx_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + const UINT8 *pentable, const pen_t *shadowtable) +{ + assert(pentable != NULL); + + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32, NO_PRIORITY); } @@ -699,38 +682,23 @@ remaining pixels with a fixed alpha value -------------------------------------------------*/ -void drawgfx_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfx_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen, UINT8 alpha) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* special case alpha = 0xff */ + // special case alpha = 0xff if (alpha == 0xff) - { - drawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - return; - } + return drawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* get final code and color, and grab lookup tables */ + // early out if completely transparent code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; - - /* early out if completely transparent */ if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_ALPHA16, NO_PRIORITY); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32, NO_PRIORITY); + // get final code and color, and grab lookup tables + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32, NO_PRIORITY); } @@ -744,34 +712,34 @@ element with no transparency -------------------------------------------------*/ -void drawgfxzoom_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - /* non-zoom case */ + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); +} + +void drawgfxzoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley) +{ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - return; - } + return drawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty); - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; - - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); } @@ -780,58 +748,68 @@ element with a single transparent pen -------------------------------------------------*/ -void drawgfxzoom_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - return; - } + return drawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - /* special case invalid pens to opaque */ + // special case invalid pens to opaque if (transpen > 0xff) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~(1 << transpen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << transpen)) == 0) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; +void drawgfxzoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, UINT32 transpen) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return drawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - /* use pen usage to optimize */ + // special case invalid pens to opaque + if (transpen > 0xff) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~(1 << transpen)) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & (1 << transpen)) == 0) - { - drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); - return; - } + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); } - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN, NO_PRIORITY); } @@ -841,35 +819,40 @@ color lookups -------------------------------------------------*/ -void drawgfxzoom_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); + return drawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); + + // early out if completely transparent + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; +void drawgfxzoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, UINT32 transpen) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return drawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen); - /* early out if completely transparent */ + // early out if completely transparent + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); + // render + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN, NO_PRIORITY); } @@ -879,58 +862,68 @@ provided as a mask -------------------------------------------------*/ -void drawgfxzoom_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transmask) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transmask); - return; - } + return drawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transmask); - /* special case 0 mask to opaque */ + // special case 0 mask to opaque if (transmask == 0) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~transmask) == 0) + return; + + // fully opaque; draw as such + if ((usage & transmask) == 0) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); +} - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; +void drawgfxzoom_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, UINT32 transmask) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return drawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transmask); - /* use pen usage to optimize */ + // special case 0 mask to opaque + if (transmask == 0) + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~transmask) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & transmask) == 0) - { - drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); - return; - } + return drawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley); } - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK, NO_PRIORITY); } @@ -940,35 +933,38 @@ are transparent, opaque, or shadowing -------------------------------------------------*/ -void drawgfxzoom_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, const UINT8 *pentable, const pen_t *shadowtable) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; + assert(pentable != NULL); - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, pentable, shadowtable); - return; - } + return drawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, pentable, shadowtable); + + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16, NO_PRIORITY); +} - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); +void drawgfxzoom_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, const UINT8 *pentable, const pen_t *shadowtable) +{ assert(pentable != NULL); - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return drawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, pentable, shadowtable); - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32, NO_PRIORITY); } @@ -978,45 +974,27 @@ the remaining pixels with a fixed alpha value -------------------------------------------------*/ -void drawgfxzoom_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void drawgfxzoom_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen, UINT8 alpha) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - drawgfx_alpha(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen, alpha); - return; - } + return drawgfx_alpha(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, transpen, alpha); - /* special case alpha = 0xff */ + // special case alpha = 0xff if (alpha == 0xff) - { - drawgfxzoom_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, transpen); - return; - } - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + return drawgfxzoom_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, transpen); - /* get final code and color, and grab lookup tables */ + // early out if completely transparent code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; - - /* early out if completely transparent */ if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_ALPHA16, NO_PRIORITY); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32, NO_PRIORITY); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DECLARE_NO_PRIORITY; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32, NO_PRIORITY); } @@ -1031,29 +1009,30 @@ bitmap -------------------------------------------------*/ -void pdrawgfx_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask) + bitmap_ind8 &priority, UINT32 pmask) { - const pen_t *paldata; - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); +} - /* high bit of the mask is implicitly on */ +void pdrawgfx_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + bitmap_ind8 &priority, UINT32 pmask) +{ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); } @@ -1063,53 +1042,64 @@ priority bitmap -------------------------------------------------*/ -void pdrawgfx_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, UINT32 transpen) + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { - const pen_t *paldata; - - /* special case invalid pens to opaque */ + // special case invalid pens to opaque if (transpen > 0xff) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~(1 << transpen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << transpen)) == 0) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); +} - /* use pen usage to optimize */ +void pdrawgfx_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) +{ + // special case invalid pens to opaque + if (transpen > 0xff) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~(1 << transpen)) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & (1 << transpen)) == 0) - { - pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - return; - } + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); } - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); } @@ -1119,29 +1109,36 @@ lookups, checking against the priority bitmap -------------------------------------------------*/ -void pdrawgfx_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, UINT32 transpen) + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* get final code and color, and grab lookup tables */ + // early out if completely transparent code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) + return; + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + DRAWGFX_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); +} - /* early out if completely transparent */ +void pdrawgfx_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) +{ + // early out if completely transparent + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); + // render + DRAWGFX_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); } @@ -1151,53 +1148,64 @@ a mask, checking against the priority bitmap -------------------------------------------------*/ -void pdrawgfx_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, UINT32 transmask) + bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask) { - const pen_t *paldata; - - /* special case 0 mask to opaque */ + // special case 0 mask to opaque if (transmask == 0) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~transmask) == 0) + return; + + // fully opaque; draw as such + if ((usage & transmask) == 0) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); +} - /* use pen usage to optimize */ +void pdrawgfx_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask) +{ + // special case 0 mask to opaque + if (transmask == 0) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~transmask) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & transmask) == 0) - { - pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - return; - } + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); } - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); } @@ -1208,30 +1216,34 @@ against the priority bitmap -------------------------------------------------*/ -void pdrawgfx_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable) + bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable) { - const pen_t *paldata; - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); assert(pentable != NULL); - /* get final code and color, and grab lookup tables */ + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16_PRIORITY, UINT8); +} + +void pdrawgfx_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable) +{ + assert(pentable != NULL); - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32_PRIORITY, UINT8); } @@ -1242,40 +1254,25 @@ checking against the priority bitmap -------------------------------------------------*/ -void pdrawgfx_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfx_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, UINT32 transpen, UINT8 alpha) + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen, UINT8 alpha) { - const pen_t *paldata; - - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* special case alpha = 0xff */ + // special case alpha = 0xff if (alpha == 0xff) - { - pdrawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); - return; - } + return pdrawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); - /* get final code and color, and grab lookup tables */ + // early out if completely transparent code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; - - /* early out if completely transparent */ if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFX_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_ALPHA16_PRIORITY, UINT8); - else - DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFX_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32_PRIORITY, UINT8); } @@ -1290,36 +1287,38 @@ the priority bitmap -------------------------------------------------*/ -void pdrawgfxzoom_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask) + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask) { - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - return; - } + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); +} - /* high bit of the mask is implicitly on */ +void pdrawgfxzoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return pdrawgfx_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask); + + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE_PRIORITY, UINT8); } @@ -1329,61 +1328,74 @@ checking against the priority bitmap -------------------------------------------------*/ -void pdrawgfxzoom_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); - return; - } + return pdrawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); - /* special case invalid pens to opaque */ + // special case invalid pens to opaque if (transpen > 0xff) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~(1 << transpen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << transpen)) == 0) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); +} - /* use pen usage to optimize */ +void pdrawgfxzoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, + UINT32 transpen) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return pdrawgfx_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); + + // special case invalid pens to opaque + if (transpen > 0xff) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~(1 << transpen)) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & (1 << transpen)) == 0) - { - pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); - return; - } + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); } - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_PRIORITY, UINT8); } @@ -1394,37 +1406,46 @@ bitmap -------------------------------------------------*/ -void pdrawgfxzoom_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); + return pdrawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); + + // early out if completely transparent + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; + // render + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); +} - /* early out if completely transparent */ +void pdrawgfxzoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, + UINT32 transpen) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return pdrawgfx_transpen_raw(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen); + + // early out if completely transparent + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); + // render + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REBASE_TRANSPEN_PRIORITY, UINT8); } @@ -1435,61 +1456,74 @@ priority bitmap -------------------------------------------------*/ -void pdrawgfxzoom_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask) { - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transmask); - return; - } + return pdrawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transmask); - /* special case 0 mask to opaque */ + // special case 0 mask to opaque if (transmask == 0) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; + if (gfx->pen_usage != NULL && !gfx->dirty[code]) { - pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); - return; + // fully transparent; do nothing + UINT32 usage = gfx->pen_usage[code]; + if ((usage & ~transmask) == 0) + return; + + // fully opaque; draw as such + if ((usage & transmask) == 0) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); } - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ - code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); +} - /* use pen usage to optimize */ +void pdrawgfxzoom_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, + UINT32 transmask) +{ + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return pdrawgfx_transmask(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transmask); + + // special case 0 mask to opaque + if (transmask == 0) + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); + + // use pen usage to optimize + code %= gfx->total_elements; if (gfx->pen_usage != NULL && !gfx->dirty[code]) { + // fully transparent; do nothing UINT32 usage = gfx->pen_usage[code]; - - /* fully transparent; do nothing */ if ((usage & ~transmask) == 0) return; - /* fully opaque; draw as such */ + // fully opaque; draw as such if ((usage & transmask) == 0) - { - pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); - return; - } + return pdrawgfxzoom_opaque(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask); } - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSMASK_PRIORITY, UINT8); } @@ -1500,38 +1534,44 @@ checking against the priority bitmap -------------------------------------------------*/ -void pdrawgfxzoom_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable) { - const pen_t *paldata; + assert(pentable != NULL); - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, pentable, shadowtable); - return; - } + return pdrawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, pentable, shadowtable); - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - assert(pentable != NULL); + // high bit of the mask is implicitly on + pmask |= 1 << 31; - /* get final code and color, and grab lookup tables */ + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; + DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16_PRIORITY, UINT8); +} - /* high bit of the mask is implicitly on */ +void pdrawgfxzoom_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, + const UINT8 *pentable, const pen_t *shadowtable) +{ + assert(pentable != NULL); + + // non-zoom case + if (scalex == 0x10000 && scaley == 0x10000) + return pdrawgfx_transtable(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, pentable, shadowtable); + + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSTABLE16_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + code %= gfx->total_elements; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSTABLE32_PRIORITY, UINT8); } @@ -1543,48 +1583,30 @@ bitmap -------------------------------------------------*/ -void pdrawgfxzoom_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +void pdrawgfxzoom_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen, UINT8 alpha) { - const pen_t *paldata; - - /* non-zoom case */ + // non-zoom case if (scalex == 0x10000 && scaley == 0x10000) - { - pdrawgfx_alpha(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen, alpha); - return; - } + return pdrawgfx_alpha(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, priority, pmask, transpen, alpha); - /* special case alpha = 0xff */ + // special case alpha = 0xff if (alpha == 0xff) - { - pdrawgfxzoom_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask, transpen); - return; - } + return pdrawgfxzoom_transpen(dest, cliprect, gfx, code, color, flipx, flipy, destx, desty, scalex, scaley, priority, pmask, transpen); - assert(dest != NULL); - assert(dest->bpp == 16 || dest->bpp == 32); - assert(gfx != NULL); - - /* get final code and color, and grab lookup tables */ + // early out if completely transparent code %= gfx->total_elements; - color %= gfx->total_colors; - paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * color]; - - /* early out if completely transparent */ if (gfx->pen_usage != NULL && !gfx->dirty[code] && (gfx->pen_usage[code] & ~(1 << transpen)) == 0) return; - /* high bit of the mask is implicitly on */ + // high bit of the mask is implicitly on pmask |= 1 << 31; - /* render based on dest bitmap depth */ - if (dest->bpp == 16) - DRAWGFXZOOM_CORE(UINT16, PIXEL_OP_REMAP_TRANSPEN_ALPHA16_PRIORITY, UINT8); - else - DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32_PRIORITY, UINT8); + // render + const pen_t *paldata = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; + DRAWGFXZOOM_CORE(UINT32, PIXEL_OP_REMAP_TRANSPEN_ALPHA32_PRIORITY, UINT8); } @@ -1598,32 +1620,30 @@ buffer to a single scanline of a bitmap -------------------------------------------------*/ -void draw_scanline8(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata) +void draw_scanline8(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; + + // palette lookup case + if (paldata != NULL) + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + // raw copy case + else + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +} + +void draw_scanline8(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata) +{ + DECLARE_NO_PRIORITY; - /* palette lookup case */ + // palette lookup case if (paldata != NULL) - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - /* raw copy case */ + // raw copy case else - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); } @@ -1632,32 +1652,30 @@ buffer to a single scanline of a bitmap -------------------------------------------------*/ -void draw_scanline16(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata) +void draw_scanline16(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; + + // palette lookup case + if (paldata != NULL) + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + // raw copy case + else + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +} - /* palette lookup case */ +void draw_scanline16(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata) +{ + DECLARE_NO_PRIORITY; + + // palette lookup case if (paldata != NULL) - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - /* raw copy case */ + // raw copy case else - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); } @@ -1666,32 +1684,30 @@ buffer to a single scanline of a bitmap -------------------------------------------------*/ -void draw_scanline32(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata) +void draw_scanline32(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + // palette lookup case + if (paldata != NULL) + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); + + // raw copy case + else + DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +} - /* palette lookup case */ +void draw_scanline32(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata) +{ + DECLARE_NO_PRIORITY; + + // palette lookup case if (paldata != NULL) - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_REMAP_OPAQUE, NO_PRIORITY); - /* raw copy case */ + // raw copy case else - { - /* 16bpp case */ - if (bitmap->bpp == 16) - DRAWSCANLINE_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - } + DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); } @@ -1705,16 +1721,14 @@ scanline of a bitmap to an 8bpp buffer -------------------------------------------------*/ -void extract_scanline8(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr) +void extract_scanline8(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr) { - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + EXTRACTSCANLINE_CORE(UINT16); +} - /* 16bpp case */ - if (bitmap->bpp == 16) - EXTRACTSCANLINE_CORE(UINT16); - else - EXTRACTSCANLINE_CORE(UINT32); +void extract_scanline8(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr) +{ + EXTRACTSCANLINE_CORE(UINT32); } @@ -1723,16 +1737,14 @@ scanline of a bitmap to a 16bpp buffer -------------------------------------------------*/ -void extract_scanline16(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr) +void extract_scanline16(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr) { - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + EXTRACTSCANLINE_CORE(UINT16); +} - /* 16bpp case */ - if (bitmap->bpp == 16) - EXTRACTSCANLINE_CORE(UINT16); - else - EXTRACTSCANLINE_CORE(UINT32); +void extract_scanline16(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr) +{ + EXTRACTSCANLINE_CORE(UINT32); } @@ -1741,16 +1753,14 @@ scanline of a bitmap to a 32bpp buffer -------------------------------------------------*/ -void extract_scanline32(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr) +void extract_scanline32(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr) { - assert(bitmap != NULL); - assert(bitmap->bpp == 16 || bitmap->bpp == 32); + EXTRACTSCANLINE_CORE(UINT16); +} - /* 16bpp case */ - if (bitmap->bpp == 16) - EXTRACTSCANLINE_CORE(UINT16); - else - EXTRACTSCANLINE_CORE(UINT32); +void extract_scanline32(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr) +{ + EXTRACTSCANLINE_CORE(UINT32); } @@ -1764,21 +1774,16 @@ copying all unclipped pixels -------------------------------------------------*/ -void copybitmap(bitmap_t *dest, bitmap_t *src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle *cliprect) +void copybitmap(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; + COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +} - assert(dest != NULL); - assert(src != NULL); - assert(dest->bpp == 8 || dest->bpp == 16 || dest->bpp == 32); - assert(src->bpp == dest->bpp); - - if (dest->bpp == 8) - COPYBITMAP_CORE(UINT8, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else if (dest->bpp == 16) - COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else - COPYBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +void copybitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect) +{ + DECLARE_NO_PRIORITY; + COPYBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); } @@ -1788,36 +1793,22 @@ those that match transpen -------------------------------------------------*/ -void copybitmap_trans(bitmap_t *dest, bitmap_t *src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle *cliprect, UINT32 transpen) +void copybitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ - - assert(dest != NULL); - assert(src != NULL); - assert(dest->bpp == 8 || dest->bpp == 16 || dest->bpp == 32); - assert(src->bpp == dest->bpp); + DECLARE_NO_PRIORITY; + if (transpen > 0xffff) + copybitmap(dest, src, flipx, flipy, destx, desty, cliprect); + else + COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); +} - if (dest->bpp == 8) - { - if (transpen > 0xff) - copybitmap(dest, src, flipx, flipy, destx, desty, cliprect); - else - COPYBITMAP_CORE(UINT8, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); - } - else if (dest->bpp == 16) - { - if (transpen > 0xffff) - copybitmap(dest, src, flipx, flipy, destx, desty, cliprect); - else - COPYBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); - } +void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen) +{ + DECLARE_NO_PRIORITY; + if (transpen == 0xffffffff) + copybitmap(dest, src, flipx, flipy, destx, desty, cliprect); else - { - if (transpen == 0xffffffff) - copybitmap(dest, src, flipx, flipy, destx, desty, cliprect); - else - COPYBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); - } + COPYBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); } @@ -1829,13 +1820,20 @@ /*------------------------------------------------- copyscrollbitmap - copy from one bitmap to another, copying all unclipped pixels, and - applying scrolling to one or more rows/colums + applying scrolling to one or more rows/columns -------------------------------------------------*/ -void copyscrollbitmap(bitmap_t *dest, bitmap_t *src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle *cliprect) +void copyscrollbitmap(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect) +{ + // just call through to the transparent case as the underlying copybitmap will + // optimize for pen == 0xffffffff + copyscrollbitmap_trans(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, 0xffffffff); +} + +void copyscrollbitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect) { - /* just call through to the transparent case as the underlying copybitmap will - optimize for pen == 0xffffffff */ + // just call through to the transparent case as the underlying copybitmap will + // optimize for pen == 0xffffffff copyscrollbitmap_trans(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, 0xffffffff); } @@ -1844,121 +1842,114 @@ copyscrollbitmap_trans - copy from one bitmap to another, copying all unclipped pixels except those that match transpen, and applying - scrolling to one or more rows/colums + scrolling to one or more rows/columns -------------------------------------------------*/ -void copyscrollbitmap_trans(bitmap_t *dest, bitmap_t *src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle *cliprect, UINT32 transpen) +template +static inline void copyscrollbitmap_trans_common(_BitmapClass &dest, _BitmapClass &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen) { - /* no rowscroll and no colscroll means no scroll */ + // no rowscroll and no colscroll means no scroll if (numrows == 0 && numcols == 0) - { - copybitmap_trans(dest, src, 0, 0, 0, 0, cliprect, transpen); - return; - } + return copybitmap_trans(dest, src, 0, 0, 0, 0, cliprect, transpen); - assert(dest != NULL); - assert(src != NULL); - assert(dest->bpp == 8 || dest->bpp == 16 || dest->bpp == 32); - assert(dest->bpp == src->bpp); assert(numrows != 0 || rowscroll == NULL); assert(numrows == 0 || rowscroll != NULL); assert(numcols != 0 || colscroll == NULL); assert(numcols == 0 || colscroll != NULL); - /* NULL clip means use the full bitmap */ - if (cliprect == NULL) - cliprect = &dest->cliprect; - - /* fully scrolling X,Y playfield */ + // fully scrolling X,Y playfield if (numrows <= 1 && numcols <= 1) { INT32 xscroll = normalize_xscroll(src, (numrows == 0) ? 0 : rowscroll[0]); INT32 yscroll = normalize_yscroll(src, (numcols == 0) ? 0 : colscroll[0]); - INT32 sx, sy; - /* iterate over all portions of the scroll that overlap the destination */ - for (sx = xscroll - src->width; sx < dest->width; sx += src->width) - for (sy = yscroll - src->height; sy < dest->height; sy += src->height) + // iterate over all portions of the scroll that overlap the destination + for (INT32 sx = xscroll - src.width(); sx < dest.width(); sx += src.width()) + for (INT32 sy = yscroll - src.height(); sy < dest.height(); sy += src.height()) copybitmap_trans(dest, src, 0, 0, sx, sy, cliprect, transpen); } - /* scrolling columns plus horizontal scroll */ + // scrolling columns plus horizontal scroll else if (numrows <= 1) { INT32 xscroll = normalize_xscroll(src, (numrows == 0) ? 0 : rowscroll[0]); - rectangle subclip = *cliprect; - int col, colwidth, groupcols; + rectangle subclip = cliprect; - /* determine width of each column */ - colwidth = src->width / numcols; - assert(src->width % colwidth == 0); - - /* iterate over each column */ - for (col = 0; col < numcols; col += groupcols) + // determine width of each column + int colwidth = src.width() / numcols; + assert(src.width() % colwidth == 0); + + // iterate over each column + int groupcols; + for (int col = 0; col < numcols; col += groupcols) { INT32 yscroll = colscroll[col]; - INT32 sx, sy; - /* count consecutive columns scrolled by the same amount */ + // count consecutive columns scrolled by the same amount for (groupcols = 1; col + groupcols < numcols; groupcols++) if (colscroll[col + groupcols] != yscroll) break; - /* iterate over reps of the columns in question */ + // iterate over reps of the columns in question yscroll = normalize_yscroll(src, yscroll); - for (sx = xscroll - src->width; sx < dest->width; sx += src->width) + for (INT32 sx = xscroll - src.width(); sx < dest.width(); sx += src.width()) { - /* compute the cliprect for this group */ + // compute the cliprect for this group subclip.min_x = col * colwidth + sx; subclip.max_x = (col + groupcols) * colwidth - 1 + sx; - sect_rect(&subclip, cliprect); + subclip &= cliprect; - /* iterate over all portions of the scroll that overlap the destination */ - for (sy = yscroll - src->height; sy < dest->height; sy += src->height) - copybitmap_trans(dest, src, 0, 0, sx, sy, &subclip, transpen); + // iterate over all portions of the scroll that overlap the destination + for (INT32 sy = yscroll - src.height(); sy < dest.height(); sy += src.height()) + copybitmap_trans(dest, src, 0, 0, sx, sy, subclip, transpen); } } } - /* scrolling rows plus vertical scroll */ + // scrolling rows plus vertical scroll else if (numcols <= 1) { INT32 yscroll = normalize_yscroll(src, (numcols == 0) ? 0 : colscroll[0]); - rectangle subclip = *cliprect; - int row, rowheight, grouprows; - - /* determine width of each rows */ - rowheight = src->height / numrows; - assert(src->height % rowheight == 0); + rectangle subclip = cliprect; - /* iterate over each row */ - for (row = 0; row < numrows; row += grouprows) + // determine width of each rows + int rowheight = src.height() / numrows; + assert(src.height() % rowheight == 0); + + // iterate over each row + int grouprows; + for (int row = 0; row < numrows; row += grouprows) { INT32 xscroll = rowscroll[row]; - INT32 sx, sy; - /* count consecutive rows scrolled by the same amount */ + // count consecutive rows scrolled by the same amount for (grouprows = 1; row + grouprows < numrows; grouprows++) if (rowscroll[row + grouprows] != xscroll) break; - /* iterate over reps of the rows in question */ + // iterate over reps of the rows in question xscroll = normalize_xscroll(src, xscroll); - for (sy = yscroll - src->height; sy < dest->height; sy += src->height) + for (INT32 sy = yscroll - src.height(); sy < dest.height(); sy += src.height()) { - /* compute the cliprect for this group */ + // compute the cliprect for this group subclip.min_y = row * rowheight + sy; subclip.max_y = (row + grouprows) * rowheight - 1 + sy; - sect_rect(&subclip, cliprect); + subclip &= cliprect; - /* iterate over all portions of the scroll that overlap the destination */ - for (sx = xscroll - src->width; sx < dest->width; sx += src->width) - copybitmap_trans(dest, src, 0, 0, sx, sy, &subclip, transpen); + // iterate over all portions of the scroll that overlap the destination + for (INT32 sx = xscroll - src.width(); sx < dest.width(); sx += src.width()) + copybitmap_trans(dest, src, 0, 0, sx, sy, subclip, transpen); } } } } +void copyscrollbitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen) +{ copyscrollbitmap_trans_common(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, transpen); } + +void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen) +{ copyscrollbitmap_trans_common(dest, src, numrows, rowscroll, numcols, colscroll, cliprect, transpen); } + /*************************************************************************** @@ -1971,21 +1962,16 @@ pixels -------------------------------------------------*/ -void copyrozbitmap(bitmap_t *dest, const rectangle *cliprect, bitmap_t *src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound) +void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; + COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +} - assert(dest != NULL); - assert(src != NULL); - assert(dest->bpp == 8 || dest->bpp == 16 || dest->bpp == 32); - assert(src->bpp == dest->bpp); - - if (dest->bpp == 8) - COPYROZBITMAP_CORE(UINT8, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else if (dest->bpp == 16) - COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); - else - COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); +void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound) +{ + DECLARE_NO_PRIORITY; + COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_OPAQUE, NO_PRIORITY); } @@ -1996,19 +1982,14 @@ transpen -------------------------------------------------*/ -void copyrozbitmap_trans(bitmap_t *dest, const rectangle *cliprect, bitmap_t *src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transpen) +void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transpen) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; + COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); +} - assert(dest != NULL); - assert(src != NULL); - assert(dest->bpp == 8 || dest->bpp == 16 || dest->bpp == 32); - assert(src->bpp == dest->bpp); - - if (dest->bpp == 8) - COPYROZBITMAP_CORE(UINT8, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); - else if (dest->bpp == 16) - COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); - else - COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); +void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transpen) +{ + DECLARE_NO_PRIORITY; + COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN, NO_PRIORITY); } diff -Nru mame-0.144/src/emu/drawgfx.h mame-0.145/src/emu/drawgfx.h --- mame-0.144/src/emu/drawgfx.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/drawgfx.h 2012-02-06 21:30:26.000000000 +0000 @@ -31,8 +31,7 @@ #define EXTENDED_XOFFS { 0 } #define EXTENDED_YOFFS { 0 } -#define GFX_ELEMENT_PACKED 1 /* two 4bpp pixels are packed in one byte of gfxdata */ -#define GFX_ELEMENT_DONT_FREE 2 /* gfxdata was not malloc()ed, so don't free it on exit */ +#define GFX_ELEMENT_DONT_FREE 1 /* gfxdata was not malloc()ed, so don't free it on exit */ #define GFX_RAW 0x12345678 /* When planeoffset[0] is set to GFX_RAW, the gfx data is left as-is, with no conversion. @@ -41,7 +40,6 @@ xoffset[0] is an optional displacement (*8) from the beginning of the source data, while yoffset[0] is the line modulo (*8) and charincrement the char modulo (*8). They are *8 for consistency with the usual behaviour, but the bottom 3 bits are not used. - GFX_ELEMENT_PACKED is automatically set if planes is <= 4. This special mode can be used to save memory in games that require several different handlings of the same ROM data (e.g. metro.c can use both 4bpp and 8bpp tiles, and both @@ -92,8 +90,8 @@ #define GFXDECODE_END { 0 } }; /* these macros are used for declaring gfx_layout structures. */ -#define GFXLAYOUT_RAW( name, planes, width, height, linemod, charmod ) \ -const gfx_layout name = { width, height, RGN_FRAC(1,1), planes, { GFX_RAW }, { 0 }, { linemod }, charmod }; +#define GFXLAYOUT_RAW( name, width, height, linemod, charmod ) \ +const gfx_layout name = { width, height, RGN_FRAC(1,1), 8, { GFX_RAW }, { 0 }, { linemod }, charmod }; @@ -142,7 +140,7 @@ UINT32 * pen_usage; /* bitmask of pens that are used (pens 0-31 only) */ - UINT8 * gfxdata; /* pixel data, 8bpp or 4bpp (if GFX_ELEMENT_PACKED) */ + UINT8 * gfxdata; /* pixel data, 8bpp */ UINT32 line_modulo; /* bytes between each row of data */ UINT32 char_modulo; /* bytes between each element */ const UINT8 * srcdata; /* pointer to the source data for decoding */ @@ -196,84 +194,112 @@ /* ----- core graphics drawing ----- */ /* specific drawgfx implementations for each transparency type */ -void drawgfx_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty); -void drawgfx_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); -void drawgfx_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); -void drawgfx_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transmask); -void drawgfx_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, const UINT8 *pentable, const pen_t *shadowtable); -void drawgfx_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen, UINT8 alpha); +void drawgfx_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty); +void drawgfx_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty); +void drawgfx_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); +void drawgfx_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); +void drawgfx_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); +void drawgfx_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen); +void drawgfx_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transmask); +void drawgfx_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transmask); +void drawgfx_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, const UINT8 *pentable, const pen_t *shadowtable); +void drawgfx_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, const UINT8 *pentable, const pen_t *shadowtable); +void drawgfx_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 transpen, UINT8 alpha); /* ----- zoomed graphics drawing ----- */ /* specific drawgfxzoom implementations for each transparency type */ -void drawgfxzoom_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley); -void drawgfxzoom_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); -void drawgfxzoom_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); -void drawgfxzoom_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transmask); -void drawgfxzoom_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, const UINT8 *pentable, const pen_t *shadowtable); -void drawgfxzoom_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen, UINT8 alpha); +void drawgfxzoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley); +void drawgfxzoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley); +void drawgfxzoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); +void drawgfxzoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); +void drawgfxzoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); +void drawgfxzoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen); +void drawgfxzoom_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transmask); +void drawgfxzoom_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transmask); +void drawgfxzoom_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, const UINT8 *pentable, const pen_t *shadowtable); +void drawgfxzoom_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, const UINT8 *pentable, const pen_t *shadowtable); +void drawgfxzoom_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, UINT32 transpen, UINT8 alpha); /* ----- priority masked graphics drawing ----- */ /* specific pdrawgfx implementations for each transparency type */ -void pdrawgfx_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask); -void pdrawgfx_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask, UINT32 transpen); -void pdrawgfx_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask, UINT32 transpen); -void pdrawgfx_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask, UINT32 transmask); -void pdrawgfx_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); -void pdrawgfx_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_t *priority, UINT32 pmask, UINT32 transpen, UINT8 alpha); +void pdrawgfx_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask); +void pdrawgfx_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask); +void pdrawgfx_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfx_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfx_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfx_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfx_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask); +void pdrawgfx_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask); +void pdrawgfx_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); +void pdrawgfx_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); +void pdrawgfx_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen, UINT8 alpha); /* ----- priority masked zoomed graphics drawing ----- */ /* specific pdrawgfxzoom implementations for each transparency type */ -void pdrawgfxzoom_opaque(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask); -void pdrawgfxzoom_transpen(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, UINT32 transpen); -void pdrawgfxzoom_transpen_raw(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, UINT32 transpen); -void pdrawgfxzoom_transmask(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, UINT32 transmask); -void pdrawgfxzoom_transtable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); -void pdrawgfxzoom_alpha(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, UINT32 transpen, UINT8 alpha); +void pdrawgfxzoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask); +void pdrawgfxzoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask); +void pdrawgfxzoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfxzoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfxzoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfxzoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen); +void pdrawgfxzoom_transmask(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask); +void pdrawgfxzoom_transmask(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transmask); +void pdrawgfxzoom_transtable(bitmap_ind16 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); +void pdrawgfxzoom_transtable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, const UINT8 *pentable, const pen_t *shadowtable); +void pdrawgfxzoom_alpha(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen, UINT8 alpha); /* ----- scanline copying ----- */ /* copy pixels from an 8bpp buffer to a single scanline of a bitmap */ -void draw_scanline8(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata); +void draw_scanline8(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata); +void draw_scanline8(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT8 *srcptr, const pen_t *paldata); /* copy pixels from a 16bpp buffer to a single scanline of a bitmap */ -void draw_scanline16(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata); +void draw_scanline16(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata); +void draw_scanline16(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT16 *srcptr, const pen_t *paldata); /* copy pixels from a 32bpp buffer to a single scanline of a bitmap */ -void draw_scanline32(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata); +void draw_scanline32(bitmap_ind16 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata); +void draw_scanline32(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, const pen_t *paldata); /* ----- scanline extraction ----- */ /* copy pixels from a single scanline of a bitmap to an 8bpp buffer */ -void extract_scanline8(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr); +void extract_scanline8(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr); +void extract_scanline8(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT8 *destptr); /* copy pixels from a single scanline of a bitmap to a 16bpp buffer */ -void extract_scanline16(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr); +void extract_scanline16(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr); +void extract_scanline16(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT16 *destptr); /* copy pixels from a single scanline of a bitmap to a 32bpp buffer */ -void extract_scanline32(bitmap_t *bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr); +void extract_scanline32(bitmap_ind16 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr); +void extract_scanline32(bitmap_rgb32 &bitmap, INT32 srcx, INT32 srcy, INT32 length, UINT32 *destptr); /* ----- bitmap copying ----- */ /* copy from one bitmap to another, copying all unclipped pixels */ -void copybitmap(bitmap_t *dest, bitmap_t *src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle *cliprect); +void copybitmap(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect); +void copybitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect); /* copy from one bitmap to another, copying all unclipped pixels except those that match transpen */ -void copybitmap_trans(bitmap_t *dest, bitmap_t *src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle *cliprect, UINT32 transpen); +void copybitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen); +void copybitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, int flipx, int flipy, INT32 destx, INT32 desty, const rectangle &cliprect, UINT32 transpen); /* Copy a bitmap onto another with scroll and wraparound. @@ -287,11 +313,13 @@ scrolls as a whole in at least one direction. */ -/* copy from one bitmap to another, copying all unclipped pixels, and applying scrolling to one or more rows/colums */ -void copyscrollbitmap(bitmap_t *dest, bitmap_t *src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle *cliprect); - -/* copy from one bitmap to another, copying all unclipped pixels except those that match transpen, and applying scrolling to one or more rows/colums */ -void copyscrollbitmap_trans(bitmap_t *dest, bitmap_t *src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle *cliprect, UINT32 transpen); +/* copy from one bitmap to another, copying all unclipped pixels, and applying scrolling to one or more rows/columns */ +void copyscrollbitmap(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect); +void copyscrollbitmap(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect); + +/* copy from one bitmap to another, copying all unclipped pixels except those that match transpen, and applying scrolling to one or more rows/columns */ +void copyscrollbitmap_trans(bitmap_ind16 &dest, bitmap_ind16 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen); +void copyscrollbitmap_trans(bitmap_rgb32 &dest, bitmap_rgb32 &src, UINT32 numrows, const INT32 *rowscroll, UINT32 numcols, const INT32 *colscroll, const rectangle &cliprect, UINT32 transpen); /* Copy a bitmap applying rotation, zooming, and arbitrary distortion. @@ -323,10 +351,12 @@ */ /* copy from one bitmap to another, with zoom and rotation, copying all unclipped pixels */ -void copyrozbitmap(bitmap_t *dest, const rectangle *cliprect, bitmap_t *src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound); +void copyrozbitmap(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound); +void copyrozbitmap(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound); /* copy from one bitmap to another, with zoom and rotation, copying all unclipped pixels whose values do not match transpen */ -void copyrozbitmap_trans(bitmap_t *dest, const rectangle *cliprect, bitmap_t *src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color); +void copyrozbitmap_trans(bitmap_ind16 &dest, const rectangle &cliprect, bitmap_ind16 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color); +void copyrozbitmap_trans(bitmap_rgb32 &dest, const rectangle &cliprect, bitmap_rgb32 &src, INT32 startx, INT32 starty, INT32 incxx, INT32 incxy, INT32 incyx, INT32 incyy, int wraparound, UINT32 transparent_color); diff -Nru mame-0.144/src/emu/drawgfxm.h mame-0.145/src/emu/drawgfxm.h --- mame-0.144/src/emu/drawgfxm.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/drawgfxm.h 2012-02-06 21:30:27.000000000 +0000 @@ -58,10 +58,13 @@ /* special priority type meaning "none" */ typedef struct { char dummy[3]; } NO_PRIORITY; +extern bitmap_ind8 drawgfx_dummy_priority_bitmap; +#define DECLARE_NO_PRIORITY bitmap_t &priority = drawgfx_dummy_priority_bitmap; + /* macros for using the optional priority */ #define PRIORITY_VALID(x) (sizeof(x) != sizeof(NO_PRIORITY)) -#define PRIORITY_ADDR(p,t,y,x) (PRIORITY_VALID(t) ? BITMAP_ADDR(p, t, y, x) : NULL) +#define PRIORITY_ADDR(p,t,y,x) (PRIORITY_VALID(t) ? (&(p).pixt(y, x)) : NULL) #define PRIORITY_ADVANCE(t,p,i) do { if (PRIORITY_VALID(t)) (p) += (i); } while (0) @@ -302,15 +305,6 @@ against the destination using 'alpha' -------------------------------------------------*/ -#define PIXEL_OP_REMAP_TRANSPEN_ALPHA16(DEST, PRIORITY, SOURCE) \ -do \ -{ \ - UINT32 srcdata = (SOURCE); \ - if (srcdata != transpen) \ - (DEST) = alpha_blend_r16((DEST), paldata[srcdata], alpha); \ -} \ -while (0) \ - #define PIXEL_OP_REMAP_TRANSPEN_ALPHA32(DEST, PRIORITY, SOURCE) \ do \ { \ @@ -320,19 +314,6 @@ } \ while (0) \ -#define PIXEL_OP_REMAP_TRANSPEN_ALPHA16_PRIORITY(DEST, PRIORITY, SOURCE) \ -do \ -{ \ - UINT32 srcdata = (SOURCE); \ - if (srcdata != transpen) \ - { \ - if (((1 << ((PRIORITY) & 0x1f)) & pmask) == 0) \ - (DEST) = alpha_blend_r16((DEST), paldata[srcdata], alpha); \ - (PRIORITY) = 31; \ - } \ -} \ -while (0) \ - #define PIXEL_OP_REMAP_TRANSPEN_ALPHA32_PRIORITY(DEST, PRIORITY, SOURCE) \ do \ { \ @@ -355,8 +336,8 @@ /* Assumed input parameters or local variables: - bitmap_t *dest - the bitmap to render to - const rectangle *cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + bitmap_t &dest - the bitmap to render to + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') const gfx_element *gfx - pointer to the gfx_element to render UINT32 code - index of the entry within gfx_element UINT32 color - index of the color within gfx_element @@ -364,13 +345,13 @@ int flipy - non-zero means render bottom-to-top instead of top-to-bottom INT32 destx - the top-left X coordinate to render to INT32 desty - the top-left Y coordinate to render to - bitmap_t *priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) + bitmap_t &priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) */ #define DRAWGFX_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ do { \ - g_profiler.start(PROFILER_DRAWGFX); \ + g_profiler.start(PROFILER_DRAWGFX); \ do { \ const UINT8 *srcdata; \ INT32 destendx, destendy; \ @@ -378,55 +359,49 @@ INT32 curx, cury; \ INT32 dy; \ \ - assert(dest != NULL); \ + assert(dest.valid()); \ assert(gfx != NULL); \ - assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority != NULL); \ - assert(cliprect == NULL || cliprect->min_x >= 0); \ - assert(cliprect == NULL || cliprect->max_x < dest->width); \ - assert(cliprect == NULL || cliprect->min_y >= 0); \ - assert(cliprect == NULL || cliprect->max_y < dest->height); \ - \ - /* NULL clip means use the full bitmap */ \ - if (cliprect == NULL) \ - cliprect = &dest->cliprect; \ + assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority.valid()); \ + assert(dest.cliprect().contains(cliprect)); \ + assert(code < gfx->total_elements); \ \ /* ignore empty/invalid cliprects */ \ - if (cliprect->min_x > cliprect->max_x || cliprect->min_y > cliprect->max_y) \ + if (cliprect.empty()) \ break; \ \ /* compute final pixel in X and exit if we are entirely clipped */ \ destendx = destx + gfx->width - 1; \ - if (destx > cliprect->max_x || destendx < cliprect->min_x) \ + if (destx > cliprect.max_x || destendx < cliprect.min_x) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect->min_x) \ + if (destx < cliprect.min_x) \ { \ - srcx = cliprect->min_x - destx; \ - destx = cliprect->min_x; \ + srcx = cliprect.min_x - destx; \ + destx = cliprect.min_x; \ } \ \ /* apply right clip */ \ - if (destendx > cliprect->max_x) \ - destendx = cliprect->max_x; \ + if (destendx > cliprect.max_x) \ + destendx = cliprect.max_x; \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ destendy = desty + gfx->height - 1; \ - if (desty > cliprect->max_y || destendy < cliprect->min_y) \ + if (desty > cliprect.max_y || destendy < cliprect.min_y) \ break; \ \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect->min_y) \ + if (desty < cliprect.min_y) \ { \ - srcy = cliprect->min_y - desty; \ - desty = cliprect->min_y; \ + srcy = cliprect.min_y - desty; \ + desty = cliprect.min_y; \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect->max_y) \ - destendy = cliprect->max_y; \ + if (destendy > cliprect.max_y) \ + destendy = cliprect.max_y; \ \ /* apply X flipping */ \ if (flipx) \ @@ -443,177 +418,84 @@ /* fetch the source data */ \ srcdata = gfx_element_get_data(gfx, code); \ \ - /* draw normal 8bpp source data */ \ - if (!(gfx->flags & GFX_ELEMENT_PACKED)) \ - { \ - /* compute how many blocks of 4 pixels we have */ \ - UINT32 numblocks = (destendx + 1 - destx) / 4; \ - UINT32 leftovers = (destendx + 1 - destx) - 4 * numblocks; \ - \ - /* adjust srcdata to point to the first source pixel of the row */ \ - srcdata += srcy * gfx->line_modulo + srcx; \ - \ - /* non-flipped 8bpp case */ \ - if (!flipx) \ - { \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata; \ - srcdata += dy; \ - \ - /* iterate over unrolled blocks of 4 */ \ - for (curx = 0; curx < numblocks; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ - PIXEL_OP(destptr[1], priptr[1], srcptr[1]); \ - PIXEL_OP(destptr[2], priptr[2], srcptr[2]); \ - PIXEL_OP(destptr[3], priptr[3], srcptr[3]); \ - \ - srcptr += 4; \ - destptr += 4; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ - } \ - \ - /* iterate over leftover pixels */ \ - for (curx = 0; curx < leftovers; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ - srcptr++; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - } \ - } \ - \ - /* flipped 8bpp case */ \ - else \ - { \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata; \ - srcdata += dy; \ - \ - /* iterate over unrolled blocks of 4 */ \ - for (curx = 0; curx < numblocks; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[ 0]); \ - PIXEL_OP(destptr[1], priptr[1], srcptr[-1]); \ - PIXEL_OP(destptr[2], priptr[2], srcptr[-2]); \ - PIXEL_OP(destptr[3], priptr[3], srcptr[-3]); \ - \ - srcptr -= 4; \ - destptr += 4; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ - } \ - \ - /* iterate over leftover pixels */ \ - for (curx = 0; curx < leftovers; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ - srcptr--; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - } \ - } \ - } \ - \ - /* draw packed 4bpp source data */ \ - else \ - { \ - /* adjust srcdata to point to the first source pixel of the row */ \ - srcdata += srcy * gfx->line_modulo + srcx / 2; \ - \ - /* non-flipped 4bpp case */ \ - if (!flipx) \ - { \ - /* compute how many blocks of 2 pixels we have */ \ - UINT32 oddstart = srcx & 1; \ - UINT32 numblocks = (destendx + 1 - destx - oddstart) / 2; \ - UINT32 leftovers = (destendx + 1 - destx - oddstart) - 2 * numblocks; \ - \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata; \ - srcdata += dy; \ - \ - /* odd starting pixel */ \ - if (oddstart) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0] >> 4); \ - srcptr++; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - \ - /* iterate over unrolled blocks of 2 */ \ - for (curx = 0; curx < numblocks; curx++) \ - { \ - UINT8 srcbyte = *srcptr++; \ - PIXEL_OP(destptr[0], priptr[0], srcbyte & 15); \ - PIXEL_OP(destptr[1], priptr[1], srcbyte >> 4); \ - destptr += 2; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 2); \ - } \ - \ - /* iterate over leftover pixels */ \ - if (leftovers > 0) \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0] & 15); \ - } \ - } \ - \ - /* flipped 4bpp case */ \ - else \ - { \ - /* compute how many blocks of 2 pixels we have */ \ - UINT32 oddstart = ~srcx & 1; \ - UINT32 numblocks = (destendx + 1 - destx - oddstart) / 2; \ - UINT32 leftovers = (destendx + 1 - destx - oddstart) - 2 * numblocks; \ - \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata; \ - srcdata += dy; \ - \ - /* odd right pixel */ \ - if (oddstart) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0] & 15); \ - srcptr--; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - \ - /* middle pixels */ \ - for (curx = 0; curx < numblocks; curx++) \ - { \ - UINT8 srcbyte = *srcptr--; \ - PIXEL_OP(destptr[0], priptr[0], srcbyte >> 4); \ - PIXEL_OP(destptr[1], priptr[1], srcbyte & 15); \ - destptr += 2; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 2); \ - } \ - \ - /* odd left pixel */ \ - if (leftovers > 0) \ - PIXEL_OP(destptr[0], priptr[0], srcptr[0] >> 4); \ - } \ - } \ - } \ + /* compute how many blocks of 4 pixels we have */ \ + UINT32 numblocks = (destendx + 1 - destx) / 4; \ + UINT32 leftovers = (destendx + 1 - destx) - 4 * numblocks; \ + \ + /* adjust srcdata to point to the first source pixel of the row */ \ + srcdata += srcy * gfx->line_modulo + srcx; \ + \ + /* non-flipped 8bpp case */ \ + if (!flipx) \ + { \ + /* iterate over pixels in Y */ \ + for (cury = desty; cury <= destendy; cury++) \ + { \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, destx); \ + const UINT8 *srcptr = srcdata; \ + srcdata += dy; \ + \ + /* iterate over unrolled blocks of 4 */ \ + for (curx = 0; curx < numblocks; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ + PIXEL_OP(destptr[1], priptr[1], srcptr[1]); \ + PIXEL_OP(destptr[2], priptr[2], srcptr[2]); \ + PIXEL_OP(destptr[3], priptr[3], srcptr[3]); \ + \ + srcptr += 4; \ + destptr += 4; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ + } \ + \ + /* iterate over leftover pixels */ \ + for (curx = 0; curx < leftovers; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ + srcptr++; \ + destptr++; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ + } \ + } \ + } \ + \ + /* flipped 8bpp case */ \ + else \ + { \ + /* iterate over pixels in Y */ \ + for (cury = desty; cury <= destendy; cury++) \ + { \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, destx); \ + const UINT8 *srcptr = srcdata; \ + srcdata += dy; \ + \ + /* iterate over unrolled blocks of 4 */ \ + for (curx = 0; curx < numblocks; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[ 0]); \ + PIXEL_OP(destptr[1], priptr[1], srcptr[-1]); \ + PIXEL_OP(destptr[2], priptr[2], srcptr[-2]); \ + PIXEL_OP(destptr[3], priptr[3], srcptr[-3]); \ + \ + srcptr -= 4; \ + destptr += 4; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ + } \ + \ + /* iterate over leftover pixels */ \ + for (curx = 0; curx < leftovers; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ + srcptr--; \ + destptr++; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ + } \ + } \ + } \ } while (0); \ - g_profiler.stop(); \ + g_profiler.stop(); \ } while (0) @@ -625,8 +507,8 @@ /* Assumed input parameters or local variables: - bitmap_t *dest - the bitmap to render to - const rectangle *cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + bitmap_t &dest - the bitmap to render to + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') const gfx_element *gfx - pointer to the gfx_element to render UINT32 code - index of the entry within gfx_element UINT32 color - index of the color within gfx_element @@ -636,7 +518,7 @@ INT32 desty - the top-left Y coordinate to render to UINT32 scalex - the 16.16 scale factor in the X dimension UINT32 scaley - the 16.16 scale factor in the Y dimension - bitmap_t *priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) + bitmap_t &priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) */ @@ -651,20 +533,13 @@ INT32 curx, cury; \ INT32 dx, dy; \ \ - assert(dest != NULL); \ + assert(dest.valid()); \ assert(gfx != NULL); \ - assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority != NULL); \ - assert(cliprect == NULL || cliprect->min_x >= 0); \ - assert(cliprect == NULL || cliprect->max_x < dest->width); \ - assert(cliprect == NULL || cliprect->min_y >= 0); \ - assert(cliprect == NULL || cliprect->max_y < dest->height); \ - \ - /* NULL clip means use the full bitmap */ \ - if (cliprect == NULL) \ - cliprect = &dest->cliprect; \ + assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority.valid()); \ + assert(dest.cliprect().contains(cliprect)); \ \ /* ignore empty/invalid cliprects */ \ - if (cliprect->min_x > cliprect->max_x || cliprect->min_y > cliprect->max_y) \ + if (cliprect.empty()) \ break; \ \ /* compute scaled size */ \ @@ -679,24 +554,24 @@ \ /* compute final pixel in X and exit if we are entirely clipped */ \ destendx = destx + dstwidth - 1; \ - if (destx > cliprect->max_x || destendx < cliprect->min_x) \ + if (destx > cliprect.max_x || destendx < cliprect.min_x) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect->min_x) \ + if (destx < cliprect.min_x) \ { \ - srcx = (cliprect->min_x - destx) * dx; \ - destx = cliprect->min_x; \ + srcx = (cliprect.min_x - destx) * dx; \ + destx = cliprect.min_x; \ } \ \ /* apply right clip */ \ - if (destendx > cliprect->max_x) \ - destendx = cliprect->max_x; \ + if (destendx > cliprect.max_x) \ + destendx = cliprect.max_x; \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ destendy = desty + dstheight - 1; \ - if (desty > cliprect->max_y || destendy < cliprect->min_y) \ + if (desty > cliprect.max_y || destendy < cliprect.min_y) \ { \ g_profiler.stop(); \ return; \ @@ -704,15 +579,15 @@ \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect->min_y) \ + if (desty < cliprect.min_y) \ { \ - srcy = (cliprect->min_y - desty) * dy; \ - desty = cliprect->min_y; \ + srcy = (cliprect.min_y - desty) * dy; \ + desty = cliprect.min_y; \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect->max_y) \ - destendy = cliprect->max_y; \ + if (destendy > cliprect.max_y) \ + destendy = cliprect.max_y; \ \ /* apply X flipping */ \ if (flipx) \ @@ -731,71 +606,44 @@ /* fetch the source data */ \ srcdata = gfx_element_get_data(gfx, code); \ \ - /* draw normal */ \ - if (!(gfx->flags & GFX_ELEMENT_PACKED)) \ - { \ - /* compute how many blocks of 4 pixels we have */ \ - UINT32 numblocks = (destendx + 1 - destx) / 4; \ - UINT32 leftovers = (destendx + 1 - destx) - 4 * numblocks; \ - \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata + (srcy >> 16) * gfx->line_modulo; \ - INT32 cursrcx = srcx; \ - srcy += dy; \ - \ - /* iterate over unrolled blocks of 4 */ \ - for (curx = 0; curx < numblocks; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[cursrcx >> 16]); \ - cursrcx += dx; \ - PIXEL_OP(destptr[1], priptr[1], srcptr[cursrcx >> 16]); \ - cursrcx += dx; \ - PIXEL_OP(destptr[2], priptr[2], srcptr[cursrcx >> 16]); \ - cursrcx += dx; \ - PIXEL_OP(destptr[3], priptr[3], srcptr[cursrcx >> 16]); \ - cursrcx += dx; \ - \ - destptr += 4; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ - } \ - \ - /* iterate over leftover pixels */ \ - for (curx = 0; curx < leftovers; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], srcptr[cursrcx >> 16]); \ - cursrcx += dx; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - } \ - } \ - \ - /* draw packed */ \ - else \ - { \ - /* iterate over pixels in Y */ \ - for (cury = desty; cury <= destendy; cury++) \ - { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ - const UINT8 *srcptr = srcdata + (srcy >> 16) * gfx->line_modulo; \ - INT32 cursrcx = srcx; \ - srcy += dy; \ - \ - /* iterate over pixels in X */ \ - for (curx = destx; curx <= destendx; curx++) \ - { \ - PIXEL_OP(destptr[0], priptr[0], (srcptr[cursrcx >> 17] >> ((cursrcx >> 14) & 4)) & 15); \ - cursrcx += dx; \ - destptr++; \ - PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ - } \ - } \ - } \ + /* compute how many blocks of 4 pixels we have */ \ + UINT32 numblocks = (destendx + 1 - destx) / 4; \ + UINT32 leftovers = (destendx + 1 - destx) - 4 * numblocks; \ + \ + /* iterate over pixels in Y */ \ + for (cury = desty; cury <= destendy; cury++) \ + { \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, destx); \ + const UINT8 *srcptr = srcdata + (srcy >> 16) * gfx->line_modulo; \ + INT32 cursrcx = srcx; \ + srcy += dy; \ + \ + /* iterate over unrolled blocks of 4 */ \ + for (curx = 0; curx < numblocks; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[cursrcx >> 16]); \ + cursrcx += dx; \ + PIXEL_OP(destptr[1], priptr[1], srcptr[cursrcx >> 16]); \ + cursrcx += dx; \ + PIXEL_OP(destptr[2], priptr[2], srcptr[cursrcx >> 16]); \ + cursrcx += dx; \ + PIXEL_OP(destptr[3], priptr[3], srcptr[cursrcx >> 16]); \ + cursrcx += dx; \ + \ + destptr += 4; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 4); \ + } \ + \ + /* iterate over leftover pixels */ \ + for (curx = 0; curx < leftovers; curx++) \ + { \ + PIXEL_OP(destptr[0], priptr[0], srcptr[cursrcx >> 16]); \ + cursrcx += dx; \ + destptr++; \ + PRIORITY_ADVANCE(PRIORITY_TYPE, priptr, 1); \ + } \ + } \ } while (0); \ g_profiler.stop(); \ } while (0) @@ -809,14 +657,14 @@ /* Assumed input parameters or local variables: - bitmap_t *dest - the bitmap to copy to - bitmap_t *src - the bitmap to copy from (must be same bpp as dest) - const rectangle *cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + bitmap_t &dest - the bitmap to copy to + bitmap_t &src - the bitmap to copy from (must be same bpp as dest) + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') int flipx - non-zero means render right-to-left instead of left-to-right int flipy - non-zero means render bottom-to-top instead of top-to-bottom INT32 destx - the top-left X coordinate to copy to INT32 desty - the top-left Y coordinate to copy to - bitmap_t *priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) + bitmap_t &priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) */ #define COPYBITMAP_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ @@ -830,71 +678,64 @@ INT32 curx, cury; \ INT32 dx, dy; \ \ - assert(dest != NULL); \ - assert(src != NULL); \ - assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority != NULL); \ - assert(cliprect == NULL || cliprect->min_x >= 0); \ - assert(cliprect == NULL || cliprect->max_x < dest->width); \ - assert(cliprect == NULL || cliprect->min_y >= 0); \ - assert(cliprect == NULL || cliprect->max_y < dest->height); \ - \ - /* NULL clip means use the full bitmap */ \ - if (cliprect == NULL) \ - cliprect = &dest->cliprect; \ + assert(dest.valid()); \ + assert(src.valid()); \ + assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority.valid()); \ + assert(dest.cliprect().contains(cliprect)); \ \ /* ignore empty/invalid cliprects */ \ - if (cliprect->min_x > cliprect->max_x || cliprect->min_y > cliprect->max_y) \ + if (cliprect.empty()) \ break; \ \ /* standard setup; dx counts bytes in X, dy counts pixels in Y */ \ dx = 1; \ - dy = src->rowpixels; \ + dy = src.rowpixels(); \ \ /* compute final pixel in X and exit if we are entirely clipped */ \ - destendx = destx + src->width - 1; \ - if (destx > cliprect->max_x || destendx < cliprect->min_x) \ + destendx = destx + src.width() - 1; \ + if (destx > cliprect.max_x || destendx < cliprect.min_x) \ break; \ \ /* apply left clip */ \ srcx = 0; \ - if (destx < cliprect->min_x) \ + if (destx < cliprect.min_x) \ { \ - srcx = cliprect->min_x - destx; \ - destx = cliprect->min_x; \ + srcx = cliprect.min_x - destx; \ + destx = cliprect.min_x; \ } \ \ /* apply right clip */ \ - if (destendx > cliprect->max_x) \ - destendx = cliprect->max_x; \ + if (destendx > cliprect.max_x) \ + destendx = cliprect.max_x; \ \ /* compute final pixel in Y and exit if we are entirely clipped */ \ - destendy = desty + src->height - 1; \ - if (desty > cliprect->max_y || destendy < cliprect->min_y) \ + destendy = desty + src.height() - 1; \ + if (desty > cliprect.max_y || destendy < cliprect.min_y) \ break; \ \ /* apply top clip */ \ srcy = 0; \ - if (desty < cliprect->min_y) \ + if (desty < cliprect.min_y) \ { \ - srcy = cliprect->min_y - desty; \ - desty = cliprect->min_y; \ + srcy = cliprect.min_y - desty; \ + desty = cliprect.min_y; \ } \ \ /* apply bottom clip */ \ - if (destendy > cliprect->max_y) \ - destendy = cliprect->max_y; \ + if (destendy > cliprect.max_y) \ + destendy = cliprect.max_y; \ \ /* apply X flipping */ \ if (flipx) \ { \ - srcx = src->width - 1 - srcx; \ + srcx = src.width() - 1 - srcx; \ dx = -dx; \ } \ \ /* apply Y flipping */ \ if (flipy) \ { \ - srcy = src->height - 1 - srcy; \ + srcy = src.height() - 1 - srcy; \ dy = -dy; \ } \ \ @@ -903,7 +744,7 @@ leftovers = (destendx + 1 - destx) - 4 * numblocks; \ \ /* compute the address of the first source pixel of the first row */ \ - srcdata = BITMAP_ADDR(src, PIXEL_TYPE, srcy, srcx); \ + srcdata = &src.pixt(srcy, srcx); \ \ /* non-flipped case */ \ if (!flipx) \ @@ -912,7 +753,7 @@ for (cury = desty; cury <= destendy; cury++) \ { \ PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, destx); \ const PIXEL_TYPE *srcptr = srcdata; \ srcdata += dy; \ \ @@ -947,7 +788,7 @@ for (cury = desty; cury <= destendy; cury++) \ { \ PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, destx); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, destx); \ const PIXEL_TYPE *srcptr = srcdata; \ srcdata += dy; \ \ @@ -987,9 +828,9 @@ /* Assumed input parameters or local variables: - bitmap_t *dest - the bitmap to copy to - bitmap_t *src - the bitmap to copy from (must be same bpp as dest) - const rectangle *cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + bitmap_t &dest - the bitmap to copy to + bitmap_t &src - the bitmap to copy from (must be same bpp as dest) + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') INT32 destx - the 16.16 source X position at destination pixel (0,0) INT32 desty - the 16.16 source Y position at destination pixel (0,0) INT32 incxx - the 16.16 amount to increment in source X for each destination X pixel @@ -997,7 +838,7 @@ INT32 incxy - the 16.16 amount to increment in source X for each destination Y pixel INT32 incyy - the 16.16 amount to increment in source Y for each destination Y pixel int wraparound - non-zero means wrap when hitting the edges of the source - bitmap_t *priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) + bitmap_t &priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) */ #define COPYROZBITMAP_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ @@ -1006,37 +847,30 @@ UINT32 numblocks, leftovers; \ INT32 curx, cury; \ \ - g_profiler.start(PROFILER_COPYBITMAP); \ + g_profiler.start(PROFILER_COPYBITMAP); \ \ - assert(dest != NULL); \ - assert(src != NULL); \ - assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority != NULL); \ - assert(cliprect == NULL || cliprect->min_x >= 0); \ - assert(cliprect == NULL || cliprect->max_x < dest->width); \ - assert(cliprect == NULL || cliprect->min_y >= 0); \ - assert(cliprect == NULL || cliprect->max_y < dest->height); \ - assert(!wraparound || (src->width & (src->width - 1)) == 0); \ - assert(!wraparound || (src->height & (src->height - 1)) == 0); \ - \ - /* NULL clip means use the full bitmap */ \ - if (cliprect == NULL) \ - cliprect = &dest->cliprect; \ + assert(dest.valid()); \ + assert(dest.valid()); \ + assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority.valid()); \ + assert(dest.cliprect().contains(cliprect)); \ + assert(!wraparound || (src.width() & (src.width() - 1)) == 0); \ + assert(!wraparound || (src.height() & (src.height() - 1)) == 0); \ \ /* ignore empty/invalid cliprects */ \ - if (cliprect->min_x > cliprect->max_x || cliprect->min_y > cliprect->max_y) \ + if (cliprect.empty()) \ break; \ \ /* compute fixed-point 16.16 size of the source bitmap */ \ - srcfixwidth = src->width << 16; \ - srcfixheight = src->height << 16; \ + srcfixwidth = src.width() << 16; \ + srcfixheight = src.height() << 16; \ \ /* advance the starting coordinates to the top-left of the cliprect */ \ - startx += cliprect->min_x * incxx + cliprect->min_y * incyx; \ - starty += cliprect->min_x * incxy + cliprect->min_y * incyy; \ + startx += cliprect.min_x * incxx + cliprect.min_y * incyx; \ + starty += cliprect.min_x * incxy + cliprect.min_y * incyy; \ \ /* compute how many blocks of 4 pixels we have */ \ - numblocks = (cliprect->max_x + 1 - cliprect->min_x) / 4; \ - leftovers = (cliprect->max_x + 1 - cliprect->min_x) - 4 * numblocks; \ + numblocks = cliprect.width() / 4; \ + leftovers = cliprect.width() - 4 * numblocks; \ \ /* if incxy and incyx are 0, then we aren't rotating, just zooming */ \ if (incxy == 0 && incyx == 0) \ @@ -1045,10 +879,10 @@ if (!wraparound) \ { \ /* iterate over pixels in Y */ \ - for (cury = cliprect->min_y; cury <= cliprect->max_y; cury++) \ + for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect->min_x); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, cliprect->min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, cliprect.min_x); \ const PIXEL_TYPE *srcptr; \ INT32 srcx = startx; \ INT32 srcy = starty; \ @@ -1058,7 +892,7 @@ /* check srcy for the whole row at once */ \ if ((UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, 0); \ + srcptr = &src.pixt(srcy >> 16); \ \ /* iterate over unrolled blocks of 4 */ \ for (curx = 0; curx < numblocks; curx++) \ @@ -1106,11 +940,11 @@ starty &= srcfixheight; \ \ /* iterate over pixels in Y */ \ - for (cury = cliprect->min_y; cury <= cliprect->max_y; cury++) \ + for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect->min_x); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, cliprect->min_x); \ - const PIXEL_TYPE *srcptr = BITMAP_ADDR(src, PIXEL_TYPE, starty >> 16, 0); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, cliprect.min_x); \ + const PIXEL_TYPE *srcptr = &src.pixt(starty >> 16); \ INT32 srcx = startx; \ \ starty = (starty + incyy) & srcfixheight; \ @@ -1153,10 +987,10 @@ if (!wraparound) \ { \ /* iterate over pixels in Y */ \ - for (cury = cliprect->min_y; cury <= cliprect->max_y; cury++) \ + for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect->min_x); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, cliprect->min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, cliprect.min_x); \ const PIXEL_TYPE *srcptr; \ INT32 srcx = startx; \ INT32 srcy = starty; \ @@ -1169,7 +1003,7 @@ { \ if ((UINT32)srcx < srcfixwidth && (UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ } \ srcx += incxx; \ @@ -1177,7 +1011,7 @@ \ if ((UINT32)srcx < srcfixwidth && (UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[1], priptr[1], srcptr[0]); \ } \ srcx += incxx; \ @@ -1185,7 +1019,7 @@ \ if ((UINT32)srcx < srcfixwidth && (UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[2], priptr[2], srcptr[0]); \ } \ srcx += incxx; \ @@ -1193,7 +1027,7 @@ \ if ((UINT32)srcx < srcfixwidth && (UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[3], priptr[3], srcptr[0]); \ } \ srcx += incxx; \ @@ -1208,7 +1042,7 @@ { \ if ((UINT32)srcx < srcfixwidth && (UINT32)srcy < srcfixheight) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ } \ srcx += incxx; \ @@ -1229,10 +1063,10 @@ starty &= srcfixheight; \ \ /* iterate over pixels in Y */ \ - for (cury = cliprect->min_y; cury <= cliprect->max_y; cury++) \ + for (cury = cliprect.min_y; cury <= cliprect.max_y; cury++) \ { \ - PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect->min_x); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(dest, PIXEL_TYPE, cury, cliprect->min_x); \ + PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, cury, cliprect.min_x); \ + PIXEL_TYPE *destptr = &dest.pixt(cury, cliprect.min_x); \ const PIXEL_TYPE *srcptr; \ INT32 srcx = startx; \ INT32 srcy = starty; \ @@ -1243,22 +1077,22 @@ /* iterate over unrolled blocks of 4 */ \ for (curx = 0; curx < numblocks; curx++) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ srcx = (srcx + incxx) & srcfixwidth; \ srcy = (srcy + incxy) & srcfixheight; \ \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[1], priptr[1], srcptr[0]); \ srcx = (srcx + incxx) & srcfixwidth; \ srcy = (srcy + incxy) & srcfixheight; \ \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[2], priptr[2], srcptr[0]); \ srcx = (srcx + incxx) & srcfixwidth; \ srcy = (srcy + incxy) & srcfixheight; \ \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[3], priptr[3], srcptr[0]); \ srcx = (srcx + incxx) & srcfixwidth; \ srcy = (srcy + incxy) & srcfixheight; \ @@ -1270,7 +1104,7 @@ /* iterate over leftover pixels */ \ for (curx = 0; curx < leftovers; curx++) \ { \ - srcptr = BITMAP_ADDR(src, PIXEL_TYPE, srcy >> 16, srcx >> 16); \ + srcptr = &src.pixt(srcy >> 16, srcx >> 16); \ PIXEL_OP(destptr[0], priptr[0], srcptr[0]); \ srcx = (srcx + incxx) & srcfixwidth; \ srcy = (srcy + incxy) & srcfixheight; \ @@ -1292,27 +1126,27 @@ /* Assumed input parameters or local variables: - bitmap_t *bitmap - the bitmap to copy to + bitmap_t &bitmap - the bitmap to copy to INT32 destx - the X coordinate to copy to INT32 desty - the Y coordinate to copy to INT32 length - the total number of pixels to copy const UINTx *srcptr - pointer to memory containing the source pixels - bitmap_t *priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) + bitmap_t &priority - the priority bitmap (even if PRIORITY_TYPE is NO_PRIORITY, at least needs a dummy) */ #define DRAWSCANLINE_CORE(PIXEL_TYPE, PIXEL_OP, PRIORITY_TYPE) \ do { \ - assert(bitmap != NULL); \ + assert(bitmap.valid()); \ assert(destx >= 0); \ - assert(destx + length <= bitmap->width); \ + assert(destx + length <= bitmap.width()); \ assert(desty >= 0); \ - assert(desty < bitmap->height); \ + assert(desty < bitmap.height()); \ assert(srcptr != NULL); \ - assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority != NULL); \ + assert(!PRIORITY_VALID(PRIORITY_TYPE) || priority.valid()); \ \ { \ PRIORITY_TYPE *priptr = PRIORITY_ADDR(priority, PRIORITY_TYPE, desty, destx); \ - PIXEL_TYPE *destptr = BITMAP_ADDR(bitmap, PIXEL_TYPE, desty, destx); \ + PIXEL_TYPE *destptr = &bitmap.pixt(desty, destx); \ \ /* iterate over unrolled blocks of 4 */ \ while (length >= 4) \ @@ -1348,7 +1182,7 @@ /* Assumed input parameters: - bitmap_t *bitmap - the bitmap to extract from + bitmap_t &bitmap - the bitmap to extract from INT32 srcx - the X coordinate to begin extraction INT32 srcy - the Y coordinate to begin extraction INT32 length - the total number of pixels to extract @@ -1357,15 +1191,15 @@ #define EXTRACTSCANLINE_CORE(PIXEL_TYPE) \ do { \ - assert(bitmap != NULL); \ + assert(bitmap.valid()); \ assert(srcx >= 0); \ - assert(srcx + length <= bitmap->width); \ + assert(srcx + length <= bitmap.width()); \ assert(srcy >= 0); \ - assert(srcy < bitmap->height); \ + assert(srcy < bitmap.height()); \ assert(destptr != NULL); \ \ { \ - const PIXEL_TYPE *srcptr = BITMAP_ADDR(bitmap, PIXEL_TYPE, srcy, srcx); \ + const PIXEL_TYPE *srcptr = &bitmap.pixt(srcy, srcx); \ \ /* iterate over unrolled blocks of 4 */ \ while (length >= 4) \ diff -Nru mame-0.144/src/emu/driver.c mame-0.145/src/emu/driver.c --- mame-0.144/src/emu/driver.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/driver.c 2012-02-06 21:30:28.000000000 +0000 @@ -209,7 +209,7 @@ // driver, allocating on demand if needed //------------------------------------------------- -machine_config &driver_enumerator::config(int index) const +machine_config &driver_enumerator::config(int index, emu_options &options) const { assert(index >= 0 && index < s_driver_count); @@ -225,7 +225,7 @@ } // allocate the config and add it to the end of the list - machine_config *config = m_config[index] = global_alloc(machine_config(*s_drivers_sorted[index], m_options)); + machine_config *config = m_config[index] = global_alloc(machine_config(*s_drivers_sorted[index], options)); m_config_cache.append(*global_alloc(config_entry(*config, index))); } return *m_config[index]; diff -Nru mame-0.144/src/emu/driver.h mame-0.145/src/emu/driver.h --- mame-0.144/src/emu/driver.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/driver.h 2012-02-06 21:30:28.000000000 +0000 @@ -74,6 +74,8 @@ #define GAME_UNOFFICIAL 0x00008000 /* unofficial hardware change */ #define GAME_NO_SOUND_HW 0x00010000 /* sound hardware not available */ #define GAME_MECHANICAL 0x00020000 /* contains mechanical parts (pinball, redemption games,...) */ +#define GAME_IS_SKELETON 0x00000208 /* mask for skelly games */ +#define GAME_IS_SKELETON_MECHANICAL 0x00024208 /* mask for skelly mechanical games */ #define GAME_TYPE_ARCADE 0x00040000 /* arcade machine (coin operated machines) */ #define GAME_TYPE_CONSOLE 0x00080000 /* console system */ #define GAME_TYPE_COMPUTER 0x00100000 /* any kind of computer including home computers, minis, calcs,... */ @@ -170,7 +172,7 @@ // current item const game_driver &driver() const { return driver_list::driver(m_current); } - machine_config &config() const { return config(m_current); } + machine_config &config() const { return config(m_current, m_options); } int clone() { return driver_list::clone(m_current); } int non_bios_clone() { return driver_list::non_bios_clone(m_current); } int compatible_with() { return driver_list::compatible_with(m_current); } @@ -180,7 +182,8 @@ // 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; + machine_config &config(int index) const { return config(index,m_options); } + machine_config &config(int index, emu_options &options) 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; diff -Nru mame-0.144/src/emu/drivers/empty.c mame-0.145/src/emu/drivers/empty.c --- mame-0.144/src/emu/drivers/empty.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/drivers/empty.c 2012-02-06 21:30:27.000000000 +0000 @@ -4,43 +4,82 @@ Empty driver. - 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. **************************************************************************/ #include "emu.h" #include "render.h" #include "uimenu.h" +#include "uimain.h" -/************************************* - * - * Machine "start" - * - *************************************/ +//************************************************************************** +// DRIVER STATE +//************************************************************************** -static MACHINE_START( ___empty ) +class empty_state : public driver_device { - /* force the UI to show the game select screen */ - ui_menu_force_game_select(machine, &machine.render().ui_container()); -} - +public: + // constructor + empty_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + { + } + + virtual void machine_start() + { + // force the UI to show the game select screen + ui_menu_force_game_select(machine(), &machine().render().ui_container()); + } + + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) + { + bitmap.fill(RGB_BLACK); + return 0; + } +}; -/************************************* - * - * Machine drivers - * - *************************************/ -static MACHINE_CONFIG_START( ___empty, driver_device ) +//************************************************************************** +// MACHINE DRIVERS +//************************************************************************** - MCFG_MACHINE_START(___empty) +static MACHINE_CONFIG_START( ___empty, empty_state ) - /* video hardware */ + // video hardware MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_DRIVER(empty_state, screen_update) MCFG_SCREEN_SIZE(640,480) MCFG_SCREEN_VISIBLE_AREA(0,639, 0,479) MCFG_SCREEN_REFRESH_RATE(30) @@ -48,11 +87,9 @@ -/************************************* - * - * ROM definitions - * - *************************************/ +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** ROM_START( ___empty ) ROM_REGION( 0x10, "user1", ROMREGION_ERASEFF ) @@ -60,10 +97,8 @@ -/************************************* - * - * Game drivers - * - *************************************/ +//************************************************************************** +// GAME DRIVERS +//************************************************************************** GAME( 2007, ___empty, 0, ___empty, 0, 0, ROT0, "MAME", "No Driver Loaded", GAME_NO_SOUND ) diff -Nru mame-0.144/src/emu/drivers/testcpu.c mame-0.145/src/emu/drivers/testcpu.c --- mame-0.144/src/emu/drivers/testcpu.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/drivers/testcpu.c 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,248 @@ +/************************************************************************* + + testcpu.c + + Example driver for performing CPU stress tests. + +**************************************************************************** + + 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. + +**************************************************************************/ + +#define ADDRESS_MAP_MODERN + +#include "emu.h" +#include "cpu/powerpc/ppc.h" + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +#define RAM_BASE 0x80000000 + + + +//************************************************************************** +// DRIVER STATE +//************************************************************************** + +class testcpu_state : public driver_device +{ +public: + // constructor + testcpu_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_cpu(*this, "maincpu"), + m_ram(*this, "ram") + { + } + + // timer callback; used to wrest control of the system + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) + { + static const UINT32 sample_instructions[] = + { + 0x3d40f900, // li r10,0xf9000000 + 0x394af000, // addi r10,r10,-0x1000 + 0x38600146, // li r3,0x00000146 + 0x38800004, // li r4,0x00000004 + 0x7c64572c, // sthbrx r3,r4,r10 + 0x38600000, // li r3,0x00000000 + 0x986a0070 // stb r3,0x0070(r10) + }; + + // iterate over instructions + for (int instnum = 0; instnum < ARRAY_LENGTH(sample_instructions); instnum++) + { + // write the instruction to execute, followed by a BLR which will terminate the + // basic block in the DRC + m_space->write_dword(RAM_BASE, sample_instructions[instnum]); + m_space->write_dword(RAM_BASE + 4, 0x4e800020); + + // initialize the register state + m_cpu->set_state(PPC_PC, RAM_BASE); + for (int regnum = 0; regnum < 32; regnum++) + m_cpu->set_state(PPC_R0 + regnum, regnum | (regnum << 8) | (regnum << 16) | (regnum << 24)); + m_cpu->set_state(PPC_CR, 0); + m_cpu->set_state(PPC_LR, 0x12345678); + m_cpu->set_state(PPC_CTR, 0x1000); + m_cpu->set_state(PPC_XER, 0); + for (int regnum = 0; regnum < 32; regnum++) + { + double value = double(regnum | (regnum << 8) | (regnum << 16) | (regnum << 24)); + m_cpu->set_state(PPC_F0 + regnum, d2u(value)); + } + + // output initial state + printf("==================================================\n"); + printf("Initial state:\n"); + dump_state(true); + + // execute one instruction + *m_cpu->m_icountptr = 0; + m_cpu->run(); + + // dump the final register state + printf("Final state:\n"); + dump_state(false); + } + + // all done; just bail + throw emu_fatalerror(0, "All done"); + } + + // startup code; do basic configuration and set a timer to go off immediately + virtual void machine_start() + { + // find the CPU's address space + m_space = m_cpu->space(AS_PROGRAM); + + // configure DRC in the most compatible mode + ppcdrc_set_options(m_cpu, PPCDRC_COMPATIBLE_OPTIONS); + + // set a timer to go off right away + timer_set(attotime::zero); + } + + // dump the current CPU state + void dump_state(bool disassemble) + { + char buffer[256]; + UINT8 instruction[32]; + buffer[0] = 0; + int bytes = 0; + if (disassemble) + { + // fill in an array of bytes in the CPU's natural order + int maxbytes = m_cpu->max_opcode_bytes(); + for (int bytenum = 0; bytenum < maxbytes; bytenum++) + instruction[bytenum] = m_space->read_byte(RAM_BASE + bytenum); + + // disassemble the current instruction + bytes = m_cpu->disassemble(buffer, RAM_BASE, instruction, instruction) & DASMFLAG_LENGTHMASK; + } + + // output the registers + printf("PC : %08X", UINT32(m_cpu->state(PPC_PC))); + if (disassemble && bytes > 0) + { + printf(" => "); + for (int bytenum = 0; bytenum < bytes; bytenum++) + printf("%02X", instruction[bytenum]); + printf(" %s", buffer); + } + printf("\n"); + for (int regnum = 0; regnum < 32; regnum++) + { + printf("R%-2d: %08X ", regnum, UINT32(m_cpu->state(PPC_R0 + regnum))); + if (regnum % 4 == 3) printf("\n"); + } + printf("CR : %08X LR : %08X CTR: %08X XER: %08X\n", + UINT32(m_cpu->state(PPC_CR)), UINT32(m_cpu->state(PPC_LR)), + UINT32(m_cpu->state(PPC_CTR)), UINT32(m_cpu->state(PPC_XER))); + for (int regnum = 0; regnum < 32; regnum++) + { + printf("F%-2d: %10g ", regnum, u2d(m_cpu->state(PPC_F0 + regnum))); + if (regnum % 4 == 3) printf("\n"); + } + } + + // report reads from anywhere + READ64_MEMBER( general_r ) + { + UINT64 fulloffs = offset; + UINT64 result = fulloffs + (fulloffs << 8) + (fulloffs << 16) + (fulloffs << 24) + (fulloffs << 32); + printf("Read from %08X & %016" I64FMT "X = %016" I64FMT "X\n", offset * 8, mem_mask, result); + return result; + } + + // report writes to anywhere + WRITE64_MEMBER( general_w ) + { + printf("Write to %08X & %016" I64FMT "X = %016" I64FMT "X\n", offset * 8, mem_mask, data); + } + +private: + // internal state + required_device m_cpu; + required_shared_ptr m_ram; + address_space *m_space; +}; + + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +static ADDRESS_MAP_START( ppc_mem, AS_PROGRAM, 64, testcpu_state ) + AM_RANGE(RAM_BASE, RAM_BASE+7) AM_RAM AM_SHARE("ram") + AM_RANGE(0x00000000, 0xffffffff) AM_READWRITE(general_r, general_w) +ADDRESS_MAP_END + + + +//************************************************************************** +// MACHINE DRIVERS +//************************************************************************** + +static const powerpc_config ppc_config = +{ + // 603e, Stretch, 1.3 + 66000000 // Multiplier 1, Bus = 66MHz, Core = 66MHz +}; + +static MACHINE_CONFIG_START( testcpu, testcpu_state ) + + // CPUs + MCFG_CPU_ADD("maincpu", PPC603E, 66000000) + MCFG_CPU_CONFIG(ppc_config) + MCFG_CPU_PROGRAM_MAP(ppc_mem) +MACHINE_CONFIG_END + + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( testcpu ) + ROM_REGION( 0x10, "user1", ROMREGION_ERASEFF ) +ROM_END + + + +//************************************************************************** +// GAME DRIVERS +//************************************************************************** + +GAME( 2012, testcpu, 0, testcpu, 0, 0, ROT0, "MAME", "CPU Tester", GAME_NO_SOUND ) diff -Nru mame-0.144/src/emu/drivers/xtal.h mame-0.145/src/emu/drivers/xtal.h --- mame-0.144/src/emu/drivers/xtal.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/drivers/xtal.h 2012-02-06 21:30:27.000000000 +0000 @@ -55,7 +55,7 @@ XTAL_3MHz = 3000000, /* Probably only used to drive 68705 or similar MCUs on 80's Taito PCBs */ XTAL_3_12MHz = 3120000, /* SP0250 clock on Gottlieb games */ XTAL_3_52128MHz = 3521280, /* RCA COSMAC VIP */ - XTAL_3_579545MHz = 3579545, /* NTSC color subcarrier, extremely common, used on 100's of PCBs */ + XTAL_3_579545MHz = 3579545, /* NTSC color subcarrier, extremely common, used on 100's of PCBs (48-300-010) */ XTAL_3_6864MHz = 3686400, /* CPS3 */ XTAL_4MHz = 4000000, XTAL_4_028MHz = 4028000, /* Sony SMC-777 */ @@ -64,14 +64,14 @@ XTAL_4_41MHz = 4410000, /* Pioneer PR-8210 ldplayer */ XTAL_4_43361MHz = 4433610, /* Cidelsa Draco */ XTAL_4_433619MHz = 4433619, /* PAL color subcarrier */ - XTAL_4_608MHz = 4608000, /* Luxor ABC-77 keyboard */ + XTAL_4_608MHz = 4608000, /* Luxor ABC-77 keyboard (48-300-107) */ XTAL_4_9152MHz = 4915200, XTAL_5MHz = 5000000, /* Mutant Night */ XTAL_5_0688MHz = 5068800, /* Xerox 820, DEC VK100 */ XTAL_5_626MHz = 5626000, /* RCA CDP1869 PAL dot clock */ XTAL_5_67MHz = 5670000, /* RCA CDP1869 NTSC dot clock */ XTAL_5_7143MHz = 5714300, /* Cidelsa Destroyer */ - XTAL_5_9904MHz = 5990400, /* Luxor ABC 800 keyboard */ + XTAL_5_9904MHz = 5990400, /* Luxor ABC 800 keyboard (48-300-008) */ XTAL_6MHz = 6000000, /* American Poker II */ XTAL_6_5MHz = 6500000, /* Jupiter Ace */ XTAL_6_144MHz = 6144000, /* Used on Alpha Denshi early 80's games sound board */ @@ -80,10 +80,10 @@ XTAL_7_3728MHz = 7372800, XTAL_7_8643MHz = 7864300, /* Used on InterFlip games as video clock */ XTAL_8MHz = 8000000, /* Extremely common, used on 100's of PCBs */ - XTAL_8_2MHz = 8200000, /* Universal Mr. Do - Model 8021 PCB */ + XTAL_8_2MHz = 8200000, /* Universal Mr. Do - Model 8021 PCB */ XTAL_8_4672MHz = 8467200, /* Subsino's Ying Hua Lian */ XTAL_8_664MHz = 8664000, /* Touchmaster */ - XTAL_8_7MHz = 8700000, /* Tandberg TDV 2324 */ + XTAL_8_7MHz = 8700000, /* Tandberg TDV 2324 */ XTAL_8_867236MHz = 8867236, /* RCA CDP1869 PAL color clock */ XTAL_8_867238MHz = 8867238, /* ETI-660 */ XTAL_9_216MHz = 9216000, /* Conitec PROF-180X */ @@ -100,7 +100,7 @@ XTAL_10_733MHz = 10733000, /* The Fairyland Story */ XTAL_10_738635MHz = 10738635, /* TMS9918 family */ XTAL_10_816MHz = 10816000, /* Universal 1979-1980 (Cosmic Alien, etc) */ - XTAL_11MHz = 11000000, /* Mario I8039 sound */ + XTAL_11MHz = 11000000, /* Mario I8039 sound */ XTAL_11_0592MHz = 11059200, /* Lethal Justice, Ruleta RE-900 */ XTAL_11_2MHz = 11200000, /* New York, New York */ XTAL_11_289MHz = 11289000, /* Vanguard */ @@ -121,7 +121,7 @@ XTAL_14_31818MHz = 14318181, /* Extremely common, used on 100's of PCBs */ XTAL_14_705882MHz = 14705882, /* Aleck64 */ XTAL_14_7456MHz = 14745600, /* Namco System 12 & System Super 22/23 for H8/3002 CPU */ - XTAL_15MHz = 15000000, /* Sinclair QL */ + XTAL_15MHz = 15000000, /* Sinclair QL */ XTAL_15_36MHz = 15360000, /* Visual 1050 */ XTAL_15_468MHz = 15468000, /* Bank Panic h/w, Sega G80 */ XTAL_16MHz = 16000000, /* Extremely common, used on 100's of PCBs */ @@ -145,6 +145,7 @@ XTAL_22_1184MHz = 22118400, XTAL_23_9616MHz = 23961600, /* Osborne 4 (Vixen) */ XTAL_24MHz = 24000000, /* Mario, 80's Data East games, 80's Konami games */ + XTAL_24_0734MHz = 24073400, /* DEC Rainbow 100 */ XTAL_24_576MHz = 24576000, /* Pole Position h/w, Model 3 CPU board */ XTAL_24_8832MHz = 24883200, /* DEC VT100 */ XTAL_25MHz = 25000000, /* Namco System 22, Taito GNET, Dogyuun h/w */ @@ -170,10 +171,12 @@ XTAL_32_5304MHz = 32530400, /* Seta 2 */ XTAL_33MHz = 33000000, /* Sega Model 3 video board */ XTAL_33_333MHz = 33333000, /* Sega Model 3 CPU board, Vegas */ + XTAL_33_833MHz = 33833000, XTAL_33_8688MHz = 33868800, /* Usually used to drive 90's Yamaha OPL/FM chips with /2 divider */ XTAL_36MHz = 36000000, /* Sega Model 1 video board */ XTAL_38_76922MHz = 38769220, /* Namco System 21 video board */ XTAL_40MHz = 40000000, + XTAL_42MHz = 42000000, /* BMC A-00211 - Popo Bear */ XTAL_42_9545MHz = 42954545, /* CPS3 */ XTAL_44_1MHz = 44100000, /* Subsino's Bishou Jan */ XTAL_45MHz = 45000000, /* Eolith with Hyperstone CPUs */ @@ -196,14 +199,14 @@ XTAL_73_728MHz = 73728000, /* Ms. Pac-Man/Galaga 20th Anniversary */ XTAL_100MHz = 100000000, /* PSX-based Namco System 12, Vegas, Sony ZN1-2-based */ XTAL_101_4912MHz = 101491200, /* PSX-based Namco System 10 */ - XTAL_200MHz = 200000000, /* Base SH4 CPU (Naomi, Hikaru etc.) */ + XTAL_200MHz = 200000000, /* Base SH4 CPU (Naomi, Hikaru etc.) */ /* Resonators (There are probably more. Almost always used for driving OKI sound chips) */ - XTAL_384kHz = 384000, - XTAL_400kHz = 400000, /* Used on Great Swordman h/w */ - XTAL_455kHz = 455000, /* Used on Gladiator h/w */ - XTAL_640kHz = 640000, + XTAL_384kHz = 384000, + XTAL_400kHz = 400000, /* Used on Great Swordman h/w */ + XTAL_455kHz = 455000, /* Used on Gladiator h/w */ + XTAL_640kHz = 640000, XTAL_1_056MHz = 1056000 /* used on Trio The Punch */ }; diff -Nru mame-0.144/src/emu/emualloc.c mame-0.145/src/emu/emualloc.c --- mame-0.144/src/emu/emualloc.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/emualloc.c 2012-02-06 21:30:28.000000000 +0000 @@ -112,9 +112,6 @@ // GLOBALS //************************************************************************** -// global resource pool to handle allocations outside of the emulator context -resource_pool global_resource_pool(6151); - // dummy zeromem object const zeromem_t zeromem = { }; @@ -126,6 +123,12 @@ memory_entry *memory_entry::s_hash[memory_entry::k_hash_prime] = { NULL }; memory_entry *memory_entry::s_freehead = NULL; +// wrapper for the global resource pool to help ensure construction order +resource_pool &global_resource_pool() +{ + static resource_pool s_pool(6151); + return s_pool; +}; //************************************************************************** diff -Nru mame-0.144/src/emu/emualloc.h mame-0.145/src/emu/emualloc.h --- mame-0.144/src/emu/emualloc.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/emualloc.h 2012-02-06 21:30:28.000000000 +0000 @@ -74,11 +74,11 @@ #define pool_free(_pool, v) (_pool).remove(v) // global allocation helpers -#define global_alloc(_type) pool_alloc(global_resource_pool, _type) -#define global_alloc_clear(_type) pool_alloc_clear(global_resource_pool, _type) -#define global_alloc_array(_type, _num) pool_alloc_array(global_resource_pool, _type, _num) -#define global_alloc_array_clear(_type, _num) pool_alloc_array_clear(global_resource_pool, _type, _num) -#define global_free(v) pool_free(global_resource_pool, v) +#define global_alloc(_type) pool_alloc(global_resource_pool(), _type) +#define global_alloc_clear(_type) pool_alloc_clear(global_resource_pool(), _type) +#define global_alloc_array(_type, _num) pool_alloc_array(global_resource_pool(), _type, _num) +#define global_alloc_array_clear(_type, _num) pool_alloc_array_clear(global_resource_pool(), _type, _num) +#define global_free(v) pool_free(global_resource_pool(), v) @@ -281,7 +281,7 @@ public: resource_pool(int hash_size = 193); - ~resource_pool(); + virtual ~resource_pool(); void add(resource_pool_item &item); void remove(resource_pool_item &item) { remove(item.m_ptr); } @@ -308,13 +308,13 @@ // GLOBAL VARIABLES //************************************************************************** -// global resource pool -extern resource_pool global_resource_pool; - // dummy objects to pass to the specialized new variants extern const zeromem_t zeromem; +resource_pool &global_resource_pool(); + + //************************************************************************** // ADDDITIONAL MACROS @@ -331,9 +331,6 @@ #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__) - -// disable direct deletion -#define delete __error_use_pool_free_mechanisms__ #endif #endif /* __EMUALLOC_H__ */ diff -Nru mame-0.144/src/emu/emucore.h mame-0.145/src/emu/emucore.h --- mame-0.144/src/emu/emucore.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/emucore.h 2012-02-06 21:30:27.000000000 +0000 @@ -33,9 +33,9 @@ // core system includes #include "osdcomm.h" +#include "astring.h" #include "emualloc.h" #include "corestr.h" -#include "astring.h" #include "bitmap.h" #include "tagmap.h" diff -Nru mame-0.144/src/emu/emu.h mame-0.145/src/emu/emu.h --- mame-0.144/src/emu/emu.h 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/emu.h 2012-02-06 21:30:26.000000000 +0000 @@ -49,6 +49,9 @@ #ifndef __EMU_H__ #define __EMU_H__ +// turn off legacy bitmap addressing macros +#define BITMAP_DISABLE_LEGACY_MACROS + // core emulator headers -- must be first #include "emucore.h" #include "emutempl.h" @@ -65,7 +68,7 @@ #include "hash.h" #include "fileio.h" // remove me once NVRAM is implemented as device #include "delegate.h" -#include "cothread.h" +//#include "cothread.h" // memory and address spaces #include "memory.h" @@ -85,6 +88,9 @@ #include "ioport.h" #include "output.h" +// diimage requires uimenu +#include "uimenu.h" + // devices and callbacks #include "device.h" #include "distate.h" @@ -114,6 +120,9 @@ #include "softlist.h" #include "image.h" +// networking +#include "network.h" + // the running machine #include "machine.h" #include "mame.h" diff -Nru mame-0.144/src/emu/emu.mak mame-0.145/src/emu/emu.mak --- mame-0.144/src/emu/emu.mak 2012-01-13 15:34:22.000000000 +0000 +++ mame-0.145/src/emu/emu.mak 2012-02-06 21:30:28.000000000 +0000 @@ -51,7 +51,6 @@ $(EMUOBJ)/cheat.o \ $(EMUOBJ)/clifront.o \ $(EMUOBJ)/config.o \ - $(EMUOBJ)/cothread.o \ $(EMUOBJ)/crsshair.o \ $(EMUOBJ)/debugger.o \ $(EMUOBJ)/delegate.o \ @@ -87,6 +86,7 @@ $(EMUOBJ)/machine.o \ $(EMUOBJ)/mconfig.o \ $(EMUOBJ)/memory.o \ + $(EMUOBJ)/network.o \ $(EMUOBJ)/output.o \ $(EMUOBJ)/render.o \ $(EMUOBJ)/rendfont.o \ @@ -106,6 +106,7 @@ $(EMUOBJ)/uiimage.o \ $(EMUOBJ)/uiinput.o \ $(EMUOBJ)/uiswlist.o \ + $(EMUOBJ)/uimain.o \ $(EMUOBJ)/uimenu.o \ $(EMUOBJ)/validity.o \ $(EMUOBJ)/video.o \ @@ -137,6 +138,7 @@ EMUDRIVEROBJS = \ $(EMUDRIVERS)/empty.o \ + $(EMUDRIVERS)/testcpu.o \ EMUMACHINEOBJS = \ $(EMUMACHINE)/53c810.o \ @@ -163,7 +165,6 @@ $(EMUMACHINE)/adc1038.o \ $(EMUMACHINE)/adc1213x.o \ $(EMUMACHINE)/am53cf96.o \ - $(EMUMACHINE)/am8530h.o \ $(EMUMACHINE)/amigafdc.o \ $(EMUMACHINE)/at28c16.o \ $(EMUMACHINE)/cdp1852.o \ @@ -188,6 +189,7 @@ $(EMUMACHINE)/i8255.o \ $(EMUMACHINE)/i8355.o \ $(EMUMACHINE)/idectrl.o \ + $(EMUMACHINE)/im6402.o \ $(EMUMACHINE)/ins8154.o \ $(EMUMACHINE)/ins8250.o \ $(EMUMACHINE)/intelfsh.o \ @@ -197,7 +199,8 @@ $(EMUMACHINE)/k053252.o \ $(EMUMACHINE)/k056230.o \ $(EMUMACHINE)/latch8.o \ - $(EMUMACHINE)/ldcore.o \ + $(EMUMACHINE)/laserdsc.o \ + $(EMUMACHINE)/ldstub.o \ $(EMUMACHINE)/ldpr8210.o \ $(EMUMACHINE)/ldv1000.o \ $(EMUMACHINE)/ldvp931.o \ @@ -212,10 +215,10 @@ $(EMUMACHINE)/mm74c922.o \ $(EMUMACHINE)/microtch.o \ $(EMUMACHINE)/mos6529.o \ - $(EMUMACHINE)/msm5832.o \ + $(EMUMACHINE)/msm5832.o \ $(EMUMACHINE)/msm58321.o \ $(EMUMACHINE)/msm6242.o \ - $(EMUMACHINE)/ncr539x.o \ + $(EMUMACHINE)/ncr539x.o \ $(EMUMACHINE)/nmc9306.o \ $(EMUMACHINE)/nvram.o \ $(EMUMACHINE)/pc16552d.o \ @@ -223,6 +226,7 @@ $(EMUMACHINE)/pd4990a.o \ $(EMUMACHINE)/pic8259.o \ $(EMUMACHINE)/pit8253.o \ + $(EMUMACHINE)/pls100.o \ $(EMUMACHINE)/ram.o \ $(EMUMACHINE)/roc10937.o \ $(EMUMACHINE)/rp5c01.o \ @@ -245,6 +249,7 @@ $(EMUMACHINE)/upd1990a.o \ $(EMUMACHINE)/upd4701.o \ $(EMUMACHINE)/upd7201.o \ + $(EMUMACHINE)/v3021.o \ $(EMUMACHINE)/wd17xx.o \ $(EMUMACHINE)/wd33c93.o \ $(EMUMACHINE)/x2212.o \ @@ -259,6 +264,7 @@ $(EMUMACHINE)/z8536.o \ EMUVIDEOOBJS = \ + $(EMUVIDEO)/315_5124.o \ $(EMUVIDEO)/cdp1861.o \ $(EMUVIDEO)/cdp1862.o \ $(EMUVIDEO)/crt9007.o \ @@ -270,16 +276,19 @@ $(EMUVIDEO)/hd44102.o \ $(EMUVIDEO)/hd61830.o \ $(EMUVIDEO)/hd63484.o \ - $(EMUVIDEO)/i8275.o \ + $(EMUVIDEO)/i8275.o \ $(EMUVIDEO)/k053250.o \ $(EMUVIDEO)/mc6845.o \ $(EMUVIDEO)/msm6255.o \ + $(EMUVIDEO)/pc_cga.o \ + $(EMUVIDEO)/cgapal.o \ $(EMUVIDEO)/pc_vga.o \ - $(EMUVIDEO)/poly.o \ - $(EMUVIDEO)/psx.o \ + $(EMUVIDEO)/poly.o \ + $(EMUVIDEO)/psx.o \ + $(EMUVIDEO)/ramdac.o \ $(EMUVIDEO)/resnet.o \ $(EMUVIDEO)/rgbutil.o \ - $(EMUVIDEO)/s2636.o \ + $(EMUVIDEO)/s2636.o \ $(EMUVIDEO)/saa5050.o \ $(EMUVIDEO)/sed1330.o \ $(EMUVIDEO)/tlc34076.o \ @@ -287,7 +296,7 @@ $(EMUVIDEO)/tms9927.o \ $(EMUVIDEO)/tms9928a.o \ $(EMUVIDEO)/upd3301.o \ - $(EMUVIDEO)/v9938.o \ + $(EMUVIDEO)/v9938.o \ $(EMUVIDEO)/vector.o \ $(EMUVIDEO)/voodoo.o \ @@ -299,7 +308,6 @@ $(EMUIMAGEDEV)/flopdrv.o \ $(EMUIMAGEDEV)/floppy.o \ $(EMUIMAGEDEV)/harddriv.o \ - $(EMUIMAGEDEV)/multcart.o \ $(EMUIMAGEDEV)/printer.o \ $(EMUIMAGEDEV)/serial.o \ $(EMUIMAGEDEV)/snapquik.o \ @@ -340,7 +348,6 @@ $(EMUOBJ)/rendfont.o: $(EMUOBJ)/uismall.fh $(EMUOBJ)/video.o: $(EMUSRC)/rendersw.c -$(EMUVIDEO)/v9938.o: $(EMUSRC)/video/v9938mod.c $(EMUMACHINE)/s3c2400.o: $(EMUSRC)/machine/s3c24xx.c $(EMUMACHINE)/s3c2410.o: $(EMUSRC)/machine/s3c24xx.c diff -Nru mame-0.144/src/emu/emuopts.c mame-0.145/src/emu/emuopts.c --- mame-0.144/src/emu/emuopts.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/emuopts.c 2012-02-06 21:30:28.000000000 +0000 @@ -226,11 +226,11 @@ // iterate through all slot devices options_entry entry[2] = { { 0 }, { 0 } }; bool first = true; - const device_slot_interface *slot = NULL; // create the configuration machine_config config(*cursystem, *this); bool added = false; - for (bool gotone = config.devicelist().first(slot); gotone; gotone = slot->next(slot)) + slot_interface_iterator iter(config.root_device()); + for (const device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) { // first device? add the header as to be pretty if (first && isfirst) @@ -244,16 +244,13 @@ first = false; // retrieve info about the device instance - astring option_name; - option_name.printf("%s;%s", slot->device().tag(), slot->device().tag()); - - if (!exists(slot->device().tag())) { + if (!exists(slot->device().tag() + 1)) { // add the option - entry[0].name = slot->device().tag(); + entry[0].name = slot->device().tag() + 1; entry[0].description = NULL; entry[0].flags = OPTION_STRING | OPTION_FLAG_DEVICE; - entry[0].defvalue = (slot->get_slot_interfaces() != NULL) ? slot->get_default_card(config.devicelist(),*this) : NULL; + entry[0].defvalue = (slot->get_slot_interfaces() != NULL) ? slot->get_default_card(config,*this) : NULL; add_entries(entry, true); added = true; @@ -263,6 +260,33 @@ } //------------------------------------------------- +// update_slot_options - update slot values +// depending of image mounted +//------------------------------------------------- + +void emu_options::update_slot_options() +{ + // look up the system configured by name; if no match, do nothing + const game_driver *cursystem = system(); + if (cursystem == NULL) + return; + + // iterate through all slot devices + // create the configuration + machine_config config(*cursystem, *this); + slot_interface_iterator iter(config.root_device()); + for (const device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) + { + // retrieve info about the device instance + if (exists(slot->device().tag()+1)) { + if (slot->get_slot_interfaces() != NULL) { + const char *def = slot->get_default_card_software(config,*this); + if (def) set_default_value(slot->device().tag()+1,def); + } + } + } +} +//------------------------------------------------- // add_device_options - add all of the device // options for the configured system //------------------------------------------------- @@ -278,9 +302,9 @@ options_entry entry[2] = { { 0 }, { 0 } }; bool first = true; // iterate through all image devices - const device_image_interface *image = NULL; machine_config config(*cursystem, *this); - for (bool gotone = config.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(config.root_device()); + for (const device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { // first device? add the header as to be pretty if (first && isfirst) @@ -336,7 +360,6 @@ bool emu_options::parse_slot_devices(int argc, char *argv[], astring &error_string, const char *name, const char *value) { - remove_device_options(); bool isfirst = true; bool result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); while (add_slot_options(isfirst)) { @@ -348,6 +371,7 @@ set_value(name, value, OPTION_PRIORITY_CMDLINE, error_string); } result = core_options::parse_command_line(argc, argv, OPTION_PRIORITY_CMDLINE, error_string); + update_slot_options(); return result; } @@ -368,6 +392,7 @@ if (old_system_name != system_name()) { // remove any existing device options + remove_device_options(); result = parse_slot_devices(argc, argv, error_string, NULL, NULL); } return result; @@ -386,8 +411,8 @@ // parse the INI file defined by the platform (e.g., "mame.ini") // we do this twice so that the first file can change the INI path - parse_one_ini(CONFIGNAME, OPTION_PRIORITY_MAME_INI); - parse_one_ini(CONFIGNAME, OPTION_PRIORITY_MAME_INI, &error_string); + parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI); + parse_one_ini(emulator_info::get_configname(), OPTION_PRIORITY_MAME_INI, &error_string); // debug mode: parse "debug.ini" as well if (debug()) @@ -407,7 +432,8 @@ // parse "vector.ini" for vector games { machine_config config(*cursystem, *this); - for (const screen_device *device = config.first_screen(); device != NULL; device = device->next_screen()) + screen_device_iterator iter(config.root_device()); + for (const screen_device *device = iter.first(); device != NULL; device = iter.next()) if (device->screen_type() == SCREEN_TYPE_VECTOR) { parse_one_ini("vector", OPTION_PRIORITY_VECTOR_INI, &error_string); @@ -417,10 +443,10 @@ // next parse "source/.ini"; if that doesn't exist, try .ini astring sourcename; - core_filename_extract_base(&sourcename, cursystem->source_file, TRUE)->ins(0, "source" PATH_SEPARATOR); + core_filename_extract_base(sourcename, cursystem->source_file, true).ins(0, "source" PATH_SEPARATOR); if (!parse_one_ini(sourcename, OPTION_PRIORITY_SOURCE_INI, &error_string)) { - core_filename_extract_base(&sourcename, cursystem->source_file, TRUE); + core_filename_extract_base(sourcename, cursystem->source_file, true); parse_one_ini(sourcename, OPTION_PRIORITY_SOURCE_INI, &error_string); } @@ -443,7 +469,7 @@ const game_driver *emu_options::system() const { astring tempstr; - int index = driver_list::find(*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; } @@ -473,6 +499,7 @@ } // then add the options add_device_options(true); + update_slot_options(); } } diff -Nru mame-0.144/src/emu/emuopts.h mame-0.145/src/emu/emuopts.h --- mame-0.144/src/emu/emuopts.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/emuopts.h 2012-02-06 21:30:28.000000000 +0000 @@ -352,11 +352,12 @@ // device-specific options const char *device_option(device_image_interface &image); + void remove_device_options(); private: // device-specific option handling void add_device_options(bool isfirst); bool add_slot_options(bool isfirst); - void remove_device_options(); + void update_slot_options(); // INI parsing helper bool parse_one_ini(const char *basename, int priority, astring *error_string = NULL); diff -Nru mame-0.144/src/emu/emupal.c mame-0.145/src/emu/emupal.c --- mame-0.144/src/emu/emupal.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/emupal.c 2012-02-06 21:30:28.000000000 +0000 @@ -119,8 +119,7 @@ /* determine the color mode */ switch (format) { - case BITMAP_FORMAT_INDEXED16: - case BITMAP_FORMAT_RGB15: + case BITMAP_FORMAT_IND16: case BITMAP_FORMAT_RGB32: /* indexed and RGB modes are fine for everything */ break; @@ -268,7 +267,7 @@ int i; /* only applies to RGB direct modes */ - assert(palette->format != BITMAP_FORMAT_INDEXED16); + assert(palette->format != BITMAP_FORMAT_IND16); assert(stable->base != NULL); /* clamp the deltas (why?) */ @@ -477,7 +476,7 @@ /* iterate over all colors in the tilemap */ for (color = 0; color < gfx->total_colors; color++) - tilemap_set_transmask(tmap, color, colortable_get_transpen_mask(ctable, gfx, color, transcolor), 0); + tmap->set_transmask(color, colortable_get_transpen_mask(ctable, gfx, color, transcolor), 0); } @@ -614,7 +613,7 @@ switch (palette->format) { /* 16-bit paletteized case */ - case BITMAP_FORMAT_INDEXED16: + case BITMAP_FORMAT_IND16: palette->black_pen = palette_get_black_entry(machine.palette); palette->white_pen = palette_get_white_entry(machine.palette); if (palette->black_pen >= 65536) @@ -623,12 +622,6 @@ palette->white_pen = 65536; break; - /* 15-bit direct case */ - case BITMAP_FORMAT_RGB15: - palette->black_pen = rgb_to_rgb15(MAKE_RGB(0x00,0x00,0x00)); - palette->white_pen = rgb_to_rgb15(MAKE_RGB(0xff,0xff,0xff)); - break; - /* 32-bit direct case */ case BITMAP_FORMAT_RGB32: palette->black_pen = MAKE_RGB(0x00,0x00,0x00); @@ -657,17 +650,13 @@ /* allocate memory for the pen table */ switch (palette->format) { - case BITMAP_FORMAT_INDEXED16: + case BITMAP_FORMAT_IND16: /* create a dummy 1:1 mapping */ machine.pens = pentable = auto_alloc_array(machine, pen_t, total_colors + 2); for (i = 0; i < total_colors + 2; i++) pentable[i] = i; break; - case BITMAP_FORMAT_RGB15: - machine.pens = palette_entry_list_adjusted_rgb15(machine.palette); - break; - case BITMAP_FORMAT_RGB32: machine.pens = palette_entry_list_adjusted(machine.palette); break; @@ -693,7 +682,7 @@ int i; /* palettized mode gets a single 64k table in slots 0 and 2 */ - if (palette->format == BITMAP_FORMAT_INDEXED16) + if (palette->format == BITMAP_FORMAT_IND16) { palette->shadow_table[0].base = palette->shadow_table[2].base = table; for (i = 0; i < 65536; i++) @@ -716,7 +705,7 @@ int i; /* palettized mode gets a single 64k table in slots 1 and 3 */ - if (palette->format == BITMAP_FORMAT_INDEXED16) + if (palette->format == BITMAP_FORMAT_IND16) { palette->shadow_table[1].base = palette->shadow_table[3].base = table; for (i = 0; i < 65536; i++) @@ -750,7 +739,7 @@ int i; /* only applies to RGB direct modes */ - assert(palette->format != BITMAP_FORMAT_INDEXED16); + assert(palette->format != BITMAP_FORMAT_IND16); assert(stable->base != NULL); /* regenerate the table */ diff -Nru mame-0.144/src/emu/emutempl.h mame-0.145/src/emu/emutempl.h --- mame-0.144/src/emu/emutempl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/emutempl.h 2012-02-06 21:30:26.000000000 +0000 @@ -59,11 +59,11 @@ public: // construction/destruction - simple_list(resource_pool &pool = global_resource_pool) : - m_head(NULL), - m_tail(NULL), - m_pool(pool), - m_count(0) { } + simple_list(resource_pool &pool = global_resource_pool()) + : m_head(NULL), + m_tail(NULL), + m_pool(pool), + m_count(0) { } virtual ~simple_list() { reset(); } @@ -307,7 +307,7 @@ public: // construction/destruction - fixed_allocator(resource_pool &pool = global_resource_pool) + fixed_allocator(resource_pool &pool = global_resource_pool()) : m_freelist(pool) { } // allocate a new item, either by recycling an old one, or by allocating a new one @@ -343,8 +343,8 @@ public: // construction/destruction - tagged_list(resource_pool &pool = global_resource_pool) : - m_list(pool) { } + tagged_list(resource_pool &pool = global_resource_pool()) + : m_list(pool) { } // simple getters resource_pool &pool() const { return m_list.pool(); } diff -Nru mame-0.144/src/emu/hash.c mame-0.145/src/emu/hash.c --- mame-0.144/src/emu/hash.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/hash.c 2012-02-06 21:30:28.000000000 +0000 @@ -590,7 +590,7 @@ buffer.reset(); for (hash_base *hash = m_hashlist.first(); hash != NULL; hash = hash->next()) { - buffer.cat(temp.cpy(hash->name()).toupper()); + buffer.cat(temp.cpy(hash->name()).makeupper()); buffer.cat("(").cat(hash->string(temp)).cat(") "); } diff -Nru mame-0.144/src/emu/image.c mame-0.145/src/emu/image.c --- mame-0.144/src/emu/image.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/image.c 2012-02-06 21:30:28.000000000 +0000 @@ -68,7 +68,6 @@ xml_data_node *node; const char *dev_instance; const char *working_directory; - device_image_interface *image = NULL; if ((config_type == CONFIG_TYPE_GAME) && (parentnode != NULL)) { @@ -78,7 +77,8 @@ if ((dev_instance != NULL) && (dev_instance[0] != '\0')) { - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { if (!strcmp(dev_instance, image->instance_name())) { working_directory = xml_get_attribute_string(node, "directory", NULL); @@ -102,12 +102,12 @@ { xml_data_node *node; const char *dev_instance; - device_image_interface *image = NULL; /* only care about game-specific data */ if (config_type == CONFIG_TYPE_GAME) { - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { dev_instance = image->instance_name(); @@ -160,9 +160,9 @@ no need to assert in case they are missing */ { int index = 0; - device_image_interface *image = NULL; - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { const char *filename = image->filename(); @@ -186,12 +186,11 @@ void image_unload_all(running_machine &machine) { - device_image_interface *image = NULL; - // extract the options image_options_extract(machine); - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { // unload this image image->unload(); @@ -205,10 +204,10 @@ void image_device_init(running_machine &machine) { const char *image_name; - device_image_interface *image = NULL; /* make sure that any required devices have been allocated */ - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { /* is an image specified for this image */ image_name = machine.options().device_option(*image); @@ -237,7 +236,14 @@ image_err.cstr()); } } - else + } + + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) + { + /* is an image specified for this image */ + image_name = image->filename(); + + if (!((image_name != NULL) && (image_name[0] != '\0'))) { /* no image... must this device be loaded? */ if (image->must_be_loaded()) @@ -257,10 +263,9 @@ void image_postdevice_init(running_machine &machine) { - device_image_interface *image = NULL; - /* make sure that any required devices have been allocated */ - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { int result = image->finish_load(); /* did the image load fail? */ @@ -364,21 +369,20 @@ string with the image info text -------------------------------------------------*/ -astring *image_info_astring(running_machine &machine, astring *string) +astring &image_info_astring(running_machine &machine, astring &string) { - device_image_interface *image = NULL; - - astring_printf(string, "%s\n\n", machine.system().description); + string.printf("%s\n\n", machine.system().description); #if 0 if (mess_ram_size > 0) { char buf2[RAM_STRING_BUFLEN]; - astring_catprintf(string, "RAM: %s\n\n", ram_string(buf2, mess_ram_size)); + string.catprintf("RAM: %s\n\n", ram_string(buf2, mess_ram_size)); } #endif - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { const char *name = image->filename(); if (name != NULL) @@ -391,28 +395,28 @@ base_filename_noextension = strip_extension(base_filename); /* display device type and filename */ - astring_catprintf(string, "%s: %s\n", image->device().name(), base_filename); + string.catprintf("%s: %s\n", image->device().name(), base_filename); /* display long filename, if present and doesn't correspond to name */ info = image->longname(); if (info && (!base_filename_noextension || mame_stricmp(info, base_filename_noextension))) - astring_catprintf(string, "%s\n", info); + string.catprintf("%s\n", info); /* display manufacturer, if available */ info = image->manufacturer(); if (info != NULL) { - astring_catprintf(string, "%s", info); + string.catprintf("%s", info); info = stripspace(image->year()); if (info && *info) - astring_catprintf(string, ", %s", info); - astring_catprintf(string,"\n"); + string.catprintf(", %s", info); + string.catprintf("\n"); } /* display supported information, if available */ switch(image->supported()) { - case SOFTWARE_SUPPORTED_NO : astring_catprintf(string, "Not supported\n"); break; - case SOFTWARE_SUPPORTED_PARTIAL : astring_catprintf(string, "Partialy supported\n"); break; + case SOFTWARE_SUPPORTED_NO : string.catprintf("Not supported\n"); break; + case SOFTWARE_SUPPORTED_PARTIAL : string.catprintf("Partialy supported\n"); break; default : break; } @@ -421,7 +425,7 @@ } else { - astring_catprintf(string, "%s: ---\n", image->device().name()); + string.catprintf("%s: ---\n", image->device().name()); } } return string; @@ -473,15 +477,8 @@ -------------------------------------------------*/ device_image_interface *image_from_absolute_index(running_machine &machine, int absolute_index) { - device_image_interface *image = NULL; - int cnt = 0; - /* make sure that any required devices have been allocated */ - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) - { - if (cnt==absolute_index) return image; - cnt++; - } - return NULL; + image_interface_iterator iter(machine.root_device()); + return iter.byindex(absolute_index); } /*------------------------------------------------- diff -Nru mame-0.144/src/emu/imagedev/bitbngr.c mame-0.145/src/emu/imagedev/bitbngr.c --- mame-0.144/src/emu/imagedev/bitbngr.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/imagedev/bitbngr.c 2012-02-06 21:30:28.000000000 +0000 @@ -12,83 +12,46 @@ /*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef struct _bitbanger_token bitbanger_token; -struct _bitbanger_token -{ - emu_timer *bitbanger_output_timer; - emu_timer *bitbanger_input_timer; - int output_value; - int build_count; - int build_byte; - attotime idle_delay; - attotime current_baud; - UINT32 input_buffer_size; - UINT32 input_buffer_cursor; - int mode; - int baud; - int tune; - UINT8 input_buffer[1000]; -}; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static TIMER_CALLBACK(bitbanger_output_timer); -static TIMER_CALLBACK(bitbanger_input_timer); - - - -/*************************************************************************** - INLINE FUNCTIONS + IMPLEMENTATION ***************************************************************************/ +const device_type BITBANGER = &device_creator; /*------------------------------------------------- - get_token - safely gets the bitbanger data --------------------------------------------------*/ - -INLINE bitbanger_token *get_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == BITBANGER); - return (bitbanger_token *) downcast(device)->token(); -} - - -/*------------------------------------------------- - get_config - safely gets the bitbanger config + ctor -------------------------------------------------*/ -INLINE const bitbanger_config *get_config(device_t *device) -{ - assert(device != NULL); - assert(device->type() == BITBANGER); - return (const bitbanger_config *) device->static_config(); +bitbanger_device::bitbanger_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, BITBANGER, "Bitbanger", tag, owner, clock), + device_image_interface(mconfig, *this) +{ + m_output_timer = NULL; + m_input_timer = NULL; + m_output_value = 0; + m_build_count = 0; + m_build_byte = 0; + m_idle_delay = attotime::zero; + m_current_baud = attotime::zero; + m_input_buffer_size = 0; + m_input_buffer_cursor = 0; + m_mode = 0; + m_baud = 0; + m_tune = 0; + m_current_input = 0; + memset(m_input_buffer, 0, sizeof(m_input_buffer)); } -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - - /*------------------------------------------------- native_output - outputs data to a file -------------------------------------------------*/ -static void native_output(device_t *bitbanger, UINT8 data) +void bitbanger_device::native_output(UINT8 data) { - device_image_interface *image = dynamic_cast(bitbanger); - if (image->exists()) + if (exists()) { - image->fwrite(&data, 1); + fwrite(&data, 1); } } @@ -97,427 +60,434 @@ native_input - inputs data from a file -------------------------------------------------*/ -static UINT32 native_input(device_t *bitbanger, void *buffer, UINT32 length) +UINT32 bitbanger_device::native_input(void *buffer, UINT32 length) { - device_image_interface *image = dynamic_cast(bitbanger); - if (image->exists()) + if (exists()) { - return image->fread(buffer, length); + return fread(buffer, length); } - return 0; } + /*------------------------------------------------- - bitbanger_mode_string + mode_string -------------------------------------------------*/ -const char *bitbanger_mode_string(device_t *device) + +const char *bitbanger_device::mode_string(void) { - bitbanger_token *bi = get_token(device); static const char *const modes[] = {"Printer", "Modem"}; - - return(modes[bi->mode]); + return modes[m_mode]; } + /*------------------------------------------------- - bitbanger_inc_mode + inc_mode -------------------------------------------------*/ -bool bitbanger_inc_mode(device_t *device, bool test) + +bool bitbanger_device::inc_mode(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_mode = (int)bi->mode + 1; + int adjust_mode = (int)m_mode + 1; - if( adjust_mode >= BITBANGER_MODE_MAX ) - return FALSE; + if( adjust_mode >= BITBANGER_MODE_MAX ) + return FALSE; - if( !test) - bi->mode = adjust_mode; + if( !test) + m_mode = adjust_mode; - return TRUE; + return TRUE; } + /*------------------------------------------------- - bitbanger_dec_mode + dec_mode -------------------------------------------------*/ -bool bitbanger_dec_mode(device_t *device, bool test) + +bool bitbanger_device::dec_mode(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_mode = bi->mode - 1; + int adjust_mode = m_mode - 1; - if( adjust_mode < 0 ) - return FALSE; + if( adjust_mode < 0 ) + return FALSE; - if( !test) - bi->mode = adjust_mode; + if( !test) + m_mode = adjust_mode; - return TRUE; + return TRUE; } + /*------------------------------------------------- - bitbanger_tune_string + tune_string -------------------------------------------------*/ -const char *bitbanger_tune_string(device_t *device) + +const char *bitbanger_device::tune_string(void) { - bitbanger_token *bi = get_token(device); static const char *const tunes[] = {"-2.0%", "-1.75%", "-1.5%", "-1.25%", "-1.0%", "-0.75%", "-0.5", "-0.25%", "\xc2\xb1""0%", "+0.25%", "+0.5%", "+0.75%", "+1.0%", "+1.25%", "+1.5%", "+1.75%", "+2.0%"}; - - return(tunes[bi->tune]); + return tunes[m_tune]; } + /*------------------------------------------------- - bitbanger_tune_value + tune_value -------------------------------------------------*/ -static float bitbanger_tune_value(device_t *device) + +float bitbanger_device::tune_value(void) { - bitbanger_token *bi = get_token(device); static const float tunes[] = {0.97f, 0.9825f, 0.985f, 0.9875f, 0.99f, 0.9925f, 0.995f, 0.9975f, 1.0f, 1.0025f, 1.005f, 1.0075f, 1.01f, 1.0125f, 1.015f, 1.0175f, 1.02f}; - - return(tunes[bi->tune]); + return tunes[m_tune]; } + /*------------------------------------------------- - bitbanger_baud_value + baud_value -------------------------------------------------*/ -static UINT32 bitbanger_baud_value(device_t *device) +UINT32 bitbanger_device::baud_value(void) { - bitbanger_token *bi = get_token(device); static const float bauds[] = { 150.0f, 300.0f, 600.0f, 1200.0f, 2400.0f, 4800.0f, 9600.0f, 14400.0f, 28800.0f, 38400.0f, 57600.0f, 115200.0f}; - float result = bitbanger_tune_value(device) * bauds[bi->baud]; + float result = tune_value() * bauds[m_baud]; return (UINT32)result; } /*------------------------------------------------- - bitbanger_baud_string + baud_string -------------------------------------------------*/ -const char *bitbanger_baud_string(device_t *device) +const char *bitbanger_device::baud_string(void) { - bitbanger_token *bi = get_token(device); static const char *const bauds[] = { "150", "300", "600", "1200", "2400", "4800", "9600", "14400", "28800", "38400", "57600", "115200"}; - return(bauds[bi->baud]); + return(bauds[m_baud]); } + /*------------------------------------------------- - bitbanger_inc_baud + inc_baud -------------------------------------------------*/ -bool bitbanger_inc_baud(device_t *device, bool test) + +bool bitbanger_device::inc_baud(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_baud = (int)bi->baud + 1; + int adjust_baud = (int)m_baud + 1; - if( adjust_baud >= BITBANGER_BAUD_MAX ) - return FALSE; + if( adjust_baud >= BITBANGER_BAUD_MAX ) + return FALSE; - if( !test) - { - bi->baud = adjust_baud; - bi->current_baud = attotime::from_hz(bitbanger_baud_value(device)); - } + if( !test) + { + m_baud = adjust_baud; + m_current_baud = attotime::from_hz(baud_value()); + } - return TRUE; + return TRUE; } /*------------------------------------------------- - bitbanger_dec_baud + dec_baud -------------------------------------------------*/ -bool bitbanger_dec_baud(device_t *device, bool test) + +bool bitbanger_device::dec_baud(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_baud = bi->baud - 1; + int adjust_baud = m_baud - 1; - if( adjust_baud < 0 ) - return FALSE; + if( adjust_baud < 0 ) + return FALSE; - if( !test) - { - bi->baud = adjust_baud; - bi->current_baud = attotime::from_hz(bitbanger_baud_value(device)); - } + if( !test) + { + m_baud = adjust_baud; + m_current_baud = attotime::from_hz(baud_value()); + } - return TRUE; + return TRUE; } /*------------------------------------------------- - bitbanger_inc_tune + inc_tune -------------------------------------------------*/ -bool bitbanger_inc_tune(device_t *device, bool test) + +bool bitbanger_device::inc_tune(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_tune = (int)bi->tune + 1; + int adjust_tune = (int)m_tune + 1; - if( adjust_tune >= BITBANGER_TUNE_MAX ) - return FALSE; + if( adjust_tune >= BITBANGER_TUNE_MAX ) + return FALSE; - if( !test) - { - bi->tune = adjust_tune; - bi->current_baud = attotime::from_hz(bitbanger_baud_value(device)); - } + if (!test) + { + m_tune = adjust_tune; + m_current_baud = attotime::from_hz(baud_value()); + } - return TRUE; + return TRUE; } + /*------------------------------------------------- - bitbanger_dec_tune + dec_tune -------------------------------------------------*/ -bool bitbanger_dec_tune(device_t *device, bool test) + +bool bitbanger_device::dec_tune(bool test) { - bitbanger_token *bi = get_token(device); - int adjust_tune = bi->tune - 1; + int adjust_tune = m_tune - 1; - if( adjust_tune < 0 ) - return FALSE; + if( adjust_tune < 0 ) + return FALSE; - if( !test) - { - bi->tune = adjust_tune; - bi->current_baud = attotime::from_hz(bitbanger_baud_value(device)); - } + if( !test) + { + m_tune = adjust_tune; + m_current_baud = attotime::from_hz(baud_value()); + } - return TRUE; + return TRUE; } + /*------------------------------------------------- - bitbanger_bytes_to_bits_81N + bytes_to_bits_81N -------------------------------------------------*/ -static void bitbanger_bytes_to_bits_81N(device_t *img) + +void bitbanger_device::bytes_to_bits_81N(void) { - bitbanger_token *bi = get_token(img); - UINT8 byte_buffer[100]; - UINT32 byte_buffer_size, bit_buffer_size; - int i, j; - static const UINT8 bitmask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; + UINT8 byte_buffer[100]; + UINT32 byte_buffer_size, bit_buffer_size; + int i, j; + static const UINT8 bitmask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; - bit_buffer_size = 0; - byte_buffer_size = native_input(img, byte_buffer, sizeof(byte_buffer)); + bit_buffer_size = 0; + byte_buffer_size = native_input(byte_buffer, sizeof(byte_buffer)); - /* Translate byte buffer into bit buffer using: 1 start bit, 8 data bits, 1 stop bit, no parity */ + /* Translate byte buffer into bit buffer using: 1 start bit, 8 data bits, 1 stop bit, no parity */ - for( i=0; iinput_buffer[bit_buffer_size++] = 0; + for( i=0; iinput_buffer[bit_buffer_size++] = 1; - else - bi->input_buffer[bit_buffer_size++] = 0; - } + for( j=0; j<8; j++ ) + { + if( byte_buffer[i] & bitmask[j] ) + m_input_buffer[bit_buffer_size++] = 1; + else + m_input_buffer[bit_buffer_size++] = 0; + } - bi->input_buffer[bit_buffer_size++] = 1; - } + m_input_buffer[bit_buffer_size++] = 1; + } - bi->input_buffer_size = bit_buffer_size; - bi->input_buffer_cursor = 0; + m_input_buffer_size = bit_buffer_size; + m_input_buffer_cursor = 0; } + /*------------------------------------------------- - DEVICE_START(bitbanger) + device_start -------------------------------------------------*/ -static DEVICE_START(bitbanger) +void bitbanger_device::device_start(void) { - bitbanger_token *bi; - const bitbanger_config *config = get_config(device); - - bi = get_token(device); + const bitbanger_config *config = (const bitbanger_config *) static_config(); /* output config */ - bi->build_count = 0; - bi->bitbanger_output_timer = device->machine().scheduler().timer_alloc(FUNC(bitbanger_output_timer), (void *) device); + m_build_count = 0; + m_output_timer = timer_alloc(TIMER_OUTPUT); /* input config */ - bi->bitbanger_input_timer = device->machine().scheduler().timer_alloc(FUNC(bitbanger_input_timer), (void *) device ); - bi->idle_delay = attotime::from_seconds(1); - bi->input_buffer_size = 0; - bi->input_buffer_cursor = 0; + m_input_timer = timer_alloc(TIMER_INPUT); + m_idle_delay = attotime::from_seconds(1); + m_input_buffer_size = 0; + m_input_buffer_cursor = 0; - bi->mode = config->default_mode; - bi->baud = config->default_baud; - bi->tune = config->default_tune; - bi->current_baud = attotime::from_hz(bitbanger_baud_value(device)); + /* defaults */ + m_mode = config->m_default_mode; + m_baud = config->m_default_baud; + m_tune = config->m_default_tune; + m_current_baud = attotime::from_hz(baud_value()); - /* test callback */ - if(!config->input_callback) - fatalerror("Misconfigured bitbanger device: input_callback cannot be NULL\n"); + /* callback */ + m_input_callback.resolve(config->m_input_callback, *this); } + /*------------------------------------------------- - TIMER_CALLBACK(bitbanger_output_timer) + device_config_complete -------------------------------------------------*/ -static TIMER_CALLBACK(bitbanger_output_timer) +void bitbanger_device::device_config_complete(void) { - device_t *device = (device_t *) ptr; - bitbanger_token *bi = get_token(device); + update_names(); +} - /* this ia harded coded for 8-1-N */ - if( bi->output_value ) - bi->build_byte |= 0x200; - bi->build_byte >>= 1; - bi->build_count--; - if(bi->build_count == 0) - { - if( bi->output_value == 1 ) - native_output( device, bi->build_byte ); - else - logerror("Bitbanger: Output framing error.\n" ); +/*------------------------------------------------- + device_timer +-------------------------------------------------*/ - bi->bitbanger_output_timer->reset(); - } +void bitbanger_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) + { + case TIMER_OUTPUT: + timer_output(); + break; + + case TIMER_INPUT: + timer_input(); + break; + } } + /*------------------------------------------------- - TIMER_CALLBACK(bitbanger_input_timer) + timer_output -------------------------------------------------*/ -static TIMER_CALLBACK(bitbanger_input_timer) +void bitbanger_device::timer_output(void) { - device_t *device = (device_t *) ptr; - bitbanger_token *bi = get_token(device); - const bitbanger_config *config = get_config(device); + /* this ia harded coded for 8-1-N */ + if( m_output_value ) + m_build_byte |= 0x200; - if(bi->input_buffer_cursor == bi->input_buffer_size) - { - /* get more data */ - bitbanger_bytes_to_bits_81N(device); + m_build_byte >>= 1; + m_build_count--; - if(bi->input_buffer_size == 0) - { - /* no more data, wait and try again */ - bi->idle_delay = min(bi->idle_delay + attotime::from_msec(100), attotime::from_seconds(1)); - bi->bitbanger_input_timer->adjust(bi->idle_delay); - - - if( bi->mode == BITBANGER_MODEM ) - config->input_callback(machine, 1); - else - config->input_callback(machine, 0); - - return; - } - else - { - bi->idle_delay = bi->current_baud; - bi->bitbanger_input_timer->adjust(bi->idle_delay, 0, bi->idle_delay); - } - } + if(m_build_count == 0) + { + if( m_output_value == 1 ) + native_output(m_build_byte); + else + logerror("Bitbanger: Output framing error.\n" ); - /* send bit to driver */ - config->input_callback(machine, bi->input_buffer[(bi->input_buffer_cursor)++]); + m_output_timer->reset(); + } } + /*------------------------------------------------- - bitbanger_output - outputs data to a bitbanger - port + timer_input -------------------------------------------------*/ -void bitbanger_output(device_t *device, int value) +void bitbanger_device::timer_input(void) { - bitbanger_token *bi = get_token(device); - attotime one_point_five_baud; - - if( bi->build_count == 0 && bi->output_value == 1 && value == 0 ) - { - /* we found our start bit */ - /* eight bits of data, plus one of stop */ - bi->build_count = 9; - bi->build_byte = 0; + if(m_input_buffer_cursor == m_input_buffer_size) + { + /* get more data */ + bytes_to_bits_81N(); - one_point_five_baud = bi->current_baud + bi->current_baud / 2; - bi->bitbanger_output_timer->adjust(one_point_five_baud, 0, bi->current_baud); - } + if(m_input_buffer_size == 0) + { + /* no more data, wait and try again */ + m_idle_delay = min(m_idle_delay + attotime::from_msec(100), attotime::from_seconds(1)); + m_input_timer->adjust(m_idle_delay); + + if( m_mode == BITBANGER_MODEM ) + set_input_line(1); + else + set_input_line(0); + return; + } + else + { + m_idle_delay = m_current_baud; + m_input_timer->adjust(m_idle_delay, 0, m_idle_delay); + } + } - //fprintf(stderr,"%s, %d\n", device->machine().time().as_string(9), value); - bi->output_value = value; + /* send bit to driver */ + set_input_line(m_input_buffer[(m_input_buffer_cursor)++]); } + /*------------------------------------------------- - DEVICE_IMAGE_LOAD( bitbanger ) + set_input_line -------------------------------------------------*/ -static DEVICE_IMAGE_LOAD( bitbanger ) +void bitbanger_device::set_input_line(UINT8 line) { - device_t *device = &image.device(); - bitbanger_token *bi; - bi = get_token(device); - - bi->bitbanger_input_timer->enable(true); - bi->bitbanger_input_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); + /* normalize */ + line = line ? ASSERT_LINE : CLEAR_LINE; - /* we don't need to do anything special */ - return IMAGE_INIT_PASS; + /* only act when the state changes */ + if (m_current_input != line) + { + m_current_input = line; + if (!m_input_callback.isnull()) + { + m_input_callback(line ? ASSERT_LINE : CLEAR_LINE); + } + } } + /*------------------------------------------------- - DEVICE_IMAGE_UNLOAD( bitbanger ) + output - outputs data to a bitbanger port -------------------------------------------------*/ -static DEVICE_IMAGE_UNLOAD( bitbanger ) +void bitbanger_device::output(int value) { - device_t *device = &image.device(); - bitbanger_token *bi; - bi = get_token(device); + attotime one_point_five_baud; - bi->bitbanger_input_timer->enable(false); + if( m_build_count == 0 && m_output_value == 1 && value == 0 ) + { + /* we found our start bit */ + /* eight bits of data, plus one of stop */ + m_build_count = 9; + m_build_byte = 0; + + one_point_five_baud = m_current_baud + m_current_baud / 2; + m_output_timer->adjust(one_point_five_baud, 0, m_current_baud); + } + + //fprintf(stderr,"%s, %d\n", device->machine().time().as_string(9), value); + m_output_value = value; } + /*------------------------------------------------- - DEVICE_GET_INFO(bitbanger) - device getinfo - function + call_load -------------------------------------------------*/ -DEVICE_GET_INFO(bitbanger) +bool bitbanger_device::call_load(void) { - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(bitbanger_token); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_PRINTER; break; - case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_CREATABLE: info->i = 1; break; + m_input_timer->enable(true); + m_input_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); + + /* we don't need to do anything special */ + return IMAGE_INIT_PASS; +} - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(bitbanger); break; - case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(bitbanger); break; - case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(bitbanger); break; - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Bitbanger"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Bitbanger"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: strcpy(info->s, "prn"); break; - } + +/*------------------------------------------------- + call_unload +-------------------------------------------------*/ + +void bitbanger_device::call_unload(void) +{ + m_input_timer->enable(false); } -DEFINE_LEGACY_IMAGE_DEVICE(BITBANGER, bitbanger); diff -Nru mame-0.144/src/emu/imagedev/bitbngr.h mame-0.145/src/emu/imagedev/bitbngr.h --- mame-0.144/src/emu/imagedev/bitbngr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/imagedev/bitbngr.h 2012-02-06 21:30:28.000000000 +0000 @@ -55,7 +55,6 @@ /*************************************************************************** CONSTANTS ***************************************************************************/ -DECLARE_LEGACY_IMAGE_DEVICE(BITBANGER, bitbanger); #define MCFG_BITBANGER_ADD(_tag, _intrf) \ MCFG_DEVICE_ADD(_tag, BITBANGER, 0) \ @@ -70,30 +69,101 @@ struct _bitbanger_config { /* callback to driver */ - void (*input_callback)(running_machine &machine, UINT8 bit); - int default_mode; /* emulating a printer or modem */ - int default_baud; /* output bits per second */ - int default_tune; /* fine tune adjustment to the baud */ + devcb_write_line m_input_callback; + + /* emulating a printer or modem */ + int m_default_mode; + + /* output bits per second */ + int m_default_baud; + + /* fine tune adjustment to the baud */ + int m_default_tune; }; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +class bitbanger_device : public device_t, + public device_image_interface +{ +public: + // construction/destruction + bitbanger_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload(); + + // image device + virtual iodevice_t image_type() const { return IO_PRINTER; } + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 1; } + virtual bool is_creatable() const { return 1; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 0; } + virtual const char *file_extensions() const { return "prn"; } + virtual const option_guide *create_option_guide() const { return NULL; } + + // outputs data to a bitbanger port + void output(int value); + + // reads the current input value + int input(void) const { return m_current_input; } + + // ui functions + const char *mode_string(void); + const char *baud_string(void); + const char *tune_string(void); + bool inc_mode(bool test); + bool dec_mode(bool test); + bool inc_tune(bool test); + bool dec_tune(bool test); + bool inc_baud(bool test); + bool dec_baud(bool test); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void device_config_complete(); + +private: + // constants + static const device_timer_id TIMER_OUTPUT = 0; + static const device_timer_id TIMER_INPUT = 1; + + // methods + void native_output(UINT8 data); + UINT32 native_input(void *buffer, UINT32 length); + void bytes_to_bits_81N(void); + void timer_input(void); + void timer_output(void); + float tune_value(void); + UINT32 baud_value(void); + void set_input_line(UINT8 line); + + // variables + emu_timer * m_output_timer; + emu_timer * m_input_timer; + devcb_resolved_write_line m_input_callback; + int m_output_value; + int m_build_count; + int m_build_byte; + attotime m_idle_delay; + attotime m_current_baud; + UINT32 m_input_buffer_size; + UINT32 m_input_buffer_cursor; + int m_mode; + int m_baud; + int m_tune; + UINT8 m_current_input; + UINT8 m_input_buffer[1000]; +}; -/* outputs data to a bitbanger port */ -void bitbanger_output(device_t *device, int value); +// device type definition +extern const device_type BITBANGER; -/* ui functions */ -const char *bitbanger_mode_string(device_t *device); -const char *bitbanger_baud_string(device_t *device); -const char *bitbanger_tune_string(device_t *device); -bool bitbanger_inc_mode(device_t *device, bool test); -bool bitbanger_dec_mode(device_t *device, bool test); -bool bitbanger_inc_tune(device_t *device, bool test); -bool bitbanger_dec_tune(device_t *device, bool test); -bool bitbanger_inc_baud(device_t *device, bool test); -bool bitbanger_dec_baud(device_t *device, bool test); +// device iterator +typedef device_type_iterator<&device_creator, bitbanger_device> bitbanger_device_iterator; #endif /* __BITBNGR_H__ */ diff -Nru mame-0.144/src/emu/imagedev/cartslot.c mame-0.145/src/emu/imagedev/cartslot.c --- mame-0.144/src/emu/imagedev/cartslot.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/cartslot.c 2012-02-06 21:30:28.000000000 +0000 @@ -10,27 +10,47 @@ #include "emu.h" #include "cartslot.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ -enum _process_mode +// device type definition +const device_type CARTSLOT = &device_creator; + +//------------------------------------------------- +// cartslot_image_device - constructor +//------------------------------------------------- + +cartslot_image_device::cartslot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CARTSLOT, "Cartslot", tag, owner, clock), + device_image_interface(mconfig, *this), + m_extensions("bin"), + m_interface(NULL), + m_must_be_loaded(0), + m_device_start(NULL), + m_device_load(NULL), + m_device_unload(NULL), + m_device_partialhash(NULL), + m_device_displayinfo(NULL) { - PROCESS_CLEAR, - PROCESS_LOAD -}; -typedef enum _process_mode process_mode; +} + +//------------------------------------------------- +// cartslot_image_device - destructor +//------------------------------------------------- -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ +cartslot_image_device::~cartslot_image_device() +{ +} -INLINE const cartslot_config *get_config(const device_t *device) +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void cartslot_image_device::device_config_complete() { - assert(device != NULL); - assert(device->type() == CARTSLOT); - return (const cartslot_config *) downcast(device)->inline_config(); + // set brief and instance name + update_names(); } /*************************************************************************** @@ -41,63 +61,63 @@ load_cartridge -------------------------------------------------*/ -static int load_cartridge(device_image_interface *image, const rom_entry *romrgn, const rom_entry *roment, process_mode mode) +int cartslot_image_device::load_cartridge(const rom_entry *romrgn, const rom_entry *roment, bool load) { const char *region; const char *type; UINT32 flags; - offs_t offset, length, read_length, pos = 0, len; + offs_t offset, size, read_length, pos = 0, len; UINT8 *ptr; UINT8 clear_val; int datawidth, littleendian, i, j; device_t *cpu; astring regiontag; - image->device().siblingtag(regiontag, ROMREGION_GETTAG(romrgn)); + device().siblingtag(regiontag, ROMREGION_GETTAG(romrgn)); region = regiontag.cstr(); offset = ROM_GETOFFSET(roment); - length = ROM_GETLENGTH(roment); + size = ROM_GETLENGTH(roment); flags = ROM_GETFLAGS(roment); - ptr = ((UINT8 *) image->device().machine().region(region)->base()) + offset; + ptr = ((UINT8 *) device().machine().region(region)->base()) + offset; - if (mode == PROCESS_LOAD) + if (load) { - if (image->software_entry() == NULL) + if (software_entry() == NULL) { /* must this be full size */ if (flags & ROM_FULLSIZE) { - if (image->length() != length) + if (length() != size) return IMAGE_INIT_FAIL; } /* read the ROM */ - pos = read_length = image->fread(ptr, length); + pos = read_length = fread(ptr, size); /* reset the ROM to the initial point. */ /* eventually, we could add a flag to allow the ROM to continue instead of restarting whenever a new cart region is present */ - image->fseek(0, SEEK_SET); + fseek(0, SEEK_SET); } else { /* must this be full size */ if (flags & ROM_FULLSIZE) { - if (image->get_software_region_length("rom") != length) + if (get_software_region_length("rom") != size) return IMAGE_INIT_FAIL; } /* read the ROM */ - pos = read_length = image->get_software_region_length("rom"); - memcpy(ptr, image->get_software_region("rom"), read_length); + pos = read_length = get_software_region_length("rom"); + memcpy(ptr, get_software_region("rom"), read_length); } /* do we need to mirror the ROM? */ if (flags & ROM_MIRROR) { - while(pos < length) + while(pos < size) { - len = MIN(read_length, length - pos); + len = MIN(read_length, size - pos); memcpy(ptr + pos, ptr, len); pos += len; } @@ -110,7 +130,7 @@ /* if the region is inverted, do that now */ device_memory_interface *memory; - cpu = image->device().machine().device(type); + cpu = device().machine().device(type); if (cpu!=NULL && cpu->interface(memory)) { datawidth = cpu->memory().space_config(AS_PROGRAM)->m_databus_width / 8; @@ -124,7 +144,7 @@ if (datawidth > 1 && littleendian) #endif { - for (i = 0; i < length; i += datawidth) + for (i = 0; i < size; i += datawidth) { UINT8 temp[8]; memcpy(temp, &ptr[i], datawidth); @@ -138,7 +158,7 @@ if (!(flags & ROM_NOCLEAR)) { clear_val = (flags & ROM_FILL_FF) ? 0xFF : 0x00; - memset(ptr + pos, clear_val, length - pos); + memset(ptr + pos, clear_val, size - pos); } return IMAGE_INIT_PASS; } @@ -149,13 +169,13 @@ process_cartridge -------------------------------------------------*/ -static int process_cartridge(device_image_interface *image, process_mode mode) +int cartslot_image_device::process_cartridge(bool load) { const rom_source *source; const rom_entry *romrgn, *roment; int result = 0; - for (source = rom_first_source(image->device().machine().config()); source != NULL; source = rom_next_source(*source)) + for (source = rom_first_source(device().machine().config()); source != NULL; source = rom_next_source(*source)) { for (romrgn = rom_first_region(*source); romrgn != NULL; romrgn = rom_next_region(romrgn)) { @@ -165,11 +185,11 @@ if (ROMENTRY_GETTYPE(roment) == ROMENTRYTYPE_CARTRIDGE) { astring regiontag; - image->device().siblingtag(regiontag, roment->_hashdata); + device().siblingtag(regiontag, roment->_hashdata); - if (strcmp(regiontag.cstr(),image->device().tag())==0) + if (strcmp(regiontag.cstr(),device().tag())==0) { - result |= load_cartridge(image, romrgn, roment, mode); + result |= load_cartridge(romrgn, roment, load); /* if loading failed in any cart region, stop loading */ if (result) @@ -184,132 +204,48 @@ return IMAGE_INIT_PASS; } -/*------------------------------------------------- - DEVICE_START( cartslot ) --------------------------------------------------*/ +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- -static DEVICE_START( cartslot ) +void cartslot_image_device::device_start() { - const cartslot_config *config = get_config(device); /* if this cartridge has a custom DEVICE_START, use it */ - if (config->device_start != NULL) + if (m_device_start != NULL) { - (*config->device_start)(device); + (*m_device_start)(this); } } /*------------------------------------------------- - DEVICE_IMAGE_LOAD( cartslot ) + call_load -------------------------------------------------*/ -static DEVICE_IMAGE_LOAD( cartslot ) +bool cartslot_image_device::call_load() { - device_t *device = &image.device(); - const cartslot_config *config = get_config(device); - /* if this cartridge has a custom DEVICE_IMAGE_LOAD, use it */ - if (config->device_load != NULL) - return (*config->device_load)(image); + if (m_device_load != NULL) + return (*m_device_load)(*this); /* otherwise try the normal route */ - return process_cartridge(&image, PROCESS_LOAD); + return process_cartridge(true); } /*------------------------------------------------- - DEVICE_IMAGE_UNLOAD( cartslot ) + call_unload -------------------------------------------------*/ - -static DEVICE_IMAGE_UNLOAD( cartslot ) +void cartslot_image_device::call_unload() { - device_t *device = &image.device(); - const cartslot_config *config = get_config(device); - /* if this cartridge has a custom DEVICE_IMAGE_UNLOAD, use it */ - if (config->device_unload != NULL) + if (m_device_unload != NULL) { - (*config->device_unload)(image); + (*m_device_unload)(*this); return; } - process_cartridge(&image, PROCESS_CLEAR); + process_cartridge(false); } -/*------------------------------------------------- - DEVICE_IMAGE_SOFTLIST_LOAD(cartslot) --------------------------------------------------*/ -static DEVICE_IMAGE_SOFTLIST_LOAD(cartslot) -{ - load_software_part_region( &image.device(), swlist, swname, start_entry ); - return TRUE; -} - -/*------------------------------------------------- - DEVICE_GET_INFO( cartslot ) --------------------------------------------------*/ - -DEVICE_GET_INFO( cartslot ) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = 0; break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(cartslot_config); break; - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_CARTSLOT; break; - case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_CREATABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_RESET_ON_LOAD: info->i = 1; break; - case DEVINFO_INT_IMAGE_MUST_BE_LOADED: - if ( device && downcast(device)->inline_config()) { - info->i = get_config(device)->must_be_loaded; - } else { - info->i = 0; - } - break; - - /* --- the following bits of info are returned as pointers to functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(cartslot); break; - case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(cartslot); break; - case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(cartslot); break; - case DEVINFO_FCT_IMAGE_SOFTLIST_LOAD: info->f = (genf *) DEVICE_IMAGE_SOFTLIST_LOAD_NAME(cartslot); break; - case DEVINFO_FCT_IMAGE_PARTIAL_HASH: - if ( device && downcast(device)->inline_config() && get_config(device)->device_partialhash) { - info->f = (genf *) get_config(device)->device_partialhash; - } else { - info->f = NULL; - } - break; - case DEVINFO_FCT_IMAGE_DISPLAY_INFO: - if ( device && downcast(device)->inline_config() && get_config(device)->device_displayinfo) { - info->f = (genf *) get_config(device)->device_displayinfo; - } else { - info->f = NULL; - } - break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Cartslot"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Cartslot"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: - if ( device && downcast(device)->inline_config() && get_config(device)->extensions ) - { - strcpy(info->s, get_config(device)->extensions); - } - else - { - strcpy(info->s, "bin"); - } - break; - case DEVINFO_STR_IMAGE_INTERFACE: - if ( device && downcast(device)->inline_config() && get_config(device)->interface ) - { - strcpy(info->s, get_config(device)->interface ); - } - break; - } -} -DEFINE_LEGACY_IMAGE_DEVICE(CARTSLOT, cartslot); diff -Nru mame-0.144/src/emu/imagedev/cartslot.h mame-0.145/src/emu/imagedev/cartslot.h --- mame-0.144/src/emu/imagedev/cartslot.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/cartslot.h 2012-02-06 21:30:28.000000000 +0000 @@ -22,27 +22,68 @@ #define ROM_FILL_FF 0x04000000 #define ROM_NOCLEAR 0x08000000 -DECLARE_LEGACY_IMAGE_DEVICE(CARTSLOT, cartslot); - - - /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef struct _cartslot_config cartslot_config; -struct _cartslot_config +// ======================> cartslot_image_device + +class cartslot_image_device : public device_t, + public device_image_interface { - const char * extensions; - const char * interface; - int must_be_loaded; - device_start_func device_start; - device_image_load_func device_load; - device_image_unload_func device_unload; - device_image_partialhash_func device_partialhash; - device_image_display_info_func device_displayinfo; +public: + // construction/destruction + cartslot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~cartslot_image_device(); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload(); + virtual void call_display_info() { if (m_device_displayinfo) m_device_displayinfo(*this); } + virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { load_software_part_region( this, swlist, swname, start_entry ); return TRUE; } + virtual device_image_partialhash_func get_partial_hash() const { return m_device_partialhash; } + + virtual iodevice_t image_type() const { return IO_CARTSLOT; } + + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 0; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return m_must_be_loaded; } + virtual bool is_reset_on_load() const { return 1; } + virtual const char *image_interface() const { return m_interface; } + virtual const char *file_extensions() const { return m_extensions; } + virtual const option_guide *create_option_guide() const { return NULL; } + + void set_extensions(const char *_extensions) { m_extensions = _extensions; } + void set_interface(const char *_interface) { m_interface = _interface; } + void set_must_be_loaded(bool _must_be_loaded) { m_must_be_loaded = _must_be_loaded; } + void set_device_start(device_start_func _start) { m_device_start = _start; } + void set_device_load(device_image_load_func _load) { m_device_load = _load; } + void set_device_unload(device_image_unload_func _unload) { m_device_unload = _unload; } + void set_partialhash(device_image_partialhash_func _partialhash) { m_device_partialhash = _partialhash; } + void set_displayinfo(device_image_display_info_func _displayinfo) { m_device_displayinfo = _displayinfo; } + +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + + int load_cartridge(const rom_entry *romrgn, const rom_entry *roment, bool load); + int process_cartridge(bool load); + + + const char * m_extensions; + const char * m_interface; + bool m_must_be_loaded; + device_start_func m_device_start; + device_image_load_func m_device_load; + device_image_unload_func m_device_unload; + device_image_partialhash_func m_device_partialhash; + device_image_display_info_func m_device_displayinfo; }; +// device type definition +extern const device_type CARTSLOT; /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -55,30 +96,30 @@ MCFG_DEVICE_MODIFY(_tag) \ #define MCFG_CARTSLOT_EXTENSION_LIST(_extensions) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, extensions, _extensions) + static_cast(device)->set_extensions(_extensions); + +#define MCFG_CARTSLOT_INTERFACE(_interface) \ + static_cast(device)->set_interface(_interface); #define MCFG_CARTSLOT_NOT_MANDATORY \ - MCFG_DEVICE_CONFIG_DATA32(cartslot_config, must_be_loaded, FALSE) + static_cast(device)->set_must_be_loaded(FALSE); #define MCFG_CARTSLOT_MANDATORY \ - MCFG_DEVICE_CONFIG_DATA32(cartslot_config, must_be_loaded, TRUE) + static_cast(device)->set_must_be_loaded(TRUE); #define MCFG_CARTSLOT_START(_start) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_start, DEVICE_START_NAME(_start)) + static_cast(device)->set_device_start(DEVICE_START_NAME(_start)); #define MCFG_CARTSLOT_LOAD(_load) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_load, DEVICE_IMAGE_LOAD_NAME(_load)) + static_cast(device)->set_device_load(DEVICE_IMAGE_LOAD_NAME(_load)); #define MCFG_CARTSLOT_UNLOAD(_unload) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_unload, DEVICE_IMAGE_UNLOAD_NAME(_unload)) - -#define MCFG_CARTSLOT_DISPLAY_INFO(_displayinfo) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_displayinfo, DEVICE_IMAGE_DISPLAY_INFO_NAME(_displayinfo)) + static_cast(device)->set_device_unload(DEVICE_IMAGE_UNLOAD_NAME(_unload)); #define MCFG_CARTSLOT_PARTIALHASH(_partialhash) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_partialhash, _partialhash) + static_cast(device)->set_partialhash(_partialhash); -#define MCFG_CARTSLOT_INTERFACE(_interface) \ - MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, interface, _interface ) +#define MCFG_CARTSLOT_DISPLAY_INFO(_displayinfo) \ + static_cast(device)->set_displayinfo(DEVICE_IMAGE_DISPLAY_INFO_NAME(_displayinfo)); -#endif /* __cart_slot_H__ */ +#endif /* __CARTSLOT_H__ */ diff -Nru mame-0.144/src/emu/imagedev/cassette.c mame-0.145/src/emu/imagedev/cassette.c --- mame-0.144/src/emu/imagedev/cassette.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/cassette.c 2012-02-06 21:30:28.000000000 +0000 @@ -270,7 +270,18 @@ { is_writable = !is_readonly(); cassette_flags = is_writable ? (CASSETTE_FLAG_READWRITE|CASSETTE_FLAG_SAVEONEXIT) : CASSETTE_FLAG_READONLY; - extension = filetype(); + astring fname; + if (software_entry()==NULL) { + extension = filetype(); + } else { + fname = m_mame_file->filename(); + int loc = fname.rchr(0,'.'); + if (loc!=-1) { + extension = fname.substr(loc + 1,fname.len()-loc).cstr(); + } else { + extension = ""; + } + } err = cassette_open_choices((void *)image, &image_ioprocs, extension, m_formats, cassette_flags, &m_cassette); /* this is kind of a hack */ @@ -325,7 +336,7 @@ int n; double position, length; cassette_state uistate; - device_t *dev; + cassette_image_device *dev; static const UINT8 shapes[8] = { 0x2d, 0x5c, 0x7c, 0x2f, 0x2d, 0x20, 0x20, 0x20 }; /* abort if we should not be showing the image */ @@ -343,13 +354,9 @@ x = 0.2f; y = 0.5f; - dev = device().machine().devicelist().first(CASSETTE ); - - while ( dev && strcmp( dev->tag(), device().tag() ) ) - { + cassette_device_iterator iter(device().machine().root_device()); + for (dev = iter.first(); dev != NULL && strcmp( dev->tag(), device().tag() ); dev = iter.next()) y += 1; - dev = dev->typenext(); - } y *= ui_get_line_height(device().machine()) + 2.0f * UI_BOX_TB_BORDER; /* choose which frame of the animation we are at */ diff -Nru mame-0.144/src/emu/imagedev/cassette.h mame-0.145/src/emu/imagedev/cassette.h --- mame-0.144/src/emu/imagedev/cassette.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/cassette.h 2012-02-06 21:30:28.000000000 +0000 @@ -113,6 +113,9 @@ // device type definition extern const device_type CASSETTE; +// device iterator +typedef device_type_iterator<&device_creator, cassette_image_device> cassette_device_iterator; + /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ diff -Nru mame-0.144/src/emu/imagedev/flopdrv.c mame-0.145/src/emu/imagedev/flopdrv.c --- mame-0.144/src/emu/imagedev/flopdrv.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/flopdrv.c 2012-02-06 21:30:28.000000000 +0000 @@ -117,13 +117,13 @@ /*************************************************************************** IMPLEMENTATION ***************************************************************************/ -DECLARE_LEGACY_IMAGE_DEVICE(FLOPPY_APPLE, apple525); -DECLARE_LEGACY_IMAGE_DEVICE(FLOPPY_SONY, sonydriv); +//DECLARE_LEGACY_IMAGE_DEVICE(FLOPPY_APPLE, apple525); +//DECLARE_LEGACY_IMAGE_DEVICE(FLOPPY_SONY, sonydriv); INLINE floppy_drive *get_safe_token(device_t *device) { assert( device != NULL ); - assert( device->type() == LEGACY_FLOPPY || device->type() == FLOPPY_APPLE || device->type() == FLOPPY_SONY); + //assert( device->type() == LEGACY_FLOPPY || device->type() == FLOPPY_APPLE || device->type() == FLOPPY_SONY); return (floppy_drive *) downcast(device)->token(); } @@ -750,10 +750,10 @@ int floppy_get_drive(device_t *image) { int drive =0; - if (strcmp(image->tag(), FLOPPY_0) == 0) drive = 0; - if (strcmp(image->tag(), FLOPPY_1) == 0) drive = 1; - if (strcmp(image->tag(), FLOPPY_2) == 0) drive = 2; - if (strcmp(image->tag(), FLOPPY_3) == 0) drive = 3; + if (strcmp(image->tag(), ":" FLOPPY_0) == 0) drive = 0; + if (strcmp(image->tag(), ":" FLOPPY_1) == 0) drive = 1; + if (strcmp(image->tag(), ":" FLOPPY_2) == 0) drive = 2; + if (strcmp(image->tag(), ":" FLOPPY_3) == 0) drive = 3; return drive; } @@ -1002,9 +1002,7 @@ case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(floppy); break; case DEVINFO_FCT_IMAGE_SOFTLIST_LOAD: info->f = (genf *) DEVICE_IMAGE_SOFTLIST_LOAD_NAME(floppy); break; case DEVINFO_FCT_IMAGE_DISPLAY_INFO: - if (device->type() == FLOPPY_APPLE) { - info->f = NULL; - } else { + if (device->type() == LEGACY_FLOPPY) { if ( device && downcast(device)->static_config() && ((floppy_interface*)(device)->static_config())->device_displayinfo) { info->f = (genf *) ((floppy_interface*)(device)->static_config())->device_displayinfo; } else { diff -Nru mame-0.144/src/emu/imagedev/flopdrv.h mame-0.145/src/emu/imagedev/flopdrv.h --- mame-0.144/src/emu/imagedev/flopdrv.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/flopdrv.h 2012-02-06 21:30:28.000000000 +0000 @@ -27,6 +27,7 @@ #define FLOPPY_STANDARD_3_SSDD { FLOPPY_DRIVE_3_INCH, 1, 42, FLOPPY_DRIVE_DD } #define FLOPPY_STANDARD_3_DSDD { FLOPPY_DRIVE_3_INCH, 2, 42, FLOPPY_DRIVE_DD } +#define FLOPPY_STANDARD_3_5_SSDD { FLOPPY_DRIVE_3_5_INCH, 1, 83, FLOPPY_DRIVE_DD } #define FLOPPY_STANDARD_3_5_DSDD { FLOPPY_DRIVE_3_5_INCH, 2, 83, FLOPPY_DRIVE_DD } #define FLOPPY_STANDARD_3_5_DSHD { FLOPPY_DRIVE_3_5_INCH, 2, 83, FLOPPY_DRIVE_HD } #define FLOPPY_STANDARD_3_5_DSED { FLOPPY_DRIVE_3_5_INCH, 2, 83, FLOPPY_DRIVE_ED } diff -Nru mame-0.144/src/emu/imagedev/floppy.c mame-0.145/src/emu/imagedev/floppy.c --- mame-0.144/src/emu/imagedev/floppy.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/floppy.c 2012-02-06 21:30:28.000000000 +0000 @@ -5,13 +5,17 @@ *********************************************************************/ #include "emu.h" +#include "zippath.h" #include "floppy.h" #include "formats/imageutl.h" +#include "uiimage.h" // device type definition const device_type FLOPPY_CONNECTOR = &device_creator; const device_type FLOPPY_35_DD = &device_creator; +const device_type FLOPPY_35_DD_NOSD = &device_creator; const device_type FLOPPY_35_HD = &device_creator; +const device_type FLOPPY_35_ED = &device_creator; const device_type FLOPPY_525_DD = &device_creator; floppy_connector::floppy_connector(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : @@ -114,6 +118,16 @@ update_names(); } +floppy_image_format_t *floppy_image_device::get_formats() const +{ + return fif_list; +} + +floppy_image_format_t *floppy_image_device::get_load_format() const +{ + return input_format; +} + void floppy_image_device::device_config_complete() { update_names(); @@ -128,6 +142,24 @@ rev_time = attotime::from_double(60/rpm); } +void floppy_image_device::setup_write(floppy_image_format_t *_output_format) +{ + output_format = _output_format; + commit_image(); +} + +void floppy_image_device::commit_image() +{ + image_dirty = false; + if(!output_format) + return; + io_generic io; + // Do _not_ remove this cast otherwise the pointer will be incorrect when used by the ioprocs. + io.file = (device_image_interface *)this; + io.procs = &image_ioprocs; + io.filler = 0xff; + output_format->save(&io, image); +} //------------------------------------------------- // device_start - device-specific startup @@ -136,7 +168,7 @@ void floppy_image_device::device_start() { rpm = 0; - setup_limits(); + setup_characteristics(); idx = 0; @@ -150,6 +182,7 @@ stp = 1; dskchg = 0; index_timer = timer_alloc(0); + image_dirty = false; } void floppy_image_device::device_reset() @@ -164,6 +197,30 @@ index_resync(); } +floppy_image_format_t *floppy_image_device::identify(astring filename) const +{ + FILE *fd; + fd = fopen(filename.cstr(), "r"); + if(!fd) + return 0; + + io_generic io; + io.file = fd; + io.procs = &stdio_ioprocs_noclose; + io.filler = 0xff; + int best = 0; + floppy_image_format_t *best_format = 0; + for(floppy_image_format_t *format = fif_list; format; format = format->next) { + int score = format->identify(&io, form_factor); + if(score > best) { + best = score; + best_format = format; + } + } + fclose(fd); + return best_format; +} + bool floppy_image_device::call_load() { io_generic io; @@ -174,7 +231,7 @@ int best = 0; floppy_image_format_t *best_format = 0; for(floppy_image_format_t *format = fif_list; format; format = format->next) { - int score = format->identify(&io); + int score = format->identify(&io, form_factor); if(score > best) { best = score; best_format = format; @@ -184,13 +241,15 @@ if(!best_format) return IMAGE_INIT_FAIL; - image = global_alloc(floppy_image(tracks, sides)); - best_format->load(&io, image); + image = global_alloc(floppy_image(tracks, sides, form_factor)); + best_format->load(&io, form_factor, image); revolution_start_time = attotime::never; revolution_count = 0; index_resync(); + image_dirty = false; + output_format = 0; if (!cur_load_cb.isnull()) return cur_load_cb(this); @@ -202,6 +261,8 @@ dskchg = 0; if (image) { + if(image_dirty) + commit_image(); global_free(image); image = 0; } @@ -209,6 +270,13 @@ cur_unload_cb(this); } +bool floppy_image_device::call_create(int format_type, option_resolution *format_options) +{ + image = global_alloc(floppy_image(tracks, sides, form_factor)); + output_format = 0; + return IMAGE_INIT_PASS; +} + /* motor on, active low */ void floppy_image_device::mon_w(int state) { @@ -226,6 +294,8 @@ /* on -> off */ else { + if(image_dirty) + commit_image(); revolution_start_time = attotime::never; index_timer->adjust(attotime::zero); } @@ -376,6 +446,8 @@ void floppy_image_device::write_flux(attotime start, attotime end, int transition_count, const attotime *transitions) { + image_dirty = true; + attotime base; int start_pos = find_position(base, start); int end_pos = find_position(base, end); @@ -392,7 +464,9 @@ index = find_index(start_pos, buf, cells); else { index = 0; - buf[cells++] = floppy_image::MG_N | 200000000; + image->set_track_size(cyl, ss, 1); + buf = image->get_buffer(cyl, ss); + buf[cells++] = floppy_image::MG_N; } if(index && (buf[index] & floppy_image::TIME_MASK) == start_pos) @@ -405,6 +479,10 @@ UINT32 pos = start_pos; int ti = 0; while(pos != end_pos) { + if(image->get_track_size(cyl, ss) < cells+10) { + image->set_track_size(cyl, ss, cells+200); + buf = image->get_buffer(cyl, ss); + } UINT32 next_pos; if(ti != transition_count) next_pos = trans_pos[ti++]; @@ -525,6 +603,152 @@ } } +ui_menu *floppy_image_device::get_selection_menu(running_machine &machine, render_container *container) +{ + return auto_alloc_clear(machine, ui_menu_control_floppy_image(machine, container, this)); +} + +ui_menu_control_floppy_image::ui_menu_control_floppy_image(running_machine &machine, render_container *container, device_image_interface *_image) : ui_menu_control_device_image(machine, container, _image) +{ + floppy_image_device *fd = static_cast(image); + const floppy_image_format_t *fif_list = fd->get_formats(); + int fcnt = 0; + for(const floppy_image_format_t *i = fif_list; i; i = i->next) + fcnt++; + + format_array = global_alloc_array(floppy_image_format_t *, fcnt); + input_format = output_format = 0; + input_filename = output_filename = ""; +} + +ui_menu_control_floppy_image::~ui_menu_control_floppy_image() +{ + global_free(format_array); +} + +void ui_menu_control_floppy_image::do_load_create() +{ + floppy_image_device *fd = static_cast(image); + if(input_filename == "") { + int err = fd->create(output_filename, 0, NULL); + if (err != 0) { + popmessage("Error: %s", fd->error()); + return; + } + fd->setup_write(output_format); + } else { + int err = fd->load(input_filename); + if(!err && output_filename != "") + err = fd->reopen_for_write(output_filename); + if(err != 0) { + popmessage("Error: %s", fd->error()); + return; + } + if(output_format) + fd->setup_write(output_format); + } +} + +void ui_menu_control_floppy_image::hook_load(astring filename, bool softlist) +{ + input_filename = filename; + input_format = static_cast(image)->identify(filename); + if(!input_format) { + popmessage("Error: %s\n", image->error()); + ui_menu::stack_pop(machine()); + return; + } + + bool can_in_place = input_format->supports_save(); + if(can_in_place) { + file_error filerr = FILERR_NOT_FOUND; + astring tmp_path; + core_file *tmp_file; + /* attempt to open the file for writing but *without* create */ + filerr = zippath_fopen(filename, OPEN_FLAG_READ|OPEN_FLAG_WRITE, tmp_file, tmp_path); + if(!filerr) + core_fclose(tmp_file); + else + can_in_place = false; + } + submenu_result = -1; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_rw(machine(), container, can_in_place, &submenu_result))); + state = SELECT_RW; +} + +void ui_menu_control_floppy_image::handle() +{ + floppy_image_device *fd = static_cast(image); + switch(state) { + case DO_CREATE: { + floppy_image_format_t *fif_list = fd->get_formats(); + int ext_match = 0, total_usable = 0; + for(floppy_image_format_t *i = fif_list; i; i = i->next) { + if(!i->supports_save()) + continue; + if(i->extension_matches(current_file)) + format_array[total_usable++] = i; + } + ext_match = total_usable; + for(floppy_image_format_t *i = fif_list; i; i = i->next) { + if(!i->supports_save()) + continue; + if(!i->extension_matches(current_file)) + format_array[total_usable++] = i; + } + submenu_result = -1; + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_format(machine(), container, format_array, ext_match, total_usable, &submenu_result))); + + state = SELECT_FORMAT; + break; + } + + case SELECT_FORMAT: + if(submenu_result == -1) { + state = START_FILE; + handle(); + } else { + zippath_combine(output_filename, current_directory, current_file); + output_format = format_array[submenu_result]; + do_load_create(); + ui_menu::stack_pop(machine()); + } + break; + + case SELECT_RW: + switch(submenu_result) { + case ui_menu_select_rw::READONLY: + do_load_create(); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::READWRITE: + output_format = input_format; + do_load_create(); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::WRITE_DIFF: + popmessage("Sorry, diffs are not supported yet\n"); + ui_menu::stack_pop(machine()); + break; + + case ui_menu_select_rw::WRITE_OTHER: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_create(machine(), container, image, current_directory, current_file))); + state = CREATE_FILE; + break; + + case -1: + ui_menu::stack_pop(machine()); + break; + } + break; + + default: + ui_menu_control_device_image::handle(); + } +} + floppy_35_dd::floppy_35_dd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : floppy_image_device(mconfig, FLOPPY_35_DD, "3.5\" double density floppy drive", tag, owner, clock) { @@ -534,13 +758,46 @@ { } -void floppy_35_dd::setup_limits() +void floppy_35_dd::setup_characteristics() { + form_factor = floppy_image::FF_35; tracks = 84; sides = 2; set_rpm(300); } +void floppy_35_dd::handled_variants(UINT32 *variants, int &var_count) const +{ + var_count = 0; + variants[var_count++] = floppy_image::SSSD; + variants[var_count++] = floppy_image::SSDD; + variants[var_count++] = floppy_image::DSDD; +} + +floppy_35_dd_nosd::floppy_35_dd_nosd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + floppy_image_device(mconfig, FLOPPY_35_DD_NOSD, "3.5\" double density floppy drive", tag, owner, clock) +{ +} + +floppy_35_dd_nosd::~floppy_35_dd_nosd() +{ +} + +void floppy_35_dd_nosd::setup_characteristics() +{ + form_factor = floppy_image::FF_35; + tracks = 84; + sides = 2; + set_rpm(300); +} + +void floppy_35_dd_nosd::handled_variants(UINT32 *variants, int &var_count) const +{ + var_count = 0; + variants[var_count++] = floppy_image::SSSD; + variants[var_count++] = floppy_image::SSDD; +} + floppy_35_hd::floppy_35_hd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : floppy_image_device(mconfig, FLOPPY_35_HD, "3.5\" high density floppy drive", tag, owner, clock) { @@ -550,16 +807,52 @@ { } -void floppy_35_hd::setup_limits() +void floppy_35_hd::setup_characteristics() { + form_factor = floppy_image::FF_35; tracks = 84; sides = 2; set_rpm(300); } +void floppy_35_hd::handled_variants(UINT32 *variants, int &var_count) const +{ + var_count = 0; + variants[var_count++] = floppy_image::SSSD; + variants[var_count++] = floppy_image::SSDD; + variants[var_count++] = floppy_image::DSDD; + variants[var_count++] = floppy_image::DSHD; +} + +floppy_35_ed::floppy_35_ed(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + floppy_image_device(mconfig, FLOPPY_35_ED, "3.5\" extended density floppy drive", tag, owner, clock) +{ +} + +floppy_35_ed::~floppy_35_ed() +{ +} + +void floppy_35_ed::setup_characteristics() +{ + form_factor = floppy_image::FF_35; + tracks = 84; + sides = 2; + set_rpm(300); +} + +void floppy_35_ed::handled_variants(UINT32 *variants, int &var_count) const +{ + var_count = 0; + variants[var_count++] = floppy_image::SSSD; + variants[var_count++] = floppy_image::SSDD; + variants[var_count++] = floppy_image::DSDD; + variants[var_count++] = floppy_image::DSHD; + variants[var_count++] = floppy_image::DSED; +} floppy_525_dd::floppy_525_dd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - floppy_image_device(mconfig, FLOPPY_525_DD, "3.5\" high density floppy drive", tag, owner, clock) + floppy_image_device(mconfig, FLOPPY_525_DD, "5.25\" double density floppy drive", tag, owner, clock) { } @@ -567,9 +860,17 @@ { } -void floppy_525_dd::setup_limits() +void floppy_525_dd::setup_characteristics() { + form_factor = floppy_image::FF_525; tracks = 42; sides = 1; set_rpm(300); } + +void floppy_525_dd::handled_variants(UINT32 *variants, int &var_count) const +{ + var_count = 0; + variants[var_count++] = floppy_image::SSSD; + variants[var_count++] = floppy_image::SSDD; +} diff -Nru mame-0.144/src/emu/imagedev/floppy.h mame-0.145/src/emu/imagedev/floppy.h --- mame-0.144/src/emu/imagedev/floppy.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/floppy.h 2012-02-06 21:30:28.000000000 +0000 @@ -32,12 +32,18 @@ floppy_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); virtual ~floppy_image_device(); + virtual void handled_variants(UINT32 *variants, int &var_count) const = 0; + void set_formats(const floppy_format_type *formats); + floppy_image_format_t *get_formats() const; + floppy_image_format_t *get_load_format() const; + floppy_image_format_t *identify(astring filename) const; void set_rpm(float rpm); // image-level overrides virtual bool call_load(); virtual void call_unload(); + virtual bool call_create(int format_type, option_resolution *format_options); virtual void call_display_info() {} virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { return load_software(swlist, swname, start_entry); } @@ -50,6 +56,7 @@ virtual bool is_reset_on_load() const { return false; } virtual const char *file_extensions() const { return extension_list; } virtual const option_guide *create_option_guide() const { return NULL; } + void setup_write(floppy_image_format_t *output_format); void setup_load_cb(load_cb cb); void setup_unload_cb(unload_cb cb); @@ -75,6 +82,11 @@ attotime time_next_index(); attotime get_next_transition(attotime from_when); void write_flux(attotime start, attotime end, int transition_count, const attotime *transitions); + void set_write_splice(attotime when); + UINT32 get_form_factor() const; + UINT32 get_variant() const; + + virtual ui_menu *get_selection_menu(running_machine &machine, class render_container *container); protected: // device-level overrides @@ -83,17 +95,20 @@ virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); - virtual void setup_limits() = 0; + virtual void setup_characteristics() = 0; image_device_format format; + floppy_image_format_t *input_format; + floppy_image_format_t *output_format; floppy_image *image; char extension_list[256]; floppy_image_format_t *fif_list; emu_timer *index_timer; - /* Physical characteristics, filled by setup_limits */ + /* Physical characteristics, filled by setup_characteristics */ int tracks; /* addressable tracks */ int sides; /* number of heads */ + UINT32 form_factor; /* 3"5, 5"25, etc */ /* state of input lines */ int dir; /* direction */ @@ -115,6 +130,8 @@ UINT32 revolution_count; int cyl; + bool image_dirty; + load_cb cur_load_cb; unload_cb cur_unload_cb; index_pulse_cb cur_index_pulse_cb; @@ -122,33 +139,75 @@ UINT32 find_position(attotime &base, attotime when); int find_index(UINT32 position, const UINT32 *buf, int buf_size); void write_zone(UINT32 *buf, int &cells, int &index, UINT32 spos, UINT32 epos, UINT32 mg); + void commit_image(); +}; + +class ui_menu_control_floppy_image : public ui_menu_control_device_image { +public: + ui_menu_control_floppy_image(running_machine &machine, render_container *container, device_image_interface *image); + virtual ~ui_menu_control_floppy_image(); + + virtual void handle(); + +protected: + enum { SELECT_FORMAT = LAST_ID, SELECT_MEDIA, SELECT_RW }; + + floppy_image_format_t **format_array; + floppy_image_format_t *input_format, *output_format; + astring input_filename, output_filename; + + void do_load_create(); + virtual void hook_load(astring filename, bool softlist); }; class floppy_35_dd : public floppy_image_device { public: floppy_35_dd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ~floppy_35_dd(); + virtual void handled_variants(UINT32 *variants, int &var_count) const; protected: - virtual void setup_limits(); + virtual void setup_characteristics(); +}; + +class floppy_35_dd_nosd : public floppy_image_device { +public: + floppy_35_dd_nosd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~floppy_35_dd_nosd(); + virtual void handled_variants(UINT32 *variants, int &var_count) const; + +protected: + virtual void setup_characteristics(); }; class floppy_35_hd : public floppy_image_device { public: floppy_35_hd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ~floppy_35_hd(); + virtual void handled_variants(UINT32 *variants, int &var_count) const; + +protected: + virtual void setup_characteristics(); +}; + +class floppy_35_ed : public floppy_image_device { +public: + floppy_35_ed(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~floppy_35_ed(); + virtual void handled_variants(UINT32 *variants, int &var_count) const; protected: - virtual void setup_limits(); + virtual void setup_characteristics(); }; class floppy_525_dd : public floppy_image_device { public: floppy_525_dd(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual ~floppy_525_dd(); + virtual void handled_variants(UINT32 *variants, int &var_count) const; protected: - virtual void setup_limits(); + virtual void setup_characteristics(); }; class floppy_connector: public device_t, @@ -173,7 +232,9 @@ // device type definition extern const device_type FLOPPY_CONNECTOR; extern const device_type FLOPPY_35_DD; +extern const device_type FLOPPY_35_DD_NOSD; extern const device_type FLOPPY_35_HD; +extern const device_type FLOPPY_35_ED; extern const device_type FLOPPY_525_DD; #endif /* FLOPPY_H */ diff -Nru mame-0.144/src/emu/imagedev/harddriv.c mame-0.145/src/emu/imagedev/harddriv.c --- mame-0.144/src/emu/imagedev/harddriv.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/harddriv.c 2012-02-06 21:30:28.000000000 +0000 @@ -76,7 +76,9 @@ harddisk_image_device::harddisk_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, HARDDISK, "Harddisk", tag, owner, clock), - device_image_interface(mconfig, *this) + device_image_interface(mconfig, *this), + m_chd(NULL), + m_hard_disk_handle(NULL) { } @@ -105,8 +107,10 @@ // or initialize to defaults if none provided else { - memset(&m_device_image_load, 0, sizeof(m_device_image_load)); + memset(&m_device_image_load, 0, sizeof(m_device_image_load)); memset(&m_device_image_unload, 0, sizeof(m_device_image_unload)); + memset(&m_interface, 0, sizeof(m_interface)); + memset(&m_device_displayinfo, 0, sizeof(m_device_displayinfo)); } image_device_format *format = global_alloc_clear(image_device_format);; @@ -206,20 +210,26 @@ { chd_error err = (chd_error)0; int is_writeable; + astring tempstring; /* open the CHD file */ - do + if (software_entry() != NULL) { - is_writeable = !is_readonly(); - m_chd = NULL; - err = chd_open_file(image_core_file(), is_writeable ? CHD_OPEN_READWRITE : CHD_OPEN_READ, NULL, &m_chd); + m_chd = get_disk_handle(device().machine(), device().subtag(tempstring,"harddriv")); + } else { + do + { + is_writeable = !is_readonly(); + m_chd = NULL; + err = chd_open_file(image_core_file(), is_writeable ? CHD_OPEN_READWRITE : CHD_OPEN_READ, NULL, &m_chd); - /* special case; if we get CHDERR_FILE_NOT_WRITEABLE, make the - * image read only and repeat */ - if (err == CHDERR_FILE_NOT_WRITEABLE) - make_readonly(); + /* special case; if we get CHDERR_FILE_NOT_WRITEABLE, make the + * image read only and repeat */ + if (err == CHDERR_FILE_NOT_WRITEABLE) + make_readonly(); + } + while(!m_chd && is_writeable && (err == CHDERR_FILE_NOT_WRITEABLE)); } - while(!m_chd && is_writeable && (err == CHDERR_FILE_NOT_WRITEABLE)); if (!m_chd) goto done; diff -Nru mame-0.144/src/emu/imagedev/harddriv.h mame-0.145/src/emu/imagedev/harddriv.h --- mame-0.144/src/emu/imagedev/harddriv.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/imagedev/harddriv.h 2012-02-06 21:30:28.000000000 +0000 @@ -22,6 +22,8 @@ { device_image_load_func m_device_image_load; device_image_unload_func m_device_image_unload; + const char * m_interface; + device_image_display_info_func m_device_displayinfo; }; // ======================> harddisk_image_device @@ -39,6 +41,8 @@ virtual bool call_load(); virtual bool call_create(int create_format, option_resolution *create_args); virtual void call_unload(); + virtual void call_display_info() { if (m_device_displayinfo) m_device_displayinfo(*this); } + virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { load_software_part_region(this, swlist, swname, start_entry ); return TRUE; } virtual iodevice_t image_type() const { return IO_HARDDISK; } @@ -47,6 +51,7 @@ virtual bool is_creatable() const { return 0; } virtual bool must_be_loaded() const { return 0; } virtual bool is_reset_on_load() const { return 0; } + virtual const char *image_interface() const { return m_interface; } virtual const char *file_extensions() const { return "chd,hd"; } virtual const option_guide *create_option_guide() const; diff -Nru mame-0.144/src/emu/imagedev/multcart.c mame-0.145/src/emu/imagedev/multcart.c --- mame-0.144/src/emu/imagedev/multcart.c 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/multcart.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,888 +0,0 @@ -/********************************************************************* - - multcart.c - - Multi-cartridge handling code - -*********************************************************************/ - -#include "emu.h" -#include "multcart.h" -#include "pool.h" -#include "unzip.h" -#include "corestr.h" -#include "xmlfile.h" -#include "hash.h" -#include "machine/ram.h" - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -struct _multicart_private -{ - object_pool * pool; - zip_file * zip; -}; - - -typedef struct _multicart_load_state multicart_load_state; -struct _multicart_load_state -{ - multicart_t * multicart; - zip_file * zip; - xml_data_node * layout_xml; - xml_data_node * resources_node; - xml_data_node * pcb_node; - multicart_resource * resources; - multicart_socket * sockets; -}; - -static const char error_text[14][30] = -{ - "no error", - "not a multicart", - "module definition corrupt", - "out of memory", - "xml format error", - "invalid file reference", - "zip file error", - "missing ram length", - "invalid ram specification", - "unknown resource type", - "invalid resource reference", - "invalid file format", - "missing layout", - "no pcb or resource found" -}; - -const char *multicart_error_text(multicart_open_error error) -{ - return error_text[(int)error]; -} - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -INLINE multicartslot_t *get_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == MULTICARTSLOT); - return (multicartslot_t *) downcast(device)->token(); -} - - -INLINE const multicartslot_config *get_config(const device_t *device) -{ - assert(device != NULL); - assert(device->type() == MULTICARTSLOT); - return (const multicartslot_config *) downcast(device)->inline_config(); -} - - -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - cartslot_get_pcb --------------------------------------------------*/ - -device_t *cartslot_get_pcb(device_t *device) -{ - multicartslot_t *cart = get_token(device); - return cart->pcb_device; -} - - -/*------------------------------------------------- - cartslot_get_socket --------------------------------------------------*/ - -void *cartslot_get_socket(device_t *device, const char *socket_name) -{ - multicartslot_t *cart = get_token(device); - device_image_interface *image = dynamic_cast(device); - void *result = NULL; - - if (cart->mc != NULL) - { - const multicart_socket *socket; - for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) - { - if (!strcmp(socket->id, socket_name)) - break; - } - result = socket ? socket->ptr : NULL; - } - else if (socket_name[0] == '\0') - { - result = image->ptr(); - } - return result; -} - -/*------------------------------------------------- - cartslot_get_resource_length --------------------------------------------------*/ - -int cartslot_get_resource_length(device_t *device, const char *socket_name) -{ - multicartslot_t *cart = get_token(device); - int result = 0; - - if (cart->mc != NULL) - { - const multicart_socket *socket; - - for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) - { - if (!strcmp(socket->id, socket_name)) { - break; - } - } - if (socket != NULL) - result = socket->resource->length; - } - else - result = 0; - - return result; -} -/*------------------------------------------------- - identify_pcb --------------------------------------------------*/ - -static const multicartslot_pcb_type *identify_pcb(device_image_interface &image) -{ - const multicartslot_config *config = get_config(&image.device()); - astring pcb_name; - const multicartslot_pcb_type *pcb_type = NULL; - multicart_t *mc; - int i; - - if (image.exists()) - { - /* try opening this as if it were a multicart */ - multicart_open_error me = multicart_open(image.device().machine().options(), image.filename(), image.device().machine().system().name, MULTICART_FLAGS_DONT_LOAD_RESOURCES, &mc); - if (me == MCERR_NONE) - { - /* this was a multicart - read from it */ - astring_cpyc(&pcb_name, mc->pcb_type); - multicart_close(image.device().machine().options(), mc); - } - else - { - if (me != MCERR_NOT_MULTICART) - fatalerror("multicart error: %s", multicart_error_text(me)); - } - - /* look for PCB type with matching name */ - for (i = 0; (i < ARRAY_LENGTH(config->pcb_types)) && (config->pcb_types[i].name != NULL); i++) - { - if ((config->pcb_types[i].name[0] == '\0') || !strcmp(astring_c(&pcb_name), config->pcb_types[i].name)) - { - pcb_type = &config->pcb_types[i]; - break; - } - } - - /* check for unknown PCB type */ - if ((mc != NULL) && (pcb_type == NULL)) - fatalerror("Unknown PCB type \"%s\"", astring_c(&pcb_name)); - } - else - { - /* no device loaded; use the default */ - pcb_type = (config->pcb_types[0].name != NULL) ? &config->pcb_types[0] : NULL; - } - return pcb_type; -} - -/*------------------------------------------------- - DEVICE_IMAGE_GET_DEVICES(cartslot) --------------------------------------------------*/ -static DEVICE_IMAGE_GET_DEVICES(multicartslot) -{ - const multicartslot_pcb_type *pcb_type; - device_t *device = &image.device(); - - pcb_type = identify_pcb(image); - if (pcb_type != NULL) - { - image_add_device_with_subdevices(device,pcb_type->devtype,TAG_PCB,0); - } -} - - -/*------------------------------------------------- - find_file --------------------------------------------------*/ - -static const zip_file_header *find_file(zip_file *zip, const char *filename) -{ - const zip_file_header *header; - for (header = zip_file_first_file(zip); header != NULL; header = zip_file_next_file(zip)) - { - if (!core_stricmp(header->filename, filename)) - return header; - } - return NULL; -} - -static const zip_file_header *find_file_crc(zip_file *zip, const char *filename, UINT32 crc) -{ - const zip_file_header *header; - for (header = zip_file_first_file(zip); header != NULL; header = zip_file_next_file(zip)) - { - // if the CRC and name both match, we're good - // if the CRC matches and the name doesn't, we're still good - if ((!core_stricmp(header->filename, filename)) && (header->crc == crc)) - { - return header; - } - else if (header->crc == crc) - { - return header; - } - } - return NULL; -} - -/*------------------------------------------------- - find_pcb_and_resource_nodes --------------------------------------------------*/ - -static int find_pcb_and_resource_nodes(xml_data_node *layout_xml, - xml_data_node **pcb_node, xml_data_node **resource_node) -{ - xml_data_node *romset_node; - xml_data_node *configuration_node; - - *pcb_node = NULL; - *resource_node = NULL; - - romset_node = xml_get_sibling(layout_xml->child, "romset"); - if (romset_node == NULL) - return FALSE; - - configuration_node = xml_get_sibling(romset_node->child, "configuration"); - if (configuration_node == NULL) - return FALSE; - - *pcb_node = xml_get_sibling(configuration_node->child, "pcb"); - if (*pcb_node == NULL) - return FALSE; - - *resource_node = xml_get_sibling(romset_node->child, "resources"); - if (*resource_node == NULL) - return FALSE; - - return TRUE; -} - - -/*------------------------------------------------- - get_resource_type --------------------------------------------------*/ - -static multicart_resource_type get_resource_type(const char *s) -{ - multicart_resource_type result; - if (!strcmp(s, "rom")) - result = MULTICART_RESOURCE_TYPE_ROM; - else if (!strcmp(s, "ram")) - result = MULTICART_RESOURCE_TYPE_RAM; - else - result = MULTICART_RESOURCE_TYPE_INVALID; - return result; -} - - -/*------------------------------------------------- - load_rom_resource --------------------------------------------------*/ - -static multicart_open_error load_rom_resource(multicart_load_state *state, xml_data_node *resource_node, - multicart_resource *resource) -{ - const char *file, *crcstr, *sha1; - const zip_file_header *header; - zip_error ziperr; - UINT32 crc; - - /* locate the 'file' attribute */ - file = xml_get_attribute_string(resource_node, "file", NULL); - if (file == NULL) - return MCERR_XML_ERROR; - - if (!(crcstr = xml_get_attribute_string(resource_node, "crc", NULL))) - { - /* locate the file in the ZIP file */ - header = find_file(state->zip, file); - } - else /* CRC tag is present, use it */ - { - crc = strtoul(crcstr, NULL, 16); - header = find_file_crc(state->zip, file, crc); - } - if (header == NULL) - return MCERR_INVALID_FILE_REF; - resource->length = header->uncompressed_length; - - /* allocate bytes for this resource */ - resource->ptr = pool_malloc_lib(state->multicart->data->pool, resource->length); - if (resource->ptr == NULL) - return MCERR_OUT_OF_MEMORY; - - /* and decompress it */ - ziperr = zip_file_decompress(state->zip, resource->ptr, resource->length); - if (ziperr != ZIPERR_NONE) - return MCERR_ZIP_ERROR; - - /* check SHA1 now */ - if ((sha1 = xml_get_attribute_string(resource_node, "sha1", NULL))) - { - hash_collection actual_hashes; - actual_hashes.compute((const UINT8 *)resource->ptr, resource->length, hash_collection::HASH_TYPES_CRC_SHA1); - - hash_collection expected_hashes; - expected_hashes.add_from_string(hash_collection::HASH_SHA1, sha1, strlen(sha1)); - - if (actual_hashes != expected_hashes) - { - return MCERR_INVALID_FILE_REF; - } - } - - return MCERR_NONE; -} - - -/*------------------------------------------------- - load_ram_resource --------------------------------------------------*/ - -static multicart_open_error load_ram_resource(emu_options &options, multicart_load_state *state, xml_data_node *resource_node, - multicart_resource *resource) -{ - const char *length_string; - const char *ram_type; - const char *ram_filename; - - astring *ram_pathname; - - /* locate the 'length' attribute */ - length_string = xml_get_attribute_string(resource_node, "length", NULL); - if (length_string == NULL) - return MCERR_MISSING_RAM_LENGTH; - - /* ...and parse it */ - resource->length = ram_parse_string(length_string); - if (resource->length <= 0) - return MCERR_INVALID_RAM_SPEC; - - /* allocate bytes for this resource */ - resource->ptr = pool_malloc_lib(state->multicart->data->pool, resource->length); - if (resource->ptr == NULL) - return MCERR_OUT_OF_MEMORY; - - /* Is this a persistent RAM resource? Then try to load it. */ - ram_type = xml_get_attribute_string(resource_node, "type", NULL); - if (ram_type != NULL) - { - if (strcmp(ram_type, "persistent")==0) - { - astring tmp; - - /* Get the file name. */ - ram_filename = xml_get_attribute_string(resource_node, "file", NULL); - if (ram_filename==NULL) - return MCERR_XML_ERROR; - - ram_pathname = astring_assemble_3(&tmp, state->multicart->gamedrv_name, PATH_SEPARATOR, ram_filename); - - /* Save the file name so that we can write the contents on unloading. - If the RAM resource has no filename, we know that it was volatile only. */ - resource->filename = pool_strdup_lib(state->multicart->data->pool, astring_c(ram_pathname)); - - if (resource->filename == NULL) - return MCERR_OUT_OF_MEMORY; - - image_battery_load_by_name(options, resource->filename, resource->ptr, resource->length, 0x00); - } - /* else this type is volatile, in which case we just have - a memory expansion */ - } - return MCERR_NONE; -} - - -/*------------------------------------------------- - load_resource --------------------------------------------------*/ - -static multicart_open_error load_resource(emu_options &options, multicart_load_state *state, xml_data_node *resource_node, - multicart_resource_type resource_type) -{ - const char *id; - multicart_open_error err; - multicart_resource *resource; - multicart_resource **next_resource; - - /* get the 'id' attribute; error if not present */ - id = xml_get_attribute_string(resource_node, "id", NULL); - if (id == NULL) - return MCERR_XML_ERROR; - - /* allocate memory for the resource */ - resource = (multicart_resource *)pool_malloc_lib(state->multicart->data->pool, sizeof(*resource)); - if (resource == NULL) - return MCERR_OUT_OF_MEMORY; - memset(resource, 0, sizeof(*resource)); - resource->type = resource_type; - - /* copy id */ - resource->id = pool_strdup_lib(state->multicart->data->pool, id); - if (resource->id == NULL) - return MCERR_OUT_OF_MEMORY; - - switch(resource->type) - { - case MULTICART_RESOURCE_TYPE_ROM: - err = load_rom_resource(state, resource_node, resource); - if (err != MCERR_NONE) - return err; - break; - - case MULTICART_RESOURCE_TYPE_RAM: - err = load_ram_resource(options, state, resource_node, resource); - if (err != MCERR_NONE) - return err; - break; - - default: - return MCERR_UNKNOWN_RESOURCE_TYPE; - } - - /* append the resource */ - for (next_resource = &state->resources; *next_resource; next_resource = &(*next_resource)->next) - ; - *next_resource = resource; - - return MCERR_NONE; -} - - -/*------------------------------------------------- - load_all_resources --------------------------------------------------*/ - -static multicart_open_error load_all_resources(emu_options &options, multicart_load_state *state) -{ - multicart_open_error err; - xml_data_node *resource_node; - multicart_resource_type resource_type; - - for (resource_node = state->resources_node->child; resource_node != NULL; resource_node = resource_node->next) - { - resource_type = get_resource_type(resource_node->name); - if (resource_type != MULTICART_RESOURCE_TYPE_INVALID) - { - err = load_resource(options, state, resource_node, resource_type); - if (err != MCERR_NONE) - return err; - } - } - - state->multicart->resources = state->resources; - return MCERR_NONE; -} - -/*------------------------------------------------- - save_ram_resources. This is important for persistent RAM. All - resources were allocated within the memory pool of this device and will - be freed on multicart_close. --------------------------------------------------*/ - -static multicart_open_error save_ram_resources(emu_options &options, multicart_t *cart) -{ - const multicart_resource *resource; - - for (resource = cart->resources; resource != NULL; resource = resource->next) - { - if ((resource->type == MULTICART_RESOURCE_TYPE_RAM) && (resource->filename != NULL)) - { - image_battery_save_by_name(options, resource->filename, resource->ptr, resource->length); - } - } - return MCERR_NONE; -} - -/*------------------------------------------------- - load_socket --------------------------------------------------*/ - -static multicart_open_error load_socket(multicart_load_state *state, xml_data_node *socket_node) -{ - const char *id; - const char *uses; - const multicart_resource *resource; - multicart_socket *socket; - multicart_socket **next_socket; - - /* get the 'id' and 'uses' attributes; error if not present */ - id = xml_get_attribute_string(socket_node, "id", NULL); - uses = xml_get_attribute_string(socket_node, "uses", NULL); - if ((id == NULL) || (uses == NULL)) - return MCERR_XML_ERROR; - - /* find the resource */ - for (resource = state->multicart->resources; resource != NULL; resource = resource->next) - { - if (!strcmp(uses, resource->id)) - break; - } - if (resource == NULL) - return MCERR_INVALID_RESOURCE_REF; - - /* create the socket */ - socket = (multicart_socket *)pool_malloc_lib(state->multicart->data->pool, sizeof(*socket)); - if (socket == NULL) - return MCERR_OUT_OF_MEMORY; - memset(socket, 0, sizeof(*socket)); - socket->resource = resource; - socket->ptr = resource->ptr; - - /* copy id */ - socket->id = pool_strdup_lib(state->multicart->data->pool, id); - if (socket->id == NULL) - return MCERR_OUT_OF_MEMORY; - - /* which pointer should I use? */ - if (resource->ptr != NULL) - { - /* use the resource's ptr */ - socket->ptr = resource->ptr; - } - else - { - /* allocate bytes for this socket */ - socket->ptr = pool_malloc_lib(state->multicart->data->pool, resource->length); - if (socket->ptr == NULL) - return MCERR_OUT_OF_MEMORY; - - /* ...and clear it */ - memset(socket->ptr, 0xCD, resource->length); - } - - /* append the resource */ - for (next_socket = &state->sockets; *next_socket; next_socket = &(*next_socket)->next) - ; - *next_socket = socket; - - return MCERR_NONE; -} - - -/*------------------------------------------------- - load_all_sockets --------------------------------------------------*/ - -static multicart_open_error load_all_sockets(multicart_load_state *state) -{ - multicart_open_error err; - xml_data_node *socket_node; - - for (socket_node = xml_get_sibling(state->pcb_node->child, "socket"); socket_node != NULL; - socket_node = xml_get_sibling(socket_node->next, "socket")) - { - err = load_socket(state, socket_node); - if (err != MCERR_NONE) - return err; - } - - state->multicart->sockets = state->sockets; - return MCERR_NONE; -} - - -/*------------------------------------------------- - multicart_open - opens a multicart --------------------------------------------------*/ - -multicart_open_error multicart_open(emu_options &options, const char *filename, const char *gamedrv, multicart_load_flags load_flags, multicart_t **cart) -{ - multicart_open_error err; - zip_error ziperr; - object_pool *pool; - multicart_load_state state = {0, }; - const zip_file_header *header; - const char *pcb_type; - char *layout_text = NULL; - - /* allocate an object pool */ - pool = pool_alloc_lib(NULL); - if (pool == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - - /* allocate the multicart */ - state.multicart = (multicart_t*)pool_malloc_lib(pool, sizeof(*state.multicart)); - if (state.multicart == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - memset(state.multicart, 0, sizeof(*state.multicart)); - - /* allocate the multicart's private data */ - state.multicart->data = (multicart_private*)pool_malloc_lib(pool, sizeof(*state.multicart->data)); - if (state.multicart->data == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - memset(state.multicart->data, 0, sizeof(*state.multicart->data)); - state.multicart->data->pool = pool; - pool = NULL; - - /* open the ZIP file */ - ziperr = zip_file_open(filename, &state.zip); - if (ziperr != ZIPERR_NONE) - { - err = MCERR_NOT_MULTICART; - goto done; - } - - /* find the layout.xml file */ - header = find_file(state.zip, "layout.xml"); - if (header == NULL) - { - err = MCERR_MISSING_LAYOUT; - goto done; - } - - /* reserve space for the layout text */ - layout_text = (char*)malloc(header->uncompressed_length + 1); - if (layout_text == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - - /* uncompress the layout text */ - ziperr = zip_file_decompress(state.zip, layout_text, header->uncompressed_length); - if (ziperr != ZIPERR_NONE) - { - err = MCERR_ZIP_ERROR; - goto done; - } - layout_text[header->uncompressed_length] = '\0'; - - /* parse the layout text */ - state.layout_xml = xml_string_read(layout_text, NULL); - if (state.layout_xml == NULL) - { - err = MCERR_XML_ERROR; - goto done; - } - - /* locate the PCB node */ - if (!find_pcb_and_resource_nodes(state.layout_xml, &state.pcb_node, &state.resources_node)) - { - err = MCERR_NO_PCB_OR_RESOURCES; - goto done; - } - - /* get the PCB resource_type */ - pcb_type = xml_get_attribute_string(state.pcb_node, "type", ""); - state.multicart->pcb_type = pool_strdup_lib(state.multicart->data->pool, pcb_type); - if (state.multicart->pcb_type == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - - state.multicart->gamedrv_name = pool_strdup_lib(state.multicart->data->pool, gamedrv); - if (state.multicart->gamedrv_name == NULL) - { - err = MCERR_OUT_OF_MEMORY; - goto done; - } - - /* do we have to load resources? */ - if (load_flags & MULTICART_FLAGS_LOAD_RESOURCES) - { - err = load_all_resources(options, &state); - if (err != MCERR_NONE) - goto done; - - err = load_all_sockets(&state); - if (err != MCERR_NONE) - goto done; - } - - err = MCERR_NONE; - -done: - if (pool != NULL) - pool_free_lib(pool); - if (state.zip != NULL) - zip_file_close(state.zip); - if (layout_text != NULL) - free(layout_text); - if (state.layout_xml != NULL) - xml_file_free(state.layout_xml); - - if ((err != MCERR_NONE) && (state.multicart != NULL)) - { - multicart_close(options, state.multicart); - state.multicart = NULL; - } - *cart = state.multicart; - return err; -} - - -/*------------------------------------------------- - multicart_close - closes a multicart --------------------------------------------------*/ - -void multicart_close(emu_options &options, multicart_t *cart) -{ - save_ram_resources(options, cart); - pool_free_lib(cart->data->pool); -} - -/*------------------------------------------------- - DEVICE_START( multicartslot ) --------------------------------------------------*/ - -static DEVICE_START( multicartslot ) -{ - const multicartslot_config *config = get_config(device); - - /* if this cartridge has a custom DEVICE_START, use it */ - if (config->device_start != NULL) - { - (*config->device_start)(device); - } -} - - -/*------------------------------------------------- - DEVICE_IMAGE_LOAD( cartslot ) --------------------------------------------------*/ - -static DEVICE_IMAGE_LOAD( multicartslot ) -{ - device_t *device = &image.device(); - const multicartslot_config *config = get_config(device); - - /* if this cartridge has a custom DEVICE_IMAGE_LOAD, use it */ - if (config->device_load != NULL) - return (*config->device_load)(image); - - /* otherwise try the normal route */ - return IMAGE_INIT_PASS; -} - - -/*------------------------------------------------- - DEVICE_IMAGE_UNLOAD( multicartslot ) --------------------------------------------------*/ - -static DEVICE_IMAGE_UNLOAD( multicartslot ) -{ - device_t *device = &image.device(); - const multicartslot_config *config = get_config(device); - - /* if this cartridge has a custom DEVICE_IMAGE_UNLOAD, use it */ - if (config->device_unload != NULL) - { - (*config->device_unload)(image); - return; - } -} -/*------------------------------------------------- - DEVICE_GET_INFO( multicartslot ) --------------------------------------------------*/ - -DEVICE_GET_INFO( multicartslot ) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(multicartslot_t); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(multicartslot_config); break; - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_CARTSLOT; break; - case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_CREATABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_RESET_ON_LOAD: info->i = 1; break; - case DEVINFO_INT_IMAGE_MUST_BE_LOADED: info->i = 0; break; - - /* --- the following bits of info are returned as pointers to functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(multicartslot); break; - case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(multicartslot); break; - case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(multicartslot); break; - case DEVINFO_FCT_IMAGE_GET_DEVICES: info->f = (genf *) DEVICE_IMAGE_GET_DEVICES_NAME(multicartslot); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "MultiCartslot"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "MultiCartslot"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: - if ( device && downcast(device)->inline_config() && get_config(device)->extensions ) - { - strcpy(info->s, get_config(device)->extensions); - } - else - { - strcpy(info->s, "bin"); - } - break; - } -} - -DEFINE_LEGACY_IMAGE_DEVICE(MULTICARTSLOT, multicartslot); - -//************************************************************************** -// DEVICE CARTSLOT INTERFACE -//************************************************************************** - -//------------------------------------------------- -// device_cart_slot_interface - constructor -//------------------------------------------------- - -device_cart_slot_interface::device_cart_slot_interface(const machine_config &mconfig, device_t &device) - : device_interface(device) -{ -} - - -//------------------------------------------------- -// ~device_cart_slot_interface - destructor -//------------------------------------------------- - -device_cart_slot_interface::~device_cart_slot_interface() -{ -} - -//************************************************************************** -// LIVE LEGACY cart_slot DEVICE -//************************************************************************** - -//------------------------------------------------- -// legacy_cart_slot_device_base - constructor -//------------------------------------------------- - -legacy_cart_slot_device_base::legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config) - : legacy_device_base(mconfig, type, tag, owner, clock, get_config), - device_cart_slot_interface(mconfig, *this) -{ -} diff -Nru mame-0.144/src/emu/imagedev/multcart.h mame-0.145/src/emu/imagedev/multcart.h --- mame-0.144/src/emu/imagedev/multcart.h 2012-01-13 15:34:23.000000000 +0000 +++ mame-0.145/src/emu/imagedev/multcart.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -/********************************************************************* - - multcart.h - - Multi-cartridge handling code - -*********************************************************************/ - -#ifndef __MULTCART_H__ -#define __MULTCART_H__ - -#include "osdcore.h" - -#define TAG_PCB "pcb" - -DECLARE_LEGACY_IMAGE_DEVICE(MULTICARTSLOT, multicartslot); - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -enum _multicart_load_flags -{ - MULTICART_FLAGS_DONT_LOAD_RESOURCES = 0x00, - MULTICART_FLAGS_LOAD_RESOURCES = 0x01 -}; -typedef enum _multicart_load_flags multicart_load_flags; - -enum _multicart_resource_type -{ - MULTICART_RESOURCE_TYPE_INVALID, - MULTICART_RESOURCE_TYPE_ROM, - MULTICART_RESOURCE_TYPE_RAM -}; -typedef enum _multicart_resource_type multicart_resource_type; - -typedef struct _multicart_resource multicart_resource; -struct _multicart_resource -{ - const char * id; - const char * filename; - multicart_resource * next; - multicart_resource_type type; - UINT32 length; - void * ptr; -}; - - -typedef struct _multicart_socket multicart_socket; -struct _multicart_socket -{ - const char * id; - multicart_socket * next; - const multicart_resource * resource; - void * ptr; -}; - - -typedef struct _multicart_private multicart_private; - -typedef struct _multicart_t multicart_t; -struct _multicart_t -{ - const multicart_resource * resources; - const multicart_socket * sockets; - const char * pcb_type; - const char * gamedrv_name; /* need this to find the path to the nvram files */ - multicart_private * data; -}; - -typedef struct _multicartslot_t multicartslot_t; -struct _multicartslot_t -{ - device_t *pcb_device; - multicart_t *mc; -}; - - -typedef struct _multicartslot_pcb_type multicartslot_pcb_type; -struct _multicartslot_pcb_type -{ - const char * name; - device_type devtype; -}; - - -typedef struct _multicartslot_config multicartslot_config; -struct _multicartslot_config -{ - const char * extensions; - device_start_func device_start; - device_image_load_func device_load; - device_image_unload_func device_unload; - multicartslot_pcb_type pcb_types[16]; -}; - -enum _multicart_open_error -{ - MCERR_NONE, - MCERR_NOT_MULTICART, - MCERR_CORRUPT, - MCERR_OUT_OF_MEMORY, - MCERR_XML_ERROR, - MCERR_INVALID_FILE_REF, - MCERR_ZIP_ERROR, - MCERR_MISSING_RAM_LENGTH, - MCERR_INVALID_RAM_SPEC, - MCERR_UNKNOWN_RESOURCE_TYPE, - MCERR_INVALID_RESOURCE_REF, - MCERR_INVALID_FILE_FORMAT, - MCERR_MISSING_LAYOUT, - MCERR_NO_PCB_OR_RESOURCES -}; -typedef enum _multicart_open_error multicart_open_error; - -const char *multicart_error_text(multicart_open_error error); - -/*************************************************************************** - PROTOTYPES -***************************************************************************/ - -/* opens a multicart */ -multicart_open_error multicart_open(emu_options &options, const char *filename, const char *drvname, multicart_load_flags load_flags, multicart_t **cart); - -/* closes a multicart */ -void multicart_close(emu_options &options, multicart_t *cart); - -/* accesses the PCB associated with this cartslot */ -device_t *cartslot_get_pcb(device_t *device); - -/* accesses a particular socket */ -void *cartslot_get_socket(device_t *device, const char *socket_name); - -/* accesses a particular socket; gets the length of the associated resource */ -int cartslot_get_resource_length(device_t *device, const char *socket_name); - -#define DECLARE_LEGACY_CART_SLOT_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) -#define DEFINE_LEGACY_CART_SLOT_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) - -#define MCFG_MULTICARTSLOT_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, MULTICARTSLOT, 0) \ - -#define MCFG_MULTICARTSLOT_MODIFY(_tag) \ - MCFG_DEVICE_MODIFY(_tag) \ - -#define MCFG_MULTICARTSLOT_PCBTYPE(_index, _pcb_type_name, _pcb_devtype) \ - MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(multicartslot_config, pcb_types, _index, multicartslot_pcb_type, name, _pcb_type_name) \ - MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(multicartslot_config, pcb_types, _index, multicartslot_pcb_type, devtype, _pcb_devtype) - -#define MCFG_MULTICARTSLOT_START(_start) \ - MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_start, DEVICE_START_NAME(_start)) - -#define MCFG_MULTICARTSLOT_LOAD(_load) \ - MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_load, DEVICE_IMAGE_LOAD_NAME(_load)) - -#define MCFG_MULTICARTSLOT_UNLOAD(_unload) \ - MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_unload, DEVICE_IMAGE_UNLOAD_NAME(_unload)) - -#define MCFG_MULTICARTSLOT_EXTENSION_LIST(_extensions) \ - MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, extensions, _extensions) - - -// ======================> device_cart_slot_interface - -// class representing interface-specific live cart_slot -class device_cart_slot_interface : public device_interface -{ -public: - // construction/destruction - device_cart_slot_interface(const machine_config &mconfig, device_t &device); - virtual ~device_cart_slot_interface(); -}; - - -// ======================> legacy_cart_slot_device - -// legacy_cart_slot_device is a legacy_device_base with a cart_slot interface -class legacy_cart_slot_device_base : public legacy_device_base, - public device_cart_slot_interface -{ -protected: - // construction/destruction - legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config); - -public: - using legacy_device_base::get_legacy_int; - using legacy_device_base::get_legacy_fct; - using legacy_device_base::get_legacy_ptr; - - // device_cart_slot_interface overrides -}; - - -#endif /* __MULTCART_H__ */ diff -Nru mame-0.144/src/emu/imagedev/snapquik.c mame-0.145/src/emu/imagedev/snapquik.c --- mame-0.144/src/emu/imagedev/snapquik.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/imagedev/snapquik.c 2012-02-06 21:30:28.000000000 +0000 @@ -9,365 +9,91 @@ #include "emu.h" #include "snapquik.h" -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +// device type definition +const device_type SNAPSHOT = &device_creator; -typedef struct _snapquick_token snapquick_token; -struct _snapquick_token -{ - emu_timer *timer; - snapquick_load_func load; -}; - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - assert_is_snapshot_or_quickload - asserts/confirms - that a given device is a snapshot or quickload --------------------------------------------------*/ +//------------------------------------------------- +// snapshot_image_device - constructor +//------------------------------------------------- -INLINE void assert_is_snapshot_or_quickload(device_t *device) +snapshot_image_device::snapshot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, SNAPSHOT, "Snapshot", tag, owner, clock), + device_image_interface(mconfig, *this) { - assert(device != NULL); - assert(downcast(device)->inline_config() != NULL); - assert((device->type() == SNAPSHOT) || (device->type() == QUICKLOAD) - || (device->type() == Z80BIN)); } - - -/*------------------------------------------------- - get_token - safely gets the snapshot/quickload data --------------------------------------------------*/ - -INLINE snapquick_token *get_token(device_t *device) +snapshot_image_device::snapshot_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, type, name, tag, owner, clock), + device_image_interface(mconfig, *this) { - assert_is_snapshot_or_quickload(device); - return (snapquick_token *) downcast(device)->token(); } +//------------------------------------------------- +// snapshot_image_device - destructor +//------------------------------------------------- - - -/*------------------------------------------------- - get_config - safely gets the quickload config --------------------------------------------------*/ - -INLINE const snapquick_config *get_config(device_t *device) +snapshot_image_device::~snapshot_image_device() { - assert_is_snapshot_or_quickload(device); - return (const snapquick_config *) downcast(device)->inline_config(); } -INLINE const snapquick_config *get_config_dev(const device_t *device) -{ - assert(device != NULL); - assert((device->type() == SNAPSHOT) || (device->type() == QUICKLOAD) - || (device->type() == Z80BIN)); - return (const snapquick_config *) downcast(device)->inline_config(); -} +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- -/*------------------------------------------------- - log_quickload - logs and displays useful - data for the end user --------------------------------------------------*/ - -void log_quickload(const char *type, UINT32 start, UINT32 length, UINT32 exec, const char *exec_format) +void snapshot_image_device::device_config_complete() { - astring tempstring; - - logerror("Loading %04X bytes of RAM at %04X\n", length, start); - - tempstring.catprintf("Quickload type: %s Length: %d bytes\n", type, length); - tempstring.catprintf("Start: 0x%04X End: 0x%04X Exec: ", start, start + length - 1); - - logerror("Quickload loaded.\n"); - if (!mame_stricmp(exec_format, EXEC_NA)) - tempstring.cat("N/A"); - else - { - logerror("Execution can resume with "); - logerror(exec_format, exec); - logerror("\n"); - tempstring.catprintf(exec_format, exec); - } - - ui_popup_time(10, "%s", tempstring.cstr()); + // set brief and instance name + update_names(); } -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - /*------------------------------------------------- TIMER_CALLBACK(process_snapshot_or_quickload) -------------------------------------------------*/ static TIMER_CALLBACK(process_snapshot_or_quickload) { - device_image_interface *image = (device_image_interface *) ptr; - snapquick_token *token = get_token(&image->device()); + reinterpret_cast(ptr)->timer_callback(); +} +void snapshot_image_device::timer_callback() +{ /* invoke the load */ - (*token->load)(*image, - image->filetype(), - image->length()); + (*m_load)(*this, filetype(), length()); /* unload the device */ - image->unload(); + unload(); } +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- - -/*------------------------------------------------- - DEVICE_START( snapquick ) --------------------------------------------------*/ - -static DEVICE_START( snapquick ) +void snapshot_image_device::device_start() { - snapquick_token *token = get_token(device); - /* allocate a timer */ - token->timer = device->machine().scheduler().timer_alloc(FUNC(process_snapshot_or_quickload), (void *) dynamic_cast(device)); - + m_timer = machine().scheduler().timer_alloc(FUNC(process_snapshot_or_quickload), (void *)this); } - - /*------------------------------------------------- - DEVICE_IMAGE_LOAD( snapquick ) + call_load -------------------------------------------------*/ - -static DEVICE_IMAGE_LOAD( snapquick ) +bool snapshot_image_device::call_load() { - const snapquick_config *config = get_config(image); - snapquick_token *token = get_token(image); - - /* locate the load function */ - token->load = (snapquick_load_func) reinterpret_cast(image.get_device_specific_call()); - /* adjust the timer */ - - token->timer->adjust( - attotime(config->delay_seconds, config->delay_attoseconds), - 0); - - return IMAGE_INIT_PASS; -} - - - -/*------------------------------------------------- - DEVICE_GET_INFO(snapquick) - device getinfo - function --------------------------------------------------*/ - -static DEVICE_GET_INFO(snapquick) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(snapquick_token); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(snapquick_config); break; - case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_CREATABLE: info->i = 0; break; - - /* --- the following bits of info are returned as pointers to functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(snapquick); break; - case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(snapquick); break; - case DEVINFO_FCT_SNAPSHOT_QUICKLOAD_LOAD: info->f = (genf *) get_config_dev(device)->load; break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: strcpy(info->s, get_config_dev(device)->file_extensions); break; - } -} - - - -/*------------------------------------------------- - DEVICE_GET_INFO(snapshot) - device getinfo - function --------------------------------------------------*/ - -DEVICE_GET_INFO(snapshot) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_SNAPSHOT; break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Snapshot"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Snapshot"); break; - - default: DEVICE_GET_INFO_CALL(snapquick); break; - } -} - - - -/*------------------------------------------------- - DEVICE_GET_INFO(quickload) - device getinfo - function --------------------------------------------------*/ - -DEVICE_GET_INFO(quickload) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_QUICKLOAD; break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Quickload"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Quickload"); break; - - default: DEVICE_GET_INFO_CALL(snapquick); break; - } -} -/*------------------------------------------------- - z80bin_load_file - load a z80bin file into - memory --------------------------------------------------*/ - -static int z80bin_load_file(device_image_interface *image, const char *file_type, UINT16 *exec_addr, UINT16 *start_addr, UINT16 *end_addr ) -{ - int ch; - UINT16 args[3]; - UINT16 i=0, j, size; - UINT8 data; - char pgmname[256]; - char message[256]; - - image->fseek(7, SEEK_SET); - - while((ch = image->fgetc()) != 0x1A) - { - if (ch == EOF) - { - image->seterror(IMAGE_ERROR_INVALIDIMAGE, "Unexpected EOF while getting file name"); - image->message(" Unexpected EOF while getting file name"); - return IMAGE_INIT_FAIL; - } - - if (ch != '\0') - { - if (i >= (ARRAY_LENGTH(pgmname) - 1)) - { - image->seterror(IMAGE_ERROR_INVALIDIMAGE, "File name too long"); - image->message(" File name too long"); - return IMAGE_INIT_FAIL; - } - - pgmname[i] = ch; /* build program name */ - i++; - } - } - - pgmname[i] = '\0'; /* terminate string with a null */ - - if (image->fread(args, sizeof(args)) != sizeof(args)) - { - image->seterror(IMAGE_ERROR_INVALIDIMAGE, "Unexpected EOF while getting file size"); - image->message(" Unexpected EOF while getting file size"); - return IMAGE_INIT_FAIL; - } - - exec_addr[0] = LITTLE_ENDIANIZE_INT16(args[0]); - start_addr[0] = LITTLE_ENDIANIZE_INT16(args[1]); - end_addr[0] = LITTLE_ENDIANIZE_INT16(args[2]); - - size = (end_addr[0] - start_addr[0] + 1) & 0xffff; - - /* display a message about the loaded quickload */ - image->message(" %s\nsize=%04X : start=%04X : end=%04X : exec=%04X",pgmname,size,start_addr[0],end_addr[0],exec_addr[0]); - - for (i = 0; i < size; i++) - { - j = (start_addr[0] + i) & 0xffff; - if (image->fread(&data, 1) != 1) - { - snprintf(message, ARRAY_LENGTH(message), "%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j); - image->seterror(IMAGE_ERROR_INVALIDIMAGE, message); - image->message("%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j); - return IMAGE_INIT_FAIL; - } - image->device().machine().device("maincpu")->memory().space(AS_PROGRAM)->write_byte(j, data); - } - - return IMAGE_INIT_PASS; -} - - - -/*------------------------------------------------- - QUICKLOAD_LOAD( z80bin ) --------------------------------------------------*/ - -static QUICKLOAD_LOAD( z80bin ) -{ - const z80bin_config *config; - UINT16 exec_addr, start_addr, end_addr; - int autorun; - - /* load the binary into memory */ - if (z80bin_load_file(&image, file_type, &exec_addr, &start_addr, &end_addr) == IMAGE_INIT_FAIL) - return IMAGE_INIT_FAIL; - - /* is this file executable? */ - if (exec_addr != 0xffff) - { - config = (const z80bin_config *)downcast(image.device()).inline_config(); - - /* check to see if autorun is on (I hate how this works) */ - autorun = input_port_read_safe(image.device().machine(), "CONFIG", 0xFF) & 1; - - /* start program */ - if (config->execute != NULL) - { - (*config->execute)(image.device().machine(), start_addr, end_addr, exec_addr, autorun); - } - else - { - if (autorun) - cpu_set_reg(image.device().machine().device("maincpu"), STATE_GENPC, exec_addr); - } - } - + m_timer->adjust(attotime(m_delay_seconds, m_delay_attoseconds),0); return IMAGE_INIT_PASS; } +// device type definition +const device_type QUICKLOAD = &device_creator; +//------------------------------------------------- +// quickload_image_device - constructor +//------------------------------------------------- -/*------------------------------------------------- - DEVICE_GET_INFO(z80bin) --------------------------------------------------*/ - -DEVICE_GET_INFO(z80bin) +quickload_image_device::quickload_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : snapshot_image_device(mconfig, QUICKLOAD, "Quickload", tag, owner, clock) { - /* quickload */ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(z80bin_config); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: strcpy(info->s, "bin"); break; - - /* --- the following bits of info are returned as pointers to functions --- */ - case DEVINFO_FCT_SNAPSHOT_QUICKLOAD_LOAD: info->f = (genf *) quickload_load_z80bin; break; - - default: DEVICE_GET_INFO_CALL(quickload); break; - } } -DEFINE_LEGACY_IMAGE_DEVICE(Z80BIN, z80bin); -DEFINE_LEGACY_IMAGE_DEVICE(SNAPSHOT, snapshot); -DEFINE_LEGACY_IMAGE_DEVICE(QUICKLOAD, quickload); diff -Nru mame-0.144/src/emu/imagedev/snapquik.h mame-0.145/src/emu/imagedev/snapquik.h --- mame-0.144/src/emu/imagedev/snapquik.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/imagedev/snapquik.h 2012-02-06 21:30:28.000000000 +0000 @@ -9,107 +9,78 @@ #ifndef __SNAPQUIK_H__ #define __SNAPQUIK_H__ -#include "image.h" -#include "ui.h" +typedef int (*snapquick_load_func)(device_image_interface &image, const char *file_type, int file_size); +// ======================> snapshot_image_device +class snapshot_image_device : public device_t, + public device_image_interface +{ +public: + // construction/destruction + snapshot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + snapshot_image_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + virtual ~snapshot_image_device(); + + // image-level overrides + virtual bool call_load(); + virtual iodevice_t image_type() const { return IO_SNAPSHOT; } + + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 0; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 0; } + virtual const char *image_interface() const { return NULL; } + virtual const char *file_extensions() const { return m_file_extensions; } + virtual const option_guide *create_option_guide() const { return NULL; } + + void timer_callback(); + void set_handler(snapquick_load_func load, const char *ext, seconds_t sec) { m_load = load; m_file_extensions = ext; m_delay_seconds = sec; }; +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + + snapquick_load_func m_load; /* loading function */ + const char * m_file_extensions; /* file extensions */ + seconds_t m_delay_seconds; /* loading delay (seconds) */ + attoseconds_t m_delay_attoseconds; /* loading delay (attoseconds) */ + emu_timer *m_timer; +}; -/*************************************************************************** - CONSTANTS -***************************************************************************/ +// device type definition +extern const device_type SNAPSHOT; -enum +// ======================> quickload_image_device + +class quickload_image_device : public snapshot_image_device { - DEVINFO_FCT_SNAPSHOT_QUICKLOAD_LOAD = DEVINFO_FCT_DEVICE_SPECIFIC -}; +public: + // construction/destruction + quickload_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual iodevice_t image_type() const { return IO_QUICKLOAD; } +}; +// device type definition +extern const device_type QUICKLOAD; /*************************************************************************** - MACROS + DEVICE CONFIGURATION MACROS ***************************************************************************/ - -DECLARE_LEGACY_IMAGE_DEVICE(SNAPSHOT, snapshot); -DECLARE_LEGACY_IMAGE_DEVICE(QUICKLOAD, quickload); -DECLARE_LEGACY_IMAGE_DEVICE(Z80BIN, z80bin); - #define SNAPSHOT_LOAD_NAME(name) snapshot_load_##name #define SNAPSHOT_LOAD(name) int SNAPSHOT_LOAD_NAME(name)(device_image_interface &image, const char *file_type, int snapshot_size) #define QUICKLOAD_LOAD_NAME(name) quickload_load_##name #define QUICKLOAD_LOAD(name) int QUICKLOAD_LOAD_NAME(name)(device_image_interface &image, const char *file_type, int quickload_size) -#define Z80BIN_EXECUTE_NAME(name) z80bin_execute_##name -#define Z80BIN_EXECUTE(name) void Z80BIN_EXECUTE_NAME(name)(running_machine &machine, UINT16 start_address, UINT16 end_address, UINT16 execute_address, int autorun) - -#define LOAD_REG(_cpu, _reg, _data) \ - do { \ - cpu_set_reg(_cpu, _reg, (_data)); \ - } while (0) - -#define EXEC_NA "N/A" -#define z80bin_execute_default NULL - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef int (*snapquick_load_func)(device_image_interface &image, const char *file_type, int file_size); - -typedef struct _snapquick_config snapquick_config; -struct _snapquick_config -{ - snapquick_load_func load; /* loading function */ - const char * file_extensions; /* file extensions */ - seconds_t delay_seconds; /* loading delay (seconds) */ - attoseconds_t delay_attoseconds; /* loading delay (attoseconds) */ -}; -typedef void (*z80bin_execute_func)(running_machine &machine, UINT16 start_address, UINT16 end_address, UINT16 execute_address, int autorun); - -typedef struct _z80bin_config z80bin_config; -struct _z80bin_config -{ - snapquick_config base; - z80bin_execute_func execute; -}; - -/*************************************************************************** - SNAPSHOT DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_SNAPSHOT_ADD(_tag, _load, _file_extensions, _delay) \ +#define MCFG_SNAPSHOT_ADD(_tag, _load, _file_extensions, _delay) \ MCFG_DEVICE_ADD(_tag, SNAPSHOT, 0) \ - MCFG_DEVICE_CONFIG_DATAPTR(snapquick_config, load, SNAPSHOT_LOAD_NAME(_load)) \ - MCFG_DEVICE_CONFIG_DATAPTR(snapquick_config, file_extensions, _file_extensions) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_seconds, (seconds_t) (_delay)) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_attoseconds, (attoseconds_t) (((_delay) - (int)(_delay)) * ATTOSECONDS_PER_SECOND)) \ - -/*************************************************************************** - QUICKLOAD DEVICE CONFIGURATION MACROS -***************************************************************************/ + static_cast(device)->set_handler(SNAPSHOT_LOAD_NAME(_load), _file_extensions, _delay); #define MCFG_QUICKLOAD_ADD(_tag, _load, _file_extensions, _delay) \ MCFG_DEVICE_ADD(_tag, QUICKLOAD, 0) \ - MCFG_DEVICE_CONFIG_DATAPTR(snapquick_config, load, QUICKLOAD_LOAD_NAME(_load)) \ - MCFG_DEVICE_CONFIG_DATAPTR(snapquick_config, file_extensions, _file_extensions) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_seconds, (seconds_t) (_delay)) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_attoseconds, (attoseconds_t) (((_delay) - (int)(_delay)) * ATTOSECONDS_PER_SECOND)) \ - -/*************************************************************************** - Z80BIN QUICKLOAD DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_Z80BIN_QUICKLOAD_ADD(_tag, _execute, _delay) \ - MCFG_DEVICE_ADD(_tag, Z80BIN, 0) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_seconds, (seconds_t) (_delay)) \ - MCFG_DEVICE_CONFIG_DATA64(snapquick_config, delay_attoseconds, (attoseconds_t) (((_delay) - (int)(_delay)) * ATTOSECONDS_PER_SECOND)) \ - MCFG_DEVICE_CONFIG_DATAPTR(z80bin_config, execute, Z80BIN_EXECUTE_NAME(_execute)) - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -void log_quickload(const char *type, UINT32 start, UINT32 length, UINT32 exec, const char *exec_format); - + static_cast(device)->set_handler(QUICKLOAD_LOAD_NAME(_load), _file_extensions, _delay); #endif /* __SNAPQUIK_H__ */ diff -Nru mame-0.144/src/emu/image.h mame-0.145/src/emu/image.h --- mame-0.144/src/emu/image.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/image.h 2012-02-06 21:30:28.000000000 +0000 @@ -26,7 +26,7 @@ void image_battery_load_by_name(emu_options &options, const char *filename, void *buffer, int length, int fill); void image_battery_save_by_name(emu_options &options, const char *filename, const void *buffer, int length); -astring *image_info_astring(running_machine &machine, astring *string); +astring &image_info_astring(running_machine &machine, astring &string); device_image_interface *image_from_absolute_index(running_machine &machine, int absolute_index); diff -Nru mame-0.144/src/emu/info.c mame-0.145/src/emu/info.c --- mame-0.144/src/emu/info.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/info.c 2012-02-06 21:30:28.000000000 +0000 @@ -38,6 +38,7 @@ ***************************************************************************/ #include "emu.h" +#include "emuopts.h" #include "machine/ram.h" #include "sound/samples.h" #include "info.h" @@ -53,21 +54,21 @@ // DTD string describing the data const char info_xml_creator::s_dtd_string[] = -"\n" -"\t\n" -"\t\n" -"\t\n" -"\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" -"\t\t\n" +"\n" +"\t\n" +"\t\n" +"\t\n" +"\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\n" "\t\t\n" "\t\t\n" "\t\t\n" @@ -133,6 +134,9 @@ "\t\t\t\t\n" "\t\t\t\t\n" "\t\t\t\t\n" +"\t\t\t\t\n" +"\t\t\t\t\n" +"\t\t\t\t\n" "\t\t\n" "\t\t\t\n" "\t\t\t\n" @@ -180,6 +184,7 @@ "\t\t\n" "\t\t\t\n" "\t\t\t\n" +"\t\t\t\n" "\t\t\n" "\t\t\t\n" "]>"; @@ -198,8 +203,10 @@ info_xml_creator::info_xml_creator(driver_enumerator &drivlist) : m_output(NULL), - m_drivlist(drivlist) + m_drivlist(drivlist), + m_lookup_options(m_drivlist.options()) { + m_lookup_options.remove_device_options(); } @@ -214,16 +221,21 @@ // output the DTD fprintf(m_output, "\n"); - fprintf(m_output, "%s\n\n", s_dtd_string); + astring dtd(s_dtd_string); + dtd.replace(0,"__XML_ROOT__", emulator_info::get_xml_root()); + dtd.replace(0,"__XML_TOP__", emulator_info::get_xml_top()); + + fprintf(m_output, "%s\n\n", dtd.cstr()); // top-level tag - fprintf(m_output, "<" XML_ROOT " build=\"%s\" debug=\"" + fprintf(m_output, "<%s build=\"%s\" debug=\"" #ifdef MAME_DEBUG "yes" #else "no" #endif "\" mameconfig=\"%d\">\n", + emulator_info::get_xml_root(), xml_normalize_string(build_version), CONFIG_VERSION ); @@ -240,7 +252,7 @@ global_free(m_device_used); // close the top level tag - fprintf(m_output, "\n"); + fprintf(m_output, "\n",emulator_info::get_xml_root()); } @@ -254,17 +266,17 @@ m_drivlist.reset(); m_drivlist.next(); machine_config &config = m_drivlist.config(); - device_t *owner = config.devicelist().first(); + device_t &owner = config.root_device(); // check if all are listed, note that empty one is included bool display_all = driver_list::total() == (m_drivlist.count()+1); for(int i=0;iconfig_complete(); // print the header and the game name - fprintf(m_output, "\t<" XML_TOP); + fprintf(m_output, "\t<%s",emulator_info::get_xml_top()); fprintf(m_output, " name=\"%s\"", xml_normalize_string(dev->shortname())); fprintf(m_output, " isdevice=\"yes\""); fprintf(m_output, " runnable=\"no\""); @@ -277,7 +289,7 @@ output_rom(dev); // close the topmost tag - fprintf(m_output, "\t\n"); + fprintf(m_output, "\t\n",emulator_info::get_xml_top()); global_free(dev); } } @@ -299,11 +311,12 @@ machine_config &config = m_drivlist.config(); ioport_list portlist; astring errors; - for (device_t *device = config.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(config.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) input_port_list_init(*device, portlist, errors); // print the header and the game name - fprintf(m_output, "\t<" XML_TOP); + fprintf(m_output, "\t<%s",emulator_info::get_xml_top()); fprintf(m_output, " name=\"%s\"", xml_normalize_string(driver.name)); // strip away any path information from the source_file and output it @@ -364,7 +377,7 @@ output_ramoptions(); // close the topmost tag - fprintf(m_output, "\t\n"); + fprintf(m_output, "\t\n",emulator_info::get_xml_top()); } //------------------------------------------------ @@ -395,7 +408,8 @@ void info_xml_creator::output_sampleof() { // iterate over sample devices - for (const device_t *device = m_drivlist.config().devicelist().first(SAMPLES); device != NULL; device = device->typenext()) + samples_device_iterator iter(m_drivlist.config().root_device()); + for (samples_device *device = iter.first(); device != NULL; device = iter.next()) { const char *const *samplenames = ((const samples_interface *)device->static_config())->samplenames; if (samplenames != NULL) @@ -554,7 +568,8 @@ void info_xml_creator::output_sample() { // iterate over sample devices - for (const device_t *device = m_drivlist.config().devicelist().first(SAMPLES); device != NULL; device = device->typenext()) + samples_device_iterator iter(m_drivlist.config().root_device()); + for (const device_t *device = iter.first(); device != NULL; device = iter.next()) { const char *const *samplenames = ((const samples_interface *)device->static_config())->samplenames; if (samplenames != NULL) @@ -590,8 +605,8 @@ void info_xml_creator::output_chips() { // iterate over executable devices - device_execute_interface *exec = NULL; - for (bool gotone = m_drivlist.config().devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator execiter(m_drivlist.config().root_device()); + for (device_execute_interface *exec = execiter.first(); exec != NULL; exec = execiter.next()) { fprintf(m_output, "\t\tnext(sound)) + sound_interface_iterator sounditer(m_drivlist.config().root_device()); + for (device_sound_interface *sound = sounditer.first(); sound != NULL; sound = sounditer.next()) { fprintf(m_output, "\t\tnext_screen()) + screen_device_iterator iter(m_drivlist.config().root_device()); + for (const screen_device *device = iter.first(); device != NULL; device = iter.next()) { fprintf(m_output, "\t\tscreen_type() != SCREEN_TYPE_VECTOR) { const rectangle &visarea = device->visible_area(); - fprintf(m_output, " width=\"%d\"", visarea.max_x - visarea.min_x + 1); - fprintf(m_output, " height=\"%d\"", visarea.max_y - visarea.min_y + 1); + fprintf(m_output, " width=\"%d\"", visarea.width()); + fprintf(m_output, " height=\"%d\"", visarea.height()); } // output refresh rate @@ -702,11 +718,12 @@ void info_xml_creator::output_sound() { - int speakers = m_drivlist.config().devicelist().count(SPEAKER); + speaker_device_iterator spkiter(m_drivlist.config().root_device()); + int speakers = spkiter.count(); // if we have no sound, zero m_output the speaker count - const device_sound_interface *sound = NULL; - if (!m_drivlist.config().devicelist().first(sound)) + sound_interface_iterator snditer(m_drivlist.config().root_device()); + if (snditer.first() == NULL) speakers = 0; fprintf(m_output, "\t\t\n", speakers); @@ -1077,7 +1094,7 @@ /* some minor issues, games marked as status=preliminary */ /* don't work or have major emulation problems. */ - if (m_drivlist.driver().flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND | GAME_WRONG_COLORS)) + if (m_drivlist.driver().flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_NO_SOUND | GAME_WRONG_COLORS | GAME_MECHANICAL)) 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\""); @@ -1132,8 +1149,8 @@ void info_xml_creator::output_images() { - const device_image_interface *dev = NULL; - for (bool gotone = m_drivlist.config().devicelist().first(dev); gotone; gotone = dev->next(dev)) + image_interface_iterator iter(m_drivlist.config().root_device()); + for (const device_image_interface *dev = iter.first(); dev != NULL; dev = iter.next()) { // print m_output device type fprintf(m_output, "\t\timage_type_name())); @@ -1182,11 +1199,11 @@ void info_xml_creator::output_slots() { - const device_slot_interface *slot = NULL; - for (bool gotone = m_drivlist.config().devicelist().first(slot); gotone; gotone = slot->next(slot)) + slot_interface_iterator iter(m_drivlist.config().root_device()); + for (const device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) { // print m_output device type - fprintf(m_output, "\t\t\n", xml_normalize_string(slot->device().tag())); + fprintf(m_output, "\t\t\n", xml_normalize_string(slot->device().tag()+1)); /* if (slot->slot_interface()[0]) @@ -1198,9 +1215,9 @@ { fprintf(m_output, "\t\t\tget_default_card(m_drivlist.config().devicelist(), m_drivlist.options())) + if (slot->get_default_card(m_drivlist.config(), m_drivlist.options())) { - if (slot->get_default_card(m_drivlist.config().devicelist(), m_drivlist.options()) == intf[i].name) + if (slot->get_default_card(m_drivlist.config(), m_drivlist.options()) == intf[i].name) fprintf(m_output, " default=\"yes\""); } fprintf(m_output, "/>\n"); @@ -1218,16 +1235,15 @@ void info_xml_creator::output_software_list() { - for (const device_t *dev = m_drivlist.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) + software_list_device_iterator iter(m_drivlist.config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(dev)->inline_config(); - - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) - if (swlist->list_name[i]) - { - fprintf(m_output, "\t\tlist_name[i]); - fprintf(m_output, "status=\"%s\" />\n", (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM) ? "original" : "compatible"); - } + fprintf(m_output, "\t\tlist_name()); + fprintf(m_output, "status=\"%s\" ", (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) ? "original" : "compatible"); + if (swlist->filter()) { + fprintf(m_output, "filter=\"%s\" ", swlist->filter()); + } + fprintf(m_output, "/>\n"); } } @@ -1240,19 +1256,19 @@ void info_xml_creator::output_ramoptions() { - for (const device_t *device = m_drivlist.config().devicelist().first(RAM); device != NULL; device = device->typenext()) + ram_device_iterator iter(m_drivlist.config().root_device()); + for (const ram_device *ram = iter.first(); ram != NULL; ram = iter.next()) { - ram_config *ram = (ram_config *)downcast(device)->inline_config(); - fprintf(m_output, "\t\t%u\n", ram_parse_string(ram->default_size)); + fprintf(m_output, "\t\t%u\n", ram->default_size()); - if (ram->extra_options != NULL) + if (ram->extra_options() != NULL) { - astring options(ram->extra_options); + astring options(ram->extra_options()); for (int start = 0, end = options.chr(0, ','); ; start = end + 1, end = options.chr(start, ',')) { astring option; option.cpysubstr(options, start, (end == -1) ? -1 : end - start); - fprintf(m_output, "\t\t%u\n", ram_parse_string(option)); + fprintf(m_output, "\t\t%u\n", ram_device::parse_string(option)); if (end == -1) break; } @@ -1269,12 +1285,11 @@ const char *info_xml_creator::get_merge_name(const hash_collection &romhashes) { 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_source *psource = rom_first_source(m_drivlist.config(clone_of,m_lookup_options)); 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)) { diff -Nru mame-0.144/src/emu/info.h mame-0.145/src/emu/info.h --- mame-0.144/src/emu/info.h 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/info.h 2012-02-06 21:30:28.000000000 +0000 @@ -86,6 +86,7 @@ FILE * m_output; driver_enumerator & m_drivlist; UINT8 * m_device_used; + emu_options m_lookup_options; static const char s_dtd_string[]; }; diff -Nru mame-0.144/src/emu/input.c mame-0.145/src/emu/input.c --- mame-0.144/src/emu/input.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/input.c 2012-02-06 21:30:28.000000000 +0000 @@ -2179,7 +2179,7 @@ // otherwise, create a tokenized name else - m_token.cpy(name).toupper().delchr(' ').delchr('_'); + m_token.cpy(name).makeupper().delchr(' ').delchr('_'); } diff -Nru mame-0.144/src/emu/ioport.c mame-0.145/src/emu/ioport.c --- mame-0.144/src/emu/ioport.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/ioport.c 2012-02-06 21:30:26.000000000 +0000 @@ -312,7 +312,7 @@ ***************************************************************************/ /* XML attributes for the different types */ -static const char *const seqtypestrings[] = { "standard", "decrement", "increment" }; +static const char *const seqtypestrings[] = { "standard", "increment", "decrement" }; static const char_info charinfo[] = @@ -637,129 +637,40 @@ { INPUT_STRING_Coinage, "Coinage" }, { INPUT_STRING_Coin_A, "Coin A" }, { INPUT_STRING_Coin_B, "Coin B" }, -// { INPUT_STRING_20C_1C, "20 Coins/1 Credit" }, -// { INPUT_STRING_15C_1C, "15 Coins/1 Credit" }, -// { INPUT_STRING_10C_1C, "10 Coins/1 Credit" }, -// __input_string_coinage_start { INPUT_STRING_9C_1C, "9 Coins/1 Credit" }, { INPUT_STRING_8C_1C, "8 Coins/1 Credit" }, { INPUT_STRING_7C_1C, "7 Coins/1 Credit" }, { INPUT_STRING_6C_1C, "6 Coins/1 Credit" }, -// { INPUT_STRING_10C_2C, "10 Coins/2 Credits" }, { INPUT_STRING_5C_1C, "5 Coins/1 Credit" }, -// { INPUT_STRING_9C_2C, "9 Coins/2 Credits" }, -// { INPUT_STRING_8C_2C, "8 Coins/2 Credits" }, { INPUT_STRING_4C_1C, "4 Coins/1 Credit" }, -// { INPUT_STRING_7C_2C, "7 Coins/2 Credits" }, -// { INPUT_STRING_10C_3C, "10 Coins/3 Credits" }, -// { INPUT_STRING_9C_3C, "9 Coins/3 Credits" }, -// { INPUT_STRING_6C_2C, "6 Coins/2 Credits" }, { INPUT_STRING_3C_1C, "3 Coins/1 Credit" }, { INPUT_STRING_8C_3C, "8 Coins/3 Credits" }, -// { INPUT_STRING_10C_4C, "10 Coins/4 Credits" }, -// { INPUT_STRING_5C_2C, "5 Coins/2 Credits" }, -// { INPUT_STRING_7C_3C, "7 Coins/3 Credits" }, -// { INPUT_STRING_9C_4C, "9 Coins/4 Credits" }, -// { INPUT_STRING_10C_5C, "10 Coins/5 Credits" }, -// { INPUT_STRING_8C_4C, "8 Coins/4 Credits" }, -// { INPUT_STRING_6C_3C, "6 Coins/3 Credits" }, { INPUT_STRING_4C_2C, "4 Coins/2 Credits" }, { INPUT_STRING_2C_1C, "2 Coins/1 Credit" }, -// { INPUT_STRING_9C_5C, "9 Coins/5 Credits" }, -// { INPUT_STRING_7C_4C, "7 Coins/4 Credits" }, -// { INPUT_STRING_10C_6C, "10 Coins/6 Credits" }, { INPUT_STRING_5C_3C, "5 Coins/3 Credits" }, -// { INPUT_STRING_8C_5C, "8 Coins/5 Credits" }, -// { INPUT_STRING_9C_6C, "9 Coins/6 Credits" }, -// { INPUT_STRING_6C_4C, "6 Coins/4 Credits" }, { INPUT_STRING_3C_2C, "3 Coins/2 Credits" }, -// { INPUT_STRING_10C_7C, "10 Coins/7 Credits" }, -// { INPUT_STRING_7C_5C, "7 Coins/5 Credits" }, -// { INPUT_STRING_8C_6C, "8 Coins/6 Credits" }, { INPUT_STRING_4C_3C, "4 Coins/3 Credits" }, -// { INPUT_STRING_9C_7C, "9 Coins/7 Credits" }, -// { INPUT_STRING_10C_8C, "10 Coins/8 Credits" }, -// { INPUT_STRING_5C_4C, "5 Coins/4 Credits" }, -// { INPUT_STRING_6C_5C, "6 Coins/5 Credits" }, -// { INPUT_STRING_7C_6C, "7 Coins/6 Credits" }, -// { INPUT_STRING_8C_7C, "8 Coins/7 Credits" }, -// { INPUT_STRING_9C_8C, "9 Coins/8 Credits" }, -// { INPUT_STRING_10C_9C, "10 Coins/9 Credits" }, -// { INPUT_STRING_10C_10C, "10 Coins/10 Credits" }, -// { INPUT_STRING_9C_9C, "9 Coins/9 Credits" }, -// { INPUT_STRING_8C_8C, "8 Coins/8 Credits" }, -// { INPUT_STRING_7C_7C, "7 Coins/7 Credits" }, -// { INPUT_STRING_6C_6C, "6 Coins/6 Credits" }, -// { INPUT_STRING_5C_5C, "5 Coins/5 Credits" }, { INPUT_STRING_4C_4C, "4 Coins/4 Credits" }, { INPUT_STRING_3C_3C, "3 Coins/3 Credits" }, { INPUT_STRING_2C_2C, "2 Coins/2 Credits" }, { INPUT_STRING_1C_1C, "1 Coin/1 Credit" }, -// { INPUT_STRING_9C_10C, "9 Coins/10 Credits" }, -// { INPUT_STRING_8C_9C, "8 Coins/9 Credits" }, -// { INPUT_STRING_7C_8C, "7 Coins/8 Credits" }, -// { INPUT_STRING_6C_7C, "6 Coins/7 Credits" }, -// { INPUT_STRING_5C_6C, "5 Coins/6 Credits" }, -// { INPUT_STRING_8C_10C, "8 Coins/10 Credits" }, { INPUT_STRING_4C_5C, "4 Coins/5 Credits" }, -// { INPUT_STRING_7C_9C, "7 Coins/9 Credits" }, -// { INPUT_STRING_6C_8C, "6 Coins/8 Credits" }, { INPUT_STRING_3C_4C, "3 Coins/4 Credits" }, -// { INPUT_STRING_5C_7C, "5 Coins/7 Credits" }, -// { INPUT_STRING_7C_10C, "7 Coins/10 Credits" }, -// { INPUT_STRING_6C_9C, "6 Coins/9 Credits" }, -// { INPUT_STRING_4C_6C, "4 Coins/6 Credits" }, { INPUT_STRING_2C_3C, "2 Coins/3 Credits" }, -// { INPUT_STRING_5C_8C, "5 Coins/8 Credits" }, -// { INPUT_STRING_6C_10C, "6 Coins/10 Credits" }, -// { INPUT_STRING_3C_5C, "3 Coins/5 Credits" }, { INPUT_STRING_4C_7C, "4 Coins/7 Credits" }, -// { INPUT_STRING_5C_9C, "5 Coins/9 Credits" }, -// { INPUT_STRING_5C_10C, "5 Coins/10 Credits" }, -// { INPUT_STRING_4C_8C, "4 Coins/8 Credits" }, -// { INPUT_STRING_3C_6C, "3 Coins/6 Credits" }, { INPUT_STRING_2C_4C, "2 Coins/4 Credits" }, { INPUT_STRING_1C_2C, "1 Coin/2 Credits" }, -// { INPUT_STRING_4C_9C, "4 Coins/9 Credits" }, -// { INPUT_STRING_3C_7C, "3 Coins/7 Credits" }, -// { INPUT_STRING_4C_10C, "4 Coins/10 Credits" }, { INPUT_STRING_2C_5C, "2 Coins/5 Credits" }, -// { INPUT_STRING_3C_8C, "3 Coins/8 Credits" }, -// { INPUT_STRING_3C_9C, "3 Coins/9 Credits" }, { INPUT_STRING_2C_6C, "2 Coins/6 Credits" }, { INPUT_STRING_1C_3C, "1 Coin/3 Credits" }, -// { INPUT_STRING_3C_10C, "3 Coins/10 Credits" }, { INPUT_STRING_2C_7C, "2 Coins/7 Credits" }, { INPUT_STRING_2C_8C, "2 Coins/8 Credits" }, { INPUT_STRING_1C_4C, "1 Coin/4 Credits" }, -// { INPUT_STRING_2C_9C, "2 Coins/9 Credits" }, -// { INPUT_STRING_2C_10C, "2 Coins/10 Credits" }, { INPUT_STRING_1C_5C, "1 Coin/5 Credits" }, { INPUT_STRING_1C_6C, "1 Coin/6 Credits" }, { INPUT_STRING_1C_7C, "1 Coin/7 Credits" }, { INPUT_STRING_1C_8C, "1 Coin/8 Credits" }, { INPUT_STRING_1C_9C, "1 Coin/9 Credits" }, -// __input_string_coinage_end -// { INPUT_STRING_1C_10C, "1 Coin/10 Credits" }, -// { INPUT_STRING_1C_11C, "1 Coin/11 Credits" }, -// { INPUT_STRING_1C_12C, "1 Coin/12 Credits" }, -// { INPUT_STRING_1C_13C, "1 Coin/13 Credits" }, -// { INPUT_STRING_1C_14C, "1 Coin/14 Credits" }, -// { INPUT_STRING_1C_15C, "1 Coin/15 Credits" }, -// { INPUT_STRING_1C_20C, "1 Coin/20 Credits" }, -// { INPUT_STRING_1C_25C, "1 Coin/25 Credits" }, -// { INPUT_STRING_1C_30C, "1 Coin/30 Credits" }, -// { INPUT_STRING_1C_40C, "1 Coin/40 Credits" }, -// { INPUT_STRING_1C_50C, "1 Coin/50 Credits" }, -// { INPUT_STRING_1C_99C, "1 Coin/99 Credits" }, -// { INPUT_STRING_1C_100C, "1 Coin/100 Credits" }, -// { INPUT_STRING_1C_120C, "1 Coin/120 Credits" }, -// { INPUT_STRING_1C_125C, "1 Coin/125 Credits" }, -// { INPUT_STRING_1C_150C, "1 Coin/150 Credits" }, -// { INPUT_STRING_1C_200C, "1 Coin/200 Credits" }, -// { INPUT_STRING_1C_250C, "1 Coin/250 Credits" }, -// { INPUT_STRING_1C_500C, "1 Coin/500 Credits" }, -// { INPUT_STRING_1C_1000C, "1 Coin/1000 Credits" }, { INPUT_STRING_Free_Play, "Free Play" }, { INPUT_STRING_Cabinet, "Cabinet" }, { INPUT_STRING_Upright, "Upright" }, @@ -825,24 +736,14 @@ { INPUT_STRING_Continues, "Continues" }, { INPUT_STRING_Allow_Continue, "Allow Continue" }, { INPUT_STRING_Level_Select, "Level Select" }, -// { INPUT_STRING_Allow, "Allow" }, -// { INPUT_STRING_Forbid, "Forbid" }, -// { INPUT_STRING_Enable, "Enable" }, -// { INPUT_STRING_Disable, "Disable" }, { INPUT_STRING_Infinite, "Infinite" }, -// { INPUT_STRING_Invincibility, "Invincibility" }, -// { INPUT_STRING_Invulnerability, "Invulnerability" }, { INPUT_STRING_Stereo, "Stereo" }, { INPUT_STRING_Mono, "Mono" }, { INPUT_STRING_Unused, "Unused" }, { INPUT_STRING_Unknown, "Unknown" }, -// { INPUT_STRING_Undefined, "Undefined" }, { INPUT_STRING_Standard, "Standard" }, { INPUT_STRING_Reverse, "Reverse" }, { INPUT_STRING_Alternate, "Alternate" }, -// { INPUT_STRING_Reserve, "Reserve" }, -// { INPUT_STRING_Spare, "Spare" }, -// { INPUT_STRING_Invalid, "Invalid" }, { INPUT_STRING_None, "None" }, }; @@ -1002,7 +903,8 @@ init_port_types(machine); /* if we have a token list, proceed */ - for (device_t *device = machine.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) { astring errors; input_port_list_init(*device, machine.m_portlist, errors); @@ -1071,9 +973,9 @@ mask on the tagged port -------------------------------------------------*/ -const input_field_config *input_field_by_tag_and_mask(const ioport_list &portlist, const char *tag, input_port_value mask) +const input_field_config *input_field_by_tag_and_mask(running_machine &machine, const char *tag, input_port_value mask) { - const input_port_config *port = portlist.find(tag); + const input_port_config *port = machine.port(tag); /* if we got the port, look for the field */ if (port != NULL) @@ -1599,10 +1501,10 @@ a device input port specified by tag -------------------------------------------------*/ -input_port_value input_port_read(device_t *device, const char *tag) +input_port_value input_port_read(device_t &device, const char *tag) { - astring tempstring; - const input_port_config *port = device->machine().port(device->subtag(tempstring, tag)); + astring fullpath; + const input_port_config *port = device.machine().port(device.subtag(fullpath, tag)); if (port == NULL) fatalerror("Unable to locate input port '%s'", tag); return input_port_read_direct(port); @@ -1734,11 +1636,7 @@ /* apply reversal if needed */ if (analog->reverse) - { value = analog->reverse_val - value; - if (analog->wraps) - value--; - } else if (analog->single_scale) /* it's a pedal or the default value is equal to min/max */ /* so we need to adjust the center to the minimum */ @@ -1824,7 +1722,7 @@ if the given condition attached is true -------------------------------------------------*/ -int input_condition_true(running_machine &machine, const input_condition *condition,device_t &owner) +int input_condition_true(running_machine &machine, const input_condition *condition, device_t &owner) { input_port_value condvalue; @@ -2014,28 +1912,27 @@ a key based on natural keyboard characters -------------------------------------------------*/ -static astring *get_keyboard_key_name(const input_field_config *field) +static astring &get_keyboard_key_name(astring &name, const input_field_config *field) { - astring *result = astring_alloc(); int i; unicode_char ch; - + name.reset(); /* loop through each character on the field*/ for (i = 0; i < ARRAY_LENGTH(field->chars) && (field->chars[i] != '\0'); i++) { ch = get_keyboard_code(field, i); - astring_printf(result, "%s%-*s ", astring_c(result), MAX(SPACE_COUNT - 1, 0), inputx_key_name(ch)); + name.catprintf("%-*s ", MAX(SPACE_COUNT - 1, 0), inputx_key_name(ch)); } /* trim extra spaces */ - astring_trimspace(result); + name.trimspace(); /* special case */ - if (astring_len(result) == 0) - astring_cpyc(result, "Unnamed Key"); + if (name.len() == 0) + name.cpy("Unnamed Key"); - return result; + return name; } /*------------------------------------------------- @@ -2043,20 +1940,6 @@ states based on the tokens -------------------------------------------------*/ -inline const char *get_device_tag(const device_t &device, const char *tag, astring &finaltag) -{ - if (strcmp(tag, DEVICE_SELF) == 0) - finaltag.cpy(device.tag()); - else if (strcmp(tag, DEVICE_SELF_OWNER) == 0) - { - assert(device.owner() != NULL); - finaltag.cpy(device.owner()->tag()); - } - else - device.subtag(finaltag, tag); - return finaltag; -} - static void init_port_state(running_machine &machine) { const char *joystick_map_default = machine.options().joystick_map(); @@ -2116,7 +1999,7 @@ astring devicetag; if (!field->read.isnull()) { - *readdevicetail = init_field_device_info(field, get_device_tag(port->owner(), field->read_device, devicetag)); + *readdevicetail = init_field_device_info(field, port->owner().subtag(devicetag, field->read_device)); field->read.late_bind(*(*readdevicetail)->device); readdevicetail = &(*readdevicetail)->next; } @@ -2124,7 +2007,7 @@ /* if this entry has device output, allocate memory for the tracking structure */ if (!field->write.isnull()) { - *writedevicetail = init_field_device_info(field, get_device_tag(port->owner(), field->write_device, devicetag)); + *writedevicetail = init_field_device_info(field, port->owner().subtag(devicetag, field->write_device)); field->write.late_bind(*(*writedevicetail)->device); writedevicetail = &(*writedevicetail)->next; } @@ -2132,19 +2015,15 @@ /* if this entry has device output, allocate memory for the tracking structure */ if (!field->crossmapper.isnull()) { - device_t *device = machine.device(get_device_tag(port->owner(), field->crossmapper_device, devicetag)); + device_t *device = machine.device(port->owner().subtag(devicetag, field->crossmapper_device)); field->crossmapper.late_bind(*device); } /* Name keyboard key names */ if ((field->type == IPT_KEYBOARD || field->type == IPT_KEYPAD) && (field->name == NULL)) { - astring *name = get_keyboard_key_name(field); - if (name != NULL) - { - field->state->name = auto_strdup(machine, astring_c(name)); - astring_free(name); - } + astring name; + field->state->name = auto_strdup(machine, get_keyboard_key_name(name, field)); } } } @@ -2413,9 +2292,9 @@ /* positional controls reverse from their max range */ state->reverse_val = state->maximum + state->minimum; -// /* relative controls reverse from 1 past their max range */ -// if (state->positionalscale == 0) -// state->reverse_val += INPUT_RELATIVE_PER_PIXEL; + /* relative controls reverse from 1 past their max range */ + if (state->wraps) + state->reverse_val -= INPUT_RELATIVE_PER_PIXEL; } } @@ -2553,7 +2432,7 @@ input_port_value mask; float x, y; if (mouse_target->map_point_input(mouse_target_x, mouse_target_y, tag, mask, x, y)) - mouse_field = input_field_by_tag_and_mask(machine.m_portlist, tag, mask); + mouse_field = input_field_by_tag_and_mask(machine, tag, mask); } /* loop over all input ports */ @@ -2950,16 +2829,13 @@ UINT32 port_default_value(const char *fulltag, UINT32 mask, UINT32 defval, device_t &owner) { - astring tempstring; - const input_device_default *def = NULL; - def = owner.input_ports_defaults(); - if (def!=NULL) { - while (def->tag!=NULL) { - if ((strcmp(fulltag,owner.subtag(tempstring,def->tag))==0) && (def->mask == mask)) { + const input_device_default *def = owner.input_ports_defaults(); + if (def != NULL) + { + astring fullpath; + for ( ; def->tag != NULL; def++) + if (owner.subtag(fullpath, def->tag) == fulltag && def->mask == mask) return def->defvalue; - } - def++; - } } return defval; } @@ -3802,7 +3678,7 @@ /* verify the header against the current game */ if (memcmp(machine.system().name, header + 0x14, strlen(machine.system().name) + 1) != 0) - mame_printf_info("Input file is for " GAMENOUN " '%s', not for current " GAMENOUN " '%s'\n", header + 0x14, machine.system().name); + mame_printf_info("Input file is for %s '%s', not for current %s '%s'\n", emulator_info::get_gamenoun(), header + 0x14, emulator_info::get_gamenoun(), machine.system().name); /* enable compression */ portdata->playback_file->compress(FCOMPRESS_MEDIUM); @@ -3999,7 +3875,7 @@ header[0x10] = INP_HEADER_MAJVERSION; header[0x11] = INP_HEADER_MINVERSION; strcpy((char *)header + 0x14, machine.system().name); - sprintf((char *)header + 0x20, APPNAME " %s", build_version); + sprintf((char *)header + 0x20, "%s %s", emulator_info::get_appname(), build_version); /* write it */ portdata->record_file->write(header, sizeof(header)); @@ -4636,7 +4512,7 @@ key_len = strlen(codes[j].key); if (i + key_len + 2 <= text_len) { - if (!memcmp(codes[j].key, &text[i + 1], key_len) && (text[i + key_len + 1] == '}')) + if (!core_strnicmp(codes[j].key, &text[i + 1], key_len) && (text[i + key_len + 1] == '}')) { ch = codes[j].code; increment = key_len + 2; @@ -4938,6 +4814,7 @@ { astring fulltag; device.subtag(fulltag, tag); +mame_printf_verbose("ioport '%s' created\n", fulltag.cstr()); return &portlist.append(fulltag, *global_alloc(input_port_config(device, fulltag))); } diff -Nru mame-0.144/src/emu/ioport.h mame-0.145/src/emu/ioport.h --- mame-0.144/src/emu/ioport.h 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/ioport.h 2012-02-06 21:30:26.000000000 +0000 @@ -1253,7 +1253,7 @@ void input_port_list_init(device_t &device, ioport_list &portlist, astring &errorbuf); /* return the field that matches the given tag and mask */ -const input_field_config *input_field_by_tag_and_mask(const ioport_list &portlist, const char *tag, input_port_value mask); +const input_field_config *input_field_by_tag_and_mask(running_machine &machine, const char *tag, input_port_value mask); @@ -1333,7 +1333,7 @@ input_port_value input_port_read(running_machine &machine, const char *tag); /* return the value of a device input port specified by tag */ -input_port_value input_port_read(device_t *device, const char *tag); +input_port_value input_port_read(device_t &device, const char *tag); /* return the value of an input port specified by tag, or a default value if the port does not exist */ input_port_value input_port_read_safe(running_machine &machine, const char *tag, input_port_value defvalue); diff -Nru mame-0.144/src/emu/machine/6522via.c mame-0.145/src/emu/machine/6522via.c --- mame-0.144/src/emu/machine/6522via.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/6522via.c 2012-02-06 21:30:27.000000000 +0000 @@ -134,13 +134,13 @@ { UINT16 val; - if(m_t1_active) - { - val = time_to_cycles(m_t1->remaining()) - IFR_DELAY; - } - else - { - val = 0xffff - time_to_cycles(machine().time() - m_time1); + if(m_t1_active) + { + val = time_to_cycles(m_t1->remaining()) - IFR_DELAY; + } + else + { + val = 0xffff - time_to_cycles(machine().time() - m_time1); } return val; @@ -159,7 +159,7 @@ //------------------------------------------------- via6522_device::via6522_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, VIA6522, "6522 VIA", tag, owner, clock), + : device_t(mconfig, VIA6522, "6522 VIA", tag, owner, clock), m_irq(CLEAR_LINE) { @@ -182,17 +182,17 @@ // or initialize to defaults if none provided else { - memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); - memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); - memset(&m_in_ca1_cb, 0, sizeof(m_in_ca1_cb)); - memset(&m_in_cb1_cb, 0, sizeof(m_in_cb1_cb)); - memset(&m_in_ca2_cb, 0, sizeof(m_in_ca2_cb)); - memset(&m_in_cb2_cb, 0, sizeof(m_in_cb2_cb)); - memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); - memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); - memset(&m_out_ca2_cb, 0, sizeof(m_out_ca2_cb)); - memset(&m_out_cb2_cb, 0, sizeof(m_out_cb2_cb)); - memset(&m_irq_cb, 0, sizeof(m_irq_cb)); + memset(&m_in_a_cb, 0, sizeof(m_in_a_cb)); + memset(&m_in_b_cb, 0, sizeof(m_in_b_cb)); + memset(&m_in_ca1_cb, 0, sizeof(m_in_ca1_cb)); + memset(&m_in_cb1_cb, 0, sizeof(m_in_cb1_cb)); + memset(&m_in_ca2_cb, 0, sizeof(m_in_ca2_cb)); + memset(&m_in_cb2_cb, 0, sizeof(m_in_cb2_cb)); + memset(&m_out_a_cb, 0, sizeof(m_out_a_cb)); + memset(&m_out_b_cb, 0, sizeof(m_out_b_cb)); + memset(&m_out_ca2_cb, 0, sizeof(m_out_ca2_cb)); + memset(&m_out_cb2_cb, 0, sizeof(m_out_cb2_cb)); + memset(&m_irq_cb, 0, sizeof(m_irq_cb)); } } @@ -203,66 +203,66 @@ void via6522_device::device_start() { - m_in_a_func.resolve(m_in_a_cb, *this); - m_in_b_func.resolve(m_in_b_cb, *this); - m_in_ca1_func.resolve(m_in_ca1_cb, *this); - m_in_cb1_func.resolve(m_in_cb1_cb, *this); - m_in_ca2_func.resolve(m_in_ca2_cb, *this); - m_in_cb2_func.resolve(m_in_cb2_cb, *this); - m_out_a_func.resolve(m_out_a_cb, *this); - m_out_b_func.resolve(m_out_b_cb, *this); - m_out_ca1_func.resolve(m_out_ca1_cb, *this); - m_out_cb1_func.resolve(m_out_cb1_cb, *this); - m_out_ca2_func.resolve(m_out_ca2_cb, *this); - m_out_cb2_func.resolve(m_out_cb2_cb, *this); - m_irq_func.resolve(m_irq_cb, *this); - - m_t1ll = 0xf3; /* via at 0x9110 in vic20 show these values */ - m_t1lh = 0xb5; /* ports are not written by kernel! */ - m_t2ll = 0xff; /* taken from vice */ - m_t2lh = 0xff; - m_time2 = m_time1 = machine().time(); - m_t1 = timer_alloc(TIMER_T1); - m_t2 = timer_alloc(TIMER_T2); - m_ca2_timer = timer_alloc(TIMER_CA2); - m_shift_timer = timer_alloc(TIMER_SHIFT); + m_in_a_func.resolve(m_in_a_cb, *this); + m_in_b_func.resolve(m_in_b_cb, *this); + m_in_ca1_func.resolve(m_in_ca1_cb, *this); + m_in_cb1_func.resolve(m_in_cb1_cb, *this); + m_in_ca2_func.resolve(m_in_ca2_cb, *this); + m_in_cb2_func.resolve(m_in_cb2_cb, *this); + m_out_a_func.resolve(m_out_a_cb, *this); + m_out_b_func.resolve(m_out_b_cb, *this); + m_out_ca1_func.resolve(m_out_ca1_cb, *this); + m_out_cb1_func.resolve(m_out_cb1_cb, *this); + m_out_ca2_func.resolve(m_out_ca2_cb, *this); + m_out_cb2_func.resolve(m_out_cb2_cb, *this); + m_irq_func.resolve(m_irq_cb, *this); + + m_t1ll = 0xf3; /* via at 0x9110 in vic20 show these values */ + m_t1lh = 0xb5; /* ports are not written by kernel! */ + m_t2ll = 0xff; /* taken from vice */ + m_t2lh = 0xff; + m_time2 = m_time1 = machine().time(); + m_t1 = timer_alloc(TIMER_T1); + m_t2 = timer_alloc(TIMER_T2); + m_ca2_timer = timer_alloc(TIMER_CA2); + m_shift_timer = timer_alloc(TIMER_SHIFT); /* Default clock is from CPU1 */ if (clock() == 0) - { + { set_unscaled_clock(machine().firstcpu->clock()); - } + } /* save state register */ - save_item(NAME(m_in_a)); - save_item(NAME(m_in_ca1)); - save_item(NAME(m_in_ca2)); - save_item(NAME(m_out_a)); - save_item(NAME(m_out_ca2)); - save_item(NAME(m_ddr_a)); - save_item(NAME(m_in_b)); - save_item(NAME(m_in_cb1)); - save_item(NAME(m_in_cb2)); - save_item(NAME(m_out_b)); - save_item(NAME(m_out_cb2)); - save_item(NAME(m_ddr_b)); - save_item(NAME(m_t1cl)); - save_item(NAME(m_t1ch)); - save_item(NAME(m_t1ll)); - save_item(NAME(m_t1lh)); - save_item(NAME(m_t2cl)); - save_item(NAME(m_t2ch)); - save_item(NAME(m_t2ll)); - save_item(NAME(m_t2lh)); - save_item(NAME(m_sr)); - save_item(NAME(m_pcr)); - save_item(NAME(m_acr)); - save_item(NAME(m_ier)); - save_item(NAME(m_ifr)); + save_item(NAME(m_in_a)); + save_item(NAME(m_in_ca1)); + save_item(NAME(m_in_ca2)); + save_item(NAME(m_out_a)); + save_item(NAME(m_out_ca2)); + save_item(NAME(m_ddr_a)); + save_item(NAME(m_in_b)); + save_item(NAME(m_in_cb1)); + save_item(NAME(m_in_cb2)); + save_item(NAME(m_out_b)); + save_item(NAME(m_out_cb2)); + save_item(NAME(m_ddr_b)); + save_item(NAME(m_t1cl)); + save_item(NAME(m_t1ch)); + save_item(NAME(m_t1ll)); + save_item(NAME(m_t1lh)); + save_item(NAME(m_t2cl)); + save_item(NAME(m_t2ch)); + save_item(NAME(m_t2ll)); + save_item(NAME(m_t2lh)); + save_item(NAME(m_sr)); + save_item(NAME(m_pcr)); + save_item(NAME(m_acr)); + save_item(NAME(m_ier)); + save_item(NAME(m_ifr)); save_item(NAME(m_irq)); - save_item(NAME(m_t1_active)); - save_item(NAME(m_t2_active)); - save_item(NAME(m_shift_counter)); + save_item(NAME(m_t1_active)); + save_item(NAME(m_t2_active)); + save_item(NAME(m_shift_counter)); } @@ -272,32 +272,32 @@ void via6522_device::device_reset() { - m_in_a = 0; - m_in_ca1 = 0; - m_in_ca2 = 0; - m_out_a = 0; - m_out_ca2 = 0; - m_ddr_a = 0; - m_in_b = 0; - m_in_cb1 = 0; - m_in_cb2 = 0; - m_out_b = 0; - m_out_cb2 = 0; - m_ddr_b = 0; - - m_t1cl = 0; - m_t1ch = 0; - m_t2cl = 0; - m_t2ch = 0; - - m_sr = 0; - m_pcr = 0; - m_acr = 0; - m_ier = 0; - m_ifr = 0; - m_t1_active = 0; - m_t2_active = 0; - m_shift_counter = 0; + m_in_a = 0; + m_in_ca1 = 0; + m_in_ca2 = 0; + m_out_a = 0; + m_out_ca2 = 0; + m_ddr_a = 0; + m_in_b = 0; + m_in_cb1 = 0; + m_in_cb2 = 0; + m_out_b = 0; + m_out_cb2 = 0; + m_ddr_b = 0; + + m_t1cl = 0; + m_t1ch = 0; + m_t2cl = 0; + m_t2ch = 0; + + m_sr = 0; + m_pcr = 0; + m_acr = 0; + m_ier = 0; + m_ifr = 0; + m_t1_active = 0; + m_t2_active = 0; + m_shift_counter = 0; } @@ -309,15 +309,15 @@ { m_ifr |= data; if (TRACE_VIA) - { + { logerror("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr); - } + } if (m_ier & m_ifr) - { + { m_ifr |= INT_ANY; set_irq_line(ASSERT_LINE); - } + } } @@ -330,14 +330,14 @@ m_ifr = (m_ifr & ~data) & 0x7f; if (TRACE_VIA) - { + { logerror("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr); - } + } if (m_ifr & m_ier) - { + { m_ifr |= INT_ANY; - } + } else { set_irq_line(CLEAR_LINE); @@ -367,52 +367,86 @@ m_shift_counter = (m_shift_counter + 1) % 8; if (m_shift_counter) - { + { if (SO_O2_CONTROL(m_acr)) { m_shift_timer->adjust(cycles_to_time(2)); } else { m_shift_timer->adjust(cycles_to_time((m_t2ll + 2)*2)); } - } + } else { if (!(m_ifr & INT_SR)) - { + { set_int(INT_SR); - } + } } } + if (SO_EXT_CONTROL(m_acr)) { - m_out_cb2 = (m_sr >> 7) & 1; - m_sr = (m_sr << 1) | m_out_cb2; + m_out_cb2 = (m_sr >> 7) & 1; + m_sr = (m_sr << 1) | m_out_cb2; - m_out_cb2_func(m_out_cb2); + m_out_cb2_func(m_out_cb2); - m_shift_counter = (m_shift_counter + 1) % 8; + m_shift_counter = (m_shift_counter + 1) % 8; - if (m_shift_counter == 0) + if (m_shift_counter == 0) { - if (!(m_ifr & INT_SR)) - { + if (!(m_ifr & INT_SR)) + { set_int(INT_SR); - } + } } } - if (SI_EXT_CONTROL(m_acr)) + + if (SI_O2_CONTROL(m_acr) || SI_T2_CONTROL(m_acr)) { - if (!m_in_cb2_func.isnull()) - { - m_in_cb2 = m_in_cb2_func(); - } + /* this should be one cycle wide */ + m_out_cb1_func(0); + m_out_cb1_func(1); - m_sr = (m_sr << 1) | (m_in_cb2 & 1); + if (!m_in_cb2_func.isnull()) + { + m_in_cb2 = m_in_cb2_func(); + } - m_shift_counter = (m_shift_counter + 1) % 8; + m_sr = (m_sr << 1) | (m_in_cb2 & 1); + + m_shift_counter = (m_shift_counter + 1) % 8; - if (m_shift_counter == 0) + if (m_shift_counter) { - if (!(m_ifr & INT_SR)) + if (SI_O2_CONTROL(m_acr)) { + m_shift_timer->adjust(cycles_to_time(2)); + } else { + m_shift_timer->adjust(cycles_to_time((m_t2ll + 2)*2)); + } + } + else + { + if (!(m_ifr & INT_SR)) + { + set_int(INT_SR); + } + } + } + + if (SI_EXT_CONTROL(m_acr)) + { + if (!m_in_cb2_func.isnull()) + { + m_in_cb2 = m_in_cb2_func(); + } + + m_sr = (m_sr << 1) | (m_in_cb2 & 1); + + m_shift_counter = (m_shift_counter + 1) % 8; + + if (m_shift_counter == 0) + { + if (!(m_ifr & INT_SR)) { set_int(INT_SR); } @@ -432,45 +466,45 @@ // t1 timeout case TIMER_T1: - if (T1_CONTINUOUS (m_acr)) - { - if (T1_SET_PB7(m_acr)) - { - m_out_b ^= 0x80; - } - m_t1->adjust(cycles_to_time(TIMER1_VALUE + IFR_DELAY)); - } + if (T1_CONTINUOUS (m_acr)) + { + if (T1_SET_PB7(m_acr)) + { + m_out_b ^= 0x80; + } + m_t1->adjust(cycles_to_time(TIMER1_VALUE + IFR_DELAY)); + } else - { - if (T1_SET_PB7(m_acr)) - { - m_out_b |= 0x80; - } - m_t1_active = 0; - m_time1 = machine().time(); - } - if (m_ddr_b) { - UINT8 write_data = (m_out_b & m_ddr_b) | (m_ddr_b ^ 0xff); - m_out_b_func(0, write_data); + if (T1_SET_PB7(m_acr)) + { + m_out_b |= 0x80; + } + m_t1_active = 0; + m_time1 = machine().time(); + } + if (m_ddr_b) + { + UINT8 write_data = (m_out_b & m_ddr_b) | (m_ddr_b ^ 0xff); + m_out_b_func(0, write_data); } - if (!(m_ifr & INT_T1)) - { + if (!(m_ifr & INT_T1)) + { set_int(INT_T1); - } - break; + } + break; // t2 timeout case TIMER_T2: - m_t2_active = 0; - m_time2 = machine().time(); + m_t2_active = 0; + m_time2 = machine().time(); - if (!(m_ifr & INT_T2)) - { + if (!(m_ifr & INT_T2)) + { set_int(INT_T2); - } - break; + } + break; case TIMER_CA2: m_out_ca2_func(1); @@ -490,21 +524,21 @@ offset &= 0xf; switch (offset) - { - case VIA_PB: + { + case VIA_PB: /* update the input */ - if (PB_LATCH_ENABLE(m_acr) == 0) + if (PB_LATCH_ENABLE(m_acr) == 0) { if (m_ddr_b != 0xff) { if (!m_in_b_func.isnull()) - { + { m_in_b = m_in_b_func(0); - } + } else - { + { logerror("%s:6522VIA chip %s: Port B is being read but has no handler\n", machine().describe_context(), tag()); - } + } } } @@ -512,29 +546,29 @@ /* combine input and output values, hold DDRB bit 7 high if T1_SET_PB7 */ if (T1_SET_PB7(m_acr)) - { + { val = (m_out_b & (m_ddr_b | 0x80)) | (m_in_b & ~(m_ddr_b | 0x80)); - } + } else - { + { val = (m_out_b & m_ddr_b) + (m_in_b & ~m_ddr_b); - } + } break; - case VIA_PA: + case VIA_PA: /* update the input */ if (PA_LATCH_ENABLE(m_acr) == 0) { if (m_ddr_a != 0xff) { if (!m_in_a_func.isnull()) - { + { m_in_a = m_in_a_func(0); - } + } else - { + { logerror("%s:6522VIA chip %s: Port A is being read but has no handler\n", machine().describe_context(), tag()); - } + } } } @@ -569,116 +603,116 @@ break; - case VIA_PANH: + case VIA_PANH: /* update the input */ if (PA_LATCH_ENABLE(m_acr) == 0) { if (!m_in_a_func.isnull()) - { + { m_in_a = m_in_a_func(0); - } + } else - { + { logerror("%s:6522VIA chip %s: Port A is being read but has no handler\n", machine().describe_context(), tag()); - } + } } /* combine input and output values */ val = (m_out_a & m_ddr_a) + (m_in_a & ~m_ddr_a); break; - case VIA_DDRB: + case VIA_DDRB: val = m_ddr_b; break; - case VIA_DDRA: + case VIA_DDRA: val = m_ddr_a; break; - case VIA_T1CL: + case VIA_T1CL: clear_int(INT_T1); val = get_counter1_value() & 0xFF; break; - case VIA_T1CH: + case VIA_T1CH: val = get_counter1_value() >> 8; break; - case VIA_T1LL: + case VIA_T1LL: val = m_t1ll; break; - case VIA_T1LH: + case VIA_T1LH: val = m_t1lh; break; - case VIA_T2CL: + case VIA_T2CL: clear_int(INT_T2); if (m_t2_active) - { + { val = time_to_cycles(m_t2->remaining()) & 0xff; - } + } else { if (T2_COUNT_PB6(m_acr)) - { + { val = m_t2cl; - } + } else - { + { val = (0x10000 - (time_to_cycles(machine().time() - m_time2) & 0xffff) - 1) & 0xff; - } + } } break; - case VIA_T2CH: + case VIA_T2CH: if (m_t2_active) - { + { val = time_to_cycles(m_t2->remaining()) >> 8; - } + } else { if (T2_COUNT_PB6(m_acr)) - { + { val = m_t2ch; - } + } else - { + { val = (0x10000 - (time_to_cycles(machine().time() - m_time2) & 0xffff) - 1) >> 8; - } + } } break; - case VIA_SR: + case VIA_SR: val = m_sr; m_shift_counter=0; clear_int(INT_SR); - if (SO_O2_CONTROL(m_acr)) + if (SI_O2_CONTROL(m_acr)) { m_shift_timer->adjust(cycles_to_time(2)); } - if (SO_T2_CONTROL(m_acr)) + if (SI_T2_CONTROL(m_acr)) { m_shift_timer->adjust(cycles_to_time((m_t2ll + 2)*2)); } break; - case VIA_PCR: + case VIA_PCR: val = m_pcr; break; - case VIA_ACR: + case VIA_ACR: val = m_acr; break; - case VIA_IER: + case VIA_IER: val = m_ier | 0x80; break; - case VIA_IFR: + case VIA_IFR: val = m_ifr; break; - } + } return val; } @@ -692,8 +726,8 @@ offset &=0x0f; switch (offset) - { - case VIA_PB: + { + case VIA_PB: if (T1_SET_PB7(m_acr)) m_out_b = (m_out_b & 0x80) | (data & 0x7f); else @@ -722,7 +756,7 @@ } break; - case VIA_PA: + case VIA_PA: m_out_a = data; if (m_ddr_a) @@ -757,7 +791,7 @@ break; - case VIA_PANH: + case VIA_PANH: m_out_a = data; if (m_ddr_a) @@ -768,10 +802,10 @@ break; - case VIA_DDRB: - /* EHC 03/04/2000 - If data direction changed, present output on the lines */ - if ( data != m_ddr_b ) - { + case VIA_DDRB: + /* EHC 03/04/2000 - If data direction changed, present output on the lines */ + if ( data != m_ddr_b ) + { m_ddr_b = data; //if (m_ddr_b) @@ -782,10 +816,10 @@ } break; - case VIA_DDRA: - /* EHC 03/04/2000 - If data direction changed, present output on the lines */ - if ( data != m_ddr_a ) - { + case VIA_DDRA: + /* EHC 03/04/2000 - If data direction changed, present output on the lines */ + if ( data != m_ddr_a ) + { m_ddr_a = data; //if (m_ddr_a) @@ -796,17 +830,17 @@ } break; - case VIA_T1CL: - case VIA_T1LL: + case VIA_T1CL: + case VIA_T1LL: m_t1ll = data; break; case VIA_T1LH: - m_t1lh = data; - clear_int(INT_T1); - break; + m_t1lh = data; + clear_int(INT_T1); + break; - case VIA_T1CH: + case VIA_T1CH: m_t1ch = m_t1lh = data; m_t1cl = m_t1ll; @@ -826,11 +860,11 @@ m_t1_active = 1; break; - case VIA_T2CL: + case VIA_T2CL: m_t2ll = data; break; - case VIA_T2CH: + case VIA_T2CH: m_t2ch = m_t2lh = data; m_t2cl = m_t2ll; @@ -849,7 +883,7 @@ } break; - case VIA_SR: + case VIA_SR: m_sr = data; m_shift_counter=0; clear_int(INT_SR); @@ -863,13 +897,13 @@ } break; - case VIA_PCR: + case VIA_PCR: m_pcr = data; if (TRACE_VIA) - { + { logerror("%s:6522VIA chip %s: PCR = %02X\n", machine().describe_context(), tag(), data); - } + } if (CA2_FIX_OUTPUT(data) && CA2_OUTPUT_LEVEL(data) ^ m_out_ca2) { @@ -884,20 +918,20 @@ } break; - case VIA_ACR: + case VIA_ACR: { UINT16 counter1 = get_counter1_value(); m_acr = data; if (T1_SET_PB7(m_acr)) { if (m_t1_active) - { + { m_out_b &= ~0x80; - } + } else - { + { m_out_b |= 0x80; - } + } //if (m_ddr_b) { @@ -915,13 +949,13 @@ case VIA_IER: if (data & 0x80) - { + { m_ier |= data & 0x7f; - } + } else - { + { m_ier &= ~(data & 0x7f); - } + } if (m_ifr & INT_ANY) { @@ -943,12 +977,12 @@ case VIA_IFR: if (data & INT_ANY) - { + { data = 0x7f; - } + } clear_int(data); break; - } + } } @@ -960,7 +994,7 @@ { /* handle the active transition */ if (state != m_in_ca1) - { + { if (TRACE_VIA) logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), state); @@ -969,13 +1003,13 @@ if (PA_LATCH_ENABLE(m_acr)) { if (!m_in_a_func.isnull()) - { + { m_in_a = m_in_a_func(0); - } + } else - { - logerror("%s:6522VIA chip %s: Port A is being read but has no handler\n", machine().describe_context(), tag()); - } + { + logerror("%s:6522VIA chip %s: Port A is being read but has no handler\n", machine().describe_context(), tag()); + } } set_int(INT_CA1); @@ -996,7 +1030,7 @@ } m_in_ca1 = state; - } + } } @@ -1008,7 +1042,7 @@ { /* CA2 is in input mode */ if (CA2_INPUT(m_pcr)) - { + { /* the new state has caused a transition */ if (m_in_ca2 != state) { @@ -1021,7 +1055,7 @@ /* set the new value for CA2 */ m_in_ca2 = state; } - } + } } @@ -1033,24 +1067,24 @@ { /* handle the active transition */ if (state != m_in_cb1) - { + { if ((CB1_LOW_TO_HIGH(m_pcr) && state) || (CB1_HIGH_TO_LOW(m_pcr) && !state)) { if (PB_LATCH_ENABLE(m_acr)) { if (!m_in_b_func.isnull()) - { + { m_in_b = m_in_b_func(0); - } + } else - { - logerror("%s:6522VIA chip %s: Port B is being read but has no handler\n", machine().describe_context(), tag()); - } + { + logerror("%s:6522VIA chip %s: Port B is being read but has no handler\n", machine().describe_context(), tag()); + } } if (SO_EXT_CONTROL(m_acr) || SI_EXT_CONTROL(m_acr)) - { + { shift(); - } + } set_int(INT_CB1); @@ -1069,7 +1103,7 @@ } } m_in_cb1 = state; - } + } } @@ -1081,7 +1115,7 @@ { /* CB2 is in input mode */ if (CB2_INPUT(m_pcr)) - { + { /* the new state has caused a transition */ if (m_in_cb2 != state) { @@ -1094,5 +1128,5 @@ /* set the new value for CB2 */ m_in_cb2 = state; } - } + } } diff -Nru mame-0.144/src/emu/machine/6532riot.c mame-0.145/src/emu/machine/6532riot.c --- mame-0.144/src/emu/machine/6532riot.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/6532riot.c 2012-02-06 21:30:28.000000000 +0000 @@ -301,12 +301,15 @@ else { /* call the input callback if it exists */ - port->m_in = port->m_in_func(0); - - /* changes to port A need to update the PA7 state */ - if (port == &m_port[0]) + if (!port->m_in_func.isnull()) { - update_pa7_state(); + port->m_in = port->m_in_func(0); + + /* changes to port A need to update the PA7 state */ + if (port == &m_port[0]) + { + update_pa7_state(); + } } /* apply the DDR to the result */ @@ -466,7 +469,8 @@ assert(this != NULL); /* set static values */ - m_index = machine().devicelist().indexof(RIOT6532, tag()); + device_type_iterator<&device_creator, riot6532_device> iter(machine().root_device()); + m_index = iter.indexof(*this); /* configure the ports */ m_port[0].m_in_func.resolve(m_in_a_cb, *this); diff -Nru mame-0.144/src/emu/machine/6821pia.c mame-0.145/src/emu/machine/6821pia.c --- mame-0.144/src/emu/machine/6821pia.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/6821pia.c 2012-02-06 21:30:28.000000000 +0000 @@ -581,11 +581,6 @@ // read //------------------------------------------------- -READ8_MEMBER( pia6821_device::read ) -{ - return reg_r(offset); -} - UINT8 pia6821_device::reg_r(UINT8 offset) { UINT8 ret; @@ -628,16 +623,6 @@ } -//------------------------------------------------- -// pia6821_alt_r -//------------------------------------------------- - -READ8_MEMBER( pia6821_device::read_alt ) -{ - return reg_r(((offset << 1) & 0x02) | ((offset >> 1) & 0x01)); -} - - //------------------------------------------------- // send_to_out_a_func @@ -866,11 +851,6 @@ // write //------------------------------------------------- -WRITE8_MEMBER( pia6821_device::write ) -{ - reg_w(offset, data); -} - void pia6821_device::reg_w(UINT8 offset, UINT8 data) { switch (offset & 0x03) @@ -910,16 +890,6 @@ //------------------------------------------------- -// write_alt -//------------------------------------------------- - -WRITE8_MEMBER( pia6821_device::write_alt ) -{ - reg_w(((offset << 1) & 0x02) | ((offset >> 1) & 0x01), data); -} - - -//------------------------------------------------- // porta_r //------------------------------------------------- diff -Nru mame-0.144/src/emu/machine/6821pia.h mame-0.145/src/emu/machine/6821pia.h --- mame-0.144/src/emu/machine/6821pia.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/6821pia.h 2012-02-06 21:30:28.000000000 +0000 @@ -85,10 +85,10 @@ // static configuration helpers static void static_set_interface(device_t &device, const pia6821_interface &interface); - DECLARE_READ8_MEMBER( read ); - DECLARE_WRITE8_MEMBER( write ); - DECLARE_READ8_MEMBER( read_alt ); - DECLARE_WRITE8_MEMBER( write_alt ); + DECLARE_READ8_MEMBER( read ) { return reg_r(offset); } + DECLARE_WRITE8_MEMBER( write ) { reg_w(offset, data); } + DECLARE_READ8_MEMBER( read_alt ) { return reg_r(((offset << 1) & 0x02) | ((offset >> 1) & 0x01)); } + DECLARE_WRITE8_MEMBER( write_alt ) { reg_w(((offset << 1) & 0x02) | ((offset >> 1) & 0x01), data); } UINT8 port_b_z_mask() const { return ~m_ddr_b; } // see first note in .c void set_port_a_z_mask(UINT8 data) { m_port_a_z_mask = data; }// see second note in .c diff -Nru mame-0.144/src/emu/machine/7474.c mame-0.145/src/emu/machine/7474.c --- mame-0.144/src/emu/machine/7474.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/7474.c 2012-02-06 21:30:28.000000000 +0000 @@ -86,7 +86,7 @@ if (callback != NULL) { ttl7474.m_output_cb.type = DEVCB_TYPE_DEVICE; - ttl7474.m_output_cb.index = DEVCB_DEVICE_OTHER; + ttl7474.m_output_cb.index = 0; ttl7474.m_output_cb.writeline = callback; } else @@ -105,7 +105,7 @@ if (callback != NULL) { ttl7474.m_comp_output_cb.type = DEVCB_TYPE_DEVICE; - ttl7474.m_comp_output_cb.index = DEVCB_DEVICE_OTHER; + ttl7474.m_comp_output_cb.index = 0; ttl7474.m_comp_output_cb.writeline = callback; } else diff -Nru mame-0.144/src/emu/machine/8042kbdc.c mame-0.145/src/emu/machine/8042kbdc.c --- mame-0.144/src/emu/machine/8042kbdc.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/8042kbdc.c 2012-02-06 21:30:28.000000000 +0000 @@ -206,6 +206,7 @@ kbdc8042_type_t type; void (*set_gate_a20)(running_machine &machine, int a20); void (*keyboard_interrupt)(running_machine &machine, int state); + void (*set_spkr)(running_machine &machine, int speaker); int (*get_out2)(running_machine &machine); UINT8 inport, outport, data, command; @@ -264,6 +265,12 @@ at_8042_check_keyboard(machine); } +static TIMER_CALLBACK( kbdc8042_clr_int ) +{ + /* Lets 8952's timers do their job before clear the interrupt line, */ + /* else Keyboard interrupt never happens. */ + kbdc8042.keyboard_interrupt(machine, 0); +} void kbdc8042_init(running_machine &machine, const struct kbdc8042_interface *intf) @@ -274,6 +281,7 @@ kbdc8042.set_gate_a20 = intf->set_gate_a20; kbdc8042.keyboard_interrupt = intf->keyboard_interrupt; kbdc8042.get_out2 = intf->get_out2; + kbdc8042.set_spkr = intf->set_spkr; /* ibmat bios wants 0x20 set! (keyboard locked when not set) 0x80 */ kbdc8042.inport = 0xa0; @@ -293,7 +301,9 @@ if (kbdc8042.keyboard_interrupt) { kbdc8042.keyboard_interrupt(machine, 1); - kbdc8042.keyboard_interrupt(machine, 0); + /* Lets 8952's timers do their job before clear the interrupt line, */ + /* else Keyboard interrupt never happens. */ + machine.scheduler().timer_set( attotime::from_usec(2), FUNC(kbdc8042_clr_int),0,0 ); } } @@ -485,6 +495,9 @@ case 1: kbdc8042.speaker = data; + if (kbdc8042.set_spkr) + kbdc8042.set_spkr(space->machine(), kbdc8042.speaker); + break; case 4: diff -Nru mame-0.144/src/emu/machine/8042kbdc.h mame-0.145/src/emu/machine/8042kbdc.h --- mame-0.144/src/emu/machine/8042kbdc.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/8042kbdc.h 2012-02-06 21:30:28.000000000 +0000 @@ -23,7 +23,11 @@ kbdc8042_type_t type; void (*set_gate_a20)(running_machine &machine, int a20); void (*keyboard_interrupt)(running_machine &machine, int state); + void (*set_spkr)(running_machine &machine, int speaker); int (*get_out2)(running_machine &machine); + + + }; diff -Nru mame-0.144/src/emu/machine/am8530h.c mame-0.145/src/emu/machine/am8530h.c --- mame-0.144/src/emu/machine/am8530h.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/am8530h.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -#include "am8530h.h" - -const device_type AM8530H = &device_creator; - -am8530h_device::am8530h_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, AM8530H, "AM8530H", tag, owner, clock) -{ -} - -void am8530h_device::set_int_change_cb(int_cb_t _int_change_cb) -{ - int_change_cb = _int_change_cb; -} - - -void am8530h_device::device_start() -{ -} - -READ8_MEMBER( am8530h_device::ca_r ) -{ - return 0xff; -} - -READ8_MEMBER( am8530h_device::cb_r ) -{ - return 0xff; -} - -READ8_MEMBER( am8530h_device::da_r ) -{ - return 0x40; -} - -READ8_MEMBER( am8530h_device::db_r ) -{ - return 0x40; -} - -WRITE8_MEMBER( am8530h_device::ca_w ) -{ - fprintf(stderr, "ca_w %x, %02x\n", offset, data); -} - -WRITE8_MEMBER( am8530h_device::cb_w ) -{ - fprintf(stderr, "cb_w %x, %02x\n", offset, data); -} - -WRITE8_MEMBER( am8530h_device::da_w ) -{ - fprintf(stderr, "da_w %x, %02x\n", offset, data); -} - -WRITE8_MEMBER( am8530h_device::db_w ) -{ - fprintf(stderr, "db_w %x, %02x\n", offset, data); -} diff -Nru mame-0.144/src/emu/machine/am8530h.h mame-0.145/src/emu/machine/am8530h.h --- mame-0.144/src/emu/machine/am8530h.h 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/am8530h.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -#ifndef __AM8530H_H__ -#define __AM8530H_H__ - -#include "emu.h" - -#define MCFG_AM8530H_ADD(_tag, _int_change_cb) \ - MCFG_DEVICE_ADD(_tag, AM8530H, 0) \ - downcast(device)->set_int_change_cb(_int_change_cb); - -class am8530h_device : public device_t { -public: - typedef delegate int_cb_t; - - am8530h_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void set_int_change_cb(int_cb_t int_change_cb); - - DECLARE_READ8_MEMBER(ca_r); - DECLARE_READ8_MEMBER(cb_r); - DECLARE_READ8_MEMBER(da_r); - DECLARE_READ8_MEMBER(db_r); - - DECLARE_WRITE8_MEMBER(ca_w); - DECLARE_WRITE8_MEMBER(cb_w); - DECLARE_WRITE8_MEMBER(da_w); - DECLARE_WRITE8_MEMBER(db_w); - - void data_a_w(UINT8 val); - void data_b_w(UINT8 val); - - void int_ack(); - bool int_level_get(); - -protected: - virtual void device_start(); - -private: - int_cb_t int_change_cb; -}; - -extern const device_type AM8530H; - -#endif diff -Nru mame-0.144/src/emu/machine/amigafdc.c mame-0.145/src/emu/machine/amigafdc.c --- mame-0.144/src/emu/machine/amigafdc.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/amigafdc.c 2012-02-06 21:30:28.000000000 +0000 @@ -1,3 +1,36 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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. + +****************************************************************************/ + /****************************************************f*********************** Amiga floppy disk controller emulation @@ -11,13 +44,14 @@ #include "formats/hxcmfm_dsk.h" #include "formats/ipf_dsk.h" #include "formats/mfi_dsk.h" +#include "formats/dfi_dsk.h" #include "amigafdc.h" #include "machine/6526cia.h" const device_type AMIGA_FDC = &device_creator; const floppy_format_type amiga_fdc::floppy_formats[] = { - FLOPPY_ADF_FORMAT, FLOPPY_MFM_FORMAT, FLOPPY_IPF_FORMAT, FLOPPY_MFI_FORMAT, + FLOPPY_ADF_FORMAT, FLOPPY_MFM_FORMAT, FLOPPY_IPF_FORMAT, FLOPPY_MFI_FORMAT, FLOPPY_DFI_FORMAT, NULL }; @@ -60,6 +94,26 @@ live_abort(); } +void amiga_fdc::dma_done() +{ + dma_state = DMA_IDLE; + address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); + amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKBLK, 0xffff); +} + +void amiga_fdc::dma_write(UINT16 value) +{ + amiga_state *state = machine().driver_data(); + (*state->m_chip_ram_w)(state, dskpt, value); + + dskpt += 2; + dsklen--; + if(dsklen & 0x3fff) + dma_state = DMA_RUNNING_BYTE_0; + else + dma_done(); +} + void amiga_fdc::live_start() { cur_live.tm = machine().time(); @@ -147,7 +201,7 @@ live_delay(RUNNING_SYNCPOINT); return; } - if(dskbyt & 0x0400) { + if(dskbyt & 0x1000) { if(cur_live.shift_reg != dsksync) { live_delay(RUNNING_SYNCPOINT); return; @@ -165,16 +219,25 @@ if(cur_live.shift_reg == dsksync) { if(adkcon & 0x0400) { if(dma_state == DMA_WAIT_START) { - dma_state = DMA_RUNNING_BYTE_0; cur_live.bit_counter = 0; + + if(!(dsklen & 0x3fff)) + dma_done(); + else + dma_write(dsksync); + + } else if(dma_state != DMA_IDLE) { + dma_write(dsksync); + cur_live.bit_counter = 0; + } else if(cur_live.bit_counter != 8) cur_live.bit_counter = 0; } - dskbyt |= 0x0400; + dskbyt |= 0x1000; address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKSYN, 0xffff); } else - dskbyt &= ~0x0400; + dskbyt &= ~0x1000; if(cur_live.bit_counter == 8) { dskbyt = (dskbyt & 0xff00) | 0x8000 | (cur_live.shift_reg & 0xff); @@ -192,19 +255,7 @@ case DMA_RUNNING_BYTE_1: { dma_value |= cur_live.shift_reg & 0xff; - - amiga_state *state = machine().driver_data(); - (*state->m_chip_ram_w)(state, dskpt, dma_value); - - dskpt += 2; - dsklen--; - if(dsklen & 0x3fff) - dma_state = DMA_RUNNING_BYTE_0; - else { - dma_state = DMA_IDLE; - address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); - amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKBLK, 0xffff); - } + dma_write(dma_value); break; } } @@ -225,9 +276,12 @@ void amiga_fdc::dma_check() { - if(dma_enabled() && (dsklen & 0x3fff)) { - if(dma_state == IDLE) + if(dma_enabled()) { + if(dma_state == IDLE) { dma_state = adkcon & 0x0400 ? DMA_WAIT_START : DMA_RUNNING_BYTE_0; + if(dma_state == DMA_RUNNING_BYTE_0 && !(dsklen & 0x3fff)) + dma_done(); + } } else dma_state = IDLE; } @@ -300,7 +354,9 @@ UINT16 amiga_fdc::dskbytr_r() { - return dskbyt; + UINT16 res = dskbyt; + dskbyt &= 0x7fff; + return res; } void amiga_fdc::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) diff -Nru mame-0.144/src/emu/machine/amigafdc.h mame-0.145/src/emu/machine/amigafdc.h --- mame-0.144/src/emu/machine/amigafdc.h 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/amigafdc.h 2012-02-06 21:30:28.000000000 +0000 @@ -88,6 +88,8 @@ void index_callback(floppy_image_device *floppy, int state); bool dma_enabled(); void dma_check(); + void dma_done(); + void dma_write(UINT16 value); void live_start(); void checkpoint(); diff -Nru mame-0.144/src/emu/machine/at28c16.c mame-0.145/src/emu/machine/at28c16.c --- mame-0.144/src/emu/machine/at28c16.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/at28c16.c 2012-02-06 21:30:28.000000000 +0000 @@ -65,9 +65,8 @@ // on this device //------------------------------------------------- -bool at28c16_device::device_validity_check( emu_options &options, const game_driver &driver ) const +void at28c16_device::device_validity_check(validity_checker &valid) const { - return false; } diff -Nru mame-0.144/src/emu/machine/at28c16.h mame-0.145/src/emu/machine/at28c16.h --- mame-0.144/src/emu/machine/at28c16.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/machine/at28c16.h 2012-02-06 21:30:28.000000000 +0000 @@ -52,7 +52,7 @@ protected: // device-level overrides virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/emu/machine/ctronics.c mame-0.145/src/emu/machine/ctronics.c --- mame-0.144/src/emu/machine/ctronics.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/ctronics.c 2012-02-06 21:30:28.000000000 +0000 @@ -6,54 +6,69 @@ #include "emu.h" #include "ctronics.h" -#include "imagedev/printer.h" +//************************************************************************** +// CENTRONICS SLOT DEVICE +//************************************************************************** -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static WRITE_LINE_DEVICE_HANDLER( centronics_printer_online ); -static TIMER_CALLBACK( ack_callback ); -static TIMER_CALLBACK( busy_callback ); +// device type definition +const device_type CENTRONICS = &device_creator; +//------------------------------------------------- +// centronics_device - constructor +//------------------------------------------------- -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef struct _centronics_state centronics_state; -struct _centronics_state +centronics_device::centronics_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CENTRONICS, "Centronics", tag, owner, clock), + device_slot_interface(mconfig, *this), + m_dev(NULL) { - printer_image_device *printer; - devcb_resolved_write_line out_ack_func; - devcb_resolved_write_line out_busy_func; - devcb_resolved_write_line out_not_busy_func; - - int strobe; - int busy; - int ack; - int auto_fd; - int pe; - int fault; +} - UINT8 data; -}; +//------------------------------------------------- +// centronics_device - destructor +//------------------------------------------------- +centronics_device::~centronics_device() +{ +} -/***************************************************************************** - INLINE FUNCTIONS -*****************************************************************************/ +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- -INLINE centronics_state *get_safe_token(device_t *device) +void centronics_device::device_config_complete() { - assert(device != NULL); - assert(device->type() == CENTRONICS); + // inherit a copy of the static data + const centronics_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; - return (centronics_state *)downcast(device)->token(); + // or initialize to defaults if none provided + else + { + memset(&m_out_ack_func, 0, sizeof(m_out_ack_func)); + memset(&m_out_busy_func, 0, sizeof(m_out_busy_func)); + memset(&m_out_not_busy_func, 0, sizeof(m_out_not_busy_func)); + } + + m_dev = dynamic_cast(get_card_device()); } +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void centronics_device::device_start() +{ + /* resolve callbacks */ + m_out_ack_func.resolve(m_out_ack_cb, *this); + m_out_busy_func.resolve(m_out_busy_cb, *this); + m_out_not_busy_func.resolve(m_out_not_busy_cb, *this); +} /***************************************************************************** GLOBAL VARIABLES @@ -61,220 +76,179 @@ const centronics_interface standard_centronics = { - FALSE, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }; +//************************************************************************** +// DEVICE CENTRONICS PERIPHERAL INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_centronics_peripheral_interface - constructor +//------------------------------------------------- + +device_centronics_peripheral_interface::device_centronics_peripheral_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) +{ + /* set some initial values */ + m_pe = FALSE; + m_fault = FALSE; + m_busy = TRUE; + m_strobe = TRUE; + m_data = 0x00; +} + + +//------------------------------------------------- +// ~device_centronics_peripheral_interface - destructor +//------------------------------------------------- + +device_centronics_peripheral_interface::~device_centronics_peripheral_interface() +{ +} + +//************************************************************************** +// CENTRONICS PRINTER DEVICE +//************************************************************************** + +// device type definition +const device_type CENTRONICS_PRINTER = &device_creator; /***************************************************************************** PRINTER INTERFACE *****************************************************************************/ const struct printer_interface centronics_printer_config = { - DEVCB_LINE(centronics_printer_online) + DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, centronics_printer_device, printer_online) }; -static MACHINE_CONFIG_FRAGMENT( centronics ) +static MACHINE_CONFIG_FRAGMENT( centronics_printer ) MCFG_PRINTER_ADD("printer") MCFG_DEVICE_CONFIG(centronics_printer_config) MACHINE_CONFIG_END -/***************************************************************************** - DEVICE INTERFACE -*****************************************************************************/ - -static DEVICE_START( centronics ) -{ - centronics_state *centronics = get_safe_token(device); - const centronics_interface *intf = (const centronics_interface *)device->static_config(); - - /* validate some basic stuff */ - assert(device->static_config() != NULL); - - /* set some initial values */ - centronics->pe = FALSE; - centronics->fault = FALSE; - centronics->busy = TRUE; - centronics->strobe = TRUE; - - /* get printer device */ - centronics->printer = downcast(device->subdevice("printer")); - - /* resolve callbacks */ - centronics->out_ack_func.resolve(intf->out_ack_func, *device); - centronics->out_busy_func.resolve(intf->out_busy_func, *device); - centronics->out_not_busy_func.resolve(intf->out_not_busy_func, *device); - - /* register for state saving */ - device->save_item(NAME(centronics->auto_fd)); - device->save_item(NAME(centronics->strobe)); - device->save_item(NAME(centronics->busy)); - device->save_item(NAME(centronics->ack)); - device->save_item(NAME(centronics->data)); -} +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ +//------------------------------------------------- +// centronics_printer_device - constructor +//------------------------------------------------- -static DEVICE_RESET( centronics ) +centronics_printer_device::centronics_printer_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, CENTRONICS_PRINTER, "Centronics Printer", tag, owner, clock), + device_centronics_peripheral_interface( mconfig, *this ) { } +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- -DEVICE_GET_INFO( centronics ) +machine_config_constructor centronics_printer_device::device_mconfig_additions() const { - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(centronics_state); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; - - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = MACHINE_CONFIG_NAME(centronics); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(centronics); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(centronics); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Centronics"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Centronics"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright MESS Team"); break; - } + return MACHINE_CONFIG_NAME( centronics_printer ); } -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ - /*------------------------------------------------- - centronics_printer_online - callback that + printer_online - callback that sets us busy when the printer goes offline -------------------------------------------------*/ -WRITE_LINE_DEVICE_HANDLER(centronics_printer_online) +WRITE_LINE_MEMBER(centronics_printer_device::printer_online) { - centronics_state *centronics = get_safe_token(device->owner()); - /* when going online, set PE and FAULT high and BUSY low */ - centronics->pe = state; - centronics->fault = state; - centronics->busy = !state; + m_pe = state; + m_fault = state; + m_busy = !state; } +static TIMER_CALLBACK( timer_ack_callback ) +{ + centronics_printer_device *printer = reinterpret_cast(ptr); + printer->ack_callback(param); +} -static TIMER_CALLBACK( ack_callback ) +static TIMER_CALLBACK( timer_busy_callback ) { - centronics_state *centronics = (centronics_state *)ptr; + centronics_printer_device *printer = reinterpret_cast(ptr); + printer->busy_callback(param); +} +void centronics_printer_device::ack_callback(UINT8 param) +{ /* signal change */ - centronics->out_ack_func(param); - centronics->ack = param; + m_owner->out_ack(param); + m_ack = param; if (param == FALSE) { /* data is now ready, output it */ - centronics->printer->output(centronics->data); + m_printer->output(m_data); /* ready to receive more data, return BUSY to low */ - machine.scheduler().timer_set(attotime::from_usec(7), FUNC(busy_callback), FALSE, ptr); + machine().scheduler().timer_set(attotime::from_usec(7), FUNC(timer_busy_callback), FALSE, this); } } -static TIMER_CALLBACK( busy_callback ) +void centronics_printer_device::busy_callback(UINT8 param) { - centronics_state *centronics = (centronics_state *)ptr; - /* signal change */ - centronics->out_busy_func(param); - centronics->out_not_busy_func(!param); - centronics->busy = param; + m_owner->out_busy(param); + m_owner->out_not_busy(!param); + m_busy = param; if (param == TRUE) { /* timer to turn ACK low to receive data */ - machine.scheduler().timer_set(attotime::from_usec(10), FUNC(ack_callback), FALSE, ptr); + machine().scheduler().timer_set(attotime::from_usec(10), FUNC(timer_ack_callback), FALSE, this); } else { /* timer to return ACK to high state */ - machine.scheduler().timer_set(attotime::from_usec(5), FUNC(ack_callback), TRUE, ptr); + machine().scheduler().timer_set(attotime::from_usec(5), FUNC(timer_ack_callback), TRUE, this); } } - -/*------------------------------------------------- - centronics_data_w - write print data --------------------------------------------------*/ - -WRITE8_DEVICE_HANDLER( centronics_data_w ) +void centronics_printer_device::device_start() { - centronics_state *centronics = get_safe_token(device); - centronics->data = data; -} - + m_owner = dynamic_cast(owner()); -/*------------------------------------------------- - centronics_data_r - return current data --------------------------------------------------*/ + /* get printer device */ + m_printer = subdevice("printer"); -READ8_DEVICE_HANDLER( centronics_data_r ) -{ - centronics_state *centronics = get_safe_token(device); - return centronics->data; + /* register for state saving */ + save_item(NAME(m_auto_fd)); + save_item(NAME(m_strobe)); + save_item(NAME(m_busy)); + save_item(NAME(m_ack)); + save_item(NAME(m_data)); } - -/*------------------------------------------------- - set_line - helper to set individual bits --------------------------------------------------*/ - -static void set_line(device_t *device, int line, int state) +void centronics_printer_device::device_reset() { - centronics_state *centronics = get_safe_token(device); - if (state) - centronics->data |= 1 << line; - else - centronics->data &= ~(1 << line); } - -/*------------------------------------------------- - centronics_dx_w - write line dx print data --------------------------------------------------*/ - -WRITE_LINE_DEVICE_HANDLER( centronics_d0_w ) { set_line(device, 0, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d1_w ) { set_line(device, 1, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d2_w ) { set_line(device, 2, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d3_w ) { set_line(device, 3, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d4_w ) { set_line(device, 4, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d5_w ) { set_line(device, 5, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d6_w ) { set_line(device, 6, state); } -WRITE_LINE_DEVICE_HANDLER( centronics_d7_w ) { set_line(device, 7, state); } - - /*------------------------------------------------- centronics_strobe_w - signal that data is ready -------------------------------------------------*/ -WRITE_LINE_DEVICE_HANDLER( centronics_strobe_w ) +void centronics_printer_device::strobe_w(UINT8 state) { - centronics_state *centronics = get_safe_token(device); - /* look for a high -> low transition */ - if (centronics->strobe == TRUE && state == FALSE && centronics->busy == FALSE) + if (m_strobe == TRUE && state == FALSE && m_busy == FALSE) { /* STROBE has gone low, data is ready */ - device->machine().scheduler().timer_set(attotime::zero, FUNC(busy_callback), TRUE, centronics); + machine().scheduler().timer_set(attotime::zero, FUNC(timer_busy_callback), TRUE, this); } - centronics->strobe = state; + m_strobe = state; } @@ -283,113 +257,14 @@ printer (centronics mode) -------------------------------------------------*/ -WRITE_LINE_DEVICE_HANDLER( centronics_prime_w ) -{ - assert(((const centronics_interface *)device->static_config())->is_ibmpc == FALSE); - - /* reset printer if line is low */ - if (state == FALSE) - DEVICE_RESET_CALL( centronics ); -} - - -/*------------------------------------------------- - centronics_init_w - initialize and reset - printer (ibm mode) --------------------------------------------------*/ - -WRITE_LINE_DEVICE_HANDLER( centronics_init_w ) +void centronics_printer_device::init_prime_w(UINT8 state) { - assert(((const centronics_interface *)device->static_config())->is_ibmpc == TRUE); - /* reset printer if line is low */ if (state == FALSE) - DEVICE_RESET_CALL( centronics ); -} - - -/*------------------------------------------------- - centronics_autofeed_w - auto line feed --------------------------------------------------*/ - -WRITE_LINE_DEVICE_HANDLER( centronics_autofeed_w ) -{ - centronics_state *centronics = get_safe_token(device); - assert(((const centronics_interface *)device->static_config())->is_ibmpc == TRUE); - - centronics->auto_fd = state; + device_reset(); } -/*------------------------------------------------- - centronics_ack_r - return the state of the - ack line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_ack_r ) -{ - centronics_state *centronics = get_safe_token(device); - return centronics->ack; -} - - -/*------------------------------------------------- - centronics_busy_r - return the state of the - busy line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_busy_r ) -{ - centronics_state *centronics = get_safe_token(device); - return centronics->busy; -} - - -/*------------------------------------------------- - centronics_pe_r - return the state of the - pe line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_pe_r ) -{ - centronics_state *centronics = get_safe_token(device); - return centronics->pe; -} - - -/*------------------------------------------------- - centronics_not_busy_r - return the state of the - not busy line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_not_busy_r ) -{ - centronics_state *centronics = get_safe_token(device); - return !centronics->busy; -} - - -/*------------------------------------------------- - centronics_vcc_r - return the state of the - vcc line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_vcc_r ) -{ - /* always return high */ - return TRUE; -} - - -/*------------------------------------------------- - centronics_fault_r - return the state of the - fault line --------------------------------------------------*/ - -READ_LINE_DEVICE_HANDLER( centronics_fault_r ) -{ - centronics_state *centronics = get_safe_token(device); - return centronics->fault; -} - -DEFINE_LEGACY_DEVICE(CENTRONICS, centronics); +SLOT_INTERFACE_START(centronics_printer) + SLOT_INTERFACE("printer", CENTRONICS_PRINTER) +SLOT_INTERFACE_END diff -Nru mame-0.144/src/emu/machine/ctronics.h mame-0.145/src/emu/machine/ctronics.h --- mame-0.144/src/emu/machine/ctronics.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/machine/ctronics.h 2012-02-06 21:30:28.000000000 +0000 @@ -7,62 +7,151 @@ #ifndef __CTRONICS_H__ #define __CTRONICS_H__ -#include "devcb.h" - +#include "imagedev/printer.h" /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ +// ======================> device_centronics_peripheral_interface -typedef struct _centronics_interface centronics_interface; -struct _centronics_interface +class device_centronics_peripheral_interface : public device_slot_card_interface { - int is_ibmpc; +public: + device_centronics_peripheral_interface(const machine_config &mconfig, device_t &device); + virtual ~device_centronics_peripheral_interface(); +public: + virtual void write(UINT8 data) { m_data = data; } + virtual UINT8 read() { return m_data; } + + virtual void strobe_w(UINT8 state) { m_strobe = state; } + virtual void init_prime_w(UINT8 state) { m_init = state; } + virtual void autofeed_w(UINT8 state) { m_auto_fd = state; } + + virtual UINT8 ack_r() { return m_ack;} + virtual UINT8 busy_r(){ return m_busy; } + virtual UINT8 pe_r() { return m_pe;} + virtual UINT8 not_busy_r() { return !m_busy; } + virtual UINT8 vcc_r() { return TRUE; } + virtual UINT8 fault_r() { return m_fault; } + virtual void set_line(int line, int state) { if (state) m_data |= 1 << line; else m_data &= ~(1 << line); } +protected: + UINT8 m_strobe; + UINT8 m_busy; + UINT8 m_ack; + UINT8 m_auto_fd; + UINT8 m_pe; + UINT8 m_fault; + UINT8 m_init; + UINT8 m_data; +}; - devcb_write_line out_ack_func; - devcb_write_line out_busy_func; - devcb_write_line out_not_busy_func; +// ======================> centronics_interface +struct centronics_interface +{ + devcb_write_line m_out_ack_cb; + devcb_write_line m_out_busy_cb; + devcb_write_line m_out_not_busy_cb; }; +// ======================> centronics_device +class centronics_device : public device_t, + public centronics_interface, + public device_slot_interface +{ +public: + // construction/destruction + centronics_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~centronics_device(); + + DECLARE_WRITE8_MEMBER( write ) { if (m_dev) m_dev->write(data); } + DECLARE_READ8_MEMBER( read ) { return (m_dev) ? m_dev->read() : 0x00; } + + /* access to the individual bits */ + DECLARE_WRITE_LINE_MEMBER( d0_w ) { if (m_dev) m_dev->set_line(0, state); } + DECLARE_WRITE_LINE_MEMBER( d1_w ) { if (m_dev) m_dev->set_line(1, state); } + DECLARE_WRITE_LINE_MEMBER( d2_w ) { if (m_dev) m_dev->set_line(2, state); } + DECLARE_WRITE_LINE_MEMBER( d3_w ) { if (m_dev) m_dev->set_line(3, state); } + DECLARE_WRITE_LINE_MEMBER( d4_w ) { if (m_dev) m_dev->set_line(4, state); } + DECLARE_WRITE_LINE_MEMBER( d5_w ) { if (m_dev) m_dev->set_line(5, state); } + DECLARE_WRITE_LINE_MEMBER( d6_w ) { if (m_dev) m_dev->set_line(6, state); } + DECLARE_WRITE_LINE_MEMBER( d7_w ) { if (m_dev) m_dev->set_line(7, state); } + + DECLARE_WRITE_LINE_MEMBER( strobe_w ) { if (m_dev) m_dev->strobe_w(state); } + DECLARE_WRITE_LINE_MEMBER( init_prime_w ) { if (m_dev) m_dev->init_prime_w(state); } + DECLARE_WRITE_LINE_MEMBER( autofeed_w ) { if (m_dev) m_dev->autofeed_w(state); } + + DECLARE_READ_LINE_MEMBER( ack_r ) { return (m_dev) ? m_dev->ack_r() : 0;} + DECLARE_READ_LINE_MEMBER( busy_r ){ return (m_dev) ? m_dev->busy_r() : 1; } + DECLARE_READ_LINE_MEMBER( pe_r ) { return (m_dev) ? m_dev->pe_r() : 0;} + DECLARE_READ_LINE_MEMBER( not_busy_r ) { return (m_dev) ? m_dev->not_busy_r() : 0; } + DECLARE_READ_LINE_MEMBER( vcc_r ) { return (m_dev) ? m_dev->vcc_r() : 0; } + DECLARE_READ_LINE_MEMBER( fault_r ) { return (m_dev) ? m_dev->fault_r() : 0; } + + void out_ack(UINT8 param) { m_out_ack_func(param); } + void out_busy(UINT8 param) { m_out_busy_func(param); } + void out_not_busy(UINT8 param) { m_out_not_busy_func(param); } + +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); +private: + device_centronics_peripheral_interface *m_dev; + + devcb_resolved_write_line m_out_ack_func; + devcb_resolved_write_line m_out_busy_func; + devcb_resolved_write_line m_out_not_busy_func; +}; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ -WRITE8_DEVICE_HANDLER( centronics_data_w ); -READ8_DEVICE_HANDLER( centronics_data_r ); +// device type definition +extern const device_type CENTRONICS; + +// ======================> centronics_printer_device -/* access to the individual bits */ -WRITE_LINE_DEVICE_HANDLER( centronics_d0_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d1_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d2_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d3_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d4_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d5_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d6_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_d7_w ); - -WRITE_LINE_DEVICE_HANDLER( centronics_strobe_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_prime_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_init_w ); -WRITE_LINE_DEVICE_HANDLER( centronics_autofeed_w ); - -READ_LINE_DEVICE_HANDLER( centronics_ack_r ); -READ_LINE_DEVICE_HANDLER( centronics_busy_r ); -READ_LINE_DEVICE_HANDLER( centronics_pe_r ); -READ_LINE_DEVICE_HANDLER( centronics_not_busy_r ); -READ_LINE_DEVICE_HANDLER( centronics_vcc_r ); -READ_LINE_DEVICE_HANDLER( centronics_fault_r ); +class centronics_printer_device : + public device_t, + public device_centronics_peripheral_interface +{ +public: + // construction/destruction + centronics_printer_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + // for printer + DECLARE_WRITE_LINE_MEMBER(printer_online); + + void ack_callback(UINT8 param); + void busy_callback(UINT8 param); + + // optional centronics overrides + virtual void strobe_w(UINT8 state); + virtual void init_prime_w(UINT8 state); + virtual UINT8 read() { return 0x00; } +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); +private: + printer_image_device *m_printer; + centronics_device *m_owner; +}; +// device type definition +extern const device_type CENTRONICS_PRINTER; +SLOT_INTERFACE_EXTERN(centronics_printer); /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ -DECLARE_LEGACY_DEVICE(CENTRONICS, centronics); - -#define MCFG_CENTRONICS_ADD(_tag, _intf) \ +#define MCFG_CENTRONICS_ADD(_tag, _intf, _slot_intf, _def_slot, _def_inp) \ MCFG_DEVICE_ADD(_tag, CENTRONICS, 0) \ - MCFG_DEVICE_CONFIG(_intf) + MCFG_DEVICE_CONFIG(_intf) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp) \ + +#define MCFG_CENTRONICS_PRINTER_ADD(_tag, _intf) \ + MCFG_CENTRONICS_ADD(_tag, _intf, centronics_printer, "printer", NULL) \ /*************************************************************************** diff -Nru mame-0.144/src/emu/machine/eeprom.c mame-0.145/src/emu/machine/eeprom.c --- mame-0.144/src/emu/machine/eeprom.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/eeprom.c 2012-02-06 21:30:28.000000000 +0000 @@ -170,17 +170,10 @@ // on this device //------------------------------------------------- -bool eeprom_device::device_validity_check(emu_options &options, const game_driver &driver) const +void eeprom_device::device_validity_check(validity_checker &valid) const { - bool error = false; - if (m_data_bits != 8 && m_data_bits != 16) - { - mame_printf_error("%s: %s eeprom device '%s' specified invalid data width %d\n", driver.source_file, driver.name, tag(), m_data_bits); - error = true; - } - - return error; + mame_printf_error("Invalid data width %d specified\n", m_data_bits); } @@ -453,9 +446,9 @@ if (m_locked == 0) { if (m_data_bits == 16) - m_addrspace[0]->write_word(address * 2, 0x0000); + m_addrspace[0]->write_word(address * 2, 0xFFFF); else - m_addrspace[0]->write_byte(address, 0x00); + m_addrspace[0]->write_byte(address, 0xFF); } else logerror("Error: EEPROM %s is locked\n", tag()); diff -Nru mame-0.144/src/emu/machine/eeprom.h mame-0.145/src/emu/machine/eeprom.h --- mame-0.144/src/emu/machine/eeprom.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/eeprom.h 2012-02-06 21:30:28.000000000 +0000 @@ -86,7 +86,7 @@ protected: // device-level overrides - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/emu/machine/generic.c mame-0.145/src/emu/machine/generic.c --- mame-0.144/src/emu/machine/generic.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/generic.c 2012-02-06 21:30:28.000000000 +0000 @@ -94,9 +94,9 @@ // map devices to the interrupt state memset(state->interrupt_device, 0, sizeof(state->interrupt_device)); - device_execute_interface *exec = NULL; + execute_interface_iterator iter(machine.root_device()); int index = 0; - for (bool gotone = machine.devicelist().first(exec); gotone && index < ARRAY_LENGTH(state->interrupt_device); gotone = exec->next(exec)) + for (device_execute_interface *exec = iter.first(); exec != NULL && index < ARRAY_LENGTH(state->interrupt_device); exec = iter.next()) state->interrupt_device[index++] = &exec->device(); /* register coin save state */ @@ -316,29 +316,21 @@ NVRAM depending of selected BIOS -------------------------------------------------*/ -static astring nvram_filename(running_machine &machine, astring &result) +static astring &nvram_filename(astring &result, device_t &device) { - if (rom_system_bios(machine) == 0 || rom_default_bios(machine) == rom_system_bios(machine)) { - result.printf("%s",machine.basename()); - } else { - result.printf("%s_%d",machine.basename(),rom_system_bios(machine) - 1); - } - return result; -} + running_machine &machine = device.machine(); -/*------------------------------------------------- - nvram_filename - returns filename of system's - NVRAM depending of selected BIOS --------------------------------------------------*/ + // start with either basename or basename_biosnum + result.cpy(machine.basename()); + if (rom_system_bios(machine) != 0 && rom_default_bios(machine) != rom_system_bios(machine)) + result.catprintf("_%d", rom_system_bios(machine) - 1); -static astring nvram_filename(device_t &device, astring &result) -{ - running_machine &machine = device.machine(); - astring name = astring(device.tag()).replacechr(':','_'); - if (rom_system_bios(machine) == 0 || rom_default_bios(machine) == rom_system_bios(machine)) { - result.printf("%s\\%s",machine.basename(),name.cstr()); - } else { - result.printf("%s_%d\\%s",machine.basename(),rom_system_bios(machine) - 1,name.cstr()); + // device-based NVRAM gets its own name in a subdirectory + if (&device != &device.machine().root_device()) + { + astring tag(device.tag()); + tag.del(0, 1).replacechr(':', '_'); + result.cat('\\').cat(tag); } return result; } @@ -353,7 +345,7 @@ { astring filename; emu_file file(machine.options().nvram_directory(), OPEN_FLAG_READ); - if (file.open(nvram_filename(machine,filename),".nv") == FILERR_NONE) + if (file.open(nvram_filename(filename, machine.root_device()), ".nv") == FILERR_NONE) { (*machine.config().m_nvram_handler)(machine, &file, FALSE); file.close(); @@ -364,23 +356,18 @@ } } - device_nvram_interface *nvram = NULL; - if (machine.devicelist().first(nvram)) + nvram_interface_iterator iter(machine.root_device()); + for (device_nvram_interface *nvram = iter.first(); nvram != NULL; nvram = iter.next()) { - for (bool gotone = (nvram != NULL); gotone; gotone = nvram->next(nvram)) + astring filename; + emu_file file(machine.options().nvram_directory(), OPEN_FLAG_READ); + if (file.open(nvram_filename(filename, nvram->device())) == FILERR_NONE) { - astring filename; - emu_file file(machine.options().nvram_directory(), OPEN_FLAG_READ); - if (file.open(nvram_filename(nvram->device(),filename)) == FILERR_NONE) - { - nvram->nvram_load(file); - file.close(); - } - else - { - nvram->nvram_reset(); - } + nvram->nvram_load(file); + file.close(); } + else + nvram->nvram_reset(); } } @@ -395,25 +382,22 @@ { astring filename; emu_file file(machine.options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - if (file.open(nvram_filename(machine,filename), ".nv") == FILERR_NONE) + if (file.open(nvram_filename(filename, machine.root_device()), ".nv") == FILERR_NONE) { (*machine.config().m_nvram_handler)(machine, &file, TRUE); file.close(); } } - device_nvram_interface *nvram = NULL; - if (machine.devicelist().first(nvram)) + nvram_interface_iterator iter(machine.root_device()); + for (device_nvram_interface *nvram = iter.first(); nvram != NULL; nvram = iter.next()) { - for (bool gotone = (nvram != NULL); gotone; gotone = nvram->next(nvram)) + astring filename; + emu_file file(machine.options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); + if (file.open(nvram_filename(filename, nvram->device())) == FILERR_NONE) { - astring filename; - emu_file file(machine.options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - if (file.open(nvram_filename(nvram->device(),filename)) == FILERR_NONE) - { - nvram->nvram_save(file); - file.close(); - } + nvram->nvram_save(file); + file.close(); } } } @@ -586,25 +570,6 @@ /*------------------------------------------------- - clear_all_lines - sets the state of all input - lines and the NMI line to clear --------------------------------------------------*/ - -static TIMER_CALLBACK( clear_all_lines ) -{ - cpu_device *cpudevice = reinterpret_cast(ptr); - - // clear NMI - cpudevice->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - - // clear all other inputs - int inputcount = cpudevice->input_lines(); - for (int line = 0; line < inputcount; line++) - cpudevice->set_input_line(line, CLEAR_LINE); -} - - -/*------------------------------------------------- irq_pulse_clear - clear a "pulsed" IRQ line -------------------------------------------------*/ @@ -650,54 +615,6 @@ } -/*------------------------------------------------- - cpu_interrupt_enable - controls the enable/ - disable value for global interrupts --------------------------------------------------*/ - -void cpu_interrupt_enable(device_t *device, int enabled) -{ - cpu_device *cpudevice = downcast(device); - - generic_machine_private *state = device->machine().generic_machine_data; - int index; - for (index = 0; index < ARRAY_LENGTH(state->interrupt_device); index++) - if (state->interrupt_device[index] == device) - break; - assert_always(index < ARRAY_LENGTH(state->interrupt_enable), "cpu_interrupt_enable() called for invalid CPU!"); - - /* set the new state */ - if (index < ARRAY_LENGTH(state->interrupt_enable)) - state->interrupt_enable[index] = enabled; - - /* make sure there are no queued interrupts */ - if (enabled == 0) - device->machine().scheduler().synchronize(FUNC(clear_all_lines), 0, (void *)cpudevice); -} - - -/*------------------------------------------------- - interrupt_enable_w - set the global interrupt - enable --------------------------------------------------*/ - -WRITE8_HANDLER( interrupt_enable_w ) -{ - cpu_interrupt_enable(&space->device(), data); -} - - -/*------------------------------------------------- - interrupt_enable_r - read the global interrupt - enable --------------------------------------------------*/ - -READ8_HANDLER( interrupt_enable_r ) -{ - return interrupt_enabled(&space->device()); -} - - /*************************************************************************** INTERRUPT GENERATION CALLBACK HELPERS @@ -760,6 +677,9 @@ WRITE8_HANDLER( watchdog_reset_w ) { watchdog_reset(space->machine()); } READ8_HANDLER( watchdog_reset_r ) { watchdog_reset(space->machine()); return space->unmap(); } +WRITE8_MEMBER( driver_device::watchdog_reset_w ) { watchdog_reset(machine()); } +READ8_MEMBER( driver_device::watchdog_reset_r ) { watchdog_reset(machine()); return space.unmap(); } + /*------------------------------------------------- 16-bit reset read/write handlers @@ -768,6 +688,9 @@ WRITE16_HANDLER( watchdog_reset16_w ) { watchdog_reset(space->machine()); } READ16_HANDLER( watchdog_reset16_r ) { watchdog_reset(space->machine()); return space->unmap(); } +WRITE16_MEMBER( driver_device::watchdog_reset16_w ) { watchdog_reset(machine()); } +READ16_MEMBER( driver_device::watchdog_reset16_r ) { watchdog_reset(machine()); return space.unmap(); } + /*------------------------------------------------- 32-bit reset read/write handlers @@ -776,6 +699,9 @@ WRITE32_HANDLER( watchdog_reset32_w ) { watchdog_reset(space->machine()); } READ32_HANDLER( watchdog_reset32_r ) { watchdog_reset(space->machine()); return space->unmap(); } +WRITE32_MEMBER( driver_device::watchdog_reset32_w ) { watchdog_reset(machine()); } +READ32_MEMBER( driver_device::watchdog_reset32_r ) { watchdog_reset(machine()); return space.unmap(); } + /*************************************************************************** diff -Nru mame-0.144/src/emu/machine/generic.h mame-0.145/src/emu/machine/generic.h --- mame-0.144/src/emu/machine/generic.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/generic.h 2012-02-06 21:30:28.000000000 +0000 @@ -108,9 +108,6 @@ void generic_pulse_irq_line(device_t *device, int irqline); void generic_pulse_irq_line_and_vector(device_t *device, int irqline, int vector); -void cpu_interrupt_enable(device_t *device, int enabled); -READ8_HANDLER( interrupt_enable_r ); -WRITE8_HANDLER( interrupt_enable_w ); diff -Nru mame-0.144/src/emu/machine/i2cmem.c mame-0.145/src/emu/machine/i2cmem.c --- mame-0.144/src/emu/machine/i2cmem.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/i2cmem.c 2012-02-06 21:30:27.000000000 +0000 @@ -125,10 +125,8 @@ // on this device //------------------------------------------------- -bool i2cmem_device::device_validity_check( emu_options &options, const game_driver &driver ) const +void i2cmem_device::device_validity_check(validity_checker &valid) const { - bool error = false; - return error; } diff -Nru mame-0.144/src/emu/machine/i2cmem.h mame-0.145/src/emu/machine/i2cmem.h --- mame-0.144/src/emu/machine/i2cmem.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/machine/i2cmem.h 2012-02-06 21:30:27.000000000 +0000 @@ -70,7 +70,7 @@ protected: // device-level overrides virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/emu/machine/i8155.c mame-0.145/src/emu/machine/i8155.c --- mame-0.144/src/emu/machine/i8155.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/i8155.c 2012-02-06 21:30:27.000000000 +0000 @@ -456,6 +456,8 @@ case COMMAND_TM_STOP: // NOP if timer has not started, stop counting if the timer is running if (LOG) logerror("8155 '%s' Timer Command: Stop\n", tag()); + m_to = 1; + timer_output(); m_timer->enable(0); break; diff -Nru mame-0.144/src/emu/machine/i8243.c mame-0.145/src/emu/machine/i8243.c --- mame-0.144/src/emu/machine/i8243.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/i8243.c 2012-02-06 21:30:27.000000000 +0000 @@ -41,7 +41,8 @@ if(callback != NULL) { i8243.m_readhandler_cb.type = DEVCB_TYPE_DEVICE; - i8243.m_readhandler_cb.index = DEVCB_DEVICE_SELF; + i8243.m_readhandler_cb.index = 0; + i8243.m_readhandler_cb.tag = ""; i8243.m_readhandler_cb.readdevice = callback; } else @@ -62,7 +63,8 @@ if(callback != NULL) { i8243.m_writehandler_cb.type = DEVCB_TYPE_DEVICE; - i8243.m_writehandler_cb.index = DEVCB_DEVICE_SELF; + i8243.m_writehandler_cb.index = 0; + i8243.m_writehandler_cb.tag = ""; i8243.m_writehandler_cb.writedevice = callback; } else diff -Nru mame-0.144/src/emu/machine/i8251.c mame-0.145/src/emu/machine/i8251.c --- mame-0.144/src/emu/machine/i8251.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/i8251.c 2012-02-06 21:30:27.000000000 +0000 @@ -99,6 +99,8 @@ void i8251_device::device_start() { // resolve callbacks + m_in_rxd_func.resolve(m_in_rxd_cb,*this); + m_out_txd_func.resolve(m_out_txd_cb,*this); m_out_rxrdy_func.resolve(m_out_rxrdy_cb, *this); m_out_txrdy_func.resolve(m_out_txrdy_cb, *this); m_out_txempty_func.resolve(m_out_txempty_cb, *this); @@ -141,7 +143,10 @@ { //logerror("I8251\n"); /* get bit received from other side and update receive register */ - receive_register_update_bit(get_in_data_bit()); + if(m_in_rxd_func.isnull()) + receive_register_update_bit(get_in_data_bit()); + else + receive_register_update_bit(m_in_rxd_func()); if (is_receive_register_full()) { @@ -184,8 +189,14 @@ /* if transmit is not empty... transmit data */ if (!is_transmit_register_empty()) { + UINT8 data = transmit_register_get_data_bit(); // logerror("I8251\n"); - transmit_register_send_bit(); + //transmit_register_send_bit(); + m_out_txd_func(data); + + m_connection_state &=~SERIAL_STATE_TX_DATA; + m_connection_state|=(data<<5); + serial_connection_out(); } } diff -Nru mame-0.144/src/emu/machine/idectrl.c mame-0.145/src/emu/machine/idectrl.c --- mame-0.144/src/emu/machine/idectrl.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/idectrl.c 2012-02-06 21:30:28.000000000 +0000 @@ -91,6 +91,7 @@ #define IDE_ERROR_NONE 0x00 #define IDE_ERROR_DEFAULT 0x01 +#define IDE_ERROR_TRACK0_NOT_FOUND 0x02 #define IDE_ERROR_UNKNOWN_COMMAND 0x04 #define IDE_ERROR_BAD_LOCATION 0x10 #define IDE_ERROR_BAD_SECTOR 0x80 @@ -104,6 +105,27 @@ /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ +typedef struct _ide_device ide_device; +struct _ide_device +{ + UINT8 features[IDE_DISK_SECTOR_SIZE]; + + UINT16 cur_cylinder; + UINT8 cur_sector; + UINT8 cur_head; + UINT8 cur_head_reg; + + UINT32 cur_lba; + + UINT16 num_cylinders; + UINT8 num_sectors; + UINT8 num_heads; + + chd_file *handle; + hard_disk_file *disk; + bool is_image_device; +}; + typedef struct _ide_state ide_state; struct _ide_state @@ -118,7 +140,6 @@ UINT8 precomp_offset; UINT8 buffer[IDE_DISK_SECTOR_SIZE]; - UINT8 features[IDE_DISK_SECTOR_SIZE]; UINT16 buffer_offset; UINT16 sector_count; @@ -138,24 +159,10 @@ UINT8 bus_master_status; UINT32 bus_master_descriptor; - UINT16 cur_cylinder; - UINT8 cur_sector; - UINT8 cur_head; - UINT8 cur_head_reg; - - UINT32 cur_lba; - - UINT16 num_cylinders; - UINT8 num_sectors; - UINT8 num_heads; - UINT8 config_unknown; UINT8 config_register[IDE_CONFIG_REGISTERS]; UINT8 config_register_num; - chd_file *handle; - hard_disk_file *disk; - bool is_image_device; emu_timer * last_status_timer; emu_timer * reset_timer; @@ -166,6 +173,9 @@ UINT8 gnetreadlock; ide_hardware * hardware; + + UINT8 cur_drive; + ide_device drive[2]; }; @@ -176,7 +186,7 @@ static TIMER_CALLBACK( reset_callback ); -static void ide_build_features(ide_state *ide); +static void ide_build_features(ide_state *ide, int drive); static void continue_read(ide_state *ide); static void read_sector_done(ide_state *ide); @@ -275,10 +285,10 @@ INITIALIZATION AND RESET ***************************************************************************/ -UINT8 *ide_get_features(device_t *device) +UINT8 *ide_get_features(device_t *device, int drive) { ide_state *ide = get_safe_token(device); - return ide->features; + return ide->drive[drive].features; } void ide_set_gnet_readlock(device_t *device, const UINT8 onoff) @@ -373,12 +383,12 @@ INLINE UINT32 lba_address(ide_state *ide) { /* LBA direct? */ - if (ide->cur_head_reg & 0x40) - return ide->cur_sector + ide->cur_cylinder * 256 + ide->cur_head * 16777216; + if (ide->drive[ide->cur_drive].cur_head_reg & 0x40) + return ide->drive[ide->cur_drive].cur_sector + ide->drive[ide->cur_drive].cur_cylinder * 256 + ide->drive[ide->cur_drive].cur_head * 16777216; /* standard CHS */ else - return (ide->cur_cylinder * ide->num_heads + ide->cur_head) * ide->num_sectors + ide->cur_sector - 1; + return (ide->drive[ide->cur_drive].cur_cylinder * ide->drive[ide->cur_drive].num_heads + ide->drive[ide->cur_drive].cur_head) * ide->drive[ide->cur_drive].num_sectors + ide->drive[ide->cur_drive].cur_sector - 1; } @@ -392,14 +402,14 @@ INLINE void next_sector(ide_state *ide) { /* LBA direct? */ - if (ide->cur_head_reg & 0x40) + if (ide->drive[ide->cur_drive].cur_head_reg & 0x40) { - ide->cur_sector++; - if (ide->cur_sector == 0) + ide->drive[ide->cur_drive].cur_sector++; + if (ide->drive[ide->cur_drive].cur_sector == 0) { - ide->cur_cylinder++; - if (ide->cur_cylinder == 0) - ide->cur_head++; + ide->drive[ide->cur_drive].cur_cylinder++; + if (ide->drive[ide->cur_drive].cur_cylinder == 0) + ide->drive[ide->cur_drive].cur_head++; } } @@ -407,21 +417,21 @@ else { /* sectors are 1-based */ - ide->cur_sector++; - if (ide->cur_sector > ide->num_sectors) + ide->drive[ide->cur_drive].cur_sector++; + if (ide->drive[ide->cur_drive].cur_sector > ide->drive[ide->cur_drive].num_sectors) { /* heads are 0 based */ - ide->cur_sector = 1; - ide->cur_head++; - if (ide->cur_head >= ide->num_heads) + ide->drive[ide->cur_drive].cur_sector = 1; + ide->drive[ide->cur_drive].cur_head++; + if (ide->drive[ide->cur_drive].cur_head >= ide->drive[ide->cur_drive].num_heads) { - ide->cur_head = 0; - ide->cur_cylinder++; + ide->drive[ide->cur_drive].cur_head = 0; + ide->drive[ide->cur_drive].cur_cylinder++; } } } - ide->cur_lba = lba_address(ide); + ide->drive[ide->cur_drive].cur_lba = lba_address(ide); } @@ -445,168 +455,168 @@ } -static void ide_generate_features(ide_state *ide) +static void ide_generate_features(ide_state *ide,int drive) { - int total_sectors = ide->num_cylinders * ide->num_heads * ide->num_sectors; - int sectors_per_track = ide->num_heads * ide->num_sectors; + int total_sectors = ide->drive[drive].num_cylinders * ide->drive[drive].num_heads * ide->drive[drive].num_sectors; + int sectors_per_track = ide->drive[drive].num_heads * ide->drive[drive].num_sectors; /* basic geometry */ - ide->features[ 0*2+0] = 0x5a; /* 0: configuration bits */ - ide->features[ 0*2+1] = 0x04; - ide->features[ 1*2+0] = ide->num_cylinders & 0xff; /* 1: logical cylinders */ - ide->features[ 1*2+1] = ide->num_cylinders >> 8; - ide->features[ 2*2+0] = 0; /* 2: reserved */ - ide->features[ 2*2+1] = 0; - ide->features[ 3*2+0] = ide->num_heads & 0xff; /* 3: logical heads */ - ide->features[ 3*2+1] = 0;/*ide->num_heads >> 8;*/ - ide->features[ 4*2+0] = 0; /* 4: vendor specific (obsolete) */ - ide->features[ 4*2+1] = 0; - ide->features[ 5*2+0] = 0; /* 5: vendor specific (obsolete) */ - ide->features[ 5*2+1] = 0; - ide->features[ 6*2+0] = ide->num_sectors & 0xff; /* 6: logical sectors per logical track */ - ide->features[ 6*2+1] = 0;/*ide->num_sectors >> 8;*/ - ide->features[ 7*2+0] = 0; /* 7: vendor-specific */ - ide->features[ 7*2+1] = 0; - ide->features[ 8*2+0] = 0; /* 8: vendor-specific */ - ide->features[ 8*2+1] = 0; - ide->features[ 9*2+0] = 0; /* 9: vendor-specific */ - ide->features[ 9*2+1] = 0; - swap_strncpy(&ide->features[10*2+0], /* 10-19: serial number */ + ide->drive[drive].features[ 0*2+0] = 0x5a; /* 0: configuration bits */ + ide->drive[drive].features[ 0*2+1] = 0x04; + ide->drive[drive].features[ 1*2+0] = ide->drive[drive].num_cylinders & 0xff; /* 1: logical cylinders */ + ide->drive[drive].features[ 1*2+1] = ide->drive[drive].num_cylinders >> 8; + ide->drive[drive].features[ 2*2+0] = 0; /* 2: reserved */ + ide->drive[drive].features[ 2*2+1] = 0; + ide->drive[drive].features[ 3*2+0] = ide->drive[drive].num_heads & 0xff; /* 3: logical heads */ + ide->drive[drive].features[ 3*2+1] = 0;/*ide->num_heads >> 8;*/ + ide->drive[drive].features[ 4*2+0] = 0; /* 4: vendor specific (obsolete) */ + ide->drive[drive].features[ 4*2+1] = 0; + ide->drive[drive].features[ 5*2+0] = 0; /* 5: vendor specific (obsolete) */ + ide->drive[drive].features[ 5*2+1] = 0; + ide->drive[drive].features[ 6*2+0] = ide->drive[drive].num_sectors & 0xff; /* 6: logical sectors per logical track */ + ide->drive[drive].features[ 6*2+1] = 0;/*ide->num_sectors >> 8;*/ + ide->drive[drive].features[ 7*2+0] = 0; /* 7: vendor-specific */ + ide->drive[drive].features[ 7*2+1] = 0; + ide->drive[drive].features[ 8*2+0] = 0; /* 8: vendor-specific */ + ide->drive[drive].features[ 8*2+1] = 0; + ide->drive[drive].features[ 9*2+0] = 0; /* 9: vendor-specific */ + ide->drive[drive].features[ 9*2+1] = 0; + swap_strncpy(&ide->drive[drive].features[10*2+0], /* 10-19: serial number */ "00000000000000000000", 10); - ide->features[20*2+0] = 0; /* 20: vendor-specific */ - ide->features[20*2+1] = 0; - ide->features[21*2+0] = 0; /* 21: vendor-specific */ - ide->features[21*2+1] = 0; - ide->features[22*2+0] = 4; /* 22: # of vendor-specific bytes on read/write long commands */ - ide->features[22*2+1] = 0; - swap_strncpy(&ide->features[23*2+0], /* 23-26: firmware revision */ + ide->drive[drive].features[20*2+0] = 0; /* 20: vendor-specific */ + ide->drive[drive].features[20*2+1] = 0; + ide->drive[drive].features[21*2+0] = 0; /* 21: vendor-specific */ + ide->drive[drive].features[21*2+1] = 0; + ide->drive[drive].features[22*2+0] = 4; /* 22: # of vendor-specific bytes on read/write long commands */ + ide->drive[drive].features[22*2+1] = 0; + swap_strncpy(&ide->drive[drive].features[23*2+0], /* 23-26: firmware revision */ "1.0", 4); - swap_strncpy(&ide->features[27*2+0], /* 27-46: model number */ + swap_strncpy(&ide->drive[drive].features[27*2+0], /* 27-46: model number */ "MAME Compressed Hard Disk", 20); - ide->features[47*2+0] = 0x01; /* 47: read/write multiple support */ - ide->features[47*2+1] = 0x80; - ide->features[48*2+0] = 0; /* 48: reserved */ - ide->features[48*2+1] = 0; - ide->features[49*2+0] = 0x03; /* 49: capabilities */ - ide->features[49*2+1] = 0x0f; - ide->features[50*2+0] = 0; /* 50: reserved */ - ide->features[50*2+1] = 0; - ide->features[51*2+0] = 2; /* 51: PIO data transfer cycle timing mode */ - ide->features[51*2+1] = 0; - ide->features[52*2+0] = 2; /* 52: single word DMA transfer cycle timing mode */ - ide->features[52*2+1] = 0; - ide->features[53*2+0] = 3; /* 53: field validity */ - ide->features[53*2+1] = 0; - ide->features[54*2+0] = ide->num_cylinders & 0xff; /* 54: number of current logical cylinders */ - ide->features[54*2+1] = ide->num_cylinders >> 8; - ide->features[55*2+0] = ide->num_heads & 0xff; /* 55: number of current logical heads */ - ide->features[55*2+1] = 0;/*ide->num_heads >> 8;*/ - ide->features[56*2+0] = ide->num_sectors & 0xff; /* 56: number of current logical sectors per track */ - ide->features[56*2+1] = 0;/*ide->num_sectors >> 8;*/ - ide->features[57*2+0] = sectors_per_track & 0xff; /* 57-58: number of current logical sectors per track */ - ide->features[57*2+1] = sectors_per_track >> 8; - ide->features[58*2+0] = sectors_per_track >> 16; - ide->features[58*2+1] = sectors_per_track >> 24; - ide->features[59*2+0] = 0; /* 59: multiple sector timing */ - ide->features[59*2+1] = 0; - ide->features[60*2+0] = total_sectors & 0xff; /* 60-61: total user addressable sectors */ - ide->features[60*2+1] = total_sectors >> 8; - ide->features[61*2+0] = total_sectors >> 16; - ide->features[61*2+1] = total_sectors >> 24; - ide->features[62*2+0] = 0x07; /* 62: single word dma transfer */ - ide->features[62*2+1] = 0x00; - ide->features[63*2+0] = 0x07; /* 63: multiword DMA transfer */ - ide->features[63*2+1] = 0x04; - ide->features[64*2+0] = 0x03; /* 64: flow control PIO transfer modes supported */ - ide->features[64*2+1] = 0x00; - ide->features[65*2+0] = 0x78; /* 65: minimum multiword DMA transfer cycle time per word */ - ide->features[65*2+1] = 0x00; - ide->features[66*2+0] = 0x78; /* 66: mfr's recommended multiword DMA transfer cycle time */ - ide->features[66*2+1] = 0x00; - ide->features[67*2+0] = 0x4d; /* 67: minimum PIO transfer cycle time without flow control */ - ide->features[67*2+1] = 0x01; - ide->features[68*2+0] = 0x78; /* 68: minimum PIO transfer cycle time with IORDY */ - ide->features[68*2+1] = 0x00; - ide->features[69*2+0] = 0x00; /* 69-70: reserved */ - ide->features[69*2+1] = 0x00; - ide->features[71*2+0] = 0x00; /* 71: reserved for IDENTIFY PACKET command */ - ide->features[71*2+1] = 0x00; - ide->features[72*2+0] = 0x00; /* 72: reserved for IDENTIFY PACKET command */ - ide->features[72*2+1] = 0x00; - ide->features[73*2+0] = 0x00; /* 73: reserved for IDENTIFY PACKET command */ - ide->features[73*2+1] = 0x00; - ide->features[74*2+0] = 0x00; /* 74: reserved for IDENTIFY PACKET command */ - ide->features[74*2+1] = 0x00; - ide->features[75*2+0] = 0x00; /* 75: queue depth */ - ide->features[75*2+1] = 0x00; - ide->features[76*2+0] = 0x00; /* 76-79: reserved */ - ide->features[76*2+1] = 0x00; - ide->features[80*2+0] = 0x00; /* 80: major version number */ - ide->features[80*2+1] = 0x00; - ide->features[81*2+0] = 0x00; /* 81: minor version number */ - ide->features[81*2+1] = 0x00; - ide->features[82*2+0] = 0x00; /* 82: command set supported */ - ide->features[82*2+1] = 0x00; - ide->features[83*2+0] = 0x00; /* 83: command sets supported */ - ide->features[83*2+1] = 0x00; - ide->features[84*2+0] = 0x00; /* 84: command set/feature supported extension */ - ide->features[84*2+1] = 0x00; - ide->features[85*2+0] = 0x00; /* 85: command set/feature enabled */ - ide->features[85*2+1] = 0x00; - ide->features[86*2+0] = 0x00; /* 86: command set/feature enabled */ - ide->features[86*2+1] = 0x00; - ide->features[87*2+0] = 0x00; /* 87: command set/feature default */ - ide->features[87*2+1] = 0x00; - ide->features[88*2+0] = 0x00; /* 88: additional DMA modes */ - ide->features[88*2+1] = 0x00; - ide->features[89*2+0] = 0x00; /* 89: time required for security erase unit completion */ - ide->features[89*2+1] = 0x00; - ide->features[90*2+0] = 0x00; /* 90: time required for enhanced security erase unit completion */ - ide->features[90*2+1] = 0x00; - ide->features[91*2+0] = 0x00; /* 91: current advanced power management value */ - ide->features[91*2+1] = 0x00; - ide->features[92*2+0] = 0x00; /* 92: master password revision code */ - ide->features[92*2+1] = 0x00; - ide->features[93*2+0] = 0x00; /* 93: hardware reset result */ - ide->features[93*2+1] = 0x00; - ide->features[94*2+0] = 0x00; /* 94: acoustic management values */ - ide->features[94*2+1] = 0x00; - ide->features[95*2+0] = 0x00; /* 95-99: reserved */ - ide->features[95*2+1] = 0x00; - ide->features[100*2+0] = total_sectors & 0xff; /* 100-103: maximum 48-bit LBA */ - ide->features[100*2+1] = total_sectors >> 8; - ide->features[101*2+0] = total_sectors >> 16; - ide->features[101*2+1] = total_sectors >> 24; - ide->features[102*2+0] = 0x00; - ide->features[102*2+1] = 0x00; - ide->features[103*2+0] = 0x00; - ide->features[103*2+1] = 0x00; - ide->features[104*2+0] = 0x00; /* 104-126: reserved */ - ide->features[104*2+1] = 0x00; - ide->features[127*2+0] = 0x00; /* 127: removable media status notification */ - ide->features[127*2+1] = 0x00; - ide->features[128*2+0] = 0x00; /* 128: security status */ - ide->features[128*2+1] = 0x00; - ide->features[129*2+0] = 0x00; /* 129-159: vendor specific */ - ide->features[129*2+1] = 0x00; - ide->features[160*2+0] = 0x00; /* 160: CFA power mode 1 */ - ide->features[160*2+1] = 0x00; - ide->features[161*2+0] = 0x00; /* 161-175: reserved for CompactFlash */ - ide->features[161*2+1] = 0x00; - ide->features[176*2+0] = 0x00; /* 176-205: current media serial number */ - ide->features[176*2+1] = 0x00; - ide->features[206*2+0] = 0x00; /* 206-254: reserved */ - ide->features[206*2+1] = 0x00; - ide->features[255*2+0] = 0x00; /* 255: integrity word */ - ide->features[255*2+1] = 0x00; -} - - -static void ide_build_features(ide_state *ide) -{ - memset(ide->features, 0, IDE_DISK_SECTOR_SIZE); - if (chd_get_metadata (ide->handle, HARD_DISK_IDENT_METADATA_TAG, 0, ide->features, IDE_DISK_SECTOR_SIZE, 0, 0, 0) != CHDERR_NONE) - ide_generate_features (ide); + ide->drive[drive].features[47*2+0] = 0x01; /* 47: read/write multiple support */ + ide->drive[drive].features[47*2+1] = 0x80; + ide->drive[drive].features[48*2+0] = 0; /* 48: reserved */ + ide->drive[drive].features[48*2+1] = 0; + ide->drive[drive].features[49*2+0] = 0x03; /* 49: capabilities */ + ide->drive[drive].features[49*2+1] = 0x0f; + ide->drive[drive].features[50*2+0] = 0; /* 50: reserved */ + ide->drive[drive].features[50*2+1] = 0; + ide->drive[drive].features[51*2+0] = 2; /* 51: PIO data transfer cycle timing mode */ + ide->drive[drive].features[51*2+1] = 0; + ide->drive[drive].features[52*2+0] = 2; /* 52: single word DMA transfer cycle timing mode */ + ide->drive[drive].features[52*2+1] = 0; + ide->drive[drive].features[53*2+0] = 3; /* 53: field validity */ + ide->drive[drive].features[53*2+1] = 0; + ide->drive[drive].features[54*2+0] = ide->drive[drive].num_cylinders & 0xff; /* 54: number of current logical cylinders */ + ide->drive[drive].features[54*2+1] = ide->drive[drive].num_cylinders >> 8; + ide->drive[drive].features[55*2+0] = ide->drive[drive].num_heads & 0xff; /* 55: number of current logical heads */ + ide->drive[drive].features[55*2+1] = 0;/*ide->num_heads >> 8;*/ + ide->drive[drive].features[56*2+0] = ide->drive[drive].num_sectors & 0xff; /* 56: number of current logical sectors per track */ + ide->drive[drive].features[56*2+1] = 0;/*ide->num_sectors >> 8;*/ + ide->drive[drive].features[57*2+0] = sectors_per_track & 0xff; /* 57-58: number of current logical sectors per track */ + ide->drive[drive].features[57*2+1] = sectors_per_track >> 8; + ide->drive[drive].features[58*2+0] = sectors_per_track >> 16; + ide->drive[drive].features[58*2+1] = sectors_per_track >> 24; + ide->drive[drive].features[59*2+0] = 0; /* 59: multiple sector timing */ + ide->drive[drive].features[59*2+1] = 0; + ide->drive[drive].features[60*2+0] = total_sectors & 0xff; /* 60-61: total user addressable sectors */ + ide->drive[drive].features[60*2+1] = total_sectors >> 8; + ide->drive[drive].features[61*2+0] = total_sectors >> 16; + ide->drive[drive].features[61*2+1] = total_sectors >> 24; + ide->drive[drive].features[62*2+0] = 0x07; /* 62: single word dma transfer */ + ide->drive[drive].features[62*2+1] = 0x00; + ide->drive[drive].features[63*2+0] = 0x07; /* 63: multiword DMA transfer */ + ide->drive[drive].features[63*2+1] = 0x04; + ide->drive[drive].features[64*2+0] = 0x03; /* 64: flow control PIO transfer modes supported */ + ide->drive[drive].features[64*2+1] = 0x00; + ide->drive[drive].features[65*2+0] = 0x78; /* 65: minimum multiword DMA transfer cycle time per word */ + ide->drive[drive].features[65*2+1] = 0x00; + ide->drive[drive].features[66*2+0] = 0x78; /* 66: mfr's recommended multiword DMA transfer cycle time */ + ide->drive[drive].features[66*2+1] = 0x00; + ide->drive[drive].features[67*2+0] = 0x4d; /* 67: minimum PIO transfer cycle time without flow control */ + ide->drive[drive].features[67*2+1] = 0x01; + ide->drive[drive].features[68*2+0] = 0x78; /* 68: minimum PIO transfer cycle time with IORDY */ + ide->drive[drive].features[68*2+1] = 0x00; + ide->drive[drive].features[69*2+0] = 0x00; /* 69-70: reserved */ + ide->drive[drive].features[69*2+1] = 0x00; + ide->drive[drive].features[71*2+0] = 0x00; /* 71: reserved for IDENTIFY PACKET command */ + ide->drive[drive].features[71*2+1] = 0x00; + ide->drive[drive].features[72*2+0] = 0x00; /* 72: reserved for IDENTIFY PACKET command */ + ide->drive[drive].features[72*2+1] = 0x00; + ide->drive[drive].features[73*2+0] = 0x00; /* 73: reserved for IDENTIFY PACKET command */ + ide->drive[drive].features[73*2+1] = 0x00; + ide->drive[drive].features[74*2+0] = 0x00; /* 74: reserved for IDENTIFY PACKET command */ + ide->drive[drive].features[74*2+1] = 0x00; + ide->drive[drive].features[75*2+0] = 0x00; /* 75: queue depth */ + ide->drive[drive].features[75*2+1] = 0x00; + ide->drive[drive].features[76*2+0] = 0x00; /* 76-79: reserved */ + ide->drive[drive].features[76*2+1] = 0x00; + ide->drive[drive].features[80*2+0] = 0x00; /* 80: major version number */ + ide->drive[drive].features[80*2+1] = 0x00; + ide->drive[drive].features[81*2+0] = 0x00; /* 81: minor version number */ + ide->drive[drive].features[81*2+1] = 0x00; + ide->drive[drive].features[82*2+0] = 0x00; /* 82: command set supported */ + ide->drive[drive].features[82*2+1] = 0x00; + ide->drive[drive].features[83*2+0] = 0x00; /* 83: command sets supported */ + ide->drive[drive].features[83*2+1] = 0x00; + ide->drive[drive].features[84*2+0] = 0x00; /* 84: command set/feature supported extension */ + ide->drive[drive].features[84*2+1] = 0x00; + ide->drive[drive].features[85*2+0] = 0x00; /* 85: command set/feature enabled */ + ide->drive[drive].features[85*2+1] = 0x00; + ide->drive[drive].features[86*2+0] = 0x00; /* 86: command set/feature enabled */ + ide->drive[drive].features[86*2+1] = 0x00; + ide->drive[drive].features[87*2+0] = 0x00; /* 87: command set/feature default */ + ide->drive[drive].features[87*2+1] = 0x00; + ide->drive[drive].features[88*2+0] = 0x00; /* 88: additional DMA modes */ + ide->drive[drive].features[88*2+1] = 0x00; + ide->drive[drive].features[89*2+0] = 0x00; /* 89: time required for security erase unit completion */ + ide->drive[drive].features[89*2+1] = 0x00; + ide->drive[drive].features[90*2+0] = 0x00; /* 90: time required for enhanced security erase unit completion */ + ide->drive[drive].features[90*2+1] = 0x00; + ide->drive[drive].features[91*2+0] = 0x00; /* 91: current advanced power management value */ + ide->drive[drive].features[91*2+1] = 0x00; + ide->drive[drive].features[92*2+0] = 0x00; /* 92: master password revision code */ + ide->drive[drive].features[92*2+1] = 0x00; + ide->drive[drive].features[93*2+0] = 0x00; /* 93: hardware reset result */ + ide->drive[drive].features[93*2+1] = 0x00; + ide->drive[drive].features[94*2+0] = 0x00; /* 94: acoustic management values */ + ide->drive[drive].features[94*2+1] = 0x00; + ide->drive[drive].features[95*2+0] = 0x00; /* 95-99: reserved */ + ide->drive[drive].features[95*2+1] = 0x00; + ide->drive[drive].features[100*2+0] = total_sectors & 0xff; /* 100-103: maximum 48-bit LBA */ + ide->drive[drive].features[100*2+1] = total_sectors >> 8; + ide->drive[drive].features[101*2+0] = total_sectors >> 16; + ide->drive[drive].features[101*2+1] = total_sectors >> 24; + ide->drive[drive].features[102*2+0] = 0x00; + ide->drive[drive].features[102*2+1] = 0x00; + ide->drive[drive].features[103*2+0] = 0x00; + ide->drive[drive].features[103*2+1] = 0x00; + ide->drive[drive].features[104*2+0] = 0x00; /* 104-126: reserved */ + ide->drive[drive].features[104*2+1] = 0x00; + ide->drive[drive].features[127*2+0] = 0x00; /* 127: removable media status notification */ + ide->drive[drive].features[127*2+1] = 0x00; + ide->drive[drive].features[128*2+0] = 0x00; /* 128: security status */ + ide->drive[drive].features[128*2+1] = 0x00; + ide->drive[drive].features[129*2+0] = 0x00; /* 129-159: vendor specific */ + ide->drive[drive].features[129*2+1] = 0x00; + ide->drive[drive].features[160*2+0] = 0x00; /* 160: CFA power mode 1 */ + ide->drive[drive].features[160*2+1] = 0x00; + ide->drive[drive].features[161*2+0] = 0x00; /* 161-175: reserved for CompactFlash */ + ide->drive[drive].features[161*2+1] = 0x00; + ide->drive[drive].features[176*2+0] = 0x00; /* 176-205: current media serial number */ + ide->drive[drive].features[176*2+1] = 0x00; + ide->drive[drive].features[206*2+0] = 0x00; /* 206-254: reserved */ + ide->drive[drive].features[206*2+1] = 0x00; + ide->drive[drive].features[255*2+0] = 0x00; /* 255: integrity word */ + ide->drive[drive].features[255*2+1] = 0x00; +} + + +static void ide_build_features(ide_state *ide, int drive) +{ + memset(ide->drive[drive].features, 0, IDE_DISK_SECTOR_SIZE); + if (chd_get_metadata (ide->drive[drive].handle, HARD_DISK_IDENT_METADATA_TAG, 0, ide->drive[drive].features, IDE_DISK_SECTOR_SIZE, 0, 0, 0) != CHDERR_NONE) + ide_generate_features (ide,drive); } /************************************* @@ -733,8 +743,8 @@ return; } /* now do the read */ - if (ide->disk) - count = hard_disk_read(ide->disk, lba, ide->buffer); + if (ide->drive[ide->cur_drive].disk) + count = hard_disk_read(ide->drive[ide->cur_drive].disk, lba, ide->buffer); else if (ide->hardware != NULL) { count = ide->hardware->read_sector(ide->device, lba, ide->buffer); } @@ -809,12 +819,12 @@ int new_lba = lba_address(ide); attotime seek_time; - if (new_lba == ide->cur_lba || new_lba == ide->cur_lba + 1) + if (new_lba == ide->drive[ide->cur_drive].cur_lba || new_lba == ide->drive[ide->cur_drive].cur_lba + 1) seek_time = TIME_NO_SEEK_MULTISECTOR; else seek_time = TIME_SEEK_MULTISECTOR; - ide->cur_lba = new_lba; + ide->drive[ide->cur_drive].cur_lba = new_lba; ide->device->machine().scheduler().timer_set(seek_time, FUNC(read_sector_done_callback), 0, ide); } else @@ -934,8 +944,8 @@ int lba = lba_address(ide), count = 0; /* now do the write */ - if (ide->disk) - count = hard_disk_write(ide->disk, lba, ide->buffer); + if (ide->drive[ide->cur_drive].disk) + count = hard_disk_write(ide->drive[ide->cur_drive].disk, lba, ide->buffer); else if (ide->hardware != NULL) { count = ide->hardware->write_sector(ide->device, lba, ide->buffer); } @@ -1016,14 +1026,13 @@ /* implicitly clear interrupts here */ clear_interrupt(ide); - ide->command = command; switch (command) { case IDE_COMMAND_READ_MULTIPLE: case IDE_COMMAND_READ_MULTIPLE_ONCE: LOGPRINT(("IDE Read multiple: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1037,7 +1046,7 @@ case IDE_COMMAND_READ_MULTIPLE_BLOCK: LOGPRINT(("IDE Read multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1052,7 +1061,7 @@ case IDE_COMMAND_VERIFY_MULTIPLE: case IDE_COMMAND_VERIFY_NORETRY: LOGPRINT(("IDE Read verify multiple with/without retries: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1066,7 +1075,7 @@ case IDE_COMMAND_READ_DMA: LOGPRINT(("IDE Read multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1081,7 +1090,7 @@ case IDE_COMMAND_WRITE_MULTIPLE: LOGPRINT(("IDE Write multiple: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1094,7 +1103,7 @@ case IDE_COMMAND_WRITE_MULTIPLE_BLOCK: LOGPRINT(("IDE Write multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1107,7 +1116,7 @@ case IDE_COMMAND_WRITE_DMA: LOGPRINT(("IDE Write multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", - ide->cur_cylinder, ide->cur_head, ide->cur_sector, lba_address(ide), ide->sector_count)); + ide->drive[ide->cur_drive].cur_cylinder, ide->drive[ide->cur_drive].cur_head, ide->drive[ide->cur_drive].cur_sector, lba_address(ide), ide->sector_count)); /* reset the buffer */ ide->buffer_offset = 0; @@ -1143,7 +1152,7 @@ ide->sector_count = 1; /* build the features page */ - memcpy(ide->buffer, ide->features, sizeof(ide->buffer)); + memcpy(ide->buffer, ide->drive[ide->cur_drive].features, sizeof(ide->buffer)); /* indicate everything is ready */ ide->status |= IDE_STATUS_BUFFER_READY; @@ -1165,15 +1174,14 @@ ide->error = IDE_ERROR_DEFAULT; /* signal an interrupt */ - signal_interrupt(ide); + signal_delayed_interrupt(ide, MINIMUM_COMMAND_TIME, 0); break; case IDE_COMMAND_RECALIBRATE: /* clear the error too */ ide->error = IDE_ERROR_NONE; - /* signal an interrupt */ - signal_interrupt(ide); + signal_delayed_interrupt(ide, MINIMUM_COMMAND_TIME, 0); break; case IDE_COMMAND_IDLE: @@ -1187,15 +1195,15 @@ break; case IDE_COMMAND_SET_CONFIG: - LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", ide->cur_head + 1, ide->sector_count)); + LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", ide->drive[ide->cur_drive].cur_head + 1, ide->sector_count)); ide->status &= ~IDE_STATUS_ERROR; ide->error = IDE_ERROR_NONE; - ide->num_sectors = ide->sector_count; - ide->num_heads = ide->cur_head + 1; + ide->drive[ide->cur_drive].num_sectors = ide->sector_count; + ide->drive[ide->cur_drive].num_heads = ide->drive[ide->cur_drive].cur_head + 1; /* signal an interrupt */ - signal_interrupt(ide); + signal_delayed_interrupt(ide, MINIMUM_COMMAND_TIME, 0); break; case IDE_COMMAND_UNKNOWN_F9: @@ -1207,7 +1215,7 @@ break; case IDE_COMMAND_SET_FEATURES: - LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", ide->precomp_offset, ide->sector_count & 0xff, ide->cur_sector, ide->cur_cylinder & 0xff, ide->cur_cylinder >> 8)); + LOGPRINT(("IDE Set features (%02X %02X %02X %02X %02X)\n", ide->precomp_offset, ide->sector_count & 0xff, ide->drive[ide->cur_drive].cur_sector, ide->drive[ide->cur_drive].cur_cylinder & 0xff, ide->drive[ide->cur_drive].cur_cylinder >> 8)); /* signal an interrupt */ signal_delayed_interrupt(ide, MINIMUM_COMMAND_TIME, 0); @@ -1250,8 +1258,8 @@ LOGPRINT(("IDE GNET Unlock 3\n")); /* key check */ - chd_get_metadata (ide->handle, HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); - if ((ide->precomp_offset == key[0]) && (ide->sector_count == key[1]) && (ide->cur_sector == key[2]) && (ide->cur_cylinder == (((UINT16)key[4]<<8)|key[3]))) + chd_get_metadata (ide->drive[ide->cur_drive].handle, HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); + if ((ide->precomp_offset == key[0]) && (ide->sector_count == key[1]) && (ide->drive[ide->cur_drive].cur_sector == key[2]) && (ide->drive[ide->cur_drive].cur_cylinder == (((UINT16)key[4]<<8)|key[3]))) { ide->gnetreadlock= 0; } @@ -1305,6 +1313,12 @@ // if (BANK(bank, offset) != IDE_BANK0_DATA && BANK(bank, offset) != IDE_BANK0_STATUS_COMMAND && BANK(bank, offset) != IDE_BANK1_STATUS_CONTROL) LOG(("%s:IDE read at %d:%X, size=%d\n", device->machine().describe_context(), bank, offset, size)); + if (ide->drive[ide->cur_drive].disk) { + ide->status |= IDE_STATUS_DRIVE_READY; + } else { + ide->status &= ~IDE_STATUS_DRIVE_READY; + } + switch (BANK(bank, offset)) { /* unknown config register */ @@ -1355,19 +1369,19 @@ /* return the current sector */ case IDE_BANK0_SECTOR_NUMBER: - return ide->cur_sector; + return ide->drive[ide->cur_drive].cur_sector; /* return the current cylinder LSB */ case IDE_BANK0_CYLINDER_LSB: - return ide->cur_cylinder & 0xff; + return ide->drive[ide->cur_drive].cur_cylinder & 0xff; /* return the current cylinder MSB */ case IDE_BANK0_CYLINDER_MSB: - return ide->cur_cylinder >> 8; + return ide->drive[ide->cur_drive].cur_cylinder >> 8; /* return the current head */ case IDE_BANK0_HEAD_NUMBER: - return ide->cur_head_reg; + return ide->drive[ide->cur_drive].cur_head_reg; /* return the current status and clear any pending interrupts */ case IDE_BANK0_STATUS_COMMAND: @@ -1491,7 +1505,7 @@ { UINT8 key[5] = { 0, 0, 0, 0, 0 }; int i, bad = 0; - chd_get_metadata (ide->handle, HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); + chd_get_metadata (ide->drive[ide->cur_drive].handle, HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); for (i=0; !bad && i<512; i++) bad = ((i < 2 || i >= 7) && ide->buffer[i]) || ((i >= 2 && i < 7) && ide->buffer[i] != key[i-2]); @@ -1524,24 +1538,24 @@ /* current sector */ case IDE_BANK0_SECTOR_NUMBER: - ide->cur_sector = data; + ide->drive[ide->cur_drive].cur_sector = data; break; /* current cylinder LSB */ case IDE_BANK0_CYLINDER_LSB: - ide->cur_cylinder = (ide->cur_cylinder & 0xff00) | (data & 0xff); + ide->drive[ide->cur_drive].cur_cylinder = (ide->drive[ide->cur_drive].cur_cylinder & 0xff00) | (data & 0xff); break; /* current cylinder MSB */ case IDE_BANK0_CYLINDER_MSB: - ide->cur_cylinder = (ide->cur_cylinder & 0x00ff) | ((data & 0xff) << 8); + ide->drive[ide->cur_drive].cur_cylinder = (ide->drive[ide->cur_drive].cur_cylinder & 0x00ff) | ((data & 0xff) << 8); break; /* current head */ case IDE_BANK0_HEAD_NUMBER: - ide->cur_head = data & 0x0f; - ide->cur_head_reg = data; - // drive index = data & 0x10 + ide->cur_drive = (data & 0x10) >> 4; + ide->drive[ide->cur_drive].cur_head = data & 0x0f; + ide->drive[ide->cur_drive].cur_head_reg = data; // LBA mode = data & 0x40 break; @@ -1858,10 +1872,18 @@ /* set MAME harddisk handle */ config = (const ide_config *)downcast(device)->inline_config(); - ide->handle = get_disk_handle(device->machine(), (config->master != NULL) ? config->master : device->tag()); - ide->disk = hard_disk_open(ide->handle); - ide->is_image_device = false; - assert_always(config->slave == NULL, "IDE controller does not yet support slave drives\n"); + + ide->drive[0].handle = get_disk_handle(device->machine(), (config->master != NULL) ? config->master : device->tag()); + ide->drive[0].disk = hard_disk_open(ide->drive[0].handle); + ide->drive[0].is_image_device = false; + + if (config->slave) { + ide->drive[1].handle = get_disk_handle(device->machine(), config->slave); + ide->drive[1].disk = hard_disk_open(ide->drive[1].handle); + ide->drive[1].is_image_device = false; + } + + //assert_always(config->slave == NULL, "IDE controller does not yet support slave drives\n"); /* find the bus master space */ if (config->bmcpu != NULL) @@ -1879,23 +1901,38 @@ } /* get and copy the geometry */ - if (ide->disk != NULL) + if (ide->drive[0].disk != NULL) { - hdinfo = hard_disk_get_info(ide->disk); + hdinfo = hard_disk_get_info(ide->drive[0].disk); if (hdinfo->sectorbytes == IDE_DISK_SECTOR_SIZE) { - ide->num_cylinders = hdinfo->cylinders; - ide->num_sectors = hdinfo->sectors; - ide->num_heads = hdinfo->heads; - if (PRINTF_IDE_COMMANDS) mame_printf_debug("CHS: %d %d %d\n", ide->num_cylinders, ide->num_heads, ide->num_sectors); + ide->drive[0].num_cylinders = hdinfo->cylinders; + ide->drive[0].num_sectors = hdinfo->sectors; + ide->drive[0].num_heads = hdinfo->heads; + if (PRINTF_IDE_COMMANDS) mame_printf_debug("CHS: %d %d %d\n", ide->drive[0].num_cylinders, ide->drive[0].num_heads, ide->drive[0].num_sectors); } /* build the features page */ - ide_build_features(ide); - } else if (config->hardware != NULL) { + ide_build_features(ide,0); + } + if (ide->drive[1].disk != NULL) + { + hdinfo = hard_disk_get_info(ide->drive[1].disk); + if (hdinfo->sectorbytes == IDE_DISK_SECTOR_SIZE) + { + ide->drive[1].num_cylinders = hdinfo->cylinders; + ide->drive[1].num_sectors = hdinfo->sectors; + ide->drive[1].num_heads = hdinfo->heads; + if (PRINTF_IDE_COMMANDS) mame_printf_debug("CHS: %d %d %d\n", ide->drive[1].num_cylinders, ide->drive[1].num_heads, ide->drive[1].num_sectors); + } + + /* build the features page */ + ide_build_features(ide,1); + } + if (config->hardware != NULL) { ide->hardware = (ide_hardware *)config->hardware; - ide->hardware->get_info(ide->device, ide->features, ide->num_cylinders, ide->num_sectors, ide->num_heads); - ide_generate_features (ide); + ide->hardware->get_info(ide->device, ide->drive[0].features, ide->drive[0].num_cylinders, ide->drive[0].num_sectors, ide->drive[0].num_heads); + ide_generate_features (ide,0); } /* create a timer for timing status */ @@ -1911,7 +1948,7 @@ device->save_item(NAME(ide->precomp_offset)); device->save_item(NAME(ide->buffer)); - device->save_item(NAME(ide->features)); + //device->save_item(NAME(ide->features)); device->save_item(NAME(ide->buffer_offset)); device->save_item(NAME(ide->sector_count)); @@ -1928,16 +1965,16 @@ device->save_item(NAME(ide->bus_master_status)); device->save_item(NAME(ide->bus_master_descriptor)); - device->save_item(NAME(ide->cur_cylinder)); - device->save_item(NAME(ide->cur_sector)); - device->save_item(NAME(ide->cur_head)); - device->save_item(NAME(ide->cur_head_reg)); - - device->save_item(NAME(ide->cur_lba)); - - device->save_item(NAME(ide->num_cylinders)); - device->save_item(NAME(ide->num_sectors)); - device->save_item(NAME(ide->num_heads)); + //device->save_item(NAME(ide->cur_cylinder)); + //device->save_item(NAME(ide->cur_sector)); + //device->save_item(NAME(ide->cur_head)); + //device->save_item(NAME(ide->cur_head_reg)); + + //device->save_item(NAME(ide->cur_lba)); + + //device->save_item(NAME(ide->num_cylinders)); + //device->save_item(NAME(ide->num_sectors)); + //device->save_item(NAME(ide->num_heads)); device->save_item(NAME(ide->config_unknown)); device->save_item(NAME(ide->config_register)); @@ -1957,10 +1994,15 @@ static DEVICE_STOP( ide_controller ) { ide_state *ide = get_safe_token(device); - if (!ide->is_image_device) { + if (!ide->drive[0].is_image_device) { /* close the hard disk */ - if (ide->disk != NULL) - hard_disk_close(ide->disk); + if (ide->drive[0].disk != NULL) + hard_disk_close(ide->drive[0].disk); + } + if (!ide->drive[1].is_image_device) { + /* close the hard disk */ + if (ide->drive[1].disk != NULL) + hard_disk_close(ide->drive[1].disk); } } @@ -1972,42 +2014,75 @@ static DEVICE_RESET( ide_controller ) { ide_state *ide = get_safe_token(device); + const ide_config *config = (const ide_config *)downcast(device)->inline_config(); + ide->cur_drive = 0; LOG(("IDE controller reset performed\n")); - astring hardtag; - device->siblingtag(hardtag, "harddisk"); + if (config->master) { + astring hardtag_master; + device->siblingtag(hardtag_master, config->master); + if (!ide->drive[0].disk) + { + ide->drive[0].handle = device->machine().device(hardtag_master.cstr())->get_chd_file(); // should be config->master + + if (ide->drive[0].handle) + { + ide->drive[0].disk = device->machine().device(hardtag_master.cstr())->get_hard_disk_file(); // should be config->master + ide->drive[0].is_image_device = true; + + if (ide->drive[0].disk != NULL) + { + const hard_disk_info *hdinfo; + + hdinfo = hard_disk_get_info(ide->drive[0].disk); + if (hdinfo->sectorbytes == IDE_DISK_SECTOR_SIZE) + { + ide->drive[0].num_cylinders = hdinfo->cylinders; + ide->drive[0].num_sectors = hdinfo->sectors; + ide->drive[0].num_heads = hdinfo->heads; + if (PRINTF_IDE_COMMANDS) printf("CHS: %d %d %d\n", ide->drive[0].num_cylinders, ide->drive[0].num_heads, ide->drive[0].num_sectors); + } - if (device->machine().device( hardtag.cstr() )) { - if (!ide->disk) + /* build the features page */ + ide_build_features(ide,0); + } + } + } + } + if (config->slave) { + astring hardtag_slave; + device->siblingtag(hardtag_slave, config->slave); + if (!ide->drive[1].disk) { - ide->handle = device->machine().device(hardtag.cstr())->get_chd_file(); // should be config->master + ide->drive[1].handle = device->machine().device(hardtag_slave.cstr())->get_chd_file(); // should be config->master - if (ide->handle) + if (ide->drive[1].handle) { - ide->disk = device->machine().device(hardtag.cstr())->get_hard_disk_file(); // should be config->master - ide->is_image_device = true; + ide->drive[1].disk = device->machine().device(hardtag_slave.cstr())->get_hard_disk_file(); // should be config->master + ide->drive[1].is_image_device = true; - if (ide->disk != NULL) + if (ide->drive[1].disk != NULL) { const hard_disk_info *hdinfo; - hdinfo = hard_disk_get_info(ide->disk); + hdinfo = hard_disk_get_info(ide->drive[1].disk); if (hdinfo->sectorbytes == IDE_DISK_SECTOR_SIZE) { - ide->num_cylinders = hdinfo->cylinders; - ide->num_sectors = hdinfo->sectors; - ide->num_heads = hdinfo->heads; - if (PRINTF_IDE_COMMANDS) printf("CHS: %d %d %d\n", ide->num_cylinders, ide->num_heads, ide->num_sectors); + ide->drive[1].num_cylinders = hdinfo->cylinders; + ide->drive[1].num_sectors = hdinfo->sectors; + ide->drive[1].num_heads = hdinfo->heads; + if (PRINTF_IDE_COMMANDS) printf("CHS: %d %d %d\n", ide->drive[1].num_cylinders, ide->drive[1].num_heads, ide->drive[1].num_sectors); } /* build the features page */ - ide_build_features(ide); + ide_build_features(ide,1); } } } - } else if (ide->hardware != NULL) { - ide->hardware->get_info(ide->device, ide->features, ide->num_cylinders, ide->num_sectors, ide->num_heads); - ide_generate_features (ide); + } + if (ide->hardware != NULL) { + ide->hardware->get_info(ide->device, ide->drive[0].features, ide->drive[0].num_cylinders, ide->drive[0].num_sectors, ide->drive[0].num_heads); + ide_generate_features (ide,0); } /* reset the drive state */ diff -Nru mame-0.144/src/emu/machine/idectrl.h mame-0.145/src/emu/machine/idectrl.h --- mame-0.144/src/emu/machine/idectrl.h 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/idectrl.h 2012-02-06 21:30:28.000000000 +0000 @@ -53,7 +53,7 @@ #define MCFG_IDE_CONTROLLER_REGIONS(_master, _slave) \ MCFG_DEVICE_CONFIG_DATAPTR(ide_config, master, _master) \ - MCFG_DEVICE_CONFIG_DATAPTR(ide_config, master, _slave) + MCFG_DEVICE_CONFIG_DATAPTR(ide_config, slave, _slave) #define MCFG_IDE_BUS_MASTER_SPACE(_cpu, _space) \ MCFG_DEVICE_CONFIG_DATAPTR(ide_config, bmcpu, _cpu) \ @@ -67,7 +67,7 @@ FUNCTION PROTOTYPES ***************************************************************************/ -UINT8 *ide_get_features(device_t *device); +UINT8 *ide_get_features(device_t *device, int drive); void ide_set_master_password(device_t *device, const UINT8 *password); void ide_set_user_password(device_t *device, const UINT8 *password); diff -Nru mame-0.144/src/emu/machine/im6402.c mame-0.145/src/emu/machine/im6402.c --- mame-0.144/src/emu/machine/im6402.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/im6402.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,496 @@ +/*************************************************************************** + + Intersil IM6402 Universal Asynchronous Receiver/Transmitter emulation + + Copyright the MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +***************************************************************************/ + +#include "im6402.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type IM6402 = &device_creator; + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define LOG 0 + + + +//************************************************************************** +// INLINE HELPERS +//************************************************************************** + +//------------------------------------------------- +// set_dr - +//------------------------------------------------- + +inline void im6402_device::set_dr(int state) +{ + m_dr = state; + + m_out_dr_func(state); +} + + +//------------------------------------------------- +// set_tbre - +//------------------------------------------------- + +inline void im6402_device::set_tbre(int state) +{ + m_tbre = state; + + m_out_tbre_func(state); +} + + +//------------------------------------------------- +// set_tre - +//------------------------------------------------- + +inline void im6402_device::set_tre(int state) +{ + m_tre = state; + + m_out_tre_func(state); +} + + +//------------------------------------------------- +// receive - +//------------------------------------------------- + +inline void im6402_device::receive() +{ + if (m_in_rri_func.isnull()) + { + receive_register_update_bit(get_in_data_bit()); + } + else + { + receive_register_update_bit(m_in_rri_func()); + } + + if (is_receive_register_full()) + { + receive_register_extract(); + m_rbr = get_received_char(); + + if (m_dr) + { + m_oe = 1; + } + + set_dr(ASSERT_LINE); + } +} + + +//------------------------------------------------- +// transmit - +//------------------------------------------------- + +inline void im6402_device::transmit() +{ + if (is_transmit_register_empty() && !m_tbre) + { + transmit_register_setup(m_tbr); + + set_tbre(ASSERT_LINE); + set_tre(CLEAR_LINE); + } + + if (!is_transmit_register_empty()) + { + int bit = transmit_register_get_data_bit(); + + m_out_tro_func(bit); + serial_connection_out(); + + if (is_transmit_register_empty()) + { + set_tre(ASSERT_LINE); + } + } +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// im6402_device - constructor +//------------------------------------------------- + +im6402_device::im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, IM6402, "Intersil IM6402", tag, owner, clock), + device_serial_interface(mconfig, *this) +{ +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void im6402_device::device_config_complete() +{ + // inherit a copy of the static data + const im6402_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_in_rri_cb, 0, sizeof(m_in_rri_cb)); + memset(&m_out_tro_cb, 0, sizeof(m_out_tro_cb)); + memset(&m_out_dr_cb, 0, sizeof(m_out_dr_cb)); + memset(&m_out_tbre_cb, 0, sizeof(m_out_tbre_cb)); + memset(&m_out_tre_cb, 0, sizeof(m_out_tre_cb)); + } +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void im6402_device::device_start() +{ + // resolve callbacks + m_in_rri_func.resolve(m_in_rri_cb, *this); + m_out_tro_func.resolve(m_out_tro_cb, *this); + m_out_dr_func.resolve(m_out_dr_cb, *this); + m_out_tbre_func.resolve(m_out_tbre_cb, *this); + m_out_tre_func.resolve(m_out_tre_cb, *this); + + // create the timers + if (m_rrc > 0) + { + m_rx_timer = timer_alloc(TIMER_RX); + m_rx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_rrc)); + } + + if (m_trc > 0) + { + m_tx_timer = timer_alloc(TIMER_TX); + m_tx_timer->adjust(attotime::zero, 0, attotime::from_hz(m_trc)); + } + + // state saving + save_item(NAME(m_dr)); + save_item(NAME(m_tbre)); + save_item(NAME(m_tre)); + save_item(NAME(m_pe)); + save_item(NAME(m_fe)); + save_item(NAME(m_oe)); + save_item(NAME(m_cls1)); + save_item(NAME(m_cls2)); + save_item(NAME(m_sbs)); + save_item(NAME(m_sfd)); + save_item(NAME(m_epe)); + save_item(NAME(m_pi)); + save_item(NAME(m_rbr)); + save_item(NAME(m_rrc_count)); + save_item(NAME(m_tbr)); + save_item(NAME(m_trc_count)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void im6402_device::device_reset() +{ + m_rrc_count = 0; + m_trc_count = 0; + + m_rbr = 0; + m_pe = 0; + m_fe = 0; + m_oe = 0; + + set_dr(CLEAR_LINE); + set_tbre(ASSERT_LINE); + set_tre(ASSERT_LINE); +} + + +//------------------------------------------------- +// device_timer - handler timer events +//------------------------------------------------- + +void im6402_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_RX: + rrc_w(1); + break; + + case TIMER_TX: + trc_w(1); + break; + } +} + + +//------------------------------------------------- +// input_callback - +//------------------------------------------------- + +void im6402_device::input_callback(UINT8 state) +{ +} + + +//------------------------------------------------- +// read - receiver buffer register read +//------------------------------------------------- + +READ8_MEMBER( im6402_device::read ) +{ + return m_rbr; +} + + +//------------------------------------------------- +// write - transmitter buffer register write +//------------------------------------------------- + +WRITE8_MEMBER( im6402_device::write ) +{ + m_tbr = data; + + set_tbre(CLEAR_LINE); +} + + +//------------------------------------------------- +// rrc_w - receiver register clock +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::rrc_w ) +{ + if (state) + { + m_rrc_count++; + + if (m_rrc_count == 16) + { + receive(); + m_rrc_count = 0; + } + } +} + + +//------------------------------------------------- +// trc_w - transmitter register clock +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::trc_w ) +{ + if (state) + { + m_trc_count++; + + if (m_trc_count == 16) + { + transmit(); + m_trc_count = 0; + } + } +} + + +//------------------------------------------------- +// dr_r - data received +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::dr_r ) +{ + return m_dr; +} + + +//------------------------------------------------- +// tbre_r - transmitter buffer register empty +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::tbre_r ) +{ + return m_tbre; +} + + +//------------------------------------------------- +// tre_r - transmitter register empty +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::tre_r ) +{ + return m_tre; +} + + +//------------------------------------------------- +// pe_r - parity error +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::pe_r ) +{ + return m_pe; +} + + +//------------------------------------------------- +// fe_r - framing error +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::fe_r ) +{ + return m_fe; +} + + +//------------------------------------------------- +// oe_r - overrun error +//------------------------------------------------- + +READ_LINE_MEMBER( im6402_device::oe_r ) +{ + return m_oe; +} + + +//------------------------------------------------- +// rrd_w - receiver register disable +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::rrd_w ) +{ +} + + +//------------------------------------------------- +// sfd_w - status flags disable +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::sfd_w ) +{ +} + + +//------------------------------------------------- +// drr_w - data received reset +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::drr_w ) +{ + if (state) + { + set_dr(CLEAR_LINE); + } +} + + +//------------------------------------------------- +// mr_w - master reset +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::mr_w ) +{ + if (state) + { + device_reset(); + } +} + + +//------------------------------------------------- +// crl_w - control register load +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::crl_w ) +{ + if (state) + { + int word_length = 5 + ((m_cls2 << 1) | m_cls1); + int stop_bits = 1 + m_sbs ? ((word_length == 5) ? 0.5 : 1) : 0; + int parity_code; + + if (m_pi) parity_code = SERIAL_PARITY_NONE; + else if (m_epe) parity_code = SERIAL_PARITY_EVEN; + else parity_code = SERIAL_PARITY_ODD; + + set_data_frame(word_length, stop_bits, parity_code); + } +} + + +//------------------------------------------------- +// pi_w - parity inhibit +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::pi_w ) +{ + m_pi = state; +} + + +//------------------------------------------------- +// sbs_w - stop bit select +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::sbs_w ) +{ + m_sbs = state; +} + + +//------------------------------------------------- +// cls1_w - character length select 1 +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::cls1_w ) +{ + m_cls1 = state; +} + + +//------------------------------------------------- +// cls2_w - character length select 2 +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::cls2_w ) +{ + m_cls2 = state; +} + + +//------------------------------------------------- +// epe_w - even parity enable +//------------------------------------------------- + +WRITE_LINE_MEMBER( im6402_device::epe_w ) +{ + m_epe = state; +} diff -Nru mame-0.144/src/emu/machine/im6402.h mame-0.145/src/emu/machine/im6402.h --- mame-0.144/src/emu/machine/im6402.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/im6402.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,176 @@ +/*************************************************************************** + + Intersil IM6402 Universal Asynchronous Receiver/Transmitter emulation + + Copyright the MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**************************************************************************** + _____ _____ + Vcc 1 |* \_/ | 40 NOTE + NOTE 2 | | 39 EPE + GND 3 | | 38 CLS1 + RRD 4 | | 37 CLS2 + RBR8 5 | | 36 SBS + RBR7 6 | | 35 PI + RBR6 7 | | 34 CRL + RBR5 8 | | 33 TBR8 + RBR4 9 | | 32 TBR7 + RBR3 10 | IM6402 | 31 TBR6 + RBR2 11 | IM6403 | 30 TBR5 + RBR1 12 | | 29 TBR4 + PE 13 | | 28 TBR3 + FE 14 | | 27 TBR2 + OE 15 | | 26 TBR1 + SFD 16 | | 25 TRO + NOTE 17 | | 24 TRE + DRR 18 | | 23 TRBL + DR 19 | | 22 TBRE + RRI 20 |_____________| 21 MR + + + NOTE: PIN IM6402 IM6403 + --------------------------- + 2 N/C CONTROL + 17 RRC OSC IN + 40 TRC OSC OUT + +***************************************************************************/ + +#pragma once + +#ifndef __IM6402__ +#define __IM6402__ + +#include "emu.h" + + + +/*************************************************************************** + DEVICE CONFIGURATION MACROS +***************************************************************************/ + +#define MCFG_IM6402_ADD(_tag, _config) \ + MCFG_DEVICE_ADD(_tag, IM6402, 0) \ + MCFG_DEVICE_CONFIG(_config) + + +#define IM6402_INTERFACE(_name) \ + const im6402_interface (_name) = + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +// ======================> im6402_interface + +struct im6402_interface +{ + int m_rrc; + int m_trc; + + devcb_read_line m_in_rri_cb; + devcb_write_line m_out_tro_cb; + devcb_write_line m_out_dr_cb; + devcb_write_line m_out_tbre_cb; + devcb_write_line m_out_tre_cb; +}; + + +// ======================> im6402_device + +class im6402_device : public device_t, + public device_serial_interface, + public im6402_interface +{ +public: + // construction/destruction + im6402_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + + DECLARE_READ_LINE_MEMBER( dr_r ); + DECLARE_READ_LINE_MEMBER( tbre_r ); + DECLARE_READ_LINE_MEMBER( tre_r ); + DECLARE_READ_LINE_MEMBER( pe_r ); + DECLARE_READ_LINE_MEMBER( fe_r ); + DECLARE_READ_LINE_MEMBER( oe_r ); + + DECLARE_WRITE_LINE_MEMBER( rrc_w ); + DECLARE_WRITE_LINE_MEMBER( trc_w ); + DECLARE_WRITE_LINE_MEMBER( rrd_w ); + DECLARE_WRITE_LINE_MEMBER( sfd_w ); + DECLARE_WRITE_LINE_MEMBER( drr_w ); + DECLARE_WRITE_LINE_MEMBER( mr_w ); + DECLARE_WRITE_LINE_MEMBER( crl_w ); + DECLARE_WRITE_LINE_MEMBER( pi_w ); + DECLARE_WRITE_LINE_MEMBER( sbs_w ); + DECLARE_WRITE_LINE_MEMBER( cls1_w ); + DECLARE_WRITE_LINE_MEMBER( cls2_w ); + DECLARE_WRITE_LINE_MEMBER( epe_w ); + +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + // device_serial_interface overrides + virtual void input_callback(UINT8 state); + +private: + inline void set_dr(int state); + inline void set_tbre(int state); + inline void set_tre(int state); + inline void receive(); + inline void transmit(); + + static const device_timer_id TIMER_RX = 0; + static const device_timer_id TIMER_TX = 1; + + devcb_resolved_read_line m_in_rri_func; + devcb_resolved_write_line m_out_tro_func; + devcb_resolved_write_line m_out_dr_func; + devcb_resolved_write_line m_out_tbre_func; + devcb_resolved_write_line m_out_tre_func; + + // status + int m_dr; + int m_tbre; + int m_tre; + int m_pe; + int m_fe; + int m_oe; + + // control + int m_cls1; + int m_cls2; + int m_sbs; + int m_sfd; + int m_epe; + int m_pi; + + // receiver + UINT8 m_rbr; + int m_rrc_count; + + // transmitter + UINT8 m_tbr; + int m_trc_count; + + // timers + emu_timer *m_rx_timer; + emu_timer *m_tx_timer; +}; + + +// device type definition +extern const device_type IM6402; + + + +#endif diff -Nru mame-0.144/src/emu/machine/laserdsc.c mame-0.145/src/emu/machine/laserdsc.c --- mame-0.144/src/emu/machine/laserdsc.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/laserdsc.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,1230 @@ +/************************************************************************* + + laserdsc.c + + Core laserdisc player implementation. + +**************************************************************************** + + 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 "emu.h" +#include "laserdsc.h" +#include "avcomp.h" +#include "vbiparse.h" +#include "config.h" +#include "render.h" + + + +//************************************************************************** +// DEBUGGING +//************************************************************************** + +#define LOG_SLIDER 0 + + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +// these specs code from IEC 60857, for NTSC players +const UINT32 LEAD_IN_MIN_RADIUS_IN_UM = 53500; // 53.5 mm +const UINT32 PROGRAM_MIN_RADIUS_IN_UM = 55000; // 55 mm +const UINT32 PROGRAM_MAX_RADIUS_IN_UM = 145000; // 145 mm +const UINT32 LEAD_OUT_MIN_SIZE_IN_UM = 2000; // 2 mm + +// the track pitch is defined as a range; we pick a nominal pitch +// that ensures we can fit 54,000 tracks +const UINT32 MIN_TRACK_PITCH_IN_NM = 1400; // 1.4 um +const UINT32 MAX_TRACK_PITCH_IN_NM = 2000; // 2 um +const UINT32 NOMINAL_TRACK_PITCH_IN_NM = (PROGRAM_MAX_RADIUS_IN_UM - PROGRAM_MIN_RADIUS_IN_UM) * 1000 / 54000; + +// we simulate extra lead-in and lead-out tracks +const UINT32 VIRTUAL_LEAD_IN_TRACKS = (PROGRAM_MIN_RADIUS_IN_UM - LEAD_IN_MIN_RADIUS_IN_UM) * 1000 / NOMINAL_TRACK_PITCH_IN_NM; +const UINT32 MAX_TOTAL_TRACKS = 54000; +const UINT32 VIRTUAL_LEAD_OUT_TRACKS = LEAD_OUT_MIN_SIZE_IN_UM * 1000 / NOMINAL_TRACK_PITCH_IN_NM; + + + +//************************************************************************** +// CORE IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// laserdisc_device - constructor +//------------------------------------------------- + +laserdisc_device::laserdisc_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, shortname, tag, owner, clock), + device_sound_interface(mconfig, *this), + m_screen_name(NULL), + m_overwidth(0), + m_overheight(0), + m_overclip(0, -1, 0, -1), + m_disc(NULL), + m_vbidata(NULL), + m_width(0), + m_height(0), + m_fps_times_1million(0), + m_samplerate(0), + m_readresult(CHDERR_NONE), + m_chdtracks(0), + m_audiosquelch(0), + m_videosquelch(0), + m_fieldnum(0), + m_curtrack(0), + m_maxtrack(0), + m_attospertrack(0), + m_sliderupdate(attotime::zero), + m_videoindex(0), + m_stream(NULL), + m_audiobufsize(0), + m_audiobufin(0), + m_audiobufout(0), + m_audiocursamples(0), + m_audiomaxsamples(0), + m_videoenable(false), + m_videotex(NULL), + m_videopalette(NULL), + m_overenable(false), + m_overindex(0), + m_overtex(NULL) +{ + // initialize overlay_config + m_orig_config.m_overposx = m_orig_config.m_overposy = 0.0f; + m_orig_config.m_overscalex = m_orig_config.m_overscaley = 1.0f; + *static_cast(this) = m_orig_config; +} + + +//------------------------------------------------- +// ~laserdisc_device - destructor +//------------------------------------------------- + +laserdisc_device::~laserdisc_device() +{ +} + + + +//************************************************************************** +// PUBLIC INTERFACES +//************************************************************************** + +//------------------------------------------------- +// get_field_code - return raw field information +// read from the disc +//------------------------------------------------- + +UINT32 laserdisc_device::get_field_code(laserdisc_field_code code, bool zero_if_squelched) +{ + // return nothing if the video is off (external devices can't sense) + if (zero_if_squelched && m_videosquelch) + return 0; + + switch (code) + { + case LASERDISC_CODE_WHITE_FLAG: + return m_metadata[m_fieldnum].white; + + case LASERDISC_CODE_LINE16: + return m_metadata[m_fieldnum].line16; + + case LASERDISC_CODE_LINE17: + return m_metadata[m_fieldnum].line17; + + case LASERDISC_CODE_LINE18: + return m_metadata[m_fieldnum].line18; + + case LASERDISC_CODE_LINE1718: + return m_metadata[m_fieldnum].line1718; + } + return 0; +} + + +//------------------------------------------------- +// screen_update - handle updating the screen +//------------------------------------------------- + +UINT32 laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + // handle the overlay if present + screen_bitmap &overbitmap = m_overbitmap[m_overindex]; + if (overbitmap.valid() && (!m_overupdate_ind16.isnull() || !m_overupdate_rgb32.isnull())) + { + // scale the cliprect to the overlay size + rectangle clip(m_overclip); + clip.min_y = cliprect.min_y * overbitmap.height() / bitmap.height(); + if (cliprect.min_y == screen.visible_area().min_y) + clip.min_y = MIN(clip.min_y, m_overclip.min_y); + clip.max_y = (cliprect.max_y + 1) * overbitmap.height() / bitmap.height() - 1; + + // call the update callback + if (!m_overupdate_ind16.isnull()) + m_overupdate_ind16(screen, overbitmap.as_ind16(), clip); + else + m_overupdate_rgb32(screen, overbitmap.as_rgb32(), clip); + } + + // if this is the last update, do the rendering + if (cliprect.max_y == screen.visible_area().max_y) + { + // update the texture with the overlay contents + if (overbitmap.valid()) + m_overtex->set_bitmap(overbitmap, m_overclip, overbitmap.texformat()); + + // get the laserdisc video + bitmap_yuy16 &vidbitmap = get_video(); + m_videotex->set_bitmap(vidbitmap, vidbitmap.cliprect(), TEXFORMAT_YUY16); + + // reset the screen contents + screen.container().empty(); + + // add the video texture + if (m_videoenable) + screen.container().add_quad(0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), m_videotex, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); + + // add the overlay + if (m_overenable && overbitmap.valid()) + { + float x0 = 0.5f - 0.5f * m_overscalex + m_overposx; + float y0 = 0.5f - 0.5f * m_overscaley + m_overposy; + float x1 = x0 + m_overscalex; + float y1 = y0 + m_overscaley; + screen.container().add_quad(x0, y0, x1, y1, MAKE_ARGB(0xff,0xff,0xff,0xff), m_overtex, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); + } + + // swap to the next bitmap + m_overindex = (m_overindex + 1) % ARRAY_LENGTH(m_overbitmap); + } + return 0; +} + + +//------------------------------------------------- +// static_set_screen - set the screen name +//------------------------------------------------- + +void laserdisc_device::static_set_screen(device_t &device, const char *screen) +{ + downcast(device).m_screen_name = screen; +} + + +//------------------------------------------------- +// static_set_get_disc - set the get disc +// delegate +//------------------------------------------------- + +void laserdisc_device::static_set_get_disc(device_t &device, laserdisc_get_disc_delegate callback) +{ + downcast(device).m_getdisc_callback = callback; +} + + +//------------------------------------------------- +// static_set_get_disc - set the audio interceptor +// delegate +//------------------------------------------------- + +void laserdisc_device::static_set_audio(device_t &device, laserdisc_audio_delegate callback) +{ + downcast(device).m_audio_callback = callback; +} + + +//------------------------------------------------- +// static_set_overlay - set the overlay parameters +//------------------------------------------------- + +void laserdisc_device::static_set_overlay(device_t &device, UINT32 width, UINT32 height, screen_update_ind16_delegate update) +{ + laserdisc_device &ld = downcast(device); + ld.m_overwidth = width; + ld.m_overheight = height; + ld.m_overclip.set(0, width - 1, 0, height - 1); + ld.m_overupdate_ind16 = update; + ld.m_overupdate_rgb32 = screen_update_rgb32_delegate(); +} + +void laserdisc_device::static_set_overlay(device_t &device, UINT32 width, UINT32 height, screen_update_rgb32_delegate update) +{ + laserdisc_device &ld = downcast(device); + ld.m_overwidth = width; + ld.m_overheight = height; + ld.m_overclip.set(0, width - 1, 0, height - 1); + ld.m_overupdate_ind16 = screen_update_ind16_delegate(); + ld.m_overupdate_rgb32 = update; +} + + +//------------------------------------------------- +// static_set_overlay - set the overlay visible +// subregion +//------------------------------------------------- + +void laserdisc_device::static_set_overlay_clip(device_t &device, INT32 minx, INT32 maxx, INT32 miny, INT32 maxy) +{ + downcast(device).m_overclip.set(minx, maxx, miny, maxy); +} + + +//------------------------------------------------- +// static_set_overlay_position - set the overlay +// position parameters +//------------------------------------------------- + +void laserdisc_device::static_set_overlay_position(device_t &device, float posx, float posy) +{ + laserdisc_device &ld = downcast(device); + ld.m_orig_config.m_overposx = ld.m_overposx = posx; + ld.m_orig_config.m_overposy = ld.m_overposy = posy; +} + + +//------------------------------------------------- +// static_set_overlay_scale - set the overlay +// scale parameters +//------------------------------------------------- + +void laserdisc_device::static_set_overlay_scale(device_t &device, float scalex, float scaley) +{ + laserdisc_device &ld = downcast(device); + ld.m_orig_config.m_overscalex = ld.m_overscalex = scalex; + ld.m_orig_config.m_overscaley = ld.m_overscaley = scaley; + +} + + +//************************************************************************** +// DEVICE INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device start callback +//------------------------------------------------- + +void laserdisc_device::device_start() +{ + // ensure that our screen is started first + m_screen = machine().device(m_screen_name); + assert(m_screen != NULL); + if (!m_screen->started()) + throw device_missing_dependencies(); + + // initialize the various pieces + init_disc(); + init_video(); + init_audio(); + + // register callbacks + config_register(machine(), "laserdisc", config_saveload_delegate(FUNC(laserdisc_device::config_load), this), config_saveload_delegate(FUNC(laserdisc_device::config_save), this)); +} + + +//------------------------------------------------- +// device stop callback +//------------------------------------------------- + +void laserdisc_device::device_stop() +{ + // make sure all async operations have completed + if (m_disc != NULL) + chd_async_complete(m_disc); + + // free any textures and palettes + if (m_videotex != NULL) + machine().render().texture_free(m_videotex); + if (m_videopalette != NULL) + palette_deref(m_videopalette); + if (m_overtex != NULL) + machine().render().texture_free(m_overtex); +} + + +//------------------------------------------------- +// device reset callback +//------------------------------------------------- + +void laserdisc_device::device_reset() +{ + // attempt to wire up the audio + m_stream->set_sample_rate(m_samplerate); + + // set up the general ld + m_audiosquelch = 3; + m_videosquelch = 1; + m_fieldnum = 0; + m_curtrack = 1; + m_attospertrack = 0; + m_sliderupdate = machine().time(); +} + + +//------------------------------------------------- +// device_timer - handle timers set by this +// device +//------------------------------------------------- + +void laserdisc_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TID_VBI_FETCH: + { + // wait for previous read and decode to finish + process_track_data(); + + // update current track based on slider speed + update_slider_pos(); + + // update the state + add_and_clamp_track(player_update(m_metadata[m_fieldnum], m_fieldnum, machine().time())); + + // flush any audio before we read more + m_stream->update(); + + // start reading the track data for the next round + m_fieldnum ^= 1; + read_track_data(); + break; + } + } +} + + +//------------------------------------------------- +// sound_stream_update - audio streamer for +// laserdiscs +//------------------------------------------------- + +void laserdisc_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +{ + // compute AND values based on the squelch + INT16 leftand = (m_audiosquelch & 1) ? 0x0000 : 0xffff; + INT16 rightand = (m_audiosquelch & 2) ? 0x0000 : 0xffff; + + // see if we have enough samples to fill the buffer; if not, drop out + int samples_avail = m_audiobufin - m_audiobufout; + if (samples_avail < 0) + samples_avail += m_audiobufsize; + + // if no attached ld, just clear the buffers + stream_sample_t *dst0 = outputs[0]; + stream_sample_t *dst1 = outputs[1]; + if (samples_avail < samples) + { + memset(dst0, 0, samples * sizeof(dst0[0])); + memset(dst1, 0, samples * sizeof(dst1[0])); + } + + // otherwise, stream from our buffer + else + { + INT16 *buffer0 = m_audiobuffer[0]; + INT16 *buffer1 = m_audiobuffer[1]; + int sampout = m_audiobufout; + + // copy samples, clearing behind us as we go + while (sampout != m_audiobufin && samples-- > 0) + { + *dst0++ = buffer0[sampout] & leftand; + *dst1++ = buffer1[sampout] & rightand; + buffer0[sampout] = 0; + buffer1[sampout] = 0; + sampout++; + if (sampout >= m_audiobufsize) + sampout = 0; + } + m_audiobufout = sampout; + + // clear out the rest of the buffer + if (samples > 0) + { + sampout = (m_audiobufout == 0) ? m_audiobufsize - 1 : m_audiobufout - 1; + stream_sample_t fill0 = buffer0[sampout] & leftand; + stream_sample_t fill1 = buffer1[sampout] & rightand; + + while (samples-- > 0) + { + *dst0++ = fill0; + *dst1++ = fill1; + } + } + } +} + + +//************************************************************************** +// SUBCLASS HELPERS +//************************************************************************** + +//------------------------------------------------- +// set_slider_speed - dynamically change the +// slider speed +//------------------------------------------------- + +void laserdisc_device::set_slider_speed(INT32 tracks_per_vsync) +{ + // update to the current time + update_slider_pos(); + + // if 0, set the time to 0 + attotime vsyncperiod = m_screen->frame_period(); + if (tracks_per_vsync == 0) + m_attospertrack = 0; + + // positive values store positive times + else if (tracks_per_vsync > 0) + m_attospertrack = (vsyncperiod / tracks_per_vsync).as_attoseconds(); + + // negative values store negative times + else + m_attospertrack = -(vsyncperiod / -tracks_per_vsync).as_attoseconds(); + + if (LOG_SLIDER) + printf("Slider speed = %d\n", tracks_per_vsync); +} + + +//------------------------------------------------- +// advance_slider - advance the slider by +// a certain number of tracks +//------------------------------------------------- + +void laserdisc_device::advance_slider(INT32 numtracks) +{ + // first update to the current time + update_slider_pos(); + + // then update the track position + add_and_clamp_track(numtracks); + if (LOG_SLIDER) + printf("Advance by %d\n", numtracks); +} + + +//------------------------------------------------- +// get_slider_position - get the current +// slider position +//------------------------------------------------- + +laserdisc_device::slider_position laserdisc_device::get_slider_position() +{ + // update the slider position first + update_slider_pos(); + + // return the status + if (m_curtrack == 1) + return SLIDER_MINIMUM; + else if (m_curtrack < VIRTUAL_LEAD_IN_TRACKS) + return SLIDER_VIRTUAL_LEADIN; + else if (m_curtrack < VIRTUAL_LEAD_IN_TRACKS + m_chdtracks) + return SLIDER_CHD; + else if (m_curtrack < VIRTUAL_LEAD_IN_TRACKS + MAX_TOTAL_TRACKS) + return SLIDER_OUTSIDE_CHD; + else if (m_curtrack < m_maxtrack - 1) + return SLIDER_VIRTUAL_LEADOUT; + else + return SLIDER_MAXIMUM; +} + + +//------------------------------------------------- +// generic_update - generically update in a way +// that works for most situations +//------------------------------------------------- + +INT32 laserdisc_device::generic_update(const vbi_metadata &vbi, int fieldnum, attotime curtime, player_state_info &newstate) +{ + INT32 advanceby = 0; + int frame; + + // start by assuming the state doesn't change + newstate = m_player_state; + + // handle things based on the state + switch (m_player_state.m_state) + { + case LDSTATE_EJECTING: + // when time expires, switch to the ejected state + if (curtime >= m_player_state.m_endtime) + newstate.m_state = LDSTATE_EJECTED; + break; + + case LDSTATE_EJECTED: + // do nothing + break; + + case LDSTATE_PARKED: + // do nothing + break; + + case LDSTATE_LOADING: + // when time expires, switch to the spinup state + if (curtime >= m_player_state.m_endtime) + newstate.m_state = LDSTATE_SPINUP; + advanceby = -GENERIC_SEARCH_SPEED; + break; + + case LDSTATE_SPINUP: + // when time expires, switch to the playing state + if (curtime >= m_player_state.m_endtime) + newstate.m_state = LDSTATE_PLAYING; + advanceby = -GENERIC_SEARCH_SPEED; + break; + + case LDSTATE_PAUSING: + // if he hit the start of a frame, switch to paused state + if (is_start_of_frame(vbi)) + { + newstate.m_state = LDSTATE_PAUSED; + newstate.m_param = fieldnum; + } + + // else advance until we hit it + else if (fieldnum == 1) + advanceby = 1; + break; + + case LDSTATE_PAUSED: + // if we paused on field 1, we must flip back and forth + if (m_player_state.m_param == 1) + advanceby = (fieldnum == 1) ? 1 : -1; + break; + + case LDSTATE_PLAYING: + // if we hit the target frame, switch to the paused state + if (m_player_state.m_param > 0 && is_start_of_frame(vbi) && frame_from_metadata(vbi) == m_player_state.m_param) + { + newstate.m_state = LDSTATE_PAUSED; + newstate.m_param = fieldnum; + } + + // otherwise after the second field of each frame + else if (fieldnum == 1) + advanceby = 1; + break; + + case LDSTATE_PLAYING_SLOW_REVERSE: + // after the second field of each frame, see if we need to advance + if (fieldnum == 1 && ++m_player_state.m_substate > m_player_state.m_param) + { + advanceby = -1; + m_player_state.m_substate = 0; + } + break; + + case LDSTATE_PLAYING_SLOW_FORWARD: + // after the second field of each frame, see if we need to advance + if (fieldnum == 1 && ++m_player_state.m_substate > m_player_state.m_param) + { + advanceby = 1; + m_player_state.m_substate = 0; + } + break; + + case LDSTATE_PLAYING_FAST_REVERSE: + // advance after the second field of each frame + if (fieldnum == 1) + advanceby = -m_player_state.m_param; + break; + + case LDSTATE_PLAYING_FAST_FORWARD: + // advance after the second field of each frame + if (fieldnum == 1) + advanceby = m_player_state.m_param; + break; + + case LDSTATE_SCANNING: + // advance after the second field of each frame + if (fieldnum == 1) + advanceby = m_player_state.m_param >> 8; + + // after we run out of vsyncs, revert to the saved state + if (++m_player_state.m_substate >= (m_player_state.m_param & 0xff)) + newstate = m_saved_state; + break; + + case LDSTATE_STEPPING_REVERSE: + // wait for the first field of the frame and then leap backwards + if (is_start_of_frame(vbi)) + { + advanceby = (fieldnum == 1) ? -1 : -2; + newstate.m_state = LDSTATE_PAUSING; + } + break; + + case LDSTATE_STEPPING_FORWARD: + // wait for the first field of the frame and then switch to pausing state + if (is_start_of_frame(vbi)) + newstate.m_state = LDSTATE_PAUSING; + break; + + case LDSTATE_SEEKING: + // if we're in the final state, look for a matching frame and pause there + frame = frame_from_metadata(vbi); + if (m_player_state.m_substate == 1 && is_start_of_frame(vbi) && frame == m_player_state.m_param) + { + newstate.m_state = LDSTATE_PAUSED; + newstate.m_param = fieldnum; + } + + // otherwise, if we got frame data from the VBI, update our seeking logic + else if (m_player_state.m_substate == 0 && frame != FRAME_NOT_PRESENT) + { + INT32 delta = (m_player_state.m_param - 2) - frame; + + // if we're within a couple of frames, just play until we hit it + if (delta >= 0 && delta <= 2) + m_player_state.m_substate++; + + // otherwise, compute the delta assuming 1:1 track to frame; this will correct eventually + else + { + if (delta < 0) + delta--; + advanceby = delta; + advanceby = MIN(advanceby, GENERIC_SEARCH_SPEED); + advanceby = MAX(advanceby, -GENERIC_SEARCH_SPEED); + } + } + + // otherwise, keep advancing until we know what's up + else + { + if (fieldnum == 1) + advanceby = 1; + } + break; + + default: + // do nothing + break; + } + + return advanceby; +} + + +//************************************************************************** +// INITIALIZATION +//************************************************************************** + +//------------------------------------------------- +// init_disc - initialize the state of the +// CHD disc +//------------------------------------------------- + +void laserdisc_device::init_disc() +{ + // get a handle to the disc to play + if (!m_getdisc_callback.isnull()) + m_disc = m_getdisc_callback(*this); + else + m_disc = get_disk_handle(machine(), tag()); + + // set default parameters + m_width = 720; + m_height = 240; + m_fps_times_1million = 59940000; + m_samplerate = 48000; + + // get the disc metadata and extract the ld + m_chdtracks = 0; + m_maxtrack = VIRTUAL_LEAD_IN_TRACKS + MAX_TOTAL_TRACKS + VIRTUAL_LEAD_OUT_TRACKS; + if (m_disc != NULL) + { + // require the A/V codec + if (chd_get_header(m_disc)->compression != CHDCOMPRESSION_AV) + throw emu_fatalerror("Laserdisc video must be compressed with the A/V codec!"); + + // read the metadata + char metadata[256]; + chd_error err = chd_get_metadata(m_disc, AV_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL); + if (err != CHDERR_NONE) + throw emu_fatalerror("Non-A/V CHD file specified"); + + // extract the metadata + int fps, fpsfrac, interlaced, channels; + if (sscanf(metadata, AV_METADATA_FORMAT, &fps, &fpsfrac, &m_width, &m_height, &interlaced, &channels, &m_samplerate) != 7) + throw emu_fatalerror("Invalid metadata in CHD file"); + else + m_fps_times_1million = fps * 1000000 + fpsfrac; + + // require interlaced video + if (!interlaced) + throw emu_fatalerror("Laserdisc video must be interlaced!"); + + // determine the maximum track and allocate a frame buffer + UINT32 totalhunks = chd_get_header(m_disc)->totalhunks; + m_chdtracks = totalhunks / 2; + + // allocate memory for the precomputed per-frame metadata + m_vbidata = auto_alloc_array(machine(), UINT8, totalhunks * VBI_PACKED_BYTES); + UINT32 vbilength; + err = chd_get_metadata(m_disc, AV_LD_METADATA_TAG, 0, m_vbidata, totalhunks * VBI_PACKED_BYTES, &vbilength, NULL, NULL); + if (err != CHDERR_NONE || vbilength != totalhunks * VBI_PACKED_BYTES) + throw emu_fatalerror("Precomputed VBI metadata missing or incorrect size"); + } + m_maxtrack = MAX(m_maxtrack, VIRTUAL_LEAD_IN_TRACKS + VIRTUAL_LEAD_OUT_TRACKS + m_chdtracks); +} + + +//------------------------------------------------- +// init_video - initialize the state of the +// video rendering +//------------------------------------------------- + +void laserdisc_device::init_video() +{ + // register for VBLANK callbacks + m_screen->register_vblank_callback(vblank_state_delegate(FUNC(laserdisc_device::vblank_state_changed), this)); + + // allocate palette for applying brightness/contrast/gamma + m_videopalette = palette_alloc(256, 1); + if (m_videopalette == NULL) + throw emu_fatalerror("Out of memory allocating video palette"); + for (int index = 0; index < 256; index++) + palette_entry_set_color(m_videopalette, index, MAKE_RGB(index, index, index)); + + // allocate video frames + for (int index = 0; index < ARRAY_LENGTH(m_frame); index++) + { + // first allocate a YUY16 bitmap at 2x the height + frame_data &frame = m_frame[index]; + frame.m_bitmap.allocate(m_width, m_height * 2); + frame.m_bitmap.set_palette(m_videopalette); + fillbitmap_yuy16(frame.m_bitmap, 40, 109, 240); + + // make a copy of the bitmap that clips out the VBI and horizontal blanking areas + frame.m_visbitmap.wrap(&frame.m_bitmap.pix16(44, frame.m_bitmap.width() * 8 / 720), + frame.m_bitmap.width() - 2 * frame.m_bitmap.width() * 8 / 720, + frame.m_bitmap.height() - 44, + frame.m_bitmap.rowpixels()); + frame.m_visbitmap.set_palette(m_videopalette); + } + + // allocate an empty frame of the same size + m_emptyframe.allocate(m_width, m_height * 2); + m_emptyframe.set_palette(m_videopalette); + fillbitmap_yuy16(m_emptyframe, 0, 128, 128); + + // allocate texture for rendering + m_videoenable = true; + m_videotex = machine().render().texture_alloc(); + if (m_videotex == NULL) + fatalerror("Out of memory allocating video texture"); + + // allocate overlay + m_overenable = overlay_configured(); + if (m_overenable) + { + // bind our handlers + m_overupdate_ind16.bind_relative_to(*owner()); + m_overupdate_rgb32.bind_relative_to(*owner()); + + // configure bitmap formats + bitmap_format format = !m_overupdate_ind16.isnull() ? BITMAP_FORMAT_IND16 : BITMAP_FORMAT_RGB32; + texture_format texformat = !m_overupdate_ind16.isnull() ? TEXFORMAT_PALETTEA16 : TEXFORMAT_ARGB32; + + // allocate overlay bitmaps + for (int index = 0; index < ARRAY_LENGTH(m_overbitmap); index++) + { + m_overbitmap[index].set_format(format, texformat); + m_overbitmap[index].set_palette(machine().palette); + m_overbitmap[index].resize(m_overwidth, m_overheight); + } + + // allocate overlay texture + m_overtex = machine().render().texture_alloc(); + if (m_overtex == NULL) + fatalerror("Out of memory allocating overlay texture"); + } +} + + +//------------------------------------------------- +// init_audio - initialize the state of the +// audio rendering +//------------------------------------------------- + +void laserdisc_device::init_audio() +{ + // allocate a stream + m_stream = stream_alloc(0, 2, 48000); + + // allocate audio buffers + m_audiomaxsamples = ((UINT64)m_samplerate * 1000000 + m_fps_times_1million - 1) / m_fps_times_1million; + m_audiobufsize = m_audiomaxsamples * 4; + m_audiobuffer[0] = auto_alloc_array(machine(), INT16, m_audiobufsize); + m_audiobuffer[1] = auto_alloc_array(machine(), INT16, m_audiobufsize); +} + + +//************************************************************************** +// INTERNAL HELPERS +//************************************************************************** + +//------------------------------------------------- +// fillbitmap_yuy16 - fill a YUY16 bitmap with a +// given color pattern +//------------------------------------------------- + +void laserdisc_device::fillbitmap_yuy16(bitmap_yuy16 &bitmap, UINT8 yval, UINT8 cr, UINT8 cb) +{ + UINT16 color0 = (yval << 8) | cb; + UINT16 color1 = (yval << 8) | cr; + + // write 32 bits of color (2 pixels at a time) + for (int y = 0; y < bitmap.height(); y++) + { + UINT16 *dest = &bitmap.pix16(y); + for (int x = 0; x < bitmap.width() / 2; x++) + { + *dest++ = color0; + *dest++ = color1; + } + } +} + + +//------------------------------------------------- +// update_slider_pos - based on the current +// speed and elapsed time, update the current +// track position +//------------------------------------------------- + +void laserdisc_device::update_slider_pos() +{ + attotime curtime = machine().time(); + + // if not moving, update to now + if (m_attospertrack == 0) + m_sliderupdate = curtime; + + // otherwise, compute the number of tracks covered + else + { + attoseconds_t delta = (curtime - m_sliderupdate).as_attoseconds(); + + // determine how many tracks we covered and advance + if (m_attospertrack >= 0) + { + INT32 tracks_covered = delta / m_attospertrack; + add_and_clamp_track(tracks_covered); + if (tracks_covered != 0) + m_sliderupdate += attotime(0, tracks_covered * m_attospertrack); + } + else + { + INT32 tracks_covered = delta / -m_attospertrack; + add_and_clamp_track(-tracks_covered); + if (tracks_covered != 0) + m_sliderupdate += attotime(0, tracks_covered * -m_attospertrack); + } + } +} + + +//------------------------------------------------- +// vblank_state_changed - called on each state +// change of the VBLANK signal +//------------------------------------------------- + +void laserdisc_device::vblank_state_changed(screen_device &screen, bool vblank_state) +{ + // update current track based on slider speed + update_slider_pos(); + + // on rising edge, process previously-read frame and inform the player + if (vblank_state) + { + // call the player's VSYNC callback + player_vsync(m_metadata[m_fieldnum], m_fieldnum, machine().time()); + + // set a timer to begin fetching the next frame just before the VBI data would be fetched + timer_set(screen.time_until_pos(16*2), TID_VBI_FETCH); + } +} + + +//------------------------------------------------- +// current_frame - return a reference to the +// currently visible frame +//------------------------------------------------- + +laserdisc_device::frame_data &laserdisc_device::current_frame() +{ + // determine the most recent live set of frames + frame_data *frame = &m_frame[m_videoindex]; + if (frame->m_numfields < 2) + frame = &m_frame[(m_videoindex + ARRAY_LENGTH(m_frame) - 1) % ARRAY_LENGTH(m_frame)]; + return *frame; +} + + +//------------------------------------------------- +// read_track_data - read and process data for +// a particular video track +//------------------------------------------------- + +void laserdisc_device::read_track_data() +{ + // compute the chdhunk number we are going to read + INT32 chdtrack = m_curtrack - 1 - VIRTUAL_LEAD_IN_TRACKS; + chdtrack = MAX(chdtrack, 0); + chdtrack = MIN(chdtrack, m_chdtracks - 1); + UINT32 readhunk = chdtrack * 2 + m_fieldnum; + + // cheat and look up the metadata we are about to retrieve + vbi_metadata vbidata = { 0 }; + if (m_vbidata != NULL) + vbi_metadata_unpack(&vbidata, NULL, &m_vbidata[readhunk * VBI_PACKED_BYTES]); + + // if we're in the lead-in area, force the VBI data to be standard lead-in + if (m_curtrack - 1 < VIRTUAL_LEAD_IN_TRACKS) + { + vbidata.line16 = 0; + vbidata.line17 = vbidata.line18 = vbidata.line1718 = VBI_CODE_LEADIN; + } +//printf("track %5d.%d: %06X %06X %06X\n", m_curtrack, m_fieldnum, vbidata.line16, vbidata.line17, vbidata.line18); + + // if we're about to read the first field in a frame, advance + frame_data *frame = &m_frame[m_videoindex]; + if ((vbidata.line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + { + if (frame->m_numfields >= 2) + m_videoindex = (m_videoindex + 1) % ARRAY_LENGTH(m_frame); + frame = &m_frame[m_videoindex]; + frame->m_numfields = 0; + } + + // if we're squelched, reset the frame counter + if (m_videosquelch) + frame->m_numfields = 0; + + // remember the last field number + frame->m_lastfield = m_curtrack * 2 + m_fieldnum; + + // set the video target information + m_avconfig.video.wrap(&frame->m_bitmap.pix16(m_fieldnum), frame->m_bitmap.width(), frame->m_bitmap.height() / 2, frame->m_bitmap.rowpixels() * 2); + + // set the audio target information + if (m_audiobufin + m_audiomaxsamples <= m_audiobufsize) + { + // if we can fit without wrapping, just read the data directly + m_avconfig.audio[0] = &m_audiobuffer[0][m_audiobufin]; + m_avconfig.audio[1] = &m_audiobuffer[1][m_audiobufin]; + } + else + { + // otherwise, read to the beginning of the buffer + m_avconfig.audio[0] = &m_audiobuffer[0][0]; + m_avconfig.audio[1] = &m_audiobuffer[1][0]; + } + + // override if we're not decoding + m_avconfig.maxsamples = m_audiomaxsamples; + m_avconfig.actsamples = &m_audiocursamples; + m_audiocursamples = 0; + + // set the VBI data for the new field from our precomputed data + if (m_vbidata != NULL) + { + UINT32 vbiframe; + vbi_metadata_unpack(&m_metadata[m_fieldnum], &vbiframe, &m_vbidata[readhunk * VBI_PACKED_BYTES]); + } + + // if we're in the lead-in area, force the VBI data to be standard lead-in + if (m_curtrack - 1 < VIRTUAL_LEAD_IN_TRACKS) + { + m_metadata[m_fieldnum].line16 = 0; + m_metadata[m_fieldnum].line17 = m_metadata[m_fieldnum].line18 = m_metadata[m_fieldnum].line1718 = VBI_CODE_LEADIN; + } + + // configure the codec and then read + m_readresult = CHDERR_FILE_NOT_FOUND; + if (m_disc != NULL && !m_videosquelch) + { + m_readresult = chd_codec_config(m_disc, AV_CODEC_DECOMPRESS_CONFIG, &m_avconfig); + if (m_readresult == CHDERR_NONE) + m_readresult = chd_read_async(m_disc, readhunk, NULL); + } +} + + +//------------------------------------------------- +// process_track_data - process data from a +// track after it has been read +//------------------------------------------------- + +void laserdisc_device::process_track_data() +{ + // wait for the async operation to complete + if (m_readresult == CHDERR_OPERATION_PENDING) + m_readresult = chd_async_complete(m_disc); + + // remove the video if we had an error + if (m_readresult != CHDERR_NONE) + m_avconfig.video.reset(); + + // count the field as read if we are successful + if (m_avconfig.video.valid()) + { + m_frame[m_videoindex].m_numfields++; + player_overlay(m_avconfig.video); + } + + // pass the audio to the callback + if (!m_audio_callback.isnull()) + m_audio_callback(*this, m_samplerate, m_audiocursamples, m_avconfig.audio[0], m_avconfig.audio[1]); + + // shift audio data if we read it into the beginning of the buffer + if (m_audiocursamples != 0 && m_audiobufin != 0) + for (int chnum = 0; chnum < 2; chnum++) + if (m_avconfig.audio[chnum] == &m_audiobuffer[chnum][0]) + { + // move data to the end + int samplesleft = m_audiobufsize - m_audiobufin; + samplesleft = MIN(samplesleft, m_audiocursamples); + memmove(&m_audiobuffer[chnum][m_audiobufin], &m_audiobuffer[chnum][0], samplesleft * 2); + + // shift data at the beginning + if (samplesleft < m_audiocursamples) + memmove(&m_audiobuffer[chnum][0], &m_audiobuffer[chnum][samplesleft], (m_audiocursamples - samplesleft) * 2); + } + + // update the input buffer pointer + m_audiobufin = (m_audiobufin + m_audiocursamples) % m_audiobufsize; +} + + + +//************************************************************************** +// CONFIG SETTINGS ACCESS +//************************************************************************** + +//------------------------------------------------- +// config_load - read and apply data from the +// configuration file +//------------------------------------------------- + +void laserdisc_device::config_load(int config_type, xml_data_node *parentnode) +{ + // we only care about game files + if (config_type != CONFIG_TYPE_GAME) + return; + + // might not have any data + if (parentnode == NULL) + return; + + // iterate over overlay nodes + for (xml_data_node *ldnode = xml_get_sibling(parentnode->child, "device"); ldnode != NULL; ldnode = xml_get_sibling(ldnode->next, "device")) + { + const char *devtag = xml_get_attribute_string(ldnode, "tag", ""); + if (strcmp(devtag, tag()) == 0) + { + // handle the overlay node + xml_data_node *overnode = xml_get_sibling(ldnode->child, "overlay"); + if (overnode != NULL) + { + // fetch positioning controls + m_overposx = xml_get_attribute_float(overnode, "hoffset", m_overposx); + m_overscalex = xml_get_attribute_float(overnode, "hstretch", m_overscalex); + m_overposy = xml_get_attribute_float(overnode, "voffset", m_overposy); + m_overscaley = xml_get_attribute_float(overnode, "vstretch", m_overscaley); + } + } + } +} + + +//------------------------------------------------- +// config_save - save data to the configuration +// file +//------------------------------------------------- + +void laserdisc_device::config_save(int config_type, xml_data_node *parentnode) +{ + // we only care about game files + if (config_type != CONFIG_TYPE_GAME) + return; + + // create a node + xml_data_node *ldnode = xml_add_child(parentnode, "device", NULL); + if (ldnode != NULL) + { + // output the basics + xml_set_attribute(ldnode, "tag", tag()); + + // add an overlay node + xml_data_node *overnode = xml_add_child(ldnode, "overlay", NULL); + bool changed = false; + if (overnode != NULL) + { + // output the positioning controls + if (m_overposx != m_orig_config.m_overposx) + { + xml_set_attribute_float(overnode, "hoffset", m_overposx); + changed = true; + } + + if (m_overscalex != m_orig_config.m_overscalex) + { + xml_set_attribute_float(overnode, "hstretch", m_overscalex); + changed = true; + } + + if (m_overposy != m_orig_config.m_overposy) + { + xml_set_attribute_float(overnode, "voffset", m_overposy); + changed = true; + } + + if (m_overscaley != m_orig_config.m_overscaley) + { + xml_set_attribute_float(overnode, "vstretch", m_overscaley); + changed = true; + } + } + + // if nothing changed, kill the node + if (!changed) + xml_delete_node(ldnode); + } +} + diff -Nru mame-0.144/src/emu/machine/laserdsc.h mame-0.145/src/emu/machine/laserdsc.h --- mame-0.144/src/emu/machine/laserdsc.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/laserdsc.h 2012-02-06 21:30:28.000000000 +0000 @@ -2,10 +2,38 @@ laserdsc.h - Generic laserdisc support. + Core laserdisc player implementation. - 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. *************************************************************************/ @@ -14,227 +42,401 @@ #ifndef __LASERDSC_H__ #define __LASERDSC_H__ -#include "chd.h" +#include "vbiparse.h" +//************************************************************************** +// CONSTANTS +//************************************************************************** -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* types of players supported */ -enum +// laserdisc field codes +enum laserdisc_field_code { - LASERDISC_TYPE_UNKNOWN, - LASERDISC_TYPE_PIONEER_PR7820, /* Pioneer PR-7820 */ - LASERDISC_TYPE_PIONEER_PR8210, /* Pioneer PR-8210 / LD-V1100 */ - LASERDISC_TYPE_SIMUTREK_SPECIAL, /* Pioneer PR-8210 with mods */ - LASERDISC_TYPE_PIONEER_LDV1000, /* Pioneer LD-V1000 */ - LASERDISC_TYPE_PHILLIPS_22VP931, /* Phillips 22VP931 */ - LASERDISC_TYPE_PHILLIPS_22VP932, /* Phillips 22VP932 (PAL) */ - LASERDISC_TYPE_SONY_LDP1450 /* Sony LDP-1450 */ + LASERDISC_CODE_WHITE_FLAG = 11, // boolean white flag + LASERDISC_CODE_LINE16 = 16, // 24-bit line 16 code + LASERDISC_CODE_LINE17 = 17, // 24-bit line 17 code + LASERDISC_CODE_LINE18 = 18, // 24-bit line 18 code + LASERDISC_CODE_LINE1718 = 1718 // 24-bit best of line 17/18 code }; -/* laserdisc control lines */ -#define LASERDISC_LINE_ENTER 0 /* "ENTER" key/line */ -#define LASERDISC_LINE_CONTROL 1 /* "CONTROL" line */ -#define LASERDISC_LINE_RESET 2 /* "RESET" line */ -#define LASERDISC_INPUT_LINES 3 - -/* laserdisc status lines */ -#define LASERDISC_LINE_READY 0 /* "READY" line */ -#define LASERDISC_LINE_STATUS 1 /* "STATUS STROBE" line */ -#define LASERDISC_LINE_COMMAND 2 /* "COMMAND STROBE" line */ -#define LASERDISC_LINE_DATA_AVAIL 3 /* data available "line" */ -#define LASERDISC_OUTPUT_LINES 4 - -/* laserdisc field codes */ -#define LASERDISC_CODE_WHITE_FLAG 11 /* boolean white flag */ -#define LASERDISC_CODE_LINE16 16 /* 24-bit line 16 code */ -#define LASERDISC_CODE_LINE17 17 /* 24-bit line 17 code */ -#define LASERDISC_CODE_LINE18 18 /* 24-bit line 18 code */ -#define LASERDISC_CODE_LINE1718 1718 /* 24-bit best of line 17/18 code */ +// special frame and chapter numbers from VBI conversion +#define FRAME_NOT_PRESENT -2 // no frame number information present +#define FRAME_LEAD_IN -1 // lead-in code detected +#define FRAME_LEAD_OUT 99999 // lead-out code detected +#define CHAPTER_NOT_PRESENT -2 // no chapter number information present +#define CHAPTER_LEAD_IN -1 // lead-in code detected +#define CHAPTER_LEAD_OUT 100 // lead-out code detected + +// generic head movement speeds; use player-specific information where appropriate +#define GENERIC_SLOW_SPEED (5) // 1/5 normal speed +#define GENERIC_FAST_SPEED (3) // 3x normal speed +#define GENERIC_SCAN_SPEED (50) // 50x normal speed +#define GENERIC_SEARCH_SPEED (5000) // 5000x normal speed + +// generic timings; use player-specific information where appropriate +#define GENERIC_EJECT_TIME (attotime::from_seconds(5)) +#define GENERIC_SPINUP_TIME (attotime::from_seconds(2)) +#define GENERIC_LOAD_TIME (attotime::from_seconds(5)) -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef chd_file *(*laserdisc_get_disc_func)(device_t *device); - -typedef void (*laserdisc_audio_func)(device_t *device, int samplerate, int samples, const INT16 *ch0, const INT16 *ch1); - -typedef void (*vp931_data_ready_func)(device_t *device, int state); - -typedef struct _laserdisc_config laserdisc_config; -struct _laserdisc_config -{ - laserdisc_get_disc_func getdisc; - laserdisc_audio_func audio; - const char * sound; - const char * screen; - - /* overlay information */ - screen_update_func overupdate; - UINT32 overwidth, overheight, overformat; - rectangle overclip; - float overposx, overposy; - float overscalex, overscaley; -}; - - -/*************************************************************************** - DEVICE CONFIGURATION MACROS -***************************************************************************/ - -#define MCFG_LASERDISC_ADD(_tag, _type, _screen, _sound) \ - MCFG_DEVICE_ADD(_tag, _type, 0) \ - MCFG_DEVICE_CONFIG_DATAPTR(laserdisc_config, screen, _screen) \ - MCFG_DEVICE_CONFIG_DATAPTR(laserdisc_config, sound, _sound) \ +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** #define MCFG_LASERDISC_GET_DISC(_func) \ - MCFG_DEVICE_CONFIG_DATAPTR(laserdisc_config, getdisc, _func) + laserdisc_device::static_set_get_disc(*device, _func); \ #define MCFG_LASERDISC_AUDIO(_func) \ - MCFG_DEVICE_CONFIG_DATAPTR(laserdisc_config, audio, _func) + laserdisc_device::static_set_audio(*device, _func); \ + +#define MCFG_LASERDISC_OVERLAY_STATIC(_width, _height, _func) \ + laserdisc_device::static_set_overlay(*device, _width, _height, screen_update_delegate_smart(&screen_update_##_func, "screen_update_" #_func)); \ -#define MCFG_LASERDISC_OVERLAY(_update, _width, _height, _format) \ - MCFG_DEVICE_CONFIG_DATAPTR(laserdisc_config, overupdate, SCREEN_UPDATE_NAME(_update)) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overwidth, _width) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overheight, _height) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overformat, _format) +#define MCFG_LASERDISC_OVERLAY_DRIVER(_width, _height, _class, _method) \ + laserdisc_device::static_set_overlay(*device, _width, _height, screen_update_delegate_smart(&_class::_method, #_class "::" #_method, NULL)); \ + +#define MCFG_LASERDISC_OVERLAY_DEVICE(_width, _height, _device, _class, _method) \ + laserdisc_device::static_set_overlay(*device, _width, _height, screen_update_delegate_smart(&_class::_method, #_class "::" #_method, _device)); \ #define MCFG_LASERDISC_OVERLAY_CLIP(_minx, _maxx, _miny, _maxy) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overclip.min_x, _minx) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overclip.max_x, _maxx) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overclip.min_y, _miny) \ - MCFG_DEVICE_CONFIG_DATA32(laserdisc_config, overclip.max_y, _maxy) + laserdisc_device::static_set_overlay_clip(*device, _minx, _maxx, _miny, _maxy); \ #define MCFG_LASERDISC_OVERLAY_POSITION(_posx, _posy) \ - MCFG_DEVICE_CONFIG_DATAFP32(laserdisc_config, overposx, _posx, 24) \ - MCFG_DEVICE_CONFIG_DATAFP32(laserdisc_config, overposy, _posy, 24) + laserdisc_device::static_set_overlay_position(*device, _posx, _posy); \ #define MCFG_LASERDISC_OVERLAY_SCALE(_scalex, _scaley) \ - MCFG_DEVICE_CONFIG_DATAFP32(laserdisc_config, overscalex, _scalex, 24) \ - MCFG_DEVICE_CONFIG_DATAFP32(laserdisc_config, overscaley, _scaley, 24) + laserdisc_device::static_set_overlay_scale(*device, _scalex, _scaley); \ -/* use these to add laserdisc screens with proper video update parameters */ -#define MCFG_LASERDISC_SCREEN_ADD_NTSC(_tag, _overlayformat) \ +// use these to add laserdisc screens with proper video update parameters +#define MCFG_LASERDISC_SCREEN_ADD_NTSC(_tag, _ldtag) \ + MCFG_DEVICE_MODIFY(_ldtag) \ + laserdisc_device::static_set_screen(*device, _tag); \ MCFG_VIDEO_ATTRIBUTES(VIDEO_SELF_RENDER) \ - \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(_overlayformat) \ MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz*2, 910, 0, 704, 525, 44, 524) \ - MCFG_SCREEN_UPDATE(laserdisc) \ + MCFG_SCREEN_UPDATE_DEVICE(_ldtag, laserdisc_device, screen_update) \ -/* not correct yet; fix me... */ -#define MCFG_LASERDISC_SCREEN_ADD_PAL(_tag, _format) \ +// not correct yet; fix me... +#define MCFG_LASERDISC_SCREEN_ADD_PAL(_tag, _ldtag) \ + MCFG_DEVICE_MODIFY(_ldtag) \ + laserdisc_device::static_set_screen(*device, _tag); \ MCFG_VIDEO_ATTRIBUTES(VIDEO_SELF_RENDER) \ - \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(_format) \ MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz, 910, 0, 704, 525.0/2, 0, 480/2) \ - MCFG_SCREEN_UPDATE(laserdisc) \ - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- core control and status ----- */ - -/* get a bitmap for the current frame; return TRUE if valid or FALSE if video off */ -int laserdisc_get_video(device_t *device, bitmap_t **bitmap); + MCFG_SCREEN_UPDATE_DEVICE(_ldtag, laserdisc_device, screen_update) \ -/* return the raw philips or white flag codes */ -UINT32 laserdisc_get_field_code(device_t *device, UINT32 code, UINT8 zero_if_squelched); +//************************************************************************** +// MACROS +//************************************************************************** -/* ----- input and output ----- */ +#define SCANNING_PARAM(speed,duration) (((speed) << 8) | ((duration) & 0xff)) -/* write to the parallel data port of the player */ -void laserdisc_data_w(device_t *device, UINT8 data); -/* assert or clear a signal line connected to the player */ -void laserdisc_line_w(device_t *device, UINT8 line, UINT8 newstate); -/* read from the parallel data port of the player */ -UINT8 laserdisc_data_r(device_t *device); +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -/* read the state of a signal line connected to the player */ -UINT8 laserdisc_line_r(device_t *device, UINT8 line); +// forward declarations +class laserdisc_device; +// delegates +typedef delegate laserdisc_get_disc_delegate; +typedef delegate laserdisc_audio_delegate; -/* ----- player specifics ----- */ +// ======================> laserdisc_overlay_config -/* specify the "slow" speed of the Pioneer PR-7820 */ -void pr7820_set_slow_speed(device_t *device, double frame_rate_scaler); - -/* set a callback for data ready on the Phillips 22VP931 */ -void vp931_set_data_ready_callback(device_t *device, vp931_data_ready_func callback); - -/* control the audio squelch of the Simutrek modified players */ -void simutrek_set_audio_squelch(device_t *device, int state); - - - -/* ----- video interface ----- */ +// overlay configuration +struct laserdisc_overlay_config +{ + float m_overposx; + float m_overposy; + float m_overscalex; + float m_overscaley; +}; -/* enable/disable the video */ -void laserdisc_video_enable(device_t *device, int enable); -/* enable/disable the overlay */ -void laserdisc_overlay_enable(device_t *device, int enable); +// ======================> laserdisc_device -/* video update callback */ -SCREEN_UPDATE( laserdisc ); +// base laserdisc class +class laserdisc_device : public device_t, + public device_sound_interface, + public laserdisc_overlay_config +{ +protected: + // construction/destruction + laserdisc_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock); + virtual ~laserdisc_device(); + +public: + // reset line control + + // core control and status + bool video_active() { return (!m_videosquelch && current_frame().m_numfields >= 2); } + bitmap_yuy16 &get_video() { return (!video_active()) ? m_emptyframe : current_frame().m_visbitmap; } + UINT32 get_field_code(laserdisc_field_code code, bool zero_if_squelched); + + // video interface + void video_enable(bool enable) { m_videoenable = enable; } + void overlay_enable(bool enable) { m_overenable = enable; } + + // video update callback + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + // configuration + bool overlay_configured() const { return (m_overwidth > 0 && m_overheight > 0 && (!m_overupdate_ind16.isnull() || !m_overupdate_rgb32.isnull())); } + void get_overlay_config(laserdisc_overlay_config &config) { config = static_cast(*this); } + void set_overlay_config(const laserdisc_overlay_config &config) { static_cast(*this) = config; } + + // static configuration helpers + static void static_set_screen(device_t &device, const char *screen); + static void static_set_get_disc(device_t &device, laserdisc_get_disc_delegate callback); + static void static_set_audio(device_t &device, laserdisc_audio_delegate callback); + static void static_set_overlay(device_t &device, UINT32 width, UINT32 height, screen_update_ind16_delegate update); + static void static_set_overlay(device_t &device, UINT32 width, UINT32 height, screen_update_rgb32_delegate update); + static void static_set_overlay_clip(device_t &device, INT32 minx, INT32 maxx, INT32 miny, INT32 maxy); + static void static_set_overlay_position(device_t &device, float posx, float posy); + static void static_set_overlay_scale(device_t &device, float scalex, float scaley); + +protected: + // timer IDs + enum + { + TID_VBI_FETCH, + TID_FIRST_PLAYER_TIMER + }; + + // common laserdisc states + enum player_state + { + LDSTATE_NONE, // unspecified state + LDSTATE_EJECTING, // in the process of ejecting + LDSTATE_EJECTED, // fully ejected + LDSTATE_PARKED, // head parked in lead-in + LDSTATE_LOADING, // loading from ejected state + LDSTATE_SPINUP, // spinning up + LDSTATE_PAUSING, // looking for a frame boundary to pause + LDSTATE_PAUSED, // found a frame boundary; now paused + // parameter specifies the fieldnum of the first frame + LDSTATE_PLAYING, // playing forward normally, with audio + // parameter specifies the target frame, or 0 if none + LDSTATE_PLAYING_SLOW_REVERSE, // playing slow in the reverse direction, with no audio + // parameter specifies the number of times to repeat each track + LDSTATE_PLAYING_SLOW_FORWARD, // playing slow in the forward direction, with no audio + // parameter specifies the number of times to repeat each track + LDSTATE_PLAYING_FAST_REVERSE, // playing fast in the reverse direction, with no audio + // parameter specifies the number of frames to skip backwards after each frame + LDSTATE_PLAYING_FAST_FORWARD, // playing fast in the forward direction, with no audio + // parameter specifies the number of frames to skip forwards after each frame + LDSTATE_STEPPING_REVERSE, // single frame stepping in the reverse direction + LDSTATE_STEPPING_FORWARD, // single frame stepping in the forward direction + LDSTATE_SCANNING, // scanning in the forward or reverse direction + // parameter(0:7) controls how many vsyncs until revert to savestate + // parameter(8:31) specifies the speed + LDSTATE_SEEKING, // seeking to a specific frame + // parameter specifies the target frame + LDSTATE_OTHER // other states start here + }; + + // slider position + enum slider_position + { + SLIDER_MINIMUM, // at the minimum value + SLIDER_VIRTUAL_LEADIN, // within the virtual lead-in area + SLIDER_CHD, // within the boundaries of the CHD + SLIDER_OUTSIDE_CHD, // outside of the CHD area but before the virtual lead-out area + SLIDER_VIRTUAL_LEADOUT, // within the virtual lead-out area + SLIDER_MAXIMUM // at the maximum value + }; + + // information about the current player state + struct player_state_info + { + player_state m_state; // current state + INT32 m_substate; // internal sub-state; starts at 0 on any state change + INT32 m_param; // parameter for current state + attotime m_endtime; // minimum ending time for current state + }; + + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) = 0; + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) = 0; + virtual void player_overlay(bitmap_yuy16 &bitmap) = 0; + + // device-level overrides + virtual void device_start(); + virtual void device_stop(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + // device_sound_interface overrides + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); + + // subclass helpers + screen_device &screen() { assert(m_screen != NULL); return *m_screen; } + void set_audio_squelch(bool squelchleft, bool squelchright) { m_stream->update(); m_audiosquelch = (squelchleft ? 1 : 0) | (squelchright ? 2 : 0); } + void set_video_squelch(bool squelch) { m_videosquelch = squelch; } + void set_slider_speed(INT32 tracks_per_vsync); + void advance_slider(INT32 numtracks); + slider_position get_slider_position(); + INT32 generic_update(const vbi_metadata &vbi, int fieldnum, attotime curtime, player_state_info &curstate); + + // general helpers + bool is_start_of_frame(const vbi_metadata &vbi); + int frame_from_metadata(const vbi_metadata &metadata); + int chapter_from_metadata(const vbi_metadata &metadata); + + player_state_info m_player_state; // active state + player_state_info m_saved_state; // saved state during temporary operations + +private: + // internal type definitions + struct frame_data + { + bitmap_yuy16 m_bitmap; // cached bitmap + bitmap_yuy16 m_visbitmap; // wrapper around bitmap with only visible lines + UINT8 m_numfields; // number of fields in this frame + INT32 m_lastfield; // last absolute field number + }; + + // internal helpers + void init_disc(); + void init_video(); + void init_audio(); + void add_and_clamp_track(INT32 delta) { m_curtrack += delta; m_curtrack = MAX(m_curtrack, 1); m_curtrack = MIN(m_curtrack, m_maxtrack - 1); } + void fillbitmap_yuy16(bitmap_yuy16 &bitmap, UINT8 yval, UINT8 cr, UINT8 cb); + void update_slider_pos(); + void vblank_state_changed(screen_device &screen, bool vblank_state); + frame_data ¤t_frame(); + void read_track_data(); + void process_track_data(); + void config_load(int config_type, xml_data_node *parentnode); + void config_save(int config_type, xml_data_node *parentnode); + + // configuration + laserdisc_get_disc_delegate m_getdisc_callback; + laserdisc_audio_delegate m_audio_callback; // audio streaming callback + const char * m_screen_name; // name of the screen device + laserdisc_overlay_config m_orig_config; // original overlay configuration + UINT32 m_overwidth; // overlay screen width + UINT32 m_overheight; // overlay screen height + rectangle m_overclip; // overlay visarea + screen_update_ind16_delegate m_overupdate_ind16; // overlay update delegate + screen_update_rgb32_delegate m_overupdate_rgb32; // overlay update delegate + + // disc parameters + chd_file * m_disc; // handle to the disc itself + UINT8 * m_vbidata; // pointer to precomputed VBI data + int m_width; // width of video + int m_height; // height of video + UINT32 m_fps_times_1million; // frame rate of video + int m_samplerate; // audio samplerate + chd_error m_readresult; // result of the most recent read + UINT32 m_chdtracks; // number of tracks in the CHD + av_codec_decompress_config m_avconfig; // decompression configuration + + // core states + UINT8 m_audiosquelch; // audio squelch state: bit 0 = audio 1, bit 1 = audio 2 + UINT8 m_videosquelch; // video squelch state: bit 0 = on/off + UINT8 m_fieldnum; // field number (0 or 1) + INT32 m_curtrack; // current track at this end of this vsync + UINT32 m_maxtrack; // maximum track number + attoseconds_t m_attospertrack; // attoseconds per track, or 0 if not moving + attotime m_sliderupdate; // time of last slider update + + // video data + screen_device * m_screen; // pointer to the screen device + frame_data m_frame[3]; // circular list of frames + UINT8 m_videoindex; // index of the current video buffer + bitmap_yuy16 m_emptyframe; // blank frame + + // audio data + sound_stream * m_stream; + INT16 * m_audiobuffer[2]; // buffer for audio samples + UINT32 m_audiobufsize; // size of buffer + UINT32 m_audiobufin; // input index + UINT32 m_audiobufout; // output index + UINT32 m_audiocursamples; // current samples this track + UINT32 m_audiomaxsamples; // maximum samples per track + + // metadata + vbi_metadata m_metadata[2]; // metadata parsed from the stream, for each field + + // video updating + bool m_videoenable; // is video enabled? + render_texture * m_videotex; // texture for the video + palette_t * m_videopalette; // palette for the video + + // overlays + bool m_overenable; // is the overlay enabled? + screen_bitmap m_overbitmap[2]; // overlay bitmaps + int m_overindex; // index of the overlay bitmap + render_texture * m_overtex; // texture for the overlay +}; +// iterator - interface iterator works for subclasses too +typedef device_interface_iterator laserdisc_device_iterator; -/* ----- configuration ----- */ -/* return a copy of the current live configuration settings */ -void laserdisc_get_config(device_t *device, laserdisc_config *config); +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** -/* change the current live configuration settings */ -void laserdisc_set_config(device_t *device, const laserdisc_config *config); +//------------------------------------------------- +// is_start_of_frame - return true if this is +// the start of a frame +//------------------------------------------------- +inline bool laserdisc_device::is_start_of_frame(const vbi_metadata &vbi) +{ + // is it not known if the white flag or the presence of a frame code + // determines the start of frame; the former seems to be the "official" + // way, but the latter seems to be the practical implementation + return (vbi.white || (vbi.line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE); +} -/* ----- device interface ----- */ +//------------------------------------------------- +// frame_from_metadata - return the frame number +// encoded in the metadata, if present, or +// FRAME_NOT_PRESENT +//------------------------------------------------- -/* device get info callback */ -DECLARE_LEGACY_DEVICE(PIONEER_PR7820,pioneer_pr7820); -DECLARE_LEGACY_DEVICE(PIONEER_PR8210,pioneer_pr8210); -DECLARE_LEGACY_DEVICE(SIMUTREK_SPECIAL,simutrek_special); -DECLARE_LEGACY_DEVICE(PIONEER_LDV1000,pioneer_ldv1000); -DECLARE_LEGACY_DEVICE(PHILLIPS_22VP931,phillips_22vp931); -DECLARE_LEGACY_DEVICE(PHILLIPS_22VP932,phillips_22vp932); -DECLARE_LEGACY_DEVICE(SONY_LDP1450,sony_ldp1450); +inline int laserdisc_device::frame_from_metadata(const vbi_metadata &metadata) +{ + if ((metadata.line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + return VBI_CAV_PICTURE(metadata.line1718); + else if (metadata.line1718 == VBI_CODE_LEADIN) + return FRAME_LEAD_IN; + else if (metadata.line1718 == VBI_CODE_LEADOUT) + return FRAME_LEAD_OUT; + return FRAME_NOT_PRESENT; +} -/* audio get info callback */ -DECLARE_LEGACY_SOUND_DEVICE(LASERDISC_SOUND, laserdisc_sound); -/* type setter */ -int laserdisc_get_type(device_t *device); -void laserdisc_set_type(device_t *device, int type); +//------------------------------------------------- +// chapter_from_metadata - return the chapter +// number encoded in the metadata, if present, +// or CHAPTER_NOT_PRESENT +//------------------------------------------------- -INLINE bool device_is_laserdisc(device_t *device) +inline int laserdisc_device::chapter_from_metadata(const vbi_metadata &metadata) { - return(device->type() == PIONEER_PR7820 || - device->type() == PIONEER_PR8210 || - device->type() == SIMUTREK_SPECIAL || - device->type() == PIONEER_LDV1000 || - device->type() == PHILLIPS_22VP931 || - device->type() == PHILLIPS_22VP932 || - device->type() == SONY_LDP1450); + if ((metadata.line1718 & VBI_MASK_CHAPTER) == VBI_CODE_CHAPTER) + return VBI_CHAPTER(metadata.line1718); + else if (metadata.line1718 == VBI_CODE_LEADIN) + return CHAPTER_LEAD_IN; + else if (metadata.line1718 == VBI_CODE_LEADOUT) + return CHAPTER_LEAD_OUT; + return CHAPTER_NOT_PRESENT; } -#endif /* __LASERDSC_H__ */ + +#endif diff -Nru mame-0.144/src/emu/machine/ldcore.c mame-0.145/src/emu/machine/ldcore.c --- mame-0.144/src/emu/machine/ldcore.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/ldcore.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1716 +0,0 @@ -/************************************************************************* - - ldcore.c - - Private core laserdisc player implementation. - - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - -*************************************************************************/ - -#include "emu.h" -#include "ldcore.h" -#include "avcomp.h" -#include "vbiparse.h" -#include "config.h" -#include "render.h" - - - -/*************************************************************************** - DEBUGGING -***************************************************************************/ - -#define LOG_SLIDER 0 - - - -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* these specs code from IEC 60857, for NTSC players */ -#define LEAD_IN_MIN_RADIUS_IN_UM 53500 /* 53.5 mm */ -#define PROGRAM_MIN_RADIUS_IN_UM 55000 /* 55 mm */ -#define PROGRAM_MAX_RADIUS_IN_UM 145000 /* 145 mm */ -#define LEAD_OUT_MIN_SIZE_IN_UM 2000 /* 2 mm */ - -/* the track pitch is defined as a range; we pick a nominal pitch - that ensures we can fit 54,000 tracks */ -#define MIN_TRACK_PITCH_IN_NM 1400 /* 1.4 um */ -#define MAX_TRACK_PITCH_IN_NM 2000 /* 2 um */ -#define NOMINAL_TRACK_PITCH_IN_NM ((PROGRAM_MAX_RADIUS_IN_UM - PROGRAM_MIN_RADIUS_IN_UM) * 1000 / 54000) - -/* we simulate extra lead-in and lead-out tracks */ -#define VIRTUAL_LEAD_IN_TRACKS ((PROGRAM_MIN_RADIUS_IN_UM - LEAD_IN_MIN_RADIUS_IN_UM) * 1000 / NOMINAL_TRACK_PITCH_IN_NM) -#define MAX_TOTAL_TRACKS 54000 -#define VIRTUAL_LEAD_OUT_TRACKS (LEAD_OUT_MIN_SIZE_IN_UM * 1000 / NOMINAL_TRACK_PITCH_IN_NM) - - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* video frame data */ -typedef struct _frame_data frame_data; -struct _frame_data -{ - bitmap_t * bitmap; /* cached bitmap */ - bitmap_t * visbitmap; /* wrapper around bitmap with only visible lines */ - UINT8 numfields; /* number of fields in this frame */ - INT32 lastfield; /* last absolute field number */ -}; - - -/* core-specific data */ -struct _ldcore_data -{ - /* general config */ - laserdisc_config config; /* copy of the inline config */ - ldplayer_interface intf; /* interface to the player */ - - /* disc parameters */ - chd_file * disc; /* handle to the disc itself */ - UINT8 * vbidata; /* pointer to precomputed VBI data */ - int width; /* width of video */ - int height; /* height of video */ - UINT32 fps_times_1million; /* frame rate of video */ - int samplerate; /* audio samplerate */ - chd_error readresult; /* result of the most recent read */ - UINT32 chdtracks; /* number of tracks in the CHD */ - av_codec_decompress_config avconfig; /* decompression configuration */ - - /* core states */ - UINT8 audiosquelch; /* audio squelch state: bit 0 = audio 1, bit 1 = audio 2 */ - UINT8 videosquelch; /* video squelch state: bit 0 = on/off */ - UINT8 fieldnum; /* field number (0 or 1) */ - INT32 curtrack; /* current track at this end of this vsync */ - UINT32 maxtrack; /* maximum track number */ - attoseconds_t attospertrack; /* attoseconds per track, or 0 if not moving */ - attotime sliderupdate; /* time of last slider update */ - - /* video data */ - frame_data frame[3]; /* circular list of frames */ - UINT8 videoindex; /* index of the current video buffer */ - bitmap_t videotarget; /* fake target bitmap for decompression */ - bitmap_t * emptyframe; /* blank frame */ - - /* audio data */ - INT16 * audiobuffer[2]; /* buffer for audio samples */ - UINT32 audiobufsize; /* size of buffer */ - UINT32 audiobufin; /* input index */ - UINT32 audiobufout; /* output index */ - UINT32 audiocursamples; /* current samples this track */ - UINT32 audiomaxsamples; /* maximum samples per track */ - device_t *audiocustom; /* custom sound device */ - - /* metadata */ - vbi_metadata metadata[2]; /* metadata parsed from the stream, for each field */ - - /* I/O data */ - UINT8 datain; /* current input data value */ - UINT8 linein[LASERDISC_INPUT_LINES]; /* current input line state */ - UINT8 dataout; /* current output data value */ - UINT8 lineout[LASERDISC_OUTPUT_LINES]; /* current output line state */ - - /* video updating */ - UINT8 videoenable; /* is video enabled? */ - render_texture * videotex; /* texture for the video */ - palette_t * videopalette; /* palette for the video */ - UINT8 overenable; /* is the overlay enabled? */ - bitmap_t * overbitmap[2]; /* overlay bitmaps */ - int overindex; /* index of the overlay bitmap */ - render_texture * overtex; /* texture for the overlay */ -}; - - -/* sound callback info */ -typedef struct _sound_token sound_token; -struct _sound_token -{ - sound_stream * stream; - laserdisc_state * ld; -}; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -/* generic helper functions */ -static TIMER_CALLBACK( perform_player_update ); -static void read_track_data(laserdisc_state *ld); -static void process_track_data(device_t *device); -static DEVICE_START( laserdisc_sound ); -static STREAM_UPDATE( custom_stream_callback ); -static void configuration_load(device_t *device, int config_type, xml_data_node *parentnode); -static void configuration_save(device_t *device, int config_type, xml_data_node *parentnode); - - - -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - get_safe_token - makes sure that the passed - in device is, in fact, a laserdisc device --------------------------------------------------*/ - -INLINE laserdisc_state *get_safe_token(device_t *device) -{ - assert(device != NULL); - assert(device_is_laserdisc(device)); - - return (laserdisc_state *)downcast(device)->token(); -} - - -/*------------------------------------------------- - update_audio - update the audio stream to the - current time --------------------------------------------------*/ - -INLINE void update_audio(laserdisc_state *ld) -{ - ldcore_data *ldcore = ld->core; - if (ldcore->audiocustom != NULL) - { - sound_token *token = (sound_token *)downcast(ldcore->audiocustom)->token(); - token->stream->update(); - } -} - - -/*------------------------------------------------- - add_and_clamp_track - add a delta to the - current track and clamp to minimum/maximum - values --------------------------------------------------*/ - -INLINE void add_and_clamp_track(ldcore_data *ldcore, INT32 delta) -{ - ldcore->curtrack += delta; - ldcore->curtrack = MAX(ldcore->curtrack, 1); - ldcore->curtrack = MIN(ldcore->curtrack, ldcore->maxtrack - 1); -} - - -/*------------------------------------------------- - fillbitmap_yuy16 - fill a YUY16 bitmap with a - given color pattern --------------------------------------------------*/ - -INLINE void fillbitmap_yuy16(bitmap_t *bitmap, UINT8 yval, UINT8 cr, UINT8 cb) -{ - UINT16 color0 = (yval << 8) | cb; - UINT16 color1 = (yval << 8) | cr; - int x, y; - - /* write 32 bits of color (2 pixels at a time) */ - for (y = 0; y < bitmap->height; y++) - { - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - for (x = 0; x < bitmap->width / 2; x++) - { - *dest++ = color0; - *dest++ = color1; - } - } -} - - - -/*************************************************************************** - GENERIC IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - update_slider_pos - based on the current - speed and elapsed time, update the current - track position --------------------------------------------------*/ - -static void update_slider_pos(ldcore_data *ldcore, attotime curtime) -{ - /* if not moving, update to now */ - if (ldcore->attospertrack == 0) - ldcore->sliderupdate = curtime; - - /* otherwise, compute the number of tracks covered */ - else - { - attoseconds_t delta = (curtime - ldcore->sliderupdate).as_attoseconds(); - INT32 tracks_covered; - - /* determine how many tracks we covered and advance */ - if (ldcore->attospertrack >= 0) - { - tracks_covered = delta / ldcore->attospertrack; - add_and_clamp_track(ldcore, tracks_covered); - if (tracks_covered != 0) - ldcore->sliderupdate += attotime(0, tracks_covered * ldcore->attospertrack); - } - else - { - tracks_covered = delta / -ldcore->attospertrack; - add_and_clamp_track(ldcore, -tracks_covered); - if (tracks_covered != 0) - ldcore->sliderupdate += attotime(0, tracks_covered * -ldcore->attospertrack); - } - } -} - - -/*------------------------------------------------- - vblank_state_changed - called on each state - change of the VBLANK signal --------------------------------------------------*/ - -static void vblank_state_changed(device_t *device, screen_device &screen, bool vblank_state) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - attotime curtime = screen.machine().time(); - - /* update current track based on slider speed */ - update_slider_pos(ldcore, curtime); - - /* on rising edge, process previously-read frame and inform the player */ - if (vblank_state) - { - /* call the player's VSYNC callback */ - if (ldcore->intf.vsync != NULL) - (*ldcore->intf.vsync)(ld, &ldcore->metadata[ldcore->fieldnum], ldcore->fieldnum, curtime); - - /* set a timer to begin fetching the next frame just before the VBI data would be fetched */ - screen.machine().scheduler().timer_set(screen.time_until_pos(16*2), FUNC(perform_player_update), 0, ld); - } -} - - -/*------------------------------------------------- - vblank_state_changed - called on each state - change of the VBLANK signal --------------------------------------------------*/ - -static TIMER_CALLBACK( perform_player_update ) -{ - laserdisc_state *ld = (laserdisc_state *)ptr; - ldcore_data *ldcore = ld->core; - attotime curtime = machine.time(); - - /* wait for previous read and decode to finish */ - process_track_data(ld->device); - - /* update current track based on slider speed */ - update_slider_pos(ldcore, curtime); - - /* update the state */ - if (ldcore->intf.update != NULL) - add_and_clamp_track(ldcore, (*ldcore->intf.update)(ld, &ldcore->metadata[ldcore->fieldnum], ldcore->fieldnum, curtime)); - - /* flush any audio before we read more */ - update_audio(ld); - - /* start reading the track data for the next round */ - ldcore->fieldnum ^= 1; - read_track_data(ld); -} - - -/*------------------------------------------------- - laserdisc_data_w - write data to the given - laserdisc player --------------------------------------------------*/ - -void laserdisc_data_w(device_t *device, UINT8 data) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - UINT8 prev = ldcore->datain; - ldcore->datain = data; - - /* call through to the player-specific write handler */ - if (ldcore->intf.writedata != NULL) - (*ldcore->intf.writedata)(ld, prev, data); -} - - -/*------------------------------------------------- - laserdisc_line_w - control an input line --------------------------------------------------*/ - -void laserdisc_line_w(device_t *device, UINT8 line, UINT8 newstate) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - - assert(line < LASERDISC_INPUT_LINES); - assert(newstate == ASSERT_LINE || newstate == CLEAR_LINE || newstate == PULSE_LINE); - - /* assert */ - if (newstate == ASSERT_LINE || newstate == PULSE_LINE) - { - if (ldcore->linein[line] != ASSERT_LINE) - { - /* call through to the player-specific line handler */ - if (ldcore->intf.writeline[line] != NULL) - (*ldcore->intf.writeline[line])(ld, CLEAR_LINE, ASSERT_LINE); - } - ldcore->linein[line] = ASSERT_LINE; - } - - /* deassert */ - if (newstate == CLEAR_LINE || newstate == PULSE_LINE) - { - if (ldcore->linein[line] != CLEAR_LINE) - { - /* call through to the player-specific line handler */ - if (ldcore->intf.writeline[line] != NULL) - (*ldcore->intf.writeline[line])(ld, ASSERT_LINE, CLEAR_LINE); - } - ldcore->linein[line] = CLEAR_LINE; - } -} - - -/*------------------------------------------------- - laserdisc_data_r - return the current - data byte --------------------------------------------------*/ - -UINT8 laserdisc_data_r(device_t *device) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - UINT8 result = ldcore->dataout; - - /* call through to the player-specific data handler */ - if (ldcore->intf.readdata != NULL) - result = (*ldcore->intf.readdata)(ld); - - return result; -} - - -/*------------------------------------------------- - laserdisc_line_r - return the current state - of an output line --------------------------------------------------*/ - -UINT8 laserdisc_line_r(device_t *device, UINT8 line) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - UINT8 result; - - assert(line < LASERDISC_OUTPUT_LINES); - result = ldcore->lineout[line]; - - /* call through to the player-specific data handler */ - if (ldcore->intf.readline[line] != NULL) - result = (*ldcore->intf.readline[line])(ld); - - return result; -} - - -/*------------------------------------------------- - laserdisc_get_video - return the current - video frame; return TRUE if valid or FALSE - if video off --------------------------------------------------*/ - -int laserdisc_get_video(device_t *device, bitmap_t **bitmap) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - frame_data *frame; - - /* determine the most recent live set of frames */ - frame = &ldcore->frame[ldcore->videoindex]; - if (frame->numfields < 2) - frame = &ldcore->frame[(ldcore->videoindex + ARRAY_LENGTH(ldcore->frame) - 1) % ARRAY_LENGTH(ldcore->frame)]; - - /* if no video present, return the empty frame */ - if (ldcore->videosquelch || frame->numfields < 2) - { - *bitmap = ldcore->emptyframe; - return FALSE; - } - else - { - *bitmap = frame->visbitmap; - return TRUE; - } -} - - -/*------------------------------------------------- - laserdisc_get_field_code - return raw field - information read from the disc --------------------------------------------------*/ - -UINT32 laserdisc_get_field_code(device_t *device, UINT32 code, UINT8 zero_if_squelched) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - int field = ldcore->fieldnum; - - /* return nothing if the video is off (external devices can't sense) */ - if (zero_if_squelched && ldcore->videosquelch) - return 0; - - switch (code) - { - case LASERDISC_CODE_WHITE_FLAG: - return ldcore->metadata[field].white; - - case LASERDISC_CODE_LINE16: - return ldcore->metadata[field].line16; - - case LASERDISC_CODE_LINE17: - return ldcore->metadata[field].line17; - - case LASERDISC_CODE_LINE18: - return ldcore->metadata[field].line18; - - case LASERDISC_CODE_LINE1718: - return ldcore->metadata[field].line1718; - } - - return 0; -} - - - -/*************************************************************************** - PLAYER-TO-CORE INTERFACES -***************************************************************************/ - -/*------------------------------------------------- - ldcore_get_safe_token - return a token with - type checking from a device --------------------------------------------------*/ - -laserdisc_state *ldcore_get_safe_token(device_t *device) -{ - return get_safe_token(device); -} - - -/*------------------------------------------------- - ldcore_set_audio_squelch - set the left/right - audio squelch states --------------------------------------------------*/ - -void ldcore_set_audio_squelch(laserdisc_state *ld, UINT8 squelchleft, UINT8 squelchright) -{ - update_audio(ld); - ld->core->audiosquelch = (squelchleft ? 1 : 0) | (squelchright ? 2 : 0); -} - - -/*------------------------------------------------- - ldcore_set_video_squelch - set the video - squelch state --------------------------------------------------*/ - -void ldcore_set_video_squelch(laserdisc_state *ld, UINT8 squelch) -{ - ld->core->videosquelch = squelch; -} - - -/*------------------------------------------------- - ldcore_set_slider_speed - dynamically change - the slider speed --------------------------------------------------*/ - -void ldcore_set_slider_speed(laserdisc_state *ld, INT32 tracks_per_vsync) -{ - ldcore_data *ldcore = ld->core; - attotime vsyncperiod = ld->screen->frame_period(); - - update_slider_pos(ldcore, ld->device->machine().time()); - - /* if 0, set the time to 0 */ - if (tracks_per_vsync == 0) - ldcore->attospertrack = 0; - - /* positive values store positive times */ - else if (tracks_per_vsync > 0) - ldcore->attospertrack = (vsyncperiod / tracks_per_vsync).as_attoseconds(); - - /* negative values store negative times */ - else - ldcore->attospertrack = -(vsyncperiod / -tracks_per_vsync).as_attoseconds(); - - if (LOG_SLIDER) - printf("Slider speed = %d\n", tracks_per_vsync); -} - - -/*------------------------------------------------- - ldcore_advance_slider - advance the slider by - a certain number of tracks --------------------------------------------------*/ - -void ldcore_advance_slider(laserdisc_state *ld, INT32 numtracks) -{ - ldcore_data *ldcore = ld->core; - - update_slider_pos(ldcore, ld->device->machine().time()); - add_and_clamp_track(ldcore, numtracks); - if (LOG_SLIDER) - printf("Advance by %d\n", numtracks); -} - - -/*------------------------------------------------- - ldcore_get_slider_position - get the current - slider position --------------------------------------------------*/ - -slider_position ldcore_get_slider_position(laserdisc_state *ld) -{ - ldcore_data *ldcore = ld->core; - - /* update the slider position first */ - update_slider_pos(ldcore, ld->device->machine().time()); - - /* return the status */ - if (ldcore->curtrack == 1) - return SLIDER_MINIMUM; - else if (ldcore->curtrack < VIRTUAL_LEAD_IN_TRACKS) - return SLIDER_VIRTUAL_LEADIN; - else if (ldcore->curtrack < VIRTUAL_LEAD_IN_TRACKS + ldcore->chdtracks) - return SLIDER_CHD; - else if (ldcore->curtrack < VIRTUAL_LEAD_IN_TRACKS + MAX_TOTAL_TRACKS) - return SLIDER_OUTSIDE_CHD; - else if (ldcore->curtrack < ldcore->maxtrack - 1) - return SLIDER_VIRTUAL_LEADOUT; - else - return SLIDER_MAXIMUM; -} - - - -/*************************************************************************** - GENERIC HELPER FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - ldcore_generic_update - generically update in - a way that works for most situations --------------------------------------------------*/ - -INT32 ldcore_generic_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime, ldplayer_state *newstate) -{ - INT32 advanceby = 0; - int frame; - - /* start by assuming the state doesn't change */ - *newstate = ld->state; - - /* handle things based on the state */ - switch (ld->state.state) - { - case LDSTATE_EJECTING: - /* when time expires, switch to the ejected state */ - if (curtime >= ld->state.endtime) - newstate->state = LDSTATE_EJECTED; - break; - - case LDSTATE_EJECTED: - /* do nothing */ - break; - - case LDSTATE_PARKED: - /* do nothing */ - break; - - case LDSTATE_LOADING: - /* when time expires, switch to the spinup state */ - if (curtime >= ld->state.endtime) - newstate->state = LDSTATE_SPINUP; - advanceby = -GENERIC_SEARCH_SPEED; - break; - - case LDSTATE_SPINUP: - /* when time expires, switch to the playing state */ - if (curtime >= ld->state.endtime) - newstate->state = LDSTATE_PLAYING; - advanceby = -GENERIC_SEARCH_SPEED; - break; - - case LDSTATE_PAUSING: - /* if he hit the start of a frame, switch to paused state */ - if (is_start_of_frame(vbi)) - { - newstate->state = LDSTATE_PAUSED; - newstate->param = fieldnum; - } - - /* else advance until we hit it */ - else if (fieldnum == 1) - advanceby = 1; - break; - - case LDSTATE_PAUSED: - /* if we paused on field 1, we must flip back and forth */ - if (ld->state.param == 1) - advanceby = (fieldnum == 1) ? 1 : -1; - break; - - case LDSTATE_PLAYING: - /* if we hit the target frame, switch to the paused state */ - if (ld->state.param > 0 && is_start_of_frame(vbi) && frame_from_metadata(vbi) == ld->state.param) - { - newstate->state = LDSTATE_PAUSED; - newstate->param = fieldnum; - } - - /* otherwise after the second field of each frame */ - else if (fieldnum == 1) - advanceby = 1; - break; - - case LDSTATE_PLAYING_SLOW_REVERSE: - /* after the second field of each frame, see if we need to advance */ - if (fieldnum == 1 && ++ld->state.substate > ld->state.param) - { - advanceby = -1; - ld->state.substate = 0; - } - break; - - case LDSTATE_PLAYING_SLOW_FORWARD: - /* after the second field of each frame, see if we need to advance */ - if (fieldnum == 1 && ++ld->state.substate > ld->state.param) - { - advanceby = 1; - ld->state.substate = 0; - } - break; - - case LDSTATE_PLAYING_FAST_REVERSE: - /* advance after the second field of each frame */ - if (fieldnum == 1) - advanceby = -ld->state.param; - break; - - case LDSTATE_PLAYING_FAST_FORWARD: - /* advance after the second field of each frame */ - if (fieldnum == 1) - advanceby = ld->state.param; - break; - - case LDSTATE_SCANNING: - /* advance after the second field of each frame */ - if (fieldnum == 1) - advanceby = ld->state.param >> 8; - - /* after we run out of vsyncs, revert to the saved state */ - if (++ld->state.substate >= (ld->state.param & 0xff)) - *newstate = ld->savestate; - break; - - case LDSTATE_STEPPING_REVERSE: - /* wait for the first field of the frame and then leap backwards */ - if (is_start_of_frame(vbi)) - { - advanceby = (fieldnum == 1) ? -1 : -2; - newstate->state = LDSTATE_PAUSING; - } - break; - - case LDSTATE_STEPPING_FORWARD: - /* wait for the first field of the frame and then switch to pausing state */ - if (is_start_of_frame(vbi)) - newstate->state = LDSTATE_PAUSING; - break; - - case LDSTATE_SEEKING: - /* if we're in the final state, look for a matching frame and pause there */ - frame = frame_from_metadata(vbi); - if (ld->state.substate == 1 && is_start_of_frame(vbi) && frame == ld->state.param) - { - newstate->state = LDSTATE_PAUSED; - newstate->param = fieldnum; - } - - /* otherwise, if we got frame data from the VBI, update our seeking logic */ - else if (ld->state.substate == 0 && frame != FRAME_NOT_PRESENT) - { - INT32 delta = (ld->state.param - 2) - frame; - - /* if we're within a couple of frames, just play until we hit it */ - if (delta >= 0 && delta <= 2) - ld->state.substate++; - - /* otherwise, compute the delta assuming 1:1 track to frame; this will correct eventually */ - else - { - if (delta < 0) - delta--; - advanceby = delta; - advanceby = MIN(advanceby, GENERIC_SEARCH_SPEED); - advanceby = MAX(advanceby, -GENERIC_SEARCH_SPEED); - } - } - - /* otherwise, keep advancing until we know what's up */ - else - { - if (fieldnum == 1) - advanceby = 1; - } - break; - } - - return advanceby; -} - - -/*------------------------------------------------- - read_track_data - read and process data for - a particular video track --------------------------------------------------*/ - -static void read_track_data(laserdisc_state *ld) -{ - ldcore_data *ldcore = ld->core; - UINT32 tracknum = ldcore->curtrack; - UINT32 fieldnum = ldcore->fieldnum; - vbi_metadata vbidata = { 0 }; - frame_data *frame; - UINT32 vbiframe; - UINT32 readhunk; - INT32 chdtrack; - - /* compute the chdhunk number we are going to read */ - chdtrack = tracknum - 1 - VIRTUAL_LEAD_IN_TRACKS; - chdtrack = MAX(chdtrack, 0); - chdtrack = MIN(chdtrack, ldcore->chdtracks - 1); - readhunk = chdtrack * 2 + fieldnum; - - /* cheat and look up the metadata we are about to retrieve */ - if (ldcore->vbidata != NULL) - vbi_metadata_unpack(&vbidata, NULL, &ldcore->vbidata[readhunk * VBI_PACKED_BYTES]); - - /* if we're in the lead-in area, force the VBI data to be standard lead-in */ - if (tracknum - 1 < VIRTUAL_LEAD_IN_TRACKS) - { - vbidata.line16 = 0; - vbidata.line17 = vbidata.line18 = vbidata.line1718 = VBI_CODE_LEADIN; - } -//printf("track %5d.%d: %06X %06X %06X\n", tracknum, fieldnum, vbidata.line16, vbidata.line17, vbidata.line18); - - /* if we're about to read the first field in a frame, advance */ - frame = &ldcore->frame[ldcore->videoindex]; - if ((vbidata.line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - { - if (frame->numfields >= 2) - ldcore->videoindex = (ldcore->videoindex + 1) % ARRAY_LENGTH(ldcore->frame); - frame = &ldcore->frame[ldcore->videoindex]; - frame->numfields = 0; - } - - /* if we're squelched, reset the frame counter */ - if (ldcore->videosquelch) - frame->numfields = 0; - - /* remember the last field number */ - frame->lastfield = tracknum * 2 + fieldnum; - - /* set the video target information */ - ldcore->videotarget.alloc = NULL; - ldcore->videotarget.base = BITMAP_ADDR16(frame->bitmap, fieldnum, 0); - ldcore->videotarget.rowpixels = frame->bitmap->rowpixels * 2; - ldcore->videotarget.width = frame->bitmap->width; - ldcore->videotarget.height = frame->bitmap->height / 2; - ldcore->videotarget.format = frame->bitmap->format; - ldcore->videotarget.bpp = frame->bitmap->bpp; - ldcore->videotarget.palette = frame->bitmap->palette; - ldcore->videotarget.cliprect = frame->bitmap->cliprect; - ldcore->avconfig.video = &ldcore->videotarget; - - /* set the audio target information */ - if (ldcore->audiobufin + ldcore->audiomaxsamples <= ldcore->audiobufsize) - { - /* if we can fit without wrapping, just read the data directly */ - ldcore->avconfig.audio[0] = &ldcore->audiobuffer[0][ldcore->audiobufin]; - ldcore->avconfig.audio[1] = &ldcore->audiobuffer[1][ldcore->audiobufin]; - } - else - { - /* otherwise, read to the beginning of the buffer */ - ldcore->avconfig.audio[0] = &ldcore->audiobuffer[0][0]; - ldcore->avconfig.audio[1] = &ldcore->audiobuffer[1][0]; - } - - /* override if we're not decoding */ - ldcore->avconfig.maxsamples = ldcore->audiomaxsamples; - ldcore->avconfig.actsamples = &ldcore->audiocursamples; - ldcore->audiocursamples = 0; - - /* set the VBI data for the new field from our precomputed data */ - if (ldcore->vbidata != NULL) - vbi_metadata_unpack(&ldcore->metadata[fieldnum], &vbiframe, &ldcore->vbidata[readhunk * VBI_PACKED_BYTES]); - - /* if we're in the lead-in area, force the VBI data to be standard lead-in */ - if (tracknum - 1 < VIRTUAL_LEAD_IN_TRACKS) - { - ldcore->metadata[fieldnum].line16 = 0; - ldcore->metadata[fieldnum].line17 = ldcore->metadata[fieldnum].line18 = ldcore->metadata[fieldnum].line1718 = VBI_CODE_LEADIN; - } - - /* configure the codec and then read */ - ldcore->readresult = CHDERR_FILE_NOT_FOUND; - if (ldcore->disc != NULL && !ldcore->videosquelch) - { - ldcore->readresult = chd_codec_config(ldcore->disc, AV_CODEC_DECOMPRESS_CONFIG, &ldcore->avconfig); - if (ldcore->readresult == CHDERR_NONE) - ldcore->readresult = chd_read_async(ldcore->disc, readhunk, NULL); - } -} - - -/*------------------------------------------------- - process_track_data - process data from a - track after it has been read --------------------------------------------------*/ - -static void process_track_data(device_t *device) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - - /* wait for the async operation to complete */ - if (ldcore->readresult == CHDERR_OPERATION_PENDING) - ldcore->readresult = chd_async_complete(ldcore->disc); - - /* remove the video if we had an error */ - if (ldcore->readresult != CHDERR_NONE) - ldcore->avconfig.video = NULL; - - /* count the field as read if we are successful */ - if (ldcore->avconfig.video != NULL) - ldcore->frame[ldcore->videoindex].numfields++; - - /* render the display if present */ - if (ldcore->avconfig.video != NULL && ldcore->intf.overlay != NULL) - (*ldcore->intf.overlay)(ld, ldcore->avconfig.video); - - /* pass the audio to the callback */ - if (ldcore->config.audio != NULL) - (*ldcore->config.audio)(device, ldcore->samplerate, ldcore->audiocursamples, ldcore->avconfig.audio[0], ldcore->avconfig.audio[1]); - - /* shift audio data if we read it into the beginning of the buffer */ - if (ldcore->audiocursamples != 0 && ldcore->audiobufin != 0) - { - int chnum; - - /* iterate over channels */ - for (chnum = 0; chnum < 2; chnum++) - if (ldcore->avconfig.audio[chnum] == &ldcore->audiobuffer[chnum][0]) - { - int samplesleft; - - /* move data to the end */ - samplesleft = ldcore->audiobufsize - ldcore->audiobufin; - samplesleft = MIN(samplesleft, ldcore->audiocursamples); - memmove(&ldcore->audiobuffer[chnum][ldcore->audiobufin], &ldcore->audiobuffer[chnum][0], samplesleft * 2); - - /* shift data at the beginning */ - if (samplesleft < ldcore->audiocursamples) - memmove(&ldcore->audiobuffer[chnum][0], &ldcore->audiobuffer[chnum][samplesleft], (ldcore->audiocursamples - samplesleft) * 2); - } - } - - /* update the input buffer pointer */ - ldcore->audiobufin = (ldcore->audiobufin + ldcore->audiocursamples) % ldcore->audiobufsize; -} - - -/*------------------------------------------------- - laserdisc_sound_start - custom audio start - for laserdiscs --------------------------------------------------*/ - -static DEVICE_START( laserdisc_sound ) -{ - sound_token *token = (sound_token *)downcast(device)->token(); - token->stream = device->machine().sound().stream_alloc(*device, 0, 2, 48000, token, custom_stream_callback); - token->ld = NULL; -} - - -/*------------------------------------------------- - laserdisc_sound_get_info - information - callback for laserdisc audio --------------------------------------------------*/ - -DEVICE_GET_INFO( laserdisc_sound ) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(sound_token); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(laserdisc_sound);break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Laserdisc Analog"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - } -} - - -/*------------------------------------------------- - custom_stream_callback - audio streamer - for laserdiscs --------------------------------------------------*/ - -static STREAM_UPDATE( custom_stream_callback ) -{ - sound_token *token = (sound_token *)param; - laserdisc_state *ld = token->ld; - ldcore_data *ldcore = ld->core; - stream_sample_t *dst0 = outputs[0]; - stream_sample_t *dst1 = outputs[1]; - INT16 leftand, rightand; - int samples_avail = 0; - - /* compute AND values based on the squelch */ - leftand = (ldcore->audiosquelch & 1) ? 0x0000 : 0xffff; - rightand = (ldcore->audiosquelch & 2) ? 0x0000 : 0xffff; - - /* see if we have enough samples to fill the buffer; if not, drop out */ - samples_avail = ldcore->audiobufin - ldcore->audiobufout; - if (samples_avail < 0) - samples_avail += ldcore->audiobufsize; - - /* if no attached ld, just clear the buffers */ - if (samples_avail < samples) - { - memset(dst0, 0, samples * sizeof(dst0[0])); - memset(dst1, 0, samples * sizeof(dst1[0])); - } - - /* otherwise, stream from our buffer */ - else - { - INT16 *buffer0 = ldcore->audiobuffer[0]; - INT16 *buffer1 = ldcore->audiobuffer[1]; - int sampout = ldcore->audiobufout; - - /* copy samples, clearing behind us as we go */ - while (sampout != ldcore->audiobufin && samples-- > 0) - { - *dst0++ = buffer0[sampout] & leftand; - *dst1++ = buffer1[sampout] & rightand; - buffer0[sampout] = 0; - buffer1[sampout] = 0; - sampout++; - if (sampout >= ldcore->audiobufsize) - sampout = 0; - } - ldcore->audiobufout = sampout; - - /* clear out the rest of the buffer */ - if (samples > 0) - { - sampout = (ldcore->audiobufout == 0) ? ldcore->audiobufsize - 1 : ldcore->audiobufout - 1; - stream_sample_t fill0 = buffer0[sampout] & leftand; - stream_sample_t fill1 = buffer1[sampout] & rightand; - - while (samples-- > 0) - { - *dst0++ = fill0; - *dst1++ = fill1; - } - } - } -} - - - -/*************************************************************************** - CONFIG SETTINGS ACCESS -***************************************************************************/ - -/*------------------------------------------------- - configuration_load - read and apply data from - the configuration file --------------------------------------------------*/ - -static void configuration_load(device_t *device, int config_type, xml_data_node *parentnode) -{ - xml_data_node *overnode; - xml_data_node *ldnode; - - /* we only care about game files */ - if (config_type != CONFIG_TYPE_GAME) - return; - - /* might not have any data */ - if (parentnode == NULL) - return; - - /* iterate over overlay nodes */ - for (ldnode = xml_get_sibling(parentnode->child, "device"); ldnode != NULL; ldnode = xml_get_sibling(ldnode->next, "device")) - { - const char *devtag = xml_get_attribute_string(ldnode, "tag", ""); - if (strcmp(devtag,device->tag()) == 0) - { - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - - /* handle the overlay node */ - overnode = xml_get_sibling(ldnode->child, "overlay"); - if (overnode != NULL) - { - /* fetch positioning controls */ - ldcore->config.overposx = xml_get_attribute_float(overnode, "hoffset", ldcore->config.overposx); - ldcore->config.overscalex = xml_get_attribute_float(overnode, "hstretch", ldcore->config.overscalex); - ldcore->config.overposy = xml_get_attribute_float(overnode, "voffset", ldcore->config.overposy); - ldcore->config.overscaley = xml_get_attribute_float(overnode, "vstretch", ldcore->config.overscaley); - } - } - } -} - - -/*------------------------------------------------- - configuration_save - save data to the - configuration file --------------------------------------------------*/ - -static void configuration_save(device_t *device, int config_type, xml_data_node *parentnode) -{ - /* we only care about game files */ - if (config_type != CONFIG_TYPE_GAME) - return; - - laserdisc_config *origconfig = (laserdisc_config *)downcast(device)->inline_config(); - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - xml_data_node *overnode; - xml_data_node *ldnode; - - /* create a node */ - ldnode = xml_add_child(parentnode, "device", NULL); - if (ldnode != NULL) - { - int changed = FALSE; - - /* output the basics */ - xml_set_attribute(ldnode, "tag", device->tag()); - - /* add an overlay node */ - overnode = xml_add_child(ldnode, "overlay", NULL); - if (overnode != NULL) - { - /* output the positioning controls */ - if (ldcore->config.overposx != origconfig->overposx) - { - xml_set_attribute_float(overnode, "hoffset", ldcore->config.overposx); - changed = TRUE; - } - - if (ldcore->config.overscalex != origconfig->overscalex) - { - xml_set_attribute_float(overnode, "hstretch", ldcore->config.overscalex); - changed = TRUE; - } - - if (ldcore->config.overposy != origconfig->overposy) - { - xml_set_attribute_float(overnode, "voffset", ldcore->config.overposy); - changed = TRUE; - } - - if (ldcore->config.overscaley != origconfig->overscaley) - { - xml_set_attribute_float(overnode, "vstretch", ldcore->config.overscaley); - changed = TRUE; - } - } - - /* if nothing changed, kill the node */ - if (!changed) - xml_delete_node(ldnode); - } -} - - - -/*************************************************************************** - VIDEO INTERFACE -***************************************************************************/ - -/*------------------------------------------------- - laserdisc_video_enable - enable/disable the - video --------------------------------------------------*/ - -void laserdisc_video_enable(device_t *device, int enable) -{ - laserdisc_state *ld = get_safe_token(device); - ld->core->videoenable = enable; -} - - -/*------------------------------------------------- - laserdisc_video_enable - enable/disable the - video --------------------------------------------------*/ - -void laserdisc_overlay_enable(device_t *device, int enable) -{ - laserdisc_state *ld = get_safe_token(device); - ld->core->overenable = enable; -} - - -/*------------------------------------------------- - video update callback --------------------------------------------------*/ - -SCREEN_UPDATE( laserdisc ) -{ - device_t *laserdisc = screen->machine().device("laserdisc"); // TODO: allow more than one laserdisc - if (laserdisc != NULL) - { - const rectangle &visarea = screen->visible_area(); - laserdisc_state *ld = (laserdisc_state *)downcast(laserdisc)->token(); - ldcore_data *ldcore = ld->core; - bitmap_t *overbitmap = ldcore->overbitmap[ldcore->overindex]; - bitmap_t *vidbitmap = NULL; - - /* handle the overlay if present */ - if (overbitmap != NULL && ldcore->config.overupdate != NULL) - { - rectangle clip = *cliprect; - - /* scale the cliprect to the overlay size and then call the update callback */ - clip.min_x = ldcore->config.overclip.min_x; - clip.max_x = ldcore->config.overclip.max_x; - clip.min_y = cliprect->min_y * overbitmap->height / bitmap->height; - if (cliprect->min_y == visarea.min_y) - clip.min_y = MIN(clip.min_y, ldcore->config.overclip.min_y); - clip.max_y = (cliprect->max_y + 1) * overbitmap->height / bitmap->height - 1; - (*ldcore->config.overupdate)(screen, overbitmap, &clip); - } - - /* if this is the last update, do the rendering */ - if (cliprect->max_y == visarea.max_y) - { - /* update the texture with the overlay contents */ - if (overbitmap != NULL) - { - if (overbitmap->format == BITMAP_FORMAT_INDEXED16) - ldcore->overtex->set_bitmap(overbitmap, &ldcore->config.overclip, TEXFORMAT_PALETTEA16, laserdisc->machine().palette); - else if (overbitmap->format == BITMAP_FORMAT_RGB32) - ldcore->overtex->set_bitmap(overbitmap, &ldcore->config.overclip, TEXFORMAT_ARGB32); - } - - /* get the laserdisc video */ - laserdisc_get_video(laserdisc, &vidbitmap); - if (vidbitmap != NULL) - ldcore->videotex->set_bitmap(vidbitmap, NULL, TEXFORMAT_YUY16, ldcore->videopalette); - - /* reset the screen contents */ - screen->container().empty(); - - /* add the video texture */ - if (ldcore->videoenable) - screen->container().add_quad(0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), ldcore->videotex, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); - - /* add the overlay */ - if (ldcore->overenable && overbitmap != NULL) - { - float x0 = 0.5f - 0.5f * ldcore->config.overscalex + ldcore->config.overposx; - float y0 = 0.5f - 0.5f * ldcore->config.overscaley + ldcore->config.overposy; - float x1 = x0 + ldcore->config.overscalex; - float y1 = y0 + ldcore->config.overscaley; - screen->container().add_quad(x0, y0, x1, y1, MAKE_ARGB(0xff,0xff,0xff,0xff), ldcore->overtex, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); - } - - /* swap to the next bitmap */ - ldcore->overindex = (ldcore->overindex + 1) % ARRAY_LENGTH(ldcore->overbitmap); - } - } - - return 0; -} - - - -/*************************************************************************** - CONFIGURATION -***************************************************************************/ - -/*------------------------------------------------- - laserdisc_get_config - return a copy of the - current live configuration settings --------------------------------------------------*/ - -void laserdisc_get_config(device_t *device, laserdisc_config *config) -{ - laserdisc_state *ld = get_safe_token(device); - *config = ld->core->config; -} - - -/*------------------------------------------------- - laserdisc_get_config - change the current live - configuration settings --------------------------------------------------*/ - -void laserdisc_set_config(device_t *device, const laserdisc_config *config) -{ - laserdisc_state *ld = get_safe_token(device); - ld->core->config = *config; -} - - - -/*************************************************************************** - INITIALIZATION -***************************************************************************/ - -/*------------------------------------------------- - init_disc - initialize the state of the - CHD disc --------------------------------------------------*/ - -static void init_disc(device_t *device) -{ - const laserdisc_config *config = (const laserdisc_config *)downcast(device)->inline_config(); - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - chd_error err; - - /* get a handle to the disc to play */ - if (config->getdisc != NULL) - ldcore->disc = (*config->getdisc)(device); - else - ldcore->disc = get_disk_handle(device->machine(), device->tag()); - - /* set default parameters */ - ldcore->width = 720; - ldcore->height = 240; - ldcore->fps_times_1million = 59940000; - ldcore->samplerate = 48000; - - /* get the disc metadata and extract the ld */ - ldcore->chdtracks = 0; - ldcore->maxtrack = VIRTUAL_LEAD_IN_TRACKS + MAX_TOTAL_TRACKS + VIRTUAL_LEAD_OUT_TRACKS; - if (ldcore->disc != NULL) - { - UINT32 totalhunks = chd_get_header(ldcore->disc)->totalhunks; - int fps, fpsfrac, interlaced, channels; - char metadata[256]; - UINT32 vbilength; - - /* require the A/V codec */ - if (chd_get_header(ldcore->disc)->compression != CHDCOMPRESSION_AV) - fatalerror("Laserdisc video must be compressed with the A/V codec!"); - - /* read the metadata */ - err = chd_get_metadata(ldcore->disc, AV_METADATA_TAG, 0, metadata, sizeof(metadata), NULL, NULL, NULL); - if (err != CHDERR_NONE) - fatalerror("Non-A/V CHD file specified"); - - /* extract the metadata */ - if (sscanf(metadata, AV_METADATA_FORMAT, &fps, &fpsfrac, &ldcore->width, &ldcore->height, &interlaced, &channels, &ldcore->samplerate) != 7) - fatalerror("Invalid metadata in CHD file"); - else - ldcore->fps_times_1million = fps * 1000000 + fpsfrac; - - /* require interlaced video */ - if (!interlaced) - fatalerror("Laserdisc video must be interlaced!"); - - /* determine the maximum track and allocate a frame buffer */ - ldcore->chdtracks = totalhunks / 2; - - /* allocate memory for the precomputed per-frame metadata */ - ldcore->vbidata = auto_alloc_array(device->machine(), UINT8, totalhunks * VBI_PACKED_BYTES); - err = chd_get_metadata(ldcore->disc, AV_LD_METADATA_TAG, 0, ldcore->vbidata, totalhunks * VBI_PACKED_BYTES, &vbilength, NULL, NULL); - if (err != CHDERR_NONE || vbilength != totalhunks * VBI_PACKED_BYTES) - fatalerror("Precomputed VBI metadata missing or incorrect size"); - } - ldcore->maxtrack = MAX(ldcore->maxtrack, VIRTUAL_LEAD_IN_TRACKS + VIRTUAL_LEAD_OUT_TRACKS + ldcore->chdtracks); -} - - -/*------------------------------------------------- - init_video - initialize the state of the - video rendering --------------------------------------------------*/ - -static void init_video(device_t *device) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - int index; - - /* register for VBLANK callbacks */ - ld->screen->register_vblank_callback(vblank_state_delegate(FUNC(vblank_state_changed), device)); - - /* allocate video frames */ - for (index = 0; index < ARRAY_LENGTH(ldcore->frame); index++) - { - frame_data *frame = &ldcore->frame[index]; - - /* first allocate a YUY16 bitmap at 2x the height */ - frame->bitmap = auto_alloc(device->machine(), bitmap_t(ldcore->width, ldcore->height * 2, BITMAP_FORMAT_YUY16)); - fillbitmap_yuy16(frame->bitmap, 40, 109, 240); - - /* make a copy of the bitmap that clips out the VBI and horizontal blanking areas */ - frame->visbitmap = auto_alloc(device->machine(), bitmap_t(BITMAP_ADDR16(frame->bitmap, 44, frame->bitmap->width * 8 / 720), - frame->bitmap->width - 2 * frame->bitmap->width * 8 / 720, - frame->bitmap->height - 44, - frame->bitmap->rowpixels, frame->bitmap->format)); - } - - /* allocate an empty frame of the same size */ - ldcore->emptyframe = auto_bitmap_alloc(device->machine(), ldcore->width, ldcore->height * 2, BITMAP_FORMAT_YUY16); - fillbitmap_yuy16(ldcore->emptyframe, 0, 128, 128); - - /* allocate texture for rendering */ - ldcore->videoenable = TRUE; - ldcore->videotex = device->machine().render().texture_alloc(); - if (ldcore->videotex == NULL) - fatalerror("Out of memory allocating video texture"); - - /* allocate palette for applying brightness/contrast/gamma */ - ldcore->videopalette = palette_alloc(256, 1); - if (ldcore->videopalette == NULL) - fatalerror("Out of memory allocating video palette"); - for (index = 0; index < 256; index++) - palette_entry_set_color(ldcore->videopalette, index, MAKE_RGB(index, index, index)); - - /* allocate overlay */ - if (ldcore->config.overwidth > 0 && ldcore->config.overheight > 0 && ldcore->config.overupdate != NULL) - { - ldcore->overenable = TRUE; - ldcore->overbitmap[0] = auto_bitmap_alloc(device->machine(), ldcore->config.overwidth, ldcore->config.overheight, (bitmap_format)ldcore->config.overformat); - ldcore->overbitmap[1] = auto_bitmap_alloc(device->machine(), ldcore->config.overwidth, ldcore->config.overheight, (bitmap_format)ldcore->config.overformat); - ldcore->overtex = device->machine().render().texture_alloc(); - if (ldcore->overtex == NULL) - fatalerror("Out of memory allocating overlay texture"); - } -} - - -/*------------------------------------------------- - init_audio - initialize the state of the - audio rendering --------------------------------------------------*/ - -static void init_audio(device_t *device) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - - /* find the custom audio */ - ldcore->audiocustom = device->machine().device(ldcore->config.sound); - - /* allocate audio buffers */ - ldcore->audiomaxsamples = ((UINT64)ldcore->samplerate * 1000000 + ldcore->fps_times_1million - 1) / ldcore->fps_times_1million; - ldcore->audiobufsize = ldcore->audiomaxsamples * 4; - ldcore->audiobuffer[0] = auto_alloc_array(device->machine(), INT16, ldcore->audiobufsize); - ldcore->audiobuffer[1] = auto_alloc_array(device->machine(), INT16, ldcore->audiobufsize); -} - - - -/*************************************************************************** - DEVICE INTERFACE -***************************************************************************/ - -/*------------------------------------------------- - device start callback --------------------------------------------------*/ - -static DEVICE_START( laserdisc ) -{ - const laserdisc_config *config = (const laserdisc_config *)downcast(device)->inline_config(); - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore; - - /* ensure that our screen is started first */ - ld->screen = downcast(device->machine().device(config->screen)); - assert(ld->screen != NULL); - if (!ld->screen->started()) - throw device_missing_dependencies(); - - /* save a copy of the device pointer */ - ld->device = device; - - /* allocate memory for the core state */ - ld->core = auto_alloc_clear(device->machine(), ldcore_data); - ldcore = ld->core; - - if (device->type() == PIONEER_PR8210) - ldcore->intf = pr8210_interface; - else if (device->type() == SIMUTREK_SPECIAL) - ldcore->intf = simutrek_interface; - else if (device->type() == PIONEER_LDV1000) - ldcore->intf = ldv1000_interface; - else if (device->type() == PHILLIPS_22VP931) - ldcore->intf = vp931_interface; - - ld->player = (ldplayer_data *)auto_alloc_array_clear(device->machine(), UINT8, ldcore->intf.statesize); - - /* copy config data to the live state */ - ldcore->config = *config; - if (ldcore->config.overclip.max_x == ldcore->config.overclip.min_x || ldcore->config.overclip.max_y == ldcore->config.overclip.min_y) - { - ldcore->config.overclip.min_x = ldcore->config.overclip.min_y = 0; - ldcore->config.overclip.max_x = ldcore->config.overwidth - 1; - ldcore->config.overclip.max_y = ldcore->config.overheight - 1; - } - if (ldcore->config.overscalex == 0) - ldcore->config.overscalex = 1.0f; - if (ldcore->config.overscaley == 0) - ldcore->config.overscaley = 1.0f; - - /* initialize the various pieces */ - init_disc(device); - init_video(device); - init_audio(device); - - /* register callbacks */ - config_register(device->machine(), "laserdisc", config_saveload_delegate(FUNC(configuration_load), device), config_saveload_delegate(FUNC(configuration_save), device)); -} - - -/*------------------------------------------------- - device exit callback --------------------------------------------------*/ - -static DEVICE_STOP( laserdisc ) -{ - laserdisc_state *ld = get_safe_token(device); - ldcore_data *ldcore = ld->core; - - /* make sure all async operations have completed */ - if (ldcore->disc != NULL) - chd_async_complete(ldcore->disc); - - /* free any textures and palettes */ - device->machine().render().texture_free(ldcore->videotex); - if (ldcore->videopalette != NULL) - palette_deref(ldcore->videopalette); - device->machine().render().texture_free(ldcore->overtex); -} - - -/*------------------------------------------------- - device reset callback --------------------------------------------------*/ - -static DEVICE_RESET( laserdisc ) -{ - laserdisc_state *ld = get_safe_token(device); - attotime curtime = device->machine().time(); - ldcore_data *ldcore = ld->core; - int line; - - /* attempt to wire up the audio */ - if (ldcore->audiocustom != NULL) - { - sound_token *token = (sound_token *)downcast(ldcore->audiocustom)->token(); - token->ld = ld; - token->stream->set_sample_rate(ldcore->samplerate); - } - - /* set up the general ld */ - ldcore->audiosquelch = 3; - ldcore->videosquelch = 1; - ldcore->fieldnum = 0; - ldcore->curtrack = 1; - ldcore->attospertrack = 0; - ldcore->sliderupdate = curtime; - - /* reset the I/O lines */ - for (line = 0; line < LASERDISC_INPUT_LINES; line++) - ldcore->linein[line] = CLEAR_LINE; - for (line = 0; line < LASERDISC_OUTPUT_LINES; line++) - ldcore->lineout[line] = CLEAR_LINE; - - /* call the initialization */ - if (ldcore->intf.init != NULL) - (*ldcore->intf.init)(ld); -} - - -/*------------------------------------------------- - device set info callback --------------------------------------------------*/ - -int laserdisc_get_type(device_t *device) -{ - if (device->type() == PIONEER_PR7820) - return LASERDISC_TYPE_PIONEER_PR7820; - if (device->type() == PIONEER_PR8210) - return LASERDISC_TYPE_PIONEER_PR8210; - if (device->type() == SIMUTREK_SPECIAL) - return LASERDISC_TYPE_SIMUTREK_SPECIAL; - if (device->type() == PIONEER_LDV1000) - return LASERDISC_TYPE_PIONEER_LDV1000; - if (device->type() == PHILLIPS_22VP931) - return LASERDISC_TYPE_PHILLIPS_22VP931; - if (device->type() == PHILLIPS_22VP932) - return LASERDISC_TYPE_PHILLIPS_22VP932; - if (device->type() == SONY_LDP1450) - return LASERDISC_TYPE_SONY_LDP1450; - return LASERDISC_TYPE_UNKNOWN; -} - -void laserdisc_set_type(device_t *device, int type) -{ - // this is no longer supported -} - - -DEVICE_GET_INFO( laserdisc ) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(laserdisc_state); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(laserdisc_config); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(laserdisc); break; - case DEVINFO_FCT_STOP: info->stop = DEVICE_STOP_NAME(laserdisc); break; - case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(laserdisc); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_FAMILY: strcpy(info->s, "Laserdisc Player"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; - } -} - -DEVICE_GET_INFO( unkldplay ) -{ - switch (state) - { - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_ROM_REGION: info->romregion = NULL; return; - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = NULL; return; - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s,"Unknown Laserdisc Player"); return; - case DEVINFO_STR_SHORTNAME: strcpy(info->s,"unkldplay"); return; - } - - DEVICE_GET_INFO_CALL( laserdisc ); -} - -DEVICE_GET_INFO( pioneer_pr7820 ) -{ - DEVICE_GET_INFO_CALL( unkldplay ); -} - -DEVICE_GET_INFO( pioneer_pr8210 ) -{ - switch (state) - { - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_ROM_REGION: info->romregion = pr8210_interface.romregion; return; - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = pr8210_interface.machine_config; return; - - /* --- the following bits of info are returned as NULL-terminated strings -- */ - case DEVINFO_STR_NAME: strcpy(info->s, pr8210_interface.name); return; - case DEVINFO_STR_SHORTNAME: strcpy(info->s, pr8210_interface.shortname); return; - } - - DEVICE_GET_INFO_CALL( laserdisc ); -} - -DEVICE_GET_INFO( simutrek_special ) -{ - switch (state) - { - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_ROM_REGION: info->romregion = simutrek_interface.romregion; return; - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = simutrek_interface.machine_config; return; - - /* --- the following bits of info are returned as NULL-terminated strings -- */ - case DEVINFO_STR_NAME: strcpy(info->s, simutrek_interface.name); return; - case DEVINFO_STR_SHORTNAME: strcpy(info->s, simutrek_interface.shortname); return; - } - - DEVICE_GET_INFO_CALL( laserdisc ); -} - -DEVICE_GET_INFO( pioneer_ldv1000 ) -{ - switch (state) - { - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_ROM_REGION: info->romregion = ldv1000_interface.romregion; return; - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = ldv1000_interface.machine_config; return; - - /* --- the following bits of info are returned as NULL-terminated strings -- */ - case DEVINFO_STR_NAME: strcpy(info->s, ldv1000_interface.name); return; - case DEVINFO_STR_SHORTNAME: strcpy(info->s, ldv1000_interface.shortname); return; - } - - DEVICE_GET_INFO_CALL( laserdisc ); -} - -DEVICE_GET_INFO( phillips_22vp931 ) -{ - switch (state) - { - /* --- the following bits of info are returned as pointers --- */ - case DEVINFO_PTR_ROM_REGION: info->romregion = vp931_interface.romregion; return; - case DEVINFO_PTR_MACHINE_CONFIG: info->machine_config = vp931_interface.machine_config; return; - - /* --- the following bits of info are returned as NULL-terminated strings -- */ - case DEVINFO_STR_NAME: strcpy(info->s, vp931_interface.name); return; - case DEVINFO_STR_SHORTNAME: strcpy(info->s, vp931_interface.shortname); return; - } - - DEVICE_GET_INFO_CALL( laserdisc ); -} - -DEVICE_GET_INFO( phillips_22vp932 ) -{ - DEVICE_GET_INFO_CALL( unkldplay ); -} - -DEVICE_GET_INFO( sony_ldp1450 ) -{ - DEVICE_GET_INFO_CALL( unkldplay ); -} - -DEFINE_LEGACY_DEVICE(PIONEER_PR7820,pioneer_pr7820); -DEFINE_LEGACY_DEVICE(PIONEER_PR8210,pioneer_pr8210); -DEFINE_LEGACY_DEVICE(SIMUTREK_SPECIAL,simutrek_special); -DEFINE_LEGACY_DEVICE(PIONEER_LDV1000,pioneer_ldv1000); -DEFINE_LEGACY_DEVICE(PHILLIPS_22VP931,phillips_22vp931); -DEFINE_LEGACY_DEVICE(PHILLIPS_22VP932,phillips_22vp932); -DEFINE_LEGACY_DEVICE(SONY_LDP1450,sony_ldp1450); -DEFINE_LEGACY_SOUND_DEVICE(LASERDISC_SOUND, laserdisc_sound); diff -Nru mame-0.144/src/emu/machine/ldcore.h mame-0.145/src/emu/machine/ldcore.h --- mame-0.144/src/emu/machine/ldcore.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/ldcore.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -/************************************************************************* - - ldcore.h - - Private core laserdisc player implementation. - - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - -*************************************************************************/ - -#pragma once - -#ifndef __LDCORE_H__ -#define __LDCORE_H__ - -#include "laserdsc.h" -#include "vbiparse.h" - - -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* common laserdisc states */ -enum -{ - LDSTATE_NONE, /* unspecified state */ - LDSTATE_EJECTING, /* in the process of ejecting */ - LDSTATE_EJECTED, /* fully ejected */ - LDSTATE_PARKED, /* head parked in lead-in */ - LDSTATE_LOADING, /* loading from ejected state */ - LDSTATE_SPINUP, /* spinning up */ - LDSTATE_PAUSING, /* looking for a frame boundary to pause */ - LDSTATE_PAUSED, /* found a frame boundary; now paused */ - /* parameter specifies the fieldnum of the first frame */ - LDSTATE_PLAYING, /* playing forward normally, with audio */ - /* parameter specifies the target frame, or 0 if none */ - LDSTATE_PLAYING_SLOW_REVERSE, /* playing slow in the reverse direction, with no audio */ - /* parameter specifies the number of times to repeat each track */ - LDSTATE_PLAYING_SLOW_FORWARD, /* playing slow in the forward direction, with no audio */ - /* parameter specifies the number of times to repeat each track */ - LDSTATE_PLAYING_FAST_REVERSE, /* playing fast in the reverse direction, with no audio */ - /* parameter specifies the number of frames to skip backwards after each frame */ - LDSTATE_PLAYING_FAST_FORWARD, /* playing fast in the forward direction, with no audio */ - /* parameter specifies the number of frames to skip forwards after each frame */ - LDSTATE_STEPPING_REVERSE, /* single frame stepping in the reverse direction */ - LDSTATE_STEPPING_FORWARD, /* single frame stepping in the forward direction */ - LDSTATE_SCANNING, /* scanning in the forward or reverse direction */ - /* parameter(0:7) controls how many vsyncs until revert to savestate */ - /* parameter(8:31) specifies the speed */ - LDSTATE_SEEKING, /* seeking to a specific frame */ - /* parameter specifies the target frame */ - LDSTATE_OTHER /* other states start here */ -}; - - -/* slider position */ -enum _slider_position -{ - SLIDER_MINIMUM, /* at the minimum value */ - SLIDER_VIRTUAL_LEADIN, /* within the virtual lead-in area */ - SLIDER_CHD, /* within the boundaries of the CHD */ - SLIDER_OUTSIDE_CHD, /* outside of the CHD area but before the virtual lead-out area */ - SLIDER_VIRTUAL_LEADOUT, /* within the virtual lead-out area */ - SLIDER_MAXIMUM /* at the maximum value */ -}; -typedef enum _slider_position slider_position; - - -/* special frame and chapter numbers from VBI conversion */ -#define FRAME_NOT_PRESENT -2 /* no frame number information present */ -#define FRAME_LEAD_IN -1 /* lead-in code detected */ -#define FRAME_LEAD_OUT 99999 /* lead-out code detected */ -#define CHAPTER_NOT_PRESENT -2 /* no chapter number information present */ -#define CHAPTER_LEAD_IN -1 /* lead-in code detected */ -#define CHAPTER_LEAD_OUT 100 /* lead-out code detected */ - -/* generic head movement speeds; use player-specific information where appropriate */ -#define GENERIC_SLOW_SPEED (5) /* 1/5 normal speed */ -#define GENERIC_FAST_SPEED (3) /* 3x normal speed */ -#define GENERIC_SCAN_SPEED (50) /* 50x normal speed */ -#define GENERIC_SEARCH_SPEED (5000) /* 5000x normal speed */ - -/* generic timings; use player-specific information where appropriate */ -#define GENERIC_EJECT_TIME (attotime::from_seconds(5)) -#define GENERIC_SPINUP_TIME (attotime::from_seconds(2)) -#define GENERIC_LOAD_TIME (attotime::from_seconds(5)) - - - -/*************************************************************************** - MACROS -***************************************************************************/ - -#define SCANNING_PARAM(speed,duration) (((speed) << 8) | ((duration) & 0xff)) - - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* core-specific and player-specific data */ -typedef struct _ldplayer_data ldplayer_data; -typedef struct _ldcore_data ldcore_data; - - -/* player state */ -typedef struct _ldplayer_state ldplayer_state; -struct _ldplayer_state -{ - UINT8 state; /* current state */ - INT32 substate; /* internal sub-state; starts at 0 on any state change */ - INT32 param; /* parameter for current state */ - attotime endtime; /* minimum ending time for current state */ -}; - - -/* generic data */ -typedef struct _laserdisc_state laserdisc_state; -struct _laserdisc_state -{ - device_t * device; /* pointer to owning device */ - screen_device * screen; /* pointer to the screen device */ - ldcore_data * core; /* private core data */ - ldplayer_data * player; /* private player data */ - - ldplayer_state state; /* active state */ - ldplayer_state savestate; /* saved state during temporary operations */ -}; - - -/* player-specific callbacks */ -typedef void (*laserdisc_init_func)(laserdisc_state *ld); -typedef void (*laserdisc_vsync_func)(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -typedef INT32 (*laserdisc_update_func)(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -typedef void (*laserdisc_overlay_func)(laserdisc_state *ld, bitmap_t *bitmap); -typedef void (*laserdisc_w_func)(laserdisc_state *ld, UINT8 prev, UINT8 newval); -typedef UINT8 (*laserdisc_r_func)(laserdisc_state *ld); - - -/* player configuration */ -typedef struct _ldplayer_interface ldplayer_interface; -struct _ldplayer_interface -{ - int type; /* type of the player */ - size_t statesize; /* size of the state */ - const char * name; /* name of the player */ - const char * shortname; /* shortname of the player */ - const rom_entry * romregion; /* pointer to ROM region information */ - machine_config_constructor machine_config; /* pointer to machine configuration */ - laserdisc_init_func init; /* initialization callback */ - laserdisc_vsync_func vsync; /* vsync begin callback */ - laserdisc_update_func update; /* update callback (line 16) */ - laserdisc_overlay_func overlay; /* overlay callback */ - laserdisc_w_func writedata; /* parallel data write */ - laserdisc_w_func writeline[LASERDISC_INPUT_LINES]; /* single line write */ - laserdisc_r_func readdata; /* parallel data read */ - laserdisc_r_func readline[LASERDISC_OUTPUT_LINES]; /* single line read */ -}; - - - -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - -/* defined by each player */ -extern const ldplayer_interface pr7820_interface; -extern const ldplayer_interface pr8210_interface; -extern const ldplayer_interface simutrek_interface; -extern const ldplayer_interface ldv1000_interface; -extern const ldplayer_interface ldp1450_interface; -extern const ldplayer_interface vp931_interface; -extern const ldplayer_interface vp932_interface; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- player interface ----- */ - -/* return a token with type checking from a device */ -laserdisc_state *ldcore_get_safe_token(device_t *device); - -/* set the left/right audio squelch states */ -void ldcore_set_audio_squelch(laserdisc_state *ld, UINT8 squelchleft, UINT8 squelchright); - -/* set the video squelch state */ -void ldcore_set_video_squelch(laserdisc_state *ld, UINT8 squelch); - -/* dynamically change the slider speed */ -void ldcore_set_slider_speed(laserdisc_state *ld, INT32 tracks_per_vsync); - -/* advance the slider by a certain number of tracks */ -void ldcore_advance_slider(laserdisc_state *ld, INT32 numtracks); - -/* get the current slider position */ -slider_position ldcore_get_slider_position(laserdisc_state *ld); - - - -/* ----- generic implementations ----- */ - -/* generically update in a way that works for most situations */ -INT32 ldcore_generic_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime, ldplayer_state *curstate); - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - is_start_of_frame - return TRUE if this is - the start of a frame --------------------------------------------------*/ - -INLINE int is_start_of_frame(const vbi_metadata *vbi) -{ - /* is it not known if the white flag or the presence of a frame code - determines the start of frame; the former seems to be the "official" - way, but the latter seems to be the practical implementation */ - return (vbi->white || (vbi->line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE); -} - - -/*------------------------------------------------- - frame_from_metadata - return the frame number - encoded in the metadata, if present, or - FRAME_NOT_PRESENT --------------------------------------------------*/ - -INLINE int frame_from_metadata(const vbi_metadata *metadata) -{ - if ((metadata->line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - return VBI_CAV_PICTURE(metadata->line1718); - else if (metadata->line1718 == VBI_CODE_LEADIN) - return FRAME_LEAD_IN; - else if (metadata->line1718 == VBI_CODE_LEADOUT) - return FRAME_LEAD_OUT; - return FRAME_NOT_PRESENT; -} - - -/*------------------------------------------------- - chapter_from_metadata - return the chapter - number encoded in the metadata, if present, - or CHAPTER_NOT_PRESENT --------------------------------------------------*/ - -INLINE int chapter_from_metadata(const vbi_metadata *metadata) -{ - if ((metadata->line1718 & VBI_MASK_CHAPTER) == VBI_CODE_CHAPTER) - return VBI_CHAPTER(metadata->line1718); - else if (metadata->line1718 == VBI_CODE_LEADIN) - return CHAPTER_LEAD_IN; - else if (metadata->line1718 == VBI_CODE_LEADOUT) - return CHAPTER_LEAD_OUT; - return CHAPTER_NOT_PRESENT; -} - - -#endif diff -Nru mame-0.144/src/emu/machine/ldpr8210.c mame-0.145/src/emu/machine/ldpr8210.c --- mame-0.144/src/emu/machine/ldpr8210.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/ldpr8210.c 2012-02-06 21:30:28.000000000 +0000 @@ -4,8 +4,36 @@ Pioneer PR-8210 laserdisc emulation. - 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,15 +46,16 @@ *************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" -#include "ldcore.h" -#include "cpu/mcs48/mcs48.h" +#include "ldpr8210.h" -/*************************************************************************** - DEBUGGING -***************************************************************************/ +//************************************************************************** +// DEBUGGING +//************************************************************************** #define LOG_VBLANK_VBI 0 #define LOG_SERIAL 0 @@ -34,11 +63,11 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** -/* Overlay constants, related to 720-pixel wide capture */ +// Overlay constants, related to 720-pixel wide capture #define OVERLAY_GROUP0_X (82.0f / 720.0f) #define OVERLAY_GROUP1_X (162.0f / 720.0f) #define OVERLAY_GROUP2_X (322.0f / 720.0f) @@ -49,11 +78,11 @@ #define OVERLAY_X_PIXELS 5 #define OVERLAY_Y_PIXELS 7 -/* scanning speeds */ -#define SCAN_SPEED (2000 / 30) /* 2000 frames/second */ -#define SEEK_FAST_SPEED (4000 / 30) /* 4000 frames/second */ +// scanning speeds +#define SCAN_SPEED (2000 / 30) // 2000 frames/second +#define SEEK_FAST_SPEED (4000 / 30) // 4000 frames/second -/* serial timing, mostly from the service manual, derived from the XTAL */ +// serial timing, mostly from the service manual, derived from the XTAL #define SERIAL_CLOCK XTAL_455kHz #define SERIAL_0_BIT_TIME attotime::from_hz((double)SERIAL_CLOCK / 512) #define SERIAL_1_BIT_TIME attotime::from_hz((double)SERIAL_CLOCK / 1024) @@ -64,224 +93,98 @@ -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* PIA data */ -typedef struct _pioneer_pia pioneer_pia; -struct _pioneer_pia -{ - UINT8 frame[7]; /* (20-26) 7 characters for the chapter/frame */ - UINT8 text[17]; /* (20-30) 17 characters for the display */ - UINT8 control; /* (40) control lines */ - UINT8 latchdisplay; /* flag: set if the display was latched */ - UINT8 portb; /* (60) port B value (LEDs) */ - UINT8 display; /* (80) display enable */ - UINT8 porta; /* (A0) port A value (from serial decoder) */ - UINT8 vbi1; /* (C0) VBI decoding state 1 */ - UINT8 vbi2; /* (E0) VBI decoding state 2 */ -}; - +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** -/* Simutrek-specific data */ -typedef struct _simutrek_data simutrek_data; -struct _simutrek_data -{ - device_t *cpu; /* 8748 CPU device */ - UINT8 audio_squelch; /* audio squelch value */ - UINT8 data; /* parallel data for simutrek */ - UINT8 data_ready; /* ready flag for simutrek data */ - UINT8 port2; /* 8748 port 2 state */ - UINT8 controlnext; /* latch to control next pair of fields */ - UINT8 controlthis; /* latched value for our control over the current pair of fields */ -}; - - -/* player-specific data */ -struct _ldplayer_data -{ - /* serial/command interface processing */ - UINT8 lastcommand; /* last command seen */ - UINT16 accumulator; /* bit accumulator */ - attotime lastcommandtime; /* time of the last command */ - attotime lastbittime; /* time of last bit received */ - attotime firstbittime; /* time of first bit in command */ - - /* low-level emulation data */ - device_t *cpu; /* 8049 CPU device */ - attotime slowtrg; /* time of the last SLOW TRG */ - pioneer_pia pia; /* PIA state */ - UINT8 vsync; /* live VSYNC state */ - UINT8 port1; /* 8049 port 1 state */ - UINT8 port2; /* 8049 port 2 state */ - - /* Simutrek-specific data */ - simutrek_data simutrek; /* Simutrek-specific data */ -}; +// devices +const device_type PIONEER_PR8210 = &device_creator; +const device_type SIMUTREK_SPECIAL = &device_creator; - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static void pr8210_init(laserdisc_state *ld); -static void pr8210_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static INT32 pr8210_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static void pr8210_overlay(laserdisc_state *ld, bitmap_t *bitmap); -static void pr8210_control_w(laserdisc_state *ld, UINT8 prev, UINT8 data); - -static TIMER_CALLBACK( vsync_off ); -static TIMER_CALLBACK( vbi_data_fetch ); - -static READ8_HANDLER( pr8210_pia_r ); -static WRITE8_HANDLER( pr8210_pia_w ); -static READ8_HANDLER( pr8210_bus_r ); -static WRITE8_HANDLER( pr8210_port1_w ); -static WRITE8_HANDLER( pr8210_port2_w ); -static READ8_HANDLER( pr8210_t0_r ); -static READ8_HANDLER( pr8210_t1_r ); - -static void overlay_draw_group(bitmap_t *bitmap, const UINT8 *text, int count, float xstart); -static void overlay_erase(bitmap_t *bitmap, float xstart, float xend); -static void overlay_draw_char(bitmap_t *bitmap, UINT8 ch, float xstart); - -static void simutrek_init(laserdisc_state *ld); -static void simutrek_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static INT32 simutrek_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static UINT8 simutrek_ready_r(laserdisc_state *ld); -static UINT8 simutrek_status_r(laserdisc_state *ld); -static void simutrek_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data); - -static TIMER_CALLBACK( simutrek_latched_data_w ); - -static READ8_HANDLER( simutrek_port2_r ); -static WRITE8_HANDLER( simutrek_port2_w ); -static READ8_HANDLER( simutrek_data_r ); -static READ8_HANDLER( simutrek_t0_r ); - - - -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - -/* bitmaps for the characters */ +// bitmaps for the characters static const UINT8 text_bitmap[0x40][7] = { - { 0 }, /* @ */ - { 0x20,0x50,0x88,0x88,0xf8,0x88,0x88 }, /* A */ - { 0 }, /* B */ - { 0x70,0x88,0x80,0x80,0x80,0x88,0x70 }, /* C */ - { 0 }, /* D */ - { 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8 }, /* E */ - { 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80 }, /* F */ - { 0 }, /* G */ - { 0x88,0x88,0x88,0xf8,0x88,0x88,0x88 }, /* H */ - { 0 }, /* I */ - { 0 }, /* J */ - { 0 }, /* K */ - { 0 }, /* L */ - { 0x88,0xd8,0xa8,0xa8,0xa8,0x88,0x88 }, /* M */ - { 0 }, /* N */ - { 0 }, /* O */ - { 0xf0,0x88,0x88,0xf0,0x80,0x80,0x80 }, /* P */ - { 0 }, /* Q */ - { 0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88 }, /* R */ - { 0x70,0x88,0x80,0x70,0x08,0x88,0x70 }, /* S */ - { 0 }, /* T */ - { 0 }, /* U */ - { 0 }, /* V */ - { 0 }, /* W */ - { 0 }, /* X */ - { 0 }, /* Y */ - { 0 }, /* Z */ - { 0 }, /* [ */ - { 0 }, /* \ */ - { 0 }, /* ] */ - { 0 }, /* ^ */ - { 0 }, /* _ */ - - { 0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, /* */ - { 0 }, /* ! */ - { 0 }, /* " */ - { 0 }, /* # */ - { 0 }, /* $ */ - { 0 }, /* % */ - { 0 }, /* & */ - { 0 }, /* ' */ - { 0 }, /* ( */ - { 0 }, /* ) */ - { 0 }, /* * */ - { 0 }, /* + */ - { 0 }, /* , */ - { 0 }, /* - */ - { 0x00,0x00,0x00,0x00,0x00,0x00,0x40 }, /* . */ - { 0 }, /* / */ - { 0x70,0x88,0x88,0x88,0x88,0x88,0x70 }, /* 0 */ - { 0x20,0x60,0x20,0x20,0x20,0x20,0x70 }, /* 1 */ - { 0x70,0x88,0x08,0x70,0x80,0x80,0xf8 }, /* 2 */ - { 0xf8,0x08,0x10,0x30,0x08,0x88,0x70 }, /* 3 */ - { 0x10,0x30,0x50,0x90,0xf8,0x10,0x10 }, /* 4 */ - { 0xf8,0x80,0xf0,0x08,0x08,0x88,0x70 }, /* 5 */ - { 0x78,0x80,0x80,0xf0,0x88,0x88,0x70 }, /* 6 */ - { 0xf8,0x08,0x08,0x10,0x20,0x40,0x80 }, /* 7 */ - { 0x70,0x88,0x88,0x70,0x88,0x88,0x70 }, /* 8 */ - { 0x70,0x88,0x88,0x78,0x08,0x08,0xf0 }, /* 9 */ - { 0 }, /* : */ - { 0 }, /* ; */ - { 0 }, /* < */ - { 0 }, /* = */ - { 0 }, /* > */ - { 0 } /* ? */ + { 0 }, // @ + { 0x20,0x50,0x88,0x88,0xf8,0x88,0x88 }, // A + { 0 }, // B + { 0x70,0x88,0x80,0x80,0x80,0x88,0x70 }, // C + { 0 }, // D + { 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8 }, // E + { 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80 }, // F + { 0 }, // G + { 0x88,0x88,0x88,0xf8,0x88,0x88,0x88 }, // H + { 0 }, // I + { 0 }, // J + { 0 }, // K + { 0 }, // L + { 0x88,0xd8,0xa8,0xa8,0xa8,0x88,0x88 }, // M + { 0 }, // N + { 0 }, // O + { 0xf0,0x88,0x88,0xf0,0x80,0x80,0x80 }, // P + { 0 }, // Q + { 0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88 }, // R + { 0x70,0x88,0x80,0x70,0x08,0x88,0x70 }, // S + { 0 }, // T + { 0 }, // U + { 0 }, // V + { 0 }, // W + { 0 }, // X + { 0 }, // Y + { 0 }, // Z + { 0 }, // [ + { 0 }, // + { 0 }, // ] + { 0 }, // ^ + { 0 }, // _ + + { 0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, // + { 0 }, // ! + { 0 }, // " + { 0 }, // # + { 0 }, // $ + { 0 }, // % + { 0 }, // & + { 0 }, // ' + { 0 }, // ( + { 0 }, // ) + { 0 }, // * + { 0 }, // + + { 0 }, // , + { 0 }, // - + { 0x00,0x00,0x00,0x00,0x00,0x00,0x40 }, // . + { 0 }, // / + { 0x70,0x88,0x88,0x88,0x88,0x88,0x70 }, // 0 + { 0x20,0x60,0x20,0x20,0x20,0x20,0x70 }, // 1 + { 0x70,0x88,0x08,0x70,0x80,0x80,0xf8 }, // 2 + { 0xf8,0x08,0x10,0x30,0x08,0x88,0x70 }, // 3 + { 0x10,0x30,0x50,0x90,0xf8,0x10,0x10 }, // 4 + { 0xf8,0x80,0xf0,0x08,0x08,0x88,0x70 }, // 5 + { 0x78,0x80,0x80,0xf0,0x88,0x88,0x70 }, // 6 + { 0xf8,0x08,0x08,0x10,0x20,0x40,0x80 }, // 7 + { 0x70,0x88,0x88,0x70,0x88,0x88,0x70 }, // 8 + { 0x70,0x88,0x88,0x78,0x08,0x08,0xf0 }, // 9 + { 0 }, // : + { 0 }, // ; + { 0 }, // < + { 0 }, // = + { 0 }, // > + { 0 } // ? }; -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - update_video_squelch - update the state of - the video squelch --------------------------------------------------*/ - -INLINE void update_video_squelch(laserdisc_state *ld) -{ - ldplayer_data *player = ld->player; - ldcore_set_video_squelch(ld, (player->port1 & 0x20) != 0); -} - - -/*------------------------------------------------- - update_audio_squelch - update the state of - the audio squelch --------------------------------------------------*/ - -INLINE void update_audio_squelch(laserdisc_state *ld) -{ - ldplayer_data *player = ld->player; - if (player->simutrek.cpu == NULL) - ldcore_set_audio_squelch(ld, (player->port1 & 0x40) || !(player->pia.portb & 0x01), (player->port1 & 0x40) || !(player->pia.portb & 0x02)); - else - ldcore_set_audio_squelch(ld, player->simutrek.audio_squelch, player->simutrek.audio_squelch); -} - - - -/*************************************************************************** - PR-8210 ROM AND MACHINE INTERFACES -***************************************************************************/ - -static ADDRESS_MAP_START( pr8210_portmap, AS_IO, 8 ) - AM_RANGE(0x00, 0xff) AM_READWRITE(pr8210_pia_r, pr8210_pia_w) - AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(pr8210_bus_r) - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(pr8210_port1_w) - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(pr8210_port2_w) - AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(pr8210_t0_r) - AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(pr8210_t1_r) +//************************************************************************** +// PR-8210 ROM AND MACHINE INTERFACES +//************************************************************************** + +static ADDRESS_MAP_START( pr8210_portmap, AS_IO, 8, pioneer_pr8210_device ) + AM_RANGE(0x00, 0xff) AM_READWRITE(i8049_pia_r, i8049_pia_w) + AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(i8049_bus_r) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(i8049_port1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(i8049_port2_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(i8049_t0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(i8049_t1_r) ADDRESS_MAP_END @@ -298,390 +201,404 @@ -/*************************************************************************** - PR-8210 PLAYER INTERFACE -***************************************************************************/ - -const ldplayer_interface pr8210_interface = -{ - LASERDISC_TYPE_PIONEER_PR8210, /* type of the player */ - sizeof(ldplayer_data), /* size of the state */ - "Pioneer PR-8210", /* name of the player */ - "pr8210", /* shortname of the player */ - ROM_NAME(pr8210), /* pointer to ROM region information */ - MACHINE_CONFIG_NAME(pr8210), /* pointer to machine configuration */ - pr8210_init, /* initialization callback */ - pr8210_vsync, /* vsync callback */ - pr8210_update, /* update callback */ - pr8210_overlay, /* overlay callback */ - NULL, /* parallel data write */ - { /* single line write: */ - NULL, /* LASERDISC_LINE_ENTER */ - pr8210_control_w /* LASERDISC_LINE_CONTROL */ - }, - NULL, /* parallel data read */ - { /* single line read: */ - NULL, /* LASERDISC_LINE_READY */ - NULL, /* LASERDISC_LINE_STATUS */ - NULL, /* LASERDISC_LINE_COMMAND */ - NULL, /* LASERDISC_LINE_DATA_AVAIL */ - } -}; - - +//************************************************************************** +// PIONEER PR-8210 IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// pioneer_pr8210_device - constructor +//------------------------------------------------- + +pioneer_pr8210_device::pioneer_pr8210_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, PIONEER_PR8210, "Pioneer PR-8210", "pr8210", tag, owner, clock), + m_control(0), + m_lastcommand(0), + m_accumulator(0), + m_lastcommandtime(attotime::zero), + m_lastbittime(attotime::zero), + m_firstbittime(attotime::zero), + m_i8049_cpu(*this, "pr8210"), + m_slowtrg(attotime::zero), + m_vsync(false), + m_i8049_port1(0), + m_i8049_port2(0) +{ +} -/*************************************************************************** - PIONEER PR-8210 IMPLEMENTATION -***************************************************************************/ +pioneer_pr8210_device::pioneer_pr8210_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, type, name, shortname, tag, owner, clock), + m_control(0), + m_lastcommand(0), + m_accumulator(0), + m_lastcommandtime(attotime::zero), + m_lastbittime(attotime::zero), + m_firstbittime(attotime::zero), + m_i8049_cpu(*this, "pr8210"), + m_slowtrg(attotime::zero), + m_vsync(false), + m_i8049_port1(0), + m_i8049_port2(0) +{ +} -/*------------------------------------------------- - pr8210_init - player-specific initialization --------------------------------------------------*/ -static void pr8210_init(laserdisc_state *ld) -{ - astring tempstring; - attotime curtime = ld->device->machine().time(); - ldplayer_data *player = ld->player; +//------------------------------------------------- +// control_w - write callback when the CONTROL +// line is toggled +//------------------------------------------------- + +void pioneer_pr8210_device::control_w(UINT8 data) +{ + // set the new value and remember the last + UINT8 prev = m_control; + m_control = data; - /* reset our state */ - memset(player, 0, sizeof(*player)); - player->lastcommandtime = curtime; - player->firstbittime = curtime; - player->lastbittime = curtime; - player->slowtrg = curtime; + // handle rising edge + if (prev != ASSERT_LINE && data == ASSERT_LINE) + { + // get the time difference from the last assert + // and update our internal command time + attotime curtime = machine().time(); + attotime delta = curtime - m_lastbittime; + m_lastbittime = curtime; - /* find our CPU */ - player->cpu = ld->device->subdevice("pr8210"); - assert(player->cpu != NULL); + // if we timed out since the first bit, reset the accumulator + attotime overalldelta = curtime - m_firstbittime; + if (overalldelta > SERIAL_MAX_WORD_TIME || delta > SERIAL_MAX_BIT_TIME) + { + m_firstbittime = curtime; + m_accumulator = 0x5555; + if (LOG_SERIAL) + printf("Reset accumulator\n"); + } - /* we don't have the Simutrek player overrides */ - player->simutrek.cpu = NULL; - player->simutrek.audio_squelch = FALSE; -} + // 0 bit delta is 1.05 msec, 1 bit delta is 2.11 msec + int longpulse = (delta < SERIAL_MIDPOINT_TIME) ? 0 : 1; + m_accumulator = (m_accumulator << 1) | longpulse; + // log the deltas for debugging + if (LOG_SERIAL) + { + int usecdiff = (int)(delta.attoseconds / ATTOSECONDS_IN_USEC(1)); + printf("bitdelta = %5d (%d) - accum = %04X\n", usecdiff, longpulse, m_accumulator); + } -/*------------------------------------------------- - pr8210_vsync - VSYNC callback, called at the - start of the blanking period --------------------------------------------------*/ + // if we have a complete command, signal it + // a complete command is 0,0,1 followed by 5 bits, followed by 0,0 + if ((m_accumulator & 0x383) == 0x80) + { + // data is stored to the PIA in bit-reverse order + UINT8 newcommand = (m_accumulator >> 2) & 0x1f; + m_pia.porta = BITSWAP8(newcommand, 0,1,2,3,4,5,6,7); + + // the MCU logic requires a 0 to execute many commands; however, nobody + // consistently sends a 0, whereas they do tend to send duplicate commands... + // if we assume that each duplicate causes a 0, we get the correct results + attotime rejectuntil = m_lastcommandtime + SERIAL_REJECT_DUPLICATE_TIME; + m_lastcommandtime = curtime; + if (m_pia.porta == m_lastcommand && curtime < rejectuntil) + m_pia.porta = 0x00; + else + m_lastcommand = m_pia.porta; -static void pr8210_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) -{ - ldplayer_data *player = ld->player; + // log the command and wait for a keypress + if (LOG_SERIAL) + printf("--- Command = %02X\n", m_pia.porta >> 3); - /* logging */ - if (LOG_VBLANK_VBI) - { - if ((vbi->line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - printf("%3d:VSYNC(%d,%05d)\n", ld->screen->vpos(), fieldnum, VBI_CAV_PICTURE(vbi->line1718)); - else - printf("%3d:VSYNC(%d)\n", ld->screen->vpos(), fieldnum); + // reset the first bit time so that the accumulator clears on the next write + m_firstbittime = curtime - SERIAL_MAX_WORD_TIME; + } } +} + - /* signal VSYNC and set a timer to turn it off */ - player->vsync = TRUE; - ld->device->machine().scheduler().timer_set(ld->screen->scan_period() * 4, FUNC(vsync_off), 0, ld); +//------------------------------------------------- +// device_start - device initialization +//------------------------------------------------- - /* also set a timer to fetch the VBI data when it is ready */ - ld->device->machine().scheduler().timer_set(ld->screen->time_until_pos(19*2), FUNC(vbi_data_fetch), 0, ld); +void pioneer_pr8210_device::device_start() +{ + // pass through to the parent + laserdisc_device::device_start(); } -/*------------------------------------------------- - pr8210_update - update callback, called on - the first visible line of the frame --------------------------------------------------*/ +//------------------------------------------------- +// device_reset - device reset +//------------------------------------------------- -static INT32 pr8210_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +void pioneer_pr8210_device::device_reset() { - ldplayer_data *player = ld->player; - UINT8 spdl_on = !(player->port1 & 0x10); - - /* logging */ - if (LOG_VBLANK_VBI) - printf("%3d:Update(%d)\n", ld->screen->vpos(), fieldnum); + // pass through to the parent + laserdisc_device::device_reset(); - /* if the spindle is on, we advance by 1 track after completing field #1 */ - return (spdl_on) ? fieldnum : 0; + // reset our state + attotime curtime = machine().time(); + m_lastcommandtime = curtime; + m_firstbittime = curtime; + m_lastbittime = curtime; + m_slowtrg = curtime; } -/*------------------------------------------------- - pr8210_overlay - overlay callback, called - during frame processing in update to overlay - player data --------------------------------------------------*/ +//------------------------------------------------- +// device_timer - handle timers set by this +// device +//------------------------------------------------- -static void pr8210_overlay(laserdisc_state *ld, bitmap_t *bitmap) +void pioneer_pr8210_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - ldplayer_data *player = ld->player; - - /* custom display */ - if (player->pia.display) + switch (id) { - overlay_draw_group(bitmap, &player->pia.text[2], 5, OVERLAY_GROUP1_X); - overlay_draw_group(bitmap, &player->pia.text[7], 5, OVERLAY_GROUP2_X); - overlay_draw_group(bitmap, &player->pia.text[12], 5, OVERLAY_GROUP3_X); - } + // update the VBI data in the PIA as soon as it is ready; + // this must happen early in the frame because the player + // logic relies on fetching it here + case TID_VBI_DATA_FETCH: - /* chapter/frame display */ - else - { - /* frame display */ - if (player->pia.latchdisplay & 2) - overlay_draw_group(bitmap, &player->pia.text[2], 5, OVERLAY_GROUP1_X); - - /* chapter overlay */ - if (player->pia.latchdisplay & 1) - overlay_draw_group(bitmap, &player->pia.text[0], 2, OVERLAY_GROUP0_X); + // logging + if (LOG_VBLANK_VBI) + { + UINT32 line1718 = get_field_code(LASERDISC_CODE_LINE1718, FALSE); + if ((line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + printf("%3d:VBI(%05d)\n", screen().vpos(), VBI_CAV_PICTURE(line1718)); + else + printf("%3d:VBI()\n", screen().vpos()); + } + + // update PIA registers based on vbi code + m_pia.vbi1 = 0xff; + m_pia.vbi2 = 0xff; + if (focus_on() && laser_on()) + { + UINT32 line16 = get_field_code(LASERDISC_CODE_LINE16, FALSE); + UINT32 line1718 = get_field_code(LASERDISC_CODE_LINE1718, FALSE); + if (line1718 == VBI_CODE_LEADIN) + m_pia.vbi1 &= ~0x01; + if (line1718 == VBI_CODE_LEADOUT) + m_pia.vbi1 &= ~0x02; + if (line16 == VBI_CODE_STOP) + m_pia.vbi1 &= ~0x04; + // unsure what this bit means: m_pia.vbi1 &= ~0x08; + if ((line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + { + m_pia.vbi1 &= ~0x10; + m_pia.frame[2] = 0xf0 | ((line1718 >> 16) & 0x07); + m_pia.frame[3] = 0xf0 | ((line1718 >> 12) & 0x0f); + m_pia.frame[4] = 0xf0 | ((line1718 >> 8) & 0x0f); + m_pia.frame[5] = 0xf0 | ((line1718 >> 4) & 0x0f); + m_pia.frame[6] = 0xf0 | ((line1718 >> 0) & 0x0f); + } + if ((line1718 & VBI_MASK_CHAPTER) == VBI_CODE_CHAPTER) + { + m_pia.vbi2 &= ~0x01; + m_pia.frame[0] = 0xf0 | ((line1718 >> 16) & 0x07); + m_pia.frame[1] = 0xf0 | ((line1718 >> 12) & 0x0f); + } + } + break; + + // clear the VSYNC flag + case TID_VSYNC_OFF: + m_vsync = false; + break; + + // pass everything else onto the parent + default: + laserdisc_device::device_timer(timer, id, param, ptr); + break; } - player->pia.latchdisplay = 0; } -/*------------------------------------------------- - pr8210_control_w - write callback when the - CONTROL line is toggled --------------------------------------------------*/ +//------------------------------------------------- +// device_rom_region - return a pointer to our +// ROM region definitions +//------------------------------------------------- -static void pr8210_control_w(laserdisc_state *ld, UINT8 prev, UINT8 data) +const rom_entry *pioneer_pr8210_device::device_rom_region() const { - ldplayer_data *player = ld->player; + return ROM_NAME(pr8210); +} - /* handle rising edge */ - if (prev != ASSERT_LINE && data == ASSERT_LINE) - { - attotime curtime = ld->device->machine().time(); - attotime delta, overalldelta; - int longpulse; - - /* get the time difference from the last assert */ - /* and update our internal command time */ - delta = curtime - player->lastbittime; - player->lastbittime = curtime; - /* if we timed out since the first bit, reset the accumulator */ - overalldelta = curtime - player->firstbittime; - if (overalldelta > SERIAL_MAX_WORD_TIME || delta > SERIAL_MAX_BIT_TIME) - { - player->firstbittime = curtime; - player->accumulator = 0x5555; - if (LOG_SERIAL) - printf("Reset accumulator\n"); - } +//------------------------------------------------- +// device_mconfig_additions - return a pointer to +// our machine config fragment +//------------------------------------------------- - /* 0 bit delta is 1.05 msec, 1 bit delta is 2.11 msec */ - longpulse = (delta < SERIAL_MIDPOINT_TIME) ? 0 : 1; - player->accumulator = (player->accumulator << 1) | longpulse; - - /* log the deltas for debugging */ - if (LOG_SERIAL) - { - int usecdiff = (int)(delta.attoseconds / ATTOSECONDS_IN_USEC(1)); - printf("bitdelta = %5d (%d) - accum = %04X\n", usecdiff, longpulse, player->accumulator); - } +machine_config_constructor pioneer_pr8210_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME(pr8210); +} - /* if we have a complete command, signal it */ - /* a complete command is 0,0,1 followed by 5 bits, followed by 0,0 */ - if ((player->accumulator & 0x383) == 0x80) - { - UINT8 newcommand = (player->accumulator >> 2) & 0x1f; - attotime rejectuntil; - /* data is stored to the PIA in bit-reverse order */ - player->pia.porta = BITSWAP8(newcommand, 0,1,2,3,4,5,6,7); +//------------------------------------------------- +// player_vsync - VSYNC callback, called at the +// start of the blanking period +//------------------------------------------------- - /* the MCU logic requires a 0 to execute many commands; however, nobody - consistently sends a 0, whereas they do tend to send duplicate commands... - if we assume that each duplicate causes a 0, we get the correct results */ - rejectuntil = player->lastcommandtime + SERIAL_REJECT_DUPLICATE_TIME; - player->lastcommandtime = curtime; - if (player->pia.porta == player->lastcommand && curtime < rejectuntil) - player->pia.porta = 0x00; - else - player->lastcommand = player->pia.porta; +void pioneer_pr8210_device::player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) +{ + // logging + if (LOG_VBLANK_VBI) + { + if ((vbi.line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + printf("%3d:VSYNC(%d,%05d)\n", screen().vpos(), fieldnum, VBI_CAV_PICTURE(vbi.line1718)); + else + printf("%3d:VSYNC(%d)\n", screen().vpos(), fieldnum); + } - /* log the command and wait for a keypress */ - if (LOG_SERIAL) - printf("--- Command = %02X\n", player->pia.porta >> 3); + // signal VSYNC and set a timer to turn it off + m_vsync = true; + timer_set(screen().scan_period() * 4, TID_VSYNC_OFF); - /* reset the first bit time so that the accumulator clears on the next write */ - player->firstbittime = curtime - SERIAL_MAX_WORD_TIME; - } - } + // also set a timer to fetch the VBI data when it is ready + timer_set(screen().time_until_pos(19*2), TID_VBI_DATA_FETCH); } -/*------------------------------------------------- - vsync_off - timer callback to clear the VSYNC - flag --------------------------------------------------*/ +//------------------------------------------------- +// player_update - update callback, called on the +// first visible line of the frame +//------------------------------------------------- -static TIMER_CALLBACK( vsync_off ) +INT32 pioneer_pr8210_device::player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ld->player->vsync = FALSE; + // logging + if (LOG_VBLANK_VBI) + printf("%3d:Update(%d)\n", screen().vpos(), fieldnum); + + // if the spindle is on, we advance by 1 track after completing field #1 + return spdl_on() ? fieldnum : 0; } -/*------------------------------------------------- - vbi_data_fetch - timer callback to update the - VBI data in the PIA as soon as it is ready; - this must happy early in the frame because - the player logic relies on fetching it here --------------------------------------------------*/ +//------------------------------------------------- +// player_overlay - overlay callback, called +// during frame processing in update to overlay +// player data +//------------------------------------------------- -static TIMER_CALLBACK( vbi_data_fetch ) +void pioneer_pr8210_device::player_overlay(bitmap_yuy16 &bitmap) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - UINT8 focus_on = !(player->port1 & 0x08); - UINT8 laser_on = !(player->port2 & 0x01); - UINT32 line16 = laserdisc_get_field_code(ld->device, LASERDISC_CODE_LINE16, FALSE); - UINT32 line1718 = laserdisc_get_field_code(ld->device, LASERDISC_CODE_LINE1718, FALSE); - - /* logging */ - if (LOG_VBLANK_VBI) + // custom display + if (m_pia.display) { - if ((line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - printf("%3d:VBI(%05d)\n", ld->screen->vpos(), VBI_CAV_PICTURE(line1718)); - else - printf("%3d:VBI()\n", ld->screen->vpos()); + overlay_draw_group(bitmap, &m_pia.text[2], 5, OVERLAY_GROUP1_X); + overlay_draw_group(bitmap, &m_pia.text[7], 5, OVERLAY_GROUP2_X); + overlay_draw_group(bitmap, &m_pia.text[12], 5, OVERLAY_GROUP3_X); } - /* update PIA registers based on vbi code */ - player->pia.vbi1 = 0xff; - player->pia.vbi2 = 0xff; - if (focus_on && laser_on) + // chapter/frame display + else { - if (line1718 == VBI_CODE_LEADIN) - player->pia.vbi1 &= ~0x01; - if (line1718 == VBI_CODE_LEADOUT) - player->pia.vbi1 &= ~0x02; - if (line16 == VBI_CODE_STOP) - player->pia.vbi1 &= ~0x04; - /* unsure what this bit means: player->pia.vbi1 &= ~0x08; */ - if ((line1718 & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - { - player->pia.vbi1 &= ~0x10; - player->pia.frame[2] = 0xf0 | ((line1718 >> 16) & 0x07); - player->pia.frame[3] = 0xf0 | ((line1718 >> 12) & 0x0f); - player->pia.frame[4] = 0xf0 | ((line1718 >> 8) & 0x0f); - player->pia.frame[5] = 0xf0 | ((line1718 >> 4) & 0x0f); - player->pia.frame[6] = 0xf0 | ((line1718 >> 0) & 0x0f); - } - if ((line1718 & VBI_MASK_CHAPTER) == VBI_CODE_CHAPTER) - { - player->pia.vbi2 &= ~0x01; - player->pia.frame[0] = 0xf0 | ((line1718 >> 16) & 0x07); - player->pia.frame[1] = 0xf0 | ((line1718 >> 12) & 0x0f); - } + // frame display + if (m_pia.latchdisplay & 2) + overlay_draw_group(bitmap, &m_pia.text[2], 5, OVERLAY_GROUP1_X); + + // chapter overlay + if (m_pia.latchdisplay & 1) + overlay_draw_group(bitmap, &m_pia.text[0], 2, OVERLAY_GROUP0_X); } + m_pia.latchdisplay = 0; } -/*------------------------------------------------- - pr8210_pia_r - handle reads from the mystery - Pioneer PIA --------------------------------------------------*/ +//------------------------------------------------- +// i8049_pia_r - handle reads from the mystery +// Pioneer PIA +//------------------------------------------------- -static READ8_HANDLER( pr8210_pia_r ) +READ8_MEMBER( pioneer_pr8210_device::i8049_pia_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; UINT8 result = 0xff; - switch (offset) { - /* (20-26) 7 characters for the chapter/frame */ + // (20-26) 7 characters for the chapter/frame case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: - result = player->pia.frame[offset - 0x20]; + result = m_pia.frame[offset - 0x20]; break; - /* (1D-1F,27) invalid read but normal */ + // (1D-1F,27) invalid read but normal case 0x1d: case 0x1e: case 0x1f: case 0x27: break; - /* (A0) port A value (from serial decoder) */ + // (A0) port A value (from serial decoder) case 0xa0: - result = player->pia.porta; + result = m_pia.porta; break; - /* (C0) VBI decoding state 1 */ + // (C0) VBI decoding state 1 case 0xc0: if (LOG_VBLANK_VBI) - printf("%3d:PIA(C0)\n", ld->screen->vpos()); - result = player->pia.vbi1; + printf("%3d:PIA(C0)\n", screen().vpos()); + result = m_pia.vbi1; break; - /* (E0) VBI decoding state 2 */ + // (E0) VBI decoding state 2 case 0xe0: if (LOG_VBLANK_VBI) - printf("%3d:PIA(E0)\n", ld->screen->vpos()); - result = player->pia.vbi2; + printf("%3d:PIA(E0)\n", screen().vpos()); + result = m_pia.vbi2; break; default: - mame_printf_debug("%03X:Unknown PR-8210 PIA read from offset %02X\n", cpu_get_pc(&space->device()), offset); + mame_printf_debug("%03X:Unknown PR-8210 PIA read from offset %02X\n", cpu_get_pc(&space.device()), offset); break; } return result; } -/*------------------------------------------------- - pr8210_pia_w - handle writes to the mystery - Pioneer PIA --------------------------------------------------*/ +//------------------------------------------------- +// i8049_pia_w - handle writes to the mystery +// Pioneer PIA +//------------------------------------------------- -static WRITE8_HANDLER( pr8210_pia_w ) +WRITE8_MEMBER( pioneer_pr8210_device::i8049_pia_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; UINT8 value; - switch (offset) { - /* (20-30) 17 characters for the display */ + // (20-30) 17 characters for the display case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: case 0x30: - player->pia.text[offset - 0x20] = data; + m_pia.text[offset - 0x20] = data; break; - /* (40) control lines */ + // (40) control lines case 0x40: - /* toggle bit 0 to latch chapter number into display area */ - if (!(data & 0x01) && (player->pia.control & 0x01)) + // toggle bit 0 to latch chapter number into display area + if (!(data & 0x01) && (m_pia.control & 0x01)) { - memcpy(&player->pia.text[0], &player->pia.frame[0], 2); - player->pia.latchdisplay |= 1; + memcpy(&m_pia.text[0], &m_pia.frame[0], 2); + m_pia.latchdisplay |= 1; } - /* toggle bit 1 to latch frame number into display area */ - if (!(data & 0x02) && (player->pia.control & 0x02)) + // toggle bit 1 to latch frame number into display area + if (!(data & 0x02) && (m_pia.control & 0x02)) { - memcpy(&player->pia.text[2], &player->pia.frame[2], 5); - player->pia.latchdisplay |= 2; + memcpy(&m_pia.text[2], &m_pia.frame[2], 5); + m_pia.latchdisplay |= 2; } - player->pia.control = data; + m_pia.control = data; break; - /* (60) port B value (LEDs) */ + // (60) port B value (LEDs) case 0x60: - /* these 4 are direct-connect */ + // these 4 are direct-connect output_set_value("pr8210_audio1", (data & 0x01) != 0); output_set_value("pr8210_audio2", (data & 0x02) != 0); output_set_value("pr8210_clv", (data & 0x04) != 0); output_set_value("pr8210_cav", (data & 0x08) != 0); - /* remaining 3 bits select one of 5 LEDs via a mux */ + // remaining 3 bits select one of 5 LEDs via a mux value = ((data & 0x40) >> 6) | ((data & 0x20) >> 4) | ((data & 0x10) >> 2); output_set_value("pr8210_srev", (value == 0)); output_set_value("pr8210_sfwd", (value == 1)); @@ -689,29 +606,29 @@ output_set_value("pr8210_step", (value == 3)); output_set_value("pr8210_pause", (value == 4)); - player->pia.portb = data; - update_audio_squelch(ld); + m_pia.portb = data; + update_audio_squelch(); break; - /* (80) display enable */ + // (80) display enable case 0x80: - player->pia.display = data & 0x01; + m_pia.display = data & 0x01; break; - /* no other writes known */ + // no other writes known default: - mame_printf_debug("%03X:Unknown PR-8210 PIA write to offset %02X = %02X\n", cpu_get_pc(&space->device()), offset, data); + mame_printf_debug("%03X:Unknown PR-8210 PIA write to offset %02X = %02X\n", cpu_get_pc(&space.device()), offset, data); break; } } -/*------------------------------------------------- - pr8210_bus_r - handle reads from the 8049 BUS - input, which is enabled via the PIA above --------------------------------------------------*/ +//------------------------------------------------- +// i8049_bus_r - handle reads from the 8049 BUS +// input, which is enabled via the PIA above +//------------------------------------------------- -static READ8_HANDLER( pr8210_bus_r ) +READ8_MEMBER( pioneer_pr8210_device::i8049_bus_r ) { /* $80 = n/c @@ -723,42 +640,39 @@ $02 = (in) FG via op-amp (spindle motor stop detector) $01 = (in) SLOW TIMER OUT */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - slider_position sliderpos = ldcore_get_slider_position(ld); - UINT8 focus_on = !(player->port1 & 0x08); - UINT8 spdl_on = !(player->port1 & 0x10); + UINT8 result = 0x00; - /* bus bit 6: slider position limit detector, inside and outside */ + // bus bit 6: slider position limit detector, inside and outside + slider_position sliderpos = get_slider_position(); if (sliderpos != SLIDER_MINIMUM && sliderpos != SLIDER_MAXIMUM) result |= 0x40; - /* bus bit 4: /FOCUS LOCK */ - if (!focus_on) + // bus bit 4: /FOCUS LOCK + if (!focus_on()) result |= 0x10; - /* bus bit 3: /SPDL LOCK */ - if (!spdl_on) + // bus bit 3: /SPDL LOCK + if (!spdl_on()) result |= 0x08; - /* bus bit 1: spindle motor stop detector */ - if (!spdl_on) + // bus bit 1: spindle motor stop detector + if (!spdl_on()) result |= 0x02; - /* bus bit 0: SLOW TIMER OUT */ + // bus bit 0: SLOW TIMER OUT - /* loop at beginning waits for $40=0, $02=1 */ + // loop at beginning waits for $40=0, $02=1 return result; } -/*------------------------------------------------- - pr8210_port1_w - handle writes to the 8049 - port #1 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port1_w - handle writes to the 8049 +// port #1 +//------------------------------------------------- -static WRITE8_HANDLER( pr8210_port1_w ) +WRITE8_MEMBER( pioneer_pr8210_device::i8049_port1_w ) { /* $80 = (out) SCAN C (F/R) @@ -770,57 +684,52 @@ $02 = (out) SCAN A (/SCAN) $01 = (out) JUMP TRG (jump back trigger, clock on high->low) */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->port1; - int direction; - /* set the new value */ - player->port1 = data; + // set the new value + UINT8 prev = m_i8049_port1; + m_i8049_port1 = data; - /* bit 7 selects the direction of slider movement for JUMP TRG and scanning */ - direction = (data & 0x80) ? 1 : -1; + // bit 7 selects the direction of slider movement for JUMP TRG and scanning + int direction = (data & 0x80) ? 1 : -1; - /* on the falling edge of bit 0, jump one track in either direction */ + // on the falling edge of bit 0, jump one track in either direction if (!(data & 0x01) && (prev & 0x01)) { - /* special override for the Simutrek, which takes over control of this is some situations */ - if (player->simutrek.cpu == NULL || !player->simutrek.controlthis) + // special override for the Simutrek, which takes over control of this is some situations + if (!override_control()) { if (LOG_SIMUTREK) - printf("%3d:JUMP TRG\n", ld->screen->vpos()); - ldcore_advance_slider(ld, direction); + printf("%3d:JUMP TRG\n", screen().vpos()); + advance_slider(direction); } else if (LOG_SIMUTREK) - printf("%3d:Skipped JUMP TRG\n", ld->screen->vpos()); + printf("%3d:Skipped JUMP TRG\n", screen().vpos()); } - /* bit 1 low enables scanning */ + // bit 1 low enables scanning if (!(data & 0x02)) { - /* bit 2 selects the speed */ + // bit 2 selects the speed int delta = (data & 0x04) ? SCAN_SPEED : SEEK_FAST_SPEED; - ldcore_set_slider_speed(ld, delta * direction); + set_slider_speed(delta * direction); } - /* bit 1 high stops scanning */ + // bit 1 high stops scanning else - ldcore_set_slider_speed(ld, 0); + set_slider_speed(0); - /* video squelch is controlled by bit 5 */ - update_video_squelch(ld); - - /* audio squelch is controlled by bit 6 */ - update_audio_squelch(ld); + // video squelch is controlled by bit 5; audio squelch is controlled by bit 6 + update_video_squelch(); + update_audio_squelch(); } -/*------------------------------------------------- - pr8210_port2_w - handle writes to the 8049 - port #2 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port2_w - handle writes to the 8049 +// port #2 +//------------------------------------------------- -static WRITE8_HANDLER( pr8210_port2_w ) +WRITE8_MEMBER( pioneer_pr8210_device::i8049_port2_w ) { /* $80 = (out) /CS on PIA @@ -832,96 +741,87 @@ $02 = (out) ??? $01 = (out) LASER ON */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->port2; - /* set the new value */ - player->port2 = data; + // set the new value + UINT8 prev = m_i8049_port2; + m_i8049_port2 = data; - /* on the falling edge of bit 5, start the slow timer */ + // on the falling edge of bit 5, start the slow timer if (!(data & 0x20) && (prev & 0x20)) - player->slowtrg = space->machine().time(); + m_slowtrg = machine().time(); - /* bit 6 when low triggers an IRQ on the MCU */ - if (player->cpu != NULL) - device_set_input_line(player->cpu, MCS48_INPUT_IRQ, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + // bit 6 when low triggers an IRQ on the MCU + m_i8049_cpu->set_input_line(MCS48_INPUT_IRQ, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); - /* standby LED is set accordingl to bit 4 */ + // standby LED is set accordingl to bit 4 output_set_value("pr8210_standby", (data & 0x10) != 0); } -/*------------------------------------------------- - pr8210_t0_r - return the state of the 8049 - T0 input (connected to VSYNC) --------------------------------------------------*/ +//------------------------------------------------- +// i8049_t0_r - return the state of the 8049 +// T0 input (connected to VSYNC) +//------------------------------------------------- -static READ8_HANDLER( pr8210_t0_r ) +READ8_MEMBER( pioneer_pr8210_device::i8049_t0_r ) { - /* returns VSYNC state */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - return !ld->player->vsync; + // returns VSYNC state + return !m_vsync; } -/*------------------------------------------------- - pr8210_t1_r - return the state of the 8049 - T1 input (pulled high) --------------------------------------------------*/ +//------------------------------------------------- +// i8049_t1_r - return the state of the 8049 +// T1 input (pulled high) +//------------------------------------------------- -static READ8_HANDLER( pr8210_t1_r ) +READ8_MEMBER( pioneer_pr8210_device::i8049_t1_r ) { return 1; } -/*------------------------------------------------- - overlay_draw_group - draw a single group of - characters --------------------------------------------------*/ +//------------------------------------------------- +// overlay_draw_group - draw a single group of +// characters +//------------------------------------------------- -static void overlay_draw_group(bitmap_t *bitmap, const UINT8 *text, int count, float xstart) +void pioneer_pr8210_device::overlay_draw_group(bitmap_yuy16 &bitmap, const UINT8 *text, int count, float xstart) { - int skip = TRUE; - int x; - - /* rease the background */ + // rease the background overlay_erase(bitmap, xstart, xstart + ((OVERLAY_X_PIXELS + 1) * count + 1) * OVERLAY_PIXEL_WIDTH); - /* draw each character, suppressing leading 0's */ - for (x = 0; x < count; x++) + // draw each character, suppressing leading 0's + bool skip = true; + for (int x = 0; x < count; x++) if (!skip || x == count - 1 || (text[x] & 0x3f) != 0x30) { - skip = FALSE; + skip = false; overlay_draw_char(bitmap, text[x], xstart + ((OVERLAY_X_PIXELS + 1) * x + 1) * OVERLAY_PIXEL_WIDTH); } } -/*------------------------------------------------- - overlay_erase - erase the background area - where the text overlay will be displayed --------------------------------------------------*/ - -static void overlay_erase(bitmap_t *bitmap, float xstart, float xend) -{ - UINT32 xmin = (UINT32)(xstart * 256.0f * (float)bitmap->width); - UINT32 xmax = (UINT32)(xend * 256.0f * (float)bitmap->width); - UINT32 x, y; +//------------------------------------------------- +// overlay_erase - erase the background area +// where the text overlay will be displayed +//------------------------------------------------- - for (y = OVERLAY_Y; y < (OVERLAY_Y + (OVERLAY_Y_PIXELS + 2) * OVERLAY_PIXEL_HEIGHT); y++) - { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, xmin >> 8); - UINT16 ymin, ymax, yres; +void pioneer_pr8210_device::overlay_erase(bitmap_yuy16 &bitmap, float xstart, float xend) +{ + UINT32 xmin = (UINT32)(xstart * 256.0f * float(bitmap.width())); + UINT32 xmax = (UINT32)(xend * 256.0f * float(bitmap.width())); - ymax = *dest >> 8; - ymin = ymax * 3 / 8; - yres = ymin + ((ymax - ymin) * (xmin & 0xff)) / 256; + for (UINT32 y = OVERLAY_Y; y < (OVERLAY_Y + (OVERLAY_Y_PIXELS + 2) * OVERLAY_PIXEL_HEIGHT); y++) + { + UINT16 *dest = &bitmap.pix16(y, xmin >> 8); + UINT16 ymax = *dest >> 8; + UINT16 ymin = ymax * 3 / 8; + UINT16 yres = ymin + ((ymax - ymin) * (xmin & 0xff)) / 256; *dest = (yres << 8) | (*dest & 0xff); dest++; - for (x = (xmin | 0xff) + 1; x < xmax; x += 0x100) + for (UINT32 x = (xmin | 0xff) + 1; x < xmax; x += 0x100) { yres = (*dest >> 8) * 3 / 8; *dest = (yres << 8) | (*dest & 0xff); @@ -937,40 +837,37 @@ } -/*------------------------------------------------- - overlay_draw_char - draw a single character - of the text overlay --------------------------------------------------*/ +//------------------------------------------------- +// overlay_draw_char - draw a single character +// of the text overlay +//------------------------------------------------- -static void overlay_draw_char(bitmap_t *bitmap, UINT8 ch, float xstart) +void pioneer_pr8210_device::overlay_draw_char(bitmap_yuy16 &bitmap, UINT8 ch, float xstart) { - UINT32 xminbase = (UINT32)(xstart * 256.0f * (float)bitmap->width); - UINT32 xsize = (UINT32)(OVERLAY_PIXEL_WIDTH * 256.0f * (float)bitmap->width); - const UINT8 *chdataptr = &text_bitmap[ch & 0x3f][0]; - UINT32 x, y, xx, yy; + UINT32 xminbase = (UINT32)(xstart * 256.0f * float(bitmap.width())); + UINT32 xsize = (UINT32)(OVERLAY_PIXEL_WIDTH * 256.0f * float(bitmap.width())); - /* iterate over pixels */ - for (y = 0; y < OVERLAY_Y_PIXELS; y++) + // iterate over pixels + const UINT8 *chdataptr = &text_bitmap[ch & 0x3f][0]; + for (UINT32 y = 0; y < OVERLAY_Y_PIXELS; y++) { UINT8 chdata = *chdataptr++; - for (x = 0; x < OVERLAY_X_PIXELS; x++, chdata <<= 1) + for (UINT32 x = 0; x < OVERLAY_X_PIXELS; x++, chdata <<= 1) if (chdata & 0x80) { UINT32 xmin = xminbase + x * xsize; UINT32 xmax = xmin + xsize; - for (yy = 0; yy < OVERLAY_PIXEL_HEIGHT; yy++) + for (UINT32 yy = 0; yy < OVERLAY_PIXEL_HEIGHT; yy++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, OVERLAY_Y + (y + 1) * OVERLAY_PIXEL_HEIGHT + yy, xmin >> 8); - UINT16 ymin, ymax, yres; - - ymax = 0xff; - ymin = *dest >> 8; - yres = ymin + ((ymax - ymin) * (~xmin & 0xff)) / 256; + UINT16 *dest = &bitmap.pix16(OVERLAY_Y + (y + 1) * OVERLAY_PIXEL_HEIGHT + yy, xmin >> 8); + UINT16 ymax = 0xff; + UINT16 ymin = *dest >> 8; + UINT16 yres = ymin + ((ymax - ymin) * (~xmin & 0xff)) / 256; *dest = (yres << 8) | (*dest & 0xff); dest++; - for (xx = (xmin | 0xff) + 1; xx < xmax; xx += 0x100) + for (UINT32 xx = (xmin | 0xff) + 1; xx < xmax; xx += 0x100) *dest++ = 0xf080; ymax = 0xff; @@ -985,14 +882,14 @@ -/*************************************************************************** - SIMUTREK ROM AND MACHINE INTERFACES -***************************************************************************/ - -static ADDRESS_MAP_START( simutrek_portmap, AS_IO, 8 ) - AM_RANGE(0x00, 0xff) AM_READ(simutrek_data_r) - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(simutrek_port2_r, simutrek_port2_w) - AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(simutrek_t0_r) +//************************************************************************** +// SIMUTREK ROM AND MACHINE INTERFACES +//************************************************************************** + +static ADDRESS_MAP_START( simutrek_portmap, AS_IO, 8, simutrek_special_device ) + AM_RANGE(0x00, 0xff) AM_READ(i8748_data_r) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(i8748_port2_r, i8748_port2_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(i8748_t0_r) ADDRESS_MAP_END @@ -1014,258 +911,227 @@ -/*************************************************************************** - SIMUTREK PLAYER INTERFACE -***************************************************************************/ - -const ldplayer_interface simutrek_interface = -{ - LASERDISC_TYPE_SIMUTREK_SPECIAL, /* type of the player */ - sizeof(ldplayer_data), /* size of the state */ - "Simutrek Modified PR-8210", /* name of the player */ - "mpr8210", /* shortname of the player */ - ROM_NAME(simutrek), /* pointer to ROM region information */ - MACHINE_CONFIG_NAME(simutrek), /* pointer to machine configuration */ - simutrek_init, /* initialization callback */ - simutrek_vsync, /* vsync callback */ - simutrek_update, /* update callback */ - pr8210_overlay, /* overlay callback */ - simutrek_data_w, /* parallel data write */ - { /* single line write: */ - NULL, /* LASERDISC_LINE_ENTER */ - NULL /* LASERDISC_LINE_CONTROL */ - }, - NULL, /* parallel data read */ - { /* single line read: */ - simutrek_ready_r, /* LASERDISC_LINE_READY */ - simutrek_status_r, /* LASERDISC_LINE_STATUS */ - NULL, /* LASERDISC_LINE_COMMAND */ - NULL, /* LASERDISC_LINE_DATA_AVAIL */ - } -}; - +//************************************************************************** +// SIMUTREK IMPLEMENTATION +//************************************************************************** +//------------------------------------------------- +// simutrek_special_device - constructor +//------------------------------------------------- -/*************************************************************************** - SIMUTREK IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - simutrek_set_audio_squelch - Simutrek-specific - command to enable/disable audio squelch --------------------------------------------------*/ - -void simutrek_set_audio_squelch(device_t *device, int state) -{ - laserdisc_state *ld = ldcore_get_safe_token(device); - ldplayer_data *player = ld->player; - if (LOG_SIMUTREK && player->simutrek.audio_squelch != (state == 0)) - printf("--> audio squelch = %d\n", state == 0); - player->simutrek.audio_squelch = (state == 0); - update_audio_squelch(ld); +simutrek_special_device::simutrek_special_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : pioneer_pr8210_device(mconfig, SIMUTREK_SPECIAL, "Simutrek Modified PR-8210", "simutrek", tag, owner, clock), + m_i8748_cpu(*this, "simutrek"), + m_audio_squelch(0), + m_data(0), + m_data_ready(false), + m_i8748_port2(0), + m_controlnext(0), + m_controlthis(0) +{ } -/*------------------------------------------------- - simutrek_init - Simutrek-specific - initialization --------------------------------------------------*/ +//------------------------------------------------- +// data_w - write callback when the parallel data +// port is written to +//------------------------------------------------- -static void simutrek_init(laserdisc_state *ld) +void simutrek_special_device::data_w(UINT8 data) { - astring tempstring; - ldplayer_data *player = ld->player; - - /* standard PR-8210 initialization */ - pr8210_init(ld); - - /* initialize the Simutrek state */ - /* for proper synchronization of initial attract mode, this needs to be set */ - player->simutrek.data_ready = 1; - - /* find the Simutrek CPU */ - player->simutrek.cpu = ld->device->subdevice("simutrek"); + synchronize(TID_LATCH_DATA, data); + if (LOG_SIMUTREK) + printf("%03d:**** Simutrek Command = %02X\n", screen().vpos(), data); } -/*------------------------------------------------- - simutrek_vsync - VSYNC callback, called at the - start of the blanking period --------------------------------------------------*/ +//------------------------------------------------- +// set_external_audio_squelch - Simutrek-specific +// command to enable/disable audio squelch +//------------------------------------------------- -static TIMER_CALLBACK( irq_off ) +void simutrek_special_device::set_external_audio_squelch(int state) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - device_set_input_line(player->simutrek.cpu, MCS48_INPUT_IRQ, CLEAR_LINE); - if (LOG_SIMUTREK) - printf("%3d:**** Simutrek IRQ clear\n", ld->screen->vpos()); + if (LOG_SIMUTREK && m_audio_squelch != (state == 0)) + printf("--> audio squelch = %d\n", state == 0); + m_audio_squelch = (state == 0); + update_audio_squelch(); } -static void simutrek_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) -{ - ldplayer_data *player = ld->player; +//------------------------------------------------- +// player_vsync - VSYNC callback, called at the +// start of the blanking period +//------------------------------------------------- + +void simutrek_special_device::player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) +{ + // latch the control state after the second field if (fieldnum == 1) { - player->simutrek.controlthis = player->simutrek.controlnext; - player->simutrek.controlnext = 0; + m_controlthis = m_controlnext; + m_controlnext = 0; } + // call the parent if (LOG_SIMUTREK) - printf("%3d:VSYNC(%d)\n", ld->screen->vpos(), fieldnum); - pr8210_vsync(ld, vbi, fieldnum, curtime); + printf("%3d:VSYNC(%d)\n", screen().vpos(), fieldnum); + pioneer_pr8210_device::player_vsync(vbi, fieldnum, curtime); - if (player->simutrek.data_ready) + // process data + if (m_data_ready) { if (LOG_SIMUTREK) - printf("%3d:VSYNC IRQ\n", ld->screen->vpos()); - device_set_input_line(player->simutrek.cpu, MCS48_INPUT_IRQ, ASSERT_LINE); - ld->device->machine().scheduler().timer_set(ld->screen->scan_period(), FUNC(irq_off), 0, ld); + printf("%3d:VSYNC IRQ\n", screen().vpos()); + m_i8748_cpu->set_input_line(MCS48_INPUT_IRQ, ASSERT_LINE); + timer_set(screen().scan_period(), TID_IRQ_OFF); } } -/*------------------------------------------------- - simutrek_update - update callback, called on - the first visible line of the frame --------------------------------------------------*/ +//------------------------------------------------- +// device_start - device initialization +//------------------------------------------------- -static INT32 simutrek_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +void simutrek_special_device::device_start() { - return pr8210_update(ld, vbi, fieldnum, curtime); + // pass through to the parent + pioneer_pr8210_device::device_start(); } -/*------------------------------------------------- - simutrek_ready_r - read callback when the - READY line is read --------------------------------------------------*/ +//------------------------------------------------- +// device_reset - device reset +//------------------------------------------------- -static UINT8 simutrek_ready_r(laserdisc_state *ld) +void simutrek_special_device::device_reset() { - return !ld->player->simutrek.data_ready; + // standard PR-8210 initialization + pioneer_pr8210_device::device_reset(); + + // initialize the Simutrek state + // for proper synchronization of initial attract mode, this needs to be set + m_data_ready = true; } -/*------------------------------------------------- - simutrek_status_r - read callback when the - STATUS line is read --------------------------------------------------*/ +//------------------------------------------------- +// device_timer - handle timers set by this +// device +//------------------------------------------------- -static UINT8 simutrek_status_r(laserdisc_state *ld) +void simutrek_special_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - return ((ld->player->simutrek.port2 & 0x03) == 0x03) ? ASSERT_LINE : CLEAR_LINE; + switch (id) + { + // clear the 8748 IRQ + case TID_IRQ_OFF: + m_i8748_cpu->set_input_line(MCS48_INPUT_IRQ, CLEAR_LINE); + break; + + // latch data + case TID_LATCH_DATA: + m_data = param; + m_data_ready = true; + break; + + // pass everything else onto the parent + default: + pioneer_pr8210_device::device_timer(timer, id, param, ptr); + break; + } } -/*------------------------------------------------- - simutrek_data_w - write callback when the - parallel data port is written to --------------------------------------------------*/ +//------------------------------------------------- +// device_rom_region - return a pointer to our +// ROM region definitions +//------------------------------------------------- -static void simutrek_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data) +const rom_entry *simutrek_special_device::device_rom_region() const { - ld->device->machine().scheduler().synchronize(FUNC(simutrek_latched_data_w), data, ld); - if (LOG_SIMUTREK) - printf("%03d:**** Simutrek Command = %02X\n", ld->screen->vpos(), data); + return ROM_NAME(simutrek); } -/*------------------------------------------------- - simutrek_latched_data_w - deferred write - callback for when data is written --------------------------------------------------*/ +//------------------------------------------------- +// device_mconfig_additions - return a pointer to +// our machine config fragment +//------------------------------------------------- -static TIMER_CALLBACK( simutrek_latched_data_w ) +machine_config_constructor simutrek_special_device::device_mconfig_additions() const { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - - /* store the data and set the ready flag */ - player->simutrek.data = param; - player->simutrek.data_ready = TRUE; + return MACHINE_CONFIG_NAME(simutrek); } -/*------------------------------------------------- - simutrek_port2_r - handle reads from the 8748 - port #2 --------------------------------------------------*/ +//------------------------------------------------- +// i8748_port2_r - handle reads from the 8748 +// port #2 +//------------------------------------------------- -static READ8_HANDLER( simutrek_port2_r ) +READ8_MEMBER( simutrek_special_device::i8748_port2_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - - /* bit $80 is the pr8210 video squelch */ - return (player->port1 & 0x20) ? 0x00 : 0x80; + // bit $80 is the pr8210 video squelch + return (m_i8049_port1 & 0x20) ? 0x00 : 0x80; } -/*------------------------------------------------- - simutrek_port2_w - handle writes to the 8748 - port #2 --------------------------------------------------*/ +//------------------------------------------------- +// i8748_port2_w - handle writes to the 8748 +// port #2 +//------------------------------------------------- -static WRITE8_HANDLER( simutrek_port2_w ) +WRITE8_MEMBER( simutrek_special_device::i8748_port2_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->simutrek.port2; + // update stat + UINT8 prev = m_i8748_port2; + m_i8748_port2 = data; - /* update stat */ - player->simutrek.port2 = data; - - /* bit $20 goes to the serial line */ + // bit $20 goes to the serial line if ((data ^ prev) & 0x20) - pr8210_control_w(ld, (data & 0x20) ? ASSERT_LINE : CLEAR_LINE, (data & 0x20) ? CLEAR_LINE : ASSERT_LINE); + pioneer_pr8210_device::control_w((data & 0x20) ? ASSERT_LINE : CLEAR_LINE); - /* bit $10 goes to JUMP TRG */ - /* bit $08 controls direction */ + // bit $10 goes to JUMP TRG + // bit $08 controls direction if (!(data & 0x10) && (prev & 0x10)) { int direction = (data & 0x08) ? 1 : -1; if (LOG_SIMUTREK) - printf("%3d:JUMP TRG (Simutrek PC=%03X)\n", ld->screen->vpos(), cpu_get_pc(&space->device())); - ldcore_advance_slider(ld, direction); + printf("%3d:JUMP TRG (Simutrek PC=%03X)\n", screen().vpos(), cpu_get_pc(&space.device())); + advance_slider(direction); } - /* bit $04 controls who owns the JUMP TRG command */ + // bit $04 controls who owns the JUMP TRG command if (LOG_SIMUTREK && ((data ^ prev) & 0x04)) - printf("%3d:Simutrek ownership line = %d (Simutrek PC=%03X)\n", ld->screen->vpos(), (data >> 2) & 1, cpu_get_pc(&space->device())); - player->simutrek.controlnext = (~data >> 2) & 1; + printf("%3d:Simutrek ownership line = %d (Simutrek PC=%03X)\n", screen().vpos(), (data >> 2) & 1, cpu_get_pc(&space.device())); + m_controlnext = (~data >> 2) & 1; - /* bits $03 control something (status?) */ + // bits $03 control something (status?) if (LOG_SIMUTREK && ((data ^ prev) & 0x03)) printf("Simutrek Status = %d\n", data & 0x03); } -/*------------------------------------------------- - simutrek_data_r - handle external 8748 data - reads --------------------------------------------------*/ +//------------------------------------------------- +// i8748_data_r - handle external 8748 data reads +//------------------------------------------------- -static READ8_HANDLER( simutrek_data_r ) +READ8_MEMBER( simutrek_special_device::i8748_data_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - - /* acknowledge the read and clear the data ready flag */ - player->simutrek.data_ready = FALSE; - return player->simutrek.data; + // acknowledge the read and clear the data ready flag + m_data_ready = false; + return m_data; } -/*------------------------------------------------- - simutrek_t0_r - return the status of the - 8748 T0 input --------------------------------------------------*/ +//------------------------------------------------- +// i8748_t0_r - return the status of the 8748 +// T0 input +//------------------------------------------------- -static READ8_HANDLER( simutrek_t0_r ) +READ8_MEMBER( simutrek_special_device::i8748_t0_r ) { - /* return 1 if data is waiting from main CPU */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - return ld->player->simutrek.data_ready; + // return 1 if data is waiting from main CPU + return m_data_ready; } diff -Nru mame-0.144/src/emu/machine/ldpr8210.h mame-0.145/src/emu/machine/ldpr8210.h --- mame-0.144/src/emu/machine/ldpr8210.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/ldpr8210.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,224 @@ +/************************************************************************* + + ldpr8210.h + + Pioneer PR-8210 laserdisc emulation. + +**************************************************************************** + + 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. + +*************************************************************************/ + +#pragma once + +#ifndef __LDPR8210_H__ +#define __LDPR8210_H__ + +#include "laserdsc.h" +#include "cpu/mcs48/mcs48.h" + + +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_LASERDISC_PR8210_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PIONEER_PR8210, 0) \ + +#define MCFG_LASERDISC_SIMUTREK_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, SIMUTREK_SPECIAL, 0) \ + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +extern const device_type PIONEER_PR8210; +extern const device_type SIMUTREK_SPECIAL; + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// pioneer PIA subclass +class pioneer_pia +{ +public: + UINT8 frame[7]; // (20-26) 7 characters for the chapter/frame + UINT8 text[17]; // (20-30) 17 characters for the display + UINT8 control; // (40) control lines + UINT8 latchdisplay; // flag: set if the display was latched + UINT8 portb; // (60) port B value (LEDs) + UINT8 display; // (80) display enable + UINT8 porta; // (A0) port A value (from serial decoder) + UINT8 vbi1; // (C0) VBI decoding state 1 + UINT8 vbi2; // (E0) VBI decoding state 2 +}; + + +// ======================> pioneer_pr8210_device + +// base pr8210 class +class pioneer_pr8210_device : public laserdisc_device +{ +public: + // construction/destruction + pioneer_pr8210_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + pioneer_pr8210_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock); + + // input and output + void control_w(UINT8 data); + +protected: + // timer IDs + enum + { + TID_VSYNC_OFF = TID_FIRST_PLAYER_TIMER, + TID_VBI_DATA_FETCH, + TID_FIRST_SUBCLASS_TIMER + }; + + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual void player_overlay(bitmap_yuy16 &bitmap); + + // internal helpers + bool focus_on() const { return !(m_i8049_port1 & 0x08); } + bool spdl_on() const { return !(m_i8049_port1 & 0x10); } + bool laser_on() const { return !(m_i8049_port2 & 0x01); } + virtual bool override_control() const { return false; } + void update_video_squelch() { set_video_squelch((m_i8049_port1 & 0x20) != 0); } + virtual void update_audio_squelch() { set_audio_squelch((m_i8049_port1 & 0x40) || !(m_pia.portb & 0x01), (m_i8049_port1 & 0x40) || !(m_pia.portb & 0x02)); } + +public: + // internal read/write handlers + DECLARE_READ8_MEMBER( i8049_pia_r ); + DECLARE_WRITE8_MEMBER( i8049_pia_w ); + DECLARE_READ8_MEMBER( i8049_bus_r ); + DECLARE_WRITE8_MEMBER( i8049_port1_w ); + DECLARE_WRITE8_MEMBER( i8049_port2_w ); + DECLARE_READ8_MEMBER( i8049_t0_r ); + DECLARE_READ8_MEMBER( i8049_t1_r ); + +protected: + // internal overlay helpers + void overlay_draw_group(bitmap_yuy16 &bitmap, const UINT8 *text, int count, float xstart); + void overlay_erase(bitmap_yuy16 &bitmap, float xstart, float xend); + void overlay_draw_char(bitmap_yuy16 &bitmap, UINT8 ch, float xstart); + + // internal state + UINT8 m_control; // control line state + UINT8 m_lastcommand; // last command seen + UINT16 m_accumulator; // bit accumulator + attotime m_lastcommandtime; // time of the last command + attotime m_lastbittime; // time of last bit received + attotime m_firstbittime; // time of first bit in command + + // low-level emulation data + required_device m_i8049_cpu; // 8049 CPU device + attotime m_slowtrg; // time of the last SLOW TRG + pioneer_pia m_pia; // PIA state + bool m_vsync; // live VSYNC state + UINT8 m_i8049_port1; // 8049 port 1 state + UINT8 m_i8049_port2; // 8049 port 2 state +}; + + +// ======================> simutrek_special_device + +class simutrek_special_device : public pioneer_pr8210_device +{ +public: + // construction/destruction + simutrek_special_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // input and output + void data_w(UINT8 data); + UINT8 ready_r() const { return !m_data_ready; } + UINT8 status_r() const { return ((m_i8748_port2 & 0x03) == 0x03) ? ASSERT_LINE : CLEAR_LINE; } + + // external controls + void set_external_audio_squelch(int state); + +protected: + // timer IDs + enum + { + TID_IRQ_OFF = TID_FIRST_SUBCLASS_TIMER, + TID_LATCH_DATA + }; + + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime); + + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + + // internal helpers + virtual bool override_control() const { return m_controlthis; } + virtual void update_audio_squelch() { set_audio_squelch(m_audio_squelch, m_audio_squelch); } + +public: + // internal read/write handlers + DECLARE_READ8_MEMBER( i8748_port2_r ); + DECLARE_WRITE8_MEMBER( i8748_port2_w ); + DECLARE_READ8_MEMBER( i8748_data_r ); + DECLARE_READ8_MEMBER( i8748_t0_r ); + +protected: + // internal state + required_device m_i8748_cpu; + UINT8 m_audio_squelch; // audio squelch value + UINT8 m_data; // parallel data for simutrek + bool m_data_ready; // ready flag for simutrek data + UINT8 m_i8748_port2; // 8748 port 2 state + UINT8 m_controlnext; // latch to control next pair of fields + UINT8 m_controlthis; // latched value for our control over the current pair of fields +}; + + +#endif diff -Nru mame-0.144/src/emu/machine/ldstub.c mame-0.145/src/emu/machine/ldstub.c --- mame-0.144/src/emu/machine/ldstub.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/ldstub.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,51 @@ +/************************************************************************* + + ldstub.c + + Laserdisc player stubs. + +**************************************************************************** + + 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 "emu.h" +#include "ldstub.h" + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type SONY_LDP1450 = &device_creator; +const device_type PIONEER_PR7820 = &device_creator; +const device_type PHILLIPS_22VP932 = &device_creator; diff -Nru mame-0.144/src/emu/machine/ldstub.h mame-0.145/src/emu/machine/ldstub.h --- mame-0.144/src/emu/machine/ldstub.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/ldstub.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,146 @@ +/************************************************************************* + + ldstub.h + + Laserdisc player stubs. + +**************************************************************************** + + 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. + +*************************************************************************/ + +#pragma once + +#ifndef __LDSTUB_H__ +#define __LDSTUB_H__ + +#include "laserdsc.h" + + +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_LASERDISC_LDP1450_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, SONY_LDP1450, 0) \ + +#define MCFG_LASERDISC_PR7820_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PIONEER_PR7820, 0) \ + +#define MCFG_LASERDISC_22VP932_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PHILLIPS_22VP932, 0) \ + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +extern const device_type SONY_LDP1450; +extern const device_type PIONEER_PR7820; +extern const device_type PHILLIPS_22VP932; + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> sony_ldp1450_device + +class sony_ldp1450_device : public laserdisc_device +{ +public: + // construction/destruction + sony_ldp1450_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, SONY_LDP1450, "Sony LDP-1450", "ldp1450", tag, owner, clock) { } + + // input/output + UINT8 data_available_r() { return CLEAR_LINE; } + UINT8 data_r() { return 0; } + void data_w(UINT8 data) { } + +protected: + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) { } + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { return fieldnum; } + virtual void player_overlay(bitmap_yuy16 &bitmap) { } +}; + + +// ======================> pioneer_pr7820_device + +class pioneer_pr7820_device : public laserdisc_device +{ +public: + // construction/destruction + pioneer_pr7820_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, PIONEER_PR7820, "Pioneer PR-7820", "pr7820", tag, owner, clock) { } + + // input/output + UINT8 data_available_r() { return CLEAR_LINE; } + UINT8 ready_r() { return ASSERT_LINE; } + UINT8 data_r() { return 0; } + void data_w(UINT8 data) { } + void enter_w(UINT8 data) { } + +protected: + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) { } + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { return fieldnum; } + virtual void player_overlay(bitmap_yuy16 &bitmap) { } +}; + + +// ======================> phillips_22vp932_device + +class phillips_22vp932_device : public laserdisc_device +{ +public: + // construction/destruction + phillips_22vp932_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, PHILLIPS_22VP932, "Phillips 22VP932", "22vp932", tag, owner, clock) { } + + // input/output + UINT8 data_r() { return 0; } + void data_w(UINT8 data) { } + void enter_w(UINT8 data) { } + +protected: + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) { } + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { return fieldnum; } + virtual void player_overlay(bitmap_yuy16 &bitmap) { } +}; + + +#endif diff -Nru mame-0.144/src/emu/machine/ldv1000.c mame-0.145/src/emu/machine/ldv1000.c --- mame-0.144/src/emu/machine/ldv1000.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/ldv1000.c 2012-02-06 21:30:28.000000000 +0000 @@ -4,8 +4,34 @@ Pioneer LD-V1000 laserdisc emulation. - 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. ************************************************************************** @@ -16,8 +42,10 @@ *************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" -#include "ldcore.h" +#include "ldv1000.h" #include "machine/8255ppi.h" #include "machine/z80ctc.h" #include "cpu/z80/z80.h" @@ -25,9 +53,9 @@ -/*************************************************************************** - DEBUGGING -***************************************************************************/ +//************************************************************************** +// DEBUGGING +//************************************************************************** #define LOG_PORT_IO 0 #define LOG_STATUS_CHANGES 0 @@ -36,123 +64,73 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** -#define SCAN_SPEED (2000 / 30) /* 2000 frames/second */ -#define SEEK_FAST_SPEED (4000 / 30) /* 4000 frames/second */ +#define SCAN_SPEED (2000 / 30) // 2000 frames/second +#define SEEK_FAST_SPEED (4000 / 30) // 4000 frames/second #define MULTIJUMP_TRACK_TIME attotime::from_usec(50) -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* player-specific data */ -struct _ldplayer_data -{ - /* low-level emulation data */ - device_t *cpu; /* CPU index of the Z80 */ - device_t *ctc; /* CTC device */ - timer_device * multitimer; /* multi-jump timer device */ - - /* communication status */ - UINT8 command; /* command byte to the player */ - UINT8 status; /* status byte from the player */ - UINT8 vsync; /* VSYNC state */ - - /* I/O port states */ - UINT8 counter_start; /* starting value for counter */ - UINT8 counter; /* current counter value */ - UINT8 portc0; /* port C on PPI 0 */ - UINT8 portb1; /* port B on PPI 1 */ - UINT8 portc1; /* port C on PPI 1 */ - - /* display/decode circuit emulation */ - UINT8 portselect; /* selection of which port to access */ - UINT8 display[2][20]; /* display lines */ - UINT8 dispindex; /* index within the display line */ - UINT8 vbi[7*3]; /* VBI data */ - UINT8 vbiready; /* VBI ready flag */ - UINT8 vbiindex; /* index within the VBI data */ -}; - - +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static void ldv1000_init(laserdisc_state *ld); -static void ldv1000_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static INT32 ldv1000_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static void ldv1000_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data); -static UINT8 ldv1000_status_strobe_r(laserdisc_state *ld); -static UINT8 ldv1000_command_strobe_r(laserdisc_state *ld); -static UINT8 ldv1000_status_r(laserdisc_state *ld); - -static TIMER_CALLBACK( vsync_off ); -static TIMER_CALLBACK( vbi_data_fetch ); -static TIMER_DEVICE_CALLBACK( multijump_timer ); - -static void ctc_interrupt(device_t *device, int state); - -static WRITE8_HANDLER( decoder_display_port_w ); -static READ8_HANDLER( decoder_display_port_r ); -static READ8_HANDLER( controller_r ); -static WRITE8_HANDLER( controller_w ); -static WRITE8_DEVICE_HANDLER( ppi0_porta_w ); -static READ8_DEVICE_HANDLER( ppi0_portb_r ); -static READ8_DEVICE_HANDLER( ppi0_portc_r ); -static WRITE8_DEVICE_HANDLER( ppi0_portc_w ); -static READ8_DEVICE_HANDLER( ppi1_porta_r ); -static WRITE8_DEVICE_HANDLER( ppi1_portb_w ); -static WRITE8_DEVICE_HANDLER( ppi1_portc_w ); +// devices +const device_type PIONEER_LDV1000 = &device_creator; -/*************************************************************************** - LD-V1000 ROM AND MACHINE INTERFACES -***************************************************************************/ +//************************************************************************** +// LD-V1000 ROM AND MACHINE INTERFACES +//************************************************************************** -static ADDRESS_MAP_START( ldv1000_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( ldv1000_map, AS_PROGRAM, 8, pioneer_ldv1000_device ) AM_RANGE(0x0000, 0x1fff) AM_MIRROR(0x6000) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_MIRROR(0x3800) AM_RAM - AM_RANGE(0xc000, 0xc003) AM_MIRROR(0x9ff0) AM_DEVREADWRITE("ldvppi0", ppi8255_r, ppi8255_w) - AM_RANGE(0xc004, 0xc007) AM_MIRROR(0x9ff0) AM_DEVREADWRITE("ldvppi1", ppi8255_r, ppi8255_w) + AM_RANGE(0xc000, 0xc003) AM_MIRROR(0x9ff0) AM_DEVREADWRITE_LEGACY("ldvppi0", ppi8255_r, ppi8255_w) + AM_RANGE(0xc004, 0xc007) AM_MIRROR(0x9ff0) AM_DEVREADWRITE_LEGACY("ldvppi1", ppi8255_r, ppi8255_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( ldv1000_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( ldv1000_portmap, AS_IO, 8, pioneer_ldv1000_device ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x07) AM_MIRROR(0x38) AM_READWRITE(decoder_display_port_r, decoder_display_port_w) - AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_READ(controller_r) - AM_RANGE(0x80, 0x80) AM_MIRROR(0x3f) AM_WRITE(controller_w) - AM_RANGE(0xc0, 0xc3) AM_MIRROR(0x3c) AM_DEVREADWRITE("ldvctc", z80ctc_r, z80ctc_w) + AM_RANGE(0x00, 0x07) AM_MIRROR(0x38) AM_READWRITE(z80_decoder_display_port_r, z80_decoder_display_port_w) + AM_RANGE(0x40, 0x40) AM_MIRROR(0x3f) AM_READ(z80_controller_r) + AM_RANGE(0x80, 0x80) AM_MIRROR(0x3f) AM_WRITE(z80_controller_w) + AM_RANGE(0xc0, 0xc3) AM_MIRROR(0x3c) AM_DEVREADWRITE_LEGACY("ldvctc", z80ctc_r, z80ctc_w) ADDRESS_MAP_END static const ppi8255_interface ppi0intf = { - DEVCB_NULL, DEVCB_HANDLER(ppi0_portb_r), DEVCB_HANDLER(ppi0_portc_r), - DEVCB_HANDLER(ppi0_porta_w), DEVCB_NULL, DEVCB_HANDLER(ppi0_portc_w) + DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi0_portb_r), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi0_portc_r), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi0_porta_w), + DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi0_portc_w) }; static const ppi8255_interface ppi1intf = { - DEVCB_HANDLER(ppi1_porta_r), DEVCB_NULL, DEVCB_NULL, - DEVCB_NULL, DEVCB_HANDLER(ppi1_portb_w), DEVCB_HANDLER(ppi1_portc_w) + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi1_porta_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi1_portb_w), + DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ppi1_portc_w) }; static Z80CTC_INTERFACE( ctcintf ) { 0, - DEVCB_LINE(ctc_interrupt), + DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pioneer_ldv1000_device, ctc_interrupt), DEVCB_NULL, DEVCB_NULL, DEVCB_NULL @@ -172,10 +150,9 @@ MCFG_CPU_PROGRAM_MAP(ldv1000_map) MCFG_CPU_IO_MAP(ldv1000_portmap) - MCFG_Z80CTC_ADD("ldvctc", XTAL_5MHz/2 /* same as "ldv1000" */, ctcintf) + MCFG_Z80CTC_ADD("ldvctc", XTAL_5MHz/2, ctcintf) MCFG_PPI8255_ADD("ldvppi0", ppi0intf) MCFG_PPI8255_ADD("ldvppi1", ppi1intf) - MCFG_TIMER_ADD("multitimer", multijump_timer) MACHINE_CONFIG_END @@ -186,255 +163,246 @@ -/*************************************************************************** - INTERFACES -***************************************************************************/ - -const ldplayer_interface ldv1000_interface = -{ - LASERDISC_TYPE_PIONEER_LDV1000, /* type of the player */ - sizeof(ldplayer_data), /* size of the state */ - "Pioneer LD-V1000", /* name of the player */ - "ldv1000", /* shortname of the player */ - ROM_NAME(ldv1000), /* pointer to ROM region information */ - MACHINE_CONFIG_NAME(ldv1000), /* pointer to machine configuration */ - ldv1000_init, /* initialization callback */ - ldv1000_vsync, /* vsync callback */ - ldv1000_update, /* update callback */ - NULL, /* overlay callback */ - ldv1000_data_w, /* parallel data write */ - { /* single line write: */ - NULL, /* LASERDISC_LINE_ENTER */ - NULL /* LASERDISC_LINE_CONTROL */ - }, - ldv1000_status_r, /* parallel data read */ - { /* single line read: */ - NULL, /* LASERDISC_LINE_READY */ - ldv1000_status_strobe_r, /* LASERDISC_LINE_STATUS */ - ldv1000_command_strobe_r, /* LASERDISC_LINE_COMMAND */ - NULL, /* LASERDISC_LINE_DATA_AVAIL */ - } -}; - - - -/*************************************************************************** - PIONEER LD-V1000 IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - ldv1000_init - player-specific initialization --------------------------------------------------*/ - -static void ldv1000_init(laserdisc_state *ld) +//************************************************************************** +// PIONEER LD-V1000 IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// pioneer_ldv1000_device - constructor +//------------------------------------------------- + +pioneer_ldv1000_device::pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, PIONEER_LDV1000, "Pioneer LD-V1000", "ldv1000", tag, owner, clock), + m_z80_cpu(*this, "ldv1000"), + m_z80_ctc(*this, "ldvctc"), + m_multitimer(NULL), + m_command(0), + m_status(0), + m_vsync(false), + m_counter_start(0), + m_counter(0), + m_portc0(0), + m_portb1(0), + m_portc1(0), + m_portselect(0), + m_dispindex(0), + m_vbiready(false), + m_vbiindex(0) { - astring tempstring; - ldplayer_data *player = ld->player; - - /* reset our state */ - memset(player, 0, sizeof(*player)); - - /* find our devices */ - player->cpu = ld->device->subdevice("ldv1000"); - player->ctc = ld->device->subdevice("ldvctc"); - player->multitimer = downcast(ld->device->subdevice("multitimer")); - player->multitimer->set_ptr(ld); } -/*------------------------------------------------- - ldv1000_vsync - VSYNC callback, called at the - start of the blanking period --------------------------------------------------*/ +//------------------------------------------------- +// data_w - handle a parallel data write to the +// LD-V1000 +//------------------------------------------------- -static void ldv1000_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +void pioneer_ldv1000_device::data_w(UINT8 data) { - slider_position sliderpos = ldcore_get_slider_position(ld); - ldplayer_data *player = ld->player; - - /* generate interrupts if we hit the edges */ - z80ctc_trg1_w(player->ctc, sliderpos == SLIDER_MINIMUM); - z80ctc_trg2_w(player->ctc, sliderpos == SLIDER_MAXIMUM); + m_command = data; + if (LOG_COMMANDS) + printf("-> COMMAND = %02X (%s)\n", data, (m_portc1 & 0x10) ? "valid" : "invalid"); +} - /* signal VSYNC and set a timer to turn it off */ - player->vsync = TRUE; - ld->device->machine().scheduler().timer_set(ld->screen->scan_period() * 4, FUNC(vsync_off), 0, ld); - /* also set a timer to fetch the VBI data when it is ready */ - ld->device->machine().scheduler().timer_set(ld->screen->time_until_pos(19*2), FUNC(vbi_data_fetch), 0, ld); +//------------------------------------------------- +// enter_w - set the state of the ENTER strobe +//------------------------------------------------- - /* boost interleave for the first 1ms to improve communications */ - ld->device->machine().scheduler().boost_interleave(attotime::zero, attotime::from_msec(1)); +void pioneer_ldv1000_device::enter_w(UINT8 data) +{ } -/*------------------------------------------------- - ldv1000_update - update callback, called on - the first visible line of the frame --------------------------------------------------*/ +//------------------------------------------------- +// device_start - device initialization +//------------------------------------------------- -static INT32 ldv1000_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +void pioneer_ldv1000_device::device_start() { - if (LOG_FRAMES_SEEN) - { - int frame = frame_from_metadata(vbi); - if (frame != FRAME_NOT_PRESENT) printf("== %d\n", frame); - } - return fieldnum; + // pass through to the parent + laserdisc_device::device_start(); + + // allocate timers + m_multitimer = timer_alloc(TID_MULTIJUMP); } -/*------------------------------------------------- - ldv1000_data_w - handle a parallel data write - to the LD-V1000 --------------------------------------------------*/ +//------------------------------------------------- +// device_reset - device reset +//------------------------------------------------- -static void ldv1000_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data) +void pioneer_ldv1000_device::device_reset() { - ld->player->command = data; - if (LOG_COMMANDS) - printf("-> COMMAND = %02X (%s)\n", data, (ld->player->portc1 & 0x10) ? "valid" : "invalid"); + // pass through to the parent + laserdisc_device::device_reset(); + + // reset our state + m_command = 0; + m_status = 0; + m_vsync = false; + m_counter_start = 0; + m_counter = 0; + m_portc0 = 0; + m_portb1 = 0; + m_portc1 = 0; + m_portselect = 0; + m_dispindex = 0; + m_vbiready = false; + m_vbiindex = 0; } -/*------------------------------------------------- - ldv1000_status_strobe_r - return state of the - status strobe --------------------------------------------------*/ +//------------------------------------------------- +// device_timer - handle timers set by this +// device +//------------------------------------------------- -static UINT8 ldv1000_status_strobe_r(laserdisc_state *ld) +void pioneer_ldv1000_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - return (ld->player->portc1 & 0x20) ? ASSERT_LINE : CLEAR_LINE; -} + switch (id) + { + case TID_MULTIJUMP: + { + // bit 5 of port B on PPI 1 selects the direction of slider movement + int direction = (m_portb1 & 0x20) ? 1 : -1; + advance_slider(direction); + + // update down counter and reschedule + if (--m_counter != 0) + timer.adjust(MULTIJUMP_TRACK_TIME); + break; + } + case TID_VSYNC_OFF: + m_vsync = false; + break; -/*------------------------------------------------- - ldv1000_command_strobe_r - return state of the - command strobe --------------------------------------------------*/ + case TID_VBI_DATA_FETCH: + { + // appears to return data in reverse order + UINT32 lines[3]; + lines[0] = get_field_code(LASERDISC_CODE_LINE1718, false); + lines[1] = get_field_code(LASERDISC_CODE_LINE17, false); + lines[2] = get_field_code(LASERDISC_CODE_LINE16, false); + + // fill in the details + memset(m_vbi, 0, sizeof(m_vbi)); + if (focus_on() && laser_on()) + { + // loop over lines + for (int line = 0; line < 3; line++) + { + UINT8 *dest = &m_vbi[line * 7]; + UINT32 data = lines[line]; + + // the logic only processes leadin/leadout/frame number codes + if (data == VBI_CODE_LEADIN || data == VBI_CODE_LEADOUT || (data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) + { + *dest++ = 0x09 | (((data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) ? 0x02 : 0x00); + *dest++ = 0x08; + *dest++ = (data >> 16) & 0x0f; + *dest++ = (data >> 12) & 0x0f; + *dest++ = (data >> 8) & 0x0f; + *dest++ = (data >> 4) & 0x0f; + *dest++ = (data >> 0) & 0x0f; + } + } + } -static UINT8 ldv1000_command_strobe_r(laserdisc_state *ld) -{ - return (ld->player->portc1 & 0x10) ? ASSERT_LINE : CLEAR_LINE; + // signal that data is ready and reset the readback index + m_vbiready = true; + m_vbiindex = 0; + break; + } + + // pass everything else onto the parent + default: + laserdisc_device::device_timer(timer, id, param, ptr); + break; + } } -/*------------------------------------------------- - ldv1000_status_r - handle a parallel data read - from the LD-V1000 --------------------------------------------------*/ +//------------------------------------------------- +// device_rom_region - return a pointer to our +// ROM region definitions +//------------------------------------------------- -static UINT8 ldv1000_status_r(laserdisc_state *ld) +const rom_entry *pioneer_ldv1000_device::device_rom_region() const { - return ld->player->status; + return ROM_NAME(ldv1000); } -/*------------------------------------------------- - vsync_off - timer callback to clear the VSYNC - flag --------------------------------------------------*/ +//------------------------------------------------- +// device_mconfig_additions - return a pointer to +// our machine config fragment +//------------------------------------------------- -static TIMER_CALLBACK( vsync_off ) +machine_config_constructor pioneer_ldv1000_device::device_mconfig_additions() const { - laserdisc_state *ld = (laserdisc_state *)ptr; - ld->player->vsync = FALSE; + return MACHINE_CONFIG_NAME(ldv1000); } -/*------------------------------------------------- - vbi_data_fetch - timer callback to update the - VBI data in the PIA as soon as it is ready; - this must happy early in the frame because - the player logic relies on fetching it here --------------------------------------------------*/ +//------------------------------------------------- +// player_vsync - VSYNC callback, called at the +// start of the blanking period +//------------------------------------------------- -static TIMER_CALLBACK( vbi_data_fetch ) +void pioneer_ldv1000_device::player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - UINT8 focus_on = !(player->portb1 & 0x01); - UINT8 laser_on = (player->portb1 & 0x40); - UINT32 lines[3]; - - /* appears to return data in reverse order */ - lines[0] = laserdisc_get_field_code(ld->device, LASERDISC_CODE_LINE1718, FALSE); - lines[1] = laserdisc_get_field_code(ld->device, LASERDISC_CODE_LINE17, FALSE); - lines[2] = laserdisc_get_field_code(ld->device, LASERDISC_CODE_LINE16, FALSE); + // generate interrupts if we hit the edges + slider_position sliderpos = get_slider_position(); + m_z80_ctc->trigger(1, sliderpos == SLIDER_MINIMUM); + m_z80_ctc->trigger(2, sliderpos == SLIDER_MAXIMUM); - /* fill in the details */ - memset(player->vbi, 0, sizeof(player->vbi)); - if (focus_on && laser_on) - { - int line; - - /* loop over lines */ - for (line = 0; line < 3; line++) - { - UINT8 *dest = &player->vbi[line * 7]; - UINT32 data = lines[line]; + // signal VSYNC and set a timer to turn it off + m_vsync = true; + timer_set(screen().scan_period() * 4, TID_VSYNC_OFF); - /* the logic only processes leadin/leadout/frame number codes */ - if (data == VBI_CODE_LEADIN || data == VBI_CODE_LEADOUT || (data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) - { - *dest++ = 0x09 | (((data & VBI_MASK_CAV_PICTURE) == VBI_CODE_CAV_PICTURE) ? 0x02 : 0x00); - *dest++ = 0x08; - *dest++ = (data >> 16) & 0x0f; - *dest++ = (data >> 12) & 0x0f; - *dest++ = (data >> 8) & 0x0f; - *dest++ = (data >> 4) & 0x0f; - *dest++ = (data >> 0) & 0x0f; - } - } - } + // also set a timer to fetch the VBI data when it is ready + timer_set(screen().time_until_pos(19*2), TID_VBI_DATA_FETCH); - /* signal that data is ready and reset the readback index */ - player->vbiready = TRUE; - player->vbiindex = 0; + // boost interleave for the first 1ms to improve communications + machine().scheduler().boost_interleave(attotime::zero, attotime::from_msec(1)); } -/*------------------------------------------------- - multijump_timer - called once for each track - in a multijump sequence; we decrement the - down counter and autostop when we hit 0 --------------------------------------------------*/ +//------------------------------------------------- +// player_update - update callback, called on +// the first visible line of the frame +//------------------------------------------------- -static TIMER_DEVICE_CALLBACK( multijump_timer ) +INT32 pioneer_ldv1000_device::player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - int direction; - - /* bit 5 of port B on PPI 1 selects the direction of slider movement */ - direction = (player->portb1 & 0x20) ? 1 : -1; - ldcore_advance_slider(ld, direction); - - /* update down counter and reschedule */ - if (--player->counter != 0) - timer.adjust(MULTIJUMP_TRACK_TIME); + if (LOG_FRAMES_SEEN) + { + int frame = frame_from_metadata(vbi); + if (frame != FRAME_NOT_PRESENT) printf("== %d\n", frame); + } + return fieldnum; } -/*------------------------------------------------- - ctc_interrupt - called when the CTC triggers - an interrupt in the daisy chain --------------------------------------------------*/ +//------------------------------------------------- +// ctc_interrupt - called when the CTC triggers +// an interrupt in the daisy chain +//------------------------------------------------- -static WRITE_LINE_DEVICE_HANDLER( ctc_interrupt ) +WRITE_LINE_MEMBER( pioneer_ldv1000_device::ctc_interrupt ) { - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - if (ld->player->cpu != NULL) - device_set_input_line(ld->player->cpu, 0, state ? ASSERT_LINE : CLEAR_LINE); + m_z80_cpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); } -/*------------------------------------------------- - decoder_display_port_w - handle writes to the - decoder/display chips --------------------------------------------------*/ +//------------------------------------------------- +// z80_decoder_display_port_w - handle writes to +// the decoder/display chips +//------------------------------------------------- -static WRITE8_HANDLER( decoder_display_port_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::z80_decoder_display_port_w ) { /* TX/RX = /A0 (A0=0 -> TX, A0=1 -> RX) @@ -442,112 +410,102 @@ Display is 6-bit Decoder is 4-bit */ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - /* writes to offset 0 select the target for reads/writes of actual data */ + // writes to offset 0 select the target for reads/writes of actual data if (offset == 0) { - player->portselect = data; - player->dispindex = 0; + m_portselect = data; + m_dispindex = 0; } - /* writes to offset 2 constitute actual writes targeted toward the display and decoder chips */ + // writes to offset 2 constitute actual writes targeted toward the display and decoder chips else if (offset == 2) { - /* selections 0 and 1 represent the two display lines; only 6 bits are transferred */ - if (player->portselect < 2) - player->display[player->portselect][player->dispindex++ % 20] = data & 0x3f; + // selections 0 and 1 represent the two display lines; only 6 bits are transferred + if (m_portselect < 2) + m_display[m_portselect][m_dispindex++ % 20] = data & 0x3f; } } -/*------------------------------------------------- - decoder_display_port_r - handle reads from the - decoder/display chips --------------------------------------------------*/ +//------------------------------------------------- +// z80_decoder_display_port_r - handle reads from the +// decoder/display chips +//------------------------------------------------- -static READ8_HANDLER( decoder_display_port_r ) +READ8_MEMBER( pioneer_ldv1000_device::z80_decoder_display_port_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; + // reads from offset 3 constitute actual reads from the display and decoder chips UINT8 result = 0; - - /* reads from offset 3 constitute actual reads from the display and decoder chips */ if (offset == 3) { - /* selection 4 represents the VBI data reading */ - if (player->portselect == 4) + // selection 4 represents the VBI data reading + if (m_portselect == 4) { - player->vbiready = FALSE; - result = player->vbi[player->vbiindex++ % ARRAY_LENGTH(player->vbi)]; + m_vbiready = false; + result = m_vbi[m_vbiindex++ % ARRAY_LENGTH(m_vbi)]; } } return result; } -/*------------------------------------------------- - controller_r - handle read of the data from - the controlling system --------------------------------------------------*/ - -static READ8_HANDLER( controller_r ) -{ - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - - /* note that this is a cheesy implementation; the real thing relies on exquisite timing */ - UINT8 result = ld->player->command ^ 0xff; - ld->player->command = 0xff; +//------------------------------------------------- +// z80_controller_r - handle read of the data from +// the controlling system +//------------------------------------------------- + +READ8_MEMBER( pioneer_ldv1000_device::z80_controller_r ) +{ + // note that this is a cheesy implementation; the real thing relies on exquisite timing + UINT8 result = m_command ^ 0xff; + m_command = 0xff; return result; } -/*------------------------------------------------- - controller_w - handle status latch writes --------------------------------------------------*/ +//------------------------------------------------- +// z80_controller_w - handle status latch writes +//------------------------------------------------- -static WRITE8_HANDLER( controller_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::z80_controller_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - if (LOG_STATUS_CHANGES && data != ld->player->status) - printf("%04X:CONTROLLER.W=%02X\n", cpu_get_pc(&space->device()), data); - ld->player->status = data; + if (LOG_STATUS_CHANGES && data != m_status) + printf("%04X:CONTROLLER.W=%02X\n", cpu_get_pc(&space.device()), data); + m_status = data; } -/*------------------------------------------------- - ppi0_porta_w - handle writes to port A of - PPI #0 --------------------------------------------------*/ +//------------------------------------------------- +// ppi0_porta_w - handle writes to port A of +// PPI #0 +//------------------------------------------------- -static WRITE8_DEVICE_HANDLER( ppi0_porta_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::ppi0_porta_w ) { - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ld->player->counter_start = data; + m_counter_start = data; if (LOG_PORT_IO) - printf("%s:PORTA.0=%02X\n", device->machine().describe_context(), data); + printf("%s:PORTA.0=%02X\n", machine().describe_context(), data); } -/*------------------------------------------------- - ppi0_portb_r - handle reads from port B of - PPI #0 --------------------------------------------------*/ +//------------------------------------------------- +// ppi0_portb_r - handle reads from port B of +// PPI #0 +//------------------------------------------------- -static READ8_DEVICE_HANDLER( ppi0_portb_r ) +READ8_MEMBER( pioneer_ldv1000_device::ppi0_portb_r ) { - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - return ld->player->counter; + return m_counter; } -/*------------------------------------------------- - ppi0_portc_r - handle reads from port C of - PPI #0 --------------------------------------------------*/ +//------------------------------------------------- +// ppi0_portc_r - handle reads from port C of +// PPI #0 +//------------------------------------------------- -static READ8_DEVICE_HANDLER( ppi0_portc_r ) +READ8_MEMBER( pioneer_ldv1000_device::ppi0_portc_r ) { /* $10 = /VSYNC @@ -555,25 +513,22 @@ $40 = TRKG LOOP (N24-1) $80 = DUMP (N20-1) -- code reads the state and waits for it to change */ - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ldplayer_data *player = ld->player; - UINT8 result = 0x00; - if (!player->vsync) + UINT8 result = 0x00; + if (!m_vsync) result |= 0x10; - if (!player->vbiready) + if (!m_vbiready) result |= 0x20; - return result; } -/*------------------------------------------------- - ppi0_portc_w - handle writes to port C of - PPI #0 --------------------------------------------------*/ +//------------------------------------------------- +// ppi0_portc_w - handle writes to port C of +// PPI #0 +//------------------------------------------------- -static WRITE8_DEVICE_HANDLER( ppi0_portc_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::ppi0_portc_w ) { /* $01 = preload on up/down counters @@ -581,37 +536,35 @@ $04 = SCAN MODE $08 = n/c */ - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->portc0; - /* set the new value */ - player->portc0 = data; + // set the new value + UINT8 prev = m_portc0; + m_portc0 = data; if (LOG_PORT_IO && ((data ^ prev) & 0x0f) != 0) { - printf("%s:PORTC.0=%02X", device->machine().describe_context(), data); + printf("%s:PORTC.0=%02X", machine().describe_context(), data); if (data & 0x01) printf(" PRELOAD"); if (!(data & 0x02)) printf(" /MULTIJUMP"); if (data & 0x04) printf(" SCANMODE"); printf("\n"); } - /* on the rising edge of bit 0, clock the down counter load */ + // on the rising edge of bit 0, clock the down counter load if ((data & 0x01) && !(prev & 0x01)) - player->counter = player->counter_start; + m_counter = m_counter_start; - /* on the falling edge of bit 1, start the multi-jump timer */ + // on the falling edge of bit 1, start the multi-jump timer if (!(data & 0x02) && (prev & 0x02)) - player->multitimer->adjust(MULTIJUMP_TRACK_TIME); + m_multitimer->adjust(MULTIJUMP_TRACK_TIME); } -/*------------------------------------------------- - ppi1_porta_r - handle reads from port A of - PPI #1 --------------------------------------------------*/ +//------------------------------------------------- +// ppi1_porta_r - handle reads from port A of +// PPI #1 +//------------------------------------------------- -static READ8_DEVICE_HANDLER( ppi1_porta_r ) +READ8_MEMBER( pioneer_ldv1000_device::ppi1_porta_r ) { /* $01 = /FOCS LOCK @@ -623,48 +576,45 @@ $40 = /INT LOCK $80 = 8 INCH CHK */ - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ldplayer_data *player = ld->player; - slider_position sliderpos = ldcore_get_slider_position(ld); - UINT8 focus_on = !(player->portb1 & 0x01); - UINT8 spdl_on = !(player->portb1 & 0x02); + + slider_position sliderpos = get_slider_position(); UINT8 result = 0x00; - /* bit 0: /FOCUS LOCK */ - if (!focus_on) + // bit 0: /FOCUS LOCK + if (!focus_on()) result |= 0x01; - /* bit 1: /SPDL LOCK */ - if (!spdl_on) + // bit 1: /SPDL LOCK + if (!spdl_on()) result |= 0x02; - /* bit 2: INSIDE signal */ + // bit 2: INSIDE signal if (sliderpos == SLIDER_MINIMUM) result |= 0x04; - /* bit 3: OUTSIDE signal */ + // bit 3: OUTSIDE signal if (sliderpos == SLIDER_MAXIMUM) result |= 0x08; - /* bit 4: MOTOR STOP */ + // bit 4: MOTOR STOP - /* bit 5: +5V/test point */ + // bit 5: +5V/test point result |= 0x20; - /* bit 6: /INT LOCK */ + // bit 6: /INT LOCK - /* bit 7: 8 INCH CHK */ + // bit 7: 8 INCH CHK return result; } -/*------------------------------------------------- - ppi1_portb_w - handle writes to port B of - PPI #1 --------------------------------------------------*/ +//------------------------------------------------- +// ppi1_portb_w - handle writes to port B of +// PPI #1 +//------------------------------------------------- -static WRITE8_DEVICE_HANDLER( ppi1_portb_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::ppi1_portb_w ) { /* $01 = /FOCS ON @@ -676,16 +626,13 @@ $40 = /LASER ON $80 = /SYNC ST0 */ - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->portb1; - int direction; - /* set the new value */ - player->portb1 = data; + // set the new value + UINT8 prev = m_portb1; + m_portb1 = data; if (LOG_PORT_IO && ((data ^ prev) & 0xff) != 0) { - printf("%s:PORTB.1=%02X:", device->machine().describe_context(), data); + printf("%s:PORTB.1=%02X:", machine().describe_context(), data); if (!(data & 0x01)) printf(" FOCSON"); if (!(data & 0x02)) printf(" SPDLRUN"); if (!(data & 0x04)) printf(" JUMPTRIG"); @@ -695,33 +642,33 @@ printf("\n"); } - /* bit 5 selects the direction of slider movement for JUMP TRG and scanning */ - direction = (data & 0x20) ? 1 : -1; + // bit 5 selects the direction of slider movement for JUMP TRG and scanning + int direction = (data & 0x20) ? 1 : -1; - /* on the falling edge of bit 2, jump one track in either direction */ + // on the falling edge of bit 2, jump one track in either direction if (!(data & 0x04) && (prev & 0x04)) - ldcore_advance_slider(ld, direction); + advance_slider(direction); - /* bit 3 low enables scanning */ + // bit 3 low enables scanning if (!(data & 0x08)) { - /* bit 4 selects the speed */ + // bit 4 selects the speed int delta = (data & 0x10) ? SCAN_SPEED : SEEK_FAST_SPEED; - ldcore_set_slider_speed(ld, delta * direction); + set_slider_speed(delta * direction); } - /* bit 3 high stops scanning */ + // bit 3 high stops scanning else - ldcore_set_slider_speed(ld, 0); + set_slider_speed(0); } -/*------------------------------------------------- - ppi1_portc_w - handle writes to port C of - PPI #1 --------------------------------------------------*/ +//------------------------------------------------- +// ppi1_portc_w - handle writes to port C of +// PPI #1 +//------------------------------------------------- -static WRITE8_DEVICE_HANDLER( ppi1_portc_w ) +WRITE8_MEMBER( pioneer_ldv1000_device::ppi1_portc_w ) { /* $01 = AUD 1 @@ -733,15 +680,13 @@ $40 = SIZE 8/12 $80 = /LED CAV */ - laserdisc_state *ld = ldcore_get_safe_token(device->owner()); - ldplayer_data *player = ld->player; - UINT8 prev = player->portc1; - /* set the new value */ - player->portc1 = data; + // set the new value + UINT8 prev = m_portc1; + m_portc1 = data; if (LOG_PORT_IO && ((data ^ prev) & 0xcf) != 0) { - printf("%s:PORTC.1=%02X", device->machine().describe_context(), data); + printf("%s:PORTC.1=%02X", machine().describe_context(), data); if (data & 0x01) printf(" AUD1"); if (data & 0x02) printf(" AUD2"); if (data & 0x04) printf(" AUDEN"); @@ -753,9 +698,9 @@ printf("\n"); } - /* video squelch is controlled by bit 3 */ - ldcore_set_video_squelch(ld, (data & 0x08) == 0); + // video squelch is controlled by bit 3 + set_video_squelch((data & 0x08) == 0); - /* audio squelch is controlled by bits 0-2 */ - ldcore_set_audio_squelch(ld, !(data & 0x04) || !(data & 0x01), !(data & 0x04) || !(data & 0x02)); + // audio squelch is controlled by bits 0-2 + set_audio_squelch(!(data & 0x04) || !(data & 0x01), !(data & 0x04) || !(data & 0x02)); } diff -Nru mame-0.144/src/emu/machine/ldv1000.h mame-0.145/src/emu/machine/ldv1000.h --- mame-0.144/src/emu/machine/ldv1000.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/ldv1000.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,158 @@ +/************************************************************************* + + ldv1000.h + + Pioneer LD-V1000 laserdisc emulation. + +**************************************************************************** + + 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. + +*************************************************************************/ + +#pragma once + +#ifndef __LDV1000_H__ +#define __LDV1000_H__ + +#include "laserdsc.h" +#include "cpu/z80/z80.h" +#include "cpu/mcs48/mcs48.h" +#include "machine/z80ctc.h" + + +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_LASERDISC_LDV1000_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PIONEER_LDV1000, 0) \ + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +extern const device_type PIONEER_LDV1000; + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> pioneer_ldv1000_device + +// base ldv1000 class +class pioneer_ldv1000_device : public laserdisc_device +{ +public: + // construction/destruction + pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // input and output + void data_w(UINT8 data); + void enter_w(UINT8 data); + UINT8 status_r() const { return m_status; } + UINT8 status_strobe_r() const { return (m_portc1 & 0x20) ? ASSERT_LINE : CLEAR_LINE; } + UINT8 command_strobe_r() const { return (m_portc1 & 0x10) ? ASSERT_LINE : CLEAR_LINE; } + +protected: + // timer IDs + enum + { + TID_MULTIJUMP = TID_FIRST_PLAYER_TIMER, + TID_VSYNC_OFF, + TID_VBI_DATA_FETCH + }; + + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual void player_overlay(bitmap_yuy16 &bitmap) { } + + // internal helpers + bool focus_on() const { return !(m_portb1 & 0x01); } + bool spdl_on() const { return !(m_portb1 & 0x02); } + bool laser_on() const { return (m_portb1 & 0x40); } + +public: + // internal read/write handlers + DECLARE_WRITE_LINE_MEMBER( ctc_interrupt ); + DECLARE_WRITE8_MEMBER( z80_decoder_display_port_w ); + DECLARE_READ8_MEMBER( z80_decoder_display_port_r ); + DECLARE_READ8_MEMBER( z80_controller_r ); + DECLARE_WRITE8_MEMBER( z80_controller_w ); + DECLARE_WRITE8_MEMBER( ppi0_porta_w ); + DECLARE_READ8_MEMBER( ppi0_portb_r ); + DECLARE_READ8_MEMBER( ppi0_portc_r ); + DECLARE_WRITE8_MEMBER( ppi0_portc_w ); + DECLARE_READ8_MEMBER( ppi1_porta_r ); + DECLARE_WRITE8_MEMBER( ppi1_portb_w ); + DECLARE_WRITE8_MEMBER( ppi1_portc_w ); + +protected: + // internal state + required_device m_z80_cpu; /* CPU index of the Z80 */ + required_device m_z80_ctc; /* CTC device */ + emu_timer * m_multitimer; /* multi-jump timer device */ + + /* communication status */ + UINT8 m_command; /* command byte to the player */ + UINT8 m_status; /* status byte from the player */ + bool m_vsync; /* VSYNC state */ + + /* I/O port states */ + UINT8 m_counter_start; /* starting value for counter */ + UINT8 m_counter; /* current counter value */ + UINT8 m_portc0; /* port C on PPI 0 */ + UINT8 m_portb1; /* port B on PPI 1 */ + UINT8 m_portc1; /* port C on PPI 1 */ + + /* display/decode circuit emulation */ + UINT8 m_portselect; /* selection of which port to access */ + UINT8 m_display[2][20]; /* display lines */ + UINT8 m_dispindex; /* index within the display line */ + UINT8 m_vbi[7*3]; /* VBI data */ + bool m_vbiready; /* VBI ready flag */ + UINT8 m_vbiindex; /* index within the VBI data */ +}; + + +#endif diff -Nru mame-0.144/src/emu/machine/ldvp931.c mame-0.145/src/emu/machine/ldvp931.c --- mame-0.144/src/emu/machine/ldvp931.c 2012-01-13 15:34:24.000000000 +0000 +++ mame-0.145/src/emu/machine/ldvp931.c 2012-02-06 21:30:27.000000000 +0000 @@ -4,8 +4,36 @@ Philips 22VP931 laserdisc emulation. - 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. ************************************************************************** @@ -16,127 +44,60 @@ *************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" -#include "ldcore.h" -#include "cpu/mcs48/mcs48.h" +#include "ldvp931.h" -/*************************************************************************** - DEBUGGING -***************************************************************************/ +//************************************************************************** +// DEBUGGING +//************************************************************************** #define LOG_COMMANDS 0 #define LOG_PORTS 0 -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* scanning speeds */ -#define SCAN_SPEED (2000 / 30) /* 2000 frames/second */ -#define SCAN_FAST_SPEED (4000 / 30) /* 4000 frames/second */ - - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* player-specific data */ -struct _ldplayer_data -{ - /* low-level emulation data */ - device_t *cpu; /* CPU index of the 8049 */ - timer_device * tracktimer; /* timer device */ - vp931_data_ready_func data_ready_cb; /* data ready callback */ - - /* I/O port states */ - UINT8 out0; /* output 0 state */ - UINT8 out1; /* output 1 state */ - UINT8 port1; /* port 1 state */ - - /* DATIC circuit implementation */ - UINT8 daticval; /* latched DATIC value */ - UINT8 daticerp; /* /ERP value from DATIC */ - UINT8 datastrobe; /* DATA STROBE line from DATIC */ - - /* communication status */ - UINT8 fromcontroller; /* command byte from the controller */ - UINT8 fromcontroller_pending; /* TRUE if data is pending */ - UINT8 tocontroller; /* command byte to the controller */ - UINT8 tocontroller_pending; /* TRUE if data is pending */ - - /* tracking */ - INT8 trackdir; /* direction of tracking */ - UINT8 trackstate; /* state of tracking */ - - /* debugging */ - UINT8 cmdbuf[3]; /* 3 bytes worth of commands */ - UINT8 cmdcount; /* number of command bytes seen */ - INT16 advanced; /* number of frames advanced */ -}; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static void vp931_init(laserdisc_state *ld); -static void vp931_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static INT32 vp931_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime); -static void vp931_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data); -static UINT8 vp931_data_r(laserdisc_state *ld); -static UINT8 vp931_ready(laserdisc_state *ld); -static UINT8 vp931_data_ready(laserdisc_state *ld); - -static TIMER_CALLBACK( vbi_data_fetch ); -static TIMER_CALLBACK( deferred_data_w ); -static TIMER_CALLBACK( irq_off ); -static TIMER_CALLBACK( datastrobe_off ); -static TIMER_CALLBACK( erp_off ); -static TIMER_DEVICE_CALLBACK( track_timer ); - -static WRITE8_HANDLER( output0_w ); -static WRITE8_HANDLER( output1_w ); -static WRITE8_HANDLER( lcd_w ); -static READ8_HANDLER( unknown_r ); -static READ8_HANDLER( keypad_r ); -static READ8_HANDLER( datic_r ); -static READ8_HANDLER( from_controller_r ); -static WRITE8_HANDLER( to_controller_w ); -static READ8_HANDLER( port1_r ); -static WRITE8_HANDLER( port1_w ); -static READ8_HANDLER( port2_r ); -static WRITE8_HANDLER( port2_w ); -static READ8_HANDLER( t0_r ); -static READ8_HANDLER( t1_r ); - - - -/*************************************************************************** - 22VP931 ROM AND MACHINE INTERFACES -***************************************************************************/ - -static ADDRESS_MAP_START( vp931_portmap, AS_IO, 8 ) - AM_RANGE(0x00, 0x00) AM_MIRROR(0xcf) AM_READWRITE(keypad_r, output0_w) - AM_RANGE(0x10, 0x10) AM_MIRROR(0xcf) AM_READWRITE(unknown_r, output1_w) - AM_RANGE(0x20, 0x20) AM_MIRROR(0xcf) AM_READWRITE(datic_r, lcd_w) - AM_RANGE(0x30, 0x30) AM_MIRROR(0xcf) AM_READWRITE(from_controller_r, to_controller_w) - AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(port1_r, port1_w) - AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(port2_r, port2_w) - AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r) - AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_r) +//************************************************************************** +// CONSTANTS +//************************************************************************** + +// scanning speeds +#define SCAN_SPEED (2000 / 30) // 2000 frames/second +#define SCAN_FAST_SPEED (4000 / 30) // 4000 frames/second + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// devices +const device_type PHILLIPS_22VP931 = &device_creator; + + + +//************************************************************************** +// 22VP931 ROM AND MACHINE INTERFACES +//************************************************************************** + +static ADDRESS_MAP_START( vp931_portmap, AS_IO, 8, phillips_22vp931_device ) + AM_RANGE(0x00, 0x00) AM_MIRROR(0xcf) AM_READWRITE(i8049_keypad_r, i8049_output0_w) + AM_RANGE(0x10, 0x10) AM_MIRROR(0xcf) AM_READWRITE(i8049_unknown_r, i8049_output1_w) + AM_RANGE(0x20, 0x20) AM_MIRROR(0xcf) AM_READWRITE(i8049_datic_r, i8049_lcd_w) + AM_RANGE(0x30, 0x30) AM_MIRROR(0xcf) AM_READWRITE(i8049_from_controller_r, i8049_to_controller_w) + AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(i8049_port1_r, i8049_port1_w) + AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(i8049_port2_r, i8049_port2_w) + AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(i8049_t0_r) + AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(i8049_t1_r) ADDRESS_MAP_END static MACHINE_CONFIG_FRAGMENT( vp931 ) MCFG_CPU_ADD("vp931", I8049, XTAL_11MHz) MCFG_CPU_IO_MAP(vp931_portmap) - MCFG_TIMER_ADD("tracktimer", track_timer) MACHINE_CONFIG_END @@ -147,306 +108,268 @@ -/*************************************************************************** - 22VP931 PLAYER INTERFACE -***************************************************************************/ - -const ldplayer_interface vp931_interface = -{ - LASERDISC_TYPE_PHILLIPS_22VP931, /* type of the player */ - sizeof(ldplayer_data), /* size of the state */ - "Phillips 22VP931", /* name of the player */ - "22vp931", /* shortname of the player */ - ROM_NAME(vp931), /* pointer to ROM region information */ - MACHINE_CONFIG_NAME(vp931), /* pointer to machine configuration */ - vp931_init, /* initialization callback */ - vp931_vsync, /* vsync callback */ - vp931_update, /* update callback */ - NULL, /* overlay callback */ - vp931_data_w, /* parallel data write */ - { /* single line write: */ - NULL, /* LASERDISC_LINE_ENTER */ - NULL /* LASERDISC_LINE_CONTROL */ - }, - vp931_data_r, /* parallel data read */ - { /* single line read: */ - vp931_ready, /* LASERDISC_LINE_READY */ - NULL, /* LASERDISC_LINE_STATUS */ - NULL, /* LASERDISC_LINE_COMMAND */ - vp931_data_ready, /* LASERDISC_LINE_DATA_AVAIL */ - } -}; - - +//************************************************************************** +// PHILLIPS 22VP931 IMPLEMENTATION +//************************************************************************** -/*************************************************************************** - PUBLIC FUNCTIONS -***************************************************************************/ +//------------------------------------------------- +// phillips_22vp931_device - constructor +//------------------------------------------------- -/*------------------------------------------------- - vp931_set_data_ready_callback - set the data - ready callback --------------------------------------------------*/ - -void vp931_set_data_ready_callback(device_t *device, vp931_data_ready_func callback) +phillips_22vp931_device::phillips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : laserdisc_device(mconfig, PHILLIPS_22VP931, "Phillips 22VP931", "22vp931", tag, owner, clock), + m_i8049_cpu(*this, "vp931"), + m_tracktimer(NULL), + m_i8049_out0(0), + m_i8049_out1(0), + m_i8049_port1(0), + m_daticval(0), + m_daticerp(0), + m_datastrobe(0), + m_fromcontroller(0), + m_fromcontroller_pending(false), + m_tocontroller(0), + m_tocontroller_pending(false), + m_trackdir(0), + m_trackstate(0), + m_cmdcount(0), + m_advanced(0) { - laserdisc_state *ld = ldcore_get_safe_token(device); - ld->player->data_ready_cb = callback; } +//------------------------------------------------- +// reset_w - write to the reset line +//------------------------------------------------- -/*************************************************************************** - PHILLIPS 22VP931 IMPLEMENTATION -***************************************************************************/ - -/*------------------------------------------------- - vp931_init - player-specific initialization --------------------------------------------------*/ - -static void vp931_init(laserdisc_state *ld) +void phillips_22vp931_device::reset_w(UINT8 data) { - astring tempstring; - ldplayer_data *player = ld->player; - vp931_data_ready_func cbsave; - - /* reset our state */ - cbsave = player->data_ready_cb; - memset(player, 0, sizeof(*player)); - player->data_ready_cb = cbsave; + // control the CPU state + m_i8049_cpu->set_input_line(INPUT_LINE_RESET, data); - /* find our devices */ - player->cpu = ld->device->subdevice("vp931"); - player->tracktimer = downcast(ld->device->subdevice("tracktimer")); - player->tracktimer->set_ptr(ld); + // on an assert, reset the device state as well + if (data == ASSERT_LINE) + reset(); } -/*------------------------------------------------- - vp931_vsync - VSYNC callback, called at the - start of the blanking period --------------------------------------------------*/ +//------------------------------------------------- +// data_r - handle a parallel data read from the +// 22VP931 +//------------------------------------------------- -static void vp931_vsync(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +UINT8 phillips_22vp931_device::data_r() { - /* reset our command counter (debugging only) */ - ld->player->cmdcount = 0; + // if data is pending, clear the pending flag and notify any callbacks + if (m_tocontroller_pending) + { + m_tocontroller_pending = false; + if (!m_data_ready.isnull()) + m_data_ready(*this, false); + } - /* set the ERP signal to 1 to indicate start of frame, and set a timer to turn it off */ - ld->player->daticerp = 1; - ld->device->machine().scheduler().timer_set(ld->screen->time_until_pos(15*2), FUNC(erp_off), 0, ld); + // also boost interleave for 4 scanlines to ensure proper communications + machine().scheduler().boost_interleave(attotime::zero, screen().scan_period() * 4); + return m_tocontroller; } -/*------------------------------------------------- - vp931_update - update callback, called on - the first visible line of the frame --------------------------------------------------*/ +//------------------------------------------------- +// device_start - device initialization +//------------------------------------------------- -static INT32 vp931_update(laserdisc_state *ld, const vbi_metadata *vbi, int fieldnum, attotime curtime) +void phillips_22vp931_device::device_start() { - /* set the first VBI timer to go at the start of line 16 */ - ld->device->machine().scheduler().timer_set(ld->screen->time_until_pos(16*2), FUNC(vbi_data_fetch), LASERDISC_CODE_LINE16 << 2, ld); + // pass through to the parent + laserdisc_device::device_start(); - /* play forward by default */ - return fieldnum; + // allocate a timer + m_tracktimer = timer_alloc(TID_HALF_TRACK); } -/*------------------------------------------------- - vp931_data_w - handle a parallel data write - to the 22VP931 --------------------------------------------------*/ +//------------------------------------------------- +// device_reset - device reset +//------------------------------------------------- -static void vp931_data_w(laserdisc_state *ld, UINT8 prev, UINT8 data) +void phillips_22vp931_device::device_reset() { - /* set a timer to synchronize execution before sending the data */ - ld->device->machine().scheduler().synchronize(FUNC(deferred_data_w), data, ld); -} - + // pass through to the parent + laserdisc_device::device_reset(); -/*------------------------------------------------- - vp931_data_r - handle a parallel data read - from the 22VP931 --------------------------------------------------*/ - -static UINT8 vp931_data_r(laserdisc_state *ld) -{ - ldplayer_data *player = ld->player; + // reset our state + m_i8049_out0 = 0; + m_i8049_out1 = 0; + m_i8049_port1 = 0; - /* if data is pending, clear the pending flag and notify any callbacks */ - if (player->tocontroller_pending) - { - player->tocontroller_pending = FALSE; - if (player->data_ready_cb != NULL) - (*player->data_ready_cb)(ld->device, FALSE); - } - - /* also boost interleave for 4 scanlines to ensure proper communications */ - ld->device->machine().scheduler().boost_interleave(attotime::zero, ld->screen->scan_period() * 4); - return player->tocontroller; -} - - -/*------------------------------------------------- - vp931_ready - return the status of "ready" - to the caller (ready to accept another - command) --------------------------------------------------*/ - -static UINT8 vp931_ready(laserdisc_state *ld) -{ - /* if data is pending, we are not ready */ - ldplayer_data *player = ld->player; - return player->fromcontroller_pending ? CLEAR_LINE : ASSERT_LINE; -} + m_daticval = 0; + m_daticerp = 0; + m_datastrobe = 0; + m_fromcontroller = 0; + m_fromcontroller_pending = false; + m_tocontroller = 0; + m_tocontroller_pending = false; -/*------------------------------------------------- - vp931_data_ready - return the status of - "data available" to the caller --------------------------------------------------*/ + m_trackdir = 0; + m_trackstate = 0; -static UINT8 vp931_data_ready(laserdisc_state *ld) -{ - ldplayer_data *player = ld->player; - return player->tocontroller_pending ? ASSERT_LINE : CLEAR_LINE; + m_cmdcount = 0; + m_advanced = 0; } -/*------------------------------------------------- - vbi_data_fetch - called 4 times per scanline - on lines 16, 17, and 18 to feed the VBI data - through one byte at a time --------------------------------------------------*/ +//------------------------------------------------- +// device_timer - handle timers set by this +// device +//------------------------------------------------- -static TIMER_CALLBACK( vbi_data_fetch ) +void phillips_22vp931_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; - int which = param & 3; - int line = param >> 2; - UINT32 code = 0; - - /* fetch the code and compute the DATIC latched value */ - if (line >= LASERDISC_CODE_LINE16 && line <= LASERDISC_CODE_LINE18) - code = laserdisc_get_field_code(ld->device, line, FALSE); - - /* at the start of each line, signal an interrupt and use a timer to turn it off */ - if (which == 0) + switch (id) { - device_set_input_line(player->cpu, MCS48_INPUT_IRQ, ASSERT_LINE); - machine.scheduler().timer_set(attotime::from_nsec(5580), FUNC(irq_off), 0, ld); - } + case TID_VBI_DATA_FETCH: + { + UINT32 line = param >> 2; + int which = param & 3; + UINT32 code = 0; + + // fetch the code and compute the DATIC latched value + if (line >= LASERDISC_CODE_LINE16 && line <= LASERDISC_CODE_LINE18) + code = get_field_code(laserdisc_field_code(line), false); + + // at the start of each line, signal an interrupt and use a timer to turn it off + if (which == 0) + { + m_i8049_cpu->set_input_line(MCS48_INPUT_IRQ, ASSERT_LINE); + timer_set(attotime::from_nsec(5580), TID_IRQ_OFF); + } + + // clock the data strobe on each subsequent callback + else if (code != 0) + { + m_daticval = code >> (8 * (3 - which)); + m_datastrobe = 1; + timer_set(attotime::from_nsec(5000), TID_DATA_STROBE_OFF); + } + + // determine the next bit to fetch and reprime ourself + if (++which == 4) + { + which = 0; + line++; + } + if (line <= LASERDISC_CODE_LINE18 + 1) + timer_set(screen().time_until_pos(line*2, which * 2 * screen().width() / 4), TID_VBI_DATA_FETCH, (line << 2) + which); + break; + } - /* clock the data strobe on each subsequent callback */ - else if (code != 0) - { - player->daticval = code >> (8 * (3 - which)); - player->datastrobe = 1; - machine.scheduler().timer_set(attotime::from_nsec(5000), FUNC(datastrobe_off), 0, ld); - } + case TID_DEFERRED_DATA: + // set the value and mark it pending + if (LOG_COMMANDS && m_fromcontroller_pending) + printf("Dropped previous command byte\n"); + m_fromcontroller = param; + m_fromcontroller_pending = true; - /* determine the next bit to fetch and reprime ourself */ - if (++which == 4) - { - which = 0; - line++; - } - if (line <= LASERDISC_CODE_LINE18 + 1) - machine.scheduler().timer_set(ld->screen->time_until_pos(line*2, which * 2 * ld->screen->width() / 4), FUNC(vbi_data_fetch), (line << 2), ld); -} + // track the commands for debugging purposes + if (m_cmdcount < ARRAY_LENGTH(m_cmdbuf)) + { + m_cmdbuf[m_cmdcount++ % 3] = param; + if (LOG_COMMANDS && m_cmdcount % 3 == 0) + printf("Cmd: %02X %02X %02X\n", m_cmdbuf[0], m_cmdbuf[1], m_cmdbuf[2]); + } + break; + case TID_IRQ_OFF: + m_i8049_cpu->set_input_line(MCS48_INPUT_IRQ, CLEAR_LINE); + break; -/*------------------------------------------------- - deferred_data_w - handle a write from the - external controller --------------------------------------------------*/ + case TID_DATA_STROBE_OFF: + m_datastrobe = 0; + break; -static TIMER_CALLBACK( deferred_data_w ) -{ - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; + case TID_ERP_OFF: + m_daticerp = 0; + break; - /* set the value and mark it pending */ - if (LOG_COMMANDS && player->fromcontroller_pending) - printf("Dropped previous command byte\n"); - player->fromcontroller = param; - player->fromcontroller_pending = TRUE; + case TID_HALF_TRACK: + // advance by the count and toggle the state + m_trackstate ^= 1; + if ((m_trackdir < 0 && !m_trackstate) || (m_trackdir > 0 && m_trackstate)) + { + advance_slider(m_trackdir); + m_advanced += m_trackdir; + } + break; - /* track the commands for debugging purposes */ - if (player->cmdcount < ARRAY_LENGTH(player->cmdbuf)) - { - player->cmdbuf[player->cmdcount++ % 3] = param; - if (LOG_COMMANDS && player->cmdcount % 3 == 0) - printf("Cmd: %02X %02X %02X\n", player->cmdbuf[0], player->cmdbuf[1], player->cmdbuf[2]); + // pass everything else onto the parent + default: + laserdisc_device::device_timer(timer, id, param, ptr); + break; } } -/*------------------------------------------------- - irq_off - turn off the 8048 IRQ signal --------------------------------------------------*/ +//------------------------------------------------- +// device_rom_region - return a pointer to our +// ROM region definitions +//------------------------------------------------- -static TIMER_CALLBACK( irq_off ) +const rom_entry *phillips_22vp931_device::device_rom_region() const { - laserdisc_state *ld = (laserdisc_state *)ptr; - device_set_input_line(ld->player->cpu, MCS48_INPUT_IRQ, CLEAR_LINE); + return ROM_NAME(vp931); } -/*------------------------------------------------- - datastrobe_off - turn off the DATIC data - strobe signal --------------------------------------------------*/ +//------------------------------------------------- +// device_mconfig_additions - return a pointer to +// our machine config fragment +//------------------------------------------------- -static TIMER_CALLBACK( datastrobe_off ) +machine_config_constructor phillips_22vp931_device::device_mconfig_additions() const { - laserdisc_state *ld = (laserdisc_state *)ptr; - ld->player->datastrobe = 0; + return MACHINE_CONFIG_NAME(vp931); } -/*------------------------------------------------- - erp_off - turn off the DATIC ERP signal --------------------------------------------------*/ +//------------------------------------------------- +// player_vsync - VSYNC callback, called at the +// start of the blanking period +//------------------------------------------------- -static TIMER_CALLBACK( erp_off ) +void phillips_22vp931_device::player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ld->player->daticerp = 0; + // reset our command counter (debugging only) + m_cmdcount = 0; + + // set the ERP signal to 1 to indicate start of frame, and set a timer to turn it off + m_daticerp = 1; + timer_set(screen().time_until_pos(15*2), TID_ERP_OFF); } -/*------------------------------------------------- - track_timer - advance by one half-track --------------------------------------------------*/ +//------------------------------------------------- +// player_update - update callback, called on +// the first visible line of the frame +//------------------------------------------------- -static TIMER_DEVICE_CALLBACK( track_timer ) +INT32 phillips_22vp931_device::player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime) { - laserdisc_state *ld = (laserdisc_state *)ptr; - ldplayer_data *player = ld->player; + // set the first VBI timer to go at the start of line 16 + timer_set(screen().time_until_pos(16*2), TID_VBI_DATA_FETCH, LASERDISC_CODE_LINE16 << 2); - /* advance by the count and toggle the state */ - player->trackstate ^= 1; - if ((player->trackdir < 0 && !player->trackstate) || (player->trackdir > 0 && player->trackstate)) - { - ldcore_advance_slider(ld, player->trackdir); - player->advanced += player->trackdir; - } + // play forward by default + return fieldnum; } -/*------------------------------------------------- - output0_w - controls audio/video squelch - and other bits --------------------------------------------------*/ +//------------------------------------------------- +// i8049_output0_w - controls audio/video squelch +// and other bits +//------------------------------------------------- -static WRITE8_HANDLER( output0_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_output0_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - /* $80 = n/c $40 = LED (?) -> C335 @@ -458,9 +381,9 @@ $01 = inverted -> VIDEO MUTE */ - if (LOG_PORTS && (player->out0 ^ data) & 0xff) + if (LOG_PORTS && (m_i8049_out0 ^ data) & 0xff) { - printf("%03X:out0:", cpu_get_pc(&space->device())); + printf("%03X:out0:", cpu_get_pc(&space.device())); if ( (data & 0x80)) printf(" ???"); if ( (data & 0x40)) printf(" LED1"); if ( (data & 0x20)) printf(" LED2"); @@ -470,25 +393,21 @@ if (!(data & 0x02)) printf(" AUDMUTE1"); if (!(data & 0x01)) printf(" VIDMUTE"); printf("\n"); - player->out0 = data; + m_i8049_out0 = data; } - /* update a/v squelch */ - ldcore_set_audio_squelch(ld, !(data & 0x02), !(data & 0x04)); - ldcore_set_video_squelch(ld, !(data & 0x01)); + // update a/v squelch + set_audio_squelch(!(data & 0x02), !(data & 0x04)); + set_video_squelch(!(data & 0x01)); } -/*------------------------------------------------- - output1_w - controls scanning behaviors --------------------------------------------------*/ +//------------------------------------------------- +// i8049_output1_w - controls scanning behaviors +//------------------------------------------------- -static WRITE8_HANDLER( output1_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_output1_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - INT32 speed = 0; - /* $80 = n/c $40 = n/c @@ -500,36 +419,38 @@ $01 = OSM */ - if (LOG_PORTS && (player->out1 ^ data) & 0x08) + INT32 speed = 0; + + if (LOG_PORTS && (m_i8049_out1 ^ data) & 0x08) { - mame_printf_debug("%03X:out1:", cpu_get_pc(&space->device())); + mame_printf_debug("%03X:out1:", cpu_get_pc(&space.device())); if (!(data & 0x08)) mame_printf_debug(" SMS"); mame_printf_debug("\n"); - player->out1 = data; + m_i8049_out1 = data; } - /* speed is 0 unless SCAN CMD is clear */ + // speed is 0 unless SCAN CMD is clear speed = 0; if (!(data & 0x02)) { - /* fast/slow is based on bit 2 */ + // fast/slow is based on bit 2 speed = (data & 0x04) ? SCAN_FAST_SPEED : SCAN_SPEED; - /* direction is based on bit 0 */ + // direction is based on bit 0 if (data & 0x01) speed = -speed; } - /* update the speed */ - ldcore_set_slider_speed(ld, speed); + // update the speed + set_slider_speed(speed); } -/*------------------------------------------------- - lcd_w - vestigial LCD frame display --------------------------------------------------*/ +//------------------------------------------------- +// i8049_lcd_w - vestigial LCD frame display +//------------------------------------------------- -static WRITE8_HANDLER( lcd_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_lcd_w ) { /* Frame number is written as 5 digits here; however, it is not actually @@ -538,22 +459,23 @@ } -/*------------------------------------------------- - unknown_r - unknown input port --------------------------------------------------*/ +//------------------------------------------------- +// i8049_unknown_r - unknown input port +//------------------------------------------------- -static READ8_HANDLER( unknown_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_unknown_r ) { - /* only bit $80 is checked and its effects are minor */ + // only bit $80 is checked and its effects are minor return 0x00; } -/*------------------------------------------------- - keypad_r - vestigial keypad/button controls --------------------------------------------------*/ +//------------------------------------------------- +// i8049_keypad_r - vestigial keypad/button +// controls +//------------------------------------------------- -static READ8_HANDLER( keypad_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_keypad_r ) { /* From the code, this is apparently a vestigial keypad with basic controls: @@ -570,89 +492,75 @@ } -/*------------------------------------------------- - datic_r - read the latched value from the - DATIC circuit --------------------------------------------------*/ +//------------------------------------------------- +// i8049_datic_r - read the latched value from the +// DATIC circuit +//------------------------------------------------- -static READ8_HANDLER( datic_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_datic_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - return ld->player->daticval; + return m_daticval; } -/*------------------------------------------------- - from_controller_r - read the value the - external controller wrote --------------------------------------------------*/ +//------------------------------------------------- +// i8049_from_controller_r - read the value the +// external controller wrote +//------------------------------------------------- -static READ8_HANDLER( from_controller_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_from_controller_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - - /* clear the pending flag and return the data */ - player->fromcontroller_pending = FALSE; - return player->fromcontroller; + // clear the pending flag and return the data + m_fromcontroller_pending = false; + return m_fromcontroller; } -/*------------------------------------------------- - to_controller_w - write a value back to the - external controller --------------------------------------------------*/ +//------------------------------------------------- +// i8049_to_controller_w - write a value back to +// the external controller +//------------------------------------------------- -static WRITE8_HANDLER( to_controller_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_to_controller_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; + // set the pending flag and stash the data + m_tocontroller_pending = TRUE; + m_tocontroller = data; - /* set the pending flag and stash the data */ - player->tocontroller_pending = TRUE; - player->tocontroller = data; + // signal to the callback if provided + if (!m_data_ready.isnull()) + m_data_ready(*this, true); - /* signal to the callback if provided */ - if (player->data_ready_cb != NULL) - (*player->data_ready_cb)(ld->device, TRUE); - - /* also boost interleave for 4 scanlines to ensure proper communications */ - ld->device->machine().scheduler().boost_interleave(attotime::zero, ld->screen->scan_period() * 4); + // also boost interleave for 4 scanlines to ensure proper communications + machine().scheduler().boost_interleave(attotime::zero, screen().scan_period() * 4); } -/*------------------------------------------------- - port1_r - read the 8048 I/O port 1 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port1_r - read the 8048 I/O port 1 +//------------------------------------------------- -static READ8_HANDLER( port1_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_port1_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - UINT8 result = 0x00; - /* $80 = P17 = (in) unsure $40 = P16 = (in) /ERP from datic circuit $20 = P15 = (in) D105 */ - if (!player->daticerp) + UINT8 result = 0x00; + if (!m_daticerp) result |= 0x40; - return result; } -/*------------------------------------------------- - port1_w - write the 8048 I/O port 1 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port1_w - write the 8048 I/O port 1 +//------------------------------------------------- -static WRITE8_HANDLER( port1_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_port1_w ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - /* $10 = P14 = (out) D104 -> /SPEED $08 = P13 = (out) D103 -> /TIMER ENABLE @@ -661,9 +569,9 @@ $01 = P10 = (out) D100 -> some op-amp then to C334, B56, B332 */ - if (LOG_PORTS && (player->port1 ^ data) & 0x1f) + if (LOG_PORTS && (m_i8049_port1 ^ data) & 0x1f) { - printf("%03X:port1:", cpu_get_pc(&space->device())); + printf("%03X:port1:", cpu_get_pc(&space.device())); if (!(data & 0x10)) printf(" SPEED"); if (!(data & 0x08)) printf(" TIMENABLE"); if (!(data & 0x04)) printf(" REV"); @@ -672,82 +580,78 @@ printf("\n"); } - /* if bit 0 is set, we are not tracking */ + // if bit 0 is set, we are not tracking if (data & 0x01) - player->trackdir = 0; + m_trackdir = 0; - /* if bit 0 is clear and we weren't tracking before, initialize the state */ - else if (player->trackdir == 0) + // if bit 0 is clear and we weren't tracking before, initialize the state + else if (m_trackdir == 0) { - player->advanced = 0; + m_advanced = 0; - /* if bit 2 is clear, we are moving backwards */ + // if bit 2 is clear, we are moving backwards if (!(data & 0x04)) { - player->trackdir = -1; - player->trackstate = 1; + m_trackdir = -1; + m_trackstate = 1; } - /* if bit 1 is clear, we are moving forward */ + // if bit 1 is clear, we are moving forward else if (!(data & 0x02)) { - player->trackdir = 1; - player->trackstate = 0; + m_trackdir = 1; + m_trackstate = 0; } } - /* if we have a timer, adjust it */ - if (player->tracktimer != NULL) + // if we have a timer, adjust it + if (m_tracktimer != NULL) { - /* turn it off if we're not tracking */ - if (player->trackdir == 0) - player->tracktimer->reset(); + // turn it off if we're not tracking + if (m_trackdir == 0) + m_tracktimer->reset(); - /* if we just started tracking, or if the speed was changed, reprime the timer */ - else if (((player->port1 ^ data) & 0x11) != 0) + // if we just started tracking, or if the speed was changed, reprime the timer + else if (((m_i8049_port1 ^ data) & 0x11) != 0) { - /* speeds here are just guesses, but work with the player logic; this is the time per half-track */ + // speeds here are just guesses, but work with the player logic; this is the time per half-track attotime speed = (data & 0x10) ? attotime::from_usec(60) : attotime::from_usec(10); - /* always start with an initial long delay; the code expects this */ - player->tracktimer->adjust(attotime::from_usec(100), 0, speed); + // always start with an initial long delay; the code expects this + m_tracktimer->adjust(attotime::from_usec(100), 0, speed); } } - player->port1 = data; + m_i8049_port1 = data; } -/*------------------------------------------------- - port2_r - read from the 8048 I/O port 2 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port2_r - read from the 8048 I/O port 2 +//------------------------------------------------- -static READ8_HANDLER( port2_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_port2_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - ldplayer_data *player = ld->player; - UINT8 result = 0x00; - /* $80 = P27 = (in) set/reset latch; set by FOC LS, reset by IGR $20 = P25 = (in) D125 -> 0 when data written to controller is preset, reset to 1 when read $10 = P24 = (in) D124 -> 0 when data from controller is present, reset to 1 on a read */ - if (!player->tocontroller_pending) + UINT8 result = 0x00; + if (!m_tocontroller_pending) result |= 0x20; - if (!player->fromcontroller_pending) + if (!m_fromcontroller_pending) result |= 0x10; - return result; } -/*------------------------------------------------- - port2_w - write the 8048 I/O port 2 --------------------------------------------------*/ +//------------------------------------------------- +// i8049_port2_w - write the 8048 I/O port 2 +//------------------------------------------------- -static WRITE8_HANDLER( port2_w ) +WRITE8_MEMBER( phillips_22vp931_device::i8049_port2_w ) { /* $40 = P26 = (out) cleared while data is sent back & forth; set afterwards @@ -756,26 +660,24 @@ } -/*------------------------------------------------- - t0_r - return the T0 line status, which is - connected to the DATIC's data strobe line --------------------------------------------------*/ +//------------------------------------------------- +// i8049_t0_r - return the T0 line status, which is +// connected to the DATIC's data strobe line +//------------------------------------------------- -static READ8_HANDLER( t0_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_t0_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - return ld->player->datastrobe; + return m_datastrobe; } -/*------------------------------------------------- - t1_r - return the T1 line status, which is - connected to the tracking state and is used - to count the number of tracks advanced --------------------------------------------------*/ +//------------------------------------------------- +// i8049_t1_r - return the T1 line status, which +// is connected to the tracking state and is used +// to count the number of tracks advanced +//------------------------------------------------- -static READ8_HANDLER( t1_r ) +READ8_MEMBER( phillips_22vp931_device::i8049_t1_r ) { - laserdisc_state *ld = ldcore_get_safe_token(space->device().owner()); - return ld->player->trackstate; + return m_trackstate; } diff -Nru mame-0.144/src/emu/machine/ldvp931.h mame-0.145/src/emu/machine/ldvp931.h --- mame-0.144/src/emu/machine/ldvp931.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/ldvp931.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,168 @@ +/************************************************************************* + + ldvp931.h + + Philips 22VP931 laserdisc emulation. + +**************************************************************************** + + 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. + +*************************************************************************/ + +#pragma once + +#ifndef __LDVP931_H__ +#define __LDVP931_H__ + +#include "laserdsc.h" +#include "cpu/mcs48/mcs48.h" + + +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_LASERDISC_22VP931_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PHILLIPS_22VP931, 0) \ + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +extern const device_type PHILLIPS_22VP931; + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> phillips_22vp931_device + +// base _22vp931 class +class phillips_22vp931_device : public laserdisc_device +{ +public: + // types + typedef delegate data_ready_delegate; + + // construction/destruction + phillips_22vp931_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // input and output + void data_w(UINT8 data) { synchronize(TID_DEFERRED_DATA, data); } + void reset_w(UINT8 data); + UINT8 data_r(); + UINT8 ready_r() { return m_fromcontroller_pending ? CLEAR_LINE : ASSERT_LINE; } + UINT8 data_available_r() { return m_tocontroller_pending ? ASSERT_LINE : CLEAR_LINE; } + + // configuration + void set_data_ready_callback(data_ready_delegate callback) { m_data_ready = callback; } + +protected: + // timer IDs + enum + { + TID_IRQ_OFF = TID_FIRST_PLAYER_TIMER, + TID_DATA_STROBE_OFF, + TID_ERP_OFF, + TID_HALF_TRACK, + TID_VBI_DATA_FETCH, + TID_DEFERRED_DATA + }; + + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual const rom_entry *device_rom_region() const; + virtual machine_config_constructor device_mconfig_additions() const; + + // subclass overrides + virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual INT32 player_update(const vbi_metadata &vbi, int fieldnum, attotime curtime); + virtual void player_overlay(bitmap_yuy16 &bitmap) { } + +public: + // internal read/write handlers + DECLARE_WRITE8_MEMBER( i8049_output0_w ); + DECLARE_WRITE8_MEMBER( i8049_output1_w ); + DECLARE_WRITE8_MEMBER( i8049_lcd_w ); + DECLARE_READ8_MEMBER( i8049_unknown_r ); + DECLARE_READ8_MEMBER( i8049_keypad_r ); + DECLARE_READ8_MEMBER( i8049_datic_r ); + DECLARE_READ8_MEMBER( i8049_from_controller_r ); + DECLARE_WRITE8_MEMBER( i8049_to_controller_w ); + DECLARE_READ8_MEMBER( i8049_port1_r ); + DECLARE_WRITE8_MEMBER( i8049_port1_w ); + DECLARE_READ8_MEMBER( i8049_port2_r ); + DECLARE_WRITE8_MEMBER( i8049_port2_w ); + DECLARE_READ8_MEMBER( i8049_t0_r ); + DECLARE_READ8_MEMBER( i8049_t1_r ); + +protected: + // internal state + required_device m_i8049_cpu; // CPU index of the 8049 + emu_timer * m_tracktimer; // timer device + data_ready_delegate m_data_ready; // data ready callback + + // I/O port states + UINT8 m_i8049_out0; // output 0 state + UINT8 m_i8049_out1; // output 1 state + UINT8 m_i8049_port1; // port 1 state + + // DATIC circuit implementation + UINT8 m_daticval; // latched DATIC value + UINT8 m_daticerp; // /ERP value from DATIC + UINT8 m_datastrobe; // DATA STROBE line from DATIC + + // communication status + UINT8 m_reset_state; // state of the reset input + UINT8 m_fromcontroller; // command byte from the controller + bool m_fromcontroller_pending; // true if data is pending + UINT8 m_tocontroller; // command byte to the controller + bool m_tocontroller_pending; // true if data is pending + + // tracking + INT8 m_trackdir; // direction of tracking + UINT8 m_trackstate; // state of tracking + + // debugging + UINT8 m_cmdbuf[3]; // 3 bytes worth of commands + UINT8 m_cmdcount; // number of command bytes seen + INT16 m_advanced; // number of frames advanced +}; + + +#endif diff -Nru mame-0.144/src/emu/machine/mb3773.c mame-0.145/src/emu/machine/mb3773.c --- mame-0.144/src/emu/machine/mb3773.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/mb3773.c 2012-02-06 21:30:28.000000000 +0000 @@ -47,9 +47,8 @@ // on this device //------------------------------------------------- -bool mb3773_device::device_validity_check( emu_options &options, const game_driver &driver ) const +void mb3773_device::device_validity_check(validity_checker &valid) const { - return false; } diff -Nru mame-0.144/src/emu/machine/mb3773.h mame-0.145/src/emu/machine/mb3773.h --- mame-0.144/src/emu/machine/mb3773.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/mb3773.h 2012-02-06 21:30:28.000000000 +0000 @@ -35,7 +35,7 @@ protected: // device-level overrides virtual void device_config_complete(); - virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/emu/machine/mc68901.c mame-0.145/src/emu/machine/mc68901.c --- mame-0.144/src/emu/machine/mc68901.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine/mc68901.c 2012-02-06 21:30:28.000000000 +0000 @@ -19,18 +19,22 @@ However the fact that they indeed happen in the ST is quite interesting. The MFP will generate a spurious interrupt if interrupts are disabled (by changing the IERA/IERB registers) - at the ???precise point???. The precise point would be after the system (but not necessarily the CPU, see below) + at the 'precise point'. The precise point would be after the system (but not necessarily the CPU, see below) triggered an MFP interrupt, and before the CPU drives the interrupt acknowledge cycle. - If the MFP was connected directly to the CPU, spurious interrupts probably couldn???t happen. However in the + If the MFP was connected directly to the CPU, spurious interrupts probably couldn't happen. However in the ST, GLUE seats in the middle and handles all the interrupt timing. It is possible that GLUE introduces a delay between detecting a change in the MFP interrupt request signal and actually propagating the change to the CPU IPL signals (it is even possible that GLUE make some kind of latching). This would create a window - long enough for the ???precise point??? described above. + long enough for the 'precise point' described above. "yes, the spurious interrupt occurs when i mask a timer. i did not notice an occurance of the SPI when changing data and control registers. if i kill interrupts with the status reg before masking the timer interrupt, then the SPI occurs as soon as the status register is set to re-enable interrupts." + Well, more experiments show that it's somewhat incorrect, and + the GLUE is essentially invisible w.r.t IPL. The CPU and the + MFP manage to add the delays all by themselves. + - divide serial clock by 16 - synchronous mode - 1.5/2 stop bits diff -Nru mame-0.144/src/emu/machine/mccs1850.c mame-0.145/src/emu/machine/mccs1850.c --- mame-0.144/src/emu/machine/mccs1850.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/mccs1850.c 2012-02-06 21:30:28.000000000 +0000 @@ -131,7 +131,8 @@ m_ram[REGISTER_STATUS] &= ~STATUS_IT; } - m_out_int_func(interrupt ? ASSERT_LINE : CLEAR_LINE); + if(!int_cb.isnull()) + int_cb(interrupt); } @@ -139,11 +140,12 @@ // set_pse_line - //------------------------------------------------- -inline void mccs1850_device::set_pse_line(int state) +inline void mccs1850_device::set_pse_line(bool state) { m_pse = state; - m_out_pse_func(m_pse); + if(!pse_cb.isnull()) + pse_cb(m_pse); } @@ -156,6 +158,7 @@ switch (offset) { case REGISTER_COUNTER_LATCH: + case REGISTER_COUNTER_LATCH+3: // Required by the NeXT power on test // load counter value into latch m_ram[REGISTER_COUNTER_LATCH] = m_counter >> 24; m_ram[REGISTER_COUNTER_LATCH + 1] = m_counter >> 16; @@ -195,7 +198,7 @@ if (data & CONTROL_PD) { if (LOG) logerror("MCCS1850 '%s' Power Down\n", tag()); - set_pse_line(0); + set_pse_line(false); } if (data & CONTROL_AR) @@ -262,7 +265,7 @@ else { // wake up - set_pse_line(1); + set_pse_line(true); } } } @@ -291,27 +294,11 @@ { } - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void mccs1850_device::device_config_complete() +void mccs1850_device::set_cb(cb_t _int_cb, cb_t _pse_cb, cb_t _nuc_cb) { - // inherit a copy of the static data - const mccs1850_interface *intf = reinterpret_cast(static_config()); - if (intf != NULL) - *static_cast(this) = *intf; - - // or initialize to defaults if none provided - else - { - memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); - memset(&m_out_pse_cb, 0, sizeof(m_out_pse_cb)); - memset(&m_out_nuc_cb, 0, sizeof(m_out_nuc_cb)); - } + int_cb = _int_cb; + pse_cb = _pse_cb; + nuc_cb = _nuc_cb; } @@ -321,11 +308,6 @@ void mccs1850_device::device_start() { - // resolve callbacks - m_out_int_func.resolve(m_out_int_cb, *this); - m_out_pse_func.resolve(m_out_pse_cb, *this); - m_out_nuc_func.resolve(m_out_nuc_cb, *this); - // allocate timers m_clock_timer = timer_alloc(TIMER_CLOCK); m_clock_timer->adjust(attotime::from_hz(clock() / 32768), 0, attotime::from_hz(clock() / 32768)); @@ -456,7 +438,7 @@ if (m_bits == 8) { - if (LOG) logerror("MCCS1850 '%s' %s Address %u\n", tag(), BIT(m_address, 7) ? "Write" : "Read", m_address & 0x7f); + if (LOG) logerror("MCCS1850 '%s' %s Address %02x\n", tag(), BIT(m_address, 7) ? "Write" : "Read", m_address & 0x7f); m_bits = 0; m_state = STATE_DATA; @@ -559,7 +541,7 @@ check_interrupt(); } - set_pse_line(1); + set_pse_line(true); } } diff -Nru mame-0.144/src/emu/machine/mccs1850.h mame-0.145/src/emu/machine/mccs1850.h --- mame-0.144/src/emu/machine/mccs1850.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/mccs1850.h 2012-02-06 21:30:28.000000000 +0000 @@ -31,41 +31,27 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_MCCS1850_ADD(_tag, _clock, _config) \ +#define MCFG_MCCS1850_ADD(_tag, _clock, _int_cb, _pse_cb, _nuc_cb) \ MCFG_DEVICE_ADD(_tag, MCCS1850, _clock) \ - MCFG_DEVICE_CONFIG(_config) - - -#define MCCS1850_INTERFACE(name) \ - const mccs1850_interface (name) = - + downcast(device)->set_cb(_int_cb, _pse_cb, _nuc_cb); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -// ======================> mccs1850_interface - -struct mccs1850_interface -{ - devcb_write_line m_out_int_cb; - devcb_write_line m_out_pse_cb; - devcb_write_line m_out_nuc_cb; -}; - - - // ======================> mccs1850_device class mccs1850_device : public device_t, public device_rtc_interface, - public device_nvram_interface, - public mccs1850_interface + public device_nvram_interface { public: + typedef delegate cb_t; + // construction/destruction mccs1850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + void set_cb(cb_t int_cb, cb_t pse_cb, cb_t nuc_cb); DECLARE_WRITE_LINE_MEMBER( ce_w ); DECLARE_WRITE_LINE_MEMBER( sck_w ); @@ -77,7 +63,6 @@ protected: // device-level overrides - virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); @@ -93,16 +78,14 @@ private: inline void check_interrupt(); - inline void set_pse_line(int state); + inline void set_pse_line(bool state); inline UINT8 read_register(offs_t offset); inline void write_register(offs_t offset, UINT8 data); inline void advance_seconds(); static const device_timer_id TIMER_CLOCK = 0; - devcb_resolved_write_line m_out_int_func; - devcb_resolved_write_line m_out_pse_func; - devcb_resolved_write_line m_out_nuc_func; + cb_t int_cb, pse_cb, nuc_cb; UINT8 m_ram[0x80]; // RAM diff -Nru mame-0.144/src/emu/machine/msm6242.c mame-0.145/src/emu/machine/msm6242.c --- mame-0.144/src/emu/machine/msm6242.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/msm6242.c 2012-02-06 21:30:28.000000000 +0000 @@ -2,10 +2,16 @@ MSM6242 Real Time Clock + TODO: + - HOLD mechanism + - IRQ ACK + - why skns tries to read uninitialized registers? + ***************************************************************************/ #include "emu.h" #include "machine/msm6242.h" +#include "machine/devhelpr.h" enum @@ -28,53 +34,184 @@ MSM6242_REG_CF }; +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type msm6242 = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// xxx_device - constructor +//------------------------------------------------- -typedef struct _msm6242_t msm6242_t; -struct _msm6242_t +msm6242_device::msm6242_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, msm6242, "msm6242", tag, owner, clock) { - UINT8 reg[3]; - system_time hold_time; -}; +} + +void msm6242_device::rtc_timer_callback() +{ + static const UINT8 dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + int dpm_count; + + m_tick++; + + if(m_irq_flag == 1 && m_irq_type == 0 && ((m_tick % 0x200) == 0)) // 1/64 of second + { + if ( !m_out_int_func.isnull() ) + m_out_int_func( ASSERT_LINE ); + } + + if(m_tick & 0x8000) // 32,768 KHz == 0x8000 ticks + { + m_tick = 0; + m_rtc.sec++; + + if(m_irq_flag == 1 && m_irq_type == 1) // 1 second clock + if ( !m_out_int_func.isnull() ) + m_out_int_func(ASSERT_LINE); + + if(m_rtc.sec >= 60) + { + m_rtc.min++; m_rtc.sec = 0; + if(m_irq_flag == 1 && m_irq_type == 2) // 1 minute clock + if ( !m_out_int_func.isnull() ) + m_out_int_func(ASSERT_LINE); + } + if(m_rtc.min >= 60) + { + m_rtc.hour++; m_rtc.min = 0; + if(m_irq_flag == 1 && m_irq_type == 3) // 1 hour clock + if ( !m_out_int_func.isnull() ) + m_out_int_func(ASSERT_LINE); + } + if(m_rtc.hour >= 24) { m_rtc.day++; m_rtc.wday++; m_rtc.hour = 0; } + if(m_rtc.wday >= 6) { m_rtc.wday = 1; } + + /* TODO: crude leap year support */ + dpm_count = (m_rtc.month)-1; + + if(((m_rtc.year % 4) == 0) && m_rtc.month == 2) + { + if((m_rtc.day) >= dpm[dpm_count]+1+1) + { m_rtc.month++; m_rtc.day = 0x01; } + } + else if(m_rtc.day >= dpm[dpm_count]+1) { m_rtc.month++; m_rtc.day = 0x01; } + if(m_rtc.month >= 0x13) { m_rtc.year++; m_rtc.month = 1; } + if(m_rtc.year >= 100) { m_rtc.year = 0; } //1900-1999 possible timeframe + } +} -/* makes sure that the passed in device is the right type */ -INLINE msm6242_t *get_safe_token(device_t *device) +TIMER_CALLBACK( msm6242_device::rtc_inc_callback ) { - assert(device != NULL); - assert(device->type() == MSM6242); + reinterpret_cast(ptr)->rtc_timer_callback(); +} + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- - return (msm6242_t *)downcast(device)->token(); +void msm6242_device::device_validity_check(validity_checker &valid) const +{ } +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- -READ8_DEVICE_HANDLER( msm6242_r ) +void msm6242_device::device_start() { - system_time curtime, *systime = &curtime; - msm6242_t *msm6242 = get_safe_token(device); + m_out_int_func.resolve( m_out_int_cb, *this ); + + /* let's call the timer callback every second */ + machine().scheduler().timer_pulse(attotime::from_hz(clock()), FUNC(rtc_inc_callback), 0, (void *)this); + + system_time systime; + machine().base_datetime(systime); + + m_rtc.day = (systime.local_time.mday); + m_rtc.month = (systime.local_time.month+1); + m_rtc.wday = (systime.local_time.weekday); + m_rtc.year = (systime.local_time.year % 100); + m_rtc.hour = (systime.local_time.hour); + m_rtc.min = (systime.local_time.minute); + m_rtc.sec = (systime.local_time.second); + m_tick = 0; + m_irq_flag = 0; + m_irq_type = 0; + + /* TODO: skns writes 0x4 to D then expects E == 6 and F == 4, perhaps those are actually saved in the RTC CMOS? */ + m_reg[0] = 0; + m_reg[1] = 0x6; + m_reg[2] = 0x4; +} - if (msm6242->reg[0] & 1) /* if HOLD is set, use the hold time */ + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void msm6242_device::device_reset() +{ + if ( !m_out_int_func.isnull() ) + m_out_int_func( CLEAR_LINE ); +} + + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void msm6242_device::device_config_complete() +{ + const msm6242_interface *intf = reinterpret_cast(static_config()); + + if ( intf != NULL ) { - systime = &msm6242->hold_time; + *static_cast(this) = *intf; } - else /* otherwise, use the current time */ + else { - device->machine().current_datetime(curtime); + memset(&m_out_int_cb, 0, sizeof(m_out_int_cb)); } +} + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +READ8_MEMBER( msm6242_device::read ) +{ + rtc_regs_t cur_time; + + //cur_time = (m_reg[0] & 1) ? m_hold : m_rtc; + + cur_time = m_rtc; switch(offset) { - case MSM6242_REG_S1: return systime->local_time.second % 10; - case MSM6242_REG_S10: return systime->local_time.second / 10; - case MSM6242_REG_MI1: return systime->local_time.minute % 10; - case MSM6242_REG_MI10: return systime->local_time.minute / 10; + case MSM6242_REG_S1: return (cur_time.sec % 10) & 0xf; + case MSM6242_REG_S10: return (cur_time.sec / 10) & 0xf; + case MSM6242_REG_MI1: return (cur_time.min % 10) & 0xf; + case MSM6242_REG_MI10: return (cur_time.min / 10) & 0xf; case MSM6242_REG_H1: case MSM6242_REG_H10: { - int hour = systime->local_time.hour; + int hour = cur_time.hour; int pm = 0; /* check for 12/24 hour mode */ - if ((msm6242->reg[2] & 0x04) == 0) /* 12 hour mode? */ + if ((m_reg[2] & 0x04) == 0) /* 12 hour mode? */ { if (hour >= 12) pm = 1; @@ -82,7 +219,7 @@ hour %= 12; if ( hour == 0 ) - hour = 12; + hour = 12; } if ( offset == MSM6242_REG_H1 ) @@ -91,114 +228,86 @@ return (hour / 10) | (pm <<2); } - case MSM6242_REG_D1: return systime->local_time.mday % 10; - case MSM6242_REG_D10: return systime->local_time.mday / 10; - case MSM6242_REG_MO1: return (systime->local_time.month+1) % 10; - case MSM6242_REG_MO10: return (systime->local_time.month+1) / 10; - case MSM6242_REG_Y1: return systime->local_time.year % 10; - case MSM6242_REG_Y10: return (systime->local_time.year % 100) / 10; - case MSM6242_REG_W: return systime->local_time.weekday; - case MSM6242_REG_CD: return msm6242->reg[0]; - case MSM6242_REG_CE: return msm6242->reg[1]; - case MSM6242_REG_CF: return msm6242->reg[2]; + case MSM6242_REG_D1: return (cur_time.day % 10) & 0xf; + case MSM6242_REG_D10: return (cur_time.day / 10) & 0xf; + case MSM6242_REG_MO1: return (cur_time .month % 10) & 0xf; + case MSM6242_REG_MO10: return (cur_time.month / 10) & 0xf; + case MSM6242_REG_Y1: return (cur_time.year % 10) & 0xf; + case MSM6242_REG_Y10: return ((cur_time.year / 10) % 10) & 0xf; + case MSM6242_REG_W: return cur_time.wday; + case MSM6242_REG_CD: return m_reg[0]; + case MSM6242_REG_CE: return m_reg[1]; + case MSM6242_REG_CF: return m_reg[2]; } - logerror("%s: MSM6242 unmapped offset %02x read\n", device->machine().describe_context(), offset); + logerror("%s: MSM6242 unmapped offset %02x read\n", machine().describe_context(), offset); return 0; } - -WRITE8_DEVICE_HANDLER( msm6242_w ) +WRITE8_MEMBER( msm6242_device::write ) { - msm6242_t *msm6242 = get_safe_token(device); - switch(offset) { case MSM6242_REG_CD: { - msm6242->reg[0] = data & 0x0f; + m_reg[0] = data & 0x0f; + #if 0 if (data & 1) /* was Hold set? */ { - device->machine().current_datetime(msm6242->hold_time); + m_hold.day = m_rtc.day; + m_hold.month = m_rtc.month; + m_hold.hour = m_rtc.hour; + m_hold.day = m_rtc.day; + m_hold.month = m_rtc.month; + m_hold.year = m_rtc.year; + m_hold.wday = m_rtc.wday; } + #endif return; } - case MSM6242_REG_CE: msm6242->reg[1] = data & 0x0f; return; + case MSM6242_REG_CE: + m_reg[1] = data & 0x0f; + if((data & 3) == 0) // MASK & STD = 0 + { + m_irq_flag = 1; + m_irq_type = (data & 0xc) >> 2; + //m_std_timer->adjust(attotime::from_msec(timer_param[(data & 0xc) >> 2]), 0, attotime::from_msec(timer_param[(data & 0xc) >> 2])); + } + else + { + m_irq_flag = 0; + if ( !m_out_int_func.isnull() ) + m_out_int_func( CLEAR_LINE ); + } + + return; case MSM6242_REG_CF: { /* the 12/24 mode bit can only be changed while REST is 1 */ - if ((data ^ msm6242->reg[2]) & 0x04) + if ((data ^ m_reg[2]) & 0x04) { - msm6242->reg[2] = (msm6242->reg[2] & 0x04) | (data & ~0x04); + m_reg[2] = (m_reg[2] & 0x04) | (data & ~0x04); - if (msm6242->reg[2] & 1) - msm6242->reg[2] = (msm6242->reg[2] & ~0x04) | (data & 0x04); + if (m_reg[2] & 1) + m_reg[2] = (m_reg[2] & ~0x04) | (data & 0x04); } else { - msm6242->reg[2] = data & 0x0f; + m_reg[2] = data & 0x0f; } return; } } - logerror("%s: MSM6242 unmapped offset %02x written with %02x\n", device->machine().describe_context(), offset, data); + logerror("%s: MSM6242 unmapped offset %02x written with %02x\n", machine().describe_context(), offset, data); } -static DEVICE_START( msm6242 ) -{ - msm6242_t *msm6242 = get_safe_token(device); - msm6242->reg[0] = 0; - msm6242->reg[1] = 0; - msm6242->reg[2] = 0; - memset(&msm6242->hold_time, 0, sizeof(system_time)); -} - - -DEVICE_GET_INFO( msm6242 ) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(msm6242_t); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(msm6242); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_RESET: /* Nothing */ break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "OKI MSM6242"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "MSM6242 RTC"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.00"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; - } -} - - -#if 0 -READ16_HANDLER( msm6242_lsb_r ) -{ - return msm6242_r(space, offset); -} - -WRITE16_HANDLER( msm6242_lsb_w ) -{ - if (ACCESSING_BITS_0_7) - msm6242_w(space, offset, data); -} -#endif - - -DEFINE_LEGACY_DEVICE(MSM6242, msm6242); diff -Nru mame-0.144/src/emu/machine/msm6242.h mame-0.145/src/emu/machine/msm6242.h --- mame-0.144/src/emu/machine/msm6242.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/msm6242.h 2012-02-06 21:30:28.000000000 +0000 @@ -9,20 +9,72 @@ #pragma once -#ifndef __MSM6242_H__ -#define __MSM6242_H__ +#ifndef __MSM6242DEV_H__ +#define __MSM6242DEV_H__ -#include "devlegcy.h" +#include "emu.h" +#include "machine/devhelpr.h" -DECLARE_LEGACY_DEVICE(MSM6242, msm6242); +#define MCFG_MSM6242_ADD(_tag, _config) \ + MCFG_DEVICE_ADD(_tag, msm6242, XTAL_32_768kHz) \ + MCFG_DEVICE_CONFIG(_config) -#define MCFG_MSM6242_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, MSM6242, 0) +#define MSM6242_INTERFACE(name) \ + const msm6242_interface (name) = +// ======================> msm6242_interface -READ8_DEVICE_HANDLER( msm6242_r ); -WRITE8_DEVICE_HANDLER( msm6242_w ); +typedef struct _msm6242_interface msm6242_interface; +struct _msm6242_interface +{ + devcb_write_line m_out_int_cb; +}; +typedef struct +{ + UINT8 sec, min, hour, day, wday, month; + UINT16 year; +} rtc_regs_t; -#endif /* __MSM6242_H__ */ + +// ======================> msm6242_device + +class msm6242_device : public device_t, + public msm6242_interface +{ +public: + // construction/destruction + msm6242_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( read ); + void rtc_timer_callback(); + +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); + + static TIMER_CALLBACK( rtc_inc_callback ); + +private: + UINT8 m_reg[3]; + UINT8 m_irq_flag; + UINT8 m_irq_type; + UINT16 m_tick; + + rtc_regs_t m_rtc; + rtc_regs_t m_hold; + devcb_resolved_write_line m_out_int_func; +}; + + +// device type definition +extern const device_type msm6242; + + +#endif /* __MSM6242DEV_H__ */ diff -Nru mame-0.144/src/emu/machine/nvram.c mame-0.145/src/emu/machine/nvram.c --- mame-0.144/src/emu/machine/nvram.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/nvram.c 2012-02-06 21:30:28.000000000 +0000 @@ -95,8 +95,7 @@ void nvram_device::device_start() { // bind our handler - if (!m_custom_handler.isnull()) - m_custom_handler = nvram_init_delegate(m_custom_handler, *m_owner); + m_custom_handler.bind_relative_to(*owner()); } diff -Nru mame-0.144/src/emu/machine/nvram.h mame-0.145/src/emu/machine/nvram.h --- mame-0.144/src/emu/machine/nvram.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/nvram.h 2012-02-06 21:30:28.000000000 +0000 @@ -64,9 +64,9 @@ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_NONE); \ -#define MCFG_NVRAM_ADD_CUSTOM(_tag, _class, _method) \ +#define MCFG_NVRAM_ADD_CUSTOM_DRIVER(_tag, _class, _method) \ MCFG_DEVICE_ADD(_tag, NVRAM, 0) \ - nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ + nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, NULL, (_class *)0)); \ #define MCFG_NVRAM_REPLACE_0FILL(_tag) \ @@ -81,9 +81,9 @@ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ nvram_device::static_set_default_value(*device, nvram_device::DEFAULT_RANDOM); \ -#define MCFG_NVRAM_REPLACE_CUSTOM(_tag, _class, _method) \ +#define MCFG_NVRAM_REPLACE_CUSTOM_DRIVER(_tag, _class, _method) \ MCFG_DEVICE_REPLACE(_tag, NVRAM, 0) \ - nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, (_class *)0)); \ + nvram_device::static_set_custom_handler(*device, nvram_init_delegate(&_class::_method, #_class "::" #_method, NULL, (_class *)0)); \ @@ -95,7 +95,7 @@ // custom initialization for default state -typedef delegate nvram_init_delegate; +typedef device_delegate nvram_init_delegate; // ======================> nvram_device diff -Nru mame-0.144/src/emu/machine/pls100.c mame-0.145/src/emu/machine/pls100.c --- mame-0.144/src/emu/machine/pls100.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/pls100.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,136 @@ +/********************************************************************** + + PLS100 16xPAL_TERMSx8 Programmable Logic Array emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "emu.h" +#include "pls100.h" + + + +//************************************************************************** +// DEVICE TYPE DEFINITION +//************************************************************************** + +const device_type PLS100 = &device_creator; + + + +//************************************************************************** +// INLINE HELPERS +//************************************************************************** + +//------------------------------------------------- +// parse_fusemap - +//------------------------------------------------- + +inline void pls100_device::parse_fusemap() +{ + jed_data jed; + jedbin_parse(machine().region(tag())->base(), machine().region(tag())->bytes(), &jed); + UINT32 fusenum = 0; + m_xor = 0; + + for (int term = 0; term < PAL_TERMS; term++) + { + m_and_comp[term] = 0; + m_and_true[term] = 0; + m_or[term] = 0; + + for (int i = 0; i < PAL_INPUTS; i++) + { + m_and_comp[term] |= jed_get_fuse(&jed, fusenum++) << i; + m_and_true[term] |= jed_get_fuse(&jed, fusenum++) << i; + } + + for (int f = 0; f < PAL_OUTPUTS; f++) + { + m_or[term] |= !jed_get_fuse(&jed, fusenum++) << f; + } + } + + for (int f = 0; f < PAL_OUTPUTS; f++) + { + m_xor |= jed_get_fuse(&jed, fusenum++) << f; + } +} + + +//------------------------------------------------- +// get_product - +//------------------------------------------------- + +inline int pls100_device::get_product(int term) +{ + UINT16 input_true = m_and_true[term] | m_i; + UINT16 input_comp = m_and_comp[term] | (m_i ^ 0xffff); + + return (input_true & input_comp) == 0xffff; +} + + +//------------------------------------------------- +// update_outputs - +//------------------------------------------------- + +inline void pls100_device::update_outputs() +{ + m_s = 0; + + for (int term = 0; term < PAL_TERMS; term++) + { + if (get_product(term)) + { + m_s |= m_or[term]; + } + } +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// pls100_device - constructor +//------------------------------------------------- + +pls100_device::pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PLS100, "PLS100", tag, owner, clock) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void pls100_device::device_start() +{ + // parse fusemap + assert(machine().region(tag()) != NULL); + parse_fusemap(); + + // register for state saving + save_item(NAME(m_i)); + save_item(NAME(m_s)); +} + + +//------------------------------------------------- +// read - +//------------------------------------------------- + +UINT8 pls100_device::read(UINT16 input) +{ + m_i = input; + + update_outputs(); + + return m_s ^ m_xor; +} diff -Nru mame-0.144/src/emu/machine/pls100.h mame-0.145/src/emu/machine/pls100.h --- mame-0.144/src/emu/machine/pls100.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/pls100.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,94 @@ +/********************************************************************** + + PLS100 16x48x8 Programmable Logic Array emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +********************************************************************** + _____ _____ + FE 1 |* \_/ | 28 Vcc + I7 2 | | 27 I8 + I6 3 | | 26 I9 + I5 4 | | 25 I10 + I4 5 | | 24 I11 + I3 6 | 82S100 | 23 I12 + I2 7 | 82S101 | 22 I13 + I1 8 | PLS100 | 21 I14 + I0 9 | PLS101 | 20 I15 + F7 10 | | 19 _CE + F6 11 | | 18 F0 + F5 12 | | 17 F1 + F4 13 | | PAL_OUTPUTS F2 + GND 14 |_____________| 15 F3 + +**********************************************************************/ + + +#pragma once + +#ifndef __PLS100__ +#define __PLS100__ + +#include "emu.h" +#include "jedparse.h" + + + +//************************************************************************** +// MACROS / CONSTANTS +//************************************************************************** + +#define PAL_INPUTS 16 +#define PAL_OUTPUTS 8 +#define PAL_TERMS 48 + + + +///************************************************************************* +// INTERFACE CONFIGURATION MACROS +///************************************************************************* + +#define MCFG_PLS100_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, PLS100, 0) + + + +///************************************************************************* +// TYPE DEFINITIONS +///************************************************************************* + +// ======================> pls100_device + +class pls100_device : public device_t +{ +public: + // construction/destruction + pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + UINT8 read(UINT16 input); + +protected: + // device-level overrides + virtual void device_start(); + +private: + inline void parse_fusemap(); + inline int get_product(int term); + inline void update_outputs(); + + UINT16 m_i; + UINT8 m_s; + UINT16 m_and_true[PAL_TERMS]; + UINT16 m_and_comp[PAL_TERMS]; + UINT16 m_or[PAL_TERMS]; + UINT8 m_xor; +}; + + +// device type definition +extern const device_type PLS100; + + + +#endif diff -Nru mame-0.144/src/emu/machine/ram.c mame-0.145/src/emu/machine/ram.c --- mame-0.144/src/emu/machine/ram.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/ram.c 2012-02-06 21:30:28.000000000 +0000 @@ -14,157 +14,104 @@ #include "ram.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -#define RAM_STRING_BUFLEN 16 -#define MAX_RAM_OPTIONS 16 - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef struct _ram_state ram_state; -struct _ram_state -{ - UINT32 size; /* total amount of ram configured */ - UINT8 *ram; /* pointer to the start of ram */ -}; - - /***************************************************************************** - INLINE FUNCTIONS + LIVE DEVICE *****************************************************************************/ -INLINE ram_state *get_safe_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == RAM); - - return (ram_state *)downcast(device)->token(); -} +// device type definition +const device_type RAM = &device_creator; -/***************************************************************************** - HELPER FUNCTIONS -*****************************************************************************/ -/*------------------------------------------------- - ram_parse_string - convert a ram string to an - integer value --------------------------------------------------*/ +//------------------------------------------------- +// ram_device - constructor +//------------------------------------------------- -UINT32 ram_parse_string(const char *s) +ram_device::ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RAM, "RAM", tag, owner, clock) { - UINT32 ram; - char suffix = '\0'; - - s += sscanf(s, "%u%c", &ram, &suffix); + m_size = 0; + m_pointer = NULL; + m_default_size = NULL; + m_extra_options = NULL; + m_default_value = 0xCD; +} - switch(tolower(suffix)) - { - case 'k': - /* kilobytes */ - ram *= 1024; - break; - - case 'm': - /* megabytes */ - ram *= 1024*1024; - break; - - case '\0': - /* no suffix */ - break; - - default: - /* parse failure */ - ram = 0; - break; - } - return ram; -} -/***************************************************************************** - DEVICE INTERFACE -*****************************************************************************/ +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- -static DEVICE_START( ram ) +void ram_device::device_start() { - ram_state *ram = get_safe_token(device); - ram_config *config = (ram_config *)downcast(device)->inline_config(); - /* the device named 'ram' can get ram options from command line */ - if (strcmp(device->tag(), RAM_TAG) == 0) + m_size = 0; + if (strcmp(tag(), ":" RAM_TAG) == 0) { - const char *ramsize_string = device->machine().options().ram_size(); - + const char *ramsize_string = machine().options().ram_size(); if ((ramsize_string != NULL) && (ramsize_string[0] != '\0')) - ram->size = ram_parse_string(ramsize_string); + m_size = parse_string(ramsize_string); } /* if we didn't get a size yet, use the default */ - if (ram->size == 0) - ram->size = ram_parse_string(config->default_size); + if (m_size == 0) + m_size = default_size(); /* allocate space for the ram */ - ram->ram = auto_alloc_array(device->machine(), UINT8, ram->size); + m_pointer = auto_alloc_array(machine(), UINT8, m_size); /* reset ram to the default value */ - memset(ram->ram, config->default_value, ram->size); + memset(m_pointer, m_default_value, m_size); /* register for state saving */ - device->save_item(NAME(ram->size)); - device->save_pointer(NAME(ram->ram), ram->size); + save_item(NAME(m_size)); + save_pointer(NAME(m_pointer), m_size); } -static DEVICE_VALIDITY_CHECK( ram ) + +//------------------------------------------------- +// device_validity_check - device-specific validity +// checks +//------------------------------------------------- + +void ram_device::device_validity_check(validity_checker &valid) const { - ram_config *config = (ram_config *)downcast(device)->inline_config(); const char *ramsize_string = NULL; int is_valid = FALSE; UINT32 specified_ram = 0; - int error = FALSE; const char *gamename_option = NULL; /* verify default ram value */ - if (config!=NULL && ram_parse_string(config->default_size) == 0) - { - mame_printf_error("%s: '%s' has an invalid default RAM option: %s\n", driver->source_file, driver->name, config->default_size); - error = TRUE; - } + if (default_size() == 0) + mame_printf_error("Invalid default RAM option: %s\n", m_default_size); /* command line options are only parsed for the device named RAM_TAG */ - if (device->tag()!=NULL && strcmp(device->tag(), RAM_TAG) == 0) + if (tag() != NULL && strcmp(tag(), RAM_TAG) == 0) { /* verify command line ram option */ - ramsize_string = options.ram_size(); - gamename_option = options.system_name(); + ramsize_string = mconfig().options().ram_size(); + gamename_option = mconfig().options().system_name(); if ((ramsize_string != NULL) && (ramsize_string[0] != '\0')) { - specified_ram = ram_parse_string(ramsize_string); + specified_ram = parse_string(ramsize_string); if (specified_ram == 0) - { - mame_printf_error("%s: '%s' cannot recognize the RAM option %s\n", driver->source_file, driver->name, ramsize_string); - error = TRUE; - } - if (gamename_option != NULL && *gamename_option != 0 && strcmp(gamename_option, driver->name) == 0) + mame_printf_error("Cannot recognize the RAM option %s\n", ramsize_string); + + if (gamename_option != NULL && *gamename_option != 0 && strcmp(gamename_option, mconfig().gamedrv().name) == 0) { /* compare command line option to default value */ - if (ram_parse_string(config->default_size) == specified_ram) + if (default_size() == specified_ram) is_valid = TRUE; /* verify extra ram options */ - if (config->extra_options != NULL) + if (m_extra_options != NULL) { int j; - int size = strlen(config->extra_options); - char * const s = mame_strdup(config->extra_options); + int size = strlen(m_extra_options); + char * const s = mame_strdup(m_extra_options); char * const e = s + size; char *p = s; for (j=0;jsource_file, driver->name, p); - error = TRUE; - } + mame_printf_error("Invalid RAM option: %s\n", p); if (option_ram_size == specified_ram) is_valid = TRUE; @@ -210,59 +154,65 @@ if (!is_valid) { - mame_printf_error("%s: '%s' cannot recognize the RAM option %s", driver->source_file, driver->name, ramsize_string); - mame_printf_error(" (valid options are %s", config->default_size); + astring output; + output.catprintf("Cannot recognize the RAM option %s", ramsize_string); + output.catprintf(" (valid options are %s", m_default_size); - if (config->extra_options != NULL) - mame_printf_error(",%s).\n", config->extra_options); + if (m_extra_options != NULL) + output.catprintf(",%s).\n", m_extra_options); else - mame_printf_error(").\n"); + output.catprintf(").\n"); - error = TRUE; + mame_printf_error("%s", output.cstr()); } +} - return error; -} +//------------------------------------------------- +// parse_string - convert a ram string to an +// integer value +//------------------------------------------------- -DEVICE_GET_INFO( ram ) +UINT32 ram_device::parse_string(const char *s) { - switch (state) + UINT32 ram; + char suffix = '\0'; + + s += sscanf(s, "%u%c", &ram, &suffix); + + switch(tolower(suffix)) { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(ram_state); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(ram_config); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(ram); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_RESET: /* Nothing */ break; - case DEVINFO_FCT_VALIDITY_CHECK: info->p = (void*)DEVICE_VALIDITY_CHECK_NAME(ram); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "RAM"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "RAM"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.00"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright MESS Team"); break; + case 'k': + /* kilobytes */ + ram *= 1024; + break; + + case 'm': + /* megabytes */ + ram *= 1024*1024; + break; + + case '\0': + /* no suffix */ + break; + + default: + /* parse failure */ + ram = 0; + break; } + + return ram; } -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ -UINT32 ram_get_size(device_t *device) -{ - ram_state *ram = get_safe_token(device); - return ram->size; -} -UINT8 *ram_get_ptr(device_t *device) +//------------------------------------------------- +// default_size +//------------------------------------------------- + +UINT32 ram_device::default_size(void) const { - ram_state *ram = get_safe_token(device); - return ram->ram; + return parse_string(m_default_size); } - -DEFINE_LEGACY_DEVICE(RAM, ram); diff -Nru mame-0.144/src/emu/machine/ram.h mame-0.145/src/emu/machine/ram.h --- mame-0.144/src/emu/machine/ram.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/ram.h 2012-02-06 21:30:28.000000000 +0000 @@ -14,55 +14,75 @@ CONSTANTS ***************************************************************************/ -#define RAM_DEFAULT_VALUE 0xcd #define RAM_TAG "ram" -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef struct _ram_config ram_config; -struct _ram_config -{ - const char *default_size; - const char *extra_options; - UINT8 default_value; -}; - /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ -DECLARE_LEGACY_DEVICE(RAM, ram); - #define MCFG_RAM_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, RAM, 0) \ - MCFG_DEVICE_CONFIG_DATA32(ram_config, default_value, RAM_DEFAULT_VALUE) + MCFG_DEVICE_ADD(_tag, RAM, 0) #define MCFG_RAM_REMOVE(_tag) \ MCFG_DEVICE_REMOVE(_tag) #define MCFG_RAM_MODIFY(_tag) \ MCFG_DEVICE_MODIFY(_tag) \ - MCFG_DEVICE_CONFIG_DATAPTR(ram_config, extra_options, NULL) + ram_device::static_set_extra_options(*device, NULL); #define MCFG_RAM_DEFAULT_SIZE(_default_size) \ - MCFG_DEVICE_CONFIG_DATAPTR(ram_config, default_size, _default_size) + ram_device::static_set_default_size(*device, _default_size); #define MCFG_RAM_EXTRA_OPTIONS(_extra_options) \ - MCFG_DEVICE_CONFIG_DATAPTR(ram_config, extra_options, _extra_options) + ram_device::static_set_extra_options(*device, _extra_options); #define MCFG_RAM_DEFAULT_VALUE(_default_value) \ - MCFG_DEVICE_CONFIG_DATA32(ram_config, default_value, _default_value) + ram_device::static_set_default_value(*device, _default_value); /*************************************************************************** - FUNCTION PROTOTYPES + TYPE DEFINITIONS ***************************************************************************/ -UINT32 ram_get_size(device_t *device); -UINT8 *ram_get_ptr(device_t *device); -UINT32 ram_parse_string(const char *s); +class ram_device : public device_t +{ +public: + // construction/destruction + ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // accessors + UINT32 size(void) const { return m_size; } + UINT8 *pointer(void) const { return m_pointer; } + static UINT32 parse_string(const char *s); + UINT32 default_size(void) const; + const char *extra_options(void) const { return m_extra_options; } + + // inline configuration helpers + static void static_set_default_size(device_t &device, const char *default_size) { downcast(device).m_default_size = default_size; } + static void static_set_extra_options(device_t &device, const char *extra_options) { downcast(device).m_extra_options = extra_options; } + static void static_set_default_value(device_t &device, UINT8 default_value) { downcast(device).m_default_value = default_value; } + +protected: + virtual void device_start(void); + virtual void device_validity_check(validity_checker &valid) const; + +private: + // device state + UINT32 m_size; + UINT8 *m_pointer; + + // device config + const char *m_default_size; + const char *m_extra_options; + UINT8 m_default_value; +}; + + +// device type definition +extern const device_type RAM; + +// device iterator +typedef device_type_iterator<&device_creator, ram_device> ram_device_iterator; #endif /* __RAM_H__ */ diff -Nru mame-0.144/src/emu/machine/rtc65271.c mame-0.145/src/emu/machine/rtc65271.c --- mame-0.144/src/emu/machine/rtc65271.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/rtc65271.c 2012-02-06 21:30:28.000000000 +0000 @@ -18,11 +18,6 @@ #include "emu.h" #include "rtc65271.h" -static void field_interrupts(device_t *device); -static TIMER_CALLBACK( rtc_SQW_callback ); -static TIMER_CALLBACK( rtc_begin_update_callback ); -static TIMER_CALLBACK( rtc_end_update_callback ); - /* Delay between the beginning (UIP asserted) and the end (UIP cleared and update interrupt asserted) of the update cycle */ #define UPDATE_CYCLE_TIME attotime::from_usec(1984) @@ -30,38 +25,6 @@ cycle */ /*#define UPDATE_CYCLE_DELAY attotime::from_usec(244)*/ -typedef struct _rtc65271_state rtc65271_state; -struct _rtc65271_state -{ - /* 64 8-bit registers (10 clock registers, 4 control/status registers, and - 50 bytes of user RAM) */ - UINT8 regs[64]; - UINT8 cur_reg; - - /* extended RAM: 4kbytes of battery-backed RAM (in pages of 32 bytes) */ - UINT8 xram[4096]; - UINT8 cur_xram_page; - - /* update timer: called every second */ - emu_timer *update_timer; - - /* SQW timer: called every periodic clock half-period */ - emu_timer *SQW_timer; - UINT8 SQW_internal_state; - - /* callback called when interrupt pin state changes (may be NULL) */ - void (*interrupt_callback)(device_t *device, int state); -}; - -INLINE rtc65271_state *get_safe_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == RTC65271); - - return (rtc65271_state *)downcast(device)->token(); -} - - enum { reg_second = 0, @@ -189,130 +152,137 @@ Public functions */ +//------------------------------------------------- +// nvram_default - called to initialize NVRAM to +// its default state +//------------------------------------------------- -/* - load the SRAM and register contents from file -*/ -static int rtc65271_file_load(device_t *device, emu_file &file) +void rtc65271_device::nvram_default() { - rtc65271_state *state = get_safe_token(device); - UINT8 buf; + memset(m_regs,0, sizeof(m_regs)); + memset(m_xram,0, sizeof(m_xram)); +} + +//------------------------------------------------- +// nvram_read - called to read NVRAM from the +// .nv file +//------------------------------------------------- +void rtc65271_device::nvram_read(emu_file &file) +{ + UINT8 buf; /* version flag */ if (file.read(&buf, 1) != 1) - return 1; + return; if (buf != 0) - return 1; + return; /* control registers */ if (file.read(&buf, 1) != 1) - return 1; - state->regs[reg_A] = buf & (reg_A_DV /*| reg_A_RS*/); + return; + m_regs[reg_A] = buf & (reg_A_DV /*| reg_A_RS*/); if (file.read(&buf, 1) != 1) - return 1; - state->regs[reg_B] = buf & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); + return; + m_regs[reg_B] = buf & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); /* alarm registers */ - if (file.read(&state->regs[reg_alarm_second], 1) != 1) - return 1; - if (file.read(&state->regs[reg_alarm_minute], 1) != 1) - return 1; - if (file.read(&state->regs[reg_alarm_hour], 1) != 1) - return 1; + if (file.read(&m_regs[reg_alarm_second], 1) != 1) + return; + if (file.read(&m_regs[reg_alarm_minute], 1) != 1) + return; + if (file.read(&m_regs[reg_alarm_hour], 1) != 1) + return; /* user RAM */ - if (file.read(state->regs+14, 50) != 50) - return 1; + if (file.read(m_regs+14, 50) != 50) + return; /* extended RAM */ - if (file.read(state->xram, 4096) != 4096) - return 1; + if (file.read(m_xram, 4096) != 4096) + return; - state->regs[reg_D] |= reg_D_VRT; /* the data was backed up successfully */ - /*state->dirty = FALSE;*/ + m_regs[reg_D] |= reg_D_VRT; /* the data was backed up successfully */ + /*m_dirty = FALSE;*/ { system_time systime; /* get the current date/time from the core */ - device->machine().current_datetime(systime); + machine().current_datetime(systime); /* set clock registers */ - state->regs[reg_second] = systime.local_time.second; - state->regs[reg_minute] = systime.local_time.minute; - if (state->regs[reg_B] & reg_B_24h) + m_regs[reg_second] = systime.local_time.second; + m_regs[reg_minute] = systime.local_time.minute; + if (m_regs[reg_B] & reg_B_24h) /* 24-hour mode */ - state->regs[reg_hour] = systime.local_time.hour; + m_regs[reg_hour] = systime.local_time.hour; else { /* 12-hour mode */ if (systime.local_time.hour >= 12) { - state->regs[reg_hour] = 0x80; + m_regs[reg_hour] = 0x80; systime.local_time.hour -= 12; } else - state->regs[reg_hour] = 0; - state->regs[reg_hour] |= systime.local_time.hour ? systime.local_time.hour : 12; + m_regs[reg_hour] = 0; + m_regs[reg_hour] |= systime.local_time.hour ? systime.local_time.hour : 12; } - state->regs[reg_weekday] = systime.local_time.weekday + 1; - state->regs[reg_monthday] = systime.local_time.mday; - state->regs[reg_month] = systime.local_time.month + 1; - state->regs[reg_year] = systime.local_time.year % 100; - if (! (state->regs[reg_B] & reg_B_DM)) + m_regs[reg_weekday] = systime.local_time.weekday + 1; + m_regs[reg_monthday] = systime.local_time.mday; + m_regs[reg_month] = systime.local_time.month + 1; + m_regs[reg_year] = systime.local_time.year % 100; + if (! (m_regs[reg_B] & reg_B_DM)) { /* BCD mode */ - state->regs[reg_second] = binary_to_BCD(state->regs[reg_second]); - state->regs[reg_minute] = binary_to_BCD(state->regs[reg_minute]); - state->regs[reg_hour] = (state->regs[reg_hour] & 0x80) | binary_to_BCD(state->regs[reg_hour] & 0x7f); - /*state->regs[reg_weekday] = binary_to_BCD(state->regs[reg_weekday]);*/ - state->regs[reg_monthday] = binary_to_BCD(state->regs[reg_monthday]); - state->regs[reg_month] = binary_to_BCD(state->regs[reg_month]); - state->regs[reg_year] = binary_to_BCD(state->regs[reg_year]); + m_regs[reg_second] = binary_to_BCD(m_regs[reg_second]); + m_regs[reg_minute] = binary_to_BCD(m_regs[reg_minute]); + m_regs[reg_hour] = (m_regs[reg_hour] & 0x80) | binary_to_BCD(m_regs[reg_hour] & 0x7f); + /*m_regs[reg_weekday] = binary_to_BCD(m_regs[reg_weekday]);*/ + m_regs[reg_monthday] = binary_to_BCD(m_regs[reg_monthday]); + m_regs[reg_month] = binary_to_BCD(m_regs[reg_month]); + m_regs[reg_year] = binary_to_BCD(m_regs[reg_year]); } } - - return 0; } -/* - save the SRAM and register contents to file -*/ -static int rtc65271_file_save(device_t *device, emu_file &file) +//------------------------------------------------- +// nvram_write - called to write NVRAM to the +// .nv file +//------------------------------------------------- + +void rtc65271_device::nvram_write(emu_file &file) { - rtc65271_state *state = get_safe_token(device); UINT8 buf; /* version flag */ buf = 0; if (file.write(& buf, 1) != 1) - return 1; + return; /* control registers */ - buf = state->regs[reg_A] & (reg_A_DV | reg_A_RS); + buf = m_regs[reg_A] & (reg_A_DV | reg_A_RS); if (file.write(&buf, 1) != 1) - return 1; - buf = state->regs[reg_B] & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); + return; + buf = m_regs[reg_B] & (reg_B_SET | reg_B_DM | reg_B_24h | reg_B_DSE); if (file.write(&buf, 1) != 1) - return 1; + return; /* alarm registers */ - if (file.write(&state->regs[reg_alarm_second], 1) != 1) - return 1; - if (file.write(&state->regs[reg_alarm_minute], 1) != 1) - return 1; - if (file.write(&state->regs[reg_alarm_hour], 1) != 1) - return 1; + if (file.write(&m_regs[reg_alarm_second], 1) != 1) + return; + if (file.write(&m_regs[reg_alarm_minute], 1) != 1) + return; + if (file.write(&m_regs[reg_alarm_hour], 1) != 1) + return; /* user RAM */ - if (file.write(state->regs+14, 50) != 50) - return 1; + if (file.write(m_regs+14, 50) != 50) + return; /* extended RAM */ - if (file.write(state->xram, 4096) != 4096) - return 1; - - return 0; + if (file.write(m_xram, 4096) != 4096) + return; } /* @@ -321,56 +291,55 @@ xramsel: select RTC register if 0, XRAM if 1 offset: address (A0-A5 pins) */ -UINT8 rtc65271_r(device_t *device, int xramsel, offs_t offset) +UINT8 rtc65271_device::read(int xramsel, offs_t offset) { - rtc65271_state *state = get_safe_token(device); int reply; if (xramsel) { if (offset & 0x20) /* XRAM page register */ - reply = state->cur_xram_page; + reply = m_cur_xram_page; else /* XRAM data */ - reply = state->xram[(offset & 0x1f) + 0x0020*state->cur_xram_page]; + reply = m_xram[(offset & 0x1f) + 0x0020*m_cur_xram_page]; } else { if (offset & 0x01) /* data register */ - switch (state->cur_reg) + switch (m_cur_reg) { case reg_C: - reply = state->regs[state->cur_reg]; - state->regs[state->cur_reg] = 0; - field_interrupts(device); + reply = m_regs[m_cur_reg]; + m_regs[m_cur_reg] = 0; + field_interrupts(); break; case reg_D: - reply = state->regs[state->cur_reg]; - state->regs[state->cur_reg] = /*0*/reg_D_VRT; /* set VRT flag so that the computer does not complain that the battery is low */ + reply = m_regs[m_cur_reg]; + m_regs[m_cur_reg] = /*0*/reg_D_VRT; /* set VRT flag so that the computer does not complain that the battery is low */ break; default: - reply = state->regs[state->cur_reg]; + reply = m_regs[m_cur_reg]; break; } else /* indirect address register */ - reply = state->cur_reg; + reply = m_cur_reg; } return reply; } -READ8_DEVICE_HANDLER( rtc65271_rtc_r ) +READ8_MEMBER( rtc65271_device::rtc_r ) { - return rtc65271_r( device, 0, offset ); + return read(0, offset ); } -READ8_DEVICE_HANDLER( rtc65271_xram_r ) +READ8_MEMBER( rtc65271_device::xram_r ) { - return rtc65271_r( device, 1, offset ); + return read(1, offset ); } /* @@ -379,64 +348,63 @@ xramsel: select RTC register if 0, XRAM if 1 offset: address (A0-A5 pins) */ -void rtc65271_w(device_t *device, int xramsel, offs_t offset, UINT8 data) +void rtc65271_device::write(int xramsel, offs_t offset, UINT8 data) { - rtc65271_state *state = get_safe_token(device); if (xramsel) { if (offset & 0x20) /* XRAM page register */ - state->cur_xram_page = data & 0x7f; + m_cur_xram_page = data & 0x7f; else /* XRAM data */ - state->xram[(offset & 0x1f) + 0x0020*state->cur_xram_page] = data; + m_xram[(offset & 0x1f) + 0x0020*m_cur_xram_page] = data; } else { if (offset & 0x01) /* data register */ - switch (state->cur_reg) + switch (m_cur_reg) { case reg_second: /* the data sheet says bit 7 is read-only. (I have no idea of the reason why it is.) */ - state->regs[reg_second] = data & 0x7f; + m_regs[reg_second] = data & 0x7f; break; case reg_A: - if ((data & reg_A_RS) != (state->regs[state->cur_reg] & reg_A_RS)) + if ((data & reg_A_RS) != (m_regs[m_cur_reg] & reg_A_RS)) { if (data & reg_A_RS) { attotime period = attotime::from_hz(SQW_freq_table[data & reg_A_RS]); attotime half_period = period / 2; - attotime elapsed = state->update_timer->elapsed(); + attotime elapsed = m_update_timer->elapsed(); if (half_period > elapsed) - state->SQW_timer->adjust(half_period - elapsed); + m_SQW_timer->adjust(half_period - elapsed); else - state->SQW_timer->adjust(half_period); + m_SQW_timer->adjust(half_period); } else { - state->SQW_internal_state = 0; /* right??? */ + m_SQW_internal_state = 0; /* right??? */ /* Stop the divider used for SQW and periodic interrupts. */ - state->SQW_timer->adjust(attotime::never); + m_SQW_timer->adjust(attotime::never); } } /* The UIP bit is read-only */ - state->regs[reg_A] = (data & ~reg_A_UIP) | (state->regs[reg_A] & reg_A_UIP); + m_regs[reg_A] = (data & ~reg_A_UIP) | (m_regs[reg_A] & reg_A_UIP); break; case reg_B: - state->regs[state->cur_reg] = data; + m_regs[m_cur_reg] = data; if (data & reg_B_SET) { /* if we are in SET mode, clear update cycle */ - state->regs[reg_A] &= ~reg_A_UIP; - state->regs[reg_B] &= ~reg_B_UIE; /* the data sheet tells this, but I wonder how much sense it makes */ - field_interrupts(device); + m_regs[reg_A] &= ~reg_A_UIP; + m_regs[reg_B] &= ~reg_B_UIE; /* the data sheet tells this, but I wonder how much sense it makes */ + field_interrupts(); } break; @@ -445,40 +413,38 @@ break; default: - state->regs[state->cur_reg] = data; + m_regs[m_cur_reg] = data; break; } else /* indirect address register */ - state->cur_reg = data & 0x3f; + m_cur_reg = data & 0x3f; } } -WRITE8_DEVICE_HANDLER( rtc65271_rtc_w ) +WRITE8_MEMBER( rtc65271_device::rtc_w ) { - rtc65271_w( device, 0, offset, data ); + write(0, offset, data ); } -WRITE8_DEVICE_HANDLER( rtc65271_xram_w ) +WRITE8_MEMBER( rtc65271_device::xram_w ) { - rtc65271_w( device, 1, offset, data ); + write(1, offset, data ); } -static void field_interrupts(device_t *device) +void rtc65271_device::field_interrupts() { - rtc65271_state *state = get_safe_token(device); - - if (state->regs[reg_C] & state->regs[reg_B] & (reg_C_PF | reg_C_AF | reg_C_UF)) + if (m_regs[reg_C] & m_regs[reg_B] & (reg_C_PF | reg_C_AF | reg_C_UF)) { - state->regs[reg_C] |= reg_C_IRQF; - if (state->interrupt_callback) - state->interrupt_callback(device, 1); + m_regs[reg_C] |= reg_C_IRQF; + if (!m_interrupt_func.isnull()) + m_interrupt_func(1); } else { - state->regs[reg_C] &= ~reg_C_IRQF; - if (state->interrupt_callback) - state->interrupt_callback(device, 0); + m_regs[reg_C] &= ~reg_C_IRQF; + if (!m_interrupt_func.isnull()) + m_interrupt_func(0); } } @@ -486,43 +452,54 @@ /* Timer handlers */ +TIMER_CALLBACK( rtc65271_device::rtc_SQW_callback ) +{ + rtc65271_device *rtc = reinterpret_cast(ptr); + rtc->rtc_SQW_cb(); +} + +TIMER_CALLBACK( rtc65271_device::rtc_begin_update_callback ) +{ + rtc65271_device *rtc = reinterpret_cast(ptr); + rtc->rtc_begin_update_cb(); +} +TIMER_CALLBACK( rtc65271_device::rtc_end_update_callback ) +{ + rtc65271_device *rtc = reinterpret_cast(ptr); + rtc->rtc_end_update_cb(); +} /* Update SQW output state each half-period and assert periodic interrupt each period. */ -static TIMER_CALLBACK( rtc_SQW_callback ) +void rtc65271_device::rtc_SQW_cb() { - device_t *device = (device_t *)ptr; - rtc65271_state *state = get_safe_token(device); attotime half_period; - state->SQW_internal_state = ! state->SQW_internal_state; - if (! state->SQW_internal_state) + m_SQW_internal_state = ! m_SQW_internal_state; + if (! m_SQW_internal_state) { /* high-to-low??? transition -> interrupt (or should it be low-to-high?) */ - state->regs[reg_C] |= reg_C_PF; - field_interrupts(device); + m_regs[reg_C] |= reg_C_PF; + field_interrupts(); } - half_period = attotime::from_hz(SQW_freq_table[state->regs[reg_A] & reg_A_RS]) / 2; - state->SQW_timer->adjust(half_period); + half_period = attotime::from_hz(SQW_freq_table[m_regs[reg_A] & reg_A_RS]) / 2; + m_SQW_timer->adjust(half_period); } /* Begin update cycle (called every second) */ -static TIMER_CALLBACK( rtc_begin_update_callback ) +void rtc65271_device::rtc_begin_update_cb() { - device_t *device = (device_t *)ptr; - rtc65271_state *state = get_safe_token(device); - - if (((state->regs[reg_A] & reg_A_DV) == 0x20) && ! (state->regs[reg_B] & reg_B_SET)) + if (((m_regs[reg_A] & reg_A_DV) == 0x20) && ! (m_regs[reg_B] & reg_B_SET)) { - state->regs[reg_A] |= reg_A_UIP; + m_regs[reg_A] |= reg_A_UIP; /* schedule end of update cycle */ - device->machine().scheduler().timer_set(UPDATE_CYCLE_TIME, FUNC(rtc_end_update_callback), 0, (void *)device); + machine().scheduler().timer_set(UPDATE_CYCLE_TIME, FUNC(rtc_end_update_callback), 0, (void *)this); } } @@ -530,23 +507,21 @@ End update cycle (called UPDATE_CYCLE_TIME = 1948us after start of update cycle) */ -static TIMER_CALLBACK( rtc_end_update_callback ) +void rtc65271_device::rtc_end_update_cb() { static const int days_in_month_table[12] = { 31,28,31, 30,31,30, 31,31,30, 31,30,31 }; - device_t *device = (device_t *)ptr; - rtc65271_state *state = get_safe_token(device); UINT8 (*increment)(UINT8 data); int c59, c23, c12, c11, c29; - if (! (state->regs[reg_A] & reg_A_UIP)) + if (! (m_regs[reg_A] & reg_A_UIP)) /* abort if update cycle has been canceled */ return; - if (state->regs[reg_B] & reg_B_DM) + if (m_regs[reg_B] & reg_B_DM) { /* binary mode */ increment = increment_binary; @@ -568,95 +543,95 @@ } /* increment second */ - if (state->regs[reg_second] < c59) - state->regs[reg_second] = (*increment)(state->regs[reg_second]); + if (m_regs[reg_second] < c59) + m_regs[reg_second] = (*increment)(m_regs[reg_second]); else { - state->regs[reg_second] = 0; + m_regs[reg_second] = 0; /* increment minute */ - if (state->regs[reg_minute] < c59) - state->regs[reg_minute] = (*increment)(state->regs[reg_minute]); + if (m_regs[reg_minute] < c59) + m_regs[reg_minute] = (*increment)(m_regs[reg_minute]); else { - state->regs[reg_minute] = 0; + m_regs[reg_minute] = 0; /* increment hour */ - if (state->regs[reg_B] & reg_B_24h) + if (m_regs[reg_B] & reg_B_24h) { /* 24 hour mode */ - if (state->regs[reg_hour] < c23) - state->regs[reg_hour] = (*increment)(state->regs[reg_hour]); + if (m_regs[reg_hour] < c23) + m_regs[reg_hour] = (*increment)(m_regs[reg_hour]); else - state->regs[reg_hour] = 0; + m_regs[reg_hour] = 0; } else { /* 12 hour mode */ - if (state->regs[reg_hour] < c12) + if (m_regs[reg_hour] < c12) { - if ((state->regs[reg_hour] & 0x7f) == c11) - state->regs[reg_hour] ^= 0x80; - state->regs[reg_hour] = ((*increment)(state->regs[reg_hour] & 0x7f) & 0x7f) - | (state->regs[reg_hour] & 0x80); + if ((m_regs[reg_hour] & 0x7f) == c11) + m_regs[reg_hour] ^= 0x80; + m_regs[reg_hour] = ((*increment)(m_regs[reg_hour] & 0x7f) & 0x7f) + | (m_regs[reg_hour] & 0x80); } else - state->regs[reg_hour] = 1 | (state->regs[reg_hour] & 0x80); + m_regs[reg_hour] = 1 | (m_regs[reg_hour] & 0x80); } /* increment day if needed */ - if (state->regs[reg_hour] == ((state->regs[reg_B] & reg_B_24h) ? 0 : c12)) + if (m_regs[reg_hour] == ((m_regs[reg_B] & reg_B_24h) ? 0 : c12)) { /* increment day */ int days_in_month; - if (state->regs[reg_weekday] < 7) - state->regs[reg_weekday]++; + if (m_regs[reg_weekday] < 7) + m_regs[reg_weekday]++; else - state->regs[reg_weekday] = 1; + m_regs[reg_weekday] = 1; - if ((state->regs[reg_month] != 2) || (state->regs[reg_year] & 0x03)) + if ((m_regs[reg_month] != 2) || (m_regs[reg_year] & 0x03)) { - if (state->regs[reg_B] & reg_B_DM) + if (m_regs[reg_B] & reg_B_DM) { /* binary mode */ - days_in_month = days_in_month_table[state->regs[reg_month] - 1]; + days_in_month = days_in_month_table[m_regs[reg_month] - 1]; } else { /* BCD mode */ - days_in_month = binary_to_BCD(days_in_month_table[BCD_to_binary(state->regs[reg_month]) - 1]); + days_in_month = binary_to_BCD(days_in_month_table[BCD_to_binary(m_regs[reg_month]) - 1]); } } else days_in_month = c29; - if (state->regs[reg_monthday] < days_in_month) - state->regs[reg_monthday] = (*increment)(state->regs[reg_monthday]); + if (m_regs[reg_monthday] < days_in_month) + m_regs[reg_monthday] = (*increment)(m_regs[reg_monthday]); else { /* increment month */ - state->regs[reg_monthday] = 1; + m_regs[reg_monthday] = 1; - if (state->regs[reg_month] < c12) - state->regs[reg_month] = (*increment)(state->regs[reg_month]); + if (m_regs[reg_month] < c12) + m_regs[reg_month] = (*increment)(m_regs[reg_month]); else { /* increment year */ - state->regs[reg_month] = 1; + m_regs[reg_month] = 1; - if (state->regs[reg_B] & reg_B_DM) + if (m_regs[reg_B] & reg_B_DM) { /* binary mode */ - if (state->regs[reg_year] < 99) - state->regs[reg_year]++; + if (m_regs[reg_year] < 99) + m_regs[reg_year]++; else - state->regs[reg_year] = 0; + m_regs[reg_year] = 0; } else { /* BCD mode */ - state->regs[reg_year] = increment_BCD(state->regs[reg_year]); + m_regs[reg_year] = increment_BCD(m_regs[reg_year]); } } } @@ -664,59 +639,65 @@ } } - state->regs[reg_A] &= ~reg_A_UIP; - state->regs[reg_C] |= reg_C_UF; + m_regs[reg_A] &= ~reg_A_UIP; + m_regs[reg_C] |= reg_C_UF; /* test for alarm (values in range 0xc0-0xff mean "don't care") */ - if ((((state->regs[reg_alarm_second] & 0xc0) == 0xc0) || (state->regs[reg_alarm_second] == state->regs[reg_second])) - && (((state->regs[reg_alarm_minute] & 0xc0) == 0xc0) || (state->regs[reg_alarm_minute] == state->regs[reg_minute])) - && (((state->regs[reg_alarm_hour] & 0xc0) == 0xc0) || (state->regs[reg_alarm_hour] == state->regs[reg_hour]))) - state->regs[reg_C] |= reg_C_AF; + if ((((m_regs[reg_alarm_second] & 0xc0) == 0xc0) || (m_regs[reg_alarm_second] == m_regs[reg_second])) + && (((m_regs[reg_alarm_minute] & 0xc0) == 0xc0) || (m_regs[reg_alarm_minute] == m_regs[reg_minute])) + && (((m_regs[reg_alarm_hour] & 0xc0) == 0xc0) || (m_regs[reg_alarm_hour] == m_regs[reg_hour]))) + m_regs[reg_C] |= reg_C_AF; - field_interrupts(device); + field_interrupts(); } -/* - Initialize clock +// device type definition +const device_type RTC65271 = &device_creator; - interrupt_callback: callback called when interrupt pin state changes (may - be NULL) -*/ +//------------------------------------------------- +// rtc65271_device - constructor +//------------------------------------------------- -static DEVICE_START( rtc65271 ) +rtc65271_device::rtc65271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RTC65271, "RTC65271", tag, owner, clock), + device_nvram_interface(mconfig, *this) { - rtc65271_config *config = (rtc65271_config *)downcast(device)->inline_config(); - rtc65271_state *state = get_safe_token(device); - - state->update_timer = device->machine().scheduler().timer_alloc(FUNC(rtc_begin_update_callback), (void *)device); - state->update_timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1)); - state->SQW_timer = device->machine().scheduler().timer_alloc(FUNC(rtc_SQW_callback), (void *)device); - state->interrupt_callback = config->interrupt_callback; - - device->save_item(NAME(state->regs)); - device->save_item(NAME(state->cur_reg)); - device->save_item(NAME(state->xram)); - device->save_item(NAME(state->cur_xram_page)); - device->save_item(NAME(state->SQW_internal_state)); } +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- -static DEVICE_NVRAM( rtc65271 ) +void rtc65271_device::device_config_complete() { - if (read_or_write) - rtc65271_file_save(device, *file); - else if (file) - rtc65271_file_load(device, *file); -} + // inherit a copy of the static data + const rtc65271_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; + // or initialize to defaults if none provided + else + { + memset(&m_interrupt_cb, 0, sizeof(m_interrupt_cb)); + } +} -static const char DEVTEMPLATE_SOURCE[] = __FILE__; - -#define DEVTEMPLATE_ID(p,s) p##rtc65271##s -#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_NVRAM | DT_HAS_INLINE_CONFIG -#define DEVTEMPLATE_NAME "RTC65271" -#define DEVTEMPLATE_FAMILY "RTC" -#include "devtempl.h" +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- +void rtc65271_device::device_start() +{ + m_update_timer = machine().scheduler().timer_alloc(FUNC(rtc_begin_update_callback), (void *)this); + m_update_timer->adjust(attotime::from_seconds(1), 0, attotime::from_seconds(1)); + m_SQW_timer = machine().scheduler().timer_alloc(FUNC(rtc_SQW_callback), (void *)this); + m_interrupt_func.resolve(m_interrupt_cb, *this); + save_item(NAME(m_regs)); + save_item(NAME(m_cur_reg)); + save_item(NAME(m_xram)); + save_item(NAME(m_cur_xram_page)); + save_item(NAME(m_SQW_internal_state)); +} -DEFINE_LEGACY_NVRAM_DEVICE(RTC65271, rtc65271); diff -Nru mame-0.144/src/emu/machine/rtc65271.h mame-0.145/src/emu/machine/rtc65271.h --- mame-0.144/src/emu/machine/rtc65271.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/rtc65271.h 2012-02-06 21:30:28.000000000 +0000 @@ -5,29 +5,76 @@ #ifndef __RTC65271_H__ #define __RTC65271_H__ -#include "devlegcy.h" +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** -typedef struct _rtc65271_config rtc65271_config; -struct _rtc65271_config -{ - void (*interrupt_callback)(device_t *device, int state); -}; - - -#define MCFG_RTC65271_ADD(_tag, _callback) \ +#define MCFG_RTC65271_ADD(_tag, _config) \ MCFG_DEVICE_ADD(_tag, RTC65271, 0) \ - MCFG_DEVICE_CONFIG_DATAPTR(rtc65271_config, interrupt_callback, _callback) + MCFG_DEVICE_CONFIG(_config) \ +// ======================> rtc65271_interface -UINT8 rtc65271_r(device_t *device, int xramsel, offs_t offset); -void rtc65271_w(device_t *device, int xramsel, offs_t offset, UINT8 data); +struct rtc65271_interface +{ + devcb_write_line m_interrupt_cb; +}; + +// ======================> rtc65271_device -READ8_DEVICE_HANDLER( rtc65271_rtc_r ); -READ8_DEVICE_HANDLER( rtc65271_xram_r ); -WRITE8_DEVICE_HANDLER( rtc65271_rtc_w ); -WRITE8_DEVICE_HANDLER( rtc65271_xram_w ); +class rtc65271_device : public device_t, + public device_nvram_interface, + public rtc65271_interface +{ +public: + // construction/destruction + rtc65271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + // device_nvram_interface overrides + virtual void nvram_default(); + virtual void nvram_read(emu_file &file); + virtual void nvram_write(emu_file &file); +public: + DECLARE_READ8_MEMBER( rtc_r ); + DECLARE_READ8_MEMBER( xram_r ); + DECLARE_WRITE8_MEMBER( rtc_w ); + DECLARE_WRITE8_MEMBER( xram_w ); +private: + UINT8 read(int xramsel, offs_t offset); + void write(int xramsel, offs_t offset, UINT8 data); + void field_interrupts(); + + static TIMER_CALLBACK( rtc_SQW_callback ); + static TIMER_CALLBACK( rtc_begin_update_callback ); + static TIMER_CALLBACK( rtc_end_update_callback ); + + void rtc_SQW_cb(); + void rtc_begin_update_cb(); + void rtc_end_update_cb(); + /* 64 8-bit registers (10 clock registers, 4 control/status registers, and + 50 bytes of user RAM) */ + UINT8 m_regs[64]; + UINT8 m_cur_reg; + + /* extended RAM: 4kbytes of battery-backed RAM (in pages of 32 bytes) */ + UINT8 m_xram[4096]; + UINT8 m_cur_xram_page; + + /* update timer: called every second */ + emu_timer *m_update_timer; + + /* SQW timer: called every periodic clock half-period */ + emu_timer *m_SQW_timer; + UINT8 m_SQW_internal_state; + /* callback called when interrupt pin state changes (may be NULL) */ + devcb_resolved_write_line m_interrupt_func; +}; -DECLARE_LEGACY_NVRAM_DEVICE(RTC65271, rtc65271); +// device type definition +extern const device_type RTC65271; #endif diff -Nru mame-0.144/src/emu/machine/rtc9701.c mame-0.145/src/emu/machine/rtc9701.c --- mame-0.144/src/emu/machine/rtc9701.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine/rtc9701.c 2012-02-06 21:30:28.000000000 +0000 @@ -81,10 +81,8 @@ // on this device //------------------------------------------------- -bool rtc9701_device::device_validity_check(emu_options &options, const game_driver &driver) const +void rtc9701_device::device_validity_check(validity_checker &valid) const { - bool error = false; - return error; } //------------------------------------------------- @@ -94,8 +92,7 @@ void rtc9701_device::device_start() { /* let's call the timer callback every second */ - if(clock() >= XTAL_32_768kHz) - machine().scheduler().timer_pulse(attotime::from_hz(clock() / XTAL_32_768kHz), FUNC(rtc_inc_callback), 0, (void *)this); + machine().scheduler().timer_pulse(attotime::from_hz(clock() / XTAL_32_768kHz), FUNC(rtc_inc_callback), 0, (void *)this); system_time systime; machine().base_datetime(systime); diff -Nru mame-0.144/src/emu/machine/rtc9701.h mame-0.145/src/emu/machine/rtc9701.h --- mame-0.144/src/emu/machine/rtc9701.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine/rtc9701.h 2012-02-06 21:30:28.000000000 +0000 @@ -17,8 +17,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_RTC9701_ADD(_tag, _clock ) \ - MCFG_DEVICE_ADD(_tag, rtc9701, _clock) \ +#define MCFG_RTC9701_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, rtc9701, XTAL_32_768kHz) \ //************************************************************************** @@ -62,7 +62,7 @@ protected: // device-level overrides - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/emu/machine/s3c2400.c mame-0.145/src/emu/machine/s3c2400.c --- mame-0.144/src/emu/machine/s3c2400.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2400.c 2012-02-06 21:30:28.000000000 +0000 @@ -37,9 +37,9 @@ s3c24xx_video_start( device, machine); } -SCREEN_UPDATE( s3c2400 ) +SCREEN_UPDATE_RGB32( s3c2400 ) { - device_t *device = screen->machine().device( S3C2400_TAG); + device_t *device = screen.machine().device( S3C2400_TAG); return s3c24xx_video_update( device, screen, bitmap, cliprect); } diff -Nru mame-0.144/src/emu/machine/s3c2400.h mame-0.145/src/emu/machine/s3c2400.h --- mame-0.144/src/emu/machine/s3c2400.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2400.h 2012-02-06 21:30:28.000000000 +0000 @@ -39,8 +39,18 @@ TYPE DEFINITIONS *******************************************************************************/ -typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port); -typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 data); +typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port, UINT32 mask); +typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 mask, UINT32 data); + +typedef int (*s3c24xx_core_pin_r_func)( device_t *device, int pin); +typedef void (*s3c24xx_core_pin_w_func)( device_t *device, int pin, int data); + +typedef struct _s3c2400_interface_core s3c2400_interface_core; +struct _s3c2400_interface_core +{ + s3c24xx_core_pin_r_func pin_r; + s3c24xx_core_pin_w_func pin_w; +}; typedef struct _s3c2400_interface_gpio s3c2400_interface_gpio; struct _s3c2400_interface_gpio @@ -78,6 +88,7 @@ typedef struct _s3c2400_interface s3c2400_interface; struct _s3c2400_interface { + s3c2400_interface_core core; s3c2400_interface_gpio gpio; s3c2400_interface_i2c i2c; s3c2400_interface_adc adc; @@ -92,7 +103,7 @@ DEVICE_GET_INFO( s3c2400 ); VIDEO_START( s3c2400 ); -SCREEN_UPDATE( s3c2400 ); +SCREEN_UPDATE_RGB32( s3c2400 ); void s3c2400_uart_fifo_w( device_t *device, int uart, UINT8 data); @@ -380,6 +391,10 @@ #define S3C24XX_GPIO_PORT_F S3C2400_GPIO_PORT_F #define S3C24XX_GPIO_PORT_G S3C2400_GPIO_PORT_G +#define S3C24XX_UART_COUNT 2 +#define S3C24XX_DMA_COUNT 4 +#define S3C24XX_SPI_COUNT 1 + /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ @@ -614,7 +629,7 @@ { s3c24xx_lcd_regs_t regs; emu_timer *timer; - bitmap_t *bitmap[2]; + bitmap_rgb32 *bitmap[2]; UINT32 vramaddr_cur; UINT32 vramaddr_max; UINT32 offsize; @@ -707,11 +722,11 @@ s3c24xx_memcon_t memcon; s3c24xx_usbhost_t usbhost; s3c24xx_irq_t irq; - s3c24xx_dma_t dma[4]; + s3c24xx_dma_t dma[S3C24XX_DMA_COUNT]; s3c24xx_clkpow_t clkpow; s3c24xx_lcd_t lcd; s3c24xx_lcdpal_t lcdpal; - s3c24xx_uart_t uart[2]; + s3c24xx_uart_t uart[S3C24XX_UART_COUNT]; s3c24xx_pwm_t pwm; s3c24xx_usbdev_t usbdev; s3c24xx_wdt_t wdt; @@ -720,7 +735,7 @@ s3c24xx_gpio_t gpio; s3c24xx_rtc_t rtc; s3c24xx_adc_t adc; - s3c24xx_spi_t spi[1]; + s3c24xx_spi_t spi[S3C24XX_SPI_COUNT]; s3c24xx_mmc_t mmc; } s3c24xx_t; diff -Nru mame-0.144/src/emu/machine/s3c2410.c mame-0.145/src/emu/machine/s3c2410.c --- mame-0.144/src/emu/machine/s3c2410.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2410.c 2012-02-06 21:30:28.000000000 +0000 @@ -37,9 +37,9 @@ s3c24xx_video_start( device, machine); } -SCREEN_UPDATE( s3c2410 ) +SCREEN_UPDATE_RGB32( s3c2410 ) { - device_t *device = screen->machine().device( S3C2410_TAG); + device_t *device = screen.machine().device( S3C2410_TAG); return s3c24xx_video_update( device, screen, bitmap, cliprect); } @@ -104,7 +104,7 @@ void s3c2410_nand_calculate_mecc( UINT8 *data, UINT32 size, UINT8 *mecc) { - mecc[0] = mecc[1] = mecc[2] = mecc[3] = 0; + mecc[0] = mecc[1] = mecc[2] = mecc[3] = 0xFF; for (int i = 0; i < size; i++) nand_update_mecc( mecc, i, data[i]); } diff -Nru mame-0.144/src/emu/machine/s3c2410.h mame-0.145/src/emu/machine/s3c2410.h --- mame-0.144/src/emu/machine/s3c2410.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2410.h 2012-02-06 21:30:28.000000000 +0000 @@ -34,6 +34,13 @@ S3C2410_GPIO_PORT_H }; +enum +{ + S3C2410_CORE_PIN_NCON = 0, + S3C2410_CORE_PIN_OM0, + S3C2410_CORE_PIN_OM1 +}; + DECLARE_LEGACY_DEVICE(S3C2410, s3c2410); READ32_DEVICE_HANDLER( s3c2410_lcd_r ); @@ -42,8 +49,18 @@ TYPE DEFINITIONS *******************************************************************************/ -typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port); -typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 data); +typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port, UINT32 mask); +typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 mask, UINT32 data); + +typedef int (*s3c24xx_core_pin_r_func)( device_t *device, int pin); +typedef void (*s3c24xx_core_pin_w_func)( device_t *device, int pin, int data); + +typedef struct _s3c2410_interface_core s3c2410_interface_core; +struct _s3c2410_interface_core +{ + s3c24xx_core_pin_r_func pin_r; + s3c24xx_core_pin_w_func pin_w; +}; typedef struct _s3c2410_interface_gpio s3c2410_interface_gpio; struct _s3c2410_interface_gpio @@ -90,6 +107,7 @@ typedef struct _s3c2410_interface s3c2410_interface; struct _s3c2410_interface { + s3c2410_interface_core core; s3c2410_interface_gpio gpio; s3c2410_interface_i2c i2c; s3c2410_interface_adc adc; @@ -105,7 +123,7 @@ DEVICE_GET_INFO( s3c2410 ); VIDEO_START( s3c2410 ); -SCREEN_UPDATE( s3c2410 ); +SCREEN_UPDATE_RGB32( s3c2410 ); void s3c2410_uart_fifo_w( device_t *device, int uart, UINT8 data); void s3c2410_touch_screen( device_t *device, int state); @@ -461,6 +479,14 @@ #define S3C24XX_GPIO_PORT_G S3C2410_GPIO_PORT_G #define S3C24XX_GPIO_PORT_H S3C2410_GPIO_PORT_H +#define S3C24XX_CORE_PIN_NCON S3C2410_CORE_PIN_NCON +#define S3C24XX_CORE_PIN_OM0 S3C2410_CORE_PIN_OM0 +#define S3C24XX_CORE_PIN_OM1 S3C2410_CORE_PIN_OM1 + +#define S3C24XX_UART_COUNT 3 +#define S3C24XX_DMA_COUNT 4 +#define S3C24XX_SPI_COUNT 2 + /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ @@ -618,7 +644,7 @@ UINT32 gpadat; UINT32 pad_08; UINT32 pad_0c; - UINT32 gpbbon; + UINT32 gpbcon; UINT32 gpbdat; UINT32 gpbup; UINT32 pad_1c; @@ -741,7 +767,7 @@ { s3c24xx_lcd_regs_t regs; emu_timer *timer; - bitmap_t *bitmap[2]; + bitmap_rgb32 *bitmap[2]; UINT32 vramaddr_cur; UINT32 vramaddr_max; UINT32 offsize; @@ -765,7 +791,7 @@ { s3c24xx_nand_regs_t regs; UINT8 mecc[3]; - int pos; + int ecc_pos, data_count; } s3c24xx_nand_t; typedef struct @@ -839,15 +865,16 @@ typedef struct { const s3c2410_interface *iface; + UINT8 steppingstone[4*1024]; s3c24xx_memcon_t memcon; s3c24xx_usbhost_t usbhost; s3c24xx_irq_t irq; - s3c24xx_dma_t dma[4]; + s3c24xx_dma_t dma[S3C24XX_DMA_COUNT]; s3c24xx_clkpow_t clkpow; s3c24xx_lcd_t lcd; s3c24xx_lcdpal_t lcdpal; s3c24xx_nand_t nand; - s3c24xx_uart_t uart[3]; + s3c24xx_uart_t uart[S3C24XX_UART_COUNT]; s3c24xx_pwm_t pwm; s3c24xx_usbdev_t usbdev; s3c24xx_wdt_t wdt; @@ -856,7 +883,7 @@ s3c24xx_gpio_t gpio; s3c24xx_rtc_t rtc; s3c24xx_adc_t adc; - s3c24xx_spi_t spi[2]; + s3c24xx_spi_t spi[S3C24XX_SPI_COUNT]; s3c24xx_sdi_t sdi; } s3c24xx_t; diff -Nru mame-0.144/src/emu/machine/s3c2440.c mame-0.145/src/emu/machine/s3c2440.c --- mame-0.144/src/emu/machine/s3c2440.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2440.c 2012-02-06 21:30:28.000000000 +0000 @@ -37,9 +37,9 @@ s3c24xx_video_start( device, machine); } -SCREEN_UPDATE( s3c2440 ) +SCREEN_UPDATE_RGB32( s3c2440 ) { - device_t *device = screen->machine().device( S3C2440_TAG); + device_t *device = screen.machine().device( S3C2440_TAG); return s3c24xx_video_update( device, screen, bitmap, cliprect); } diff -Nru mame-0.144/src/emu/machine/s3c2440.h mame-0.145/src/emu/machine/s3c2440.h --- mame-0.144/src/emu/machine/s3c2440.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c2440.h 2012-02-06 21:30:28.000000000 +0000 @@ -33,14 +33,31 @@ S3C2440_GPIO_PORT_J }; +enum +{ + S3C2440_CORE_PIN_NCON = 0, + S3C2440_CORE_PIN_OM0, + S3C2440_CORE_PIN_OM1 +}; + DECLARE_LEGACY_DEVICE(S3C2440, s3c2440); /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ -typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port); -typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 data); +typedef UINT32 (*s3c24xx_gpio_port_r_func)( device_t *device, int port, UINT32 mask); +typedef void (*s3c24xx_gpio_port_w_func)( device_t *device, int port, UINT32 mask, UINT32 data); + +typedef int (*s3c24xx_core_pin_r_func)( device_t *device, int pin); +typedef void (*s3c24xx_core_pin_w_func)( device_t *device, int pin, int data); + +typedef struct _s3c2440_interface_core s3c2440_interface_core; +struct _s3c2440_interface_core +{ + s3c24xx_core_pin_r_func pin_r; + s3c24xx_core_pin_w_func pin_w; +}; typedef struct _s3c2440_interface_gpio s3c2440_interface_gpio; struct _s3c2440_interface_gpio @@ -87,6 +104,7 @@ typedef struct _s3c2440_interface s3c2440_interface; struct _s3c2440_interface { + s3c2440_interface_core core; s3c2440_interface_gpio gpio; s3c2440_interface_i2c i2c; s3c2440_interface_adc adc; @@ -102,7 +120,7 @@ DEVICE_GET_INFO( s3c2440 ); VIDEO_START( s3c2440 ); -SCREEN_UPDATE( s3c2440 ); +SCREEN_UPDATE_RGB32( s3c2440 ); void s3c2440_uart_fifo_w( device_t *device, int uart, UINT8 data); void s3c2440_touch_screen( device_t *device, int state); @@ -438,7 +456,7 @@ #define S3C24XX_SUBINT_WDT 13 #define S3C24XX_SUBINT_CAM_P 12 #define S3C24XX_SUBINT_CAM_C 11 -#define S3C24XX_SUBINT_ADC_S 10 +#define S3C24XX_SUBINT_ADC 10 #define S3C24XX_SUBINT_TC 9 #define S3C24XX_SUBINT_ERR2 8 #define S3C24XX_SUBINT_TXD2 7 @@ -489,6 +507,14 @@ #define S3C24XX_GPIO_PORT_H S3C2440_GPIO_PORT_H #define S3C24XX_GPIO_PORT_J S3C2440_GPIO_PORT_J +#define S3C24XX_CORE_PIN_NCON S3C2440_CORE_PIN_NCON +#define S3C24XX_CORE_PIN_OM0 S3C2440_CORE_PIN_OM0 +#define S3C24XX_CORE_PIN_OM1 S3C2440_CORE_PIN_OM1 + +#define S3C24XX_UART_COUNT 3 +#define S3C24XX_DMA_COUNT 4 +#define S3C24XX_SPI_COUNT 2 + /******************************************************************************* TYPE DEFINITIONS *******************************************************************************/ @@ -663,7 +689,7 @@ UINT32 gpadat; UINT32 pad_08; UINT32 pad_0c; - UINT32 gpbbon; + UINT32 gpbcon; UINT32 gpbdat; UINT32 gpbup; UINT32 pad_1c; @@ -799,7 +825,7 @@ { s3c24xx_lcd_regs_t regs; emu_timer *timer; - bitmap_t *bitmap[2]; + bitmap_rgb32 *bitmap[2]; UINT32 vramaddr_cur; UINT32 vramaddr_max; UINT32 offsize; @@ -824,7 +850,7 @@ s3c24xx_nand_regs_t regs; UINT8 mecc[4]; UINT8 secc[2]; - int pos; + int ecc_pos, data_count; } s3c24xx_nand_t; typedef struct @@ -907,16 +933,17 @@ typedef struct { const s3c2440_interface *iface; + UINT8 steppingstone[4*1024]; s3c24xx_memcon_t memcon; s3c24xx_usbhost_t usbhost; s3c24xx_irq_t irq; - s3c24xx_dma_t dma[4]; + s3c24xx_dma_t dma[S3C24XX_DMA_COUNT]; s3c24xx_clkpow_t clkpow; s3c24xx_lcd_t lcd; s3c24xx_lcdpal_t lcdpal; s3c24xx_nand_t nand; s3c24xx_cam_t cam; - s3c24xx_uart_t uart[3]; + s3c24xx_uart_t uart[S3C24XX_UART_COUNT]; s3c24xx_pwm_t pwm; s3c24xx_usbdev_t usbdev; s3c24xx_wdt_t wdt; @@ -925,7 +952,7 @@ s3c24xx_gpio_t gpio; s3c24xx_rtc_t rtc; s3c24xx_adc_t adc; - s3c24xx_spi_t spi[2]; + s3c24xx_spi_t spi[S3C24XX_SPI_COUNT]; s3c24xx_sdi_t sdi; s3c24xx_ac97_t ac97; } s3c24xx_t; diff -Nru mame-0.144/src/emu/machine/s3c24xx.c mame-0.145/src/emu/machine/s3c24xx.c --- mame-0.144/src/emu/machine/s3c24xx.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/s3c24xx.c 2012-02-06 21:30:28.000000000 +0000 @@ -121,11 +121,52 @@ static void s3c24xx_reset( device_t *device) { - fatalerror( "s3c24xx_reset\n"); + device_t *cpu = device->machine().device("maincpu"); + verboselog( device->machine(), 1, "reset\n"); + cpu->reset(); + device->reset(); +} + +INLINE int iface_core_pin_r( device_t *device, int pin) +{ + s3c24xx_t *s3c24xx = get_token( device); + if (s3c24xx->iface->core.pin_r) + { + return (s3c24xx->iface->core.pin_r)( device, pin); + } + else + { + return 0; + } } /* LCD Controller */ +static void s3c24xx_lcd_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_lcd_t *lcd = &s3c24xx->lcd; + memset( &lcd->regs, 0, sizeof( lcd->regs)); + #if defined(DEVICE_S3C2410) + lcd->regs.lcdintmsk = 3; + lcd->regs.lpcsel = 4; + #elif defined(DEVICE_S3C2440) + lcd->regs.lcdintmsk = 3; + lcd->regs.tconsel = 0x0F84; + #endif + lcd->vramaddr_cur = lcd->vramaddr_max = 0; + lcd->offsize = 0; + lcd->pagewidth_cur = lcd->pagewidth_max = 0; + lcd->bppmode = 0; + lcd->bswp = lcd->hwswp = 0; + lcd->vpos = lcd->hpos = 0; + lcd->framerate = 0; + lcd->tpal = 0; + lcd->hpos_min = lcd->hpos_max = lcd->vpos_min = lcd->vpos_max = 0; + lcd->dma_data = lcd->dma_bits = 0; + lcd->timer->adjust( attotime::never); +} + static rgb_t s3c24xx_get_color_tft_16( device_t *device, UINT16 data) { s3c24xx_t *s3c24xx = get_token( device); @@ -225,6 +266,13 @@ s3c24xx->lcd.offsize = BITS( s3c24xx->lcd.regs.lcdsaddr3, 21, 11); s3c24xx->lcd.pagewidth_cur = 0; s3c24xx->lcd.pagewidth_max = BITS( s3c24xx->lcd.regs.lcdsaddr3, 10, 0); + if (s3c24xx->lcd.pagewidth_max == 0) + { + if (s3c24xx->lcd.bppmode == S3C24XX_BPPMODE_STN_12_P) + { + s3c24xx->lcd.pagewidth_max = (s3c24xx->lcd.hpos_max - s3c24xx->lcd.hpos_min + 1) / 16 * 12; + } + } verboselog( device->machine(), 3, "LCD - vramaddr %08X %08X offsize %08X pagewidth %08X\n", s3c24xx->lcd.vramaddr_cur, s3c24xx->lcd.vramaddr_max, s3c24xx->lcd.offsize, s3c24xx->lcd.pagewidth_max); s3c24xx->lcd.dma_data = 0; s3c24xx->lcd.dma_bits = 0; @@ -233,8 +281,8 @@ static void s3c24xx_lcd_dma_init( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - s3c24xx_lcd_dma_reload( device); s3c24xx->lcd.bppmode = BITS( s3c24xx->lcd.regs.lcdcon1, 4, 1); + s3c24xx_lcd_dma_reload( device); s3c24xx->lcd.bswp = BIT( s3c24xx->lcd.regs.lcdcon5, 1); s3c24xx->lcd.hwswp = BIT( s3c24xx->lcd.regs.lcdcon5, 0); s3c24xx->lcd.tpal = s3c24xx->lcd.regs.tpal; @@ -401,11 +449,11 @@ static void s3c24xx_lcd_render_tpal( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; UINT32 color = s3c24xx_get_color_tpal( device); for (int y = s3c24xx->lcd.vpos_min; y <= s3c24xx->lcd.vpos_max; y++) { - UINT32 *scanline = BITMAP_ADDR32( bitmap, y, s3c24xx->lcd.hpos_min); + UINT32 *scanline = &bitmap.pix32(y, s3c24xx->lcd.hpos_min); for (int x = s3c24xx->lcd.hpos_min; x <= s3c24xx->lcd.hpos_max; x++) { *scanline++ = color; @@ -416,8 +464,8 @@ static void s3c24xx_lcd_render_stn_01( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -439,7 +487,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -448,8 +496,8 @@ static void s3c24xx_lcd_render_stn_02( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -463,7 +511,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -472,8 +520,8 @@ static void s3c24xx_lcd_render_stn_04( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -487,7 +535,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -496,8 +544,8 @@ static void s3c24xx_lcd_render_stn_08( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -511,7 +559,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -520,8 +568,8 @@ static void s3c24xx_lcd_render_stn_12_p( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 16; i++) { *scanline++ = s3c24xx_get_color_stn_12( device, s3c24xx_lcd_dma_read_bits( device, 12)); @@ -531,7 +579,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -539,8 +587,8 @@ static void s3c24xx_lcd_render_stn_12_u( device_t *device) // not tested { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -554,7 +602,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -563,8 +611,8 @@ static void s3c24xx_lcd_render_tft_01( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -578,7 +626,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -587,8 +635,8 @@ static void s3c24xx_lcd_render_tft_02( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -602,7 +650,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -611,8 +659,8 @@ static void s3c24xx_lcd_render_tft_04( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -626,7 +674,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -635,8 +683,8 @@ static void s3c24xx_lcd_render_tft_08( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -650,7 +698,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -659,8 +707,8 @@ static void s3c24xx_lcd_render_tft_16( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - bitmap_t *bitmap = s3c24xx->lcd.bitmap[0]; - UINT32 *scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + bitmap_rgb32 &bitmap = *s3c24xx->lcd.bitmap[0]; + UINT32 *scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); for (int i = 0; i < 4; i++) { UINT32 data = s3c24xx_lcd_dma_read( device); @@ -674,7 +722,7 @@ s3c24xx->lcd.vpos++; if (s3c24xx->lcd.vpos > s3c24xx->lcd.vpos_max) s3c24xx->lcd.vpos = s3c24xx->lcd.vpos_min; s3c24xx->lcd.hpos = s3c24xx->lcd.hpos_min; - scanline = BITMAP_ADDR32( bitmap, s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); + scanline = &bitmap.pix32(s3c24xx->lcd.vpos, s3c24xx->lcd.hpos); } } } @@ -729,18 +777,18 @@ { s3c24xx_t *s3c24xx = get_token( device); screen_device *screen = machine.primary_screen; - s3c24xx->lcd.bitmap[0] = screen->alloc_compatible_bitmap(); - s3c24xx->lcd.bitmap[1] = screen->alloc_compatible_bitmap(); + s3c24xx->lcd.bitmap[0] = auto_bitmap_rgb32_alloc(machine, screen->width(), screen->height()); + s3c24xx->lcd.bitmap[1] = auto_bitmap_rgb32_alloc(machine, screen->width(), screen->height()); } -static void bitmap_blend( bitmap_t *bitmap_dst, bitmap_t *bitmap_src_1, bitmap_t *bitmap_src_2) +static void bitmap_blend( bitmap_rgb32 &bitmap_dst, bitmap_rgb32 &bitmap_src_1, bitmap_rgb32 &bitmap_src_2) { - for (int y = 0; y < bitmap_dst->height; y++) + for (int y = 0; y < bitmap_dst.height(); y++) { - UINT32 *line0 = BITMAP_ADDR32( bitmap_src_1, y, 0); - UINT32 *line1 = BITMAP_ADDR32( bitmap_src_2, y, 0); - UINT32 *line2 = BITMAP_ADDR32( bitmap_dst, y, 0); - for (int x = 0; x < bitmap_dst->width; x++) + UINT32 *line0 = &bitmap_src_1.pix32(y); + UINT32 *line1 = &bitmap_src_2.pix32(y); + UINT32 *line2 = &bitmap_dst.pix32(y); + for (int x = 0; x < bitmap_dst.width(); x++) { UINT32 color0 = line0[x]; UINT32 color1 = line1[x]; @@ -758,19 +806,22 @@ } } -static UINT32 s3c24xx_video_update( device_t *device, screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect) +static UINT32 s3c24xx_video_update( device_t *device, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { s3c24xx_t *s3c24xx = get_token( device); - if (s3c24xx->lcd.framerate >= 1195) - { - bitmap_blend( bitmap, s3c24xx->lcd.bitmap[0], s3c24xx->lcd.bitmap[1]); - copybitmap( s3c24xx->lcd.bitmap[1], s3c24xx->lcd.bitmap[0], 0, 0, 0, 0, cliprect); - } - else + if (s3c24xx->lcd.regs.lcdcon1 & (1 << 0)) { - copybitmap( bitmap, s3c24xx->lcd.bitmap[0], 0, 0, 0, 0, cliprect); + if (s3c24xx->lcd.framerate >= 1195) + { + bitmap_blend( bitmap, *s3c24xx->lcd.bitmap[0], *s3c24xx->lcd.bitmap[1]); + copybitmap( *s3c24xx->lcd.bitmap[1], *s3c24xx->lcd.bitmap[0], 0, 0, 0, 0, cliprect); + } + else + { + copybitmap( bitmap, *s3c24xx->lcd.bitmap[0], 0, 0, 0, 0, cliprect); + } + s3c24xx_lcd_dma_init( device); } - s3c24xx_lcd_dma_init( device); return 0; } @@ -809,7 +860,7 @@ return data; } -static void s3c24xx_lcd_configure_tft( device_t *device) +static int s3c24xx_lcd_configure_tft( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); screen_device *screen = device->machine().primary_screen; @@ -847,9 +898,10 @@ s3c24xx->lcd.vpos_min = (vspw + 1) + (vbpd + 1); s3c24xx->lcd.vpos_max = s3c24xx->lcd.vpos_min + (lineval + 1) - 1; screen->configure( width, height, visarea, HZ_TO_ATTOSECONDS( s3c24xx->lcd.framerate)); + return TRUE; } -static void s3c24xx_lcd_configure_stn( device_t *device) +static int s3c24xx_lcd_configure_stn( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); screen_device *screen = device->machine().primary_screen; @@ -868,6 +920,10 @@ wlh = BITS( s3c24xx->lcd.regs.lcdcon4, 1, 0); hclk = s3c24xx_get_hclk( device); verboselog( device->machine(), 3, "LCD - pnrmode %d bppmode %d clkval %d lineval %d wdly %d hozval %d lineblank %d wlh %d hclk %d\n", pnrmode, bppmode, clkval, lineval, wdly, hozval, lineblank, wlh, hclk); + if (clkval == 0) + { + return FALSE; + } vclk = (double)(hclk / ((clkval + 0) * 2)); verboselog( device->machine(), 3, "LCD - vclk %f\n", vclk); framerate = 1 / (((1 / vclk) * (hozval + 1) + (1 / hclk) * ((1 << (4 + wlh)) + (1 << (4 + wdly)) + (lineblank * 8))) * (lineval + 1)); @@ -881,10 +937,7 @@ } height = lineval + 1; s3c24xx->lcd.framerate = framerate; - visarea.min_x = 0; - visarea.min_y = 0; - visarea.max_x = width - 1; - visarea.max_y = height - 1; + visarea.set(0, width - 1, 0, height - 1); verboselog( device->machine(), 3, "LCD - visarea min_x %d min_y %d max_x %d max_y %d\n", visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y); verboselog( device->machine(), 3, "video_screen_configure %d %d %f\n", width, height, s3c24xx->lcd.framerate); s3c24xx->lcd.hpos_min = 0; @@ -892,9 +945,10 @@ s3c24xx->lcd.vpos_min = 0; s3c24xx->lcd.vpos_max = height - 1; screen->configure( width, height, visarea, HZ_TO_ATTOSECONDS( s3c24xx->lcd.framerate)); + return TRUE; } -static void s3c24xx_lcd_configure( device_t *device) +static int s3c24xx_lcd_configure( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); UINT32 bppmode; @@ -902,11 +956,11 @@ bppmode = BITS( s3c24xx->lcd.regs.lcdcon1, 4, 1); if ((bppmode & (1 << 3)) == 0) { - s3c24xx_lcd_configure_stn( device); + return s3c24xx_lcd_configure_stn( device); } else { - s3c24xx_lcd_configure_tft( device); + return s3c24xx_lcd_configure_tft( device); } } @@ -915,9 +969,11 @@ s3c24xx_t *s3c24xx = get_token( device); screen_device *screen = device->machine().primary_screen; verboselog( device->machine(), 1, "LCD start\n"); - s3c24xx_lcd_configure( device); - s3c24xx_lcd_dma_init( device); - s3c24xx->lcd.timer->adjust( screen->time_until_pos( s3c24xx->lcd.vpos_min, s3c24xx->lcd.hpos_min)); + if (s3c24xx_lcd_configure( device)) + { + s3c24xx_lcd_dma_init( device); + s3c24xx->lcd.timer->adjust( screen->time_until_pos( s3c24xx->lcd.vpos_min, s3c24xx->lcd.hpos_min)); + } } static void s3c24xx_lcd_stop( device_t *device) @@ -983,19 +1039,56 @@ /* Clock & Power Management */ +static void s3c24xx_clkpow_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_clkpow_t *clkpow = &s3c24xx->clkpow; + memset( &clkpow->regs, 0, sizeof( clkpow->regs)); + #if defined(DEVICE_S3C2400) + clkpow->regs.locktime = 0x00FFFFFF; + clkpow->regs.mpllcon = 0x0005C080; + clkpow->regs.upllcon = 0x00028080; + clkpow->regs.clkcon = 0x0000FFF8; + #elif defined(DEVICE_S3C2410) + clkpow->regs.locktime = 0x00FFFFFF; + clkpow->regs.mpllcon = 0x0005C080; + clkpow->regs.upllcon = 0x00028080; + clkpow->regs.clkcon = 0x0007FFF0; + #elif defined(DEVICE_S3C2440) + clkpow->regs.locktime = 0xFFFFFFFF; + clkpow->regs.mpllcon = 0x00096030; + clkpow->regs.upllcon = 0x0004D030; + clkpow->regs.clkcon = 0x00FFFFF0; + #endif + clkpow->regs.clkslow = 4; +} + static UINT32 s3c24xx_get_fclk( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - UINT32 data, mdiv, pdiv, sdiv; - data = s3c24xx->clkpow.regs.mpllcon; - mdiv = BITS( data, 19, 12); - pdiv = BITS( data, 9, 4); - sdiv = BITS( data, 1, 0); + UINT32 mpllcon, clkslow, mdiv, pdiv, sdiv, fclk; + double temp1, temp2; + mpllcon = s3c24xx->clkpow.regs.mpllcon; + mdiv = BITS( mpllcon, 19, 12); + pdiv = BITS( mpllcon, 9, 4); + sdiv = BITS( mpllcon, 1, 0); #if defined(DEVICE_S3C2400) || defined(DEVICE_S3C2410) - return (UINT32)((double)(1 * (mdiv + 8) * device->clock()) / (double)((pdiv + 2) * (1 << sdiv))); + temp1 = 1 * (mdiv + 8) * (double)device->clock(); #else - return (UINT32)((double)(2 * (mdiv + 8) * device->clock()) / (double)((pdiv + 2) * (1 << sdiv))); + temp1 = 2 * (mdiv + 8) * (double)device->clock(); #endif + temp2 = (double)((pdiv + 2) * (1 << sdiv)); + fclk = (UINT32)(temp1 / temp2); + clkslow = s3c24xx->clkpow.regs.clkslow; + if (BIT( clkslow, 4) == 1) + { + UINT32 slow_val = BITS( clkslow, 2, 0); + if (slow_val > 0) + { + fclk = fclk / (2 * slow_val); + } + } + return fclk; } static UINT32 s3c24xx_get_hclk( device_t *device) @@ -1042,11 +1135,32 @@ device->machine().device( "maincpu")->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); } break; + case S3C24XX_CLKSLOW : + { + verboselog( device->machine(), 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk( device), s3c24xx_get_hclk( device), s3c24xx_get_pclk( device)); + device->machine().device( "maincpu")->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); + } + break; } } /* Interrupt Controller */ +static void s3c24xx_irq_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_irq_t *irq = &s3c24xx->irq; + memset( &irq->regs, 0, sizeof( irq->regs)); + irq->line_irq = irq->line_fiq = CLEAR_LINE; + irq->regs.intmsk = 0xFFFFFFFF; + irq->regs.priority = 0x7F; + #if defined(DEVICE_S3C2410) + irq->regs.intsubmsk = 0x07FF; + #elif defined(DEVICE_S3C2440) + irq->regs.intsubmsk = 0xFFFF; + #endif +} + static void s3c24xx_check_pending_irq( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); @@ -1056,15 +1170,18 @@ if (temp != 0) { UINT32 int_type = 0; + verboselog( device->machine(), 5, "srcpnd %08X intmsk %08X intmod %08X\n", s3c24xx->irq.regs.srcpnd, s3c24xx->irq.regs.intmsk, s3c24xx->irq.regs.intmod); while ((temp & 1) == 0) { int_type++; temp = temp >> 1; } + verboselog( device->machine(), 5, "intpnd set bit %d\n", int_type); s3c24xx->irq.regs.intpnd |= (1 << int_type); s3c24xx->irq.regs.intoffset = int_type; if (s3c24xx->irq.line_irq != ASSERT_LINE) { + verboselog( device->machine(), 5, "ARM7_IRQ_LINE -> ASSERT_LINE\n"); cputag_set_input_line( device->machine(), "maincpu", ARM7_IRQ_LINE, ASSERT_LINE); s3c24xx->irq.line_irq = ASSERT_LINE; } @@ -1073,6 +1190,8 @@ { if (s3c24xx->irq.line_irq != CLEAR_LINE) { + verboselog( device->machine(), 5, "srcpnd %08X intmsk %08X intmod %08X\n", s3c24xx->irq.regs.srcpnd, s3c24xx->irq.regs.intmsk, s3c24xx->irq.regs.intmod); + verboselog( device->machine(), 5, "ARM7_IRQ_LINE -> CLEAR_LINE\n"); cputag_set_input_line( device->machine(), "maincpu", ARM7_IRQ_LINE, CLEAR_LINE); s3c24xx->irq.line_irq = CLEAR_LINE; } @@ -1089,6 +1208,7 @@ } if (s3c24xx->irq.line_fiq != ASSERT_LINE) { + verboselog( device->machine(), 5, "ARM7_FIRQ_LINE -> ASSERT_LINE\n"); cputag_set_input_line( device->machine(), "maincpu", ARM7_FIRQ_LINE, ASSERT_LINE); s3c24xx->irq.line_fiq = ASSERT_LINE; } @@ -1097,6 +1217,7 @@ { if (s3c24xx->irq.line_fiq != CLEAR_LINE) { + verboselog( device->machine(), 5, "ARM7_FIRQ_LINE -> CLEAR_LINE\n"); cputag_set_input_line( device->machine(), "maincpu", ARM7_FIRQ_LINE, CLEAR_LINE); s3c24xx->irq.line_fiq = CLEAR_LINE; } @@ -1196,6 +1317,7 @@ case S3C24XX_SRCPND : { s3c24xx->irq.regs.srcpnd = (old_value & ~data); // clear only the bit positions of SRCPND corresponding to those set to one in the data + s3c24xx->irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." s3c24xx_check_pending_irq( device); } break; @@ -1207,6 +1329,7 @@ case S3C24XX_INTPND : { s3c24xx->irq.regs.intpnd = (old_value & ~data); // clear only the bit positions of INTPND corresponding to those set to one in the data + s3c24xx->irq.regs.intoffset = 0; // "This bit can be cleared automatically by clearing SRCPND and INTPND." } break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) @@ -1227,6 +1350,17 @@ /* PWM Timer */ +static void s3c24xx_pwm_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_pwm_t *pwm = &s3c24xx->pwm; + memset( &pwm->regs, 0, sizeof( pwm->regs)); + for (int i = 0; i < 5; i++) + { + pwm->timer[i]->adjust( attotime::never); + } +} + static UINT16 s3c24xx_pwm_calc_observation( device_t *device, int ch) { s3c24xx_t *s3c24xx = get_token( device); @@ -1440,6 +1574,17 @@ /* DMA */ +static void s3c24xx_dma_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + for (int i = 0; i < S3C24XX_DMA_COUNT; i++) + { + s3c24xx_dma_t *dma = &s3c24xx->dma[i]; + memset( &dma->regs, 0, sizeof( dma->regs)); + dma->timer->adjust( attotime::never); + } +} + static void s3c24xx_dma_reload( device_t *device, int ch) { s3c24xx_t *s3c24xx = get_token( device); @@ -1683,12 +1828,41 @@ /* I/O Port */ -INLINE UINT32 iface_gpio_port_r( device_t *device, int port) +static void s3c24xx_gpio_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_gpio_t *gpio = &s3c24xx->gpio; + memset( &gpio->regs, 0, sizeof( gpio->regs)); + #if defined(DEVICE_S3C2400) + gpio->regs.gpacon = 0x0003FFFF; + gpio->regs.gpbcon = 0xAAAAAAAA; + gpio->regs.gpdup = 0x0620; + gpio->regs.gpeup = 0x0003; + #elif defined(DEVICE_S3C2410) + gpio->regs.gpacon = 0x007FFFFF; + gpio->regs.gpgup = 0xF800; + gpio->regs.misccr = 0x00010330; + gpio->regs.eintmask = 0x00FFFFF0; + gpio->regs.gstatus1 = 0x32410002; + #elif defined(DEVICE_S3C2440) + gpio->regs.gpacon = 0x00FFFFFF; + gpio->regs.gpgup = 0xFC00; + gpio->regs.misccr = 0x00010020; + gpio->regs.eintmask = 0x000FFFFF; + gpio->regs.gstatus1 = 0x32440001; + #endif + gpio->regs.gpdup = 0xF000; + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + gpio->regs.gstatus2 = 1 << 0; // Boot is caused by power on reset + #endif +} + +INLINE UINT32 iface_gpio_port_r( device_t *device, int port, UINT32 mask) { s3c24xx_t *s3c24xx = get_token( device); if (s3c24xx->iface->gpio.port_r) { - return (s3c24xx->iface->gpio.port_r)( device, port); + return (s3c24xx->iface->gpio.port_r)( device, port, mask); } else { @@ -1696,67 +1870,81 @@ } } -INLINE void iface_gpio_port_w( device_t *device, int port, UINT32 data) +INLINE void iface_gpio_port_w( device_t *device, int port, UINT32 mask, UINT32 data) { s3c24xx_t *s3c24xx = get_token( device); if (s3c24xx->iface->gpio.port_w) { - (s3c24xx->iface->gpio.port_w)( device, port, data); + (s3c24xx->iface->gpio.port_w)( device, port, mask, data); } } +static UINT16 s3c24xx_gpio_get_mask( UINT32 con, int val) +{ + UINT16 mask = 0; + for (int i = 0; i < 16; i++) + { + if (((con >> (i << 1)) & 3) == val) + { + mask = mask | (1 << i); + } + } + return mask; +} + static READ32_DEVICE_HANDLER( s3c24xx_gpio_r ) { s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_gpio_t *gpio = &s3c24xx->gpio; UINT32 data = ((UINT32*)&s3c24xx->gpio.regs)[offset]; switch (offset) { case S3C24XX_GPADAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_A) & S3C24XX_GPADAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_A, 0) & S3C24XX_GPADAT_MASK; } break; case S3C24XX_GPBDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_B) & S3C24XX_GPBDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask( gpio->regs.gpbcon, 0) & S3C24XX_GPBDAT_MASK) & S3C24XX_GPBDAT_MASK; } break; case S3C24XX_GPCDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_C) & S3C24XX_GPCDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask( gpio->regs.gpccon, 0) & S3C24XX_GPCDAT_MASK) & S3C24XX_GPCDAT_MASK; } break; case S3C24XX_GPDDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_D) & S3C24XX_GPDDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask( gpio->regs.gpdcon, 0) & S3C24XX_GPDDAT_MASK) & S3C24XX_GPDDAT_MASK; } break; case S3C24XX_GPEDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_E) & S3C24XX_GPEDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask( gpio->regs.gpecon, 0) & S3C24XX_GPEDAT_MASK) & S3C24XX_GPEDAT_MASK; } break; case S3C24XX_GPFDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_F) & S3C24XX_GPFDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask( gpio->regs.gpfcon, 0) & S3C24XX_GPFDAT_MASK) & S3C24XX_GPFDAT_MASK; } break; case S3C24XX_GPGDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_G) & S3C24XX_GPGDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask( gpio->regs.gpgcon, 0) & S3C24XX_GPGDAT_MASK) & S3C24XX_GPGDAT_MASK; } break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) case S3C24XX_GPHDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_H) & S3C24XX_GPHDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask( gpio->regs.gphcon, 0) & S3C24XX_GPHDAT_MASK) & S3C24XX_GPHDAT_MASK; } break; #endif #if defined(DEVICE_S3C2440) case S3C24XX_GPJDAT : { - data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_J) & S3C24XX_GPJDAT_MASK; + data = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask( gpio->regs.gpjcon, 0) & S3C24XX_GPJDAT_MASK) & S3C24XX_GPJDAT_MASK; } break; #endif @@ -1768,6 +1956,7 @@ static WRITE32_DEVICE_HANDLER( s3c24xx_gpio_w ) { s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_gpio_t *gpio = &s3c24xx->gpio; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) UINT32 old_value = ((UINT32*)&s3c24xx->gpio.regs)[offset]; #endif @@ -1777,43 +1966,43 @@ { case S3C24XX_GPADAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_A, data & S3C24XX_GPADAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_A, gpio->regs.gpacon ^ 0xFFFFFFFF, data & S3C24XX_GPADAT_MASK); } break; case S3C24XX_GPBDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_B, data & S3C24XX_GPBDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_B, s3c24xx_gpio_get_mask( gpio->regs.gpbcon, 1) & S3C24XX_GPBDAT_MASK, data & S3C24XX_GPBDAT_MASK); } break; case S3C24XX_GPCDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_C, data & S3C24XX_GPCDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_C, s3c24xx_gpio_get_mask( gpio->regs.gpccon, 1) & S3C24XX_GPCDAT_MASK, data & S3C24XX_GPCDAT_MASK); } break; case S3C24XX_GPDDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_D, data & S3C24XX_GPDDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_D, s3c24xx_gpio_get_mask( gpio->regs.gpdcon, 1) & S3C24XX_GPDDAT_MASK, data & S3C24XX_GPDDAT_MASK); } break; case S3C24XX_GPEDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_E, data & S3C24XX_GPEDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_E, s3c24xx_gpio_get_mask( gpio->regs.gpecon, 1) & S3C24XX_GPEDAT_MASK, data & S3C24XX_GPEDAT_MASK); } break; case S3C24XX_GPFDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_F, data & S3C24XX_GPFDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_F, s3c24xx_gpio_get_mask( gpio->regs.gpfcon, 1) & S3C24XX_GPFDAT_MASK, data & S3C24XX_GPFDAT_MASK); } break; case S3C24XX_GPGDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_G, data & S3C24XX_GPGDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_G, s3c24xx_gpio_get_mask( gpio->regs.gpgcon, 1) & S3C24XX_GPGDAT_MASK, data & S3C24XX_GPGDAT_MASK); } break; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) case S3C24XX_GPHDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_H, data & S3C24XX_GPHDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_H, s3c24xx_gpio_get_mask( gpio->regs.gphcon, 1) & S3C24XX_GPHDAT_MASK, data & S3C24XX_GPHDAT_MASK); } break; case S3C24XX_EINTPEND : @@ -1827,11 +2016,16 @@ s3c24xx_check_pending_eint( device); } break; + case S3C24XX_GSTATUS2 : + { + s3c24xx->gpio.regs.gstatus2 = (old_value & ~data) & 7; // "The setting is cleared by writing '1' to this bit" + } + break; #endif #if defined(DEVICE_S3C2440) case S3C24XX_GPJDAT : { - iface_gpio_port_w( device, S3C24XX_GPIO_PORT_J, data & S3C24XX_GPJDAT_MASK); + iface_gpio_port_w( device, S3C24XX_GPIO_PORT_J, s3c24xx_gpio_get_mask( gpio->regs.gpjcon, 1) & S3C24XX_GPJDAT_MASK, data & S3C24XX_GPJDAT_MASK); } break; #endif @@ -1840,6 +2034,22 @@ /* Memory Controller */ +static void s3c24xx_memcon_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_memcon_t *memcon = &s3c24xx->memcon; + memset( &memcon->regs, 0, sizeof( memcon->regs)); + memcon->regs.data[0x04/4] = 0x00000700; + memcon->regs.data[0x08/4] = 0x00000700; + memcon->regs.data[0x0C/4] = 0x00000700; + memcon->regs.data[0x10/4] = 0x00000700; + memcon->regs.data[0x14/4] = 0x00000700; + memcon->regs.data[0x18/4] = 0x00000700; + memcon->regs.data[0x1C/4] = 0x00018008; + memcon->regs.data[0x20/4] = 0x00018008; + memcon->regs.data[0x24/4] = 0x00AC0000; +} + static READ32_DEVICE_HANDLER( s3c24xx_memcon_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -1857,6 +2067,13 @@ /* USB Host Controller */ +static void s3c24xx_usb_host_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_usbhost_t *usbhost = &s3c24xx->usbhost; + memset( &usbhost->regs, 0, sizeof( usbhost->regs)); +} + static READ32_DEVICE_HANDLER( s3c24xx_usb_host_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -1869,6 +2086,27 @@ data = data & ~(1 << 0); // [bit 0] HostControllerReset } break; + // HcPeriodStart + case 0x40 / 4: + { + // "After a hardware reset, this field is cleared. This is then set by" + // "HCD during the HC initialization. The value is calculated" + // "roughly as 10% off from HcFmInterval.. A typical value will be 3E67h." + data = (data & ~0x00003FFF) | 0x3E67; + } + break; + // HcRhDescriptorA + case 0x48 / 4: + { + data = (data & ~0xFF) | 2; // number of ports + } + break; + // HcRhStatus + case 0x50 / 4: + { + data = data & ~(1 << 16); // "The Root Hub does not support the local power status feature; thus, this bit is always read as ?0?." + } + break; } verboselog( device->machine(), 9, "(USB H) %08X -> %08X\n", S3C24XX_BASE_USBHOST + (offset << 2), data); return data; @@ -1883,6 +2121,17 @@ /* UART */ +static void s3c24xx_uart_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + for (int i = 0; i < S3C24XX_UART_COUNT; i++) + { + s3c24xx_uart_t *uart = &s3c24xx->uart[i]; + memset( &uart->regs, 0, sizeof( uart->regs)); + uart->regs.utrstat = 6; + } +} + static UINT32 s3c24xx_uart_r( device_t *device, UINT32 ch, UINT32 offset) { s3c24xx_t *s3c24xx = get_token( device); @@ -1911,6 +2160,11 @@ COMBINE_DATA(&((UINT32*)&s3c24xx->uart[ch].regs)[offset]); switch (offset) { + case S3C24XX_UFCON : + { + s3c24xx->uart[ch].regs.ufcon &= ~((1 << 2) | (1 << 1)); // bits 1 and 2 are auto-cleared after resetting FIFO + } + break; case S3C24XX_UTXH : { UINT8 txdata = data & 0xFF; @@ -1980,6 +2234,28 @@ /* USB Device */ +static void s3c24xx_usb_device_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_usbdev_t *usbdev = &s3c24xx->usbdev; + memset( &usbdev->regs, 0, sizeof( usbdev->regs)); + #if defined(DEVICE_S3C2400) + usbdev->regs.data[0x0C/4] = 0x033F; + usbdev->regs.data[0x14/4] = 0x000A; + usbdev->regs.data[0x24/4] = 0x0001; + usbdev->regs.data[0x44/4] = 0x0001; + usbdev->regs.data[0x54/4] = 0x0001; + usbdev->regs.data[0x64/4] = 0x0001; + usbdev->regs.data[0x74/4] = 0x0001; + usbdev->regs.data[0xB8/4] = 0x00FF; + #elif defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + usbdev->regs.data[0x1C/4] = 0xFF; + usbdev->regs.data[0x2C/4] = 0x04; + usbdev->regs.data[0x40/4] = 0x01; + usbdev->regs.data[0x48/4] = 0x20; + #endif +} + static READ32_DEVICE_HANDLER( s3c24xx_usb_device_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -1997,6 +2273,17 @@ /* Watchdog Timer */ +static void s3c24xx_wdt_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_wdt_t *wdt = &s3c24xx->wdt; + memset( &wdt->regs, 0, sizeof( wdt->regs)); + wdt->regs.wtcon = 0x8021; + wdt->regs.wtdat = 0x8000; + wdt->regs.wtcnt = 0x8000; + wdt->timer->adjust( attotime::never); +} + #if defined(DEVICE_S3C2410) static UINT16 s3c24xx_wdt_calc_current_count( device_t *device) @@ -2118,11 +2405,23 @@ if ((s3c24xx->wdt.regs.wtcon & (1 << 0)) != 0) { s3c24xx_reset( device); + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + s3c24xx->gpio.regs.gstatus2 = 1 << 2; // Watchdog reset + #endif } } /* IIC */ +static void s3c24xx_iic_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_iic_t *iic = &s3c24xx->iic; + memset( &iic->regs, 0, sizeof( iic->regs)); + iic->count = 0; + iic->timer->adjust( attotime::never); +} + INLINE void iface_i2c_scl_w( device_t *device, int state) { s3c24xx_t *s3c24xx = get_token( device); @@ -2360,6 +2659,16 @@ /* IIS */ +static void s3c24xx_iis_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_iis_t *iis = &s3c24xx->iis; + memset( &iis->regs, 0, sizeof( iis->regs)); + iis->fifo_index = 0; + iis->regs.iiscon = 0x0100; + iis->timer->adjust( attotime::never); +} + INLINE void iface_i2s_data_w( device_t *device, int ch, UINT16 data) { s3c24xx_t *s3c24xx = get_token( device); @@ -2470,16 +2779,15 @@ /* RTC */ -static void s3c24xx_rtc_init( device_t *device) +static void s3c24xx_rtc_reset( device_t *device) { s3c24xx_t *s3c24xx = get_token( device); - s3c24xx->rtc.regs.bcdsec = dec_2_bcd( 0); - s3c24xx->rtc.regs.bcdmin = dec_2_bcd( 0); - s3c24xx->rtc.regs.bcdhour = dec_2_bcd( 0); - s3c24xx->rtc.regs.bcdday = dec_2_bcd( 1); - s3c24xx->rtc.regs.bcddow = dec_2_bcd( 1); - s3c24xx->rtc.regs.bcdmon = dec_2_bcd( 1); - s3c24xx->rtc.regs.bcdyear = dec_2_bcd( 4); + s3c24xx_rtc_t *rtc = &s3c24xx->rtc; + memset( &rtc->regs, 0, sizeof( rtc->regs)); + rtc->regs.almday = 1; + rtc->regs.almmon = 1; + rtc->timer_update->adjust( attotime::never); + rtc->timer_update->adjust( attotime::from_msec( 1000), 0, attotime::from_msec( 1000)); } static READ32_DEVICE_HANDLER( s3c24xx_rtc_r ) @@ -2605,12 +2913,31 @@ /* A/D Converter */ +static void s3c24xx_adc_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_adc_t *adc = &s3c24xx->adc; + memset( &adc->regs, 0, sizeof( adc->regs)); + adc->regs.adccon = 0x3FC4; + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + adc->regs.adctsc = 0x58; + adc->regs.adcdly = 0xFF; + #endif +} + static UINT32 iface_adc_data_r( device_t *device, int ch) { s3c24xx_t *s3c24xx = get_token( device); if (s3c24xx->iface->adc.data_r) { - return (s3c24xx->iface->adc.data_r)( device, ch, 0); + int offs = ch; + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + if (BIT( s3c24xx->adc.regs.adctsc, 2) != 0) + { + offs += 2; + } + #endif + return (s3c24xx->iface->adc.data_r)( device, offs, 0); } else { @@ -2653,6 +2980,9 @@ verboselog( device->machine(), 1, "ADC start\n"); s3c24xx->adc.regs.adccon &= ~(1 << 0); // A/D conversion is completed s3c24xx->adc.regs.adccon |= (1 << 15); // End of A/D conversion + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + s3c24xx_request_subirq( device, S3C24XX_SUBINT_ADC); + #endif } static WRITE32_DEVICE_HANDLER( s3c24xx_adc_w ) @@ -2688,6 +3018,20 @@ /* SPI */ +static void s3c24xx_spi_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + for (int i = 0; i < S3C24XX_SPI_COUNT; i++) + { + s3c24xx_spi_t *spi = &s3c24xx->spi[i]; + memset( &spi->regs, 0, sizeof( spi->regs)); + spi->regs.spsta = 1; + #if defined(DEVICE_S3C2400) || defined(DEVICE_S3C2410) + spi->regs.sppin = 2; + #endif + } +} + static UINT32 s3c24xx_spi_r( device_t *device, UINT32 ch, UINT32 offset) { s3c24xx_t *s3c24xx = get_token( device); @@ -2747,6 +3091,13 @@ #if defined(DEVICE_S3C2400) +static void s3c24xx_mmc_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_mmc_t *mmc = &s3c24xx->mmc; + memset( &mmc->regs, 0, sizeof( mmc->regs)); +} + static READ32_DEVICE_HANDLER( s3c24xx_mmc_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -2768,6 +3119,19 @@ #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) +static void s3c24xx_sdi_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_sdi_t *sdi = &s3c24xx->sdi; + memset( &sdi->regs, 0, sizeof( sdi->regs)); + #if defined(DEVICE_S3C2410) + sdi->regs.data[0x24/4] = 0x2000; + #elif defined(DEVICE_S3C2440) + sdi->regs.data[0x04/4] = 1; + sdi->regs.data[0x24/4] = 0x10000; + #endif +} + static READ32_DEVICE_HANDLER( s3c24xx_sdi_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -2789,6 +3153,17 @@ #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) +static void s3c24xx_nand_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_nand_t *nand = &s3c24xx->nand; + memset( &nand->regs, 0, sizeof( nand->regs)); + #if defined(DEVICE_S3C2440) + nand->regs.nfconf = 0x1000; + nand->regs.nfcont = 0x0384; + #endif +} + INLINE void iface_nand_command_w( device_t *device, UINT8 data) { s3c24xx_t *s3c24xx = get_token( device); @@ -2897,59 +3272,66 @@ static void s3c24xx_nand_update_ecc( device_t *device, UINT8 data) { s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_nand_t *nand = &s3c24xx->nand; UINT8 temp[4]; #if defined(DEVICE_S3C2410) - temp[0] = s3c24xx->nand.mecc[0]; - temp[1] = s3c24xx->nand.mecc[1]; - temp[2] = s3c24xx->nand.mecc[2]; - nand_update_mecc( s3c24xx->nand.mecc, s3c24xx->nand.pos++, data); - verboselog( device->machine(), 5, "NAND - MECC %03X - %02X %02X %02X -> %02X %02X %02X\n", s3c24xx->nand.pos - 1, temp[0], temp[1], temp[2], s3c24xx->nand.mecc[0], s3c24xx->nand.mecc[1], s3c24xx->nand.mecc[2]); - if (s3c24xx->nand.pos == 512) s3c24xx->nand.pos = 0; + temp[0] = nand->mecc[0]; + temp[1] = nand->mecc[1]; + temp[2] = nand->mecc[2]; + nand_update_mecc( nand->mecc, nand->ecc_pos++, data); + verboselog( device->machine(), 5, "NAND - MECC %03X - %02X %02X %02X -> %02X %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], temp[2], nand->mecc[0], nand->mecc[1], nand->mecc[2]); + if (nand->ecc_pos == 512) nand->ecc_pos = 0; #else - if ((s3c24xx->nand.regs.nfcont & (1 << 5)) == 0) + if ((nand->regs.nfcont & (1 << 5)) == 0) { - temp[0] = s3c24xx->nand.mecc[0]; - temp[1] = s3c24xx->nand.mecc[1]; - temp[2] = s3c24xx->nand.mecc[2]; - temp[3] = s3c24xx->nand.mecc[3]; - nand_update_mecc( s3c24xx->nand.mecc, s3c24xx->nand.pos++, data); - verboselog( device->machine(), 5, "NAND - MECC %03X - %02X %02X %02X %02X -> %02X %02X %02X %02X\n", s3c24xx->nand.pos - 1, temp[0], temp[1], temp[2], temp[3], s3c24xx->nand.mecc[0], s3c24xx->nand.mecc[1], s3c24xx->nand.mecc[2], s3c24xx->nand.mecc[3]); - if (s3c24xx->nand.pos == 2048) s3c24xx->nand.pos = 0; - } - if ((s3c24xx->nand.regs.nfcont & (1 << 6)) == 0) - { - temp[0] = s3c24xx->nand.secc[0]; - temp[1] = s3c24xx->nand.secc[1]; - nand_update_secc( s3c24xx->nand.secc, s3c24xx->nand.pos++, data); - verboselog( device->machine(), 5, "NAND - SECC %02X - %02X %02X -> %02X %02X\n", s3c24xx->nand.pos - 1, temp[0], temp[1], s3c24xx->nand.secc[0], s3c24xx->nand.secc[1]); - if (s3c24xx->nand.pos == 16) s3c24xx->nand.pos = 0; + temp[0] = nand->mecc[0]; + temp[1] = nand->mecc[1]; + temp[2] = nand->mecc[2]; + temp[3] = nand->mecc[3]; + nand_update_mecc( nand->mecc, nand->ecc_pos++, data); + verboselog( device->machine(), 5, "NAND - MECC %03X - %02X %02X %02X %02X -> %02X %02X %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], temp[2], temp[3], nand->mecc[0], nand->mecc[1], nand->mecc[2], nand->mecc[3]); + if (nand->ecc_pos == 2048) nand->ecc_pos = 0; + } + if ((nand->regs.nfcont & (1 << 6)) == 0) + { + temp[0] = nand->secc[0]; + temp[1] = nand->secc[1]; + nand_update_secc( nand->secc, nand->ecc_pos++, data); + verboselog( device->machine(), 5, "NAND - SECC %02X - %02X %02X -> %02X %02X\n", nand->ecc_pos - 1, temp[0], temp[1], nand->secc[0], nand->secc[1]); + if (nand->ecc_pos == 16) nand->ecc_pos = 0; } #endif } static void s3c24xx_nand_command_w( device_t *device, UINT8 data) { + s3c24xx_t *s3c24xx = get_token( device); verboselog( device->machine(), 5, "NAND write command %02X\n", data); + s3c24xx->nand.data_count = 0; iface_nand_command_w( device, data); } static void s3c24xx_nand_address_w( device_t *device, UINT8 data) { + s3c24xx_t *s3c24xx = get_token( device); verboselog( device->machine(), 5, "NAND write address %02X\n", data); + s3c24xx->nand.data_count = 0; iface_nand_address_w( device, data); } static UINT8 s3c24xx_nand_data_r( device_t *device) { + s3c24xx_t *s3c24xx = get_token( device); UINT8 data = iface_nand_data_r( device); - verboselog( device->machine(), 5, "NAND data read %02X\n", data); + verboselog( device->machine(), 5, "NAND read data %02X [%04X]\n", data, s3c24xx->nand.data_count++); s3c24xx_nand_update_ecc( device, data); return data; } static void s3c24xx_nand_data_w( device_t *device, UINT8 data) { - verboselog( device->machine(), 5, "NAND write data %02X\n", data); + s3c24xx_t *s3c24xx = get_token( device); + verboselog( device->machine(), 5, "NAND write data %02X [%04X]\n", data, s3c24xx->nand.data_count++); iface_nand_data_w( device, data); s3c24xx_nand_update_ecc( device, data); } @@ -2963,17 +3345,20 @@ case S3C24XX_NFDATA : { data = 0; + #if defined(DEVICE_S3C2410) + data = data | s3c24xx_nand_data_r( device); + #elif defined(DEVICE_S3C2440) if ((mem_mask & 0x000000FF) != 0) data = data | (s3c24xx_nand_data_r( device) << 0); if ((mem_mask & 0x0000FF00) != 0) data = data | (s3c24xx_nand_data_r( device) << 8); if ((mem_mask & 0x00FF0000) != 0) data = data | (s3c24xx_nand_data_r( device) << 16); if ((mem_mask & 0xFF000000) != 0) data = data | (s3c24xx_nand_data_r( device) << 24); + #endif } break; #if defined(DEVICE_S3C2410) case S3C24XX_NFECC : { - data = (s3c24xx->nand.mecc[2] << 16) | (s3c24xx->nand.mecc[1] << 8) | (s3c24xx->nand.mecc[0] << 0); - //data = 0xFFFFFFFF; + data = ((s3c24xx->nand.mecc[2] << 16) | (s3c24xx->nand.mecc[1] << 8) | (s3c24xx->nand.mecc[0] << 0)); } break; #endif @@ -3009,26 +3394,22 @@ { s3c24xx_t *s3c24xx = get_token( device); verboselog( device->machine(), 5, "NAND - init ecc\n"); -#if defined(DEVICE_S3C2410) - s3c24xx->nand.mecc[0] = 0; - s3c24xx->nand.mecc[1] = 0; - s3c24xx->nand.mecc[2] = 0; -#else - s3c24xx->nand.mecc[0] = 0; - s3c24xx->nand.mecc[1] = 0; - s3c24xx->nand.mecc[2] = 0; - s3c24xx->nand.mecc[3] = 0; + s3c24xx->nand.mecc[0] = 0xFF; + s3c24xx->nand.mecc[1] = 0xFF; + s3c24xx->nand.mecc[2] = 0xFF; + #if defined(DEVICE_S3C2440) + s3c24xx->nand.mecc[3] = 0xFF; s3c24xx->nand.secc[0] = 0; s3c24xx->nand.secc[1] = 0; -#endif - s3c24xx->nand.pos = 0; + #endif + s3c24xx->nand.ecc_pos = 0; } static WRITE32_DEVICE_HANDLER( s3c24xx_nand_w ) { s3c24xx_t *s3c24xx = get_token( device); UINT32 old_value = ((UINT32*)&s3c24xx->nand.regs)[offset]; - verboselog( device->machine(), 9, "(NAND) %08X <- %08X\n", S3C24XX_BASE_NAND + (offset << 2), data); + verboselog( device->machine(), 9, "(NAND) %08X <- %08X (%08X)\n", S3C24XX_BASE_NAND + (offset << 2), data, mem_mask); COMBINE_DATA(&((UINT32*)&s3c24xx->nand.regs)[offset]); switch (offset) { @@ -3054,7 +3435,7 @@ #endif case S3C24XX_NFSTAT : { - s3c24xx->nand.regs.nfstat = (s3c24xx->nand.regs.nfstat & ~0x03) | (old_value & 0x03); + s3c24xx->nand.regs.nfstat = (s3c24xx->nand.regs.nfstat & ~0x03) | (old_value & 0x03); // read-only #if defined(DEVICE_S3C2440) if ((data & (1 << 2)) != 0) { @@ -3075,10 +3456,14 @@ break; case S3C24XX_NFDATA : { + #if defined(DEVICE_S3C2410) + s3c24xx_nand_data_w( device, data & 0xFF); + #elif defined(DEVICE_S3C2440) if ((mem_mask & 0x000000FF) != 0) s3c24xx_nand_data_w( device, (data >> 0) & 0xFF); if ((mem_mask & 0x0000FF00) != 0) s3c24xx_nand_data_w( device, (data >> 8) & 0xFF); if ((mem_mask & 0x00FF0000) != 0) s3c24xx_nand_data_w( device, (data >> 16) & 0xFF); if ((mem_mask & 0xFF000000) != 0) s3c24xx_nand_data_w( device, (data >> 24) & 0xFF); + #endif } break; } @@ -3087,6 +3472,7 @@ ATTR_UNUSED static WRITE_LINE_DEVICE_HANDLER( s3c24xx_pin_frnb_w ) { s3c24xx_t *s3c24xx = get_token( device); + verboselog( device->machine(), 9, "s3c24xx_pin_frnb_w (%d)\n", state); #if defined(DEVICE_S3C2440) if ((BIT( s3c24xx->nand.regs.nfstat, 0) == 0) && (state != 0)) { @@ -3113,6 +3499,13 @@ #if defined(DEVICE_S3C2440) +static void s3c24xx_cam_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_cam_t *cam = &s3c24xx->cam; + memset( &cam->regs, 0, sizeof( cam->regs)); +} + static READ32_DEVICE_HANDLER( s3c24xx_cam_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -3134,6 +3527,13 @@ #if defined(DEVICE_S3C2440) +static void s3c24xx_ac97_reset( device_t *device) +{ + s3c24xx_t *s3c24xx = get_token( device); + s3c24xx_ac97_t *ac97 = &s3c24xx->ac97; + memset( &ac97->regs, 0, sizeof( ac97->regs)); +} + static READ32_DEVICE_HANDLER( s3c24xx_ac97_r ) { s3c24xx_t *s3c24xx = get_token( device); @@ -3153,31 +3553,147 @@ // ... -static DEVICE_RESET( s3c24xx ) -{ - s3c24xx_t *s3c24xx = get_token( device); - s3c24xx->iis.fifo_index = 0; -// s3c24xx->iic.data_index = 0; #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) - s3c24xx->gpio.regs.gstatus2 = 0x00000001; // Boot is caused by power on reset + +static void s3c24xx_nand_auto_boot( device_t *device) +{ + int om0 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM0); + int om1 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM1); + if ((om0 == 0) && (om1 == 0)) + { + s3c24xx_t *s3c24xx = get_token( device); + int ncon = iface_core_pin_r( device, S3C24XX_CORE_PIN_NCON); + UINT8 *ptr = s3c24xx->steppingstone; + int page_size, address_cycle; + #if defined(DEVICE_S3C2410) + page_size = 512; + if (ncon == 0) + { + address_cycle = 3; // byte-page-page + } + else + { + address_cycle = 4; // byte-page-page-page + } + #elif defined(DEVICE_S3C2440) + UINT32 port_g = iface_gpio_port_r( device, S3C24XX_GPIO_PORT_G, 0); + if (ncon == 0) + { + if (BIT( port_g, 13) == 0) + { + page_size = 256; + address_cycle = 3; // byte-page-page + } + else + { + page_size = 512; + address_cycle = 4; // byte-page-page-page + } + } + else + { + if (BIT( port_g, 13) == 0) + { + page_size = 1024; + address_cycle = 4; // byte-byte-page-page or byte-page-page-page ??? assume latter + } + else + { + page_size = 2048; + address_cycle = 5; // byte-byte-page-page-page + } + } + #endif + iface_nand_command_w( device, 0xFF); + for (int page = 0; page < (4 * 1024) / page_size; page++) + { + iface_nand_command_w( device, 0x00); + iface_nand_address_w( device, 0x00); + if (address_cycle > 4) + { + iface_nand_address_w( device, 0x00); + } + iface_nand_address_w( device, (page >> 0) & 0xFF); + iface_nand_address_w( device, (page >> 8) & 0xFF); + if (address_cycle > 3) + { + iface_nand_address_w( device, (page >> 16) & 0xFF); + } + for (int i = 0; i < page_size; i++) + { + *ptr++ = iface_nand_data_r( device); + } + } + iface_nand_command_w( device, 0xFF); + } +} + #endif - s3c24xx->irq.line_irq = s3c24xx->irq.line_fiq = CLEAR_LINE; + +static DEVICE_RESET( s3c24xx ) +{ + verboselog( device->machine(), 1, "s3c24xx device reset\n"); + s3c24xx_uart_reset( device); + s3c24xx_pwm_reset( device); + s3c24xx_dma_reset( device); + s3c24xx_iic_reset( device); + s3c24xx_iis_reset( device); + s3c24xx_lcd_reset( device); + s3c24xx_rtc_reset( device); + s3c24xx_wdt_reset( device); + s3c24xx_irq_reset( device); + s3c24xx_gpio_reset( device); + s3c24xx_memcon_reset( device); + s3c24xx_clkpow_reset( device); + s3c24xx_usb_host_reset( device); + s3c24xx_usb_device_reset( device); + s3c24xx_adc_reset( device); + s3c24xx_spi_reset( device); + #if defined(DEVICE_S3C2400) + s3c24xx_mmc_reset( device); + #endif + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + s3c24xx_sdi_reset( device); + s3c24xx_nand_reset( device); + #endif + #if defined(DEVICE_S3C2440) + s3c24xx_cam_reset( device); + s3c24xx_ac97_reset( device); + #endif + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + s3c24xx_nand_auto_boot( device); + #endif } static DEVICE_START( s3c24xx ) { s3c24xx_t *s3c24xx = get_token( device); + verboselog( device->machine(), 1, "s3c24xx device start\n"); s3c24xx->iface = (const s3c24xx_interface *)device->static_config(); - for (int i = 0; i < 5; i++) s3c24xx->pwm.timer[i] = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_pwm_timer_exp), (void*)device); - for (int i = 0; i < 4; i++) s3c24xx->dma[i].timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_dma_timer_exp), (void*)device); + for (int i = 0; i < 5; i++) + { + s3c24xx->pwm.timer[i] = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_pwm_timer_exp), (void*)device); + } + for (int i = 0; i < S3C24XX_DMA_COUNT; i++) + { + s3c24xx->dma[i].timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_dma_timer_exp), (void*)device); + } s3c24xx->iic.timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_iic_timer_exp), (void*)device); s3c24xx->iis.timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_iis_timer_exp), (void*)device); s3c24xx->lcd.timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_lcd_timer_exp), (void*)device); s3c24xx->rtc.timer_tick_count = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_rtc_timer_tick_count_exp), (void*)device); s3c24xx->rtc.timer_update = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_rtc_timer_update_exp), (void*)device); s3c24xx->wdt.timer = device->machine().scheduler().timer_alloc( FUNC(s3c24xx_wdt_timer_exp), (void*)device); - s3c24xx->rtc.timer_update->adjust( attotime::from_msec( 1000), 0, attotime::from_msec( 1000)); - s3c24xx_rtc_init( device); + #if defined(DEVICE_S3C2410) || defined(DEVICE_S3C2440) + int om0 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM0); + int om1 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM1); + if ((om0 == 0) && (om1 == 0)) + { + address_space *space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); + space->install_ram( 0x00000000, 0x00000fff, s3c24xx->steppingstone); + space->install_ram( 0x40000000, 0x40000fff, s3c24xx->steppingstone); + } + #endif } static DEVICE_GET_INFO( s3c24xx ) diff -Nru mame-0.144/src/emu/machine/scsihd.c mame-0.145/src/emu/machine/scsihd.c --- mame-0.144/src/emu/machine/scsihd.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/machine/scsihd.c 2012-02-06 21:30:28.000000000 +0000 @@ -14,8 +14,10 @@ { UINT32 lba; UINT32 blocks; + int sectorbytes; + chd_file *handle; hard_disk_file *disk; - bool is_file; + bool is_image_device; } SCSIHd; @@ -45,7 +47,7 @@ logerror("SCSIHD: READ at LBA %x for %x blocks\n", our_this->lba, our_this->blocks); SCSISetPhase( scsiInstance, SCSI_PHASE_DATAIN ); - return our_this->blocks * 512; + return our_this->blocks * our_this->sectorbytes; case 0x0a: // WRITE(6) our_this->lba = (command[1]&0x1f)<<16 | command[2]<<8 | command[3]; @@ -54,7 +56,7 @@ logerror("SCSIHD: WRITE to LBA %x for %x blocks\n", our_this->lba, our_this->blocks); SCSISetPhase( scsiInstance, SCSI_PHASE_DATAOUT ); - return our_this->blocks * 512; + return our_this->blocks * our_this->sectorbytes; case 0x12: // INQUIRY SCSISetPhase( scsiInstance, SCSI_PHASE_DATAIN ); @@ -80,7 +82,7 @@ logerror("SCSIHD: READ at LBA %x for %x blocks\n", our_this->lba, our_this->blocks); SCSISetPhase( scsiInstance, SCSI_PHASE_DATAIN ); - return our_this->blocks * 512; + return our_this->blocks * our_this->sectorbytes; case 0x2a: // WRITE (10) our_this->lba = command[2]<<24 | command[3]<<16 | command[4]<<8 | command[5]; @@ -90,7 +92,7 @@ SCSISetPhase( scsiInstance, SCSI_PHASE_DATAOUT ); - return our_this->blocks * 512; + return our_this->blocks * our_this->sectorbytes; case 0xa8: // READ(12) our_this->lba = command[2]<<24 | command[3]<<16 | command[4]<<8 | command[5]; @@ -99,7 +101,7 @@ logerror("SCSIHD: READ at LBA %x for %x blocks\n", our_this->lba, our_this->blocks); SCSISetPhase( scsiInstance, SCSI_PHASE_DATAIN ); - return our_this->blocks * 512; + return our_this->blocks * our_this->sectorbytes; default: return SCSIBase( &SCSIClassHARDDISK, SCSIOP_EXEC_COMMAND, scsiInstance, 0, NULL ); @@ -168,8 +170,8 @@ } our_this->lba++; our_this->blocks--; - dataLength -= 512; - data += 512; + dataLength -= our_this->sectorbytes; + data += our_this->sectorbytes; } } break; @@ -231,8 +233,8 @@ } our_this->lba++; our_this->blocks--; - dataLength -= 512; - data += 512; + dataLength -= our_this->sectorbytes; + data += our_this->sectorbytes; } } break; @@ -250,19 +252,52 @@ our_this->lba = 0; our_this->blocks = 0; + our_this->sectorbytes = 512; + // Attempt to register save state entry after state registration is closed! state_save_register_item( machine, "scsihd", diskregion, 0, our_this->lba ); state_save_register_item( machine, "scsihd", diskregion, 0, our_this->blocks ); - if (machine.device( diskregion )) { - our_this->is_file = TRUE; - our_this->disk = machine.device(diskregion)->get_hard_disk_file(); - } else { - our_this->is_file = FALSE; - our_this->disk = hard_disk_open(get_disk_handle( machine, diskregion )); + // try to locate the CHD from a DISK_REGION + our_this->handle = get_disk_handle(machine, diskregion); + our_this->disk = hard_disk_open(our_this->handle); + our_this->is_image_device = false; + + if (our_this->disk == NULL) + { + // try to locate the CHD from an image device + harddisk_image_device *image_device = machine.device(diskregion); + + if (image_device != NULL) + { + our_this->handle = image_device->get_chd_file(); + our_this->disk = hard_disk_open(our_this->handle); + our_this->is_image_device = true; + } } - if (!our_this->disk) + if (our_this->disk == NULL) + { + // try to locate the CHD from an image subdevice + device_iterator iter(machine.root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + { + if (device->subdevice(diskregion) != NULL) + { + our_this->handle = device->subdevice(diskregion)->get_chd_file(); + our_this->disk = hard_disk_open(our_this->handle); + our_this->is_image_device = true; + } + } + } + + if (our_this->disk != NULL) + { + // get hard disk sector size from CHD metadata + const hard_disk_info *hdinfo = hard_disk_get_info(our_this->disk); + our_this->sectorbytes = hdinfo->sectorbytes; + } + else { logerror("SCSIHD: no HD found!\n"); } @@ -271,7 +306,7 @@ static void scsihd_delete_instance( SCSIInstance *scsiInstance ) { SCSIHd *our_this = (SCSIHd *)SCSIThis( &SCSIClassHARDDISK, scsiInstance ); - if (!our_this->is_file) { + if (!our_this->is_image_device) { if( our_this->disk ) { hard_disk_close( our_this->disk ); diff -Nru mame-0.144/src/emu/machine/v3021.c mame-0.145/src/emu/machine/v3021.c --- mame-0.144/src/emu/machine/v3021.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/v3021.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,183 @@ +/*************************************************************************** + + v3021.c + + EM Microelectronic-Marin SA Ultra Low Power 32kHz CMOS RTC (DIP8) + + Serial Real Time Clock + + - very preliminary, borrowed from hard-coded PGM implementation. + +***************************************************************************/ + +#include "emu.h" +#include "machine/v3021.h" + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type v3021 = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// v3021_device - constructor +//------------------------------------------------- + +v3021_device::v3021_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, v3021, "v3021", tag, owner, clock) +{ + +} + +void v3021_device::timer_callback() +{ + static const UINT8 dpm[12] = { 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31 }; + int dpm_count; + + m_rtc.sec++; + + if((m_rtc.sec & 0x0f) >= 0x0a) { m_rtc.sec+=0x10; m_rtc.sec&=0xf0; } + if((m_rtc.sec & 0xf0) >= 0x60) { m_rtc.min++; m_rtc.sec = 0; } + if((m_rtc.min & 0x0f) >= 0x0a) { m_rtc.min+=0x10; m_rtc.min&=0xf0; } + if((m_rtc.min & 0xf0) >= 0x60) { m_rtc.hour++; m_rtc.min = 0; } + if((m_rtc.hour & 0x0f) >= 0x0a) { m_rtc.hour+=0x10; m_rtc.hour&=0xf0; } + if((m_rtc.hour & 0xff) >= 0x24) { m_rtc.day++; m_rtc.wday<<=1; m_rtc.hour = 0; } + if(m_rtc.wday & 0x80) { m_rtc.wday = 1; } + if((m_rtc.day & 0x0f) >= 0x0a) { m_rtc.day+=0x10; m_rtc.day&=0xf0; } + + /* TODO: crude leap year support */ + dpm_count = (m_rtc.month & 0xf) + (((m_rtc.month & 0x10) >> 4)*10)-1; + + if(((m_rtc.year % 4) == 0) && m_rtc.month == 2) + { + if((m_rtc.day & 0xff) >= dpm[dpm_count]+1+1) + { m_rtc.month++; m_rtc.day = 0x01; } + } + else if((m_rtc.day & 0xff) >= dpm[dpm_count]+1){ m_rtc.month++; m_rtc.day = 0x01; } + if((m_rtc.month & 0x0f) >= 0x0a) { m_rtc.month = 0x10; } + if(m_rtc.month >= 0x13) { m_rtc.year++; m_rtc.month = 1; } + if((m_rtc.year & 0x0f) >= 0x0a) { m_rtc.year+=0x10; m_rtc.year&=0xf0; } + if((m_rtc.year & 0xf0) >= 0xa0) { m_rtc.year = 0; } //2000-2099 possible timeframe +} + +TIMER_CALLBACK( v3021_device::rtc_inc_callback ) +{ + reinterpret_cast(ptr)->timer_callback(); +} + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void v3021_device::device_validity_check(validity_checker &valid) const +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void v3021_device::device_start() +{ + /* let's call the timer callback every second */ + machine().scheduler().timer_pulse(attotime::from_hz(clock() / XTAL_32_768kHz), FUNC(rtc_inc_callback), 0, (void *)this); + + system_time systime; + machine().base_datetime(systime); + + m_rtc.day = ((systime.local_time.mday / 10)<<4) | ((systime.local_time.mday % 10) & 0xf); + m_rtc.month = (((systime.local_time.month+1) / 10) << 4) | (((systime.local_time.month+1) % 10) & 0xf); + m_rtc.wday = 1 << systime.local_time.weekday; + m_rtc.year = (((systime.local_time.year % 100)/10)<<4) | ((systime.local_time.year % 10) & 0xf); + m_rtc.hour = ((systime.local_time.hour / 10)<<4) | ((systime.local_time.hour % 10) & 0xf); + m_rtc.min = ((systime.local_time.minute / 10)<<4) | ((systime.local_time.minute % 10) & 0xf); + m_rtc.sec = ((systime.local_time.second / 10)<<4) | ((systime.local_time.second % 10) & 0xf); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void v3021_device::device_reset() +{ +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +READ8_MEMBER( v3021_device::read ) +{ + UINT8 calr = (m_cal_val & m_cal_mask) ? 1 : 0; + + m_cal_mask <<= 1; + return calr; +} + +WRITE8_MEMBER( v3021_device::write ) +{ + m_cal_com <<= 1; + m_cal_com |= data & 1; + ++m_cal_cnt; + + if (m_cal_cnt == 4) + { + m_cal_mask = 1; + m_cal_val = 1; + m_cal_cnt = 0; + + switch (m_cal_com & 0xf) + { + case 1: case 3: case 5: case 7: case 9: case 0xb: case 0xd: + m_cal_val++; + break; + + case 0: + m_cal_val = (m_rtc.wday); //?? + break; + + case 2: //Hours + m_cal_val = (m_rtc.hour); + break; + + case 4: //Seconds + m_cal_val = (m_rtc.sec); + break; + + case 6: //Month + m_cal_val = (m_rtc.month); //?? not bcd in MVS + break; + + case 8: + m_cal_val = 0; //Controls blinking speed, maybe milliseconds + break; + + case 0xa: //Day + m_cal_val = (m_rtc.day); + break; + + case 0xc: //Minute + m_cal_val = (m_rtc.min); + break; + + case 0xe: //Year + m_cal_val = (m_rtc.year % 100); + break; + + case 0xf: //Load Date + //space->machine().base_datetime(m_systime); + break; + } + } +} diff -Nru mame-0.144/src/emu/machine/v3021.h mame-0.145/src/emu/machine/v3021.h --- mame-0.144/src/emu/machine/v3021.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/machine/v3021.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,77 @@ +/*************************************************************************** + + v3021.h + + EM Microelectronic-Marin SA Ultra Low Power 32kHz CMOS RTC (DIP8) + + Serial Real Time Clock + +***************************************************************************/ + +#pragma once + +#ifndef __v3021DEV_H__ +#define __v3021DEV_H__ + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_V3021_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, v3021, XTAL_32_768kHz) \ + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef struct +{ + UINT8 sec, min, hour, day, wday, month, year; +} rtc_regs_t; + + +// ======================> v3021_device + +class v3021_device : public device_t +{ +public: + // construction/destruction + v3021_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( read ); + void timer_callback(); + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); + + inline UINT8 rtc_read(UINT8 offset); + inline void rtc_write(UINT8 offset,UINT8 data); + + static TIMER_CALLBACK( rtc_inc_callback ); + + UINT8 m_cal_mask,m_cal_com,m_cal_cnt,m_cal_val; + + rtc_regs_t m_rtc; +}; + + +// device type definition +extern const device_type v3021; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff -Nru mame-0.144/src/emu/machine/wd17xx.c mame-0.145/src/emu/machine/wd17xx.c --- mame-0.144/src/emu/machine/wd17xx.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine/wd17xx.c 2012-02-06 21:30:27.000000000 +0000 @@ -1247,14 +1247,7 @@ if (w->intf->floppy_drive_tags[drive] != NULL) { - if (device->owner() != NULL) { - w->drive = device->owner()->subdevice(w->intf->floppy_drive_tags[drive]); - if (w->drive == NULL) { - w->drive = device->machine().device(w->intf->floppy_drive_tags[drive]); - } - } - else - w->drive = device->machine().device(w->intf->floppy_drive_tags[drive]); + w->drive = device->siblingdevice(w->intf->floppy_drive_tags[drive]); } } @@ -2083,14 +2076,7 @@ if(w->intf->floppy_drive_tags[i]!=NULL) { device_t *img = NULL; - if (device->owner() != NULL) - img = device->owner()->subdevice(w->intf->floppy_drive_tags[i]); - if (img == NULL) { - img = device->machine().device(w->intf->floppy_drive_tags[i]); - } - - else - img = device->machine().device(w->intf->floppy_drive_tags[i]); + img = device->siblingdevice(w->intf->floppy_drive_tags[i]); if (img!=NULL) { floppy_drive_set_controller(img,device); diff -Nru mame-0.144/src/emu/machine/z80dma.c mame-0.145/src/emu/machine/z80dma.c --- mame-0.144/src/emu/machine/z80dma.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine/z80dma.c 2012-02-06 21:30:28.000000000 +0000 @@ -597,10 +597,11 @@ { UINT8 res; - if(m_read_num_follow == 0) /* TODO: should return the status, but let me know WHAT uses this first */ - fatalerror("Z80DMA '%s' Read without anything setted into stack", tag()); + if(m_read_num_follow == 0) // special case: Legend of Kage on X1 Turbo + res = m_status; + else + res = m_read_regs_follow[m_read_cur_follow]; - res = m_read_regs_follow[m_read_cur_follow]; m_read_cur_follow++; if(m_read_cur_follow >= m_read_num_follow) diff -Nru mame-0.144/src/emu/machine.c mame-0.145/src/emu/machine.c --- mame-0.144/src/emu/machine.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine.c 2012-02-06 21:30:28.000000000 +0000 @@ -111,6 +111,7 @@ #include "cheat.h" #include "ui.h" #include "uimenu.h" +#include "uimain.h" #include "uiinput.h" #include "crsshair.h" #include "validity.h" @@ -145,13 +146,10 @@ pens(NULL), colortable(NULL), shadow_table(NULL), - priority_bitmap(NULL), debug_flags(0), memory_data(NULL), palette_data(NULL), - tilemap_data(NULL), romload_data(NULL), - input_data(NULL), input_port_data(NULL), ui_input_data(NULL), debugcpu_data(NULL), @@ -170,8 +168,8 @@ m_input(NULL), m_sound(NULL), m_video(NULL), + m_tilemap(NULL), m_debug_view(NULL), - m_driver_device(NULL), m_current_phase(MACHINE_PHASE_PREINIT), m_paused(false), m_hard_reset_pending(false), @@ -194,21 +192,19 @@ memset(&m_base_time, 0, sizeof(m_base_time)); // set the machine on all devices - const_cast(devicelist()).set_machine_all(*this); - - // find the driver device config and tell it which game - m_driver_device = device("root"); - if (m_driver_device == NULL) - throw emu_fatalerror("Machine configuration missing driver_device"); + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + device->set_machine(*this); // find devices - primary_screen = downcast(devicelist().first(SCREEN)); - for (device_t *device = devicelist().first(); device != NULL; device = device->next()) + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (dynamic_cast(device) != NULL) { firstcpu = downcast(device); break; } + screen_device_iterator screeniter(root_device()); + primary_screen = screeniter.first(); // fetch core options if (options().debug()) @@ -305,8 +301,9 @@ // initialize image devices image_init(*this); - tilemap_init(*this); + m_tilemap = auto_alloc(*this, tilemap_manager(*this)); crosshair_init(*this); + network_init(*this); // initialize the debugger if ((debug_flags & DEBUG_FLAG_ENABLED) != 0) @@ -317,8 +314,12 @@ // so this location in the init order is important ui_set_startup_text(*this, "Initializing...", true); - // start up the devices - const_cast(devicelist()).start_all(); + // register callbacks for the devices, then start them + add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(running_machine::reset_all_devices), this)); + add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(running_machine::stop_all_devices), this)); + save().register_presave(save_prepost_delegate(FUNC(running_machine::presave_all_devices), this)); + save().register_postload(save_prepost_delegate(FUNC(running_machine::postload_all_devices), this)); + start_all_devices(); // if we're coming in with a savegame request, process it now const char *savegame = options().state(); @@ -343,25 +344,15 @@ device_t &running_machine::add_dynamic_device(device_t &owner, device_type type, const char *tag, UINT32 clock) { - // allocate and append this device - astring fulltag; - owner.subtag(fulltag, tag); - device_t &device = const_cast(devicelist()).append(fulltag, *type(m_config, fulltag, &owner, clock)); - - // append any machine config additions from new devices - for (device_t *curdevice = devicelist().first(); curdevice != NULL; curdevice = curdevice->next()) - if (!curdevice->configured()) - { - machine_config_constructor machconfig = curdevice->machine_config_additions(); - if (machconfig != NULL) - (*machconfig)(const_cast(m_config), curdevice); - } + // add the device in a standard manner + device_t *device = const_cast(m_config).device_add(&owner, tag, type, clock); - // notify any new devices that their configurations are complete - for (device_t *curdevice = devicelist().first(); curdevice != NULL; curdevice = curdevice->next()) - if (!curdevice->configured()) - curdevice->config_complete(); - return device; + // notify this device and all its subdevices that they are now configured + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + if (!device->configured()) + device->config_complete(); + return *device; } @@ -449,6 +440,10 @@ error = MAMERR_FATALERROR; } + // make sure our phase is set properly before cleaning up, + // in case we got here via exception + m_current_phase = MACHINE_PHASE_EXIT; + // call all exit callbacks registered call_notifiers(MACHINE_NOTIFY_EXIT); zip_file_cache_clear(); @@ -628,6 +623,7 @@ memory_region *running_machine::region_alloc(const char *name, UINT32 length, UINT8 width, endianness_t endian) { +mame_printf_verbose("Region '%s' created\n", name); // make sure we don't have a region of the same name; also find the end of the list memory_region *info = m_regionlist.find(name); if (info != NULL) @@ -882,6 +878,113 @@ machine.m_logfile->puts(buffer); } + +//------------------------------------------------- +// start_all_devices - start any unstarted devices +//------------------------------------------------- + +void running_machine::start_all_devices() +{ + // iterate through the devices + int last_failed_starts = -1; + while (last_failed_starts != 0) + { + // iterate over all devices + int failed_starts = 0; + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + if (!device->started()) + { + // attempt to start the device, catching any expected exceptions + try + { + // if the device doesn't have a machine yet, set it first + if (device->m_machine == NULL) + device->set_machine(*this); + + // now start the device + mame_printf_verbose("Starting %s '%s'\n", device->name(), device->tag()); + device->start(); + } + + // handle missing dependencies by moving the device to the end + catch (device_missing_dependencies &) + { + // if we're the end, fail + mame_printf_verbose(" (missing dependencies; rescheduling)\n"); + failed_starts++; + } + } + + // each iteration should reduce the number of failed starts; error if + // this doesn't happen + if (failed_starts == last_failed_starts) + throw emu_fatalerror("Circular dependency in device startup!"); + last_failed_starts = failed_starts; + } +} + + +//------------------------------------------------- +// reset_all_devices - reset all devices in the +// hierarchy +//------------------------------------------------- + +void running_machine::reset_all_devices() +{ + // reset the root and it will reset children + root_device().reset(); +} + + +//------------------------------------------------- +// stop_all_devices - stop all the devices in the +// hierarchy +//------------------------------------------------- + +void running_machine::stop_all_devices() +{ + // first let the debugger save comments + if ((debug_flags & DEBUG_FLAG_ENABLED) != 0) + debug_comment_save(*this); + + // iterate over devices and stop them + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + device->stop(); + + // then nuke the device tree +// global_free(m_root_device); +} + + +//------------------------------------------------- +// presave_all_devices - tell all the devices we +// are about to save +//------------------------------------------------- + +void running_machine::presave_all_devices() +{ + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + device->pre_save(); +} + + +//------------------------------------------------- +// postload_all_devices - tell all the devices we +// just completed a load +//------------------------------------------------- + +void running_machine::postload_all_devices() +{ + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) + device->post_load(); +} + + + /*************************************************************************** MEMORY REGIONS ***************************************************************************/ @@ -952,7 +1055,10 @@ driver_device::driver_device(const machine_config &mconfig, device_type type, const char *tag) : device_t(mconfig, type, "Driver Device", tag, NULL, 0), m_system(NULL), - m_palette_init(NULL) + m_palette_init(NULL), + m_generic_paletteram(*this, "paletteram"), + m_generic_paletteram16(*this, "paletteram"), + m_generic_paletteram2(*this, "paletteram2") { memset(m_callbacks, 0, sizeof(m_callbacks)); } @@ -1106,27 +1212,6 @@ //------------------------------------------------- -// video_update - default implementation which -// calls to the legacy video_update function -//------------------------------------------------- - -bool driver_device::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) -{ - return 0; -} - - -//------------------------------------------------- -// video_eof - default implementation which -// calls to the legacy video_eof function -//------------------------------------------------- - -void driver_device::screen_eof() -{ -} - - -//------------------------------------------------- // device_rom_region - return a pointer to the // game's ROMs //------------------------------------------------- @@ -1156,8 +1241,10 @@ void driver_device::device_start() { // reschedule ourselves to be last - if (next() != NULL) - throw device_missing_dependencies(); + device_iterator iter(*this); + for (device_t *test = iter.first(); test != NULL; test = iter.next()) + if (test != this && !test->started()) + throw device_missing_dependencies(); // call the game-specific init if (m_system->driver_init != NULL) @@ -1179,11 +1266,12 @@ //------------------------------------------------- -// device_reset - device override which calls -// the various helpers +// device_reset_after_children - device override +// which calls the various helpers; must happen +// after all child devices are reset //------------------------------------------------- -void driver_device::device_reset() +void driver_device::device_reset_after_children() { // reset each piece driver_reset(); diff -Nru mame-0.144/src/emu/machine.h mame-0.145/src/emu/machine.h --- mame-0.144/src/emu/machine.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/machine.h 2012-02-06 21:30:28.000000000 +0000 @@ -160,6 +160,10 @@ #define auto_free(m, v) pool_free(static_cast(m).respool(), v) #define auto_bitmap_alloc(m, w, h, f) auto_alloc(m, bitmap_t(w, h, f)) +#define auto_bitmap_ind8_alloc(m, w, h) auto_alloc(m, bitmap_ind8(w, h)) +#define auto_bitmap_ind16_alloc(m, w, h) auto_alloc(m, bitmap_ind16(w, h)) +#define auto_bitmap_ind32_alloc(m, w, h) auto_alloc(m, bitmap_ind32(w, h)) +#define auto_bitmap_rgb32_alloc(m, w, h) auto_alloc(m, bitmap_rgb32(w, h)) #define auto_strdup(m, s) strcpy(auto_alloc_array(m, char, strlen(s) + 1), s) @@ -175,14 +179,13 @@ class render_manager; class sound_manager; class video_manager; +class tilemap_manager; class debug_view_manager; class osd_interface; typedef struct _memory_private memory_private; typedef struct _palette_private palette_private; -typedef struct _tilemap_private tilemap_private; typedef struct _romload_private romload_private; -typedef struct _input_private input_private; typedef struct _input_port_private input_port_private; typedef struct _ui_input_private ui_input_private; typedef struct _debugcpu_private debugcpu_private; @@ -268,7 +271,6 @@ generic_ptr buffered_spriteram2;// secondary buffered spriteram generic_ptr paletteram; // palette RAM generic_ptr paletteram2; // secondary palette RAM - bitmap_t * tmpbitmap; // temporary bitmap }; @@ -328,7 +330,7 @@ // getters const machine_config &config() const { return m_config; } - const device_list &devicelist() const { return m_config.devicelist(); } + device_t &root_device() const { return m_config.root_device(); } const game_driver &system() const { return m_system; } osd_interface &osd() const { return m_osd; } resource_pool &respool() { return m_respool; } @@ -339,9 +341,10 @@ input_manager &input() const { assert(m_input != NULL); return *m_input; } sound_manager &sound() const { assert(m_sound != NULL); return *m_sound; } video_manager &video() const { assert(m_video != NULL); return *m_video; } + tilemap_manager &tilemap() const { assert(m_tilemap != NULL); return *m_tilemap; } debug_view_manager &debug_view() const { assert(m_debug_view != NULL); return *m_debug_view; } - driver_device *driver_data() const { return m_driver_device; } - template _DriverClass *driver_data() const { return downcast<_DriverClass *>(m_driver_device); } + driver_device *driver_data() const { return &downcast(root_device()); } + template _DriverClass *driver_data() const { return &downcast<_DriverClass &>(root_device()); } machine_phase phase() const { return m_current_phase; } bool paused() const { return m_paused || (m_current_phase != MACHINE_PHASE_RUNNING); } bool exit_pending() const { return m_exit_pending; } @@ -360,7 +363,7 @@ bool scheduled_event_pending() const { return m_exit_pending || m_hard_reset_pending; } // fetch items by name - inline device_t *device(const char *tag); + inline device_t *device(const char *tag) { return root_device().subdevice(tag); } template inline _DeviceClass *device(const char *tag) { return downcast<_DeviceClass *>(device(tag)); } inline const input_port_config *port(const char *tag); inline const memory_region *region(const char *tag); @@ -404,7 +407,7 @@ ioport_list m_portlist; // points to a list of input port configurations // CPU information - cpu_device * firstcpu; // first CPU (allows for quick iteration via typenext) + cpu_device * firstcpu; // first CPU // video-related information gfx_element * gfx[MAX_GFX_ELEMENTS];// array of pointers to graphic sets (chars, sprites) @@ -415,7 +418,7 @@ const pen_t * pens; // remapped palette pen numbers colortable_t * colortable; // global colortable for remapping pen_t * shadow_table; // table for looking up a shadowed pen - bitmap_t * priority_bitmap; // priority bitmap + bitmap_ind8 priority_bitmap; // priority bitmap // debugger-related information UINT32 debug_flags; // the current debug flags @@ -426,9 +429,7 @@ // internal core information memory_private * memory_data; // internal data from memory.c palette_private * palette_data; // internal data from palette.c - tilemap_private * tilemap_data; // internal data from tilemap.c romload_private * romload_data; // internal data from romload.c - input_private * input_data; // internal data from input.c input_port_private * input_port_data; // internal data from inptport.c ui_input_private * ui_input_data; // internal data from uiinput.c debugcpu_private * debugcpu_data; // internal data from debugcpu.c @@ -447,6 +448,13 @@ // internal callbacks static void logfile_callback(running_machine &machine, const char *buffer); + // internal device helpers + void start_all_devices(); + void reset_all_devices(); + void stop_all_devices(); + void presave_all_devices(); + void postload_all_devices(); + // internal state const machine_config & m_config; // reference to the constructed machine_config const game_driver & m_system; // reference to the definition of the game machine @@ -463,11 +471,9 @@ input_manager * m_input; // internal data from input.c sound_manager * m_sound; // internal data from sound.c video_manager * m_video; // internal data from video.c + tilemap_manager * m_tilemap; // internal data from tilemap.c debug_view_manager * m_debug_view; // internal data from debugvw.c - // driver state - driver_device * m_driver_device; // pointer to the current driver device - // system state machine_phase m_current_phase; // current execution phase bool m_paused; // paused? @@ -559,9 +565,105 @@ static void static_set_callback(device_t &device, callback_type type, legacy_callback_func callback); static void static_set_palette_init(device_t &device, palette_init_func callback); - // additional video helpers - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); - virtual void screen_eof(); + // generic helpers + + // watchdog read/write handlers + DECLARE_WRITE8_MEMBER( watchdog_reset_w ); + DECLARE_READ8_MEMBER( watchdog_reset_r ); + DECLARE_WRITE16_MEMBER( watchdog_reset16_w ); + DECLARE_READ16_MEMBER( watchdog_reset16_r ); + DECLARE_WRITE32_MEMBER( watchdog_reset32_w ); + DECLARE_READ32_MEMBER( watchdog_reset32_r ); + + // sound latch readers + DECLARE_READ8_MEMBER( soundlatch_r ); + DECLARE_READ8_MEMBER( soundlatch2_r ); + DECLARE_READ8_MEMBER( soundlatch3_r ); + DECLARE_READ8_MEMBER( soundlatch4_r ); + DECLARE_READ16_MEMBER( soundlatch_word_r ); + DECLARE_READ16_MEMBER( soundlatch2_word_r ); + DECLARE_READ16_MEMBER( soundlatch3_word_r ); + DECLARE_READ16_MEMBER( soundlatch4_word_r ); + + // sound latch writers + DECLARE_WRITE8_MEMBER( soundlatch_w ); + DECLARE_WRITE8_MEMBER( soundlatch2_w ); + DECLARE_WRITE8_MEMBER( soundlatch3_w ); + DECLARE_WRITE8_MEMBER( soundlatch4_w ); + DECLARE_WRITE16_MEMBER( soundlatch_word_w ); + DECLARE_WRITE16_MEMBER( soundlatch2_word_w ); + DECLARE_WRITE16_MEMBER( soundlatch3_word_w ); + DECLARE_WRITE16_MEMBER( soundlatch4_word_w ); + + // sound latch clearers + DECLARE_WRITE8_MEMBER( soundlatch_clear_w ); + DECLARE_WRITE8_MEMBER( soundlatch2_clear_w ); + DECLARE_WRITE8_MEMBER( soundlatch3_clear_w ); + DECLARE_WRITE8_MEMBER( soundlatch4_clear_w ); + + // 3-3-2 RGB palette write handlers + DECLARE_WRITE8_MEMBER( paletteram_BBGGGRRR_w ); + DECLARE_WRITE8_MEMBER( paletteram_RRRGGGBB_w ); + DECLARE_WRITE8_MEMBER( paletteram_BBGGRRII_w ); + DECLARE_WRITE8_MEMBER( paletteram_IIBBGGRR_w ); + + // 4-4-4 RGB palette write handlers + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBGGGGRRRR_le_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBGGGGRRRR_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBGGGGRRRR_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBGGGGRRRR_split2_w ); // uses paletteram2 + DECLARE_WRITE16_MEMBER( paletteram16_xxxxBBBBGGGGRRRR_word_w ); + + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBRRRRGGGG_le_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBRRRRGGGG_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBRRRRGGGG_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xxxxBBBBRRRRGGGG_split2_w ); // uses paletteram2 + DECLARE_WRITE16_MEMBER( paletteram16_xxxxBBBBRRRRGGGG_word_w ); + + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRBBBBGGGG_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRBBBBGGGG_split2_w ); // uses paletteram2 + + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRGGGGBBBB_le_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRGGGGBBBB_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRGGGGBBBB_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xxxxRRRRGGGGBBBB_split2_w ); // uses paletteram2 + DECLARE_WRITE16_MEMBER( paletteram16_xxxxRRRRGGGGBBBB_word_w ); + + DECLARE_WRITE8_MEMBER( paletteram_RRRRGGGGBBBBxxxx_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_RRRRGGGGBBBBxxxx_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_RRRRGGGGBBBBxxxx_split2_w ); // uses paletteram2 + DECLARE_WRITE16_MEMBER( paletteram16_RRRRGGGGBBBBxxxx_word_w ); + + // 4-4-4-4 IRGB palette write handlers + DECLARE_WRITE16_MEMBER( paletteram16_IIIIRRRRGGGGBBBB_word_w ); + DECLARE_WRITE16_MEMBER( paletteram16_RRRRGGGGBBBBIIII_word_w ); + + // 5-5-5 RGB palette write handlers + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBGGGGGRRRRR_le_w ); + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBGGGGGRRRRR_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBGGGGGRRRRR_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBGGGGGRRRRR_split2_w ); // uses paletteram2 + DECLARE_WRITE16_MEMBER( paletteram16_xBBBBBGGGGGRRRRR_word_w ); + + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBRRRRRGGGGG_split1_w ); // uses paletteram + DECLARE_WRITE8_MEMBER( paletteram_xBBBBBRRRRRGGGGG_split2_w ); // uses paletteram2 + + DECLARE_WRITE8_MEMBER( paletteram_xRRRRRGGGGGBBBBB_le_w ); + DECLARE_WRITE8_MEMBER( paletteram_xRRRRRGGGGGBBBBB_be_w ); + DECLARE_WRITE8_MEMBER( paletteram_xRRRRRGGGGGBBBBB_split1_w ); + DECLARE_WRITE8_MEMBER( paletteram_xRRRRRGGGGGBBBBB_split2_w ); + DECLARE_WRITE16_MEMBER( paletteram16_xRRRRRGGGGGBBBBB_word_w ); + + DECLARE_WRITE16_MEMBER( paletteram16_xGGGGGRRRRRBBBBB_word_w ); + DECLARE_WRITE16_MEMBER( paletteram16_xGGGGGBBBBBRRRRR_word_w ); + + DECLARE_WRITE16_MEMBER( paletteram16_RRRRRGGGGGBBBBBx_word_w ); + DECLARE_WRITE16_MEMBER( paletteram16_GGGGGRRRRRBBBBBx_word_w ); + DECLARE_WRITE16_MEMBER( paletteram16_RRRRGGGGBBBBRGBx_word_w ); + + // 8-8-8 RGB palette write handlers + DECLARE_WRITE16_MEMBER( paletteram16_xrgb_word_be_w ); + DECLARE_WRITE16_MEMBER( paletteram16_xbgr_word_be_w ); protected: // helpers called at startup @@ -580,13 +682,24 @@ virtual const rom_entry *device_rom_region() const; virtual ioport_constructor device_input_ports() const; virtual void device_start(); - virtual void device_reset(); + virtual void device_reset_after_children(); + + // internal helpers + inline UINT16 paletteram16_le(offs_t offset) const { return m_generic_paletteram[offset & ~1] | (m_generic_paletteram[offset | 1] << 8); } + inline UINT16 paletteram16_be(offs_t offset) const { return m_generic_paletteram[offset | 1] | (m_generic_paletteram[offset & ~1] << 8); } + inline UINT16 paletteram16_split(offs_t offset) const { return m_generic_paletteram[offset] | (m_generic_paletteram2[offset] << 8); } + inline UINT32 paletteram32_be(offs_t offset) const { return m_generic_paletteram16[offset | 1] | (m_generic_paletteram16[offset & ~1] << 16); } // internal state const game_driver * m_system; // pointer to the game driver legacy_callback_func m_callbacks[CB_COUNT]; // generic legacy callbacks palette_init_func m_palette_init; // one-time palette init callback + + // generic pointers + optional_shared_ptr m_generic_paletteram; + optional_shared_ptr m_generic_paletteram16; + optional_shared_ptr m_generic_paletteram2; }; @@ -605,25 +718,26 @@ // INLINE FUNCTIONS //************************************************************************** -inline device_t *running_machine::device(const char *tag) -{ - return devicelist().find(tag); -} - inline const input_port_config *running_machine::port(const char *tag) { - return m_portlist.find(tag); + // if tag begins with a :, it's absolute + if (tag[0] == ':') + return m_portlist.find(tag); + + // otherwise, compute it relative to the root device + astring fulltag; + return m_portlist.find(root_device().subtag(fulltag, tag).cstr()); } inline const memory_region *running_machine::region(const char *tag) { // if tag begins with a :, it's absolute if (tag[0] == ':') - { - return m_regionlist.find(&tag[1]); - } + return m_regionlist.find(tag); - return m_regionlist.find(tag); + // otherwise, compute it relative to the root device + astring fulltag; + return m_regionlist.find(root_device().subtag(fulltag, tag).cstr()); } diff -Nru mame-0.144/src/emu/mame.c mame-0.145/src/emu/mame.c --- mame-0.144/src/emu/mame.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/mame.c 2012-02-06 21:30:28.000000000 +0000 @@ -104,8 +104,21 @@ static running_machine *global_machine; /* output channels */ -static output_callback_func output_cb[OUTPUT_CHANNEL_COUNT]; -static void *output_cb_param[OUTPUT_CHANNEL_COUNT]; +static output_delegate output_cb[OUTPUT_CHANNEL_COUNT] = +{ + output_delegate(FUNC(mame_file_output_callback), stderr), // OUTPUT_CHANNEL_ERROR + output_delegate(FUNC(mame_file_output_callback), stderr), // OUTPUT_CHANNEL_WARNING + output_delegate(FUNC(mame_file_output_callback), stdout), // OUTPUT_CHANNEL_INFO +#ifdef MAME_DEBUG + output_delegate(FUNC(mame_file_output_callback), stdout), // OUTPUT_CHANNEL_DEBUG +#else + output_delegate(FUNC(mame_null_output_callback), stdout), // OUTPUT_CHANNEL_DEBUG +#endif + output_delegate(FUNC(mame_file_output_callback), stdout), // OUTPUT_CHANNEL_VERBOSE + output_delegate(FUNC(mame_file_output_callback), stdout) // OUTPUT_CHANNEL_LOG +}; + + /*************************************************************************** CORE IMPLEMENTATION @@ -151,7 +164,10 @@ // otherwise, perform validity checks before anything else else - validate_drivers(options, system); + { + validity_checker valid(options); + valid.check_shared_source(*system); + } firstgame = false; @@ -203,20 +219,17 @@ channel -------------------------------------------------*/ -void mame_set_output_channel(output_channel channel, output_callback_func callback, void *param, output_callback_func *prevcb, void **prevparam) +output_delegate mame_set_output_channel(output_channel channel, output_delegate callback) { assert(channel < OUTPUT_CHANNEL_COUNT); - assert(callback != NULL); + assert(!callback.isnull()); /* return the originals if requested */ - if (prevcb != NULL) - *prevcb = output_cb[channel]; - if (prevparam != NULL) - *prevparam = output_cb_param[channel]; + output_delegate prevcb = output_cb[channel]; /* set the new ones */ output_cb[channel] = callback; - output_cb_param[channel] = param; + return prevcb; } @@ -225,9 +238,9 @@ for file output -------------------------------------------------*/ -void mame_file_output_callback(void *param, const char *format, va_list argptr) +void mame_file_output_callback(FILE *param, const char *format, va_list argptr) { - vfprintf((FILE *)param, format, argptr); + vfprintf(param, format, argptr); } @@ -236,7 +249,7 @@ for no output -------------------------------------------------*/ -void mame_null_output_callback(void *param, const char *format, va_list argptr) +void mame_null_output_callback(FILE *param, const char *format, va_list argptr) { } @@ -250,16 +263,9 @@ { va_list argptr; - /* by default, we go to stderr */ - if (output_cb[OUTPUT_CHANNEL_ERROR] == NULL) - { - output_cb[OUTPUT_CHANNEL_ERROR] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_ERROR] = stderr; - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_ERROR])(output_cb_param[OUTPUT_CHANNEL_ERROR], format, argptr); + output_cb[OUTPUT_CHANNEL_ERROR](format, argptr); va_end(argptr); } @@ -273,16 +279,9 @@ { va_list argptr; - /* by default, we go to stderr */ - if (output_cb[OUTPUT_CHANNEL_WARNING] == NULL) - { - output_cb[OUTPUT_CHANNEL_WARNING] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_WARNING] = stderr; - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_WARNING])(output_cb_param[OUTPUT_CHANNEL_WARNING], format, argptr); + output_cb[OUTPUT_CHANNEL_WARNING](format, argptr); va_end(argptr); } @@ -296,16 +295,9 @@ { va_list argptr; - /* by default, we go to stdout */ - if (output_cb[OUTPUT_CHANNEL_INFO] == NULL) - { - output_cb[OUTPUT_CHANNEL_INFO] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_INFO] = stdout; - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_INFO])(output_cb_param[OUTPUT_CHANNEL_INFO], format, argptr); + output_cb[OUTPUT_CHANNEL_INFO](format, argptr); va_end(argptr); } @@ -323,16 +315,9 @@ if (!print_verbose) return; - /* by default, we go to stdout */ - if (output_cb[OUTPUT_CHANNEL_VERBOSE] == NULL) - { - output_cb[OUTPUT_CHANNEL_VERBOSE] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_VERBOSE] = stdout; - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_VERBOSE])(output_cb_param[OUTPUT_CHANNEL_VERBOSE], format, argptr); + output_cb[OUTPUT_CHANNEL_VERBOSE](format, argptr); va_end(argptr); } @@ -346,21 +331,9 @@ { va_list argptr; - /* by default, we go to stderr */ - if (output_cb[OUTPUT_CHANNEL_DEBUG] == NULL) - { -#ifdef MAME_DEBUG - output_cb[OUTPUT_CHANNEL_DEBUG] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_DEBUG] = stdout; -#else - output_cb[OUTPUT_CHANNEL_DEBUG] = mame_null_output_callback; - output_cb_param[OUTPUT_CHANNEL_DEBUG] = NULL; -#endif - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_DEBUG])(output_cb_param[OUTPUT_CHANNEL_DEBUG], format, argptr); + output_cb[OUTPUT_CHANNEL_DEBUG](format, argptr); va_end(argptr); } @@ -375,16 +348,9 @@ { va_list argptr; - /* by default, we go to stderr */ - if (output_cb[OUTPUT_CHANNEL_LOG] == NULL) - { - output_cb[OUTPUT_CHANNEL_LOG] = mame_file_output_callback; - output_cb_param[OUTPUT_CHANNEL_LOG] = stderr; - } - /* do the output */ va_start(argptr, format); - (*output_cb[OUTPUT_CHANNEL_LOG])(output_cb_param[OUTPUT_CHANNEL_LOG], format, argptr); + output_cb[OUTPUT_CHANNEL_LOG])(format, argptr); va_end(argptr); } #endif @@ -428,12 +394,21 @@ void CLIB_DECL logerror(const char *format, ...) { + va_list arg; + va_start(arg, format); + vlogerror(format, arg); + va_end(arg); +} + + +/*------------------------------------------------- + vlogerror - log to the debugger and any other + OSD-defined output streams +-------------------------------------------------*/ + +void CLIB_DECL vlogerror(const char *format, va_list arg) +{ if (global_machine != NULL) - { - va_list arg; - va_start(arg, format); global_machine->vlogerror(format, arg); - va_end(arg); - } } diff -Nru mame-0.144/src/emu/mame.h mame-0.145/src/emu/mame.h --- mame-0.144/src/emu/mame.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/mame.h 2012-02-06 21:30:28.000000000 +0000 @@ -42,60 +42,6 @@ }; -// MESS vs. MAME abstractions -#ifndef MESS -#define APPNAME "MAME" -#define APPNAME_LOWER "mame" -#define CONFIGNAME "mame" -#define APPLONGNAME "M.A.M.E." -#define FULLLONGNAME "Multiple Arcade Machine Emulator" -#define CAPGAMENOUN "GAME" -#define CAPSTARTGAMENOUN "Game" -#define GAMENOUN "game" -#define GAMESNOUN "games" -#define COPYRIGHT "Copyright Nicola Salmoria\nand the MAME team\nhttp://mamedev.org" -#define COPYRIGHT_INFO "Copyright Nicola Salmoria and the MAME team" -#define DISCLAIMER "MAME is an emulator: it reproduces, more or less faithfully, the behaviour of\n" \ - "several arcade machines. But hardware is useless without software, so an image\n" \ - "of the ROMs which run on that hardware is required. Such ROMs, like any other\n" \ - "commercial software, are copyrighted material and it is therefore illegal to\n" \ - "use them if you don't own the original arcade machine. Needless to say, ROMs\n" \ - "are not distributed together with MAME. Distribution of MAME together with ROM\n" \ - "images is a violation of copyright law and should be promptly reported to the\n" \ - "authors so that appropriate legal action can be taken.\n" -#define USAGE "Usage: %s [%s] [options]" -#define XML_ROOT "mame" -#define XML_TOP "game" -#define STATE_MAGIC_NUM 'M', 'A', 'M', 'E', 'S', 'A', 'V', 'E' -#else -#define APPNAME "MESS" -#define APPNAME_LOWER "mess" -#define CONFIGNAME "mess" -#define APPLONGNAME "M.E.S.S." -#define FULLLONGNAME "Multi Emulator Super System" -#define CAPGAMENOUN "SYSTEM" -#define CAPSTARTGAMENOUN "System" -#define GAMENOUN "system" -#define GAMESNOUN "systems" -#define COPYRIGHT "Copyright the MESS team\nhttp://mess.org" -#define COPYRIGHT_INFO "Copyright the MESS team\n\n" \ - "MESS is based on MAME Source code\n" \ - "Copyright Nicola Salmoria and the MAME team" -#define DISCLAIMER "MESS is an emulator: it reproduces, more or less faithfully, the behaviour of\n"\ - "several computer and console systems. But hardware is useless without software\n" \ - "so a file dump of the ROM, cartridges, discs, and cassettes which run on that\n" \ - "hardware is required. Such files, like any other commercial software, are\n" \ - "copyrighted material and it is therefore illegal to use them if you don't own\n" \ - "the original media from which the files are derived. Needless to say, these\n" \ - "files are not distributed together with MESS. Distribution of MESS together\n" \ - "with these files is a violation of copyright law and should be promptly\n" \ - "reported to the authors so that appropriate legal action can be taken.\n" -#define USAGE "Usage: %s [%s] [media] [software] [options]" -#define XML_ROOT "mess" -#define XML_TOP "machine" -#define STATE_MAGIC_NUM 'M', 'E', 'S', 'S', 'S', 'A', 'V', 'E' -#endif - //************************************************************************** @@ -103,7 +49,32 @@ //************************************************************************** // output channel callback -typedef void (*output_callback_func)(void *param, const char *format, va_list argptr); +typedef delegate output_delegate; + +class emulator_info +{ +public: + // construction/destruction + emulator_info() {}; + + static const char * get_appname(); + static const char * get_appname_lower(); + static const char * get_configname(); + static const char * get_applongname(); + static const char * get_fulllongname(); + static const char * get_capgamenoun(); + static const char * get_capstartgamenoun(); + static const char * get_gamenoun(); + static const char * get_gamesnoun(); + static const char * get_copyright(); + static const char * get_copyright_info(); + static const char * get_disclaimer(); + static const char * get_usage(); + static const char * get_xml_root(); + static const char * get_xml_top(); + static const char * get_state_magic_num(); + static void printf_usage(const char *par1, const char *par2); +}; @@ -133,11 +104,11 @@ /* ----- output management ----- */ /* set the output handler for a channel, returns the current one */ -void mame_set_output_channel(output_channel channel, output_callback_func callback, void *param, output_callback_func *prevcb, void **prevparam); +output_delegate mame_set_output_channel(output_channel channel, output_delegate callback); /* built-in default callbacks */ -void mame_file_output_callback(void *param, const char *format, va_list argptr); -void mame_null_output_callback(void *param, const char *format, va_list argptr); +void mame_file_output_callback(FILE *file, const char *format, va_list argptr); +void mame_null_output_callback(FILE *param, const char *format, va_list argptr); /* calls to be used by the code */ void mame_printf_error(const char *format, ...) ATTR_PRINTF(1,2); @@ -161,6 +132,7 @@ // log to the standard error.log file void CLIB_DECL logerror(const char *format,...) ATTR_PRINTF(1,2); +void CLIB_DECL vlogerror(const char *format, va_list arg); #endif /* __MAME_H__ */ diff -Nru mame-0.144/src/emu/mconfig.c mame-0.145/src/emu/mconfig.c --- mame-0.144/src/emu/mconfig.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/mconfig.c 2012-02-06 21:30:28.000000000 +0000 @@ -62,47 +62,51 @@ m_total_colors(0), m_default_layout(NULL), m_gamedrv(gamedrv), - m_options(options) + m_options(options), + m_root_device(NULL) { // construct the config (*gamedrv.machine_config)(*this, NULL); + bool is_selected_driver = strcmp(gamedrv.name,options.system_name())==0; // intialize slot devices - make sure that any required devices have been allocated - device_slot_interface *slot = NULL; - for (bool gotone = m_devicelist.first(slot); gotone; gotone = slot->next(slot)) + slot_interface_iterator slotiter(root_device()); + for (device_slot_interface *slot = slotiter.first(); slot != NULL; slot = slotiter.next()) { const slot_interface *intf = slot->get_slot_interfaces(); if (intf != NULL) { device_t &owner = slot->device(); - const char *selval = options.value(owner.tag()); - if (!options.exists(owner.tag())) - selval = slot->get_default_card(devicelist(), options); + const char *selval = options.value(owner.tag()+1); + if (!is_selected_driver || !options.exists(owner.tag()+1)) + selval = slot->get_default_card(*this, options); - if (selval != NULL && strlen(selval)!=0) { + if (selval != NULL && strlen(selval) != 0) + { bool found = false; - for (int i = 0; intf[i].name != NULL; i++) { - if (strcmp(selval, intf[i].name) == 0) { + for (int i = 0; intf[i].name != NULL; i++) + { + if (strcmp(selval, intf[i].name) == 0) + { device_t *new_dev = device_add(&owner, intf[i].name, intf[i].devtype, 0); found = true; - if (!options.exists(owner.tag())) + const char *def = slot->get_default_card(*this, options); + if (def != NULL && strcmp(def, selval) == 0) device_t::static_set_input_default(*new_dev, slot->input_ports_defaults()); } } - if (!found) - throw emu_fatalerror("Unknown slot option '%s' in slot '%s'", selval, owner.tag()); + if (!found) + throw emu_fatalerror("Unknown slot option '%s' in slot '%s'", selval, owner.tag()+1); } } } // when finished, set the game driver - device_t *root = m_devicelist.find("root"); - if (root == NULL) - throw emu_fatalerror("Machine configuration missing driver_device"); - driver_device::static_set_game(*root, gamedrv); + driver_device::static_set_game(*m_root_device, gamedrv); // then notify all devices that their configuration is complete - for (device_t *device = m_devicelist.first(); device != NULL; device = device->next()) + device_iterator iter(root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) if (!device->configured()) device->config_complete(); } @@ -114,6 +118,7 @@ machine_config::~machine_config() { + global_free(m_root_device); } @@ -124,46 +129,8 @@ screen_device *machine_config::first_screen() const { - return downcast(m_devicelist.first(SCREEN)); -} - - -//------------------------------------------------- -// device_add_subdevices - helper to add -// devices owned by the device -//------------------------------------------------- - -void machine_config::device_add_subdevices(device_t *device) -{ - machine_config_constructor additions = device->machine_config_additions(); - if (additions != NULL) - (*additions)(*this, device); -} - - -//------------------------------------------------- -// device_remove_subdevices - helper to remove -// devices owned by the device -//------------------------------------------------- - -void machine_config::device_remove_subdevices(const device_t *device) -{ - if (device != NULL) - { - device_t *sub_device = m_devicelist.first(); - while (sub_device != NULL) - { - if (sub_device->owner() == device) - device_remove_subdevices(sub_device); - - device_t *next_device = sub_device->next(); - - if (sub_device->owner() == device) - m_devicelist.remove(*sub_device); - - sub_device = next_device; - } - } + screen_device_iterator iter(root_device()); + return iter.first(); } @@ -174,11 +141,19 @@ device_t *machine_config::device_add(device_t *owner, const char *tag, device_type type, UINT32 clock) { - astring tempstring; - const char *fulltag = owner->subtag(tempstring, tag); - device_t *device = &m_devicelist.append(fulltag, *(*type)(*this, fulltag, owner, clock)); - device_add_subdevices(device); - return device; + // if there's an owner, let the owner do the work + if (owner != NULL) + return owner->add_subdevice(type, tag, clock); + + // otherwise, allocate the device directly + assert(m_root_device == NULL); + m_root_device = (*type)(*this, tag, owner, clock); + + // apply any machine configuration owned by the device now + machine_config_constructor additions = m_root_device->machine_config_additions(); + if (additions != NULL) + (*additions)(*this, m_root_device); + return m_root_device; } @@ -189,12 +164,17 @@ device_t *machine_config::device_replace(device_t *owner, const char *tag, device_type type, UINT32 clock) { - astring tempstring; - const char *fulltag = owner->subtag(tempstring, tag); - device_remove_subdevices(m_devicelist.find(fulltag)); - device_t *device = &m_devicelist.replace_and_remove(fulltag, *(*type)(*this, fulltag, owner, clock)); - device_add_subdevices(device); - return device; + // find the original device by this name (must exist) + assert(owner != NULL); + device_t *device = owner->subdevice(tag); + if (device == NULL) + { + mame_printf_warning("Warning: attempting to replace non-existent device '%s'\n", tag); + return device_add(owner, tag, type, clock); + } + + // let the device's owner do the work + return device->owner()->replace_subdevice(*device, type, tag, clock); } @@ -205,11 +185,17 @@ device_t *machine_config::device_remove(device_t *owner, const char *tag) { - astring tempstring; - const char *fulltag = owner->subtag(tempstring, tag); - device_t *device=m_devicelist.find(fulltag); - device_remove_subdevices(device); - m_devicelist.remove(*device); + // find the original device by this name (must exist) + assert(owner != NULL); + device_t *device = owner->subdevice(tag); + if (device == NULL) + { + mame_printf_warning("Warning: attempting to remove non-existent device '%s'\n", tag); + return NULL; + } + + // let the device's owner do the work + device->owner()->remove_subdevice(*device); return NULL; } @@ -221,10 +207,13 @@ device_t *machine_config::device_find(device_t *owner, const char *tag) { - astring tempstring; - const char *fulltag = owner->subtag(tempstring, tag); - device_t *device = m_devicelist.find(fulltag); + // find the original device by this name (must exist) + assert(owner != NULL); + device_t *device = owner->subdevice(tag); + assert(device != NULL); if (device == NULL) - throw emu_fatalerror("Unable to find device: tag=%s\n", fulltag); + throw emu_fatalerror("Unable to find device '%s'\n", tag); + + // return the device return device; } diff -Nru mame-0.144/src/emu/mconfig.h mame-0.145/src/emu/mconfig.h --- mame-0.144/src/emu/mconfig.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/mconfig.h 2012-02-06 21:30:28.000000000 +0000 @@ -131,10 +131,11 @@ // getters const game_driver &gamedrv() const { return m_gamedrv; } - const device_list &devicelist() const { return m_devicelist; } - const device_t *first_device() const { return m_devicelist.first(); } + device_t &root_device() const { assert(m_root_device != NULL); return *m_root_device; } screen_device *first_screen() const; emu_options &options() const { return m_options; } + inline device_t *device(const char *tag) const { return root_device().subdevice(tag); } + template inline _DeviceClass *device(const char *tag) const { return downcast<_DeviceClass *>(device(tag)); } // public state attotime m_minimum_quantum; // minimum scheduling quantum @@ -142,9 +143,11 @@ INT32 m_watchdog_vblank_count; // number of VBLANKs until the watchdog kills us attotime m_watchdog_time; // length of time until the watchdog kills us + // legacy callbacks nvram_handler_func m_nvram_handler; // NVRAM save/load callback memcard_handler_func m_memcard_handler; // memory card save/load callback + // other parameters UINT32 m_video_attributes; // flags describing the video system const gfx_decode_entry *m_gfxdecodeinfo; // pointer to array of graphics decoding information UINT32 m_total_colors; // total number of colors in the palette @@ -157,12 +160,10 @@ device_t *device_find(device_t *owner, const char *tag); private: - void device_add_subdevices(device_t *device); - void device_remove_subdevices(const device_t *device); - + // internal state const game_driver & m_gamedrv; emu_options & m_options; - device_list m_devicelist; // list of device configs + device_t * m_root_device; }; @@ -251,6 +252,8 @@ #define MCFG_MEMCARD_HANDLER(_func) \ config.m_memcard_handler = MEMCARD_HANDLER_NAME(_func); \ +#define MCFG_NVRAM_HANDLER_CLEAR() \ + config.m_nvram_handler = NULL; \ // core video parameters #define MCFG_VIDEO_ATTRIBUTES(_flags) \ diff -Nru mame-0.144/src/emu/memory.c mame-0.145/src/emu/memory.c --- mame-0.144/src/emu/memory.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/memory.c 2012-02-06 21:30:28.000000000 +0000 @@ -1726,8 +1726,8 @@ memdata->banknext = STATIC_BANK1; // loop over devices and spaces within each device - device_memory_interface *memory = NULL; - for (bool gotone = machine.devicelist().first(memory); gotone; gotone = memory->next(memory)) + memory_interface_iterator iter(machine.root_device()); + for (device_memory_interface *memory = iter.first(); memory != NULL; memory = iter.next()) for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) { // if there is a configuration for this space, we need an address space @@ -1781,10 +1781,22 @@ void memory_configure_bank(running_machine &machine, const char *tag, int startentry, int numentries, void *base, offs_t stride) { + memory_configure_bank(machine.root_device(), tag, startentry, numentries, base, stride); +} + + +//------------------------------------------------- +// memory_configure_bank - configure the +// addresses for a bank +//------------------------------------------------- + +void memory_configure_bank(device_t &device, const char *tag, int startentry, int numentries, void *base, offs_t stride) +{ // validation checks - memory_bank *bank = machine.memory_data->bankmap.find_hash_only(tag); + astring fulltag; + memory_bank *bank = device.machine().memory_data->bankmap.find_hash_only(device.subtag(fulltag, tag)); if (bank == NULL) - fatalerror("memory_configure_bank called for unknown bank '%s'", tag); + fatalerror("memory_configure_bank called for unknown bank '%s'", fulltag.cstr()); if (base == NULL) fatalerror("memory_configure_bank called NULL base"); @@ -1795,14 +1807,13 @@ //------------------------------------------------- -// memory_configure_bank - configure the -// addresses for a bank +// memory_configure_bank_decrypted - configure +// the decrypted addresses for a bank //------------------------------------------------- -void memory_configure_bank(device_t *device, const char *tag, int startentry, int numentries, void *base, offs_t stride) +void memory_configure_bank_decrypted(running_machine &machine, const char *tag, int startentry, int numentries, void *base, offs_t stride) { - astring tempstring; - memory_configure_bank(device->machine(), device->subtag(tempstring, tag), startentry, numentries, base, stride); + memory_configure_bank_decrypted(machine.root_device(), tag, startentry, numentries, base, stride); } @@ -1811,12 +1822,13 @@ // the decrypted addresses for a bank //------------------------------------------------- -void memory_configure_bank_decrypted(running_machine &machine, const char *tag, int startentry, int numentries, void *base, offs_t stride) +void memory_configure_bank_decrypted(device_t &device, const char *tag, int startentry, int numentries, void *base, offs_t stride) { // validation checks - memory_bank *bank = machine.memory_data->bankmap.find_hash_only(tag); + astring fulltag; + memory_bank *bank = device.machine().memory_data->bankmap.find_hash_only(device.subtag(fulltag, tag)); if (bank == NULL) - fatalerror("memory_configure_bank_decrypted called for unknown bank '%s'", tag); + fatalerror("memory_configure_bank_decrypted called for unknown bank '%s'", fulltag.cstr()); if (base == NULL) fatalerror("memory_configure_bank_decrypted called NULL base"); @@ -1827,14 +1839,13 @@ //------------------------------------------------- -// memory_configure_bank_decrypted - configure -// the decrypted addresses for a bank +// memory_set_bank - select one pre-configured +// entry to be the new bank base //------------------------------------------------- -void memory_configure_bank_decrypted(device_t *device, const char *tag, int startentry, int numentries, void *base, offs_t stride) +void memory_set_bank(running_machine &machine, const char *tag, int entrynum) { - astring tempstring; - memory_configure_bank_decrypted(device->machine(), device->subtag(tempstring, tag), startentry, numentries, base, stride); + memory_set_bank(machine.root_device(), tag, entrynum); } @@ -1843,12 +1854,13 @@ // entry to be the new bank base //------------------------------------------------- -void memory_set_bank(running_machine &machine, const char *tag, int entrynum) +void memory_set_bank(device_t &device, const char *tag, int entrynum) { // validation checks - memory_bank *bank = machine.memory_data->bankmap.find_hash_only(tag); + astring fulltag; + memory_bank *bank = device.machine().memory_data->bankmap.find_hash_only(device.subtag(fulltag, tag)); if (bank == NULL) - fatalerror("memory_set_bank called for unknown bank '%s'", tag); + fatalerror("memory_set_bank called for unknown bank '%s'", fulltag.cstr()); // set the base bank->set_entry(entrynum); @@ -1856,14 +1868,13 @@ //------------------------------------------------- -// memory_set_bank - select one pre-configured -// entry to be the new bank base +// memory_get_bank - return the currently +// selected bank //------------------------------------------------- -void memory_set_bank(device_t *device, const char *tag, int entrynum) +int memory_get_bank(running_machine &machine, const char *tag) { - astring tempstring; - memory_set_bank(device->machine(), device->subtag(tempstring, tag), entrynum); + return memory_get_bank(machine.root_device(), tag); } @@ -1872,12 +1883,13 @@ // selected bank //------------------------------------------------- -int memory_get_bank(running_machine &machine, const char *tag) +int memory_get_bank(device_t &device, const char *tag) { // validation checks - memory_bank *bank = machine.memory_data->bankmap.find_hash_only(tag); + astring fulltag; + memory_bank *bank = device.machine().memory_data->bankmap.find_hash_only(device.subtag(fulltag, tag)); if (bank == NULL) - fatalerror("memory_get_bank called for unknown bank '%s'", tag); + fatalerror("memory_get_bank called for unknown bank '%s'", fulltag.cstr()); // return the current entry return bank->entry(); @@ -1885,14 +1897,12 @@ //------------------------------------------------- -// memory_get_bank - return the currently -// selected bank +// memory_set_bankptr - set the base of a bank //------------------------------------------------- -int memory_get_bank(device_t *device, const char *tag) +void memory_set_bankptr(running_machine &machine, const char *tag, void *base) { - astring tempstring; - return memory_get_bank(device->machine(), device->subtag(tempstring, tag)); + memory_set_bankptr(machine.root_device(), tag, base); } @@ -1900,12 +1910,13 @@ // memory_set_bankptr - set the base of a bank //------------------------------------------------- -void memory_set_bankptr(running_machine &machine, const char *tag, void *base) +void memory_set_bankptr(device_t &device, const char *tag, void *base) { // validation checks - memory_bank *bank = machine.memory_data->bankmap.find_hash_only(tag); + astring fulltag; + memory_bank *bank = device.machine().memory_data->bankmap.find_hash_only(device.subtag(fulltag, tag)); if (bank == NULL) - throw emu_fatalerror("memory_set_bankptr called for unknown bank '%s'", tag); + throw emu_fatalerror("memory_set_bankptr called for unknown bank '%s'", fulltag.cstr()); // set the base bank->set_base(base); @@ -1913,17 +1924,6 @@ //------------------------------------------------- -// memory_set_bankptr - set the base of a bank -//------------------------------------------------- - -void memory_set_bankptr(device_t *device, const char *tag, void *base) -{ - astring tempstring; - return memory_set_bankptr(device->machine(), device->subtag(tempstring, tag), base); -} - - -//------------------------------------------------- // memory_get_shared - get a pointer to a shared // memory region by tag //------------------------------------------------- @@ -1936,7 +1936,8 @@ void *memory_get_shared(running_machine &machine, const char *tag, size_t &length) { - memory_share *share = machine.memory_data->sharemap.find(tag); + astring fulltag; + memory_share *share = machine.memory_data->sharemap.find(machine.root_device().subtag(fulltag, tag)); if (share == NULL) return NULL; length = share->size(); @@ -2186,11 +2187,16 @@ adjust_addresses(entry->m_bytestart, entry->m_byteend, entry->m_bytemask, entry->m_bytemirror); // if we have a share entry, add it to our map - if (entry->m_share != NULL && machine().memory_data->sharemap.find(entry->m_share) == NULL) + if (entry->m_share != NULL) { - VPRINTF(("Creating share '%s' of length 0x%X\n", entry->m_share, entry->m_byteend + 1 - entry->m_bytestart)); - memory_share *share = auto_alloc(machine(), memory_share(entry->m_byteend + 1 - entry->m_bytestart)); - machine().memory_data->sharemap.add(entry->m_share, share, false); + // if we can't find it, add it to our map + astring fulltag; + if (machine().memory_data->sharemap.find(device().siblingtag(fulltag, entry->m_share)) == NULL) + { + VPRINTF(("Creating share '%s' of length 0x%X\n", fulltag.cstr(), entry->m_byteend + 1 - entry->m_bytestart)); + memory_share *share = auto_alloc(machine(), memory_share(entry->m_byteend + 1 - entry->m_bytestart)); + machine().memory_data->sharemap.add(fulltag, share, false); + } } // if this is a ROM handler without a specified region, attach it to the implicit region @@ -2207,22 +2213,12 @@ // validate adjusted addresses against implicit regions if (entry->m_region != NULL && entry->m_share == NULL && entry->m_baseptr == NULL) { - astring regiontag; + // determine full tag + astring fulltag; + device().siblingtag(fulltag, entry->m_region); - // a leading : on a region name indicates an absolute region, so fix up accordingly - if (entry->m_region[0] == ':') - { - regiontag = &entry->m_region[1]; - } - else - { - if (strchr(entry->m_region,':')) { - regiontag = entry->m_region; - } else { - m_device.siblingtag(regiontag, entry->m_region); - } - } - const memory_region *region = machine().region(regiontag.cstr()); + // find the region + const memory_region *region = machine().region(fulltag); if (region == NULL) fatalerror("Error: device '%s' %s space memory map entry %X-%X references non-existant region \"%s\"", m_device.tag(), m_name, entry->m_addrstart, entry->m_addrend, entry->m_region); @@ -2232,14 +2228,14 @@ } // convert any region-relative entries to their memory pointers - if (entry->m_region != NULL) { - astring regiontag; - if (strchr(entry->m_region,':')) { - regiontag = entry->m_region; - } else { - m_device.siblingtag(regiontag, entry->m_region); - } - entry->m_memory = machine().region(regiontag.cstr())->base() + entry->m_rgnoffs; + if (entry->m_region != NULL) + { + // determine full tag + astring fulltag; + device().siblingtag(fulltag, entry->m_region); + + // set the memory address + entry->m_memory = machine().region(fulltag.cstr())->base() + entry->m_rgnoffs; } } @@ -2286,7 +2282,8 @@ void address_space::populate_map_entry(const address_map_entry &entry, read_or_write readorwrite) { const map_handler_data &data = (readorwrite == ROW_READ) ? entry.m_read : entry.m_write; - device_t *device; + device_t *target_device; + astring fulltag; // based on the handler type, alter the bits, name, funcptr, and object switch (data.m_type) @@ -2313,25 +2310,25 @@ break; case AMH_DEVICE_DELEGATE: - device = machine().device(data.m_tag); - if (device == NULL) - throw emu_fatalerror("Attempted to map a non-existent device '%s' in space %s of device '%s'\n", data.m_tag, m_name, m_device.tag()); + target_device = device().siblingdevice(data.m_tag); + if (target_device == NULL) + throw emu_fatalerror("Attempted to map a non-existent device '%s' in space %s of device '%s'\n", data.m_tag.cstr(), m_name, m_device.tag()); if (readorwrite == ROW_READ) switch (data.m_bits) { - case 8: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read8_delegate(entry.m_rproto8, *device), data.m_mask); break; - case 16: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read16_delegate(entry.m_rproto16, *device), data.m_mask); break; - case 32: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read32_delegate(entry.m_rproto32, *device), data.m_mask); break; - case 64: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read64_delegate(entry.m_rproto64, *device), data.m_mask); break; + case 8: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read8_delegate(entry.m_rproto8, *target_device), data.m_mask); break; + case 16: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read16_delegate(entry.m_rproto16, *target_device), data.m_mask); break; + case 32: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read32_delegate(entry.m_rproto32, *target_device), data.m_mask); break; + case 64: install_read_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, read64_delegate(entry.m_rproto64, *target_device), data.m_mask); break; } else switch (data.m_bits) { - case 8: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write8_delegate(entry.m_wproto8, *device), data.m_mask); break; - case 16: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write16_delegate(entry.m_wproto16, *device), data.m_mask); break; - case 32: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write32_delegate(entry.m_wproto32, *device), data.m_mask); break; - case 64: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write64_delegate(entry.m_wproto64, *device), data.m_mask); break; + case 8: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write8_delegate(entry.m_wproto8, *target_device), data.m_mask); break; + case 16: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write16_delegate(entry.m_wproto16, *target_device), data.m_mask); break; + case 32: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write32_delegate(entry.m_wproto32, *target_device), data.m_mask); break; + case 64: install_write_handler(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, write64_delegate(entry.m_wproto64, *target_device), data.m_mask); break; } break; @@ -2355,42 +2352,42 @@ break; case AMH_LEGACY_DEVICE_HANDLER: - device = machine().device(data.m_tag); - if (device == NULL) - fatalerror("Attempted to map a non-existent device '%s' in space %s of device '%s'\n", data.m_tag, m_name, m_device.tag()); + target_device = device().siblingdevice(data.m_tag); + if (target_device == NULL) + fatalerror("Attempted to map a non-existent device '%s' in space %s of device '%s'\n", data.m_tag.cstr(), m_name, m_device.tag()); if (readorwrite == ROW_READ) switch (data.m_bits) { - case 8: install_legacy_read_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice8, data.m_name, data.m_mask); break; - case 16: install_legacy_read_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice16, data.m_name, data.m_mask); break; - case 32: install_legacy_read_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice32, data.m_name, data.m_mask); break; - case 64: install_legacy_read_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice64, data.m_name, data.m_mask); break; + case 8: install_legacy_read_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice8, data.m_name, data.m_mask); break; + case 16: install_legacy_read_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice16, data.m_name, data.m_mask); break; + case 32: install_legacy_read_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice32, data.m_name, data.m_mask); break; + case 64: install_legacy_read_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_rdevice64, data.m_name, data.m_mask); break; } else switch (data.m_bits) { - case 8: install_legacy_write_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice8, data.m_name, data.m_mask); break; - case 16: install_legacy_write_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice16, data.m_name, data.m_mask); break; - case 32: install_legacy_write_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice32, data.m_name, data.m_mask); break; - case 64: install_legacy_write_handler(*device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice64, data.m_name, data.m_mask); break; + case 8: install_legacy_write_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice8, data.m_name, data.m_mask); break; + case 16: install_legacy_write_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice16, data.m_name, data.m_mask); break; + case 32: install_legacy_write_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice32, data.m_name, data.m_mask); break; + case 64: install_legacy_write_handler(*target_device, entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, entry.m_wdevice64, data.m_name, data.m_mask); break; } break; case AMH_PORT: install_readwrite_port(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, - (readorwrite == ROW_READ) ? data.m_tag : NULL, - (readorwrite == ROW_WRITE) ? data.m_tag : NULL); + (readorwrite == ROW_READ) ? data.m_tag.cstr() : NULL, + (readorwrite == ROW_WRITE) ? data.m_tag.cstr() : NULL); break; case AMH_BANK: install_bank_generic(entry.m_addrstart, entry.m_addrend, entry.m_addrmask, entry.m_addrmirror, - (readorwrite == ROW_READ) ? data.m_tag : NULL, - (readorwrite == ROW_WRITE) ? data.m_tag : NULL); + (readorwrite == ROW_READ) ? data.m_tag.cstr() : NULL, + (readorwrite == ROW_WRITE) ? data.m_tag.cstr() : NULL); break; case AMH_DEVICE_SUBMAP: - throw emu_fatalerror("Internal mapping error: leftover mapping of '%s'.\n", data.m_tag); + throw emu_fatalerror("Internal mapping error: leftover mapping of '%s'.\n", data.m_tag.cstr()); } } @@ -2478,13 +2475,13 @@ if (entry->m_baseptr != NULL) *entry->m_baseptr = entry->m_memory; if (entry->m_baseptroffs_plus1 != 0) - *(void **)(reinterpret_cast(machine().driver_data()) + entry->m_baseptroffs_plus1 - 1) = entry->m_memory; + *(void **)(reinterpret_cast(machine().driver_data()) + entry->m_baseptroffs_plus1 - 1) = entry->m_memory; if (entry->m_genbaseptroffs_plus1 != 0) *(void **)((UINT8 *)&machine().generic + entry->m_genbaseptroffs_plus1 - 1) = entry->m_memory; if (entry->m_sizeptr != NULL) *entry->m_sizeptr = entry->m_byteend - entry->m_bytestart + 1; if (entry->m_sizeptroffs_plus1 != 0) - *(size_t *)(reinterpret_cast(machine().driver_data()) + entry->m_sizeptroffs_plus1 - 1) = entry->m_byteend - entry->m_bytestart + 1; + *(size_t *)(reinterpret_cast(machine().driver_data()) + entry->m_sizeptroffs_plus1 - 1) = entry->m_byteend - entry->m_bytestart + 1; if (entry->m_gensizeptroffs_plus1 != 0) *(size_t *)((UINT8 *)&machine().generic + entry->m_gensizeptroffs_plus1 - 1) = entry->m_byteend - entry->m_bytestart + 1; } @@ -2562,7 +2559,8 @@ // if we haven't assigned this block yet, see if we have a mapped shared pointer for it if (entry->m_memory == NULL && entry->m_share != NULL) { - memory_share *share = memdata->sharemap.find(entry->m_share); + astring fulltag; + memory_share *share = memdata->sharemap.find(device().siblingtag(fulltag, entry->m_share)); if (share != NULL && share->ptr() != NULL) { entry->m_memory = share->ptr(); @@ -2584,7 +2582,8 @@ // if we're the first match on a shared pointer, assign it now if (entry->m_memory != NULL && entry->m_share != NULL) { - memory_share *share = memdata->sharemap.find(entry->m_share); + astring fulltag; + memory_share *share = memdata->sharemap.find(device().siblingtag(fulltag, entry->m_share)); if (share != NULL && share->ptr() == NULL) { share->set_ptr(entry->m_memory); @@ -2685,7 +2684,9 @@ if (rtag != NULL) { // find the port - const input_port_config *port = machine().port(rtag); + astring fulltag; + device().siblingtag(fulltag, rtag); + const input_port_config *port = machine().port(fulltag); if (port == NULL) throw emu_fatalerror("Attempted to map non-existent port '%s' for read in space %s of device '%s'\n", rtag, m_name, m_device.tag()); @@ -2696,7 +2697,9 @@ if (wtag != NULL) { // find the port - const input_port_config *port = machine().port(wtag); + astring fulltag; + device().siblingtag(fulltag, wtag); + const input_port_config *port = machine().port(fulltag); if (port == NULL) fatalerror("Attempted to map non-existent port '%s' for write in space %s of device '%s'\n", wtag, m_name, m_device.tag()); @@ -2724,14 +2727,18 @@ // map the read bank if (rtag != NULL) { - memory_bank &bank = bank_find_or_allocate(rtag, addrstart, addrend, addrmask, addrmirror, ROW_READ); + astring fulltag; + device().siblingtag(fulltag, rtag); + memory_bank &bank = bank_find_or_allocate(fulltag, addrstart, addrend, addrmask, addrmirror, ROW_READ); read().map_range(addrstart, addrend, addrmask, addrmirror, bank.index()); } // map the write bank if (wtag != NULL) { - memory_bank &bank = bank_find_or_allocate(wtag, addrstart, addrend, addrmask, addrmirror, ROW_WRITE); + astring fulltag; + device().siblingtag(fulltag, wtag); + memory_bank &bank = bank_find_or_allocate(fulltag, addrstart, addrend, addrmask, addrmirror, ROW_WRITE); write().map_range(addrstart, addrend, addrmask, addrmirror, bank.index()); } @@ -3224,7 +3231,8 @@ // if we are sharing, and we don't have a pointer yet, create one if (entry->m_share != NULL) { - memory_share *share = machine().memory_data->sharemap.find(entry->m_share); + astring fulltag; + memory_share *share = machine().memory_data->sharemap.find(device().siblingtag(fulltag, entry->m_share)); if (share != NULL && share->ptr() == NULL) return true; } diff -Nru mame-0.144/src/emu/memory.h mame-0.145/src/emu/memory.h --- mame-0.144/src/emu/memory.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/memory.h 2012-02-06 21:30:28.000000000 +0000 @@ -676,23 +676,23 @@ // configure the addresses for a bank void memory_configure_bank(running_machine &machine, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); -void memory_configure_bank(device_t *device, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); +void memory_configure_bank(device_t &device, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); // configure the decrypted addresses for a bank void memory_configure_bank_decrypted(running_machine &machine, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); -void memory_configure_bank_decrypted(device_t *device, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); +void memory_configure_bank_decrypted(device_t &device, const char *tag, int startentry, int numentries, void *base, offs_t stride) ATTR_NONNULL(5); // select one pre-configured entry to be the new bank base void memory_set_bank(running_machine &machine, const char *tag, int entrynum); -void memory_set_bank(device_t *device, const char *tag, int entrynum); +void memory_set_bank(device_t &device, const char *tag, int entrynum); // return the currently selected bank int memory_get_bank(running_machine &machine, const char *tag); -int memory_get_bank(device_t *device, const char *tag); +int memory_get_bank(device_t &device, const char *tag); // set the absolute address of a bank base void memory_set_bankptr(running_machine &machine, const char *tag, void *base) ATTR_NONNULL(3); -void memory_set_bankptr(device_t *device, const char *tag, void *base) ATTR_NONNULL(3); +void memory_set_bankptr(device_t &device, const char *tag, void *base) ATTR_NONNULL(3); // get a pointer to a shared memory region by tag void *memory_get_shared(running_machine &machine, const char *tag); diff -Nru mame-0.144/src/emu/network.c mame-0.145/src/emu/network.c --- mame-0.144/src/emu/network.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/network.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,91 @@ +/*************************************************************************** + + network.c + + Core network functions and definitions. + + Copyright Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +***************************************************************************/ +#include + +#include "emu.h" +#include "emuopts.h" +#include "network.h" +#include "config.h" +#include "xmlfile.h" + +/*************************************************************************** + INITIALIZATION HELPERS +***************************************************************************/ + +static void network_load(running_machine &machine, int config_type, xml_data_node *parentnode) +{ + xml_data_node *node; + if ((config_type == CONFIG_TYPE_GAME) && (parentnode != NULL)) + { + for (node = xml_get_sibling(parentnode->child, "device"); node; node = xml_get_sibling(node->next, "device")) + { + const char *tag = xml_get_attribute_string(node, "tag", NULL); + + if ((tag != NULL) && (tag[0] != '\0')) + { + network_interface_iterator iter(machine.root_device()); + for (device_network_interface *network = iter.first(); network != NULL; network = iter.next()) + { + if (!strcmp(tag, network->device().tag())) { + int interface = xml_get_attribute_int(node, "interface", 0); + network->set_interface(interface); + const char *mac_addr = xml_get_attribute_string(node, "mac", NULL); + if (mac_addr != NULL && strlen(mac_addr)==17) { + char mac[7]; + unsigned int mac_num[6]; + sscanf (mac_addr,"%02x:%02x:%02x:%02x:%02x:%02x",&mac_num[0],&mac_num[1],&mac_num[2],&mac_num[3],&mac_num[4],&mac_num[5]); + for (int i=0;i<6;i++) mac[i]=mac_num[i]; + network->set_mac(mac); + } + + } + } + } + } + } +} + +static void network_save(running_machine &machine, int config_type, xml_data_node *parentnode) +{ + xml_data_node *node; + + /* only care about game-specific data */ + if (config_type == CONFIG_TYPE_GAME) + { + network_interface_iterator iter(machine.root_device()); + for (device_network_interface *network = iter.first(); network != NULL; network = iter.next()) + { + node = xml_add_child(parentnode, "device", NULL); + if (node != NULL) + { + xml_set_attribute(node, "tag", network->device().tag()); + xml_set_attribute_int(node, "interface", network->get_interface()); + const char *mac = network->get_mac(); + char mac_addr[6*3]; + sprintf(mac_addr,"%02x:%02x:%02x:%02x:%02x:%02x",(UINT8)mac[0],(UINT8)mac[1],(UINT8)mac[2],(UINT8)mac[3],(UINT8)mac[4],(UINT8)mac[5]); + xml_set_attribute(node, "mac", mac_addr); + } + } + } +} + +/*************************************************************************** + INITIALIZATION +***************************************************************************/ + +/*------------------------------------------------- + network_init - start up the network system +-------------------------------------------------*/ + +void network_init(running_machine &machine) +{ + config_register(machine, "network", config_saveload_delegate(FUNC(network_load), &machine), config_saveload_delegate(FUNC(network_save), &machine)); +} diff -Nru mame-0.144/src/emu/network.h mame-0.145/src/emu/network.h --- mame-0.144/src/emu/network.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/network.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,23 @@ +/*************************************************************************** + + network.h + + Core network interface functions and definitions. + + Copyright Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +***************************************************************************/ + +#pragma once + +#ifndef __EMU_H__ +#error Dont include this file directly; include emu.h instead. +#endif + +#ifndef __NETWORK_H__ +#define __NETWORK_H__ + +void network_init(running_machine &machine); + +#endif /* __NETWORK_H__ */ diff -Nru mame-0.144/src/emu/profiler.c mame-0.145/src/emu/profiler.c --- mame-0.144/src/emu/profiler.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/profiler.c 2012-02-06 21:30:26.000000000 +0000 @@ -233,6 +233,7 @@ } // loop over all types and generate the string + device_iterator iter(machine.root_device()); for (curtype = PROFILER_DEVICE_FIRST; curtype < PROFILER_TOTAL; curtype++) { // determine the accumulated time for this type @@ -252,7 +253,7 @@ // and then the text if (curtype >= PROFILER_DEVICE_FIRST && curtype <= PROFILER_DEVICE_MAX) - string.catprintf("'%s'", machine.devicelist().find(curtype - PROFILER_DEVICE_FIRST)->tag()); + string.catprintf("'%s'", iter.byindex(curtype - PROFILER_DEVICE_FIRST)->tag()); else for (int nameindex = 0; nameindex < ARRAY_LENGTH(names); nameindex++) if (names[nameindex].type == curtype) diff -Nru mame-0.144/src/emu/render.c mame-0.145/src/emu/render.c --- mame-0.144/src/emu/render.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/render.c 2012-02-06 21:30:26.000000000 +0000 @@ -359,15 +359,14 @@ : m_manager(NULL), m_next(NULL), m_bitmap(NULL), - m_palette(NULL), m_format(TEXFORMAT_ARGB32), + m_bcglookup(NULL), + m_bcglookup_entries(0), m_scaler(NULL), m_param(NULL), - m_curseq(0), - m_bcglookup(NULL), - m_bcglookup_entries(0) + m_curseq(0) { - m_sbounds.min_x = m_sbounds.min_y = m_sbounds.max_x = m_sbounds.max_y = 0; + m_sbounds.set(0, -1, 0, -1); memset(m_scaled, 0, sizeof(m_scaled)); } @@ -390,8 +389,12 @@ void render_texture::reset(render_manager &manager, texture_scaler_func scaler, void *param) { m_manager = &manager; - m_scaler = scaler; - m_param = param; + if (scaler != NULL) + { + assert(m_format == TEXFORMAT_ARGB32); + m_scaler = scaler; + m_param = param; + } } @@ -413,15 +416,10 @@ // invalidate references to the original bitmap as well m_manager->invalidate_all(m_bitmap); m_bitmap = NULL; - m_sbounds.min_x = m_sbounds.min_y = m_sbounds.max_x = m_sbounds.max_y = 0; + m_sbounds.set(0, -1, 0, -1); m_format = TEXFORMAT_ARGB32; m_curseq = 0; - // release palette references - if (m_palette != NULL) - palette_deref(m_palette); - m_palette = NULL; - // free any B/C/G lookup tables auto_free(m_manager->machine(), m_bcglookup); m_bcglookup = NULL; @@ -433,32 +431,21 @@ // set_bitmap - set a new source bitmap //------------------------------------------------- -void render_texture::set_bitmap(bitmap_t *bitmap, const rectangle *sbounds, int format, palette_t *palette) +void render_texture::set_bitmap(bitmap_t &bitmap, const rectangle &sbounds, texture_format format) { + assert(bitmap.cliprect().contains(sbounds)); + // ensure we have a valid palette for palettized modes if (format == TEXFORMAT_PALETTE16 || format == TEXFORMAT_PALETTEA16) - assert(palette != NULL); + assert(bitmap.palette() != NULL); // invalidate references to the old bitmap - if (bitmap != m_bitmap && m_bitmap != NULL) + if (&bitmap != m_bitmap && m_bitmap != NULL) m_manager->invalidate_all(m_bitmap); - // if the palette is different, adjust references - if (palette != m_palette) - { - if (m_palette != NULL) - palette_deref(m_palette); - if (palette != NULL) - palette_ref(palette); - } - // set the new bitmap/palette - m_bitmap = bitmap; - m_sbounds.min_x = (sbounds != NULL) ? sbounds->min_x : 0; - m_sbounds.min_y = (sbounds != NULL) ? sbounds->min_y : 0; - m_sbounds.max_x = (sbounds != NULL) ? sbounds->max_x : (bitmap != NULL) ? bitmap->width : 1000; - m_sbounds.max_y = (sbounds != NULL) ? sbounds->max_y : (bitmap != NULL) ? bitmap->height : 1000; - m_palette = palette; + m_bitmap = &bitmap; + m_sbounds = sbounds; m_format = format; // invalidate all scaled versions @@ -480,10 +467,11 @@ // scaler //------------------------------------------------- -void render_texture::hq_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param) +void render_texture::hq_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param) { render_color color = { 1.0f, 1.0f, 1.0f, 1.0f }; - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, &source, &sbounds, &color); + bitmap_argb32 sourcesub(source, sbounds); + render_resample_argb_bitmap_hq(dest, sourcesub, color); } @@ -494,22 +482,21 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &texinfo, render_primitive_list &primlist) { // source width/height come from the source bounds - int swidth = m_sbounds.max_x - m_sbounds.min_x; - int sheight = m_sbounds.max_y - m_sbounds.min_y; + int swidth = m_sbounds.width(); + int sheight = m_sbounds.height(); // ensure height/width are non-zero if (dwidth < 1) dwidth = 1; if (dheight < 1) dheight = 1; // are we scaler-free? if so, just return the source bitmap - const rgb_t *palbase = (m_format == TEXFORMAT_PALETTE16 || m_format == TEXFORMAT_PALETTEA16) ? palette_entry_list_adjusted(m_palette) : NULL; + const rgb_t *palbase = (m_format == TEXFORMAT_PALETTE16 || m_format == TEXFORMAT_PALETTEA16) ? palette_entry_list_adjusted(m_bitmap->palette()) : NULL; if (m_scaler == NULL || (m_bitmap != NULL && swidth == dwidth && sheight == dheight)) { // add a reference and set up the source bitmap primlist.add_reference(m_bitmap); - UINT8 bpp = (m_format == TEXFORMAT_PALETTE16 || m_format == TEXFORMAT_PALETTEA16 || m_format == TEXFORMAT_RGB15 || m_format == TEXFORMAT_YUY16) ? 16 : 32; - texinfo.base = (UINT8 *)m_bitmap->base + (m_sbounds.min_y * m_bitmap->rowpixels + m_sbounds.min_x) * (bpp / 8); - texinfo.rowpixels = m_bitmap->rowpixels; + texinfo.base = m_bitmap->raw_pixptr(m_sbounds.min_y, m_sbounds.min_x); + texinfo.rowpixels = m_bitmap->rowpixels(); texinfo.width = swidth; texinfo.height = sheight; texinfo.palette = palbase; @@ -517,6 +504,10 @@ return true; } + // make sure we can recover the original argb32 bitmap + bitmap_argb32 dummy; + bitmap_argb32 &srcbitmap = (m_bitmap != NULL) ? downcast(*m_bitmap) : dummy; + // is it a size we already have? scaled_texture *scaled = NULL; int scalenum; @@ -525,7 +516,7 @@ scaled = &m_scaled[scalenum]; // we need a non-NULL bitmap with matching dest size - if (scaled->bitmap != NULL && dwidth == scaled->bitmap->width && dheight == scaled->bitmap->height) + if (scaled->bitmap != NULL && dwidth == scaled->bitmap->width() && dheight == scaled->bitmap->height()) break; } @@ -549,17 +540,17 @@ } // allocate a new bitmap - scaled->bitmap = auto_alloc(m_manager->machine(), bitmap_t(dwidth, dheight, BITMAP_FORMAT_ARGB32)); + scaled->bitmap = auto_alloc(m_manager->machine(), bitmap_argb32(dwidth, dheight)); scaled->seqid = ++m_curseq; // let the scaler do the work - (*m_scaler)(*scaled->bitmap, *m_bitmap, m_sbounds, m_param); + (*m_scaler)(*scaled->bitmap, srcbitmap, m_sbounds, m_param); } // finally fill out the new info primlist.add_reference(scaled->bitmap); - texinfo.base = scaled->bitmap->base; - texinfo.rowpixels = scaled->bitmap->rowpixels; + texinfo.base = &scaled->bitmap->pix32(0); + texinfo.rowpixels = scaled->bitmap->rowpixels(); texinfo.width = dwidth; texinfo.height = dheight; texinfo.palette = palbase; @@ -585,18 +576,18 @@ case TEXFORMAT_PALETTEA16: // if no adjustment necessary, return the raw palette - assert(m_palette != NULL); - adjusted = palette_entry_list_adjusted(m_palette); + assert(m_bitmap->palette() != NULL); + adjusted = palette_entry_list_adjusted(m_bitmap->palette()); if (!container.has_brightness_contrast_gamma_changes()) return adjusted; // if this is the machine palette, return our precomputed adjusted palette - adjusted = container.bcg_lookup_table(m_format, m_palette); + adjusted = container.bcg_lookup_table(m_format, m_bitmap->palette()); if (adjusted != NULL) return adjusted; // otherwise, ensure we have memory allocated and compute the adjusted result ourself - numentries = palette_get_num_colors(m_palette) * palette_get_num_groups(m_palette); + numentries = palette_get_num_colors(m_bitmap->palette()) * palette_get_num_groups(m_bitmap->palette()); if (m_bcglookup == NULL || m_bcglookup_entries < numentries) { rgb_t *newlookup = auto_alloc_array(m_manager->machine(), rgb_t, numentries); @@ -614,73 +605,14 @@ } return m_bcglookup; - case TEXFORMAT_RGB15: - - // if no adjustment necessary, return NULL - if (!container.has_brightness_contrast_gamma_changes() && m_palette == NULL) - return NULL; - - // if no palette, return the standard lookups - if (m_palette == NULL) - return container.bcg_lookup_table(m_format); - - // otherwise, ensure we have memory allocated and compute the adjusted result ourself - assert(palette_get_num_colors(m_palette) == 32); - adjusted = palette_entry_list_adjusted(m_palette); - if (m_bcglookup == NULL || m_bcglookup_entries < 4 * 32) - { - rgb_t *newlookup = auto_alloc_array(m_manager->machine(), rgb_t, 4 * 32); - memcpy(newlookup, m_bcglookup, m_bcglookup_entries * sizeof(rgb_t)); - auto_free(m_manager->machine(), m_bcglookup); - m_bcglookup = newlookup; - m_bcglookup_entries = 4 * 32; - } - - // otherwise, return the 32-entry BCG lookups - for (int index = 0; index < 32; index++) - { - UINT8 val = container.apply_brightness_contrast_gamma(RGB_GREEN(adjusted[index])); - m_bcglookup[0x00 + index] = val << 0; - m_bcglookup[0x20 + index] = val << 8; - m_bcglookup[0x40 + index] = val << 16; - m_bcglookup[0x60 + index] = val << 24; - } - return m_bcglookup; - case TEXFORMAT_RGB32: case TEXFORMAT_ARGB32: case TEXFORMAT_YUY16: // if no adjustment necessary, return NULL - if (!container.has_brightness_contrast_gamma_changes() && m_palette == NULL) + if (!container.has_brightness_contrast_gamma_changes()) return NULL; - - // if no palette, return the standard lookups - if (m_palette == NULL) - return container.bcg_lookup_table(m_format); - - // otherwise, ensure we have memory allocated and compute the adjusted result ourself - assert(palette_get_num_colors(m_palette) == 256); - adjusted = palette_entry_list_adjusted(m_palette); - if (m_bcglookup == NULL || m_bcglookup_entries < 4 * 256) - { - rgb_t *newlookup = auto_alloc_array(m_manager->machine(), rgb_t, 4 * 256); - memcpy(newlookup, m_bcglookup, m_bcglookup_entries * sizeof(rgb_t)); - auto_free(m_manager->machine(), m_bcglookup); - m_bcglookup = newlookup; - m_bcglookup_entries = 4 * 256; - } - - // otherwise, return the 32-entry BCG lookups - for (int index = 0; index < 256; index++) - { - UINT8 val = container.apply_brightness_contrast_gamma(RGB_GREEN(adjusted[index])); - m_bcglookup[0x000 + index] = val << 0; - m_bcglookup[0x100 + index] = val << 8; - m_bcglookup[0x200 + index] = val << 16; - m_bcglookup[0x300 + index] = val << 24; - } - return m_bcglookup; + return container.bcg_lookup_table(m_format); default: assert(FALSE); @@ -756,7 +688,7 @@ // container //------------------------------------------------- -void render_container::set_overlay(bitmap_t *bitmap) +void render_container::set_overlay(bitmap_argb32 *bitmap) { // free any existing texture m_manager.texture_free(m_overlaytexture); @@ -766,7 +698,7 @@ if (m_overlaybitmap != NULL) { m_overlaytexture = m_manager.texture_alloc(render_container::overlay_scale); - m_overlaytexture->set_bitmap(bitmap, NULL, TEXFORMAT_ARGB32); + m_overlaytexture->set_bitmap(*bitmap, bitmap->cliprect(), TEXFORMAT_ARGB32); } } @@ -865,9 +797,6 @@ case TEXFORMAT_PALETTEA16: return (palette != NULL && palette == palette_client_get_palette(m_palclient)) ? m_bcglookup : NULL; - case TEXFORMAT_RGB15: - return m_bcglookup32; - case TEXFORMAT_RGB32: case TEXFORMAT_ARGB32: case TEXFORMAT_YUY16: @@ -883,20 +812,20 @@ // overlay_scale - scaler for an overlay //------------------------------------------------- -void render_container::overlay_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param) +void render_container::overlay_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param) { // simply replicate the source bitmap over the target - for (int y = 0; y < dest.height; y++) + for (int y = 0; y < dest.height(); y++) { - UINT32 *src = (UINT32 *)source.base + (y % source.height) * source.rowpixels; - UINT32 *dst = (UINT32 *)dest.base + y * dest.rowpixels; + UINT32 *src = &source.pix32(y % source.height()); + UINT32 *dst = &dest.pix32(y); int sx = 0; // loop over columns - for (int x = 0; x < dest.width; x++) + for (int x = 0; x < dest.width(); x++) { *dst++ = src[sx++]; - if (sx >= source.width) + if (sx >= source.width()) sx = 0; } } @@ -949,16 +878,6 @@ m_bcglookup256[i + 0x300] = adjustedval << 24; } - // recompute the 32 entry lookup table - for (int i = 0; i < 0x20; i++) - { - UINT8 adjustedval = apply_brightness_contrast_gamma(pal5bit(i)); - m_bcglookup32[i + 0x000] = adjustedval << 0; - m_bcglookup32[i + 0x020] = adjustedval << 8; - m_bcglookup32[i + 0x040] = adjustedval << 16; - m_bcglookup32[i + 0x060] = adjustedval << 24; - } - // recompute the palette entries if (m_palclient != NULL) { @@ -1201,17 +1120,15 @@ } // if we don't have a match, default to the nth view - int scrcount = m_manager.machine().devicelist().count(SCREEN); + screen_device_iterator iter(m_manager.machine().root_device()); + int scrcount = iter.count(); if (view == NULL && scrcount > 0) { // if we have enough targets to be one per screen, assign in order if (numtargets >= scrcount) { int ourindex = index() % scrcount; - screen_device *screen; - for (screen = m_manager.machine().first_screen(); screen != NULL; screen = screen->next_screen()) - if (ourindex-- == 0) - break; + screen_device *screen = iter.byindex(ourindex); // find the first view with this screen and this screen only for (view = view_by_index(viewindex = 0); view != NULL; view = view_by_index(++viewindex)) @@ -1238,7 +1155,7 @@ if (viewscreens.count() >= scrcount) { screen_device *screen; - for (screen = m_manager.machine().first_screen(); screen != NULL; screen = screen->next_screen()) + for (screen = iter.first(); screen != NULL; screen = iter.next()) if (!viewscreens.contains(*screen)) break; if (screen == NULL) @@ -1336,7 +1253,7 @@ int screens_considered = 0; // early exit in case we are called between device teardown and render teardown - if (m_manager.machine().devicelist().count() == 0) + if (m_manager.machine().phase() == MACHINE_PHASE_EXIT) { minwidth = 640; minheight = 480; @@ -1355,7 +1272,7 @@ { // use a hard-coded default visible area for vector screens screen_device *screen = curitem->screen(); - const rectangle vectorvis = { 0, 639, 0, 479 }; + const rectangle vectorvis(0, 639, 0, 479); const rectangle &visarea = (screen->screen_type() == SCREEN_TYPE_VECTOR) ? vectorvis : screen->visible_area(); // apply target orientation to the bounds @@ -1367,13 +1284,13 @@ float xscale, yscale; if (!(orientation_add(m_orientation, screen->container().orientation()) & ORIENTATION_SWAP_XY)) { - xscale = (float)(visarea.max_x + 1 - visarea.min_x) / (bounds.x1 - bounds.x0); - yscale = (float)(visarea.max_y + 1 - visarea.min_y) / (bounds.y1 - bounds.y0); + xscale = float(visarea.width()) / bounds.width(); + yscale = float(visarea.height()) / bounds.height(); } else { - xscale = (float)(visarea.max_y + 1 - visarea.min_y) / (bounds.x1 - bounds.x0); - yscale = (float)(visarea.max_x + 1 - visarea.min_x) / (bounds.y1 - bounds.y0); + xscale = float(visarea.height()) / bounds.width(); + yscale = float(visarea.width()) / bounds.height(); } // pick the greater @@ -1657,7 +1574,8 @@ else have_default |= true; } - int screens = m_manager.machine().devicelist().count(SCREEN); + screen_device_iterator iter(m_manager.machine().root_device()); + int screens = iter.count(); // now do the built-in layouts for single-screen games if (screens == 1) { @@ -2513,7 +2431,8 @@ config_register(machine, "video", config_saveload_delegate(FUNC(render_manager::config_load), this), config_saveload_delegate(FUNC(render_manager::config_save), this)); // create one container per screen - for (screen_device *screen = machine.first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine.root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) screen->set_container(*container_alloc(screen)); } diff -Nru mame-0.144/src/emu/render.h mame-0.145/src/emu/render.h --- mame-0.144/src/emu/render.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/render.h 2012-02-06 21:30:26.000000000 +0000 @@ -86,12 +86,11 @@ //************************************************************************** // texture formats -enum +enum texture_format { TEXFORMAT_UNDEFINED = 0, // require a format to be specified TEXFORMAT_PALETTE16, // 16bpp palettized, alpha ignored TEXFORMAT_PALETTEA16, // 16bpp palettized, alpha respected - TEXFORMAT_RGB15, // 16bpp 5-5-5 RGB TEXFORMAT_RGB32, // 32bpp 8-8-8 RGB TEXFORMAT_ARGB32, // 32bpp 8-8-8-8 ARGB TEXFORMAT_YUY16 // 16bpp 8-8 Y/Cb, Y/Cr in sequence @@ -181,7 +180,7 @@ // texture scaling callback -typedef void (*texture_scaler_func)(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param); +typedef void (*texture_scaler_func)(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param); // render_bounds - floating point bounding rectangle @@ -191,6 +190,9 @@ float y0; // topmost Y coordinate float x1; // rightmost X coordinate float y1; // bottommost Y coordinate + + float width() const { return x1 - x0; } + float height() const { return y1 - y0; } }; @@ -258,7 +260,7 @@ public: // construction/destruction - render_screen_list(resource_pool &pool = global_resource_pool) + render_screen_list(resource_pool &pool = global_resource_pool()) : m_list(pool) { } // getters @@ -437,10 +439,10 @@ int format() const { return m_format; } // configure the texture bitmap - void set_bitmap(bitmap_t *bitmap, const rectangle *sbounds, int format, palette_t *palette = NULL); + void set_bitmap(bitmap_t &bitmap, const rectangle &sbounds, texture_format format); // generic high-quality bitmap scaler - static void hq_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param); + static void hq_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param); private: // internal helpers @@ -452,7 +454,7 @@ // a scaled_texture contains a single scaled entry for a texture struct scaled_texture { - bitmap_t * bitmap; // final bitmap + bitmap_argb32 * bitmap; // final bitmap UINT32 seqid; // sequence number }; @@ -461,14 +463,15 @@ render_texture * m_next; // next texture (for free list) bitmap_t * m_bitmap; // pointer to the original bitmap rectangle m_sbounds; // source bounds within the bitmap - palette_t * m_palette; // palette associated with the texture - int m_format; // format of the texture data + texture_format m_format; // format of the texture data + rgb_t * m_bcglookup; // dynamically allocated B/C/G lookup table + UINT32 m_bcglookup_entries; // number of B/C/G lookup entries allocated + + // scaling state (ARGB32 only) texture_scaler_func m_scaler; // scaling callback void * m_param; // scaling callback parameter UINT32 m_curseq; // current sequence number scaled_texture m_scaled[MAX_TEXTURE_SCALES];// array of scaled variants of this texture - rgb_t * m_bcglookup; // dynamically allocated B/C/G lookup table - UINT32 m_bcglookup_entries; // number of B/C/G lookup entries allocated }; @@ -518,7 +521,7 @@ void get_user_settings(user_settings &settings) const { settings = m_user; } // setters - void set_overlay(bitmap_t *bitmap); + void set_overlay(bitmap_argb32 *bitmap); void set_user_settings(const user_settings &settings); // empty the item list @@ -568,7 +571,7 @@ }; // generic screen overlay scaler - static void overlay_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param); + static void overlay_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param); // internal helpers item *first_item() const { return m_itemlist.first(); } @@ -583,11 +586,10 @@ fixed_allocator m_item_allocator; // free container items screen_device * m_screen; // the screen device user_settings m_user; // user settings - bitmap_t * m_overlaybitmap; // overlay bitmap + bitmap_argb32 * m_overlaybitmap; // overlay bitmap render_texture * m_overlaytexture; // overlay texture palette_client * m_palclient; // client to the system palette rgb_t m_bcglookup256[0x400]; // lookup table for brightness/contrast/gamma - rgb_t m_bcglookup32[0x80]; // lookup table for brightness/contrast/gamma rgb_t m_bcglookup[0x10000]; // full palette lookup with bcg adjustements }; diff -Nru mame-0.144/src/emu/rendersw.c mame-0.145/src/emu/rendersw.c --- mame-0.144/src/emu/rendersw.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/rendersw.c 2012-02-06 21:30:27.000000000 +0000 @@ -268,54 +268,6 @@ /*------------------------------------------------- - get_texel_rgb15_nearest - return the - nearest neighbor texel from a 15bpp RGB source --------------------------------------------------*/ - -INLINE UINT32 get_texel_rgb15_nearest(const render_texinfo *texture, INT32 curu, INT32 curv) -{ - const UINT16 *texbase = (const UINT16 *)texture->base + (curv >> 16) * texture->rowpixels + (curu >> 16); - return texbase[0]; -} - - -/*------------------------------------------------- - get_texel_rgb15_bilinear - return the - bilinear filtered texel from a 15bpp RGB - source --------------------------------------------------*/ - -INLINE UINT32 get_texel_rgb15_bilinear(const render_texinfo *texture, INT32 curu, INT32 curv) -{ - const UINT16 *texbase = (const UINT16 *)texture->base; - rgb_t pix00, pix01, pix10, pix11, filtered; - INT32 u0, u1, v0, v1; - - u0 = curu >> 16; - u1 = 1; - if (u0 < 0) u0 = u1 = 0; - else if (u0 + 1 >= texture->width) u0 = texture->width - 1, u1 = 0; - v0 = curv >> 16; - v1 = texture->rowpixels; - if (v0 < 0) v0 = v1 = 0; - else if (v0 + 1 >= texture->height) v0 = texture->height - 1, v1 = 0; - - texbase += v0 * texture->rowpixels + u0; - - pix00 = texbase[0]; - pix01 = texbase[u1]; - pix10 = texbase[v1]; - pix11 = texbase[u1 + v1]; - pix00 = ((pix00 & 0x7fe0) << 6) | (pix00 & 0x1f); - pix01 = ((pix01 & 0x7fe0) << 6) | (pix01 & 0x1f); - pix10 = ((pix10 & 0x7fe0) << 6) | (pix10 & 0x1f); - pix11 = ((pix11 & 0x7fe0) << 6) | (pix11 & 0x1f); - filtered = rgb_bilinear_filter(pix00, pix01, pix10, pix11, curu >> 8, curv >> 8); - return (filtered & 0x1f) | ((filtered & 0x1ff800) >> 6); -} - - -/*------------------------------------------------- get_texel_yuy16_nearest - return the nearest neighbor texel from a 16bpp YCbCr source (pixel is returned as Cr-Cb-Y @@ -1298,181 +1250,6 @@ } -/*************************************************************************** - 15-BIT RGB QUAD RASTERIZERS -***************************************************************************/ - -/*------------------------------------------------- - draw_quad_rgb15 - perform rasterization of - a 15bpp RGB texture --------------------------------------------------*/ - -static void FUNC_PREFIX(draw_quad_rgb15)(const render_primitive *prim, void *dstdata, UINT32 pitch, quad_setup_data *setup) -{ - const rgb_t *palbase = prim->texture.palette; - INT32 dudx = setup->dudx; - INT32 dvdx = setup->dvdx; - INT32 endx = setup->endx; - INT32 x, y; - - /* fast case: no coloring, no alpha */ - if (prim->color.r >= 1.0f && prim->color.g >= 1.0f && prim->color.b >= 1.0f && IS_OPAQUE(prim->color.a)) - { - /* loop over rows */ - for (y = setup->starty; y < setup->endy; y++) - { - PIXEL_TYPE *dest = (PIXEL_TYPE *)dstdata + y * pitch + setup->startx; - INT32 curu = setup->startu + (y - setup->starty) * setup->dudy; - INT32 curv = setup->startv + (y - setup->starty) * setup->dvdy; - - /* no lookup case */ - if (palbase == NULL) - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - *dest++ = SOURCE15_TO_DEST(pix); - curu += dudx; - curv += dvdx; - } - } - - /* lookup case */ - else - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - UINT32 r = palbase[(pix >> 10) & 0x1f] >> SRCSHIFT_R; - UINT32 g = palbase[(pix >> 5) & 0x1f] >> SRCSHIFT_G; - UINT32 b = palbase[(pix >> 0) & 0x1f] >> SRCSHIFT_B; - - *dest++ = DEST_ASSEMBLE_RGB(r, g, b); - curu += dudx; - curv += dvdx; - } - } - } - } - - /* coloring-only case */ - else if (IS_OPAQUE(prim->color.a)) - { - UINT32 sr = (UINT32)(256.0f * prim->color.r); - UINT32 sg = (UINT32)(256.0f * prim->color.g); - UINT32 sb = (UINT32)(256.0f * prim->color.b); - - /* clamp R,G,B to 0-256 range */ - if (sr > 0x100) { if ((INT32)sr < 0) sr = 0; else sr = 0x100; } - if (sg > 0x100) { if ((INT32)sg < 0) sg = 0; else sg = 0x100; } - if (sb > 0x100) { if ((INT32)sb < 0) sb = 0; else sb = 0x100; } - - /* loop over rows */ - for (y = setup->starty; y < setup->endy; y++) - { - PIXEL_TYPE *dest = (PIXEL_TYPE *)dstdata + y * pitch + setup->startx; - INT32 curu = setup->startu + (y - setup->starty) * setup->dudy; - INT32 curv = setup->startv + (y - setup->starty) * setup->dvdy; - - /* no lookup case */ - if (palbase == NULL) - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - UINT32 r = (SOURCE15_R(pix) * sr) >> 8; - UINT32 g = (SOURCE15_G(pix) * sg) >> 8; - UINT32 b = (SOURCE15_B(pix) * sb) >> 8; - - *dest++ = DEST_ASSEMBLE_RGB(r, g, b); - curu += dudx; - curv += dvdx; - } - } - - /* lookup case */ - else - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - UINT32 r = (palbase[(pix >> 10) & 0x1f] * sr) >> (8 + SRCSHIFT_R); - UINT32 g = (palbase[(pix >> 5) & 0x1f] * sg) >> (8 + SRCSHIFT_G); - UINT32 b = (palbase[(pix >> 0) & 0x1f] * sb) >> (8 + SRCSHIFT_B); - - *dest++ = DEST_ASSEMBLE_RGB(r, g, b); - curu += dudx; - curv += dvdx; - } - } - } - } - - /* alpha and/or coloring case */ - else if (!IS_TRANSPARENT(prim->color.a)) - { - UINT32 sr = (UINT32)(256.0f * prim->color.r * prim->color.a); - UINT32 sg = (UINT32)(256.0f * prim->color.g * prim->color.a); - UINT32 sb = (UINT32)(256.0f * prim->color.b * prim->color.a); - UINT32 invsa = (UINT32)(256.0f * (1.0f - prim->color.a)); - - /* clamp R,G,B and inverse A to 0-256 range */ - if (sr > 0x100) { if ((INT32)sr < 0) sr = 0; else sr = 0x100; } - if (sg > 0x100) { if ((INT32)sg < 0) sg = 0; else sg = 0x100; } - if (sb > 0x100) { if ((INT32)sb < 0) sb = 0; else sb = 0x100; } - if (invsa > 0x100) { if ((INT32)invsa < 0) invsa = 0; else invsa = 0x100; } - - /* loop over rows */ - for (y = setup->starty; y < setup->endy; y++) - { - PIXEL_TYPE *dest = (PIXEL_TYPE *)dstdata + y * pitch + setup->startx; - INT32 curu = setup->startu + (y - setup->starty) * setup->dudy; - INT32 curv = setup->startv + (y - setup->starty) * setup->dvdy; - - /* no lookup case */ - if (palbase == NULL) - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - UINT32 dpix = NO_DEST_READ ? 0 : *dest; - UINT32 r = (SOURCE15_R(pix) * sr + DEST_R(dpix) * invsa) >> 8; - UINT32 g = (SOURCE15_G(pix) * sg + DEST_G(dpix) * invsa) >> 8; - UINT32 b = (SOURCE15_B(pix) * sb + DEST_B(dpix) * invsa) >> 8; - - *dest++ = DEST_ASSEMBLE_RGB(r, g, b); - curu += dudx; - curv += dvdx; - } - } - - /* lookup case */ - else - { - /* loop over cols */ - for (x = setup->startx; x < endx; x++) - { - UINT32 pix = GET_TEXEL(rgb15)(&prim->texture, curu, curv); - UINT32 dpix = NO_DEST_READ ? 0 : *dest; - UINT32 r = ((palbase[(pix >> 10) & 0x1f] >> SRCSHIFT_R) * sr + DEST_R(dpix) * invsa) >> 8; - UINT32 g = ((palbase[(pix >> 5) & 0x1f] >> SRCSHIFT_G) * sg + DEST_G(dpix) * invsa) >> 8; - UINT32 b = ((palbase[(pix >> 0) & 0x1f] >> SRCSHIFT_B) * sb + DEST_B(dpix) * invsa) >> 8; - - *dest++ = DEST_ASSEMBLE_RGB(r, g, b); - curu += dudx; - curv += dvdx; - } - } - } - } -} - - /*************************************************************************** 32-BIT RGB QUAD RASTERIZERS @@ -2289,11 +2066,6 @@ FUNC_PREFIX(draw_quad_yuy16_none)(prim, dstdata, pitch, &setup); break; - case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB15) | PRIMFLAG_BLENDMODE(BLENDMODE_NONE): - case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB15) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA): - FUNC_PREFIX(draw_quad_rgb15)(prim, dstdata, pitch, &setup); - break; - case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_NONE): case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA): case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_BLENDMODE(BLENDMODE_NONE): diff -Nru mame-0.144/src/emu/rendfont.c mame-0.145/src/emu/rendfont.c --- mame-0.144/src/emu/rendfont.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/rendfont.c 2012-02-06 21:30:27.000000000 +0000 @@ -89,7 +89,7 @@ // if the character isn't generated yet, do it now glyph &gl = glyphtable[chnum % 256]; - if (gl.bitmap == NULL) + if (!gl.bitmap.valid()) char_expand(chnum, gl); // return the resulting character @@ -161,7 +161,6 @@ { glyph &gl = m_glyphs[tablenum][charnum]; m_manager.texture_free(gl.texture); - auto_free(m_manager.machine(), gl.bitmap); } // free the subtable itself @@ -192,16 +191,16 @@ return; // attempt to get the font bitmap; if we fail, set bmwidth to -1 - gl.bitmap = m_manager.machine().osd().font_get_bitmap(m_osdfont, chnum, gl.width, gl.xoffs, gl.yoffs); - if (gl.bitmap == NULL) + if (!m_manager.machine().osd().font_get_bitmap(m_osdfont, chnum, gl.bitmap, gl.width, gl.xoffs, gl.yoffs)) { + gl.bitmap.reset(); gl.bmwidth = -1; return; } // populate the bmwidth/bmheight fields - gl.bmwidth = gl.bitmap->width; - gl.bmheight = gl.bitmap->height; + gl.bmwidth = gl.bitmap.width(); + gl.bmheight = gl.bitmap.height(); } // other formats need to parse their data @@ -212,8 +211,8 @@ return; // allocate a new bitmap of the size we need - gl.bitmap = auto_alloc(m_manager.machine(), bitmap_t(gl.bmwidth, m_height, BITMAP_FORMAT_ARGB32)); - bitmap_fill(gl.bitmap, NULL, 0); + gl.bitmap.allocate(gl.bmwidth, m_height); + gl.bitmap.fill(0); // extract the data const char *ptr = gl.rawdata; @@ -221,7 +220,7 @@ for (int y = 0; y < gl.bmheight; y++) { int desty = y + m_height + m_yoffs - gl.yoffs - gl.bmheight; - UINT32 *dest = (desty >= 0 && desty < m_height) ? BITMAP_ADDR32(gl.bitmap, desty, 0) : NULL; + UINT32 *dest = (desty >= 0 && desty < m_height) ? &gl.bitmap.pix32(desty) : NULL; // text format if (m_format == FF_TEXT) @@ -274,7 +273,7 @@ // wrap a texture around the bitmap gl.texture = m_manager.texture_alloc(render_texture::hq_scale); - gl.texture->set_bitmap(gl.bitmap, NULL, TEXFORMAT_ARGB32); + gl.texture->set_bitmap(gl.bitmap, gl.bitmap.cliprect(), TEXFORMAT_ARGB32); } @@ -291,11 +290,11 @@ // on entry, assume x0,y0 are the top,left coordinate of the cell and add // the character bounding box to that position float scale = m_scale * height; - bounds.x0 += (float)gl.xoffs * scale * aspect; + bounds.x0 += float(gl.xoffs) * scale * aspect; // compute x1,y1 from there based on the bitmap size - bounds.x1 = bounds.x0 + (float)gl.bmwidth * scale * aspect; - bounds.y1 = bounds.y0 + (float)m_height * scale; + bounds.x1 = bounds.x0 + float(gl.bmwidth) * scale * aspect; + bounds.y1 = bounds.y0 + float(m_height) * scale; // return the texture return gl.texture; @@ -307,43 +306,34 @@ // scaled bitmap and bounding rect for a char //------------------------------------------------- -void render_font::get_scaled_bitmap_and_bounds(bitmap_t &dest, float height, float aspect, unicode_char chnum, rectangle &bounds) +void render_font::get_scaled_bitmap_and_bounds(bitmap_argb32 &dest, float height, float aspect, unicode_char chnum, rectangle &bounds) { glyph &gl = get_char(chnum); // on entry, assume x0,y0 are the top,left coordinate of the cell and add // the character bounding box to that position float scale = m_scale * height; - bounds.min_x = (float)gl.xoffs * scale * aspect; + bounds.min_x = float(gl.xoffs) * scale * aspect; bounds.min_y = 0; // compute x1,y1 from there based on the bitmap size - bounds.max_x = bounds.min_x + (float)gl.bmwidth * scale * aspect; - bounds.max_y = bounds.min_y + (float)m_height * scale; + bounds.set_width(float(gl.bmwidth) * scale * aspect); + bounds.set_height(float(m_height) * scale); // if the bitmap isn't big enough, bail - if (dest.width < bounds.max_x - bounds.min_x || dest.height < bounds.max_y - bounds.min_y) + if (dest.width() < bounds.width() || dest.height() < bounds.height()) return; // if no texture, fill the target if (gl.texture == NULL) { - bitmap_fill(&dest, NULL, 0); + dest.fill(0); return; } // scale the font - INT32 origwidth = dest.width; - INT32 origheight = dest.height; - dest.width = bounds.max_x - bounds.min_x; - dest.height = bounds.max_y - bounds.min_y; - rectangle clip; - clip.min_x = clip.min_y = 0; - clip.max_x = gl.bitmap->width - 1; - clip.max_y = gl.bitmap->height - 1; - render_texture::hq_scale(dest, *gl.bitmap, clip, NULL); - dest.width = origwidth; - dest.height = origheight; + bitmap_argb32 tempbitmap(&dest.pix(0), bounds.width(), bounds.height(), dest.rowpixels()); + render_texture::hq_scale(tempbitmap, gl.bitmap, gl.bitmap.cliprect(), NULL); } @@ -354,7 +344,7 @@ float render_font::char_width(float height, float aspect, unicode_char ch) { - return (float)get_char(ch).width * m_scale * height * aspect; + return float(get_char(ch).width) * m_scale * height * aspect; } @@ -371,7 +361,7 @@ totwidth += get_char(*ptr).width; // scale the final result based on height - return (float)totwidth * m_scale * height * aspect; + return float(totwidth) * m_scale * height * aspect; } @@ -398,7 +388,7 @@ } // scale the final result based on height - return (float)totwidth * m_scale * height * aspect; + return float(totwidth) * m_scale * height * aspect; } @@ -737,7 +727,7 @@ if (gl.width > 0) { // write out a bit-compressed bitmap if we have one - if (gl.bitmap != NULL) + if (gl.bitmap.valid()) { // write the data to the tempbuffer dest = tempbuffer; @@ -748,7 +738,7 @@ for (int y = 0; y < gl.bmheight; y++) { int desty = y + m_height + m_yoffs - gl.yoffs - gl.bmheight; - const UINT32 *src = (desty >= 0 && desty < m_height) ? BITMAP_ADDR32(gl.bitmap, desty, 0) : NULL; + const UINT32 *src = (desty >= 0 && desty < m_height) ? &gl.bitmap.pix32(desty) : NULL; for (int x = 0; x < gl.bmwidth; x++) { if (src != NULL && RGB_ALPHA(src[x]) != 0) @@ -773,9 +763,8 @@ // free the bitmap and texture m_manager.texture_free(gl.texture); - auto_free(m_manager.machine(), gl.bitmap); + gl.bitmap.reset(); gl.texture = NULL; - gl.bitmap = NULL; } // compute the table entry diff -Nru mame-0.144/src/emu/rendfont.h mame-0.145/src/emu/rendfont.h --- mame-0.144/src/emu/rendfont.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/rendfont.h 2012-02-06 21:30:27.000000000 +0000 @@ -72,7 +72,7 @@ // texture/bitmap queries render_texture *get_char_texture_and_bounds(float height, float aspect, unicode_char ch, render_bounds &bounds); - void get_scaled_bitmap_and_bounds(bitmap_t &dest, float height, float aspect, unicode_char chnum, rectangle &bounds); + void get_scaled_bitmap_and_bounds(bitmap_argb32 &dest, float height, float aspect, unicode_char chnum, rectangle &bounds); private: // a glyph describes a single glyph @@ -83,7 +83,7 @@ INT32 xoffs, yoffs; // X and Y offset from baseline to top,left of bitmap INT32 bmwidth, bmheight; // width and height of bitmap const char * rawdata; // pointer to the raw data for this one - bitmap_t * bitmap; // pointer to the bitmap containing the raw data + bitmap_argb32 bitmap; // pointer to the bitmap containing the raw data render_texture * texture; // pointer to a texture for rendering and sizing }; diff -Nru mame-0.144/src/emu/rendlay.c mame-0.145/src/emu/rendlay.c --- mame-0.144/src/emu/rendlay.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/rendlay.c 2012-02-06 21:30:28.000000000 +0000 @@ -203,16 +203,16 @@ char temp[100]; // screen 0 parameters - for (const screen_device *device = machine.first_screen(); device != NULL; device = device->next_screen()) + screen_device_iterator iter(machine.root_device()); + int scrnum = 0; + for (const screen_device *device = iter.first(); device != NULL; device = iter.next(), scrnum++) { - int scrnum = machine.devicelist().indexof(SCREEN, device->tag()); - // native X aspect factor sprintf(temp, "~scr%dnativexaspect~", scrnum); if (!strncmp(string, temp, strlen(temp))) { - int num = device->visible_area().max_x + 1 - device->visible_area().min_x; - int den = device->visible_area().max_y + 1 - device->visible_area().min_y; + int num = device->visible_area().width(); + int den = device->visible_area().height(); reduce_fraction(num, den); *outputptr += sprintf(*outputptr, "%d", num); return strlen(temp); @@ -222,8 +222,8 @@ sprintf(temp, "~scr%dnativeyaspect~", scrnum); if (!strncmp(string, temp, strlen(temp))) { - int num = device->visible_area().max_x + 1 - device->visible_area().min_x; - int den = device->visible_area().max_y + 1 - device->visible_area().min_y; + int num = device->visible_area().width(); + int den = device->visible_area().height(); reduce_fraction(num, den); *outputptr += sprintf(*outputptr, "%d", den); return strlen(temp); @@ -233,7 +233,7 @@ sprintf(temp, "~scr%dwidth~", scrnum); if (!strncmp(string, temp, strlen(temp))) { - *outputptr += sprintf(*outputptr, "%d", device->visible_area().max_x + 1 - device->visible_area().min_x); + *outputptr += sprintf(*outputptr, "%d", device->visible_area().width()); return strlen(temp); } @@ -241,7 +241,7 @@ sprintf(temp, "~scr%dheight~", scrnum); if (!strncmp(string, temp, strlen(temp))) { - *outputptr += sprintf(*outputptr, "%d", device->visible_area().max_y + 1 - device->visible_area().min_y); + *outputptr += sprintf(*outputptr, "%d", device->visible_area().height()); return strlen(temp); } } @@ -541,7 +541,7 @@ // resolution //------------------------------------------------- -void layout_element::element_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param) +void layout_element::element_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param) { texture *elemtex = (texture *)param; @@ -551,10 +551,11 @@ { // get the local scaled bounds rectangle bounds; - bounds.min_x = render_round_nearest(curcomp->bounds().x0 * dest.width); - bounds.min_y = render_round_nearest(curcomp->bounds().y0 * dest.height); - bounds.max_x = render_round_nearest(curcomp->bounds().x1 * dest.width); - bounds.max_y = render_round_nearest(curcomp->bounds().y1 * dest.height); + bounds.min_x = render_round_nearest(curcomp->bounds().x0 * dest.width()); + bounds.min_y = render_round_nearest(curcomp->bounds().y0 * dest.height()); + bounds.max_x = render_round_nearest(curcomp->bounds().x1 * dest.width()); + bounds.max_y = render_round_nearest(curcomp->bounds().y1 * dest.height()); + bounds &= dest.cliprect(); // based on the component type, add to the texture curcomp->draw(elemtex->m_element->machine(), dest, bounds, elemtex->m_state); @@ -602,7 +603,6 @@ : m_next(NULL), m_type(CTYPE_INVALID), m_state(0), - m_bitmap(NULL), m_file(NULL), m_hasalpha(false) { @@ -673,7 +673,6 @@ layout_element::component::~component() { global_free(m_file); - global_free(m_bitmap); } @@ -681,19 +680,17 @@ // draw - draw a component //------------------------------------------------- -void layout_element::component::draw(running_machine &machine, bitmap_t &dest, const rectangle &bounds, int state) +void layout_element::component::draw(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state) { switch (m_type) { case CTYPE_IMAGE: - if (m_bitmap == NULL) - m_bitmap = load_bitmap(); - render_resample_argb_bitmap_hq( - BITMAP_ADDR32(&dest, bounds.min_y, bounds.min_x), - dest.rowpixels, - bounds.max_x - bounds.min_x, - bounds.max_y - bounds.min_y, - m_bitmap, NULL, &m_color); + if (!m_bitmap.valid()) + load_bitmap(); + { + bitmap_argb32 destsub(dest, bounds); + render_resample_argb_bitmap_hq(destsub, m_bitmap, m_color); + } break; case CTYPE_RECT: @@ -743,7 +740,7 @@ // color //------------------------------------------------- -void layout_element::component::draw_rect(bitmap_t &dest, const rectangle &bounds) +void layout_element::component::draw_rect(bitmap_argb32 &dest, const rectangle &bounds) { // compute premultiplied colors UINT32 r = m_color.r * m_color.a * 255.0; @@ -752,8 +749,8 @@ UINT32 inva = (1.0f - m_color.a) * 255.0; // iterate over X and Y - for (UINT32 y = bounds.min_y; y < bounds.max_y; y++) - for (UINT32 x = bounds.min_x; x < bounds.max_x; x++) + for (UINT32 y = bounds.min_y; y <= bounds.max_y; y++) + for (UINT32 x = bounds.min_x; x <= bounds.max_x; x++) { UINT32 finalr = r; UINT32 finalg = g; @@ -762,14 +759,14 @@ // if we're translucent, add in the destination pixel contribution if (inva > 0) { - UINT32 dpix = *BITMAP_ADDR32(&dest, y, x); + UINT32 dpix = dest.pix32(y, x); finalr += (RGB_RED(dpix) * inva) >> 8; finalg += (RGB_GREEN(dpix) * inva) >> 8; finalb += (RGB_BLUE(dpix) * inva) >> 8; } // store the target pixel, dividing the RGBA values by the overall scale factor - *BITMAP_ADDR32(&dest, y, x) = MAKE_ARGB(0xff, finalr, finalg, finalb); + dest.pix32(y, x) = MAKE_ARGB(0xff, finalr, finalg, finalb); } } @@ -779,7 +776,7 @@ // color //------------------------------------------------- -void layout_element::component::draw_disk(bitmap_t &dest, const rectangle &bounds) +void layout_element::component::draw_disk(bitmap_argb32 &dest, const rectangle &bounds) { // compute premultiplied colors UINT32 r = m_color.r * m_color.a * 255.0; @@ -788,14 +785,14 @@ UINT32 inva = (1.0f - m_color.a) * 255.0; // find the center - float xcenter = (float)(bounds.min_x + bounds.max_x) * 0.5f; - float ycenter = (float)(bounds.min_y + bounds.max_y) * 0.5f; - float xradius = (float)(bounds.max_x - bounds.min_x) * 0.5f; - float yradius = (float)(bounds.max_y - bounds.min_y) * 0.5f; + float xcenter = float(bounds.xcenter()); + float ycenter = float(bounds.ycenter()); + float xradius = float(bounds.width()) * 0.5f; + float yradius = float(bounds.height()) * 0.5f; float ooyradius2 = 1.0f / (yradius * yradius); // iterate over y - for (UINT32 y = bounds.min_y; y < bounds.max_y; y++) + for (UINT32 y = bounds.min_y; y <= bounds.max_y; y++) { float ycoord = ycenter - ((float)y + 0.5f); float xval = xradius * sqrt(1.0f - (ycoord * ycoord) * ooyradius2); @@ -814,14 +811,14 @@ // if we're translucent, add in the destination pixel contribution if (inva > 0) { - UINT32 dpix = *BITMAP_ADDR32(&dest, y, x); + UINT32 dpix = dest.pix32(y, x); finalr += (RGB_RED(dpix) * inva) >> 8; finalg += (RGB_GREEN(dpix) * inva) >> 8; finalb += (RGB_BLUE(dpix) * inva) >> 8; } // store the target pixel, dividing the RGBA values by the overall scale factor - *BITMAP_ADDR32(&dest, y, x) = MAKE_ARGB(0xff, finalr, finalg, finalb); + dest.pix32(y, x) = MAKE_ARGB(0xff, finalr, finalg, finalb); } } } @@ -831,7 +828,7 @@ // draw_text - draw text in the specified color //------------------------------------------------- -void layout_element::component::draw_text(running_machine &machine, bitmap_t &dest, const rectangle &bounds) +void layout_element::component::draw_text(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds) { // compute premultiplied colors UINT32 r = m_color.r * 255.0; @@ -845,32 +842,32 @@ INT32 width; while (1) { - width = font->string_width(bounds.max_y - bounds.min_y, aspect, m_string); - if (width < bounds.max_x - bounds.min_x) + width = font->string_width(bounds.height(), aspect, m_string); + if (width < bounds.width()) break; aspect *= 0.9f; } - INT32 curx = bounds.min_x + (bounds.max_x - bounds.min_x - width) / 2; + INT32 curx = bounds.min_x + (bounds.width() - width) / 2; // allocate a temporary bitmap - bitmap_t *tempbitmap = global_alloc(bitmap_t(dest.width, dest.height, BITMAP_FORMAT_ARGB32)); + bitmap_argb32 tempbitmap(dest.width(), dest.height()); // loop over characters for (const char *s = m_string; *s != 0; s++) { // get the font bitmap rectangle chbounds; - font->get_scaled_bitmap_and_bounds(*tempbitmap, bounds.max_y - bounds.min_y, aspect, *s, chbounds); + font->get_scaled_bitmap_and_bounds(tempbitmap, bounds.height(), aspect, *s, chbounds); // copy the data into the target - for (int y = 0; y < chbounds.max_y - chbounds.min_y; y++) + for (int y = 0; y < chbounds.height(); y++) { int effy = bounds.min_y + y; if (effy >= bounds.min_y && effy <= bounds.max_y) { - UINT32 *src = BITMAP_ADDR32(tempbitmap, y, 0); - UINT32 *d = BITMAP_ADDR32(&dest, effy, 0); - for (int x = 0; x < chbounds.max_x - chbounds.min_x; x++) + UINT32 *src = &tempbitmap.pix32(y); + UINT32 *d = &dest.pix32(effy); + for (int x = 0; x < chbounds.width(); x++) { int effx = curx + x + chbounds.min_x; if (effx >= bounds.min_x && effx <= bounds.max_x) @@ -891,11 +888,10 @@ } // advance in the X direction - curx += font->char_width(bounds.max_y - bounds.min_y, aspect, *s); + curx += font->char_width(bounds.height(), aspect, *s); } // free the temporary bitmap and font - global_free(tempbitmap); machine.render().font_free(font); } @@ -905,29 +901,25 @@ // a component //------------------------------------------------- -bitmap_t *layout_element::component::load_bitmap() +void layout_element::component::load_bitmap() { // load the basic bitmap assert(m_file != NULL); - bitmap_t *bitmap = render_load_png(*m_file, m_dirname, m_imagefile, NULL, &m_hasalpha); - if (bitmap != NULL && m_alphafile) + m_hasalpha = render_load_png(m_bitmap, *m_file, m_dirname, m_imagefile); - // load the alpha bitmap if specified - if (render_load_png(*m_file, m_dirname, m_alphafile, bitmap, &m_hasalpha) == NULL) - { - global_free(bitmap); - bitmap = NULL; - } + // load the alpha bitmap if specified + if (m_bitmap.valid() && m_alphafile) + render_load_png(m_bitmap, *m_file, m_dirname, m_alphafile, true); // if we can't load the bitmap, allocate a dummy one and report an error - if (bitmap == NULL) + if (!m_bitmap.valid()) { // draw some stripes in the bitmap - bitmap = global_alloc(bitmap_t(100, 100, BITMAP_FORMAT_ARGB32)); - bitmap_fill(bitmap, NULL, 0); + m_bitmap.allocate(100, 100); + m_bitmap.fill(0); for (int step = 0; step < 100; step += 25) for (int line = 0; line < 100; line++) - *BITMAP_ADDR32(bitmap, (step + line) % 100, line % 100) = MAKE_ARGB(0xff,0xff,0xff,0xff); + m_bitmap.pix32((step + line) % 100, line % 100) = MAKE_ARGB(0xff,0xff,0xff,0xff); // log an error if (!m_alphafile) @@ -935,8 +927,6 @@ else mame_printf_warning("Unable to load component bitmap '%s'/'%s'", m_imagefile.cstr(), m_alphafile.cstr()); } - - return bitmap; } @@ -944,7 +934,7 @@ // draw_led7seg - draw a 7-segment LCD //------------------------------------------------- -void layout_element::component::draw_led7seg(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_led7seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff,0xff,0xff,0xff); const rgb_t offpen = MAKE_ARGB(0xff,0x20,0x20,0x20); @@ -956,40 +946,38 @@ int skewwidth = 40; // allocate a temporary bitmap for drawing - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth + skewwidth, bmheight, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff,0x00,0x00,0x00)); + bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight); + tempbitmap.fill(MAKE_ARGB(0xff,0x00,0x00,0x00)); // top bar - draw_segment_horizontal(*tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 0)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 0)) ? onpen : offpen); // top-right bar - draw_segment_vertical(*tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); // bottom-right bar - draw_segment_vertical(*tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); // bottom bar - draw_segment_horizontal(*tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); // bottom-left bar - draw_segment_vertical(*tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 4)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 4)) ? onpen : offpen); // top-left bar - draw_segment_vertical(*tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 5)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 5)) ? onpen : offpen); // middle bar - draw_segment_horizontal(*tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); // apply skew - apply_skew(*tempbitmap, 40); + apply_skew(tempbitmap, 40); // decimal point - draw_segment_decimal(*tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 7)) ? onpen : offpen); + draw_segment_decimal(tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 7)) ? onpen : offpen); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -997,7 +985,7 @@ // draw_led14seg - draw a 14-segment LCD //------------------------------------------------- -void layout_element::component::draw_led14seg(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_led14seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff, 0xff, 0xff, 0xff); const rgb_t offpen = MAKE_ARGB(0xff, 0x20, 0x20, 0x20); @@ -1009,90 +997,88 @@ int skewwidth = 40; // allocate a temporary bitmap for drawing - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth + skewwidth, bmheight, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); + bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight); + tempbitmap.fill(MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); // top bar - draw_segment_horizontal(*tempbitmap, + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 0)) ? onpen : offpen); // right-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); // right-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); // bottom bar - draw_segment_horizontal(*tempbitmap, + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); // left-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 4)) ? onpen : offpen); // left-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 5)) ? onpen : offpen); // horizontal-middle-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight/2, segwidth, LINE_CAP_START, (pattern & (1 << 6)) ? onpen : offpen); // horizontal-middle-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight/2, segwidth, LINE_CAP_END, (pattern & (1 << 7)) ? onpen : offpen); // vertical-middle-top bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 8)) ? onpen : offpen); // vertical-middle-bottom bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 9)) ? onpen : offpen); // diagonal-left-bottom bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 10)) ? onpen : offpen); // diagonal-left-top bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 11)) ? onpen : offpen); // diagonal-right-top bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 12)) ? onpen : offpen); // diagonal-right-bottom bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 13)) ? onpen : offpen); // apply skew - apply_skew(*tempbitmap, 40); + apply_skew(tempbitmap, 40); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -1101,7 +1087,7 @@ // semicolon (2 extra segments) //------------------------------------------------- -void layout_element::component::draw_led14segsc(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_led14segsc(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff, 0xff, 0xff, 0xff); const rgb_t offpen = MAKE_ARGB(0xff, 0x20, 0x20, 0x20); @@ -1113,99 +1099,97 @@ int skewwidth = 40; // allocate a temporary bitmap for drawing, adding some extra space for the tail - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth + skewwidth, bmheight + segwidth, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); + bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight + segwidth); + tempbitmap.fill(MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); // top bar - draw_segment_horizontal(*tempbitmap, + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 0)) ? onpen : offpen); // right-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); // right-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); // bottom bar - draw_segment_horizontal(*tempbitmap, + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); // left-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 4)) ? onpen : offpen); // left-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 5)) ? onpen : offpen); // horizontal-middle-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight/2, segwidth, LINE_CAP_START, (pattern & (1 << 6)) ? onpen : offpen); // horizontal-middle-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight/2, segwidth, LINE_CAP_END, (pattern & (1 << 7)) ? onpen : offpen); // vertical-middle-top bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 8)) ? onpen : offpen); // vertical-middle-bottom bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 9)) ? onpen : offpen); // diagonal-left-bottom bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 10)) ? onpen : offpen); // diagonal-left-top bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 11)) ? onpen : offpen); // diagonal-right-top bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 12)) ? onpen : offpen); // diagonal-right-bottom bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 13)) ? onpen : offpen); // apply skew - apply_skew(*tempbitmap, 40); + apply_skew(tempbitmap, 40); // comma tail - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth - (segwidth/2), bmwidth + segwidth, bmheight - (segwidth), bmheight + segwidth*1.5, segwidth/2, (pattern & (1 << 15)) ? onpen : offpen); // decimal point - draw_segment_decimal(*tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 14)) ? onpen : offpen); + draw_segment_decimal(tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 14)) ? onpen : offpen); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -1213,7 +1197,7 @@ // draw_led16seg - draw a 16-segment LCD //------------------------------------------------- -void layout_element::component::draw_led16seg(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_led16seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff, 0xff, 0xff, 0xff); const rgb_t offpen = MAKE_ARGB(0xff, 0x20, 0x20, 0x20); @@ -1225,100 +1209,98 @@ int skewwidth = 40; // allocate a temporary bitmap for drawing - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth + skewwidth, bmheight, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); + bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight); + tempbitmap.fill(MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); // top-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, 0 + segwidth/2, segwidth, LINE_CAP_START, (pattern & (1 << 0)) ? onpen : offpen); // top-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, LINE_CAP_END, (pattern & (1 << 1)) ? onpen : offpen); // right-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); // right-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); // bottom-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, LINE_CAP_END, (pattern & (1 << 4)) ? onpen : offpen); // bottom-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight - segwidth/2, segwidth, LINE_CAP_START, (pattern & (1 << 5)) ? onpen : offpen); // left-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); // left-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 7)) ? onpen : offpen); // horizontal-middle-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight/2, segwidth, LINE_CAP_START, (pattern & (1 << 8)) ? onpen : offpen); // horizontal-middle-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight/2, segwidth, LINE_CAP_END, (pattern & (1 << 9)) ? onpen : offpen); // vertical-middle-top bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 10)) ? onpen : offpen); // vertical-middle-bottom bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 11)) ? onpen : offpen); // diagonal-left-bottom bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 12)) ? onpen : offpen); // diagonal-left-top bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 13)) ? onpen : offpen); // diagonal-right-top bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 14)) ? onpen : offpen); // diagonal-right-bottom bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 15)) ? onpen : offpen); // apply skew - apply_skew(*tempbitmap, 40); + apply_skew(tempbitmap, 40); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -1327,7 +1309,7 @@ // semicolon (2 extra segments) //------------------------------------------------- -void layout_element::component::draw_led16segsc(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_led16segsc(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff, 0xff, 0xff, 0xff); const rgb_t offpen = MAKE_ARGB(0xff, 0x20, 0x20, 0x20); @@ -1339,109 +1321,107 @@ int skewwidth = 40; // allocate a temporary bitmap for drawing - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth + skewwidth, bmheight + segwidth, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); + bitmap_argb32 tempbitmap(bmwidth + skewwidth, bmheight + segwidth); + tempbitmap.fill(MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); // top-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, 0 + segwidth/2, segwidth, LINE_CAP_START, (pattern & (1 << 0)) ? onpen : offpen); // top-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, LINE_CAP_END, (pattern & (1 << 1)) ? onpen : offpen); // right-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); // right-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 3)) ? onpen : offpen); // bottom-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, LINE_CAP_END, (pattern & (1 << 4)) ? onpen : offpen); // bottom-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight - segwidth/2, segwidth, LINE_CAP_START, (pattern & (1 << 5)) ? onpen : offpen); // left-bottom bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); // left-top bar - draw_segment_vertical(*tempbitmap, + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 7)) ? onpen : offpen); // horizontal-middle-left bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + 2*segwidth/3, bmwidth/2 - segwidth/10, bmheight/2, segwidth, LINE_CAP_START, (pattern & (1 << 8)) ? onpen : offpen); // horizontal-middle-right bar - draw_segment_horizontal_caps(*tempbitmap, + draw_segment_horizontal_caps(tempbitmap, 0 + bmwidth/2 + segwidth/10, bmwidth - 2*segwidth/3, bmheight/2, segwidth, LINE_CAP_END, (pattern & (1 << 9)) ? onpen : offpen); // vertical-middle-top bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 10)) ? onpen : offpen); // vertical-middle-bottom bar - draw_segment_vertical_caps(*tempbitmap, + draw_segment_vertical_caps(tempbitmap, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, bmwidth/2, segwidth, LINE_CAP_NONE, (pattern & (1 << 11)) ? onpen : offpen); // diagonal-left-bottom bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 12)) ? onpen : offpen); // diagonal-left-top bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, 0 + segwidth + segwidth/5, bmwidth/2 - segwidth/2 - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 13)) ? onpen : offpen); // diagonal-right-top bar - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, 0 + segwidth + segwidth/3, bmheight/2 - segwidth/2 - segwidth/3, segwidth, (pattern & (1 << 14)) ? onpen : offpen); // diagonal-right-bottom bar - draw_segment_diagonal_2(*tempbitmap, + draw_segment_diagonal_2(tempbitmap, bmwidth/2 + segwidth/2 + segwidth/5, bmwidth - segwidth - segwidth/5, bmheight/2 + segwidth/2 + segwidth/3, bmheight - segwidth - segwidth/3, segwidth, (pattern & (1 << 15)) ? onpen : offpen); // comma tail - draw_segment_diagonal_1(*tempbitmap, + draw_segment_diagonal_1(tempbitmap, bmwidth - (segwidth/2), bmwidth + segwidth, bmheight - (segwidth), bmheight + segwidth*1.5, segwidth/2, (pattern & (1 << 17)) ? onpen : offpen); // decimal point (draw last for priority) - draw_segment_decimal(*tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 16)) ? onpen : offpen); + draw_segment_decimal(tempbitmap, bmwidth + segwidth/2, bmheight - segwidth/2, segwidth, (pattern & (1 << 16)) ? onpen : offpen); // apply skew - apply_skew(*tempbitmap, 40); + apply_skew(tempbitmap, 40); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -1450,7 +1430,7 @@ // dotmatrix //------------------------------------------------- -void layout_element::component::draw_dotmatrix(bitmap_t &dest, const rectangle &bounds, int pattern) +void layout_element::component::draw_dotmatrix(bitmap_argb32 &dest, const rectangle &bounds, int pattern) { const rgb_t onpen = MAKE_ARGB(0xff, 0xff, 0xff, 0xff); const rgb_t offpen = MAKE_ARGB(0xff, 0x20, 0x20, 0x20); @@ -1461,16 +1441,14 @@ int dotwidth = 250; // allocate a temporary bitmap for drawing - bitmap_t *tempbitmap = global_alloc(bitmap_t(bmwidth, bmheight, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tempbitmap, NULL, MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); + bitmap_argb32 tempbitmap(bmwidth, bmheight); + tempbitmap.fill(MAKE_ARGB(0xff, 0x00, 0x00, 0x00)); for (int i = 0; i < 8; i++) - draw_segment_decimal(*tempbitmap, ((dotwidth/2 )+ (i * dotwidth)), bmheight/2, dotwidth, (pattern & (1 << i))?onpen:offpen); + draw_segment_decimal(tempbitmap, ((dotwidth/2 )+ (i * dotwidth)), bmheight/2, dotwidth, (pattern & (1 << i))?onpen:offpen); // resample to the target size - render_resample_argb_bitmap_hq(dest.base, dest.rowpixels, dest.width, dest.height, tempbitmap, NULL, &m_color); - - global_free(tempbitmap); + render_resample_argb_bitmap_hq(dest, tempbitmap, m_color); } @@ -1480,13 +1458,13 @@ // and start points //------------------------------------------------- -void layout_element::component::draw_segment_horizontal_caps(bitmap_t &dest, int minx, int maxx, int midy, int width, int caps, rgb_t color) +void layout_element::component::draw_segment_horizontal_caps(bitmap_argb32 &dest, int minx, int maxx, int midy, int width, int caps, rgb_t color) { // loop over the width of the segment for (int y = 0; y < width / 2; y++) { - UINT32 *d0 = BITMAP_ADDR32(&dest, midy - y, 0); - UINT32 *d1 = BITMAP_ADDR32(&dest, midy + y, 0); + UINT32 *d0 = &dest.pix32(midy - y); + UINT32 *d1 = &dest.pix32(midy + y); int ty = (y < width / 8) ? width / 8 : y; // loop over the length of the segment @@ -1501,7 +1479,7 @@ // LED segment //------------------------------------------------- -void layout_element::component::draw_segment_horizontal(bitmap_t &dest, int minx, int maxx, int midy, int width, rgb_t color) +void layout_element::component::draw_segment_horizontal(bitmap_argb32 &dest, int minx, int maxx, int midy, int width, rgb_t color) { draw_segment_horizontal_caps(dest, minx, maxx, midy, width, LINE_CAP_START | LINE_CAP_END, color); } @@ -1513,18 +1491,18 @@ // and start points //------------------------------------------------- -void layout_element::component::draw_segment_vertical_caps(bitmap_t &dest, int miny, int maxy, int midx, int width, int caps, rgb_t color) +void layout_element::component::draw_segment_vertical_caps(bitmap_argb32 &dest, int miny, int maxy, int midx, int width, int caps, rgb_t color) { // loop over the width of the segment for (int x = 0; x < width / 2; x++) { - UINT32 *d0 = BITMAP_ADDR32(&dest, 0, midx - x); - UINT32 *d1 = BITMAP_ADDR32(&dest, 0, midx + x); + UINT32 *d0 = &dest.pix32(0, midx - x); + UINT32 *d1 = &dest.pix32(0, midx + x); int tx = (x < width / 8) ? width / 8 : x; // loop over the length of the segment for (int y = miny + ((caps & LINE_CAP_START) ? tx : 0); y < maxy - ((caps & LINE_CAP_END) ? tx : 0); y++) - d0[y * dest.rowpixels] = d1[y * dest.rowpixels] = color; + d0[y * dest.rowpixels()] = d1[y * dest.rowpixels()] = color; } } @@ -1534,7 +1512,7 @@ // LED segment //------------------------------------------------- -void layout_element::component::draw_segment_vertical(bitmap_t &dest, int miny, int maxy, int midx, int width, rgb_t color) +void layout_element::component::draw_segment_vertical(bitmap_argb32 &dest, int miny, int maxy, int midx, int width, rgb_t color) { draw_segment_vertical_caps(dest, miny, maxy, midx, width, LINE_CAP_START | LINE_CAP_END, color); } @@ -1545,7 +1523,7 @@ // LED segment that looks like this: / //------------------------------------------------- -void layout_element::component::draw_segment_diagonal_1(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) +void layout_element::component::draw_segment_diagonal_1(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) { // compute parameters width *= 1.5; @@ -1553,14 +1531,14 @@ // draw line for (int x = minx; x < maxx; x++) - if (x >= 0 && x < dest.width) + if (x >= 0 && x < dest.width()) { - UINT32 *d = BITMAP_ADDR32(&dest, 0, x); + UINT32 *d = &dest.pix32(0, x); int step = (x - minx) * ratio; for (int y = maxy - width - step; y < maxy - step; y++) - if (y >= 0 && y < dest.height) - d[y * dest.rowpixels] = color; + if (y >= 0 && y < dest.height()) + d[y * dest.rowpixels()] = color; } } @@ -1570,7 +1548,7 @@ // LED segment that looks like this: //------------------------------------------------- -void layout_element::component::draw_segment_diagonal_2(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) +void layout_element::component::draw_segment_diagonal_2(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) { // compute parameters width *= 1.5; @@ -1578,14 +1556,14 @@ // draw line for (int x = minx; x < maxx; x++) - if (x >= 0 && x < dest.width) + if (x >= 0 && x < dest.width()) { - UINT32 *d = BITMAP_ADDR32(&dest, 0, x); + UINT32 *d = &dest.pix32(0, x); int step = (x - minx) * ratio; for (int y = miny + step; y < miny + step + width; y++) - if (y >= 0 && y < dest.height) - d[y * dest.rowpixels] = color; + if (y >= 0 && y < dest.height()) + d[y * dest.rowpixels()] = color; } } @@ -1594,7 +1572,7 @@ // draw_segment_decimal - draw a decimal point //------------------------------------------------- -void layout_element::component::draw_segment_decimal(bitmap_t &dest, int midx, int midy, int width, rgb_t color) +void layout_element::component::draw_segment_decimal(bitmap_argb32 &dest, int midx, int midy, int width, rgb_t color) { // compute parameters width /= 2; @@ -1603,8 +1581,8 @@ // iterate over y for (UINT32 y = 0; y <= width; y++) { - UINT32 *d0 = BITMAP_ADDR32(&dest, midy - y, 0); - UINT32 *d1 = BITMAP_ADDR32(&dest, midy + y, 0); + UINT32 *d0 = &dest.pix32(midy - y); + UINT32 *d1 = &dest.pix32(midy + y); float xval = width * sqrt(1.0f - (float)(y * y) * ooradius2); INT32 left, right; @@ -1623,7 +1601,7 @@ // draw_segment_comma - draw a comma tail //------------------------------------------------- -void layout_element::component::draw_segment_comma(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) +void layout_element::component::draw_segment_comma(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color) { // compute parameters width *= 1.5; @@ -1632,26 +1610,26 @@ // draw line for (int x = minx; x < maxx; x++) { - UINT32 *d = BITMAP_ADDR32(&dest, 0, x); + UINT32 *d = &dest.pix32(0, x); int step = (x - minx) * ratio; for (int y = maxy; y < maxy - width - step; y--) - d[y * dest.rowpixels] = color; + d[y * dest.rowpixels()] = color; } } //------------------------------------------------- -// apply_skew - apply skew to a bitmap_t +// apply_skew - apply skew to a bitmap //------------------------------------------------- -void layout_element::component::apply_skew(bitmap_t &dest, int skewwidth) +void layout_element::component::apply_skew(bitmap_argb32 &dest, int skewwidth) { - for (int y = 0; y < dest.height; y++) + for (int y = 0; y < dest.height(); y++) { - UINT32 *destrow = BITMAP_ADDR32(&dest, y, 0); - int offs = skewwidth * (dest.height - y) / dest.height; - for (int x = dest.width - skewwidth - 1; x >= 0; x--) + UINT32 *destrow = &dest.pix32(y); + int offs = skewwidth * (dest.height() - y) / dest.height(); + for (int x = dest.width() - skewwidth - 1; x >= 0; x--) destrow[x + offs] = destrow[x]; for (int x = 0; x < offs; x++) destrow[x] = 0; @@ -1885,7 +1863,10 @@ // fetch common data int index = xml_get_attribute_int_with_subst(machine, itemnode, "index", -1); if (index != -1) - m_screen = downcast(machine.devicelist().find(SCREEN, index)); + { + screen_device_iterator iter(machine.root_device()); + m_screen = iter.byindex(index); + } m_input_mask = xml_get_attribute_int_with_subst(machine, itemnode, "inputmask", 0); if (m_output_name[0] != 0 && m_element != NULL) output_set_value(m_output_name, m_element->default_state()); @@ -1933,7 +1914,7 @@ // if configured to an input, fetch the input value else if (m_input_tag[0] != 0) { - const input_field_config *field = input_field_by_tag_and_mask(m_element->machine().m_portlist, m_input_tag, m_input_mask); + const input_field_config *field = input_field_by_tag_and_mask(m_element->machine(), m_input_tag, m_input_mask); if (field != NULL) state = ((input_port_read_safe(m_element->machine(), m_input_tag, 0) ^ field->defvalue) & m_input_mask) ? 1 : 0; } diff -Nru mame-0.144/src/emu/rendlay.h mame-0.145/src/emu/rendlay.h --- mame-0.144/src/emu/rendlay.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/rendlay.h 2012-02-06 21:30:28.000000000 +0000 @@ -104,7 +104,7 @@ const render_bounds &bounds() const { return m_bounds; } // operations - void draw(running_machine &machine, bitmap_t &dest, const rectangle &bounds, int state); + void draw(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds, int state); private: // component types @@ -125,25 +125,25 @@ }; // helpers - void draw_rect(bitmap_t &dest, const rectangle &bounds); - void draw_disk(bitmap_t &dest, const rectangle &bounds); - void draw_text(running_machine &machine, bitmap_t &dest, const rectangle &bounds); - bitmap_t *load_bitmap(); - void draw_led7seg(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_led14seg(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_led14segsc(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_led16seg(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_led16segsc(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_dotmatrix(bitmap_t &dest, const rectangle &bounds, int pattern); - void draw_segment_horizontal_caps(bitmap_t &dest, int minx, int maxx, int midy, int width, int caps, rgb_t color); - void draw_segment_horizontal(bitmap_t &dest, int minx, int maxx, int midy, int width, rgb_t color); - void draw_segment_vertical_caps(bitmap_t &dest, int miny, int maxy, int midx, int width, int caps, rgb_t color); - void draw_segment_vertical(bitmap_t &dest, int miny, int maxy, int midx, int width, rgb_t color); - void draw_segment_diagonal_1(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); - void draw_segment_diagonal_2(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); - void draw_segment_decimal(bitmap_t &dest, int midx, int midy, int width, rgb_t color); - void draw_segment_comma(bitmap_t &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); - void apply_skew(bitmap_t &dest, int skewwidth); + void draw_rect(bitmap_argb32 &dest, const rectangle &bounds); + void draw_disk(bitmap_argb32 &dest, const rectangle &bounds); + void draw_text(running_machine &machine, bitmap_argb32 &dest, const rectangle &bounds); + void load_bitmap(); + void draw_led7seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_led14seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_led14segsc(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_led16seg(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_led16segsc(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_dotmatrix(bitmap_argb32 &dest, const rectangle &bounds, int pattern); + void draw_segment_horizontal_caps(bitmap_argb32 &dest, int minx, int maxx, int midy, int width, int caps, rgb_t color); + void draw_segment_horizontal(bitmap_argb32 &dest, int minx, int maxx, int midy, int width, rgb_t color); + void draw_segment_vertical_caps(bitmap_argb32 &dest, int miny, int maxy, int midx, int width, int caps, rgb_t color); + void draw_segment_vertical(bitmap_argb32 &dest, int miny, int maxy, int midx, int width, rgb_t color); + void draw_segment_diagonal_1(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); + void draw_segment_diagonal_2(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); + void draw_segment_decimal(bitmap_argb32 &dest, int midx, int midy, int width, rgb_t color); + void draw_segment_comma(bitmap_argb32 &dest, int minx, int maxx, int miny, int maxy, int width, rgb_t color); + void apply_skew(bitmap_argb32 &dest, int skewwidth); // internal state component * m_next; // link to next component @@ -152,7 +152,7 @@ render_bounds m_bounds; // bounds of the element render_color m_color; // color of the element astring m_string; // string for text components - bitmap_t * m_bitmap; // source bitmap for images + bitmap_argb32 m_bitmap; // source bitmap for images astring m_dirname; // directory name of image file (for lazy loading) emu_file * m_file; // file object for reading image/alpha files astring m_imagefile; // name of the image file (for lazy loading) @@ -173,7 +173,7 @@ }; // internal helpers - static void element_scale(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param); + static void element_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param); // internal state layout_element * m_next; // link to next element diff -Nru mame-0.144/src/emu/rendutil.c mame-0.145/src/emu/rendutil.c --- mame-0.144/src/emu/rendutil.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/rendutil.c 2012-02-06 21:30:28.000000000 +0000 @@ -21,10 +21,10 @@ ***************************************************************************/ /* utilities */ -static void resample_argb_bitmap_average(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color *color, UINT32 dx, UINT32 dy); -static void resample_argb_bitmap_bilinear(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color *color, UINT32 dx, UINT32 dy); -static void copy_png_to_bitmap(bitmap_t *bitmap, const png_info *png, bool *hasalpha); -static void copy_png_alpha_to_bitmap(bitmap_t *bitmap, const png_info *png, bool *hasalpha); +static void resample_argb_bitmap_average(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color &color, UINT32 dx, UINT32 dy); +static void resample_argb_bitmap_bilinear(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color &color, UINT32 dx, UINT32 dy); +static bool copy_png_to_bitmap(bitmap_argb32 &bitmap, const png_info *png); +static bool copy_png_alpha_to_bitmap(bitmap_argb32 &bitmap, const png_info *png); @@ -53,40 +53,27 @@ quality resampling of a texture -------------------------------------------------*/ -void render_resample_argb_bitmap_hq(void *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const bitmap_t *source, const rectangle *orig_sbounds, const render_color *color) +void render_resample_argb_bitmap_hq(bitmap_argb32 &dest, bitmap_argb32 &source, const render_color &color) { - UINT32 swidth, sheight; - const UINT32 *sbase; - rectangle sbounds; - UINT32 dx, dy; - - if (dwidth == 0 || dheight == 0) + if (dest.width() == 0 || dest.height() == 0) return; - /* compute the real source bounds */ - if (orig_sbounds != NULL) - sbounds = *orig_sbounds; - else - { - sbounds.min_x = sbounds.min_y = 0; - sbounds.max_x = source->width; - sbounds.max_y = source->height; - } - /* adjust the source base */ - sbase = (const UINT32 *)source->base + sbounds.min_y * source->rowpixels + sbounds.min_x; + const UINT32 *sbase = &source.pix32(0); /* determine the steppings */ - swidth = sbounds.max_x - sbounds.min_x; - sheight = sbounds.max_y - sbounds.min_y; - dx = (swidth << 12) / dwidth; - dy = (sheight << 12) / dheight; + UINT32 swidth = source.width(); + UINT32 sheight = source.height(); + UINT32 dwidth = dest.width(); + UINT32 dheight = dest.height(); + UINT32 dx = (swidth << 12) / dwidth; + UINT32 dy = (sheight << 12) / dheight; /* if the source is higher res than the target, use full averaging */ if (dx > 0x1000 || dy > 0x1000) - resample_argb_bitmap_average((UINT32 *)dest, drowpixels, dwidth, dheight, sbase, source->rowpixels, swidth, sheight, color, dx, dy); + resample_argb_bitmap_average(&dest.pix(0), dest.rowpixels(), dwidth, dheight, sbase, source.rowpixels(), swidth, sheight, color, dx, dy); else - resample_argb_bitmap_bilinear((UINT32 *)dest, drowpixels, dwidth, dheight, sbase, source->rowpixels, swidth, sheight, color, dx, dy); + resample_argb_bitmap_bilinear(&dest.pix(0), dest.rowpixels(), dwidth, dheight, sbase, source.rowpixels(), swidth, sheight, color, dx, dy); } @@ -96,17 +83,17 @@ all contributing pixels -------------------------------------------------*/ -static void resample_argb_bitmap_average(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color *color, UINT32 dx, UINT32 dy) +static void resample_argb_bitmap_average(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color &color, UINT32 dx, UINT32 dy) { UINT64 sumscale = (UINT64)dx * (UINT64)dy; UINT32 r, g, b, a; UINT32 x, y; /* precompute premultiplied R/G/B/A factors */ - r = color->r * color->a * 256.0; - g = color->g * color->a * 256.0; - b = color->b * color->a * 256.0; - a = color->a * 256.0; + r = color.r * color.a * 256.0; + g = color.g * color.a * 256.0; + b = color.b * color.a * 256.0; + a = color.a * 256.0; /* loop over the target vertically */ for (y = 0; y < dheight; y++) @@ -188,17 +175,17 @@ sampling via a bilinear filter -------------------------------------------------*/ -static void resample_argb_bitmap_bilinear(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color *color, UINT32 dx, UINT32 dy) +static void resample_argb_bitmap_bilinear(UINT32 *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const UINT32 *source, UINT32 srowpixels, UINT32 swidth, UINT32 sheight, const render_color &color, UINT32 dx, UINT32 dy) { UINT32 maxx = swidth << 12, maxy = sheight << 12; UINT32 r, g, b, a; UINT32 x, y; /* precompute premultiplied R/G/B/A factors */ - r = color->r * color->a * 256.0; - g = color->g * color->a * 256.0; - b = color->b * color->a * 256.0; - a = color->a * 256.0; + r = color.r * color.a * 256.0; + g = color.g * color.a * 256.0; + b = color.b * color.a * 256.0; + a = color.a * 256.0; /* loop over the target vertically */ for (y = 0; y < dheight; y++) @@ -557,16 +544,16 @@ /*------------------------------------------------- render_load_png - load a PNG file into a - bitmap_t + bitmap -------------------------------------------------*/ -bitmap_t *render_load_png(emu_file &file, const char *dirname, const char *filename, bitmap_t *alphadest, bool *hasalpha) +bool render_load_png(bitmap_argb32 &bitmap, emu_file &file, const char *dirname, const char *filename, bool load_as_alpha_to_existing) { - bitmap_t *bitmap = NULL; - png_info png; - png_error result; + // deallocate if we're not overlaying alpha + if (!load_as_alpha_to_existing) + bitmap.reset(); - /* open the file */ + // open the file astring fname; if (dirname == NULL) fname.cpy(filename); @@ -574,58 +561,53 @@ fname.cpy(dirname).cat(PATH_SEPARATOR).cat(filename); file_error filerr = file.open(fname); if (filerr != FILERR_NONE) - return NULL; + return false; - /* read the PNG data */ - result = png_read_file(file, &png); + // read the PNG data + png_info png; + png_error result = png_read_file(file, &png); file.close(); if (result != PNGERR_NONE) - return NULL; + return false; - /* verify we can handle this PNG */ + // verify we can handle this PNG if (png.bit_depth > 8) { logerror("%s: Unsupported bit depth %d (8 bit max)\n", filename, png.bit_depth); png_free(&png); - return NULL; + return false; } if (png.interlace_method != 0) { logerror("%s: Interlace unsupported\n", filename); png_free(&png); - return NULL; + return false; } if (png.color_type != 0 && png.color_type != 3 && png.color_type != 2 && png.color_type != 6) { logerror("%s: Unsupported color type %d\n", filename, png.color_type); png_free(&png); - return NULL; + return false; } - /* if less than 8 bits, upsample */ + // if less than 8 bits, upsample png_expand_buffer_8bit(&png); - /* non-alpha case */ - if (alphadest == NULL) + // non-alpha case + bool hasalpha = false; + if (!load_as_alpha_to_existing) { - bitmap = global_alloc(bitmap_t(png.width, png.height, BITMAP_FORMAT_ARGB32)); - if (bitmap != NULL) - copy_png_to_bitmap(bitmap, &png, hasalpha); + bitmap.allocate(png.width, png.height); + hasalpha = copy_png_to_bitmap(bitmap, &png); } - /* alpha case */ - else - { - if (png.width == alphadest->width && png.height == alphadest->height) - { - bitmap = alphadest; - copy_png_alpha_to_bitmap(bitmap, &png, hasalpha); - } - } + // alpha case + else if (png.width == bitmap.width() && png.height == bitmap.height()) + hasalpha = copy_png_alpha_to_bitmap(bitmap, &png); - /* free PNG data */ + // free PNG data png_free(&png); - return bitmap; + return hasalpha; } @@ -634,7 +616,7 @@ bitmap -------------------------------------------------*/ -static void copy_png_to_bitmap(bitmap_t *bitmap, const png_info *png, bool *hasalpha) +static bool copy_png_to_bitmap(bitmap_argb32 &bitmap, const png_info *png) { UINT8 accumalpha = 0xff; UINT8 *src; @@ -651,7 +633,7 @@ /* determine alpha and expand to 32bpp */ UINT8 alpha = (*src < png->num_trans) ? png->trans[*src] : 0xff; accumalpha &= alpha; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(alpha, png->palette[*src * 3], png->palette[*src * 3 + 1], png->palette[*src * 3 + 2]); + bitmap.pix32(y, x) = MAKE_ARGB(alpha, png->palette[*src * 3], png->palette[*src * 3 + 1], png->palette[*src * 3 + 2]); } } @@ -662,7 +644,7 @@ src = png->image; for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src++) - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(0xff, *src, *src, *src); + bitmap.pix32(y, x) = MAKE_ARGB(0xff, *src, *src, *src); } /* handle 32bpp non-alpha case */ @@ -672,7 +654,7 @@ src = png->image; for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src += 3) - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(0xff, src[0], src[1], src[2]); + bitmap.pix32(y, x) = MAKE_ARGB(0xff, src[0], src[1], src[2]); } /* handle 32bpp alpha case */ @@ -684,13 +666,12 @@ for (x = 0; x < png->width; x++, src += 4) { accumalpha &= src[3]; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(src[3], src[0], src[1], src[2]); + bitmap.pix32(y, x) = MAKE_ARGB(src[3], src[0], src[1], src[2]); } } /* set the hasalpha flag */ - if (hasalpha != NULL) - *hasalpha = (accumalpha != 0xff); + return (accumalpha != 0xff); } @@ -699,7 +680,7 @@ to the alpha channel of a bitmap -------------------------------------------------*/ -static void copy_png_alpha_to_bitmap(bitmap_t *bitmap, const png_info *png, bool *hasalpha) +static bool copy_png_alpha_to_bitmap(bitmap_argb32 &bitmap, const png_info *png) { UINT8 accumalpha = 0xff; UINT8 *src; @@ -713,10 +694,10 @@ for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src++) { - rgb_t pixel = *BITMAP_ADDR32(bitmap, y, x); + rgb_t pixel = bitmap.pix32(y, x); UINT8 alpha = compute_brightness(MAKE_RGB(png->palette[*src * 3], png->palette[*src * 3 + 1], png->palette[*src * 3 + 2])); accumalpha &= alpha; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); + bitmap.pix32(y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); } } @@ -728,9 +709,9 @@ for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src++) { - rgb_t pixel = *BITMAP_ADDR32(bitmap, y, x); + rgb_t pixel = bitmap.pix32(y, x); accumalpha &= *src; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(*src, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); + bitmap.pix32(y, x) = MAKE_ARGB(*src, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); } } @@ -742,10 +723,10 @@ for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src += 3) { - rgb_t pixel = *BITMAP_ADDR32(bitmap, y, x); + rgb_t pixel = bitmap.pix32(y, x); UINT8 alpha = compute_brightness(MAKE_RGB(src[0], src[1], src[2])); accumalpha &= alpha; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); + bitmap.pix32(y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); } } @@ -757,14 +738,13 @@ for (y = 0; y < png->height; y++) for (x = 0; x < png->width; x++, src += 4) { - rgb_t pixel = *BITMAP_ADDR32(bitmap, y, x); + rgb_t pixel = bitmap.pix32(y, x); UINT8 alpha = compute_brightness(MAKE_RGB(src[0], src[1], src[2])); accumalpha &= alpha; - *BITMAP_ADDR32(bitmap, y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); + bitmap.pix32(y, x) = MAKE_ARGB(alpha, RGB_RED(pixel), RGB_GREEN(pixel), RGB_BLUE(pixel)); } } /* set the hasalpha flag */ - if (hasalpha != NULL) - *hasalpha = (accumalpha != 0xff); + return (accumalpha != 0xff); } diff -Nru mame-0.144/src/emu/rendutil.h mame-0.145/src/emu/rendutil.h --- mame-0.144/src/emu/rendutil.h 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/rendutil.h 2012-02-06 21:30:28.000000000 +0000 @@ -24,11 +24,11 @@ /* ----- render utilities ----- */ -void render_resample_argb_bitmap_hq(void *dest, UINT32 drowpixels, UINT32 dwidth, UINT32 dheight, const bitmap_t *source, const rectangle *sbounds, const render_color *color); +void render_resample_argb_bitmap_hq(bitmap_argb32 &dest, bitmap_argb32 &source, const render_color &color); int render_clip_line(render_bounds *bounds, const render_bounds *clip); int render_clip_quad(render_bounds *bounds, const render_bounds *clip, render_quad_texuv *texcoords); void render_line_to_quad(const render_bounds *bounds, float width, render_bounds *bounds0, render_bounds *bounds1); -bitmap_t *render_load_png(emu_file &file, const char *dirname, const char *filename, bitmap_t *alphadest, bool *hasalpha); +bool render_load_png(bitmap_argb32 &bitmap, emu_file &file, const char *dirname, const char *filename, bool load_as_alpha_to_existing = false); diff -Nru mame-0.144/src/emu/romload.c mame-0.145/src/emu/romload.c --- mame-0.144/src/emu/romload.c 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/romload.c 2012-02-06 21:30:28.000000000 +0000 @@ -34,15 +34,38 @@ TYPE DEFINITIONS ***************************************************************************/ -typedef struct _open_chd open_chd; -struct _open_chd +class open_chd { - open_chd * next; /* pointer to next in the list */ - const char * region; /* disk region we came from */ - chd_file * origchd; /* handle to the original CHD */ - emu_file * origfile; /* file handle to the original CHD file */ - chd_file * diffchd; /* handle to the diff CHD */ - emu_file * difffile; /* file handle to the diff CHD file */ + friend class simple_list; + +public: + open_chd(const char *region, emu_file &file, chd_file &chdfile, emu_file *difffile = NULL, chd_file *diffchd = NULL) + : m_next(NULL), + m_region(region), + m_origchd(&chdfile), + m_origfile(&file), + m_diffchd(diffchd), + m_difffile(difffile) { } + + ~open_chd() + { + if (m_diffchd != NULL) chd_close(m_diffchd); + global_free(m_difffile); + chd_close(m_origchd); + global_free(m_origfile); + } + + open_chd *next() const { return m_next; } + const char *region() const { return m_region; } + chd_file *chd() const { return (m_diffchd != NULL) ? m_diffchd : m_origchd; } + +private: + open_chd * m_next; /* pointer to next in the list */ + astring m_region; /* disk region we came from */ + chd_file * m_origchd; /* handle to the original CHD */ + emu_file * m_origfile; /* file handle to the original CHD file */ + chd_file * m_diffchd; /* handle to the diff CHD */ + emu_file * m_difffile; /* file handle to the diff CHD file */ }; @@ -65,8 +88,7 @@ UINT32 romstotalsize; /* total size of ROMs to read */ emu_file * file; /* current file */ - open_chd * chd_list; /* disks */ - open_chd ** chd_list_tailptr; + simple_list chd_list; /* disks */ memory_region * region; /* info about current region */ @@ -132,46 +154,21 @@ chd_file *get_disk_handle(running_machine &machine, const char *region) { - open_chd *curdisk; - - for (curdisk = machine.romload_data->chd_list; curdisk != NULL; curdisk = curdisk->next) - if (strcmp(curdisk->region, region) == 0) - return (curdisk->diffchd != NULL) ? curdisk->diffchd : curdisk->origchd; + for (open_chd *curdisk = machine.romload_data->chd_list.first(); curdisk != NULL; curdisk = curdisk->next()) + if (strcmp(curdisk->region(), region) == 0) + return curdisk->chd(); return NULL; } /*------------------------------------------------- - add_disk_handle - add a disk to the to the - list of CHD files --------------------------------------------------*/ - -static void add_disk_handle(running_machine &machine, open_chd *chd) -{ - romload_private *romload_data = machine.romload_data; - - *romload_data->chd_list_tailptr = auto_alloc(machine, open_chd); - **romload_data->chd_list_tailptr = *chd; - romload_data->chd_list_tailptr = &(*romload_data->chd_list_tailptr)->next; -} - - -/*------------------------------------------------- set_disk_handle - set a pointer to the CHD file associated with the given region -------------------------------------------------*/ void set_disk_handle(running_machine &machine, const char *region, emu_file &file, chd_file &chdfile) { - open_chd chd = { 0 }; - - /* note the region we are in */ - chd.region = region; - chd.origchd = &chdfile; - chd.origfile = &file; - - /* we're okay, add to the list of disks */ - add_disk_handle(machine, &chd); + machine.romload_data->chd_list.append(*global_alloc(open_chd(region, file, chdfile))); } @@ -188,7 +185,8 @@ const rom_source *rom_first_source(const machine_config &config) { /* look through devices */ - for (const device_t *device = config.devicelist().first(); device != NULL; device = device->next()) + device_iterator iter(config.root_device()); + for (const device_t *device = iter.first(); device != NULL; device = iter.next()) if (device->rom_region() != NULL) return device; @@ -204,9 +202,16 @@ const rom_source *rom_next_source(const rom_source &previous) { /* look for further devices with ROM definitions */ - for (const device_t *device = previous.next(); device != NULL; device = device->next()) +// fixme: this is awful + device_iterator iter(previous.mconfig().root_device()); + const device_t *device; + for (device = iter.first(); device != NULL; device = iter.next()) + if (device == &previous) + break; + + for (device = iter.next(); device != NULL; device = iter.next()) if (device->rom_region() != NULL) - return (rom_source *)device; + return device; return NULL; } @@ -273,7 +278,7 @@ astring &rom_region_name(astring &result, const game_driver *drv, const rom_source *source, const rom_entry *romp) { - return source->subtag(result, ROMREGION_GETTAG(romp)); + return source->subtag(result, ROM_GETNAME(romp)); } @@ -534,7 +539,7 @@ else sprintf(buffer, "Loading Complete"); - ui_set_startup_text(romdata->machine(), buffer, FALSE); + if (!ui_is_menu_active()) ui_set_startup_text(romdata->machine(), buffer, FALSE); } @@ -553,13 +558,15 @@ { /* create the error message and exit fatally */ mame_printf_error("%s", romdata->errorstring.cstr()); - fatalerror_exitcode(romdata->machine(), MAMERR_MISSING_FILES, "ERROR: required files are missing, the "GAMENOUN" cannot be run."); + fatalerror_exitcode(romdata->machine(), MAMERR_MISSING_FILES, "ERROR: required files are missing, the %s cannot be run.",emulator_info::get_gamenoun()); } /* if we had warnings, output them, but continue */ if ((romdata-> warnings) || (romdata->knownbad)) { - romdata->errorstring.cat("WARNING: the "GAMENOUN" might not run correctly."); + romdata->errorstring.cat("WARNING: the "); + romdata->errorstring.cat(emulator_info::get_gamenoun()); + romdata->errorstring.cat(" might not run correctly."); mame_printf_warning("%s\n", romdata->errorstring.cstr()); } } @@ -1214,19 +1221,17 @@ if (ROMENTRY_ISFILE(romp)) { hash_collection hashes(ROM_GETHASHDATA(romp)); - open_chd chd = { 0 }; chd_header header; chd_error err; - /* note the region we are in */ - chd.region = regiontag; - /* make the filename of the source */ astring filename(ROM_GETNAME(romp), ".chd"); /* first open the source drive */ + chd_file *origchd; + emu_file *origfile; LOG(("Opening disk image: %s\n", filename.cstr())); - err = open_disk_image(romdata->machine().options(), &romdata->machine().system(), romp, &chd.origfile, &chd.origchd, locationtag); + err = open_disk_image(romdata->machine().options(), &romdata->machine().system(), romp, &origfile, &origchd, locationtag); if (err != CHDERR_NONE) { if (err == CHDERR_FILE_NOT_FOUND) @@ -1245,7 +1250,7 @@ } /* get the header and extract the SHA1 */ - header = *chd_get_header(chd.origchd); + header = *chd_get_header(origchd); hash_collection acthashes; acthashes.add_from_buffer(hash_collection::HASH_SHA1, header.sha1, sizeof(header.sha1)); @@ -1263,10 +1268,12 @@ } /* if not read-only, make the diff file */ + chd_file *diffchd = NULL; + emu_file *difffile = NULL; if (!DISK_ISREADONLY(romp)) { /* try to open or create the diff */ - err = open_disk_diff(romdata->machine().options(), romp, chd.origchd, &chd.difffile, &chd.diffchd); + err = open_disk_diff(romdata->machine().options(), romp, origchd, &difffile, &diffchd); if (err != CHDERR_NONE) { romdata->errorstring.catprintf("%s DIFF CHD ERROR: %s\n", filename.cstr(), chd_error_string(err)); @@ -1277,7 +1284,7 @@ /* we're okay, add to the list of disks */ LOG(("Assigning to handle %d\n", DISK_GETINDEX(romp))); - add_disk_handle(romdata->machine(), &chd); + romdata->machine().romload_data->chd_list.append(*global_alloc(open_chd(regiontag, *origfile, *origchd, difffile, diffchd))); } } } @@ -1492,7 +1499,7 @@ process_rom_entries(romdata, (source->shortname()!=NULL) ? source->shortname() : NULL, region, region + 1); } else if (ROMREGION_ISDISKDATA(region)) - process_disk_entries(romdata, ROMREGION_GETTAG(region), region, region + 1, NULL); + process_disk_entries(romdata, regiontag, region, region + 1, NULL); } /* now go back and post-process all the regions */ @@ -1529,8 +1536,7 @@ count_roms(romdata); /* reset the disk list */ - romdata->chd_list = NULL; - romdata->chd_list_tailptr = &machine.romload_data->chd_list; + romdata->chd_list.reset(); /* process the ROM entries we were passed */ process_region_list(romdata); @@ -1546,20 +1552,6 @@ static void rom_exit(running_machine &machine) { - open_chd *curchd; - - /* close all hard drives */ - for (curchd = machine.romload_data->chd_list; curchd != NULL; curchd = curchd->next) - { - if (curchd->diffchd != NULL) - chd_close(curchd->diffchd); - if (curchd->difffile != NULL) - global_free(curchd->difffile); - if (curchd->origchd != NULL) - chd_close(curchd->origchd); - if (curchd->origfile != NULL) - global_free(curchd->origfile); - } } diff -Nru mame-0.144/src/emu/save.c mame-0.145/src/emu/save.c --- mame-0.144/src/emu/save.c 2011-08-04 02:16:31.000000000 +0000 +++ mame-0.145/src/emu/save.c 2012-02-06 21:30:28.000000000 +0000 @@ -80,13 +80,6 @@ }; - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const char save_manager::s_magic_num[8] = { STATE_MAGIC_NUM }; - //************************************************************************** // INITIALIZATION //************************************************************************** @@ -244,7 +237,7 @@ if (file.read(header, sizeof(header)) != sizeof(header)) { if (errormsg != NULL) - (*errormsg)("Could not read " APPNAME " save file header"); + (*errormsg)("Could not read %s save file header",emulator_info::get_appname()); return STATERR_READ_ERROR; } @@ -311,7 +304,7 @@ // generate the header UINT8 header[HEADER_SIZE]; - memcpy(&header[0], s_magic_num, 8); + memcpy(&header[0], emulator_info::get_state_magic_num(), 8); header[8] = SAVE_VERSION; header[9] = NATIVE_ENDIAN_VALUE_LE_BE(0, SS_MSB_FIRST); strncpy((char *)&header[0x0a], machine().system().name, 0x1c - 0x0a); @@ -385,10 +378,10 @@ void (CLIB_DECL *errormsg)(const char *fmt, ...), const char *error_prefix) { // check magic number - if (memcmp(header, s_magic_num, 8)) + if (memcmp(header, emulator_info::get_state_magic_num(), 8)) { if (errormsg != NULL) - (*errormsg)("%sThis is not a " APPNAME " save file", error_prefix); + (*errormsg)("%sThis is not a %s save file", error_prefix,emulator_info::get_appname()); return STATERR_INVALID_HEADER; } diff -Nru mame-0.144/src/emu/save.h mame-0.145/src/emu/save.h --- mame-0.144/src/emu/save.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/save.h 2012-02-06 21:30:28.000000000 +0000 @@ -238,8 +238,6 @@ simple_list m_entry_list; // list of reigstered entries simple_list m_presave_list; // list of pre-save functions simple_list m_postload_list; // list of post-load functions - - static const char s_magic_num[8]; // magic number for header }; @@ -270,9 +268,27 @@ //------------------------------------------------- template<> -inline void save_manager::save_item(const char *module, const char *tag, int index, bitmap_t &value, const char *name) +inline void save_manager::save_item(const char *module, const char *tag, int index, bitmap_ind8 &value, const char *name) +{ + save_memory(module, tag, index, name, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height()); +} + +template<> +inline void save_manager::save_item(const char *module, const char *tag, int index, bitmap_ind16 &value, const char *name) +{ + save_memory(module, tag, index, name, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height()); +} + +template<> +inline void save_manager::save_item(const char *module, const char *tag, int index, bitmap_ind32 &value, const char *name) +{ + save_memory(module, tag, index, name, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height()); +} + +template<> +inline void save_manager::save_item(const char *module, const char *tag, int index, bitmap_rgb32 &value, const char *name) { - save_memory(module, tag, index, name, value.base, value.bpp / 8, value.rowpixels * value.height); + save_memory(module, tag, index, name, &value.pix(0), value.bpp() / 8, value.rowpixels() * value.height()); } diff -Nru mame-0.144/src/emu/schedule.c mame-0.145/src/emu/schedule.c --- mame-0.144/src/emu/schedule.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/schedule.c 2012-02-06 21:30:28.000000000 +0000 @@ -341,7 +341,7 @@ m_executing_device(NULL), m_execute_list(NULL), m_basetime(attotime::zero), - m_cothread(co_active()), +// m_cothread(co_active()), m_timer_list(NULL), m_timer_allocator(machine.respool()), m_callback_timer(NULL), @@ -788,8 +788,8 @@ device_execute_interface **suspend_tailptr = &suspend_list; // iterate over all devices - device_execute_interface *exec = NULL; - for (bool gotone = machine().devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine().root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) { // append to the appropriate list exec->m_nextexec = NULL; diff -Nru mame-0.144/src/emu/schedule.h mame-0.145/src/emu/schedule.h --- mame-0.144/src/emu/schedule.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/schedule.h 2012-02-06 21:30:28.000000000 +0000 @@ -165,7 +165,7 @@ void abort_timeslice(); void trigger(int trigid, attotime after = attotime::zero); void boost_interleave(attotime timeslice_time, attotime boost_duration); - void make_active() { m_cothread.make_active(); } +// void make_active() { m_cothread.make_active(); } // timers, specified by callback/name emu_timer *timer_alloc(timer_expired_delegate callback, void *ptr = NULL); @@ -210,7 +210,7 @@ device_execute_interface * m_executing_device; // pointer to currently executing device device_execute_interface * m_execute_list; // list of devices to be executed attotime m_basetime; // global basetime; everything moves forward from here - cothread m_cothread; // core scheduler thread +// cothread m_cothread; // core scheduler thread // list of active timers emu_timer * m_timer_list; // head of the active list diff -Nru mame-0.144/src/emu/screen.c mame-0.145/src/emu/screen.c --- mame-0.144/src/emu/screen.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/screen.c 2012-02-06 21:30:28.000000000 +0000 @@ -78,23 +78,18 @@ m_oldstyle_vblank_supplied(false), m_refresh(0), m_vblank(0), - m_format(BITMAP_FORMAT_INVALID), m_xoffset(0.0f), m_yoffset(0.0f), m_xscale(1.0f), m_yscale(1.0f), - m_screen_update(NULL), - m_screen_eof(NULL), m_container(NULL), m_width(100), m_height(100), - m_burnin(NULL), + m_visarea(0, 99, 0, 99), m_curbitmap(0), m_curtexture(0), - m_texture_format(0), m_changed(true), m_last_partial_scan(0), - m_screen_overlay_bitmap(NULL), m_frame_period(DEFAULT_FRAME_PERIOD.as_attoseconds()), m_scantime(1), m_pixeltime(1), @@ -108,11 +103,7 @@ m_frame_number(0), m_partial_updates_this_frame(0) { - m_visarea.min_x = m_visarea.min_y = 0; - m_visarea.max_x = m_width - 1; - m_visarea.max_y = m_height - 1; memset(m_texture, 0, sizeof(m_texture)); - memset(m_bitmap, 0, sizeof(m_bitmap)); } @@ -126,26 +117,13 @@ //------------------------------------------------- -// static_set_format - configuration helper -// to set the bitmap format -//------------------------------------------------- - -void screen_device::static_set_format(device_t &device, bitmap_format format) -{ - screen_device &screen = downcast(device); - screen.m_format = format; -} - - -//------------------------------------------------- // static_set_type - configuration helper // to set the screen type //------------------------------------------------- void screen_device::static_set_type(device_t &device, screen_type_enum type) { - screen_device &screen = downcast(device); - screen.m_type = type; + downcast(device).m_type = type; } @@ -161,10 +139,7 @@ screen.m_vblank = screen.m_refresh / vtotal * (vtotal - (vbstart - vbend)); screen.m_width = htotal; screen.m_height = vtotal; - screen.m_visarea.min_x = hbend; - screen.m_visarea.max_x = hbstart - 1; - screen.m_visarea.min_y = vbend; - screen.m_visarea.max_y = vbstart - 1; + screen.m_visarea.set(hbend, hbstart - 1, vbend, vbstart - 1); } @@ -175,8 +150,7 @@ void screen_device::static_set_refresh(device_t &device, attoseconds_t rate) { - screen_device &screen = downcast(device); - screen.m_refresh = rate; + downcast(device).m_refresh = rate; } @@ -213,11 +187,7 @@ void screen_device::static_set_visarea(device_t &device, INT16 minx, INT16 maxx, INT16 miny, INT16 maxy) { - screen_device &screen = downcast(device); - screen.m_visarea.min_x = minx; - screen.m_visarea.max_x = maxx; - screen.m_visarea.min_y = miny; - screen.m_visarea.max_y = maxy; + downcast(device).m_visarea.set(minx, maxx, miny, maxy); } @@ -243,21 +213,29 @@ // configuration //------------------------------------------------- -void screen_device::static_set_screen_update(device_t &device, screen_update_func callback) +void screen_device::static_set_screen_update(device_t &device, screen_update_ind16_delegate callback) +{ + screen_device &screen = downcast(device); + screen.m_screen_update_ind16 = callback; + screen.m_screen_update_rgb32 = screen_update_rgb32_delegate(); +} + +void screen_device::static_set_screen_update(device_t &device, screen_update_rgb32_delegate callback) { - downcast(device).m_screen_update = callback; + screen_device &screen = downcast(device); + screen.m_screen_update_ind16 = screen_update_ind16_delegate(); + screen.m_screen_update_rgb32 = callback; } //------------------------------------------------- -// static_set_screen_eof - set the legacy -// screen eof callback in the device -// configuration +// static_set_screen_vblank - set the screen +// VBLANK callback in the device configuration //------------------------------------------------- -void screen_device::static_set_screen_eof(device_t &device, screen_eof_func callback) +void screen_device::static_set_screen_vblank(device_t &device, screen_vblank_delegate callback) { - downcast(device).m_screen_eof = callback; + downcast(device).m_screen_vblank = callback; } @@ -266,46 +244,26 @@ // configuration //------------------------------------------------- -bool screen_device::device_validity_check(emu_options &options, const game_driver &driver) const +void screen_device::device_validity_check(validity_checker &valid) const { - bool error = false; - // sanity check dimensions if (m_width <= 0 || m_height <= 0) - { - mame_printf_error("%s: %s screen '%s' has invalid display dimensions\n", driver.source_file, driver.name, tag()); - error = true; - } + mame_printf_error("Invalid display dimensions\n"); // sanity check display area if (m_type != SCREEN_TYPE_VECTOR) { - if ((m_visarea.max_x < m_visarea.min_x) || - (m_visarea.max_y < m_visarea.min_y) || - (m_visarea.max_x >= m_width) || - (m_visarea.max_y >= m_height)) - { - mame_printf_error("%s: %s screen '%s' has an invalid display area\n", driver.source_file, driver.name, tag()); - error = true; - } + if (m_visarea.empty() || m_visarea.max_x >= m_width || m_visarea.max_y >= m_height) + mame_printf_error("Invalid display area\n"); // sanity check screen formats - if (m_format != BITMAP_FORMAT_INDEXED16 && - m_format != BITMAP_FORMAT_RGB15 && - m_format != BITMAP_FORMAT_RGB32) - { - mame_printf_error("%s: %s screen '%s' has unsupported format\n", driver.source_file, driver.name, tag()); - error = true; - } + if (m_screen_update_ind16.isnull() && m_screen_update_rgb32.isnull()) + mame_printf_error("Missing SCREEN_UPDATE function\n"); } // check for zero frame rate if (m_refresh == 0) - { - mame_printf_error("%s: %s screen '%s' has a zero refresh rate\n", driver.source_file, driver.name, tag()); - error = true; - } - return error; + mame_printf_error("Invalid (zero) refresh rate\n"); } @@ -315,6 +273,23 @@ void screen_device::device_start() { + // bind our handlers + m_screen_update_ind16.bind_relative_to(*owner()); + m_screen_update_rgb32.bind_relative_to(*owner()); + m_screen_vblank.bind_relative_to(*owner()); + + // configure bitmap formats and allocate screen bitmaps + texture_format texformat = !m_screen_update_ind16.isnull() ? TEXFORMAT_PALETTE16 : TEXFORMAT_RGB32; + for (int index = 0; index < ARRAY_LENGTH(m_bitmap); index++) + { + m_bitmap[index].set_format(format(), texformat); + register_screen_bitmap(m_bitmap[index]); + } + + // allocate raw textures + m_texture[0] = machine().render().texture_alloc(); + m_texture[1] = machine().render().texture_alloc(); + // configure the default cliparea render_container::user_settings settings; m_container->get_user_settings(settings); @@ -325,15 +300,15 @@ m_container->set_user_settings(settings); // allocate the VBLANK timers - m_vblank_begin_timer = machine().scheduler().timer_alloc(FUNC(static_vblank_begin_callback), (void *)this); - m_vblank_end_timer = machine().scheduler().timer_alloc(FUNC(static_vblank_end_callback), (void *)this); + m_vblank_begin_timer = timer_alloc(TID_VBLANK_START); + m_vblank_end_timer = timer_alloc(TID_VBLANK_END); // allocate a timer to reset partial updates - m_scanline0_timer = machine().scheduler().timer_alloc(FUNC(static_scanline0_callback), (void *)this); + m_scanline0_timer = timer_alloc(TID_SCANLINE0); // allocate a timer to generate per-scanline updates if ((machine().config().m_video_attributes & VIDEO_UPDATE_SCANLINE) != 0) - m_scanline_timer = machine().scheduler().timer_alloc(FUNC(static_scanline_update_callback), (void *)this); + m_scanline_timer = timer_alloc(TID_SCANLINE); // configure the screen with the default parameters configure(m_width, m_height, m_visarea, m_refresh); @@ -352,10 +327,8 @@ int width, height; if (sscanf(machine().options().snap_size(), "%dx%d", &width, &height) != 2 || width == 0 || height == 0) width = height = 300; - m_burnin = auto_alloc(machine(), bitmap_t(width, height, BITMAP_FORMAT_INDEXED64)); - if (m_burnin == NULL) - fatalerror("Error allocating burn-in bitmap for screen at (%dx%d)\n", width, height); - bitmap_fill(m_burnin, NULL, 0); + m_burnin.allocate(width, height); + m_burnin.fill(0); } // load the effect overlay @@ -390,9 +363,8 @@ { machine().render().texture_free(m_texture[0]); machine().render().texture_free(m_texture[1]); - if (m_burnin != NULL) + if (m_burnin.valid()) finalize_burnin(); - global_free(m_screen_overlay_bitmap); } @@ -408,6 +380,46 @@ //------------------------------------------------- +// device_timer - called whenever a device timer +// fires +//------------------------------------------------- + +void screen_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + // signal VBLANK start + case TID_VBLANK_START: + vblank_begin(); + break; + + // signal VBLANK end + case TID_VBLANK_END: + vblank_end(); + break; + + // first visible scanline + case TID_SCANLINE0: + reset_partial_updates(); + break; + + // subsequent scanlines when scanline updates are enabled + case TID_SCANLINE: + + // force a partial update to the current scanline + update_partial(param); + + // compute the next visible scanline + param++; + if (param > m_visarea.max_y) + param = m_visarea.min_y; + m_scanline_timer->adjust(time_until_pos(param), param); + break; + } +} + + +//------------------------------------------------- // configure - configure screen parameters //------------------------------------------------- @@ -418,6 +430,8 @@ assert(height > 0); assert(visarea.min_x >= 0); assert(visarea.min_y >= 0); +// assert(visarea.max_x < width); +// assert(visarea.max_y < height); assert(m_type == SCREEN_TYPE_VECTOR || visarea.min_x < width); assert(m_type == SCREEN_TYPE_VECTOR || visarea.min_y < height); assert(frame_period > 0); @@ -438,7 +452,7 @@ // if there has been no VBLANK time specified in the MACHINE_DRIVER, compute it now // from the visible area, otherwise just used the supplied value if (m_vblank == 0 && !m_oldstyle_vblank_supplied) - m_vblank_period = m_scantime * (height - (visarea.max_y + 1 - visarea.min_y)); + m_vblank_period = m_scantime * (height - visarea.height()); else m_vblank_period = m_vblank; @@ -472,14 +486,14 @@ // if we are resetting relative to (0,0) == VBLANK end, call the // scanline 0 timer by hand now; otherwise, adjust it for the future if (beamy == 0 && beamx == 0) - scanline0_callback(); + reset_partial_updates(); else m_scanline0_timer->adjust(time_until_pos(0)); // if we are resetting relative to (visarea.max_y + 1, 0) == VBLANK start, // call the VBLANK start timer now; otherwise, adjust it for the future if (beamy == m_visarea.max_y + 1 && beamx == 0) - vblank_begin_callback(); + vblank_begin(); else m_vblank_begin_timer->adjust(time_until_vblank_start()); } @@ -492,53 +506,21 @@ void screen_device::realloc_screen_bitmaps() { + // doesn't apply for vector games if (m_type == SCREEN_TYPE_VECTOR) return; - int curwidth = 0, curheight = 0; - - // extract the current width/height from the bitmap - if (m_bitmap[0] != NULL) - { - curwidth = m_bitmap[0]->width; - curheight = m_bitmap[0]->height; - } - - // if we're too small to contain this width/height, reallocate our bitmaps and textures - if (m_width > curwidth || m_height > curheight) - { - // free what we have currently - machine().render().texture_free(m_texture[0]); - machine().render().texture_free(m_texture[1]); - auto_free(machine(), m_bitmap[0]); - auto_free(machine(), m_bitmap[1]); - - // compute new width/height - curwidth = MAX(m_width, curwidth); - curheight = MAX(m_height, curheight); - - // choose the texture format - convert the screen format to a texture format - palette_t *palette = NULL; - switch (m_format) - { - case BITMAP_FORMAT_INDEXED16: m_texture_format = TEXFORMAT_PALETTE16; palette = machine().palette; break; - case BITMAP_FORMAT_RGB15: m_texture_format = TEXFORMAT_RGB15; palette = NULL; break; - case BITMAP_FORMAT_RGB32: m_texture_format = TEXFORMAT_RGB32; palette = NULL; break; - default: fatalerror("Invalid bitmap format!"); break; - } - - // allocate bitmaps - m_bitmap[0] = auto_alloc(machine(), bitmap_t(curwidth, curheight, m_format)); - bitmap_set_palette(m_bitmap[0], machine().palette); - m_bitmap[1] = auto_alloc(machine(), bitmap_t(curwidth, curheight, m_format)); - bitmap_set_palette(m_bitmap[1], machine().palette); - - // allocate textures - m_texture[0] = machine().render().texture_alloc(); - m_texture[0]->set_bitmap(m_bitmap[0], &m_visarea, m_texture_format, palette); - m_texture[1] = machine().render().texture_alloc(); - m_texture[1]->set_bitmap(m_bitmap[1], &m_visarea, m_texture_format, palette); - } + // determine effective size to allocate + INT32 effwidth = MAX(m_width, m_visarea.max_x + 1); + INT32 effheight = MAX(m_height, m_visarea.max_y + 1); + + // reize all registered screen bitmaps + for (auto_bitmap_item *item = m_auto_bitmap_list.first(); item != NULL; item = item->next()) + item->m_bitmap.resize(effwidth, effheight); + + // re-set up textures + m_texture[0]->set_bitmap(m_bitmap[0], m_visarea, m_bitmap[0].texformat()); + m_texture[1]->set_bitmap(m_bitmap[1], m_visarea, m_bitmap[1].texformat()); } @@ -548,18 +530,8 @@ void screen_device::set_visible_area(int min_x, int max_x, int min_y, int max_y) { - // validate arguments - assert(min_x >= 0); - assert(min_y >= 0); - assert(min_x < max_x); - assert(min_y < max_y); - - rectangle visarea; - visarea.min_x = min_x; - visarea.max_x = max_x; - visarea.min_y = min_y; - visarea.max_y = max_y; - + rectangle visarea(min_x, max_x, min_y, max_y); + assert(!visarea.empty()); configure(m_width, m_height, visarea, m_frame_period); } @@ -618,7 +590,15 @@ g_profiler.start(PROFILER_VIDEO); LOG_PARTIAL_UPDATES(("updating %d-%d\n", clip.min_y, clip.max_y)); - flags = screen_update(*m_bitmap[m_curbitmap], clip); + flags = 0; + screen_bitmap &curbitmap = m_bitmap[m_curbitmap]; + switch (curbitmap.format()) + { + default: + case BITMAP_FORMAT_IND16: flags = m_screen_update_ind16(*this, curbitmap.as_ind16(), clip); break; + case BITMAP_FORMAT_RGB32: flags = m_screen_update_rgb32(*this, curbitmap.as_rgb32(), clip); break; + } + m_partial_updates_this_frame++; g_profiler.stop(); @@ -659,6 +639,19 @@ //------------------------------------------------- +// reset_partial_updates - reset the partial +// updating state +//------------------------------------------------- + +void screen_device::reset_partial_updates() +{ + m_last_partial_scan = 0; + m_partial_updates_this_frame = 0; + m_scanline0_timer->adjust(time_until_pos(0)); +} + + +//------------------------------------------------- // vpos - returns the current vertical position // of the beam //------------------------------------------------- @@ -773,45 +766,65 @@ //------------------------------------------------- -// vblank_begin_callback - call any external -// callbacks to signal the VBLANK period has begun +// register_screen_bitmap - registers a bitmap +// that should track the screen size +//------------------------------------------------- + +void screen_device::register_screen_bitmap(bitmap_t &bitmap) +{ + // append to the list + m_auto_bitmap_list.append(*global_alloc(auto_bitmap_item(bitmap))); + + // if allocating now, just do it + bitmap.allocate(width(), height()); + bitmap.set_palette(machine().palette); +} + + +//------------------------------------------------- +// vblank_begin - call any external callbacks to +// signal the VBLANK period has begun //------------------------------------------------- -void screen_device::vblank_begin_callback() +void screen_device::vblank_begin() { // reset the starting VBLANK time m_vblank_start_time = machine().time(); m_vblank_end_time = m_vblank_start_time + attotime(0, m_vblank_period); - // call the screen specific callbacks - for (callback_item *item = m_callback_list.first(); item != NULL; item = item->next()) - item->m_callback(*this, true); - // if this is the primary screen and we need to update now if (this == machine().primary_screen && !(machine().config().m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK)) machine().video().frame_update(); + // call the screen specific callbacks + for (callback_item *item = m_callback_list.first(); item != NULL; item = item->next()) + item->m_callback(*this, true); + if (!m_screen_vblank.isnull()) + m_screen_vblank(*this, true); + // reset the VBLANK start timer for the next frame m_vblank_begin_timer->adjust(time_until_vblank_start()); // if no VBLANK period, call the VBLANK end callback immedietely, otherwise reset the timer if (m_vblank_period == 0) - vblank_end_callback(); + vblank_end(); else m_vblank_end_timer->adjust(time_until_vblank_end()); } //------------------------------------------------- -// vblank_end_callback - call any external -// callbacks to signal the VBLANK period has ended +// vblank_end - call any external callbacks to +// signal the VBLANK period has ended //------------------------------------------------- -void screen_device::vblank_end_callback() +void screen_device::vblank_end() { // call the screen specific callbacks for (callback_item *item = m_callback_list.first(); item != NULL; item = item->next()) item->m_callback(*this, false); + if (!m_screen_vblank.isnull()) + m_screen_vblank(*this, false); // if this is the primary screen and we need to update now if (this == machine().primary_screen && (machine().config().m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK)) @@ -823,39 +836,6 @@ //------------------------------------------------- -// scanline0_callback - reset partial updates -// for a screen -//------------------------------------------------- - -void screen_device::scanline0_callback() -{ - // reset partial updates - m_last_partial_scan = 0; - m_partial_updates_this_frame = 0; - - m_scanline0_timer->adjust(time_until_pos(0)); -} - - -//------------------------------------------------- -// scanline_update_callback - perform partial -// updates on each scanline -//------------------------------------------------- - -void screen_device::scanline_update_callback(int scanline) -{ - // force a partial update to the current scanline - update_partial(scanline); - - // compute the next visible scanline - scanline++; - if (scanline > m_visarea.max_y) - scanline = m_visarea.min_y; - m_scanline_timer->adjust(time_until_pos(scanline), scanline); -} - - -//------------------------------------------------- // update_quads - set up the quads for this // screen //------------------------------------------------- @@ -871,13 +851,7 @@ // if we're not skipping the frame and if the screen actually changed, then update the texture if (!machine().video().skip_this_frame() && m_changed) { - rectangle fixedvis = m_visarea; - fixedvis.max_x++; - fixedvis.max_y++; - - palette_t *palette = (m_texture_format == TEXFORMAT_PALETTE16) ? machine().palette : NULL; - m_texture[m_curbitmap]->set_bitmap(m_bitmap[m_curbitmap], &fixedvis, m_texture_format, palette); - + m_texture[m_curbitmap]->set_bitmap(m_bitmap[m_curbitmap], m_visarea, m_bitmap[m_curbitmap].texformat()); m_curtexture = m_curbitmap; m_curbitmap = 1 - m_curbitmap; } @@ -902,17 +876,17 @@ void screen_device::update_burnin() { #undef rand - if (m_burnin == NULL) + if (!m_burnin.valid()) return; - bitmap_t *srcbitmap = m_bitmap[m_curtexture]; - if (srcbitmap == NULL) + screen_bitmap &curbitmap = m_bitmap[m_curtexture]; + if (!curbitmap.valid()) return; - int srcwidth = srcbitmap->width; - int srcheight = srcbitmap->height; - int dstwidth = m_burnin->width; - int dstheight = m_burnin->height; + int srcwidth = curbitmap.width(); + int srcheight = curbitmap.height(); + int dstwidth = m_burnin.width(); + int dstheight = m_burnin.height(); int xstep = (srcwidth << 16) / dstwidth; int ystep = (srcheight << 16) / dstheight; int xstart = ((UINT32)rand() % 32767) * xstep / 32767; @@ -920,43 +894,42 @@ int srcx, srcy; int x, y; - // iterate over rows in the destination - for (y = 0, srcy = ystart; y < dstheight; y++, srcy += ystep) + switch (curbitmap.format()) { - UINT64 *dst = BITMAP_ADDR64(m_burnin, y, 0); - - // handle the 16-bit palettized case - if (srcbitmap->format == BITMAP_FORMAT_INDEXED16) - { - const UINT16 *src = BITMAP_ADDR16(srcbitmap, srcy >> 16, 0); - const rgb_t *palette = palette_entry_list_adjusted(machine().palette); - for (x = 0, srcx = xstart; x < dstwidth; x++, srcx += xstep) - { - rgb_t pixel = palette[src[srcx >> 16]]; - dst[x] += RGB_GREEN(pixel) + RGB_RED(pixel) + RGB_BLUE(pixel); - } - } - - // handle the 15-bit RGB case - else if (srcbitmap->format == BITMAP_FORMAT_RGB15) + default: + case BITMAP_FORMAT_IND16: { - const UINT16 *src = BITMAP_ADDR16(srcbitmap, srcy >> 16, 0); - for (x = 0, srcx = xstart; x < dstwidth; x++, srcx += xstep) + // iterate over rows in the destination + bitmap_ind16 &srcbitmap = curbitmap.as_ind16(); + for (y = 0, srcy = ystart; y < dstheight; y++, srcy += ystep) { - rgb15_t pixel = src[srcx >> 16]; - dst[x] += ((pixel >> 10) & 0x1f) + ((pixel >> 5) & 0x1f) + ((pixel >> 0) & 0x1f); + UINT64 *dst = &m_burnin.pix64(y); + const UINT16 *src = &srcbitmap.pix16(srcy >> 16); + const rgb_t *palette = palette_entry_list_adjusted(machine().palette); + for (x = 0, srcx = xstart; x < dstwidth; x++, srcx += xstep) + { + rgb_t pixel = palette[src[srcx >> 16]]; + dst[x] += RGB_GREEN(pixel) + RGB_RED(pixel) + RGB_BLUE(pixel); + } } + break; } - // handle the 32-bit RGB case - else if (srcbitmap->format == BITMAP_FORMAT_RGB32) + case BITMAP_FORMAT_RGB32: { - const UINT32 *src = BITMAP_ADDR32(srcbitmap, srcy >> 16, 0); - for (x = 0, srcx = xstart; x < dstwidth; x++, srcx += xstep) + // iterate over rows in the destination + bitmap_rgb32 &srcbitmap = curbitmap.as_rgb32(); + for (y = 0, srcy = ystart; y < dstheight; y++, srcy += ystep) { - rgb_t pixel = src[srcx >> 16]; - dst[x] += RGB_GREEN(pixel) + RGB_RED(pixel) + RGB_BLUE(pixel); + UINT64 *dst = &m_burnin.pix64(y); + const UINT32 *src = &srcbitmap.pix32(srcy >> 16); + for (x = 0, srcx = xstart; x < dstwidth; x++, srcx += xstep) + { + rgb_t pixel = src[srcx >> 16]; + dst[x] += RGB_GREEN(pixel) + RGB_RED(pixel) + RGB_BLUE(pixel); + } } + break; } } } @@ -968,25 +941,22 @@ void screen_device::finalize_burnin() { - if (m_burnin == NULL) + if (!m_burnin.valid()) return; // compute the scaled visible region rectangle scaledvis; - scaledvis.min_x = m_visarea.min_x * m_burnin->width / m_width; - scaledvis.max_x = m_visarea.max_x * m_burnin->width / m_width; - scaledvis.min_y = m_visarea.min_y * m_burnin->height / m_height; - scaledvis.max_y = m_visarea.max_y * m_burnin->height / m_height; + scaledvis.min_x = m_visarea.min_x * m_burnin.width() / m_width; + scaledvis.max_x = m_visarea.max_x * m_burnin.width() / m_width; + scaledvis.min_y = m_visarea.min_y * m_burnin.height() / m_height; + scaledvis.max_y = m_visarea.max_y * m_burnin.height() / m_height; // wrap a bitmap around the subregion we care about - bitmap_t *finalmap = auto_alloc(machine(), bitmap_t(scaledvis.max_x + 1 - scaledvis.min_x, - scaledvis.max_y + 1 - scaledvis.min_y, - BITMAP_FORMAT_ARGB32)); - - int srcwidth = m_burnin->width; - int srcheight = m_burnin->height; - int dstwidth = finalmap->width; - int dstheight = finalmap->height; + bitmap_argb32 finalmap(scaledvis.width(), scaledvis.height()); + int srcwidth = m_burnin.width(); + int srcheight = m_burnin.height(); + int dstwidth = finalmap.width(); + int dstheight = finalmap.height(); int xstep = (srcwidth << 16) / dstwidth; int ystep = (srcheight << 16) / dstheight; @@ -995,7 +965,7 @@ UINT64 maxval = 0; for (int y = 0; y < srcheight; y++) { - UINT64 *src = BITMAP_ADDR64(m_burnin, y, 0); + UINT64 *src = &m_burnin.pix64(y); for (int x = 0; x < srcwidth; x++) { minval = MIN(minval, src[x]); @@ -1009,8 +979,8 @@ // now normalize and convert to RGB for (int y = 0, srcy = 0; y < dstheight; y++, srcy += ystep) { - UINT64 *src = BITMAP_ADDR64(m_burnin, srcy >> 16, 0); - UINT32 *dst = BITMAP_ADDR32(finalmap, y, 0); + UINT64 *src = &m_burnin.pix64(srcy >> 16); + UINT32 *dst = &finalmap.pix32(y); for (int x = 0, srcx = 0; x < dstwidth; x++, srcx += xstep) { int brightness = (UINT64)(maxval - src[srcx >> 16]) * 255 / (maxval - minval); @@ -1030,7 +1000,7 @@ char text[256]; // add two text entries describing the image - sprintf(text, APPNAME " %s", build_version); + sprintf(text,"%s %s", emulator_info::get_appname(), build_version); png_add_text(&pnginfo, "Software", text); sprintf(text, "%s %s", machine().system().manufacturer, machine().system().description); png_add_text(&pnginfo, "System", text); @@ -1059,38 +1029,9 @@ // load the file emu_file file(machine().options().art_path(), OPEN_FLAG_READ); - m_screen_overlay_bitmap = render_load_png(file, NULL, fullname, NULL, NULL); - if (m_screen_overlay_bitmap != NULL) - m_container->set_overlay(m_screen_overlay_bitmap); + render_load_png(m_screen_overlay_bitmap, file, NULL, fullname); + if (m_screen_overlay_bitmap.valid()) + m_container->set_overlay(&m_screen_overlay_bitmap); else mame_printf_warning("Unable to load effect PNG file '%s'\n", fullname.cstr()); } - -//------------------------------------------------- -// screen_update - default implementation which -// calls to the legacy screen_update function -//------------------------------------------------- - -bool screen_device::screen_update(bitmap_t &bitmap, const rectangle &cliprect) -{ - if (m_screen_update != NULL) { - return (*m_screen_update)(this, &bitmap, &cliprect); - } else { - machine().driver_data()->screen_update(*this, bitmap, cliprect); - } - return 0; -} - -//------------------------------------------------- -// screen_eof - default implementation which -// calls to the legacy screen_update function -//------------------------------------------------- - -void screen_device::screen_eof() -{ - if (m_screen_eof != NULL) { - return (*m_screen_eof)(this, machine()); - } else { - machine().driver_data()->screen_eof(); - } -} diff -Nru mame-0.144/src/emu/screen.h mame-0.145/src/emu/screen.h --- mame-0.144/src/emu/screen.h 2012-01-13 15:34:25.000000000 +0000 +++ mame-0.145/src/emu/screen.h 2012-02-06 21:30:28.000000000 +0000 @@ -71,11 +71,85 @@ class screen_device; -// callback that is called to notify of a change in the VBLANK state +// ======================> screen_bitmap + +class screen_bitmap +{ +private: + // internal helpers + bitmap_t &live() { assert(m_live != NULL); return *m_live; } + const bitmap_t &live() const { assert(m_live != NULL); return *m_live; } + +public: + // construction/destruction + screen_bitmap() + : m_format(BITMAP_FORMAT_RGB32), + m_texformat(TEXFORMAT_RGB32), + m_live(&m_rgb32) { } + screen_bitmap(bitmap_ind16 &orig) + : m_format(BITMAP_FORMAT_IND16), + m_texformat(TEXFORMAT_PALETTE16), + m_live(&m_ind16), + m_ind16(orig, orig.cliprect()) { } + screen_bitmap(bitmap_rgb32 &orig) + : m_format(BITMAP_FORMAT_RGB32), + m_texformat(TEXFORMAT_RGB32), + m_live(&m_rgb32), + m_rgb32(orig, orig.cliprect()) { } + + // resizing + void resize(int width, int height) { live().resize(width, height); } + + // conversion + operator bitmap_t &() { return live(); } + bitmap_ind16 &as_ind16() { assert(m_format == BITMAP_FORMAT_IND16); return m_ind16; } + bitmap_rgb32 &as_rgb32() { assert(m_format == BITMAP_FORMAT_RGB32); return m_rgb32; } + + // getters + INT32 width() const { return live().width(); } + INT32 height() const { return live().height(); } + INT32 rowpixels() const { return live().rowpixels(); } + INT32 rowbytes() const { return live().rowbytes(); } + UINT8 bpp() const { return live().bpp(); } + bitmap_format format() const { return m_format; } + texture_format texformat() const { return m_texformat; } + bool valid() const { return live().valid(); } + palette_t *palette() const { return live().palette(); } + const rectangle &cliprect() const { return live().cliprect(); } + + // operations + void set_palette(palette_t *palette) { live().set_palette(palette); } + void set_format(bitmap_format format, texture_format texformat) + { + m_format = format; + m_texformat = texformat; + switch (format) + { + case BITMAP_FORMAT_IND16: m_live = &m_ind16; break; + case BITMAP_FORMAT_RGB32: m_live = &m_rgb32; break; + default: m_live = NULL; break; + } + m_ind16.reset(); + m_rgb32.reset(); + } + +private: + // internal state + bitmap_format m_format; + texture_format m_texformat; + bitmap_t * m_live; + bitmap_ind16 m_ind16; + bitmap_rgb32 m_rgb32; +}; + + +// ======================> other delegate types + typedef delegate vblank_state_delegate; -typedef UINT32 (*screen_update_func)(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect); -typedef void (*screen_eof_func)(screen_device *screen, running_machine &machine); +typedef device_delegate screen_update_ind16_delegate; +typedef device_delegate screen_update_rgb32_delegate; +typedef device_delegate screen_vblank_delegate; // ======================> screen_device @@ -94,18 +168,18 @@ int width() const { return m_width; } int height() const { return m_height; } const rectangle &visible_area() const { return m_visarea; } + const rectangle &cliprect() const { return m_bitmap[0].cliprect(); } bool oldstyle_vblank_supplied() const { return m_oldstyle_vblank_supplied; } attoseconds_t refresh_attoseconds() const { return m_refresh; } attoseconds_t vblank_attoseconds() const { return m_vblank; } - bitmap_format format() const { return m_format; } + bitmap_format format() const { return !m_screen_update_ind16.isnull() ? BITMAP_FORMAT_IND16 : BITMAP_FORMAT_RGB32; } float xoffset() const { return m_xoffset; } float yoffset() const { return m_yoffset; } float xscale() const { return m_xscale; } float yscale() const { return m_yscale; } - bool have_screen_update() const { return m_screen_update != NULL; } + bool have_screen_update() const { return !m_screen_update_ind16.isnull() && !m_screen_update_rgb32.isnull(); } // inline configuration helpers - static void static_set_format(device_t &device, bitmap_format format); static void static_set_type(device_t &device, screen_type_enum type); static void static_set_raw(device_t &device, UINT32 pixclock, UINT16 htotal, UINT16 hbend, UINT16 hbstart, UINT16 vtotal, UINT16 vbend, UINT16 vbstart); static void static_set_refresh(device_t &device, attoseconds_t rate); @@ -113,14 +187,12 @@ static void static_set_size(device_t &device, UINT16 width, UINT16 height); static void static_set_visarea(device_t &device, INT16 minx, INT16 maxx, INT16 miny, INT16 maxy); static void static_set_default_position(device_t &device, double xscale, double xoffs, double yscale, double yoffs); - static void static_set_screen_update(device_t &device, screen_update_func callback); - static void static_set_screen_eof(device_t &device, screen_eof_func callback); + static void static_set_screen_update(device_t &device, screen_update_ind16_delegate callback); + static void static_set_screen_update(device_t &device, screen_update_rgb32_delegate callback); + static void static_set_screen_vblank(device_t &device, screen_vblank_delegate callback); // information getters - screen_device *next_screen() const { return downcast(typenext()); } render_container &container() const { assert(m_container != NULL); return *m_container; } - bool screen_update(bitmap_t &bitmap, const rectangle &cliprect); - void screen_eof(); // dynamic configuration void configure(int width, int height, const rectangle &visarea, attoseconds_t frame_period); @@ -141,15 +213,16 @@ attotime scan_period() const { return attotime(0, m_scantime); } attotime frame_period() const { return (this == NULL) ? DEFAULT_FRAME_PERIOD : attotime(0, m_frame_period); }; UINT64 frame_number() const { return m_frame_number; } - int partial_updates() const { return m_partial_updates_this_frame; } // updating + int partial_updates() const { return m_partial_updates_this_frame; } bool update_partial(int scanline); void update_now(); + void reset_partial_updates(); // additional helpers void register_vblank_callback(vblank_state_delegate vblank_callback); - bitmap_t *alloc_compatible_bitmap(int width = 0, int height = 0) { return auto_bitmap_alloc(machine(), (width == 0) ? m_width : width, (height == 0) ? m_height : height, format()); } + void register_screen_bitmap(bitmap_t &bitmap); // internal to the video system bool update_quads(); @@ -160,30 +233,27 @@ static const attotime DEFAULT_FRAME_PERIOD; private: + // timer IDs + enum + { + TID_VBLANK_START, + TID_VBLANK_END, + TID_SCANLINE0, + TID_SCANLINE + }; + // device-level overrides - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_stop(); virtual void device_post_load(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // internal helpers void set_container(render_container &container) { m_container = &container; } void realloc_screen_bitmaps(); - - static TIMER_CALLBACK( static_vblank_begin_callback ) { reinterpret_cast(ptr)->vblank_begin_callback(); } - void vblank_begin_callback(); - - static TIMER_CALLBACK( static_vblank_end_callback ) { reinterpret_cast(ptr)->vblank_end_callback(); } - void vblank_end_callback(); - - static TIMER_CALLBACK( static_scanline0_callback ) { reinterpret_cast(ptr)->scanline0_callback(); } -public: // temporary - void scanline0_callback(); -private: - - static TIMER_CALLBACK( static_scanline_update_callback ) { reinterpret_cast(ptr)->scanline_update_callback(param); } - void scanline_update_callback(int scanline); - + void vblank_begin(); + void vblank_end(); void finalize_burnin(); void load_effect_overlay(const char *filename); @@ -192,11 +262,11 @@ bool m_oldstyle_vblank_supplied; // MCFG_SCREEN_VBLANK_TIME macro used attoseconds_t m_refresh; // default refresh period attoseconds_t m_vblank; // duration of a VBLANK - bitmap_format m_format; // bitmap format float m_xoffset, m_yoffset; // default X/Y offsets float m_xscale, m_yscale; // default X/Y scale factor - screen_update_func m_screen_update; // screen update callback - screen_eof_func m_screen_eof; // screen eof callback + screen_update_ind16_delegate m_screen_update_ind16; // screen update callback (16-bit palette) + screen_update_rgb32_delegate m_screen_update_rgb32; // screen update callback (32-bit RGB) + screen_vblank_delegate m_screen_vblank; // screen vblank callback // internal state render_container * m_container; // pointer to our container @@ -207,15 +277,15 @@ rectangle m_visarea; // current visible area (HBLANK end/start, VBLANK end/start) // textures and bitmaps + texture_format m_texformat; // texture format render_texture * m_texture[2]; // 2x textures for the screen bitmap - bitmap_t * m_bitmap[2]; // 2x bitmaps for rendering - bitmap_t * m_burnin; // burn-in bitmap + screen_bitmap m_bitmap[2]; // 2x bitmaps for rendering + bitmap_ind64 m_burnin; // burn-in bitmap UINT8 m_curbitmap; // current bitmap index UINT8 m_curtexture; // current texture index - INT32 m_texture_format; // texture format of bitmap for this screen bool m_changed; // has this bitmap changed? INT32 m_last_partial_scan; // scanline of last partial update - bitmap_t * m_screen_overlay_bitmap; // screen overlay bitmap + bitmap_argb32 m_screen_overlay_bitmap; // screen overlay bitmap // screen timing attoseconds_t m_frame_period; // attoseconds per frame @@ -231,6 +301,7 @@ UINT64 m_frame_number; // the current frame number UINT32 m_partial_updates_this_frame;// partial update counter this frame + // VBLANK callbacks class callback_item { public: @@ -243,11 +314,28 @@ vblank_state_delegate m_callback; }; simple_list m_callback_list; // list of VBLANK callbacks + + // auto-sizing bitmaps + class auto_bitmap_item + { + public: + auto_bitmap_item(bitmap_t &bitmap) + : m_next(NULL), + m_bitmap(bitmap) { } + auto_bitmap_item *next() const { return m_next; } + + auto_bitmap_item * m_next; + bitmap_t & m_bitmap; + }; + simple_list m_auto_bitmap_list; // list of registered bitmaps }; // device type definition extern const device_type SCREEN; +// iterator helper +typedef device_type_iterator<&device_creator, screen_device> screen_device_iterator; + //************************************************************************** @@ -255,14 +343,14 @@ //************************************************************************** #define SCREEN_UPDATE_NAME(name) screen_update_##name -#define SCREEN_UPDATE(name) UINT32 SCREEN_UPDATE_NAME(name)(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect) -#define SCREEN_UPDATE_CALL(name) SCREEN_UPDATE_NAME(name)(screen, bitmap, cliprect) - -#define SCREEN_EOF_NAME(name) screen_eof_##name -#define SCREEN_EOF(name) void SCREEN_EOF_NAME(name)(screen_device *screen, running_machine &machine) -#define SCREEN_EOF_CALL(name) SCREEN_EOF_NAME(name)(screen, machine) - -#define screen_eof_0 NULL +#define SCREEN_UPDATE_IND16(name) UINT32 SCREEN_UPDATE_NAME(name)(device_t *, screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +#define SCREEN_UPDATE_RGB32(name) UINT32 SCREEN_UPDATE_NAME(name)(device_t *, screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +#define SCREEN_UPDATE16_CALL(name) SCREEN_UPDATE_NAME(name)(NULL, screen, bitmap, cliprect) +#define SCREEN_UPDATE32_CALL(name) SCREEN_UPDATE_NAME(name)(NULL, screen, bitmap, cliprect) + +#define SCREEN_VBLANK_NAME(name) screen_vblank_##name +#define SCREEN_VBLANK(name) void SCREEN_VBLANK_NAME(name)(device_t *, screen_device &screen, bool vblank_on) +#define SCREEN_VBLANK_CALL(name) SCREEN_VBLANK_NAME(name)(NULL, screen, vblank_on) #define MCFG_SCREEN_ADD(_tag, _type) \ MCFG_DEVICE_ADD(_tag, SCREEN, 0) \ @@ -271,9 +359,6 @@ #define MCFG_SCREEN_MODIFY(_tag) \ MCFG_DEVICE_MODIFY(_tag) -#define MCFG_SCREEN_FORMAT(_format) \ - screen_device::static_set_format(*device, _format); \ - #define MCFG_SCREEN_TYPE(_type) \ screen_device::static_set_type(*device, SCREEN_TYPE_##_type); \ @@ -295,11 +380,61 @@ #define MCFG_SCREEN_DEFAULT_POSITION(_xscale, _xoffs, _yscale, _yoffs) \ screen_device::static_set_default_position(*device, _xscale, _xoffs, _yscale, _yoffs); \ -#define MCFG_SCREEN_UPDATE(_func) \ - screen_device::static_set_screen_update(*device, SCREEN_UPDATE_NAME(_func)); \ +#define MCFG_SCREEN_UPDATE_STATIC(_func) \ + screen_device::static_set_screen_update(*device, screen_update_delegate_smart(&screen_update_##_func, "screen_update_" #_func)); \ + +#define MCFG_SCREEN_UPDATE_DRIVER(_class, _method) \ + screen_device::static_set_screen_update(*device, screen_update_delegate_smart(&_class::_method, #_class "::" #_method, NULL)); \ + +#define MCFG_SCREEN_UPDATE_DEVICE(_device, _class, _method) \ + screen_device::static_set_screen_update(*device, screen_update_delegate_smart(&_class::_method, #_class "::" #_method, _device)); \ + +#define MCFG_SCREEN_VBLANK_NONE() \ + screen_device::static_set_screen_vblank(*device, screen_vblank_delegate()); \ + +#define MCFG_SCREEN_VBLANK_STATIC(_func) \ + screen_device::static_set_screen_vblank(*device, screen_vblank_delegate(&screen_vblank_##_func, "screen_vblank_" #_func)); \ + +#define MCFG_SCREEN_VBLANK_DRIVER(_class, _method) \ + screen_device::static_set_screen_vblank(*device, screen_vblank_delegate(&_class::_method, #_class "::" #_method, NULL)); \ -#define MCFG_SCREEN_EOF(_func) \ - screen_device::static_set_screen_eof(*device, SCREEN_EOF_NAME(_func)); \ +#define MCFG_SCREEN_VBLANK_DEVICE(_device, _class, _method) \ + screen_device::static_set_screen_vblank(*device, screen_vblank_delegate(&_class::_method, #_class "::" #_method, _device)); \ + + + +//************************************************************************** +// INLINE HELPERS +//************************************************************************** + +//------------------------------------------------- +// screen_update_delegate_smart - collection of +// inline helpers which create the appropriate +// screen_update_delegate based on the input +// function type +//------------------------------------------------- + +inline screen_update_ind16_delegate screen_update_delegate_smart(UINT32 (*callback)(device_t *, screen_device &, bitmap_ind16 &, const rectangle &), const char *name) +{ + return screen_update_ind16_delegate(callback, name); +} + +inline screen_update_rgb32_delegate screen_update_delegate_smart(UINT32 (*callback)(device_t *, screen_device &, bitmap_rgb32 &, const rectangle &), const char *name) +{ + return screen_update_rgb32_delegate(callback, name); +} + +template +inline screen_update_ind16_delegate screen_update_delegate_smart(UINT32 (_FunctionClass::*callback)(screen_device &, bitmap_ind16 &, const rectangle &), const char *name, const char *devname) +{ + return screen_update_ind16_delegate(callback, name, devname, (_FunctionClass *)0); +} + +template +inline screen_update_rgb32_delegate screen_update_delegate_smart(UINT32 (_FunctionClass::*callback)(screen_device &, bitmap_rgb32 &, const rectangle &), const char *name, const char *devname) +{ + return screen_update_rgb32_delegate(callback, name, devname, (_FunctionClass *)0); +} #endif /* __SCREEN_H__ */ diff -Nru mame-0.144/src/emu/softlist.c mame-0.145/src/emu/softlist.c --- mame-0.144/src/emu/softlist.c 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/softlist.c 2012-02-06 21:30:28.000000000 +0000 @@ -12,11 +12,69 @@ #include "emuopts.h" #include "hash.h" #include "softlist.h" +#include "clifront.h" #include typedef tagmap_t softlist_map; + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +tagmap_t software_list_device::s_checked_lists; + +// device type definition +const device_type SOFTWARE_LIST = &device_creator; + +//------------------------------------------------- +// software_list_device - constructor +//------------------------------------------------- + +software_list_device::software_list_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, SOFTWARE_LIST, "Software lists", tag, owner, clock), + m_list_name(NULL), + m_list_type(SOFTWARE_LIST_ORIGINAL_SYSTEM), + m_filter(NULL) +{ +} + + +//------------------------------------------------- +// static_set_interface - configuration helper +// to set the interface +//------------------------------------------------- + +void software_list_device::static_set_config(device_t &device, const char *list, softlist_type list_type) +{ + software_list_device &softlist = downcast(device); + softlist.m_list_name = list; + softlist.m_list_type = list_type; +} + + +//------------------------------------------------- +// static_set_custom_handler - configuration +// helper to set a custom callback +//------------------------------------------------- + +void software_list_device::static_set_filter(device_t &device, const char *filter) +{ + downcast(device).m_filter = filter; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void software_list_device::device_start() +{ +} + + + /*************************************************************************** EXPAT INTERFACES ***************************************************************************/ @@ -68,12 +126,13 @@ unknown_tag -------------------------------------------------*/ -INLINE void unknown_tag(parse_state *state, const char *tagname) +INLINE void unknown_tag(software_list *swlist, const char *tagname) { - parse_error(state, "[%lu:%lu]: Unknown tag: %s\n", - XML_GetCurrentLineNumber(state->parser), - XML_GetCurrentColumnNumber(state->parser), - tagname); + parse_error(&swlist->state, "%s: Unknown tag: %s (line %lu column %lu)\n", + swlist->file->filename(), + tagname, + XML_GetCurrentLineNumber(swlist->state.parser), + XML_GetCurrentColumnNumber(swlist->state.parser)); } @@ -82,12 +141,13 @@ unknown_attribute -------------------------------------------------*/ -INLINE void unknown_attribute(parse_state *state, const char *attrname) +INLINE void unknown_attribute(software_list *swlist, const char *attrname) { - parse_error(state, "[%lu:%lu]: Unknown attribute: %s\n", - XML_GetCurrentLineNumber(state->parser), - XML_GetCurrentColumnNumber(state->parser), - attrname); + parse_error(&swlist->state, "%s: Unknown attribute: %s (line %lu column %lu)\n", + swlist->file->filename(), + attrname, + XML_GetCurrentLineNumber(swlist->state.parser), + XML_GetCurrentColumnNumber(swlist->state.parser)); } @@ -96,13 +156,14 @@ unknown_attribute_value -------------------------------------------------*/ -INLINE void unknown_attribute_value(parse_state *state, +INLINE void unknown_attribute_value(software_list *swlist, const char *attrname, const char *attrvalue) { - parse_error(state, "[%lu:%lu]: Unknown attribute value: %s\n", - XML_GetCurrentLineNumber(state->parser), - XML_GetCurrentColumnNumber(state->parser), - attrvalue); + parse_error(&swlist->state, "%s: Unknown attribute value: %s (line %lu column %lu)\n", + swlist->file->filename(), + attrvalue, + XML_GetCurrentLineNumber(swlist->state.parser), + XML_GetCurrentColumnNumber(swlist->state.parser)); } @@ -172,7 +233,17 @@ static void add_rom_entry(software_list *swlist, const char *name, const char *hashdata, UINT32 offset, UINT32 length, UINT32 flags) { - software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry-1]; + software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1]; + if ((flags & ROMENTRY_TYPEMASK) == ROMENTRYTYPE_REGION && name!=NULL && part!=NULL) { + if (swlist->current_rom_entry>0) { + for (int i=0;icurrent_rom_entry;i++) { + if ((part->romdata[i]._name != NULL) && (strcmp(part->romdata[i]._name,name)==0)) { + parse_error(&swlist->state, "%s: Duplicated dataarea %s in %s\n",swlist->file->filename(),name,swlist->current_software_info->shortname); + } + } + } + } + struct rom_entry *entry = &part->romdata[swlist->current_rom_entry]; entry->_name = name; @@ -208,7 +279,7 @@ static void add_feature(software_list *swlist, char *feature_name, char *feature_value) { - software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry-1]; + software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1]; feature_list *new_entry; /* First allocate the new entry */ @@ -287,21 +358,21 @@ static void add_software_part(software_list *swlist, const char *name, const char *interface) { - software_part *part = &swlist->softinfo->partdata[swlist->current_part_entry]; + software_part *part = &swlist->softinfo->partdata[swlist->softinfo->current_part_entry]; part->name = name; part->interface_ = interface; part->featurelist = NULL; part->romdata = NULL; - swlist->current_part_entry += 1; + swlist->softinfo->current_part_entry += 1; - if ( swlist->current_part_entry >= swlist->part_entries ) + if ( swlist->softinfo->current_part_entry >= swlist->softinfo->part_entries ) { software_part *new_parts; - swlist->part_entries += 2; - new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->part_entries * sizeof(software_part) ); + swlist->softinfo->part_entries += 2; + new_parts = (software_part *)pool_realloc_lib(swlist->pool, swlist->softinfo->partdata, swlist->softinfo->part_entries * sizeof(software_part) ); if ( new_parts ) { @@ -310,7 +381,7 @@ else { /* Allocation error */ - swlist->current_part_entry -= 1; + swlist->softinfo->current_part_entry -= 1; } } } @@ -335,19 +406,20 @@ if ( ! strcmp(attributes[0], "name" ) ) { } - if ( ! strcmp(attributes[0], "description" ) ) + else if ( ! strcmp(attributes[0], "description" ) ) { swlist->description = (const char *)pool_malloc_lib(swlist->pool, (strlen(attributes[1]) + 1) * sizeof(char)); if (!swlist->description) return; strcpy((char *)swlist->description, attributes[1]); - } + } else + unknown_attribute(swlist, attributes[0]); } } else { - unknown_tag(&swlist->state, tagname); + unknown_tag(swlist, tagname); } break; @@ -364,14 +436,16 @@ { name = attributes[1]; } - if ( !strcmp( attributes[0], "cloneof" ) ) + else if ( !strcmp( attributes[0], "cloneof" ) ) { parent = attributes[1]; } - if ( !strcmp( attributes[0], "supported" ) ) + else if ( !strcmp( attributes[0], "supported" ) ) { supported = attributes[1]; } + else + unknown_attribute(swlist, attributes[0]); } if ( name ) @@ -400,9 +474,9 @@ } /* Allocate initial space to hold part information */ - swlist->part_entries = 2; - swlist->current_part_entry = 0; - elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, swlist->part_entries * sizeof(software_part) ); + elem->part_entries = 2; + elem->current_part_entry = 0; + elem->partdata = (software_part *)pool_malloc_lib(swlist->pool, elem->part_entries * sizeof(software_part) ); if ( !elem->partdata ) return; elem->shared_info = (feature_list *)pool_malloc_lib(swlist->pool, sizeof(feature_list) ); @@ -440,12 +514,15 @@ } else { + parse_error(&swlist->state, "%s: No name defined for item (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + swlist->softinfo = NULL; } } else { - unknown_tag(&swlist->state, tagname); + unknown_tag(swlist, tagname); } break; @@ -473,8 +550,11 @@ if ( !strcmp( attributes[0], "name" ) ) str_feature_name = attributes[1]; - if ( !strcmp( attributes[0], "value" ) ) + else if ( !strcmp( attributes[0], "value" ) ) str_feature_value = attributes[1]; + + else + unknown_attribute(swlist, attributes[0]); } /* Prepare for adding feature to feature list */ @@ -499,6 +579,9 @@ } add_info( swlist, name, value ); + } else { + parse_error(&swlist->state, "%s: Incomplete sharedfeat definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } else if ( !strcmp(tagname, "part" ) ) @@ -511,8 +594,11 @@ if ( !strcmp( attributes[0], "name" ) ) str_name = attributes[1]; - if ( !strcmp( attributes[0], "interface" ) ) + else if ( !strcmp( attributes[0], "interface" ) ) str_interface = attributes[1]; + + else + unknown_attribute(swlist, attributes[0]); } if ( str_name && str_interface ) @@ -533,18 +619,20 @@ /* Allocate initial space to hold the rom information */ swlist->rom_entries = 3; swlist->current_rom_entry = 0; - swlist->softinfo->partdata[swlist->current_part_entry-1].romdata = (struct rom_entry *)pool_malloc_lib(swlist->pool, swlist->rom_entries * sizeof(struct rom_entry)); - if ( ! swlist->softinfo->partdata[swlist->current_part_entry-1].romdata ) + swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1].romdata = (struct rom_entry *)pool_malloc_lib(swlist->pool, swlist->rom_entries * sizeof(struct rom_entry)); + if ( ! swlist->softinfo->partdata[swlist->softinfo->current_part_entry-1].romdata ) return; } } else { /* Incomplete/incorrect part definition */ + parse_error(&swlist->state, "%s: Incomplete part definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } else - unknown_tag(&swlist->state, tagname); + unknown_tag(swlist, tagname); if (text_dest && swlist->softinfo) swlist->state.text_dest = text_dest; @@ -561,8 +649,11 @@ if ( !strcmp( attributes[0], "name" ) ) str_name = attributes[1]; - if ( !strcmp( attributes[0], "size") ) + else if ( !strcmp( attributes[0], "size") ) str_size = attributes[1]; + + else + unknown_attribute(swlist, attributes[0]); } if ( str_name && str_size ) { @@ -583,6 +674,8 @@ else { /* Missing dataarea name or size */ + parse_error(&swlist->state, "%s: Incomplete dataarea definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } else if (!strcmp(tagname, "diskarea")) @@ -593,6 +686,8 @@ { if ( !strcmp( attributes[0], "name" ) ) str_name = attributes[1]; + else + unknown_attribute(swlist, attributes[0]); } if ( str_name ) { @@ -612,6 +707,8 @@ else { /* Missing dataarea name or size */ + parse_error(&swlist->state, "%s: Incomplete diskarea definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } else if ( !strcmp(tagname, "feature") ) @@ -624,8 +721,11 @@ if ( !strcmp( attributes[0], "name" ) ) str_feature_name = attributes[1]; - if ( !strcmp( attributes[0], "value" ) ) + else if ( !strcmp( attributes[0], "value" ) ) str_feature_value = attributes[1]; + + else + unknown_attribute(swlist, attributes[0]); } /* Prepare for adding feature to feature list */ @@ -650,10 +750,16 @@ } add_feature( swlist, name, value ); + } else { + parse_error(&swlist->state, "%s: Incomplete feature definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } + else if (!strcmp(tagname, "dipswitch")) + { + } else - unknown_tag( &swlist->state, tagname ); + unknown_tag(swlist, tagname ); break; case POS_DATA: @@ -672,20 +778,22 @@ { if ( !strcmp( attributes[0], "name" ) ) str_name = attributes[1]; - if ( !strcmp( attributes[0], "size" ) ) + else if ( !strcmp( attributes[0], "size" ) ) str_size = attributes[1]; - if ( !strcmp( attributes[0], "crc" ) ) + else if ( !strcmp( attributes[0], "crc" ) ) str_crc = attributes[1]; - if ( !strcmp( attributes[0], "sha1" ) ) + else if ( !strcmp( attributes[0], "sha1" ) ) str_sha1 = attributes[1]; - if ( !strcmp( attributes[0], "offset" ) ) + else if ( !strcmp( attributes[0], "offset" ) ) str_offset = attributes[1]; - if ( !strcmp( attributes[0], "value" ) ) + else if ( !strcmp( attributes[0], "value" ) ) str_value = attributes[1]; - if ( !strcmp( attributes[0], "status" ) ) + else if ( !strcmp( attributes[0], "status" ) ) str_status = attributes[1]; - if ( !strcmp( attributes[0], "loadflag" ) ) + else if ( !strcmp( attributes[0], "loadflag" ) ) str_loadflag = attributes[1]; + else + unknown_attribute(swlist, attributes[0]); } if ( swlist->softinfo ) { @@ -712,14 +820,17 @@ else if ( str_loadflag && !strcmp(str_loadflag, "fill") ) { /* Handle 'fill' loadflag */ - add_rom_entry( swlist, NULL, (const char*)(FPTR)atoi(str_value), offset, length, ROMENTRYTYPE_FILL ); + add_rom_entry( swlist, NULL, (const char*)(FPTR)(strtol( str_value, NULL, 0 ) & 0xff), offset, length, ROMENTRYTYPE_FILL ); } else { - if ( str_name && str_crc && str_sha1 ) + if ( str_name) { char *s_name = (char *)pool_malloc_lib(swlist->pool, ( strlen( str_name ) + 1 ) * sizeof(char) ); - char *hashdata = (char *)pool_malloc_lib( swlist->pool, sizeof(char) * ( strlen(str_crc) + strlen(str_sha1) + 7 + 4 ) ); + int hashsize = 7 + 4; + if (str_crc) hashsize+= strlen(str_crc); + if (str_sha1) hashsize+= strlen(str_sha1); + char *hashdata = (char *)pool_malloc_lib( swlist->pool, sizeof(char) * (hashsize) ); int baddump = ( str_status && !strcmp(str_status, "baddump") ) ? 1 : 0; int nodump = ( str_status && !strcmp(str_status, "nodump" ) ) ? 1 : 0; int romflags = 0; @@ -728,7 +839,20 @@ return; strcpy( s_name, str_name ); - sprintf( hashdata, "%c%s%c%s%s", hash_collection::HASH_CRC, str_crc, hash_collection::HASH_SHA1, str_sha1, ( nodump ? NO_DUMP : ( baddump ? BAD_DUMP : "" ) ) ); + if (nodump) { + sprintf( hashdata, "%s", NO_DUMP); + if (str_crc && str_sha1) { + parse_error(&swlist->state, "%s: No need for hash definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + } + } else { + if (str_crc && str_sha1) { + sprintf( hashdata, "%c%s%c%s%s", hash_collection::HASH_CRC, str_crc, hash_collection::HASH_SHA1, str_sha1, (baddump ? BAD_DUMP : "")); + } else { + parse_error(&swlist->state, "%s: Incomplete rom hash definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + } + } /* Handle loadflag attribute */ if ( str_loadflag && !strcmp(str_loadflag, "load16_word_swap") ) @@ -744,13 +868,18 @@ /* ROM_LOAD( name, offset, length, hash ) */ add_rom_entry( swlist, s_name, hashdata, offset, length, ROMENTRYTYPE_ROM | romflags ); + } else { + parse_error(&swlist->state, "%s: Rom name missing (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); } } } - } - else - { - /* Missing name, size, crc, sha1, or offset */ + else + { + /* Missing name, size, crc, sha1, or offset */ + parse_error(&swlist->state, "%s: Incomplete rom definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + } } } else @@ -765,12 +894,14 @@ { if ( !strcmp( attributes[0], "name" ) ) str_name = attributes[1]; - if ( !strcmp( attributes[0], "sha1" ) ) + else if ( !strcmp( attributes[0], "sha1" ) ) str_sha1 = attributes[1]; - if ( !strcmp( attributes[0], "status" ) ) + else if ( !strcmp( attributes[0], "status" ) ) str_status = attributes[1]; - if ( !strcmp( attributes[0], "writeable" ) ) + else if ( !strcmp( attributes[0], "writeable" ) ) str_writeable = attributes[1]; + else + unknown_attribute(swlist, attributes[0]); } if ( swlist->softinfo ) { @@ -790,10 +921,21 @@ add_rom_entry( swlist, s_name, hashdata, 0, 0, ROMENTRYTYPE_ROM | (writeable ? DISK_READWRITE : DISK_READONLY ) ); } + else + { + if (!str_status || strcmp(str_status, "nodump")) // a no_dump chd is not an incomplete entry + { + parse_error(&swlist->state, "%s: Incomplete disk definition (line %lu)\n", + swlist->file->filename(),XML_GetCurrentLineNumber(swlist->state.parser)); + } + } } } + else if (!strcmp(tagname, "dipvalue")) + { + } else - unknown_tag(&swlist->state, tagname); + unknown_tag(swlist, tagname); break; } swlist->state.pos = (softlist_parse_position) (swlist->state.pos + 1); @@ -814,14 +956,6 @@ case POS_ROOT: break; - case POS_SOFT: - if ( ! strcmp( name, "part" ) && swlist->softinfo ) - { - /* ROM_END */ - add_rom_entry( swlist, NULL, NULL, 0, 0, ROMENTRYTYPE_END ); - } - break; - case POS_MAIN: if ( swlist->softinfo ) { @@ -829,20 +963,27 @@ } break; - case POS_PART: - /* Add shared_info inherited from the software_info level, if any */ - if ( swlist->softinfo && swlist->softinfo->shared_info ) + case POS_SOFT: + if ( ! strcmp( name, "part" ) && swlist->softinfo ) { - feature_list *list = swlist->softinfo->shared_info; - - while( list->next ) + /* ROM_END */ + add_rom_entry( swlist, NULL, NULL, 0, 0, ROMENTRYTYPE_END ); + /* Add shared_info inherited from the software_info level, if any */ + if ( swlist->softinfo && swlist->softinfo->shared_info ) { - add_feature( swlist, list->next->name, list->next->value ); - list = list->next; + feature_list *list = swlist->softinfo->shared_info; + + while( list->next ) + { + add_feature( swlist, list->next->name, list->next->value ); + list = list->next; + } } } break; + case POS_PART: + break; case POS_DATA: break; } @@ -871,6 +1012,19 @@ memcpy(&text[text_len], s, len); text[text_len + len] = '\0'; *swlist->state.text_dest = text; + } else { + if (swlist->state.error_proc) + { + int errcnt = 0; + for (int i=0;i0) { + parse_error(&swlist->state, "%s: Unknown content (line %lu)\n", + swlist->file->filename(), + XML_GetCurrentLineNumber(swlist->state.parser)); + } + } } } @@ -879,11 +1033,11 @@ software_list_get_count -------------------------------------------------*/ -static int software_list_get_count(software_list *swlist) +static int software_list_get_count(const software_list *swlist) { int count = 0; - for (software_info *swinfo = software_list_find(swlist, "*", NULL); swinfo != NULL; swinfo = software_list_find(swlist, "*", swinfo)) + for (const software_info *swinfo = software_list_find(swlist, "*", NULL); swinfo != NULL; swinfo = software_list_find(swlist, "*", swinfo)) count++; return count; @@ -897,11 +1051,11 @@ const char *software_get_clone(emu_options &options, char *swlist, const char *swname) { - software_list *software_list_ptr = software_list_open(options, swlist, FALSE, NULL); + const software_list *software_list_ptr = software_list_open(options, swlist, FALSE, NULL); const char *retval = NULL; if (software_list_ptr) { - software_info *tmp = software_list_find(software_list_ptr, swname, NULL); + const software_info *tmp = software_list_find(software_list_ptr, swname, NULL); retval = core_strdup(tmp->parentname); software_list_close(software_list_ptr); } @@ -917,12 +1071,12 @@ UINT32 software_get_support(emu_options &options, char *swlist, const char *swname) { - software_list *software_list_ptr = software_list_open(options, swlist, FALSE, NULL); + const software_list *software_list_ptr = software_list_open(options, swlist, FALSE, NULL); UINT32 retval = 0; if (software_list_ptr) { - software_info *tmp = software_list_find(software_list_ptr, swname, NULL); + const software_info *tmp = software_list_find(software_list_ptr, swname, NULL); retval = tmp->supported; software_list_close(software_list_ptr); } @@ -967,10 +1121,11 @@ swlist->state.done = swlist->file->eof(); if (XML_Parse(swlist->state.parser, buf, len, swlist->state.done) == XML_STATUS_ERROR) { - parse_error(&swlist->state, "[%lu:%lu]: %s\n", + parse_error(&swlist->state, "%s: %s (line %lu column %lu)\n", + swlist->file->filename(), + XML_ErrorString(XML_GetErrorCode(swlist->state.parser)), XML_GetCurrentLineNumber(swlist->state.parser), - XML_GetCurrentColumnNumber(swlist->state.parser), - XML_ErrorString(XML_GetErrorCode(swlist->state.parser))); + XML_GetCurrentColumnNumber(swlist->state.parser)); goto done; } } @@ -1035,7 +1190,7 @@ software_list_close -------------------------------------------------*/ -void software_list_close(software_list *swlist) +void software_list_close(const software_list *swlist) { if (swlist == NULL) return; @@ -1050,7 +1205,7 @@ software_list_get_description -------------------------------------------------*/ -const char *software_list_get_description(software_list *swlist) +const char *software_list_get_description(const software_list *swlist) { return swlist->description; } @@ -1119,7 +1274,7 @@ software_list_find_approx_matches -------------------------------------------------*/ -void software_list_find_approx_matches(software_list *swlist, const char *name, int matches, software_info **list, const char* interface) +void software_list_find_approx_matches(software_list_device *swlistdev, software_list *swlist, const char *name, int matches, software_info **list, const char* interface) { #undef rand @@ -1146,7 +1301,7 @@ software_info *candidate = swinfo; software_part *part = software_find_part(swinfo, NULL, NULL); - if (interface==NULL || !strcmp(interface, part->interface_)) + if ((interface==NULL || !strcmp(interface, part->interface_)) && (is_software_compatible(part, swlistdev))) { /* pick the best match between driver name and description */ @@ -1182,7 +1337,7 @@ software_list_find -------------------------------------------------*/ -software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev) +const software_info *software_list_find(const software_list *swlist, const char *look_for, const software_info *prev) { if (swlist == NULL) return NULL; @@ -1191,8 +1346,9 @@ return NULL; /* If we haven't read in the xml file yet, then do it now */ + /* Just-in-time parsing, hence the const-cast */ if ( ! swlist->software_info_list ) - software_list_parse( swlist, swlist->error_proc, NULL ); + software_list_parse( const_cast(swlist), swlist->error_proc, NULL ); for ( prev = prev ? prev->next : swlist->software_info_list; prev; prev = prev->next ) { @@ -1203,6 +1359,12 @@ return prev; } +software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev) +{ + return const_cast(software_list_find(const_cast(swlist), + look_for, + const_cast(prev))); +} /*------------------------------------------------- software_find_romdata (for validation purposes) @@ -1260,9 +1422,9 @@ software_find_part -------------------------------------------------*/ -software_part *software_find_part(software_info *sw, const char *partname, const char *interface) +const software_part *software_find_part(const software_info *sw, const char *partname, const char *interface) { - software_part *part = sw ? sw->partdata : NULL; + const software_part *part = sw ? sw->partdata : NULL; /* If neither partname nor interface supplied, then we just return the first entry */ if ( partname || interface ) @@ -1301,18 +1463,22 @@ } } - if ( ! part->name ) + if ( part && ! part->name ) part = NULL; return part; } +software_part *software_find_part(software_info *sw, const char *partname, const char *interface) +{ + return const_cast(software_find_part(const_cast(sw), partname, interface)); +} /*------------------------------------------------- software_part_next -------------------------------------------------*/ -software_part *software_part_next(software_part *part) +const software_part *software_part_next(const software_part *part) { if ( part && part->name ) { @@ -1325,60 +1491,58 @@ return part; } +software_part *software_part_next(software_part *part) +{ + return const_cast(software_part_next(const_cast(part))); +} + /*------------------------------------------------- software_display_matches -------------------------------------------------*/ -void software_display_matches(const device_list &devlist,emu_options &options, const char *interface ,const char *name) +void software_display_matches(const machine_config &config,emu_options &options, const char *interface ,const char *name) { // check if there is at least a software list - if (devlist.first(SOFTWARE_LIST)) + software_list_device_iterator deviter(config.root_device()); + if (deviter.first()) { mame_printf_error("\n\"%s\" approximately matches the following\n" "supported software items (best match first):\n\n", name); } - for (device_t *swlists = devlist.first(SOFTWARE_LIST); swlists != NULL; swlists = swlists->typenext()) + for (software_list_device *swlist = deviter.first(); swlist != NULL; swlist = deviter.next()) { - software_list_config *swlist = (software_list_config *)downcast(swlists)->inline_config(); + software_list *list = software_list_open(options, swlist->list_name(), FALSE, NULL); - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) + if (list) { - if (swlist->list_name[i] && *swlist->list_name[i]) - { - software_list *list = software_list_open(options, swlist->list_name[i], FALSE, NULL); - - if (list) - { - software_info *matches[10] = { 0 }; - int softnum; + software_info *matches[10] = { 0 }; + int softnum; - software_list_parse(list, list->error_proc, NULL); - // get the top 5 approximate matches for the selected device interface (i.e. only carts for cartslot, etc.) - software_list_find_approx_matches(list, name, ARRAY_LENGTH(matches), matches, interface); + software_list_parse(list, list->error_proc, NULL); + // get the top 5 approximate matches for the selected device interface (i.e. only carts for cartslot, etc.) + software_list_find_approx_matches(swlist, list, name, ARRAY_LENGTH(matches), matches, interface); - if (matches[0] != 0) - { - if (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM) - mame_printf_error("* Software list \"%s\" (%s) matches: \n", swlist->list_name[i], software_list_get_description(list)); - else - mame_printf_error("* Compatible software list \"%s\" (%s) matches: \n", swlist->list_name[i], software_list_get_description(list)); + if (matches[0] != 0) + { + if (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) + mame_printf_error("* Software list \"%s\" (%s) matches: \n", swlist->list_name(), software_list_get_description(list)); + else + mame_printf_error("* Compatible software list \"%s\" (%s) matches: \n", swlist->list_name(), software_list_get_description(list)); - // print them out - for (softnum = 0; softnum < ARRAY_LENGTH(matches); softnum++) - if (matches[softnum] != NULL) - mame_printf_error("%-18s%s\n", matches[softnum]->shortname, matches[softnum]->longname); + // print them out + for (softnum = 0; softnum < ARRAY_LENGTH(matches); softnum++) + if (matches[softnum] != NULL) + mame_printf_error("%-18s%s\n", matches[softnum]->shortname, matches[softnum]->longname); - mame_printf_error("\n"); - } - software_list_close(list); - } + mame_printf_error("\n"); } + software_list_close(list); } } } -static void find_software_item(const device_list &devlist, emu_options &options, const device_image_interface *image, const char *path, software_list **software_list_ptr, software_info **software_info_ptr,software_part **software_part_ptr, const char **sw_list_name) +static void find_software_item(const machine_config &config, emu_options &options, const device_image_interface *image, const char *path, software_list **software_list_ptr, software_info **software_info_ptr,software_part **software_part_ptr, const char **sw_list_name) { char *swlist_name, *swname, *swpart; //, *swname_bckp; *software_list_ptr = NULL; @@ -1389,7 +1553,8 @@ software_name_split(path, &swlist_name, &swname, &swpart ); // swname_bckp = swname; - const char *interface = image->image_interface(); + const char *interface = NULL; + if (image) interface = image->image_interface(); if ( swlist_name ) { @@ -1409,38 +1574,29 @@ else { /* Loop through all the software lists named in the driver */ - for (device_t *swlists = devlist.first(SOFTWARE_LIST); swlists != NULL; swlists = swlists->typenext()) + software_list_device_iterator deviter(config.root_device()); + for (software_list_device *swlist = deviter.first(); swlist != NULL; swlist = deviter.next()) { - if ( swlists ) + swlist_name = (char *)swlist->list_name(); + + if (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) { + if ( *software_list_ptr ) + { + software_list_close( *software_list_ptr ); + } - software_list_config *swlist = (software_list_config *)downcast(swlists)->inline_config(); - UINT32 i = DEVINFO_STR_SWLIST_0; + *software_list_ptr = software_list_open( options, swlist_name, FALSE, NULL ); - while ( ! *software_part_ptr && i <= DEVINFO_STR_SWLIST_MAX ) + if ( software_list_ptr ) { - swlist_name = swlist->list_name[i-DEVINFO_STR_SWLIST_0]; + *software_info_ptr = software_list_find( *software_list_ptr, swname, NULL ); - if ( swlist_name && *swlist_name && (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM)) + if ( *software_info_ptr ) { - if ( *software_list_ptr ) - { - software_list_close( *software_list_ptr ); - } - - *software_list_ptr = software_list_open( options, swlist_name, FALSE, NULL ); - - if ( software_list_ptr ) - { - *software_info_ptr = software_list_find( *software_list_ptr, swname, NULL ); - - if ( *software_info_ptr ) - { - *software_part_ptr = software_find_part( *software_info_ptr, swpart, interface ); - } - } + *software_part_ptr = software_find_part( *software_info_ptr, swpart, interface ); + if (*software_part_ptr) break; } - i++; } } } @@ -1520,7 +1676,7 @@ sw_info and sw_part are also set. -------------------------------------------------*/ -bool load_software_part(emu_options &options, device_image_interface *image, const char *path, software_info **sw_info, software_part **sw_part, char **full_sw_name) +bool load_software_part(emu_options &options, device_image_interface *image, const char *path, software_info **sw_info, software_part **sw_part, char **full_sw_name, char**list_name) { software_list *software_list_ptr = NULL; software_info *software_info_ptr = NULL; @@ -1530,13 +1686,14 @@ bool result = false; *sw_info = NULL; *sw_part = NULL; + *list_name = NULL; - find_software_item(image->device().machine().devicelist(), options, image, path, &software_list_ptr, &software_info_ptr, &software_part_ptr, &swlist_name); + find_software_item(image->device().machine().config(), options, image, path, &software_list_ptr, &software_info_ptr, &software_part_ptr, &swlist_name); // if no match has been found, we suggest similar shortnames if (software_info_ptr == NULL) { - software_display_matches(image->device().machine().devicelist(),image->device().machine().options(), image->image_interface(), path); + software_display_matches(image->device().machine().config(),image->device().machine().options(), image->image_interface(), path); } if ( software_part_ptr ) @@ -1561,39 +1718,95 @@ if ( software_info_ptr->publisher ) (*sw_info)->publisher = auto_strdup( image->device().machine(), software_info_ptr->publisher ); - *sw_part = auto_alloc_clear( image->device().machine(), software_part ); - (*sw_part)->name = auto_strdup( image->device().machine(), software_part_ptr->name ); - if ( software_part_ptr->interface_ ) - (*sw_part)->interface_ = auto_strdup( image->device().machine(), software_part_ptr->interface_ ); - - if ( software_part_ptr->featurelist ) + (*sw_info)->partdata = (software_part *)auto_alloc_array_clear(image->device().machine(), UINT8, software_info_ptr->part_entries * sizeof(software_part) ); + software_part *new_part = (*sw_info)->partdata; + for (software_part *swp = software_find_part(software_info_ptr, NULL, NULL); swp != NULL; swp = software_part_next(swp)) { - feature_list *list = software_part_ptr->featurelist; - feature_list *new_list = auto_alloc_clear( image->device().machine(), feature_list ); + if (strcmp(software_part_ptr->name,swp->name)==0) *sw_part = new_part; - (*sw_part)->featurelist = new_list; + new_part->name = auto_strdup( image->device().machine(), swp->name ); + if ( swp->interface_ ) + new_part->interface_ = auto_strdup( image->device().machine(), swp->interface_ ); - new_list->name = auto_strdup( image->device().machine(), list->name ); - new_list->value = auto_strdup( image->device().machine(), list->value ); + if ( swp->featurelist ) + { + feature_list *list = swp->featurelist; + feature_list *new_list = auto_alloc_clear( image->device().machine(), feature_list ); - list = list->next; + new_part->featurelist = new_list; - while( list ) - { - new_list->next = auto_alloc_clear( image->device().machine(), feature_list ); - new_list = new_list->next; new_list->name = auto_strdup( image->device().machine(), list->name ); new_list->value = auto_strdup( image->device().machine(), list->value ); list = list->next; - } - new_list->next = NULL; + while( list ) + { + new_list->next = auto_alloc_clear( image->device().machine(), feature_list ); + new_list = new_list->next; + new_list->name = auto_strdup( image->device().machine(), list->name ); + new_list->value = auto_strdup( image->device().machine(), list->value ); + + list = list->next; + } + new_list->next = NULL; + } + new_part++; } + *list_name = auto_strdup( image->device().machine(), swlist_name ); /* Tell the world which part we actually loaded */ *full_sw_name = auto_alloc_array( image->device().machine(), char, strlen(swlist_name) + strlen(software_info_ptr->shortname) + strlen(software_part_ptr->name) + 3 ); sprintf( *full_sw_name, "%s:%s:%s", swlist_name, software_info_ptr->shortname, software_part_ptr->name ); + + software_list_device_iterator iter(image->device().machine().root_device()); + for (software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) + { + if (strcmp(swlist->list_name(),swlist_name)==0) { + if (!is_software_compatible(software_part_ptr, swlist)) { + mame_printf_warning("WARNING! the set %s might not work on this system due to missing filter(s) '%s'\n",software_info_ptr->shortname,swlist->filter()); + } + break; + } + } + + { + const char *requirement = software_part_get_feature(software_part_ptr, "requirement"); + if (requirement!=NULL) { + software_list *req_software_list_ptr = NULL; + software_info *req_software_info_ptr = NULL; + software_part *req_software_part_ptr = NULL; + const char *req_swlist_name = NULL; + + find_software_item(image->device().machine().config(), options, NULL, requirement, &req_software_list_ptr, &req_software_info_ptr, &req_software_part_ptr, &req_swlist_name); + + if ( req_software_list_ptr ) + { + image_interface_iterator imgiter(image->device().machine().root_device()); + for (device_image_interface *req_image = imgiter.first(); req_image != NULL; req_image = imgiter.next()) + { + const char *interface = req_image->image_interface(); + if (interface != NULL) + { + if (!strcmp(interface, req_software_part_ptr->interface_)) + { + const char *option = options.value(req_image->brief_instance_name()); + // mount only if not already mounted + if (strlen(option)==0) { + req_image->set_init_phase(); + req_image->load(requirement); + } + break; + } + } + } + software_list_close( req_software_list_ptr ); + req_software_info_ptr = NULL; + req_software_list_ptr = NULL; + global_free(req_swlist_name); + } + } + } } /* Close the software list if it's still open */ @@ -1612,9 +1825,9 @@ software_part_get_feature -------------------------------------------------*/ -const char *software_part_get_feature(software_part *part, const char *feature_name) +const char *software_part_get_feature(const software_part *part, const char *feature_name) { - feature_list *feature; + const feature_list *feature; if (part == NULL) return NULL; @@ -1633,9 +1846,9 @@ software_get_default_slot -------------------------------------------------*/ - const char *software_get_default_slot(const device_list &devlist, emu_options &options, const device_image_interface *image, const char *default_card, const char* default_card_slot) + const char *software_get_default_slot(const machine_config &config, emu_options &options, const device_image_interface *image, const char* default_card_slot) { - const char* retVal = default_card; + const char* retVal = NULL; const char* path = options.value(image->instance_name()); software_list *software_list_ptr = NULL; software_info *software_info_ptr = NULL; @@ -1644,7 +1857,7 @@ if (strlen(path)>0) { retVal = default_card_slot; - find_software_item(devlist, options, image, path, &software_list_ptr, &software_info_ptr, &software_part_ptr, &swlist_name); + find_software_item(config, options, image, path, &software_list_ptr, &software_info_ptr, &software_part_ptr, &swlist_name); if (software_part_ptr!=NULL) { const char *slot = software_part_get_feature(software_part_ptr, "slot"); if (slot!=NULL) { @@ -1657,204 +1870,182 @@ return retVal; } +/*------------------------------------------------- + is_software_compatible + -------------------------------------------------*/ + +bool is_software_compatible(const software_part *swpart, const software_list_device *swlist) +{ + const char *compatibility = software_part_get_feature(swpart, "compatibility"); + const char *filter = swlist->filter(); + if ((compatibility==NULL) || (filter==NULL)) return TRUE; + astring comp = astring(compatibility,","); + char *filt = core_strdup(filter); + char *token = strtok(filt,","); + while (token!= NULL) + { + if (comp.find(0,astring(token,","))!=-1) return TRUE; + token = strtok (NULL, ","); + } + return FALSE; +} + +/*------------------------------------------------- + swinfo_has_multiple_parts + -------------------------------------------------*/ + +bool swinfo_has_multiple_parts(const software_info *swinfo, const char *interface) +{ + int count = 0; + + for (const software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) + { + if (strcmp(interface, swpart->interface_) == 0) + count++; + } + return (count > 1) ? true : false; +} + /*************************************************************************** DEVICE INTERFACE ***************************************************************************/ -static DEVICE_START( software_list ) +void validate_error_proc(const char *message) { + mame_printf_error("%s", message); } -static DEVICE_VALIDITY_CHECK( software_list ) +void software_list_device::device_validity_check(validity_checker &valid) const { - software_list_config *swlist = (software_list_config *)downcast(device)->inline_config(); - int error = FALSE; + // add to the global map whenever we check a list so we don't re-check + // it in the future + if (s_checked_lists.add(m_list_name, 1, false) == TMERR_DUPLICATE) + return; + + // do device validation only in case of validate command + if (strcmp(mconfig().options().command(), CLICOMMAND_VALIDATE) != 0) return; + softlist_map names; softlist_map descriptions; enum { NAME_LEN_PARENT = 8, NAME_LEN_CLONE = 16 }; - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) + software_list *list = software_list_open(mconfig().options(), m_list_name, FALSE, NULL); + if ( list ) { - if (swlist->list_name[i]) + software_list_parse( list, &validate_error_proc, NULL ); + + for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { - software_list *list = software_list_open(options, swlist->list_name[i], FALSE, NULL); + const char *s; + int is_clone = 0; - /* if no .xml list is found, then return (this happens e.g. if you moved/renamed the xml list) */ - if (list == NULL) - return FALSE; + /* First, check if the xml got corrupted: */ - for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) + /* Did we lost any description? */ + if (swinfo->longname == NULL) { - const char *s; - int is_clone = 0; + mame_printf_error("%s: %s has no description\n", list->file->filename(), swinfo->shortname); + break; + } - /* First, check if the xml got corrupted: */ + /* Did we lost any year? */ + if (swinfo->year == NULL) + { + mame_printf_error("%s: %s has no year\n", list->file->filename(), swinfo->shortname); + break; + } - /* Did we lost any description? */ - if (swinfo->longname == NULL) - { - mame_printf_error("%s: %s has no description\n", swlist->list_name[i], swinfo->shortname); - return TRUE; - } + /* Did we lost any publisher? */ + if (swinfo->publisher == NULL) + { + mame_printf_error("%s: %s has no publisher\n", list->file->filename(), swinfo->shortname); + break; + } - /* Did we lost any year? */ - if (swinfo->year == NULL) - { - mame_printf_error("%s: %s has no year\n", swlist->list_name[i], swinfo->shortname); - return TRUE; - } + /* Second, since the xml is fine, run additional checks: */ - /* Did we lost any publisher? */ - if (swinfo->publisher == NULL) - { - mame_printf_error("%s: %s has no publisher\n", swlist->list_name[i], swinfo->shortname); - return TRUE; - } + /* check for duplicate names */ + if (names.add(swinfo->shortname, swinfo, FALSE) == TMERR_DUPLICATE) + { + software_info *match = names.find(swinfo->shortname); + mame_printf_error("%s: %s is a duplicate name (%s)\n", list->file->filename(), swinfo->shortname, match->shortname); + } - /* Second, since the xml is fine, run additional checks: */ + /* check for duplicate descriptions */ + if (descriptions.add(astring(swinfo->longname).makelower().cstr(), swinfo, FALSE) == TMERR_DUPLICATE) + mame_printf_error("%s: %s is a duplicate description (%s)\n", list->file->filename(), swinfo->longname, swinfo->shortname); - /* check for duplicate names */ - if (names.add(swinfo->shortname, swinfo, FALSE) == TMERR_DUPLICATE) - { - software_info *match = names.find(swinfo->shortname); - mame_printf_error("%s: %s is a duplicate name (%s)\n", swlist->list_name[i], swinfo->shortname, match->shortname); - error = TRUE; - } + if (swinfo->parentname != NULL) + { + is_clone = 1; - /* check for duplicate descriptions */ - if (descriptions.add(swinfo->longname, swinfo, FALSE) == TMERR_DUPLICATE) + if (strcmp(swinfo->parentname, swinfo->shortname) == 0) { - software_info *match = names.find(swinfo->shortname); - mame_printf_error("%s: %s is a duplicate description (%s)\n", swlist->list_name[i], swinfo->longname, match->longname); - error = TRUE; + mame_printf_error("%s: %s is set as a clone of itself\n", list->file->filename(), swinfo->shortname); + break; } - if (swinfo->parentname != NULL) - { - is_clone = 1; - - if (strcmp(swinfo->parentname, swinfo->shortname) == 0) - { - mame_printf_error("%s: %s is set as a clone of itself\n", swlist->list_name[i], swinfo->shortname); - error = TRUE; - break; - } + /* make sure the parent exists */ + software_info *swinfo2 = software_list_find(list, swinfo->parentname, NULL ); - /* make sure the parent exists */ - software_info *swinfo2 = software_list_find(list, swinfo->parentname, NULL ); + if (!swinfo2) + mame_printf_error("%s: parent '%s' software for '%s' not found\n", list->file->filename(), swinfo->parentname, swinfo->shortname); + else if (swinfo2->parentname != NULL) + mame_printf_error("%s: %s is a clone of a clone\n", list->file->filename(), swinfo->shortname); + } - if (!swinfo2) - { - mame_printf_error("%s: parent '%s' software for '%s' not found\n", swlist->list_name[i], swinfo->parentname, swinfo->shortname); - error = TRUE; - } - else - { - if (swinfo2->parentname != NULL) - { - mame_printf_error("%s: %s is a clone of a clone\n", swlist->list_name[i], swinfo->shortname); - error = TRUE; - } - } - } + /* make sure the driver name is 8 chars or less */ + if ((is_clone && strlen(swinfo->shortname) > NAME_LEN_CLONE) || ((!is_clone) && strlen(swinfo->shortname) > NAME_LEN_PARENT)) + mame_printf_error("%s: %s %s driver name must be %d characters or less\n", list->file->filename(), swinfo->shortname, + is_clone ? "clone" : "parent", is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT); - /* make sure the driver name is 8 chars or less */ - if ((is_clone && strlen(swinfo->shortname) > NAME_LEN_CLONE) || ((!is_clone) && strlen(swinfo->shortname) > NAME_LEN_PARENT)) + /* make sure the year is only digits, '?' or '+' */ + for (s = swinfo->year; *s; s++) + if (!isdigit((UINT8)*s) && *s != '?' && *s != '+') { - mame_printf_error("%s: %s %s driver name must be %d characters or less\n", swlist->list_name[i], swinfo->shortname, - is_clone ? "clone" : "parent", is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT); - error = TRUE; + mame_printf_error("%s: %s has an invalid year '%s'\n", list->file->filename(), swinfo->shortname, swinfo->year); + break; } - /* make sure the year is only digits, '?' or '+' */ - for (s = swinfo->year; *s; s++) - if (!isdigit((UINT8)*s) && *s != '?' && *s != '+') - { - mame_printf_error("%s: %s has an invalid year '%s'\n", swlist->list_name[i], swinfo->shortname, swinfo->year); - error = TRUE; - break; - } + softlist_map part_names; - for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) - { - if (swpart->interface_ == NULL) - { - mame_printf_error("%s: %s has a part (%s) without interface\n", swlist->list_name[i], swinfo->shortname, swpart->name); - error = TRUE; - } + for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) + { + if (swpart->interface_ == NULL) + mame_printf_error("%s: %s has a part (%s) without interface\n", list->file->filename(), swinfo->shortname, swpart->name); - if (software_find_romdata(swpart, NULL) == NULL) - { - mame_printf_error("%s: %s has a part (%s) with no data\n", swlist->list_name[i], swinfo->shortname, swpart->name); - error = TRUE; - } + if (software_find_romdata(swpart, NULL) == NULL) + mame_printf_error("%s: %s has a part (%s) with no data\n", list->file->filename(), swinfo->shortname, swpart->name); - for (struct rom_entry *swdata = software_find_romdata(swpart, NULL); swdata != NULL; swdata = software_romdata_next(swdata)) - { - struct rom_entry *data = swdata; + if (part_names.add(swpart->name, swinfo, FALSE) == TMERR_DUPLICATE) + mame_printf_error("%s: %s has a part (%s) whose name is duplicate\n", list->file->filename(), swinfo->shortname, swpart->name); - if (data->_name && data->_hashdata) - { - const char *str; + for (struct rom_entry *swdata = software_find_romdata(swpart, NULL); swdata != NULL; swdata = software_romdata_next(swdata)) + { + struct rom_entry *data = swdata; - /* make sure it's all lowercase */ - for (str = data->_name; *str; str++) - if (tolower((UINT8)*str) != *str) - { - mame_printf_error("%s: %s has upper case ROM name %s\n", swlist->list_name[i], swinfo->shortname, data->_name); - error = TRUE; - break; - } + if (data->_name && data->_hashdata) + { + const char *str; - /* make sure the hash is valid */ - hash_collection hashes; - if (!hashes.from_internal_string(data->_hashdata)) + /* make sure it's all lowercase */ + for (str = data->_name; *str; str++) + if (tolower((UINT8)*str) != *str) { - mame_printf_error("%s: %s has rom '%s' with an invalid hash string '%s'\n", swlist->list_name[i], swinfo->shortname, data->_name, data->_hashdata); - error = TRUE; + mame_printf_error("%s: %s has upper case ROM name %s\n", list->file->filename(), swinfo->shortname, data->_name); + break; } - } + + /* make sure the hash is valid */ + hash_collection hashes; + if (!hashes.from_internal_string(data->_hashdata)) + mame_printf_error("%s: %s has rom '%s' with an invalid hash string '%s'\n", list->file->filename(), swinfo->shortname, data->_name, data->_hashdata); } } } - - software_list_close(list); } - } - return error; -} - -DEVICE_GET_INFO( software_list ) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = 1; break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(software_list_config); break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( software_list ); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_VALIDITY_CHECK: info->p = (void*)DEVICE_VALIDITY_CHECK_NAME( software_list ); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Software lists"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Software lists"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright MESS Team"); break; - } - - if ( state >= DEVINFO_STR_SWLIST_0 && state <= DEVINFO_STR_SWLIST_MAX ) - { - software_list_config *config = (software_list_config *)downcast(device)->inline_config(); - - if ( config->list_name[ state - DEVINFO_STR_SWLIST_0 ] ) - strcpy(info->s, config->list_name[ state - DEVINFO_STR_SWLIST_0 ]); + software_list_close(list); } } - - -DEFINE_LEGACY_DEVICE(SOFTWARE_LIST, software_list); diff -Nru mame-0.144/src/emu/softlist.h mame-0.145/src/emu/softlist.h --- mame-0.144/src/emu/softlist.h 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/softlist.h 2012-02-06 21:30:28.000000000 +0000 @@ -14,6 +14,84 @@ #include "pool.h" + +#define SOFTWARE_SUPPORTED_YES 0 +#define SOFTWARE_SUPPORTED_PARTIAL 1 +#define SOFTWARE_SUPPORTED_NO 2 + +enum softlist_type +{ + SOFTWARE_LIST_ORIGINAL_SYSTEM, + SOFTWARE_LIST_COMPATIBLE_SYSTEM +}; + +#define MCFG_SOFTWARE_LIST_CONFIG(_list,_list_type) \ + software_list_device::static_set_config(*device, _list, _list_type); + +#define MCFG_SOFTWARE_LIST_ADD( _tag, _list ) \ + MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST, 0 ) \ + MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_ORIGINAL_SYSTEM) + +#define MCFG_SOFTWARE_LIST_COMPATIBLE_ADD( _tag, _list ) \ + MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST, 0 ) \ + MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM) + +#define MCFG_SOFTWARE_LIST_MODIFY( _tag, _list ) \ + MCFG_DEVICE_MODIFY( _tag ) \ + MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_ORIGINAL_SYSTEM) + +#define MCFG_SOFTWARE_LIST_COMPATIBLE_MODIFY( _tag, _list ) \ + MCFG_DEVICE_MODIFY( _tag ) \ + MCFG_SOFTWARE_LIST_CONFIG(_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM) + +#define MCFG_SOFTWARE_LIST_FILTER( _tag, _filter ) \ + MCFG_DEVICE_MODIFY( _tag ) \ + software_list_device::static_set_filter(*device, _filter); + + +// ======================> software_list_device + +class software_list_device : public device_t +{ +public: + // construction/destruction + software_list_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // inline configuration helpers + static void static_set_config(device_t &device, const char *list, softlist_type list_type); + static void static_set_filter(device_t &device, const char *filter); + + // getters + const char *list_name() const { return m_list_name; } + softlist_type list_type() const { return m_list_type; } + const char *filter() const { return m_filter; } + + // validation helpers + static void reset_checked_lists() { s_checked_lists.reset(); } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_validity_check(validity_checker &valid) const ATTR_COLD; + + // configuration state + const char * m_list_name; + softlist_type m_list_type; + const char * m_filter; + + // static state + static tagmap_t s_checked_lists; +}; + + +// device type definition +extern const device_type SOFTWARE_LIST; + +// device type iterator +typedef device_type_iterator<&device_creator, software_list_device> software_list_device_iterator; + + + /********************************************************************* Internal structures and XML file handling @@ -49,6 +127,8 @@ feature_list *shared_info; // Here we store info like TV standard compatibility, or add-on requirements, etc. which get inherited // by each part of this software entry (after loading these are stored in partdata->featurelist) UINT32 supported; + int part_entries; + int current_part_entry; software_part *partdata; struct software_info *next; // Used internally }; @@ -64,8 +144,7 @@ }; -typedef struct _parse_state parse_state; -struct _parse_state +struct parse_state { XML_Parser parser; int done; @@ -78,8 +157,7 @@ }; -typedef struct _software_list software_list; -struct _software_list +struct software_list { emu_file *file; object_pool *pool; @@ -89,8 +167,6 @@ struct software_info *current_software_info; software_info *softinfo; const char *look_for; - int part_entries; - int current_part_entry; int rom_entries; int current_rom_entry; void (*error_proc)(const char *message); @@ -99,74 +175,30 @@ /* Handling a software list */ software_list *software_list_open(emu_options &options, const char *listname, int is_preload, void (*error_proc)(const char *message)); -void software_list_close(software_list *swlist); +void software_list_close(const software_list *swlist); software_info *software_list_find(software_list *swlist, const char *look_for, software_info *prev); -const char *software_list_get_description(software_list *swlist); +const char *software_list_get_description(const software_list *swlist); void software_list_parse(software_list *swlist, void (*error_proc)(const char *message), void *param); software_part *software_find_part(software_info *sw, const char *partname, const char *interface_); software_part *software_part_next(software_part *part); +const software_info *software_list_find(const software_list *swlist, const char *look_for, const software_info *prev); +const software_part *software_find_part(const software_info *sw, const char *partname, const char *interface_); +const software_part *software_part_next(const software_part *part); + /* helpers */ const char *software_get_clone(emu_options &options, char *swlist, const char *swname); UINT32 software_get_support(emu_options &options, char *swlist, const char *swname); -const char *software_part_get_feature(software_part *part, const char *feature_name); - -bool load_software_part(emu_options &options, device_image_interface *image, const char *path, software_info **sw_info, software_part **sw_part, char **full_sw_name); - -void software_display_matches(const device_list &devlist, emu_options &options,const char *interface,const char *swname_bckp); - -const char *software_get_default_slot(const device_list &devlist, emu_options &options, const device_image_interface *image, const char *default_card, const char* default_card_slot); - -/********************************************************************* - - Driver software list configuration - -*********************************************************************/ -DECLARE_LEGACY_DEVICE(SOFTWARE_LIST, software_list); - -#define SOFTWARE_SUPPORTED_YES 0 -#define SOFTWARE_SUPPORTED_PARTIAL 1 -#define SOFTWARE_SUPPORTED_NO 2 - - -#define SOFTWARE_LIST_CONFIG_SIZE 10 - - -typedef struct _software_list_config software_list_config; -struct _software_list_config -{ - char *list_name[SOFTWARE_LIST_CONFIG_SIZE]; - UINT32 list_type; -}; - - -#define DEVINFO_STR_SWLIST_0 (DEVINFO_STR_DEVICE_SPECIFIC+0) -#define DEVINFO_STR_SWLIST_MAX (DEVINFO_STR_SWLIST_0 + SOFTWARE_LIST_CONFIG_SIZE - 1) - -#define SOFTWARE_LIST_ORIGINAL_SYSTEM 0 -#define SOFTWARE_LIST_COMPATIBLE_SYSTEM 1 - -#define MCFG_SOFTWARE_LIST_CONFIG(_idx,_list,_list_type) \ - MCFG_DEVICE_CONFIG_DATAPTR_ARRAY(software_list_config, list_name, _idx, _list) \ - MCFG_DEVICE_CONFIG_DATA32(software_list_config, list_type, _list_type) - -#define MCFG_SOFTWARE_LIST_ADD( _tag, _list ) \ - MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST, 0 ) \ - MCFG_SOFTWARE_LIST_CONFIG(0,_list, SOFTWARE_LIST_ORIGINAL_SYSTEM) - +const char *software_part_get_feature(const software_part *part, const char *feature_name); -#define MCFG_SOFTWARE_LIST_COMPATIBLE_ADD( _tag, _list ) \ - MCFG_DEVICE_ADD( _tag, SOFTWARE_LIST, 0 ) \ - MCFG_SOFTWARE_LIST_CONFIG(0,_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM) +bool load_software_part(emu_options &options, device_image_interface *image, const char *path, software_info **sw_info, software_part **sw_part, char **full_sw_name, char**list_name); +void software_display_matches(const machine_config &config, emu_options &options,const char *interface,const char *swname_bckp); -#define MCFG_SOFTWARE_LIST_MODIFY( _tag, _list ) \ - MCFG_DEVICE_MODIFY( _tag ) \ - MCFG_SOFTWARE_LIST_CONFIG(0,_list, SOFTWARE_LIST_ORIGINAL_SYSTEM) +const char *software_get_default_slot(const machine_config &config, emu_options &options, const device_image_interface *image, const char* default_card_slot); -#define MCFG_SOFTWARE_LIST_COMPATIBLE_MODIFY( _tag, _list ) \ - MCFG_DEVICE_MODIFY( _tag ) \ - MCFG_SOFTWARE_LIST_CONFIG(0,_list, SOFTWARE_LIST_COMPATIBLE_SYSTEM) +bool is_software_compatible(const software_part *swpart, const software_list_device *swlist); +bool swinfo_has_multiple_parts(const software_info *swinfo, const char *interface); #endif diff -Nru mame-0.144/src/emu/sound/aica.c mame-0.145/src/emu/sound/aica.c --- mame-0.144/src/emu/sound/aica.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/aica.c 2012-02-06 21:30:27.000000000 +0000 @@ -1285,6 +1285,22 @@ AICA->stream = device->machine().sound().stream_alloc(*device, 0, 2, 44100, AICA, AICA_Update); } + + // save state + { + device->save_item(NAME(AICA->IrqTimA)); + device->save_item(NAME(AICA->IrqTimBC)); + device->save_item(NAME(AICA->IrqMidi)); + device->save_item(NAME(AICA->MidiOutW)); + device->save_item(NAME(AICA->MidiOutR)); + device->save_item(NAME(AICA->MidiStack),16); + device->save_item(NAME(AICA->MidiW)); + device->save_item(NAME(AICA->MidiR)); + device->save_item(NAME(AICA->LPANTABLE),0x20000); + device->save_item(NAME(AICA->RPANTABLE),0x20000); + device->save_item(NAME(AICA->TimPris),3); + device->save_item(NAME(AICA->TimCnt),3); + } } static DEVICE_STOP( aica ) diff -Nru mame-0.144/src/emu/sound/ay8910.c mame-0.145/src/emu/sound/ay8910.c --- mame-0.144/src/emu/sound/ay8910.c 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/ay8910.c 2012-02-06 21:30:27.000000000 +0000 @@ -1116,6 +1116,11 @@ #endif } +WRITE8_DEVICE_HANDLER( ay8910_reset_w ) +{ + ay8910_reset_ym(get_safe_token(device)); +} + static const int mapping8914to8910[16] = { 0, 2, 4, 11, 1, 3, 5, 12, 7, 6, 13, 8, 9, 10, 14, 15 }; READ8_DEVICE_HANDLER( ay8914_r ) @@ -1132,6 +1137,8 @@ ay8910_data_w(device, 0, data & 0xff); } + + DEFINE_LEGACY_SOUND_DEVICE(AY8910, ay8910); DEFINE_LEGACY_SOUND_DEVICE(AY8912, ay8912); DEFINE_LEGACY_SOUND_DEVICE(AY8913, ay8913); diff -Nru mame-0.144/src/emu/sound/ay8910.h mame-0.145/src/emu/sound/ay8910.h --- mame-0.144/src/emu/sound/ay8910.h 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/ay8910.h 2012-02-06 21:30:27.000000000 +0000 @@ -91,6 +91,9 @@ WRITE8_DEVICE_HANDLER( ay8910_address_w ); WRITE8_DEVICE_HANDLER( ay8910_data_w ); +/* /RES */ +WRITE8_DEVICE_HANDLER( ay8910_reset_w ); + /* use this when BC1 == A0; here, BC1=0 selects 'data' and BC1=1 selects 'latch address' */ WRITE8_DEVICE_HANDLER( ay8910_data_address_w ); diff -Nru mame-0.144/src/emu/sound/bsmt2000.c mame-0.145/src/emu/sound/bsmt2000.c --- mame-0.144/src/emu/sound/bsmt2000.c 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/bsmt2000.c 2012-02-06 21:30:27.000000000 +0000 @@ -173,7 +173,7 @@ void bsmt2000_device::device_start() { // find our CPU - m_cpu = downcast(subdevice("bsmt2000")); + m_cpu = subdevice("bsmt2000"); // find our direct access m_direct = &space()->direct(); @@ -182,7 +182,7 @@ // in theory we should generate a 24MHz stream, but that's certainly overkill // internally at 24MHz the max output sample rate is 32kHz // divided by 128 gives us 6x the max output rate which is plenty for oversampling - m_stream = machine().sound().stream_alloc(*this, 0, 2, clock() / 128); + m_stream = stream_alloc(0, 2, clock() / 128); // register for save states save_item(NAME(m_register_select)); diff -Nru mame-0.144/src/emu/sound/cdda.c mame-0.145/src/emu/sound/cdda.c --- mame-0.144/src/emu/sound/cdda.c 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/cdda.c 2012-02-06 21:30:27.000000000 +0000 @@ -90,9 +90,8 @@ device_t *cdda_from_cdrom(running_machine &machine, void *file) { - device_sound_interface *sound = NULL; - - for (bool gotone = machine.devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator iter(machine.root_device()); + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) if (sound->device().type() == CDDA) { cdda_info *info = get_safe_token(*sound); diff -Nru mame-0.144/src/emu/sound/cdp1864.c mame-0.145/src/emu/sound/cdp1864.c --- mame-0.144/src/emu/sound/cdp1864.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/cdp1864.c 2012-02-06 21:30:26.000000000 +0000 @@ -169,7 +169,7 @@ // find devices m_cpu = machine().device(m_cpu_tag); m_screen = machine().device(m_screen_tag); - m_bitmap = auto_bitmap_alloc(machine(), m_screen->width(), m_screen->height(), m_screen->format()); + m_screen->register_screen_bitmap(m_bitmap); // register for state saving save_item(NAME(m_disp)); @@ -422,7 +422,7 @@ color = (gdata << 2) | (bdata << 1) | rdata; } - *BITMAP_ADDR16(m_bitmap, y, sx + x) = color; + m_bitmap.pix16(y, sx + x) = color; data <<= 1; } @@ -470,15 +470,16 @@ // update_screen - //------------------------------------------------- -void cdp1864_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 cdp1864_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_disp) { copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); - bitmap_fill(m_bitmap, cliprect, CDP1864_BACKGROUND_COLOR_SEQUENCE[m_bgcolor] + 8); + m_bitmap.fill(CDP1864_BACKGROUND_COLOR_SEQUENCE[m_bgcolor] + 8, cliprect); } else { - bitmap_fill(bitmap, cliprect, get_black_pen(machine())); + bitmap.fill(get_black_pen(machine()), cliprect); } + return 0; } diff -Nru mame-0.144/src/emu/sound/cdp1864.h mame-0.145/src/emu/sound/cdp1864.h --- mame-0.144/src/emu/sound/cdp1864.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/cdp1864.h 2012-02-06 21:30:26.000000000 +0000 @@ -87,7 +87,6 @@ #define MCFG_CDP1864_SCREEN_ADD(_tag, _clock) \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1864_SCREEN_WIDTH, CDP1864_HBLANK_END, CDP1864_HBLANK_START, CDP1864_TOTAL_SCANLINES, CDP1864_SCANLINE_VBLANK_END, CDP1864_SCANLINE_VBLANK_START) @@ -156,7 +155,7 @@ DECLARE_WRITE_LINE_MEMBER( aoe_w ); DECLARE_WRITE_LINE_MEMBER( evs_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -187,7 +186,7 @@ cpu_device *m_cpu; screen_device *m_screen; // screen - bitmap_t *m_bitmap; // bitmap + bitmap_ind16 m_bitmap; // bitmap sound_stream *m_stream; // sound output // video state diff -Nru mame-0.144/src/emu/sound/cdp1869.c mame-0.145/src/emu/sound/cdp1869.c --- mame-0.144/src/emu/sound/cdp1869.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/cdp1869.c 2012-02-06 21:30:27.000000000 +0000 @@ -539,7 +539,7 @@ // draw_line - draw character line //------------------------------------------------- -void cdp1869_device::draw_line(bitmap_t *bitmap, const rectangle *rect, int x, int y, UINT8 data, int color) +void cdp1869_device::draw_line(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT8 data, int color) { int i; @@ -549,20 +549,20 @@ { if (data & 0x80) { - *BITMAP_ADDR16(bitmap, y, x) = color; + bitmap.pix16(y, x) = color; if (!m_fresvert) { - *BITMAP_ADDR16(bitmap, y + 1, x) = color; + bitmap.pix16(y + 1, x) = color; } if (!m_freshorz) { - *BITMAP_ADDR16(bitmap, y, x + 1) = color; + bitmap.pix16(y, x + 1) = color; if (!m_fresvert) { - *BITMAP_ADDR16(bitmap, y + 1, x + 1) = color; + bitmap.pix16(y + 1, x + 1) = color; } } } @@ -583,7 +583,7 @@ // draw_char - draw character //------------------------------------------------- -void cdp1869_device::draw_char(bitmap_t *bitmap, const rectangle *rect, int x, int y, UINT16 pma) +void cdp1869_device::draw_char(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT16 pma) { UINT8 pmd = read_page_ram_byte(pma); @@ -597,7 +597,7 @@ int color = get_pen(ccb0, ccb1, pcb); - draw_line(bitmap, rect, rect->min_x + x, rect->min_y + y, data, color); + draw_line(bitmap, rect, rect.min_x + x, rect.min_y + y, data, color); y++; @@ -907,7 +907,7 @@ // update_screen - update screen //------------------------------------------------- -void cdp1869_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 cdp1869_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { rectangle screen_rect, outer; @@ -934,8 +934,8 @@ screen_rect.max_y = CDP1869_SCANLINE_DISPLAY_END_PAL - 1; } - sect_rect(&outer, cliprect); - bitmap_fill(bitmap, &outer, m_bkg); + outer &= cliprect; + bitmap.fill(m_bkg, outer); if (!m_dispoff) { @@ -953,7 +953,7 @@ } int cols = m_freshorz ? CDP1869_COLUMNS_FULL : CDP1869_COLUMNS_HALF; - int rows = (screen_rect.max_y - screen_rect.min_y + 1) / height; + int rows = screen_rect.height() / height; UINT16 pmemsize = get_pmemsize(cols, rows); UINT16 addr = m_hma; @@ -965,7 +965,7 @@ int x = sx * width; int y = sy * height; - draw_char(bitmap, &screen_rect, x, y, addr); + draw_char(bitmap, screen_rect, x, y, addr); addr++; @@ -973,4 +973,5 @@ } } } + return 0; } diff -Nru mame-0.144/src/emu/sound/cdp1869.h mame-0.145/src/emu/sound/cdp1869.h --- mame-0.144/src/emu/sound/cdp1869.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/cdp1869.h 2012-02-06 21:30:27.000000000 +0000 @@ -142,15 +142,15 @@ MCFG_DEVICE_CONFIG(_config) \ MCFG_DEVICE_ADDRESS_MAP(AS_0, _map) -#define MCFG_CDP1869_SCREEN_PAL_ADD(_tag, _clock) \ +#define MCFG_CDP1869_SCREEN_PAL_ADD(_cdptag, _tag, _clock) \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ + MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1869_device, screen_update) \ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1869_SCREEN_WIDTH, CDP1869_HBLANK_END, CDP1869_HBLANK_START, CDP1869_TOTAL_SCANLINES_PAL, CDP1869_SCANLINE_VBLANK_END_PAL, CDP1869_SCANLINE_VBLANK_START_PAL) \ MCFG_PALETTE_LENGTH(8+64) -#define MCFG_CDP1869_SCREEN_NTSC_ADD(_tag, _clock) \ +#define MCFG_CDP1869_SCREEN_NTSC_ADD(_cdptag, _tag, _clock) \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ + MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1869_device, screen_update) \ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1869_SCREEN_WIDTH, CDP1869_HBLANK_END, CDP1869_HBLANK_START, CDP1869_TOTAL_SCANLINES_NTSC, CDP1869_SCANLINE_VBLANK_END_NTSC, CDP1869_SCANLINE_VBLANK_START_NTSC) \ MCFG_PALETTE_LENGTH(8+64) @@ -231,7 +231,7 @@ DECLARE_READ_LINE_MEMBER( predisplay_r ); DECLARE_READ_LINE_MEMBER( pal_ntsc_r ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -260,8 +260,8 @@ inline int get_pen(int ccb0, int ccb1, int pcb); void initialize_palette(); - void draw_line(bitmap_t *bitmap, const rectangle *rect, int x, int y, UINT8 data, int color); - void draw_char(bitmap_t *bitmap, const rectangle *rect, int x, int y, UINT16 pma); + void draw_line(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT8 data, int color); + void draw_char(bitmap_ind16 &bitmap, const rectangle &rect, int x, int y, UINT16 pma); private: devcb_resolved_read_line m_in_pal_ntsc_func; diff -Nru mame-0.144/src/emu/sound/dac.c mame-0.145/src/emu/sound/dac.c --- mame-0.144/src/emu/sound/dac.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/dac.c 2012-02-06 21:30:26.000000000 +0000 @@ -91,6 +91,13 @@ } +INT16 dac_output(device_t *device) +{ + dac_state *info = get_safe_token(device); + return info->output; +} + + static void DAC_build_voltable(dac_state *info) { int i; diff -Nru mame-0.144/src/emu/sound/dac.h mame-0.145/src/emu/sound/dac.h --- mame-0.144/src/emu/sound/dac.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/dac.h 2012-02-06 21:30:26.000000000 +0000 @@ -9,6 +9,7 @@ void dac_signed_data_w(device_t *device, UINT8 data) ATTR_NONNULL(1); void dac_data_16_w(device_t *device, UINT16 data) ATTR_NONNULL(1); void dac_signed_data_16_w(device_t *device, UINT16 data) ATTR_NONNULL(1); +INT16 dac_output(device_t *device); WRITE8_DEVICE_HANDLER( dac_w ); WRITE8_DEVICE_HANDLER( dac_signed_w ); diff -Nru mame-0.144/src/emu/sound/disc_inp.c mame-0.145/src/emu/sound/disc_inp.c --- mame-0.144/src/emu/sound/disc_inp.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/disc_inp.c 2012-02-06 21:30:27.000000000 +0000 @@ -75,7 +75,8 @@ { double min, max; - m_port = m_device->machine().m_portlist.find((const char *)this->custom_data()); + astring fulltag; + m_port = m_device->machine().m_portlist.find(m_device->siblingtag(fulltag, (const char *)this->custom_data()).cstr()); if (m_port == NULL) fatalerror("DISCRETE_ADJUSTMENT - NODE_%d has invalid tag", this->index()); diff -Nru mame-0.144/src/emu/sound/discrete.c mame-0.145/src/emu/sound/discrete.c --- mame-0.144/src/emu/sound/discrete.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/discrete.c 2012-02-06 21:30:26.000000000 +0000 @@ -541,7 +541,7 @@ } } for_each (int *, i, &deletethem) - block_list.delete(*i); + block_list.remove(*i); } else { diff -Nru mame-0.144/src/emu/sound/discrete.h mame-0.145/src/emu/sound/discrete.h --- mame-0.144/src/emu/sound/discrete.h 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/discrete.h 2012-02-06 21:30:26.000000000 +0000 @@ -3810,7 +3810,7 @@ m_count++; return &m_arr[m_count-1]; } - inline void delete(int index) + inline void remove(int index) { for (int i=index+1; i < m_count; i++) m_arr[i-1] = m_arr[i]; diff -Nru mame-0.144/src/emu/sound/es5503.c mame-0.145/src/emu/sound/es5503.c --- mame-0.144/src/emu/sound/es5503.c 2012-01-13 15:34:26.000000000 +0000 +++ mame-0.145/src/emu/sound/es5503.c 2012-02-06 21:30:27.000000000 +0000 @@ -266,9 +266,16 @@ for (int osc = 0; osc < 32; osc++) { + oscillators[osc].freq = 0; + oscillators[osc].wtsize = 0; + oscillators[osc].control = 0; + oscillators[osc].vol = 0; oscillators[osc].data = 0x80; - oscillators[osc].irqpend = 0; + oscillators[osc].wavetblpointer = 0; + oscillators[osc].wavetblsize = 0; + oscillators[osc].resolution = 0; oscillators[osc].accumulator = 0; + oscillators[osc].irqpend = 0; } oscsenabled = 1; diff -Nru mame-0.144/src/emu/sound/mos6560.c mame-0.145/src/emu/sound/mos6560.c --- mame-0.144/src/emu/sound/mos6560.c 2012-01-13 15:34:27.000000000 +0000 +++ mame-0.145/src/emu/sound/mos6560.c 2012-02-06 21:30:27.000000000 +0000 @@ -72,7 +72,7 @@ UINT8 reg[16]; - bitmap_t *bitmap; + bitmap_ind16 *bitmap; int rasterline, lastline; double lightpenreadtime; @@ -215,14 +215,14 @@ for (y = ybegin; y <= yend; y++) { code = mos6560->dma_read(device->machine(), (mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff); - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 0) = color[code >> 7]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 1) = color[(code >> 6) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 2) = color[(code >> 5) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 3) = color[(code >> 4) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 4) = color[(code >> 3) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 5) = color[(code >> 2) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 6) = color[(code >> 1) & 1]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 7) = color[code & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 0) = color[code >> 7]; + mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[(code >> 6) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 2) = color[(code >> 5) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 3) = color[(code >> 4) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 4) = color[(code >> 3) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 5) = color[(code >> 2) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 6) = color[(code >> 1) & 1]; + mos6560->bitmap->pix16(y + yoff, xoff + 7) = color[code & 1]; } } @@ -239,14 +239,14 @@ for (y = ybegin; y <= yend; y++) { code = mos6560->dma_read(device->machine(), (mos6560->chargenaddr + ch * mos6560->charheight + y) & 0x3fff); - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 0) = - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 1) = color[code >> 6]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 2) = - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 3) = color[(code >> 4) & 3]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 4) = - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 5) = color[(code >> 2) & 3]; - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 6) = - *BITMAP_ADDR16(mos6560->bitmap, y + yoff, xoff + 7) = color[code & 3]; + mos6560->bitmap->pix16(y + yoff, xoff + 0) = + mos6560->bitmap->pix16(y + yoff, xoff + 1) = color[code >> 6]; + mos6560->bitmap->pix16(y + yoff, xoff + 2) = + mos6560->bitmap->pix16(y + yoff, xoff + 3) = color[(code >> 4) & 3]; + mos6560->bitmap->pix16(y + yoff, xoff + 4) = + mos6560->bitmap->pix16(y + yoff, xoff + 5) = color[(code >> 2) & 3]; + mos6560->bitmap->pix16(y + yoff, xoff + 6) = + mos6560->bitmap->pix16(y + yoff, xoff + 7) = color[code & 3]; } } @@ -269,7 +269,7 @@ for (line = first; (line < mos6560->ypos) && (line < last); line++) { for (j = 0; j < mos6560->total_xsize; j++) - *BITMAP_ADDR16(mos6560->bitmap, line, j) = mos6560->framecolor; + mos6560->bitmap->pix16(line, j) = mos6560->framecolor; } for (vline = line - mos6560->ypos; (line < last) && (line < mos6560->ypos + mos6560->ysize);) @@ -293,7 +293,7 @@ { for (i = ybegin; i <= yend; i++) for (j = 0; j < mos6560->xpos; j++) - *BITMAP_ADDR16(mos6560->bitmap, yoff + i, j) = mos6560->framecolor; + mos6560->bitmap->pix16(yoff + i, j) = mos6560->framecolor; } for (xoff = mos6560->xpos; (xoff < mos6560->xpos + mos6560->xsize) && (xoff < mos6560->total_xsize); xoff += 8, offs++) @@ -339,7 +339,7 @@ { for (i = ybegin; i <= yend; i++) for (j = xoff; j < mos6560->total_xsize; j++) - *BITMAP_ADDR16(mos6560->bitmap, yoff + i, j) = mos6560->framecolor; + mos6560->bitmap->pix16(yoff + i, j) = mos6560->framecolor; } if (mos6560->matrix8x16) @@ -356,7 +356,7 @@ for (; line < last; line++) for (j = 0; j < mos6560->total_xsize; j++) - *BITMAP_ADDR16(mos6560->bitmap, line, j) = mos6560->framecolor; + mos6560->bitmap->pix16(line, j) = mos6560->framecolor; } @@ -509,11 +509,11 @@ main screen bitmap -------------------------------------------------*/ -UINT32 mos6560_video_update( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mos6560_state *mos6560 = get_safe_token(device); - copybitmap(bitmap, mos6560->bitmap, 0, 0, 0, 0, cliprect); + copybitmap(bitmap, *mos6560->bitmap, 0, 0, 0, 0, cliprect); return 0; } @@ -808,7 +808,7 @@ mos6560->type = intf->type; - mos6560->bitmap = auto_bitmap_alloc(device->machine(), width, height, BITMAP_FORMAT_INDEXED16); + mos6560->bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height); assert(intf->dma_read != NULL); assert(intf->dma_read_color != NULL); diff -Nru mame-0.144/src/emu/sound/mos6560.h mame-0.145/src/emu/sound/mos6560.h --- mame-0.144/src/emu/sound/mos6560.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/mos6560.h 2012-02-06 21:30:27.000000000 +0000 @@ -107,7 +107,7 @@ READ8_DEVICE_HANDLER( mos6560_port_r ); void mos6560_raster_interrupt_gen( device_t *device ); -UINT32 mos6560_video_update( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ); +UINT32 mos6560_video_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ); #endif /* __MOS6560_H__ */ diff -Nru mame-0.144/src/emu/sound/okim6295.c mame-0.145/src/emu/sound/okim6295.c --- mame-0.144/src/emu/sound/okim6295.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/okim6295.c 2012-02-06 21:30:27.000000000 +0000 @@ -131,6 +131,8 @@ save_item(NAME(m_command)); save_item(NAME(m_bank_offs)); + save_item(NAME(m_pin7_state)); + for (int voicenum = 0; voicenum < OKIM6295_VOICES; voicenum++) { save_item(NAME(m_voice[voicenum].m_playing), voicenum); @@ -162,7 +164,8 @@ void okim6295_device::device_post_load() { - set_bank_base(m_bank_offs); + set_bank_base(m_bank_offs, true); + device_clock_changed(); } @@ -210,10 +213,13 @@ // assumes multiple 256k banks //------------------------------------------------- -void okim6295_device::set_bank_base(offs_t base) +void okim6295_device::set_bank_base(offs_t base, bool bDontUpdateStream) { - // flush out anything pending - m_stream->update(); + // flush out anything pending (but not on e.g. a state load) + if (!bDontUpdateStream) + { + m_stream->update(); + } // if we are setting a non-zero base, and we have no bank, allocate one if (!m_bank_installed && base != 0) diff -Nru mame-0.144/src/emu/sound/okim6295.h mame-0.145/src/emu/sound/okim6295.h --- mame-0.144/src/emu/sound/okim6295.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/okim6295.h 2012-02-06 21:30:27.000000000 +0000 @@ -86,7 +86,7 @@ static void static_set_pin7(device_t &device, int pin7); // runtime configuration - void set_bank_base(offs_t base); + void set_bank_base(offs_t base, bool bDontUpdateStream = false); void set_pin7(int pin7); UINT8 read_status(); diff -Nru mame-0.144/src/emu/sound/rf5c68.c mame-0.145/src/emu/sound/rf5c68.c --- mame-0.144/src/emu/sound/rf5c68.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/rf5c68.c 2012-02-06 21:30:27.000000000 +0000 @@ -143,6 +143,7 @@ /* allocate memory for the chip */ rf5c68_state *chip = get_safe_token(device); + memset(chip->data, 0xff, sizeof(chip->data)); /* allocate the stream */ chip->stream = device->machine().sound().stream_alloc(*device, 0, 2, device->clock() / 384, chip, rf5c68_update); diff -Nru mame-0.144/src/emu/sound/s14001a.c mame-0.145/src/emu/sound/s14001a.c --- mame-0.144/src/emu/sound/s14001a.c 2012-01-13 15:34:27.000000000 +0000 +++ mame-0.145/src/emu/sound/s14001a.c 2012-02-06 21:30:27.000000000 +0000 @@ -22,7 +22,7 @@ 1.31 fix a minor bug with the dac range. wolfpack clips again, and I'm almost sure its an encoding error on the original speech - LN (0.125u9) 1.31a Add chip pinout and other notes - LN (0.128u4) 1.31b slight update to notes to clarify input bus stuff, mostly finish the state map in the comments - LN - 1.31c remove usage of deprecat.h - AtariAce (0.128u5) + 1.31c remove usage of deprecat lib - AtariAce (0.128u5) 1.32 fix the squealing noise using a define; it isn't accurate to the chip exactly, but there are other issues which need to be fixed too. see TODO. - LN (0.136u2) TODO: diff -Nru mame-0.144/src/emu/sound/samples.c mame-0.145/src/emu/sound/samples.c --- mame-0.144/src/emu/sound/samples.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/samples.c 2012-02-06 21:30:26.000000000 +0000 @@ -1,7 +1,22 @@ +/* samples.c + + Playback of pre-recorded samples. Used for high-level simulation of discrete sound circuits + where proper low-level simulation isn't available. Also used for tape loops and similar. + + Current limitations + - Only supports single channel samples! + + Considerations + - Maybe this should be part of the presentation layer (artwork etc.) with samples specified + in .lay files instead of in drivers? + +*/ + + #include "emu.h" #include "emuopts.h" #include "samples.h" - +#include "../../lib/libflac/include/flac/all.h" typedef struct _sample_channel sample_channel; struct _sample_channel @@ -43,132 +58,316 @@ #define FRAC_MASK (FRAC_ONE - 1) #define MAX_CHANNELS 100 +struct flac_reader +{ + UINT8* rawdata; + INT16* write_data; + int position; + int length; + int decoded_size; + int sample_rate; + int channels; + int bits_per_sample; + int total_samples; + int write_position; +} flacread; + +static flac_reader* flacreadptr; + +void my_error_callback(const FLAC__StreamDecoder * decoder, FLAC__StreamDecoderErrorStatus status, void * client_data) +{ + fatalerror("FLAC error Callback\n"); +} + +void my_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + + flac_reader* flacrd = ((flac_reader*)client_data); + + if (metadata->type==0) + { + const FLAC__StreamMetadata_StreamInfo *streaminfo = &(metadata->data.stream_info); + + flacrd->sample_rate = streaminfo->sample_rate; + flacrd->channels = streaminfo->channels; + flacrd->bits_per_sample = streaminfo->bits_per_sample; + flacrd->total_samples = streaminfo->total_samples; + } +} + + + + +FLAC__StreamDecoderReadStatus my_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + flac_reader* flacrd = ((flac_reader*)client_data); + + if(*bytes > 0) + { + if (*bytes <= flacrd->length) + { + memcpy(buffer, flacrd->rawdata+flacrd->position, *bytes); + flacrd->position+=*bytes; + flacrd->length-=*bytes; + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + { + memcpy(buffer, flacrd->rawdata+flacrd->position, flacrd->length); + flacrd->position+= flacrd->length; + flacrd->length = 0; + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + } + else + { + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } + + if ( flacrd->length==0) + { + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + +} + +FLAC__StreamDecoderWriteStatus my_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[], void *client_data) +{ + flac_reader* flacrd = ((flac_reader*)client_data); + + flacrd->decoded_size += frame->header.blocksize; + + for (int i=0;iheader.blocksize;i++) + { + flacrd->write_data[i+flacrd->write_position] = buffer[0][i]; + } + + flacrd->write_position += frame->header.blocksize; + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + + + + + /*------------------------------------------------- read_wav_sample - read a WAV file as a sample -------------------------------------------------*/ -static int read_wav_sample(running_machine &machine, emu_file &file, loaded_sample *sample) +static int read_wav_sample(running_machine &machine, emu_file &file, loaded_sample *sample, char* filename) { unsigned long offset = 0; UINT32 length, rate, filesize; UINT16 bits, temp16; char buf[32]; UINT32 sindex; + int type = 0; /* read the core header and make sure it's a WAVE file */ offset += file.read(buf, 4); if (offset < 4) + { + mame_printf_warning("unable to read %s, 0-byte file?\n", filename); return 0; - if (memcmp(&buf[0], "RIFF", 4) != 0) - return 0; - - /* get the total size */ - offset += file.read(&filesize, 4); - if (offset < 8) - return 0; - filesize = LITTLE_ENDIANIZE_INT32(filesize); - - /* read the RIFF file type and make sure it's a WAVE file */ - offset += file.read(buf, 4); - if (offset < 12) - return 0; - if (memcmp(&buf[0], "WAVE", 4) != 0) + } + if (memcmp(&buf[0], "RIFF", 4) == 0) + type = 1; + else if (memcmp(&buf[0], "fLaC", 4) == 0) + type = 2; + else + { + mame_printf_warning("unable to read %s, corrupt file?\n", filename); return 0; + } - /* seek until we find a format tag */ - while (1) + if (type==1) { + /* get the total size */ + offset += file.read(&filesize, 4); + if (offset < 8) + return 0; + filesize = LITTLE_ENDIANIZE_INT32(filesize); + + /* read the RIFF file type and make sure it's a WAVE file */ offset += file.read(buf, 4); - offset += file.read(&length, 4); - length = LITTLE_ENDIANIZE_INT32(length); - if (memcmp(&buf[0], "fmt ", 4) == 0) - break; - - /* seek to the next block */ - file.seek(length, SEEK_CUR); - offset += length; - if (offset >= filesize) + if (offset < 12) + return 0; + if (memcmp(&buf[0], "WAVE", 4) != 0) return 0; - } - /* read the format -- make sure it is PCM */ - offset += file.read(&temp16, 2); - temp16 = LITTLE_ENDIANIZE_INT16(temp16); - if (temp16 != 1) - return 0; + /* seek until we find a format tag */ + while (1) + { + offset += file.read(buf, 4); + offset += file.read(&length, 4); + length = LITTLE_ENDIANIZE_INT32(length); + if (memcmp(&buf[0], "fmt ", 4) == 0) + break; + + /* seek to the next block */ + file.seek(length, SEEK_CUR); + offset += length; + if (offset >= filesize) + return 0; + } - /* number of channels -- only mono is supported */ - offset += file.read(&temp16, 2); - temp16 = LITTLE_ENDIANIZE_INT16(temp16); - if (temp16 != 1) - return 0; + /* read the format -- make sure it is PCM */ + offset += file.read(&temp16, 2); + temp16 = LITTLE_ENDIANIZE_INT16(temp16); + if (temp16 != 1) + return 0; - /* sample rate */ - offset += file.read(&rate, 4); - rate = LITTLE_ENDIANIZE_INT32(rate); - - /* bytes/second and block alignment are ignored */ - offset += file.read(buf, 6); - - /* bits/sample */ - offset += file.read(&bits, 2); - bits = LITTLE_ENDIANIZE_INT16(bits); - if (bits != 8 && bits != 16) - return 0; + /* number of channels -- only mono is supported */ + offset += file.read(&temp16, 2); + temp16 = LITTLE_ENDIANIZE_INT16(temp16); + if (temp16 != 1) + return 0; - /* seek past any extra data */ - file.seek(length - 16, SEEK_CUR); - offset += length - 16; + /* sample rate */ + offset += file.read(&rate, 4); + rate = LITTLE_ENDIANIZE_INT32(rate); + + /* bytes/second and block alignment are ignored */ + offset += file.read(buf, 6); + + /* bits/sample */ + offset += file.read(&bits, 2); + bits = LITTLE_ENDIANIZE_INT16(bits); + if (bits != 8 && bits != 16) + return 0; - /* seek until we find a data tag */ - while (1) - { - offset += file.read(buf, 4); - offset += file.read(&length, 4); - length = LITTLE_ENDIANIZE_INT32(length); - if (memcmp(&buf[0], "data", 4) == 0) - break; - - /* seek to the next block */ - file.seek(length, SEEK_CUR); - offset += length; - if (offset >= filesize) + /* seek past any extra data */ + file.seek(length - 16, SEEK_CUR); + offset += length - 16; + + /* seek until we find a data tag */ + while (1) + { + offset += file.read(buf, 4); + offset += file.read(&length, 4); + length = LITTLE_ENDIANIZE_INT32(length); + if (memcmp(&buf[0], "data", 4) == 0) + break; + + /* seek to the next block */ + file.seek(length, SEEK_CUR); + offset += length; + if (offset >= filesize) + return 0; + } + + /* if there was a 0 length data block, we're done */ + if (length == 0) return 0; - } - /* if there was a 0 length data block, we're done */ - if (length == 0) - return 0; + /* fill in the sample data */ + sample->length = length; + sample->frequency = rate; + + /* read the data in */ + if (bits == 8) + { + unsigned char *tempptr; + int sindex; - /* fill in the sample data */ - sample->length = length; - sample->frequency = rate; - - /* read the data in */ - if (bits == 8) - { - unsigned char *tempptr; - int sindex; - - sample->data = auto_alloc_array(machine, INT16, length); - file.read(sample->data, length); - - /* convert 8-bit data to signed samples */ - tempptr = (unsigned char *)sample->data; - for (sindex = length - 1; sindex >= 0; sindex--) - sample->data[sindex] = (INT8)(tempptr[sindex] ^ 0x80) * 256; + sample->data = auto_alloc_array(machine, INT16, length); + file.read(sample->data, length); + + /* convert 8-bit data to signed samples */ + tempptr = (unsigned char *)sample->data; + for (sindex = length - 1; sindex >= 0; sindex--) + sample->data[sindex] = (INT8)(tempptr[sindex] ^ 0x80) * 256; + + } + else + { + /* 16-bit data is fine as-is */ + sample->data = auto_alloc_array(machine, INT16, length/2); + file.read(sample->data, length); + + sample->length /= 2; + if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE) + for (sindex = 0; sindex < sample->length; sindex++) + sample->data[sindex] = LITTLE_ENDIANIZE_INT16(sample->data[sindex]); + } } else { - /* 16-bit data is fine as-is */ - sample->data = auto_alloc_array(machine, INT16, length/2); - file.read(sample->data, length); - sample->length /= 2; - if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE) - for (sindex = 0; sindex < sample->length; sindex++) - sample->data[sindex] = LITTLE_ENDIANIZE_INT16(sample->data[sindex]); + int length; + + file.seek(0, SEEK_END); + length = file.tell(); + file.seek(0, 0); + + flacread.rawdata = auto_alloc_array(machine, UINT8, length); + flacread.length = length; + flacread.position = 0; + flacread.decoded_size = 0; + + flacreadptr = &flacread; + + file.read(flacread.rawdata, length); + + FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); + + if (!decoder) + fatalerror("Fail FLAC__stream_decoder_new\n"); + + if(FLAC__stream_decoder_init_stream( + decoder, + my_read_callback, + NULL, //my_seek_callback, // or NULL + NULL, //my_tell_callback, // or NULL + NULL, //my_length_callback, // or NULL + NULL, //my_eof_callback, // or NULL + my_write_callback, + my_metadata_callback, //my_metadata_callback, // or NULL + my_error_callback, + (void*)flacreadptr /*my_client_data*/ ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + fatalerror("Fail FLAC__stream_decoder_init_stream\n"); + + if (FLAC__stream_decoder_process_until_end_of_metadata(decoder) != FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM) + fatalerror("Fail FLAC__stream_decoder_process_until_end_of_metadata\n"); + + if (flacread.channels != 1) // only Mono supported + fatalerror("Only MONO samples are supported\n"); + + + sample->data = auto_alloc_array(machine, INT16, flacread.total_samples*2); + flacread.write_position = 0; + flacread.write_data = sample->data; + + if (FLAC__stream_decoder_process_until_end_of_stream (decoder) != FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM) + { + fatalerror("Fail FLAC__stream_decoder_process_until_end_of_stream\n"); + } + + if (FLAC__stream_decoder_finish (decoder) != true) + fatalerror("Fail FLAC__stream_decoder_finish\n"); + + FLAC__stream_decoder_delete(decoder); + + /* fill in the sample data */ + + sample->frequency = flacread.sample_rate; + sample->length = flacread.total_samples * (flacread.bits_per_sample/8); + + if (flacread.bits_per_sample == 8) + { + for (sindex = 0; sindex <= sample->length; sindex++) + sample->data[sindex] = ((sample->data[sindex])&0xff)*256; + } + else // don't need to process 16-bit samples? + { + sample->length = sample->length /2; //?? + } } + return 1; } @@ -207,13 +406,39 @@ if (samplenames[i+skipfirst][0]) { emu_file file(machine.options().sample_path(), OPEN_FLAG_READ); + file_error filerr = FILERR_NOT_FOUND; + + char filename[512]; + + if (filerr != FILERR_NONE) + { + // first try opening samples as .flac + sprintf(filename, "%s.flac", samplenames[i+skipfirst]); + + filerr = file.open(basename, PATH_SEPARATOR, filename); + // try parent sample set + if (filerr != FILERR_NONE && skipfirst) + filerr = file.open(samplenames[0] + 1, PATH_SEPARATOR, filename); + } + + if (filerr != FILERR_NONE) + { + // .wav fallback + sprintf(filename, "%s.wav", samplenames[i+skipfirst]); + + filerr = file.open(basename, PATH_SEPARATOR, filename); + // try parent sample set + if (filerr != FILERR_NONE && skipfirst) + filerr = file.open(samplenames[0] + 1, PATH_SEPARATOR, filename); + } - file_error filerr = file.open(basename, PATH_SEPARATOR, samplenames[i+skipfirst]); - if (filerr != FILERR_NONE && skipfirst) - filerr = file.open(samplenames[0] + 1, PATH_SEPARATOR, samplenames[i+skipfirst]); if (filerr == FILERR_NONE) - read_wav_sample(machine, file, &samples->sample[i]); + read_wav_sample(machine, file, &samples->sample[i], filename); + + if (filerr == FILERR_NOT_FOUND) + mame_printf_warning("sample '%s' NOT FOUND\n", samplenames[i+skipfirst]); + } return samples; diff -Nru mame-0.144/src/emu/sound/samples.h mame-0.145/src/emu/sound/samples.h --- mame-0.144/src/emu/sound/samples.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/samples.h 2012-02-06 21:30:26.000000000 +0000 @@ -46,4 +46,6 @@ DECLARE_LEGACY_SOUND_DEVICE(SAMPLES, samples); +typedef device_type_iterator<&legacy_device_creator, samples_device> samples_device_iterator; + #endif /* __SAMPLES_H__ */ diff -Nru mame-0.144/src/emu/sound/scsp.c mame-0.145/src/emu/sound/scsp.c --- mame-0.144/src/emu/sound/scsp.c 2012-01-13 15:34:27.000000000 +0000 +++ mame-0.145/src/emu/sound/scsp.c 2012-02-06 21:30:27.000000000 +0000 @@ -535,7 +535,7 @@ scsp->MidiOutR=scsp->MidiOutW=0; // get SCSP RAM - if (strcmp(device->tag(), "scsp") == 0 || strcmp(device->tag(), "scsp1") == 0) + if (strcmp(device->tag(), ":scsp") == 0 || strcmp(device->tag(), ":scsp1") == 0) { scsp->Master=1; } diff -Nru mame-0.144/src/emu/sound/sn76477.c mame-0.145/src/emu/sound/sn76477.c --- mame-0.144/src/emu/sound/sn76477.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/sn76477.c 2012-02-06 21:30:26.000000000 +0000 @@ -68,7 +68,7 @@ #define LOG(n,x) do { if (VERBOSE >= (n)) logerror x; } while (0) #define CHECK_CHIP_NUM assert(sn != NULL) -#define CHECK_CHIP_NUM_AND_BOOLEAN CHECK_CHIP_NUM; assert((data & 0x01) == data) +#define CHECK_CHIP_NUM_AND_BOOLEAN CHECK_CHIP_NUM; assert((state & 0x01) == state) #define CHECK_CHIP_NUM_AND_POSITIVE CHECK_CHIP_NUM; assert(data >= 0.0) #define CHECK_CHIP_NUM_AND_VOLTAGE CHECK_CHIP_NUM; assert((data >= 0.0) && (data <= 5.0)) #define CHECK_CHIP_NUM_AND_CAP_VOLTAGE CHECK_CHIP_NUM; assert(((data >= 0.0) && (data <= 5.0)) || (data == SN76477_EXTERNAL_VOLTAGE_DISCONNECT)) @@ -999,14 +999,14 @@ } -void sn76477_enable_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_enable_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - SN76477_test_enable_w(sn, data); + SN76477_test_enable_w(sn, state); #endif } @@ -1024,18 +1024,18 @@ } -void sn76477_mixer_a_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_a_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != ((sn->mixer_mode >> 0) & 0x01)) + if (state != ((sn->mixer_mode >> 0) & 0x01)) { sn->channel->update(); - _SN76477_mixer_a_w(sn, data); + _SN76477_mixer_a_w(sn, state); log_mixer_mode(sn); } @@ -1049,18 +1049,18 @@ } -void sn76477_mixer_b_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_b_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != ((sn->mixer_mode >> 1) & 0x01)) + if (state != ((sn->mixer_mode >> 1) & 0x01)) { sn->channel->update(); - _SN76477_mixer_b_w(sn, data); + _SN76477_mixer_b_w(sn, state); log_mixer_mode(sn); } @@ -1074,18 +1074,18 @@ } -void sn76477_mixer_c_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_c_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != ((sn->mixer_mode >> 2) & 0x01)) + if (state != ((sn->mixer_mode >> 2) & 0x01)) { sn->channel->update(); - _SN76477_mixer_c_w(sn, data); + _SN76477_mixer_c_w(sn, state); log_mixer_mode(sn); } @@ -1106,18 +1106,18 @@ } -void sn76477_envelope_1_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_1_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != ((sn->envelope_mode >> 0) & 0x01)) + if (state != ((sn->envelope_mode >> 0) & 0x01)) { sn->channel->update(); - _SN76477_envelope_1_w(sn, data); + _SN76477_envelope_1_w(sn, state); log_envelope_mode(sn); } @@ -1131,18 +1131,18 @@ } -void sn76477_envelope_2_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_2_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != ((sn->envelope_mode >> 1) & 0x01)) + if (state != ((sn->envelope_mode >> 1) & 0x01)) { sn->channel->update(); - _SN76477_envelope_2_w(sn, data); + _SN76477_envelope_2_w(sn, state); log_envelope_mode(sn); } @@ -1163,18 +1163,18 @@ } -void sn76477_vco_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_vco_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != sn->vco_mode) + if (state != sn->vco_mode) { sn->channel->update(); - _SN76477_vco_w(sn, data); + _SN76477_vco_w(sn, state); log_vco_mode(sn); } @@ -1578,16 +1578,16 @@ * *****************************************************************************/ -void sn76477_noise_clock_w(device_t *device, UINT32 data) +WRITE_LINE_DEVICE_HANDLER( sn76477_noise_clock_w ) { #if TEST_MODE == 0 sn76477_state *sn = get_safe_token(device); CHECK_CHIP_NUM_AND_BOOLEAN; - if (data != sn->noise_clock) + if (state != sn->noise_clock) { - sn->noise_clock = data; + sn->noise_clock = state; /* on the rising edge shift generate next value, if external control is enabled */ diff -Nru mame-0.144/src/emu/sound/sn76477.h mame-0.145/src/emu/sound/sn76477.h --- mame-0.144/src/emu/sound/sn76477.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/sn76477.h 2012-02-06 21:30:26.000000000 +0000 @@ -86,14 +86,14 @@ *****************************************************************************/ /* these functions take 0 or 1 as a logic input */ -void sn76477_enable_w(device_t *device, UINT32 data); /* active LO, 0 = enabled, 1 = disabled */ -void sn76477_mixer_a_w(device_t *device, UINT32 data); -void sn76477_mixer_b_w(device_t *device, UINT32 data); -void sn76477_mixer_c_w(device_t *device, UINT32 data); -void sn76477_envelope_1_w(device_t *device, UINT32 data); -void sn76477_envelope_2_w(device_t *device, UINT32 data); -void sn76477_vco_w(device_t *device, UINT32 data); /* 0 = external, 1 = controlled by SLF */ -void sn76477_noise_clock_w(device_t *device, UINT32 data); /* noise clock write, if noise_clock_res = 0 */ +WRITE_LINE_DEVICE_HANDLER( sn76477_enable_w ); /* active LO, 0 = enabled, 1 = disabled */ +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_a_w ); +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_b_w ); +WRITE_LINE_DEVICE_HANDLER( sn76477_mixer_c_w ); +WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_1_w ); +WRITE_LINE_DEVICE_HANDLER( sn76477_envelope_2_w ); +WRITE_LINE_DEVICE_HANDLER( sn76477_vco_w ); /* 0 = external, 1 = controlled by SLF */ +WRITE_LINE_DEVICE_HANDLER( sn76477_noise_clock_w ); /* noise clock write, if noise_clock_res = 0 */ /* these functions take a resistor value in Ohms */ void sn76477_one_shot_res_w(device_t *device, double data); diff -Nru mame-0.144/src/emu/sound/sn76496.c mame-0.145/src/emu/sound/sn76496.c --- mame-0.144/src/emu/sound/sn76496.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/sn76496.c 2012-02-06 21:30:26.000000000 +0000 @@ -24,7 +24,7 @@ It uses a 15-bit ring buffer for periodic noise/arbitrary duty cycle. Its output is not inverted. ** SN76494 is the same as SN76489A but lacks the /8 divider on its clock input. - ** SN76496 is identical in operation to the SN76489A, but the audio input is + ** SN76496 is identical in operation to the SN76489A, but the audio input on pin 9 is documented. All the TI-made PSG chips have an audio input line which is mixed with the 4 channels of output. (It is undocumented and may not function properly on the sn76489, 76489a @@ -151,6 +151,8 @@ { assert(device != NULL); assert(device->type() == SN76496 || + device->type() == U8106 || + device->type() == Y2404 || device->type() == SN76489 || device->type() == SN76489A || device->type() == SN76494 || @@ -431,7 +433,7 @@ device->save_item(NAME(chip->Freq0IsMax)); } -// function parameters: device, feedback destination tap, feedback source taps, +// function parameters: device, feedback destination tap, feedback source taps (1,2), // normal(false)/invert(true), mono(false)/stereo(true), clock divider factor static DEVICE_START( sn76489 ) @@ -439,11 +441,21 @@ generic_start(device, 0x4000, 0x01, 0x02, TRUE, FALSE, 8, TRUE); // SN76489 not verified yet. todo: verify; } +static DEVICE_START( u8106 ) +{ + generic_start(device, 0x4000, 0x01, 0x02, TRUE, FALSE, 8, TRUE); // U8106 not verified yet. todo: verify; (a custom marked sn76489? only used on mr. do and maybe other universal games) +} + static DEVICE_START( sn76489a ) { generic_start(device, 0x10000, 0x04, 0x08, FALSE, FALSE, 8, TRUE); // SN76489A: whitenoise verified, phase verified, periodic verified (by plgdavid) } +static DEVICE_START( y2404 ) +{ + generic_start(device, 0x10000, 0x04, 0x08, FALSE, FALSE, 8, TRUE); // Y2404 not verified yet. todo: verify; (don't be fooled by the Y, it's a TI chip, not Yamaha) +} + static DEVICE_START( sn76494 ) { generic_start(device, 0x10000, 0x04, 0x08, FALSE, FALSE, 1, TRUE); // SN76494 not verified, (according to datasheet: same as sn76489a but without the /8 divider) @@ -493,10 +505,10 @@ /* --- the following bits of info are returned as NULL-terminated strings --- */ case DEVINFO_STR_NAME: strcpy(info->s, "SN76496"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "TI PSG"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.1"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "TI PSG"); break; + case DEVINFO_STR_VERSION: strcpy(info->s, "1.1"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; } } @@ -506,7 +518,7 @@ { case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( sn76489 ); break; case DEVINFO_STR_NAME: strcpy(info->s, "SN76489"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -514,9 +526,29 @@ { switch (state) { - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( sn76489a ); break; + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( sn76489a ); break; case DEVINFO_STR_NAME: strcpy(info->s, "SN76489A"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; + } +} + +DEVICE_GET_INFO( u8106 ) +{ + switch (state) + { + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( u8106 ); break; + case DEVINFO_STR_NAME: strcpy(info->s, "U8106"); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; + } +} + +DEVICE_GET_INFO( y2404 ) +{ + switch (state) + { + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( y2404 ); break; + case DEVINFO_STR_NAME: strcpy(info->s, "Y2404"); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -526,7 +558,7 @@ { case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( sn76494 ); break; case DEVINFO_STR_NAME: strcpy(info->s, "SN76494"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -536,7 +568,7 @@ { case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( sn94624 ); break; case DEVINFO_STR_NAME: strcpy(info->s, "SN94624"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -546,7 +578,7 @@ { case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( ncr7496 ); break; case DEVINFO_STR_NAME: strcpy(info->s, "NCR7496"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -554,9 +586,9 @@ { switch (state) { - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( gamegear ); break; + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( gamegear ); break; case DEVINFO_STR_NAME: strcpy(info->s, "Game Gear PSG"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } @@ -564,14 +596,16 @@ { switch (state) { - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( segapsg ); break; - case DEVINFO_STR_NAME: strcpy(info->s, "SEGA VDP PSG"); break; - default: DEVICE_GET_INFO_CALL(sn76496); break; + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( segapsg ); break; + case DEVINFO_STR_NAME: strcpy(info->s, "SEGA VDP PSG"); break; + default: DEVICE_GET_INFO_CALL(sn76496); break; } } DEFINE_LEGACY_SOUND_DEVICE(SN76496, sn76496); +DEFINE_LEGACY_SOUND_DEVICE(U8106, u8106); +DEFINE_LEGACY_SOUND_DEVICE(Y2404, y2404); DEFINE_LEGACY_SOUND_DEVICE(SN76489, sn76489); DEFINE_LEGACY_SOUND_DEVICE(SN76489A, sn76489a); DEFINE_LEGACY_SOUND_DEVICE(SN76494, sn76494); diff -Nru mame-0.144/src/emu/sound/sn76496.h mame-0.145/src/emu/sound/sn76496.h --- mame-0.144/src/emu/sound/sn76496.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/sn76496.h 2012-02-06 21:30:26.000000000 +0000 @@ -10,6 +10,8 @@ WRITE8_DEVICE_HANDLER( sn76496_stereo_w ); DECLARE_LEGACY_SOUND_DEVICE(SN76496, sn76496); +DECLARE_LEGACY_SOUND_DEVICE(U8106, u8106); +DECLARE_LEGACY_SOUND_DEVICE(Y2404, y2404); DECLARE_LEGACY_SOUND_DEVICE(SN76489, sn76489); DECLARE_LEGACY_SOUND_DEVICE(SN76489A, sn76489a); DECLARE_LEGACY_SOUND_DEVICE(SN76494, sn76494); diff -Nru mame-0.144/src/emu/sound/wave.c mame-0.145/src/emu/sound/wave.c --- mame-0.144/src/emu/sound/wave.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/sound/wave.c 2012-02-06 21:30:27.000000000 +0000 @@ -22,7 +22,6 @@ static STREAM_UPDATE( wave_sound_update ) { cassette_image_device *cass = (cassette_image_device *)param; - int speakers = cass->machine().devicelist().count(SPEAKER); cassette_image *cassette; cassette_state state; double time_index; @@ -31,6 +30,8 @@ stream_sample_t *right_buffer = NULL; int i; + speaker_device_iterator spkiter(cass->machine().root_device()); + int speakers = spkiter.count(); if (speakers>1) right_buffer = outputs[1]; @@ -71,7 +72,8 @@ assert( device != NULL ); assert( device->static_config() != NULL ); - int speakers = device->machine().config().devicelist().count(SPEAKER); + speaker_device_iterator spkiter(device->machine().root_device()); + int speakers = spkiter.count(); image = dynamic_cast(device->machine().device( (const char *)device->static_config())); if (speakers > 1) device->machine().sound().stream_alloc(*device, 0, 2, device->machine().sample_rate(), (void *)image, wave_sound_update); diff -Nru mame-0.144/src/emu/sound.c mame-0.145/src/emu/sound.c --- mame-0.144/src/emu/sound.c 2012-01-13 15:34:27.000000000 +0000 +++ mame-0.145/src/emu/sound.c 2012-02-06 21:30:28.000000000 +0000 @@ -788,7 +788,10 @@ machine.m_sample_rate = 11025; // count the speakers - VPRINTF(("total speakers = %d\n", machine.devicelist().count(SPEAKER))); +#if VERBOSE + speaker_device_iterator iter(machine.root_device()); + VPRINTF(("total speakers = %d\n", iter.count())); +#endif // allocate memory for mix buffers m_leftmix = auto_alloc_array(machine, INT32, machine.sample_rate()); @@ -862,7 +865,8 @@ bool sound_manager::indexed_speaker_input(int index, speaker_input &info) const { // scan through the speakers until we find the indexed input - for (info.speaker = downcast(machine().devicelist().first(SPEAKER)); info.speaker != NULL; info.speaker = info.speaker->next_speaker()) + speaker_device_iterator iter(machine().root_device()); + for (info.speaker = iter.first(); info.speaker != NULL; info.speaker = iter.next()) { if (index < info.speaker->inputs()) { @@ -899,8 +903,8 @@ void sound_manager::reset() { // reset all the sound chips - device_sound_interface *sound = NULL; - for (bool gotone = machine().devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator iter(machine().root_device()); + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) sound->device().reset(); } @@ -1003,7 +1007,8 @@ // force all the speaker streams to generate the proper number of samples int samples_this_update = 0; - for (speaker_device *speaker = downcast(machine().devicelist().first(SPEAKER)); speaker != NULL; speaker = speaker->next_speaker()) + speaker_device_iterator iter(machine().root_device()); + for (speaker_device *speaker = iter.first(); speaker != NULL; speaker = iter.next()) speaker->mix(m_leftmix, m_rightmix, samples_this_update, (m_muted & MUTE_REASON_SYSTEM)); // now downmix the final result diff -Nru mame-0.144/src/emu/speaker.h mame-0.145/src/emu/speaker.h --- mame-0.144/src/emu/speaker.h 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/speaker.h 2012-02-06 21:30:28.000000000 +0000 @@ -84,9 +84,6 @@ // inline configuration helpers static void static_set_position(device_t &device, double x, double y, double z); - // getters - speaker_device *next_speaker() const { return downcast(typenext()); } - // internally for use by the sound system void mix(INT32 *leftmix, INT32 *rightmix, int &samples_this_update, bool suppress); @@ -117,4 +114,8 @@ extern const device_type SPEAKER; +// speaker device iterator +typedef device_type_iterator<&device_creator, speaker_device> speaker_device_iterator; + + #endif /* __SOUND_H__ */ diff -Nru mame-0.144/src/emu/tilemap.c mame-0.145/src/emu/tilemap.c --- mame-0.144/src/emu/tilemap.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/tilemap.c 2012-02-06 21:30:26.000000000 +0000 @@ -4,1967 +4,1431 @@ Generic tilemap management system. - Copyright Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. +**************************************************************************** -***************************************************************************/ - -#include "emu.h" -#include "profiler.h" + 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. -/*************************************************************************** - CONSTANTS ***************************************************************************/ -/* internal usage to mark tiles dirty */ -#define TILE_FLAG_DIRTY 0xff - -/* invalid logical index */ -#define INVALID_LOGICAL_INDEX ((tilemap_logical_index)~0) - -/* maximum index in each array */ -#define MAX_PEN_TO_FLAGS 256 - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* logical index */ -typedef UINT32 tilemap_logical_index; - - -/* internal set of transparency states for rendering */ -typedef enum -{ - WHOLLY_TRANSPARENT, - WHOLLY_OPAQUE, - MASKED -} trans_t; - - -/* internal blitting callbacks */ -typedef void (*blitmask_func)(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -typedef void (*blitopaque_func)(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); - - -/* blitting parameters for rendering */ -typedef struct _blit_parameters blit_parameters; -struct _blit_parameters -{ - bitmap_t * bitmap; - rectangle cliprect; - blitmask_func draw_masked; - blitopaque_func draw_opaque; - UINT32 tilemap_priority_code; - UINT8 mask; - UINT8 value; - UINT8 alpha; -}; - - -/* core tilemap structure */ -class tilemap_t -{ -public: - tilemap_t(running_machine &machine) - : m_machine(machine) { } - - running_machine &machine() const { return m_machine; } - - tilemap_t * next; /* pointer to next tilemap */ - - /* basic tilemap metrics */ - UINT32 rows; /* number of tile rows */ - UINT32 cols; /* number of tile columns */ - UINT32 tilewidth; /* width of a single tile in pixels */ - UINT32 tileheight; /* height of a single tile in pixels */ - UINT32 width; /* width of the full tilemap in pixels */ - UINT32 height; /* height of the full tilemap in pixels */ - - /* logical <-> memory mappings */ - tilemap_mapper_func mapper; /* callback to map a row/column to a memory index */ - tilemap_logical_index * memory_to_logical; /* map from memory index to logical index */ - tilemap_logical_index max_logical_index; /* maximum valid logical index */ - tilemap_memory_index * logical_to_memory; /* map from logical index to memory index */ - tilemap_memory_index max_memory_index; /* maximum valid memory index */ - - /* callback to interpret video RAM for the tilemap */ - tile_get_info_func tile_get_info; /* callback to get information about a tile */ - void * tile_get_info_object;/* object passed as the first parameter to the get_info functon */ - tile_data tileinfo; /* structure to hold the data for a tile */ - void * user_data; /* user data value passed to the callback */ - - /* global tilemap states */ - UINT8 enable; /* true if we are enabled */ - UINT8 attributes; /* global attributes (flipx/y) */ - UINT8 all_tiles_dirty; /* true if all tiles are dirty */ - UINT8 all_tiles_clean; /* true if all tiles are clean */ - UINT32 palette_offset; /* palette offset */ - UINT32 pen_data_offset; /* pen data offset */ - UINT32 gfx_used; /* bitmask of gfx items used */ - UINT32 gfx_dirtyseq[MAX_GFX_ELEMENTS]; /* dirtyseq values from last check */ - - /* scroll information */ - UINT32 scrollrows; /* number of independently scrolled rows */ - UINT32 scrollcols; /* number of independently scrolled colums */ - INT32 * rowscroll; /* array of rowscroll values */ - INT32 * colscroll; /* array of colscroll values */ - INT32 dx; /* global horizontal scroll offset */ - INT32 dx_flipped; /* global horizontal scroll offset when flipped */ - INT32 dy; /* global vertical scroll offset */ - INT32 dy_flipped; /* global vertical scroll offset when flipped */ - - /* pixel data */ - bitmap_t * pixmap; /* cached pixel data */ - - /* transparency mapping */ - bitmap_t * flagsmap; /* per-pixel flags */ - UINT8 * tileflags; /* per-tile flags */ - UINT8 * pen_to_flags; /* mapping of pens to flags */ - -private: - running_machine & m_machine; /* pointer back to the owning machine */ -}; - - -struct _tilemap_private -{ - tilemap_t * list; - tilemap_t ** tailptr; - int instance; -}; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -/* system management helpers */ -static tilemap_t *tilemap_create_common(running_machine &machine, void *get_info_object, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows); -static void tilemap_exit(running_machine &machine); -static void tilemap_postload(tilemap_t *tmap); -static void tilemap_dispose(tilemap_t *tmap); - -/* logical <-> memory index mapping */ -static void mappings_create(tilemap_t *tmap); -static void mappings_update(tilemap_t *tmap); - -/* tile rendering */ -static void pixmap_update(tilemap_t *tmap, const rectangle *cliprect); -static void tile_update(tilemap_t *tmap, tilemap_logical_index logindex, UINT32 cached_col, UINT32 cached_row); -static UINT8 tile_draw(tilemap_t *tmap, const UINT8 *pendata, UINT32 x0, UINT32 y0, UINT32 palette_base, UINT8 category, UINT8 group, UINT8 flags, UINT8 pen_mask); -static UINT8 tile_apply_bitmask(tilemap_t *tmap, const UINT8 *maskdata, UINT32 x0, UINT32 y0, UINT8 category, UINT8 flags); - -/* drawing helpers */ -static void configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_t *dest, const rectangle *cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask); -static void tilemap_draw_instance(tilemap_t *tmap, const blit_parameters *blit, int xpos, int ypos); -static void tilemap_draw_roz_core(tilemap_t *tmap, const blit_parameters *blit, - UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound); - -/* scanline rasterizers for drawing to the pixmap */ -static void scanline_draw_opaque_null(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_null(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_opaque_ind16(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_ind16(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_opaque_rgb16(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_rgb16(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_opaque_rgb16_alpha(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_rgb16_alpha(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_opaque_rgb32(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_rgb32(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_opaque_rgb32_alpha(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); -static void scanline_draw_masked_rgb32_alpha(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); - - +#include "emu.h" +#include "profiler.h" -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ -/*------------------------------------------------- - effective_rowscroll - return the effective - rowscroll value for a given index, taking into - account tilemap flip states --------------------------------------------------*/ +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** + +//------------------------------------------------- +// effective_rowscroll - return the effective +// rowscroll value for a given index, taking into +// account tilemap flip states +//------------------------------------------------- + +inline INT32 tilemap_t::effective_rowscroll(int index, UINT32 screen_width) +{ + // if we're flipping vertically, adjust the row number + if (m_attributes & TILEMAP_FLIPY) + index = m_scrollrows - 1 - index; -INLINE INT32 effective_rowscroll(tilemap_t *tmap, int index, UINT32 screen_width) -{ + // adjust final result based on the horizontal flip and dx values INT32 value; - - /* if we're flipping vertically, adjust the row number */ - if (tmap->attributes & TILEMAP_FLIPY) - index = tmap->scrollrows - 1 - index; - - /* adjust final result based on the horizontal flip and dx values */ - if (!(tmap->attributes & TILEMAP_FLIPX)) - value = tmap->dx - tmap->rowscroll[index]; + if (!(m_attributes & TILEMAP_FLIPX)) + value = m_dx - m_rowscroll[index]; else - value = screen_width - tmap->width - (tmap->dx_flipped - tmap->rowscroll[index]); + value = screen_width - m_width - (m_dx_flipped - m_rowscroll[index]); - /* clamp to 0..width */ + // clamp to 0..width if (value < 0) - value = tmap->width - (-value) % tmap->width; + value = m_width - (-value) % m_width; else - value %= tmap->width; + value %= m_width; return value; } -/*------------------------------------------------- - effective_colscroll - return the effective - colscroll value for a given index, taking into - account tilemap flip states --------------------------------------------------*/ +//------------------------------------------------- +// effective_colscroll - return the effective +// colscroll value for a given index, taking into +// account tilemap flip states +//------------------------------------------------- + +inline INT32 tilemap_t::effective_colscroll(int index, UINT32 screen_height) +{ + // if we're flipping horizontally, adjust the column number + if (m_attributes & TILEMAP_FLIPX) + index = m_scrollcols - 1 - index; -INLINE INT32 effective_colscroll(tilemap_t *tmap, int index, UINT32 screen_height) -{ + // adjust final result based on the vertical flip and dx values INT32 value; - - /* if we're flipping horizontally, adjust the column number */ - if (tmap->attributes & TILEMAP_FLIPX) - index = tmap->scrollcols - 1 - index; - - /* adjust final result based on the vertical flip and dx values */ - if (!(tmap->attributes & TILEMAP_FLIPY)) - value = tmap->dy - tmap->colscroll[index]; + if (!(m_attributes & TILEMAP_FLIPY)) + value = m_dy - m_colscroll[index]; else - value = screen_height - tmap->height - (tmap->dy_flipped - tmap->colscroll[index]); + value = screen_height - m_height - (m_dy_flipped - m_colscroll[index]); - /* clamp to 0..height */ + // clamp to 0..height if (value < 0) - value = tmap->height - (-value) % tmap->height; + value = m_height - (-value) % m_height; else - value %= tmap->height; + value %= m_height; return value; } -/*------------------------------------------------- - indexed_tilemap - return a tilemap by index --------------------------------------------------*/ - -INLINE tilemap_t *indexed_tilemap(running_machine &machine, int index) -{ - tilemap_t *tmap; - - /* find by the tilemap index */ - for (tmap = machine.tilemap_data->list; tmap != NULL; tmap = tmap->next) - if (index-- == 0) - return tmap; - - return NULL; -} - - -/*------------------------------------------------- - gfx_tiles_changed - return TRUE if any - gfx_elements used by this tilemap have - changed --------------------------------------------------*/ +//------------------------------------------------- +// gfx_tiles_changed - return TRUE if any +// gfx_elements used by this tilemap have +// changed +//------------------------------------------------- -INLINE int gfx_elements_changed(tilemap_t *tmap) +inline bool tilemap_t::gfx_elements_changed() { - UINT32 usedmask = tmap->gfx_used; - int isdirty = FALSE; - int gfxnum; + UINT32 usedmask = m_gfx_used; + bool isdirty = false; - /* iterate over all used gfx types and set the dirty flag if any of them have changed */ - for (gfxnum = 0; usedmask != 0; usedmask >>= 1, gfxnum++) + // iterate over all used gfx types and set the dirty flag if any of them have changed + for (int gfxnum = 0; usedmask != 0; usedmask >>= 1, gfxnum++) if ((usedmask & 1) != 0) - if (tmap->gfx_dirtyseq[gfxnum] != tmap->machine().gfx[gfxnum]->dirtyseq) + if (m_gfx_dirtyseq[gfxnum] != machine().gfx[gfxnum]->dirtyseq) { - tmap->gfx_dirtyseq[gfxnum] = tmap->machine().gfx[gfxnum]->dirtyseq; - isdirty = TRUE; + m_gfx_dirtyseq[gfxnum] = machine().gfx[gfxnum]->dirtyseq; + isdirty = true; } return isdirty; } -/*************************************************************************** - SYSTEM-WIDE MANAGEMENT -***************************************************************************/ - -/*------------------------------------------------- - tilemap_init - initialize the tilemap system --------------------------------------------------*/ +//************************************************************************** +// SCANLINE RASTERIZERS +//************************************************************************** + +//------------------------------------------------- +// scanline_draw_opaque_null - draw to a NULL +// bitmap, setting priority only +//------------------------------------------------- -void tilemap_init(running_machine &machine) +inline void tilemap_t::scanline_draw_opaque_null(int count, UINT8 *pri, UINT32 pcode) { - UINT32 screen_width, screen_height; - - if (machine.primary_screen == NULL) + // skip entirely if not changing priority + if (pcode == 0xff00) return; - screen_width = machine.primary_screen->width(); - screen_height = machine.primary_screen->height(); - - if (screen_width != 0 && screen_height != 0) - { - machine.priority_bitmap = auto_bitmap_alloc(machine, screen_width, screen_height, BITMAP_FORMAT_INDEXED8); - machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(tilemap_exit), &machine)); - } + // update priority across the scanline + for (int i = 0; i < count; i++) + pri[i] = (pri[i] & (pcode >> 8)) | pcode; } +//------------------------------------------------- +// scanline_draw_masked_null - draw to a NULL +// bitmap using a mask, setting priority only +//------------------------------------------------- -/*************************************************************************** - TILEMAP CREATION AND CONFIGURATION -***************************************************************************/ - -/*------------------------------------------------- - tilemap_create - create a new tilemap --------------------------------------------------*/ - -tilemap_t *tilemap_create(running_machine &machine, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) +inline void tilemap_t::scanline_draw_masked_null(const UINT8 *maskptr, int mask, int value, int count, UINT8 *pri, UINT32 pcode) { - return tilemap_create_common(machine, (void *)&machine, tile_get_info, mapper, tilewidth, tileheight, cols, rows); + // skip entirely if not changing priority + if (pcode == 0xff00) + return; + + // update priority across the scanline, checking the mask + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + pri[i] = (pri[i] & (pcode >> 8)) | pcode; } -/*------------------------------------------------- - tilemap_create - create a new tilemap that - is owned by a device --------------------------------------------------*/ -tilemap_t *tilemap_create_device(device_t *device, tile_get_info_device_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) -{ - return tilemap_create_common(device->machine(), (void *)device, (tile_get_info_func)tile_get_info, mapper, tilewidth, tileheight, cols, rows); -} +//------------------------------------------------- +// scanline_draw_opaque_ind16 - draw to a 16bpp +// indexed bitmap +//------------------------------------------------- +inline void tilemap_t::scanline_draw_opaque_ind16(UINT16 *dest, const UINT16 *source, int count, UINT8 *pri, UINT32 pcode) +{ + // special case for no palette offset + int pal = pcode >> 16; + if (pal == 0) + { + // use memcpy which should be well-optimized for the platform + memcpy(dest, source, count * 2); -/*------------------------------------------------- - tilemap_create_common - shared creation - function --------------------------------------------------*/ + // skip the rest if not changing priority + if (pcode == 0xff00) + return; -static tilemap_t *tilemap_create_common(running_machine &machine, void *get_info_object, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) -{ - tilemap_t *tmap; - int tilemap_instance; - int group; + // update priority across the scanline + for (int i = 0; i < count; i++) + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } - /* if no tilemap private data yet, allocate it */ - if (machine.tilemap_data == NULL) + // priority case + else if ((pcode & 0xffff) != 0xff00) { - machine.tilemap_data = auto_alloc_clear(machine, tilemap_private); - machine.tilemap_data->tailptr = &machine.tilemap_data->list; + for (int i = 0; i < count; i++) + { + dest[i] = source[i] + pal; + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } } - tilemap_instance = machine.tilemap_data->instance; - /* allocate the tilemap itself */ - tmap = auto_alloc_clear(machine, tilemap_t(machine)); + // no priority case + else + { + for (int i = 0; i < count; i++) + dest[i] = source[i] + pal; + } +} - /* fill in the basic metrics */ - tmap->rows = rows; - tmap->cols = cols; - tmap->tilewidth = tilewidth; - tmap->tileheight = tileheight; - tmap->width = cols * tilewidth; - tmap->height = rows * tileheight; - /* set up the logical <-> memory mappings */ - tmap->mapper = mapper; - mappings_create(tmap); +//------------------------------------------------- +// scanline_draw_masked_ind16 - draw to a 16bpp +// indexed bitmap using a mask +//------------------------------------------------- - /* set up the tile map callbacks */ - tmap->tile_get_info = tile_get_info; - tmap->tile_get_info_object = get_info_object; +inline void tilemap_t::scanline_draw_masked_ind16(UINT16 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, UINT8 *pri, UINT32 pcode) +{ + int pal = pcode >> 16; - /* set up the default pen mask */ - tmap->tileinfo.pen_mask = 0xff; - tmap->tileinfo.gfxnum = 0xff; + // priority case + if ((pcode & 0xffff) != 0xff00) + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + { + dest[i] = source[i] + pal; + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } + } - /* initialize global states */ - tmap->enable = TRUE; - tmap->all_tiles_dirty = TRUE; + // no priority case + else + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + dest[i] = source[i] + pal; + } +} - /* initialize scroll information */ - tmap->scrollrows = 1; - tmap->scrollcols = 1; - tmap->rowscroll = auto_alloc_array_clear(machine, INT32, tmap->height); - tmap->colscroll = auto_alloc_array_clear(machine, INT32, tmap->width); - /* allocate the pixel data cache */ - tmap->pixmap = auto_bitmap_alloc(machine, tmap->width, tmap->height, BITMAP_FORMAT_INDEXED16); - /* allocate transparency mapping data */ - tmap->tileflags = auto_alloc_array(machine, UINT8, tmap->max_logical_index); - tmap->flagsmap = auto_bitmap_alloc(machine, tmap->width, tmap->height, BITMAP_FORMAT_INDEXED8); - tmap->pen_to_flags = auto_alloc_array_clear(machine, UINT8, MAX_PEN_TO_FLAGS * TILEMAP_NUM_GROUPS); - for (group = 0; group < TILEMAP_NUM_GROUPS; group++) - tilemap_map_pens_to_layer(tmap, group, 0, 0, TILEMAP_PIXEL_LAYER0); +//------------------------------------------------- +// scanline_draw_opaque_rgb32 - draw to a 32bpp +// RGB bitmap +//------------------------------------------------- - /* add us to the end of the list of tilemaps */ - *machine.tilemap_data->tailptr = tmap; - machine.tilemap_data->tailptr = &tmap->next; +inline void tilemap_t::scanline_draw_opaque_rgb32(UINT32 *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode) +{ + const pen_t *clut = &pens[pcode >> 16]; - /* save relevant state */ - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->enable)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->attributes)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->palette_offset)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->pen_data_offset)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->scrollrows)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->scrollcols)); - machine.save().save_pointer("tilemap", NULL, tilemap_instance, NAME(tmap->rowscroll), rows * tileheight); - machine.save().save_pointer("tilemap", NULL, tilemap_instance, NAME(tmap->colscroll), cols * tilewidth); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->dx)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->dx_flipped)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->dy)); - machine.save().save_item("tilemap", NULL, tilemap_instance, NAME(tmap->dy_flipped)); - machine.tilemap_data->instance++; + // priority case + if ((pcode & 0xffff) != 0xff00) + { + for (int i = 0; i < count; i++) + { + dest[i] = clut[source[i]]; + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } + } - /* reset everything after a load */ - machine.save().register_postload(save_prepost_delegate(FUNC(tilemap_postload), tmap)); - return tmap; + // no priority case + else + { + for (int i = 0; i < count; i++) + dest[i] = clut[source[i]]; + } } -/*------------------------------------------------- - tilemap_set_user_data - specify a parameter - to be passed into the tile_get_info callback --------------------------------------------------*/ +//------------------------------------------------- +// scanline_draw_masked_rgb32 - draw to a 32bpp +// RGB bitmap using a mask +//------------------------------------------------- -void tilemap_set_user_data(tilemap_t *tmap, void *user_data) +inline void tilemap_t::scanline_draw_masked_rgb32(UINT32 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode) { - tmap->user_data = user_data; -} - + const pen_t *clut = &pens[pcode >> 16]; -/*------------------------------------------------- - tilemap_set_palette_offset - specify an offset - to be added to each pixel before looking up - the palette --------------------------------------------------*/ + // priority case + if ((pcode & 0xffff) != 0xff00) + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + { + dest[i] = clut[source[i]]; + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } + } -void tilemap_set_palette_offset(tilemap_t *tmap, UINT32 offset) -{ - tmap->palette_offset = offset; + // no priority case + else + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + dest[i] = clut[source[i]]; + } } -/*------------------------------------------------- - tilemap_set_enable - set an enable flag for - the tilemap; if 0, requests to draw the - tilemap are ignored --------------------------------------------------*/ +//------------------------------------------------- +// scanline_draw_opaque_rgb32_alpha - draw to a +// 32bpp RGB bitmap with alpha blending +//------------------------------------------------- -void tilemap_set_enable(tilemap_t *tmap, int enable) +inline void tilemap_t::scanline_draw_opaque_rgb32_alpha(UINT32 *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) { - tmap->enable = (enable != 0); -} - -/*------------------------------------------------- - tilemap_get_scrolldx - return the enable flag - for the tilemap --------------------------------------------------*/ - -int tilemap_get_enable(tilemap_t *tmap) -{ - return tmap->enable; -} - + const pen_t *clut = &pens[pcode >> 16]; -/*------------------------------------------------- - tilemap_set_flip - set a global flip for the - tilemap --------------------------------------------------*/ + // priority case + if ((pcode & 0xffff) != 0xff00) + { + for (int i = 0; i < count; i++) + { + dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } + } -void tilemap_set_flip(tilemap_t *tmap, UINT32 attributes) -{ - /* if we're changing things, force a refresh of the mappings and mark it all dirty */ - if (tmap->attributes != attributes) + // no priority case + else { - tmap->attributes = attributes; - mappings_update(tmap); + for (int i = 0; i < count; i++) + dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); } } -/*------------------------------------------------- - tilemap_set_flip_all - set a global flip for all - the tilemaps --------------------------------------------------*/ +//------------------------------------------------- +// scanline_draw_masked_rgb32_alpha - draw to a +// 32bpp RGB bitmap using a mask and alpha +// blending +//------------------------------------------------- -void tilemap_set_flip_all(running_machine &machine, UINT32 attributes) +inline void tilemap_t::scanline_draw_masked_rgb32_alpha(UINT32 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) { - tilemap_t *tmap; + const pen_t *clut = &pens[pcode >> 16]; - if (machine.tilemap_data == NULL) - return; + // priority case + if ((pcode & 0xffff) != 0xff00) + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + { + dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); + pri[i] = (pri[i] & (pcode >> 8)) | pcode; + } + } - for (tmap = machine.tilemap_data->list; tmap != NULL; tmap = tmap->next) - tilemap_set_flip(tmap, attributes); + // no priority case + else + { + for (int i = 0; i < count; i++) + if ((maskptr[i] & mask) == value) + dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); + } } +//************************************************************************** +// TILEMAP CREATION AND CONFIGURATION +//************************************************************************** + +//------------------------------------------------- +// tilemap_create_common - shared creation +// function +//------------------------------------------------- + +tilemap_t::tilemap_t(tilemap_manager &manager, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, int tilewidth, int tileheight, int cols, int rows) + : m_next(NULL), + m_rows(rows), + m_cols(cols), + m_tilewidth(tilewidth), + m_tileheight(tileheight), + m_width(cols * tilewidth), + m_height(rows * tileheight), + m_mapper(mapper), + m_memory_to_logical(NULL), + m_max_logical_index(0), + m_logical_to_memory(NULL), + m_max_memory_index(0), + m_tile_get_info(tile_get_info), + m_user_data(NULL), + m_enable(true), + m_attributes(0), + m_all_tiles_dirty(true), + m_all_tiles_clean(false), + m_palette_offset(0), + m_pen_data_offset(0), + m_gfx_used(0), + m_scrollrows(1), + m_scrollcols(1), + m_rowscroll(auto_alloc_array_clear(manager.machine(), INT32, m_height)), + m_colscroll(auto_alloc_array_clear(manager.machine(), INT32, m_width)), + m_dx(0), + m_dx_flipped(0), + m_dy(0), + m_dy_flipped(0), + m_pixmap(m_width, m_height), + m_flagsmap(m_width, m_height), + m_tileflags(NULL), + m_manager(manager) +{ + // reset internal arrays + memset(m_gfx_dirtyseq, 0, sizeof(m_gfx_dirtyseq)); + memset(m_pen_to_flags, 0, sizeof(m_pen_to_flags)); + + // create the initial mappings + mappings_create(); + + // set up the default pen mask + memset(&m_tileinfo, 0, sizeof(m_tileinfo)); + m_tileinfo.pen_mask = 0xff; + m_tileinfo.gfxnum = 0xff; + + // allocate transparency mapping data + m_tileflags = auto_alloc_array(machine(), UINT8, m_max_logical_index); + for (int group = 0; group < TILEMAP_NUM_GROUPS; group++) + map_pens_to_layer(group, 0, 0, TILEMAP_PIXEL_LAYER0); + + // save relevant state + int instance = manager.alloc_instance(); + machine().save().save_item("tilemap", NULL, instance, NAME(m_enable)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_attributes)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_palette_offset)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_pen_data_offset)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_scrollrows)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_scrollcols)); + machine().save().save_pointer("tilemap", NULL, instance, NAME(m_rowscroll), rows * tileheight); + machine().save().save_pointer("tilemap", NULL, instance, NAME(m_colscroll), cols * tilewidth); + machine().save().save_item("tilemap", NULL, instance, NAME(m_dx)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_dx_flipped)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_dy)); + machine().save().save_item("tilemap", NULL, instance, NAME(m_dy_flipped)); + + // reset everything after a load + machine().save().register_postload(save_prepost_delegate(FUNC(tilemap_t::postload), this)); +} + + +//------------------------------------------------- +// ~tilemap_t - destructor +//------------------------------------------------- + +tilemap_t::~tilemap_t() +{ +} + + +//------------------------------------------------- +// mark_tile_dirty - mark a single tile dirty +// based on its memory index +//------------------------------------------------- -/*************************************************************************** - DIRTY TILE MARKING -***************************************************************************/ - -/*------------------------------------------------- - tilemap_mark_tile_dirty - mark a single tile - dirty based on its memory index --------------------------------------------------*/ - -void tilemap_mark_tile_dirty(tilemap_t *tmap, tilemap_memory_index memindex) +void tilemap_t::mark_tile_dirty(tilemap_memory_index memindex) { - /* only mark if within range */ - if (memindex < tmap->max_memory_index) + // only mark if within range + if (memindex < m_max_memory_index) { - tilemap_logical_index logindex = tmap->memory_to_logical[memindex]; - - /* there may be no logical index for a given memory index */ + // there may be no logical index for a given memory index + logical_index logindex = m_memory_to_logical[memindex]; if (logindex != INVALID_LOGICAL_INDEX) { - tmap->tileflags[logindex] = TILE_FLAG_DIRTY; - tmap->all_tiles_clean = FALSE; + m_tileflags[logindex] = TILE_FLAG_DIRTY; + m_all_tiles_clean = false; } } } -/*------------------------------------------------- - tilemap_mark_all_tiles_dirty - mark all the - tiles in a tilemap dirty --------------------------------------------------*/ - -void tilemap_mark_all_tiles_dirty(tilemap_t *tmap) -{ - /* mark all tiles dirty and clear the clean flag */ - tmap->all_tiles_dirty = TRUE; - tmap->all_tiles_clean = FALSE; -} - - -/*------------------------------------------------- - tilemap_mark_all_tiles_dirty_all - mark all the - tiles in all the tilemaps dirty --------------------------------------------------*/ +//------------------------------------------------- +// map_pens_to_layer - specify the mapping of one +// or more pens (where ( & mask) == pen) to +// a layer +//------------------------------------------------- -void tilemap_mark_all_tiles_dirty_all(running_machine &machine) +void tilemap_t::map_pens_to_layer(int group, pen_t pen, pen_t mask, UINT8 layermask) { - tilemap_t *tmap; - for (tmap = machine.tilemap_data->list; tmap != NULL; tmap = tmap->next) - tilemap_mark_all_tiles_dirty(tmap); -} - - -/*************************************************************************** - PEN-TO-LAYER MAPPING -***************************************************************************/ - -/*------------------------------------------------- - tilemap_map_pens_to_layer - specify the - mapping of one or more pens (where - ( & mask) == pen) to a layer --------------------------------------------------*/ - -void tilemap_map_pens_to_layer(tilemap_t *tmap, int group, pen_t pen, pen_t mask, UINT8 layermask) -{ - UINT8 *array = tmap->pen_to_flags + group * MAX_PEN_TO_FLAGS; - pen_t start, stop, cur; - UINT8 changed = FALSE; - assert(group < TILEMAP_NUM_GROUPS); assert((layermask & TILEMAP_PIXEL_CATEGORY_MASK) == 0); - /* we start at the index where (pen & mask) == pen, and all other bits are 0 */ - start = pen & mask; + // we start at the index where (pen & mask) == pen, and all other bits are 0 + pen_t start = pen & mask; - /* we stop at the index where (pen & mask) == pen, and all other bits are 1 */ - stop = start | ~mask; + // we stop at the index where (pen & mask) == pen, and all other bits are 1 + pen_t stop = start | ~mask; - /* clamp to the number of entries actually there */ + // clamp to the number of entries actually there stop = MIN(stop, MAX_PEN_TO_FLAGS - 1); - /* iterate and set */ - for (cur = start; cur <= stop; cur++) + // iterate and set + UINT8 *array = m_pen_to_flags + group * MAX_PEN_TO_FLAGS; + bool changed = false; + for (pen_t cur = start; cur <= stop; cur++) if ((cur & mask) == pen && array[cur] != layermask) { - changed = TRUE; + changed = true; array[cur] = layermask; } - /* everything gets dirty if anything changed */ + // everything gets dirty if anything changed if (changed) - tilemap_mark_all_tiles_dirty(tmap); + mark_all_dirty(); } -/*------------------------------------------------- - tilemap_set_transparent_pen - set a single - transparent pen into the tilemap, mapping - all other pens to layer 0 --------------------------------------------------*/ +//------------------------------------------------- +// set_transparent_pen - set a single transparent +// pen into the tilemap, mapping all other pens +// to layer 0 +//------------------------------------------------- -void tilemap_set_transparent_pen(tilemap_t *tmap, pen_t pen) +void tilemap_t::set_transparent_pen(pen_t pen) { - /* reset the whole pen map to opaque */ - tilemap_map_pens_to_layer(tmap, 0, 0, 0, TILEMAP_PIXEL_LAYER0); + // reset the whole pen map to opaque + map_pens_to_layer(0, 0, 0, TILEMAP_PIXEL_LAYER0); - /* set the single pen to transparent */ - tilemap_map_pen_to_layer(tmap, 0, pen, TILEMAP_PIXEL_TRANSPARENT); + // set the single pen to transparent + map_pen_to_layer(0, pen, TILEMAP_PIXEL_TRANSPARENT); } -/*------------------------------------------------- - tilemap_set_transmask - set up the first 32 - pens using a foreground mask (mapping to - layer 0) and a background mask (mapping to - layer 1) --------------------------------------------------*/ +//------------------------------------------------- +// set_transmask - set up the first 32 pens using +// a foreground mask (mapping to layer 0) and a +// background mask (mapping to layer 1) +//------------------------------------------------- -void tilemap_set_transmask(tilemap_t *tmap, int group, UINT32 fgmask, UINT32 bgmask) +void tilemap_t::set_transmask(int group, UINT32 fgmask, UINT32 bgmask) { - pen_t pen; - - /* iterate over all 32 pens specified */ - for (pen = 0; pen < 32; pen++) + // iterate over all 32 pens specified + for (pen_t pen = 0; pen < 32; pen++) { UINT8 fgbits = ((fgmask >> pen) & 1) ? TILEMAP_PIXEL_TRANSPARENT : TILEMAP_PIXEL_LAYER0; UINT8 bgbits = ((bgmask >> pen) & 1) ? TILEMAP_PIXEL_TRANSPARENT : TILEMAP_PIXEL_LAYER1; - tilemap_map_pen_to_layer(tmap, group, pen, fgbits | bgbits); + map_pen_to_layer(group, pen, fgbits | bgbits); } } -/*************************************************************************** - TILEMAP SCROLLING -***************************************************************************/ +//************************************************************************** +// COMMON LOGICAL-TO-MEMORY MAPPERS +//************************************************************************** -/*------------------------------------------------- - tilemap_set_scroll_rows - specify the number of - independently scrollable row units; each unit - covers height/scroll_rows pixels --------------------------------------------------*/ +//------------------------------------------------- +// tilemap_scan_rows +// tilemap_scan_rows_flip_x +// tilemap_scan_rows_flip_y +// tilemap_scan_rows_flip_xy - scan in row-major +// order with optional flipping +//------------------------------------------------- -void tilemap_set_scroll_rows(tilemap_t *tmap, UINT32 scroll_rows) +TILEMAP_MAPPER( tilemap_scan_rows ) { - assert(scroll_rows <= tmap->height); - tmap->scrollrows = scroll_rows; + return row * num_cols + col; } - -/*------------------------------------------------- - tilemap_set_scroll_cols - specify the number of - independently scrollable column units; each - unit covers width/scroll_cols pixels --------------------------------------------------*/ - -void tilemap_set_scroll_cols(tilemap_t *tmap, UINT32 scroll_cols) +TILEMAP_MAPPER( tilemap_scan_rows_flip_x ) { - assert(scroll_cols <= tmap->width); - tmap->scrollcols = scroll_cols; + return row * num_cols + (num_cols - 1 - col); } - -/*------------------------------------------------- - tilemap_set_scrolldx - specify global - horizontal scroll offset, for non-flipped and - flipped cases --------------------------------------------------*/ - -void tilemap_set_scrolldx(tilemap_t *tmap, int dx, int dx_flipped) +TILEMAP_MAPPER( tilemap_scan_rows_flip_y ) { - tmap->dx = dx; - tmap->dx_flipped = dx_flipped; + return (num_rows - 1 - row) * num_cols + col; } - -/*------------------------------------------------- - tilemap_set_scrolldy - specify global - vertical scroll offset, for non-flipped and - flipped cases --------------------------------------------------*/ - -void tilemap_set_scrolldy(tilemap_t *tmap, int dy, int dy_flipped) +TILEMAP_MAPPER( tilemap_scan_rows_flip_xy ) { - tmap->dy = dy; - tmap->dy_flipped = dy_flipped; + return (num_rows - 1 - row) * num_cols + (num_cols - 1 - col); } -/*------------------------------------------------- - tilemap_get_scrolldx - return the global - horizontal scroll offset, based on current - flip state --------------------------------------------------*/ +//------------------------------------------------- +// tilemap_scan_cols +// tilemap_scan_cols_flip_x +// tilemap_scan_cols_flip_y +// tilemap_scan_cols_flip_xy - scan in column- +// major order with optional flipping +//------------------------------------------------- -int tilemap_get_scrolldx(tilemap_t *tmap) +TILEMAP_MAPPER( tilemap_scan_cols ) { - return (tmap->attributes & TILEMAP_FLIPX) ? tmap->dx_flipped : tmap->dx; + return col * num_rows + row; } - -/*------------------------------------------------- - tilemap_get_scrolldy - return the global - vertical scroll offset, based on current - flip state --------------------------------------------------*/ - -int tilemap_get_scrolldy(tilemap_t *tmap) +TILEMAP_MAPPER( tilemap_scan_cols_flip_x ) { - return (tmap->attributes & TILEMAP_FLIPY) ? tmap->dy_flipped : tmap->dy; + return (num_cols - 1 - col) * num_rows + row; } - -/*------------------------------------------------- - tilemap_set_scrollx - specify the scroll value - for a row unit --------------------------------------------------*/ - -void tilemap_set_scrollx(tilemap_t *tmap, int which, int value) +TILEMAP_MAPPER( tilemap_scan_cols_flip_y ) { - if (which < tmap->scrollrows) - tmap->rowscroll[which] = value; + return col * num_rows + (num_rows - 1 - row); } - -/*------------------------------------------------- - tilemap_set_scrolly - specify the scroll value - for a column unit --------------------------------------------------*/ - -void tilemap_set_scrolly(tilemap_t *tmap, int which, int value) +TILEMAP_MAPPER( tilemap_scan_cols_flip_xy ) { - if (which < tmap->scrollcols) - tmap->colscroll[which] = value; + return (num_cols - 1 - col) * num_rows + (num_rows - 1 - row); } -/*------------------------------------------------- - tilemap_get_scrollx - return the scroll value - for a row unit --------------------------------------------------*/ - -int tilemap_get_scrollx(tilemap_t *tmap, int which) -{ - if (which < tmap->scrollrows) - return tmap->rowscroll[which]; - else - return 0; -} - -/*------------------------------------------------- - tilemap_get_scrolly - return the scroll value - for a column unit --------------------------------------------------*/ +//------------------------------------------------- +// postload - after loading a save state +// invalidate everything +//------------------------------------------------- -int tilemap_get_scrolly(tilemap_t *tmap, int which) +void tilemap_t::postload() { - if (which < tmap->scrollcols) - return tmap->colscroll[which]; - else - return 0; + mappings_update(); } -/*************************************************************************** - INTERNAL MAP ACCESS -***************************************************************************/ +//************************************************************************** +// LOGICAL <-> MEMORY INDEX MAPPING +//************************************************************************** -/*------------------------------------------------- - tilemap_get_pixmap - return a pointer to the - (updated) internal pixmap for a tilemap --------------------------------------------------*/ +//------------------------------------------------- +// mappings_create - allocate memory for the +// mapping tables and compute their extents +//------------------------------------------------- -bitmap_t *tilemap_get_pixmap(tilemap_t *tmap) +void tilemap_t::mappings_create() { - /* ensure all the tiles are up-to-date and then return the pixmap */ - pixmap_update(tmap, NULL); - return tmap->pixmap; -} - - -/*------------------------------------------------- - tilemap_get_flagsmap - return a pointer to the - (updated) internal flagsmap for a tilemap --------------------------------------------------*/ - -bitmap_t *tilemap_get_flagsmap(tilemap_t *tmap) -{ - /* ensure all the tiles are up-to-date and then return the flagsmap */ - pixmap_update(tmap, NULL); - return tmap->flagsmap; -} + // compute the maximum logical index + m_max_logical_index = m_rows * m_cols; + // compute the maximum memory index + m_max_memory_index = 0; + for (UINT32 row = 0; row < m_rows; row++) + for (UINT32 col = 0; col < m_cols; col++) + { + tilemap_memory_index memindex = memory_index(col, row); + m_max_memory_index = MAX(m_max_memory_index, memindex); + } + m_max_memory_index++; -/*------------------------------------------------- - tilemap_get_pixmap - return a pointer to the - (updated) internal per-tile flags for a tilemap --------------------------------------------------*/ + // allocate the necessary mappings + m_memory_to_logical = auto_alloc_array(machine(), logical_index, m_max_memory_index); + m_logical_to_memory = auto_alloc_array(machine(), tilemap_memory_index, m_max_logical_index); -UINT8 *tilemap_get_tile_flags(tilemap_t *tmap) -{ - /* ensure all the tiles are up-to-date and then return the per-tile flags */ - pixmap_update(tmap, NULL); - return tmap->tileflags; + // update the mappings + mappings_update(); } +//------------------------------------------------- +// mappings_update - update the mappings after +// a major change (flip x/y changes) +//------------------------------------------------- -/*************************************************************************** - TILEMAP RENDERING -***************************************************************************/ - -/*------------------------------------------------- - tilemap_draw_primask - draw a tilemap to the - destination with clipping; pixels apply - priority/priority_mask to the priority bitmap --------------------------------------------------*/ - -void tilemap_draw_primask(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT8 priority, UINT8 priority_mask) +void tilemap_t::mappings_update() { - UINT32 width, height; - blit_parameters blit; - int xpos, ypos; - - /* skip if disabled */ - if (!tmap->enable) - return; + // initialize all the mappings to invalid values + memset(m_memory_to_logical, 0xff, m_max_memory_index * sizeof(m_memory_to_logical[0])); -g_profiler.start(PROFILER_TILEMAP_DRAW); - /* configure the blit parameters based on the input parameters */ - configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask); - - /* if the whole map is dirty, mark it as such */ - if (tmap->all_tiles_dirty || gfx_elements_changed(tmap)) + // now iterate over all logical indexes and populate the memory index + for (logical_index logindex = 0; logindex < m_max_logical_index; logindex++) { - memset(tmap->tileflags, TILE_FLAG_DIRTY, tmap->max_logical_index); - tmap->all_tiles_dirty = FALSE; - tmap->gfx_used = 0; - } + UINT32 logical_col = logindex % m_cols; + UINT32 logical_row = logindex / m_cols; + tilemap_memory_index memindex = memory_index(logical_col, logical_row); - width = tmap->machine().primary_screen->width(); - height = tmap->machine().primary_screen->height(); + // apply tilemap flip to get the final location to store + if (m_attributes & TILEMAP_FLIPX) + logical_col = (m_cols - 1) - logical_col; + if (m_attributes & TILEMAP_FLIPY) + logical_row = (m_rows - 1) - logical_row; + UINT32 flipped_logindex = logical_row * m_cols + logical_col; - /* XY scrolling playfield */ - if (tmap->scrollrows == 1 && tmap->scrollcols == 1) - { - int scrollx = effective_rowscroll(tmap, 0, width); - int scrolly = effective_colscroll(tmap, 0, height); - - /* iterate to handle wraparound */ - for (ypos = scrolly - tmap->height; ypos <= blit.cliprect.max_y; ypos += tmap->height) - for (xpos = scrollx - tmap->width; xpos <= blit.cliprect.max_x; xpos += tmap->width) - tilemap_draw_instance(tmap, &blit, xpos, ypos); + // fill in entries in both arrays + m_memory_to_logical[memindex] = flipped_logindex; + m_logical_to_memory[flipped_logindex] = memindex; } - /* scrolling rows + vertical scroll */ - else if (tmap->scrollcols == 1) - { - const rectangle original_cliprect = blit.cliprect; - int rowheight = tmap->height / tmap->scrollrows; - int scrolly = effective_colscroll(tmap, 0, height); - int currow, nextrow; - - /* iterate over Y to handle wraparound */ - for (ypos = scrolly - tmap->height; ypos <= original_cliprect.max_y; ypos += tmap->height) - { - int const firstrow = MAX((original_cliprect.min_y - ypos) / rowheight, 0); - int const lastrow = MIN((original_cliprect.max_y - ypos) / rowheight, tmap->scrollrows - 1); + // mark the whole tilemap dirty + mark_all_dirty(); +} - /* iterate over rows in the tilemap */ - for (currow = firstrow; currow <= lastrow; currow = nextrow) - { - int scrollx = effective_rowscroll(tmap, currow, width); - /* scan forward until we find a non-matching row */ - for (nextrow = currow + 1; nextrow <= lastrow; nextrow++) - if (effective_rowscroll(tmap, nextrow, width) != scrollx) - break; - /* skip if disabled */ - if (scrollx == TILE_LINE_DISABLED) - continue; +//************************************************************************** +// TILE RENDERING +//************************************************************************** - /* update the cliprect just for this set of rows */ - blit.cliprect.min_y = currow * rowheight + ypos; - blit.cliprect.max_y = nextrow * rowheight - 1 + ypos; - sect_rect(&blit.cliprect, &original_cliprect); - - /* iterate over X to handle wraparound */ - for (xpos = scrollx - tmap->width; xpos <= original_cliprect.max_x; xpos += tmap->width) - tilemap_draw_instance(tmap, &blit, xpos, ypos); - } - } - } - - /* scrolling columns + horizontal scroll */ - else if (tmap->scrollrows == 1) +inline void tilemap_t::realize_all_dirty_tiles() +{ + // if all the tiles are marked dirty, or something in the gfx has changed, + // flush the dirty status to all tiles + if (m_all_tiles_dirty || gfx_elements_changed()) { - const rectangle original_cliprect = blit.cliprect; - int colwidth = tmap->width / tmap->scrollcols; - int scrollx = effective_rowscroll(tmap, 0, width); - int curcol, nextcol; - - /* iterate over columns in the tilemap */ - for (curcol = 0; curcol < tmap->scrollcols; curcol = nextcol) - { - int scrolly = effective_colscroll(tmap, curcol, height); - - /* scan forward until we find a non-matching column */ - for (nextcol = curcol + 1; nextcol < tmap->scrollcols; nextcol++) - if (effective_colscroll(tmap, nextcol, height) != scrolly) - break; - - /* skip if disabled */ - if (scrolly == TILE_LINE_DISABLED) - continue; - - /* iterate over X to handle wraparound */ - for (xpos = scrollx - tmap->width; xpos <= original_cliprect.max_x; xpos += tmap->width) - { - /* update the cliprect just for this set of columns */ - blit.cliprect.min_x = curcol * colwidth + xpos; - blit.cliprect.max_x = nextcol * colwidth - 1 + xpos; - sect_rect(&blit.cliprect, &original_cliprect); - - /* iterate over Y to handle wraparound */ - for (ypos = scrolly - tmap->height; ypos <= original_cliprect.max_y; ypos += tmap->height) - tilemap_draw_instance(tmap, &blit, xpos, ypos); - } - } + memset(m_tileflags, TILE_FLAG_DIRTY, m_max_logical_index); + m_all_tiles_dirty = false; + m_gfx_used = 0; } -g_profiler.stop(); } +//------------------------------------------------- +// pixmap_update - update the entire pixmap +//------------------------------------------------- -/*------------------------------------------------- - tilemap_draw_primask - draw a tilemap to the - destination with clipping and arbitrary - rotate/zoom; pixels apply priority/ - priority_mask to the priority bitmap --------------------------------------------------*/ - -void tilemap_draw_roz_primask(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, - UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, - int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask) +void tilemap_t::pixmap_update() { - blit_parameters blit; + // if the graphics changed, we need to mark everything dirty + if (gfx_elements_changed()) + mark_all_dirty(); -/* notes: - - startx and starty MUST be UINT32 for calculations to work correctly - - srcbitmap->width and height are assumed to be a power of 2 to speed up wraparound - */ - - /* skip if disabled */ - if (!tmap->enable) + // if everything is clean, do nothing + if (m_all_tiles_clean) return; - /* see if this is just a regular render and if so, do a regular render */ - if (incxx == (1 << 16) && incxy == 0 && incyx == 0 && incyy == (1 << 16) && wraparound) - { - tilemap_set_scrollx(tmap, 0, startx >> 16); - tilemap_set_scrolly(tmap, 0, starty >> 16); - tilemap_draw(dest, cliprect, tmap, flags, priority); - return; - } - -g_profiler.start(PROFILER_TILEMAP_DRAW_ROZ); - /* configure the blit parameters */ - configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask); - - /* get the full pixmap for the tilemap */ - tilemap_get_pixmap(tmap); - - /* then do the roz copy */ - tilemap_draw_roz_core(tmap, &blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); -g_profiler.stop(); -} - - - -/*************************************************************************** - INDEXED TILEMAP HANDLING -***************************************************************************/ - -/*------------------------------------------------- - tilemap_count - return the number of tilemaps --------------------------------------------------*/ - -int tilemap_count(running_machine &machine) -{ - tilemap_t *tmap; - int count = 0; - - if (machine.tilemap_data == NULL) - return 0; +g_profiler.start(PROFILER_TILEMAP_DRAW); - /* find by the tilemap index */ - for (tmap = machine.tilemap_data->list; tmap != NULL; tmap = tmap->next) - count++; - return count; -} + // flush the dirty state to all tiles as appropriate + realize_all_dirty_tiles(); + // iterate over rows and columns + logical_index logindex = 0; + for (int row = 0; row < m_rows; row++) + for (int col = 0; col < m_cols; col++, logindex++) + if (m_tileflags[logindex] == TILE_FLAG_DIRTY) + tile_update(logindex, col, row); -/*------------------------------------------------- - tilemap_size_by_index - return the size of an - indexed tilemap --------------------------------------------------*/ + // mark it all clean + m_all_tiles_clean = true; -void tilemap_size_by_index(running_machine &machine, int number, UINT32 *width, UINT32 *height) -{ - tilemap_t *tmap = indexed_tilemap(machine, number); - *width = tmap->width; - *height = tmap->height; +g_profiler.stop(); } -/*------------------------------------------------- - tilemap_draw_by_index - render an indexed - tilemap with fixed characteristics (no - priority) --------------------------------------------------*/ +//------------------------------------------------- +// tile_update - update a single dirty tile +//------------------------------------------------- -void tilemap_draw_by_index(running_machine &machine, bitmap_t *dest, int number, UINT32 scrollx, UINT32 scrolly) +void tilemap_t::tile_update(logical_index logindex, UINT32 col, UINT32 row) { - tilemap_t *tmap = indexed_tilemap(machine, number); - blit_parameters blit; - int xpos,ypos; - - /* set up for the blit, using hard-coded parameters (no priority, etc) */ - configure_blit_parameters(&blit, tmap, dest, NULL, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0, 0xff); +g_profiler.start(PROFILER_TILEMAP_UPDATE); - /* compute the effective scroll positions */ - scrollx = tmap->width - scrollx % tmap->width; - scrolly = tmap->height - scrolly % tmap->height; + // call the get info callback for the associated memory index + tilemap_memory_index memindex = m_logical_to_memory[logindex]; + m_tile_get_info(m_tileinfo, memindex, m_user_data); + + // apply the global tilemap flip to the returned flip flags + UINT32 flags = m_tileinfo.flags ^ (m_attributes & 0x03); + + // draw the tile, using either direct or transparent + UINT32 x0 = m_tilewidth * col; + UINT32 y0 = m_tileheight * row; + m_tileflags[logindex] = tile_draw(m_tileinfo.pen_data + m_pen_data_offset, x0, y0, + m_tileinfo.palette_base, m_tileinfo.category, m_tileinfo.group, flags, m_tileinfo.pen_mask); + + // if mask data is specified, apply it + if ((flags & (TILE_FORCE_LAYER0 | TILE_FORCE_LAYER1 | TILE_FORCE_LAYER2)) == 0 && m_tileinfo.mask_data != NULL) + m_tileflags[logindex] = tile_apply_bitmask(m_tileinfo.mask_data, x0, y0, m_tileinfo.category, flags); - /* if the whole map is dirty, mark it as such */ - if (tmap->all_tiles_dirty || gfx_elements_changed(tmap)) + // track which gfx have been used for this tilemap + if (m_tileinfo.gfxnum != 0xff && (m_gfx_used & (1 << m_tileinfo.gfxnum)) == 0) { - memset(tmap->tileflags, TILE_FLAG_DIRTY, tmap->max_logical_index); - tmap->all_tiles_dirty = FALSE; - tmap->gfx_used = 0; + m_gfx_used |= 1 << m_tileinfo.gfxnum; + m_gfx_dirtyseq[m_tileinfo.gfxnum] = machine().gfx[m_tileinfo.gfxnum]->dirtyseq; } - /* iterate to handle wraparound */ - for (ypos = scrolly - tmap->height; ypos <= blit.cliprect.max_y; ypos += tmap->height) - for (xpos = scrollx - tmap->width; xpos <= blit.cliprect.max_x; xpos += tmap->width) - tilemap_draw_instance(tmap, &blit, xpos, ypos); -} - - - -/*************************************************************************** - COMMON LOGICAL-TO-MEMORY MAPPERS -***************************************************************************/ - -/*------------------------------------------------- - tilemap_scan_rows - tilemap_scan_rows_flip_x - tilemap_scan_rows_flip_y - tilemap_scan_rows_flip_xy - scan in row-major - order with optional flipping --------------------------------------------------*/ - -TILEMAP_MAPPER( tilemap_scan_rows ) -{ - return row * num_cols + col; -} - -TILEMAP_MAPPER( tilemap_scan_rows_flip_x ) -{ - return row * num_cols + (num_cols - 1 - col); -} - -TILEMAP_MAPPER( tilemap_scan_rows_flip_y ) -{ - return (num_rows - 1 - row) * num_cols + col; -} - -TILEMAP_MAPPER( tilemap_scan_rows_flip_xy ) -{ - return (num_rows - 1 - row) * num_cols + (num_cols - 1 - col); +g_profiler.stop(); } -/*------------------------------------------------- - tilemap_scan_cols - tilemap_scan_cols_flip_x - tilemap_scan_cols_flip_y - tilemap_scan_cols_flip_xy - scan in column- - major order with optional flipping --------------------------------------------------*/ - -TILEMAP_MAPPER( tilemap_scan_cols ) -{ - return col * num_rows + row; -} +//------------------------------------------------- +// tile_draw - draw a single tile to the +// tilemap's internal pixmap, using the pen as +// the pen_to_flags lookup value, and adding +// the palette_base +//------------------------------------------------- -TILEMAP_MAPPER( tilemap_scan_cols_flip_x ) +UINT8 tilemap_t::tile_draw(const UINT8 *pendata, UINT32 x0, UINT32 y0, UINT32 palette_base, UINT8 category, UINT8 group, UINT8 flags, UINT8 pen_mask) { - return (num_cols - 1 - col) * num_rows + row; -} - -TILEMAP_MAPPER( tilemap_scan_cols_flip_y ) -{ - return col * num_rows + (num_rows - 1 - row); -} + // OR in the force layer flags + category |= flags & (TILE_FORCE_LAYER0 | TILE_FORCE_LAYER1 | TILE_FORCE_LAYER2); -TILEMAP_MAPPER( tilemap_scan_cols_flip_xy ) -{ - return (num_cols - 1 - col) * num_rows + (num_rows - 1 - row); -} + // if we're vertically flipped, point to the bottom row and work backwards + int dy0 = 1; + if (flags & TILE_FLIPY) + { + y0 += m_tileheight - 1; + dy0 = -1; + } + // if we're horizontally flipped, point to the rightmost column and work backwards + int dx0 = 1; + if (flags & TILE_FLIPX) + { + x0 += m_tilewidth - 1; + dx0 = -1; + } + // iterate over rows + const UINT8 *penmap = m_pen_to_flags + group * MAX_PEN_TO_FLAGS; + UINT8 andmask = ~0, ormask = 0; + for (int ty = 0; ty < m_tileheight; ty++) + { + UINT16 *pixptr = &m_pixmap.pix16(y0, x0); + UINT8 *flagsptr = &m_flagsmap.pix8(y0, x0); -/*************************************************************************** - SYSTEM MANAGEMENT HELPERS -***************************************************************************/ + // pre-advance to the next row + y0 += dy0; -/*------------------------------------------------- - tilemap_exit - free memory allocated by the - tilemap system --------------------------------------------------*/ - -static void tilemap_exit(running_machine &machine) -{ - tilemap_private *tilemap_data = machine.tilemap_data; - - /* free all the tilemaps in the list */ - if (tilemap_data != NULL) - while (tilemap_data->list != NULL) + // 8bpp data + for (int tx = 0, xoffs = 0; tx < m_tilewidth; tx++, xoffs += dx0) { - tilemap_t *next = tilemap_data->list->next; - tilemap_dispose(tilemap_data->list); - tilemap_data->list = next; + UINT8 pen = (*pendata++) & pen_mask; + UINT8 map = penmap[pen]; + pixptr[xoffs] = palette_base + pen; + flagsptr[xoffs] = map | category; + andmask &= map; + ormask |= map; } + } + return andmask ^ ormask; } -/*------------------------------------------------- - tilemap_postload - after loading a save state - invalidate everything --------------------------------------------------*/ +//------------------------------------------------- +// tile_apply_bitmask - apply a bitmask to an +// already-rendered tile by modifying the +// flagsmap appropriately +//------------------------------------------------- -static void tilemap_postload(tilemap_t *tmap) +UINT8 tilemap_t::tile_apply_bitmask(const UINT8 *maskdata, UINT32 x0, UINT32 y0, UINT8 category, UINT8 flags) { - mappings_update(tmap); -} - + // if we're vertically flipped, point to the bottom row and work backwards + int dy0 = 1; + if (flags & TILE_FLIPY) + { + y0 += m_tileheight - 1; + dy0 = -1; + } -/*------------------------------------------------- - tilemap_dispose - dispose of a tilemap --------------------------------------------------*/ + // if we're horizontally flipped, point to the rightmost column and work backwards + int dx0 = 1; + if (flags & TILE_FLIPX) + { + x0 += m_tilewidth - 1; + dx0 = -1; + } -static void tilemap_dispose(tilemap_t *tmap) -{ - tilemap_t **tmapptr; + // iterate over rows + UINT8 andmask = ~0, ormask = 0; + int bitoffs = 0; + for (int ty = 0; ty < m_tileheight; ty++) + { + // pre-advance to the next row + UINT8 *flagsptr = &m_flagsmap.pix8(y0, x0); + y0 += dy0; - /* walk the list of tilemaps; when we find ourself, remove it */ - for (tmapptr = &tmap->machine().tilemap_data->list; *tmapptr != NULL; tmapptr = &(*tmapptr)->next) - if (*tmapptr == tmap) + // anywhere the bitmask is 0 should be transparent + for (int tx = 0, xoffs = 0; tx < m_tilewidth; tx++, xoffs += dx0) { - *tmapptr = tmap->next; - break; - } - - /* free allocated memory */ - auto_free(tmap->machine(), tmap->pen_to_flags); - auto_free(tmap->machine(), tmap->tileflags); - auto_free(tmap->machine(), tmap->flagsmap); - auto_free(tmap->machine(), tmap->pixmap); - auto_free(tmap->machine(), tmap->colscroll); - auto_free(tmap->machine(), tmap->rowscroll); - auto_free(tmap->machine(), tmap->logical_to_memory); - auto_free(tmap->machine(), tmap->memory_to_logical); - auto_free(tmap->machine(), tmap); -} - - - -/*************************************************************************** - LOGICAL <-> MEMORY INDEX MAPPING -***************************************************************************/ + UINT8 map = flagsptr[xoffs]; -/*------------------------------------------------- - mappings_create - allocate memory for the - mapping tables and compute their extents --------------------------------------------------*/ - -static void mappings_create(tilemap_t *tmap) -{ - UINT32 col, row; - - /* compute the maximum logical index */ - tmap->max_logical_index = tmap->rows * tmap->cols; - - /* compute the maximum memory index */ - tmap->max_memory_index = 0; - for (row = 0; row < tmap->rows; row++) - for (col = 0; col < tmap->cols; col++) - { - tilemap_memory_index memindex = (*tmap->mapper)(col, row, tmap->cols, tmap->rows); - tmap->max_memory_index = MAX(tmap->max_memory_index, memindex); + if ((maskdata[bitoffs / 8] & (0x80 >> (bitoffs & 7))) == 0) + map = flagsptr[xoffs] = TILEMAP_PIXEL_TRANSPARENT | category; + andmask &= map; + ormask |= map; + bitoffs++; } - tmap->max_memory_index++; - - /* allocate the necessary mappings */ - tmap->memory_to_logical = auto_alloc_array(tmap->machine(), tilemap_logical_index, tmap->max_memory_index); - tmap->logical_to_memory = auto_alloc_array(tmap->machine(), tilemap_memory_index, tmap->max_logical_index); - - /* update the mappings */ - mappings_update(tmap); -} - - -/*------------------------------------------------- - mappings_update - update the mappings after - a major change (flip x/y changes) --------------------------------------------------*/ - -static void mappings_update(tilemap_t *tmap) -{ - tilemap_logical_index logindex; - tilemap_memory_index memindex; - - /* initialize all the mappings to invalid values */ - for (memindex = 0; memindex < tmap->max_memory_index; memindex++) - tmap->memory_to_logical[memindex] = -1; - - /* now iterate over all logical indexes and populate the memory index */ - for (logindex = 0; logindex < tmap->max_logical_index; logindex++) - { - UINT32 logical_col = logindex % tmap->cols; - UINT32 logical_row = logindex / tmap->cols; - memindex = (*tmap->mapper)(logical_col, logical_row, tmap->cols, tmap->rows); - UINT32 flipped_logindex; - - /* apply tilemap flip to get the final location to store */ - if (tmap->attributes & TILEMAP_FLIPX) - logical_col = (tmap->cols - 1) - logical_col; - if (tmap->attributes & TILEMAP_FLIPY) - logical_row = (tmap->rows - 1) - logical_row; - flipped_logindex = logical_row * tmap->cols + logical_col; - - /* fill in entries in both arrays */ - tmap->memory_to_logical[memindex] = flipped_logindex; - tmap->logical_to_memory[flipped_logindex] = memindex; } - - /* mark the whole tilemap dirty */ - tilemap_mark_all_tiles_dirty(tmap); + return andmask ^ ormask; } -/*************************************************************************** - TILE RENDERING -***************************************************************************/ - -/*------------------------------------------------- - pixmap_update - update the portion of the - pixmap described by the cliprect --------------------------------------------------*/ - -static void pixmap_update(tilemap_t *tmap, const rectangle *cliprect) -{ - int mincol, maxcol, minrow, maxrow; - int row, col; - - /* if the graphics changed, we need to mark everything dirty */ - if (gfx_elements_changed(tmap)) - tilemap_mark_all_tiles_dirty(tmap); - - /* if everything is clean, do nothing */ - if (tmap->all_tiles_clean) - return; +//************************************************************************** +// DRAWING HELPERS +//************************************************************************** + +//------------------------------------------------- +// configure_blit_parameters - fill in the +// standard blit parameters based on the input +// data; this code is shared by normal, roz, +// and indexed drawing code +//------------------------------------------------- + +void tilemap_t::configure_blit_parameters(blit_parameters &blit, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ + // set the target bitmap + blit.cliprect = cliprect; + + // set the priority code and alpha + blit.tilemap_priority_code = priority | (priority_mask << 8) | (m_palette_offset << 16); + blit.alpha = (flags & TILEMAP_DRAW_ALPHA_FLAG) ? (flags >> 24) : 0xff; + + // tile priority; unless otherwise specified, draw anything in layer 0 + blit.mask = TILEMAP_PIXEL_CATEGORY_MASK; + blit.value = flags & TILEMAP_PIXEL_CATEGORY_MASK; -g_profiler.start(PROFILER_TILEMAP_DRAW); + // if no layers specified, draw layer 0 + if ((flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2)) == 0) + flags |= TILEMAP_DRAW_LAYER0; - /* compute which columns and rows to update */ - if (cliprect != NULL) - { - mincol = cliprect->min_x / tmap->tilewidth; - maxcol = cliprect->max_x / tmap->tilewidth; - minrow = cliprect->min_y / tmap->tileheight; - maxrow = cliprect->max_y / tmap->tileheight; - } - else - { - mincol = minrow = 0; - maxcol = tmap->cols - 1; - maxrow = tmap->rows - 1; - } + // OR in the bits from the draw masks + blit.mask |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); + blit.value |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); - /* if the whole map is dirty, mark it as such */ - if (tmap->all_tiles_dirty) + // for all-opaque rendering, don't check any of the layer bits + if (flags & TILEMAP_DRAW_OPAQUE) { - memset(tmap->tileflags, TILE_FLAG_DIRTY, tmap->max_logical_index); - tmap->all_tiles_dirty = FALSE; - tmap->gfx_used = 0; + blit.mask &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); + blit.value &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); } - /* iterate over rows */ - for (row = minrow; row <= maxrow; row++) + // don't check category if requested + if (flags & TILEMAP_DRAW_ALL_CATEGORIES) { - tilemap_logical_index logindex = row * tmap->cols; - - /* iterate over colums */ - for (col = mincol; col <= maxcol; col++) - if (tmap->tileflags[logindex + col] == TILE_FLAG_DIRTY) - tile_update(tmap, logindex + col, col, row); + blit.mask &= ~TILEMAP_PIXEL_CATEGORY_MASK; + blit.value &= ~TILEMAP_PIXEL_CATEGORY_MASK; } - - /* mark it all clean */ - if (mincol == 0 && minrow == 0 && maxcol == tmap->cols - 1 && maxcol == tmap->rows - 1) - tmap->all_tiles_clean = TRUE; - -g_profiler.stop(); } -/*------------------------------------------------- - tile_update - update a single dirty tile --------------------------------------------------*/ - -static void tile_update(tilemap_t *tmap, tilemap_logical_index logindex, UINT32 col, UINT32 row) -{ - UINT32 x0 = tmap->tilewidth * col; - UINT32 y0 = tmap->tileheight * row; - tilemap_memory_index memindex; - UINT32 flags; - -g_profiler.start(PROFILER_TILEMAP_UPDATE); - - /* call the get info callback for the associated memory index */ - memindex = tmap->logical_to_memory[logindex]; - (*tmap->tile_get_info)(*(running_machine *)tmap->tile_get_info_object, &tmap->tileinfo, memindex, tmap->user_data); - - /* apply the global tilemap flip to the returned flip flags */ - flags = tmap->tileinfo.flags ^ (tmap->attributes & 0x03); - - /* draw the tile, using either direct or transparent */ - tmap->tileflags[logindex] = tile_draw(tmap, tmap->tileinfo.pen_data + tmap->pen_data_offset, x0, y0, - tmap->tileinfo.palette_base, tmap->tileinfo.category, tmap->tileinfo.group, flags, tmap->tileinfo.pen_mask); - - /* if mask data is specified, apply it */ - if ((flags & (TILE_FORCE_LAYER0 | TILE_FORCE_LAYER1 | TILE_FORCE_LAYER2)) == 0 && tmap->tileinfo.mask_data != NULL) - tmap->tileflags[logindex] = tile_apply_bitmask(tmap, tmap->tileinfo.mask_data, x0, y0, tmap->tileinfo.category, flags); +//------------------------------------------------- +// draw_common - draw a tilemap to the +// destination with clipping; pixels apply +// priority/priority_mask to the priority bitmap +//------------------------------------------------- - /* track which gfx have been used for this tilemap */ - if (tmap->tileinfo.gfxnum != 0xff && (tmap->gfx_used & (1 << tmap->tileinfo.gfxnum)) == 0) - { - tmap->gfx_used |= 1 << tmap->tileinfo.gfxnum; - tmap->gfx_dirtyseq[tmap->tileinfo.gfxnum] = tmap->machine().gfx[tmap->tileinfo.gfxnum]->dirtyseq; - } - -g_profiler.stop(); -} - - -/*------------------------------------------------- - tile_draw - draw a single tile to the - tilemap's internal pixmap, using the pen as - the pen_to_flags lookup value, and adding - the palette_base --------------------------------------------------*/ - -static UINT8 tile_draw(tilemap_t *tmap, const UINT8 *pendata, UINT32 x0, UINT32 y0, UINT32 palette_base, UINT8 category, UINT8 group, UINT8 flags, UINT8 pen_mask) -{ - const UINT8 *penmap = tmap->pen_to_flags + group * MAX_PEN_TO_FLAGS; - bitmap_t *flagsmap = tmap->flagsmap; - bitmap_t *pixmap = tmap->pixmap; - int height = tmap->tileheight; - int width = tmap->tilewidth; - UINT8 andmask = ~0, ormask = 0; - int dx0 = 1, dy0 = 1; - int tx, ty; +template +void tilemap_t::draw_common(_BitmapClass &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ + // skip if disabled + if (!m_enable) + return; - /* OR in the force layer flags */ - category |= flags & (TILE_FORCE_LAYER0 | TILE_FORCE_LAYER1 | TILE_FORCE_LAYER2); +g_profiler.start(PROFILER_TILEMAP_DRAW); + // configure the blit parameters based on the input parameters + blit_parameters blit; + configure_blit_parameters(blit, cliprect, flags, priority, priority_mask); - /* if we're vertically flipped, point to the bottom row and work backwards */ - if (flags & TILE_FLIPY) - { - y0 += height - 1; - dy0 = -1; - } + // flush the dirty state to all tiles as appropriate + realize_all_dirty_tiles(); - /* if we're horizontally flipped, point to the rightmost column and work backwards */ - if (flags & TILE_FLIPX) - { - x0 += width - 1; - dx0 = -1; - } + UINT32 width = machine().primary_screen->width(); + UINT32 height = machine().primary_screen->height(); - /* in 4bpp mode, we draw in groups of 2 pixels, so halve the width now */ - if (flags & TILE_4BPP) + // XY scrolling playfield + if (m_scrollrows == 1 && m_scrollcols == 1) { - assert(width % 2 == 0); - width /= 2; + // iterate to handle wraparound + int scrollx = effective_rowscroll(0, width); + int scrolly = effective_colscroll(0, height); + for (int ypos = scrolly - m_height; ypos <= blit.cliprect.max_y; ypos += m_height) + for (int xpos = scrollx - m_width; xpos <= blit.cliprect.max_x; xpos += m_width) + draw_instance(dest, blit, xpos, ypos); } - /* iterate over rows */ - for (ty = 0; ty < height; ty++) + // scrolling rows + vertical scroll + else if (m_scrollcols == 1) { - UINT16 *pixptr = BITMAP_ADDR16(pixmap, y0, x0); - UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0); - int xoffs = 0; - - /* pre-advance to the next row */ - y0 += dy0; + const rectangle original_cliprect = blit.cliprect; - /* 8bpp data */ - if (!(flags & TILE_4BPP)) + // iterate over Y to handle wraparound + int rowheight = m_height / m_scrollrows; + int scrolly = effective_colscroll(0, height); + for (int ypos = scrolly - m_height; ypos <= original_cliprect.max_y; ypos += m_height) { - for (tx = 0; tx < width; tx++) - { - UINT8 pen = (*pendata++) & pen_mask; - UINT8 map = penmap[pen]; - pixptr[xoffs] = palette_base + pen; - flagsptr[xoffs] = map | category; - andmask &= map; - ormask |= map; - xoffs += dx0; - } - } + int const firstrow = MAX((original_cliprect.min_y - ypos) / rowheight, 0); + int const lastrow = MIN((original_cliprect.max_y - ypos) / rowheight, m_scrollrows - 1); - /* 4bpp data */ - else - { - for (tx = 0; tx < width; tx++) + // iterate over rows in the tilemap + int nextrow; + for (int currow = firstrow; currow <= lastrow; currow = nextrow) { - UINT8 data = *pendata++; - UINT8 pen, map; - - pen = (data & 0x0f) & pen_mask; - map = penmap[pen]; - pixptr[xoffs] = palette_base + pen; - flagsptr[xoffs] = map | category; - andmask &= map; - ormask |= map; - xoffs += dx0; - - pen = (data >> 4) & pen_mask; - map = penmap[pen]; - pixptr[xoffs] = palette_base + pen; - flagsptr[xoffs] = map | category; - andmask &= map; - ormask |= map; - xoffs += dx0; - } - } - } - return andmask ^ ormask; -} - + // scan forward until we find a non-matching row + int scrollx = effective_rowscroll(currow, width); + for (nextrow = currow + 1; nextrow <= lastrow; nextrow++) + if (effective_rowscroll(nextrow, width) != scrollx) + break; -/*------------------------------------------------- - tile_apply_bitmask - apply a bitmask to an - already-rendered tile by modifying the - flagsmap appropriately --------------------------------------------------*/ - -static UINT8 tile_apply_bitmask(tilemap_t *tmap, const UINT8 *maskdata, UINT32 x0, UINT32 y0, UINT8 category, UINT8 flags) -{ - bitmap_t *flagsmap = tmap->flagsmap; - int height = tmap->tileheight; - int width = tmap->tilewidth; - UINT8 andmask = ~0, ormask = 0; - int dx0 = 1, dy0 = 1; - int bitoffs = 0; - int tx, ty; + // skip if disabled + if (scrollx == TILE_LINE_DISABLED) + continue; - /* if we're vertically flipped, point to the bottom row and work backwards */ - if (flags & TILE_FLIPY) - { - y0 += height - 1; - dy0 = -1; - } + // update the cliprect just for this set of rows + blit.cliprect.min_y = currow * rowheight + ypos; + blit.cliprect.max_y = nextrow * rowheight - 1 + ypos; + blit.cliprect &= original_cliprect; - /* if we're horizontally flipped, point to the rightmost column and work backwards */ - if (flags & TILE_FLIPX) - { - x0 += width - 1; - dx0 = -1; + // iterate over X to handle wraparound + for (int xpos = scrollx - m_width; xpos <= original_cliprect.max_x; xpos += m_width) + draw_instance(dest, blit, xpos, ypos); + } + } } - /* iterate over rows */ - for (ty = 0; ty < height; ty++) + // scrolling columns + horizontal scroll + else if (m_scrollrows == 1) { - UINT8 *flagsptr = BITMAP_ADDR8(flagsmap, y0, x0); - int xoffs = 0; + const rectangle original_cliprect = blit.cliprect; - /* pre-advance to the next row */ - y0 += dy0; + // iterate over columns in the tilemap + int scrollx = effective_rowscroll(0, width); + int colwidth = m_width / m_scrollcols; + int nextcol; + for (int curcol = 0; curcol < m_scrollcols; curcol = nextcol) + { + // scan forward until we find a non-matching column + int scrolly = effective_colscroll(curcol, height); + for (nextcol = curcol + 1; nextcol < m_scrollcols; nextcol++) + if (effective_colscroll(nextcol, height) != scrolly) + break; - /* anywhere the bitmask is 0 should be transparent */ - for (tx = 0; tx < width; tx++) - { - UINT8 map = flagsptr[xoffs]; + // skip if disabled + if (scrolly == TILE_LINE_DISABLED) + continue; - if ((maskdata[bitoffs / 8] & (0x80 >> (bitoffs & 7))) == 0) - map = flagsptr[xoffs] = TILEMAP_PIXEL_TRANSPARENT | category; - andmask &= map; - ormask |= map; - xoffs += dx0; - bitoffs++; + // iterate over X to handle wraparound + for (int xpos = scrollx - m_width; xpos <= original_cliprect.max_x; xpos += m_width) + { + // update the cliprect just for this set of columns + blit.cliprect.min_x = curcol * colwidth + xpos; + blit.cliprect.max_x = nextcol * colwidth - 1 + xpos; + blit.cliprect &= original_cliprect; + + // iterate over Y to handle wraparound + for (int ypos = scrolly - m_height; ypos <= original_cliprect.max_y; ypos += m_height) + draw_instance(dest, blit, xpos, ypos); + } } } - return andmask ^ ormask; +g_profiler.stop(); } +void tilemap_t::draw(bitmap_ind16 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ draw_common(dest, cliprect, flags, priority, priority_mask); } +void tilemap_t::draw(bitmap_rgb32 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ draw_common(dest, cliprect, flags, priority, priority_mask); } -/*************************************************************************** - DRAWING HELPERS -***************************************************************************/ - -/*------------------------------------------------- - configure_blit_parameters - fill in the - standard blit parameters based on the input - data; this code is shared by normal, roz, - and indexed drawing code --------------------------------------------------*/ - -static void configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_t *dest, const rectangle *cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask) -{ - /* start with nothing */ - memset(blit, 0, sizeof(*blit)); - - /* set the target bitmap */ - blit->bitmap = dest; - - /* if we have a cliprect, copy */ - if (cliprect != NULL) - blit->cliprect = *cliprect; - /* otherwise, make one up */ - else - { - blit->cliprect.min_x = blit->cliprect.min_y = 0; - blit->cliprect.max_x = dest->width - 1; - blit->cliprect.max_y = dest->height - 1; - } +//------------------------------------------------- +// draw_roz - draw a tilemap to the destination +// with clipping and arbitrary rotate/zoom; pixels +// apply priority/priority_mask to the priority +// bitmap +//------------------------------------------------- - /* set the priority code and alpha */ - blit->tilemap_priority_code = priority | (priority_mask << 8) | (tmap->palette_offset << 16); - blit->alpha = (flags & TILEMAP_DRAW_ALPHA_FLAG) ? (flags >> 24) : 0xff; +template +void tilemap_t::draw_roz_common(_BitmapClass &dest, const rectangle &cliprect, + UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, + bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ +// notes: +// - startx and starty MUST be UINT32 for calculations to work correctly +// - srcbim_width and height are assumed to be a power of 2 to speed up wraparound - /* if no destination, just render priority */ - if (dest == NULL) - { - blit->draw_masked = scanline_draw_masked_null; - blit->draw_opaque = scanline_draw_opaque_null; - } + // skip if disabled + if (!m_enable) + return; - /* otherwise get the appropriate callbacks for the format and flags */ - else + // see if this is just a regular render and if so, do a regular render + if (incxx == (1 << 16) && incxy == 0 && incyx == 0 && incyy == (1 << 16) && wraparound) { - switch (dest->format) - { - case BITMAP_FORMAT_RGB32: - blit->draw_masked = (blit->alpha < 0xff) ? scanline_draw_masked_rgb32_alpha : scanline_draw_masked_rgb32; - blit->draw_opaque = (blit->alpha < 0xff) ? scanline_draw_opaque_rgb32_alpha : scanline_draw_opaque_rgb32; - break; - - case BITMAP_FORMAT_RGB15: - blit->draw_masked = (blit->alpha < 0xff) ? scanline_draw_masked_rgb16_alpha : scanline_draw_masked_rgb16; - blit->draw_opaque = (blit->alpha < 0xff) ? scanline_draw_opaque_rgb16_alpha : scanline_draw_opaque_rgb16; - break; - - case BITMAP_FORMAT_INDEXED16: - blit->draw_masked = scanline_draw_masked_ind16; - blit->draw_opaque = scanline_draw_opaque_ind16; - break; - - default: - fatalerror("tilemap_draw_primask: Invalid bitmap format"); - break; - } + set_scrollx(0, startx >> 16); + set_scrolly(0, starty >> 16); + draw(dest, cliprect, flags, priority, priority_mask); + return; } - /* tile priority; unless otherwise specified, draw anything in layer 0 */ - blit->mask = TILEMAP_PIXEL_CATEGORY_MASK; - blit->value = flags & TILEMAP_PIXEL_CATEGORY_MASK; +g_profiler.start(PROFILER_TILEMAP_DRAW_ROZ); + // configure the blit parameters + blit_parameters blit; + configure_blit_parameters(blit, cliprect, flags, priority, priority_mask); - /* if no layers specified, draw layer 0 */ - if ((flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2)) == 0) - flags |= TILEMAP_DRAW_LAYER0; + // get the full pixmap for the tilemap + pixmap(); - /* OR in the bits from the draw masks */ - blit->mask |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); - blit->value |= flags & (TILEMAP_DRAW_LAYER0 | TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_LAYER2); + // then do the roz copy + draw_roz_core(dest, blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); +g_profiler.stop(); +} - /* for all-opaque rendering, don't check any of the layer bits */ - if (flags & TILEMAP_DRAW_OPAQUE) - { - blit->mask &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); - blit->value &= ~(TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1 | TILEMAP_PIXEL_LAYER2); - } +void tilemap_t::draw_roz(bitmap_ind16 &dest, const rectangle &cliprect, + UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, + bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ draw_roz_common(dest, cliprect, startx, starty, incxx, incxy, incyx, incyy, wraparound, flags, priority, priority_mask); } - /* don't check category if requested */ - if (flags & TILEMAP_DRAW_ALL_CATEGORIES) - { - blit->mask &= ~TILEMAP_PIXEL_CATEGORY_MASK; - blit->value &= ~TILEMAP_PIXEL_CATEGORY_MASK; - } -} +void tilemap_t::draw_roz(bitmap_rgb32 &dest, const rectangle &cliprect, + UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, + bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask) +{ draw_roz_common(dest, cliprect, startx, starty, incxx, incxy, incyx, incyy, wraparound, flags, priority, priority_mask); } -/*------------------------------------------------- - tilemap_draw_instance - draw a single - instance of the tilemap to the internal - pixmap at the given xpos,ypos --------------------------------------------------*/ - -static void tilemap_draw_instance(tilemap_t *tmap, const blit_parameters *blit, int xpos, int ypos) -{ - bitmap_t *priority_bitmap = tmap->machine().priority_bitmap; - bitmap_t *dest = blit->bitmap; - const UINT16 *source_baseaddr; - const UINT8 *mask_baseaddr; - void *dest_baseaddr = NULL; - UINT8 *priority_baseaddr; - int dest_line_pitch_bytes = 0; - int dest_bytespp = 0; - int mincol, maxcol; - int x1, y1, x2, y2; - int y, nexty; - - /* clip destination coordinates to the tilemap */ - /* note that x2/y2 are exclusive, not inclusive */ - x1 = MAX(xpos, blit->cliprect.min_x); - x2 = MIN(xpos + (int)tmap->width, blit->cliprect.max_x + 1); - y1 = MAX(ypos, blit->cliprect.min_y); - y2 = MIN(ypos + (int)tmap->height, blit->cliprect.max_y + 1); +//------------------------------------------------- +// draw_instance - draw a single instance of the +// tilemap to the internal pixmap at the given +// xpos,ypos +//------------------------------------------------- + +template +void tilemap_t::draw_instance(_BitmapClass &dest, const blit_parameters &blit, int xpos, int ypos) +{ + // clip destination coordinates to the tilemap + // note that x2/y2 are exclusive, not inclusive + int x1 = MAX(xpos, blit.cliprect.min_x); + int x2 = MIN(xpos + (int)m_width, blit.cliprect.max_x + 1); + int y1 = MAX(ypos, blit.cliprect.min_y); + int y2 = MIN(ypos + (int)m_height, blit.cliprect.max_y + 1); - /* if totally clipped, stop here */ + // if totally clipped, stop here if (x1 >= x2 || y1 >= y2) return; - /* look up priority and destination base addresses for y1 */ - priority_baseaddr = BITMAP_ADDR8(priority_bitmap, y1, xpos); - if (dest != NULL) + // look up priority and destination base addresses for y1 + bitmap_ind8 &priority_bitmap = machine().priority_bitmap; + UINT8 *priority_baseaddr = &priority_bitmap.pix8(y1, xpos); + typename _BitmapClass::pixel_t *dest_baseaddr = NULL; + int dest_rowpixels = 0; + if (dest.valid()) { - dest_bytespp = dest->bpp / 8; - dest_line_pitch_bytes = dest->rowpixels * dest_bytespp; - dest_baseaddr = (UINT8 *)dest->base + (y1 * dest->rowpixels + xpos) * dest_bytespp; + dest_rowpixels = dest.rowpixels(); + dest_baseaddr = &dest.pix(y1, xpos); } - /* convert screen coordinates to source tilemap coordinates */ + // convert screen coordinates to source tilemap coordinates x1 -= xpos; y1 -= ypos; x2 -= xpos; y2 -= ypos; - /* get tilemap pixels */ - source_baseaddr = BITMAP_ADDR16(tmap->pixmap, y1, 0); - mask_baseaddr = BITMAP_ADDR8(tmap->flagsmap, y1, 0); - - /* get start/stop columns, rounding outward */ - mincol = x1 / tmap->tilewidth; - maxcol = (x2 + tmap->tilewidth - 1) / tmap->tilewidth; - - /* set up row counter */ - y = y1; - nexty = tmap->tileheight * (y1 / tmap->tileheight) + tmap->tileheight; + // get tilemap pixels + const UINT16 *source_baseaddr = &m_pixmap.pix16(y1); + const UINT8 *mask_baseaddr = &m_flagsmap.pix8(y1); + + // get start/stop columns, rounding outward + int mincol = x1 / m_tilewidth; + int maxcol = (x2 + m_tilewidth - 1) / m_tilewidth; + + // set up row counter + int y = y1; + int nexty = m_tileheight * (y1 / m_tileheight) + m_tileheight; nexty = MIN(nexty, y2); - /* loop over tilemap rows */ + // loop over tilemap rows for (;;) { - int row = y / tmap->tileheight; - trans_t prev_trans = WHOLLY_TRANSPARENT; - trans_t cur_trans; + int row = y / m_tileheight; int x_start = x1; - int column; - /* iterate across the applicable tilemap columns */ - for (column = mincol; column <= maxcol; column++) + // iterate across the applicable tilemap columns + trans_t prev_trans = WHOLLY_TRANSPARENT; + trans_t cur_trans; + for (int column = mincol; column <= maxcol; column++) { int x_end; - /* we don't actually render the last column; it is always just used for flushing */ + // we don't actually render the last column; it is always just used for flushing if (column == maxcol) cur_trans = WHOLLY_TRANSPARENT; - /* for other columns we look up the transparency information */ + // for other columns we look up the transparency information else { - tilemap_logical_index logindex = row * tmap->cols + column; + logical_index logindex = row * m_cols + column; - /* if the current tile is dirty, fix it */ - if (tmap->tileflags[logindex] == TILE_FLAG_DIRTY) - tile_update(tmap, logindex, column, row); + // if the current tile is dirty, fix it + if (m_tileflags[logindex] == TILE_FLAG_DIRTY) + tile_update(logindex, column, row); - /* if the current summary data is non-zero, we must draw masked */ - if ((tmap->tileflags[logindex] & blit->mask) != 0) + // if the current summary data is non-zero, we must draw masked + if ((m_tileflags[logindex] & blit.mask) != 0) cur_trans = MASKED; - /* otherwise, our transparency state is constant across the tile; fetch it */ + // otherwise, our transparency state is constant across the tile; fetch it else - cur_trans = ((mask_baseaddr[column * tmap->tilewidth] & blit->mask) == blit->value) ? WHOLLY_OPAQUE : WHOLLY_TRANSPARENT; + cur_trans = ((mask_baseaddr[column * m_tilewidth] & blit.mask) == blit.value) ? WHOLLY_OPAQUE : WHOLLY_TRANSPARENT; } - /* if the transparency state is the same as last time, don't render yet */ + // if the transparency state is the same as last time, don't render yet if (cur_trans == prev_trans) continue; - /* compute the end of this run, in pixels */ - x_end = column * tmap->tilewidth; + // compute the end of this run, in pixels + x_end = column * m_tilewidth; x_end = MAX(x_end, x1); x_end = MIN(x_end, x2); - /* if we're rendering something, compute the pointers */ + // if we're rendering something, compute the pointers + const rgb_t *clut = (dest.palette() != NULL) ? palette_entry_list_raw(dest.palette()) : machine().pens; if (prev_trans != WHOLLY_TRANSPARENT) { const UINT16 *source0 = source_baseaddr + x_start; - void *dest0 = (UINT8 *)dest_baseaddr + x_start * dest_bytespp; + typename _BitmapClass::pixel_t *dest0 = dest_baseaddr + x_start; UINT8 *pmap0 = priority_baseaddr + x_start; - int cury; - /* if we were opaque, use the opaque renderer */ + // if we were opaque, use the opaque renderer if (prev_trans == WHOLLY_OPAQUE) { - for (cury = y; cury < nexty; cury++) + for (int cury = y; cury < nexty; cury++) { - (*blit->draw_opaque)(dest0, source0, x_end - x_start, tmap->machine().pens, pmap0, blit->tilemap_priority_code, blit->alpha); - - dest0 = (UINT8 *)dest0 + dest_line_pitch_bytes; - source0 += tmap->pixmap->rowpixels; - pmap0 += priority_bitmap->rowpixels; + if (dest_baseaddr == NULL) + scanline_draw_opaque_null(x_end - x_start, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 2) + scanline_draw_opaque_ind16(reinterpret_cast(dest0), source0, x_end - x_start, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 4 && blit.alpha >= 0xff) + scanline_draw_opaque_rgb32(reinterpret_cast(dest0), source0, x_end - x_start, clut, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 4) + scanline_draw_opaque_rgb32_alpha(reinterpret_cast(dest0), source0, x_end - x_start, clut, pmap0, blit.tilemap_priority_code, blit.alpha); + + dest0 += dest_rowpixels; + source0 += m_pixmap.rowpixels(); + pmap0 += priority_bitmap.rowpixels(); } } - /* otherwise use the masked renderer */ + // otherwise use the masked renderer else { const UINT8 *mask0 = mask_baseaddr + x_start; - for (cury = y; cury < nexty; cury++) + for (int cury = y; cury < nexty; cury++) { - (*blit->draw_masked)(dest0, source0, mask0, blit->mask, blit->value, x_end - x_start, tmap->machine().pens, pmap0, blit->tilemap_priority_code, blit->alpha); - - dest0 = (UINT8 *)dest0 + dest_line_pitch_bytes; - source0 += tmap->pixmap->rowpixels; - mask0 += tmap->flagsmap->rowpixels; - pmap0 += priority_bitmap->rowpixels; + if (dest_baseaddr == NULL) + scanline_draw_masked_null(mask0, blit.mask, blit.value, x_end - x_start, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 2) + scanline_draw_masked_ind16(reinterpret_cast(dest0), source0, mask0, blit.mask, blit.value, x_end - x_start, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 4 && blit.alpha >= 0xff) + scanline_draw_masked_rgb32(reinterpret_cast(dest0), source0, mask0, blit.mask, blit.value, x_end - x_start, clut, pmap0, blit.tilemap_priority_code); + else if (sizeof(*dest0) == 4) + scanline_draw_masked_rgb32_alpha(reinterpret_cast(dest0), source0, mask0, blit.mask, blit.value, x_end - x_start, clut, pmap0, blit.tilemap_priority_code, blit.alpha); + + dest0 += dest_rowpixels; + source0 += m_pixmap.rowpixels(); + mask0 += m_flagsmap.rowpixels(); + pmap0 += priority_bitmap.rowpixels(); } } } - /* the new start is the end */ + // the new start is the end x_start = x_end; prev_trans = cur_trans; } - /* if this was the last row, stop */ + // if this was the last row, stop if (nexty == y2) break; - /* advance to the next row on all our bitmaps */ - priority_baseaddr += priority_bitmap->rowpixels * (nexty - y); - source_baseaddr += tmap->pixmap->rowpixels * (nexty - y); - mask_baseaddr += tmap->flagsmap->rowpixels * (nexty - y); - dest_baseaddr = (UINT8 *)dest_baseaddr + dest_line_pitch_bytes * (nexty - y); + // advance to the next row on all our bitmaps + priority_baseaddr += priority_bitmap.rowpixels() * (nexty - y); + source_baseaddr += m_pixmap.rowpixels() * (nexty - y); + mask_baseaddr += m_flagsmap.rowpixels() * (nexty - y); + dest_baseaddr += dest_rowpixels * (nexty - y); - /* increment the Y counter */ + // increment the Y counter y = nexty; - nexty += tmap->tileheight; + nexty += m_tileheight; nexty = MIN(nexty, y2); } } -/*------------------------------------------------- - tilemap_draw_roz_core - render the tilemap's - pixmap to the destination with rotation - and zoom --------------------------------------------------*/ +//------------------------------------------------- +// tilemap_draw_roz_core - render the tilemap's +// pixmap to the destination with rotation +// and zoom +//------------------------------------------------- #define ROZ_PLOT_PIXEL(INPUT_VAL) \ do { \ - if (blit->draw_masked == scanline_draw_masked_ind16) \ - *(UINT16 *)dest = (INPUT_VAL) + (priority >> 16); \ - else if (blit->draw_masked == scanline_draw_masked_rgb32) \ - *(UINT32 *)dest = clut[INPUT_VAL]; \ - else if (blit->draw_masked == scanline_draw_masked_rgb16) \ - *(UINT16 *)dest = clut[INPUT_VAL]; \ - else if (blit->draw_masked == scanline_draw_masked_rgb32_alpha) \ - *(UINT32 *)dest = alpha_blend_r32(*(UINT32 *)dest, clut[INPUT_VAL], alpha); \ - else if (blit->draw_masked == scanline_draw_masked_rgb16_alpha) \ - *(UINT16 *)dest = alpha_blend_r16(*(UINT16 *)dest, clut[INPUT_VAL], alpha); \ + if (sizeof(*dest) == 2) \ + *dest = (INPUT_VAL) + (priority >> 16); \ + else if (sizeof(*dest) == 4 && alpha >= 0xff) \ + *dest = clut[INPUT_VAL]; \ + else if (sizeof(*dest) == 4) \ + *dest = alpha_blend_r32(*dest, clut[INPUT_VAL], alpha); \ } while (0) -static void tilemap_draw_roz_core(tilemap_t *tmap, const blit_parameters *blit, - UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound) -{ - const pen_t *clut = &tmap->machine().pens[blit->tilemap_priority_code >> 16]; - bitmap_t *priority_bitmap = tmap->machine().priority_bitmap; - bitmap_t *destbitmap = blit->bitmap; - bitmap_t *srcbitmap = tmap->pixmap; - bitmap_t *flagsmap = tmap->flagsmap; - const int xmask = srcbitmap->width-1; - const int ymask = srcbitmap->height-1; - const int widthshifted = srcbitmap->width << 16; - const int heightshifted = srcbitmap->height << 16; - UINT32 priority = blit->tilemap_priority_code; - UINT8 mask = blit->mask; - UINT8 value = blit->value; - UINT8 alpha = blit->alpha; - UINT32 cx; - UINT32 cy; - int x; - int sx; - int sy; - int ex; - int ey; - void *dest; - UINT8 *pri; - const UINT16 *src; - const UINT8 *maskptr; - int destadvance = destbitmap->bpp / 8; - - /* pre-advance based on the cliprect */ - startx += blit->cliprect.min_x * incxx + blit->cliprect.min_y * incyx; - starty += blit->cliprect.min_x * incxy + blit->cliprect.min_y * incyy; - - /* extract start/end points */ - sx = blit->cliprect.min_x; - sy = blit->cliprect.min_y; - ex = blit->cliprect.max_x; - ey = blit->cliprect.max_y; +template +void tilemap_t::draw_roz_core(_BitmapClass &destbitmap, const blit_parameters &blit, + UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, bool wraparound) +{ + // pre-cache all the inner loop values + const rgb_t *clut = ((destbitmap.palette() != NULL) ? palette_entry_list_raw(destbitmap.palette()) : machine().pens) + (blit.tilemap_priority_code >> 16); + bitmap_ind8 &priority_bitmap = machine().priority_bitmap; + const int xmask = m_pixmap.width() - 1; + const int ymask = m_pixmap.height() - 1; + const int widthshifted = m_pixmap.width() << 16; + const int heightshifted = m_pixmap.height() << 16; + UINT32 priority = blit.tilemap_priority_code; + UINT8 mask = blit.mask; + UINT8 value = blit.value; + UINT8 alpha = blit.alpha; + + // pre-advance based on the cliprect + startx += blit.cliprect.min_x * incxx + blit.cliprect.min_y * incyx; + starty += blit.cliprect.min_x * incxy + blit.cliprect.min_y * incyy; + + // extract start/end points + int sx = blit.cliprect.min_x; + int sy = blit.cliprect.min_y; + int ex = blit.cliprect.max_x; + int ey = blit.cliprect.max_y; - /* optimized loop for the not rotated case */ + // optimized loop for the not rotated case if (incxy == 0 && incyx == 0 && !wraparound) { - /* skip without drawing until we are within the bitmap */ + // skip without drawing until we are within the bitmap while (startx >= widthshifted && sx <= ex) { startx += incxx; sx++; } - /* early exit if we're done already */ + // early exit if we're done already if (sx > ex) return; - /* loop over rows */ + // loop over rows while (sy <= ey) { - /* only draw if Y is within range */ + // only draw if Y is within range if (starty < heightshifted) { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty >> 16; - - /* get source and priority pointers */ - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); - src = BITMAP_ADDR16(srcbitmap, cy, 0); - maskptr = BITMAP_ADDR8(flagsmap, cy, 0); - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; + // initialize X counters + int x = sx; + UINT32 cx = startx; + UINT32 cy = starty >> 16; + + // get source and priority pointers + UINT8 *pri = &priority_bitmap.pix8(sy, sx); + const UINT16 *src = &m_pixmap.pix16(cy); + const UINT8 *maskptr = &m_flagsmap.pix8(cy); + typename _BitmapClass::pixel_t *dest = &destbitmap.pix(sy, sx); - /* loop over columns */ + // loop over columns while (x <= ex && cx < widthshifted) { - /* plot if we match the mask */ + // plot if we match the mask if ((maskptr[cx >> 16] & mask) == value) { ROZ_PLOT_PIXEL(src[cx >> 16]); *pri = (*pri & (priority >> 8)) | priority; } - /* advance in X */ + // advance in X cx += incxx; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } } - /* advance in Y */ + // advance in Y starty += incyy; sy++; } } - /* wraparound case */ + // wraparound case else if (wraparound) { - /* loop over rows */ + // loop over rows while (sy <= ey) { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty; - - /* get dest and priority pointers */ - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); + // initialize X counters + int x = sx; + UINT32 cx = startx; + UINT32 cy = starty; + + // get dest and priority pointers + typename _BitmapClass::pixel_t *dest = &destbitmap.pix(sy, sx); + UINT8 *pri = &priority_bitmap.pix8(sy, sx); - /* loop over columns */ + // loop over columns while (x <= ex) { - /* plot if we match the mask */ - if ((*BITMAP_ADDR8(flagsmap, (cy >> 16) & ymask, (cx >> 16) & xmask) & mask) == value) + // plot if we match the mask + if ((m_flagsmap.pix8((cy >> 16) & ymask, (cx >> 16) & xmask) & mask) == value) { - ROZ_PLOT_PIXEL(*BITMAP_ADDR16(srcbitmap, (cy >> 16) & ymask, (cx >> 16) & xmask)); + ROZ_PLOT_PIXEL(m_pixmap.pix16((cy >> 16) & ymask, (cx >> 16) & xmask)); *pri = (*pri & (priority >> 8)) | priority; } - /* advance in X */ + // advance in X cx += incxx; cy += incxy; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } - /* advance in Y */ + // advance in Y startx += incyx; starty += incyy; sy++; } } - /* non-wraparound case */ + // non-wraparound case else { - /* loop over rows */ + // loop over rows while (sy <= ey) { - /* initialize X counters */ - x = sx; - cx = startx; - cy = starty; - - /* get dest and priority pointers */ - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); + // initialize X counters + int x = sx; + UINT32 cx = startx; + UINT32 cy = starty; + + // get dest and priority pointers + typename _BitmapClass::pixel_t *dest = &destbitmap.pix(sy, sx); + UINT8 *pri = &priority_bitmap.pix8(sy, sx); - /* loop over columns */ + // loop over columns while (x <= ex) { - /* plot if we're within the bitmap and we match the mask */ + // plot if we're within the bitmap and we match the mask if (cx < widthshifted && cy < heightshifted) - if ((*BITMAP_ADDR8(flagsmap, cy >> 16, cx >> 16) & mask) == value) + if ((m_flagsmap.pix8(cy >> 16, cx >> 16) & mask) == value) { - ROZ_PLOT_PIXEL(*BITMAP_ADDR16(srcbitmap, cy >> 16, cx >> 16)); + ROZ_PLOT_PIXEL(m_pixmap.pix16(cy >> 16, cx >> 16)); *pri = (*pri & (priority >> 8)) | priority; } - /* advance in X */ + // advance in X cx += incxx; cy += incxy; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } - /* advance in Y */ + // advance in Y startx += incyx; starty += incyy; sy++; @@ -1973,370 +1437,85 @@ } +//------------------------------------------------- +// draw_debug - draw a debug version without any +// rowscroll and with fixed parameters +//------------------------------------------------- -/*************************************************************************** - SCANLINE RASTERIZERS -***************************************************************************/ - -/*------------------------------------------------- - scanline_draw_opaque_null - draw to a NULL - bitmap, setting priority only --------------------------------------------------*/ - -static void scanline_draw_opaque_null(void *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - int i; - - /* skip entirely if not changing priority */ - if (pcode != 0xff00) - { - for (i = 0; i < count; i++) - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } -} - - -/*------------------------------------------------- - scanline_draw_masked_null - draw to a NULL - bitmap using a mask, setting priority only --------------------------------------------------*/ - -static void scanline_draw_masked_null(void *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - int i; - - /* skip entirely if not changing priority */ - if (pcode != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } -} - - - -/*------------------------------------------------- - scanline_draw_opaque_ind16 - draw to a 16bpp - indexed bitmap --------------------------------------------------*/ - -static void scanline_draw_opaque_ind16(void *_dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - UINT16 *dest = (UINT16 *)_dest; - int pal = pcode >> 16; - int i; - - /* special case for no palette offset */ - if (pal == 0) - { - memcpy(dest, source, count * 2); - - /* priority if necessary */ - if (pcode != 0xff00) - { - for (i = 0; i < count; i++) - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* priority case */ - else if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - { - dest[i] = source[i] + pal; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - dest[i] = source[i] + pal; - } -} - - -/*------------------------------------------------- - scanline_draw_masked_ind16 - draw to a 16bpp - indexed bitmap using a mask --------------------------------------------------*/ - -static void scanline_draw_masked_ind16(void *_dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - UINT16 *dest = (UINT16 *)_dest; - int pal = pcode >> 16; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - { - dest[i] = source[i] + pal; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - dest[i] = source[i] + pal; - } -} - - - -/*------------------------------------------------- - scanline_draw_opaque_rgb16 - draw to a 16bpp - RGB bitmap --------------------------------------------------*/ - -static void scanline_draw_opaque_rgb16(void *_dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +void tilemap_t::draw_debug(bitmap_rgb32 &dest, UINT32 scrollx, UINT32 scrolly) { - const pen_t *clut = &pens[pcode >> 16]; - UINT16 *dest = (UINT16 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - { - dest[i] = clut[source[i]]; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - dest[i] = clut[source[i]]; - } -} - - -/*------------------------------------------------- - scanline_draw_masked_rgb16 - draw to a 16bpp - RGB bitmap using a mask --------------------------------------------------*/ + // set up for the blit, using hard-coded parameters (no priority, etc) + blit_parameters blit; + configure_blit_parameters(blit, dest.cliprect(), TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0, 0xff); -static void scanline_draw_masked_rgb16(void *_dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - const pen_t *clut = &pens[pcode >> 16]; - UINT16 *dest = (UINT16 *)_dest; - int i; + // compute the effective scroll positions + scrollx = m_width - scrollx % m_width; + scrolly = m_height - scrolly % m_height; - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - { - dest[i] = clut[source[i]]; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } + // flush the dirty state to all tiles as appropriate + realize_all_dirty_tiles(); - /* no priority case */ - else - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - dest[i] = clut[source[i]]; - } + // iterate to handle wraparound + for (int ypos = scrolly - m_height; ypos <= blit.cliprect.max_y; ypos += m_height) + for (int xpos = scrollx - m_width; xpos <= blit.cliprect.max_x; xpos += m_width) + draw_instance(dest, blit, xpos, ypos); } -/*------------------------------------------------- - scanline_draw_opaque_rgb16_alpha - draw to a - 16bpp RGB bitmap with alpha blending --------------------------------------------------*/ - -static void scanline_draw_opaque_rgb16_alpha(void *_dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) -{ - const pen_t *clut = &pens[pcode >> 16]; - UINT16 *dest = (UINT16 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - { - dest[i] = alpha_blend_r16(dest[i], clut[source[i]], alpha); - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - dest[i] = alpha_blend_r16(dest[i], clut[source[i]], alpha); - } -} +//************************************************************************** +// TILEMAP MANAGER +//************************************************************************** -/*------------------------------------------------- - scanline_draw_masked_rgb16_alpha - draw to a - 16bpp RGB bitmap using a mask and alpha - blending --------------------------------------------------*/ +//------------------------------------------------- +// tilemap_manager - constructor +//------------------------------------------------- -static void scanline_draw_masked_rgb16_alpha(void *_dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +tilemap_manager::tilemap_manager(running_machine &machine) + : m_machine(machine), + m_instance(0) { - const pen_t *clut = &pens[pcode >> 16]; - UINT16 *dest = (UINT16 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - { - dest[i] = alpha_blend_r16(dest[i], clut[source[i]], alpha); - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - dest[i] = alpha_blend_r16(dest[i], clut[source[i]], alpha); - } + if (machine.primary_screen == NULL || machine.primary_screen->width() == 0) + return; + machine.primary_screen->register_screen_bitmap(machine.priority_bitmap); } -/*------------------------------------------------- - scanline_draw_opaque_rgb32 - draw to a 32bpp - RGB bitmap --------------------------------------------------*/ +//------------------------------------------------- +// set_flip_all - set a global flip for all the +// tilemaps +//------------------------------------------------- -static void scanline_draw_opaque_rgb32(void *_dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +tilemap_t &tilemap_manager::create(tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, int tilewidth, int tileheight, int cols, int rows) { - const pen_t *clut = &pens[pcode >> 16]; - UINT32 *dest = (UINT32 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - { - dest[i] = clut[source[i]]; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - dest[i] = clut[source[i]]; - } + return m_tilemap_list.append(*auto_alloc(machine(), tilemap_t(*this, tile_get_info, mapper, tilewidth, tileheight, cols, rows))); } - -/*------------------------------------------------- - scanline_draw_masked_rgb32 - draw to a 32bpp - RGB bitmap using a mask --------------------------------------------------*/ - -static void scanline_draw_masked_rgb32(void *_dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +tilemap_t &tilemap_manager::create(tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) { - const pen_t *clut = &pens[pcode >> 16]; - UINT32 *dest = (UINT32 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - { - dest[i] = clut[source[i]]; - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - dest[i] = clut[source[i]]; - } + return m_tilemap_list.append(*auto_alloc(machine(), tilemap_t(*this, tilemap_get_info_delegate(tile_get_info, "", &machine()), tilemap_mapper_delegate(mapper, "", &machine()), tilewidth, tileheight, cols, rows))); } -/*------------------------------------------------- - scanline_draw_opaque_rgb32_alpha - draw to a - 32bpp RGB bitmap with alpha blending --------------------------------------------------*/ +//------------------------------------------------- +// set_flip_all - set a global flip for all the +// tilemaps +//------------------------------------------------- -static void scanline_draw_opaque_rgb32_alpha(void *_dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +void tilemap_manager::set_flip_all(UINT32 attributes) { - const pen_t *clut = &pens[pcode >> 16]; - UINT32 *dest = (UINT32 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - { - dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); - } + for (tilemap_t *tmap = m_tilemap_list.first(); tmap != NULL; tmap = tmap->next()) + tmap->set_flip(attributes); } -/*------------------------------------------------- - scanline_draw_masked_rgb32_alpha - draw to a - 32bpp RGB bitmap using a mask and alpha - blending --------------------------------------------------*/ +//------------------------------------------------- +// mark_all_dirty - mark all the tiles in all the +// tilemaps dirty +//------------------------------------------------- -static void scanline_draw_masked_rgb32_alpha(void *_dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha) +void tilemap_manager::mark_all_dirty() { - const pen_t *clut = &pens[pcode >> 16]; - UINT32 *dest = (UINT32 *)_dest; - int i; - - /* priority case */ - if ((pcode & 0xffff) != 0xff00) - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - { - dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); - pri[i] = (pri[i] & (pcode >> 8)) | pcode; - } - } - - /* no priority case */ - else - { - for (i = 0; i < count; i++) - if ((maskptr[i] & mask) == value) - dest[i] = alpha_blend_r32(dest[i], clut[source[i]], alpha); - } + for (tilemap_t *tmap = m_tilemap_list.first(); tmap != NULL; tmap = tmap->next()) + tmap->mark_all_dirty(); } diff -Nru mame-0.144/src/emu/tilemap.h mame-0.145/src/emu/tilemap.h --- mame-0.144/src/emu/tilemap.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/tilemap.h 2012-02-06 21:30:26.000000000 +0000 @@ -4,8 +4,36 @@ Generic tilemap management system. - 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. **************************************************************************** @@ -50,9 +78,6 @@ TILE_FLIPY means render the tile flipped vertically - TILE_4BPP means pen_data is actually packed 4bpp pixels - (low 4 bits first, then upper 4 bits) - TILE_FORCE_LAYERn means all pixels are forced to be in layer n, where n = 0,1,2 @@ -148,7 +173,7 @@ 6. In your VIDEO_UPDATE callback, render the tiles by calling tilemap_draw() or tilemap_draw_roz(). If you need to do custom rendering and want access to the raw pixels, call - tilemap_get_pixmap() to get a pointer to the updated bitmap_t + tilemap_get_pixmap() to get a pointer to the updated bitmap_ind16 containing the tilemap graphics. **************************************************************************** @@ -182,7 +207,7 @@ // set the category of each tile based on the high bit; this // allows us to draw each category independently - tileinfo->category = category; + tileinfo.category = category; } VIDEO_START( mydriver ) @@ -302,254 +327,360 @@ #define __TILEMAP_H__ -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** -/* maximum number of groups */ +// maximum number of groups #define TILEMAP_NUM_GROUPS 256 -/* these flags control tilemap_draw() behavior */ -#define TILEMAP_DRAW_CATEGORY_MASK 0x0f /* specify the category to draw */ -#define TILEMAP_DRAW_CATEGORY(x) (x) /* specify category to draw */ -#define TILEMAP_DRAW_LAYER0 0x10 /* draw layer 0 */ -#define TILEMAP_DRAW_LAYER1 0x20 /* draw layer 1 */ -#define TILEMAP_DRAW_LAYER2 0x40 /* draw layer 2 */ -#define TILEMAP_DRAW_OPAQUE 0x80 /* draw everything, even transparent stuff */ -#define TILEMAP_DRAW_ALPHA_FLAG 0x100 /* draw with alpha blending (in the upper 8 bits) */ -#define TILEMAP_DRAW_ALPHA(x) (TILEMAP_DRAW_ALPHA_FLAG | (rgb_clamp(x) << 24)) -#define TILEMAP_DRAW_ALL_CATEGORIES 0x200 /* draw all categories */ - - -/* per-pixel flags in the transparency_bitmap */ -#define TILEMAP_PIXEL_CATEGORY_MASK 0x0f /* category is stored in the low 4 bits */ -#define TILEMAP_PIXEL_TRANSPARENT 0x00 /* transparent if in none of the layers below */ -#define TILEMAP_PIXEL_LAYER0 0x10 /* pixel is opaque in layer 0 */ -#define TILEMAP_PIXEL_LAYER1 0x20 /* pixel is opaque in layer 1 */ -#define TILEMAP_PIXEL_LAYER2 0x40 /* pixel is opaque in layer 2 */ - - -/* per-tile flags, set by get_tile_info callback */ -#define TILE_FLIPX 0x01 /* draw this tile horizontally flipped */ -#define TILE_FLIPY 0x02 /* draw this tile vertically flipped */ -#define TILE_4BPP 0x04 /* tile data is packed 4bpp */ -#define TILE_FORCE_LAYER0 TILEMAP_PIXEL_LAYER0 /* force all pixels to be layer 0 (no transparency) */ -#define TILE_FORCE_LAYER1 TILEMAP_PIXEL_LAYER1 /* force all pixels to be layer 1 (no transparency) */ -#define TILE_FORCE_LAYER2 TILEMAP_PIXEL_LAYER2 /* force all pixels to be layer 2 (no transparency) */ - +// these flags control tilemap_draw() behavior +const UINT32 TILEMAP_DRAW_CATEGORY_MASK = 0x0f; // specify the category to draw +const UINT32 TILEMAP_DRAW_LAYER0 = 0x10; // draw layer 0 +const UINT32 TILEMAP_DRAW_LAYER1 = 0x20; // draw layer 1 +const UINT32 TILEMAP_DRAW_LAYER2 = 0x40; // draw layer 2 +const UINT32 TILEMAP_DRAW_OPAQUE = 0x80; // draw everything, even transparent stuff +const UINT32 TILEMAP_DRAW_ALPHA_FLAG = 0x100; // draw with alpha blending (in the upper 8 bits) +const UINT32 TILEMAP_DRAW_ALL_CATEGORIES = 0x200; // draw all categories + +// per-pixel flags in the transparency_bitmap +const UINT8 TILEMAP_PIXEL_CATEGORY_MASK = 0x0f; // category is stored in the low 4 bits +const UINT8 TILEMAP_PIXEL_TRANSPARENT = 0x00; // transparent if in none of the layers below +const UINT8 TILEMAP_PIXEL_LAYER0 = 0x10; // pixel is opaque in layer 0 +const UINT8 TILEMAP_PIXEL_LAYER1 = 0x20; // pixel is opaque in layer 1 +const UINT8 TILEMAP_PIXEL_LAYER2 = 0x40; // pixel is opaque in layer 2 + +// per-tile flags, set by get_tile_info callback +const UINT8 TILE_FLIPX = 0x01; // draw this tile horizontally flipped +const UINT8 TILE_FLIPY = 0x02; // draw this tile vertically flipped +const UINT8 TILE_FORCE_LAYER0 = TILEMAP_PIXEL_LAYER0; // force all pixels to be layer 0 (no transparency) +const UINT8 TILE_FORCE_LAYER1 = TILEMAP_PIXEL_LAYER1; // force all pixels to be layer 1 (no transparency) +const UINT8 TILE_FORCE_LAYER2 = TILEMAP_PIXEL_LAYER2; // force all pixels to be layer 2 (no transparency) + +// tilemap global flags, used by tilemap_set_flip() +const UINT32 TILEMAP_FLIPX = TILE_FLIPX; // draw the tilemap horizontally flipped +const UINT32 TILEMAP_FLIPY = TILE_FLIPY; // draw the tilemap vertically flipped + +// set this value for a scroll row/column to fully disable it +const UINT32 TILE_LINE_DISABLED = 0x80000000; -/* tilemap global flags, used by tilemap_set_flip() */ -#define TILEMAP_FLIPX TILE_FLIPX /* draw the tilemap horizontally flipped */ -#define TILEMAP_FLIPY TILE_FLIPY /* draw the tilemap vertically flipped */ -/* set this value for a scroll row/column to fully disable it */ -#define TILE_LINE_DISABLED 0x80000000 - - - -/*************************************************************************** - MACROS -***************************************************************************/ - -/* function definition for a get info callback */ -#define TILE_GET_INFO(_name) void _name(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param) -#define TILE_GET_INFO_DEVICE(_name) void _name(device_t *device, tile_data *tileinfo, tilemap_memory_index tile_index, void *param) - -/* function definition for a logical-to-memory mapper */ -#define TILEMAP_MAPPER(_name) tilemap_memory_index _name(UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows) - -/* useful macro inside of a TILE_GET_INFO callback to set tile information */ -#define SET_TILE_INFO(GFX,CODE,COLOR,FLAGS) tileinfo_set(machine, tileinfo, GFX, CODE, COLOR, FLAGS) -#define SET_TILE_INFO_DEVICE(GFX,CODE,COLOR,FLAGS) tileinfo_set(device->machine(), tileinfo, GFX, CODE, COLOR, FLAGS) - -/* Macros for setting tile attributes in the TILE_GET_INFO callback: */ -/* TILE_FLIP_YX assumes that flipy is in bit 1 and flipx is in bit 0 */ -/* TILE_FLIP_XY assumes that flipy is in bit 0 and flipx is in bit 1 */ -#define TILE_FLIPYX(YX) ((YX) & 3) -#define TILE_FLIPXY(XY) ((((XY) & 2) >> 1) | (((XY) & 1) << 1)) - +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** +// forward declarations +class tilemap_t; +class tilemap_manager; -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ -/* memory indexes are unsigned integers */ +// global types typedef UINT32 tilemap_memory_index; -/* opaque tilemap definition */ -class tilemap_t; - -/* tile_data is filled in by the get_tile_info callback */ -typedef struct _tile_data tile_data; -struct _tile_data +// tile_data is filled in by the get_tile_info callback +struct tile_data { - const UINT8 * pen_data; /* required */ - const UINT8 * mask_data; /* required */ - pen_t palette_base; /* defaults to 0 */ - UINT8 category; /* defaults to 0; range from 0..15 */ - UINT8 group; /* defaults to 0; range from 0..TILEMAP_NUM_GROUPS */ - UINT8 flags; /* defaults to 0; one or more of TILE_* flags above */ - UINT8 pen_mask; /* defaults to 0xff; mask to apply to pen_data while rendering the tile */ - UINT8 gfxnum; /* defaults to 0xff; specify index of machine.gfx for auto-invalidation on dirty */ + const UINT8 * pen_data; // required + const UINT8 * mask_data; // required + pen_t palette_base; // defaults to 0 + UINT8 category; // defaults to 0; range from 0..15 + UINT8 group; // defaults to 0; range from 0..TILEMAP_NUM_GROUPS + UINT8 flags; // defaults to 0; one or more of TILE_* flags above + UINT8 pen_mask; // defaults to 0xff; mask to apply to pen_data while rendering the tile + UINT8 gfxnum; // defaults to 0xff; specify index of machine.gfx for auto-invalidation on dirty + + void set(running_machine &machine, int _gfxnum, int rawcode, int rawcolor, int _flags) + { + const gfx_element *gfx = machine.gfx[_gfxnum]; + int code = rawcode % gfx->total_elements; + pen_data = gfx_element_get_data(gfx, code); + palette_base = gfx->color_base + gfx->color_granularity * rawcolor; + flags = _flags; + gfxnum = _gfxnum; + } }; -/* callback function to get info about a tile */ -typedef void (*tile_get_info_func)(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param); -typedef void (*tile_get_info_device_func)(device_t *device, tile_data *tileinfo, tilemap_memory_index tile_index, void *param); - -/* callback function to map a column,row pair to a memory index */ -typedef tilemap_memory_index (*tilemap_mapper_func)(UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows); - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- system-wide management ----- */ - -/* initialize the tilemap system -- not for use by drivers */ -void tilemap_init(running_machine &machine); - - - -/* ----- tilemap creation and configuration ----- */ - -/* create a new tilemap; note that tilemaps are tracked by the core so there is no dispose */ -tilemap_t *tilemap_create(running_machine &machine, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows); - -/* create a new tilemap that is owned by a device */ -tilemap_t *tilemap_create_device(device_t *device, tile_get_info_device_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows); - -/* specify a parameter to be passed into the tile_get_info callback */ -void tilemap_set_user_data(tilemap_t *tmap, void *user_data); - -/* specify an offset to be added to each pixel before looking up the palette. - * The offset only applies at final rendering time (e.g., tilemap_draw()) - * It does not apply to the cached pixmap, which is provided by tilemap_get_pixmap(). - */ -void tilemap_set_palette_offset(tilemap_t *tmap, UINT32 offset); - -/* set an enable flag for the tilemap; if 0, requests to draw the tilemap are ignored */ -void tilemap_set_enable(tilemap_t *tmap, int enable); - -/* return enable flag for the tilemap */ -int tilemap_get_enable(tilemap_t *tmap); - -/* set a global flip for the tilemap */ -void tilemap_set_flip(tilemap_t *tmap, UINT32 attributes); +// modern delegates +typedef delegate tilemap_get_info_delegate; +typedef delegate tilemap_mapper_delegate; -/* set a global flip for all tilemaps */ -void tilemap_set_flip_all(running_machine &machine, UINT32 attributes); +// legacy callbacks +typedef void (*tile_get_info_func)(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, void *param); +typedef void (*tile_get_info_device_func)(device_t *device, tile_data &tileinfo, tilemap_memory_index tile_index, void *param); +typedef tilemap_memory_index (*tilemap_mapper_func)(running_machine &machine, UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows); -/* ----- dirty tile marking ----- */ - -/* mark a single tile dirty based on its memory index */ -void tilemap_mark_tile_dirty(tilemap_t *tmap, tilemap_memory_index memory_index); - -/* mark all the tiles dirty in a tilemap */ -void tilemap_mark_all_tiles_dirty(tilemap_t *tmap); - -/* mark all the tiles dirty in all tilemaps */ -void tilemap_mark_all_tiles_dirty_all(running_machine &machine); - - - -/* ----- pen-to-layer mapping ----- */ - -/* specify the mapping of one or more pens (where ( & mask == pen) to a layer */ -void tilemap_map_pens_to_layer(tilemap_t *tmap, int group, pen_t pen, pen_t mask, UINT8 layermask); - -/* set a single transparent pen into the tilemap, mapping all other pens to layer 0 */ -void tilemap_set_transparent_pen(tilemap_t *tmap, pen_t pen); - -/* set up the first 32 pens using a foreground (layer 0) mask and a background (layer 1) mask */ -void tilemap_set_transmask(tilemap_t *tmap, int group, UINT32 fgmask, UINT32 bgmask); - - - -/* ----- tilemap scrolling ----- */ - -/* specify the number of independently scrollable row units; each unit covers height/scroll_rows pixels */ -void tilemap_set_scroll_rows(tilemap_t *tmap, UINT32 scroll_rows); - -/* specify the number of independently scrollable column units; each unit covers width/scroll_cols pixels */ -void tilemap_set_scroll_cols(tilemap_t *tmap, UINT32 scroll_cols); - -/* specify global horizontal and vertical scroll offsets, for non-flipped and flipped cases */ -void tilemap_set_scrolldx(tilemap_t *tmap, int dx, int dx_if_flipped); -void tilemap_set_scrolldy(tilemap_t *tmap, int dy, int dy_if_flipped); - -/* return the global horizontal or vertical scroll offset, based on current flip state */ -int tilemap_get_scrolldx(tilemap_t *tmap); -int tilemap_get_scrolldy(tilemap_t *tmap); - -/* specify the scroll value for a row/column unit */ -void tilemap_set_scrollx(tilemap_t *tmap, int row, int value); -void tilemap_set_scrolly(tilemap_t *tmap, int col, int value); - -/* return the scroll value for a row/column unit */ -int tilemap_get_scrollx(tilemap_t *tmap, int row); -int tilemap_get_scrolly(tilemap_t *tmap, int col); +// core tilemap structure +class tilemap_t +{ + DISABLE_COPYING(tilemap_t); + friend class tilemap_manager; + friend class simple_list; + friend resource_pool_object::~resource_pool_object(); + + // logical index + typedef UINT32 logical_index; + + // internal usage to mark tiles dirty + static const UINT8 TILE_FLAG_DIRTY = 0xff; + + // invalid logical index + static const logical_index INVALID_LOGICAL_INDEX = (logical_index)~0; + + // maximum index in each array + static const int MAX_PEN_TO_FLAGS = 256; + + // tilemap_manager controlls our allocations + tilemap_t(tilemap_manager &manager, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, int tilewidth, int tileheight, int cols, int rows); + ~tilemap_t(); + +public: + // getters + running_machine &machine() const; + tilemap_t *next() const { return m_next; } + UINT32 width() const { return m_width; } + UINT32 height() const { return m_height; } + bool enabled() const { return m_enable; } + int scrolldx() const { return (m_attributes & TILEMAP_FLIPX) ? m_dx_flipped : m_dx; } + int scrolldy() const { return (m_attributes & TILEMAP_FLIPY) ? m_dy_flipped : m_dy; } + int scrollx(int which = 0) const { return (which < m_scrollrows) ? m_rowscroll[which] : 0; } + int scrolly(int which = 0) const { return (which < m_scrollcols) ? m_colscroll[which] : 0; } + bitmap_ind16 &pixmap() { pixmap_update(); return m_pixmap; } + bitmap_ind8 &flagsmap() { pixmap_update(); return m_flagsmap; } + UINT8 *tile_flags() { pixmap_update(); return m_tileflags; } + tilemap_memory_index memory_index(UINT32 col, UINT32 row) { return m_mapper(col, row, m_cols, m_rows); } + + // setters + void enable(bool enable = true) { m_enable = enable; } + void set_user_data(void *user_data) { m_user_data = user_data; } + void set_palette_offset(UINT32 offset) { m_palette_offset = offset; } + void set_scrolldx(int dx, int dx_flipped) { m_dx = dx; m_dx_flipped = dx_flipped; } + void set_scrolldy(int dy, int dy_flipped) { m_dy = dy; m_dy_flipped = dy_flipped; } + void set_scrollx(int which, int value) { if (which < m_scrollrows) m_rowscroll[which] = value; } + void set_scrolly(int which, int value) { if (which < m_scrollcols) m_colscroll[which] = value; } + void set_scrollx(int value) { set_scrollx(0, value); } + void set_scrolly(int value) { set_scrolly(0, value); } + void set_scroll_rows(UINT32 scroll_rows) { assert(scroll_rows <= m_height); m_scrollrows = scroll_rows; } + void set_scroll_cols(UINT32 scroll_cols) { assert(scroll_cols <= m_width); m_scrollcols = scroll_cols; } + void set_flip(UINT32 attributes) { if (m_attributes != attributes) { m_attributes = attributes; mappings_update(); } } + + // dirtying + void mark_tile_dirty(tilemap_memory_index memindex); + void mark_all_dirty() { m_all_tiles_dirty = true; m_all_tiles_clean = false; } + + // pen mapping + void map_pens_to_layer(int group, pen_t pen, pen_t mask, UINT8 layermask); + void map_pen_to_layer(int group, pen_t pen, UINT8 layermask) { map_pens_to_layer(group, pen, ~0, layermask); } + void set_transparent_pen(pen_t pen); + void set_transmask(int group, UINT32 fgmask, UINT32 bgmask); + + // drawing + void draw(bitmap_ind16 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask = 0xff); + void draw(bitmap_rgb32 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask = 0xff); + void draw_roz(bitmap_ind16 &dest, const rectangle &cliprect, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask = 0xff); + void draw_roz(bitmap_rgb32 &dest, const rectangle &cliprect, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask = 0xff); + void draw_debug(bitmap_rgb32 &dest, UINT32 scrollx, UINT32 scrolly); + +private: + // internal set of transparency states for rendering + enum trans_t + { + WHOLLY_TRANSPARENT, + WHOLLY_OPAQUE, + MASKED + }; + + // blitting parameters for rendering + struct blit_parameters + { + rectangle cliprect; + UINT32 tilemap_priority_code; + UINT8 mask; + UINT8 value; + UINT8 alpha; + }; + + // inline helpers + INT32 effective_rowscroll(int index, UINT32 screen_width); + INT32 effective_colscroll(int index, UINT32 screen_height); + bool gfx_elements_changed(); + + // inline scanline rasterizers + void scanline_draw_opaque_null(int count, UINT8 *pri, UINT32 pcode); + void scanline_draw_masked_null(const UINT8 *maskptr, int mask, int value, int count, UINT8 *pri, UINT32 pcode); + void scanline_draw_opaque_ind16(UINT16 *dest, const UINT16 *source, int count, UINT8 *pri, UINT32 pcode); + void scanline_draw_masked_ind16(UINT16 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, UINT8 *pri, UINT32 pcode); + void scanline_draw_opaque_rgb32(UINT32 *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode); + void scanline_draw_masked_rgb32(UINT32 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode); + void scanline_draw_opaque_rgb32_alpha(UINT32 *dest, const UINT16 *source, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); + void scanline_draw_masked_rgb32_alpha(UINT32 *dest, const UINT16 *source, const UINT8 *maskptr, int mask, int value, int count, const pen_t *pens, UINT8 *pri, UINT32 pcode, UINT8 alpha); + + // internal helpers + void postload(); + void mappings_create(); + void mappings_update(); + void realize_all_dirty_tiles(); + + // internal drawing + void pixmap_update(); + void tile_update(logical_index logindex, UINT32 col, UINT32 row); + UINT8 tile_draw(const UINT8 *pendata, UINT32 x0, UINT32 y0, UINT32 palette_base, UINT8 category, UINT8 group, UINT8 flags, UINT8 pen_mask); + UINT8 tile_apply_bitmask(const UINT8 *maskdata, UINT32 x0, UINT32 y0, UINT8 category, UINT8 flags); + void configure_blit_parameters(blit_parameters &blit, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask); + template void draw_common(_BitmapClass &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask); + template void draw_roz_common(_BitmapClass &dest, const rectangle &cliprect, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, bool wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask); + template void draw_instance(_BitmapClass &dest, const blit_parameters &blit, int xpos, int ypos); + template void draw_roz_core(_BitmapClass &destbitmap, const blit_parameters &blit, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, bool wraparound); + + // basic tilemap metrics + tilemap_t * m_next; // pointer to next tilemap + UINT32 m_rows; // number of tile rows + UINT32 m_cols; // number of tile columns + UINT32 m_tilewidth; // width of a single tile in pixels + UINT32 m_tileheight; // height of a single tile in pixels + UINT32 m_width; // width of the full tilemap in pixels + UINT32 m_height; // height of the full tilemap in pixels + + // logical <-> memory mappings + tilemap_mapper_delegate m_mapper; // callback to map a row/column to a memory index + logical_index * m_memory_to_logical; // map from memory index to logical index + logical_index m_max_logical_index; // maximum valid logical index + tilemap_memory_index * m_logical_to_memory; // map from logical index to memory index + tilemap_memory_index m_max_memory_index; // maximum valid memory index + + // callback to interpret video RAM for the tilemap + tilemap_get_info_delegate m_tile_get_info; // callback to get information about a tile + tile_data m_tileinfo; // structure to hold the data for a tile + void * m_user_data; // user data value passed to the callback + + // global tilemap states + bool m_enable; // true if we are enabled + UINT8 m_attributes; // global attributes (flipx/y) + bool m_all_tiles_dirty; // true if all tiles are dirty + bool m_all_tiles_clean; // true if all tiles are clean + UINT32 m_palette_offset; // palette offset + UINT32 m_pen_data_offset; // pen data offset + UINT32 m_gfx_used; // bitmask of gfx items used + UINT32 m_gfx_dirtyseq[MAX_GFX_ELEMENTS]; // dirtyseq values from last check + + // scroll information + UINT32 m_scrollrows; // number of independently scrolled rows + UINT32 m_scrollcols; // number of independently scrolled columns + INT32 * m_rowscroll; // array of rowscroll values + INT32 * m_colscroll; // array of colscroll values + INT32 m_dx; // global horizontal scroll offset + INT32 m_dx_flipped; // global horizontal scroll offset when flipped + INT32 m_dy; // global vertical scroll offset + INT32 m_dy_flipped; // global vertical scroll offset when flipped + + // pixel data + bitmap_ind16 m_pixmap; // cached pixel data + + // transparency mapping + bitmap_ind8 m_flagsmap; // per-pixel flags + UINT8 * m_tileflags; // per-tile flags + UINT8 m_pen_to_flags[MAX_PEN_TO_FLAGS * TILEMAP_NUM_GROUPS]; // mapping of pens to flags +private: + tilemap_manager & m_manager; // reference to the owning manager +}; -/* ----- internal map access ----- */ -/* return a pointer to the (updated) internal pixmap for a tilemap */ -bitmap_t *tilemap_get_pixmap(tilemap_t *tmap); +// tilemap manager +class tilemap_manager +{ + friend class tilemap_t; -/* return a pointer to the (updated) internal flagsmap for a tilemap */ -bitmap_t *tilemap_get_flagsmap(tilemap_t *tmap); +public: + // construction/destuction + tilemap_manager(running_machine &machine); + + // getters + running_machine &machine() const { return m_machine; } + + // tilemap creation + tilemap_t &create(tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, int tilewidth, int tileheight, int cols, int rows); + tilemap_t &create(tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows); + + // tilemap list information + tilemap_t *find(int index) { return m_tilemap_list.find(index); } + int count() const { return m_tilemap_list.count(); } + + // global operations on all tilemaps + void mark_all_dirty(); + void set_flip_all(UINT32 attributes); + +private: + // allocate an instance index + int alloc_instance() { return ++m_instance; } + + // internal state + running_machine & m_machine; + simple_list m_tilemap_list; + int m_instance; +}; -/* return a pointer to the (updated) internal per-tile flags for a tilemap */ -UINT8 *tilemap_get_tile_flags(tilemap_t *tmap); +//************************************************************************** +// MACROS +//************************************************************************** -/* ----- tilemap rendering ----- */ +// macros to help form flags for tilemap_draw +#define TILEMAP_DRAW_CATEGORY(x) (x) // specify category to draw +#define TILEMAP_DRAW_ALPHA(x) (TILEMAP_DRAW_ALPHA_FLAG | (rgb_clamp(x) << 24)) -/* draw a tilemap to the destination with clipping; pixels apply priority/priority_mask to the priority bitmap */ -void tilemap_draw_primask(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT8 priority, UINT8 priority_mask); +// function definition for a get info callback +#define TILE_GET_INFO(_name) void _name(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, void *param) +#define TILE_GET_INFO_DEVICE(_name) void _name(device_t *device, tile_data &tileinfo, tilemap_memory_index tile_index, void *param) + +// function definition for a logical-to-memory mapper +#define TILEMAP_MAPPER(_name) tilemap_memory_index _name(running_machine &machine, UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows) + +// useful macro inside of a TILE_GET_INFO callback to set tile information +#define SET_TILE_INFO(GFX,CODE,COLOR,FLAGS) tileinfo.set(machine, GFX, CODE, COLOR, FLAGS) +#define SET_TILE_INFO_DEVICE(GFX,CODE,COLOR,FLAGS) tileinfo.set(device->machine(), GFX, CODE, COLOR, FLAGS) + +// Macros for setting tile attributes in the TILE_GET_INFO callback: +// TILE_FLIP_YX assumes that flipy is in bit 1 and flipx is in bit 0 +// TILE_FLIP_XY assumes that flipy is in bit 0 and flipx is in bit 1 +#define TILE_FLIPYX(YX) ((YX) & 3) +#define TILE_FLIPXY(XY) ((((XY) & 2) >> 1) | (((XY) & 1) << 1)) -/* draw a tilemap to the destination with clipping and arbitrary rotate/zoom; */ -/* pixels apply priority/priority_mask to the priority bitmap */ -void tilemap_draw_roz_primask(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, - UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, - int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask); +//************************************************************************** +// FUNCTION PROTOTYPES +//************************************************************************** -/* ----- indexed tilemap handling ----- */ -/* return the number of tilemaps */ -int tilemap_count(running_machine &machine); +// ----- tilemap creation and configuration ----- -/* return the size of an indexed tilemap */ -void tilemap_size_by_index(running_machine &machine, int number, UINT32 *width, UINT32 *height); +// create a new tilemap; note that tilemaps are tracked by the core so there is no dispose +inline tilemap_t *tilemap_create(running_machine &machine, tile_get_info_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) +{ return &machine.tilemap().create(tilemap_get_info_delegate(tile_get_info, "", &machine), tilemap_mapper_delegate(mapper, "", &machine), tilewidth, tileheight, cols, rows); } -/* render an indexed tilemap with fixed characteristics (no priority) */ -void tilemap_draw_by_index(running_machine &machine, bitmap_t *dest, int number, UINT32 scrollx, UINT32 scrolly); +// create a new tilemap that is owned by a device +inline tilemap_t *tilemap_create_device(device_t *device, tile_get_info_device_func tile_get_info, tilemap_mapper_func mapper, int tilewidth, int tileheight, int cols, int rows) +{ return &device->machine().tilemap().create(tilemap_get_info_delegate(tile_get_info, "", device), tilemap_mapper_delegate(mapper, "", &device->machine()), tilewidth, tileheight, cols, rows); } -/* ----- common logical-to-memory mappers ----- */ +// ----- common logical-to-memory mappers ----- -/* scan in row-major order with optional flipping */ +// scan in row-major order with optional flipping TILEMAP_MAPPER( tilemap_scan_rows ); TILEMAP_MAPPER( tilemap_scan_rows_flip_x ); TILEMAP_MAPPER( tilemap_scan_rows_flip_y ); TILEMAP_MAPPER( tilemap_scan_rows_flip_xy ); -/* scan in column-major order with optional flipping */ +// scan in column-major order with optional flipping TILEMAP_MAPPER( tilemap_scan_cols ); TILEMAP_MAPPER( tilemap_scan_cols_flip_x ); TILEMAP_MAPPER( tilemap_scan_cols_flip_y ); @@ -557,62 +688,15 @@ -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - tileinfo_set - set the values of a tileinfo - structure --------------------------------------------------*/ - -INLINE void tileinfo_set(running_machine &machine, tile_data *tileinfo, int gfxnum, int rawcode, int rawcolor, int flags) -{ - const gfx_element *gfx = machine.gfx[gfxnum]; - int code = rawcode % gfx->total_elements; - tileinfo->pen_data = gfx_element_get_data(gfx, code); - tileinfo->palette_base = gfx->color_base + gfx->color_granularity * rawcolor; - tileinfo->flags = flags; - if (gfx->flags & GFX_ELEMENT_PACKED) - tileinfo->flags |= TILE_4BPP; - tileinfo->gfxnum = gfxnum; -} - - -/*------------------------------------------------- - tilemap_map_pen_to_layer - map a single pen - to a layer --------------------------------------------------*/ - -INLINE void tilemap_map_pen_to_layer(tilemap_t *tmap, int group, pen_t pen, UINT8 layermask) -{ - tilemap_map_pens_to_layer(tmap, group, pen, ~0, layermask); -} - - -/*------------------------------------------------- - tilemap_draw - shortcut to - tilemap_draw_primask --------------------------------------------------*/ - -INLINE void tilemap_draw(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT8 priority) -{ - tilemap_draw_primask(dest, cliprect, tmap, flags, priority, 0xff); -} +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** -/*------------------------------------------------- - tilemap_draw_roz - shortcut to - tilemap_draw_roz_primask --------------------------------------------------*/ - -INLINE void tilemap_draw_roz(bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, - UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, - int wraparound, UINT32 flags, UINT8 priority) +inline running_machine &tilemap_t::machine() const { - tilemap_draw_roz_primask(dest, cliprect, tmap, startx, starty, incxx, incxy, incyx, incyy, wraparound, flags, priority, 0xff); + return m_manager.machine(); } - -#endif /* __TILEMAP_H__ */ +#endif // __TILEMAP_H__ diff -Nru mame-0.144/src/emu/timer.c mame-0.145/src/emu/timer.c --- mame-0.144/src/emu/timer.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/timer.c 2012-02-06 21:30:28.000000000 +0000 @@ -176,54 +176,40 @@ // configuration //------------------------------------------------- -bool timer_device::device_validity_check(emu_options &options, const game_driver &driver) const +void timer_device::device_validity_check(validity_checker &valid) const { - bool error = false; - // type based configuration switch (m_type) { case TIMER_TYPE_GENERIC: if (m_screen_tag != NULL || m_first_vpos != 0 || m_start_delay != attotime::zero) - mame_printf_warning("%s: %s generic timer '%s' specified parameters for a scanline timer\n", driver.source_file, driver.name, tag()); + mame_printf_warning("Generic timer specified parameters for a scanline timer\n"); if (m_period != attotime::zero || m_start_delay != attotime::zero) - mame_printf_warning("%s: %s generic timer '%s' specified parameters for a periodic timer\n", driver.source_file, driver.name, tag()); + mame_printf_warning("Generic timer specified parameters for a periodic timer\n"); break; case TIMER_TYPE_PERIODIC: if (m_screen_tag != NULL || m_first_vpos != 0) - mame_printf_warning("%s: %s periodic timer '%s' specified parameters for a scanline timer\n", driver.source_file, driver.name, tag()); + mame_printf_warning("Periodic timer specified parameters for a scanline timer\n"); if (m_period <= attotime::zero) - { - mame_printf_error("%s: %s periodic timer '%s' specified invalid period\n", driver.source_file, driver.name, tag()); - error = true; - } + mame_printf_error("Periodic timer specified invalid period\n"); break; case TIMER_TYPE_SCANLINE: if (m_period != attotime::zero || m_start_delay != attotime::zero) - mame_printf_warning("%s: %s scanline timer '%s' specified parameters for a periodic timer\n", driver.source_file, driver.name, tag()); + mame_printf_warning("Scanline timer specified parameters for a periodic timer\n"); if (m_param != 0) - mame_printf_warning("%s: %s scanline timer '%s' specified parameter which is ignored\n", driver.source_file, driver.name, tag()); + mame_printf_warning("Scanline timer specified parameter which is ignored\n"); if (m_first_vpos < 0) - { - mame_printf_error("%s: %s scanline timer '%s' specified invalid initial position\n", driver.source_file, driver.name, tag()); - error = true; - } + mame_printf_error("Scanline timer specified invalid initial position\n"); if (m_increment < 0) - { - mame_printf_error("%s: %s scanline timer '%s' specified invalid increment\n", driver.source_file, driver.name, tag()); - error = true; - } + mame_printf_error("Scanline timer specified invalid increment\n"); break; default: - mame_printf_error("%s: %s timer '%s' has an invalid type\n", driver.source_file, driver.name, tag()); - error = true; + mame_printf_error("Invalid type specified\n"); break; } - - return error; } diff -Nru mame-0.144/src/emu/timer.h mame-0.145/src/emu/timer.h --- mame-0.144/src/emu/timer.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/timer.h 2012-02-06 21:30:28.000000000 +0000 @@ -142,7 +142,7 @@ private: // device-level overrides - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); diff -Nru mame-0.144/src/emu/ui.c mame-0.145/src/emu/ui.c --- mame-0.144/src/emu/ui.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/ui.c 2012-02-06 21:30:26.000000000 +0000 @@ -20,6 +20,7 @@ #include "ui.h" #include "uiinput.h" #include "uimenu.h" +#include "uimain.h" #include "uigfx.h" #include @@ -162,7 +163,6 @@ static INT32 slider_flicker(running_machine &machine, void *arg, astring *string, INT32 newval); static INT32 slider_beam(running_machine &machine, void *arg, astring *string, INT32 newval); static char *slider_get_screen_desc(screen_device &screen); -static char *slider_get_laserdisc_desc(device_t *screen); #ifdef MAME_DEBUG static INT32 slider_crossscale(running_machine &machine, void *arg, astring *string, INT32 newval); static INT32 slider_crossoffset(running_machine &machine, void *arg, astring *string, INT32 newval); @@ -241,7 +241,7 @@ machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_exit), &machine)); /* initialize the other UI bits */ - ui_menu_init(machine); + ui_menu::init(machine); ui_gfx_init(machine); /* reset globals */ @@ -289,7 +289,7 @@ /* loop over states */ ui_set_handler(handler_ingame, 0); - for (state = 0; state < maxstate && !machine.scheduled_event_pending() && !ui_menu_is_force_game_select(); state++) + for (state = 0; state < maxstate && !machine.scheduled_event_pending() && !ui_menu::stack_has_special_main_menu(); state++) { /* default to standard colors */ messagebox_backcolor = UI_BACKGROUND_COLOR; @@ -324,7 +324,7 @@ while (machine.input().poll_switches() != INPUT_CODE_INVALID) ; /* loop while we have a handler */ - while (ui_handler_callback != handler_ingame && !machine.scheduled_event_pending() && !ui_menu_is_force_game_select()) + while (ui_handler_callback != handler_ingame && !machine.scheduled_event_pending() && !ui_menu::stack_has_special_main_menu()) machine.video().frame_update(); /* clear the handler and force an update */ @@ -333,8 +333,8 @@ } /* if we're the empty driver, force the menus on */ - if (ui_menu_is_force_game_select()) - ui_set_handler(ui_menu_ui_handler, 0); + if (ui_menu::stack_has_special_main_menu()) + ui_set_handler(ui_menu::ui_handler, 0); return 0; } @@ -377,7 +377,7 @@ if (machine.phase() >= MACHINE_PHASE_RESET && (single_step || machine.paused())) { int alpha = (1.0f - machine.options().pause_brightness()) * 255.0f; - if (ui_menu_is_force_game_select()) + if (ui_menu::stack_has_special_main_menu()) alpha = 255; if (alpha > 255) alpha = 255; @@ -856,7 +856,7 @@ void ui_show_menu(void) { - ui_set_handler(ui_menu_ui_handler, 0); + ui_set_handler(ui_menu::ui_handler, 0); } @@ -867,7 +867,7 @@ int ui_is_menu_active(void) { - return (ui_handler_callback == ui_menu_ui_handler); + return (ui_handler_callback == ui_menu::ui_handler); } @@ -917,7 +917,9 @@ /* add a warning if any ROMs were loaded with warnings */ if (rom_load_warnings(machine) > 0) { - string.cat("One or more ROMs/CHDs for this game are incorrect. The " GAMENOUN " may not run correctly.\n"); + string.cat("One or more ROMs/CHDs for this game are incorrect. The "); + string.cat(emulator_info::get_gamenoun()); + string.cat(" may not run correctly.\n"); if (machine.system().flags & WARNING_FLAGS) string.cat("\n"); } @@ -925,12 +927,16 @@ /* if we have at least one warning flag, print the general header */ if ((machine.system().flags & WARNING_FLAGS) || rom_load_knownbad(machine) > 0) { - string.cat("There are known problems with this " GAMENOUN "\n\n"); + string.cat("There are known problems with this "); + string.cat(emulator_info::get_gamenoun()); + string.cat("\n\n"); /* add a warning if any ROMs are flagged BAD_DUMP/NO_DUMP */ - if (rom_load_knownbad(machine) > 0) - string.cat("One or more ROMs/CHDs for this " GAMENOUN " have not been correctly dumped.\n"); - + if (rom_load_knownbad(machine) > 0) { + string.cat("One or more ROMs/CHDs for this "); + string.cat(emulator_info::get_gamenoun()); + string.cat(" have not been correctly dumped.\n"); + } /* add one line per warning flag */ if (input_machine_has_keyboard(machine)) string.cat("The keyboard emulation may not be 100% accurate.\n"); @@ -957,12 +963,20 @@ /* 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"); - if (machine.system().flags & GAME_NOT_WORKING) - string.cat("\nTHIS " CAPGAMENOUN " DOESN'T WORK. The emulation for this game is not yet complete. " + if (machine.system().flags & GAME_NOT_WORKING) { + string.cat("\nTHIS "); + string.cat(emulator_info::get_capgamenoun()); + string.cat(" DOESN'T WORK. The emulation for this game is not yet complete. " "There is nothing you can do to fix this problem except wait for the developers to improve the emulation.\n"); - if (machine.system().flags & GAME_MECHANICAL) - string.cat("\nCertain elements of this " GAMENOUN " cannot be emulated as it requires actual physical interaction or consists of mechanical devices. " - "It is not possible to fully play this " GAMENOUN ".\n"); + } + if (machine.system().flags & GAME_MECHANICAL) { + string.cat("\nCertain elements of this "); + string.cat(emulator_info::get_gamenoun()); + string.cat(" cannot be emulated as it requires actual physical interaction or consists of mechanical devices. " + "It is not possible to fully play this "); + string.cat(emulator_info::get_gamenoun()); + string.cat(".\n"); + } /* find the parent of this driver */ driver_enumerator drivlist(machine.options()); @@ -1004,28 +1018,31 @@ astring &game_info_astring(running_machine &machine, astring &string) { - int scrcount = machine.devicelist().count(SCREEN); + screen_device_iterator scriter(machine.root_device()); + int scrcount = scriter.count(); int found_sound = FALSE; /* print description, manufacturer, and CPU: */ string.printf("%s\n%s %s\n\nCPU:\n", machine.system().description, machine.system().year, machine.system().manufacturer); /* loop over all CPUs */ - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator execiter(machine.root_device()); + tagmap_t exectags; + for (device_execute_interface *exec = execiter.first(); exec != NULL; exec = execiter.next()) { + if (exectags.add(exec->device().tag(), 1, FALSE) == TMERR_DUPLICATE) + continue; /* get cpu specific clock that takes internal multiplier/dividers into account */ int clock = exec->device().clock(); /* count how many identical CPUs we have */ int count = 1; - device_execute_interface *scan = NULL; - for (bool gotanother = exec->next(scan); gotanother; gotanother = scan->next(scan)) + execute_interface_iterator execinneriter(machine.root_device()); + for (device_execute_interface *scan = execinneriter.first(); scan != NULL; scan = execinneriter.next()) { - if (exec->device().type() != scan->device().type() || exec->device().clock() != scan->device().clock()) - break; - count++; - exec = scan; + if (exec->device().type() == scan->device().type() && exec->device().clock() == scan->device().clock()) + if (exectags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) + count++; } /* if more than one, prepend a #x in front of the CPU name */ @@ -1041,9 +1058,13 @@ } /* loop over all sound chips */ - device_sound_interface *sound = NULL; - for (bool gotone = machine.devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator snditer(machine.root_device()); + tagmap_t soundtags; + for (device_sound_interface *sound = snditer.first(); sound != NULL; sound = snditer.next()) { + if (soundtags.add(sound->device().tag(), 1, FALSE) == TMERR_DUPLICATE) + continue; + /* append the Sound: string */ if (!found_sound) string.cat("\nSound:\n"); @@ -1051,15 +1072,13 @@ /* count how many identical sound chips we have */ int count = 1; - device_sound_interface *scan = NULL; - for (bool gotanother = sound->next(scan); gotanother; gotanother = scan->next(scan)) + sound_interface_iterator sndinneriter(machine.root_device()); + for (device_sound_interface *scan = sndinneriter.first(); scan != NULL; scan = sndinneriter.next()) { - if (sound->device().type() != scan->device().type() || sound->device().clock() != scan->device().clock()) - break; - count++; - sound = scan; + if (sound->device().type() == scan->device().type() && sound->device().clock() == scan->device().clock()) + if (soundtags.add(scan->device().tag(), 1, FALSE) != TMERR_DUPLICATE) + count++; } - /* if more than one, prepend a #x in front of the CPU name */ if (count > 1) string.catprintf("%d" UTF8_MULTIPLY, count); @@ -1081,7 +1100,8 @@ string.cat("None\n"); else { - for (screen_device *screen = machine.first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine.root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) { if (scrcount > 1) { @@ -1096,8 +1116,7 @@ const rectangle &visarea = screen->visible_area(); string.catprintf("%d " UTF8_MULTIPLY " %d (%s) %f" UTF8_NBSP "Hz\n", - visarea.max_x - visarea.min_x + 1, - visarea.max_y - visarea.min_y + 1, + visarea.width(), visarea.height(), (machine.system().flags & ORIENTATION_SWAP_XY) ? "V" : "H", ATTOSECONDS_TO_HZ(screen->frame_period().attoseconds)); } @@ -1258,17 +1277,13 @@ void ui_image_handler_ingame(running_machine &machine) { - device_image_interface *image = NULL; - /* run display routine for devices */ if (machine.phase() == MACHINE_PHASE_RUNNING) { - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) - { + image_interface_iterator iter(machine.root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) image->call_display(); - } } - } /*------------------------------------------------- @@ -1366,11 +1381,11 @@ /* turn on menus if requested */ if (ui_input_pressed(machine, IPT_UI_CONFIGURE)) - return ui_set_handler(ui_menu_ui_handler, 0); + return ui_set_handler(ui_menu::ui_handler, 0); /* if the on-screen display isn't up and the user has toggled it, turn it on */ if ((machine.debug_flags & DEBUG_FLAG_ENABLED) == 0 && ui_input_pressed(machine, IPT_UI_ON_SCREEN_DISPLAY)) - return ui_set_handler(ui_slider_ui_handler, 1); + return ui_set_handler(ui_menu_sliders::ui_handler, 1); /* handle a reset request */ if (ui_input_pressed(machine, IPT_UI_RESET_MACHINE)) @@ -1631,7 +1646,6 @@ { input_field_config *field; input_port_config *port; - device_t *device; slider_state *listhead = NULL; slider_state **tailptr = &listhead; astring string; @@ -1670,8 +1684,8 @@ /* add CPU overclocking (cheat only) */ if (machine.options().cheat()) { - device_execute_interface *exec = NULL; - for (bool gotone = machine.devicelist().first(exec); gotone; gotone = exec->next(exec)) + execute_interface_iterator iter(machine.root_device()); + for (device_execute_interface *exec = iter.first(); exec != NULL; exec = iter.next()) { void *param = (void *)&exec->device(); string.printf("Overclock CPU %s", exec->device().tag()); @@ -1681,7 +1695,8 @@ } /* add screen parameters */ - for (screen_device *screen = machine.first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator scriter(machine.root_device()); + for (screen_device *screen = scriter.first(); screen != NULL; screen = scriter.next()) { int defxscale = floor(screen->xscale() * 1000.0f + 0.5f); int defyscale = floor(screen->yscale() * 1000.0f + 0.5f); @@ -1723,35 +1738,34 @@ tailptr = &(*tailptr)->next; } - for (device = machine.devicelist().first(); device != NULL; device = device->next()) - if (device_is_laserdisc(device)) - { - const laserdisc_config *config = (const laserdisc_config *)downcast(device)->inline_config(); - if (config->overupdate != NULL) - { - int defxscale = floor(config->overscalex * 1000.0f + 0.5f); - int defyscale = floor(config->overscaley * 1000.0f + 0.5f); - int defxoffset = floor(config->overposx * 1000.0f + 0.5f); - int defyoffset = floor(config->overposy * 1000.0f + 0.5f); - void *param = (void *)device; - - /* add scale and offset controls per-overlay */ - string.printf("%s Horiz Stretch", slider_get_laserdisc_desc(device)); - *tailptr = slider_alloc(machine, string, 500, (defxscale == 0) ? 1000 : defxscale, 1500, 2, slider_overxscale, param); - tailptr = &(*tailptr)->next; - string.printf("%s Horiz Position", slider_get_laserdisc_desc(device)); - *tailptr = slider_alloc(machine, string, -500, defxoffset, 500, 2, slider_overxoffset, param); - tailptr = &(*tailptr)->next; - string.printf("%s Vert Stretch", slider_get_laserdisc_desc(device)); - *tailptr = slider_alloc(machine, string, 500, (defyscale == 0) ? 1000 : defyscale, 1500, 2, slider_overyscale, param); - tailptr = &(*tailptr)->next; - string.printf("%s Vert Position", slider_get_laserdisc_desc(device)); - *tailptr = slider_alloc(machine, string, -500, defyoffset, 500, 2, slider_overyoffset, param); - tailptr = &(*tailptr)->next; - } + laserdisc_device_iterator lditer(machine.root_device()); + for (laserdisc_device *laserdisc = lditer.first(); laserdisc != NULL; laserdisc = lditer.next()) + if (laserdisc->overlay_configured()) + { + laserdisc_overlay_config config; + laserdisc->get_overlay_config(config); + int defxscale = floor(config.m_overscalex * 1000.0f + 0.5f); + int defyscale = floor(config.m_overscaley * 1000.0f + 0.5f); + int defxoffset = floor(config.m_overposx * 1000.0f + 0.5f); + int defyoffset = floor(config.m_overposy * 1000.0f + 0.5f); + void *param = (void *)laserdisc; + + /* add scale and offset controls per-overlay */ + string.printf("Laserdisc '%s' Horiz Stretch", laserdisc->tag()); + *tailptr = slider_alloc(machine, string, 500, (defxscale == 0) ? 1000 : defxscale, 1500, 2, slider_overxscale, param); + tailptr = &(*tailptr)->next; + string.printf("Laserdisc '%s' Horiz Position", laserdisc->tag()); + *tailptr = slider_alloc(machine, string, -500, defxoffset, 500, 2, slider_overxoffset, param); + tailptr = &(*tailptr)->next; + string.printf("Laserdisc '%s' Vert Stretch", laserdisc->tag()); + *tailptr = slider_alloc(machine, string, 500, (defyscale == 0) ? 1000 : defyscale, 1500, 2, slider_overyscale, param); + tailptr = &(*tailptr)->next; + string.printf("Laserdisc '%s' Vert Position", laserdisc->tag()); + *tailptr = slider_alloc(machine, string, -500, defyoffset, 500, 2, slider_overyoffset, param); + tailptr = &(*tailptr)->next; } - for (screen_device *screen = machine.first_screen(); screen != NULL; screen = screen->next_screen()) + for (screen_device *screen = scriter.first(); screen != NULL; screen = scriter.next()) if (screen->screen_type() == SCREEN_TYPE_VECTOR) { /* add flicker control */ @@ -2040,18 +2054,18 @@ static INT32 slider_overxscale(running_machine &machine, void *arg, astring *string, INT32 newval) { - device_t *laserdisc = (device_t *)arg; - laserdisc_config settings; + laserdisc_device *laserdisc = (laserdisc_device *)arg; + laserdisc_overlay_config settings; - laserdisc_get_config(laserdisc, &settings); + laserdisc->get_overlay_config(settings); if (newval != SLIDER_NOCHANGE) { - settings.overscalex = (float)newval * 0.001f; - laserdisc_set_config(laserdisc, &settings); + settings.m_overscalex = (float)newval * 0.001f; + laserdisc->set_overlay_config(settings); } if (string != NULL) - string->printf("%.3f", settings.overscalex); - return floor(settings.overscalex * 1000.0f + 0.5f); + string->printf("%.3f", settings.m_overscalex); + return floor(settings.m_overscalex * 1000.0f + 0.5f); } @@ -2062,18 +2076,18 @@ static INT32 slider_overyscale(running_machine &machine, void *arg, astring *string, INT32 newval) { - device_t *laserdisc = (device_t *)arg; - laserdisc_config settings; + laserdisc_device *laserdisc = (laserdisc_device *)arg; + laserdisc_overlay_config settings; - laserdisc_get_config(laserdisc, &settings); + laserdisc->get_overlay_config(settings); if (newval != SLIDER_NOCHANGE) { - settings.overscaley = (float)newval * 0.001f; - laserdisc_set_config(laserdisc, &settings); + settings.m_overscaley = (float)newval * 0.001f; + laserdisc->set_overlay_config(settings); } if (string != NULL) - string->printf("%.3f", settings.overscaley); - return floor(settings.overscaley * 1000.0f + 0.5f); + string->printf("%.3f", settings.m_overscaley); + return floor(settings.m_overscaley * 1000.0f + 0.5f); } @@ -2084,18 +2098,18 @@ static INT32 slider_overxoffset(running_machine &machine, void *arg, astring *string, INT32 newval) { - device_t *laserdisc = (device_t *)arg; - laserdisc_config settings; + laserdisc_device *laserdisc = (laserdisc_device *)arg; + laserdisc_overlay_config settings; - laserdisc_get_config(laserdisc, &settings); + laserdisc->get_overlay_config(settings); if (newval != SLIDER_NOCHANGE) { - settings.overposx = (float)newval * 0.001f; - laserdisc_set_config(laserdisc, &settings); + settings.m_overposx = (float)newval * 0.001f; + laserdisc->set_overlay_config(settings); } if (string != NULL) - string->printf("%.3f", settings.overposx); - return floor(settings.overposx * 1000.0f + 0.5f); + string->printf("%.3f", settings.m_overposx); + return floor(settings.m_overposx * 1000.0f + 0.5f); } @@ -2106,18 +2120,18 @@ static INT32 slider_overyoffset(running_machine &machine, void *arg, astring *string, INT32 newval) { - device_t *laserdisc = (device_t *)arg; - laserdisc_config settings; + laserdisc_device *laserdisc = (laserdisc_device *)arg; + laserdisc_overlay_config settings; - laserdisc_get_config(laserdisc, &settings); + laserdisc->get_overlay_config(settings); if (newval != SLIDER_NOCHANGE) { - settings.overposy = (float)newval * 0.001f; - laserdisc_set_config(laserdisc, &settings); + settings.m_overposy = (float)newval * 0.001f; + laserdisc->set_overlay_config(settings); } if (string != NULL) - string->printf("%.3f", settings.overposy); - return floor(settings.overposy * 1000.0f + 0.5f); + string->printf("%.3f", settings.m_overposy); + return floor(settings.m_overposy * 1000.0f + 0.5f); } @@ -2158,7 +2172,8 @@ static char *slider_get_screen_desc(screen_device &screen) { - int scrcount = screen.machine().devicelist().count(SCREEN); + screen_device_iterator iter(screen.machine().root_device()); + int scrcount = iter.count(); static char descbuf[256]; if (scrcount > 1) @@ -2170,24 +2185,6 @@ } /*------------------------------------------------- - slider_get_laserdisc_desc - returns the - description for a given laseridsc --------------------------------------------------*/ -static char *slider_get_laserdisc_desc(device_t *laserdisc) -{ - static char descbuf[256]; - for (device_t *device = laserdisc->machine().devicelist().first(); device != NULL; device = device->next()) - if (device_is_laserdisc(device) && device != laserdisc) - { - sprintf(descbuf, "Laserdisc '%s'", laserdisc->tag()); - return descbuf; - } - - strcpy(descbuf, "Laserdisc"); - return descbuf; -} - -/*------------------------------------------------- slider_crossscale - crosshair scale slider callback -------------------------------------------------*/ diff -Nru mame-0.144/src/emu/uigfx.c mame-0.145/src/emu/uigfx.c --- mame-0.144/src/emu/uigfx.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/uigfx.c 2012-02-06 21:30:28.000000000 +0000 @@ -30,7 +30,7 @@ /* intermediate bitmaps */ UINT8 bitmap_dirty; /* is the bitmap dirty? */ - bitmap_t * bitmap; /* bitmap for drawing gfx and tilemaps */ + bitmap_rgb32 * bitmap; /* bitmap for drawing gfx and tilemaps */ render_texture *texture; /* texture for rendering the above bitmap */ /* palette-specific data */ @@ -84,7 +84,7 @@ /* graphics set handling */ static void gfxset_handle_keys(running_machine &machine, ui_gfx_state *state, int xcells, int ycells); -static void gfxset_draw_item(running_machine &machine, const gfx_element *gfx, int index, bitmap_t *bitmap, int dstx, int dsty, int color, int rotate); +static void gfxset_draw_item(running_machine &machine, const gfx_element *gfx, int index, bitmap_rgb32 &bitmap, int dstx, int dsty, int color, int rotate); static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state *state, int xcells, int ycells, gfx_element *gfx); static void gfxset_handler(running_machine &machine, render_container *container, ui_gfx_state *state); @@ -154,7 +154,7 @@ ui_gfx_state *state = &ui_gfx; /* if we have nothing, implicitly cancel */ - if (machine.total_colors() == 0 && machine.colortable == NULL && machine.gfx[0] == NULL && tilemap_count(machine) == 0) + if (machine.total_colors() == 0 && machine.colortable == NULL && machine.gfx[0] == NULL && machine.tilemap().count() == 0) goto cancel; /* if we're not paused, mark the bitmap dirty */ @@ -189,7 +189,7 @@ case 2: /* if we have tilemaps, display them */ - if (tilemap_count(machine) > 0) + if (machine.tilemap().count() > 0) { tilemap_handler(machine, container, state); break; @@ -693,16 +693,16 @@ cellypix = 1 + ((state->gfxset.rotate[set] & ORIENTATION_SWAP_XY) ? gfx->width : gfx->height); /* realloc the bitmap if it is too small */ - if (state->bitmap == NULL || state->texture == NULL || state->bitmap->bpp != 32 || state->bitmap->width != cellxpix * xcells || state->bitmap->height != cellypix * ycells) + if (state->bitmap == NULL || state->texture == NULL || state->bitmap->bpp() != 32 || state->bitmap->width() != cellxpix * xcells || state->bitmap->height() != cellypix * ycells) { /* free the old stuff */ machine.render().texture_free(state->texture); global_free(state->bitmap); /* allocate new stuff */ - state->bitmap = global_alloc(bitmap_t(cellxpix * xcells, cellypix * ycells, BITMAP_FORMAT_ARGB32)); + state->bitmap = global_alloc(bitmap_rgb32(cellxpix * xcells, cellypix * ycells)); state->texture = machine.render().texture_alloc(); - state->texture->set_bitmap(state->bitmap, NULL, TEXFORMAT_ARGB32); + state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_ARGB32); /* force a redraw */ state->bitmap_dirty = TRUE; @@ -717,10 +717,7 @@ rectangle cellbounds; /* make a rect that covers this row */ - cellbounds.min_x = 0; - cellbounds.max_x = state->bitmap->width - 1; - cellbounds.min_y = y * cellypix; - cellbounds.max_y = (y + 1) * cellypix - 1; + cellbounds.set(0, state->bitmap->width() - 1, y * cellypix, (y + 1) * cellypix - 1); /* only display if there is data to show */ if (state->gfxset.offset[set] + y * xcells < gfx->total_elements) @@ -736,21 +733,21 @@ /* only render if there is data */ if (index < gfx->total_elements) - gfxset_draw_item(machine, gfx, index, state->bitmap, cellbounds.min_x, cellbounds.min_y, state->gfxset.color[set], state->gfxset.rotate[set]); + gfxset_draw_item(machine, gfx, index, *state->bitmap, cellbounds.min_x, cellbounds.min_y, state->gfxset.color[set], state->gfxset.rotate[set]); /* otherwise, fill with transparency */ else - bitmap_fill(state->bitmap, &cellbounds, 0); + state->bitmap->fill(0, cellbounds); } } /* otherwise, fill with transparency */ else - bitmap_fill(state->bitmap, &cellbounds, 0); + state->bitmap->fill(0, cellbounds); } /* reset the texture to force an update */ - state->texture->set_bitmap(state->bitmap, NULL, TEXFORMAT_ARGB32); + state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_ARGB32); state->bitmap_dirty = FALSE; } } @@ -761,7 +758,7 @@ the view -------------------------------------------------*/ -static void gfxset_draw_item(running_machine &machine, const gfx_element *gfx, int index, bitmap_t *bitmap, int dstx, int dsty, int color, int rotate) +static void gfxset_draw_item(running_machine &machine, const gfx_element *gfx, int index, bitmap_rgb32 &bitmap, int dstx, int dsty, int color, int rotate) { static const pen_t default_palette[] = { @@ -771,7 +768,6 @@ int width = (rotate & ORIENTATION_SWAP_XY) ? gfx->height : gfx->width; int height = (rotate & ORIENTATION_SWAP_XY) ? gfx->width : gfx->height; const rgb_t *palette = (machine.total_colors() != 0) ? palette_entry_list_raw(machine.palette) : NULL; - UINT32 rowpixels = bitmap->rowpixels; UINT32 palette_mask = ~0; int x, y; @@ -786,14 +782,13 @@ /* loop over rows in the cell */ for (y = 0; y < height; y++) { - UINT32 *dest = (UINT32 *)bitmap->base + (dsty + y) * rowpixels + dstx; + UINT32 *dest = &bitmap.pix32(dsty + y, dstx); const UINT8 *src = gfx_element_get_data(gfx, index); /* loop over columns in the cell */ for (x = 0; x < width; x++) { int effx = x, effy = y; - rgb_t pixel; const UINT8 *s; /* compute effective x,y values after rotation */ @@ -818,11 +813,7 @@ s = src + effy * gfx->line_modulo; /* extract the pixel */ - if (gfx->flags & GFX_ELEMENT_PACKED) - pixel = (s[effx/2] >> ((effx & 1) * 4)) & 0xf; - else - pixel = s[effx]; - *dest++ = 0xff000000 | palette[pixel & palette_mask]; + *dest++ = 0xff000000 | palette[s[effx] & palette_mask]; } } } @@ -855,7 +846,9 @@ char title[100]; /* get the size of the tilemap itself */ - tilemap_size_by_index(machine, state->tilemap.which, &mapwidth, &mapheight); + tilemap_t *tilemap = machine.tilemap().find(state->tilemap.which); + mapwidth = tilemap->width(); + mapheight = tilemap->height(); if (state->tilemap.rotate & ORIENTATION_SWAP_XY) { UINT32 temp = mapwidth; mapwidth = mapheight; mapheight = temp; } @@ -907,7 +900,7 @@ boxbounds.y1 = mapboxbounds.y1 + 0.5f * chheight; /* figure out the title and expand the outer box to fit */ - sprintf(title, "TMAP %d/%d %dx%d OFFS %d,%d", state->tilemap.which, tilemap_count(machine) - 1, mapwidth, mapheight, state->tilemap.xoffs, state->tilemap.yoffs); + sprintf(title, "TMAP %d/%d %dx%d OFFS %d,%d", state->tilemap.which, machine.tilemap().count() - 1, mapwidth, mapheight, state->tilemap.xoffs, state->tilemap.yoffs); titlewidth = ui_font->string_width(chheight, machine.render().ui_aspect(), title); if (boxbounds.x1 - boxbounds.x0 < titlewidth + chwidth) { @@ -961,11 +954,13 @@ /* clamp within range */ if (state->tilemap.which < 0) state->tilemap.which = 0; - if (state->tilemap.which >= tilemap_count(machine)) - state->tilemap.which = tilemap_count(machine) - 1; + if (state->tilemap.which >= machine.tilemap().count()) + state->tilemap.which = machine.tilemap().count() - 1; /* cache some info in locals */ - tilemap_size_by_index(machine, state->tilemap.which, &mapwidth, &mapheight); + tilemap_t *tilemap = machine.tilemap().find(state->tilemap.which); + mapwidth = tilemap->width(); + mapheight = tilemap->height(); /* handle zoom (minus,plus) */ if (ui_input_pressed(machine, IPT_UI_ZOOM_OUT)) @@ -1031,34 +1026,22 @@ static void tilemap_update_bitmap(running_machine &machine, ui_gfx_state *state, int width, int height) { - bitmap_format screen_format = machine.primary_screen->format(); - palette_t *palette = NULL; - int screen_texformat; - - /* convert the screen format to a texture format */ - switch (screen_format) - { - case BITMAP_FORMAT_INDEXED16: screen_texformat = TEXFORMAT_PALETTE16; palette = machine.palette; break; - case BITMAP_FORMAT_RGB15: screen_texformat = TEXFORMAT_RGB15; palette = NULL; break; - case BITMAP_FORMAT_RGB32: screen_texformat = TEXFORMAT_RGB32; palette = NULL; break; - default: fatalerror("Invalid bitmap format!"); break; - } - /* swap the coordinates back if they were talking about a rotated surface */ if (state->tilemap.rotate & ORIENTATION_SWAP_XY) { UINT32 temp = width; width = height; height = temp; } /* realloc the bitmap if it is too small */ - if (state->bitmap == NULL || state->texture == NULL || state->bitmap->format != screen_format || state->bitmap->width != width || state->bitmap->height != height) + if (state->bitmap == NULL || state->texture == NULL || state->bitmap->width() != width || state->bitmap->height() != height) { /* free the old stuff */ machine.render().texture_free(state->texture); global_free(state->bitmap); /* allocate new stuff */ - state->bitmap = global_alloc(bitmap_t(width, height, screen_format)); + state->bitmap = global_alloc(bitmap_rgb32(width, height)); + state->bitmap->set_palette(machine.palette); state->texture = machine.render().texture_alloc(); - state->texture->set_bitmap(state->bitmap, NULL, screen_texformat, palette); + state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_RGB32); /* force a redraw */ state->bitmap_dirty = TRUE; @@ -1067,10 +1050,11 @@ /* handle the redraw */ if (state->bitmap_dirty) { - tilemap_draw_by_index(machine, state->bitmap, state->tilemap.which, state->tilemap.xoffs, state->tilemap.yoffs); + tilemap_t *tilemap = machine.tilemap().find(state->tilemap.which); + tilemap->draw_debug(*state->bitmap, state->tilemap.xoffs, state->tilemap.yoffs); /* reset the texture to force an update */ - state->texture->set_bitmap(state->bitmap, NULL, screen_texformat, palette); + state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_RGB32); state->bitmap_dirty = FALSE; } } diff -Nru mame-0.144/src/emu/uiimage.c mame-0.145/src/emu/uiimage.c --- mame-0.144/src/emu/uiimage.c 2011-08-04 02:16:30.000000000 +0000 +++ mame-0.145/src/emu/uiimage.c 2012-02-06 21:30:28.000000000 +0000 @@ -22,8 +22,10 @@ #include "ui.h" #include "uimenu.h" #include "uiswlist.h" +#include "uiimage.h" #include "zippath.h" #include "unicode.h" +#include "imagedev/floppy.h" #include "imagedev/cassette.h" #include "imagedev/bitbngr.h" @@ -47,79 +49,6 @@ #define ITEMREF_NO ((void *) 0x0004) #define ITEMREF_YES ((void *) 0x0005) - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* menu item type in the file selector */ -enum _file_selector_entry_type -{ - SELECTOR_ENTRY_TYPE_EMPTY, - SELECTOR_ENTRY_TYPE_CREATE, - SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, - SELECTOR_ENTRY_TYPE_DRIVE, - SELECTOR_ENTRY_TYPE_DIRECTORY, - SELECTOR_ENTRY_TYPE_FILE -}; -typedef enum _file_selector_entry_type file_selector_entry_type; - - - -/* an entry within the file manager */ -typedef struct _file_selector_entry file_selector_entry; -struct _file_selector_entry -{ - file_selector_entry *next; - - file_selector_entry_type type; - const char *basename; - const char *fullpath; -}; - - - -/* state of the file manager */ -typedef struct _file_manager_menu_state file_manager_menu_state; -struct _file_manager_menu_state -{ - device_image_interface *selected_device; - astring *current_directory; - astring *current_file; -}; - - - -/* state of the file selector menu */ -typedef struct _file_selector_menu_state file_selector_menu_state; -struct _file_selector_menu_state -{ - file_manager_menu_state *manager_menustate; - file_selector_entry *entrylist; - char filename_buffer[1024]; -}; - - - -/* state of the file creator menu */ -typedef struct _file_create_menu_state file_create_menu_state; -struct _file_create_menu_state -{ - file_manager_menu_state *manager_menustate; - const image_device_format *current_format; - int confirm_save_as_yes; - char filename_buffer[1024]; -}; - - -/* state of the confirm save as menu */ -typedef struct _confirm_save_as_menu_state confirm_save_as_menu_state; -struct _confirm_save_as_menu_state -{ - int *yes; -}; - /*************************************************************************** MENU HELPERS ***************************************************************************/ @@ -151,14 +80,14 @@ or footer text -------------------------------------------------*/ -static void extra_text_draw_box(render_container &ui_container, float origx1, float origx2, float origy, float yspan, const char *text, int direction) +static void extra_text_draw_box(render_container *container, float origx1, float origx2, float origy, float yspan, const char *text, int direction) { float text_width, text_height; float width, maxwidth; float x1, y1, x2, y2, temp; /* get the size of the text */ - ui_draw_text_full(&ui_container,text, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, + ui_draw_text_full(container,text, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &text_width, &text_height); width = text_width + (2 * UI_BOX_LR_BORDER); maxwidth = MAX(width, origx2 - origx1); @@ -177,7 +106,7 @@ } /* draw a box */ - ui_draw_outlined_box(&ui_container,x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(container,x1, y1, x2, y2, UI_BACKGROUND_COLOR); /* take off the borders */ x1 += UI_BOX_LR_BORDER; @@ -186,7 +115,7 @@ y2 -= UI_BOX_TB_BORDER; /* draw the text within it */ - ui_draw_text_full(&ui_container,text, x1, y1, text_width, JUSTIFY_LEFT, WRAP_WORD, + ui_draw_text_full(container,text, x1, y1, text_width, JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, ARGB_WHITE, ARGB_BLACK, NULL, NULL); } @@ -197,7 +126,7 @@ and footer text -------------------------------------------------*/ -static void extra_text_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, +static void extra_text_render(render_container *container, float top, float bottom, float origx1, float origy1, float origx2, float origy2, const char *header, const char *footer) { @@ -205,9 +134,9 @@ footer = ((footer != NULL) && (footer[0] != '\0')) ? footer : NULL; if (header != NULL) - extra_text_draw_box(machine.render().ui_container(), origx1, origx2, origy1, top, header, -1); + extra_text_draw_box(container, origx1, origx2, origy1, top, header, -1); if (footer != NULL) - extra_text_draw_box(machine.render().ui_container(), origx1, origx2, origy2, bottom, footer, +1); + extra_text_draw_box(container, origx1, origx2, origy2, bottom, footer, +1); } @@ -221,40 +150,41 @@ confirm save as menu -------------------------------------------------*/ -static void menu_confirm_save_as_populate(running_machine &machine, ui_menu *menu, void *state) +ui_menu_confirm_save_as::ui_menu_confirm_save_as(running_machine &machine, render_container *container, bool *_yes) : ui_menu(machine, container) { - ui_menu_item_append(menu, "File Already Exists - Overide?", NULL, MENU_FLAG_DISABLE, NULL); - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, MENU_FLAG_DISABLE, NULL); - ui_menu_item_append(menu, "No", NULL, 0, ITEMREF_NO); - ui_menu_item_append(menu, "Yes", NULL, 0, ITEMREF_YES); + yes = _yes; + *yes = false; } +ui_menu_confirm_save_as::~ui_menu_confirm_save_as() +{ +} +void ui_menu_confirm_save_as::populate() +{ + item_append("File Already Exists - Override?", NULL, MENU_FLAG_DISABLE, NULL); + item_append(MENU_SEPARATOR_ITEM, NULL, MENU_FLAG_DISABLE, NULL); + item_append("No", NULL, 0, ITEMREF_NO); + item_append("Yes", NULL, 0, ITEMREF_YES); +} /*------------------------------------------------- menu_confirm_save_as - confirm save as menu -------------------------------------------------*/ -static void menu_confirm_save_as(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_confirm_save_as::handle() { - const ui_menu_event *event; - confirm_save_as_menu_state *menustate = (confirm_save_as_menu_state *) state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_confirm_save_as_populate(machine, menu, state); - /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); /* process the event */ if ((event != NULL) && (event->iptkey == IPT_UI_SELECT)) { if (event->itemref == ITEMREF_YES) - *menustate->yes = TRUE; + *yes = true; /* no matter what, pop out */ - ui_menu_stack_pop(machine); + ui_menu::stack_pop(machine()); } } @@ -293,12 +223,10 @@ special rendering -------------------------------------------------*/ -static void file_create_render_extra(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void ui_menu_file_create::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { - file_create_menu_state *menustate = (file_create_menu_state *) state; - - extra_text_render(machine, menu, state, selectedref, top, bottom, origx1, origy1, origx2, origy2, - astring_c(menustate->manager_menustate->current_directory), + extra_text_render(container, top, bottom, origx1, origy1, origx2, origy2, + current_directory, NULL); } @@ -309,148 +237,57 @@ creator menu -------------------------------------------------*/ -static void menu_file_create_populate(running_machine &machine, ui_menu *menu, void *state, void *selection) +ui_menu_file_create::ui_menu_file_create(running_machine &machine, render_container *container, device_image_interface *_image, astring &_current_directory, astring &_current_file) : ui_menu(machine, container), current_directory(_current_directory), current_file(_current_file) +{ + image = _image; +} + +ui_menu_file_create::~ui_menu_file_create() +{ +} + +void ui_menu_file_create::populate() { astring buffer; - file_create_menu_state *menustate = (file_create_menu_state *) state; - device_image_interface *device = menustate->manager_menustate->selected_device; const image_device_format *format; const char *new_image_name; /* append the "New Image Name" item */ - if (selection == ITEMREF_NEW_IMAGE_NAME) + if (get_selection() == ITEMREF_NEW_IMAGE_NAME) { - astring_assemble_2(&buffer, menustate->filename_buffer, "_"); - new_image_name = astring_c(&buffer); + buffer.cat(filename_buffer).cat("_"); + new_image_name = buffer; } else { - new_image_name = menustate->filename_buffer; + new_image_name = filename_buffer; } - ui_menu_item_append(menu, "New Image Name:", new_image_name, 0, ITEMREF_NEW_IMAGE_NAME); + item_append("New Image Name:", new_image_name, 0, ITEMREF_NEW_IMAGE_NAME); /* do we support multiple formats? */ - format = device->device_get_creatable_formats(); + format = image->device_get_creatable_formats(); if (ENABLE_FORMATS && (format != NULL)) { - ui_menu_item_append(menu, "Image Format:", menustate->current_format->m_description, 0, ITEMREF_FORMAT); - menustate->current_format = format; + item_append("Image Format:", current_format->m_description, 0, ITEMREF_FORMAT); + current_format = format; } /* finish up the menu */ - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Create", NULL, 0, ITEMREF_CREATE); + item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + item_append("Create", NULL, 0, ITEMREF_CREATE); - /* set up custom render proc */ - ui_menu_set_custom_render(menu, file_create_render_extra, ui_get_line_height(machine) + 3.0f * UI_BOX_TB_BORDER, 0); + customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER; } - -/*------------------------------------------------- - create_new_image - creates a new disk image --------------------------------------------------*/ - -static int create_new_image(device_image_interface *image, const char *directory, const char *filename, int *yes) -{ - astring *path; - osd_directory_entry *entry; - osd_dir_entry_type file_type; - int do_create, err; - int result = FALSE; - ui_menu *child_menu; - confirm_save_as_menu_state *child_menustate; - - /* assemble the full path */ - path = zippath_combine(astring_alloc(), directory, filename); - - /* does a file or a directory exist at the path */ - entry = osd_stat(astring_c(path)); - file_type = (entry != NULL) ? entry->type : ENTTYPE_NONE; - if (entry != NULL) - free(entry); - - /* special case */ - if ((file_type == ENTTYPE_FILE) && *yes) - file_type = ENTTYPE_NONE; - - switch(file_type) - { - case ENTTYPE_NONE: - /* no file/dir here - always create */ - do_create = TRUE; - break; - - case ENTTYPE_FILE: - /* a file exists here - ask for permission from the user */ - child_menu = ui_menu_alloc(image->device().machine(), &image->device().machine().render().ui_container(), menu_confirm_save_as, NULL); - child_menustate = (confirm_save_as_menu_state*)ui_menu_alloc_state(child_menu, sizeof(*child_menustate), NULL); - child_menustate->yes = yes; - ui_menu_stack_push(child_menu); - do_create = FALSE; - break; - - case ENTTYPE_DIR: - /* a directory exists here - we can't save over it */ - ui_popup_time(ERROR_MESSAGE_TIME, "Cannot save over directory"); - do_create = FALSE; - break; - - default: - fatalerror("Unexpected"); - do_create = FALSE; - break; - } - - /* create the image, if appropriate */ - if (do_create) - { - err = image->create(astring_c(path), 0, NULL); - if (err != 0) - popmessage("Error: %s", image->error()); - else - result = TRUE; - } - - /* free the path */ - astring_free(path); - - return result; -} - - - /*------------------------------------------------- menu_file_create - file creator menu -------------------------------------------------*/ -static void menu_file_create(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_file_create::handle() { - void *selection; - const ui_menu_event *event; - ui_menu_event fake_event; - file_create_menu_state *menustate = (file_create_menu_state *) state; - - /* identify the selection */ - selection = ui_menu_get_selection(menu); - - /* rebuild the menu */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - menu_file_create_populate(machine, menu, state, selection); - - if (menustate->confirm_save_as_yes) - { - /* we just returned from a "confirm save as" dialog and the user said "yes" - fake an event */ - memset(&fake_event, 0, sizeof(fake_event)); - fake_event.iptkey = IPT_UI_SELECT; - fake_event.itemref = ITEMREF_CREATE; - event = &fake_event; - } - else - { - /* process the menu */ - event = ui_menu_process(machine, menu, 0); - } + /* process the menu */ + const ui_menu_event *event = process(0); /* process the event */ if (event != NULL) @@ -461,27 +298,20 @@ case IPT_UI_SELECT: if ((event->itemref == ITEMREF_CREATE) || (event->itemref == ITEMREF_NEW_IMAGE_NAME)) { - if (create_new_image( - menustate->manager_menustate->selected_device, - astring_c(menustate->manager_menustate->current_directory), - menustate->filename_buffer, - &menustate->confirm_save_as_yes)) - { - /* success - pop out twice to device view */ - ui_menu_stack_pop(machine); - ui_menu_stack_pop(machine); - } + current_file.cpy(filename_buffer); + ui_menu::stack_pop(machine()); } break; case IPT_SPECIAL: - if (ui_menu_get_selection(menu) == ITEMREF_NEW_IMAGE_NAME) + if (get_selection() == ITEMREF_NEW_IMAGE_NAME) { input_character( - menustate->filename_buffer, - ARRAY_LENGTH(menustate->filename_buffer), + filename_buffer, + ARRAY_LENGTH(filename_buffer), event->unichar, is_valid_filename_char); + reset(UI_MENU_RESET_REMEMBER_POSITION); } break; } @@ -499,13 +329,11 @@ special rendering -------------------------------------------------*/ -static void file_selector_render_extra(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void ui_menu_file_selector::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { - file_selector_menu_state *menustate = (file_selector_menu_state *) state; - - extra_text_render(machine, menu, state, selectedref, top, bottom, + extra_text_render(container, top, bottom, origx1, origy1, origx2, origy2, - astring_c(menustate->manager_menustate->current_directory), + current_directory, NULL); } @@ -516,7 +344,7 @@ for file selector entries -------------------------------------------------*/ -static int compare_file_selector_entries(const file_selector_entry *e1, const file_selector_entry *e2) +int ui_menu_file_selector::compare_entries(const file_selector_entry *e1, const file_selector_entry *e2) { int result; const char *e1_basename = (e1->basename != NULL) ? e1->basename : ""; @@ -552,26 +380,26 @@ /*------------------------------------------------- - append_file_selector_entry - appends a new + append_entry - appends a new file selector entry to an entry list -------------------------------------------------*/ -static file_selector_entry *append_file_selector_entry(ui_menu *menu, file_selector_menu_state *menustate, +ui_menu_file_selector::file_selector_entry *ui_menu_file_selector::append_entry( file_selector_entry_type entry_type, const char *entry_basename, const char *entry_fullpath) { file_selector_entry *entry; file_selector_entry **entryptr; /* allocate a new entry */ - entry = (file_selector_entry *) ui_menu_pool_alloc(menu, sizeof(*entry)); + entry = (file_selector_entry *) m_pool_alloc(sizeof(*entry)); memset(entry, 0, sizeof(*entry)); entry->type = entry_type; - entry->basename = (entry_basename != NULL) ? ui_menu_pool_strdup(menu, entry_basename) : entry_basename; - entry->fullpath = (entry_fullpath != NULL) ? ui_menu_pool_strdup(menu, entry_fullpath) : entry_fullpath; + entry->basename = (entry_basename != NULL) ? pool_strdup(entry_basename) : entry_basename; + entry->fullpath = (entry_fullpath != NULL) ? pool_strdup(entry_fullpath) : entry_fullpath; /* find the end of the list */ - entryptr = &menustate->entrylist; - while ((*entryptr != NULL) && (compare_file_selector_entries(entry, *entryptr) >= 0)) + entryptr = &entrylist; + while ((*entryptr != NULL) && (compare_entries(entry, *entryptr) >= 0)) entryptr = &(*entryptr)->next; /* insert the entry */ @@ -583,14 +411,13 @@ /*------------------------------------------------- - append_file_selector_entry_menu_item - appends + append_entry_menu_item - appends a menu item for a file selector entry -------------------------------------------------*/ -static file_selector_entry *append_dirent_file_selector_entry(ui_menu *menu, file_selector_menu_state *menustate, - const osd_directory_entry *dirent) +ui_menu_file_selector::file_selector_entry *ui_menu_file_selector::append_dirent_entry(const osd_directory_entry *dirent) { - astring *buffer; + astring buffer; file_selector_entry_type entry_type; file_selector_entry *entry; @@ -610,31 +437,25 @@ } /* determine the full path */ - buffer = zippath_combine( - astring_alloc(), - astring_c(menustate->manager_menustate->current_directory), - dirent->name); + zippath_combine(buffer, current_directory, dirent->name); /* create the file selector entry */ - entry = append_file_selector_entry( - menu, - menustate, + entry = append_entry( entry_type, dirent->name, - astring_c(buffer)); + buffer); - astring_free(buffer); return entry; } /*------------------------------------------------- - append_file_selector_entry_menu_item - appends + append_entry_menu_item - appends a menu item for a file selector entry -------------------------------------------------*/ -static void append_file_selector_entry_menu_item(ui_menu *menu, const file_selector_entry *entry) +void ui_menu_file_selector::append_entry_menu_item(const file_selector_entry *entry) { const char *text = NULL; const char *subtext = NULL; @@ -668,7 +489,7 @@ subtext = "[FILE]"; break; } - ui_menu_item_append(menu, text, subtext, 0, (void *) entry); + item_append(text, subtext, 0, (void *) entry); } @@ -677,7 +498,20 @@ allocates all menu items for a directory -------------------------------------------------*/ -static file_error menu_file_selector_populate(running_machine &machine, ui_menu *menu, file_selector_menu_state *menustate) +ui_menu_file_selector::ui_menu_file_selector(running_machine &machine, render_container *container, device_image_interface *_image, astring &_current_directory, astring &_current_file, bool _has_empty, bool _has_softlist, bool _has_create, int *_result) : ui_menu(machine, container), current_directory(_current_directory), current_file(_current_file) +{ + image = _image; + has_empty = _has_empty; + has_softlist = _has_softlist; + has_create = _has_create; + result = _result; +} + +ui_menu_file_selector::~ui_menu_file_selector() +{ +} + +void ui_menu_file_selector::populate() { zippath_directory *directory = NULL; file_error err = FILERR_NONE; @@ -686,8 +520,7 @@ const file_selector_entry *selected_entry = NULL; int i; const char *volume_name; - device_image_interface *device = menustate->manager_menustate->selected_device; - const char *path = astring_c(menustate->manager_menustate->current_directory); + const char *path = current_directory; /* open the directory */ err = zippath_opendir(path, &directory); @@ -695,25 +528,29 @@ goto done; /* clear out the menu entries */ - menustate->entrylist = NULL; + entrylist = NULL; - /* add the "[empty slot]" entry */ - append_file_selector_entry(menu, menustate, SELECTOR_ENTRY_TYPE_EMPTY, NULL, NULL); + if (has_empty) + { + /* add the "[empty slot]" entry */ + append_entry(SELECTOR_ENTRY_TYPE_EMPTY, NULL, NULL); + } - if (device->is_creatable() && !zippath_is_zip(directory)) + if (has_create) { /* add the "[create]" entry */ - append_file_selector_entry(menu, menustate, SELECTOR_ENTRY_TYPE_CREATE, NULL, NULL); + append_entry(SELECTOR_ENTRY_TYPE_CREATE, NULL, NULL); } - /* add the "[software list]" entry */ - append_file_selector_entry(menu, menustate, SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, NULL, NULL); + if (has_softlist) + /* add the "[software list]" entry */ + append_entry(SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, NULL, NULL); /* add the drives */ i = 0; while((volume_name = osd_get_volume_name(i))!=NULL) { - append_file_selector_entry(menu, menustate, SELECTOR_ENTRY_TYPE_DRIVE, + append_entry(SELECTOR_ENTRY_TYPE_DRIVE, volume_name, volume_name); i++; } @@ -722,7 +559,7 @@ while((dirent = zippath_readdir(directory)) != NULL) { /* append a dirent entry */ - entry = append_dirent_file_selector_entry(menu, menustate, dirent); + entry = append_dirent_entry(dirent); if (entry != NULL) { @@ -731,75 +568,41 @@ selected_entry = entry; /* do we have to select this file? */ - if (!mame_stricmp(astring_c(menustate->manager_menustate->current_file), dirent->name)) + if (!mame_stricmp(current_file, dirent->name)) selected_entry = entry; } } /* append all of the menu entries */ - for (entry = menustate->entrylist; entry != NULL; entry = entry->next) - append_file_selector_entry_menu_item(menu, entry); + for (entry = entrylist; entry != NULL; entry = entry->next) + append_entry_menu_item(entry); /* set the selection (if we have one) */ if (selected_entry != NULL) - ui_menu_set_selection(menu, (void *) selected_entry); + set_selection((void *) selected_entry); /* set up custom render proc */ - ui_menu_set_custom_render(menu, file_selector_render_extra, ui_get_line_height(machine) + 3.0f * UI_BOX_TB_BORDER, 0); + customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER; done: if (directory != NULL) zippath_closedir(directory); - return err; } - -/*------------------------------------------------- - check_path - performs a quick check to see if - a path exists --------------------------------------------------*/ - -static file_error check_path(const char *path) -{ - return zippath_opendir(path, NULL); -} - - - /*------------------------------------------------- menu_file_selector - file selector menu -------------------------------------------------*/ -static void menu_file_selector(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_file_selector::handle() { file_error err; - const ui_menu_event *event; - ui_menu *child_menu; - file_selector_menu_state *menustate; - file_create_menu_state *child_menustate; const file_selector_entry *entry; const file_selector_entry *selected_entry = NULL; int bestmatch = 0; - /* get menu state */ - menustate = (file_selector_menu_state *) state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - { - err = menu_file_selector_populate(machine, menu, menustate); - - /* pop out if there was an error */ - if (err != FILERR_NONE) - { - ui_menu_stack_pop(machine); - return; - } - } - /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); if (event != NULL && event->itemref != NULL) { /* handle selections */ @@ -810,85 +613,84 @@ { case SELECTOR_ENTRY_TYPE_EMPTY: /* empty slot - unload */ - menustate->manager_menustate->selected_device->unload(); - ui_menu_stack_pop(machine); + *result = R_EMPTY; + ui_menu::stack_pop(machine()); break; case SELECTOR_ENTRY_TYPE_CREATE: /* create */ - child_menu = ui_menu_alloc(machine, &machine.render().ui_container(), menu_file_create, NULL); - child_menustate = (file_create_menu_state*)ui_menu_alloc_state(child_menu, sizeof(*child_menustate), NULL); - child_menustate->manager_menustate = menustate->manager_menustate; - ui_menu_stack_push(child_menu); + *result = R_CREATE; + ui_menu::stack_pop(machine()); break; case SELECTOR_ENTRY_TYPE_SOFTWARE_LIST: - child_menu = ui_menu_alloc(machine, &machine.render().ui_container(), ui_image_menu_software, menustate->manager_menustate->selected_device); - ui_menu_stack_push(child_menu); + *result = R_SOFTLIST; + ui_menu::stack_pop(machine()); break; case SELECTOR_ENTRY_TYPE_DRIVE: case SELECTOR_ENTRY_TYPE_DIRECTORY: /* drive/directory - first check the path */ - err = check_path(entry->fullpath); + err = zippath_opendir(entry->fullpath, NULL); if (err != FILERR_NONE) { /* this path is problematic; present the user with an error and bail */ ui_popup_time(1, "Error accessing %s", entry->fullpath); break; } - astring_cpyc(menustate->manager_menustate->current_directory, entry->fullpath); - ui_menu_reset(menu, (ui_menu_reset_options)0); + current_directory.cpy(entry->fullpath); + reset((ui_menu_reset_options)0); break; case SELECTOR_ENTRY_TYPE_FILE: /* file */ - menustate->manager_menustate->selected_device->load(entry->fullpath); - ui_menu_stack_pop(machine); + current_file.cpy(entry->fullpath); + *result = R_FILE; + ui_menu::stack_pop(machine()); break; } // reset the char buffer when pressing IPT_UI_SELECT - if (menustate->filename_buffer[0] != '\0') - memset(menustate->filename_buffer, '\0', ARRAY_LENGTH(menustate->filename_buffer)); + if (filename_buffer[0] != '\0') + memset(filename_buffer, '\0', ARRAY_LENGTH(filename_buffer)); } else if (event->iptkey == IPT_SPECIAL) { - int buflen = strlen(menustate->filename_buffer); + int buflen = strlen(filename_buffer); bool update_selected = FALSE; /* if it's a backspace and we can handle it, do so */ if ((event->unichar == 8 || event->unichar == 0x7f) && buflen > 0) { - *(char *)utf8_previous_char(&menustate->filename_buffer[buflen]) = 0; + *(char *)utf8_previous_char(&filename_buffer[buflen]) = 0; update_selected = TRUE; - if (ARRAY_LENGTH(menustate->filename_buffer) > 0) - ui_popup_time(ERROR_MESSAGE_TIME, "%s", menustate->filename_buffer); + if (ARRAY_LENGTH(filename_buffer) > 0) + ui_popup_time(ERROR_MESSAGE_TIME, "%s", filename_buffer); } /* if it's any other key and we're not maxed out, update */ else if (event->unichar >= ' ' && event->unichar < 0x7f) { - buflen += utf8_from_uchar(&menustate->filename_buffer[buflen], ARRAY_LENGTH(menustate->filename_buffer) - buflen, event->unichar); - menustate->filename_buffer[buflen] = 0; + buflen += utf8_from_uchar(&filename_buffer[buflen], ARRAY_LENGTH(filename_buffer) - buflen, event->unichar); + filename_buffer[buflen] = 0; update_selected = TRUE; - if (ARRAY_LENGTH(menustate->filename_buffer) > 0) - ui_popup_time(ERROR_MESSAGE_TIME, "%s", menustate->filename_buffer); + if (ARRAY_LENGTH(filename_buffer) > 0) + ui_popup_time(ERROR_MESSAGE_TIME, "%s", filename_buffer); } if (update_selected) { - const file_selector_entry *cur_selected = (const file_selector_entry *)ui_menu_get_selection(menu); + const file_selector_entry *cur_selected = (const file_selector_entry *)get_selection(); // check for entries which matches our filename_buffer: // from current entry to the end for (entry = cur_selected; entry != NULL; entry = entry->next) { - if (entry->basename != NULL && menustate->filename_buffer != NULL) + if (entry->basename != NULL && filename_buffer != NULL) { int match = 0; - for (int i = 0; i < ARRAY_LENGTH(menustate->filename_buffer); i++) + for (int i = 0; i < ARRAY_LENGTH(filename_buffer); i++) { - if (mame_strnicmp(entry->basename, menustate->filename_buffer, i) == 0) + if (mame_strnicmp(entry->basename, filename_buffer, i) == 0) match = i; } @@ -900,14 +702,14 @@ } } // and from the first entry to current one - for (entry = menustate->entrylist; entry != cur_selected; entry = entry->next) + for (entry = entrylist; entry != cur_selected; entry = entry->next) { - if (entry->basename != NULL && menustate->filename_buffer != NULL) + if (entry->basename != NULL && filename_buffer != NULL) { int match = 0; - for (int i = 0; i < ARRAY_LENGTH(menustate->filename_buffer); i++) + for (int i = 0; i < ARRAY_LENGTH(filename_buffer); i++) { - if (mame_strnicmp(entry->basename, menustate->filename_buffer, i) == 0) + if (mame_strnicmp(entry->basename, filename_buffer, i) == 0) match = i; } @@ -920,14 +722,14 @@ } if (selected_entry != NULL && selected_entry != cur_selected) - ui_menu_set_selection(menu, (void *) selected_entry); + set_selection((void *) selected_entry); } } else if (event->iptkey == IPT_UI_CANCEL) { // reset the char buffer also in this case - if (menustate->filename_buffer[0] != '\0') - memset(menustate->filename_buffer, '\0', ARRAY_LENGTH(menustate->filename_buffer)); + if (filename_buffer[0] != '\0') + memset(filename_buffer, '\0', ARRAY_LENGTH(filename_buffer)); } } } @@ -938,44 +740,20 @@ FILE MANAGER ***************************************************************************/ -/*------------------------------------------------- - fix_working_directory - checks the working - directory for this device to ensure that it - "makes sense" --------------------------------------------------*/ - -static void fix_working_directory(device_image_interface *image) -{ - /* if the image exists, set the working directory to the parent directory */ - if (image->exists()) - { - astring *astr = astring_alloc(); - zippath_parent(astr, image->filename()); - image->set_working_directory(astring_c(astr)); - astring_free(astr); - } - - /* check to see if the path exists; if not clear it */ - if (check_path(image->working_directory()) != FILERR_NONE) - image->set_working_directory(""); -} - - /*------------------------------------------------- file_manager_render_extra - perform our special rendering -------------------------------------------------*/ -static void file_manager_render_extra(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +void ui_menu_file_manager::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) { - file_manager_menu_state *menustate = (file_manager_menu_state *) state; const char *path; /* access the path */ - path = (menustate->selected_device != NULL) ? menustate->selected_device->filename() : NULL; - extra_text_render(machine, menu, state, selectedref, top, bottom, - origx1, origy1, origx2, origy2, NULL, path); + path = selected_device ? selected_device->filename() : NULL; + extra_text_render(container, top, bottom, + origx1, origy1, origx2, origy2, NULL, path); } @@ -985,14 +763,18 @@ file manager menu -------------------------------------------------*/ -static void menu_file_manager_populate(running_machine &machine, ui_menu *menu, void *state) +ui_menu_file_manager::ui_menu_file_manager(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_file_manager::populate() { char buffer[2048]; - device_image_interface *image = NULL; astring tmp_name; /* cycle through all devices for this system */ - for (bool gotone = machine.devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine().root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { /* get the image type/id */ snprintf(buffer, ARRAY_LENGTH(buffer), @@ -1026,11 +808,10 @@ tmp_name.cpy("---"); /* record the menu item */ - ui_menu_item_append(menu, buffer, tmp_name.cstr(), 0, (void *) image); + item_append(buffer, tmp_name.cstr(), 0, (void *) image); } - /* set up custom render proc */ - ui_menu_set_custom_render(menu, file_manager_render_extra, 0, ui_get_line_height(machine) + 3.0f * UI_BOX_TB_BORDER); + custombottom = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER; } @@ -1039,15 +820,8 @@ file_manager_destroy_state - state destructor -------------------------------------------------*/ -static void file_manager_destroy_state(ui_menu *menu, void *state) +ui_menu_file_manager::~ui_menu_file_manager() { - file_manager_menu_state *menustate = (file_manager_menu_state *) state; - - if (menustate->current_directory != NULL) - astring_free(menustate->current_directory); - - if (menustate->current_file != NULL) - astring_free(menustate->current_file); } @@ -1056,74 +830,129 @@ menu_file_manager - main file manager menu -------------------------------------------------*/ -void ui_image_menu_file_manager(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_file_manager::handle() { - const ui_menu_event *event; - file_manager_menu_state *menustate; - ui_menu *child_menu; - file_selector_menu_state *child_menustate; - - /* if no state, allocate now */ - if (state == NULL) - { - state = ui_menu_alloc_state(menu, sizeof(*menustate), file_manager_destroy_state); - menustate = (file_manager_menu_state *) state; - - menustate->current_directory = astring_alloc(); - menustate->current_file = astring_alloc(); - } - menustate = (file_manager_menu_state *) state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_file_manager_populate(machine, menu, state); - /* update the selected device */ - menustate->selected_device = (device_image_interface *) ui_menu_get_selection(menu); + selected_device = (device_image_interface *) get_selection(); /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); if (event != NULL && event->iptkey == IPT_UI_SELECT) { - menustate->selected_device = (device_image_interface *) event->itemref; - if (menustate->selected_device != NULL) + selected_device = (device_image_interface *) event->itemref; + if (selected_device != NULL) { - /* ensure that the working directory for this device exists */ - fix_working_directory(menustate->selected_device); - - /* set up current_directory and current_file - depends on whether we have an image */ - astring_cpyc(menustate->current_directory, menustate->selected_device->working_directory()); - astring_cpyc(menustate->current_file, menustate->selected_device->exists() ? menustate->selected_device->basename() : ""); + ui_menu::stack_push(selected_device->get_selection_menu(machine(), container)); /* reset the existing menu */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - - /* push the menu */ - child_menu = ui_menu_alloc(machine, &machine.render().ui_container(), menu_file_selector, NULL); - child_menustate = (file_selector_menu_state *)ui_menu_alloc_state(child_menu, sizeof(*child_menustate), NULL); - child_menustate->manager_menustate = menustate; - ui_menu_stack_push(child_menu); + reset(UI_MENU_RESET_REMEMBER_POSITION); } } } /*------------------------------------------------- - ui_image_menu_image_info - menu that shows info + ui_menu_image_info - menu that shows info on all loaded images -------------------------------------------------*/ -void ui_image_menu_image_info(running_machine &machine, ui_menu *menu, void *parameter, void *state) +ui_menu_image_info::ui_menu_image_info(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_image_info::populate() +{ + astring tempstring; + item_append(image_info_astring(machine(), tempstring), NULL, MENU_FLAG_MULTILINE, NULL); +} + +ui_menu_image_info::~ui_menu_image_info() +{ +} + +void ui_menu_image_info::handle() +{ + /* process the menu */ + process(0); +} + +/*------------------------------------------------- + ui_menu_select_format - floppy image format + selection menu +-------------------------------------------------*/ + +ui_menu_select_format::ui_menu_select_format(running_machine &machine, render_container *container, + floppy_image_format_t **_formats, int _ext_match, int _total_usable, int *_result) + : ui_menu(machine, container) +{ + formats = _formats; + ext_match = _ext_match; + total_usable = _total_usable; + result = _result; +} + +void ui_menu_select_format::populate() +{ + item_append("Select image format", NULL, MENU_FLAG_DISABLE, NULL); + for(int i=0; idescription(), fmt->name(), 0, (void *)(FPTR)i); + } +} + +ui_menu_select_format::~ui_menu_select_format() +{ +} + +void ui_menu_select_format::handle() { - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) + /* process the menu */ + const ui_menu_event *event = process(0); + if (event != NULL && event->iptkey == IPT_UI_SELECT) { - astring *tempstring = image_info_astring(machine, astring_alloc()); - ui_menu_item_append(menu, astring_c(tempstring), NULL, MENU_FLAG_MULTILINE, NULL); - astring_free(tempstring); + *result = int(FPTR(event->itemref)); + ui_menu::stack_pop(machine()); } +} + +/*------------------------------------------------- + ui_menu_select_rw - floppy read/write + selection menu +-------------------------------------------------*/ + +ui_menu_select_rw::ui_menu_select_rw(running_machine &machine, render_container *container, + bool _can_in_place, int *_result) + : ui_menu(machine, container) +{ + can_in_place = _can_in_place; + result = _result; +} +void ui_menu_select_rw::populate() +{ + item_append("Select access mode", NULL, MENU_FLAG_DISABLE, NULL); + item_append("Read-only", 0, 0, (void *)READONLY); + if(can_in_place) + item_append("Read-write", 0, 0, (void *)READWRITE); + item_append("Read this image, write to another image", 0, 0, (void *)WRITE_OTHER); + item_append("Read this image, write to diff", 0, 0, (void *)WRITE_DIFF); +} + +ui_menu_select_rw::~ui_menu_select_rw() +{ +} + +void ui_menu_select_rw::handle() +{ /* process the menu */ - ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); + if (event != NULL && event->iptkey == IPT_UI_SELECT) + { + *result = int(FPTR(event->itemref)); + ui_menu::stack_pop(machine()); + } } /*************************************************************************** @@ -1144,44 +973,35 @@ #define BITBANGERCMD_TUNE ((void *) 0x0003) -typedef struct _tape_control_menu_state tape_control_menu_state; -struct _tape_control_menu_state -{ - int index; - device_image_interface *device; -}; - - +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ -typedef struct _bitbanger_control_menu_state bitbanger_control_menu_state; -struct _bitbanger_control_menu_state +ui_menu_mess_tape_control::ui_menu_mess_tape_control(running_machine &machine, render_container *container) : ui_menu(machine, container) { - int index; - device_image_interface *device; -}; +} +ui_menu_mess_tape_control::~ui_menu_mess_tape_control() +{ +} +ui_menu_mess_bitbanger_control::ui_menu_mess_bitbanger_control(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ +ui_menu_mess_bitbanger_control::~ui_menu_mess_bitbanger_control() +{ +} /*------------------------------------------------- cassette_count - returns the number of cassette devices in the machine -------------------------------------------------*/ -INLINE int cassette_count( running_machine &machine ) +int ui_menu_mess_tape_control::cassette_count() { - int count = 0; - device_t *device = machine.devicelist().first(CASSETTE); - - while ( device ) - { - count++; - device = device->typenext(); - } - return count; + cassette_device_iterator iter(machine().root_device()); + return iter.count(); } /*------------------------------------------------- @@ -1189,17 +1009,10 @@ devices in the machine -------------------------------------------------*/ -INLINE int bitbanger_count( running_machine &machine ) +int ui_menu_mess_bitbanger_control::bitbanger_count() { - int count = 0; - device_t *device = machine.devicelist().first(BITBANGER); - - while ( device ) - { - count++; - device = device->typenext(); - } - return count; + bitbanger_device_iterator iter(machine().root_device()); + return iter.count(); } /*------------------------------------------------- @@ -1207,7 +1020,7 @@ representation of the time -------------------------------------------------*/ -astring *tapecontrol_gettime(astring *dest, cassette_image_device *cassette, int *curpos, int *endpos) +astring &tapecontrol_gettime(astring &dest, cassette_image_device *cassette, int *curpos, int *endpos) { double t0, t1; @@ -1215,9 +1028,9 @@ t1 = cassette->get_length(); if (t1) - astring_printf(dest, "%04d/%04d", (int) t0, (int) t1); + dest.printf("%04d/%04d", (int) t0, (int) t1); else - astring_printf(dest, "%04d/%04d", 0, (int) t1); + dest.printf("%04d/%04d", 0, (int) t1); if (curpos != NULL) *curpos = t0; @@ -1234,26 +1047,26 @@ main tape control menu -------------------------------------------------*/ -static void menu_tape_control_populate(running_machine &machine, ui_menu *menu, tape_control_menu_state *menustate) +void ui_menu_mess_tape_control::populate() { astring timepos; cassette_state state; - int count = cassette_count(machine); + int count = cassette_count(); UINT32 flags = 0; if( count > 0 ) { - if( menustate->index == (count-1) ) + if( index == (count-1) ) flags |= MENU_FLAG_LEFT_ARROW; else flags |= MENU_FLAG_RIGHT_ARROW; } - if (menustate->device->exists()) + if ((device != NULL) && (device->exists())) { double t0, t1; UINT32 tapeflags = 0; - cassette_image_device* cassette = dynamic_cast(&menustate->device->device()); + cassette_image_device* cassette = dynamic_cast(&device->device()); t0 = cassette->get_position(); t1 = cassette->get_length(); @@ -1267,42 +1080,41 @@ } /* name of tape */ - ui_menu_item_append(menu, menustate->device->device().name(), menustate->device->filename(), flags, TAPECMD_SELECT); + item_append(device->device().name(), device->filename(), flags, TAPECMD_SELECT); /* state */ - tapecontrol_gettime(&timepos, cassette, NULL, NULL); + tapecontrol_gettime(timepos, cassette, NULL, NULL); state = cassette->get_state(); - ui_menu_item_append( - menu, + item_append( (state & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED ? "stopped" : ((state & CASSETTE_MASK_UISTATE) == CASSETTE_PLAY ? ((state & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED ? "playing" : "(playing)") : ((state & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED ? "recording" : "(recording)") ), - astring_c(&timepos), + timepos, tapeflags, TAPECMD_SLIDER); /* pause or stop */ - ui_menu_item_append(menu, "Pause/Stop", NULL, 0, TAPECMD_STOP); + item_append("Pause/Stop", NULL, 0, TAPECMD_STOP); /* play */ - ui_menu_item_append(menu, "Play", NULL, 0, TAPECMD_PLAY); + item_append("Play", NULL, 0, TAPECMD_PLAY); /* record */ - ui_menu_item_append(menu, "Record", NULL, 0, TAPECMD_RECORD); + item_append("Record", NULL, 0, TAPECMD_RECORD); /* rewind */ - ui_menu_item_append(menu, "Rewind", NULL, 0, TAPECMD_REWIND); + item_append("Rewind", NULL, 0, TAPECMD_REWIND); /* fast forward */ - ui_menu_item_append(menu, "Fast Forward", NULL, 0, TAPECMD_FAST_FORWARD); + item_append("Fast Forward", NULL, 0, TAPECMD_FAST_FORWARD); } else { /* no tape loaded */ - ui_menu_item_append(menu, "No Tape Image loaded", NULL, flags, NULL); + item_append("No Tape Image loaded", NULL, flags, NULL); } } @@ -1312,51 +1124,52 @@ main bitbanger control menu -------------------------------------------------*/ -static void menu_bitbanger_control_populate(running_machine &machine, ui_menu *menu, bitbanger_control_menu_state *menustate) +void ui_menu_mess_bitbanger_control::populate() { - int count = bitbanger_count(machine); + int count = bitbanger_count(); UINT32 flags = 0, mode_flags = 0, baud_flags = 0, tune_flags = 0; if( count > 0 ) { - if( menustate->index == (count-1) ) + if( index == (count-1) ) flags |= MENU_FLAG_LEFT_ARROW; else flags |= MENU_FLAG_RIGHT_ARROW; } - if (bitbanger_inc_mode(&menustate->device->device(), TRUE)) - mode_flags |= MENU_FLAG_RIGHT_ARROW; + if ((device != NULL) && (device->exists())) + { + bitbanger_device *bitbanger = downcast(&device->device()); - if (bitbanger_dec_mode(&menustate->device->device(), TRUE)) - mode_flags |= MENU_FLAG_LEFT_ARROW; + if (bitbanger->inc_mode(TRUE)) + mode_flags |= MENU_FLAG_RIGHT_ARROW; - if (bitbanger_inc_baud(&menustate->device->device(), TRUE)) - baud_flags |= MENU_FLAG_RIGHT_ARROW; + if (bitbanger->dec_mode(TRUE)) + mode_flags |= MENU_FLAG_LEFT_ARROW; - if (bitbanger_dec_baud(&menustate->device->device(), TRUE)) - baud_flags |= MENU_FLAG_LEFT_ARROW; + if (bitbanger->inc_baud(TRUE)) + baud_flags |= MENU_FLAG_RIGHT_ARROW; - if (bitbanger_inc_tune(&menustate->device->device(), TRUE)) - tune_flags |= MENU_FLAG_RIGHT_ARROW; + if (bitbanger->dec_baud(TRUE)) + baud_flags |= MENU_FLAG_LEFT_ARROW; - if (bitbanger_dec_tune(&menustate->device->device(), TRUE)) - tune_flags |= MENU_FLAG_LEFT_ARROW; + if (bitbanger->inc_tune(TRUE)) + tune_flags |= MENU_FLAG_RIGHT_ARROW; + if (bitbanger->dec_tune(TRUE)) + tune_flags |= MENU_FLAG_LEFT_ARROW; - if (menustate->device->exists()) - { /* name of bitbanger file */ - ui_menu_item_append(menu, menustate->device->device().name(), menustate->device->filename(), flags, BITBANGERCMD_SELECT); - ui_menu_item_append(menu, "Device Mode:", bitbanger_mode_string(&menustate->device->device()), mode_flags, BITBANGERCMD_MODE); - ui_menu_item_append(menu, "Baud:", bitbanger_baud_string(&menustate->device->device()), baud_flags, BITBANGERCMD_BAUD); - ui_menu_item_append(menu, "Baud Tune:", bitbanger_tune_string(&menustate->device->device()), tune_flags, BITBANGERCMD_TUNE); - ui_menu_item_append(menu, "Protocol:", "8-1-N", 0, NULL); + item_append(device->device().name(), device->filename(), flags, BITBANGERCMD_SELECT); + item_append("Device Mode:", bitbanger->mode_string(), mode_flags, BITBANGERCMD_MODE); + item_append("Baud:", bitbanger->baud_string(), baud_flags, BITBANGERCMD_BAUD); + item_append("Baud Tune:", bitbanger->tune_string(), tune_flags, BITBANGERCMD_TUNE); + item_append("Protocol:", "8-1-N", 0, NULL); } else { /* no tape loaded */ - ui_menu_item_append(menu, "No Bitbanger Image loaded", NULL, flags, NULL); + item_append("No Bitbanger Image loaded", NULL, flags, NULL); } } @@ -1365,40 +1178,24 @@ menu_tape_control - main tape control menu -------------------------------------------------*/ -void ui_mess_menu_tape_control(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_mess_tape_control::handle() { - tape_control_menu_state *menustate; - const ui_menu_event *event; - - /* if no state, allocate some */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL); - menustate = (tape_control_menu_state *) state; - /* do we have to load the device? */ - if (menustate->device == NULL) + if (device == NULL) { - int index = menustate->index; - device_image_interface *device = NULL; - for (bool gotone = machine.devicelist().first(device); gotone; gotone = device->next(device)) - { - if(device->device().type() == CASSETTE) { - if (index==0) break; - index--; - } - } - menustate->device = device; - ui_menu_reset(menu, (ui_menu_reset_options)0); + cassette_device_iterator iter(machine().root_device()); + device = iter.byindex(index); + reset((ui_menu_reset_options)0); } /* rebuild the menu - we have to do this so that the counter updates */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - menu_tape_control_populate(machine, menu, (tape_control_menu_state*)state); + reset(UI_MENU_RESET_REMEMBER_POSITION); + populate(); - cassette_image_device* cassette = dynamic_cast(&menustate->device->device()); + cassette_image_device* cassette = dynamic_cast(&device->device()); /* process the menu */ - event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); + const ui_menu_event *event = process(UI_MENU_PROCESS_LR_REPEAT); if (event != NULL) { switch(event->iptkey) @@ -1410,11 +1207,11 @@ if (event->itemref==TAPECMD_SELECT) { /* left arrow - rotate left through cassette devices */ - if (menustate->index > 0) - menustate->index--; + if (index > 0) + index--; else - menustate->index = cassette_count(machine) - 1; - menustate->device = NULL; + index = cassette_count() - 1; + device = NULL; } break; @@ -1425,11 +1222,11 @@ if (event->itemref==TAPECMD_SELECT) { /* right arrow - rotate right through cassette devices */ - if (menustate->index < cassette_count(machine) - 1) - menustate->index++; + if (index < cassette_count() - 1) + index++; else - menustate->index = 0; - menustate->device = NULL; + index = 0; + device = NULL; } break; @@ -1464,38 +1261,25 @@ control menu -------------------------------------------------*/ -void ui_mess_menu_bitbanger_control(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_mess_bitbanger_control::handle() { - bitbanger_control_menu_state *menustate; - const ui_menu_event *event; - - /* if no state, allocate some */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL); - menustate = (bitbanger_control_menu_state *) state; - /* do we have to load the device? */ - if (menustate->device == NULL) + if (device == NULL) { - int index = menustate->index; - device_image_interface *device = NULL; - for (bool gotone = machine.devicelist().first(device); gotone; gotone = device->next(device)) - { - if(device->device().type() == BITBANGER) { - if (index==0) break; - index--; - } - } - menustate->device = device; - ui_menu_reset(menu, (ui_menu_reset_options)0); + bitbanger_device_iterator iter(machine().root_device()); + device = iter.byindex(index); + reset((ui_menu_reset_options)0); } + /* get the bitbanger */ + bitbanger_device *bitbanger = downcast(device); + /* rebuild the menu */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - menu_bitbanger_control_populate(machine, menu, (bitbanger_control_menu_state*)state); + reset(UI_MENU_RESET_REMEMBER_POSITION); + populate(); /* process the menu */ - event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); + const ui_menu_event *event = process(UI_MENU_PROCESS_LR_REPEAT); if (event != NULL) { switch(event->iptkey) @@ -1504,23 +1288,23 @@ if (event->itemref==BITBANGERCMD_SELECT) { /* left arrow - rotate left through cassette devices */ - if (menustate->index > 0) - menustate->index--; + if (index > 0) + index--; else - menustate->index = bitbanger_count(machine) - 1; - menustate->device = NULL; + index = bitbanger_count() - 1; + device = NULL; } else if (event->itemref==BITBANGERCMD_MODE) { - bitbanger_dec_mode(&menustate->device->device(), FALSE); + bitbanger->dec_mode(FALSE); } else if (event->itemref==BITBANGERCMD_BAUD) { - bitbanger_dec_baud(&menustate->device->device(), FALSE); + bitbanger->dec_baud(FALSE); } else if (event->itemref==BITBANGERCMD_TUNE) { - bitbanger_dec_tune(&menustate->device->device(), FALSE); + bitbanger->dec_tune(FALSE); } break; @@ -1528,23 +1312,23 @@ if (event->itemref==BITBANGERCMD_SELECT) { /* right arrow - rotate right through cassette devices */ - if (menustate->index < bitbanger_count(machine) - 1) - menustate->index++; + if (index < bitbanger_count() - 1) + index++; else - menustate->index = 0; - menustate->device = NULL; + index = 0; + device = NULL; } else if (event->itemref==BITBANGERCMD_MODE) { - bitbanger_inc_mode(&menustate->device->device(), FALSE); + bitbanger->inc_mode(FALSE); } else if (event->itemref==BITBANGERCMD_BAUD) { - bitbanger_inc_baud(&menustate->device->device(), FALSE); + bitbanger->inc_baud(FALSE); } else if (event->itemref==BITBANGERCMD_TUNE) { - bitbanger_inc_tune(&menustate->device->device(), FALSE); + bitbanger->inc_tune(FALSE); } break; } diff -Nru mame-0.144/src/emu/uiimage.h mame-0.145/src/emu/uiimage.h --- mame-0.144/src/emu/uiimage.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/uiimage.h 2012-02-06 21:30:28.000000000 +0000 @@ -14,18 +14,147 @@ #ifndef __UIIMAGE_H__ #define __UIIMAGE_H__ - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -void ui_image_menu_file_manager(running_machine &machine, ui_menu *menu, void *parameter, void *state); - -void ui_image_menu_image_info(running_machine &machine, ui_menu *menu, void *parameter, void *state); - -void ui_mess_menu_bitbanger_control(running_machine &machine, ui_menu *menu, void *parameter, void *state); - -void ui_mess_menu_tape_control(running_machine &machine, ui_menu *menu, void *parameter, void *state); +class ui_menu_image_info : public ui_menu { +public: + ui_menu_image_info(running_machine &machine, render_container *container); + virtual ~ui_menu_image_info(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_file_manager : public ui_menu { +public: + astring current_directory; + astring current_file; + device_image_interface *selected_device; + + ui_menu_file_manager(running_machine &machine, render_container *container); + virtual ~ui_menu_file_manager(); + virtual void populate(); + virtual void handle(); + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); +}; + +class ui_menu_mess_tape_control : public ui_menu { +public: + ui_menu_mess_tape_control(running_machine &machine, render_container *container); + virtual ~ui_menu_mess_tape_control(); + virtual void populate(); + virtual void handle(); + +private: + int index; + device_image_interface *device; + int cassette_count(); +}; + +class ui_menu_mess_bitbanger_control : public ui_menu { +public: + ui_menu_mess_bitbanger_control(running_machine &machine, render_container *container); + virtual ~ui_menu_mess_bitbanger_control(); + virtual void populate(); + virtual void handle(); + +private: + int index; + device_image_interface *device; + int bitbanger_count(); +}; + +class ui_menu_confirm_save_as : public ui_menu { +public: + ui_menu_confirm_save_as(running_machine &machine, render_container *container, bool *yes); + virtual ~ui_menu_confirm_save_as(); + virtual void populate(); + virtual void handle(); + +private: + bool *yes; +}; + +class ui_menu_file_create : public ui_menu { +public: + ui_menu_file_create(running_machine &machine, render_container *container, device_image_interface *image, astring ¤t_directory, astring ¤t_file); + virtual ~ui_menu_file_create(); + virtual void populate(); + virtual void handle(); + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); + +private: + device_image_interface *image; + astring ¤t_directory, ¤t_file; + const image_device_format *current_format; + int confirm_save_as_yes; + char filename_buffer[1024]; +}; + +class ui_menu_file_selector : public ui_menu { +public: + enum { R_EMPTY, R_SOFTLIST, R_CREATE, R_FILE }; + ui_menu_file_selector(running_machine &machine, render_container *container, device_image_interface *image, astring ¤t_directory, astring ¤t_file, bool has_empty, bool has_softlist, bool has_create, int *result); + virtual ~ui_menu_file_selector(); + virtual void populate(); + virtual void handle(); + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); + +private: + enum file_selector_entry_type { + SELECTOR_ENTRY_TYPE_EMPTY, + SELECTOR_ENTRY_TYPE_CREATE, + SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, + SELECTOR_ENTRY_TYPE_DRIVE, + SELECTOR_ENTRY_TYPE_DIRECTORY, + SELECTOR_ENTRY_TYPE_FILE + }; + + struct file_selector_entry { + file_selector_entry *next; + + file_selector_entry_type type; + const char *basename; + const char *fullpath; + }; + + device_image_interface *image; + astring ¤t_directory, ¤t_file; + bool has_empty, has_softlist, has_create; + int *result; + + file_selector_entry *entrylist; + char filename_buffer[1024]; + + int compare_entries(const file_selector_entry *e1, const file_selector_entry *e2); + file_selector_entry *append_entry(file_selector_entry_type entry_type, const char *entry_basename, const char *entry_fullpath); + file_selector_entry *append_dirent_entry(const osd_directory_entry *dirent); + void append_entry_menu_item(const file_selector_entry *entry); +}; + +class ui_menu_select_format : public ui_menu { +public: + ui_menu_select_format(running_machine &machine, render_container *container, + class floppy_image_format_t **formats, int ext_match, int total_usable, int *result); + virtual ~ui_menu_select_format(); + virtual void populate(); + virtual void handle(); + +private: + floppy_image_format_t **formats; + int ext_match, total_usable; + int *result; +}; + +class ui_menu_select_rw : public ui_menu { +public: + enum { READONLY, READWRITE, WRITE_OTHER, WRITE_DIFF }; + ui_menu_select_rw(running_machine &machine, render_container *container, + bool can_in_place, int *result); + virtual ~ui_menu_select_rw(); + virtual void populate(); + virtual void handle(); + +private: + bool can_in_place; + int *result; +}; #endif /* __UIIMAGE_H__ */ diff -Nru mame-0.144/src/emu/uimain.c mame-0.145/src/emu/uimain.c --- mame-0.144/src/emu/uimain.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/uimain.c 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,2772 @@ +/********************************************************************* + + uimenu.c + + Internal MAME menus for the user interface. + + Copyright Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +*********************************************************************/ + +#include "emu.h" +#include "osdnet.h" +#include "emuopts.h" +#include "ui.h" +#include "rendutil.h" +#include "cheat.h" +#include "uiimage.h" +#include "uiinput.h" +#include "uimenu.h" +#include "uimain.h" +#include "audit.h" +#include "crsshair.h" +#include +#include "imagedev/cassette.h" +#include "imagedev/bitbngr.h" + + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define MAX_PHYSICAL_DIPS 10 +#define MAX_INPUT_PORTS 32 +#define MAX_BITS_PER_PORT 32 + +/* DIP switch rendering parameters */ +#define DIP_SWITCH_HEIGHT 0.05f +#define DIP_SWITCH_SPACING 0.01 +#define SINGLE_TOGGLE_SWITCH_FIELD_WIDTH 0.025f +#define SINGLE_TOGGLE_SWITCH_WIDTH 0.020f +/* make the switch 80% of the width space and 1/2 of the switch height */ +#define PERCENTAGE_OF_HALF_FIELD_USED 0.80f +#define SINGLE_TOGGLE_SWITCH_HEIGHT ((DIP_SWITCH_HEIGHT / 2) * PERCENTAGE_OF_HALF_FIELD_USED) + +/*------------------------------------------------- + ui_slider_ui_handler - pushes the slider + menu on the stack and hands off to the + standard menu handler +-------------------------------------------------*/ + +UINT32 ui_menu_sliders::ui_handler(running_machine &machine, render_container *container, UINT32 state) +{ + UINT32 result; + + /* if this is the first call, push the sliders menu */ + if (state) + ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_sliders(machine, container, true))); + + /* handle standard menus */ + result = ui_menu::ui_handler(machine, container, state); + + /* if we are cancelled, pop the sliders menu */ + if (result == UI_HANDLER_CANCEL) + ui_menu::stack_pop(machine); + + ui_menu_sliders *uim = dynamic_cast(menu_stack); + return uim && uim->menuless_mode ? 0 : UI_HANDLER_CANCEL; +} + + +/*------------------------------------------------- + ui_menu_force_game_select - force the game + select menu to be visible and inescapable +-------------------------------------------------*/ + +void ui_menu_force_game_select(running_machine &machine, render_container *container) +{ + char *gamename = (char *)machine.options().system_name(); + + /* reset the menu stack */ + ui_menu::stack_reset(machine); + + /* add the quit entry followed by the game select entry */ + ui_menu *quit = auto_alloc_clear(machine, ui_menu_quit_game(machine, container)); + quit->set_special_main_menu(true); + ui_menu::stack_push(quit); + ui_menu::stack_push(auto_alloc_clear(machine, ui_menu_select_game(machine, container, gamename))); + + /* force the menus on */ + ui_show_menu(); + + /* make sure MAME is paused */ + machine.pause(); +} + + +/*************************************************************************** + MENU HANDLERS +***************************************************************************/ + +/*------------------------------------------------- + ui_menu_main constructor - populate the main menu +-------------------------------------------------*/ + +ui_menu_main::ui_menu_main(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_main::populate() +{ + input_field_config *field; + input_port_config *port; + int has_configs = false; + int has_analog = false; + int has_dips = false; + astring menu_text; + /* scan the input port array to see what options we need to enable */ + for (port = machine().m_portlist.first(); port != NULL; port = port->next()) + for (field = port->fieldlist().first(); field != NULL; field = field->next()) + { + if (field->type == IPT_DIPSWITCH) + has_dips = true; + if (field->type == IPT_CONFIG) + has_configs = true; + if (input_type_is_analog(field->type)) + has_analog = true; + } + + /* add input menu items */ + item_append("Input (general)", NULL, 0, (void *)INPUT_GROUPS); + + menu_text.printf("Input (this %s)",emulator_info::get_capstartgamenoun()); + item_append(menu_text.cstr(), NULL, 0, (void *)INPUT_SPECIFIC); + + /* add optional input-related menus */ + if (has_dips) + item_append("Dip Switches", NULL, 0, (void *)SETTINGS_DIP_SWITCHES); + if (has_configs) + item_append("Driver Configuration", NULL, 0, (void *)SETTINGS_DRIVER_CONFIG); + if (has_analog) + item_append("Analog Controls", NULL, 0, (void *)ANALOG); + + /* add bookkeeping menu */ + item_append("Bookkeeping Info", NULL, 0, (void *)BOOKKEEPING); + + /* add game info menu */ + menu_text.printf("%s Information",emulator_info::get_capstartgamenoun()); + item_append(menu_text.cstr(), NULL, 0, (void *)GAME_INFO); + + image_interface_iterator imgiter(machine().root_device()); + if (imgiter.first() != NULL) + { + /* add image info menu */ + item_append("Image Information", NULL, 0, (void *)IMAGE_MENU_IMAGE_INFO); + + /* add file manager menu */ + item_append("File Manager", NULL, 0, (void *)IMAGE_MENU_FILE_MANAGER); + + /* add tape control menu */ + cassette_device_iterator cassiter(machine().root_device()); + if (cassiter.first() != NULL) + item_append("Tape Control", NULL, 0, (void *)MESS_MENU_TAPE_CONTROL); + + /* add bitbanger control menu */ + bitbanger_device_iterator bititer(machine().root_device()); + if (bititer.first() != NULL) + item_append("Bitbanger Control", NULL, 0, (void *)MESS_MENU_BITBANGER_CONTROL); + } + + slot_interface_iterator slotiter(machine().root_device()); + if (slotiter.first() != NULL) + { + /* add image info menu */ + item_append("Slot Devices", NULL, 0, (void *)SLOT_DEVICES); + } + + network_interface_iterator netiter(machine().root_device()); + if (netiter.first() != NULL) + { + /* add image info menu */ + item_append("Network Devices", NULL, 0, (void*)NETWORK_DEVICES); + } + + /* add keyboard mode menu */ + if (input_machine_has_keyboard(machine()) && inputx_can_post(machine())) + item_append("Keyboard Mode", NULL, 0, (void *)KEYBOARD_MODE); + + /* add sliders menu */ + item_append("Slider Controls", NULL, 0, (void *)SLIDERS); + + /* add video options menu */ + item_append("Video Options", NULL, 0, (machine().render().target_by_index(1) != NULL) ? (void *)VIDEO_TARGETS : (void *)VIDEO_OPTIONS); + + /* add crosshair options menu */ + if (crosshair_get_usage(machine())) + item_append("Crosshair Options", NULL, 0, (void *)CROSSHAIR); + + /* add cheat menu */ + if (machine().options().cheat() && machine().cheat().first() != NULL) + item_append("Cheat", NULL, 0, (void *)CHEAT); + + /* add memory card menu */ + if (machine().config().m_memcard_handler != NULL) + item_append("Memory Card", NULL, 0, (void *)MEMORY_CARD); + + /* add reset and exit menus */ + menu_text.printf("Select New %s",emulator_info::get_capstartgamenoun()); + item_append(menu_text.cstr(), NULL, 0, (void *)SELECT_GAME); +} + +ui_menu_main::~ui_menu_main() +{ +} + +/*------------------------------------------------- + menu_main - handle the main menu +-------------------------------------------------*/ + +void ui_menu_main::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) { + switch((long long)(menu_event->itemref)) { + case INPUT_GROUPS: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container))); + break; + + case INPUT_SPECIFIC: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_specific(machine(), container))); + break; + + case SETTINGS_DIP_SWITCHES: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_dip_switches(machine(), container))); + break; + + case SETTINGS_DRIVER_CONFIG: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_settings_driver_config(machine(), container))); + break; + + case ANALOG: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_analog(machine(), container))); + break; + + case BOOKKEEPING: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_bookkeeping(machine(), container))); + break; + + case GAME_INFO: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_game_info(machine(), container))); + break; + + case IMAGE_MENU_IMAGE_INFO: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_image_info(machine(), container))); + break; + + case IMAGE_MENU_FILE_MANAGER: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_file_manager(machine(), container))); + break; + + case MESS_MENU_TAPE_CONTROL: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_tape_control(machine(), container))); + break; + + case MESS_MENU_BITBANGER_CONTROL: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_mess_bitbanger_control(machine(), container))); + break; + + case SLOT_DEVICES: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_slot_devices(machine(), container))); + break; + + case NETWORK_DEVICES: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_network_devices(machine(), container))); + break; + + case KEYBOARD_MODE: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_keyboard_mode(machine(), container))); + break; + + case SLIDERS: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_sliders(machine(), container, false))); + break; + + case VIDEO_TARGETS: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_targets(machine(), container))); + break; + + case VIDEO_OPTIONS: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, machine().render().first_target()))); + break; + + case CROSSHAIR: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_crosshair(machine(), container))); + break; + + case CHEAT: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_cheat(machine(), container))); + break; + + case MEMORY_CARD: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_memory_card(machine(), container))); + break; + + case SELECT_GAME: + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, 0))); + break; + + default: + abort(); + } + } +} + + +/*------------------------------------------------- + ui_menu_keyboard_mode - menu that +-------------------------------------------------*/ + +ui_menu_keyboard_mode::ui_menu_keyboard_mode(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_keyboard_mode::populate() +{ + int natural = ui_get_use_natural_keyboard(machine()); + item_append("Keyboard Mode:", natural ? "Natural" : "Emulated", natural ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, NULL); +} + +ui_menu_keyboard_mode::~ui_menu_keyboard_mode() +{ +} + +void ui_menu_keyboard_mode::handle() +{ + int natural = ui_get_use_natural_keyboard(machine()); + + /* process the menu */ + const ui_menu_event *menu_event = process(0); + + if (menu_event != NULL) + { + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) { + ui_set_use_natural_keyboard(machine(), natural ^ true); + reset(UI_MENU_RESET_REMEMBER_REF); + } + } +} + + +/*------------------------------------------------- + ui_slot_get_current_index - returns +-------------------------------------------------*/ +int ui_menu_slot_devices::slot_get_current_index(device_slot_interface *slot) +{ + const char *current = machine().options().value(slot->device().tag()+1); + const slot_interface* intf = slot->get_slot_interfaces(); + int val = -1; + for (int i = 0; intf[i].name != NULL; i++) { + if (strcmp(current, intf[i].name) == 0) val = i; + } + return val; +} + +/*------------------------------------------------- + ui_slot_get_length - returns +-------------------------------------------------*/ +int ui_menu_slot_devices::slot_get_length(device_slot_interface *slot) +{ + const slot_interface* intf = slot->get_slot_interfaces(); + int val = 0; + for (int i = 0; intf[i].name != NULL; i++) val++; + return val; +} + +/*------------------------------------------------- + ui_slot_get_next - returns +-------------------------------------------------*/ +const char *ui_menu_slot_devices::slot_get_next(device_slot_interface *slot) +{ + int idx = slot_get_current_index(slot) + 1; + if (idx==slot_get_length(slot)) return ""; + return slot->get_slot_interfaces()[idx].name; +} + +/*------------------------------------------------- + ui_slot_get_prev - returns +-------------------------------------------------*/ +const char *ui_menu_slot_devices::slot_get_prev(device_slot_interface *slot) +{ + int idx = slot_get_current_index(slot) - 1; + if (idx==-1) return ""; + if (idx==-2) idx = slot_get_length(slot) -1; + if (idx==-1) return ""; + return slot->get_slot_interfaces()[idx].name; +} + +/*------------------------------------------------- + ui_get_slot_device - returns +-------------------------------------------------*/ +const char *ui_menu_slot_devices::get_slot_device(device_slot_interface *slot) +{ + return machine().options().value(slot->device().tag()+1); +} + + +/*------------------------------------------------- + ui_set_use_natural_keyboard - specifies + whether the natural keyboard is active +-------------------------------------------------*/ + +void ui_menu_slot_devices::set_slot_device(device_slot_interface *slot, const char *val) +{ + astring error; + machine().options().set_value(slot->device().tag()+1, val, OPTION_PRIORITY_CMDLINE, error); + assert(!error); +} + +/*------------------------------------------------- + menu_slot_devices_populate - populates the main + slot device menu +-------------------------------------------------*/ + +ui_menu_slot_devices::ui_menu_slot_devices(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_slot_devices::populate() +{ + /* cycle through all devices for this system */ + slot_interface_iterator iter(machine().root_device()); + for (device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) + { + /* record the menu item */ + const char *title = get_slot_device(slot); + item_append(slot->device().tag()+1, strcmp(title,"")==0 ? "------" : title, MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW, (void *)slot); + } + item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + item_append("Reset", NULL, 0, NULL); +} + +ui_menu_slot_devices::~ui_menu_slot_devices() +{ +} + +/*------------------------------------------------- + ui_menu_slot_devices - menu that +-------------------------------------------------*/ + +void ui_menu_slot_devices::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + + if (menu_event != NULL && menu_event->itemref != NULL) + { + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) { + device_slot_interface *slot = (device_slot_interface *)menu_event->itemref; + const char *val = (menu_event->iptkey == IPT_UI_LEFT) ? slot_get_prev(slot) : slot_get_next(slot); + set_slot_device(slot,val); + reset(UI_MENU_RESET_REMEMBER_REF); + } + } else if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) { + machine().schedule_hard_reset(); + } +} + +ui_menu_network_devices::ui_menu_network_devices(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +ui_menu_network_devices::~ui_menu_network_devices() +{ +} + +/*------------------------------------------------- + menu_network_devices_populate - populates the main + network device menu +-------------------------------------------------*/ + +void ui_menu_network_devices::populate() +{ + /* cycle through all devices for this system */ + network_interface_iterator iter(machine().root_device()); + for (device_network_interface *network = iter.first(); network != NULL; network = iter.next()) + { + int curr = network->get_interface(); + const char *title = NULL; + const netdev_entry_t *entry = netdev_first(); + while(entry) { + if(entry->id==curr) { + title = entry->description; + break; + } + entry = entry->m_next; + } + + item_append(network->device().tag(), (title) ? title : "------", MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW, (void *)network); + } +} + +/*------------------------------------------------- + ui_menu_network_devices - menu that +-------------------------------------------------*/ + +void ui_menu_network_devices::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + + if (menu_event != NULL && menu_event->itemref != NULL) + { + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) { + device_network_interface *network = (device_network_interface *)menu_event->itemref; + int curr = network->get_interface(); + if (menu_event->iptkey == IPT_UI_LEFT) curr--; else curr++; + if (curr==-2) curr = netdev_count() - 1; + network->set_interface(curr); + reset(UI_MENU_RESET_REMEMBER_REF); + } + } +} + +/*------------------------------------------------- + menu_input_groups_populate - populate the + input groups menu +-------------------------------------------------*/ + +ui_menu_input_groups::ui_menu_input_groups(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_input_groups::populate() +{ + int player; + + /* build up the menu */ + item_append("User Interface", NULL, 0, (void *)(IPG_UI + 1)); + for (player = 0; player < MAX_PLAYERS; player++) + { + char buffer[40]; + sprintf(buffer, "Player %d Controls", player + 1); + item_append(buffer, NULL, 0, (void *)(FPTR)(IPG_PLAYER1 + player + 1)); + } + item_append("Other Controls", NULL, 0, (void *)(FPTR)(IPG_OTHER + 1)); +} + +ui_menu_input_groups::~ui_menu_input_groups() +{ +} + +/*------------------------------------------------- + menu_input_groups - handle the input groups + menu +-------------------------------------------------*/ + +void ui_menu_input_groups::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_general(machine(), container, int((long long)(menu_event->itemref)-1)))); +} + + + +/*------------------------------------------------- + menu_input_general - handle the general + input menu +-------------------------------------------------*/ + +ui_menu_input_general::ui_menu_input_general(running_machine &machine, render_container *container, int _group) : ui_menu_input(machine, container) +{ + group = _group; +} + +void ui_menu_input_general::populate() +{ + input_item_data *itemlist = NULL; + int suborder[SEQ_TYPE_TOTAL]; + astring tempstring; + int sortorder = 1; + + /* create a mini lookup table for sort order based on sequence type */ + suborder[SEQ_TYPE_STANDARD] = 0; + suborder[SEQ_TYPE_DECREMENT] = 1; + suborder[SEQ_TYPE_INCREMENT] = 2; + + /* iterate over the input ports and add menu items */ + for (input_type_entry *entry = input_type_list(machine()).first(); entry != NULL; entry = entry->next()) + + /* add if we match the group and we have a valid name */ + if (entry->group == group && entry->name != NULL && entry->name[0] != 0) + { + input_seq_type seqtype; + + /* loop over all sequence types */ + sortorder++; + for (seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; seqtype++) + { + /* build an entry for the standard sequence */ + input_item_data *item = (input_item_data *)m_pool_alloc(sizeof(*item)); + memset(item, 0, sizeof(*item)); + item->ref = entry; + if(pollingitem && pollingref == entry && pollingseq == seqtype) + pollingitem = item; + item->seqtype = seqtype; + item->seq = input_type_seq(machine(), entry->type, entry->player, seqtype); + item->defseq = &entry->defseq[seqtype]; + item->sortorder = sortorder * 4 + suborder[seqtype]; + item->type = input_type_is_analog(entry->type) ? (INPUT_TYPE_ANALOG + seqtype) : INPUT_TYPE_DIGITAL; + item->name = entry->name; + item->next = itemlist; + itemlist = item; + + /* stop after one, unless we're analog */ + if (item->type == INPUT_TYPE_DIGITAL) + break; + } + } + + /* sort and populate the menu in a standard fashion */ + populate_and_sort(itemlist); +} + +ui_menu_input_general::~ui_menu_input_general() +{ +} + +/*------------------------------------------------- + menu_input_specific - handle the game-specific + input menu +-------------------------------------------------*/ + +ui_menu_input_specific::ui_menu_input_specific(running_machine &machine, render_container *container) : ui_menu_input(machine, container) +{ +} + +void ui_menu_input_specific::populate() +{ + input_item_data *itemlist = NULL; + input_field_config *field; + input_port_config *port; + int suborder[SEQ_TYPE_TOTAL]; + astring tempstring; + + /* create a mini lookup table for sort order based on sequence type */ + suborder[SEQ_TYPE_STANDARD] = 0; + suborder[SEQ_TYPE_DECREMENT] = 1; + suborder[SEQ_TYPE_INCREMENT] = 2; + + /* iterate over the input ports and add menu items */ + for (port = machine().m_portlist.first(); port != NULL; port = port->next()) + for (field = port->fieldlist().first(); field != NULL; field = field->next()) + { + const char *name = input_field_name(field); + + /* add if we match the group and we have a valid name */ + if (name != NULL && input_condition_true(machine(), &field->condition, port->owner()) && + ((field->type == IPT_OTHER && field->name != NULL) || input_type_group(machine(), field->type, field->player) != IPG_INVALID)) + { + input_seq_type seqtype; + UINT16 sortorder; + + /* determine the sorting order */ + if (field->type >= IPT_START1 && field->type <= __ipt_analog_end) + sortorder = (field->type << 2) | (field->player << 12); + else + sortorder = field->type | 0xf000; + + /* loop over all sequence types */ + for (seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; seqtype++) + { + /* build an entry for the standard sequence */ + input_item_data *item = (input_item_data *)m_pool_alloc(sizeof(*item)); + memset(item, 0, sizeof(*item)); + item->ref = field; + item->seqtype = seqtype; + if(pollingitem && pollingref == field && pollingseq == seqtype) + pollingitem = item; + item->seq = input_field_seq(field, seqtype); + item->defseq = &get_field_default_seq(field, seqtype); + item->sortorder = sortorder + suborder[seqtype]; + item->type = input_type_is_analog(field->type) ? (INPUT_TYPE_ANALOG + seqtype) : INPUT_TYPE_DIGITAL; + item->name = name; + item->next = itemlist; + itemlist = item; + + /* stop after one, unless we're analog */ + if (item->type == INPUT_TYPE_DIGITAL) + break; + } + } + } + + /* sort and populate the menu in a standard fashion */ + populate_and_sort(itemlist); +} + +ui_menu_input_specific::~ui_menu_input_specific() +{ +} + +/*------------------------------------------------- + menu_input - display a menu for inputs +-------------------------------------------------*/ +ui_menu_input::ui_menu_input(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ + pollingitem = 0; + pollingref = 0; + pollingseq = SEQ_TYPE_STANDARD; +} + +ui_menu_input::~ui_menu_input() +{ +} + +/*------------------------------------------------- + toggle_none_default - toggle between "NONE" + and the default item +-------------------------------------------------*/ + +void ui_menu_input::toggle_none_default(input_seq &selected_seq, input_seq &original_seq, const input_seq &selected_defseq) +{ + /* if we used to be "none", toggle to the default value */ + if (original_seq.length() == 0) + selected_seq = selected_defseq; + + /* otherwise, toggle to "none" */ + else + selected_seq.reset(); +} + +/*------------------------------------------------- + get_field_default_seq - return a pointer + to the default sequence for the given field +-------------------------------------------------*/ + +const input_seq &ui_menu_input::get_field_default_seq(input_field_config *field, input_seq_type seqtype) +{ + if (field->seq[seqtype].is_default()) + return input_type_seq(field->machine(), field->type, field->player, seqtype); + else + return field->seq[seqtype]; +} + +void ui_menu_input::handle() +{ + input_item_data *seqchangeditem = NULL; + const ui_menu_event *menu_event; + int invalidate = false; + + /* process the menu */ + menu_event = process((pollingitem != NULL) ? UI_MENU_PROCESS_NOKEYS : 0); + + /* if we are polling, handle as a special case */ + if (pollingitem != NULL) + { + input_item_data *item = pollingitem; + input_seq newseq; + + /* if UI_CANCEL is pressed, abort */ + if (ui_input_pressed(machine(), IPT_UI_CANCEL)) + { + pollingitem = NULL; + record_next = false; + toggle_none_default(item->seq, starting_seq, *item->defseq); + seqchangeditem = item; + } + + /* poll again; if finished, update the sequence */ + if (machine().input().seq_poll()) + { + pollingitem = NULL; + record_next = true; + item->seq = machine().input().seq_poll_final(); + seqchangeditem = item; + } + } + + /* otherwise, handle the events */ + else if (menu_event != NULL && menu_event->itemref != NULL) + { + input_item_data *item = (input_item_data *)menu_event->itemref; + switch (menu_event->iptkey) + { + /* an item was selected: begin polling */ + case IPT_UI_SELECT: + pollingitem = item; + last_sortorder = item->sortorder; + starting_seq = item->seq; + machine().input().seq_poll_start((item->type == INPUT_TYPE_ANALOG) ? ITEM_CLASS_ABSOLUTE : ITEM_CLASS_SWITCH, record_next ? &item->seq : NULL); + invalidate = true; + break; + + /* if the clear key was pressed, reset the selected item */ + case IPT_UI_CLEAR: + toggle_none_default(item->seq, item->seq, *item->defseq); + record_next = false; + seqchangeditem = item; + break; + } + + /* if the selection changed, reset the "record next" flag */ + if (item->sortorder != last_sortorder) + record_next = false; + last_sortorder = item->sortorder; + } + + /* if the sequence changed, update it */ + if (seqchangeditem != NULL) + { + update_input(seqchangeditem); + + /* invalidate the menu to force an update */ + invalidate = true; + } + + /* if the menu is invalidated, clear it now */ + if (invalidate) + { + pollingref = NULL; + if (pollingitem != NULL) + { + pollingref = pollingitem->ref; + pollingseq = pollingitem->seqtype; + } + reset(UI_MENU_RESET_REMEMBER_POSITION); + } +} + +void ui_menu_input_general::update_input(struct input_item_data *seqchangeditem) +{ + const input_type_entry *entry = (const input_type_entry *)seqchangeditem->ref; + input_type_set_seq(machine(), entry->type, entry->player, seqchangeditem->seqtype, &seqchangeditem->seq); +} + +void ui_menu_input_specific::update_input(struct input_item_data *seqchangeditem) +{ + input_field_user_settings settings; + + input_field_get_user_settings((input_field_config *)seqchangeditem->ref, &settings); + settings.seq[seqchangeditem->seqtype] = seqchangeditem->seq; + input_field_set_user_settings((input_field_config *)seqchangeditem->ref, &settings); +} + + +/*------------------------------------------------- + menu_input_compare_items - compare two + items for quicksort +-------------------------------------------------*/ + +int ui_menu_input::compare_items(const void *i1, const void *i2) +{ + const input_item_data * const *data1 = (const input_item_data * const *)i1; + const input_item_data * const *data2 = (const input_item_data * const *)i2; + if ((*data1)->sortorder < (*data2)->sortorder) + return -1; + if ((*data1)->sortorder > (*data2)->sortorder) + return 1; + return 0; +} + + +/*------------------------------------------------- + menu_input_populate_and_sort - take a list + of input_item_data objects and build up the + menu from them +-------------------------------------------------*/ + +void ui_menu_input::populate_and_sort(input_item_data *itemlist) +{ + const char *nameformat[INPUT_TYPE_TOTAL] = { 0 }; + input_item_data **itemarray, *item; + int numitems = 0, curitem; + astring subtext; + astring text; + + /* create a mini lookup table for name format based on type */ + nameformat[INPUT_TYPE_DIGITAL] = "%s"; + nameformat[INPUT_TYPE_ANALOG] = "%s Analog"; + nameformat[INPUT_TYPE_ANALOG_INC] = "%s Analog Inc"; + nameformat[INPUT_TYPE_ANALOG_DEC] = "%s Analog Dec"; + + /* first count the number of items */ + for (item = itemlist; item != NULL; item = item->next) + numitems++; + + /* now allocate an array of items and fill it up */ + itemarray = (input_item_data **)m_pool_alloc(sizeof(*itemarray) * numitems); + for (item = itemlist, curitem = 0; item != NULL; item = item->next) + itemarray[curitem++] = item; + + /* sort it */ + qsort(itemarray, numitems, sizeof(*itemarray), compare_items); + + /* build the menu */ + for (curitem = 0; curitem < numitems; curitem++) + { + UINT32 flags = 0; + + /* generate the name of the item itself, based off the base name and the type */ + item = itemarray[curitem]; + assert(nameformat[item->type] != NULL); + text.printf(nameformat[item->type], item->name); + + /* if we're polling this item, use some spaces with left/right arrows */ + if (pollingref == item->ref) + { + subtext.cpy(" "); + flags |= MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW; + } + + /* otherwise, generate the sequence name and invert it if different from the default */ + else + { + machine().input().seq_name(subtext, item->seq); + flags |= (item->seq != *item->defseq) ? MENU_FLAG_INVERT : 0; + } + + /* add the item */ + item_append(text, subtext, flags, item); + } +} + + +/*------------------------------------------------- + menu_settings_dip_switches - handle the DIP + switches menu +-------------------------------------------------*/ + +ui_menu_settings_dip_switches::ui_menu_settings_dip_switches(running_machine &machine, render_container *container) : ui_menu_settings(machine, container, IPT_DIPSWITCH) +{ +} + +ui_menu_settings_dip_switches::~ui_menu_settings_dip_switches() +{ +} + +/*------------------------------------------------- + menu_settings_driver_config - handle the + driver config menu +-------------------------------------------------*/ + +ui_menu_settings_driver_config::ui_menu_settings_driver_config(running_machine &machine, render_container *container) : ui_menu_settings(machine, container, IPT_CONFIG) +{ +} + +ui_menu_settings_driver_config::~ui_menu_settings_driver_config() +{ +} + +/*------------------------------------------------- + menu_settings_common - handle one of the + switches menus +-------------------------------------------------*/ + +void ui_menu_settings::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + + /* handle events */ + if (menu_event != NULL && menu_event->itemref != NULL) + { + input_field_config *field = (input_field_config *)menu_event->itemref; + input_field_user_settings settings; + int changed = false; + + switch (menu_event->iptkey) + { + /* if selected, reset to default value */ + case IPT_UI_SELECT: + input_field_get_user_settings(field, &settings); + settings.value = field->defvalue; + input_field_set_user_settings(field, &settings); + changed = true; + break; + + /* left goes to previous setting */ + case IPT_UI_LEFT: + input_field_select_previous_setting(field); + changed = true; + break; + + /* right goes to next setting */ + case IPT_UI_RIGHT: + input_field_select_next_setting(field); + changed = true; + break; + } + + /* if anything changed, rebuild the menu, trying to stay on the same field */ + if (changed) + reset(UI_MENU_RESET_REMEMBER_REF); + } +} + + +/*------------------------------------------------- + menu_settings_populate - populate one of the + switches menus +-------------------------------------------------*/ + +ui_menu_settings::ui_menu_settings(running_machine &machine, render_container *container, UINT32 _type) : ui_menu(machine, container) +{ + type = _type; +} + +void ui_menu_settings::populate() +{ + input_field_config *field; + input_port_config *port; + dip_descriptor **diplist_tailptr; + + /* reset the dip switch tracking */ + dipcount = 0; + diplist = NULL; + diplist_tailptr = &diplist; + + /* loop over input ports and set up the current values */ + for (port = machine().m_portlist.first(); port != NULL; port = port->next()) + for (field = port->fieldlist().first(); field != NULL; field = field->next()) + if (field->type == type && input_condition_true(machine(), &field->condition, port->owner())) + { + UINT32 flags = 0; + + /* set the left/right flags appropriately */ + if (input_field_has_previous_setting(field)) + flags |= MENU_FLAG_LEFT_ARROW; + if (input_field_has_next_setting(field)) + flags |= MENU_FLAG_RIGHT_ARROW; + + /* add the menu item */ + item_append(input_field_name(field), input_field_setting_name(field), flags, (void *)field); + + /* for DIP switches, build up the model */ + if (type == IPT_DIPSWITCH && field->diploclist().count() != 0) + { + const input_field_diplocation *diploc; + input_field_user_settings settings; + UINT32 accummask = field->mask; + + /* get current settings */ + input_field_get_user_settings(field, &settings); + + /* iterate over each bit in the field */ + for (diploc = field->diploclist().first(); diploc != NULL; diploc = diploc->next()) + { + UINT32 mask = accummask & ~(accummask - 1); + dip_descriptor *dip; + + /* find the matching switch name */ + for (dip = diplist; dip != NULL; dip = dip->next) + if (strcmp(dip->name, diploc->swname) == 0) + break; + + /* allocate new if none */ + if (dip == NULL) + { + dip = (dip_descriptor *)m_pool_alloc(sizeof(*dip)); + dip->next = NULL; + dip->name = diploc->swname; + dip->mask = dip->state = 0; + *diplist_tailptr = dip; + diplist_tailptr = &dip->next; + if (mame_stricmp(dip->name, "FAKE") != 0) + dipcount++; + } + + /* apply the bits */ + dip->mask |= 1 << (diploc->swnum - 1); + if (((settings.value & mask) != 0 && !diploc->invert) || ((settings.value & mask) == 0 && diploc->invert)) + dip->state |= 1 << (diploc->swnum - 1); + + /* clear the relevant bit in the accumulated mask */ + accummask &= ~mask; + } + } + } + if (type == IPT_DIPSWITCH) + custombottom = dipcount * (DIP_SWITCH_HEIGHT + DIP_SWITCH_SPACING) + DIP_SWITCH_SPACING; +} + +ui_menu_settings::~ui_menu_settings() +{ +} + +/*------------------------------------------------- + menu_settings_custom_render - perform our special + rendering +-------------------------------------------------*/ + +void ui_menu_settings_dip_switches::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +{ + input_field_config *field = (input_field_config *)selectedref; + dip_descriptor *dip; + + /* add borders */ + y1 = y2 + UI_BOX_TB_BORDER; + y2 = y1 + bottom; + + /* draw extra menu area */ + ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); + y1 += (float)DIP_SWITCH_SPACING; + + /* iterate over DIP switches */ + for (dip = diplist; dip != NULL; dip = dip->next) + { + if (mame_stricmp(dip->name, "FAKE") != 0) + { + const input_field_diplocation *diploc; + UINT32 selectedmask = 0; + + /* determine the mask of selected bits */ + if (field != NULL) + for (diploc = field->diploclist().first(); diploc != NULL; diploc = diploc->next()) + if (strcmp(dip->name, diploc->swname) == 0) + selectedmask |= 1 << (diploc->swnum - 1); + + /* draw one switch */ + custom_render_one(x1, y1, x2, y1 + DIP_SWITCH_HEIGHT, dip, selectedmask); + y1 += (float)(DIP_SWITCH_SPACING + DIP_SWITCH_HEIGHT); + } + } +} + + +/*------------------------------------------------- + menu_settings_custom_render_one - draw a single + DIP switch +-------------------------------------------------*/ + +void ui_menu_settings_dip_switches::custom_render_one(float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask) +{ + float switch_field_width = SINGLE_TOGGLE_SWITCH_FIELD_WIDTH * container->manager().ui_aspect(); + float switch_width = SINGLE_TOGGLE_SWITCH_WIDTH * container->manager().ui_aspect(); + int numtoggles, toggle; + float switch_toggle_gap; + float y1_off, y1_on; + + /* determine the number of toggles in the DIP */ + numtoggles = 32 - count_leading_zeros(dip->mask); + + /* center based on the number of switches */ + x1 += (x2 - x1 - numtoggles * switch_field_width) / 2; + + /* draw the dip switch name */ + ui_draw_text_full( container, + dip->name, + 0, + y1 + (DIP_SWITCH_HEIGHT - UI_TARGET_FONT_HEIGHT) / 2, + x1 - ui_get_string_width(container->manager().machine(), " "), + JUSTIFY_RIGHT, + WRAP_NEVER, + DRAW_NORMAL, + UI_TEXT_COLOR, + PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA), + NULL , + NULL); + + /* compute top and bottom for on and off positions */ + switch_toggle_gap = ((DIP_SWITCH_HEIGHT/2) - SINGLE_TOGGLE_SWITCH_HEIGHT)/2; + y1_off = y1 + UI_LINE_WIDTH + switch_toggle_gap; + y1_on = y1 + DIP_SWITCH_HEIGHT/2 + switch_toggle_gap; + + /* iterate over toggles */ + for (toggle = 0; toggle < numtoggles; toggle++) + { + float innerx1; + + /* first outline the switch */ + ui_draw_outlined_box(container, x1, y1, x1 + switch_field_width, y2, UI_BACKGROUND_COLOR); + + /* compute x1/x2 for the inner filled in switch */ + innerx1 = x1 + (switch_field_width - switch_width) / 2; + + /* see if the switch is actually used */ + if (dip->mask & (1 << toggle)) + { + float innery1 = (dip->state & (1 << toggle)) ? y1_on : y1_off; + container->add_rect(innerx1, innery1, innerx1 + switch_width, innery1 + SINGLE_TOGGLE_SWITCH_HEIGHT, + (selectedmask & (1 << toggle)) ? UI_DIPSW_COLOR : UI_TEXT_COLOR, + PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + } + else + { + container->add_rect(innerx1, y1_off, innerx1 + switch_width, y1_on + SINGLE_TOGGLE_SWITCH_HEIGHT, + UI_UNAVAILABLE_COLOR, + PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + } + + /* advance to the next switch */ + x1 += switch_field_width; + } +} + + +/*------------------------------------------------- + menu_analog - handle the analog settings menu +-------------------------------------------------*/ + +void ui_menu_analog::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(UI_MENU_PROCESS_LR_REPEAT); + + /* handle events */ + if (menu_event != NULL && menu_event->itemref != NULL) + { + analog_item_data *data = (analog_item_data *)menu_event->itemref; + int newval = data->cur; + + switch (menu_event->iptkey) + { + /* if selected, reset to default value */ + case IPT_UI_SELECT: + newval = data->defvalue; + break; + + /* left decrements */ + case IPT_UI_LEFT: + newval -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; + break; + + /* right increments */ + case IPT_UI_RIGHT: + newval += machine().input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; + break; + } + + /* clamp to range */ + if (newval < data->min) + newval = data->min; + if (newval > data->max) + newval = data->max; + + /* if things changed, update */ + if (newval != data->cur) + { + input_field_user_settings settings; + + /* get the settings and set the new value */ + input_field_get_user_settings(data->field, &settings); + switch (data->type) + { + case ANALOG_ITEM_KEYSPEED: settings.delta = newval; break; + case ANALOG_ITEM_CENTERSPEED: settings.centerdelta = newval; break; + case ANALOG_ITEM_REVERSE: settings.reverse = newval; break; + case ANALOG_ITEM_SENSITIVITY: settings.sensitivity = newval; break; + } + input_field_set_user_settings(data->field, &settings); + + /* rebuild the menu */ + reset(UI_MENU_RESET_REMEMBER_POSITION); + } + } +} + + +/*------------------------------------------------- + menu_analog_populate - populate the analog + settings menu +-------------------------------------------------*/ + +ui_menu_analog::ui_menu_analog(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_analog::populate() +{ + input_field_config *field; + input_port_config *port; + astring subtext; + astring text; + + /* loop over input ports and add the items */ + for (port = machine().m_portlist.first(); port != NULL; port = port->next()) + for (field = port->fieldlist().first(); field != NULL; field = field->next()) + if (input_type_is_analog(field->type) && input_condition_true(machine(), &field->condition, port->owner())) + { + input_field_user_settings settings; + int use_autocenter = false; + int type; + + /* based on the type, determine if we enable autocenter */ + switch (field->type) + { + case IPT_POSITIONAL: + case IPT_POSITIONAL_V: + if (field->flags & ANALOG_FLAG_WRAPS) + break; + + case IPT_AD_STICK_X: + case IPT_AD_STICK_Y: + case IPT_AD_STICK_Z: + case IPT_PADDLE: + case IPT_PADDLE_V: + case IPT_PEDAL: + case IPT_PEDAL2: + case IPT_PEDAL3: + use_autocenter = true; + break; + } + + /* get the user settings */ + input_field_get_user_settings(field, &settings); + + /* iterate over types */ + for (type = 0; type < ANALOG_ITEM_COUNT; type++) + if (type != ANALOG_ITEM_CENTERSPEED || use_autocenter) + { + analog_item_data *data; + UINT32 flags = 0; + + /* allocate a data item for tracking what this menu item refers to */ + data = (analog_item_data *)m_pool_alloc(sizeof(*data)); + data->field = field; + data->type = type; + + /* determine the properties of this item */ + switch (type) + { + default: + case ANALOG_ITEM_KEYSPEED: + text.printf("%s Digital Speed", input_field_name(field)); + subtext.printf("%d", settings.delta); + data->min = 0; + data->max = 255; + data->cur = settings.delta; + data->defvalue = field->delta; + break; + + case ANALOG_ITEM_CENTERSPEED: + text.printf("%s Autocenter Speed", input_field_name(field)); + subtext.printf("%d", settings.centerdelta); + data->min = 0; + data->max = 255; + data->cur = settings.centerdelta; + data->defvalue = field->centerdelta; + break; + + case ANALOG_ITEM_REVERSE: + text.printf("%s Reverse", input_field_name(field)); + subtext.cpy(settings.reverse ? "On" : "Off"); + data->min = 0; + data->max = 1; + data->cur = settings.reverse; + data->defvalue = ((field->flags & ANALOG_FLAG_REVERSE) != 0); + break; + + case ANALOG_ITEM_SENSITIVITY: + text.printf("%s Sensitivity", input_field_name(field)); + subtext.printf("%d", settings.sensitivity); + data->min = 1; + data->max = 255; + data->cur = settings.sensitivity; + data->defvalue = field->sensitivity; + break; + } + + /* put on arrows */ + if (data->cur > data->min) + flags |= MENU_FLAG_LEFT_ARROW; + if (data->cur < data->max) + flags |= MENU_FLAG_RIGHT_ARROW; + + /* append a menu item */ + item_append(text, subtext, flags, data); + } + } +} + +ui_menu_analog::~ui_menu_analog() +{ +} + +/*------------------------------------------------- + menu_bookkeeping - handle the bookkeeping + information menu +-------------------------------------------------*/ + +void ui_menu_bookkeeping::handle() +{ + attotime curtime; + + /* if the time has rolled over another second, regenerate */ + curtime = machine().time(); + if (prevtime.seconds != curtime.seconds) + { + reset(UI_MENU_RESET_SELECT_FIRST); + prevtime = curtime; + populate(); + } + + /* process the menu */ + process(0); +} + + +/*------------------------------------------------- + menu_bookkeeping - handle the bookkeeping + information menu +-------------------------------------------------*/ +ui_menu_bookkeeping::ui_menu_bookkeeping(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +ui_menu_bookkeeping::~ui_menu_bookkeeping() +{ +} + +void ui_menu_bookkeeping::populate() +{ + int tickets = get_dispensed_tickets(machine()); + astring tempstring; + int ctrnum; + + /* show total time first */ + if (prevtime.seconds >= 60 * 60) + tempstring.catprintf("Uptime: %d:%02d:%02d\n\n", prevtime.seconds / (60*60), (prevtime.seconds / 60) % 60, prevtime.seconds % 60); + else + tempstring.catprintf("Uptime: %d:%02d\n\n", (prevtime.seconds / 60) % 60, prevtime.seconds % 60); + + /* show tickets at the top */ + if (tickets > 0) + tempstring.catprintf("Tickets dispensed: %d\n\n", tickets); + + /* loop over coin counters */ + for (ctrnum = 0; ctrnum < COIN_COUNTERS; ctrnum++) + { + int count = coin_counter_get_count(machine(), ctrnum); + + /* display the coin counter number */ + tempstring.catprintf("Coin %c: ", ctrnum + 'A'); + + /* display how many coins */ + if (count == 0) + tempstring.cat("NA"); + else + tempstring.catprintf("%d", count); + + /* display whether or not we are locked out */ + if (coin_lockout_get_state(machine(), ctrnum)) + tempstring.cat(" (locked)"); + tempstring.cat("\n"); + } + + /* append the single item */ + item_append(tempstring, NULL, MENU_FLAG_MULTILINE, NULL); +} + + +/*------------------------------------------------- + menu_game_info - handle the game information + menu +-------------------------------------------------*/ + +ui_menu_game_info::ui_menu_game_info(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_game_info::populate() +{ + astring tempstring; + item_append(game_info_astring(machine(), tempstring), NULL, MENU_FLAG_MULTILINE, NULL); +} + +void ui_menu_game_info::handle() +{ + /* process the menu */ + process(0); +} + +ui_menu_game_info::~ui_menu_game_info() +{ +} + +/*------------------------------------------------- + menu_cheat - handle the cheat menu +-------------------------------------------------*/ + +void ui_menu_cheat::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(UI_MENU_PROCESS_LR_REPEAT); + + /* handle events */ + if (menu_event != NULL && menu_event->itemref != NULL) + { + bool changed = false; + + /* clear cheat comment on any movement or keypress */ + popmessage(NULL); + + /* handle reset all + reset all cheats for reload all option */ + if ((FPTR)menu_event->itemref < 3 && menu_event->iptkey == IPT_UI_SELECT) + { + for (cheat_entry *curcheat = machine().cheat().first(); curcheat != NULL; curcheat = curcheat->next()) + if (curcheat->select_default_state()) + changed = true; + } + + + /* handle individual cheats */ + else if ((FPTR)menu_event->itemref > 2) + { + cheat_entry *curcheat = reinterpret_cast(menu_event->itemref); + const char *string; + switch (menu_event->iptkey) + { + /* if selected, activate a oneshot */ + case IPT_UI_SELECT: + changed = curcheat->activate(); + break; + + /* if cleared, reset to default value */ + case IPT_UI_CLEAR: + changed = curcheat->select_default_state(); + break; + + /* left decrements */ + case IPT_UI_LEFT: + changed = curcheat->select_previous_state(); + break; + + /* right increments */ + case IPT_UI_RIGHT: + changed = curcheat->select_next_state(); + break; + + /* bring up display comment if one exists */ + case IPT_UI_DISPLAY_COMMENT: + case IPT_UI_UP: + case IPT_UI_DOWN: + string = curcheat->comment(); + if (string != NULL && string[0] != 0) + popmessage("Cheat Comment:\n%s", string); + break; + } + } + + /* handle reload all */ + if ((FPTR)menu_event->itemref == 2 && menu_event->iptkey == IPT_UI_SELECT) + { + /* re-init cheat engine and thus reload cheats/cheats have already been turned off by here */ + machine().cheat().reload(); + + /* display the reloaded cheats */ + reset(UI_MENU_RESET_REMEMBER_REF); + popmessage("All cheats reloaded"); + } + + /* if things changed, update */ + if (changed) + reset(UI_MENU_RESET_REMEMBER_REF); + } +} + + +/*------------------------------------------------- + menu_cheat_populate - populate the cheat menu +-------------------------------------------------*/ + +ui_menu_cheat::ui_menu_cheat(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_cheat::populate() +{ + /* iterate over cheats */ + astring text; + astring subtext; + for (cheat_entry *curcheat = machine().cheat().first(); curcheat != NULL; curcheat = curcheat->next()) + { + UINT32 flags; + curcheat->menu_text(text, subtext, flags); + item_append(text, subtext, flags, curcheat); + } + + /* add a separator */ + item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + + /* add a reset all option */ + item_append("Reset All", NULL, 0, (void *)1); + + /* add a reload all cheats option */ + item_append("Reload All", NULL, 0, (void *)2); +} + +ui_menu_cheat::~ui_menu_cheat() +{ +} + +/*------------------------------------------------- + menu_memory_card - handle the memory card + menu +-------------------------------------------------*/ + +void ui_menu_memory_card::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(UI_MENU_PROCESS_LR_REPEAT); + + /* if something was selected, act on it */ + if (menu_event != NULL && menu_event->itemref != NULL) + { + FPTR item = (FPTR)menu_event->itemref; + + /* select executes actions on some of the items */ + if (menu_event->iptkey == IPT_UI_SELECT) + { + switch (item) + { + /* handle card loading; if we succeed, clear the menus */ + case MEMCARD_ITEM_LOAD: + if (memcard_insert(machine(), cardnum) == 0) + { + popmessage("Memory card loaded"); + ui_menu::stack_reset(machine()); + } + else + popmessage("Error loading memory card"); + break; + + /* handle card ejecting */ + case MEMCARD_ITEM_EJECT: + memcard_eject(machine()); + popmessage("Memory card ejected"); + break; + + /* handle card creating */ + case MEMCARD_ITEM_CREATE: + if (memcard_create(machine(), cardnum, false) == 0) + popmessage("Memory card created"); + else + popmessage("Error creating memory card\n(Card may already exist)"); + break; + } + } + + /* the select item has extra keys */ + else if (item == MEMCARD_ITEM_SELECT) + { + switch (menu_event->iptkey) + { + /* left decrements the card number */ + case IPT_UI_LEFT: + cardnum -= 1; + reset(UI_MENU_RESET_REMEMBER_REF); + break; + + /* right decrements the card number */ + case IPT_UI_RIGHT: + cardnum += 1; + reset(UI_MENU_RESET_REMEMBER_REF); + break; + } + } + } +} + + +/*------------------------------------------------- + menu_memory_card_populate - populate the + memory card menu +-------------------------------------------------*/ + +ui_menu_memory_card::ui_menu_memory_card(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_memory_card::populate() +{ + char tempstring[20]; + UINT32 flags = 0; + + /* add the card select menu */ + sprintf(tempstring, "%d", cardnum); + if (cardnum > 0) + flags |= MENU_FLAG_LEFT_ARROW; + if (cardnum < 1000) + flags |= MENU_FLAG_RIGHT_ARROW; + item_append("Card Number:", tempstring, flags, (void *)MEMCARD_ITEM_SELECT); + + /* add the remaining items */ + item_append("Load Selected Card", NULL, 0, (void *)MEMCARD_ITEM_LOAD); + if (memcard_present(machine()) != -1) + item_append("Eject Current Card", NULL, 0, (void *)MEMCARD_ITEM_EJECT); + item_append("Create New Card", NULL, 0, (void *)MEMCARD_ITEM_CREATE); +} + +ui_menu_memory_card::~ui_menu_memory_card() +{ +} + +/*------------------------------------------------- + menu_sliders - handle the sliders menu +-------------------------------------------------*/ + +void ui_menu_sliders::handle() +{ + const ui_menu_event *menu_event; + + /* process the menu */ + menu_event = process(UI_MENU_PROCESS_LR_REPEAT | (hidden ? UI_MENU_PROCESS_CUSTOM_ONLY : 0)); + if (menu_event != NULL) + { + /* handle keys if there is a valid item selected */ + if (menu_event->itemref != NULL) + { + const slider_state *slider = (const slider_state *)menu_event->itemref; + INT32 curvalue = (*slider->update)(machine(), slider->arg, NULL, SLIDER_NOCHANGE); + INT32 increment = 0; + + switch (menu_event->iptkey) + { + /* toggle visibility */ + case IPT_UI_ON_SCREEN_DISPLAY: + if (menuless_mode) + ui_menu::stack_pop(machine()); + else + hidden = !hidden; + break; + + /* decrease value */ + case IPT_UI_LEFT: + if (machine().input().code_pressed(KEYCODE_LALT) || machine().input().code_pressed(KEYCODE_RALT)) + increment = -1; + else if (machine().input().code_pressed(KEYCODE_LSHIFT) || machine().input().code_pressed(KEYCODE_RSHIFT)) + increment = (slider->incval > 10) ? -(slider->incval / 10) : -1; + else if (machine().input().code_pressed(KEYCODE_LCONTROL) || machine().input().code_pressed(KEYCODE_RCONTROL)) + increment = -slider->incval * 10; + else + increment = -slider->incval; + break; + + /* increase value */ + case IPT_UI_RIGHT: + if (machine().input().code_pressed(KEYCODE_LALT) || machine().input().code_pressed(KEYCODE_RALT)) + increment = 1; + else if (machine().input().code_pressed(KEYCODE_LSHIFT) || machine().input().code_pressed(KEYCODE_RSHIFT)) + increment = (slider->incval > 10) ? (slider->incval / 10) : 1; + else if (machine().input().code_pressed(KEYCODE_LCONTROL) || machine().input().code_pressed(KEYCODE_RCONTROL)) + increment = slider->incval * 10; + else + increment = slider->incval; + break; + + /* restore default */ + case IPT_UI_SELECT: + increment = slider->defval - curvalue; + break; + } + + /* handle any changes */ + if (increment != 0) + { + INT32 newvalue = curvalue + increment; + + /* clamp within bounds */ + if (newvalue < slider->minval) + newvalue = slider->minval; + if (newvalue > slider->maxval) + newvalue = slider->maxval; + + /* update the slider and recompute the menu */ + (*slider->update)(machine(), slider->arg, NULL, newvalue); + reset(UI_MENU_RESET_REMEMBER_REF); + } + } + + /* if we are selecting an invalid item and we are hidden, skip to the next one */ + else if (hidden) + { + /* if we got here via up or page up, select the previous item */ + if (menu_event->iptkey == IPT_UI_UP || menu_event->iptkey == IPT_UI_PAGE_UP) + { + selected = (selected + numitems - 1) % numitems; + validate_selection(-1); + } + + /* otherwise select the next item */ + else if (menu_event->iptkey == IPT_UI_DOWN || menu_event->iptkey == IPT_UI_PAGE_DOWN) + { + selected = (selected + 1) % numitems; + validate_selection(1); + } + } + } +} + + +/*------------------------------------------------- + menu_sliders_populate - populate the sliders + menu +-------------------------------------------------*/ + +ui_menu_sliders::ui_menu_sliders(running_machine &machine, render_container *container, bool _menuless_mode) : ui_menu(machine, container) +{ + menuless_mode = hidden = _menuless_mode; +} + +void ui_menu_sliders::populate() +{ + const slider_state *curslider; + astring tempstring; + + /* add all sliders */ + for (curslider = ui_get_slider_list(); curslider != NULL; curslider = curslider->next) + { + INT32 curval = (*curslider->update)(machine(), curslider->arg, &tempstring, SLIDER_NOCHANGE); + UINT32 flags = 0; + if (curval > curslider->minval) + flags |= MENU_FLAG_LEFT_ARROW; + if (curval < curslider->maxval) + flags |= MENU_FLAG_RIGHT_ARROW; + item_append(curslider->description, tempstring, flags, (void *)curslider); + + if (menuless_mode) + break; + } + + /* add all sliders */ + for (curslider = (slider_state*)machine().osd().get_slider_list(); curslider != NULL; curslider = curslider->next) + { + INT32 curval = (*curslider->update)(machine(), curslider->arg, &tempstring, SLIDER_NOCHANGE); + UINT32 flags = 0; + if (curval > curslider->minval) + flags |= MENU_FLAG_LEFT_ARROW; + if (curval < curslider->maxval) + flags |= MENU_FLAG_RIGHT_ARROW; + item_append(curslider->description, tempstring, flags, (void *)curslider); + } + + custombottom = 2.0f * ui_get_line_height(machine()) + 2.0f * UI_BOX_TB_BORDER; +} + +ui_menu_sliders::~ui_menu_sliders() +{ +} + +/*------------------------------------------------- + menu_sliders_custom_render - perform our special + rendering +-------------------------------------------------*/ + +void ui_menu_sliders::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) +{ + const slider_state *curslider = (const slider_state *)selectedref; + if (curslider != NULL) + { + float bar_left, bar_area_top, bar_width, bar_area_height, bar_top, bar_bottom, default_x, current_x; + float line_height = ui_get_line_height(machine()); + float percentage, default_percentage; + astring tempstring; + float text_height; + INT32 curval; + + /* determine the current value and text */ + curval = (*curslider->update)(machine(), curslider->arg, &tempstring, SLIDER_NOCHANGE); + + /* compute the current and default percentages */ + percentage = (float)(curval - curslider->minval) / (float)(curslider->maxval - curslider->minval); + default_percentage = (float)(curslider->defval - curslider->minval) / (float)(curslider->maxval - curslider->minval); + + /* assemble the the text */ + tempstring.ins(0, " ").ins(0, curslider->description); + + /* move us to the bottom of the screen, and expand to full width */ + y2 = 1.0f - UI_BOX_TB_BORDER; + y1 = y2 - bottom; + x1 = UI_BOX_LR_BORDER; + x2 = 1.0f - UI_BOX_LR_BORDER; + + /* draw extra menu area */ + ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); + y1 += UI_BOX_TB_BORDER; + + /* determine the text height */ + ui_draw_text_full(container, tempstring, 0, 0, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, + JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, NULL, &text_height); + + /* draw the thermometer */ + bar_left = x1 + UI_BOX_LR_BORDER; + bar_area_top = y1; + bar_width = x2 - x1 - 2.0f * UI_BOX_LR_BORDER; + bar_area_height = line_height; + + /* compute positions */ + bar_top = bar_area_top + 0.125f * bar_area_height; + bar_bottom = bar_area_top + 0.875f * bar_area_height; + default_x = bar_left + bar_width * default_percentage; + current_x = bar_left + bar_width * percentage; + + /* fill in the percentage */ + container->add_rect(bar_left, bar_top, current_x, bar_bottom, UI_SLIDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + + /* draw the top and bottom lines */ + container->add_line(bar_left, bar_top, bar_left + bar_width, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container->add_line(bar_left, bar_bottom, bar_left + bar_width, bar_bottom, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + + /* draw default marker */ + container->add_line(default_x, bar_area_top, default_x, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container->add_line(default_x, bar_bottom, default_x, bar_area_top + bar_area_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + + /* draw the actual text */ + ui_draw_text_full(container, tempstring, x1 + UI_BOX_LR_BORDER, y1 + line_height, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, + JUSTIFY_CENTER, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, &text_height); + } +} + + +/*------------------------------------------------- + menu_video_targets - handle the video targets + menu +-------------------------------------------------*/ + +void ui_menu_video_targets::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(0); + if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_video_options(machine(), container, static_cast(menu_event->itemref)))); +} + + +/*------------------------------------------------- + menu_video_targets_populate - populate the + video targets menu +-------------------------------------------------*/ + +ui_menu_video_targets::ui_menu_video_targets(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_video_targets::populate() +{ + int targetnum; + + /* find the targets */ + for (targetnum = 0; ; targetnum++) + { + render_target *target = machine().render().target_by_index(targetnum); + char buffer[40]; + + /* stop when we run out */ + if (target == NULL) + break; + + /* add a menu item */ + sprintf(buffer, "Screen #%d", targetnum); + item_append(buffer, NULL, 0, target); + } +} + +ui_menu_video_targets::~ui_menu_video_targets() +{ +} + +/*------------------------------------------------- + menu_video_options - handle the video options + menu +-------------------------------------------------*/ + +void ui_menu_video_options::handle() +{ + bool changed = false; + + /* process the menu */ + const ui_menu_event *menu_event = process(0); + if (menu_event != NULL && menu_event->itemref != NULL) + { + switch ((FPTR)menu_event->itemref) + { + /* rotate adds rotation depending on the direction */ + case VIDEO_ITEM_ROTATE: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + int delta = (menu_event->iptkey == IPT_UI_LEFT) ? ROT270 : ROT90; + target->set_orientation(orientation_add(delta, target->orientation())); + if (target->is_ui_target()) + { + render_container::user_settings settings; + container->get_user_settings(settings); + settings.m_orientation = orientation_add(delta ^ ROT180, settings.m_orientation); + container->set_user_settings(settings); + } + changed = true; + } + break; + + /* layer config bitmasks handle left/right keys the same (toggle) */ + case VIDEO_ITEM_BACKDROPS: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_backdrops_enabled(!target->backdrops_enabled()); + changed = true; + } + break; + + case VIDEO_ITEM_OVERLAYS: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_overlays_enabled(!target->overlays_enabled()); + changed = true; + } + break; + + case VIDEO_ITEM_BEZELS: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_bezels_enabled(!target->bezels_enabled()); + changed = true; + } + break; + + case VIDEO_ITEM_CPANELS: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_cpanels_enabled(!target->cpanels_enabled()); + changed = true; + } + break; + + case VIDEO_ITEM_MARQUEES: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_marquees_enabled(!target->marquees_enabled()); + changed = true; + } + break; + + case VIDEO_ITEM_ZOOM: + if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) + { + target->set_zoom_to_screen(!target->zoom_to_screen()); + changed = true; + } + break; + + /* anything else is a view item */ + default: + if (menu_event->iptkey == IPT_UI_SELECT && (int)(FPTR)menu_event->itemref >= VIDEO_ITEM_VIEW) + { + target->set_view((FPTR)menu_event->itemref - VIDEO_ITEM_VIEW); + changed = true; + } + break; + } + } + + /* if something changed, rebuild the menu */ + if (changed) + reset(UI_MENU_RESET_REMEMBER_REF); +} + + +/*------------------------------------------------- + menu_video_options_populate - populate the + video options menu +-------------------------------------------------*/ + +ui_menu_video_options::ui_menu_video_options(running_machine &machine, render_container *container, render_target *_target) : ui_menu(machine, container) +{ + target = _target; +} + +void ui_menu_video_options::populate() +{ + const char *subtext = ""; + astring tempstring; + int viewnum; + int enabled; + + /* add items for each view */ + for (viewnum = 0; ; viewnum++) + { + const char *name = target->view_name(viewnum); + if (name == NULL) + break; + + /* create a string for the item, replacing underscores with spaces */ + tempstring.cpy(name).replace(0, "_", " "); + item_append(tempstring, NULL, 0, (void *)(FPTR)(VIDEO_ITEM_VIEW + viewnum)); + } + + /* add a separator */ + item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + + /* add a rotate item */ + switch (target->orientation()) + { + case ROT0: subtext = "None"; break; + case ROT90: subtext = "CW 90" UTF8_DEGREES; break; + case ROT180: subtext = "180" UTF8_DEGREES; break; + case ROT270: subtext = "CCW 90" UTF8_DEGREES; break; + } + item_append("Rotate", subtext, MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_ROTATE); + + /* backdrop item */ + enabled = target->backdrops_enabled(); + item_append("Backdrops", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_BACKDROPS); + + /* overlay item */ + enabled = target->overlays_enabled(); + item_append("Overlays", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_OVERLAYS); + + /* bezel item */ + enabled = target->bezels_enabled(); + item_append("Bezels", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_BEZELS); + + /* cpanel item */ + enabled = target->cpanels_enabled(); + item_append("CPanels", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_CPANELS); + + /* marquee item */ + enabled = target->marquees_enabled(); + item_append("Marquees", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_MARQUEES); + + /* cropping */ + enabled = target->zoom_to_screen(); + item_append("View", enabled ? "Cropped" : "Full", enabled ? MENU_FLAG_RIGHT_ARROW : MENU_FLAG_LEFT_ARROW, (void *)VIDEO_ITEM_ZOOM); +} + +ui_menu_video_options::~ui_menu_video_options() +{ +} + +/*------------------------------------------------- + menu_crosshair - handle the crosshair settings + menu +-------------------------------------------------*/ + +void ui_menu_crosshair::handle() +{ + /* process the menu */ + const ui_menu_event *menu_event = process(UI_MENU_PROCESS_LR_REPEAT); + + /* handle events */ + if (menu_event != NULL && menu_event->itemref != NULL) + { + crosshair_user_settings settings; + crosshair_item_data *data = (crosshair_item_data *)menu_event->itemref; + int changed = false; + //int set_def = false; + int newval = data->cur; + + /* retreive the user settings */ + crosshair_get_user_settings(machine(), data->player, &settings); + + switch (menu_event->iptkey) + { + /* if selected, reset to default value */ + case IPT_UI_SELECT: + newval = data->defvalue; + //set_def = true; + break; + + /* left decrements */ + case IPT_UI_LEFT: + newval -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; + break; + + /* right increments */ + case IPT_UI_RIGHT: + newval += machine().input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; + break; + } + + /* clamp to range */ + if (newval < data->min) + newval = data->min; + if (newval > data->max) + newval = data->max; + + /* if things changed, update */ + if (newval != data->cur) + { + switch (data->type) + { + /* visibility state */ + case CROSSHAIR_ITEM_VIS: + settings.mode = newval; + changed = true; + break; + + /* auto time */ + case CROSSHAIR_ITEM_AUTO_TIME: + settings.auto_time = newval; + changed = true; + break; + } + } + + /* crosshair graphic name */ + if (data->type == CROSSHAIR_ITEM_PIC) + { + if (menu_event->iptkey == IPT_UI_SELECT) + { + /* clear the name string to reset to default crosshair */ + settings.name[0] = 0; + changed = true; + } + else if (menu_event->iptkey == IPT_UI_LEFT) + { + strcpy(settings.name, data->last_name); + changed = true; + } + else if (menu_event->iptkey == IPT_UI_RIGHT) + { + strcpy(settings.name, data->next_name); + changed = true; + } + } + + if (changed) + { + /* save the user settings */ + crosshair_set_user_settings(machine(), data->player, &settings); + + /* rebuild the menu */ + reset(UI_MENU_RESET_REMEMBER_POSITION); + } + } +} + + +/*------------------------------------------------- + menu_crosshair_populate - populate the + crosshair settings menu +-------------------------------------------------*/ + +ui_menu_crosshair::ui_menu_crosshair(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +void ui_menu_crosshair::populate() +{ + crosshair_user_settings settings; + crosshair_item_data *data; + char temp_text[16]; + int player; + UINT8 use_auto = false; + UINT32 flags = 0; + + /* loop over player and add the manual items */ + for (player = 0; player < MAX_PLAYERS; player++) + { + /* get the user settings */ + crosshair_get_user_settings(machine(), player, &settings); + + /* add menu items for usable crosshairs */ + if (settings.used) + { + /* Make sure to keep these matched to the CROSSHAIR_VISIBILITY_xxx types */ + static const char *const vis_text[] = { "Off", "On", "Auto" }; + + /* track if we need the auto time menu */ + if (settings.mode == CROSSHAIR_VISIBILITY_AUTO) use_auto = true; + + /* CROSSHAIR_ITEM_VIS - allocate a data item and fill it */ + data = (crosshair_item_data *)m_pool_alloc(sizeof(*data)); + data->type = CROSSHAIR_ITEM_VIS; + data->player = player; + data->min = CROSSHAIR_VISIBILITY_OFF; + data->max = CROSSHAIR_VISIBILITY_AUTO; + data->defvalue = CROSSHAIR_VISIBILITY_DEFAULT; + data->cur = settings.mode; + + /* put on arrows */ + if (data->cur > data->min) + flags |= MENU_FLAG_LEFT_ARROW; + if (data->cur < data->max) + flags |= MENU_FLAG_RIGHT_ARROW; + + /* add CROSSHAIR_ITEM_VIS menu */ + sprintf(temp_text, "P%d Visibility", player + 1); + item_append(temp_text, vis_text[settings.mode], flags, data); + + /* CROSSHAIR_ITEM_PIC - allocate a data item and fill it */ + data = (crosshair_item_data *)m_pool_alloc(sizeof(*data)); + data->type = CROSSHAIR_ITEM_PIC; + data->player = player; + data->last_name[0] = 0; + /* other data item not used by this menu */ + + /* search for crosshair graphics */ + + /* open a path to the crosshairs */ + file_enumerator path(machine().options().crosshair_path()); + const osd_directory_entry *dir; + /* reset search flags */ + int using_default = false; + int finished = false; + int found = false; + + /* if we are using the default, then we just need to find the first in the list */ + if (strlen(settings.name) == 0) + using_default = true; + + /* look for the current name, then remember the name before */ + /* and find the next name */ + while (((dir = path.next()) != NULL) && !finished) + { + int length = strlen(dir->name); + + /* look for files ending in .png with a name not larger then 9 chars*/ + if ((length > 4) && (length <= CROSSHAIR_PIC_NAME_LENGTH + 4) && + dir->name[length - 4] == '.' && + tolower((UINT8)dir->name[length - 3]) == 'p' && + tolower((UINT8)dir->name[length - 2]) == 'n' && + tolower((UINT8)dir->name[length - 1]) == 'g') + + { + /* remove .png from length */ + length -= 4; + + if (found || using_default) + { + /* get the next name */ + strncpy(data->next_name, dir->name, length); + data->next_name[length] = 0; + finished = true; + } + else if (!strncmp(dir->name, settings.name, length)) + { + /* we found the current name */ + /* so loop once more to find the next name */ + found = true; + } + else + /* remember last name */ + /* we will do it here in case files get added to the directory */ + { + strncpy(data->last_name, dir->name, length); + data->last_name[length] = 0; + } + } + } + /* if name not found then next item is DEFAULT */ + if (!found && !using_default) + { + data->next_name[0] = 0; + finished = true; + } + /* setup the selection flags */ + flags = 0; + if (finished) + flags |= MENU_FLAG_RIGHT_ARROW; + if (found) + flags |= MENU_FLAG_LEFT_ARROW; + + /* add CROSSHAIR_ITEM_PIC menu */ + sprintf(temp_text, "P%d Crosshair", player + 1); + item_append(temp_text, using_default ? "DEFAULT" : settings.name, flags, data); + } + } + if (use_auto) + { + /* any player can be used to get the autotime */ + crosshair_get_user_settings(machine(), 0, &settings); + + /* CROSSHAIR_ITEM_AUTO_TIME - allocate a data item and fill it */ + data = (crosshair_item_data *)m_pool_alloc(sizeof(*data)); + data->type = CROSSHAIR_ITEM_AUTO_TIME; + data->min = CROSSHAIR_VISIBILITY_AUTOTIME_MIN; + data->max = CROSSHAIR_VISIBILITY_AUTOTIME_MAX; + data->defvalue = CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT; + data->cur = settings.auto_time; + + /* put on arrows in visible menu */ + if (data->cur > data->min) + flags |= MENU_FLAG_LEFT_ARROW; + if (data->cur < data->max) + flags |= MENU_FLAG_RIGHT_ARROW; + + /* add CROSSHAIR_ITEM_AUTO_TIME menu */ + sprintf(temp_text, "%d", settings.auto_time); + item_append("Visible Delay", temp_text, flags, data); + } +// else +// /* leave a blank filler line when not in auto time so size does not rescale */ +// item_append("", "", NULL, NULL); +} + +ui_menu_crosshair::~ui_menu_crosshair() +{ +} + +/*------------------------------------------------- + menu_quit_game - handle the "menu" for + quitting the game +-------------------------------------------------*/ + +ui_menu_quit_game::ui_menu_quit_game(running_machine &machine, render_container *container) : ui_menu(machine, container) +{ +} + +ui_menu_quit_game::~ui_menu_quit_game() +{ +} + +void ui_menu_quit_game::populate() +{ +} + +void ui_menu_quit_game::handle() +{ + /* request a reset */ + machine().schedule_exit(); + + /* reset the menu stack */ + ui_menu::stack_reset(machine()); +} + + +/*------------------------------------------------- + menu_select_game - handle the game select + menu +-------------------------------------------------*/ + +void ui_menu_select_game::handle() +{ + /* ignore pause keys by swallowing them before we process the menu */ + ui_input_pressed(machine(), IPT_UI_PAUSE); + + /* process the menu */ + const ui_menu_event *menu_event = process(0); + if (menu_event != NULL && menu_event->itemref != NULL) + { + /* reset the error on any future menu_event */ + if (error) + error = false; + + /* handle selections */ + else if (menu_event->iptkey == IPT_UI_SELECT) + { + const game_driver *driver = (const game_driver *)menu_event->itemref; + + /* special case for configure inputs */ + if ((FPTR)driver == 1) + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_input_groups(machine(), container))); + + /* anything else is a driver */ + else + { + // 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 + else + { + reset(UI_MENU_RESET_REMEMBER_REF); + error = true; + } + } + } + + /* escape pressed with non-empty text clears the text */ + else if (menu_event->iptkey == IPT_UI_CANCEL && search[0] != 0) + { + /* since we have already been popped, we must recreate ourself from scratch */ + ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_select_game(machine(), container, NULL))); + } + + /* typed characters append to the buffer */ + else if (menu_event->iptkey == IPT_SPECIAL) + { + int buflen = strlen(search); + + /* if it's a backspace and we can handle it, do so */ + if ((menu_event->unichar == 8 || menu_event->unichar == 0x7f) && buflen > 0) + { + *(char *)utf8_previous_char(&search[buflen]) = 0; + rerandomize = true; + reset(UI_MENU_RESET_SELECT_FIRST); + } + + /* if it's any other key and we're not maxed out, update */ + else if (menu_event->unichar >= ' ' && menu_event->unichar < 0x7f) + { + buflen += utf8_from_uchar(&search[buflen], ARRAY_LENGTH(search) - buflen, menu_event->unichar); + search[buflen] = 0; + reset(UI_MENU_RESET_SELECT_FIRST); + } + } + } + + /* if we're in an error state, overlay an error message */ + if (error) + ui_draw_text_box(container, + "The selected game is missing one or more required ROM or CHD images. " + "Please select a different game.\n\nPress any key to continue.", + JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR); +} + + +/*------------------------------------------------- + menu_select_game_populate - populate the game + select menu +-------------------------------------------------*/ +ui_menu_select_game::ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename) : ui_menu(machine, container) +{ + driverlist = global_alloc_array(const game_driver *, driver_list::total()+1); + build_driver_list(); + if(gamename) + strcpy(search, gamename); + matchlist[0] = -1; +} + +void ui_menu_select_game::populate() +{ + int matchcount; + int curitem; + + for (curitem = matchcount = 0; driverlist[curitem] != NULL && matchcount < VISIBLE_GAMES_IN_LIST; curitem++) + if (!(driverlist[curitem]->flags & GAME_NO_STANDALONE)) + matchcount++; + + /* if nothing there, add a single multiline item and return */ + if (matchcount == 0) + { + astring txt; + txt.printf("No %s found. Please check the rompath specified in the %s.ini file.\n\n" + "If this is your first time using %s, please see the config.txt file in " + "the docs directory for information on configuring %s.", + emulator_info::get_gamesnoun(), + emulator_info::get_configname(), + emulator_info::get_appname(),emulator_info::get_appname() ); + item_append(txt.cstr(), NULL, MENU_FLAG_MULTILINE | MENU_FLAG_REDTEXT, NULL); + return; + } + + /* otherwise, rebuild the match list */ + assert(drivlist != NULL); + if (search[0] != 0 || matchlist[0] == -1 || rerandomize) + drivlist->find_approximate_matches(search, matchcount, matchlist); + rerandomize = false; + + /* iterate over entries */ + for (curitem = 0; curitem < matchcount; curitem++) + { + int curmatch = matchlist[curitem]; + if (curmatch != -1) + { + int cloneof = drivlist->non_bios_clone(curmatch); + item_append(drivlist->driver(curmatch).name, drivlist->driver(curmatch).description, (cloneof == -1) ? 0 : MENU_FLAG_INVERT, (void *)&drivlist->driver(curmatch)); + } + } + + /* if we're forced into this, allow general input configuration as well */ + if (ui_menu::stack_has_special_main_menu()) + { + item_append(MENU_SEPARATOR_ITEM, NULL, 0, NULL); + item_append("Configure General Inputs", NULL, 0, (void *)1); + } + + /* configure the custom rendering */ + customtop = ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER; + custombottom = 4.0f * ui_get_line_height(machine()) + 3.0f * UI_BOX_TB_BORDER; +} + +ui_menu_select_game::~ui_menu_select_game() +{ + global_free(drivlist); + global_free(driverlist); +} + +/*------------------------------------------------- + menu_select_game_build_driver_list - build a + list of available drivers +-------------------------------------------------*/ + +void ui_menu_select_game::build_driver_list() +{ + // start with an empty list + drivlist = global_alloc(driver_enumerator(machine().options())); + drivlist->exclude_all(); + + /* open a path to the ROMs and find them in the array */ + file_enumerator path(machine().options().media_path()); + const osd_directory_entry *dir; + + /* iterate while we get new objects */ + while ((dir = path.next()) != NULL) + { + char drivername[50]; + char *dst = drivername; + const char *src; + + /* build a name for it */ + for (src = dir->name; *src != 0 && *src != '.' && dst < &drivername[ARRAY_LENGTH(drivername) - 1]; src++) + *dst++ = tolower((UINT8)*src); + *dst = 0; + + int drivnum = drivlist->find(drivername); + if (drivnum != -1) + drivlist->include(drivnum); + } + + /* now build the final list */ + drivlist->reset(); + int listnum = 0; + while (drivlist->next()) + driverlist[listnum++] = &drivlist->driver(); + + /* NULL-terminate */ + driverlist[listnum] = NULL; +} + + +/*------------------------------------------------- + menu_select_game_custom_render - perform our + special rendering +-------------------------------------------------*/ + +void ui_menu_select_game::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +{ + const game_driver *driver; + float width, maxwidth; + float x1, y1, x2, y2; + char tempbuf[4][256]; + rgb_t color; + int line; + + /* display the current typeahead */ + if (search[0] != 0) + sprintf(&tempbuf[0][0], "Type name or select: %s_", search); + else + sprintf(&tempbuf[0][0], "Type name or select: (random)"); + + /* get the size of the text */ + ui_draw_text_full(container, &tempbuf[0][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, + DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); + width += 2 * UI_BOX_LR_BORDER; + maxwidth = MAX(width, origx2 - origx1); + + /* compute our bounds */ + x1 = 0.5f - 0.5f * maxwidth; + x2 = x1 + maxwidth; + y1 = origy1 - top; + y2 = origy1 - UI_BOX_TB_BORDER; + + /* draw a box */ + ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); + + /* take off the borders */ + x1 += UI_BOX_LR_BORDER; + x2 -= UI_BOX_LR_BORDER; + y1 += UI_BOX_TB_BORDER; + y2 -= UI_BOX_TB_BORDER; + + /* draw the text within it */ + ui_draw_text_full(container, &tempbuf[0][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, + DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); + + /* determine the text to render below */ + driver = ((FPTR)selectedref > 1) ? (const game_driver *)selectedref : NULL; + if ((FPTR)driver > 1) + { + const char *gfxstat, *soundstat; + + /* first line is game name */ + sprintf(&tempbuf[0][0], "%-.100s", driver->description); + + /* next line is year, manufacturer */ + sprintf(&tempbuf[1][0], "%s, %-.100s", driver->year, driver->manufacturer); + + /* next line is overall driver status */ + if (driver->flags & GAME_NOT_WORKING) + strcpy(&tempbuf[2][0], "Overall: NOT WORKING"); + else if (driver->flags & GAME_UNEMULATED_PROTECTION) + strcpy(&tempbuf[2][0], "Overall: Unemulated Protection"); + else + strcpy(&tempbuf[2][0], "Overall: Working"); + + /* next line is graphics, sound status */ + if (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS)) + gfxstat = "Imperfect"; + else + gfxstat = "OK"; + + if (driver->flags & GAME_NO_SOUND) + soundstat = "Unimplemented"; + else if (driver->flags & GAME_IMPERFECT_SOUND) + soundstat = "Imperfect"; + else + soundstat = "OK"; + + sprintf(&tempbuf[3][0], "Gfx: %s, Sound: %s", gfxstat, soundstat); + } + else + { + const char *s = emulator_info::get_copyright(); + line = 0; + int col = 0; + + /* first line is version string */ + sprintf(&tempbuf[line++][0], "%s %s", emulator_info::get_applongname(), build_version); + + /* output message */ + while (line < ARRAY_LENGTH(tempbuf)) + { + if (*s == 0 || *s == '\n') + { + tempbuf[line++][col] = 0; + col = 0; + } + else + tempbuf[line][col++] = *s; + + if (*s != 0) + s++; + } + } + + /* get the size of the text */ + maxwidth = origx2 - origx1; + for (line = 0; line < 4; line++) + { + ui_draw_text_full(container, &tempbuf[line][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, + DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); + width += 2 * UI_BOX_LR_BORDER; + maxwidth = MAX(maxwidth, width); + } + + /* compute our bounds */ + x1 = 0.5f - 0.5f * maxwidth; + x2 = x1 + maxwidth; + y1 = origy2 + UI_BOX_TB_BORDER; + y2 = origy2 + bottom; + + /* draw a box */ + color = UI_BACKGROUND_COLOR; + if (driver != NULL) + color = UI_GREEN_COLOR; + if (driver != NULL && (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS | GAME_NO_SOUND | GAME_IMPERFECT_SOUND)) != 0) + color = UI_YELLOW_COLOR; + if (driver != NULL && (driver->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION)) != 0) + color = UI_RED_COLOR; + ui_draw_outlined_box(container, x1, y1, x2, y2, color); + + /* take off the borders */ + x1 += UI_BOX_LR_BORDER; + x2 -= UI_BOX_LR_BORDER; + y1 += UI_BOX_TB_BORDER; + y2 -= UI_BOX_TB_BORDER; + + /* draw all lines */ + for (line = 0; line < 4; line++) + { + ui_draw_text_full(container, &tempbuf[line][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, + DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); + y1 += ui_get_line_height(machine()); + } +} + + + diff -Nru mame-0.144/src/emu/uimain.h mame-0.145/src/emu/uimain.h --- mame-0.144/src/emu/uimain.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/uimain.h 2012-02-06 21:30:28.000000000 +0000 @@ -0,0 +1,369 @@ +/*************************************************************************** + + uimain.h + + Internal MAME menus for the user interface. + + Copyright Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +***************************************************************************/ + +#pragma once + +#ifndef __UIMAIN_H__ +#define __UIMAIN_H__ + +#include "crsshair.h" + +class ui_menu_main : public ui_menu { +public: + ui_menu_main(running_machine &machine, render_container *container); + virtual ~ui_menu_main(); + virtual void populate(); + virtual void handle(); + +private: + enum { + INPUT_GROUPS, + INPUT_SPECIFIC, + SETTINGS_DIP_SWITCHES, + SETTINGS_DRIVER_CONFIG, + ANALOG, + BOOKKEEPING, + GAME_INFO, + IMAGE_MENU_IMAGE_INFO, + IMAGE_MENU_FILE_MANAGER, + MESS_MENU_TAPE_CONTROL, + MESS_MENU_BITBANGER_CONTROL, + SLOT_DEVICES, + NETWORK_DEVICES, + KEYBOARD_MODE, + SLIDERS, + VIDEO_TARGETS, + VIDEO_OPTIONS, + CROSSHAIR, + CHEAT, + MEMORY_CARD, + SELECT_GAME, + }; +}; + +class ui_menu_keyboard_mode : public ui_menu { +public: + ui_menu_keyboard_mode(running_machine &machine, render_container *container); + virtual ~ui_menu_keyboard_mode(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_slot_devices : public ui_menu { +public: + ui_menu_slot_devices(running_machine &machine, render_container *container); + virtual ~ui_menu_slot_devices(); + virtual void populate(); + virtual void handle(); + +private: + int slot_get_current_index(device_slot_interface *slot); + int slot_get_length(device_slot_interface *slot); + const char *slot_get_next(device_slot_interface *slot); + const char *slot_get_prev(device_slot_interface *slot); + const char *get_slot_device(device_slot_interface *slot); + void set_slot_device(device_slot_interface *slot, const char *val); +}; + +class ui_menu_network_devices : public ui_menu { +public: + ui_menu_network_devices(running_machine &machine, render_container *container); + virtual ~ui_menu_network_devices(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_input_groups : public ui_menu { +public: + ui_menu_input_groups(running_machine &machine, render_container *container); + virtual ~ui_menu_input_groups(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_input : public ui_menu { +public: + ui_menu_input(running_machine &machine, render_container *container); + virtual ~ui_menu_input(); + virtual void handle(); + +protected: + enum { + INPUT_TYPE_DIGITAL = 0, + INPUT_TYPE_ANALOG = 1, + INPUT_TYPE_ANALOG_DEC = INPUT_TYPE_ANALOG + SEQ_TYPE_DECREMENT, + INPUT_TYPE_ANALOG_INC = INPUT_TYPE_ANALOG + SEQ_TYPE_INCREMENT, + INPUT_TYPE_TOTAL = INPUT_TYPE_ANALOG + SEQ_TYPE_TOTAL + }; + + /* internal input menu item data */ + struct input_item_data { + input_item_data * next; /* pointer to next item in the list */ + const void * ref; /* reference to type description for global inputs or field for game inputs */ + input_seq_type seqtype; /* sequence type */ + input_seq seq; /* copy of the live sequence */ + const input_seq * defseq; /* pointer to the default sequence */ + const char * name; /* pointer to the base name of the item */ + UINT16 sortorder; /* sorting information */ + UINT8 type; /* type of port */ + }; + + void populate_and_sort(struct input_item_data *itemlist); + virtual void update_input(struct input_item_data *seqchangeditem) = 0; + void toggle_none_default(input_seq &selected_seq, input_seq &original_seq, const input_seq &selected_defseq); + const input_seq &get_field_default_seq(input_field_config *field, input_seq_type seqtype); + +protected: + const void * pollingref; + input_seq_type pollingseq; + input_item_data * pollingitem; + +private: + UINT16 last_sortorder; + bool record_next; + input_seq starting_seq; + + static int compare_items(const void *i1, const void *i2); +}; + +class ui_menu_input_general : public ui_menu_input { +public: + ui_menu_input_general(running_machine &machine, render_container *container, int group); + virtual ~ui_menu_input_general(); + virtual void populate(); + +protected: + int group; + virtual void update_input(struct input_item_data *seqchangeditem); +}; + +class ui_menu_input_specific : public ui_menu_input { +public: + ui_menu_input_specific(running_machine &machine, render_container *container); + virtual ~ui_menu_input_specific(); + virtual void populate(); + +protected: + virtual void update_input(struct input_item_data *seqchangeditem); +}; + +class ui_menu_settings : public ui_menu { +public: + ui_menu_settings(running_machine &machine, render_container *container, UINT32 type); + virtual ~ui_menu_settings(); + virtual void populate(); + virtual void handle(); + +protected: + /* DIP switch descriptor */ + struct dip_descriptor { + dip_descriptor * next; + const char * name; + UINT32 mask; + UINT32 state; + }; + + dip_descriptor * diplist; + int dipcount; + int type; +}; + +class ui_menu_settings_dip_switches : public ui_menu_settings { +public: + ui_menu_settings_dip_switches(running_machine &machine, render_container *container); + virtual ~ui_menu_settings_dip_switches(); + + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); +private: + void custom_render_one(float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask); +}; + +class ui_menu_settings_driver_config : public ui_menu_settings { +public: + ui_menu_settings_driver_config(running_machine &machine, render_container *container); + virtual ~ui_menu_settings_driver_config(); +}; + +class ui_menu_analog : public ui_menu { +public: + ui_menu_analog(running_machine &machine, render_container *container); + virtual ~ui_menu_analog(); + virtual void populate(); + virtual void handle(); + +private: + enum { + ANALOG_ITEM_KEYSPEED = 0, + ANALOG_ITEM_CENTERSPEED, + ANALOG_ITEM_REVERSE, + ANALOG_ITEM_SENSITIVITY, + ANALOG_ITEM_COUNT + }; + + /* internal analog menu item data */ + struct analog_item_data { + input_field_config *field; + int type; + int min, max; + int cur; + int defvalue; + }; +}; + +class ui_menu_bookkeeping : public ui_menu { +public: + ui_menu_bookkeeping(running_machine &machine, render_container *container); + virtual ~ui_menu_bookkeeping(); + virtual void populate(); + virtual void handle(); + +private: + attotime prevtime; +}; + +class ui_menu_game_info : public ui_menu { +public: + ui_menu_game_info(running_machine &machine, render_container *container); + virtual ~ui_menu_game_info(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_cheat : public ui_menu { +public: + ui_menu_cheat(running_machine &machine, render_container *container); + virtual ~ui_menu_cheat(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_memory_card : public ui_menu { +public: + ui_menu_memory_card(running_machine &machine, render_container *container); + virtual ~ui_menu_memory_card(); + virtual void populate(); + virtual void handle(); + +private: + enum { + MEMCARD_ITEM_SELECT = 1, + MEMCARD_ITEM_LOAD, + MEMCARD_ITEM_EJECT, + MEMCARD_ITEM_CREATE + }; + + int cardnum; +}; + +class ui_menu_sliders : public ui_menu { +public: + ui_menu_sliders(running_machine &machine, render_container *container, bool menuless_mode); + virtual ~ui_menu_sliders(); + virtual void populate(); + virtual void handle(); + + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); + + static UINT32 ui_handler(running_machine &machine, render_container *container, UINT32 state); + +private: + bool menuless_mode, hidden; +}; + +class ui_menu_video_targets : public ui_menu { +public: + ui_menu_video_targets(running_machine &machine, render_container *container); + virtual ~ui_menu_video_targets(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_video_options : public ui_menu { +public: + ui_menu_video_options(running_machine &machine, render_container *container, render_target *target); + virtual ~ui_menu_video_options(); + virtual void populate(); + virtual void handle(); + +private: + enum { + VIDEO_ITEM_ROTATE = 0x80000000, + VIDEO_ITEM_BACKDROPS, + VIDEO_ITEM_OVERLAYS, + VIDEO_ITEM_BEZELS, + VIDEO_ITEM_CPANELS, + VIDEO_ITEM_MARQUEES, + VIDEO_ITEM_ZOOM, + VIDEO_ITEM_VIEW + }; + + render_target *target; +}; + +class ui_menu_crosshair : public ui_menu { +public: + ui_menu_crosshair(running_machine &machine, render_container *container); + virtual ~ui_menu_crosshair(); + virtual void populate(); + virtual void handle(); + +private: + enum { + CROSSHAIR_ITEM_VIS = 0, + CROSSHAIR_ITEM_PIC, + CROSSHAIR_ITEM_AUTO_TIME + }; + + /* internal crosshair menu item data */ + struct crosshair_item_data { + UINT8 type; + UINT8 player; + UINT8 min, max; + UINT8 cur; + UINT8 defvalue; + char last_name[CROSSHAIR_PIC_NAME_LENGTH + 1]; + char next_name[CROSSHAIR_PIC_NAME_LENGTH + 1]; + }; +}; + +class ui_menu_quit_game : public ui_menu { +public: + ui_menu_quit_game(running_machine &machine, render_container *container); + virtual ~ui_menu_quit_game(); + virtual void populate(); + virtual void handle(); +}; + +class ui_menu_select_game : public ui_menu { +public: + ui_menu_select_game(running_machine &machine, render_container *container, const char *gamename); + virtual ~ui_menu_select_game(); + virtual void populate(); + virtual void handle(); + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); + +private: + enum { VISIBLE_GAMES_IN_LIST = 15 }; + UINT8 error; + UINT8 rerandomize; + char search[40]; + int matchlist[VISIBLE_GAMES_IN_LIST]; + const game_driver **driverlist; + + driver_enumerator *drivlist; + + void build_driver_list(); +}; + +/* force game select menu */ +void ui_menu_force_game_select(running_machine &machine, render_container *container); + +#endif /* __UIMAIN_H__ */ diff -Nru mame-0.144/src/emu/uimenu.c mame-0.145/src/emu/uimenu.c --- mame-0.144/src/emu/uimenu.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/uimenu.c 2012-02-06 21:30:28.000000000 +0000 @@ -13,15 +13,10 @@ #include "emuopts.h" #include "ui.h" #include "rendutil.h" -#include "cheat.h" -#include "uiimage.h" #include "uiinput.h" -#include "uimenu.h" -#include "audit.h" -#include "crsshair.h" +#include "cheat.h" +#include "uimain.h" #include -#include "imagedev/cassette.h" -#include "imagedev/bitbngr.h" @@ -32,336 +27,28 @@ #define UI_MENU_POOL_SIZE 65536 #define UI_MENU_ALLOC_ITEMS 256 -#define VISIBLE_GAMES_IN_LIST 15 - -#define MAX_PHYSICAL_DIPS 10 -#define MAX_INPUT_PORTS 32 -#define MAX_BITS_PER_PORT 32 - -/* DIP switch rendering parameters */ -#define DIP_SWITCH_HEIGHT 0.05f -#define DIP_SWITCH_SPACING 0.01 -#define SINGLE_TOGGLE_SWITCH_FIELD_WIDTH 0.025f -#define SINGLE_TOGGLE_SWITCH_WIDTH 0.020f -/* make the switch 80% of the width space and 1/2 of the switch height */ -#define PERCENTAGE_OF_HALF_FIELD_USED 0.80f -#define SINGLE_TOGGLE_SWITCH_HEIGHT ((DIP_SWITCH_HEIGHT / 2) * PERCENTAGE_OF_HALF_FIELD_USED) - - -enum -{ - INPUT_TYPE_DIGITAL = 0, - INPUT_TYPE_ANALOG = 1, - INPUT_TYPE_ANALOG_DEC = INPUT_TYPE_ANALOG + SEQ_TYPE_DECREMENT, - INPUT_TYPE_ANALOG_INC = INPUT_TYPE_ANALOG + SEQ_TYPE_INCREMENT, - INPUT_TYPE_TOTAL = INPUT_TYPE_ANALOG + SEQ_TYPE_TOTAL -}; - -enum -{ - ANALOG_ITEM_KEYSPEED = 0, - ANALOG_ITEM_CENTERSPEED, - ANALOG_ITEM_REVERSE, - ANALOG_ITEM_SENSITIVITY, - ANALOG_ITEM_COUNT -}; - -enum -{ - MEMCARD_ITEM_SELECT = 1, - MEMCARD_ITEM_LOAD, - MEMCARD_ITEM_EJECT, - MEMCARD_ITEM_CREATE -}; - -enum -{ - VIDEO_ITEM_ROTATE = 0x80000000, - VIDEO_ITEM_BACKDROPS, - VIDEO_ITEM_OVERLAYS, - VIDEO_ITEM_BEZELS, - VIDEO_ITEM_CPANELS, - VIDEO_ITEM_MARQUEES, - VIDEO_ITEM_ZOOM, - VIDEO_ITEM_VIEW -}; - - -enum -{ - CROSSHAIR_ITEM_VIS = 0, - CROSSHAIR_ITEM_PIC, - CROSSHAIR_ITEM_AUTO_TIME -}; - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef struct _ui_menu_pool ui_menu_pool; -struct _ui_menu_pool -{ - ui_menu_pool * next; /* chain to next one */ - UINT8 * top; /* top of the pool */ - UINT8 * end; /* end of the pool */ -}; - - -typedef struct _ui_menu_item ui_menu_item; -struct _ui_menu_item -{ - const char * text; - const char * subtext; - UINT32 flags; - void * ref; -}; - - -class ui_menu -{ -public: - ui_menu(running_machine &machine) - : m_machine(machine) { } - - running_machine &machine() const { return m_machine; } - - render_container * container; /* render_container we render to */ - ui_menu_handler_func handler; /* handler callback */ - void * parameter; /* parameter */ - ui_menu_event menu_event; /* the UI menu_event that occurred */ - ui_menu * parent; /* pointer to parent menu */ - void * state; /* menu-specific state */ - ui_menu_destroy_state_func destroy_state; /* destroy state callback */ - int resetpos; /* reset position */ - void * resetref; /* reset reference */ - int selected; /* which item is selected */ - int hover; /* which item is being hovered over */ - int visitems; /* number of visible items */ - int numitems; /* number of items in the menu */ - int allocitems; /* allocated size of array */ - ui_menu_item * item; /* pointer to array of items */ - ui_menu_custom_func custom; /* callback for custom rendering */ - float customtop; /* amount of extra height to add at the top */ - float custombottom; /* amount of extra height to add at the bottom */ - ui_menu_pool * pool; /* list of memory pools */ - -private: - running_machine & m_machine; /* machine we are attached to */ -}; - - -/* internal input menu item data */ -typedef struct _input_item_data input_item_data; -struct _input_item_data -{ - input_item_data * next; /* pointer to next item in the list */ - const void * ref; /* reference to type description for global inputs or field for game inputs */ - input_seq_type seqtype; /* sequence type */ - input_seq seq; /* copy of the live sequence */ - const input_seq * defseq; /* pointer to the default sequence */ - const char * name; /* pointer to the base name of the item */ - UINT16 sortorder; /* sorting information */ - UINT8 type; /* type of port */ -}; - - -/* internal analog menu item data */ -typedef struct _analog_item_data analog_item_data; -struct _analog_item_data -{ - input_field_config *field; - int type; - int min, max; - int cur; - int defvalue; -}; - - -/* DIP switch descriptor */ -typedef struct _dip_descriptor dip_descriptor; -struct _dip_descriptor -{ - dip_descriptor * next; - const char * name; - UINT32 mask; - UINT32 state; -}; - - -/* extended settings menu state */ -typedef struct _settings_menu_state settings_menu_state; -struct _settings_menu_state -{ - dip_descriptor * diplist; -}; - - -/* extended input menu state */ -typedef struct _input_menu_state input_menu_state; -struct _input_menu_state -{ - UINT16 last_sortorder; - const void * pollingref; - input_item_data * pollingitem; - UINT8 record_next; - input_seq starting_seq; -}; - - -/* extended select game menu state */ -typedef struct _select_game_state select_game_state; -struct _select_game_state -{ - UINT8 error; - UINT8 rerandomize; - char search[40]; - int matchlist[VISIBLE_GAMES_IN_LIST]; - const game_driver * driverlist[1]; -}; - - -/* internal crosshair menu item data */ -typedef struct _crosshair_item_data crosshair_item_data; -struct _crosshair_item_data -{ - UINT8 type; - UINT8 player; - UINT8 min, max; - UINT8 cur; - UINT8 defvalue; - char last_name[CROSSHAIR_PIC_NAME_LENGTH + 1]; - char next_name[CROSSHAIR_PIC_NAME_LENGTH + 1]; -}; - - - /*************************************************************************** GLOBAL VARIABLES ***************************************************************************/ -/* menu states */ -static ui_menu *menu_stack; -static ui_menu *menu_free; - -static bitmap_t *hilight_bitmap; -static render_texture *hilight_texture; - -static render_texture *arrow_texture; - -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; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static void ui_menu_exit(running_machine &machine); - -/* internal menu processing */ -static void ui_menu_draw(running_machine &machine, ui_menu *menu, int customonly); -static void ui_menu_draw_text_box(ui_menu *menu); -static void ui_menu_handle_events(ui_menu *menu); -static void ui_menu_handle_keys(ui_menu *menu, UINT32 flags); -static void ui_menu_validate_selection(ui_menu *menu, int scandir); -static void ui_menu_clear_free_list(running_machine &machine); - -/* menu handlers */ -static void menu_main(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_main_populate(running_machine &machine, ui_menu *menu, void *state); -static void menu_input_groups(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_input_groups_populate(running_machine &machine, ui_menu *menu, void *state); -static void menu_input_general(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_input_general_populate(running_machine &machine, ui_menu *menu, input_menu_state *menustate, int group); -static void menu_input_specific(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_input_specific_populate(running_machine &machine, ui_menu *menu, input_menu_state *menustate); -static void menu_input_common(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static int CLIB_DECL menu_input_compare_items(const void *i1, const void *i2); -static void menu_input_populate_and_sort(running_machine &machine, ui_menu *menu, input_item_data *itemlist, input_menu_state *menustate); -static void menu_settings_dip_switches(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_settings_driver_config(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_settings_common(running_machine &machine, ui_menu *menu, void *state, UINT32 type); -static void menu_settings_populate(running_machine &machine, ui_menu *menu, settings_menu_state *menustate, UINT32 type); -static void menu_analog(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_analog_populate(running_machine &machine, ui_menu *menu); -static void menu_bookkeeping(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_bookkeeping_populate(running_machine &machine, ui_menu *menu, attotime *curtime); -static void menu_game_info(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_cheat(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_cheat_populate(running_machine &machine, ui_menu *menu); -static void menu_memory_card(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_memory_card_populate(running_machine &machine, ui_menu *menu, int cardnum); -static void menu_sliders(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_sliders_populate(running_machine &machine, ui_menu *menu, int menuless_mode); -static void menu_sliders_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2); -static void menu_video_targets(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_video_targets_populate(running_machine &machine, ui_menu *menu); -static void menu_video_options(running_machine &machine, ui_menu *menu, void *parameter, void *state); -static void menu_video_options_populate(running_machine &machine, ui_menu *menu, render_target *target); -static void menu_crosshair(running_machine &machine, ui_menu *menu, void *parameter, void *state); -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 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); - -/* menu helpers */ -static void menu_render_triangle(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param); -static void menu_settings_custom_render_one(render_container *container, float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask); -static void menu_settings_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x, float y, float x2, float y2); - - +ui_menu *ui_menu::menu_stack; +ui_menu *ui_menu::menu_free; +bitmap_rgb32 *ui_menu::hilight_bitmap; +render_texture *ui_menu::hilight_texture; +render_texture *ui_menu::arrow_texture; /*************************************************************************** INLINE FUNCTIONS ***************************************************************************/ /*------------------------------------------------- - get_field_default_seq - return a pointer - to the default sequence for the given field --------------------------------------------------*/ - -INLINE const input_seq &get_field_default_seq(input_field_config *field, input_seq_type seqtype) -{ - if (field->seq[seqtype].is_default()) - return input_type_seq(field->machine(), field->type, field->player, seqtype); - else - return field->seq[seqtype]; -} - - -/*------------------------------------------------- - toggle_none_default - toggle between "NONE" - and the default item --------------------------------------------------*/ - -INLINE void toggle_none_default(input_seq &selected_seq, input_seq &original_seq, const input_seq &selected_defseq) -{ - /* if we used to be "none", toggle to the default value */ - if (original_seq.length() == 0) - selected_seq = selected_defseq; - - /* otherwise, toggle to "none" */ - else - selected_seq.reset(); -} - - -/*------------------------------------------------- - item_is_selectable - return TRUE if the given + is_selectable - return TRUE if the given item is selectable -------------------------------------------------*/ -INLINE int item_is_selectable(const ui_menu_item *item) +inline bool ui_menu_item::is_selectable() const { - return ((item->flags & (MENU_FLAG_MULTILINE | MENU_FLAG_DISABLE)) == 0 && strcmp(item->text, MENU_SEPARATOR_ITEM) != 0); + return ((flags & (MENU_FLAG_MULTILINE | MENU_FLAG_DISABLE)) == 0 && strcmp(text, MENU_SEPARATOR_ITEM) != 0); } @@ -371,14 +58,14 @@ reported a key -------------------------------------------------*/ -INLINE int exclusive_input_pressed(ui_menu *menu, int key, int repeat) +inline bool ui_menu::exclusive_input_pressed(int key, int repeat) { - if (menu->menu_event.iptkey == IPT_INVALID && ui_input_pressed_repeat(menu->machine(), key, repeat)) + if (menu_event.iptkey == IPT_INVALID && ui_input_pressed_repeat(machine(), key, repeat)) { - menu->menu_event.iptkey = key; - return TRUE; + menu_event.iptkey = key; + return true; } - return FALSE; + return false; } @@ -388,55 +75,49 @@ ***************************************************************************/ /*------------------------------------------------- - ui_menu_init - initialize the menu system + init - initialize the menu system -------------------------------------------------*/ -void ui_menu_init(running_machine &machine) +void ui_menu::init(running_machine &machine) { int x; /* initialize the menu stack */ - ui_menu_stack_reset(machine); + ui_menu::stack_reset(machine); /* create a texture for hilighting items */ - hilight_bitmap = auto_bitmap_alloc(machine, 256, 1, BITMAP_FORMAT_ARGB32); + hilight_bitmap = auto_bitmap_rgb32_alloc(machine, 256, 1); for (x = 0; x < 256; x++) { int alpha = 0xff; if (x < 25) alpha = 0xff * x / 25; if (x > 256 - 25) alpha = 0xff * (255 - x) / 25; - *BITMAP_ADDR32(hilight_bitmap, 0, x) = MAKE_ARGB(alpha,0xff,0xff,0xff); + hilight_bitmap->pix32(0, x) = MAKE_ARGB(alpha,0xff,0xff,0xff); } hilight_texture = machine.render().texture_alloc(); - hilight_texture->set_bitmap(hilight_bitmap, NULL, TEXFORMAT_ARGB32); + hilight_texture->set_bitmap(*hilight_bitmap, hilight_bitmap->cliprect(), TEXFORMAT_ARGB32); /* create a texture for arrow icons */ - arrow_texture = machine.render().texture_alloc(menu_render_triangle); + arrow_texture = machine.render().texture_alloc(render_triangle); /* add an exit callback to free memory */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_menu_exit), &machine)); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_menu::exit), &machine)); } /*------------------------------------------------- - ui_menu_exit - clean up after ourselves + exit - clean up after ourselves -------------------------------------------------*/ -static void ui_menu_exit(running_machine &machine) +void ui_menu::exit(running_machine &machine) { /* free menus */ - ui_menu_stack_reset(machine); - ui_menu_clear_free_list(machine); + ui_menu::stack_reset(machine); + ui_menu::clear_free_list(machine); /* free textures */ machine.render().texture_free(hilight_texture); machine.render().texture_free(arrow_texture); - - if (drivlist) - { - global_free(drivlist); - drivlist = NULL; - } } @@ -446,297 +127,263 @@ ***************************************************************************/ /*------------------------------------------------- - ui_menu_alloc - allocate a new menu + ui_menu - menu constructor -------------------------------------------------*/ - -ui_menu *ui_menu_alloc(running_machine &machine, render_container *container, ui_menu_handler_func handler, void *parameter) +ui_menu::ui_menu(running_machine &machine, render_container *_container) : m_machine(machine) { - ui_menu *menu; - - /* allocate and clear memory for the menu and the state */ - menu = auto_alloc_clear(machine, ui_menu(machine)); + special_main_menu = false; + container = _container; - /* initialize the state */ - menu->container = container; - menu->handler = handler; - menu->parameter = parameter; - - /* reset the menu (adds a default entry) */ - ui_menu_reset(menu, UI_MENU_RESET_SELECT_FIRST); - return menu; + reset(UI_MENU_RESET_SELECT_FIRST); } /*------------------------------------------------- - ui_menu_free - free a menu + ~ui_menu - menu destructor -------------------------------------------------*/ -void ui_menu_free(ui_menu *menu) +ui_menu::~ui_menu() { /* free the pools */ - while (menu->pool != NULL) + while (pool) { - ui_menu_pool *pool = menu->pool; - menu->pool = pool->next; - auto_free(menu->machine(), pool); + ui_menu_pool *ppool = pool; + pool = pool->next; + auto_free(machine(), ppool); } /* free the item array */ - if (menu->item != NULL) - auto_free(menu->machine(), menu->item); - - /* free the state */ - if (menu->state != NULL) - { - if (menu->destroy_state != NULL) - (*menu->destroy_state)(menu, menu->state); - auto_free(menu->machine(), menu->state); - } - - /* free the menu */ - auto_free(menu->machine(), menu); + if (item) + auto_free(machine(), item); } /*------------------------------------------------- - ui_menu_reset - free all items in the menu, + reset - free all items in the menu, and all memory allocated from the memory pool -------------------------------------------------*/ -void ui_menu_reset(ui_menu *menu, ui_menu_reset_options options) +void ui_menu::reset(ui_menu_reset_options options) { - ui_menu_pool *pool; - /* based on the reset option, set the reset info */ - menu->resetpos = 0; - menu->resetref = NULL; + resetpos = 0; + resetref = NULL; if (options == UI_MENU_RESET_REMEMBER_POSITION) - menu->resetpos = menu->selected; + resetpos = selected; else if (options == UI_MENU_RESET_REMEMBER_REF) - menu->resetref = menu->item[menu->selected].ref; + resetref = item[selected].ref; /* reset all the pools and the numitems back to 0 */ - for (pool = menu->pool; pool != NULL; pool = pool->next) - pool->top = (UINT8 *)(pool + 1); - menu->numitems = 0; - menu->visitems = 0; - menu->selected = 0; + for (ui_menu_pool *ppool = pool; ppool != NULL; ppool = ppool->next) + ppool->top = (UINT8 *)(ppool + 1); + numitems = 0; + visitems = 0; + selected = 0; + astring backtext; + backtext.printf("Return to %s",emulator_info::get_capstartgamenoun()); /* add an item to return */ - if (menu->parent == NULL) - ui_menu_item_append(menu, backtext, NULL, 0, NULL); - else if (menu->parent->handler == menu_quit_game) - ui_menu_item_append(menu, exittext, NULL, 0, NULL); + if (parent == NULL) + item_append(backtext.cstr(), NULL, 0, NULL); + else if (parent->is_special_main_menu()) + item_append("Exit", NULL, 0, NULL); else - ui_menu_item_append(menu, priortext, NULL, 0, NULL); + item_append("Return to Prior Menu", NULL, 0, NULL); +} + + +/*------------------------------------------------- + is_special_main_menu - returns whether the + menu has special needs +-------------------------------------------------*/ +bool ui_menu::is_special_main_menu() const +{ + return special_main_menu; +} + + +/*------------------------------------------------- + set_special_main_menu - set whether the + menu has special needs +-------------------------------------------------*/ +void ui_menu::set_special_main_menu(bool special) +{ + special_main_menu = special; } /*------------------------------------------------- - ui_menu_populated - returns TRUE if the menu + populated - returns true if the menu has any non-default items in it -------------------------------------------------*/ -int ui_menu_populated(ui_menu *menu) +bool ui_menu::populated() { - return (menu->numitems > 1); + return numitems > 1; } /*------------------------------------------------- - ui_menu_item_append - append a new item to the + item_append - append a new item to the end of the menu -------------------------------------------------*/ -void ui_menu_item_append(ui_menu *menu, const char *text, const char *subtext, UINT32 flags, void *ref) +void ui_menu::item_append(const char *text, const char *subtext, UINT32 flags, void *ref) { - ui_menu_item *item; + ui_menu_item *pitem; int index; /* only allow multiline as the first item */ if ((flags & MENU_FLAG_MULTILINE) != 0) - assert(menu->numitems == 1); + assert(numitems == 1); /* only allow a single multi-line item */ - else if (menu->numitems >= 2) - assert((menu->item[0].flags & MENU_FLAG_MULTILINE) == 0); + else if (numitems >= 2) + assert((item[0].flags & MENU_FLAG_MULTILINE) == 0); /* realloc the item array if necessary */ - if (menu->numitems >= menu->allocitems) + if (numitems >= allocitems) { - int olditems = menu->allocitems; - menu->allocitems += UI_MENU_ALLOC_ITEMS; - ui_menu_item *newitems = auto_alloc_array(menu->machine(), ui_menu_item, menu->allocitems); + int olditems = allocitems; + allocitems += UI_MENU_ALLOC_ITEMS; + ui_menu_item *newitems = auto_alloc_array(machine(), ui_menu_item, allocitems); for (int itemnum = 0; itemnum < olditems; itemnum++) - newitems[itemnum] = menu->item[itemnum]; - auto_free(menu->machine(), menu->item); - menu->item = newitems; + newitems[itemnum] = item[itemnum]; + auto_free(machine(), item); + item = newitems; } - index = menu->numitems++; + index = numitems++; /* copy the previous last item to the next one */ if (index != 0) { index--; - menu->item[index + 1] = menu->item[index]; + item[index + 1] = item[index]; } - /* allocate a new item and populte it */ - item = &menu->item[index]; - item->text = (text != NULL) ? ui_menu_pool_strdup(menu, text) : NULL; - item->subtext = (subtext != NULL) ? ui_menu_pool_strdup(menu, subtext) : NULL; - item->flags = flags; - item->ref = ref; + /* allocate a new item and populate it */ + pitem = &item[index]; + pitem->text = (text != NULL) ? pool_strdup(text) : NULL; + pitem->subtext = (subtext != NULL) ? pool_strdup(subtext) : NULL; + pitem->flags = flags; + pitem->ref = ref; /* update the selection if we need to */ - if (menu->resetpos == index || (menu->resetref != NULL && menu->resetref == ref)) - menu->selected = index; - if (menu->resetpos == menu->numitems - 1) - menu->selected = menu->numitems - 1; + if (resetpos == index || (resetref != NULL && resetref == ref)) + selected = index; + if (resetpos == numitems - 1) + selected = numitems - 1; } /*------------------------------------------------- - ui_menu_process - process a menu, drawing it + process - process a menu, drawing it and returning any interesting events -------------------------------------------------*/ -const ui_menu_event *ui_menu_process(running_machine &machine, ui_menu *menu, UINT32 flags) +const ui_menu_event *ui_menu::process(UINT32 flags) { /* reset the menu_event */ - menu->menu_event.iptkey = IPT_INVALID; + menu_event.iptkey = IPT_INVALID; /* first make sure our selection is valid */ - ui_menu_validate_selection(menu, 1); + validate_selection(1); /* draw the menu */ - if (menu->numitems > 1 && (menu->item[0].flags & MENU_FLAG_MULTILINE) != 0) - ui_menu_draw_text_box(menu); + if (numitems > 1 && (item[0].flags & MENU_FLAG_MULTILINE) != 0) + draw_text_box(); else - ui_menu_draw(machine, menu, (flags & UI_MENU_PROCESS_CUSTOM_ONLY) != 0); + draw(flags & UI_MENU_PROCESS_CUSTOM_ONLY); /* process input */ if (!(flags & UI_MENU_PROCESS_NOKEYS)) { /* read events */ - ui_menu_handle_events(menu); + handle_events(); /* handle the keys if we don't already have an menu_event */ - if (menu->menu_event.iptkey == IPT_INVALID) - ui_menu_handle_keys(menu, flags); + if (menu_event.iptkey == IPT_INVALID) + handle_keys(flags); } /* update the selected item in the menu_event */ - if (menu->menu_event.iptkey != IPT_INVALID && menu->selected >= 0 && menu->selected < menu->numitems) + if (menu_event.iptkey != IPT_INVALID && selected >= 0 && selected < numitems) { - menu->menu_event.itemref = menu->item[menu->selected].ref; - return &menu->menu_event; + menu_event.itemref = item[selected].ref; + return &menu_event; } return NULL; } /*------------------------------------------------- - ui_menu_set_custom_render - configure the menu - for custom rendering --------------------------------------------------*/ - -void ui_menu_set_custom_render(ui_menu *menu, ui_menu_custom_func custom, float top, float bottom) -{ - menu->custom = custom; - menu->customtop = top; - menu->custombottom = bottom; -} - - -/*------------------------------------------------- - ui_menu_alloc_state - allocate permanent - memory to represent the menu's state --------------------------------------------------*/ - -void *ui_menu_alloc_state(ui_menu *menu, size_t size, ui_menu_destroy_state_func destroy_state) -{ - if (menu->state != NULL) - { - if (menu->destroy_state != NULL) - (*menu->destroy_state)(menu, menu->state); - auto_free(menu->machine(), menu->state); - } - menu->state = auto_alloc_array_clear(menu->machine(), UINT8, size); - menu->destroy_state = destroy_state; - - return menu->state; -} - - -/*------------------------------------------------- - ui_menu_pool_alloc - allocate temporary memory + m_pool_alloc - allocate temporary memory from the menu's memory pool -------------------------------------------------*/ -void *ui_menu_pool_alloc(ui_menu *menu, size_t size) +void *ui_menu::m_pool_alloc(size_t size) { - ui_menu_pool *pool; + ui_menu_pool *ppool; assert(size < UI_MENU_POOL_SIZE); /* find a pool with enough room */ - for (pool = menu->pool; pool != NULL; pool = pool->next) - if (pool->end - pool->top >= size) + for (ppool = pool; ppool != NULL; ppool = ppool->next) + if (ppool->end - ppool->top >= size) { - void *result = pool->top; - pool->top += size; + void *result = ppool->top; + ppool->top += size; return result; } /* allocate a new pool */ - pool = (ui_menu_pool *)auto_alloc_array_clear(menu->machine(), UINT8, sizeof(*pool) + UI_MENU_POOL_SIZE); + ppool = (ui_menu_pool *)auto_alloc_array_clear(machine(), UINT8, sizeof(*ppool) + UI_MENU_POOL_SIZE); /* wire it up */ - pool->next = menu->pool; - menu->pool = pool; - pool->top = (UINT8 *)(pool + 1); - pool->end = pool->top + UI_MENU_POOL_SIZE; - return ui_menu_pool_alloc(menu, size); + ppool->next = pool; + pool = ppool; + ppool->top = (UINT8 *)(ppool + 1); + ppool->end = ppool->top + UI_MENU_POOL_SIZE; + return m_pool_alloc(size); } /*------------------------------------------------- - ui_menu_pool_strdup - make a temporary string + pool_strdup - make a temporary string copy in the menu's memory pool -------------------------------------------------*/ -const char *ui_menu_pool_strdup(ui_menu *menu, const char *string) +const char *ui_menu::pool_strdup(const char *string) { - return strcpy((char *)ui_menu_pool_alloc(menu, strlen(string) + 1), string); + return strcpy((char *)m_pool_alloc(strlen(string) + 1), string); } /*------------------------------------------------- - ui_menu_get_selection - retrieves the index + get_selection - retrieves the index of the currently selected menu item -------------------------------------------------*/ -void *ui_menu_get_selection(ui_menu *menu) +void *ui_menu::get_selection() { - return (menu->selected >= 0 && menu->selected < menu->numitems) ? menu->item[menu->selected].ref : NULL; + return (selected >= 0 && selected < numitems) ? item[selected].ref : NULL; } /*------------------------------------------------- - ui_menu_set_selection - changes the index + set_selection - changes the index of the currently selected menu item -------------------------------------------------*/ -void ui_menu_set_selection(ui_menu *menu, void *selected_itemref) +void ui_menu::set_selection(void *selected_itemref) { int itemnum; - menu->selected = -1; - for (itemnum = 0; itemnum < menu->numitems; itemnum++) - if (menu->item[itemnum].ref == selected_itemref) + selected = -1; + for (itemnum = 0; itemnum < numitems; itemnum++) + if (item[itemnum].ref == selected_itemref) { - menu->selected = itemnum; + selected = itemnum; break; } } @@ -748,14 +395,14 @@ ***************************************************************************/ /*------------------------------------------------- - ui_menu_draw - draw a menu + draw - draw a menu -------------------------------------------------*/ -static void ui_menu_draw(running_machine &machine, ui_menu *menu, int customonly) +void ui_menu::draw(bool customonly) { - float line_height = ui_get_line_height(machine); - float lr_arrow_width = 0.4f * line_height * machine.render().ui_aspect(); - float ud_arrow_width = line_height * machine.render().ui_aspect(); + float line_height = ui_get_line_height(machine()); + float lr_arrow_width = 0.4f * line_height * machine().render().ui_aspect(); + float ud_arrow_width = line_height * machine().render().ui_aspect(); float gutter_width = lr_arrow_width * 1.3f; float x1, y1, x2, y2; @@ -775,17 +422,17 @@ /* compute the width and height of the full menu */ visible_width = 0; visible_main_menu_height = 0; - for (itemnum = 0; itemnum < menu->numitems; itemnum++) + for (itemnum = 0; itemnum < numitems; itemnum++) { - const ui_menu_item *item = &menu->item[itemnum]; + const ui_menu_item &pitem = item[itemnum]; float total_width; /* compute width of left hand side */ - total_width = gutter_width + ui_get_string_width(machine, item->text) + gutter_width; + total_width = gutter_width + ui_get_string_width(machine(), pitem.text) + gutter_width; /* add in width of right hand side */ - if (item->subtext) - total_width += 2.0f * gutter_width + ui_get_string_width(machine, item->subtext); + if (pitem.subtext) + total_width += 2.0f * gutter_width + ui_get_string_width(machine(), pitem.subtext); /* track the maximum */ if (total_width > visible_width) @@ -796,7 +443,7 @@ } /* account for extra space at the top and bottom */ - visible_extra_menu_height = menu->customtop + menu->custombottom; + visible_extra_menu_height = customtop + custombottom; /* add a little bit of slop for rounding */ visible_width += 0.01f; @@ -818,7 +465,7 @@ visible_top = (1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f; /* if the menu is at the bottom of the extra, adjust */ - visible_top += menu->customtop; + visible_top += customtop; /* first add us a box */ x1 = visible_left - UI_BOX_LR_BORDER; @@ -826,14 +473,14 @@ x2 = visible_left + visible_width + UI_BOX_LR_BORDER; y2 = visible_top + visible_main_menu_height + UI_BOX_TB_BORDER; if (!customonly) - ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); + ui_draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); /* determine the first visible line based on the current selection */ - top_line = menu->selected - visible_lines / 2; + top_line = selected - visible_lines / 2; if (top_line < 0) top_line = 0; - if (top_line + visible_lines >= menu->numitems) - top_line = menu->numitems - visible_lines; + if (top_line + visible_lines >= numitems) + top_line = numitems - visible_lines; /* determine effective positions taking into account the hilighting arrows */ effective_width = visible_width - 2.0f * gutter_width; @@ -844,21 +491,21 @@ mouse_button = FALSE; if (!customonly) { - mouse_target = ui_input_find_mouse(machine, &mouse_target_x, &mouse_target_y, &mouse_button); + mouse_target = ui_input_find_mouse(machine(), &mouse_target_x, &mouse_target_y, &mouse_button); if (mouse_target != NULL) - if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *menu->container, mouse_x, mouse_y)) + if (mouse_target->map_point_container(mouse_target_x, mouse_target_y, *container, mouse_x, mouse_y)) mouse_hit = TRUE; } /* loop over visible lines */ - menu->hover = menu->numitems + 1; + hover = numitems + 1; if (!customonly) for (linenum = 0; linenum < visible_lines; linenum++) { float line_y = visible_top + (float)linenum * line_height; itemnum = top_line + linenum; - const ui_menu_item *item = &menu->item[itemnum]; - const char *itemtext = item->text; + const ui_menu_item &pitem = item[itemnum]; + const char *itemtext = pitem.text; rgb_t fgcolor = UI_TEXT_COLOR; rgb_t bgcolor = UI_TEXT_BG_COLOR; rgb_t fgcolor2 = UI_SUBITEM_COLOR; @@ -869,11 +516,11 @@ float line_y1 = line_y + line_height; /* set the hover if this is our item */ - if (mouse_hit && line_x0 <= mouse_x && line_x1 > mouse_x && line_y0 <= mouse_y && line_y1 > mouse_y && item_is_selectable(item)) - menu->hover = itemnum; + if (mouse_hit && line_x0 <= mouse_x && line_x1 > mouse_x && line_y0 <= mouse_y && line_y1 > mouse_y && pitem.is_selectable()) + hover = itemnum; /* if we're selected, draw with a different background */ - if (itemnum == menu->selected) + if (itemnum == selected) { fgcolor = UI_SELECTED_COLOR; bgcolor = UI_SELECTED_BG_COLOR; @@ -882,7 +529,7 @@ } /* else if the mouse is over this item, draw with a different background */ - else if (itemnum == menu->hover) + else if (itemnum == hover) { fgcolor = UI_MOUSEOVER_COLOR; bgcolor = UI_MOUSEOVER_BG_COLOR; @@ -892,13 +539,13 @@ /* if we have some background hilighting to do, add a quad behind everything else */ if (bgcolor != UI_TEXT_BG_COLOR) - menu->container->add_quad(line_x0, line_y0, line_x1, line_y1, bgcolor, hilight_texture, + container->add_quad(line_x0, line_y0, line_x1, line_y1, bgcolor, hilight_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); /* if we're on the top line, display the up arrow */ if (linenum == 0 && top_line != 0) { - menu->container->add_quad( + container->add_quad( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, @@ -906,14 +553,14 @@ fgcolor, arrow_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXORIENT(ROT0)); - if (menu->hover == itemnum) - menu->hover = -2; + if (hover == itemnum) + hover = -2; } /* if we're on the bottom line, display the down arrow */ - else if (linenum == visible_lines - 1 && itemnum != menu->numitems - 1) + else if (linenum == visible_lines - 1 && itemnum != numitems - 1) { - menu->container->add_quad( + container->add_quad( 0.5f * (x1 + x2) - 0.5f * ud_arrow_width, line_y + 0.25f * line_height, 0.5f * (x1 + x2) + 0.5f * ud_arrow_width, @@ -921,49 +568,49 @@ fgcolor, arrow_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXORIENT(ROT0 ^ ORIENTATION_FLIP_Y)); - if (menu->hover == itemnum) - menu->hover = -1; + if (hover == itemnum) + hover = -1; } /* if we're just a divider, draw a line */ else if (strcmp(itemtext, MENU_SEPARATOR_ITEM) == 0) - menu->container->add_line(visible_left, line_y + 0.5f * line_height, visible_left + visible_width, line_y + 0.5f * line_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + container->add_line(visible_left, line_y + 0.5f * line_height, visible_left + visible_width, line_y + 0.5f * line_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); /* if we don't have a subitem, just draw the string centered */ - else if (item->subtext == NULL) - ui_draw_text_full(menu->container, itemtext, effective_left, line_y, effective_width, + else if (pitem.subtext == NULL) + ui_draw_text_full(container, itemtext, effective_left, line_y, effective_width, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, NULL, NULL); /* otherwise, draw the item on the left and the subitem text on the right */ else { - int subitem_invert = item->flags & MENU_FLAG_INVERT; - const char *subitem_text = item->subtext; + int subitem_invert = pitem.flags & MENU_FLAG_INVERT; + const char *subitem_text = pitem.subtext; float item_width, subitem_width; /* draw the left-side text */ - ui_draw_text_full(menu->container, itemtext, effective_left, line_y, effective_width, + ui_draw_text_full(container, itemtext, effective_left, line_y, effective_width, JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NORMAL, fgcolor, bgcolor, &item_width, NULL); /* give 2 spaces worth of padding */ item_width += 2.0f * gutter_width; /* if the subitem doesn't fit here, display dots */ - if (ui_get_string_width(machine, subitem_text) > effective_width - item_width) + if (ui_get_string_width(machine(), subitem_text) > effective_width - item_width) { subitem_text = "..."; - if (itemnum == menu->selected) + if (itemnum == selected) selected_subitem_too_big = TRUE; } /* draw the subitem right-justified */ - ui_draw_text_full(menu->container, subitem_text, effective_left + item_width, line_y, effective_width - item_width, + ui_draw_text_full(container, subitem_text, effective_left + item_width, line_y, effective_width - item_width, JUSTIFY_RIGHT, WRAP_TRUNCATE, DRAW_NORMAL, subitem_invert ? fgcolor3 : fgcolor2, bgcolor, &subitem_width, NULL); /* apply arrows */ - if (itemnum == menu->selected && (item->flags & MENU_FLAG_LEFT_ARROW)) + if (itemnum == selected && (pitem.flags & MENU_FLAG_LEFT_ARROW)) { - menu->container->add_quad( + container->add_quad( effective_left + effective_width - subitem_width - gutter_width, line_y + 0.1f * line_height, effective_left + effective_width - subitem_width - gutter_width + lr_arrow_width, @@ -972,9 +619,9 @@ arrow_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXORIENT(ROT90 ^ ORIENTATION_FLIP_X)); } - if (itemnum == menu->selected && (item->flags & MENU_FLAG_RIGHT_ARROW)) + if (itemnum == selected && (pitem.flags & MENU_FLAG_RIGHT_ARROW)) { - menu->container->add_quad( + container->add_quad( effective_left + effective_width + gutter_width - lr_arrow_width, line_y + 0.1f * line_height, effective_left + effective_width + gutter_width, @@ -989,15 +636,15 @@ /* if the selected subitem is too big, display it in a separate offset box */ if (selected_subitem_too_big) { - const ui_menu_item *item = &menu->item[menu->selected]; - int subitem_invert = item->flags & MENU_FLAG_INVERT; - linenum = menu->selected - top_line; + const ui_menu_item &pitem = item[selected]; + int subitem_invert = pitem.flags & MENU_FLAG_INVERT; + linenum = selected - top_line; float line_y = visible_top + (float)linenum * line_height; float target_width, target_height; float target_x, target_y; /* compute the multi-line target width/height */ - ui_draw_text_full(menu->container, item->subtext, 0, 0, visible_width * 0.75f, + ui_draw_text_full(container, pitem.subtext, 0, 0, visible_width * 0.75f, JUSTIFY_RIGHT, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &target_width, &target_height); /* determine the target location */ @@ -1007,51 +654,50 @@ target_y = line_y - target_height - UI_BOX_TB_BORDER; /* add a box around that */ - ui_draw_outlined_box(menu->container, target_x - UI_BOX_LR_BORDER, + ui_draw_outlined_box(container, target_x - UI_BOX_LR_BORDER, target_y - UI_BOX_TB_BORDER, target_x + target_width + UI_BOX_LR_BORDER, target_y + target_height + UI_BOX_TB_BORDER, subitem_invert ? UI_SELECTED_BG_COLOR : UI_BACKGROUND_COLOR); - ui_draw_text_full(menu->container, item->subtext, target_x, target_y, target_width, + ui_draw_text_full(container, pitem.subtext, target_x, target_y, target_width, JUSTIFY_RIGHT, WRAP_WORD, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, NULL, NULL); } - /* if there is something special to add, do it by calling the passed routine */ - if (menu->custom != NULL) - { - void *selectedref = (menu->selected >= 0 && menu->selected < menu->numitems) ? menu->item[menu->selected].ref : NULL; - (*menu->custom)(menu->machine(), menu, menu->state, selectedref, menu->customtop, menu->custombottom, x1, y1, x2, y2); - } + /* if there is something special to add, do it by calling the virtual method */ + custom_render((selected >= 0 && selected < numitems) ? item[selected].ref : NULL, customtop, custombottom, x1, y1, x2, y2); /* return the number of visible lines, minus 1 for top arrow and 1 for bottom arrow */ - menu->visitems = visible_lines - (top_line != 0) - (top_line + visible_lines != menu->numitems); + visitems = visible_lines - (top_line != 0) - (top_line + visible_lines != numitems); } +void ui_menu::custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) +{ +} /*------------------------------------------------- - ui_menu_draw_text_box - draw a multiline + draw_text_box - draw a multiline word-wrapped text box with a menu item at the bottom -------------------------------------------------*/ -static void ui_menu_draw_text_box(ui_menu *menu) +void ui_menu::draw_text_box() { - const char *text = menu->item[0].text; - const char *backtext = menu->item[1].text; - float line_height = ui_get_line_height(menu->machine()); - float lr_arrow_width = 0.4f * line_height * menu->machine().render().ui_aspect(); + const char *text = item[0].text; + const char *backtext = item[1].text; + float line_height = ui_get_line_height(machine()); + float lr_arrow_width = 0.4f * line_height * machine().render().ui_aspect(); float gutter_width = lr_arrow_width; float target_width, target_height, prior_width; float target_x, target_y; /* compute the multi-line target width/height */ - ui_draw_text_full(menu->container, text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER - 2.0f * gutter_width, + ui_draw_text_full(container, text, 0, 0, 1.0f - 2.0f * UI_BOX_LR_BORDER - 2.0f * gutter_width, JUSTIFY_LEFT, WRAP_WORD, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &target_width, &target_height); target_height += 2.0f * line_height; if (target_height > 1.0f - 2.0f * UI_BOX_TB_BORDER) target_height = floor((1.0f - 2.0f * UI_BOX_TB_BORDER) / line_height) * line_height; /* maximum against "return to prior menu" text */ - prior_width = ui_get_string_width(menu->machine(), backtext) + 2.0f * gutter_width; + prior_width = ui_get_string_width(machine(), backtext) + 2.0f * gutter_width; target_width = MAX(target_width, prior_width); /* determine the target location */ @@ -1069,15 +715,15 @@ target_y = 1.0f - UI_BOX_TB_BORDER - target_height; /* add a box around that */ - ui_draw_outlined_box(menu->container, target_x - UI_BOX_LR_BORDER - gutter_width, + ui_draw_outlined_box(container, target_x - UI_BOX_LR_BORDER - gutter_width, target_y - UI_BOX_TB_BORDER, target_x + target_width + gutter_width + UI_BOX_LR_BORDER, - target_y + target_height + UI_BOX_TB_BORDER, (menu->item[0].flags & MENU_FLAG_REDTEXT) ? UI_RED_COLOR : UI_BACKGROUND_COLOR); - ui_draw_text_full(menu->container, text, target_x, target_y, target_width, + target_y + target_height + UI_BOX_TB_BORDER, (item[0].flags & MENU_FLAG_REDTEXT) ? UI_RED_COLOR : UI_BACKGROUND_COLOR); + ui_draw_text_full(container, text, target_x, target_y, target_width, JUSTIFY_LEFT, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); /* draw the "return to prior menu" text with a hilight behind it */ - menu->container->add_quad( + container->add_quad( target_x + 0.5f * UI_LINE_WIDTH, target_y + target_height - line_height, target_x + target_width - 0.5f * UI_LINE_WIDTH, @@ -1085,57 +731,57 @@ UI_SELECTED_BG_COLOR, hilight_texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXWRAP(TRUE)); - ui_draw_text_full(menu->container, backtext, target_x, target_y + target_height - line_height, target_width, + ui_draw_text_full(container, backtext, target_x, target_y + target_height - line_height, target_width, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NORMAL, UI_SELECTED_COLOR, UI_SELECTED_BG_COLOR, NULL, NULL); /* artificially set the hover to the last item so a double-click exits */ - menu->hover = menu->numitems - 1; + hover = numitems - 1; } /*------------------------------------------------- - ui_menu_handle_events - generically handle + handle_events - generically handle input events for a menu -------------------------------------------------*/ -static void ui_menu_handle_events(ui_menu *menu) +void ui_menu::handle_events() { int stop = FALSE; - ui_event menu_event; + ui_event local_menu_event; /* loop while we have interesting events */ - while (ui_input_pop_event(menu->machine(), &menu_event) && !stop) + while (ui_input_pop_event(machine(), &local_menu_event) && !stop) { - switch (menu_event.event_type) + switch (local_menu_event.event_type) { /* if we are hovering over a valid item, select it with a single click */ case UI_EVENT_MOUSE_DOWN: - if (menu->hover >= 0 && menu->hover < menu->numitems) - menu->selected = menu->hover; - else if (menu->hover == -2) + if (hover >= 0 && hover < numitems) + selected = hover; + else if (hover == -2) { - menu->selected -= menu->visitems - 1; - ui_menu_validate_selection(menu, 1); + selected -= visitems - 1; + validate_selection(1); } - else if (menu->hover == -1) + else if (hover == -1) { - menu->selected += menu->visitems - 1; - ui_menu_validate_selection(menu, 1); + selected += visitems - 1; + validate_selection(1); } break; /* if we are hovering over a valid item, fake a UI_SELECT with a double-click */ case UI_EVENT_MOUSE_DOUBLE_CLICK: - if (menu->hover >= 0 && menu->hover < menu->numitems) + if (hover >= 0 && hover < numitems) { - menu->selected = menu->hover; - if (menu_event.event_type == UI_EVENT_MOUSE_DOUBLE_CLICK) + selected = hover; + if (local_menu_event.event_type == UI_EVENT_MOUSE_DOUBLE_CLICK) { - menu->menu_event.iptkey = IPT_UI_SELECT; - if (menu->selected == menu->numitems - 1) + menu_event.iptkey = IPT_UI_SELECT; + if (selected == numitems - 1) { - menu->menu_event.iptkey = IPT_UI_CANCEL; - ui_menu_stack_pop(menu->machine()); + menu_event.iptkey = IPT_UI_CANCEL; + ui_menu::stack_pop(machine()); } } stop = TRUE; @@ -1144,8 +790,8 @@ /* translate CHAR events into specials */ case UI_EVENT_CHAR: - menu->menu_event.iptkey = IPT_SPECIAL; - menu->menu_event.unichar = menu_event.ch; + menu_event.iptkey = IPT_SPECIAL; + menu_event.unichar = local_menu_event.ch; stop = TRUE; break; @@ -1158,152 +804,152 @@ /*------------------------------------------------- - ui_menu_handle_keys - generically handle + handle_keys - generically handle keys for a menu -------------------------------------------------*/ -static void ui_menu_handle_keys(ui_menu *menu, UINT32 flags) +void ui_menu::handle_keys(UINT32 flags) { - int ignorepause = ui_menu_is_force_game_select(); + int ignorepause = ui_menu::stack_has_special_main_menu(); int ignoreright = FALSE; int ignoreleft = FALSE; int code; /* bail if no items */ - if (menu->numitems == 0) + if (numitems == 0) return; /* if we hit select, return TRUE or pop the stack, depending on the item */ - if (exclusive_input_pressed(menu, IPT_UI_SELECT, 0)) + if (exclusive_input_pressed(IPT_UI_SELECT, 0)) { - if (menu->selected == menu->numitems - 1) + if (selected == numitems - 1) { - menu->menu_event.iptkey = IPT_UI_CANCEL; - ui_menu_stack_pop(menu->machine()); + menu_event.iptkey = IPT_UI_CANCEL; + ui_menu::stack_pop(machine()); } return; } /* hitting cancel also pops the stack */ - if (exclusive_input_pressed(menu, IPT_UI_CANCEL, 0)) + if (exclusive_input_pressed(IPT_UI_CANCEL, 0)) { - ui_menu_stack_pop(menu->machine()); + ui_menu::stack_pop(machine()); return; } /* validate the current selection */ - ui_menu_validate_selection(menu, 1); + validate_selection(1); /* swallow left/right keys if they are not appropriate */ - ignoreleft = ((menu->item[menu->selected].flags & MENU_FLAG_LEFT_ARROW) == 0); - ignoreright = ((menu->item[menu->selected].flags & MENU_FLAG_RIGHT_ARROW) == 0); + ignoreleft = ((item[selected].flags & MENU_FLAG_LEFT_ARROW) == 0); + ignoreright = ((item[selected].flags & MENU_FLAG_RIGHT_ARROW) == 0); /* accept left/right keys as-is with repeat */ - if (!ignoreleft && exclusive_input_pressed(menu, IPT_UI_LEFT, (flags & UI_MENU_PROCESS_LR_REPEAT) ? 6 : 0)) + if (!ignoreleft && exclusive_input_pressed(IPT_UI_LEFT, (flags & UI_MENU_PROCESS_LR_REPEAT) ? 6 : 0)) return; - if (!ignoreright && exclusive_input_pressed(menu, IPT_UI_RIGHT, (flags & UI_MENU_PROCESS_LR_REPEAT) ? 6 : 0)) + if (!ignoreright && exclusive_input_pressed(IPT_UI_RIGHT, (flags & UI_MENU_PROCESS_LR_REPEAT) ? 6 : 0)) return; /* up backs up by one item */ - if (exclusive_input_pressed(menu, IPT_UI_UP, 6)) + if (exclusive_input_pressed(IPT_UI_UP, 6)) { - menu->selected = (menu->selected + menu->numitems - 1) % menu->numitems; - ui_menu_validate_selection(menu, -1); + selected = (selected + numitems - 1) % numitems; + validate_selection(-1); } /* down advances by one item */ - if (exclusive_input_pressed(menu, IPT_UI_DOWN, 6)) + if (exclusive_input_pressed(IPT_UI_DOWN, 6)) { - menu->selected = (menu->selected + 1) % menu->numitems; - ui_menu_validate_selection(menu, 1); + selected = (selected + 1) % numitems; + validate_selection(1); } /* page up backs up by visitems */ - if (exclusive_input_pressed(menu, IPT_UI_PAGE_UP, 6)) + if (exclusive_input_pressed(IPT_UI_PAGE_UP, 6)) { - menu->selected -= menu->visitems - 1; - ui_menu_validate_selection(menu, 1); + selected -= visitems - 1; + validate_selection(1); } /* page down advances by visitems */ - if (exclusive_input_pressed(menu, IPT_UI_PAGE_DOWN, 6)) + if (exclusive_input_pressed(IPT_UI_PAGE_DOWN, 6)) { - menu->selected += menu->visitems - 1; - ui_menu_validate_selection(menu, -1); + selected += visitems - 1; + validate_selection(-1); } /* home goes to the start */ - if (exclusive_input_pressed(menu, IPT_UI_HOME, 0)) + if (exclusive_input_pressed(IPT_UI_HOME, 0)) { - menu->selected = 0; - ui_menu_validate_selection(menu, 1); + selected = 0; + validate_selection(1); } /* end goes to the last */ - if (exclusive_input_pressed(menu, IPT_UI_END, 0)) + if (exclusive_input_pressed(IPT_UI_END, 0)) { - menu->selected = menu->numitems - 1; - ui_menu_validate_selection(menu, -1); + selected = numitems - 1; + validate_selection(-1); } /* pause enables/disables pause */ - if (!ignorepause && exclusive_input_pressed(menu, IPT_UI_PAUSE, 0)) + if (!ignorepause && exclusive_input_pressed(IPT_UI_PAUSE, 0)) { - if (menu->machine().paused()) - menu->machine().resume(); + if (machine().paused()) + machine().resume(); else - menu->machine().pause(); + machine().pause(); } /* handle a toggle cheats request */ - if (ui_input_pressed_repeat(menu->machine(), IPT_UI_TOGGLE_CHEAT, 0)) - menu->machine().cheat().set_enable(!menu->machine().cheat().enabled()); + if (ui_input_pressed_repeat(machine(), IPT_UI_TOGGLE_CHEAT, 0)) + machine().cheat().set_enable(!machine().cheat().enabled()); /* see if any other UI keys are pressed */ - if (menu->menu_event.iptkey == IPT_INVALID) + if (menu_event.iptkey == IPT_INVALID) for (code = __ipt_ui_start; code <= __ipt_ui_end; code++) { if (code == IPT_UI_CONFIGURE || (code == IPT_UI_LEFT && ignoreleft) || (code == IPT_UI_RIGHT && ignoreright) || (code == IPT_UI_PAUSE && ignorepause)) continue; - if (exclusive_input_pressed(menu, code, 0)) + if (exclusive_input_pressed(code, 0)) break; } } /*------------------------------------------------- - ui_menu_validate_selection - validate the + validate_selection - validate the current selection and ensure it is on a correct item -------------------------------------------------*/ -static void ui_menu_validate_selection(ui_menu *menu, int scandir) +void ui_menu::validate_selection(int scandir) { /* clamp to be in range */ - if (menu->selected < 0) - menu->selected = 0; - else if (menu->selected >= menu->numitems) - menu->selected = menu->numitems - 1; + if (selected < 0) + selected = 0; + else if (selected >= numitems) + selected = numitems - 1; /* skip past unselectable items */ - while (!item_is_selectable(&menu->item[menu->selected])) - menu->selected = (menu->selected + menu->numitems + scandir) % menu->numitems; + while (!item[selected].is_selectable()) + selected = (selected + numitems + scandir) % numitems; } /*------------------------------------------------- - ui_menu_clear_free_list - clear out anything + clear_free_list - clear out anything accumulated in the free list -------------------------------------------------*/ -static void ui_menu_clear_free_list(running_machine &machine) +void ui_menu::clear_free_list(running_machine &machine) { while (menu_free != NULL) { ui_menu *menu = menu_free; menu_free = menu->parent; - ui_menu_free(menu); + auto_free(machine, menu); } } @@ -1314,35 +960,34 @@ ***************************************************************************/ /*------------------------------------------------- - ui_menu_stack_reset - reset the menu stack + ui_menu::stack_reset - reset the menu stack -------------------------------------------------*/ -void ui_menu_stack_reset(running_machine &machine) +void ui_menu::stack_reset(running_machine &machine) { while (menu_stack != NULL) - ui_menu_stack_pop(machine); + ui_menu::stack_pop(machine); } /*------------------------------------------------- - ui_menu_stack_push - push a new menu onto the + stack_push - push a new menu onto the stack -------------------------------------------------*/ -void ui_menu_stack_push(ui_menu *menu) +void ui_menu::stack_push(ui_menu *menu) { menu->parent = menu_stack; menu_stack = menu; - ui_menu_reset(menu, UI_MENU_RESET_SELECT_FIRST); ui_input_reset(menu->machine()); } /*------------------------------------------------- - ui_menu_stack_pop - pop a menu from the stack + stack_pop - pop a menu from the stack -------------------------------------------------*/ -void ui_menu_stack_pop(running_machine &machine) +void ui_menu::stack_pop(running_machine &machine) { if (menu_stack != NULL) { @@ -1355,2612 +1000,86 @@ } - -/*************************************************************************** - UI SYSTEM INTERACTION -***************************************************************************/ - -/*------------------------------------------------- - ui_menu_ui_handler - displays the current menu - and calls the menu handler --------------------------------------------------*/ - -UINT32 ui_menu_ui_handler(running_machine &machine, render_container *container, UINT32 state) -{ - /* if we have no menus stacked up, start with the main menu */ - if (menu_stack == NULL) - ui_menu_stack_push(ui_menu_alloc(machine, container, menu_main, NULL)); - - /* update the menu state */ - if (menu_stack != NULL) - { - ui_menu *menu = menu_stack; - (*menu->handler)(machine, menu, menu->parameter, menu->state); - } - - /* clear up anything pending to be released */ - ui_menu_clear_free_list(machine); - - /* if the menus are to be hidden, return a cancel here */ - if ((ui_input_pressed(machine, IPT_UI_CONFIGURE) && !ui_menu_is_force_game_select()) || menu_stack == NULL) - return UI_HANDLER_CANCEL; - - return 0; -} - - -/*------------------------------------------------- - ui_slider_ui_handler - pushes the slider - menu on the stack and hands off to the - standard menu handler --------------------------------------------------*/ - -UINT32 ui_slider_ui_handler(running_machine &machine, render_container *container, UINT32 state) -{ - UINT32 result; - - /* if this is the first call, push the sliders menu */ - if (state) - ui_menu_stack_push(ui_menu_alloc(machine, container, menu_sliders, (void *)1)); - - /* handle standard menus */ - result = ui_menu_ui_handler(machine, container, state); - - /* if we are cancelled, pop the sliders menu */ - if (result == UI_HANDLER_CANCEL) - ui_menu_stack_pop(machine); - - return (menu_stack != NULL && menu_stack->handler == menu_sliders && menu_stack->parameter != NULL) ? 0 : UI_HANDLER_CANCEL; -} - - -/*------------------------------------------------- - ui_menu_force_game_select - force the game - select menu to be visible and inescapable --------------------------------------------------*/ - -void ui_menu_force_game_select(running_machine &machine, render_container *container) -{ - char *gamename = (char *)machine.options().system_name(); - - /* reset the menu stack */ - ui_menu_stack_reset(machine); - - /* add the quit entry followed by the game select entry */ - ui_menu_stack_push(ui_menu_alloc(machine, container, menu_quit_game, NULL)); - ui_menu_stack_push(ui_menu_alloc(machine, container, menu_select_game, gamename)); - - /* force the menus on */ - ui_show_menu(); - - /* make sure MAME is paused */ - machine.pause(); -} - - /*------------------------------------------------- - ui_menu_is_force_game_select - return true - if we are currently in "force game select" - mode + ui_menu::stack_has_special_main_menu - + check in the special main menu is in the stack -------------------------------------------------*/ -int ui_menu_is_force_game_select(void) +bool ui_menu::stack_has_special_main_menu() { ui_menu *menu; for (menu = menu_stack; menu != NULL; menu = menu->parent) - if (menu->handler == menu_quit_game && menu->parent == NULL) - return TRUE; - - return FALSE; -} - - - -/*************************************************************************** - MENU HANDLERS -***************************************************************************/ - -/*------------------------------------------------- - menu_main - handle the main menu --------------------------------------------------*/ - -static void menu_main(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_main_populate(machine, menu, state); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, menu->container, (ui_menu_handler_func)menu_event->itemref, NULL)); -} - - -/*------------------------------------------------- - ui_menu_keyboard_mode - menu that --------------------------------------------------*/ - -static void ui_menu_keyboard_mode(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - int natural = ui_get_use_natural_keyboard(machine); - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - { - ui_menu_item_append(menu, "Keyboard Mode:", natural ? "Natural" : "Emulated", natural ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, NULL); - } - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - - if (menu_event != NULL) - { - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) { - ui_set_use_natural_keyboard(machine, natural ^ TRUE); - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - } - } -} - - -/*------------------------------------------------- - ui_slot_get_current_index - returns --------------------------------------------------*/ -int ui_slot_get_current_index(running_machine &machine, device_slot_interface *slot) -{ - const char *current = machine.options().value(slot->device().tag()); - const slot_interface* intf = slot->get_slot_interfaces(); - int val = -1; - for (int i = 0; intf[i].name != NULL; i++) { - if (strcmp(current, intf[i].name) == 0) val = i; - } - return val; -} - -/*------------------------------------------------- - ui_slot_get_length - returns --------------------------------------------------*/ -int ui_slot_get_length(running_machine &machine, device_slot_interface *slot) -{ - const slot_interface* intf = slot->get_slot_interfaces(); - int val = 0; - for (int i = 0; intf[i].name != NULL; i++) val++; - return val; -} - -/*------------------------------------------------- - ui_slot_get_next - returns --------------------------------------------------*/ -const char *ui_slot_get_next(running_machine &machine, device_slot_interface *slot) -{ - int idx = ui_slot_get_current_index(machine, slot) + 1; - if (idx==ui_slot_get_length(machine,slot)) return ""; - return slot->get_slot_interfaces()[idx].name; -} - -/*------------------------------------------------- - ui_slot_get_prev - returns --------------------------------------------------*/ -const char *ui_slot_get_prev(running_machine &machine, device_slot_interface *slot) -{ - int idx = ui_slot_get_current_index(machine, slot) - 1; - if (idx==-1) return ""; - if (idx==-2) idx = ui_slot_get_length(machine,slot) -1; - if (idx==-1) return ""; - return slot->get_slot_interfaces()[idx].name; -} - -/*------------------------------------------------- - ui_get_slot_device - returns --------------------------------------------------*/ -const char *ui_get_slot_device(running_machine &machine, device_slot_interface *slot) -{ - return machine.options().value(slot->device().tag()); -} - + if (menu->is_special_main_menu()) + return true; -/*------------------------------------------------- - ui_set_use_natural_keyboard - specifies - whether the natural keyboard is active --------------------------------------------------*/ - -void ui_set_slot_device(running_machine &machine, device_slot_interface *slot, const char *val) -{ - astring error; - machine.options().set_value(slot->device().tag(), val, OPTION_PRIORITY_CMDLINE, error); - assert(!error); + return false; } -/*------------------------------------------------- - menu_slot_devices_populate - populates the main - slot device menu --------------------------------------------------*/ - -static void menu_slot_devices_populate(running_machine &machine, ui_menu *menu, void *state) +void ui_menu::do_handle() { - device_slot_interface *slot = NULL; - - /* cycle through all devices for this system */ - for (bool gotone = machine.devicelist().first(slot); gotone; gotone = slot->next(slot)) - { - /* record the menu item */ - const char *title = ui_get_slot_device(machine,slot); - ui_menu_item_append(menu, slot->device().tag(), strcmp(title,"")==0 ? "------" : title, MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW, (void *)slot); - } - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Reset", NULL, 0, NULL); + if(!populated()) + populate(); + handle(); } -/*------------------------------------------------- - ui_menu_slot_devices - menu that --------------------------------------------------*/ - -static void ui_menu_slot_devices(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - { - menu_slot_devices_populate(machine, menu, state); - } - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - - if (menu_event != NULL && menu_event->itemref != NULL) - { - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) { - device_slot_interface *slot = (device_slot_interface *)menu_event->itemref; - const char *val = (menu_event->iptkey == IPT_UI_LEFT) ? ui_slot_get_prev(machine,slot) : ui_slot_get_next(machine,slot); - ui_set_slot_device(machine,slot,val); - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - } - } else if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) { - machine.schedule_hard_reset(); - } -} +/*************************************************************************** + UI SYSTEM INTERACTION +***************************************************************************/ /*------------------------------------------------- - menu_main_populate - populate the main menu + ui_menu_ui_handler - displays the current menu + and calls the menu handler -------------------------------------------------*/ -static void menu_main_populate(running_machine &machine, ui_menu *menu, void *state) +UINT32 ui_menu::ui_handler(running_machine &machine, render_container *container, UINT32 state) { - input_field_config *field; - input_port_config *port; - int has_configs = FALSE; - int has_analog = FALSE; - int has_dips = FALSE; - - /* scan the input port array to see what options we need to enable */ - for (port = machine.m_portlist.first(); port != NULL; port = port->next()) - for (field = port->fieldlist().first(); field != NULL; field = field->next()) - { - if (field->type == IPT_DIPSWITCH) - has_dips = TRUE; - if (field->type == IPT_CONFIG) - has_configs = TRUE; - if (input_type_is_analog(field->type)) - has_analog = TRUE; - } - - /* add input menu items */ - ui_menu_item_append(menu, "Input (general)", NULL, 0, (void *)menu_input_groups); - ui_menu_item_append(menu, "Input (this " CAPSTARTGAMENOUN ")", NULL, 0, (void *)menu_input_specific); - - /* add optional input-related menus */ - if (has_dips) - ui_menu_item_append(menu, "Dip Switches", NULL, 0, (void *)menu_settings_dip_switches); - if (has_configs) - ui_menu_item_append(menu, "Driver Configuration", NULL, 0, (void *)menu_settings_driver_config); - if (has_analog) - ui_menu_item_append(menu, "Analog Controls", NULL, 0, (void *)menu_analog); - - /* add bookkeeping menu */ - ui_menu_item_append(menu, "Bookkeeping Info", NULL, 0, (void *)menu_bookkeeping); - - /* add game info menu */ - ui_menu_item_append(menu, CAPSTARTGAMENOUN " Information", NULL, 0, (void *)menu_game_info); - - device_image_interface *image = NULL; - if (machine.devicelist().first(image)) - { - /* add image info menu */ - ui_menu_item_append(menu, "Image Information", NULL, 0, (void*)ui_image_menu_image_info); - - /* add file manager menu */ - ui_menu_item_append(menu, "File Manager", NULL, 0, (void*)ui_image_menu_file_manager); - - /* add tape control menu */ - if (machine.devicelist().first(CASSETTE)) - ui_menu_item_append(menu, "Tape Control", NULL, 0, (void*)ui_mess_menu_tape_control); - - /* add bitbanger control menu */ - if (machine.devicelist().first(BITBANGER)) - ui_menu_item_append(menu, "Bitbanger Control", NULL, 0, (void*)ui_mess_menu_bitbanger_control); - } - - device_slot_interface *slot = NULL; - if (machine.devicelist().first(slot)) - { - /* add image info menu */ - ui_menu_item_append(menu, "Slot Devices", NULL, 0, (void*)ui_menu_slot_devices); - } - - /* add keyboard mode menu */ - if (input_machine_has_keyboard(machine) && inputx_can_post(machine)) - ui_menu_item_append(menu, "Keyboard Mode", NULL, 0, (void *)ui_menu_keyboard_mode); - - /* add sliders menu */ - ui_menu_item_append(menu, "Slider Controls", NULL, 0, (void *)menu_sliders); - - /* add video options menu */ - ui_menu_item_append(menu, "Video Options", NULL, 0, (machine.render().target_by_index(1) != NULL) ? (void *)menu_video_targets : (void *)menu_video_options); + /* if we have no menus stacked up, start with the main menu */ + if (menu_stack == NULL) + stack_push(auto_alloc_clear(machine, ui_menu_main(machine, container))); - /* add crosshair options menu */ - if (crosshair_get_usage(machine)) - ui_menu_item_append(menu, "Crosshair Options", NULL, 0, (void *)menu_crosshair); + /* update the menu state */ + if (menu_stack != NULL) + menu_stack->do_handle(); - /* add cheat menu */ - if (machine.options().cheat() && machine.cheat().first() != NULL) - ui_menu_item_append(menu, "Cheat", NULL, 0, (void *)menu_cheat); + /* clear up anything pending to be released */ + clear_free_list(machine); - /* add memory card menu */ - if (machine.config().m_memcard_handler != NULL) - ui_menu_item_append(menu, "Memory Card", NULL, 0, (void *)menu_memory_card); + /* if the menus are to be hidden, return a cancel here */ + if ((ui_input_pressed(machine, IPT_UI_CONFIGURE) && !stack_has_special_main_menu()) || menu_stack == NULL) + return UI_HANDLER_CANCEL; - /* add reset and exit menus */ - ui_menu_item_append(menu, "Select New " CAPSTARTGAMENOUN, NULL, 0, (void *)menu_select_game); + return 0; } - -/*------------------------------------------------- - menu_input_groups - handle the input groups - menu --------------------------------------------------*/ - -static void menu_input_groups(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_input_groups_populate(machine, menu, state); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, menu->container, menu_input_general, menu_event->itemref)); -} - - -/*------------------------------------------------- - menu_input_groups_populate - populate the - input groups menu --------------------------------------------------*/ - -static void menu_input_groups_populate(running_machine &machine, ui_menu *menu, void *state) -{ - int player; - - /* build up the menu */ - ui_menu_item_append(menu, "User Interface", NULL, 0, (void *)(IPG_UI + 1)); - for (player = 0; player < MAX_PLAYERS; player++) - { - char buffer[40]; - sprintf(buffer, "Player %d Controls", player + 1); - ui_menu_item_append(menu, buffer, NULL, 0, (void *)(FPTR)(IPG_PLAYER1 + player + 1)); - } - ui_menu_item_append(menu, "Other Controls", NULL, 0, (void *)(FPTR)(IPG_OTHER + 1)); -} - - - -/*------------------------------------------------- - menu_input_general - handle the general - input menu --------------------------------------------------*/ - -static void menu_input_general(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - menu_input_common(machine, menu, parameter, state); -} - - -/*------------------------------------------------- - menu_input_general_populate - populate the - general input menu --------------------------------------------------*/ - -static void menu_input_general_populate(running_machine &machine, ui_menu *menu, input_menu_state *menustate, int group) -{ - input_item_data *itemlist = NULL; - int suborder[SEQ_TYPE_TOTAL]; - astring tempstring; - int sortorder = 1; - - /* create a mini lookup table for sort order based on sequence type */ - suborder[SEQ_TYPE_STANDARD] = 0; - suborder[SEQ_TYPE_DECREMENT] = 1; - suborder[SEQ_TYPE_INCREMENT] = 2; - - /* iterate over the input ports and add menu items */ - for (input_type_entry *entry = input_type_list(machine).first(); entry != NULL; entry = entry->next()) - - /* add if we match the group and we have a valid name */ - if (entry->group == group && entry->name != NULL && entry->name[0] != 0) - { - input_seq_type seqtype; - - /* loop over all sequence types */ - sortorder++; - for (seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; seqtype++) - { - /* build an entry for the standard sequence */ - input_item_data *item = (input_item_data *)ui_menu_pool_alloc(menu, sizeof(*item)); - memset(item, 0, sizeof(*item)); - item->ref = entry; - item->seqtype = seqtype; - item->seq = input_type_seq(machine, entry->type, entry->player, seqtype); - item->defseq = &entry->defseq[seqtype]; - item->sortorder = sortorder * 4 + suborder[seqtype]; - item->type = input_type_is_analog(entry->type) ? (INPUT_TYPE_ANALOG + seqtype) : INPUT_TYPE_DIGITAL; - item->name = entry->name; - item->next = itemlist; - itemlist = item; - - /* stop after one, unless we're analog */ - if (item->type == INPUT_TYPE_DIGITAL) - break; - } - } - - /* sort and populate the menu in a standard fashion */ - menu_input_populate_and_sort(machine, menu, itemlist, menustate); -} - - -/*------------------------------------------------- - menu_input_specific - handle the game-specific - input menu --------------------------------------------------*/ - -static void menu_input_specific(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - menu_input_common(machine, menu, NULL, state); -} - - -/*------------------------------------------------- - menu_input_specific_populate - populate - the input menu with game-specific items --------------------------------------------------*/ - -static void menu_input_specific_populate(running_machine &machine, ui_menu *menu, input_menu_state *menustate) -{ - input_item_data *itemlist = NULL; - input_field_config *field; - input_port_config *port; - int suborder[SEQ_TYPE_TOTAL]; - astring tempstring; - - /* create a mini lookup table for sort order based on sequence type */ - suborder[SEQ_TYPE_STANDARD] = 0; - suborder[SEQ_TYPE_DECREMENT] = 1; - suborder[SEQ_TYPE_INCREMENT] = 2; - - /* iterate over the input ports and add menu items */ - for (port = machine.m_portlist.first(); port != NULL; port = port->next()) - for (field = port->fieldlist().first(); field != NULL; field = field->next()) - { - const char *name = input_field_name(field); - - /* add if we match the group and we have a valid name */ - if (name != NULL && input_condition_true(machine, &field->condition, port->owner()) && - ((field->type == IPT_OTHER && field->name != NULL) || input_type_group(machine, field->type, field->player) != IPG_INVALID)) - { - input_seq_type seqtype; - UINT16 sortorder; - - /* determine the sorting order */ - if (field->type >= IPT_START1 && field->type <= __ipt_analog_end) - sortorder = (field->type << 2) | (field->player << 12); - else - sortorder = field->type | 0xf000; - - /* loop over all sequence types */ - for (seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; seqtype++) - { - /* build an entry for the standard sequence */ - input_item_data *item = (input_item_data *)ui_menu_pool_alloc(menu, sizeof(*item)); - memset(item, 0, sizeof(*item)); - item->ref = field; - item->seqtype = seqtype; - item->seq = input_field_seq(field, seqtype); - item->defseq = &get_field_default_seq(field, seqtype); - item->sortorder = sortorder + suborder[seqtype]; - item->type = input_type_is_analog(field->type) ? (INPUT_TYPE_ANALOG + seqtype) : INPUT_TYPE_DIGITAL; - item->name = name; - item->next = itemlist; - itemlist = item; - - /* stop after one, unless we're analog */ - if (item->type == INPUT_TYPE_DIGITAL) - break; - } - } - } - - /* sort and populate the menu in a standard fashion */ - menu_input_populate_and_sort(machine, menu, itemlist, menustate); -} - - -/*------------------------------------------------- - menu_input - display a menu for inputs --------------------------------------------------*/ - -static void menu_input_common(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - input_item_data *seqchangeditem = NULL; - input_menu_state *menustate; - const ui_menu_event *menu_event; - int invalidate = FALSE; - - /* if no state, allocate now */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL); - menustate = (input_menu_state *)state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - { - if (parameter != NULL) - menu_input_general_populate(machine, menu, menustate, (FPTR)parameter - 1); - else - menu_input_specific_populate(machine, menu, menustate); - } - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, (menustate->pollingitem != NULL) ? UI_MENU_PROCESS_NOKEYS : 0); - - /* if we are polling, handle as a special case */ - if (menustate->pollingitem != NULL) - { - input_item_data *item = menustate->pollingitem; - input_seq newseq; - - /* if UI_CANCEL is pressed, abort */ - if (ui_input_pressed(machine, IPT_UI_CANCEL)) - { - menustate->pollingitem = NULL; - menustate->record_next = FALSE; - toggle_none_default(item->seq, menustate->starting_seq, *item->defseq); - seqchangeditem = item; - } - - /* poll again; if finished, update the sequence */ - if (machine.input().seq_poll()) - { - menustate->pollingitem = NULL; - menustate->record_next = TRUE; - item->seq = machine.input().seq_poll_final(); - seqchangeditem = item; - } - } - - /* otherwise, handle the events */ - else if (menu_event != NULL && menu_event->itemref != NULL) - { - input_item_data *item = (input_item_data *)menu_event->itemref; - switch (menu_event->iptkey) - { - /* an item was selected: begin polling */ - case IPT_UI_SELECT: - menustate->pollingitem = item; - menustate->last_sortorder = item->sortorder; - menustate->starting_seq = item->seq; - machine.input().seq_poll_start((item->type == INPUT_TYPE_ANALOG) ? ITEM_CLASS_ABSOLUTE : ITEM_CLASS_SWITCH, menustate->record_next ? &item->seq : NULL); - invalidate = TRUE; - break; - - /* if the clear key was pressed, reset the selected item */ - case IPT_UI_CLEAR: - toggle_none_default(item->seq, item->seq, *item->defseq); - menustate->record_next = FALSE; - seqchangeditem = item; - break; - } - - /* if the selection changed, reset the "record next" flag */ - if (item->sortorder != menustate->last_sortorder) - menustate->record_next = FALSE; - menustate->last_sortorder = item->sortorder; - } - - /* if the sequence changed, update it */ - if (seqchangeditem != NULL) - { - /* update a general input */ - if (parameter != NULL) - { - const input_type_entry *entry = (const input_type_entry *)seqchangeditem->ref; - input_type_set_seq(machine, entry->type, entry->player, seqchangeditem->seqtype, &seqchangeditem->seq); - } - - /* update a game-specific input */ - else - { - input_field_user_settings settings; - - input_field_get_user_settings((input_field_config *)seqchangeditem->ref, &settings); - settings.seq[seqchangeditem->seqtype] = seqchangeditem->seq; - input_field_set_user_settings((input_field_config *)seqchangeditem->ref, &settings); - } - - /* invalidate the menu to force an update */ - invalidate = TRUE; - } - - /* if the menu is invalidated, clear it now */ - if (invalidate) - { - menustate->pollingref = NULL; - if (menustate->pollingitem != NULL) - menustate->pollingref = menustate->pollingitem->ref; - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - } -} - - -/*------------------------------------------------- - menu_input_compare_items - compare two - items for quicksort --------------------------------------------------*/ - -static int menu_input_compare_items(const void *i1, const void *i2) -{ - const input_item_data * const *data1 = (const input_item_data * const *)i1; - const input_item_data * const *data2 = (const input_item_data * const *)i2; - if ((*data1)->sortorder < (*data2)->sortorder) - return -1; - if ((*data1)->sortorder > (*data2)->sortorder) - return 1; - return 0; -} - - -/*------------------------------------------------- - menu_input_populate_and_sort - take a list - of input_item_data objects and build up the - menu from them --------------------------------------------------*/ - -static void menu_input_populate_and_sort(running_machine &machine, ui_menu *menu, input_item_data *itemlist, input_menu_state *menustate) -{ - const char *nameformat[INPUT_TYPE_TOTAL] = { 0 }; - input_item_data **itemarray, *item; - int numitems = 0, curitem; - astring subtext; - astring text; - - /* create a mini lookup table for name format based on type */ - nameformat[INPUT_TYPE_DIGITAL] = "%s"; - nameformat[INPUT_TYPE_ANALOG] = "%s Analog"; - nameformat[INPUT_TYPE_ANALOG_INC] = "%s Analog Inc"; - nameformat[INPUT_TYPE_ANALOG_DEC] = "%s Analog Dec"; - - /* first count the number of items */ - for (item = itemlist; item != NULL; item = item->next) - numitems++; - - /* now allocate an array of items and fill it up */ - itemarray = (input_item_data **)ui_menu_pool_alloc(menu, sizeof(*itemarray) * numitems); - for (item = itemlist, curitem = 0; item != NULL; item = item->next) - itemarray[curitem++] = item; - - /* sort it */ - qsort(itemarray, numitems, sizeof(*itemarray), menu_input_compare_items); - - /* build the menu */ - for (curitem = 0; curitem < numitems; curitem++) - { - UINT32 flags = 0; - - /* generate the name of the item itself, based off the base name and the type */ - item = itemarray[curitem]; - assert(nameformat[item->type] != NULL); - text.printf(nameformat[item->type], item->name); - - /* if we're polling this item, use some spaces with left/right arrows */ - if (menustate->pollingref == item->ref) - { - subtext.cpy(" "); - flags |= MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW; - } - - /* otherwise, generate the sequence name and invert it if different from the default */ - else - { - machine.input().seq_name(subtext, item->seq); - flags |= (item->seq != *item->defseq) ? MENU_FLAG_INVERT : 0; - } - - /* add the item */ - ui_menu_item_append(menu, text, subtext, flags, item); - } -} - - -/*------------------------------------------------- - menu_settings_dip_switches - handle the DIP - switches menu --------------------------------------------------*/ - -static void menu_settings_dip_switches(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - menu_settings_common(machine, menu, state, IPT_DIPSWITCH); -} - - -/*------------------------------------------------- - menu_settings_driver_config - handle the - driver config menu --------------------------------------------------*/ - -static void menu_settings_driver_config(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - menu_settings_common(machine, menu, state, IPT_CONFIG); -} - - -/*------------------------------------------------- - menu_settings_common - handle one of the - switches menus --------------------------------------------------*/ - -static void menu_settings_common(running_machine &machine, ui_menu *menu, void *state, UINT32 type) -{ - settings_menu_state *menustate; - const ui_menu_event *menu_event; - - /* if no state, allocate now */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*menustate), NULL); - menustate = (settings_menu_state *)state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_settings_populate(machine, menu, menustate, type); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - - /* handle events */ - if (menu_event != NULL && menu_event->itemref != NULL) - { - input_field_config *field = (input_field_config *)menu_event->itemref; - input_field_user_settings settings; - int changed = FALSE; - - switch (menu_event->iptkey) - { - /* if selected, reset to default value */ - case IPT_UI_SELECT: - input_field_get_user_settings(field, &settings); - settings.value = field->defvalue; - input_field_set_user_settings(field, &settings); - changed = TRUE; - break; - - /* left goes to previous setting */ - case IPT_UI_LEFT: - input_field_select_previous_setting(field); - changed = TRUE; - break; - - /* right goes to next setting */ - case IPT_UI_RIGHT: - input_field_select_next_setting(field); - changed = TRUE; - break; - } - - /* if anything changed, rebuild the menu, trying to stay on the same field */ - if (changed) - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - } -} - - -/*------------------------------------------------- - menu_settings_populate - populate one of the - switches menus --------------------------------------------------*/ - -static void menu_settings_populate(running_machine &machine, ui_menu *menu, settings_menu_state *menustate, UINT32 type) -{ - input_field_config *field; - input_port_config *port; - dip_descriptor **diplist_tailptr; - int dipcount = 0; - - /* reset the dip switch tracking */ - menustate->diplist = NULL; - diplist_tailptr = &menustate->diplist; - - /* loop over input ports and set up the current values */ - for (port = machine.m_portlist.first(); port != NULL; port = port->next()) - for (field = port->fieldlist().first(); field != NULL; field = field->next()) - if (field->type == type && input_condition_true(machine, &field->condition, port->owner())) - { - UINT32 flags = 0; - - /* set the left/right flags appropriately */ - if (input_field_has_previous_setting(field)) - flags |= MENU_FLAG_LEFT_ARROW; - if (input_field_has_next_setting(field)) - flags |= MENU_FLAG_RIGHT_ARROW; - - /* add the menu item */ - ui_menu_item_append(menu, input_field_name(field), input_field_setting_name(field), flags, (void *)field); - - /* for DIP switches, build up the model */ - if (type == IPT_DIPSWITCH && field->diploclist().count() != 0) - { - const input_field_diplocation *diploc; - input_field_user_settings settings; - UINT32 accummask = field->mask; - - /* get current settings */ - input_field_get_user_settings(field, &settings); - - /* iterate over each bit in the field */ - for (diploc = field->diploclist().first(); diploc != NULL; diploc = diploc->next()) - { - UINT32 mask = accummask & ~(accummask - 1); - dip_descriptor *dip; - - /* find the matching switch name */ - for (dip = menustate->diplist; dip != NULL; dip = dip->next) - if (strcmp(dip->name, diploc->swname) == 0) - break; - - /* allocate new if none */ - if (dip == NULL) - { - dip = (dip_descriptor *)ui_menu_pool_alloc(menu, sizeof(*dip)); - dip->next = NULL; - dip->name = diploc->swname; - dip->mask = dip->state = 0; - *diplist_tailptr = dip; - diplist_tailptr = &dip->next; - if (mame_stricmp(dip->name, "FAKE") != 0) - dipcount++; - } - - /* apply the bits */ - dip->mask |= 1 << (diploc->swnum - 1); - if (((settings.value & mask) != 0 && !diploc->invert) || ((settings.value & mask) == 0 && diploc->invert)) - dip->state |= 1 << (diploc->swnum - 1); - - /* clear the relevant bit in the accumulated mask */ - accummask &= ~mask; - } - } - } - - /* configure the extra menu */ - if (type == IPT_DIPSWITCH && menustate->diplist != NULL) - ui_menu_set_custom_render(menu, menu_settings_custom_render, 0.0f, dipcount * (DIP_SWITCH_HEIGHT + DIP_SWITCH_SPACING) + DIP_SWITCH_SPACING); -} - - -/*------------------------------------------------- - menu_settings_custom_render - perform our special - rendering --------------------------------------------------*/ - -static void menu_settings_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) -{ - input_field_config *field = (input_field_config *)selectedref; - settings_menu_state *menustate = (settings_menu_state *)state; - dip_descriptor *dip; - - /* add borders */ - y1 = y2 + UI_BOX_TB_BORDER; - y2 = y1 + bottom; - - /* draw extra menu area */ - ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); - y1 += (float)DIP_SWITCH_SPACING; - - /* iterate over DIP switches */ - for (dip = menustate->diplist; dip != NULL; dip = dip->next) - { - if (mame_stricmp(dip->name, "FAKE") != 0) - { - const input_field_diplocation *diploc; - UINT32 selectedmask = 0; - - /* determine the mask of selected bits */ - if (field != NULL) - for (diploc = field->diploclist().first(); diploc != NULL; diploc = diploc->next()) - if (strcmp(dip->name, diploc->swname) == 0) - selectedmask |= 1 << (diploc->swnum - 1); - - /* draw one switch */ - menu_settings_custom_render_one(menu->container, x1, y1, x2, y1 + DIP_SWITCH_HEIGHT, dip, selectedmask); - y1 += (float)(DIP_SWITCH_SPACING + DIP_SWITCH_HEIGHT); - } - } -} - - -/*------------------------------------------------- - menu_settings_custom_render_one - draw a single - DIP switch --------------------------------------------------*/ - -static void menu_settings_custom_render_one(render_container *container, float x1, float y1, float x2, float y2, const dip_descriptor *dip, UINT32 selectedmask) -{ - float switch_field_width = SINGLE_TOGGLE_SWITCH_FIELD_WIDTH * container->manager().ui_aspect(); - float switch_width = SINGLE_TOGGLE_SWITCH_WIDTH * container->manager().ui_aspect(); - int numtoggles, toggle; - float switch_toggle_gap; - float y1_off, y1_on; - - /* determine the number of toggles in the DIP */ - numtoggles = 32 - count_leading_zeros(dip->mask); - - /* center based on the number of switches */ - x1 += (x2 - x1 - numtoggles * switch_field_width) / 2; - - /* draw the dip switch name */ - ui_draw_text_full( container, - dip->name, - 0, - y1 + (DIP_SWITCH_HEIGHT - UI_TARGET_FONT_HEIGHT) / 2, - x1 - ui_get_string_width(container->manager().machine(), " "), - JUSTIFY_RIGHT, - WRAP_NEVER, - DRAW_NORMAL, - UI_TEXT_COLOR, - PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA), - NULL , - NULL); - - /* compute top and bottom for on and off positions */ - switch_toggle_gap = ((DIP_SWITCH_HEIGHT/2) - SINGLE_TOGGLE_SWITCH_HEIGHT)/2; - y1_off = y1 + UI_LINE_WIDTH + switch_toggle_gap; - y1_on = y1 + DIP_SWITCH_HEIGHT/2 + switch_toggle_gap; - - /* iterate over toggles */ - for (toggle = 0; toggle < numtoggles; toggle++) - { - float innerx1; - - /* first outline the switch */ - ui_draw_outlined_box(container, x1, y1, x1 + switch_field_width, y2, UI_BACKGROUND_COLOR); - - /* compute x1/x2 for the inner filled in switch */ - innerx1 = x1 + (switch_field_width - switch_width) / 2; - - /* see if the switch is actually used */ - if (dip->mask & (1 << toggle)) - { - float innery1 = (dip->state & (1 << toggle)) ? y1_on : y1_off; - container->add_rect(innerx1, innery1, innerx1 + switch_width, innery1 + SINGLE_TOGGLE_SWITCH_HEIGHT, - (selectedmask & (1 << toggle)) ? UI_DIPSW_COLOR : UI_TEXT_COLOR, - PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - } - else - { - container->add_rect(innerx1, y1_off, innerx1 + switch_width, y1_on + SINGLE_TOGGLE_SWITCH_HEIGHT, - UI_UNAVAILABLE_COLOR, - PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - } - - /* advance to the next switch */ - x1 += switch_field_width; - } -} - - -/*------------------------------------------------- - menu_analog - handle the analog settings menu --------------------------------------------------*/ - -static void menu_analog(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_analog_populate(machine, menu); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); - - /* handle events */ - if (menu_event != NULL && menu_event->itemref != NULL) - { - analog_item_data *data = (analog_item_data *)menu_event->itemref; - int newval = data->cur; - - switch (menu_event->iptkey) - { - /* if selected, reset to default value */ - case IPT_UI_SELECT: - newval = data->defvalue; - break; - - /* left decrements */ - case IPT_UI_LEFT: - newval -= machine.input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; - break; - - /* right increments */ - case IPT_UI_RIGHT: - newval += machine.input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; - break; - } - - /* clamp to range */ - if (newval < data->min) - newval = data->min; - if (newval > data->max) - newval = data->max; - - /* if things changed, update */ - if (newval != data->cur) - { - input_field_user_settings settings; - - /* get the settings and set the new value */ - input_field_get_user_settings(data->field, &settings); - switch (data->type) - { - case ANALOG_ITEM_KEYSPEED: settings.delta = newval; break; - case ANALOG_ITEM_CENTERSPEED: settings.centerdelta = newval; break; - case ANALOG_ITEM_REVERSE: settings.reverse = newval; break; - case ANALOG_ITEM_SENSITIVITY: settings.sensitivity = newval; break; - } - input_field_set_user_settings(data->field, &settings); - - /* rebuild the menu */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - } - } -} - - -/*------------------------------------------------- - menu_analog_populate - populate the analog - settings menu --------------------------------------------------*/ - -static void menu_analog_populate(running_machine &machine, ui_menu *menu) -{ - input_field_config *field; - input_port_config *port; - astring subtext; - astring text; - - /* loop over input ports and add the items */ - for (port = machine.m_portlist.first(); port != NULL; port = port->next()) - for (field = port->fieldlist().first(); field != NULL; field = field->next()) - if (input_type_is_analog(field->type) && input_condition_true(machine, &field->condition, port->owner())) - { - input_field_user_settings settings; - int use_autocenter = FALSE; - int type; - - /* based on the type, determine if we enable autocenter */ - switch (field->type) - { - case IPT_POSITIONAL: - case IPT_POSITIONAL_V: - if (field->flags & ANALOG_FLAG_WRAPS) - break; - - case IPT_AD_STICK_X: - case IPT_AD_STICK_Y: - case IPT_AD_STICK_Z: - case IPT_PADDLE: - case IPT_PADDLE_V: - case IPT_PEDAL: - case IPT_PEDAL2: - case IPT_PEDAL3: - use_autocenter = TRUE; - break; - } - - /* get the user settings */ - input_field_get_user_settings(field, &settings); - - /* iterate over types */ - for (type = 0; type < ANALOG_ITEM_COUNT; type++) - if (type != ANALOG_ITEM_CENTERSPEED || use_autocenter) - { - analog_item_data *data; - UINT32 flags = 0; - - /* allocate a data item for tracking what this menu item refers to */ - data = (analog_item_data *)ui_menu_pool_alloc(menu, sizeof(*data)); - data->field = field; - data->type = type; - - /* determine the properties of this item */ - switch (type) - { - default: - case ANALOG_ITEM_KEYSPEED: - text.printf("%s Digital Speed", input_field_name(field)); - subtext.printf("%d", settings.delta); - data->min = 0; - data->max = 255; - data->cur = settings.delta; - data->defvalue = field->delta; - break; - - case ANALOG_ITEM_CENTERSPEED: - text.printf("%s Autocenter Speed", input_field_name(field)); - subtext.printf("%d", settings.centerdelta); - data->min = 0; - data->max = 255; - data->cur = settings.centerdelta; - data->defvalue = field->centerdelta; - break; - - case ANALOG_ITEM_REVERSE: - text.printf("%s Reverse", input_field_name(field)); - subtext.cpy(settings.reverse ? "On" : "Off"); - data->min = 0; - data->max = 1; - data->cur = settings.reverse; - data->defvalue = ((field->flags & ANALOG_FLAG_REVERSE) != 0); - break; - - case ANALOG_ITEM_SENSITIVITY: - text.printf("%s Sensitivity", input_field_name(field)); - subtext.printf("%d", settings.sensitivity); - data->min = 1; - data->max = 255; - data->cur = settings.sensitivity; - data->defvalue = field->sensitivity; - break; - } - - /* put on arrows */ - if (data->cur > data->min) - flags |= MENU_FLAG_LEFT_ARROW; - if (data->cur < data->max) - flags |= MENU_FLAG_RIGHT_ARROW; - - /* append a menu item */ - ui_menu_item_append(menu, text, subtext, flags, data); - } - } -} - - -/*------------------------------------------------- - menu_bookkeeping - handle the bookkeeping - information menu --------------------------------------------------*/ - -static void menu_bookkeeping(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - attotime *prevtime; - attotime curtime; - - /* if no state, allocate some */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*prevtime), NULL); - prevtime = (attotime *)state; - - /* if the time has rolled over another second, regenerate */ - curtime = machine.time(); - if (prevtime->seconds != curtime.seconds) - { - ui_menu_reset(menu, UI_MENU_RESET_SELECT_FIRST); - *prevtime = curtime; - menu_bookkeeping_populate(machine, menu, prevtime); - } - - /* process the menu */ - ui_menu_process(machine, menu, 0); -} - - -/*------------------------------------------------- - menu_bookkeeping - handle the bookkeeping - information menu --------------------------------------------------*/ - -static void menu_bookkeeping_populate(running_machine &machine, ui_menu *menu, attotime *curtime) -{ - int tickets = get_dispensed_tickets(machine); - astring tempstring; - int ctrnum; - - /* show total time first */ - if (curtime->seconds >= 60 * 60) - tempstring.catprintf("Uptime: %d:%02d:%02d\n\n", curtime->seconds / (60*60), (curtime->seconds / 60) % 60, curtime->seconds % 60); - else - tempstring.catprintf("Uptime: %d:%02d\n\n", (curtime->seconds / 60) % 60, curtime->seconds % 60); - - /* show tickets at the top */ - if (tickets > 0) - tempstring.catprintf("Tickets dispensed: %d\n\n", tickets); - - /* loop over coin counters */ - for (ctrnum = 0; ctrnum < COIN_COUNTERS; ctrnum++) - { - int count = coin_counter_get_count(machine, ctrnum); - - /* display the coin counter number */ - tempstring.catprintf("Coin %c: ", ctrnum + 'A'); - - /* display how many coins */ - if (count == 0) - tempstring.cat("NA"); - else - tempstring.catprintf("%d", count); - - /* display whether or not we are locked out */ - if (coin_lockout_get_state(machine, ctrnum)) - tempstring.cat(" (locked)"); - tempstring.cat("\n"); - } - - /* append the single item */ - ui_menu_item_append(menu, tempstring, NULL, MENU_FLAG_MULTILINE, NULL); -} - - -/*------------------------------------------------- - menu_game_info - handle the game information - menu --------------------------------------------------*/ - -static void menu_game_info(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - { - astring tempstring; - ui_menu_item_append(menu, game_info_astring(machine, tempstring), NULL, MENU_FLAG_MULTILINE, NULL); - } - - /* process the menu */ - ui_menu_process(machine, menu, 0); -} - - -/*------------------------------------------------- - menu_cheat - handle the cheat menu --------------------------------------------------*/ - -static void menu_cheat(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_cheat_populate(machine, menu); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); - - /* handle events */ - if (menu_event != NULL && menu_event->itemref != NULL) - { - bool changed = false; - - /* clear cheat comment on any movement or keypress */ - popmessage(NULL); - - /* handle reset all + reset all cheats for reload all option */ - if ((FPTR)menu_event->itemref < 3 && menu_event->iptkey == IPT_UI_SELECT) - { - for (cheat_entry *curcheat = machine.cheat().first(); curcheat != NULL; curcheat = curcheat->next()) - if (curcheat->select_default_state()) - changed = true; - } - - - /* handle individual cheats */ - else if ((FPTR)menu_event->itemref > 2) - { - cheat_entry *curcheat = reinterpret_cast(menu_event->itemref); - const char *string; - switch (menu_event->iptkey) - { - /* if selected, activate a oneshot */ - case IPT_UI_SELECT: - changed = curcheat->activate(); - break; - - /* if cleared, reset to default value */ - case IPT_UI_CLEAR: - changed = curcheat->select_default_state(); - break; - - /* left decrements */ - case IPT_UI_LEFT: - changed = curcheat->select_previous_state(); - break; - - /* right increments */ - case IPT_UI_RIGHT: - changed = curcheat->select_next_state(); - break; - - /* bring up display comment if one exists */ - case IPT_UI_DISPLAY_COMMENT: - case IPT_UI_UP: - case IPT_UI_DOWN: - string = curcheat->comment(); - if (string != NULL && string[0] != 0) - popmessage("Cheat Comment:\n%s", string); - break; - } - } - - /* handle reload all */ - if ((FPTR)menu_event->itemref == 2 && menu_event->iptkey == IPT_UI_SELECT) - { - /* re-init cheat engine and thus reload cheats/cheats have already been turned off by here */ - machine.cheat().reload(); - - /* display the reloaded cheats */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - popmessage("All cheats reloaded"); - } - - /* if things changed, update */ - if (changed) - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - } -} - - -/*------------------------------------------------- - menu_cheat_populate - populate the cheat menu --------------------------------------------------*/ - -static void menu_cheat_populate(running_machine &machine, ui_menu *menu) -{ - /* iterate over cheats */ - astring text; - astring subtext; - for (cheat_entry *curcheat = machine.cheat().first(); curcheat != NULL; curcheat = curcheat->next()) - { - UINT32 flags; - curcheat->menu_text(text, subtext, flags); - ui_menu_item_append(menu, text, subtext, flags, curcheat); - } - - /* add a separator */ - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - - /* add a reset all option */ - ui_menu_item_append(menu, "Reset All", NULL, 0, (void *)1); - - /* add a reload all cheats option */ - ui_menu_item_append(menu, "Reload All", NULL, 0, (void *)2); -} - - -/*------------------------------------------------- - menu_memory_card - handle the memory card - menu --------------------------------------------------*/ - -static void menu_memory_card(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - int *cardnum; - - /* if no state, allocate some */ - if (state == NULL) - state = ui_menu_alloc_state(menu, sizeof(*cardnum), NULL); - cardnum = (int *)state; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_memory_card_populate(machine, menu, *cardnum); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); - - /* if something was selected, act on it */ - if (menu_event != NULL && menu_event->itemref != NULL) - { - FPTR item = (FPTR)menu_event->itemref; - - /* select executes actions on some of the items */ - if (menu_event->iptkey == IPT_UI_SELECT) - { - switch (item) - { - /* handle card loading; if we succeed, clear the menus */ - case MEMCARD_ITEM_LOAD: - if (memcard_insert(menu->machine(), *cardnum) == 0) - { - popmessage("Memory card loaded"); - ui_menu_stack_reset(menu->machine()); - } - else - popmessage("Error loading memory card"); - break; - - /* handle card ejecting */ - case MEMCARD_ITEM_EJECT: - memcard_eject(menu->machine()); - popmessage("Memory card ejected"); - break; - - /* handle card creating */ - case MEMCARD_ITEM_CREATE: - if (memcard_create(menu->machine(), *cardnum, FALSE) == 0) - popmessage("Memory card created"); - else - popmessage("Error creating memory card\n(Card may already exist)"); - break; - } - } - - /* the select item has extra keys */ - else if (item == MEMCARD_ITEM_SELECT) - { - switch (menu_event->iptkey) - { - /* left decrements the card number */ - case IPT_UI_LEFT: - *cardnum -= 1; - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - break; - - /* right decrements the card number */ - case IPT_UI_RIGHT: - *cardnum += 1; - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - break; - } - } - } -} - - -/*------------------------------------------------- - menu_memory_card_populate - populate the - memory card menu --------------------------------------------------*/ - -static void menu_memory_card_populate(running_machine &machine, ui_menu *menu, int cardnum) -{ - char tempstring[20]; - UINT32 flags = 0; - - /* add the card select menu */ - sprintf(tempstring, "%d", cardnum); - if (cardnum > 0) - flags |= MENU_FLAG_LEFT_ARROW; - if (cardnum < 1000) - flags |= MENU_FLAG_RIGHT_ARROW; - ui_menu_item_append(menu, "Card Number:", tempstring, flags, (void *)MEMCARD_ITEM_SELECT); - - /* add the remaining items */ - ui_menu_item_append(menu, "Load Selected Card", NULL, 0, (void *)MEMCARD_ITEM_LOAD); - if (memcard_present(machine) != -1) - ui_menu_item_append(menu, "Eject Current Card", NULL, 0, (void *)MEMCARD_ITEM_EJECT); - ui_menu_item_append(menu, "Create New Card", NULL, 0, (void *)MEMCARD_ITEM_CREATE); -} - - -/*------------------------------------------------- - menu_sliders - handle the sliders menu --------------------------------------------------*/ - -static void menu_sliders(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - int menuless_mode = (parameter != NULL); - const ui_menu_event *menu_event; - UINT8 *hidden = (UINT8 *)state; - - /* if no state, allocate some */ - if (hidden == NULL) - hidden = (UINT8 *)ui_menu_alloc_state(menu, sizeof(*hidden), NULL); - if (menuless_mode) - *hidden = TRUE; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_sliders_populate(machine, menu, menuless_mode); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT | (*hidden ? UI_MENU_PROCESS_CUSTOM_ONLY : 0)); - if (menu_event != NULL) - { - /* handle keys if there is a valid item selected */ - if (menu_event->itemref != NULL) - { - const slider_state *slider = (const slider_state *)menu_event->itemref; - INT32 curvalue = (*slider->update)(machine, slider->arg, NULL, SLIDER_NOCHANGE); - INT32 increment = 0; - - switch (menu_event->iptkey) - { - /* toggle visibility */ - case IPT_UI_ON_SCREEN_DISPLAY: - if (menuless_mode) - ui_menu_stack_pop(machine); - else - *hidden = !*hidden; - break; - - /* decrease value */ - case IPT_UI_LEFT: - if (machine.input().code_pressed(KEYCODE_LALT) || machine.input().code_pressed(KEYCODE_RALT)) - increment = -1; - else if (machine.input().code_pressed(KEYCODE_LSHIFT) || machine.input().code_pressed(KEYCODE_RSHIFT)) - increment = (slider->incval > 10) ? -(slider->incval / 10) : -1; - else if (machine.input().code_pressed(KEYCODE_LCONTROL) || machine.input().code_pressed(KEYCODE_RCONTROL)) - increment = -slider->incval * 10; - else - increment = -slider->incval; - break; - - /* increase value */ - case IPT_UI_RIGHT: - if (machine.input().code_pressed(KEYCODE_LALT) || machine.input().code_pressed(KEYCODE_RALT)) - increment = 1; - else if (machine.input().code_pressed(KEYCODE_LSHIFT) || machine.input().code_pressed(KEYCODE_RSHIFT)) - increment = (slider->incval > 10) ? (slider->incval / 10) : 1; - else if (machine.input().code_pressed(KEYCODE_LCONTROL) || machine.input().code_pressed(KEYCODE_RCONTROL)) - increment = slider->incval * 10; - else - increment = slider->incval; - break; - - /* restore default */ - case IPT_UI_SELECT: - increment = slider->defval - curvalue; - break; - } - - /* handle any changes */ - if (increment != 0) - { - INT32 newvalue = curvalue + increment; - - /* clamp within bounds */ - if (newvalue < slider->minval) - newvalue = slider->minval; - if (newvalue > slider->maxval) - newvalue = slider->maxval; - - /* update the slider and recompute the menu */ - (*slider->update)(machine, slider->arg, NULL, newvalue); - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - } - } - - /* if we are selecting an invalid item and we are hidden, skip to the next one */ - else if (*hidden) - { - /* if we got here via up or page up, select the previous item */ - if (menu_event->iptkey == IPT_UI_UP || menu_event->iptkey == IPT_UI_PAGE_UP) - { - menu->selected = (menu->selected + menu->numitems - 1) % menu->numitems; - ui_menu_validate_selection(menu, -1); - } - - /* otherwise select the next item */ - else if (menu_event->iptkey == IPT_UI_DOWN || menu_event->iptkey == IPT_UI_PAGE_DOWN) - { - menu->selected = (menu->selected + 1) % menu->numitems; - ui_menu_validate_selection(menu, 1); - } - } - } -} - - -/*------------------------------------------------- - menu_sliders_populate - populate the sliders - menu --------------------------------------------------*/ - -static void menu_sliders_populate(running_machine &machine, ui_menu *menu, int menuless_mode) -{ - const slider_state *curslider; - astring tempstring; - - /* add all sliders */ - for (curslider = ui_get_slider_list(); curslider != NULL; curslider = curslider->next) - { - INT32 curval = (*curslider->update)(machine, curslider->arg, &tempstring, SLIDER_NOCHANGE); - UINT32 flags = 0; - if (curval > curslider->minval) - flags |= MENU_FLAG_LEFT_ARROW; - if (curval < curslider->maxval) - flags |= MENU_FLAG_RIGHT_ARROW; - ui_menu_item_append(menu, curslider->description, tempstring, flags, (void *)curslider); - - if (menuless_mode) - break; - } - - /* add all sliders */ - for (curslider = (slider_state*)machine.osd().get_slider_list(); curslider != NULL; curslider = curslider->next) - { - INT32 curval = (*curslider->update)(machine, curslider->arg, &tempstring, SLIDER_NOCHANGE); - UINT32 flags = 0; - if (curval > curslider->minval) - flags |= MENU_FLAG_LEFT_ARROW; - if (curval < curslider->maxval) - flags |= MENU_FLAG_RIGHT_ARROW; - ui_menu_item_append(menu, curslider->description, tempstring, flags, (void *)curslider); - } - - ui_menu_set_custom_render(menu, menu_sliders_custom_render, 0.0f, 2.0f * ui_get_line_height(machine) + 2.0f * UI_BOX_TB_BORDER); -} - - -/*------------------------------------------------- - menu_sliders_custom_render - perform our special - rendering --------------------------------------------------*/ - -static void menu_sliders_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2) -{ - const slider_state *curslider = (const slider_state *)selectedref; - if (curslider != NULL) - { - float bar_left, bar_area_top, bar_width, bar_area_height, bar_top, bar_bottom, default_x, current_x; - float line_height = ui_get_line_height(machine); - float percentage, default_percentage; - astring tempstring; - float text_height; - INT32 curval; - - /* determine the current value and text */ - curval = (*curslider->update)(machine, curslider->arg, &tempstring, SLIDER_NOCHANGE); - - /* compute the current and default percentages */ - percentage = (float)(curval - curslider->minval) / (float)(curslider->maxval - curslider->minval); - default_percentage = (float)(curslider->defval - curslider->minval) / (float)(curslider->maxval - curslider->minval); - - /* assemble the the text */ - tempstring.ins(0, " ").ins(0, curslider->description); - - /* move us to the bottom of the screen, and expand to full width */ - y2 = 1.0f - UI_BOX_TB_BORDER; - y1 = y2 - bottom; - x1 = UI_BOX_LR_BORDER; - x2 = 1.0f - UI_BOX_LR_BORDER; - - /* draw extra menu area */ - ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); - y1 += UI_BOX_TB_BORDER; - - /* determine the text height */ - ui_draw_text_full(menu->container, tempstring, 0, 0, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, - JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, NULL, &text_height); - - /* draw the thermometer */ - bar_left = x1 + UI_BOX_LR_BORDER; - bar_area_top = y1; - bar_width = x2 - x1 - 2.0f * UI_BOX_LR_BORDER; - bar_area_height = line_height; - - /* compute positions */ - bar_top = bar_area_top + 0.125f * bar_area_height; - bar_bottom = bar_area_top + 0.875f * bar_area_height; - default_x = bar_left + bar_width * default_percentage; - current_x = bar_left + bar_width * percentage; - - /* fill in the percentage */ - menu->container->add_rect(bar_left, bar_top, current_x, bar_bottom, UI_SLIDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - - /* draw the top and bottom lines */ - menu->container->add_line(bar_left, bar_top, bar_left + bar_width, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - menu->container->add_line(bar_left, bar_bottom, bar_left + bar_width, bar_bottom, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - - /* draw default marker */ - menu->container->add_line(default_x, bar_area_top, default_x, bar_top, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - menu->container->add_line(default_x, bar_bottom, default_x, bar_area_top + bar_area_height, UI_LINE_WIDTH, UI_BORDER_COLOR, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); - - /* draw the actual text */ - ui_draw_text_full(menu->container, tempstring, x1 + UI_BOX_LR_BORDER, y1 + line_height, x2 - x1 - 2.0f * UI_BOX_LR_BORDER, - JUSTIFY_CENTER, WRAP_WORD, DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, &text_height); - } -} - - -/*------------------------------------------------- - menu_video_targets - handle the video targets - menu --------------------------------------------------*/ - -static void menu_video_targets(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_video_targets_populate(machine, menu); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - if (menu_event != NULL && menu_event->iptkey == IPT_UI_SELECT) - ui_menu_stack_push(ui_menu_alloc(machine, menu->container, menu_video_options, menu_event->itemref)); -} - - -/*------------------------------------------------- - menu_video_targets_populate - populate the - video targets menu --------------------------------------------------*/ - -static void menu_video_targets_populate(running_machine &machine, ui_menu *menu) -{ - int targetnum; - - /* find the targets */ - for (targetnum = 0; ; targetnum++) - { - render_target *target = machine.render().target_by_index(targetnum); - char buffer[40]; - - /* stop when we run out */ - if (target == NULL) - break; - - /* add a menu item */ - sprintf(buffer, "Screen #%d", targetnum); - ui_menu_item_append(menu, buffer, NULL, 0, target); - } -} - - -/*------------------------------------------------- - menu_video_options - handle the video options - menu --------------------------------------------------*/ - -static void menu_video_options(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - render_target *target = (parameter != NULL) ? (render_target *)parameter : machine.render().first_target(); - const ui_menu_event *menu_event; - int changed = FALSE; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_video_options_populate(machine, menu, target); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - if (menu_event != NULL && menu_event->itemref != NULL) - { - switch ((FPTR)menu_event->itemref) - { - /* rotate adds rotation depending on the direction */ - case VIDEO_ITEM_ROTATE: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - int delta = (menu_event->iptkey == IPT_UI_LEFT) ? ROT270 : ROT90; - target->set_orientation(orientation_add(delta, target->orientation())); - if (target->is_ui_target()) - { - render_container::user_settings settings; - menu->container->get_user_settings(settings); - settings.m_orientation = orientation_add(delta ^ ROT180, settings.m_orientation); - menu->container->set_user_settings(settings); - } - changed = TRUE; - } - break; - - /* layer config bitmasks handle left/right keys the same (toggle) */ - case VIDEO_ITEM_BACKDROPS: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_backdrops_enabled(!target->backdrops_enabled()); - changed = TRUE; - } - break; - - case VIDEO_ITEM_OVERLAYS: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_overlays_enabled(!target->overlays_enabled()); - changed = TRUE; - } - break; - - case VIDEO_ITEM_BEZELS: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_bezels_enabled(!target->bezels_enabled()); - changed = TRUE; - } - break; - - case VIDEO_ITEM_CPANELS: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_cpanels_enabled(!target->cpanels_enabled()); - changed = TRUE; - } - break; - - case VIDEO_ITEM_MARQUEES: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_marquees_enabled(!target->marquees_enabled()); - changed = TRUE; - } - break; - - case VIDEO_ITEM_ZOOM: - if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT) - { - target->set_zoom_to_screen(!target->zoom_to_screen()); - changed = TRUE; - } - break; - - /* anything else is a view item */ - default: - if (menu_event->iptkey == IPT_UI_SELECT && (int)(FPTR)menu_event->itemref >= VIDEO_ITEM_VIEW) - { - target->set_view((FPTR)menu_event->itemref - VIDEO_ITEM_VIEW); - changed = TRUE; - } - break; - } - } - - /* if something changed, rebuild the menu */ - if (changed) - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); -} - - -/*------------------------------------------------- - menu_video_options_populate - populate the - video options menu --------------------------------------------------*/ - -static void menu_video_options_populate(running_machine &machine, ui_menu *menu, render_target *target) -{ - const char *subtext = ""; - astring tempstring; - int viewnum; - int enabled; - - /* add items for each view */ - for (viewnum = 0; ; viewnum++) - { - const char *name = target->view_name(viewnum); - if (name == NULL) - break; - - /* create a string for the item, replacing underscores with spaces */ - tempstring.cpy(name).replace(0, "_", " "); - ui_menu_item_append(menu, tempstring, NULL, 0, (void *)(FPTR)(VIDEO_ITEM_VIEW + viewnum)); - } - - /* add a separator */ - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - - /* add a rotate item */ - switch (target->orientation()) - { - case ROT0: subtext = "None"; break; - case ROT90: subtext = "CW 90" UTF8_DEGREES; break; - case ROT180: subtext = "180" UTF8_DEGREES; break; - case ROT270: subtext = "CCW 90" UTF8_DEGREES; break; - } - ui_menu_item_append(menu, "Rotate", subtext, MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_ROTATE); - - /* backdrop item */ - enabled = target->backdrops_enabled(); - ui_menu_item_append(menu, "Backdrops", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_BACKDROPS); - - /* overlay item */ - enabled = target->overlays_enabled(); - ui_menu_item_append(menu, "Overlays", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_OVERLAYS); - - /* bezel item */ - enabled = target->bezels_enabled(); - ui_menu_item_append(menu, "Bezels", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_BEZELS); - - /* cpanel item */ - enabled = target->cpanels_enabled(); - ui_menu_item_append(menu, "CPanels", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_CPANELS); - - /* marquee item */ - enabled = target->marquees_enabled(); - ui_menu_item_append(menu, "Marquees", enabled ? "Enabled" : "Disabled", enabled ? MENU_FLAG_LEFT_ARROW : MENU_FLAG_RIGHT_ARROW, (void *)VIDEO_ITEM_MARQUEES); - - /* cropping */ - enabled = target->zoom_to_screen(); - ui_menu_item_append(menu, "View", enabled ? "Cropped" : "Full", enabled ? MENU_FLAG_RIGHT_ARROW : MENU_FLAG_LEFT_ARROW, (void *)VIDEO_ITEM_ZOOM); -} - - -/*------------------------------------------------- - menu_crosshair - handle the crosshair settings - menu --------------------------------------------------*/ - -static void menu_crosshair(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - const ui_menu_event *menu_event; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_crosshair_populate(machine, menu); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, UI_MENU_PROCESS_LR_REPEAT); - - /* handle events */ - if (menu_event != NULL && menu_event->itemref != NULL) - { - crosshair_user_settings settings; - crosshair_item_data *data = (crosshair_item_data *)menu_event->itemref; - int changed = FALSE; - //int set_def = FALSE; - int newval = data->cur; - - /* retreive the user settings */ - crosshair_get_user_settings(machine, data->player, &settings); - - switch (menu_event->iptkey) - { - /* if selected, reset to default value */ - case IPT_UI_SELECT: - newval = data->defvalue; - //set_def = TRUE; - break; - - /* left decrements */ - case IPT_UI_LEFT: - newval -= machine.input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; - break; - - /* right increments */ - case IPT_UI_RIGHT: - newval += machine.input().code_pressed(KEYCODE_LSHIFT) ? 10 : 1; - break; - } - - /* clamp to range */ - if (newval < data->min) - newval = data->min; - if (newval > data->max) - newval = data->max; - - /* if things changed, update */ - if (newval != data->cur) - { - switch (data->type) - { - /* visibility state */ - case CROSSHAIR_ITEM_VIS: - settings.mode = newval; - changed = TRUE; - break; - - /* auto time */ - case CROSSHAIR_ITEM_AUTO_TIME: - settings.auto_time = newval; - changed = TRUE; - break; - } - } - - /* crosshair graphic name */ - if (data->type == CROSSHAIR_ITEM_PIC) - { - if (menu_event->iptkey == IPT_UI_SELECT) - { - /* clear the name string to reset to default crosshair */ - settings.name[0] = 0; - changed = TRUE; - } - else if (menu_event->iptkey == IPT_UI_LEFT) - { - strcpy(settings.name, data->last_name); - changed = TRUE; - } - else if (menu_event->iptkey == IPT_UI_RIGHT) - { - strcpy(settings.name, data->next_name); - changed = TRUE; - } - } - - if (changed) - { - /* save the user settings */ - crosshair_set_user_settings(machine, data->player, &settings); - - /* rebuild the menu */ - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_POSITION); - } - } -} - - -/*------------------------------------------------- - menu_crosshair_populate - populate the - crosshair settings menu --------------------------------------------------*/ - -static void menu_crosshair_populate(running_machine &machine, ui_menu *menu) -{ - crosshair_user_settings settings; - crosshair_item_data *data; - char temp_text[16]; - int player; - UINT8 use_auto = FALSE; - UINT32 flags = 0; - - /* loop over player and add the manual items */ - for (player = 0; player < MAX_PLAYERS; player++) - { - /* get the user settings */ - crosshair_get_user_settings(machine, player, &settings); - - /* add menu items for usable crosshairs */ - if (settings.used) - { - /* Make sure to keep these matched to the CROSSHAIR_VISIBILITY_xxx types */ - static const char *const vis_text[] = { "Off", "On", "Auto" }; - - /* track if we need the auto time menu */ - if (settings.mode == CROSSHAIR_VISIBILITY_AUTO) use_auto = TRUE; - - /* CROSSHAIR_ITEM_VIS - allocate a data item and fill it */ - data = (crosshair_item_data *)ui_menu_pool_alloc(menu, sizeof(*data)); - data->type = CROSSHAIR_ITEM_VIS; - data->player = player; - data->min = CROSSHAIR_VISIBILITY_OFF; - data->max = CROSSHAIR_VISIBILITY_AUTO; - data->defvalue = CROSSHAIR_VISIBILITY_DEFAULT; - data->cur = settings.mode; - - /* put on arrows */ - if (data->cur > data->min) - flags |= MENU_FLAG_LEFT_ARROW; - if (data->cur < data->max) - flags |= MENU_FLAG_RIGHT_ARROW; - - /* add CROSSHAIR_ITEM_VIS menu */ - sprintf(temp_text, "P%d Visibility", player + 1); - ui_menu_item_append(menu, temp_text, vis_text[settings.mode], flags, data); - - /* CROSSHAIR_ITEM_PIC - allocate a data item and fill it */ - data = (crosshair_item_data *)ui_menu_pool_alloc(menu, sizeof(*data)); - data->type = CROSSHAIR_ITEM_PIC; - data->player = player; - data->last_name[0] = 0; - /* other data item not used by this menu */ - - /* search for crosshair graphics */ - - /* open a path to the crosshairs */ - file_enumerator path(machine.options().crosshair_path()); - const osd_directory_entry *dir; - /* reset search flags */ - int using_default = FALSE; - int finished = FALSE; - int found = FALSE; - - /* if we are using the default, then we just need to find the first in the list */ - if (strlen(settings.name) == 0) - using_default = TRUE; - - /* look for the current name, then remember the name before */ - /* and find the next name */ - while (((dir = path.next()) != NULL) && !finished) - { - int length = strlen(dir->name); - - /* look for files ending in .png with a name not larger then 9 chars*/ - if ((length > 4) && (length <= CROSSHAIR_PIC_NAME_LENGTH + 4) && - dir->name[length - 4] == '.' && - tolower((UINT8)dir->name[length - 3]) == 'p' && - tolower((UINT8)dir->name[length - 2]) == 'n' && - tolower((UINT8)dir->name[length - 1]) == 'g') - - { - /* remove .png from length */ - length -= 4; - - if (found || using_default) - { - /* get the next name */ - strncpy(data->next_name, dir->name, length); - data->next_name[length] = 0; - finished = TRUE; - } - else if (!strncmp(dir->name, settings.name, length)) - { - /* we found the current name */ - /* so loop once more to find the next name */ - found = TRUE; - } - else - /* remember last name */ - /* we will do it here in case files get added to the directory */ - { - strncpy(data->last_name, dir->name, length); - data->last_name[length] = 0; - } - } - } - /* if name not found then next item is DEFAULT */ - if (!found && !using_default) - { - data->next_name[0] = 0; - finished = TRUE; - } - /* setup the selection flags */ - flags = 0; - if (finished) - flags |= MENU_FLAG_RIGHT_ARROW; - if (found) - flags |= MENU_FLAG_LEFT_ARROW; - - /* add CROSSHAIR_ITEM_PIC menu */ - sprintf(temp_text, "P%d Crosshair", player + 1); - ui_menu_item_append(menu, temp_text, using_default ? "DEFAULT" : settings.name, flags, data); - } - } - if (use_auto) - { - /* any player can be used to get the autotime */ - crosshair_get_user_settings(machine, 0, &settings); - - /* CROSSHAIR_ITEM_AUTO_TIME - allocate a data item and fill it */ - data = (crosshair_item_data *)ui_menu_pool_alloc(menu, sizeof(*data)); - data->type = CROSSHAIR_ITEM_AUTO_TIME; - data->min = CROSSHAIR_VISIBILITY_AUTOTIME_MIN; - data->max = CROSSHAIR_VISIBILITY_AUTOTIME_MAX; - data->defvalue = CROSSHAIR_VISIBILITY_AUTOTIME_DEFAULT; - data->cur = settings.auto_time; - - /* put on arrows in visible menu */ - if (data->cur > data->min) - flags |= MENU_FLAG_LEFT_ARROW; - if (data->cur < data->max) - flags |= MENU_FLAG_RIGHT_ARROW; - - /* add CROSSHAIR_ITEM_AUTO_TIME menu */ - sprintf(temp_text, "%d", settings.auto_time); - ui_menu_item_append(menu, "Visible Delay", temp_text, flags, data); - } -// else -// /* leave a blank filler line when not in auto time so size does not rescale */ -// ui_menu_item_append(menu, "", "", NULL, NULL); -} - - -/*------------------------------------------------- - menu_quit_game - handle the "menu" for - quitting the game --------------------------------------------------*/ - -static void menu_quit_game(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - /* request a reset */ - machine.schedule_exit(); - - /* reset the menu stack */ - ui_menu_stack_reset(machine); -} - - -/*------------------------------------------------- - menu_select_game - handle the game select - menu --------------------------------------------------*/ - -static void menu_select_game(running_machine &machine, ui_menu *menu, void *parameter, void *state) -{ - select_game_state *menustate; - const ui_menu_event *menu_event; - - /* if no state, allocate some */ - if (state == 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; - - /* if the menu isn't built, populate now */ - if (!ui_menu_populated(menu)) - menu_select_game_populate(machine, menu, menustate); - - /* ignore pause keys by swallowing them before we process the menu */ - ui_input_pressed(machine, IPT_UI_PAUSE); - - /* process the menu */ - menu_event = ui_menu_process(machine, menu, 0); - if (menu_event != NULL && menu_event->itemref != NULL) - { - /* reset the error on any future menu_event */ - if (menustate->error) - menustate->error = FALSE; - - /* handle selections */ - else if (menu_event->iptkey == IPT_UI_SELECT) - { - const game_driver *driver = (const game_driver *)menu_event->itemref; - - /* special case for configure inputs */ - if ((FPTR)driver == 1) - ui_menu_stack_push(ui_menu_alloc(menu->machine(), menu->container, menu_input_groups, NULL)); - - /* anything else is a driver */ - else - { - // 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 - else - { - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - menustate->error = TRUE; - } - } - } - - /* escape pressed with non-empty text clears the text */ - else if (menu_event->iptkey == IPT_UI_CANCEL && menustate->search[0] != 0) - { - /* since we have already been popped, we must recreate ourself from scratch */ - ui_menu_stack_push(ui_menu_alloc(menu->machine(), menu->container, menu_select_game, NULL)); - } - - /* typed characters append to the buffer */ - else if (menu_event->iptkey == IPT_SPECIAL) - { - int buflen = strlen(menustate->search); - - /* if it's a backspace and we can handle it, do so */ - if ((menu_event->unichar == 8 || menu_event->unichar == 0x7f) && buflen > 0) - { - *(char *)utf8_previous_char(&menustate->search[buflen]) = 0; - menustate->rerandomize = TRUE; - ui_menu_reset(menu, UI_MENU_RESET_SELECT_FIRST); - } - - /* if it's any other key and we're not maxed out, update */ - else if (menu_event->unichar >= ' ' && menu_event->unichar < 0x7f) - { - buflen += utf8_from_uchar(&menustate->search[buflen], ARRAY_LENGTH(menustate->search) - buflen, menu_event->unichar); - menustate->search[buflen] = 0; - ui_menu_reset(menu, UI_MENU_RESET_SELECT_FIRST); - } - } - } - - /* if we're in an error state, overlay an error message */ - if (menustate->error) - ui_draw_text_box(menu->container, - "The selected game is missing one or more required ROM or CHD images. " - "Please select a different game.\n\nPress any key to continue.", - JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR); -} - - -/*------------------------------------------------- - menu_select_game_populate - populate the game - select menu --------------------------------------------------*/ - -static void menu_select_game_populate(running_machine &machine, ui_menu *menu, select_game_state *menustate) -{ - int matchcount; - int curitem; - - /* update our driver list if necessary */ - if (menustate->driverlist[0] == NULL) - menu_select_game_build_driver_list(menu, menustate); - for (curitem = matchcount = 0; menustate->driverlist[curitem] != NULL && matchcount < VISIBLE_GAMES_IN_LIST; curitem++) - if (!(menustate->driverlist[curitem]->flags & GAME_NO_STANDALONE)) - matchcount++; - - /* if nothing there, add a single multiline item and return */ - if (matchcount == 0) - { - ui_menu_item_append(menu, "No "GAMESNOUN" found. Please check the rompath specified in the "CONFIGNAME".ini file.\n\n" - "If this is your first time using "APPNAME", please see the config.txt file in " - "the docs directory for information on configuring "APPNAME".", NULL, MENU_FLAG_MULTILINE | MENU_FLAG_REDTEXT, NULL); - return; - } - - /* otherwise, rebuild the match list */ - 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++) - { - int curmatch = menustate->matchlist[curitem]; - if (curmatch != -1) - { - 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)); - } - } - - /* if we're forced into this, allow general input configuration as well */ - if (ui_menu_is_force_game_select()) - { - ui_menu_item_append(menu, MENU_SEPARATOR_ITEM, NULL, 0, NULL); - ui_menu_item_append(menu, "Configure General Inputs", NULL, 0, (void *)1); - } - - /* configure the custom rendering */ - ui_menu_set_custom_render(menu, menu_select_game_custom_render, ui_get_line_height(machine) + 3.0f * UI_BOX_TB_BORDER, 4.0f * ui_get_line_height(machine) + 3.0f * UI_BOX_TB_BORDER); -} - - -/*------------------------------------------------- - 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) -{ - // 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 = global_alloc(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()); - const osd_directory_entry *dir; - - /* iterate while we get new objects */ - while ((dir = path.next()) != NULL) - { - char drivername[50]; - char *dst = drivername; - const char *src; - - /* build a name for it */ - for (src = dir->name; *src != 0 && *src != '.' && dst < &drivername[ARRAY_LENGTH(drivername) - 1]; src++) - *dst++ = tolower((UINT8)*src); - *dst = 0; - - int drivnum = drivlist->find(drivername); - if (drivnum != -1) - drivlist->include(drivnum); - } - - /* now build the final list */ - drivlist->reset(); - int listnum = 0; - while (drivlist->next()) - menustate->driverlist[listnum++] = &drivlist->driver(); - - /* NULL-terminate */ - menustate->driverlist[listnum] = NULL; -} - - -/*------------------------------------------------- - menu_select_game_custom_render - perform our - special rendering --------------------------------------------------*/ - -static void menu_select_game_custom_render(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) -{ - select_game_state *menustate = (select_game_state *)state; - const game_driver *driver; - float width, maxwidth; - float x1, y1, x2, y2; - char tempbuf[4][256]; - rgb_t color; - int line; - - /* display the current typeahead */ - if (menustate->search[0] != 0) - sprintf(&tempbuf[0][0], "Type name or select: %s_", menustate->search); - else - sprintf(&tempbuf[0][0], "Type name or select: (random)"); - - /* get the size of the text */ - ui_draw_text_full(menu->container, &tempbuf[0][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); - width += 2 * UI_BOX_LR_BORDER; - maxwidth = MAX(width, origx2 - origx1); - - /* compute our bounds */ - x1 = 0.5f - 0.5f * maxwidth; - x2 = x1 + maxwidth; - y1 = origy1 - top; - y2 = origy1 - UI_BOX_TB_BORDER; - - /* draw a box */ - ui_draw_outlined_box(menu->container, x1, y1, x2, y2, UI_BACKGROUND_COLOR); - - /* take off the borders */ - x1 += UI_BOX_LR_BORDER; - x2 -= UI_BOX_LR_BORDER; - y1 += UI_BOX_TB_BORDER; - y2 -= UI_BOX_TB_BORDER; - - /* draw the text within it */ - ui_draw_text_full(menu->container, &tempbuf[0][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); - - /* determine the text to render below */ - driver = ((FPTR)selectedref > 1) ? (const game_driver *)selectedref : NULL; - if ((FPTR)driver > 1) - { - const char *gfxstat, *soundstat; - - /* first line is game name */ - sprintf(&tempbuf[0][0], "%-.100s", driver->description); - - /* next line is year, manufacturer */ - sprintf(&tempbuf[1][0], "%s, %-.100s", driver->year, driver->manufacturer); - - /* next line is overall driver status */ - if (driver->flags & GAME_NOT_WORKING) - strcpy(&tempbuf[2][0], "Overall: NOT WORKING"); - else if (driver->flags & GAME_UNEMULATED_PROTECTION) - strcpy(&tempbuf[2][0], "Overall: Unemulated Protection"); - else - strcpy(&tempbuf[2][0], "Overall: Working"); - - /* next line is graphics, sound status */ - if (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS)) - gfxstat = "Imperfect"; - else - gfxstat = "OK"; - - if (driver->flags & GAME_NO_SOUND) - soundstat = "Unimplemented"; - else if (driver->flags & GAME_IMPERFECT_SOUND) - soundstat = "Imperfect"; - else - soundstat = "OK"; - - sprintf(&tempbuf[3][0], "Gfx: %s, Sound: %s", gfxstat, soundstat); - } - else - { - const char *s = COPYRIGHT; - line = 0; - int col = 0; - - /* first line is version string */ - sprintf(&tempbuf[line++][0], "%s %s", APPLONGNAME, build_version); - - /* output message */ - while (line < ARRAY_LENGTH(tempbuf)) - { - if (*s == 0 || *s == '\n') - { - tempbuf[line++][col] = 0; - col = 0; - } - else - tempbuf[line][col++] = *s; - - if (*s != 0) - s++; - } - } - - /* get the size of the text */ - maxwidth = origx2 - origx1; - for (line = 0; line < 4; line++) - { - ui_draw_text_full(menu->container, &tempbuf[line][0], 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, NULL); - width += 2 * UI_BOX_LR_BORDER; - maxwidth = MAX(maxwidth, width); - } - - /* compute our bounds */ - x1 = 0.5f - 0.5f * maxwidth; - x2 = x1 + maxwidth; - y1 = origy2 + UI_BOX_TB_BORDER; - y2 = origy2 + bottom; - - /* draw a box */ - color = UI_BACKGROUND_COLOR; - if (driver != NULL) - color = UI_GREEN_COLOR; - if (driver != NULL && (driver->flags & (GAME_IMPERFECT_GRAPHICS | GAME_WRONG_COLORS | GAME_IMPERFECT_COLORS | GAME_NO_SOUND | GAME_IMPERFECT_SOUND)) != 0) - color = UI_YELLOW_COLOR; - if (driver != NULL && (driver->flags & (GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION)) != 0) - color = UI_RED_COLOR; - ui_draw_outlined_box(menu->container, x1, y1, x2, y2, color); - - /* take off the borders */ - x1 += UI_BOX_LR_BORDER; - x2 -= UI_BOX_LR_BORDER; - y1 += UI_BOX_TB_BORDER; - y2 -= UI_BOX_TB_BORDER; - - /* draw all lines */ - for (line = 0; line < 4; line++) - { - ui_draw_text_full(menu->container, &tempbuf[line][0], x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE, - DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, NULL, NULL); - y1 += ui_get_line_height(machine); - } -} - - - /*************************************************************************** MENU HELPERS ***************************************************************************/ /*------------------------------------------------- - menu_render_triangle - render a triangle that + render_triangle - render a triangle that is used for up/down arrows and left/right indicators -------------------------------------------------*/ -static void menu_render_triangle(bitmap_t &dest, const bitmap_t &source, const rectangle &sbounds, void *param) +void ui_menu::render_triangle(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param) { - int halfwidth = dest.width / 2; - int height = dest.height; + int halfwidth = dest.width() / 2; + int height = dest.height(); int x, y; /* start with all-transparent */ - bitmap_fill(&dest, NULL, MAKE_ARGB(0x00,0x00,0x00,0x00)); + dest.fill(MAKE_ARGB(0x00,0x00,0x00,0x00)); /* render from the tip to the bottom */ for (y = 0; y < height; y++) { int linewidth = (y * (halfwidth - 1) + (height / 2)) * 255 * 2 / height; - UINT32 *target = BITMAP_ADDR32(&dest, y, halfwidth); + UINT32 *target = &dest.pix32(y, halfwidth); /* don't antialias if height < 12 */ - if (dest.height < 12) + if (dest.height() < 12) { int pixels = (linewidth + 254) / 255; if (pixels % 2 == 0) pixels++; diff -Nru mame-0.144/src/emu/uimenu.h mame-0.145/src/emu/uimenu.h --- mame-0.144/src/emu/uimenu.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/uimenu.h 2012-02-06 21:30:28.000000000 +0000 @@ -57,98 +57,139 @@ /* menu-related callback functions */ -typedef void (*ui_menu_handler_func)(running_machine &machine, ui_menu *menu, void *parameter, void *state); typedef void (*ui_menu_custom_func)(running_machine &machine, ui_menu *menu, void *state, void *selectedref, float top, float bottom, float x, float y, float x2, float y2); -typedef void (*ui_menu_destroy_state_func)(ui_menu *menu, void *state); /* menu-related events */ -typedef struct _ui_menu_event ui_menu_event; -struct _ui_menu_event +struct ui_menu_event { void * itemref; /* reference for the selected item */ int iptkey; /* one of the IPT_* values from inptport.h */ unicode_char unichar; /* unicode character if iptkey == IPT_SPECIAL */ }; +struct ui_menu_pool +{ + ui_menu_pool * next; /* chain to next one */ + UINT8 * top; /* top of the pool */ + UINT8 * end; /* end of the pool */ +}; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- core system management ----- */ +class ui_menu_item +{ +public: + const char * text; + const char * subtext; + UINT32 flags; + void * ref; -/* initialization */ -void ui_menu_init(running_machine &machine); + inline bool is_selectable() const; +}; +class ui_menu +{ +public: + ui_menu(running_machine &machine, render_container *container); + virtual ~ui_menu(); + running_machine &machine() const { return m_machine; } -/* ----- core menu management ----- */ + render_container * container; /* render_container we render to */ + ui_menu_event menu_event; /* the UI menu_event that occurred */ + ui_menu * parent; /* pointer to parent menu */ + int resetpos; /* reset position */ + void * resetref; /* reset reference */ + int selected; /* which item is selected */ + int hover; /* which item is being hovered over */ + int visitems; /* number of visible items */ + int numitems; /* number of items in the menu */ + int allocitems; /* allocated size of array */ + ui_menu_item * item; /* pointer to array of items */ + float customtop; /* amount of extra height to add at the top */ + float custombottom; /* amount of extra height to add at the bottom */ + ui_menu_pool * pool; /* list of memory pools */ -/* allocate a new menu */ -ui_menu *ui_menu_alloc(running_machine &machine, render_container *container, ui_menu_handler_func handler, void *parameter); + /* free all items in the menu, and all memory allocated from the memory pool */ + void reset(ui_menu_reset_options options); -/* free a menu */ -void ui_menu_free(ui_menu *menu); + /* returns true if the menu has any non-default items in it */ + bool populated(); -/* free all items in the menu, and all memory allocated from the memory pool */ -void ui_menu_reset(ui_menu *menu, ui_menu_reset_options options); + /* append a new item to the end of the menu */ + void item_append(const char *text, const char *subtext, UINT32 flags, void *ref); -/* returns TRUE if the menu has any non-default items in it */ -int ui_menu_populated(ui_menu *menu); + /* process a menu, drawing it and returning any interesting events */ + const ui_menu_event *process(UINT32 flags); -/* append a new item to the end of the menu */ -void ui_menu_item_append(ui_menu *menu, const char *text, const char *subtext, UINT32 flags, void *ref); + /* configure the menu for custom rendering */ + virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2); -/* process a menu, drawing it and returning any interesting events */ -const ui_menu_event *ui_menu_process(running_machine &machine, ui_menu *menu, UINT32 flags); + /* allocate temporary memory from the menu's memory pool */ + void *m_pool_alloc(size_t size); -/* configure the menu for custom rendering */ -void ui_menu_set_custom_render(ui_menu *menu, ui_menu_custom_func custom, float top, float bottom); + /* make a temporary string copy in the menu's memory pool */ + const char *pool_strdup(const char *string); -/* allocate permanent memory to represent the menu's state */ -void *ui_menu_alloc_state(ui_menu *menu, size_t size, ui_menu_destroy_state_func destroy_state); + /* retrieves the index of the currently selected menu item */ + void *get_selection(); -/* allocate temporary memory from the menu's memory pool */ -void *ui_menu_pool_alloc(ui_menu *menu, size_t size); + /* changes the index of the currently selected menu item */ + void set_selection(void *selected_itemref); -/* make a temporary string copy in the menu's memory pool */ -const char *ui_menu_pool_strdup(ui_menu *menu, const char *string); + /* request the specific handling of the game selection main menu */ + bool is_special_main_menu() const; + void set_special_main_menu(bool disable); -/* retrieves the index of the currently selected menu item */ -void *ui_menu_get_selection(ui_menu *menu); + /* Global initialization */ + static void init(running_machine &machine); + static void exit(running_machine &machine); -/* changes the index of the currently selected menu item */ -void ui_menu_set_selection(ui_menu *menu, void *selected_itemref); + /* reset the menus, clearing everything */ + static void stack_reset(running_machine &machine); + /* push a new menu onto the stack */ + static void stack_push(ui_menu *menu); + /* pop a menu from the stack */ + static void stack_pop(running_machine &machine); -/* ----- menu stack management ----- */ + /* test if one of the menus in the stack requires hide disable */ + static bool stack_has_special_main_menu(); -/* reset the menus, clearing everything */ -void ui_menu_stack_reset(running_machine &machine); +/* master handler */ + static UINT32 ui_handler(running_machine &machine, render_container *container, UINT32 state); -/* push a new menu onto the stack */ -void ui_menu_stack_push(ui_menu *menu); + /* Used by sliders */ + void validate_selection(int scandir); + static ui_menu *menu_stack; -/* pop a menu from the stack */ -void ui_menu_stack_pop(running_machine &machine); + void do_handle(); + /* To be reimplemented in the menu subclass */ + virtual void populate() = 0; + /* To be reimplemented in the menu subclass */ + virtual void handle() = 0; -/* ----- UI system interaction ----- */ +private: + static ui_menu *menu_free; + static bitmap_rgb32 *hilight_bitmap; + static render_texture *hilight_texture, *arrow_texture; -/* master handler */ -UINT32 ui_menu_ui_handler(running_machine &machine, render_container *container, UINT32 state); + bool special_main_menu; -/* slider handler */ -UINT32 ui_slider_ui_handler(running_machine &machine, render_container *container, UINT32 state); + running_machine & m_machine; /* machine we are attached to */ -/* force game select menu */ -void ui_menu_force_game_select(running_machine &machine, render_container *container); -int ui_menu_is_force_game_select(void); + void draw(bool customonly); + void draw_text_box(); + void handle_events(); + void handle_keys(UINT32 flags); + void clear_free_list(); + inline bool exclusive_input_pressed(int key, int repeat); + static void clear_free_list(running_machine &machine); + static void render_triangle(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param); +}; #endif /* __UIMENU_H__ */ diff -Nru mame-0.144/src/emu/uiswlist.c mame-0.145/src/emu/uiswlist.c --- mame-0.144/src/emu/uiswlist.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/uiswlist.c 2012-02-06 21:30:27.000000000 +0000 @@ -12,6 +12,7 @@ #include "emu.h" #include "ui.h" #include "uimenu.h" +#include "uiswlist.h" #include "softlist.h" @@ -27,110 +28,63 @@ TYPE DEFINITIONS ***************************************************************************/ -/* state of a software entry */ -typedef struct _software_entry_state software_entry_state; -struct _software_entry_state -{ - software_entry_state *next; - - const char *short_name; - const char *long_name; - const char *interface; - char *list_name; - device_image_interface* image; -}; - -/* state of the software menu */ -typedef struct _software_menu_state software_menu_state; -struct _software_menu_state -{ - char *list_name; /* currently selected list */ - device_image_interface* image; - software_entry_state *entrylist; - char filename_buffer[1024]; - int ordered_by_shortname; - int reorder; -}; - -/* state of a software part */ -typedef struct _software_part_state software_part_state; -struct _software_part_state -{ - const char *part_name; - const char *interface; -}; - - -static void ui_mess_menu_populate_software_parts(running_machine &machine, ui_menu *menu, const char *swlist, const char *swinfo, const char *interface) +ui_menu_software_parts::ui_menu_software_parts(running_machine &machine, render_container *container, const software_info *_info, const char *_interface, const software_part **part, bool _opt_fmgr, int *_result) : ui_menu(machine, container) { - software_list *list = software_list_open(machine.options(), swlist, FALSE, NULL); + info = _info; + interface = _interface; + selected_part = part; + opt_fmgr = _opt_fmgr; + result = _result; +} - if (list) +void ui_menu_software_parts::populate() +{ + for (const software_part *swpart = software_find_part(info, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) { - software_info *info = software_list_find(list, swinfo, NULL); - - if (info) + if (strcmp(interface, swpart->interface_) == 0) { - for (software_part *swpart = software_find_part(info, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) + software_part_menu_entry *entry = (software_part_menu_entry *) m_pool_alloc(sizeof(*entry)); + // check if the available parts have specific part_id to be displayed (e.g. "Map Disc", "Bonus Disc", etc.) + // if not, we simply display "part_name"; if yes we display "part_name (part_id)" + astring menu_part_name(swpart->name); + if (software_part_get_feature(swpart, "part_id") != NULL) { - if (strcmp(interface, swpart->interface_) == 0) - { - software_part_state *entry = (software_part_state *) ui_menu_pool_alloc(menu, sizeof(*entry)); - // check if the available parts have specific part_id to be displayed (e.g. "Map Disc", "Bonus Disc", etc.) - // if not, we simply display "part_name"; if yes we display "part_name (part_id)" - astring menu_part_name(swpart->name); - if (software_part_get_feature(swpart, "part_id") != NULL) - { - menu_part_name.cat(" ("); - menu_part_name.cat(software_part_get_feature(swpart, "part_id")); - menu_part_name.cat(")"); - } - entry->part_name = ui_menu_pool_strdup(menu, swpart->name); // part_name is later used to build up the filename to load, so we use swpart->name! - entry->interface = ui_menu_pool_strdup(menu, swpart->interface_); - ui_menu_item_append(menu, info->shortname, menu_part_name.cstr(), 0, entry); - } + menu_part_name.cat(" ("); + menu_part_name.cat(software_part_get_feature(swpart, "part_id")); + menu_part_name.cat(")"); } + entry->type = T_ENTRY; + entry->part = swpart; + item_append(info->shortname, menu_part_name.cstr(), 0, entry); } - - software_list_close(list); + } + if(opt_fmgr) { + software_part_menu_entry *entry = (software_part_menu_entry *) m_pool_alloc(sizeof(*entry)); + entry->type = T_FMGR; + entry->part = 0; + item_append("[file manager]", 0, 0, entry); } } -void ui_mess_menu_software_parts(running_machine &machine, ui_menu *menu, void *parameter, void *state) +ui_menu_software_parts::~ui_menu_software_parts() { - const ui_menu_event *event; - software_entry_state *sw_state = (software_entry_state *)state; - const char *swlist = sw_state->list_name; - const char *swinfo = sw_state->short_name; - const char *interface = sw_state->interface; - - // generate list of available parts - if (!ui_menu_populated(menu)) - { - if (sw_state->list_name) - { - ui_mess_menu_populate_software_parts(machine, menu, swlist, swinfo, interface); - } - } +} +void ui_menu_software_parts::handle() +{ /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); if (event != NULL && event->iptkey == IPT_UI_SELECT && event->itemref != NULL) { - software_part_state *entry = (software_part_state *) event->itemref; - - // build the name for the part to be loaded - astring temp_name(sw_state->short_name); - temp_name.cat(":"); - temp_name.cat(entry->part_name); - //printf("%s\n", temp_name.cstr()); - - sw_state->image->load(temp_name.cstr()); + software_part_menu_entry *entry = (software_part_menu_entry *) event->itemref; + *result = entry->type; + *selected_part = entry->part; + ui_menu::stack_pop(machine()); } } -static int compare_software_entries(const software_entry_state *e1, const software_entry_state *e2, int shortname) +int ui_menu_software_list::compare_entries(const entry_info *e1, const entry_info *e2, bool shortname) { int result; const char *e1_basename; @@ -165,190 +119,154 @@ /* populate a specific list */ -static software_entry_state *append_software_entry(ui_menu *menu, software_menu_state *menustate, - software_info *swinfo, char *list_name, device_image_interface* image) +ui_menu_software_list::entry_info *ui_menu_software_list::append_software_entry(const software_info *swinfo) { - software_entry_state *entry = NULL; - software_entry_state **entryptr; - const char *interface = image->image_interface(); + entry_info *entry = NULL; + entry_info **entryptr; + bool entry_updated = FALSE; // check if at least one of the parts has the correct interface and add a menu entry only in this case - for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) + for (const software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) { - if (strcmp(interface, swpart->interface_) == 0) + if ((strcmp(interface, swpart->interface_) == 0) && is_software_compatible(swpart, swlist)) { + entry_updated = TRUE; // allocate a new entry - entry = (software_entry_state *) ui_menu_pool_alloc(menu, sizeof(*entry)); + entry = (entry_info *) m_pool_alloc(sizeof(*entry)); memset(entry, 0, sizeof(*entry)); - entry->short_name = ui_menu_pool_strdup(menu, swinfo->shortname); - entry->long_name = ui_menu_pool_strdup(menu, swinfo->longname); - entry->list_name = list_name; - entry->image = image; - entry->interface = ui_menu_pool_strdup(menu, swpart->interface_); + entry->short_name = pool_strdup(swinfo->shortname); + entry->long_name = pool_strdup(swinfo->longname); break; } } - // find the end of the list - entryptr = &menustate->entrylist; - while ((*entryptr != NULL) && (compare_software_entries(entry, *entryptr, menustate->ordered_by_shortname) >= 0)) - entryptr = &(*entryptr)->next; - - // insert the entry - entry->next = *entryptr; - *entryptr = entry; + // skip this if no new entry has been allocated (e.g. if the software has no matching interface for this image device) + if (entry_updated) + { + // find the end of the list + entryptr = &entrylist; + while ((*entryptr != NULL) && (compare_entries(entry, *entryptr, ordered_by_shortname) >= 0)) + entryptr = &(*entryptr)->next; + + // insert the entry + entry->next = *entryptr; + *entryptr = entry; + } return entry; } +ui_menu_software_list::ui_menu_software_list(running_machine &machine, render_container *container, const software_list_device *_swlist, const char *_interface, astring &_result) : ui_menu(machine, container), result(_result) +{ + swlist = _swlist; + interface = _interface; + entrylist = NULL; + ordered_by_shortname = true; +} + +ui_menu_software_list::~ui_menu_software_list() +{ +} -static void ui_mess_menu_populate_software_entries(running_machine &machine, ui_menu *menu, software_menu_state *menustate) +void ui_menu_software_list::populate() { - software_list *list = software_list_open(machine.options(), menustate->list_name, FALSE, NULL); + const software_list *list = software_list_open(machine().options(), swlist->list_name(), false, NULL); // build up the list of entries for the menu if (list) { - for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) - append_software_entry(menu, menustate, swinfo, menustate->list_name, menustate->image); + for (const software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) + append_software_entry(swinfo); software_list_close(list); } // add an entry to change ordering - ui_menu_item_append(menu, "Switch Item Ordering", NULL, 0, (void *)1); + item_append("Switch Item Ordering", NULL, 0, (void *)1); // append all of the menu entries - for (software_entry_state *entry = menustate->entrylist; entry != NULL; entry = entry->next) - ui_menu_item_append(menu, entry->short_name, entry->long_name, 0, entry); -} - -bool swinfo_has_multiple_parts(software_info *swinfo, const char *interface) -{ - int count = 0; - - for (software_part *swpart = software_find_part(swinfo, NULL, NULL); swpart != NULL; swpart = software_part_next(swpart)) - { - if (strcmp(interface, swpart->interface_) == 0) - count++; - } - return (count > 1) ? TRUE : FALSE; + for (entry_info *entry = entrylist; entry != NULL; entry = entry->next) + item_append(entry->short_name, entry->long_name, 0, entry); } -void ui_mess_menu_software_list(running_machine &machine, ui_menu *menu, void *parameter, void *state) +void ui_menu_software_list::handle() { - const ui_menu_event *event; - software_menu_state *sw_state = (software_menu_state *)state; - const software_entry_state *entry; - const software_entry_state *selected_entry = NULL; + const entry_info *entry; + const entry_info *selected_entry = NULL; int bestmatch = 0; - if (!ui_menu_populated(menu) || sw_state->reorder) - { - sw_state->reorder = 0; - - if (sw_state->list_name) - { - ui_mess_menu_populate_software_entries(machine, menu, sw_state); - } - } - /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); if (event != NULL && event->itemref != NULL) { if ((FPTR)event->itemref == 1 && event->iptkey == IPT_UI_SELECT) { - sw_state->ordered_by_shortname ^= 1; - sw_state->reorder = 1; - sw_state->entrylist = NULL; + ordered_by_shortname = !ordered_by_shortname; + entrylist = NULL; // reset the char buffer if we change ordering criterion - memset(sw_state->filename_buffer, '\0', ARRAY_LENGTH(sw_state->filename_buffer)); + memset(filename_buffer, '\0', ARRAY_LENGTH(filename_buffer)); // reload the menu with the new order - ui_menu_reset(menu, UI_MENU_RESET_REMEMBER_REF); - popmessage("Switched Order: entries now ordered by %s", sw_state->ordered_by_shortname ? "shortname" : "description"); + reset(UI_MENU_RESET_REMEMBER_REF); + popmessage("Switched Order: entries now ordered by %s", ordered_by_shortname ? "shortname" : "description"); } /* handle selections */ else if (event->iptkey == IPT_UI_SELECT) { - device_image_interface *image = sw_state->image; - software_entry_state *entry = (software_entry_state *) event->itemref; - software_list *tmp_list = software_list_open(machine.options(), sw_state->list_name, FALSE, NULL); - software_info *tmp_info = software_list_find(tmp_list, entry->short_name, NULL); - - // if the selected software has multiple parts that can be loaded, open the submenu - if (swinfo_has_multiple_parts(tmp_info, image->image_interface())) - { - ui_menu *child_menu = ui_menu_alloc(machine, &machine.render().ui_container(), ui_mess_menu_software_parts, entry); - software_entry_state *child_menustate = (software_entry_state *)ui_menu_alloc_state(child_menu, sizeof(*child_menustate), NULL); - child_menustate->short_name = entry->short_name; - child_menustate->interface = image->image_interface(); - child_menustate->list_name = sw_state->list_name; - child_menustate->image = image; - ui_menu_stack_push(child_menu); - } - else - { - // otherwise, load the file - image->load(entry->short_name); - } - software_list_close(tmp_list); - - // reset the char buffer when pressing IPT_UI_SELECT - if (sw_state->filename_buffer[0] != '\0') - memset(sw_state->filename_buffer, '\0', ARRAY_LENGTH(sw_state->filename_buffer)); + entry_info *entry = (entry_info *) event->itemref; + result = entry->short_name; + ui_menu::stack_pop(machine()); } else if (event->iptkey == IPT_SPECIAL) { - int buflen = strlen(sw_state->filename_buffer); - bool update_selected = FALSE; + int buflen = strlen(filename_buffer); + bool update_selected = false; /* if it's a backspace and we can handle it, do so */ if ((event->unichar == 8 || event->unichar == 0x7f) && buflen > 0) { - *(char *)utf8_previous_char(&sw_state->filename_buffer[buflen]) = 0; - update_selected = TRUE; + *(char *)utf8_previous_char(&filename_buffer[buflen]) = 0; + update_selected = true; - if (ARRAY_LENGTH(sw_state->filename_buffer) > 0) - ui_popup_time(ERROR_MESSAGE_TIME, "%s", sw_state->filename_buffer); + if (ARRAY_LENGTH(filename_buffer) > 0) + ui_popup_time(ERROR_MESSAGE_TIME, "%s", filename_buffer); } /* if it's any other key and we're not maxed out, update */ else if (event->unichar >= ' ' && event->unichar < 0x7f) { - buflen += utf8_from_uchar(&sw_state->filename_buffer[buflen], ARRAY_LENGTH(sw_state->filename_buffer) - buflen, event->unichar); - sw_state->filename_buffer[buflen] = 0; - update_selected = TRUE; + buflen += utf8_from_uchar(&filename_buffer[buflen], ARRAY_LENGTH(filename_buffer) - buflen, event->unichar); + filename_buffer[buflen] = 0; + update_selected = true; - if (ARRAY_LENGTH(sw_state->filename_buffer) > 0) - ui_popup_time(ERROR_MESSAGE_TIME, "%s", sw_state->filename_buffer); + if (ARRAY_LENGTH(filename_buffer) > 0) + ui_popup_time(ERROR_MESSAGE_TIME, "%s", filename_buffer); } if (update_selected) { - const software_entry_state *cur_selected; + const entry_info *cur_selected; // if the current selection is a software entry, start search from here if ((FPTR)event->itemref != 1) - cur_selected= (const software_entry_state *)ui_menu_get_selection(menu); + cur_selected= (const entry_info *)get_selection(); // else (if we are on the 'Switch Order' entry) start from the beginning else - cur_selected= sw_state->entrylist; + cur_selected= entrylist; // check for entries which matches our filename_buffer: // from current entry to the end for (entry = cur_selected; entry != NULL; entry = entry->next) { - const char *compare_name = sw_state->ordered_by_shortname ? entry->short_name : entry->long_name; + const char *compare_name = ordered_by_shortname ? entry->short_name : entry->long_name; - if (compare_name != NULL && sw_state->filename_buffer != NULL) + if (compare_name != NULL && filename_buffer != NULL) { int match = 0; - for (int i = 0; i < ARRAY_LENGTH(sw_state->filename_buffer); i++) + for (int i = 0; i < ARRAY_LENGTH(filename_buffer); i++) { - if (mame_strnicmp(compare_name, sw_state->filename_buffer, i) == 0) + if (mame_strnicmp(compare_name, filename_buffer, i) == 0) match = i; } @@ -360,16 +278,16 @@ } } // and from the first entry to current one - for (entry = sw_state->entrylist; entry != cur_selected; entry = entry->next) + for (entry = entrylist; entry != cur_selected; entry = entry->next) { - const char *compare_name = sw_state->ordered_by_shortname ? entry->short_name : entry->long_name; + const char *compare_name = ordered_by_shortname ? entry->short_name : entry->long_name; - if (compare_name != NULL && sw_state->filename_buffer != NULL) + if (compare_name != NULL && filename_buffer != NULL) { int match = 0; - for (int i = 0; i < ARRAY_LENGTH(sw_state->filename_buffer); i++) + for (int i = 0; i < ARRAY_LENGTH(filename_buffer); i++) { - if (mame_strnicmp(compare_name, sw_state->filename_buffer, i) == 0) + if (mame_strnicmp(compare_name, filename_buffer, i) == 0) match = i; } @@ -382,110 +300,100 @@ } if (selected_entry != NULL && selected_entry != cur_selected) - ui_menu_set_selection(menu, (void *) selected_entry); + set_selection((void *) selected_entry); } } else if (event->iptkey == IPT_UI_CANCEL) { // reset the char buffer also in this case - if (sw_state->filename_buffer[0] != '\0') - memset(sw_state->filename_buffer, '\0', ARRAY_LENGTH(sw_state->filename_buffer)); + if (filename_buffer[0] != '\0') + memset(filename_buffer, '\0', ARRAY_LENGTH(filename_buffer)); } } } /* list of available software lists - i.e. cartridges, floppies */ -static void ui_mess_menu_populate_software_list(running_machine &machine, ui_menu *menu, device_image_interface* image) +ui_menu_software::ui_menu_software(running_machine &machine, render_container *container, const char *_interface, const software_list_device **_result) : ui_menu(machine, container) { - bool haveCompatible = FALSE; - const char *interface = image->image_interface(); + interface = _interface; + result = _result; +} + +void ui_menu_software::populate() +{ + bool haveCompatible = false; // Add original software lists for this system - for (const device_t *dev = machine.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) + software_list_device_iterator iter(machine().config().root_device()); + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(dev)->inline_config(); - - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) + if (swlist->list_type() == SOFTWARE_LIST_ORIGINAL_SYSTEM) { - if (swlist->list_name[i] && (swlist->list_type == SOFTWARE_LIST_ORIGINAL_SYSTEM)) - { - software_list *list = software_list_open(machine.options(), swlist->list_name[i], FALSE, NULL); + const software_list *list = software_list_open(machine().options(), swlist->list_name(), false, NULL); - if (list) + if (list) + { + bool found = false; + for (const software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { - bool found = FALSE; - for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) - { - software_part *part = software_find_part(swinfo, NULL, NULL); - if (strcmp(interface,part->interface_)==0) { - found = TRUE; - } - } - if (found) { - ui_menu_item_append(menu, list->description, NULL, 0, swlist->list_name[i]); + const software_part *part = software_find_part(swinfo, NULL, NULL); + if (strcmp(interface,part->interface_)==0) { + found = true; } - - software_list_close(list); } + if (found) { + item_append(list->description, NULL, 0, (void *)swlist); + } + + software_list_close(list); } } } // Add compatible software lists for this system - for (const device_t *dev = machine.config().devicelist().first(SOFTWARE_LIST); dev != NULL; dev = dev->typenext()) + for (const software_list_device *swlist = iter.first(); swlist != NULL; swlist = iter.next()) { - software_list_config *swlist = (software_list_config *)downcast(dev)->inline_config(); - - for (int i = 0; i < DEVINFO_STR_SWLIST_MAX - DEVINFO_STR_SWLIST_0; i++) + if (swlist->list_type() == SOFTWARE_LIST_COMPATIBLE_SYSTEM) { - if (swlist->list_name[i] && (swlist->list_type == SOFTWARE_LIST_COMPATIBLE_SYSTEM)) - { - software_list *list = software_list_open(machine.options(), swlist->list_name[i], FALSE, NULL); + const software_list *list = software_list_open(machine().options(), swlist->list_name(), false, NULL); - if (list) + if (list) + { + bool found = false; + for (const software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) { - bool found = FALSE; - for (software_info *swinfo = software_list_find(list, "*", NULL); swinfo != NULL; swinfo = software_list_find(list, "*", swinfo)) - { - software_part *part = software_find_part(swinfo, NULL, NULL); - if (strcmp(interface,part->interface_)==0) { - found = TRUE; - } + const software_part *part = software_find_part(swinfo, NULL, NULL); + if (strcmp(interface,part->interface_)==0) { + found = true; } - if (found) { - if (!haveCompatible) { - ui_menu_item_append(menu, "[compatible lists]", NULL, MENU_FLAG_DISABLE, NULL); - } - ui_menu_item_append(menu, list->description, NULL, 0, swlist->list_name[i]); + } + if (found) { + if (!haveCompatible) { + item_append("[compatible lists]", NULL, MENU_FLAG_DISABLE, NULL); } - - haveCompatible = TRUE; - software_list_close(list); + item_append(list->description, NULL, 0, (void *)swlist); } + + haveCompatible = true; + software_list_close(list); } } } } -void ui_image_menu_software(running_machine &machine, ui_menu *menu, void *parameter, void *state) +ui_menu_software::~ui_menu_software() { - const ui_menu_event *event; - device_image_interface* image = (device_image_interface*)parameter; - if (!ui_menu_populated(menu)) - ui_mess_menu_populate_software_list(machine, menu, image); +} +void ui_menu_software::handle() +{ /* process the menu */ - event = ui_menu_process(machine, menu, 0); + const ui_menu_event *event = process(0); - if (event != NULL && event->iptkey == IPT_UI_SELECT) - { - ui_menu *child_menu = ui_menu_alloc(machine, &machine.render().ui_container(), ui_mess_menu_software_list, NULL); - software_menu_state *child_menustate = (software_menu_state *)ui_menu_alloc_state(child_menu, sizeof(*child_menustate), NULL); - child_menustate->list_name = (char *)event->itemref; - child_menustate->image = image; - child_menustate->entrylist = NULL; - child_menustate->ordered_by_shortname = 1; - ui_menu_stack_push(child_menu); + if (event != NULL && event->iptkey == IPT_UI_SELECT) { + // ui_menu::stack_push(auto_alloc_clear(machine(), ui_menu_software_list(machine(), container, (software_list_config *)event->itemref, image))); + *result = (software_list_device *)event->itemref; + ui_menu::stack_pop(machine()); } } diff -Nru mame-0.144/src/emu/uiswlist.h mame-0.145/src/emu/uiswlist.h --- mame-0.144/src/emu/uiswlist.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/uiswlist.h 2012-02-06 21:30:27.000000000 +0000 @@ -12,11 +12,63 @@ #ifndef __UISWLIST_H__ #define __UISWLIST_H__ +class ui_menu_software_parts : public ui_menu { +public: + enum { T_ENTRY, T_FMGR }; + ui_menu_software_parts(running_machine &machine, render_container *container, const software_info *info, const char *interface, const software_part **part, bool opt_fmgr, int *result); + virtual ~ui_menu_software_parts(); + virtual void populate(); + virtual void handle(); -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +private: + struct software_part_menu_entry { + int type; + const software_part *part; + }; -void ui_image_menu_software(running_machine &machine, ui_menu *menu, void *parameter, void *state); + const software_info *info; + const char *interface; + const software_part **selected_part; + bool opt_fmgr; + int *result; +}; + +class ui_menu_software_list : public ui_menu { +public: + ui_menu_software_list(running_machine &machine, render_container *container, const software_list_device *swlist, const char *interface, astring &result); + virtual ~ui_menu_software_list(); + virtual void populate(); + virtual void handle(); + +private: + struct entry_info { + entry_info *next; + + const char *short_name; + const char *long_name; + }; + + const software_list_device *swlist; /* currently selected list */ + const char *interface; + astring &result; + entry_info *entrylist; + char filename_buffer[1024]; + bool ordered_by_shortname; + + int compare_entries(const entry_info *e1, const entry_info *e2, bool shortname); + entry_info *append_software_entry(const software_info *swinfo); +}; + +class ui_menu_software : public ui_menu { +public: + ui_menu_software(running_machine &machine, render_container *container, const char *interface, const software_list_device **result); + virtual ~ui_menu_software(); + virtual void populate(); + virtual void handle(); + +private: + const char *interface; + const software_list_device **result; +}; #endif /* __UISWLIST_H__ */ diff -Nru mame-0.144/src/emu/validity.c mame-0.145/src/emu/validity.c --- mame-0.144/src/emu/validity.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/validity.c 2012-02-06 21:30:28.000000000 +0000 @@ -4,31 +4,52 @@ Validity checks on internal data structures. - 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. ***************************************************************************/ #include "emu.h" #include "hash.h" #include "validity.h" - +#include "emuopts.h" +#include "softlist.h" #include -/*************************************************************************** - DEBUGGING -***************************************************************************/ - -#define REPORT_TIMES (0) - +//************************************************************************** +// COMPILE-TIME VALIDATION +//************************************************************************** - -/*************************************************************************** - COMPILE-TIME VALIDATION -***************************************************************************/ - -/* if the following lines error during compile, your PTR64 switch is set incorrectly in the makefile */ +// if the following lines error during compile, your PTR64 switch is set incorrectly in the makefile #ifdef PTR64 UINT8 your_ptr64_flag_is_wrong[(int)(sizeof(void *) - 7)]; #else @@ -37,131 +58,332 @@ -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -typedef tagmap_t game_driver_map; - -typedef tagmap_t int_map; - -class region_entry -{ -public: - region_entry() - : length(0) { } - - astring tag; - UINT32 length; -}; - - -class region_array -{ -public: - region_entry entries[256]; -}; - +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** extern const device_type *s_devices_sorted[]; extern int m_device_count; -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ -/*------------------------------------------------- - input_port_string_from_index - return an - indexed string from the input port system --------------------------------------------------*/ -INLINE const char *input_port_string_from_index(UINT32 index) +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** + +//------------------------------------------------- +// ioport_string_from_index - return an indexed +// string from the I/O port system +//------------------------------------------------- + +inline const char *validity_checker::ioport_string_from_index(UINT32 index) { return input_port_string_from_token((const char *)(FPTR)index); } -/*------------------------------------------------- - validate_tag - ensure that the given tag - meets the general requirements --------------------------------------------------*/ +//------------------------------------------------- +// get_defstr_index - return the index of the +// string assuming it is one of the default +// strings +//------------------------------------------------- -bool validate_tag(const game_driver &driver, const char *object, const char *tag) +inline int validity_checker::get_defstr_index(const char *string, bool suppress_error) { - const char *validchars = "abcdefghijklmnopqrstuvwxyz0123456789_.:"; - const char *begin = strrchr(tag, ':'); - const char *p; - bool error = false; + // check for strings that should be DEF_STR + int strindex = m_defstr_map.find(string); + if (!suppress_error && strindex != 0 && string != ioport_string_from_index(strindex)) + mame_printf_error("Must use DEF_STR( %s )\n", string); + return strindex; +} - /* some common names that are now deprecated */ - if (strcmp(tag, "main") == 0 || - strcmp(tag, "audio") == 0 || - strcmp(tag, "sound") == 0 || - strcmp(tag, "left") == 0 || - strcmp(tag, "right") == 0) - { - mame_printf_error("%s: %s has invalid generic tag '%s'\n", driver.source_file, driver.name, tag); - error = true; - } - for (p = tag; *p != 0; p++) +//------------------------------------------------- +// validate_tag - ensure that the given tag +// meets the general requirements +//------------------------------------------------- + +void validity_checker::validate_tag(const char *tag) +{ + // some common names that are now deprecated + if (strcmp(tag, "main") == 0 || strcmp(tag, "audio") == 0 || strcmp(tag, "sound") == 0 || strcmp(tag, "left") == 0 || strcmp(tag, "right") == 0) + mame_printf_error("Invalid generic tag '%s' used\n", tag); + + // scan for invalid characters + static const char *validchars = "abcdefghijklmnopqrstuvwxyz0123456789_.:^$"; + for (const char *p = tag; *p != 0; p++) { + // only lower-case permitted if (*p != tolower((UINT8)*p)) { - mame_printf_error("%s: %s has %s with tag '%s' containing upper-case characters\n", driver.source_file, driver.name, object, tag); - error = true; + mame_printf_error("Tag '%s' contains upper-case characters\n", tag); break; } if (*p == ' ') { - mame_printf_error("%s: %s has %s with tag '%s' containing spaces\n", driver.source_file, driver.name, object, tag); - error = true; + mame_printf_error("Tag '%s' contains spaces\n", tag); break; } if (strchr(validchars, *p) == NULL) { - mame_printf_error("%s: %s has %s with tag '%s' containing invalid character '%c'\n", driver.source_file, driver.name, object, tag, *p); - error = true; + mame_printf_error("Tag '%s' contains invalid character '%c'\n", tag, *p); break; } } + // find the start of the final tag + const char *begin = strrchr(tag, ':'); if (begin == NULL) begin = tag; else begin += 1; + // 0-length = bad if (strlen(begin) == 0) + mame_printf_error("Found 0-length tag\n"); + + // too short/too long = bad + if (strlen(begin) < MIN_TAG_LENGTH) + mame_printf_error("Tag '%s' is too short (must be at least %d characters)\n", tag, MIN_TAG_LENGTH); + if (strlen(begin) > MAX_TAG_LENGTH) + mame_printf_error("Tag '%s' is too longer (must be less than %d characters)\n", tag, MAX_TAG_LENGTH); +} + + + +//************************************************************************** +// VALIDATION FUNCTIONS +//************************************************************************** + +//------------------------------------------------- +// validity_checker - constructor +//------------------------------------------------- + +validity_checker::validity_checker(emu_options &options) + : m_drivlist(options), + m_errors(0), + m_warnings(0), + m_current_driver(NULL), + m_current_config(NULL), + m_current_device(NULL), + m_current_ioport(NULL) +{ + // pre-populate the defstr map with all the default strings + for (int strnum = 1; strnum < INPUT_STRING_COUNT; strnum++) { - mame_printf_error("%s: %s has %s with 0-length tag\n", driver.source_file, driver.name, object); - error = true; + const char *string = ioport_string_from_index(strnum); + if (string != NULL) + m_defstr_map.add(string, strnum, false); } - if (strlen(begin) < MIN_TAG_LENGTH) +} + + +//------------------------------------------------- +// check_driver - check a single driver +//------------------------------------------------- + +void validity_checker::check_driver(const game_driver &driver) +{ + // simply validate the one driver + validate_begin(); + validate_one(driver); + validate_end(); +} + + +//------------------------------------------------- +// check_shared_source - check all drivers that +// share the same source file as the given driver +//------------------------------------------------- + +void validity_checker::check_shared_source(const game_driver &driver) +{ + // initialize + validate_begin(); + + // then iterate over all drivers and check the ones that share the same source file + m_drivlist.reset(); + while (m_drivlist.next()) + if (strcmp(driver.source_file, m_drivlist.driver().source_file) == 0) + validate_one(m_drivlist.driver()); + + // cleanup + validate_end(); +} + + +//------------------------------------------------- +// check_all - check all drivers +//------------------------------------------------- + +void validity_checker::check_all() +{ + // start by checking core stuff + validate_begin(); + validate_core(); + validate_inlines(); + + // then iterate over all drivers and check them + m_drivlist.reset(); + while (m_drivlist.next()) + validate_one(m_drivlist.driver()); + + // cleanup + validate_end(); +} + + +//------------------------------------------------- +// validate_begin - prepare for validation by +// taking over the output callbacks and resetting +// our internal state +//------------------------------------------------- + +void validity_checker::validate_begin() +{ + // take over error and warning outputs + m_saved_error_output = mame_set_output_channel(OUTPUT_CHANNEL_ERROR, output_delegate(FUNC(validity_checker::error_output), this)); + m_saved_warning_output = mame_set_output_channel(OUTPUT_CHANNEL_WARNING, output_delegate(FUNC(validity_checker::warning_output), this)); + + // reset all our maps + m_names_map.reset(); + m_descriptions_map.reset(); + m_roms_map.reset(); + m_defstr_map.reset(); + m_region_map.reset(); + + // reset internal state + m_errors = 0; + m_warnings = 0; + + // reset some special case state + software_list_device::reset_checked_lists(); +} + + +//------------------------------------------------- +// validate_end - restore output callbacks and +// clean up +//------------------------------------------------- + +void validity_checker::validate_end() +{ + // restore the original output callbacks + mame_set_output_channel(OUTPUT_CHANNEL_ERROR, m_saved_error_output); + mame_set_output_channel(OUTPUT_CHANNEL_WARNING, m_saved_warning_output); +} + + +//------------------------------------------------- +// validate_drivers - master validity checker +//------------------------------------------------- + +void validity_checker::validate_one(const game_driver &driver) +{ + // set the current driver + m_current_driver = &driver; + m_current_config = NULL; + m_current_device = NULL; + m_current_ioport = NULL; + m_region_map.reset(); + + // reset error/warning state + int start_errors = m_errors; + int start_warnings = m_warnings; + m_error_text.reset(); + m_warning_text.reset(); + + // wrap in try/except to catch fatalerrors + try { - mame_printf_error("%s: %s has %s with tag '%s' < %d characters\n", driver.source_file, driver.name, object, tag, MIN_TAG_LENGTH); - error = true; + machine_config config(driver, m_drivlist.options()); + m_current_config = &config; + validate_driver(); + validate_roms(); + validate_inputs(); + validate_display(); + validate_gfx(); + validate_devices(); + validate_slots(); } - if (strlen(begin) > MAX_TAG_LENGTH) + catch (emu_fatalerror &err) + { + mame_printf_error("Fatal error %s", err.string()); + } + m_current_config = NULL; + + // if we had warnings or errors, output + if (m_errors > start_errors || m_warnings > start_warnings) { - mame_printf_error("%s: %s has %s with tag '%s' > %d characters\n", driver.source_file, driver.name, object, tag, MAX_TAG_LENGTH); - error = true; + astring tempstr; + output_via_delegate(m_saved_error_output, "Driver %s (file %s): %d errors, %d warnings\n", driver.name, core_filename_extract_base(tempstr, driver.source_file).cstr(), m_errors - start_errors, m_warnings - start_warnings); + if (m_errors > start_errors) + { + m_error_text.replace("\n", "\n "); + output_via_delegate(m_saved_error_output, "Errors:\n %s", m_error_text.cstr()); + } + if (m_warnings > start_warnings) + { + m_warning_text.replace("\n", "\n "); + output_via_delegate(m_saved_error_output, "Warnings:\n %s", m_warning_text.cstr()); + } + output_via_delegate(m_saved_error_output, "\n"); } - return !error; + // reset the driver/device + m_current_driver = NULL; + m_current_config = NULL; + m_current_device = NULL; + m_current_ioport = NULL; } +//------------------------------------------------- +// validate_core - validate core internal systems +//------------------------------------------------- -/*************************************************************************** - VALIDATION FUNCTIONS -***************************************************************************/ +void validity_checker::validate_core() +{ + + // basic system checks + UINT8 a = 0xff; + UINT8 b = a + 1; + if (b > a) mame_printf_error("UINT8 must be 8 bits\n"); + + // check size of core integer types + if (sizeof(INT8) != 1) mame_printf_error("INT8 must be 8 bits\n"); + if (sizeof(UINT8) != 1) mame_printf_error("UINT8 must be 8 bits\n"); + if (sizeof(INT16) != 2) mame_printf_error("INT16 must be 16 bits\n"); + if (sizeof(UINT16) != 2) mame_printf_error("UINT16 must be 16 bits\n"); + if (sizeof(INT32) != 4) mame_printf_error("INT32 must be 32 bits\n"); + if (sizeof(UINT32) != 4) mame_printf_error("UINT32 must be 32 bits\n"); + if (sizeof(INT64) != 8) mame_printf_error("INT64 must be 64 bits\n"); + if (sizeof(UINT64) != 8) mame_printf_error("UINT64 must be 64 bits\n"); + + // check pointer size +#ifdef PTR64 + if (sizeof(void *) != 8) mame_printf_error("PTR64 flag enabled, but was compiled for 32-bit target\n"); +#else + if (sizeof(void *) != 4) mame_printf_error("PTR64 flag not enabled, but was compiled for 64-bit target\n"); +#endif -/*------------------------------------------------- - validate_inlines - validate inline function - behaviors --------------------------------------------------*/ + // check endianness definition + UINT16 lsbtest = 0; + *(UINT8 *)&lsbtest = 0xff; +#ifdef LSB_FIRST + if (lsbtest == 0xff00) mame_printf_error("LSB_FIRST specified, but running on a big-endian machine\n"); +#else + if (lsbtest == 0x00ff) mame_printf_error("LSB_FIRST not specified, but running on a little-endian machine\n"); +#endif +} -static bool validate_inlines(void) + +//------------------------------------------------- +// validate_inlines - validate inline function +// behaviors +//------------------------------------------------- + +void validity_checker::validate_inlines() { #undef rand volatile UINT64 testu64a = rand() ^ (rand() << 15) ^ ((UINT64)rand() << 30) ^ ((UINT64)rand() << 45); @@ -179,9 +401,8 @@ UINT64 resultu64, expectedu64; INT32 remainder, expremainder; UINT32 uremainder, expuremainder, bigu32 = 0xffffffff; - bool error = false; - /* use only non-zero, positive numbers */ + // use only non-zero, positive numbers if (testu64a == 0) testu64a++; if (testi64a == 0) testi64a++; else if (testi64a < 0) testi64a = -testi64a; @@ -199,32 +420,32 @@ resulti64 = mul_32x32(testi32a, testi32b); expectedi64 = (INT64)testi32a * (INT64)testi32b; if (resulti64 != expectedi64) - { mame_printf_error("Error testing mul_32x32 (%08X x %08X) = %08X%08X (expected %08X%08X)\n", testi32a, testi32b, (UINT32)(resulti64 >> 32), (UINT32)resulti64, (UINT32)(expectedi64 >> 32), (UINT32)expectedi64); error = true; } + mame_printf_error("Error testing mul_32x32 (%08X x %08X) = %08X%08X (expected %08X%08X)\n", testi32a, testi32b, (UINT32)(resulti64 >> 32), (UINT32)resulti64, (UINT32)(expectedi64 >> 32), (UINT32)expectedi64); resultu64 = mulu_32x32(testu32a, testu32b); expectedu64 = (UINT64)testu32a * (UINT64)testu32b; if (resultu64 != expectedu64) - { mame_printf_error("Error testing mulu_32x32 (%08X x %08X) = %08X%08X (expected %08X%08X)\n", testu32a, testu32b, (UINT32)(resultu64 >> 32), (UINT32)resultu64, (UINT32)(expectedu64 >> 32), (UINT32)expectedu64); error = true; } + mame_printf_error("Error testing mulu_32x32 (%08X x %08X) = %08X%08X (expected %08X%08X)\n", testu32a, testu32b, (UINT32)(resultu64 >> 32), (UINT32)resultu64, (UINT32)(expectedu64 >> 32), (UINT32)expectedu64); resulti32 = mul_32x32_hi(testi32a, testi32b); expectedi32 = ((INT64)testi32a * (INT64)testi32b) >> 32; if (resulti32 != expectedi32) - { mame_printf_error("Error testing mul_32x32_hi (%08X x %08X) = %08X (expected %08X)\n", testi32a, testi32b, resulti32, expectedi32); error = true; } + mame_printf_error("Error testing mul_32x32_hi (%08X x %08X) = %08X (expected %08X)\n", testi32a, testi32b, resulti32, expectedi32); resultu32 = mulu_32x32_hi(testu32a, testu32b); expectedu32 = ((INT64)testu32a * (INT64)testu32b) >> 32; if (resultu32 != expectedu32) - { mame_printf_error("Error testing mulu_32x32_hi (%08X x %08X) = %08X (expected %08X)\n", testu32a, testu32b, resultu32, expectedu32); error = true; } + mame_printf_error("Error testing mulu_32x32_hi (%08X x %08X) = %08X (expected %08X)\n", testu32a, testu32b, resultu32, expectedu32); resulti32 = mul_32x32_shift(testi32a, testi32b, 7); expectedi32 = ((INT64)testi32a * (INT64)testi32b) >> 7; if (resulti32 != expectedi32) - { mame_printf_error("Error testing mul_32x32_shift (%08X x %08X) >> 7 = %08X (expected %08X)\n", testi32a, testi32b, resulti32, expectedi32); error = true; } + mame_printf_error("Error testing mul_32x32_shift (%08X x %08X) >> 7 = %08X (expected %08X)\n", testi32a, testi32b, resulti32, expectedi32); resultu32 = mulu_32x32_shift(testu32a, testu32b, 7); expectedu32 = ((INT64)testu32a * (INT64)testu32b) >> 7; if (resultu32 != expectedu32) - { mame_printf_error("Error testing mulu_32x32_shift (%08X x %08X) >> 7 = %08X (expected %08X)\n", testu32a, testu32b, resultu32, expectedu32); error = true; } + mame_printf_error("Error testing mulu_32x32_shift (%08X x %08X) >> 7 = %08X (expected %08X)\n", testu32a, testu32b, resultu32, expectedu32); while ((INT64)testi32a * (INT64)0x7fffffff < testi64a) testi64a /= 2; @@ -234,34 +455,34 @@ resulti32 = div_64x32(testi64a, testi32a); expectedi32 = testi64a / (INT64)testi32a; if (resulti32 != expectedi32) - { mame_printf_error("Error testing div_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, expectedi32); error = true; } + mame_printf_error("Error testing div_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, expectedi32); resultu32 = divu_64x32(testu64a, testu32a); expectedu32 = testu64a / (UINT64)testu32a; if (resultu32 != expectedu32) - { mame_printf_error("Error testing divu_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, expectedu32); error = true; } + mame_printf_error("Error testing divu_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, expectedu32); resulti32 = div_64x32_rem(testi64a, testi32a, &remainder); expectedi32 = testi64a / (INT64)testi32a; expremainder = testi64a % (INT64)testi32a; if (resulti32 != expectedi32 || remainder != expremainder) - { mame_printf_error("Error testing div_64x32_rem (%08X%08X / %08X) = %08X,%08X (expected %08X,%08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, remainder, expectedi32, expremainder); error = true; } + mame_printf_error("Error testing div_64x32_rem (%08X%08X / %08X) = %08X,%08X (expected %08X,%08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, remainder, expectedi32, expremainder); resultu32 = divu_64x32_rem(testu64a, testu32a, &uremainder); expectedu32 = testu64a / (UINT64)testu32a; expuremainder = testu64a % (UINT64)testu32a; if (resultu32 != expectedu32 || uremainder != expuremainder) - { mame_printf_error("Error testing divu_64x32_rem (%08X%08X / %08X) = %08X,%08X (expected %08X,%08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, uremainder, expectedu32, expuremainder); error = true; } + mame_printf_error("Error testing divu_64x32_rem (%08X%08X / %08X) = %08X,%08X (expected %08X,%08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, uremainder, expectedu32, expuremainder); resulti32 = mod_64x32(testi64a, testi32a); expectedi32 = testi64a % (INT64)testi32a; if (resulti32 != expectedi32) - { mame_printf_error("Error testing mod_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, expectedi32); error = true; } + mame_printf_error("Error testing mod_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testi64a >> 32), (UINT32)testi64a, testi32a, resulti32, expectedi32); resultu32 = modu_64x32(testu64a, testu32a); expectedu32 = testu64a % (UINT64)testu32a; if (resultu32 != expectedu32) - { mame_printf_error("Error testing modu_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, expectedu32); error = true; } + mame_printf_error("Error testing modu_64x32 (%08X%08X / %08X) = %08X (expected %08X)\n", (UINT32)(testu64a >> 32), (UINT32)testu64a, testu32a, resultu32, expectedu32); while ((INT64)testi32a * (INT64)0x7fffffff < ((INT32)testi64a << 3)) testi64a /= 2; @@ -271,544 +492,377 @@ resulti32 = div_32x32_shift((INT32)testi64a, testi32a, 3); expectedi32 = ((INT64)(INT32)testi64a << 3) / (INT64)testi32a; if (resulti32 != expectedi32) - { mame_printf_error("Error testing div_32x32_shift (%08X << 3) / %08X = %08X (expected %08X)\n", (INT32)testi64a, testi32a, resulti32, expectedi32); error = true; } + mame_printf_error("Error testing div_32x32_shift (%08X << 3) / %08X = %08X (expected %08X)\n", (INT32)testi64a, testi32a, resulti32, expectedi32); resultu32 = divu_32x32_shift((UINT32)testu64a, testu32a, 3); expectedu32 = ((UINT64)(UINT32)testu64a << 3) / (UINT64)testu32a; if (resultu32 != expectedu32) - { mame_printf_error("Error testing divu_32x32_shift (%08X << 3) / %08X = %08X (expected %08X)\n", (UINT32)testu64a, testu32a, resultu32, expectedu32); error = true; } + mame_printf_error("Error testing divu_32x32_shift (%08X << 3) / %08X = %08X (expected %08X)\n", (UINT32)testu64a, testu32a, resultu32, expectedu32); if (fabs(recip_approx(100.0) - 0.01) > 0.0001) - { mame_printf_error("Error testing recip_approx\n"); error = true; } + mame_printf_error("Error testing recip_approx\n"); testi32a = (testi32a & 0x0000ffff) | 0x400000; if (count_leading_zeros(testi32a) != 9) - { mame_printf_error("Error testing count_leading_zeros\n"); error = true; } + mame_printf_error("Error testing count_leading_zeros\n"); testi32a = (testi32a | 0xffff0000) & ~0x400000; if (count_leading_ones(testi32a) != 9) - { mame_printf_error("Error testing count_leading_ones\n"); error = true; } + mame_printf_error("Error testing count_leading_ones\n"); testi32b = testi32a; if (compare_exchange32(&testi32a, testi32b, 1000) != testi32b || testi32a != 1000) - { mame_printf_error("Error testing compare_exchange32\n"); error = true; } + mame_printf_error("Error testing compare_exchange32\n"); #ifdef PTR64 testi64b = testi64a; if (compare_exchange64(&testi64a, testi64b, 1000) != testi64b || testi64a != 1000) - { mame_printf_error("Error testing compare_exchange64\n"); error = true; } + mame_printf_error("Error testing compare_exchange64\n"); #endif if (atomic_exchange32(&testi32a, testi32b) != 1000) - { mame_printf_error("Error testing atomic_exchange32\n"); error = true; } + mame_printf_error("Error testing atomic_exchange32\n"); if (atomic_add32(&testi32a, 45) != testi32b + 45) - { mame_printf_error("Error testing atomic_add32\n"); error = true; } + mame_printf_error("Error testing atomic_add32\n"); if (atomic_increment32(&testi32a) != testi32b + 46) - { mame_printf_error("Error testing atomic_increment32\n"); error = true; } + mame_printf_error("Error testing atomic_increment32\n"); if (atomic_decrement32(&testi32a) != testi32b + 45) - { mame_printf_error("Error testing atomic_decrement32\n"); error = true; } - - return error; + mame_printf_error("Error testing atomic_decrement32\n"); } -/*------------------------------------------------- - validate_driver - validate basic driver - information --------------------------------------------------*/ +//------------------------------------------------- +// validate_driver - validate basic driver +// information +//------------------------------------------------- -static bool validate_driver(driver_enumerator &drivlist, game_driver_map &names, game_driver_map &descriptions) +void validity_checker::validate_driver() { - const game_driver &driver = drivlist.driver(); - const machine_config &config = drivlist.config(); - const char *compatible_with; - bool error = FALSE, is_clone; - const char *s; - - enum { NAME_LEN_PARENT = 8, NAME_LEN_CLONE = 16 }; - - /* check for duplicate names */ - if (names.add(driver.name, &driver, FALSE) == TMERR_DUPLICATE) + // check for duplicate names + astring tempstr; + if (m_names_map.add(m_current_driver->name, m_current_driver, false) == TMERR_DUPLICATE) { - const game_driver *match = names.find(driver.name); - mame_printf_error("%s: %s is a duplicate name (%s, %s)\n", driver.source_file, driver.name, match->source_file, match->name); - error = true; + const game_driver *match = m_names_map.find(m_current_driver->name); + mame_printf_error("Driver name is a duplicate of %s(%s)\n", core_filename_extract_base(tempstr, match->source_file).cstr(), match->name); } - /* check for duplicate descriptions */ - if (descriptions.add(driver.description, &driver, FALSE) == TMERR_DUPLICATE) + // check for duplicate descriptions + if (m_descriptions_map.add(m_current_driver->description, m_current_driver, false) == TMERR_DUPLICATE) { - const game_driver *match = descriptions.find(driver.description); - mame_printf_error("%s: %s is a duplicate description (%s, %s)\n", driver.source_file, driver.description, match->source_file, match->description); - error = true; + const game_driver *match = m_descriptions_map.find(m_current_driver->description); + mame_printf_error("Driver description is a duplicate of %s(%s)\n", core_filename_extract_base(tempstr, match->source_file).cstr(), match->name); } - /* determine the clone */ - is_clone = (strcmp(driver.parent, "0") != 0); - int clone_of = drivlist.clone(driver); - if (clone_of != -1 && (drivlist.driver(clone_of).flags & GAME_IS_BIOS_ROOT)) + // determine if we are a clone + bool is_clone = (strcmp(m_current_driver->parent, "0") != 0); + int clone_of = m_drivlist.clone(*m_current_driver); + if (clone_of != -1 && (m_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 we have at least 100 drivers, validate the clone + // (100 is arbitrary, but tries to avoid tiny.mak dependencies) 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 != -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; - } + mame_printf_error("Driver is a clone of nonexistant driver %s\n", m_current_driver->parent); - /* look for clones that are too deep */ - 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; - } - - /* make sure the driver name is 8 chars or less */ - if ((is_clone && strlen(driver.name) > NAME_LEN_CLONE) || ((!is_clone) && strlen(driver.name) > NAME_LEN_PARENT)) - { - mame_printf_error("%s: %s %s driver name must be %d characters or less\n", driver.source_file, driver.name, - is_clone ? "clone" : "parent", is_clone ? NAME_LEN_CLONE : NAME_LEN_PARENT); - error = true; - } + // look for recursive cloning + if (clone_of != -1 && &m_drivlist.driver(clone_of) == m_current_driver) + mame_printf_error("Driver is a clone of itself\n"); + + // look for clones that are too deep + if (clone_of != -1 && (clone_of = m_drivlist.non_bios_clone(clone_of)) != -1) + mame_printf_error("Driver is a clone of a clone\n"); + + // make sure the driver name is not too long + if (!is_clone && strlen(m_current_driver->name) > 8) + mame_printf_error("Parent driver name must be 8 characters or less\n"); + if (is_clone && strlen(m_current_driver->name) > 16) + mame_printf_error("Clone driver name must be 16 characters or less\n"); - /* make sure the year is only digits, '?' or '+' */ - for (s = driver.year; *s; s++) + // make sure the year is only digits, '?' or '+' + for (const char *s = m_current_driver->year; *s != 0; s++) if (!isdigit((UINT8)*s) && *s != '?' && *s != '+') { - mame_printf_error("%s: %s has an invalid year '%s'\n", driver.source_file, driver.name, driver.year); - error = true; + mame_printf_error("Driver has an invalid year '%s'\n", m_current_driver->year); break; } - /* normalize driver->compatible_with */ - compatible_with = driver.compatible_with; - if ((compatible_with != NULL) && !strcmp(compatible_with, "0")) + // normalize driver->compatible_with + const char *compatible_with = m_current_driver->compatible_with; + if (compatible_with != NULL && strcmp(compatible_with, "0") == 0) compatible_with = NULL; - /* check for this driver being compatible with a non-existant driver */ - 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 ((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 (int other_drv = drivlist.compatible_with(driver); other_drv != -1; other_drv = drivlist.compatible_with(other_drv)) - { - if (&driver == &drivlist.driver(other_drv)) + // check for this driver being compatible with a non-existant driver + if (compatible_with != NULL && m_drivlist.find(m_current_driver->compatible_with) == -1) + mame_printf_error("Driver is listed as compatible with nonexistant driver %s\n", m_current_driver->compatible_with); + + // check for clone_of and compatible_with being specified at the same time + if (m_drivlist.clone(*m_current_driver) != -1 && compatible_with != NULL) + mame_printf_error("Driver cannot be both a clone and listed as compatible with another system\n"); + + // find any recursive dependencies on the current driver + for (int other_drv = m_drivlist.compatible_with(*m_current_driver); other_drv != -1; other_drv = m_drivlist.compatible_with(other_drv)) + if (m_current_driver == &m_drivlist.driver(other_drv)) { - mame_printf_error("%s: recursive compatibility\n", driver.name); - error = true; + mame_printf_error("Driver is recursively compatible with itself\n"); break; } - } - - /* make sure sound-less drivers are flagged */ - const device_sound_interface *sound; - if ((driver.flags & GAME_IS_BIOS_ROOT) == 0 && !config.devicelist().first(sound) && (driver.flags & GAME_NO_SOUND) == 0 && (driver.flags & GAME_NO_SOUND_HW) == 0) - { - mame_printf_error("%s: %s missing GAME_NO_SOUND flag\n", driver.source_file, driver.name); - error = true; - } - return error; + // make sure sound-less drivers are flagged + sound_interface_iterator iter(m_current_config->root_device()); + if ((m_current_driver->flags & GAME_IS_BIOS_ROOT) == 0 && iter.first() == NULL && (m_current_driver->flags & GAME_NO_SOUND) == 0 && (m_current_driver->flags & GAME_NO_SOUND_HW) == 0) + mame_printf_error("Driver is missing GAME_NO_SOUND flag\n"); } -/*------------------------------------------------- - validate_roms - validate ROM definitions --------------------------------------------------*/ +//------------------------------------------------- +// validate_roms - validate ROM definitions +//------------------------------------------------- -static bool validate_roms(driver_enumerator &drivlist, region_array *rgninfo, game_driver_map &roms) +void validity_checker::validate_roms() { - 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 = "???"; - region_entry *currgn = NULL; - int items_since_region = 1; - bool error = false; - - const rom_source *first_source = rom_first_source(config); - - /* iterate, starting with the driver's ROMs and continuing with device ROMs */ - for (const rom_source *source = rom_first_source(config); source != NULL; source = rom_next_source(*source)) + // iterate, starting with the driver's ROMs and continuing with device ROMs + for (const rom_source *source = rom_first_source(*m_current_config); source != NULL; source = rom_next_source(*source)) { - /* scan the ROM entries */ + // for non-root devices, track the current device + m_current_device = (source == &m_current_config->root_device()) ? NULL : source; + + // scan the ROM entries for this device + const char *last_region_name = "???"; + const char *last_name = "???"; + UINT32 current_length = 0; + int items_since_region = 1; + int last_bios = 0; + int total_files = 0; for (const rom_entry *romp = rom_first_region(*source); !ROMENTRY_ISEND(romp); romp++) { - /* if this is a region, make sure it's valid, and record the length */ + // if this is a region, make sure it's valid, and record the length if (ROMENTRY_ISREGION(romp)) { - const char *regiontag = ROMREGION_GETTAG(romp); - - /* if we haven't seen any items since the last region, print a warning */ + // if we haven't seen any items since the last region, print a warning if (items_since_region == 0) - mame_printf_warning("%s: %s has empty ROM region '%s' (warning)\n", driver.source_file, driver.name, last_rgnname); + mame_printf_warning("Empty ROM region '%s' (warning)\n", last_region_name); + + // reset our region tracking states + const char *basetag = ROMREGION_GETTAG(romp); items_since_region = (ROMREGION_ISERASE(romp) || ROMREGION_ISDISKDATA(romp)) ? 1 : 0; - currgn = NULL; - last_rgnname = regiontag; + last_region_name = basetag; - /* check for a valid tag */ - if (regiontag == NULL) + // check for a valid tag + if (basetag == NULL) { - mame_printf_error("%s: %s has NULL ROM_REGION tag\n", driver.source_file, driver.name); - error = true; + mame_printf_error("ROM_REGION tag with NULL name\n"); + continue; } - /* find any empty entry, checking for duplicates */ - else - { - astring fulltag; - - /* iterate over all regions found so far */ - rom_region_name(fulltag, &driver, source, romp); - for (int rgnnum = 0; rgnnum < ARRAY_LENGTH(rgninfo->entries); rgnnum++) - { - /* stop when we hit an empty */ - if (!rgninfo->entries[rgnnum].tag) - { - currgn = &rgninfo->entries[rgnnum]; - currgn->tag = fulltag; - currgn->length = ROMREGION_GETLENGTH(romp); - break; - } + // validate the base tag + validate_tag(basetag); - /* fail if we hit a duplicate */ - if (fulltag == rgninfo->entries[rgnnum].tag) - { - mame_printf_error("%s: %s has duplicate ROM_REGION tag '%s'\n", driver.source_file, driver.name, fulltag.cstr()); - error = true; - break; - } - } - } + // generate the full tag + astring fulltag; + rom_region_name(fulltag, m_current_driver, source, romp); - /* validate the region tag */ - if (!validate_tag(driver, "region", regiontag)) - error = true; + // attempt to add it to the map, reporting duplicates as errors + current_length = ROMREGION_GETLENGTH(romp); + if (m_region_map.add(fulltag, current_length, false) == TMERR_DUPLICATE) + mame_printf_error("Multiple ROM_REGIONs with the same tag '%s' defined\n", fulltag.cstr()); } - /* If this is a system bios, make sure it is using the next available bios number */ + // If this is a system bios, make sure it is using the next available bios number else if (ROMENTRY_ISSYSTEM_BIOS(romp)) { - bios_flags = ROM_GETBIOSFLAGS(romp); - if (last_bios+1 != bios_flags) - { - const char *name = ROM_GETNAME(romp); - mame_printf_error("%s: %s has non-sequential bios %s\n", driver.source_file, driver.name, name); - error = true; - } + int bios_flags = ROM_GETBIOSFLAGS(romp); + if (bios_flags != last_bios + 1) + mame_printf_error("Non-sequential bios %s (specified as %d, expected to be %d)\n", ROM_GETNAME(romp), bios_flags, last_bios + 1); last_bios = bios_flags; } - /* if this is a file, make sure it is properly formatted */ + // if this is a file, make sure it is properly formatted else if (ROMENTRY_ISFILE(romp)) { - const char *s; - - items_since_region++; - - /* track the last filename we found */ + // track the last filename we found last_name = ROM_GETNAME(romp); + total_files++; - /* make sure it's all lowercase */ - for (s = last_name; *s; s++) + // make sure it's all lowercase + for (const char *s = last_name; *s != 0; s++) if (tolower((UINT8)*s) != *s) { - mame_printf_error("%s: %s has upper case ROM name %s\n", driver.source_file, driver.name, last_name); - error = true; + mame_printf_error("ROM name '%s' contains upper case characters\n", last_name); break; } - /* make sure the hash is valid */ + // make sure the hash is valid hash_collection hashes; if (!hashes.from_internal_string(ROM_GETHASHDATA(romp))) - { - mame_printf_error("%s: rom '%s' has an invalid hash string '%s'\n", driver.name, last_name, ROM_GETHASHDATA(romp)); - error = true; - } + mame_printf_error("ROM '%s' has an invalid hash string '%s'\n", last_name, ROM_GETHASHDATA(romp)); } - // count copies/fills as valid items - else if (ROMENTRY_ISCOPY(romp) || ROMENTRY_ISFILL(romp)) - items_since_region++; - - /* for any non-region ending entries, make sure they don't extend past the end */ - if (!ROMENTRY_ISREGIONEND(romp) && currgn != NULL) + // for any non-region ending entries, make sure they don't extend past the end + if (!ROMENTRY_ISREGIONEND(romp) && current_length > 0) { items_since_region++; - - if (ROM_GETOFFSET(romp) + ROM_GETLENGTH(romp) > currgn->length) - { - mame_printf_error("%s: %s has ROM %s extending past the defined memory region\n", driver.source_file, driver.name, last_name); - error = true; - } + if (ROM_GETOFFSET(romp) + ROM_GETLENGTH(romp) > current_length) + mame_printf_error("ROM '%s' extends past the defined memory region\n", last_name); } } - /* final check for empty regions */ + // final check for empty regions if (items_since_region == 0) - mame_printf_warning("%s: %s has empty ROM region (warning)\n", driver.source_file, driver.name); + mame_printf_warning("Empty ROM region '%s' (warning)\n", last_region_name); - if (source!=first_source) { - // check for device roms - device_type type = source->type(); - int cnt = 0; - for (const rom_entry *romp = rom_first_region(*source); !ROMENTRY_ISEND(romp); romp++) - { - if (ROMENTRY_ISFILE(romp)) { - cnt++; - } - } - if (cnt > 0) { - bool found = false; - for(int i=0;i 0) + { + // scan the list of devices for this device type + bool found = false; + for (int i = 0; i < m_device_count; i++) + if (m_current_device->type() == *s_devices_sorted[i]) + { + found = true; + break; } - if (!found) - mame_printf_error("Device %s is not listed in device list (mame_dev.lst / mess_dev.lst)\n", source->shortname()); - } + + // if not found, report an error + if (!found) + mame_printf_error("Device %s is not listed in device list (mame_dev.lst / mess_dev.lst)\n", m_current_device->shortname()); } - } - return error; + // reset the current device + m_current_device = NULL; + } } -/*------------------------------------------------- - validate_display - validate display - configurations --------------------------------------------------*/ +//------------------------------------------------- +// validate_display - validate display +// configurations +//------------------------------------------------- -static bool validate_display(driver_enumerator &drivlist) +void validity_checker::validate_display() { - const game_driver &driver = drivlist.driver(); - const machine_config &config = drivlist.config(); + // iterate over screen devices looking for paletted screens + screen_device_iterator iter(m_current_config->root_device()); bool palette_modes = false; - bool error = false; - - for (const screen_device *scrconfig = config.first_screen(); scrconfig != NULL; scrconfig = scrconfig->next_screen()) - if (scrconfig->format() == BITMAP_FORMAT_INDEXED16) + for (const screen_device *scrconfig = iter.first(); scrconfig != NULL; scrconfig = iter.next()) + if (scrconfig->format() == BITMAP_FORMAT_IND16) palette_modes = true; - /* check for empty palette */ - if (palette_modes && config.m_total_colors == 0) - { - mame_printf_error("%s: %s has zero palette entries\n", driver.source_file, driver.name); - error = true; - } - - return error; + // check for empty palette + if (palette_modes && m_current_config->m_total_colors == 0) + mame_printf_error("Driver has zero palette entries but uses a palette-based bitmap format\n"); } -/*------------------------------------------------- - validate_gfx - validate graphics decoding - configuration --------------------------------------------------*/ +//------------------------------------------------- +// validate_gfx - validate graphics decoding +// configuration +//------------------------------------------------- -static bool validate_gfx(driver_enumerator &drivlist, region_array *rgninfo) +void validity_checker::validate_gfx() { - const game_driver &driver = drivlist.driver(); - const machine_config &config = drivlist.config(); - bool error = false; - int gfxnum; + // bail if no gfx + if (!m_current_config->m_gfxdecodeinfo) + return; - /* bail if no gfx */ - if (!config.m_gfxdecodeinfo) - return false; - - /* iterate over graphics decoding entries */ - for (gfxnum = 0; gfxnum < MAX_GFX_ELEMENTS && config.m_gfxdecodeinfo[gfxnum].gfxlayout != NULL; gfxnum++) + // iterate over graphics decoding entries + for (int gfxnum = 0; gfxnum < MAX_GFX_ELEMENTS && m_current_config->m_gfxdecodeinfo[gfxnum].gfxlayout != NULL; gfxnum++) { - const gfx_decode_entry *gfx = &config.m_gfxdecodeinfo[gfxnum]; - const char *region = gfx->memory_region; - int xscale = (config.m_gfxdecodeinfo[gfxnum].xscale == 0) ? 1 : config.m_gfxdecodeinfo[gfxnum].xscale; - int yscale = (config.m_gfxdecodeinfo[gfxnum].yscale == 0) ? 1 : config.m_gfxdecodeinfo[gfxnum].yscale; - const gfx_layout *gl = gfx->gfxlayout; - int israw = (gl->planeoffset[0] == GFX_RAW); - int planes = gl->planes; - UINT16 width = gl->width; - UINT16 height = gl->height; - UINT32 total = gl->total; + const gfx_decode_entry &gfx = m_current_config->m_gfxdecodeinfo[gfxnum]; + const gfx_layout &layout = *gfx.gfxlayout; - /* make sure the region exists */ + // make sure the region exists + const char *region = gfx.memory_region; if (region != NULL) { - int rgnnum; + // resolve the region + astring gfxregion; + m_current_config->root_device().subtag(gfxregion, region); - /* loop over gfx regions */ - for (rgnnum = 0; rgnnum < ARRAY_LENGTH(rgninfo->entries); rgnnum++) - { - /* stop if we hit an empty */ - if (!rgninfo->entries[rgnnum].tag) - { - mame_printf_error("%s: %s has gfx[%d] referencing non-existent region '%s'\n", driver.source_file, driver.name, gfxnum, region); - error = true; - break; - } + // loop over gfx regions + UINT32 region_length = m_region_map.find(gfxregion); + if (region_length == 0) + mame_printf_error("gfx[%d] references non-existent region '%s'\n", gfxnum, region); - /* if we hit a match, check against the length */ - if (rgninfo->entries[rgnnum].tag == region) - { - /* if we have a valid region, and we're not using auto-sizing, check the decode against the region length */ - if (!IS_FRAC(total)) - { - int len, avail, plane, start; - UINT32 charincrement = gl->charincrement; - const UINT32 *poffset = gl->planeoffset; - - /* determine which plane is the largest */ - start = 0; - for (plane = 0; plane < planes; plane++) - if (poffset[plane] > start) - start = poffset[plane]; - start &= ~(charincrement - 1); + // if we have a valid region, and we're not using auto-sizing, check the decode against the region length + else if (!IS_FRAC(layout.total)) + { + // determine which plane is at the largest offset + int start = 0; + for (int plane = 0; plane < layout.planes; plane++) + if (layout.planeoffset[plane] > start) + start = layout.planeoffset[plane]; + start &= ~(layout.charincrement - 1); - /* determine the total length based on this info */ - len = total * charincrement; + // determine the total length based on this info + int len = layout.total * layout.charincrement; - /* do we have enough space in the region to cover the whole decode? */ - avail = rgninfo->entries[rgnnum].length - (gfx->start & ~(charincrement/8-1)); + // do we have enough space in the region to cover the whole decode? + int avail = region_length - (gfx.start & ~(layout.charincrement / 8 - 1)); - /* if not, this is an error */ - if ((start + len) / 8 > avail) - { - mame_printf_error("%s: %s has gfx[%d] extending past allocated memory of region '%s'\n", driver.source_file, driver.name, gfxnum, region); - error = true; - } - } - break; - } + // if not, this is an error + if ((start + len) / 8 > avail) + mame_printf_error("gfx[%d] extends past allocated memory of region '%s'\n", gfxnum, region); } } - if (israw) - { - if (total != RGN_FRAC(1,1)) - { - mame_printf_error("%s: %s has gfx[%d] with unsupported layout total\n", driver.source_file, driver.name, gfxnum); - error = true; - } + int xscale = (m_current_config->m_gfxdecodeinfo[gfxnum].xscale == 0) ? 1 : m_current_config->m_gfxdecodeinfo[gfxnum].xscale; + int yscale = (m_current_config->m_gfxdecodeinfo[gfxnum].yscale == 0) ? 1 : m_current_config->m_gfxdecodeinfo[gfxnum].yscale; + // verify raw decode, which can only be full-region and have no scaling + if (layout.planeoffset[0] == GFX_RAW) + { + if (layout.total != RGN_FRAC(1,1)) + mame_printf_error("gfx[%d] with unsupported layout total\n", gfxnum); if (xscale != 1 || yscale != 1) - { - mame_printf_error("%s: %s has gfx[%d] with unsupported xscale/yscale\n", driver.source_file, driver.name, gfxnum); - error = true; - } + mame_printf_error("gfx[%d] with unsupported xscale/yscale\n", gfxnum); } + + // verify traditional decode doesn't have too many planes or is not too large else { - if (planes > MAX_GFX_PLANES) - { - mame_printf_error("%s: %s has gfx[%d] with invalid planes\n", driver.source_file, driver.name, gfxnum); - error = true; - } - - if (xscale * width > MAX_ABS_GFX_SIZE || yscale * height > MAX_ABS_GFX_SIZE) - { - mame_printf_error("%s: %s has gfx[%d] with invalid xscale/yscale\n", driver.source_file, driver.name, gfxnum); - error = true; - } + if (layout.planes > MAX_GFX_PLANES) + mame_printf_error("gfx[%d] with invalid planes\n", gfxnum); + if (xscale * layout.width > MAX_ABS_GFX_SIZE || yscale * layout.height > MAX_ABS_GFX_SIZE) + mame_printf_error("gfx[%d] with invalid xscale/yscale\n", gfxnum); } } - - return error; } -/*------------------------------------------------- - get_defstr_index - return the index of the - string assuming it is one of the default - strings --------------------------------------------------*/ +//------------------------------------------------- +// validate_analog_input_field - validate an +// analog input field +//------------------------------------------------- -static int get_defstr_index(int_map &defstr_map, const char *name, const game_driver &driver, bool *error) +void validity_checker::validate_analog_input_field(input_field_config &field) { - /* check for strings that should be DEF_STR */ - int strindex = defstr_map.find(name); - if (strindex != 0 && name != input_port_string_from_index(strindex) && error != NULL) - { - mame_printf_error("%s: %s must use DEF_STR( %s )\n", driver.source_file, driver.name, name); - *error = true; - } + // analog ports must have a valid sensitivity + if (field.sensitivity == 0) + mame_printf_error("Analog port with zero sensitivity\n"); + + // check that the default falls in the bitmask range + if (field.defvalue & ~field.mask) + mame_printf_error("Analog port with a default value (%X) out of the bitmask range (%X)\n", field.defvalue, field.mask); - return strindex; -} - - -/*------------------------------------------------- - validate_analog_input_field - validate an - analog input field --------------------------------------------------*/ - -static void validate_analog_input_field(input_field_config *field, const game_driver &driver, bool *error) -{ - INT32 analog_max = field->max; - INT32 analog_min = field->min; - int shift; - - if (field->type == IPT_POSITIONAL || field->type == IPT_POSITIONAL_V) + // tests for positional devices + if (field.type == IPT_POSITIONAL || field.type == IPT_POSITIONAL_V) { - for (shift = 0; (shift <= 31) && (~field->mask & (1 << shift)); shift++) ; - /* convert the positional max value to be in the bitmask for testing */ - analog_max = (analog_max - 1) << shift; + int shift; + for (shift = 0; shift <= 31 && (~field.mask & (1 << shift)) != 0; shift++) ; - /* positional port size must fit in bits used */ - if (((field->mask >> shift) + 1) < field->max) - { - mame_printf_error("%s: %s has an analog port with a positional port size bigger then the mask size\n", driver.source_file, driver.name); - *error = true; - } - } - else - { - /* only positional controls use PORT_WRAPS */ - if (field->flags & ANALOG_FLAG_WRAPS) - { - mame_printf_error("%s: %s only positional analog ports use PORT_WRAPS\n", driver.source_file, driver.name); - *error = true; - } - } - - /* analog ports must have a valid sensitivity */ - if (field->sensitivity == 0) - { - mame_printf_error("%s: %s has an analog port with zero sensitivity\n", driver.source_file, driver.name); - *error = true; - } + // convert the positional max value to be in the bitmask for testing + INT32 analog_max = field.max; + analog_max = (analog_max - 1) << shift; - /* check that the default falls in the bitmask range */ - if (field->defvalue & ~field->mask) - { - mame_printf_error("%s: %s has an analog port with a default value out of the bitmask range\n", driver.source_file, driver.name); - *error = true; + // positional port size must fit in bits used + if ((field.mask >> shift) + 1 < field.max) + mame_printf_error("Analog port with a positional port size bigger then the mask size\n"); } - /* tests for absolute devices */ - if (field->type >= __ipt_analog_absolute_start && field->type <= __ipt_analog_absolute_end) - { - INT32 default_value = field->defvalue; - - /* adjust for signed values */ + // tests for absolute devices + else if (field.type >= __ipt_analog_absolute_start && field.type <= __ipt_analog_absolute_end) + { + // adjust for signed values + INT32 default_value = field.defvalue; + INT32 analog_min = field.min; + INT32 analog_max = field.max; if (analog_min > analog_max) { analog_min = -analog_min; @@ -816,503 +870,388 @@ default_value = -default_value; } - /* check that the default falls in the MINMAX range */ + // check that the default falls in the MINMAX range if (default_value < analog_min || default_value > analog_max) - { - mame_printf_error("%s: %s has an analog port with a default value out PORT_MINMAX range\n", driver.source_file, driver.name); - *error = true; - } + mame_printf_error("Analog port with a default value (%X) out of PORT_MINMAX range (%X-%X)\n", field.defvalue, field.min, field.max); - /* check that the MINMAX falls in the bitmask range */ - /* we use the unadjusted min for testing */ - if (field->min & ~field->mask || analog_max & ~field->mask) - { - mame_printf_error("%s: %s has an analog port with a PORT_MINMAX value out of the bitmask range\n", driver.source_file, driver.name); - *error = true; - } + // check that the MINMAX falls in the bitmask range + // we use the unadjusted min for testing + if (field.min & ~field.mask || analog_max & ~field.mask) + mame_printf_error("Analog port with a PORT_MINMAX (%X-%X) value out of the bitmask range (%X)\n", field.min, field.max, field.mask); - /* absolute analog ports do not use PORT_RESET */ - if (field->flags & ANALOG_FLAG_RESET) - { - mame_printf_error("%s: %s - absolute analog ports do not use PORT_RESET\n", driver.source_file, driver.name); - *error = true; - } + // absolute analog ports do not use PORT_RESET + if (field.flags & ANALOG_FLAG_RESET) + mame_printf_error("Absolute analog port using PORT_RESET\n"); + + // absolute analog ports do not use PORT_WRAPS + if (field.flags & ANALOG_FLAG_WRAPS) + mame_printf_error("Absolute analog port using PORT_WRAPS\n"); } - /* tests for relative devices */ + // tests for non IPT_POSITIONAL relative devices else { - /* tests for non IPT_POSITIONAL relative devices */ - if (field->type != IPT_POSITIONAL && field->type != IPT_POSITIONAL_V) - { - /* relative devices do not use PORT_MINMAX */ - if (field->min != 0 || field->max != field->mask) - { - mame_printf_error("%s: %s - relative ports do not use PORT_MINMAX\n", driver.source_file, driver.name); - *error = true; - } - - /* relative devices do not use a default value */ - /* the counter is at 0 on power up */ - if (field->defvalue != 0) - { - mame_printf_error("%s: %s - relative ports do not use a default value other then 0\n", driver.source_file, driver.name); - *error = true; - } - } + // relative devices do not use PORT_MINMAX + if (field.min != 0 || field.max != field.mask) + mame_printf_error("Relative port using PORT_MINMAX\n"); + + // relative devices do not use a default value + // the counter is at 0 on power up + if (field.defvalue != 0) + mame_printf_error("Relative port using non-0 default value\n"); + + // relative analog ports do not use PORT_WRAPS + if (field.flags & ANALOG_FLAG_WRAPS) + mame_printf_error("Absolute analog port using PORT_WRAPS\n"); } } -/*------------------------------------------------- - validate_dip_settings - validate a DIP switch - setting --------------------------------------------------*/ +//------------------------------------------------- +// validate_dip_settings - validate a DIP switch +// setting +//------------------------------------------------- -static void validate_dip_settings(input_field_config *field, const game_driver &driver, int_map &defstr_map, bool *error) +void validity_checker::validate_dip_settings(input_field_config &field) { - const char *demo_sounds = input_port_string_from_index(INPUT_STRING_Demo_Sounds); - const char *flipscreen = input_port_string_from_index(INPUT_STRING_Flip_Screen); + const char *demo_sounds = ioport_string_from_index(INPUT_STRING_Demo_Sounds); + const char *flipscreen = ioport_string_from_index(INPUT_STRING_Flip_Screen); UINT8 coin_list[__input_string_coinage_end + 1 - __input_string_coinage_start] = { 0 }; - const input_setting_config *setting; - int coin_error = FALSE; + bool coin_error = false; - /* iterate through the settings */ - for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) + // iterate through the settings + for (const input_setting_config *setting = field.settinglist().first(); setting != NULL; setting = setting->next()) { - int strindex = get_defstr_index(defstr_map, setting->name, driver, error); - - /* note any coinage strings */ + // note any coinage strings + int strindex = get_defstr_index(setting->name); if (strindex >= __input_string_coinage_start && strindex <= __input_string_coinage_end) coin_list[strindex - __input_string_coinage_start] = 1; - /* make sure demo sounds default to on */ - if (field->name == demo_sounds && strindex == INPUT_STRING_On && field->defvalue != setting->value) - { - mame_printf_error("%s: %s Demo Sounds must default to On\n", driver.source_file, driver.name); - *error = true; - } - - /* check for bad demo sounds options */ - if (field->name == demo_sounds && (strindex == INPUT_STRING_Yes || strindex == INPUT_STRING_No)) - { - mame_printf_error("%s: %s has wrong Demo Sounds option %s (must be Off/On)\n", driver.source_file, driver.name, setting->name); - *error = true; - } + // make sure demo sounds default to on + if (field.name == demo_sounds && strindex == INPUT_STRING_On && field.defvalue != setting->value) + mame_printf_error("Demo Sounds must default to On\n"); + + // check for bad demo sounds options + if (field.name == demo_sounds && (strindex == INPUT_STRING_Yes || strindex == INPUT_STRING_No)) + mame_printf_error("Demo Sounds option must be Off/On, not %s\n", setting->name); + + // check for bad flip screen options + if (field.name == flipscreen && (strindex == INPUT_STRING_Yes || strindex == INPUT_STRING_No)) + mame_printf_error("Flip Screen option must be Off/On, not %s\n", setting->name); - /* check for bad flip screen options */ - if (field->name == flipscreen && (strindex == INPUT_STRING_Yes || strindex == INPUT_STRING_No)) - { - mame_printf_error("%s: %s has wrong Flip Screen option %s (must be Off/On)\n", driver.source_file, driver.name, setting->name); - *error = true; - } - - /* if we have a neighbor, compare ourselves to him */ + // if we have a neighbor, compare ourselves to him if (setting->next() != NULL) { - int next_strindex = get_defstr_index(defstr_map, setting->next()->name, driver, error); - - /* check for inverted off/on dispswitch order */ + // check for inverted off/on dispswitch order + int next_strindex = get_defstr_index(setting->next()->name, true); if (strindex == INPUT_STRING_On && next_strindex == INPUT_STRING_Off) - { - mame_printf_error("%s: %s has inverted Off/On dipswitch order\n", driver.source_file, driver.name); - *error = true; - } + mame_printf_error("%s option must have Off/On options in the order: Off, On\n", field.name); - /* check for inverted yes/no dispswitch order */ + // check for inverted yes/no dispswitch order else if (strindex == INPUT_STRING_Yes && next_strindex == INPUT_STRING_No) - { - mame_printf_error("%s: %s has inverted No/Yes dipswitch order\n", driver.source_file, driver.name); - *error = true; - } + mame_printf_error("%s option must have Yes/No options in the order: No, Yes\n", field.name); - /* check for inverted upright/cocktail dispswitch order */ + // check for inverted upright/cocktail dispswitch order else if (strindex == INPUT_STRING_Cocktail && next_strindex == INPUT_STRING_Upright) - { - mame_printf_error("%s: %s has inverted Upright/Cocktail dipswitch order\n", driver.source_file, driver.name); - *error = true; - } + mame_printf_error("%s option must have Upright/Cocktail options in the order: Upright, Cocktail\n", field.name); - /* check for proper coin ordering */ + // check for proper coin ordering else if (strindex >= __input_string_coinage_start && strindex <= __input_string_coinage_end && next_strindex >= __input_string_coinage_start && next_strindex <= __input_string_coinage_end && strindex >= next_strindex && memcmp(&setting->condition, &setting->next()->condition, sizeof(setting->condition)) == 0) { - mame_printf_error("%s: %s has unsorted coinage %s > %s\n", driver.source_file, driver.name, setting->name, setting->next()->name); - coin_error = *error = true; + mame_printf_error("%s option has unsorted coinage %s > %s\n", field.name, setting->name, setting->next()->name); + coin_error = true; } } } - /* if we have a coin error, demonstrate the correct way */ + // if we have a coin error, demonstrate the correct way if (coin_error) { - int entry; - - mame_printf_error("%s: %s proper coin sort order should be:\n", driver.source_file, driver.name); - for (entry = 0; entry < ARRAY_LENGTH(coin_list); entry++) + output_via_delegate(m_saved_error_output, " Note proper coin sort order should be:\n"); + for (int entry = 0; entry < ARRAY_LENGTH(coin_list); entry++) if (coin_list[entry]) - mame_printf_error("%s\n", input_port_string_from_index(__input_string_coinage_start + entry)); + output_via_delegate(m_saved_error_output, " %s\n", ioport_string_from_index(__input_string_coinage_start + entry)); } } -/*------------------------------------------------- - validate_inputs - validate input configuration --------------------------------------------------*/ - -static bool validate_inputs(driver_enumerator &drivlist, int_map &defstr_map, ioport_list &portlist) -{ - input_port_config *scanport; - input_port_config *port; - input_field_config *field; - const game_driver &driver = drivlist.driver(); - const machine_config &config = drivlist.config(); - int empty_string_found = FALSE; - bool error = false; - astring errorbuf; - - /* skip if no ports */ - if (driver.ipt == NULL) - return FALSE; +//------------------------------------------------- +// validate_condition - validate a condition +// stored within an ioport field or setting +//------------------------------------------------- + +void validity_checker::validate_condition(input_condition &condition, device_t &device, int_map &port_map) +{ + // resolve the tag + astring porttag; + device.subtag(porttag, condition.tag); + + // then find a matching port + if (port_map.find(porttag) == 0) + mame_printf_error("Condition referencing non-existent ioport tag '%s'\n", condition.tag); +} + + +//------------------------------------------------- +// validate_inputs - validate input configuration +//------------------------------------------------- + +void validity_checker::validate_inputs() +{ + int_map port_map; - /* allocate the input ports */ - for (device_t *cfg = config.devicelist().first(); cfg != NULL; cfg = cfg->next()) + // iterate over devices + device_iterator iter(m_current_config->root_device()); + for (device_t *device = iter.first(); device != NULL; device = iter.next()) { - input_port_list_init(*cfg, portlist, errorbuf); - if (errorbuf) - { - mame_printf_error("%s: %s has input port errors:\n%s\n", driver.source_file, driver.name, errorbuf.cstr()); - error = true; - } - } + // see if this device has ports; if not continue + if (device->input_ports() == NULL) + continue; - /* check for duplicate tags */ - for (port = portlist.first(); port != NULL; port = port->next()) - for (scanport = port->next(); scanport != NULL; scanport = scanport->next()) - if (strcmp(port->tag(), scanport->tag()) == 0) - { - mame_printf_error("%s: %s has a duplicate input port tag '%s'\n", driver.source_file, driver.name, port->tag()); - error = true; - } + // for non-root devices, track the current device + m_current_device = (device == &m_current_config->root_device()) ? NULL : device; - /* iterate over the results */ - for (port = portlist.first(); port != NULL; port = port->next()) - for (field = port->fieldlist().first(); field != NULL; field = field->next()) - { - input_setting_config *setting; - //int strindex = 0; + // allocate the input ports + ioport_list portlist; + astring errorbuf; + input_port_list_init(*device, portlist, errorbuf); - /* verify analog inputs */ - if (input_type_is_analog(field->type)) - validate_analog_input_field(field, driver, &error); + // report any errors during construction + if (errorbuf) + mame_printf_error("I/O port error during construction:\n%s\n", errorbuf.cstr()); - /* verify dip switches */ - if (field->type == IPT_DIPSWITCH) - { - /* dip switch fields must have a name */ - if (field->name == NULL) - { - mame_printf_error("%s: %s has a DIP switch name or setting with no name\n", driver.source_file, driver.name); - error = true; - } + // do a first pass over ports to add their names and find duplicates + for (input_port_config *port = portlist.first(); port != NULL; port = port->next()) + if (port_map.add(port->tag(), 1, false) == TMERR_DUPLICATE) + mame_printf_error("Multiple I/O ports with the same tag '%s' defined\n", port->tag()); - /* verify the settings list */ - validate_dip_settings(field, driver, defstr_map, &error); - } + // iterate over ports + for (input_port_config *port = portlist.first(); port != NULL; port = port->next()) + { + m_current_ioport = port->tag(); - /* look for invalid (0) types which should be mapped to IPT_OTHER */ - if (field->type == IPT_INVALID) + // iterate through the fields on this port + for (input_field_config *field = port->fieldlist().first(); field != NULL; field = field->next()) { - mame_printf_error("%s: %s has an input port with an invalid type (0); use IPT_OTHER instead\n", driver.source_file, driver.name); - error = true; - } + // verify analog inputs + if (input_type_is_analog(field->type)) + validate_analog_input_field(*field); - /* verify names */ - if (field->name != NULL) - { - /* check for empty string */ - if (field->name[0] == 0 && !empty_string_found) - { - mame_printf_error("%s: %s has an input with an empty string\n", driver.source_file, driver.name); - empty_string_found = error = true; - } + // look for invalid (0) types which should be mapped to IPT_OTHER + if (field->type == IPT_INVALID) + mame_printf_error("Field has an invalid type (0); use IPT_OTHER instead\n"); - /* check for trailing spaces */ - if (field->name[0] != 0 && field->name[strlen(field->name) - 1] == ' ') + // verify dip switches + if (field->type == IPT_DIPSWITCH) { - mame_printf_error("%s: %s input '%s' has trailing spaces\n", driver.source_file, driver.name, field->name); - error = true; + // dip switch fields must have a name + if (field->name == NULL) + mame_printf_error("DIP switch has a NULL name\n"); + + // verify the settings list + validate_dip_settings(*field); } - /* check for invalid UTF-8 */ - if (!utf8_is_valid_string(field->name)) + // verify names + if (field->name != NULL) { - mame_printf_error("%s: %s input '%s' has invalid characters\n", driver.source_file, driver.name, field->name); - error = true; + // check for empty string + if (field->name[0] == 0) + mame_printf_error("Field name is an empty string\n"); + + // check for trailing spaces + if (field->name[0] != 0 && field->name[strlen(field->name) - 1] == ' ') + mame_printf_error("Field '%s' has trailing spaces\n", field->name); + + // check for invalid UTF-8 + if (!utf8_is_valid_string(field->name)) + mame_printf_error("Field '%s' has invalid characters\n", field->name); + + // look up the string and print an error if default strings are not used + /*strindex =get_defstr_index(defstr_map, field->name, driver, &error);*/ } - /* look up the string and print an error if default strings are not used */ - /*strindex = */get_defstr_index(defstr_map, field->name, driver, &error); - } + // verify conditions on the field + if (field->condition.tag != NULL) + validate_condition(field->condition, *device, port_map); - /* verify conditions on the field */ - if (field->condition.tag != NULL) - { - /* find a matching port */ - for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) { - astring porttag; - port->owner().subtag(porttag, field->condition.tag); - if (strcmp(porttag.cstr(), scanport->tag()) == 0) - break; - } - /* if none, error */ - if (scanport == NULL) - { - mame_printf_error("%s: %s has a condition referencing non-existent input port tag '%s'\n", driver.source_file, driver.name, field->condition.tag); - error = true; - } + // verify conditions on the settings + for (input_setting_config *setting = field->settinglist().first(); setting != NULL; setting = setting->next()) + if (setting->condition.tag != NULL) + validate_condition(setting->condition, *device, port_map); } - /* verify conditions on the settings */ - for (setting = field->settinglist().first(); setting != NULL; setting = setting->next()) - if (setting->condition.tag != NULL) - { - /* find a matching port */ - for (scanport = portlist.first(); scanport != NULL; scanport = scanport->next()) { - astring porttag; - port->owner().subtag(porttag, setting->condition.tag); - if (strcmp(porttag.cstr(), scanport->tag()) == 0) - break; - } - /* if none, error */ - if (scanport == NULL) - { - mame_printf_error("%s: %s has a condition referencing non-existent input port tag '%s'\n", driver.source_file, driver.name, setting->condition.tag); - error = true; - } - } + // done with this port + m_current_ioport = NULL; } - error = error || validate_natural_keyboard_statics(); - - return error; + // done with this device + m_current_device = NULL; + } } -/*------------------------------------------------- - validate_devices - run per-device validity - checks --------------------------------------------------*/ +//------------------------------------------------- +// validate_devices - run per-device validity +// checks +//------------------------------------------------- -static bool validate_devices(driver_enumerator &drivlist, const ioport_list &portlist, region_array *rgninfo) +void validity_checker::validate_devices() { - bool error = false; - const game_driver &driver = drivlist.driver(); - const machine_config &config = drivlist.config(); + int_map device_map; - for (const device_t *device = config.devicelist().first(); device != NULL; device = device->next()) + // iterate over devices + device_iterator iter(m_current_config->root_device()); + for (const device_t *device = iter.first(); device != NULL; device = iter.next()) { - /* validate the device tag */ - if (!validate_tag(driver, device->name(), device->tag())) - error = true; - - /* look for duplicates */ - for (const device_t *scandevice = config.devicelist().first(); scandevice != device; scandevice = scandevice->next()) - if (strcmp(scandevice->tag(), device->tag()) == 0) - { - mame_printf_warning("%s: %s has multiple devices with the tag '%s'\n", driver.source_file, driver.name, device->tag()); - break; - } + // for non-root devices, track the current device + m_current_device = (device == &m_current_config->root_device()) ? NULL : device; - if (device->rom_region() != NULL && (strcmp(device->shortname(),"") == 0)) { - mame_printf_warning("Device %s does not have short name defined\n", device->name()); - } - /* check for device-specific validity check */ - if (device->validity_check(config.options(), driver)) - error = true; + // validate the device tag + validate_tag(device->basetag()); + + // look for duplicates + if (device_map.add(device->tag(), 0, false) == TMERR_DUPLICATE) + mame_printf_error("Multiple devices with the same tag '%s' defined\n", device->tag()); + + // if we have a ROM region, we must have a shortname + if (device->rom_region() != NULL && strcmp(device->shortname(), "") == 0) + mame_printf_error("Device %s has ROM definition but does not have short name defined\n", device->name()); + + // check for device-specific validity check + device->validity_check(*this); + // done with this device + m_current_device = NULL; } - return error; } -/*------------------------------------------------- - validate_slots - run per-slot validity - checks --------------------------------------------------*/ +//------------------------------------------------- +// validate_slots - run per-slot validity +// checks +//------------------------------------------------- -static bool validate_slots(driver_enumerator &drivlist) +void validity_checker::validate_slots() { - bool error = false; - const machine_config &config = drivlist.config(); - - const device_slot_interface *slot = NULL; - for (bool gotone = config.devicelist().first(slot); gotone; gotone = slot->next(slot)) + // iterate over slots + slot_interface_iterator iter(m_current_config->root_device()); + for (const device_slot_interface *slot = iter.first(); slot != NULL; slot = iter.next()) { - const slot_interface* intf = slot->get_slot_interfaces(); + // iterate over interfaces + const slot_interface *intf = slot->get_slot_interfaces(); for (int j = 0; intf[j].name != NULL; j++) { - device_t *dev = (*intf[j].devtype)(config, "dummy", config.devicelist().first(), 0); + // instantiate the device + device_t *dev = (*intf[j].devtype)(*m_current_config, "dummy", &m_current_config->root_device(), 0); dev->config_complete(); + + // if a ROM region is present if (dev->rom_region() != NULL) { - int cnt = 0; + bool has_romfiles = false; for (const rom_entry *romp = rom_first_region(*dev); !ROMENTRY_ISEND(romp); romp++) - { - if (ROMENTRY_ISFILE(romp)) { - cnt++; + if (ROMENTRY_ISFILE(romp)) + { + has_romfiles = true; + break; } - } - if (cnt > 0) { + if (has_romfiles) + { + // scan the list of devices for this device type bool found = false; - for(int i=0;itype() == *s_devices_sorted[i]) { found = true; break; } - } - if (!found) { - mame_printf_error("Device %s in slot %s is not listed in device list\n", dev->name(), intf[j].name); - error = true; - } + + // if not found, report an error + if (!found) + mame_printf_error("Device %s in slot %s is not listed in device list (mame_dev.lst / mess_dev.lst)\n", dev->shortname(), intf[j].name); } } global_free(dev); } } - return error; } -/*------------------------------------------------- - validate_drivers - master validity checker --------------------------------------------------*/ - -void validate_drivers(emu_options &options, const game_driver *curdriver) -{ - osd_ticks_t prep = 0; - osd_ticks_t driver_checks = 0; - osd_ticks_t rom_checks = 0; - osd_ticks_t gfx_checks = 0; - osd_ticks_t display_checks = 0; - osd_ticks_t input_checks = 0; - osd_ticks_t device_checks = 0; - - int strnum; - bool error = false; - UINT16 lsbtest; - UINT8 a, b; - - game_driver_map names; - game_driver_map descriptions; - game_driver_map roms; - int_map defstr; - - /* basic system checks */ - a = 0xff; - b = a + 1; - if (b > a) { mame_printf_error("UINT8 must be 8 bits\n"); error = true; } - - if (sizeof(INT8) != 1) { mame_printf_error("INT8 must be 8 bits\n"); error = true; } - if (sizeof(UINT8) != 1) { mame_printf_error("UINT8 must be 8 bits\n"); error = true; } - if (sizeof(INT16) != 2) { mame_printf_error("INT16 must be 16 bits\n"); error = true; } - if (sizeof(UINT16) != 2) { mame_printf_error("UINT16 must be 16 bits\n"); error = true; } - if (sizeof(INT32) != 4) { mame_printf_error("INT32 must be 32 bits\n"); error = true; } - if (sizeof(UINT32) != 4) { mame_printf_error("UINT32 must be 32 bits\n"); error = true; } - if (sizeof(INT64) != 8) { mame_printf_error("INT64 must be 64 bits\n"); error = true; } - if (sizeof(UINT64) != 8) { mame_printf_error("UINT64 must be 64 bits\n"); error = true; } -#ifdef PTR64 - if (sizeof(void *) != 8) { mame_printf_error("PTR64 flag enabled, but was compiled for 32-bit target\n"); error = true; } -#else - if (sizeof(void *) != 4) { mame_printf_error("PTR64 flag not enabled, but was compiled for 64-bit target\n"); error = true; } -#endif - lsbtest = 0; - *(UINT8 *)&lsbtest = 0xff; -#ifdef LSB_FIRST - if (lsbtest == 0xff00) { mame_printf_error("LSB_FIRST specified, but running on a big-endian machine\n"); error = true; } -#else - if (lsbtest == 0x00ff) { mame_printf_error("LSB_FIRST not specified, but running on a little-endian machine\n"); error = true; } -#endif +//------------------------------------------------- +// build_output_prefix - create a prefix +// indicating the current source file, driver, +// and device +//------------------------------------------------- - /* validate inline function behavior */ - error = validate_inlines() || error; +void validity_checker::build_output_prefix(astring &string) +{ + // start empty + string.reset(); - get_profile_ticks(); + // if we have a current device, indicate that + if (m_current_device != NULL) + string.cat(m_current_device->name()).cat(" device '").cat(m_current_device->tag()).cat("': "); + + // if we have a current port, indicate that as well + if (m_current_ioport != NULL) + string.cat("ioport '").cat(m_current_ioport).cat("': "); +} - /* pre-populate the defstr tagmap with all the default strings */ - prep -= get_profile_ticks(); - for (strnum = 1; strnum < INPUT_STRING_COUNT; strnum++) - { - const char *string = input_port_string_from_index(strnum); - if (string != NULL) - defstr.add(string, strnum, FALSE); - } - prep += get_profile_ticks(); - /* iterate over all drivers */ - driver_enumerator drivlist(options); - while (drivlist.next()) - { - const game_driver &driver = drivlist.driver(); - ioport_list portlist; - region_array rgninfo; +//------------------------------------------------- +// error_output - error message output override +//------------------------------------------------- - /* non-debug builds only care about games in the same driver */ - if (curdriver != NULL && strcmp(curdriver->source_file, driver.source_file) != 0) - continue; +void validity_checker::error_output(const char *format, va_list argptr) +{ + // count the error + m_errors++; - try - { - /* validate the driver entry */ - driver_checks -= get_profile_ticks(); - error = validate_driver(drivlist, names, descriptions) || error; - driver_checks += get_profile_ticks(); - - /* validate the ROM information */ - rom_checks -= get_profile_ticks(); - error = validate_roms(drivlist, &rgninfo, roms) || error; - rom_checks += get_profile_ticks(); - - /* validate input ports */ - input_checks -= get_profile_ticks(); - error = validate_inputs(drivlist, defstr, portlist) || error; - input_checks += get_profile_ticks(); - - /* validate the display */ - display_checks -= get_profile_ticks(); - error = validate_display(drivlist) || error; - display_checks += get_profile_ticks(); - - /* validate the graphics decoding */ - gfx_checks -= get_profile_ticks(); - error = validate_gfx(drivlist, &rgninfo) || error; - gfx_checks += get_profile_ticks(); - - /* validate devices */ - device_checks -= get_profile_ticks(); - error = validate_devices(drivlist, portlist, &rgninfo) || error; - error = validate_slots(drivlist) || error; - device_checks += get_profile_ticks(); - } - catch (emu_fatalerror &err) - { - throw emu_fatalerror("Validating %s (%s): %s", driver.name, driver.source_file, err.string()); - } - } + // output the source(driver) device 'tag' + astring output; + build_output_prefix(output); + + // generate the string + output.catvprintf(format, argptr); + m_error_text.cat(output); +} -#if (REPORT_TIMES) - mame_printf_info("Prep: %8dm\n", (int)(prep / 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)); - mame_printf_info("Display: %8dm\n", (int)(display_checks / 1000000)); - mame_printf_info("Graphics: %8dm\n", (int)(gfx_checks / 1000000)); - mame_printf_info("Input: %8dm\n", (int)(input_checks / 1000000)); -#endif - // on a general error, throw rather than return - if (error) - throw emu_fatalerror(MAMERR_FAILED_VALIDITY, "Validity checks failed"); +//------------------------------------------------- +// warning_output - warning message output +// override +//------------------------------------------------- + +void validity_checker::warning_output(const char *format, va_list argptr) +{ + // count the error + m_warnings++; + + // output the source(driver) device 'tag' + astring output; + build_output_prefix(output); + + // generate the string and output to the original target + output.catvprintf(format, argptr); + m_warning_text.cat(output); +} + + +//------------------------------------------------- +// output_via_delegate - helper to output a +// message via a varargs string, so the argptr +// can be forwarded onto the given delegate +//------------------------------------------------- + +void validity_checker::output_via_delegate(output_delegate &delegate, const char *format, ...) +{ + va_list argptr; + + // call through to the delegate with the proper parameters + va_start(argptr, format); + delegate(format, argptr); + va_end(argptr); } diff -Nru mame-0.144/src/emu/validity.h mame-0.145/src/emu/validity.h --- mame-0.144/src/emu/validity.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/validity.h 2012-02-06 21:30:28.000000000 +0000 @@ -4,8 +4,36 @@ Validity checks - 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. ***************************************************************************/ @@ -14,7 +42,94 @@ #ifndef __VALIDITY_H__ #define __VALIDITY_H__ -void validate_drivers(emu_options &options, const game_driver *driver = NULL); -bool validate_tag(const game_driver &driver, const char *object, const char *tag); +#include "emu.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// forward declarations +class machine_config; + + +// core validity checker class +class validity_checker +{ + // internal map types + typedef tagmap_t game_driver_map; + typedef tagmap_t int_map; + +public: + validity_checker(emu_options &options); + + // getters + int errors() const { return m_errors; } + int warnings() const { return m_warnings; } + + // operations + void check_driver(const game_driver &driver); + void check_shared_source(const game_driver &driver); + void check_all(); + + // helpers for devices + void validate_tag(const char *tag); + +private: + // internal helpers + const char *ioport_string_from_index(UINT32 index); + int get_defstr_index(const char *string, bool suppress_error = false); + + // core helpers + void validate_begin(); + void validate_end(); + void validate_one(const game_driver &driver); + + // internal sub-checks + void validate_core(); + void validate_inlines(); + void validate_driver(); + void validate_roms(); + void validate_display(); + void validate_gfx(); + void validate_analog_input_field(input_field_config &field); + void validate_dip_settings(input_field_config &field); + void validate_condition(input_condition &condition, device_t &device, int_map &port_map); + void validate_inputs(); + void validate_devices(); + void validate_slots(); + + // output helpers + void build_output_prefix(astring &string); + void error_output(const char *format, va_list argptr); + void warning_output(const char *format, va_list argptr); + void output_via_delegate(output_delegate &delegate, const char *format, ...); + + // internal driver list + driver_enumerator m_drivlist; + + // error tracking + int m_errors; + int m_warnings; + astring m_error_text; + astring m_warning_text; + + // maps for finding duplicates + game_driver_map m_names_map; + game_driver_map m_descriptions_map; + game_driver_map m_roms_map; + int_map m_defstr_map; + + // current state + const game_driver * m_current_driver; + const machine_config * m_current_config; + const device_t * m_current_device; + const char * m_current_ioport; + int_map m_region_map; + + // callbacks + output_delegate m_saved_error_output; + output_delegate m_saved_warning_output; +}; #endif diff -Nru mame-0.144/src/emu/video/315_5124.c mame-0.145/src/emu/video/315_5124.c --- mame-0.144/src/emu/video/315_5124.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/315_5124.c 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,1703 @@ +/********************************************************************* + + sega315_5124.c + + Implementation of video hardware chips used by Sega System E, + Master System, and Game Gear. + +**********************************************************************/ + +/* + For more information, please see: + - http://cgfm2.emuviews.com/txt/msvdp.txt + - http://www.smspower.org/forums/viewtopic.php?p=44198 + +A scanline contains the following sections: + - horizontal sync 1 ED => HSYNC high/increment line counter/generate interrupts/etc + - left blanking 2 ED-EE + - color burst 14 EE-EF + - left blanking 8 F5-F9 + - left border 13 F9-FF + - active display 256 00-7F + - right border 15 80-87 + - right blanking 8 87-8B + - horizontal sync 25 8B-97 => HSYNC low + + +NTSC frame timing + 256x192 256x224 256x240 (doesn't work on real hardware) + - vertical blanking 3 D5-D7 3 E5-E7 3 EE-F0 + - top blanking 13 D8-E4 13 E8-F4 13 F1-FD + - top border 27 E5-FF 11 F5-FF 3 FD-FF + - active display 192 00-BF 224 00-DF 240 00-EF + - bottom border 24 C0-D7 8 E0-E7 0 F0-F0 + - bottom blanking 3 D8-DA 3 E8-EA 3 F0-F2 + + +PAL frame timing + 256x192 256x224 256x240 + - vertical blanking 3 BA-BC 3 CA-CC 3 D2-D4 + - top blanking 13 BD-C9 13 CD-D9 13 D5-E1 + - top border 54 CA-FF 38 DA-FF 30 E2-FF + - active display 192 00-BF 224 00-DF 240 00-EF + - bottom border 48 C0-EF 32 E0-FF 24 F0-07 + - bottom blanking 3 F0-F2 3 00-02 3 08-0A + +*/ + +#include "emu.h" +#include "video/315_5124.h" +#include "machine/devhelpr.h" + + +#define STATUS_VINT 0x80 /* Pending vertical interrupt flag */ +#define STATUS_SPROVR 0x40 /* Sprite overflow flag */ +#define STATUS_SPRCOL 0x20 /* Object collision flag */ +#define STATUS_HINT 0x02 /* Pending horizontal interrupt flag */ + +#define VINT_HPOS 23 +#define HINT_HPOS 23 +#define VCOUNT_CHANGE_HPOS 22 +#define VINT_FLAG_HPOS 7 +#define SPROVR_HPOS 6 +#define SPRCOL_BASEHPOS 42 +#define DISPLAY_CB_HPOS 5 /* fix X-Scroll latchtime (Flubba's VDPTest) */ + +#define DRAW_TIME_GG 86 /* 1 + 2 + 14 +8 + 96/2 */ +#define DRAW_TIME_SMS 0 + +#define SEGA315_5378_CRAM_SIZE 0x40 /* 32 colors x 2 bytes per color = 64 bytes */ +#define SEGA315_5124_CRAM_SIZE 0x20 /* 32 colors x 1 bytes per color = 32 bytes */ + +#define VRAM_SIZE 0x4000 + +#define PRIORITY_BIT 0x1000 +#define BACKDROP_COLOR ((m_vdp_mode == 4 ? 0x10 : 0x00) + (m_reg[0x07] & 0x0f)) + +#define INIT_VCOUNT 0 +#define VERTICAL_BLANKING 1 +#define TOP_BLANKING 2 +#define TOP_BORDER 3 +#define ACTIVE_DISPLAY_V 4 +#define BOTTOM_BORDER 5 +#define BOTTOM_BLANKING 6 + +static const UINT8 ntsc_192[7] = { 0xd5, 3, 13, 27, 192, 24, 3 }; +static const UINT8 ntsc_224[7] = { 0xe5, 3, 13, 11, 224, 8, 3 }; +static const UINT8 ntsc_240[7] = { 0xee, 3, 13, 3, 240, 0, 3 }; +static const UINT8 pal_192[7] = { 0xba, 3, 13, 54, 192, 48, 3 }; +static const UINT8 pal_224[7] = { 0xca, 3, 13, 38, 224, 32, 3 }; +static const UINT8 pal_240[7] = { 0xd2, 3, 13, 30, 240, 24, 3 }; + + +const device_type SEGA315_5124 = &device_creator; +const device_type SEGA315_5246 = &device_creator; +const device_type SEGA315_5378 = &device_creator; + + +PALETTE_INIT( sega315_5124 ) +{ + int i; + for (i = 0; i < 64; i++) + { + int r = i & 0x03; + int g = (i & 0x0c) >> 2; + int b = (i & 0x30) >> 4; + palette_set_color_rgb(machine, i, r << 6, g << 6, b << 6); + } + /* TMS9918 palette */ + palette_set_color_rgb(machine, 64+ 0, 0, 0, 0); + palette_set_color_rgb(machine, 64+ 1, 0, 0, 0); + palette_set_color_rgb(machine, 64+ 2, 33, 200, 66); + palette_set_color_rgb(machine, 64+ 3, 94, 220, 120); + palette_set_color_rgb(machine, 64+ 4, 84, 85, 237); + palette_set_color_rgb(machine, 64+ 5, 125, 118, 252); + palette_set_color_rgb(machine, 64+ 6, 212, 82, 77); + palette_set_color_rgb(machine, 64+ 7, 66, 235, 245); + palette_set_color_rgb(machine, 64+ 8, 252, 85, 84); + palette_set_color_rgb(machine, 64+ 9, 255, 121, 120); + palette_set_color_rgb(machine, 64+10, 212, 193, 84); + palette_set_color_rgb(machine, 64+11, 230, 206, 128); + palette_set_color_rgb(machine, 64+12, 33, 176, 59); + palette_set_color_rgb(machine, 64+13, 201, 91, 186); + palette_set_color_rgb(machine, 64+14, 204, 204, 204); + palette_set_color_rgb(machine, 64+15, 255, 255, 255); +} + + +PALETTE_INIT( sega315_5378 ) +{ + int i; + for (i = 0; i < 4096; i++) + { + int r = i & 0x000f; + int g = (i & 0x00f0) >> 4; + int b = (i & 0x0f00) >> 8; + palette_set_color_rgb(machine, i, r << 4, g << 4, b << 4); + } +} + + +// default address map +static ADDRESS_MAP_START( sega315_5124, AS_0, 8 ) + AM_RANGE(0x0000, VRAM_SIZE-1) AM_RAM +ADDRESS_MAP_END + + +sega315_5124_device::sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t( mconfig, SEGA315_5124, "Sega 315-5124", tag, owner, clock ) + , device_memory_interface(mconfig, *this) + , m_cram_size( SEGA315_5124_CRAM_SIZE ) + , m_palette_offset( 0 ) + , m_supports_224_240( false ) + , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(sega315_5124)) +{ +} + + +sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240) + : device_t( mconfig, type, name, tag, owner, clock ) + , device_memory_interface(mconfig, *this) + , m_cram_size( cram_size ) + , m_palette_offset( palette_offset ) + , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(sega315_5124)) +{ +} + + +sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : sega315_5124_device( mconfig, SEGA315_5246, "Sega 315-5246", tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0, true ) +{ +} + + +sega315_5378_device::sega315_5378_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : sega315_5124_device( mconfig, SEGA315_5378, "Sega 315-5378", tag, owner, clock, SEGA315_5378_CRAM_SIZE, 0x10, true ) +{ +} + + +void sega315_5124_device::set_display_settings() +{ + bool M1 = m_reg[0x01] & 0x10; + bool M2 = m_reg[0x00] & 0x02; + bool M3 = m_reg[0x01] & 0x08; + bool M4 = m_reg[0x00] & 0x04; + + m_y_pixels = 192; + + if (M4) + { + /* mode 4 */ + m_vdp_mode = 4; + if ( m_supports_224_240 ) + { + if (M2) + { + if (M1 && !M3) + { + m_y_pixels = 224; /* 224-line display */ + } + else if (!M1 && M3) + { + m_y_pixels = 240; /* 240-line display */ + } + } + } + } + else + { + /* original TMS9918 mode */ + if (!M1 && !M2 && !M3) + { + m_vdp_mode = 0; + } + else +// if (M1 && !M2 && !M3) +// { +// m_vdp_mode = 1; +// } +// else + if (!M1 && M2 && !M3) + { + m_vdp_mode = 2; +// } +// else +// if (!M1 && !M2 && M3) +// { +// m_vdp_mode = 3; + } + else + { + logerror("Unknown video mode detected (M1 = %c, M2 = %c, M3 = %c, M4 = %c)\n", M1 ? '1' : '0', M2 ? '1' : '0', M3 ? '1' : '0', M4 ? '1' : '0'); + } + } + + switch (m_y_pixels) + { + case 192: + m_frame_timing = (m_is_pal) ? pal_192 : ntsc_192; + break; + + case 224: + m_frame_timing = (m_is_pal) ? pal_224 : ntsc_224; + break; + + case 240: + m_frame_timing = (m_is_pal) ? pal_240 : ntsc_240; + break; + } + m_cram_dirty = 1; +} + + +READ8_MEMBER( sega315_5124_device::vcount_read ) +{ + int vpos = m_screen->vpos(); + + if (m_screen->hpos() < VCOUNT_CHANGE_HPOS) + { + vpos--; + if (vpos < 0) + vpos += m_screen->height(); + } + + return (m_frame_timing[INIT_VCOUNT] + vpos) & 0xff; +} + + +READ8_MEMBER( sega315_5124_device::hcount_latch_read ) +{ + return m_hcounter; +} + + +WRITE8_MEMBER( sega315_5124_device::hcount_latch_write ) +{ + m_hcounter = data; +} + + +void sega315_5378_device::set_sega315_5124_compatibility_mode( bool sega315_5124_compatibility_mode ) +{ + m_sega315_5124_compatibility_mode = sega315_5124_compatibility_mode; + m_cram_mask = (!m_sega315_5124_compatibility_mode) ? (SEGA315_5378_CRAM_SIZE - 1) : (SEGA315_5124_CRAM_SIZE - 1); + m_draw_time = m_sega315_5124_compatibility_mode ? DRAW_TIME_SMS : DRAW_TIME_GG; +} + + +void sega315_5124_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch( id ) + { + case TIMER_LINE: + process_line_timer(); + break; + + case TIMER_DRAW: + draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, param, m_screen->vpos() - param ); + break; + + case TIMER_SET_STATUS_VINT: + m_status |= STATUS_VINT; + break; + + case TIMER_SET_STATUS_SPROVR: + m_status |= STATUS_SPROVR; + break; + + case TIMER_SET_STATUS_SPRCOL: + m_status |= STATUS_SPRCOL; + break; + + case TIMER_CHECK_HINT: + if (m_line_counter == 0x00) + { + m_line_counter = m_reg[0x0a]; + m_status |= STATUS_HINT; + } + else + { + m_line_counter--; + } + + if ((m_status & STATUS_HINT) && (m_reg[0x00] & 0x10)) + { + m_irq_state = 1; + + if ( !m_cb_int.isnull() ) + m_cb_int(ASSERT_LINE); + } + break; + + case TIMER_CHECK_VINT: + if ((m_status & STATUS_VINT) && (m_reg[0x01] & 0x20)) + { + m_irq_state = 1; + + if ( !m_cb_int.isnull() ) + m_cb_int(ASSERT_LINE); + } + break; + } +} + + +void sega315_5124_device::process_line_timer() +{ + rectangle rec; + int vpos = m_screen->vpos(); + int vpos_limit = m_frame_timing[VERTICAL_BLANKING] + m_frame_timing[TOP_BLANKING] + + m_frame_timing[TOP_BORDER] + m_frame_timing[ACTIVE_DISPLAY_V] + + m_frame_timing[BOTTOM_BORDER] + m_frame_timing[BOTTOM_BLANKING]; + + rec.min_y = rec.max_y = vpos; + + /* Check if we're on the last line of a frame */ + if (vpos == vpos_limit - 1) + { + m_line_counter = m_reg[0x0a]; + if ( !m_cb_pause.isnull() ) + m_cb_pause(0); + + return; + } + + vpos_limit -= m_frame_timing[BOTTOM_BLANKING]; + + /* Check if we're below the bottom border */ + if (vpos >= vpos_limit) + { + m_line_counter = m_reg[0x0a]; + return; + } + + vpos_limit -= m_frame_timing[BOTTOM_BORDER]; + + /* Check if we're in the bottom border area */ + if (vpos >= vpos_limit) + { + if (vpos == vpos_limit) + { + m_check_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) ); + } + else + { + m_line_counter = m_reg[0x0a]; + } + + if (vpos == vpos_limit + 1) + { + m_set_status_vint_timer->adjust( m_screen->time_until_pos( vpos, VINT_FLAG_HPOS ) ); + m_check_vint_timer->adjust( m_screen->time_until_pos( vpos, VINT_HPOS ) ); + } + + update_palette(); + + /* Draw left border */ + rec.min_x = SEGA315_5124_LBORDER_START; + rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + /* Draw right border */ + rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256; + rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + /* Draw middle of the border */ + /* We need to do this through the regular drawing function so it will */ + /* be included in the gamegear scaling functions */ + draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit - m_frame_timing[ACTIVE_DISPLAY_V], vpos - (vpos_limit - m_frame_timing[ACTIVE_DISPLAY_V]) ); + return; + } + + vpos_limit -= m_frame_timing[ACTIVE_DISPLAY_V]; + + /* Check if we're in the active display area */ + if (vpos >= vpos_limit) + { + if (vpos == vpos_limit) + { + m_reg9copy = m_reg[0x09]; + } + + m_check_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) ); + + update_palette(); + + /* Draw left border */ + rec.min_x = SEGA315_5124_LBORDER_START; + rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + /* Draw right border */ + rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256; + rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + select_sprites( vpos_limit, vpos - vpos_limit ); + if ( m_draw_time > 0 ) + { + m_draw_timer->adjust( m_screen->time_until_pos( vpos, m_draw_time ), vpos_limit ); + } + else + { + draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit, vpos - vpos_limit ); + } + return; + } + + vpos_limit -= m_frame_timing[TOP_BORDER]; + + /* Check if we're in the top border area */ + if (vpos >= vpos_limit) + { + m_line_counter = m_reg[0x0a]; + update_palette(); + + /* Draw left border */ + rec.min_x = SEGA315_5124_LBORDER_START; + rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + /* Draw right border */ + rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256; + rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1; + m_tmpbitmap.fill(machine().pens[m_current_palette[BACKDROP_COLOR]], rec); + m_y1_bitmap.fill(1, rec); + + /* Draw middle of the border */ + /* We need to do this through the regular drawing function so it will */ + /* be included in the gamegear scaling functions */ + select_sprites( vpos_limit, vpos - vpos_limit ); + draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit + m_frame_timing[TOP_BORDER], vpos - (vpos_limit + m_frame_timing[TOP_BORDER]) ); + return; + } + + /* we're in the vertical or top blanking area */ + m_line_counter = m_reg[0x0a]; +} + + +READ8_MEMBER( sega315_5124_device::vram_read ) +{ + UINT8 temp; + + /* SMS 2 & GG behaviour. Seems like the latched data is passed straight through */ + /* to the address register when in the middle of doing a command. */ + /* Cosmic Spacehead needs this, among others */ + /* Clear pending write flag */ + m_pending = 0; + + /* Return read buffer contents */ + temp = m_buffer; + + if ( !space.debugger_access() ) + { + /* Load read buffer */ + m_buffer = this->space()->read_byte(m_addr & 0x3fff); + + /* Bump internal addthis->ress register */ + m_addr += 1; + } + return temp; +} + + +READ8_MEMBER( sega315_5124_device::register_read ) +{ + UINT8 temp = m_status; + + if ( !space.debugger_access() ) + { + /* Clear pending write flag */ + m_pending = 0; + + m_status &= ~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL | STATUS_HINT); + + if (m_irq_state == 1) + { + m_irq_state = 0; + + if ( !m_cb_int.isnull() ) + m_cb_int(CLEAR_LINE); + } + } + + /* low 5 bits return non-zero data (it fixes PGA Tour Golf course map introduction) */ + return temp | 0x1f; +} + + +WRITE8_MEMBER( sega315_5124_device::vram_write ) +{ + /* SMS 2 & GG behaviour. Seems like the latched data is passed straight through */ + /* to the address register when in the middle of doing a command. */ + /* Cosmic Spacehead needs this, among others */ + /* Clear pending write flag */ + m_pending = 0; + + switch(m_addrmode) + { + case 0x00: + case 0x01: + case 0x02: + this->space()->write_byte(m_addr & 0x3fff, data); + break; + + case 0x03: + { + UINT16 address = m_addr & m_cram_mask; + if (data != m_CRAM->u8(address)) + { + m_CRAM->u8(address) = data; + m_cram_dirty = 1; + } + } + break; + } + + m_buffer = data; + m_addr += 1; +} + + +WRITE8_MEMBER( sega315_5124_device::register_write ) +{ + int reg_num; + + if (m_pending == 0) + { + m_addr = (m_addr & 0xff00) | data; + m_pending = 1; + } + else + { + /* Clear pending write flag */ + m_pending = 0; + + m_addrmode = (data >> 6) & 0x03; + m_addr = (data << 8) | (m_addr & 0xff); + switch (m_addrmode) + { + case 0: /* VRAM reading mode */ + m_buffer = this->space()->read_byte(m_addr & 0x3fff); + m_addr += 1; + break; + + case 1: /* VRAM writing mode */ + break; + + case 2: /* VDP register write */ + reg_num = data & 0x0f; + m_reg[reg_num] = m_addr & 0xff; + //logerror("%s: %s: setting register %x to %02x\n", machine().describe_context(), tag(), reg_num, m_addr & 0xf ); + if ( reg_num == 0 && ( m_addr & 0x02 ) ) + logerror("overscan enabled.\n"); + + if (reg_num == 0 || reg_num == 1) + set_display_settings(); + + if (reg_num == 1) + { + m_check_vint_timer->adjust( m_screen->time_until_pos( m_screen->vpos(), VINT_HPOS) ); + } + m_addrmode = 0; + break; + + case 3: /* CRAM writing mode */ + break; + } + } +} + + +UINT16 sega315_5124_device::get_name_table_address() +{ + UINT16 result; + + if ( m_y_pixels != 192 ) + { + result = ((m_reg[0x02] & 0x0c) << 10) | 0x0700; + } + else + { + result = (m_reg[0x02] << 10) & 0x3800; + } + + return result & (((m_reg[0x02] & 0x01) << 10) | 0x3bff); +} + + +UINT16 sega315_5246_device::get_name_table_address() +{ + UINT16 result; + + if ( m_y_pixels != 192 ) + { + result = ((m_reg[0x02] & 0x0c) << 10) | 0x0700; + } + else + { + result = (m_reg[0x02] << 10) & 0x3800; + } + + return result; +} + + +UINT16 sega315_5378_device::get_name_table_address() +{ + UINT16 result; + + if ( m_y_pixels != 192 ) + { + result = ((m_reg[0x02] & 0x0c) << 10) | 0x0700; + } + else + { + result = (m_reg[0x02] << 10) & 0x3800; + } + + return result; +} + + +void sega315_5124_device::draw_scanline_mode4( int *line_buffer, int *priority_selected, int line ) +{ + int tile_column; + int x_scroll, y_scroll, x_scroll_start_column; + int pixel_x, pixel_plot_x; + int bit_plane_0, bit_plane_1, bit_plane_2, bit_plane_3; + int scroll_mod = ( m_y_pixels != 192 ) ? 256 : 224; + UINT16 name_table_address = get_name_table_address(); + + /* if top 2 rows of screen not affected by horizontal scrolling, then x_scroll = 0 */ + /* else x_scroll = m_reg[0x08] */ + x_scroll = (((m_reg[0x00] & 0x40) && (line < 16)) ? 0 : 0x0100 - m_reg[0x08]); + + x_scroll_start_column = (x_scroll >> 3); /* x starting column tile */ + + /* Draw background layer */ + for (tile_column = 0; tile_column < 33; tile_column++) + { + UINT16 tile_data; + int tile_selected, palette_selected, horiz_selected, vert_selected, priority_select; + int tile_line; + + /* Rightmost 8 columns for SMS (or 2 columns for GG) not affected by */ + /* vertical scrolling when bit 7 of reg[0x00] is set */ + y_scroll = ((m_reg[0x00] & 0x80) && (tile_column > 23)) ? 0 : m_reg9copy; + + tile_line = ((tile_column + x_scroll_start_column) & 0x1f) * 2; + tile_data = space()->read_word(name_table_address + ((((line + y_scroll) % scroll_mod) >> 3) << 6) + tile_line); + + tile_selected = (tile_data & 0x01ff); + priority_select = tile_data & PRIORITY_BIT; + palette_selected = (tile_data >> 11) & 0x01; + vert_selected = (tile_data >> 10) & 0x01; + horiz_selected = (tile_data >> 9) & 0x01; + + tile_line = line - ((0x07 - (y_scroll & 0x07)) + 1); + if (vert_selected) + tile_line = 0x07 - tile_line; + + bit_plane_0 = space()->read_byte(((tile_selected << 5) + ((tile_line & 0x07) << 2)) + 0x00); + bit_plane_1 = space()->read_byte(((tile_selected << 5) + ((tile_line & 0x07) << 2)) + 0x01); + bit_plane_2 = space()->read_byte(((tile_selected << 5) + ((tile_line & 0x07) << 2)) + 0x02); + bit_plane_3 = space()->read_byte(((tile_selected << 5) + ((tile_line & 0x07) << 2)) + 0x03); + + for (pixel_x = 0; pixel_x < 8 ; pixel_x++) + { + UINT8 pen_bit_0, pen_bit_1, pen_bit_2, pen_bit_3; + UINT8 pen_selected; + + pen_bit_0 = (bit_plane_0 >> (7 - pixel_x)) & 0x01; + pen_bit_1 = (bit_plane_1 >> (7 - pixel_x)) & 0x01; + pen_bit_2 = (bit_plane_2 >> (7 - pixel_x)) & 0x01; + pen_bit_3 = (bit_plane_3 >> (7 - pixel_x)) & 0x01; + + pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0); + if (palette_selected) + pen_selected |= 0x10; + + + if (!horiz_selected) + { + pixel_plot_x = pixel_x; + } + else + { + pixel_plot_x = 7 - pixel_x; + } + pixel_plot_x = (0 - (x_scroll & 0x07) + (tile_column << 3) + pixel_plot_x); + if (pixel_plot_x >= 0 && pixel_plot_x < 256) + { +// logerror("%x %x\n", pixel_plot_x + pixel_offset_x, pixel_plot_y); + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x] = priority_select | (pen_selected & 0x0f); + } + } + } +} + + +void sega315_5124_device::select_sprites( int pixel_plot_y, int line ) +{ + int sprite_index = 0; + int max_sprites = 0; + + m_sprite_count = 0; + m_sprite_base = ((m_reg[0x05] << 7) & 0x3f00); + + if ( m_vdp_mode == 0 || m_vdp_mode == 2 ) + { + /* TMS9918 compatibility sprites */ + + max_sprites = 4; + + m_sprite_base = ((m_reg[0x05] & 0x7f) << 7); + m_sprite_height = 8; + + if (m_reg[0x01] & 0x02) /* Check if SI is set */ + m_sprite_height = m_sprite_height * 2; + if (m_reg[0x01] & 0x01) /* Check if MAG is set */ + m_sprite_height = m_sprite_height * 2; + + for (sprite_index = 0; (sprite_index < 32 * 4) && (space()->read_byte( m_sprite_base + sprite_index ) != 0xd0) && (m_sprite_count < max_sprites + 1); sprite_index += 4) + { + int sprite_y = space()->read_byte( m_sprite_base + sprite_index ) + 1; + + if (sprite_y > 240) + { + sprite_y -= 256; + } + + if ((line >= sprite_y) && (line < (sprite_y + m_sprite_height))) + { + if (m_sprite_count < max_sprites + 1) + { + m_selected_sprite[m_sprite_count] = sprite_index; + } + m_sprite_count++; + } + } + } + else + { + /* Regular sprites */ + + max_sprites = 8; + + m_sprite_base = ((m_reg[0x05] << 7) & 0x3f00); + m_sprite_height = (m_reg[0x01] & 0x02) ? 16 : 8; + m_sprite_zoom = (m_reg[0x01] & 0x01) ? 2 : 1; + + for (sprite_index = 0; (sprite_index < 64) && (space()->read_byte(m_sprite_base + sprite_index ) != 0xd0 || m_y_pixels != 192) && (m_sprite_count < max_sprites + 1); sprite_index++) + { + int sprite_y = space()->read_byte( m_sprite_base + sprite_index ) + 1; /* sprite y position starts at line 1 */ + + if (sprite_y > 240) + { + sprite_y -= 256; /* wrap from top if y position is > 240 */ + } + + if ((line >= sprite_y) && (line < (sprite_y + m_sprite_height * m_sprite_zoom))) + { + if (m_sprite_count < max_sprites + 1) + { + m_selected_sprite[m_sprite_count] = sprite_index; + } + m_sprite_count++; + } + } + } + + if ( m_sprite_count > max_sprites ) + { + /* Too many sprites per line */ + + m_sprite_count = max_sprites; + + if (line >= 0 && line < m_frame_timing[ACTIVE_DISPLAY_V]) + { + m_set_status_sprovr_timer->adjust( m_screen->time_until_pos( pixel_plot_y + line, SPROVR_HPOS ) ); + } + } +} + + +void sega315_5124_device::draw_sprites_mode4( int *line_buffer, int *priority_selected, int pixel_plot_y, int line ) +{ + bool sprite_col_occurred = false; + int sprite_col_x = 1000; + + /* Draw sprite layer */ + + /* Check if display is disabled */ + if (!(m_reg[0x01] & 0x40)) + return; + + memset(m_collision_buffer, 0, SEGA315_5124_WIDTH); + + for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--) + { + int sprite_index = m_selected_sprite[sprite_buffer_index]; + int sprite_y = space()->read_byte( m_sprite_base + sprite_index ) + 1; /* sprite y position starts at line 1 */ + int sprite_x = space()->read_byte( m_sprite_base + 0x80 + (sprite_index << 1) ); + int sprite_tile_selected = space()->read_byte( m_sprite_base + 0x81 + (sprite_index << 1) ); + + if (sprite_y > 240) + { + sprite_y -= 256; /* wrap from top if y position is > 240 */ + } + + if (m_reg[0x00] & 0x08) + { + sprite_x -= 0x08; /* sprite shift */ + } + + if (m_reg[0x06] & 0x04) + { + sprite_tile_selected += 256; /* pattern table select */ + } + + if (m_reg[0x01] & 0x02) + { + sprite_tile_selected &= 0x01fe; /* force even index */ + } + + int sprite_line = (line - sprite_y) / m_sprite_zoom; + + if (sprite_line > 0x07) + { + sprite_tile_selected += 1; + } + + UINT8 bit_plane_0 = space()->read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x00); + UINT8 bit_plane_1 = space()->read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x01); + UINT8 bit_plane_2 = space()->read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x02); + UINT8 bit_plane_3 = space()->read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x03); + + for (int pixel_x = 0; pixel_x < 8 ; pixel_x++) + { + UINT8 pen_bit_0 = (bit_plane_0 >> (7 - pixel_x)) & 0x01; + UINT8 pen_bit_1 = (bit_plane_1 >> (7 - pixel_x)) & 0x01; + UINT8 pen_bit_2 = (bit_plane_2 >> (7 - pixel_x)) & 0x01; + UINT8 pen_bit_3 = (bit_plane_3 >> (7 - pixel_x)) & 0x01; + UINT8 pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0) | 0x10; + + if (pen_selected == 0x10) /* Transparent palette so skip draw */ + { + continue; + } + + if (m_sprite_zoom > 1) + { + /* sprite doubling is enabled */ + int pixel_plot_x = sprite_x + (pixel_x << 1); + + /* check to prevent going outside of active display area */ + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (!(priority_selected[pixel_plot_x] & PRIORITY_BIT)) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x] = pen_selected; + line_buffer[pixel_plot_x + 1] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x + 1] = pen_selected; + } + else + { + if (priority_selected[pixel_plot_x] == PRIORITY_BIT) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x] = pen_selected; + } + if (priority_selected[pixel_plot_x + 1] == PRIORITY_BIT) + { + line_buffer[pixel_plot_x + 1] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x + 1] = pen_selected; + } + } + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + if (m_collision_buffer[pixel_plot_x + 1] != 1) + { + m_collision_buffer[pixel_plot_x + 1] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + else + { + int pixel_plot_x = sprite_x + pixel_x; + + /* check to prevent going outside of active display area */ + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (!(priority_selected[pixel_plot_x] & PRIORITY_BIT)) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x] = pen_selected; + } + else + { + if (priority_selected[pixel_plot_x] == PRIORITY_BIT) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + priority_selected[pixel_plot_x] = pen_selected; + } + } + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + } + if (sprite_col_occurred) + { + m_set_status_sprcol_timer->adjust( m_screen->time_until_pos( pixel_plot_y + line, SPRCOL_BASEHPOS + sprite_col_x ) ); + } + } +} + + +void sega315_5124_device::draw_sprites_tms9918_mode( int *line_buffer, int pixel_plot_y, int line ) +{ + bool sprite_col_occurred = false; + int sprite_col_x = 1000; + UINT16 sprite_pattern_base = ((m_reg[0x06] & 0x07) << 11); + + /* Draw sprite layer */ + + /* Check if display is disabled */ + if (!(m_reg[0x01] & 0x40)) + return; + + memset(m_collision_buffer, 0, SEGA315_5124_WIDTH); + + for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--) + { + int sprite_index = m_selected_sprite[sprite_buffer_index]; + int sprite_y = space()->read_byte( m_sprite_base + sprite_index ) + 1; + int sprite_x = space()->read_byte( m_sprite_base + sprite_index + 1 ); + UINT8 flags = space()->read_byte( m_sprite_base + sprite_index + 3 ); + int pen_selected = m_palette_offset + ( flags & 0x0f ); + + if (sprite_y > 240) + sprite_y -= 256; + + if (flags & 0x80) + sprite_x -= 32; + + int sprite_tile_selected = space()->read_byte( m_sprite_base + sprite_index + 2 ); + int sprite_line = line - sprite_y; + + if (m_reg[0x01] & 0x01) + sprite_line >>= 1; + + if (m_reg[0x01] & 0x02) + { + sprite_tile_selected &= 0xfc; + + if (sprite_line > 0x07) + { + sprite_tile_selected += 1; + sprite_line -= 8; + } + } + + UINT8 pattern = space()->read_byte( sprite_pattern_base + sprite_tile_selected * 8 + sprite_line ); + + for (int pixel_x = 0; pixel_x < 8; pixel_x++) + { + if (m_reg[0x01] & 0x01) + { + int pixel_plot_x = sprite_x + pixel_x * 2; + + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (pen_selected && (pattern & (1 << (7 - pixel_x)))) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + + line_buffer[pixel_plot_x+1] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x + 1] != 1) + { + m_collision_buffer[pixel_plot_x + 1] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + } + else + { + int pixel_plot_x = sprite_x + pixel_x; + + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (pen_selected && (pattern & (1 << (7 - pixel_x)))) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + } + } + + if (m_reg[0x01] & 0x02) + { + sprite_tile_selected += 2; + pattern = space()->read_byte( sprite_pattern_base + sprite_tile_selected * 8 + sprite_line ); + sprite_x += (m_reg[0x01] & 0x01 ? 16 : 8); + + for (int pixel_x = 0; pixel_x < 8; pixel_x++) + { + if (m_reg[0x01] & 0x01) + { + int pixel_plot_x = sprite_x + pixel_x * 2; + + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (pen_selected && (pattern & (1 << (7 - pixel_x)))) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + + line_buffer[pixel_plot_x+1] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x + 1] != 1) + { + m_collision_buffer[pixel_plot_x + 1] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + } + else + { + int pixel_plot_x = sprite_x + pixel_x; + + if (pixel_plot_x < 0 || pixel_plot_x > 255) + { + continue; + } + + if (pen_selected && (pattern & (1 << (7 - pixel_x)))) + { + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + + if (m_collision_buffer[pixel_plot_x] != 1) + { + m_collision_buffer[pixel_plot_x] = 1; + } + else + { + sprite_col_occurred = true; + sprite_col_x = MIN(sprite_col_x, pixel_plot_x); + } + } + } + } + } + if (sprite_col_occurred) + { + m_set_status_sprcol_timer->adjust( m_screen->time_until_pos( pixel_plot_y + line, SPRCOL_BASEHPOS + sprite_col_x ) ); + } + } +} + + +void sega315_5124_device::draw_scanline_mode2( int *line_buffer, int line ) +{ + int tile_column; + int pixel_x, pixel_plot_x; + UINT16 name_table_base, color_base, pattern_base; + int pattern_mask, color_mask, pattern_offset; + + /* Draw background layer */ + name_table_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32); + color_base = ((m_reg[0x03] & 0x80) << 6); + color_mask = ((m_reg[0x03] & 0x7f) << 3) | 0x07; + pattern_base = ((m_reg[0x04] & 0x04) << 11); + pattern_mask = ((m_reg[0x04] & 0x03) << 8) | 0xff; + pattern_offset = (line & 0xc0) << 2; + + for (tile_column = 0; tile_column < 32; tile_column++) + { + UINT8 name = space()->read_byte( name_table_base + tile_column ); + UINT8 pattern; + UINT8 colors; + + pattern = space()->read_byte(pattern_base + (((pattern_offset + name) & pattern_mask) * 8) + (line & 0x07) ); + colors = space()->read_byte(color_base + (((pattern_offset + name) & color_mask) * 8) + (line & 0x07) ); + + for (pixel_x = 0; pixel_x < 8; pixel_x++) + { + UINT8 pen_selected; + + if (pattern & (1 << (7 - pixel_x))) + { + pen_selected = colors >> 4; + } + else + { + pen_selected = colors & 0x0f; + } + + if (!pen_selected) + pen_selected = BACKDROP_COLOR; + + pixel_plot_x = (tile_column << 3) + pixel_x; + + pen_selected += m_palette_offset; + + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + } + } +} + + +void sega315_5124_device::draw_scanline_mode0( int *line_buffer, int line ) +{ + int tile_column; + int pixel_x, pixel_plot_x; + UINT16 name_base, color_base, pattern_base; + + /* Draw background layer */ + name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32); + color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1)); + pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1)); + + for (tile_column = 0; tile_column < 32; tile_column++) + { + UINT8 name = space()->read_byte( name_base + tile_column ); + UINT8 pattern; + UINT8 colors; + + pattern = space()->read_byte( pattern_base + (name * 8) + (line & 0x07) ); + colors = space()->read_byte( color_base + ( name >> 3 ) ); + + for (pixel_x = 0; pixel_x < 8; pixel_x++) + { + int pen_selected; + + if (pattern & (1 << (7 - pixel_x))) + pen_selected = colors >> 4; + else + pen_selected = colors & 0x0f; + + pen_selected += m_palette_offset; + + pixel_plot_x = (tile_column << 3) + pixel_x; + line_buffer[pixel_plot_x] = m_current_palette[pen_selected]; + } + } +} + + +void sega315_5124_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, int line ) +{ + int x; + int *blitline_buffer = m_line_buffer; + int priority_selected[256]; + + if ( line < m_frame_timing[ACTIVE_DISPLAY_V] ) + { + switch( m_vdp_mode ) + { + case 0: + memset(priority_selected, 1, sizeof(priority_selected)); + if ( line >= 0 ) + { + draw_scanline_mode0( blitline_buffer, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_tms9918_mode( blitline_buffer, pixel_plot_y, line ); + } + break; + + case 2: + memset(priority_selected, 1, sizeof(priority_selected)); + if ( line >= 0 ) + { + draw_scanline_mode2( blitline_buffer, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_tms9918_mode( blitline_buffer, pixel_plot_y, line ); + } + break; + + case 4: + default: + memset(priority_selected, 0, sizeof(priority_selected)); + if ( line >= 0 ) + { + draw_scanline_mode4( blitline_buffer, priority_selected, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_mode4( blitline_buffer, priority_selected, pixel_plot_y, line ); + if ( line >= 0 ) + { + /* Fill column 0 with overscan color from m_reg[0x07] */ + if (m_reg[0x00] & 0x20) + { + blitline_buffer[0] = m_current_palette[BACKDROP_COLOR]; + priority_selected[0] = 1; + blitline_buffer[1] = m_current_palette[BACKDROP_COLOR]; + priority_selected[1] = 1; + blitline_buffer[2] = m_current_palette[BACKDROP_COLOR]; + priority_selected[2] = 1; + blitline_buffer[3] = m_current_palette[BACKDROP_COLOR]; + priority_selected[3] = 1; + blitline_buffer[4] = m_current_palette[BACKDROP_COLOR]; + priority_selected[4] = 1; + blitline_buffer[5] = m_current_palette[BACKDROP_COLOR]; + priority_selected[5] = 1; + blitline_buffer[6] = m_current_palette[BACKDROP_COLOR]; + priority_selected[6] = 1; + blitline_buffer[7] = m_current_palette[BACKDROP_COLOR]; + priority_selected[7] = 1; + } + } + } + break; + } + } + + UINT32 *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x); + UINT8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x); + + /* Check if display is disabled or we're below/above active area */ + if (!(m_reg[0x01] & 0x40) || line < 0 || line >= m_frame_timing[ACTIVE_DISPLAY_V]) + { + for (x = 0; x < 256; x++) + { + p_bitmap[x] = machine().pens[m_current_palette[BACKDROP_COLOR]]; + p_y1[x] = 1; + } + } + else + { + for (x = 0; x < 256; x++) + { + p_bitmap[x] = machine().pens[blitline_buffer[x]]; + p_y1[x] = ( priority_selected[x] & 0x0f ) ? 0 : 1; + } + } +} + + +void sega315_5378_device::draw_scanline( int pixel_offset_x, int pixel_plot_y, int line ) +{ + int x; + int *blitline_buffer = m_line_buffer; + int priority_selected[256]; + + if ( line < m_frame_timing[ACTIVE_DISPLAY_V] ) + { + switch( m_vdp_mode ) + { + case 0: + if ( line >= 0 ) + { + draw_scanline_mode0( blitline_buffer, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_tms9918_mode( blitline_buffer, pixel_plot_y, line ); + } + break; + + case 2: + if ( line >= 0 ) + { + draw_scanline_mode2( blitline_buffer, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_tms9918_mode( blitline_buffer, pixel_plot_y, line ); + } + break; + + case 4: + default: + memset(priority_selected, 0, sizeof(priority_selected)); + if ( line >= 0 ) + { + draw_scanline_mode4( blitline_buffer, priority_selected, line ); + } + if ( line >= 0 || ( line >= -13 && m_y_pixels == 192 ) ) + { + draw_sprites_mode4( blitline_buffer, priority_selected, pixel_plot_y, line ); + if ( line >= 0 ) + { + /* Fill column 0 with overscan color from m_reg[0x07] */ + if (m_reg[0x00] & 0x20) + { + blitline_buffer[0] = m_current_palette[BACKDROP_COLOR]; + priority_selected[0] = 1; + blitline_buffer[1] = m_current_palette[BACKDROP_COLOR]; + priority_selected[1] = 1; + blitline_buffer[2] = m_current_palette[BACKDROP_COLOR]; + priority_selected[2] = 1; + blitline_buffer[3] = m_current_palette[BACKDROP_COLOR]; + priority_selected[3] = 1; + blitline_buffer[4] = m_current_palette[BACKDROP_COLOR]; + priority_selected[4] = 1; + blitline_buffer[5] = m_current_palette[BACKDROP_COLOR]; + priority_selected[5] = 1; + blitline_buffer[6] = m_current_palette[BACKDROP_COLOR]; + priority_selected[6] = 1; + blitline_buffer[7] = m_current_palette[BACKDROP_COLOR]; + priority_selected[7] = 1; + } + } + } + break; + } + } + + /* Check if display is disabled or we're below/above active area */ + if (!(m_reg[0x01] & 0x40) || line < 0 || line >= m_frame_timing[ACTIVE_DISPLAY_V]) + { + for (x = 0; x < 256; x++) + { + blitline_buffer[x] = m_current_palette[BACKDROP_COLOR]; + } + } + + if (m_sega315_5124_compatibility_mode) + { + int *combineline_buffer = m_line_buffer + ((line & 0x03) + 1) * 256; + int plot_x = 48; + + /* Do horizontal scaling */ + for (x = 8; x < 248;) + { + int combined; + + /* Take red and green from first pixel, and blue from second pixel */ + combined = (blitline_buffer[x] & 0x00ff) | (blitline_buffer[x + 1] & 0x0f00); + combineline_buffer[plot_x] = combined; + + /* Take red from second pixel, and green and blue from third pixel */ + combined = (blitline_buffer[x + 1] & 0x000f) | (blitline_buffer[x + 2] & 0x0ff0); + combineline_buffer[plot_x + 1] = combined; + x += 3; + plot_x += 2; + } + + /* Do vertical scaling for a screen with 192 or 224 lines + Lines 0-2 and 221-223 have no effect on the output on the GG screen. + We will calculate the gamegear lines as follows: + GG_0 = 1/6 * SMS_3 + 1/3 * SMS_4 + 1/3 * SMS_5 + 1/6 * SMS_6 + GG_1 = 1/6 * SMS_4 + 1/3 * SMS_5 + 1/3 * SMS_6 + 1/6 * SMS_7 + GG_2 = 1/6 * SMS_6 + 1/3 * SMS_7 + 1/3 * SMS_8 + 1/6 * SMS_9 + GG_3 = 1/6 * SMS_7 + 1/3 * SMS_8 + 1/3 * SMS_9 + 1/6 * SMS_10 + GG_4 = 1/6 * SMS_9 + 1/3 * SMS_10 + 1/3 * SMS_11 + 1/6 * SMS_12 + ..... + GG_142 = 1/6 * SMS_216 + 1/3 * SMS_217 + 1/3 * SMS_218 + 1/6 * SMS_219 + GG_143 = 1/6 * SMS_217 + 1/3 * SMS_218 + 1/3 * SMS_219 + 1/6 * SMS_220 + */ + { + int gg_line; + int my_line = pixel_plot_y + line - (SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT); + int *line1, *line2, *line3, *line4; + + /* First make sure there's enough data to draw anything */ + /* We need one more line of data if we're on line 8, 11, 14, 17, etc */ + if (my_line < 6 || my_line > 220 || ((my_line - 8) % 3 == 0)) + { + return; + } + + gg_line = ((my_line - 6) / 3) * 2; + + /* If we're on SMS line 7, 10, 13, etc we're on an odd GG line */ + if (my_line % 3) + { + gg_line++; + } + + /* Calculate the line we will be drawing on */ + pixel_plot_y = SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 24 + gg_line; + + /* Setup our source lines */ + line1 = m_line_buffer + (((my_line - 3) & 0x03) + 1) * 256; + line2 = m_line_buffer + (((my_line - 2) & 0x03) + 1) * 256; + line3 = m_line_buffer + (((my_line - 1) & 0x03) + 1) * 256; + line4 = m_line_buffer + (((my_line - 0) & 0x03) + 1) * 256; + + for (x = 0 + 48; x < 160 + 48; x++) + { + rgb_t c1 = machine().pens[line1[x]]; + rgb_t c2 = machine().pens[line2[x]]; + rgb_t c3 = machine().pens[line3[x]]; + rgb_t c4 = machine().pens[line4[x]]; + m_tmpbitmap.pix32(pixel_plot_y, pixel_offset_x + x) = + MAKE_RGB((RGB_RED(c1) / 6 + RGB_RED(c2) / 3 + RGB_RED(c3) / 3 + RGB_RED(c4) / 6 ), + (RGB_GREEN(c1) / 6 + RGB_GREEN(c2) / 3 + RGB_GREEN(c3) / 3 + RGB_GREEN(c4) / 6 ), + (RGB_BLUE(c1) / 6 + RGB_BLUE(c2) / 3 + RGB_BLUE(c3) / 3 + RGB_BLUE(c4) / 6 ) ); + } + return; + } + blitline_buffer = combineline_buffer; + } + + for (x = 0; x < 256; x++) + { + m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x + x) = machine().pens[blitline_buffer[x]]; + } +} + + +void sega315_5124_device::update_palette() +{ + int i; + + /* Exit if palette is has no changes */ + if (m_cram_dirty == 0) + { + return; + } + m_cram_dirty = 0; + + if (m_vdp_mode != 4) + { + for(i = 0; i < 16; i++) + { + m_current_palette[i] = 64 + i; + } + return; + } + + for (i = 0; i < 32; i++) + { + m_current_palette[i] = m_CRAM->u8(i) & 0x3f; + } +} + + +void sega315_5378_device::update_palette() +{ + int i; + + /* Exit if palette is has no changes */ + if (m_cram_dirty == 0) + { + return; + } + m_cram_dirty = 0; + + if (m_sega315_5124_compatibility_mode) + { + for (i = 0; i < 32; i++) + { + m_current_palette[i] = ((m_CRAM->u8(i) & 0x30) << 6) | ((m_CRAM->u8(i) & 0x0c ) << 4) | ((m_CRAM->u8(i) & 0x03) << 2); + } + } + else + { + for (i = 0; i < 32; i++) + { + m_current_palette[i] = ((m_CRAM->u8(i * 2 + 1) << 8) | m_CRAM->u8(i * 2)) & 0x0fff; + } + } +} + + +UINT32 sega315_5124_device::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect ) +{ + copybitmap(bitmap, m_tmpbitmap, 0, 0, 0, 0, cliprect); + return 0; +} + + +/***************************************************************************** + DEVICE INTERFACE +*****************************************************************************/ + +void sega315_5124_device::device_config_complete() +{ + const sega315_5124_interface *intf = reinterpret_cast(static_config()); + + if ( intf != NULL ) + { + *static_cast(this) = *intf; + } + else + { + fatalerror("No sega315_5124_interface supplied\n"); + } +} + + +void sega315_5124_device::device_start() +{ + m_screen = machine().device( m_screen_tag ); + + /* Resolve callbacks */ + m_cb_int.resolve( m_int_callback, *this ); + m_cb_pause.resolve( m_pause_callback, *this ); + + /* Allocate video RAM */ + astring tempstring; + m_CRAM = machine().region_alloc(subtag(tempstring,"vdp_cram"), SEGA315_5378_CRAM_SIZE, 1, ENDIANNESS_LITTLE); + m_line_buffer = auto_alloc_array(machine(), int, 256 * 5); + + m_frame_timing = (m_is_pal) ? pal_192 : ntsc_192; + + /* Make temp bitmap for rendering */ + m_screen->register_screen_bitmap(m_tmpbitmap); + m_screen->register_screen_bitmap(m_y1_bitmap); + + m_display_timer = timer_alloc(TIMER_LINE); + m_display_timer->adjust(m_screen->time_until_pos(0, DISPLAY_CB_HPOS), 0, m_screen->scan_period()); + m_draw_timer = timer_alloc(TIMER_DRAW); + m_set_status_vint_timer = timer_alloc( TIMER_SET_STATUS_VINT ); + m_set_status_sprovr_timer = timer_alloc( TIMER_SET_STATUS_SPROVR ); + m_set_status_sprcol_timer = timer_alloc( TIMER_SET_STATUS_SPRCOL ); + m_check_hint_timer = timer_alloc( TIMER_CHECK_HINT ); + m_check_vint_timer = timer_alloc( TIMER_CHECK_VINT ); + + save_item(NAME(m_status)); + save_item(NAME(m_reg9copy)); + save_item(NAME(m_addrmode)); + save_item(NAME(m_addr)); + save_item(NAME(m_cram_mask)); + save_item(NAME(m_cram_dirty)); + save_item(NAME(m_pending)); + save_item(NAME(m_buffer)); + save_item(NAME(m_sega315_5124_compatibility_mode)); + save_item(NAME(m_irq_state)); + save_item(NAME(m_vdp_mode)); + save_item(NAME(m_y_pixels)); + save_item(NAME(m_line_counter)); + save_item(NAME(m_hcounter)); + save_item(NAME(m_reg)); + save_item(NAME(m_current_palette)); + save_pointer(NAME(m_line_buffer), 256 * 5); + save_item(NAME(m_collision_buffer)); + save_item(NAME(m_tmpbitmap)); + save_item(NAME(m_y1_bitmap)); + save_item(NAME(m_draw_time)); +} + + +void sega315_5124_device::device_reset() +{ + int i; + + /* Most register are 0x00 at power-up */ + for (i = 0; i < 16; i++) + m_reg[i] = 0x00; + + m_reg[0x02] = 0x0e; + m_reg[0x0a] = 0xff; + + m_status = 0; + m_reg9copy = 0; + m_addrmode = 0; + m_addr = 0; + m_sega315_5124_compatibility_mode = false; + m_cram_mask = m_cram_size - 1; + m_cram_dirty = 1; + m_pending = 0; + m_buffer = 0; + m_irq_state = 0; + m_line_counter = 0; + m_hcounter = 0; + m_draw_time = DRAW_TIME_SMS; + + for (i = 0; i < 0x20; i++) + m_current_palette[i] = 0; + + set_display_settings(); + + /* Clear RAM */ + memset(m_CRAM->base(), 0, SEGA315_5378_CRAM_SIZE); + memset(m_line_buffer, 0, 256 * 5 * sizeof(int)); +} + + +void sega315_5378_device::device_reset() +{ + sega315_5124_device::device_reset(); + m_draw_time = DRAW_TIME_GG; +} + + diff -Nru mame-0.144/src/emu/video/315_5124.h mame-0.145/src/emu/video/315_5124.h --- mame-0.144/src/emu/video/315_5124.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/315_5124.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,211 @@ +/************************************************************************* + + sega315_5124.h + + Implementation of Sega VDP chips used in System E, Master System and Game Gear + +**************************************************************************/ + +#ifndef __SEGA315_5124_H__ +#define __SEGA315_5124_H__ + +#include "devcb.h" + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define SEGA315_5124_WIDTH 342 /* 342 pixels */ +#define SEGA315_5124_HEIGHT_NTSC 262 /* 262 lines */ +#define SEGA315_5124_HEIGHT_PAL 313 /* 313 lines */ +#define SEGA315_5124_LBORDER_START (1 + 2 + 14 + 8) +#define SEGA315_5124_LBORDER_WIDTH 13 /* 13 pixels */ +#define SEGA315_5124_RBORDER_WIDTH 15 /* 15 pixels */ +#define SEGA315_5124_TBORDER_START (3 + 13) +#define SEGA315_5124_NTSC_192_TBORDER_HEIGHT (0x1b) /* 27 lines */ +//#define SEGA315_5124_NTSC_192_BBORDER_HEIGHT (0x18) /* 24 lines */ +#define SEGA315_5124_NTSC_224_TBORDER_HEIGHT (0x0b) /* 11 lines */ +//#define SEGA315_5124_NTSC_224_BBORDER_HEIGHT (0x08) /* 8 lines */ +//#define SEGA315_5124_PAL_192_TBORDER_HEIGHT (0x36) /* 54 lines */ +//#define SEGA315_5124_PAL_192_BBORDER_HEIGHT (0x30) /* 48 lines */ +//#define SEGA315_5124_PAL_224_TBORDER_HEIGHT (0x26) /* 38 lines */ +//#define SEGA315_5124_PAL_224_BBORDER_HEIGHT (0x20) /* 32 lines */ +#define SEGA315_5124_PAL_240_TBORDER_HEIGHT (0x1e) /* 30 lines */ +//#define SEGA315_5124_PAL_240_BBORDER_HEIGHT (0x18) /* 24 lines */ + + +#define SEGA315_5124_PALETTE_SIZE (64+16) +#define SEGA315_5378_PALETTE_SIZE 4096 + +PALETTE_INIT( sega315_5124 ); +PALETTE_INIT( sega315_5378 ); + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +typedef struct _sega315_5124_interface sega315_5124_interface; +struct _sega315_5124_interface +{ + bool m_is_pal; /* false = NTSC, true = PAL */ + const char *m_screen_tag; + devcb_write_line m_int_callback; /* Interrupt callback function */ + devcb_write_line m_pause_callback; /* Pause callback function */ +}; + + +extern const device_type SEGA315_5124; /* aka SMS1 vdp */ +extern const device_type SEGA315_5246; /* aka SMS2 vdp */ +extern const device_type SEGA315_5378; /* aka Gamegear vdp */ + + +class sega315_5124_device : public device_t, + public sega315_5124_interface, + public device_memory_interface +{ +public: + // construction/destruction + sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240); + + DECLARE_READ8_MEMBER( vram_read ); + DECLARE_WRITE8_MEMBER( vram_write ); + DECLARE_READ8_MEMBER( register_read ); + DECLARE_WRITE8_MEMBER( register_write ); + DECLARE_READ8_MEMBER( vcount_read ); + DECLARE_READ8_MEMBER( hcount_latch_read ); + DECLARE_WRITE8_MEMBER( hcount_latch_write ); + + bitmap_rgb32 &get_bitmap() { return m_tmpbitmap; }; + bitmap_ind8 &get_y1_bitmap() { return m_y1_bitmap; }; + + /* update the screen */ + UINT32 screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect ); + + virtual void set_sega315_5124_compatibility_mode( bool sega315_5124_compatibility_mode ) { }; + +protected: + void set_display_settings(); + virtual void update_palette(); + virtual void draw_scanline( int pixel_offset_x, int pixel_plot_y, int line ); + virtual UINT16 get_name_table_address(); + void process_line_timer(); + void draw_scanline_mode4( int *line_buffer, int *priority_selected, int line ); + void draw_sprites_mode4( int *line_buffer, int *priority_selected, int pixel_plot_y, int line ); + void draw_sprites_tms9918_mode( int *line_buffer, int pixel_plot_y, int line ); + void draw_scanline_mode2( int *line_buffer, int line ); + void draw_scanline_mode0( int *line_buffer, int line ); + void select_sprites( int pixel_plot_y, int line ); + + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_0) ? &m_space_config : NULL; } + + UINT8 m_reg[16]; /* All the registers */ + UINT8 m_status; /* Status register */ + UINT8 m_reg9copy; /* Internal copy of register 9 */ + UINT8 m_addrmode; /* Type of VDP action */ + UINT16 m_addr; /* Contents of internal VDP address register */ + UINT8 m_cram_size; /* CRAM size */ + UINT8 m_cram_mask; /* Mask to switch between SMS and GG CRAM sizes */ + int m_cram_dirty; /* Have there been any changes to the CRAM area */ + int m_pending; + UINT8 m_buffer; + bool m_sega315_5124_compatibility_mode; /* Shrunk SMS screen on GG lcd mode flag */ + int m_irq_state; /* The status of the IRQ line of the VDP */ + int m_vdp_mode; /* Current mode of the VDP: 0,1,2,3,4 */ + int m_y_pixels; /* 192, 224, 240 */ + int m_draw_time; + UINT8 m_line_counter; + UINT8 m_hcounter; + memory_region *m_CRAM; /* Pointer to CRAM */ + const UINT8 *m_frame_timing; + bitmap_rgb32 m_tmpbitmap; + bitmap_ind8 m_y1_bitmap; + UINT8 m_collision_buffer[SEGA315_5124_WIDTH]; + UINT8 m_palette_offset; + bool m_supports_224_240; + UINT16 m_sprite_base; + int m_selected_sprite[8]; + int m_sprite_count; + int m_sprite_height; + int m_sprite_zoom; + + /* line_buffer will be used to hold 5 lines of line data. Line #0 is the regular blitting area. + Lines #1-#4 will be used as a kind of cache to be used for vertical scaling in the gamegear + sms compatibility mode. */ + int *m_line_buffer; + int m_current_palette[32]; + devcb_resolved_write_line m_cb_int; + devcb_resolved_write_line m_cb_pause; + emu_timer *m_display_timer; + emu_timer *m_set_status_vint_timer; + emu_timer *m_set_status_sprovr_timer; + emu_timer *m_set_status_sprcol_timer; + emu_timer *m_check_hint_timer; + emu_timer *m_check_vint_timer; + emu_timer *m_draw_timer; + screen_device *m_screen; + + const address_space_config m_space_config; + + /* Timers */ + static const device_timer_id TIMER_LINE = 0; + static const device_timer_id TIMER_SET_STATUS_VINT = 1; + static const device_timer_id TIMER_SET_STATUS_SPROVR = 2; + static const device_timer_id TIMER_CHECK_HINT = 3; + static const device_timer_id TIMER_CHECK_VINT = 4; + static const device_timer_id TIMER_SET_STATUS_SPRCOL = 5; + static const device_timer_id TIMER_DRAW = 6; +}; + + +class sega315_5246_device : public sega315_5124_device +{ +public: + sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual UINT16 get_name_table_address(); +}; + + +class sega315_5378_device : public sega315_5124_device +{ +public: + sega315_5378_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + virtual void device_reset(); + + virtual void set_sega315_5124_compatibility_mode( bool sega315_5124_compatibility_mode ); + +protected: + virtual void update_palette(); + virtual void draw_scanline( int pixel_offset_x, int pixel_plot_y, int line ); + virtual UINT16 get_name_table_address(); +}; + + +/*************************************************************************** + DEVICE CONFIGURATION MACROS +***************************************************************************/ + +#define MCFG_SEGA315_5124_ADD(_tag, _interface) \ + MCFG_DEVICE_ADD(_tag, SEGA315_5124, 0) \ + MCFG_DEVICE_CONFIG(_interface) + +#define MCFG_SEGA315_5246_ADD(_tag, _interface) \ + MCFG_DEVICE_ADD(_tag, SEGA315_5246, 0) \ + MCFG_DEVICE_CONFIG(_interface) + +#define MCFG_SEGA315_5378_ADD(_tag, _interface) \ + MCFG_DEVICE_ADD(_tag, SEGA315_5378, 0) \ + MCFG_DEVICE_CONFIG(_interface) + +#endif /* __SEGA315_5124_H__ */ diff -Nru mame-0.144/src/emu/video/cdp1861.c mame-0.145/src/emu/video/cdp1861.c --- mame-0.144/src/emu/video/cdp1861.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/cdp1861.c 2012-02-06 21:30:27.000000000 +0000 @@ -82,7 +82,7 @@ // find devices m_cpu = machine().device(m_cpu_tag); m_screen = machine().device(m_screen_tag); - m_bitmap = auto_bitmap_alloc(machine(), m_screen->width(), m_screen->height(), m_screen->format()); + m_screen->register_screen_bitmap(m_bitmap); // register for state saving save_item(NAME(m_disp)); @@ -214,7 +214,7 @@ for (x = 0; x < 8; x++) { int color = BIT(data, 7); - *BITMAP_ADDR16(m_bitmap, y, sx + x) = color; + m_bitmap.pix16(y, sx + x) = color; data <<= 1; } } @@ -248,10 +248,10 @@ //------------------------------------------------- -// update_screen - +// screen_update - //------------------------------------------------- -void cdp1861_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 cdp1861_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_disp) { @@ -259,6 +259,7 @@ } else { - bitmap_fill(bitmap, cliprect, get_black_pen(machine())); + bitmap.fill(get_black_pen(machine()), cliprect); } + return 0; } diff -Nru mame-0.144/src/emu/video/cdp1861.h mame-0.145/src/emu/video/cdp1861.h --- mame-0.144/src/emu/video/cdp1861.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/cdp1861.h 2012-02-06 21:30:27.000000000 +0000 @@ -70,9 +70,9 @@ MCFG_DEVICE_CONFIG(_config) -#define MCFG_CDP1861_SCREEN_ADD(_tag, _clock) \ +#define MCFG_CDP1861_SCREEN_ADD(_cdptag, _tag, _clock) \ MCFG_SCREEN_ADD(_tag, RASTER) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ + MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1861_device, screen_update) \ MCFG_SCREEN_RAW_PARAMS(_clock, CDP1861_SCREEN_WIDTH, CDP1861_HBLANK_END, CDP1861_HBLANK_START, CDP1861_TOTAL_SCANLINES, CDP1861_SCANLINE_VBLANK_END, CDP1861_SCANLINE_VBLANK_START) @@ -113,7 +113,7 @@ DECLARE_WRITE_LINE_MEMBER( disp_on_w ); DECLARE_WRITE_LINE_MEMBER( disp_off_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -132,7 +132,7 @@ devcb_resolved_write_line m_out_efx_func; screen_device *m_screen; // screen - bitmap_t *m_bitmap; // bitmap + bitmap_ind16 m_bitmap; // bitmap int m_disp; // display enabled int m_dispon; // display on latch diff -Nru mame-0.144/src/emu/video/cdp1862.c mame-0.145/src/emu/video/cdp1862.c --- mame-0.144/src/emu/video/cdp1862.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/cdp1862.c 2012-02-06 21:30:27.000000000 +0000 @@ -122,7 +122,7 @@ // find devices m_screen = machine().device(m_screen_tag); - m_bitmap = auto_bitmap_alloc(machine(), m_screen->width(), m_screen->height(), m_screen->format()); + m_screen->register_screen_bitmap(m_bitmap); // init palette initialize_palette(); @@ -171,7 +171,7 @@ color = (gd << 2) | (bd << 1) | rd; } - *BITMAP_ADDR16(m_bitmap, y, sx + x) = color; + m_bitmap.pix16(y, sx + x) = color; data <<= 1; } @@ -210,11 +210,12 @@ //------------------------------------------------- -// update_screen - +// screen_update - //------------------------------------------------- -void cdp1862_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 cdp1862_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); - bitmap_fill(m_bitmap, cliprect, CDP1862_BACKGROUND_COLOR_SEQUENCE[m_bgcolor] + 8); + m_bitmap.fill(CDP1862_BACKGROUND_COLOR_SEQUENCE[m_bgcolor] + 8, cliprect); + return 0; } diff -Nru mame-0.144/src/emu/video/cdp1862.h mame-0.145/src/emu/video/cdp1862.h --- mame-0.144/src/emu/video/cdp1862.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/cdp1862.h 2012-02-06 21:30:27.000000000 +0000 @@ -94,7 +94,7 @@ DECLARE_WRITE_LINE_MEMBER( bkg_w ); DECLARE_WRITE_LINE_MEMBER( con_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -110,7 +110,7 @@ devcb_resolved_read_line m_in_gd_func; screen_device *m_screen; // screen - bitmap_t *m_bitmap; // bitmap + bitmap_ind16 m_bitmap; // bitmap int m_bgcolor; // background color int m_con; // color on diff -Nru mame-0.144/src/emu/video/cgapal.c mame-0.145/src/emu/video/cgapal.c --- mame-0.144/src/emu/video/cgapal.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/cgapal.c 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,432 @@ + +/* CGA palettes + * + * The first 16 are for RGB monitors + * The next 16 are for greyscale modes + * The next 16 are for text modes on colour composite + * The next 16*16 are Mode 6 (colour composite) } + * The next 64*16 are Mode 4 (colour composite) } both indexed by the CGA colour select register 0x3D9 + * + */ + +#include "video/pc_cga.h" +#include "video/cgapal.h" + +const unsigned char cga_palette[16 * CGA_PALETTE_SETS][3] = +{ +/* RGB colours */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0xaa }, { 0x00, 0xaa, 0x00 }, { 0x00, 0xaa, 0xaa }, + { 0xaa, 0x00, 0x00 }, { 0xaa, 0x00, 0xaa }, { 0xaa, 0x55, 0x00 }, { 0xaa, 0xaa, 0xaa }, + { 0x55, 0x55, 0x55 }, { 0x55, 0x55, 0xff }, { 0x55, 0xff, 0x55 }, { 0x55, 0xff, 0xff }, + { 0xff, 0x55, 0x55 }, { 0xff, 0x55, 0xff }, { 0xff, 0xff, 0x55 }, { 0xff, 0xff, 0xff }, +/* Greyscale */ + { 0x00, 0x00, 0x00 }, { 0x11, 0x11, 0x11 }, { 0x44, 0x44, 0x44 }, { 0x55, 0x55, 0x55 }, + { 0x22, 0x22, 0x22 }, { 0x33, 0x33, 0x33 }, { 0x66, 0x66, 0x66 }, { 0x77, 0x77, 0x77 }, + { 0x88, 0x88, 0x88 }, { 0x99, 0x99, 0x99 }, { 0xCC, 0xCC, 0xCC }, { 0xDD, 0xDD, 0xDD }, + { 0xAA, 0xAA, 0xAA }, { 0xBB, 0xBB, 0xBB }, { 0xEE, 0xEE, 0xEE }, { 0xFF, 0xFF, 0xFF }, +/* Text mode, composite monitor */ + { 0x00, 0x00, 0x00 }, { 0x0E, 0x00, 0x7A }, { 0x07, 0x55, 0x00 }, { 0x02, 0x65, 0x39 }, + { 0x51, 0x00, 0x1A }, { 0x54, 0x00, 0x76 }, { 0x48, 0x63, 0x00 }, { 0x8c, 0x8c, 0x8c }, + { 0x38, 0x38, 0x38 }, { 0x58, 0x49, 0xD5 }, { 0x5F, 0xAD, 0x26 }, { 0x5B, 0xB9, 0xAC }, + { 0xAA, 0x4A, 0x5E }, { 0xA7, 0x55, 0xD2 }, { 0xA2, 0xB9, 0x31 }, { 0xE2, 0xE2, 0xE2 }, +/* Composite hi-res, colour reg = 0 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 }, +/* Composite hi-res, colour reg = 1 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x04, 0x04 }, { 0x00, 0x00, 0x61 }, { 0x00, 0x00, 0x6b }, + { 0x25, 0x00, 0x1E }, { 0x15, 0x00, 0x23 }, { 0x18, 0x00, 0x87 }, { 0x06, 0x00, 0x91 }, + { 0x00, 0x00, 0x00 }, { 0x00, 0x0b, 0x00 }, { 0x00, 0x00, 0x4C }, { 0x00, 0x02, 0x52 }, + { 0x24, 0x00, 0x08 }, { 0x0E, 0x00, 0x0D }, { 0x18, 0x00, 0x6f }, { 0x07, 0x00, 0x7C }, +/* Composite hi-res, colour reg = 2 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x28, 0x00 }, { 0x01, 0x00, 0x46 }, { 0x00, 0x21, 0x36 }, + { 0x22, 0x00, 0x01 }, { 0x00, 0x21, 0x00 }, { 0x1b, 0x00, 0x43 }, { 0x00, 0x22, 0x33 }, + { 0x07, 0x0D, 0x00 }, { 0x00, 0x4B, 0x00 }, { 0x04, 0x0E, 0x00 }, { 0x00, 0x57, 0x00 }, + { 0x25, 0x02, 0x00 }, { 0x01, 0x46, 0x00 }, { 0x30, 0x04, 0x00 }, { 0x04, 0x53, 0x00 }, +/* Composite hi-res, colour reg = 3 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x30, 0x00 }, { 0x00, 0x00, 0x8E }, { 0x00, 0x38, 0x87 }, + { 0x2E, 0x00, 0x01 }, { 0x00, 0x21, 0x00 }, { 0x22, 0x00, 0x8C }, { 0x00, 0x35, 0x95 }, + { 0x00, 0x0F, 0x00 }, { 0x00, 0x4F, 0x00 }, { 0x00, 0x0B, 0x3F }, { 0x00, 0x62, 0x45 }, + { 0x29, 0x00, 0x00 }, { 0x00, 0x4E, 0x00 }, { 0x35, 0x04, 0x48 }, { 0x01, 0x62, 0x49 }, +/* Composite hi-res, colour reg = 4 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x06, 0x02 }, { 0x01, 0x00, 0x1f }, { 0x00, 0x00, 0x24 }, + { 0x54, 0x00, 0x38 }, { 0x25, 0x00, 0x23 }, { 0x3A, 0x00, 0x4f }, { 0x29, 0x00, 0x56 }, + { 0x10, 0x03, 0x00 }, { 0x06, 0x08, 0x00 }, { 0x15, 0x00, 0x00 }, { 0x02, 0x03, 0x00 }, + { 0x82, 0x00, 0x00 }, { 0x49, 0x00, 0x00 }, { 0x5B, 0x00, 0x0b }, { 0x52, 0x00, 0x0c }, +/* Composite hi-res, colour reg = 5 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x2c, 0x00 }, { 0x06, 0x01, 0x57 }, { 0x00, 0x22, 0x42 }, + { 0x33, 0x00, 0x01 }, { 0x00, 0x26, 0x00 }, { 0x3a, 0x00, 0x54 }, { 0x08, 0x1D, 0x54 }, + { 0x13, 0x17, 0x00 }, { 0x00, 0x64, 0x00 }, { 0x29, 0x15, 0x00 }, { 0x00, 0x64, 0x00 }, + { 0x59, 0x0A, 0x00 }, { 0x30, 0x61, 0x00 }, { 0x7A, 0x06, 0x00 }, { 0x4A, 0x64, 0x00 }, +/* Composite hi-res, colour reg = 6 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x33, 0x00 }, { 0x06, 0x00, 0x5E }, { 0x00, 0x22, 0x45 }, + { 0x34, 0x00, 0x04 }, { 0x00, 0x1e, 0x00 }, { 0x3d, 0x00, 0x4c }, { 0x0c, 0x22, 0x58 }, + { 0x18, 0x19, 0x00 }, { 0x00, 0x62, 0x00 }, { 0x2b, 0x14, 0x00 }, { 0x01, 0x64, 0x00 }, + { 0x57, 0x0f, 0x00 }, { 0x29, 0x63, 0x00 }, { 0x78, 0x09, 0x00 }, { 0x51, 0x61, 0x00 }, +/* Composite hi-res, colour reg = 7 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x3C, 0x01 }, { 0x04, 0x00, 0xC5 }, { 0x00, 0x4C, 0xC7 }, + { 0x6A, 0x00, 0x15 }, { 0x28, 0x28, 0x24 }, { 0x8A, 0x00, 0xF8 }, { 0x70, 0x61, 0xFF }, + { 0x20, 0x33, 0x00 }, { 0x00, 0x85, 0x00 }, { 0x2E, 0x25, 0x28 }, { 0x00, 0x98, 0x3B }, + { 0xb1, 0x11, 0x00 }, { 0x6A, 0x75, 0x00 }, { 0xcc, 0x16, 0x81 }, { 0x91, 0x8e, 0x91 }, +/* Composite hi-res, colour reg = 8 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x12, 0x0F }, { 0x04, 0x00, 0x5F }, { 0x00, 0x02, 0x67 }, + { 0x31, 0x00, 0x01 }, { 0x04, 0x01, 0x04 }, { 0x37, 0x00, 0x52 }, { 0x17, 0x00, 0x6d }, + { 0x00, 0x10, 0x00 }, { 0x00, 0x29, 0x00 }, { 0x04, 0x03, 0x04 }, { 0x00, 0x24, 0x16 }, + { 0x2f, 0x00, 0x00 }, { 0x07, 0x23, 0x00 }, { 0x43, 0x00, 0x08 }, { 0x25, 0x23, 0x24 }, +/* Composite hi-res, colour reg = 9 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x19, 0x14 }, { 0x00, 0x00, 0xc2 }, { 0x00, 0x1c, 0xed }, + { 0x5e, 0x00, 0x13 }, { 0x2c, 0x03, 0x3a }, { 0x78, 0x00, 0xfa }, { 0x49, 0x11, 0xff }, + { 0x00, 0x15, 0x00 }, { 0x00, 0x40, 0x00 }, { 0x0d, 0x11, 0x68 }, { 0x00, 0x4f, 0x9c }, + { 0x67, 0x00, 0x00 }, { 0x39, 0x36, 0x00 }, { 0x91, 0x05, 0xa6 }, { 0x62, 0x45, 0xdc }, +/* Composite hi-res, colour reg = A */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x4B, 0x08 }, { 0x05, 0x00, 0xAA }, { 0x00, 0x50, 0xc7 }, + { 0x58, 0x00, 0x06 }, { 0x05, 0x44, 0x06 }, { 0x75, 0x00, 0xb0 }, { 0x2e, 0x4f, 0xdc }, + { 0x0c, 0x2f, 0x00 }, { 0x00, 0xa7, 0x00 }, { 0x26, 0x2e, 0x03 }, { 0x00, 0xb4, 0x24 }, + { 0x84, 0x1b, 0x00 }, { 0x2d, 0xa5, 0x00 }, { 0xa5, 0x2a, 0x16 }, { 0x5f, 0xb2, 0x2a }, +/* Composite hi-res, colour reg = B */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x59, 0x07 }, { 0x00, 0x08, 0xf0 }, { 0x00, 0x06, 0xfd }, + { 0x69, 0x00, 0x09 }, { 0x0d, 0x4c, 0x10 }, { 0x8f, 0x00, 0xf4 }, { 0x38, 0x66, 0xff }, + { 0x02, 0x27, 0x00 }, { 0x00, 0xac, 0x00 }, { 0x19, 0x2f, 0x6d }, { 0x00, 0xc5, 0x82 }, + { 0x7b, 0x18, 0x00 }, { 0x30, 0xa7, 0x00 }, { 0xac, 0x2b, 0x81 }, { 0x5b, 0xc0, 0xa4 }, +/* Composite hi-res, colour reg = C */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x1C, 0x0C }, { 0x0a, 0x00, 0x7c }, { 0x00, 0x0d, 0x8f }, + { 0x6e, 0x00, 0x18 }, { 0x48, 0x02, 0x4a }, { 0x95, 0x00, 0xc3 }, { 0x68, 0x01, 0xef }, + { 0x12, 0x1d, 0x00 }, { 0x00, 0x53, 0x00 }, { 0x33, 0x21, 0x00 }, { 0x05, 0x52, 0x13 }, + { 0xb4, 0x09, 0x00 }, { 0x87, 0x41, 0x00 }, { 0xd8, 0x07, 0x3a }, { 0xb0, 0x49, 0x63 }, +/* Composite hi-res, colour reg = D */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x1d, 0x17 }, { 0x00, 0x08, 0xcf }, { 0x00, 0x1b, 0xf2 }, + { 0x83, 0x00, 0x30 }, { 0x4c, 0x08, 0x53 }, { 0xae, 0x00, 0xfa }, { 0x85, 0x0b, 0xff }, + { 0x09, 0x19, 0x00 }, { 0x00, 0x57, 0x00 }, { 0x21, 0x15, 0x4f }, { 0x00, 0x5e, 0x89 }, + { 0xb0, 0x04, 0x00 }, { 0x76, 0x4e, 0x00 }, { 0xe2, 0x0a, 0xa9 }, { 0xae, 0x56, 0xe1 }, +/* Composite hi-res, colour reg = E */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x57, 0x06 }, { 0x17, 0x00, 0xc3 }, { 0x00, 0x55, 0xd9 }, + { 0x6f, 0x00, 0x06 }, { 0x18, 0x49, 0x0d }, { 0xa4, 0x00, 0xcd }, { 0x4e, 0x4c, 0xf7 }, + { 0x1c, 0x3f, 0x00 }, { 0x00, 0xbf, 0x00 }, { 0x51, 0x35, 0x00 }, { 0x06, 0xc4, 0x1b }, + { 0xb6, 0x2d, 0x00 }, { 0x73, 0xb2, 0x00 }, { 0xf5, 0x30, 0x21 }, { 0xaa, 0xbf, 0x2f }, +/* Composite hi-res, colour reg = F */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x68, 0x10 }, { 0x10, 0x00, 0xff }, { 0x00, 0x7c, 0xFF }, + { 0xb3, 0x00, 0x2A }, { 0x53, 0x55, 0x51 }, { 0xf0, 0x00, 0xff }, { 0x95, 0x72, 0xff }, + { 0x25, 0x3e, 0x00 }, { 0x00, 0xda, 0x00 }, { 0x58, 0x52, 0x56 }, { 0x00, 0xf8, 0x7f }, + { 0xf8, 0x2c, 0x00 }, { 0xa8, 0xcf, 0x00 }, { 0xff, 0x41, 0xb8 }, { 0xed, 0xea, 0xed }, +/* Composite lo-res, colour reg = 0 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x26, 0x34 }, { 0x00, 0x00, 0x24 }, { 0x00, 0x25, 0x46 }, + { 0x29, 0x03, 0x00 }, { 0x04, 0x55, 0x00 }, { 0x1f, 0x0c, 0x00 }, { 0x0e, 0x53, 0x03 }, + { 0x50, 0x00, 0x00 }, { 0x33, 0x36, 0x2b }, { 0x51, 0x00, 0x0b }, { 0x43, 0x37, 0x44 }, + { 0x60, 0x07, 0x00 }, { 0x3c, 0x61, 0x00 }, { 0x59, 0x1c, 0x00 }, { 0x4a, 0x64, 0x00 }, +/* Composite lo-res, colour reg = 1 */ + { 0x07, 0x00, 0x7d }, { 0x00, 0x21, 0x4e }, { 0x15, 0x00, 0x36 }, { 0x04, 0x19, 0x77 }, + { 0x16, 0x1a, 0x00 }, { 0x04, 0x55, 0x00 }, { 0x23, 0x0b, 0x00 }, { 0x13, 0x51, 0x03 }, + { 0x41, 0x02, 0x3e }, { 0x2e, 0x33, 0x24 }, { 0x51, 0x00, 0x14 }, { 0x41, 0x33, 0x46 }, + { 0x51, 0x2b, 0x00 }, { 0x3f, 0x60, 0x00 }, { 0x60, 0x17, 0x00 }, { 0x4d, 0x61, 0x00 }, +/* Composite lo-res, colour reg = 2 */ + { 0x03, 0x55, 0x00 }, { 0x03, 0x55, 0x00 }, { 0x21, 0x0c, 0x00 }, { 0x11, 0x51, 0x03 }, + { 0x03, 0x55, 0x00 }, { 0x03, 0x55, 0x00 }, { 0x21, 0x0c, 0x00 }, { 0x11, 0x51, 0x03 }, + { 0x31, 0x37, 0x29 }, { 0x30, 0x36, 0x2a }, { 0x51, 0x00, 0x11 }, { 0x41, 0x34, 0x46 }, + { 0x3c, 0x63, 0x00 }, { 0x3d, 0x63, 0x00 }, { 0x5f, 0x17, 0x00 }, { 0x4d, 0x61, 0x00 }, +/* Composite lo-res, colour reg = 3 */ + { 0x04, 0x61, 0x4e }, { 0x05, 0x49, 0x02 }, { 0x1f, 0x04, 0x00 }, { 0x12, 0x47, 0x13 }, + { 0x03, 0x68, 0x2f }, { 0x05, 0x54, 0x00 }, { 0x1e, 0x0e, 0x00 }, { 0x0f, 0x51, 0x01 }, + { 0x26, 0x46, 0x73 }, { 0x2f, 0x34, 0x27 }, { 0x50, 0x00, 0x0b }, { 0x48, 0x31, 0x47 }, + { 0x3e, 0x70, 0x1e }, { 0x40, 0x5f, 0x00 }, { 0x57, 0x1d, 0x00 }, { 0x4a, 0x62, 0x00 }, +/* Composite lo-res, colour reg = 4 */ + { 0x52, 0x00, 0x14 }, { 0x2e, 0x32, 0x25 }, { 0x52, 0x00, 0x14 }, { 0x46, 0x2f, 0x47 }, + { 0x1f, 0x09, 0x00 }, { 0x04, 0x55, 0x00 }, { 0x21, 0x0e, 0x00 }, { 0x11, 0x50, 0x02 }, + { 0x52, 0x00, 0x14 }, { 0x2d, 0x33, 0x25 }, { 0x52, 0x00, 0x14 }, { 0x40, 0x36, 0x3f }, + { 0x5c, 0x18, 0x00 }, { 0x40, 0x5f, 0x00 }, { 0x5e, 0x19, 0x00 }, { 0x4b, 0x62, 0x00 }, +/* Composite lo-res, colour reg = 5 */ + { 0x51, 0x00, 0x81 }, { 0x2a, 0x2a, 0x3f }, { 0x4f, 0x00, 0x1c }, { 0x3b, 0x2b, 0x5c }, + { 0x22, 0x1b, 0x13 }, { 0x04, 0x55, 0x00 }, { 0x21, 0x0e, 0x00 }, { 0x0e, 0x52, 0x04 }, + { 0x4c, 0x03, 0x59 }, { 0x2e, 0x32, 0x25 }, { 0x51, 0x00, 0x0b }, { 0x3e, 0x37, 0x3d }, + { 0x5d, 0x2a, 0x03 }, { 0x3d, 0x60, 0x00 }, { 0x5d, 0x19, 0x00 }, { 0x4a, 0x63, 0x00 }, +/* Composite lo-res, colour reg = 6 */ + { 0x4b, 0x60, 0x00 }, { 0x41, 0x5f, 0x00 }, { 0x5b, 0x1a, 0x00 }, { 0x4b, 0x60, 0x00 }, + { 0x0e, 0x51, 0x03 }, { 0x03, 0x55, 0x00 }, { 0x22, 0x0b, 0x00 }, { 0x12, 0x51, 0x03 }, + { 0x41, 0x34, 0x47 }, { 0x31, 0x37, 0x29 }, { 0x50, 0x00, 0x10 }, { 0x3f, 0x32, 0x43 }, + { 0x4b, 0x60, 0x00 }, { 0x3d, 0x61, 0x00 }, { 0x62, 0x16, 0x00 }, { 0x4b, 0x60, 0x00 }, +/* Composite lo-res, colour reg = 7 */ + { 0x8b, 0x8b, 0x8b }, { 0x83, 0x5b, 0x00 }, { 0xa4, 0x1b, 0x00 }, { 0x92, 0x5a, 0x09 }, + { 0x07, 0x79, 0x6f }, { 0x06, 0x55, 0x00 }, { 0x1f, 0x0d, 0x00 }, { 0x10, 0x52, 0x01 }, + { 0x23, 0x62, 0xa4 }, { 0x2b, 0x33, 0x29 }, { 0x51, 0x00, 0x11 }, { 0x40, 0x36, 0x42 }, + { 0x46, 0x86, 0x63 }, { 0x42, 0x5e, 0x00 }, { 0x5e, 0x17, 0x00 }, { 0x4a, 0x62, 0x00 }, +/* Composite lo-res, colour reg = 8 */ + { 0x26, 0x26, 0x26 }, { 0x0a, 0x49, 0x00 }, { 0x25, 0x07, 0x00 }, { 0x16, 0x4c, 0x0e }, + { 0x1c, 0x29, 0x12 }, { 0x06, 0x55, 0x00 }, { 0x21, 0x0c, 0x00 }, { 0x11, 0x51, 0x02 }, + { 0x4d, 0x10, 0x5f }, { 0x2c, 0x33, 0x26 }, { 0x51, 0x00, 0x0f }, { 0x41, 0x35, 0x47 }, + { 0x5a, 0x35, 0x00 }, { 0x43, 0x5f, 0x00 }, { 0x5f, 0x15, 0x00 }, { 0x4d, 0x62, 0x00 }, +/* Composite lo-res, colour reg = 9 */ + { 0x92, 0x47, 0xd3 }, { 0x47, 0x47, 0x1b }, { 0x66, 0x00, 0x09 }, { 0x54, 0x44, 0x37 }, + { 0x15, 0x4b, 0x8a }, { 0x05, 0x55, 0x00 }, { 0x00, 0x10, 0x00 }, { 0x10, 0x52, 0x02 }, + { 0x40, 0x33, 0xd4 }, { 0x2f, 0x33, 0x26 }, { 0x51, 0x00, 0x0d }, { 0x3e, 0x37, 0x3e }, + { 0x51, 0x59, 0x75 }, { 0x3b, 0x63, 0x00 }, { 0x5b, 0x1a, 0x00 }, { 0x49, 0x64, 0x00 }, +/* Composite lo-res, colour reg = A */ + { 0x57, 0xac, 0x33 }, { 0x54, 0x7f, 0x00 }, { 0x7f, 0x2e, 0x00 }, { 0x6a, 0x77, 0x00 }, + { 0x05, 0x80, 0x70 }, { 0x03, 0x54, 0x00 }, { 0x22, 0x0c, 0x00 }, { 0x13, 0x52, 0x00 }, + { 0x31, 0x64, 0xbe }, { 0x30, 0x35, 0x2a }, { 0x52, 0x00, 0x12 }, { 0x41, 0x33, 0x46 }, + { 0x3c, 0x91, 0x50 }, { 0x3c, 0x62, 0x00 }, { 0x60, 0x15, 0x00 }, { 0x4f, 0x61, 0x00 }, +/* Composite lo-res, colour reg = B */ + { 0x5b, 0xb9, 0xa7 }, { 0x5b, 0x6d, 0x00 }, { 0x7f, 0x29, 0x00 }, { 0x6c, 0x6e, 0x00 }, + { 0x05, 0x95, 0xcb }, { 0x04, 0x54, 0x00 }, { 0x23, 0x0a, 0x00 }, { 0x12, 0x51, 0x02 }, + { 0x28, 0x77, 0xfb }, { 0x32, 0x37, 0x2f }, { 0x52, 0x00, 0x12 }, { 0x3e, 0x34, 0x40 }, + { 0x3a, 0xa3, 0xaf }, { 0x3c, 0x63, 0x00 }, { 0x60, 0x15, 0x00 }, { 0x50, 0x61, 0x00 }, +/* Composite lo-res, colour reg = C */ + { 0xaa, 0x45, 0x6a }, { 0x8c, 0x59, 0x00 }, { 0xa8, 0x1a, 0x00 }, { 0x96, 0x60, 0x05 }, + { 0x20, 0x35, 0x41 }, { 0x03, 0x55, 0x00 }, { 0x22, 0x0b, 0x00 }, { 0x10, 0x52, 0x02 }, + { 0x4f, 0x1e, 0xa2 }, { 0x2e, 0x34, 0x25 }, { 0x50, 0x00, 0x10 }, { 0x42, 0x36, 0x45 }, + { 0x56, 0x48, 0x2a }, { 0x41, 0x5e, 0x00 }, { 0x5d, 0x19, 0x00 }, { 0x49, 0x64, 0x00 }, +/* Composite lo-res, colour reg = D */ + { 0xa9, 0x54, 0xd6 }, { 0x85, 0x52, 0x09 }, { 0xa5, 0x17, 0x00 }, { 0x96, 0x52, 0x23 }, + { 0x1e, 0x48, 0x9f }, { 0x06, 0x55, 0x00 }, { 0x1f, 0x0c, 0x00 }, { 0x0f, 0x52, 0x01 }, + { 0x46, 0x35, 0xe1 }, { 0x2b, 0x32, 0x26 }, { 0x51, 0x00, 0x0e }, { 0x3e, 0x39, 0x3e }, + { 0x5d, 0x58, 0x88 }, { 0x41, 0x60, 0x00 }, { 0x57, 0x1c, 0x00 }, { 0x4a, 0x62, 0x00 }, +/* Composite lo-res, colour reg = E */ + { 0xa4, 0xbb, 0x30 }, { 0x9d, 0x84, 0x00 }, { 0xb6, 0x3f, 0x00 }, { 0xa1, 0x8c, 0x00 }, + { 0x14, 0x7b, 0x8a }, { 0x06, 0x55, 0x00 }, { 0x21, 0x0b, 0x00 }, { 0x13, 0x51, 0x02 }, + { 0x3f, 0x67, 0xd5 }, { 0x2d, 0x36, 0x29 }, { 0x52, 0x00, 0x11 }, { 0x41, 0x33, 0x46 }, + { 0x4c, 0x8e, 0x6e }, { 0x3e, 0x61, 0x00 }, { 0x5f, 0x16, 0x00 }, { 0x4c, 0x61, 0x00 }, +/* Composite lo-res, colour reg = F */ + { 0xe3, 0xe3, 0xe3 }, { 0xdb, 0x82, 0x00 }, { 0xf5, 0x43, 0x00 }, { 0xee, 0x83, 0x00 }, + { 0x08, 0xa6, 0xf5 }, { 0x04, 0x53, 0x00 }, { 0x1c, 0x0d, 0x00 }, { 0x13, 0x52, 0x00 }, + { 0x25, 0x91, 0xfc }, { 0x2c, 0x35, 0x30 }, { 0x51, 0x00, 0x0e }, { 0x3b, 0x36, 0x38 }, + { 0x43, 0xb5, 0xf7 }, { 0x3b, 0x62, 0x00 }, { 0x56, 0x1c, 0x00 }, { 0x4d, 0x61, 0x00 }, +/* Composite lo-res, colour reg = 10 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x58, 0xb9 }, { 0x00, 0x11, 0x8a }, { 0x00, 0x4a, 0xe1 }, + { 0x73, 0x22, 0x00 }, { 0x5a, 0xad, 0x2e }, { 0x78, 0x61, 0x0d }, { 0x6a, 0xa9, 0x4c }, + { 0xac, 0x0a, 0x00 }, { 0x87, 0x8d, 0x80 }, { 0xab, 0x46, 0x6c }, { 0x95, 0x8b, 0x97 }, + { 0xac, 0x30, 0x00 }, { 0x91, 0xbc, 0x16 }, { 0xb8, 0x6d, 0x07 }, { 0xa7, 0xb9, 0x2d }, +/* Composite lo-res, colour reg = 11 */ + { 0x60, 0x00, 0x7c }, { 0x01, 0x54, 0xdb }, { 0x09, 0x11, 0xb9 }, { 0x07, 0x47, 0xf8 }, + { 0x76, 0x46, 0x02 }, { 0x5a, 0xae, 0x2e }, { 0x78, 0x62, 0x0c }, { 0x68, 0xa9, 0x4b }, + { 0x99, 0x2a, 0x09 }, { 0x87, 0x8d, 0x80 }, { 0xab, 0x46, 0x6b }, { 0x93, 0x89, 0x95 }, + { 0xa4, 0x54, 0x00 }, { 0x93, 0xbb, 0x16 }, { 0xb9, 0x6b, 0x04 }, { 0xa4, 0xb9, 0x30 }, +/* Composite lo-res, colour reg = 12 */ + { 0x07, 0x55, 0x00 }, { 0x03, 0x83, 0x70 }, { 0x1c, 0x3a, 0x42 }, { 0x0e, 0x81, 0x82 }, + { 0x58, 0x7e, 0x00 }, { 0x5b, 0xad, 0x2f }, { 0x77, 0x60, 0x0f }, { 0x67, 0xac, 0x49 }, + { 0x87, 0x5a, 0x00 }, { 0x89, 0x8c, 0x81 }, { 0xa9, 0x49, 0x5e }, { 0x9b, 0x8a, 0x96 }, + { 0x9f, 0x83, 0x00 }, { 0x94, 0xb9, 0x19 }, { 0xb0, 0x72, 0x03 }, { 0xa5, 0xbb, 0x30 }, +/* Composite lo-res, colour reg = 13 */ + { 0x03, 0x63, 0x48 }, { 0x04, 0x76, 0x8c }, { 0x1d, 0x34, 0x5a }, { 0x0d, 0x7a, 0x9c }, + { 0x5a, 0x8e, 0x03 }, { 0x58, 0xac, 0x33 }, { 0x76, 0x60, 0x0b }, { 0x68, 0xaa, 0x4b }, + { 0x7e, 0x6e, 0x3b }, { 0x88, 0x8c, 0x80 }, { 0xaa, 0x48, 0x64 }, { 0x94, 0x91, 0x92 }, + { 0x94, 0x9b, 0x00 }, { 0x96, 0xb9, 0x16 }, { 0xb0, 0x73, 0x01 }, { 0xa7, 0xb8, 0x2e }, +/* Composite lo-res, colour reg = 14 */ + { 0x52, 0x00, 0x13 }, { 0x29, 0x61, 0xb6 }, { 0x52, 0x1e, 0xa1 }, { 0x41, 0x63, 0xdb }, + { 0x7b, 0x2f, 0x00 }, { 0x5d, 0xac, 0x2c }, { 0x77, 0x63, 0x0a }, { 0x67, 0xa9, 0x51 }, + { 0xaf, 0x18, 0x00 }, { 0x83, 0x8a, 0x7d }, { 0xa9, 0x46, 0x66 }, { 0x9a, 0x8c, 0xa0 }, + { 0xb1, 0x43, 0x00 }, { 0x9a, 0xb7, 0x19 }, { 0xb7, 0x6e, 0x05 }, { 0xa4, 0xb9, 0x2f }, +/* Composite lo-res, colour reg = 15 */ + { 0x52, 0x00, 0x7a }, { 0x2e, 0x55, 0xdc }, { 0x4e, 0x1b, 0xb1 }, { 0x3c, 0x55, 0xec }, + { 0x80, 0x3f, 0x00 }, { 0x5b, 0xad, 0x2e }, { 0x73, 0x61, 0x0a }, { 0x66, 0xaa, 0x50 }, + { 0xa7, 0x29, 0x29 }, { 0x86, 0x8a, 0x7d }, { 0xa8, 0x48, 0x60 }, { 0x98, 0x8e, 0x9b }, + { 0xc0, 0x4a, 0x00 }, { 0x9a, 0xb5, 0x18 }, { 0xb3, 0x72, 0x06 }, { 0xa2, 0xba, 0x31 }, +/* Composite lo-res, colour reg = 16 */ + { 0x4d, 0x61, 0x00 }, { 0x3b, 0x91, 0x53 }, { 0x59, 0x46, 0x2c }, { 0x48, 0x95, 0x63 }, + { 0x6c, 0x77, 0x00 }, { 0x5a, 0xac, 0x31 }, { 0x75, 0x63, 0x09 }, { 0x66, 0xa9, 0x4e }, + { 0x8e, 0x6a, 0x0f }, { 0x87, 0x8b, 0x7f }, { 0xa9, 0x47, 0x66 }, { 0x9b, 0x8c, 0x9f }, + { 0xab, 0x86, 0x00 }, { 0x9a, 0xb6, 0x18 }, { 0xae, 0x74, 0x01 }, { 0xa2, 0xba, 0x2f }, +/* Composite lo-res, colour reg = 17 */ + { 0x8b, 0x8b, 0x8b }, { 0x7f, 0x89, 0x79 }, { 0xa4, 0x4a, 0x5c }, { 0x96, 0x8a, 0x95 }, + { 0x5c, 0xa1, 0x36 }, { 0x5d, 0xad, 0x2b }, { 0x77, 0x62, 0x0a }, { 0x68, 0xa8, 0x4f }, + { 0x83, 0x88, 0x6f }, { 0x85, 0x8d, 0x81 }, { 0xa9, 0x46, 0x69 }, { 0x99, 0x8b, 0x9f }, + { 0x97, 0xb1, 0x22 }, { 0x99, 0xb7, 0x18 }, { 0xb8, 0x6c, 0x04 }, { 0xa2, 0xba, 0x2e }, +/* Composite lo-res, colour reg = 18 */ + { 0x25, 0x25, 0x25 }, { 0x0b, 0x78, 0x8b }, { 0x25, 0x34, 0x5a }, { 0x14, 0x7d, 0x9d }, + { 0x76, 0x4f, 0x00 }, { 0x5a, 0xac, 0x2e }, { 0x74, 0x64, 0x07 }, { 0x66, 0xaa, 0x49 }, + { 0xa7, 0x37, 0x25 }, { 0x87, 0x8b, 0x80 }, { 0xa8, 0x48, 0x64 }, { 0x9a, 0x8f, 0x9a }, + { 0xb6, 0x5a, 0x00 }, { 0x96, 0xba, 0x17 }, { 0xae, 0x73, 0x01 }, { 0xa2, 0xba, 0x30 }, +/* Composite lo-res, colour reg = 19 */ + { 0x5d, 0x48, 0xd5 }, { 0x4a, 0x77, 0xb3 }, { 0x65, 0x35, 0x86 }, { 0x4d, 0x77, 0xc2 }, + { 0x6f, 0x72, 0x53 }, { 0x5a, 0xac, 0x30 }, { 0x75, 0x62, 0x09 }, { 0x68, 0xa9, 0x48 }, + { 0x9c, 0x57, 0xa1 }, { 0x87, 0x8b, 0x80 }, { 0xa7, 0x49, 0x62 }, { 0x92, 0x90, 0x92 }, + { 0xab, 0x7d, 0x3a }, { 0x97, 0xb8, 0x17 }, { 0xb0, 0x74, 0x03 }, { 0xa2, 0xba, 0x2e }, +/* Composite lo-res, colour reg = 1A */ + { 0x59, 0xad, 0x2e }, { 0x59, 0xad, 0x2e }, { 0x75, 0x64, 0x08 }, { 0x69, 0xa7, 0x4d }, + { 0x59, 0xad, 0x2e }, { 0x59, 0xad, 0x2e }, { 0x75, 0x64, 0x08 }, { 0x69, 0xa7, 0x4d }, + { 0x87, 0x8d, 0x82 }, { 0x85, 0x8b, 0x7d }, { 0xa9, 0x47, 0x67 }, { 0x99, 0x8c, 0x9d }, + { 0x94, 0xba, 0x17 }, { 0x94, 0xba, 0x17 }, { 0xb6, 0x6e, 0x06 }, { 0xa2, 0xbb, 0x30 }, +/* Composite lo-res, colour reg = 1B */ + { 0x5b, 0xb9, 0xa6 }, { 0x5c, 0xa2, 0x4a }, { 0x7a, 0x5c, 0x24 }, { 0x6a, 0x9a, 0x6c }, + { 0x56, 0xbf, 0x8e }, { 0x59, 0xae, 0x31 }, { 0x78, 0x60, 0x0d }, { 0x68, 0xa9, 0x4f }, + { 0x7f, 0xa3, 0xcd }, { 0x85, 0x8c, 0x80 }, { 0xaa, 0x47, 0x6a }, { 0x98, 0x8b, 0x9c }, + { 0x93, 0xcd, 0x72 }, { 0x92, 0xbd, 0x14 }, { 0xb8, 0x6c, 0x06 }, { 0xa4, 0xb9, 0x2f }, +/* Composite lo-res, colour reg = 1C */ + { 0xa9, 0x44, 0x63 }, { 0x85, 0x8a, 0x7f }, { 0xa9, 0x44, 0x63 }, { 0x99, 0x8e, 0x9d }, + { 0x74, 0x5f, 0x0d }, { 0x5c, 0xad, 0x2c }, { 0x77, 0x63, 0x0a }, { 0x68, 0xa8, 0x4e }, + { 0xa9, 0x44, 0x63 }, { 0x84, 0x8b, 0x7e }, { 0xa9, 0x44, 0x63 }, { 0x99, 0x8c, 0x9e }, + { 0xad, 0x72, 0x01 }, { 0x9b, 0xb6, 0x1a }, { 0xb3, 0x6e, 0x05 }, { 0xa4, 0xb9, 0x2f }, +/* Composite lo-res, colour reg = 1D */ + { 0xaa, 0x55, 0xd4 }, { 0x83, 0x81, 0x9b }, { 0xa6, 0x43, 0x7b }, { 0x95, 0x80, 0xbd }, + { 0x76, 0x72, 0x66 }, { 0x5a, 0xad, 0x2c }, { 0x7b, 0x61, 0x0c }, { 0x68, 0xa9, 0x50 }, + { 0xa5, 0x59, 0xaa }, { 0x87, 0x8e, 0x7f }, { 0xa9, 0x45, 0x6a }, { 0x97, 0x8b, 0x98 }, + { 0xb2, 0x82, 0x48 }, { 0x93, 0xbb, 0x16 }, { 0xb9, 0x6d, 0x05 }, { 0xa4, 0xb9, 0x2f }, +/* Composite lo-res, colour reg = 1E */ + { 0xa5, 0xb8, 0x2d }, { 0xa5, 0xb8, 0x2d }, { 0xb4, 0x70, 0x05 }, { 0xa5, 0xb8, 0x2d }, + { 0x64, 0xaa, 0x4e }, { 0x5b, 0xad, 0x2c }, { 0x77, 0x63, 0x0b }, { 0x68, 0xa8, 0x4f }, + { 0x94, 0x91, 0x95 }, { 0x83, 0x8a, 0x7b }, { 0xa9, 0x47, 0x67 }, { 0x98, 0x8a, 0x9e }, + { 0xa5, 0xb8, 0x2d }, { 0x9a, 0xb6, 0x1a }, { 0xb2, 0x70, 0x05 }, { 0xa5, 0xb8, 0x2d }, +/* Composite lo-res, colour reg = 1F */ + { 0xe3, 0xe3, 0xe3 }, { 0xde, 0xb1, 0x45 }, { 0xf8, 0x71, 0x3e }, { 0xeb, 0xb3, 0x5e }, + { 0x58, 0xd3, 0xc4 }, { 0x5b, 0xad, 0x2d }, { 0x78, 0x63, 0x0b }, { 0x68, 0xa8, 0x4f }, + { 0x7f, 0xb7, 0xf4 }, { 0x86, 0x8b, 0x7d }, { 0xa8, 0x46, 0x69 }, { 0x9a, 0x8c, 0x9f }, + { 0x99, 0xe0, 0xbc }, { 0x99, 0xb6, 0x1a }, { 0xb8, 0x6d, 0x07 }, { 0xa5, 0xb8, 0x30 }, +/* Composite lo-res, colour reg = 20 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x3a, 0x85 }, { 0x00, 0x00, 0x6c }, { 0x00, 0x46, 0xce }, + { 0x26, 0x01, 0x00 }, { 0x03, 0x61, 0x4a }, { 0x24, 0x16, 0x2a }, { 0x09, 0x72, 0x8d }, + { 0x4d, 0x00, 0x00 }, { 0x2d, 0x45, 0x9c }, { 0x51, 0x00, 0x7c }, { 0x30, 0x58, 0xe1 }, + { 0x9e, 0x0f, 0x00 }, { 0x86, 0x7b, 0x45 }, { 0xab, 0x29, 0x2c }, { 0x8b, 0x89, 0x88 }, +/* Composite lo-res, colour reg = 21 */ + { 0x06, 0x00, 0x7C }, { 0x00, 0x3B, 0xA0 }, { 0x14, 0x00, 0x93 }, { 0x00, 0x49, 0xF7 }, + { 0x19, 0x12, 0x13 }, { 0x02, 0x63, 0x3f }, { 0x25, 0x16, 0x2b }, { 0x09, 0x71, 0x93 }, + { 0x46, 0x00, 0x65 }, { 0x28, 0x45, 0x93 }, { 0x50, 0x00, 0x80 }, { 0x32, 0x55, 0xe6 }, + { 0x9c, 0x2d, 0x0c }, { 0x86, 0x78, 0x44 }, { 0xaa, 0x29, 0x33 }, { 0x92, 0x84, 0x84 }, +/* Composite lo-res, colour reg = 22 */ + { 0x05, 0x56, 0x00 }, { 0x04, 0x69, 0x32 }, { 0x21, 0x1d, 0x13 }, { 0x07, 0x76, 0x7e }, + { 0x05, 0x48, 0x03 }, { 0x03, 0x64, 0x43 }, { 0x24, 0x16, 0x28 }, { 0x08, 0x70, 0x92 }, + { 0x45, 0x41, 0x74 }, { 0x27, 0x44, 0x92 }, { 0x4f, 0x00, 0x7f }, { 0x36, 0x58, 0xe8 }, + { 0x85, 0x57, 0x02 }, { 0x87, 0x77, 0x45 }, { 0xa6, 0x2c, 0x2c }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 23 */ + { 0x02, 0x61, 0x49 }, { 0x02, 0x61, 0x49 }, { 0x24, 0x15, 0x27 }, { 0x05, 0x73, 0x84 }, + { 0x02, 0x61, 0x49 }, { 0x02, 0x61, 0x49 }, { 0x24, 0x15, 0x27 }, { 0x05, 0x73, 0x84 }, + { 0x2a, 0x43, 0x96 }, { 0x2a, 0x43, 0x96 }, { 0x51, 0x00, 0x7d }, { 0x31, 0x5a, 0xdc }, + { 0x86, 0x79, 0x3d }, { 0x86, 0x79, 0x3d }, { 0xa8, 0x2a, 0x21 }, { 0x8a, 0x8a, 0x8a }, +/* Composite lo-res, colour reg = 24 */ + { 0x51, 0x00, 0x0e }, { 0x2b, 0x49, 0x76 }, { 0x4c, 0x04, 0x53 }, { 0x23, 0x5a, 0xf5 }, + { 0x22, 0x05, 0x00 }, { 0x04, 0x06, 0x4b }, { 0x22, 0x13, 0x22 }, { 0x03, 0x74, 0x82 }, + { 0x4e, 0x00, 0x25 }, { 0x2d, 0x46, 0x9d }, { 0x52, 0x00, 0x7c }, { 0x34, 0x59, 0xe3 }, + { 0xaa, 0x17, 0x00 }, { 0x85, 0x79, 0x3d }, { 0xa7, 0x2e, 0x24 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 25 */ + { 0x50, 0x00, 0x7e }, { 0x2d, 0x45, 0x9d }, { 0x50, 0x00, 0x7e }, { 0x30, 0x57, 0xde }, + { 0x23, 0x16, 0x29 }, { 0x05, 0x61, 0x49 }, { 0x23, 0x13, 0x26 }, { 0x04, 0x75, 0x87 }, + { 0x50, 0x00, 0x7e }, { 0x28, 0x44, 0x96 }, { 0x50, 0x00, 0x7e }, { 0x31, 0x59, 0xdf }, + { 0xac, 0x28, 0x33 }, { 0x85, 0x79, 0x3c }, { 0xa7, 0x2d, 0x23 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 26 */ + { 0x4f, 0x62, 0x00 }, { 0x3d, 0x71, 0x1f }, { 0x60, 0x2a, 0x07 }, { 0x43, 0x88, 0x69 }, + { 0x13, 0x42, 0x19 }, { 0x05, 0x63, 0x46 }, { 0x24, 0x16, 0x27 }, { 0x07, 0x72, 0x91 }, + { 0x3c, 0x2b, 0x5f }, { 0x2a, 0x45, 0x92 }, { 0x4f, 0x00, 0x82 }, { 0x36, 0x57, 0xe9 }, + { 0x92, 0x5a, 0x0b }, { 0x87, 0x78, 0x45 }, { 0xa7, 0x2c, 0x2a }, { 0x8b, 0x8b, 0x8c }, +/* Composite lo-res, colour reg = 27 */ + { 0x8b, 0x8b, 0x8b }, { 0x89, 0x78, 0x47 }, { 0xa8, 0x2a, 0x2d }, { 0x8b, 0x8b, 0x8b }, + { 0x08, 0x71, 0x93 }, { 0x02, 0x62, 0x4a }, { 0x26, 0x16, 0x2a }, { 0x06, 0x73, 0x87 }, + { 0x35, 0x58, 0xe6 }, { 0x2f, 0x45, 0x9e }, { 0x50, 0x00, 0x78 }, { 0x2f, 0x59, 0xe0 }, + { 0x8b, 0x8b, 0x8b }, { 0x87, 0x7a, 0x46 }, { 0xaa, 0x29, 0x30 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 28 */ + { 0x25, 0x25, 0x25 }, { 0x08, 0x5f, 0x4b }, { 0x2b, 0x15, 0x25 }, { 0x09, 0x71, 0x88 }, + { 0x1e, 0x23, 0x26 }, { 0x04, 0x62, 0x47 }, { 0x21, 0x19, 0x28 }, { 0x06, 0x74, 0x88 }, + { 0x48, 0x0b, 0x70 }, { 0x26, 0x42, 0x95 }, { 0x52, 0x00, 0x7c }, { 0x34, 0x58, 0xe6 }, + { 0xa1, 0x37, 0x1c }, { 0x85, 0x78, 0x3e }, { 0xa6, 0x2e, 0x23 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 29 */ + { 0x5e, 0x44, 0xd3 }, { 0x45, 0x61, 0x73 }, { 0x6c, 0x18, 0x53 }, { 0x4c, 0x72, 0xbf }, + { 0x14, 0x45, 0xa3 }, { 0x04, 0x61, 0x49 }, { 0x22, 0x15, 0x25 }, { 0x06, 0x72, 0x8d }, + { 0x41, 0x2d, 0xf6 }, { 0x27, 0x43, 0x96 }, { 0x51, 0x00, 0x7c }, { 0x34, 0x58, 0xe4 }, + { 0x9b, 0x5a, 0xa5 }, { 0x85, 0x78, 0x3d }, { 0xa6, 0x2e, 0x23 }, { 0x8c, 0x8c, 0x8c }, +/* Composite lo-res, colour reg = 2A */ + { 0x5c, 0xae, 0x2a }, { 0x58, 0x91, 0x00 }, { 0x7b, 0x41, 0x00 }, { 0x5e, 0xa0, 0x36 }, + { 0x06, 0x78, 0x86 }, { 0x03, 0x62, 0x49 }, { 0x25, 0x14, 0x28 }, { 0x03, 0x74, 0x82 }, + { 0x25, 0x5b, 0xcc }, { 0x2a, 0x43, 0x97 }, { 0x52, 0x00, 0x79 }, { 0x31, 0x5b, 0xe0 }, + { 0x7e, 0x88, 0x7b }, { 0x86, 0x7b, 0x3e }, { 0xa7, 0x2c, 0x22 }, { 0x89, 0x89, 0x89 }, +/* Composite lo-res, colour reg = 2B */ + { 0x58, 0xbb, 0x98 }, { 0x5a, 0x8c, 0x0a }, { 0x7f, 0x3b, 0x02 }, { 0x60, 0x9a, 0x4b }, + { 0x03, 0x96, 0xce }, { 0x04, 0x61, 0x4a }, { 0x23, 0x14, 0x24 }, { 0x04, 0x75, 0x86 }, + { 0x23, 0x76, 0xfe }, { 0x28, 0x43, 0x95 }, { 0x51, 0x00, 0x7b }, { 0x30, 0x59, 0xdb }, + { 0x80, 0xab, 0xd2 }, { 0x85, 0x7a, 0x3d }, { 0xa8, 0x2e, 0x26 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 2C */ + { 0xa9, 0x46, 0x66 }, { 0x7f, 0x6f, 0x37 }, { 0xa9, 0x27, 0x27 }, { 0x87, 0x82, 0x7f }, + { 0x1e, 0x31, 0x5c }, { 0x04, 0x63, 0x44 }, { 0x23, 0x16, 0x2a }, { 0x08, 0x71, 0x92 }, + { 0x4e, 0x1a, 0xb0 }, { 0x27, 0x46, 0x92 }, { 0x50, 0x00, 0x80 }, { 0x33, 0x56, 0xe7 }, + { 0xa3, 0x4a, 0x58 }, { 0x87, 0x78, 0x46 }, { 0xab, 0x29, 0x34 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 2D */ + { 0xa8, 0x53, 0xd8 }, { 0x82, 0x6c, 0x5f }, { 0xac, 0x25, 0x3f }, { 0x8d, 0x7f, 0xa8 }, + { 0x21, 0x46, 0xb9 }, { 0x04, 0x61, 0x4d }, { 0x24, 0x13, 0x23 }, { 0x04, 0x75, 0x87 }, + { 0x4c, 0x2e, 0xfe }, { 0x2a, 0x45, 0x99 }, { 0x52, 0x00, 0x78 }, { 0x32, 0x5a, 0xde }, + { 0xa8, 0x53, 0xd8 }, { 0x84, 0x7c, 0x3d }, { 0xa7, 0x2d, 0x22 }, { 0x8b, 0x8b, 0x8b }, +/* Composite lo-res, colour reg = 2E */ + { 0xa4, 0xba, 0x2e }, { 0x8e, 0x9f, 0x00 }, { 0xbf, 0x4e, 0x00 }, { 0xa5, 0xae, 0x2d }, + { 0x13, 0x71, 0xa6 }, { 0x03, 0x62, 0x4a }, { 0x24, 0x14, 0x28 }, { 0x05, 0x74, 0x83 }, + { 0x32, 0x5d, 0xe0 }, { 0x2e, 0x46, 0x9c }, { 0x51, 0x00, 0x7c }, { 0x2f, 0x59, 0xe0 }, + { 0x8a, 0x8d, 0x94 }, { 0x86, 0x7b, 0x40 }, { 0xa8, 0x2c, 0x22 }, { 0x8a, 0x8a, 0x8a }, +/* Composite lo-res, colour reg = 2F */ + { 0xe4, 0xe4, 0xe4 }, { 0xdd, 0xa6, 0x0a }, { 0xf9, 0x53, 0x04 }, { 0xea, 0xae, 0x54 }, + { 0x08, 0xa2, 0xfc }, { 0x03, 0x62, 0x48 }, { 0x24, 0x14, 0x28 }, { 0x05, 0x74, 0x84 }, + { 0x27, 0x90, 0xff }, { 0x2a, 0x43, 0x95 }, { 0x52, 0x00, 0x79 }, { 0x34, 0x5a, 0xe3 }, + { 0x85, 0xbb, 0xff }, { 0x85, 0x7a, 0x3d }, { 0xa7, 0x2c, 0x23 }, { 0x8a, 0x8a, 0x8a }, +/* Composite lo-res, colour reg = 30 */ + { 0x00, 0x00, 0x00 }, { 0x00, 0x63, 0xfe }, { 0x00, 0x1d, 0xe9 }, { 0x00, 0x81, 0xff }, + { 0x7e, 0x16, 0x00 }, { 0x5b, 0xb9, 0xa5 }, { 0x79, 0x6a, 0x79 }, { 0x59, 0xce, 0xdc }, + { 0xa8, 0x05, 0x00 }, { 0x84, 0x9e, 0xf3 }, { 0xaa, 0x54, 0xd3 }, { 0x8c, 0xb1, 0xff }, + { 0xfb, 0x28, 0x00 }, { 0xde, 0xd2, 0x94 }, { 0xfc, 0x85, 0x7b }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 31 */ + { 0x07, 0x00, 0x7c }, { 0x00, 0x70, 0xfe }, { 0x0d, 0x20, 0xff }, { 0x04, 0x7f, 0xff }, + { 0x6f, 0x3b, 0x00 }, { 0x59, 0xbb, 0x9b }, { 0x79, 0x6c, 0x81 }, { 0x5d, 0xcb, 0xe4 }, + { 0x99, 0x26, 0x29 }, { 0x83, 0x9d, 0xf2 }, { 0xaa, 0x54, 0xd4 }, { 0x88, 0xb0, 0xff }, + { 0xf4, 0x57, 0x00 }, { 0xdf, 0xd3, 0x9a }, { 0xfe, 0x81, 0x7f }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 32 */ + { 0x06, 0x55, 0x00 }, { 0x03, 0x99, 0xbe }, { 0x22, 0x46, 0xa4 }, { 0x09, 0xa4, 0xfa }, + { 0x62, 0x6d, 0x00 }, { 0x59, 0xbb, 0x9b }, { 0x7a, 0x6d, 0x7e }, { 0x5c, 0xc8, 0xe7 }, + { 0x8a, 0x4f, 0x11 }, { 0x80, 0x9b, 0xea }, { 0xa7, 0x55, 0xda }, { 0x8c, 0xad, 0xff }, + { 0xdf, 0x7f, 0x00 }, { 0xe2, 0xd1, 0x9c }, { 0xfd, 0x81, 0x87 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 33 */ + { 0x03, 0x63, 0x47 }, { 0x06, 0x91, 0xda }, { 0x23, 0x41, 0xbc }, { 0x06, 0xa5, 0xfa }, + { 0x5d, 0x8a, 0x07 }, { 0x59, 0xbb, 0x9b }, { 0x7c, 0x6e, 0x80 }, { 0x5d, 0xc9, 0xe8 }, + { 0x86, 0x6b, 0x60 }, { 0x81, 0x9d, 0xea }, { 0xa8, 0x55, 0xd8 }, { 0x8e, 0xae, 0xff }, + { 0xdf, 0xa4, 0x0c }, { 0xe1, 0xd0, 0x9e }, { 0xfd, 0x81, 0x85 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 34 */ + { 0x52, 0x00, 0x14 }, { 0x20, 0x7b, 0xf7 }, { 0x4e, 0x2f, 0xed }, { 0x22, 0x91, 0xff }, + { 0x7f, 0x28, 0x00 }, { 0x5a, 0xbb, 0x9a }, { 0x79, 0x6d, 0x7f }, { 0x5e, 0xc8, 0xeb }, + { 0xac, 0x13, 0x02 }, { 0x7e, 0x9c, 0xea }, { 0xa8, 0x54, 0xd6 }, { 0x8e, 0xae, 0xff }, + { 0xf5, 0x43, 0x00 }, { 0xdf, 0xcf, 0x9d }, { 0xfd, 0x81, 0x88 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 35 */ + { 0x50, 0x00, 0x7b }, { 0x22, 0x76, 0xfe }, { 0x4c, 0x2f, 0xff }, { 0x36, 0x85, 0xff }, + { 0x7b, 0x3d, 0x00 }, { 0x5b, 0xbc, 0xa1 }, { 0x7b, 0x6c, 0x7f }, { 0x5d, 0xca, 0xe8 }, + { 0xa9, 0x26, 0x3c }, { 0x81, 0x9c, 0xec }, { 0xa7, 0x54, 0xdc }, { 0x8b, 0xad, 0xff }, + { 0xf8, 0x57, 0x03 }, { 0xe1, 0xd4, 0x9e }, { 0xfd, 0x80, 0x82 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 36 */ + { 0x4c, 0x61, 0x00 }, { 0x39, 0xa2, 0xaf }, { 0x5b, 0x5a, 0x8c }, { 0x42, 0xb6, 0xf4 }, + { 0x66, 0x6b, 0x00 }, { 0x5b, 0xba, 0xa4 }, { 0x7a, 0x6c, 0x7e }, { 0x5e, 0xca, 0xe8 }, + { 0x91, 0x51, 0x1f }, { 0x85, 0x9d, 0xf4 }, { 0xaa, 0x55, 0xd7 }, { 0x88, 0xaf, 0xff }, + { 0xea, 0x87, 0x00 }, { 0xde, 0xd4, 0x98 }, { 0xfd, 0x7f, 0x81 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 37 */ + { 0x8b, 0x8b, 0x8b }, { 0x86, 0xa7, 0xde }, { 0xa6, 0x5a, 0xbf }, { 0x85, 0xbb, 0xff }, + { 0x5f, 0x9b, 0x51 }, { 0x5a, 0xb9, 0xa7 }, { 0x78, 0x6a, 0x7b }, { 0x5b, 0xce, 0xdb }, + { 0x8b, 0x7c, 0xae }, { 0x82, 0x9c, 0xf2 }, { 0xaa, 0x54, 0xd3 }, { 0x87, 0xb2, 0xff }, + { 0xe7, 0xb0, 0x54 }, { 0xdc, 0xd2, 0x95 }, { 0xfc, 0x84, 0x77 }, { 0xe3, 0xe3, 0xe3 }, +/* Composite lo-res, colour reg = 38 */ + { 0x24, 0x24, 0x24 }, { 0x06, 0x91, 0xd8 }, { 0x2a, 0x44, 0xb9 }, { 0x0f, 0x9e, 0xfe }, + { 0x7a, 0x49, 0x00 }, { 0x58, 0xbc, 0x98 }, { 0x7a, 0x6d, 0x7f }, { 0x5e, 0xc8, 0xeb }, + { 0xa3, 0x36, 0x3a }, { 0x7f, 0x9c, 0xec }, { 0xa8, 0x54, 0xd7 }, { 0x8a, 0xad, 0xff }, + { 0xf7, 0x64, 0x00 }, { 0xe1, 0xd1, 0x9c }, { 0xfd, 0x7f, 0x8b }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 39 */ + { 0x62, 0x46, 0xd3 }, { 0x3d, 0x93, 0xf2 }, { 0x6b, 0x46, 0xeb }, { 0x4f, 0xa0, 0xff }, + { 0x6f, 0x69, 0x6b }, { 0x58, 0xbb, 0x9b }, { 0x7b, 0x6e, 0x80 }, { 0x5e, 0xc8, 0xec }, + { 0x9d, 0x53, 0xbd }, { 0x81, 0x9d, 0xf0 }, { 0xa8, 0x54, 0xd8 }, { 0x86, 0xb1, 0xff }, + { 0xf4, 0x85, 0x5e }, { 0xdf, 0xd1, 0x9f }, { 0xfe, 0x7f, 0x88 }, { 0xe3, 0xe3, 0xe3 }, +/* Composite lo-res, colour reg = 3A */ + { 0x5a, 0xad, 0x2d }, { 0x58, 0xc1, 0x81 }, { 0x77, 0x74, 0x68 }, { 0x58, 0xcf, 0xd1 }, + { 0x5d, 0xa0, 0x4d }, { 0x59, 0xbb, 0x9b }, { 0x7c, 0x6d, 0x7f }, { 0x5e, 0xc9, 0xeb }, + { 0x83, 0x7d, 0x9e }, { 0x7f, 0x9c, 0xec }, { 0xa9, 0x54, 0xd6 }, { 0x8c, 0xae, 0xff }, + { 0xde, 0xae, 0x4b }, { 0xdc, 0xd0, 0x98 }, { 0xfc, 0x81, 0x8a }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 3B */ + { 0x59, 0xbc, 0x9c }, { 0x59, 0xbc, 0x9c }, { 0x7a, 0x6a, 0x79 }, { 0x59, 0xce, 0xd9 }, + { 0x59, 0xbc, 0x9c }, { 0x59, 0xbc, 0x9c }, { 0x7b, 0x6b, 0x80 }, { 0x59, 0xcc, 0xd9 }, + { 0x81, 0x9b, 0xec }, { 0x81, 0x9b, 0xec }, { 0xa9, 0x54, 0xd4 }, { 0x8e, 0xb2, 0xff }, + { 0xdf, 0xcf, 0x9b }, { 0xdf, 0xcf, 0x9b }, { 0xfd, 0x85, 0x79 }, { 0xe3, 0xe3, 0xe3 }, +/* Composite lo-res, colour reg = 3C */ + { 0xaa, 0x46, 0x6a }, { 0x7a, 0xa3, 0xc7 }, { 0xa7, 0x58, 0xba }, { 0x84, 0xb5, 0xf8 }, + { 0x78, 0x5b, 0x23 }, { 0x59, 0xbc, 0x9c }, { 0x7a, 0x6e, 0x81 }, { 0x5f, 0xc9, 0xeb }, + { 0xa3, 0x44, 0x71 }, { 0x80, 0x9d, 0xec }, { 0xa8, 0x54, 0xd7 }, { 0x8a, 0xae, 0xff }, + { 0xf8, 0x74, 0x1a }, { 0xdf, 0xd1, 0x9e }, { 0xfe, 0x81, 0x8b }, { 0xe3, 0xe3, 0xe3 }, +/* Composite lo-res, colour reg = 3D */ + { 0xaa, 0x53, 0xd1 }, { 0x80, 0x9c, 0xec }, { 0xaa, 0x53, 0xd1 }, { 0x88, 0xad, 0xff }, + { 0x7a, 0x6b, 0x7e }, { 0x58, 0xbb, 0x9d }, { 0x7a, 0x6d, 0x81 }, { 0x5f, 0xc9, 0xe5 }, + { 0xaa, 0x53, 0xd1 }, { 0x84, 0x9d, 0xf2 }, { 0xaa, 0x53, 0xd1 }, { 0x88, 0xad, 0xff }, + { 0xfd, 0x85, 0x78 }, { 0xe0, 0xd2, 0x9e }, { 0xfe, 0x80, 0x87 }, { 0xe3, 0xe3, 0xe3 }, +/* Composite lo-res, colour reg = 3E */ + { 0xa1, 0xba, 0x2f }, { 0x90, 0xce, 0x70 }, { 0xb4, 0x80, 0x4b }, { 0x9d, 0xe0, 0xba }, + { 0x6a, 0x9f, 0x68 }, { 0x5a, 0xba, 0x9f }, { 0x7a, 0x6b, 0x7a }, { 0x5a, 0xce, 0xdb }, + { 0x91, 0x83, 0xae }, { 0x80, 0x9b, 0xef }, { 0xaa, 0x54, 0xd2 }, { 0x8c, 0xb1, 0xff }, + { 0xeb, 0xb3, 0x59 }, { 0xdd, 0xd3, 0x94 }, { 0xfc, 0x85, 0x79 }, { 0xe4, 0xe4, 0xe4 }, +/* Composite lo-res, colour reg = 3F */ + { 0xe4, 0xe4, 0xe4 }, { 0xdd, 0xd2, 0x93 }, { 0xfc, 0x85, 0x7a }, { 0xe4, 0xe4, 0xe4 }, + { 0x59, 0xcc, 0xda }, { 0x59, 0xbb, 0x9c }, { 0x7b, 0x6d, 0x7f }, { 0x5c, 0xca, 0xe5 }, + { 0x87, 0xb3, 0xff }, { 0x7f, 0x9a, 0xea }, { 0xa8, 0x54, 0xd4 }, { 0x8c, 0xb0, 0xff }, + { 0xe4, 0xe4, 0xe4 }, { 0xdf, 0xd1, 0x98 }, { 0xfd, 0x84, 0x7d }, { 0xe4, 0xe4, 0xe4 }, +}; diff -Nru mame-0.144/src/emu/video/cgapal.h mame-0.145/src/emu/video/cgapal.h --- mame-0.144/src/emu/video/cgapal.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/cgapal.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1 @@ +extern const unsigned char cga_palette[16 * CGA_PALETTE_SETS][3]; diff -Nru mame-0.144/src/emu/video/crt9007.c mame-0.145/src/emu/video/crt9007.c --- mame-0.144/src/emu/video/crt9007.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/crt9007.c 2012-02-06 21:30:27.000000000 +0000 @@ -420,11 +420,7 @@ // visible area rectangle visarea; - visarea.min_x = m_hsync_end; - visarea.max_x = horiz_pix_total - 1; - - visarea.min_y = m_vsync_end; - visarea.max_y = vert_pix_total - 1; + visarea.set(m_hsync_end, horiz_pix_total - 1, m_vsync_end, vert_pix_total - 1); if (LOG) { diff -Nru mame-0.144/src/emu/video/crt9021.c mame-0.145/src/emu/video/crt9021.c --- mame-0.144/src/emu/video/crt9021.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/crt9021.c 2012-02-06 21:30:27.000000000 +0000 @@ -219,9 +219,10 @@ //------------------------------------------------- -// update_screen - update screen +// screen_update - update screen //------------------------------------------------- -void crt9021_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 crt9021_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + return 0; } diff -Nru mame-0.144/src/emu/video/crt9021.h mame-0.145/src/emu/video/crt9021.h --- mame-0.144/src/emu/video/crt9021.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/crt9021.h 2012-02-06 21:30:27.000000000 +0000 @@ -88,7 +88,7 @@ DECLARE_WRITE_LINE_MEMBER( retbl_w ); DECLARE_WRITE_LINE_MEMBER( vsync_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides diff -Nru mame-0.144/src/emu/video/generic.c mame-0.145/src/emu/video/generic.c --- mame-0.144/src/emu/video/generic.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/generic.c 2012-02-06 21:30:27.000000000 +0000 @@ -118,7 +118,7 @@ palette RAM referenced by offset -------------------------------------------------*/ -INLINE UINT16 paletteram16_le(running_machine &machine, offs_t offset) +inline UINT16 paletteram16_le(running_machine &machine, offs_t offset) { return machine.generic.paletteram.u8[offset & ~1] | (machine.generic.paletteram.u8[offset | 1] << 8); } @@ -130,7 +130,7 @@ palette RAM referenced by offset -------------------------------------------------*/ -INLINE UINT16 paletteram16_be(running_machine &machine, offs_t offset) +inline UINT16 paletteram16_be(running_machine &machine, offs_t offset) { return machine.generic.paletteram.u8[offset | 1] | (machine.generic.paletteram.u8[offset & ~1] << 8); } @@ -142,7 +142,7 @@ RAM referenced by offset -------------------------------------------------*/ -INLINE UINT16 paletteram16_split(running_machine &machine, offs_t offset) +inline UINT16 paletteram16_split(running_machine &machine, offs_t offset) { return machine.generic.paletteram.u8[offset] | (machine.generic.paletteram2.u8[offset] << 8); } @@ -154,7 +154,7 @@ palette RAM referenced by offset -------------------------------------------------*/ -INLINE UINT32 paletteram32_be(running_machine &machine, offs_t offset) +inline UINT32 paletteram32_be(running_machine &machine, offs_t offset) { return machine.generic.paletteram.u16[offset | 1] | (machine.generic.paletteram.u16[offset & ~1] << 16); } @@ -166,7 +166,7 @@ shift values -------------------------------------------------*/ -INLINE void set_color_444(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data) +inline void set_color_444(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data) { palette_set_color_rgb(machine, color, pal4bit(data >> rshift), pal4bit(data >> gshift), pal4bit(data >> bshift)); } @@ -178,7 +178,7 @@ shift values -------------------------------------------------*/ -INLINE void set_color_4444(running_machine &machine, pen_t color, int ishift, int rshift, int gshift, int bshift, UINT16 data) +inline void set_color_4444(running_machine &machine, pen_t color, int ishift, int rshift, int gshift, int bshift, UINT16 data) { static const UINT8 ztable[16] = { 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11 }; @@ -199,7 +199,7 @@ shift values -------------------------------------------------*/ -INLINE void set_color_555(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data) +inline void set_color_555(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data) { palette_set_color_rgb(machine, color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift)); } @@ -211,7 +211,7 @@ shift values -------------------------------------------------*/ -INLINE void set_color_888(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT32 data) +inline void set_color_888(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT32 data) { palette_set_color_rgb(machine, color, (data >> rshift) & 0xff, (data >> gshift) & 0xff, (data >> bshift) & 0xff); } @@ -262,38 +262,6 @@ /*************************************************************************** - GENERIC VIDEO START/UPDATE -***************************************************************************/ - -/*------------------------------------------------- - VIDEO_START( generic_bitmapped ) - general video - system with a bitmap --------------------------------------------------*/ - -VIDEO_START( generic_bitmapped ) -{ - /* allocate the temporary bitmap */ - machine.generic.tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); - - /* ensure the contents of the bitmap are saved */ - machine.save().save_item(NAME(*machine.generic.tmpbitmap)); -} - - -/*------------------------------------------------- - SCREEN_UPDATE( generic_bitmapped ) - blast the - generic bitmap to the screen --------------------------------------------------*/ - -SCREEN_UPDATE( generic_bitmapped ) -{ - copybitmap(bitmap, screen->machine().generic.tmpbitmap, 0, 0, 0, 0, cliprect); - return 0; -} - - - -/*************************************************************************** GENERIC SPRITE BUFFERING ***************************************************************************/ @@ -416,7 +384,7 @@ attoseconds_t period = machine.primary_screen->frame_period().attoseconds; rectangle visarea = machine.primary_screen->visible_area(); - tilemap_set_flip_all(machine,(TILEMAP_FLIPX & state->flip_screen_x) | (TILEMAP_FLIPY & state->flip_screen_y)); + machine.tilemap().set_flip_all((TILEMAP_FLIPX & state->flip_screen_x) | (TILEMAP_FLIPY & state->flip_screen_y)); if (state->flip_screen_x) { @@ -692,6 +660,12 @@ palette_set_color_rgb(space->machine(), offset, pal3bit(data >> 5), pal3bit(data >> 2), pal2bit(data >> 0)); } +WRITE8_MEMBER( driver_device::paletteram_RRRGGGBB_w ) +{ + m_generic_paletteram[offset] = data; + palette_set_color_rgb(machine(), offset, pal3bit(data >> 5), pal3bit(data >> 2), pal2bit(data >> 0)); +} + /*------------------------------------------------- BB-GGG-RR writes @@ -703,6 +677,12 @@ palette_set_color_rgb(space->machine(), offset, pal3bit(data >> 0), pal3bit(data >> 3), pal2bit(data >> 6)); } +WRITE8_MEMBER( driver_device::paletteram_BBGGGRRR_w ) +{ + m_generic_paletteram[offset] = data; + palette_set_color_rgb(machine(), offset, pal3bit(data >> 0), pal3bit(data >> 3), pal2bit(data >> 6)); +} + /*------------------------------------------------- BB-GG-RR-II writes @@ -718,6 +698,16 @@ pal4bit(((data >> 4) & 0x0c) | i)); } +WRITE8_MEMBER( driver_device::paletteram_BBGGRRII_w ) +{ + int i = (data >> 0) & 3; + + m_generic_paletteram[offset] = data; + palette_set_color_rgb(machine(), offset, pal4bit(((data >> 0) & 0x0c) | i), + pal4bit(((data >> 2) & 0x0c) | i), + pal4bit(((data >> 4) & 0x0c) | i)); +} + /*------------------------------------------------- II-BB-GG-RR writes -------------------------------------------------*/ @@ -732,6 +722,16 @@ pal4bit(((data >> 2) & 0x0c) | i)); } +WRITE8_MEMBER( driver_device::paletteram_IIBBGGRR_w ) +{ + int i = (data >> 6) & 3; + + m_generic_paletteram[offset] = data; + palette_set_color_rgb(machine(), offset, pal4bit(((data << 2) & 0x0c) | i), + pal4bit(((data >> 0) & 0x0c) | i), + pal4bit(((data >> 2) & 0x0c) | i)); +} + /*************************************************************************** @@ -772,6 +772,36 @@ set_color_444(space->machine(), offset, 0, 4, 8, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBGGGGRRRR_le_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 0, 4, 8, paletteram16_le(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBGGGGRRRR_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 0, 4, 8, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBGGGGRRRR_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset, 0, 4, 8, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBGGGGRRRR_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_444(machine(), offset, 0, 4, 8, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_xxxxBBBBGGGGRRRR_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_444(machine(), offset, 0, 4, 8, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- xxxx-BBBB-RRRR-GGGG writes @@ -807,6 +837,36 @@ set_color_444(space->machine(), offset, 4, 0, 8, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBRRRRGGGG_le_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 4, 0, 8, paletteram16_le(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBRRRRGGGG_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 4, 0, 8, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBRRRRGGGG_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset, 4, 0, 8, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxBBBBRRRRGGGG_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_444(machine(), offset, 4, 0, 8, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_xxxxBBBBRRRRGGGG_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_444(machine(), offset, 4, 0, 8, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- xxxx-RRRR-BBBB-GGGG writes @@ -824,6 +884,18 @@ set_color_444(space->machine(), offset, 8, 0, 4, paletteram16_split(space->machine(), offset)); } +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRBBBBGGGG_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset, 8, 0, 4, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRBBBBGGGG_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_444(machine(), offset, 8, 0, 4, paletteram16_split(offset)); +} + /*------------------------------------------------- xxxx-RRRR-GGGG-BBBB writes @@ -859,6 +931,36 @@ set_color_444(space->machine(), offset, 8, 4, 0, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRGGGGBBBB_le_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 8, 4, 0, paletteram16_le(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRGGGGBBBB_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 8, 4, 0, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRGGGGBBBB_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset, 8, 4, 0, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xxxxRRRRGGGGBBBB_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_444(machine(), offset, 8, 4, 0, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_xxxxRRRRGGGGBBBB_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_444(machine(), offset, 8, 4, 0, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- RRRR-GGGG-BBBB-xxxx writes @@ -888,6 +990,30 @@ set_color_444(space->machine(), offset, 12, 8, 4, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_RRRRGGGGBBBBxxxx_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset / 2, 12, 8, 4, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_RRRRGGGGBBBBxxxx_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_444(machine(), offset, 12, 8, 4, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_RRRRGGGGBBBBxxxx_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_444(machine(), offset, 12, 8, 4, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_RRRRGGGGBBBBxxxx_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_444(machine(), offset, 12, 8, 4, m_generic_paletteram16[offset]); +} + /*************************************************************************** @@ -928,6 +1054,36 @@ set_color_555(space->machine(), offset, 0, 5, 10, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_xBBBBBGGGGGRRRRR_le_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset / 2, 0, 5, 10, paletteram16_le(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xBBBBBGGGGGRRRRR_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset / 2, 0, 5, 10, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xBBBBBGGGGGRRRRR_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset, 0, 5, 10, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xBBBBBGGGGGRRRRR_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_555(machine(), offset, 0, 5, 10, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_xBBBBBGGGGGRRRRR_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 0, 5, 10, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- x-BBBBB-RRRRR-GGGGG writes @@ -945,6 +1101,18 @@ set_color_555(space->machine(), offset, 5, 0, 10, paletteram16_split(space->machine(), offset)); } +WRITE8_MEMBER( driver_device::paletteram_xBBBBBRRRRRGGGGG_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset, 5, 0, 10, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xBBBBBRRRRRGGGGG_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_555(machine(), offset, 5, 0, 10, paletteram16_split(offset)); +} + /*------------------------------------------------- x-RRRRR-GGGGG-BBBBB writes @@ -980,6 +1148,36 @@ set_color_555(space->machine(), offset, 10, 5, 0, space->machine().generic.paletteram.u16[offset]); } +WRITE8_MEMBER( driver_device::paletteram_xRRRRRGGGGGBBBBB_le_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset / 2, 10, 5, 0, paletteram16_le(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xRRRRRGGGGGBBBBB_be_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset / 2, 10, 5, 0, paletteram16_be(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xRRRRRGGGGGBBBBB_split1_w ) +{ + m_generic_paletteram[offset] = data; + set_color_555(machine(), offset, 10, 5, 0, paletteram16_split(offset)); +} + +WRITE8_MEMBER( driver_device::paletteram_xRRRRRGGGGGBBBBB_split2_w ) +{ + m_generic_paletteram2[offset] = data; + set_color_555(machine(), offset, 10, 5, 0, paletteram16_split(offset)); +} + +WRITE16_MEMBER( driver_device::paletteram16_xRRRRRGGGGGBBBBB_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 10, 5, 0, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- x-GGGGG-RRRRR-BBBBB writes @@ -991,6 +1189,12 @@ set_color_555(space->machine(), offset, 5, 10, 0, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_xGGGGGRRRRRBBBBB_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 5, 10, 0, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- x-GGGGG-BBBBB-RRRRR writes @@ -1002,6 +1206,12 @@ set_color_555(space->machine(), offset, 0, 10, 5, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_xGGGGGBBBBBRRRRR_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 0, 10, 5, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- GGGGG-RRRRR-BBBBB-x writes @@ -1013,6 +1223,12 @@ set_color_555(space->machine(), offset, 6, 11, 1, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_GGGGGRRRRRBBBBBx_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 6, 11, 1, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- RRRRR-GGGGG-BBBBB-x writes -------------------------------------------------*/ @@ -1023,6 +1239,12 @@ set_color_555(space->machine(), offset, 11, 6, 1, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_RRRRRGGGGGBBBBBx_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_555(machine(), offset, 11, 6, 1, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- RRRR-GGGG-BBBB-RGBx writes @@ -1037,6 +1259,15 @@ pal5bit(((data >> 3) & 0x1e) | ((data >> 1) & 0x01))); } +WRITE16_MEMBER( driver_device::paletteram16_RRRRGGGGBBBBRGBx_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + data = m_generic_paletteram16[offset]; + palette_set_color_rgb(machine(), offset, pal5bit(((data >> 11) & 0x1e) | ((data >> 3) & 0x01)), + pal5bit(((data >> 7) & 0x1e) | ((data >> 2) & 0x01)), + pal5bit(((data >> 3) & 0x1e) | ((data >> 1) & 0x01))); +} + /*************************************************************************** @@ -1053,6 +1284,12 @@ set_color_4444(space->machine(), offset, 12, 8, 4, 0, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_IIIIRRRRGGGGBBBB_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_4444(machine(), offset, 12, 8, 4, 0, m_generic_paletteram16[offset]); +} + /*------------------------------------------------- RRRR-GGGG-BBBB-IIII writes @@ -1064,6 +1301,12 @@ set_color_4444(space->machine(), offset, 0, 12, 8, 4, space->machine().generic.paletteram.u16[offset]); } +WRITE16_MEMBER( driver_device::paletteram16_RRRRGGGGBBBBIIII_word_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_4444(machine(), offset, 0, 12, 8, 4, m_generic_paletteram16[offset]); +} + /*************************************************************************** @@ -1080,6 +1323,12 @@ set_color_888(space->machine(), offset / 2, 16, 8, 0, paletteram32_be(space->machine(), offset)); } +WRITE16_MEMBER( driver_device::paletteram16_xrgb_word_be_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_888(machine(), offset / 2, 16, 8, 0, paletteram32_be(offset)); +} + /*------------------------------------------------- xxxxxxxx-BBBBBBBB-GGGGGGGG-RRRRRRRR writes @@ -1090,3 +1339,9 @@ COMBINE_DATA(&space->machine().generic.paletteram.u16[offset]); set_color_888(space->machine(), offset / 2, 0, 8, 16, paletteram32_be(space->machine(), offset)); } + +WRITE16_MEMBER( driver_device::paletteram16_xbgr_word_be_w ) +{ + COMBINE_DATA(&m_generic_paletteram16[offset]); + set_color_888(machine(), offset / 2, 0, 8, 16, paletteram32_be(offset)); +} diff -Nru mame-0.144/src/emu/video/generic.h mame-0.145/src/emu/video/generic.h --- mame-0.144/src/emu/video/generic.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/generic.h 2012-02-06 21:30:27.000000000 +0000 @@ -40,12 +40,6 @@ /* set up all the common systems */ void generic_video_init(running_machine &machine); -/* generic video start with a temporary bitmap */ -VIDEO_START( generic_bitmapped ); - -/* generic video update to blit a temporary bitmap */ -SCREEN_UPDATE( generic_bitmapped ); - /* ----- sprite buffering ----- */ diff -Nru mame-0.144/src/emu/video/h63484.c mame-0.145/src/emu/video/h63484.c --- mame-0.144/src/emu/video/h63484.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/h63484.c 2012-02-06 21:30:27.000000000 +0000 @@ -4,7 +4,6 @@ TODO: - 8-bit support for FIFO, parameters and command values - - convert to C++ - execution cycles; ***************************************************************************/ @@ -1160,7 +1159,7 @@ // draw_graphics_line - //------------------------------------------------- -void h63484_device::draw_graphics_line(bitmap_t *bitmap, const rectangle *cliprect, int y, int layer_n) +void h63484_device::draw_graphics_line(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, int layer_n) { int x; int pitch; @@ -1189,16 +1188,17 @@ // update_screen - //------------------------------------------------- -void h63484_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 h63484_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if(m_dcr & 0x8000) // correct? { int y; - for(y=cliprect->min_y;ymax_y;y++) + for(y=cliprect.min_y;y h63484_interface @@ -56,7 +56,7 @@ DECLARE_READ8_MEMBER( vram_r ); DECLARE_WRITE8_MEMBER( vram_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); virtual const rom_entry *device_rom_region() const; virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; @@ -89,7 +89,7 @@ UINT16 video_registers_r(int offset); void video_registers_w(int offset); int translate_command(UINT16 data); - void draw_graphics_line(bitmap_t *bitmap, const rectangle *cliprect, int y, int layer_n); + void draw_graphics_line(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, int layer_n); screen_device *m_screen; diff -Nru mame-0.144/src/emu/video/hd44102.c mame-0.145/src/emu/video/hd44102.c --- mame-0.144/src/emu/video/hd44102.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/hd44102.c 2012-02-06 21:30:27.000000000 +0000 @@ -271,7 +271,7 @@ // update_screen - update screen //------------------------------------------------- -void hd44102_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 hd44102_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { for (int y = 0; y < 50; y++) { @@ -284,15 +284,16 @@ int sy = m_sy + z; int sx = m_sx + y; - if ((sy >= cliprect->min_y) && (sy <= cliprect->max_y) && (sx >= cliprect->min_x) && (sx <= cliprect->max_x)) + if (cliprect.contains(sx, sy)) { int color = (m_status & STATUS_DISPLAY_OFF) ? 0 : BIT(data, z % 8); - *BITMAP_ADDR16(bitmap, sy, sx) = color; + bitmap.pix16(sy, sx) = color; } z++; z %= 32; } } + return 0; } diff -Nru mame-0.144/src/emu/video/hd44102.h mame-0.145/src/emu/video/hd44102.h --- mame-0.144/src/emu/video/hd44102.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/hd44102.h 2012-02-06 21:30:27.000000000 +0000 @@ -46,7 +46,7 @@ DECLARE_WRITE_LINE_MEMBER( cs2_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides diff -Nru mame-0.144/src/emu/video/hd61830.c mame-0.145/src/emu/video/hd61830.c --- mame-0.144/src/emu/video/hd61830.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/hd61830.c 2012-02-06 21:30:27.000000000 +0000 @@ -406,7 +406,7 @@ // draw_scanline - draw one graphics scanline //------------------------------------------------- -void hd61830_device::draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ra) +void hd61830_device::draw_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 ra) { for (int sx = 0; sx < m_hn; sx++) { @@ -414,7 +414,7 @@ for (int x = 0; x < m_hp; x++) { - *BITMAP_ADDR16(bitmap, y, (sx * m_hp) + x) = BIT(data, x); + bitmap.pix16(y, (sx * m_hp) + x) = BIT(data, x); } } } @@ -424,7 +424,7 @@ // update_graphics - draw graphics mode screen //------------------------------------------------- -void hd61830_device::update_graphics(bitmap_t *bitmap, const rectangle *cliprect) +void hd61830_device::update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect) { for (int y = 0; y < m_nx; y++) { @@ -444,7 +444,7 @@ // draw_char - draw a char //------------------------------------------------- -void hd61830_device::draw_char(bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, int x, int y, UINT8 md) +void hd61830_device::draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 ma, int x, int y, UINT8 md) { for (int cl = 0; cl < m_vp; cl++) { @@ -505,7 +505,7 @@ } if (sy < m_screen->height() && sx < m_screen->width()) - *BITMAP_ADDR16(bitmap, sy, sx) = pixel; + bitmap.pix16(sy, sx) = pixel; } } } @@ -515,7 +515,7 @@ // update_text - draw text mode screen //------------------------------------------------- -void hd61830_device::update_text(bitmap_t *bitmap, const rectangle *cliprect) +void hd61830_device::update_text(bitmap_ind16 &bitmap, const rectangle &cliprect) { for (int y = 0; y < (m_nx / m_vp); y++) { @@ -534,7 +534,7 @@ // update_screen - update screen //------------------------------------------------- -void hd61830_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 hd61830_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_mcr & MODE_DISPLAY_ON) { @@ -549,7 +549,7 @@ } else { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); } m_blink++; @@ -559,4 +559,5 @@ m_blink = 0; m_cursor = !m_cursor; } + return 0; } diff -Nru mame-0.144/src/emu/video/hd61830.h mame-0.145/src/emu/video/hd61830.h --- mame-0.144/src/emu/video/hd61830.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/hd61830.h 2012-02-06 21:30:27.000000000 +0000 @@ -68,7 +68,7 @@ DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -87,10 +87,10 @@ private: void set_busy_flag(); - void draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ra); - void update_graphics(bitmap_t *bitmap, const rectangle *cliprect); - void draw_char(bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, int x, int y, UINT8 md); - void update_text(bitmap_t *bitmap, const rectangle *cliprect); + void draw_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 ra); + void update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 ma, int x, int y, UINT8 md); + void update_text(bitmap_ind16 &bitmap, const rectangle &cliprect); devcb_resolved_read8 m_in_rd_func; diff -Nru mame-0.144/src/emu/video/i8275.c mame-0.145/src/emu/video/i8275.c --- mame-0.144/src/emu/video/i8275.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/i8275.c 2012-02-06 21:30:27.000000000 +0000 @@ -201,10 +201,7 @@ vert_pix_total *= 2; // Use of spaced rows } - visarea.min_x = 0; - visarea.min_y = 0; - visarea.max_x = horiz_pix_total - 1; - visarea.max_y = vert_pix_total - 1; + visarea.set(0, horiz_pix_total - 1, 0, vert_pix_total - 1); i8275->screen->configure(horiz_pix_total, vert_pix_total, visarea, i8275->screen->frame_period().attoseconds); @@ -460,7 +457,7 @@ } /* Screen Update */ -void i8275_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void i8275_update(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { i8275_t *i8275 = get_safe_token(device); i8275->ypos = 0; @@ -474,7 +471,7 @@ i8275->fifo_write = 0; if ((i8275->status_reg & I8275_STATUS_VIDEO_ENABLE)==0) { - bitmap_fill(bitmap, cliprect, get_black_pen(device->machine())); + bitmap.fill(get_black_pen(device->machine()), cliprect); } else { // if value < 16 it is visible otherwise not i8275->cursor_blink_cnt++; diff -Nru mame-0.144/src/emu/video/i8275.h mame-0.145/src/emu/video/i8275.h --- mame-0.144/src/emu/video/i8275.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/i8275.h 2012-02-06 21:30:27.000000000 +0000 @@ -51,7 +51,7 @@ WRITE8_DEVICE_HANDLER ( i8275_w ); /* updates the screen */ -void i8275_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +void i8275_update(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); WRITE8_DEVICE_HANDLER( i8275_dack_w ); diff -Nru mame-0.144/src/emu/video/k053250.c mame-0.145/src/emu/video/k053250.c --- mame-0.144/src/emu/video/k053250.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/k053250.c 2012-02-06 21:30:27.000000000 +0000 @@ -58,9 +58,9 @@ } // utility function to render a clipped scanline vertically or horizontally -inline void k053250_t::pdraw_scanline32(bitmap_t *bitmap, const pen_t *palette, UINT8 *source, - const rectangle *cliprect, int linepos, int scroll, int zoom, - UINT32 clipmask, UINT32 wrapmask, UINT32 orientation, bitmap_t *priority, UINT8 pri) +inline void k053250_t::pdraw_scanline32(bitmap_rgb32 &bitmap, const pen_t *palette, UINT8 *source, + const rectangle &cliprect, int linepos, int scroll, int zoom, + UINT32 clipmask, UINT32 wrapmask, UINT32 orientation, bitmap_ind8 &priority, UINT8 pri) { // a sixteen-bit fixed point resolution should be adequate to our application #define FIXPOINT_PRECISION 16 @@ -81,14 +81,14 @@ if (!(orientation & ORIENTATION_SWAP_XY)) { flip = orientation & ORIENTATION_FLIP_X; - dst_min = cliprect->min_x; - dst_max = cliprect->max_x; + dst_min = cliprect.min_x; + dst_max = cliprect.max_x; } else { flip = orientation & ORIENTATION_FLIP_Y; - dst_min = cliprect->min_y; - dst_max = cliprect->max_y; + dst_min = cliprect.min_y; + dst_max = cliprect.max_y; } if (clipmask) @@ -162,16 +162,16 @@ // calculate target increment for horizontal scanlines which is exactly one dst_adv = 1; dst_offset = dst_length; - pri_base = BITMAP_ADDR8(priority, linepos, dst_start + dst_offset); - dst_base = BITMAP_ADDR32(bitmap, linepos, dst_start + dst_length); + pri_base = &priority.pix8(linepos, dst_start + dst_offset); + dst_base = &bitmap.pix32(linepos, dst_start + dst_length); } else { // calculate target increment for vertical scanlines which is the bitmap's pitch value - dst_adv = bitmap->rowpixels; + dst_adv = bitmap.rowpixels(); dst_offset= dst_length * dst_adv; - pri_base = BITMAP_ADDR8(priority, dst_start, linepos + dst_offset); - dst_base = BITMAP_ADDR32(bitmap, dst_start, linepos + dst_offset); + pri_base = &priority.pix8(dst_start, linepos + dst_offset); + dst_base = &bitmap.pix32(dst_start, linepos + dst_offset); } // generalized @@ -221,7 +221,7 @@ #undef FIXPOINT_PRECISION_HALF } -void k053250_t::draw( bitmap_t *bitmap, const rectangle *cliprect, int colorbase, int flags, int priority ) +void k053250_t::draw( bitmap_rgb32 &bitmap, const rectangle &cliprect, int colorbase, int flags, int priority ) { UINT8 *pix_ptr; const pen_t *pal_base, *pal_ptr; @@ -236,10 +236,10 @@ UINT8 ctrl = regs[4]; // register four is the main control register // copy visible boundary values to more accessible locations - int dst_minx = cliprect->min_x; - int dst_maxx = cliprect->max_x; - int dst_miny = cliprect->min_y; - int dst_maxy = cliprect->max_y; + int dst_minx = cliprect.min_x; + int dst_maxx = cliprect.max_x; + int dst_miny = cliprect.min_y; + int dst_maxy = cliprect.max_y; int orientation = 0; // orientation defaults to no swapping and no flipping int dst_height = 512; // virtual bitmap height defaults to five hundred and twelve pixels @@ -307,7 +307,7 @@ if (orientation & ORIENTATION_FLIP_Y) { linedata_adv = -linedata_adv; // traverse line RAM backward in Y flipped scenarioes - linedata_offs += bitmap->height - 1; // and get info for the first line from the bottom + linedata_offs += bitmap.height() - 1; // and get info for the first line from the bottom } dst_wrapmask = ~0; // scanlines don't seem to wrap horizontally in normal orientation @@ -334,7 +334,7 @@ if (orientation & ORIENTATION_FLIP_X) { linedata_adv = -linedata_adv; // traverse line RAM backward in X flipped scenarioes - linedata_offs += bitmap->width - 1; // and get info for the first line from the bottom + linedata_offs += bitmap.width() - 1; // and get info for the first line from the bottom } if (src_clipmask) diff -Nru mame-0.144/src/emu/video/k053250.h mame-0.145/src/emu/video/k053250.h --- mame-0.144/src/emu/video/k053250.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/k053250.h 2012-02-06 21:30:27.000000000 +0000 @@ -26,7 +26,7 @@ DECLARE_WRITE16_MEMBER(ram_w); DECLARE_READ16_MEMBER(rom_r); - void draw( bitmap_t *bitmap, const rectangle *cliprect, int colorbase, int flags, int priority ); + void draw( bitmap_rgb32 &bitmap, const rectangle &cliprect, int colorbase, int flags, int priority ); protected: void device_start(); @@ -46,9 +46,9 @@ void unpack_nibbles(); void dma(int limiter); - static void pdraw_scanline32(bitmap_t *bitmap, const pen_t *palette, UINT8 *source, - const rectangle *cliprect, int linepos, int scroll, int zoom, - UINT32 clipmask, UINT32 wrapmask, UINT32 orientation, bitmap_t *priority, UINT8 pri); + static void pdraw_scanline32(bitmap_rgb32 &bitmap, const pen_t *palette, UINT8 *source, + const rectangle &cliprect, int linepos, int scroll, int zoom, + UINT32 clipmask, UINT32 wrapmask, UINT32 orientation, bitmap_ind8 &priority, UINT8 pri); }; extern const device_type K053250; diff -Nru mame-0.144/src/emu/video/mc6845.c mame-0.145/src/emu/video/mc6845.c --- mame-0.144/src/emu/video/mc6845.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/mc6845.c 2012-02-06 21:30:27.000000000 +0000 @@ -324,10 +324,7 @@ attoseconds_t refresh = HZ_TO_ATTOSECONDS(m_clock) * (m_horiz_char_total + 1) * vert_pix_total; - visarea.min_x = 0; - visarea.min_y = 0; - visarea.max_x = max_visible_x; - visarea.max_y = max_visible_y; + visarea.set(0, max_visible_x, 0, max_visible_y); if (LOG) logerror("M6845 config screen: HTOTAL: 0x%x VTOTAL: 0x%x MAX_X: 0x%x MAX_Y: 0x%x HSYNC: 0x%x-0x%x VSYNC: 0x%x-0x%x Freq: %ffps\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, hsync_on_pos, hsync_off_pos - 1, vsync_on_pos, vsync_off_pos - 1, 1 / ATTOSECONDS_TO_DOUBLE(refresh)); @@ -688,10 +685,9 @@ } -void mc6845_device::update(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 mc6845_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - assert(bitmap != NULL); - assert(cliprect != NULL); + assert(bitmap.valid()); if (m_has_valid_parameters) { @@ -705,14 +701,14 @@ if (m_begin_update != NULL) param = m_begin_update(this, bitmap, cliprect); - if (cliprect->min_y == 0) + if (cliprect.min_y == 0) { /* read the start address at the beginning of the frame */ m_current_disp_addr = m_disp_start_addr; } /* for each row in the visible region */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { /* compute the current raster line */ UINT8 ra = y % (m_max_ras_addr + 1); @@ -752,6 +748,7 @@ } else popmessage("Invalid MC6845 screen parameters - display disabled!!!"); + return 0; } @@ -769,11 +766,8 @@ /* get the screen device */ if ( m_screen_tag != NULL ) { - m_screen = downcast(machine().device(m_screen_tag)); - if (m_screen == NULL) { - astring tempstring; - m_screen = downcast(machine().device(owner()->subtag(tempstring,m_screen_tag))); - } + astring tempstring; + m_screen = downcast(machine().device(siblingtag(tempstring,m_screen_tag))); assert(m_screen != NULL); } else diff -Nru mame-0.144/src/emu/video/mc6845.h mame-0.145/src/emu/video/mc6845.h --- mame-0.144/src/emu/video/mc6845.h 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/mc6845.h 2012-02-06 21:30:27.000000000 +0000 @@ -25,22 +25,22 @@ class mc6845_device; /* callback definitions */ -typedef void * (*mc6845_begin_update_func)(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect); -#define MC6845_BEGIN_UPDATE(name) void *name(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect) +typedef void * (*mc6845_begin_update_func)(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect); +#define MC6845_BEGIN_UPDATE(name) void *name(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect) -typedef void (*mc6845_update_row_func)(mc6845_device *device, bitmap_t *bitmap, - const rectangle *cliprect, UINT16 ma, UINT8 ra, +typedef void (*mc6845_update_row_func)(mc6845_device *device, bitmap_rgb32 &bitmap, + const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param); -#define MC6845_UPDATE_ROW(name) void name(mc6845_device *device, bitmap_t *bitmap, \ - const rectangle *cliprect, UINT16 ma, UINT8 ra, \ +#define MC6845_UPDATE_ROW(name) void name(mc6845_device *device, bitmap_rgb32 &bitmap, \ + const rectangle &cliprect, UINT16 ma, UINT8 ra, \ UINT16 y, UINT8 x_count, INT8 cursor_x, void *param) -typedef void (*mc6845_end_update_func)(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, void *param); -#define MC6845_END_UPDATE(name) void name(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, void *param) +typedef void (*mc6845_end_update_func)(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param); +#define MC6845_END_UPDATE(name) void name(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param) typedef void (*mc6845_on_update_addr_changed_func)(mc6845_device *device, int address, int strobe); @@ -148,7 +148,7 @@ /* updates the screen -- this will call begin_update(), followed by update_row() reapeatedly and after all row updating is complete, end_update() */ - void update(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); protected: // device-level overrides diff -Nru mame-0.144/src/emu/video/msm6255.c mame-0.145/src/emu/video/msm6255.c --- mame-0.144/src/emu/video/msm6255.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/msm6255.c 2012-02-06 21:30:27.000000000 +0000 @@ -317,7 +317,7 @@ // draw_scanline - //------------------------------------------------- -void msm6255_device::draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ma, UINT8 ra) +void msm6255_device::draw_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 ma, UINT8 ra) { UINT8 hp = (m_pr & PR_HP_MASK) + 1; UINT8 hn = (m_hnr & HNR_HN_MASK) + 1; @@ -344,7 +344,7 @@ for (x = 0; x < hp; x++) { - *BITMAP_ADDR16(bitmap, y, (sx * hp) + x) = BIT(data, 7); + bitmap.pix16(y, (sx * hp) + x) = BIT(data, 7); data <<= 1; } @@ -358,7 +358,7 @@ // update_graphics - //------------------------------------------------- -void msm6255_device::update_graphics(bitmap_t *bitmap, const rectangle *cliprect) +void msm6255_device::update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 hn = (m_hnr & HNR_HN_MASK) + 1; UINT8 nx = (m_dvr & DVR_DN_MASK) + 1; @@ -386,7 +386,7 @@ // update_text - //------------------------------------------------- -void msm6255_device::update_text(bitmap_t *bitmap, const rectangle *cliprect) +void msm6255_device::update_text(bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 hn = (m_hnr & HNR_HN_MASK) + 1; UINT8 vp = (m_pr & PR_VP_MASK) + 1; @@ -417,7 +417,7 @@ // update_screen - update screen //------------------------------------------------- -void msm6255_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 msm6255_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_mor & MOR_DISPLAY_ON) { @@ -432,6 +432,7 @@ } else { - bitmap_fill(bitmap, cliprect, get_black_pen(machine())); + bitmap.fill(get_black_pen(machine()), cliprect); } + return 0; } diff -Nru mame-0.144/src/emu/video/msm6255.h mame-0.145/src/emu/video/msm6255.h --- mame-0.144/src/emu/video/msm6255.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/msm6255.h 2012-02-06 21:30:27.000000000 +0000 @@ -68,7 +68,7 @@ DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &device, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -79,9 +79,9 @@ private: inline UINT8 read_video_data(UINT16 ma, UINT8 ra); void update_cursor(); - void draw_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ma, UINT8 ra); - void update_graphics(bitmap_t *bitmap, const rectangle *cliprect); - void update_text(bitmap_t *bitmap, const rectangle *cliprect); + void draw_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 ma, UINT8 ra); + void update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect); + void update_text(bitmap_ind16 &bitmap, const rectangle &cliprect); screen_device *m_screen; diff -Nru mame-0.144/src/emu/video/pc_cga.c mame-0.145/src/emu/video/pc_cga.c --- mame-0.144/src/emu/video/pc_cga.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/pc_cga.c 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,1656 @@ +/*************************************************************************** + + Color Graphics Adapter (CGA) section + + + Notes on Port 3D8 + (http://www.clipx.net/ng/interrupts_and_ports/ng2d045.php) + + Port 3D8 - Color/VGA Mode control register + + xx1x xxxx Attribute bit 7. 0=blink, 1=Intesity + xxx1 xxxx 640x200 mode + xxxx 1xxx Enable video signal + xxxx x1xx Select B/W mode + xxxx xx1x Select graphics + xxxx xxx1 80x25 text + + + The usage of the above control register for various modes is: + xx10 1100 40x25 alpha B/W + xx10 1000 40x25 alpha color + xx10 1101 80x25 alpha B/W + xx10 1001 80x25 alpha color + xxx0 1110 320x200 graph B/W + xxx0 1010 320x200 graph color + xxx1 1110 640x200 graph B/W + + + PC1512 display notes + + The PC1512 built-in display adaptor is an emulation of IBM's CGA. Unlike a + real CGA, it is not built around a real MC6845 controller, and so attempts + to get custom video modes out of it may not work as expected. Its 640x200 + CGA mode can be set up to be a 16-color mode rather than mono. + + If you program it with BIOS calls, the PC1512 behaves just like a real CGA, + except: + + - The 'greyscale' text modes (0 and 2) behave just like the 'color' + ones (1 and 3). On a color monitor both are in color; on a mono + monitor both are in greyscale. + - Mode 5 (the 'greyscale' graphics mode) displays in color, using + an alternative color palette: Cyan, Red and White. + - The undocumented 160x100x16 "graphics" mode works correctly. + + (source John Elliott http://www.seasip.info/AmstradXT/pc1512disp.html) + + + Cursor signal handling: + + The alpha dots signal is set when a character pixel should be set. This signal is + also set when the cursor should be displayed. The following formula for alpha + dots is derived from the schematics: + ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( ( ( NOT AT7 ) OR CURSOR DLY OR -BLINK OR NOT ENABLE BLINK ) AND ( CHG DOTS ) ) + + -CURSOR BLINK = VSYNC DLY (LS393) (changes every 8 vsyncs) + -BLINK = -CURSOR BLINK (LS393) (changes every 16 vsyncs) + -CURSOR DLY = -CURSOR signal from mc6845 and LS174 + CHG DOTS = character pixel (from character rom) + + For non-blinking modes this formula reduces to: + ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( CHG DOTS ) + + This means the cursor switches on/off state every 8 vsyncs. + + + For blinking modes this formula reduces to: + ALPHA DOTS = ( ( CURSOR DLY ) AND ( CURSOR BLINK ) ) OR ( ( ( NOT AT7 ) OR CURSOR DLY OR -BLINK ) AND ( CHG DOTS ) ) + + So, at the cursor location the attribute blinking is ignored and only regular + cursor blinking takes place (state switches every 8 vsyncs). On non-cursor + locations with the highest attribute bits set the character will switch + on/off every 16 vsyncs. In all other cases the character is displayed as + usual. + +***************************************************************************/ + +#include "emu.h" +#include "video/pc_cga.h" +#include "video/mc6845.h" +#include "video/cgapal.h" +#include "memconv.h" + +#define VERBOSE_CGA 0 /* CGA (Color Graphics Adapter) */ + +#define CGA_LOG(N,M,A) \ + do { \ + if(VERBOSE_CGA>=N) \ + { \ + if( M ) \ + logerror("%11.6f: %-24s",machine.time().as_double(),(char*)M ); \ + logerror A; \ + } \ + } while (0) + +/*************************************************************************** + + Static declarations + +***************************************************************************/ + +static VIDEO_START( pc_cga ); +static VIDEO_START( pc_cga32k ); +static PALETTE_INIT( pc_cga ); + + +INPUT_PORTS_START( pcvideo_cga ) + PORT_START( "pcvideo_cga_config" ) + PORT_CONFNAME( 0x03, 0x00, "CGA character set") + PORT_CONFSETTING(0x00, DEF_STR( Normal )) + PORT_CONFSETTING(0x01, "Alternative") + PORT_CONFNAME( 0x1C, 0x00, "CGA monitor type") + PORT_CONFSETTING(0x00, "Colour RGB") + PORT_CONFSETTING(0x04, "Mono RGB") + PORT_CONFSETTING(0x08, "Colour composite") + PORT_CONFSETTING(0x0C, "Television") + PORT_CONFSETTING(0x10, "LCD") + PORT_CONFNAME( 0xE0, 0x00, "CGA chipset") + PORT_CONFSETTING(0x00, "IBM") + PORT_CONFSETTING(0x20, "Amstrad PC1512") + PORT_CONFSETTING(0x40, "Amstrad PPC512") + PORT_CONFSETTING(0x60, "ATI") + PORT_CONFSETTING(0x80, "Paradise") +INPUT_PORTS_END + + +INPUT_PORTS_START( pcvideo_pc1512 ) + PORT_START( "pcvideo_cga_config" ) + PORT_CONFNAME( 0x03, 0x03, "CGA character set") + PORT_CONFSETTING(0x00, "Greek") + PORT_CONFSETTING(0x01, "Danish 2") + PORT_CONFSETTING(0x02, "Danish 1") + PORT_CONFSETTING(0x03, "Default") + PORT_CONFNAME( 0x1C, 0x00, "CGA monitor type") + PORT_CONFSETTING(0x00, "Colour RGB") + PORT_CONFSETTING(0x04, "Mono RGB") + PORT_BIT ( 0xE0, 0x20, IPT_UNUSED ) /* Chipset is always PC1512 */ +INPUT_PORTS_END + +/* Dipswitch for font selection */ +#define CGA_FONT (input_port_read_direct(cga.config_input_port)&3) + +/* Dipswitch for monitor selection */ +#define CGA_MONITOR (input_port_read_direct(cga.config_input_port)&0x1C) +#define CGA_MONITOR_RGB 0x00 /* Colour RGB */ +#define CGA_MONITOR_MONO 0x04 /* Greyscale RGB */ +#define CGA_MONITOR_COMPOSITE 0x08 /* Colour composite */ +#define CGA_MONITOR_TELEVISION 0x0C /* Television */ +#define CGA_MONITOR_LCD 0x10 /* LCD, eg PPC512 */ + + +/* Dipswitch for chipset selection */ +#define CGA_CHIPSET (input_port_read_direct(cga.config_input_port)&0xE0) +#define CGA_CHIPSET_IBM 0x00 /* Original IBM CGA */ +#define CGA_CHIPSET_PC1512 0x20 /* PC1512 CGA subset */ +#define CGA_CHIPSET_PC200 0x40 /* PC200 in CGA mode */ +#define CGA_CHIPSET_ATI 0x60 /* ATI (supports Plantronics) */ +#define CGA_CHIPSET_PARADISE 0x80 /* Paradise (used in PC1640) */ + + +static READ8_HANDLER( pc_cga8_r ); +static WRITE8_HANDLER( pc_cga8_w ); +static READ16_HANDLER( pc_cga16le_r ); +static WRITE16_HANDLER( pc_cga16le_w ); +static READ32_HANDLER( pc_cga32le_r ); +static WRITE32_HANDLER( pc_cga32le_w ); +static MC6845_UPDATE_ROW( cga_update_row ); +static WRITE_LINE_DEVICE_HANDLER( cga_hsync_changed ); +static WRITE_LINE_DEVICE_HANDLER( cga_vsync_changed ); +static VIDEO_START( pc1512 ); +static SCREEN_UPDATE_RGB32( mc6845_pc1512 ); + +static VIDEO_START( cga_poisk2 ); +static SCREEN_UPDATE_RGB32( cga_poisk2 ); + +static const mc6845_interface mc6845_cga_intf = +{ + CGA_SCREEN_NAME, /* screen number */ + 8, /* numbers of pixels per video memory address */ + NULL, /* begin_update */ + cga_update_row, /* update_row */ + NULL, /* end_update */ + DEVCB_NULL, /* on_de_changed */ + DEVCB_NULL, /* on_cur_changed */ + DEVCB_LINE(cga_hsync_changed), /* on_hsync_changed */ + DEVCB_LINE(cga_vsync_changed), /* on_vsync_changed */ + NULL +}; + +#define CGA_HCLK (XTAL_14_31818MHz/8) +#define CGA_LCLK (XTAL_14_31818MHz/16) + + +MACHINE_CONFIG_FRAGMENT( pcvideo_cga ) + MCFG_SCREEN_ADD(CGA_SCREEN_NAME, RASTER) + MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200) + MCFG_SCREEN_UPDATE_STATIC( mc6845_cga ) + + MCFG_PALETTE_LENGTH(/* CGA_PALETTE_SETS * 16*/ 65536 ) + MCFG_PALETTE_INIT(pc_cga) + + MCFG_MC6845_ADD(CGA_MC6845_NAME, MC6845, XTAL_14_31818MHz/8, mc6845_cga_intf) + + MCFG_VIDEO_START( pc_cga ) +MACHINE_CONFIG_END + +MACHINE_CONFIG_FRAGMENT( pcvideo_cga32k ) + MCFG_FRAGMENT_ADD( pcvideo_cga ) + MCFG_VIDEO_START( pc_cga32k ) +MACHINE_CONFIG_END + +MACHINE_CONFIG_FRAGMENT( pcvideo_poisk2 ) + MCFG_FRAGMENT_ADD( pcvideo_cga ) + MCFG_VIDEO_START( cga_poisk2 ) + MCFG_SCREEN_MODIFY(CGA_SCREEN_NAME) + MCFG_SCREEN_UPDATE_STATIC( cga_poisk2 ) +MACHINE_CONFIG_END + +MACHINE_CONFIG_FRAGMENT( pcvideo_pc1512 ) + MCFG_FRAGMENT_ADD( pcvideo_cga ) + MCFG_VIDEO_START( pc1512 ) + MCFG_SCREEN_MODIFY(CGA_SCREEN_NAME) + MCFG_SCREEN_UPDATE_STATIC( mc6845_pc1512 ) +MACHINE_CONFIG_END + + + +/*************************************************************************** + + Local variables and declarations + +***************************************************************************/ + +static struct +{ + UINT8 mode_control; /* wo 0x3d8 */ + UINT8 color_select; /* wo 0x3d9 */ + UINT8 status; /* ro 0x3da */ + UINT8 plantronics; /* wo 0x3dd, ATI chipset only */ + + UINT8 frame; + + UINT8 *chr_gen; + + const input_port_config *config_input_port; + + mc6845_update_row_func update_row; + UINT8 palette_lut_2bpp[4]; + UINT8 vsync; + UINT8 hsync; + UINT8 p3df; + + size_t videoram_size; + UINT8 *videoram; + UINT8 is_superimpose; +} cga; + + +/*************************************************************************** + + Methods + +***************************************************************************/ + +/* Initialise the cga palette */ +static PALETTE_INIT( pc_cga ) +{ + int i, r, g, b; + + for ( i = 0; i < CGA_PALETTE_SETS * 16; i++ ) + { + palette_set_color_rgb( machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2] ); + } + + i = 0x8000; + for ( r = 0; r < 32; r++ ) + { + for ( g = 0; g < 32; g++ ) + { + for ( b = 0; b < 32; b++ ) + { + palette_set_color_rgb( machine, i, r << 3, g << 3, b << 3 ); + i++; + } + } + } +} + + +static int internal_pc_cga_video_start(running_machine &machine) +{ + memset(&cga, 0, sizeof(cga)); + cga.update_row = NULL; + + cga.chr_gen = machine.region( "gfx1" )->base() + 0x1000; + + state_save_register_item(machine, "pccga", NULL, 0, cga.mode_control); + state_save_register_item(machine, "pccga", NULL, 0, cga.color_select); + state_save_register_item(machine, "pccga", NULL, 0, cga.status); + state_save_register_item(machine, "pccga", NULL, 0, cga.plantronics); + + cga.config_input_port = machine.m_portlist.find(":pcvideo_cga_config" ); + + return 0; +} + + + +static VIDEO_START( pc_cga ) +{ + int buswidth; + address_space *space = machine.firstcpu->memory().space(AS_PROGRAM); + address_space *spaceio = machine.firstcpu->memory().space(AS_IO); + + space->install_readwrite_bank(0xb8000, 0xbbfff, 0, 0x04000, "bank11" ); + buswidth = machine.firstcpu->memory().space_config(AS_PROGRAM)->m_databus_width; + switch(buswidth) + { + case 8: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga8_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga8_w) ); + break; + + case 16: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga16le_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga16le_w) ); + break; + + case 32: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga32le_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga32le_w) ); + break; + + default: + fatalerror("CGA: Bus width %d not supported", buswidth); + break; + } + internal_pc_cga_video_start(machine); + cga.videoram_size = 0x4000; + cga.videoram = auto_alloc_array(machine, UINT8, 0x4000); + cga.is_superimpose = 0; + + memory_set_bankptr(machine,"bank11", cga.videoram); +} + + +static VIDEO_START( pc_cga32k ) +{ + int buswidth; + address_space *space = machine.firstcpu->memory().space(AS_PROGRAM); + address_space *spaceio = machine.firstcpu->memory().space(AS_IO); + + + space->install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); + buswidth = machine.firstcpu->memory().space_config(AS_PROGRAM)->m_databus_width; + switch(buswidth) + { + case 8: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga8_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga8_w) ); + break; + + case 16: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga16le_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga16le_w) ); + break; + + case 32: + spaceio->install_legacy_read_handler(0x3d0, 0x3df, FUNC(pc_cga32le_r) ); + spaceio->install_legacy_write_handler(0x3d0, 0x3df, FUNC(pc_cga32le_w) ); + break; + + default: + fatalerror("CGA: Bus width %d not supported", buswidth); + break; + } + + internal_pc_cga_video_start(machine); + + cga.videoram_size = 0x8000; + cga.videoram = auto_alloc_array(machine, UINT8, 0x8000); + cga.is_superimpose = 0; + + memory_set_bankptr(machine,"bank11", cga.videoram); +} + +SCREEN_UPDATE_RGB32( mc6845_cga ) +{ + UINT8 *gfx = screen.machine().region("gfx1")->base(); + mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); + mc6845->screen_update( screen, bitmap, cliprect); + + /* Check for changes in font dipsetting */ + switch ( CGA_FONT & 0x01 ) + { + case 0: + cga.chr_gen = gfx + 0x1800; + break; + case 1: + cga.chr_gen = gfx + 0x1000; + break; + } + return 0; +} + + +static VIDEO_START( cga_poisk2 ) +{ + VIDEO_START_CALL(pc_cga); + cga.chr_gen = machine.region( "gfx1" )->base() + 0x0000; +} + +static SCREEN_UPDATE_RGB32( cga_poisk2 ) +{ + UINT8 *gfx = screen.machine().region("gfx1")->base(); + mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); + mc6845->screen_update( screen, bitmap, cliprect); + + /* Check for changes in font dipsetting */ + switch ( CGA_FONT & 0x01 ) + { + case 0: + cga.chr_gen = gfx + 0x0800; + break; + case 1: + cga.chr_gen = gfx + 0x0000; + break; + } + return 0; +} + +/* for superimposing CGA over a different source video (i.e. tetriskr) */ +VIDEO_START( pc_cga_superimpose ) +{ + VIDEO_START_CALL( pc_cga ); + cga.is_superimpose = 1; +} + +/*************************************************************************** + Draw text mode with 40x25 characters (default) with high intensity bg. + The character cell size is 16x8 +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_text_inten_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = attr & 0x0F; + UINT16 bg = attr >> 4; + + if ( i == cursor_x && ( cga.frame & 0x08 ) ) + { + data = 0xFF; + } + + *p = palette[( data & 0x80 ) ? fg : bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg]; p++; + *p = palette[( data & 0x20 ) ? fg : bg]; p++; + *p = palette[( data & 0x10 ) ? fg : bg]; p++; + *p = palette[( data & 0x08 ) ? fg : bg]; p++; + *p = palette[( data & 0x04 ) ? fg : bg]; p++; + *p = palette[( data & 0x02 ) ? fg : bg]; p++; + *p = palette[( data & 0x01 ) ? fg : bg]; p++; + } +} + + +/*************************************************************************** + Draw text mode with 40x25 characters (default) with high intensity bg. + The character cell size is 16x8. Composite monitor, greyscale. +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = 0x10 + ( attr & 0x0F ); + UINT16 bg = 0x10 + ( ( attr >> 4 ) & 0x07 ); + + if ( i == cursor_x && ( cga.frame & 0x08 ) ) + { + data = 0xFF; + } + + *p = palette[( data & 0x80 ) ? fg : bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg]; p++; + *p = palette[( data & 0x20 ) ? fg : bg]; p++; + *p = palette[( data & 0x10 ) ? fg : bg]; p++; + *p = palette[( data & 0x08 ) ? fg : bg]; p++; + *p = palette[( data & 0x04 ) ? fg : bg]; p++; + *p = palette[( data & 0x02 ) ? fg : bg]; p++; + *p = palette[( data & 0x01 ) ? fg : bg]; p++; + } +} + +/*************************************************************************** + Draw text mode with 40x25 characters (default) with high intensity bg. + The character cell size is 16x8 +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_inten_alt_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = attr & 0x0F; + + if ( i == cursor_x && ( cga.frame & 0x08 ) ) + { + data = 0xFF; + } + + *p = palette[( data & 0x80 ) ? fg : 0]; p++; + *p = palette[( data & 0x40 ) ? fg : 0]; p++; + *p = palette[( data & 0x20 ) ? fg : 0]; p++; + *p = palette[( data & 0x10 ) ? fg : 0]; p++; + *p = palette[( data & 0x08 ) ? fg : 0]; p++; + *p = palette[( data & 0x04 ) ? fg : 0]; p++; + *p = palette[( data & 0x02 ) ? fg : 0]; p++; + *p = palette[( data & 0x01 ) ? fg : 0]; p++; + } +} + + +/*************************************************************************** + Draw text mode with 40x25 characters (default) and blinking colors. + The character cell size is 16x8 +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_text_blink_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_blink_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = attr & 0x0F; + UINT16 bg = attr >> 4; + + if ( i == cursor_x ) + { + if ( cga.frame & 0x08 ) + { + data = 0xFF; + } + } + else + { + if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) ) + { + data = 0x00; + } + } + + *p = palette[( data & 0x80 ) ? fg : bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg]; p++; + *p = palette[( data & 0x20 ) ? fg : bg]; p++; + *p = palette[( data & 0x10 ) ? fg : bg]; p++; + *p = palette[( data & 0x08 ) ? fg : bg]; p++; + *p = palette[( data & 0x04 ) ? fg : bg]; p++; + *p = palette[( data & 0x02 ) ? fg : bg]; p++; + *p = palette[( data & 0x01 ) ? fg : bg]; p++; + } +} + +static MC6845_UPDATE_ROW( cga_text_blink_update_row_si ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_blink_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = attr & 0x0F; + UINT16 bg = attr >> 4; + UINT8 xi; + + if ( i == cursor_x ) + { + if ( cga.frame & 0x08 ) + { + data = 0xFF; + } + } + else + { + if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) ) + { + data = 0x00; + } + } + + for(xi=0;xi<8;xi++) + { + UINT8 pen_data, dot; + + dot = (data & (1 << (7-xi))); + pen_data = dot ? fg : bg; + if(pen_data || dot) + *p = palette[pen_data]; + p++; + } + } +} + +/*************************************************************************** + Draw text mode with 40x25 characters (default) and blinking colors. + The character cell size is 16x8 +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_text_blink_alt_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff; + UINT8 chr = videoram[ offset ]; + UINT8 attr = videoram[ offset +1 ]; + UINT8 data = cga.chr_gen[ chr * 8 + ra ]; + UINT16 fg = attr & 0x07; + UINT16 bg = 0; + + if ( i == cursor_x ) + { + if ( cga.frame & 0x08 ) + { + data = 0xFF; + } + } + else + { + if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) ) + { + data = 0x00; + bg = ( attr >> 4 ) & 0x07; + } + } + + *p = palette[( data & 0x80 ) ? fg : bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg]; p++; + *p = palette[( data & 0x20 ) ? fg : bg]; p++; + *p = palette[( data & 0x10 ) ? fg : bg]; p++; + *p = palette[( data & 0x08 ) ? fg : bg]; p++; + *p = palette[( data & 0x04 ) ? fg : bg]; p++; + *p = palette[( data & 0x02 ) ? fg : bg]; p++; + *p = palette[( data & 0x01 ) ? fg : bg]; p++; + } +} + + +/* The lo-res (320x200) graphics mode on a colour composite monitor */ + +static MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bppl_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); + UINT8 data = videoram[ offset ]; + + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + + data = videoram[ offset + 1 ]; + + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + } +} + + +/* The hi-res graphics mode on a colour composite monitor + * + * The different scaling factors mean that the '160x200' versions of screens + * are the same size as the normal colour ones. + */ + +static const UINT8 yc_lut2[4] = { 0, 182, 71, 255 }; + +static const UINT8 yc_lut[16][8] = +{ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* black */ + { 0, 0, 0, 0, 1, 1, 1, 1 }, /* blue */ + { 0, 1, 1, 1, 1, 0, 0, 0 }, /* green */ + { 0, 0, 1, 1, 1, 1, 0, 0 }, /* cyan */ + { 1, 1, 0, 0, 0, 0, 1, 1 }, /* red */ + { 1, 0, 0, 0, 0, 1, 1, 1 }, /* magenta */ + { 1, 1, 1, 1, 0, 0, 0, 0 }, /* yellow */ + { 1, 1, 1, 1, 1, 1, 1, 1 }, /* white */ + /* Intensity set */ + { 2, 2, 2, 2, 2, 2, 2, 2 }, /* black */ + { 2, 2, 2, 2, 3, 3, 3, 3 }, /* blue */ + { 2, 3, 3, 3, 3, 2, 2, 2 }, /* green */ + { 2, 2, 3, 3, 3, 3, 2, 2 }, /* cyan */ + { 3, 3, 2, 2, 2, 2, 3, 3 }, /* red */ + { 3, 2, 2, 2, 2, 3, 3, 3 }, /* magenta */ + { 3, 3, 3, 3, 2, 2, 2, 2 }, /* yellow */ + { 3, 3, 3, 3, 3, 3, 3, 3 }, /* white */ +}; + +static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bpph_update_row",("\n")); + + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); + UINT8 data = videoram[ offset ]; + + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + + data = videoram[ offset + 1 ]; + + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data >> 4]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + *p = palette[data & 0x0F]; p++; + } +} + + +/*************************************************************************** + Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 + cga fetches 2 byte per mc6845 access. +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_gfx_2bpp_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 ); + UINT8 data = videoram[ offset ]; + + *p = palette[cga.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ data & 0x03 ]]; p++; + + data = videoram[ offset+1 ]; + + *p = palette[cga.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; + *p = palette[cga.palette_lut_2bpp[ data & 0x03 ]]; p++; + } +} + + + +/*************************************************************************** + Draw graphics mode with 640x200 pixels (default). + The cell size is 1x1 (1 scanline is the real default) + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +***************************************************************************/ + +static MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row ) +{ + UINT8 *videoram = cga.videoram; + UINT32 *p = &bitmap.pix32(y); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + UINT8 fg = cga.color_select & 0x0F; + int i; + running_machine &machine = device->machine(); + + if ( y == 0 ) CGA_LOG(1,"cga_gfx_1bpp_update_row",("\n")); + for ( i = 0; i < x_count; i++ ) + { + UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( ra & 1 ) << 13 ); + UINT8 data = videoram[ offset ]; + + *p = palette[( data & 0x80 ) ? fg : 0]; p++; + *p = palette[( data & 0x40 ) ? fg : 0]; p++; + *p = palette[( data & 0x20 ) ? fg : 0]; p++; + *p = palette[( data & 0x10 ) ? fg : 0]; p++; + *p = palette[( data & 0x08 ) ? fg : 0]; p++; + *p = palette[( data & 0x04 ) ? fg : 0]; p++; + *p = palette[( data & 0x02 ) ? fg : 0]; p++; + *p = palette[( data & 0x01 ) ? fg : 0]; p++; + + data = videoram[ offset + 1 ]; + + *p = palette[( data & 0x80 ) ? fg : 0]; p++; + *p = palette[( data & 0x40 ) ? fg : 0]; p++; + *p = palette[( data & 0x20 ) ? fg : 0]; p++; + *p = palette[( data & 0x10 ) ? fg : 0]; p++; + *p = palette[( data & 0x08 ) ? fg : 0]; p++; + *p = palette[( data & 0x04 ) ? fg : 0]; p++; + *p = palette[( data & 0x02 ) ? fg : 0]; p++; + *p = palette[( data & 0x01 ) ? fg : 0]; p++; + } +} + + +static MC6845_UPDATE_ROW( cga_update_row ) +{ + if ( cga.update_row ) + { + cga.update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param ); + } +} + +// bit 0 is actually display enable (vblank OR hblank enabled) +static WRITE_LINE_DEVICE_HANDLER( cga_hsync_changed ) +{ + cga.hsync = state ? 1 : 0; +} + + +static WRITE_LINE_DEVICE_HANDLER( cga_vsync_changed ) +{ + cga.vsync = state ? 9 : 0; + if ( state ) + { + cga.frame++; + } +} + + +static void pc_cga_set_palette_luts(void) +{ + /* Setup 2bpp palette lookup table */ + if ( cga.mode_control & 0x10 ) + { + cga.palette_lut_2bpp[0] = 0; + } + else + { + cga.palette_lut_2bpp[0] = cga.color_select & 0x0F; + } + if ( cga.mode_control & 0x04 ) + { + cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 3; + cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 4; + cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 7; + } + else + { + if ( cga.color_select & 0x20 ) + { + cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 3; + cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 5; + cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 7; + } + else + { + cga.palette_lut_2bpp[1] = ( ( cga.color_select & 0x10 ) >> 1 ) | 2; + cga.palette_lut_2bpp[2] = ( ( cga.color_select & 0x10 ) >> 1 ) | 4; + cga.palette_lut_2bpp[3] = ( ( cga.color_select & 0x10 ) >> 1 ) | 6; + } + } + //logerror("2bpp lut set to %d,%d,%d,%d\n", cga.palette_lut_2bpp[0], cga.palette_lut_2bpp[1], cga.palette_lut_2bpp[2], cga.palette_lut_2bpp[3]); +} + +/* + * rW CGA mode control register (see #P138) + * + * x x x 0 1 0 0 0 - 320x200, 40x25 text. Colour on RGB and composite monitors. + * x x x 0 1 0 0 1 - 640x200, 80x25 text. Colour on RGB and composite monitors. + * x x x 0 1 0 1 0 - 320x200 graphics. Colour on RGB and composite monitors. + * x x x 0 1 0 1 1 - unknown/invalid. + * x x x 0 1 1 0 0 - 320x200, 40x25 text. Colour on RGB, greyscale on composite monitors. + * x x x 0 1 1 0 1 - 640x200, 80x25 text. Colour on RGB, greyscale on composite monitors. + * x x x 0 1 1 1 0 - 320x200 graphics. Alternative palette on RGB, greyscale on composite monitors. + * x x x 0 1 1 1 1 - unknown/invalid. + * x x x 1 1 0 0 0 - unknown/invalid. + * x x x 1 1 0 0 1 - unknown/invalid. + * x x x 1 1 0 1 0 - 160x200/640x200 graphics. 640x200 ?? on RGB monitor, 160x200 on composite monitor. + * x x x 1 1 0 1 1 - unknown/invalid. + * x x x 1 1 1 0 0 - unknown/invalid. + * x x x 1 1 1 0 1 - unknown/invalid. + * x x x 1 1 1 1 0 - 640x200 graphics. Colour on black on RGB monitor, monochrome on composite monitor. + * x x x 1 1 1 1 1 - unknown/invalid. + */ +static void pc_cga_mode_control_w(running_machine &machine, int data) +{ + mc6845_device *mc6845 = machine.device(CGA_MC6845_NAME); + + CGA_LOG(1,"CGA_mode_control_w",("$%02x: columns %d, gfx %d, hires %d, blink %d\n", + data, (data&1)?80:40, (data>>1)&1, (data>>4)&1, (data>>5)&1)); + + cga.mode_control = data; + + //logerror("mode set to %02X\n", cga.mode_control & 0x3F ); + switch ( cga.mode_control & 0x3F ) + { + case 0x08: case 0x09: case 0x0C: case 0x0D: + mc6845->set_hpixels_per_column( 8 ); + if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) + { + if ( cga.mode_control & 0x04 ) + { + /* Composite greyscale */ + cga.update_row = cga_text_inten_comp_grey_update_row; + } + else + { + /* Composite colour */ + cga.update_row = cga_text_inten_update_row; + } + } + else + { + /* RGB colour */ + cga.update_row = cga_text_inten_update_row; + } + break; + case 0x0A: case 0x0B: case 0x2A: case 0x2B: + mc6845->set_hpixels_per_column( 8 ); + if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) + { + cga.update_row = cga_gfx_4bppl_update_row; + } + else + { + cga.update_row = cga_gfx_2bpp_update_row; + } + break; + case 0x0E: case 0x0F: case 0x2E: case 0x2F: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_gfx_2bpp_update_row; + break; + case 0x18: case 0x19: case 0x1C: case 0x1D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_inten_alt_update_row; + break; + case 0x1A: case 0x1B: case 0x3A: case 0x3B: + mc6845->set_hpixels_per_column( 16 ); + if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) + { + cga.update_row = cga_gfx_4bpph_update_row; + } + else + { + cga.update_row = cga_gfx_1bpp_update_row; + } + break; + case 0x1E: case 0x1F: case 0x3E: case 0x3F: + mc6845->set_hpixels_per_column( 16 ); + cga.update_row = cga_gfx_1bpp_update_row; + break; + case 0x28: case 0x29: case 0x2C: case 0x2D: + mc6845->set_hpixels_per_column( 8 ); + if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) + { + if ( cga.mode_control & 0x04 ) + { + /* Composite greyscale */ + cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; + } + else + { + /* Composite colour */ + cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; + } + } + else + { + /* RGB colour */ + cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row; + } + break; + case 0x38: case 0x39: case 0x3C: case 0x3D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_blink_alt_update_row; + break; + default: + cga.update_row = NULL; + break; + } + + // The lowest bit of the mode register selects, among others, the + // input clock to the 6845. + mc6845->set_clock( ( cga.mode_control & 1 ) ? CGA_HCLK : CGA_LCLK ); + + pc_cga_set_palette_luts(); +} + + + +/* + * ?W reserved for color select register on color adapter + */ +static void pc_cga_color_select_w(running_machine &machine, int data) +{ + CGA_LOG(1,"CGA_color_select_w",("$%02x\n", data)); + cga.color_select = data; + //logerror("color_select_w: %02X\n", data); + pc_cga_set_palette_luts(); +} + + + +/* + * Select Plantronics modes + */ +static void pc_cga_plantronics_w(running_machine &machine, int data) +{ + CGA_LOG(1,"CGA_plantronics_w",("$%02x\n", data)); + + if (CGA_CHIPSET != CGA_CHIPSET_ATI) return; + + data &= 0x70; /* Only bits 6-4 are used */ + if (cga.plantronics == data) return; + cga.plantronics = data; +} + + + +/************************************************************************* + * + * CGA + * color graphics adapter + * + *************************************************************************/ + +static WRITE8_HANDLER ( char_ram_w ) +{ + UINT8 *gfx = space->machine().region("gfx1")->base(); + logerror("write char ram %04x %02x\n",offset,data); + gfx[offset + 0x0000] = data; + gfx[offset + 0x0800] = data; + gfx[offset + 0x1000] = data; + gfx[offset + 0x1800] = data; +} + +static WRITE16_HANDLER( char_ram_16le_w ) { write16le_with_write8_handler(char_ram_w, space, offset, data, mem_mask); } +static WRITE32_HANDLER( char_ram_32_w ) { write32le_with_write8_handler(char_ram_w, space, offset, data, mem_mask); } + +static READ8_HANDLER ( char_ram_r ) +{ + UINT8 *gfx = space->machine().region("gfx1")->base(); + return gfx[offset]; +} + +static READ16_HANDLER( char_ram_16le_r ) { return read16le_with_read8_handler(char_ram_r, space, offset, mem_mask); } +static READ32_HANDLER( char_ram_32_r ) { return read32le_with_read8_handler(char_ram_r, space, offset, mem_mask); } + +static READ8_HANDLER( pc_cga8_r ) +{ + mc6845_device *mc6845 = space->machine().device(CGA_MC6845_NAME); + int data = 0xff; + switch( offset ) + { + case 0: case 2: case 4: case 6: + /* return last written mc6845 address value here? */ + break; + case 1: case 3: case 5: case 7: + data = mc6845->register_r( *space, offset ); + break; + case 10: + data = cga.vsync | ( ( data & 0x40 ) >> 4 ) | cga.hsync; + break; + case 0x0f: + data = cga.p3df; + break; + } + return data; +} + + + +static WRITE8_HANDLER( pc_cga8_w ) +{ + mc6845_device *mc6845; + + switch(offset) { + case 0: case 2: case 4: case 6: + mc6845 = space->machine().device(CGA_MC6845_NAME); + mc6845->address_w( *space, offset, data ); + break; + case 1: case 3: case 5: case 7: + mc6845 = space->machine().device(CGA_MC6845_NAME); + mc6845->register_w( *space, offset, data ); + break; + case 8: + pc_cga_mode_control_w(space->machine(), data); + break; + case 9: + pc_cga_color_select_w(space->machine(), data); + break; + case 0x0d: + pc_cga_plantronics_w(space->machine(), data); + break; + case 0x0f: + // Not sure if some all CGA cards have ability to upload char definition + // The original CGA card had a char rom + UINT8 buswidth = space->machine().firstcpu->memory().space_config(AS_PROGRAM)->m_databus_width; + address_space *space_prg = space->machine().firstcpu->memory().space(AS_PROGRAM); + cga.p3df = data; + if (data & 1) { + switch(buswidth) + { + case 8: + space_prg->install_legacy_readwrite_handler(0xb8000, 0xb87ff, FUNC(char_ram_r),FUNC(char_ram_w) ); + break; + + case 16: + space_prg->install_legacy_readwrite_handler(0xb8000, 0xb87ff, FUNC(char_ram_16le_r),FUNC(char_ram_16le_w) ); + break; + + case 32: + space_prg->install_legacy_readwrite_handler(0xb8000, 0xb87ff, FUNC(char_ram_32_r),FUNC(char_ram_32_w) ); + break; + + default: + fatalerror("CGA: Bus width %d not supported", buswidth); + break; + } + } else { + if (cga.videoram_size== 0x4000) { + space_prg->install_readwrite_bank(0xb8000, 0xbbfff, 0, 0x04000, "bank11" ); + } else { + space_prg->install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); + } + } + break; + + } +} + + + +static READ16_HANDLER( pc_cga16le_r ) { return read16le_with_read8_handler(pc_cga8_r,space, offset, mem_mask); } +static WRITE16_HANDLER( pc_cga16le_w ) { write16le_with_write8_handler(pc_cga8_w, space, offset, data, mem_mask); } +static READ32_HANDLER( pc_cga32le_r ) { return read32le_with_read8_handler(pc_cga8_r, space, offset, mem_mask); } +static WRITE32_HANDLER( pc_cga32le_w ) { write32le_with_write8_handler(pc_cga8_w, space, offset, data, mem_mask); } + + +/* Old plantronics rendering code, leaving it uncommented until we have re-implemented it */ + +// +// From choosevideomode: +// +// /* Plantronics high-res */ +// if ((cga.mode_control & 2) && (cga.plantronics & 0x20)) +// proc = cga_pgfx_2bpp; +// /* Plantronics low-res */ +// if ((cga.mode_control & 2) && (cga.plantronics & 0x10)) +// proc = cga_pgfx_4bpp; +// + +//INLINE void pgfx_plot_unit_4bpp(bitmap_ind16 &bitmap, +// int x, int y, int offs) +//{ +// int color, values[2]; +// int i; +// +// if (cga.plantronics & 0x40) +// { +// values[0] = videoram[offs | 0x4000]; +// values[1] = videoram[offs]; +// } +// else +// { +// values[0] = videoram[offs]; +// values[1] = videoram[offs | 0x4000]; +// } +// for (i=3; i>=0; i--) +// { +// color = ((values[0] & 0x3) << 1) | +// ((values[1] & 2) >> 1) | +// ((values[1] & 1) << 3); +// bitmap.pix16(y, x+i) = Machine->pens[color]; +// values[0]>>=2; +// values[1]>>=2; +// } +//} +// +// +// +///*************************************************************************** +// Draw graphics mode with 640x200 pixels (default) with 2 bits/pixel. +// Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +// Second plane at CGA_base + 0x4000 / 0x6000 +//***************************************************************************/ +// +//static void cga_pgfx_4bpp(bitmap_ind16 &bitmap, struct mscrtc6845 *crtc) +//{ +// int i, sx, sy, sh; +// int offs = mscrtc6845_get_start(crtc)*2; +// int lines = mscrtc6845_get_char_lines(crtc); +// int height = mscrtc6845_get_char_height(crtc); +// int columns = mscrtc6845_get_char_columns(crtc)*2; +// +// for (sy=0; sy=0; i--) +// { +// bmap[0] = bmap[0] << 1; if (values[0] & 0x80) bmap[0] |= 1; +// bmap[0] = bmap[0] << 1; if (values[1] & 0x80) bmap[0] |= 1; +// bmap[1] = bmap[1] << 1; if (values[0] & 0x08) bmap[1] |= 1; +// bmap[1] = bmap[1] << 1; if (values[1] & 0x08) bmap[1] |= 1; +// values[0] = values[0] << 1; +// values[1] = values[1] << 1; +// } +// +// dest = &bitmap.pix16(y, x); +// *(dest++) = palette[(bmap[0] >> 6) & 0x03]; +// *(dest++) = palette[(bmap[0] >> 4) & 0x03]; +// *(dest++) = palette[(bmap[0] >> 2) & 0x03]; +// *(dest++) = palette[(bmap[0] >> 0) & 0x03]; +// *(dest++) = palette[(bmap[1] >> 6) & 0x03]; +// *(dest++) = palette[(bmap[1] >> 4) & 0x03]; +// *(dest++) = palette[(bmap[1] >> 2) & 0x03]; +// *(dest++) = palette[(bmap[1] >> 0) & 0x03]; +//} +// +// +// +///*************************************************************************** +// Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. +// Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +// cga fetches 2 byte per mscrtc6845 access (not modeled here)! +//***************************************************************************/ +// +//static void cga_pgfx_2bpp(bitmap_ind16 &bitmap, struct mscrtc6845 *crtc) +//{ +// int i, sx, sy, sh; +// int offs = mscrtc6845_get_start(crtc)*2; +// int lines = mscrtc6845_get_char_lines(crtc); +// int height = mscrtc6845_get_char_height(crtc); +// int columns = mscrtc6845_get_char_columns(crtc)*2; +// int colorset = cga.color_select & 0x3F; +// const UINT16 *palette; +// +// /* Most chipsets use bit 2 of the mode control register to +// * access a third palette. But not consistently. */ +// pc_cga_check_palette(); +// switch(CGA_CHIPSET) +// { +// /* The IBM Professional Graphics Controller behaves like +// * the PC1512, btw. */ +// case CGA_CHIPSET_PC1512: +// if ((colorset < 32) && (cga.mode_control & 4)) colorset += 64; +// break; +// +// case CGA_CHIPSET_IBM: +// case CGA_CHIPSET_PC200: +// case CGA_CHIPSET_ATI: +// case CGA_CHIPSET_PARADISE: +// if (cga.mode_control & 4) colorset = (colorset & 0x1F) + 64; +// break; +// } +// +// +// /* The fact that our palette is located in cga_colortable is a vestigial +// * aspect from when we were doing that ugly trick where drawgfx() would +// * handle graphics drawing. Truthfully, we should probably be using +// * palette_set_color_rgb() here and not doing the palette lookup in the loop +// */ +// palette = &cga_colortable[256*2 + 16*2] + colorset * 4; +// +// for (sy=0; symachine(); + + if ( y == 0 ) CGA_LOG(1,"pc1512_gfx_4bpp_update_row",("\n")); + for ( j = 0; j < x_count; j++ ) + { + UINT16 offset = offset_base | ( ( ma + j ) & 0x1FFF ); + UINT16 i = ( cga.color_select & 8 ) ? videoram[ videoram_offset[3] | offset ] << 3 : 0; + UINT16 r = ( cga.color_select & 4 ) ? videoram[ videoram_offset[2] | offset ] << 2 : 0; + UINT16 g = ( cga.color_select & 2 ) ? videoram[ videoram_offset[1] | offset ] << 1 : 0; + UINT16 b = ( cga.color_select & 1 ) ? videoram[ videoram_offset[0] | offset ] : 0; + + *p = palette[( ( i & 0x400 ) | ( r & 0x200 ) | ( g & 0x100 ) | ( b & 0x80 ) ) >> 7]; p++; + *p = palette[( ( i & 0x200 ) | ( r & 0x100 ) | ( g & 0x080 ) | ( b & 0x40 ) ) >> 6]; p++; + *p = palette[( ( i & 0x100 ) | ( r & 0x080 ) | ( g & 0x040 ) | ( b & 0x20 ) ) >> 5]; p++; + *p = palette[( ( i & 0x080 ) | ( r & 0x040 ) | ( g & 0x020 ) | ( b & 0x10 ) ) >> 4]; p++; + *p = palette[( ( i & 0x040 ) | ( r & 0x020 ) | ( g & 0x010 ) | ( b & 0x08 ) ) >> 3]; p++; + *p = palette[( ( i & 0x020 ) | ( r & 0x010 ) | ( g & 0x008 ) | ( b & 0x04 ) ) >> 2]; p++; + *p = palette[( ( i & 0x010 ) | ( r & 0x008 ) | ( g & 0x004 ) | ( b & 0x02 ) ) >> 1]; p++; + *p = palette[ ( i & 0x008 ) | ( r & 0x004 ) | ( g & 0x002 ) | ( b & 0x01 ) ]; p++; + } +} + + +static WRITE8_HANDLER ( pc1512_w ) +{ + UINT8 *videoram = cga.videoram; + mc6845_device *mc6845 = space->machine().device(CGA_MC6845_NAME); + + switch (offset) + { + case 0: case 2: case 4: case 6: + data &= 0x1F; + mc6845->address_w( *space, offset, data ); + pc1512.mc6845_address = data; + break; + + case 1: case 3: case 5: case 7: + if ( ! pc1512.mc6845_locked_register[pc1512.mc6845_address] ) + { + mc6845->register_w( *space, offset, data ); + if ( mc6845_writeonce_register[pc1512.mc6845_address] ) + { + pc1512.mc6845_locked_register[pc1512.mc6845_address] = 1; + } + } + break; + + case 0x8: + /* Check if we're changing to graphics mode 2 */ + if ( ( cga.mode_control & 0x12 ) != 0x12 && ( data & 0x12 ) == 0x12 ) + { + pc1512.write = 0x0F; + } + else + { + memory_set_bankptr(space->machine(),"bank1", videoram + videoram_offset[0]); + } + cga.mode_control = data; + switch( cga.mode_control & 0x3F ) + { + case 0x08: case 0x09: case 0x0C: case 0x0D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_inten_update_row; + break; + case 0x0A: case 0x0B: case 0x2A: case 0x2B: + mc6845->set_hpixels_per_column( 8 ); + if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) + { + cga.update_row = cga_gfx_4bppl_update_row; + } + else + { + cga.update_row = cga_gfx_2bpp_update_row; + } + break; + case 0x0E: case 0x0F: case 0x2E: case 0x2F: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_gfx_2bpp_update_row; + break; + case 0x18: case 0x19: case 0x1C: case 0x1D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_inten_alt_update_row; + break; + case 0x1A: case 0x1B: case 0x3A: case 0x3B: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = pc1512_gfx_4bpp_update_row; + break; + case 0x1E: case 0x1F: case 0x3E: case 0x3F: + mc6845->set_hpixels_per_column( 16 ); + cga.update_row = cga_gfx_1bpp_update_row; + break; + case 0x28: case 0x29: case 0x2C: case 0x2D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_blink_update_row; + break; + case 0x38: case 0x39: case 0x3C: case 0x3D: + mc6845->set_hpixels_per_column( 8 ); + cga.update_row = cga_text_blink_alt_update_row; + break; + default: + cga.update_row = NULL; + break; + } + break; + + case 0xd: + pc1512.write = data; + break; + + case 0xe: + pc1512.read = data; + if ( ( cga.mode_control & 0x12 ) == 0x12 ) + { + memory_set_bankptr(space->machine(),"bank1", videoram + videoram_offset[data & 3]); + } + break; + + default: + pc_cga8_w(space, offset,data); + break; + } +} + +static READ8_HANDLER ( pc1512_r ) +{ + UINT8 data; + + switch (offset) + { + case 0xd: + data = pc1512.write; + break; + + case 0xe: + data = pc1512.read; + break; + + default: + data = pc_cga8_r(space, offset); + break; + } + return data; +} + + +static WRITE8_HANDLER ( pc1512_videoram_w ) +{ + UINT8 *videoram = cga.videoram; + if ( ( cga.mode_control & 0x12 ) == 0x12 ) + { + if (pc1512.write & 1) + videoram[offset+videoram_offset[0]] = data; /* blue plane */ + if (pc1512.write & 2) + videoram[offset+videoram_offset[1]] = data; /* green */ + if (pc1512.write & 4) + videoram[offset+videoram_offset[2]] = data; /* red */ + if (pc1512.write & 8) + videoram[offset+videoram_offset[3]] = data; /* intensity (text, 4color) */ + } + else + { + videoram[offset + videoram_offset[0]] = data; + } +} + + + +READ16_HANDLER ( pc1512_16le_r ) { return read16le_with_read8_handler(pc1512_r, space, offset, mem_mask); } +WRITE16_HANDLER ( pc1512_16le_w ) { write16le_with_write8_handler(pc1512_w, space, offset, data, mem_mask); } +WRITE16_HANDLER ( pc1512_videoram16le_w ) { write16le_with_write8_handler(pc1512_videoram_w, space, offset, data, mem_mask); } + + + +static VIDEO_START( pc1512 ) +{ + memset( &pc1512, 0, sizeof ( pc1512 ) ); + pc1512.write = 0xf; + pc1512.read = 0; + + /* PC1512 cut-down 6845 */ + internal_pc_cga_video_start(machine); + cga.videoram_size = 0x10000; + cga.videoram = auto_alloc_array(machine, UINT8, 0x10000 ); + + address_space *space = machine.firstcpu->memory().space( AS_PROGRAM ); + address_space *io_space = machine.firstcpu->memory().space( AS_IO ); + + space->install_read_bank( 0xb8000, 0xbbfff, 0, 0x0C000, "bank1" ); + memory_set_bankptr(machine, "bank1", cga.videoram + videoram_offset[0]); + space->install_legacy_write_handler( 0xb8000, 0xbbfff, 0, 0x0C000, FUNC(pc1512_videoram16le_w) ); + + io_space->install_legacy_read_handler( 0x3d0, 0x3df, FUNC(pc1512_16le_r) ); + io_space->install_legacy_write_handler( 0x3d0, 0x3df, FUNC(pc1512_16le_w) ); + +} + + +static SCREEN_UPDATE_RGB32( mc6845_pc1512 ) +{ + UINT8 *gfx = screen.machine().region("gfx1")->base(); + mc6845_device *mc6845 = screen.machine().device(CGA_MC6845_NAME); + mc6845->screen_update(screen, bitmap, cliprect); + + /* Check for changes in font dipsetting */ + switch ( CGA_FONT & 0x03 ) + { + case 0: + cga.chr_gen = gfx + 0x0000; + break; + case 1: + cga.chr_gen = gfx + 0x0800; + break; + case 2: + cga.chr_gen = gfx + 0x1000; + break; + case 3: + cga.chr_gen = gfx + 0x1800; + break; + } + + return 0; +} + + diff -Nru mame-0.144/src/emu/video/pc_cga.h mame-0.145/src/emu/video/pc_cga.h --- mame-0.144/src/emu/video/pc_cga.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/pc_cga.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,26 @@ +#include "emu.h" + +#define CGA_PALETTE_SETS 83 /* one for colour, one for mono, + * 81 for colour composite */ + +#define CGA_SCREEN_NAME "screen" +#define CGA_MC6845_NAME "mc6845_cga" + +MACHINE_CONFIG_EXTERN( pcvideo_cga ); +MACHINE_CONFIG_EXTERN( pcvideo_cga32k ); +INPUT_PORTS_EXTERN( pcvideo_cga ); +SCREEN_UPDATE_RGB32( mc6845_cga ); +VIDEO_START( pc_cga_superimpose ); + +/* has a special 640x200 in 16 color mode, 4 banks at 0xb8000 */ +MACHINE_CONFIG_EXTERN( pcvideo_pc1512 ); +INPUT_PORTS_EXTERN( pcvideo_pc1512 ); + + +/* Used in machine/pc.c */ +READ16_HANDLER( pc1512_16le_r ); +WRITE16_HANDLER( pc1512_16le_w ); +WRITE16_HANDLER( pc1512_videoram16le_w ); + +MACHINE_CONFIG_EXTERN( pcvideo_poisk2 ); + diff -Nru mame-0.144/src/emu/video/pc_vga.c mame-0.145/src/emu/video/pc_vga.c --- mame-0.144/src/emu/video/pc_vga.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/pc_vga.c 2012-02-06 21:30:27.000000000 +0000 @@ -16,6 +16,22 @@ ega/vga 64k (early ega 16k) words of 32 bit memory + TODO: + - modernize + - add emulated mc6845 hook-up + - fix video update. + - rewrite video drawing functions (they are horrible) + - add VESA etc. + - "System Information" UI currently crashes the emulation + - (and many more ...) + + per-game issues: + - The Incredible Machine: fix partial updates + - MAME 0.01: fix 92 Hz refresh rate bug (uses VESA register?). + - Bio Menace: jerky H scrolling (uses EGA mode) + - Virtual Pool: ET4k unrecognized; + - California Chase (calchase): init bug causes messed up chars at POST + (gfxs works if you soft reset). ROM declarations: @@ -37,112 +53,93 @@ ***************************************************************************/ -static pc_video_update_proc (*pc_choosevideomode)(running_machine &machine, int *width, int *height); - -static int pc_current_height; -static int pc_current_width; -/*************************************************************************** - - Static declarations - -***************************************************************************/ - -#define LOG_ACCESSES 0 -#define LOG_REGISTERS 0 - -static PALETTE_INIT( vga ); -static VIDEO_START( vga ); -static VIDEO_RESET( vga ); - -static pc_video_update_proc pc_vga_choosevideomode(running_machine &machine, int *width, int *height); - -/*************************************************************************** - - MachineDriver stuff - -***************************************************************************/ - -void pc_video_start(running_machine &machine, pc_video_update_proc (*choosevideomode)(running_machine &machine, int *width, int *height)) -{ - pc_choosevideomode = choosevideomode; - pc_current_height = -1; - pc_current_width = -1; -} - - - -SCREEN_UPDATE( pc_video ) -{ - UINT32 rc = 0; - int w = 0, h = 0; - pc_video_update_proc video_update = pc_choosevideomode(screen->machine(), &w, &h); - - if (video_update) - { - if ((pc_current_width != w) || (pc_current_height != h)) - { - int width = screen->width(); - int height = screen->height(); - - pc_current_width = w; - pc_current_height = h; - - if (pc_current_width > width) - pc_current_width = width; - if (pc_current_height > height) - pc_current_height = height; - - if ((pc_current_width > 100) && (pc_current_height > 100)) - screen->set_visible_area(0, pc_current_width-1, 0, pc_current_height-1); - - bitmap_fill(bitmap, cliprect, 0); - } - - video_update(bitmap); - } - return rc; -} -/***************************************************************************/ - -static PALETTE_INIT( vga ) -{ - int i; - for (i = 0; i < 0x100; i++) - palette_set_color_rgb(machine, i, 0, 0, 0); -} - static UINT8 color_bitplane_to_packed[4/*plane*/][8/*pixel*/][256]; static struct { - struct pc_vga_interface vga_intf; + read8_space_func read_dipswitch; struct pc_svga_interface svga_intf; UINT8 *memory; - UINT8 *fontdirty; - UINT16 pens[16]; /* the current 16 pens */ + UINT32 pens[16]; /* the current 16 pens */ UINT8 miscellaneous_output; UINT8 feature_control; - UINT16 line_compare; // for split-screen use. struct { UINT8 index; UINT8 *data; + UINT8 map_mask; + struct + { + UINT8 A, B; + }char_sel; } sequencer; + + /* An empty comment at the start of the line indicates that register is currently unused */ struct { UINT8 index; UINT8 *data; + UINT16 horz_total; + UINT16 horz_disp_end; +/**/ UINT8 horz_blank_start; +/**/ UINT8 horz_blank_end; +/**/ UINT8 horz_retrace_start; +/**/ UINT8 horz_retrace_skew; +/**/ UINT8 horz_retrace_end; +/**/ UINT8 disp_enable_skew; +/**/ UINT8 evra; + UINT16 vert_total; + UINT16 vert_disp_end; +/**/ UINT16 vert_retrace_start; +/**/ UINT8 vert_retrace_end; +/**/ UINT16 vert_blank_start; + UINT16 line_compare; +/**/ UINT16 cursor_addr; +/**/ UINT8 byte_panning; +/**/ UINT8 preset_row_scan; + UINT8 scan_doubling; +/**/ UINT8 maximum_scan_line; +/**/ UINT8 cursor_enable; +/**/ UINT8 cursor_scan_start; +/**/ UINT8 cursor_skew; +/**/ UINT8 cursor_scan_end; +/**/ UINT16 start_addr; +/**/ UINT8 protect_enable; +/**/ UINT8 bandwidth; +/**/ UINT8 offset; +/**/ UINT8 word_mode; +/**/ UINT8 dw; +/**/ UINT8 div4; +/**/ UINT8 underline_loc; +/**/ UINT8 vert_blank_end; + UINT8 sync_en; +/**/ UINT8 aw; +/**/ UINT8 div2; +/**/ UINT8 sldiv; +/**/ UINT8 map14; +/**/ UINT8 map13; } crtc; + struct { UINT8 index; UINT8 *data; UINT8 latch[4]; + UINT8 color_compare; + UINT8 read_map_sel; + UINT8 read_mode; + UINT8 write_mode; + UINT8 color_dont_care; } gc; - struct { UINT8 index, data[0x15]; int state; } attribute; + + struct + { + UINT8 index, data[0x15]; int state; + UINT8 prot_bit; + } attribute; struct { @@ -154,29 +151,20 @@ } dac; struct { - int time; - int visible; + UINT8 visible; } cursor; - struct { - int (*get_clock)(void); - - int (*get_lines)(void); - int (*get_sync_lines)(void); - - int (*get_columns)(void); - int (*get_sync_columns)(void); - - attotime start_time; - int retrace; - } monitor; - /* oak vga */ struct { UINT8 reg; } oak; - - int log; } vga; +static struct +{ + UINT8 bank_r,bank_w; + UINT8 rgb8_en; + UINT8 rgb15_en; + UINT8 id; +}svga; #define REG(x) vga.crtc.data[x] @@ -188,375 +176,797 @@ #define CRTC_CURSOR_TOP (REG(0xa)&0x1f) #define CRTC_CURSOR_BOTTOM REG(0xb) -#define DOUBLESCAN ((vga.crtc.data[9]&0x80)||((vga.crtc.data[9]&0x1f)!=0)) #define CRTC_PORT_ADDR ((vga.miscellaneous_output&1)?0x3d0:0x3b0) -#define CRTC_ON (vga.crtc.data[0x17]&0x80) - -#define LINES_HELPER ( (vga.crtc.data[0x12] \ - |((vga.crtc.data[7]&2)<<7) \ - |((vga.crtc.data[7]&0x40)<<3))+1 ) //#define TEXT_LINES (LINES_HELPER) -#define LINES (DOUBLESCAN?LINES_HELPER>>1:LINES_HELPER) -#define TEXT_LINES (LINES_HELPER >> ((vga.crtc.data[9]&0x80) ? 1 : 0)) +#define LINES (vga.crtc.vert_disp_end+1) +#define TEXT_LINES (vga.crtc.vert_disp_end+1) -#define GRAPHIC_MODE (vga.gc.data[6]&1) /* else textmodus */ +#define GRAPHIC_MODE (vga.gc.data[6]&1) /* else text mode */ -#define EGA_COLUMNS (vga.crtc.data[1]+1) -#define EGA_START_ADDRESS ((vga.crtc.data[0xd]|(vga.crtc.data[0xc]<<8))<<2) -#define EGA_LINE_LENGTH (vga.crtc.data[0x13]<<3) - -#define VGA_COLUMNS (EGA_COLUMNS>>1) -#define VGA_START_ADDRESS (EGA_START_ADDRESS) -#define VGA_LINE_LENGTH (EGA_LINE_LENGTH<<2) +#define EGA_COLUMNS (vga.crtc.horz_disp_end+1) +#define EGA_START_ADDRESS (vga.crtc.start_addr) +#define EGA_LINE_LENGTH (vga.crtc.offset<<1) + +#define VGA_COLUMNS (vga.crtc.horz_disp_end+1) +#define VGA_START_ADDRESS (vga.crtc.start_addr) +#define VGA_LINE_LENGTH (vga.crtc.offset<<3) #define CHAR_WIDTH ((vga.sequencer.data[1]&1)?8:9) -#define TEXT_COLUMNS (vga.crtc.data[1]+1) -#define TEXT_START_ADDRESS (EGA_START_ADDRESS) -#define TEXT_LINE_LENGTH (EGA_LINE_LENGTH>>2) +#define TEXT_COLUMNS (vga.crtc.horz_disp_end+1) +#define TEXT_START_ADDRESS (vga.crtc.start_addr<<3) +#define TEXT_LINE_LENGTH (vga.crtc.offset<<1) + +#define TEXT_COPY_9COLUMN(ch) (((ch & 0xe0) == 0xc0)&&(vga.attribute.data[0x10]&4)) + +// Special values for SVGA Trident - Mode Vesa 110h +#define TLINES (LINES) +#define TGA_COLUMNS (EGA_COLUMNS) +#define TGA_START_ADDRESS (vga.crtc.start_addr<<2) +#define TGA_LINE_LENGTH (vga.crtc.offset<<3) -#define TEXT_COPY_9COLUMN(ch) ((ch>=192)&&(ch<=223)&&(vga.attribute.data[0x10]&4)) - -#define FONT1 ( ((vga.sequencer.data[3]&0x3) |((vga.sequencer.data[3]&0x10)<<2))*0x2000 ) -#define FONT2 ( (((vga.sequencer.data[3]&0xc)>>2)|((vga.sequencer.data[3]&0x20)<<3))*0x2000 ) +/*************************************************************************** -INLINE UINT8 rotate_right(UINT8 val, UINT8 rot) -{ - return (val >> rot) | (val << (8 - rot)); -} + Static declarations +***************************************************************************/ +#define LOG_ACCESSES 0 +#define LOG_REGISTERS 0 -static int vga_get_clock(void) -{ - int clck=0; - switch(vga.miscellaneous_output&0xc) { - case 0: clck=25000000;break; - case 4: clck=28000000;break; - /* case 8: external */ - /* case 0xc: reserved */ - } - if (vga.sequencer.data[1]&8) clck/=2; - return clck; -} +static VIDEO_RESET( vga ); -static int vga_get_crtc_columns(void) /* in clocks! */ -{ - int columns=vga.crtc.data[0]+5; +/*************************************************************************** - if (!GRAPHIC_MODE) - columns *= CHAR_WIDTH; - else if (vga.gc.data[5]&0x40) - columns *= 4; - else - columns *= 8; + MachineDriver stuff - return columns; -} +***************************************************************************/ -static int vga_get_crtc_lines(void) +void pc_video_start(running_machine &machine) { - int lines=(vga.crtc.data[6] - |((vga.crtc.data[7]&1)<<8) - |((vga.crtc.data[7]&0x20)<<(8-4)))+2; + // ... - return lines; + // Avoid an infinite loop when displaying. 0 is not possible anyway. + vga.crtc.maximum_scan_line = 1; } -static int vga_get_crtc_sync_lines(void) +static void vga_vh_text(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return 10; -} - -static int vga_get_crtc_sync_columns(void) -{ - return 40; -} + UINT8 ch, attr; + UINT8 bits; + UINT32 font_base; + UINT32 *bitmapline; + int width=CHAR_WIDTH, height=CRTC_CHAR_HEIGHT * (vga.crtc.scan_doubling + 1); + int pos, line, column, mask, w, h, addr; + UINT8 blink_en,fore_col,back_col; + pen_t pen; -INLINE WRITE8_HANDLER(vga_dirty_w) -{ - vga.memory[offset] = data; -} + if(vga.crtc.cursor_enable) + vga.cursor.visible = machine.primary_screen->frame_number() & 0x10; + else + vga.cursor.visible = 0; -INLINE WRITE8_HANDLER(vga_dirty_font_w) -{ - if (vga.memory[offset] != data) + for (addr = vga.crtc.start_addr, line = -CRTC_SKEW; line < TEXT_LINES; + line += height, addr += TEXT_LINE_LENGTH) { - vga.memory[offset] = data; - if ((offset&3)==2) - vga.fontdirty[offset>>7]=1; - } -} - -static READ8_HANDLER(vga_text_r) -{ - int data; - data=vga.memory[((offset&~1)<<1)|(offset&1)]; - - return data; -} - -static WRITE8_HANDLER(vga_text_w) -{ - vga_dirty_w(space, ((offset&~1)<<1)|(offset&1),data); -} + for (pos = addr, column=0; columnframe_number() & 0x20) ? attr & 0x80 : 0; + + fore_col = attr & 0xf; + back_col = (attr & 0x70) >> 4; + back_col |= (vga.attribute.data[0x10]&8) ? 0 : ((attr & 0x80) >> 4); -INLINE UINT8 ega_bitplane_to_packed(UINT8 *latch, int number) -{ - return color_bitplane_to_packed[0][number][latch[0]] - |color_bitplane_to_packed[1][number][latch[1]] - |color_bitplane_to_packed[2][number][latch[2]] - |color_bitplane_to_packed[3][number][latch[3]]; -} + for (h = MAX(-line, 0); (h < height) && (line+h < MIN(TEXT_LINES, bitmap.height())); h++) + { + bitmapline = &bitmap.pix32(line+h); + bits = vga.memory[font_base+(h>>(vga.crtc.scan_doubling))]; -static READ8_HANDLER(vga_ega_r) -{ - int data; - vga.gc.latch[0]=vga.memory[(offset<<2)]; - vga.gc.latch[1]=vga.memory[(offset<<2)+1]; - vga.gc.latch[2]=vga.memory[(offset<<2)+2]; - vga.gc.latch[3]=vga.memory[(offset<<2)+3]; - if (vga.gc.data[5]&8) { - data=0; - if (!(ega_bitplane_to_packed(vga.gc.latch, 0)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=1; - if (!(ega_bitplane_to_packed(vga.gc.latch, 1)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=2; - if (!(ega_bitplane_to_packed(vga.gc.latch, 2)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=4; - if (!(ega_bitplane_to_packed(vga.gc.latch, 3)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=8; - if (!(ega_bitplane_to_packed(vga.gc.latch, 4)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=0x10; - if (!(ega_bitplane_to_packed(vga.gc.latch, 5)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=0x20; - if (!(ega_bitplane_to_packed(vga.gc.latch, 6)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=0x40; - if (!(ega_bitplane_to_packed(vga.gc.latch, 7)^(vga.gc.data[2]&0xf&~vga.gc.data[7]))) data|=0x80; - } else { - data=vga.gc.latch[vga.gc.data[4]&3]; - } + for (mask=0x80, w=0; (w>=1) + { + if (bits&mask) + pen = vga.pens[blink_en ? back_col : fore_col]; + else + pen = vga.pens[back_col]; - return data; -} + if(!machine.primary_screen->visible_area().contains(column*width+w, line+h)) + continue; + bitmapline[column*width+w] = pen; -INLINE UINT8 vga_latch_helper(UINT8 cpu, UINT8 latch, UINT8 mask) -{ - switch (vga.gc.data[3] & 0x18) - { - case 0x00: - return rotate_right((cpu&mask)|(latch&~mask), vga.gc.data[3] & 0x07); - case 0x08: - return rotate_right(((cpu&latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); - case 0x10: - return rotate_right(((cpu|latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); - case 0x18: - return rotate_right(((cpu^latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); - } - return 0; /* must not be reached, suppress compiler warning */ -} + } + if (wvisible_area().contains(column*width+w, line+h)) + continue; + bitmapline[column*width+w] = pen; + } + } + if ((CRTC_CURSOR_MODE!=CRTC_CURSOR_OFF) + &&vga.cursor.visible&&(pos==CRTC_CURSOR_POS)) + { + for (h=CRTC_CURSOR_TOP; + (h<=CRTC_CURSOR_BOTTOM)&&(hvisible_area().contains(column*width, line+h)) + continue; + bitmap.plot_box(column*width, line+h, width, 1, vga.pens[attr&0xf]); + } + } } - break; } - return 0; /* must not be reached, suppress compiler warning */ } -static WRITE8_HANDLER(vga_ega_w) +static void vga_vh_ega(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - if (vga.sequencer.data[2]&1) - vga_dirty_w(space, offset<<2, vga_latch_write(0,data)); - if (vga.sequencer.data[2]&2) - vga_dirty_w(space, (offset<<2)+1, vga_latch_write(1,data)); - if (vga.sequencer.data[2]&4) - vga_dirty_font_w(space, (offset<<2)+2, vga_latch_write(2,data)); - if (vga.sequencer.data[2]&8) - vga_dirty_w(space, (offset<<2)+3, vga_latch_write(3,data)); - if ((offset==0xffff)&&(data==0)) vga.log=1; -} + int pos, line, column, c, addr, i, yi; + int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); + UINT32 *bitmapline; + pen_t pen; -static READ8_HANDLER(vga_vga_r) -{ - int data; - data=vga.memory[((offset&~3)<<2)|(offset&3)]; + for (addr=EGA_START_ADDRESS, pos=0, line=0; line= 0; i--) + { + pen = vga.pens[(data[0]&1) | (data[1]&2) | (data[2]&4) | (data[3]&8)]; + if(!machine.primary_screen->visible_area().contains(c+i, line + yi)) + continue; + bitmapline[c+i] = pen; + + data[0]>>=1; + data[1]>>=1; + data[2]>>=1; + data[3]>>=1; + } + } + } + } } -static void vga_cpu_interface(running_machine &machine) +/* TODO: I'm guessing that in 256 colors mode every pixel actually outputs two pixels. Is it right? */ +static void vga_vh_vga(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - address_space *space = machine.firstcpu->memory().space(AS_PROGRAM); - static int sequencer, gc; - read8_space_func read_handler; const char *read_handler_name; - write8_space_func write_handler; const char *write_handler_name; - UINT8 sel; - int buswidth; - UINT64 mask = 0; - - if ((gc==vga.gc.data[6])&&(sequencer==vga.sequencer.data[4])) return; - - gc=vga.gc.data[6]; - sequencer=vga.sequencer.data[4]; - - if (vga.sequencer.data[4]&8) - { - read_handler = vga_vga_r; read_handler_name = "vga_vga_r"; - write_handler = vga_vga_w; write_handler_name = "vga_vga_w"; - } - else if (vga.sequencer.data[4] & 4) - { - read_handler = vga_ega_r; read_handler_name = "vga_ega_r"; - write_handler = vga_ega_w; write_handler_name = "vga_ega_w"; - } - else - { - read_handler = vga_text_r; read_handler_name = "vga_text_r"; - write_handler = vga_text_w; write_handler_name = "vga_text_w"; - } + int pos, line, column, c, addr, curr_addr; + UINT32 *bitmapline; + UINT16 mask_comp; + int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); + int yi; + int xi; - /* remap the VGA memory */ + /* line compare is screen sensitive */ + mask_comp = 0x0ff | (LINES & 0x300); - if (vga.vga_intf.map_vga_memory) + curr_addr = 0; + if(!(vga.sequencer.data[4] & 0x08)) { - sel = vga.gc.data[6] & 0x0c; - switch(sel) + for (addr = VGA_START_ADDRESS, line=0; line 0x80000/4) + return; + + for(xi=0;xi<8;xi++) + { + if(!machine.primary_screen->visible_area().contains(c+xi, line + yi)) + continue; + bitmapline[c+xi] = machine.pens[vga.memory[pos+((xi >> 1)*0x20000)]]; + } } - break; - case 0x04: - vga.vga_intf.map_vga_memory(machine, 0xA0000, 0xAFFFF, read_handler, read_handler_name, write_handler, write_handler_name); - break; - case 0x08: - vga.vga_intf.map_vga_memory(machine, 0xB0000, 0xB7FFF, read_handler, read_handler_name, write_handler, write_handler_name); - break; - case 0x0C: - vga.vga_intf.map_vga_memory(machine, 0xB8000, 0xBFFFF, read_handler, read_handler_name, write_handler, write_handler_name); - break; + } } } else { - buswidth = downcast(machine.firstcpu)->space_config(AS_PROGRAM)->m_databus_width; - switch(buswidth) + for (addr = VGA_START_ADDRESS, line=0; line 0x80000) + return; - case 16: - mask = 0xffff; - break; + for(xi=0;xi<0x10;xi++) + { + if(!machine.primary_screen->visible_area().contains(c+xi, line + yi)) + continue; + bitmapline[c+xi] = machine.pens[vga.memory[pos+(xi >> 1)]]; + } + } + } + } + } +} - case 32: - mask = 0xffffffff; - break; +static void vga_vh_cga(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + UINT32 *bitmapline; + int height = (vga.crtc.scan_doubling + 1); + int x,xi,y,yi; + UINT32 addr; + pen_t pen; + int width; - case 64: - mask = -1; - break; + addr = 0; + width = (vga.crtc.horz_disp_end + 1) * 8; - default: - fatalerror("VGA: Bus width %d not supported", buswidth); - break; - } + for(y=0;y> 1) * width/4); - sel = vga.gc.data[6] & 0x0c; - if (sel) - { - if (sel == 0x04) space->install_legacy_read_handler(0xa0000, 0xaffff, read_handler, read_handler_name, mask); else space->nop_read(0xa0000, 0xaffff); - if (sel == 0x08) space->install_legacy_read_handler(0xb0000, 0xb7fff, read_handler, read_handler_name, mask); else space->nop_read(0xb0000, 0xb7fff); - if (sel == 0x0C) space->install_legacy_read_handler(0xb8000, 0xbffff, read_handler, read_handler_name, mask); else space->nop_read(0xb8000, 0xbffff); - if (sel == 0x04) space->install_legacy_write_handler(0xa0000, 0xaffff, write_handler, write_handler_name, mask); else space->nop_write(0xa0000, 0xaffff); - if (sel == 0x08) space->install_legacy_write_handler(0xb0000, 0xb7fff, write_handler, write_handler_name, mask); else space->nop_write(0xb0000, 0xb7fff); - if (sel == 0x0C) space->install_legacy_write_handler(0xb8000, 0xbffff, write_handler, write_handler_name, mask); else space->nop_write(0xb8000, 0xbffff); - } - else + for(x=0;xinstall_read_bank(0xa0000, 0xbffff, "bank1" ); - space->install_write_bank(0xa0000, 0xbffff, "bank1" ); - } + for(yi=0;yi> (6-xi*2)) & 3]; + if(!machine.primary_screen->visible_area().contains(x+xi, y * height + yi)) + continue; + bitmapline[x+xi] = pen; + } + } + addr++; + } } } -static READ8_HANDLER(vga_crtc_r) +static void vga_vh_mono(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - UINT8 data = 0xff; + UINT32 *bitmapline; + int height = (vga.crtc.scan_doubling + 1); + int x,xi,y,yi; + UINT32 addr; + pen_t pen; + int width; - switch (offset) { - case 4: - data = vga.crtc.index; - break; - case 5: - if (vga.crtc.index < vga.svga_intf.crtc_regcount) - data = vga.crtc.data[vga.crtc.index]; - break; - case 0xa: - vga.attribute.state = 0; - data = 0;/*4; */ -#if 0 /* slow */ + addr = 0; + width = (vga.crtc.horz_disp_end + 1) * 8; + + for(y=0;y> 1) * width/8); + + for(x=0;x> (7-xi)) & 1]; + if(!machine.primary_screen->visible_area().contains(x+xi, y * height + yi)) + continue; + bitmapline[x+xi] = pen; + } + } + + addr++; + } + } +} + +static void svga_vh_rgb8(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + int pos, line, column, c, addr, curr_addr; + UINT32 *bitmapline; + UINT16 mask_comp; + int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); + int yi; + int xi; + + /* line compare is screen sensitive */ + mask_comp = 0x3ff; + + curr_addr = 0; + for (addr = VGA_START_ADDRESS, line=0; line 0x100000) + return; + + for(xi=0;xi<8;xi++) + { + if(!machine.primary_screen->visible_area().contains(c+xi, line + yi)) + continue; + bitmapline[c+xi] = machine.pens[vga.memory[(pos+(xi))]]; + } + } + } + } +} + +static void svga_vh_rgb15(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + #define MV(x) (vga.memory[x]+(vga.memory[x+1]<<8)) + #define IV 0xff000000 + int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1); + int xi; + int yi; + int xm; + + int pos, line, column, c, addr, curr_addr; + + UINT32 *bitmapline; +// UINT16 mask_comp; + + /* line compare is screen sensitive */ +// mask_comp = 0xff | (TLINES & 0x300); + curr_addr = 0; + yi=0; + for (addr = TGA_START_ADDRESS, line=0; line500) return; + bitmapline = &bitmap.pix32(line); + addr %= vga.svga_intf.vram_size; + for (pos=addr, c=0, column=0; column vga.svga_intf.vram_size) + return; + for(xi=0,xm=0;xi<8;xi++,xm+=2) + { + if(!machine.primary_screen->visible_area().contains(c+xi, line + yi)) + continue; + bitmapline[c+xi] = IV|(MV(pos+xm)&0x7c00)<<9 |(MV(pos+xm)&0x3e0)<<6|(MV(pos+xm)&0x1f)<<3; + } + } + } +} + +enum +{ + SCREEN_OFF = 0, + TEXT_MODE, + VGA_MODE, + EGA_MODE, + CGA_MODE, + MONO_MODE, + RGB8_MODE, + RGB15_MODE, + SVGA_HACK +}; + + +static UINT8 pc_vga_choosevideomode(running_machine &machine) +{ + int i; + + if (vga.crtc.sync_en) + { + if (vga.dac.dirty) + { + for (i=0; i<256;i++) + { + palette_set_color_rgb(machine, i,(vga.dac.color[i].red & 0x3f) << 2, + (vga.dac.color[i].green & 0x3f) << 2, + (vga.dac.color[i].blue & 0x3f) << 2); + } + vga.dac.dirty = 0; + } + + if (vga.attribute.data[0x10] & 0x80) { - int clock=vga.monitor.get_clock(); - int lines=vga.monitor.get_lines(); - int columns=vga.monitor.get_columns(); - int diff = (((space->machine().time() - vga.monitor.start_time) * clock).seconds) - %(lines*columns); - if (diffmachine().time() - vga.monitor.start_time) > attotime::from_usec(300)) + for (i=0; i<16;i++) { - data |= 8; - vga.monitor.retrace=0; + vga.pens[i]=machine.pens[(vga.attribute.data[i]&0x3f) + |((vga.attribute.data[0x14]&0xc)<<4)]; } } + + if (vga.svga_intf.choosevideomode) // TODO: remove this hack + { + return SVGA_HACK; + } + else if (svga.rgb8_en) + { + return RGB8_MODE; + } + else if (svga.rgb15_en&0x30) + { + return RGB15_MODE; + } + else if (!GRAPHIC_MODE) + { + //proc = vga_vh_text; + //*height = TEXT_LINES; + //*width = TEXT_COLUMNS * CHAR_WIDTH; + + return TEXT_MODE; + } + else if (vga.gc.data[5]&0x40) + { + //proc = vga_vh_vga; + //*height = LINES; + //*width = VGA_COLUMNS * 8; + return VGA_MODE; + } + else if (vga.gc.data[5]&0x20) + { + // cga + return CGA_MODE; + } + else if ((vga.gc.data[6]&0x0c) == 0x0c) + { + // mono + return MONO_MODE; + } else { - if ((space->machine().time() - vga.monitor.start_time) > attotime::from_msec(15)) - vga.monitor.retrace=1; - vga.monitor.start_time=space->machine().time(); - } -#else - // not working with ps2m30 - if (vga.monitor.retrace) data|=9; - vga.monitor.retrace=0; + //proc = vga_vh_ega; + //*height = LINES; + //*width = EGA_COLUMNS * 8; + return EGA_MODE; + } + } + + return SCREEN_OFF; +} + +SCREEN_UPDATE_RGB32( pc_video ) +{ + UINT8 cur_mode = 0; + int w = 0, h = 0; + + cur_mode = pc_vga_choosevideomode(screen.machine()); + + //popmessage("%02x",cur_mode); + + switch(cur_mode) + { + case SCREEN_OFF: bitmap.fill(get_black_pen(screen.machine()), cliprect);break; + case TEXT_MODE: vga_vh_text(screen.machine(), bitmap, cliprect); break; + case VGA_MODE: vga_vh_vga (screen.machine(), bitmap, cliprect); break; + case EGA_MODE: vga_vh_ega (screen.machine(), bitmap, cliprect); break; + case CGA_MODE: vga_vh_cga (screen.machine(), bitmap, cliprect); break; + case MONO_MODE: vga_vh_mono(screen.machine(), bitmap, cliprect); break; + case RGB8_MODE: svga_vh_rgb8(screen.machine(), bitmap, cliprect); break; + case RGB15_MODE: svga_vh_rgb15(screen.machine(), bitmap, cliprect); break; + case SVGA_HACK: vga.svga_intf.choosevideomode(screen.machine(), bitmap, cliprect, vga.sequencer.data, vga.crtc.data, vga.gc.data, &w, &h); break; + } + + return 0; +} +/***************************************************************************/ + +INLINE UINT8 rotate_right(UINT8 val, UINT8 rot) +{ + return (val >> rot) | (val << (8 - rot)); +} + +INLINE UINT8 ega_bitplane_to_packed(UINT8 *latch, int number) +{ + return color_bitplane_to_packed[0][number][latch[0]] + |color_bitplane_to_packed[1][number][latch[1]] + |color_bitplane_to_packed[2][number][latch[2]] + |color_bitplane_to_packed[3][number][latch[3]]; +} + +INLINE UINT8 vga_latch_helper(UINT8 cpu, UINT8 latch, UINT8 mask) +{ + switch (vga.gc.data[3] & 0x18) + { + case 0x00: + return rotate_right((cpu&mask)|(latch&~mask), vga.gc.data[3] & 0x07); + case 0x08: + return rotate_right(((cpu&latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); + case 0x10: + return rotate_right(((cpu|latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); + case 0x18: + return rotate_right(((cpu^latch)&mask)|(latch&~mask), vga.gc.data[3] & 0x07); + } + return 0; /* must not be reached, suppress compiler warning */ +} + +INLINE UINT8 vga_latch_write(int offs, UINT8 data) +{ + switch (vga.gc.data[5]&3) { + case 0: + if (vga.gc.data[1]&(1<> 3) + 1); + + refresh = HZ_TO_ATTOSECONDS(pixel_clock) * (hblank_period) * vblank_period; + + machine.primary_screen->configure((hblank_period), (vblank_period), visarea, refresh ); +// popmessage("%d %d\n",vga.crtc.horz_total * 8,vga.crtc.vert_total); +} + +static void crtc_reg_write(running_machine &machine, UINT8 index, UINT8 data) +{ + /* Doom does this */ +// if(vga.crtc.protect_enable && index <= 0x07) +// printf("write to protected address %02x\n",index); + + switch(index) + { + case 0x00: + vga.crtc.horz_total = (data & 0xff); + recompute_params(machine); + break; + case 0x01: + vga.crtc.horz_disp_end = (data & 0xff); + recompute_params(machine); + break; + case 0x02: vga.crtc.horz_blank_start = (data & 0xff); break; + case 0x03: + vga.crtc.horz_blank_end &= ~0x1f; + vga.crtc.horz_blank_end |= data & 0x1f; + vga.crtc.disp_enable_skew = (data & 0x60) >> 5; + vga.crtc.evra = (data & 0x80) >> 7; + break; + case 0x04: + vga.crtc.horz_retrace_start = data & 0xff; + break; + case 0x05: + vga.crtc.horz_blank_end &= ~0x20; + vga.crtc.horz_blank_end |= ((data & 0x80) >> 2); + vga.crtc.horz_retrace_skew = ((data & 0x60) >> 5); + vga.crtc.horz_retrace_end = data & 0x1f; + break; + case 0x06: + vga.crtc.vert_total &= ~0xff; + vga.crtc.vert_total |= data & 0xff; + recompute_params(machine); + break; + case 0x07: // Overflow Register + vga.crtc.vert_total &= ~0x300; + vga.crtc.vert_retrace_start &= ~0x300; + vga.crtc.vert_disp_end &= ~0x300; + vga.crtc.line_compare &= ~0x100; + vga.crtc.vert_blank_start &= ~0x100; + vga.crtc.vert_retrace_start |= ((data & 0x80) << (9-7)); + vga.crtc.vert_disp_end |= ((data & 0x40) << (9-6)); + vga.crtc.vert_total |= ((data & 0x20) << (9-5)); + vga.crtc.line_compare |= ((data & 0x10) << (8-4)); + vga.crtc.vert_blank_start |= ((data & 0x08) << (8-3)); + vga.crtc.vert_retrace_start |= ((data & 0x04) << (8-2)); + vga.crtc.vert_disp_end |= ((data & 0x02) << (8-1)); + vga.crtc.vert_total |= ((data & 0x01) << (8-0)); + recompute_params(machine); + break; + case 0x08: // Preset Row Scan Register + vga.crtc.byte_panning = (data & 0x60) >> 5; + vga.crtc.preset_row_scan = (data & 0x1f); + break; + case 0x09: // Maximum Scan Line Register + vga.crtc.line_compare &= ~0x200; + vga.crtc.vert_blank_start &= ~0x200; + vga.crtc.scan_doubling = ((data & 0x80) >> 7); + vga.crtc.line_compare |= ((data & 0x40) << (9-6)); + vga.crtc.vert_blank_start |= ((data & 0x20) << (9-5)); + vga.crtc.maximum_scan_line = (data & 0x1f) + 1; + break; + case 0x0a: + vga.crtc.cursor_enable = ((data & 0x20) ^ 0x20) >> 5; + vga.crtc.cursor_scan_start = data & 0x1f; + break; + case 0x0b: + vga.crtc.cursor_skew = (data & 0x60) >> 5; + vga.crtc.cursor_scan_end = data & 0x1f; + break; + case 0x0c: + case 0x0d: + vga.crtc.start_addr &= ~(0xff << (((index & 1)^1) * 8)); + vga.crtc.start_addr |= (data << (((index & 1)^1) * 8)); + break; + case 0x0e: + case 0x0f: + vga.crtc.cursor_addr &= ~(0xff << (((index & 1)^1) * 8)); + vga.crtc.cursor_addr |= (data << (((index & 1)^1) * 8)); + break; + case 0x10: + vga.crtc.vert_retrace_start &= ~0xff; + vga.crtc.vert_retrace_start |= data & 0xff; + break; + case 0x11: + vga.crtc.protect_enable = (data & 0x80) >> 7; + vga.crtc.bandwidth = (data & 0x40) >> 6; + vga.crtc.vert_retrace_end = data & 0x0f; + break; + case 0x12: + vga.crtc.vert_disp_end &= ~0xff; + vga.crtc.vert_disp_end |= data & 0xff; + recompute_params(machine); + break; + case 0x13: + vga.crtc.offset = data & 0xff; + break; + case 0x14: + vga.crtc.dw = (data & 0x40) >> 6; + vga.crtc.div4 = (data & 0x20) >> 5; + vga.crtc.underline_loc = (data & 0x1f); + break; + case 0x15: + vga.crtc.vert_blank_start &= ~0xff; + vga.crtc.vert_blank_start |= data & 0xff; + break; + case 0x16: + vga.crtc.vert_blank_end = data & 0x7f; + break; + case 0x17: + vga.crtc.sync_en = (data & 0x80) >> 7; + vga.crtc.word_mode = (data & 0x40) >> 6; + vga.crtc.aw = (data & 0x20) >> 5; + vga.crtc.div2 = (data & 0x08) >> 3; + vga.crtc.sldiv = (data & 0x04) >> 2; + vga.crtc.map14 = (data & 0x02) >> 1; + vga.crtc.map13 = (data & 0x01) >> 0; + break; + case 0x18: + vga.crtc.line_compare &= ~0xff; + vga.crtc.line_compare |= data & 0xff; + break; + default: + //printf("Unhandled CRTC reg w %02x %02x\n",index,data); + break; + } +} + +static void seq_reg_write(running_machine &machine, UINT8 index, UINT8 data) +{ + switch(index) + { + case 0x02: + vga.sequencer.map_mask = data & 0xf; + break; + case 0x03: + /* --2- 84-- character select A + ---2 --84 character select B */ + vga.sequencer.char_sel.A = (((data & 0xc) >> 2)<<1) | ((data & 0x20) >> 5); + vga.sequencer.char_sel.B = (((data & 0x3) >> 0)<<1) | ((data & 0x10) >> 4); + if(data) + popmessage("Char SEL checker, contact MAMEdev (%02x %02x)\n",vga.sequencer.char_sel.A,vga.sequencer.char_sel.B); + break; + } +} + +static READ8_HANDLER(vga_crtc_r) +{ + UINT8 data = 0xff; + + switch (offset) { + case 4: + data = vga.crtc.index; + break; + case 5: + if (vga.crtc.index < vga.svga_intf.crtc_regcount) + data = vga.crtc.data[vga.crtc.index]; + break; + case 0xa: + UINT8 hsync,vsync; + vga.attribute.state = 0; + data = 0; + + hsync = space->machine().primary_screen->hblank() & 1; + vsync = space->machine().primary_screen->vblank() & 1; + + data |= (hsync | vsync) & 1; // DD - display disable register + data |= (vsync & 1) << 3; // VRetrace register + /* ega diagnostic readback enough for oak bios */ switch (vga.attribute.data[0x12]&0x30) { case 0: @@ -605,10 +1015,16 @@ (vga.crtc.index < vga.svga_intf.crtc_regcount) ? "" : "?", data); } - if(vga.crtc.index == 0x18 || vga.crtc.index == 0x07 || vga.crtc.index == 0x19 ) // Line compare - vga.line_compare = (((vga.crtc.data[0x09] & 0x40) << 3) | ((vga.crtc.data[0x07] & 0x10) << 4) | vga.crtc.data[0x18])/2; + if (vga.crtc.index < vga.svga_intf.crtc_regcount) vga.crtc.data[vga.crtc.index] = data; + + crtc_reg_write(space->machine(),vga.crtc.index,data); + //space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); + #if 0 + if((vga.crtc.index & 0xfe) != 0x0e) + printf("%02x %02x %d\n",vga.crtc.index,data,space->machine().primary_screen->vpos()); + #endif break; } } @@ -629,36 +1045,35 @@ switch (offset) { + case 0: + data = vga.attribute.index; + break; case 1: - if (vga.attribute.state==0) - { - data = vga.attribute.index; - } - else - { - if ((vga.attribute.index&0x1f)>2)&3) { case 3: - if (vga.vga_intf.read_dipswitch && vga.vga_intf.read_dipswitch(space, 0) & 0x01) + if (vga.read_dipswitch && vga.read_dipswitch(space, 0) & 0x01) data |= 0x10; break; case 2: - if (vga.vga_intf.read_dipswitch && vga.vga_intf.read_dipswitch(space, 0) & 0x02) + if (vga.read_dipswitch && vga.read_dipswitch(space, 0) & 0x02) data |= 0x10; break; case 1: - if (vga.vga_intf.read_dipswitch && vga.vga_intf.read_dipswitch(space, 0) & 0x04) + if (vga.read_dipswitch && vga.read_dipswitch(space, 0) & 0x04) data |= 0x10; break; case 0: - if (vga.vga_intf.read_dipswitch && vga.vga_intf.read_dipswitch(space, 0) & 0x08) + if (vga.read_dipswitch && vga.read_dipswitch(space, 0) & 0x08) data |= 0x10; break; } @@ -682,10 +1097,7 @@ break; case 7: - if (vga.dac.read) - data = 0; - else - data = 3; + data = (vga.dac.read) ? 3 : 0; break; case 8: @@ -741,6 +1153,12 @@ UINT8 data = 0xff; if (CRTC_PORT_ADDR == 0x3d0) data = vga_crtc_r(space, offset); + if(offset == 8) + { + logerror("VGA: 0x3d8 read at %08x\n",cpu_get_pc(&space->device())); + data = 0; // TODO: PC-200 reads back CGA register here, everything else returns open bus OR CGA emulation of register 0x3d8 + } + return data; } @@ -753,26 +1171,66 @@ vga_crtc_w(space, offset, data); } -WRITE8_HANDLER(vga_port_03c0_w) +static void attribute_reg_write(UINT8 index, UINT8 data) { - if (LOG_ACCESSES) - logerror("vga_port_03c0_w(): port=0x%04x data=0x%02x\n", offset + 0x3c0, data); - - switch (offset) { - case 0: - if (vga.attribute.state==0) + if((index & 0x30) == 0) + { + vga.attribute.data[index & 0x1f] = data & 0x3f; + } + else + { + switch(index & 0x1f) + { + /* TODO: intentional dirtiness, variable names to be properly changed */ + case 0x10: vga.attribute.data[0x10] = data; break; + case 0x11: vga.attribute.data[0x11] = data; break; + case 0x12: vga.attribute.data[0x12] = data; break; + case 0x13: vga.attribute.data[0x13] = data; break; + case 0x14: vga.attribute.data[0x14] = data; break; + } + } +} + +static void gc_reg_write(running_machine &machine,UINT8 index,UINT8 data) +{ + switch(index) + { + case 0x02: + vga.gc.color_compare = data & 0xf; + break; + case 0x04: + vga.gc.read_map_sel = data & 3; + break; + case 0x05: + vga.gc.read_mode = (data & 8) >> 3; + vga.gc.write_mode = data & 3; + break; + case 0x07: + vga.gc.color_dont_care = data & 0xf; + break; + } +} + +WRITE8_HANDLER(vga_port_03c0_w) +{ + if (LOG_ACCESSES) + logerror("vga_port_03c0_w(): port=0x%04x data=0x%02x\n", offset + 0x3c0, data); + + switch (offset) { + case 0: + if (vga.attribute.state==0) { vga.attribute.index=data; } else { - if ((vga.attribute.index&0x1f)machine()); break; case 3: vga.oak.reg = data; @@ -791,11 +1249,10 @@ if (vga.sequencer.index < vga.svga_intf.seq_regcount) { vga.sequencer.data[vga.sequencer.index] = data; - vga_cpu_interface(space->machine()); - - if (vga.sequencer.index == 0) - vga.monitor.start_time = space->machine().time(); } + + seq_reg_write(space->machine(),vga.sequencer.index,data); + recompute_params(space->machine()); break; case 6: vga.dac.mask=data; @@ -827,18 +1284,6 @@ vga.dac.dirty=1; if (vga.dac.state==3) { vga.dac.state=0; vga.dac.write_index++; -#if 0 - if (vga.dac.write_index==64) { - int i; - mame_printf_debug("start palette\n"); - for (i=0;i<64;i++) { - mame_printf_debug(" 0x%.2x, 0x%.2x, 0x%.2x,\n", - vga.dac.color[i].red*4, - vga.dac.color[i].green*4, - vga.dac.color[i].blue*4); - } - } -#endif } } break; @@ -856,8 +1301,9 @@ if (vga.gc.index < vga.svga_intf.gc_regcount) { vga.gc.data[vga.gc.index] = data; - vga_cpu_interface(space->machine()); } + + gc_reg_write(space->machine(),vga.gc.index,data); break; } } @@ -889,30 +1335,132 @@ memset(&vga.attribute, 0, sizeof(vga.attribute)); memset(&vga.dac, 0, sizeof(vga.dac)); memset(&vga.cursor, 0, sizeof(vga.cursor)); - memset(&vga.monitor, 0, sizeof(vga.monitor)); memset(&vga.oak, 0, sizeof(vga.oak)); - vga.log = 0; vga.gc.data[6] = 0xc; /* prevent xtbios excepting vga ram as system ram */ /* amstrad pc1640 bios relies on the position of the video memory area, so I introduced the reset to switch to b8000 area */ vga.sequencer.data[4] = 0; - vga_cpu_interface(machine); - vga.line_compare = 0x3ff; - // set CRTC register to match the line compare value - vga.crtc.data[0x18] = vga.line_compare & 0xff; - if(vga.line_compare & 0x100) - vga.crtc.data[0x07] |= 0x10; - if(vga.line_compare & 0x200) - vga.crtc.data[0x09] |= 0x40; + /* TODO: real defaults */ + vga.crtc.line_compare = 0x3ff; +} + +READ8_HANDLER(vga_mem_r) +{ + /* TODO: check me */ + switch((vga.gc.data[6] >> 2) & 0x03) + { + case 0: break; + case 1: offset &= 0x0ffff; break; + case 2: offset -= 0x10000; offset &= 0x07fff; break; + case 3: offset -= 0x18000; offset &= 0x07fff; break; + } + + if(vga.sequencer.data[4] & 4) + { + int data; + vga.gc.latch[0]=vga.memory[(offset)]; + vga.gc.latch[1]=vga.memory[(offset)+0x20000]; + vga.gc.latch[2]=vga.memory[(offset)+0x40000]; + vga.gc.latch[3]=vga.memory[(offset)+0x60000]; + + if (vga.gc.read_mode) + { + UINT8 byte,layer; + UINT8 fill_latch; + data=0; + #if 0 + if (!(ega_bitplane_to_packed(vga.gc.latch, 0)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=1; + if (!(ega_bitplane_to_packed(vga.gc.latch, 1)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=2; + if (!(ega_bitplane_to_packed(vga.gc.latch, 2)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=4; + if (!(ega_bitplane_to_packed(vga.gc.latch, 3)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=8; + if (!(ega_bitplane_to_packed(vga.gc.latch, 4)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=0x10; + if (!(ega_bitplane_to_packed(vga.gc.latch, 5)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=0x20; + if (!(ega_bitplane_to_packed(vga.gc.latch, 6)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=0x40; + if (!(ega_bitplane_to_packed(vga.gc.latch, 7)^(vga.gc.color_compare&vga.gc.color_dont_care))) data|=0x80; + #endif + + for(byte=0;byte<8;byte++) + { + fill_latch = 0; + for(layer=0;layer<4;layer++) + { + if(vga.gc.latch[layer] & 1 << byte) + fill_latch |= 1 << layer; + } + fill_latch &= vga.gc.color_dont_care; + if(fill_latch == vga.gc.color_compare) + data |= 1 << byte; + } + } + else + data=vga.gc.latch[vga.gc.read_map_sel]; + + return data; + } + else + { + // TODO: Guesswork, probably not right + UINT8 i,data; + + data = 0; + //printf("%08x\n",offset); + + for(i=0;i<4;i++) + { + if(vga.sequencer.map_mask & 1 << i) + data |= vga.memory[offset+i*0x20000]; + } + + return data; + } + + return 0; +} + +WRITE8_HANDLER(vga_mem_w) +{ + //Inside each case must prevent writes to non-mapped VGA memory regions, not only mask the offset. + switch((vga.gc.data[6] >> 2) & 0x03) + { + case 0: break; + case 1: + if(offset & 0x10000) + return; + + offset &= 0x0ffff; + break; + case 2: + if((offset & 0x18000) != 0x10000) + return; + + offset &= 0x07fff; + break; + case 3: + if((offset & 0x18000) != 0x18000) + return; + + offset &= 0x07fff; + break; + } + + { + UINT8 i; + + for(i=0;i<4;i++) + { + if(vga.sequencer.map_mask & 1 << i) + vga.memory[offset+i*0x20000] = (vga.sequencer.data[4] & 4) ? vga_latch_write(i,data) : data; + } + return; + } } -void pc_vga_init(running_machine &machine, const struct pc_vga_interface *vga_intf, const struct pc_svga_interface *svga_intf) +void pc_vga_init(running_machine &machine, read8_space_func read_dipswitch, const struct pc_svga_interface *svga_intf) { - int i, j, k, mask1, buswidth; - address_space *spacevga; + int i, j, k, mask1; memset(&vga, 0, sizeof(vga)); @@ -924,9 +1472,8 @@ color_bitplane_to_packed[k][j][i]=(i&mask1)?(1<(machine.firstcpu)->space_config(AS_PROGRAM)->m_databus_width; - spacevga =machine.firstcpu->memory().space(vga.vga_intf.port_addressspace); + pc_vga_reset(machine); + +} + +void pc_vga_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset) +{ + int buswidth; + UINT64 mask = 0; + + buswidth = machine.firstcpu->memory().space_config(AS_PROGRAM)->m_databus_width; switch(buswidth) { case 8: @@ -981,30 +1534,19 @@ fatalerror("VGA: Bus width %d not supported", buswidth); break; } - spacevga->install_legacy_read_handler(vga.vga_intf.port_offset + 0x3b0, vga.vga_intf.port_offset + 0x3bf, FUNC(vga_port_03b0_r), mask); - spacevga->install_legacy_read_handler(vga.vga_intf.port_offset + 0x3c0, vga.vga_intf.port_offset + 0x3cf, FUNC(vga_port_03c0_r), mask); - spacevga->install_legacy_read_handler(vga.vga_intf.port_offset + 0x3d0, vga.vga_intf.port_offset + 0x3df, FUNC(vga_port_03d0_r), mask); - - spacevga->install_legacy_write_handler(vga.vga_intf.port_offset + 0x3b0, vga.vga_intf.port_offset + 0x3bf, FUNC(vga_port_03b0_w), mask); - spacevga->install_legacy_write_handler(vga.vga_intf.port_offset + 0x3c0, vga.vga_intf.port_offset + 0x3cf, FUNC(vga_port_03c0_w), mask); - spacevga->install_legacy_write_handler(vga.vga_intf.port_offset + 0x3d0, vga.vga_intf.port_offset + 0x3df, FUNC(vga_port_03d0_w), mask); + io_space->install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); + io_space->install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(vga_port_03c0_r), FUNC(vga_port_03c0_w), mask); + io_space->install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(vga_port_03d0_r), FUNC(vga_port_03d0_w), mask); - pc_vga_reset(machine); + mem_space->install_legacy_readwrite_handler(mem_offset + 0x00000, mem_offset + 0x1ffff, FUNC(vga_mem_r), FUNC(vga_mem_w), mask); } -static TIMER_CALLBACK(vga_timer) +VIDEO_START( vga ) { - vga.monitor.retrace=1; -} -static VIDEO_START( vga ) -{ - vga.monitor.get_clock=vga_get_clock; - vga.monitor.get_lines=vga_get_crtc_lines; - vga.monitor.get_columns=vga_get_crtc_columns; - vga.monitor.get_sync_lines=vga_get_crtc_sync_lines; - vga.monitor.get_sync_columns=vga_get_crtc_sync_columns; - machine.scheduler().timer_pulse(attotime::from_hz(60), FUNC(vga_timer)); - pc_video_start(machine, pc_vga_choosevideomode); + int i; + for (i = 0; i < 0x100; i++) + palette_set_color_rgb(machine, i, 0, 0, 0); + pc_video_start(machine); } static VIDEO_RESET( vga ) @@ -1012,265 +1554,405 @@ pc_vga_reset(machine); } -static void vga_vh_text(bitmap_t *bitmap) + + +void *pc_vga_memory(void) { - UINT8 ch, attr; - UINT8 bits; - UINT8 *font; - UINT16 *bitmapline; - int width=CHAR_WIDTH, height=CRTC_CHAR_HEIGHT; - int pos, line, column, mask, w, h, addr; - pen_t pen; + return vga.memory; +} + +size_t pc_vga_memory_size(void) +{ + return vga.svga_intf.vram_size; +} + +MACHINE_CONFIG_FRAGMENT( pcvideo_vga ) + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_RAW_PARAMS(XTAL_25_1748MHz,900,0,640,526,0,480) + MCFG_SCREEN_UPDATE_STATIC(pc_video) + + MCFG_PALETTE_LENGTH(0x100) + + MCFG_VIDEO_START(vga) + MCFG_VIDEO_RESET(vga) +MACHINE_CONFIG_END + +MACHINE_CONFIG_FRAGMENT( pcvideo_vga_isa ) + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_RAW_PARAMS(XTAL_25_1748MHz,900,0,640,526,0,480) + MCFG_SCREEN_UPDATE_STATIC(pc_video) + + MCFG_PALETTE_LENGTH(0x100) +MACHINE_CONFIG_END + +/****************************************** - if (CRTC_CURSOR_MODE!=CRTC_CURSOR_OFF) +Tseng ET4000k implementation + +******************************************/ + +static UINT8 tseng_crtc_reg_read(running_machine &machine, UINT8 index) +{ + UINT8 res; + + res = 0; + if(index <= 0x18) + res = vga.crtc.data[index]; + else { - if (++vga.cursor.time>=0x10) + switch(index) { - vga.cursor.visible^=1; - vga.cursor.time=0; + default: + res = vga.crtc.data[index]; + //printf("%02x\n",index); + break; } } - for (addr = TEXT_START_ADDRESS, line = -CRTC_SKEW; line < TEXT_LINES; - line += height, addr += TEXT_LINE_LENGTH) + return res; +} + + +static void tseng_crtc_reg_write(running_machine &machine, UINT8 index, UINT8 data) +{ + if(index <= 0x18) + crtc_reg_write(machine,index,data); + else { - for (pos = addr, column=0; columnheight)); h++) - { - bitmapline = BITMAP_ADDR16(bitmap, line+h, 0); - bits = font[h<<2]; +static UINT8 tseng_seq_reg_read(running_machine &machine, UINT8 index) +{ + UINT8 res; - assert(bitmapline); + res = 0xff; - for (mask=0x80, w=0; (w>=1) - { - if (bits&mask) - pen = vga.pens[attr & 0x0f]; - else - pen = vga.pens[attr >> 4]; - bitmapline[column*width+w] = pen; - } - if (w> 4]; - bitmapline[column*width+w] = pen; - } - } - if ((CRTC_CURSOR_MODE!=CRTC_CURSOR_OFF) - &&vga.cursor.visible&&(pos==CRTC_CURSOR_POS)) - { - for (h=CRTC_CURSOR_TOP; - (h<=CRTC_CURSOR_BOTTOM)&&(hmachine(),vga.sequencer.index); + break; + case 0x0d: + res = svga.bank_w & 0xf; + res |= (svga.bank_r & 0xf) << 4; + break; + default: + res = vga_port_03c0_r(space,offset); + break; + } - for (pos=addr, c=0, column=0; columnmachine(),vga.sequencer.index,data); + break; + case 0x0d: + svga.bank_w = data & 0xf; + svga.bank_r = (data & 0xf0) >> 4; + break; + default: + vga_port_03c0_w(space,offset,data); + break; + } +} - for (i = 7; i >= 0; i--) - { - pen = vga.pens[(data[0]&1) | (data[1]&2) | (data[2]&4) | (data[3]&8)]; - bitmapline[c+i] = pen; +READ8_HANDLER(tseng_et4k_03d0_r) +{ + UINT8 res = 0xff; - data[0]>>=1; - data[1]>>=1; - data[2]>>=1; - data[3]>>=1; - } + if (CRTC_PORT_ADDR == 0x3d0) + { + switch(offset) + { + case 5: + res = tseng_crtc_reg_read(space->machine(),vga.crtc.index); + break; + default: + res = vga_port_03d0_r(space,offset); + break; } + } - for (i = 1; i < height; i++) + return res; +} + +WRITE8_HANDLER(tseng_et4k_03d0_w) +{ + if (CRTC_PORT_ADDR == 0x3d0) + { + switch(offset) { - if (line + i >= LINES) + case 5: + vga.crtc.data[vga.crtc.index] = data; + tseng_crtc_reg_write(space->machine(),vga.crtc.index,data); + break; + /* TODO: investigate about this */ + case 8: + svga.rgb8_en = data & 0x80; + break; + default: + vga_port_03d0_w(space,offset,data); break; - - newbitmapline = BITMAP_ADDR16(bitmap, line+i, 0); - memcpy(newbitmapline, bitmapline, EGA_COLUMNS * 8 * sizeof(UINT16)); } } } -static void vga_vh_vga(bitmap_t *bitmap) +READ8_HANDLER( tseng_mem_r ) { - int pos, line, column, c, addr, curr_addr; - UINT16 *bitmapline; + if(svga.rgb8_en) + { + offset &= 0xffff; + return vga.memory[(offset+svga.bank_r*0x10000)]; + } - curr_addr = 0; - if(vga.sequencer.data[4] & 0x08) + return vga_mem_r(space,offset); +} + +WRITE8_HANDLER( tseng_mem_w ) +{ + if(svga.rgb8_en) { - for (addr = VGA_START_ADDRESS, line=0; line vga.svga_intf.vram_size) - return; - bitmapline[c+0] = vga.memory[pos+0]; - bitmapline[c+1] = vga.memory[pos+1]; - bitmapline[c+2] = vga.memory[pos+2]; - bitmapline[c+3] = vga.memory[pos+3]; - bitmapline[c+4] = vga.memory[pos+0x10]; - bitmapline[c+5] = vga.memory[pos+0x11]; - bitmapline[c+6] = vga.memory[pos+0x12]; - bitmapline[c+7] = vga.memory[pos+0x13]; - } - } + offset &= 0xffff; + vga.memory[(offset+svga.bank_w*0x10000)] = data; } else + vga_mem_w(space,offset,data); +} + +/****************************************** + +Trident implementation + +******************************************/ + +void pc_svga_trident_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset) +{ + int buswidth; + UINT64 mask = 0; + + buswidth = machine.firstcpu->memory().space_config(AS_PROGRAM)->m_databus_width; + switch(buswidth) { - for (addr = VGA_START_ADDRESS, line=0; line vga.svga_intf.vram_size) - return; - bitmapline[c+0] = vga.memory[pos+0]; - bitmapline[c+1] = vga.memory[pos+1]; - bitmapline[c+2] = vga.memory[pos+2]; - bitmapline[c+3] = vga.memory[pos+3]; - bitmapline[c+4] = vga.memory[pos+4]; - bitmapline[c+5] = vga.memory[pos+5]; - bitmapline[c+6] = vga.memory[pos+6]; - bitmapline[c+7] = vga.memory[pos+7]; - } - } + case 8: + mask = 0; + break; + + case 16: + mask = 0xffff; + break; + + case 32: + mask = 0xffffffff; + break; + + case 64: + mask = -1; + break; + + default: + fatalerror("VGA: Bus width %d not supported", buswidth); + break; } + io_space->install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); + io_space->install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(trident_03c0_r), FUNC(trident_03c0_w), mask); + io_space->install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(trident_03d0_r), FUNC(trident_03d0_w), mask); + + mem_space->install_legacy_readwrite_handler(mem_offset + 0x00000, mem_offset + 0x1ffff, FUNC(trident_mem_r), FUNC(trident_mem_w), mask); + + // D3h = TGUI9660XGi + svga.id = 0xd3; // TODO: hardcoded for California Chase } -static pc_video_update_proc pc_vga_choosevideomode(running_machine &machine, int *width, int *height) +static UINT8 trident_seq_reg_read(running_machine &machine, UINT8 index) { - pc_video_update_proc proc = NULL; - int i; + UINT8 res; - if (CRTC_ON) - { - if (vga.dac.dirty) - { - for (i=0; i<256;i++) - { - palette_set_color_rgb(machine, i,(vga.dac.color[i].red & 0x3f) << 2, - (vga.dac.color[i].green & 0x3f) << 2, - (vga.dac.color[i].blue & 0x3f) << 2); - } - vga.dac.dirty = 0; - } + res = 0xff; - if (vga.attribute.data[0x10] & 0x80) - { - for (i=0; i<16;i++) - { - vga.pens[i] = machine.pens[(vga.attribute.data[i]&0x0f) - |((vga.attribute.data[0x14]&0xf)<<4)]; - } - } - else + if(index <= 0x04) + res = vga.sequencer.data[index]; + else + { + switch(index) { - for (i=0; i<16;i++) - { - vga.pens[i]=machine.pens[(vga.attribute.data[i]&0x3f) - |((vga.attribute.data[0x14]&0xc)<<4)]; - } + case 0x0b: + res = svga.id; + // TODO: new mode registers selected + break; + case 0x0d: + res = svga.rgb15_en; + break; } + } - if (vga.svga_intf.choosevideomode) - proc = vga.svga_intf.choosevideomode(vga.sequencer.data, vga.crtc.data, vga.gc.data, width, height); + return res; +} - if (!proc) +static void trident_seq_reg_write(running_machine &machine, UINT8 index, UINT8 data) +{ + if(index <= 0x04) + { + vga.sequencer.data[vga.sequencer.index] = data; + seq_reg_write(machine,vga.sequencer.index,data); + recompute_params(machine); + } + else + { + switch(index) { - if (!GRAPHIC_MODE) - { - proc = vga_vh_text; - *height = TEXT_LINES; - *width = TEXT_COLUMNS * CHAR_WIDTH; - } - else if (vga.gc.data[5]&0x40) - { - proc = vga_vh_vga; - *height = LINES; - *width = VGA_COLUMNS * 8; - } - else - { - proc = vga_vh_ega; - *height = LINES; - *width = EGA_COLUMNS * 8; - } + case 0x0b: + // TODO: old mode registers selected + break; + case 0x0d: + svga.rgb15_en = data & 0x30; // TODO: doesn't match documentation + break; } } - return proc; } +READ8_HANDLER(trident_03c0_r) +{ + UINT8 res; -void *pc_vga_memory(void) + switch(offset) + { + case 0x05: + res = trident_seq_reg_read(space->machine(),vga.sequencer.index); + break; + default: + res = vga_port_03c0_r(space,offset); + break; + } + + return res; +} + +WRITE8_HANDLER(trident_03c0_w) { - return vga.memory; + switch(offset) + { + case 0x05: + trident_seq_reg_write(space->machine(),vga.sequencer.index,data); + break; + default: + vga_port_03c0_w(space,offset,data); + break; + } } +READ8_HANDLER(trident_03d0_r) +{ + UINT8 res = 0xff; -size_t pc_vga_memory_size(void) + if (CRTC_PORT_ADDR == 0x3d0) + { + switch(offset) + { + case 8: + res = svga.bank_w & 0x1f; // TODO: a lot more complex than this + break; + default: + res = vga_port_03d0_r(space,offset); + break; + } + } + + return res; +} + +WRITE8_HANDLER(trident_03d0_w) { - return vga.svga_intf.vram_size; + if (CRTC_PORT_ADDR == 0x3d0) + { + switch(offset) + { + case 8: + svga.bank_w = data & 0x1f; // TODO: a lot more complex than this + break; + default: + vga_port_03d0_w(space,offset,data); + break; + } + } } -MACHINE_CONFIG_FRAGMENT( pcvideo_vga ) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(720, 480) - MCFG_SCREEN_VISIBLE_AREA(0,720-1, 0,480-1) - MCFG_SCREEN_UPDATE(pc_video) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ +READ8_HANDLER( trident_mem_r ) +{ + if (svga.rgb15_en & 0x30) + { + int data; + if(offset & 0x10000) // TODO: old reg mode actually CAN read to the upper bank + return 0; + data=vga.memory[offset + (svga.bank_w*0x10000)]; + return data; + } - MCFG_PALETTE_LENGTH(0x100) - MCFG_PALETTE_INIT(vga) + return vga_mem_r(space,offset); +} - MCFG_VIDEO_START(vga) - MCFG_VIDEO_RESET(vga) -MACHINE_CONFIG_END +WRITE8_HANDLER( trident_mem_w ) +{ + if (svga.rgb15_en & 0x30) + { + if(offset & 0x10000) // TODO: old reg mode actually CAN write to the upper bank + return; + vga.memory[offset + (svga.bank_w*0x10000)]= data; + return; + } + + vga_mem_w(space,offset,data); +} diff -Nru mame-0.144/src/emu/video/pc_vga.h mame-0.145/src/emu/video/pc_vga.h --- mame-0.144/src/emu/video/pc_vga.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/pc_vga.h 2012-02-06 21:30:27.000000000 +0000 @@ -9,23 +9,10 @@ #ifndef PC_VGA_H #define PC_VGA_H -typedef void (*pc_video_update_proc)(bitmap_t *bitmap); - MACHINE_CONFIG_EXTERN( pcvideo_vga ); +MACHINE_CONFIG_EXTERN( pcvideo_vga_isa ); -struct pc_vga_interface -{ - /* VGA memory mapper */ - const char *vga_memory_bank; - void (*map_vga_memory)(running_machine &machine, offs_t begin, offs_t end, read8_space_func rh, const char *rh_name, write8_space_func wh, const char *wh_name); - - /* VGA dipswitch (???) */ - read8_space_func read_dipswitch; - - /* where the ports go */ - int port_addressspace; - offs_t port_offset; -}; +VIDEO_START( vga ); struct pc_svga_interface { @@ -33,13 +20,40 @@ int seq_regcount; int gc_regcount; int crtc_regcount; - pc_video_update_proc (*choosevideomode)(const UINT8 *sequencer, const UINT8 *crtc, const UINT8 *gc, int *width, int *height); + void (*choosevideomode)(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT8 *sequencer, const UINT8 *crtc, const UINT8 *gc, int *width, int *height); }; -void pc_vga_init(running_machine &machine, const struct pc_vga_interface *vga_intf, const struct pc_svga_interface *svga_intf); +void pc_vga_init(running_machine &machine, read8_space_func read_dipswitch, const struct pc_svga_interface *svga_intf); +void pc_vga_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset); +void pc_svga_trident_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset); void pc_vga_reset(running_machine &machine); void *pc_vga_memory(void); size_t pc_vga_memory_size(void); +void pc_video_start(running_machine &machine); + +READ8_HANDLER(vga_port_03b0_r); +READ8_HANDLER(vga_port_03c0_r); +READ8_HANDLER(vga_port_03d0_r); +READ8_HANDLER(vga_mem_r); +WRITE8_HANDLER(vga_port_03b0_w); +WRITE8_HANDLER(vga_port_03c0_w); +WRITE8_HANDLER(vga_port_03d0_w); +WRITE8_HANDLER(vga_mem_w); + +/* per-device implementations */ +READ8_HANDLER(tseng_et4k_03c0_r); +WRITE8_HANDLER(tseng_et4k_03c0_w); +READ8_HANDLER(tseng_et4k_03d0_r); +WRITE8_HANDLER(tseng_et4k_03d0_w); +READ8_HANDLER(tseng_mem_r); +WRITE8_HANDLER(tseng_mem_w); + +READ8_HANDLER(trident_03c0_r); +WRITE8_HANDLER(trident_03c0_w); +READ8_HANDLER(trident_03d0_r); +WRITE8_HANDLER(trident_03d0_w); +READ8_HANDLER(trident_mem_r); +WRITE8_HANDLER(trident_mem_w); /* pega notes (paradise) @@ -80,20 +94,6 @@ ROM_LOAD("oakvga.bin", 0xc0000, 0x8000, CRC(318c5f43)) */ -#if 0 - int i; - UINT8 *memory=machine.region("maincpu")->base()+0xc0000; - UINT8 chksum; - - /* oak vga */ - /* plausibility check of retrace signals goes wrong */ - memory[0x00f5]=memory[0x00f6]=memory[0x00f7]=0x90; - memory[0x00f8]=memory[0x00f9]=memory[0x00fa]=0x90; - for (chksum=0, i=0;i<0x7fff;i++) { - chksum+=memory[i]; - } - memory[i]=0x100-chksum; -#endif #endif /* PC_VGA_H */ diff -Nru mame-0.144/src/emu/video/poly.c mame-0.145/src/emu/video/poly.c --- mame-0.144/src/emu/video/poly.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/poly.c 2012-02-06 21:30:27.000000000 +0000 @@ -468,7 +468,7 @@ triangle given 3 vertexes -------------------------------------------------*/ -UINT32 poly_render_triangle(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3) +UINT32 poly_render_triangle(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3) { float dxdy_v1v2, dxdy_v1v3, dxdy_v2v3; const poly_vertex *tv; @@ -507,11 +507,8 @@ /* clip coordinates */ v1yclip = v1y; v3yclip = v3y + ((poly->flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - if (cliprect != NULL) - { - v1yclip = MAX(v1yclip, cliprect->min_y); - v3yclip = MIN(v3yclip, cliprect->max_y + 1); - } + v1yclip = MAX(v1yclip, cliprect.min_y); + v3yclip = MIN(v3yclip, cliprect.max_y + 1); if (v3yclip - v1yclip <= 0) return 0; @@ -585,13 +582,10 @@ istopx++; /* apply left/right clipping */ - if (cliprect != NULL) - { - if (istartx < cliprect->min_x) - istartx = cliprect->min_x; - if (istopx > cliprect->max_x) - istopx = cliprect->max_x + 1; - } + if (istartx < cliprect.min_x) + istartx = cliprect.min_x; + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; /* set the extent and update the total pixel count */ if (istartx >= istopx) @@ -657,7 +651,7 @@ triangles in a fan -------------------------------------------------*/ -UINT32 poly_render_triangle_fan(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) +UINT32 poly_render_triangle_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) { UINT32 pixels = 0; int vertnum; @@ -674,7 +668,7 @@ render of an object, given specific extents -------------------------------------------------*/ -UINT32 poly_render_triangle_custom(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents) +UINT32 poly_render_triangle_custom(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents) { INT32 curscan, scaninc; polygon_info *polygon; @@ -683,16 +677,8 @@ UINT32 startunit; /* clip coordinates */ - if (cliprect != NULL) - { - v1yclip = MAX(startscanline, cliprect->min_y); - v3yclip = MIN(startscanline + numscanlines, cliprect->max_y + 1); - } - else - { - v1yclip = startscanline; - v3yclip = startscanline + numscanlines; - } + v1yclip = MAX(startscanline, cliprect.min_y); + v3yclip = MIN(startscanline + numscanlines, cliprect.max_y + 1); if (v3yclip - v1yclip <= 0) return 0; @@ -741,13 +727,10 @@ } /* apply left/right clipping */ - if (cliprect != NULL) - { - if (istartx < cliprect->min_x) - istartx = cliprect->min_x; - if (istopx > cliprect->max_x) - istopx = cliprect->max_x + 1; - } + if (istartx < cliprect.min_x) + istartx = cliprect.min_x; + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; /* set the extent and update the total pixel count */ unit->extent[extnum].startx = istartx; @@ -781,7 +764,7 @@ given 4 vertexes -------------------------------------------------*/ -UINT32 poly_render_quad(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4) +UINT32 poly_render_quad(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4) { poly_edge fedgelist[3], bedgelist[3]; const poly_edge *ledge, *redge; @@ -824,11 +807,8 @@ /* clip coordinates */ minyclip = miny; maxyclip = maxy + ((poly->flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - if (cliprect != NULL) - { - minyclip = MAX(minyclip, cliprect->min_y); - maxyclip = MIN(maxyclip, cliprect->max_y + 1); - } + minyclip = MAX(minyclip, cliprect.min_y); + maxyclip = MIN(maxyclip, cliprect.max_y + 1); if (maxyclip - minyclip <= 0) return 0; @@ -967,17 +947,14 @@ istopx++; /* apply left/right clipping */ - if (cliprect != NULL) + if (istartx < cliprect.min_x) { - if (istartx < cliprect->min_x) - { - for (paramnum = 0; paramnum < paramcount; paramnum++) - unit->extent[extnum].param[paramnum].start += (cliprect->min_x - istartx) * unit->extent[extnum].param[paramnum].dpdx; - istartx = cliprect->min_x; - } - if (istopx > cliprect->max_x) - istopx = cliprect->max_x + 1; + for (paramnum = 0; paramnum < paramcount; paramnum++) + unit->extent[extnum].param[paramnum].start += (cliprect.min_x - istartx) * unit->extent[extnum].param[paramnum].dpdx; + istartx = cliprect.min_x; } + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; /* set the extent and update the total pixel count */ if (istartx >= istopx) @@ -1007,7 +984,7 @@ quads in a fan -------------------------------------------------*/ -UINT32 poly_render_quad_fan(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) +UINT32 poly_render_quad_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) { UINT32 pixels = 0; int vertnum; @@ -1029,7 +1006,7 @@ to 32 vertices -------------------------------------------------*/ -UINT32 poly_render_polygon(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) +UINT32 poly_render_polygon(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v) { poly_edge fedgelist[MAX_POLYGON_VERTS - 1], bedgelist[MAX_POLYGON_VERTS - 1]; const poly_edge *ledge, *redge; @@ -1062,11 +1039,8 @@ /* clip coordinates */ minyclip = miny; maxyclip = maxy + ((poly->flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); - if (cliprect != NULL) - { - minyclip = MAX(minyclip, cliprect->min_y); - maxyclip = MIN(maxyclip, cliprect->max_y + 1); - } + minyclip = MAX(minyclip, cliprect.min_y); + maxyclip = MIN(maxyclip, cliprect.max_y + 1); if (maxyclip - minyclip <= 0) return 0; @@ -1205,17 +1179,14 @@ istopx++; /* apply left/right clipping */ - if (cliprect != NULL) + if (istartx < cliprect.min_x) { - if (istartx < cliprect->min_x) - { - for (paramnum = 0; paramnum < paramcount; paramnum++) - unit->extent[extnum].param[paramnum].start += (cliprect->min_x - istartx) * unit->extent[extnum].param[paramnum].dpdx; - istartx = cliprect->min_x; - } - if (istopx > cliprect->max_x) - istopx = cliprect->max_x + 1; + for (paramnum = 0; paramnum < paramcount; paramnum++) + unit->extent[extnum].param[paramnum].start += (cliprect.min_x - istartx) * unit->extent[extnum].param[paramnum].dpdx; + istartx = cliprect.min_x; } + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; /* set the extent and update the total pixel count */ if (istartx >= istopx) diff -Nru mame-0.144/src/emu/video/poly.h mame-0.145/src/emu/video/poly.h --- mame-0.144/src/emu/video/poly.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/poly.h 2012-02-06 21:30:27.000000000 +0000 @@ -120,30 +120,30 @@ /* ----- core triangle rendering ----- */ /* render a single triangle given 3 vertexes */ -UINT32 poly_render_triangle(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3); +UINT32 poly_render_triangle(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3); /* render a set of triangles in a fan */ -UINT32 poly_render_triangle_fan(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); +UINT32 poly_render_triangle_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); /* perform a custom render of an object, given specific extents */ -UINT32 poly_render_triangle_custom(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents); +UINT32 poly_render_triangle_custom(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents); /* ----- core quad rendering ----- */ /* render a single quad given 4 vertexes */ -UINT32 poly_render_quad(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4); +UINT32 poly_render_quad(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4); /* render a set of quads in a fan */ -UINT32 poly_render_quad_fan(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); +UINT32 poly_render_quad_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); /* ----- core polygon rendering ----- */ /* render a single polygon up to 32 vertices */ -UINT32 poly_render_polygon(poly_manager *poly, void *dest, const rectangle *cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); +UINT32 poly_render_polygon(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v); diff -Nru mame-0.144/src/emu/video/polynew.h mame-0.145/src/emu/video/polynew.h --- mame-0.144/src/emu/video/polynew.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/polynew.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,1121 @@ +/*************************************************************************** + + poly.h + + New polygon helper routines. + +**************************************************************************** + + Pixel model: + + (0.0,0.0) (1.0,0.0) (2.0,0.0) (3.0,0.0) + +---------------+---------------+---------------+ + | | | | + | | | | + | (0.5,0.5) | (1.5,0.5) | (2.5,0.5) | + | * | * | * | + | | | | + | | | | + (0.0,1.0) (1.0,1.0) (2.0,1.0) (3.0,1.0) + +---------------+---------------+---------------+ + | | | | + | | | | + | (0.5,1.5) | (1.5,1.5) | (2.5,1.5) | + | * | * | * | + | | | | + | | | | + | | | | + +---------------+---------------+---------------+ + (0.0,2.0) (1.0,2.0) (2.0,2.0) (3.0,2.0) + +***************************************************************************/ + +#pragma once + +#ifndef __POLYNEW_H__ +#define __POLYNEW_H__ + + +//************************************************************************** +// DEBUGGING +//************************************************************************** + +// keep statistics +#define KEEP_STATISTICS 0 + +// turn this on to log the reasons for any long waits +#define LOG_WAITS 0 + +// number of profiling ticks before we consider a wait "long" +#define LOG_WAIT_THRESHOLD 1000 + + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define POLYFLAG_INCLUDE_BOTTOM_EDGE 0x01 +#define POLYFLAG_INCLUDE_RIGHT_EDGE 0x02 +#define POLYFLAG_NO_WORK_QUEUE 0x04 + +#define SCANLINES_PER_BUCKET 8 +#define CACHE_LINE_SIZE 64 // this is a general guess +#define TOTAL_BUCKETS (512 / SCANLINES_PER_BUCKET) +#define UNITS_PER_POLY (100 / SCANLINES_PER_BUCKET) + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +//------------------------------------------------- +// global helpers for float base types +//------------------------------------------------- + +inline float poly_floor(float x) { return floorf(x); } +inline float poly_abs(float x) { return fabsf(x); } +inline float poly_recip(float x) { return 1.0f / x; } + + +//------------------------------------------------- +// global helpers for double base types +//------------------------------------------------- + +inline double poly_floor(double x) { return floor(x); } +inline double poly_abs(double x) { return fabs(x); } +inline double poly_recip(double x) { return 1.0 / x; } + + +// poly_manager is a template class +template +class poly_manager +{ +public: + // each vertex has an X/Y coordinate and a set of parameters + struct vertex_t + { + vertex_t() { } + vertex_t(_BaseType _x, _BaseType _y) { x = _x; y = _y; } + + _BaseType x, y; // X, Y coordinates + _BaseType p[_MaxParams]; // interpolated parameters + }; + + // a single extent describes a span and a list of parameter extents + struct extent_t + { + INT16 startx, stopx; // starting (inclusive)/ending (exclusive) endpoints + struct + { + _BaseType start; // parameter value at start + _BaseType dpdx; // dp/dx relative to start + } param[_MaxParams]; + }; + + // delegate type for scanline callbacks + typedef delegate render_delegate; + + // construction/destruction + poly_manager(running_machine &machine, UINT8 flags = 0); + virtual ~poly_manager(); + + // getters + running_machine &machine() const { return m_machine; } + + // synchronization + void wait(const char *debug_reason = "general"); + + // object data allocators + _ObjectData &object_data_alloc(); + _ObjectData &object_data_last() const { return m_object.last(); } + + // tiles + UINT32 render_tile(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &v1, const vertex_t &v2); + + // triangles + UINT32 render_triangle(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &v1, const vertex_t &v2, const vertex_t &v3); + UINT32 render_triangle_fan(const rectangle &cliprect, render_delegate callback, int paramcount, int numverts, const vertex_t *v); + UINT32 render_triangle_strip(const rectangle &cliprect, render_delegate callback, int paramcount, int numverts, const vertex_t *v); + UINT32 render_triangle_custom(const rectangle &cliprect, render_delegate callback, int startscanline, int numscanlines, const extent_t *extents); + + // polygons + template + UINT32 render_polygon(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t *v); + + // public helpers + int zclip_if_less(int numverts, const vertex_t *v, vertex_t *outv, int paramcount, _BaseType clipval); + +private: + // polygon_info describes a single polygon, which includes the poly_params + struct polygon_info + { + poly_manager * m_owner; // pointer back to the poly manager + _ObjectData * m_object; // object data pointer + render_delegate m_callback; // callback to handle a scanline's worth of work + }; + + // internal unit of work + struct work_unit + { + volatile UINT32 count_next; // number of scanlines and index of next item to process + polygon_info * polygon; // pointer to polygon + INT16 scanline; // starting scanline + UINT16 previtem; // index of previous item in the same bucket + #ifndef PTR64 + UINT32 dummy; // pad to 16 bytes + #endif + extent_t extent[SCANLINES_PER_BUCKET]; // array of scanline extents + }; + + // class for managing an array of items + template + class poly_array + { + // size of an item, rounded up to the cache line size + static const int k_itemsize = ((sizeof(_Type) + CACHE_LINE_SIZE - 1) / CACHE_LINE_SIZE) * CACHE_LINE_SIZE; + + public: + // construction + poly_array(running_machine &machine, poly_manager &manager) + : m_manager(manager), + m_base(auto_alloc_array_clear(machine, UINT8, k_itemsize * _Count)), + m_next(0), + m_max(0), + m_waits(0) { } + + // destruction + ~poly_array() { auto_free(m_manager.machine(), m_base); } + + // operators + _Type &operator[](int index) const { assert(index >= 0 && index < _Count); return *reinterpret_cast<_Type *>(m_base + index * k_itemsize); } + + // getters + int count() const { return m_next; } + int max() const { return m_max; } + int waits() const { return m_waits; } + int itemsize() const { return k_itemsize; } + int allocated() const { return _Count; } + int indexof(_Type &item) const { int result = (reinterpret_cast(&item) - m_base) / k_itemsize; assert(result >= 0 && result < _Count); return result; } + + // operations + void reset() { m_next = 0; } + _Type &next() { if (m_next > m_max) m_max = m_next; assert(m_next < _Count); return *new(m_base + m_next++ * k_itemsize) _Type; } + _Type &last() const { return (*this)[m_next - 1]; } + void wait_for_space(int count = 1) { while ((m_next + count) >= _Count) { m_waits++; m_manager.wait(""); } } + + private: + // internal state + poly_manager & m_manager; + UINT8 * m_base; + int m_next; + int m_max; + int m_waits; + }; + + // internal array types + typedef poly_array polygon_array; + typedef poly_array<_ObjectData, _MaxPolys + 1> objectdata_array; + typedef poly_array unit_array; + + // round in a cross-platform consistent manner + inline INT32 round_coordinate(_BaseType value) + { + INT32 result = poly_floor(value); + return result + (value - _BaseType(result) > _BaseType(0.5)); + } + + // internal helpers + polygon_info &polygon_alloc(int minx, int maxx, int miny, int maxy, render_delegate callback) + { + // wait for space in the polygon and unit arrays + m_polygon.wait_for_space(); + m_unit.wait_for_space((maxy - miny) / SCANLINES_PER_BUCKET + 2); + + // return and initialize the next one + polygon_info &polygon = m_polygon.next(); + polygon.m_owner = this; + polygon.m_object = &object_data_last(); + polygon.m_callback = callback; + return polygon; + } + + static void *work_item_callback(void *param, int threadid); + void presave() { wait("pre-save"); } + + // queue management + running_machine & m_machine; + osd_work_queue * m_queue; // work queue + + // arrays + polygon_array m_polygon; // array of polygons + objectdata_array m_object; // array of object data + unit_array m_unit; // array of work units + + // misc data + UINT8 m_flags; // flags + + // buckets + UINT16 m_unit_bucket[TOTAL_BUCKETS]; // buckets for tracking unit usage + + // statistics + UINT32 m_tiles; // number of tiles queued + UINT32 m_triangles; // number of triangles queued + UINT32 m_quads; // number of quads queued + UINT64 m_pixels; // number of pixels rendered +#if KEEP_STATISTICS + UINT32 m_conflicts[WORK_MAX_THREADS]; // number of conflicts found, per thread + UINT32 m_resolved[WORK_MAX_THREADS]; // number of conflicts resolved, per thread +#endif +}; + + +//------------------------------------------------- +// poly_manager - constructor +//------------------------------------------------- + +template +poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(running_machine &machine, UINT8 flags) + : m_machine(machine), + m_queue(NULL), + m_polygon(machine, *this), + m_object(machine, *this), + m_unit(machine, *this), + m_flags(flags), + m_triangles(0), + m_quads(0), + m_pixels(0) +{ +#if KEEP_STATISTICS + memset(m_conflicts, 0, sizeof(m_conflicts)); + memset(m_resolved, 0, sizeof(m_resolved)); +#endif + + // create the work queue + if (!(flags & POLYFLAG_NO_WORK_QUEUE)) + m_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_MULTI | WORK_QUEUE_FLAG_HIGH_FREQ); + + // request a pre-save callback for synchronization + machine.save().register_presave(save_prepost_delegate(FUNC(poly_manager::presave), this)); +} + + +//------------------------------------------------- +// ~poly_manager - destructor +//------------------------------------------------- + +template +poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::~poly_manager() +{ +#if KEEP_STATISTICS +{ + // accumulate stats over the entire collection + int conflicts = 0, resolved = 0; + for (int i = 0; i < ARRAY_LENGTH(m_conflicts); i++) + { + conflicts += m_conflicts[i]; + resolved += m_resolved[i]; + } + + // output global stats + printf("Total triangles = %d\n", m_triangles); + printf("Total quads = %d\n", m_quads); + if (m_pixels > 1000000000) + printf("Total pixels = %d%09d\n", (UINT32)(m_pixels / 1000000000), (UINT32)(m_pixels % 1000000000)); + else + printf("Total pixels = %d\n", (UINT32)m_pixels); + + printf("Conflicts: %d resolved, %d total\n", resolved, conflicts); + printf("Units: %5d used, %5d allocated, %5d waits, %4d bytes each, %7d total\n", m_unit.max(), m_unit.allocated(), m_unit.waits(), m_unit.itemsize(), m_unit.allocated() * m_unit.itemsize()); + printf("Polygons: %5d used, %5d allocated, %5d waits, %4d bytes each, %7d total\n", m_polygon.max(), m_polygon.allocated(), m_polygon.waits(), m_polygon.itemsize(), m_polygon.allocated() * m_polygon.itemsize()); + printf("Object data: %5d used, %5d allocated, %5d waits, %4d bytes each, %7d total\n", m_object.max(), m_object.allocated(), m_object.waits(), m_object.itemsize(), m_object.allocated() * m_object.itemsize()); +} +#endif + + // free the work queue + if (m_queue != NULL) + osd_work_queue_free(m_queue); +} + + +//------------------------------------------------- +// work_item_callback - process a work item +//------------------------------------------------- + +template +void *poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::work_item_callback(void *param, int threadid) +{ + while (1) + { + work_unit &unit = *(work_unit *)param; + polygon_info &polygon = *unit.polygon; + int count = unit.count_next & 0xffff; + UINT32 orig_count_next; + + // if our previous item isn't done yet, enqueue this item to the end and proceed + if (unit.previtem != 0xffff) + { + work_unit &prevunit = polygon.m_owner->m_unit[unit.previtem]; + if (prevunit.count_next != 0) + { + UINT32 unitnum = polygon.m_owner->m_unit.indexof(unit); + UINT32 new_count_next; + + // attempt to atomically swap in this new value + do + { + orig_count_next = prevunit.count_next; + new_count_next = orig_count_next | (unitnum << 16); + } while (compare_exchange32((volatile INT32 *)&prevunit.count_next, orig_count_next, new_count_next) != orig_count_next); + +#if KEEP_STATISTICS + // track resolved conflicts + polygon.m_owner->m_conflicts[threadid]++; + if (orig_count_next != 0) + polygon.m_owner->m_resolved[threadid]++; +#endif + // if we succeeded, skip out early so we can do other work + if (orig_count_next != 0) + break; + } + } + + // iterate over extents + for (int curscan = 0; curscan < count; curscan++) + polygon.m_callback(unit.scanline + curscan, unit.extent[curscan], *polygon.m_object, threadid); + + // set our count to 0 and re-fetch the original count value + do + { + orig_count_next = unit.count_next; + } while (compare_exchange32((volatile INT32 *)&unit.count_next, orig_count_next, 0) != orig_count_next); + + // if we have no more work to do, do nothing + orig_count_next >>= 16; + if (orig_count_next == 0) + break; + param = &polygon.m_owner->m_unit[orig_count_next]; + } + return NULL; +} + + +//------------------------------------------------- +// wait - stall until all work is complete +//------------------------------------------------- + +template +void poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::wait(const char *debug_reason) +{ + osd_ticks_t time; + + // remember the start time if we're logging + if (LOG_WAITS) + time = get_profile_ticks(); + + // wait for all pending work items to complete + if (m_queue != NULL) + osd_work_queue_wait(m_queue, osd_ticks_per_second() * 100); + + // if we don't have a queue, just run the whole list now + else + for (int unitnum = 0; unitnum < m_unit.count(); unitnum++) + work_item_callback(&m_unit[unitnum], 0); + + // log any long waits + if (LOG_WAITS) + { + time = get_profile_ticks() - time; + if (time > LOG_WAIT_THRESHOLD) + logerror("Poly:Waited %d cycles for %s\n", (int)time, debug_reason); + } + + // reset the state + m_polygon.reset(); + m_unit.reset(); + memset(m_unit_bucket, 0xff, sizeof(m_unit_bucket)); + + // we need to preserve the last object data that was supplied + if (m_object.count() > 0) + { + _ObjectData temp = object_data_last(); + m_object.reset(); + m_object.next() = temp; + } + else + m_object.reset(); +} + + +//------------------------------------------------- +// object_data_alloc - allocate a new _ObjectData +//------------------------------------------------- + +template +_ObjectData &poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::object_data_alloc() +{ + // wait for a work item if we have to, then return the next item + m_object.wait_for_space(); + return m_object.next(); +} + + +//------------------------------------------------- +// render_tile - render a tile +//------------------------------------------------- + +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_tile(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &_v1, const vertex_t &_v2) +{ + const vertex_t *v1 = &_v1; + const vertex_t *v2 = &_v2; + + // first sort by Y + if (v2->y < v1->y) + { + const vertex_t *tv = v1; + v1 = v2; + v2 = tv; + } + + // compute some integral X/Y vertex values + INT32 v1y = round_coordinate(v1->y); + INT32 v2y = round_coordinate(v2->y); + + // clip coordinates + INT32 v1yclip = v1y; + INT32 v2yclip = v2y + ((m_flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); + v1yclip = MAX(v1yclip, cliprect.min_y); + v2yclip = MIN(v2yclip, cliprect.max_y + 1); + if (v2yclip - v1yclip <= 0) + return 0; + + // determine total X extents + _BaseType minx = v1->x; + _BaseType maxx = v2->x; + if (minx > maxx) + return 0; + + // allocate and populate a new polygon + polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v2yclip, callback); + + // compute parameter deltas + _BaseType param_dpdx[_MaxParams]; + _BaseType param_dpdy[_MaxParams]; + if (paramcount > 0) + { + _BaseType oox = poly_recip(v2->x - v1->x); + _BaseType ooy = poly_recip(v2->y - v1->y); + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + param_dpdx[paramnum] = oox * (v2->p[paramnum] - v1->p[paramnum]); + param_dpdy[paramnum] = ooy * (v2->p[paramnum] - v1->p[paramnum]); + } + } + + // clamp to full pixels + INT32 istartx = round_coordinate(v1->x); + INT32 istopx = round_coordinate(v2->x); + + // force start < stop + if (istartx > istopx) + { + INT32 temp = istartx; + istartx = istopx; + istopx = temp; + } + + // include the right edge if requested + if (m_flags & POLYFLAG_INCLUDE_RIGHT_EDGE) + istopx++; + + // apply left/right clipping + if (istartx < cliprect.min_x) + istartx = cliprect.min_x; + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; + if (istartx >= istopx) + return 0; + + // compute the X extents for each scanline + INT32 pixels = 0; + UINT32 startunit = m_unit.count(); + INT32 scaninc = 1; + for (INT32 curscan = v1yclip; curscan < v2yclip; curscan += scaninc) + { + UINT32 bucketnum = ((UINT32)curscan / SCANLINES_PER_BUCKET) % TOTAL_BUCKETS; + UINT32 unit_index = m_unit.count(); + work_unit &unit = m_unit.next(); + + // determine how much to advance to hit the next bucket + scaninc = SCANLINES_PER_BUCKET - (UINT32)curscan % SCANLINES_PER_BUCKET; + + // fill in the work unit basics + unit.polygon = &polygon; + unit.count_next = MIN(v2yclip - curscan, scaninc); + unit.scanline = curscan; + unit.previtem = m_unit_bucket[bucketnum]; + m_unit_bucket[bucketnum] = unit_index; + + // iterate over extents + for (int extnum = 0; extnum < unit.count_next; extnum++) + { + // compute the ending X based on which part of the triangle we're in + _BaseType fully = _BaseType(curscan + extnum) + _BaseType(0.5); + + // set the extent and update the total pixel count + extent_t &extent = unit.extent[extnum]; + extent.startx = istartx; + extent.stopx = istopx; + pixels += istopx - istartx; + + // fill in the parameters for the extent + _BaseType fullstartx = _BaseType(istartx) + _BaseType(0.5); + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + extent.param[paramnum].start = v1->p[paramnum] + fullstartx * param_dpdx[paramnum] + fully * param_dpdy[paramnum]; + extent.param[paramnum].dpdx = param_dpdx[paramnum]; + } + } + } + + // enqueue the work items + if (m_queue != NULL) + osd_work_item_queue_multiple(m_queue, work_item_callback, m_unit.count() - startunit, &m_unit[startunit], m_unit.itemsize(), WORK_ITEM_FLAG_AUTO_RELEASE); + + // return the total number of pixels in the triangle + m_tiles++; + m_pixels += pixels; + return pixels; +} + + +//------------------------------------------------- +// render_triangle - render a single triangle +// given 3 vertexes +//------------------------------------------------- + +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_triangle(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &_v1, const vertex_t &_v2, const vertex_t &_v3) +{ + const vertex_t *v1 = &_v1; + const vertex_t *v2 = &_v2; + const vertex_t *v3 = &_v3; + + // first sort by Y + if (v2->y < v1->y) + { + const vertex_t *tv = v1; + v1 = v2; + v2 = tv; + } + if (v3->y < v2->y) + { + const vertex_t *tv = v2; + v2 = v3; + v3 = tv; + if (v2->y < v1->y) + { + const vertex_t *tv = v1; + v1 = v2; + v2 = tv; + } + } + + // compute some integral X/Y vertex values + INT32 v1y = round_coordinate(v1->y); + INT32 v3y = round_coordinate(v3->y); + + // clip coordinates + INT32 v1yclip = v1y; + INT32 v3yclip = v3y + ((m_flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); + v1yclip = MAX(v1yclip, cliprect.min_y); + v3yclip = MIN(v3yclip, cliprect.max_y + 1); + if (v3yclip - v1yclip <= 0) + return 0; + + // determine total X extents + _BaseType minx = v1->x; + _BaseType maxx = v1->x; + if (v2->x < minx) minx = v2->x; + else if (v2->x > maxx) maxx = v2->x; + if (v3->x < minx) minx = v3->x; + else if (v3->x > maxx) maxx = v3->x; + + // allocate and populate a new polygon + polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), v1yclip, v3yclip, callback); + + // compute the slopes for each portion of the triangle + _BaseType dxdy_v1v2 = (v2->y == v1->y) ? _BaseType(0.0) : (v2->x - v1->x) / (v2->y - v1->y); + _BaseType dxdy_v1v3 = (v3->y == v1->y) ? _BaseType(0.0) : (v3->x - v1->x) / (v3->y - v1->y); + _BaseType dxdy_v2v3 = (v3->y == v2->y) ? _BaseType(0.0) : (v3->x - v2->x) / (v3->y - v2->y); + + // compute parameter starting points and deltas + _BaseType param_start[_MaxParams]; + _BaseType param_dpdx[_MaxParams]; + _BaseType param_dpdy[_MaxParams]; + if (paramcount > 0) + { + _BaseType a00 = v2->y - v3->y; + _BaseType a01 = v3->x - v2->x; + _BaseType a02 = v2->x*v3->y - v3->x*v2->y; + _BaseType a10 = v3->y - v1->y; + _BaseType a11 = v1->x - v3->x; + _BaseType a12 = v3->x*v1->y - v1->x*v3->y; + _BaseType a20 = v1->y - v2->y; + _BaseType a21 = v2->x - v1->x; + _BaseType a22 = v1->x*v2->y - v2->x*v1->y; + _BaseType det = a02 + a12 + a22; + + if (poly_abs(det) < _BaseType(0.00001)) + { + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + param_dpdx[paramnum] = _BaseType(0.0); + param_dpdy[paramnum] = _BaseType(0.0); + param_start[paramnum] = v1->p[paramnum]; + } + } + else + { + _BaseType idet = poly_recip(det); + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + param_dpdx[paramnum] = idet * (v1->p[paramnum]*a00 + v2->p[paramnum]*a10 + v3->p[paramnum]*a20); + param_dpdy[paramnum] = idet * (v1->p[paramnum]*a01 + v2->p[paramnum]*a11 + v3->p[paramnum]*a21); + param_start[paramnum] = idet * (v1->p[paramnum]*a02 + v2->p[paramnum]*a12 + v3->p[paramnum]*a22); + } + } + } + + // compute the X extents for each scanline + INT32 pixels = 0; + UINT32 startunit = m_unit.count(); + INT32 scaninc = 1; + for (INT32 curscan = v1yclip; curscan < v3yclip; curscan += scaninc) + { + UINT32 bucketnum = ((UINT32)curscan / SCANLINES_PER_BUCKET) % TOTAL_BUCKETS; + UINT32 unit_index = m_unit.count(); + work_unit &unit = m_unit.next(); + + // determine how much to advance to hit the next bucket + scaninc = SCANLINES_PER_BUCKET - (UINT32)curscan % SCANLINES_PER_BUCKET; + + // fill in the work unit basics + unit.polygon = &polygon; + unit.count_next = MIN(v3yclip - curscan, scaninc); + unit.scanline = curscan; + unit.previtem = m_unit_bucket[bucketnum]; + m_unit_bucket[bucketnum] = unit_index; + + // iterate over extents + for (int extnum = 0; extnum < unit.count_next; extnum++) + { + // compute the ending X based on which part of the triangle we're in + _BaseType fully = _BaseType(curscan + extnum) + _BaseType(0.5); + _BaseType startx = v1->x + (fully - v1->y) * dxdy_v1v3; + _BaseType stopx; + if (fully < v2->y) + stopx = v1->x + (fully - v1->y) * dxdy_v1v2; + else + stopx = v2->x + (fully - v2->y) * dxdy_v2v3; + + // clamp to full pixels + INT32 istartx = round_coordinate(startx); + INT32 istopx = round_coordinate(stopx); + + // force start < stop + if (istartx > istopx) + { + INT32 temp = istartx; + istartx = istopx; + istopx = temp; + } + + // include the right edge if requested + if (m_flags & POLYFLAG_INCLUDE_RIGHT_EDGE) + istopx++; + + // apply left/right clipping + if (istartx < cliprect.min_x) + istartx = cliprect.min_x; + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; + + // set the extent and update the total pixel count + if (istartx >= istopx) + istartx = istopx = 0; + extent_t &extent = unit.extent[extnum]; + extent.startx = istartx; + extent.stopx = istopx; + pixels += istopx - istartx; + + // fill in the parameters for the extent + _BaseType fullstartx = _BaseType(istartx) + _BaseType(0.5); + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + extent.param[paramnum].start = param_start[paramnum] + fullstartx * param_dpdx[paramnum] + fully * param_dpdy[paramnum]; + extent.param[paramnum].dpdx = param_dpdx[paramnum]; + } + } + } + + // enqueue the work items + if (m_queue != NULL) + osd_work_item_queue_multiple(m_queue, work_item_callback, m_unit.count() - startunit, &m_unit[startunit], m_unit.itemsize(), WORK_ITEM_FLAG_AUTO_RELEASE); + + // return the total number of pixels in the triangle + m_triangles++; + m_pixels += pixels; + return pixels; +} + + +//------------------------------------------------- +// render_triangle_fan - render a set of +// triangles in a fan +//------------------------------------------------- + +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_triangle_fan(const rectangle &cliprect, render_delegate callback, int paramcount, int numverts, const vertex_t *v) +{ + // iterate over vertices + UINT32 pixels = 0; + for (int vertnum = 2; vertnum < numverts; vertnum++) + pixels += render_triangle(cliprect, callback, paramcount, v[0], v[vertnum - 1], v[vertnum]); + return pixels; +} + + +//------------------------------------------------- +// render_triangle_strip - render a set of +// triangles in a strip +//------------------------------------------------- + +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_triangle_strip(const rectangle &cliprect, render_delegate callback, int paramcount, int numverts, const vertex_t *v) +{ + // iterate over vertices + UINT32 pixels = 0; + for (int vertnum = 2; vertnum < numverts; vertnum++) + pixels += render_triangle(cliprect, callback, paramcount, v[vertnum - 2], v[vertnum - 1], v[vertnum]); + return pixels; +} + + +//------------------------------------------------- +// render_triangle_custom - perform a custom +// render of an object, given specific extents +//------------------------------------------------- + +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_triangle_custom(const rectangle &cliprect, render_delegate callback, int startscanline, int numscanlines, const extent_t *extents) +{ + // clip coordinates + INT32 v1yclip = MAX(startscanline, cliprect.min_y); + INT32 v3yclip = MIN(startscanline + numscanlines, cliprect.max_y + 1); + if (v3yclip - v1yclip <= 0) + return 0; + + // allocate and populate a new polygon + polygon_info &polygon = polygon_alloc(0, 0, v1yclip, v3yclip, callback); + + // compute the X extents for each scanline + INT32 pixels = 0; + UINT32 startunit = m_unit.count(); + INT32 scaninc = 1; + for (INT32 curscan = v1yclip; curscan < v3yclip; curscan += scaninc) + { + UINT32 bucketnum = ((UINT32)curscan / SCANLINES_PER_BUCKET) % TOTAL_BUCKETS; + UINT32 unit_index = m_unit.count(); + work_unit &unit = m_unit.next(); + + // determine how much to advance to hit the next bucket + scaninc = SCANLINES_PER_BUCKET - (UINT32)curscan % SCANLINES_PER_BUCKET; + + // fill in the work unit basics + unit.polygon = &polygon; + unit.count_next = MIN(v3yclip - curscan, scaninc); + unit.scanline = curscan; + unit.previtem = m_unit_bucket[bucketnum]; + m_unit_bucket[bucketnum] = unit_index; + + // iterate over extents + for (int extnum = 0; extnum < unit.count_next; extnum++) + { + const extent_t &srcextent = extents[(curscan + extnum) - startscanline]; + INT32 istartx = srcextent.startx, istopx = srcextent.stopx; + + // force start < stop + if (istartx > istopx) + { + INT32 temp = istartx; + istartx = istopx; + istopx = temp; + } + + // apply left/right clipping + if (istartx < cliprect.min_x) + istartx = cliprect.min_x; + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; + + // set the extent and update the total pixel count + extent_t &extent = unit.extent[extnum]; + extent.startx = istartx; + extent.stopx = istopx; + if (istartx < istopx) + pixels += istopx - istartx; + } + } + + // enqueue the work items + if (m_queue != NULL) + osd_work_item_queue_multiple(m_queue, work_item_callback, m_unit.count() - startunit, &m_unit[startunit], m_unit.itemsize(), WORK_ITEM_FLAG_AUTO_RELEASE); + + // return the total number of pixels in the object + m_triangles++; + m_pixels += pixels; + return pixels; +} + + +//------------------------------------------------- +// render_polygon - render a single polygon up +// to 32 vertices +//------------------------------------------------- + +template +template +UINT32 poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::render_polygon(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t *v) +{ + // determine min/max Y vertices + _BaseType minx = v[0].x; + _BaseType maxx = v[0].x; + int minv = 0; + int maxv = 0; + for (int vertnum = 1; vertnum < _NumVerts; vertnum++) + { + if (v[vertnum].y < v[minv].y) + minv = vertnum; + else if (v[vertnum].y > v[maxv].y) + maxv = vertnum; + if (v[vertnum].x < minx) + minx = v[vertnum].x; + else if (v[vertnum].x > maxx) + maxx = v[vertnum].x; + } + + // determine start/end scanlines + INT32 miny = round_coordinate(v[minv].y); + INT32 maxy = round_coordinate(v[maxv].y); + + // clip coordinates + INT32 minyclip = miny; + INT32 maxyclip = maxy + ((m_flags & POLYFLAG_INCLUDE_BOTTOM_EDGE) ? 1 : 0); + minyclip = MAX(minyclip, cliprect.min_y); + maxyclip = MIN(maxyclip, cliprect.max_y + 1); + if (maxyclip - minyclip <= 0) + return 0; + + // allocate a new polygon + polygon_info &polygon = polygon_alloc(round_coordinate(minx), round_coordinate(maxx), minyclip, maxyclip, callback); + + // walk forward to build up the forward edge list + struct poly_edge + { + poly_edge * next; // next edge in sequence + int index; // index of this edge + const vertex_t * v1; // pointer to first vertex + const vertex_t * v2; // pointer to second vertex + _BaseType dxdy; // dx/dy along the edge + _BaseType dpdy[_MaxParams]; // per-parameter dp/dy values + }; + poly_edge fedgelist[_NumVerts - 1]; + poly_edge *edgeptr = &fedgelist[0]; + for (int curv = minv; curv != maxv; curv = (curv == _NumVerts - 1) ? 0 : (curv + 1)) + { + // set the two vertices + edgeptr->v1 = &v[curv]; + edgeptr->v2 = &v[(curv == _NumVerts - 1) ? 0 : (curv + 1)]; + + // if horizontal, skip altogether + if (edgeptr->v1->y == edgeptr->v2->y) + continue; + + // need dx/dy always, and parameter deltas as necessary + _BaseType ooy = poly_recip(edgeptr->v2->y - edgeptr->v1->y); + edgeptr->dxdy = (edgeptr->v2->x - edgeptr->v1->x) * ooy; + for (int paramnum = 0; paramnum < paramcount; paramnum++) + edgeptr->dpdy[paramnum] = (edgeptr->v2->p[paramnum] - edgeptr->v1->p[paramnum]) * ooy; + edgeptr++; + } + + // walk backward to build up the backward edge list + poly_edge bedgelist[_NumVerts - 1]; + edgeptr = &bedgelist[0]; + for (int curv = minv; curv != maxv; curv = (curv == 0) ? (_NumVerts - 1) : (curv - 1)) + { + // set the two vertices + edgeptr->v1 = &v[curv]; + edgeptr->v2 = &v[(curv == 0) ? (_NumVerts - 1) : (curv - 1)]; + + // if horizontal, skip altogether + if (edgeptr->v1->y == edgeptr->v2->y) + continue; + + // need dx/dy always, and parameter deltas as necessary + _BaseType ooy = poly_recip(edgeptr->v2->y - edgeptr->v1->y); + edgeptr->dxdy = (edgeptr->v2->x - edgeptr->v1->x) * ooy; + for (int paramnum = 0; paramnum < paramcount; paramnum++) + edgeptr->dpdy[paramnum] = (edgeptr->v2->p[paramnum] - edgeptr->v1->p[paramnum]) * ooy; + edgeptr++; + } + + // determine which list is left/right: + // if the first vertex is shared, compare the slopes + // if the first vertex is not shared, compare the X coordinates + const poly_edge *ledge, *redge; + if ((fedgelist[0].v1 == bedgelist[0].v1 && fedgelist[0].dxdy < bedgelist[0].dxdy) || + (fedgelist[0].v1 != bedgelist[0].v1 && fedgelist[0].v1->x < bedgelist[0].v1->x)) + { + ledge = fedgelist; + redge = bedgelist; + } + else + { + ledge = bedgelist; + redge = fedgelist; + } + + // compute the X extents for each scanline + INT32 pixels = 0; + UINT32 startunit = m_unit.count(); + INT32 scaninc = 1; + for (INT32 curscan = minyclip; curscan < maxyclip; curscan += scaninc) + { + UINT32 bucketnum = ((UINT32)curscan / SCANLINES_PER_BUCKET) % TOTAL_BUCKETS; + UINT32 unit_index = m_unit.count(); + work_unit &unit = m_unit.next(); + + // determine how much to advance to hit the next bucket + scaninc = SCANLINES_PER_BUCKET - (UINT32)curscan % SCANLINES_PER_BUCKET; + + // fill in the work unit basics + unit.polygon = &polygon; + unit.count_next = MIN(maxyclip - curscan, scaninc); + unit.scanline = curscan; + unit.previtem = m_unit_bucket[bucketnum]; + m_unit_bucket[bucketnum] = unit_index; + + // iterate over extents + for (int extnum = 0; extnum < unit.count_next; extnum++) + { + // compute the ending X based on which part of the triangle we're in + _BaseType fully = _BaseType(curscan + extnum) + _BaseType(0.5); + while (fully > ledge->v2->y && fully < v[maxv].y) + ledge++; + while (fully > redge->v2->y && fully < v[maxv].y) + redge++; + _BaseType startx = ledge->v1->x + (fully - ledge->v1->y) * ledge->dxdy; + _BaseType stopx = redge->v1->x + (fully - redge->v1->y) * redge->dxdy; + + // clamp to full pixels + INT32 istartx = round_coordinate(startx); + INT32 istopx = round_coordinate(stopx); + + // compute parameter starting points and deltas + extent_t &extent = unit.extent[extnum]; + if (paramcount > 0) + { + _BaseType ldy = fully - ledge->v1->y; + _BaseType rdy = fully - redge->v1->y; + _BaseType oox = poly_recip(stopx - startx); + + // iterate over parameters + for (int paramnum = 0; paramnum < paramcount; paramnum++) + { + _BaseType lparam = ledge->v1->p[paramnum] + ldy * ledge->dpdy[paramnum]; + _BaseType rparam = redge->v1->p[paramnum] + rdy * redge->dpdy[paramnum]; + _BaseType dpdx = (rparam - lparam) * oox; + + extent.param[paramnum].start = lparam;// - (_BaseType(istartx) + 0.5f) * dpdx; + extent.param[paramnum].dpdx = dpdx; + } + } + + // include the right edge if requested + if (m_flags & POLYFLAG_INCLUDE_RIGHT_EDGE) + istopx++; + + // apply left/right clipping + if (istartx < cliprect.min_x) + { + for (int paramnum = 0; paramnum < paramcount; paramnum++) + extent.param[paramnum].start += (cliprect.min_x - istartx) * extent.param[paramnum].dpdx; + istartx = cliprect.min_x; + } + if (istopx > cliprect.max_x) + istopx = cliprect.max_x + 1; + + // set the extent and update the total pixel count + if (istartx >= istopx) + istartx = istopx = 0; + extent.startx = istartx; + extent.stopx = istopx; + pixels += istopx - istartx; + } + } + + // enqueue the work items + if (m_queue != NULL) + osd_work_item_queue_multiple(m_queue, work_item_callback, m_unit.count() - startunit, &m_unit[startunit], m_unit.itemsize(), WORK_ITEM_FLAG_AUTO_RELEASE); + + // return the total number of pixels in the triangle + m_quads++; + m_pixels += pixels; + return pixels; +} + + +//------------------------------------------------- +// zclip_if_less - clip a polygon using p[0] as +// a z coordinate +//------------------------------------------------- + +template +int poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::zclip_if_less(int numverts, const vertex_t *v, vertex_t *outv, int paramcount, _BaseType clipval) +{ + bool prevclipped = (v[numverts - 1]->p[0] < clipval); + vertex_t *nextout = outv; + + // iterate over vertices + for (int vertnum = 0; vertnum < numverts; vertnum++) + { + bool thisclipped = (v[vertnum]->p[0] < clipval); + + // if we switched from clipped to non-clipped, interpolate a vertex + if (thisclipped != prevclipped) + { + const vertex_t &v1 = v[(vertnum == 0) ? (numverts - 1) : (vertnum - 1)]; + const vertex_t &v2 = v[vertnum]; + _BaseType frac = (clipval - v1.p[0]) / (v2.p[0] - v1.p[0]); + nextout.x = v1.x + frac * (v2.x - v1.x); + nextout.y = v1.y + frac * (v2.y - v1.y); + for (int paramnum = 0; paramnum < paramcount; paramnum++) + nextout.p[paramnum] = v1.p[paramnum] + frac * (v2.p[paramnum] - v1.p[paramnum]); + nextout++; + } + + // if this vertex is not clipped, copy it in + if (!thisclipped) + *nextout++ = v[vertnum]; + + // remember the last state + prevclipped = thisclipped; + } + return nextout - outv; +} + +#endif // __POLYNEW_H__ diff -Nru mame-0.144/src/emu/video/psx.c mame-0.145/src/emu/video/psx.c --- mame-0.144/src/emu/video/psx.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/psx.c 2012-02-06 21:30:27.000000000 +0000 @@ -116,7 +116,7 @@ m_debug.b_clear = 1; m_debug.n_coord = 0; m_debug.n_skip = 0; - m_debug.mesh = auto_bitmap_alloc( machine(), width, height, BITMAP_FORMAT_INDEXED16 ); + m_debug.mesh = auto_bitmap_ind16_alloc( machine(), width, height ); } void psxgpu_device::DebugMesh( int n_coordx, int n_coordy ) @@ -129,7 +129,7 @@ if( m_debug.b_clear ) { - bitmap_fill( m_debug.mesh, NULL , 0x0000); + m_debug.mesh->fill(0x0000); m_debug.b_clear = 0; } @@ -225,8 +225,8 @@ (INT16)n_x.w.h <= width - 1 && (INT16)n_y.w.h <= height - 1 ) { - if( *BITMAP_ADDR16(m_debug.mesh, n_y.w.h, n_x.w.h) != 0xffff ) - *BITMAP_ADDR16(m_debug.mesh, n_y.w.h, n_x.w.h) = n_colour; + if( m_debug.mesh->pix16(n_y.w.h, n_x.w.h) != 0xffff ) + m_debug.mesh->pix16(n_y.w.h, n_x.w.h) = n_colour; } n_x.d += n_dx; n_y.d += n_dy; @@ -317,17 +317,17 @@ #endif } -int psxgpu_device::DebugMeshDisplay( bitmap_t *bitmap, const rectangle *cliprect ) +int psxgpu_device::DebugMeshDisplay( bitmap_ind16 &bitmap, const rectangle &cliprect ) { if( m_debug.mesh ) { - copybitmap( bitmap, m_debug.mesh, 0, 0, 0, 0, cliprect ); + copybitmap( bitmap, *m_debug.mesh, 0, 0, 0, 0, cliprect ); } m_debug.b_clear = 1; return m_debug.b_mesh; } -int psxgpu_device::DebugTextureDisplay( bitmap_t *bitmap ) +int psxgpu_device::DebugTextureDisplay( bitmap_ind16 &bitmap ) { UINT32 n_y; @@ -435,9 +435,7 @@ n_screenwidth = 640; break; } - visarea.min_x = visarea.min_y = 0; - visarea.max_x = n_screenwidth - 1; - visarea.max_y = n_screenheight - 1; + visarea.set(0, n_screenwidth - 1, 0, n_screenheight - 1); machine().primary_screen->configure(n_screenwidth, n_screenheight, visarea, HZ_TO_ATTOSECONDS(refresh)); } @@ -600,7 +598,7 @@ machine().save().register_postload( save_prepost_delegate( FUNC( psxgpu_device::updatevisiblearea ), this ) ); } -void psxgpu_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 psxgpu_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT32 n_x; UINT32 n_y; @@ -617,18 +615,18 @@ #if defined( MAME_DEBUG ) if( DebugMeshDisplay( bitmap, cliprect ) ) { - return; + return 0; } if( DebugTextureDisplay( bitmap ) ) { - return; + return 0; } #endif if( ( n_gpustatus & ( 1 << 0x17 ) ) != 0 ) { /* todo: only draw to necessary area */ - bitmap_fill( bitmap, cliprect , 0); + bitmap.fill(0, cliprect); } else { @@ -710,7 +708,7 @@ while( n_line > 0 ) { UINT16 *p_n_src = p_p_vram[ n_y + n_displaystarty ] + ((n_x + n_displaystartx) * 3); - UINT16 *p_n_dest = BITMAP_ADDR16(bitmap, n_y + n_top, n_x + n_left); + UINT16 *p_n_dest = &bitmap.pix16(n_y + n_top, n_x + n_left); n_column = n_columns; while( n_column > 0 ) @@ -743,6 +741,7 @@ } } } + return 0; } #define WRITE_PIXEL( p ) *( p_vram ) = p @@ -3688,21 +3687,19 @@ } } -SCREEN_UPDATE( psx ) +SCREEN_UPDATE_IND16( psx ) { - psxgpu_device *gpu = downcast(screen->owner()); - gpu->update_screen( bitmap, cliprect ); - return 0; + psxgpu_device *gpu = downcast(screen.owner()); + return gpu->update_screen( screen, bitmap, cliprect ); } MACHINE_CONFIG_FRAGMENT( psxgpu ) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( 60 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC( 0 )) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 1024, 1024 ) MCFG_SCREEN_VISIBLE_AREA( 0, 639, 0, 479 ) - MCFG_SCREEN_UPDATE( psx ) + MCFG_SCREEN_UPDATE_STATIC( psx ) ((screen_device *)device)->register_vblank_callback(vblank_state_delegate(FUNC(psxgpu_device::vblank), (psxgpu_device *) owner)); MCFG_PALETTE_LENGTH( 65536 ) diff -Nru mame-0.144/src/emu/video/psx.h mame-0.145/src/emu/video/psx.h --- mame-0.144/src/emu/video/psx.h 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/psx.h 2012-02-06 21:30:27.000000000 +0000 @@ -47,7 +47,7 @@ typedef struct _psx_gpu_debug psx_gpu_debug; struct _psx_gpu_debug { - bitmap_t *mesh; + bitmap_ind16 *mesh; int b_clear; int b_mesh; int n_skip; @@ -181,7 +181,7 @@ psxgpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); virtual machine_config_constructor device_mconfig_additions() const; - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); WRITE32_MEMBER( write ); READ32_MEMBER( read ); void dma_read( UINT32 n_address, INT32 n_size ); @@ -221,8 +221,8 @@ void DebugMesh( int n_coordx, int n_coordy ); void DebugMeshEnd( void ); void DebugCheckKeys( void ); - int DebugMeshDisplay( bitmap_t *bitmap, const rectangle *cliprect ); - int DebugTextureDisplay( bitmap_t *bitmap ); + int DebugMeshDisplay( bitmap_ind16 &bitmap, const rectangle &cliprect ); + int DebugTextureDisplay( bitmap_ind16 &bitmap ); #endif INT32 m_n_tx; diff -Nru mame-0.144/src/emu/video/ramdac.c mame-0.145/src/emu/video/ramdac.c --- mame-0.144/src/emu/video/ramdac.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/ramdac.c 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,212 @@ +/*************************************************************************** + + Generic Palette RAMDAC device + + Written by Angelo Salese + + TODO: + - masking register + - needs information about different models and what exactly they does + +***************************************************************************/ + +#include "emu.h" +#include "video/ramdac.h" + +// default address map +static ADDRESS_MAP_START( ramdac_palram, AS_0, 8 ) + AM_RANGE(0x000, 0x0ff) AM_RAM // R bank + AM_RANGE(0x100, 0x1ff) AM_RAM // G bank + AM_RANGE(0x200, 0x2ff) AM_RAM // B bank + AM_RANGE(0x300, 0x3ff) AM_NOP +ADDRESS_MAP_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type RAMDAC = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// ramdac_device - constructor +//------------------------------------------------- + +ramdac_device::ramdac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, RAMDAC, "ramdac", tag, owner, clock), + device_memory_interface(mconfig, *this), + m_space_config("videoram", ENDIANNESS_LITTLE, 8, 10, 0, NULL, *ADDRESS_MAP_NAME(ramdac_palram)) +{ + +} + +//------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *ramdac_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == AS_0) ? &m_space_config : NULL; +} + +//------------------------------------------------- +// readbyte - read a byte at the given address +//------------------------------------------------- + +inline UINT8 ramdac_device::readbyte(offs_t address) +{ + return space()->read_byte(address); +} + + +//------------------------------------------------- +// writebyte - write a byte at the given address +//------------------------------------------------- + +inline void ramdac_device::writebyte(offs_t address, UINT8 data) +{ + space()->write_byte(address, data); +} + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void ramdac_device::device_config_complete() +{ + // inherit a copy of the static data + const ramdac_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; + + // or initialize to defaults if none provided + else + { + // ... + } +} + + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void ramdac_device::device_validity_check(validity_checker &valid) const +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ramdac_device::device_start() +{ + m_palram = auto_alloc_array_clear(machine(), UINT8, 1 << 10); + +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void ramdac_device::device_reset() +{ + m_pal_index[0] = 0; + m_int_index[0] = 0; + m_pal_index[1] = 0; + m_int_index[1] = 0; + m_pal_mask = 0xff; +} + + +//************************************************************************** +// READ/WRITE HANDLERS +// [0] = W register, [1] = R register +//************************************************************************** + +inline void ramdac_device::reg_increment(UINT8 inc_type) +{ + m_int_index[inc_type]++; + if(m_int_index[inc_type] == 3) + { + m_int_index[inc_type] = 0; + m_pal_index[inc_type]++; + } +} + +READ8_MEMBER( ramdac_device::index_r ) +{ + return m_pal_index[0]; +} + +WRITE8_MEMBER( ramdac_device::index_w ) +{ + m_pal_index[0] = data; + m_int_index[0] = 0; +} + +WRITE8_MEMBER( ramdac_device::index_r_w ) +{ + m_pal_index[1] = data; + m_int_index[1] = 0; +} + +READ8_MEMBER( ramdac_device::pal_r ) +{ + UINT8 res; + res = readbyte(m_pal_index[m_split_read_reg] | (m_int_index[m_split_read_reg] << 8)); + reg_increment(m_split_read_reg); + return res; +} + +WRITE8_MEMBER( ramdac_device::pal_w ) +{ + writebyte(m_pal_index[0] | (m_int_index[0] << 8),data); + reg_increment(0); +} + +WRITE8_MEMBER( ramdac_device::mask_w ) +{ + m_pal_mask = data; +} + + +//************************************************************************** +// Generic bank read/write handlers +//************************************************************************** + +READ8_MEMBER( ramdac_device::ramdac_pal_r ) +{ + return m_palram[offset]; +} + +WRITE8_MEMBER( ramdac_device::ramdac_rgb666_w ) +{ + UINT16 pal_offs; + + m_palram[offset] = data & 0x3f; + pal_offs = (offset & 0xff); + + palette_set_color_rgb(machine(),offset&0xff,pal6bit(m_palram[pal_offs|0x000]),pal6bit(m_palram[pal_offs|0x100]),pal6bit(m_palram[pal_offs|0x200])); +} + +WRITE8_MEMBER( ramdac_device::ramdac_rgb888_w ) +{ + UINT16 pal_offs; + + m_palram[offset] = data; + pal_offs = (offset & 0xff); + + palette_set_color_rgb(machine(),offset&0xff,m_palram[pal_offs|0x000],m_palram[pal_offs|0x100],m_palram[pal_offs|0x200]); +} + diff -Nru mame-0.144/src/emu/video/ramdac.h mame-0.145/src/emu/video/ramdac.h --- mame-0.144/src/emu/video/ramdac.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/emu/video/ramdac.h 2012-02-06 21:30:27.000000000 +0000 @@ -0,0 +1,93 @@ +/*************************************************************************** + + Generic Palette RAMDAC device + +***************************************************************************/ + +#pragma once + +#ifndef __ramdacDEV_H__ +#define __ramdacDEV_H__ + +#include "emu.h" + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_RAMDAC_ADD(_tag,_config,_map) \ + MCFG_DEVICE_ADD(_tag, RAMDAC, 0) \ + MCFG_DEVICE_CONFIG(_config) \ + MCFG_DEVICE_ADDRESS_MAP(AS_0, _map) + +#define RAMDAC_INTERFACE(name) \ + const ramdac_interface (name) = + +// ======================> ramdac_interface + +struct ramdac_interface +{ + UINT8 m_split_read_reg; // read register index is separated, seen in rltennis +}; + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> ramdac_device + +class ramdac_device : public device_t, + public device_memory_interface, + public ramdac_interface +{ +public: + // construction/destruction + ramdac_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + DECLARE_READ8_MEMBER( index_r ); + DECLARE_READ8_MEMBER( pal_r ); + DECLARE_WRITE8_MEMBER( index_w ); + DECLARE_WRITE8_MEMBER( index_r_w ); + DECLARE_WRITE8_MEMBER( pal_w ); + DECLARE_WRITE8_MEMBER( mask_w ); + + DECLARE_READ8_MEMBER( ramdac_pal_r ); + DECLARE_WRITE8_MEMBER( ramdac_rgb666_w ); + DECLARE_WRITE8_MEMBER( ramdac_rgb888_w ); + + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); + virtual void device_config_complete(); + inline UINT8 readbyte(offs_t address); + inline void writebyte(offs_t address, UINT8 data); + inline void reg_increment(UINT8 inc_type); + +private: + UINT8 m_pal_index[2]; + UINT8 m_pal_mask; + UINT8 m_int_index[2]; + UINT8 *m_palram; + + const address_space_config m_space_config; +}; + + +// device type definition +extern const device_type RAMDAC; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff -Nru mame-0.144/src/emu/video/s2636.c mame-0.145/src/emu/video/s2636.c --- mame-0.144/src/emu/video/s2636.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/s2636.c 2012-02-06 21:30:27.000000000 +0000 @@ -104,8 +104,8 @@ int y_offset; int x_offset; - bitmap_t *bitmap; - bitmap_t *collision_bitmap; + bitmap_ind16 *bitmap; + bitmap_ind16 *collision_bitmap; }; /************************************* @@ -136,7 +136,7 @@ * *************************************/ -static void draw_sprite( UINT8 *gfx, int color, int y, int x, int expand, int or_mode, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprite( UINT8 *gfx, int color, int y, int x, int expand, int or_mode, bitmap_ind16 &bitmap, const rectangle &cliprect ) { int sy; @@ -162,10 +162,7 @@ int tx = x + sx * (expand + 1) + ex; /* get out if outside the drawing region */ - if ((tx < cliprect->min_x) || - (tx > cliprect->max_x) || - (ty < cliprect->min_y) || - (ty > cliprect->max_y)) + if (!cliprect.contains(tx, ty)) continue; /* get out if current image bit is transparent */ @@ -173,9 +170,9 @@ continue; if (or_mode) - *BITMAP_ADDR16(bitmap, ty, tx) = 0x08 | *BITMAP_ADDR16(bitmap, ty, tx) | color; + bitmap.pix16(ty, tx) = 0x08 | bitmap.pix16(ty, tx) | color; else - *BITMAP_ADDR16(bitmap, ty, tx) = 0x08 | color; + bitmap.pix16(ty, tx) = 0x08 | color; } } } @@ -190,7 +187,7 @@ * *************************************/ -static int check_collision( device_t *device, int spriteno1, int spriteno2, const rectangle *cliprect ) +static int check_collision( device_t *device, int spriteno1, int spriteno2, const rectangle &cliprect ) { s2636_state *s2636 = get_safe_token(device); int checksum = 0; @@ -200,7 +197,7 @@ /* TODO: does not check shadow sprites yet */ - bitmap_fill(s2636->collision_bitmap, cliprect, 0); + s2636->collision_bitmap->fill(0, cliprect); if ((attr1[0x0a] != 0xff) && (attr2[0x0a] != 0xff)) { @@ -215,31 +212,29 @@ int expand2 = (s2636->work_ram[0xc0] >> (spriteno2 << 1)) & 0x03; /* draw first sprite */ - draw_sprite(attr1, 1, y1, x1, expand1, FALSE, s2636->collision_bitmap, cliprect); + draw_sprite(attr1, 1, y1, x1, expand1, FALSE, *s2636->collision_bitmap, cliprect); /* get fingerprint */ for (x = x1; x < x1 + SPRITE_WIDTH; x++) for (y = y1; y < y1 + SPRITE_HEIGHT; y++) { - if ((x < cliprect->min_x) || (x > cliprect->max_x) || - (y < cliprect->min_y) || (y > cliprect->max_y)) + if (!cliprect.contains(x, y)) continue; - checksum = checksum + *BITMAP_ADDR16(s2636->collision_bitmap, y, x); + checksum = checksum + s2636->collision_bitmap->pix16(y, x); } /* black out second sprite */ - draw_sprite(attr2, 0, y2, x2, expand2, FALSE, s2636->collision_bitmap, cliprect); + draw_sprite(attr2, 0, y2, x2, expand2, FALSE, *s2636->collision_bitmap, cliprect); /* remove fingerprint */ for (x = x1; x < x1 + SPRITE_WIDTH; x++) for (y = y1; y < y1 + SPRITE_HEIGHT; y++) { - if ((x < cliprect->min_x) || (x > cliprect->max_x) || - (y < cliprect->min_y) || (y > cliprect->max_y)) + if (!cliprect.contains(x, y)) continue; - checksum = checksum - *BITMAP_ADDR16(s2636->collision_bitmap, y, x); + checksum = checksum - s2636->collision_bitmap->pix16(y, x); } } @@ -254,13 +249,13 @@ * *************************************/ -bitmap_t *s2636_update( device_t *device, const rectangle *cliprect ) +bitmap_ind16 &s2636_update( device_t *device, const rectangle &cliprect ) { s2636_state *s2636 = get_safe_token(device); UINT8 collision = 0; int spriteno; - bitmap_fill(s2636->bitmap, cliprect, 0); + s2636->bitmap->fill(0, cliprect); for (spriteno = 0; spriteno < 4; spriteno++) { @@ -277,7 +272,7 @@ color = (s2636->work_ram[0xc1 + (spriteno >> 1)] >> ((spriteno & 1) ? 0 : 3)) & 0x07; expand = (s2636->work_ram[0xc0] >> (spriteno << 1)) & 0x03; - draw_sprite(attr, color, y, x, expand, TRUE, s2636->bitmap, cliprect); + draw_sprite(attr, color, y, x, expand, TRUE, *s2636->bitmap, cliprect); /* bail if no shadow sprites */ if ((attr[0x0b] == 0xff) || (attr[0x0d] == 0xfe)) @@ -289,7 +284,7 @@ { y = y + SPRITE_HEIGHT + attr[0x0d]; - draw_sprite(attr, color, y, x, expand, TRUE, s2636->bitmap, cliprect); + draw_sprite(attr, color, y, x, expand, TRUE, *s2636->bitmap, cliprect); } } @@ -303,7 +298,7 @@ s2636->work_ram[0xcb] = collision; - return s2636->bitmap; + return *s2636->bitmap; } @@ -360,8 +355,8 @@ s2636->y_offset = intf->y_offset; s2636->work_ram = auto_alloc_array_clear(device->machine(), UINT8, intf->work_ram_size); - s2636->bitmap = auto_bitmap_alloc(device->machine(), width, height, BITMAP_FORMAT_INDEXED16); - s2636->collision_bitmap = auto_bitmap_alloc(device->machine(), width, height, BITMAP_FORMAT_INDEXED16); + s2636->bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height); + s2636->collision_bitmap = auto_bitmap_ind16_alloc(device->machine(), width, height); device->save_item(NAME(s2636->x_offset)); device->save_item(NAME(s2636->y_offset)); diff -Nru mame-0.144/src/emu/video/s2636.h mame-0.145/src/emu/video/s2636.h --- mame-0.144/src/emu/video/s2636.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/s2636.h 2012-02-06 21:30:27.000000000 +0000 @@ -49,11 +49,11 @@ *************************************/ -/* returns a BITMAP_FORMAT_INDEXED16 bitmap the size of the screen +/* returns a BITMAP_FORMAT_IND16 bitmap the size of the screen D0-D2 of each pixel is the pixel color D3 indicates whether the S2636 drew this pixel - 0 = not drawn, 1 = drawn */ -bitmap_t *s2636_update( device_t *device, const rectangle *cliprect ); +bitmap_ind16 &s2636_update( device_t *device, const rectangle &cliprect ); WRITE8_DEVICE_HANDLER( s2636_work_ram_w ); READ8_DEVICE_HANDLER( s2636_work_ram_r ); diff -Nru mame-0.144/src/emu/video/saa5050.c mame-0.145/src/emu/video/saa5050.c --- mame-0.144/src/emu/video/saa5050.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/saa5050.c 2012-02-06 21:30:27.000000000 +0000 @@ -206,7 +206,7 @@ saa5050->frame_count = 0; } -void saa5050_update( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void saa5050_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { saa5050_state *saa5050 = get_safe_token(device); int code, colour; @@ -233,9 +233,9 @@ switch (code) { case 0x00: -#ifndef MESS - blank = 1; // code 0x00 should not display anything, unless HOLDGR is set -#endif + // Temporary hack until proper docs are found + if (saa5050->rev) // This is not ok, but it is done only in case of malzak + blank = 1; // code 0x00 should not display anything, unless HOLDGR is set break; case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: diff -Nru mame-0.144/src/emu/video/saa5050.h mame-0.145/src/emu/video/saa5050.h --- mame-0.144/src/emu/video/saa5050.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/saa5050.h 2012-02-06 21:30:27.000000000 +0000 @@ -41,7 +41,7 @@ DEVICE I/O FUNCTIONS ***************************************************************************/ -void saa5050_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +void saa5050_update(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); void saa5050_frame_advance(device_t *device); GFXDECODE_EXTERN( saa5050 ); diff -Nru mame-0.144/src/emu/video/sed1330.c mame-0.145/src/emu/video/sed1330.c --- mame-0.144/src/emu/video/sed1330.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/sed1330.c 2012-02-06 21:30:27.000000000 +0000 @@ -582,7 +582,7 @@ // draw_text_scanline - //------------------------------------------------- -void sed1330_device::draw_text_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 va) +void sed1330_device::draw_text_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 va) { int sx, x; @@ -599,7 +599,7 @@ { for (x = 0; x < m_crx; x++) { - *BITMAP_ADDR16(bitmap, y, (sx * m_fx) + x) = 1; + bitmap.pix16(y, (sx * m_fx) + x) = 1; } } } @@ -610,7 +610,7 @@ { for (x = 0; x < m_crx; x++) { - *BITMAP_ADDR16(bitmap, y, (sx * m_fx) + x) = 1; + bitmap.pix16(y, (sx * m_fx) + x) = 1; } } } @@ -623,7 +623,7 @@ // draw_graphics_scanline - //------------------------------------------------- -void sed1330_device::draw_graphics_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 va) +void sed1330_device::draw_graphics_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 va) { int sx, x; @@ -633,7 +633,7 @@ for (x = 0; x < m_fx; x++) { - *BITMAP_ADDR16(bitmap, y, (sx * m_fx) + x) = BIT(data, 7); + bitmap.pix16(y, (sx * m_fx) + x) = BIT(data, 7); data <<= 1; } } @@ -644,7 +644,7 @@ // update_graphics - //------------------------------------------------- -void sed1330_device::update_graphics(bitmap_t *bitmap, const rectangle *cliprect) +void sed1330_device::update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect) { } @@ -653,7 +653,7 @@ // update_text - //------------------------------------------------- -void sed1330_device::update_text(bitmap_t *bitmap, const rectangle *cliprect) +void sed1330_device::update_text(bitmap_ind16 &bitmap, const rectangle &cliprect) { int y; @@ -683,10 +683,10 @@ //------------------------------------------------- -// update_screen - +// screen_update - //------------------------------------------------- -void sed1330_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 sed1330_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_d) { @@ -699,4 +699,5 @@ update_text(bitmap, cliprect); } } + return 0; } diff -Nru mame-0.144/src/emu/video/sed1330.h mame-0.145/src/emu/video/sed1330.h --- mame-0.144/src/emu/video/sed1330.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/sed1330.h 2012-02-06 21:30:27.000000000 +0000 @@ -49,7 +49,7 @@ DECLARE_READ8_MEMBER( data_r ); DECLARE_WRITE8_MEMBER( data_w ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -64,10 +64,10 @@ inline void writebyte(offs_t address, UINT8 m_data); inline void increment_csr(); - void draw_text_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 va); - void draw_graphics_scanline(bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 va); - void update_graphics(bitmap_t *bitmap, const rectangle *cliprect); - void update_text(bitmap_t *bitmap, const rectangle *cliprect); + void draw_text_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 va); + void draw_graphics_scanline(bitmap_ind16 &bitmap, const rectangle &cliprect, int y, UINT16 va); + void update_graphics(bitmap_ind16 &bitmap, const rectangle &cliprect); + void update_text(bitmap_ind16 &bitmap, const rectangle &cliprect); private: int m_bf; // busy flag diff -Nru mame-0.144/src/emu/video/tms9927.c mame-0.145/src/emu/video/tms9927.c --- mame-0.144/src/emu/video/tms9927.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/tms9927.c 2012-02-06 21:30:27.000000000 +0000 @@ -188,16 +188,16 @@ } -int tms9927_cursor_bounds(device_t *device, rectangle *bounds) +int tms9927_cursor_bounds(device_t *device, rectangle &bounds) { tms9927_state *tms = get_safe_token(device); int cursorx = CURSOR_CHAR_ADDRESS(tms); int cursory = CURSOR_ROW_ADDRESS(tms); - bounds->min_x = cursorx * tms->hpixels_per_column; - bounds->max_x = bounds->min_x + tms->hpixels_per_column - 1; - bounds->min_y = cursory * SCANS_PER_DATA_ROW(tms); - bounds->max_y = bounds->min_y + SCANS_PER_DATA_ROW(tms) - 1; + bounds.min_x = cursorx * tms->hpixels_per_column; + bounds.max_x = bounds.min_x + tms->hpixels_per_column - 1; + bounds.min_y = cursory * SCANS_PER_DATA_ROW(tms); + bounds.max_y = bounds.min_y + SCANS_PER_DATA_ROW(tms) - 1; return (cursorx < HCOUNT(tms) && cursory <= LAST_DISP_DATA_ROW(tms)); } @@ -240,10 +240,7 @@ /* create a visible area */ /* fix me: how do the offsets fit in here? */ - visarea.min_x = 0; - visarea.max_x = tms->visible_hpix - 1; - visarea.min_y = 0; - visarea.max_y = tms->visible_vpix - 1; + visarea.set(0, tms->visible_hpix - 1, 0, tms->visible_vpix - 1); refresh = HZ_TO_ATTOSECONDS(tms->clock) * tms->total_hpix * tms->total_vpix; diff -Nru mame-0.144/src/emu/video/tms9927.h mame-0.145/src/emu/video/tms9927.h --- mame-0.144/src/emu/video/tms9927.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/tms9927.h 2012-02-06 21:30:27.000000000 +0000 @@ -49,7 +49,7 @@ /* other queries */ int tms9927_screen_reset(device_t *device); int tms9927_upscroll_offset(device_t *device); -int tms9927_cursor_bounds(device_t *device, rectangle *bounds); +int tms9927_cursor_bounds(device_t *device, rectangle &bounds); diff -Nru mame-0.144/src/emu/video/tms9928a.c mame-0.145/src/emu/video/tms9928a.c --- mame-0.144/src/emu/video/tms9928a.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/tms9928a.c 2012-02-06 21:30:27.000000000 +0000 @@ -13,6 +13,8 @@ ** Improved over the years by MESS and MAME teams. ** ** Todo: +** - External VDP input and sync (pin 34/35 on 9918A) +** - Updates during mid-scanline, probably only used in some MSX1 demos ** - Colours are incorrect. [fixed by R Nabet ?] ** - Sprites 8-31 are ghosted/cloned in mode 3 when using less than ** three pattern tables. Exact behaviour is not known. @@ -133,18 +135,37 @@ UINT8 data = m_StatusReg; m_StatusReg = m_FifthSprite; - if (m_INT) { - m_INT = 0; + check_interrupt(); + m_latch = 0; + + return data; +} + + +void tms9928a_device::check_interrupt() +{ + // trigger if vblank and interrupt-enable bits are set + UINT8 b = (m_StatusReg & 0x80 && m_Regs[1] & 0x20) ? 1 : 0; + + if (b != m_INT) + { + m_INT = b; if ( !m_irq_changed.isnull() ) m_irq_changed( m_INT ); } - m_latch = 0; +} - return data; + +void tms9928a_device::update_backdrop() +{ + // update backdrop colour to transparent if EXTVID bit is set + if ((m_Regs[7] & 15) == 0) + palette_set_color(machine(), 0, MAKE_ARGB(m_Regs[0] & 1 ? 0 : 255,0,0,0)); } -void tms9928a_device::change_register(UINT8 reg, UINT8 val) { +void tms9928a_device::change_register(UINT8 reg, UINT8 val) +{ static const UINT8 Mask[8] = { 0x03, 0xfb, 0x0f, 0xff, 0x07, 0x7f, 0x07, 0xff }; static const char *const modes[] = @@ -154,8 +175,8 @@ "Mode 1+3 (BOGUS)", "Mode 2+3 (MULTICOLOR variation)", "Mode 1+2+3 (BOGUS)" }; - UINT8 b; + UINT8 prev = m_Regs[reg]; val &= Mask[reg]; m_Regs[reg] = val; @@ -178,17 +199,12 @@ m_pattern = (m_Regs[4] * 2048) & (m_vram_size - 1); } m_mode = ( (m_reva ? (m_Regs[0] & 2) : 0) | ((m_Regs[1] & 0x10)>>4) | ((m_Regs[1] & 8)>>1)); + if ((val ^ prev) & 1) + update_backdrop(); logerror("TMS9928A('%s'): %s\n", tag(), modes[m_mode]); break; case 1: - /* check for changes in the INT line */ - b = (val & 0x20) && (m_StatusReg & 0x80) ; - if (b != m_INT) - { - m_INT = b; - if ( !m_irq_changed.isnull() ) - m_irq_changed( m_INT ); - } + check_interrupt(); m_mode = ( (m_reva ? (m_Regs[0] & 2) : 0) | ((m_Regs[1] & 0x10)>>4) | ((m_Regs[1] & 8)>>1)); logerror("TMS9928A('%s'): %s\n", tag(), modes[m_mode]); break; @@ -225,7 +241,8 @@ m_spritepattern = (val * 2048) & (m_vram_size - 1); break; case 7: - /* The backdrop is updated at TMS9928A_refresh() */ + if ((val ^ prev) & 15) + update_backdrop(); break; } } @@ -257,21 +274,10 @@ void tms9928a_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - int vpos = m_screen->vpos(); + int raw_vpos = m_screen->vpos(); + int vpos = raw_vpos * m_vertical_size / m_screen->height(); UINT16 BackColour = m_Regs[7] & 15; - UINT16 *p = BITMAP_ADDR16( m_tmpbmp, vpos, 0 ); - - if (!BackColour) - BackColour=1; - - if ( vpos == 0 ) - { - rgb_t oldcolor = palette_get_color(machine(), 0); - - /* note we preserve the alpha here; this is so that it can be controlled independently */ - /* see cliffhgr.c for an example */ - palette_set_color(machine(), 0, (tms9928a_palette[BackColour] & MAKE_ARGB(0,255,255,255)) | (oldcolor & MAKE_ARGB(255,0,0,0))); - } + UINT16 *p = &m_tmpbmp.pix16(vpos); int y = vpos - m_top_border; @@ -281,18 +287,11 @@ for ( int i = 0; i < TMS9928A_TOTAL_HORZ; i++ ) p[i] = BackColour; - /* Check for end of active display */ - if ( y == 192 ) + /* vblank is set 1 line after end of active display */ + if ( y == 193 ) { - UINT8 b; - m_StatusReg |= 0x80; - b = (m_Regs[1] & 0x20) != 0; - if (b != m_INT) { - m_INT = b; - if ( !m_irq_changed.isnull() ) - m_irq_changed( m_INT ); - } + check_interrupt(); } } else @@ -317,8 +316,8 @@ UINT8 charcode = m_vMem[ addr ]; UINT8 pattern = m_vMem[ m_pattern + ( charcode << 3 ) + ( y & 7 ) ]; UINT8 colour = m_vMem[ m_colour + ( charcode >> 3 ) ]; - UINT16 fg = colour >> 4; - UINT16 bg = colour & 15; + UINT16 fg = (colour >> 4) ? (colour >> 4) : BackColour; + UINT16 bg = (colour & 15) ? (colour & 15) : BackColour; for ( int i = 0; i < 8; pattern <<= 1, i++ ) p[x+i] = ( pattern & 0x80 ) ? fg : bg; @@ -330,14 +329,14 @@ //if (vpos==100 ) popmessage("TMS9928A MODE 1"); { UINT16 addr = m_nametbl + ( ( y >> 3 ) * 40 ); - UINT16 fg = m_Regs[7] >> 4; - UINT16 bg = m_Regs[7] & 15; + UINT16 fg = (m_Regs[7] >> 4) ? (m_Regs[7] >> 4) : BackColour; + UINT16 bg = BackColour; - /* Extra 8 pixels left border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 8; x++ ) + /* Extra 6 pixels left border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 6; x++ ) p[x] = bg; - for ( int x = TMS9928A_HORZ_DISPLAY_START + 8; x < TMS9928A_HORZ_DISPLAY_START + 248; x+= 6, addr++ ) + for ( int x = TMS9928A_HORZ_DISPLAY_START + 6; x < TMS9928A_HORZ_DISPLAY_START + 246; x+= 6, addr++ ) { UINT16 charcode = m_vMem[ addr ]; UINT8 pattern = m_vMem[ m_pattern + ( charcode << 3 ) + ( y & 7 ) ]; @@ -346,8 +345,8 @@ p[x+i] = ( pattern & 0x80 ) ? fg : bg; } - /* Extra 8 pixels right border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START + 248; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) + /* Extra 10 pixels right border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START + 246; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) p[x] = bg; } break; @@ -362,8 +361,8 @@ UINT16 charcode = m_vMem[ addr ] + ( ( y >> 6 ) << 8 ); UINT8 pattern = m_vMem[ m_pattern + ( ( charcode & m_patternmask ) << 3 ) + ( y & 7 ) ]; UINT8 colour = m_vMem[ m_colour + ( ( charcode & m_colourmask ) << 3 ) + ( y & 7 ) ]; - UINT16 fg = colour >> 4; - UINT16 bg = colour & 15; + UINT16 fg = (colour >> 4) ? (colour >> 4) : BackColour; + UINT16 bg = (colour & 15) ? (colour & 15) : BackColour; for ( int i = 0; i < 8; pattern <<= 1, i++ ) p[x+i] = ( pattern & 0x80 ) ? fg : bg; @@ -375,14 +374,14 @@ //if (vpos==100) popmessage("TMS9928A MODE1+2"); { UINT16 addr = m_nametbl + ( ( y >> 3 ) * 40 ); - UINT16 fg = m_Regs[7] >> 4; - UINT16 bg = m_Regs[7] & 15; + UINT16 fg = (m_Regs[7] >> 4) ? (m_Regs[7] >> 4) : BackColour; + UINT16 bg = BackColour; - /* Extra 8 pixels left border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 8; x++ ) + /* Extra 6 pixels left border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 6; x++ ) p[x] = bg; - for ( int x = TMS9928A_HORZ_DISPLAY_START + 8; x < TMS9928A_HORZ_DISPLAY_START + 248; x+= 6, addr++ ) + for ( int x = TMS9928A_HORZ_DISPLAY_START + 6; x < TMS9928A_HORZ_DISPLAY_START + 246; x+= 6, addr++ ) { UINT16 charcode = ( m_vMem[ addr ] + ( ( y >> 6 ) << 8 ) ) & m_patternmask; UINT8 pattern = m_vMem[ m_pattern + ( charcode << 3 ) + ( y & 7 ) ]; @@ -391,8 +390,8 @@ p[x+i] = ( pattern & 0x80 ) ? fg : bg; } - /* Extra 8 pixels right border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START + 248; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) + /* Extra 10 pixels right border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START + 246; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) p[x] = bg; } break; @@ -406,8 +405,8 @@ { UINT8 charcode = m_vMem[ addr ]; UINT8 colour = m_vMem[ m_pattern + ( charcode << 3 ) + ( ( y >> 2 ) & 7 ) ]; - UINT16 fg = colour >> 4; - UINT16 bg = colour & 15; + UINT16 fg = (colour >> 4) ? (colour >> 4) : BackColour; + UINT16 bg = (colour & 15) ? (colour & 15) : BackColour; p[x+0] = p[x+1] = p[x+2] = p[x+3] = fg; p[x+4] = p[x+5] = p[x+6] = p[x+7] = bg; @@ -418,21 +417,21 @@ case 5: case 7: /* MODE bogus */ //if (vpos==100 ) popmessage("TMS9928A MODE bogus"); { - UINT16 fg = m_Regs[7] >> 4; - UINT16 bg = m_Regs[7] & 15; + UINT16 fg = (m_Regs[7] >> 4) ? (m_Regs[7] >> 4) : BackColour; + UINT16 bg = BackColour; - /* Extra 8 pixels left border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 8; x++ ) + /* Extra 6 pixels left border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START; x < TMS9928A_HORZ_DISPLAY_START + 6; x++ ) p[x] = bg; - for ( int x = TMS9928A_HORZ_DISPLAY_START + 8; x < TMS9928A_HORZ_DISPLAY_START + 248; x+= 6 ) + for ( int x = TMS9928A_HORZ_DISPLAY_START + 6; x < TMS9928A_HORZ_DISPLAY_START + 246; x+= 6 ) { p[x+0] = p[x+1] = p[x+2] = p[x+3] = fg; p[x+4] = p[x+5] = bg; } - /* Extra 8 pixels right border */ - for ( int x = TMS9928A_HORZ_DISPLAY_START + 248; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) + /* Extra 10 pixels right border */ + for ( int x = TMS9928A_HORZ_DISPLAY_START + 246; x < TMS9928A_HORZ_DISPLAY_START + 256; x++ ) p[x] = bg; } break; @@ -446,8 +445,8 @@ { UINT8 charcode = m_vMem[ addr ]; UINT8 colour = m_vMem[ m_pattern + ( ( ( charcode + ( ( y >> 2 ) & 7 ) + ( ( y >> 6 ) << 8 ) ) & m_patternmask ) << 3 ) ]; - UINT16 fg = colour >> 4; - UINT16 bg = colour & 15; + UINT16 fg = (colour >> 4) ? (colour >> 4) : BackColour; + UINT16 bg = (colour & 15) ? (colour & 15) : BackColour; p[x+0] = p[x+1] = p[x+2] = p[x+3] = fg; p[x+4] = p[x+5] = p[x+6] = p[x+7] = bg; @@ -475,8 +474,7 @@ { int spr_y = m_vMem[ m_spriteattribute + sprattr + 0 ]; - if (!fifth_encountered) - m_FifthSprite = sprattr / 4; + m_FifthSprite = sprattr / 4; /* Stop processing sprites */ if ( spr_y == 208 ) @@ -499,8 +497,11 @@ num_sprites++; /* Fifth sprite encountered? */ - if( num_sprites == 5 ) + if ( num_sprites == 5 ) + { fifth_encountered = true; + break; + } if ( sprite_mag ) pataddr += ( ( ( y - spr_y ) & 0x1F ) >> 1 ); @@ -555,7 +556,7 @@ /* Update sprite overflow bits */ if (~m_StatusReg & 0x40) { - m_StatusReg |= m_FifthSprite; + m_StatusReg = (m_StatusReg & 0xe0) | m_FifthSprite; if (fifth_encountered && ~m_StatusReg & 0x80) m_StatusReg |= 0x40; } @@ -567,13 +568,14 @@ } /* Schedule next callback */ - m_line_timer->adjust( m_screen->time_until_pos( ( vpos + 1 ) % m_screen->height() , 0 ) ); + m_line_timer->adjust( m_screen->time_until_pos( ( raw_vpos + 1 ) % m_screen->height() , 0 ) ); } -void tms9928a_device::update( bitmap_t *bitmap, const rectangle *cliprect ) +UINT32 tms9928a_device::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { copybitmap( bitmap, m_tmpbmp, 0, 0, 0, 0, cliprect ); + return 0; } @@ -601,6 +603,7 @@ assert( m_screen != NULL ); m_top_border = m_50hz ? TMS9928A_VERT_DISPLAY_START_PAL : TMS9928A_VERT_DISPLAY_START_NTSC; + m_vertical_size = m_50hz ? TMS9928A_TOTAL_VERT_PAL : TMS9928A_TOTAL_VERT_NTSC; m_irq_changed.resolve( m_out_int_line, *this ); @@ -608,12 +611,10 @@ m_vMem = auto_alloc_array_clear(machine(), UINT8, m_vram_size); /* back bitmap */ - m_tmpbmp = auto_bitmap_alloc(machine(), TMS9928A_TOTAL_HORZ, TMS9928A_TOTAL_VERT_PAL, m_screen->format()); + m_tmpbmp.allocate(TMS9928A_TOTAL_HORZ, TMS9928A_TOTAL_VERT_PAL); m_line_timer = timer_alloc(TIMER_LINE); - m_LimitSprites = 1; - save_item(NAME(m_Regs[0])); save_item(NAME(m_Regs[1])); save_item(NAME(m_Regs[2])); diff -Nru mame-0.144/src/emu/video/tms9928a.h mame-0.145/src/emu/video/tms9928a.h --- mame-0.144/src/emu/video/tms9928a.h 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/tms9928a.h 2012-02-06 21:30:27.000000000 +0000 @@ -27,10 +27,10 @@ #define __TMS9928A_H__ #include "emu.h" -#include "machine//devhelpr.h" +#include "machine/devhelpr.h" -#define TMS9928A_PALETTE_SIZE 16 +#define TMS9928A_PALETTE_SIZE 16 /* Some defines used in defining the screens */ @@ -56,14 +56,12 @@ #define MCFG_TMS9928A_SCREEN_ADD_NTSC(_screen_tag) \ MCFG_SCREEN_ADD( _screen_tag, RASTER ) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ MCFG_SCREEN_RAW_PARAMS( XTAL_10_738635MHz / 2, TMS9928A_TOTAL_HORZ, TMS9928A_HORZ_DISPLAY_START-12, TMS9928A_HORZ_DISPLAY_START + 256 + 12, \ TMS9928A_TOTAL_VERT_NTSC, TMS9928A_VERT_DISPLAY_START_NTSC - 12, TMS9928A_VERT_DISPLAY_START_NTSC + 192 + 12 ) #define MCFG_TMS9928A_SCREEN_ADD_PAL(_screen_tag) \ MCFG_SCREEN_ADD(_screen_tag, RASTER ) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ MCFG_SCREEN_RAW_PARAMS( XTAL_10_738635MHz / 2, TMS9928A_TOTAL_HORZ, TMS9928A_HORZ_DISPLAY_START-12, TMS9928A_HORZ_DISPLAY_START + 256 + 12, \ TMS9928A_TOTAL_VERT_PAL, TMS9928A_VERT_DISPLAY_START_PAL - 12, TMS9928A_VERT_DISPLAY_START_PAL + 192 + 12 ) @@ -104,7 +102,8 @@ DECLARE_WRITE8_MEMBER( register_write ); /* update the screen */ - void update( bitmap_t *bitmap, const rectangle *cliprect ); + UINT32 screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ); + bitmap_ind16 &get_bitmap() { return m_tmpbmp; } protected: // device-level overrides @@ -118,6 +117,8 @@ private: void change_register(UINT8 reg, UINT8 val); + void check_interrupt(); + void update_backdrop(); static const device_timer_id TIMER_LINE = 0; @@ -146,13 +147,13 @@ const address_space_config m_space_config; UINT8 *m_vMem; - bitmap_t *m_tmpbmp; + bitmap_ind16 m_tmpbmp; emu_timer *m_line_timer; UINT8 m_mode; /* emulation settings */ - int m_LimitSprites; /* max 4 sprites on a row, like original TMS9918A */ int m_top_border; + int m_vertical_size; }; @@ -176,7 +177,7 @@ { public: tms9118_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : tms9928a_device( mconfig, TMS9118, "tms9118", tag, owner, clock, false, false ) { } + : tms9928a_device( mconfig, TMS9118, "tms9118", tag, owner, clock, false, true ) { } }; @@ -184,7 +185,7 @@ { public: tms9128_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : tms9928a_device( mconfig, TMS9128, "tms9128", tag, owner, clock, false, false ) { } + : tms9928a_device( mconfig, TMS9128, "tms9128", tag, owner, clock, false, true ) { } }; @@ -208,7 +209,7 @@ { public: tms9129_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : tms9928a_device( mconfig, TMS9129, "tms9129", tag, owner, clock, true, false ) { } + : tms9928a_device( mconfig, TMS9129, "tms9129", tag, owner, clock, true, true ) { } }; diff -Nru mame-0.144/src/emu/video/upd3301.c mame-0.145/src/emu/video/upd3301.c --- mame-0.144/src/emu/video/upd3301.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/upd3301.c 2012-02-06 21:30:27.000000000 +0000 @@ -169,10 +169,7 @@ rectangle visarea; - visarea.min_x = 0; - visarea.min_y = 0; - visarea.max_x = (m_h * m_width) - 1; - visarea.max_y = (m_l * m_r) - 1; + visarea.set(0, (m_h * m_width) - 1, 0, (m_l * m_r) - 1); if (LOG) { @@ -606,7 +603,7 @@ int csr = m_cm && m_cursor_blink && ((y / m_r) == m_cy) && (sx == m_cx); int gpa = 0; // TODO - m_display_cb(this, m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa); + m_display_cb(this, *m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa); } } @@ -618,12 +615,12 @@ // update_screen - //------------------------------------------------- -void upd3301_device::update_screen(bitmap_t *bitmap, const rectangle *cliprect) +UINT32 upd3301_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { if (m_status & STATUS_VE) { m_y = 0; - m_bitmap = bitmap; + m_bitmap = &bitmap; m_data_fifo_pos = 0; m_attr_fifo_pos = 0; @@ -648,6 +645,7 @@ } else { - bitmap_fill(bitmap, cliprect, get_black_pen(machine())); + bitmap.fill(get_black_pen(machine()), cliprect); } + return 0; } diff -Nru mame-0.144/src/emu/video/upd3301.h mame-0.145/src/emu/video/upd3301.h --- mame-0.144/src/emu/video/upd3301.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/upd3301.h 2012-02-06 21:30:27.000000000 +0000 @@ -66,8 +66,8 @@ // ======================> upd3301_display_pixels_func -typedef void (*upd3301_display_pixels_func)(device_t *device, bitmap_t *bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa); -#define UPD3301_DISPLAY_PIXELS(name) void name(device_t *device, bitmap_t *bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa) +typedef void (*upd3301_display_pixels_func)(device_t *device, bitmap_ind16 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa); +#define UPD3301_DISPLAY_PIXELS(name) void name(device_t *device, bitmap_ind16 &bitmap, int y, int sx, UINT8 cc, UINT8 lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa) // ======================> upd3301_interface @@ -103,7 +103,7 @@ DECLARE_READ_LINE_MEMBER( hrtc_r ); DECLARE_READ_LINE_MEMBER( vrtc_r ); - void update_screen(bitmap_t *bitmap, const rectangle *cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); protected: // device-level overrides @@ -136,7 +136,7 @@ screen_device *m_screen; // screen drawing - bitmap_t *m_bitmap; // bitmap + bitmap_ind16 *m_bitmap; // bitmap int m_y; // current scanline int m_hrtc; // horizontal retrace int m_vrtc; // vertical retrace diff -Nru mame-0.144/src/emu/video/v9938.c mame-0.145/src/emu/video/v9938.c --- mame-0.144/src/emu/video/v9938.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/v9938.c 2012-02-06 21:30:27.000000000 +0000 @@ -20,61 +20,6 @@ #define VERBOSE 0 #define LOG(x) do { if (VERBOSE) logerror x; } while (0) -typedef struct { - /* general */ - int model; - int offset_x, offset_y, visible_y, mode; - /* palette */ - int pal_write_first, cmd_write_first; - UINT8 pal_write, cmd_write; - UINT8 palReg[32], statReg[10], contReg[48], read_ahead; - /* memory */ - UINT16 address_latch; - UINT8 *vram, *vram_exp; - int vram_size; - /* interrupt */ - UINT8 INT; - void (*INTCallback)(running_machine &, int); - int scanline; - /* blinking */ - int blink, blink_count; - /* sprites */ - int sprite_limit; - /* size */ - int size, size_old, size_auto, size_now; - /* mouse */ - UINT8 mx_delta, my_delta; - /* mouse & lightpen */ - UINT8 button_state; - /* palette */ - UINT16 pal_ind16[16]; - UINT16 pal_ind256[256]; - /* render screen */ - screen_device *screen; - /* render bitmap */ - bitmap_t *bitmap; - /* Command unit */ - struct { - int SX,SY; - int DX,DY; - int TX,TY; - int NX,NY; - int MX; - int ASX,ADX,ANX; - UINT8 CL; - UINT8 LO; - UINT8 CM; - UINT8 MXS, MXD; - } MMC; - int VdpOpsCnt; - void (*VdpEngine)(void); -} V9938; - -static UINT16 *pal_indYJK; - -static V9938 vdps[2]; -static V9938 *vdp = NULL; - #define V9938_MODE_TEXT1 (0) #define V9938_MODE_MULTI (1) #define V9938_MODE_GRAPHIC1 (2) @@ -94,13 +39,160 @@ "UNKNOWN" }; -static void v9938_register_write (running_machine &machine, int reg, int data); -static void v9938_update_command (void); -static void v9938_cpu_to_vdp (UINT8 V); -static UINT8 v9938_command_unit_w (UINT8 Op); -static UINT8 v9938_vdp_to_cpu (void); -static void v9938_set_mode (void); -static void v9938_refresh_line (running_machine &machine, bitmap_t *bmp, int line); +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// devices +const device_type V9938 = &device_creator; +const device_type V9958 = &device_creator; + +v99x8_device::v99x8_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, shortname, tag, owner, clock), + m_model(0), + m_offset_x(0), + m_offset_y(0), + m_visible_y(0), + m_mode(0), + m_pal_write_first(0), + m_cmd_write_first(0), + m_pal_write(0), + m_cmd_write(0), + m_read_ahead(0), + m_address_latch(0), + m_vram_exp(NULL), + m_vram_size(0), + m_int_state(0), + m_int_callback_device_name(NULL), + m_scanline(0), + m_blink(0), + m_blink_count(0), + m_sprite_limit(0), + m_size(0), + m_size_old(0), + m_size_auto(0), + m_size_now(0), + m_mx_delta(0), + m_my_delta(0), + m_button_state(0), + m_screen(NULL), + m_screen_name(NULL), + m_vdp_ops_count(0), + m_vdp_engine(NULL) +{ +} + +v9938_device::v9938_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : v99x8_device(mconfig, V9938, "V9938", "v9938", tag, owner, clock) +{ + m_model = MODEL_V9938; +} + +v9958_device::v9958_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : v99x8_device(mconfig, V9938, "V9938", "v9938", tag, owner, clock) +{ + m_model = MODEL_V9958; +} + + +int v99x8_device::interrupt () +{ + int scanline, max, pal, scanline_start; + + update_command (); + + pal = m_cont_reg[9] & 2; + if (pal) scanline_start = 53; else scanline_start = 22; + + // set flags + if (m_scanline == (m_offset_y + scanline_start) ) + { + m_stat_reg[2] &= ~0x40; + } + else if (m_scanline == (m_offset_y + m_visible_y + scanline_start) ) + { + m_stat_reg[2] |= 0x40; + m_stat_reg[0] |= 0x80; + } + + max = (pal) ? 255 : (m_cont_reg[9] & 0x80) ? 234 : 244; + scanline = (m_scanline - scanline_start - m_offset_y); + if ( (scanline >= 0) && (scanline <= max) && + ( ( (scanline + m_cont_reg[23]) & 255) == m_cont_reg[19]) ) + { + m_stat_reg[1] |= 1; + LOG(("V9938: scanline interrupt (%d)\n", scanline)); + } + else + if ( !(m_cont_reg[0] & 0x10) ) m_stat_reg[1] &= 0xfe; + + check_int (); + + // check for start of vblank + if ((pal && (m_scanline == 310)) || + (!pal && (m_scanline == 259))) + interrupt_start_vblank (); + + // render the current line + if ((m_scanline >= scanline_start) && (m_scanline < (212 + 28 + scanline_start))) + { + scanline = (m_scanline - scanline_start) & 255; + + refresh_line (scanline); + } + + max = (m_cont_reg[9] & 2) ? 313 : 262; + if (++m_scanline == max) + m_scanline = 0; + + return m_int_state; +} + +void v99x8_device::set_resolution (int i) +{ + if (i == RENDER_AUTO) + { + m_size_auto = 1; + } + else + { + m_size = i; + m_size_auto = 0; + } +} + +/* + Not really right... won't work with sprites in graphics 7 + and with palette updated mid-screen +*/ +int v99x8_device::get_transpen() +{ + if (m_mode == V9938_MODE_GRAPHIC7) + { + return m_pal_ind256[0]; + } + else + { + return m_pal_ind16[0]; + } +} + +/* + Driver-specific function: update the vdp mouse state +*/ +void v99x8_device::update_mouse_state(int mx_delta, int my_delta, int button_state) +{ + // save button state + m_button_state = (button_state << 6) & 0xc0; + + if ((m_cont_reg[8] & 0xc0) == 0x80) + { // vdp will process mouse deltas only if it is in mouse mode + m_mx_delta += mx_delta; + m_my_delta += my_delta; + } +} + + /*************************************************************************** @@ -140,7 +232,7 @@ { int i; - /* create the full 512 colour palette */ + // create the full 512 colour palette for (i=0;i<512;i++) palette_set_color_rgb(machine, i, pal3bit(i >> 6), pal3bit(i >> 3), pal3bit(i >> 0)); } @@ -151,27 +243,30 @@ The colours are encoded in 17 bits; however there are just 19268 different colours. Here we calculate the palette and a 2^17 reference table to the palette, -which is: pal_indYJK. It's 256K in size, but I can't think of a faster way +which is: s_pal_indYJK. It's 256K in size, but I can't think of a faster way to emulate this. Also it keeps the palette a reasonable size. :) */ +UINT16 *v99x8_device::s_pal_indYJK; + PALETTE_INIT( v9958 ) { int r,g,b,y,j,k,i,k0,j0,n; UINT8 pal[19268*3]; - /* init v9938 512-color palette */ + // init v9938 512-color palette PALETTE_INIT_CALL(v9938); - /* set up YJK table */ - pal_indYJK = auto_alloc_array(machine, UINT16, 0x20000); + if (v99x8_device::s_pal_indYJK == NULL) + v99x8_device::s_pal_indYJK = global_alloc_array(UINT16, 0x20000); + // set up YJK table LOG(("Building YJK table for V9958 screens, may take a while ... \n")); i = 0; for (y=0;y<32;y++) for (k=0;k<64;k++) for (j=0;j<64;j++) { - /* calculate the color */ + // calculate the color if (k >= 32) k0 = (k - 64); else k0 = k; if (j >= 32) j0 = (j - 64); else j0 = j; r = y + j0; @@ -184,13 +279,13 @@ r = (r << 3) | (r >> 2); b = (b << 3) | (b >> 2); g = (g << 3) | (g >> 2); - /* have we seen this one before? */ + // have we seen this one before? n = 0; while (n < i) { if (pal[n*3+0] == r && pal[n*3+1] == g && pal[n*3+2] == b) { - pal_indYJK[y | j << 5 | k << (5 + 6)] = n + 512; + v99x8_device::s_pal_indYJK[y | j << 5 | k << (5 + 6)] = n + 512; break; } n++; @@ -198,12 +293,12 @@ if (i == n) { - /* so we haven't; add it */ + // so we haven't; add it pal[i*3+0] = r; pal[i*3+1] = g; pal[i*3+2] = b; palette_set_color(machine, i+512, MAKE_RGB(r, g, b)); - pal_indYJK[y | j << 5 | k << (5 + 6)] = i + 512; + v99x8_device::s_pal_indYJK[y | j << 5 | k << (5 + 6)] = i + 512; i++; } } @@ -212,6 +307,12 @@ LOG( ("Table creation failed - %d colours out of 19286 created\n", i)); } +UINT32 v99x8_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); + return 0; +} + /* so lookups for screen 12 will look like: @@ -221,361 +322,364 @@ ind = (*data & 7) << 11 | (*(data + 1) & 7) << 14 | (*(data + 2) & 7) << 5 | (*(data + 3) & 7) << 8; - pixel0 = pal_indYJK[ind | (*data >> 3) & 31]; - pixel1 = pal_indYJK[ind | (*(data + 1) >> 3) & 31]; - pixel2 = pal_indYJK[ind | (*(data + 2) >> 3) & 31]; - pixel3 = pal_indYJK[ind | (*(data + 3) >> 3) & 31]; + pixel0 = s_pal_indYJK[ind | (*data >> 3) & 31]; + pixel1 = s_pal_indYJK[ind | (*(data + 1) >> 3) & 31]; + pixel2 = s_pal_indYJK[ind | (*(data + 2) >> 3) & 31]; + pixel3 = s_pal_indYJK[ind | (*(data + 3) >> 3) & 31]; and for screen 11: -pixel0 = (*data) & 8 ? pal_ind16[(*data) >> 4] : pal_indYJK[ind | (*data >> 3) & 30]; -pixel1 = *(data+1) & 8 ? pal_ind16[*(data+1) >> 4] : pal_indYJK[ind | *(data+1) >> 3) & 30]; -pixel2 = *(data+2) & 8 ? pal_ind16[*(data+2) >> 4] : pal_indYJK[ind | *(data+2) >> 3) & 30]; -pixel3 = *(data+3) & 8 ? pal_ind16[*(data+3) >> 4] : pal_indYJK[ind | *(data+3) >> 3) & 30]; +pixel0 = (*data) & 8 ? pal_ind16[(*data) >> 4] : s_pal_indYJK[ind | (*data >> 3) & 30]; +pixel1 = *(data+1) & 8 ? pal_ind16[*(data+1) >> 4] : s_pal_indYJK[ind | *(data+1) >> 3) & 30]; +pixel2 = *(data+2) & 8 ? pal_ind16[*(data+2) >> 4] : s_pal_indYJK[ind | *(data+2) >> 3) & 30]; +pixel3 = *(data+3) & 8 ? pal_ind16[*(data+3) >> 4] : s_pal_indYJK[ind | *(data+3) >> 3) & 30]; */ -static void v9938_palette_w(UINT8 data) +READ8_MEMBER( v99x8_device::read ) +{ + switch (offset & 3) { - int indexp; - - if (vdp->pal_write_first) - { - /* store in register */ - indexp = vdp->contReg[0x10] & 15; - vdp->palReg[indexp*2] = vdp->pal_write & 0x77; - vdp->palReg[indexp*2+1] = data & 0x07; - /* update palette */ - vdp->pal_ind16[indexp] = (((int)vdp->pal_write << 2) & 0x01c0) | - (((int)data << 3) & 0x0038) | - ((int)vdp->pal_write & 0x0007); - - vdp->contReg[0x10] = (vdp->contReg[0x10] + 1) & 15; - vdp->pal_write_first = 0; - } - else - { - vdp->pal_write = data; - vdp->pal_write_first = 1; - } + case 0: return vram_r(); + case 1: return status_r(); } + return 0xff; +} -WRITE8_HANDLER( v9938_0_palette_w ) +WRITE8_MEMBER( v99x8_device::write ) { - vdp = &vdps[0]; - v9938_palette_w(data); + switch (offset & 3) + { + case 0: vram_w(data); break; + case 1: command_w(data); break; + case 2: palette_w(data); break; + case 3: register_w(data); break; + } } -WRITE8_HANDLER( v9938_1_palette_w ) +UINT8 v99x8_device::vram_r() { - vdp = &vdps[1]; - v9938_palette_w(data); -} + UINT8 ret; + int address; -static void v9938_reset_palette (void) - { - /* taken from V9938 Technical Data book, page 148. it's in G-R-B format */ - static const UINT8 pal16[16*3] = { - 0, 0, 0, /* 0: black/transparent */ - 0, 0, 0, /* 1: black */ - 6, 1, 1, /* 2: medium green */ - 7, 3, 3, /* 3: light green */ - 1, 1, 7, /* 4: dark blue */ - 3, 2, 7, /* 5: light blue */ - 1, 5, 1, /* 6: dark red */ - 6, 2, 7, /* 7: cyan */ - 1, 7, 1, /* 8: medium red */ - 3, 7, 3, /* 9: light red */ - 6, 6, 1, /* 10: dark yellow */ - 6, 6, 4, /* 11: light yellow */ - 4, 1, 1, /* 12: dark green */ - 2, 6, 5, /* 13: magenta */ - 5, 5, 5, /* 14: gray */ - 7, 7, 7 /* 15: white */ - }; - int i, red, ind; + address = ((int)m_cont_reg[14] << 14) | m_address_latch; - for (i=0;i<16;i++) - { - /* set the palette registers */ - vdp->palReg[i*2+0] = pal16[i*3+1] << 4 | pal16[i*3+2]; - vdp->palReg[i*2+1] = pal16[i*3]; - /* set the reference table */ - vdp->pal_ind16[i] = pal16[i*3+1] << 6 | pal16[i*3] << 3 | pal16[i*3+2]; - } + m_cmd_write_first = 0; - /* set internal palette GRAPHIC 7 */ - for (i=0;i<256;i++) - { - ind = (i << 4) & 0x01c0; - ind |= (i >> 2) & 0x0038; - red = (i << 1) & 6; if (red == 6) red++; - ind |= red; + ret = m_read_ahead; - vdp->pal_ind256[i] = ind; - } + if (m_cont_reg[45] & 0x40) + { + if ( (m_mode == V9938_MODE_GRAPHIC6) || (m_mode == V9938_MODE_GRAPHIC7) ) + address >>= 1; // correct? + // correct? + if (m_vram_exp && address < 0x10000) + m_read_ahead = m_vram_exp[address]; + else + m_read_ahead = 0xff; + } + else + { + m_read_ahead = vram_read (address); } -/*************************************************************************** + m_address_latch = (m_address_latch + 1) & 0x3fff; + if ((!m_address_latch) && (m_cont_reg[0] & 0x0c) ) // correct ??? + { + m_cont_reg[14] = (m_cont_reg[14] + 1) & 7; + } - Memory functions + return ret; +} -***************************************************************************/ +UINT8 v99x8_device::status_r() +{ + int reg; + UINT8 ret; -static void v9938_vram_write (int offset, int data) - { - int newoffset; + m_cmd_write_first = 0; - if ( (vdp->mode == V9938_MODE_GRAPHIC6) || (vdp->mode == V9938_MODE_GRAPHIC7) ) - { - newoffset = ((offset & 1) << 16) | (offset >> 1); - if (newoffset < vdp->vram_size) - vdp->vram[newoffset] = data; - } - else - { - if (offset < vdp->vram_size) - vdp->vram[offset] = data; - } + reg = m_cont_reg[15] & 0x0f; + if (reg > 9) + return 0xff; + + switch (reg) + { + case 0: + ret = m_stat_reg[0]; + m_stat_reg[0] &= 0x1f; + break; + case 1: + ret = m_stat_reg[1]; + m_stat_reg[1] &= 0xfe; + if ((m_cont_reg[8] & 0xc0) == 0x80) + // mouse mode: add button state + ret |= m_button_state & 0xc0; + break; + case 2: + /*update_command ();*/ +/* + WTF is this? Whatever this was intended to do, it is nonsensical. + Might as well pick a random number.... + This was an attempt to emulate H-Blank flag ;) + n = cycles_currently_ran (); + if ( (n < 28) || (n > 199) ) vdp.statReg[2] |= 0x20; + else vdp.statReg[2] &= ~0x20; +*/ + if (machine().rand() & 1) m_stat_reg[2] |= 0x20; + else m_stat_reg[2] &= ~0x20; + ret = m_stat_reg[2]; + break; + case 3: + if ((m_cont_reg[8] & 0xc0) == 0x80) + { // mouse mode: return x mouse delta + ret = m_mx_delta; + m_mx_delta = 0; + } + else + ret = m_stat_reg[3]; + break; + case 5: + if ((m_cont_reg[8] & 0xc0) == 0x80) + { // mouse mode: return y mouse delta + ret = m_my_delta; + m_my_delta = 0; + } + else + ret = m_stat_reg[5]; + break; + case 7: + ret = m_stat_reg[7]; + m_stat_reg[7] = m_cont_reg[44] = vdp_to_cpu () ; + break; + default: + ret = m_stat_reg[reg]; + break; } -static int v9938_vram_read (int offset) + LOG(("V9938: Read %02x from S#%d\n", ret, reg)); + check_int (); + + return ret; +} + +void v99x8_device::palette_w(UINT8 data) +{ + int indexp; + + if (m_pal_write_first) { - if ( (vdp->mode == V9938_MODE_GRAPHIC6) || (vdp->mode == V9938_MODE_GRAPHIC7) ) - return vdp->vram[((offset & 1) << 16) | (offset >> 1)]; + // store in register + indexp = m_cont_reg[0x10] & 15; + m_pal_reg[indexp*2] = m_pal_write & 0x77; + m_pal_reg[indexp*2+1] = data & 0x07; + // update palette + m_pal_ind16[indexp] = (((int)m_pal_write << 2) & 0x01c0) | + (((int)data << 3) & 0x0038) | + ((int)m_pal_write & 0x0007); + + m_cont_reg[0x10] = (m_cont_reg[0x10] + 1) & 15; + m_pal_write_first = 0; + } else - return vdp->vram[offset]; + { + m_pal_write = data; + m_pal_write_first = 1; } +} -static void v9938_vram_w( UINT8 data ) - { +void v99x8_device::vram_w(UINT8 data) +{ int address; - /*v9938_update_command ();*/ + /*update_command ();*/ - vdp->cmd_write_first = 0; + m_cmd_write_first = 0; - address = ((int)vdp->contReg[14] << 14) | vdp->address_latch; + address = ((int)m_cont_reg[14] << 14) | m_address_latch; - if (vdp->contReg[45] & 0x40) + if (m_cont_reg[45] & 0x40) { - if ( (vdp->mode == V9938_MODE_GRAPHIC6) || (vdp->mode == V9938_MODE_GRAPHIC7) ) - address >>= 1; /* correct? */ - if (vdp->vram_exp && address < 0x10000) - vdp->vram_exp[address] = data; + if ( (m_mode == V9938_MODE_GRAPHIC6) || (m_mode == V9938_MODE_GRAPHIC7) ) + address >>= 1; // correct? + if (m_vram_exp && address < 0x10000) + m_vram_exp[address] = data; } else { - v9938_vram_write (address, data); + vram_write (address, data); } - vdp->address_latch = (vdp->address_latch + 1) & 0x3fff; - if ((!vdp->address_latch) && (vdp->contReg[0] & 0x0c) ) /* correct ??? */ - { - vdp->contReg[14] = (vdp->contReg[14] + 1) & 7; - } + m_address_latch = (m_address_latch + 1) & 0x3fff; + if ((!m_address_latch) && (m_cont_reg[0] & 0x0c) ) // correct ??? + { + m_cont_reg[14] = (m_cont_reg[14] + 1) & 7; } - -WRITE8_HANDLER (v9938_0_vram_w) -{ - vdp = &vdps[0]; - v9938_vram_w( data ); } -WRITE8_HANDLER (v9938_1_vram_w) +void v99x8_device::command_w(UINT8 data) { - vdp = &vdps[1]; - v9938_vram_w( data ); -} - -static UINT8 v9938_vram_r(void) + if (m_cmd_write_first) { - UINT8 ret; - int address; - - address = ((int)vdp->contReg[14] << 14) | vdp->address_latch; - - vdp->cmd_write_first = 0; - - ret = vdp->read_ahead; - - if (vdp->contReg[45] & 0x40) - { - if ( (vdp->mode == V9938_MODE_GRAPHIC6) || (vdp->mode == V9938_MODE_GRAPHIC7) ) - address >>= 1; /* correct? */ - /* correct? */ - if (vdp->vram_exp && address < 0x10000) - vdp->read_ahead = vdp->vram_exp[address]; - else - vdp->read_ahead = 0xff; - } - else + if (data & 0x80) { - vdp->read_ahead = v9938_vram_read (address); + if (!(data & 0x40)) + register_write (data & 0x3f, m_cmd_write); } - - vdp->address_latch = (vdp->address_latch + 1) & 0x3fff; - if ((!vdp->address_latch) && (vdp->contReg[0] & 0x0c) ) /* correct ??? */ + else { - vdp->contReg[14] = (vdp->contReg[14] + 1) & 7; + m_address_latch = + (((UINT16)data << 8) | m_cmd_write) & 0x3fff; + if ( !(data & 0x40) ) vram_r (); // read ahead! } - return ret; + m_cmd_write_first = 0; + } + else + { + m_cmd_write = data; + m_cmd_write_first = 1; } +} -READ8_HANDLER (v9938_0_vram_r) +void v99x8_device::register_w(UINT8 data) { - vdp = &vdps[0]; - return v9938_vram_r(); + int reg; + + reg = m_cont_reg[17] & 0x3f; + if (reg != 17) + register_write (reg, data); // true ? + + if (!(m_cont_reg[17] & 0x80)) + m_cont_reg[17] = (m_cont_reg[17] + 1) & 0x3f; } -READ8_HANDLER (v9938_1_vram_r) +void v99x8_device::static_set_screen(device_t &device, const char *screen_name) { - vdp = &vdps[1]; - return v9938_vram_r(); + downcast(device).m_screen_name = screen_name; } -static void v9938_command_w(running_machine &machine, UINT8 data) - { - if (vdp->cmd_write_first) - { - if (data & 0x80) - { - if (!(data & 0x40)) - v9938_register_write (machine, data & 0x3f, vdp->cmd_write); - } - else - { - vdp->address_latch = - (((UINT16)data << 8) | vdp->cmd_write) & 0x3fff; - if ( !(data & 0x40) ) v9938_vram_r (); /* read ahead! */ - } - - vdp->cmd_write_first = 0; - } - else - { - vdp->cmd_write = data; - vdp->cmd_write_first = 1; - } - } - -WRITE8_HANDLER (v9938_0_command_w) +void v99x8_device::static_set_vram_size(device_t &device, UINT32 vram_size) { - vdp = &vdps[0]; - v9938_command_w(space->machine(), data); + downcast(device).m_vram_size = vram_size; } -WRITE8_HANDLER (v9938_1_command_w) +void v99x8_device::static_set_interrupt_callback(device_t &device, v99x8_interrupt_delegate callback, const char *device_name) { - vdp = &vdps[1]; - v9938_command_w(space->machine(), data); + v99x8_device &v99x8 = downcast(device); + v99x8.m_int_callback = callback; + v99x8.m_int_callback_device_name = device_name; } + /*************************************************************************** Init/stop/reset/Interrupt functions ***************************************************************************/ -void v9938_init (running_machine &machine, int which, screen_device &screen, bitmap_t *bitmap, int model, int vram_size, void (*callback)(running_machine &, int) ) +void v99x8_device::device_start() { - vdp = &vdps[which]; + // find our devices + m_screen = machine().device(m_screen_name); + assert(m_screen != NULL); + if (!m_screen->started()) + throw device_missing_dependencies(); + + if (!m_int_callback.isnull()) + { + device_t *device = (m_int_callback_device_name != NULL) ? machine().device(m_int_callback_device_name) : NULL; + if (device != NULL) + m_int_callback.late_bind(*device); + } - memset (vdp, 0, sizeof (*vdp) ); + m_vdp_ops_count = 1; + m_vdp_engine = NULL; + + m_screen->register_screen_bitmap(m_bitmap); + m_size_old = -1; + + // allocate VRAM + assert(m_vram_size > 0); + memset(m_vram, 0, sizeof(m_vram)); + if (m_vram_size < 0x20000) + { + // set unavailable RAM to 0xff + memset (m_vram + m_vram_size, 0xff, (sizeof(m_vram) - m_vram_size) ); + } - vdp->VdpOpsCnt = 1; - vdp->VdpEngine = NULL; + // do we have expanded memory? + if (m_vram_size > 0x20000) + m_vram_exp = auto_alloc_array_clear(machine(), UINT8, 0x10000); + else + m_vram_exp = NULL; - vdp->screen = &screen; - vdp->bitmap = bitmap; - vdp->model = model; - vdp->vram_size = vram_size; - vdp->INTCallback = callback; - vdp->size_old = -1; - - /* allocate VRAM */ - vdp->vram = auto_alloc_array_clear(machine, UINT8, 0x20000); - if (vdp->vram_size < 0x20000) - { - /* set unavailable RAM to 0xff */ - memset (vdp->vram + vdp->vram_size, 0xff, (0x20000 - vdp->vram_size) ); - } - - /* do we have expanded memory? */ - if (vdp->vram_size > 0x20000) - vdp->vram_exp = auto_alloc_array_clear(machine, UINT8, 0x10000); - else - vdp->vram_exp = NULL; - - state_save_register_item(machine, "v9938", NULL, which, vdp->offset_x); - state_save_register_item(machine, "v9938", NULL, which, vdp->offset_y); - state_save_register_item(machine, "v9938", NULL, which, vdp->visible_y); - state_save_register_item(machine, "v9938", NULL, which, vdp->mode); - state_save_register_item(machine, "v9938", NULL, which, vdp->pal_write_first); - state_save_register_item(machine, "v9938", NULL, which, vdp->cmd_write_first); - state_save_register_item(machine, "v9938", NULL, which, vdp->pal_write); - state_save_register_item(machine, "v9938", NULL, which, vdp->cmd_write); - state_save_register_item_array(machine, "v9938", NULL, which, vdp->palReg); - state_save_register_item_array(machine, "v9938", NULL, which, vdp->statReg); - state_save_register_item_array(machine, "v9938", NULL, which, vdp->contReg); - state_save_register_item(machine, "v9938", NULL, which, vdp->read_ahead); - state_save_register_item_pointer(machine, "v9938", NULL, which, vdp->vram, 0x20000); - if ( vdp->vram_exp != NULL ) - state_save_register_item_pointer(machine, "v9938", NULL, which, vdp->vram_exp, 0x10000); - state_save_register_item(machine, "v9938", NULL, which, vdp->INT); - state_save_register_item(machine, "v9938", NULL, which, vdp->scanline); - state_save_register_item(machine, "v9938", NULL, which, vdp->blink); - state_save_register_item(machine, "v9938", NULL, which, vdp->blink_count); - state_save_register_item(machine, "v9938", NULL, which, vdp->size); - state_save_register_item(machine, "v9938", NULL, which, vdp->size_old); - state_save_register_item(machine, "v9938", NULL, which, vdp->size_auto); - state_save_register_item(machine, "v9938", NULL, which, vdp->size_now); - state_save_register_item(machine, "v9938", NULL, which, vdp->mx_delta); - state_save_register_item(machine, "v9938", NULL, which, vdp->my_delta); - state_save_register_item(machine, "v9938", NULL, which, vdp->button_state); - state_save_register_item_array(machine, "v9938", NULL, which, vdp->pal_ind16); - state_save_register_item_array(machine, "v9938", NULL, which, vdp->pal_ind256); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.SX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.SY); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.DX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.DY); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.TX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.TY); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.NX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.NY); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.MX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.ASX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.ADX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.ANX); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.CL); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.LO); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.CM); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.MXS); - state_save_register_item(machine, "v9938", NULL, which, vdp->MMC.MXD); - state_save_register_item(machine, "v9938", NULL, which, vdp->VdpOpsCnt); + save_item(NAME(m_offset_x)); + save_item(NAME(m_offset_y)); + save_item(NAME(m_visible_y)); + save_item(NAME(m_mode)); + save_item(NAME(m_pal_write_first)); + save_item(NAME(m_cmd_write_first)); + save_item(NAME(m_pal_write)); + save_item(NAME(m_cmd_write)); + save_item(NAME(m_pal_reg)); + save_item(NAME(m_stat_reg)); + save_item(NAME(m_cont_reg)); + save_item(NAME(m_read_ahead)); + save_item(NAME(m_vram)); + if ( m_vram_exp != NULL ) + save_pointer(NAME(m_vram_exp), 0x10000); + save_item(NAME(m_int_state)); + save_item(NAME(m_scanline)); + save_item(NAME(m_blink)); + save_item(NAME(m_blink_count)); + save_item(NAME(m_size)); + save_item(NAME(m_size_old)); + save_item(NAME(m_size_auto)); + save_item(NAME(m_size_now)); + save_item(NAME(m_mx_delta)); + save_item(NAME(m_my_delta)); + save_item(NAME(m_button_state)); + save_item(NAME(m_pal_ind16)); + save_item(NAME(m_pal_ind256)); + save_item(NAME(m_mmc.SX)); + save_item(NAME(m_mmc.SY)); + save_item(NAME(m_mmc.DX)); + save_item(NAME(m_mmc.DY)); + save_item(NAME(m_mmc.TX)); + save_item(NAME(m_mmc.TY)); + save_item(NAME(m_mmc.NX)); + save_item(NAME(m_mmc.NY)); + save_item(NAME(m_mmc.MX)); + save_item(NAME(m_mmc.ASX)); + save_item(NAME(m_mmc.ADX)); + save_item(NAME(m_mmc.ANX)); + save_item(NAME(m_mmc.CL)); + save_item(NAME(m_mmc.LO)); + save_item(NAME(m_mmc.CM)); + save_item(NAME(m_mmc.MXS)); + save_item(NAME(m_mmc.MXD)); + save_item(NAME(m_vdp_ops_count)); } -void v9938_reset (int which) +void v99x8_device::device_reset() { int i; - vdp = &vdps[which]; - - /* offset reset */ - vdp->offset_x = 8; - vdp->offset_y = 8 + 16; - vdp->visible_y = 192; - /* register reset */ - v9938_reset_palette (); /* palette registers */ - for (i=0;i<10;i++) vdp->statReg[i] = 0; - vdp->statReg[2] = 0x0c; - if (vdp->model == MODEL_V9958) vdp->statReg[1] |= 4; - for (i=0;i<48;i++) vdp->contReg[i] = 0; - vdp->cmd_write_first = vdp->pal_write_first = 0; - vdp->INT = 0; - vdp->read_ahead = 0; vdp->address_latch = 0; /* ??? */ - vdp->scanline = 0; + // offset reset + m_offset_x = 8; + m_offset_y = 8 + 16; + m_visible_y = 192; + // register reset + reset_palette (); // palette registers + for (i=0;i<10;i++) m_stat_reg[i] = 0; + m_stat_reg[2] = 0x0c; + if (m_model == MODEL_V9958) m_stat_reg[1] |= 4; + for (i=0;i<48;i++) m_cont_reg[i] = 0; + m_cmd_write_first = m_pal_write_first = 0; + m_int_state = 0; + m_read_ahead = 0; m_address_latch = 0; // ??? + m_scanline = 0; // MZ: The status registers 4 and 6 hold the high bits of the sprite // collision location. The unused bits are set to 1. // SR3: x x x x x x x x @@ -586,89 +690,123 @@ // apart the tms9929 from the v99x8. // TODO: SR3-S6 do not yet store the information about the sprite collision - vdp->statReg[4] = 0xfe; - vdp->statReg[6] = 0xfc; + m_stat_reg[4] = 0xfe; + m_stat_reg[6] = 0xfc; } -static void v9938_check_int (running_machine &machine) - { - UINT8 n; - n = ( (vdp->contReg[1] & 0x20) && (vdp->statReg[0] & 0x80) /*&& vdp->vblank_int*/) || - ( (vdp->statReg[1] & 0x01) && (vdp->contReg[0] & 0x10) ); -#if 0 - if(n && vdp->vblank_int) - { - vdp->vblank_int = 0; - } -#endif - if (n != vdp->INT) - { - vdp->INT = n; - LOG(("V9938: IRQ line %s\n", n ? "up" : "down")); - } - - /* - ** Somehow the IRQ request is going down without cpu_irq_line () being - ** called; because of this Mr. Ghost, Xevious and SD Snatcher don't - ** run. As a patch it's called every scanline - */ - vdp->INTCallback (machine, n); - } +void v99x8_device::reset_palette () + { + // taken from V9938 Technical Data book, page 148. it's in G-R-B format + static const UINT8 pal16[16*3] = { + 0, 0, 0, // 0: black/transparent + 0, 0, 0, // 1: black + 6, 1, 1, // 2: medium green + 7, 3, 3, // 3: light green + 1, 1, 7, // 4: dark blue + 3, 2, 7, // 5: light blue + 1, 5, 1, // 6: dark red + 6, 2, 7, // 7: cyan + 1, 7, 1, // 8: medium red + 3, 7, 3, // 9: light red + 6, 6, 1, // 10: dark yellow + 6, 6, 4, // 11: light yellow + 4, 1, 1, // 12: dark green + 2, 6, 5, // 13: magenta + 5, 5, 5, // 14: gray + 7, 7, 7 // 15: white + }; + int i, red, ind; -void v9938_set_sprite_limit (int which, int i) + for (i=0;i<16;i++) { - vdp = &vdps[which]; - vdp->sprite_limit = i; + // set the palette registers + m_pal_reg[i*2+0] = pal16[i*3+1] << 4 | pal16[i*3+2]; + m_pal_reg[i*2+1] = pal16[i*3]; + // set the reference table + m_pal_ind16[i] = pal16[i*3+1] << 6 | pal16[i*3] << 3 | pal16[i*3+2]; } -void v9938_set_resolution (int which, int i) + // set internal palette GRAPHIC 7 + for (i=0;i<256;i++) { - vdp = &vdps[which]; - if (i == RENDER_AUTO) - { - vdp->size_auto = 1; - } - else - { - vdp->size = i; - vdp->size_auto = 0; - } + ind = (i << 4) & 0x01c0; + ind |= (i >> 2) & 0x0038; + red = (i << 1) & 6; if (red == 6) red++; + ind |= red; + + m_pal_ind256[i] = ind; } +} /*************************************************************************** - Register functions + Memory functions ***************************************************************************/ -static void v9938_register_w(running_machine &machine, UINT8 data) +void v99x8_device::vram_write (int offset, int data) { - int reg; - - reg = vdp->contReg[17] & 0x3f; - if (reg != 17) - v9938_register_write (machine, reg, data); /* true ? */ + int newoffset; - if (!(vdp->contReg[17] & 0x80)) - vdp->contReg[17] = (vdp->contReg[17] + 1) & 0x3f; + if ( (m_mode == V9938_MODE_GRAPHIC6) || (m_mode == V9938_MODE_GRAPHIC7) ) + { + newoffset = ((offset & 1) << 16) | (offset >> 1); + if (newoffset < m_vram_size) + m_vram[newoffset] = data; + } + else + { + if (offset < m_vram_size) + m_vram[offset] = data; + } } -WRITE8_HANDLER (v9938_0_register_w) +int v99x8_device::vram_read (int offset) { - vdp = &vdps[0]; - v9938_register_w(space->machine(), data); + if ( (m_mode == V9938_MODE_GRAPHIC6) || (m_mode == V9938_MODE_GRAPHIC7) ) + return m_vram[((offset & 1) << 16) | (offset >> 1)]; + else + return m_vram[offset]; } -WRITE8_HANDLER (v9938_1_register_w) +void v99x8_device::check_int () { - vdp = &vdps[1]; - v9938_register_w(space->machine(), data); + UINT8 n; + + n = ( (m_cont_reg[1] & 0x20) && (m_stat_reg[0] & 0x80) /*&& m_vblank_int*/) || + ( (m_stat_reg[1] & 0x01) && (m_cont_reg[0] & 0x10) ); + +#if 0 + if(n && m_vblank_int) + { + m_vblank_int = 0; + } +#endif + + if (n != m_int_state) + { + m_int_state = n; + LOG(("V9938: IRQ line %s\n", n ? "up" : "down")); + } + + /* + ** Somehow the IRQ request is going down without cpu_irq_line () being + ** called; because of this Mr. Ghost, Xevious and SD Snatcher don't + ** run. As a patch it's called every scanline + */ + m_int_callback (*this, n); } -static void v9938_register_write (running_machine &machine, int reg, int data) +/*************************************************************************** + + Register functions + +***************************************************************************/ + +void v99x8_device::register_write (int reg, int data) { static UINT8 const reg_mask[] = { @@ -681,7 +819,7 @@ if (reg <= 27) { data &= reg_mask[reg]; - if (vdp->contReg[reg] == data) + if (m_cont_reg[reg] == data) return; } @@ -691,40 +829,40 @@ return; } - /*v9938_update_command (); */ + /*update_command ();*/ switch (reg) { - /* registers that affect interrupt and display mode */ + // registers that affect interrupt and display mode case 0: case 1: - vdp->contReg[reg] = data; - v9938_set_mode (); - v9938_check_int (machine); - LOG(("V9938: mode = %s\n", v9938_modes[vdp->mode])); + m_cont_reg[reg] = data; + set_mode (); + check_int (); + LOG(("V9938: mode = %s\n", v9938_modes[m_mode])); break; case 18: case 9: - vdp->contReg[reg] = data; - /* recalc offset */ - vdp->offset_x = (( (~vdp->contReg[18] - 8) & 0x0f) + 1); - vdp->offset_y = ((~(vdp->contReg[18]>>4) - 8) & 0x0f) + 7; - if (vdp->contReg[9] & 0x80) + m_cont_reg[reg] = data; + // recalc offset + m_offset_x = (( (~m_cont_reg[18] - 8) & 0x0f) + 1); + m_offset_y = ((~(m_cont_reg[18]>>4) - 8) & 0x0f) + 7; + if (m_cont_reg[9] & 0x80) { - vdp->visible_y = 212; + m_visible_y = 212; } else { - vdp->visible_y = 192; - vdp->offset_y += 10; + m_visible_y = 192; + m_offset_y += 10; } break; case 15: - vdp->pal_write_first = 0; + m_pal_write_first = 0; break; - /* color burst registers aren't emulated */ + // color burst registers aren't emulated case 20: case 21: case 22: @@ -734,7 +872,7 @@ case 25: case 26: case 27: - if (vdp->model != MODEL_V9958) + if (m_model != MODEL_V9958) { LOG(("V9938: Attempting to write %02xh to V9958 R#%d\n", data, reg)); data = 0; @@ -742,567 +880,1178 @@ break; case 44: - v9938_cpu_to_vdp (data); + cpu_to_vdp (data); break; case 46: - v9938_command_unit_w (data); + command_unit_w (data); break; } if (reg != 15) LOG(("V9938: Write %02x to R#%d\n", data, reg)); - vdp->contReg[reg] = data; + m_cont_reg[reg] = data; +} + +/*************************************************************************** + + Refresh / render function + +***************************************************************************/ + +#define V9938_SECOND_FIELD ( !(((m_cont_reg[9] & 0x04) && !(m_stat_reg[2] & 2)) || m_blink)) + +/* + * This file is included for a number of different situations: + * _Width : can be 512 + 32 or 256 + 16 + * V9938_BPP : can be 8 or 16 + */ + + +template +void v99x8_device::default_border(const pen_t *pens, _PixelType *ln) +{ + _PixelType pen; + int i; + + pen = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + i = _Width; + while (i--) *ln++ = pen; + + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::graphic7_border(const pen_t *pens, _PixelType *ln) +{ + _PixelType pen; + int i; + + pen = pens[m_pal_ind256[m_cont_reg[7]]]; + i = _Width; + while (i--) *ln++ = pen; + + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; } -static UINT8 v9938_status_r(running_machine &machine) +template +void v99x8_device::graphic5_border(const pen_t *pens, _PixelType *ln) +{ + int i; + _PixelType pen0; + if (_Width > 512) { - int reg; - UINT8 ret; + _PixelType pen1; - vdp->cmd_write_first = 0; + pen1 = pens[m_pal_ind16[(m_cont_reg[7]&0x03)]]; + pen0 = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + i = (_Width) / 2; + while (i--) { *ln++ = pen0; *ln++ = pen1; } + } + else + { + pen0 = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + i = _Width; + while (i--) *ln++ = pen0; + } + m_size_now = RENDER_HIGH; +} - reg = vdp->contReg[15] & 0x0f; - if (reg > 9) - return 0xff; +template +void v99x8_device::mode_text1(const pen_t *pens, _PixelType *ln, int line) +{ + int pattern, x, xx, name, xxx; + _PixelType fg, bg, pen; + UINT8 *nametbl, *patterntbl; - switch (reg) + patterntbl = m_vram + (m_cont_reg[4] << 11); + nametbl = m_vram + (m_cont_reg[2] << 10); + + fg = pens[m_pal_ind16[m_cont_reg[7] >> 4]]; + bg = pens[m_pal_ind16[m_cont_reg[7] & 15]]; + + name = (line/8)*40; + + pen = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + + xxx = m_offset_x + 8; + if (_Width > 512) + xxx *= 2; + while (xxx--) *ln++ = pen; + + for (x=0;x<40;x++) + { + pattern = patterntbl[(nametbl[name] * 8) + + ((line + m_cont_reg[23]) & 7)]; + for (xx=0;xx<6;xx++) { - case 0: - ret = vdp->statReg[0]; - vdp->statReg[0] &= 0x1f; - break; - case 1: - ret = vdp->statReg[1]; - vdp->statReg[1] &= 0xfe; - if ((vdp->contReg[8] & 0xc0) == 0x80) - /* mouse mode: add button state */ - ret |= vdp->button_state & 0xc0; - break; - case 2: - /*v9938_update_command ();*/ -/* - WTF is this? Whatever this was intended to do, it is nonsensical. - Might as well pick a random number.... - This was an attempt to emulate H-Blank flag ;) - n = cycles_currently_ran (); - if ( (n < 28) || (n > 199) ) vdp.statReg[2] |= 0x20; - else vdp.statReg[2] &= ~0x20; -*/ - if (machine.rand() & 1) vdp->statReg[2] |= 0x20; - else vdp->statReg[2] &= ~0x20; - ret = vdp->statReg[2]; - break; - case 3: - if ((vdp->contReg[8] & 0xc0) == 0x80) - { /* mouse mode: return x mouse delta */ - ret = vdp->mx_delta; - vdp->mx_delta = 0; + *ln++ = (pattern & 0x80) ? fg : bg; + if (_Width > 512) + *ln++ = (pattern & 0x80) ? fg : bg; + pattern <<= 1; + } + /* width height 212, characters start repeating at the bottom */ + name = (name + 1) & 0x3ff; + } + + xxx = (16 - m_offset_x) + 8; + if (_Width > 512) + xxx *= 2; + while (xxx--) *ln++ = pen; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::mode_text2(const pen_t *pens, _PixelType *ln, int line) +{ + int pattern, x, charcode, name, xxx, patternmask, colourmask; + _PixelType fg, bg, fg0, bg0, pen; + UINT8 *nametbl, *patterntbl, *colourtbl; + + patterntbl = m_vram + (m_cont_reg[4] << 11); + colourtbl = m_vram + ((m_cont_reg[3] & 0xf8) << 6) + (m_cont_reg[10] << 14); +#if 0 + colourmask = ((m_cont_reg[3] & 7) << 5) | 0x1f; /* cause a bug in Forth+ v1.0 on Geneve */ +#else + colourmask = ((m_cont_reg[3] & 7) << 6) | 0x3f; /* verify! */ +#endif + nametbl = m_vram + ((m_cont_reg[2] & 0xfc) << 10); + patternmask = ((m_cont_reg[2] & 3) << 10) | 0x3ff; /* seems correct */ + + fg = pens[m_pal_ind16[m_cont_reg[7] >> 4]]; + bg = pens[m_pal_ind16[m_cont_reg[7] & 15]]; + fg0 = pens[m_pal_ind16[m_cont_reg[12] >> 4]]; + bg0 = pens[m_pal_ind16[m_cont_reg[12] & 15]]; + + name = (line/8)*80; + + xxx = m_offset_x + 8; + pen = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width > 512) + xxx *= 2; + while (xxx--) *ln++ = pen; + + for (x=0;x<80;x++) + { + charcode = nametbl[name&patternmask]; + if (m_blink) + { + pattern = colourtbl[(name/8)&colourmask]; + if (pattern & (0x80 >> (name & 7) ) ) + { + pattern = patterntbl[(charcode * 8) + + ((line + m_cont_reg[23]) & 7)]; + + if (_Width > 512) + { + *ln++ = (pattern & 0x80) ? fg0 : bg0; + *ln++ = (pattern & 0x40) ? fg0 : bg0; + *ln++ = (pattern & 0x20) ? fg0 : bg0; + *ln++ = (pattern & 0x10) ? fg0 : bg0; + *ln++ = (pattern & 0x08) ? fg0 : bg0; + *ln++ = (pattern & 0x04) ? fg0 : bg0; + } + else + { + *ln++ = (pattern & 0x80) ? fg0 : bg0; + *ln++ = (pattern & 0x20) ? fg0 : bg0; + *ln++ = (pattern & 0x08) ? fg0 : bg0; + } + + name++; + continue; } - else - ret = vdp->statReg[3]; - break; - case 5: - if ((vdp->contReg[8] & 0xc0) == 0x80) - { /* mouse mode: return y mouse delta */ - ret = vdp->my_delta; - vdp->my_delta = 0; + } + + pattern = patterntbl[(charcode * 8) + + ((line + m_cont_reg[23]) & 7)]; + + if (_Width > 512) + { + *ln++ = (pattern & 0x80) ? fg : bg; + *ln++ = (pattern & 0x40) ? fg : bg; + *ln++ = (pattern & 0x20) ? fg : bg; + *ln++ = (pattern & 0x10) ? fg : bg; + *ln++ = (pattern & 0x08) ? fg : bg; + *ln++ = (pattern & 0x04) ? fg : bg; + } + else + { + *ln++ = (pattern & 0x80) ? fg : bg; + *ln++ = (pattern & 0x20) ? fg : bg; + *ln++ = (pattern & 0x08) ? fg : bg; + } + + name++; + } + + xxx = 16 - m_offset_x + 8; + if (_Width > 512) + xxx *= 2; + while (xxx--) *ln++ = pen; + m_size_now = RENDER_HIGH; +} + +template +void v99x8_device::mode_multi(const pen_t *pens, _PixelType *ln, int line) +{ + UINT8 *nametbl, *patterntbl, colour; + int name, line2, x, xx; + _PixelType pen, pen_bg; + + nametbl = m_vram + (m_cont_reg[2] << 10); + patterntbl = m_vram + (m_cont_reg[4] << 11); + + line2 = (line - m_cont_reg[23]) & 255; + name = (line2/8)*32; + + pen_bg = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width < 512) + xx = m_offset_x; + else + xx = m_offset_x * 2; + while (xx--) *ln++ = pen_bg; + + for (x=0;x<32;x++) + { + colour = patterntbl[(nametbl[name] * 8) + ((line2/4)&7)]; + pen = pens[m_pal_ind16[colour>>4]]; + /* eight pixels */ + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + if (_Width > 512) + { + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + } + pen = pens[m_pal_ind16[colour&15]]; + /* eight pixels */ + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + if (_Width > 512) + { + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + *ln++ = pen; + } + name++; + } + + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen_bg; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::mode_graphic1(const pen_t *pens, _PixelType *ln, int line) +{ + _PixelType fg, bg, pen; + UINT8 *nametbl, *patterntbl, *colourtbl; + int pattern, x, xx, line2, name, charcode, colour, xxx; + + nametbl = m_vram + (m_cont_reg[2] << 10); + colourtbl = m_vram + (m_cont_reg[3] << 6) + (m_cont_reg[10] << 14); + patterntbl = m_vram + (m_cont_reg[4] << 11); + + line2 = (line - m_cont_reg[23]) & 255; + + name = (line2/8)*32; + + pen = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width < 512) + xxx = m_offset_x; + else + xxx = m_offset_x * 2; + while (xxx--) *ln++ = pen; + + for (x=0;x<32;x++) + { + charcode = nametbl[name]; + colour = colourtbl[charcode/8]; + fg = pens[m_pal_ind16[colour>>4]]; + bg = pens[m_pal_ind16[colour&15]]; + pattern = patterntbl[charcode * 8 + (line2 & 7)]; + + for (xx=0;xx<8;xx++) + { + *ln++ = (pattern & 0x80) ? fg : bg; + if (_Width > 512) + *ln++ = (pattern & 0x80) ? fg : bg; + pattern <<= 1; + } + name++; + } + + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::mode_graphic23(const pen_t *pens, _PixelType *ln, int line) +{ + _PixelType fg, bg, pen; + UINT8 *nametbl, *patterntbl, *colourtbl; + int pattern, x, xx, line2, name, charcode, + colour, colourmask, patternmask, xxx; + + colourmask = (m_cont_reg[3] & 0x7f) * 8 | 7; + patternmask = (m_cont_reg[4] & 0x03) * 256 | (colourmask & 255); + + nametbl = m_vram + (m_cont_reg[2] << 10); + colourtbl = m_vram + ((m_cont_reg[3] & 0x80) << 6) + (m_cont_reg[10] << 14); + patterntbl = m_vram + ((m_cont_reg[4] & 0x3c) << 11); + + line2 = (line + m_cont_reg[23]) & 255; + name = (line2/8)*32; + + pen = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width < 512) + xxx = m_offset_x; + else + xxx = m_offset_x * 2; + while (xxx--) *ln++ = pen; + + for (x=0;x<32;x++) + { + charcode = nametbl[name] + (line2&0xc0)*4; + colour = colourtbl[(charcode&colourmask)*8+(line2&7)]; + pattern = patterntbl[(charcode&patternmask)*8+(line2&7)]; + fg = pens[m_pal_ind16[colour>>4]]; + bg = pens[m_pal_ind16[colour&15]]; + for (xx=0;xx<8;xx++) + { + *ln++ = (pattern & 0x80) ? fg : bg; + if (_Width > 512) + *ln++ = (pattern & 0x80) ? fg : bg; + pattern <<= 1; + } + name++; + } + + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::mode_graphic4(const pen_t *pens, _PixelType *ln, int line) +{ + UINT8 *nametbl, colour; + int line2, linemask, x, xx; + _PixelType pen, pen_bg; + + linemask = ((m_cont_reg[2] & 0x1f) << 3) | 7; + + line2 = ((line + m_cont_reg[23]) & linemask) & 255; + + nametbl = m_vram + ((m_cont_reg[2] & 0x40) << 10) + line2 * 128; + if ( (m_cont_reg[2] & 0x20) && (V9938_SECOND_FIELD) ) + nametbl += 0x8000; + + pen_bg = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width < 512) + xx = m_offset_x; + else + xx = m_offset_x * 2; + while (xx--) *ln++ = pen_bg; + + for (x=0;x<128;x++) + { + colour = *nametbl++; + pen = pens[m_pal_ind16[colour>>4]]; + *ln++ = pen; + if (_Width > 512) + *ln++ = pen; + pen = pens[m_pal_ind16[colour&15]]; + *ln++ = pen; + if (_Width > 512) + *ln++ = pen; + } + + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen_bg; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} + +template +void v99x8_device::mode_graphic5(const pen_t *pens, _PixelType *ln, int line) +{ + UINT8 *nametbl, colour; + int line2, linemask, x, xx; + _PixelType pen_bg0[4]; + _PixelType pen_bg1[4]; + + linemask = ((m_cont_reg[2] & 0x1f) << 3) | 7; + + line2 = ((line + m_cont_reg[23]) & linemask) & 255; + + nametbl = m_vram + ((m_cont_reg[2] & 0x40) << 10) + line2 * 128; + if ( (m_cont_reg[2] & 0x20) && (V9938_SECOND_FIELD) ) + nametbl += 0x8000; + + if (_Width > 512) + { + pen_bg1[0] = pens[m_pal_ind16[(m_cont_reg[7]&0x03)]]; + pen_bg0[0] = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + + xx = m_offset_x; + while (xx--) { *ln++ = pen_bg0[0]; *ln++ = pen_bg1[0]; } + + x = (m_cont_reg[8] & 0x20) ? 0 : 1; + + for (;x<4;x++) + { + pen_bg0[x] = pens[m_pal_ind16[x]]; + pen_bg1[x] = pens[m_pal_ind16[x]]; + } + + for (x=0;x<128;x++) + { + colour = *nametbl++; + + *ln++ = pen_bg0[colour>>6]; + *ln++ = pen_bg1[(colour>>4)&3]; + *ln++ = pen_bg0[(colour>>2)&3]; + *ln++ = pen_bg1[(colour&3)]; + } + + pen_bg1[0] = pens[m_pal_ind16[(m_cont_reg[7]&0x03)]]; + pen_bg0[0] = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + xx = 16 - m_offset_x; + while (xx--) { *ln++ = pen_bg0[0]; *ln++ = pen_bg1[0]; } + } + else + { + pen_bg0[0] = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + + x = (m_cont_reg[8] & 0x20) ? 0 : 1; + + for (;x<4;x++) + pen_bg0[x] = pens[m_pal_ind16[x]]; + + xx = m_offset_x; + while (xx--) *ln++ = pen_bg0[0]; + + for (x=0;x<128;x++) + { + colour = *nametbl++; + *ln++ = pen_bg0[colour>>6]; + *ln++ = pen_bg0[(colour>>2)&3]; + } + + pen_bg0[0] = pens[m_pal_ind16[((m_cont_reg[7]>>2)&0x03)]]; + xx = 16 - m_offset_x; + while (xx--) *ln++ = pen_bg0[0]; + } + m_size_now = RENDER_HIGH; +} + +template +void v99x8_device::mode_graphic6(const pen_t *pens, _PixelType *ln, int line) +{ + UINT8 colour; + int line2, linemask, x, xx, nametbl; + _PixelType pen_bg, fg0; + _PixelType fg1; + + linemask = ((m_cont_reg[2] & 0x1f) << 3) | 7; + + line2 = ((line + m_cont_reg[23]) & linemask) & 255; + + nametbl = line2 << 8 ; + if ( (m_cont_reg[2] & 0x20) && (V9938_SECOND_FIELD) ) + nametbl += 0x10000; + + pen_bg = pens[m_pal_ind16[(m_cont_reg[7]&0x0f)]]; + if (_Width < 512) + xx = m_offset_x; + else + xx = m_offset_x * 2; + while (xx--) *ln++ = pen_bg; + + if (m_cont_reg[2] & 0x40) + { + for (x=0;x<32;x++) + { + nametbl++; + colour = m_vram[((nametbl&1) << 16) | (nametbl>>1)]; + fg0 = pens[m_pal_ind16[colour>>4]]; + if (_Width < 512) + { + *ln++ = fg0; *ln++ = fg0; + *ln++ = fg0; *ln++ = fg0; + *ln++ = fg0; *ln++ = fg0; + *ln++ = fg0; *ln++ = fg0; } else - ret = vdp->statReg[5]; - break; - case 7: - ret = vdp->statReg[7]; - vdp->statReg[7] = vdp->contReg[44] = v9938_vdp_to_cpu () ; - break; - default: - ret = vdp->statReg[reg]; - break; + { + fg1 = pens[m_pal_ind16[colour&15]]; + *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; + *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; + *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; + *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; + } + nametbl += 7; + } + } + else + { + for (x=0;x<256;x++) + { + colour = m_vram[((nametbl&1) << 16) | (nametbl>>1)]; + *ln++ = pens[m_pal_ind16[colour>>4]]; + if (_Width > 512) + *ln++ = pens[m_pal_ind16[colour&15]]; + nametbl++; + } + } + + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen_bg; + m_size_now = RENDER_HIGH; +} + +template +void v99x8_device::mode_graphic7(const pen_t *pens, _PixelType *ln, int line) +{ + UINT8 colour; + int line2, linemask, x, xx, nametbl; + _PixelType pen, pen_bg; + + linemask = ((m_cont_reg[2] & 0x1f) << 3) | 7; + + line2 = ((line + m_cont_reg[23]) & linemask) & 255; + + nametbl = line2 << 8; + if ( (m_cont_reg[2] & 0x20) && (V9938_SECOND_FIELD) ) + nametbl += 0x10000; + + pen_bg = pens[m_pal_ind256[m_cont_reg[7]]]; + if (_Width < 512) + xx = m_offset_x; + else + xx = m_offset_x * 2; + while (xx--) *ln++ = pen_bg; + + if (m_cont_reg[2] & 0x40) + { + for (x=0;x<32;x++) + { + nametbl++; + colour = m_vram[((nametbl&1) << 16) | (nametbl>>1)]; + pen = pens[m_pal_ind256[colour]]; + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + if (_Width > 512) + { + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + *ln++ = pen; *ln++ = pen; + } + nametbl++; } + } + else + { + for (x=0;x<256;x++) + { + colour = m_vram[((nametbl&1) << 16) | (nametbl>>1)]; + pen = pens[m_pal_ind256[colour]]; + *ln++ = pen; + if (_Width > 512) + *ln++ = pen; + nametbl++; + } + } - LOG(("V9938: Read %02x from S#%d\n", ret, reg)); - v9938_check_int (machine); + xx = 16 - m_offset_x; + if (_Width > 512) + xx *= 2; + while (xx--) *ln++ = pen_bg; + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; +} - return ret; +template +void v99x8_device::mode_unknown(const pen_t *pens, _PixelType *ln, int line) +{ + _PixelType fg, bg; + int x; + + fg = pens[m_pal_ind16[m_cont_reg[7] >> 4]]; + bg = pens[m_pal_ind16[m_cont_reg[7] & 15]]; + + if (_Width < 512) + { + x = m_offset_x; + while (x--) *ln++ = bg; + + x = 256; + while (x--) *ln++ = fg; + + x = 16 - m_offset_x; + while (x--) *ln++ = bg; } + else + { + x = m_offset_x * 2; + while (x--) *ln++ = bg; -READ8_HANDLER( v9938_0_status_r ) -{ - vdp = &vdps[0]; - return v9938_status_r(space->machine()); + x = 512; + while (x--) *ln++ = fg; + + x = (16 - m_offset_x) * 2; + while (x--) *ln++ = bg; + } + if (m_size_now != RENDER_HIGH) m_size_now = RENDER_LOW; } -READ8_HANDLER( v9938_1_status_r ) +template +void v99x8_device::default_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col) { - vdp = &vdps[1]; - return v9938_status_r(space->machine()); -} + int i; + if (_Width > 512) + ln += m_offset_x * 2; + else + ln += m_offset_x; -/*************************************************************************** + for (i=0;i<256;i++) + { + if (col[i] & 0x80) + { + *ln++ = pens[m_pal_ind16[col[i]&0x0f]]; + if (_Width > 512) + *ln++ = pens[m_pal_ind16[col[i]&0x0f]]; + } + else + { + if (_Width > 512) + ln += 2; + else + ln++; + } + } +} +template +void v99x8_device::graphic5_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col) +{ + int i; + if (_Width > 512) + ln += m_offset_x * 2; + else + ln += m_offset_x; - Refresh / render function + for (i=0;i<256;i++) + { + if (col[i] & 0x80) + { + *ln++ = pens[m_pal_ind16[(col[i]>>2)&0x03]]; + if (_Width > 512) + *ln++ = pens[m_pal_ind16[col[i]&0x03]]; + } + else + { + if (_Width > 512) + ln += 2; + else + ln++; + } + } +} -***************************************************************************/ -#define V9938_SECOND_FIELD ( !(((vdp->contReg[9] & 0x04) && !(vdp->statReg[2] & 2)) || vdp->blink)) +template +void v99x8_device::graphic7_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col) +{ + static const UINT16 g7_ind16[16] = { + 0, 2, 192, 194, 48, 50, 240, 242, + 482, 7, 448, 455, 56, 63, 504, 511 }; + int i; -#define V9938_BPP (16) -#define V9938_WIDTH (512 + 32) -#include "v9938mod.c" -#undef V9938_WIDTH -#define V9938_WIDTH (256 + 16) -#include "v9938mod.c" -#undef V9938_WIDTH -#undef V9938_BPP + if (_Width > 512) + ln += m_offset_x * 2; + else + ln += m_offset_x; -static void v9938_sprite_mode1 (int line, UINT8 *col) + for (i=0;i<256;i++) { + if (col[i] & 0x80) + { + *ln++ = pens[g7_ind16[col[i]&0x0f]]; + if (_Width > 512) + *ln++ = pens[g7_ind16[col[i]&0x0f]]; + } + else + { + if (_Width > 512) + ln += 2; + else + ln++; + } + } +} + + +void v99x8_device::sprite_mode1 (int line, UINT8 *col) +{ UINT8 *attrtbl, *patterntbl, *patternptr; int x, y, p, height, c, p2, i, n, pattern; memset (col, 0, 256); - /* are sprites disabled? */ - if (vdp->contReg[8] & 0x02) return; + // are sprites disabled? + if (m_cont_reg[8] & 0x02) return; - attrtbl = vdp->vram + (vdp->contReg[5] << 7) + (vdp->contReg[11] << 15); - patterntbl = vdp->vram + (vdp->contReg[6] << 11); + attrtbl = m_vram + (m_cont_reg[5] << 7) + (m_cont_reg[11] << 15); + patterntbl = m_vram + (m_cont_reg[6] << 11); - /* 16x16 or 8x8 sprites */ - height = (vdp->contReg[1] & 2) ? 16 : 8; - /* magnified sprites (zoomed) */ - if (vdp->contReg[1] & 1) height *= 2; + // 16x16 or 8x8 sprites + height = (m_cont_reg[1] & 2) ? 16 : 8; + // magnified sprites (zoomed) + if (m_cont_reg[1] & 1) height *= 2; p2 = p = 0; while (1) - { + { y = attrtbl[0]; if (y == 208) break; - y = (y - vdp->contReg[23]) & 255; + y = (y - m_cont_reg[23]) & 255; if (y > 208) y = -(~y&255); else y++; - /* if sprite in range, has to be drawn */ + // if sprite in range, has to be drawn if ( (line >= y) && (line < (y + height) ) ) - { + { if (p2 == 4) - { - /* max maximum sprites per line! */ - if ( !(vdp->statReg[0] & 0x40) ) - vdp->statReg[0] = (vdp->statReg[0] & 0xa0) | 0x40 | p; + { + // max maximum sprites per line! + if ( !(m_stat_reg[0] & 0x40) ) + m_stat_reg[0] = (m_stat_reg[0] & 0xa0) | 0x40 | p; - if (vdp->sprite_limit) break; - } - /* get x */ + if (m_sprite_limit) break; + } + // get x x = attrtbl[1]; if (attrtbl[3] & 0x80) x -= 32; - /* get pattern */ + // get pattern pattern = attrtbl[2]; - if (vdp->contReg[1] & 2) + if (m_cont_reg[1] & 2) pattern &= 0xfc; n = line - y; patternptr = patterntbl + pattern * 8 + - ((vdp->contReg[1] & 1) ? n/2 : n); + ((m_cont_reg[1] & 1) ? n/2 : n); pattern = patternptr[0] << 8 | patternptr[16]; - /* get colour */ + // get colour c = attrtbl[3] & 0x0f; - /* draw left part */ + // draw left part n = 0; while (1) - { + { if (n == 0) pattern = patternptr[0]; - else if ( (n == 1) && (vdp->contReg[1] & 2) ) pattern = patternptr[16]; + else if ( (n == 1) && (m_cont_reg[1] & 2) ) pattern = patternptr[16]; else break; n++; for (i=0;i<8;i++) - { + { if (pattern & 0x80) - { + { if ( (x >= 0) && (x < 256) ) - { + { if (col[x] & 0x40) - { - /* we have a collision! */ + { + // we have a collision! if (p2 < 4) - vdp->statReg[0] |= 0x20; - } + m_stat_reg[0] |= 0x20; + } if ( !(col[x] & 0x80) ) - { - if (c || (vdp->contReg[8] & 0x20) ) + { + if (c || (m_cont_reg[8] & 0x20) ) col[x] |= 0xc0 | c; else col[x] |= 0x40; - } + } - /* if zoomed, draw another pixel */ - if (vdp->contReg[1] & 1) - { + // if zoomed, draw another pixel + if (m_cont_reg[1] & 1) + { if (col[x+1] & 0x40) - { - /* we have a collision! */ + { + // we have a collision! if (p2 < 4) - vdp->statReg[0] |= 0x20; - } + m_stat_reg[0] |= 0x20; + } if ( !(col[x+1] & 0x80) ) - { - if (c || (vdp->contReg[8] & 0x20) ) + { + if (c || (m_cont_reg[8] & 0x20) ) col[x+1] |= 0xc0 | c; else col[x+1] |= 0x80; - } - } + } } } - if (vdp->contReg[1] & 1) x += 2; else x++; - pattern <<= 1; } + if (m_cont_reg[1] & 1) x += 2; else x++; + pattern <<= 1; } + } p2++; - } + } if (p >= 31) break; p++; attrtbl += 4; - } - - if ( !(vdp->statReg[0] & 0x40) ) - vdp->statReg[0] = (vdp->statReg[0] & 0xa0) | p; } -static void v9938_sprite_mode2 (int line, UINT8 *col) - { + if ( !(m_stat_reg[0] & 0x40) ) + m_stat_reg[0] = (m_stat_reg[0] & 0xa0) | p; +} + +void v99x8_device::sprite_mode2 (int line, UINT8 *col) +{ int attrtbl, patterntbl, patternptr, colourtbl; int x, i, y, p, height, c, p2, n, pattern, colourmask, first_cc_seen; memset (col, 0, 256); - /* are sprites disabled? */ - if (vdp->contReg[8] & 0x02) return; + // are sprites disabled? + if (m_cont_reg[8] & 0x02) return; - attrtbl = ( (vdp->contReg[5] & 0xfc) << 7) + (vdp->contReg[11] << 15); - colourtbl = ( (vdp->contReg[5] & 0xf8) << 7) + (vdp->contReg[11] << 15); - patterntbl = (vdp->contReg[6] << 11); - colourmask = ( (vdp->contReg[5] & 3) << 3) | 0x7; /* check this! */ - - /* 16x16 or 8x8 sprites */ - height = (vdp->contReg[1] & 2) ? 16 : 8; - /* magnified sprites (zoomed) */ - if (vdp->contReg[1] & 1) height *= 2; + attrtbl = ( (m_cont_reg[5] & 0xfc) << 7) + (m_cont_reg[11] << 15); + colourtbl = ( (m_cont_reg[5] & 0xf8) << 7) + (m_cont_reg[11] << 15); + patterntbl = (m_cont_reg[6] << 11); + colourmask = ( (m_cont_reg[5] & 3) << 3) | 0x7; // check this! + + // 16x16 or 8x8 sprites + height = (m_cont_reg[1] & 2) ? 16 : 8; + // magnified sprites (zoomed) + if (m_cont_reg[1] & 1) height *= 2; p2 = p = first_cc_seen = 0; while (1) - { - y = v9938_vram_read (attrtbl); + { + y = vram_read (attrtbl); if (y == 216) break; - y = (y - vdp->contReg[23]) & 255; + y = (y - m_cont_reg[23]) & 255; if (y > 216) y = -(~y&255); else y++; - /* if sprite in range, has to be drawn */ + // if sprite in range, has to be drawn if ( (line >= y) && (line < (y + height) ) ) - { + { if (p2 == 8) - { - /* max maximum sprites per line! */ - if ( !(vdp->statReg[0] & 0x40) ) - vdp->statReg[0] = (vdp->statReg[0] & 0xa0) | 0x40 | p; + { + // max maximum sprites per line! + if ( !(m_stat_reg[0] & 0x40) ) + m_stat_reg[0] = (m_stat_reg[0] & 0xa0) | 0x40 | p; - if (vdp->sprite_limit) break; - } + if (m_sprite_limit) break; + } - n = line - y; if (vdp->contReg[1] & 1) n /= 2; - /* get colour */ - c = v9938_vram_read (colourtbl + (((p&colourmask)*16) + n)); + n = line - y; if (m_cont_reg[1] & 1) n /= 2; + // get colour + c = vram_read (colourtbl + (((p&colourmask)*16) + n)); - /* don't draw all sprite with CC set before any sprites - with CC = 0 are seen on this line */ + // don't draw all sprite with CC set before any sprites + // with CC = 0 are seen on this line if (c & 0x40) - { + { if (!first_cc_seen) goto skip_first_cc_set; - } + } else first_cc_seen = 1; - /* get pattern */ - pattern = v9938_vram_read (attrtbl + 2); - if (vdp->contReg[1] & 2) + // get pattern + pattern = vram_read (attrtbl + 2); + if (m_cont_reg[1] & 2) pattern &= 0xfc; patternptr = patterntbl + pattern * 8 + n; - pattern = (v9938_vram_read (patternptr) << 8) | - v9938_vram_read (patternptr + 16); + pattern = (vram_read (patternptr) << 8) | + vram_read (patternptr + 16); - /* get x */ - x = v9938_vram_read (attrtbl + 1); + // get x + x = vram_read (attrtbl + 1); if (c & 0x80) x -= 32; - n = (vdp->contReg[1] & 2) ? 16 : 8; + n = (m_cont_reg[1] & 2) ? 16 : 8; while (n--) + { + for (i=0;i<=(m_cont_reg[1] & 1);i++) { - for (i=0;i<=(vdp->contReg[1] & 1);i++) - { if ( (x >= 0) && (x < 256) ) - { + { if ( (pattern & 0x8000) && !(col[x] & 0x10) ) + { + if ( (c & 15) || (m_cont_reg[8] & 0x20) ) { - if ( (c & 15) || (vdp->contReg[8] & 0x20) ) - { if ( !(c & 0x40) ) - { + { if (col[x] & 0x20) col[x] |= 0x10; else col[x] |= 0x20 | (c & 15); - } + } else col[x] |= c & 15; col[x] |= 0x80; - } } + } else - { + { if ( !(c & 0x40) && (col[x] & 0x20) ) col[x] |= 0x10; - } + } if ( !(c & 0x60) && (pattern & 0x8000) ) - { + { if (col[x] & 0x40) - { - /* sprite collision! */ + { + // sprite collision! if (p2 < 8) - vdp->statReg[0] |= 0x20; - } + m_stat_reg[0] |= 0x20; + } else col[x] |= 0x40; - } + } x++; - } } + } pattern <<= 1; - } + } skip_first_cc_set: p2++; - } + } if (p >= 31) break; p++; attrtbl += 4; - } - - if ( !(vdp->statReg[0] & 0x40) ) - vdp->statReg[0] = (vdp->statReg[0] & 0xa0) | p; } -typedef struct { - UINT8 m; - void (*visible_16)(const pen_t *, UINT16*, int); - void (*visible_16s)(const pen_t *, UINT16*, int); - void (*border_16)(const pen_t *, UINT16*); - void (*border_16s)(const pen_t *, UINT16*); - void (*sprites)(int, UINT8*); - void (*draw_sprite_16)(const pen_t *, UINT16*, UINT8*); - void (*draw_sprite_16s)(const pen_t *, UINT16*, UINT8*); -} V9938_MODE; + if ( !(m_stat_reg[0] & 0x40) ) + m_stat_reg[0] = (m_stat_reg[0] & 0xa0) | p; +} + +#define SHORT_WIDTH (256 + 16) +#define LONG_WIDTH (512 + 32) -static const V9938_MODE modes[] = { +const v99x8_device::v99x8_mode v99x8_device::s_modes[] = { { 0x02, - v9938_mode_text1_16, - v9938_mode_text1_16s, - v9938_default_border_16, - v9938_default_border_16s, + &v99x8_device::mode_text1, + &v99x8_device::mode_text1, + &v99x8_device::default_border, + &v99x8_device::default_border, NULL, NULL, NULL }, { 0x01, - v9938_mode_multi_16, - v9938_mode_multi_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode1, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_multi, + &v99x8_device::mode_multi, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode1, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x00, - v9938_mode_graphic1_16, - v9938_mode_graphic1_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode1, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_graphic1, + &v99x8_device::mode_graphic1, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode1, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x04, - v9938_mode_graphic23_16, - v9938_mode_graphic23_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode1, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_graphic23, + &v99x8_device::mode_graphic23, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode1, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x08, - v9938_mode_graphic23_16, - v9938_mode_graphic23_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode2, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_graphic23, + &v99x8_device::mode_graphic23, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode2, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x0c, - v9938_mode_graphic4_16, - v9938_mode_graphic4_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode2, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_graphic4, + &v99x8_device::mode_graphic4, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode2, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x10, - v9938_mode_graphic5_16, - v9938_mode_graphic5_16s, - v9938_graphic5_border_16, - v9938_graphic5_border_16s, - v9938_sprite_mode2, - v9938_graphic5_draw_sprite_16, - v9938_graphic5_draw_sprite_16s }, + &v99x8_device::mode_graphic5, + &v99x8_device::mode_graphic5, + &v99x8_device::graphic5_border, + &v99x8_device::graphic5_border, + &v99x8_device::sprite_mode2, + &v99x8_device::graphic5_draw_sprite, + &v99x8_device::graphic5_draw_sprite }, { 0x14, - v9938_mode_graphic6_16, - v9938_mode_graphic6_16s, - v9938_default_border_16, - v9938_default_border_16s, - v9938_sprite_mode2, - v9938_default_draw_sprite_16, - v9938_default_draw_sprite_16s }, + &v99x8_device::mode_graphic6, + &v99x8_device::mode_graphic6, + &v99x8_device::default_border, + &v99x8_device::default_border, + &v99x8_device::sprite_mode2, + &v99x8_device::default_draw_sprite, + &v99x8_device::default_draw_sprite }, { 0x1c, - v9938_mode_graphic7_16, - v9938_mode_graphic7_16s, - v9938_graphic7_border_16, - v9938_graphic7_border_16s, - v9938_sprite_mode2, - v9938_graphic7_draw_sprite_16, - v9938_graphic7_draw_sprite_16s }, + &v99x8_device::mode_graphic7, + &v99x8_device::mode_graphic7, + &v99x8_device::graphic7_border, + &v99x8_device::graphic7_border, + &v99x8_device::sprite_mode2, + &v99x8_device::graphic7_draw_sprite, + &v99x8_device::graphic7_draw_sprite }, { 0x0a, - v9938_mode_text2_16, - v9938_mode_text2_16s, - v9938_default_border_16, - v9938_default_border_16s, + &v99x8_device::mode_text2, + &v99x8_device::mode_text2, + &v99x8_device::default_border, + &v99x8_device::default_border, NULL, NULL, NULL }, { 0xff, - v9938_mode_unknown_16, - v9938_mode_unknown_16s, - v9938_default_border_16, - v9938_default_border_16s, + &v99x8_device::mode_unknown, + &v99x8_device::mode_unknown, + &v99x8_device::default_border, + &v99x8_device::default_border, NULL, NULL, NULL }, }; -static void v9938_set_mode (void) - { +void v99x8_device::set_mode () +{ int n,i; - n = (((vdp->contReg[0] & 0x0e) << 1) | ((vdp->contReg[1] & 0x18) >> 3)); + n = (((m_cont_reg[0] & 0x0e) << 1) | ((m_cont_reg[1] & 0x18) >> 3)); for (i=0;;i++) - { - if ( (modes[i].m == n) || (modes[i].m == 0xff) ) break; - } - vdp->mode = i; + { + if ( (s_modes[i].m == n) || (s_modes[i].m == 0xff) ) break; } + m_mode = i; +} -static void v9938_refresh_16 (running_machine &machine, bitmap_t *bmp, int line) - { - const pen_t *pens = machine.pens; +void v99x8_device::refresh_16 (int line) +{ + const pen_t *pens = machine().pens; int i, double_lines; UINT8 col[256]; UINT16 *ln, *ln2 = NULL; double_lines = 0; - if (vdp->size == RENDER_HIGH) + if (m_size == RENDER_HIGH) + { + if (m_cont_reg[9] & 0x08) { - if (vdp->contReg[9] & 0x08) - { - vdp->size_now = RENDER_HIGH; - ln = BITMAP_ADDR16(bmp, line*2+((vdp->statReg[2]>>1)&1), 0); - } + m_size_now = RENDER_HIGH; + ln = &m_bitmap.pix16(line*2+((m_stat_reg[2]>>1)&1)); + } else - { - ln = BITMAP_ADDR16(bmp, line*2, 0); - ln2 = BITMAP_ADDR16(bmp, line*2+1, 0); + { + ln = &m_bitmap.pix16(line*2); + ln2 = &m_bitmap.pix16(line*2+1); double_lines = 1; - } } + } else - ln = BITMAP_ADDR16(bmp, line, 0); + ln = &m_bitmap.pix16(line); - if ( !(vdp->contReg[1] & 0x40) || (vdp->statReg[2] & 0x40) ) - { - if (vdp->size == RENDER_HIGH) - modes[vdp->mode].border_16 (pens, ln); + if ( !(m_cont_reg[1] & 0x40) || (m_stat_reg[2] & 0x40) ) + { + if (m_size == RENDER_HIGH) + (this->*s_modes[m_mode].border_16) (pens, ln); else - modes[vdp->mode].border_16s (pens, ln); - } + (this->*s_modes[m_mode].border_16s) (pens, ln); + } else + { + i = (line - m_offset_y) & 255; + if (m_size == RENDER_HIGH) { - i = (line - vdp->offset_y) & 255; - if (vdp->size == RENDER_HIGH) + (this->*s_modes[m_mode].visible_16) (pens, ln, i); + if (s_modes[m_mode].sprites) { - modes[vdp->mode].visible_16 (pens, ln, i); - if (modes[vdp->mode].sprites) - { - modes[vdp->mode].sprites (i, col); - modes[vdp->mode].draw_sprite_16 (pens, ln, col); - } + (this->*s_modes[m_mode].sprites) (i, col); + (this->*s_modes[m_mode].draw_sprite_16) (pens, ln, col); } + } else + { + (this->*s_modes[m_mode].visible_16s) (pens, ln, i); + if (s_modes[m_mode].sprites) { - modes[vdp->mode].visible_16s (pens, ln, i); - if (modes[vdp->mode].sprites) - { - modes[vdp->mode].sprites (i, col); - modes[vdp->mode].draw_sprite_16s (pens, ln, col); - } + (this->*s_modes[m_mode].sprites) (i, col); + (this->*s_modes[m_mode].draw_sprite_16s) (pens, ln, col); } } + } if (double_lines) memcpy (ln2, ln, (512 + 32) * 2); - } +} -static void v9938_refresh_line (running_machine &machine, bitmap_t *bmp, int line) - { +void v99x8_device::refresh_line (int line) +{ int ind16, ind256; - ind16 = vdp->pal_ind16[0]; - ind256 = vdp->pal_ind256[0]; + ind16 = m_pal_ind16[0]; + ind256 = m_pal_ind256[0]; - if ( !(vdp->contReg[8] & 0x20) && (vdp->mode != V9938_MODE_GRAPHIC5) ) - { - vdp->pal_ind16[0] = vdp->pal_ind16[(vdp->contReg[7] & 0x0f)]; - vdp->pal_ind256[0] = vdp->pal_ind256[vdp->contReg[7]]; - } + if ( !(m_cont_reg[8] & 0x20) && (m_mode != V9938_MODE_GRAPHIC5) ) + { + m_pal_ind16[0] = m_pal_ind16[(m_cont_reg[7] & 0x0f)]; + m_pal_ind256[0] = m_pal_ind256[m_cont_reg[7]]; + } - v9938_refresh_16 (machine, bmp, line); + refresh_16 (line); - if ( !(vdp->contReg[8] & 0x20) && (vdp->mode != V9938_MODE_GRAPHIC5) ) - { - vdp->pal_ind16[0] = ind16; - vdp->pal_ind256[0] = ind256; - } + if ( !(m_cont_reg[8] & 0x20) && (m_mode != V9938_MODE_GRAPHIC5) ) + { + m_pal_ind16[0] = ind16; + m_pal_ind256[0] = ind256; } +} /* @@ -1409,153 +2158,64 @@ have to test. */ -static void v9938_interrupt_start_vblank (running_machine &machine) - { +void v99x8_device::interrupt_start_vblank () +{ #if 0 if (machine.input().code_pressed (KEYCODE_D) ) - { + { FILE *fp; int i; fp = fopen ("vram.dmp", "wb"); if (fp) - { - fwrite (vdp->vram, 0x10000, 1, fp); + { + fwrite (m_vram, 0x10000, 1, fp); fclose (fp); popmessage("saved"); - } - - for (i=0;i<24;i++) mame_printf_debug ("R#%d = %02x\n", i, vdp->contReg[i]); } + + for (i=0;i<24;i++) mame_printf_debug ("R#%d = %02x\n", i, m_cont_reg[i]); + } #endif - /* at every frame, vdp switches fields */ - vdp->statReg[2] = (vdp->statReg[2] & 0xfd) | (~vdp->statReg[2] & 2); + // at every frame, vdp switches fields + m_stat_reg[2] = (m_stat_reg[2] & 0xfd) | (~m_stat_reg[2] & 2); - /* color blinking */ - if (!(vdp->contReg[13] & 0xf0)) - vdp->blink = 0; - else if (!(vdp->contReg[13] & 0x0f)) - vdp->blink = 1; + // color blinking + if (!(m_cont_reg[13] & 0xf0)) + m_blink = 0; + else if (!(m_cont_reg[13] & 0x0f)) + m_blink = 1; else - { - /* both on and off counter are non-zero: timed blinking */ - if (vdp->blink_count) - vdp->blink_count--; - if (!vdp->blink_count) - { - vdp->blink = !vdp->blink; - if (vdp->blink) - vdp->blink_count = (vdp->contReg[13] >> 4) * 10; + { + // both on and off counter are non-zero: timed blinking + if (m_blink_count) + m_blink_count--; + if (!m_blink_count) + { + m_blink = !m_blink; + if (m_blink) + m_blink_count = (m_cont_reg[13] >> 4) * 10; else - vdp->blink_count = (vdp->contReg[13] & 0x0f) * 10; - } - } - - /* check screen rendering size */ - if (vdp->size_auto && (vdp->size_now >= 0) && (vdp->size != vdp->size_now) ) - vdp->size = vdp->size_now; - - if (vdp->size != vdp->size_old) - { - if (vdp->size == RENDER_HIGH) - vdp->screen->set_visible_area (0, 512 + 32 - 1, 0, 424 + 56 - 1); - else - vdp->screen->set_visible_area (0, 256 + 16 - 1, 0, 212 + 28 - 1); - - vdp->size_old = vdp->size; + m_blink_count = (m_cont_reg[13] & 0x0f) * 10; } - - vdp->size_now = -1; - } - -int v9938_interrupt (running_machine &machine, int which) -{ - int scanline, max, pal, scanline_start; - - vdp = &vdps[which]; - - v9938_update_command (); - - pal = vdp->contReg[9] & 2; - if (pal) scanline_start = 53; else scanline_start = 22; - - /* set flags */ - if (vdp->scanline == (vdp->offset_y + scanline_start) ) - { - vdp->statReg[2] &= ~0x40; - } - else if (vdp->scanline == (vdp->offset_y + vdp->visible_y + scanline_start) ) - { - vdp->statReg[2] |= 0x40; - vdp->statReg[0] |= 0x80; - } - - max = (pal) ? 255 : (vdp->contReg[9] & 0x80) ? 234 : 244; - scanline = (vdp->scanline - scanline_start - vdp->offset_y); - if ( (scanline >= 0) && (scanline <= max) && - ( ( (scanline + vdp->contReg[23]) & 255) == vdp->contReg[19]) ) - { - vdp->statReg[1] |= 1; - LOG(("V9938: scanline interrupt (%d)\n", scanline)); } - else - if ( !(vdp->contReg[0] & 0x10) ) vdp->statReg[1] &= 0xfe; - - v9938_check_int (machine); - /* check for start of vblank */ - if ((pal && (vdp->scanline == 310)) || - (!pal && (vdp->scanline == 259))) - v9938_interrupt_start_vblank (machine); + // check screen rendering size + if (m_size_auto && (m_size_now >= 0) && (m_size != m_size_now) ) + m_size = m_size_now; - /* render the current line */ - if ((vdp->scanline >= scanline_start) && (vdp->scanline < (212 + 28 + scanline_start))) + if (m_size != m_size_old) { - scanline = (vdp->scanline - scanline_start) & 255; - - v9938_refresh_line (machine, vdp->bitmap, scanline); - } - - max = (vdp->contReg[9] & 2) ? 313 : 262; - if (++vdp->scanline == max) - vdp->scanline = 0; - - return vdp->INT; -} + if (m_size == RENDER_HIGH) + m_screen->set_visible_area (0, 512 + 32 - 1, 0, 424 + 56 - 1); + else + m_screen->set_visible_area (0, 256 + 16 - 1, 0, 212 + 28 - 1); -/* - Not really right... won't work with sprites in graphics 7 - and with palette updated mid-screen -*/ -int v9938_get_transpen(int which) -{ - vdp = &vdps[which]; - if (vdp->mode == V9938_MODE_GRAPHIC7) - { - return vdp->pal_ind256[0]; + m_size_old = m_size; } - else - { - return vdp->pal_ind16[0]; - } -} - -/* - Driver-specific function: update the vdp mouse state -*/ -void v9938_update_mouse_state(int which, int mx_delta, int my_delta, int button_state) -{ - vdp = &vdps[which]; - - /* save button state */ - vdp->button_state = (button_state << 6) & 0xc0; - if ((vdp->contReg[8] & 0xc0) == 0x80) - { /* vdp will process mouse deltas only if it is in mouse mode */ - vdp->mx_delta += mx_delta; - vdp->my_delta += my_delta; - } + m_size_now = -1; } /*************************************************************************** @@ -1564,11 +2224,11 @@ ***************************************************************************/ -#define VDP vdp->contReg -#define VDPStatus vdp->statReg -#define VRAM vdp->vram -#define VRAM_EXP vdp->vram_exp -#define ScrMode vdp->mode +#define VDP m_cont_reg +#define VDPStatus m_stat_reg +#define VRAM m_vram +#define VRAM_EXP m_vram_exp +#define ScrMode m_mode /*************************************************************/ /** Completely rewritten by Alex Wulms: **/ @@ -1614,10 +2274,10 @@ #define CM_HMMC 0xF /*************************************************************/ -/* Many VDP commands are executed in some kind of loop but */ -/* essentially, there are only a few basic loop structures */ -/* that are re-used. We define the loop structures that are */ -/* re-used here so that they have to be entered only once */ +// Many VDP commands are executed in some kind of loop but +// essentially, there are only a few basic loop structures +// that are re-used. We define the loop structures that are +// re-used here so that they have to be entered only once /*************************************************************/ #define pre_loop \ while ((cnt-=delta) > 0) { @@ -1625,7 +2285,7 @@ #define post_loop \ } -/* Loop over DX, DY */ +// Loop over DX, DY #define post__x_y(MX) \ if (!--ANX || ((ADX+=TX)&MX)) { \ if (!(--NY&1023) || (DY+=TY)==-1) \ @@ -1637,7 +2297,7 @@ } \ post_loop -/* Loop over DX, SY, DY */ +// Loop over DX, SY, DY #define post__xyy(MX) \ if ((ADX+=TX)&MX) { \ if (!(--NY&1023) || (SY+=TY)==-1 || (DY+=TY)==-1) \ @@ -1647,7 +2307,7 @@ } \ post_loop -/* Loop over SX, DX, SY, DY */ +// Loop over SX, DX, SY, DY #define post_xxyy(MX) \ if (!--ANX || ((ASX+=TX)&MX) || ((ADX+=TX)&MX)) { \ if (!(--NY&1023) || (SY+=TY)==-1 || (DY+=TY)==-1) \ @@ -1661,61 +2321,17 @@ post_loop /*************************************************************/ -/** Function prototypes **/ -/*************************************************************/ -static UINT8 *VDPVRMP(register UINT8 M, register int MX, register int X, register int Y); - -static UINT8 VDPpoint5(register int MXS, register int SX, register int SY); -static UINT8 VDPpoint6(register int MXS, register int SX, register int SY); -static UINT8 VDPpoint7(register int MXS, register int SX, register int SY); -static UINT8 VDPpoint8(register int MXS, register int SX, register int SY); - -static UINT8 VDPpoint(register UINT8 SM, register int MXS, - register int SX, register int SY); - -static void VDPpsetlowlevel(register UINT8 *P, register UINT8 CL, - register UINT8 M, register UINT8 OP); - -static void VDPpset5(register int MXD, register int DX, register int DY, - register UINT8 CL, register UINT8 OP); -static void VDPpset6(register int MXD, register int DX, register int DY, - register UINT8 CL, register UINT8 OP); -static void VDPpset7(register int MXD, register int DX, register int DY, - register UINT8 CL, register UINT8 OP); -static void VDPpset8(register int MXD, register int DX, register int DY, - register UINT8 CL, register UINT8 OP); - -static void VDPpset(register UINT8 SM, register int MXD, - register int DX, register int DY, - register UINT8 CL, register UINT8 OP); - -static int GetVdpTimingValue(register const int *); - -static void SrchEngine(void); -static void LineEngine(void); -static void LmmvEngine(void); -static void LmmmEngine(void); -static void LmcmEngine(void); -static void LmmcEngine(void); -static void HmmvEngine(void); -static void HmmmEngine(void); -static void YmmmEngine(void); -static void HmmcEngine(void); - -static void ReportVdpCommand(register UINT8 Op); - -/*************************************************************/ /** Variables visible only in this module **/ /*************************************************************/ static const UINT8 Mask[4] = { 0x0F,0x03,0x0F,0xFF }; static const int PPB[4] = { 2,4,2,1 }; static const int PPL[4] = { 256,512,512,256 }; -/* SprOn SprOn SprOf SprOf */ -/* ScrOf ScrOn ScrOf ScrOn */ +// SprOn SprOn SprOf SprOf +// ScrOf ScrOn ScrOf ScrOn static const int srch_timing[8]={ - 818, 1025, 818, 830, /* ntsc */ - 696, 854, 696, 684 /* pal */ + 818, 1025, 818, 830, // ntsc + 696, 854, 696, 684 // pal }; static const int line_timing[8]={ 1063, 1259, 1063, 1161, @@ -1745,7 +2361,7 @@ /** VDPVRMP() **********************************************/ /** Calculate addr of a pixel in vram **/ /*************************************************************/ -INLINE UINT8 *VDPVRMP(UINT8 M,int MX,int X,int Y) +inline UINT8 *v99x8_device::VDPVRMP(UINT8 M,int MX,int X,int Y) { switch(M) { @@ -1761,7 +2377,7 @@ /** VDPpoint5() ***********************************************/ /** Get a pixel on screen 5 **/ /*************************************************************/ -INLINE UINT8 VDPpoint5(int MXS, int SX, int SY) +inline UINT8 v99x8_device::VDPpoint5(int MXS, int SX, int SY) { return (*VDP_VRMP5(MXS, SX, SY) >> (((~SX)&1)<<2) @@ -1771,7 +2387,7 @@ /** VDPpoint6() ***********************************************/ /** Get a pixel on screen 6 **/ /*************************************************************/ -INLINE UINT8 VDPpoint6(int MXS, int SX, int SY) +inline UINT8 v99x8_device::VDPpoint6(int MXS, int SX, int SY) { return (*VDP_VRMP6(MXS, SX, SY) >> (((~SX)&3)<<1) @@ -1781,7 +2397,7 @@ /** VDPpoint7() ***********************************************/ /** Get a pixel on screen 7 **/ /*************************************************************/ -INLINE UINT8 VDPpoint7(int MXS, int SX, int SY) +inline UINT8 v99x8_device::VDPpoint7(int MXS, int SX, int SY) { return (*VDP_VRMP7(MXS, SX, SY) >> (((~SX)&1)<<2) @@ -1791,7 +2407,7 @@ /** VDPpoint8() ***********************************************/ /** Get a pixel on screen 8 **/ /*************************************************************/ -INLINE UINT8 VDPpoint8(int MXS, int SX, int SY) +inline UINT8 v99x8_device::VDPpoint8(int MXS, int SX, int SY) { return *VDP_VRMP8(MXS, SX, SY); } @@ -1799,7 +2415,7 @@ /** VDPpoint() ************************************************/ /** Get a pixel on a screen **/ /*************************************************************/ -INLINE UINT8 VDPpoint(UINT8 SM, int MXS, int SX, int SY) +inline UINT8 v99x8_device::VDPpoint(UINT8 SM, int MXS, int SX, int SY) { switch(SM) { @@ -1816,7 +2432,7 @@ /** Low level function to set a pixel on a screen **/ /** Make it inline to make it fast **/ /*************************************************************/ -INLINE void VDPpsetlowlevel(UINT8 *P, UINT8 CL, UINT8 M, UINT8 OP) +inline void v99x8_device::VDPpsetlowlevel(UINT8 *P, UINT8 CL, UINT8 M, UINT8 OP) { switch (OP) { @@ -1836,9 +2452,9 @@ /** VDPpset5() ***********************************************/ /** Set a pixel on screen 5 **/ /*************************************************************/ -INLINE void VDPpset5(int MXD, int DX, int DY, UINT8 CL, UINT8 OP) +inline void v99x8_device::VDPpset5(int MXD, int DX, int DY, UINT8 CL, UINT8 OP) { - register UINT8 SH = ((~DX)&1)<<2; + UINT8 SH = ((~DX)&1)<<2; VDPpsetlowlevel(VDP_VRMP5(MXD, DX, DY), CL << SH, ~(15<>6)&1)|(VDP[8]&2)|((VDP[9]<<1)&4)]); } @@ -1899,30 +2515,30 @@ /** SrchEgine()** ********************************************/ /** Search a dot **/ /*************************************************************/ -void SrchEngine(void) +void v99x8_device::SrchEngine() { - register int SX=vdp->MMC.SX; - register int SY=vdp->MMC.SY; - register int TX=vdp->MMC.TX; - register int ANX=vdp->MMC.ANX; - register UINT8 CL=vdp->MMC.CL; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int SX=m_mmc.SX; + int SY=m_mmc.SY; + int TX=m_mmc.TX; + int ANX=m_mmc.ANX; + UINT8 CL=m_mmc.CL; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(srch_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; #define pre_srch \ pre_loop \ if (( #define post_srch(MX) \ ==CL) ^ANX) { \ - VDPStatus[2]|=0x10; /* Border detected */ \ + VDPStatus[2]|=0x10; /* Border detected */\ break; \ } \ if ((SX+=TX) & MX) { \ - VDPStatus[2]&=0xEF; /* Border not detected */ \ + VDPStatus[2]&=0xEF; /* Border not detected */\ break; \ } \ post_loop @@ -1939,40 +2555,40 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; - /* Update SX in VDP registers */ + m_vdp_engine=0; + // Update SX in VDP registers VDPStatus[8]=SX&0xFF; VDPStatus[9]=(SX>>8)|0xFE; } else { - vdp->MMC.SX=SX; + m_mmc.SX=SX; } } /** LineEgine()** ********************************************/ /** Draw a line **/ /*************************************************************/ -void LineEngine(void) +void v99x8_device::LineEngine() { - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NX=vdp->MMC.NX; - register int NY=vdp->MMC.NY; - register int ASX=vdp->MMC.ASX; - register int ADX=vdp->MMC.ADX; - register UINT8 CL=vdp->MMC.CL; - register UINT8 LO=vdp->MMC.LO; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NX=m_mmc.NX; + int NY=m_mmc.NY; + int ASX=m_mmc.ASX; + int ADX=m_mmc.ADX; + UINT8 CL=m_mmc.CL; + UINT8 LO=m_mmc.LO; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(line_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; #define post_linexmaj(MX) \ DX+=TX; \ @@ -1980,7 +2596,7 @@ ASX+=NX; \ DY+=TY; \ } \ - ASX&=1023; /* Mask to 10 bits range */ \ + ASX&=1023; /* Mask to 10 bits range */\ if (ADX++==NX || (DX&MX)) \ break; \ post_loop @@ -1991,13 +2607,13 @@ ASX+=NX; \ DX+=TX; \ } \ - ASX&=1023; /* Mask to 10 bits range */ \ + ASX&=1023; /* Mask to 10 bits range */\ if (ADX++==NX || (DX&MX)) \ break; \ post_loop if ((VDP[45]&0x01)==0) - /* X-Axis is major direction */ + // X-Axis is major direction switch (ScrMode) { default: case 5: pre_loop VDPpset5(MXD, DX, DY, CL, LO); post_linexmaj(256) @@ -2010,7 +2626,7 @@ break; } else - /* Y-Axis is major direction */ + // Y-Axis is major direction switch (ScrMode) { default: case 5: pre_loop VDPpset5(MXD, DX, DY, CL, LO); post_lineymaj(256) @@ -2023,42 +2639,42 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; VDP[38]=DY & 0xFF; VDP[39]=(DY>>8) & 0x03; } else { - vdp->MMC.DX=DX; - vdp->MMC.DY=DY; - vdp->MMC.ASX=ASX; - vdp->MMC.ADX=ADX; + m_mmc.DX=DX; + m_mmc.DY=DY; + m_mmc.ASX=ASX; + m_mmc.ADX=ADX; } } /** LmmvEngine() *********************************************/ /** VDP -> Vram **/ /*************************************************************/ -void LmmvEngine(void) +void v99x8_device::LmmvEngine() { - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NX=vdp->MMC.NX; - register int NY=vdp->MMC.NY; - register int ADX=vdp->MMC.ADX; - register int ANX=vdp->MMC.ANX; - register UINT8 CL=vdp->MMC.CL; - register UINT8 LO=vdp->MMC.LO; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NX=m_mmc.NX; + int NY=m_mmc.NY; + int ADX=m_mmc.ADX; + int ANX=m_mmc.ANX; + UINT8 CL=m_mmc.CL; + UINT8 LO=m_mmc.LO; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(lmmv_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; switch (ScrMode) { default: @@ -2072,10 +2688,10 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; if (!NY) DY+=TY; VDP[38]=DY & 0xFF; @@ -2084,37 +2700,37 @@ VDP[43]=(NY>>8) & 0x03; } else { - vdp->MMC.DY=DY; - vdp->MMC.NY=NY; - vdp->MMC.ANX=ANX; - vdp->MMC.ADX=ADX; + m_mmc.DY=DY; + m_mmc.NY=NY; + m_mmc.ANX=ANX; + m_mmc.ADX=ADX; } } /** LmmmEngine() *********************************************/ /** Vram -> Vram **/ /*************************************************************/ -void LmmmEngine(void) +void v99x8_device::LmmmEngine() { - register int SX=vdp->MMC.SX; - register int SY=vdp->MMC.SY; - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NX=vdp->MMC.NX; - register int NY=vdp->MMC.NY; - register int ASX=vdp->MMC.ASX; - register int ADX=vdp->MMC.ADX; - register int ANX=vdp->MMC.ANX; - register UINT8 LO=vdp->MMC.LO; - register int MXS = vdp->MMC.MXS; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int SX=m_mmc.SX; + int SY=m_mmc.SY; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NX=m_mmc.NX; + int NY=m_mmc.NY; + int ASX=m_mmc.ASX; + int ADX=m_mmc.ADX; + int ANX=m_mmc.ANX; + UINT8 LO=m_mmc.LO; + int MXS = m_mmc.MXS; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(lmmm_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; switch (ScrMode) { default: @@ -2128,10 +2744,10 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; if (!NY) { SY+=TY; DY+=TY; @@ -2147,40 +2763,40 @@ VDP[39]=(DY>>8) & 0x03; } else { - vdp->MMC.SY=SY; - vdp->MMC.DY=DY; - vdp->MMC.NY=NY; - vdp->MMC.ANX=ANX; - vdp->MMC.ASX=ASX; - vdp->MMC.ADX=ADX; + m_mmc.SY=SY; + m_mmc.DY=DY; + m_mmc.NY=NY; + m_mmc.ANX=ANX; + m_mmc.ASX=ASX; + m_mmc.ADX=ADX; } } /** LmcmEngine() *********************************************/ /** Vram -> CPU **/ /*************************************************************/ -void LmcmEngine(void) +void v99x8_device::LmcmEngine() { if ((VDPStatus[2]&0x80)!=0x80) { - VDPStatus[7]=VDP[44]=VDP_POINT(((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0, vdp->MMC.MXS, vdp->MMC.ASX, vdp->MMC.SY); - vdp->VdpOpsCnt-=GetVdpTimingValue(lmmv_timing); + VDPStatus[7]=VDP[44]=VDP_POINT(((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0, m_mmc.MXS, m_mmc.ASX, m_mmc.SY); + m_vdp_ops_count-=GetVdpTimingValue(lmmv_timing); VDPStatus[2]|=0x80; - if (!--vdp->MMC.ANX || ((vdp->MMC.ASX+=vdp->MMC.TX)&vdp->MMC.MX)) { - if (!(--vdp->MMC.NY & 1023) || (vdp->MMC.SY+=vdp->MMC.TY)==-1) { + if (!--m_mmc.ANX || ((m_mmc.ASX+=m_mmc.TX)&m_mmc.MX)) { + if (!(--m_mmc.NY & 1023) || (m_mmc.SY+=m_mmc.TY)==-1) { VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; - if (!vdp->MMC.NY) - vdp->MMC.DY+=vdp->MMC.TY; - VDP[42]=vdp->MMC.NY & 0xFF; - VDP[43]=(vdp->MMC.NY>>8) & 0x03; - VDP[34]=vdp->MMC.SY & 0xFF; - VDP[35]=(vdp->MMC.SY>>8) & 0x03; + m_vdp_engine=0; + if (!m_mmc.NY) + m_mmc.DY+=m_mmc.TY; + VDP[42]=m_mmc.NY & 0xFF; + VDP[43]=(m_mmc.NY>>8) & 0x03; + VDP[34]=m_mmc.SY & 0xFF; + VDP[35]=(m_mmc.SY>>8) & 0x03; } else { - vdp->MMC.ASX=vdp->MMC.SX; - vdp->MMC.ANX=vdp->MMC.NX; + m_mmc.ASX=m_mmc.SX; + m_mmc.ANX=m_mmc.NX; } } } @@ -2189,30 +2805,30 @@ /** LmmcEngine() *********************************************/ /** CPU -> Vram **/ /*************************************************************/ -void LmmcEngine(void) +void v99x8_device::LmmcEngine() { if ((VDPStatus[2]&0x80)!=0x80) { - register UINT8 SM=((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0; + UINT8 SM=((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0; VDPStatus[7]=VDP[44]&=Mask[SM]; - VDP_PSET(SM, vdp->MMC.MXD, vdp->MMC.ADX, vdp->MMC.DY, VDP[44], vdp->MMC.LO); - vdp->VdpOpsCnt-=GetVdpTimingValue(lmmv_timing); + VDP_PSET(SM, m_mmc.MXD, m_mmc.ADX, m_mmc.DY, VDP[44], m_mmc.LO); + m_vdp_ops_count-=GetVdpTimingValue(lmmv_timing); VDPStatus[2]|=0x80; - if (!--vdp->MMC.ANX || ((vdp->MMC.ADX+=vdp->MMC.TX)&vdp->MMC.MX)) { - if (!(--vdp->MMC.NY&1023) || (vdp->MMC.DY+=vdp->MMC.TY)==-1) { + if (!--m_mmc.ANX || ((m_mmc.ADX+=m_mmc.TX)&m_mmc.MX)) { + if (!(--m_mmc.NY&1023) || (m_mmc.DY+=m_mmc.TY)==-1) { VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; - if (!vdp->MMC.NY) - vdp->MMC.DY+=vdp->MMC.TY; - VDP[42]=vdp->MMC.NY & 0xFF; - VDP[43]=(vdp->MMC.NY>>8) & 0x03; - VDP[38]=vdp->MMC.DY & 0xFF; - VDP[39]=(vdp->MMC.DY>>8) & 0x03; + m_vdp_engine=0; + if (!m_mmc.NY) + m_mmc.DY+=m_mmc.TY; + VDP[42]=m_mmc.NY & 0xFF; + VDP[43]=(m_mmc.NY>>8) & 0x03; + VDP[38]=m_mmc.DY & 0xFF; + VDP[39]=(m_mmc.DY>>8) & 0x03; } else { - vdp->MMC.ADX=vdp->MMC.DX; - vdp->MMC.ANX=vdp->MMC.NX; + m_mmc.ADX=m_mmc.DX; + m_mmc.ANX=m_mmc.NX; } } } @@ -2221,23 +2837,23 @@ /** HmmvEngine() *********************************************/ /** VDP --> Vram **/ /*************************************************************/ -void HmmvEngine(void) +void v99x8_device::HmmvEngine() { - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NX=vdp->MMC.NX; - register int NY=vdp->MMC.NY; - register int ADX=vdp->MMC.ADX; - register int ANX=vdp->MMC.ANX; - register UINT8 CL=vdp->MMC.CL; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NX=m_mmc.NX; + int NY=m_mmc.NY; + int ADX=m_mmc.ADX; + int ANX=m_mmc.ANX; + UINT8 CL=m_mmc.CL; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(hmmv_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; switch (ScrMode) { default: @@ -2251,10 +2867,10 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; if (!NY) DY+=TY; VDP[42]=NY & 0xFF; @@ -2263,36 +2879,36 @@ VDP[39]=(DY>>8) & 0x03; } else { - vdp->MMC.DY=DY; - vdp->MMC.NY=NY; - vdp->MMC.ANX=ANX; - vdp->MMC.ADX=ADX; + m_mmc.DY=DY; + m_mmc.NY=NY; + m_mmc.ANX=ANX; + m_mmc.ADX=ADX; } } /** HmmmEngine() *********************************************/ /** Vram -> Vram **/ /*************************************************************/ -void HmmmEngine(void) +void v99x8_device::HmmmEngine() { - register int SX=vdp->MMC.SX; - register int SY=vdp->MMC.SY; - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NX=vdp->MMC.NX; - register int NY=vdp->MMC.NY; - register int ASX=vdp->MMC.ASX; - register int ADX=vdp->MMC.ADX; - register int ANX=vdp->MMC.ANX; - register int MXS = vdp->MMC.MXS; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int SX=m_mmc.SX; + int SY=m_mmc.SY; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NX=m_mmc.NX; + int NY=m_mmc.NY; + int ASX=m_mmc.ASX; + int ADX=m_mmc.ADX; + int ANX=m_mmc.ANX; + int MXS = m_mmc.MXS; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(hmmm_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; switch (ScrMode) { default: @@ -2306,10 +2922,10 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; if (!NY) { SY+=TY; DY+=TY; @@ -2325,33 +2941,33 @@ VDP[39]=(DY>>8) & 0x03; } else { - vdp->MMC.SY=SY; - vdp->MMC.DY=DY; - vdp->MMC.NY=NY; - vdp->MMC.ANX=ANX; - vdp->MMC.ASX=ASX; - vdp->MMC.ADX=ADX; + m_mmc.SY=SY; + m_mmc.DY=DY; + m_mmc.NY=NY; + m_mmc.ANX=ANX; + m_mmc.ASX=ASX; + m_mmc.ADX=ADX; } } /** YmmmEngine() *********************************************/ /** Vram -> Vram **/ /*************************************************************/ -void YmmmEngine(void) +void v99x8_device::YmmmEngine() { - register int SY=vdp->MMC.SY; - register int DX=vdp->MMC.DX; - register int DY=vdp->MMC.DY; - register int TX=vdp->MMC.TX; - register int TY=vdp->MMC.TY; - register int NY=vdp->MMC.NY; - register int ADX=vdp->MMC.ADX; - register int MXD = vdp->MMC.MXD; - register int cnt; - register int delta; + int SY=m_mmc.SY; + int DX=m_mmc.DX; + int DY=m_mmc.DY; + int TX=m_mmc.TX; + int TY=m_mmc.TY; + int NY=m_mmc.NY; + int ADX=m_mmc.ADX; + int MXD = m_mmc.MXD; + int cnt; + int delta; delta = GetVdpTimingValue(ymmm_timing); - cnt = vdp->VdpOpsCnt; + cnt = m_vdp_ops_count; switch (ScrMode) { default: @@ -2365,10 +2981,10 @@ break; } - if ((vdp->VdpOpsCnt=cnt)>0) { - /* Command execution done */ + if ((m_vdp_ops_count=cnt)>0) { + // Command execution done VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; if (!NY) { SY+=TY; DY+=TY; @@ -2384,67 +3000,67 @@ VDP[39]=(DY>>8) & 0x03; } else { - vdp->MMC.SY=SY; - vdp->MMC.DY=DY; - vdp->MMC.NY=NY; - vdp->MMC.ADX=ADX; + m_mmc.SY=SY; + m_mmc.DY=DY; + m_mmc.NY=NY; + m_mmc.ADX=ADX; } } /** HmmcEngine() *********************************************/ /** CPU -> Vram **/ /*************************************************************/ -void HmmcEngine(void) +void v99x8_device::HmmcEngine() { if ((VDPStatus[2]&0x80)!=0x80) { - *VDP_VRMP(((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0, vdp->MMC.MXD, vdp->MMC.ADX, vdp->MMC.DY)=VDP[44]; - vdp->VdpOpsCnt-=GetVdpTimingValue(hmmv_timing); + *VDP_VRMP(((ScrMode >= 5) && (ScrMode <= 8)) ? (ScrMode-5) : 0, m_mmc.MXD, m_mmc.ADX, m_mmc.DY)=VDP[44]; + m_vdp_ops_count-=GetVdpTimingValue(hmmv_timing); VDPStatus[2]|=0x80; - if (!--vdp->MMC.ANX || ((vdp->MMC.ADX+=vdp->MMC.TX)&vdp->MMC.MX)) { - if (!(--vdp->MMC.NY&1023) || (vdp->MMC.DY+=vdp->MMC.TY)==-1) { + if (!--m_mmc.ANX || ((m_mmc.ADX+=m_mmc.TX)&m_mmc.MX)) { + if (!(--m_mmc.NY&1023) || (m_mmc.DY+=m_mmc.TY)==-1) { VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; - if (!vdp->MMC.NY) - vdp->MMC.DY+=vdp->MMC.TY; - VDP[42]=vdp->MMC.NY & 0xFF; - VDP[43]=(vdp->MMC.NY>>8) & 0x03; - VDP[38]=vdp->MMC.DY & 0xFF; - VDP[39]=(vdp->MMC.DY>>8) & 0x03; + m_vdp_engine=0; + if (!m_mmc.NY) + m_mmc.DY+=m_mmc.TY; + VDP[42]=m_mmc.NY & 0xFF; + VDP[43]=(m_mmc.NY>>8) & 0x03; + VDP[38]=m_mmc.DY & 0xFF; + VDP[39]=(m_mmc.DY>>8) & 0x03; } else { - vdp->MMC.ADX=vdp->MMC.DX; - vdp->MMC.ANX=vdp->MMC.NX; + m_mmc.ADX=m_mmc.DX; + m_mmc.ANX=m_mmc.NX; } } } } /** VDPWrite() ***********************************************/ -/** Use this function to transfer pixel(s) from CPU to vdp-> **/ +/** Use this function to transfer pixel(s) from CPU to m_ **/ /*************************************************************/ -static void v9938_cpu_to_vdp (UINT8 V) +void v99x8_device::cpu_to_vdp (UINT8 V) { VDPStatus[2]&=0x7F; VDPStatus[7]=VDP[44]=V; - if(vdp->VdpEngine&&(vdp->VdpOpsCnt>0)) vdp->VdpEngine(); + if(m_vdp_engine&&(m_vdp_ops_count>0)) (this->*m_vdp_engine)(); } /** VDPRead() ************************************************/ /** Use this function to transfer pixel(s) from VDP to CPU. **/ /*************************************************************/ -static UINT8 v9938_vdp_to_cpu (void) +UINT8 v99x8_device::vdp_to_cpu () { VDPStatus[2]&=0x7F; - if(vdp->VdpEngine&&(vdp->VdpOpsCnt>0)) vdp->VdpEngine(); + if(m_vdp_engine&&(m_vdp_ops_count>0)) (this->*m_vdp_engine)(); return(VDP[44]); } /** ReportVdpCommand() ***************************************/ /** Report VDP Command to be executed **/ /*************************************************************/ -static void ReportVdpCommand(register UINT8 Op) +void v99x8_device::ReportVdpCommand(UINT8 Op) { static const char *const Ops[16] = { @@ -2457,10 +3073,10 @@ " LMMV"," LMMM"," LMCM"," LMMC"," HMMV"," HMMM"," YMMM"," HMMC" }; - register UINT8 CL, CM, LO; - register int SX,SY, DX,DY, NX,NY; + UINT8 CL, CM, LO; + int SX,SY, DX,DY, NX,NY; - /* Fetch arguments */ + // Fetch arguments CL = VDP[44]; SX = (VDP[32]+((int)VDP[33]<<8)) & 511; SY = (VDP[34]+((int)VDP[35]<<8)) & 1023; @@ -2482,32 +3098,32 @@ /** VDPDraw() ************************************************/ /** Perform a given V9938 operation Op. **/ /*************************************************************/ -static UINT8 v9938_command_unit_w (UINT8 Op) +UINT8 v99x8_device::command_unit_w (UINT8 Op) { - register int SM; + int SM; - /* V9938 ops only work in SCREENs 5-8 */ + // V9938 ops only work in SCREENs 5-8 if (ScrMode<5) return(0); - SM = ScrMode-5; /* Screen mode index 0..3 */ + SM = ScrMode-5; // Screen mode index 0..3 - vdp->MMC.CM = Op>>4; - if ((vdp->MMC.CM & 0x0C) != 0x0C && vdp->MMC.CM != 0) - /* Dot operation: use only relevant bits of color */ + m_mmc.CM = Op>>4; + if ((m_mmc.CM & 0x0C) != 0x0C && m_mmc.CM != 0) + // Dot operation: use only relevant bits of color VDPStatus[7]=(VDP[44]&=Mask[SM]); -/* if(Verbose&0x02) */ +// if(Verbose&0x02) ReportVdpCommand(Op); switch(Op>>4) { case CM_ABRT: VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; return 1; case CM_POINT: VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; VDPStatus[7]=VDP[44]= VDP_POINT(SM, (VDP[45] & 0x10) != 0, VDP[32]+((int)VDP[33]<<8), @@ -2515,7 +3131,7 @@ return 1; case CM_PSET: VDPStatus[2]&=0xFE; - vdp->VdpEngine=0; + m_vdp_engine=0; VDP_PSET(SM, (VDP[45] & 0x20) != 0, VDP[36]+((int)VDP[37]<<8), VDP[38]+((int)VDP[39]<<8), @@ -2523,103 +3139,103 @@ Op&0x0F); return 1; case CM_SRCH: - vdp->VdpEngine=SrchEngine; + m_vdp_engine=&v99x8_device::SrchEngine; break; case CM_LINE: - vdp->VdpEngine=LineEngine; + m_vdp_engine=&v99x8_device::LineEngine; break; case CM_LMMV: - vdp->VdpEngine=LmmvEngine; + m_vdp_engine=&v99x8_device::LmmvEngine; break; case CM_LMMM: - vdp->VdpEngine=LmmmEngine; + m_vdp_engine=&v99x8_device::LmmmEngine; break; case CM_LMCM: - vdp->VdpEngine=LmcmEngine; + m_vdp_engine=&v99x8_device::LmcmEngine; break; case CM_LMMC: - vdp->VdpEngine=LmmcEngine; + m_vdp_engine=&v99x8_device::LmmcEngine; break; case CM_HMMV: - vdp->VdpEngine=HmmvEngine; + m_vdp_engine=&v99x8_device::HmmvEngine; break; case CM_HMMM: - vdp->VdpEngine=HmmmEngine; + m_vdp_engine=&v99x8_device::HmmmEngine; break; case CM_YMMM: - vdp->VdpEngine=YmmmEngine; + m_vdp_engine=&v99x8_device::YmmmEngine; break; case CM_HMMC: - vdp->VdpEngine=HmmcEngine; + m_vdp_engine=&v99x8_device::HmmcEngine; break; default: LOG(("V9938: Unrecognized opcode %02Xh\n",Op)); return(0); } - /* Fetch unconditional arguments */ - vdp->MMC.SX = (VDP[32]+((int)VDP[33]<<8)) & 511; - vdp->MMC.SY = (VDP[34]+((int)VDP[35]<<8)) & 1023; - vdp->MMC.DX = (VDP[36]+((int)VDP[37]<<8)) & 511; - vdp->MMC.DY = (VDP[38]+((int)VDP[39]<<8)) & 1023; - vdp->MMC.NY = (VDP[42]+((int)VDP[43]<<8)) & 1023; - vdp->MMC.TY = VDP[45]&0x08? -1:1; - vdp->MMC.MX = PPL[SM]; - vdp->MMC.CL = VDP[44]; - vdp->MMC.LO = Op&0x0F; - vdp->MMC.MXS = (VDP[45] & 0x10) != 0; - vdp->MMC.MXD = (VDP[45] & 0x20) != 0; - - /* Argument depends on UINT8 or dot operation */ - if ((vdp->MMC.CM & 0x0C) == 0x0C) { - vdp->MMC.TX = VDP[45]&0x04? -PPB[SM]:PPB[SM]; - vdp->MMC.NX = ((VDP[40]+((int)VDP[41]<<8)) & 1023)/PPB[SM]; + // Fetch unconditional arguments + m_mmc.SX = (VDP[32]+((int)VDP[33]<<8)) & 511; + m_mmc.SY = (VDP[34]+((int)VDP[35]<<8)) & 1023; + m_mmc.DX = (VDP[36]+((int)VDP[37]<<8)) & 511; + m_mmc.DY = (VDP[38]+((int)VDP[39]<<8)) & 1023; + m_mmc.NY = (VDP[42]+((int)VDP[43]<<8)) & 1023; + m_mmc.TY = VDP[45]&0x08? -1:1; + m_mmc.MX = PPL[SM]; + m_mmc.CL = VDP[44]; + m_mmc.LO = Op&0x0F; + m_mmc.MXS = (VDP[45] & 0x10) != 0; + m_mmc.MXD = (VDP[45] & 0x20) != 0; + + // Argument depends on UINT8 or dot operation + if ((m_mmc.CM & 0x0C) == 0x0C) { + m_mmc.TX = VDP[45]&0x04? -PPB[SM]:PPB[SM]; + m_mmc.NX = ((VDP[40]+((int)VDP[41]<<8)) & 1023)/PPB[SM]; } else { - vdp->MMC.TX = VDP[45]&0x04? -1:1; - vdp->MMC.NX = (VDP[40]+((int)VDP[41]<<8)) & 1023; + m_mmc.TX = VDP[45]&0x04? -1:1; + m_mmc.NX = (VDP[40]+((int)VDP[41]<<8)) & 1023; } - /* X loop variables are treated specially for LINE command */ - if (vdp->MMC.CM == CM_LINE) { - vdp->MMC.ASX=((vdp->MMC.NX-1)>>1); - vdp->MMC.ADX=0; + // X loop variables are treated specially for LINE command + if (m_mmc.CM == CM_LINE) { + m_mmc.ASX=((m_mmc.NX-1)>>1); + m_mmc.ADX=0; } else { - vdp->MMC.ASX = vdp->MMC.SX; - vdp->MMC.ADX = vdp->MMC.DX; + m_mmc.ASX = m_mmc.SX; + m_mmc.ADX = m_mmc.DX; } - /* NX loop variable is treated specially for SRCH command */ - if (vdp->MMC.CM == CM_SRCH) - vdp->MMC.ANX=(VDP[45]&0x02)!=0; /* Do we look for "==" or "!="? */ + // NX loop variable is treated specially for SRCH command + if (m_mmc.CM == CM_SRCH) + m_mmc.ANX=(VDP[45]&0x02)!=0; // Do we look for "==" or "!="? else - vdp->MMC.ANX = vdp->MMC.NX; + m_mmc.ANX = m_mmc.NX; - /* Command execution started */ + // Command execution started VDPStatus[2]|=0x01; - /* Start execution if we still have time slices */ - if(vdp->VdpEngine&&(vdp->VdpOpsCnt>0)) vdp->VdpEngine(); + // Start execution if we still have time slices + if(m_vdp_engine&&(m_vdp_ops_count>0)) (this->*m_vdp_engine)(); - /* Operation successfull initiated */ + // Operation successfull initiated return(1); } /** LoopVDP() ************************************************/ /** Run X steps of active VDP command **/ /*************************************************************/ -static void v9938_update_command (void) +void v99x8_device::update_command () { - if(vdp->VdpOpsCnt<=0) + if(m_vdp_ops_count<=0) { - vdp->VdpOpsCnt+=13662; - if(vdp->VdpEngine&&(vdp->VdpOpsCnt>0)) vdp->VdpEngine(); + m_vdp_ops_count+=13662; + if(m_vdp_engine&&(m_vdp_ops_count>0)) (this->*m_vdp_engine)(); } else { - vdp->VdpOpsCnt=13662; - if(vdp->VdpEngine) vdp->VdpEngine(); + m_vdp_ops_count=13662; + if(m_vdp_engine) (this->*m_vdp_engine)(); } } diff -Nru mame-0.144/src/emu/video/v9938.h mame-0.145/src/emu/video/v9938.h --- mame-0.144/src/emu/video/v9938.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/v9938.h 2012-02-06 21:30:27.000000000 +0000 @@ -4,36 +4,257 @@ ***************************************************************************/ -/* init functions */ +#pragma once + +#ifndef __V9938_H__ +#define __V9938_H__ + + + +//************************************************************************** +// DEVICE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_V9938_ADD(_tag, _screen, _vramsize) \ + MCFG_DEVICE_ADD(_tag, V9938, 0) \ + v9938_device::static_set_screen(*device, _screen); \ + v9938_device::static_set_vram_size(*device, _vramsize); \ + +#define MCFG_V9958_ADD(_tag, _screen, _vramsize) \ + MCFG_DEVICE_ADD(_tag, V9958, 0) \ + v9938_device::static_set_screen(*device, _screen); \ + v9938_device::static_set_vram_size(*device, _vramsize); \ + +#define MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(_func) \ + v9938_device::static_set_interrupt_callback(*device, v99x8_interrupt_delegate(_func, #_func, (device_t *)0), device->tag()); + +#define MCFG_V99X8_INTERRUPT_CALLBACK_DEVICE(_devname, _class, _func) \ + v9938_device::static_set_interrupt_callback(*device, v99x8_interrupt_delegate(&_class::_func, #_class "::" #_func, (_class *)0), _devname); + + +// init functions #define MODEL_V9938 (0) #define MODEL_V9958 (1) -/* resolutions */ +// resolutions #define RENDER_HIGH (0) #define RENDER_LOW (1) #define RENDER_AUTO (2) -void v9938_init (running_machine &machine, int which, screen_device &screen, bitmap_t *bitmap, int model, int vram_size, void (*callback)(running_machine &, int) ); -void v9938_reset (int which); -int v9938_interrupt (running_machine &machine, int which); -void v9938_set_sprite_limit (int which, int); -void v9938_set_resolution (int which, int); -int v9938_get_transpen(int which); - -extern PALETTE_INIT( v9938 ); -extern PALETTE_INIT( v9958 ); -extern WRITE8_HANDLER( v9938_0_palette_w ); -extern WRITE8_HANDLER( v9938_1_palette_w ); -extern WRITE8_HANDLER( v9938_0_vram_w ); -extern WRITE8_HANDLER( v9938_1_vram_w ); -extern READ8_HANDLER( v9938_0_vram_r ); -extern READ8_HANDLER( v9938_1_vram_r ); -extern WRITE8_HANDLER( v9938_0_command_w ); -extern WRITE8_HANDLER( v9938_1_command_w ); -extern READ8_HANDLER( v9938_0_status_r ); -extern READ8_HANDLER( v9938_1_status_r ); -extern WRITE8_HANDLER( v9938_0_register_w ); -extern WRITE8_HANDLER( v9938_1_register_w ); -void v9938_update_mouse_state(int which, int mx_delta, int my_delta, int button_state); +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +extern const device_type V9938; +extern const device_type V9958; + + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class v99x8_device; +typedef delegate v99x8_interrupt_delegate; + + +// ======================> v99x8_device + +class v99x8_device : public device_t +{ + friend PALETTE_INIT( v9958 ); + +protected: + // construction/destruction + v99x8_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, UINT32 clock); + +public: + int interrupt (); + void set_sprite_limit (int i) { m_sprite_limit = i; } + void set_resolution (int); + int get_transpen(); + bitmap_ind16 &get_bitmap() { return m_bitmap; } + void update_mouse_state(int mx_delta, int my_delta, int button_state); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + + UINT8 vram_r(); + UINT8 status_r(); + void palette_w(UINT8 data); + void vram_w(UINT8 data); + void command_w(UINT8 data); + void register_w(UINT8 data); + + static void static_set_screen(device_t &device, const char *screen_name); + static void static_set_vram_size(device_t &device, UINT32 vram_size); + static void static_set_interrupt_callback(device_t &device, v99x8_interrupt_delegate callback, const char *device_name); + +protected: + int m_model; + + // device overrides + virtual void device_start(); + virtual void device_reset(); + +private: + // internal helpers + void reset_palette (); + void vram_write (int offset, int data); + int vram_read (int offset); + void check_int (); + void register_write (int reg, int data); + + template void default_border(const pen_t *pens, _PixelType *ln); + template void graphic7_border(const pen_t *pens, _PixelType *ln); + template void graphic5_border(const pen_t *pens, _PixelType *ln); + template void mode_text1(const pen_t *pens, _PixelType *ln, int line); + template void mode_text2(const pen_t *pens, _PixelType *ln, int line); + template void mode_multi(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic1(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic23(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic4(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic5(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic6(const pen_t *pens, _PixelType *ln, int line); + template void mode_graphic7(const pen_t *pens, _PixelType *ln, int line); + template void mode_unknown(const pen_t *pens, _PixelType *ln, int line); + template void default_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col); + template void graphic5_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col); + template void graphic7_draw_sprite(const pen_t *pens, _PixelType *ln, UINT8 *col); + + void sprite_mode1 (int line, UINT8 *col); + void sprite_mode2 (int line, UINT8 *col); + void set_mode (); + void refresh_16 (int line); + void refresh_line (int line); + + void interrupt_start_vblank (); + + UINT8 *VDPVRMP(UINT8 M, int MX, int X, int Y); + + UINT8 VDPpoint5(int MXS, int SX, int SY); + UINT8 VDPpoint6(int MXS, int SX, int SY); + UINT8 VDPpoint7(int MXS, int SX, int SY); + UINT8 VDPpoint8(int MXS, int SX, int SY); + + UINT8 VDPpoint(UINT8 SM, int MXS, int SX, int SY); + + void VDPpsetlowlevel(UINT8 *P, UINT8 CL, UINT8 M, UINT8 OP); + + void VDPpset5(int MXD, int DX, int DY, UINT8 CL, UINT8 OP); + void VDPpset6(int MXD, int DX, int DY, UINT8 CL, UINT8 OP); + void VDPpset7(int MXD, int DX, int DY, UINT8 CL, UINT8 OP); + void VDPpset8(int MXD, int DX, int DY, UINT8 CL, UINT8 OP); + + void VDPpset(UINT8 SM, int MXD, int DX, int DY, UINT8 CL, UINT8 OP); + + int GetVdpTimingValue(const int *); + + void SrchEngine(); + void LineEngine(); + void LmmvEngine(); + void LmmmEngine(); + void LmcmEngine(); + void LmmcEngine(); + void HmmvEngine(); + void HmmmEngine(); + void YmmmEngine(); + void HmmcEngine(); + + void cpu_to_vdp (UINT8 V); + UINT8 vdp_to_cpu (); + void ReportVdpCommand(UINT8 Op); + UINT8 command_unit_w (UINT8 Op); + void update_command (); + + // general + int m_offset_x, m_offset_y, m_visible_y, m_mode; + // palette + int m_pal_write_first, m_cmd_write_first; + UINT8 m_pal_write, m_cmd_write; + UINT8 m_pal_reg[32], m_stat_reg[10], m_cont_reg[48], m_read_ahead; + // memory + UINT16 m_address_latch; + UINT8 *m_vram_exp; + int m_vram_size; + // interrupt + UINT8 m_int_state; + v99x8_interrupt_delegate m_int_callback; + const char *m_int_callback_device_name; + int m_scanline; + // blinking + int m_blink, m_blink_count; + // sprites + int m_sprite_limit; + // size + int m_size, m_size_old, m_size_auto, m_size_now; + // mouse + UINT8 m_mx_delta, m_my_delta; + // mouse & lightpen + UINT8 m_button_state; + // palette + UINT16 m_pal_ind16[16]; + UINT16 m_pal_ind256[256]; + // render screen + screen_device *m_screen; + const char *m_screen_name; + // render bitmap + bitmap_ind16 m_bitmap; + // Command unit + struct { + int SX,SY; + int DX,DY; + int TX,TY; + int NX,NY; + int MX; + int ASX,ADX,ANX; + UINT8 CL; + UINT8 LO; + UINT8 CM; + UINT8 MXS, MXD; + } m_mmc; + int m_vdp_ops_count; + void (v99x8_device::*m_vdp_engine)(); + + UINT8 m_vram[0x20000]; + + struct v99x8_mode + { + UINT8 m; + void (v99x8_device::*visible_16)(const pen_t *, UINT16*, int); + void (v99x8_device::*visible_16s)(const pen_t *, UINT16*, int); + void (v99x8_device::*border_16)(const pen_t *, UINT16*); + void (v99x8_device::*border_16s)(const pen_t *, UINT16*); + void (v99x8_device::*sprites)(int, UINT8*); + void (v99x8_device::*draw_sprite_16)(const pen_t *, UINT16*, UINT8*); + void (v99x8_device::*draw_sprite_16s)(const pen_t *, UINT16*, UINT8*); + } ; + static const v99x8_mode s_modes[]; + + static UINT16 *s_pal_indYJK; +}; + + +class v9938_device : public v99x8_device +{ +public: + v9938_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class v9958_device : public v99x8_device +{ +public: + v9958_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +PALETTE_INIT( v9938 ); +PALETTE_INIT( v9958 ); + + +#endif diff -Nru mame-0.144/src/emu/video/v9938mod.c mame-0.145/src/emu/video/v9938mod.c --- mame-0.144/src/emu/video/v9938mod.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/v9938mod.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,736 +0,0 @@ -/* - * This file is included for a number of different situations: - * V9938_WIDTH : can be 512 + 32 or 256 + 16 - * V9938_BPP : can be 8 or 16 - */ - -#if (V9938_WIDTH < 512) - #if (V9938_BPP == 8) - #define PEN_TYPE UINT8 - #define FNAME(name) v9938_##name##_8s - #else - #define PEN_TYPE UINT16 - #define FNAME(name) v9938_##name##_16s - #endif -#else - #if (V9938_BPP == 8) - #define PEN_TYPE UINT8 - #define FNAME(name) v9938_##name##_8 - #else - #define PEN_TYPE UINT16 - #define FNAME(name) v9938_##name##_16 - #endif -#endif - - -#define V9938_BORDER_FUNC(name) \ - static void FNAME (name) (const pen_t *pens, PEN_TYPE *ln) - -#define V9938_MODE_FUNC(name) \ - static void FNAME (name) (const pen_t *pens, PEN_TYPE *ln, int line) - -#define V9938_SPRITE_FUNC(name) \ - static void FNAME (name) (const pen_t *pens, PEN_TYPE *ln, UINT8 *col) - -V9938_BORDER_FUNC (default_border) - { - PEN_TYPE pen; - int i; - - pen = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; - i = V9938_WIDTH; - while (i--) *ln++ = pen; - - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_BORDER_FUNC (graphic7_border) - { - PEN_TYPE pen; - int i; - - pen = pens[vdp->pal_ind256[vdp->contReg[7]]]; - i = V9938_WIDTH; - while (i--) *ln++ = pen; - - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_BORDER_FUNC (graphic5_border) - { - int i; - PEN_TYPE pen0; -#if (V9938_WIDTH > 512) - PEN_TYPE pen1; - - pen1 = pens[vdp->pal_ind16[(vdp->contReg[7]&0x03)]]; - pen0 = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - i = (V9938_WIDTH) / 2; - while (i--) { *ln++ = pen0; *ln++ = pen1; } -#else - pen0 = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - i = V9938_WIDTH; - while (i--) *ln++ = pen0; -#endif - vdp->size_now = RENDER_HIGH; - } - -V9938_MODE_FUNC (mode_text1) - { - int pattern, x, xx, name, xxx; - PEN_TYPE fg, bg, pen; - UINT8 *nametbl, *patterntbl; - - patterntbl = vdp->vram + (vdp->contReg[4] << 11); - nametbl = vdp->vram + (vdp->contReg[2] << 10); - - fg = pens[vdp->pal_ind16[vdp->contReg[7] >> 4]]; - bg = pens[vdp->pal_ind16[vdp->contReg[7] & 15]]; - - name = (line/8)*40; - - pen = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; - - xxx = vdp->offset_x + 8; -#if (V9938_WIDTH > 512) - xxx *= 2; -#endif - while (xxx--) *ln++ = pen; - - for (x=0;x<40;x++) - { - pattern = patterntbl[(nametbl[name] * 8) + - ((line + vdp->contReg[23]) & 7)]; - for (xx=0;xx<6;xx++) - { - *ln++ = (pattern & 0x80) ? fg : bg; -#if (V9938_WIDTH > 512) - *ln++ = (pattern & 0x80) ? fg : bg; -#endif - pattern <<= 1; - } - /* width height 212, characters start repeating at the bottom */ - name = (name + 1) & 0x3ff; - } - - xxx = (16 - vdp->offset_x) + 8; -#if (V9938_WIDTH > 512) - xxx *= 2; -#endif - while (xxx--) *ln++ = pen; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_text2) - { - int pattern, x, charcode, name, xxx, patternmask, colourmask; - PEN_TYPE fg, bg, fg0, bg0, pen; - UINT8 *nametbl, *patterntbl, *colourtbl; - - patterntbl = vdp->vram + (vdp->contReg[4] << 11); - colourtbl = vdp->vram + ((vdp->contReg[3] & 0xf8) << 6) + (vdp->contReg[10] << 14); -#if 0 - colourmask = ((vdp->contReg[3] & 7) << 5) | 0x1f; /* cause a bug in Forth+ v1.0 on Geneve */ -#else - colourmask = ((vdp->contReg[3] & 7) << 6) | 0x3f; /* verify! */ -#endif - nametbl = vdp->vram + ((vdp->contReg[2] & 0xfc) << 10); - patternmask = ((vdp->contReg[2] & 3) << 10) | 0x3ff; /* seems correct */ - - fg = pens[vdp->pal_ind16[vdp->contReg[7] >> 4]]; - bg = pens[vdp->pal_ind16[vdp->contReg[7] & 15]]; - fg0 = pens[vdp->pal_ind16[vdp->contReg[12] >> 4]]; - bg0 = pens[vdp->pal_ind16[vdp->contReg[12] & 15]]; - - name = (line/8)*80; - - xxx = vdp->offset_x + 8; - pen = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH > 512) - xxx *= 2; -#endif - while (xxx--) *ln++ = pen; - - for (x=0;x<80;x++) - { - charcode = nametbl[name&patternmask]; - if (vdp->blink) - { - pattern = colourtbl[(name/8)&colourmask]; - if (pattern & (0x80 >> (name & 7) ) ) - { - pattern = patterntbl[(charcode * 8) + - ((line + vdp->contReg[23]) & 7)]; - -#if (V9938_WIDTH > 512) - *ln++ = (pattern & 0x80) ? fg0 : bg0; - *ln++ = (pattern & 0x40) ? fg0 : bg0; - *ln++ = (pattern & 0x20) ? fg0 : bg0; - *ln++ = (pattern & 0x10) ? fg0 : bg0; - *ln++ = (pattern & 0x08) ? fg0 : bg0; - *ln++ = (pattern & 0x04) ? fg0 : bg0; -#else - *ln++ = (pattern & 0x80) ? fg0 : bg0; - *ln++ = (pattern & 0x20) ? fg0 : bg0; - *ln++ = (pattern & 0x08) ? fg0 : bg0; -#endif - - name++; - continue; - } - } - - pattern = patterntbl[(charcode * 8) + - ((line + vdp->contReg[23]) & 7)]; - -#if (V9938_WIDTH > 512) - *ln++ = (pattern & 0x80) ? fg : bg; - *ln++ = (pattern & 0x40) ? fg : bg; - *ln++ = (pattern & 0x20) ? fg : bg; - *ln++ = (pattern & 0x10) ? fg : bg; - *ln++ = (pattern & 0x08) ? fg : bg; - *ln++ = (pattern & 0x04) ? fg : bg; -#else - *ln++ = (pattern & 0x80) ? fg : bg; - *ln++ = (pattern & 0x20) ? fg : bg; - *ln++ = (pattern & 0x08) ? fg : bg; -#endif - - name++; - } - - xxx = 16 - vdp->offset_x + 8; -#if (V9938_WIDTH > 512) - xxx *= 2; -#endif - while (xxx--) *ln++ = pen; - vdp->size_now = RENDER_HIGH; - } - -V9938_MODE_FUNC (mode_multi) - { - UINT8 *nametbl, *patterntbl, colour; - int name, line2, x, xx; - PEN_TYPE pen, pen_bg; - - nametbl = vdp->vram + (vdp->contReg[2] << 10); - patterntbl = vdp->vram + (vdp->contReg[4] << 11); - - line2 = (line - vdp->contReg[23]) & 255; - name = (line2/8)*32; - - pen_bg = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH < 512) - xx = vdp->offset_x; -#else - xx = vdp->offset_x * 2; -#endif - while (xx--) *ln++ = pen_bg; - - for (x=0;x<32;x++) - { - colour = patterntbl[(nametbl[name] * 8) + ((line2/4)&7)]; - pen = pens[vdp->pal_ind16[colour>>4]]; - /* eight pixels */ - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; -#endif - pen = pens[vdp->pal_ind16[colour&15]]; - /* eight pixels */ - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; - *ln++ = pen; -#endif - name++; - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen_bg; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_graphic1) - { - PEN_TYPE fg, bg, pen; - UINT8 *nametbl, *patterntbl, *colourtbl; - int pattern, x, xx, line2, name, charcode, colour, xxx; - - nametbl = vdp->vram + (vdp->contReg[2] << 10); - colourtbl = vdp->vram + (vdp->contReg[3] << 6) + (vdp->contReg[10] << 14); - patterntbl = vdp->vram + (vdp->contReg[4] << 11); - - line2 = (line - vdp->contReg[23]) & 255; - - name = (line2/8)*32; - - pen = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH < 512) - xxx = vdp->offset_x; -#else - xxx = vdp->offset_x * 2; -#endif - while (xxx--) *ln++ = pen; - - for (x=0;x<32;x++) - { - charcode = nametbl[name]; - colour = colourtbl[charcode/8]; - fg = pens[vdp->pal_ind16[colour>>4]]; - bg = pens[vdp->pal_ind16[colour&15]]; - pattern = patterntbl[charcode * 8 + (line2 & 7)]; - - for (xx=0;xx<8;xx++) - { - *ln++ = (pattern & 0x80) ? fg : bg; -#if (V9938_WIDTH > 512) - *ln++ = (pattern & 0x80) ? fg : bg; -#endif - pattern <<= 1; - } - name++; - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_graphic23) - { - PEN_TYPE fg, bg, pen; - UINT8 *nametbl, *patterntbl, *colourtbl; - int pattern, x, xx, line2, name, charcode, - colour, colourmask, patternmask, xxx; - - colourmask = (vdp->contReg[3] & 0x7f) * 8 | 7; - patternmask = (vdp->contReg[4] & 0x03) * 256 | (colourmask & 255); - - nametbl = vdp->vram + (vdp->contReg[2] << 10); - colourtbl = vdp->vram + ((vdp->contReg[3] & 0x80) << 6) + (vdp->contReg[10] << 14); - patterntbl = vdp->vram + ((vdp->contReg[4] & 0x3c) << 11); - - line2 = (line + vdp->contReg[23]) & 255; - name = (line2/8)*32; - - pen = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH < 512) - xxx = vdp->offset_x; -#else - xxx = vdp->offset_x * 2; -#endif - while (xxx--) *ln++ = pen; - - for (x=0;x<32;x++) - { - charcode = nametbl[name] + (line2&0xc0)*4; - colour = colourtbl[(charcode&colourmask)*8+(line2&7)]; - pattern = patterntbl[(charcode&patternmask)*8+(line2&7)]; - fg = pens[vdp->pal_ind16[colour>>4]]; - bg = pens[vdp->pal_ind16[colour&15]]; - for (xx=0;xx<8;xx++) - { - *ln++ = (pattern & 0x80) ? fg : bg; -#if (V9938_WIDTH > 512) - *ln++ = (pattern & 0x80) ? fg : bg; -#endif - pattern <<= 1; - } - name++; - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_graphic4) - { - UINT8 *nametbl, colour; - int line2, linemask, x, xx; - PEN_TYPE pen, pen_bg; - - linemask = ((vdp->contReg[2] & 0x1f) << 3) | 7; - - line2 = ((line + vdp->contReg[23]) & linemask) & 255; - - nametbl = vdp->vram + ((vdp->contReg[2] & 0x40) << 10) + line2 * 128; - if ( (vdp->contReg[2] & 0x20) && (V9938_SECOND_FIELD) ) - nametbl += 0x8000; - - pen_bg = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH < 512) - xx = vdp->offset_x; -#else - xx = vdp->offset_x * 2; -#endif - while (xx--) *ln++ = pen_bg; - - for (x=0;x<128;x++) - { - colour = *nametbl++; - pen = pens[vdp->pal_ind16[colour>>4]]; - *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; -#endif - pen = pens[vdp->pal_ind16[colour&15]]; - *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; -#endif - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen_bg; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_graphic5) - { - UINT8 *nametbl, colour; - int line2, linemask, x, xx; - PEN_TYPE pen_bg0[4]; -#if (V9938_WIDTH > 512) - PEN_TYPE pen_bg1[4]; -#endif - - linemask = ((vdp->contReg[2] & 0x1f) << 3) | 7; - - line2 = ((line + vdp->contReg[23]) & linemask) & 255; - - nametbl = vdp->vram + ((vdp->contReg[2] & 0x40) << 10) + line2 * 128; - if ( (vdp->contReg[2] & 0x20) && (V9938_SECOND_FIELD) ) - nametbl += 0x8000; - -#if (V9938_WIDTH > 512) - pen_bg1[0] = pens[vdp->pal_ind16[(vdp->contReg[7]&0x03)]]; - pen_bg0[0] = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - - xx = vdp->offset_x; - while (xx--) { *ln++ = pen_bg0[0]; *ln++ = pen_bg1[0]; } - - x = (vdp->contReg[8] & 0x20) ? 0 : 1; - - for (;x<4;x++) - { - pen_bg0[x] = pens[vdp->pal_ind16[x]]; - pen_bg1[x] = pens[vdp->pal_ind16[x]]; - } - - for (x=0;x<128;x++) - { - colour = *nametbl++; - - *ln++ = pen_bg0[colour>>6]; - *ln++ = pen_bg1[(colour>>4)&3]; - *ln++ = pen_bg0[(colour>>2)&3]; - *ln++ = pen_bg1[(colour&3)]; - } - - pen_bg1[0] = pens[vdp->pal_ind16[(vdp->contReg[7]&0x03)]]; - pen_bg0[0] = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - xx = 16 - vdp->offset_x; - while (xx--) { *ln++ = pen_bg0[0]; *ln++ = pen_bg1[0]; } -#else - pen_bg0[0] = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - - x = (vdp->contReg[8] & 0x20) ? 0 : 1; - - for (;x<4;x++) - pen_bg0[x] = pens[vdp->pal_ind16[x]]; - - xx = vdp->offset_x; - while (xx--) *ln++ = pen_bg0[0]; - - for (x=0;x<128;x++) - { - colour = *nametbl++; - *ln++ = pen_bg0[colour>>6]; - *ln++ = pen_bg0[(colour>>2)&3]; - } - - pen_bg0[0] = pens[vdp->pal_ind16[((vdp->contReg[7]>>2)&0x03)]]; - xx = 16 - vdp->offset_x; - while (xx--) *ln++ = pen_bg0[0]; -#endif - vdp->size_now = RENDER_HIGH; - } - -V9938_MODE_FUNC (mode_graphic6) - { - UINT8 colour; - int line2, linemask, x, xx, nametbl; - PEN_TYPE pen_bg, fg0; -#if (V9938_WIDTH > 512) - PEN_TYPE fg1; -#endif - - linemask = ((vdp->contReg[2] & 0x1f) << 3) | 7; - - line2 = ((line + vdp->contReg[23]) & linemask) & 255; - - nametbl = line2 << 8 ; - if ( (vdp->contReg[2] & 0x20) && (V9938_SECOND_FIELD) ) - nametbl += 0x10000; - - pen_bg = pens[vdp->pal_ind16[(vdp->contReg[7]&0x0f)]]; -#if (V9938_WIDTH < 512) - xx = vdp->offset_x; -#else - xx = vdp->offset_x * 2; -#endif - while (xx--) *ln++ = pen_bg; - - if (vdp->contReg[2] & 0x40) - { - for (x=0;x<32;x++) - { - nametbl++; - colour = vdp->vram[((nametbl&1) << 16) | (nametbl>>1)]; - fg0 = pens[vdp->pal_ind16[colour>>4]]; -#if (V9938_WIDTH < 512) - *ln++ = fg0; *ln++ = fg0; - *ln++ = fg0; *ln++ = fg0; - *ln++ = fg0; *ln++ = fg0; - *ln++ = fg0; *ln++ = fg0; -#else - fg1 = pens[vdp->pal_ind16[colour&15]]; - *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; - *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; - *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; - *ln++ = fg0; *ln++ = fg1; *ln++ = fg0; *ln++ = fg1; -#endif - nametbl += 7; - } - } - else - { - for (x=0;x<256;x++) - { - colour = vdp->vram[((nametbl&1) << 16) | (nametbl>>1)]; - *ln++ = pens[vdp->pal_ind16[colour>>4]]; -#if (V9938_WIDTH > 512) - *ln++ = pens[vdp->pal_ind16[colour&15]]; -#endif - nametbl++; - } - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen_bg; - vdp->size_now = RENDER_HIGH; - } - -V9938_MODE_FUNC (mode_graphic7) - { - UINT8 colour; - int line2, linemask, x, xx, nametbl; - PEN_TYPE pen, pen_bg; - - linemask = ((vdp->contReg[2] & 0x1f) << 3) | 7; - - line2 = ((line + vdp->contReg[23]) & linemask) & 255; - - nametbl = line2 << 8; - if ( (vdp->contReg[2] & 0x20) && (V9938_SECOND_FIELD) ) - nametbl += 0x10000; - - pen_bg = pens[vdp->pal_ind256[vdp->contReg[7]]]; -#if (V9938_WIDTH < 512) - xx = vdp->offset_x; -#else - xx = vdp->offset_x * 2; -#endif - while (xx--) *ln++ = pen_bg; - - if (vdp->contReg[2] & 0x40) - { - for (x=0;x<32;x++) - { - nametbl++; - colour = vdp->vram[((nametbl&1) << 16) | (nametbl>>1)]; - pen = pens[vdp->pal_ind256[colour]]; - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; - *ln++ = pen; *ln++ = pen; -#endif - nametbl++; - } - } - else - { - for (x=0;x<256;x++) - { - colour = vdp->vram[((nametbl&1) << 16) | (nametbl>>1)]; - pen = pens[vdp->pal_ind256[colour]]; - *ln++ = pen; -#if (V9938_WIDTH > 512) - *ln++ = pen; -#endif - nametbl++; - } - } - - xx = 16 - vdp->offset_x; -#if (V9938_WIDTH > 512) - xx *= 2; -#endif - while (xx--) *ln++ = pen_bg; - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_MODE_FUNC (mode_unknown) - { - PEN_TYPE fg, bg; - int x; - - fg = pens[vdp->pal_ind16[vdp->contReg[7] >> 4]]; - bg = pens[vdp->pal_ind16[vdp->contReg[7] & 15]]; - -#if (V9938_WIDTH < 512) - x = vdp->offset_x; - while (x--) *ln++ = bg; - - x = 256; - while (x--) *ln++ = fg; - - x = 16 - vdp->offset_x; - while (x--) *ln++ = bg; -#else - x = vdp->offset_x * 2; - while (x--) *ln++ = bg; - - x = 512; - while (x--) *ln++ = fg; - - x = (16 - vdp->offset_x) * 2; - while (x--) *ln++ = bg; -#endif - if (vdp->size_now != RENDER_HIGH) vdp->size_now = RENDER_LOW; - } - -V9938_SPRITE_FUNC (default_draw_sprite) - { - int i; -#if (V9938_WIDTH > 512) - ln += vdp->offset_x * 2; -#else - ln += vdp->offset_x; -#endif - - for (i=0;i<256;i++) - { - if (col[i] & 0x80) - { - *ln++ = pens[vdp->pal_ind16[col[i]&0x0f]]; -#if (V9938_WIDTH > 512) - *ln++ = pens[vdp->pal_ind16[col[i]&0x0f]]; -#endif - } - else -#if (V9938_WIDTH > 512) - ln += 2; -#else - ln++; -#endif - } - } -V9938_SPRITE_FUNC (graphic5_draw_sprite) - { - int i; -#if (V9938_WIDTH > 512) - ln += vdp->offset_x * 2; -#else - ln += vdp->offset_x; -#endif - - for (i=0;i<256;i++) - { - if (col[i] & 0x80) - { - *ln++ = pens[vdp->pal_ind16[(col[i]>>2)&0x03]]; -#if (V9938_WIDTH > 512) - *ln++ = pens[vdp->pal_ind16[col[i]&0x03]]; -#endif - } - else -#if (V9938_WIDTH > 512) - ln += 2; -#else - ln++; -#endif - } - } - - -V9938_SPRITE_FUNC (graphic7_draw_sprite) - { - static const UINT16 g7_ind16[16] = { - 0, 2, 192, 194, 48, 50, 240, 242, - 482, 7, 448, 455, 56, 63, 504, 511 }; - int i; - -#if (V9938_WIDTH > 512) - ln += vdp->offset_x * 2; -#else - ln += vdp->offset_x; -#endif - - for (i=0;i<256;i++) - { - if (col[i] & 0x80) - { - *ln++ = pens[g7_ind16[col[i]&0x0f]]; -#if (V9938_WIDTH > 512) - *ln++ = pens[g7_ind16[col[i]&0x0f]]; -#endif - } - else -#if (V9938_WIDTH > 512) - ln += 2; -#else - ln++; -#endif - } - } - - -#undef PEN_TYPE -#undef FNAME -#undef V9938_BORDER_FUNC -#undef V9938_MODE_FUNC -#undef V9938_SPRITE_FUNC diff -Nru mame-0.144/src/emu/video/vector.c mame-0.145/src/emu/video/vector.c --- mame-0.144/src/emu/video/vector.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/vector.c 2012-02-06 21:30:27.000000000 +0000 @@ -70,7 +70,7 @@ struct _vector_texture { render_texture * texture; - bitmap_t * bitmap; + bitmap_argb32 * bitmap; }; static vector_texture *vectortex[TEXTURE_INTENSITY_BUCKETS][TEXTURE_LENGTH_BUCKETS]; @@ -95,8 +95,8 @@ return tex->texture; height = lbucket * VECTOR_WIDTH_DENOM / TEXTURE_LENGTH_BUCKETS; - tex->bitmap = global_alloc(bitmap_t(TEXTURE_WIDTH, height, BITMAP_FORMAT_ARGB32)); - bitmap_fill(tex->bitmap, NULL, MAKE_ARGB(0xff,0xff,0xff,0xff)); + tex->bitmap = global_alloc(bitmap_argb32(TEXTURE_WIDTH, height)); + tex->bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff)); totalint = 1.0f; for (x = TEXTURE_WIDTH / 2 - 1; x >= 0; x--) @@ -109,10 +109,10 @@ { UINT32 *pix; - pix = (UINT32 *)bitmap->base + y * bitmap->rowpixels + x; + pix = (UINT32 *)bitmap.base + y * bitmap.rowpixels + x; *pix = MAKE_ARGB((RGB_ALPHA(*pix) * intensity) >> 8,0xff,0xff,0xff); - pix = (UINT32 *)bitmap->base + y * bitmap->rowpixels + (TEXTURE_WIDTH - 1 - x); + pix = (UINT32 *)bitmap.base + y * bitmap.rowpixels + (TEXTURE_WIDTH - 1 - x); *pix = MAKE_ARGB((RGB_ALPHA(*pix) * intensity) >> 8,0xff,0xff,0xff); } } @@ -254,12 +254,12 @@ } -SCREEN_UPDATE( vector ) +SCREEN_UPDATE_RGB32( vector ) { - UINT32 flags = PRIMFLAG_ANTIALIAS(screen->machine().options().antialias() ? 1 : 0) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD); - const rectangle &visarea = screen->visible_area(); - float xscale = 1.0f / (65536 * (visarea.max_x - visarea.min_x)); - float yscale = 1.0f / (65536 * (visarea.max_y - visarea.min_y)); + UINT32 flags = PRIMFLAG_ANTIALIAS(screen.machine().options().antialias() ? 1 : 0) | PRIMFLAG_BLENDMODE(BLENDMODE_ADD); + const rectangle &visarea = screen.visible_area(); + float xscale = 1.0f / (65536 * visarea.width()); + float yscale = 1.0f / (65536 * visarea.height()); float xoffs = (float)visarea.min_x; float yoffs = (float)visarea.min_y; point *curpoint; @@ -269,8 +269,8 @@ curpoint = vector_list; - screen->container().empty(); - screen->container().add_rect(0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + screen.container().empty(); + screen.container().add_rect(0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); clip.x0 = clip.y0 = 0.0f; clip.x1 = clip.y1 = 1.0f; @@ -300,7 +300,7 @@ if (curpoint->intensity != 0) if (!render_clip_line(&coords, &clip)) - screen->container().add_line(coords.x0, coords.y0, coords.x1, coords.y1, + screen.container().add_line(coords.x0, coords.y0, coords.x1, coords.y1, beam_width * (1.0f / (float)VECTOR_WIDTH_DENOM), (curpoint->intensity << 24) | (curpoint->col & 0xffffff), flags); diff -Nru mame-0.144/src/emu/video/vector.h mame-0.145/src/emu/video/vector.h --- mame-0.144/src/emu/video/vector.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/vector.h 2012-02-06 21:30:27.000000000 +0000 @@ -11,7 +11,7 @@ MAKE_RGB(pal4bit((c) >> 8), pal4bit((c) >> 4), pal4bit((c) >> 0)) VIDEO_START( vector ); -SCREEN_UPDATE( vector ); +SCREEN_UPDATE_RGB32( vector ); void vector_clear_list(void); void vector_add_point(running_machine &machine, int x, int y, rgb_t color, int intensity); diff -Nru mame-0.144/src/emu/video/voodoo.c mame-0.145/src/emu/video/voodoo.c --- mame-0.144/src/emu/video/voodoo.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video/voodoo.c 2012-02-06 21:30:27.000000000 +0000 @@ -214,6 +214,8 @@ * *************************************/ +static const rectangle global_cliprect(-4096, 4095, -4096, 4095); + /* fast dither lookup */ static UINT8 dither4_lookup[256*16*2]; static UINT8 dither2_lookup[256*16*2]; @@ -327,7 +329,7 @@ * *************************************/ -int voodoo_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect) { voodoo_state *v = get_safe_token(device); int changed = v->fbi.video_changed; @@ -341,7 +343,7 @@ /* if we are blank, just fill with black */ if (v->type <= VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(v->reg[fbiInit1].u)) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return changed; } @@ -422,12 +424,12 @@ drawbuf = v->fbi.backbuf; /* copy from the current front buffer */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) if (y >= v->fbi.yoffs) { UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[drawbuf]) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; - UINT32 *dst = BITMAP_ADDR32(bitmap, y, 0); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT32 *dst = &bitmap.pix32(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = v->fbi.pen[src[x]]; } @@ -445,11 +447,11 @@ v->stats.render_override = device->machine().input().code_pressed(KEYCODE_ENTER); if (DEBUG_DEPTH && v->stats.render_override) { - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; - UINT32 *dst = BITMAP_ADDR32(bitmap, y, 0); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT32 *dst = &bitmap.pix32(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = ((src[x] << 8) & 0xff0000) | ((src[x] >> 0) & 0xff00) | ((src[x] >> 8) & 0xff); } } @@ -928,7 +930,7 @@ if (v->stats.display) { const rectangle &visible_area = v->screen->visible_area(); - int screen_area = (visible_area.max_x - visible_area.min_x + 1) * (visible_area.max_y - visible_area.min_y + 1); + int screen_area = visible_area.width() * visible_area.height(); char *statsptr = v->stats.buffer; int pixelcount; int i; @@ -2571,10 +2573,7 @@ rectangle visarea; /* create a new visarea */ - visarea.min_x = hbp; - visarea.max_x = hbp + hvis - 1; - visarea.min_y = vbp; - visarea.max_y = vbp + vvis - 1; + visarea.set(hbp, hbp + hvis - 1, vbp, vbp + vvis - 1); /* keep within bounds */ visarea.max_x = MIN(visarea.max_x, htotal - 1); @@ -4911,7 +4910,15 @@ } /* set the type, and initialize the chip mask */ - v->index = device->machine().devicelist().indexof(device->type(), device->tag()); + device_iterator iter(device->machine().root_device()); + v->index = 0; + for (device_t *scan = iter.first(); scan != NULL; scan = iter.next()) + if (scan->type() == device->type()) + { + if (scan == device) + break; + v->index++; + } v->screen = downcast(device->machine().device(config->screen)); assert_always(v->screen != NULL, "Unable to find screen attached to voodoo"); v->cpu = device->machine().device(config->cputag); @@ -5118,7 +5125,7 @@ extra->state = v; memcpy(extra->dither, dithermatrix, sizeof(extra->dither)); - pixels += poly_render_triangle_custom(v->poly, drawbuf, NULL, raster_fastfill, y, count, extents); + pixels += poly_render_triangle_custom(v->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents); } /* 2 pixels per clock */ @@ -5525,7 +5532,7 @@ /* farm the rasterization out to other threads */ info->polys++; - return poly_render_triangle(v->poly, drawbuf, NULL, info->callback, 0, &vert[0], &vert[1], &vert[2]); + return poly_render_triangle(v->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]); } diff -Nru mame-0.144/src/emu/video/voodoo.h mame-0.145/src/emu/video/voodoo.h --- mame-0.144/src/emu/video/voodoo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/emu/video/voodoo.h 2012-02-06 21:30:27.000000000 +0000 @@ -132,7 +132,7 @@ FUNCTION PROTOTYPES ***************************************************************************/ -int voodoo_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect); int voodoo_get_type(device_t *device); int voodoo_is_stalled(device_t *device); void voodoo_set_init_enable(device_t *device, UINT32 newval); diff -Nru mame-0.144/src/emu/video.c mame-0.145/src/emu/video.c --- mame-0.144/src/emu/video.c 2012-01-13 15:34:28.000000000 +0000 +++ mame-0.145/src/emu/video.c 2012-02-06 21:30:28.000000000 +0000 @@ -124,7 +124,6 @@ m_skipping_this_frame(false), m_average_oversleep(0), m_snap_target(NULL), - m_snap_bitmap(NULL), m_snap_native(true), m_snap_width(0), m_snap_height(0), @@ -268,16 +267,7 @@ { // reset partial updates if we're paused or if the debugger is active if (machine().primary_screen != NULL && (machine().paused() || debug || debugger_within_instruction_hook(machine()))) - machine().primary_screen->scanline0_callback(); - - // otherwise, call the video EOF callback - else - { - g_profiler.start(PROFILER_VIDEO); - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) - screen->screen_eof(); - g_profiler.stop(); - } + machine().primary_screen->reset_partial_updates(); } } @@ -314,7 +304,8 @@ // display the number of partial updates as well int partials = 0; - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine().root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) partials += screen->partial_updates(); if (partials > 1) string.catprintf("\n%d partial updates", partials); @@ -337,7 +328,7 @@ create_snapshot_bitmap(screen); // add two text entries describing the image - astring text1(APPNAME, " ", build_version); + astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_info pnginfo = { 0 }; png_add_text(&pnginfo, "Software", text1); @@ -365,7 +356,8 @@ if (m_snap_native) { // write one snapshot per visible screen - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine().root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) if (machine().render().is_live(*screen)) { emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); @@ -411,8 +403,8 @@ info.video_timescale = 1000 * ((machine().primary_screen != NULL) ? ATTOSECONDS_TO_HZ(machine().primary_screen->frame_period().attoseconds) : screen_device::DEFAULT_FRAME_RATE); info.video_sampletime = 1000; info.video_numsamples = 0; - info.video_width = m_snap_bitmap->width; - info.video_height = m_snap_bitmap->height; + info.video_width = m_snap_bitmap.width(); + info.video_height = m_snap_bitmap.height(); info.video_depth = 24; info.audio_format = 0; @@ -548,11 +540,10 @@ // free the snapshot target machine().render().target_free(m_snap_target); - if (m_snap_bitmap != NULL) - global_free(m_snap_bitmap); + m_snap_bitmap.reset(); - // print a final result if we have at least 5 seconds' worth of data - if (m_overall_emutime.seconds >= 5) + // print a final result if we have at least 2 seconds' worth of data + if (m_overall_emutime.seconds >= 1) { osd_ticks_t tps = osd_ticks_per_second(); double final_real_time = (double)m_overall_real_seconds + (double)m_overall_real_ticks / (double)tps; @@ -659,12 +650,13 @@ bool video_manager::finish_screen_updates() { // finish updating the screens - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine().root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) screen->update_partial(screen->visible_area().max_y); // now add the quads for all the screens bool anything_changed = false; - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) if (screen->update_quads()) anything_changed = true; @@ -674,12 +666,12 @@ record_frame(); // iterate over screens and update the burnin for the ones that care - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) screen->update_burnin(); } // draw any crosshairs - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) crosshair_render(*screen); return anything_changed; @@ -961,7 +953,8 @@ // find the screen with the shortest frame period (max refresh rate) // note that we first check the token since this can get called before all screens are created attoseconds_t min_frame_period = ATTOSECONDS_PER_SECOND; - for (screen_device *screen = machine().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(machine().root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) { attoseconds_t period = screen->frame_period().attoseconds; if (period != 0) @@ -1058,12 +1051,13 @@ // given screen //------------------------------------------------- -void video_manager::create_snapshot_bitmap(device_t *screen) +void video_manager::create_snapshot_bitmap(screen_device *screen) { // select the appropriate view in our dummy target if (m_snap_native && screen != NULL) { - int view_index = machine().devicelist().indexof(SCREEN, screen->tag()); + screen_device_iterator iter(machine().root_device()); + int view_index = iter.indexof(*screen); assert(view_index != -1); m_snap_target->set_view(view_index); } @@ -1076,17 +1070,13 @@ m_snap_target->set_bounds(width, height); // if we don't have a bitmap, or if it's not the right size, allocate a new one - if (m_snap_bitmap == NULL || width != m_snap_bitmap->width || height != m_snap_bitmap->height) - { - if (m_snap_bitmap != NULL) - auto_free(machine(), m_snap_bitmap); - m_snap_bitmap = auto_alloc(machine(), bitmap_t(width, height, BITMAP_FORMAT_RGB32)); - } + if (!m_snap_bitmap.valid() || width != m_snap_bitmap.width() || height != m_snap_bitmap.height()) + m_snap_bitmap.allocate(width, height); // render the screen there render_primitive_list &primlist = m_snap_target->get_primitives(); primlist.acquire_lock(); - rgb888_draw_primitives(primlist, m_snap_bitmap->base, width, height, m_snap_bitmap->rowpixels); + rgb888_draw_primitives(primlist, &m_snap_bitmap.pix32(0), width, height, m_snap_bitmap.rowpixels()); primlist.release_lock(); } @@ -1150,8 +1140,8 @@ //printf("check template: %s\n", snapdevname.cstr()); // verify that there is such a device for this system - device_image_interface *image = NULL; - for (bool gotone = machine().devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(machine().root_device()); + for (device_image_interface *image = iter.first(); image != NULL; image = iter.next()) { // get the device name astring tempdevname(image->brief_instance_name()); @@ -1244,7 +1234,7 @@ if (m_avifile != NULL) { // write the next frame - avi_error avierr = avi_append_video_frame_rgb32(m_avifile, m_snap_bitmap); + avi_error avierr = avi_append_video_frame(m_avifile, m_snap_bitmap); if (avierr != AVIERR_NONE) { g_profiler.stop(); @@ -1259,7 +1249,7 @@ png_info pnginfo = { 0 }; if (m_movie_frame == 0) { - astring text1(APPNAME, " ", build_version); + astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_add_text(&pnginfo, "Software", text1); png_add_text(&pnginfo, "System", text2); @@ -1291,24 +1281,23 @@ invalid palette index -------------------------------------------------*/ -void video_assert_out_of_range_pixels(running_machine &machine, bitmap_t *bitmap) +bool video_assert_out_of_range_pixels(running_machine &machine, bitmap_ind16 &bitmap) { #ifdef MAME_DEBUG - int maxindex = palette_get_max_index(machine.palette); - int x, y; - - // this only applies to indexed16 bitmaps - if (bitmap->format != BITMAP_FORMAT_INDEXED16) - return; - // iterate over rows - for (y = 0; y < bitmap->height; y++) + int maxindex = palette_get_max_index(machine.palette); + for (int y = 0; y < bitmap.height(); y++) { - UINT16 *rowbase = BITMAP_ADDR16(bitmap, y, 0); - for (x = 0; x < bitmap->width; x++) - assert(rowbase[x] < maxindex); + UINT16 *rowbase = &bitmap.pix16(y); + for (int x = 0; x < bitmap.width(); x++) + if (rowbase[x] > maxindex) + { + osd_break_into_debugger("Out of range pixel"); + return true; + } } #endif + return false; } diff -Nru mame-0.144/src/emu/video.h mame-0.145/src/emu/video.h --- mame-0.144/src/emu/video.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/emu/video.h 2012-02-06 21:30:28.000000000 +0000 @@ -137,7 +137,7 @@ void recompute_speed(attotime emutime); // snapshot/movie helpers - void create_snapshot_bitmap(device_t *screen); + void create_snapshot_bitmap(screen_device *screen); file_error open_next(emu_file &file, const char *extension); void record_frame(); @@ -181,7 +181,7 @@ // snapshot stuff render_target * m_snap_target; // screen shapshot target - bitmap_t * m_snap_bitmap; // screen snapshot bitmap + bitmap_rgb32 m_snap_bitmap; // screen snapshot bitmap bool m_snap_native; // are we using native per-screen layouts? INT32 m_snap_width; // width of snapshots (0 == auto) INT32 m_snap_height; // height of snapshots (0 == auto) @@ -204,7 +204,7 @@ // ----- debugging helpers ----- // assert if any pixels in the given bitmap contain an invalid palette index -void video_assert_out_of_range_pixels(running_machine &machine, bitmap_t *bitmap); +bool video_assert_out_of_range_pixels(running_machine &machine, bitmap_ind16 &bitmap); #endif /* __VIDEO_H__ */ diff -Nru mame-0.144/src/ldplayer/ldplayer.c mame-0.145/src/ldplayer/ldplayer.c --- mame-0.144/src/ldplayer/ldplayer.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/ldplayer/ldplayer.c 2012-02-06 21:30:44.000000000 +0000 @@ -13,7 +13,8 @@ #include "emuopts.h" #include "uimenu.h" #include "cpu/mcs48/mcs48.h" -#include "machine/laserdsc.h" +#include "machine/ldpr8210.h" +#include "machine/ldv1000.h" #include #include "pr8210.lh" @@ -617,30 +618,24 @@ * *************************************/ -static MACHINE_CONFIG_START( ldplayer_core, ldplayer_state ) - - // audio hardware +static MACHINE_CONFIG_START( ldplayer_ntsc, ldplayer_state ) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) -MACHINE_CONFIG_END - - -static MACHINE_CONFIG_DERIVED( ldplayer_ntsc, ldplayer_core ) - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_RGB32) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED_CLASS( ldv1000, ldplayer_ntsc, ldv1000_state ) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_LASERDISC_GET_DISC(ldplayer_state::get_disc_static) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED_CLASS( pr8210, ldplayer_ntsc, pr8210_state ) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_PR8210, "screen", "ldsound") + MCFG_LASERDISC_PR8210_ADD("laserdisc") + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_LASERDISC_GET_DISC(ldplayer_state::get_disc_static) MACHINE_CONFIG_END diff -Nru mame-0.144/src/ldplayer/ldplayer_dev.lst mame-0.145/src/ldplayer/ldplayer_dev.lst --- mame-0.144/src/ldplayer/ldplayer_dev.lst 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/ldplayer/ldplayer_dev.lst 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,42 @@ +/****************************************************************************** + + ldplayer_dev.lst + + List of all enabled devices in the system. This file is parsed by + makedev.exe, sorted, and output as C code describing the devices. + +**************************************************************************** + + 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. + +******************************************************************************/ + +PIONEER_LDV1000 +PIONEER_PR8210 \ No newline at end of file diff -Nru mame-0.144/src/lib/cothread/x86.c mame-0.145/src/lib/cothread/x86.c --- mame-0.144/src/lib/cothread/x86.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/cothread/x86.c 2012-02-06 21:30:30.000000000 +0000 @@ -38,6 +38,13 @@ DWORD old_privileges; VirtualProtect(co_swap_function, sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges); } +#elif defined(__OS2__) + #define INCL_DOS + #include + + void co_init() { + DosSetMem(co_swap_function, sizeof co_swap_function, PAG_READ | PAG_WRITE | PAG_EXECUTE); + } #else #include #include diff -Nru mame-0.144/src/lib/formats/ami_dsk.c mame-0.145/src/lib/formats/ami_dsk.c --- mame-0.144/src/lib/formats/ami_dsk.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/ami_dsk.c 2012-02-06 21:30:29.000000000 +0000 @@ -1,3 +1,36 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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. + +****************************************************************************/ + /********************************************************************* formats/ami_dsk.c @@ -32,7 +65,7 @@ return true; } -int adf_format::identify(io_generic *io) +int adf_format::identify(io_generic *io, UINT32 form_factor) { UINT64 size = io_generic_size(io); if ((size == 901120) || (size == 1802240)) @@ -42,20 +75,32 @@ return 0; } -bool adf_format::load(io_generic *io, floppy_image *image) +bool adf_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { - desc_s sectors[11]; - UINT8 sectdata[512*11]; - for(int i=0; i<11; i++) { + desc_s sectors[22]; + UINT8 sectdata[512*22]; + for(int i=0; i<22; i++) { sectors[i].data = sectdata + 512*i; sectors[i].size = 512; sectors[i].sector_id = i; } - for(int track=0; track < 80; track++) { - for(int side=0; side < 2; side++) { - io_generic_read(io, sectdata, (track*2 + side)*512*11, 512*11); - generate_track(amiga_11, track, side, sectors, 11, 100000, image); + UINT64 size = io_generic_size(io); + if(size == 901120) { + image->set_variant(floppy_image::DSDD); + for(int track=0; track < 80; track++) { + for(int side=0; side < 2; side++) { + io_generic_read(io, sectdata, (track*2 + side)*512*11, 512*11); + generate_track(amiga_11, track, side, sectors, 11, 100000, image); + } + } + } else { + image->set_variant(floppy_image::DSHD); + for(int track=0; track < 80; track++) { + for(int side=0; side < 2; side++) { + io_generic_read(io, sectdata, (track*2 + side)*512*22, 512*22); + generate_track(amiga_22, track, side, sectors, 22, 200000, image); + } } } @@ -94,13 +139,17 @@ bool adf_format::save(io_generic *io, floppy_image *image) { - // TODO: HD support - UINT8 sectdata[512*11]; - UINT8 trackbuf[150000/8]; + UINT8 sectdata[512*22]; + UINT8 trackbuf[300000/8]; + + bool hd = image->get_variant() == floppy_image::DSHD; + + int data_track_size = hd ? 512*22 : 512*11; + for(int track=0; track < 80; track++) { for(int side=0; side < 2; side++) { int track_size; - generate_bitstream_from_track(track, side, 2000, trackbuf, track_size, image); + generate_bitstream_from_track(track, side, hd ? 1000 : 2000, trackbuf, track_size, image); for(int i=0; i> 8) & 0xff; - if(sect > 11) + if(sect > (hd ? 22 : 11)) continue; UINT8 *dest = sectdata + 512*sect; @@ -121,7 +170,7 @@ *dest++ = val; } - io_generic_write(io, sectdata, (track*2 + side)*512*11, 512*11); + io_generic_write(io, sectdata, (track*2 + side)*data_track_size, data_track_size); } } } diff -Nru mame-0.144/src/lib/formats/ami_dsk.h mame-0.145/src/lib/formats/ami_dsk.h --- mame-0.144/src/lib/formats/ami_dsk.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/ami_dsk.h 2012-02-06 21:30:29.000000000 +0000 @@ -16,8 +16,8 @@ public: adf_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; diff -Nru mame-0.144/src/lib/formats/ap2_dsk.c mame-0.145/src/lib/formats/ap2_dsk.c --- mame-0.144/src/lib/formats/ap2_dsk.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/ap2_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -139,7 +139,9 @@ if (size == expected_size) *vote = 100; - else if (size - expected_size < 8 && size - expected_size > -8) + else if ((size > expected_size) && ((size - expected_size) < 8)) + *vote = 90; /* tolerate images with up to eight fewer/extra bytes (bug #638) */ + else if ((size < expected_size) && ((expected_size - size) < 8)) *vote = 90; /* tolerate images with up to eight fewer/extra bytes (bug #638) */ else *vote = 0; diff -Nru mame-0.144/src/lib/formats/ap_dsk35.c mame-0.145/src/lib/formats/ap_dsk35.c --- mame-0.144/src/lib/formats/ap_dsk35.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/ap_dsk35.c 2012-02-06 21:30:30.000000000 +0000 @@ -99,7 +99,8 @@ #include #include -#include "formats/ap_dsk35.h" +#include "emu.h" +#include "ap_dsk35.h" struct apple35_tag { @@ -1185,3 +1186,330 @@ SECTOR_LENGTH([512]) FIRST_SECTOR_ID([0])) LEGACY_FLOPPY_OPTIONS_END + + +/*************************************************************************** + + Copyright Olivier Galibert + 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. + +****************************************************************************/ + +dc42_format::dc42_format() : floppy_image_format_t() +{ +} + +const char *dc42_format::name() const +{ + return "dc42"; +} + +const char *dc42_format::description() const +{ + return "DiskCopy 4.2 image"; +} + +const char *dc42_format::extensions() const +{ + return "dc42"; +} + +bool dc42_format::supports_save() const +{ + return true; +} + +int dc42_format::identify(io_generic *io, UINT32 form_factor) +{ + UINT8 h[0x54]; + int size = io_generic_size(io); + if(size < 0x54) + return 0; + + io_generic_read(io, h, 0, 0x54); + int dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43]; + int tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47]; + + return dsize > 0 && tsize >= 0 && size == 0x54+tsize+dsize && h[0] < 64 && h[0x52] == 1 && h[0x53] == 0 ? 100 : 0; +} + +const floppy_image_format_t::desc_e dc42_format::mac_gcr[] = { + { SECTOR_LOOP_START, 0, -1 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xd5aa96, 24 }, + { CRC_MACHEAD_START, 0 }, + { TRACK_ID_GCR6 }, + { SECTOR_ID_GCR6 }, + { TRACK_HEAD_ID_GCR6 }, + { SECTOR_INFO_GCR6 }, + { CRC_END, 0 }, + { CRC, 0 }, + { RAWBITS, 0xdeaaff, 24 }, + { RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 }, + { RAWBITS, 0xd5aaad, 24 }, + { SECTOR_ID_GCR6 }, + { SECTOR_DATA_MAC, -1 }, + { RAWBITS, 0xdeaaff, 24 }, + { RAWBITS, 0xff, 8 }, + { SECTOR_LOOP_END }, + { END }, +}; + + +bool dc42_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +{ + UINT8 h[0x54]; + io_generic_read(io, h, 0, 0x54); + int dsize = (h[0x40] << 24) | (h[0x41] << 16) | (h[0x42] << 8) | h[0x43]; + int tsize = (h[0x44] << 24) | (h[0x45] << 16) | (h[0x46] << 8) | h[0x47]; + + UINT8 encoding = h[0x50]; + UINT8 format = h[0x51]; + + if((encoding != 0x00 || format != 0x02) && (encoding != 0x01 || format != 0x22)) { + logerror("dc42: Unsupported encoding/format combination %02x\%02x\n", encoding, format); + return false; + } + + UINT8 sector_data[(512+12)*12]; + memset(sector_data, 0, sizeof(sector_data)); + + desc_s sectors[12]; + + int pos_data = 0x54; + int pos_tag = 0x54+dsize; + + int head_count = encoding == 1 ? 2 : 1; + + for(int track=0; track < 80; track++) { + for(int head=0; head < head_count; head++) { + int ns = 12 - (track/16); + int si = 0; + for(int i=0; i> 3] >> (7-(pos & 7))) & 1); + pos++; + if(pos == ts) { + pos = 0; + wrap++; + } + } + return v; +} + +void dc42_format::update_chk(const UINT8 *data, int size, UINT32 &chk) +{ + for(int i=0; i> 1) | (chk << 31); + } +} + +bool dc42_format::save(io_generic *io, floppy_image *image) +{ + int g_tracks, g_heads; + image->get_actual_geometry(g_tracks, g_heads); + + if(g_heads == 0) + g_heads = 1; + + UINT8 h[0x54]; + memset(h, 0, 0x54); + strcpy((char *)h+1, "Unnamed"); + h[0] = 7; + int nsect = 16*(12+11+10+9+8)*g_heads; + UINT32 dsize = nsect*512; + UINT32 tsize = nsect*12; + h[0x40] = dsize >> 24; + h[0x41] = dsize >> 16; + h[0x42] = dsize >> 8; + h[0x43] = dsize; + h[0x44] = tsize >> 24; + h[0x45] = tsize >> 16; + h[0x46] = tsize >> 8; + h[0x47] = tsize; + h[0x50] = g_heads == 2 ? 0x01 : 0x00; + h[0x51] = g_heads == 2 ? 0x22 : 0x02; + h[0x52] = 0x01; + h[0x53] = 0x00; + + UINT32 dchk = 0; + UINT32 tchk = 0; + + int pos_data = 0x54; + int pos_tag = 0x54+dsize; + + for(int track=0; track < 80; track++) { + for(int head=0; head < g_heads; head++) { + UINT8 sectdata[(512+12)*12]; + memset(sectdata, 0, sizeof(sectdata)); + int nsect = 12-(track/16); + UINT8 buf[13000]; + int ts; + generate_bitstream_from_track(track, head, 200000000/(6208*nsect), buf, ts, image); + int pos = 0; + int wrap = 0; + int hb = 0; + for(;;) { + UINT8 v = gb(buf, ts, pos, wrap); + if(v == 0xff) + hb = 1; + else if(hb == 1 && v == 0xd5) + hb = 2; + else if(hb == 2 && v == 0xaa) + hb = 3; + else if(hb == 3 && v == 0x96) + hb = 4; + else + hb = 0; + + if(hb == 4) { + UINT8 h[7]; + for(int i=0; i<7; i++) + h[i] = gb(buf, ts, pos, wrap); + UINT8 v2 = gcr6bw_tb[h[2]]; + UINT8 v3 = gcr6bw_tb[h[3]]; + UINT8 tr = gcr6bw_tb[h[0]] | (v2 & 1 ? 0x40 : 0x00); + UINT8 se = gcr6bw_tb[h[1]]; + UINT8 si = v2 & 0x20 ? 1 : 0; + // UINT8 ds = v3 & 0x20 ? 1 : 0; + // UINT8 fmt = v3 & 0x1f; + UINT8 c1 = (tr^se^v2^v3) & 0x3f; + UINT8 chk = gcr6bw_tb[h[4]]; + if(chk == c1 && tr == track && si == head && se < nsect) { + int opos = pos; + int owrap = wrap; + hb = 0; + for(int i=0; i<20 && hb != 4; i++) { + v = gb(buf, ts, pos, wrap); + if(v == 0xff) + hb = 1; + else if(hb == 1 && v == 0xd5) + hb = 2; + else if(hb == 2 && v == 0xaa) + hb = 3; + else if(hb == 3 && v == 0xad) + hb = 4; + else + hb = 0; + } + if(hb == 4) { + UINT8 *dest = sectdata+(512+12)*se; + gb(buf, ts, pos, wrap); // Ignore the sector byte + UINT8 ca = 0, cb = 0, cc = 0; + for(int i=0; i<522/3+1; i++) { + UINT8 e0 = gb(buf, ts, pos, wrap); + UINT8 e1 = gb(buf, ts, pos, wrap); + UINT8 e2 = gb(buf, ts, pos, wrap); + UINT8 e3 = i == 522/3 ? 0x96 : gb(buf, ts, pos, wrap); + UINT8 va, vb, vc; + gcr6_decode(e0, e1, e2, e3, va, vb, vc); + cc = (cc << 1) | (cc >> 7); + va = va ^ cc; + int suma = ca + va + (cc & 1); + ca = suma; + vb = vb ^ ca; + int sumb = cb + vb + (suma >> 8); + cb = sumb; + vc = vc ^ cb; + cc = cc + vc + (sumb >> 8); + *dest++ = va; + *dest++ = vb; + if(i != 522/3) + *dest++ = vc; + } + } else { + pos = opos; + wrap = owrap; + } + } + hb = 0; + } + if(wrap) + break; + } + for(int i=0; i> 24; + h[0x49] = dchk >> 16; + h[0x4a] = dchk >> 8; + h[0x4b] = dchk; + h[0x4c] = tchk >> 24; + h[0x4d] = tchk >> 16; + h[0x4e] = tchk >> 8; + h[0x4f] = tchk; + + io_generic_write(io, h, 0, 0x54); + return true; +} + +const floppy_format_type FLOPPY_DC42_FORMAT = &floppy_image_format_creator; diff -Nru mame-0.144/src/lib/formats/ap_dsk35.h mame-0.145/src/lib/formats/ap_dsk35.h --- mame-0.144/src/lib/formats/ap_dsk35.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/ap_dsk35.h 2012-02-06 21:30:30.000000000 +0000 @@ -21,5 +21,27 @@ LEGACY_FLOPPY_OPTIONS_EXTERN(apple35_mac); LEGACY_FLOPPY_OPTIONS_EXTERN(apple35_iigs); +class dc42_format : public floppy_image_format_t +{ +public: + dc42_format(); + + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); + virtual bool save(io_generic *io, floppy_image *image); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + virtual bool supports_save() const; + +private: + static const desc_e mac_gcr[]; + + UINT8 gb(const UINT8 *buf, int ts, int &pos, int &wrap); + void update_chk(const UINT8 *data, int size, UINT32 &chk); +}; + +extern const floppy_format_type FLOPPY_DC42_FORMAT; #endif /* AP_DSK35_H */ diff -Nru mame-0.144/src/lib/formats/coupedsk.c mame-0.145/src/lib/formats/coupedsk.c --- mame-0.144/src/lib/formats/coupedsk.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/coupedsk.c 2012-02-06 21:30:29.000000000 +0000 @@ -61,7 +61,7 @@ return true; } -int mgt_format::identify(io_generic *io) +int mgt_format::identify(io_generic *io, UINT32 form_factor) { int size = io_generic_size(io); @@ -71,7 +71,7 @@ return 0; } -bool mgt_format::load(io_generic *io, floppy_image *image) +bool mgt_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { int size = io_generic_size(io); int sector_count = size == 737280 ? 9 : 10; @@ -92,6 +92,7 @@ } } + image->set_variant(floppy_image::DSDD); return true; } diff -Nru mame-0.144/src/lib/formats/coupedsk.h mame-0.145/src/lib/formats/coupedsk.h --- mame-0.144/src/lib/formats/coupedsk.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/coupedsk.h 2012-02-06 21:30:29.000000000 +0000 @@ -16,8 +16,8 @@ public: mgt_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; diff -Nru mame-0.144/src/lib/formats/dfi_dsk.c mame-0.145/src/lib/formats/dfi_dsk.c --- mame-0.144/src/lib/formats/dfi_dsk.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/dfi_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,148 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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 "emu.h" +#include "dfi_dsk.h" +#include + +dfi_format::dfi_format() : floppy_image_format_t() +{ +} + +const char *dfi_format::name() const +{ + return "dfi"; +} + +const char *dfi_format::description() const +{ + return "DiskFerret flux dump format"; +} + +const char *dfi_format::extensions() const +{ + return "dfi"; +} + +bool dfi_format::supports_save() const +{ + return false; +} + +int dfi_format::identify(io_generic *io, UINT32 form_factor) +{ + char sign[4]; + io_generic_read(io, sign, 0, 4); + return memcmp(sign, "DFE2", 4) ? 0 : 100; +} + +bool dfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +{ + int size = io_generic_size(io); + int pos = 4; + UINT8 *data = 0; + int data_size = 0; + + while(pos < size) { + UINT8 h[10]; + io_generic_read(io, h, pos, 10); + UINT16 track = (h[0] << 8) | h[1]; + UINT16 head = (h[2] << 8) | h[3]; + // Ignore sector + UINT32 tsize = (h[6] << 24) | (h[7] << 16) | (h[8] << 8) | h[9]; + + if(pos+tsize+10 > size) { + if(data) + global_free(data); + return false; + } + + if(tsize > data_size) { + if(data) + global_free(data); + data_size = tsize; + data = global_alloc_array(UINT8, data_size); + } + + io_generic_read(io, data, pos+16, tsize); + pos += tsize+10; + tsize--; // Drop the extra 0x00 at the end + + int index_time = 0; + int total_time = 0; + for(int i=0; iset_track_size(track, head, tsize); + + int cur_time = 0; + UINT32 mg = floppy_image::MG_A; + UINT32 *buf = image->get_buffer(track, head); + int tpos = 0; + buf[tpos++] = mg; + for(int i=0; iset_track_size(track, head, tpos); + } + + if(data) + global_free(data); + + return true; +} + +const floppy_format_type FLOPPY_DFI_FORMAT = &floppy_image_format_creator; diff -Nru mame-0.144/src/lib/formats/dfi_dsk.h mame-0.145/src/lib/formats/dfi_dsk.h --- mame-0.144/src/lib/formats/dfi_dsk.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/dfi_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,23 @@ +#ifndef DFI_DSK_H +#define DFI_DSK_H + +#include "flopimg.h" + +class dfi_format : public floppy_image_format_t +{ +public: + dfi_format(); + + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); + // virtual bool save(io_generic *io, floppy_image *image); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + virtual bool supports_save() const; +}; + +extern const floppy_format_type FLOPPY_DFI_FORMAT; + +#endif /* DFI_DSK_H */ diff -Nru mame-0.144/src/lib/formats/dsk_dsk.c mame-0.145/src/lib/formats/dsk_dsk.c --- mame-0.144/src/lib/formats/dsk_dsk.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/dsk_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -211,6 +211,13 @@ } floppy_image_read(floppy, header, 0, 0x100); +#ifdef SPOT_DUPLICATES + // this allow to spot .dsk files with same data and different headers, making easier to debug softlists. + UINT32 temp_size = floppy_image_size(floppy); + UINT8 tmp_copy[temp_size - 0x100]; + floppy_image_read(floppy,tmp_copy,0x100,temp_size - 0x100); + printf("CRC16: %d\n", ccitt_crc16(0xffff, tmp_copy, temp_size - 0x100)); +#endif tag = (struct dskdsk_tag *) floppy_create_tag(floppy, sizeof(struct dskdsk_tag)); if (!tag) @@ -286,7 +293,7 @@ return false; } -int dsk_format::identify(io_generic *io) +int dsk_format::identify(io_generic *io, UINT32 form_factor) { UINT8 header[16]; @@ -331,7 +338,7 @@ #pragma pack() -bool dsk_format::load(io_generic *io, floppy_image *image) +bool dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { UINT8 header[100]; bool extendformat = FALSE; diff -Nru mame-0.144/src/lib/formats/dsk_dsk.h mame-0.145/src/lib/formats/dsk_dsk.h --- mame-0.144/src/lib/formats/dsk_dsk.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/dsk_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -16,8 +16,8 @@ public: dsk_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual const char *name() const; virtual const char *description() const; diff -Nru mame-0.144/src/lib/formats/flopimg.c mame-0.145/src/lib/formats/flopimg.c --- mame-0.144/src/lib/formats/flopimg.c 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/flopimg.c 2012-02-06 21:30:30.000000000 +0000 @@ -938,18 +938,56 @@ LEGACY_FLOPPY_OPTIONS_END -////////////////////////////////////////////////////////// -/// New implementation -////////////////////////////////////////////////////////// +/*************************************************************************** -floppy_image::floppy_image(int _tracks, int _heads) + New implementation + +**************************************************************************** + + Copyright Olivier Galibert + 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. + +****************************************************************************/ + + +floppy_image::floppy_image(int _tracks, int _heads, UINT32 _form_factor) { tracks = _tracks; heads = _heads; + form_factor = _form_factor; + variant = 0; + memset(cell_data, 0, sizeof(cell_data)); memset(track_size, 0, sizeof(track_size)); memset(track_alloc_size, 0, sizeof(track_alloc_size)); + memset(write_splice, 0, sizeof(write_splice)); } floppy_image::~floppy_image() @@ -992,19 +1030,30 @@ void floppy_image::ensure_alloc(int track, int head) { - int idx = (track << 1) + head; - if(track_size[idx] > track_alloc_size[idx]) { - UINT32 new_size = track_size[idx]*11/10; + if(track_size[track][head] > track_alloc_size[track][head]) { + UINT32 new_size = track_size[track][head]*11/10; UINT32 *new_array = global_alloc_array(UINT32, new_size); - if(track_alloc_size[idx]) { - memcpy(new_array, cell_data[idx], track_alloc_size[idx]*4); - global_free(cell_data[idx]); + if(track_alloc_size[track][head]) { + memcpy(new_array, cell_data[track][head], track_alloc_size[track][head]*4); + global_free(cell_data[track][head]); } - cell_data[idx] = new_array; - track_alloc_size[idx] = new_size; + cell_data[track][head] = new_array; + track_alloc_size[track][head] = new_size; } } +const char *floppy_image::get_variant_name(UINT32 form_factor, UINT32 variant) +{ + switch(variant) { + case SSSD: return "Single side, single density"; + case SSDD: return "Single side, double density"; + case DSDD: return "Double side, double density"; + case DSHD: return "Double side, high density"; + case DSED: return "Double side, extended density"; + } + return "Unknown"; +} + floppy_image_format_t::floppy_image_format_t() { next = 0; @@ -1027,10 +1076,32 @@ return false; } +bool floppy_image_format_t::extension_matches(const char *file_name) const +{ + const char *ext = strrchr(file_name, '.'); + if(!ext) + return false; + ext++; + int elen = strlen(ext); + const char *rext = extensions(); + for(;;) { + const char *next = strchr(rext, ','); + int rlen = next ? next - rext : strlen(rext); + if(rlen == elen && !memcmp(ext, rext, rlen)) + return true; + if(next) + rext = next+1; + else + break; + } + return false; +} + bool floppy_image_format_t::type_no_data(int type) const { return type == CRC_CCITT_START || type == CRC_AMIGA_START || + type == CRC_MACHEAD_START || type == CRC_END || type == SECTOR_LOOP_START || type == SECTOR_LOOP_END || @@ -1059,6 +1130,9 @@ case CRC_AMIGA_START: crcs[desc[i].p1].type = CRC_AMIGA; break; + case CRC_MACHEAD_START: + crcs[desc[i].p1].type = CRC_MACHEAD; + break; } for(int i=0; desc[i].type != END; i++) @@ -1074,52 +1148,58 @@ switch(type) { case CRC_CCITT: return 32; case CRC_AMIGA: return 64; + case CRC_MACHEAD: return 8; default: return 0; } } -bool floppy_image_format_t::bit_r(UINT8 *buffer, int offset) +bool floppy_image_format_t::bit_r(const UINT32 *buffer, int offset) { - return (buffer[offset >> 3] >> ((offset & 7) ^ 7)) & 1; + return (buffer[offset] & floppy_image::MG_MASK) == MG_1; } -void floppy_image_format_t::bit_w(UINT8 *buffer, int offset, bool val) +UINT32 floppy_image_format_t::bitn_r(const UINT32 *buffer, int offset, int count) { - if(val) - buffer[offset >> 3] |= 0x80 >> (offset & 7); - else - buffer[offset >> 3] &= ~(0x80 >> (offset & 7)); + UINT32 r = 0; + for(int i=0; i=0; i--) - bit_w(buffer, offset++, (val >> i) & 1); + bit_w(buffer, offset++, (val >> i) & 1, size); } -void floppy_image_format_t::mfm_w(UINT8 *buffer, int &offset, int n, UINT32 val) +void floppy_image_format_t::mfm_w(UINT32 *buffer, int &offset, int n, UINT32 val, UINT32 size) { int prec = offset ? bit_r(buffer, offset-1) : 0; for(int i=n-1; i>=0; i--) { int bit = (val >> i) & 1; - bit_w(buffer, offset++, !(prec || bit)); - bit_w(buffer, offset++, bit); + bit_w(buffer, offset++, !(prec || bit), size); + bit_w(buffer, offset++, bit, size); prec = bit; } } -void floppy_image_format_t::mfm_half_w(UINT8 *buffer, int &offset, int start_bit, UINT32 val) +void floppy_image_format_t::mfm_half_w(UINT32 *buffer, int &offset, int start_bit, UINT32 val, UINT32 size) { int prec = offset ? bit_r(buffer, offset-1) : 0; for(int i=start_bit; i>=0; i-=2) { int bit = (val >> i) & 1; - bit_w(buffer, offset++, !(prec || bit)); - bit_w(buffer, offset++, bit); + bit_w(buffer, offset++, !(prec || bit), size); + bit_w(buffer, offset++, bit, size); prec = bit; } } -void floppy_image_format_t::fixup_crc_amiga(UINT8 *buffer, const gen_crc_info *crc) +void floppy_image_format_t::fixup_crc_amiga(UINT32 *buffer, const gen_crc_info *crc) { UINT16 res = 0; int size = crc->end - crc->start; @@ -1131,28 +1211,43 @@ mfm_w(buffer, offset, 16, res); } -void floppy_image_format_t::fixup_crc_ccitt(UINT8 *buffer, const gen_crc_info *crc) +UINT16 floppy_image_format_t::calc_crc_ccitt(const UINT32 *buffer, int start, int end) { UINT32 res = 0xffff; - int size = crc->end - crc->start; + int size = end - start; for(int i=1; istart + i)) + if(bit_r(buffer, start + i)) res ^= 0x10000; if(res & 0x10000) res ^= 0x11021; } + return res; +} + +void floppy_image_format_t::fixup_crc_ccitt(UINT32 *buffer, const gen_crc_info *crc) +{ int offset = crc->write; - mfm_w(buffer, offset, 16, res); + mfm_w(buffer, offset, 16, calc_crc_ccitt(buffer, crc->start, crc->end)); } -void floppy_image_format_t::fixup_crcs(UINT8 *buffer, gen_crc_info *crcs) +void floppy_image_format_t::fixup_crc_machead(UINT32 *buffer, const gen_crc_info *crc) +{ + UINT8 v = 0; + for(int o = crc->start; o < crc->end; o+=8) + v = v ^ gcr6bw_tb[bitn_r(buffer, o, 8)]; + int offset = crc->write; + raw_w(buffer, offset, 8, gcr6fw_tb[v]); +} + +void floppy_image_format_t::fixup_crcs(UINT32 *buffer, gen_crc_info *crcs) { for(int i=0; i != MAX_CRC_COUNT; i++) if(crcs[i].write != -1) { switch(crcs[i].type) { - case CRC_AMIGA: fixup_crc_amiga(buffer, crcs+i); break; - case CRC_CCITT: fixup_crc_ccitt(buffer, crcs+i); break; + case CRC_AMIGA: fixup_crc_amiga(buffer, crcs+i); break; + case CRC_CCITT: fixup_crc_ccitt(buffer, crcs+i); break; + case CRC_MACHEAD: fixup_crc_machead(buffer, crcs+i); break; } if(crcs[i].fixup_mfm_clock) { int offset = crcs[i].write + crc_cells_size(crcs[i].type); @@ -1162,6 +1257,39 @@ } } +UINT32 floppy_image_format_t::gcr6_encode(UINT8 va, UINT8 vb, UINT8 vc) +{ + UINT32 r; + r = gcr6fw_tb[((va >> 2) & 0x30) | ((vb >> 4) & 0x0c) | ((vc >> 6) & 0x03)] << 24; + r |= gcr6fw_tb[va & 0x3f] << 16; + r |= gcr6fw_tb[vb & 0x3f] << 8; + r |= gcr6fw_tb[vc & 0x3f]; + return r; +} + +void floppy_image_format_t::gcr6_decode(UINT8 e0, UINT8 e1, UINT8 e2, UINT8 e3, UINT8 &va, UINT8 &vb, UINT8 &vc) +{ + e0 = gcr6bw_tb[e0]; + e1 = gcr6bw_tb[e1]; + e2 = gcr6bw_tb[e2]; + e3 = gcr6bw_tb[e3]; + + va = ((e0 << 2) & 0xc0) | e1; + vb = ((e0 << 4) & 0xc0) | e2; + vc = ((e0 << 6) & 0xc0) | e3; +} + +UINT16 floppy_image_format_t::gcr4_encode(UINT8 va) +{ + return (va << 7) | va | 0xaaaa; +} + +UINT8 floppy_image_format_t::gcr4_decode(UINT8 e0, UINT8 e1) +{ + return ((e0 << 1) & 0xaa) | (e1 & 0x55); +} + + int floppy_image_format_t::calc_sector_index(int num, int interleave, int skew, int total_sectors, int track_head) { int i = 0; @@ -1183,7 +1311,7 @@ void floppy_image_format_t::generate_track(const desc_e *desc, int track, int head, const desc_s *sect, int sect_count, int track_size, floppy_image *image) { - UINT8 *buffer = global_alloc_array_clear(UINT8, (track_size+7)/8); + UINT32 *buffer = global_alloc_array_clear(UINT32, track_size); gen_crc_info crcs[MAX_CRC_COUNT]; collect_crcs(desc, crcs); @@ -1222,14 +1350,26 @@ mfm_w(buffer, offset, 8, track); break; + case TRACK_ID_GCR6: + raw_w(buffer, offset, 8, gcr6fw_tb[track & 0x3f]); + break; + case HEAD_ID: mfm_w(buffer, offset, 8, head); break; + case TRACK_HEAD_ID_GCR6: + raw_w(buffer, offset, 8, gcr6fw_tb[(track & 0x40 ? 1 : 0) | (head ? 0x20 : 0)]); + break; + case SECTOR_ID: mfm_w(buffer, offset, 8, sect[sector_idx].sector_id); break; + case SECTOR_ID_GCR6: + raw_w(buffer, offset, 8, gcr6fw_tb[sect[sector_idx].sector_id]); + break; + case SIZE_ID: { int size = sect[sector_idx].size; int id; @@ -1238,6 +1378,10 @@ break; } + case SECTOR_INFO_GCR6: + raw_w(buffer, offset, 8, gcr6fw_tb[sect[sector_idx].sector_info]); + break; + case OFFSET_ID_O: mfm_half_w(buffer, offset, 7, track*2+head); break; @@ -1267,7 +1411,7 @@ sector_loop_start = index; sector_idx = desc[index].p1; sector_cnt = sector_idx; - sector_limit = desc[index].p2; + sector_limit = desc[index].p2 == -1 ? sector_idx+sect_count-1 : desc[index].p2; sector_idx = calc_sector_index(sector_cnt,sector_interleave,sector_skew,sector_limit+1,track*2 + head); break; @@ -1287,6 +1431,7 @@ case CRC_AMIGA_START: case CRC_CCITT_START: + case CRC_MACHEAD_START: crcs[desc[index].p1].start = offset; break; @@ -1320,6 +1465,34 @@ break; } + case SECTOR_DATA_MAC: { + const desc_s *csect = sect + (desc[index].p1 >= 0 ? desc[index].p1 : sector_idx); + const UINT8 *data = csect->data; + int size = csect->size; + UINT8 ca = 0, cb = 0, cc = 0; + for(int i=0; i < size; i+=3) { + int dt = size-i; + UINT8 va = data[i]; + UINT8 vb = dt > 1 ? data[i+1] : 0; + UINT8 vc = dt > 2 ? data[i+2] : 0; + + cc = (cc << 1) | (cc >> 7); + int suma = ca + va + (cc & 1); + ca = suma; + va = va ^ cc; + int sumb = cb + vb + (suma >> 8); + cb = sumb; + vb = vb ^ ca; + cc = cc + vc + (sumb >> 8); + vc = vc ^ cb; + + int nb = dt > 2 ? 32 : dt > 1 ? 24 : 16; + raw_w(buffer, offset, nb, gcr6_encode(va, vb, vc) >> (32-nb)); + } + raw_w(buffer, offset, 32, gcr6_encode(ca, cb, cc)); + break; + } + default: printf("%d.%d.%d (%d) unhandled\n", desc[index].type, desc[index].p1, desc[index].p2, index); break; @@ -1332,7 +1505,7 @@ fixup_crcs(buffer, crcs); - generate_track_from_bitstream(track, head, buffer, track_size, image); + generate_track_from_levels(track, head, buffer, track_size, 0, image); global_free(buffer); } @@ -1373,10 +1546,15 @@ int size = dest - base; normalize_times(base, size); image->set_track_size(track, head, size); + image->set_write_splice_position(track, head, 0); } void floppy_image_format_t::generate_track_from_levels(int track, int head, UINT32 *trackbuf, int track_size, int splice_pos, floppy_image *image) { + // Retrieve the angular splice pos before messing with the data + splice_pos = splice_pos % track_size; + UINT32 splice_angular_pos = trackbuf[splice_pos] & floppy_image::TIME_MASK; + // Check if we need to invert a cell to get an even number of // transitions on the whole track // @@ -1404,7 +1582,6 @@ } if(transition_count & 1) { - splice_pos = splice_pos % track_size; int pos = splice_pos; while((trackbuf[pos] & floppy_image::MG_MASK) != MG_0 && (trackbuf[pos] & floppy_image::MG_MASK) != MG_1) { pos++; @@ -1455,8 +1632,42 @@ int size = dest - base; normalize_times(base, size); image->set_track_size(track, head, size); + image->set_write_splice_position(track, head, splice_angular_pos); } +const UINT8 floppy_image_format_t::gcr6fw_tb[0x40] = +{ + 0x96, 0x97, 0x9a, 0x9b, 0x9d, 0x9e, 0x9f, 0xa6, + 0xa7, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xcb, 0xcd, 0xce, 0xcf, 0xd3, + 0xd6, 0xd7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, + 0xdf, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xec, + 0xed, 0xee, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, + 0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, +}; + +const UINT8 floppy_image_format_t::gcr6bw_tb[0x100] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x04, 0x05, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x00, 0x00, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x00, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x1c, 0x1d, 0x1e, + 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x20, 0x21, 0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, + 0x00, 0x00, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x00, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, +}; + // Atari ST Fastcopy Pro layouts #define SECTOR_42_HEADER(cid) \ @@ -1790,6 +2001,32 @@ { END } }; +const floppy_image_format_t::desc_e floppy_image_format_t::amiga_22[] = { + { SECTOR_LOOP_START, 0, 21 }, + { MFM, 0x00, 2 }, + { RAW, 0x4489, 2 }, + { CRC_AMIGA_START, 1 }, + { MFMBITS, 0xf, 4 }, + { OFFSET_ID_O }, + { SECTOR_ID_O }, + { REMAIN_O, 11 }, + { MFMBITS, 0xf, 4 }, + { OFFSET_ID_E }, + { SECTOR_ID_E }, + { REMAIN_E, 11 }, + { MFM, 0x00, 16 }, + { CRC_END, 1 }, + { CRC, 1 }, + { CRC, 2 }, + { CRC_AMIGA_START, 2 }, + { SECTOR_DATA_O, -1 }, + { SECTOR_DATA_E, -1 }, + { CRC_END, 2 }, + { SECTOR_LOOP_END }, + { MFM, 0x00, 532 }, + { END } +}; + void floppy_image_format_t::generate_bitstream_from_track(int track, int head, int cell_size, UINT8 *trackbuf, int &track_size, floppy_image *image) { int tsize = image->get_track_size(track, head); @@ -1800,18 +2037,15 @@ return; } - // Start a little before the end of the track to pre-synchronize - // the pll + // Start at the write splice const UINT32 *tbuf = image->get_buffer(track, head); - int cur_pos = 190000000; - int cur_entry = tsize-1; - while((tbuf[cur_entry] & floppy_image::TIME_MASK) > cur_pos) - cur_entry--; - cur_entry++; - if(cur_entry == tsize) - cur_entry = 0; + UINT32 splice = image->get_write_splice_position(track, head); + int cur_pos = splice; + int cur_entry = 0; + while(cur_entry < tsize-1 && (tbuf[cur_entry+1] & floppy_image::TIME_MASK) < cur_pos) + cur_entry++; - int cur_bit = -1; + int cur_bit = 0; int period = cell_size; int period_adjust_base = period * 0.05; @@ -1821,28 +2055,26 @@ int phase_adjust = 0; int freq_hist = 0; - for(;;) { + UINT32 scanned = 0; + while(scanned < 200000000) { // Note that all magnetic cell type changes are considered // edges. No randomness added for neutral/damaged cells int edge = tbuf[cur_entry] & floppy_image::TIME_MASK; if(edge < cur_pos) edge += 200000000; int next = cur_pos + period + phase_adjust; + scanned += period + phase_adjust; if(edge >= next) { // No transition in the window means 0 and pll in free run mode - if(cur_bit >= 0) { - trackbuf[cur_bit >> 3] &= ~(0x80 >> (cur_bit & 7)); - cur_bit++; - } + trackbuf[cur_bit >> 3] &= ~(0x80 >> (cur_bit & 7)); + cur_bit++; phase_adjust = 0; } else { // Transition in the window means 1, and the pll is adjusted - if(cur_bit >= 0) { - trackbuf[cur_bit >> 3] |= 0x80 >> (cur_bit & 7); - cur_bit++; - } + trackbuf[cur_bit >> 3] |= 0x80 >> (cur_bit & 7); + cur_bit++; int delta = edge - (next - period/2); @@ -1879,9 +2111,6 @@ cur_pos = next; if(cur_pos >= 200000000) { - if(cur_bit >= 0) - break; - cur_bit = 0; cur_pos -= 200000000; cur_entry = 0; } @@ -1990,6 +2219,7 @@ UINT8 head = sbyte_mfm_r(bitstream, pos, track_size); UINT8 sector = sbyte_mfm_r(bitstream, pos, track_size); UINT8 size = sbyte_mfm_r(bitstream, pos, track_size); + if(size >= 8) continue; int ssize = 128 << size; @@ -1999,13 +2229,13 @@ continue; // Start of IDAM and DAM are supposed to be exactly 704 cells - // apart. Of course the hardware is tolerant, but not that - // tolerant. Accept +/- 32 cells of shift. + // apart. Of course the hardware is tolerant. Accept +/- 128 + // cells of shift. int d_index; for(d_index = 0; d_index < dblk_count; d_index++) { int delta = dblk[d_index] - idblk[i]; - if(delta >= 704-32 && delta <= 704+32) + if(delta >= 704-128 && delta <= 704+128) break; } if(d_index == dblk_count) @@ -2026,6 +2256,11 @@ { image->get_actual_geometry(track_count, head_count); + if(!track_count) { + sector_count = 0; + return; + } + UINT8 bitstream[500000/8]; UINT8 sectdata[50000]; desc_xs sectors[256]; @@ -2038,7 +2273,7 @@ // 0-10, not near the end like 70+, no special effects on sync // like 33 - generate_bitstream_from_track(20, 0, cell_size, bitstream, track_size, image); + generate_bitstream_from_track(track_count > 20 ? 20 : 0, 0, cell_size, bitstream, track_size, image); extract_sectors_from_bitstream_mfm_pc(bitstream, track_size, sectors, sectdata, sizeof(sectdata)); for(sector_count = 44; sector_count > 0 && !sectors[sector_count].data; sector_count--); diff -Nru mame-0.144/src/lib/formats/flopimg.h mame-0.145/src/lib/formats/flopimg.h --- mame-0.144/src/lib/formats/flopimg.h 2012-01-13 15:34:29.000000000 +0000 +++ mame-0.145/src/lib/formats/flopimg.h 2012-02-06 21:30:30.000000000 +0000 @@ -213,32 +213,71 @@ /* misc */ const char *floppy_error(floperr_t err); + ////////////////////////////////////////////////////////// -/// New implementation +// New implementation ////////////////////////////////////////////////////////// class floppy_image; +//! Class representing a floppy image format. class floppy_image_format_t { public: floppy_image_format_t(); virtual ~floppy_image_format_t(); - virtual int identify(io_generic *io) = 0; - virtual bool load(io_generic *io, floppy_image *image) = 0; + /*! @brief Identify an image. + The identify function tests if the image is valid + for this particular format. + @param io buffer containing the image data. + @param form_factor Physical form factor of disk, from the enum + in floppy_image + @return 1 if image valid, 0 otherwise. + */ + virtual int identify(io_generic *io, UINT32 form_factor) = 0; + + /*! @brief Load an image. + The load function opens an image file and converts it to the + internal MESS floppy representation. + @param io source buffer containing the image data. + @param form_factor Physical form factor of disk, from the enum + in floppy_image + @param image output buffer for data in MESS internal format. + @return true on success, false otherwise. + */ + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image) = 0; + + /*! @brief Save an image. + The save function writes back an image from the MESS internal + floppy representation to the appropriate format on disk. + @param io output buffer for the data in the on-disk format. + @param image source buffer containing data in MESS internal format. + @return true on success, false otherwise. + */ virtual bool save(io_generic *io, floppy_image *image); + //! @returns string containing name of format. virtual const char *name() const = 0; + //! @returns string containing description of format. virtual const char *description() const = 0; + //! @returns string containing comma-separated list of file + //! extensions the format may use. virtual const char *extensions() const = 0; + //! @returns true if format supports saving. virtual bool supports_save() const = 0; + //! Used if a linked list of formats is needed floppy_image_format_t *next; + //! This appends a format to the linked list of formats, needed for floppy_image_device(). void append(floppy_image_format_t *_next); + //! This checks if the file has the proper extension for this format. + //! @param file_name + //! @returns true if file matches the extension. + bool extension_matches(const char *file_name) const; protected: - // Input for convert_to_edge + //! Input for convert_to_edge enum { MG_SHIFT = 28, @@ -249,77 +288,107 @@ // **** Reader helpers **** - // Struct designed for easy track data description - // Optional, you can always do things by hand, but useful nevertheless - // A vector of these structures describes one track. + //! Struct designed for easy track data description. Contains an opcode and two params. + + //! Optional, you can always do things by hand, but useful nevertheless. + //! A vector of these structures describes one track. struct desc_e { - int type, p1, p2; + int type, //!< An opcode + p1, //!< first param + p2; //!< second param }; + //! Opcodes of the format description language used by generate_track() enum { - END, // End of description - MFM, // One byte in p1 to be mfm-encoded, msb first, repeated p2 times - MFMBITS, // A value of p2 bits in p1 to be mfm-encoded, msb first - RAW, // One 16 bits word in p1 to be written raw, msb first, repeated p2 times - RAWBITS, // A value of p2 bits in p1 to be copied as-is, msb first - TRACK_ID, // Track id byte, mfm-encoded - HEAD_ID, // Head id byte, mfm-encoded - SECTOR_ID, // Sector id byte, mfm-encoded - SIZE_ID, // Sector size code on one byte [log2(size/128)], mfm-encoded - OFFSET_ID_O, // Offset (track*2+head) byte, odd bits, mfm-encoded - OFFSET_ID_E, // Offset (track*2+head) byte, even bits, mfm-encoded - SECTOR_ID_O, // Sector id byte, odd bits, mfm-encoded - SECTOR_ID_E, // Sector id byte, even bits, mfm-encoded - REMAIN_O, // Remaining sector count, odd bits, mfm-encoded, total sector count in p1 - REMAIN_E, // Remaining sector count, even bits, mfm-encoded, total sector count in p1 - - SECTOR_DATA, // Sector data to mfm-encode, which in p1, -1 for the current one per the sector id - SECTOR_DATA_O, // Sector data to mfm-encode, odd bits only, which in p1, -1 for the current one per the sector id - SECTOR_DATA_E, // Sector data to mfm-encode, even bits only, which in p1, -1 for the current one per the sector id - - CRC_CCITT_START, // Start a CCITT CRC calculation, with the usual x^16 + x^12 + x^5 + 1 (11021) polynomial, p1 = crc id - CRC_AMIGA_START, // Start an amiga checksum calculation, p1 = crc id - CRC_END, // End the checksum, p1 = crc id - CRC, // Write a checksum in the apporpriate format, p1 = crc id - - SECTOR_LOOP_START, // Start of the per-sector loop, sector number goes from p1 to p2 inclusive - SECTOR_LOOP_END, // End of the per-sector loop - SECTOR_INTERLEAVE_SKEW, // Defines interleave and skew for sector counting + END, //!< End of description + MFM, //!< One byte in p1 to be mfm-encoded, msb first, repeated p2 times + MFMBITS, //!< A value of p2 bits in p1 to be mfm-encoded, msb first + RAW, //!< One 16 bits word in p1 to be written raw, msb first, repeated p2 times + RAWBITS, //!< A value of p2 bits in p1 to be copied as-is, msb first + TRACK_ID, //!< Track id byte, mfm-encoded + TRACK_ID_GCR6, //!< Track id low 6 bits, gcr6-encoded + HEAD_ID, //!< Head id byte, mfm-encoded + TRACK_HEAD_ID_GCR6, //!< Track id 7th bit + head, gc6-encoded + SECTOR_ID, //!< Sector id byte, mfm-encoded + SECTOR_ID_GCR6, //!< Sector id byte, gcr6-encoded + SIZE_ID, //!< Sector size code on one byte [log2(size/128)], mfm-encoded + SECTOR_INFO_GCR6, //!< Sector info byte, gcr6-encoded + OFFSET_ID_O, //!< Offset (track*2+head) byte, odd bits, mfm-encoded + OFFSET_ID_E, //!< Offset (track*2+head) byte, even bits, mfm-encoded + SECTOR_ID_O, //!< Sector id byte, odd bits, mfm-encoded + SECTOR_ID_E, //!< Sector id byte, even bits, mfm-encoded + REMAIN_O, //!< Remaining sector count, odd bits, mfm-encoded, total sector count in p1 + REMAIN_E, //!< Remaining sector count, even bits, mfm-encoded, total sector count in p1 + + SECTOR_DATA, //!< Sector data to mfm-encode, which in p1, -1 for the current one per the sector id + SECTOR_DATA_O, //!< Sector data to mfm-encode, odd bits only, which in p1, -1 for the current one per the sector id + SECTOR_DATA_E, //!< Sector data to mfm-encode, even bits only, which in p1, -1 for the current one per the sector id + SECTOR_DATA_MAC, //!< Transformed sector data + checksum, mac style, id in p1, -1 for the current one per the sector id + + CRC_CCITT_START, //!< Start a CCITT CRC calculation, with the usual x^16 + x^12 + x^5 + 1 (11021) polynomial, p1 = crc id + CRC_AMIGA_START, //!< Start an amiga checksum calculation, p1 = crc id + CRC_MACHEAD_START, //!< Start of the mac gcr6 sector header checksum calculation (xor of pre-encode 6-bits values, gcr6-encoded) + CRC_END, //!< End the checksum, p1 = crc id + CRC, //!< Write a checksum in the apporpriate format, p1 = crc id + + SECTOR_LOOP_START, //!< Start of the per-sector loop, sector number goes from p1 to p2 inclusive + SECTOR_LOOP_END, //!< End of the per-sector loop + SECTOR_INTERLEAVE_SKEW, //!< Defines interleave and skew for sector counting }; - // Sector data description + //! Sector data description struct desc_s { - int size; // Sector size, int bytes - const UINT8 *data; // Sector data - UINT8 sector_id; // Sector ID + int size; //!< Sector size, int bytes + const UINT8 *data; //!< Sector data + UINT8 sector_id; //!< Sector ID + UINT8 sector_info; //!< Sector free byte }; - // Generate one track according to the description vector - // "sect" is a vector indexed by sector id - // "track_size" is in _cells_, i.e. 100000 for a usual 2us-per-cell track at 300rpm - + /*! @brief Generate one track according to the description vector. + @param desc track data description + @param track + @param head + @param sect a vector indexed by sector id. + @param sect_count number of sectors. + @param track_size in _cells_, i.e. 100000 for a usual 2us-per-cell track at 300rpm. + @param image + */ void generate_track(const desc_e *desc, int track, int head, const desc_s *sect, int sect_count, int track_size, floppy_image *image); - // Generate a track from cell binary values, MSB-first, size in cells and not bytes + /*! @brief Generate a track from cell binary values, MSB-first. + @param track + @param head + @param trackbuf track input buffer. + @param track_size in cells, not bytes. + @param image + */ void generate_track_from_bitstream(int track, int head, const UINT8 *trackbuf, int track_size, floppy_image *image); - // Generate a track from cell level values (0/1/W/D/N) - // - // Splice pos is the position of the track splice. For normal - // formats, use -1. For protected formats, you're supposed to - // know. trackbuf may be modified at that position or after. - // - // Note that this function needs to be able to split cells in two, - // so no time value should be less than 2, and even values are a - // good idea. + //! @brief Generate a track from cell level values (0/1/W/D/N). + /*! Note that this function needs to be able to split cells in two, + so no time value should be less than 2, and even values are a + good idea. + */ + /*! @param track + @param head + @param trackbuf track input buffer. + @param track_size in cells, not bytes. + @param splice_pos is the position of the track splice. For normal + formats, use -1. For protected formats, you're supposed to + know. trackbuf may be modified at that position or after. + @param image + */ void generate_track_from_levels(int track, int head, UINT32 *trackbuf, int track_size, int splice_pos, floppy_image *image); - // Normalize the times in a cell buffer to sum up to 200000000 + //! Normalize the times in a cell buffer to sum up to 200000000 void normalize_times(UINT32 *buffer, int bitlen); + // Some conversion tables for gcr + static const UINT8 gcr5fw_tb[0x20], gcr5bw_tb[0x100]; + static const UINT8 gcr6fw_tb[0x40], gcr6bw_tb[0x100]; // Some useful descriptions shared by multiple formats @@ -346,91 +415,128 @@ // Standard 11 sectors per track format static const desc_e amiga_11[]; + // Standard 22 sectors per track format (guessed, to check w.r.t the real thing) + static const desc_e amiga_22[]; + // **** Writer helpers **** - // Rebuild a cell bitstream for a track. Takes the cell standard - // angular size as a parameter, gives out a msb-first bitstream. - // Beware that fuzzy bits will always give out the same value. - // - // Output buffer size should be 34% more than the nominal number - // of cells (the dpll tolerates a cell size down to 75% of the - // nominal one, with gives a cell count of 1/0.75=1.333... times - // the nominal one). - // - // Output size is given in bits (cells). - // - // Computing the standard angular size of a cell is - // simple. Noting: - // d = standard cell duration in microseconds - // r = motor rotational speed in rpm - // then: - // a = r * d * 10 / 3 - // - // Some values: - // Type Cell RPM Size - - // C1541 tr 1-17 3.25 300 3250 - // C1541 tr 18-24 3.50 300 3500 - // C1541 tr 25-30 3.75 300 3750 - // C1541 tr 31+ 4.00 300 4000 - // 5.25" SD 4 300 4000 - // 5.25" DD 2 300 2000 - // 5.25" HD 1 360 1200 - // 3.5" SD 4 300 4000 - // 3.5" DD 2 300 2000 - // 3.5" HD 1 300 1000 - // 3.5" ED 0.5 300 500 + /*! @brief Rebuild a cell bitstream for a track. + Takes the cell standard + angular size as a parameter, gives out a msb-first bitstream. + + Beware that fuzzy bits will always give out the same value. + @param track + @param head + @param cell_size + @param trackbuf Output buffer size should be 34% more than the nominal number + of cells (the dpll tolerates a cell size down to 75% of the + nominal one, with gives a cell count of 1/0.75=1.333... times + the nominal one). + @param track_size Output size is given in bits (cells). + @param image + */ + /*! @verbatim + Computing the standard angular size of a cell is + simple. Noting: + d = standard cell duration in microseconds + r = motor rotational speed in rpm + then: + a = r * d * 10 / 3. + Some values: + Type Cell RPM Size + + C1541 tr 1-17 3.25 300 3250 + C1541 tr 18-24 3.50 300 3500 + C1541 tr 25-30 3.75 300 3750 + C1541 tr 31+ 4.00 300 4000 + 5.25" SD 4 300 4000 + 5.25" DD 2 300 2000 + 5.25" HD 1 360 1200 + 3.5" SD 4 300 4000 + 3.5" DD 2 300 2000 + 3.5" HD 1 300 1000 + 3.5" ED 0.5 300 500 + @endverbatim + */ void generate_bitstream_from_track(int track, int head, int cell_size, UINT8 *trackbuf, int &track_size, floppy_image *image); + //! Defines a standard sector for extracting. struct desc_xs { - int track, head, size; - const UINT8 *data; + int track, //!< Track for this sector + head, //!< Head for this sector + size; //!< Size of this sector + const UINT8 *data; //!< Data within this sector }; - // Extract standard sectors from a regenerated bitstream - // sectors must point to an array of 256 desc_xs - // An existing sector is reconizable by having ->data non-null - // Sector data is written in sectdata up to sectdata_size bytes + //! @brief Extract standard sectors from a regenerated bitstream. + //! Sectors must point to an array of 256 desc_xs. - // The ones implemented here are the ones used by multiple - // systems. + //! An existing sector is recognizable by having ->data non-null. + //! Sector data is written in sectdata up to sectdata_size bytes. - // PC-type sectors with MFM encoding, sector size can go from 128 bytes to 16K + //! The ones implemented here are the ones used by multiple + //! systems. + + //! PC-type sectors with MFM encoding, sector size can go from 128 bytes to 16K. void extract_sectors_from_bitstream_mfm_pc(const UINT8 *bitstream, int track_size, desc_xs *sectors, UINT8 *sectdata, int sectdata_size); - // Get a geometry (including sectors) from an image - // PC-type sectors with MFM encoding + //! @brief Get a geometry (including sectors) from an image. + + //! PC-type sectors with MFM encoding void get_geometry_mfm_pc(floppy_image *image, int cell_size, int &track_count, int &head_count, int §or_count); - // Regenerate the data for a full track - // PC-type sectors with MFM encoding and fixed-size + //! Regenerate the data for a full track. + //! PC-type sectors with MFM encoding and fixed-size. void get_track_data_mfm_pc(int track, int head, floppy_image *image, int cell_size, int sector_size, int sector_count, UINT8 *sectdata); + //! Look up a bit in a level-type stream. + bool bit_r(const UINT32 *buffer, int offset); + //! Look up multiple bits + UINT32 bitn_r(const UINT32 *buffer, int offset, int count); + //! Write a bit with a given size. + void bit_w(UINT32 *buffer, int offset, bool val, UINT32 size = 1000); + //! Calculate a CCITT-type CRC. + UINT16 calc_crc_ccitt(const UINT32 *buffer, int start, int end); + //! Write a series of (raw) bits and increment the offset. + void raw_w(UINT32 *buffer, int &offset, int n, UINT32 val, UINT32 size = 1000); + //! MFM-encode and write a series of bits + void mfm_w(UINT32 *buffer, int &offset, int n, UINT32 val, UINT32 size = 1000); + //! MFM-encode every two bits and write + void mfm_half_w(UINT32 *buffer, int &offset, int start_bit, UINT32 val, UINT32 size = 1000); + //! GCR4 encode (Apple II sector header) + UINT16 gcr4_encode(UINT8 va); + //! GCR4 decode + UINT8 gcr4_decode(UINT8 e0, UINT8 e1); + //! GCR6 encode (Apple II 16-sector and Mac-style GCR) + UINT32 gcr6_encode(UINT8 va, UINT8 vb, UINT8 vc); + //! GCR6 decode + void gcr6_decode(UINT8 e0, UINT8 e1, UINT8 e2, UINT8 e3, UINT8 &va, UINT8 &vb, UINT8 &vc); + private: - enum { CRC_NONE, CRC_AMIGA, CRC_CCITT }; + enum { CRC_NONE, CRC_AMIGA, CRC_CCITT, CRC_MACHEAD }; enum { MAX_CRC_COUNT = 64 }; + + //! Holds data used internally for generating CRCs. struct gen_crc_info { - int type, start, end, write; - bool fixup_mfm_clock; + int type, //!< Type of CRC + start, //!< Start position + end, //!< End position + write; //!< where to write the CRC + bool fixup_mfm_clock; //!< would the MFM clock bit after the CRC need to be fixed? }; bool type_no_data(int type) const; bool type_data_mfm(int type, int p1, const gen_crc_info *crcs) const; - bool bit_r(UINT8 *buffer, int offset); - void bit_w(UINT8 *buffer, int offset, bool val); - int crc_cells_size(int type) const; - void fixup_crc_amiga(UINT8 *buffer, const gen_crc_info *crc); - void fixup_crc_ccitt(UINT8 *buffer, const gen_crc_info *crc); - void fixup_crcs(UINT8 *buffer, gen_crc_info *crcs); - void raw_w(UINT8 *buffer, int &offset, int n, UINT32 val); - void mfm_w(UINT8 *buffer, int &offset, int n, UINT32 val); - void mfm_half_w(UINT8 *buffer, int &offset, int start_bit, UINT32 val); + void fixup_crc_amiga(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crc_ccitt(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crc_machead(UINT32 *buffer, const gen_crc_info *crc); + void fixup_crcs(UINT32 *buffer, gen_crc_info *crcs); void collect_crcs(const desc_e *desc, gen_crc_info *crcs); int sbit_r(const UINT8 *bitstream, int pos); @@ -440,7 +546,7 @@ int calc_sector_index(int num, int interleave, int skew, int total_sectors, int track_head); }; -// a device_type is simply a pointer to its alloc function +// a dce_type is simply a pointer to its alloc function typedef floppy_image_format_t *(*floppy_format_type)(); // this template function creates a stub which constructs a image format @@ -452,50 +558,132 @@ // ======================> floppy_image -// class representing floppy image +//! Class representing floppy image + +//! Internal format is close but not identical to the mfi format. +//! +//! +//! Track data consists of a series of 32-bits lsb-first values +//! representing magnetic cells. Bits 0-27 indicate the absolute +//! position of the start of the cell (not the size), and bits +//! 28-31 the type. Type can be: +//! - 0, MG_A -> Magnetic orientation A +//! - 1, MG_B -> Magnetic orientation B +//! - 2, MG_N -> Non-magnetized zone (neutral) +//! - 3, MG_D -> Damaged zone, reads as neutral but cannot be changed by writing +//! +//! The position is in angular units of 1/200,000,000th of a turn. +//! The last cell implicit end position is of course 200,000,000. +//! +//! Unformatted tracks are encoded as zero-size. +//! +//! The "track splice" information indicates where to start writing +//! if you try to rewrite a physical disk with the data. Some +//! preservation formats encode that information, it is guessed for +//! others. The write track function of fdcs should set it. The +//! representation is the angular position relative to the index. +//! +//! The media type is divided in two parts. The first half +//! indicates the physical form factor, i.e. all medias with that +//! form factor can be physically inserted in a reader that handles +//! it. The second half indicates the variants which are usually +//! detectable by the reader, such as density and number of sides. + + class floppy_image { public: - // Internal format is close but not identical to the mfi format. - // - // - // Track data consists of a series of 32-bits lsb-first values - // representing magnetic cells. Bits 0-27 indicate the absolute - // position of the start of the cell (not the size), and bits - // 28-31 the type. Type can be: - // - 0, MG_A -> Magnetic orientation A - // - 1, MG_B -> Magnetic orientation B - // - 2, MG_N -> Non-magnetized zone (neutral) - // - 3, MG_D -> Damaged zone, reads as neutral but cannot be changed by writing - // - // The position is in angular units of 1/200,000,000th of a turn. - // The last cell implicit end position is of course 200,000,000. - // - // Unformatted tracks are encoded as zero-size. - + //! Floppy format data enum { TIME_MASK = 0x0fffffff, MG_MASK = 0xf0000000, - MG_SHIFT = 28, + MG_SHIFT = 28, //!< Bitshift constant for magnetic orientation data + MG_A = (0 << MG_SHIFT), //!< - 0, MG_A -> Magnetic orientation A + MG_B = (1 << MG_SHIFT), //!< - 1, MG_B -> Magnetic orientation B + MG_N = (2 << MG_SHIFT), //!< - 2, MG_N -> Non-magnetized zone (neutral) + MG_D = (3 << MG_SHIFT) //!< - 3, MG_D -> Damaged zone, reads as neutral but cannot be changed by writing + }; + - MG_A = (0 << MG_SHIFT), - MG_B = (1 << MG_SHIFT), - MG_N = (2 << MG_SHIFT), - MG_D = (3 << MG_SHIFT) + //! Form factors + enum { + FF_UNKNOWN = 0x00000000, //!< Unknown, useful when converting + FF_35 = 0x20203533, //!< "35 " 3.5 inch disk + FF_525 = 0x20353235, //!< "525 " 5.25 inch disk }; - // construction/destruction - floppy_image(int tracks, int heads); - virtual ~floppy_image(); + //! Variants + enum { + SSSD = 0x44535353, //!< "SSSD", Single-sided single-density + SSDD = 0x44445353, //!< "DSSD", Double-sided single-density + DSDD = 0x44445344, //!< "DSDD", Double-sided double-density (720K) + DSHD = 0x44485344, //!< "DSHD", Double-sided high-density (1440K) + DSED = 0x44455344, //!< "DSED", Double-sided extra-density (2880K) + }; + +// construction/destruction + - void set_track_size(int track, int head, UINT32 size) { track_size[(track << 1) + head] = size; ensure_alloc(track, head); } - UINT32 *get_buffer(int track, int head) { return cell_data[(track << 1) + head]; } - UINT32 get_track_size(int track, int head) { return track_size[(track << 1) + head]; } + //! floppy_image constructor + /*! + @param _tracks number of tracks. + @param _heads number of heads. + @param _form_factor form factor of drive (from enum) + */ + floppy_image(int tracks, int heads, UINT32 form_factor); + virtual ~floppy_image(); + //! @return the form factor. + UINT32 get_form_factor() { return form_factor; } + //! @return the variant. + UINT32 get_variant() { return variant; } + //! @param v the variant. + void set_variant(UINT32 v) { variant = v; } + + /*! + @param track + @param head + @param size size of this track + */ + void set_track_size(int track, int head, UINT32 size) { track_size[track][head] = size; ensure_alloc(track, head); } + + /*! + @param track track number + @param head head number + @return a pointer to the data buffer for this track and head + */ + UINT32 *get_buffer(int track, int head) { return cell_data[track][head]; } + //! @return the track size + //! @param track + //! @param head + UINT32 get_track_size(int track, int head) { return track_size[track][head]; } + + //! Sets the write splice position. + //! The "track splice" information indicates where to start writing + //! if you try to rewrite a physical disk with the data. Some + //! preservation formats encode that information, it is guessed for + //! others. The write track function of fdcs should set it. The + //! representation is the angular position relative to the index. + + /*! @param track + @param head + @param pos the position + */ + void set_write_splice_position(int track, int head, UINT32 pos) { write_splice[track][head] = pos; } + //! @return the current write splice position. + UINT32 get_write_splice_position(int track, int head) const { return write_splice[track][head]; } + //! @return the maximal geometry supported by thie format. void get_maximal_geometry(int &tracks, int &heads); + //! @return the current geometry of the loaded image. void get_actual_geometry(int &tracks, int &heads); + //! Returns the variant name for the particular disk form factor/variant + //! @param form_factor + //! @param variant + //! @param returns a string containing the variant name. + static const char *get_variant_name(UINT32 form_factor, UINT32 variant); private: + enum { MAX_FLOPPY_HEADS = 2, MAX_FLOPPY_TRACKS = 84 @@ -503,9 +691,12 @@ int tracks, heads; - UINT32 *cell_data[MAX_FLOPPY_HEADS * MAX_FLOPPY_TRACKS]; - UINT32 track_size[MAX_FLOPPY_HEADS * MAX_FLOPPY_TRACKS]; - UINT32 track_alloc_size[MAX_FLOPPY_HEADS * MAX_FLOPPY_TRACKS]; + UINT32 form_factor, variant; + + UINT32 *cell_data[MAX_FLOPPY_TRACKS][MAX_FLOPPY_HEADS]; + UINT32 track_size[MAX_FLOPPY_TRACKS][MAX_FLOPPY_HEADS]; + UINT32 track_alloc_size[MAX_FLOPPY_TRACKS][MAX_FLOPPY_HEADS]; + UINT32 write_splice[MAX_FLOPPY_TRACKS][MAX_FLOPPY_HEADS]; void ensure_alloc(int track, int head); }; diff -Nru mame-0.144/src/lib/formats/hect_dsk.c mame-0.145/src/lib/formats/hect_dsk.c --- mame-0.144/src/lib/formats/hect_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/hect_dsk.c 2012-02-06 21:30:29.000000000 +0000 @@ -89,6 +89,38 @@ return basicdsk_construct(floppy, &geometry); } +/* For the 720Ko disk 3 1/2 inch disk for the mini disc unit !!: + 512 bytes per sectors, + 9 sector per track, + From sector =1 to sector 9, + 80 tracks, + 2 Head + This format can be extract from a real disc with anadisk (*.IMG format rename in *.HE7). +*/ + +static FLOPPY_IDENTIFY(hector_minidisc_dsk_identify) +{ + *vote = (floppy_image_size(floppy) == (2*70*9*512)) ? 100 : 0; + return FLOPPY_ERROR_SUCCESS; +} + +static FLOPPY_CONSTRUCT(hector_minidisc_dsk_construct) +{ + struct basicdsk_geometry geometry; + memset(&geometry, 0, sizeof(geometry)); // 635904 octets + geometry.heads = 2;//2 + geometry.first_sector_id = 1; + geometry.sector_length = 512; + geometry.tracks = 70;//69 + geometry.sectors = 9; + return basicdsk_construct(floppy, &geometry); +} + +/* Specific for the mini disc unit */ +LEGACY_FLOPPY_OPTIONS_START( hector_minidisc ) + LEGACY_FLOPPY_OPTION( hector_dsk, "HMD", "hector mini disc floppy disk image 360Ko", hector_minidisc_dsk_identify, hector_minidisc_dsk_construct, NULL, NULL) +LEGACY_FLOPPY_OPTIONS_END + LEGACY_FLOPPY_OPTIONS_START( hector_disc2 ) LEGACY_FLOPPY_OPTION( hector_dsk, "HE2", "hector disc2 floppy disk image 200K", hector_disc2_dsk200_identify, hector_disc2_dsk200_construct, NULL, NULL) LEGACY_FLOPPY_OPTION( hector_dsk, "HE7", "hector disc2 floppy disk image 720K", hector_disc2_dsk720_identify, hector_disc2_dsk720_construct, NULL, NULL) diff -Nru mame-0.144/src/lib/formats/hect_dsk.h mame-0.145/src/lib/formats/hect_dsk.h --- mame-0.144/src/lib/formats/hect_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/hect_dsk.h 2012-02-06 21:30:29.000000000 +0000 @@ -15,5 +15,5 @@ /**************************************************************************/ LEGACY_FLOPPY_OPTIONS_EXTERN(hector_disc2); - +LEGACY_FLOPPY_OPTIONS_EXTERN(hector_minidisc); #endif /* HECT_DSK_H */ diff -Nru mame-0.144/src/lib/formats/hxcmfm_dsk.c mame-0.145/src/lib/formats/hxcmfm_dsk.c --- mame-0.144/src/lib/formats/hxcmfm_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/hxcmfm_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,3 +1,36 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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 "emu.h" #include "hxcmfm_dsk.h" @@ -54,7 +87,7 @@ return true; } -int mfm_format::identify(io_generic *io) +int mfm_format::identify(io_generic *io, UINT32 form_factor) { UINT8 header[7]; @@ -65,7 +98,7 @@ return 0; } -bool mfm_format::load(io_generic *io, floppy_image *image) +bool mfm_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { MFMIMG header; MFMTRACKIMG trackdesc; @@ -98,6 +131,7 @@ if(trackbuf) global_free(trackbuf); + image->set_variant(floppy_image::DSDD); return true; } diff -Nru mame-0.144/src/lib/formats/hxcmfm_dsk.h mame-0.145/src/lib/formats/hxcmfm_dsk.h --- mame-0.144/src/lib/formats/hxcmfm_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/hxcmfm_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -16,8 +16,8 @@ public: mfm_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; diff -Nru mame-0.144/src/lib/formats/ipf_dsk.c mame-0.145/src/lib/formats/ipf_dsk.c --- mame-0.144/src/lib/formats/ipf_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/ipf_dsk.c 2012-02-06 21:30:29.000000000 +0000 @@ -27,7 +27,7 @@ return false; } -int ipf_format::identify(io_generic *io) +int ipf_format::identify(io_generic *io, UINT32 form_factor) { static const UINT8 refh[12] = { 0x43, 0x41, 0x50, 0x53, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0xd5, 0x73, 0xba }; UINT8 h[12]; @@ -39,7 +39,7 @@ return 0; } -bool ipf_format::load(io_generic *io, floppy_image *image) +bool ipf_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { UINT32 size = io_generic_size(io); UINT8 *data = global_alloc_array(UINT8, size); @@ -80,6 +80,7 @@ bool ipf_format::parse(UINT8 *data, UINT32 size, floppy_image *image) { + image->set_variant(floppy_image::DSDD); // Not handling anything else yet tcount = 84*2+1; // Usual max tinfos = global_alloc_array_clear(track_info, tcount); bool res = scan_all_tags(data, size); @@ -273,15 +274,16 @@ } } -void ipf_format::mark_track_splice(UINT32 *t) +void ipf_format::mark_track_splice(UINT32 *track, UINT32 offset, UINT32 size) { for(int i=0; i<3; i++) { - UINT32 v = *t; + UINT32 pos = (offset + i) % size; + UINT32 v = track[pos]; if((v & floppy_image::MG_MASK) == MG_0) v = (v & floppy_image::TIME_MASK) | MG_1; else if((v & floppy_image::MG_MASK) == MG_1) v = (v & floppy_image::TIME_MASK) | MG_0; - *t++ = v; + track[pos] = v; } } @@ -386,30 +388,38 @@ return false; UINT32 *track = global_alloc_array(UINT32, t->size_cells); - - UINT32 *data_pos = new UINT32[t->block_count+1]; - UINT32 *gap_pos = new UINT32[t->block_count]; - UINT32 *splice_pos = new UINT32[t->block_count]; + UINT32 *data_pos = global_alloc_array(UINT32, t->block_count+1); + UINT32 *gap_pos = global_alloc_array(UINT32, t->block_count); + UINT32 *splice_pos = global_alloc_array(UINT32, t->block_count); bool context = false; UINT32 pos = 0; for(UINT32 i = 0; i != t->block_count; i++) { if(!generate_block(t, i, i == t->block_count-1 ? t->size_cells - t->index_cells : 0xffffffff, track, pos, data_pos[i], gap_pos[i], splice_pos[i], context)) { global_free(track); + global_free(data_pos); + global_free(gap_pos); + global_free(splice_pos); return false; } } if(pos != t->size_cells) { global_free(track); + global_free(data_pos); + global_free(gap_pos); + global_free(splice_pos); return false; } data_pos[t->block_count] = pos; - mark_track_splice(track + splice_pos[t->block_count-1]); + mark_track_splice(track, splice_pos[t->block_count-1], t->size_cells); if(!generate_timings(t, track, data_pos, gap_pos)) { global_free(track); + global_free(data_pos); + global_free(gap_pos); + global_free(splice_pos); return false; } @@ -417,7 +427,11 @@ rotate(track, t->size_cells - t->index_cells, t->size_cells); generate_track_from_levels(t->cylinder, t->head, track, t->size_cells, splice_pos[t->block_count-1] + t->index_cells, image); + global_free(track); + global_free(data_pos); + global_free(gap_pos); + global_free(splice_pos); return true; } @@ -600,15 +614,21 @@ } -bool ipf_format::generate_block_gap_1(UINT32 gap_cells, UINT32 &spos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context) +bool ipf_format::generate_block_gap_1(UINT32 gap_cells, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context) { - spos = 0; + if(ipos >= 16 && ipos < gap_cells-16) + spos = ipos; + else + spos = 0; return generate_gap_from_description(data, dlimit, track, gap_cells, true, context); } -bool ipf_format::generate_block_gap_2(UINT32 gap_cells, UINT32 &spos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context) +bool ipf_format::generate_block_gap_2(UINT32 gap_cells, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context) { - spos = gap_cells; + if(ipos >= 16 && ipos < gap_cells-16) + spos = ipos; + else + spos = gap_cells; return generate_gap_from_description(data, dlimit, track, gap_cells, false, context); } @@ -645,9 +665,9 @@ case 0: return generate_block_gap_0(gap_cells, pattern, spos, ipos, track, context); case 1: - return generate_block_gap_1(gap_cells, spos, data, dlimit, track, context); + return generate_block_gap_1(gap_cells, spos, ipos, data, dlimit, track, context); case 2: - return generate_block_gap_2(gap_cells, spos, data, dlimit, track, context); + return generate_block_gap_2(gap_cells, spos, ipos, data, dlimit, track, context); case 3: return generate_block_gap_3(gap_cells, spos, ipos, data, dlimit, track, context); default: diff -Nru mame-0.144/src/lib/formats/ipf_dsk.h mame-0.145/src/lib/formats/ipf_dsk.h --- mame-0.144/src/lib/formats/ipf_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/ipf_dsk.h 2012-02-06 21:30:29.000000000 +0000 @@ -8,8 +8,8 @@ public: ipf_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual const char *name() const; virtual const char *description() const; @@ -63,8 +63,8 @@ bool gap_description_to_reserved_size(const UINT8 *&data, const UINT8 *dlimit, UINT32 &res_size); bool generate_gap_from_description(const UINT8 *&data, const UINT8 *dlimit, UINT32 *track, UINT32 size, bool pre, bool &context); bool generate_block_gap_0(UINT32 gap_cells, UINT8 pattern, UINT32 &spos, UINT32 ipos, UINT32 *track, bool &context); - bool generate_block_gap_1(UINT32 gap_cells, UINT32 &spos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); - bool generate_block_gap_2(UINT32 gap_cells, UINT32 &spos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); + bool generate_block_gap_1(UINT32 gap_cells, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); + bool generate_block_gap_2(UINT32 gap_cells, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); bool generate_block_gap_3(UINT32 gap_cells, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); bool generate_block_gap(UINT32 gap_type, UINT32 gap_cells, UINT8 pattern, UINT32 &spos, UINT32 ipos, const UINT8 *data, const UINT8 *dlimit, UINT32 *track, bool &context); @@ -75,7 +75,7 @@ bool generate_timings(track_info *t, UINT32 *track, const UINT32 *data_pos, const UINT32 *gap_pos); void rotate(UINT32 *track, UINT32 offset, UINT32 size); - void mark_track_splice(UINT32 *t); + void mark_track_splice(UINT32 *track, UINT32 offset, UINT32 size); bool generate_track(track_info *t, floppy_image *image); bool generate_tracks(floppy_image *image); diff -Nru mame-0.144/src/lib/formats/kc_cas.c mame-0.145/src/lib/formats/kc_cas.c --- mame-0.144/src/lib/formats/kc_cas.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/kc_cas.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,390 @@ +/******************************************************************** + + Support for KC85 cassette images + + Supported formats: + - kcc: raw cassette image without ID and checksum + - tap: cassette image from KC-Emulator with head and ID + - tp2: cassette image with ID and checksum (130 bytes block) + - kcm: same as tp2 but without head + - sss: BASIC data without head (miss the first 11 bytes) + +********************************************************************/ + +#include "kc_cas.h" + +#define SMPLO -32768 +#define SMPHI 32767 +#define SILENCE 0 + +#define KC_WAV_FREQUENCY 44100 + +// from documentation +#define FREQ_BIT_0 2400 +#define FREQ_BIT_1 1200 +#define FREQ_SEPARATOR 600 + +// file formats +enum +{ + KC_IMAGE_KCC, + KC_IMAGE_TP2, + KC_IMAGE_TAP, + KC_IMAGE_KCM +}; + +// image size +static int kc_image_size; + +/******************************************************************* + Generate one high-low cycle of sample data +********************************************************************/ +INLINE int kc_cas_cycle(INT16 *buffer, int sample_pos, int len) +{ + int num_samples = KC_WAV_FREQUENCY / (len * 2); + + if (buffer) + { + + for (int i=0; i>= 1; + } + + // byte separator + samples += kc_cas_cycle( buffer, sample_pos + samples, FREQ_SEPARATOR); + + return samples; +} + +static int kc_handle_cass(INT16 *buffer, const UINT8 *casdata, int type) +{ + int data_pos = (type == KC_IMAGE_KCC || type == KC_IMAGE_KCM) ? 0 : 16; + int sample_count = 0; + int block_id = 1; + + // 1 sec of silence at start + sample_count += kc_cas_silence(buffer, sample_count, KC_WAV_FREQUENCY); + + // 8000 cycles of BIT_1 for synchronization + for (int i=0; i<8000; i++) + sample_count += kc_cas_cycle( buffer, sample_count, FREQ_BIT_1); + + // on the entire file + while( data_pos < kc_image_size ) + { + UINT8 checksum = 0; + + // 200 cycles of BIT_1 every block + for (int i=0; i<200; i++) + sample_count += kc_cas_cycle( buffer, sample_count, FREQ_BIT_1); + + // separator + sample_count += kc_cas_cycle( buffer, sample_count, FREQ_SEPARATOR); + + // in TAP and TP2 file the first byte is the ID + if (type == KC_IMAGE_TAP || type == KC_IMAGE_TP2 || type == KC_IMAGE_KCM) + block_id = casdata[data_pos++]; + + // is the last block ? + if (data_pos + 128 >= kc_image_size && type == KC_IMAGE_KCC) + block_id = 0xff; + + // write the block ID + sample_count += kc_cas_byte( buffer, sample_count, block_id ); + + // write the 128 bytes of the block + for (int i=0; i<128; i++) + { + UINT8 data = 0; + + if (data_pos < kc_image_size) + data = casdata[data_pos++]; + + // calculate the checksum + checksum += data; + + // write a byte + sample_count += kc_cas_byte( buffer, sample_count, data ); + } + + // TP2 and KCM files also have the checksum byte + if (type == KC_IMAGE_TP2 || type == KC_IMAGE_KCM) + checksum = casdata[data_pos++]; + + // 8bit checksum + sample_count += kc_cas_byte( buffer, sample_count, checksum ); + + // more TAP and TP2 can be combined into the same file + if ((type == KC_IMAGE_TAP || type == KC_IMAGE_TP2) && block_id == 0xff && data_pos < kc_image_size) + { + if (casdata[data_pos] == 0xc3 || casdata[data_pos] == 0x4b) + { + sample_count += kc_cas_silence(buffer, sample_count, KC_WAV_FREQUENCY/10); + + data_pos += 16; + } + } + + block_id++; + } + + sample_count += kc_cas_cycle( buffer, sample_count, FREQ_SEPARATOR); + + // 1 sec of silence + sample_count += kc_cas_silence(buffer, sample_count, KC_WAV_FREQUENCY); + + return sample_count; +} + + +static int kc_handle_kcc(INT16 *buffer, const UINT8 *casdata) +{ + return kc_handle_cass(buffer, casdata, KC_IMAGE_KCC); +} + + +static int kc_handle_tap(INT16 *buffer, const UINT8 *casdata) +{ + if (!strncmp((const char *)(casdata + 1), "KC-TAPE by AF", 13)) + { + return kc_handle_cass(buffer, casdata, KC_IMAGE_TAP); + } + else if (!strncmp((const char *)(casdata), "KC85", 4)) + { + return kc_handle_cass(buffer, casdata, KC_IMAGE_TP2); + } + else if (casdata[0] == 0x01) + { + return kc_handle_cass(buffer, casdata, KC_IMAGE_KCM); + } + else + { + return CASSETTE_ERROR_INVALIDIMAGE; + } +} + +static int kc_handle_sss(INT16 *buffer, const UINT8 *casdata) +{ + UINT8 *sss = (UINT8*)malloc(kc_image_size + 11); + + // tries to generate the missing head + memset(sss + 0, 0xd3, 3); + memset(sss + 3, 0x20, 8); + memcpy(sss + 11, casdata, kc_image_size); + + // set an arbitrary filename + sss[3] = 'A'; + + int retval = kc_handle_cass(buffer, sss, KC_IMAGE_KCC); + + free(sss); + + return retval; +} + + + +/******************************************************************* + Generate samples for the tape image +********************************************************************/ +static int kc_kcc_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes) +{ + return kc_handle_kcc(buffer, bytes); +} + + +/******************************************************************* + Calculate the number of samples needed for this tape image classical +********************************************************************/ +static int kc_kcc_to_wav_size(const UINT8 *casdata, int caslen) +{ + kc_image_size = caslen ; + + return kc_handle_kcc( NULL, casdata ); +} + + +static const struct CassetteLegacyWaveFiller kc_kcc_legacy_fill_wave = +{ + kc_kcc_fill_wave, /* fill_wave */ + -1, /* chunk_size */ + 0, /* chunk_samples */ + kc_kcc_to_wav_size, /* chunk_sample_calc */ + KC_WAV_FREQUENCY, /* sample_frequency */ + 0, /* header_samples */ + 0 /* trailer_samples */ +}; + +static casserr_t kc_kcc_identify(cassette_image *cassette, struct CassetteOptions *opts) +{ + return cassette_legacy_identify(cassette, opts, &kc_kcc_legacy_fill_wave); +} + + +static casserr_t kc_kcc_load(cassette_image *cassette) +{ + return cassette_legacy_construct(cassette, &kc_kcc_legacy_fill_wave); +} + + +static const struct CassetteFormat kc_kcc_format = +{ + "kcc,kcb", + kc_kcc_identify, + kc_kcc_load, + NULL +}; + + +/******************************************************************* + Generate samples for the tape image +********************************************************************/ +static int kc_tap_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes) +{ + return kc_handle_tap(buffer, bytes); +} + + +/******************************************************************* + Calculate the number of samples needed for this tape image classical +********************************************************************/ +static int kc_tap_to_wav_size(const UINT8 *casdata, int caslen) +{ + kc_image_size = caslen ; + + return kc_handle_tap( NULL, casdata ); +} + + +static const struct CassetteLegacyWaveFiller kc_tap_legacy_fill_wave = +{ + kc_tap_fill_wave, /* fill_wave */ + -1, /* chunk_size */ + 0, /* chunk_samples */ + kc_tap_to_wav_size, /* chunk_sample_calc */ + KC_WAV_FREQUENCY, /* sample_frequency */ + 0, /* header_samples */ + 0 /* trailer_samples */ +}; + +static casserr_t kc_tap_identify(cassette_image *cassette, struct CassetteOptions *opts) +{ + return cassette_legacy_identify(cassette, opts, &kc_tap_legacy_fill_wave); +} + + +static casserr_t kc_tap_load(cassette_image *cassette) +{ + return cassette_legacy_construct(cassette, &kc_tap_legacy_fill_wave); +} + + +static const struct CassetteFormat kc_tap_format = +{ + "tap,853,854,855,tp2,kcm", + kc_tap_identify, + kc_tap_load, + NULL +}; + + +/******************************************************************* + Generate samples for the tape image +********************************************************************/ +static int kc_sss_fill_wave(INT16 *buffer, int sample_count, UINT8 *bytes) +{ + return kc_handle_sss(buffer, bytes); +} + + +/******************************************************************* + Calculate the number of samples needed for this tape image classical +********************************************************************/ +static int kc_sss_to_wav_size(const UINT8 *casdata, int caslen) +{ + kc_image_size = caslen ; + + return kc_handle_sss( NULL, casdata ); +} + + +static const struct CassetteLegacyWaveFiller kc_sss_legacy_fill_wave = +{ + kc_sss_fill_wave, /* fill_wave */ + -1, /* chunk_size */ + 0, /* chunk_samples */ + kc_sss_to_wav_size, /* chunk_sample_calc */ + KC_WAV_FREQUENCY, /* sample_frequency */ + 0, /* header_samples */ + 0 /* trailer_samples */ +}; + +static casserr_t kc_sss_identify(cassette_image *cassette, struct CassetteOptions *opts) +{ + return cassette_legacy_identify(cassette, opts, &kc_sss_legacy_fill_wave); +} + + +static casserr_t kc_sss_load(cassette_image *cassette) +{ + return cassette_legacy_construct(cassette, &kc_sss_legacy_fill_wave); +} + +static const struct CassetteFormat kc_sss_format = +{ + "sss", + kc_sss_identify, + kc_sss_load, + NULL +}; + + +CASSETTE_FORMATLIST_START(kc_cassette_formats) + CASSETTE_FORMAT(kc_kcc_format) + CASSETTE_FORMAT(kc_tap_format) + CASSETTE_FORMAT(kc_sss_format) +CASSETTE_FORMATLIST_END diff -Nru mame-0.144/src/lib/formats/kc_cas.h mame-0.145/src/lib/formats/kc_cas.h --- mame-0.144/src/lib/formats/kc_cas.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/kc_cas.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,15 @@ +/********************************************************************* + + kc_cas.h + +*********************************************************************/ + +#ifndef KC_CAS_H +#define KC_CAS_H + +#include "cassimg.h" + +CASSETTE_FORMATLIST_EXTERN(kc_cassette_formats); + +#endif /* KC_CAS_H */ + diff -Nru mame-0.144/src/lib/formats/mfi_dsk.c mame-0.145/src/lib/formats/mfi_dsk.c --- mame-0.144/src/lib/formats/mfi_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/mfi_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,3 +1,36 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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 "emu.h" #include "mfi_dsk.h" #include @@ -48,7 +81,19 @@ An unformatted track is equivalent to one big MG_N cell covering a whole turn, but is encoded as zero-size. - TODO: big-endian support, cleanup pll, move it where it belongs. + The "track splice" information indicates where to start writing + if you try to rewrite a physical disk with the data. Some + preservation formats encode that information, it is guessed for + others. The write track function of fdcs should set it. The + representation is the angular position relative to the index. + + The media type is divided in two parts. The first half + indicate the physical form factor, i.e. all medias with that + form factor can be physically inserted in a reader that handles + it. The second half indicates the variants which are usually + detectable by the reader, such as density and number of sides. + + TODO: big-endian support */ const char mfi_format::sign[16] = "MESSFLOPPYIMAGE"; // Includes the final \0 @@ -77,25 +122,28 @@ return true; } -int mfi_format::identify(io_generic *io) +int mfi_format::identify(io_generic *io, UINT32 form_factor) { header h; io_generic_read(io, &h, 0, sizeof(header)); if(memcmp( h.sign, sign, 16 ) == 0 && - h.cyl_count > 0 && h.cyl_count <= 84 && - h.head_count > 0 && h.head_count <= 2) + h.cyl_count <= 160 && + h.head_count <= 2 && + (!form_factor || h.form_factor == form_factor)) return 100; return 0; } -bool mfi_format::load(io_generic *io, floppy_image *image) +bool mfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { header h; entry entries[84*2]; io_generic_read(io, &h, 0, sizeof(header)); io_generic_read(io, &entries, sizeof(header), h.cyl_count*h.head_count*sizeof(entry)); + image->set_variant(h.variant); + UINT8 *compressed = 0; int compressed_size = 0; @@ -161,6 +209,8 @@ memcpy(h.sign, sign, 16); h.cyl_count = tracks; h.head_count = heads; + h.form_factor = image->get_form_factor(); + h.variant = image->get_variant(); io_generic_write(io, &h, 0, sizeof(header)); @@ -194,6 +244,7 @@ entries[epos].offset = pos; entries[epos].uncompressed_size = tsize*4; entries[epos].compressed_size = csize; + entries[epos].write_splice = image->get_write_splice_position(track, head); epos++; io_generic_write(io, postcomp, pos, csize); diff -Nru mame-0.144/src/lib/formats/mfi_dsk.h mame-0.145/src/lib/formats/mfi_dsk.h --- mame-0.144/src/lib/formats/mfi_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/mfi_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -8,8 +8,8 @@ public: mfi_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; @@ -34,10 +34,11 @@ struct header { char sign[16]; unsigned int cyl_count, head_count; + unsigned int form_factor, variant; }; struct entry { - unsigned int offset, compressed_size, uncompressed_size; + unsigned int offset, compressed_size, uncompressed_size, write_splice; }; }; diff -Nru mame-0.144/src/lib/formats/pasti_dsk.c mame-0.145/src/lib/formats/pasti_dsk.c --- mame-0.144/src/lib/formats/pasti_dsk.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/pasti_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,616 @@ +#include "pasti_dsk.h" +#include "emu.h" + +// Pasti format supported using the documentation at +// http://www.sarnau.info/atari:pasti_file_format + +// That format is an observational format, not a generative one. In +// other terms, it encodes the raw responses of the WD1772 to the read +// track, read ids and read sectors commands. So, in order to use it, +// we have to build a physical representation which gives similar +// enough results (read track varies even in the absence of fuzzy +// bits). + +pasti_format::pasti_format() +{ +} + +const char *pasti_format::name() const +{ + return "pasti"; +} + +const char *pasti_format::description() const +{ + return "Atari PASTI floppy disk image"; +} + +const char *pasti_format::extensions() const +{ + return "stx"; +} + +bool pasti_format::supports_save() const +{ + return false; +} + +int pasti_format::identify(io_generic *io, UINT32 form_factor) +{ + UINT8 h[16]; + io_generic_read(io, h, 0, 16); + + if(!memcmp(h, "RSY\0\3\0", 6) && + (1 || (h[10] >= 80 && h[10] <= 82) || (h[10] >= 160 && h[10] <= 164))) + return 100; + + return 0; +} + +static void hexdump(const UINT8 *d, int s) +{ + for(int i=0; i= 160); + tracks /= heads; + + int pos = 16; + + wd_obs obs; + + for(int track=0; track < tracks; track++) { + for(int head=0; head < heads; head++) { + UINT8 th[16]; + io_generic_read(io, th, pos, 16); + int entry_len = th[0] | (th[1] << 8) | (th[2] << 16) | (th[3] << 24); + int fuzz_len = th[4] | (th[5] << 8) | (th[6] << 16) | (th[7] << 24); + int sect = th[8] | (th[9] << 8); + int flags = th[10] | (th[11] << 8); + int track_len = th[12] | (th[13] << 8); + int track_num = th[14]; + int flags2 = th[15]; + + if(entry_len-16 > raw_track_size) { + if(raw_track) + global_free(raw_track); + raw_track_size = entry_len-16; + raw_track = global_alloc_array(UINT8, entry_len-16); + } + + io_generic_read(io, raw_track, pos+16, entry_len-16); + + UINT8 *fuzz = fuzz_len ? raw_track+16*sect : 0; + UINT8 *bdata = fuzz ? fuzz+fuzz_len : raw_track+16*sect; + UINT8 *tdata = bdata; + + int syncpos = -1; + if(flags & 0x0080) { + syncpos = tdata[0] | (tdata[1] << 8); + tdata += 2; + } + + int tsize = 0; + if(flags & 0x0040) { + tsize = tdata[0] | (tdata[1] << 8); + tdata += 2; + } else + tdata = 0; + + if(0) { + printf("Track %2d.%d: el=%d fl=%d sect=%d flags=%04x tlen=%d/%d tnum=%d flags2=%02x sync=%x\n", + track, head, + entry_len, fuzz_len, sect, flags, track_len, tsize, track_num, flags2, syncpos); + hexdump(raw_track+16*sect, entry_len-16-16*sect); + } + + if(0 && tdata) { + hexdump(tdata, tsize); + + for(int i=0; iset_variant(floppy_image::DSDD); + return true; +} + +const floppy_format_type FLOPPY_PASTI_FORMAT = &floppy_image_format_creator; + + +void pasti_format::wd_generate_track_from_observations(int track, int head, floppy_image *image, wd_obs &obs) +{ + if(!obs.track_data) + wd_generate_track_from_sectors_only(track, head, image, obs); + else + wd_generate_track_from_sectors_and_track(track, head, image, obs); +} + +void pasti_format::wd_generate_unsynced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size) +{ + for(int i=tstart; i != tend;) { + unsigned char v = obs.track_data[i]; + int j; + for(j=i+1; j != tend && obs.track_data[j] == v; j++); + int size = j-i; + if(size < 4) { + mfm_w(track, pos, 8, v, cell_size); + i++; + continue; + } + if(v == 0xff || v == 0x00) + v = 0; + else if(v == 0x4e || v == 0x21 || v == 0x9c || v == 0x42 || v == 0x39 || v == 0x84 || v == 0x72 || v == 0x09 || + v == 0xe4 || v == 0x12 || v == 0xc9 || v == 0x24 || v == 0x93 || v == 0x48 || v == 0x27 || v == 0x90) + v = 0x4e; + // Grab the transition byte too + if((v == 0 || v == 0x4e) && j != tend) + size++; + for(j=0; j != size; j++) + mfm_w(track, pos, 8, v, cell_size); + i += size; + } +} + +void pasti_format::wd_generate_synced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size) +{ + for(int i = tstart; i != tend; i++) { + unsigned char v = obs.track_data[i]; + if((v == 0x14 || v == 0xa1 || v == 0xc2) && i+2 < tend && obs.track_data[i+1] == 0xa1 && obs.track_data[i+2] == 0xa1) { + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + i += 2; + } else if(pos && i != tend-1 && (((v == 0x14 || v == 0xc2) && (track[pos-1] & 0x1f) == 10) || (v == 0xa1 && (track[pos-1] & 0x1f) != 10))) + raw_w(track, pos, 16, 0x4489, cell_size); + else if(i != tend-1 && (v == 0x14 || v == 0xc2)) + raw_w(track, pos, 16, 0x5224, cell_size); + else + mfm_w(track, pos, 8, v, cell_size); + } +} + +void pasti_format::wd_generate_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, bool synced, UINT32 cell_size_start, UINT32 cell_size_end) +{ + int spos = pos; + if(!synced) { + int sync = -1; + for(int i = tstart; sync == -1 && i != tend; i++) + if(obs.track_data[i] == 0x14 || obs.track_data[i] == 0xa1 || obs.track_data[i] == 0xc2) + sync = i; + if(sync == -1) + sync = tend; + wd_generate_unsynced_gap(track, pos, obs, tstart, sync, cell_size_start); + tstart = sync; + } + if(tstart != tend) + wd_generate_synced_gap(track, pos, obs, tstart, tend, cell_size_start); + + if(cell_size_end != cell_size_start) { + INT32 total_size = 0; + for(int i=spos; i != pos; i++) + total_size += track[i] & floppy_image::TIME_MASK; + INT64 cur_size = 0; + for(int i=spos; i != pos; i++) { + cur_size += track[i] & floppy_image::TIME_MASK; + track[i] = (track[i] & floppy_image::MG_MASK) | + (cur_size*int(cell_size_end-cell_size_start)/total_size + cell_size_start); + } + } +} + +void pasti_format::wd_generate_sector_header(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size) +{ + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + mfm_w(track, pos, 8, obs.track_data[tstart+3], cell_size); + for(int i=0; i != 6; i++) + mfm_w(track, pos, 8, obs.sectors[sector].id[i], cell_size); +} + +void pasti_format::wd_generate_sector_data(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size) +{ + const wd_sect &s = obs.sectors[sector]; + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + raw_w(track, pos, 16, 0x4489, cell_size); + mfm_w(track, pos, 8, obs.track_data[tstart+3], cell_size); + for(int i=0; i<128 << (s.id[3] & 3); i++) + mfm_w(track, pos, 8, s.data[i], cell_size); + UINT16 crc = calc_crc_ccitt(track, pos - (2048 << (s.id[3] & 3)) - 16*4, pos); + mfm_w(track, pos, 8, crc >> 8, cell_size); + mfm_w(track, pos, 8, crc, cell_size); +} + +void pasti_format::wd_generate_track_from_sectors_and_track(int track, int head, floppy_image *image, wd_obs &obs) +{ + if(0) + printf("Track %d head %d sectors %d\n", track, head, obs.sector_count); + UINT32 *trackbuf = global_alloc_array(UINT32, 200000); + int pos = 0; + + wd_sect_info sect_infos[256]; + + if(0) + hexdump(obs.track_data, obs.track_size); + map_sectors_in_track(obs, sect_infos); + + if(0) + for(int i=0; i != obs.sector_count; i++) { + wd_sect_info *s = sect_infos + i; + printf("%2d: %5d-%5d %c %02x %02x|%02x %02x %5d-%5d %c %02x %02x|%02x %02x %f\n", + i, + s->hstart, s->hend, s->hsynced ? 'S' : '-', + s->hstart == -1 ? 0 : obs.track_data[s->hstart], + s->hstart == -1 ? 0 : obs.track_data[s->hstart+1], + s->hend == -1 ? 0 : obs.track_data[s->hend], + s->hend == -1 ? 0 : obs.track_data[s->hend+1], + + s->dstart, s->dend, s->dsynced ? 'S' : '-', + s->dstart == -1 ? 0 : obs.track_data[s->dstart], + s->dstart == -1 ? 0 : obs.track_data[s->dstart+1], + s->dend == -1 ? 0 : obs.track_data[s->dend], + s->dend == -1 ? 0 : obs.track_data[s->dend+1], + + obs.sectors[i].time_ratio); + } + + if(obs.sector_count) { + wd_sect_info *last = sect_infos + obs.sector_count-1; + if(last->dend != -1 && last->dend < last->hstart) { + logerror("pasti: Unsupported sector header/data over index, track %d head %d\n", track, head); + return; + } + + UINT32 cell_size = UINT32(obs.sectors[0].time_ratio * 1000+0.5); + wd_generate_gap(trackbuf, pos, obs, 0, sect_infos[0].hstart, false, cell_size, cell_size); + + for(int i=0; i != obs.sector_count; i++) { + wd_sect_info *s = sect_infos + i; + if(i+1 != obs.sector_count) { + if(s->dstart != -1 && s[1].hstart < s->dend) { + logerror("pasti: Unsupported sector overlap, track %d head %d\n", track, head); + return; + } + } + + UINT32 ncell_size = UINT32(obs.sectors[i+1 != obs.sector_count ? i+1 : 0].time_ratio * 1000+0.5); + + wd_generate_sector_header(trackbuf, pos, obs, i, s->hstart, cell_size); + + if(s->dstart == -1) { + if(i == obs.sector_count-1) + wd_generate_gap(trackbuf, pos, obs, s->hend, obs.track_size, s->hsynced, cell_size, ncell_size); + else + wd_generate_gap(trackbuf, pos, obs, s->hend, s[1].hstart, s->hsynced, cell_size, ncell_size); + } else { + wd_generate_gap(trackbuf, pos, obs, s->hend, s->dstart, s->hsynced, cell_size, cell_size); + wd_generate_sector_data(trackbuf, pos, obs, i, s->dstart, cell_size); + if(i == obs.sector_count-1) + wd_generate_gap(trackbuf, pos, obs, s->dend, obs.track_size, s->dsynced, cell_size, ncell_size); + else + wd_generate_gap(trackbuf, pos, obs, s->dend, s[1].hstart, s->dsynced, cell_size, ncell_size); + } + cell_size = ncell_size; + } + + } else + wd_generate_gap(trackbuf, pos, obs, 0, obs.track_size, false, 1000, 1000); + + generate_track_from_levels(track, head, trackbuf, pos, 0, image); + + global_free(trackbuf); +} + +void pasti_format::wd_generate_track_from_sectors_only(int track, int head, floppy_image *image, wd_obs &obs) +{ + if(0) { + printf("Track %d head %d sectors %d\n", track, head, obs.sector_count); + for(int i=0; i != obs.sector_count; i++) { + const wd_sect &s = obs.sectors[i]; + + printf("%2d: %02x.%02x.%02x.%02x.%02x.%02x %d %f\n", + i, + s.id[0], s.id[1], s.id[2], s.id[3], s.id[4], s.id[5], + s.position, + s.time_ratio); + if(track==10 && i==0) + hexdump(s.data, 512); + } + } + + UINT32 *tdata = global_alloc_array(UINT32, 200000); + int pos = 0; + for(int i=0; i != obs.sector_count; i++) { + const wd_sect &s = obs.sectors[i]; + if(i+1 != obs.sector_count && obs.sectors[i+1].position < s.position+10+44+4+(128 << (s.id[3] & 3))) { + logerror("pasti: Unsupported sector data sharing, track %d head %d\n", track, head); + return; + } + if(pos >> 4 < s.position - 12) { + int count = s.position - 12 - (pos >> 4); + if(count & 1) { + mfm_w(tdata, pos, 8, 0x4e); + count--; + } + for(int j=0; j> 4); + if(count & 1) { + mfm_w(tdata, pos, 8, 0x00); + count--; + } + for(int j=0; j> 8); + mfm_w(tdata, pos, 8, crc); + } + + int count = (100015 - pos) >> 16; + for(int i=0; i> 4) | (context ? 16 : 0)] << 8) | expand[data & 0x1f]; +} + +void pasti_format::match_mfm_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &tend, bool &synced) +{ + UINT16 shift = byte_to_mfm(context, true); + int bc = 0; + int bc_phase = 0; + int bi = 0; + UINT8 dbyte = 0; + bool ds_phase = false; + UINT16 inshift = byte_to_mfm(data[bi++], shift & 1); + synced = false; + for(;;) { + int bit = (inshift >> (15-bc)) & 1; + shift = (shift << 1) | bit; + if(ds_phase) + dbyte = (dbyte << 1) | bit; + // printf(" %04x %02x (%04x %02x)\n", shift, dbyte, inshift, data[bi-1]); + ds_phase = !ds_phase; + bc++; + if(shift == 0x4489 || shift == 0x5224) { + bc_phase = 16-bc; + ds_phase = false; + } + if(!((bc_phase + bc) & 15)) { + // printf("dbyte=%02x data=%02x in=%02x bc=%d bc_shift=%d ds_phase=%s\n", dbyte, obs.track_data[tpos], data[bi-1], bc, bc_phase, ds_phase ? "on" : "off"); + if(dbyte != obs.track_data[tpos++]) { + bcount = bi-1; + tend = tpos-1; + return; + } + if(tpos == obs.track_size) + tpos = 0; + if(bi == size) { + bcount = bi; + tend = tpos; + synced = bc_phase == 0; + return; + } + } + if(bc == 16) { + inshift = byte_to_mfm(data[bi++], shift & 1); + bc = 0; + } + } +} + +void pasti_format::match_raw_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &tend) +{ + tend = tpos; + for(bcount=0; bcount != size; bcount++) { + if(data[bcount] != obs.track_data[tend]) + return; + tend++; + if(tend == obs.track_size) + tend = 0; + } +} + +UINT16 pasti_format::calc_crc(const UINT8 *data, int size, UINT16 crc1) +{ + UINT32 crc = crc1; + for(int i=0; i best_bcount) { + best_bcount = bcount; + best_j = j; + } + if(bcount == 6) + break; + match_raw_data(obs, hpos, obs.sectors[j].id, 6, hbyte, bcount, tend); + if(bcount > best_bcount) { + best_bcount = bcount; + best_j = j; + } + if(bcount == 6) { + synced = true; + break; + } + } + + j = best_j; + if(best_bcount < 4) { + if(0) + printf("sector header at %x no match [%02x %02x %02x %02x %02x %02x]\n", i, + tdata[hpos], tdata[hpos+1], tdata[hpos+2], tdata[hpos+3], tdata[hpos+4], tdata[hpos+5]); + } else { + if(0) + printf("sector header at %x matches %d [%02x %02x %02x %02x %02x %02x] [%02x] - %d %s\n", i, j, + tdata[hpos], tdata[hpos+1], tdata[hpos+2], tdata[hpos+3], tdata[hpos+4], tdata[hpos+5], tdata[tend], + obs.sectors[j].position, synced ? "synced" : "unsynced"); + + sect_infos[j].hstart = hpos - 4; + sect_infos[j].hend = tend + (6-bcount); + sect_infos[j].hsynced = synced; + + int dpos = -1; + if(obs.sectors[j].data) + for(int j=35; j<45; j++) { + if(tdata[(hpos+j) % tsize] == 0xa1 && + tdata[(hpos+j+1) % tsize] == 0xa1 && + tdata[(hpos+j+2) % tsize] >= 0xfa && + tdata[(hpos+j+2) % tsize] <= 0xfd) { + dpos = (hpos+j+3) % tsize; + break; + } + } + if(dpos != -1) { + int bcount2, tend2; + UINT8 dhbyte = tdata[(dpos+tsize-1) % tsize]; + int ssize = 128 << (obs.sectors[j].id[3] & 3); + match_mfm_data(obs, dpos, obs.sectors[j].data, ssize, dhbyte, bcount, tend, synced); + if(bcount < ssize) { + match_raw_data(obs, dpos, obs.sectors[j].data, ssize, dhbyte, bcount2, tend2); + if(bcount2 > bcount) { + bcount = bcount2; + tend = tend2; + if(bcount == ssize) + synced = true; + } + } + UINT16 crc = calc_crc(obs.sectors[j].data, ssize, calc_crc(tdata+((dpos+tsize-1) % tsize), 1, 0xcdb4)); + if(synced && tdata[tend] == (crc >> 8) && tdata[(tend+1) % tsize] == (crc & 0xff)) { + tend = (tend+2) % tsize; + bcount += 2; + } + + if(0) + printf(" associated data at %d, match %d [%02x %02x %02x] %04x, %s\n", dpos, bcount, tdata[tend], tdata[tend+1], tdata[tend+2], crc, synced ? "synced" : "unsynced"); + + sect_infos[j].dstart = dpos - 4; + sect_infos[j].dend = tend + (ssize+2-bcount); + sect_infos[j].dsynced = synced; + + } + } + } + +} diff -Nru mame-0.144/src/lib/formats/pasti_dsk.h mame-0.145/src/lib/formats/pasti_dsk.h --- mame-0.144/src/lib/formats/pasti_dsk.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/formats/pasti_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,62 @@ +#ifndef PASTI_DSK_H_ +#define PASTI_DSK_H_ + +#include "flopimg.h" + +class pasti_format : public floppy_image_format_t +{ +public: + pasti_format(); + + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + virtual bool supports_save() const; + + static const desc_e xdesc[]; + +protected: + struct wd_sect { + const UINT8 *data; + const UINT8 *fuzzy_mask; + UINT8 id[6]; + int position; + double time_ratio; + }; + + struct wd_obs { + const UINT8 *track_data; + wd_sect sectors[256]; + int track_size, sector_count; + }; + + void wd_generate_track_from_observations(int track, int head, floppy_image *image, wd_obs &obs); + +private: + struct wd_sect_info { + int hstart, hend; + int dstart, dend; + bool hsynced, dsynced; + }; + + void map_sectors_in_track(wd_obs &obs, wd_sect_info *sect_infos); + void match_mfm_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &ccount, bool &synced); + void match_raw_data(wd_obs &obs, int tpos, const UINT8 *data, int size, UINT8 context, int &bcount, int &ccount); + UINT16 byte_to_mfm(UINT8 data, bool context); + UINT16 calc_crc(const UINT8 *data, int size, UINT16 crc); + + void wd_generate_unsynced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size); + void wd_generate_synced_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, UINT32 cell_size); + void wd_generate_gap(UINT32 *track, int &pos, const wd_obs &obs, int tstart, int tend, bool synced, UINT32 cell_size_start, UINT32 cell_size_end); + void wd_generate_sector_header(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size); + void wd_generate_sector_data(UINT32 *track, int &pos, const wd_obs &obs, int sector, int tstart, UINT32 cell_size); + void wd_generate_track_from_sectors_and_track(int track, int head, floppy_image *image, wd_obs &obs); + void wd_generate_track_from_sectors_only(int track, int head, floppy_image *image, wd_obs &obs); +}; + +extern const floppy_format_type FLOPPY_PASTI_FORMAT; + +#endif /*PASTI_DSK_H_*/ diff -Nru mame-0.144/src/lib/formats/pc_dsk.c mame-0.145/src/lib/formats/pc_dsk.c --- mame-0.144/src/lib/formats/pc_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/pc_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -31,6 +31,7 @@ { 9*2*80*512, 9, 2}, /* 3 1/2 inch double density */ {15*2*80*512, 15, 2}, /* 5 1/4 inch high density (or japanese 3 1/2 inch high density) */ {18*2*80*512, 18, 2}, /* 3 1/2 inch high density */ + {21*2*80*512, 21, 2}, /* 3 1/2 inch high density DMF */ {36*2*80*512, 36, 2} /* 3 1/2 inch enhanced density */ }; @@ -135,3 +136,142 @@ TRACKS(40/[80]) SECTORS(8/[9]/10/15/18/36)) LEGACY_FLOPPY_OPTIONS_END + + +const floppy_image_format_t::desc_e pc_format::pc_desc[] = { + { MFM, 0x4e, 80 }, + { MFM, 0x00, 12 }, + { RAW, 0x5224, 3 }, + { MFM, 0xfc, 1 }, + { MFM, 0x4e, 50 }, + { MFM, 0x00, 12 }, + { SECTOR_LOOP_START, 0, 17 }, + { CRC_CCITT_START, 1 }, + { RAW, 0x4489, 3 }, + { MFM, 0xfe, 1 }, + { TRACK_ID }, + { HEAD_ID }, + { SECTOR_ID }, + { SIZE_ID }, + { CRC_END, 1 }, + { CRC, 1 }, + { MFM, 0x4e, 22 }, + { MFM, 0x00, 12 }, + { CRC_CCITT_START, 2 }, + { RAW, 0x4489, 3 }, + { MFM, 0xfb, 1 }, + { SECTOR_DATA, -1 }, + { CRC_END, 2 }, + { CRC, 2 }, + { MFM, 0x4e, 84 }, + { MFM, 0x00, 12 }, + { SECTOR_LOOP_END }, + { MFM, 0x4e, 498 }, + { END } +}; + +pc_format::pc_format() +{ +} + +const char *pc_format::name() const +{ + return "pc"; +} + +const char *pc_format::description() const +{ + return "PC floppy disk image"; +} + +const char *pc_format::extensions() const +{ + return "dsk,ima,img,ufi,360"; +} + +bool pc_format::supports_save() const +{ + return true; +} + +void pc_format::find_size(io_generic *io, UINT32 form_factor, int &track_count, int &head_count, int §or_count) +{ + int size = io_generic_size(io); + if(size == 512*18*2*80) { + track_count = 80; + head_count = 2; + sector_count = 18; + } else + track_count = head_count = sector_count = 0; +} + +int pc_format::identify(io_generic *io, UINT32 form_factor) +{ + int track_count, head_count, sector_count; + find_size(io, form_factor, track_count, head_count, sector_count); + + if(track_count) + return 50; + return 0; +} + +bool pc_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) +{ + int track_count, head_count, sector_count; + find_size(io, form_factor, track_count, head_count, sector_count); + + UINT8 sectdata[36*512]; + desc_s sectors[36]; + for(int i=0; iset_variant(floppy_image::DSHD); + + return true; +} + +bool pc_format::save(io_generic *io, floppy_image *image) +{ + int track_count, head_count, sector_count; + get_geometry_mfm_pc(image, 1000, track_count, head_count, sector_count); + + if(track_count < 80) + track_count = 80; + else if(track_count > 82) + track_count = 82; + + // Happens for a fully unformatted floppy + if(!head_count) + head_count = 1; + + if(sector_count > 36) + sector_count = 36; + else if(sector_count < 9) + sector_count = 9; + + UINT8 sectdata[36*512]; + int track_size = sector_count*512; + + for(int track=0; track < track_count; track++) { + for(int head=0; head < head_count; head++) { + get_track_data_mfm_pc(track, head, image, 1000, 512, sector_count, sectdata); + io_generic_write(io, sectdata, (track*head_count + head)*track_size, track_size); + } + } + + return true; +} + +const floppy_format_type FLOPPY_PC_FORMAT = &floppy_image_format_creator; diff -Nru mame-0.144/src/lib/formats/pc_dsk.h mame-0.145/src/lib/formats/pc_dsk.h --- mame-0.144/src/lib/formats/pc_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/pc_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -16,4 +16,27 @@ LEGACY_FLOPPY_OPTIONS_EXTERN(pc); + +class pc_format : public floppy_image_format_t +{ +public: + pc_format(); + + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); + virtual bool save(io_generic *io, floppy_image *image); + + virtual const char *name() const; + virtual const char *description() const; + virtual const char *extensions() const; + virtual bool supports_save() const; + +private: + static const desc_e pc_desc[]; + + void find_size(io_generic *io, UINT32 form_factor, int &track_count, int &head_count, int §or_count); +}; + +extern const floppy_format_type FLOPPY_PC_FORMAT; + #endif /* PC_DSK_H */ diff -Nru mame-0.144/src/lib/formats/st_dsk.c mame-0.145/src/lib/formats/st_dsk.c --- mame-0.144/src/lib/formats/st_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/st_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,3 +1,36 @@ +/*************************************************************************** + + Copyright Olivier Galibert + 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. + +****************************************************************************/ + /********************************************************************* formats/st_dsk.c @@ -44,7 +77,7 @@ track_count = head_count = sector_count = 0; } -int st_format::identify(io_generic *io) +int st_format::identify(io_generic *io, UINT32 form_factor) { int track_count, head_count, sector_count; find_size(io, track_count, head_count, sector_count); @@ -54,7 +87,7 @@ return 0; } -bool st_format::load(io_generic *io, floppy_image *image) +bool st_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { int track_count, head_count, sector_count; find_size(io, track_count, head_count, sector_count); @@ -72,10 +105,12 @@ for(int head=0; head < head_count; head++) { io_generic_read(io, sectdata, (track*head_count + head)*track_size, track_size); generate_track(atari_st_fcp_get_desc(track, head, head_count, sector_count), - track, head, sectors, sector_count+1, 100000, image); + track, head, sectors, sector_count, 100000, image); } } + image->set_variant(floppy_image::DSDD); + return true; } @@ -201,7 +236,7 @@ return dst < usize; } -int msa_format::identify(io_generic *io) +int msa_format::identify(io_generic *io, UINT32 form_factor) { UINT16 sign, sect, head, strack, etrack; read_header(io, sign, sect, head, strack, etrack); @@ -215,7 +250,7 @@ return 0; } -bool msa_format::load(io_generic *io, floppy_image *image) +bool msa_format::load(io_generic *io, UINT32 form_factor, floppy_image *image) { UINT16 sign, sect, heads, strack, etrack; read_header(io, sign, sect, heads, strack, etrack); @@ -244,10 +279,11 @@ return false; } generate_track(atari_st_fcp_get_desc(track, head, head+1, sect), - track, head, sectors, sect+1, 100000, image); + track, head, sectors, sect, 100000, image); } } + image->set_variant(floppy_image::DSDD); return true; } diff -Nru mame-0.144/src/lib/formats/st_dsk.h mame-0.145/src/lib/formats/st_dsk.h --- mame-0.144/src/lib/formats/st_dsk.h 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/st_dsk.h 2012-02-06 21:30:30.000000000 +0000 @@ -16,8 +16,8 @@ public: st_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; @@ -34,8 +34,8 @@ public: msa_format(); - virtual int identify(io_generic *io); - virtual bool load(io_generic *io, floppy_image *image); + virtual int identify(io_generic *io, UINT32 form_factor); + virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image); virtual bool save(io_generic *io, floppy_image *image); virtual const char *name() const; diff -Nru mame-0.144/src/lib/formats/ti99_dsk.c mame-0.145/src/lib/formats/ti99_dsk.c --- mame-0.144/src/lib/formats/ti99_dsk.c 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/formats/ti99_dsk.c 2012-02-06 21:30:30.000000000 +0000 @@ -907,7 +907,7 @@ *sector = sector_index; if (flags) *flags = 0; - if (sector_index > tag->sectors) + if (sector_index >= tag->sectors) { return FLOPPY_ERROR_SEEKERROR; } diff -Nru mame-0.144/src/lib/formats/tzx_cas.c mame-0.145/src/lib/formats/tzx_cas.c --- mame-0.144/src/lib/formats/tzx_cas.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/formats/tzx_cas.c 2012-02-06 21:30:29.000000000 +0000 @@ -81,7 +81,7 @@ int pos = sizeof(TZX_HEADER) + 2; int max_block_count = INITIAL_MAX_BLOCK_COUNT; - blocks = (UINT8**)malloc(max_block_count); + blocks = (UINT8**)malloc(max_block_count * sizeof(UINT8*)); memset(blocks,0,max_block_count); block_count = 0; @@ -94,9 +94,8 @@ { void *old_blocks = blocks; int old_max_block_count = max_block_count; - printf("realoc"); max_block_count = max_block_count + BLOCK_COUNT_INCREMENTS; - blocks = (UINT8**)malloc(max_block_count); // SHOULD NOT BE USING auto_alloc_array() + blocks = (UINT8**)malloc(max_block_count * sizeof(UINT8*)); // SHOULD NOT BE USING auto_alloc_array() memset(blocks,0,max_block_count); memcpy(blocks, old_blocks, old_max_block_count * sizeof(UINT8*)); if (blocks) free(old_blocks); diff -Nru mame-0.144/src/lib/libflac/include/flac/all.h mame-0.145/src/lib/libflac/include/flac/all.h --- mame-0.144/src/lib/libflac/include/flac/all.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/all.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,370 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__ALL_H +#define FLAC__ALL_H + +#include "export.h" + +#include "assert.h" +#include "callback.h" +#include "format.h" +#include "metadata.h" +#include "ordinals.h" +#include "stream_decoder.h" +#include "stream_encoder.h" + +/** \mainpage + * + * \section intro Introduction + * + * This is the documentation for the FLAC C and C++ APIs. It is + * highly interconnected; this introduction should give you a top + * level idea of the structure and how to find the information you + * need. As a prerequisite you should have at least a basic + * knowledge of the FLAC format, documented + * here. + * + * \section c_api FLAC C API + * + * The FLAC C API is the interface to libFLAC, a set of structures + * describing the components of FLAC streams, and functions for + * encoding and decoding streams, as well as manipulating FLAC + * metadata in files. The public include files will be installed + * in your include area (for example /usr/include/FLAC/...). + * + * By writing a little code and linking against libFLAC, it is + * relatively easy to add FLAC support to another program. The + * library is licensed under Xiph's BSD license. + * Complete source code of libFLAC as well as the command-line + * encoder and plugins is available and is a useful source of + * examples. + * + * Aside from encoders and decoders, libFLAC provides a powerful + * metadata interface for manipulating metadata in FLAC files. It + * allows the user to add, delete, and modify FLAC metadata blocks + * and it can automatically take advantage of PADDING blocks to avoid + * rewriting the entire FLAC file when changing the size of the + * metadata. + * + * libFLAC usually only requires the standard C library and C math + * library. In particular, threading is not used so there is no + * dependency on a thread library. However, libFLAC does not use + * global variables and should be thread-safe. + * + * libFLAC also supports encoding to and decoding from Ogg FLAC. + * However the metadata editing interfaces currently have limited + * read-only support for Ogg FLAC files. + * + * \section cpp_api FLAC C++ API + * + * The FLAC C++ API is a set of classes that encapsulate the + * structures and functions in libFLAC. They provide slightly more + * functionality with respect to metadata but are otherwise + * equivalent. For the most part, they share the same usage as + * their counterparts in libFLAC, and the FLAC C API documentation + * can be used as a supplement. The public include files + * for the C++ API will be installed in your include area (for + * example /usr/include/FLAC++/...). + * + * libFLAC++ is also licensed under + * Xiph's BSD license. + * + * \section getting_started Getting Started + * + * A good starting point for learning the API is to browse through + * the modules. Modules are logical + * groupings of related functions or classes, which correspond roughly + * to header files or sections of header files. Each module includes a + * detailed description of the general usage of its functions or + * classes. + * + * From there you can go on to look at the documentation of + * individual functions. You can see different views of the individual + * functions through the links in top bar across this page. + * + * If you prefer a more hands-on approach, you can jump right to some + * example code. + * + * \section porting_guide Porting Guide + * + * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink + * has been introduced which gives detailed instructions on how to + * port your code to newer versions of FLAC. + * + * \section embedded_developers Embedded Developers + * + * libFLAC has grown larger over time as more functionality has been + * included, but much of it may be unnecessary for a particular embedded + * implementation. Unused parts may be pruned by some simple editing of + * src/libFLAC/Makefile.am. In general, the decoders, encoders, and + * metadata interface are all independent from each other. + * + * It is easiest to just describe the dependencies: + * + * - All modules depend on the \link flac_format Format \endlink module. + * - The decoders and encoders depend on the bitbuffer. + * - The decoder is independent of the encoder. The encoder uses the + * decoder because of the verify feature, but this can be removed if + * not needed. + * - Parts of the metadata interface require the stream decoder (but not + * the encoder). + * - Ogg support is selectable through the compile time macro + * \c FLAC__HAS_OGG. + * + * For example, if your application only requires the stream decoder, no + * encoder, and no metadata interface, you can remove the stream encoder + * and the metadata interface, which will greatly reduce the size of the + * library. + * + * Also, there are several places in the libFLAC code with comments marked + * with "OPT:" where a #define can be changed to enable code that might be + * faster on a specific platform. Experimenting with these can yield faster + * binaries. + */ + +/** \defgroup porting Porting Guide for New Versions + * + * This module describes differences in the library interfaces from + * version to version. It assists in the porting of code that uses + * the libraries to newer versions of FLAC. + * + * One simple facility for making porting easier that has been added + * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each + * library's includes (e.g. \c include/FLAC/export.h). The + * \c #defines mirror the libraries' + * libtool version numbers, + * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, + * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. + * These can be used to support multiple versions of an API during the + * transition phase, e.g. + * + * \code + * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 + * legacy code + * #else + * new code + * #endif + * \endcode + * + * The the source will work for multiple versions and the legacy code can + * easily be removed when the transition is complete. + * + * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in + * include/FLAC/export.h), which can be used to determine whether or not + * the library has been compiled with support for Ogg FLAC. This is + * simpler than trying to call an Ogg init function and catching the + * error. + */ + +/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. + * + * The main change between the APIs in 1.1.2 and 1.1.3 is that they have + * been simplified. First, libOggFLAC has been merged into libFLAC and + * libOggFLAC++ has been merged into libFLAC++. Second, both the three + * decoding layers and three encoding layers have been merged into a + * single stream decoder and stream encoder. That is, the functionality + * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged + * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and + * FLAC__FileEncoder into FLAC__StreamEncoder. Only the + * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means + * is there is now a single API that can be used to encode or decode + * streams to/from native FLAC or Ogg FLAC and the single API can work + * on both seekable and non-seekable streams. + * + * Instead of creating an encoder or decoder of a certain layer, now the + * client will always create a FLAC__StreamEncoder or + * FLAC__StreamDecoder. The old layers are now differentiated by the + * initialization function. For example, for the decoder, + * FLAC__stream_decoder_init() has been replaced by + * FLAC__stream_decoder_init_stream(). This init function takes + * callbacks for the I/O, and the seeking callbacks are optional. This + * allows the client to use the same object for seekable and + * non-seekable streams. For decoding a FLAC file directly, the client + * can use FLAC__stream_decoder_init_file() and pass just a filename + * and fewer callbacks; most of the other callbacks are supplied + * internally. For situations where fopen()ing by filename is not + * possible (e.g. Unicode filenames on Windows) the client can instead + * open the file itself and supply the FILE* to + * FLAC__stream_decoder_init_FILE(). The init functions now returns a + * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. + * Since the callbacks and client data are now passed to the init + * function, the FLAC__stream_decoder_set_*_callback() functions and + * FLAC__stream_decoder_set_client_data() are no longer needed. The + * rest of the calls to the decoder are the same as before. + * + * There are counterpart init functions for Ogg FLAC, e.g. + * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls + * and callbacks are the same as for native FLAC. + * + * As an example, in FLAC 1.1.2 a seekable stream decoder would have + * been set up like so: + * + * \code + * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); + * if(decoder == NULL) do_something; + * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); + * [... other settings ...] + * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); + * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); + * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); + * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); + * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); + * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); + * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); + * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); + * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); + * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; + * \endcode + * + * In FLAC 1.1.3 it is like this: + * + * \code + * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); + * if(decoder == NULL) do_something; + * FLAC__stream_decoder_set_md5_checking(decoder, true); + * [... other settings ...] + * if(FLAC__stream_decoder_init_stream( + * decoder, + * my_read_callback, + * my_seek_callback, // or NULL + * my_tell_callback, // or NULL + * my_length_callback, // or NULL + * my_eof_callback, // or NULL + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * or you could do; + * + * \code + * [...] + * FILE *file = fopen("somefile.flac","rb"); + * if(file == NULL) do_somthing; + * if(FLAC__stream_decoder_init_FILE( + * decoder, + * file, + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * or just: + * + * \code + * [...] + * if(FLAC__stream_decoder_init_file( + * decoder, + * "somefile.flac", + * my_write_callback, + * my_metadata_callback, // or NULL + * my_error_callback, + * my_client_data + * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; + * \endcode + * + * Another small change to the decoder is in how it handles unparseable + * streams. Before, when the decoder found an unparseable stream + * (reserved for when the decoder encounters a stream from a future + * encoder that it can't parse), it changed the state to + * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead + * drops sync and calls the error callback with a new error code + * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is + * more robust. If your error callback does not discriminate on the the + * error state, your code does not need to be changed. + * + * The encoder now has a new setting: + * FLAC__stream_encoder_set_apodization(). This is for setting the + * method used to window the data before LPC analysis. You only need to + * add a call to this function if the default is not suitable. There + * are also two new convenience functions that may be useful: + * FLAC__metadata_object_cuesheet_calculate_cddb_id() and + * FLAC__metadata_get_cuesheet(). + * + * The \a bytes parameter to FLAC__StreamDecoderReadCallback, + * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback + * is now \c size_t instead of \c unsigned. + */ + +/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. + * + * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. + * There was a slight change in the implementation of + * FLAC__stream_encoder_set_metadata(); the function now makes a copy + * of the \a metadata array of pointers so the client no longer needs + * to maintain it after the call. The objects themselves that are + * pointed to by the array are still not copied though and must be + * maintained until the call to FLAC__stream_encoder_finish(). + */ + +/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 + * \ingroup porting + * + * \brief + * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. + * + * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. + * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. + * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. + * + * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN + * has changed to reflect the conversion of one of the reserved bits + * into active use. It used to be \c 2 and now is \c 1. However the + * FLAC frame header length has not changed, so to skip the proper + * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + + * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN + */ + +/** \defgroup flac FLAC C API + * + * The FLAC C API is the interface to libFLAC, a set of structures + * describing the components of FLAC streams, and functions for + * encoding and decoding streams, as well as manipulating FLAC + * metadata in files. + * + * You should start with the format components as all other modules + * are dependent on it. + */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/assert.h mame-0.145/src/lib/libflac/include/flac/assert.h --- mame-0.144/src/lib/libflac/include/flac/assert.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/assert.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,45 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__ASSERT_H +#define FLAC__ASSERT_H + +/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ +#ifdef DEBUG +#include +#define FLAC__ASSERT(x) assert(x) +#define FLAC__ASSERT_DECLARATION(x) x +#else +#define FLAC__ASSERT(x) +#define FLAC__ASSERT_DECLARATION(x) +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/callback.h mame-0.145/src/lib/libflac/include/flac/callback.h --- mame-0.144/src/lib/libflac/include/flac/callback.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/callback.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,184 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__CALLBACK_H +#define FLAC__CALLBACK_H + +#include "ordinals.h" +#include /* for size_t */ + +/** \file include/FLAC/callback.h + * + * \brief + * This module defines the structures for describing I/O callbacks + * to the other FLAC interfaces. + * + * See the detailed documentation for callbacks in the + * \link flac_callbacks callbacks \endlink module. + */ + +/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures + * \ingroup flac + * + * \brief + * This module defines the structures for describing I/O callbacks + * to the other FLAC interfaces. + * + * The purpose of the I/O callback functions is to create a common way + * for the metadata interfaces to handle I/O. + * + * Originally the metadata interfaces required filenames as the way of + * specifying FLAC files to operate on. This is problematic in some + * environments so there is an additional option to specify a set of + * callbacks for doing I/O on the FLAC file, instead of the filename. + * + * In addition to the callbacks, a FLAC__IOHandle type is defined as an + * opaque structure for a data source. + * + * The callback function prototypes are similar (but not identical) to the + * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use + * stdio streams to implement the callbacks, you can pass fread, fwrite, and + * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or + * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle + * is required. \warning You generally CANNOT directly use fseek or ftell + * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems + * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with + * large files. You will have to find an equivalent function (e.g. ftello), + * or write a wrapper. The same is true for feof() since this is usually + * implemented as a macro, not as a function whose address can be taken. + * + * \{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the opaque handle type used by the callbacks. Typically + * this is a \c FILE* or address of a file descriptor. + */ +typedef void* FLAC__IOHandle; + +/** Signature for the read callback. + * The signature and semantics match POSIX fread() implementations + * and can generally be used interchangeably. + * + * \param ptr The address of the read buffer. + * \param size The size of the records to be read. + * \param nmemb The number of records to be read. + * \param handle The handle to the data source. + * \retval size_t + * The number of records read. + */ +typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + +/** Signature for the write callback. + * The signature and semantics match POSIX fwrite() implementations + * and can generally be used interchangeably. + * + * \param ptr The address of the write buffer. + * \param size The size of the records to be written. + * \param nmemb The number of records to be written. + * \param handle The handle to the data source. + * \retval size_t + * The number of records written. + */ +typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); + +/** Signature for the seek callback. + * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT + * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' + * and 32-bits wide. + * + * \param handle The handle to the data source. + * \param offset The new position, relative to \a whence + * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END + * \retval int + * \c 0 on success, \c -1 on error. + */ +typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); + +/** Signature for the tell callback. + * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT + * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' + * and 32-bits wide. + * + * \param handle The handle to the data source. + * \retval FLAC__int64 + * The current position on success, \c -1 on error. + */ +typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); + +/** Signature for the EOF callback. + * The signature and semantics mostly match POSIX feof() but WATCHOUT: + * on many systems, feof() is a macro, so in this case a wrapper function + * must be provided instead. + * + * \param handle The handle to the data source. + * \retval int + * \c 0 if not at end of file, nonzero if at end of file. + */ +typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); + +/** Signature for the close callback. + * The signature and semantics match POSIX fclose() implementations + * and can generally be used interchangeably. + * + * \param handle The handle to the data source. + * \retval int + * \c 0 on success, \c EOF on error. + */ +typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); + +/** A structure for holding a set of callbacks. + * Each FLAC interface that requires a FLAC__IOCallbacks structure will + * describe which of the callbacks are required. The ones that are not + * required may be set to NULL. + * + * If the seek requirement for an interface is optional, you can signify that + * a data sorce is not seekable by setting the \a seek field to \c NULL. + */ +typedef struct { + FLAC__IOCallback_Read read; + FLAC__IOCallback_Write write; + FLAC__IOCallback_Seek seek; + FLAC__IOCallback_Tell tell; + FLAC__IOCallback_Eof eof; + FLAC__IOCallback_Close close; +} FLAC__IOCallbacks; + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/export.h mame-0.145/src/lib/libflac/include/flac/export.h --- mame-0.144/src/lib/libflac/include/flac/export.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/export.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,91 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__EXPORT_H +#define FLAC__EXPORT_H + +/** \file include/FLAC/export.h + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * See the \link flac_export export \endlink module. + */ + +/** \defgroup flac_export FLAC/export.h: export symbols + * \ingroup flac + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * If you are compiling with MSVC and will link to the static library + * (libFLAC.lib) you should define FLAC__NO_DLL in your project to + * make sure the symbols are exported properly. + * + * \{ + */ + +#if defined(FLAC__NO_DLL) || !defined(_MSC_VER) +#define FLAC_API + +#else + +#ifdef FLAC_API_EXPORTS +#define FLAC_API _declspec(dllexport) +#else +#define FLAC_API _declspec(dllimport) + +#endif +#endif + +/** These #defines will mirror the libtool-based library version number, see + * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning + */ +#define FLAC_API_VERSION_CURRENT 10 +#define FLAC_API_VERSION_REVISION 0 /**< see above */ +#define FLAC_API_VERSION_AGE 2 /**< see above */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ +extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; + +#ifdef __cplusplus +} +#endif + +/* \} */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/format.h mame-0.145/src/lib/libflac/include/flac/format.h --- mame-0.144/src/lib/libflac/include/flac/format.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/format.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1010 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__FORMAT_H +#define FLAC__FORMAT_H + +#include "export.h" +#include "ordinals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file include/FLAC/format.h + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * See the detailed documentation in the + * \link flac_format format \endlink module. + */ + +/** \defgroup flac_format FLAC/format.h: format components + * \ingroup flac + * + * \brief + * This module contains structure definitions for the representation + * of FLAC format components in memory. These are the basic + * structures used by the rest of the interfaces. + * + * First, you should be familiar with the + * FLAC format. Many of the values here + * follow directly from the specification. As a user of libFLAC, the + * interesting parts really are the structures that describe the frame + * header and metadata blocks. + * + * The format structures here are very primitive, designed to store + * information in an efficient way. Reading information from the + * structures is easy but creating or modifying them directly is + * more complex. For the most part, as a user of a library, editing + * is not necessary; however, for metadata blocks it is, so there are + * convenience functions provided in the \link flac_metadata metadata + * module \endlink to simplify the manipulation of metadata blocks. + * + * \note + * It's not the best convention, but symbols ending in _LEN are in bits + * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of + * global variables because they are usually used when declaring byte + * arrays and some compilers require compile-time knowledge of array + * sizes when declared on the stack. + * + * \{ + */ + + +/* + Most of the values described in this file are defined by the FLAC + format specification. There is nothing to tune here. +*/ + +/** The largest legal metadata type code. */ +#define FLAC__MAX_METADATA_TYPE_CODE (126u) + +/** The minimum block size, in samples, permitted by the format. */ +#define FLAC__MIN_BLOCK_SIZE (16u) + +/** The maximum block size, in samples, permitted by the format. */ +#define FLAC__MAX_BLOCK_SIZE (65535u) + +/** The maximum block size, in samples, permitted by the FLAC subset for + * sample rates up to 48kHz. */ +#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) + +/** The maximum number of channels permitted by the format. */ +#define FLAC__MAX_CHANNELS (8u) + +/** The minimum sample resolution permitted by the format. */ +#define FLAC__MIN_BITS_PER_SAMPLE (4u) + +/** The maximum sample resolution permitted by the format. */ +#define FLAC__MAX_BITS_PER_SAMPLE (32u) + +/** The maximum sample resolution permitted by libFLAC. + * + * \warning + * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, + * the reference encoder/decoder is currently limited to 24 bits because + * of prevalent 32-bit math, so make sure and use this value when + * appropriate. + */ +#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) + +/** The maximum sample rate permitted by the format. The value is + * ((2 ^ 16) - 1) * 10; see FLAC format + * as to why. + */ +#define FLAC__MAX_SAMPLE_RATE (655350u) + +/** The maximum LPC order permitted by the format. */ +#define FLAC__MAX_LPC_ORDER (32u) + +/** The maximum LPC order permitted by the FLAC subset for sample rates + * up to 48kHz. */ +#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) + +/** The minimum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MIN_QLP_COEFF_PRECISION (5u) + +/** The maximum quantized linear predictor coefficient precision + * permitted by the format. + */ +#define FLAC__MAX_QLP_COEFF_PRECISION (15u) + +/** The maximum order of the fixed predictors permitted by the format. */ +#define FLAC__MAX_FIXED_ORDER (4u) + +/** The maximum Rice partition order permitted by the format. */ +#define FLAC__MAX_RICE_PARTITION_ORDER (15u) + +/** The maximum Rice partition order permitted by the FLAC Subset. */ +#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) + +/** The version string of the release, stamped onto the libraries and binaries. + * + * \note + * This does not correspond to the shared library version number, which + * is used to determine binary compatibility. + */ +extern FLAC_API const char *FLAC__VERSION_STRING; + +/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. + * This is a NUL-terminated ASCII string; when inserted into the + * VORBIS_COMMENT the trailing null is stripped. + */ +extern FLAC_API const char *FLAC__VENDOR_STRING; + +/** The byte string representation of the beginning of a FLAC stream. */ +extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ + +/** The 32-bit integer big-endian representation of the beginning of + * a FLAC stream. + */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ + +/** The length of the FLAC signature in bits. */ +extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ + +/** The length of the FLAC signature in bytes. */ +#define FLAC__STREAM_SYNC_LENGTH (4u) + + +/***************************************************************************** + * + * Subframe structures + * + *****************************************************************************/ + +/*****************************************************************************/ + +/** An enumeration of the available entropy coding methods. */ +typedef enum { + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, + /**< Residual is coded by partitioning into contexts, each with it's own + * 4-bit Rice parameter. */ + + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 + /**< Residual is coded by partitioning into contexts, each with it's own + * 5-bit Rice parameter. */ +} FLAC__EntropyCodingMethodType; + +/** Maps a FLAC__EntropyCodingMethodType to a C string. + * + * Using a FLAC__EntropyCodingMethodType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; + + +/** Contents of a Rice partitioned residual + */ +typedef struct { + + unsigned *parameters; + /**< The Rice parameters for each context. */ + + unsigned *raw_bits; + /**< Widths for escape-coded partitions. Will be non-zero for escaped + * partitions and zero for unescaped partitions. + */ + + unsigned capacity_by_order; + /**< The capacity of the \a parameters and \a raw_bits arrays + * specified as an order, i.e. the number of array elements + * allocated is 2 ^ \a capacity_by_order. + */ +} FLAC__EntropyCodingMethod_PartitionedRiceContents; + +/** Header for a Rice partitioned residual. (c.f. format specification) + */ +typedef struct { + + unsigned order; + /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ + + const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; + /**< The context's Rice parameters and/or raw bits. */ + +} FLAC__EntropyCodingMethod_PartitionedRice; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; +/**< == (1<format specification) + */ +typedef struct { + FLAC__EntropyCodingMethodType type; + union { + FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; + } data; +} FLAC__EntropyCodingMethod; + +extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ + +/*****************************************************************************/ + +/** An enumeration of the available subframe types. */ +typedef enum { + FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ + FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ + FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ + FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ +} FLAC__SubframeType; + +/** Maps a FLAC__SubframeType to a C string. + * + * Using a FLAC__SubframeType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__SubframeTypeString[]; + + +/** CONSTANT subframe. (c.f. format specification) + */ +typedef struct { + FLAC__int32 value; /**< The constant signal value. */ +} FLAC__Subframe_Constant; + + +/** VERBATIM subframe. (c.f. format specification) + */ +typedef struct { + const FLAC__int32 *data; /**< A pointer to verbatim signal. */ +} FLAC__Subframe_Verbatim; + + +/** FIXED subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The polynomial order. */ + + FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_Fixed; + + +/** LPC subframe. (c.f. format specification) + */ +typedef struct { + FLAC__EntropyCodingMethod entropy_coding_method; + /**< The residual coding method. */ + + unsigned order; + /**< The FIR order. */ + + unsigned qlp_coeff_precision; + /**< Quantized FIR filter coefficient precision in bits. */ + + int quantization_level; + /**< The qlp coeff shift needed. */ + + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + /**< FIR filter coefficients. */ + + FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; + /**< Warmup samples to prime the predictor, length == order. */ + + const FLAC__int32 *residual; + /**< The residual signal, length == (blocksize minus order) samples. */ +} FLAC__Subframe_LPC; + +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ + + +/** FLAC subframe structure. (c.f. format specification) + */ +typedef struct { + FLAC__SubframeType type; + union { + FLAC__Subframe_Constant constant; + FLAC__Subframe_Fixed fixed; + FLAC__Subframe_LPC lpc; + FLAC__Subframe_Verbatim verbatim; + } data; + unsigned wasted_bits; +} FLAC__Subframe; + +/** == 1 (bit) + * + * This used to be a zero-padding bit (hence the name + * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a + * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 + * to mean something else. + */ +extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ +extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ + +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ +extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Frame structures + * + *****************************************************************************/ + +/** An enumeration of the available channel assignments. */ +typedef enum { + FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ + FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ + FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ +} FLAC__ChannelAssignment; + +/** Maps a FLAC__ChannelAssignment to a C string. + * + * Using a FLAC__ChannelAssignment as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; + +/** An enumeration of the possible frame numbering methods. */ +typedef enum { + FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ + FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ +} FLAC__FrameNumberType; + +/** Maps a FLAC__FrameNumberType to a C string. + * + * Using a FLAC__FrameNumberType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; + + +/** FLAC frame header structure. (c.f. format specification) + */ +typedef struct { + unsigned blocksize; + /**< The number of samples per subframe. */ + + unsigned sample_rate; + /**< The sample rate in Hz. */ + + unsigned channels; + /**< The number of channels (== number of subframes). */ + + FLAC__ChannelAssignment channel_assignment; + /**< The channel assignment for the frame. */ + + unsigned bits_per_sample; + /**< The sample resolution. */ + + FLAC__FrameNumberType number_type; + /**< The numbering scheme used for the frame. As a convenience, the + * decoder will always convert a frame number to a sample number because + * the rules are complex. */ + + union { + FLAC__uint32 frame_number; + FLAC__uint64 sample_number; + } number; + /**< The frame number or sample number of first sample in frame; + * use the \a number_type value to determine which to use. */ + + FLAC__uint8 crc; + /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) + * of the raw frame header bytes, meaning everything before the CRC byte + * including the sync code. + */ +} FLAC__FrameHeader; + +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ + + +/** FLAC frame footer structure. (c.f. format specification) + */ +typedef struct { + FLAC__uint16 crc; + /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with + * 0) of the bytes before the crc, back to and including the frame header + * sync code. + */ +} FLAC__FrameFooter; + +extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ + + +/** FLAC frame structure. (c.f. format specification) + */ +typedef struct { + FLAC__FrameHeader header; + FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; + FLAC__FrameFooter footer; +} FLAC__Frame; + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Meta-data structures + * + *****************************************************************************/ + +/** An enumeration of the available metadata block types. */ +typedef enum { + + FLAC__METADATA_TYPE_STREAMINFO = 0, + /**< STREAMINFO block */ + + FLAC__METADATA_TYPE_PADDING = 1, + /**< PADDING block */ + + FLAC__METADATA_TYPE_APPLICATION = 2, + /**< APPLICATION block */ + + FLAC__METADATA_TYPE_SEEKTABLE = 3, + /**< SEEKTABLE block */ + + FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, + /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ + + FLAC__METADATA_TYPE_CUESHEET = 5, + /**< CUESHEET block */ + + FLAC__METADATA_TYPE_PICTURE = 6, + /**< PICTURE block */ + + FLAC__METADATA_TYPE_UNDEFINED = 7 + /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ + +} FLAC__MetadataType; + +/** Maps a FLAC__MetadataType to a C string. + * + * Using a FLAC__MetadataType as the index to this array will + * give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__MetadataTypeString[]; + + +/** FLAC STREAMINFO structure. (c.f. format specification) + */ +typedef struct { + unsigned min_blocksize, max_blocksize; + unsigned min_framesize, max_framesize; + unsigned sample_rate; + unsigned channels; + unsigned bits_per_sample; + FLAC__uint64 total_samples; + FLAC__byte md5sum[16]; +} FLAC__StreamMetadata_StreamInfo; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ + +/** The total stream length of the STREAMINFO block in bytes. */ +#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) + +/** FLAC PADDING structure. (c.f. format specification) + */ +typedef struct { + int dummy; + /**< Conceptually this is an empty struct since we don't store the + * padding bytes. Empty structs are not allowed by some C compilers, + * hence the dummy. + */ +} FLAC__StreamMetadata_Padding; + + +/** FLAC APPLICATION structure. (c.f. format specification) + */ +typedef struct { + FLAC__byte id[4]; + FLAC__byte *data; +} FLAC__StreamMetadata_Application; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ + +/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) + */ +typedef struct { + FLAC__uint64 sample_number; + /**< The sample number of the target frame. */ + + FLAC__uint64 stream_offset; + /**< The offset, in bytes, of the target frame with respect to + * beginning of the first frame. */ + + unsigned frame_samples; + /**< The number of samples in the target frame. */ +} FLAC__StreamMetadata_SeekPoint; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ + +/** The total stream length of a seek point in bytes. */ +#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) + +/** The value used in the \a sample_number field of + * FLAC__StreamMetadataSeekPoint used to indicate a placeholder + * point (== 0xffffffffffffffff). + */ +extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + + +/** FLAC SEEKTABLE structure. (c.f. format specification) + * + * \note From the format specification: + * - The seek points must be sorted by ascending sample number. + * - Each seek point's sample number must be the first sample of the + * target frame. + * - Each seek point's sample number must be unique within the table. + * - Existence of a SEEKTABLE block implies a correct setting of + * total_samples in the stream_info block. + * - Behavior is undefined when more than one SEEKTABLE block is + * present in a stream. + */ +typedef struct { + unsigned num_points; + FLAC__StreamMetadata_SeekPoint *points; +} FLAC__StreamMetadata_SeekTable; + + +/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) + * + * For convenience, the APIs maintain a trailing NUL character at the end of + * \a entry which is not counted toward \a length, i.e. + * \code strlen(entry) == length \endcode + */ +typedef struct { + FLAC__uint32 length; + FLAC__byte *entry; +} FLAC__StreamMetadata_VorbisComment_Entry; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ + + +/** FLAC VORBIS_COMMENT structure. (c.f. format specification) + */ +typedef struct { + FLAC__StreamMetadata_VorbisComment_Entry vendor_string; + FLAC__uint32 num_comments; + FLAC__StreamMetadata_VorbisComment_Entry *comments; +} FLAC__StreamMetadata_VorbisComment; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ + + +/** FLAC CUESHEET track index structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Offset in samples, relative to the track offset, of the index + * point. + */ + + FLAC__byte number; + /**< The index point number. */ +} FLAC__StreamMetadata_CueSheet_Index; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ + + +/** FLAC CUESHEET track structure. (See the + * format specification for + * the full description of each field.) + */ +typedef struct { + FLAC__uint64 offset; + /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ + + FLAC__byte number; + /**< The track number. */ + + char isrc[13]; + /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ + + unsigned type:1; + /**< The track type: 0 for audio, 1 for non-audio. */ + + unsigned pre_emphasis:1; + /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ + + FLAC__byte num_indices; + /**< The number of track index points. */ + + FLAC__StreamMetadata_CueSheet_Index *indices; + /**< NULL if num_indices == 0, else pointer to array of index points. */ + +} FLAC__StreamMetadata_CueSheet_Track; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ + + +/** FLAC CUESHEET structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + char media_catalog_number[129]; + /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In + * general, the media catalog number may be 0 to 128 bytes long; any + * unused characters should be right-padded with NUL characters. + */ + + FLAC__uint64 lead_in; + /**< The number of lead-in samples. */ + + FLAC__bool is_cd; + /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ + + unsigned num_tracks; + /**< The number of tracks. */ + + FLAC__StreamMetadata_CueSheet_Track *tracks; + /**< NULL if num_tracks == 0, else pointer to array of tracks. */ + +} FLAC__StreamMetadata_CueSheet; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ + + +/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ +typedef enum { + FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ + FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ + FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ + FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ + FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ + FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ + FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ + FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ + FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ + FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED +} FLAC__StreamMetadata_Picture_Type; + +/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. + * + * Using a FLAC__StreamMetadata_Picture_Type as the index to this array + * will give the string equivalent. The contents should not be + * modified. + */ +extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; + +/** FLAC PICTURE structure. (See the + * format specification + * for the full description of each field.) + */ +typedef struct { + FLAC__StreamMetadata_Picture_Type type; + /**< The kind of picture stored. */ + + char *mime_type; + /**< Picture data's MIME type, in ASCII printable characters + * 0x20-0x7e, NUL terminated. For best compatibility with players, + * use picture data of MIME type \c image/jpeg or \c image/png. A + * MIME type of '-->' is also allowed, in which case the picture + * data should be a complete URL. In file storage, the MIME type is + * stored as a 32-bit length followed by the ASCII string with no NUL + * terminator, but is converted to a plain C string in this structure + * for convenience. + */ + + FLAC__byte *description; + /**< Picture's description in UTF-8, NUL terminated. In file storage, + * the description is stored as a 32-bit length followed by the UTF-8 + * string with no NUL terminator, but is converted to a plain C string + * in this structure for convenience. + */ + + FLAC__uint32 width; + /**< Picture's width in pixels. */ + + FLAC__uint32 height; + /**< Picture's height in pixels. */ + + FLAC__uint32 depth; + /**< Picture's color depth in bits-per-pixel. */ + + FLAC__uint32 colors; + /**< For indexed palettes (like GIF), picture's number of colors (the + * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). + */ + + FLAC__uint32 data_length; + /**< Length of binary picture data in bytes. */ + + FLAC__byte *data; + /**< Binary picture data. */ + +} FLAC__StreamMetadata_Picture; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ + + +/** Structure that is used when a metadata block of unknown type is loaded. + * The contents are opaque. The structure is used only internally to + * correctly handle unknown metadata. + */ +typedef struct { + FLAC__byte *data; +} FLAC__StreamMetadata_Unknown; + + +/** FLAC metadata block structure. (c.f. format specification) + */ +typedef struct { + FLAC__MetadataType type; + /**< The type of the metadata block; used determine which member of the + * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED + * then \a data.unknown must be used. */ + + FLAC__bool is_last; + /**< \c true if this metadata block is the last, else \a false */ + + unsigned length; + /**< Length, in bytes, of the block data as it appears in the stream. */ + + union { + FLAC__StreamMetadata_StreamInfo stream_info; + FLAC__StreamMetadata_Padding padding; + FLAC__StreamMetadata_Application application; + FLAC__StreamMetadata_SeekTable seek_table; + FLAC__StreamMetadata_VorbisComment vorbis_comment; + FLAC__StreamMetadata_CueSheet cue_sheet; + FLAC__StreamMetadata_Picture picture; + FLAC__StreamMetadata_Unknown unknown; + } data; + /**< Polymorphic block data; use the \a type value to determine which + * to use. */ +} FLAC__StreamMetadata; + +extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ +extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ + +/** The total stream length of a metadata block header in bytes. */ +#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) + +/*****************************************************************************/ + + +/***************************************************************************** + * + * Utility functions + * + *****************************************************************************/ + +/** Tests that a sample rate is valid for FLAC. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification, else + * \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); + +/** Tests that a sample rate is valid for the FLAC subset. The subset rules + * for valid sample rates are slightly more complex since the rate has to + * be expressible completely in the frame header. + * + * \param sample_rate The sample rate to test for compliance. + * \retval FLAC__bool + * \c true if the given sample rate conforms to the specification for the + * subset, else \c false. + */ +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); + +/** Check a Vorbis comment entry name to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment names must be composed only of characters from + * [0x20-0x3C,0x3E-0x7D]. + * + * \param name A NUL-terminated string to be checked. + * \assert + * \code name != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); + +/** Check a Vorbis comment entry value to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment values must be valid UTF-8 sequences. + * + * \param value A string to be checked. + * \param length A the length of \a value in bytes. May be + * \c (unsigned)(-1) to indicate that \a value is a plain + * UTF-8 NUL-terminated string. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); + +/** Check a Vorbis comment entry to see if it conforms to the Vorbis + * comment specification. + * + * Vorbis comment entries must be of the form 'name=value', and 'name' and + * 'value' must be legal according to + * FLAC__format_vorbiscomment_entry_name_is_legal() and + * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. + * + * \param entry An entry to be checked. + * \param length The length of \a entry in bytes. + * \assert + * \code value != NULL \endcode + * \retval FLAC__bool + * \c false if entry name is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); + +/** Check a seek table to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seek table. + * + * \param seek_table A pointer to a seek table to be checked. + * \assert + * \code seek_table != NULL \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); + +/** Sort a seek table's seek points according to the format specification. + * This includes a "unique-ification" step to remove duplicates, i.e. + * seek points with identical \a sample_number values. Duplicate seek + * points are converted into placeholder points and sorted to the end of + * the table. + * + * \param seek_table A pointer to a seek table to be sorted. + * \assert + * \code seek_table != NULL \endcode + * \retval unsigned + * The number of duplicate seek points converted into placeholders. + */ +FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param cue_sheet A pointer to an existing cue sheet to be checked. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code cue_sheet != NULL \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); + +/** Check picture data to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param picture A pointer to existing picture data to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c false if picture data is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/metadata.h mame-0.145/src/lib/libflac/include/flac/metadata.h --- mame-0.144/src/lib/libflac/include/flac/metadata.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/metadata.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,2181 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__METADATA_H +#define FLAC__METADATA_H + +#include /* for off_t */ +#include "export.h" +#include "callback.h" +#include "format.h" + +/* -------------------------------------------------------------------- + (For an example of how all these routines are used, see the source + code for the unit tests in src/test_libFLAC/metadata_*.c, or + metaflac in src/metaflac/) + ------------------------------------------------------------------*/ + +/** \file include/FLAC/metadata.h + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in FLAC files. + * + * See the detailed documentation for each interface in the + * \link flac_metadata metadata \endlink module. + */ + +/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces + * \ingroup flac + * + * \brief + * This module provides functions for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in native FLAC files. + * Note that currently only the Chain interface (level 2) supports Ogg + * FLAC files, and it is read-only i.e. no writing back changed + * metadata to file. + * + * There are three metadata interfaces of increasing complexity: + * + * Level 0: + * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and + * PICTURE blocks. + * + * Level 1: + * Read-write access to all metadata blocks. This level is write- + * efficient in most cases (more on this below), and uses less memory + * than level 2. + * + * Level 2: + * Read-write access to all metadata blocks. This level is write- + * efficient in all cases, but uses more memory since all metadata for + * the whole file is read into memory and manipulated before writing + * out again. + * + * What do we mean by efficient? Since FLAC metadata appears at the + * beginning of the file, when writing metadata back to a FLAC file + * it is possible to grow or shrink the metadata such that the entire + * file must be rewritten. However, if the size remains the same during + * changes or PADDING blocks are utilized, only the metadata needs to be + * overwritten, which is much faster. + * + * Efficient means the whole file is rewritten at most one time, and only + * when necessary. Level 1 is not efficient only in the case that you + * cause more than one metadata block to grow or shrink beyond what can + * be accomodated by padding. In this case you should probably use level + * 2, which allows you to edit all the metadata for a file in memory and + * write it out all at once. + * + * All levels know how to skip over and not disturb an ID3v2 tag at the + * front of the file. + * + * All levels access files via their filenames. In addition, level 2 + * has additional alternative read and write functions that take an I/O + * handle and callbacks, for situations where access by filename is not + * possible. + * + * In addition to the three interfaces, this module defines functions for + * creating and manipulating various metadata objects in memory. As we see + * from the Format module, FLAC metadata blocks in memory are very primitive + * structures for storing information in an efficient way. Reading + * information from the structures is easy but creating or modifying them + * directly is more complex. The metadata object routines here facilitate + * this by taking care of the consistency and memory management drudgery. + * + * Unless you will be using the level 1 or 2 interfaces to modify existing + * metadata however, you will not probably not need these. + * + * From a dependency standpoint, none of the encoders or decoders require + * the metadata module. This is so that embedded users can strip out the + * metadata module from libFLAC to reduce the size and complexity. + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface + * \ingroup flac_metadata + * + * \brief + * The level 0 interface consists of individual routines to read the + * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring + * only a filename. + * + * They try to skip any ID3v2 tag at the head of the file. + * + * \{ + */ + +/** Read the STREAMINFO metadata block of the given FLAC file. This function + * will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param streaminfo A pointer to space for the STREAMINFO block. Since + * FLAC__StreamMetadata is a simple structure with no + * memory allocation involved, you pass the address of + * an existing structure. It need not be initialized. + * \assert + * \code filename != NULL \endcode + * \code streaminfo != NULL \endcode + * \retval FLAC__bool + * \c true if a valid STREAMINFO block was read from \a filename. Returns + * \c false if there was a memory allocation error, a file decoder error, + * or the file contained no STREAMINFO block. (A memory allocation error + * is possible because this function must set up a file decoder.) + */ +FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); + +/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param tags The address where the returned pointer will be + * stored. The \a tags object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code tags != NULL \endcode + * \retval FLAC__bool + * \c true if a valid VORBIS_COMMENT block was read from \a filename, + * and \a *tags will be set to the address of the metadata structure. + * Returns \c false if there was a memory allocation error, a file + * decoder error, or the file contained no VORBIS_COMMENT block, and + * \a *tags will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); + +/** Read the CUESHEET metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * + * \param filename The path to the FLAC file to read. + * \param cuesheet The address where the returned pointer will be + * stored. The \a cuesheet object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \assert + * \code filename != NULL \endcode + * \code cuesheet != NULL \endcode + * \retval FLAC__bool + * \c true if a valid CUESHEET block was read from \a filename, + * and \a *cuesheet will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no CUESHEET + * block, and \a *cuesheet will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); + +/** Read a PICTURE metadata block of the given FLAC file. This + * function will try to skip any ID3v2 tag at the head of the file. + * Since there can be more than one PICTURE block in a file, this + * function takes a number of parameters that act as constraints to + * the search. The PICTURE block with the largest area matching all + * the constraints will be returned, or \a *picture will be set to + * \c NULL if there was no such block. + * + * \param filename The path to the FLAC file to read. + * \param picture The address where the returned pointer will be + * stored. The \a picture object must be deleted by + * the caller using FLAC__metadata_object_delete(). + * \param type The desired picture type. Use \c -1 to mean + * "any type". + * \param mime_type The desired MIME type, e.g. "image/jpeg". The + * string will be matched exactly. Use \c NULL to + * mean "any MIME type". + * \param description The desired description. The string will be + * matched exactly. Use \c NULL to mean "any + * description". + * \param max_width The maximum width in pixels desired. Use + * \c (unsigned)(-1) to mean "any width". + * \param max_height The maximum height in pixels desired. Use + * \c (unsigned)(-1) to mean "any height". + * \param max_depth The maximum color depth in bits-per-pixel desired. + * Use \c (unsigned)(-1) to mean "any depth". + * \param max_colors The maximum number of colors desired. Use + * \c (unsigned)(-1) to mean "any number of colors". + * \assert + * \code filename != NULL \endcode + * \code picture != NULL \endcode + * \retval FLAC__bool + * \c true if a valid PICTURE block was read from \a filename, + * and \a *picture will be set to the address of the metadata + * structure. Returns \c false if there was a memory allocation + * error, a file decoder error, or the file contained no PICTURE + * block, and \a *picture will be set to \c NULL. + */ +FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); + +/* \} */ + + +/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface + * \ingroup flac_metadata + * + * \brief + * The level 1 interface provides read-write access to FLAC file metadata and + * operates directly on the FLAC file. + * + * The general usage of this interface is: + * + * - Create an iterator using FLAC__metadata_simple_iterator_new() + * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check + * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to + * see if the file is writable, or only read access is allowed. + * - Use FLAC__metadata_simple_iterator_next() and + * FLAC__metadata_simple_iterator_prev() to traverse the blocks. + * This is does not read the actual blocks themselves. + * FLAC__metadata_simple_iterator_next() is relatively fast. + * FLAC__metadata_simple_iterator_prev() is slower since it needs to search + * forward from the front of the file. + * - Use FLAC__metadata_simple_iterator_get_block_type() or + * FLAC__metadata_simple_iterator_get_block() to access the actual data at + * the current iterator position. The returned object is yours to modify + * and free. + * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block + * back. You must have write permission to the original file. Make sure to + * read the whole comment to FLAC__metadata_simple_iterator_set_block() + * below. + * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. + * Use the object creation functions from + * \link flac_metadata_object here \endlink to generate new objects. + * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block + * currently referred to by the iterator, or replace it with padding. + * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when + * finished. + * + * \note + * The FLAC file remains open the whole time between + * FLAC__metadata_simple_iterator_init() and + * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering + * the file during this time. + * + * \note + * Do not modify the \a is_last, \a length, or \a type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * If any of the modification functions + * (FLAC__metadata_simple_iterator_set_block(), + * FLAC__metadata_simple_iterator_delete_block(), + * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, + * you should delete the iterator as it may no longer be valid. + * + * \{ + */ + +struct FLAC__Metadata_SimpleIterator; +/** The opaque structure definition for the level 1 iterator type. + * See the + * \link flac_metadata_level1 metadata level 1 module \endlink + * for a detailed description. + */ +typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; + +/** Status type for FLAC__Metadata_SimpleIterator. + * + * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). + */ +typedef enum { + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, + /**< The iterator is in the normal OK state */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, + /**< The iterator could not open the target file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, + /**< The iterator could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, + /**< The iterator tried to write to a file that was not writable */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, + /**< The iterator encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, + /**< The iterator encountered an error while reading the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, + /**< The iterator encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, + /**< The iterator encountered an error while writing the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, + /**< The iterator encountered an error renaming the FLAC file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, + /**< The iterator encountered an error removing the temporary file */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR + /**< The caller violated an assertion or an unexpected error occurred */ + +} FLAC__Metadata_SimpleIteratorStatus; + +/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. + * + * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; + + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_SimpleIterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); + +/** Get the current status of the iterator. Call this after a function + * returns \c false to get the reason for the error. Also resets the status + * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__Metadata_SimpleIteratorStatus + * The current status of the iterator. + */ +FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given FLAC file. + * + * \param iterator A pointer to an existing iterator. + * \param filename The path to the FLAC file. + * \param read_only If \c true, the FLAC file will be opened + * in read-only mode; if \c false, the FLAC + * file will be opened for edit even if no + * edits are performed. + * \param preserve_file_stats If \c true, the owner and modification + * time will be preserved even if the FLAC + * file is written to. + * \assert + * \code iterator != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c false if a memory allocation error occurs, the file can't be + * opened, or another error occurs, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); + +/** Returns \c true if the FLAC file is writable. If \c false, calls to + * FLAC__metadata_simple_iterator_set_block() and + * FLAC__metadata_simple_iterator_insert_block_after() will fail. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); + +/** Returns a flag telling if the current metadata block is the last. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the current metadata block is the last in the file, + * else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the offset of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval off_t + * The offset of the metadata block at the current iterator position. + * This is the byte offset relative to the beginning of the file of + * the current metadata block's header. + */ +FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the type of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the length of the metadata block at the current position. This + * avoids reading the actual block data which can save time for large + * blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval unsigned + * The length of the metadata block at the current iterator position. + * The is same length as that in the + * metadata block header, + * i.e. the length of the metadata body that follows the header. + */ +FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); + +/** Get the application ID of the \c APPLICATION block at the current + * position. This avoids reading the actual block data which can save + * time for large blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \param id A pointer to a buffer of at least \c 4 bytes where + * the ID will be stored. + * \assert + * \code iterator != NULL \endcode + * \code id != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the ID was successfully read, else \c false, in which + * case you should check FLAC__metadata_simple_iterator_status() to + * find out why. If the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the + * current metadata block is not an \c APPLICATION block. Otherwise + * if the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error + * occurred and the iterator can no longer be used. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); + +/** Get the metadata block at the current position. You can modify the + * block but must use FLAC__metadata_simple_iterator_set_block() to + * write it back to the FLAC file. + * + * You must call FLAC__metadata_object_delete() on the returned object + * when you are finished with it. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block, or \c NULL if there was a memory + * allocation error. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); + +/** Write a block back to the FLAC file. This function tries to be + * as efficient as possible; how the block is actually written is + * shown by the following: + * + * Existing block is a STREAMINFO block and the new block is a + * STREAMINFO block: the new block is written in place. Make sure + * you know what you're doing when changing the values of a + * STREAMINFO block. + * + * Existing block is a STREAMINFO block and the new block is a + * not a STREAMINFO block: this is an error since the first block + * must be a STREAMINFO block. Returns \c false without altering the + * file. + * + * Existing block is not a STREAMINFO block and the new block is a + * STREAMINFO block: this is an error since there may be only one + * STREAMINFO block. Returns \c false without altering the file. + * + * Existing block and new block are the same length: the existing + * block will be replaced by the new block, written in place. + * + * Existing block is longer than new block: if use_padding is \c true, + * the existing block will be overwritten in place with the new + * block followed by a PADDING block, if possible, to make the total + * size the same as the existing block. Remember that a padding + * block requires at least four bytes so if the difference in size + * between the new block and existing block is less than that, the + * entire file will have to be rewritten, using the new block's + * exact size. If use_padding is \c false, the entire file will be + * rewritten, replacing the existing block by the new block. + * + * Existing block is shorter than new block: if use_padding is \c true, + * the function will try and expand the new block into the following + * PADDING block, if it exists and doing so won't shrink the PADDING + * block to less than 4 bytes. If there is no following PADDING + * block, or it will shrink to less than 4 bytes, or use_padding is + * \c false, the entire file is rewritten, replacing the existing block + * with the new block. Note that in this case any following PADDING + * block is preserved as is. + * + * After writing the block, the iterator will remain in the same + * place, i.e. pointing to the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** This is similar to FLAC__metadata_simple_iterator_set_block() + * except that instead of writing over an existing block, it appends + * a block after the existing block. \a use_padding is again used to + * tell the function to try an expand into following padding in an + * attempt to avoid rewriting the entire file. + * + * This function will fail and return \c false if given a STREAMINFO + * block. + * + * After writing the block, the iterator will be pointing to the + * new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block The block to set. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); + +/** Deletes the block at the current position. This will cause the + * entire FLAC file to be rewritten, unless \a use_padding is \c true, + * in which case the block will be replaced by an equal-sized PADDING + * block. The iterator will be left pointing to the block before the + * one just deleted. + * + * You may not delete the STREAMINFO block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param use_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); + +/* \} */ + + +/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface + * \ingroup flac_metadata + * + * \brief + * The level 2 interface provides read-write access to FLAC file metadata; + * all metadata is read into memory, operated on in memory, and then written + * to file, which is more efficient than level 1 when editing multiple blocks. + * + * Currently Ogg FLAC is supported for read only, via + * FLAC__metadata_chain_read_ogg() but a subsequent + * FLAC__metadata_chain_write() will fail. + * + * The general usage of this interface is: + * + * - Create a new chain using FLAC__metadata_chain_new(). A chain is a + * linked list of FLAC metadata blocks. + * - Read all metadata into the the chain from a FLAC file using + * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and + * check the status. + * - Optionally, consolidate the padding using + * FLAC__metadata_chain_merge_padding() or + * FLAC__metadata_chain_sort_padding(). + * - Create a new iterator using FLAC__metadata_iterator_new() + * - Initialize the iterator to point to the first element in the chain + * using FLAC__metadata_iterator_init() + * - Traverse the chain using FLAC__metadata_iterator_next and + * FLAC__metadata_iterator_prev(). + * - Get a block for reading or modification using + * FLAC__metadata_iterator_get_block(). The pointer to the object + * inside the chain is returned, so the block is yours to modify. + * Changes will be reflected in the FLAC file when you write the + * chain. You can also add and delete blocks (see functions below). + * - When done, write out the chain using FLAC__metadata_chain_write(). + * Make sure to read the whole comment to the function below. + * - Delete the chain using FLAC__metadata_chain_delete(). + * + * \note + * Even though the FLAC file is not open while the chain is being + * manipulated, you must not alter the file externally during + * this time. The chain assumes the FLAC file will not change + * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() + * and FLAC__metadata_chain_write(). + * + * \note + * Do not modify the is_last, length, or type fields of returned + * FLAC__StreamMetadata objects. These are managed automatically. + * + * \note + * The metadata objects returned by FLAC__metadata_iterator_get_block() + * are owned by the chain; do not FLAC__metadata_object_delete() them. + * In the same way, blocks passed to FLAC__metadata_iterator_set_block() + * become owned by the chain and they will be deleted when the chain is + * deleted. + * + * \{ + */ + +struct FLAC__Metadata_Chain; +/** The opaque structure definition for the level 2 chain type. + */ +typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; + +struct FLAC__Metadata_Iterator; +/** The opaque structure definition for the level 2 iterator type. + */ +typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; + +typedef enum { + FLAC__METADATA_CHAIN_STATUS_OK = 0, + /**< The chain is in the normal OK state */ + + FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, + /**< The data passed into a function violated the function's usage criteria */ + + FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, + /**< The chain could not open the target file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, + /**< The chain could not find the FLAC signature at the start of the file */ + + FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, + /**< The chain tried to write to a file that was not writable */ + + FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, + /**< The chain encountered input that does not conform to the FLAC metadata specification */ + + FLAC__METADATA_CHAIN_STATUS_READ_ERROR, + /**< The chain encountered an error while reading the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, + /**< The chain encountered an error while seeking in the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, + /**< The chain encountered an error while writing the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, + /**< The chain encountered an error renaming the FLAC file */ + + FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, + /**< The chain encountered an error removing the temporary file */ + + FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, + /**< Memory allocation failed */ + + FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, + /**< The caller violated an assertion or an unexpected error occurred */ + + FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, + /**< One or more of the required callbacks was NULL */ + + FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, + /**< FLAC__metadata_chain_write() was called on a chain read by + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * or + * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() + * was called on a chain read by + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Matching read/write methods must always be used. */ + + FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL + /**< FLAC__metadata_chain_write_with_callbacks() was called when the + * chain write requires a tempfile; use + * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. + * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was + * called when the chain write does not require a tempfile; use + * FLAC__metadata_chain_write_with_callbacks() instead. + * Always check FLAC__metadata_chain_check_if_tempfile_needed() + * before writing via callbacks. */ + +} FLAC__Metadata_ChainStatus; + +/** Maps a FLAC__Metadata_ChainStatus to a C string. + * + * Using a FLAC__Metadata_ChainStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; + +/*********** FLAC__Metadata_Chain ***********/ + +/** Create a new chain instance. + * + * \retval FLAC__Metadata_Chain* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); + +/** Free a chain instance. Deletes the object pointed to by \a chain. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); + +/** Get the current status of the chain. Call this after a function + * returns \c false to get the reason for the error. Also resets the + * status to FLAC__METADATA_CHAIN_STATUS_OK. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__Metadata_ChainStatus + * The current status of the chain. + */ +FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); + +/** Read all metadata from a FLAC file into the chain. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from an Ogg FLAC file into the chain. + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param filename The path to the Ogg FLAC file to read. + * \assert + * \code chain != NULL \endcode + * \code filename != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a filename, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); + +/** Read all metadata from a FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. + * + * The \a handle need only be open for reading, but must be seekable. + * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * \note Ogg FLAC metadata data writing is not supported yet and + * FLAC__metadata_chain_write() will fail. + * + * \param chain A pointer to an existing chain. + * \param handle The I/O handle of the Ogg FLAC stream to read. The + * handle will NOT be closed after the metadata is read; + * that is the duty of the caller. + * \param callbacks + * A set of callbacks to use for I/O. The mandatory + * callbacks are \a read, \a seek, and \a tell. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if a valid list of metadata blocks was read from + * \a handle, else \c false. On failure, check the status with + * FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Checks if writing the given chain would require the use of a + * temporary file, or if it could be written in place. + * + * Under certain conditions, padding can be utilized so that writing + * edited metadata back to the FLAC file does not require rewriting the + * entire file. If rewriting is required, then a temporary workfile is + * required. When writing metadata using callbacks, you must check + * this function to know whether to call + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When + * writing with FLAC__metadata_chain_write(), the temporary file is + * handled internally. + * + * \param chain A pointer to an existing chain. + * \param use_padding + * Whether or not padding will be allowed to be used + * during the write. The value of \a use_padding given + * here must match the value later passed to + * FLAC__metadata_chain_write_with_callbacks() or + * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if writing the current chain would require a tempfile, or + * \c false if metadata can be written in place. + */ +FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); + +/** Write all metadata out to the FLAC file. This function tries to be as + * efficient as possible; how the metadata is actually written is shown by + * the following: + * + * If the current chain is the same size as the existing metadata, the new + * data is written in place. + * + * If the current chain is longer than the existing metadata, and + * \a use_padding is \c true, and the last block is a PADDING block of + * sufficient length, the function will truncate the final padding block + * so that the overall size of the metadata is the same as the existing + * metadata, and then just rewrite the metadata. Otherwise, if not all of + * the above conditions are met, the entire FLAC file must be rewritten. + * If you want to use padding this way it is a good idea to call + * FLAC__metadata_chain_sort_padding() first so that you have the maximum + * amount of padding to work with, unless you need to preserve ordering + * of the PADDING blocks for some reason. + * + * If the current chain is shorter than the existing metadata, and + * \a use_padding is \c true, and the final block is a PADDING block, the padding + * is extended to make the overall size the same as the existing data. If + * \a use_padding is \c true and the last block is not a PADDING block, a new + * PADDING block is added to the end of the new data to make it the same + * size as the existing data (if possible, see the note to + * FLAC__metadata_simple_iterator_set_block() about the four byte limit) + * and the new data is written in place. If none of the above apply or + * \a use_padding is \c false, the entire FLAC file is rewritten. + * + * If \a preserve_file_stats is \c true, the owner and modification time will + * be preserved even if the FLAC file is written. + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). + * + * \param chain A pointer to an existing chain. + * \param use_padding See above. + * \param preserve_file_stats See above. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * The \a handle must be open for updating and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" + * for Windows). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c false. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O. The mandatory + * callbacks are \a write and \a seek. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); + +/** Write all metadata out to a FLAC stream via callbacks. + * + * (See FLAC__metadata_chain_write() for the details on how padding is + * used to write metadata in place if possible.) + * + * This version of the write-with-callbacks function must be used when + * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In + * this function, you must supply an I/O handle corresponding to the + * FLAC file to edit, and a temporary handle to which the new FLAC + * file will be written. It is the caller's job to move this temporary + * FLAC file on top of the original FLAC file to complete the metadata + * edit. + * + * The \a handle must be open for reading and be seekable. The + * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" + * for Windows). + * + * The \a temp_handle must be open for writing. The + * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" + * for Windows). It should be an empty stream, or at least positioned + * at the start-of-file (in which case it is the caller's duty to + * truncate it on return). + * + * For this write function to be used, the chain must have been read with + * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), + * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). + * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned + * \c true. + * + * \param chain A pointer to an existing chain. + * \param use_padding See FLAC__metadata_chain_write() + * \param handle The I/O handle of the original FLAC stream to read. + * The handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param callbacks A set of callbacks to use for I/O on \a handle. + * The mandatory callbacks are \a read, \a seek, and + * \a eof. + * \param temp_handle The I/O handle of the FLAC stream to write. The + * handle will NOT be closed after the metadata is + * written; that is the duty of the caller. + * \param temp_callbacks + * A set of callbacks to use for I/O on temp_handle. + * The only mandatory callback is \a write. + * \assert + * \code chain != NULL \endcode + * \retval FLAC__bool + * \c true if the write succeeded, else \c false. On failure, + * check the status with FLAC__metadata_chain_status(). + */ +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); + +/** Merge adjacent PADDING blocks into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); + +/** This function will move all PADDING blocks to the end on the metadata, + * then merge them into a single block. + * + * \note This function does not write to the FLAC file, it only + * modifies the chain. + * + * \warning Any iterator on the current chain will become invalid after this + * call. You should delete the iterator and get a new one. + * + * \param chain A pointer to an existing chain. + * \assert + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); + + +/*********** FLAC__Metadata_Iterator ***********/ + +/** Create a new iterator instance. + * + * \retval FLAC__Metadata_Iterator* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); + +/** Free an iterator instance. Deletes the object pointed to by \a iterator. + * + * \param iterator A pointer to an existing iterator. + * \assert + * \code iterator != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); + +/** Initialize the iterator to point to the first metadata block in the + * given chain. + * + * \param iterator A pointer to an existing iterator. + * \param chain A pointer to an existing and initialized (read) chain. + * \assert + * \code iterator != NULL \endcode + * \code chain != NULL \endcode + */ +FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); + +/** Moves the iterator forward one metadata block, returning \c false if + * already at the end. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the last metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); + +/** Moves the iterator backward one metadata block, returning \c false if + * already at the beginning. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if already at the first metadata block of the chain, else + * \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); + +/** Get the type of the metadata block at the current position. + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__MetadataType + * The type of the metadata block at the current iterator position. + */ +FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); + +/** Get the metadata block at the current position. You can modify + * the block in place but must write the chain before the changes + * are reflected to the FLAC file. You do not need to call + * FLAC__metadata_iterator_set_block() to reflect the changes; + * the pointer returned by FLAC__metadata_iterator_get_block() + * points directly into the chain. + * + * \warning + * Do not call FLAC__metadata_object_delete() on the returned object; + * to delete a block use FLAC__metadata_iterator_delete_block(). + * + * \param iterator A pointer to an existing initialized iterator. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__StreamMetadata* + * The current metadata block. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); + +/** Set the metadata block at the current position, replacing the existing + * block. The new block passed in becomes owned by the chain and it will be + * deleted when the chain is deleted. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \code block != NULL \endcode + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Removes the current block from the chain. If \a replace_with_padding is + * \c true, the block will instead be replaced with a padding block of equal + * size. You can not delete the STREAMINFO block. The iterator will be + * left pointing to the block before the one just "deleted", even if + * \a replace_with_padding is \c true. + * + * \param iterator A pointer to an existing initialized iterator. + * \param replace_with_padding See above. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, + * otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); + +/** Insert a new block before the current block. You cannot insert a block + * before the first STREAMINFO block. You cannot insert a STREAMINFO block + * as there can be only one, the one that already exists at the head when you + * read in a chain. The chain takes ownership of the new block and it will be + * deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/** Insert a new block after the current block. You cannot insert a STREAMINFO + * block as there can be only one, the one that already exists at the head when + * you read in a chain. The chain takes ownership of the new block and it will + * be deleted when the chain is deleted. The iterator will be left pointing to + * the new block. + * + * \param iterator A pointer to an existing initialized iterator. + * \param block A pointer to a metadata block to insert. + * \assert + * \code iterator != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_iterator_init() + * \retval FLAC__bool + * \c false if the conditions in the above description are not met, or + * a memory allocation error occurs, otherwise \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); + +/* \} */ + + +/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods + * \ingroup flac_metadata + * + * \brief + * This module contains methods for manipulating FLAC metadata objects. + * + * Since many are variable length we have to be careful about the memory + * management. We decree that all pointers to data in the object are + * owned by the object and memory-managed by the object. + * + * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() + * functions to create all instances. When using the + * FLAC__metadata_object_set_*() functions to set pointers to data, set + * \a copy to \c true to have the function make it's own copy of the data, or + * to \c false to give the object ownership of your data. In the latter case + * your pointer must be freeable by free() and will be free()d when the object + * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as + * the data pointer to a FLAC__metadata_object_set_*() function as long as + * the length argument is 0 and the \a copy argument is \c false. + * + * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function + * will return \c NULL in the case of a memory allocation error, otherwise a new + * object. The FLAC__metadata_object_set_*() functions return \c false in the + * case of a memory allocation error. + * + * We don't have the convenience of C++ here, so note that the library relies + * on you to keep the types straight. In other words, if you pass, for + * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to + * FLAC__metadata_object_application_set_data(), you will get an assertion + * failure. + * + * For convenience the FLAC__metadata_object_vorbiscomment_*() functions + * maintain a trailing NUL on each Vorbis comment entry. This is not counted + * toward the length or stored in the stream, but it can make working with plain + * comments (those that don't contain embedded-NULs in the value) easier. + * Entries passed into these functions have trailing NULs added if missing, and + * returned entries are guaranteed to have a trailing NUL. + * + * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis + * comment entry/name/value will first validate that it complies with the Vorbis + * comment specification and return false if it does not. + * + * There is no need to recalculate the length field on metadata blocks you + * have modified. They will be calculated automatically before they are + * written back to a file. + * + * \{ + */ + + +/** Create a new metadata object instance of the given type. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0, + * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have + * the vendor string set (but zero comments). + * + * Do not pass in a value greater than or equal to + * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're + * doing. + * + * \param type Type of object to create + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory or the type code is + * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); + +/** Create a copy of an existing metadata object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new block and + * is responsible for freeing it with FLAC__metadata_object_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); + +/** Free a metadata object. Deletes the object pointed to by \a object. + * + * The delete is a "deep" delete, i.e. dynamically allocated data within the + * object is also deleted. + * + * \param object A pointer to an existing object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); + +/** Compares two metadata objects. + * + * The compare is "deep", i.e. dynamically allocated data within the + * object is also compared. + * + * \param block1 A pointer to an existing object. + * \param block2 A pointer to an existing object. + * \assert + * \code block1 != NULL \endcode + * \code block2 != NULL \endcode + * \retval FLAC__bool + * \c true if objects are identical, else \c false. + */ +FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); + +/** Sets the application data of an APPLICATION block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. The existing data will be freed if this + * function is successful, otherwise the original data will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing APPLICATION object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); + +/** Resize the seekpoint array. + * + * If the size shrinks, elements will truncated; if it grows, new placeholder + * points will be added to the end. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param new_num_points The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || + * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); + +/** Set a seekpoint in a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + */ +FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Insert a seekpoint into a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \param point The point to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points >= point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); + +/** Delete a seekpoint from a seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param point_num Index into seekpoint array to set. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code object->data.seek_table.num_points > point_num \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); + +/** Check a seektable to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * seektable. + * + * \param object A pointer to an existing SEEKTABLE object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if seek table is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); + +/** Append a number of placeholder points to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); + +/** Append a specific seek point template to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_number The sample number of the seek point template. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); + +/** Append specific seek point templates to the end of a seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param sample_numbers An array of sample numbers for the seek points. + * \param num The number of seek point templates to append. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param num The number of placeholder points to append. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced approximately + * \a total_samples / \a num samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); + +/** Append a set of evenly-spaced seek point templates to the end of a + * seek table. + * + * \note + * As with the other ..._seektable_template_... functions, you should + * call FLAC__metadata_object_seektable_template_sort() when finished + * to make the seek table legal. + * + * \param object A pointer to an existing SEEKTABLE object. + * \param samples The number of samples apart to space the placeholder + * points. The first point will be at sample \c 0, the + * second at sample \a samples, then 2*\a samples, and + * so on. As long as \a samples and \a total_samples + * are greater than \c 0, there will always be at least + * one seekpoint at sample \c 0. + * \param total_samples The total number of samples to be encoded; + * the seekpoints will be spaced + * \a samples samples apart. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \code samples > 0 \endcode + * \code total_samples > 0 \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); + +/** Sort a seek table's seek points according to the format specification, + * removing duplicates. + * + * \param object A pointer to a seek table to be sorted. + * \param compact If \c false, behaves like FLAC__format_seektable_sort(). + * If \c true, duplicates are deleted and the seek table is + * shrunk appropriately; the number of placeholder points + * present in the seek table will be the same after the call + * as before. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); + +/** Sets the vendor string in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The entry to set the vendor string to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Resize the comment array. + * + * If the size shrinks, elements will truncated; if it grows, new empty + * fields will be added to the end. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param new_num_comments The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || + * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); + +/** Sets a comment in a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num Index into comment array to set. + * \param entry The entry to set the comment to. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code comment_num < object->data.vorbis_comment.num_comments \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Insert a comment in a VORBIS_COMMENT block at the given index. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index at which to insert the comment. The comments + * at and after \a comment_num move right one position. + * To append a comment to the end, set \a comment_num to + * \c object->data.vorbis_comment.num_comments . + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments >= comment_num \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Appends a comment to a VORBIS_COMMENT block. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); + +/** Replaces comments in a VORBIS_COMMENT block with a new one. + * + * For convenience, a trailing NUL is added to the entry if it doesn't have + * one already. + * + * Depending on the the value of \a all, either all or just the first comment + * whose field name(s) match the given entry's name will be replaced by the + * given entry. If no comments match, \a entry will simply be appended. + * + * If \a copy is \c true, a copy of the entry is stored; otherwise, the object + * takes ownership of the \c entry.entry pointer. + * + * \note If this function returns \c false, the caller still owns the + * pointer. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param entry The comment to insert. + * \param all If \c true, all comments whose field name matches + * \a entry's field name will be removed, and \a entry will + * be inserted at the position of the first matching + * comment. If \c false, only the first comment whose + * field name matches \a entry's field name will be + * replaced with \a entry. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code (entry.entry != NULL && entry.length > 0) || + * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); + +/** Delete a comment in a VORBIS_COMMENT block at the given index. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param comment_num The index of the comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code object->data.vorbis_comment.num_comments > comment_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); + +/** Creates a Vorbis comment entry from NUL-terminated name and value strings. + * + * On return, the filled-in \a entry->entry pointer will point to malloc()ed + * memory and shall be owned by the caller. For convenience the entry will + * have a terminating NUL. + * + * \param entry A pointer to a Vorbis comment entry. The entry's + * \c entry pointer should not point to allocated + * memory as it will be overwritten. + * \param field_name The field name in ASCII, \c NUL terminated. + * \param field_value The field value in UTF-8, \c NUL terminated. + * \assert + * \code entry != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if malloc() fails, or if \a field_name or \a field_value does + * not comply with the Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); + +/** Splits a Vorbis comment entry into NUL-terminated name and value strings. + * + * The returned pointers to name and value will be allocated by malloc() + * and shall be owned by the caller. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The address of where the returned pointer to the + * field name will be stored. + * \param field_value The address of where the returned pointer to the + * field value will be stored. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \code memchr(entry.entry, '=', entry.length) != NULL \endcode + * \code field_name != NULL \endcode + * \code field_value != NULL \endcode + * \retval FLAC__bool + * \c false if memory allocation fails or \a entry does not comply with the + * Vorbis comment specification, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); + +/** Check if the given Vorbis comment entry's field name matches the given + * field name. + * + * \param entry An existing Vorbis comment entry. + * \param field_name The field name to check. + * \param field_name_length The length of \a field_name, not including the + * terminating \c NUL. + * \assert + * \code (entry.entry != NULL && entry.length > 0) \endcode + * \retval FLAC__bool + * \c true if the field names match, else \c false + */ +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); + +/** Find a Vorbis comment with the given field name. + * + * The search begins at entry number \a offset; use an offset of 0 to + * search from the beginning of the comment array. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param offset The offset into the comment array from where to start + * the search. + * \param field_name The field name of the comment to find. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \code field_name != NULL \endcode + * \retval int + * The offset in the comment array of the first comment whose field + * name matches \a field_name, or \c -1 if no match was found. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); + +/** Remove first Vorbis comment matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comment to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * \c 1 for one matching entry deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Remove all Vorbis comments matching the given field name. + * + * \param object A pointer to an existing VORBIS_COMMENT object. + * \param field_name The field name of comments to delete. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode + * \retval int + * \c -1 for memory allocation error, \c 0 for no matching entries, + * else the number of matching entries deleted. + */ +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); + +/** Create a new CUESHEET track instance. + * + * The object will be "empty"; i.e. values and data pointers will be \c 0. + * + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); + +/** Create a copy of an existing CUESHEET track object. + * + * The copy is a "deep" copy, i.e. dynamically allocated data within the + * object is also copied. The caller takes ownership of the new object and + * is responsible for freeing it with + * FLAC__metadata_object_cuesheet_track_delete(). + * + * \param object Pointer to object to copy. + * \assert + * \code object != NULL \endcode + * \retval FLAC__StreamMetadata_CueSheet_Track* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); + +/** Delete a CUESHEET track object + * + * \param object A pointer to an existing CUESHEET track object. + * \assert + * \code object != NULL \endcode + */ +FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); + +/** Resize a track's index point array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * indices will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param new_num_indices The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || + * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); + +/** Insert an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \param index The index point to insert. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); + +/** Insert a blank index point in a CUESHEET track at the given index. + * + * A blank index point is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index of the track to modify. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param index_num The index into the track's index array at which to + * insert the index point. NOTE: this is not necessarily + * the same as the index point's \a number field. The + * indices at and after \a index_num move right one + * position. To append an index point to the end, set + * \a index_num to + * \c object->data.cue_sheet.tracks[track_num].num_indices . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Delete an index point in a CUESHEET track at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * modify. NOTE: this is not necessarily the same + * as the track's \a number field. + * \param index_num The index into the track's index array of the index + * to delete. NOTE: this is not necessarily the same + * as the index's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); + +/** Resize the track array. + * + * If the size shrinks, elements will truncated; if it grows, new blank + * tracks will be added to the end. + * + * \param object A pointer to an existing CUESHEET object. + * \param new_num_tracks The desired length of the array; may be \c 0. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || + * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode + * \retval FLAC__bool + * \c false if memory allocation error, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); + +/** Sets a track in a CUESHEET block. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num Index into track array to set. NOTE: this is not + * necessarily the same as the track's \a number field. + * \param track The track to set the track to. You may safely pass in + * a const pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code track_num < object->data.cue_sheet.num_tracks \endcode + * \code (track->indices != NULL && track->num_indices > 0) || + * (track->indices == NULL && track->num_indices == 0) + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a track in a CUESHEET block at the given index. + * + * If \a copy is \c true, a copy of the track is stored; otherwise, the object + * takes ownership of the \a track pointer. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \param track The track to insert. You may safely pass in a const + * pointer if \a copy is \c true. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); + +/** Insert a blank track in a CUESHEET block at the given index. + * + * A blank track is one in which all field values are zero. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index at which to insert the track. NOTE: this + * is not necessarily the same as the track's \a number + * field. The tracks at and after \a track_num move right + * one position. To append a track to the end, set + * \a track_num to \c object->data.cue_sheet.num_tracks . + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks >= track_num \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Delete a track in a CUESHEET block at the given index. + * + * \param object A pointer to an existing CUESHEET object. + * \param track_num The index into the track array of the track to + * delete. NOTE: this is not necessarily the same + * as the track's \a number field. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \code object->data.cue_sheet.num_tracks > track_num \endcode + * \retval FLAC__bool + * \c false if realloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); + +/** Check a cue sheet to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * cue sheet. + * + * \param object A pointer to an existing CUESHEET object. + * \param check_cd_da_subset If \c true, check CUESHEET against more + * stringent requirements for a CD-DA (audio) disc. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__bool + * \c false if cue sheet is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); + +/** Calculate and return the CDDB/freedb ID for a cue sheet. The function + * assumes the cue sheet corresponds to a CD; the result is undefined + * if the cuesheet's is_cd bit is not set. + * + * \param object A pointer to an existing CUESHEET object. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode + * \retval FLAC__uint32 + * The unsigned integer representation of the CDDB/freedb ID + */ +FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); + +/** Sets the MIME type of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param mime_type A pointer to the MIME type string. The string must be + * ASCII characters 0x20-0x7e, NUL-terminated. No validation + * is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (mime_type != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); + +/** Sets the description of a PICTURE block. + * + * If \a copy is \c true, a copy of the string is stored; otherwise, the object + * takes ownership of the pointer. The existing string will be freed if this + * function is successful, otherwise the original string will remain if \a copy + * is \c true and malloc() fails. + * + * \note It is safe to pass a const pointer to \a description if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param description A pointer to the description string. The string must be + * valid UTF-8, NUL-terminated. No validation is done. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (description != NULL) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); + +/** Sets the picture data of a PICTURE block. + * + * If \a copy is \c true, a copy of the data is stored; otherwise, the object + * takes ownership of the pointer. Also sets the \a data_length field of the + * metadata object to what is passed in as the \a length parameter. The + * existing data will be freed if this function is successful, otherwise the + * original data and data_length will remain if \a copy is \c true and + * malloc() fails. + * + * \note It is safe to pass a const pointer to \a data if \a copy is \c true. + * + * \param object A pointer to an existing PICTURE object. + * \param data A pointer to the data to set. + * \param length The length of \a data in bytes. + * \param copy See above. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \code (data != NULL && length > 0) || + * (data == NULL && length == 0 && copy == false) \endcode + * \retval FLAC__bool + * \c false if \a copy is \c true and malloc() fails, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); + +/** Check a PICTURE block to see if it conforms to the FLAC specification. + * See the format specification for limits on the contents of the + * PICTURE block. + * + * \param object A pointer to existing PICTURE block to be checked. + * \param violation Address of a pointer to a string. If there is a + * violation, a pointer to a string explanation of the + * violation will be returned here. \a violation may be + * \c NULL if you don't need the returned string. Do not + * free the returned string; it will always point to static + * data. + * \assert + * \code object != NULL \endcode + * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode + * \retval FLAC__bool + * \c false if PICTURE block is illegal, else \c true. + */ +FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/ordinals.h mame-0.145/src/lib/libflac/include/flac/ordinals.h --- mame-0.144/src/lib/libflac/include/flac/ordinals.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/ordinals.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,83 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__ORDINALS_H +#define FLAC__ORDINALS_H + +#if !(defined(_MSC_VER) || defined(__BORLANDC__) || defined(__EMX__)) +#include +#endif + +typedef signed char FLAC__int8; +typedef unsigned char FLAC__uint8; + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int16 FLAC__int16; +typedef __int32 FLAC__int32; +typedef __int64 FLAC__int64; +typedef unsigned __int16 FLAC__uint16; +typedef unsigned __int32 FLAC__uint32; +typedef unsigned __int64 FLAC__uint64; +#elif defined(__EMX__) +typedef short FLAC__int16; +typedef long FLAC__int32; +typedef long long FLAC__int64; +typedef unsigned short FLAC__uint16; +typedef unsigned long FLAC__uint32; +typedef unsigned long long FLAC__uint64; +#else +typedef int16_t FLAC__int16; +typedef int32_t FLAC__int32; +typedef int64_t FLAC__int64; +typedef uint16_t FLAC__uint16; +typedef uint32_t FLAC__uint32; +typedef uint64_t FLAC__uint64; +#endif + +typedef int FLAC__bool; + +typedef FLAC__uint8 FLAC__byte; + +#ifdef true +#undef true +#endif +#ifdef false +#undef false +#endif +#ifndef __cplusplus +#define true 1 +#define false 0 +#endif + +// MAME addition -- seems lame to make this a command-line parameter +#define VERSION "1.2.1" + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/stream_decoder.h mame-0.145/src/lib/libflac/include/flac/stream_decoder.h --- mame-0.144/src/lib/libflac/include/flac/stream_decoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/stream_decoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1559 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__STREAM_DECODER_H +#define FLAC__STREAM_DECODER_H + +#include /* for FILE */ +#include "export.h" +#include "format.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \file include/FLAC/stream_decoder.h + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * See the detailed documentation in the + * \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces + * \ingroup flac + * + * \brief + * This module describes the decoder layers provided by libFLAC. + * + * The stream decoder can be used to decode complete streams either from + * the client via callbacks, or directly from a file, depending on how + * it is initialized. When decoding via callbacks, the client provides + * callbacks for reading FLAC data and writing decoded samples, and + * handling metadata and errors. If the client also supplies seek-related + * callback, the decoder function for sample-accurate seeking within the + * FLAC input is also available. When decoding from a file, the client + * needs only supply a filename or open \c FILE* and write/metadata/error + * callbacks; the rest of the callbacks are supplied internally. For more + * info see the \link flac_stream_decoder stream decoder \endlink module. + */ + +/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface + * \ingroup flac_decoder + * + * \brief + * This module contains the functions which implement the stream + * decoder. + * + * The stream decoder can decode native FLAC, and optionally Ogg FLAC + * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + * + * The basic usage of this decoder is as follows: + * - The program creates an instance of a decoder using + * FLAC__stream_decoder_new(). + * - The program overrides the default settings using + * FLAC__stream_decoder_set_*() functions. + * - The program initializes the instance to validate the settings and + * prepare for decoding using + * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file() for native FLAC, + * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() + * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC + * - The program calls the FLAC__stream_decoder_process_*() functions + * to decode data, which subsequently calls the callbacks. + * - The program finishes the decoding with FLAC__stream_decoder_finish(), + * which flushes the input and output and resets the decoder to the + * uninitialized state. + * - The instance may be used again or deleted with + * FLAC__stream_decoder_delete(). + * + * In more detail, the program will create a new instance by calling + * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() + * functions to override the default decoder options, and call + * one of the FLAC__stream_decoder_init_*() functions. + * + * There are three initialization functions for native FLAC, one for + * setting up the decoder to decode FLAC data from the client via + * callbacks, and two for decoding directly from a FLAC file. + * + * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). + * You must also supply several callbacks for handling I/O. Some (like + * seeking) are optional, depending on the capabilities of the input. + * + * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() + * or FLAC__stream_decoder_init_file(). Then you must only supply an open + * \c FILE* or filename and fewer callbacks; the decoder will handle + * the other callbacks internally. + * + * There are three similarly-named init functions for decoding from Ogg + * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + * library has been built with Ogg support. + * + * Once the decoder is initialized, your program will call one of several + * functions to start the decoding process: + * + * - FLAC__stream_decoder_process_single() - Tells the decoder to process at + * most one metadata block or audio frame and return, calling either the + * metadata callback or write callback, respectively, once. If the decoder + * loses sync it will return with only the error callback being called. + * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder + * to process the stream from the current location and stop upon reaching + * the first audio frame. The client will get one metadata, write, or error + * callback per metadata block, audio frame, or sync error, respectively. + * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder + * to process the stream from the current location until the read callback + * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or + * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, + * write, or error callback per metadata block, audio frame, or sync error, + * respectively. + * + * When the decoder has finished decoding (normally or through an abort), + * the instance is finished by calling FLAC__stream_decoder_finish(), which + * ensures the decoder is in the correct state and frees memory. Then the + * instance may be deleted with FLAC__stream_decoder_delete() or initialized + * again to decode another stream. + * + * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. + * At any point after the stream decoder has been initialized, the client can + * call this function to seek to an exact sample within the stream. + * Subsequently, the first time the write callback is called it will be + * passed a (possibly partial) block starting at that sample. + * + * If the client cannot seek via the callback interface provided, but still + * has another way of seeking, it can flush the decoder using + * FLAC__stream_decoder_flush() and start feeding data from the new position + * through the read callback. + * + * The stream decoder also provides MD5 signature checking. If this is + * turned on before initialization, FLAC__stream_decoder_finish() will + * report when the decoded MD5 signature does not match the one stored + * in the STREAMINFO block. MD5 checking is automatically turned off + * (until the next FLAC__stream_decoder_reset()) if there is no signature + * in the STREAMINFO block or when a seek is attempted. + * + * The FLAC__stream_decoder_set_metadata_*() functions deserve special + * attention. By default, the decoder only calls the metadata_callback for + * the STREAMINFO block. These functions allow you to tell the decoder + * explicitly which blocks to parse and return via the metadata_callback + * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), + * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), + * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify + * which blocks to return. Remember that metadata blocks can potentially + * be big (for example, cover art) so filtering out the ones you don't + * use can reduce the memory requirements of the decoder. Also note the + * special forms FLAC__stream_decoder_set_metadata_respond_application(id) + * and FLAC__stream_decoder_set_metadata_ignore_application(id) for + * filtering APPLICATION blocks based on the application ID. + * + * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but + * they still can legally be filtered from the metadata_callback. + * + * \note + * The "set" functions may only be called when the decoder is in the + * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after + * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but + * before FLAC__stream_decoder_init_*(). If this is the case they will + * return \c true, otherwise \c false. + * + * \note + * FLAC__stream_decoder_finish() resets all settings to the constructor + * defaults, including the callbacks. + * + * \{ + */ + + +/** State values for a FLAC__StreamDecoder + * + * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). + */ +typedef enum { + + FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, + /**< The decoder is ready to search for metadata. */ + + FLAC__STREAM_DECODER_READ_METADATA, + /**< The decoder is ready to or is in the process of reading metadata. */ + + FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, + /**< The decoder is ready to or is in the process of searching for the + * frame sync code. + */ + + FLAC__STREAM_DECODER_READ_FRAME, + /**< The decoder is ready to or is in the process of reading a frame. */ + + FLAC__STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ + + FLAC__STREAM_DECODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ + + FLAC__STREAM_DECODER_SEEK_ERROR, + /**< An error occurred while seeking. The decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + */ + + FLAC__STREAM_DECODER_ABORTED, + /**< The decoder was aborted by the read callback. */ + + FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. The decoder is in an invalid + * state and can no longer be used. + */ + + FLAC__STREAM_DECODER_UNINITIALIZED + /**< The decoder is in the uninitialized state; one of the + * FLAC__stream_decoder_init_*() functions must be called before samples + * can be processed. + */ + +} FLAC__StreamDecoderState; + +/** Maps a FLAC__StreamDecoderState to a C string. + * + * Using a FLAC__StreamDecoderState as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; + + +/** Possible return values for the FLAC__stream_decoder_init_*() functions. + */ +typedef enum { + + FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ + + FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /**< The library was not compiled with support for the given container + * format. + */ + + FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ + + FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, + /**< An error occurred allocating memory. */ + + FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, + /**< fopen() failed in FLAC__stream_decoder_init_file() or + * FLAC__stream_decoder_init_ogg_file(). */ + + FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED + /**< FLAC__stream_decoder_init_*() was called when the decoder was + * already initialized, usually because + * FLAC__stream_decoder_finish() was not called. + */ + +} FLAC__StreamDecoderInitStatus; + +/** Maps a FLAC__StreamDecoderInitStatus to a C string. + * + * Using a FLAC__StreamDecoderInitStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; + + +/** Return values for the FLAC__StreamDecoder read callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, + /**< The read was attempted while at the end of the stream. Note that + * the client must only return this value when the read callback was + * called when already at the end of the stream. Otherwise, if the read + * itself moves to the end of the stream, the client should still return + * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on + * the next read callback it should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count + * of \c 0. + */ + + FLAC__STREAM_DECODER_READ_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderReadStatus; + +/** Maps a FLAC__StreamDecoderReadStatus to a C string. + * + * Using a FLAC__StreamDecoderReadStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; + + +/** Return values for the FLAC__StreamDecoder seek callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_SEEK_STATUS_OK, + /**< The seek was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamDecoderSeekStatus; + +/** Maps a FLAC__StreamDecoderSeekStatus to a C string. + * + * Using a FLAC__StreamDecoderSeekStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; + + +/** Return values for the FLAC__StreamDecoder tell callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_TELL_STATUS_OK, + /**< The tell was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support telling the position. */ + +} FLAC__StreamDecoderTellStatus; + +/** Maps a FLAC__StreamDecoderTellStatus to a C string. + * + * Using a FLAC__StreamDecoderTellStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; + + +/** Return values for the FLAC__StreamDecoder length callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_LENGTH_STATUS_OK, + /**< The length call was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + + FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + /**< Client does not support reporting the length. */ + +} FLAC__StreamDecoderLengthStatus; + +/** Maps a FLAC__StreamDecoderLengthStatus to a C string. + * + * Using a FLAC__StreamDecoderLengthStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; + + +/** Return values for the FLAC__StreamDecoder write callback. + */ +typedef enum { + + FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, + /**< The write was OK and decoding can continue. */ + + FLAC__STREAM_DECODER_WRITE_STATUS_ABORT + /**< An unrecoverable error occurred. The decoder will return from the process call. */ + +} FLAC__StreamDecoderWriteStatus; + +/** Maps a FLAC__StreamDecoderWriteStatus to a C string. + * + * Using a FLAC__StreamDecoderWriteStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; + + +/** Possible values passed back to the FLAC__StreamDecoder error callback. + * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- + * all. The rest could be caused by bad sync (false synchronization on + * data that is not the start of a frame) or corrupted data. The error + * itself is the decoder's best guess at what happened assuming a correct + * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER + * could be caused by a correct sync on the start of a frame, but some + * data in the frame header was corrupted. Or it could be the result of + * syncing on a point the stream that looked like the starting of a frame + * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + * could be because the decoder encountered a valid frame made by a future + * version of the encoder which it cannot parse, or because of a false + * sync making it appear as though an encountered frame was generated by + * a future encoder. + */ +typedef enum { + + FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, + /**< An error in the stream caused the decoder to lose synchronization. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, + /**< The decoder encountered a corrupted frame header. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, + /**< The frame's data did not match the CRC in the footer. */ + + FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM + /**< The decoder encountered reserved fields in use in the stream. */ + +} FLAC__StreamDecoderErrorStatus; + +/** Maps a FLAC__StreamDecoderErrorStatus to a C string. + * + * Using a FLAC__StreamDecoderErrorStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; + + +/*********************************************************************** + * + * class FLAC__StreamDecoder + * + ***********************************************************************/ + +struct FLAC__StreamDecoderProtected; +struct FLAC__StreamDecoderPrivate; +/** The opaque structure definition for the stream decoder type. + * See the \link flac_stream_decoder stream decoder module \endlink + * for a detailed description. + */ +typedef struct { + struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ +} FLAC__StreamDecoder; + +/** Signature for the read callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs more input data. The address of the + * buffer to be filled is supplied, along with the number of bytes the + * buffer can hold. The callback may choose to supply less data and + * modify the byte count but must be careful not to overflow the buffer. + * The callback then returns a status code chosen from + * FLAC__StreamDecoderReadStatus. + * + * Here is an example of a read callback for stdio streams: + * \code + * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(*bytes > 0) { + * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); + * if(ferror(file)) + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * else if(*bytes == 0) + * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + * else + * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + * } + * else + * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param buffer A pointer to a location for the callee to store + * data to be decoded. + * \param bytes A pointer to the size of the buffer. On entry + * to the callback, it contains the maximum number + * of bytes that may be stored in \a buffer. The + * callee must set it to the actual number of bytes + * stored (0 in case of error or end-of-stream) before + * returning. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderReadStatus + * The callee's return status. Note that the callback should return + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if + * zero bytes were read and there is no more data to be read. + */ +typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + +/** Signature for the seek callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to seek the input stream. The decoder + * will pass the absolute byte offset to seek to, 0 meaning the + * beginning of the stream. + * + * Here is an example of a seek callback for stdio streams: + * \code + * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(file == stdin) + * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + * else + * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset The offset from the beginning of the stream + * to seek to. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderSeekStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); + +/** Signature for the tell callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the current position of the + * stream. The callback should return the byte offset from the + * beginning of the stream. + * + * Here is an example of a tell callback for stdio streams: + * \code + * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * off_t pos; + * if(file == stdin) + * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + * else if((pos = ftello(file)) < 0) + * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + * else { + * *absolute_byte_offset = (FLAC__uint64)pos; + * return FLAC__STREAM_DECODER_TELL_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param absolute_byte_offset A pointer to storage for the current offset + * from the beginning of the stream. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderTellStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + +/** Signature for the length callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder wants to know the total length of the stream + * in bytes. + * + * Here is an example of a length callback for stdio streams: + * \code + * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * struct stat filestats; + * + * if(file == stdin) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + * else if(fstat(fileno(file), &filestats) != 0) + * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + * else { + * *stream_length = (FLAC__uint64)filestats.st_size; + * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param stream_length A pointer to storage for the length of the stream + * in bytes. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderLengthStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); + +/** Signature for the EOF callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_decoder_init*_stream(). The supplied function will be + * called when the decoder needs to know if the end of the stream has + * been reached. + * + * Here is an example of a EOF callback for stdio streams: + * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) + * \code + * { + * FILE *file = ((MyClientData*)client_data)->file; + * return feof(file)? true : false; + * } + * \endcode + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__bool + * \c true if the currently at the end of the stream, else \c false. + */ +typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); + +/** Signature for the write callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * single audio frame. The decoder will pass the frame metadata as well + * as an array of pointers (one for each channel) pointing to the + * decoded audio. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param frame The description of the decoded frame. See + * FLAC__Frame. + * \param buffer An array of pointers to decoded channels of data. + * Each pointer will point to an array of signed + * samples of length \a frame->header.blocksize. + * Channels will be ordered according to the FLAC + * specification; see the documentation for the + * frame header. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + * \retval FLAC__StreamDecoderWriteStatus + * The callee's return status. + */ +typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); + +/** Signature for the metadata callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called when the decoder has decoded a + * metadata block. In a valid FLAC file there will always be one + * \c STREAMINFO block, followed by zero or more other metadata blocks. + * These will be supplied by the decoder in the same order as they + * appear in the stream and always before the first audio frame (i.e. + * write callback). The metadata block that is passed in must not be + * modified, and it doesn't live beyond the callback, so you should make + * a copy of it with FLAC__metadata_object_clone() if you will need it + * elsewhere. Since metadata blocks can potentially be large, by + * default the decoder only calls the metadata callback for the + * \c STREAMINFO block; you can instruct the decoder to pass or filter + * other blocks with FLAC__stream_decoder_set_metadata_*() calls. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param metadata The decoded metadata block. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); + +/** Signature for the error callback. + * + * A function pointer matching this signature must be passed to one of + * the FLAC__stream_decoder_init_*() functions. + * The supplied function will be called whenever an error occurs during + * decoding. + * + * \note In general, FLAC__StreamDecoder functions which change the + * state should not be called on the \a decoder while in the callback. + * + * \param decoder The decoder instance calling the callback. + * \param status The error encountered by the decoder. + * \param client_data The callee's client data set through + * FLAC__stream_decoder_init_*(). + */ +typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +/** Create a new stream decoder instance. The instance is created with + * default settings; see the individual FLAC__stream_decoder_set_*() + * functions for each setting's default. + * + * \retval FLAC__StreamDecoder* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); + +/** Free a decoder instance. Deletes the object pointed to by \a decoder. + * + * \param decoder A pointer to an existing decoder. + * \assert + * \code decoder != NULL \endcode + */ +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); + + +/*********************************************************************** + * + * Public class method prototypes + * + ***********************************************************************/ + +/** Set the serial number for the FLAC stream within the Ogg container. + * The default behavior is to use the serial number of the first Ogg + * page. Setting a serial number here will explicitly specify which + * stream is to be decoded. + * + * \note + * This does not need to be set for native FLAC decoding. + * + * \default \c use serial number of first page + * \param decoder A decoder instance to set. + * \param serial_number See above. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); + +/** Set the "MD5 signature checking" flag. If \c true, the decoder will + * compute the MD5 signature of the unencoded audio data while decoding + * and compare it to the signature from the STREAMINFO block, if it + * exists, during FLAC__stream_decoder_finish(). + * + * MD5 signature checking will be turned off (until the next + * FLAC__stream_decoder_reset()) if there is no signature in the + * STREAMINFO block or when a seek is attempted. + * + * Clients that do not use the MD5 check should leave this off to speed + * up decoding. + * + * \default \c false + * \param decoder A decoder instance to set. + * \param value Flag value (see above). + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); + +/** Direct the decoder to pass on all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to pass on all APPLICATION metadata blocks of the + * given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to pass on all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); + +/** Direct the decoder to filter out all metadata blocks of type \a type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param type See above. + * \assert + * \code decoder != NULL \endcode + * \a type is valid + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); + +/** Direct the decoder to filter out all APPLICATION metadata blocks of + * the given \a id. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \param id See above. + * \assert + * \code decoder != NULL \endcode + * \code id != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); + +/** Direct the decoder to filter out all metadata blocks of any type. + * + * \default By default, only the \c STREAMINFO block is returned via the + * metadata callback. + * \param decoder A decoder instance to set. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if the decoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); + +/** Get the current decoder state. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderState + * The current decoder state. + */ +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); + +/** Get the current decoder state as a C string. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval const char * + * The decoder state as a C string. Do not modify the contents. + */ +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); + +/** Get the "MD5 signature checking" flag. + * This is the value of the setting, not whether or not the decoder is + * currently checking the MD5 (remember, it can be turned off automatically + * by a seek). When the decoder is reset the flag will be restored to the + * value returned by this function. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * See above. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); + +/** Get the total number of samples in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the \c STREAMINFO block. A value of \c 0 means "unknown". + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); + +/** Get the current number of channels in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); + +/** Get the current channel assignment in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__ChannelAssignment + * See above. + */ +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); + +/** Get the current sample resolution in the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); + +/** Get the current sample rate in Hz of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); + +/** Get the current blocksize of the stream being decoded. + * Will only be valid after decoding has started and will contain the + * value from the most recently decoded frame header. + * + * \param decoder A decoder instance to query. + * \assert + * \code decoder != NULL \endcode + * \retval unsigned + * See above. + */ +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); + +/** Returns the decoder's current read position within the stream. + * The position is the byte offset from the start of the stream. + * Bytes before this position have been fully decoded. Note that + * there may still be undecoded bytes in the decoder's read FIFO. + * The returned position is correct even after a seek. + * + * \warning This function currently only works for native FLAC, + * not Ogg FLAC streams. + * + * \param decoder A decoder instance to query. + * \param position Address at which to return the desired position. + * \assert + * \code decoder != NULL \endcode + * \code position != NULL \endcode + * \retval FLAC__bool + * \c true if successful, \c false if the stream is not native FLAC, + * or there was an error from the 'tell' callback or it returned + * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); + +/** Initialize the decoder instance to decode native FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * native FLAC stream. I/O is performed via callbacks to the client. + * For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC streams. + * + * This flavor of initialization sets up the decoder to decode from a + * FLAC stream in an Ogg container. I/O is performed via callbacks to the + * client. For decoding from a plain file via filename or open FILE*, + * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() + * provide a simpler interface. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param read_callback See FLAC__StreamDecoderReadCallback. This + * pointer must not be \c NULL. + * \param seek_callback See FLAC__StreamDecoderSeekCallback. This + * pointer may be \c NULL if seeking is not + * supported. If \a seek_callback is not \c NULL then a + * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. + * Alternatively, a dummy seek callback that just + * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param tell_callback See FLAC__StreamDecoderTellCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a tell_callback must also be supplied. + * Alternatively, a dummy tell callback that just + * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param length_callback See FLAC__StreamDecoderLengthCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a length_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param eof_callback See FLAC__StreamDecoderEofCallback. This + * pointer may be \c NULL if not supported by the client. If + * \a seek_callback is not \c NULL then a + * \a eof_callback must also be supplied. + * Alternatively, a dummy length callback that just + * returns \c false + * may also be supplied, all though this is slightly + * less efficient for the decoder. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain native FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a + * plain Ogg FLAC file. For non-stdio streams, you must use + * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param file An open FLAC file. The file should have been + * opened with mode \c "rb" and rewound. The file + * becomes owned by the decoder and should not be + * manipulated by the client while decoding. + * Unless \a file is \c stdin, it will be closed + * when FLAC__stream_decoder_finish() is called. + * Note however that seeking will not work when + * decoding from \c stdout since it is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \code file != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode native FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * native FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Initialize the decoder instance to decode Ogg FLAC files. + * + * This flavor of initialization sets up the decoder to decode from a plain + * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for + * example, with Unicode filenames on Windows), you must use + * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() + * and provide callbacks for the I/O. + * + * This function should be called after FLAC__stream_decoder_new() and + * FLAC__stream_decoder_set_*() but before any of the + * FLAC__stream_decoder_process_*() functions. Will set and return the + * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA + * if initialization succeeded. + * + * \note Support for Ogg FLAC in the library is optional. If this + * library has been built without support for Ogg FLAC, this function + * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. + * + * \param decoder An uninitialized decoder instance. + * \param filename The name of the file to decode from. The file will + * be opened with fopen(). Use \c NULL to decode from + * \c stdin. Note that \c stdin is not seekable. + * \param write_callback See FLAC__StreamDecoderWriteCallback. This + * pointer must not be \c NULL. + * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This + * pointer may be \c NULL if the callback is not + * desired. + * \param error_callback See FLAC__StreamDecoderErrorCallback. This + * pointer must not be \c NULL. + * \param client_data This value will be supplied to callbacks in their + * \a client_data argument. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__StreamDecoderInitStatus + * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; + * see FLAC__StreamDecoderInitStatus for the meanings of other return values. + */ +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +); + +/** Finish the decoding process. + * Flushes the decoding buffer, releases resources, resets the decoder + * settings to their defaults, and returns the decoder state to + * FLAC__STREAM_DECODER_UNINITIALIZED. + * + * In the event of a prematurely-terminated decode, it is not strictly + * necessary to call this immediately before FLAC__stream_decoder_delete() + * but it is good practice to match every FLAC__stream_decoder_init_*() + * with a FLAC__stream_decoder_finish(). + * + * \param decoder An uninitialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if MD5 checking is on AND a STREAMINFO block was available + * AND the MD5 signature in the STREAMINFO block was non-zero AND the + * signature does not match the one computed by the decoder; else + * \c true. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); + +/** Flush the stream input. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn + * off MD5 checking. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation + * error occurs (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); + +/** Reset the decoding process. + * The decoder's input buffer will be cleared and the state set to + * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to + * FLAC__stream_decoder_finish() except that the settings are + * preserved; there is no need to call FLAC__stream_decoder_init_*() + * before decoding again. MD5 checking will be restored to its original + * setting. + * + * If the decoder is seekable, or was initialized with + * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), + * the decoder will also attempt to seek to the beginning of the file. + * If this rewind fails, this function will return \c false. It follows + * that FLAC__stream_decoder_reset() cannot be used when decoding from + * \c stdin. + * + * If the decoder was initialized with FLAC__stream_encoder_init*_stream() + * and is not seekable (i.e. no seek callback was provided or the seek + * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it + * is the duty of the client to start feeding data from the beginning of + * the stream on the next FLAC__stream_decoder_process() or + * FLAC__stream_decoder_process_interleaved() call. + * + * \param decoder A decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false if a memory allocation occurs + * (in which case the state will be set to + * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error + * occurs (the state will be unchanged). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); + +/** Decode one metadata block or audio frame. + * This version instructs the decoder to decode a either a single metadata + * block or a single frame and stop, unless the callbacks return a fatal + * error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * Depending on what was decoded, the metadata or write callback will be + * called with the decoded metadata block or audio frame. + * + * Unless there is a fatal read error or end of stream, this function + * will return once one whole frame is decoded. In other words, if the + * stream is not synchronized or points to a corrupt frame header, the + * decoder will continue to try and resync until it gets to a valid + * frame, then decode one frame, then return. If the decoder points to + * a frame whose frame CRC in the frame footer does not match the + * computed frame CRC, this function will issue a + * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the + * error callback, and return, having decoded one complete, although + * corrupt, frame. (Such corrupted frames are sent as silence of the + * correct length to the write callback.) + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the metadata. + * This version instructs the decoder to decode from the current position + * and continue until all the metadata has been read, or until the + * callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block is decoded, the metadata callback will be called + * with the decoded metadata. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); + +/** Decode until the end of the stream. + * This version instructs the decoder to decode from the current position + * and continue until the end of stream (the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the + * callbacks return a fatal error. + * + * As the decoder needs more input it will call the read callback. + * As each metadata block and frame is decoded, the metadata or write + * callback will be called with the decoded metadata or frame. + * + * \param decoder An initialized decoder instance. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); + +/** Skip one audio frame. + * This version instructs the decoder to 'skip' a single frame and stop, + * unless the callbacks return a fatal error or the read callback returns + * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. + * + * The decoding flow is the same as what occurs when + * FLAC__stream_decoder_process_single() is called to process an audio + * frame, except that this function does not decode the parsed data into + * PCM or call the write callback. The integrity of the frame is still + * checked the same way as in the other process functions. + * + * This function will return once one whole frame is skipped, in the + * same way that FLAC__stream_decoder_process_single() will return once + * one whole frame is decoded. + * + * This function can be used in more quickly determining FLAC frame + * boundaries when decoding of the actual data is not needed, for + * example when an application is separating a FLAC stream into frames + * for editing or storing in a container. To do this, the application + * can use FLAC__stream_decoder_skip_single_frame() to quickly advance + * to the next frame, then use + * FLAC__stream_decoder_get_decode_position() to find the new frame + * boundary. + * + * This function should only be called when the stream has advanced + * past all the metadata, otherwise it will return \c false. + * + * \param decoder An initialized decoder instance not in a metadata + * state. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c false if any fatal read, write, or memory allocation error + * occurred (meaning decoding must stop), or if the decoder + * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or + * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more + * information about the decoder, check the decoder state with + * FLAC__stream_decoder_get_state(). + */ +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); + +/** Flush the input and seek to an absolute sample. + * Decoding will resume at the given sample. Note that because of + * this, the next write callback may contain a partial block. The + * client must support seeking the input or this function will fail + * and return \c false. Furthermore, if the decoder state is + * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed + * with FLAC__stream_decoder_flush() or reset with + * FLAC__stream_decoder_reset() before decoding can continue. + * + * \param decoder A decoder instance. + * \param sample The target sample number to seek to. + * \assert + * \code decoder != NULL \endcode + * \retval FLAC__bool + * \c true if successful, else \c false. + */ +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac/stream_encoder.h mame-0.145/src/lib/libflac/include/flac/stream_encoder.h --- mame-0.144/src/lib/libflac/include/flac/stream_encoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac/stream_encoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1768 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__STREAM_ENCODER_H +#define FLAC__STREAM_ENCODER_H + +#include /* for FILE */ +#include "export.h" +#include "format.h" +#include "stream_decoder.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \file include/FLAC/stream_encoder.h + * + * \brief + * This module contains the functions which implement the stream + * encoder. + * + * See the detailed documentation in the + * \link flac_stream_encoder stream encoder \endlink module. + */ + +/** \defgroup flac_encoder FLAC/ \*_encoder.h: encoder interfaces + * \ingroup flac + * + * \brief + * This module describes the encoder layers provided by libFLAC. + * + * The stream encoder can be used to encode complete streams either to the + * client via callbacks, or directly to a file, depending on how it is + * initialized. When encoding via callbacks, the client provides a write + * callback which will be called whenever FLAC data is ready to be written. + * If the client also supplies a seek callback, the encoder will also + * automatically handle the writing back of metadata discovered while + * encoding, like stream info, seek points offsets, etc. When encoding to + * a file, the client needs only supply a filename or open \c FILE* and an + * optional progress callback for periodic notification of progress; the + * write and seek callbacks are supplied internally. For more info see the + * \link flac_stream_encoder stream encoder \endlink module. + */ + +/** \defgroup flac_stream_encoder FLAC/stream_encoder.h: stream encoder interface + * \ingroup flac_encoder + * + * \brief + * This module contains the functions which implement the stream + * encoder. + * + * The stream encoder can encode to native FLAC, and optionally Ogg FLAC + * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. + * + * The basic usage of this encoder is as follows: + * - The program creates an instance of an encoder using + * FLAC__stream_encoder_new(). + * - The program overrides the default settings using + * FLAC__stream_encoder_set_*() functions. At a minimum, the following + * functions should be called: + * - FLAC__stream_encoder_set_channels() + * - FLAC__stream_encoder_set_bits_per_sample() + * - FLAC__stream_encoder_set_sample_rate() + * - FLAC__stream_encoder_set_ogg_serial_number() (if encoding to Ogg FLAC) + * - FLAC__stream_encoder_set_total_samples_estimate() (if known) + * - If the application wants to control the compression level or set its own + * metadata, then the following should also be called: + * - FLAC__stream_encoder_set_compression_level() + * - FLAC__stream_encoder_set_verify() + * - FLAC__stream_encoder_set_metadata() + * - The rest of the set functions should only be called if the client needs + * exact control over how the audio is compressed; thorough understanding + * of the FLAC format is necessary to achieve good results. + * - The program initializes the instance to validate the settings and + * prepare for encoding using + * - FLAC__stream_encoder_init_stream() or FLAC__stream_encoder_init_FILE() + * or FLAC__stream_encoder_init_file() for native FLAC + * - FLAC__stream_encoder_init_ogg_stream() or FLAC__stream_encoder_init_ogg_FILE() + * or FLAC__stream_encoder_init_ogg_file() for Ogg FLAC + * - The program calls FLAC__stream_encoder_process() or + * FLAC__stream_encoder_process_interleaved() to encode data, which + * subsequently calls the callbacks when there is encoder data ready + * to be written. + * - The program finishes the encoding with FLAC__stream_encoder_finish(), + * which causes the encoder to encode any data still in its input pipe, + * update the metadata with the final encoding statistics if output + * seeking is possible, and finally reset the encoder to the + * uninitialized state. + * - The instance may be used again or deleted with + * FLAC__stream_encoder_delete(). + * + * In more detail, the stream encoder functions similarly to the + * \link flac_stream_decoder stream decoder \endlink, but has fewer + * callbacks and more options. Typically the client will create a new + * instance by calling FLAC__stream_encoder_new(), then set the necessary + * parameters with FLAC__stream_encoder_set_*(), and initialize it by + * calling one of the FLAC__stream_encoder_init_*() functions. + * + * Unlike the decoders, the stream encoder has many options that can + * affect the speed and compression ratio. When setting these parameters + * you should have some basic knowledge of the format (see the + * user-level documentation + * or the formal description). The + * FLAC__stream_encoder_set_*() functions themselves do not validate the + * values as many are interdependent. The FLAC__stream_encoder_init_*() + * functions will do this, so make sure to pay attention to the state + * returned by FLAC__stream_encoder_init_*() to make sure that it is + * FLAC__STREAM_ENCODER_INIT_STATUS_OK. Any parameters that are not set + * before FLAC__stream_encoder_init_*() will take on the defaults from + * the constructor. + * + * There are three initialization functions for native FLAC, one for + * setting up the encoder to encode FLAC data to the client via + * callbacks, and two for encoding directly to a file. + * + * For encoding via callbacks, use FLAC__stream_encoder_init_stream(). + * You must also supply a write callback which will be called anytime + * there is raw encoded data to write. If the client can seek the output + * it is best to also supply seek and tell callbacks, as this allows the + * encoder to go back after encoding is finished to write back + * information that was collected while encoding, like seek point offsets, + * frame sizes, etc. + * + * For encoding directly to a file, use FLAC__stream_encoder_init_FILE() + * or FLAC__stream_encoder_init_file(). Then you must only supply a + * filename or open \c FILE*; the encoder will handle all the callbacks + * internally. You may also supply a progress callback for periodic + * notification of the encoding progress. + * + * There are three similarly-named init functions for encoding to Ogg + * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the + * library has been built with Ogg support. + * + * The call to FLAC__stream_encoder_init_*() currently will also immediately + * call the write callback several times, once with the \c fLaC signature, + * and once for each encoded metadata block. Note that for Ogg FLAC + * encoding you will usually get at least twice the number of callbacks than + * with native FLAC, one for the Ogg page header and one for the page body. + * + * After initializing the instance, the client may feed audio data to the + * encoder in one of two ways: + * + * - Channel separate, through FLAC__stream_encoder_process() - The client + * will pass an array of pointers to buffers, one for each channel, to + * the encoder, each of the same length. The samples need not be + * block-aligned, but each channel should have the same number of samples. + * - Channel interleaved, through + * FLAC__stream_encoder_process_interleaved() - The client will pass a single + * pointer to data that is channel-interleaved (i.e. channel0_sample0, + * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). + * Again, the samples need not be block-aligned but they must be + * sample-aligned, i.e. the first value should be channel0_sample0 and + * the last value channelN_sampleM. + * + * Note that for either process call, each sample in the buffers should be a + * signed integer, right-justified to the resolution set by + * FLAC__stream_encoder_set_bits_per_sample(). For example, if the resolution + * is 16 bits per sample, the samples should all be in the range [-32768,32767]. + * + * When the client is finished encoding data, it calls + * FLAC__stream_encoder_finish(), which causes the encoder to encode any + * data still in its input pipe, and call the metadata callback with the + * final encoding statistics. Then the instance may be deleted with + * FLAC__stream_encoder_delete() or initialized again to encode another + * stream. + * + * For programs that write their own metadata, but that do not know the + * actual metadata until after encoding, it is advantageous to instruct + * the encoder to write a PADDING block of the correct size, so that + * instead of rewriting the whole stream after encoding, the program can + * just overwrite the PADDING block. If only the maximum size of the + * metadata is known, the program can write a slightly larger padding + * block, then split it after encoding. + * + * Make sure you understand how lengths are calculated. All FLAC metadata + * blocks have a 4 byte header which contains the type and length. This + * length does not include the 4 bytes of the header. See the format page + * for the specification of metadata blocks and their lengths. + * + * \note + * If you are writing the FLAC data to a file via callbacks, make sure it + * is open for update (e.g. mode "w+" for stdio streams). This is because + * after the first encoding pass, the encoder will try to seek back to the + * beginning of the stream, to the STREAMINFO block, to write some data + * there. (If using FLAC__stream_encoder_init*_file() or + * FLAC__stream_encoder_init*_FILE(), the file is managed internally.) + * + * \note + * The "set" functions may only be called when the encoder is in the + * state FLAC__STREAM_ENCODER_UNINITIALIZED, i.e. after + * FLAC__stream_encoder_new() or FLAC__stream_encoder_finish(), but + * before FLAC__stream_encoder_init_*(). If this is the case they will + * return \c true, otherwise \c false. + * + * \note + * FLAC__stream_encoder_finish() resets all settings to the constructor + * defaults. + * + * \{ + */ + + +/** State values for a FLAC__StreamEncoder. + * + * The encoder's state can be obtained by calling FLAC__stream_encoder_get_state(). + * + * If the encoder gets into any other state besides \c FLAC__STREAM_ENCODER_OK + * or \c FLAC__STREAM_ENCODER_UNINITIALIZED, it becomes invalid for encoding and + * must be deleted with FLAC__stream_encoder_delete(). + */ +typedef enum { + + FLAC__STREAM_ENCODER_OK = 0, + /**< The encoder is in the normal OK state and samples can be processed. */ + + FLAC__STREAM_ENCODER_UNINITIALIZED, + /**< The encoder is in the uninitialized state; one of the + * FLAC__stream_encoder_init_*() functions must be called before samples + * can be processed. + */ + + FLAC__STREAM_ENCODER_OGG_ERROR, + /**< An error occurred in the underlying Ogg layer. */ + + FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, + /**< An error occurred in the underlying verify stream decoder; + * check FLAC__stream_encoder_get_verify_decoder_state(). + */ + + FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, + /**< The verify decoder detected a mismatch between the original + * audio signal and the decoded audio signal. + */ + + FLAC__STREAM_ENCODER_CLIENT_ERROR, + /**< One of the callbacks returned a fatal error. */ + + FLAC__STREAM_ENCODER_IO_ERROR, + /**< An I/O error occurred while opening/reading/writing a file. + * Check \c errno. + */ + + FLAC__STREAM_ENCODER_FRAMING_ERROR, + /**< An error occurred while writing the stream; usually, the + * write_callback returned an error. + */ + + FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR + /**< Memory allocation failed. */ + +} FLAC__StreamEncoderState; + +/** Maps a FLAC__StreamEncoderState to a C string. + * + * Using a FLAC__StreamEncoderState as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; + + +/** Possible return values for the FLAC__stream_encoder_init_*() functions. + */ +typedef enum { + + FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, + /**< Initialization was successful. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, + /**< General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, + /**< The library was not compiled with support for the given container + * format. + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, + /**< A required callback was not supplied. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, + /**< The encoder has an invalid setting for number of channels. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, + /**< The encoder has an invalid setting for bits-per-sample. + * FLAC supports 4-32 bps but the reference encoder currently supports + * only up to 24 bps. + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, + /**< The encoder has an invalid setting for the input sample rate. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, + /**< The encoder has an invalid setting for the block size. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, + /**< The encoder has an invalid setting for the maximum LPC order. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, + /**< The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, + /**< The specified block size is less than the maximum LPC order. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, + /**< The encoder is bound to the Subset but other settings violate it. */ + + FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, + /**< The metadata input to the encoder is invalid, in one of the following ways: + * - FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 + * - One of the metadata blocks contains an undefined type + * - It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() + * - It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() + * - It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block + */ + + FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED + /**< FLAC__stream_encoder_init_*() was called when the encoder was + * already initialized, usually because + * FLAC__stream_encoder_finish() was not called. + */ + +} FLAC__StreamEncoderInitStatus; + +/** Maps a FLAC__StreamEncoderInitStatus to a C string. + * + * Using a FLAC__StreamEncoderInitStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; + + +/** Return values for the FLAC__StreamEncoder read callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, + /**< The read was OK and decoding can continue. */ + + FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, + /**< The read was attempted at the end of the stream. */ + + FLAC__STREAM_ENCODER_READ_STATUS_ABORT, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED + /**< Client does not support reading back from the output. */ + +} FLAC__StreamEncoderReadStatus; + +/** Maps a FLAC__StreamEncoderReadStatus to a C string. + * + * Using a FLAC__StreamEncoderReadStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; + + +/** Return values for the FLAC__StreamEncoder write callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, + /**< The write was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR + /**< An unrecoverable error occurred. The encoder will return from the process call. */ + +} FLAC__StreamEncoderWriteStatus; + +/** Maps a FLAC__StreamEncoderWriteStatus to a C string. + * + * Using a FLAC__StreamEncoderWriteStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; + + +/** Return values for the FLAC__StreamEncoder seek callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_SEEK_STATUS_OK, + /**< The seek was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamEncoderSeekStatus; + +/** Maps a FLAC__StreamEncoderSeekStatus to a C string. + * + * Using a FLAC__StreamEncoderSeekStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; + + +/** Return values for the FLAC__StreamEncoder tell callback. + */ +typedef enum { + + FLAC__STREAM_ENCODER_TELL_STATUS_OK, + /**< The tell was OK and encoding can continue. */ + + FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, + /**< An unrecoverable error occurred. */ + + FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED + /**< Client does not support seeking. */ + +} FLAC__StreamEncoderTellStatus; + +/** Maps a FLAC__StreamEncoderTellStatus to a C string. + * + * Using a FLAC__StreamEncoderTellStatus as the index to this array + * will give the string equivalent. The contents should not be modified. + */ +extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; + + +/*********************************************************************** + * + * class FLAC__StreamEncoder + * + ***********************************************************************/ + +struct FLAC__StreamEncoderProtected; +struct FLAC__StreamEncoderPrivate; +/** The opaque structure definition for the stream encoder type. + * See the \link flac_stream_encoder stream encoder module \endlink + * for a detailed description. + */ +typedef struct { + struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ + struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ +} FLAC__StreamEncoder; + +/** Signature for the read callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_encoder_init_ogg_stream() if seeking is supported. + * The supplied function will be called when the encoder needs to read back + * encoded data. This happens during the metadata callback, when the encoder + * has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered + * while encoding. The address of the buffer to be filled is supplied, along + * with the number of bytes the buffer can hold. The callback may choose to + * supply less data and modify the byte count but must be careful not to + * overflow the buffer. The callback then returns a status code chosen from + * FLAC__StreamEncoderReadStatus. + * + * Here is an example of a read callback for stdio streams: + * \code + * FLAC__StreamEncoderReadStatus read_cb(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(*bytes > 0) { + * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); + * if(ferror(file)) + * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + * else if(*bytes == 0) + * return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; + * else + * return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; + * } + * else + * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param buffer A pointer to a location for the callee to store + * data to be encoded. + * \param bytes A pointer to the size of the buffer. On entry + * to the callback, it contains the maximum number + * of bytes that may be stored in \a buffer. The + * callee must set it to the actual number of bytes + * stored (0 in case of error or end-of-stream) before + * returning. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_set_client_data(). + * \retval FLAC__StreamEncoderReadStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + +/** Signature for the write callback. + * + * A function pointer matching this signature must be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * by the encoder anytime there is raw encoded data ready to write. It may + * include metadata mixed with encoded audio frames and the data is not + * guaranteed to be aligned on frame or metadata block boundaries. + * + * The only duty of the callback is to write out the \a bytes worth of data + * in \a buffer to the current position in the output stream. The arguments + * \a samples and \a current_frame are purely informational. If \a samples + * is greater than \c 0, then \a current_frame will hold the current frame + * number that is being written; otherwise it indicates that the write + * callback is being called to write metadata. + * + * \note + * Unlike when writing to native FLAC, when writing to Ogg FLAC the + * write callback will be called twice when writing each audio + * frame; once for the page header, and once for the page body. + * When writing the page header, the \a samples argument to the + * write callback will be \c 0. + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param buffer An array of encoded data of length \a bytes. + * \param bytes The byte length of \a buffer. + * \param samples The number of samples encoded by \a buffer. + * \c 0 has a special meaning; see above. + * \param current_frame The number of the current frame being encoded. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderWriteStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); + +/** Signature for the seek callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * when the encoder needs to seek the output stream. The encoder will pass + * the absolute byte offset to seek to, 0 meaning the beginning of the stream. + * + * Here is an example of a seek callback for stdio streams: + * \code + * FLAC__StreamEncoderSeekStatus seek_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * if(file == stdin) + * return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; + * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + * return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + * else + * return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param absolute_byte_offset The offset from the beginning of the stream + * to seek to. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderSeekStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); + +/** Signature for the tell callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * when the encoder needs to know the current position of the output stream. + * + * \warning + * The callback must return the true current byte offset of the output to + * which the encoder is writing. If you are buffering the output, make + * sure and take this into account. If you are writing directly to a + * FILE* from your write callback, ftell() is sufficient. If you are + * writing directly to a file descriptor from your write callback, you + * can use lseek(fd, SEEK_CUR, 0). The encoder may later seek back to + * these points to rewrite metadata after encoding. + * + * Here is an example of a tell callback for stdio streams: + * \code + * FLAC__StreamEncoderTellStatus tell_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + * { + * FILE *file = ((MyClientData*)client_data)->file; + * off_t pos; + * if(file == stdin) + * return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; + * else if((pos = ftello(file)) < 0) + * return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + * else { + * *absolute_byte_offset = (FLAC__uint64)pos; + * return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + * } + * } + * \endcode + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param absolute_byte_offset The address at which to store the current + * position of the output. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + * \retval FLAC__StreamEncoderTellStatus + * The callee's return status. + */ +typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + +/** Signature for the metadata callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_stream(). The supplied function will be called + * once at the end of encoding with the populated STREAMINFO structure. This + * is so the client can seek back to the beginning of the file and write the + * STREAMINFO block with the correct statistics after encoding (like + * minimum/maximum frame size and total samples). + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param metadata The final populated STREAMINFO block. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + */ +typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); + +/** Signature for the progress callback. + * + * A function pointer matching this signature may be passed to + * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE(). + * The supplied function will be called when the encoder has finished + * writing a frame. The \c total_frames_estimate argument to the + * callback will be based on the value from + * FLAC__stream_encoder_set_total_samples_estimate(). + * + * \note In general, FLAC__StreamEncoder functions which change the + * state should not be called on the \a encoder while in the callback. + * + * \param encoder The encoder instance calling the callback. + * \param bytes_written Bytes written so far. + * \param samples_written Samples written so far. + * \param frames_written Frames written so far. + * \param total_frames_estimate The estimate of the total number of + * frames to be written. + * \param client_data The callee's client data set through + * FLAC__stream_encoder_init_*(). + */ +typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +/** Create a new stream encoder instance. The instance is created with + * default settings; see the individual FLAC__stream_encoder_set_*() + * functions for each setting's default. + * + * \retval FLAC__StreamEncoder* + * \c NULL if there was an error allocating memory, else the new instance. + */ +FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); + +/** Free an encoder instance. Deletes the object pointed to by \a encoder. + * + * \param encoder A pointer to an existing encoder. + * \assert + * \code encoder != NULL \endcode + */ +FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); + + +/*********************************************************************** + * + * Public class method prototypes + * + ***********************************************************************/ + +/** Set the serial number for the FLAC stream to use in the Ogg container. + * + * \note + * This does not need to be set for native FLAC encoding. + * + * \note + * It is recommended to set a serial number explicitly as the default of '0' + * may collide with other streams. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param serial_number See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); + +/** Set the "verify" flag. If \c true, the encoder will verify it's own + * encoded output by feeding it through an internal decoder and comparing + * the original signal against the decoded signal. If a mismatch occurs, + * the process call will return \c false. Note that this will slow the + * encoding process by the extra time required for decoding and comparison. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set the Subset flag. If \c true, + * the encoder will comply with the Subset and will check the + * settings during FLAC__stream_encoder_init_*() to see if all settings + * comply. If \c false, the settings may take advantage of the full + * range that the format allows. + * + * Make sure you know what it entails before setting this to \c false. + * + * \default \c true + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set the number of channels to be encoded. + * + * \default \c 2 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the sample resolution of the input to be encoded. + * + * \warning + * Do not feed the encoder data that is wider than the value you + * set here or you will generate an invalid stream. + * + * \default \c 16 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the sample rate (in Hz) of the input to be encoded. + * + * \default \c 44100 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the compression level + * + * The compression level is roughly proportional to the amount of effort + * the encoder expends to compress the file. A higher level usually + * means more computation but higher compression. The default level is + * suitable for most applications. + * + * Currently the levels range from \c 0 (fastest, least compression) to + * \c 8 (slowest, most compression). A value larger than \c 8 will be + * treated as \c 8. + * + * This function automatically calls the following other \c _set_ + * functions with appropriate values, so the client does not need to + * unless it specifically wants to override them: + * - FLAC__stream_encoder_set_do_mid_side_stereo() + * - FLAC__stream_encoder_set_loose_mid_side_stereo() + * - FLAC__stream_encoder_set_apodization() + * - FLAC__stream_encoder_set_max_lpc_order() + * - FLAC__stream_encoder_set_qlp_coeff_precision() + * - FLAC__stream_encoder_set_do_qlp_coeff_prec_search() + * - FLAC__stream_encoder_set_do_escape_coding() + * - FLAC__stream_encoder_set_do_exhaustive_model_search() + * - FLAC__stream_encoder_set_min_residual_partition_order() + * - FLAC__stream_encoder_set_max_residual_partition_order() + * - FLAC__stream_encoder_set_rice_parameter_search_dist() + * + * The actual values set for each level are: + * + * + * + * + * + * + * + * + * + * + * + * + *
level + * do mid-side stereo + * loose mid-side stereo + * apodization + * max lpc order + * qlp coeff precision + * qlp coeff prec search + * escape coding + * exhaustive model search + * min residual partition order + * max residual partition order + * rice parameter search dist + *
0 false false tukey(0.5) 0 0 false false false 0 3 0
1 true true tukey(0.5) 0 0 false false false 0 3 0
2 true false tukey(0.5) 0 0 false false false 0 3 0
3 false false tukey(0.5) 6 0 false false false 0 4 0
4 true true tukey(0.5) 8 0 false false false 0 4 0
5 true false tukey(0.5) 8 0 false false false 0 5 0
6 true false tukey(0.5) 8 0 false false false 0 6 0
7 true false tukey(0.5) 8 0 false false true 0 6 0
8 true false tukey(0.5) 12 0 false false true 0 6 0
+ * + * \default \c 5 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the blocksize to use while encoding. + * + * The number of samples to use per frame. Use \c 0 to let the encoder + * estimate a blocksize; this is usually best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set to \c true to enable mid-side encoding on stereo input. The + * number of channels must be 2 for this to have any effect. Set to + * \c false to use only independent channel coding. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Set to \c true to enable adaptive switching between mid-side and + * left-right encoding on stereo input. Set to \c false to use + * exhaustive searching. Setting this to \c true requires + * FLAC__stream_encoder_set_do_mid_side_stereo() to also be set to + * \c true in order to have any effect. + * + * \default \c false + * \param encoder An encoder instance to set. + * \param value Flag value (see above). + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); + +/** Sets the apodization function(s) the encoder will use when windowing + * audio data for LPC analysis. + * + * The \a specification is a plain ASCII string which specifies exactly + * which functions to use. There may be more than one (up to 32), + * separated by \c ';' characters. Some functions take one or more + * comma-separated arguments in parentheses. + * + * The available functions are \c bartlett, \c bartlett_hann, + * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, + * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, + * \c rectangle, \c triangle, \c tukey(P), \c welch. + * + * For \c gauss(STDDEV), STDDEV specifies the standard deviation + * (0blocksize / (2 ^ order). + * + * Set both min and max values to \c 0 to force a single context, + * whose Rice parameter is based on the residual signal variance. + * Otherwise, set a min and max order, and the encoder will search + * all orders, using the mean of each context for its Rice parameter, + * and use the best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set the maximum partition order to search when coding the residual. + * This is used in tandem with + * FLAC__stream_encoder_set_min_residual_partition_order(). + * + * The partition order determines the context size in the residual. + * The context size will be approximately blocksize / (2 ^ order). + * + * Set both min and max values to \c 0 to force a single context, + * whose Rice parameter is based on the residual signal variance. + * Otherwise, set a min and max order, and the encoder will search + * all orders, using the mean of each context for its Rice parameter, + * and use the best. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); + +/** Deprecated. Setting this value has no effect. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); + +/** Set an estimate of the total samples that will be encoded. + * This is merely an estimate and may be set to \c 0 if unknown. + * This value will be written to the STREAMINFO block before encoding, + * and can remove the need for the caller to rewrite the value later + * if the value is known before encoding. + * + * \default \c 0 + * \param encoder An encoder instance to set. + * \param value See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); + +/** Set the metadata blocks to be emitted to the stream before encoding. + * A value of \c NULL, \c 0 implies no metadata; otherwise, supply an + * array of pointers to metadata blocks. The array is non-const since + * the encoder may need to change the \a is_last flag inside them, and + * in some cases update seek point offsets. Otherwise, the encoder will + * not modify or free the blocks. It is up to the caller to free the + * metadata blocks after encoding finishes. + * + * \note + * The encoder stores only copies of the pointers in the \a metadata array; + * the metadata blocks themselves must survive at least until after + * FLAC__stream_encoder_finish() returns. Do not free the blocks until then. + * + * \note + * The STREAMINFO block is always written and no STREAMINFO block may + * occur in the supplied array. + * + * \note + * By default the encoder does not create a SEEKTABLE. If one is supplied + * in the \a metadata array, but the client has specified that it does not + * support seeking, then the SEEKTABLE will be written verbatim. However + * by itself this is not very useful as the client will not know the stream + * offsets for the seekpoints ahead of time. In order to get a proper + * seektable the client must support seeking. See next note. + * + * \note + * SEEKTABLE blocks are handled specially. Since you will not know + * the values for the seek point stream offsets, you should pass in + * a SEEKTABLE 'template', that is, a SEEKTABLE object with the + * required sample numbers (or placeholder points), with \c 0 for the + * \a frame_samples and \a stream_offset fields for each point. If the + * client has specified that it supports seeking by providing a seek + * callback to FLAC__stream_encoder_init_stream() or both seek AND read + * callback to FLAC__stream_encoder_init_ogg_stream() (or by using + * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), + * then while it is encoding the encoder will fill the stream offsets in + * for you and when encoding is finished, it will seek back and write the + * real values into the SEEKTABLE block in the stream. There are helper + * routines for manipulating seektable template blocks; see metadata.h: + * FLAC__metadata_object_seektable_template_*(). If the client does + * not support seeking, the SEEKTABLE will have inaccurate offsets which + * will slow down or remove the ability to seek in the FLAC stream. + * + * \note + * The encoder instance \b will modify the first \c SEEKTABLE block + * as it transforms the template to a valid seektable while encoding, + * but it is still up to the caller to free all metadata blocks after + * encoding. + * + * \note + * A VORBIS_COMMENT block may be supplied. The vendor string in it + * will be ignored. libFLAC will use it's own vendor string. libFLAC + * will not modify the passed-in VORBIS_COMMENT's vendor string, it + * will simply write it's own into the stream. If no VORBIS_COMMENT + * block is present in the \a metadata array, libFLAC will write an + * empty one, containing only the vendor string. + * + * \note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be + * the second metadata block of the stream. The encoder already supplies + * the STREAMINFO block automatically. If \a metadata does not contain a + * VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if + * \a metadata does contain a VORBIS_COMMENT block and it is not the + * first, the init function will reorder \a metadata by moving the + * VORBIS_COMMENT block to the front; the relative ordering of the other + * blocks will remain as they were. + * + * \note The Ogg FLAC mapping limits the number of metadata blocks per + * stream to \c 65535. If \a num_blocks exceeds this the function will + * return \c false. + * + * \default \c NULL, 0 + * \param encoder An encoder instance to set. + * \param metadata See above. + * \param num_blocks See above. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * \c false if the encoder is already initialized, else \c true. + * \c false if the encoder is already initialized, or if + * \a num_blocks > 65535 if encoding to Ogg FLAC, else \c true. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); + +/** Get the current encoder state. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__StreamEncoderState + * The current encoder state. + */ +FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); + +/** Get the state of the verify stream decoder. + * Useful when the stream encoder state is + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__StreamDecoderState + * The verify stream decoder state. + */ +FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); + +/** Get the current encoder state as a C string. + * This version automatically resolves + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR by getting the + * verify decoder's state. + * + * \param encoder A encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval const char * + * The encoder state as a C string. Do not modify the contents. + */ +FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); + +/** Get relevant values about the nature of a verify decoder error. + * Useful when the stream encoder state is + * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. The arguments should + * be addresses in which the stats will be returned, or NULL if value + * is not desired. + * + * \param encoder An encoder instance to query. + * \param absolute_sample The absolute sample number of the mismatch. + * \param frame_number The number of the frame in which the mismatch occurred. + * \param channel The channel in which the mismatch occurred. + * \param sample The number of the sample (relative to the frame) in + * which the mismatch occurred. + * \param expected The expected value for the sample in question. + * \param got The actual value returned by the decoder. + * \assert + * \code encoder != NULL \endcode + */ +FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); + +/** Get the "verify" flag. + * + * \param encoder An encoder instance to query. + * \assert + * \code encoder != NULL \endcode + * \retval FLAC__bool + * See FLAC__stream_encoder_set_verify(). + */ +FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); + +/** Get the frame header. + * + * \param encoder An initialized encoder instance in the OK state. + * \param buffer An array of pointers to each channel's signal. + * \param samples The number of samples in one channel. + * \assert + * \code encoder != NULL \endcode + * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode + * \retval FLAC__bool + * \c true if successful, else \c false; in this case, check the + * encoder state with FLAC__stream_encoder_get_state() to see what + * went wrong. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); + +/** Submit data for encoding. + * This version allows you to supply the input data where the channels + * are interleaved into a single array (i.e. channel0_sample0, + * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). + * The samples need not be block-aligned but they must be + * sample-aligned, i.e. the first value should be channel0_sample0 + * and the last value channelN_sampleM. Each sample should be a signed + * integer, right-justified to the resolution set by + * FLAC__stream_encoder_set_bits_per_sample(). For example, if the + * resolution is 16 bits per sample, the samples should all be in the + * range [-32768,32767]. + * + * For applications where channel order is important, channels must + * follow the order as described in the + * frame header. + * + * \param encoder An initialized encoder instance in the OK state. + * \param buffer An array of channel-interleaved data (see above). + * \param samples The number of samples in one channel, the same as for + * FLAC__stream_encoder_process(). For example, if + * encoding two channels, \c 1000 \a samples corresponds + * to a \a buffer of 2000 values. + * \assert + * \code encoder != NULL \endcode + * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode + * \retval FLAC__bool + * \c true if successful, else \c false; in this case, check the + * encoder state with FLAC__stream_encoder_get_state() to see what + * went wrong. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); + +/* \} */ + +#ifdef __cplusplus +} +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac++/all.h mame-0.145/src/lib/libflac/include/flac++/all.h --- mame-0.144/src/lib/libflac/include/flac++/all.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac++/all.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,48 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLACPP__ALL_H +#define FLACPP__ALL_H + +#include "export.h" + +#include "encoder.h" +#include "decoder.h" +#include "metadata.h" + +/** \defgroup flacpp FLAC C++ API + * + * The FLAC C++ API is the interface to libFLAC++, a set of classes + * that encapsulate the encoders, decoders, and metadata interfaces + * in libFLAC. + */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac++/decoder.h mame-0.145/src/lib/libflac/include/flac++/decoder.h --- mame-0.144/src/lib/libflac/include/flac++/decoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac++/decoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,245 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLACPP__DECODER_H +#define FLACPP__DECODER_H + +#include "export.h" + +#include +#include "flac/stream_decoder.h" + + +/** \file include/FLAC++/decoder.h + * + * \brief + * This module contains the classes which implement the various + * decoders. + * + * See the detailed documentation in the + * \link flacpp_decoder decoder \endlink module. + */ + +/** \defgroup flacpp_decoder FLAC++/decoder.h: decoder classes + * \ingroup flacpp + * + * \brief + * This module describes the decoder layers provided by libFLAC++. + * + * The libFLAC++ decoder classes are object wrappers around their + * counterparts in libFLAC. All decoding layers available in + * libFLAC are also provided here. The interface is very similar; + * make sure to read the \link flac_decoder libFLAC decoder module \endlink. + * + * There are only two significant differences here. First, instead of + * passing in C function pointers for callbacks, you inherit from the + * decoder class and provide implementations for the callbacks in your + * derived class; because of this there is no need for a 'client_data' + * property. + * + * Second, there are two stream decoder classes. FLAC::Decoder::Stream + * is used for the same cases that FLAC__stream_decoder_init_stream() / + * FLAC__stream_decoder_init_ogg_stream() are used, and FLAC::Decoder::File + * is used for the same cases that + * FLAC__stream_decoder_init_FILE() and FLAC__stream_decoder_init_file() / + * FLAC__stream_decoder_init_ogg_FILE() and FLAC__stream_decoder_init_ogg_file() + * are used. + */ + +namespace FLAC { + namespace Decoder { + + /** \ingroup flacpp_decoder + * \brief + * This class wraps the ::FLAC__StreamDecoder. If you are + * decoding from a file, FLAC::Decoder::File may be more + * convenient. + * + * The usage of this class is similar to FLAC__StreamDecoder, + * except instead of providing callbacks to + * FLAC__stream_decoder_init*_stream(), you will inherit from this + * class and override the virtual callback functions with your + * own implementations, then call init() or init_ogg(). The rest + * of the calls work the same as in the C layer. + * + * Only the read, write, and error callbacks are mandatory. The + * others are optional; this class provides default + * implementations that do nothing. In order for seeking to work + * you must overide seek_callback(), tell_callback(), + * length_callback(), and eof_callback(). + */ + class FLACPP_API Stream { + public: + /** This class is a wrapper around FLAC__StreamDecoderState. + */ + class FLACPP_API State { + public: + inline State(::FLAC__StreamDecoderState state): state_(state) { } + inline operator ::FLAC__StreamDecoderState() const { return state_; } + inline const char *as_cstring() const { return ::FLAC__StreamDecoderStateString[state_]; } + inline const char *resolved_as_cstring(const Stream &decoder) const { return ::FLAC__stream_decoder_get_resolved_state_string(decoder.decoder_); } + protected: + ::FLAC__StreamDecoderState state_; + }; + + Stream(); + virtual ~Stream(); + + //@{ + /** Call after construction to check the that the object was created + * successfully. If not, use get_state() to find out why not. + */ + virtual bool is_valid() const; + inline operator bool() const { return is_valid(); } ///< See is_valid() + //@} + + virtual bool set_ogg_serial_number(long value); ///< See FLAC__stream_decoder_set_ogg_serial_number() + virtual bool set_md5_checking(bool value); ///< See FLAC__stream_decoder_set_md5_checking() + virtual bool set_metadata_respond(::FLAC__MetadataType type); ///< See FLAC__stream_decoder_set_metadata_respond() + virtual bool set_metadata_respond_application(const FLAC__byte id[4]); ///< See FLAC__stream_decoder_set_metadata_respond_application() + virtual bool set_metadata_respond_all(); ///< See FLAC__stream_decoder_set_metadata_respond_all() + virtual bool set_metadata_ignore(::FLAC__MetadataType type); ///< See FLAC__stream_decoder_set_metadata_ignore() + virtual bool set_metadata_ignore_application(const FLAC__byte id[4]); ///< See FLAC__stream_decoder_set_metadata_ignore_application() + virtual bool set_metadata_ignore_all(); ///< See FLAC__stream_decoder_set_metadata_ignore_all() + + /* get_state() is not virtual since we want subclasses to be able to return their own state */ + State get_state() const; ///< See FLAC__stream_decoder_get_state() + virtual bool get_md5_checking() const; ///< See FLAC__stream_decoder_get_md5_checking() + virtual FLAC__uint64 get_total_samples() const; ///< See FLAC__stream_decoder_get_total_samples() + virtual unsigned get_channels() const; ///< See FLAC__stream_decoder_get_channels() + virtual ::FLAC__ChannelAssignment get_channel_assignment() const; ///< See FLAC__stream_decoder_get_channel_assignment() + virtual unsigned get_bits_per_sample() const; ///< See FLAC__stream_decoder_get_bits_per_sample() + virtual unsigned get_sample_rate() const; ///< See FLAC__stream_decoder_get_sample_rate() + virtual unsigned get_blocksize() const; ///< See FLAC__stream_decoder_get_blocksize() + virtual bool get_decode_position(FLAC__uint64 *position) const; ///< See FLAC__stream_decoder_get_decode_position() + + virtual ::FLAC__StreamDecoderInitStatus init(); ///< Seek FLAC__stream_decoder_init_stream() + virtual ::FLAC__StreamDecoderInitStatus init_ogg(); ///< Seek FLAC__stream_decoder_init_ogg_stream() + + virtual bool finish(); ///< See FLAC__stream_decoder_finish() + + virtual bool flush(); ///< See FLAC__stream_decoder_flush() + virtual bool reset(); ///< See FLAC__stream_decoder_reset() + + virtual bool process_single(); ///< See FLAC__stream_decoder_process_single() + virtual bool process_until_end_of_metadata(); ///< See FLAC__stream_decoder_process_until_end_of_metadata() + virtual bool process_until_end_of_stream(); ///< See FLAC__stream_decoder_process_until_end_of_stream() + virtual bool skip_single_frame(); ///< See FLAC__stream_decoder_skip_single_frame() + + virtual bool seek_absolute(FLAC__uint64 sample); ///< See FLAC__stream_decoder_seek_absolute() + protected: + /// see FLAC__StreamDecoderReadCallback + virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes) = 0; + + /// see FLAC__StreamDecoderSeekCallback + virtual ::FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); + + /// see FLAC__StreamDecoderTellCallback + virtual ::FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); + + /// see FLAC__StreamDecoderLengthCallback + virtual ::FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *stream_length); + + /// see FLAC__StreamDecoderEofCallback + virtual bool eof_callback(); + + /// see FLAC__StreamDecoderWriteCallback + virtual ::FLAC__StreamDecoderWriteStatus write_callback(const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[]) = 0; + + /// see FLAC__StreamDecoderMetadataCallback + virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata); + + /// see FLAC__StreamDecoderErrorCallback + virtual void error_callback(::FLAC__StreamDecoderErrorStatus status) = 0; + +#if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC) + // lame hack: some MSVC/GCC versions can't see a protected decoder_ from nested State::resolved_as_cstring() + friend State; +#endif + ::FLAC__StreamDecoder *decoder_; + + static ::FLAC__StreamDecoderReadStatus read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + static ::FLAC__StreamDecoderSeekStatus seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); + static ::FLAC__StreamDecoderTellStatus tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + static ::FLAC__StreamDecoderLengthStatus length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); + static FLAC__bool eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data); + static ::FLAC__StreamDecoderWriteStatus write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); + static void metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data); + static void error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data); + private: + // Private and undefined so you can't use them: + Stream(const Stream &); + void operator=(const Stream &); + }; + + /** \ingroup flacpp_decoder + * \brief + * This class wraps the ::FLAC__StreamDecoder. If you are + * not decoding from a file, you may need to use + * FLAC::Decoder::Stream. + * + * The usage of this class is similar to FLAC__StreamDecoder, + * except instead of providing callbacks to + * FLAC__stream_decoder_init*_FILE() or + * FLAC__stream_decoder_init*_file(), you will inherit from this + * class and override the virtual callback functions with your + * own implementations, then call init() or init_off(). The rest + * of the calls work the same as in the C layer. + * + * Only the write, and error callbacks from FLAC::Decoder::Stream + * are mandatory. The others are optional; this class provides + * full working implementations for all other callbacks and + * supports seeking. + */ + class FLACPP_API File: public Stream { + public: + File(); + virtual ~File(); + + virtual ::FLAC__StreamDecoderInitStatus init(FILE *file); ///< See FLAC__stream_decoder_init_FILE() + virtual ::FLAC__StreamDecoderInitStatus init(const char *filename); ///< See FLAC__stream_decoder_init_file() + virtual ::FLAC__StreamDecoderInitStatus init(const std::string &filename); ///< See FLAC__stream_decoder_init_file() + virtual ::FLAC__StreamDecoderInitStatus init_ogg(FILE *file); ///< See FLAC__stream_decoder_init_ogg_FILE() + virtual ::FLAC__StreamDecoderInitStatus init_ogg(const char *filename); ///< See FLAC__stream_decoder_init_ogg_file() + virtual ::FLAC__StreamDecoderInitStatus init_ogg(const std::string &filename); ///< See FLAC__stream_decoder_init_ogg_file() + protected: + // this is a dummy implementation to satisfy the pure virtual in Stream that is actually supplied internally by the C layer + virtual ::FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); + private: + // Private and undefined so you can't use them: + File(const File &); + void operator=(const File &); + }; + + } +} + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac++/encoder.h mame-0.145/src/lib/libflac/include/flac++/encoder.h --- mame-0.144/src/lib/libflac/include/flac++/encoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac++/encoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,260 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLACPP__ENCODER_H +#define FLACPP__ENCODER_H + +#include "export.h" + +#include "flac/stream_encoder.h" +#include "decoder.h" +#include "metadata.h" + + +/** \file include/FLAC++/encoder.h + * + * \brief + * This module contains the classes which implement the various + * encoders. + * + * See the detailed documentation in the + * \link flacpp_encoder encoder \endlink module. + */ + +/** \defgroup flacpp_encoder FLAC++/encoder.h: encoder classes + * \ingroup flacpp + * + * \brief + * This module describes the encoder layers provided by libFLAC++. + * + * The libFLAC++ encoder classes are object wrappers around their + * counterparts in libFLAC. All encoding layers available in + * libFLAC are also provided here. The interface is very similar; + * make sure to read the \link flac_encoder libFLAC encoder module \endlink. + * + * There are only two significant differences here. First, instead of + * passing in C function pointers for callbacks, you inherit from the + * encoder class and provide implementations for the callbacks in your + * derived class; because of this there is no need for a 'client_data' + * property. + * + * Second, there are two stream encoder classes. FLAC::Encoder::Stream + * is used for the same cases that FLAC__stream_encoder_init_stream() / + * FLAC__stream_encoder_init_ogg_stream() are used, and FLAC::Encoder::File + * is used for the same cases that + * FLAC__stream_encoder_init_FILE() and FLAC__stream_encoder_init_file() / + * FLAC__stream_encoder_init_ogg_FILE() and FLAC__stream_encoder_init_ogg_file() + * are used. + */ + +namespace FLAC { + namespace Encoder { + + /** \ingroup flacpp_encoder + * \brief + * This class wraps the ::FLAC__StreamEncoder. If you are + * encoding to a file, FLAC::Encoder::File may be more + * convenient. + * + * The usage of this class is similar to FLAC__StreamEncoder, + * except instead of providing callbacks to + * FLAC__stream_encoder_init*_stream(), you will inherit from this + * class and override the virtual callback functions with your + * own implementations, then call init() or init_ogg(). The rest of + * the calls work the same as in the C layer. + * + * Only the write callback is mandatory. The others are + * optional; this class provides default implementations that do + * nothing. In order for some STREAMINFO and SEEKTABLE data to + * be written properly, you must overide seek_callback() and + * tell_callback(); see FLAC__stream_encoder_init_stream() as to + * why. + */ + class FLACPP_API Stream { + public: + /** This class is a wrapper around FLAC__StreamEncoderState. + */ + class FLACPP_API State { + public: + inline State(::FLAC__StreamEncoderState state): state_(state) { } + inline operator ::FLAC__StreamEncoderState() const { return state_; } + inline const char *as_cstring() const { return ::FLAC__StreamEncoderStateString[state_]; } + inline const char *resolved_as_cstring(const Stream &encoder) const { return ::FLAC__stream_encoder_get_resolved_state_string(encoder.encoder_); } + protected: + ::FLAC__StreamEncoderState state_; + }; + + Stream(); + virtual ~Stream(); + + //@{ + /** Call after construction to check the that the object was created + * successfully. If not, use get_state() to find out why not. + * + */ + virtual bool is_valid() const; + inline operator bool() const { return is_valid(); } ///< See is_valid() + //@} + + virtual bool set_ogg_serial_number(long value); ///< See FLAC__stream_encoder_set_ogg_serial_number() + virtual bool set_verify(bool value); ///< See FLAC__stream_encoder_set_verify() + virtual bool set_streamable_subset(bool value); ///< See FLAC__stream_encoder_set_streamable_subset() + virtual bool set_channels(unsigned value); ///< See FLAC__stream_encoder_set_channels() + virtual bool set_bits_per_sample(unsigned value); ///< See FLAC__stream_encoder_set_bits_per_sample() + virtual bool set_sample_rate(unsigned value); ///< See FLAC__stream_encoder_set_sample_rate() + virtual bool set_compression_level(unsigned value); ///< See FLAC__stream_encoder_set_compression_level() + virtual bool set_blocksize(unsigned value); ///< See FLAC__stream_encoder_set_blocksize() + virtual bool set_do_mid_side_stereo(bool value); ///< See FLAC__stream_encoder_set_do_mid_side_stereo() + virtual bool set_loose_mid_side_stereo(bool value); ///< See FLAC__stream_encoder_set_loose_mid_side_stereo() + virtual bool set_apodization(const char *specification); ///< See FLAC__stream_encoder_set_apodization() + virtual bool set_max_lpc_order(unsigned value); ///< See FLAC__stream_encoder_set_max_lpc_order() + virtual bool set_qlp_coeff_precision(unsigned value); ///< See FLAC__stream_encoder_set_qlp_coeff_precision() + virtual bool set_do_qlp_coeff_prec_search(bool value); ///< See FLAC__stream_encoder_set_do_qlp_coeff_prec_search() + virtual bool set_do_escape_coding(bool value); ///< See FLAC__stream_encoder_set_do_escape_coding() + virtual bool set_do_exhaustive_model_search(bool value); ///< See FLAC__stream_encoder_set_do_exhaustive_model_search() + virtual bool set_min_residual_partition_order(unsigned value); ///< See FLAC__stream_encoder_set_min_residual_partition_order() + virtual bool set_max_residual_partition_order(unsigned value); ///< See FLAC__stream_encoder_set_max_residual_partition_order() + virtual bool set_rice_parameter_search_dist(unsigned value); ///< See FLAC__stream_encoder_set_rice_parameter_search_dist() + virtual bool set_total_samples_estimate(FLAC__uint64 value); ///< See FLAC__stream_encoder_set_total_samples_estimate() + virtual bool set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks); ///< See FLAC__stream_encoder_set_metadata() + virtual bool set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks); ///< See FLAC__stream_encoder_set_metadata() + + /* get_state() is not virtual since we want subclasses to be able to return their own state */ + State get_state() const; ///< See FLAC__stream_encoder_get_state() + virtual Decoder::Stream::State get_verify_decoder_state() const; ///< See FLAC__stream_encoder_get_verify_decoder_state() + virtual void get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); ///< See FLAC__stream_encoder_get_verify_decoder_error_stats() + virtual bool get_verify() const; ///< See FLAC__stream_encoder_get_verify() + virtual bool get_streamable_subset() const; ///< See FLAC__stream_encoder_get_streamable_subset() + virtual bool get_do_mid_side_stereo() const; ///< See FLAC__stream_encoder_get_do_mid_side_stereo() + virtual bool get_loose_mid_side_stereo() const; ///< See FLAC__stream_encoder_get_loose_mid_side_stereo() + virtual unsigned get_channels() const; ///< See FLAC__stream_encoder_get_channels() + virtual unsigned get_bits_per_sample() const; ///< See FLAC__stream_encoder_get_bits_per_sample() + virtual unsigned get_sample_rate() const; ///< See FLAC__stream_encoder_get_sample_rate() + virtual unsigned get_blocksize() const; ///< See FLAC__stream_encoder_get_blocksize() + virtual unsigned get_max_lpc_order() const; ///< See FLAC__stream_encoder_get_max_lpc_order() + virtual unsigned get_qlp_coeff_precision() const; ///< See FLAC__stream_encoder_get_qlp_coeff_precision() + virtual bool get_do_qlp_coeff_prec_search() const; ///< See FLAC__stream_encoder_get_do_qlp_coeff_prec_search() + virtual bool get_do_escape_coding() const; ///< See FLAC__stream_encoder_get_do_escape_coding() + virtual bool get_do_exhaustive_model_search() const; ///< See FLAC__stream_encoder_get_do_exhaustive_model_search() + virtual unsigned get_min_residual_partition_order() const; ///< See FLAC__stream_encoder_get_min_residual_partition_order() + virtual unsigned get_max_residual_partition_order() const; ///< See FLAC__stream_encoder_get_max_residual_partition_order() + virtual unsigned get_rice_parameter_search_dist() const; ///< See FLAC__stream_encoder_get_rice_parameter_search_dist() + virtual FLAC__uint64 get_total_samples_estimate() const; ///< See FLAC__stream_encoder_get_total_samples_estimate() + + virtual ::FLAC__StreamEncoderInitStatus init(); ///< See FLAC__stream_encoder_init_stream() + virtual ::FLAC__StreamEncoderInitStatus init_ogg(); ///< See FLAC__stream_encoder_init_ogg_stream() + + virtual bool finish(); ///< See FLAC__stream_encoder_finish() + + virtual bool process(const FLAC__int32 * const buffer[], unsigned samples); ///< See FLAC__stream_encoder_process() + virtual bool process_interleaved(const FLAC__int32 buffer[], unsigned samples); ///< See FLAC__stream_encoder_process_interleaved() + protected: + /// See FLAC__StreamEncoderReadCallback + virtual ::FLAC__StreamEncoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); + + /// See FLAC__StreamEncoderWriteCallback + virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame) = 0; + + /// See FLAC__StreamEncoderSeekCallback + virtual ::FLAC__StreamEncoderSeekStatus seek_callback(FLAC__uint64 absolute_byte_offset); + + /// See FLAC__StreamEncoderTellCallback + virtual ::FLAC__StreamEncoderTellStatus tell_callback(FLAC__uint64 *absolute_byte_offset); + + /// See FLAC__StreamEncoderMetadataCallback + virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata); + +#if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __GNUG__ && (__GNUG__ < 2 || (__GNUG__ == 2 && __GNUC_MINOR__ < 96))) || (defined __SUNPRO_CC) + // lame hack: some MSVC/GCC versions can't see a protected encoder_ from nested State::resolved_as_cstring() + friend State; +#endif + ::FLAC__StreamEncoder *encoder_; + + static ::FLAC__StreamEncoderReadStatus read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); + static ::FLAC__StreamEncoderWriteStatus write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); + static ::FLAC__StreamEncoderSeekStatus seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); + static ::FLAC__StreamEncoderTellStatus tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); + static void metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data); + private: + // Private and undefined so you can't use them: + Stream(const Stream &); + void operator=(const Stream &); + }; + + /** \ingroup flacpp_encoder + * \brief + * This class wraps the ::FLAC__StreamEncoder. If you are + * not encoding to a file, you may need to use + * FLAC::Encoder::Stream. + * + * The usage of this class is similar to FLAC__StreamEncoder, + * except instead of providing callbacks to + * FLAC__stream_encoder_init*_FILE() or + * FLAC__stream_encoder_init*_file(), you will inherit from this + * class and override the virtual callback functions with your + * own implementations, then call init() or init_ogg(). The rest + * of the calls work the same as in the C layer. + * + * There are no mandatory callbacks; all the callbacks from + * FLAC::Encoder::Stream are implemented here fully and support + * full post-encode STREAMINFO and SEEKTABLE updating. There is + * only an optional progress callback which you may override to + * get periodic reports on the progress of the encode. + */ + class FLACPP_API File: public Stream { + public: + File(); + virtual ~File(); + + virtual ::FLAC__StreamEncoderInitStatus init(FILE *file); ///< See FLAC__stream_encoder_init_FILE() + virtual ::FLAC__StreamEncoderInitStatus init(const char *filename); ///< See FLAC__stream_encoder_init_file() + virtual ::FLAC__StreamEncoderInitStatus init(const std::string &filename); ///< See FLAC__stream_encoder_init_file() + virtual ::FLAC__StreamEncoderInitStatus init_ogg(FILE *file); ///< See FLAC__stream_encoder_init_ogg_FILE() + virtual ::FLAC__StreamEncoderInitStatus init_ogg(const char *filename); ///< See FLAC__stream_encoder_init_ogg_file() + virtual ::FLAC__StreamEncoderInitStatus init_ogg(const std::string &filename); ///< See FLAC__stream_encoder_init_ogg_file() + protected: + /// See FLAC__StreamEncoderProgressCallback + virtual void progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate); + + /// This is a dummy implementation to satisfy the pure virtual in Stream that is actually supplied internally by the C layer + virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame); + private: + static void progress_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); + + // Private and undefined so you can't use them: + File(const Stream &); + void operator=(const Stream &); + }; + + } +} + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac++/export.h mame-0.145/src/lib/libflac/include/flac++/export.h --- mame-0.144/src/lib/libflac/include/flac++/export.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac++/export.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,80 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLACPP__EXPORT_H +#define FLACPP__EXPORT_H + +/** \file include/FLAC++/export.h + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * See the \link flacpp_export export \endlink module. + */ + +/** \defgroup flacpp_export FLAC++/export.h: export symbols + * \ingroup flacpp + * + * \brief + * This module contains #defines and symbols for exporting function + * calls, and providing version information and compiled-in features. + * + * If you are compiling with MSVC and will link to the static library + * (libFLAC++.lib) you should define FLAC__NO_DLL in your project to + * make sure the symbols are exported properly. + * + * \{ + */ + +#if defined(FLAC__NO_DLL) || !defined(_MSC_VER) +#define FLACPP_API + +#else + +#ifdef FLACPP_API_EXPORTS +#define FLACPP_API _declspec(dllexport) +#else +#define FLACPP_API _declspec(dllimport) + +#endif +#endif + +/* These #defines will mirror the libtool-based library version number, see + * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning + */ +#define FLACPP_API_VERSION_CURRENT 8 +#define FLACPP_API_VERSION_REVISION 0 +#define FLACPP_API_VERSION_AGE 2 + +/* \} */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/flac++/metadata.h mame-0.145/src/lib/libflac/include/flac++/metadata.h --- mame-0.144/src/lib/libflac/include/flac++/metadata.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/flac++/metadata.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1156 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLACPP__METADATA_H +#define FLACPP__METADATA_H + +#include "export.h" + +#include "flac/metadata.h" + +// =============================================================== +// +// Full documentation for the metadata interface can be found +// in the C layer in include/FLAC/metadata.h +// +// =============================================================== + +/** \file include/FLAC++/metadata.h + * + * \brief + * This module provides classes for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in FLAC files. + * + * See the detailed documentation for each interface in the + * \link flacpp_metadata metadata \endlink module. + */ + +/** \defgroup flacpp_metadata FLAC++/metadata.h: metadata interfaces + * \ingroup flacpp + * + * \brief + * This module provides classes for creating and manipulating FLAC + * metadata blocks in memory, and three progressively more powerful + * interfaces for traversing and editing metadata in FLAC files. + * + * The behavior closely mimics the C layer interface; be sure to read + * the detailed description of the + * \link flac_metadata C metadata module \endlink. Note that like the + * C layer, currently only the Chain interface (level 2) supports Ogg + * FLAC files, and it is read-only i.e. no writing back changed + * metadata to file. + */ + + +namespace FLAC { + namespace Metadata { + + // ============================================================ + // + // Metadata objects + // + // ============================================================ + + /** \defgroup flacpp_metadata_object FLAC++/metadata.h: metadata object classes + * \ingroup flacpp_metadata + * + * This module contains classes representing FLAC metadata + * blocks in memory. + * + * The behavior closely mimics the C layer interface; be + * sure to read the detailed description of the + * \link flac_metadata_object C metadata object module \endlink. + * + * Any time a metadata object is constructed or assigned, you + * should check is_valid() to make sure the underlying + * ::FLAC__StreamMetadata object was able to be created. + * + * \warning + * When the get_*() methods of any metadata object method + * return you a const pointer, DO NOT disobey and write into it. + * Always use the set_*() methods. + * + * \{ + */ + + /** Base class for all metadata block types. + * See the \link flacpp_metadata_object overview \endlink for more. + */ + class FLACPP_API Prototype { + protected: + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + Prototype(const Prototype &); + Prototype(const ::FLAC__StreamMetadata &); + Prototype(const ::FLAC__StreamMetadata *); + //@} + + /** Constructs an object with copy control. When \a copy + * is \c true, behaves identically to + * FLAC::Metadata::Prototype::Prototype(const ::FLAC__StreamMetadata *object). + * When \a copy is \c false, the instance takes ownership of + * the pointer and the ::FLAC__StreamMetadata object will + * be freed by the destructor. + * + * \assert + * \code object != NULL \endcode + */ + Prototype(::FLAC__StreamMetadata *object, bool copy); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + Prototype &operator=(const Prototype &); + Prototype &operator=(const ::FLAC__StreamMetadata &); + Prototype &operator=(const ::FLAC__StreamMetadata *); + //@} + + /** Assigns an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy); + + /** Deletes the underlying ::FLAC__StreamMetadata object. + */ + virtual void clear(); + + ::FLAC__StreamMetadata *object_; + public: + /** Deletes the underlying ::FLAC__StreamMetadata object. + */ + virtual ~Prototype(); + + //@{ + /** Check for equality, performing a deep compare by following pointers. + */ + inline bool operator==(const Prototype &) const; + inline bool operator==(const ::FLAC__StreamMetadata &) const; + inline bool operator==(const ::FLAC__StreamMetadata *) const; + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const Prototype &) const; + inline bool operator!=(const ::FLAC__StreamMetadata &) const; + inline bool operator!=(const ::FLAC__StreamMetadata *) const; + //@} + + friend class SimpleIterator; + friend class Iterator; + + /** Returns \c true if the object was correctly constructed + * (i.e. the underlying ::FLAC__StreamMetadata object was + * properly allocated), else \c false. + */ + inline bool is_valid() const; + + /** Returns \c true if this block is the last block in a + * stream, else \c false. + * + * \assert + * \code is_valid() \endcode + */ + bool get_is_last() const; + + /** Returns the type of the block. + * + * \assert + * \code is_valid() \endcode + */ + ::FLAC__MetadataType get_type() const; + + /** Returns the stream length of the metadata block. + * + * \note + * The length does not include the metadata block header, + * per spec. + * + * \assert + * \code is_valid() \endcode + */ + unsigned get_length() const; + + /** Sets the "is_last" flag for the block. When using the iterators + * it is not necessary to set this flag; they will do it for you. + * + * \assert + * \code is_valid() \endcode + */ + void set_is_last(bool); + + /** Returns a pointer to the underlying ::FLAC__StreamMetadata + * object. This can be useful for plugging any holes between + * the C++ and C interfaces. + * + * \assert + * \code is_valid() \endcode + */ + inline operator const ::FLAC__StreamMetadata *() const; + private: + /** Private and undefined so you can't use it. */ + Prototype(); + + // These are used only by Iterator + bool is_reference_; + inline void set_reference(bool x) { is_reference_ = x; } + }; + +#ifdef _MSC_VER +// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning) +#pragma warning ( disable : 4800 ) +#endif + + inline bool Prototype::operator==(const Prototype &object) const + { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); } + + inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const + { return (bool)::FLAC__metadata_object_is_equal(object_, &object); } + + inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const + { return (bool)::FLAC__metadata_object_is_equal(object_, object); } + +#ifdef _MSC_VER +// @@@ how to re-enable? the following doesn't work +// #pragma warning ( enable : 4800 ) +#endif + + inline bool Prototype::operator!=(const Prototype &object) const + { return !operator==(object); } + + inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const + { return !operator==(object); } + + inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const + { return !operator==(object); } + + inline bool Prototype::is_valid() const + { return 0 != object_; } + + inline Prototype::operator const ::FLAC__StreamMetadata *() const + { return object_; } + + /** Create a deep copy of an object and return it. */ + FLACPP_API Prototype *clone(const Prototype *); + + + /** STREAMINFO metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API StreamInfo : public Prototype { + public: + StreamInfo(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline StreamInfo(const StreamInfo &object): Prototype(object) { } + inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~StreamInfo(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; } + inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + //@{ + /** See format specification. */ + unsigned get_min_blocksize() const; + unsigned get_max_blocksize() const; + unsigned get_min_framesize() const; + unsigned get_max_framesize() const; + unsigned get_sample_rate() const; + unsigned get_channels() const; + unsigned get_bits_per_sample() const; + FLAC__uint64 get_total_samples() const; + const FLAC__byte *get_md5sum() const; + + void set_min_blocksize(unsigned value); + void set_max_blocksize(unsigned value); + void set_min_framesize(unsigned value); + void set_max_framesize(unsigned value); + void set_sample_rate(unsigned value); + void set_channels(unsigned value); + void set_bits_per_sample(unsigned value); + void set_total_samples(FLAC__uint64 value); + void set_md5sum(const FLAC__byte value[16]); + //@} + }; + + /** PADDING metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API Padding : public Prototype { + public: + Padding(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline Padding(const Padding &object): Prototype(object) { } + inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline Padding(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~Padding(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline Padding &operator=(const Padding &object) { Prototype::operator=(object); return *this; } + inline Padding &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline Padding &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline Padding &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const Padding &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + void set_length(unsigned length); + }; + + /** APPLICATION metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API Application : public Prototype { + public: + Application(); + // + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline Application(const Application &object): Prototype(object) { } + inline Application(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline Application(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline Application(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~Application(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline Application &operator=(const Application &object) { Prototype::operator=(object); return *this; } + inline Application &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline Application &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline Application &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const Application &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + const FLAC__byte *get_id() const; + const FLAC__byte *get_data() const; + + void set_id(const FLAC__byte value[4]); + //! This form always copies \a data + bool set_data(const FLAC__byte *data, unsigned length); + bool set_data(FLAC__byte *data, unsigned length, bool copy); + }; + + /** SEEKTABLE metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API SeekTable : public Prototype { + public: + SeekTable(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline SeekTable(const SeekTable &object): Prototype(object) { } + inline SeekTable(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline SeekTable(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline SeekTable(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~SeekTable(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline SeekTable &operator=(const SeekTable &object) { Prototype::operator=(object); return *this; } + inline SeekTable &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline SeekTable &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline SeekTable &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + unsigned get_num_points() const; + ::FLAC__StreamMetadata_SeekPoint get_point(unsigned index) const; + + //! See FLAC__metadata_object_seektable_set_point() + void set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point); + + //! See FLAC__metadata_object_seektable_insert_point() + bool insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point); + + //! See FLAC__metadata_object_seektable_delete_point() + bool delete_point(unsigned index); + + //! See FLAC__metadata_object_seektable_is_legal() + bool is_legal() const; + }; + + /** VORBIS_COMMENT metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API VorbisComment : public Prototype { + public: + /** Convenience class for encapsulating Vorbis comment + * entries. An entry is a vendor string or a comment + * field. In the case of a vendor string, the field + * name is undefined; only the field value is relevant. + * + * A \a field as used in the methods refers to an + * entire 'NAME=VALUE' string; for convenience the + * string is NUL-terminated. A length field is + * required in the unlikely event that the value + * contains contain embedded NULs. + * + * A \a field_name is what is on the left side of the + * first '=' in the \a field. By definition it is ASCII + * and so is NUL-terminated and does not require a + * length to describe it. \a field_name is undefined + * for a vendor string entry. + * + * A \a field_value is what is on the right side of the + * first '=' in the \a field. By definition, this may + * contain embedded NULs and so a \a field_value_length + * is required to describe it. However in practice, + * embedded NULs are not known to be used, so it is + * generally safe to treat field values as NUL- + * terminated UTF-8 strings. + * + * Always check is_valid() after the constructor or operator= + * to make sure memory was properly allocated and that the + * Entry conforms to the Vorbis comment specification. + */ + class FLACPP_API Entry { + public: + Entry(); + + Entry(const char *field, unsigned field_length); + Entry(const char *field); // assumes \a field is NUL-terminated + + Entry(const char *field_name, const char *field_value, unsigned field_value_length); + Entry(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated + + Entry(const Entry &entry); + + Entry &operator=(const Entry &entry); + + virtual ~Entry(); + + virtual bool is_valid() const; ///< Returns \c true iff object was properly constructed. + + unsigned get_field_length() const; + unsigned get_field_name_length() const; + unsigned get_field_value_length() const; + + ::FLAC__StreamMetadata_VorbisComment_Entry get_entry() const; + const char *get_field() const; + const char *get_field_name() const; + const char *get_field_value() const; + + bool set_field(const char *field, unsigned field_length); + bool set_field(const char *field); // assumes \a field is NUL-terminated + bool set_field_name(const char *field_name); + bool set_field_value(const char *field_value, unsigned field_value_length); + bool set_field_value(const char *field_value); // assumes \a field_value is NUL-terminated + protected: + bool is_valid_; + ::FLAC__StreamMetadata_VorbisComment_Entry entry_; + char *field_name_; + unsigned field_name_length_; + char *field_value_; + unsigned field_value_length_; + private: + void zero(); + void clear(); + void clear_entry(); + void clear_field_name(); + void clear_field_value(); + void construct(const char *field, unsigned field_length); + void construct(const char *field); // assumes \a field is NUL-terminated + void construct(const char *field_name, const char *field_value, unsigned field_value_length); + void construct(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated + void compose_field(); + void parse_field(); + }; + + VorbisComment(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline VorbisComment(const VorbisComment &object): Prototype(object) { } + inline VorbisComment(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline VorbisComment(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline VorbisComment(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~VorbisComment(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline VorbisComment &operator=(const VorbisComment &object) { Prototype::operator=(object); return *this; } + inline VorbisComment &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline VorbisComment &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline VorbisComment &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + unsigned get_num_comments() const; + const FLAC__byte *get_vendor_string() const; // NUL-terminated UTF-8 string + Entry get_comment(unsigned index) const; + + //! See FLAC__metadata_object_vorbiscomment_set_vendor_string() + bool set_vendor_string(const FLAC__byte *string); // NUL-terminated UTF-8 string + + //! See FLAC__metadata_object_vorbiscomment_set_comment() + bool set_comment(unsigned index, const Entry &entry); + + //! See FLAC__metadata_object_vorbiscomment_insert_comment() + bool insert_comment(unsigned index, const Entry &entry); + + //! See FLAC__metadata_object_vorbiscomment_append_comment() + bool append_comment(const Entry &entry); + + //! See FLAC__metadata_object_vorbiscomment_delete_comment() + bool delete_comment(unsigned index); + }; + + /** CUESHEET metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API CueSheet : public Prototype { + public: + /** Convenience class for encapsulating a cue sheet + * track. + * + * Always check is_valid() after the constructor or operator= + * to make sure memory was properly allocated. + */ + class FLACPP_API Track { + protected: + ::FLAC__StreamMetadata_CueSheet_Track *object_; + public: + Track(); + Track(const ::FLAC__StreamMetadata_CueSheet_Track *track); + Track(const Track &track); + Track &operator=(const Track &track); + + virtual ~Track(); + + virtual bool is_valid() const; ///< Returns \c true iff object was properly constructed. + + + inline FLAC__uint64 get_offset() const { return object_->offset; } + inline FLAC__byte get_number() const { return object_->number; } + inline const char *get_isrc() const { return object_->isrc; } + inline unsigned get_type() const { return object_->type; } + inline bool get_pre_emphasis() const { return object_->pre_emphasis; } + + inline FLAC__byte get_num_indices() const { return object_->num_indices; } + ::FLAC__StreamMetadata_CueSheet_Index get_index(unsigned i) const; + + inline const ::FLAC__StreamMetadata_CueSheet_Track *get_track() const { return object_; } + + inline void set_offset(FLAC__uint64 value) { object_->offset = value; } + inline void set_number(FLAC__byte value) { object_->number = value; } + void set_isrc(const char value[12]); + void set_type(unsigned value); + inline void set_pre_emphasis(bool value) { object_->pre_emphasis = value? 1 : 0; } + + void set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index); + //@@@ It's awkward but to insert/delete index points + //@@@ you must use the routines in the CueSheet class. + }; + + CueSheet(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline CueSheet(const CueSheet &object): Prototype(object) { } + inline CueSheet(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline CueSheet(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline CueSheet(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~CueSheet(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline CueSheet &operator=(const CueSheet &object) { Prototype::operator=(object); return *this; } + inline CueSheet &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline CueSheet &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline CueSheet &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const CueSheet &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const CueSheet &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + const char *get_media_catalog_number() const; + FLAC__uint64 get_lead_in() const; + bool get_is_cd() const; + + unsigned get_num_tracks() const; + Track get_track(unsigned i) const; + + void set_media_catalog_number(const char value[128]); + void set_lead_in(FLAC__uint64 value); + void set_is_cd(bool value); + + void set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index); + + //! See FLAC__metadata_object_cuesheet_track_insert_index() + bool insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index); + + //! See FLAC__metadata_object_cuesheet_track_delete_index() + bool delete_index(unsigned track_num, unsigned index_num); + + //! See FLAC__metadata_object_cuesheet_set_track() + bool set_track(unsigned i, const Track &track); + + //! See FLAC__metadata_object_cuesheet_insert_track() + bool insert_track(unsigned i, const Track &track); + + //! See FLAC__metadata_object_cuesheet_delete_track() + bool delete_track(unsigned i); + + //! See FLAC__metadata_object_cuesheet_is_legal() + bool is_legal(bool check_cd_da_subset = false, const char **violation = 0) const; + + //! See FLAC__metadata_object_cuesheet_calculate_cddb_id() + FLAC__uint32 calculate_cddb_id() const; + }; + + /** PICTURE metadata block. + * See the \link flacpp_metadata_object overview \endlink for more, + * and the format specification. + */ + class FLACPP_API Picture : public Prototype { + public: + Picture(); + + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline Picture(const Picture &object): Prototype(object) { } + inline Picture(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline Picture(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline Picture(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~Picture(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline Picture &operator=(const Picture &object) { Prototype::operator=(object); return *this; } + inline Picture &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline Picture &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline Picture &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const Picture &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const Picture &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + ::FLAC__StreamMetadata_Picture_Type get_type() const; + const char *get_mime_type() const; // NUL-terminated printable ASCII string + const FLAC__byte *get_description() const; // NUL-terminated UTF-8 string + FLAC__uint32 get_width() const; + FLAC__uint32 get_height() const; + FLAC__uint32 get_depth() const; + FLAC__uint32 get_colors() const; ///< a return value of \c 0 means true-color, i.e. 2^depth colors + FLAC__uint32 get_data_length() const; + const FLAC__byte *get_data() const; + + void set_type(::FLAC__StreamMetadata_Picture_Type type); + + //! See FLAC__metadata_object_picture_set_mime_type() + bool set_mime_type(const char *string); // NUL-terminated printable ASCII string + + //! See FLAC__metadata_object_picture_set_description() + bool set_description(const FLAC__byte *string); // NUL-terminated UTF-8 string + + void set_width(FLAC__uint32 value) const; + void set_height(FLAC__uint32 value) const; + void set_depth(FLAC__uint32 value) const; + void set_colors(FLAC__uint32 value) const; ///< a value of \c 0 means true-color, i.e. 2^depth colors + + //! See FLAC__metadata_object_picture_set_data() + bool set_data(const FLAC__byte *data, FLAC__uint32 data_length); + }; + + /** Opaque metadata block for storing unknown types. + * This should not be used unless you know what you are doing; + * it is currently used only internally to support forward + * compatibility of metadata blocks. + * See the \link flacpp_metadata_object overview \endlink for more, + */ + class FLACPP_API Unknown : public Prototype { + public: + Unknown(); + // + //@{ + /** Constructs a copy of the given object. This form + * always performs a deep copy. + */ + inline Unknown(const Unknown &object): Prototype(object) { } + inline Unknown(const ::FLAC__StreamMetadata &object): Prototype(object) { } + inline Unknown(const ::FLAC__StreamMetadata *object): Prototype(object) { } + //@} + + /** Constructs an object with copy control. See + * Prototype(::FLAC__StreamMetadata *object, bool copy). + */ + inline Unknown(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } + + ~Unknown(); + + //@{ + /** Assign from another object. Always performs a deep copy. */ + inline Unknown &operator=(const Unknown &object) { Prototype::operator=(object); return *this; } + inline Unknown &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } + inline Unknown &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } + //@} + + /** Assigns an object with copy control. See + * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). + */ + inline Unknown &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } + + //@{ + /** Check for equality, performing a deep compare by following pointers. */ + inline bool operator==(const Unknown &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } + inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } + //@} + + //@{ + /** Check for inequality, performing a deep compare by following pointers. */ + inline bool operator!=(const Unknown &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } + inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } + //@} + + const FLAC__byte *get_data() const; + + //! This form always copies \a data + bool set_data(const FLAC__byte *data, unsigned length); + bool set_data(FLAC__byte *data, unsigned length, bool copy); + }; + + /* \} */ + + + /** \defgroup flacpp_metadata_level0 FLAC++/metadata.h: metadata level 0 interface + * \ingroup flacpp_metadata + * + * \brief + * Level 0 metadata iterators. + * + * See the \link flac_metadata_level0 C layer equivalent \endlink + * for more. + * + * \{ + */ + + FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo); ///< See FLAC__metadata_get_streaminfo(). + + FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags); ///< See FLAC__metadata_get_tags(). + FLACPP_API bool get_tags(const char *filename, VorbisComment &tags); ///< See FLAC__metadata_get_tags(). + + FLACPP_API bool get_cuesheet(const char *filename, CueSheet *&cuesheet); ///< See FLAC__metadata_get_cuesheet(). + FLACPP_API bool get_cuesheet(const char *filename, CueSheet &cuesheet); ///< See FLAC__metadata_get_cuesheet(). + + FLACPP_API bool get_picture(const char *filename, Picture *&picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); ///< See FLAC__metadata_get_picture(). + FLACPP_API bool get_picture(const char *filename, Picture &picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); ///< See FLAC__metadata_get_picture(). + + /* \} */ + + + /** \defgroup flacpp_metadata_level1 FLAC++/metadata.h: metadata level 1 interface + * \ingroup flacpp_metadata + * + * \brief + * Level 1 metadata iterator. + * + * The flow through the iterator in the C++ layer is similar + * to the C layer: + * - Create a SimpleIterator instance + * - Check SimpleIterator::is_valid() + * - Call SimpleIterator::init() and check the return + * - Traverse and/or edit. Edits are written to file + * immediately. + * - Destroy the SimpleIterator instance + * + * The ownership of pointers in the C++ layer follows that in + * the C layer, i.e. + * - The objects returned by get_block() are yours to + * modify, but changes are not reflected in the FLAC file + * until you call set_block(). The objects are also + * yours to delete; they are not automatically deleted + * when passed to set_block() or insert_block_after(). + * + * See the \link flac_metadata_level1 C layer equivalent \endlink + * for more. + * + * \{ + */ + + /** This class is a wrapper around the FLAC__metadata_simple_iterator + * structures and methods; see the + * \link flacpp_metadata_level1 usage guide \endlink and + * ::FLAC__Metadata_SimpleIterator. + */ + class FLACPP_API SimpleIterator { + public: + /** This class is a wrapper around FLAC__Metadata_SimpleIteratorStatus. + */ + class FLACPP_API Status { + public: + inline Status(::FLAC__Metadata_SimpleIteratorStatus status): status_(status) { } + inline operator ::FLAC__Metadata_SimpleIteratorStatus() const { return status_; } + inline const char *as_cstring() const { return ::FLAC__Metadata_SimpleIteratorStatusString[status_]; } + protected: + ::FLAC__Metadata_SimpleIteratorStatus status_; + }; + + SimpleIterator(); + virtual ~SimpleIterator(); + + bool is_valid() const; ///< Returns \c true iff object was properly constructed. + + bool init(const char *filename, bool read_only, bool preserve_file_stats); ///< See FLAC__metadata_simple_iterator_init(). + + Status status(); ///< See FLAC__metadata_simple_iterator_status(). + bool is_writable() const; ///< See FLAC__metadata_simple_iterator_is_writable(). + + bool next(); ///< See FLAC__metadata_simple_iterator_next(). + bool prev(); ///< See FLAC__metadata_simple_iterator_prev(). + bool is_last() const; ///< See FLAC__metadata_simple_iterator_is_last(). + + off_t get_block_offset() const; ///< See FLAC__metadata_simple_iterator_get_block_offset(). + ::FLAC__MetadataType get_block_type() const; ///< See FLAC__metadata_simple_iterator_get_block_type(). + unsigned get_block_length() const; ///< See FLAC__metadata_simple_iterator_get_block_length(). + bool get_application_id(FLAC__byte *id); ///< See FLAC__metadata_simple_iterator_get_application_id(). + Prototype *get_block(); ///< See FLAC__metadata_simple_iterator_get_block(). + bool set_block(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_set_block(). + bool insert_block_after(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_insert_block_after(). + bool delete_block(bool use_padding = true); ///< See FLAC__metadata_simple_iterator_delete_block(). + + protected: + ::FLAC__Metadata_SimpleIterator *iterator_; + void clear(); + }; + + /* \} */ + + + /** \defgroup flacpp_metadata_level2 FLAC++/metadata.h: metadata level 2 interface + * \ingroup flacpp_metadata + * + * \brief + * Level 2 metadata iterator. + * + * The flow through the iterator in the C++ layer is similar + * to the C layer: + * - Create a Chain instance + * - Check Chain::is_valid() + * - Call Chain::read() and check the return + * - Traverse and/or edit with an Iterator or with + * Chain::merge_padding() or Chain::sort_padding() + * - Write changes back to FLAC file with Chain::write() + * - Destroy the Chain instance + * + * The ownership of pointers in the C++ layer is slightly + * different than in the C layer, i.e. + * - The objects returned by Iterator::get_block() are NOT + * owned by the iterator and should be deleted by the + * caller when finished, BUT, when you modify the block, + * it will directly edit what's in the chain and you do + * not need to call Iterator::set_block(). However the + * changes will not be reflected in the FLAC file until + * the chain is written with Chain::write(). + * - When you pass an object to Iterator::set_block(), + * Iterator::insert_block_before(), or + * Iterator::insert_block_after(), the iterator takes + * ownership of the block and it will be deleted by the + * chain. + * + * See the \link flac_metadata_level2 C layer equivalent \endlink + * for more. + * + * \{ + */ + + /** This class is a wrapper around the FLAC__metadata_chain + * structures and methods; see the + * \link flacpp_metadata_level2 usage guide \endlink and + * ::FLAC__Metadata_Chain. + */ + class FLACPP_API Chain { + public: + /** This class is a wrapper around FLAC__Metadata_ChainStatus. + */ + class FLACPP_API Status { + public: + inline Status(::FLAC__Metadata_ChainStatus status): status_(status) { } + inline operator ::FLAC__Metadata_ChainStatus() const { return status_; } + inline const char *as_cstring() const { return ::FLAC__Metadata_ChainStatusString[status_]; } + protected: + ::FLAC__Metadata_ChainStatus status_; + }; + + Chain(); + virtual ~Chain(); + + friend class Iterator; + + bool is_valid() const; ///< Returns \c true iff object was properly constructed. + + Status status(); ///< See FLAC__metadata_chain_status(). + + bool read(const char *filename, bool is_ogg = false); ///< See FLAC__metadata_chain_read(), FLAC__metadata_chain_read_ogg(). + bool read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, bool is_ogg = false); ///< See FLAC__metadata_chain_read_with_callbacks(), FLAC__metadata_chain_read_ogg_with_callbacks(). + + bool check_if_tempfile_needed(bool use_padding); ///< See FLAC__metadata_chain_check_if_tempfile_needed(). + + bool write(bool use_padding = true, bool preserve_file_stats = false); ///< See FLAC__metadata_chain_write(). + bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks); ///< See FLAC__metadata_chain_write_with_callbacks(). + bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks); ///< See FLAC__metadata_chain_write_with_callbacks_and_tempfile(). + + void merge_padding(); ///< See FLAC__metadata_chain_merge_padding(). + void sort_padding(); ///< See FLAC__metadata_chain_sort_padding(). + + protected: + ::FLAC__Metadata_Chain *chain_; + virtual void clear(); + }; + + /** This class is a wrapper around the FLAC__metadata_iterator + * structures and methods; see the + * \link flacpp_metadata_level2 usage guide \endlink and + * ::FLAC__Metadata_Iterator. + */ + class FLACPP_API Iterator { + public: + Iterator(); + virtual ~Iterator(); + + bool is_valid() const; ///< Returns \c true iff object was properly constructed. + + + void init(Chain &chain); ///< See FLAC__metadata_iterator_init(). + + bool next(); ///< See FLAC__metadata_iterator_next(). + bool prev(); ///< See FLAC__metadata_iterator_prev(). + + ::FLAC__MetadataType get_block_type() const; ///< See FLAC__metadata_iterator_get_block_type(). + Prototype *get_block(); ///< See FLAC__metadata_iterator_get_block(). + bool set_block(Prototype *block); ///< See FLAC__metadata_iterator_set_block(). + bool delete_block(bool replace_with_padding); ///< See FLAC__metadata_iterator_delete_block(). + bool insert_block_before(Prototype *block); ///< See FLAC__metadata_iterator_insert_block_before(). + bool insert_block_after(Prototype *block); ///< See FLAC__metadata_iterator_insert_block_after(). + + protected: + ::FLAC__Metadata_Iterator *iterator_; + virtual void clear(); + }; + + /* \} */ + + } +} + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/all.h mame-0.145/src/lib/libflac/include/private/all.h --- mame-0.144/src/lib/libflac/include/private/all.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/all.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,49 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__ALL_H +#define FLAC__PRIVATE__ALL_H + +#include "bitmath.h" +#include "bitreader.h" +#include "bitwriter.h" +#include "cpu.h" +#include "crc.h" +#include "fixed.h" +#include "float.h" +#include "format.h" +#include "lpc.h" +#include "md5.h" +#include "memory.h" +#include "metadata.h" +#include "stream_encoder_framing.h" + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/bitmath.h mame-0.145/src/lib/libflac/include/private/bitmath.h --- mame-0.144/src/lib/libflac/include/private/bitmath.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/bitmath.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,42 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__BITMATH_H +#define FLAC__PRIVATE__BITMATH_H + +#include "flac/ordinals.h" + +unsigned FLAC__bitmath_ilog2(FLAC__uint32 v); +unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v); +unsigned FLAC__bitmath_silog2(int v); +unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/bitreader.h mame-0.145/src/lib/libflac/include/private/bitreader.h --- mame-0.144/src/lib/libflac/include/private/bitreader.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/bitreader.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,99 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__BITREADER_H +#define FLAC__PRIVATE__BITREADER_H + +#include /* for FILE */ +#include "flac/ordinals.h" +#include "cpu.h" + +/* + * opaque structure definition + */ +struct FLAC__BitReader; +typedef struct FLAC__BitReader FLAC__BitReader; + +typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); + +/* + * construction, deletion, initialization, etc functions + */ +FLAC__BitReader *FLAC__bitreader_new(void); +void FLAC__bitreader_delete(FLAC__BitReader *br); +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd); +void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */ +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); + +/* + * CRC functions + */ +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); + +/* + * info functions + */ +FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); +unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); +unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); + +/* + * read functions + */ + +FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); +FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ +FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val); +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter); +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +FLAC__bool FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); +# endif +# endif +#endif +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter); +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter); +#endif +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen); +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen); + +FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br); +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/bitwriter.h mame-0.145/src/lib/libflac/include/private/bitwriter.h --- mame-0.144/src/lib/libflac/include/private/bitwriter.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/bitwriter.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,103 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__BITWRITER_H +#define FLAC__PRIVATE__BITWRITER_H + +#include /* for FILE */ +#include "flac/ordinals.h" + +/* + * opaque structure definition + */ +struct FLAC__BitWriter; +typedef struct FLAC__BitWriter FLAC__BitWriter; + +/* + * construction, deletion, initialization, etc functions + */ +FLAC__BitWriter *FLAC__bitwriter_new(void); +void FLAC__bitwriter_delete(FLAC__BitWriter *bw); +FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); +void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ +void FLAC__bitwriter_clear(FLAC__BitWriter *bw); +void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); + +/* + * CRC functions + * + * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() + */ +FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); +FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); + +/* + * info functions + */ +FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); +unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ + +/* + * direct buffer access + * + * there may be no calls on the bitwriter between get and release. + * the bitwriter continues to own the returned buffer. + * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() + */ +FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); +void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); + +/* + * write functions + */ +FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); +FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ +FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); +FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); +unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); +#if 0 /* UNUSED */ +unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); +unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); +#endif +FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); +FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); +FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); +#endif +FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); +FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); +FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/cpu.h mame-0.145/src/lib/libflac/include/private/cpu.h --- mame-0.144/src/lib/libflac/include/private/cpu.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/cpu.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,88 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__CPU_H +#define FLAC__PRIVATE__CPU_H + +#include "flac/ordinals.h" + +#ifdef HAVE_CONFIG_H +#include +#endif + +typedef enum { + FLAC__CPUINFO_TYPE_IA32, + FLAC__CPUINFO_TYPE_PPC, + FLAC__CPUINFO_TYPE_UNKNOWN +} FLAC__CPUInfo_Type; + +typedef struct { + FLAC__bool cpuid; + FLAC__bool bswap; + FLAC__bool cmov; + FLAC__bool mmx; + FLAC__bool fxsr; + FLAC__bool sse; + FLAC__bool sse2; + FLAC__bool sse3; + FLAC__bool ssse3; + FLAC__bool _3dnow; + FLAC__bool ext3dnow; + FLAC__bool extmmx; +} FLAC__CPUInfo_IA32; + +typedef struct { + FLAC__bool altivec; + FLAC__bool ppc64; +} FLAC__CPUInfo_PPC; + +typedef struct { + FLAC__bool use_asm; + FLAC__CPUInfo_Type type; + union { + FLAC__CPUInfo_IA32 ia32; + FLAC__CPUInfo_PPC ppc; + } data; +} FLAC__CPUInfo; + +void FLAC__cpu_info(FLAC__CPUInfo *info); + +#ifndef FLAC__NO_ASM +#ifdef FLAC__CPU_IA32 +#ifdef FLAC__HAS_NASM +FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); +void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx); +FLAC__uint32 FLAC__cpu_info_extended_amd_asm_ia32(void); +#endif +#endif +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/crc.h mame-0.145/src/lib/libflac/include/private/crc.h --- mame-0.144/src/lib/libflac/include/private/crc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/crc.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,61 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__CRC_H +#define FLAC__PRIVATE__CRC_H + +#include "flac/ordinals.h" + +/* 8 bit CRC generator, MSB shifted first +** polynomial = x^8 + x^2 + x^1 + x^0 +** init = 0 +*/ +extern FLAC__byte const FLAC__crc8_table[256]; +#define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; +void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); +void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); +FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); + +/* 16 bit CRC generator, MSB shifted first +** polynomial = x^16 + x^15 + x^2 + x^0 +** init = 0 +*/ +extern unsigned FLAC__crc16_table[256]; + +#define FLAC__CRC16_UPDATE(data, crc) (((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)])) +/* this alternate may be faster on some systems/compilers */ +#if 0 +#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff) +#endif + +unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/fixed.h mame-0.145/src/lib/libflac/include/private/fixed.h --- mame-0.144/src/lib/libflac/include/private/fixed.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/fixed.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,97 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__FIXED_H +#define FLAC__PRIVATE__FIXED_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "private/float.h" +#include "flac/format.h" + +/* + * FLAC__fixed_compute_best_predictor() + * -------------------------------------------------------------------- + * Compute the best fixed predictor and the expected bits-per-sample + * of the residual signal for each order. The _wide() version uses + * 64-bit integers which is statistically necessary when bits-per- + * sample + log2(blocksize) > 30 + * + * IN data[0,data_len-1] + * IN data_len + * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +# ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +# endif +# endif +# endif +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#else +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#endif + +/* + * FLAC__fixed_compute_residual() + * -------------------------------------------------------------------- + * Compute the residual signal obtained from sutracting the predicted + * signal from the original. + * + * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + * IN data_len length of original signal + * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + * OUT residual[0,data_len-1] residual signal + */ +void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); + +/* + * FLAC__fixed_restore_signal() + * -------------------------------------------------------------------- + * Restore the original signal by summing the residual and the + * predictor. + * + * IN residual[0,data_len-1] residual signal + * IN data_len length of original signal + * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order + * *** IMPORTANT: the caller must pass in the historical samples: + * IN data[-order,-1] previously-reconstructed historical samples + * OUT data[0,data_len-1] original signal + */ +void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/float.h mame-0.145/src/lib/libflac/include/private/float.h --- mame-0.144/src/lib/libflac/include/private/float.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/float.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,97 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__FLOAT_H +#define FLAC__PRIVATE__FLOAT_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "flac/ordinals.h" + +/* + * These typedefs make it easier to ensure that integer versions of + * the library really only contain integer operations. All the code + * in libFLAC should use FLAC__float and FLAC__double in place of + * float and double, and be protected by checks of the macro + * FLAC__INTEGER_ONLY_LIBRARY. + * + * FLAC__real is the basic floating point type used in LPC analysis. + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +typedef double FLAC__double; +typedef float FLAC__float; +/* + * WATCHOUT: changing FLAC__real will change the signatures of many + * functions that have assembly language equivalents and break them. + */ +typedef float FLAC__real; +#else +/* + * The convention for FLAC__fixedpoint is to use the upper 16 bits + * for the integer part and lower 16 bits for the fractional part. + */ +typedef FLAC__int32 FLAC__fixedpoint; +extern const FLAC__fixedpoint FLAC__FP_ZERO; +extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; +extern const FLAC__fixedpoint FLAC__FP_ONE; +extern const FLAC__fixedpoint FLAC__FP_LN2; +extern const FLAC__fixedpoint FLAC__FP_E; + +#define FLAC__fixedpoint_trunc(x) ((x)>>16) + +#define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) + +#define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) + +/* + * FLAC__fixedpoint_log2() + * -------------------------------------------------------------------- + * Returns the base-2 logarithm of the fixed-point number 'x' using an + * algorithm by Knuth for x >= 1.0 + * + * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must + * be < 32 and evenly divisible by 4 (0 is OK but not very precise). + * + * 'precision' roughly limits the number of iterations that are done; + * use (unsigned)(-1) for maximum precision. + * + * If 'x' is less than one -- that is, x < (1< +#endif + +#include "private/float.h" +#include "flac/format.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__lpc_window_data() + * -------------------------------------------------------------------- + * Applies the given window to the data. + * OPT: asm implementation + * + * IN in[0,data_len-1] + * IN window[0,data_len-1] + * OUT out[0,lag-1] + * IN data_len + */ +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); + +/* + * FLAC__lpc_compute_autocorrelation() + * -------------------------------------------------------------------- + * Compute the autocorrelation for lags between 0 and lag-1. + * Assumes data[] outside of [0,data_len-1] == 0. + * Asserts that lag > 0. + * + * IN data[0,data_len-1] + * IN data_len + * IN 0 < lag <= data_len + * OUT autoc[0,lag-1] + */ +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +# endif +# endif +#endif + +/* + * FLAC__lpc_compute_lp_coefficients() + * -------------------------------------------------------------------- + * Computes LP coefficients for orders 1..max_order. + * Do not call if autoc[0] == 0.0. This means the signal is zero + * and there is no point in calculating a predictor. + * + * IN autoc[0,max_order] autocorrelation values + * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute + * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order + * *** IMPORTANT: + * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched + * OUT error[0,max_order-1] error for each order (more + * specifically, the variance of + * the error signal times # of + * samples in the signal) + * + * Example: if max_order is 9, the LP coefficients for order 9 will be + * in lp_coeff[8][0,8], the LP coefficients for order 8 will be + * in lp_coeff[7][0,7], etc. + */ +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); + +/* + * FLAC__lpc_quantize_coefficients() + * -------------------------------------------------------------------- + * Quantizes the LP coefficients. NOTE: precision + bits_per_sample + * must be less than 32 (sizeof(FLAC__int32)*8). + * + * IN lp_coeff[0,order-1] LP coefficients + * IN order LP order + * IN FLAC__MIN_QLP_COEFF_PRECISION < precision + * desired precision (in bits, including sign + * bit) of largest coefficient + * OUT qlp_coeff[0,order-1] quantized coefficients + * OUT shift # of bits to shift right to get approximated + * LP coefficients. NOTE: could be negative. + * RETURN 0 => quantization OK + * 1 => coefficients require too much shifting for *shift to + * fit in the LPC subframe header. 'shift' is unset. + * 2 => coefficients are all zero, which is bad. 'shift' is + * unset. + */ +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); + +/* + * FLAC__lpc_compute_residual_from_qlp_coefficients() + * -------------------------------------------------------------------- + * Compute the residual signal obtained from sutracting the predicted + * signal from the original. + * + * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) + * IN data_len length of original signal + * IN qlp_coeff[0,order-1] quantized LP coefficients + * IN order > 0 LP order + * IN lp_quantization quantization of LP coefficients in bits + * OUT residual[0,data_len-1] residual signal + */ +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +# endif +# endif +#endif + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +/* + * FLAC__lpc_restore_signal() + * -------------------------------------------------------------------- + * Restore the original signal by summing the residual and the + * predictor. + * + * IN residual[0,data_len-1] residual signal + * IN data_len length of original signal + * IN qlp_coeff[0,order-1] quantized LP coefficients + * IN order > 0 LP order + * IN lp_quantization quantization of LP coefficients in bits + * *** IMPORTANT: the caller must pass in the historical samples: + * IN data[-order,-1] previously-reconstructed historical samples + * OUT data[0,data_len-1] original signal + */ +void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +#ifndef FLAC__NO_ASM +# ifdef FLAC__CPU_IA32 +# ifdef FLAC__HAS_NASM +void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif /* FLAC__HAS_NASM */ +# elif defined FLAC__CPU_PPC +void FLAC__lpc_restore_signal_asm_ppc_altivec_16(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +void FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif/* FLAC__CPU_IA32 || FLAC__CPU_PPC */ +#endif /* FLAC__NO_ASM */ + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__lpc_compute_expected_bits_per_residual_sample() + * -------------------------------------------------------------------- + * Compute the expected number of bits per residual signal sample + * based on the LP error (which is related to the residual variance). + * + * IN lpc_error >= 0.0 error returned from calculating LP coefficients + * IN total_samples > 0 # of samples in residual signal + * RETURN expected bits per sample + */ +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); + +/* + * FLAC__lpc_compute_best_order() + * -------------------------------------------------------------------- + * Compute the best order from the array of signal errors returned + * during coefficient computation. + * + * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients + * IN max_order > 0 max LP order + * IN total_samples > 0 # of samples in residual signal + * IN overhead_bits_per_order # of bits overhead for each increased LP order + * (includes warmup sample size and quantized LP coefficient) + * RETURN [1,max_order] best order + */ +unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/md5.h mame-0.145/src/lib/libflac/include/private/md5.h --- mame-0.144/src/lib/libflac/include/private/md5.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/md5.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,44 @@ +#ifndef FLAC__PRIVATE__MD5_H +#define FLAC__PRIVATE__MD5_H + +/* + * This is the header file for the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' + * header definitions; now uses stuff from dpkg's config.h + * - Ian Jackson . + * Still in the public domain. + * + * Josh Coalson: made some changes to integrate with libFLAC. + * Still in the public domain, with no warranty. + */ + +#include "flac/ordinals.h" + +typedef struct { + FLAC__uint32 in[16]; + FLAC__uint32 buf[4]; + FLAC__uint32 bytes[2]; + FLAC__byte *internal_buf; + size_t capacity; +} FLAC__MD5Context; + +void FLAC__MD5Init(FLAC__MD5Context *context); +void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); + +FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/memory.h mame-0.145/src/lib/libflac/include/private/memory.h --- mame-0.144/src/lib/libflac/include/private/memory.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/memory.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,56 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__MEMORY_H +#define FLAC__PRIVATE__MEMORY_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include /* for size_t */ + +#include "private/float.h" +#include "flac/ordinals.h" /* for FLAC__bool */ + +/* Returns the unaligned address returned by malloc. + * Use free() on this address to deallocate. + */ +void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); +FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); +FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); +#endif + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/metadata.h mame-0.145/src/lib/libflac/include/private/metadata.h --- mame-0.144/src/lib/libflac/include/private/metadata.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/metadata.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,45 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__METADATA_H +#define FLAC__PRIVATE__METADATA_H + +#include "flac/metadata.h" + +/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not + * be a consistent state (e.g. PICTURE) or equivalent to the initial + * state after FLAC__metadata_object_new() + */ +void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); + +void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/stream_encoder_framing.h mame-0.145/src/lib/libflac/include/private/stream_encoder_framing.h --- mame-0.144/src/lib/libflac/include/private/stream_encoder_framing.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/stream_encoder_framing.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,45 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H +#define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H + +#include "flac/format.h" +#include "bitwriter.h" + +FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); +FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); +FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/private/window.h mame-0.145/src/lib/libflac/include/private/window.h --- mame-0.144/src/lib/libflac/include/private/window.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/private/window.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,71 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PRIVATE__WINDOW_H +#define FLAC__PRIVATE__WINDOW_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "private/float.h" +#include "flac/format.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +/* + * FLAC__window_*() + * -------------------------------------------------------------------- + * Calculates window coefficients according to different apodization + * functions. + * + * OUT window[0,L-1] + * IN L (number of points in window) + */ +void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ +void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L); +void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p); +void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +#endif diff -Nru mame-0.144/src/lib/libflac/include/protected/all.h mame-0.145/src/lib/libflac/include/protected/all.h --- mame-0.144/src/lib/libflac/include/protected/all.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/protected/all.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,38 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PROTECTED__ALL_H +#define FLAC__PROTECTED__ALL_H + +#include "stream_decoder.h" +#include "stream_encoder.h" + +#endif diff -Nru mame-0.144/src/lib/libflac/include/protected/stream_decoder.h mame-0.145/src/lib/libflac/include/protected/stream_decoder.h --- mame-0.144/src/lib/libflac/include/protected/stream_decoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/protected/stream_decoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,58 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PROTECTED__STREAM_DECODER_H +#define FLAC__PROTECTED__STREAM_DECODER_H + +#include "flac/stream_decoder.h" +#if FLAC__HAS_OGG +#include "private/ogg_decoder_aspect.h" +#endif + +typedef struct FLAC__StreamDecoderProtected { + FLAC__StreamDecoderState state; + unsigned channels; + FLAC__ChannelAssignment channel_assignment; + unsigned bits_per_sample; + unsigned sample_rate; /* in Hz */ + unsigned blocksize; /* in samples (per channel) */ + FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ +#if FLAC__HAS_OGG + FLAC__OggDecoderAspect ogg_decoder_aspect; +#endif +} FLAC__StreamDecoderProtected; + +/* + * return the number of input bytes consumed + */ +unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); + +#endif diff -Nru mame-0.144/src/lib/libflac/include/protected/stream_encoder.h mame-0.145/src/lib/libflac/include/protected/stream_encoder.h --- mame-0.144/src/lib/libflac/include/protected/stream_encoder.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/protected/stream_encoder.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,110 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#ifndef FLAC__PROTECTED__STREAM_ENCODER_H +#define FLAC__PROTECTED__STREAM_ENCODER_H + +#include "flac/stream_encoder.h" +#if FLAC__HAS_OGG +#include "private/ogg_encoder_aspect.h" +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#include "private/float.h" + +#define FLAC__MAX_APODIZATION_FUNCTIONS 32 + +typedef enum { + FLAC__APODIZATION_BARTLETT, + FLAC__APODIZATION_BARTLETT_HANN, + FLAC__APODIZATION_BLACKMAN, + FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, + FLAC__APODIZATION_CONNES, + FLAC__APODIZATION_FLATTOP, + FLAC__APODIZATION_GAUSS, + FLAC__APODIZATION_HAMMING, + FLAC__APODIZATION_HANN, + FLAC__APODIZATION_KAISER_BESSEL, + FLAC__APODIZATION_NUTTALL, + FLAC__APODIZATION_RECTANGLE, + FLAC__APODIZATION_TRIANGLE, + FLAC__APODIZATION_TUKEY, + FLAC__APODIZATION_WELCH +} FLAC__ApodizationFunction; + +typedef struct { + FLAC__ApodizationFunction type; + union { + struct { + FLAC__real stddev; + } gauss; + struct { + FLAC__real p; + } tukey; + } parameters; +} FLAC__ApodizationSpecification; + +#endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY + +typedef struct FLAC__StreamEncoderProtected { + FLAC__StreamEncoderState state; + FLAC__bool verify; + FLAC__bool streamable_subset; + FLAC__bool do_md5; + FLAC__bool do_mid_side_stereo; + FLAC__bool loose_mid_side_stereo; + unsigned channels; + unsigned bits_per_sample; + unsigned sample_rate; + unsigned blocksize; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + unsigned num_apodizations; + FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; +#endif + unsigned max_lpc_order; + unsigned qlp_coeff_precision; + FLAC__bool do_qlp_coeff_prec_search; + FLAC__bool do_exhaustive_model_search; + FLAC__bool do_escape_coding; + unsigned min_residual_partition_order; + unsigned max_residual_partition_order; + unsigned rice_parameter_search_dist; + FLAC__uint64 total_samples_estimate; + FLAC__StreamMetadata **metadata; + unsigned num_metadata_blocks; + FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; +#if FLAC__HAS_OGG + FLAC__OggEncoderAspect ogg_encoder_aspect; +#endif +} FLAC__StreamEncoderProtected; + +#endif diff -Nru mame-0.144/src/lib/libflac/include/share/alloc.h mame-0.145/src/lib/libflac/include/share/alloc.h --- mame-0.144/src/lib/libflac/include/share/alloc.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/share/alloc.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,216 @@ +/* alloc - Convenience routines for safely allocating memory + * Copyright (C) 2007 Josh Coalson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef FLAC__SHARE__ALLOC_H +#define FLAC__SHARE__ALLOC_H + +#if HAVE_CONFIG_H +# include +#endif + +/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early + * before #including this file, otherwise SIZE_MAX might not be defined + */ + +#ifndef SIZE_MAX +#define SIZE_MAX (4294967295U) +#endif + +#include /* for SIZE_MAX */ +#if !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ +#include /* for SIZE_MAX in case limits.h didn't get it */ +#endif +#include /* for size_t, malloc(), etc */ + +#ifndef SIZE_MAX +# ifndef SIZE_T_MAX +# ifdef _MSC_VER +# define SIZE_T_MAX UINT_MAX +# else +# error +# endif +# endif +# define SIZE_MAX SIZE_T_MAX +#endif + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +/* avoid malloc()ing 0 bytes, see: + * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 +*/ +static FLaC__INLINE void *safe_malloc_(size_t size) +{ + /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(!size) + size++; + return malloc(size); +} + +static FLaC__INLINE void *safe_calloc_(size_t nmemb, size_t size) +{ + if(!nmemb || !size) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + return calloc(nmemb, size); +} + +/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ + +static FLaC__INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2) +{ + size2 += size1; + if(size2 < size1) + return 0; + return safe_malloc_(size2); +} + +static FLaC__INLINE void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + return safe_malloc_(size3); +} + +static FLaC__INLINE void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + size4 += size3; + if(size4 < size3) + return 0; + return safe_malloc_(size4); +} + +static FLaC__INLINE void *safe_malloc_mul_2op_(size_t size1, size_t size2) +#if 0 +needs support for cases where sizeof(size_t) != 4 +{ + /* could be faster #ifdef'ing off SIZEOF_SIZE_T */ + if(sizeof(size_t) == 4) { + if ((double)size1 * (double)size2 < 4294967296.0) + return malloc(size1*size2); + } + return 0; +} +#else +/* better? */ +{ + if(!size1 || !size2) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(size1 > SIZE_MAX / size2) + return 0; + return malloc(size1*size2); +} +#endif + +static FLaC__INLINE void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || !size2 || !size3) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + if(size1 > SIZE_MAX / size2) + return 0; + size1 *= size2; + if(size1 > SIZE_MAX / size3) + return 0; + return malloc(size1*size3); +} + +/* size1*size2 + size3 */ +static FLaC__INLINE void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || !size2) + return safe_malloc_(size3); + if(size1 > SIZE_MAX / size2) + return 0; + return safe_malloc_add_2op_(size1*size2, size3); +} + +/* size1 * (size2 + size3) */ +static FLaC__INLINE void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) +{ + if(!size1 || (!size2 && !size3)) + return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ + size2 += size3; + if(size2 < size3) + return 0; + return safe_malloc_mul_2op_(size1, size2); +} + +static FLaC__INLINE void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) +{ + size2 += size1; + if(size2 < size1) + return 0; + return realloc(ptr, size2); +} + +static FLaC__INLINE void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + return realloc(ptr, size3); +} + +static FLaC__INLINE void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) +{ + size2 += size1; + if(size2 < size1) + return 0; + size3 += size2; + if(size3 < size2) + return 0; + size4 += size3; + if(size4 < size3) + return 0; + return realloc(ptr, size4); +} + +static FLaC__INLINE void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) +{ + if(!size1 || !size2) + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + if(size1 > SIZE_MAX / size2) + return 0; + return realloc(ptr, size1*size2); +} + +/* size1 * (size2 + size3) */ +static FLaC__INLINE void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) +{ + if(!size1 || (!size2 && !size3)) + return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ + size2 += size3; + if(size2 < size3) + return 0; + return safe_realloc_mul_2op_(ptr, size1, size2); +} + +#endif diff -Nru mame-0.144/src/lib/libflac/include/share/utf8.h mame-0.145/src/lib/libflac/include/share/utf8.h --- mame-0.144/src/lib/libflac/include/share/utf8.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/include/share/utf8.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,25 @@ +#ifndef SHARE__UTF8_H +#define SHARE__UTF8_H + +/* + * Convert a string between UTF-8 and the locale's charset. + * Invalid bytes are replaced by '#', and characters that are + * not available in the target encoding are replaced by '?'. + * + * If the locale's charset is not set explicitly then it is + * obtained using nl_langinfo(CODESET), where available, the + * environment variable CHARSET, or assumed to be US-ASCII. + * + * Return value of conversion functions: + * + * -1 : memory allocation failed + * 0 : data was converted exactly + * 1 : valid data was converted approximately (using '?') + * 2 : input was invalid (but still converted, using '#') + * 3 : unknown encoding (but still converted, using '?') + */ + +int utf8_encode(const char *from, char **to); +int utf8_decode(const char *from, char **to); + +#endif diff -Nru mame-0.144/src/lib/libflac/libflac/bitmath.c mame-0.145/src/lib/libflac/libflac/bitmath.c --- mame-0.144/src/lib/libflac/libflac/bitmath.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/bitmath.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,149 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "private/bitmath.h" +#include "flac/assert.h" + +/* An example of what FLAC__bitmath_ilog2() computes: + * + * ilog2( 0) = assertion failure + * ilog2( 1) = 0 + * ilog2( 2) = 1 + * ilog2( 3) = 1 + * ilog2( 4) = 2 + * ilog2( 5) = 2 + * ilog2( 6) = 2 + * ilog2( 7) = 2 + * ilog2( 8) = 3 + * ilog2( 9) = 3 + * ilog2(10) = 3 + * ilog2(11) = 3 + * ilog2(12) = 3 + * ilog2(13) = 3 + * ilog2(14) = 3 + * ilog2(15) = 3 + * ilog2(16) = 4 + * ilog2(17) = 4 + * ilog2(18) = 4 + */ +unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) +{ + unsigned l = 0; + FLAC__ASSERT(v > 0); + while(v >>= 1) + l++; + return l; +} + +unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) +{ + unsigned l = 0; + FLAC__ASSERT(v > 0); + while(v >>= 1) + l++; + return l; +} + +/* An example of what FLAC__bitmath_silog2() computes: + * + * silog2(-10) = 5 + * silog2(- 9) = 5 + * silog2(- 8) = 4 + * silog2(- 7) = 4 + * silog2(- 6) = 4 + * silog2(- 5) = 4 + * silog2(- 4) = 3 + * silog2(- 3) = 3 + * silog2(- 2) = 2 + * silog2(- 1) = 2 + * silog2( 0) = 0 + * silog2( 1) = 2 + * silog2( 2) = 3 + * silog2( 3) = 3 + * silog2( 4) = 4 + * silog2( 5) = 4 + * silog2( 6) = 4 + * silog2( 7) = 4 + * silog2( 8) = 5 + * silog2( 9) = 5 + * silog2( 10) = 5 + */ +unsigned FLAC__bitmath_silog2(int v) +{ + while(1) { + if(v == 0) { + return 0; + } + else if(v > 0) { + unsigned l = 0; + while(v) { + l++; + v >>= 1; + } + return l+1; + } + else if(v == -1) { + return 2; + } + else { + v++; + v = -v; + } + } +} + +unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) +{ + while(1) { + if(v == 0) { + return 0; + } + else if(v > 0) { + unsigned l = 0; + while(v) { + l++; + v >>= 1; + } + return l+1; + } + else if(v == -1) { + return 2; + } + else { + v++; + v = -v; + } + } +} diff -Nru mame-0.144/src/lib/libflac/libflac/bitreader.c mame-0.145/src/lib/libflac/libflac/bitreader.c --- mame-0.144/src/lib/libflac/libflac/bitreader.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/bitreader.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1371 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + + +#include /* for malloc() */ +#include /* for memcpy(), memset() */ + +#include "private/bitmath.h" +#include "private/bitreader.h" +#include "private/crc.h" +#include "flac/assert.h" + +/* Things should be fastest when this matches the machine word size */ +/* WATCHOUT: if you change this you must also change the following #defines down to COUNT_ZERO_MSBS below to match */ +/* WATCHOUT: there are a few places where the code will not work unless brword is >= 32 bits wide */ +/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ +typedef FLAC__uint32 brword; +#define FLAC__BYTES_PER_WORD 4 +#define FLAC__BITS_PER_WORD 32 +#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a brword (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#ifdef _MSC_VER +#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) +#else +#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) +#endif +#endif +/* counts the # of zero MSBs in a word */ +#define COUNT_ZERO_MSBS(word) ( \ + (word) <= 0xffff ? \ + ( (word) <= 0xff? byte_to_unary_table[word] + 24 : byte_to_unary_table[(word) >> 8] + 16 ) : \ + ( (word) <= 0xffffff? byte_to_unary_table[word >> 16] + 8 : byte_to_unary_table[(word) >> 24] ) \ +) +/* this alternate might be slightly faster on some systems/compilers: */ +#define COUNT_ZERO_MSBS2(word) ( (word) <= 0xff ? byte_to_unary_table[word] + 24 : ((word) <= 0xffff ? byte_to_unary_table[(word) >> 8] + 16 : ((word) <= 0xffffff ? byte_to_unary_table[(word) >> 16] + 8 : byte_to_unary_table[(word) >> 24])) ) + + +/* + * This should be at least twice as large as the largest number of words + * required to represent any 'number' (in any encoding) you are going to + * read. With FLAC this is on the order of maybe a few hundred bits. + * If the buffer is smaller than that, the decoder won't be able to read + * in a whole number that is in a variable length encoding (e.g. Rice). + * But to be practical it should be at least 1K bytes. + * + * Increase this number to decrease the number of read callbacks, at the + * expense of using more memory. Or decrease for the reverse effect, + * keeping in mind the limit from the first paragraph. The optimal size + * also depends on the CPU cache size and other factors; some twiddling + * may be necessary to squeeze out the best performance. + */ +static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ + +static const unsigned char byte_to_unary_table[] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#ifdef min +#undef min +#endif +#define min(x,y) ((x)<(y)?(x):(y)) +#ifdef max +#undef max +#endif +#define max(x,y) ((x)>(y)?(x):(y)) + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +/* WATCHOUT: assembly routines rely on the order in which these fields are declared */ +struct FLAC__BitReader { + /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ + /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ + brword *buffer; + unsigned capacity; /* in words */ + unsigned words; /* # of completed words in buffer */ + unsigned bytes; /* # of bytes in incomplete word at buffer[words] */ + unsigned consumed_words; /* #words ... */ + unsigned consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ + unsigned read_crc16; /* the running frame CRC */ + unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ + FLAC__BitReaderReadCallback read_callback; + void *client_data; + FLAC__CPUInfo cpu_info; +}; + + +static FLAC__uint32 local_swap32_(FLAC__uint32 x) +{ + x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); + return (x>>16) | (x<<16); +} + +#ifdef _MSC_VER +/* OPT: an MSVC built-in would be better */ +static void local_swap32_block_(FLAC__uint32 *start, FLAC__uint32 len) +{ + __asm { + mov edx, start + mov ecx, len + test ecx, ecx +loop1: + jz done1 + mov eax, [edx] + bswap eax + mov [edx], eax + add edx, 4 + dec ecx + jmp short loop1 +done1: + } +} +#endif + +static FLaC__INLINE void crc16_update_word_(FLAC__BitReader *br, brword word) +{ + register unsigned crc = br->read_crc16; +#if FLAC__BYTES_PER_WORD == 4 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#elif FLAC__BYTES_PER_WORD == 8 + switch(br->crc16_align) { + case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc); + case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc); + case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc); + case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc); + case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc); + case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); + case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); + case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); + } +#else + for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) + crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); + br->read_crc16 = crc; +#endif + br->crc16_align = 0; +} + +/* would be static except it needs to be called by asm routines */ +FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) +{ + unsigned start, end; + size_t bytes; + FLAC__byte *target; + + /* first shift the unconsumed buffer data toward the front as much as possible */ + if(br->consumed_words > 0) { + start = br->consumed_words; + end = br->words + (br->bytes? 1:0); + memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); + + br->words -= start; + br->consumed_words = 0; + } + + /* + * set the target for reading, taking into account word alignment and endianness + */ + bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; + if(bytes == 0) + return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ + target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; + + /* before reading, if the existing reader looks like this (say brword is 32 bits wide) + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory) + * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) + * ^^-------target, bytes=3 + * on LE machines, have to byteswap the odd tail word so nothing is + * overwritten: + */ +#if WORDS_BIGENDIAN +#else + if(br->bytes) + br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 + * buffer[BE]: 11 22 33 44 55 ?? ?? ?? + * buffer[LE]: 44 33 22 11 55 ?? ?? ?? + * ^^-------target, bytes=3 + */ + + /* read in the data; note that the callback may return a smaller number of bytes */ + if(!br->read_callback(target, &bytes, br->client_data)) + return false; + + /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? + * now have to byteswap on LE machines: + */ +#if WORDS_BIGENDIAN +#else + end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; +# if defined(_MSC_VER) && (FLAC__BYTES_PER_WORD == 4) + if(br->cpu_info.type == FLAC__CPUINFO_TYPE_IA32 && br->cpu_info.data.ia32.bswap) { + start = br->words; + local_swap32_block_(br->buffer + start, end - start); + } + else +# endif + for(start = br->words; start < end; start++) + br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); +#endif + + /* now it looks like: + * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF + * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? + * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD + * finally we'll update the reader values: + */ + end = br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes; + br->words = end / FLAC__BYTES_PER_WORD; + br->bytes = end % FLAC__BYTES_PER_WORD; + + return true; +} + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +FLAC__BitReader *FLAC__bitreader_new(void) +{ + FLAC__BitReader *br = (FLAC__BitReader*)calloc(1, sizeof(FLAC__BitReader)); + + /* calloc() implies: + memset(br, 0, sizeof(FLAC__BitReader)); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; + */ + return br; +} + +void FLAC__bitreader_delete(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + FLAC__bitreader_free(br); + free(br); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd) +{ + FLAC__ASSERT(0 != br); + + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; + br->buffer = (brword*)malloc(sizeof(brword) * br->capacity); + if(br->buffer == 0) + return false; + br->read_callback = rcb; + br->client_data = cd; + br->cpu_info = cpu; + + return true; +} + +void FLAC__bitreader_free(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + + if(0 != br->buffer) + free(br->buffer); + br->buffer = 0; + br->capacity = 0; + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + br->read_callback = 0; + br->client_data = 0; +} + +FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) +{ + br->words = br->bytes = 0; + br->consumed_words = br->consumed_bits = 0; + return true; +} + +void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) +{ + unsigned i, j; + if(br == 0) { + fprintf(out, "bitreader is NULL\n"); + } + else { + fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); + + for(i = 0; i < br->words; i++) { + fprintf(out, "%08X: ", i); + for(j = 0; j < FLAC__BITS_PER_WORD; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); + fprintf(out, "\n"); + } + if(br->bytes > 0) { + fprintf(out, "%08X: ", i); + for(j = 0; j < br->bytes*8; j++) + if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) + fprintf(out, "."); + else + fprintf(out, "%01u", br->buffer[i] & (1 << (br->bytes*8-j-1)) ? 1:0); + fprintf(out, "\n"); + } + } +} + +void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + + br->read_crc16 = (unsigned)seed; + br->crc16_align = br->consumed_bits; +} + +FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT((br->consumed_bits & 7) == 0); + FLAC__ASSERT(br->crc16_align <= br->consumed_bits); + + /* CRC any tail bytes in a partially-consumed word */ + if(br->consumed_bits) { + const brword tail = br->buffer[br->consumed_words]; + for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) + br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); + } + return br->read_crc16; +} + +FLaC__INLINE FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) +{ + return ((br->consumed_bits & 7) == 0); +} + +FLaC__INLINE unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) +{ + return 8 - (br->consumed_bits & 7); +} + +FLaC__INLINE unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) +{ + return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; +} + +FLaC__INLINE FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits) +{ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + FLAC__ASSERT(bits <= 32); + FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); + FLAC__ASSERT(br->consumed_words <= br->words); + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ + *val = 0; + return true; + } + + while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { + if(!bitreader_read_from_client_(br)) + return false; + } + if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits; + const brword word = br->buffer[br->consumed_words]; + if(bits < n) { + *val = (word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits); + br->consumed_bits += bits; + return true; + } + *val = word & (FLAC__WORD_ALL_ONES >> br->consumed_bits); + bits -= n; + crc16_update_word_(br, word); + br->consumed_words++; + br->consumed_bits = 0; + if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + *val <<= bits; + *val |= (br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); + br->consumed_bits = bits; + } + return true; + } + else { + const brword word = br->buffer[br->consumed_words]; + if(bits < FLAC__BITS_PER_WORD) { + *val = word >> (FLAC__BITS_PER_WORD-bits); + br->consumed_bits = bits; + return true; + } + /* at this point 'bits' must be == FLAC__BITS_PER_WORD; because of previous assertions, it can't be larger */ + *val = word; + crc16_update_word_(br, word); + br->consumed_words++; + return true; + } + } + else { + /* in this case we're starting our read at a partial tail word; + * the reader has guaranteed that we have at least 'bits' bits + * available to read, which makes this case simpler. + */ + /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ + if(br->consumed_bits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); + *val = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits); + br->consumed_bits += bits; + return true; + } + else { + *val = br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits); + br->consumed_bits += bits; + return true; + } + } +} + +FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits) +{ + /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ + if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits)) + return false; + /* sign-extend: */ + *val <<= (32-bits); + *val >>= (32-bits); + return true; +} + +FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits) +{ + FLAC__uint32 hi, lo; + + if(bits > 32) { + if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) + return false; + if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) + return false; + *val = hi; + *val <<= 32; + *val |= lo; + } + else { + if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) + return false; + *val = lo; + } + return true; +} + +FLaC__INLINE FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) +{ + FLAC__uint32 x8, x32 = 0; + + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + + if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) + return false; + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 8); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 16); + + if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) + return false; + x32 |= (x8 << 24); + + *val = x32; + return true; +} + +FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits) +{ + /* + * OPT: a faster implementation is possible but probably not that useful + * since this is only called a couple of times in the metadata readers. + */ + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + if(bits > 0) { + const unsigned n = br->consumed_bits & 7; + unsigned m; + FLAC__uint32 x; + + if(n != 0) { + m = min(8-n, bits); + if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) + return false; + bits -= m; + } + m = bits / 8; + if(m > 0) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) + return false; + bits %= 8; + } + if(bits > 0) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) + return false; + } + } + + return true; +} + +FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: skip over partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: skip whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + br->consumed_words++; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: skip any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + nvals--; + } + + return true; +} + +FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals) +{ + FLAC__uint32 x; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); + + /* step 1: read from partial head word to get word aligned */ + while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + if(0 == nvals) + return true; + /* step 2: read whole words in chunks */ + while(nvals >= FLAC__BYTES_PER_WORD) { + if(br->consumed_words < br->words) { + const brword word = br->buffer[br->consumed_words++]; +#if FLAC__BYTES_PER_WORD == 4 + val[0] = (FLAC__byte)(word >> 24); + val[1] = (FLAC__byte)(word >> 16); + val[2] = (FLAC__byte)(word >> 8); + val[3] = (FLAC__byte)word; +#elif FLAC__BYTES_PER_WORD == 8 + val[0] = (FLAC__byte)(word >> 56); + val[1] = (FLAC__byte)(word >> 48); + val[2] = (FLAC__byte)(word >> 40); + val[3] = (FLAC__byte)(word >> 32); + val[4] = (FLAC__byte)(word >> 24); + val[5] = (FLAC__byte)(word >> 16); + val[6] = (FLAC__byte)(word >> 8); + val[7] = (FLAC__byte)word; +#else + for(x = 0; x < FLAC__BYTES_PER_WORD; x++) + val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); +#endif + val += FLAC__BYTES_PER_WORD; + nvals -= FLAC__BYTES_PER_WORD; + } + else if(!bitreader_read_from_client_(br)) + return false; + } + /* step 3: read any remainder from partial tail bytes */ + while(nvals) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + *val++ = (FLAC__byte)x; + nvals--; + } + + return true; +} + +FLaC__INLINE FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val) +#if 0 /* slow but readable version */ +{ + unsigned bit; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + if(bit) + break; + else + *val++; + } + return true; +} +#else +{ + unsigned i; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + *val = 0; + while(1) { + while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ + brword b = br->buffer[br->consumed_words] << br->consumed_bits; + if(b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + } + return true; + } + else { + *val += FLAC__BITS_PER_WORD - br->consumed_bits; + crc16_update_word_(br, br->buffer[br->consumed_words]); + br->consumed_words++; + br->consumed_bits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + * reading through any tail bytes before calling the read callback. + * this is a repeat of the above logic adjusted for the fact we + * don't have a whole word. note though if the client is feeding + * us data a byte at a time (unlikely), br->consumed_bits may not + * be zero. + */ + if(br->bytes) { + const unsigned end = br->bytes * 8; + brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; + if(b) { + i = COUNT_ZERO_MSBS(b); + *val += i; + i++; + br->consumed_bits += i; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + return true; + } + else { + *val += end - br->consumed_bits; + br->consumed_bits += end; + FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + if(!bitreader_read_from_client_(br)) + return false; + } +} +#endif + +FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned uval; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + FLAC__ASSERT(parameter <= 31); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) + return false; + + /* compose the value */ + uval = (msbs << parameter) | lsbs; + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +/* this is by far the most heavily used reader call. it ain't pretty but it's fast */ +/* a lot of the logic is copied, then adapted, from FLAC__bitreader_read_unary_unsigned() and FLAC__bitreader_read_raw_uint32() */ +FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) +/* OPT: possibly faster version for use with MSVC */ +#ifdef _MSC_VER +{ + unsigned i; + unsigned uval = 0; + unsigned bits; /* the # of binary LSBs left to read to finish a rice codeword */ + + /* try and get br->consumed_words and br->consumed_bits into register; + * must remember to flush them back to *br before calling other + * bitwriter functions that use them, and before returning */ + register unsigned cwords; + register unsigned cbits; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + FLAC__ASSERT(parameter < 32); + /* the above two asserts also guarantee that the binary part never straddles more that 2 words, so we don't have to loop to read it */ + + if(nvals == 0) + return true; + + cbits = br->consumed_bits; + cwords = br->consumed_words; + + while(1) { + + /* read unary part */ + while(1) { + while(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ + brword b = br->buffer[cwords] << cbits; + if(b) { +#if 0 /* slower, probably due to bad register allocation... */ && defined FLAC__CPU_IA32 && !defined FLAC__NO_ASM && FLAC__BITS_PER_WORD == 32 + __asm { + bsr eax, b + not eax + and eax, 31 + mov i, eax + } +#else + i = COUNT_ZERO_MSBS(b); +#endif + uval += i; + bits = parameter; + i++; + cbits += i; + if(cbits == FLAC__BITS_PER_WORD) { + crc16_update_word_(br, br->buffer[cwords]); + cwords++; + cbits = 0; + } + goto break1; + } + else { + uval += FLAC__BITS_PER_WORD - cbits; + crc16_update_word_(br, br->buffer[cwords]); + cwords++; + cbits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + * reading through any tail bytes before calling the read callback. + * this is a repeat of the above logic adjusted for the fact we + * don't have a whole word. note though if the client is feeding + * us data a byte at a time (unlikely), br->consumed_bits may not + * be zero. + */ + if(br->bytes) { + const unsigned end = br->bytes * 8; + brword b = (br->buffer[cwords] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << cbits; + if(b) { + i = COUNT_ZERO_MSBS(b); + uval += i; + bits = parameter; + i++; + cbits += i; + FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); + goto break1; + } + else { + uval += end - cbits; + cbits += end; + FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + /* flush registers and read; bitreader_read_from_client_() does + * not touch br->consumed_bits at all but we still need to set + * it in case it fails and we have to return false. + */ + br->consumed_bits = cbits; + br->consumed_words = cwords; + if(!bitreader_read_from_client_(br)) + return false; + cwords = br->consumed_words; + } +break1: + /* read binary part */ + FLAC__ASSERT(cwords <= br->words); + + if(bits) { + while((br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits < bits) { + /* flush registers and read; bitreader_read_from_client_() does + * not touch br->consumed_bits at all but we still need to set + * it in case it fails and we have to return false. + */ + br->consumed_bits = cbits; + br->consumed_words = cwords; + if(!bitreader_read_from_client_(br)) + return false; + cwords = br->consumed_words; + } + if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ + if(cbits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + const unsigned n = FLAC__BITS_PER_WORD - cbits; + const brword word = br->buffer[cwords]; + if(bits < n) { + uval <<= bits; + uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-bits); + cbits += bits; + goto break2; + } + uval <<= n; + uval |= word & (FLAC__WORD_ALL_ONES >> cbits); + bits -= n; + crc16_update_word_(br, word); + cwords++; + cbits = 0; + if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + uval <<= bits; + uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits)); + cbits = bits; + } + goto break2; + } + else { + FLAC__ASSERT(bits < FLAC__BITS_PER_WORD); + uval <<= bits; + uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits); + cbits = bits; + goto break2; + } + } + else { + /* in this case we're starting our read at a partial tail word; + * the reader has guaranteed that we have at least 'bits' bits + * available to read, which makes this case simpler. + */ + uval <<= bits; + if(cbits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(cbits + bits <= br->bytes*8); + uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-bits); + cbits += bits; + goto break2; + } + else { + uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits); + cbits += bits; + goto break2; + } + } + } +break2: + /* compose the value */ + *vals = (int)(uval >> 1 ^ -(int)(uval & 1)); + + /* are we done? */ + --nvals; + if(nvals == 0) { + br->consumed_bits = cbits; + br->consumed_words = cwords; + return true; + } + + uval = 0; + ++vals; + + } +} +#else +{ + unsigned i; + unsigned uval = 0; + + /* try and get br->consumed_words and br->consumed_bits into register; + * must remember to flush them back to *br before calling other + * bitwriter functions that use them, and before returning */ + register unsigned cwords; + register unsigned cbits; + unsigned ucbits; /* keep track of the number of unconsumed bits in the buffer */ + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + FLAC__ASSERT(parameter < 32); + /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ + + if(nvals == 0) + return true; + + cbits = br->consumed_bits; + cwords = br->consumed_words; + ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits; + + while(1) { + + /* read unary part */ + while(1) { + while(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ + brword b = br->buffer[cwords] << cbits; + if(b) { +#if 0 /* is not discernably faster... */ && defined FLAC__CPU_IA32 && !defined FLAC__NO_ASM && FLAC__BITS_PER_WORD == 32 && defined __GNUC__ + asm volatile ( + "bsrl %1, %0;" + "notl %0;" + "andl $31, %0;" + : "=r"(i) + : "r"(b) + ); +#else + i = COUNT_ZERO_MSBS(b); +#endif + uval += i; + cbits += i; + cbits++; /* skip over stop bit */ + if(cbits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(cbits == FLAC__BITS_PER_WORD) */ + crc16_update_word_(br, br->buffer[cwords]); + cwords++; + cbits = 0; + } + goto break1; + } + else { + uval += FLAC__BITS_PER_WORD - cbits; + crc16_update_word_(br, br->buffer[cwords]); + cwords++; + cbits = 0; + /* didn't find stop bit yet, have to keep going... */ + } + } + /* at this point we've eaten up all the whole words; have to try + * reading through any tail bytes before calling the read callback. + * this is a repeat of the above logic adjusted for the fact we + * don't have a whole word. note though if the client is feeding + * us data a byte at a time (unlikely), br->consumed_bits may not + * be zero. + */ + if(br->bytes) { + const unsigned end = br->bytes * 8; + brword b = (br->buffer[cwords] & ~(FLAC__WORD_ALL_ONES >> end)) << cbits; + if(b) { + i = COUNT_ZERO_MSBS(b); + uval += i; + cbits += i; + cbits++; /* skip over stop bit */ + FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); + goto break1; + } + else { + uval += end - cbits; + cbits += end; + FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); + /* didn't find stop bit yet, have to keep going... */ + } + } + /* flush registers and read; bitreader_read_from_client_() does + * not touch br->consumed_bits at all but we still need to set + * it in case it fails and we have to return false. + */ + br->consumed_bits = cbits; + br->consumed_words = cwords; + if(!bitreader_read_from_client_(br)) + return false; + cwords = br->consumed_words; + ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits + uval; + /* + uval to offset our count by the # of unary bits already + * consumed before the read, because we will add these back + * in all at once at break1 + */ + } +break1: + ucbits -= uval; + ucbits--; /* account for stop bit */ + + /* read binary part */ + FLAC__ASSERT(cwords <= br->words); + + if(parameter) { + while(ucbits < parameter) { + /* flush registers and read; bitreader_read_from_client_() does + * not touch br->consumed_bits at all but we still need to set + * it in case it fails and we have to return false. + */ + br->consumed_bits = cbits; + br->consumed_words = cwords; + if(!bitreader_read_from_client_(br)) + return false; + cwords = br->consumed_words; + ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits; + } + if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ + if(cbits) { + /* this also works when consumed_bits==0, it's just slower than necessary for that case */ + const unsigned n = FLAC__BITS_PER_WORD - cbits; + const brword word = br->buffer[cwords]; + if(parameter < n) { + uval <<= parameter; + uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-parameter); + cbits += parameter; + } + else { + uval <<= n; + uval |= word & (FLAC__WORD_ALL_ONES >> cbits); + crc16_update_word_(br, word); + cwords++; + cbits = parameter - n; + if(cbits) { /* parameter > n, i.e. if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ + uval <<= cbits; + uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits)); + } + } + } + else { + cbits = parameter; + uval <<= parameter; + uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits); + } + } + else { + /* in this case we're starting our read at a partial tail word; + * the reader has guaranteed that we have at least 'parameter' + * bits available to read, which makes this case simpler. + */ + uval <<= parameter; + if(cbits) { + /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ + FLAC__ASSERT(cbits + parameter <= br->bytes*8); + uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-parameter); + cbits += parameter; + } + else { + cbits = parameter; + uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits); + } + } + } + + ucbits -= parameter; + + /* compose the value */ + *vals = (int)(uval >> 1 ^ -(int)(uval & 1)); + + /* are we done? */ + --nvals; + if(nvals == 0) { + br->consumed_bits = cbits; + br->consumed_words = cwords; + return true; + } + + uval = 0; + ++vals; + + } +} +#endif + +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter) +{ + FLAC__uint32 lsbs = 0, msbs = 0; + unsigned bit, uval, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + uval = msbs * parameter + lsbs; + } + + /* unfold unsigned to signed */ + if(uval & 1) + *val = -((int)(uval >> 1)) - 1; + else + *val = (int)(uval >> 1); + + return true; +} + +FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter) +{ + FLAC__uint32 lsbs, msbs = 0; + unsigned bit, k; + + FLAC__ASSERT(0 != br); + FLAC__ASSERT(0 != br->buffer); + + k = FLAC__bitmath_ilog2(parameter); + + /* read the unary MSBs and end bit */ + if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) + return false; + + /* read the binary LSBs */ + if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) + return false; + + if(parameter == 1u<= d) { + if(!FLAC__bitreader_read_bit(br, &bit)) + return false; + lsbs <<= 1; + lsbs |= bit; + lsbs -= d; + } + /* compose the value */ + *val = msbs * parameter + lsbs; + } + + return true; +} +#endif /* UNUSED */ + +/* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint32 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else { + *val = 0xffffffff; + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = 0xffffffff; + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} + +/* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ +FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen) +{ + FLAC__uint64 v = 0; + FLAC__uint32 x; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80)) { /* 0xxxxxxx */ + v = x; + i = 0; + } + else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ + v = x & 0x1F; + i = 1; + } + else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ + v = x & 0x0F; + i = 2; + } + else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ + v = x & 0x07; + i = 3; + } + else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ + v = x & 0x03; + i = 4; + } + else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ + v = x & 0x01; + i = 5; + } + else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ + v = 0; + i = 6; + } + else { + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + for( ; i; i--) { + if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) + return false; + if(raw) + raw[(*rawlen)++] = (FLAC__byte)x; + if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ + *val = FLAC__U64L(0xffffffffffffffff); + return true; + } + v <<= 6; + v |= (x & 0x3F); + } + *val = v; + return true; +} diff -Nru mame-0.144/src/lib/libflac/libflac/bitwriter.c mame-0.145/src/lib/libflac/libflac/bitwriter.c --- mame-0.144/src/lib/libflac/libflac/bitwriter.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/bitwriter.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,883 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + + + +#include /* for malloc() */ +#include /* for memcpy(), memset() */ + +#if 0 /* UNUSED */ +#include "private/bitmath.h" +#endif +#include "private/bitwriter.h" +#include "private/crc.h" +#include "flac/assert.h" +#include "share/alloc.h" + +/* Things should be fastest when this matches the machine word size */ +/* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ +/* WATCHOUT: there are a few places where the code will not work unless bwword is >= 32 bits wide */ +typedef FLAC__uint32 bwword; +#define FLAC__BYTES_PER_WORD 4 +#define FLAC__BITS_PER_WORD 32 +#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) +/* SWAP_BE_WORD_TO_HOST swaps bytes in a bwword (which is always big-endian) if necessary to match host byte order */ +#if WORDS_BIGENDIAN +#define SWAP_BE_WORD_TO_HOST(x) (x) +#else +#ifdef _MSC_VER +#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) +#else +#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) +#endif +#endif + +/* + * The default capacity here doesn't matter too much. The buffer always grows + * to hold whatever is written to it. Usually the encoder will stop adding at + * a frame or metadata block, then write that out and clear the buffer for the + * next one. + */ +static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(bwword); /* size in words */ +/* When growing, increment 4K at a time */ +static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(bwword); /* size in words */ + +#define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD) +#define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits) + +#ifdef min +#undef min +#endif +#define min(x,y) ((x)<(y)?(x):(y)) + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +struct FLAC__BitWriter { + bwword *buffer; + bwword accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */ + unsigned capacity; /* capacity of buffer in words */ + unsigned words; /* # of complete words in buffer */ + unsigned bits; /* # of used bits in accum */ +}; + + +/* OPT: an MSVC built-in would be better */ +static FLAC__uint32 local_swap32_(FLAC__uint32 x) +{ + x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); + return (x>>16) | (x<<16); +} + + +/* * WATCHOUT: The current implementation only grows the buffer. */ +static FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) +{ + unsigned new_capacity; + bwword *new_buffer; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + /* calculate total words needed to store 'bits_to_add' additional bits */ + new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD); + + /* it's possible (due to pessimism in the growth estimation that + * leads to this call) that we don't actually need to grow + */ + if(bw->capacity >= new_capacity) + return true; + + /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */ + if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT) + new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); + /* make sure we got everything right */ + FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); + FLAC__ASSERT(new_capacity > bw->capacity); + FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD)); + + new_buffer = (bwword*)safe_realloc_mul_2op_(bw->buffer, sizeof(bwword), /*times*/new_capacity); + if(new_buffer == 0) + return false; + bw->buffer = new_buffer; + bw->capacity = new_capacity; + return true; +} + + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ + +FLAC__BitWriter *FLAC__bitwriter_new(void) +{ + FLAC__BitWriter *bw = (FLAC__BitWriter*)calloc(1, sizeof(FLAC__BitWriter)); + /* note that calloc() sets all members to 0 for us */ + return bw; +} + +void FLAC__bitwriter_delete(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + FLAC__bitwriter_free(bw); + free(bw); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + bw->words = bw->bits = 0; + bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY; + bw->buffer = (bwword*)malloc(sizeof(bwword) * bw->capacity); + if(bw->buffer == 0) + return false; + + return true; +} + +void FLAC__bitwriter_free(FLAC__BitWriter *bw) +{ + FLAC__ASSERT(0 != bw); + + if(0 != bw->buffer) + free(bw->buffer); + bw->buffer = 0; + bw->capacity = 0; + bw->words = bw->bits = 0; +} + +void FLAC__bitwriter_clear(FLAC__BitWriter *bw) +{ + bw->words = bw->bits = 0; +} + +void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out) +{ + unsigned i, j; + if(bw == 0) { + fprintf(out, "bitwriter is NULL\n"); + } + else { + fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw)); + + for(i = 0; i < bw->words; i++) { + fprintf(out, "%08X: ", i); + for(j = 0; j < FLAC__BITS_PER_WORD; j++) + fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); + fprintf(out, "\n"); + } + if(bw->bits > 0) { + fprintf(out, "%08X: ", i); + for(j = 0; j < bw->bits; j++) + fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0); + fprintf(out, "\n"); + } + } +} + +FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ + + if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) + return false; + + *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes); + FLAC__bitwriter_release_buffer(bw); + return true; +} + +FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ + + if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) + return false; + + *crc = FLAC__crc8(buffer, bytes); + FLAC__bitwriter_release_buffer(bw); + return true; +} + +FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw) +{ + return ((bw->bits & 7) == 0); +} + +unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw) +{ + return FLAC__TOTAL_BITS(bw); +} + +FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes) +{ + FLAC__ASSERT((bw->bits & 7) == 0); + /* double protection */ + if(bw->bits & 7) + return false; + /* if we have bits in the accumulator we have to flush those to the buffer first */ + if(bw->bits) { + FLAC__ASSERT(bw->words <= bw->capacity); + if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD)) + return false; + /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */ + bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits)); + } + /* now we can just return what we have */ + *buffer = (FLAC__byte*)bw->buffer; + *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3); + return true; +} + +void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw) +{ + /* nothing to do. in the future, strict checking of a 'writer-is-in- + * get-mode' flag could be added everywhere and then cleared here + */ + (void)bw; +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits) +{ + unsigned n; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + if(bits == 0) + return true; + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) + return false; + /* first part gets to word alignment */ + if(bw->bits) { + n = min(FLAC__BITS_PER_WORD - bw->bits, bits); + bw->accum <<= n; + bits -= n; + bw->bits += n; + if(bw->bits == FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + } + else + return true; + } + /* do whole words */ + while(bits >= FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = 0; + bits -= FLAC__BITS_PER_WORD; + } + /* do any leftovers */ + if(bits > 0) { + bw->accum = 0; + bw->bits = bits; + } + return true; +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) +{ + register unsigned left; + + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(bits <= 32); + if(bits == 0) + return true; + + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) + return false; + + left = FLAC__BITS_PER_WORD - bw->bits; + if(bits < left) { + bw->accum <<= bits; + bw->accum |= val; + bw->bits += bits; + } + else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */ + bw->accum <<= left; + bw->accum |= val >> (bw->bits = bits - left); + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->accum = val; + } + else { + bw->accum = val; + bw->bits = 0; + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val); + } + + return true; +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits) +{ + /* zero-out unused bits */ + if(bits < 32) + val &= (~(0xffffffff << bits)); + + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits) +{ + /* this could be a little faster but it's not used for much */ + if(bits > 32) { + return + FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) && + FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32); + } + else + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val) +{ + /* this doesn't need to be that fast as currently it is only used for vorbis comments */ + + if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8)) + return false; + + return true; +} + +FLaC__INLINE FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals) +{ + unsigned i; + + /* this could be faster but currently we don't need it to be since it's only used for writing metadata */ + for(i = 0; i < nvals; i++) { + if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8)) + return false; + } + + return true; +} + +FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val) +{ + if(val < 32) + return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val); + else + return + FLAC__bitwriter_write_zeroes(bw, val) && + FLAC__bitwriter_write_raw_uint32(bw, 1, 1); +} + +unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter) +{ + FLAC__uint32 uval; + + FLAC__ASSERT(parameter < sizeof(unsigned)*8); + + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (val<<1) ^ (val>>31); + + return 1 + parameter + (uval >> parameter); +} + +#if 0 /* UNUSED */ +unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter) +{ + unsigned bits, msbs, uval; + unsigned k; + + FLAC__ASSERT(parameter > 0); + + /* fold signed to unsigned */ + if(val < 0) + uval = (unsigned)(((-(++val)) << 1) + 1); + else + uval = (unsigned)(val << 1); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + bits = 1 + k + msbs; + } + else { + unsigned q, r, d; + + d = (1 << (k+1)) - parameter; + q = uval / parameter; + r = uval - (q * parameter); + + bits = 1 + q + k; + if(r >= d) + bits++; + } + return bits; +} + +unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter) +{ + unsigned bits, msbs; + unsigned k; + + FLAC__ASSERT(parameter > 0); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + bits = 1 + k + msbs; + } + else { + unsigned q, r, d; + + d = (1 << (k+1)) - parameter; + q = uval / parameter; + r = uval - (q * parameter); + + bits = 1 + q + k; + if(r >= d) + bits++; + } + return bits; +} +#endif /* UNUSED */ + +FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter) +{ + unsigned total_bits, interesting_bits, msbs; + FLAC__uint32 uval, pattern; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter < 8*sizeof(uval)); + + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (val<<1) ^ (val>>31); + + msbs = uval >> parameter; + interesting_bits = 1 + parameter; + total_bits = interesting_bits + msbs; + pattern = 1 << parameter; /* the unary end bit */ + pattern |= (uval & ((1<> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/ + FLAC__uint32 uval; + unsigned left; + const unsigned lsbits = 1 + parameter; + unsigned msbits; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter < 8*sizeof(bwword)-1); + /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ + FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); + + while(nvals) { + /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ + uval = (*vals<<1) ^ (*vals>>31); + + msbits = uval >> parameter; + +#if 0 /* OPT: can remove this special case if it doesn't make up for the extra compare (doesn't make a statistically significant difference with msvc or gcc/x86) */ + if(bw->bits && bw->bits + msbits + lsbits <= FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */ + /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free bwword to work in */ + bw->bits = bw->bits + msbits + lsbits; + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + /* NOT: bw->accum <<= msbits + lsbits because msbits+lsbits could be 32, then the shift would be a NOP */ + bw->accum <<= msbits; + bw->accum <<= lsbits; + bw->accum |= uval; + if(bw->bits == FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + /* burying the capacity check down here means we have to grow the buffer a little if there are more vals to do */ + if(bw->capacity <= bw->words && nvals > 1 && !bitwriter_grow_(bw, 1)) { + FLAC__ASSERT(bw->capacity == bw->words); + return false; + } + } + } + else { +#elif 1 /*@@@@@@ OPT: try this version with MSVC6 to see if better, not much difference for gcc-4 */ + if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */ + /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free bwword to work in */ + bw->bits = bw->bits + msbits + lsbits; + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + bw->accum <<= msbits + lsbits; + bw->accum |= uval; + } + else { +#endif + /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ + /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ + if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 bwword*/ && !bitwriter_grow_(bw, msbits+lsbits)) + return false; + + if(msbits) { + /* first part gets to word alignment */ + if(bw->bits) { + left = FLAC__BITS_PER_WORD - bw->bits; + if(msbits < left) { + bw->accum <<= msbits; + bw->bits += msbits; + goto break1; + } + else { + bw->accum <<= left; + msbits -= left; + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->bits = 0; + } + } + /* do whole words */ + while(msbits >= FLAC__BITS_PER_WORD) { + bw->buffer[bw->words++] = 0; + msbits -= FLAC__BITS_PER_WORD; + } + /* do any leftovers */ + if(msbits > 0) { + bw->accum = 0; + bw->bits = msbits; + } + } +break1: + uval |= mask1; /* set stop bit */ + uval &= mask2; /* mask off unused top bits */ + + left = FLAC__BITS_PER_WORD - bw->bits; + if(lsbits < left) { + bw->accum <<= lsbits; + bw->accum |= uval; + bw->bits += lsbits; + } + else { + /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always + * be > lsbits (because of previous assertions) so it would have + * triggered the (lsbitsbits); + FLAC__ASSERT(left < FLAC__BITS_PER_WORD); + bw->accum <<= left; + bw->accum |= uval >> (bw->bits = lsbits - left); + bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); + bw->accum = uval; + } +#if 1 + } +#endif + vals++; + nvals--; + } + return true; +} + +#if 0 /* UNUSED */ +FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter) +{ + unsigned total_bits, msbs, uval; + unsigned k; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter > 0); + + /* fold signed to unsigned */ + if(val < 0) + uval = (unsigned)(((-(++val)) << 1) + 1); + else + uval = (unsigned)(val << 1); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + total_bits = 1 + k + msbs; + pattern = 1 << k; /* the unary end bit */ + pattern |= (uval & ((1u<= d) { + if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) + return false; + } + else { + if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) + return false; + } + } + return true; +} + +FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter) +{ + unsigned total_bits, msbs; + unsigned k; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + FLAC__ASSERT(parameter > 0); + + k = FLAC__bitmath_ilog2(parameter); + if(parameter == 1u<> k; + total_bits = 1 + k + msbs; + pattern = 1 << k; /* the unary end bit */ + pattern |= (uval & ((1u<= d) { + if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) + return false; + } + else { + if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) + return false; + } + } + return true; +} +#endif /* UNUSED */ + +FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val) +{ + FLAC__bool ok = 1; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ + + if(val < 0x80) { + return FLAC__bitwriter_write_raw_uint32(bw, val, 8); + } + else if(val < 0x800) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x10000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x200000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else if(val < 0x4000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + else { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); + } + + return ok; +} + +FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val) +{ + FLAC__bool ok = 1; + + FLAC__ASSERT(0 != bw); + FLAC__ASSERT(0 != bw->buffer); + + FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */ + + if(val < 0x80) { + return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8); + } + else if(val < 0x800) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x10000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x200000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x4000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else if(val < 0x80000000) { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + else { + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); + ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); + } + + return ok; +} + +FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) +{ + /* 0-pad to byte boundary */ + if(bw->bits & 7u) + return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u)); + else + return true; +} diff -Nru mame-0.144/src/lib/libflac/libflac/cpu.c mame-0.145/src/lib/libflac/libflac/cpu.c --- mame-0.144/src/lib/libflac/libflac/cpu.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/cpu.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,418 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "private/cpu.h" +#include +#include + +#if defined FLAC__CPU_IA32 +# include +#elif defined FLAC__CPU_PPC +# if !defined FLAC__NO_ASM +# if defined FLAC__SYS_DARWIN +# include +# include +# include +# include +# include +# ifndef CPU_SUBTYPE_POWERPC_970 +# define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) +# endif +# else /* FLAC__SYS_DARWIN */ + +# include +# include + +static sigjmp_buf jmpbuf; +static volatile sig_atomic_t canjump = 0; + +static void sigill_handler (int sig) +{ + if (!canjump) { + signal (sig, SIG_DFL); + raise (sig); + } + canjump = 0; + siglongjmp (jmpbuf, 1); +} +# endif /* FLAC__SYS_DARWIN */ +# endif /* FLAC__NO_ASM */ +#endif /* FLAC__CPU_PPC */ + +#if defined (__NetBSD__) || defined(__OpenBSD__) +#include +#include +#include +#endif + +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#include +#include +#endif + +#if defined(__APPLE__) +/* how to get sysctlbyname()? */ +#endif + +/* these are flags in EDX of CPUID AX=00000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_FXSR = 0x01000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000; +/* these are flags in ECX of CPUID AX=00000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200; +/* these are flags in EDX of CPUID AX=80000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW = 0x80000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW = 0x40000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; + + +/* + * Extra stuff needed for detection of OS support for SSE on IA-32 + */ +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS +# if defined(__linux__) +/* + * If the OS doesn't support SSE, we will get here with a SIGILL. We + * modify the return address to jump over the offending SSE instruction + * and also the operation following it that indicates the instruction + * executed successfully. In this way we use no global variables and + * stay thread-safe. + * + * 3 + 3 + 6: + * 3 bytes for "xorps xmm0,xmm0" + * 3 bytes for estimate of how long the follwing "inc var" instruction is + * 6 bytes extra in case our estimate is wrong + * 12 bytes puts us in the NOP "landing zone" + */ +# undef USE_OBSOLETE_SIGCONTEXT_FLAVOR /* #define this to use the older signal handler method */ +# ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR + static void sigill_handler_sse_os(int signal, struct sigcontext sc) + { + (void)signal; + sc.eip += 3 + 3 + 6; + } +# else +# include + static void sigill_handler_sse_os(int signal, siginfo_t *si, void *uc) + { + (void)signal, (void)si; + ((ucontext_t*)uc)->uc_mcontext.gregs[14/*REG_EIP*/] += 3 + 3 + 6; + } +# endif +# elif defined(_MSC_VER) +# include +# undef USE_TRY_CATCH_FLAVOR /* #define this to use the try/catch method for catching illegal opcode exception */ +# ifdef USE_TRY_CATCH_FLAVOR +# else + LONG CALLBACK sigill_handler_sse_os(EXCEPTION_POINTERS *ep) + { + if(ep->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) { + ep->ContextRecord->Eip += 3 + 3 + 6; + return EXCEPTION_CONTINUE_EXECUTION; + } + return EXCEPTION_CONTINUE_SEARCH; + } +# endif +# endif +#endif + + +void FLAC__cpu_info(FLAC__CPUInfo *info) +{ +/* + * IA32-specific + */ +#ifdef FLAC__CPU_IA32 + info->type = FLAC__CPUINFO_TYPE_IA32; +#if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM + info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ + info->data.ia32.cpuid = FLAC__cpu_have_cpuid_asm_ia32()? true : false; + info->data.ia32.bswap = info->data.ia32.cpuid; /* CPUID => BSWAP since it came after */ + info->data.ia32.cmov = false; + info->data.ia32.mmx = false; + info->data.ia32.fxsr = false; + info->data.ia32.sse = false; + info->data.ia32.sse2 = false; + info->data.ia32.sse3 = false; + info->data.ia32.ssse3 = false; + info->data.ia32._3dnow = false; + info->data.ia32.ext3dnow = false; + info->data.ia32.extmmx = false; + if(info->data.ia32.cpuid) { + /* http://www.sandpile.org/ia32/cpuid.htm */ + FLAC__uint32 flags_edx, flags_ecx; + FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); + info->data.ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; + info->data.ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; + info->data.ia32.fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; + info->data.ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; + info->data.ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; + info->data.ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; + info->data.ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; + +#ifdef FLAC__USE_3DNOW + flags_edx = FLAC__cpu_info_extended_amd_asm_ia32(); + info->data.ia32._3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW )? true : false; + info->data.ia32.ext3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW)? true : false; + info->data.ia32.extmmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX )? true : false; +#else + info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = false; +#endif + +#ifdef DEBUG + fprintf(stderr, "CPU info (IA-32):\n"); + fprintf(stderr, " CPUID ...... %c\n", info->data.ia32.cpuid ? 'Y' : 'n'); + fprintf(stderr, " BSWAP ...... %c\n", info->data.ia32.bswap ? 'Y' : 'n'); + fprintf(stderr, " CMOV ....... %c\n", info->data.ia32.cmov ? 'Y' : 'n'); + fprintf(stderr, " MMX ........ %c\n", info->data.ia32.mmx ? 'Y' : 'n'); + fprintf(stderr, " FXSR ....... %c\n", info->data.ia32.fxsr ? 'Y' : 'n'); + fprintf(stderr, " SSE ........ %c\n", info->data.ia32.sse ? 'Y' : 'n'); + fprintf(stderr, " SSE2 ....... %c\n", info->data.ia32.sse2 ? 'Y' : 'n'); + fprintf(stderr, " SSE3 ....... %c\n", info->data.ia32.sse3 ? 'Y' : 'n'); + fprintf(stderr, " SSSE3 ...... %c\n", info->data.ia32.ssse3 ? 'Y' : 'n'); + fprintf(stderr, " 3DNow! ..... %c\n", info->data.ia32._3dnow ? 'Y' : 'n'); + fprintf(stderr, " 3DNow!-ext . %c\n", info->data.ia32.ext3dnow? 'Y' : 'n'); + fprintf(stderr, " 3DNow!-MMX . %c\n", info->data.ia32.extmmx ? 'Y' : 'n'); +#endif + + /* + * now have to check for OS support of SSE/SSE2 + */ + if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { +#if defined FLAC__NO_SSE_OS + /* assume user knows better than us; turn it off */ + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined FLAC__SSE_OS + /* assume user knows better than us; leave as detected above */ +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) + int sse = 0; + size_t len; + /* at least one of these must work: */ + len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); + len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined(__NetBSD__) || defined (__OpenBSD__) +# if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) + int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; + size_t len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + else { /* double-check SSE2 */ + mib[1] = CPU_SSE2; + len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) + info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + } +# else + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +# endif +#elif defined(__linux__) + int sse = 0; + struct sigaction sigill_save; +#ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR + if(0 == sigaction(SIGILL, NULL, &sigill_save) && signal(SIGILL, (void (*)(int))sigill_handler_sse_os) != SIG_ERR) +#else + struct sigaction sigill_sse; + sigill_sse.sa_sigaction = sigill_handler_sse_os; + __sigemptyset(&sigill_sse.sa_mask); + sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ + if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) +#endif + { + /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ + /* see sigill_handler_sse_os() for an explanation of the following: */ + asm volatile ( + "xorl %0,%0\n\t" /* for some reason, still need to do this to clear 'sse' var */ + "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ + "incl %0\n\t" /* SIGILL handler will jump over this */ + /* landing zone */ + "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" + "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ + "nop\n\t" + "nop" /* SIGILL jump lands here if "inc" is 1 byte */ + : "=r"(sse) + : "r"(sse) + ); + + sigaction(SIGILL, &sigill_save, NULL); + } + + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#elif defined(_MSC_VER) +# ifdef USE_TRY_CATCH_FLAVOR + _try { + __asm { +# if _MSC_VER <= 1200 + /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ + _emit 0x0F + _emit 0x57 + _emit 0xC0 +# else + xorps xmm0,xmm0 +# endif + } + } + _except(EXCEPTION_EXECUTE_HANDLER) { + if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + } +# else + int sse = 0; + LPTOP_LEVEL_EXCEPTION_FILTER save = SetUnhandledExceptionFilter(sigill_handler_sse_os); + /* see GCC version above for explanation */ + /* http://msdn2.microsoft.com/en-us/library/4ks26t93.aspx */ + /* http://www.codeproject.com/cpp/gccasm.asp */ + /* http://www.hick.org/~mmiller/msvc_inline_asm.html */ + __asm { +# if _MSC_VER <= 1200 + /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ + _emit 0x0F + _emit 0x57 + _emit 0xC0 +# else + xorps xmm0,xmm0 +# endif + inc sse + nop + nop + nop + nop + nop + nop + nop + nop + nop + } + SetUnhandledExceptionFilter(save); + if(!sse) + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +# endif +#else + /* no way to test, disable to be safe */ + info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; +#endif +#ifdef DEBUG + fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); +#endif + + } + } +#else + info->use_asm = false; +#endif + +/* + * PPC-specific + */ +#elif defined FLAC__CPU_PPC + info->type = FLAC__CPUINFO_TYPE_PPC; +# if !defined FLAC__NO_ASM + info->use_asm = true; +# ifdef FLAC__USE_ALTIVEC +# if defined FLAC__SYS_DARWIN + { + int val = 0, mib[2] = { CTL_HW, HW_VECTORUNIT }; + size_t len = sizeof(val); + info->data.ppc.altivec = !(sysctl(mib, 2, &val, &len, NULL, 0) || !val); + } + { + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); + + info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); + } +# else /* FLAC__USE_ALTIVEC && !FLAC__SYS_DARWIN */ + { + /* no Darwin, do it the brute-force way */ + /* @@@@@@ this is not thread-safe; replace with SSE OS method above or remove */ + info->data.ppc.altivec = 0; + info->data.ppc.ppc64 = 0; + + signal (SIGILL, sigill_handler); + canjump = 0; + if (!sigsetjmp (jmpbuf, 1)) { + canjump = 1; + + asm volatile ( + "mtspr 256, %0\n\t" + "vand %%v0, %%v0, %%v0" + : + : "r" (-1) + ); + + info->data.ppc.altivec = 1; + } + canjump = 0; + if (!sigsetjmp (jmpbuf, 1)) { + int x = 0; + canjump = 1; + + /* PPC64 hardware implements the cntlzd instruction */ + asm volatile ("cntlzd %0, %1" : "=r" (x) : "r" (x) ); + + info->data.ppc.ppc64 = 1; + } + signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ + } +# endif +# else /* !FLAC__USE_ALTIVEC */ + info->data.ppc.altivec = 0; + info->data.ppc.ppc64 = 0; +# endif +# else + info->use_asm = false; +# endif + +/* + * unknown CPI + */ +#else + info->type = FLAC__CPUINFO_TYPE_UNKNOWN; + info->use_asm = false; +#endif +} diff -Nru mame-0.144/src/lib/libflac/libflac/crc.c mame-0.145/src/lib/libflac/libflac/crc.c --- mame-0.144/src/lib/libflac/libflac/crc.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/crc.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,142 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "private/crc.h" + +/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ + +FLAC__byte const FLAC__crc8_table[256] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, + 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, + 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, + 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, + 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, + 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, + 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, + 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, + 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, + 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, + 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, + 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, + 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, + 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, + 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, + 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, + 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 +}; + +/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ + +unsigned FLAC__crc16_table[256] = { + 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, + 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, + 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, + 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, + 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, + 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, + 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, + 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, + 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, + 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, + 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, + 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, + 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, + 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, + 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, + 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, + 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, + 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, + 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 +}; + + +void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) +{ + *crc = FLAC__crc8_table[*crc ^ data]; +} + +void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) +{ + while(len--) + *crc = FLAC__crc8_table[*crc ^ *data++]; +} + +FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) +{ + FLAC__uint8 crc = 0; + + while(len--) + crc = FLAC__crc8_table[crc ^ *data++]; + + return crc; +} + +unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) +{ + unsigned crc = 0; + + while(len--) + crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; + + return crc; +} diff -Nru mame-0.144/src/lib/libflac/libflac/fixed.c mame-0.145/src/lib/libflac/libflac/fixed.c --- mame-0.144/src/lib/libflac/libflac/fixed.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/fixed.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,435 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "private/bitmath.h" +#include "private/fixed.h" +#include "flac/assert.h" + +#ifndef M_LN2 +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_LN2 0.69314718055994530942 +#endif + +#ifdef min +#undef min +#endif +#define min(x,y) ((x) < (y)? (x) : (y)) + +#ifdef local_abs +#undef local_abs +#endif +#define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) + +#ifdef FLAC__INTEGER_ONLY_LIBRARY +/* rbps stands for residual bits per sample + * + * (ln(2) * err) + * rbps = log (-----------) + * 2 ( n ) + */ +static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) +{ + FLAC__uint32 rbps; + unsigned bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if(err <= n) + return 0; + /* + * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + * These allow us later to know we won't lose too much precision in the + * fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2(err)+1; + if(bits > 16) { + err >>= (bits-16); + fracbits -= (bits-16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if(f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); + + if(rbps == 0) + return 0; + + /* + * The return value must have 16 fractional bits. Since the whole part + * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + * must be >= -3, these assertion allows us to be able to shift rbps + * left if necessary to get 16 fracbits without losing any bits of the + * whole part of rbps. + * + * There is a slight chance due to accumulated error that the whole part + * will require 6 bits, so we use 6 in the assertion. Really though as + * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if(fracbits < 16) + return rbps << (16-fracbits); + else if(fracbits > 16) + return rbps >> (fracbits-16); + else + return rbps; +} + +static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) +{ + FLAC__uint32 rbps; + unsigned bits; /* the number of bits required to represent a number */ + int fracbits; /* the number of bits of rbps that comprise the fractional part */ + + FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); + FLAC__ASSERT(err > 0); + FLAC__ASSERT(n > 0); + + FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); + if(err <= n) + return 0; + /* + * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. + * These allow us later to know we won't lose too much precision in the + * fixed-point division (err< 0); + bits = FLAC__bitmath_ilog2_wide(err)+1; + if(bits > 16) { + err >>= (bits-16); + fracbits -= (bits-16); + } + rbps = (FLAC__uint32)err; + + /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ + rbps *= FLAC__FP_LN2; + fracbits += 16; + FLAC__ASSERT(fracbits >= 0); + + /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ + { + const int f = fracbits & 3; + if(f) { + rbps >>= f; + fracbits -= f; + } + } + + rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); + + if(rbps == 0) + return 0; + + /* + * The return value must have 16 fractional bits. Since the whole part + * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits + * must be >= -3, these assertion allows us to be able to shift rbps + * left if necessary to get 16 fracbits without losing any bits of the + * whole part of rbps. + * + * There is a slight chance due to accumulated error that the whole part + * will require 6 bits, so we use 6 in the assertion. Really though as + * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. + */ + FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); + FLAC__ASSERT(fracbits >= -3); + + /* now shift the decimal point into place */ + if(fracbits < 16) + return rbps << (16-fracbits); + else if(fracbits > 16) + return rbps >> (fracbits-16); + else + return rbps; +} +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#else +unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#endif +{ + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); + FLAC__int32 error, save; + FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + unsigned i, order; + + for(i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) + order = 0; + else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) + order = 1; + else if(total_error_2 < min(total_error_3, total_error_4)) + order = 2; + else if(total_error_3 < total_error_4) + order = 3; + else + order = 4; + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); +#ifndef FLAC__INTEGER_ONLY_LIBRARY + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#else + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; +#endif + + return order; +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#else +unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) +#endif +{ + FLAC__int32 last_error_0 = data[-1]; + FLAC__int32 last_error_1 = data[-1] - data[-2]; + FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); + FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); + FLAC__int32 error, save; + /* total_error_* are 64-bits to avoid overflow when encoding + * erratic signals when the bits-per-sample and blocksize are + * large. + */ + FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; + unsigned i, order; + + for(i = 0; i < data_len; i++) { + error = data[i] ; total_error_0 += local_abs(error); save = error; + error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; + error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; + error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; + error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; + } + + if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) + order = 0; + else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) + order = 1; + else if(total_error_2 < min(total_error_3, total_error_4)) + order = 2; + else if(total_error_3 < total_error_4) + order = 3; + else + order = 4; + + /* Estimate the expected number of bits per residual signal sample. */ + /* 'total_error*' is linearly related to the variance of the residual */ + /* signal, so we use it directly to compute E(|x|) */ + FLAC__ASSERT(data_len > 0 || total_error_0 == 0); + FLAC__ASSERT(data_len > 0 || total_error_1 == 0); + FLAC__ASSERT(data_len > 0 || total_error_2 == 0); + FLAC__ASSERT(data_len > 0 || total_error_3 == 0); + FLAC__ASSERT(data_len > 0 || total_error_4 == 0); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with MSVC you have to spoon feed it the casting */ + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#else + residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); + residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); +#endif +#else + residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; + residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; + residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; + residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; + residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; +#endif + + return order; +} + +void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) +{ + const int idata_len = (int)data_len; + int i; + + switch(order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(residual, data, sizeof(residual[0])*data_len); + break; + case 1: + for(i = 0; i < idata_len; i++) + residual[i] = data[i] - data[i-1]; + break; + case 2: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; +#else + residual[i] = data[i] - 2*data[i-1] + data[i-2]; +#endif + break; + case 3: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; +#else + residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; +#endif + break; + case 4: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; +#else + residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; +#endif + break; + default: + FLAC__ASSERT(0); + } +} + +void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) +{ + int i, idata_len = (int)data_len; + + switch(order) { + case 0: + FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); + memcpy(data, residual, sizeof(residual[0])*data_len); + break; + case 1: + for(i = 0; i < idata_len; i++) + data[i] = residual[i] + data[i-1]; + break; + case 2: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; +#else + data[i] = residual[i] + 2*data[i-1] - data[i-2]; +#endif + break; + case 3: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; +#else + data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; +#endif + break; + case 4: + for(i = 0; i < idata_len; i++) +#if 1 /* OPT: may be faster with some compilers on some systems */ + data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; +#else + data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; +#endif + break; + default: + FLAC__ASSERT(0); + } +} diff -Nru mame-0.144/src/lib/libflac/libflac/float.c mame-0.145/src/lib/libflac/libflac/float.c --- mame-0.144/src/lib/libflac/libflac/float.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/float.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,308 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "flac/assert.h" + +#include "private/float.h" + +#ifdef FLAC__INTEGER_ONLY_LIBRARY + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + +const FLAC__fixedpoint FLAC__FP_ZERO = 0; +const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; +const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; +const FLAC__fixedpoint FLAC__FP_LN2 = 45426; +const FLAC__fixedpoint FLAC__FP_E = 178145; + +/* Lookup tables for Knuth's logarithm algorithm */ +#define LOG2_LOOKUP_PRECISION 16 +static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { + { + /* + * 0 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000001, + /* lg(4/3) = */ 0x00000000, + /* lg(8/7) = */ 0x00000000, + /* lg(16/15) = */ 0x00000000, + /* lg(32/31) = */ 0x00000000, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 4 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000010, + /* lg(4/3) = */ 0x00000007, + /* lg(8/7) = */ 0x00000003, + /* lg(16/15) = */ 0x00000001, + /* lg(32/31) = */ 0x00000001, + /* lg(64/63) = */ 0x00000000, + /* lg(128/127) = */ 0x00000000, + /* lg(256/255) = */ 0x00000000, + /* lg(512/511) = */ 0x00000000, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 8 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00000100, + /* lg(4/3) = */ 0x0000006a, + /* lg(8/7) = */ 0x00000031, + /* lg(16/15) = */ 0x00000018, + /* lg(32/31) = */ 0x0000000c, + /* lg(64/63) = */ 0x00000006, + /* lg(128/127) = */ 0x00000003, + /* lg(256/255) = */ 0x00000001, + /* lg(512/511) = */ 0x00000001, + /* lg(1024/1023) = */ 0x00000000, + /* lg(2048/2047) = */ 0x00000000, + /* lg(4096/4095) = */ 0x00000000, + /* lg(8192/8191) = */ 0x00000000, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 12 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00001000, + /* lg(4/3) = */ 0x000006a4, + /* lg(8/7) = */ 0x00000315, + /* lg(16/15) = */ 0x0000017d, + /* lg(32/31) = */ 0x000000bc, + /* lg(64/63) = */ 0x0000005d, + /* lg(128/127) = */ 0x0000002e, + /* lg(256/255) = */ 0x00000017, + /* lg(512/511) = */ 0x0000000c, + /* lg(1024/1023) = */ 0x00000006, + /* lg(2048/2047) = */ 0x00000003, + /* lg(4096/4095) = */ 0x00000001, + /* lg(8192/8191) = */ 0x00000001, + /* lg(16384/16383) = */ 0x00000000, + /* lg(32768/32767) = */ 0x00000000 + }, + { + /* + * 16 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00010000, + /* lg(4/3) = */ 0x00006a40, + /* lg(8/7) = */ 0x00003151, + /* lg(16/15) = */ 0x000017d6, + /* lg(32/31) = */ 0x00000bba, + /* lg(64/63) = */ 0x000005d1, + /* lg(128/127) = */ 0x000002e6, + /* lg(256/255) = */ 0x00000172, + /* lg(512/511) = */ 0x000000b9, + /* lg(1024/1023) = */ 0x0000005c, + /* lg(2048/2047) = */ 0x0000002e, + /* lg(4096/4095) = */ 0x00000017, + /* lg(8192/8191) = */ 0x0000000c, + /* lg(16384/16383) = */ 0x00000006, + /* lg(32768/32767) = */ 0x00000003 + }, + { + /* + * 20 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x00100000, + /* lg(4/3) = */ 0x0006a3fe, + /* lg(8/7) = */ 0x00031513, + /* lg(16/15) = */ 0x00017d60, + /* lg(32/31) = */ 0x0000bb9d, + /* lg(64/63) = */ 0x00005d10, + /* lg(128/127) = */ 0x00002e59, + /* lg(256/255) = */ 0x00001721, + /* lg(512/511) = */ 0x00000b8e, + /* lg(1024/1023) = */ 0x000005c6, + /* lg(2048/2047) = */ 0x000002e3, + /* lg(4096/4095) = */ 0x00000171, + /* lg(8192/8191) = */ 0x000000b9, + /* lg(16384/16383) = */ 0x0000005c, + /* lg(32768/32767) = */ 0x0000002e + }, + { + /* + * 24 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x01000000, + /* lg(4/3) = */ 0x006a3fe6, + /* lg(8/7) = */ 0x00315130, + /* lg(16/15) = */ 0x0017d605, + /* lg(32/31) = */ 0x000bb9ca, + /* lg(64/63) = */ 0x0005d0fc, + /* lg(128/127) = */ 0x0002e58f, + /* lg(256/255) = */ 0x0001720e, + /* lg(512/511) = */ 0x0000b8d8, + /* lg(1024/1023) = */ 0x00005c61, + /* lg(2048/2047) = */ 0x00002e2d, + /* lg(4096/4095) = */ 0x00001716, + /* lg(8192/8191) = */ 0x00000b8b, + /* lg(16384/16383) = */ 0x000005c5, + /* lg(32768/32767) = */ 0x000002e3 + }, + { + /* + * 28 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ 0x10000000, + /* lg(4/3) = */ 0x06a3fe5c, + /* lg(8/7) = */ 0x03151301, + /* lg(16/15) = */ 0x017d6049, + /* lg(32/31) = */ 0x00bb9ca6, + /* lg(64/63) = */ 0x005d0fba, + /* lg(128/127) = */ 0x002e58f7, + /* lg(256/255) = */ 0x001720da, + /* lg(512/511) = */ 0x000b8d87, + /* lg(1024/1023) = */ 0x0005c60b, + /* lg(2048/2047) = */ 0x0002e2d7, + /* lg(4096/4095) = */ 0x00017160, + /* lg(8192/8191) = */ 0x0000b8ad, + /* lg(16384/16383) = */ 0x00005c56, + /* lg(32768/32767) = */ 0x00002e2b + } +}; + +#if 0 +static const FLAC__uint64 log2_lookup_wide[] = { + { + /* + * 32 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x100000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), + /* lg(8/7) = */ FLAC__U64L(0x31513015), + /* lg(16/15) = */ FLAC__U64L(0x17d60497), + /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), + /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), + /* lg(128/127) = */ FLAC__U64L(0x02e58f74), + /* lg(256/255) = */ FLAC__U64L(0x01720d9c), + /* lg(512/511) = */ FLAC__U64L(0x00b8d875), + /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), + /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), + /* lg(4096/4095) = */ FLAC__U64L(0x00171600), + /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), + /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), + /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) + }, + { + /* + * 48 fraction bits + */ + /* undefined */ 0x00000000, + /* lg(2/1) = */ FLAC__U64L(0x1000000000000), + /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), + /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), + /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), + /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), + /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), + /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), + /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), + /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), + /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), + /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), + /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), + /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), + /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), + /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) + } +}; +#endif + +FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) +{ + const FLAC__uint32 ONE = (1u << fracbits); + const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; + + FLAC__ASSERT(fracbits < 32); + FLAC__ASSERT((fracbits & 0x3) == 0); + + if(x < ONE) + return 0; + + if(precision > LOG2_LOOKUP_PRECISION) + precision = LOG2_LOOKUP_PRECISION; + + /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ + { + FLAC__uint32 y = 0; + FLAC__uint32 z = x >> 1, k = 1; + while (x > ONE && k < precision) { + if (x - z >= ONE) { + x -= z; + z = x >> k; + y += table[k]; + } + else { + z >>= 1; + k++; + } + } + return y; + } +} + +#endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ diff -Nru mame-0.144/src/lib/libflac/libflac/format.c mame-0.145/src/lib/libflac/libflac/format.c --- mame-0.144/src/lib/libflac/libflac/format.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/format.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,593 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for qsort() */ +#include /* for memset() */ +#include "flac/assert.h" +#include "flac/format.h" +#include "private/format.h" + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +#ifdef min +#undef min +#endif +#define min(a,b) ((a)<(b)?(a):(b)) + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + +/* VERSION should come from configure */ +FLAC_API const char *FLAC__VERSION_STRING = VERSION; + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINW32__ +/* yet one more hack because of MSVC6: */ +FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.2.1 20070917"; +#else +FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20070917"; +#endif + +FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; +FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; +FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN = 3; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN = 5; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN = 36; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN = 128; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN = 16; /* bits */ + +FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER = FLAC__U64L(0xffffffffffffffff); + +FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN = 32; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN = 32; /* bits */ + +FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN = 7; /* bits */ +FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN = 24; /* bits */ + +FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC = 0x3ffe; +FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN = 14; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN = 3; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN = 1; /* bits */ +FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN = 8; /* bits */ + +FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN = 16; /* bits */ + +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN = 2; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN = 4; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN = 5; /* bits */ +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN = 5; /* bits */ + +FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER = 15; /* == (1< FLAC__MAX_SAMPLE_RATE) { + return false; + } + else + return true; +} + +FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) +{ + if( + !FLAC__format_sample_rate_is_valid(sample_rate) || + ( + sample_rate >= (1u << 16) && + !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) + ) + ) { + return false; + } + else + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) +{ + unsigned i; + FLAC__uint64 prev_sample_number = 0; + FLAC__bool got_prev = false; + + FLAC__ASSERT(0 != seek_table); + + for(i = 0; i < seek_table->num_points; i++) { + if(got_prev) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].sample_number <= prev_sample_number + ) + return false; + } + prev_sample_number = seek_table->points[i].sample_number; + got_prev = true; + } + + return true; +} + +/* used as the sort predicate for qsort() */ +static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) +{ + /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ + if(l->sample_number == r->sample_number) + return 0; + else if(l->sample_number < r->sample_number) + return -1; + else + return 1; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) +{ + unsigned i, j; + FLAC__bool first; + + FLAC__ASSERT(0 != seek_table); + + /* sort the seekpoints */ + qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); + + /* uniquify the seekpoints */ + first = true; + for(i = j = 0; i < seek_table->num_points; i++) { + if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { + if(!first) { + if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) + continue; + } + } + first = false; + seek_table->points[j++] = seek_table->points[i]; + } + + for(i = j; i < seek_table->num_points; i++) { + seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + + return j; +} + +/* + * also disallows non-shortest-form encodings, c.f. + * http://www.unicode.org/versions/corrigendum1.html + * and a more clear explanation at the end of this section: + * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + */ +static FLaC__INLINE unsigned utf8len_(const FLAC__byte *utf8) +{ + FLAC__ASSERT(0 != utf8); + if ((utf8[0] & 0x80) == 0) { + return 1; + } + else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { + if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ + return 0; + return 2; + } + else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { + if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */ + return 0; + /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ + if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */ + return 0; + if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */ + return 0; + return 3; + } + else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { + if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */ + return 0; + return 4; + } + else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { + if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */ + return 0; + return 5; + } + else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { + if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */ + return 0; + return 6; + } + else { + return 0; + } +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) +{ + char c; + for(c = *name; c; c = *(++name)) + if(c < 0x20 || c == 0x3d || c > 0x7d) + return false; + return true; +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length) +{ + if(length == (unsigned)(-1)) { + while(*value) { + unsigned n = utf8len_(value); + if(n == 0) + return false; + value += n; + } + } + else { + const FLAC__byte *end = value + length; + while(value < end) { + unsigned n = utf8len_(value); + if(n == 0) + return false; + value += n; + } + if(value != end) + return false; + } + return true; +} + +FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length) +{ + const FLAC__byte *s, *end; + + for(s = entry, end = s + length; s < end && *s != '='; s++) { + if(*s < 0x20 || *s > 0x7D) + return false; + } + if(s == end) + return false; + + s++; /* skip '=' */ + + while(s < end) { + unsigned n = utf8len_(s); + if(n == 0) + return false; + s += n; + } + if(s != end) + return false; + + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) +{ + unsigned i, j; + + if(check_cd_da_subset) { + if(cue_sheet->lead_in < 2 * 44100) { + if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; + return false; + } + if(cue_sheet->lead_in % 588 != 0) { + if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; + return false; + } + } + + if(cue_sheet->num_tracks == 0) { + if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; + return false; + } + + if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { + if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; + return false; + } + + for(i = 0; i < cue_sheet->num_tracks; i++) { + if(cue_sheet->tracks[i].number == 0) { + if(violation) *violation = "cue sheet may not have a track number 0"; + return false; + } + + if(check_cd_da_subset) { + if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { + if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; + return false; + } + } + + if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { + if(violation) { + if(i == cue_sheet->num_tracks-1) /* the lead-out track... */ + *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; + else + *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; + } + return false; + } + + if(i < cue_sheet->num_tracks - 1) { + if(cue_sheet->tracks[i].num_indices == 0) { + if(violation) *violation = "cue sheet track must have at least one index point"; + return false; + } + + if(cue_sheet->tracks[i].indices[0].number > 1) { + if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; + return false; + } + } + + for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { + if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { + if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; + return false; + } + + if(j > 0) { + if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { + if(violation) *violation = "cue sheet track index numbers must increase by 1"; + return false; + } + } + } + } + + return true; +} + +/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ +FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) +{ + char *p; + FLAC__byte *b; + + for(p = picture->mime_type; *p; p++) { + if(*p < 0x20 || *p > 0x7e) { + if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; + return false; + } + } + + for(b = picture->description; *b; ) { + unsigned n = utf8len_(b); + if(n == 0) { + if(violation) *violation = "description string must be valid UTF-8"; + return false; + } + b += n; + } + + return true; +} + +/* + * These routines are private to libFLAC + */ +unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order) +{ + return + FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( + FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), + blocksize, + predictor_order + ); +} + +unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize) +{ + unsigned max_rice_partition_order = 0; + while(!(blocksize & 1)) { + max_rice_partition_order++; + blocksize >>= 1; + } + return min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); +} + +unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) +{ + unsigned max_rice_partition_order = limit; + + while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) + max_rice_partition_order--; + + FLAC__ASSERT( + (max_rice_partition_order == 0 && blocksize >= predictor_order) || + (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) + ); + + return max_rice_partition_order; +} + +void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) +{ + FLAC__ASSERT(0 != object); + + object->parameters = 0; + object->raw_bits = 0; + object->capacity_by_order = 0; +} + +void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) +{ + FLAC__ASSERT(0 != object); + + if(0 != object->parameters) + free(object->parameters); + if(0 != object->raw_bits) + free(object->raw_bits); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); +} + +FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order) +{ + FLAC__ASSERT(0 != object); + + FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); + + if(object->capacity_by_order < max_partition_order) { + if(0 == (object->parameters = (unsigned*)realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) + return false; + if(0 == (object->raw_bits = (unsigned*)realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order)))) + return false; + memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order)); + object->capacity_by_order = max_partition_order; + } + + return true; +} diff -Nru mame-0.144/src/lib/libflac/libflac/lpc.c mame-0.145/src/lib/libflac/libflac/lpc.c --- mame-0.144/src/lib/libflac/libflac/lpc.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/lpc.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1377 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include "flac/assert.h" +#include "flac/format.h" +#include "private/bitmath.h" +#include "private/lpc.h" +#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE +#include +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#ifndef M_LN2 +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_LN2 0.69314718055994530942 +#endif + +/* OPT: #undef'ing this may improve the speed on some architectures */ +#define FLAC__LPC_UNROLLED_FILTER_LOOPS + + +void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) +{ + unsigned i; + for(i = 0; i < data_len; i++) + out[i] = in[i] * window[i]; +} + +void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) +{ + /* a readable, but slower, version */ +#if 0 + FLAC__real d; + unsigned i; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + /* + * Technically we should subtract the mean first like so: + * for(i = 0; i < data_len; i++) + * data[i] -= mean; + * but it appears not to make enough of a difference to matter, and + * most signals are already closely centered around zero + */ + while(lag--) { + for(i = lag, d = 0.0; i < data_len; i++) + d += data[i] * data[i - lag]; + autoc[lag] = d; + } +#endif + + /* + * this version tends to run faster because of better data locality + * ('data_len' is usually much larger than 'lag') + */ + FLAC__real d; + unsigned sample, coeff; + const unsigned limit = data_len - lag; + + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); + + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] = 0.0; + for(sample = 0; sample <= limit; sample++) { + d = data[sample]; + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } + for(; sample < data_len; sample++) { + d = data[sample]; + for(coeff = 0; coeff < data_len - sample; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } +} + +void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) +{ + unsigned i, j; + FLAC__double r, err, ref[FLAC__MAX_LPC_ORDER], lpc[FLAC__MAX_LPC_ORDER]; + + FLAC__ASSERT(0 != max_order); + FLAC__ASSERT(0 < *max_order); + FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); + FLAC__ASSERT(autoc[0] != 0.0); + + err = autoc[0]; + + for(i = 0; i < *max_order; i++) { + /* Sum up this iteration's reflection coefficient. */ + r = -autoc[i+1]; + for(j = 0; j < i; j++) + r -= lpc[j] * autoc[i-j]; + ref[i] = (r/=err); + + /* Update LPC coefficients and total error. */ + lpc[i]=r; + for(j = 0; j < (i>>1); j++) { + FLAC__double tmp = lpc[j]; + lpc[j] += r * lpc[i-1-j]; + lpc[i-1-j] += r * tmp; + } + if(i & 1) + lpc[j] += lpc[j] * r; + + err *= (1.0 - r * r); + + /* save this order */ + for(j = 0; j <= i; j++) + lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ + error[i] = err; + + /* see SF bug #1601812 http://sourceforge.net/tracker/index.php?func=detail&aid=1601812&group_id=13478&atid=113478 */ + if(err == 0.0) { + *max_order = i+1; + return; + } + } +} + +int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) +{ + unsigned i; + FLAC__double cmax; + FLAC__int32 qmax, qmin; + + FLAC__ASSERT(precision > 0); + FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); + + /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ + precision--; + qmax = 1 << precision; + qmin = -qmax; + qmax--; + + /* calc cmax = max( |lp_coeff[i]| ) */ + cmax = 0.0; + for(i = 0; i < order; i++) { + const FLAC__double d = fabs(lp_coeff[i]); + if(d > cmax) + cmax = d; + } + + if(cmax <= 0.0) { + /* => coefficients are all 0, which means our constant-detect didn't work */ + return 2; + } + else { + const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; + const int min_shiftlimit = -max_shiftlimit - 1; + int log2cmax; + + (void)frexp(cmax, &log2cmax); + log2cmax--; + *shift = (int)precision - log2cmax - 1; + + if(*shift > max_shiftlimit) + *shift = max_shiftlimit; + else if(*shift < min_shiftlimit) + return 1; + } + + if(*shift >= 0) { + FLAC__double error = 0.0; + FLAC__int32 q; + for(i = 0; i < order; i++) { + error += lp_coeff[i] * (1 << *shift); +#if 1 /* unfortunately lround() is C99 */ + if(error >= 0.0) + q = (FLAC__int32)(error + 0.5); + else + q = (FLAC__int32)(error - 0.5); +#else + q = lround(error); +#endif +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + } + /* negative shift is very rare but due to design flaw, negative shift is + * a NOP in the decoder, so it must be handled specially by scaling down + * coeffs + */ + else { + const int nshift = -(*shift); + FLAC__double error = 0.0; + FLAC__int32 q; +#ifdef DEBUG + fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); +#endif + for(i = 0; i < order; i++) { + error += lp_coeff[i] / (1 << nshift); +#if 1 /* unfortunately lround() is C99 */ + if(error >= 0.0) + q = (FLAC__int32)(error + 0.5); + else + q = (FLAC__int32)(error - 0.5); +#else + q = lround(error); +#endif +#ifdef FLAC__OVERFLOW_DETECT + if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); + else if(q < qmin) + fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) + q = qmax; + else if(q < qmin) + q = qmin; + error -= q; + qlp_coeff[i] = q; + } + *shift = 0; + } + + return 0; +} + +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); +#if defined _MSC_VER + if(sumo > 2147483647I64 || sumo < -2147483648I64) + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); +#else + if(sumo > 2147483647ll || sumo < -2147483648ll) + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); +#endif + } + *(residual++) = *(data++) - (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + residual[i] = data[i] - (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + residual[i] = data[i] - (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { +#if defined _MSC_VER + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); +#else + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); +#endif + break; + } + if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { +#if defined _MSC_VER + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%I64d, residual=%I64d\n", i, *data, sum >> lp_quantization, (FLAC__int64)(*data) - (sum >> lp_quantization)); +#else + fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%lld, residual=%lld\n", i, *data, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*data) - (sum >> lp_quantization))); +#endif + break; + } + *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + +void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + FLAC__int64 sumo; + unsigned i, j; + FLAC__int32 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sumo = 0; + sum = 0; + history = data; + for(j = 0; j < order; j++) { + sum += qlp_coeff[j] * (*(--history)); + sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); +#if defined _MSC_VER + if(sumo > 2147483647I64 || sumo < -2147483648I64) + fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); +#else + if(sumo > 2147483647ll || sumo < -2147483648ll) + fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); +#endif + } + *(data++) = *(r++) + (sum >> lp_quantization); + } + + /* Here's a slower but clearer version: + for(i = 0; i < data_len; i++) { + sum = 0; + for(j = 0; j < order; j++) + sum += qlp_coeff[j] * data[i-j-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + */ +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int32 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * data[i-10]; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * data[i-9]; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * data[i-8]; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * data[i-7]; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * data[i-6]; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * data[i-5]; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * data[i-4]; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * data[i-3]; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * data[i-2]; + sum += qlp_coeff[0] * data[i-1]; + data[i] = residual[i] + (sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * data[i-32]; + case 31: sum += qlp_coeff[30] * data[i-31]; + case 30: sum += qlp_coeff[29] * data[i-30]; + case 29: sum += qlp_coeff[28] * data[i-29]; + case 28: sum += qlp_coeff[27] * data[i-28]; + case 27: sum += qlp_coeff[26] * data[i-27]; + case 26: sum += qlp_coeff[25] * data[i-26]; + case 25: sum += qlp_coeff[24] * data[i-25]; + case 24: sum += qlp_coeff[23] * data[i-24]; + case 23: sum += qlp_coeff[22] * data[i-23]; + case 22: sum += qlp_coeff[21] * data[i-22]; + case 21: sum += qlp_coeff[20] * data[i-21]; + case 20: sum += qlp_coeff[19] * data[i-20]; + case 19: sum += qlp_coeff[18] * data[i-19]; + case 18: sum += qlp_coeff[17] * data[i-18]; + case 17: sum += qlp_coeff[16] * data[i-17]; + case 16: sum += qlp_coeff[15] * data[i-16]; + case 15: sum += qlp_coeff[14] * data[i-15]; + case 14: sum += qlp_coeff[13] * data[i-14]; + case 13: sum += qlp_coeff[12] * data[i-13]; + sum += qlp_coeff[11] * data[i-12]; + sum += qlp_coeff[10] * data[i-11]; + sum += qlp_coeff[ 9] * data[i-10]; + sum += qlp_coeff[ 8] * data[i- 9]; + sum += qlp_coeff[ 7] * data[i- 8]; + sum += qlp_coeff[ 6] * data[i- 7]; + sum += qlp_coeff[ 5] * data[i- 6]; + sum += qlp_coeff[ 4] * data[i- 5]; + sum += qlp_coeff[ 3] * data[i- 4]; + sum += qlp_coeff[ 2] * data[i- 3]; + sum += qlp_coeff[ 1] * data[i- 2]; + sum += qlp_coeff[ 0] * data[i- 1]; + } + data[i] = residual[i] + (sum >> lp_quantization); + } + } +} +#endif + +void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) +#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) +{ + unsigned i, j; + FLAC__int64 sum; + const FLAC__int32 *r = residual, *history; + +#ifdef FLAC__OVERFLOW_DETECT_VERBOSE + fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); + for(i=0;i 0); + + for(i = 0; i < data_len; i++) { + sum = 0; + history = data; + for(j = 0; j < order; j++) + sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); + if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { +#ifdef _MSC_VER + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); +#else + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); +#endif + break; + } + if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { +#ifdef _MSC_VER + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%I64d, data=%I64d\n", i, *r, sum >> lp_quantization, (FLAC__int64)(*r) + (sum >> lp_quantization)); +#else + fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%lld, data=%lld\n", i, *r, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*r) + (sum >> lp_quantization))); +#endif + break; + } + *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); + } +} +#else /* fully unrolled version for normal use */ +{ + int i; + FLAC__int64 sum; + + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= 32); + + /* + * We do unique versions up to 12th order since that's the subset limit. + * Also they are roughly ordered to match frequency of occurrence to + * minimize branching. + */ + if(order <= 12) { + if(order > 8) { + if(order > 10) { + if(order == 12) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 11 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 10) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 9 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else if(order > 4) { + if(order > 6) { + if(order == 8) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 7 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 6) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 5 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + } + else { + if(order > 2) { + if(order == 4) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 3 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + } + else { + if(order == 2) { + for(i = 0; i < (int)data_len; i++) { + sum = 0; + sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; + sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } + else { /* order == 1 */ + for(i = 0; i < (int)data_len; i++) + data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); + } + } + } + } + else { /* order > 12 */ + for(i = 0; i < (int)data_len; i++) { + sum = 0; + switch(order) { + case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; + case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; + case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; + case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; + case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; + case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; + case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; + case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; + case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; + case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; + case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; + case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; + case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; + case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; + case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; + case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; + case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; + case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; + case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; + case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; + sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; + sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; + sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; + sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; + sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; + sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; + sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; + sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; + sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; + sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; + sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; + sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; + } + data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); + } + } +} +#endif + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) +{ + FLAC__double error_scale; + + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; + + return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); +} + +FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale) +{ + if(lpc_error > 0.0) { + FLAC__double bps = (FLAC__double)0.5 * log(error_scale * lpc_error) / M_LN2; + if(bps >= 0.0) + return bps; + else + return 0.0; + } + else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ + return 1e32; + } + else { + return 0.0; + } +} + +unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) +{ + unsigned order, index, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ + FLAC__double bits, best_bits, error_scale; + + FLAC__ASSERT(max_order > 0); + FLAC__ASSERT(total_samples > 0); + + error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; + + best_index = 0; + best_bits = (unsigned)(-1); + + for(index = 0, order = 1; index < max_order; index++, order++) { + bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[index], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); + if(bits < best_bits) { + best_index = index; + best_bits = bits; + } + } + + return best_index+1; /* +1 since index of lpc_error[] is order-1 */ +} + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff -Nru mame-0.144/src/lib/libflac/libflac/md5.c mame-0.145/src/lib/libflac/libflac/md5.c --- mame-0.144/src/lib/libflac/libflac/md5.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/md5.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,424 @@ +#if HAVE_CONFIG_H +# include +#endif + +#include /* for malloc() */ +#include /* for memcpy() */ + +#include "private/md5.h" +#include "share/alloc.h" + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + * + * Changed so as no longer to depend on Colin Plumb's `usual.h' header + * definitions; now uses stuff from dpkg's config.h. + * - Ian Jackson . + * Still in the public domain. + * + * Josh Coalson: made some changes to integrate with libFLAC. + * Still in the public domain. + */ + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f,w,x,y,z,in,s) \ + (w += f(x,y,z) + in, w = (w<>(32-s)) + x) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) +{ + register FLAC__uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +#if WORDS_BIGENDIAN +//@@@@@@ OPT: use bswap/intrinsics +static void byteSwap(FLAC__uint32 *buf, unsigned words) +{ + register FLAC__uint32 x; + do { + x = *buf; + x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); + *buf++ = (x >> 16) | (x << 16); + } while (--words); +} +static void byteSwapX16(FLAC__uint32 *buf) +{ + register FLAC__uint32 x; + + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); + x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); +} +#else +#define byteSwap(buf, words) +#define byteSwapX16(buf) +#endif + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) +{ + FLAC__uint32 t; + + /* Update byte count */ + + t = ctx->bytes[0]; + if ((ctx->bytes[0] = t + len) < t) + ctx->bytes[1]++; /* Carry from low to high */ + + t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ + if (t > len) { + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); + return; + } + /* First chunk is an odd size */ + memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += t; + len -= t; + + /* Process data in 64-byte chunks */ + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + memcpy(ctx->in, buf, len); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void FLAC__MD5Init(FLAC__MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bytes[0] = 0; + ctx->bytes[1] = 0; + + ctx->internal_buf = 0; + ctx->capacity = 0; +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) +{ + int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ + FLAC__byte *p = (FLAC__byte *)ctx->in + count; + + /* Set the first char of padding to 0x80. There is always room. */ + *p++ = 0x80; + + /* Bytes of padding needed to make 56 bytes (-8..55) */ + count = 56 - 1 - count; + + if (count < 0) { /* Padding forces an extra block */ + memset(p, 0, count + 8); + byteSwapX16(ctx->in); + FLAC__MD5Transform(ctx->buf, ctx->in); + p = (FLAC__byte *)ctx->in; + count = 56; + } + memset(p, 0, count); + byteSwap(ctx->in, 14); + + /* Append length in bits and transform */ + ctx->in[14] = ctx->bytes[0] << 3; + ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; + FLAC__MD5Transform(ctx->buf, ctx->in); + + byteSwap(ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ + if(0 != ctx->internal_buf) { + free(ctx->internal_buf); + ctx->internal_buf = 0; + ctx->capacity = 0; + } +} + +/* + * Convert the incoming audio signal to a byte stream + */ +static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) +{ + unsigned channel, sample; + register FLAC__int32 a_word; + register FLAC__byte *buf_ = buf; + +#if WORDS_BIGENDIAN +#else + if(channels == 2 && bytes_per_sample == 2) { + FLAC__int16 *buf1_ = ((FLAC__int16*)buf_) + 1; + memcpy(buf_, signal[0], sizeof(FLAC__int32) * samples); + for(sample = 0; sample < samples; sample++, buf1_+=2) + *buf1_ = (FLAC__int16)signal[1][sample]; + } + else if(channels == 1 && bytes_per_sample == 2) { + FLAC__int16 *buf1_ = (FLAC__int16*)buf_; + for(sample = 0; sample < samples; sample++) + *buf1_++ = (FLAC__int16)signal[0][sample]; + } + else +#endif + if(bytes_per_sample == 2) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else if(bytes_per_sample == 3) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else if(bytes_per_sample == 1) { + if(channels == 2) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; + a_word = signal[1][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + else if(channels == 1) { + for(sample = 0; sample < samples; sample++) { + a_word = signal[0][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + else { + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; + } + } + } + } + else { /* bytes_per_sample == 4, maybe optimize more later */ + for(sample = 0; sample < samples; sample++) { + for(channel = 0; channel < channels; channel++) { + a_word = signal[channel][sample]; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; a_word >>= 8; + *buf_++ = (FLAC__byte)a_word; + } + } + } +} + +/* + * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. + */ +FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) +{ + const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; + + /* overflow check */ + if((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) + return false; + if((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) + return false; + + if(ctx->capacity < bytes_needed) { + FLAC__byte *tmp = (FLAC__byte*)realloc(ctx->internal_buf, bytes_needed); + if(0 == tmp) { + free(ctx->internal_buf); + if(0 == (ctx->internal_buf = (FLAC__byte*)safe_malloc_(bytes_needed))) + return false; + } + ctx->internal_buf = tmp; + ctx->capacity = bytes_needed; + } + + format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); + + FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); + + return true; +} diff -Nru mame-0.144/src/lib/libflac/libflac/memory.c mame-0.145/src/lib/libflac/libflac/memory.c --- mame-0.144/src/lib/libflac/libflac/memory.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/memory.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,221 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "private/memory.h" +#include "flac/assert.h" +#include "share/alloc.h" + +void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) +{ + void *x; + + FLAC__ASSERT(0 != aligned_address); + +#ifdef FLAC__ALIGN_MALLOC_DATA + /* align on 32-byte (256-bit) boundary */ + x = safe_malloc_add_2op_(bytes, /*+*/31); +#ifdef SIZEOF_VOIDP +#if SIZEOF_VOIDP == 4 + /* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */ + *aligned_address = (void*)(((unsigned)x + 31) & -32); +#elif SIZEOF_VOIDP == 8 + *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); +#else +# error Unsupported sizeof(void*) +#endif +#else + /* there's got to be a better way to do this right for all archs */ + if(sizeof(void*) == sizeof(unsigned)) + *aligned_address = (void*)(((unsigned)x + 31) & -32); + else if(sizeof(void*) == sizeof(FLAC__uint64)) + *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); + else + return 0; +#endif +#else + x = safe_malloc_(bytes); + *aligned_address = x; +#endif + return x; +} + +FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) +{ + FLAC__int32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__int32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(*pu) * (size_t)elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) +{ + FLAC__uint32 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint32 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) +{ + FLAC__uint64 *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__uint64 *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) +{ + unsigned *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + unsigned *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) +{ + FLAC__real *pu; /* unaligned pointer */ + union { /* union needed to comply with C99 pointer aliasing rules */ + FLAC__real *pa; /* aligned pointer */ + void *pv; /* aligned pointer alias */ + } u; + + FLAC__ASSERT(elements > 0); + FLAC__ASSERT(0 != unaligned_pointer); + FLAC__ASSERT(0 != aligned_pointer); + FLAC__ASSERT(unaligned_pointer != aligned_pointer); + + if((size_t)elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ + return false; + + pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); + if(0 == pu) { + return false; + } + else { + if(*unaligned_pointer != 0) + free(*unaligned_pointer); + *unaligned_pointer = pu; + *aligned_pointer = u.pa; + return true; + } +} + +#endif diff -Nru mame-0.144/src/lib/libflac/libflac/metadata_iterators.c mame-0.145/src/lib/libflac/libflac/metadata_iterators.c --- mame-0.144/src/lib/libflac/libflac/metadata_iterators.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/metadata_iterators.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,3363 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#if defined __BORLANDC__ +#include /* for utime() */ +#else +#include /* for utime() */ +#endif +#include /* for chmod() */ +#include /* for off_t */ +#if _MSC_VER <= 1600 || defined __BORLANDC__ /* @@@ [2G limit] */ +#define fseeko fseek +#define ftello ftell +#endif +#else +#include /* some flavors of BSD (like OS X) require this to get time_t */ +#include /* for utime() */ +#include /* for chown(), unlink() */ +#endif +#include /* for stat(), maybe chmod() */ + +#include "private/metadata.h" + +#include "flac/assert.h" +#include "flac/stream_decoder.h" +#include "share/alloc.h" + +#ifdef max +#undef max +#endif +#define max(a,b) ((a)>(b)?(a):(b)) +#ifdef min +#undef min +#endif +#define min(a,b) ((a)<(b)?(a):(b)) + + +/**************************************************************************** + * + * Local function declarations + * + ***************************************************************************/ + +static void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); +static void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); +static void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes); +static FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes); +static FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes); +static FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes); + +static FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator); +static FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block); +static FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block); +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length); + +static FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); +static FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); +static FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); +static FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); +static FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block); +static FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length); +static FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length); +static FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block); +static FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block); +static FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block); +static FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block); +static FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length); + +static FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block); +static FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last); +static FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append); + +static void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator); +static FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator); + +static unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb); +static unsigned seek_to_first_metadata_block_(FILE *f); + +static FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append); +static FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, off_t fixup_is_last_flag_offset, FLAC__bool backup); + +static FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); +static FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); +static FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status); +static FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status); + +static FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); +static FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); +static void cleanup_tempfile_(FILE **tempfile, char **tempfilename); + +static FLAC__bool get_file_stats_(const char *filename, struct stat *stats); +static void set_file_stats_(const char *filename, struct stat *stats); + +static int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence); +static FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle); + +static FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status); + + +#ifdef FLAC__VALGRIND_TESTING +static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t ret = fwrite(ptr, size, nmemb, stream); + if(!ferror(stream)) + fflush(stream); + return ret; +} +#else +#define local__fwrite fwrite +#endif + +/**************************************************************************** + * + * Level 0 implementation + * + ***************************************************************************/ + +static FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); +static void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +static void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +typedef struct { + FLAC__bool got_error; + FLAC__StreamMetadata *object; +} level0_client_data; + +static FLAC__StreamMetadata *get_one_metadata_block_(const char *filename, FLAC__MetadataType type) +{ + level0_client_data cd; + FLAC__StreamDecoder *decoder; + + FLAC__ASSERT(0 != filename); + + cd.got_error = false; + cd.object = 0; + + decoder = FLAC__stream_decoder_new(); + + if(0 == decoder) + return 0; + + FLAC__stream_decoder_set_md5_checking(decoder, false); + FLAC__stream_decoder_set_metadata_ignore_all(decoder); + FLAC__stream_decoder_set_metadata_respond(decoder, type); + + if(FLAC__stream_decoder_init_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &cd) != FLAC__STREAM_DECODER_INIT_STATUS_OK || cd.got_error) { + (void)FLAC__stream_decoder_finish(decoder); + FLAC__stream_decoder_delete(decoder); + return 0; + } + + if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder) || cd.got_error) { + (void)FLAC__stream_decoder_finish(decoder); + FLAC__stream_decoder_delete(decoder); + if(0 != cd.object) + FLAC__metadata_object_delete(cd.object); + return 0; + } + + (void)FLAC__stream_decoder_finish(decoder); + FLAC__stream_decoder_delete(decoder); + + return cd.object; +} + +FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo) +{ + FLAC__StreamMetadata *object; + + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != streaminfo); + + object = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_STREAMINFO); + + if (object) { + /* can just copy the contents since STREAMINFO has no internal structure */ + *streaminfo = *object; + FLAC__metadata_object_delete(object); + return true; + } + else { + return false; + } +} + +FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags) +{ + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != tags); + + *tags = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_VORBIS_COMMENT); + + return 0 != *tags; +} + +FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet) +{ + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != cuesheet); + + *cuesheet = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_CUESHEET); + + return 0 != *cuesheet; +} + +FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + (void)decoder, (void)frame, (void)buffer, (void)client_data; + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + level0_client_data *cd = (level0_client_data *)client_data; + (void)decoder; + + /* + * we assume we only get here when the one metadata block we were + * looking for was passed to us + */ + if(!cd->got_error && 0 == cd->object) { + if(0 == (cd->object = FLAC__metadata_object_clone(metadata))) + cd->got_error = true; + } +} + +void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + level0_client_data *cd = (level0_client_data *)client_data; + (void)decoder; + + if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC) + cd->got_error = true; +} + +FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors) +{ + FLAC__Metadata_SimpleIterator *it; + FLAC__uint64 max_area_seen = 0; + FLAC__uint64 max_depth_seen = 0; + + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != picture); + + *picture = 0; + + it = FLAC__metadata_simple_iterator_new(); + if(0 == it) + return false; + if(!FLAC__metadata_simple_iterator_init(it, filename, /*read_only=*/true, /*preserve_file_stats=*/true)) { + FLAC__metadata_simple_iterator_delete(it); + return false; + } + do { + if(FLAC__metadata_simple_iterator_get_block_type(it) == FLAC__METADATA_TYPE_PICTURE) { + FLAC__StreamMetadata *obj = FLAC__metadata_simple_iterator_get_block(it); + FLAC__uint64 area = (FLAC__uint64)obj->data.picture.width * (FLAC__uint64)obj->data.picture.height; + /* check constraints */ + if( + (type == (FLAC__StreamMetadata_Picture_Type)(-1) || type == obj->data.picture.type) && + (mime_type == 0 || !strcmp(mime_type, obj->data.picture.mime_type)) && + (description == 0 || !strcmp((const char *)description, (const char *)obj->data.picture.description)) && + obj->data.picture.width <= max_width && + obj->data.picture.height <= max_height && + obj->data.picture.depth <= max_depth && + obj->data.picture.colors <= max_colors && + (area > max_area_seen || (area == max_area_seen && obj->data.picture.depth > max_depth_seen)) + ) { + if(*picture) + FLAC__metadata_object_delete(*picture); + *picture = obj; + max_area_seen = area; + max_depth_seen = obj->data.picture.depth; + } + else { + FLAC__metadata_object_delete(obj); + } + } + } while(FLAC__metadata_simple_iterator_next(it)); + + FLAC__metadata_simple_iterator_delete(it); + + return (0 != *picture); +} + + +/**************************************************************************** + * + * Level 1 implementation + * + ***************************************************************************/ + +#define SIMPLE_ITERATOR_MAX_PUSH_DEPTH (1+4) +/* 1 for initial offset, +4 for our own personal use */ + +struct FLAC__Metadata_SimpleIterator { + FILE *file; + char *filename, *tempfile_path_prefix; + struct stat stats; + FLAC__bool has_stats; + FLAC__bool is_writable; + FLAC__Metadata_SimpleIteratorStatus status; + off_t offset[SIMPLE_ITERATOR_MAX_PUSH_DEPTH]; + off_t first_offset; /* this is the offset to the STREAMINFO block */ + unsigned depth; + /* this is the metadata block header of the current block we are pointing to: */ + FLAC__bool is_last; + FLAC__MetadataType type; + unsigned length; +}; + +FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[] = { + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR", + "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR" +}; + + +FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void) +{ + FLAC__Metadata_SimpleIterator *iterator = (FLAC__Metadata_SimpleIterator*)calloc(1, sizeof(FLAC__Metadata_SimpleIterator)); + + if(0 != iterator) { + iterator->file = 0; + iterator->filename = 0; + iterator->tempfile_path_prefix = 0; + iterator->has_stats = false; + iterator->is_writable = false; + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; + iterator->first_offset = iterator->offset[0] = -1; + iterator->depth = 0; + } + + return iterator; +} + +static void simple_iterator_free_guts_(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + + if(0 != iterator->file) { + fclose(iterator->file); + iterator->file = 0; + if(iterator->has_stats) + set_file_stats_(iterator->filename, &iterator->stats); + } + if(0 != iterator->filename) { + free(iterator->filename); + iterator->filename = 0; + } + if(0 != iterator->tempfile_path_prefix) { + free(iterator->tempfile_path_prefix); + iterator->tempfile_path_prefix = 0; + } +} + +FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + + simple_iterator_free_guts_(iterator); + free(iterator); +} + +FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__Metadata_SimpleIteratorStatus status; + + FLAC__ASSERT(0 != iterator); + + status = iterator->status; + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; + return status; +} + +static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only) +{ + unsigned ret; + + FLAC__ASSERT(0 != iterator); + + if(read_only || 0 == (iterator->file = fopen(iterator->filename, "r+b"))) { + iterator->is_writable = false; + if(read_only || errno == EACCES) { + if(0 == (iterator->file = fopen(iterator->filename, "rb"))) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + } + else { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + } + else { + iterator->is_writable = true; + } + + ret = seek_to_first_metadata_block_(iterator->file); + switch(ret) { + case 0: + iterator->depth = 0; + iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file); + return read_metadata_block_header_(iterator); + case 1: + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + case 2: + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + case 3: + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE; + return false; + default: + FLAC__ASSERT(0); + return false; + } +} + +#if 0 +@@@ If we decide to finish implementing this, put this comment back in metadata.h +/* + * The 'tempfile_path_prefix' allows you to specify a directory where + * tempfiles should go. Remember that if your metadata edits cause the + * FLAC file to grow, the entire file will have to be rewritten. If + * 'tempfile_path_prefix' is NULL, the temp file will be written in the + * same directory as the original FLAC file. This makes replacing the + * original with the tempfile fast but requires extra space in the same + * partition for the tempfile. If space is a problem, you can pass a + * directory name belonging to a different partition in + * 'tempfile_path_prefix'. Note that you should use the forward slash + * '/' as the directory separator. A trailing slash is not needed; it + * will be added automatically. + */ +FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool preserve_file_stats, const char *tempfile_path_prefix); +#endif + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats) +{ + const char *tempfile_path_prefix = 0; /*@@@ search for comments near 'rename(...)' for what it will take to finish implementing this */ + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != filename); + + simple_iterator_free_guts_(iterator); + + if(!read_only && preserve_file_stats) + iterator->has_stats = get_file_stats_(filename, &iterator->stats); + + if(0 == (iterator->filename = strdup(filename))) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + if(0 != tempfile_path_prefix && 0 == (iterator->tempfile_path_prefix = strdup(tempfile_path_prefix))) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + + return simple_iterator_prime_input_(iterator, read_only); +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + return iterator->is_writable; +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + if(iterator->is_last) + return false; + + if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + iterator->offset[iterator->depth] = ftello(iterator->file); + + return read_metadata_block_header_(iterator); +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator) +{ + off_t this_offset; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + if(iterator->offset[iterator->depth] == iterator->first_offset) + return false; + + if(0 != fseeko(iterator->file, iterator->first_offset, SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + this_offset = iterator->first_offset; + if(!read_metadata_block_header_(iterator)) + return false; + + /* we ignore any error from ftello() and catch it in fseeko() */ + while(ftello(iterator->file) + (off_t)iterator->length < iterator->offset[iterator->depth]) { + if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + this_offset = ftello(iterator->file); + if(!read_metadata_block_header_(iterator)) + return false; + } + + iterator->offset[iterator->depth] = this_offset; + + return true; +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + return iterator->is_last; +} + +/*@@@@add to tests*/ +FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + return iterator->offset[iterator->depth]; +} + +FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + return iterator->type; +} + +/*@@@@add to tests*/ +FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + return iterator->length; +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id) +{ + const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + FLAC__ASSERT(0 != id); + + if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; + return false; + } + + if(fread(id, 1, id_bytes, iterator->file) != id_bytes) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + + /* back up */ + if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + return true; +} + +FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type); + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + if(0 != block) { + block->is_last = iterator->is_last; + block->length = iterator->length; + + if(!read_metadata_block_data_(iterator, block)) { + FLAC__metadata_object_delete(block); + return 0; + } + + /* back up to the beginning of the block data to stay consistent */ + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH, SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + FLAC__metadata_object_delete(block); + return 0; + } + } + else + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + return block; +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) +{ + FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth];) + FLAC__bool ret; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + FLAC__ASSERT(0 != block); + + if(!iterator->is_writable) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE; + return false; + } + + if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO || block->type == FLAC__METADATA_TYPE_STREAMINFO) { + if(iterator->type != block->type) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; + return false; + } + } + + block->is_last = iterator->is_last; + + if(iterator->length == block->length) + return write_metadata_block_stationary_(iterator, block); + else if(iterator->length > block->length) { + if(use_padding && iterator->length >= FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) { + ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - FLAC__STREAM_METADATA_HEADER_LENGTH - block->length, block->is_last); + FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + else { + ret = rewrite_whole_file_(iterator, block, /*append=*/false); + FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + } + else /* iterator->length < block->length */ { + unsigned padding_leftover = 0; + FLAC__bool padding_is_last = false; + if(use_padding) { + /* first see if we can even use padding */ + if(iterator->is_last) { + use_padding = false; + } + else { + const unsigned extra_padding_bytes_required = block->length - iterator->length; + simple_iterator_push_(iterator); + if(!FLAC__metadata_simple_iterator_next(iterator)) { + (void)simple_iterator_pop_(iterator); + return false; + } + if(iterator->type != FLAC__METADATA_TYPE_PADDING) { + use_padding = false; + } + else { + if(FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length == extra_padding_bytes_required) { + padding_leftover = 0; + block->is_last = iterator->is_last; + } + else if(iterator->length < extra_padding_bytes_required) + use_padding = false; + else { + padding_leftover = FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length - extra_padding_bytes_required; + padding_is_last = iterator->is_last; + block->is_last = false; + } + } + if(!simple_iterator_pop_(iterator)) + return false; + } + } + if(use_padding) { + if(padding_leftover == 0) { + ret = write_metadata_block_stationary_(iterator, block); + FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + else { + FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); + ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); + FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + } + else { + ret = rewrite_whole_file_(iterator, block, /*append=*/false); + FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + } +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) +{ + unsigned padding_leftover = 0; + FLAC__bool padding_is_last = false; + + FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length;) + FLAC__bool ret; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + FLAC__ASSERT(0 != block); + + if(!iterator->is_writable) + return false; + + if(block->type == FLAC__METADATA_TYPE_STREAMINFO) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; + return false; + } + + block->is_last = iterator->is_last; + + if(use_padding) { + /* first see if we can even use padding */ + if(iterator->is_last) { + use_padding = false; + } + else { + simple_iterator_push_(iterator); + if(!FLAC__metadata_simple_iterator_next(iterator)) { + (void)simple_iterator_pop_(iterator); + return false; + } + if(iterator->type != FLAC__METADATA_TYPE_PADDING) { + use_padding = false; + } + else { + if(iterator->length == block->length) { + padding_leftover = 0; + block->is_last = iterator->is_last; + } + else if(iterator->length < FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) + use_padding = false; + else { + padding_leftover = iterator->length - block->length; + padding_is_last = iterator->is_last; + block->is_last = false; + } + } + if(!simple_iterator_pop_(iterator)) + return false; + } + } + if(use_padding) { + /* move to the next block, which is suitable padding */ + if(!FLAC__metadata_simple_iterator_next(iterator)) + return false; + if(padding_leftover == 0) { + ret = write_metadata_block_stationary_(iterator, block); + FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + else { + FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); + ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); + FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } + } + else { + ret = rewrite_whole_file_(iterator, block, /*append=*/true); + FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); + FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); + return ret; + } +} + +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding) +{ + FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth];) + FLAC__bool ret; + + if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; + return false; + } + + if(use_padding) { + FLAC__StreamMetadata *padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING); + if(0 == padding) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + padding->length = iterator->length; + if(!FLAC__metadata_simple_iterator_set_block(iterator, padding, false)) { + FLAC__metadata_object_delete(padding); + return false; + } + FLAC__metadata_object_delete(padding); + if(!FLAC__metadata_simple_iterator_prev(iterator)) + return false; + FLAC__ASSERT(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length == debug_target_offset); + FLAC__ASSERT(ftello(iterator->file) + (off_t)iterator->length == debug_target_offset); + return true; + } + else { + ret = rewrite_whole_file_(iterator, 0, /*append=*/false); + FLAC__ASSERT(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length == debug_target_offset); + FLAC__ASSERT(ftello(iterator->file) + (off_t)iterator->length == debug_target_offset); + return ret; + } +} + + + +/**************************************************************************** + * + * Level 2 implementation + * + ***************************************************************************/ + + +typedef struct FLAC__Metadata_Node { + FLAC__StreamMetadata *data; + struct FLAC__Metadata_Node *prev, *next; +} FLAC__Metadata_Node; + +struct FLAC__Metadata_Chain { + char *filename; /* will be NULL if using callbacks */ + FLAC__bool is_ogg; + FLAC__Metadata_Node *head; + FLAC__Metadata_Node *tail; + unsigned nodes; + FLAC__Metadata_ChainStatus status; + off_t first_offset, last_offset; + /* + * This is the length of the chain initially read from the FLAC file. + * it is used to compare against the current length to decide whether + * or not the whole file has to be rewritten. + */ + off_t initial_length; + /* @@@ hacky, these are currently only needed by ogg reader */ + FLAC__IOHandle handle; + FLAC__IOCallback_Read read_cb; +}; + +struct FLAC__Metadata_Iterator { + FLAC__Metadata_Chain *chain; + FLAC__Metadata_Node *current; +}; + +FLAC_API const char * const FLAC__Metadata_ChainStatusString[] = { + "FLAC__METADATA_CHAIN_STATUS_OK", + "FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT", + "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE", + "FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE", + "FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE", + "FLAC__METADATA_CHAIN_STATUS_BAD_METADATA", + "FLAC__METADATA_CHAIN_STATUS_READ_ERROR", + "FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR", + "FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR", + "FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR", + "FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR", + "FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR", + "FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR", + "FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS", + "FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH", + "FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL" +}; + + +static FLAC__Metadata_Node *node_new_(void) +{ + return (FLAC__Metadata_Node*)calloc(1, sizeof(FLAC__Metadata_Node)); +} + +static void node_delete_(FLAC__Metadata_Node *node) +{ + FLAC__ASSERT(0 != node); + if(0 != node->data) + FLAC__metadata_object_delete(node->data); + free(node); +} + +static void chain_init_(FLAC__Metadata_Chain *chain) +{ + FLAC__ASSERT(0 != chain); + + chain->filename = 0; + chain->is_ogg = false; + chain->head = chain->tail = 0; + chain->nodes = 0; + chain->status = FLAC__METADATA_CHAIN_STATUS_OK; + chain->initial_length = 0; + chain->read_cb = 0; +} + +static void chain_clear_(FLAC__Metadata_Chain *chain) +{ + FLAC__Metadata_Node *node, *next; + + FLAC__ASSERT(0 != chain); + + for(node = chain->head; node; ) { + next = node->next; + node_delete_(node); + node = next; + } + + if(0 != chain->filename) + free(chain->filename); + + chain_init_(chain); +} + +static void chain_append_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) +{ + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != node); + FLAC__ASSERT(0 != node->data); + + node->next = node->prev = 0; + node->data->is_last = true; + if(0 != chain->tail) + chain->tail->data->is_last = false; + + if(0 == chain->head) + chain->head = node; + else { + FLAC__ASSERT(0 != chain->tail); + chain->tail->next = node; + node->prev = chain->tail; + } + chain->tail = node; + chain->nodes++; +} + +static void chain_remove_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) +{ + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != node); + + if(node == chain->head) + chain->head = node->next; + else + node->prev->next = node->next; + + if(node == chain->tail) + chain->tail = node->prev; + else + node->next->prev = node->prev; + + if(0 != chain->tail) + chain->tail->data->is_last = true; + + chain->nodes--; +} + +static void chain_delete_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) +{ + chain_remove_node_(chain, node); + node_delete_(node); +} + +static off_t chain_calculate_length_(FLAC__Metadata_Chain *chain) +{ + const FLAC__Metadata_Node *node; + off_t length = 0; + for(node = chain->head; node; node = node->next) + length += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); + return length; +} + +static void iterator_insert_node_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) +{ + FLAC__ASSERT(0 != node); + FLAC__ASSERT(0 != node->data); + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + FLAC__ASSERT(0 != iterator->chain); + FLAC__ASSERT(0 != iterator->chain->head); + FLAC__ASSERT(0 != iterator->chain->tail); + + node->data->is_last = false; + + node->prev = iterator->current->prev; + node->next = iterator->current; + + if(0 == node->prev) + iterator->chain->head = node; + else + node->prev->next = node; + + iterator->current->prev = node; + + iterator->chain->nodes++; +} + +static void iterator_insert_node_after_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) +{ + FLAC__ASSERT(0 != node); + FLAC__ASSERT(0 != node->data); + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + FLAC__ASSERT(0 != iterator->chain); + FLAC__ASSERT(0 != iterator->chain->head); + FLAC__ASSERT(0 != iterator->chain->tail); + + iterator->current->data->is_last = false; + + node->prev = iterator->current; + node->next = iterator->current->next; + + if(0 == node->next) + iterator->chain->tail = node; + else + node->next->prev = node; + + node->prev->next = node; + + iterator->chain->tail->data->is_last = true; + + iterator->chain->nodes++; +} + +/* return true iff node and node->next are both padding */ +static FLAC__bool chain_merge_adjacent_padding_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) +{ + if(node->data->type == FLAC__METADATA_TYPE_PADDING && 0 != node->next && node->next->data->type == FLAC__METADATA_TYPE_PADDING) { + const unsigned growth = FLAC__STREAM_METADATA_HEADER_LENGTH + node->next->data->length; + node->data->length += growth; + + chain_delete_node_(chain, node->next); + return true; + } + else + return false; +} + +/* Returns the new length of the chain, or 0 if there was an error. */ +/* WATCHOUT: This can get called multiple times before a write, so + * it should still work when this happens. + */ +/* WATCHOUT: Make sure to also update the logic in + * FLAC__metadata_chain_check_if_tempfile_needed() if the logic here changes. + */ +static off_t chain_prepare_for_write_(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) +{ + off_t current_length = chain_calculate_length_(chain); + + if(use_padding) { + /* if the metadata shrank and the last block is padding, we just extend the last padding block */ + if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { + const off_t delta = chain->initial_length - current_length; + chain->tail->data->length += delta; + current_length += delta; + FLAC__ASSERT(current_length == chain->initial_length); + } + /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ + else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) { + FLAC__StreamMetadata *padding; + FLAC__Metadata_Node *node; + if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) { + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return 0; + } + padding->length = chain->initial_length - (FLAC__STREAM_METADATA_HEADER_LENGTH + current_length); + if(0 == (node = node_new_())) { + FLAC__metadata_object_delete(padding); + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return 0; + } + node->data = padding; + chain_append_node_(chain, node); + current_length = chain_calculate_length_(chain); + FLAC__ASSERT(current_length == chain->initial_length); + } + /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ + else if(current_length > chain->initial_length) { + const off_t delta = current_length - chain->initial_length; + if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { + /* if the delta is exactly the size of the last padding block, remove the padding block */ + if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) { + chain_delete_node_(chain, chain->tail); + current_length = chain_calculate_length_(chain); + FLAC__ASSERT(current_length == chain->initial_length); + } + /* if there is at least 'delta' bytes of padding, trim the padding down */ + else if((off_t)chain->tail->data->length >= delta) { + chain->tail->data->length -= delta; + current_length -= delta; + FLAC__ASSERT(current_length == chain->initial_length); + } + } + } + } + + return current_length; +} + +static FLAC__bool chain_read_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Tell tell_cb) +{ + FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != chain); + + /* we assume we're already at the beginning of the file */ + + switch(seek_to_first_metadata_block_cb_(handle, read_cb, seek_cb)) { + case 0: + break; + case 1: + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; + return false; + case 2: + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + case 3: + chain->status = FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; + return false; + default: + FLAC__ASSERT(0); + return false; + } + + { + FLAC__int64 pos = tell_cb(handle); + if(pos < 0) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; + return false; + } + chain->first_offset = (off_t)pos; + } + + { + FLAC__bool is_last; + FLAC__MetadataType type; + unsigned length; + + do { + node = node_new_(); + if(0 == node) { + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + + if(!read_metadata_block_header_cb_(handle, read_cb, &is_last, &type, &length)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; + return false; + } + + node->data = FLAC__metadata_object_new(type); + if(0 == node->data) { + node_delete_(node); + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + + node->data->is_last = is_last; + node->data->length = length; + + chain->status = get_equivalent_status_(read_metadata_block_data_cb_(handle, read_cb, seek_cb, node->data)); + if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { + node_delete_(node); + return false; + } + chain_append_node_(chain, node); + } while(!is_last); + } + + { + FLAC__int64 pos = tell_cb(handle); + if(pos < 0) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; + return false; + } + chain->last_offset = (off_t)pos; + } + + chain->initial_length = chain_calculate_length_(chain); + + return true; +} + +static FLAC__StreamDecoderReadStatus chain_read_ogg_read_cb_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; + (void)decoder; + if(*bytes > 0 && chain->status == FLAC__METADATA_CHAIN_STATUS_OK) { + *bytes = chain->read_cb(buffer, sizeof(FLAC__byte), *bytes, chain->handle); + if(*bytes == 0) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; +} + +static FLAC__StreamDecoderWriteStatus chain_read_ogg_write_cb_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + (void)decoder, (void)frame, (void)buffer, (void)client_data; + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; +} + +static void chain_read_ogg_metadata_cb_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; + FLAC__Metadata_Node *node; + + (void)decoder; + + node = node_new_(); + if(0 == node) { + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return; + } + + node->data = FLAC__metadata_object_clone(metadata); + if(0 == node->data) { + node_delete_(node); + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return; + } + + chain_append_node_(chain, node); +} + +static void chain_read_ogg_error_cb_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; + (void)decoder, (void)status; + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ +} + +static FLAC__bool chain_read_ogg_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb) +{ + FLAC__StreamDecoder *decoder; + + FLAC__ASSERT(0 != chain); + + /* we assume we're already at the beginning of the file */ + + chain->handle = handle; + chain->read_cb = read_cb; + if(0 == (decoder = FLAC__stream_decoder_new())) { + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + FLAC__stream_decoder_set_metadata_respond_all(decoder); + if(FLAC__stream_decoder_init_ogg_stream(decoder, chain_read_ogg_read_cb_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, chain_read_ogg_write_cb_, chain_read_ogg_metadata_cb_, chain_read_ogg_error_cb_, chain) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + FLAC__stream_decoder_delete(decoder); + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ + return false; + } + + chain->first_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ + + if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ + if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { + FLAC__stream_decoder_delete(decoder); + return false; + } + + FLAC__stream_decoder_delete(decoder); + + chain->last_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ + + chain->initial_length = chain_calculate_length_(chain); + + return true; +} + +static FLAC__bool chain_rewrite_metadata_in_place_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, FLAC__IOCallback_Seek seek_cb) +{ + FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != chain->head); + + if(0 != seek_cb(handle, chain->first_offset, SEEK_SET)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + } + + for(node = chain->head; node; node = node->next) { + if(!write_metadata_block_header_cb_(handle, write_cb, node->data)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; + return false; + } + if(!write_metadata_block_data_cb_(handle, write_cb, node->data)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; + return false; + } + } + + /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ + + chain->status = FLAC__METADATA_CHAIN_STATUS_OK; + return true; +} + +static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain) +{ + FILE *file; + FLAC__bool ret; + + FLAC__ASSERT(0 != chain->filename); + + if(0 == (file = fopen(chain->filename, "r+b"))) { + chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; + return false; + } + + /* chain_rewrite_metadata_in_place_cb_() sets chain->status for us */ + ret = chain_rewrite_metadata_in_place_cb_(chain, (FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, fseek_wrapper_); + + fclose(file); + + return ret; +} + +static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *tempfile_path_prefix) +{ + FILE *f, *tempfile; + char *tempfilename; + FLAC__Metadata_SimpleIteratorStatus status; + const FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != chain->filename); + FLAC__ASSERT(0 != chain->head); + + /* copy the file prefix (data up to first metadata block */ + if(0 == (f = fopen(chain->filename, "rb"))) { + chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; + return false; + } + if(!open_tempfile_(chain->filename, tempfile_path_prefix, &tempfile, &tempfilename, &status)) { + chain->status = get_equivalent_status_(status); + cleanup_tempfile_(&tempfile, &tempfilename); + return false; + } + if(!copy_n_bytes_from_file_(f, tempfile, chain->first_offset, &status)) { + chain->status = get_equivalent_status_(status); + cleanup_tempfile_(&tempfile, &tempfilename); + return false; + } + + /* write the metadata */ + for(node = chain->head; node; node = node->next) { + if(!write_metadata_block_header_(tempfile, &status, node->data)) { + chain->status = get_equivalent_status_(status); + return false; + } + if(!write_metadata_block_data_(tempfile, &status, node->data)) { + chain->status = get_equivalent_status_(status); + return false; + } + } + /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ + + /* copy the file postfix (everything after the metadata) */ + if(0 != fseeko(f, chain->last_offset, SEEK_SET)) { + cleanup_tempfile_(&tempfile, &tempfilename); + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + } + if(!copy_remaining_bytes_from_file_(f, tempfile, &status)) { + cleanup_tempfile_(&tempfile, &tempfilename); + chain->status = get_equivalent_status_(status); + return false; + } + + /* move the tempfile on top of the original */ + (void)fclose(f); + if(!transport_tempfile_(chain->filename, &tempfile, &tempfilename, &status)) + return false; + + return true; +} + +/* assumes 'handle' is already at beginning of file */ +static FLAC__bool chain_rewrite_file_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb) +{ + FLAC__Metadata_SimpleIteratorStatus status; + const FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 == chain->filename); + FLAC__ASSERT(0 != chain->head); + + /* copy the file prefix (data up to first metadata block */ + if(!copy_n_bytes_from_file_cb_(handle, read_cb, temp_handle, temp_write_cb, chain->first_offset, &status)) { + chain->status = get_equivalent_status_(status); + return false; + } + + /* write the metadata */ + for(node = chain->head; node; node = node->next) { + if(!write_metadata_block_header_cb_(temp_handle, temp_write_cb, node->data)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; + return false; + } + if(!write_metadata_block_data_cb_(temp_handle, temp_write_cb, node->data)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; + return false; + } + } + /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ + + /* copy the file postfix (everything after the metadata) */ + if(0 != seek_cb(handle, chain->last_offset, SEEK_SET)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + } + if(!copy_remaining_bytes_from_file_cb_(handle, read_cb, eof_cb, temp_handle, temp_write_cb, &status)) { + chain->status = get_equivalent_status_(status); + return false; + } + + return true; +} + +FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void) +{ + FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)calloc(1, sizeof(FLAC__Metadata_Chain)); + + if(0 != chain) + chain_init_(chain); + + return chain; +} + +FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain) +{ + FLAC__ASSERT(0 != chain); + + chain_clear_(chain); + + free(chain); +} + +FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain) +{ + FLAC__Metadata_ChainStatus status; + + FLAC__ASSERT(0 != chain); + + status = chain->status; + chain->status = FLAC__METADATA_CHAIN_STATUS_OK; + return status; +} + +static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename, FLAC__bool is_ogg) +{ + FILE *file; + FLAC__bool ret; + + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != filename); + + chain_clear_(chain); + + if(0 == (chain->filename = strdup(filename))) { + chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + + chain->is_ogg = is_ogg; + + if(0 == (file = fopen(filename, "rb"))) { + chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; + return false; + } + + /* the function also sets chain->status for us */ + ret = is_ogg? + chain_read_ogg_cb_(chain, file, (FLAC__IOCallback_Read)fread) : + chain_read_cb_(chain, file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, ftell_wrapper_) + ; + + fclose(file); + + return ret; +} + +FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename) +{ + return chain_read_(chain, filename, /*is_ogg=*/false); +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename) +{ + return chain_read_(chain, filename, /*is_ogg=*/true); +} + +static FLAC__bool chain_read_with_callbacks_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__bool is_ogg) +{ + FLAC__bool ret; + + FLAC__ASSERT(0 != chain); + + chain_clear_(chain); + + if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.tell) { + chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; + return false; + } + + chain->is_ogg = is_ogg; + + /* rewind */ + if(0 != callbacks.seek(handle, 0, SEEK_SET)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + } + + /* the function also sets chain->status for us */ + ret = is_ogg? + chain_read_ogg_cb_(chain, handle, callbacks.read) : + chain_read_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.tell) + ; + + return ret; +} + +FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) +{ + return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/false); +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) +{ + return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/true); +} + +FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) +{ + /* This does all the same checks that are in chain_prepare_for_write_() + * but doesn't actually alter the chain. Make sure to update the logic + * here if chain_prepare_for_write_() changes. + */ + const off_t current_length = chain_calculate_length_(chain); + + FLAC__ASSERT(0 != chain); + + if(use_padding) { + /* if the metadata shrank and the last block is padding, we just extend the last padding block */ + if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) + return false; + /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ + else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) + return false; + /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ + else if(current_length > chain->initial_length) { + const off_t delta = current_length - chain->initial_length; + if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { + /* if the delta is exactly the size of the last padding block, remove the padding block */ + if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) + return false; + /* if there is at least 'delta' bytes of padding, trim the padding down */ + else if((off_t)chain->tail->data->length >= delta) + return false; + } + } + } + + return (current_length != chain->initial_length); +} + +FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats) +{ + struct stat stats; + const char *tempfile_path_prefix = 0; + off_t current_length; + + FLAC__ASSERT(0 != chain); + + if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; + return false; + } + + if (0 == chain->filename) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; + return false; + } + + current_length = chain_prepare_for_write_(chain, use_padding); + + /* a return value of 0 means there was an error; chain->status is already set */ + if (0 == current_length) + return false; + + if(preserve_file_stats) + get_file_stats_(chain->filename, &stats); + + if(current_length == chain->initial_length) { + if(!chain_rewrite_metadata_in_place_(chain)) + return false; + } + else { + if(!chain_rewrite_file_(chain, tempfile_path_prefix)) + return false; + + /* recompute lengths and offsets */ + { + const FLAC__Metadata_Node *node; + chain->initial_length = current_length; + chain->last_offset = chain->first_offset; + for(node = chain->head; node; node = node->next) + chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); + } + } + + if(preserve_file_stats) + set_file_stats_(chain->filename, &stats); + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) +{ + off_t current_length; + + FLAC__ASSERT(0 != chain); + + if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; + return false; + } + + if (0 != chain->filename) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; + return false; + } + + if (0 == callbacks.write || 0 == callbacks.seek) { + chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; + return false; + } + + if (FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; + return false; + } + + current_length = chain_prepare_for_write_(chain, use_padding); + + /* a return value of 0 means there was an error; chain->status is already set */ + if (0 == current_length) + return false; + + FLAC__ASSERT(current_length == chain->initial_length); + + return chain_rewrite_metadata_in_place_cb_(chain, handle, callbacks.write, callbacks.seek); +} + +FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks) +{ + off_t current_length; + + FLAC__ASSERT(0 != chain); + + if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ + chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; + return false; + } + + if (0 != chain->filename) { + chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; + return false; + } + + if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.eof) { + chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; + return false; + } + if (0 == temp_callbacks.write) { + chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; + return false; + } + + if (!FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; + return false; + } + + current_length = chain_prepare_for_write_(chain, use_padding); + + /* a return value of 0 means there was an error; chain->status is already set */ + if (0 == current_length) + return false; + + FLAC__ASSERT(current_length != chain->initial_length); + + /* rewind */ + if(0 != callbacks.seek(handle, 0, SEEK_SET)) { + chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + return false; + } + + if(!chain_rewrite_file_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.eof, temp_handle, temp_callbacks.write)) + return false; + + /* recompute lengths and offsets */ + { + const FLAC__Metadata_Node *node; + chain->initial_length = current_length; + chain->last_offset = chain->first_offset; + for(node = chain->head; node; node = node->next) + chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); + } + + return true; +} + +FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain) +{ + FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != chain); + + for(node = chain->head; node; ) { + if(!chain_merge_adjacent_padding_(chain, node)) + node = node->next; + } +} + +FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain) +{ + FLAC__Metadata_Node *node, *save; + unsigned i; + + FLAC__ASSERT(0 != chain); + + /* + * Don't try and be too smart... this simple algo is good enough for + * the small number of nodes that we deal with. + */ + for(i = 0, node = chain->head; i < chain->nodes; i++) { + if(node->data->type == FLAC__METADATA_TYPE_PADDING) { + save = node->next; + chain_remove_node_(chain, node); + chain_append_node_(chain, node); + node = save; + } + else { + node = node->next; + } + } + + FLAC__metadata_chain_merge_padding(chain); +} + + +FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void) +{ + FLAC__Metadata_Iterator *iterator = (FLAC__Metadata_Iterator*)calloc(1, sizeof(FLAC__Metadata_Iterator)); + + /* calloc() implies: + iterator->current = 0; + iterator->chain = 0; + */ + + return iterator; +} + +FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + + free(iterator); +} + +FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != chain); + FLAC__ASSERT(0 != chain->head); + + iterator->chain = chain; + iterator->current = chain->head; +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + + if(0 == iterator->current || 0 == iterator->current->next) + return false; + + iterator->current = iterator->current->next; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + + if(0 == iterator->current || 0 == iterator->current->prev) + return false; + + iterator->current = iterator->current->prev; + return true; +} + +FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + FLAC__ASSERT(0 != iterator->current->data); + + return iterator->current->data->type; +} + +FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + + return iterator->current->data; +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != block); + return FLAC__metadata_iterator_delete_block(iterator, false) && FLAC__metadata_iterator_insert_block_after(iterator, block); +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding) +{ + FLAC__Metadata_Node *save; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + + if(0 == iterator->current->prev) { + FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); + return false; + } + + save = iterator->current->prev; + + if(replace_with_padding) { + FLAC__metadata_object_delete_data(iterator->current->data); + iterator->current->data->type = FLAC__METADATA_TYPE_PADDING; + } + else { + chain_delete_node_(iterator->chain, iterator->current); + } + + iterator->current = save; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) +{ + FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + FLAC__ASSERT(0 != block); + + if(block->type == FLAC__METADATA_TYPE_STREAMINFO) + return false; + + if(0 == iterator->current->prev) { + FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); + return false; + } + + if(0 == (node = node_new_())) + return false; + + node->data = block; + iterator_insert_node_(iterator, node); + iterator->current = node; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) +{ + FLAC__Metadata_Node *node; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->current); + FLAC__ASSERT(0 != block); + + if(block->type == FLAC__METADATA_TYPE_STREAMINFO) + return false; + + if(0 == (node = node_new_())) + return false; + + node->data = block; + iterator_insert_node_after_(iterator, node); + iterator->current = node; + return true; +} + + +/**************************************************************************** + * + * Local function definitions + * + ***************************************************************************/ + +void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) +{ + unsigned i; + + b += bytes; + + for(i = 0; i < bytes; i++) { + *(--b) = (FLAC__byte)(val & 0xff); + val >>= 8; + } +} + +void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) +{ + unsigned i; + + for(i = 0; i < bytes; i++) { + *(b++) = (FLAC__byte)(val & 0xff); + val >>= 8; + } +} + +void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes) +{ + unsigned i; + + b += bytes; + + for(i = 0; i < bytes; i++) { + *(--b) = (FLAC__byte)(val & 0xff); + val >>= 8; + } +} + +FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes) +{ + FLAC__uint32 ret = 0; + unsigned i; + + for(i = 0; i < bytes; i++) + ret = (ret << 8) | (FLAC__uint32)(*b++); + + return ret; +} + +FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes) +{ + FLAC__uint32 ret = 0; + unsigned i; + + b += bytes; + + for(i = 0; i < bytes; i++) + ret = (ret << 8) | (FLAC__uint32)(*--b); + + return ret; +} + +FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes) +{ + FLAC__uint64 ret = 0; + unsigned i; + + for(i = 0; i < bytes; i++) + ret = (ret << 8) | (FLAC__uint64)(*b++); + + return ret; +} + +FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + if(!read_metadata_block_header_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, &iterator->is_last, &iterator->type, &iterator->length)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + + return true; +} + +FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block) +{ + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + + iterator->status = read_metadata_block_data_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, block); + + return (iterator->status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK); +} + +FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length) +{ + FLAC__byte raw_header[FLAC__STREAM_METADATA_HEADER_LENGTH]; + + if(read_cb(raw_header, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) + return false; + + *is_last = raw_header[0] & 0x80? true : false; + *type = (FLAC__MetadataType)(raw_header[0] & 0x7f); + *length = unpack_uint32_(raw_header + 1, 3); + + /* Note that we don't check: + * if(iterator->type >= FLAC__METADATA_TYPE_UNDEFINED) + * we just will read in an opaque block + */ + + return true; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block) +{ + switch(block->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + return read_metadata_block_data_streaminfo_cb_(handle, read_cb, &block->data.stream_info); + case FLAC__METADATA_TYPE_PADDING: + return read_metadata_block_data_padding_cb_(handle, seek_cb, &block->data.padding, block->length); + case FLAC__METADATA_TYPE_APPLICATION: + return read_metadata_block_data_application_cb_(handle, read_cb, &block->data.application, block->length); + case FLAC__METADATA_TYPE_SEEKTABLE: + return read_metadata_block_data_seektable_cb_(handle, read_cb, &block->data.seek_table, block->length); + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + return read_metadata_block_data_vorbis_comment_cb_(handle, read_cb, &block->data.vorbis_comment); + case FLAC__METADATA_TYPE_CUESHEET: + return read_metadata_block_data_cuesheet_cb_(handle, read_cb, &block->data.cue_sheet); + case FLAC__METADATA_TYPE_PICTURE: + return read_metadata_block_data_picture_cb_(handle, read_cb, &block->data.picture); + default: + return read_metadata_block_data_unknown_cb_(handle, read_cb, &block->data.unknown, block->length); + } +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block) +{ + FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH], *b; + + if(read_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + b = buffer; + + /* we are using hardcoded numbers for simplicity but we should + * probably eventually write a bit-level unpacker and use the + * _STREAMINFO_ constants. + */ + block->min_blocksize = unpack_uint32_(b, 2); b += 2; + block->max_blocksize = unpack_uint32_(b, 2); b += 2; + block->min_framesize = unpack_uint32_(b, 3); b += 3; + block->max_framesize = unpack_uint32_(b, 3); b += 3; + block->sample_rate = (unpack_uint32_(b, 2) << 4) | ((unsigned)(b[2] & 0xf0) >> 4); + block->channels = (unsigned)((b[2] & 0x0e) >> 1) + 1; + block->bits_per_sample = ((((unsigned)(b[2] & 0x01)) << 4) | (((unsigned)(b[3] & 0xf0)) >> 4)) + 1; + block->total_samples = (((FLAC__uint64)(b[3] & 0x0f)) << 32) | unpack_uint64_(b+4, 4); + memcpy(block->md5sum, b+8, 16); + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length) +{ + (void)block; /* nothing to do; we don't care about reading the padding bytes */ + + if(0 != seek_cb(handle, block_length, SEEK_CUR)) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length) +{ + const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + + if(read_cb(block->id, 1, id_bytes, handle) != id_bytes) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + if(block_length < id_bytes) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + block_length -= id_bytes; + + if(block_length == 0) { + block->data = 0; + } + else { + if(0 == (block->data = (FLAC__byte*)malloc(block_length))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + if(read_cb(block->data, 1, block_length, handle) != block_length) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length) +{ + unsigned i; + FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; + + FLAC__ASSERT(block_length % FLAC__STREAM_METADATA_SEEKPOINT_LENGTH == 0); + + block->num_points = block_length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; + + if(block->num_points == 0) + block->points = 0; + else if(0 == (block->points = (FLAC__StreamMetadata_SeekPoint*)safe_malloc_mul_2op_(block->num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + for(i = 0; i < block->num_points; i++) { + if(read_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + /* some MAGIC NUMBERs here */ + block->points[i].sample_number = unpack_uint64_(buffer, 8); + block->points[i].stream_offset = unpack_uint64_(buffer+8, 8); + block->points[i].frame_samples = unpack_uint32_(buffer+16, 2); + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry) +{ + const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; + FLAC__byte buffer[4]; /* magic number is asserted below */ + + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8 == sizeof(buffer)); + + if(read_cb(buffer, 1, entry_length_len, handle) != entry_length_len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + entry->length = unpack_uint32_little_endian_(buffer, entry_length_len); + + if(0 != entry->entry) + free(entry->entry); + + if(entry->length == 0) { + entry->entry = 0; + } + else { + if(0 == (entry->entry = (FLAC__byte*)safe_malloc_add_2op_(entry->length, /*+*/1))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + if(read_cb(entry->entry, 1, entry->length, handle) != entry->length) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + entry->entry[entry->length] = '\0'; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block) +{ + unsigned i; + FLAC__Metadata_SimpleIteratorStatus status; + const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; + FLAC__byte buffer[4]; /* magic number is asserted below */ + + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8 == sizeof(buffer)); + + if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, &(block->vendor_string)))) + return status; + + if(read_cb(buffer, 1, num_comments_len, handle) != num_comments_len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->num_comments = unpack_uint32_little_endian_(buffer, num_comments_len); + + if(block->num_comments == 0) { + block->comments = 0; + } + else if(0 == (block->comments = (FLAC__StreamMetadata_VorbisComment_Entry*)calloc(block->num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + for(i = 0; i < block->num_comments; i++) { + if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, block->comments + i))) + return status; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track) +{ + unsigned i, len; + FLAC__byte buffer[32]; /* asserted below that this is big enough */ + + FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + track->offset = unpack_uint64_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + track->number = (FLAC__byte)unpack_uint32_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; + if(read_cb(track->isrc, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); + len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN == 1); + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN == 1); + track->type = buffer[0] >> 7; + track->pre_emphasis = (buffer[0] >> 6) & 1; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + track->num_indices = (FLAC__byte)unpack_uint32_(buffer, len); + + if(track->num_indices == 0) { + track->indices = 0; + } + else if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)calloc(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + for(i = 0; i < track->num_indices; i++) { + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + track->indices[i].offset = unpack_uint64_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + track->indices[i].number = (FLAC__byte)unpack_uint32_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block) +{ + unsigned i, len; + FLAC__Metadata_SimpleIteratorStatus status; + FLAC__byte buffer[1024]; /* MSVC needs a constant expression so we put a magic number and assert */ + + FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)/8 <= sizeof(buffer)); + FLAC__ASSERT(sizeof(FLAC__uint64) <= sizeof(buffer)); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; + if(read_cb(block->media_catalog_number, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->lead_in = unpack_uint64_(buffer, len); + + FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); + len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->is_cd = buffer[0]&0x80? true : false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->num_tracks = unpack_uint32_(buffer, len); + + if(block->num_tracks == 0) { + block->tracks = 0; + } + else if(0 == (block->tracks = (FLAC__StreamMetadata_CueSheet_Track*)calloc(block->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + for(i = 0; i < block->num_tracks; i++) { + if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_cuesheet_track_cb_(handle, read_cb, block->tracks + i))) + return status; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cstring_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__byte **data, FLAC__uint32 *length, FLAC__uint32 length_len) +{ + FLAC__byte buffer[sizeof(FLAC__uint32)]; + + FLAC__ASSERT(0 != data); + FLAC__ASSERT(length_len%8 == 0); + + length_len /= 8; /* convert to bytes */ + + FLAC__ASSERT(sizeof(buffer) >= length_len); + + if(read_cb(buffer, 1, length_len, handle) != length_len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + *length = unpack_uint32_(buffer, length_len); + + if(0 != *data) + free(*data); + + if(0 == (*data = (FLAC__byte*)safe_malloc_add_2op_(*length, /*+*/1))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + if(*length > 0) { + if(read_cb(*data, 1, *length, handle) != *length) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + } + + (*data)[*length] = '\0'; + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block) +{ + FLAC__Metadata_SimpleIteratorStatus status; + FLAC__byte buffer[4]; /* asserted below that this is big enough */ + FLAC__uint32 len; + + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); + + FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_TYPE_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->type = /*(FLAC__StreamMetadata_Picture_Type)*/unpack_uint32_(buffer, len); // changed for MAME, check + + if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, (FLAC__byte**)(&(block->mime_type)), &len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) + return status; + + if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->description), &len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) + return status; + + FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->width = unpack_uint32_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->height = unpack_uint32_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->depth = unpack_uint32_(buffer, len); + + FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_COLORS_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN / 8; + if(read_cb(buffer, 1, len, handle) != len) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + block->colors = unpack_uint32_(buffer, len); + + /* for convenience we use read_metadata_block_data_picture_cstring_cb_() even though it adds an extra terminating NUL we don't use */ + if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->data), &(block->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) + return status; + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length) +{ + if(block_length == 0) { + block->data = 0; + } + else { + if(0 == (block->data = (FLAC__byte*)malloc(block_length))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + if(read_cb(block->data, 1, block_length, handle) != block_length) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + } + + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; +} + +FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) +{ + FLAC__ASSERT(0 != file); + FLAC__ASSERT(0 != status); + + if(!write_metadata_block_header_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + + return true; +} + +FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) +{ + FLAC__ASSERT(0 != file); + FLAC__ASSERT(0 != status); + + if (write_metadata_block_data_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; + return true; + } + else { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } +} + +FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) +{ + FLAC__byte buffer[FLAC__STREAM_METADATA_HEADER_LENGTH]; + + FLAC__ASSERT(block->length < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); + + buffer[0] = (block->is_last? 0x80 : 0) | (FLAC__byte)block->type; + pack_uint32_(block->length, buffer + 1, 3); + + if(write_cb(buffer, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) + return false; + + return true; +} + +FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) +{ + FLAC__ASSERT(0 != block); + + switch(block->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + return write_metadata_block_data_streaminfo_cb_(handle, write_cb, &block->data.stream_info); + case FLAC__METADATA_TYPE_PADDING: + return write_metadata_block_data_padding_cb_(handle, write_cb, &block->data.padding, block->length); + case FLAC__METADATA_TYPE_APPLICATION: + return write_metadata_block_data_application_cb_(handle, write_cb, &block->data.application, block->length); + case FLAC__METADATA_TYPE_SEEKTABLE: + return write_metadata_block_data_seektable_cb_(handle, write_cb, &block->data.seek_table); + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + return write_metadata_block_data_vorbis_comment_cb_(handle, write_cb, &block->data.vorbis_comment); + case FLAC__METADATA_TYPE_CUESHEET: + return write_metadata_block_data_cuesheet_cb_(handle, write_cb, &block->data.cue_sheet); + case FLAC__METADATA_TYPE_PICTURE: + return write_metadata_block_data_picture_cb_(handle, write_cb, &block->data.picture); + default: + return write_metadata_block_data_unknown_cb_(handle, write_cb, &block->data.unknown, block->length); + } +} + +FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block) +{ + FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH]; + const unsigned channels1 = block->channels - 1; + const unsigned bps1 = block->bits_per_sample - 1; + + /* we are using hardcoded numbers for simplicity but we should + * probably eventually write a bit-level packer and use the + * _STREAMINFO_ constants. + */ + pack_uint32_(block->min_blocksize, buffer, 2); + pack_uint32_(block->max_blocksize, buffer+2, 2); + pack_uint32_(block->min_framesize, buffer+4, 3); + pack_uint32_(block->max_framesize, buffer+7, 3); + buffer[10] = (block->sample_rate >> 12) & 0xff; + buffer[11] = (block->sample_rate >> 4) & 0xff; + buffer[12] = ((block->sample_rate & 0x0f) << 4) | (channels1 << 1) | (bps1 >> 4); + buffer[13] = (FLAC__byte)(((bps1 & 0x0f) << 4) | ((block->total_samples >> 32) & 0x0f)); + pack_uint32_((FLAC__uint32)block->total_samples, buffer+14, 4); + memcpy(buffer+18, block->md5sum, 16); + + if(write_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) + return false; + + return true; +} + +FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length) +{ + unsigned i, n = block_length; + FLAC__byte buffer[1024]; + + (void)block; + + memset(buffer, 0, 1024); + + for(i = 0; i < n/1024; i++) + if(write_cb(buffer, 1, 1024, handle) != 1024) + return false; + + n %= 1024; + + if(write_cb(buffer, 1, n, handle) != n) + return false; + + return true; +} + +FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length) +{ + const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + + if(write_cb(block->id, 1, id_bytes, handle) != id_bytes) + return false; + + block_length -= id_bytes; + + if(write_cb(block->data, 1, block_length, handle) != block_length) + return false; + + return true; +} + +FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block) +{ + unsigned i; + FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; + + for(i = 0; i < block->num_points; i++) { + /* some MAGIC NUMBERs here */ + pack_uint64_(block->points[i].sample_number, buffer, 8); + pack_uint64_(block->points[i].stream_offset, buffer+8, 8); + pack_uint32_(block->points[i].frame_samples, buffer+16, 2); + if(write_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) + return false; + } + + return true; +} + +FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block) +{ + unsigned i; + const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; + const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; + FLAC__byte buffer[4]; /* magic number is asserted below */ + + FLAC__ASSERT(max(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN, FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8 == sizeof(buffer)); + + pack_uint32_little_endian_(block->vendor_string.length, buffer, entry_length_len); + if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) + return false; + if(write_cb(block->vendor_string.entry, 1, block->vendor_string.length, handle) != block->vendor_string.length) + return false; + + pack_uint32_little_endian_(block->num_comments, buffer, num_comments_len); + if(write_cb(buffer, 1, num_comments_len, handle) != num_comments_len) + return false; + + for(i = 0; i < block->num_comments; i++) { + pack_uint32_little_endian_(block->comments[i].length, buffer, entry_length_len); + if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) + return false; + if(write_cb(block->comments[i].entry, 1, block->comments[i].length, handle) != block->comments[i].length) + return false; + } + + return true; +} + +FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block) +{ + unsigned i, j, len; + FLAC__byte buffer[1024]; /* asserted below that this is big enough */ + + FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; + if(write_cb(block->media_catalog_number, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; + pack_uint64_(block->lead_in, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); + len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; + memset(buffer, 0, len); + if(block->is_cd) + buffer[0] |= 0x80; + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; + pack_uint32_(block->num_tracks, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + for(i = 0; i < block->num_tracks; i++) { + FLAC__StreamMetadata_CueSheet_Track *track = block->tracks + i; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; + pack_uint64_(track->offset, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; + pack_uint32_(track->number, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; + if(write_cb(track->isrc, 1, len, handle) != len) + return false; + + FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); + len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; + memset(buffer, 0, len); + buffer[0] = (track->type << 7) | (track->pre_emphasis << 6); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; + pack_uint32_(track->num_indices, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + for(j = 0; j < track->num_indices; j++) { + FLAC__StreamMetadata_CueSheet_Index *index = track->indices + j; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; + pack_uint64_(index->offset, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; + pack_uint32_(index->number, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); + len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; + memset(buffer, 0, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + } + } + + return true; +} + +FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block) +{ + unsigned len; + size_t slen; + FLAC__byte buffer[4]; /* magic number is asserted below */ + + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_TYPE_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_COLORS_LEN%8); + FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN%8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); + FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8); + + len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8; + pack_uint32_(block->type, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8; + slen = strlen(block->mime_type); + pack_uint32_(slen, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + if(write_cb(block->mime_type, 1, slen, handle) != slen) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8; + slen = strlen((const char *)block->description); + pack_uint32_(slen, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + if(write_cb(block->description, 1, slen, handle) != slen) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8; + pack_uint32_(block->width, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8; + pack_uint32_(block->height, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8; + pack_uint32_(block->depth, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8; + pack_uint32_(block->colors, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + + len = FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8; + pack_uint32_(block->data_length, buffer, len); + if(write_cb(buffer, 1, len, handle) != len) + return false; + if(write_cb(block->data, 1, block->data_length, handle) != block->data_length) + return false; + + return true; +} + +FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length) +{ + if(write_cb(block->data, 1, block_length, handle) != block_length) + return false; + + return true; +} + +FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block) +{ + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) + return false; + + if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) + return false; + + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + return read_metadata_block_header_(iterator); +} + +FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last) +{ + FLAC__StreamMetadata *padding; + + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + block->is_last = false; + + if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) + return false; + + if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) + return false; + + if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) + return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + + padding->is_last = padding_is_last; + padding->length = padding_length; + + if(!write_metadata_block_header_(iterator->file, &iterator->status, padding)) { + FLAC__metadata_object_delete(padding); + return false; + } + + if(!write_metadata_block_data_(iterator->file, &iterator->status, padding)) { + FLAC__metadata_object_delete(padding); + return false; + } + + FLAC__metadata_object_delete(padding); + + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + return read_metadata_block_header_(iterator); +} + +FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append) +{ + FILE *tempfile; + char *tempfilename; + int fixup_is_last_code = 0; /* 0 => no need to change any is_last flags */ + off_t fixup_is_last_flag_offset = -1; + + FLAC__ASSERT(0 != block || append == false); + + if(iterator->is_last) { + if(append) { + fixup_is_last_code = 1; /* 1 => clear the is_last flag at the following offset */ + fixup_is_last_flag_offset = iterator->offset[iterator->depth]; + } + else if(0 == block) { + simple_iterator_push_(iterator); + if(!FLAC__metadata_simple_iterator_prev(iterator)) { + (void)simple_iterator_pop_(iterator); + return false; + } + fixup_is_last_code = -1; /* -1 => set the is_last the flag at the following offset */ + fixup_is_last_flag_offset = iterator->offset[iterator->depth]; + if(!simple_iterator_pop_(iterator)) + return false; + } + } + + if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append)) + return false; + + if(0 != block) { + if(!write_metadata_block_header_(tempfile, &iterator->status, block)) { + cleanup_tempfile_(&tempfile, &tempfilename); + return false; + } + + if(!write_metadata_block_data_(tempfile, &iterator->status, block)) { + cleanup_tempfile_(&tempfile, &tempfilename); + return false; + } + } + + if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_code, fixup_is_last_flag_offset, block==0)) + return false; + + if(append) + return FLAC__metadata_simple_iterator_next(iterator); + + return true; +} + +void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(iterator->depth+1 < SIMPLE_ITERATOR_MAX_PUSH_DEPTH); + iterator->offset[iterator->depth+1] = iterator->offset[iterator->depth]; + iterator->depth++; +} + +FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator) +{ + FLAC__ASSERT(iterator->depth > 0); + iterator->depth--; + if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + return read_metadata_block_header_(iterator); +} + +/* return meanings: + * 0: ok + * 1: read error + * 2: seek error + * 3: not a FLAC file + */ +unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb) +{ + FLAC__byte buffer[4]; + size_t n; + unsigned i; + + FLAC__ASSERT(FLAC__STREAM_SYNC_LENGTH == sizeof(buffer)); + + /* skip any id3v2 tag */ + errno = 0; + n = read_cb(buffer, 1, 4, handle); + if(errno) + return 1; + else if(n != 4) + return 3; + else if(0 == memcmp(buffer, "ID3", 3)) { + unsigned tag_length = 0; + + /* skip to the tag length */ + if(seek_cb(handle, 2, SEEK_CUR) < 0) + return 2; + + /* read the length */ + for(i = 0; i < 4; i++) { + if(read_cb(buffer, 1, 1, handle) < 1 || buffer[0] & 0x80) + return 1; + tag_length <<= 7; + tag_length |= (buffer[0] & 0x7f); + } + + /* skip the rest of the tag */ + if(seek_cb(handle, tag_length, SEEK_CUR) < 0) + return 2; + + /* read the stream sync code */ + errno = 0; + n = read_cb(buffer, 1, 4, handle); + if(errno) + return 1; + else if(n != 4) + return 3; + } + + /* check for the fLaC signature */ + if(0 == memcmp(FLAC__STREAM_SYNC_STRING, buffer, FLAC__STREAM_SYNC_LENGTH)) + return 0; + else + return 3; +} + +unsigned seek_to_first_metadata_block_(FILE *f) +{ + return seek_to_first_metadata_block_cb_((FLAC__IOHandle)f, (FLAC__IOCallback_Read)fread, fseek_wrapper_); +} + +FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append) +{ + const off_t offset_end = append? iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length : iterator->offset[iterator->depth]; + + if(0 != fseeko(iterator->file, 0, SEEK_SET)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + if(!open_tempfile_(iterator->filename, iterator->tempfile_path_prefix, tempfile, tempfilename, &iterator->status)) { + cleanup_tempfile_(tempfile, tempfilename); + return false; + } + if(!copy_n_bytes_from_file_(iterator->file, *tempfile, offset_end, &iterator->status)) { + cleanup_tempfile_(tempfile, tempfilename); + return false; + } + + return true; +} + +FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, off_t fixup_is_last_flag_offset, FLAC__bool backup) +{ + off_t save_offset = iterator->offset[iterator->depth]; + FLAC__ASSERT(0 != *tempfile); + + if(0 != fseeko(iterator->file, save_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length, SEEK_SET)) { + cleanup_tempfile_(tempfile, tempfilename); + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + if(!copy_remaining_bytes_from_file_(iterator->file, *tempfile, &iterator->status)) { + cleanup_tempfile_(tempfile, tempfilename); + return false; + } + + if(fixup_is_last_code != 0) { + /* + * if code == 1, it means a block was appended to the end so + * we have to clear the is_last flag of the previous block + * if code == -1, it means the last block was deleted so + * we have to set the is_last flag of the previous block + */ + /* MAGIC NUMBERs here; we know the is_last flag is the high bit of the byte at this location */ + FLAC__byte x; + if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { + cleanup_tempfile_(tempfile, tempfilename); + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + if(fread(&x, 1, 1, *tempfile) != 1) { + cleanup_tempfile_(tempfile, tempfilename); + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + if(fixup_is_last_code > 0) { + FLAC__ASSERT(x & 0x80); + x &= 0x7f; + } + else { + FLAC__ASSERT(!(x & 0x80)); + x |= 0x80; + } + if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { + cleanup_tempfile_(tempfile, tempfilename); + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + if(local__fwrite(&x, 1, 1, *tempfile) != 1) { + cleanup_tempfile_(tempfile, tempfilename); + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + } + + (void)fclose(iterator->file); + + if(!transport_tempfile_(iterator->filename, tempfile, tempfilename, &iterator->status)) + return false; + + if(iterator->has_stats) + set_file_stats_(iterator->filename, &iterator->stats); + + if(!simple_iterator_prime_input_(iterator, !iterator->is_writable)) + return false; + if(backup) { + while(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length < save_offset) + if(!FLAC__metadata_simple_iterator_next(iterator)) + return false; + return true; + } + else { + /* move the iterator to it's original block faster by faking a push, then doing a pop_ */ + FLAC__ASSERT(iterator->depth == 0); + iterator->offset[0] = save_offset; + iterator->depth++; + return simple_iterator_pop_(iterator); + } +} + +FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) +{ + FLAC__byte buffer[8192]; + size_t n; + + FLAC__ASSERT(bytes >= 0); + while(bytes > 0) { + n = min(sizeof(buffer), (size_t)bytes); + if(fread(buffer, 1, n, file) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + if(local__fwrite(buffer, 1, n, tempfile) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + bytes -= n; + } + + return true; +} + +FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) +{ + FLAC__byte buffer[8192]; + size_t n; + + FLAC__ASSERT(bytes >= 0); + while(bytes > 0) { + n = min(sizeof(buffer), (size_t)bytes); + if(read_cb(buffer, 1, n, handle) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + if(temp_write_cb(buffer, 1, n, temp_handle) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + bytes -= n; + } + + return true; +} + +FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status) +{ + FLAC__byte buffer[8192]; + size_t n; + + while(!feof(file)) { + n = fread(buffer, 1, sizeof(buffer), file); + if(n == 0 && !feof(file)) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + if(n > 0 && local__fwrite(buffer, 1, n, tempfile) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + } + + return true; +} + +FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status) +{ + FLAC__byte buffer[8192]; + size_t n; + + while(!eof_cb(handle)) { + n = read_cb(buffer, 1, sizeof(buffer), handle); + if(n == 0 && !eof_cb(handle)) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + if(n > 0 && temp_write_cb(buffer, 1, n, temp_handle) != n) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; + return false; + } + } + + return true; +} + +FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) +{ + static const char *tempfile_suffix = ".metadata_edit"; + if(0 == tempfile_path_prefix) { + if(0 == (*tempfilename = (char*)safe_malloc_add_3op_(strlen(filename), /*+*/strlen(tempfile_suffix), /*+*/1))) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + strcpy(*tempfilename, filename); + strcat(*tempfilename, tempfile_suffix); + } + else { + const char *p = strrchr(filename, '/'); + if(0 == p) + p = filename; + else + p++; + + if(0 == (*tempfilename = (char*)safe_malloc_add_4op_(strlen(tempfile_path_prefix), /*+*/strlen(p), /*+*/strlen(tempfile_suffix), /*+*/2))) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + strcpy(*tempfilename, tempfile_path_prefix); + strcat(*tempfilename, "/"); + strcat(*tempfilename, p); + strcat(*tempfilename, tempfile_suffix); + } + + if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + + return true; +} + +FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) +{ + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != tempfile); + FLAC__ASSERT(0 != *tempfile); + FLAC__ASSERT(0 != tempfilename); + FLAC__ASSERT(0 != *tempfilename); + FLAC__ASSERT(0 != status); + + (void)fclose(*tempfile); + *tempfile = 0; + +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__ + /* on some flavors of windows, rename() will fail if the destination already exists */ + if(unlink(filename) < 0) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; + return false; + } +#endif + + /*@@@ to fully support the tempfile_path_prefix we need to update this piece to actually copy across filesystems instead of just rename(): */ + if(0 != rename(*tempfilename, filename)) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; + return false; + } + + cleanup_tempfile_(tempfile, tempfilename); + + return true; +} + +void cleanup_tempfile_(FILE **tempfile, char **tempfilename) +{ + if(0 != *tempfile) { + (void)fclose(*tempfile); + *tempfile = 0; + } + + if(0 != *tempfilename) { + (void)unlink(*tempfilename); + free(*tempfilename); + *tempfilename = 0; + } +} + +FLAC__bool get_file_stats_(const char *filename, struct stat *stats) +{ + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != stats); + return (0 == stat(filename, stats)); +} + +void set_file_stats_(const char *filename, struct stat *stats) +{ + struct utimbuf srctime; + + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(0 != stats); + + srctime.actime = stats->st_atime; + srctime.modtime = stats->st_mtime; + (void)chmod(filename, stats->st_mode); + (void)utime(filename, &srctime); +#if !defined _MSC_VER && !defined __BORLANDC__ && !defined __MINGW32__ && !defined __EMX__ + (void)chown(filename, stats->st_uid, -1); + (void)chown(filename, -1, stats->st_gid); +#endif +} + +int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence) +{ + return fseeko((FILE*)handle, (off_t)offset, whence); +} + +FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle) +{ + return ftello((FILE*)handle); +} + +FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status) +{ + switch(status) { + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK: + return FLAC__METADATA_CHAIN_STATUS_OK; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT: + return FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE: + return FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE: + return FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE: + return FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA: + return FLAC__METADATA_CHAIN_STATUS_BAD_METADATA; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR: + return FLAC__METADATA_CHAIN_STATUS_READ_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR: + return FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR: + return FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR: + return FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR: + return FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR: + return FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; + case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR: + default: + return FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; + } +} diff -Nru mame-0.144/src/lib/libflac/libflac/metadata_object.c mame-0.145/src/lib/libflac/libflac/metadata_object.c --- mame-0.144/src/lib/libflac/libflac/metadata_object.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/metadata_object.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1819 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "private/metadata.h" + +#include "flac/assert.h" +#include "share/alloc.h" + + +/**************************************************************************** + * + * Local routines + * + ***************************************************************************/ + +/* copy bytes: + * from = NULL && bytes = 0 + * to <- NULL + * from != NULL && bytes > 0 + * to <- copy of from + * else ASSERT + * malloc error leaves 'to' unchanged + */ +static FLAC__bool copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) +{ + FLAC__ASSERT(0 != to); + if(bytes > 0 && 0 != from) { + FLAC__byte *x; + if(0 == (x = (FLAC__byte*)safe_malloc_(bytes))) + return false; + memcpy(x, from, bytes); + *to = x; + } + else { + FLAC__ASSERT(0 == from); + FLAC__ASSERT(bytes == 0); + *to = 0; + } + return true; +} + +#if 0 /* UNUSED */ +/* like copy_bytes_(), but free()s the original '*to' if the copy succeeds and the original '*to' is non-NULL */ +static FLAC__bool free_copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) +{ + FLAC__byte *copy; + FLAC__ASSERT(0 != to); + if(copy_bytes_(©, from, bytes)) { + if(*to) + free(*to); + *to = copy; + return true; + } + else + return false; +} +#endif + +/* reallocate entry to 1 byte larger and add a terminating NUL */ +/* realloc() failure leaves entry unchanged */ +static FLAC__bool ensure_null_terminated_(FLAC__byte **entry, unsigned length) +{ + FLAC__byte *x = (FLAC__byte*)safe_realloc_add_2op_(*entry, length, /*+*/1); + if(0 != x) { + x[length] = '\0'; + *entry = x; + return true; + } + else + return false; +} + +/* copies the NUL-terminated C-string 'from' to '*to', leaving '*to' + * unchanged if malloc fails, free()ing the original '*to' if it + * succeeds and the original '*to' was not NULL + */ +static FLAC__bool copy_cstring_(char **to, const char *from) +{ + char *copy = strdup(from); + FLAC__ASSERT(to); + if(copy) { + if(*to) + free(*to); + *to = copy; + return true; + } + else + return false; +} + +static FLAC__bool copy_vcentry_(FLAC__StreamMetadata_VorbisComment_Entry *to, const FLAC__StreamMetadata_VorbisComment_Entry *from) +{ + to->length = from->length; + if(0 == from->entry) { + FLAC__ASSERT(from->length == 0); + to->entry = 0; + } + else { + FLAC__byte *x; + FLAC__ASSERT(from->length > 0); + if(0 == (x = (FLAC__byte*)safe_malloc_add_2op_(from->length, /*+*/1))) + return false; + memcpy(x, from->entry, from->length); + x[from->length] = '\0'; + to->entry = x; + } + return true; +} + +static FLAC__bool copy_track_(FLAC__StreamMetadata_CueSheet_Track *to, const FLAC__StreamMetadata_CueSheet_Track *from) +{ + memcpy(to, from, sizeof(FLAC__StreamMetadata_CueSheet_Track)); + if(0 == from->indices) { + FLAC__ASSERT(from->num_indices == 0); + } + else { + FLAC__StreamMetadata_CueSheet_Index *x; + FLAC__ASSERT(from->num_indices > 0); + if(0 == (x = (FLAC__StreamMetadata_CueSheet_Index*)safe_malloc_mul_2op_(from->num_indices, /*times*/sizeof(FLAC__StreamMetadata_CueSheet_Index)))) + return false; + memcpy(x, from->indices, from->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index)); + to->indices = x; + } + return true; +} + +static void seektable_calculate_length_(FLAC__StreamMetadata *object) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + object->length = object->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; +} + +static FLAC__StreamMetadata_SeekPoint *seekpoint_array_new_(unsigned num_points) +{ + FLAC__StreamMetadata_SeekPoint *object_array; + + FLAC__ASSERT(num_points > 0); + + object_array = (FLAC__StreamMetadata_SeekPoint*)safe_malloc_mul_2op_(num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)); + + if(0 != object_array) { + unsigned i; + for(i = 0; i < num_points; i++) { + object_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + object_array[i].stream_offset = 0; + object_array[i].frame_samples = 0; + } + } + + return object_array; +} + +static void vorbiscomment_calculate_length_(FLAC__StreamMetadata *object) +{ + unsigned i; + + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + + object->length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN) / 8; + object->length += object->data.vorbis_comment.vendor_string.length; + object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8; + for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { + object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8); + object->length += object->data.vorbis_comment.comments[i].length; + } +} + +static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_new_(unsigned num_comments) +{ + FLAC__ASSERT(num_comments > 0); + + return (FLAC__StreamMetadata_VorbisComment_Entry*)safe_calloc_(num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)); +} + +static void vorbiscomment_entry_array_delete_(FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) +{ + unsigned i; + + FLAC__ASSERT(0 != object_array && num_comments > 0); + + for(i = 0; i < num_comments; i++) + if(0 != object_array[i].entry) + free(object_array[i].entry); + + if(0 != object_array) + free(object_array); +} + +static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_copy_(const FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) +{ + FLAC__StreamMetadata_VorbisComment_Entry *return_array; + + FLAC__ASSERT(0 != object_array); + FLAC__ASSERT(num_comments > 0); + + return_array = vorbiscomment_entry_array_new_(num_comments); + + if(0 != return_array) { + unsigned i; + + for(i = 0; i < num_comments; i++) { + if(!copy_vcentry_(return_array+i, object_array+i)) { + vorbiscomment_entry_array_delete_(return_array, num_comments); + return 0; + } + } + } + + return return_array; +} + +static FLAC__bool vorbiscomment_set_entry_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry *dest, const FLAC__StreamMetadata_VorbisComment_Entry *src, FLAC__bool copy) +{ + FLAC__byte *save; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(0 != dest); + FLAC__ASSERT(0 != src); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__ASSERT((0 != src->entry && src->length > 0) || (0 == src->entry && src->length == 0)); + + save = dest->entry; + + if(0 != src->entry && src->length > 0) { + if(copy) { + /* do the copy first so that if we fail we leave the dest object untouched */ + if(!copy_vcentry_(dest, src)) + return false; + } + else { + /* we have to make sure that the string we're taking over is null-terminated */ + + /* + * Stripping the const from src->entry is OK since we're taking + * ownership of the pointer. This is a hack around a deficiency + * in the API where the same function is used for 'copy' and + * 'own', but the source entry is a const pointer. If we were + * precise, the 'own' flavor would be a separate function with a + * non-const source pointer. But it's not, so we hack away. + */ + if(!ensure_null_terminated_((FLAC__byte**)(&src->entry), src->length)) + return false; + *dest = *src; + } + } + else { + /* the src is null */ + *dest = *src; + } + + if(0 != save) + free(save); + + vorbiscomment_calculate_length_(object); + return true; +} + +static int vorbiscomment_find_entry_from_(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name, unsigned field_name_length) +{ + unsigned i; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__ASSERT(0 != field_name); + + for(i = offset; i < object->data.vorbis_comment.num_comments; i++) { + if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) + return (int)i; + } + + return -1; +} + +static void cuesheet_calculate_length_(FLAC__StreamMetadata *object) +{ + unsigned i; + + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + + object->length = ( + FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN + + FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN + + FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN + + FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN + ) / 8; + + object->length += object->data.cue_sheet.num_tracks * ( + FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN + + FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN + ) / 8; + + for(i = 0; i < object->data.cue_sheet.num_tracks; i++) { + object->length += object->data.cue_sheet.tracks[i].num_indices * ( + FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN + + FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN + + FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN + ) / 8; + } +} + +static FLAC__StreamMetadata_CueSheet_Index *cuesheet_track_index_array_new_(unsigned num_indices) +{ + FLAC__ASSERT(num_indices > 0); + + return (FLAC__StreamMetadata_CueSheet_Index*)safe_calloc_(num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)); +} + +static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_new_(unsigned num_tracks) +{ + FLAC__ASSERT(num_tracks > 0); + + return (FLAC__StreamMetadata_CueSheet_Track*)safe_calloc_(num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)); +} + +static void cuesheet_track_array_delete_(FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) +{ + unsigned i; + + FLAC__ASSERT(0 != object_array && num_tracks > 0); + + for(i = 0; i < num_tracks; i++) { + if(0 != object_array[i].indices) { + FLAC__ASSERT(object_array[i].num_indices > 0); + free(object_array[i].indices); + } + } + + if(0 != object_array) + free(object_array); +} + +static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_copy_(const FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) +{ + FLAC__StreamMetadata_CueSheet_Track *return_array; + + FLAC__ASSERT(0 != object_array); + FLAC__ASSERT(num_tracks > 0); + + return_array = cuesheet_track_array_new_(num_tracks); + + if(0 != return_array) { + unsigned i; + + for(i = 0; i < num_tracks; i++) { + if(!copy_track_(return_array+i, object_array+i)) { + cuesheet_track_array_delete_(return_array, num_tracks); + return 0; + } + } + } + + return return_array; +} + +static FLAC__bool cuesheet_set_track_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_CueSheet_Track *dest, const FLAC__StreamMetadata_CueSheet_Track *src, FLAC__bool copy) +{ + FLAC__StreamMetadata_CueSheet_Index *save; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(0 != dest); + FLAC__ASSERT(0 != src); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT((0 != src->indices && src->num_indices > 0) || (0 == src->indices && src->num_indices == 0)); + + save = dest->indices; + + /* do the copy first so that if we fail we leave the object untouched */ + if(copy) { + if(!copy_track_(dest, src)) + return false; + } + else { + *dest = *src; + } + + if(0 != save) + free(save); + + cuesheet_calculate_length_(object); + return true; +} + + +/**************************************************************************** + * + * Metadata object routines + * + ***************************************************************************/ + +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type) +{ + FLAC__StreamMetadata *object; + + if(type > FLAC__MAX_METADATA_TYPE_CODE) + return 0; + + object = (FLAC__StreamMetadata*)calloc(1, sizeof(FLAC__StreamMetadata)); + if(0 != object) { + object->is_last = false; + object->type = type; + switch(type) { + case FLAC__METADATA_TYPE_STREAMINFO: + object->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; + break; + case FLAC__METADATA_TYPE_PADDING: + /* calloc() took care of this for us: + object->length = 0; + */ + break; + case FLAC__METADATA_TYPE_APPLICATION: + object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + /* calloc() took care of this for us: + object->data.application.data = 0; + */ + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + /* calloc() took care of this for us: + object->length = 0; + object->data.seek_table.num_points = 0; + object->data.seek_table.points = 0; + */ + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING); + if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) { + free(object); + return 0; + } + vorbiscomment_calculate_length_(object); + break; + case FLAC__METADATA_TYPE_CUESHEET: + cuesheet_calculate_length_(object); + break; + case FLAC__METADATA_TYPE_PICTURE: + object->length = ( + FLAC__STREAM_METADATA_PICTURE_TYPE_LEN + + FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* empty mime_type string */ + FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* empty description string */ + FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN + + FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN + + FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN + + FLAC__STREAM_METADATA_PICTURE_COLORS_LEN + + FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN + + 0 /* no data */ + ) / 8; + object->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER; + object->data.picture.mime_type = 0; + object->data.picture.description = 0; + /* calloc() took care of this for us: + object->data.picture.width = 0; + object->data.picture.height = 0; + object->data.picture.depth = 0; + object->data.picture.colors = 0; + object->data.picture.data_length = 0; + object->data.picture.data = 0; + */ + /* now initialize mime_type and description with empty strings to make things easier on the client */ + if(!copy_cstring_(&object->data.picture.mime_type, "")) { + free(object); + return 0; + } + if(!copy_cstring_((char**)(&object->data.picture.description), "")) { + if(object->data.picture.mime_type) + free(object->data.picture.mime_type); + free(object); + return 0; + } + break; + default: + /* calloc() took care of this for us: + object->length = 0; + object->data.unknown.data = 0; + */ + break; + } + } + + return object; +} + +FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object) +{ + FLAC__StreamMetadata *to; + + FLAC__ASSERT(0 != object); + + if(0 != (to = FLAC__metadata_object_new(object->type))) { + to->is_last = object->is_last; + to->type = object->type; + to->length = object->length; + switch(to->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + memcpy(&to->data.stream_info, &object->data.stream_info, sizeof(FLAC__StreamMetadata_StreamInfo)); + break; + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(to->length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) { /* underflow check */ + FLAC__metadata_object_delete(to); + return 0; + } + memcpy(&to->data.application.id, &object->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8); + if(!copy_bytes_(&to->data.application.data, object->data.application.data, object->length - FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) { + FLAC__metadata_object_delete(to); + return 0; + } + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + to->data.seek_table.num_points = object->data.seek_table.num_points; + if(to->data.seek_table.num_points > SIZE_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) { /* overflow check */ + FLAC__metadata_object_delete(to); + return 0; + } + if(!copy_bytes_((FLAC__byte**)&to->data.seek_table.points, (FLAC__byte*)object->data.seek_table.points, object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint))) { + FLAC__metadata_object_delete(to); + return 0; + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(0 != to->data.vorbis_comment.vendor_string.entry) { + free(to->data.vorbis_comment.vendor_string.entry); + to->data.vorbis_comment.vendor_string.entry = 0; + } + if(!copy_vcentry_(&to->data.vorbis_comment.vendor_string, &object->data.vorbis_comment.vendor_string)) { + FLAC__metadata_object_delete(to); + return 0; + } + if(object->data.vorbis_comment.num_comments == 0) { + FLAC__ASSERT(0 == object->data.vorbis_comment.comments); + to->data.vorbis_comment.comments = 0; + } + else { + FLAC__ASSERT(0 != object->data.vorbis_comment.comments); + to->data.vorbis_comment.comments = vorbiscomment_entry_array_copy_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); + if(0 == to->data.vorbis_comment.comments) { + FLAC__metadata_object_delete(to); + return 0; + } + } + to->data.vorbis_comment.num_comments = object->data.vorbis_comment.num_comments; + break; + case FLAC__METADATA_TYPE_CUESHEET: + memcpy(&to->data.cue_sheet, &object->data.cue_sheet, sizeof(FLAC__StreamMetadata_CueSheet)); + if(object->data.cue_sheet.num_tracks == 0) { + FLAC__ASSERT(0 == object->data.cue_sheet.tracks); + } + else { + FLAC__ASSERT(0 != object->data.cue_sheet.tracks); + to->data.cue_sheet.tracks = cuesheet_track_array_copy_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); + if(0 == to->data.cue_sheet.tracks) { + FLAC__metadata_object_delete(to); + return 0; + } + } + break; + case FLAC__METADATA_TYPE_PICTURE: + to->data.picture.type = object->data.picture.type; + if(!copy_cstring_(&to->data.picture.mime_type, object->data.picture.mime_type)) { + FLAC__metadata_object_delete(to); + return 0; + } + if(!copy_cstring_((char**)(&to->data.picture.description), (const char*)object->data.picture.description)) { + FLAC__metadata_object_delete(to); + return 0; + } + to->data.picture.width = object->data.picture.width; + to->data.picture.height = object->data.picture.height; + to->data.picture.depth = object->data.picture.depth; + to->data.picture.colors = object->data.picture.colors; + to->data.picture.data_length = object->data.picture.data_length; + if(!copy_bytes_((&to->data.picture.data), object->data.picture.data, object->data.picture.data_length)) { + FLAC__metadata_object_delete(to); + return 0; + } + break; + default: + if(!copy_bytes_(&to->data.unknown.data, object->data.unknown.data, object->length)) { + FLAC__metadata_object_delete(to); + return 0; + } + break; + } + } + + return to; +} + +void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object) +{ + FLAC__ASSERT(0 != object); + + switch(object->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(0 != object->data.application.data) { + free(object->data.application.data); + object->data.application.data = 0; + } + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + if(0 != object->data.seek_table.points) { + free(object->data.seek_table.points); + object->data.seek_table.points = 0; + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(0 != object->data.vorbis_comment.vendor_string.entry) { + free(object->data.vorbis_comment.vendor_string.entry); + object->data.vorbis_comment.vendor_string.entry = 0; + } + if(0 != object->data.vorbis_comment.comments) { + FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); + vorbiscomment_entry_array_delete_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); + } + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(0 != object->data.cue_sheet.tracks) { + FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); + cuesheet_track_array_delete_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); + } + break; + case FLAC__METADATA_TYPE_PICTURE: + if(0 != object->data.picture.mime_type) { + free(object->data.picture.mime_type); + object->data.picture.mime_type = 0; + } + if(0 != object->data.picture.description) { + free(object->data.picture.description); + object->data.picture.description = 0; + } + if(0 != object->data.picture.data) { + free(object->data.picture.data); + object->data.picture.data = 0; + } + break; + default: + if(0 != object->data.unknown.data) { + free(object->data.unknown.data); + object->data.unknown.data = 0; + } + break; + } +} + +FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object) +{ + FLAC__metadata_object_delete_data(object); + free(object); +} + +static FLAC__bool compare_block_data_streaminfo_(const FLAC__StreamMetadata_StreamInfo *block1, const FLAC__StreamMetadata_StreamInfo *block2) +{ + if(block1->min_blocksize != block2->min_blocksize) + return false; + if(block1->max_blocksize != block2->max_blocksize) + return false; + if(block1->min_framesize != block2->min_framesize) + return false; + if(block1->max_framesize != block2->max_framesize) + return false; + if(block1->sample_rate != block2->sample_rate) + return false; + if(block1->channels != block2->channels) + return false; + if(block1->bits_per_sample != block2->bits_per_sample) + return false; + if(block1->total_samples != block2->total_samples) + return false; + if(0 != memcmp(block1->md5sum, block2->md5sum, 16)) + return false; + return true; +} + +static FLAC__bool compare_block_data_application_(const FLAC__StreamMetadata_Application *block1, const FLAC__StreamMetadata_Application *block2, unsigned block_length) +{ + FLAC__ASSERT(0 != block1); + FLAC__ASSERT(0 != block2); + FLAC__ASSERT(block_length >= sizeof(block1->id)); + + if(0 != memcmp(block1->id, block2->id, sizeof(block1->id))) + return false; + if(0 != block1->data && 0 != block2->data) + return 0 == memcmp(block1->data, block2->data, block_length - sizeof(block1->id)); + else + return block1->data == block2->data; +} + +static FLAC__bool compare_block_data_seektable_(const FLAC__StreamMetadata_SeekTable *block1, const FLAC__StreamMetadata_SeekTable *block2) +{ + unsigned i; + + FLAC__ASSERT(0 != block1); + FLAC__ASSERT(0 != block2); + + if(block1->num_points != block2->num_points) + return false; + + if(0 != block1->points && 0 != block2->points) { + for(i = 0; i < block1->num_points; i++) { + if(block1->points[i].sample_number != block2->points[i].sample_number) + return false; + if(block1->points[i].stream_offset != block2->points[i].stream_offset) + return false; + if(block1->points[i].frame_samples != block2->points[i].frame_samples) + return false; + } + return true; + } + else + return block1->points == block2->points; +} + +static FLAC__bool compare_block_data_vorbiscomment_(const FLAC__StreamMetadata_VorbisComment *block1, const FLAC__StreamMetadata_VorbisComment *block2) +{ + unsigned i; + + if(block1->vendor_string.length != block2->vendor_string.length) + return false; + + if(0 != block1->vendor_string.entry && 0 != block2->vendor_string.entry) { + if(0 != memcmp(block1->vendor_string.entry, block2->vendor_string.entry, block1->vendor_string.length)) + return false; + } + else if(block1->vendor_string.entry != block2->vendor_string.entry) + return false; + + if(block1->num_comments != block2->num_comments) + return false; + + for(i = 0; i < block1->num_comments; i++) { + if(0 != block1->comments[i].entry && 0 != block2->comments[i].entry) { + if(0 != memcmp(block1->comments[i].entry, block2->comments[i].entry, block1->comments[i].length)) + return false; + } + else if(block1->comments[i].entry != block2->comments[i].entry) + return false; + } + return true; +} + +static FLAC__bool compare_block_data_cuesheet_(const FLAC__StreamMetadata_CueSheet *block1, const FLAC__StreamMetadata_CueSheet *block2) +{ + unsigned i, j; + + if(0 != strcmp(block1->media_catalog_number, block2->media_catalog_number)) + return false; + + if(block1->lead_in != block2->lead_in) + return false; + + if(block1->is_cd != block2->is_cd) + return false; + + if(block1->num_tracks != block2->num_tracks) + return false; + + if(0 != block1->tracks && 0 != block2->tracks) { + FLAC__ASSERT(block1->num_tracks > 0); + for(i = 0; i < block1->num_tracks; i++) { + if(block1->tracks[i].offset != block2->tracks[i].offset) + return false; + if(block1->tracks[i].number != block2->tracks[i].number) + return false; + if(0 != memcmp(block1->tracks[i].isrc, block2->tracks[i].isrc, sizeof(block1->tracks[i].isrc))) + return false; + if(block1->tracks[i].type != block2->tracks[i].type) + return false; + if(block1->tracks[i].pre_emphasis != block2->tracks[i].pre_emphasis) + return false; + if(block1->tracks[i].num_indices != block2->tracks[i].num_indices) + return false; + if(0 != block1->tracks[i].indices && 0 != block2->tracks[i].indices) { + FLAC__ASSERT(block1->tracks[i].num_indices > 0); + for(j = 0; j < block1->tracks[i].num_indices; j++) { + if(block1->tracks[i].indices[j].offset != block2->tracks[i].indices[j].offset) + return false; + if(block1->tracks[i].indices[j].number != block2->tracks[i].indices[j].number) + return false; + } + } + else if(block1->tracks[i].indices != block2->tracks[i].indices) + return false; + } + } + else if(block1->tracks != block2->tracks) + return false; + return true; +} + +static FLAC__bool compare_block_data_picture_(const FLAC__StreamMetadata_Picture *block1, const FLAC__StreamMetadata_Picture *block2) +{ + if(block1->type != block2->type) + return false; + if(block1->mime_type != block2->mime_type && (0 == block1->mime_type || 0 == block2->mime_type || strcmp(block1->mime_type, block2->mime_type))) + return false; + if(block1->description != block2->description && (0 == block1->description || 0 == block2->description || strcmp((const char *)block1->description, (const char *)block2->description))) + return false; + if(block1->width != block2->width) + return false; + if(block1->height != block2->height) + return false; + if(block1->depth != block2->depth) + return false; + if(block1->colors != block2->colors) + return false; + if(block1->data_length != block2->data_length) + return false; + if(block1->data != block2->data && (0 == block1->data || 0 == block2->data || memcmp(block1->data, block2->data, block1->data_length))) + return false; + return true; +} + +static FLAC__bool compare_block_data_unknown_(const FLAC__StreamMetadata_Unknown *block1, const FLAC__StreamMetadata_Unknown *block2, unsigned block_length) +{ + FLAC__ASSERT(0 != block1); + FLAC__ASSERT(0 != block2); + + if(0 != block1->data && 0 != block2->data) + return 0 == memcmp(block1->data, block2->data, block_length); + else + return block1->data == block2->data; +} + +FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2) +{ + FLAC__ASSERT(0 != block1); + FLAC__ASSERT(0 != block2); + + if(block1->type != block2->type) { + return false; + } + if(block1->is_last != block2->is_last) { + return false; + } + if(block1->length != block2->length) { + return false; + } + switch(block1->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + return compare_block_data_streaminfo_(&block1->data.stream_info, &block2->data.stream_info); + case FLAC__METADATA_TYPE_PADDING: + return true; /* we don't compare the padding guts */ + case FLAC__METADATA_TYPE_APPLICATION: + return compare_block_data_application_(&block1->data.application, &block2->data.application, block1->length); + case FLAC__METADATA_TYPE_SEEKTABLE: + return compare_block_data_seektable_(&block1->data.seek_table, &block2->data.seek_table); + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + return compare_block_data_vorbiscomment_(&block1->data.vorbis_comment, &block2->data.vorbis_comment); + case FLAC__METADATA_TYPE_CUESHEET: + return compare_block_data_cuesheet_(&block1->data.cue_sheet, &block2->data.cue_sheet); + case FLAC__METADATA_TYPE_PICTURE: + return compare_block_data_picture_(&block1->data.picture, &block2->data.picture); + default: + return compare_block_data_unknown_(&block1->data.unknown, &block2->data.unknown, block1->length); + } +} + +FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy) +{ + FLAC__byte *save; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_APPLICATION); + FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); + + save = object->data.application.data; + + /* do the copy first so that if we fail we leave the object untouched */ + if(copy) { + if(!copy_bytes_(&object->data.application.data, data, length)) + return false; + } + else { + object->data.application.data = data; + } + + if(0 != save) + free(save); + + object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8 + length; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + if(0 == object->data.seek_table.points) { + FLAC__ASSERT(object->data.seek_table.num_points == 0); + if(0 == new_num_points) + return true; + else if(0 == (object->data.seek_table.points = seekpoint_array_new_(new_num_points))) + return false; + } + else { + const size_t old_size = object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint); + const size_t new_size = new_num_points * sizeof(FLAC__StreamMetadata_SeekPoint); + + /* overflow check */ + if((size_t)new_num_points > SIZE_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) + return false; + + FLAC__ASSERT(object->data.seek_table.num_points > 0); + + if(new_size == 0) { + free(object->data.seek_table.points); + object->data.seek_table.points = 0; + } + else if(0 == (object->data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*)realloc(object->data.seek_table.points, new_size))) + return false; + + /* if growing, set new elements to placeholders */ + if(new_size > old_size) { + unsigned i; + for(i = object->data.seek_table.num_points; i < new_num_points; i++) { + object->data.seek_table.points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; + object->data.seek_table.points[i].stream_offset = 0; + object->data.seek_table.points[i].frame_samples = 0; + } + } + } + + object->data.seek_table.num_points = new_num_points; + + seektable_calculate_length_(object); + return true; +} + +FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(point_num < object->data.seek_table.num_points); + + object->data.seek_table.points[point_num] = point; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) +{ + int i; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(point_num <= object->data.seek_table.num_points); + + if(!FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points+1)) + return false; + + /* move all points >= point_num forward one space */ + for(i = (int)object->data.seek_table.num_points-1; i > (int)point_num; i--) + object->data.seek_table.points[i] = object->data.seek_table.points[i-1]; + + FLAC__metadata_object_seektable_set_point(object, point_num, point); + seektable_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num) +{ + unsigned i; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(point_num < object->data.seek_table.num_points); + + /* move all points > point_num backward one space */ + for(i = point_num; i < object->data.seek_table.num_points-1; i++) + object->data.seek_table.points[i] = object->data.seek_table.points[i+1]; + + return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points-1); +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + return FLAC__format_seektable_is_legal(&object->data.seek_table); +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + if(num > 0) + /* WATCHOUT: we rely on the fact that growing the array adds PLACEHOLDERS at the end */ + return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points + num); + else + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number) +{ + FLAC__StreamMetadata_SeekTable *seek_table; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + seek_table = &object->data.seek_table; + + if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + 1)) + return false; + + seek_table->points[seek_table->num_points - 1].sample_number = sample_number; + seek_table->points[seek_table->num_points - 1].stream_offset = 0; + seek_table->points[seek_table->num_points - 1].frame_samples = 0; + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(0 != sample_numbers || num == 0); + + if(num > 0) { + FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; + unsigned i, j; + + i = seek_table->num_points; + + if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) + return false; + + for(j = 0; j < num; i++, j++) { + seek_table->points[i].sample_number = sample_numbers[j]; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + } + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(total_samples > 0); + + if(num > 0 && total_samples > 0) { + FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; + unsigned i, j; + + i = seek_table->num_points; + + if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) + return false; + + for(j = 0; j < num; i++, j++) { + seek_table->points[i].sample_number = total_samples * (FLAC__uint64)j / (FLAC__uint64)num; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + } + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + FLAC__ASSERT(samples > 0); + FLAC__ASSERT(total_samples > 0); + + if(samples > 0 && total_samples > 0) { + FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; + unsigned i, j; + FLAC__uint64 num, sample; + + num = 1 + total_samples / samples; /* 1+ for the first sample at 0 */ + /* now account for the fact that we don't place a seekpoint at "total_samples" since samples are number from 0: */ + if(total_samples % samples == 0) + num--; + + i = seek_table->num_points; + + if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + (unsigned)num)) + return false; + + sample = 0; + for(j = 0; j < num; i++, j++, sample += samples) { + seek_table->points[i].sample_number = sample; + seek_table->points[i].stream_offset = 0; + seek_table->points[i].frame_samples = 0; + } + } + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact) +{ + unsigned unique; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); + + unique = FLAC__format_seektable_sort(&object->data.seek_table); + + return !compact || FLAC__metadata_object_seektable_resize_points(object, unique); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) +{ + if(!FLAC__format_vorbiscomment_entry_value_is_legal(entry.entry, entry.length)) + return false; + return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.vendor_string, &entry, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + + if(0 == object->data.vorbis_comment.comments) { + FLAC__ASSERT(object->data.vorbis_comment.num_comments == 0); + if(0 == new_num_comments) + return true; + else if(0 == (object->data.vorbis_comment.comments = vorbiscomment_entry_array_new_(new_num_comments))) + return false; + } + else { + const size_t old_size = object->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); + const size_t new_size = new_num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); + + /* overflow check */ + if((size_t)new_num_comments > SIZE_MAX / sizeof(FLAC__StreamMetadata_VorbisComment_Entry)) + return false; + + FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); + + /* if shrinking, free the truncated entries */ + if(new_num_comments < object->data.vorbis_comment.num_comments) { + unsigned i; + for(i = new_num_comments; i < object->data.vorbis_comment.num_comments; i++) + if(0 != object->data.vorbis_comment.comments[i].entry) + free(object->data.vorbis_comment.comments[i].entry); + } + + if(new_size == 0) { + free(object->data.vorbis_comment.comments); + object->data.vorbis_comment.comments = 0; + } + else if(0 == (object->data.vorbis_comment.comments = (FLAC__StreamMetadata_VorbisComment_Entry*)realloc(object->data.vorbis_comment.comments, new_size))) + return false; + + /* if growing, zero all the length/pointers of new elements */ + if(new_size > old_size) + memset(object->data.vorbis_comment.comments + object->data.vorbis_comment.num_comments, 0, new_size - old_size); + } + + object->data.vorbis_comment.num_comments = new_num_comments; + + vorbiscomment_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); + + if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) + return false; + return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.comments[comment_num], &entry, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) +{ + FLAC__StreamMetadata_VorbisComment *vc; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__ASSERT(comment_num <= object->data.vorbis_comment.num_comments); + + if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) + return false; + + vc = &object->data.vorbis_comment; + + if(!FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments+1)) + return false; + + /* move all comments >= comment_num forward one space */ + memmove(&vc->comments[comment_num+1], &vc->comments[comment_num], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-1-comment_num)); + vc->comments[comment_num].length = 0; + vc->comments[comment_num].entry = 0; + + return FLAC__metadata_object_vorbiscomment_set_comment(object, comment_num, entry, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + return FLAC__metadata_object_vorbiscomment_insert_comment(object, object->data.vorbis_comment.num_comments, entry, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy) +{ + FLAC__ASSERT(0 != entry.entry && entry.length > 0); + + if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) + return false; + + { + int i; + size_t field_name_length; + const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); + + FLAC__ASSERT(0 != eq); + + if(0 == eq) + return false; /* double protection */ + + field_name_length = eq-entry.entry; + + if((i = vorbiscomment_find_entry_from_(object, 0, (const char *)entry.entry, field_name_length)) >= 0) { + unsigned index = (unsigned)i; + if(!FLAC__metadata_object_vorbiscomment_set_comment(object, index, entry, copy)) + return false; + if(all && (index+1 < object->data.vorbis_comment.num_comments)) { + for(i = vorbiscomment_find_entry_from_(object, index+1, (const char *)entry.entry, field_name_length); i >= 0; ) { + if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i)) + return false; + if((unsigned)i < object->data.vorbis_comment.num_comments) + i = vorbiscomment_find_entry_from_(object, (unsigned)i, (const char *)entry.entry, field_name_length); + else + i = -1; + } + } + return true; + } + else + return FLAC__metadata_object_vorbiscomment_append_comment(object, entry, copy); + } +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num) +{ + FLAC__StreamMetadata_VorbisComment *vc; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); + + vc = &object->data.vorbis_comment; + + /* free the comment at comment_num */ + if(0 != vc->comments[comment_num].entry) + free(vc->comments[comment_num].entry); + + /* move all comments > comment_num backward one space */ + memmove(&vc->comments[comment_num], &vc->comments[comment_num+1], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-comment_num-1)); + vc->comments[vc->num_comments-1].length = 0; + vc->comments[vc->num_comments-1].entry = 0; + + return FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments-1); +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value) +{ + FLAC__ASSERT(0 != entry); + FLAC__ASSERT(0 != field_name); + FLAC__ASSERT(0 != field_value); + + if(!FLAC__format_vorbiscomment_entry_name_is_legal(field_name)) + return false; + if(!FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte *)field_value, (unsigned)(-1))) + return false; + + { + const size_t nn = strlen(field_name); + const size_t nv = strlen(field_value); + entry->length = nn + 1 /*=*/ + nv; + if(0 == (entry->entry = (FLAC__byte*)safe_malloc_add_4op_(nn, /*+*/1, /*+*/nv, /*+*/1))) + return false; + memcpy(entry->entry, field_name, nn); + entry->entry[nn] = '='; + memcpy(entry->entry+nn+1, field_value, nv); + entry->entry[entry->length] = '\0'; + } + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value) +{ + FLAC__ASSERT(0 != entry.entry && entry.length > 0); + FLAC__ASSERT(0 != field_name); + FLAC__ASSERT(0 != field_value); + + if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) + return false; + + { + const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); + const size_t nn = eq-entry.entry; + const size_t nv = entry.length-nn-1; /* -1 for the '=' */ + FLAC__ASSERT(0 != eq); + if(0 == eq) + return false; /* double protection */ + if(0 == (*field_name = (char*)safe_malloc_add_2op_(nn, /*+*/1))) + return false; + if(0 == (*field_value = (char*)safe_malloc_add_2op_(nv, /*+*/1))) { + free(*field_name); + return false; + } + memcpy(*field_name, entry.entry, nn); + memcpy(*field_value, entry.entry+nn+1, nv); + (*field_name)[nn] = '\0'; + (*field_value)[nv] = '\0'; + } + + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length) +{ + FLAC__ASSERT(0 != entry.entry && entry.length > 0); + { + const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__ +#define FLAC__STRNCASECMP strnicmp +#else +#define FLAC__STRNCASECMP strncasecmp +#endif + return (0 != eq && (unsigned)(eq-entry.entry) == field_name_length && 0 == FLAC__STRNCASECMP(field_name, (const char *)entry.entry, field_name_length)); +#undef FLAC__STRNCASECMP + } +} + +FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name) +{ + FLAC__ASSERT(0 != field_name); + + return vorbiscomment_find_entry_from_(object, offset, field_name, strlen(field_name)); +} + +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name) +{ + const unsigned field_name_length = strlen(field_name); + unsigned i; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + + for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { + if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { + if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, i)) + return -1; + else + return 1; + } + } + + return 0; +} + +FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name) +{ + FLAC__bool ok = true; + unsigned matching = 0; + const unsigned field_name_length = strlen(field_name); + int i; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); + + /* must delete from end to start otherwise it will interfere with our iteration */ + for(i = (int)object->data.vorbis_comment.num_comments - 1; ok && i >= 0; i--) { + if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { + matching++; + ok &= FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i); + } + } + + return ok? (int)matching : -1; +} + +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void) +{ + return (FLAC__StreamMetadata_CueSheet_Track*)calloc(1, sizeof(FLAC__StreamMetadata_CueSheet_Track)); +} + +FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object) +{ + FLAC__StreamMetadata_CueSheet_Track *to; + + FLAC__ASSERT(0 != object); + + if(0 != (to = FLAC__metadata_object_cuesheet_track_new())) { + if(!copy_track_(to, object)) { + FLAC__metadata_object_cuesheet_track_delete(to); + return 0; + } + } + + return to; +} + +void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object) +{ + FLAC__ASSERT(0 != object); + + if(0 != object->indices) { + FLAC__ASSERT(object->num_indices > 0); + free(object->indices); + } +} + +FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object) +{ + FLAC__metadata_object_cuesheet_track_delete_data(object); + free(object); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices) +{ + FLAC__StreamMetadata_CueSheet_Track *track; + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); + + track = &object->data.cue_sheet.tracks[track_num]; + + if(0 == track->indices) { + FLAC__ASSERT(track->num_indices == 0); + if(0 == new_num_indices) + return true; + else if(0 == (track->indices = cuesheet_track_index_array_new_(new_num_indices))) + return false; + } + else { + const size_t old_size = track->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); + const size_t new_size = new_num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); + + /* overflow check */ + if((size_t)new_num_indices > SIZE_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Index)) + return false; + + FLAC__ASSERT(track->num_indices > 0); + + if(new_size == 0) { + free(track->indices); + track->indices = 0; + } + else if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)realloc(track->indices, new_size))) + return false; + + /* if growing, zero all the lengths/pointers of new elements */ + if(new_size > old_size) + memset(track->indices + track->num_indices, 0, new_size - old_size); + } + + track->num_indices = new_num_indices; + + cuesheet_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index) +{ + FLAC__StreamMetadata_CueSheet_Track *track; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); + FLAC__ASSERT(index_num <= object->data.cue_sheet.tracks[track_num].num_indices); + + track = &object->data.cue_sheet.tracks[track_num]; + + if(!FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices+1)) + return false; + + /* move all indices >= index_num forward one space */ + memmove(&track->indices[index_num+1], &track->indices[index_num], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-1-index_num)); + + track->indices[index_num] = index; + cuesheet_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) +{ + FLAC__StreamMetadata_CueSheet_Index index; + memset(&index, 0, sizeof(index)); + return FLAC__metadata_object_cuesheet_track_insert_index(object, track_num, index_num, index); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) +{ + FLAC__StreamMetadata_CueSheet_Track *track; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); + FLAC__ASSERT(index_num < object->data.cue_sheet.tracks[track_num].num_indices); + + track = &object->data.cue_sheet.tracks[track_num]; + + /* move all indices > index_num backward one space */ + memmove(&track->indices[index_num], &track->indices[index_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-index_num-1)); + + FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices-1); + cuesheet_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + + if(0 == object->data.cue_sheet.tracks) { + FLAC__ASSERT(object->data.cue_sheet.num_tracks == 0); + if(0 == new_num_tracks) + return true; + else if(0 == (object->data.cue_sheet.tracks = cuesheet_track_array_new_(new_num_tracks))) + return false; + } + else { + const size_t old_size = object->data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); + const size_t new_size = new_num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); + + /* overflow check */ + if((size_t)new_num_tracks > SIZE_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Track)) + return false; + + FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); + + /* if shrinking, free the truncated entries */ + if(new_num_tracks < object->data.cue_sheet.num_tracks) { + unsigned i; + for(i = new_num_tracks; i < object->data.cue_sheet.num_tracks; i++) + if(0 != object->data.cue_sheet.tracks[i].indices) + free(object->data.cue_sheet.tracks[i].indices); + } + + if(new_size == 0) { + free(object->data.cue_sheet.tracks); + object->data.cue_sheet.tracks = 0; + } + else if(0 == (object->data.cue_sheet.tracks = (FLAC__StreamMetadata_CueSheet_Track*)realloc(object->data.cue_sheet.tracks, new_size))) + return false; + + /* if growing, zero all the lengths/pointers of new elements */ + if(new_size > old_size) + memset(object->data.cue_sheet.tracks + object->data.cue_sheet.num_tracks, 0, new_size - old_size); + } + + object->data.cue_sheet.num_tracks = new_num_tracks; + + cuesheet_calculate_length_(object); + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); + + return cuesheet_set_track_(object, object->data.cue_sheet.tracks + track_num, track, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) +{ + FLAC__StreamMetadata_CueSheet *cs; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT(track_num <= object->data.cue_sheet.num_tracks); + + cs = &object->data.cue_sheet; + + if(!FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks+1)) + return false; + + /* move all tracks >= track_num forward one space */ + memmove(&cs->tracks[track_num+1], &cs->tracks[track_num], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-1-track_num)); + cs->tracks[track_num].num_indices = 0; + cs->tracks[track_num].indices = 0; + + return FLAC__metadata_object_cuesheet_set_track(object, track_num, track, copy); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num) +{ + FLAC__StreamMetadata_CueSheet_Track track; + memset(&track, 0, sizeof(track)); + return FLAC__metadata_object_cuesheet_insert_track(object, track_num, &track, /*copy=*/false); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num) +{ + FLAC__StreamMetadata_CueSheet *cs; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); + + cs = &object->data.cue_sheet; + + /* free the track at track_num */ + if(0 != cs->tracks[track_num].indices) + free(cs->tracks[track_num].indices); + + /* move all tracks > track_num backward one space */ + memmove(&cs->tracks[track_num], &cs->tracks[track_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-track_num-1)); + cs->tracks[cs->num_tracks-1].num_indices = 0; + cs->tracks[cs->num_tracks-1].indices = 0; + + return FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks-1); +} + +FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + + return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation); +} + +static FLAC__uint64 get_index_01_offset_(const FLAC__StreamMetadata_CueSheet *cs, unsigned track) +{ + if (track >= (cs->num_tracks-1) || cs->tracks[track].num_indices < 1) + return 0; + else if (cs->tracks[track].indices[0].number == 1) + return cs->tracks[track].indices[0].offset + cs->tracks[track].offset + cs->lead_in; + else if (cs->tracks[track].num_indices < 2) + return 0; + else if (cs->tracks[track].indices[1].number == 1) + return cs->tracks[track].indices[1].offset + cs->tracks[track].offset + cs->lead_in; + else + return 0; +} + +static FLAC__uint32 cddb_add_digits_(FLAC__uint32 x) +{ + FLAC__uint32 n = 0; + while (x) { + n += (x%10); + x /= 10; + } + return n; +} + +/*@@@@add to tests*/ +FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object) +{ + const FLAC__StreamMetadata_CueSheet *cs; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); + + cs = &object->data.cue_sheet; + + if (cs->num_tracks < 2) /* need at least one real track and the lead-out track */ + return 0; + + { + FLAC__uint32 i, length, sum = 0; + for (i = 0; i < (cs->num_tracks-1); i++) /* -1 to avoid counting the lead-out */ + sum += cddb_add_digits_((FLAC__uint32)(get_index_01_offset_(cs, i) / 44100)); + length = (FLAC__uint32)((cs->tracks[cs->num_tracks-1].offset+cs->lead_in) / 44100) - (FLAC__uint32)(get_index_01_offset_(cs, 0) / 44100); + + return (sum % 0xFF) << 24 | length << 8 | (FLAC__uint32)(cs->num_tracks-1); + } +} + +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy) +{ + char *old; + size_t old_length, new_length; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); + FLAC__ASSERT(0 != mime_type); + + old = object->data.picture.mime_type; + old_length = old? strlen(old) : 0; + new_length = strlen(mime_type); + + /* do the copy first so that if we fail we leave the object untouched */ + if(copy) { + if(new_length >= SIZE_MAX) /* overflow check */ + return false; + if(!copy_bytes_((FLAC__byte**)(&object->data.picture.mime_type), (FLAC__byte*)mime_type, new_length+1)) + return false; + } + else { + object->data.picture.mime_type = mime_type; + } + + if(0 != old) + free(old); + + object->length -= old_length; + object->length += new_length; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy) +{ + FLAC__byte *old; + size_t old_length, new_length; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); + FLAC__ASSERT(0 != description); + + old = object->data.picture.description; + old_length = old? strlen((const char *)old) : 0; + new_length = strlen((const char *)description); + + /* do the copy first so that if we fail we leave the object untouched */ + if(copy) { + if(new_length >= SIZE_MAX) /* overflow check */ + return false; + if(!copy_bytes_(&object->data.picture.description, description, new_length+1)) + return false; + } + else { + object->data.picture.description = description; + } + + if(0 != old) + free(old); + + object->length -= old_length; + object->length += new_length; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy) +{ + FLAC__byte *old; + + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); + FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); + + old = object->data.picture.data; + + /* do the copy first so that if we fail we leave the object untouched */ + if(copy) { + if(!copy_bytes_(&object->data.picture.data, data, length)) + return false; + } + else { + object->data.picture.data = data; + } + + if(0 != old) + free(old); + + object->length -= object->data.picture.data_length; + object->data.picture.data_length = length; + object->length += length; + return true; +} + +FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation) +{ + FLAC__ASSERT(0 != object); + FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); + + return FLAC__format_picture_is_legal(&object->data.picture, violation); +} diff -Nru mame-0.144/src/lib/libflac/libflac/stream_decoder.c mame-0.145/src/lib/libflac/libflac/stream_decoder.c --- mame-0.144/src/lib/libflac/libflac/stream_decoder.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/stream_decoder.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,3380 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for malloc() */ +#include /* for memset/memcpy() */ +#include /* for stat() */ +#include /* for off_t */ +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#if _MSC_VER <= 1600 || defined __BORLANDC__ /* @@@ [2G limit] */ +#define fseeko fseek +#define ftello ftell +#endif +#endif +#include "flac/assert.h" +#include "share/alloc.h" +#include "protected/stream_decoder.h" +#include "private/bitreader.h" +#include "private/bitmath.h" +#include "private/cpu.h" +#include "private/crc.h" +#include "private/fixed.h" +#include "private/format.h" +#include "private/lpc.h" +#include "private/md5.h" +#include "private/memory.h" + +#ifdef max +#undef max +#endif +#define max(a,b) ((a)>(b)?(a):(b)) + +/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ +#ifdef _MSC_VER +#define FLAC__U64L(x) x +#else +#define FLAC__U64L(x) x##LLU +#endif + + +/* technically this should be in an "export.c" but this is convenient enough */ +FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = +#if FLAC__HAS_OGG + 1 +#else + 0 +#endif +; + + +/*********************************************************************** + * + * Private static data + * + ***********************************************************************/ + +static FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; + +/*********************************************************************** + * + * Private class method prototypes + * + ***********************************************************************/ + +static void set_defaults_(FLAC__StreamDecoder *decoder); +static FILE *get_binary_stdin_(void); +static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels); +static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id); +static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); +static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj); +static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); +static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); +static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); +static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode); +static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); +static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); +static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended); +static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder); +static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data); +#if FLAC__HAS_OGG +static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); +static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +#endif +static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); +static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status); +static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#if FLAC__HAS_OGG +static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); +#endif +static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); +static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); + +/*********************************************************************** + * + * Private class data + * + ***********************************************************************/ + +typedef struct FLAC__StreamDecoderPrivate { +#if FLAC__HAS_OGG + FLAC__bool is_ogg; +#endif + FLAC__StreamDecoderReadCallback read_callback; + FLAC__StreamDecoderSeekCallback seek_callback; + FLAC__StreamDecoderTellCallback tell_callback; + FLAC__StreamDecoderLengthCallback length_callback; + FLAC__StreamDecoderEofCallback eof_callback; + FLAC__StreamDecoderWriteCallback write_callback; + FLAC__StreamDecoderMetadataCallback metadata_callback; + FLAC__StreamDecoderErrorCallback error_callback; + /* generic 32-bit datapath: */ + void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* generic 64-bit datapath: */ + void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ + void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit), AND order <= 8: */ + void (*local_lpc_restore_signal_16bit_order8)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); + FLAC__bool (*local_bitreader_read_rice_signed_block)(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); + void *client_data; + FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ + FLAC__BitReader *input; + FLAC__int32 *output[FLAC__MAX_CHANNELS]; + FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; + unsigned output_capacity, output_channels; + FLAC__uint32 fixed_block_size, next_fixed_block_size; + FLAC__uint64 samples_decoded; + FLAC__bool has_stream_info, has_seek_table; + FLAC__StreamMetadata stream_info; + FLAC__StreamMetadata seek_table; + FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ + FLAC__byte *metadata_filter_ids; + size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ + FLAC__Frame frame; + FLAC__bool cached; /* true if there is a byte in lookahead */ + FLAC__CPUInfo cpuinfo; + FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ + FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; + FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ + FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ + FLAC__bool is_seeking; + FLAC__MD5Context md5context; + FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ + /* (the rest of these are only used for seeking) */ + FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ + FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ + FLAC__uint64 target_sample; + unsigned unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ +#if FLAC__HAS_OGG + FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ +#endif +} FLAC__StreamDecoderPrivate; + +/*********************************************************************** + * + * Public static class data + * + ***********************************************************************/ + +FLAC_API const char * const FLAC__StreamDecoderStateString[] = { + "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", + "FLAC__STREAM_DECODER_READ_METADATA", + "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", + "FLAC__STREAM_DECODER_READ_FRAME", + "FLAC__STREAM_DECODER_END_OF_STREAM", + "FLAC__STREAM_DECODER_OGG_ERROR", + "FLAC__STREAM_DECODER_SEEK_ERROR", + "FLAC__STREAM_DECODER_ABORTED", + "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_UNINITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { + "FLAC__STREAM_DECODER_INIT_STATUS_OK", + "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", + "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", + "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", + "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", + "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" +}; + +FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { + "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", + "FLAC__STREAM_DECODER_READ_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { + "FLAC__STREAM_DECODER_SEEK_STATUS_OK", + "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", + "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { + "FLAC__STREAM_DECODER_TELL_STATUS_OK", + "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", + "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { + "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", + "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", + "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { + "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", + "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" +}; + +FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { + "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", + "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", + "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", + "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" +}; + +/*********************************************************************** + * + * Class constructor/destructor + * + ***********************************************************************/ +FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) +{ + FLAC__StreamDecoder *decoder; + unsigned i; + + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + + decoder = (FLAC__StreamDecoder*)calloc(1, sizeof(FLAC__StreamDecoder)); + if(decoder == 0) { + return 0; + } + + decoder->protected_ = (FLAC__StreamDecoderProtected*)calloc(1, sizeof(FLAC__StreamDecoderProtected)); + if(decoder->protected_ == 0) { + free(decoder); + return 0; + } + + decoder->private_ = (FLAC__StreamDecoderPrivate*)calloc(1, sizeof(FLAC__StreamDecoderPrivate)); + if(decoder->private_ == 0) { + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->input = FLAC__bitreader_new(); + if(decoder->private_->input == 0) { + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + decoder->private_->metadata_filter_ids_capacity = 16; + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*)malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { + FLAC__bitreader_delete(decoder->private_->input); + free(decoder->private_); + free(decoder->protected_); + free(decoder); + return 0; + } + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + decoder->private_->output[i] = 0; + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + decoder->private_->has_seek_table = false; + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); + + decoder->private_->file = 0; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return decoder; +} + +FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) +{ + unsigned i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->private_->input); + + (void)FLAC__stream_decoder_finish(decoder); + + if(0 != decoder->private_->metadata_filter_ids) + free(decoder->private_->metadata_filter_ids); + + FLAC__bitreader_delete(decoder->private_->input); + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); + + free(decoder->private_); + free(decoder->protected_); + free(decoder); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +static FLAC__StreamDecoderInitStatus init_stream_internal_( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + +#if !FLAC__HAS_OGG + if(is_ogg) + return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; +#endif + + if( + 0 == read_callback || + 0 == write_callback || + 0 == error_callback || + (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) + ) + return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + +#if FLAC__HAS_OGG + decoder->private_->is_ogg = is_ogg; + if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) + return decoder->protected_->state = FLAC__STREAM_DECODER_OGG_ERROR; +#endif + + /* + * get the CPU info and set the function pointers + */ + FLAC__cpu_info(&decoder->private_->cpuinfo); + /* first default to the non-asm routines */ + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal; + decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block; + /* now override with asm where appropriate */ +#ifndef FLAC__NO_ASM + if(decoder->private_->cpuinfo.use_asm) { +#ifdef FLAC__CPU_IA32 + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); +#ifdef FLAC__HAS_NASM +#if 1 /*@@@@@@ OPT: not clearly faster, needs more testing */ + if(decoder->private_->cpuinfo.data.ia32.bswap) + decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap; +#endif + if(decoder->private_->cpuinfo.data.ia32.mmx) { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32_mmx; + } + else { + decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32; + } +#endif +#elif defined FLAC__CPU_PPC + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_PPC); + if(decoder->private_->cpuinfo.data.ppc.altivec) { + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ppc_altivec_16; + decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8; + } +#endif + } +#endif + + /* from here on, errors are fatal */ + + if(!FLAC__bitreader_init(decoder->private_->input, decoder->private_->cpuinfo, read_callback_, decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + decoder->private_->read_callback = read_callback; + decoder->private_->seek_callback = seek_callback; + decoder->private_->tell_callback = tell_callback; + decoder->private_->length_callback = length_callback; + decoder->private_->eof_callback = eof_callback; + decoder->private_->write_callback = write_callback; + decoder->private_->metadata_callback = metadata_callback; + decoder->private_->error_callback = error_callback; + decoder->private_->client_data = client_data; + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + decoder->private_->samples_decoded = 0; + decoder->private_->has_stream_info = false; + decoder->private_->cached = false; + + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + decoder->private_->is_seeking = false; + + decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ + if(!FLAC__stream_decoder_reset(decoder)) { + /* above call sets the state for us */ + return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; + } + + return FLAC__STREAM_DECODER_INIT_STATUS_OK; +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/false + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( + FLAC__StreamDecoder *decoder, + FLAC__StreamDecoderReadCallback read_callback, + FLAC__StreamDecoderSeekCallback seek_callback, + FLAC__StreamDecoderTellCallback tell_callback, + FLAC__StreamDecoderLengthCallback length_callback, + FLAC__StreamDecoderEofCallback eof_callback, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_stream_internal_( + decoder, + read_callback, + seek_callback, + tell_callback, + length_callback, + eof_callback, + write_callback, + metadata_callback, + error_callback, + client_data, + /*is_ogg=*/true + ); +} + +static FLAC__StreamDecoderInitStatus init_FILE_internal_( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != file); + + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return decoder->protected_->state = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + + if(0 == write_callback || 0 == error_callback) + return decoder->protected_->state = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + + /* + * To make sure that our file does not go unclosed after an error, we + * must assign the FILE pointer before any further error can occur in + * this routine. + */ + if(file == stdin) + file = get_binary_stdin_(); /* just to be safe */ + + decoder->private_->file = file; + + return init_stream_internal_( + decoder, + file_read_callback_, + decoder->private_->file == stdin? 0: file_seek_callback_, + decoder->private_->file == stdin? 0: file_tell_callback_, + decoder->private_->file == stdin? 0: file_length_callback_, + file_eof_callback_, + write_callback, + metadata_callback, + error_callback, + client_data, + is_ogg + ); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( + FLAC__StreamDecoder *decoder, + FILE *file, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} + +static FLAC__StreamDecoderInitStatus init_file_internal_( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FILE *file; + + FLAC__ASSERT(0 != decoder); + + /* + * To make sure that our file does not go unclosed after an error, we + * have to do the same entrance checks here that are later performed + * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. + */ + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return decoder->protected_->state = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; + + if(0 == write_callback || 0 == error_callback) + return decoder->protected_->state = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; + + file = filename? fopen(filename, "rb") : stdin; + + if(0 == file) + return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; + + return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( + FLAC__StreamDecoder *decoder, + const char *filename, + FLAC__StreamDecoderWriteCallback write_callback, + FLAC__StreamDecoderMetadataCallback metadata_callback, + FLAC__StreamDecoderErrorCallback error_callback, + void *client_data +) +{ + return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); +} + +FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) +{ + FLAC__bool md5_failed = false; + unsigned i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) + return true; + + /* see the comment in FLAC__seekable_stream_decoder_reset() as to why we + * always call FLAC__MD5Final() + */ + FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); + + if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + } + FLAC__bitreader_free(decoder->private_->input); + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + decoder->private_->output_capacity = 0; + decoder->private_->output_channels = 0; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(0 != decoder->private_->file) { + if(decoder->private_->file != stdin) + fclose(decoder->private_->file); + decoder->private_->file = 0; + } + + if(decoder->private_->do_md5_checking) { + if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) + md5_failed = true; + } + decoder->private_->is_seeking = false; + + set_defaults_(decoder); + + decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; + + return !md5_failed; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; +#if FLAC__HAS_OGG + /* can't check decoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); + return true; +#else + (void)value; + return false; +#endif +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->protected_->md5_checking = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = true; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*)safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) +{ + unsigned i; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) + decoder->private_->metadata_filter[i] = true; + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); + /* double protection */ + if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) + return false; + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + decoder->private_->metadata_filter[type] = false; + if(type == FLAC__METADATA_TYPE_APPLICATION) + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + FLAC__ASSERT(0 != id); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + + if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) + return true; + + FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); + + if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { + if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*)safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->private_->metadata_filter_ids_capacity *= 2; + } + + memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); + decoder->private_->metadata_filter_ids_count++; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) + return false; + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter_ids_count = 0; + return true; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->state; +} + +FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) +{ + return FLAC__StreamDecoderStateString[decoder->protected_->state]; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->md5_checking; +} + +FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; +} + +FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channels; +} + +FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->channel_assignment; +} + +FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->bits_per_sample; +} + +FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->sample_rate; +} + +FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + return decoder->protected_->blocksize; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != position); + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + return false; +#endif + if(0 == decoder->private_->tell_callback) + return false; + if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) + return false; + /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) + return false; + FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); + *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + decoder->private_->samples_decoded = 0; + decoder->private_->do_md5_checking = false; + +#if FLAC__HAS_OGG + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); +#endif + + if(!FLAC__bitreader_clear(decoder->private_->input)) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + FLAC__ASSERT(0 != decoder->protected_); + + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + +#if FLAC__HAS_OGG + /*@@@ could go in !internal_reset_hack block below */ + if(decoder->private_->is_ogg) + FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); +#endif + + /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, + * (internal_reset_hack) don't try to rewind since we are already at + * the beginning of the stream and don't want to fail if the input is + * not seekable. + */ + if(!decoder->private_->internal_reset_hack) { + if(decoder->private_->file == stdin) + return false; /* can't rewind stdin, reset fails */ + if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) + return false; /* seekable and seek fails, reset fails */ + } + else + decoder->private_->internal_reset_hack = false; + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; + + decoder->private_->has_stream_info = false; + if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { + free(decoder->private_->seek_table.data.seek_table.points); + decoder->private_->seek_table.data.seek_table.points = 0; + decoder->private_->has_seek_table = false; + } + decoder->private_->do_md5_checking = decoder->protected_->md5_checking; + /* + * This goes in reset() and not flush() because according to the spec, a + * fixed-blocksize stream must stay that way through the whole stream. + */ + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; + + /* We initialize the FLAC__MD5Context even though we may never use it. This + * is because md5 checking may be turned on to start and then turned off if + * a seek occurs. So we init the context here and finalize it in + * FLAC__stream_decoder_finish() to make sure things are always cleaned up + * properly. + */ + FLAC__MD5Init(&decoder->private_->md5context); + + decoder->private_->first_frame_offset = 0; + decoder->private_->unparseable_frame_count = 0; + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + else + return true; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + case FLAC__STREAM_DECODER_READ_FRAME: + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) +{ + FLAC__bool dummy; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + if(!find_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_METADATA: + if(!read_metadata_(decoder)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) + return false; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) +{ + FLAC__bool got_a_frame; + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->protected_); + + while(1) { + switch(decoder->protected_->state) { + case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: + case FLAC__STREAM_DECODER_READ_METADATA: + return false; /* above function sets the status for us */ + case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: + if(!frame_sync_(decoder)) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_READ_FRAME: + if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) + return false; /* above function sets the status for us */ + if(got_a_frame) + return true; /* above function sets the status for us */ + break; + case FLAC__STREAM_DECODER_END_OF_STREAM: + case FLAC__STREAM_DECODER_ABORTED: + return true; + default: + FLAC__ASSERT(0); + return false; + } + } +} + +FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) +{ + FLAC__uint64 length; + + FLAC__ASSERT(0 != decoder); + + if( + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && + decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && + decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && + decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM + ) + return false; + + if(0 == decoder->private_->seek_callback) + return false; + + FLAC__ASSERT(decoder->private_->seek_callback); + FLAC__ASSERT(decoder->private_->tell_callback); + FLAC__ASSERT(decoder->private_->length_callback); + FLAC__ASSERT(decoder->private_->eof_callback); + + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) + return false; + + decoder->private_->is_seeking = true; + + /* turn off md5 checking if a seek is attempted */ + decoder->private_->do_md5_checking = false; + + /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ + if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { + decoder->private_->is_seeking = false; + return false; + } + + /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ + if( + decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || + decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA + ) { + if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { + /* above call sets the state for us */ + decoder->private_->is_seeking = false; + return false; + } + /* check this again in case we didn't know total_samples the first time */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->private_->is_seeking = false; + return false; + } + } + + { + const FLAC__bool ok = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + seek_to_absolute_sample_ogg_(decoder, length, sample) : +#endif + seek_to_absolute_sample_(decoder, length, sample) + ; + decoder->private_->is_seeking = false; + return ok; + } +} + +/*********************************************************************** + * + * Protected class methods + * + ***********************************************************************/ + +unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) +{ + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); + return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; +} + +/*********************************************************************** + * + * Private class methods + * + ***********************************************************************/ + +void set_defaults_(FLAC__StreamDecoder *decoder) +{ +#if FLAC__HAS_OGG + decoder->private_->is_ogg = false; +#endif + decoder->private_->read_callback = 0; + decoder->private_->seek_callback = 0; + decoder->private_->tell_callback = 0; + decoder->private_->length_callback = 0; + decoder->private_->eof_callback = 0; + decoder->private_->write_callback = 0; + decoder->private_->metadata_callback = 0; + decoder->private_->error_callback = 0; + decoder->private_->client_data = 0; + + memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); + decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; + decoder->private_->metadata_filter_ids_count = 0; + + decoder->protected_->md5_checking = false; + +#if FLAC__HAS_OGG + FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); +#endif +} + +/* + * This will forcibly set stdin to binary mode (for OSes that require it) + */ +FILE *get_binary_stdin_(void) +{ + #if 0 + /* if something breaks here it is probably due to the presence or + * absence of an underscore before the identifiers 'setmode', + * 'fileno', and/or 'O_BINARY'; check your system header files. + */ +#if defined _MSC_VER || defined __MINGW32__ + _setmode(_fileno(stdin), _O_BINARY); +#elif defined __CYGWIN__ + /* almost certainly not needed for any modern Cygwin, but let's be safe... */ + setmode(_fileno(stdin), _O_BINARY); +#elif defined __EMX__ + setmode(fileno(stdin), O_BINARY); +#endif + #endif + return stdin; +} + +FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels) +{ + unsigned i; + FLAC__int32 *tmp; + + if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) + return true; + + /* simply using realloc() is not practical because the number of channels may change mid-stream */ + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + if(0 != decoder->private_->output[i]) { + free(decoder->private_->output[i]-4); + decoder->private_->output[i] = 0; + } + if(0 != decoder->private_->residual_unaligned[i]) { + free(decoder->private_->residual_unaligned[i]); + decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; + } + } + + for(i = 0; i < channels; i++) { + /* WATCHOUT: + * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the + * output arrays have a buffer of up to 3 zeroes in front + * (at negative indices) for alignment purposes; we use 4 + * to keep the data well-aligned. + */ + tmp = (FLAC__int32*)safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); + if(tmp == 0) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + memset(tmp, 0, sizeof(FLAC__int32)*4); + decoder->private_->output[i] = tmp + 4; + + /* WATCHOUT: + * minimum of quadword alignment for PPC vector optimizations is REQUIRED: + */ + if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + } + + decoder->private_->output_capacity = size; + decoder->private_->output_channels = channels; + + return true; +} + +FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) +{ + size_t i; + + FLAC__ASSERT(0 != decoder); + FLAC__ASSERT(0 != decoder->private_); + + for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) + if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) + return true; + + return false; +} + +FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, id; + FLAC__bool first = true; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + for(i = id = 0; i < 4; ) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == FLAC__STREAM_SYNC_STRING[i]) { + first = true; + i++; + id = 0; + continue; + } + if(x == ID3V2_TAG_[id]) { + id++; + i = 0; + if(id == 3) { + if(!skip_id3v2_tag_(decoder)) + return false; /* skip_id3v2_tag_ sets the state for us */ + } + continue; + } + id = 0; + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 2 == 0x3e) { /* MAGIC NUMBER for the last 6 sync bits */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + i = 0; + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; + return true; +} + +FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) +{ + FLAC__bool is_last; + FLAC__uint32 i, x, type, length; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) + return false; /* read_callback_ sets the state for us */ + is_last = x? true : false; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(type == FLAC__METADATA_TYPE_STREAMINFO) { + if(!read_metadata_streaminfo_(decoder, is_last, length)) + return false; + + decoder->private_->has_stream_info = true; + if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) + decoder->private_->do_md5_checking = false; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); + } + else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { + if(!read_metadata_seektable_(decoder, is_last, length)) + return false; + + decoder->private_->has_seek_table = true; + if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); + } + else { + FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; + unsigned real_length = length; + FLAC__StreamMetadata block; + + block.is_last = is_last; + block.type = (FLAC__MetadataType)type; + block.length = length; + + if(type == FLAC__METADATA_TYPE_APPLICATION) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ + return false; + } + + real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; + + if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) + skip_it = !skip_it; + } + + if(skip_it) { + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else { + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + /* skip the padding bytes */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) + return false; /* read_callback_ sets the state for us */ + break; + case FLAC__METADATA_TYPE_APPLICATION: + /* remember, we read the ID already */ + if(real_length > 0) { + if(0 == (block.data.application.data = (FLAC__byte*)malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else + block.data.application.data = 0; + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment)) + return false; + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) + return false; + break; + case FLAC__METADATA_TYPE_PICTURE: + if(!read_metadata_picture_(decoder, &block.data.picture)) + return false; + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + break; + default: + if(real_length > 0) { + if(0 == (block.data.unknown.data = (FLAC__byte*)malloc(real_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) + return false; /* read_callback_ sets the state for us */ + } + else + block.data.unknown.data = 0; + break; + } + if(!decoder->private_->is_seeking && decoder->private_->metadata_callback) + decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); + + /* now we have to free any malloc()ed data in the block */ + switch(type) { + case FLAC__METADATA_TYPE_PADDING: + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(0 != block.data.application.data) + free(block.data.application.data); + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(0 != block.data.vorbis_comment.vendor_string.entry) + free(block.data.vorbis_comment.vendor_string.entry); + if(block.data.vorbis_comment.num_comments > 0) + for(i = 0; i < block.data.vorbis_comment.num_comments; i++) + if(0 != block.data.vorbis_comment.comments[i].entry) + free(block.data.vorbis_comment.comments[i].entry); + if(0 != block.data.vorbis_comment.comments) + free(block.data.vorbis_comment.comments); + break; + case FLAC__METADATA_TYPE_CUESHEET: + if(block.data.cue_sheet.num_tracks > 0) + for(i = 0; i < block.data.cue_sheet.num_tracks; i++) + if(0 != block.data.cue_sheet.tracks[i].indices) + free(block.data.cue_sheet.tracks[i].indices); + if(0 != block.data.cue_sheet.tracks) + free(block.data.cue_sheet.tracks); + break; + case FLAC__METADATA_TYPE_PICTURE: + if(0 != block.data.picture.mime_type) + free(block.data.picture.mime_type); + if(0 != block.data.picture.description) + free(block.data.picture.description); + if(0 != block.data.picture.data) + free(block.data.picture.data); + break; + case FLAC__METADATA_TYPE_STREAMINFO: + case FLAC__METADATA_TYPE_SEEKTABLE: + FLAC__ASSERT(0); + default: + if(0 != block.data.unknown.data) + free(block.data.unknown.data); + break; + } + } + } + + if(is_last) { + /* if this fails, it's OK, it's just a hint for the seek routine */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) + decoder->private_->first_frame_offset = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + + return true; +} + +FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 x; + unsigned bits, used_bits = 0; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; + decoder->private_->stream_info.is_last = is_last; + decoder->private_->stream_info.length = length; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_blocksize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.min_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.max_framesize = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.sample_rate = x; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.channels = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; + used_bits += bits; + + bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + used_bits += bits; + + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) + return false; /* read_callback_ sets the state for us */ + used_bits += 16*8; + + /* skip the rest of the block */ + FLAC__ASSERT(used_bits % 8 == 0); + length -= (used_bits / 8); + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + + return true; +} + +FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) +{ + FLAC__uint32 i, x; + FLAC__uint64 xx; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; + decoder->private_->seek_table.is_last = is_last; + decoder->private_->seek_table.length = length; + + decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; + + /* use realloc since we may pass through here several times (e.g. after seeking) */ + if(0 == (decoder->private_->seek_table.data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*)safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; + } + length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); + /* if there is a partial point left, skip over it */ + if(length > 0) { + /*@@@ do a send_error_to_client_() here? there's an argument for either way */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj) +{ + FLAC__uint32 i; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read vendor string */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + if(obj->vendor_string.length > 0) { + if(0 == (obj->vendor_string.entry = (FLAC__byte*)safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) + return false; /* read_callback_ sets the state for us */ + obj->vendor_string.entry[obj->vendor_string.length] = '\0'; + } + else + obj->vendor_string.entry = 0; + + /* read num comments */ + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) + return false; /* read_callback_ sets the state for us */ + + /* read comments */ + if(obj->num_comments > 0) { + if(0 == (obj->comments = (FLAC__StreamMetadata_VorbisComment_Entry*)safe_malloc_mul_2op_(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < obj->num_comments; i++) { + FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); + if(!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) + return false; /* read_callback_ sets the state for us */ + if(obj->comments[i].length > 0) { + if(0 == (obj->comments[i].entry = (FLAC__byte*)safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) + return false; /* read_callback_ sets the state for us */ + obj->comments[i].entry[obj->comments[i].length] = '\0'; + } + else + obj->comments[i].entry = 0; + } + } + else { + obj->comments = 0; + } + + return true; +} + +FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) +{ + FLAC__uint32 i, j, x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->is_cd = x? true : false; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->num_tracks = x; + + if(obj->num_tracks > 0) { + if(0 == (obj->tracks = (FLAC__StreamMetadata_CueSheet_Track*)safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(i = 0; i < obj->num_tracks; i++) { + FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + track->number = (FLAC__byte)x; + + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + track->type = x; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) + return false; /* read_callback_ sets the state for us */ + track->pre_emphasis = x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) + return false; /* read_callback_ sets the state for us */ + track->num_indices = (FLAC__byte)x; + + if(track->num_indices > 0) { + if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + for(j = 0; j < track->num_indices; j++) { + FLAC__StreamMetadata_CueSheet_Index *index = &track->indices[j]; + if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &index->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) + return false; /* read_callback_ sets the state for us */ + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) + return false; /* read_callback_ sets the state for us */ + index->number = (FLAC__byte)x; + + if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) + return false; /* read_callback_ sets the state for us */ + } + } + } + } + + return true; +} + +FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) +{ + FLAC__uint32 x; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* read type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + obj->type = x; + + /* read MIME type */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->mime_type = (char*)safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->mime_type[x] = '\0'; + + /* read description */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->description = (FLAC__byte*)safe_malloc_add_2op_(x, /*+*/1))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(x > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) + return false; /* read_callback_ sets the state for us */ + } + obj->description[x] = '\0'; + + /* read width */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read height */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read depth */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read colors */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) + return false; /* read_callback_ sets the state for us */ + + /* read data */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) + return false; /* read_callback_ sets the state for us */ + if(0 == (obj->data = (FLAC__byte*)safe_malloc_(obj->data_length))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + if(obj->data_length > 0) { + if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) + return false; /* read_callback_ sets the state for us */ + } + + return true; +} + +FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + unsigned i, skip; + + /* skip the version and flags bytes */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) + return false; /* read_callback_ sets the state for us */ + /* get the size (in bytes) to skip */ + skip = 0; + for(i = 0; i < 4; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + skip <<= 7; + skip |= (x & 0x7f); + } + /* skip the rest of the tag */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) + return false; /* read_callback_ sets the state for us */ + return true; +} + +FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__bool first = true; + + /* If we know the total number of samples in the stream, stop if we've read that many. */ + /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ + if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { + if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return true; + } + } + + /* make sure we're byte aligned */ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + } + + while(1) { + if(decoder->private_->cached) { + x = (FLAC__uint32)decoder->private_->lookahead; + decoder->private_->cached = false; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + } + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->header_warmup[0] = (FLAC__byte)x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + + /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ + /* else we have to check if the second byte is the end of a sync code */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + } + else if(x >> 2 == 0x3e) { /* MAGIC NUMBER for the last 6 sync bits */ + decoder->private_->header_warmup[1] = (FLAC__byte)x; + decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; + return true; + } + } + if(first) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + first = false; + } + } + + return true; +} + +FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) +{ + unsigned channel; + unsigned i; + FLAC__int32 mid, side; + unsigned frame_crc; /* the one we calculate from the input stream */ + FLAC__uint32 x; + + *got_a_frame = false; + + /* init the CRC */ + frame_crc = 0; + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); + frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); + FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); + + if(!read_frame_header_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ + return true; + if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) + return false; + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + /* + * first figure the correct bits-per-sample of the subframe + */ + unsigned bps = decoder->private_->frame.header.bits_per_sample; + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* no adjustment needed */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 0) + bps++; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + if(channel == 1) + bps++; + break; + default: + FLAC__ASSERT(0); + } + /* + * now read it + */ + if(!read_subframe_(decoder, channel, bps, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + if(!read_zero_padding_(decoder)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ + return true; + + /* + * Read the frame CRC-16 from the footer and check + */ + frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) + return false; /* read_callback_ sets the state for us */ + if(frame_crc == x) { + if(do_full_decode) { + /* Undo any special channel coding */ + switch(decoder->private_->frame.header.channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + /* do nothing */ + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[0][i] += decoder->private_->output[1][i]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(decoder->private_->frame.header.channels == 2); + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { +#if 1 + mid = decoder->private_->output[0][i]; + side = decoder->private_->output[1][i]; + mid <<= 1; + mid |= (side & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + side) >> 1; + decoder->private_->output[1][i] = (mid - side) >> 1; +#else + /* OPT: without 'side' temp variable */ + mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ + decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; + decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; +#endif + } + break; + default: + FLAC__ASSERT(0); + break; + } + } + } + else { + /* Bad frame, emit error and zero the output signal */ + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); + if(do_full_decode) { + for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { + memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + } + } + } + + *got_a_frame = true; + + /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ + if(decoder->private_->next_fixed_block_size) + decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; + + /* put the latest values into the public section of the decoder instance */ + decoder->protected_->channels = decoder->private_->frame.header.channels; + decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; + decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; + decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; + decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; + + FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; + + /* write it */ + if(do_full_decode) { + if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) + return false; + } + + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; +} + +FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) +{ + FLAC__uint32 x; + FLAC__uint64 xx; + unsigned i, blocksize_hint = 0, sample_rate_hint = 0; + FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ + unsigned raw_header_len; + FLAC__bool is_unparseable = false; + + FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); + + /* init the raw header with the saved bits from synchronization */ + raw_header[0] = decoder->private_->header_warmup[0]; + raw_header[1] = decoder->private_->header_warmup[1]; + raw_header_len = 2; + + /* check to make sure that reserved bit is 0 */ + if(raw_header[1] & 0x02) /* MAGIC NUMBER */ + is_unparseable = true; + + /* + * Note that along the way as we read the header, we look for a sync + * code inside. If we find one it would indicate that our original + * sync was bad since there cannot be a sync code in a valid header. + * + * Three kinds of things can go wrong when reading the frame header: + * 1) We may have sync'ed incorrectly and not landed on a frame header. + * If we don't find a sync code, it can end up looking like we read + * a valid but unparseable header, until getting to the frame header + * CRC. Even then we could get a false positive on the CRC. + * 2) We may have sync'ed correctly but on an unparseable frame (from a + * future encoder). + * 3) We may be on a damaged frame which appears valid but unparseable. + * + * For all these reasons, we try and read a complete frame header as + * long as it seems valid, even if unparseable, up until the frame + * header CRC. + */ + + /* + * read in the raw header as bytes so we can CRC it, and parse it on the way + */ + for(i = 0; i < 2; i++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ + /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ + decoder->private_->lookahead = (FLAC__byte)x; + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + raw_header[raw_header_len++] = (FLAC__byte)x; + } + + switch(x = raw_header[2] >> 4) { + case 0: + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.blocksize = 192; + break; + case 2: + case 3: + case 4: + case 5: + decoder->private_->frame.header.blocksize = 576 << (x-2); + break; + case 6: + case 7: + blocksize_hint = x; + break; + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + decoder->private_->frame.header.blocksize = 256 << (x-8); + break; + default: + FLAC__ASSERT(0); + break; + } + + switch(x = raw_header[2] & 0x0f) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.sample_rate = 88200; + break; + case 2: + decoder->private_->frame.header.sample_rate = 176400; + break; + case 3: + decoder->private_->frame.header.sample_rate = 192000; + break; + case 4: + decoder->private_->frame.header.sample_rate = 8000; + break; + case 5: + decoder->private_->frame.header.sample_rate = 16000; + break; + case 6: + decoder->private_->frame.header.sample_rate = 22050; + break; + case 7: + decoder->private_->frame.header.sample_rate = 24000; + break; + case 8: + decoder->private_->frame.header.sample_rate = 32000; + break; + case 9: + decoder->private_->frame.header.sample_rate = 44100; + break; + case 10: + decoder->private_->frame.header.sample_rate = 48000; + break; + case 11: + decoder->private_->frame.header.sample_rate = 96000; + break; + case 12: + case 13: + case 14: + sample_rate_hint = x; + break; + case 15: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + default: + FLAC__ASSERT(0); + } + + x = (unsigned)(raw_header[3] >> 4); + if(x & 8) { + decoder->private_->frame.header.channels = 2; + switch(x & 7) { + case 0: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; + break; + case 1: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; + break; + case 2: + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; + break; + default: + is_unparseable = true; + break; + } + } + else { + decoder->private_->frame.header.channels = (unsigned)x + 1; + decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + } + + switch(x = (unsigned)(raw_header[3] & 0x0e) >> 1) { + case 0: + if(decoder->private_->has_stream_info) + decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; + else + is_unparseable = true; + break; + case 1: + decoder->private_->frame.header.bits_per_sample = 8; + break; + case 2: + decoder->private_->frame.header.bits_per_sample = 12; + break; + case 4: + decoder->private_->frame.header.bits_per_sample = 16; + break; + case 5: + decoder->private_->frame.header.bits_per_sample = 20; + break; + case 6: + decoder->private_->frame.header.bits_per_sample = 24; + break; + case 3: + case 7: + is_unparseable = true; + break; + default: + FLAC__ASSERT(0); + break; + } + + /* check to make sure that reserved bit is 0 */ + if(raw_header[3] & 0x01) /* MAGIC NUMBER */ + is_unparseable = true; + + /* read the frame's starting sample number (or frame number as the case may be) */ + if( + raw_header[1] & 0x01 || + /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ + (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) + ) { /* variable blocksize */ + if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + decoder->private_->frame.header.number.sample_number = xx; + } + else { /* fixed blocksize */ + if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) + return false; /* read_callback_ sets the state for us */ + if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ + decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ + decoder->private_->cached = true; + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + decoder->private_->frame.header.number.frame_number = x; + } + + if(blocksize_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(blocksize_hint == 7) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + decoder->private_->frame.header.blocksize = x+1; + } + + if(sample_rate_hint) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)x; + if(sample_rate_hint != 12) { + FLAC__uint32 _x; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) + return false; /* read_callback_ sets the state for us */ + raw_header[raw_header_len++] = (FLAC__byte)_x; + x = (x << 8) | _x; + } + if(sample_rate_hint == 12) + decoder->private_->frame.header.sample_rate = x*1000; + else if(sample_rate_hint == 13) + decoder->private_->frame.header.sample_rate = x; + else + decoder->private_->frame.header.sample_rate = x*10; + } + + /* read the CRC-8 byte */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) + return false; /* read_callback_ sets the state for us */ + crc8 = (FLAC__byte)x; + + if(FLAC__crc8(raw_header, raw_header_len) != crc8) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* calculate the sample number from the frame number if needed */ + decoder->private_->next_fixed_block_size = 0; + if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + x = decoder->private_->frame.header.number.frame_number; + decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; + if(decoder->private_->fixed_block_size) + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; + else if(decoder->private_->has_stream_info) { + if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; + decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; + } + else + is_unparseable = true; + } + else if(x == 0) { + decoder->private_->frame.header.number.sample_number = 0; + decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; + } + else { + /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ + decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; + } + } + + if(is_unparseable) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + return true; +} + +FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__uint32 x; + FLAC__bool wasted_bits; + unsigned i; + + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ + return false; /* read_callback_ sets the state for us */ + + wasted_bits = (x & 1); + x &= 0xfe; + + if(wasted_bits) { + unsigned u; + if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) + return false; /* read_callback_ sets the state for us */ + decoder->private_->frame.subframes[channel].wasted_bits = u+1; + bps -= decoder->private_->frame.subframes[channel].wasted_bits; + } + else + decoder->private_->frame.subframes[channel].wasted_bits = 0; + + /* + * Lots of magic numbers here + */ + if(x & 0x80) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x == 0) { + if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x == 2) { + if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) + return false; + } + else if(x < 16) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else if(x <= 24) { + if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + else if(x < 64) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + else { + if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) + return false; + if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ + return true; + } + + if(wasted_bits && do_full_decode) { + x = decoder->private_->frame.subframes[channel].wasted_bits; + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + decoder->private_->output[channel][i] <<= x; + } + + return true; +} + +FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; + FLAC__int32 x; + unsigned i; + FLAC__int32 *output = decoder->private_->output[channel]; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; + + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + + subframe->value = x; + + /* decode the subframe */ + if(do_full_decode) { + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) + output[i] = x; + } + + return true; +} + +FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) +{ + FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; + FLAC__int32 i32; + FLAC__uint32 u32; + unsigned u; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->residual = decoder->private_->residual[channel]; + subframe->order = order; + + /* read warm-up samples */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) + return false; /* read_callback_ sets the state for us */ + subframe->warmup[u] = i32; + } + + /* read qlp coeff precision */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) + return false; /* read_callback_ sets the state for us */ + if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + subframe->qlp_coeff_precision = u32+1; + + /* read qlp shift */ + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->quantization_level = i32; + + /* read quantized lp coefficiencts */ + for(u = 0; u < order; u++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) + return false; /* read_callback_ sets the state for us */ + subframe->qlp_coeff[u] = i32; + } + + /* read entropy coding method info */ + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; /* read_callback_ sets the state for us */ + subframe->entropy_coding_method.data.partitioned_rice.order = u32; + subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; + break; + default: + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + + /* read residual */ + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) + return false; + break; + default: + FLAC__ASSERT(0); + } + + /* decode the subframe */ + if(do_full_decode) { + memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); + /*@@@@@@ technically not pessimistic enough, should be more like + if( (FLAC__uint64)order * ((((FLAC__uint64)1)<qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) ) + */ + if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if(bps <= 16 && subframe->qlp_coeff_precision <= 16) { + if(order <= 8) + decoder->private_->local_lpc_restore_signal_16bit_order8(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + } + else + decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + else + decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); + } + + return true; +} + +FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) +{ + FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; + FLAC__int32 x, *residual = decoder->private_->residual[channel]; + unsigned i; + + decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data = residual; + + for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) + return false; /* read_callback_ sets the state for us */ + residual[i] = x; + } + + /* decode the subframe */ + if(do_full_decode) + memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); + + return true; +} + +FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) +{ + FLAC__uint32 rice_parameter; + int i; + unsigned partition, sample, u; + const unsigned partitions = 1u << partition_order; + const unsigned partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; + const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + /* sanity checks */ + if(partition_order == 0) { + if(decoder->private_->frame.header.blocksize < predictor_order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + } + else { + if(partition_samples < predictor_order) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + return true; + } + } + + if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, partition_order))) { + decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + sample = 0; + for(partition = 0; partition < partitions; partition++) { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->parameters[partition] = rice_parameter; + if(rice_parameter < pesc) { + partitioned_rice_contents->raw_bits[partition] = 0; + u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; + if(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + sample += u; + } + else { + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) + return false; /* read_callback_ sets the state for us */ + partitioned_rice_contents->raw_bits[partition] = rice_parameter; + for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { + if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) + return false; /* read_callback_ sets the state for us */ + residual[sample] = i; + } + } + } + + return true; +} + +FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) +{ + if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { + FLAC__uint32 zero = 0; + if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) + return false; /* read_callback_ sets the state for us */ + if(zero != 0) { + send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); + decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; + } + } + return true; +} + +FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; + + if( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) { + *bytes = 0; + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else if(*bytes > 0) { + /* While seeking, it is possible for our seek to land in the + * middle of audio data that looks exactly like a frame header + * from a future version of an encoder. When that happens, our + * error callback will get an + * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its + * unparseable_frame_count. But there is a remote possibility + * that it is properly synced at such a "future-codec frame", + * so to make sure, we wait to see many "unparseable" errors in + * a row before bailing out. + */ + if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else { + const FLAC__StreamDecoderReadStatus status = +#if FLAC__HAS_OGG + decoder->private_->is_ogg? + read_callback_ogg_aspect_(decoder, buffer, bytes) : +#endif + decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) + ; + if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + else if(*bytes == 0) { + if( + status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || + ( +#if FLAC__HAS_OGG + /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ + !decoder->private_->is_ogg && +#endif + decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) + ) + ) { + decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; + return false; + } + else + return true; + } + else + return true; + } + } + else { + /* abort to avoid a deadlock */ + decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; + return false; + } + /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around + * for Ogg FLAC. This is because the ogg decoder aspect can lose sync + * and at the same time hit the end of the stream (for example, seeking + * to a point that is after the beginning of the last Ogg page). There + * is no way to report an Ogg sync loss through the callbacks (see note + * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. + * So to keep the decoder from stopping at this point we gate the call + * to the eof_callback and let the Ogg decoder aspect set the + * end-of-stream state when it is needed. + */ +} + +#if FLAC__HAS_OGG +FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) +{ + switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + /* we don't really have a way to handle lost sync via read + * callback so we'll let it pass and let the underlying + * FLAC decoder catch the error + */ + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: + case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + default: + FLAC__ASSERT(0); + /* double protection */ + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } +} + +FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; + + switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { + case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; + case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; + case FLAC__STREAM_DECODER_READ_STATUS_ABORT: + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + default: + /* double protection: */ + FLAC__ASSERT(0); + return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; + } +} +#endif + +FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) +{ + if(decoder->private_->is_seeking) { + FLAC__uint64 this_frame_sample = frame->header.number.sample_number; + FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; + FLAC__uint64 target_sample = decoder->private_->target_sample; + + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + +#if FLAC__HAS_OGG + decoder->private_->got_a_frame = true; +#endif + decoder->private_->last_frame = *frame; /* save the frame */ + if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ + unsigned delta = (unsigned)(target_sample - this_frame_sample); + /* kick out of seek mode */ + decoder->private_->is_seeking = false; + /* shift out the samples before target_sample */ + if(delta > 0) { + unsigned channel; + const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; + for(channel = 0; channel < frame->header.channels; channel++) + newbuffer[channel] = buffer[channel] + delta; + decoder->private_->last_frame.header.blocksize -= delta; + decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); + } + else { + /* write the relevant samples */ + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } + } + else { + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; + } + } + else { + /* + * If we never got STREAMINFO, turn off MD5 checking to save + * cycles since we don't have a sum to compare to anyway + */ + if(!decoder->private_->has_stream_info) + decoder->private_->do_md5_checking = false; + if(decoder->private_->do_md5_checking) { + if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); + } +} + +void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) +{ + if(!decoder->private_->is_seeking) + decoder->private_->error_callback(decoder, status, decoder->private_->client_data); + else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) + decoder->private_->unparseable_frame_count++; +} + +FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; + FLAC__int64 pos = -1; + int i; + unsigned approx_bytes_per_frame; + FLAC__bool first_seek = true; + const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); + const unsigned min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; + const unsigned max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; + const unsigned max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; + const unsigned min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; + /* take these from the current frame in case they've changed mid-stream */ + unsigned channels = FLAC__stream_decoder_get_channels(decoder); + unsigned bps = FLAC__stream_decoder_get_bits_per_sample(decoder); + const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; + + /* use values from stream info if we didn't decode a frame */ + if(channels == 0) + channels = decoder->private_->stream_info.data.stream_info.channels; + if(bps == 0) + bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; + + /* we are just guessing here */ + if(max_framesize > 0) + approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; + /* + * Check if it's a known fixed-blocksize stream. Note that though + * the spec doesn't allow zeroes in the STREAMINFO block, we may + * never get a STREAMINFO block when decoding so the value of + * min_blocksize might be zero. + */ + else if(min_blocksize == max_blocksize && min_blocksize > 0) { + /* note there are no () around 'bps/8' to keep precision up since it's an integer calulation */ + approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; + } + else + approx_bytes_per_frame = 4096 * channels * bps/8 + 64; + + /* + * First, we set an upper and lower bound on where in the + * stream we will search. For now we assume the worst case + * scenario, which is our best guess at the beginning of + * the first frame and end of the stream. + */ + lower_bound = first_frame_offset; + lower_bound_sample = 0; + upper_bound = stream_length; + upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; + + /* + * Now we refine the bounds if we have a seektable with + * suitable points. Note that according to the spec they + * must be ordered by ascending sample number. + * + * Note: to protect against invalid seek tables we will ignore points + * that have frame_samples==0 or sample_number>=total_samples + */ + if(seek_table) { + FLAC__uint64 new_lower_bound = lower_bound; + FLAC__uint64 new_upper_bound = upper_bound; + FLAC__uint64 new_lower_bound_sample = lower_bound_sample; + FLAC__uint64 new_upper_bound_sample = upper_bound_sample; + + /* find the closest seek point <= target_sample, if it exists */ + for(i = (int)seek_table->num_points - 1; i >= 0; i--) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number <= target_sample + ) + break; + } + if(i >= 0) { /* i.e. we found a suitable seek point... */ + new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_lower_bound_sample = seek_table->points[i].sample_number; + } + + /* find the closest seek point > target_sample, if it exists */ + for(i = 0; i < (int)seek_table->num_points; i++) { + if( + seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && + seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ + (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ + seek_table->points[i].sample_number > target_sample + ) + break; + } + if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ + new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; + new_upper_bound_sample = seek_table->points[i].sample_number; + } + /* final protection against unsorted seek tables; keep original values if bogus */ + if(new_upper_bound >= new_lower_bound) { + lower_bound = new_lower_bound; + upper_bound = new_upper_bound; + lower_bound_sample = new_lower_bound_sample; + upper_bound_sample = new_upper_bound_sample; + } + } + + FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); + /* there are 2 insidious ways that the following equality occurs, which + * we need to fix: + * 1) total_samples is 0 (unknown) and target_sample is 0 + * 2) total_samples is 0 (unknown) and target_sample happens to be + * exactly equal to the last seek point in the seek table; this + * means there is no seek point above it, and upper_bound_samples + * remains equal to the estimate (of target_samples) we made above + * in either case it does not hurt to move upper_bound_sample up by 1 + */ + if(upper_bound_sample == lower_bound_sample) + upper_bound_sample++; + + decoder->private_->target_sample = target_sample; + while(1) { + /* check if the bounds are still ok */ + if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with VC++ you have to spoon feed it the casting */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(FLAC__int64)(target_sample - lower_bound_sample) / (FLAC__double)(FLAC__int64)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(FLAC__int64)(upper_bound - lower_bound)) - approx_bytes_per_frame; +#else + pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(target_sample - lower_bound_sample) / (FLAC__double)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(upper_bound - lower_bound)) - approx_bytes_per_frame; +#endif +#else + /* a little less accurate: */ + if(upper_bound - lower_bound < 0xffffffff) + pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; +#endif + if(pos >= (FLAC__int64)upper_bound) + pos = (FLAC__int64)upper_bound - 1; + if(pos < (FLAC__int64)lower_bound) + pos = (FLAC__int64)lower_bound; + if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + /* Now we need to get a frame. First we need to reset our + * unparseable_frame_count; if we get too many unparseable + * frames in a row, the read callback will return + * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing + * FLAC__stream_decoder_process_single() to return false. + */ + decoder->private_->unparseable_frame_count = 0; + if(!FLAC__stream_decoder_process_single(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our write callback will change the state when it gets to the target frame */ + /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ +#if 0 + /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ + if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) + break; +#endif + if(!decoder->private_->is_seeking) + break; + + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + + if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { + if (pos == (FLAC__int64)lower_bound) { + /* can't move back any more than the first frame, something is fatally wrong */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + /* our last move backwards wasn't big enough, try again */ + approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; + continue; + } + /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ + first_seek = false; + + /* make sure we are not seeking in corrupted stream */ + if (this_frame_sample < lower_bound_sample) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + + /* we need to narrow the search */ + if(target_sample < this_frame_sample) { + upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; +/*@@@@@@ what will decode position be if at end of stream? */ + if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (upper_bound - pos) / 3 + 16); + } + else { /* target_sample >= this_frame_sample + this frame's blocksize */ + lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; + if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + approx_bytes_per_frame = (unsigned)(2 * (lower_bound - pos) / 3 + 16); + } + } + + return true; +} + +#if FLAC__HAS_OGG +FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) +{ + FLAC__uint64 left_pos = 0, right_pos = stream_length; + FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); + FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; + FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ + FLAC__bool did_a_seek; + unsigned iteration = 0; + + /* In the first iterations, we will calculate the target byte position + * by the distance from the target sample to left_sample and + * right_sample (let's call it "proportional search"). After that, we + * will switch to binary search. + */ + unsigned BINARY_SEARCH_AFTER_ITERATION = 2; + + /* We will switch to a linear search once our current sample is less + * than this number of samples ahead of the target sample + */ + static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; + + /* If the total number of samples is unknown, use a large value, and + * force binary search immediately. + */ + if(right_sample == 0) { + right_sample = (FLAC__uint64)(-1); + BINARY_SEARCH_AFTER_ITERATION = 0; + } + + decoder->private_->target_sample = target_sample; + for( ; ; iteration++) { + if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { + if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { + pos = (right_pos + left_pos) / 2; + } + else { +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if defined _MSC_VER || defined __MINGW32__ + /* with MSVC you have to spoon feed it the casting */ + pos = (FLAC__uint64)((FLAC__double)(FLAC__int64)(target_sample - left_sample) / (FLAC__double)(FLAC__int64)(right_sample - left_sample) * (FLAC__double)(FLAC__int64)(right_pos - left_pos)); +#else + pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); +#endif +#else + /* a little less accurate: */ + if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) + pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); + else /* @@@ WATCHOUT, ~2TB limit */ + pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); +#endif + /* @@@ TODO: might want to limit pos to some distance + * before EOF, to make sure we land before the last frame, + * thereby getting a this_frame_sample and so having a better + * estimate. + */ + } + + /* physical seek */ + if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!FLAC__stream_decoder_flush(decoder)) { + /* above call sets the state for us */ + return false; + } + did_a_seek = true; + } + else + did_a_seek = false; + + decoder->private_->got_a_frame = false; + if(!FLAC__stream_decoder_process_single(decoder)) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + if(!decoder->private_->got_a_frame) { + if(did_a_seek) { + /* this can happen if we seek to a point after the last frame; we drop + * to binary search right away in this case to avoid any wasted + * iterations of proportional search. + */ + right_pos = pos; + BINARY_SEARCH_AFTER_ITERATION = 0; + } + else { + /* this can probably only happen if total_samples is unknown and the + * target_sample is past the end of the stream + */ + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + } + /* our write callback will change the state when it gets to the target frame */ + else if(!decoder->private_->is_seeking) { + break; + } + else { + this_frame_sample = decoder->private_->last_frame.header.number.sample_number; + FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + + if (did_a_seek) { + if (this_frame_sample <= target_sample) { + /* The 'equal' case should not happen, since + * FLAC__stream_decoder_process_single() + * should recognize that it has hit the + * target sample and we would exit through + * the 'break' above. + */ + FLAC__ASSERT(this_frame_sample != target_sample); + + left_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (left_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + left_pos = pos; + } + else if(this_frame_sample > target_sample) { + right_sample = this_frame_sample; + /* sanity check to avoid infinite loop */ + if (right_pos == pos) { + decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; + return false; + } + right_pos = pos; + } + } + } + } + + return true; +} +#endif + +FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + (void)client_data; + + if(*bytes > 0) { + *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); + if(ferror(decoder->private_->file)) + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + else if(*bytes == 0) + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + else + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + else + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ +} + +FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + else if(fseeko(decoder->private_->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + off_t pos; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + else if((pos = ftello(decoder->private_->file)) < 0) + return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; + else { + *absolute_byte_offset = (FLAC__uint64)pos; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; + } +} + +FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) +{ + struct stat filestats; + (void)client_data; + + if(decoder->private_->file == stdin) + return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + else if(fstat(fileno(decoder->private_->file), &filestats) != 0) + return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; + else { + *stream_length = (FLAC__uint64)filestats.st_size; + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; + } +} + +FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) +{ + (void)client_data; + + return feof(decoder->private_->file)? true : false; +} diff -Nru mame-0.144/src/lib/libflac/libflac/stream_encoder.c mame-0.145/src/lib/libflac/libflac/stream_encoder.c --- mame-0.144/src/lib/libflac/libflac/stream_encoder.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/stream_encoder.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,4352 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include /* for malloc() */ +#include /* for memcpy() */ +#include /* for off_t */ +#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#if _MSC_VER <= 1600 || defined __BORLANDC__ /* @@@ [2G limit] */ +#define fseeko fseek +#define ftello ftell +#endif +#endif +#include "flac/assert.h" +#include "flac/stream_decoder.h" +#include "share/alloc.h" +#include "protected/stream_encoder.h" +#include "private/bitwriter.h" +#include "private/bitmath.h" +#include "private/crc.h" +#include "private/cpu.h" +#include "private/fixed.h" +#include "private/format.h" +#include "private/lpc.h" +#include "private/md5.h" +#include "private/memory.h" +#if FLAC__HAS_OGG +#include "private/ogg_helper.h" +#include "private/ogg_mapping.h" +#endif +#include "private/stream_encoder_framing.h" +#include "private/window.h" + +#ifndef FLaC__INLINE +#define FLaC__INLINE +#endif + +#ifdef min +#undef min +#endif +#define min(x,y) ((x)<(y)?(x):(y)) + +#ifdef max +#undef max +#endif +#define max(x,y) ((x)>(y)?(x):(y)) + +/* Exact Rice codeword length calculation is off by default. The simple + * (and fast) estimation (of how many bits a residual value will be + * encoded with) in this encoder is very good, almost always yielding + * compression within 0.1% of exact calculation. + */ +#undef EXACT_RICE_BITS_CALCULATION +/* Rice parameter searching is off by default. The simple (and fast) + * parameter estimation in this encoder is very good, almost always + * yielding compression within 0.1% of the optimal parameters. + */ +#undef ENABLE_RICE_PARAMETER_SEARCH + + +typedef struct { + FLAC__int32 *data[FLAC__MAX_CHANNELS]; + unsigned size; /* of each data[] in samples */ + unsigned tail; +} verify_input_fifo; + +typedef struct { + const FLAC__byte *data; + unsigned capacity; + unsigned bytes; +} verify_output; + +typedef enum { + ENCODER_IN_MAGIC = 0, + ENCODER_IN_METADATA = 1, + ENCODER_IN_AUDIO = 2 +} EncoderStateHint; + +static struct CompressionLevels { + FLAC__bool do_mid_side_stereo; + FLAC__bool loose_mid_side_stereo; + unsigned max_lpc_order; + unsigned qlp_coeff_precision; + FLAC__bool do_qlp_coeff_prec_search; + FLAC__bool do_escape_coding; + FLAC__bool do_exhaustive_model_search; + unsigned min_residual_partition_order; + unsigned max_residual_partition_order; + unsigned rice_parameter_search_dist; +} compression_levels_[] = { + { false, false, 0, 0, false, false, false, 0, 3, 0 }, + { true , true , 0, 0, false, false, false, 0, 3, 0 }, + { true , false, 0, 0, false, false, false, 0, 3, 0 }, + { false, false, 6, 0, false, false, false, 0, 4, 0 }, + { true , true , 8, 0, false, false, false, 0, 4, 0 }, + { true , false, 8, 0, false, false, false, 0, 5, 0 }, + { true , false, 8, 0, false, false, false, 0, 6, 0 }, + { true , false, 8, 0, false, false, true , 0, 6, 0 }, + { true , false, 12, 0, false, false, true , 0, 6, 0 } +}; + + +/*********************************************************************** + * + * Private class method prototypes + * + ***********************************************************************/ + +static void set_defaults_(FLAC__StreamEncoder *encoder); +static void free_(FLAC__StreamEncoder *encoder); +static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize); +static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block); +static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block); +static void update_metadata_(const FLAC__StreamEncoder *encoder); +#if FLAC__HAS_OGG +static void update_ogg_metadata_(FLAC__StreamEncoder *encoder); +#endif +static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block); +static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block); + +static FLAC__bool process_subframe_( + FLAC__StreamEncoder *encoder, + unsigned min_partition_order, + unsigned max_partition_order, + const FLAC__FrameHeader *frame_header, + unsigned subframe_bps, + const FLAC__int32 integer_signal[], + FLAC__Subframe *subframe[2], + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], + FLAC__int32 *residual[2], + unsigned *best_subframe, + unsigned *best_bits +); + +static FLAC__bool add_subframe_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + FLAC__BitWriter *frame +); + +static unsigned evaluate_constant_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal, + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +); + +static unsigned evaluate_fixed_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +); + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +static unsigned evaluate_lpc_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + const FLAC__real lp_coeff[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned qlp_coeff_precision, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +); +#endif + +static unsigned evaluate_verbatim_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +); + +static unsigned find_best_partition_order_( + struct FLAC__StreamEncoderPrivate *private_, + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__EntropyCodingMethod *best_ecm +); + +static void precompute_partition_info_sums_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps +); + +static void precompute_partition_info_escapes_( + const FLAC__int32 residual[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +); + +static FLAC__bool set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + const FLAC__int32 residual[], +#endif + const FLAC__uint64 abs_residual_partition_sums[], + const unsigned raw_bits_per_partition[], + const unsigned residual_samples, + const unsigned predictor_order, + const unsigned suggested_rice_parameter, + const unsigned rice_parameter_limit, + const unsigned rice_parameter_search_dist, + const unsigned partition_order, + const FLAC__bool search_for_escapes, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, + unsigned *bits +); + +static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples); + +/* verify-related routines: */ +static void append_to_verify_fifo_( + verify_input_fifo *fifo, + const FLAC__int32 * const input[], + unsigned input_offset, + unsigned channels, + unsigned wide_samples +); + +static void append_to_verify_fifo_interleaved_( + verify_input_fifo *fifo, + const FLAC__int32 input[], + unsigned input_offset, + unsigned channels, + unsigned wide_samples +); + +static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); +static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); +static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); +static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); +static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); +static FILE *get_binary_stdout_(void); + + +/*********************************************************************** + * + * Private class data + * + ***********************************************************************/ + +typedef struct FLAC__StreamEncoderPrivate { + unsigned input_capacity; /* current size (in samples) of the signal and residual buffers */ + FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS]; /* the integer version of the input signal */ + FLAC__int32 *integer_signal_mid_side[2]; /* the integer version of the mid-side input signal (stereo only) */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real *real_signal[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) the floating-point version of the input signal */ + FLAC__real *real_signal_mid_side[2]; /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */ + FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */ + FLAC__real *windowed_signal; /* the integer_signal[] * current window[] */ +#endif + unsigned subframe_bps[FLAC__MAX_CHANNELS]; /* the effective bits per sample of the input signal (stream bps - wasted bits) */ + unsigned subframe_bps_mid_side[2]; /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */ + FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */ + FLAC__int32 *residual_workspace_mid_side[2][2]; + FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2]; + FLAC__Subframe subframe_workspace_mid_side[2][2]; + FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2]; + FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2]; + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2]; + unsigned best_subframe[FLAC__MAX_CHANNELS]; /* index (0 or 1) into 2nd dimension of the above workspaces */ + unsigned best_subframe_mid_side[2]; + unsigned best_subframe_bits[FLAC__MAX_CHANNELS]; /* size in bits of the best subframe for each channel */ + unsigned best_subframe_bits_mid_side[2]; + FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */ + unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */ + FLAC__BitWriter *frame; /* the current frame being worked on */ + unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */ + unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */ + FLAC__ChannelAssignment last_channel_assignment; + FLAC__StreamMetadata streaminfo; /* scratchpad for STREAMINFO as it is built */ + FLAC__StreamMetadata_SeekTable *seek_table; /* pointer into encoder->protected_->metadata_ where the seek table is */ + unsigned current_sample_number; + unsigned current_frame_number; + FLAC__MD5Context md5context; + FLAC__CPUInfo cpuinfo; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#else + unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +#endif +#ifndef FLAC__INTEGER_ONLY_LIBRARY + void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); + void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); + void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); + void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +#endif + FLAC__bool use_wide_by_block; /* use slow 64-bit versions of some functions because of the block size */ + FLAC__bool use_wide_by_partition; /* use slow 64-bit versions of some functions because of the min partition order and blocksize */ + FLAC__bool use_wide_by_order; /* use slow 64-bit versions of some functions because of the lpc order */ + FLAC__bool disable_constant_subframes; + FLAC__bool disable_fixed_subframes; + FLAC__bool disable_verbatim_subframes; +#if FLAC__HAS_OGG + FLAC__bool is_ogg; +#endif + FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */ + FLAC__StreamEncoderSeekCallback seek_callback; + FLAC__StreamEncoderTellCallback tell_callback; + FLAC__StreamEncoderWriteCallback write_callback; + FLAC__StreamEncoderMetadataCallback metadata_callback; + FLAC__StreamEncoderProgressCallback progress_callback; + void *client_data; + unsigned first_seekpoint_to_check; + FILE *file; /* only used when encoding to a file */ + FLAC__uint64 bytes_written; + FLAC__uint64 samples_written; + unsigned frames_written; + unsigned total_frames_estimate; + /* unaligned (original) pointers to allocated data */ + FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS]; + FLAC__int32 *integer_signal_mid_side_unaligned[2]; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */ + FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */ + FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS]; + FLAC__real *windowed_signal_unaligned; +#endif + FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2]; + FLAC__int32 *residual_workspace_mid_side_unaligned[2][2]; + FLAC__uint64 *abs_residual_partition_sums_unaligned; + unsigned *raw_bits_per_partition_unaligned; + /* + * These fields have been moved here from private function local + * declarations merely to save stack space during encoding. + */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */ +#endif + FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */ + /* + * The data for the verify section + */ + struct { + FLAC__StreamDecoder *decoder; + EncoderStateHint state_hint; + FLAC__bool needs_magic_hack; + verify_input_fifo input_fifo; + verify_output output; + struct { + FLAC__uint64 absolute_sample; + unsigned frame_number; + unsigned channel; + unsigned sample; + FLAC__int32 expected; + FLAC__int32 got; + } error_stats; + } verify; + FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */ +} FLAC__StreamEncoderPrivate; + +/*********************************************************************** + * + * Public static class data + * + ***********************************************************************/ + +FLAC_API const char * const FLAC__StreamEncoderStateString[] = { + "FLAC__STREAM_ENCODER_OK", + "FLAC__STREAM_ENCODER_UNINITIALIZED", + "FLAC__STREAM_ENCODER_OGG_ERROR", + "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR", + "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA", + "FLAC__STREAM_ENCODER_CLIENT_ERROR", + "FLAC__STREAM_ENCODER_IO_ERROR", + "FLAC__STREAM_ENCODER_FRAMING_ERROR", + "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR" +}; + +FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = { + "FLAC__STREAM_ENCODER_INIT_STATUS_OK", + "FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR", + "FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION", + "FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER", + "FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE", + "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA", + "FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED" +}; + +FLAC_API const char * const FLAC__treamEncoderReadStatusString[] = { + "FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE", + "FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM", + "FLAC__STREAM_ENCODER_READ_STATUS_ABORT", + "FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = { + "FLAC__STREAM_ENCODER_WRITE_STATUS_OK", + "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR" +}; + +FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = { + "FLAC__STREAM_ENCODER_SEEK_STATUS_OK", + "FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR", + "FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED" +}; + +FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = { + "FLAC__STREAM_ENCODER_TELL_STATUS_OK", + "FLAC__STREAM_ENCODER_TELL_STATUS_ERROR", + "FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED" +}; + +/* Number of samples that will be overread to watch for end of stream. By + * 'overread', we mean that the FLAC__stream_encoder_process*() calls will + * always try to read blocksize+1 samples before encoding a block, so that + * even if the stream has a total sample count that is an integral multiple + * of the blocksize, we will still notice when we are encoding the last + * block. This is needed, for example, to correctly set the end-of-stream + * marker in Ogg FLAC. + * + * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's + * not really any reason to change it. + */ +static const unsigned OVERREAD_ = 1; + +/*********************************************************************** + * + * Class constructor/destructor + * + */ +FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void) +{ + FLAC__StreamEncoder *encoder; + unsigned i; + + FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ + + encoder = (FLAC__StreamEncoder*)calloc(1, sizeof(FLAC__StreamEncoder)); + if(encoder == 0) { + return 0; + } + + encoder->protected_ = (FLAC__StreamEncoderProtected*)calloc(1, sizeof(FLAC__StreamEncoderProtected)); + if(encoder->protected_ == 0) { + free(encoder); + return 0; + } + + encoder->private_ = (FLAC__StreamEncoderPrivate*)calloc(1, sizeof(FLAC__StreamEncoderPrivate)); + if(encoder->private_ == 0) { + free(encoder->protected_); + free(encoder); + return 0; + } + + encoder->private_->frame = FLAC__bitwriter_new(); + if(encoder->private_->frame == 0) { + free(encoder->private_); + free(encoder->protected_); + free(encoder); + return 0; + } + + encoder->private_->file = 0; + + set_defaults_(encoder); + + encoder->private_->is_being_deleted = false; + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0]; + encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1]; + } + for(i = 0; i < 2; i++) { + encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0]; + encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1]; + } + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0]; + encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1]; + } + for(i = 0; i < 2; i++) { + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]; + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]; + } + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]); + } + for(i = 0; i < 2; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); + } + for(i = 0; i < 2; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]); + + encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; + + return encoder; +} + +FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder) +{ + unsigned i; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->private_->frame); + + encoder->private_->is_being_deleted = true; + + (void)FLAC__stream_encoder_finish(encoder); + + if(0 != encoder->private_->verify.decoder) + FLAC__stream_decoder_delete(encoder->private_->verify.decoder); + + for(i = 0; i < FLAC__MAX_CHANNELS; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]); + } + for(i = 0; i < 2; i++) { + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); + } + for(i = 0; i < 2; i++) + FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]); + + FLAC__bitwriter_delete(encoder->private_->frame); + free(encoder->private_); + free(encoder->protected_); + free(encoder); +} + +/*********************************************************************** + * + * Public class methods + * + ***********************************************************************/ + +static FLAC__StreamEncoderInitStatus init_stream_internal_( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderReadCallback read_callback, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + unsigned i; + FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2; + + FLAC__ASSERT(0 != encoder); + + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + +#if !FLAC__HAS_OGG + if(is_ogg) + return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER; +#endif + + if(0 == write_callback || (seek_callback && 0 == tell_callback)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; + + if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS; + + if(encoder->protected_->channels != 2) { + encoder->protected_->do_mid_side_stereo = false; + encoder->protected_->loose_mid_side_stereo = false; + } + else if(!encoder->protected_->do_mid_side_stereo) + encoder->protected_->loose_mid_side_stereo = false; + + if(encoder->protected_->bits_per_sample >= 32) + encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */ + + if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE; + + if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE; + + if(encoder->protected_->blocksize == 0) { + if(encoder->protected_->max_lpc_order == 0) + encoder->protected_->blocksize = 1152; + else + encoder->protected_->blocksize = 4096; + } + + if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE; + + if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER; + + if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order) + return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER; + + if(encoder->protected_->qlp_coeff_precision == 0) { + if(encoder->protected_->bits_per_sample < 16) { + /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */ + /* @@@ until then we'll make a guess */ + encoder->protected_->qlp_coeff_precision = max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2); + } + else if(encoder->protected_->bits_per_sample == 16) { + if(encoder->protected_->blocksize <= 192) + encoder->protected_->qlp_coeff_precision = 7; + else if(encoder->protected_->blocksize <= 384) + encoder->protected_->qlp_coeff_precision = 8; + else if(encoder->protected_->blocksize <= 576) + encoder->protected_->qlp_coeff_precision = 9; + else if(encoder->protected_->blocksize <= 1152) + encoder->protected_->qlp_coeff_precision = 10; + else if(encoder->protected_->blocksize <= 2304) + encoder->protected_->qlp_coeff_precision = 11; + else if(encoder->protected_->blocksize <= 4608) + encoder->protected_->qlp_coeff_precision = 12; + else + encoder->protected_->qlp_coeff_precision = 13; + } + else { + if(encoder->protected_->blocksize <= 384) + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2; + else if(encoder->protected_->blocksize <= 1152) + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1; + else + encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; + } + FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION); + } + else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION; + + if(encoder->protected_->streamable_subset) { + if( + encoder->protected_->blocksize != 192 && + encoder->protected_->blocksize != 576 && + encoder->protected_->blocksize != 1152 && + encoder->protected_->blocksize != 2304 && + encoder->protected_->blocksize != 4608 && + encoder->protected_->blocksize != 256 && + encoder->protected_->blocksize != 512 && + encoder->protected_->blocksize != 1024 && + encoder->protected_->blocksize != 2048 && + encoder->protected_->blocksize != 4096 && + encoder->protected_->blocksize != 8192 && + encoder->protected_->blocksize != 16384 + ) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate)) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if( + encoder->protected_->bits_per_sample != 8 && + encoder->protected_->bits_per_sample != 12 && + encoder->protected_->bits_per_sample != 16 && + encoder->protected_->bits_per_sample != 20 && + encoder->protected_->bits_per_sample != 24 + ) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER) + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + if( + encoder->protected_->sample_rate <= 48000 && + ( + encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ || + encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ + ) + ) { + return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; + } + } + + if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1; + if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order) + encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order; + +#if FLAC__HAS_OGG + /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */ + if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) { + unsigned i; + for(i = 1; i < encoder->protected_->num_metadata_blocks; i++) { + if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + FLAC__StreamMetadata *vc = encoder->protected_->metadata[i]; + for( ; i > 0; i--) + encoder->protected_->metadata[i] = encoder->protected_->metadata[i-1]; + encoder->protected_->metadata[0] = vc; + break; + } + } + } +#endif + /* keep track of any SEEKTABLE block */ + if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) { + unsigned i; + for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { + if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) { + encoder->private_->seek_table = &encoder->protected_->metadata[i]->data.seek_table; + break; /* take only the first one */ + } + } + } + + /* validate metadata */ + if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_seektable = false; + metadata_has_vorbis_comment = false; + metadata_picture_has_type1 = false; + metadata_picture_has_type2 = false; + for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { + const FLAC__StreamMetadata *m = encoder->protected_->metadata[i]; + if(m->type == FLAC__METADATA_TYPE_STREAMINFO) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) { + if(metadata_has_seektable) /* only one is allowed */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_seektable = true; + if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + if(metadata_has_vorbis_comment) /* only one is allowed */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_has_vorbis_comment = true; + } + else if(m->type == FLAC__METADATA_TYPE_CUESHEET) { + if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->type == FLAC__METADATA_TYPE_PICTURE) { + if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0)) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) { + if(metadata_picture_has_type1) /* there should only be 1 per stream */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_picture_has_type1 = true; + /* standard icon must be 32x32 pixel PNG */ + if( + m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD && + ( + (strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) || + m->data.picture.width != 32 || + m->data.picture.height != 32 + ) + ) + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + } + else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) { + if(metadata_picture_has_type2) /* there should only be 1 per stream */ + return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; + metadata_picture_has_type2 = true; + } + } + } + + encoder->private_->input_capacity = 0; + for(i = 0; i < encoder->protected_->channels; i++) { + encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0; +#endif + } + for(i = 0; i < 2; i++) { + encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0; +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + for(i = 0; i < encoder->protected_->num_apodizations; i++) + encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0; + encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0; +#endif + for(i = 0; i < encoder->protected_->channels; i++) { + encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0; + encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0; + encoder->private_->best_subframe[i] = 0; + } + for(i = 0; i < 2; i++) { + encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0; + encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0; + encoder->private_->best_subframe_mid_side[i] = 0; + } + encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0; + encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5); +#else + /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */ + /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply÷ by hand */ + FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350); + FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535); + FLAC__ASSERT(encoder->protected_->sample_rate <= 655350); + FLAC__ASSERT(encoder->protected_->blocksize <= 65535); + encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF); +#endif + if(encoder->private_->loose_mid_side_stereo_frames == 0) + encoder->private_->loose_mid_side_stereo_frames = 1; + encoder->private_->loose_mid_side_stereo_frame_count = 0; + encoder->private_->current_sample_number = 0; + encoder->private_->current_frame_number = 0; + + encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30); + encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */ + encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */ + + /* + * get the CPU info and set the function pointers + */ + FLAC__cpu_info(&encoder->private_->cpuinfo); + /* first default to the non-asm routines */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; +#endif + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients; +#endif + /* now override with asm where appropriate */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY +# ifndef FLAC__NO_ASM + if(encoder->private_->cpuinfo.use_asm) { +# ifdef FLAC__CPU_IA32 + FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); +# ifdef FLAC__HAS_NASM + if(encoder->private_->cpuinfo.data.ia32.sse) { + if(encoder->protected_->max_lpc_order < 4) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; + else if(encoder->protected_->max_lpc_order < 8) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; + else if(encoder->protected_->max_lpc_order < 12) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; + else + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; + } + else if(encoder->private_->cpuinfo.data.ia32._3dnow) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow; + else + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; + if(encoder->private_->cpuinfo.data.ia32.mmx) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; + } + else { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; + } + if(encoder->private_->cpuinfo.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov) + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; +# endif /* FLAC__HAS_NASM */ +# endif /* FLAC__CPU_IA32 */ + } +# endif /* !FLAC__NO_ASM */ +#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ + /* finally override based on wide-ness if necessary */ + if(encoder->private_->use_wide_by_block) { + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_wide; + } + + /* set state to OK; from here on, errors are fatal and we'll override the state then */ + encoder->protected_->state = FLAC__STREAM_ENCODER_OK; + +#if FLAC__HAS_OGG + encoder->private_->is_ogg = is_ogg; + if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } +#endif + + encoder->private_->read_callback = read_callback; + encoder->private_->write_callback = write_callback; + encoder->private_->seek_callback = seek_callback; + encoder->private_->tell_callback = tell_callback; + encoder->private_->metadata_callback = metadata_callback; + encoder->private_->client_data = client_data; + + if(!resize_buffers_(encoder, encoder->protected_->blocksize)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + if(!FLAC__bitwriter_init(encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * Set up the verify stuff if necessary + */ + if(encoder->protected_->verify) { + /* + * First, set up the fifo which will hold the + * original signal to compare against + */ + encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_; + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*)safe_malloc_mul_2op_(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + encoder->private_->verify.input_fifo.tail = 0; + + /* + * Now set up a stream decoder for verification + */ + encoder->private_->verify.decoder = FLAC__stream_decoder_new(); + if(0 == encoder->private_->verify.decoder) { + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + encoder->private_->verify.error_stats.absolute_sample = 0; + encoder->private_->verify.error_stats.frame_number = 0; + encoder->private_->verify.error_stats.channel = 0; + encoder->private_->verify.error_stats.sample = 0; + encoder->private_->verify.error_stats.expected = 0; + encoder->private_->verify.error_stats.got = 0; + + /* + * These must be done before we write any metadata, because that + * calls the write_callback, which uses these values. + */ + encoder->private_->first_seekpoint_to_check = 0; + encoder->private_->samples_written = 0; + encoder->protected_->streaminfo_offset = 0; + encoder->protected_->seektable_offset = 0; + encoder->protected_->audio_offset = 0; + + /* + * write the stream header + */ + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_MAGIC; + if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * write the STREAMINFO metadata block + */ + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_METADATA; + encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO; + encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */ + encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; + encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */ + encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize; + encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */ + encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */ + encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate; + encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels; + encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample; + encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */ + memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */ + if(encoder->protected_->do_md5) + FLAC__MD5Init(&encoder->private_->md5context); + if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * Now that the STREAMINFO block is written, we can init this to an + * absurdly-high value... + */ + encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1; + /* ... and clear this to 0 */ + encoder->private_->streaminfo.data.stream_info.total_samples = 0; + + /* + * Check to see if the supplied metadata contains a VORBIS_COMMENT; + * if not, we will write an empty one (FLAC__add_metadata_block() + * automatically supplies the vendor string). + * + * WATCHOUT: the Ogg FLAC mapping requires us to write this block after + * the STREAMINFO. (In the case that metadata_has_vorbis_comment is + * true it will have already insured that the metadata list is properly + * ordered.) + */ + if(!metadata_has_vorbis_comment) { + FLAC__StreamMetadata vorbis_comment; + vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT; + vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0); + vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */ + vorbis_comment.data.vorbis_comment.vendor_string.length = 0; + vorbis_comment.data.vorbis_comment.vendor_string.entry = 0; + vorbis_comment.data.vorbis_comment.num_comments = 0; + vorbis_comment.data.vorbis_comment.comments = 0; + if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + + /* + * write the user's metadata blocks + */ + for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { + encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1); + if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { + /* the above function sets the state for us in case of an error */ + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + } + + /* now that all the metadata is written, we save the stream offset */ + if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + if(encoder->protected_->verify) + encoder->private_->verify.state_hint = ENCODER_IN_AUDIO; + + return FLAC__STREAM_ENCODER_INIT_STATUS_OK; +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data +) +{ + return init_stream_internal_( + encoder, + /*read_callback=*/0, + write_callback, + seek_callback, + tell_callback, + metadata_callback, + client_data, + /*is_ogg=*/false + ); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream( + FLAC__StreamEncoder *encoder, + FLAC__StreamEncoderReadCallback read_callback, + FLAC__StreamEncoderWriteCallback write_callback, + FLAC__StreamEncoderSeekCallback seek_callback, + FLAC__StreamEncoderTellCallback tell_callback, + FLAC__StreamEncoderMetadataCallback metadata_callback, + void *client_data +) +{ + return init_stream_internal_( + encoder, + read_callback, + write_callback, + seek_callback, + tell_callback, + metadata_callback, + client_data, + /*is_ogg=*/true + ); +} + +static FLAC__StreamEncoderInitStatus init_FILE_internal_( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FLAC__StreamEncoderInitStatus init_status; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != file); + + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + + /* double protection */ + if(file == 0) { + encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + /* + * To make sure that our file does not go unclosed after an error, we + * must assign the FILE pointer before any further error can occur in + * this routine. + */ + if(file == stdout) + file = get_binary_stdout_(); /* just to be safe */ + + encoder->private_->file = file; + + encoder->private_->progress_callback = progress_callback; + encoder->private_->bytes_written = 0; + encoder->private_->samples_written = 0; + encoder->private_->frames_written = 0; + + init_status = init_stream_internal_( + encoder, + encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0, + file_write_callback_, + encoder->private_->file == stdout? 0 : file_seek_callback_, + encoder->private_->file == stdout? 0 : file_tell_callback_, + /*metadata_callback=*/0, + client_data, + is_ogg + ); + if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { + /* the above function sets the state for us in case of an error */ + return init_status; + } + + { + unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); + + FLAC__ASSERT(blocksize != 0); + encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize); + } + + return init_status; +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE( + FLAC__StreamEncoder *encoder, + FILE *file, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true); +} + +static FLAC__StreamEncoderInitStatus init_file_internal_( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data, + FLAC__bool is_ogg +) +{ + FILE *file; + + FLAC__ASSERT(0 != encoder); + + /* + * To make sure that our file does not go unclosed after an error, we + * have to do the same entrance checks here that are later performed + * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned. + */ + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; + + file = filename? fopen(filename, "w+b") : stdout; + + if(file == 0) { + encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; + return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; + } + + return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false); +} + +FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file( + FLAC__StreamEncoder *encoder, + const char *filename, + FLAC__StreamEncoderProgressCallback progress_callback, + void *client_data +) +{ + return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); +} + +FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder) +{ + FLAC__bool error = false; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + + if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED) + return true; + + if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) { + if(encoder->private_->current_sample_number != 0) { + const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number; + encoder->protected_->blocksize = encoder->private_->current_sample_number; + if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true)) + error = true; + } + } + + if(encoder->protected_->do_md5) + FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context); + + if(!encoder->private_->is_being_deleted) { + if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) { + if(encoder->private_->seek_callback) { +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) + update_ogg_metadata_(encoder); + else +#endif + update_metadata_(encoder); + + /* check if an error occurred while updating metadata */ + if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK) + error = true; + } + if(encoder->private_->metadata_callback) + encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data); + } + + if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) { + if(!error) + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; + error = true; + } + } + + if(0 != encoder->private_->file) { + if(encoder->private_->file != stdout) + fclose(encoder->private_->file); + encoder->private_->file = 0; + } + +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) + FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect); +#endif + + free_(encoder); + set_defaults_(encoder); + + if(!error) + encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; + + return !error; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if FLAC__HAS_OGG + /* can't check encoder->private_->is_ogg since that's not set until init time */ + FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value); + return true; +#else + (void)value; + return false; +#endif +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING + encoder->protected_->verify = value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->streamable_subset = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_md5 = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->channels = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->bits_per_sample = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->sample_rate = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__bool ok = true; + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0])) + value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1; + ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); + ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 + /* was: */ + ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); + /* but it's too hard to specify the string in a locale-specific way */ +#else + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; +#endif +#endif + ok &= FLAC__stream_encoder_set_max_lpc_order (encoder, compression_levels_[value].max_lpc_order); + ok &= FLAC__stream_encoder_set_qlp_coeff_precision (encoder, compression_levels_[value].qlp_coeff_precision); + ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search (encoder, compression_levels_[value].do_qlp_coeff_prec_search); + ok &= FLAC__stream_encoder_set_do_escape_coding (encoder, compression_levels_[value].do_escape_coding); + ok &= FLAC__stream_encoder_set_do_exhaustive_model_search (encoder, compression_levels_[value].do_exhaustive_model_search); + ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order); + ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order); + ok &= FLAC__stream_encoder_set_rice_parameter_search_dist (encoder, compression_levels_[value].rice_parameter_search_dist); + return ok; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->blocksize = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_mid_side_stereo = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->loose_mid_side_stereo = value; + return true; +} + +/*@@@@add to tests*/ +FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(0 != specification); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#ifdef FLAC__INTEGER_ONLY_LIBRARY + (void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */ +#else + encoder->protected_->num_apodizations = 0; + while(1) { + const char *s = strchr(specification, ';'); + const size_t n = s? (size_t)(s - specification) : strlen(specification); + if (n==8 && 0 == strncmp("bartlett" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT; + else if(n==13 && 0 == strncmp("bartlett_hann", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN; + else if(n==8 && 0 == strncmp("blackman" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN; + else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE; + else if(n==6 && 0 == strncmp("connes" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES; + else if(n==7 && 0 == strncmp("flattop" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP; + else if(n>7 && 0 == strncmp("gauss(" , specification, 6)) { + FLAC__real stddev = (FLAC__real)strtod(specification+6, 0); + if (stddev > 0.0 && stddev <= 0.5) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS; + } + } + else if(n==7 && 0 == strncmp("hamming" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING; + else if(n==4 && 0 == strncmp("hann" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN; + else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL; + else if(n==7 && 0 == strncmp("nuttall" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL; + else if(n==9 && 0 == strncmp("rectangle" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE; + else if(n==8 && 0 == strncmp("triangle" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE; + else if(n>7 && 0 == strncmp("tukey(" , specification, 6)) { + FLAC__real p = (FLAC__real)strtod(specification+6, 0); + if (p >= 0.0 && p <= 1.0) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; + } + } + else if(n==5 && 0 == strncmp("welch" , specification, n)) + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; + if (encoder->protected_->num_apodizations == 32) + break; + if (s) + specification = s+1; + else + break; + } + if(encoder->protected_->num_apodizations == 0) { + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; + } +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->max_lpc_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->qlp_coeff_precision = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_qlp_coeff_prec_search = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if 0 + /*@@@ deprecated: */ + encoder->protected_->do_escape_coding = value; +#else + (void)value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->do_exhaustive_model_search = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->min_residual_partition_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->max_residual_partition_order = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; +#if 0 + /*@@@ deprecated: */ + encoder->protected_->rice_parameter_search_dist = value; +#else + (void)value; +#endif + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->protected_->total_samples_estimate = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + if(0 == metadata) + num_blocks = 0; + if(0 == num_blocks) + metadata = 0; + /* realloc() does not do exactly what we want so... */ + if(encoder->protected_->metadata) { + free(encoder->protected_->metadata); + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + } + if(num_blocks) { + FLAC__StreamMetadata **m; + if(0 == (m = (FLAC__StreamMetadata**)safe_malloc_mul_2op_(sizeof(m[0]), /*times*/num_blocks))) + return false; + memcpy(m, metadata, sizeof(m[0]) * num_blocks); + encoder->protected_->metadata = m; + encoder->protected_->num_metadata_blocks = num_blocks; + } +#if FLAC__HAS_OGG + if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks)) + return false; +#endif + return true; +} + +/* + * These three functions are not static, but not publically exposed in + * include/FLAC/ either. They are used by the test suite. + */ +FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_constant_subframes = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_fixed_subframes = value; + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) + return false; + encoder->private_->disable_verbatim_subframes = value; + return true; +} + +FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->state; +} + +FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->verify) + return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder); + else + return FLAC__STREAM_DECODER_UNINITIALIZED; +} + +FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) + return FLAC__StreamEncoderStateString[encoder->protected_->state]; + else + return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder); +} + +FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + if(0 != absolute_sample) + *absolute_sample = encoder->private_->verify.error_stats.absolute_sample; + if(0 != frame_number) + *frame_number = encoder->private_->verify.error_stats.frame_number; + if(0 != channel) + *channel = encoder->private_->verify.error_stats.channel; + if(0 != sample) + *sample = encoder->private_->verify.error_stats.sample; + if(0 != expected) + *expected = encoder->private_->verify.error_stats.expected; + if(0 != got) + *got = encoder->private_->verify.error_stats.got; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->verify; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->streamable_subset; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_md5; +} + +FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->channels; +} + +FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->bits_per_sample; +} + +FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->sample_rate; +} + +FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->blocksize; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_mid_side_stereo; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->loose_mid_side_stereo; +} + +FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->max_lpc_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->qlp_coeff_precision; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_qlp_coeff_prec_search; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_escape_coding; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->do_exhaustive_model_search; +} + +FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->min_residual_partition_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->max_residual_partition_order; +} + +FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->rice_parameter_search_dist; +} + +FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + return encoder->protected_->total_samples_estimate; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples) +{ + unsigned i, j = 0, channel; + const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + do { + const unsigned n = min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j); + + if(encoder->protected_->verify) + append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n); + + for(channel = 0; channel < channels; channel++) + memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n); + + if(encoder->protected_->do_mid_side_stereo) { + FLAC__ASSERT(channels == 2); + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j]; + encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */ + } + } + else + j += n; + + encoder->private_->current_sample_number += n; + + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(encoder->private_->current_sample_number > blocksize) { + FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; + if(encoder->protected_->do_mid_side_stereo) { + encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; + encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; + } + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + + return true; +} + +FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples) +{ + unsigned i, j, k, channel; + FLAC__int32 x, mid, side; + const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; + + FLAC__ASSERT(0 != encoder); + FLAC__ASSERT(0 != encoder->private_); + FLAC__ASSERT(0 != encoder->protected_); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + j = k = 0; + /* + * we have several flavors of the same basic loop, optimized for + * different conditions: + */ + if(encoder->protected_->do_mid_side_stereo && channels == 2) { + /* + * stereo coding: unroll channel loop + */ + do { + if(encoder->protected_->verify) + append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); + + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + encoder->private_->integer_signal[0][i] = mid = side = buffer[k++]; + x = buffer[k++]; + encoder->private_->integer_signal[1][i] = x; + mid += x; + side -= x; + mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */ + encoder->private_->integer_signal_mid_side[1][i] = side; + encoder->private_->integer_signal_mid_side[0][i] = mid; + } + encoder->private_->current_sample_number = i; + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(i > blocksize) { + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + FLAC__ASSERT(i == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize]; + encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize]; + encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; + encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + } + else { + /* + * independent channel coding: buffer each channel in inner loop + */ + do { + if(encoder->protected_->verify) + append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); + + /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ + for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][i] = buffer[k++]; + } + encoder->private_->current_sample_number = i; + /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ + if(i > blocksize) { + if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) + return false; + /* move unprocessed overread samples to beginnings of arrays */ + FLAC__ASSERT(i == blocksize+OVERREAD_); + FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ + for(channel = 0; channel < channels; channel++) + encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; + encoder->private_->current_sample_number = 1; + } + } while(j < samples); + } + + return true; +} + +/*********************************************************************** + * + * Private class methods + * + ***********************************************************************/ + +void set_defaults_(FLAC__StreamEncoder *encoder) +{ + FLAC__ASSERT(0 != encoder); + +#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING + encoder->protected_->verify = true; +#else + encoder->protected_->verify = false; +#endif + encoder->protected_->streamable_subset = true; + encoder->protected_->do_md5 = true; + encoder->protected_->do_mid_side_stereo = false; + encoder->protected_->loose_mid_side_stereo = false; + encoder->protected_->channels = 2; + encoder->protected_->bits_per_sample = 16; + encoder->protected_->sample_rate = 44100; + encoder->protected_->blocksize = 0; +#ifndef FLAC__INTEGER_ONLY_LIBRARY + encoder->protected_->num_apodizations = 1; + encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; + encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; +#endif + encoder->protected_->max_lpc_order = 0; + encoder->protected_->qlp_coeff_precision = 0; + encoder->protected_->do_qlp_coeff_prec_search = false; + encoder->protected_->do_exhaustive_model_search = false; + encoder->protected_->do_escape_coding = false; + encoder->protected_->min_residual_partition_order = 0; + encoder->protected_->max_residual_partition_order = 0; + encoder->protected_->rice_parameter_search_dist = 0; + encoder->protected_->total_samples_estimate = 0; + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + + encoder->private_->seek_table = 0; + encoder->private_->disable_constant_subframes = false; + encoder->private_->disable_fixed_subframes = false; + encoder->private_->disable_verbatim_subframes = false; +#if FLAC__HAS_OGG + encoder->private_->is_ogg = false; +#endif + encoder->private_->read_callback = 0; + encoder->private_->write_callback = 0; + encoder->private_->seek_callback = 0; + encoder->private_->tell_callback = 0; + encoder->private_->metadata_callback = 0; + encoder->private_->progress_callback = 0; + encoder->private_->client_data = 0; + +#if FLAC__HAS_OGG + FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect); +#endif +} + +void free_(FLAC__StreamEncoder *encoder) +{ + unsigned i, channel; + + FLAC__ASSERT(0 != encoder); + if(encoder->protected_->metadata) { + free(encoder->protected_->metadata); + encoder->protected_->metadata = 0; + encoder->protected_->num_metadata_blocks = 0; + } + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 != encoder->private_->integer_signal_unaligned[i]) { + free(encoder->private_->integer_signal_unaligned[i]); + encoder->private_->integer_signal_unaligned[i] = 0; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(0 != encoder->private_->real_signal_unaligned[i]) { + free(encoder->private_->real_signal_unaligned[i]); + encoder->private_->real_signal_unaligned[i] = 0; + } +#endif + } + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) { + free(encoder->private_->integer_signal_mid_side_unaligned[i]); + encoder->private_->integer_signal_mid_side_unaligned[i] = 0; + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) { + free(encoder->private_->real_signal_mid_side_unaligned[i]); + encoder->private_->real_signal_mid_side_unaligned[i] = 0; + } +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + for(i = 0; i < encoder->protected_->num_apodizations; i++) { + if(0 != encoder->private_->window_unaligned[i]) { + free(encoder->private_->window_unaligned[i]); + encoder->private_->window_unaligned[i] = 0; + } + } + if(0 != encoder->private_->windowed_signal_unaligned) { + free(encoder->private_->windowed_signal_unaligned); + encoder->private_->windowed_signal_unaligned = 0; + } +#endif + for(channel = 0; channel < encoder->protected_->channels; channel++) { + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) { + free(encoder->private_->residual_workspace_unaligned[channel][i]); + encoder->private_->residual_workspace_unaligned[channel][i] = 0; + } + } + } + for(channel = 0; channel < 2; channel++) { + for(i = 0; i < 2; i++) { + if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) { + free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]); + encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0; + } + } + } + if(0 != encoder->private_->abs_residual_partition_sums_unaligned) { + free(encoder->private_->abs_residual_partition_sums_unaligned); + encoder->private_->abs_residual_partition_sums_unaligned = 0; + } + if(0 != encoder->private_->raw_bits_per_partition_unaligned) { + free(encoder->private_->raw_bits_per_partition_unaligned); + encoder->private_->raw_bits_per_partition_unaligned = 0; + } + if(encoder->protected_->verify) { + for(i = 0; i < encoder->protected_->channels; i++) { + if(0 != encoder->private_->verify.input_fifo.data[i]) { + free(encoder->private_->verify.input_fifo.data[i]); + encoder->private_->verify.input_fifo.data[i] = 0; + } + } + } + FLAC__bitwriter_free(encoder->private_->frame); +} + +FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) +{ + FLAC__bool ok; + unsigned i, channel; + + FLAC__ASSERT(new_blocksize > 0); + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + FLAC__ASSERT(encoder->private_->current_sample_number == 0); + + /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */ + if(new_blocksize <= encoder->private_->input_capacity) + return true; + + ok = true; + + /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() + * requires that the input arrays (in our case the integer signals) + * have a buffer of up to 3 zeroes in front (at negative indices) for + * alignment purposes; we use 4 in front to keep the data well-aligned. + */ + + for(i = 0; ok && i < encoder->protected_->channels; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]); + memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4); + encoder->private_->integer_signal[i] += 4; +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 /* @@@ currently unused */ + if(encoder->protected_->max_lpc_order > 0) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]); +#endif +#endif + } + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]); + memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4); + encoder->private_->integer_signal_mid_side[i] += 4; +#ifndef FLAC__INTEGER_ONLY_LIBRARY +#if 0 /* @@@ currently unused */ + if(encoder->protected_->max_lpc_order > 0) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]); +#endif +#endif + } +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(ok && encoder->protected_->max_lpc_order > 0) { + for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]); + ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal); + } +#endif + for(channel = 0; ok && channel < encoder->protected_->channels; channel++) { + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]); + } + } + for(channel = 0; ok && channel < 2; channel++) { + for(i = 0; ok && i < 2; i++) { + ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]); + } + } + /* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */ + /*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */ + ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums); + if(encoder->protected_->do_escape_coding) + ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition); + + /* now adjust the windows if the blocksize has changed */ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) { + for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) { + switch(encoder->protected_->apodizations[i].type) { + case FLAC__APODIZATION_BARTLETT: + FLAC__window_bartlett(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BARTLETT_HANN: + FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BLACKMAN: + FLAC__window_blackman(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE: + FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_CONNES: + FLAC__window_connes(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_FLATTOP: + FLAC__window_flattop(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_GAUSS: + FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev); + break; + case FLAC__APODIZATION_HAMMING: + FLAC__window_hamming(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_HANN: + FLAC__window_hann(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_KAISER_BESSEL: + FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_NUTTALL: + FLAC__window_nuttall(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_RECTANGLE: + FLAC__window_rectangle(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_TRIANGLE: + FLAC__window_triangle(encoder->private_->window[i], new_blocksize); + break; + case FLAC__APODIZATION_TUKEY: + FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); + break; + case FLAC__APODIZATION_WELCH: + FLAC__window_welch(encoder->private_->window[i], new_blocksize); + break; + default: + FLAC__ASSERT(0); + /* double protection */ + FLAC__window_hann(encoder->private_->window[i], new_blocksize); + break; + } + } + } +#endif + + if(ok) + encoder->private_->input_capacity = new_blocksize; + else + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + + return ok; +} + +FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block) +{ + const FLAC__byte *buffer; + size_t bytes; + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); + + if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + if(encoder->protected_->verify) { + encoder->private_->verify.output.data = buffer; + encoder->private_->verify.output.bytes = bytes; + if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) { + encoder->private_->verify.needs_magic_hack = true; + } + else { + if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) { + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; + return false; + } + } + } + + if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return false; + } + + FLAC__bitwriter_release_buffer(encoder->private_->frame); + FLAC__bitwriter_clear(encoder->private_->frame); + + if(samples > 0) { + encoder->private_->streaminfo.data.stream_info.min_framesize = min(bytes, encoder->private_->streaminfo.data.stream_info.min_framesize); + encoder->private_->streaminfo.data.stream_info.max_framesize = max(bytes, encoder->private_->streaminfo.data.stream_info.max_framesize); + } + + return true; +} + +FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block) +{ + FLAC__StreamEncoderWriteStatus status; + FLAC__uint64 output_position = 0; + + /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ + if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; + } + + /* + * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets. + */ + if(samples == 0) { + FLAC__MetadataType type = (buffer[0] & 0x7f); + if(type == FLAC__METADATA_TYPE_STREAMINFO) + encoder->protected_->streaminfo_offset = output_position; + else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0) + encoder->protected_->seektable_offset = output_position; + } + + /* + * Mark the current seek point if hit (if audio_offset == 0 that + * means we're still writing metadata and haven't hit the first + * frame yet) + */ + if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) { + const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); + const FLAC__uint64 frame_first_sample = encoder->private_->samples_written; + const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1; + FLAC__uint64 test_sample; + unsigned i; + for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) { + test_sample = encoder->private_->seek_table->points[i].sample_number; + if(test_sample > frame_last_sample) { + break; + } + else if(test_sample >= frame_first_sample) { + encoder->private_->seek_table->points[i].sample_number = frame_first_sample; + encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset; + encoder->private_->seek_table->points[i].frame_samples = blocksize; + encoder->private_->first_seekpoint_to_check++; + /* DO NOT: "break;" and here's why: + * The seektable template may contain more than one target + * sample for any given frame; we will keep looping, generating + * duplicate seekpoints for them, and we'll clean it up later, + * just before writing the seektable back to the metadata. + */ + } + else { + encoder->private_->first_seekpoint_to_check++; + } + } + } + +#if FLAC__HAS_OGG + if(encoder->private_->is_ogg) { + status = FLAC__ogg_encoder_aspect_write_callback_wrapper( + &encoder->protected_->ogg_encoder_aspect, + buffer, + bytes, + samples, + encoder->private_->current_frame_number, + is_last_block, + (FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, + encoder, + encoder->private_->client_data + ); + } + else +#endif + status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data); + + if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->private_->bytes_written += bytes; + encoder->private_->samples_written += samples; + /* we keep a high watermark on the number of frames written because + * when the encoder goes back to write metadata, 'current_frame' + * will drop back to 0. + */ + encoder->private_->frames_written = max(encoder->private_->frames_written, encoder->private_->current_frame_number+1); + } + else + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + + return status; +} + +/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ +void update_metadata_(const FLAC__StreamEncoder *encoder) +{ + FLAC__byte b[max(6, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; + const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; + const FLAC__uint64 samples = metadata->data.stream_info.total_samples; + const unsigned min_framesize = metadata->data.stream_info.min_framesize; + const unsigned max_framesize = metadata->data.stream_info.max_framesize; + const unsigned bps = metadata->data.stream_info.bits_per_sample; + FLAC__StreamEncoderSeekStatus seek_status; + + FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); + + /* All this is based on intimate knowledge of the stream header + * layout, but a change to the header format that would break this + * would also break all streams encoded in the previous format. + */ + + /* + * Write MD5 signature + */ + { + const unsigned md5_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN + ) / 8; + + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write total samples + */ + { + const unsigned total_samples_byte_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - 4 + ) / 8; + + b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F); + b[1] = (FLAC__byte)((samples >> 24) & 0xFF); + b[2] = (FLAC__byte)((samples >> 16) & 0xFF); + b[3] = (FLAC__byte)((samples >> 8) & 0xFF); + b[4] = (FLAC__byte)(samples & 0xFF); + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write min/max framesize + */ + { + const unsigned min_framesize_offset = + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + ) / 8; + + b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); + b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); + b[2] = (FLAC__byte)(min_framesize & 0xFF); + b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); + b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); + b[5] = (FLAC__byte)(max_framesize & 0xFF); + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + + /* + * Write seektable + */ + if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { + unsigned i; + + FLAC__format_seektable_sort(encoder->private_->seek_table); + + FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); + + if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { + if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + + for(i = 0; i < encoder->private_->seek_table->num_points; i++) { + FLAC__uint64 xx; + unsigned x; + xx = encoder->private_->seek_table->points[i].sample_number; + b[7] = (FLAC__byte)xx; xx >>= 8; + b[6] = (FLAC__byte)xx; xx >>= 8; + b[5] = (FLAC__byte)xx; xx >>= 8; + b[4] = (FLAC__byte)xx; xx >>= 8; + b[3] = (FLAC__byte)xx; xx >>= 8; + b[2] = (FLAC__byte)xx; xx >>= 8; + b[1] = (FLAC__byte)xx; xx >>= 8; + b[0] = (FLAC__byte)xx; xx >>= 8; + xx = encoder->private_->seek_table->points[i].stream_offset; + b[15] = (FLAC__byte)xx; xx >>= 8; + b[14] = (FLAC__byte)xx; xx >>= 8; + b[13] = (FLAC__byte)xx; xx >>= 8; + b[12] = (FLAC__byte)xx; xx >>= 8; + b[11] = (FLAC__byte)xx; xx >>= 8; + b[10] = (FLAC__byte)xx; xx >>= 8; + b[9] = (FLAC__byte)xx; xx >>= 8; + b[8] = (FLAC__byte)xx; xx >>= 8; + x = encoder->private_->seek_table->points[i].frame_samples; + b[17] = (FLAC__byte)x; x >>= 8; + b[16] = (FLAC__byte)x; x >>= 8; + if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { + encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; + return; + } + } + } +} + +#if FLAC__HAS_OGG +/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ +void update_ogg_metadata_(FLAC__StreamEncoder *encoder) +{ + /* the # of bytes in the 1st packet that precede the STREAMINFO */ + static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH = + FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + + FLAC__OGG_MAPPING_MAGIC_LENGTH + + FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + + FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + + FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + + FLAC__STREAM_SYNC_LENGTH + ; + FLAC__byte b[max(6, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; + const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; + const FLAC__uint64 samples = metadata->data.stream_info.total_samples; + const unsigned min_framesize = metadata->data.stream_info.min_framesize; + const unsigned max_framesize = metadata->data.stream_info.max_framesize; + ogg_page page; + + FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); + FLAC__ASSERT(0 != encoder->private_->seek_callback); + + /* Pre-check that client supports seeking, since we don't want the + * ogg_helper code to ever have to deal with this condition. + */ + if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED) + return; + + /* All this is based on intimate knowledge of the stream header + * layout, but a change to the header format that would break this + * would also break all streams encoded in the previous format. + */ + + /** + ** Write STREAMINFO stats + **/ + simple_ogg_page__init(&page); + if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + + /* + * Write MD5 signature + */ + { + const unsigned md5_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN + ) / 8; + + if(md5_offset + 16 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16); + } + + /* + * Write total samples + */ + { + const unsigned total_samples_byte_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + + FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - 4 + ) / 8; + + if(total_samples_byte_offset + 5 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0; + b[0] |= (FLAC__byte)((samples >> 32) & 0x0F); + b[1] = (FLAC__byte)((samples >> 24) & 0xFF); + b[2] = (FLAC__byte)((samples >> 16) & 0xFF); + b[3] = (FLAC__byte)((samples >> 8) & 0xFF); + b[4] = (FLAC__byte)(samples & 0xFF); + memcpy(page.body + total_samples_byte_offset, b, 5); + } + + /* + * Write min/max framesize + */ + { + const unsigned min_framesize_offset = + FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + + FLAC__STREAM_METADATA_HEADER_LENGTH + + ( + FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + + FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + ) / 8; + + if(min_framesize_offset + 6 > (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); + b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); + b[2] = (FLAC__byte)(min_framesize & 0xFF); + b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); + b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); + b[5] = (FLAC__byte)(max_framesize & 0xFF); + memcpy(page.body + min_framesize_offset, b, 6); + } + if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + simple_ogg_page__clear(&page); + + /* + * Write seektable + */ + if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { + unsigned i; + FLAC__byte *p; + + FLAC__format_seektable_sort(encoder->private_->seek_table); + + FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); + + simple_ogg_page__init(&page); + if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + + if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) { + encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; + simple_ogg_page__clear(&page); + return; + } + + for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) { + FLAC__uint64 xx; + unsigned x; + xx = encoder->private_->seek_table->points[i].sample_number; + b[7] = (FLAC__byte)xx; xx >>= 8; + b[6] = (FLAC__byte)xx; xx >>= 8; + b[5] = (FLAC__byte)xx; xx >>= 8; + b[4] = (FLAC__byte)xx; xx >>= 8; + b[3] = (FLAC__byte)xx; xx >>= 8; + b[2] = (FLAC__byte)xx; xx >>= 8; + b[1] = (FLAC__byte)xx; xx >>= 8; + b[0] = (FLAC__byte)xx; xx >>= 8; + xx = encoder->private_->seek_table->points[i].stream_offset; + b[15] = (FLAC__byte)xx; xx >>= 8; + b[14] = (FLAC__byte)xx; xx >>= 8; + b[13] = (FLAC__byte)xx; xx >>= 8; + b[12] = (FLAC__byte)xx; xx >>= 8; + b[11] = (FLAC__byte)xx; xx >>= 8; + b[10] = (FLAC__byte)xx; xx >>= 8; + b[9] = (FLAC__byte)xx; xx >>= 8; + b[8] = (FLAC__byte)xx; xx >>= 8; + x = encoder->private_->seek_table->points[i].frame_samples; + b[17] = (FLAC__byte)x; x >>= 8; + b[16] = (FLAC__byte)x; x >>= 8; + memcpy(p, b, 18); + } + + if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { + simple_ogg_page__clear(&page); + return; /* state already set */ + } + simple_ogg_page__clear(&page); + } +} +#endif + +FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block) +{ + FLAC__uint16 crc; + FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); + + /* + * Accumulate raw signal to the MD5 signature + */ + if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * Process the frame header and subframes into the frame bitbuffer + */ + if(!process_subframes_(encoder, is_fractional_block)) { + /* the above function sets the state for us in case of an error */ + return false; + } + + /* + * Zero-pad the frame to a byte_boundary + */ + if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * CRC-16 the whole thing + */ + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); + if( + !FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) || + !FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN) + ) { + encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; + return false; + } + + /* + * Write it + */ + if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) { + /* the above function sets the state for us in case of an error */ + return false; + } + + /* + * Get ready for the next frame + */ + encoder->private_->current_sample_number = 0; + encoder->private_->current_frame_number++; + encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize; + + return true; +} + +FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block) +{ + FLAC__FrameHeader frame_header; + unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order; + FLAC__bool do_independent, do_mid_side; + + /* + * Calculate the min,max Rice partition orders + */ + if(is_fractional_block) { + max_partition_order = 0; + } + else { + max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize); + max_partition_order = min(max_partition_order, encoder->protected_->max_residual_partition_order); + } + min_partition_order = min(min_partition_order, max_partition_order); + + /* + * Setup the frame + */ + frame_header.blocksize = encoder->protected_->blocksize; + frame_header.sample_rate = encoder->protected_->sample_rate; + frame_header.channels = encoder->protected_->channels; + frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */ + frame_header.bits_per_sample = encoder->protected_->bits_per_sample; + frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; + frame_header.number.frame_number = encoder->private_->current_frame_number; + + /* + * Figure out what channel assignments to try + */ + if(encoder->protected_->do_mid_side_stereo) { + if(encoder->protected_->loose_mid_side_stereo) { + if(encoder->private_->loose_mid_side_stereo_frame_count == 0) { + do_independent = true; + do_mid_side = true; + } + else { + do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT); + do_mid_side = !do_independent; + } + } + else { + do_independent = true; + do_mid_side = true; + } + } + else { + do_independent = true; + do_mid_side = false; + } + + FLAC__ASSERT(do_independent || do_mid_side); + + /* + * Check for wasted bits; set effective bps for each subframe + */ + if(do_independent) { + for(channel = 0; channel < encoder->protected_->channels; channel++) { + const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); + encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w; + encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w; + } + } + if(do_mid_side) { + FLAC__ASSERT(encoder->protected_->channels == 2); + for(channel = 0; channel < 2; channel++) { + const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize); + encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w; + encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1); + } + } + + /* + * First do a normal encoding pass of each independent channel + */ + if(do_independent) { + for(channel = 0; channel < encoder->protected_->channels; channel++) { + if(! + process_subframe_( + encoder, + min_partition_order, + max_partition_order, + &frame_header, + encoder->private_->subframe_bps[channel], + encoder->private_->integer_signal[channel], + encoder->private_->subframe_workspace_ptr[channel], + encoder->private_->partitioned_rice_contents_workspace_ptr[channel], + encoder->private_->residual_workspace[channel], + encoder->private_->best_subframe+channel, + encoder->private_->best_subframe_bits+channel + ) + ) + return false; + } + } + + /* + * Now do mid and side channels if requested + */ + if(do_mid_side) { + FLAC__ASSERT(encoder->protected_->channels == 2); + + for(channel = 0; channel < 2; channel++) { + if(! + process_subframe_( + encoder, + min_partition_order, + max_partition_order, + &frame_header, + encoder->private_->subframe_bps_mid_side[channel], + encoder->private_->integer_signal_mid_side[channel], + encoder->private_->subframe_workspace_ptr_mid_side[channel], + encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel], + encoder->private_->residual_workspace_mid_side[channel], + encoder->private_->best_subframe_mid_side+channel, + encoder->private_->best_subframe_bits_mid_side+channel + ) + ) + return false; + } + } + + /* + * Compose the frame bitbuffer + */ + if(do_mid_side) { + unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */ + FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */ + FLAC__ChannelAssignment channel_assignment; + + FLAC__ASSERT(encoder->protected_->channels == 2); + + if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) { + channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE); + } + else { + unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */ + unsigned min_bits; + int ca; + + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE == 1); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE == 2); + FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE == 3); + FLAC__ASSERT(do_independent && do_mid_side); + + /* We have to figure out which channel assignent results in the smallest frame */ + bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits [1]; + bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits_mid_side[1]; + bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits [1] + encoder->private_->best_subframe_bits_mid_side[1]; + bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1]; + + channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; + min_bits = bits[channel_assignment]; + for(ca = 1; ca <= 3; ca++) { + if(bits[ca] < min_bits) { + min_bits = bits[ca]; + channel_assignment = (FLAC__ChannelAssignment)ca; + } + } + } + + frame_header.channel_assignment = channel_assignment; + + if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + + switch(channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; + right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; + right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + left_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; + right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; + break; + default: + FLAC__ASSERT(0); + } + + switch(channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + left_bps = encoder->private_->subframe_bps [0]; + right_bps = encoder->private_->subframe_bps [1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + left_bps = encoder->private_->subframe_bps [0]; + right_bps = encoder->private_->subframe_bps_mid_side[1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + left_bps = encoder->private_->subframe_bps_mid_side[1]; + right_bps = encoder->private_->subframe_bps [1]; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + left_bps = encoder->private_->subframe_bps_mid_side[0]; + right_bps = encoder->private_->subframe_bps_mid_side[1]; + break; + default: + FLAC__ASSERT(0); + } + + /* note that encoder_add_subframe_ sets the state for us in case of an error */ + if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame)) + return false; + if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame)) + return false; + } + else { + if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + + for(channel = 0; channel < encoder->protected_->channels; channel++) { + if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) { + /* the above function sets the state for us in case of an error */ + return false; + } + } + } + + if(encoder->protected_->loose_mid_side_stereo) { + encoder->private_->loose_mid_side_stereo_frame_count++; + if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames) + encoder->private_->loose_mid_side_stereo_frame_count = 0; + } + + encoder->private_->last_channel_assignment = frame_header.channel_assignment; + + return true; +} + +FLAC__bool process_subframe_( + FLAC__StreamEncoder *encoder, + unsigned min_partition_order, + unsigned max_partition_order, + const FLAC__FrameHeader *frame_header, + unsigned subframe_bps, + const FLAC__int32 integer_signal[], + FLAC__Subframe *subframe[2], + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], + FLAC__int32 *residual[2], + unsigned *best_subframe, + unsigned *best_bits +) +{ +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; +#else + FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; +#endif +#ifndef FLAC__INTEGER_ONLY_LIBRARY + FLAC__double lpc_residual_bits_per_sample; + FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm routines need all the space */ + FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; + unsigned min_lpc_order, max_lpc_order, lpc_order; + unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; +#endif + unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order; + unsigned rice_parameter; + unsigned _candidate_bits, _best_bits; + unsigned _best_subframe; + /* only use RICE2 partitions if stream bps > 16 */ + const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + FLAC__ASSERT(frame_header->blocksize > 0); + + /* verbatim subframe is the baseline against which we measure other compressed subframes */ + _best_subframe = 0; + if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) + _best_bits = UINT_MAX; + else + _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); + + if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) { + unsigned signal_is_constant = false; + guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample); + /* check for constant subframe */ + if( + !encoder->private_->disable_constant_subframes && +#ifndef FLAC__INTEGER_ONLY_LIBRARY + fixed_residual_bits_per_sample[1] == 0.0 +#else + fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO +#endif + ) { + /* the above means it's possible all samples are the same value; now double-check it: */ + unsigned i; + signal_is_constant = true; + for(i = 1; i < frame_header->blocksize; i++) { + if(integer_signal[0] != integer_signal[i]) { + signal_is_constant = false; + break; + } + } + } + if(signal_is_constant) { + _candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]); + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + else { + if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) { + /* encode fixed */ + if(encoder->protected_->do_exhaustive_model_search) { + min_fixed_order = 0; + max_fixed_order = FLAC__MAX_FIXED_ORDER; + } + else { + min_fixed_order = max_fixed_order = guess_fixed_order; + } + if(max_fixed_order >= frame_header->blocksize) + max_fixed_order = frame_header->blocksize - 1; + for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) { +#ifndef FLAC__INTEGER_ONLY_LIBRARY + if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps) + continue; /* don't even try */ + rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */ +#else + if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps) + continue; /* don't even try */ + rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */ +#endif + rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + _candidate_bits = + evaluate_fixed_subframe_( + encoder, + integer_signal, + residual[!_best_subframe], + encoder->private_->abs_residual_partition_sums, + encoder->private_->raw_bits_per_partition, + frame_header->blocksize, + subframe_bps, + fixed_order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + encoder->protected_->do_escape_coding, + encoder->protected_->rice_parameter_search_dist, + subframe[!_best_subframe], + partitioned_rice_contents[!_best_subframe] + ); + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + } + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + /* encode lpc */ + if(encoder->protected_->max_lpc_order > 0) { + if(encoder->protected_->max_lpc_order >= frame_header->blocksize) + max_lpc_order = frame_header->blocksize-1; + else + max_lpc_order = encoder->protected_->max_lpc_order; + if(max_lpc_order > 0) { + unsigned a; + for (a = 0; a < encoder->protected_->num_apodizations; a++) { + FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize); + encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc); + /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */ + if(autoc[0] != 0.0) { + FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error); + if(encoder->protected_->do_exhaustive_model_search) { + min_lpc_order = 1; + } + else { + const unsigned guess_lpc_order = + FLAC__lpc_compute_best_order( + lpc_error, + max_lpc_order, + frame_header->blocksize, + subframe_bps + ( + encoder->protected_->do_qlp_coeff_prec_search? + FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ + encoder->protected_->qlp_coeff_precision + ) + ); + min_lpc_order = max_lpc_order = guess_lpc_order; + } + if(max_lpc_order >= frame_header->blocksize) + max_lpc_order = frame_header->blocksize - 1; + for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { + lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order); + if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps) + continue; /* don't even try */ + rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ + rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + if(encoder->protected_->do_qlp_coeff_prec_search) { + min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; + /* try to ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ + if(subframe_bps <= 17) { + max_qlp_coeff_precision = min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); + max_qlp_coeff_precision = max(max_qlp_coeff_precision, min_qlp_coeff_precision); + } + else + max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; + } + else { + min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision; + } + for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) { + _candidate_bits = + evaluate_lpc_subframe_( + encoder, + integer_signal, + residual[!_best_subframe], + encoder->private_->abs_residual_partition_sums, + encoder->private_->raw_bits_per_partition, + encoder->private_->lp_coeff[lpc_order-1], + frame_header->blocksize, + subframe_bps, + lpc_order, + qlp_coeff_precision, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + encoder->protected_->do_escape_coding, + encoder->protected_->rice_parameter_search_dist, + subframe[!_best_subframe], + partitioned_rice_contents[!_best_subframe] + ); + if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */ + if(_candidate_bits < _best_bits) { + _best_subframe = !_best_subframe; + _best_bits = _candidate_bits; + } + } + } + } + } + } + } + } +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ + } + } + + /* under rare circumstances this can happen when all but lpc subframe types are disabled: */ + if(_best_bits == UINT_MAX) { + FLAC__ASSERT(_best_subframe == 0); + _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); + } + + *best_subframe = _best_subframe; + *best_bits = _best_bits; + + return true; +} + +FLAC__bool add_subframe_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + FLAC__BitWriter *frame +) +{ + switch(subframe->type) { + case FLAC__SUBFRAME_TYPE_CONSTANT: + if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_FIXED: + if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_LPC: + if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + case FLAC__SUBFRAME_TYPE_VERBATIM: + if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) { + encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; + return false; + } + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +#define SPOTCHECK_ESTIMATE 0 +#if SPOTCHECK_ESTIMATE +static void spotcheck_subframe_estimate_( + FLAC__StreamEncoder *encoder, + unsigned blocksize, + unsigned subframe_bps, + const FLAC__Subframe *subframe, + unsigned estimate +) +{ + FLAC__bool ret; + FLAC__BitWriter *frame = FLAC__bitwriter_new(); + if(frame == 0) { + fprintf(stderr, "EST: can't allocate frame\n"); + return; + } + if(!FLAC__bitwriter_init(frame)) { + fprintf(stderr, "EST: can't init frame\n"); + return; + } + ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame); + FLAC__ASSERT(ret); + { + const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame); + if(estimate != actual) + fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate); + } + FLAC__bitwriter_delete(frame); +} +#endif + +unsigned evaluate_constant_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal, + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +) +{ + unsigned estimate; + subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT; + subframe->data.constant.value = signal; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#else + (void)encoder, (void)blocksize; +#endif + + return estimate; +} + +unsigned evaluate_fixed_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +) +{ + unsigned i, residual_bits, estimate; + const unsigned residual_samples = blocksize - order; + + FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual); + + subframe->type = FLAC__SUBFRAME_TYPE_FIXED; + + subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; + subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; + subframe->data.fixed.residual = residual; + + residual_bits = + find_best_partition_order_( + encoder->private_, + residual, + abs_residual_partition_sums, + raw_bits_per_partition, + residual_samples, + order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + subframe_bps, + do_escape_coding, + rice_parameter_search_dist, + &subframe->data.fixed.entropy_coding_method + ); + + subframe->data.fixed.order = order; + for(i = 0; i < order; i++) + subframe->data.fixed.warmup[i] = signal[i]; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#endif + + return estimate; +} + +#ifndef FLAC__INTEGER_ONLY_LIBRARY +unsigned evaluate_lpc_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + const FLAC__real lp_coeff[], + unsigned blocksize, + unsigned subframe_bps, + unsigned order, + unsigned qlp_coeff_precision, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__Subframe *subframe, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents +) +{ + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + unsigned i, residual_bits, estimate; + int quantization, ret; + const unsigned residual_samples = blocksize - order; + + /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ + if(subframe_bps <= 16) { + FLAC__ASSERT(order > 0); + FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER); + qlp_coeff_precision = min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order)); + } + + ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization); + if(ret != 0) + return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */ + + if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) + if(subframe_bps <= 16 && qlp_coeff_precision <= 16) + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + else + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + else + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); + + subframe->type = FLAC__SUBFRAME_TYPE_LPC; + + subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; + subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; + subframe->data.lpc.residual = residual; + + residual_bits = + find_best_partition_order_( + encoder->private_, + residual, + abs_residual_partition_sums, + raw_bits_per_partition, + residual_samples, + order, + rice_parameter, + rice_parameter_limit, + min_partition_order, + max_partition_order, + subframe_bps, + do_escape_coding, + rice_parameter_search_dist, + &subframe->data.lpc.entropy_coding_method + ); + + subframe->data.lpc.order = order; + subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision; + subframe->data.lpc.quantization_level = quantization; + memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER); + for(i = 0; i < order; i++) + subframe->data.lpc.warmup[i] = signal[i]; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits; + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#endif + + return estimate; +} +#endif + +unsigned evaluate_verbatim_subframe_( + FLAC__StreamEncoder *encoder, + const FLAC__int32 signal[], + unsigned blocksize, + unsigned subframe_bps, + FLAC__Subframe *subframe +) +{ + unsigned estimate; + + subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM; + + subframe->data.verbatim.data = signal; + + estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps); + +#if SPOTCHECK_ESTIMATE + spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); +#else + (void)encoder; +#endif + + return estimate; +} + +unsigned find_best_partition_order_( + FLAC__StreamEncoderPrivate *private_, + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned rice_parameter, + unsigned rice_parameter_limit, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps, + FLAC__bool do_escape_coding, + unsigned rice_parameter_search_dist, + FLAC__EntropyCodingMethod *best_ecm +) +{ + unsigned residual_bits, best_residual_bits = 0; + unsigned best_parameters_index = 0; + unsigned best_partition_order = 0; + const unsigned blocksize = residual_samples + predictor_order; + + max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); + min_partition_order = min(min_partition_order, max_partition_order); + + precompute_partition_info_sums_(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); + + if(do_escape_coding) + precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); + + { + int partition_order; + unsigned sum; + + for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) { + if(! + set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + residual, +#endif + abs_residual_partition_sums+sum, + raw_bits_per_partition+sum, + residual_samples, + predictor_order, + rice_parameter, + rice_parameter_limit, + rice_parameter_search_dist, + (unsigned)partition_order, + do_escape_coding, + &private_->partitioned_rice_contents_extra[!best_parameters_index], + &residual_bits + ) + ) + { + FLAC__ASSERT(best_residual_bits != 0); + break; + } + sum += 1u << partition_order; + if(best_residual_bits == 0 || residual_bits < best_residual_bits) { + best_residual_bits = residual_bits; + best_parameters_index = !best_parameters_index; + best_partition_order = partition_order; + } + } + } + + best_ecm->data.partitioned_rice.order = best_partition_order; + + { + /* + * We are allowed to de-const the pointer based on our special + * knowledge; it is const to the outside world. + */ + FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents; + unsigned partition; + + /* save best parameters and raw_bits */ + FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, max(6, best_partition_order)); + memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order))); + if(do_escape_coding) + memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order))); + /* + * Now need to check if the type should be changed to + * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the + * size of the rice parameters. + */ + for(partition = 0; partition < (1u<parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { + best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2; + break; + } + } + } + + return best_residual_bits; +} + +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM +extern void precompute_partition_info_sums_32bit_asm_ia32_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned blocksize, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +); +#endif + +void precompute_partition_info_sums_( + const FLAC__int32 residual[], + FLAC__uint64 abs_residual_partition_sums[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order, + unsigned bps +) +{ + const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; + unsigned partitions = 1u << max_partition_order; + + FLAC__ASSERT(default_partition_samples > predictor_order); + +#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM + /* slightly pessimistic but still catches all common cases */ + /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ + if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { + precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order); + return; + } +#endif + + /* first do max_partition_order */ + { + unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); + /* slightly pessimistic but still catches all common cases */ + /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ + if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { + FLAC__uint32 abs_residual_partition_sum; + + for(partition = residual_sample = 0; partition < partitions; partition++) { + end += default_partition_samples; + abs_residual_partition_sum = 0; + for( ; residual_sample < end; residual_sample++) + abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ + abs_residual_partition_sums[partition] = abs_residual_partition_sum; + } + } + else { /* have to pessimistically use 64 bits for accumulator */ + FLAC__uint64 abs_residual_partition_sum; + + for(partition = residual_sample = 0; partition < partitions; partition++) { + end += default_partition_samples; + abs_residual_partition_sum = 0; + for( ; residual_sample < end; residual_sample++) + abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ + abs_residual_partition_sums[partition] = abs_residual_partition_sum; + } + } + } + + /* now merge partitions for lower orders */ + { + unsigned from_partition = 0, to_partition = partitions; + int partition_order; + for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { + unsigned i; + partitions >>= 1; + for(i = 0; i < partitions; i++) { + abs_residual_partition_sums[to_partition++] = + abs_residual_partition_sums[from_partition ] + + abs_residual_partition_sums[from_partition+1]; + from_partition += 2; + } + } + } +} + +void precompute_partition_info_escapes_( + const FLAC__int32 residual[], + unsigned raw_bits_per_partition[], + unsigned residual_samples, + unsigned predictor_order, + unsigned min_partition_order, + unsigned max_partition_order +) +{ + int partition_order; + unsigned from_partition, to_partition = 0; + const unsigned blocksize = residual_samples + predictor_order; + + /* first do max_partition_order */ + for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) { + FLAC__int32 r; + FLAC__uint32 rmax; + unsigned partition, partition_sample, partition_samples, residual_sample; + const unsigned partitions = 1u << partition_order; + const unsigned default_partition_samples = blocksize >> partition_order; + + FLAC__ASSERT(default_partition_samples > predictor_order); + + for(partition = residual_sample = 0; partition < partitions; partition++) { + partition_samples = default_partition_samples; + if(partition == 0) + partition_samples -= predictor_order; + rmax = 0; + for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) { + r = residual[residual_sample++]; + /* OPT: maybe faster: rmax |= r ^ (r>>31) */ + if(r < 0) + rmax |= ~r; + else + rmax |= r; + } + /* now we know all residual values are in the range [-rmax-1,rmax] */ + raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1; + } + to_partition = partitions; + break; /*@@@ yuck, should remove the 'for' loop instead */ + } + + /* now merge partitions for lower orders */ + for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) { + unsigned m; + unsigned i; + const unsigned partitions = 1u << partition_order; + for(i = 0; i < partitions; i++) { + m = raw_bits_per_partition[from_partition]; + from_partition++; + raw_bits_per_partition[to_partition] = max(m, raw_bits_per_partition[from_partition]); + from_partition++; + to_partition++; + } + } +} + +#ifdef EXACT_RICE_BITS_CALCULATION +static FLaC__INLINE unsigned count_rice_bits_in_partition_( + const unsigned rice_parameter, + const unsigned partition_samples, + const FLAC__int32 *residual +) +{ + unsigned i, partition_bits = + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ + (1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */ + ; + for(i = 0; i < partition_samples; i++) + partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter ); + return partition_bits; +} +#else +static FLaC__INLINE unsigned count_rice_bits_in_partition_( + const unsigned rice_parameter, + const unsigned partition_samples, + const FLAC__uint64 abs_residual_partition_sum +) +{ + return + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ + (1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */ + ( + rice_parameter? + (unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */ + : (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */ + ) + - (partition_samples >> 1) + /* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum. + * The actual number of bits used is closer to the sum(for all i in the partition) of abs(residual[i])>>(rice_parameter-1) + * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out. + * So the subtraction term tries to guess how many extra bits were contributed. + * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample. + */ + ; +} +#endif + +FLAC__bool set_partitioned_rice_( +#ifdef EXACT_RICE_BITS_CALCULATION + const FLAC__int32 residual[], +#endif + const FLAC__uint64 abs_residual_partition_sums[], + const unsigned raw_bits_per_partition[], + const unsigned residual_samples, + const unsigned predictor_order, + const unsigned suggested_rice_parameter, + const unsigned rice_parameter_limit, + const unsigned rice_parameter_search_dist, + const unsigned partition_order, + const FLAC__bool search_for_escapes, + FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, + unsigned *bits +) +{ + unsigned rice_parameter, partition_bits; + unsigned best_partition_bits, best_rice_parameter = 0; + unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; + unsigned *parameters, *raw_bits; +#ifdef ENABLE_RICE_PARAMETER_SEARCH + unsigned min_rice_parameter, max_rice_parameter; +#else + (void)rice_parameter_search_dist; +#endif + + FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); + FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); + + FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, partition_order)); + parameters = partitioned_rice_contents->parameters; + raw_bits = partitioned_rice_contents->raw_bits; + + if(partition_order == 0) { + best_partition_bits = (unsigned)(-1); +#ifdef ENABLE_RICE_PARAMETER_SEARCH + if(rice_parameter_search_dist) { + if(suggested_rice_parameter < rice_parameter_search_dist) + min_rice_parameter = 0; + else + min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist; + max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist; + if(max_rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1); +#endif + max_rice_parameter = rice_parameter_limit - 1; + } + } + else + min_rice_parameter = max_rice_parameter = suggested_rice_parameter; + + for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { +#else + rice_parameter = suggested_rice_parameter; +#endif +#ifdef EXACT_RICE_BITS_CALCULATION + partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual); +#else + partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]); +#endif + if(partition_bits < best_partition_bits) { + best_rice_parameter = rice_parameter; + best_partition_bits = partition_bits; + } +#ifdef ENABLE_RICE_PARAMETER_SEARCH + } +#endif + if(search_for_escapes) { + partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples; + if(partition_bits <= best_partition_bits) { + raw_bits[0] = raw_bits_per_partition[0]; + best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ + best_partition_bits = partition_bits; + } + else + raw_bits[0] = 0; + } + parameters[0] = best_rice_parameter; + bits_ += best_partition_bits; + } + else { + unsigned partition, residual_sample; + unsigned partition_samples; + FLAC__uint64 mean, k; + const unsigned partitions = 1u << partition_order; + for(partition = residual_sample = 0; partition < partitions; partition++) { + partition_samples = (residual_samples+predictor_order) >> partition_order; + if(partition == 0) { + if(partition_samples <= predictor_order) + return false; + else + partition_samples -= predictor_order; + } + mean = abs_residual_partition_sums[partition]; + /* we are basically calculating the size in bits of the + * average residual magnitude in the partition: + * rice_parameter = floor(log2(mean/partition_samples)) + * 'mean' is not a good name for the variable, it is + * actually the sum of magnitudes of all residual values + * in the partition, so the actual mean is + * mean/partition_samples + */ + for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) + ; + if(rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); +#endif + rice_parameter = rice_parameter_limit - 1; + } + + best_partition_bits = (unsigned)(-1); +#ifdef ENABLE_RICE_PARAMETER_SEARCH + if(rice_parameter_search_dist) { + if(rice_parameter < rice_parameter_search_dist) + min_rice_parameter = 0; + else + min_rice_parameter = rice_parameter - rice_parameter_search_dist; + max_rice_parameter = rice_parameter + rice_parameter_search_dist; + if(max_rice_parameter >= rice_parameter_limit) { +#ifdef DEBUG_VERBOSE + fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1); +#endif + max_rice_parameter = rice_parameter_limit - 1; + } + } + else + min_rice_parameter = max_rice_parameter = rice_parameter; + + for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { +#endif +#ifdef EXACT_RICE_BITS_CALCULATION + partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample); +#else + partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]); +#endif + if(partition_bits < best_partition_bits) { + best_rice_parameter = rice_parameter; + best_partition_bits = partition_bits; + } +#ifdef ENABLE_RICE_PARAMETER_SEARCH + } +#endif + if(search_for_escapes) { + partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples; + if(partition_bits <= best_partition_bits) { + raw_bits[partition] = raw_bits_per_partition[partition]; + best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ + best_partition_bits = partition_bits; + } + else + raw_bits[partition] = 0; + } + parameters[partition] = best_rice_parameter; + bits_ += best_partition_bits; + residual_sample += partition_samples; + } + } + + *bits = bits_; + return true; +} + +unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples) +{ + unsigned i, shift; + FLAC__int32 x = 0; + + for(i = 0; i < samples && !(x&1); i++) + x |= signal[i]; + + if(x == 0) { + shift = 0; + } + else { + for(shift = 0; !(x&1); shift++) + x >>= 1; + } + + if(shift > 0) { + for(i = 0; i < samples; i++) + signal[i] >>= shift; + } + + return shift; +} + +void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples) +{ + unsigned channel; + + for(channel = 0; channel < channels; channel++) + memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples); + + fifo->tail += wide_samples; + + FLAC__ASSERT(fifo->tail <= fifo->size); +} + +void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples) +{ + unsigned channel; + unsigned sample, wide_sample; + unsigned tail = fifo->tail; + + sample = input_offset * channels; + for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) { + for(channel = 0; channel < channels; channel++) + fifo->data[channel][tail] = input[sample++]; + tail++; + } + fifo->tail = tail; + + FLAC__ASSERT(fifo->tail <= fifo->size); +} + +FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; + const size_t encoded_bytes = encoder->private_->verify.output.bytes; + (void)decoder; + + if(encoder->private_->verify.needs_magic_hack) { + FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH); + *bytes = FLAC__STREAM_SYNC_LENGTH; + memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes); + encoder->private_->verify.needs_magic_hack = false; + } + else { + if(encoded_bytes == 0) { + /* + * If we get here, a FIFO underflow has occurred, + * which means there is a bug somewhere. + */ + FLAC__ASSERT(0); + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + else if(encoded_bytes < *bytes) + *bytes = encoded_bytes; + memcpy(buffer, encoder->private_->verify.output.data, *bytes); + encoder->private_->verify.output.data += *bytes; + encoder->private_->verify.output.bytes -= *bytes; + } + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data; + unsigned channel; + const unsigned channels = frame->header.channels; + const unsigned blocksize = frame->header.blocksize; + const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize; + + (void)decoder; + + for(channel = 0; channel < channels; channel++) { + if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) { + unsigned i, sample = 0; + FLAC__int32 expect = 0, got = 0; + + for(i = 0; i < blocksize; i++) { + if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) { + sample = i; + expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i]; + got = (FLAC__int32)buffer[channel][i]; + break; + } + } + FLAC__ASSERT(i < blocksize); + FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); + encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample; + encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize); + encoder->private_->verify.error_stats.channel = channel; + encoder->private_->verify.error_stats.sample = sample; + encoder->private_->verify.error_stats.expected = expect; + encoder->private_->verify.error_stats.got = got; + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; + return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; + } + } + /* dequeue the frame from the fifo */ + encoder->private_->verify.input_fifo.tail -= blocksize; + FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_); + for(channel = 0; channel < channels; channel++) + memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0])); + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + (void)decoder, (void)metadata, (void)client_data; +} + +void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; + (void)decoder, (void)status; + encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; +} + +FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + (void)client_data; + + *bytes = fread(buffer, 1, *bytes, encoder->private_->file); + if (*bytes == 0) { + if (feof(encoder->private_->file)) + return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; + else if (ferror(encoder->private_->file)) + return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; + } + return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; +} + +FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) +{ + (void)client_data; + + if(fseeko(encoder->private_->file, (off_t)absolute_byte_offset, SEEK_SET) < 0) + return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; + else + return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; +} + +FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) +{ + off_t offset; + + (void)client_data; + + offset = ftello(encoder->private_->file); + + if(offset < 0) { + return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; + } + else { + *absolute_byte_offset = (FLAC__uint64)offset; + return FLAC__STREAM_ENCODER_TELL_STATUS_OK; + } +} + +#ifdef FLAC__VALGRIND_TESTING +static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + size_t ret = fwrite(ptr, size, nmemb, stream); + if(!ferror(stream)) + fflush(stream); + return ret; +} +#else +#define local__fwrite fwrite +#endif + +FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) +{ + (void)client_data, (void)current_frame; + + if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) { + FLAC__bool call_it = 0 != encoder->private_->progress_callback && ( +#if FLAC__HAS_OGG + /* We would like to be able to use 'samples > 0' in the + * clause here but currently because of the nature of our + * Ogg writing implementation, 'samples' is always 0 (see + * ogg_encoder_aspect.c). The downside is extra progress + * callbacks. + */ + encoder->private_->is_ogg? true : +#endif + samples > 0 + ); + if(call_it) { + /* NOTE: We have to add +bytes, +samples, and +1 to the stats + * because at this point in the callback chain, the stats + * have not been updated. Only after we return and control + * gets back to write_frame_() are the stats updated + */ + encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data); + } + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; + } + else + return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; +} + +/* + * This will forcibly set stdout to binary mode (for OSes that require it) + */ +FILE *get_binary_stdout_(void) +{ +#if 0 + /* if something breaks here it is probably due to the presence or + * absence of an underscore before the identifiers 'setmode', + * 'fileno', and/or 'O_BINARY'; check your system header files. + */ +#if defined _MSC_VER || defined __MINGW32__ + _setmode(_fileno(stdout), _O_BINARY); +#elif defined __CYGWIN__ + /* almost certainly not needed for any modern Cygwin, but let's be safe... */ + setmode(_fileno(stdout), _O_BINARY); +#elif defined __EMX__ + setmode(fileno(stdout), O_BINARY); +#endif +#endif + return stdout; +} diff -Nru mame-0.144/src/lib/libflac/libflac/stream_encoder_framing.c mame-0.145/src/lib/libflac/libflac/stream_encoder_framing.c --- mame-0.144/src/lib/libflac/libflac/stream_encoder_framing.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac/stream_encoder_framing.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,553 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include /* for strlen() */ +#include "private/stream_encoder_framing.h" +#include "private/crc.h" +#include "flac/assert.h" + +#ifdef max +#undef max +#endif +#define max(x,y) ((x)>(y)?(x):(y)) + +static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); +static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended); + +FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) +{ + unsigned i, j; + const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); + + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) + return false; + + /* + * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string + */ + i = metadata->length; + if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { + FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); + i -= metadata->data.vorbis_comment.vendor_string.length; + i += vendor_string_length; + } + FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) + return false; + + switch(metadata->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) + return false; + FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.channels > 0); + FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) + return false; + FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); + FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) + return false; + break; + case FLAC__METADATA_TYPE_PADDING: + if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) + return false; + break; + case FLAC__METADATA_TYPE_APPLICATION: + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) + return false; + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + for(i = 0; i < metadata->data.seek_table.num_points; i++) { + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) + return false; + } + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) + return false; + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) + return false; + for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { + if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) + return false; + } + break; + case FLAC__METADATA_TYPE_CUESHEET: + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) + return false; + if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) + return false; + for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { + const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; + + if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) + return false; + FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) + return false; + for(j = 0; j < track->num_indices; j++) { + const FLAC__StreamMetadata_CueSheet_Index *index = track->indices + j; + + if(!FLAC__bitwriter_write_raw_uint64(bw, index->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, index->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) + return false; + if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) + return false; + } + } + break; + case FLAC__METADATA_TYPE_PICTURE: + { + size_t len; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) + return false; + len = strlen(metadata->data.picture.mime_type); + if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) + return false; + len = strlen((const char *)metadata->data.picture.description); + if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) + return false; + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) + return false; + } + break; + default: + if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) + return false; + break; + } + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); + return true; +} + +FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) +{ + unsigned u, blocksize_hint, sample_rate_hint; + FLAC__byte crc; + + FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, (header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER)? 0 : 1, FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN)) + return false; + + FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); + /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ + FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); + blocksize_hint = 0; + switch(header->blocksize) { + case 192: u = 1; break; + case 576: u = 2; break; + case 1152: u = 3; break; + case 2304: u = 4; break; + case 4608: u = 5; break; + case 256: u = 8; break; + case 512: u = 9; break; + case 1024: u = 10; break; + case 2048: u = 11; break; + case 4096: u = 12; break; + case 8192: u = 13; break; + case 16384: u = 14; break; + case 32768: u = 15; break; + default: + if(header->blocksize <= 0x100) + blocksize_hint = u = 6; + else + blocksize_hint = u = 7; + break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) + return false; + + FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); + sample_rate_hint = 0; + switch(header->sample_rate) { + case 88200: u = 1; break; + case 176400: u = 2; break; + case 192000: u = 3; break; + case 8000: u = 4; break; + case 16000: u = 5; break; + case 22050: u = 6; break; + case 24000: u = 7; break; + case 32000: u = 8; break; + case 44100: u = 9; break; + case 48000: u = 10; break; + case 96000: u = 11; break; + default: + if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) + sample_rate_hint = u = 12; + else if(header->sample_rate % 10 == 0) + sample_rate_hint = u = 14; + else if(header->sample_rate <= 0xffff) + sample_rate_hint = u = 13; + else + u = 0; + break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) + return false; + + FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); + switch(header->channel_assignment) { + case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: + u = header->channels - 1; + break; + case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 8; + break; + case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 9; + break; + case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: + FLAC__ASSERT(header->channels == 2); + u = 10; + break; + default: + FLAC__ASSERT(0); + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) + return false; + + FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); + switch(header->bits_per_sample) { + case 8 : u = 1; break; + case 12: u = 2; break; + case 16: u = 4; break; + case 20: u = 5; break; + case 24: u = 6; break; + default: u = 0; break; + } + if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) + return false; + + if(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { + if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) + return false; + } + else { + if(!FLAC__bitwriter_write_utf8_uint64(bw, header->number.sample_number)) + return false; + } + + if(blocksize_hint) + if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) + return false; + + switch(sample_rate_hint) { + case 12: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) + return false; + break; + case 13: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) + return false; + break; + case 14: + if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) + return false; + break; + } + + /* write the CRC */ + if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) + return false; + + return true; +} + +FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + FLAC__bool ok; + + ok = + FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && + (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && + FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) + ; + + return ok; +} + +FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) + return false; + + if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) + return false; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!add_residual_partitioned_rice_( + bw, + subframe->residual, + residual_samples, + subframe->order, + subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, + subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, + subframe->entropy_coding_method.data.partitioned_rice.order, + /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 + )) + return false; + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) + return false; + + if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) + return false; + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) + return false; + for(i = 0; i < subframe->order; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) + return false; + + if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) + return false; + switch(subframe->entropy_coding_method.type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!add_residual_partitioned_rice_( + bw, + subframe->residual, + residual_samples, + subframe->order, + subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, + subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, + subframe->entropy_coding_method.data.partitioned_rice.order, + /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 + )) + return false; + break; + default: + FLAC__ASSERT(0); + } + + return true; +} + +FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) +{ + unsigned i; + const FLAC__int32 *signal = subframe->data; + + if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) + return false; + if(wasted_bits) + if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) + return false; + + for(i = 0; i < samples; i++) + if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) + return false; + + return true; +} + +FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) +{ + if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) + return false; + switch(method->type) { + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: + case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: + if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) + return false; + break; + default: + FLAC__ASSERT(0); + } + return true; +} + +FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended) +{ + const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; + const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; + + if(partition_order == 0) { + unsigned i; + + if(raw_bits[0] == 0) { + if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], plen)) + return false; + if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) + return false; + } + else { + FLAC__ASSERT(rice_parameters[0] == 0); + if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) + return false; + if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) + return false; + for(i = 0; i < residual_samples; i++) { + if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) + return false; + } + } + return true; + } + else { + unsigned i, j, k = 0, k_last = 0; + unsigned partition_samples; + const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; + for(i = 0; i < (1u< +#endif + +#include +#include "flac/assert.h" +#include "flac/format.h" +#include "private/window.h" + +#ifndef FLAC__INTEGER_ONLY_LIBRARY + +#ifndef M_PI +/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ +#define M_PI 3.14159265358979323846 +#endif + + +void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + if (L & 1) { + for (n = 0; n <= N/2; n++) + window[n] = 2.0f * n / (float)N; + for (; n <= N; n++) + window[n] = 2.0f - 2.0f * n / (float)N; + } + else { + for (n = 0; n <= L/2-1; n++) + window[n] = 2.0f * n / (float)N; + for (; n <= N; n++) + window[n] = 2.0f - 2.0f * (N-n) / (float)N; + } +} + +void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N+0.5f) + 0.38f * cos(2.0f * M_PI * ((float)n/(float)N+0.5f))); +} + +void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.42f - 0.5f * cos(2.0f * M_PI * n / N) + 0.08f * cos(4.0f * M_PI * n / N)); +} + +/* 4-term -92dB side-lobe */ +void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n <= N; n++) + window[n] = (FLAC__real)(0.35875f - 0.48829f * cos(2.0f * M_PI * n / N) + 0.14128f * cos(4.0f * M_PI * n / N) - 0.01168f * cos(6.0f * M_PI * n / N)); +} + +void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + double k = ((double)n - N2) / N2; + k = 1.0f - k * k; + window[n] = (FLAC__real)(k * k); + } +} + +void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(1.0f - 1.93f * cos(2.0f * M_PI * n / N) + 1.29f * cos(4.0f * M_PI * n / N) - 0.388f * cos(6.0f * M_PI * n / N) + 0.0322f * cos(8.0f * M_PI * n / N)); +} + +void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / (stddev * N2); + window[n] = (FLAC__real)exp(-0.5f * k * k); + } +} + +void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.54f - 0.46f * cos(2.0f * M_PI * n / N)); +} + +void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(2.0f * M_PI * n / N)); +} + +void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.402f - 0.498f * cos(2.0f * M_PI * n / N) + 0.098f * cos(4.0f * M_PI * n / N) - 0.001f * cos(6.0f * M_PI * n / N)); +} + +void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = (FLAC__real)(0.3635819f - 0.4891775f*cos(2.0f*M_PI*n/N) + 0.1365995f*cos(4.0f*M_PI*n/N) - 0.0106411f*cos(6.0f*M_PI*n/N)); +} + +void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) +{ + FLAC__int32 n; + + for (n = 0; n < L; n++) + window[n] = 1.0f; +} + +void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) +{ + FLAC__int32 n; + + if (L & 1) { + for (n = 1; n <= L+1/2; n++) + window[n-1] = 2.0f * n / ((float)L + 1.0f); + for (; n <= L; n++) + window[n-1] = - (float)(2 * (L - n + 1)) / ((float)L + 1.0f); + } + else { + for (n = 1; n <= L/2; n++) + window[n-1] = 2.0f * n / (float)L; + for (; n <= L; n++) + window[n-1] = ((float)(2 * (L - n)) + 1.0f) / (float)L; + } +} + +void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) +{ + if (p <= 0.0) + FLAC__window_rectangle(window, L); + else if (p >= 1.0) + FLAC__window_hann(window, L); + else { + const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; + FLAC__int32 n; + /* start with rectangle... */ + FLAC__window_rectangle(window, L); + /* ...replace ends with hann */ + if (Np > 0) { + for (n = 0; n <= Np; n++) { + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * n / Np)); + window[L-Np-1+n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * (n+Np) / Np)); + } + } + } +} + +void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) +{ + const FLAC__int32 N = L - 1; + const double N2 = (double)N / 2.; + FLAC__int32 n; + + for (n = 0; n <= N; n++) { + const double k = ((double)n - N2) / N2; + window[n] = (FLAC__real)(1.0f - k * k); + } +} + +#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff -Nru mame-0.144/src/lib/libflac/libflac++/metadata.cpp mame-0.145/src/lib/libflac/libflac++/metadata.cpp --- mame-0.144/src/lib/libflac/libflac++/metadata.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac++/metadata.cpp 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1589 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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. + */ + +#define __STDC_LIMIT_MACROS 1 /* otherwise SIZE_MAX is not defined for c++ */ +#include "share/alloc.h" +#include "flac++/metadata.h" +#include "flac/assert.h" +#include // for malloc(), free() +#include // for memcpy() etc. + +#ifdef _MSC_VER +// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning) +#pragma warning ( disable : 4800 ) +#endif + +namespace FLAC { + namespace Metadata { + + // local utility routines + + namespace local { + + Prototype *construct_block(::FLAC__StreamMetadata *object) + { + Prototype *ret = 0; + switch(object->type) { + case FLAC__METADATA_TYPE_STREAMINFO: + ret = new StreamInfo(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_PADDING: + ret = new Padding(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_APPLICATION: + ret = new Application(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_SEEKTABLE: + ret = new SeekTable(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + ret = new VorbisComment(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_CUESHEET: + ret = new CueSheet(object, /*copy=*/false); + break; + case FLAC__METADATA_TYPE_PICTURE: + ret = new Picture(object, /*copy=*/false); + break; + default: + ret = new Unknown(object, /*copy=*/false); + break; + } + return ret; + } + + } + + FLACPP_API Prototype *clone(const Prototype *object) + { + FLAC__ASSERT(0 != object); + + const StreamInfo *streaminfo = dynamic_cast(object); + const Padding *padding = dynamic_cast(object); + const Application *application = dynamic_cast(object); + const SeekTable *seektable = dynamic_cast(object); + const VorbisComment *vorbiscomment = dynamic_cast(object); + const CueSheet *cuesheet = dynamic_cast(object); + const Picture *picture = dynamic_cast(object); + const Unknown *unknown = dynamic_cast(object); + + if(0 != streaminfo) + return new StreamInfo(*streaminfo); + else if(0 != padding) + return new Padding(*padding); + else if(0 != application) + return new Application(*application); + else if(0 != seektable) + return new SeekTable(*seektable); + else if(0 != vorbiscomment) + return new VorbisComment(*vorbiscomment); + else if(0 != cuesheet) + return new CueSheet(*cuesheet); + else if(0 != picture) + return new Picture(*picture); + else if(0 != unknown) + return new Unknown(*unknown); + else { + FLAC__ASSERT(0); + return 0; + } + } + + // + // Prototype + // + + Prototype::Prototype(const Prototype &object): + object_(::FLAC__metadata_object_clone(object.object_)), + is_reference_(false) + { + FLAC__ASSERT(object.is_valid()); + } + + Prototype::Prototype(const ::FLAC__StreamMetadata &object): + object_(::FLAC__metadata_object_clone(&object)), + is_reference_(false) + { + } + + Prototype::Prototype(const ::FLAC__StreamMetadata *object): + object_(::FLAC__metadata_object_clone(object)), + is_reference_(false) + { + FLAC__ASSERT(0 != object); + } + + Prototype::Prototype(::FLAC__StreamMetadata *object, bool copy): + object_(copy? ::FLAC__metadata_object_clone(object) : object), + is_reference_(false) + { + FLAC__ASSERT(0 != object); + } + + Prototype::~Prototype() + { + clear(); + } + + void Prototype::clear() + { + if(0 != object_ && !is_reference_) + FLAC__metadata_object_delete(object_); + object_ = 0; + } + + Prototype &Prototype::operator=(const Prototype &object) + { + FLAC__ASSERT(object.is_valid()); + clear(); + is_reference_ = false; + object_ = ::FLAC__metadata_object_clone(object.object_); + return *this; + } + + Prototype &Prototype::operator=(const ::FLAC__StreamMetadata &object) + { + clear(); + is_reference_ = false; + object_ = ::FLAC__metadata_object_clone(&object); + return *this; + } + + Prototype &Prototype::operator=(const ::FLAC__StreamMetadata *object) + { + FLAC__ASSERT(0 != object); + clear(); + is_reference_ = false; + object_ = ::FLAC__metadata_object_clone(object); + return *this; + } + + Prototype &Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy) + { + FLAC__ASSERT(0 != object); + clear(); + object_ = (copy? ::FLAC__metadata_object_clone(object) : object); + is_reference_ = false; + return *this; + } + + bool Prototype::get_is_last() const + { + FLAC__ASSERT(is_valid()); + return (bool)object_->is_last; + } + + FLAC__MetadataType Prototype::get_type() const + { + FLAC__ASSERT(is_valid()); + return object_->type; + } + + unsigned Prototype::get_length() const + { + FLAC__ASSERT(is_valid()); + return object_->length; + } + + void Prototype::set_is_last(bool value) + { + FLAC__ASSERT(is_valid()); + object_->is_last = value; + } + + + // + // StreamInfo + // + + StreamInfo::StreamInfo(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_STREAMINFO), /*copy=*/false) + { } + + StreamInfo::~StreamInfo() + { } + + unsigned StreamInfo::get_min_blocksize() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.min_blocksize; + } + + unsigned StreamInfo::get_max_blocksize() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.max_blocksize; + } + + unsigned StreamInfo::get_min_framesize() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.min_framesize; + } + + unsigned StreamInfo::get_max_framesize() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.max_framesize; + } + + unsigned StreamInfo::get_sample_rate() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.sample_rate; + } + + unsigned StreamInfo::get_channels() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.channels; + } + + unsigned StreamInfo::get_bits_per_sample() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.bits_per_sample; + } + + FLAC__uint64 StreamInfo::get_total_samples() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.total_samples; + } + + const FLAC__byte *StreamInfo::get_md5sum() const + { + FLAC__ASSERT(is_valid()); + return object_->data.stream_info.md5sum; + } + + void StreamInfo::set_min_blocksize(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value >= FLAC__MIN_BLOCK_SIZE); + FLAC__ASSERT(value <= FLAC__MAX_BLOCK_SIZE); + object_->data.stream_info.min_blocksize = value; + } + + void StreamInfo::set_max_blocksize(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value >= FLAC__MIN_BLOCK_SIZE); + FLAC__ASSERT(value <= FLAC__MAX_BLOCK_SIZE); + object_->data.stream_info.max_blocksize = value; + } + + void StreamInfo::set_min_framesize(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); + object_->data.stream_info.min_framesize = value; + } + + void StreamInfo::set_max_framesize(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); + object_->data.stream_info.max_framesize = value; + } + + void StreamInfo::set_sample_rate(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(FLAC__format_sample_rate_is_valid(value)); + object_->data.stream_info.sample_rate = value; + } + + void StreamInfo::set_channels(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value > 0); + FLAC__ASSERT(value <= FLAC__MAX_CHANNELS); + object_->data.stream_info.channels = value; + } + + void StreamInfo::set_bits_per_sample(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value >= FLAC__MIN_BITS_PER_SAMPLE); + FLAC__ASSERT(value <= FLAC__MAX_BITS_PER_SAMPLE); + object_->data.stream_info.bits_per_sample = value; + } + + void StreamInfo::set_total_samples(FLAC__uint64 value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value < (((FLAC__uint64)1) << FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)); + object_->data.stream_info.total_samples = value; + } + + void StreamInfo::set_md5sum(const FLAC__byte value[16]) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != value); + memcpy(object_->data.stream_info.md5sum, value, 16); + } + + + // + // Padding + // + + Padding::Padding(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING), /*copy=*/false) + { } + + Padding::~Padding() + { } + + void Padding::set_length(unsigned length) + { + FLAC__ASSERT(is_valid()); + object_->length = length; + } + + + // + // Application + // + + Application::Application(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION), /*copy=*/false) + { } + + Application::~Application() + { } + + const FLAC__byte *Application::get_id() const + { + FLAC__ASSERT(is_valid()); + return object_->data.application.id; + } + + const FLAC__byte *Application::get_data() const + { + FLAC__ASSERT(is_valid()); + return object_->data.application.data; + } + + void Application::set_id(const FLAC__byte value[4]) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != value); + memcpy(object_->data.application.id, value, 4); + } + + bool Application::set_data(const FLAC__byte *data, unsigned length) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_application_set_data(object_, (FLAC__byte*)data, length, true); + } + + bool Application::set_data(FLAC__byte *data, unsigned length, bool copy) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_application_set_data(object_, data, length, copy); + } + + + // + // SeekTable + // + + SeekTable::SeekTable(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE), /*copy=*/false) + { } + + SeekTable::~SeekTable() + { } + + unsigned SeekTable::get_num_points() const + { + FLAC__ASSERT(is_valid()); + return object_->data.seek_table.num_points; + } + + ::FLAC__StreamMetadata_SeekPoint SeekTable::get_point(unsigned index) const + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.seek_table.num_points); + return object_->data.seek_table.points[index]; + } + + void SeekTable::set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.seek_table.num_points); + ::FLAC__metadata_object_seektable_set_point(object_, index, point); + } + + bool SeekTable::insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index <= object_->data.seek_table.num_points); + return (bool)::FLAC__metadata_object_seektable_insert_point(object_, index, point); + } + + bool SeekTable::delete_point(unsigned index) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.seek_table.num_points); + return (bool)::FLAC__metadata_object_seektable_delete_point(object_, index); + } + + bool SeekTable::is_legal() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_seektable_is_legal(object_); + } + + + // + // VorbisComment::Entry + // + + VorbisComment::Entry::Entry() + { + zero(); + } + + VorbisComment::Entry::Entry(const char *field, unsigned field_length) + { + zero(); + construct(field, field_length); + } + + VorbisComment::Entry::Entry(const char *field) + { + zero(); + construct(field); + } + + VorbisComment::Entry::Entry(const char *field_name, const char *field_value, unsigned field_value_length) + { + zero(); + construct(field_name, field_value, field_value_length); + } + + VorbisComment::Entry::Entry(const char *field_name, const char *field_value) + { + zero(); + construct(field_name, field_value); + } + + VorbisComment::Entry::Entry(const Entry &entry) + { + FLAC__ASSERT(entry.is_valid()); + zero(); + construct((const char *)entry.entry_.entry, entry.entry_.length); + } + + VorbisComment::Entry &VorbisComment::Entry::operator=(const Entry &entry) + { + FLAC__ASSERT(entry.is_valid()); + clear(); + construct((const char *)entry.entry_.entry, entry.entry_.length); + return *this; + } + + VorbisComment::Entry::~Entry() + { + clear(); + } + + bool VorbisComment::Entry::is_valid() const + { + return is_valid_; + } + + unsigned VorbisComment::Entry::get_field_length() const + { + FLAC__ASSERT(is_valid()); + return entry_.length; + } + + unsigned VorbisComment::Entry::get_field_name_length() const + { + FLAC__ASSERT(is_valid()); + return field_name_length_; + } + + unsigned VorbisComment::Entry::get_field_value_length() const + { + FLAC__ASSERT(is_valid()); + return field_value_length_; + } + + ::FLAC__StreamMetadata_VorbisComment_Entry VorbisComment::Entry::get_entry() const + { + FLAC__ASSERT(is_valid()); + return entry_; + } + + const char *VorbisComment::Entry::get_field() const + { + FLAC__ASSERT(is_valid()); + return (const char *)entry_.entry; + } + + const char *VorbisComment::Entry::get_field_name() const + { + FLAC__ASSERT(is_valid()); + return field_name_; + } + + const char *VorbisComment::Entry::get_field_value() const + { + FLAC__ASSERT(is_valid()); + return field_value_; + } + + bool VorbisComment::Entry::set_field(const char *field, unsigned field_length) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != field); + + if(!::FLAC__format_vorbiscomment_entry_is_legal((const ::FLAC__byte*)field, field_length)) + return is_valid_ = false; + + clear_entry(); + + if(0 == (entry_.entry = (FLAC__byte*)safe_malloc_add_2op_(field_length, /*+*/1))) { + is_valid_ = false; + } + else { + entry_.length = field_length; + memcpy(entry_.entry, field, field_length); + entry_.entry[field_length] = '\0'; + (void) parse_field(); + } + + return is_valid_; + } + + bool VorbisComment::Entry::set_field(const char *field) + { + return set_field(field, strlen(field)); + } + + bool VorbisComment::Entry::set_field_name(const char *field_name) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != field_name); + + if(!::FLAC__format_vorbiscomment_entry_name_is_legal(field_name)) + return is_valid_ = false; + + clear_field_name(); + + if(0 == (field_name_ = strdup(field_name))) { + is_valid_ = false; + } + else { + field_name_length_ = strlen(field_name_); + compose_field(); + } + + return is_valid_; + } + + bool VorbisComment::Entry::set_field_value(const char *field_value, unsigned field_value_length) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != field_value); + + if(!::FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte*)field_value, field_value_length)) + return is_valid_ = false; + + clear_field_value(); + + if(0 == (field_value_ = (char *)safe_malloc_add_2op_(field_value_length, /*+*/1))) { + is_valid_ = false; + } + else { + field_value_length_ = field_value_length; + memcpy(field_value_, field_value, field_value_length); + field_value_[field_value_length] = '\0'; + compose_field(); + } + + return is_valid_; + } + + bool VorbisComment::Entry::set_field_value(const char *field_value) + { + return set_field_value(field_value, strlen(field_value)); + } + + void VorbisComment::Entry::zero() + { + is_valid_ = true; + entry_.length = 0; + entry_.entry = 0; + field_name_ = 0; + field_name_length_ = 0; + field_value_ = 0; + field_value_length_ = 0; + } + + void VorbisComment::Entry::clear() + { + clear_entry(); + clear_field_name(); + clear_field_value(); + is_valid_ = true; + } + + void VorbisComment::Entry::clear_entry() + { + if(0 != entry_.entry) { + free(entry_.entry); + entry_.entry = 0; + entry_.length = 0; + } + } + + void VorbisComment::Entry::clear_field_name() + { + if(0 != field_name_) { + free(field_name_); + field_name_ = 0; + field_name_length_ = 0; + } + } + + void VorbisComment::Entry::clear_field_value() + { + if(0 != field_value_) { + free(field_value_); + field_value_ = 0; + field_value_length_ = 0; + } + } + + void VorbisComment::Entry::construct(const char *field, unsigned field_length) + { + if(set_field(field, field_length)) + parse_field(); + } + + void VorbisComment::Entry::construct(const char *field) + { + construct(field, strlen(field)); + } + + void VorbisComment::Entry::construct(const char *field_name, const char *field_value, unsigned field_value_length) + { + if(set_field_name(field_name) && set_field_value(field_value, field_value_length)) + compose_field(); + } + + void VorbisComment::Entry::construct(const char *field_name, const char *field_value) + { + construct(field_name, field_value, strlen(field_value)); + } + + void VorbisComment::Entry::compose_field() + { + clear_entry(); + + if(0 == (entry_.entry = (FLAC__byte*)safe_malloc_add_4op_(field_name_length_, /*+*/1, /*+*/field_value_length_, /*+*/1))) { + is_valid_ = false; + } + else { + memcpy(entry_.entry, field_name_, field_name_length_); + entry_.length += field_name_length_; + memcpy(entry_.entry + entry_.length, "=", 1); + entry_.length += 1; + memcpy(entry_.entry + entry_.length, field_value_, field_value_length_); + entry_.length += field_value_length_; + entry_.entry[entry_.length] = '\0'; + is_valid_ = true; + } + } + + void VorbisComment::Entry::parse_field() + { + clear_field_name(); + clear_field_value(); + + const char *p = (const char *)memchr(entry_.entry, '=', entry_.length); + + if(0 == p) + p = (const char *)entry_.entry + entry_.length; + + field_name_length_ = (unsigned)(p - (const char *)entry_.entry); + if(0 == (field_name_ = (char *)safe_malloc_add_2op_(field_name_length_, /*+*/1))) { // +1 for the trailing \0 + is_valid_ = false; + return; + } + memcpy(field_name_, entry_.entry, field_name_length_); + field_name_[field_name_length_] = '\0'; + + if(entry_.length - field_name_length_ == 0) { + field_value_length_ = 0; + if(0 == (field_value_ = (char *)safe_malloc_(0))) { + is_valid_ = false; + return; + } + } + else { + field_value_length_ = entry_.length - field_name_length_ - 1; + if(0 == (field_value_ = (char *)safe_malloc_add_2op_(field_value_length_, /*+*/1))) { // +1 for the trailing \0 + is_valid_ = false; + return; + } + memcpy(field_value_, ++p, field_value_length_); + field_value_[field_value_length_] = '\0'; + } + + is_valid_ = true; + } + + + // + // VorbisComment + // + + VorbisComment::VorbisComment(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT), /*copy=*/false) + { } + + VorbisComment::~VorbisComment() + { } + + unsigned VorbisComment::get_num_comments() const + { + FLAC__ASSERT(is_valid()); + return object_->data.vorbis_comment.num_comments; + } + + const FLAC__byte *VorbisComment::get_vendor_string() const + { + FLAC__ASSERT(is_valid()); + return object_->data.vorbis_comment.vendor_string.entry; + } + + VorbisComment::Entry VorbisComment::get_comment(unsigned index) const + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments); + return Entry((const char *)object_->data.vorbis_comment.comments[index].entry, object_->data.vorbis_comment.comments[index].length); + } + + bool VorbisComment::set_vendor_string(const FLAC__byte *string) + { + FLAC__ASSERT(is_valid()); + // vendor_string is a special kind of entry + const ::FLAC__StreamMetadata_VorbisComment_Entry vendor_string = { strlen((const char *)string), (FLAC__byte*)string }; // we can cheat on const-ness because we make a copy below: + return (bool)::FLAC__metadata_object_vorbiscomment_set_vendor_string(object_, vendor_string, /*copy=*/true); + } + + bool VorbisComment::set_comment(unsigned index, const VorbisComment::Entry &entry) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments); + return (bool)::FLAC__metadata_object_vorbiscomment_set_comment(object_, index, entry.get_entry(), /*copy=*/true); + } + + bool VorbisComment::insert_comment(unsigned index, const VorbisComment::Entry &entry) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index <= object_->data.vorbis_comment.num_comments); + return (bool)::FLAC__metadata_object_vorbiscomment_insert_comment(object_, index, entry.get_entry(), /*copy=*/true); + } + + bool VorbisComment::append_comment(const VorbisComment::Entry &entry) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_vorbiscomment_append_comment(object_, entry.get_entry(), /*copy=*/true); + } + + bool VorbisComment::delete_comment(unsigned index) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments); + return (bool)::FLAC__metadata_object_vorbiscomment_delete_comment(object_, index); + } + + + // + // CueSheet::Track + // + + CueSheet::Track::Track(): + object_(::FLAC__metadata_object_cuesheet_track_new()) + { } + + CueSheet::Track::Track(const ::FLAC__StreamMetadata_CueSheet_Track *track): + object_(::FLAC__metadata_object_cuesheet_track_clone(track)) + { } + + CueSheet::Track::Track(const Track &track): + object_(::FLAC__metadata_object_cuesheet_track_clone(track.object_)) + { } + + CueSheet::Track &CueSheet::Track::operator=(const Track &track) + { + if(0 != object_) + ::FLAC__metadata_object_cuesheet_track_delete(object_); + object_ = ::FLAC__metadata_object_cuesheet_track_clone(track.object_); + return *this; + } + + CueSheet::Track::~Track() + { + if(0 != object_) + ::FLAC__metadata_object_cuesheet_track_delete(object_); + } + + bool CueSheet::Track::is_valid() const + { + return(0 != object_); + } + + ::FLAC__StreamMetadata_CueSheet_Index CueSheet::Track::get_index(unsigned i) const + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i < object_->num_indices); + return object_->indices[i]; + } + + void CueSheet::Track::set_isrc(const char value[12]) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != value); + memcpy(object_->isrc, value, 12); + object_->isrc[12] = '\0'; + } + + void CueSheet::Track::set_type(unsigned value) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(value <= 1); + object_->type = value; + } + + void CueSheet::Track::set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i < object_->num_indices); + object_->indices[i] = index; + } + + + // + // CueSheet + // + + CueSheet::CueSheet(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_CUESHEET), /*copy=*/false) + { } + + CueSheet::~CueSheet() + { } + + const char *CueSheet::get_media_catalog_number() const + { + FLAC__ASSERT(is_valid()); + return object_->data.cue_sheet.media_catalog_number; + } + + FLAC__uint64 CueSheet::get_lead_in() const + { + FLAC__ASSERT(is_valid()); + return object_->data.cue_sheet.lead_in; + } + + bool CueSheet::get_is_cd() const + { + FLAC__ASSERT(is_valid()); + return object_->data.cue_sheet.is_cd? true : false; + } + + unsigned CueSheet::get_num_tracks() const + { + FLAC__ASSERT(is_valid()); + return object_->data.cue_sheet.num_tracks; + } + + CueSheet::Track CueSheet::get_track(unsigned i) const + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i < object_->data.cue_sheet.num_tracks); + return Track(object_->data.cue_sheet.tracks + i); + } + + void CueSheet::set_media_catalog_number(const char value[128]) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(0 != value); + memcpy(object_->data.cue_sheet.media_catalog_number, value, 128); + object_->data.cue_sheet.media_catalog_number[128] = '\0'; + } + + void CueSheet::set_lead_in(FLAC__uint64 value) + { + FLAC__ASSERT(is_valid()); + object_->data.cue_sheet.lead_in = value; + } + + void CueSheet::set_is_cd(bool value) + { + FLAC__ASSERT(is_valid()); + object_->data.cue_sheet.is_cd = value; + } + + void CueSheet::set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(track_num < object_->data.cue_sheet.num_tracks); + FLAC__ASSERT(index_num < object_->data.cue_sheet.tracks[track_num].num_indices); + object_->data.cue_sheet.tracks[track_num].indices[index_num] = index; + } + + bool CueSheet::insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(track_num < object_->data.cue_sheet.num_tracks); + FLAC__ASSERT(index_num <= object_->data.cue_sheet.tracks[track_num].num_indices); + return (bool)::FLAC__metadata_object_cuesheet_track_insert_index(object_, track_num, index_num, index); + } + + bool CueSheet::delete_index(unsigned track_num, unsigned index_num) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(track_num < object_->data.cue_sheet.num_tracks); + FLAC__ASSERT(index_num < object_->data.cue_sheet.tracks[track_num].num_indices); + return (bool)::FLAC__metadata_object_cuesheet_track_delete_index(object_, track_num, index_num); + } + + bool CueSheet::set_track(unsigned i, const CueSheet::Track &track) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i < object_->data.cue_sheet.num_tracks); + // We can safely const_cast since copy=true + return (bool)::FLAC__metadata_object_cuesheet_set_track(object_, i, const_cast< ::FLAC__StreamMetadata_CueSheet_Track*>(track.get_track()), /*copy=*/true); + } + + bool CueSheet::insert_track(unsigned i, const CueSheet::Track &track) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i <= object_->data.cue_sheet.num_tracks); + // We can safely const_cast since copy=true + return (bool)::FLAC__metadata_object_cuesheet_insert_track(object_, i, const_cast< ::FLAC__StreamMetadata_CueSheet_Track*>(track.get_track()), /*copy=*/true); + } + + bool CueSheet::delete_track(unsigned i) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(i < object_->data.cue_sheet.num_tracks); + return (bool)::FLAC__metadata_object_cuesheet_delete_track(object_, i); + } + + bool CueSheet::is_legal(bool check_cd_da_subset, const char **violation) const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_cuesheet_is_legal(object_, check_cd_da_subset, violation); + } + + FLAC__uint32 CueSheet::calculate_cddb_id() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__metadata_object_cuesheet_calculate_cddb_id(object_); + } + + + // + // Picture + // + + Picture::Picture(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_PICTURE), /*copy=*/false) + { } + + Picture::~Picture() + { } + + ::FLAC__StreamMetadata_Picture_Type Picture::get_type() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.type; + } + + const char *Picture::get_mime_type() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.mime_type; + } + + const FLAC__byte *Picture::get_description() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.description; + } + + FLAC__uint32 Picture::get_width() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.width; + } + + FLAC__uint32 Picture::get_height() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.height; + } + + FLAC__uint32 Picture::get_depth() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.depth; + } + + FLAC__uint32 Picture::get_colors() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.colors; + } + + FLAC__uint32 Picture::get_data_length() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.data_length; + } + + const FLAC__byte *Picture::get_data() const + { + FLAC__ASSERT(is_valid()); + return object_->data.picture.data; + } + + void Picture::set_type(::FLAC__StreamMetadata_Picture_Type type) + { + FLAC__ASSERT(is_valid()); + object_->data.picture.type = type; + } + + bool Picture::set_mime_type(const char *string) + { + FLAC__ASSERT(is_valid()); + // We can safely const_cast since copy=true + return (bool)::FLAC__metadata_object_picture_set_mime_type(object_, const_cast(string), /*copy=*/true); + } + + bool Picture::set_description(const FLAC__byte *string) + { + FLAC__ASSERT(is_valid()); + // We can safely const_cast since copy=true + return (bool)::FLAC__metadata_object_picture_set_description(object_, const_cast(string), /*copy=*/true); + } + + void Picture::set_width(FLAC__uint32 value) const + { + FLAC__ASSERT(is_valid()); + object_->data.picture.width = value; + } + + void Picture::set_height(FLAC__uint32 value) const + { + FLAC__ASSERT(is_valid()); + object_->data.picture.height = value; + } + + void Picture::set_depth(FLAC__uint32 value) const + { + FLAC__ASSERT(is_valid()); + object_->data.picture.depth = value; + } + + void Picture::set_colors(FLAC__uint32 value) const + { + FLAC__ASSERT(is_valid()); + object_->data.picture.colors = value; + } + + bool Picture::set_data(const FLAC__byte *data, FLAC__uint32 data_length) + { + FLAC__ASSERT(is_valid()); + // We can safely const_cast since copy=true + return (bool)::FLAC__metadata_object_picture_set_data(object_, const_cast(data), data_length, /*copy=*/true); + } + + + // + // Unknown + // + + Unknown::Unknown(): + Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_APPLICATION), /*copy=*/false) + { } + + Unknown::~Unknown() + { } + + const FLAC__byte *Unknown::get_data() const + { + FLAC__ASSERT(is_valid()); + return object_->data.application.data; + } + + bool Unknown::set_data(const FLAC__byte *data, unsigned length) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_application_set_data(object_, (FLAC__byte*)data, length, true); + } + + bool Unknown::set_data(FLAC__byte *data, unsigned length, bool copy) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_object_application_set_data(object_, data, length, copy); + } + + + // ============================================================ + // + // Level 0 + // + // ============================================================ + + FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata object; + + if(::FLAC__metadata_get_streaminfo(filename, &object)) { + streaminfo = object; + return true; + } + else + return false; + } + + FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + tags = 0; + + if(::FLAC__metadata_get_tags(filename, &object)) { + tags = new VorbisComment(object, /*copy=*/false); + return true; + } + else + return false; + } + + FLACPP_API bool get_tags(const char *filename, VorbisComment &tags) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + if(::FLAC__metadata_get_tags(filename, &object)) { + tags.assign(object, /*copy=*/false); + return true; + } + else + return false; + } + + FLACPP_API bool get_cuesheet(const char *filename, CueSheet *&cuesheet) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + cuesheet = 0; + + if(::FLAC__metadata_get_cuesheet(filename, &object)) { + cuesheet = new CueSheet(object, /*copy=*/false); + return true; + } + else + return false; + } + + FLACPP_API bool get_cuesheet(const char *filename, CueSheet &cuesheet) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + if(::FLAC__metadata_get_cuesheet(filename, &object)) { + cuesheet.assign(object, /*copy=*/false); + return true; + } + else + return false; + } + + FLACPP_API bool get_picture(const char *filename, Picture *&picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + picture = 0; + + if(::FLAC__metadata_get_picture(filename, &object, type, mime_type, description, max_width, max_height, max_depth, max_colors)) { + picture = new Picture(object, /*copy=*/false); + return true; + } + else + return false; + } + + FLACPP_API bool get_picture(const char *filename, Picture &picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors) + { + FLAC__ASSERT(0 != filename); + + ::FLAC__StreamMetadata *object; + + if(::FLAC__metadata_get_picture(filename, &object, type, mime_type, description, max_width, max_height, max_depth, max_colors)) { + picture.assign(object, /*copy=*/false); + return true; + } + else + return false; + } + + + // ============================================================ + // + // Level 1 + // + // ============================================================ + + SimpleIterator::SimpleIterator(): + iterator_(::FLAC__metadata_simple_iterator_new()) + { } + + SimpleIterator::~SimpleIterator() + { + clear(); + } + + void SimpleIterator::clear() + { + if(0 != iterator_) + FLAC__metadata_simple_iterator_delete(iterator_); + iterator_ = 0; + } + + bool SimpleIterator::init(const char *filename, bool read_only, bool preserve_file_stats) + { + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_init(iterator_, filename, read_only, preserve_file_stats); + } + + bool SimpleIterator::is_valid() const + { + return 0 != iterator_; + } + + SimpleIterator::Status SimpleIterator::status() + { + FLAC__ASSERT(is_valid()); + return Status(::FLAC__metadata_simple_iterator_status(iterator_)); + } + + bool SimpleIterator::is_writable() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_is_writable(iterator_); + } + + bool SimpleIterator::next() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_next(iterator_); + } + + bool SimpleIterator::prev() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_prev(iterator_); + } + + //@@@@ add to tests + bool SimpleIterator::is_last() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_is_last(iterator_); + } + + //@@@@ add to tests + off_t SimpleIterator::get_block_offset() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__metadata_simple_iterator_get_block_offset(iterator_); + } + + ::FLAC__MetadataType SimpleIterator::get_block_type() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__metadata_simple_iterator_get_block_type(iterator_); + } + + //@@@@ add to tests + unsigned SimpleIterator::get_block_length() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__metadata_simple_iterator_get_block_length(iterator_); + } + + //@@@@ add to tests + bool SimpleIterator::get_application_id(FLAC__byte *id) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_get_application_id(iterator_, id); + } + + Prototype *SimpleIterator::get_block() + { + FLAC__ASSERT(is_valid()); + return local::construct_block(::FLAC__metadata_simple_iterator_get_block(iterator_)); + } + + bool SimpleIterator::set_block(Prototype *block, bool use_padding) + { + FLAC__ASSERT(0 != block); + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_set_block(iterator_, block->object_, use_padding); + } + + bool SimpleIterator::insert_block_after(Prototype *block, bool use_padding) + { + FLAC__ASSERT(0 != block); + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_insert_block_after(iterator_, block->object_, use_padding); + } + + bool SimpleIterator::delete_block(bool use_padding) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_delete_block(iterator_, use_padding); + } + + + // ============================================================ + // + // Level 2 + // + // ============================================================ + + Chain::Chain(): + chain_(::FLAC__metadata_chain_new()) + { } + + Chain::~Chain() + { + clear(); + } + + void Chain::clear() + { + if(0 != chain_) + FLAC__metadata_chain_delete(chain_); + chain_ = 0; + } + + bool Chain::is_valid() const + { + return 0 != chain_; + } + + Chain::Status Chain::status() + { + FLAC__ASSERT(is_valid()); + return Status(::FLAC__metadata_chain_status(chain_)); + } + + bool Chain::read(const char *filename, bool is_ogg) + { + FLAC__ASSERT(0 != filename); + FLAC__ASSERT(is_valid()); + return is_ogg? + (bool)::FLAC__metadata_chain_read_ogg(chain_, filename) : + (bool)::FLAC__metadata_chain_read(chain_, filename) + ; + } + + bool Chain::read(FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, bool is_ogg) + { + FLAC__ASSERT(is_valid()); + return is_ogg? + (bool)::FLAC__metadata_chain_read_ogg_with_callbacks(chain_, handle, callbacks) : + (bool)::FLAC__metadata_chain_read_with_callbacks(chain_, handle, callbacks) + ; + } + + bool Chain::check_if_tempfile_needed(bool use_padding) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_chain_check_if_tempfile_needed(chain_, use_padding); + } + + bool Chain::write(bool use_padding, bool preserve_file_stats) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_chain_write(chain_, use_padding, preserve_file_stats); + } + + bool Chain::write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_chain_write_with_callbacks(chain_, use_padding, handle, callbacks); + } + + bool Chain::write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_chain_write_with_callbacks_and_tempfile(chain_, use_padding, handle, callbacks, temp_handle, temp_callbacks); + } + + void Chain::merge_padding() + { + FLAC__ASSERT(is_valid()); + ::FLAC__metadata_chain_merge_padding(chain_); + } + + void Chain::sort_padding() + { + FLAC__ASSERT(is_valid()); + ::FLAC__metadata_chain_sort_padding(chain_); + } + + + Iterator::Iterator(): + iterator_(::FLAC__metadata_iterator_new()) + { } + + Iterator::~Iterator() + { + clear(); + } + + void Iterator::clear() + { + if(0 != iterator_) + FLAC__metadata_iterator_delete(iterator_); + iterator_ = 0; + } + + bool Iterator::is_valid() const + { + return 0 != iterator_; + } + + void Iterator::init(Chain &chain) + { + FLAC__ASSERT(is_valid()); + FLAC__ASSERT(chain.is_valid()); + ::FLAC__metadata_iterator_init(iterator_, chain.chain_); + } + + bool Iterator::next() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_iterator_next(iterator_); + } + + bool Iterator::prev() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_iterator_prev(iterator_); + } + + ::FLAC__MetadataType Iterator::get_block_type() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__metadata_iterator_get_block_type(iterator_); + } + + Prototype *Iterator::get_block() + { + FLAC__ASSERT(is_valid()); + Prototype *block = local::construct_block(::FLAC__metadata_iterator_get_block(iterator_)); + if(0 != block) + block->set_reference(true); + return block; + } + + bool Iterator::set_block(Prototype *block) + { + FLAC__ASSERT(0 != block); + FLAC__ASSERT(is_valid()); + bool ret = (bool)::FLAC__metadata_iterator_set_block(iterator_, block->object_); + if(ret) { + block->set_reference(true); + delete block; + } + return ret; + } + + bool Iterator::delete_block(bool replace_with_padding) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_iterator_delete_block(iterator_, replace_with_padding); + } + + bool Iterator::insert_block_before(Prototype *block) + { + FLAC__ASSERT(0 != block); + FLAC__ASSERT(is_valid()); + bool ret = (bool)::FLAC__metadata_iterator_insert_block_before(iterator_, block->object_); + if(ret) { + block->set_reference(true); + delete block; + } + return ret; + } + + bool Iterator::insert_block_after(Prototype *block) + { + FLAC__ASSERT(0 != block); + FLAC__ASSERT(is_valid()); + bool ret = (bool)::FLAC__metadata_iterator_insert_block_after(iterator_, block->object_); + if(ret) { + block->set_reference(true); + delete block; + } + return ret; + } + + } +} diff -Nru mame-0.144/src/lib/libflac/libflac++/stream_decoder.cpp mame-0.145/src/lib/libflac/libflac++/stream_decoder.cpp --- mame-0.144/src/lib/libflac/libflac++/stream_decoder.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac++/stream_decoder.cpp 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,389 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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 "flac++/decoder.h" +#include "flac/assert.h" + +#ifdef _MSC_VER +// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning) +#pragma warning ( disable : 4800 ) +#endif + +namespace FLAC { + namespace Decoder { + + // ------------------------------------------------------------ + // + // Stream + // + // ------------------------------------------------------------ + + Stream::Stream(): + decoder_(::FLAC__stream_decoder_new()) + { } + + Stream::~Stream() + { + if(0 != decoder_) { + (void)::FLAC__stream_decoder_finish(decoder_); + ::FLAC__stream_decoder_delete(decoder_); + } + } + + bool Stream::is_valid() const + { + return 0 != decoder_; + } + + bool Stream::set_ogg_serial_number(long value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_ogg_serial_number(decoder_, value); + } + + bool Stream::set_md5_checking(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_md5_checking(decoder_, value); + } + + bool Stream::set_metadata_respond(::FLAC__MetadataType type) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_respond(decoder_, type); + } + + bool Stream::set_metadata_respond_application(const FLAC__byte id[4]) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_respond_application(decoder_, id); + } + + bool Stream::set_metadata_respond_all() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_respond_all(decoder_); + } + + bool Stream::set_metadata_ignore(::FLAC__MetadataType type) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_ignore(decoder_, type); + } + + bool Stream::set_metadata_ignore_application(const FLAC__byte id[4]) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_ignore_application(decoder_, id); + } + + bool Stream::set_metadata_ignore_all() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_set_metadata_ignore_all(decoder_); + } + + Stream::State Stream::get_state() const + { + FLAC__ASSERT(is_valid()); + return State(::FLAC__stream_decoder_get_state(decoder_)); + } + + bool Stream::get_md5_checking() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_get_md5_checking(decoder_); + } + + FLAC__uint64 Stream::get_total_samples() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_total_samples(decoder_); + } + + unsigned Stream::get_channels() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_channels(decoder_); + } + + ::FLAC__ChannelAssignment Stream::get_channel_assignment() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_channel_assignment(decoder_); + } + + unsigned Stream::get_bits_per_sample() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_bits_per_sample(decoder_); + } + + unsigned Stream::get_sample_rate() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_sample_rate(decoder_); + } + + unsigned Stream::get_blocksize() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_blocksize(decoder_); + } + + bool Stream::get_decode_position(FLAC__uint64 *position) const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_get_decode_position(decoder_, position); + } + + ::FLAC__StreamDecoderInitStatus Stream::init() + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_init_stream(decoder_, read_callback_, seek_callback_, tell_callback_, length_callback_, eof_callback_, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamDecoderInitStatus Stream::init_ogg() + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_decoder_init_ogg_stream(decoder_, read_callback_, seek_callback_, tell_callback_, length_callback_, eof_callback_, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + bool Stream::finish() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_finish(decoder_); + } + + bool Stream::flush() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_flush(decoder_); + } + + bool Stream::reset() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_reset(decoder_); + } + + bool Stream::process_single() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_process_single(decoder_); + } + + bool Stream::process_until_end_of_metadata() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_process_until_end_of_metadata(decoder_); + } + + bool Stream::process_until_end_of_stream() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_process_until_end_of_stream(decoder_); + } + + bool Stream::skip_single_frame() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_skip_single_frame(decoder_); + } + + bool Stream::seek_absolute(FLAC__uint64 sample) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_decoder_seek_absolute(decoder_, sample); + } + + ::FLAC__StreamDecoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset) + { + (void)absolute_byte_offset; + return ::FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; + } + + ::FLAC__StreamDecoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset) + { + (void)absolute_byte_offset; + return ::FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; + } + + ::FLAC__StreamDecoderLengthStatus Stream::length_callback(FLAC__uint64 *stream_length) + { + (void)stream_length; + return ::FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; + } + + bool Stream::eof_callback() + { + return false; + } + + void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata) + { + (void)metadata; + } + + ::FLAC__StreamDecoderReadStatus Stream::read_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + { + (void)decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->read_callback(buffer, bytes); + } + + ::FLAC__StreamDecoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) + { + (void) decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->seek_callback(absolute_byte_offset); + } + + ::FLAC__StreamDecoderTellStatus Stream::tell_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + { + (void) decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->tell_callback(absolute_byte_offset); + } + + ::FLAC__StreamDecoderLengthStatus Stream::length_callback_(const ::FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) + { + (void) decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->length_callback(stream_length); + } + + FLAC__bool Stream::eof_callback_(const ::FLAC__StreamDecoder *decoder, void *client_data) + { + (void) decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->eof_callback(); + } + + ::FLAC__StreamDecoderWriteStatus Stream::write_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) + { + (void)decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->write_callback(frame, buffer); + } + + void Stream::metadata_callback_(const ::FLAC__StreamDecoder *decoder, const ::FLAC__StreamMetadata *metadata, void *client_data) + { + (void)decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + instance->metadata_callback(metadata); + } + + void Stream::error_callback_(const ::FLAC__StreamDecoder *decoder, ::FLAC__StreamDecoderErrorStatus status, void *client_data) + { + (void)decoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + instance->error_callback(status); + } + + // ------------------------------------------------------------ + // + // File + // + // ------------------------------------------------------------ + + File::File(): + Stream() + { } + + File::~File() + { + } + + ::FLAC__StreamDecoderInitStatus File::init(FILE *file) + { + FLAC__ASSERT(0 != decoder_); + return ::FLAC__stream_decoder_init_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamDecoderInitStatus File::init(const char *filename) + { + FLAC__ASSERT(0 != decoder_); + return ::FLAC__stream_decoder_init_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamDecoderInitStatus File::init(const std::string &filename) + { + return init(filename.c_str()); + } + + ::FLAC__StreamDecoderInitStatus File::init_ogg(FILE *file) + { + FLAC__ASSERT(0 != decoder_); + return ::FLAC__stream_decoder_init_ogg_FILE(decoder_, file, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamDecoderInitStatus File::init_ogg(const char *filename) + { + FLAC__ASSERT(0 != decoder_); + return ::FLAC__stream_decoder_init_ogg_file(decoder_, filename, write_callback_, metadata_callback_, error_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamDecoderInitStatus File::init_ogg(const std::string &filename) + { + return init_ogg(filename.c_str()); + } + + // This is a dummy to satisfy the pure virtual from Stream; the + // read callback will never be called since we are initializing + // with FLAC__stream_decoder_init_FILE() or + // FLAC__stream_decoder_init_file() and those supply the read + // callback internally. + ::FLAC__StreamDecoderReadStatus File::read_callback(FLAC__byte buffer[], size_t *bytes) + { + (void)buffer, (void)bytes; + FLAC__ASSERT(false); + return ::FLAC__STREAM_DECODER_READ_STATUS_ABORT; // double protection + } + + } +} diff -Nru mame-0.144/src/lib/libflac/libflac++/stream_encoder.cpp mame-0.145/src/lib/libflac/libflac++/stream_encoder.cpp --- mame-0.144/src/lib/libflac/libflac++/stream_encoder.cpp 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libflac/libflac++/stream_encoder.cpp 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,511 @@ +/* libFLAC++ - Free Lossless Audio Codec library + * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson + * + * 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 of the Xiph.org Foundation 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``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 THE FOUNDATION OR + * CONTRIBUTORS 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 "flac++/encoder.h" +#include "flac++/metadata.h" +#include "flac/assert.h" + +#ifdef _MSC_VER +// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning) +#pragma warning ( disable : 4800 ) +#endif + +namespace FLAC { + namespace Encoder { + + // ------------------------------------------------------------ + // + // Stream + // + // ------------------------------------------------------------ + + Stream::Stream(): + encoder_(::FLAC__stream_encoder_new()) + { } + + Stream::~Stream() + { + if(0 != encoder_) { + (void)::FLAC__stream_encoder_finish(encoder_); + ::FLAC__stream_encoder_delete(encoder_); + } + } + + bool Stream::is_valid() const + { + return 0 != encoder_; + } + + bool Stream::set_ogg_serial_number(long value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_ogg_serial_number(encoder_, value); + } + + bool Stream::set_verify(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_verify(encoder_, value); + } + + bool Stream::set_streamable_subset(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_streamable_subset(encoder_, value); + } + + bool Stream::set_channels(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_channels(encoder_, value); + } + + bool Stream::set_bits_per_sample(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_bits_per_sample(encoder_, value); + } + + bool Stream::set_sample_rate(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_sample_rate(encoder_, value); + } + + bool Stream::set_compression_level(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_compression_level(encoder_, value); + } + + bool Stream::set_blocksize(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_blocksize(encoder_, value); + } + + bool Stream::set_do_mid_side_stereo(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_do_mid_side_stereo(encoder_, value); + } + + bool Stream::set_loose_mid_side_stereo(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_loose_mid_side_stereo(encoder_, value); + } + + bool Stream::set_apodization(const char *specification) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_apodization(encoder_, specification); + } + + bool Stream::set_max_lpc_order(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_max_lpc_order(encoder_, value); + } + + bool Stream::set_qlp_coeff_precision(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_qlp_coeff_precision(encoder_, value); + } + + bool Stream::set_do_qlp_coeff_prec_search(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_do_qlp_coeff_prec_search(encoder_, value); + } + + bool Stream::set_do_escape_coding(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_do_escape_coding(encoder_, value); + } + + bool Stream::set_do_exhaustive_model_search(bool value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_do_exhaustive_model_search(encoder_, value); + } + + bool Stream::set_min_residual_partition_order(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_min_residual_partition_order(encoder_, value); + } + + bool Stream::set_max_residual_partition_order(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_max_residual_partition_order(encoder_, value); + } + + bool Stream::set_rice_parameter_search_dist(unsigned value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_rice_parameter_search_dist(encoder_, value); + } + + bool Stream::set_total_samples_estimate(FLAC__uint64 value) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_total_samples_estimate(encoder_, value); + } + + bool Stream::set_metadata(::FLAC__StreamMetadata **metadata, unsigned num_blocks) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_set_metadata(encoder_, metadata, num_blocks); + } + + bool Stream::set_metadata(FLAC::Metadata::Prototype **metadata, unsigned num_blocks) + { + FLAC__ASSERT(is_valid()); +#if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __SUNPRO_CC) + // MSVC++ can't handle: + // ::FLAC__StreamMetadata *m[num_blocks]; + // so we do this ugly workaround + ::FLAC__StreamMetadata **m = new ::FLAC__StreamMetadata*[num_blocks]; +#else + ::FLAC__StreamMetadata *m[num_blocks]; +#endif + for(unsigned i = 0; i < num_blocks; i++) { + // we can get away with the const_cast since we know the encoder will only correct the is_last flags + m[i] = const_cast< ::FLAC__StreamMetadata*>((const ::FLAC__StreamMetadata*)metadata[i]); + } +#if (defined _MSC_VER) || (defined __BORLANDC__) || (defined __SUNPRO_CC) + // complete the hack + const bool ok = (bool)::FLAC__stream_encoder_set_metadata(encoder_, m, num_blocks); + delete [] m; + return ok; +#else + return (bool)::FLAC__stream_encoder_set_metadata(encoder_, m, num_blocks); +#endif + } + + Stream::State Stream::get_state() const + { + FLAC__ASSERT(is_valid()); + return State(::FLAC__stream_encoder_get_state(encoder_)); + } + + Decoder::Stream::State Stream::get_verify_decoder_state() const + { + FLAC__ASSERT(is_valid()); + return Decoder::Stream::State(::FLAC__stream_encoder_get_verify_decoder_state(encoder_)); + } + + void Stream::get_verify_decoder_error_stats(FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) + { + FLAC__ASSERT(is_valid()); + ::FLAC__stream_encoder_get_verify_decoder_error_stats(encoder_, absolute_sample, frame_number, channel, sample, expected, got); + } + + bool Stream::get_verify() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_verify(encoder_); + } + + bool Stream::get_streamable_subset() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_streamable_subset(encoder_); + } + + bool Stream::get_do_mid_side_stereo() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_do_mid_side_stereo(encoder_); + } + + bool Stream::get_loose_mid_side_stereo() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_loose_mid_side_stereo(encoder_); + } + + unsigned Stream::get_channels() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_channels(encoder_); + } + + unsigned Stream::get_bits_per_sample() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_bits_per_sample(encoder_); + } + + unsigned Stream::get_sample_rate() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_sample_rate(encoder_); + } + + unsigned Stream::get_blocksize() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_blocksize(encoder_); + } + + unsigned Stream::get_max_lpc_order() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_max_lpc_order(encoder_); + } + + unsigned Stream::get_qlp_coeff_precision() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_qlp_coeff_precision(encoder_); + } + + bool Stream::get_do_qlp_coeff_prec_search() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_do_qlp_coeff_prec_search(encoder_); + } + + bool Stream::get_do_escape_coding() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_do_escape_coding(encoder_); + } + + bool Stream::get_do_exhaustive_model_search() const + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_get_do_exhaustive_model_search(encoder_); + } + + unsigned Stream::get_min_residual_partition_order() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_min_residual_partition_order(encoder_); + } + + unsigned Stream::get_max_residual_partition_order() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_max_residual_partition_order(encoder_); + } + + unsigned Stream::get_rice_parameter_search_dist() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_rice_parameter_search_dist(encoder_); + } + + FLAC__uint64 Stream::get_total_samples_estimate() const + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_get_total_samples_estimate(encoder_); + } + + ::FLAC__StreamEncoderInitStatus Stream::init() + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_stream(encoder_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamEncoderInitStatus Stream::init_ogg() + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_ogg_stream(encoder_, read_callback_, write_callback_, seek_callback_, tell_callback_, metadata_callback_, /*client_data=*/(void*)this); + } + + bool Stream::finish() + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_finish(encoder_); + } + + bool Stream::process(const FLAC__int32 * const buffer[], unsigned samples) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_process(encoder_, buffer, samples); + } + + bool Stream::process_interleaved(const FLAC__int32 buffer[], unsigned samples) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__stream_encoder_process_interleaved(encoder_, buffer, samples); + } + + ::FLAC__StreamEncoderReadStatus Stream::read_callback(FLAC__byte buffer[], size_t *bytes) + { + (void)buffer, (void)bytes; + return ::FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED; + } + + ::FLAC__StreamEncoderSeekStatus Stream::seek_callback(FLAC__uint64 absolute_byte_offset) + { + (void)absolute_byte_offset; + return ::FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; + } + + ::FLAC__StreamEncoderTellStatus Stream::tell_callback(FLAC__uint64 *absolute_byte_offset) + { + (void)absolute_byte_offset; + return ::FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; + } + + void Stream::metadata_callback(const ::FLAC__StreamMetadata *metadata) + { + (void)metadata; + } + + ::FLAC__StreamEncoderReadStatus Stream::read_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->read_callback(buffer, bytes); + } + + ::FLAC__StreamEncoderWriteStatus Stream::write_callback_(const ::FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->write_callback(buffer, bytes, samples, current_frame); + } + + ::FLAC__StreamEncoderSeekStatus Stream::seek_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->seek_callback(absolute_byte_offset); + } + + ::FLAC__StreamEncoderTellStatus Stream::tell_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + return instance->tell_callback(absolute_byte_offset); + } + + void Stream::metadata_callback_(const ::FLAC__StreamEncoder *encoder, const ::FLAC__StreamMetadata *metadata, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + Stream *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + instance->metadata_callback(metadata); + } + + // ------------------------------------------------------------ + // + // File + // + // ------------------------------------------------------------ + + File::File(): + Stream() + { } + + File::~File() + { + } + + ::FLAC__StreamEncoderInitStatus File::init(FILE *file) + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamEncoderInitStatus File::init(const char *filename) + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamEncoderInitStatus File::init(const std::string &filename) + { + return init(filename.c_str()); + } + + ::FLAC__StreamEncoderInitStatus File::init_ogg(FILE *file) + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_ogg_FILE(encoder_, file, progress_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamEncoderInitStatus File::init_ogg(const char *filename) + { + FLAC__ASSERT(is_valid()); + return ::FLAC__stream_encoder_init_ogg_file(encoder_, filename, progress_callback_, /*client_data=*/(void*)this); + } + + ::FLAC__StreamEncoderInitStatus File::init_ogg(const std::string &filename) + { + return init_ogg(filename.c_str()); + } + + // This is a dummy to satisfy the pure virtual from Stream; the + // read callback will never be called since we are initializing + // with FLAC__stream_decoder_init_FILE() or + // FLAC__stream_decoder_init_file() and those supply the read + // callback internally. + ::FLAC__StreamEncoderWriteStatus File::write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame) + { + (void)buffer, (void)bytes, (void)samples, (void)current_frame; + FLAC__ASSERT(false); + return ::FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; // double protection + } + + void File::progress_callback(FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate) + { + (void)bytes_written, (void)samples_written, (void)frames_written, (void)total_frames_estimate; + } + + void File::progress_callback_(const ::FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data) + { + (void)encoder; + FLAC__ASSERT(0 != client_data); + File *instance = reinterpret_cast(client_data); + FLAC__ASSERT(0 != instance); + instance->progress_callback(bytes_written, samples_written, frames_written, total_frames_estimate); + } + + } +} diff -Nru mame-0.144/src/lib/libjpeg/jaricom.c mame-0.145/src/lib/libjpeg/jaricom.c --- mame-0.144/src/lib/libjpeg/jaricom.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jaricom.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,153 @@ +/* + * jaricom.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains probability estimation tables for common use in + * arithmetic entropy encoding and decoding routines. + * + * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1 + * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec + * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* The following #define specifies the packing of the four components + * into the compact INT32 representation. + * Note that this formula must match the actual arithmetic encoder + * and decoder implementation. The implementation has to be changed + * if this formula is changed. + * The current organization is leaned on Markus Kuhn's JBIG + * implementation (jbig_tab.c). + */ + +#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b) + +const INT32 jpeg_aritab[113+1] = { +/* + * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS + */ + V( 0, 0x5a1d, 1, 1, 1 ), + V( 1, 0x2586, 14, 2, 0 ), + V( 2, 0x1114, 16, 3, 0 ), + V( 3, 0x080b, 18, 4, 0 ), + V( 4, 0x03d8, 20, 5, 0 ), + V( 5, 0x01da, 23, 6, 0 ), + V( 6, 0x00e5, 25, 7, 0 ), + V( 7, 0x006f, 28, 8, 0 ), + V( 8, 0x0036, 30, 9, 0 ), + V( 9, 0x001a, 33, 10, 0 ), + V( 10, 0x000d, 35, 11, 0 ), + V( 11, 0x0006, 9, 12, 0 ), + V( 12, 0x0003, 10, 13, 0 ), + V( 13, 0x0001, 12, 13, 0 ), + V( 14, 0x5a7f, 15, 15, 1 ), + V( 15, 0x3f25, 36, 16, 0 ), + V( 16, 0x2cf2, 38, 17, 0 ), + V( 17, 0x207c, 39, 18, 0 ), + V( 18, 0x17b9, 40, 19, 0 ), + V( 19, 0x1182, 42, 20, 0 ), + V( 20, 0x0cef, 43, 21, 0 ), + V( 21, 0x09a1, 45, 22, 0 ), + V( 22, 0x072f, 46, 23, 0 ), + V( 23, 0x055c, 48, 24, 0 ), + V( 24, 0x0406, 49, 25, 0 ), + V( 25, 0x0303, 51, 26, 0 ), + V( 26, 0x0240, 52, 27, 0 ), + V( 27, 0x01b1, 54, 28, 0 ), + V( 28, 0x0144, 56, 29, 0 ), + V( 29, 0x00f5, 57, 30, 0 ), + V( 30, 0x00b7, 59, 31, 0 ), + V( 31, 0x008a, 60, 32, 0 ), + V( 32, 0x0068, 62, 33, 0 ), + V( 33, 0x004e, 63, 34, 0 ), + V( 34, 0x003b, 32, 35, 0 ), + V( 35, 0x002c, 33, 9, 0 ), + V( 36, 0x5ae1, 37, 37, 1 ), + V( 37, 0x484c, 64, 38, 0 ), + V( 38, 0x3a0d, 65, 39, 0 ), + V( 39, 0x2ef1, 67, 40, 0 ), + V( 40, 0x261f, 68, 41, 0 ), + V( 41, 0x1f33, 69, 42, 0 ), + V( 42, 0x19a8, 70, 43, 0 ), + V( 43, 0x1518, 72, 44, 0 ), + V( 44, 0x1177, 73, 45, 0 ), + V( 45, 0x0e74, 74, 46, 0 ), + V( 46, 0x0bfb, 75, 47, 0 ), + V( 47, 0x09f8, 77, 48, 0 ), + V( 48, 0x0861, 78, 49, 0 ), + V( 49, 0x0706, 79, 50, 0 ), + V( 50, 0x05cd, 48, 51, 0 ), + V( 51, 0x04de, 50, 52, 0 ), + V( 52, 0x040f, 50, 53, 0 ), + V( 53, 0x0363, 51, 54, 0 ), + V( 54, 0x02d4, 52, 55, 0 ), + V( 55, 0x025c, 53, 56, 0 ), + V( 56, 0x01f8, 54, 57, 0 ), + V( 57, 0x01a4, 55, 58, 0 ), + V( 58, 0x0160, 56, 59, 0 ), + V( 59, 0x0125, 57, 60, 0 ), + V( 60, 0x00f6, 58, 61, 0 ), + V( 61, 0x00cb, 59, 62, 0 ), + V( 62, 0x00ab, 61, 63, 0 ), + V( 63, 0x008f, 61, 32, 0 ), + V( 64, 0x5b12, 65, 65, 1 ), + V( 65, 0x4d04, 80, 66, 0 ), + V( 66, 0x412c, 81, 67, 0 ), + V( 67, 0x37d8, 82, 68, 0 ), + V( 68, 0x2fe8, 83, 69, 0 ), + V( 69, 0x293c, 84, 70, 0 ), + V( 70, 0x2379, 86, 71, 0 ), + V( 71, 0x1edf, 87, 72, 0 ), + V( 72, 0x1aa9, 87, 73, 0 ), + V( 73, 0x174e, 72, 74, 0 ), + V( 74, 0x1424, 72, 75, 0 ), + V( 75, 0x119c, 74, 76, 0 ), + V( 76, 0x0f6b, 74, 77, 0 ), + V( 77, 0x0d51, 75, 78, 0 ), + V( 78, 0x0bb6, 77, 79, 0 ), + V( 79, 0x0a40, 77, 48, 0 ), + V( 80, 0x5832, 80, 81, 1 ), + V( 81, 0x4d1c, 88, 82, 0 ), + V( 82, 0x438e, 89, 83, 0 ), + V( 83, 0x3bdd, 90, 84, 0 ), + V( 84, 0x34ee, 91, 85, 0 ), + V( 85, 0x2eae, 92, 86, 0 ), + V( 86, 0x299a, 93, 87, 0 ), + V( 87, 0x2516, 86, 71, 0 ), + V( 88, 0x5570, 88, 89, 1 ), + V( 89, 0x4ca9, 95, 90, 0 ), + V( 90, 0x44d9, 96, 91, 0 ), + V( 91, 0x3e22, 97, 92, 0 ), + V( 92, 0x3824, 99, 93, 0 ), + V( 93, 0x32b4, 99, 94, 0 ), + V( 94, 0x2e17, 93, 86, 0 ), + V( 95, 0x56a8, 95, 96, 1 ), + V( 96, 0x4f46, 101, 97, 0 ), + V( 97, 0x47e5, 102, 98, 0 ), + V( 98, 0x41cf, 103, 99, 0 ), + V( 99, 0x3c3d, 104, 100, 0 ), + V( 100, 0x375e, 99, 93, 0 ), + V( 101, 0x5231, 105, 102, 0 ), + V( 102, 0x4c0f, 106, 103, 0 ), + V( 103, 0x4639, 107, 104, 0 ), + V( 104, 0x415e, 103, 99, 0 ), + V( 105, 0x5627, 105, 106, 1 ), + V( 106, 0x50e7, 108, 107, 0 ), + V( 107, 0x4b85, 109, 103, 0 ), + V( 108, 0x5597, 110, 109, 0 ), + V( 109, 0x504f, 111, 107, 0 ), + V( 110, 0x5a10, 110, 111, 1 ), + V( 111, 0x5522, 112, 109, 0 ), + V( 112, 0x59eb, 112, 111, 1 ), +/* + * This last entry is used for fixed probability estimate of 0.5 + * as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851. + */ + V( 113, 0x5a1d, 113, 113, 0 ) +}; diff -Nru mame-0.144/src/lib/libjpeg/jcapimin.c mame-0.145/src/lib/libjpeg/jcapimin.c --- mame-0.144/src/lib/libjpeg/jcapimin.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcapimin.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,288 @@ +/* + * jcapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-compression case or the transcoding-only + * case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jcapistd.c. But also see jcparam.c for + * parameter-setup helper routines, jcomapi.c for routines shared by + * compression and decompression, and jctrans.c for the transcoding case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG compression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_compress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = FALSE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->dest = NULL; + + cinfo->comp_info = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + cinfo->quant_tbl_ptrs[i] = NULL; + cinfo->q_scale_factor[i] = 100; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Must do it here for emit_dqt in case jpeg_write_tables is used */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + + cinfo->script_space = NULL; + + cinfo->input_gamma = 1.0; /* in case application forgets */ + + /* OK, I'm ready */ + cinfo->global_state = CSTATE_START; +} + + +/* + * Destruction of a JPEG compression object + */ + +GLOBAL(void) +jpeg_destroy_compress (j_compress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG compression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_compress (j_compress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Forcibly suppress or un-suppress all quantization and Huffman tables. + * Marks all currently defined tables as already written (if suppress) + * or not written (if !suppress). This will control whether they get emitted + * by a subsequent jpeg_start_compress call. + * + * This routine is exported for use by applications that want to produce + * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but + * since it is called by jpeg_start_compress, we put it here --- otherwise + * jcparam.o would be linked whether the application used it or not. + */ + +GLOBAL(void) +jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) +{ + int i; + JQUANT_TBL * qtbl; + JHUFF_TBL * htbl; + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) + qtbl->sent_table = suppress; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + } +} + + +/* + * Finish JPEG compression. + * + * If a multipass operating mode was selected, this may do a great deal of + * work including most of the actual output. + */ + +GLOBAL(void) +jpeg_finish_compress (j_compress_ptr cinfo) +{ + JDIMENSION iMCU_row; + + if (cinfo->global_state == CSTATE_SCANNING || + cinfo->global_state == CSTATE_RAW_OK) { + /* Terminate first pass */ + if (cinfo->next_scanline < cinfo->image_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_pass) (cinfo); + } else if (cinfo->global_state != CSTATE_WRCOEFS) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any remaining passes */ + while (! cinfo->master->is_last_pass) { + (*cinfo->master->prepare_for_pass) (cinfo); + for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) iMCU_row; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* We bypass the main controller and invoke coef controller directly; + * all work is being done from the coefficient buffer. + */ + if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } + (*cinfo->master->finish_pass) (cinfo); + } + /* Write EOI, do final cleanup */ + (*cinfo->marker->write_file_trailer) (cinfo); + (*cinfo->dest->term_destination) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); +} + + +/* + * Write a special marker. + * This is only recommended for writing COM or APPn markers. + * Must be called after jpeg_start_compress() and before + * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). + */ + +GLOBAL(void) +jpeg_write_marker (j_compress_ptr cinfo, int marker, + const JOCTET *dataptr, unsigned int datalen) +{ + JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); + + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); + write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ + while (datalen--) { + (*write_marker_byte) (cinfo, *dataptr); + dataptr++; + } +} + +/* Same, but piecemeal. */ + +GLOBAL(void) +jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +{ + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); +} + +GLOBAL(void) +jpeg_write_m_byte (j_compress_ptr cinfo, int val) +{ + (*cinfo->marker->write_marker_byte) (cinfo, val); +} + + +/* + * Alternate compression function: just write an abbreviated table file. + * Before calling this, all parameters and a data destination must be set up. + * + * To produce a pair of files containing abbreviated tables and abbreviated + * image data, one would proceed as follows: + * + * initialize JPEG object + * set JPEG parameters + * set destination to table file + * jpeg_write_tables(cinfo); + * set destination to image file + * jpeg_start_compress(cinfo, FALSE); + * write data... + * jpeg_finish_compress(cinfo); + * + * jpeg_write_tables has the side effect of marking all tables written + * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress + * will not re-emit the tables unless it is passed write_all_tables=TRUE. + */ + +GLOBAL(void) +jpeg_write_tables (j_compress_ptr cinfo) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Initialize the marker writer ... bit of a crock to do it here. */ + jinit_marker_writer(cinfo); + /* Write them tables! */ + (*cinfo->marker->write_tables_only) (cinfo); + /* And clean up. */ + (*cinfo->dest->term_destination) (cinfo); + /* + * In library releases up through v6a, we called jpeg_abort() here to free + * any working memory allocated by the destination manager and marker + * writer. Some applications had a problem with that: they allocated space + * of their own from the library memory manager, and didn't want it to go + * away during write_tables. So now we do nothing. This will cause a + * memory leak if an app calls write_tables repeatedly without doing a full + * compression cycle or otherwise resetting the JPEG object. However, that + * seems less bad than unexpectedly freeing memory in the normal case. + * An app that prefers the old behavior can call jpeg_abort for itself after + * each call to jpeg_write_tables(). + */ +} diff -Nru mame-0.144/src/lib/libjpeg/jcapistd.c mame-0.145/src/lib/libjpeg/jcapistd.c --- mame-0.144/src/lib/libjpeg/jcapistd.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcapistd.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,161 @@ +/* + * jcapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-compression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_compress, it will end up linking in the entire compressor. + * We thus must separate this file from jcapimin.c to avoid linking the + * whole compression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Compression initialization. + * Before calling this, all parameters and a data destination must be set up. + * + * We require a write_all_tables parameter as a failsafe check when writing + * multiple datastreams from the same compression object. Since prior runs + * will have left all the tables marked sent_table=TRUE, a subsequent run + * would emit an abbreviated stream (no tables) by default. This may be what + * is wanted, but for safety's sake it should not be the default behavior: + * programmers should have to make a deliberate choice to emit abbreviated + * images. Therefore the documentation and examples should encourage people + * to pass write_all_tables=TRUE; then it will take active thought to do the + * wrong thing. + */ + +GLOBAL(void) +jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (write_all_tables) + jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + jinit_compress_master(cinfo); + /* Set up for the first pass */ + (*cinfo->master->prepare_for_pass) (cinfo); + /* Ready for application to drive first pass through jpeg_write_scanlines + * or jpeg_write_raw_data. + */ + cinfo->next_scanline = 0; + cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING); +} + + +/* + * Write some scanlines of data to the JPEG compressor. + * + * The return value will be the number of lines actually written. + * This should be less than the supplied num_lines only in case that + * the data destination module has requested suspension of the compressor, + * or if more than image_height scanlines are passed in. + * + * Note: we warn about excess calls to jpeg_write_scanlines() since + * this likely signals an application programmer error. However, + * excess scanlines passed in the last valid call are *silently* ignored, + * so that the application need not adjust num_lines for end-of-image + * when using a multiple-scanline buffer. + */ + +GLOBAL(JDIMENSION) +jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION num_lines) +{ + JDIMENSION row_ctr, rows_left; + + if (cinfo->global_state != CSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_scanlines. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_scanlines. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Ignore any extra scanlines at bottom of image. */ + rows_left = cinfo->image_height - cinfo->next_scanline; + if (num_lines > rows_left) + num_lines = rows_left; + + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines); + cinfo->next_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to write raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION num_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != CSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_raw_data. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_raw_data. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Verify that at least one iMCU row has been passed. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE; + if (num_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Directly compress the row. */ + if (! (*cinfo->coef->compress_data) (cinfo, data)) { + /* If compressor did not consume the whole row, suspend processing. */ + return 0; + } + + /* OK, we processed one iMCU row. */ + cinfo->next_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} diff -Nru mame-0.144/src/lib/libjpeg/jcarith.c mame-0.145/src/lib/libjpeg/jcarith.c --- mame-0.144/src/lib/libjpeg/jcarith.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcarith.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,934 @@ +/* + * jcarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy encoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy encoder object for arithmetic encoding. */ + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */ + INT32 a; /* A register, normalized size of coding interval */ + INT32 sc; /* counter for stacked 0xFF values which might overflow */ + INT32 zc; /* counter for pending 0x00 output values which might * + * be discarded at the end ("Pacman" termination) */ + int ct; /* bit shift counter, determines when next byte will be written */ + int buffer; /* buffer for most recent output byte != 0xFF */ + + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_encoder; + +typedef arith_entropy_encoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + +/* NOTE: Uncomment the following #define if you want to use the + * given formula for calculating the AC conditioning parameter Kx + * for spectral selection progressive coding in section G.1.3.2 + * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4). + * Although the spec and P&M authors claim that this "has proven + * to give good results for 8 bit precision samples", I'm not + * convinced yet that this is really beneficial. + * Early tests gave only very marginal compression enhancements + * (a few - around 5 or so - bytes even for very large files), + * which would turn out rather negative if we'd suppress the + * DAC (Define Arithmetic Conditioning) marker segments for + * the default parameters in the future. + * Note that currently the marker writing module emits 12-byte + * DAC segments for a full-component scan in a color image. + * This is not worth worrying about IMHO. However, since the + * spec defines the default values to be used if the tables + * are omitted (unlike Huffman tables, which are required + * anyway), one might optimize this behaviour in the future, + * and then it would be disadvantageous to use custom tables if + * they don't provide sufficient gain to exceed the DAC size. + * + * On the other hand, I'd consider it as a reasonable result + * that the conditioning has no significant influence on the + * compression performance. This means that the basic + * statistical model is already rather stable. + * + * Thus, at the moment, we use the default conditioning values + * anyway, and do not use the custom formula. + * +#define CALCULATE_SPECTRAL_CONDITIONING + */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +LOCAL(void) +emit_byte (int val, j_compress_ptr cinfo) +/* Write next output byte; we do not support suspension in this module. */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *dest->next_output_byte++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); +} + + +/* + * Finish up at the end of an arithmetic-compressed scan. + */ + +METHODDEF(void) +finish_pass (j_compress_ptr cinfo) +{ + arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + INT32 temp; + + /* Section D.1.8: Termination of encoding */ + + /* Find the e->c in the coding interval with the largest + * number of trailing zero bits */ + if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c) + e->c = temp + 0x8000L; + else + e->c = temp; + /* Send remaining bytes to output */ + e->c <<= e->ct; + if (e->c & 0xF8000000L) { + /* One final overflow has to be handled */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + } else { + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + } + /* Output final bytes only if they are not 0x00 */ + if (e->c & 0x7FFF800L) { + if (e->zc) /* output final pending zero bytes */ + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte((e->c >> 19) & 0xFF, cinfo); + if (((e->c >> 19) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + if (e->c & 0x7F800L) { + emit_byte((e->c >> 11) & 0xFF, cinfo); + if (((e->c >> 11) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + } + } +} + + +/* + * The core arithmetic encoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Parameter 'val' to be encoded may be 0 or 1 (binary decision). + * + * Note: I've added full "Pacman" termination support to the + * byte output routines, which is equivalent to the optional + * Discard_final_zeros procedure (Figure D.15) in the spec. + * Thus, we always produce the shortest possible output + * stream compliant to the spec (no trailing zero bytes, + * except for FF stuffing). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(void) +arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv; + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Encode & estimation procedures per sections D.1.4 & D.1.5 */ + e->a -= qe; + if (val != (sv >> 7)) { + /* Encode the less probable symbol */ + if (e->a >= qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency, otherwise code the LPS + * as usual: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + } else { + /* Encode the more probable symbol */ + if (e->a >= 0x8000L) + return; /* A >= 0x8000 -> ready, no renormalization required */ + if (e->a < qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + + /* Renormalization & data output per section D.1.6 */ + do { + e->a <<= 1; + e->c <<= 1; + if (--e->ct == 0) { + /* Another byte is ready for output */ + temp = e->c >> 19; + if (temp > 0xFF) { + /* Handle overflow over all stacked 0xFF bytes */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + /* Note: The 3 spacer bits in the C register guarantee + * that the new buffer byte can't be 0xFF here + * (see page 160 in the P&M JPEG book). */ + e->buffer = temp & 0xFF; /* new output byte, might overflow later */ + } else if (temp == 0xFF) { + ++e->sc; /* stack 0xFF byte (which might overflow later) */ + } else { + /* Output all stacked 0xFF bytes, they will not overflow any more */ + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + e->buffer = temp & 0xFF; /* new output byte (can still overflow) */ + } + e->c &= 0x7FFFFL; + e->ct += 8; + } + } while (e->a < 0x8000L); +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(void) +emit_restart (j_compress_ptr cinfo, int restart_num) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + finish_pass(cinfo); + + emit_byte(0xFF, cinfo); + emit_byte(JPEG_RST0 + restart_num, cinfo); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl; + int v, v2, m; + ISHIFT_TEMPS + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al); + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = m - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = m; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int Al, blkn; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + Al = cinfo->Al; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* We simply emit the Al'th bit of the DC coefficient value. */ + arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke, kex; + int v; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Section G.1.3.3: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = ke; kex > 0; kex--) + if ((v = (*block)[natural_order[kex]]) >= 0) { + if (v >>= cinfo->Ah) break; + } else { + v = -v; + if (v >>= cinfo->Ah) break; + } + + /* Figure G.10: Encode_AC_Coefficients_SA */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + } + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + } + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = (*block)[0]; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->lim_Se; ke > 0; ke--) + if ((*block)[natural_order[ke]]) break; + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = 1; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + while ((v = (*block)[natural_order[k]]) == 0) { + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + arith_encode(cinfo, st + 1, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, entropy->fixed_bin, 0); + } else { + v = -v; + arith_encode(cinfo, entropy->fixed_bin, 1); + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->lim_Se */ + if (k <= cinfo->lim_Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_compress_ptr cinfo, boolean gather_statistics) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + /* Make sure to avoid that in the master control logic! + * We are fully adaptive here and need no extra + * statistics gathering pass! + */ + ERREXIT(cinfo, JERR_NOT_COMPILED); + + /* We assume jcmaster.c already validated the progressive scan parameters. */ + + /* Select execution routines */ + if (cinfo->progressive_mode) { + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else + entropy->pub.encode_mcu = encode_mcu_AC_refine; + } + } else + entropy->pub.encode_mcu = encode_mcu; + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); +#ifdef CALCULATE_SPECTRAL_CONDITIONING + if (cinfo->progressive_mode) + /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ + cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4); +#endif + } + } + + /* Initialize arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for arithmetic entropy encoding. + */ + +GLOBAL(void) +jinit_arith_encoder (j_compress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass; + entropy->pub.finish_pass = finish_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; +} diff -Nru mame-0.144/src/lib/libjpeg/jccoefct.c mame-0.145/src/lib/libjpeg/jccoefct.c --- mame-0.144/src/lib/libjpeg/jccoefct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jccoefct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,453 @@ +/* + * jccoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for compression. + * This controller is the top level of the JPEG compressor proper. + * The coefficient buffer lies between forward-DCT and entropy encoding steps. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* We use a full-image coefficient buffer when doing Huffman optimization, + * and also for writing multiple-scan JPEG files. In all cases, the DCT + * step is run during the first pass, and subsequent passes need only read + * the buffered coefficients. + */ +#ifdef ENTROPY_OPT_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#else +#ifdef C_MULTISCAN_FILES_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#endif +#endif + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* For single-pass compression, it's sufficient to buffer just one MCU + * (although this may prove a bit slow in practice). We allocate a + * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each + * MCU constructed and sent. (On 80x86, the workspace is FAR even though + * it's not really very big; this is to keep the module interfaces unchanged + * when a large coefficient buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays. + */ + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +/* Forward declarations */ +METHODDEF(boolean) compress_data + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#ifdef FULL_COEF_BUFFER_SUPPORTED +METHODDEF(boolean) compress_first_pass + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +METHODDEF(boolean) compress_output + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (coef->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_data; + break; +#ifdef FULL_COEF_BUFFER_SUPPORTED + case JBUF_SAVE_AND_PASS: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_first_pass; + break; + case JBUF_CRANK_DEST: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_output; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data in the single-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(boolean) +compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, bi, ci, yindex, yoffset, blockcnt; + JDIMENSION ypos, xpos; + jpeg_component_info *compptr; + forward_DCT_ptr forward_DCT; + + /* Loop to write as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Determine where data comes from in input_buf and do the DCT thing. + * Each call on forward_DCT processes a horizontal row of DCT blocks + * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks + * sequentially. Dummy blocks at the right or bottom edge are filled in + * specially. The data in them does not matter for image reconstruction, + * so we fill them with values that will encode to the smallest amount of + * data, viz: all zeroes in the AC entries, DC entries equal to previous + * block's DC value. (Thanks to Thomas Kinsman for this idea.) + */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index]; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + xpos = MCU_col_num * compptr->MCU_sample_width; + ypos = yoffset * compptr->DCT_v_scaled_size; + /* ypos == (yoffset+yindex) * DCTSIZE */ + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + (*forward_DCT) (cinfo, compptr, + input_buf[compptr->component_index], + coef->MCU_buffer[blkn], + ypos, xpos, (JDIMENSION) blockcnt); + if (blockcnt < compptr->MCU_width) { + /* Create some dummy blocks at the right edge of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], + (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); + for (bi = blockcnt; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; + } + } + } else { + /* Create a row of dummy blocks at the bottom of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn], + compptr->MCU_width * SIZEOF(JBLOCK)); + for (bi = 0; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; + } + } + blkn += compptr->MCU_width; + ypos += compptr->DCT_v_scaled_size; + } + } + /* Try to write the MCU. In event of a suspension failure, we will + * re-DCT the MCU on restart (a bit inefficient, could be fixed...) + */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +#ifdef FULL_COEF_BUFFER_SUPPORTED + +/* + * Process some data in the first pass of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * This amount of data is read from the source buffer, DCT'd and quantized, + * and saved into the virtual arrays. We also generate suitable dummy blocks + * as needed at the right and lower edges. (The dummy blocks are constructed + * in the virtual arrays, which have been padded appropriately.) This makes + * it possible for subsequent passes not to worry about real vs. dummy blocks. + * + * We must also emit the data to the entropy encoder. This is conveniently + * done by calling compress_output() after we've loaded the current strip + * of the virtual arrays. + * + * NB: input_buf contains a plane for each component in image. All + * components are DCT'd and loaded into the virtual arrays in this pass. + * However, it may be that only a subset of the components are emitted to + * the entropy encoder during this first pass; be careful about looking + * at the scan-dependent variables (MCU dimensions, etc). + */ + +METHODDEF(boolean) +compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION blocks_across, MCUs_across, MCUindex; + int bi, ci, h_samp_factor, block_row, block_rows, ndummy; + JCOEF lastDC; + jpeg_component_info *compptr; + JBLOCKARRAY buffer; + JBLOCKROW thisblockrow, lastblockrow; + forward_DCT_ptr forward_DCT; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (coef->iMCU_row_num < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here, since may not be set! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + blocks_across = compptr->width_in_blocks; + h_samp_factor = compptr->h_samp_factor; + /* Count number of dummy blocks to be added at the right margin. */ + ndummy = (int) (blocks_across % h_samp_factor); + if (ndummy > 0) + ndummy = h_samp_factor - ndummy; + forward_DCT = cinfo->fdct->forward_DCT[ci]; + /* Perform DCT for all non-dummy blocks in this iMCU row. Each call + * on forward_DCT processes a complete horizontal row of DCT blocks. + */ + for (block_row = 0; block_row < block_rows; block_row++) { + thisblockrow = buffer[block_row]; + (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow, + (JDIMENSION) (block_row * compptr->DCT_v_scaled_size), + (JDIMENSION) 0, blocks_across); + if (ndummy > 0) { + /* Create dummy blocks at the right edge of the image. */ + thisblockrow += blocks_across; /* => first dummy block */ + jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); + lastDC = thisblockrow[-1][0]; + for (bi = 0; bi < ndummy; bi++) { + thisblockrow[bi][0] = lastDC; + } + } + } + /* If at end of image, create dummy block rows as needed. + * The tricky part here is that within each MCU, we want the DC values + * of the dummy blocks to match the last real block's DC value. + * This squeezes a few more bytes out of the resulting file... + */ + if (coef->iMCU_row_num == last_iMCU_row) { + blocks_across += ndummy; /* include lower right corner */ + MCUs_across = blocks_across / h_samp_factor; + for (block_row = block_rows; block_row < compptr->v_samp_factor; + block_row++) { + thisblockrow = buffer[block_row]; + lastblockrow = buffer[block_row-1]; + jzero_far((void FAR *) thisblockrow, + (size_t) (blocks_across * SIZEOF(JBLOCK))); + for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { + lastDC = lastblockrow[h_samp_factor-1][0]; + for (bi = 0; bi < h_samp_factor; bi++) { + thisblockrow[bi][0] = lastDC; + } + thisblockrow += h_samp_factor; /* advance to next MCU in row */ + lastblockrow += h_samp_factor; + } + } + } + } + /* NB: compress_output will increment iMCU_row_num if successful. + * A suspension return will result in redoing all the work above next time. + */ + + /* Emit data to the entropy encoder, sharing code with subsequent passes */ + return compress_output(cinfo, input_buf); +} + + +/* + * Process some data in subsequent passes of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. + * NB: during first pass, this is safe only because the buffers will + * already be aligned properly, so jmemmgr.c won't need to do any I/O. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + +#endif /* FULL_COEF_BUFFER_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef FULL_COEF_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + int ci; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) compptr->v_samp_factor); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->whole_image[0] = NULL; /* flag for no virtual arrays */ + } +} diff -Nru mame-0.144/src/lib/libjpeg/jccolor.c mame-0.145/src/lib/libjpeg/jccolor.c --- mame-0.144/src/lib/libjpeg/jccolor.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jccolor.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,459 @@ +/* + * jccolor.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_converter pub; /* public fields */ + + /* Private state for RGB->YCC conversion */ + INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ +} my_color_converter; + +typedef my_color_converter * my_cconvert_ptr; + + +/**************** RGB -> YCbCr conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B + * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE + * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2, + * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and + * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0) + * were not represented exactly. Now we sacrifice exact representation of + * maximum red and maximum blue in order to get exact grayscales. + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times R,G,B for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included + * in the tables to save adding them separately in the inner loop. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS) +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L< Y section */ +#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ +#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ +#define R_CB_OFF (3*(MAXJSAMPLE+1)) +#define G_CB_OFF (4*(MAXJSAMPLE+1)) +#define B_CB_OFF (5*(MAXJSAMPLE+1)) +#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */ +#define G_CR_OFF (6*(MAXJSAMPLE+1)) +#define B_CR_OFF (7*(MAXJSAMPLE+1)) +#define TABLE_SIZE (8*(MAXJSAMPLE+1)) + + +/* + * Initialize for RGB->YCC colorspace conversion. + */ + +METHODDEF(void) +rgb_ycc_start (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + INT32 * rgb_ycc_tab; + INT32 i; + + /* Allocate and fill in the conversion tables. */ + cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (TABLE_SIZE * SIZEOF(INT32))); + + for (i = 0; i <= MAXJSAMPLE; i++) { + rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; + rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i; + rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; + rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i; + rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i; + /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr. + * This ensures that the maximum output will round to MAXJSAMPLE + * not MAXJSAMPLE+1, and thus that we don't have to range-limit. + */ + rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +/* B=>Cb and R=>Cr tables are the same + rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +*/ + rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i; + rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i; + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * + * Note that we change from the application's interleaved-pixel format + * to our internal noninterleaved, one-plane-per-component format. + * The input buffer is therefore three times as wide as the output buffer. + * + * A starting row offset is provided only for the output buffer. The caller + * can easily adjust the passed input_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +rgb_ycc_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/**************** Cases other than RGB -> YCbCr **************/ + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles RGB->grayscale conversion, which is the same + * as the RGB->Y portion of RGB->YCbCr. + * We assume rgb_ycc_start has been called (we only use the Y tables). + */ + +METHODDEF(void) +rgb_gray_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* Y */ + outptr[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles Adobe-style CMYK->YCCK conversion, + * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same + * conversion as above, while passing K (black) unchanged. + * We assume rgb_ycc_start has been called. + */ + +METHODDEF(void) +cmyk_ycck_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2, outptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + outptr3 = output_buf[3][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); + g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); + b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); + /* K passes through as-is */ + outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ + inptr += 4; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles grayscale output with no conversion. + * The source can be either plain grayscale or YCbCr (since Y == gray). + */ + +METHODDEF(void) +grayscale_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + int instride = cinfo->input_components; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ + inptr += instride; + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles multi-component colorspaces without conversion. + * We assume input_components == num_components. + */ + +METHODDEF(void) +null_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + register int ci; + int nc = cinfo->num_components; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + /* It seems fastest to make a separate pass for each component. */ + for (ci = 0; ci < nc; ci++) { + inptr = *input_buf; + outptr = output_buf[ci][output_row]; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ + inptr += nc; + } + } + input_buf++; + output_row++; + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +null_method (j_compress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for input colorspace conversion. + */ + +GLOBAL(void) +jinit_color_converter (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_converter)); + cinfo->cconvert = (struct jpeg_color_converter *) cconvert; + /* set start_pass to null method until we find out differently */ + cconvert->pub.start_pass = null_method; + + /* Make sure input_components agrees with in_color_space */ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + if (cinfo->input_components != 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + if (cinfo->input_components != RGB_PIXELSIZE) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; +#endif /* else share code with YCbCr */ + + case JCS_YCbCr: + if (cinfo->input_components != 3) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->input_components != 4) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->input_components < 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + } + + /* Check num_components, set conversion method based on requested space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_GRAYSCALE) + cconvert->pub.color_convert = grayscale_convert; + else if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_gray_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = grayscale_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_ycc_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = cmyk_ycck_convert; + } else if (cinfo->in_color_space == JCS_YCCK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: /* allow null conversion of JCS_UNKNOWN */ + if (cinfo->jpeg_color_space != cinfo->in_color_space || + cinfo->num_components != cinfo->input_components) + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + cconvert->pub.color_convert = null_convert; + break; + } +} diff -Nru mame-0.144/src/lib/libjpeg/jcdctmgr.c mame-0.145/src/lib/libjpeg/jcdctmgr.c --- mame-0.144/src/lib/libjpeg/jcdctmgr.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcdctmgr.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,482 @@ +/* + * jcdctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the forward-DCT management logic. + * This code selects a particular DCT implementation to be used, + * and it performs related housekeeping chores including coefficient + * quantization. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_forward_dct pub; /* public fields */ + + /* Pointer to the DCT routine actually in use */ + forward_DCT_method_ptr do_dct[MAX_COMPONENTS]; + + /* The actual post-DCT divisors --- not identical to the quant table + * entries, because of scaling (especially for an unnormalized DCT). + * Each table is given in normal array order. + */ + DCTELEM * divisors[NUM_QUANT_TBLS]; + +#ifdef DCT_FLOAT_SUPPORTED + /* Same as above for the floating-point case. */ + float_DCT_method_ptr do_float_dct[MAX_COMPONENTS]; + FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; +#endif +} my_fdct_controller; + +typedef my_fdct_controller * my_fdct_ptr; + + +/* The current scaled-DCT routines require ISLOW-style divisor tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef DCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Perform forward DCT on one or more blocks of a component. + * + * The input samples are taken from the sample_data[] array starting at + * position start_row/start_col, and moving to the right for any additional + * blocks. The quantized coefficients are returned in coef_blocks[]. + */ + +METHODDEF(void) +forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for integer DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index]; + DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; + DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register DCTELEM temp, qval; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + qval = divisors[i]; + temp = workspace[i]; + /* Divide the coefficient value by qval, ensuring proper rounding. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * + * In most files, at least half of the output values will be zero + * (at default quantization settings, more like three-quarters...) + * so we should ensure that this case is fast. On many machines, + * a comparison is enough cheaper than a divide to make a special test + * a win. Since both inputs will be nonnegative, we need only test + * for a < b to discover whether a/b is 0. + * If your machine's division is fast enough, define FAST_DIVIDE. + */ +#ifdef FAST_DIVIDE +#define DIVIDE_BY(a,b) a /= b +#else +#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 +#endif + if (temp < 0) { + temp = -temp; + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + temp = -temp; + } else { + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + } + output_ptr[i] = (JCOEF) temp; + } + } + } +} + + +#ifdef DCT_FLOAT_SUPPORTED + +METHODDEF(void) +forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for floating-point DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index]; + FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; + FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { + /* Perform the DCT */ + (*do_dct) (workspace, sample_data, start_col); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register FAST_FLOAT temp; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + /* Apply the quantization and scaling factor */ + temp = workspace[i] * divisors[i]; + /* Round to nearest integer. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * The maximum coefficient size is +-16K (for 12-bit data), so this + * code should work for either 16-bit or 32-bit ints. + */ + output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384); + } + } + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ + + +/* + * Initialize for a processing pass. + * Verify that all referenced Q-tables are present, and set up + * the divisor table for each one. + * In the current implementation, DCT of all components is done during + * the first pass, even if only some components will be output in the + * first scan. Hence all components should be examined here. + */ + +METHODDEF(void) +start_pass_fdctmgr (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + int ci, qtblno, i; + jpeg_component_info *compptr; + int method = 0; + JQUANT_TBL * qtbl; + DCTELEM * dtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper DCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef DCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_1x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_2x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_3x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_4x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_5x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_6x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_7x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((9 << 8) + 9): + fdct->do_dct[ci] = jpeg_fdct_9x9; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_10x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((11 << 8) + 11): + fdct->do_dct[ci] = jpeg_fdct_11x11; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_12x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((13 << 8) + 13): + fdct->do_dct[ci] = jpeg_fdct_13x13; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_14x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((15 << 8) + 15): + fdct->do_dct[ci] = jpeg_fdct_15x15; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_16x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_16x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_14x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_12x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_10x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_8x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_6x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_4x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_2x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_8x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_7x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_6x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_5x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_4x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_3x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_2x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((1 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_1x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + fdct->do_dct[ci] = jpeg_fdct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + fdct->do_dct[ci] = jpeg_fdct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + fdct->do_float_dct[ci] = jpeg_fdct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + qtblno = compptr->quant_tbl_no; + /* Make sure specified quantization table is present */ + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + qtbl = cinfo->quant_tbl_ptrs[qtblno]; + /* Compute divisors for this quant table */ + /* We may do this more than once for same table, but it's not a big deal */ + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + /* For LL&M IDCT method, divisors are equal to raw quantization + * coefficients multiplied by 8 (to counteract scaling). + */ + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + */ +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = (DCTELEM) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-3); + } + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + * What's actually stored is 1/divisor so that the inner loop can + * use a multiplication rather than a division. + */ + FAST_FLOAT * fdtbl; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + if (fdct->float_divisors[qtblno] == NULL) { + fdct->float_divisors[qtblno] = (FAST_FLOAT *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(FAST_FLOAT)); + } + fdtbl = fdct->float_divisors[qtblno]; + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fdtbl[i] = (FAST_FLOAT) + (1.0 / (((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 8.0))); + i++; + } + } + } + fdct->pub.forward_DCT[ci] = forward_DCT_float; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize FDCT manager. + */ + +GLOBAL(void) +jinit_forward_dct (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct; + int i; + + fdct = (my_fdct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_fdct_controller)); + cinfo->fdct = (struct jpeg_forward_dct *) fdct; + fdct->pub.start_pass = start_pass_fdctmgr; + + /* Mark divisor tables unallocated */ + for (i = 0; i < NUM_QUANT_TBLS; i++) { + fdct->divisors[i] = NULL; +#ifdef DCT_FLOAT_SUPPORTED + fdct->float_divisors[i] = NULL; +#endif + } +} diff -Nru mame-0.144/src/lib/libjpeg/jchuff.c mame-0.145/src/lib/libjpeg/jchuff.c --- mame-0.144/src/lib/libjpeg/jchuff.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jchuff.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1576 @@ +/* + * jchuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy encoding routines. + * Both sequential and progressive modes are supported in this single module. + * + * Much of the complexity here has to do with supporting output suspension. + * If the data destination module demands suspension, we want to be able to + * back up to the start of the current MCU. To do this, we copy state + * variables into local working storage, and update them back to the + * permanent JPEG objects only upon successful completion of an MCU. + * + * We do not support output suspension for the progressive JPEG mode, since + * the library currently does not allow multiple-scan files to be written + * with output suspension. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* The legal range of a DCT coefficient is + * -1024 .. +1023 for 8-bit data; + * -16384 .. +16383 for 12-bit data. + * Hence the magnitude should always fit in 10 or 14 bits respectively. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MAX_COEF_BITS 10 +#else +#define MAX_COEF_BITS 14 +#endif + +/* Derived data constructed for each Huffman table */ + +typedef struct { + unsigned int ehufco[256]; /* code for each symbol */ + char ehufsi[256]; /* length of code for each symbol */ + /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ +} c_derived_tbl; + + +/* Expanded entropy encoder object for Huffman encoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + INT32 put_buffer; /* current bit-accumulation buffer */ + int put_bits; /* # of bits now in it */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).put_buffer = (src).put_buffer, \ + (dest).put_bits = (src).put_bits, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + savable_state saved; /* Bit buffer & DC state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Statistics tables for optimization */ + long * dc_count_ptrs[NUM_HUFF_TBLS]; + long * ac_count_ptrs[NUM_HUFF_TBLS]; + + /* Following fields used only in progressive mode */ + + /* Mode flag: TRUE for optimization, FALSE for actual data output */ + boolean gather_statistics; + + /* next_output_byte/free_in_buffer are local copies of cinfo->dest fields. + */ + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ + + /* Coding status for AC components */ + int ac_tbl_no; /* the table number of the single component */ + unsigned int EOBRUN; /* run length of EOBs */ + unsigned int BE; /* # of buffered correction bits before MCU */ + char * bit_buffer; /* buffer for correction bits (1 per char) */ + /* packing correction bits tightly would save some space but cost time... */ +} huff_entropy_encoder; + +typedef huff_entropy_encoder * huff_entropy_ptr; + +/* Working state while writing an MCU (sequential mode). + * This struct contains all the fields that are needed by subroutines. + */ + +typedef struct { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + savable_state cur; /* Current bit buffer & DC state */ + j_compress_ptr cinfo; /* dump_buffer needs access to this */ +} working_state; + +/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit + * buffer can hold. Larger sizes may slightly improve compression, but + * 1000 is already well into the realm of overkill. + * The minimum safe size is 64 bits. + */ + +#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(void) +jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, + c_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + c_derived_tbl *dtbl; + int p, i, l, lastp, si, maxsymbol; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (c_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(c_derived_tbl)); + dtbl = *pdtbl; + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + lastp = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure C.3: generate encoding tables */ + /* These are code and size indexed by symbol value */ + + /* Set all codeless symbols to have code length 0; + * this lets us detect duplicate VAL entries here, and later + * allows emit_bits to detect any attempt to emit such symbols. + */ + MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); + + /* This is also a convenient place to check for out-of-range + * and duplicated VAL entries. We allow 0..255 for AC symbols + * but only 0..15 for DC. (We could constrain them further + * based on data depth and mode, but this seems enough.) + */ + maxsymbol = isDC ? 15 : 255; + + for (p = 0; p < lastp; p++) { + i = htbl->huffval[p]; + if (i < 0 || i > maxsymbol || dtbl->ehufsi[i]) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + dtbl->ehufco[i] = huffcode[p]; + dtbl->ehufsi[i] = huffsize[p]; + } +} + + +/* Outputting bytes to the file. + * NB: these must be called only when actually outputting, + * that is, entropy->gather_statistics == FALSE. + */ + +/* Emit a byte, taking 'action' if must suspend. */ +#define emit_byte_s(state,val,action) \ + { *(state)->next_output_byte++ = (JOCTET) (val); \ + if (--(state)->free_in_buffer == 0) \ + if (! dump_buffer_s(state)) \ + { action; } } + +/* Emit a byte */ +#define emit_byte_e(entropy,val) \ + { *(entropy)->next_output_byte++ = (JOCTET) (val); \ + if (--(entropy)->free_in_buffer == 0) \ + dump_buffer_e(entropy); } + + +LOCAL(boolean) +dump_buffer_s (working_state * state) +/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ +{ + struct jpeg_destination_mgr * dest = state->cinfo->dest; + + if (! (*dest->empty_output_buffer) (state->cinfo)) + return FALSE; + /* After a successful buffer dump, must reset buffer pointers */ + state->next_output_byte = dest->next_output_byte; + state->free_in_buffer = dest->free_in_buffer; + return TRUE; +} + + +LOCAL(void) +dump_buffer_e (huff_entropy_ptr entropy) +/* Empty the output buffer; we do not support suspension in this case. */ +{ + struct jpeg_destination_mgr * dest = entropy->cinfo->dest; + + if (! (*dest->empty_output_buffer) (entropy->cinfo)) + ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); + /* After a successful buffer dump, must reset buffer pointers */ + entropy->next_output_byte = dest->next_output_byte; + entropy->free_in_buffer = dest->free_in_buffer; +} + + +/* Outputting bits to the file */ + +/* Only the right 24 bits of put_buffer are used; the valid bits are + * left-justified in this part. At most 16 bits can be passed to emit_bits + * in one call, and we never retain more than 7 bits in put_buffer + * between calls, so 24 bits are sufficient. + */ + +/*INLINE*/ +LOCAL(boolean) +emit_bits_s (working_state * state, unsigned int code, int size) +/* Emit some bits; return TRUE if successful, FALSE if must suspend */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = state->cur.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE); + + put_buffer &= (((INT32) 1)<cur.put_buffer; /* and merge with old buffer contents */ + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_s(state, c, return FALSE); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_s(state, 0, return FALSE); + } + put_buffer <<= 8; + put_bits -= 8; + } + + state->cur.put_buffer = put_buffer; /* update state variables */ + state->cur.put_bits = put_bits; + + return TRUE; +} + + +/*INLINE*/ +LOCAL(void) +emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size) +/* Emit some bits, unless we are in gather mode */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = entropy->saved.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + if (entropy->gather_statistics) + return; /* do nothing if we're only getting stats */ + + put_buffer &= (((INT32) 1)<saved.put_buffer; + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_e(entropy, c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_e(entropy, 0); + } + put_buffer <<= 8; + put_bits -= 8; + } + + entropy->saved.put_buffer = put_buffer; /* update variables */ + entropy->saved.put_bits = put_bits; +} + + +LOCAL(boolean) +flush_bits_s (working_state * state) +{ + if (! emit_bits_s(state, 0x7F, 7)) /* fill any partial byte with ones */ + return FALSE; + state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ + state->cur.put_bits = 0; + return TRUE; +} + + +LOCAL(void) +flush_bits_e (huff_entropy_ptr entropy) +{ + emit_bits_e(entropy, 0x7F, 7); /* fill any partial byte with ones */ + entropy->saved.put_buffer = 0; /* and reset bit-buffer to empty */ + entropy->saved.put_bits = 0; +} + + +/* + * Emit (or just count) a Huffman symbol. + */ + +/*INLINE*/ +LOCAL(void) +emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->dc_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/*INLINE*/ +LOCAL(void) +emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->ac_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/* + * Emit bits from a correction bit buffer. + */ + +LOCAL(void) +emit_buffered_bits (huff_entropy_ptr entropy, char * bufstart, + unsigned int nbits) +{ + if (entropy->gather_statistics) + return; /* no real work */ + + while (nbits > 0) { + emit_bits_e(entropy, (unsigned int) (*bufstart), 1); + bufstart++; + nbits--; + } +} + + +/* + * Emit any pending EOBRUN symbol. + */ + +LOCAL(void) +emit_eobrun (huff_entropy_ptr entropy) +{ + register int temp, nbits; + + if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ + temp = entropy->EOBRUN; + nbits = 0; + while ((temp >>= 1)) + nbits++; + /* safety check: shouldn't happen given limited correction-bit buffer */ + if (nbits > 14) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + emit_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4); + if (nbits) + emit_bits_e(entropy, entropy->EOBRUN, nbits); + + entropy->EOBRUN = 0; + + /* Emit any buffered correction bits */ + emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); + entropy->BE = 0; + } +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(boolean) +emit_restart_s (working_state * state, int restart_num) +{ + int ci; + + if (! flush_bits_s(state)) + return FALSE; + + emit_byte_s(state, 0xFF, return FALSE); + emit_byte_s(state, JPEG_RST0 + restart_num, return FALSE); + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) + state->cur.last_dc_val[ci] = 0; + + /* The restart counter is not updated until we successfully write the MCU. */ + + return TRUE; +} + + +LOCAL(void) +emit_restart_e (huff_entropy_ptr entropy, int restart_num) +{ + int ci; + + emit_eobrun(entropy); + + if (! entropy->gather_statistics) { + flush_bits_e(entropy); + emit_byte_e(entropy, 0xFF); + emit_byte_e(entropy, JPEG_RST0 + restart_num); + } + + if (entropy->cinfo->Ss == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + } else { + /* Re-initialize all AC-related fields to 0 */ + entropy->EOBRUN = 0; + entropy->BE = 0; + } +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + int blkn, ci; + int Al = cinfo->Al; + JBLOCKROW block; + jpeg_component_info * compptr; + ISHIFT_TEMPS + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); + + /* DC differences are figured on the point-transformed values. */ + temp = temp2 - entropy->saved.last_dc_val[ci]; + entropy->saved.last_dc_val[ci] = temp2; + + /* Encode the DC coefficient difference per section G.1.2.1 */ + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit the Huffman-coded symbol for the number of bits */ + emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + register int r, k; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ + + r = 0; /* r = run length of zeros */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = (*block)[natural_order[k]]) == 0) { + r++; + continue; + } + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value; so the code is + * interwoven with finding the abs value (temp) and output bits (temp2). + */ + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ + temp2 = ~temp; + } else { + temp >>= Al; /* apply the point transform */ + temp2 = temp; + } + /* Watch out for case that nonzero coef is zero after point transform */ + if (temp == 0) { + r++; + continue; + } + + /* Emit any pending EOBRUN */ + if (entropy->EOBRUN > 0) + emit_eobrun(entropy); + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + + r = 0; /* reset zero run length */ + } + + if (r > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + if (entropy->EOBRUN == 0x7FFF) + emit_eobrun(entropy); /* force it out to avoid overflow */ + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + int blkn; + int Al = cinfo->Al; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* We simply emit the Al'th bit of the DC coefficient value. */ + temp = (*block)[0]; + emit_bits_e(entropy, (unsigned int) (temp >> Al), 1); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + register int r, k; + int EOB; + char *BR_buffer; + unsigned int BR; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + int absvalues[DCTSIZE2]; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* It is convenient to make a pre-pass to determine the transformed + * coefficients' absolute values and the EOB position. + */ + EOB = 0; + for (k = cinfo->Ss; k <= Se; k++) { + temp = (*block)[natural_order[k]]; + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if (temp < 0) + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + absvalues[k] = temp; /* save abs value for main pass */ + if (temp == 1) + EOB = k; /* EOB = index of last newly-nonzero coef */ + } + + /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ + + r = 0; /* r = run length of zeros */ + BR = 0; /* BR = count of buffered bits added now */ + BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = absvalues[k]) == 0) { + r++; + continue; + } + + /* Emit any required ZRLs, but not if they can be folded into EOB */ + while (r > 15 && k <= EOB) { + /* emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + /* Emit ZRL */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + /* Emit buffered correction bits that must be associated with ZRL */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + } + + /* If the coef was previously nonzero, it only needs a correction bit. + * NOTE: a straight translation of the spec's figure G.7 would suggest + * that we also need to test r > 15. But if r > 15, we can only get here + * if k > EOB, which implies that this coefficient is not 1. + */ + if (temp > 1) { + /* The correction bit is the next bit of the absolute value. */ + BR_buffer[BR++] = (char) (temp & 1); + continue; + } + + /* Emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); + + /* Emit output bit for newly-nonzero coef */ + temp = ((*block)[natural_order[k]] < 0) ? 0 : 1; + emit_bits_e(entropy, (unsigned int) temp, 1); + + /* Emit buffered correction bits that must be associated with this code */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + r = 0; /* reset zero run length */ + } + + if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + entropy->BE += BR; /* concat my correction bits to older ones */ + /* We force out the EOB if we risk either: + * 1. overflow of the EOB counter; + * 2. overflow of the correction bit buffer during the next MCU. + */ + if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) + emit_eobrun(entropy); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* Encode a single block's worth of coefficients */ + +LOCAL(boolean) +encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, + c_derived_tbl *dctbl, c_derived_tbl *actbl) +{ + register int temp, temp2; + register int nbits; + register int k, r, i; + int Se = state->cinfo->lim_Se; + const int * natural_order = state->cinfo->natural_order; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = temp2 = block[0] - last_dc_val; + + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit the Huffman-coded symbol for the number of bits */ + if (! emit_bits_s(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) + return FALSE; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + if (! emit_bits_s(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) + return FALSE; + r -= 16; + } + + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit Huffman symbol for run length / number of bits */ + i = (r << 4) + nbits; + if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) + return FALSE; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + if (! emit_bits_s(state, actbl->ehufco[0], actbl->ehufsi[0])) + return FALSE; + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of Huffman-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + int blkn, ci; + jpeg_component_info * compptr; + + /* Load up working state */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! emit_restart_s(&state, entropy->next_restart_num)) + return FALSE; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + if (! encode_one_block(&state, + MCU_data[blkn][0], state.cur.last_dc_val[ci], + entropy->dc_derived_tbls[compptr->dc_tbl_no], + entropy->ac_derived_tbls[compptr->ac_tbl_no])) + return FALSE; + /* Update last_dc_val */ + state.cur.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + /* Completed MCU, so update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * Finish up at the end of a Huffman-compressed scan. + */ + +METHODDEF(void) +finish_pass_huff (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + + if (cinfo->progressive_mode) { + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Flush out any buffered data */ + emit_eobrun(entropy); + flush_bits_e(entropy); + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + } else { + /* Load up working state ... flush_bits needs it */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Flush out the last data */ + if (! flush_bits_s(&state)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + } +} + + +/* + * Huffman coding optimization. + * + * We first scan the supplied data and count the number of uses of each symbol + * that is to be Huffman-coded. (This process MUST agree with the code above.) + * Then we build a Huffman coding tree for the observed counts. + * Symbols which are not needed at all for the particular image are not + * assigned any code, which saves space in the DHT marker as well as in + * the compressed data. + */ + + +/* Process a single block's worth of coefficients */ + +LOCAL(void) +htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, + long dc_counts[], long ac_counts[]) +{ + register int temp; + register int nbits; + register int k, r; + int Se = cinfo->lim_Se; + const int * natural_order = cinfo->natural_order; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = block[0] - last_dc_val; + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count the Huffman symbol for the number of bits */ + dc_counts[nbits]++; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + ac_counts[0xF0]++; + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count Huffman symbol for run length / number of bits */ + ac_counts[(r << 4) + nbits]++; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + ac_counts[0]++; +} + + +/* + * Trial-encode one MCU's worth of Huffman-compressed coefficients. + * No data is actually output, so no suspension return is possible. + */ + +METHODDEF(boolean) +encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn, ci; + jpeg_component_info * compptr; + + /* Take care of restart intervals if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Update restart state */ + entropy->restarts_to_go = cinfo->restart_interval; + } + entropy->restarts_to_go--; + } + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci], + entropy->dc_count_ptrs[compptr->dc_tbl_no], + entropy->ac_count_ptrs[compptr->ac_tbl_no]); + entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + return TRUE; +} + + +/* + * Generate the best Huffman code table for the given counts, fill htbl. + * + * The JPEG standard requires that no symbol be assigned a codeword of all + * one bits (so that padding bits added at the end of a compressed segment + * can't look like a valid code). Because of the canonical ordering of + * codewords, this just means that there must be an unused slot in the + * longest codeword length category. Section K.2 of the JPEG spec suggests + * reserving such a slot by pretending that symbol 256 is a valid symbol + * with count 1. In theory that's not optimal; giving it count zero but + * including it in the symbol set anyway should give a better Huffman code. + * But the theoretically better code actually seems to come out worse in + * practice, because it produces more all-ones bytes (which incur stuffed + * zero bytes in the final file). In any case the difference is tiny. + * + * The JPEG standard requires Huffman codes to be no more than 16 bits long. + * If some symbols have a very small but nonzero probability, the Huffman tree + * must be adjusted to meet the code length restriction. We currently use + * the adjustment method suggested in JPEG section K.2. This method is *not* + * optimal; it may not choose the best possible limited-length code. But + * typically only very-low-frequency symbols will be given less-than-optimal + * lengths, so the code is almost optimal. Experimental comparisons against + * an optimal limited-length-code algorithm indicate that the difference is + * microscopic --- usually less than a hundredth of a percent of total size. + * So the extra complexity of an optimal algorithm doesn't seem worthwhile. + */ + +LOCAL(void) +jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) +{ +#define MAX_CLEN 32 /* assumed maximum initial code length */ + UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ + int codesize[257]; /* codesize[k] = code length of symbol k */ + int others[257]; /* next symbol in current branch of tree */ + int c1, c2; + int p, i, j; + long v; + + /* This algorithm is explained in section K.2 of the JPEG standard */ + + MEMZERO(bits, SIZEOF(bits)); + MEMZERO(codesize, SIZEOF(codesize)); + for (i = 0; i < 257; i++) + others[i] = -1; /* init links to empty */ + + freq[256] = 1; /* make sure 256 has a nonzero count */ + /* Including the pseudo-symbol 256 in the Huffman procedure guarantees + * that no real symbol is given code-value of all ones, because 256 + * will be placed last in the largest codeword category. + */ + + /* Huffman's basic algorithm to assign optimal code lengths to symbols */ + + for (;;) { + /* Find the smallest nonzero frequency, set c1 = its symbol */ + /* In case of ties, take the larger symbol number */ + c1 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v) { + v = freq[i]; + c1 = i; + } + } + + /* Find the next smallest nonzero frequency, set c2 = its symbol */ + /* In case of ties, take the larger symbol number */ + c2 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v && i != c1) { + v = freq[i]; + c2 = i; + } + } + + /* Done if we've merged everything into one frequency */ + if (c2 < 0) + break; + + /* Else merge the two counts/trees */ + freq[c1] += freq[c2]; + freq[c2] = 0; + + /* Increment the codesize of everything in c1's tree branch */ + codesize[c1]++; + while (others[c1] >= 0) { + c1 = others[c1]; + codesize[c1]++; + } + + others[c1] = c2; /* chain c2 onto c1's tree branch */ + + /* Increment the codesize of everything in c2's tree branch */ + codesize[c2]++; + while (others[c2] >= 0) { + c2 = others[c2]; + codesize[c2]++; + } + } + + /* Now count the number of symbols of each code length */ + for (i = 0; i <= 256; i++) { + if (codesize[i]) { + /* The JPEG standard seems to think that this can't happen, */ + /* but I'm paranoid... */ + if (codesize[i] > MAX_CLEN) + ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW); + + bits[codesize[i]]++; + } + } + + /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure + * Huffman procedure assigned any such lengths, we must adjust the coding. + * Here is what the JPEG spec says about how this next bit works: + * Since symbols are paired for the longest Huffman code, the symbols are + * removed from this length category two at a time. The prefix for the pair + * (which is one bit shorter) is allocated to one of the pair; then, + * skipping the BITS entry for that prefix length, a code word from the next + * shortest nonzero BITS entry is converted into a prefix for two code words + * one bit longer. + */ + + for (i = MAX_CLEN; i > 16; i--) { + while (bits[i] > 0) { + j = i - 2; /* find length of new prefix to be used */ + while (bits[j] == 0) + j--; + + bits[i] -= 2; /* remove two symbols */ + bits[i-1]++; /* one goes in this length */ + bits[j+1] += 2; /* two new symbols in this length */ + bits[j]--; /* symbol of this length is now a prefix */ + } + } + + /* Remove the count for the pseudo-symbol 256 from the largest codelength */ + while (bits[i] == 0) /* find largest codelength still in use */ + i--; + bits[i]--; + + /* Return final symbol counts (only for lengths 0..16) */ + MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); + + /* Return a list of the symbols sorted by code length */ + /* It's not real clear to me why we don't need to consider the codelength + * changes made above, but the JPEG spec seems to think this works. + */ + p = 0; + for (i = 1; i <= MAX_CLEN; i++) { + for (j = 0; j <= 255; j++) { + if (codesize[j] == i) { + htbl->huffval[p] = (UINT8) j; + p++; + } + } + } + + /* Set sent_table FALSE so updated table will be written to JPEG file. */ + htbl->sent_table = FALSE; +} + + +/* + * Finish up a statistics-gathering pass and create the new Huffman tables. + */ + +METHODDEF(void) +finish_pass_gather (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + JHUFF_TBL **htblptr; + boolean did_dc[NUM_HUFF_TBLS]; + boolean did_ac[NUM_HUFF_TBLS]; + + /* It's important not to apply jpeg_gen_optimal_table more than once + * per table, because it clobbers the input frequency counts! + */ + if (cinfo->progressive_mode) + /* Flush out buffered data (all we care about is counting the EOB symbol) */ + emit_eobrun(entropy); + + MEMZERO(did_dc, SIZEOF(did_dc)); + MEMZERO(did_ac, SIZEOF(did_ac)); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (! did_dc[tbl]) { + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]); + did_dc[tbl] = TRUE; + } + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (! did_ac[tbl]) { + htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[tbl]); + did_ac[tbl] = TRUE; + } + } + } +} + + +/* + * Initialize for a Huffman-compressed scan. + * If gather_statistics is TRUE, we do not output anything during the scan, + * just count the Huffman symbols used and generate Huffman code tables. + */ + +METHODDEF(void) +start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + entropy->pub.finish_pass = finish_pass_gather; + else + entropy->pub.finish_pass = finish_pass_huff; + + if (cinfo->progressive_mode) { + entropy->cinfo = cinfo; + entropy->gather_statistics = gather_statistics; + + /* We assume jcmaster.c already validated the scan parameters. */ + + /* Select execution routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else { + entropy->pub.encode_mcu = encode_mcu_AC_refine; + /* AC refinement needs a correction bit buffer */ + if (entropy->bit_buffer == NULL) + entropy->bit_buffer = (char *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + MAX_CORR_BITS * SIZEOF(char)); + } + } + + /* Initialize AC stuff */ + entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no; + entropy->EOBRUN = 0; + entropy->BE = 0; + } else { + if (gather_statistics) + entropy->pub.encode_mcu = encode_mcu_gather; + else + entropy->pub.encode_mcu = encode_mcu_huff; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (gather_statistics) { + /* Check for invalid table index */ + /* (make_c_derived_tbl does this in the other path) */ + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + /* Allocate and zero the statistics tables */ + /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ + if (entropy->dc_count_ptrs[tbl] == NULL) + entropy->dc_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_c_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (gather_statistics) { + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + if (entropy->ac_count_ptrs[tbl] == NULL) + entropy->ac_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + jpeg_make_c_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + } + } + + /* Initialize bit buffer to empty */ + entropy->saved.put_buffer = 0; + entropy->saved.put_bits = 0; + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for Huffman entropy encoding. + */ + +GLOBAL(void) +jinit_huff_encoder (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass_huff; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; + } + + if (cinfo->progressive_mode) + entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ +} diff -Nru mame-0.144/src/lib/libjpeg/jcinit.c mame-0.145/src/lib/libjpeg/jcinit.c --- mame-0.144/src/lib/libjpeg/jcinit.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcinit.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,65 @@ +/* + * jcinit.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains initialization logic for the JPEG compressor. + * This routine is in charge of selecting the modules to be executed and + * making an initialization call to each one. + * + * Logically, this code belongs in jcmaster.c. It's split out because + * linking this routine implies linking the entire compression library. + * For a transcoding-only application, we want to be able to use jcmaster.c + * without linking in the whole library. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Master selection of compression modules. + * This is done once at the start of processing an image. We determine + * which modules will be used and give them appropriate initialization calls. + */ + +GLOBAL(void) +jinit_compress_master (j_compress_ptr cinfo) +{ + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, FALSE /* full compression */); + + /* Preprocessing */ + if (! cinfo->raw_data_in) { + jinit_color_converter(cinfo); + jinit_downsampler(cinfo); + jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */); + } + /* Forward DCT */ + jinit_forward_dct(cinfo); + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); + } + + /* Need a full-image coefficient buffer in any multi-pass mode. */ + jinit_c_coef_controller(cinfo, + (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding)); + jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} diff -Nru mame-0.144/src/lib/libjpeg/jcmainct.c mame-0.145/src/lib/libjpeg/jcmainct.c --- mame-0.144/src/lib/libjpeg/jcmainct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcmainct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,293 @@ +/* + * jcmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for compression. + * The main buffer lies between the pre-processor and the JPEG + * compressor proper; it holds downsampled data in the JPEG colorspace. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Note: currently, there is no operating mode in which a full-image buffer + * is needed at this step. If there were, that mode could not be used with + * "raw data" input, since this module is bypassed in that case. However, + * we've left the code here for possible use in special applications. + */ +#undef FULL_MAIN_BUFFER_SUPPORTED + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_main_controller pub; /* public fields */ + + JDIMENSION cur_iMCU_row; /* number of current iMCU row */ + JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ + boolean suspended; /* remember if we suspended output */ + J_BUF_MODE pass_mode; /* current operating mode */ + + /* If using just a strip buffer, this points to the entire set of buffers + * (we allocate one for each component). In the full-image case, this + * points to the currently accessible strips of the virtual arrays. + */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* If using full-image storage, this array holds pointers to virtual-array + * control blocks for each component. Unused if not full-image storage. + */ + jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; +#endif +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#ifdef FULL_MAIN_BUFFER_SUPPORTED +METHODDEF(void) process_data_buffer_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + + /* Do nothing in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + mymain->cur_iMCU_row = 0; /* initialize counters */ + mymain->rowgroup_ctr = 0; + mymain->suspended = FALSE; + mymain->pass_mode = pass_mode; /* save mode for use by process_data */ + + switch (pass_mode) { + case JBUF_PASS_THRU: +#ifdef FULL_MAIN_BUFFER_SUPPORTED + if (mymain->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + mymain->pub.process_data = process_data_simple_main; + break; +#ifdef FULL_MAIN_BUFFER_SUPPORTED + case JBUF_SAVE_SOURCE: + case JBUF_CRANK_DEST: + case JBUF_SAVE_AND_PASS: + if (mymain->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + mymain->pub.process_data = process_data_buffer_main; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This routine handles the simple pass-through mode, + * where we have only a strip buffer. + */ + +METHODDEF(void) +process_data_simple_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + + while (mymain->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Read input data if we haven't filled the main buffer yet */ + if (mymain->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size) + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + mymain->buffer, &mymain->rowgroup_ctr, + (JDIMENSION) cinfo->min_DCT_v_scaled_size); + + /* If we don't have a full iMCU row buffered, return to application for + * more data. Note that preprocessor will always pad to fill the iMCU row + * at the bottom of the image. + */ + if (mymain->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size) + return; + + /* Send the completed row to the compressor */ + if (! (*cinfo->coef->compress_data) (cinfo, mymain->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! mymain->suspended) { + (*in_row_ctr)--; + mymain->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (mymain->suspended) { + (*in_row_ctr)++; + mymain->suspended = FALSE; + } + mymain->rowgroup_ctr = 0; + mymain->cur_iMCU_row++; + } +} + + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + +/* + * Process some data. + * This routine handles all of the modes that use a full-size buffer. + */ + +METHODDEF(void) +process_data_buffer_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr main = (my_main_ptr) cinfo->main; + int ci; + jpeg_component_info *compptr; + boolean writing = (main->pass_mode != JBUF_CRANK_DEST); + + while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Realign the virtual buffers if at the start of an iMCU row. */ + if (main->rowgroup_ctr == 0) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + main->buffer[ci] = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, main->whole_image[ci], + main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), + (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); + } + /* In a read pass, pretend we just read some source data. */ + if (! writing) { + *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; + main->rowgroup_ctr = DCTSIZE; + } + } + + /* If a write pass, read input data until the current iMCU row is full. */ + /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ + if (writing) { + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + main->buffer, &main->rowgroup_ctr, + (JDIMENSION) DCTSIZE); + /* Return to application if we need more data to fill the iMCU row. */ + if (main->rowgroup_ctr < DCTSIZE) + return; + } + + /* Emit data, unless this is a sink-only pass. */ + if (main->pass_mode != JBUF_SAVE_SOURCE) { + if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! main->suspended) { + (*in_row_ctr)--; + main->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (main->suspended) { + (*in_row_ctr)++; + main->suspended = FALSE; + } + } + + /* If get here, we are done with this iMCU row. Mark buffer empty. */ + main->rowgroup_ctr = 0; + main->cur_iMCU_row++; + } +} + +#endif /* FULL_MAIN_BUFFER_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr mymain; + int ci; + jpeg_component_info *compptr; + + mymain = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_c_main_controller *) mymain; + mymain->pub.start_pass = start_pass_main; + + /* We don't need to create a buffer in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + /* Create the buffer. It holds downsampled data, so each component + * may be of a different size. + */ + if (need_full_buffer) { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component */ + /* Note we pad the bottom to a multiple of the iMCU height */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + mymain->whole_image[ci] = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor) * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + mymain->whole_image[0] = NULL; /* flag for no virtual arrays */ +#endif + /* Allocate a strip buffer for each component */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + mymain->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); + } + } +} diff -Nru mame-0.144/src/lib/libjpeg/jcmarker.c mame-0.145/src/lib/libjpeg/jcmarker.c --- mame-0.144/src/lib/libjpeg/jcmarker.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcmarker.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,682 @@ +/* + * jcmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to write JPEG datastream markers. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_writer pub; /* public fields */ + + unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */ +} my_marker_writer; + +typedef my_marker_writer * my_marker_ptr; + + +/* + * Basic output routines. + * + * Note that we do not support suspension while writing a marker. + * Therefore, an application using suspension must ensure that there is + * enough buffer space for the initial markers (typ. 600-700 bytes) before + * calling jpeg_start_compress, and enough space to write the trailing EOI + * (a few bytes) before calling jpeg_finish_compress. Multipass compression + * modes are not supported at all with suspension, so those two are the only + * points where markers will be written. + */ + +LOCAL(void) +emit_byte (j_compress_ptr cinfo, int val) +/* Emit a byte */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *(dest->next_output_byte)++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) { + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } +} + + +LOCAL(void) +emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark) +/* Emit a marker code */ +{ + emit_byte(cinfo, 0xFF); + emit_byte(cinfo, (int) mark); +} + + +LOCAL(void) +emit_2bytes (j_compress_ptr cinfo, int value) +/* Emit a 2-byte integer; these are always MSB first in JPEG files */ +{ + emit_byte(cinfo, (value >> 8) & 0xFF); + emit_byte(cinfo, value & 0xFF); +} + + +/* + * Routines to write specific marker types. + */ + +LOCAL(int) +emit_dqt (j_compress_ptr cinfo, int index) +/* Emit a DQT marker */ +/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ +{ + JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index]; + int prec; + int i; + + if (qtbl == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); + + prec = 0; + for (i = 0; i <= cinfo->lim_Se; i++) { + if (qtbl->quantval[cinfo->natural_order[i]] > 255) + prec = 1; + } + + if (! qtbl->sent_table) { + emit_marker(cinfo, M_DQT); + + emit_2bytes(cinfo, + prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2); + + emit_byte(cinfo, index + (prec<<4)); + + for (i = 0; i <= cinfo->lim_Se; i++) { + /* The table entries must be emitted in zigzag order. */ + unsigned int qval = qtbl->quantval[cinfo->natural_order[i]]; + if (prec) + emit_byte(cinfo, (int) (qval >> 8)); + emit_byte(cinfo, (int) (qval & 0xFF)); + } + + qtbl->sent_table = TRUE; + } + + return prec; +} + + +LOCAL(void) +emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) +/* Emit a DHT marker */ +{ + JHUFF_TBL * htbl; + int length, i; + + if (is_ac) { + htbl = cinfo->ac_huff_tbl_ptrs[index]; + index += 0x10; /* output index has AC bit set */ + } else { + htbl = cinfo->dc_huff_tbl_ptrs[index]; + } + + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index); + + if (! htbl->sent_table) { + emit_marker(cinfo, M_DHT); + + length = 0; + for (i = 1; i <= 16; i++) + length += htbl->bits[i]; + + emit_2bytes(cinfo, length + 2 + 1 + 16); + emit_byte(cinfo, index); + + for (i = 1; i <= 16; i++) + emit_byte(cinfo, htbl->bits[i]); + + for (i = 0; i < length; i++) + emit_byte(cinfo, htbl->huffval[i]); + + htbl->sent_table = TRUE; + } +} + + +LOCAL(void) +emit_dac (j_compress_ptr cinfo) +/* Emit a DAC marker */ +/* Since the useful info is so small, we want to emit all the tables in */ +/* one DAC marker. Therefore this routine does its own scan of the table. */ +{ +#ifdef C_ARITH_CODING_SUPPORTED + char dc_in_use[NUM_ARITH_TBLS]; + char ac_in_use[NUM_ARITH_TBLS]; + int length, i; + jpeg_component_info *compptr; + + for (i = 0; i < NUM_ARITH_TBLS; i++) + dc_in_use[i] = ac_in_use[i] = 0; + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + dc_in_use[compptr->dc_tbl_no] = 1; + /* AC needs no table when not present */ + if (cinfo->Se) + ac_in_use[compptr->ac_tbl_no] = 1; + } + + length = 0; + for (i = 0; i < NUM_ARITH_TBLS; i++) + length += dc_in_use[i] + ac_in_use[i]; + + if (length) { + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } + } + } +#endif /* C_ARITH_CODING_SUPPORTED */ +} + + +LOCAL(void) +emit_dri (j_compress_ptr cinfo) +/* Emit a DRI marker */ +{ + emit_marker(cinfo, M_DRI); + + emit_2bytes(cinfo, 4); /* fixed length */ + + emit_2bytes(cinfo, (int) cinfo->restart_interval); +} + + +LOCAL(void) +emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) +/* Emit a SOF marker */ +{ + int ci; + jpeg_component_info *compptr; + + emit_marker(cinfo, code); + + emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ + + /* Make sure image isn't bigger than SOF field can handle */ + if ((long) cinfo->jpeg_height > 65535L || + (long) cinfo->jpeg_width > 65535L) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); + + emit_byte(cinfo, cinfo->data_precision); + emit_2bytes(cinfo, (int) cinfo->jpeg_height); + emit_2bytes(cinfo, (int) cinfo->jpeg_width); + + emit_byte(cinfo, cinfo->num_components); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + emit_byte(cinfo, compptr->component_id); + emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor); + emit_byte(cinfo, compptr->quant_tbl_no); + } +} + + +LOCAL(void) +emit_sos (j_compress_ptr cinfo) +/* Emit a SOS marker */ +{ + int i, td, ta; + jpeg_component_info *compptr; + + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ + + emit_byte(cinfo, cinfo->comps_in_scan); + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + emit_byte(cinfo, compptr->component_id); + + /* We emit 0 for unused field(s); this is recommended by the P&M text + * but does not seem to be specified in the standard. + */ + + /* DC needs no table for refinement scan */ + td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0; + /* AC needs no table when not present */ + ta = cinfo->Se ? compptr->ac_tbl_no : 0; + + emit_byte(cinfo, (td << 4) + ta); + } + + emit_byte(cinfo, cinfo->Ss); + emit_byte(cinfo, cinfo->Se); + emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al); +} + + +LOCAL(void) +emit_pseudo_sos (j_compress_ptr cinfo) +/* Emit a pseudo SOS marker */ +{ + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 + 1 + 3); /* length */ + + emit_byte(cinfo, 0); /* Ns */ + + emit_byte(cinfo, 0); /* Ss */ + emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */ + emit_byte(cinfo, 0); /* Ah/Al */ +} + + +LOCAL(void) +emit_jfif_app0 (j_compress_ptr cinfo) +/* Emit a JFIF-compliant APP0 marker */ +{ + /* + * Length of APP0 block (2 bytes) + * Block ID (4 bytes - ASCII "JFIF") + * Zero byte (1 byte to terminate the ID string) + * Version Major, Minor (2 bytes - major first) + * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) + * Xdpu (2 bytes - dots per unit horizontal) + * Ydpu (2 bytes - dots per unit vertical) + * Thumbnail X size (1 byte) + * Thumbnail Y size (1 byte) + */ + + emit_marker(cinfo, M_APP0); + + emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ + + emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0x49); + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0); + emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */ + emit_byte(cinfo, cinfo->JFIF_minor_version); + emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ + emit_2bytes(cinfo, (int) cinfo->X_density); + emit_2bytes(cinfo, (int) cinfo->Y_density); + emit_byte(cinfo, 0); /* No thumbnail image */ + emit_byte(cinfo, 0); +} + + +LOCAL(void) +emit_adobe_app14 (j_compress_ptr cinfo) +/* Emit an Adobe APP14 marker */ +{ + /* + * Length of APP14 block (2 bytes) + * Block ID (5 bytes - ASCII "Adobe") + * Version Number (2 bytes - currently 100) + * Flags0 (2 bytes - currently 0) + * Flags1 (2 bytes - currently 0) + * Color transform (1 byte) + * + * Although Adobe TN 5116 mentions Version = 101, all the Adobe files + * now in circulation seem to use Version = 100, so that's what we write. + * + * We write the color transform byte as 1 if the JPEG color space is + * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with + * whether the encoder performed a transformation, which is pretty useless. + */ + + emit_marker(cinfo, M_APP14); + + emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */ + + emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */ + emit_byte(cinfo, 0x64); + emit_byte(cinfo, 0x6F); + emit_byte(cinfo, 0x62); + emit_byte(cinfo, 0x65); + emit_2bytes(cinfo, 100); /* Version */ + emit_2bytes(cinfo, 0); /* Flags0 */ + emit_2bytes(cinfo, 0); /* Flags1 */ + switch (cinfo->jpeg_color_space) { + case JCS_YCbCr: + emit_byte(cinfo, 1); /* Color transform = 1 */ + break; + case JCS_YCCK: + emit_byte(cinfo, 2); /* Color transform = 2 */ + break; + default: + emit_byte(cinfo, 0); /* Color transform = 0 */ + break; + } +} + + +/* + * These routines allow writing an arbitrary marker with parameters. + * The only intended use is to emit COM or APPn markers after calling + * write_file_header and before calling write_frame_header. + * Other uses are not guaranteed to produce desirable results. + * Counting the parameter bytes properly is the caller's responsibility. + */ + +METHODDEF(void) +write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +/* Emit an arbitrary marker header */ +{ + if (datalen > (unsigned int) 65533) /* safety check */ + ERREXIT(cinfo, JERR_BAD_LENGTH); + + emit_marker(cinfo, (JPEG_MARKER) marker); + + emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */ +} + +METHODDEF(void) +write_marker_byte (j_compress_ptr cinfo, int val) +/* Emit one byte of marker parameters following write_marker_header */ +{ + emit_byte(cinfo, val); +} + + +/* + * Write datastream header. + * This consists of an SOI and optional APPn markers. + * We recommend use of the JFIF marker, but not the Adobe marker, + * when using YCbCr or grayscale data. The JFIF marker should NOT + * be used for any other JPEG colorspace. The Adobe marker is helpful + * to distinguish RGB, CMYK, and YCCK colorspaces. + * Note that an application can write additional header markers after + * jpeg_start_compress returns. + */ + +METHODDEF(void) +write_file_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + emit_marker(cinfo, M_SOI); /* first the SOI */ + + /* SOI is defined to reset restart interval to 0 */ + marker->last_restart_interval = 0; + + if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ + emit_jfif_app0(cinfo); + if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */ + emit_adobe_app14(cinfo); +} + + +/* + * Write frame header. + * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker. + * Note that we do not emit the SOF until we have emitted the DQT(s). + * This avoids compatibility problems with incorrect implementations that + * try to error-check the quant table numbers as soon as they see the SOF. + */ + +METHODDEF(void) +write_frame_header (j_compress_ptr cinfo) +{ + int ci, prec; + boolean is_baseline; + jpeg_component_info *compptr; + + /* Emit DQT for each quantization table. + * Note that emit_dqt() suppresses any duplicate tables. + */ + prec = 0; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prec += emit_dqt(cinfo, compptr->quant_tbl_no); + } + /* now prec is nonzero iff there are any 16-bit quant tables. */ + + /* Check for a non-baseline specification. + * Note we assume that Huffman table numbers won't be changed later. + */ + if (cinfo->arith_code || cinfo->progressive_mode || + cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) { + is_baseline = FALSE; + } else { + is_baseline = TRUE; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1) + is_baseline = FALSE; + } + if (prec && is_baseline) { + is_baseline = FALSE; + /* If it's baseline except for quantizer size, warn the user */ + TRACEMS(cinfo, 0, JTRC_16BIT_TABLES); + } + } + + /* Emit the proper SOF marker */ + if (cinfo->arith_code) { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */ + else + emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */ + } else { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ + else if (is_baseline) + emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ + else + emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ + } + + /* Check to emit pseudo SOS marker */ + if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE) + emit_pseudo_sos(cinfo); +} + + +/* + * Write scan header. + * This consists of DHT or DAC markers, optional DRI, and SOS. + * Compressed data will be written following the SOS. + */ + +METHODDEF(void) +write_scan_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + int i; + jpeg_component_info *compptr; + + if (cinfo->arith_code) { + /* Emit arith conditioning info. We may have some duplication + * if the file has multiple scans, but it's so small it's hardly + * worth worrying about. + */ + emit_dac(cinfo); + } else { + /* Emit Huffman tables. + * Note that emit_dht() suppresses any duplicate tables. + */ + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + /* AC needs no table when not present */ + if (cinfo->Se) + emit_dht(cinfo, compptr->ac_tbl_no, TRUE); + } + } + + /* Emit DRI if required --- note that DRI value could change for each scan. + * We avoid wasting space with unnecessary DRIs, however. + */ + if (cinfo->restart_interval != marker->last_restart_interval) { + emit_dri(cinfo); + marker->last_restart_interval = cinfo->restart_interval; + } + + emit_sos(cinfo); +} + + +/* + * Write datastream trailer. + */ + +METHODDEF(void) +write_file_trailer (j_compress_ptr cinfo) +{ + emit_marker(cinfo, M_EOI); +} + + +/* + * Write an abbreviated table-specification datastream. + * This consists of SOI, DQT and DHT tables, and EOI. + * Any table that is defined and not marked sent_table = TRUE will be + * emitted. Note that all tables will be marked sent_table = TRUE at exit. + */ + +METHODDEF(void) +write_tables_only (j_compress_ptr cinfo) +{ + int i; + + emit_marker(cinfo, M_SOI); + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if (cinfo->quant_tbl_ptrs[i] != NULL) + (void) emit_dqt(cinfo, i); + } + + if (! cinfo->arith_code) { + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if (cinfo->dc_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, FALSE); + if (cinfo->ac_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, TRUE); + } + } + + emit_marker(cinfo, M_EOI); +} + + +/* + * Initialize the marker writer module. + */ + +GLOBAL(void) +jinit_marker_writer (j_compress_ptr cinfo) +{ + my_marker_ptr marker; + + /* Create the subobject */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_marker_writer)); + cinfo->marker = (struct jpeg_marker_writer *) marker; + /* Initialize method pointers */ + marker->pub.write_file_header = write_file_header; + marker->pub.write_frame_header = write_frame_header; + marker->pub.write_scan_header = write_scan_header; + marker->pub.write_file_trailer = write_file_trailer; + marker->pub.write_tables_only = write_tables_only; + marker->pub.write_marker_header = write_marker_header; + marker->pub.write_marker_byte = write_marker_byte; + /* Initialize private state */ + marker->last_restart_interval = 0; +} diff -Nru mame-0.144/src/lib/libjpeg/jcmaster.c mame-0.145/src/lib/libjpeg/jcmaster.c --- mame-0.144/src/lib/libjpeg/jcmaster.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcmaster.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,858 @@ +/* + * jcmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2003-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG compressor. + * These routines are concerned with parameter validation, initial setup, + * and inter-pass control (determining the number of passes and the work + * to be done in each pass). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef enum { + main_pass, /* input data, also do first output step */ + huff_opt_pass, /* Huffman code optimization pass */ + output_pass /* data output pass */ +} c_pass_type; + +typedef struct { + struct jpeg_comp_master pub; /* public fields */ + + c_pass_type pass_type; /* the type of the current pass */ + + int pass_number; /* # of passes completed */ + int total_passes; /* total # of passes needed */ + + int scan_number; /* current index in scan_info[] */ +} my_comp_master; + +typedef my_comp_master * my_master_ptr; + + +/* + * Support routines that do various essential calculations. + */ + +/* + * Compute JPEG image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ +#ifdef DCT_SCALING_SUPPORTED + + /* Sanity check on input image dimensions to prevent overflow in + * following calculation. + * We do check jpeg_width and jpeg_height in initial_setup below, + * but image_width and image_height can come from arbitrary data, + * and we need some space for multiplication by block_size. + */ + if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Compute actual JPEG image dimensions and DCT scaling choices. */ + if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/1 scaling */ + cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; + cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/2 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/3 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/4 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/5 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/6 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/7 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/8 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/9 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/10 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/11 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/12 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/13 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/14 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/15 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide block_size/16 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + +#else /* !DCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->jpeg_width = cinfo->image_width; + cinfo->jpeg_height = cinfo->image_height; + cinfo->min_DCT_h_scaled_size = DCTSIZE; + cinfo->min_DCT_v_scaled_size = DCTSIZE; + +#endif /* DCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +jpeg_calc_trans_dimensions (j_compress_ptr cinfo) +{ + if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); + + cinfo->block_size = cinfo->min_DCT_h_scaled_size; +} + + +LOCAL(void) +initial_setup (j_compress_ptr cinfo, boolean transcode_only) +/* Do computations that are needed before master selection phase */ +{ + int ci, ssize; + jpeg_component_info *compptr; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + if (transcode_only) + jpeg_calc_trans_dimensions(cinfo); + else + jpeg_calc_jpeg_dimensions(cinfo); + + /* Sanity check on block_size */ + if (cinfo->block_size < 1 || cinfo->block_size > 16) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); + + /* Derive natural_order from block_size */ + switch (cinfo->block_size) { + case 2: cinfo->natural_order = jpeg_natural_order2; break; + case 3: cinfo->natural_order = jpeg_natural_order3; break; + case 4: cinfo->natural_order = jpeg_natural_order4; break; + case 5: cinfo->natural_order = jpeg_natural_order5; break; + case 6: cinfo->natural_order = jpeg_natural_order6; break; + case 7: cinfo->natural_order = jpeg_natural_order7; break; + default: cinfo->natural_order = jpeg_natural_order; break; + } + + /* Derive lim_Se from block_size */ + cinfo->lim_Se = cinfo->block_size < DCTSIZE ? + cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; + + /* Sanity check on image dimensions */ + if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 || + cinfo->num_components <= 0 || cinfo->input_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Width of an input scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Fill in the correct component_index value; don't rely on application */ + compptr->component_index = ci; + /* In selecting the actual DCT scaling for each component, we try to + * scale down the chroma components via DCT scaling rather than downsampling. + * This saves time if the downsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support DCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* Mark component needed (this flag isn't actually used for compression) */ + compptr->component_needed = TRUE; + } + + /* Compute number of fully interleaved MCU rows (number of times that + * main controller will call coefficient controller). + */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); +} + + +#ifdef C_MULTISCAN_FILES_SUPPORTED + +LOCAL(void) +validate_script (j_compress_ptr cinfo) +/* Verify that the scan script in cinfo->scan_info[] is valid; also + * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. + */ +{ + const jpeg_scan_info * scanptr; + int scanno, ncomps, ci, coefi, thisi; + int Ss, Se, Ah, Al; + boolean component_sent[MAX_COMPONENTS]; +#ifdef C_PROGRESSIVE_SUPPORTED + int * last_bitpos_ptr; + int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; + /* -1 until that coefficient has been seen; then last Al for it */ +#endif + + if (cinfo->num_scans <= 0) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); + + /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; + * for progressive JPEG, no scan can have this. + */ + scanptr = cinfo->scan_info; + if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { +#ifdef C_PROGRESSIVE_SUPPORTED + cinfo->progressive_mode = TRUE; + last_bitpos_ptr = & last_bitpos[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (coefi = 0; coefi < DCTSIZE2; coefi++) + *last_bitpos_ptr++ = -1; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + for (ci = 0; ci < cinfo->num_components; ci++) + component_sent[ci] = FALSE; + } + + for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { + /* Validate component indexes */ + ncomps = scanptr->comps_in_scan; + if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (thisi < 0 || thisi >= cinfo->num_components) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + /* Components must appear in SOF order within each scan */ + if (ci > 0 && thisi <= scanptr->component_index[ci-1]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + } + /* Validate progression parameters */ + Ss = scanptr->Ss; + Se = scanptr->Se; + Ah = scanptr->Ah; + Al = scanptr->Al; + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that + * seems wrong: the upper bound ought to depend on data precision. + * Perhaps they really meant 0..N+1 for N-bit precision. + * Here we allow 0..10 for 8-bit data; Al larger than 10 results in + * out-of-range reconstructed DC values during the first DC scan, + * which might cause problems for some decoders. + */ +#if BITS_IN_JSAMPLE == 8 +#define MAX_AH_AL 10 +#else +#define MAX_AH_AL 13 +#endif + if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || + Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + if (Ss == 0) { + if (Se != 0) /* DC and AC together not OK */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + if (ncomps != 1) /* AC scans must be for only one component */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + for (ci = 0; ci < ncomps; ci++) { + last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; + if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + for (coefi = Ss; coefi <= Se; coefi++) { + if (last_bitpos_ptr[coefi] < 0) { + /* first scan of this coefficient */ + if (Ah != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + /* not first scan */ + if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + last_bitpos_ptr[coefi] = Al; + } + } +#endif + } else { + /* For sequential JPEG, all progression parameters must be these: */ + if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + /* Make sure components are not sent twice */ + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (component_sent[thisi]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + component_sent[thisi] = TRUE; + } + } + } + + /* Now verify that everything got sent. */ + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* For progressive mode, we only check that at least some DC data + * got sent for each component; the spec does not require that all bits + * of all coefficients be transmitted. Would it be wiser to enforce + * transmission of all coefficient bits?? + */ + for (ci = 0; ci < cinfo->num_components; ci++) { + if (last_bitpos[ci][0] < 0) + ERREXIT(cinfo, JERR_MISSING_DATA); + } +#endif + } else { + for (ci = 0; ci < cinfo->num_components; ci++) { + if (! component_sent[ci]) + ERREXIT(cinfo, JERR_MISSING_DATA); + } + } +} + + +LOCAL(void) +reduce_script (j_compress_ptr cinfo) +/* Adapt scan script for use with reduced block size; + * assume that script has been validated before. + */ +{ + jpeg_scan_info * scanptr; + int idxout, idxin; + + /* Circumvent const declaration for this function */ + scanptr = (jpeg_scan_info *) cinfo->scan_info; + idxout = 0; + + for (idxin = 0; idxin < cinfo->num_scans; idxin++) { + /* After skipping, idxout becomes smaller than idxin */ + if (idxin != idxout) + /* Copy rest of data; + * note we stay in given chunk of allocated memory. + */ + scanptr[idxout] = scanptr[idxin]; + if (scanptr[idxout].Ss > cinfo->lim_Se) + /* Entire scan out of range - skip this entry */ + continue; + if (scanptr[idxout].Se > cinfo->lim_Se) + /* Limit scan to end of block */ + scanptr[idxout].Se = cinfo->lim_Se; + idxout++; + } + + cinfo->num_scans = idxout; +} + +#endif /* C_MULTISCAN_FILES_SUPPORTED */ + + +LOCAL(void) +select_scan_parameters (j_compress_ptr cinfo) +/* Set up the scan parameters for the current scan */ +{ + int ci; + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (cinfo->scan_info != NULL) { + /* Prepare for current scan --- the script is already validated */ + my_master_ptr master = (my_master_ptr) cinfo->master; + const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; + + cinfo->comps_in_scan = scanptr->comps_in_scan; + for (ci = 0; ci < scanptr->comps_in_scan; ci++) { + cinfo->cur_comp_info[ci] = + &cinfo->comp_info[scanptr->component_index[ci]]; + } + if (cinfo->progressive_mode) { + cinfo->Ss = scanptr->Ss; + cinfo->Se = scanptr->Se; + cinfo->Ah = scanptr->Ah; + cinfo->Al = scanptr->Al; + return; + } + } + else +#endif + { + /* Prepare for single sequential-JPEG scan containing all components */ + if (cinfo->num_components > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPS_IN_SCAN); + cinfo->comps_in_scan = cinfo->num_components; + for (ci = 0; ci < cinfo->num_components; ci++) { + cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; + } + } + cinfo->Ss = 0; + cinfo->Se = cinfo->block_size * cinfo->block_size - 1; + cinfo->Ah = 0; + cinfo->Al = 0; +} + + +LOCAL(void) +per_scan_setup (j_compress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } + + /* Convert restart specified in rows to actual MCU count. */ + /* Note that count must fit in 16 bits, so we provide limiting. */ + if (cinfo->restart_in_rows > 0) { + long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; + cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); + } +} + + +/* + * Per-pass setup. + * This is called at the beginning of each pass. We determine which modules + * will be active during this pass and give them appropriate start_pass calls. + * We also set is_last_pass to indicate whether any more passes will be + * required. + */ + +METHODDEF(void) +prepare_for_pass (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + switch (master->pass_type) { + case main_pass: + /* Initial pass: will collect input data, and do either Huffman + * optimization or data output for the first scan. + */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (! cinfo->raw_data_in) { + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->downsample->start_pass) (cinfo); + (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); + } + (*cinfo->fdct->start_pass) (cinfo); + (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); + (*cinfo->coef->start_pass) (cinfo, + (master->total_passes > 1 ? + JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + if (cinfo->optimize_coding) { + /* No immediate data output; postpone writing frame/scan headers */ + master->pub.call_pass_startup = FALSE; + } else { + /* Will write frame/scan headers at first jpeg_write_scanlines call */ + master->pub.call_pass_startup = TRUE; + } + break; +#ifdef ENTROPY_OPT_SUPPORTED + case huff_opt_pass: + /* Do Huffman optimization for a scan after the first one. */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (cinfo->Ss != 0 || cinfo->Ah == 0) { + (*cinfo->entropy->start_pass) (cinfo, TRUE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + master->pub.call_pass_startup = FALSE; + break; + } + /* Special case: Huffman DC refinement scans need no Huffman table + * and therefore we can skip the optimization pass for them. + */ + master->pass_type = output_pass; + master->pass_number++; + /*FALLTHROUGH*/ +#endif + case output_pass: + /* Do a data-output pass. */ + /* We need not repeat per-scan setup if prior optimization pass did it. */ + if (! cinfo->optimize_coding) { + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + } + (*cinfo->entropy->start_pass) (cinfo, FALSE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + /* We emit frame/scan headers now */ + if (master->scan_number == 0) + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); + master->pub.call_pass_startup = FALSE; + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + } + + master->pub.is_last_pass = (master->pass_number == master->total_passes-1); + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->total_passes; + } +} + + +/* + * Special start-of-pass hook. + * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. + * In single-pass processing, we need this hook because we don't want to + * write frame/scan headers during jpeg_start_compress; we want to let the + * application write COM markers etc. between jpeg_start_compress and the + * jpeg_write_scanlines loop. + * In multi-pass processing, this routine is not used. + */ + +METHODDEF(void) +pass_startup (j_compress_ptr cinfo) +{ + cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ + + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); +} + + +/* + * Finish up at end of pass. + */ + +METHODDEF(void) +finish_pass_master (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* The entropy coder always needs an end-of-pass call, + * either to analyze statistics or to flush its output buffer. + */ + (*cinfo->entropy->finish_pass) (cinfo); + + /* Update state for next pass */ + switch (master->pass_type) { + case main_pass: + /* next pass is either output of scan 0 (after optimization) + * or output of scan 1 (if no optimization). + */ + master->pass_type = output_pass; + if (! cinfo->optimize_coding) + master->scan_number++; + break; + case huff_opt_pass: + /* next pass is always output of current scan */ + master->pass_type = output_pass; + break; + case output_pass: + /* next pass is either optimization or output of next scan */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + master->scan_number++; + break; + } + + master->pass_number++; +} + + +/* + * Initialize master compression control. + */ + +GLOBAL(void) +jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_comp_master)); + cinfo->master = (struct jpeg_comp_master *) master; + master->pub.prepare_for_pass = prepare_for_pass; + master->pub.pass_startup = pass_startup; + master->pub.finish_pass = finish_pass_master; + master->pub.is_last_pass = FALSE; + + /* Validate parameters, determine derived values */ + initial_setup(cinfo, transcode_only); + + if (cinfo->scan_info != NULL) { +#ifdef C_MULTISCAN_FILES_SUPPORTED + validate_script(cinfo); + if (cinfo->block_size < DCTSIZE) + reduce_script(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + cinfo->num_scans = 1; + } + + if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) && + !cinfo->arith_code) /* TEMPORARY HACK ??? */ + /* assume default tables no good for progressive or downscale mode */ + cinfo->optimize_coding = TRUE; + + /* Initialize my private state */ + if (transcode_only) { + /* no main pass in transcoding */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + else + master->pass_type = output_pass; + } else { + /* for normal compression, first pass is always this type: */ + master->pass_type = main_pass; + } + master->scan_number = 0; + master->pass_number = 0; + if (cinfo->optimize_coding) + master->total_passes = cinfo->num_scans * 2; + else + master->total_passes = cinfo->num_scans; +} diff -Nru mame-0.144/src/lib/libjpeg/jcomapi.c mame-0.145/src/lib/libjpeg/jcomapi.c --- mame-0.144/src/lib/libjpeg/jcomapi.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcomapi.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,106 @@ +/* + * jcomapi.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface routines that are used for both + * compression and decompression. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Abort processing of a JPEG compression or decompression operation, + * but don't destroy the object itself. + * + * For this, we merely clean up all the nonpermanent memory pools. + * Note that temp files (virtual arrays) are not allowed to belong to + * the permanent pool, so we will be able to close all temp files here. + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_abort (j_common_ptr cinfo) +{ + int pool; + + /* Do nothing if called on a not-initialized or destroyed JPEG object. */ + if (cinfo->mem == NULL) + return; + + /* Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { + (*cinfo->mem->free_pool) (cinfo, pool); + } + + /* Reset overall state for possible reuse of object */ + if (cinfo->is_decompressor) { + cinfo->global_state = DSTATE_START; + /* Try to keep application from accessing now-deleted marker list. + * A bit kludgy to do it here, but this is the most central place. + */ + ((j_decompress_ptr) cinfo)->marker_list = NULL; + } else { + cinfo->global_state = CSTATE_START; + } +} + + +/* + * Destruction of a JPEG object. + * + * Everything gets deallocated except the master jpeg_compress_struct itself + * and the error manager struct. Both of these are supplied by the application + * and must be freed, if necessary, by the application. (Often they are on + * the stack and so don't need to be freed anyway.) + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_destroy (j_common_ptr cinfo) +{ + /* We need only tell the memory manager to release everything. */ + /* NB: mem pointer is NULL if memory mgr failed to initialize. */ + if (cinfo->mem != NULL) + (*cinfo->mem->self_destruct) (cinfo); + cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ + cinfo->global_state = 0; /* mark it destroyed */ +} + + +/* + * Convenience routines for allocating quantization and Huffman tables. + * (Would jutils.c be a more reasonable place to put these?) + */ + +GLOBAL(JQUANT_TBL *) +jpeg_alloc_quant_table (j_common_ptr cinfo) +{ + JQUANT_TBL *tbl; + + tbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} + + +GLOBAL(JHUFF_TBL *) +jpeg_alloc_huff_table (j_common_ptr cinfo) +{ + JHUFF_TBL *tbl; + + tbl = (JHUFF_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} diff -Nru mame-0.144/src/lib/libjpeg/jconfig.h mame-0.145/src/lib/libjpeg/jconfig.h --- mame-0.144/src/lib/libjpeg/jconfig.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jconfig.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,45 @@ +/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ +/* see jconfig.txt for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +/* #define void char */ +/* #define const */ +#undef CHAR_IS_UNSIGNED +#define HAVE_STDDEF_H +#define HAVE_STDLIB_H +#undef NEED_BSD_STRINGS +#undef NEED_SYS_TYPES_H +#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ +#undef NEED_SHORT_EXTERNAL_NAMES +#undef INCOMPLETE_TYPES_BROKEN + +/* Define "boolean" as unsigned char, not int, per Windows custom */ +#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +#endif +#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ + + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#define TWO_FILE_COMMANDLINE /* optional */ +#define USE_SETMODE /* Microsoft has setmode() */ +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE +#undef PROGRESS_REPORT /* optional */ + +#endif /* JPEG_CJPEG_DJPEG */ diff -Nru mame-0.144/src/lib/libjpeg/jcparam.c mame-0.145/src/lib/libjpeg/jcparam.c --- mame-0.144/src/lib/libjpeg/jcparam.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcparam.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,632 @@ +/* + * jcparam.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2008 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains optional default-setting code for the JPEG compressor. + * Applications do not have to use this file, but those that don't use it + * must know a lot more about the innards of the JPEG code. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Quantization table setup routines + */ + +GLOBAL(void) +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) +/* Define a quantization table equal to the basic_table times + * a scale factor (given as a percentage). + * If force_baseline is TRUE, the computed quantization table entries + * are limited to 1..255 for JPEG baseline compatibility. + */ +{ + JQUANT_TBL ** qtblptr; + int i; + long temp; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); + + qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; + + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); + + for (i = 0; i < DCTSIZE2; i++) { + temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; + /* limit the values to the valid range */ + if (temp <= 0L) temp = 1L; + if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ + if (force_baseline && temp > 255L) + temp = 255L; /* limit to baseline range if requested */ + (*qtblptr)->quantval[i] = (UINT16) temp; + } + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*qtblptr)->sent_table = FALSE; +} + + +/* These are the sample quantization tables given in JPEG spec section K.1. + * The spec says that the values given produce "good" quality, and + * when divided by 2, "very good" quality. + */ +static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; +static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + + +GLOBAL(void) +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and straight percentage-scaling quality scales. + * This entry point allows different scalings for luminance and chrominance. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + cinfo->q_scale_factor[0], force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + cinfo->q_scale_factor[1], force_baseline); +} + + +GLOBAL(void) +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and a straight percentage-scaling quality scale. In most cases it's better + * to use jpeg_set_quality (below); this entry point is provided for + * applications that insist on a linear percentage scaling. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + scale_factor, force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + scale_factor, force_baseline); +} + + +GLOBAL(int) +jpeg_quality_scaling (int quality) +/* Convert a user-specified quality rating to a percentage scaling factor + * for an underlying quantization table, using our recommended scaling curve. + * The input 'quality' factor should be 0 (terrible) to 100 (very good). + */ +{ + /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ + if (quality <= 0) quality = 1; + if (quality > 100) quality = 100; + + /* The basic table is used as-is (scaling 100) for a quality of 50. + * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; + * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table + * to make all the table entries 1 (hence, minimum quantization loss). + * Qualities 1..50 are converted to scaling percentage 5000/Q. + */ + if (quality < 50) + quality = 5000 / quality; + else + quality = 200 - quality*2; + + return quality; +} + + +GLOBAL(void) +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables. + * This is the standard quality-adjusting entry point for typical user + * interfaces; only those who want detailed control over quantization tables + * would use the preceding three routines directly. + */ +{ + /* Convert user 0-100 rating to percentage scaling */ + quality = jpeg_quality_scaling(quality); + + /* Set up standard quality tables */ + jpeg_set_linear_quality(cinfo, quality, force_baseline); +} + + +/* + * Huffman table setup routines + */ + +LOCAL(void) +add_huff_table (j_compress_ptr cinfo, + JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) +/* Define a Huffman table */ +{ + int nsymbols, len; + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + /* Copy the number-of-symbols-of-each-code-length counts */ + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + + /* Validate the counts. We do this here mainly so we can copy the right + * number of symbols from the val[] array, without risking marching off + * the end of memory. jchuff.c will do a more thorough test later. + */ + nsymbols = 0; + for (len = 1; len <= 16; len++) + nsymbols += bits[len]; + if (nsymbols < 1 || nsymbols > 256) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*htblptr)->sent_table = FALSE; +} + + +LOCAL(void) +std_huff_tables (j_compress_ptr cinfo) +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +{ + static const UINT8 bits_dc_luminance[17] = + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_luminance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_dc_chrominance[17] = + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_chrominance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_ac_luminance[17] = + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + static const UINT8 val_ac_luminance[] = + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + static const UINT8 bits_ac_chrominance[17] = + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + static const UINT8 val_ac_chrominance[] = + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, val_dc_luminance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, val_ac_luminance); + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, val_dc_chrominance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, val_ac_chrominance); +} + + +/* + * Default parameter setup for compression. + * + * Applications that don't choose to use this routine must do their + * own setup of all these parameters. Alternately, you can call this + * to establish defaults and then alter parameters selectively. This + * is the recommended approach since, if we add any new parameters, + * your code will still work (they'll be set to reasonable defaults). + */ + +GLOBAL(void) +jpeg_set_defaults (j_compress_ptr cinfo) +{ + int i; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Allocate comp_info array large enough for maximum component count. + * Array is made permanent in case application wants to compress + * multiple images at same param settings. + */ + if (cinfo->comp_info == NULL) + cinfo->comp_info = (jpeg_component_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + MAX_COMPONENTS * SIZEOF(jpeg_component_info)); + + /* Initialize everything not dependent on the color space */ + + cinfo->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; + cinfo->data_precision = BITS_IN_JSAMPLE; + /* Set up two quantization tables using default quality of 75 */ + jpeg_set_quality(cinfo, 75, TRUE); + /* Set up two Huffman tables */ + std_huff_tables(cinfo); + + /* Initialize default arithmetic coding conditioning */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + + /* Default is no multiple-scan output */ + cinfo->scan_info = NULL; + cinfo->num_scans = 0; + + /* Expect normal source image, not raw downsampled data */ + cinfo->raw_data_in = FALSE; + + /* Use Huffman coding, not arithmetic coding, by default */ + cinfo->arith_code = FALSE; + + /* By default, don't do extra passes to optimize entropy coding */ + cinfo->optimize_coding = FALSE; + /* The standard Huffman tables are only valid for 8-bit data precision. + * If the precision is higher, force optimization on so that usable + * tables will be computed. This test can be removed if default tables + * are supplied that are valid for the desired precision. + */ + if (cinfo->data_precision > 8) + cinfo->optimize_coding = TRUE; + + /* By default, use the simpler non-cosited sampling alignment */ + cinfo->CCIR601_sampling = FALSE; + + /* By default, apply fancy downsampling */ + cinfo->do_fancy_downsampling = TRUE; + + /* No input smoothing */ + cinfo->smoothing_factor = 0; + + /* DCT algorithm preference */ + cinfo->dct_method = JDCT_DEFAULT; + + /* No restart markers */ + cinfo->restart_interval = 0; + cinfo->restart_in_rows = 0; + + /* Fill in default JFIF marker parameters. Note that whether the marker + * will actually be written is determined by jpeg_set_colorspace. + * + * By default, the library emits JFIF version code 1.01. + * An application that wants to emit JFIF 1.02 extension markers should set + * JFIF_minor_version to 2. We could probably get away with just defaulting + * to 1.02, but there may still be some decoders in use that will complain + * about that; saying 1.01 should minimize compatibility problems. + */ + cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; /* Pixel size is unknown by default */ + cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ + cinfo->Y_density = 1; + + /* Choose JPEG colorspace based on input space, set defaults accordingly */ + + jpeg_default_colorspace(cinfo); +} + + +/* + * Select an appropriate JPEG colorspace for in_color_space. + */ + +GLOBAL(void) +jpeg_default_colorspace (j_compress_ptr cinfo) +{ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); + break; + case JCS_RGB: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_YCbCr: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_CMYK: + jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ + break; + case JCS_YCCK: + jpeg_set_colorspace(cinfo, JCS_YCCK); + break; + case JCS_UNKNOWN: + jpeg_set_colorspace(cinfo, JCS_UNKNOWN); + break; + default: + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + } +} + + +/* + * Set the JPEG colorspace, and choose colorspace-dependent default values. + */ + +GLOBAL(void) +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) +{ + jpeg_component_info * compptr; + int ci; + +#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ + (compptr = &cinfo->comp_info[index], \ + compptr->component_id = (id), \ + compptr->h_samp_factor = (hsamp), \ + compptr->v_samp_factor = (vsamp), \ + compptr->quant_tbl_no = (quant), \ + compptr->dc_tbl_no = (dctbl), \ + compptr->ac_tbl_no = (actbl) ) + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* For all colorspaces, we use Q and Huff tables 0 for luminance components, + * tables 1 for chrominance components. + */ + + cinfo->jpeg_color_space = colorspace; + + cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ + cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ + + switch (colorspace) { + case JCS_GRAYSCALE: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 1; + /* JFIF specifies component ID 1 */ + SET_COMP(0, 1, 1,1, 0, 0,0); + break; + case JCS_RGB: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ + cinfo->num_components = 3; + SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); + SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); + SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); + break; + case JCS_YCbCr: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 3; + /* JFIF specifies component IDs 1,2,3 */ + /* We default to 2x2 subsamples of chrominance */ + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + break; + case JCS_CMYK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ + cinfo->num_components = 4; + SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); + SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); + SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); + SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); + break; + case JCS_YCCK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ + cinfo->num_components = 4; + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + SET_COMP(3, 4, 2,2, 0, 0,0); + break; + case JCS_UNKNOWN: + cinfo->num_components = cinfo->input_components; + if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + for (ci = 0; ci < cinfo->num_components; ci++) { + SET_COMP(ci, ci, 1,1, 0, 0,0); + } + break; + default: + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + } +} + + +#ifdef C_PROGRESSIVE_SUPPORTED + +LOCAL(jpeg_scan_info *) +fill_a_scan (jpeg_scan_info * scanptr, int ci, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for specified component */ +{ + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_scans (jpeg_scan_info * scanptr, int ncomps, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for each component */ +{ + int ci; + + for (ci = 0; ci < ncomps; ci++) { + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) +/* Support routine: generate interleaved DC scan if possible, else N scans */ +{ + int ci; + + if (ncomps <= MAX_COMPS_IN_SCAN) { + /* Single interleaved DC scan */ + scanptr->comps_in_scan = ncomps; + for (ci = 0; ci < ncomps; ci++) + scanptr->component_index[ci] = ci; + scanptr->Ss = scanptr->Se = 0; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } else { + /* Noninterleaved DC scan for each component */ + scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); + } + return scanptr; +} + + +/* + * Create a recommended progressive-JPEG script. + * cinfo->num_components and cinfo->jpeg_color_space must be correct. + */ + +GLOBAL(void) +jpeg_simple_progression (j_compress_ptr cinfo) +{ + int ncomps = cinfo->num_components; + int nscans; + jpeg_scan_info * scanptr; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Figure space needed for script. Calculation must match code below! */ + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + nscans = 10; + } else { + /* All-purpose script for other color spaces. */ + if (ncomps > MAX_COMPS_IN_SCAN) + nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ + else + nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ + } + + /* Allocate space for script. + * We need to put it in the permanent pool in case the application performs + * multiple compressions without changing the settings. To avoid a memory + * leak if jpeg_simple_progression is called repeatedly for the same JPEG + * object, we try to re-use previously allocated space, and we allocate + * enough space to handle YCbCr even if initially asked for grayscale. + */ + if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { + cinfo->script_space_size = MAX(nscans, 10); + cinfo->script_space = (jpeg_scan_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + cinfo->script_space_size * SIZEOF(jpeg_scan_info)); + } + scanptr = cinfo->script_space; + cinfo->scan_info = scanptr; + cinfo->num_scans = nscans; + + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + /* Initial DC scan */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + /* Initial AC scan: get some luma data out in a hurry */ + scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); + /* Chroma data is too small to be worth expending many scans on */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); + /* Complete spectral selection for luma AC */ + scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); + /* Refine next bit of luma AC */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); + /* Finish DC successive approximation */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + /* Finish AC successive approximation */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); + /* Luma bottom bit comes last since it's usually largest scan */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); + } else { + /* All-purpose script for other color spaces. */ + /* Successive approximation first pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); + scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); + /* Successive approximation second pass */ + scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); + /* Successive approximation final pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); + } +} + +#endif /* C_PROGRESSIVE_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jcprepct.c mame-0.145/src/lib/libjpeg/jcprepct.c --- mame-0.144/src/lib/libjpeg/jcprepct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcprepct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,358 @@ +/* + * jcprepct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the compression preprocessing controller. + * This controller manages the color conversion, downsampling, + * and edge expansion steps. + * + * Most of the complexity here is associated with buffering input rows + * as required by the downsampler. See the comments at the head of + * jcsample.c for the downsampler's needs. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* At present, jcsample.c can request context rows only for smoothing. + * In the future, we might also need context rows for CCIR601 sampling + * or other more-complex downsampling procedures. The code to support + * context rows should be compiled only if needed. + */ +#ifdef INPUT_SMOOTHING_SUPPORTED +#define CONTEXT_ROWS_SUPPORTED +#endif + + +/* + * For the simple (no-context-row) case, we just need to buffer one + * row group's worth of pixels for the downsampling step. At the bottom of + * the image, we pad to a full row group by replicating the last pixel row. + * The downsampler's last output row is then replicated if needed to pad + * out to a full iMCU row. + * + * When providing context rows, we must buffer three row groups' worth of + * pixels. Three row groups are physically allocated, but the row pointer + * arrays are made five row groups high, with the extra pointers above and + * below "wrapping around" to point to the last and first real row groups. + * This allows the downsampler to access the proper context rows. + * At the top and bottom of the image, we create dummy context rows by + * copying the first or last real pixel row. This copying could be avoided + * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the + * trouble on the compression side. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_prep_controller pub; /* public fields */ + + /* Downsampling input buffer. This buffer holds color-converted data + * until we have enough to do a downsample step. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + JDIMENSION rows_to_go; /* counts rows remaining in source image */ + int next_buf_row; /* index of next row to store in color_buf */ + +#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */ + int this_row_group; /* starting row index of group to process */ + int next_buf_stop; /* downsample when we reach this index */ +#endif +} my_prep_controller; + +typedef my_prep_controller * my_prep_ptr; + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + + if (pass_mode != JBUF_PASS_THRU) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Initialize total-height counter for detecting bottom of image */ + prep->rows_to_go = cinfo->image_height; + /* Mark the conversion buffer empty */ + prep->next_buf_row = 0; +#ifdef CONTEXT_ROWS_SUPPORTED + /* Preset additional state variables for context mode. + * These aren't used in non-context mode, so we needn't test which mode. + */ + prep->this_row_group = 0; + /* Set next_buf_stop to stop after two row groups have been read in. */ + prep->next_buf_stop = 2 * cinfo->max_v_samp_factor; +#endif +} + + +/* + * Expand an image vertically from height input_rows to height output_rows, + * by duplicating the bottom row. + */ + +LOCAL(void) +expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, + int input_rows, int output_rows) +{ + register int row; + + for (row = input_rows; row < output_rows; row++) { + jcopy_sample_rows(image_data, input_rows-1, image_data, row, + 1, num_cols); + } +} + + +/* + * Process some data in the simple no-context case. + * + * Preprocessor output data is counted in "row groups". A row group + * is defined to be v_samp_factor sample rows of each component. + * Downsampling will produce this much data from each max_v_samp_factor + * input rows. + */ + +METHODDEF(void) +pre_process_data (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + JDIMENSION inrows; + jpeg_component_info * compptr; + + while (*in_row_ctr < in_rows_avail && + *out_row_group_ctr < out_row_groups_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = cinfo->max_v_samp_factor - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + /* If at bottom of image, pad to fill the conversion buffer. */ + if (prep->rows_to_go == 0 && + prep->next_buf_row < cinfo->max_v_samp_factor) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, cinfo->max_v_samp_factor); + } + prep->next_buf_row = cinfo->max_v_samp_factor; + } + /* If we've filled the conversion buffer, empty it. */ + if (prep->next_buf_row == cinfo->max_v_samp_factor) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, (JDIMENSION) 0, + output_buf, *out_row_group_ctr); + prep->next_buf_row = 0; + (*out_row_group_ctr)++; + } + /* If at bottom of image, pad the output to a full iMCU height. + * Note we assume the caller is providing a one-iMCU-height output buffer! + */ + if (prep->rows_to_go == 0 && + *out_row_group_ctr < out_row_groups_avail) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + numrows = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + expand_bottom_edge(output_buf[ci], + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (int) (*out_row_group_ctr * numrows), + (int) (out_row_groups_avail * numrows)); + } + *out_row_group_ctr = out_row_groups_avail; + break; /* can exit outer loop without test */ + } + } +} + + +#ifdef CONTEXT_ROWS_SUPPORTED + +/* + * Process some data in the context case. + */ + +METHODDEF(void) +pre_process_context (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + int buf_height = cinfo->max_v_samp_factor * 3; + JDIMENSION inrows; + + while (*out_row_group_ctr < out_row_groups_avail) { + if (*in_row_ctr < in_rows_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = prep->next_buf_stop - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + /* Pad at top of image, if first time through */ + if (prep->rows_to_go == cinfo->image_height) { + for (ci = 0; ci < cinfo->num_components; ci++) { + int row; + for (row = 1; row <= cinfo->max_v_samp_factor; row++) { + jcopy_sample_rows(prep->color_buf[ci], 0, + prep->color_buf[ci], -row, + 1, cinfo->image_width); + } + } + } + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + } else { + /* Return for more data, unless we are at the bottom of the image. */ + if (prep->rows_to_go != 0) + break; + /* When at bottom of image, pad to fill the conversion buffer. */ + if (prep->next_buf_row < prep->next_buf_stop) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, prep->next_buf_stop); + } + prep->next_buf_row = prep->next_buf_stop; + } + } + /* If we've gotten enough data, downsample a row group. */ + if (prep->next_buf_row == prep->next_buf_stop) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, + (JDIMENSION) prep->this_row_group, + output_buf, *out_row_group_ctr); + (*out_row_group_ctr)++; + /* Advance pointers with wraparound as necessary. */ + prep->this_row_group += cinfo->max_v_samp_factor; + if (prep->this_row_group >= buf_height) + prep->this_row_group = 0; + if (prep->next_buf_row >= buf_height) + prep->next_buf_row = 0; + prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor; + } + } +} + + +/* + * Create the wrapped-around downsampling input buffer needed for context mode. + */ + +LOCAL(void) +create_context_buffer (j_compress_ptr cinfo) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int rgroup_height = cinfo->max_v_samp_factor; + int ci, i; + jpeg_component_info * compptr; + JSAMPARRAY true_buffer, fake_buffer; + + /* Grab enough space for fake row pointers for all the components; + * we need five row groups' worth of pointers for each component. + */ + fake_buffer = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (cinfo->num_components * 5 * rgroup_height) * + SIZEOF(JSAMPROW)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate the actual buffer space (3 row groups) for this component. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + true_buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) (3 * rgroup_height)); + /* Copy true buffer row pointers into the middle of the fake row array */ + MEMCOPY(fake_buffer + rgroup_height, true_buffer, + 3 * rgroup_height * SIZEOF(JSAMPROW)); + /* Fill in the above and below wraparound pointers */ + for (i = 0; i < rgroup_height; i++) { + fake_buffer[i] = true_buffer[2 * rgroup_height + i]; + fake_buffer[4 * rgroup_height + i] = true_buffer[i]; + } + prep->color_buf[ci] = fake_buffer + rgroup_height; + fake_buffer += 5 * rgroup_height; /* point to space for next component */ + } +} + +#endif /* CONTEXT_ROWS_SUPPORTED */ + + +/* + * Initialize preprocessing controller. + */ + +GLOBAL(void) +jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_prep_ptr prep; + int ci; + jpeg_component_info * compptr; + + if (need_full_buffer) /* safety check */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + prep = (my_prep_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_prep_controller)); + cinfo->prep = (struct jpeg_c_prep_controller *) prep; + prep->pub.start_pass = start_pass_prep; + + /* Allocate the color conversion buffer. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + if (cinfo->downsample->need_context_rows) { + /* Set up to provide context rows */ +#ifdef CONTEXT_ROWS_SUPPORTED + prep->pub.pre_process_data = pre_process_context; + create_context_buffer(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* No context, just make it tall enough for one row group */ + prep->pub.pre_process_data = pre_process_data; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff -Nru mame-0.144/src/lib/libjpeg/jcsample.c mame-0.145/src/lib/libjpeg/jcsample.c --- mame-0.144/src/lib/libjpeg/jcsample.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jcsample.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,545 @@ +/* + * jcsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains downsampling routines. + * + * Downsampling input data is counted in "row groups". A row group + * is defined to be max_v_samp_factor pixel rows of each component, + * from which the downsampler produces v_samp_factor sample rows. + * A single row group is processed in each call to the downsampler module. + * + * The downsampler is responsible for edge-expansion of its output data + * to fill an integral number of DCT blocks horizontally. The source buffer + * may be modified if it is helpful for this purpose (the source buffer is + * allocated wide enough to correspond to the desired output width). + * The caller (the prep controller) is responsible for vertical padding. + * + * The downsampler may request "context rows" by setting need_context_rows + * during startup. In this case, the input arrays will contain at least + * one row group's worth of pixels above and below the passed-in data; + * the caller will create dummy rows at image top and bottom by replicating + * the first or last real pixel row. + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + * + * The downsampling algorithm used here is a simple average of the source + * pixels covered by the output pixel. The hi-falutin sampling literature + * refers to this as a "box filter". In general the characteristics of a box + * filter are not very good, but for the specific cases we normally use (1:1 + * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not + * nearly so bad. If you intend to use other sampling ratios, you'd be well + * advised to improve this code. + * + * A simple input-smoothing capability is provided. This is mainly intended + * for cleaning up color-dithered GIF input files (if you find it inadequate, + * we suggest using an external filtering program such as pnmconvol). When + * enabled, each input pixel P is replaced by a weighted sum of itself and its + * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, + * where SF = (smoothing_factor / 1024). + * Currently, smoothing is only supported for 2h2v sampling factors. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to downsample a single component */ +typedef JMETHOD(void, downsample1_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data)); + +/* Private subobject */ + +typedef struct { + struct jpeg_downsampler pub; /* public fields */ + + /* Downsampling method pointers, one per component */ + downsample1_ptr methods[MAX_COMPONENTS]; + + /* Height of an output row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_downsample need not + * recompute them each time. They are unused for other downsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_downsampler; + +typedef my_downsampler * my_downsample_ptr; + + +/* + * Initialize for a downsampling pass. + */ + +METHODDEF(void) +start_pass_downsample (j_compress_ptr cinfo) +{ + /* no work for now */ +} + + +/* + * Expand a component horizontally from width input_cols to width output_cols, + * by duplicating the rightmost samples. + */ + +LOCAL(void) +expand_right_edge (JSAMPARRAY image_data, int num_rows, + JDIMENSION input_cols, JDIMENSION output_cols) +{ + register JSAMPROW ptr; + register JSAMPLE pixval; + register int count; + int row; + int numcols = (int) (output_cols - input_cols); + + if (numcols > 0) { + for (row = 0; row < num_rows; row++) { + ptr = image_data[row] + input_cols; + pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ + for (count = numcols; count > 0; count--) + *ptr++ = pixval; + } + } +} + + +/* + * Do downsampling for a whole row group (all components). + * + * In this version we simply downsample each component independently. + */ + +METHODDEF(void) +sep_downsample (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, JDIMENSION out_row_group_index) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + int ci; + jpeg_component_info * compptr; + JSAMPARRAY in_ptr, out_ptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + in_ptr = input_buf[ci] + in_row_index; + out_ptr = output_buf[ci] + + (out_row_group_index * downsample->rowgroup_height[ci]); + (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); + } +} + + +/* + * Downsample pixel values of a single component. + * One row group is processed per call. + * This version handles arbitrary integral sampling ratios, without smoothing. + * Note that this version is not actually used for customary sampling ratios. + */ + +METHODDEF(void) +int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; + JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + JSAMPROW inptr, outptr; + INT32 outvalue; + + h_expand = downsample->h_expand[compptr->component_index]; + v_expand = downsample->v_expand[compptr->component_index]; + numpix = h_expand * v_expand; + numpix2 = numpix/2; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * h_expand); + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + for (outcol = 0, outcol_h = 0; outcol < output_cols; + outcol++, outcol_h += h_expand) { + outvalue = 0; + for (v = 0; v < v_expand; v++) { + inptr = input_data[inrow+v] + outcol_h; + for (h = 0; h < h_expand; h++) { + outvalue += (INT32) GETJSAMPLE(*inptr++); + } + } + *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); + } + inrow += v_expand; + outrow++; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * without smoothing. + */ + +METHODDEF(void) +fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + /* Copy the data */ + jcopy_sample_rows(input_data, 0, output_data, 0, + cinfo->max_v_samp_factor, cinfo->image_width); + /* Edge-expand */ + expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width, + compptr->width_in_blocks * compptr->DCT_h_scaled_size); +} + + +/* + * Downsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 1:1 vertical, + * without smoothing. + * + * A note about the "bias" calculations: when rounding fractional values to + * integer, we do not want to always round 0.5 up to the next integer. + * If we did that, we'd introduce a noticeable bias towards larger values. + * Instead, this code is arranged so that 0.5 will be rounded up or down at + * alternate pixel locations (a simple ordered dither pattern). + */ + +METHODDEF(void) +h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + bias = 0; /* bias = 0,1,0,1,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + + bias) >> 1); + bias ^= 1; /* 0=>1, 1=>0 */ + inptr += 2; + } + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * without smoothing. + */ + +METHODDEF(void) +h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr0, inptr1, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + bias = 1; /* bias = 1,2,1,2,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + + bias) >> 2); + bias ^= 3; /* 1=>2, 2=>1 */ + inptr0 += 2; inptr1 += 2; + } + inrow += 2; + outrow++; + } +} + + +#ifdef INPUT_SMOOTHING_SUPPORTED + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols * 2); + + /* We don't bother to form the individual "smoothed" input pixel values; + * we can directly compute the output which is the average of the four + * smoothed values. Each of the four member pixels contributes a fraction + * (1-8*SF) to its own smoothed image and a fraction SF to each of the three + * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final + * output. The four corner-adjacent neighbor pixels contribute a fraction + * SF to just one smoothed pixel, or SF/4 to the final output; while the + * eight edge-adjacent neighbors contribute SF to each of two smoothed + * pixels, or SF/2 overall. In order to use integer arithmetic, these + * factors are scaled by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ + neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ + + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+2]; + + /* Special case for first column: pretend column -1 is same as column 0 */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); + neighsum += neighsum; + neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + /* sum of pixels directly mapped to this output element */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + /* sum of edge-neighbor pixels */ + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); + /* The edge-neighbors count twice as much as corner-neighbors */ + neighsum += neighsum; + /* Add in the corner-neighbors */ + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); + /* form final output scaled up by 2^16 */ + membersum = membersum * memberscale + neighsum * neighscale; + /* round, descale and output it */ + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); + neighsum += neighsum; + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + inrow += 2; + outrow++; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; + register JSAMPROW inptr, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + int colsum, lastcolsum, nextcolsum; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols); + + /* Each of the eight neighbor pixels contributes a fraction SF to the + * smoothed pixel, while the main pixel contributes (1-8*SF). In order + * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ + neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+1]; + + /* Special case for first column */ + colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + + GETJSAMPLE(*inptr); + membersum = GETJSAMPLE(*inptr++); + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = colsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + membersum = GETJSAMPLE(*inptr++); + above_ptr++; below_ptr++; + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + colsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + } +} + +#endif /* INPUT_SMOOTHING_SUPPORTED */ + + +/* + * Module initialization routine for downsampling. + * Note that we must select a routine for each component. + */ + +GLOBAL(void) +jinit_downsampler (j_compress_ptr cinfo) +{ + my_downsample_ptr downsample; + int ci; + jpeg_component_info * compptr; + boolean smoothok = TRUE; + int h_in_group, v_in_group, h_out_group, v_out_group; + + downsample = (my_downsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_downsampler)); + cinfo->downsample = (struct jpeg_downsampler *) downsample; + downsample->pub.start_pass = start_pass_downsample; + downsample->pub.downsample = sep_downsample; + downsample->pub.need_context_rows = FALSE; + + if (cinfo->CCIR601_sampling) + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* Verify we can handle the sampling factors, and set up method pointers */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "output group" for DCT scaling. This many samples + * are to be converted from max_h_samp_factor * max_v_samp_factor pixels. + */ + h_out_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_out_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_in_group = cinfo->max_h_samp_factor; + v_in_group = cinfo->max_v_samp_factor; + downsample->rowgroup_height[ci] = v_out_group; /* save for use later */ + if (h_in_group == h_out_group && v_in_group == v_out_group) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = fullsize_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = fullsize_downsample; + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group) { + smoothok = FALSE; + downsample->methods[ci] = h2v1_downsample; + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group * 2) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = h2v2_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = h2v2_downsample; + } else if ((h_in_group % h_out_group) == 0 && + (v_in_group % v_out_group) == 0) { + smoothok = FALSE; + downsample->methods[ci] = int_downsample; + downsample->h_expand[ci] = (UINT8) (h_in_group / h_out_group); + downsample->v_expand[ci] = (UINT8) (v_in_group / v_out_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + } + +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor && !smoothok) + TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL); +#endif +} diff -Nru mame-0.144/src/lib/libjpeg/jctrans.c mame-0.145/src/lib/libjpeg/jctrans.c --- mame-0.144/src/lib/libjpeg/jctrans.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jctrans.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,382 @@ +/* + * jctrans.c + * + * Copyright (C) 1995-1998, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding compression, + * that is, writing raw DCT coefficient arrays to an output JPEG file. + * The routines in jcapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transencode_master_selection + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); +LOCAL(void) transencode_coef_controller + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); + + +/* + * Compression initialization for writing raw-coefficient data. + * Before calling this, all parameters and a data destination must be set up. + * Call jpeg_finish_compress() to actually write the data. + * + * The number of passed virtual arrays must match cinfo->num_components. + * Note that the virtual arrays need not be filled or even realized at + * the time write_coefficients is called; indeed, if the virtual arrays + * were requested from this compression object's memory manager, they + * typically will be realized during this routine and filled afterwards. + */ + +GLOBAL(void) +jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Mark all tables to be written */ + jpeg_suppress_tables(cinfo, FALSE); + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + transencode_master_selection(cinfo, coef_arrays); + /* Wait for jpeg_finish_compress() call */ + cinfo->next_scanline = 0; /* so jpeg_write_marker works */ + cinfo->global_state = CSTATE_WRCOEFS; +} + + +/* + * Initialize the compression object with default parameters, + * then copy from the source object all parameters needed for lossless + * transcoding. Parameters that can be varied without loss (such as + * scan script and Huffman optimization) are left in their default states. + */ + +GLOBAL(void) +jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, + j_compress_ptr dstinfo) +{ + JQUANT_TBL ** qtblptr; + jpeg_component_info *incomp, *outcomp; + JQUANT_TBL *c_quant, *slot_quant; + int tblno, ci, coefi; + + /* Safety check to ensure start_compress not called yet. */ + if (dstinfo->global_state != CSTATE_START) + ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state); + /* Copy fundamental image dimensions */ + dstinfo->image_width = srcinfo->image_width; + dstinfo->image_height = srcinfo->image_height; + dstinfo->input_components = srcinfo->num_components; + dstinfo->in_color_space = srcinfo->jpeg_color_space; + dstinfo->jpeg_width = srcinfo->output_width; + dstinfo->jpeg_height = srcinfo->output_height; + dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size; + dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size; + /* Initialize all parameters to default values */ + jpeg_set_defaults(dstinfo); + /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. + * Fix it to get the right header markers for the image colorspace. + */ + jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space); + dstinfo->data_precision = srcinfo->data_precision; + dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling; + /* Copy the source's quantization tables. */ + for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { + if (srcinfo->quant_tbl_ptrs[tblno] != NULL) { + qtblptr = & dstinfo->quant_tbl_ptrs[tblno]; + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo); + MEMCOPY((*qtblptr)->quantval, + srcinfo->quant_tbl_ptrs[tblno]->quantval, + SIZEOF((*qtblptr)->quantval)); + (*qtblptr)->sent_table = FALSE; + } + } + /* Copy the source's per-component info. + * Note we assume jpeg_set_defaults has allocated the dest comp_info array. + */ + dstinfo->num_components = srcinfo->num_components; + if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS) + ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components, + MAX_COMPONENTS); + for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info; + ci < dstinfo->num_components; ci++, incomp++, outcomp++) { + outcomp->component_id = incomp->component_id; + outcomp->h_samp_factor = incomp->h_samp_factor; + outcomp->v_samp_factor = incomp->v_samp_factor; + outcomp->quant_tbl_no = incomp->quant_tbl_no; + /* Make sure saved quantization table for component matches the qtable + * slot. If not, the input file re-used this qtable slot. + * IJG encoder currently cannot duplicate this. + */ + tblno = outcomp->quant_tbl_no; + if (tblno < 0 || tblno >= NUM_QUANT_TBLS || + srcinfo->quant_tbl_ptrs[tblno] == NULL) + ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno); + slot_quant = srcinfo->quant_tbl_ptrs[tblno]; + c_quant = incomp->quant_table; + if (c_quant != NULL) { + for (coefi = 0; coefi < DCTSIZE2; coefi++) { + if (c_quant->quantval[coefi] != slot_quant->quantval[coefi]) + ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno); + } + } + /* Note: we do not copy the source's Huffman table assignments; + * instead we rely on jpeg_set_colorspace to have made a suitable choice. + */ + } + /* Also copy JFIF version and resolution information, if available. + * Strictly speaking this isn't "critical" info, but it's nearly + * always appropriate to copy it if available. In particular, + * if the application chooses to copy JFIF 1.02 extension markers from + * the source file, we need to copy the version to make sure we don't + * emit a file that has 1.02 extensions but a claimed version of 1.01. + * We will *not*, however, copy version info from mislabeled "2.01" files. + */ + if (srcinfo->saw_JFIF_marker) { + if (srcinfo->JFIF_major_version == 1) { + dstinfo->JFIF_major_version = srcinfo->JFIF_major_version; + dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version; + } + dstinfo->density_unit = srcinfo->density_unit; + dstinfo->X_density = srcinfo->X_density; + dstinfo->Y_density = srcinfo->Y_density; + } +} + + +/* + * Master selection of compression modules for transcoding. + * This substitutes for jcinit.c's initialization of the full compressor. + */ + +LOCAL(void) +transencode_master_selection (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, TRUE /* transcode only */); + + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); + } + + /* We need a special coefficient buffer controller. */ + transencode_coef_controller(cinfo, coef_arrays); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI, JFIF) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} + + +/* + * The rest of this file is a special implementation of the coefficient + * buffer controller. This is similar to jccoefct.c, but it handles only + * output from presupplied virtual arrays. Furthermore, we generate any + * dummy padding blocks on-the-fly rather than expecting them to be present + * in the arrays. + */ + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* Virtual block array for each component. */ + jvirt_barray_ptr * whole_image; + + /* Workspace for constructing dummy blocks at right/bottom edges. */ + JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + if (pass_mode != JBUF_CRANK_DEST) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); +} + + +/* + * Process some data. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, blockcnt; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yindex+yoffset < compptr->last_row_height) { + /* Fill in pointers to real blocks in this row */ + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < blockcnt; xindex++) + MCU_buffer[blkn++] = buffer_ptr++; + } else { + /* At bottom of image, need a whole row of dummy blocks */ + xindex = 0; + } + /* Fill in any dummy blocks needed in this row. + * Dummy blocks are filled in the same way as in jccoefct.c: + * all zeroes in the AC entries, DC entries equal to previous + * block's DC value. The init routine has already zeroed the + * AC entries, so we need only set the DC entries correctly. + */ + for (; xindex < compptr->MCU_width; xindex++) { + MCU_buffer[blkn] = coef->dummy_buffer[blkn]; + MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; + blkn++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +/* + * Initialize coefficient buffer controller. + * + * Each passed coefficient array must be the right size for that + * coefficient: width_in_blocks wide and height_in_blocks high, + * with unitheight at least v_samp_factor. + */ + +LOCAL(void) +transencode_coef_controller (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + my_coef_ptr coef; + JBLOCKROW buffer; + int i; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + coef->pub.compress_data = compress_output; + + /* Save pointer to virtual arrays */ + coef->whole_image = coef_arrays; + + /* Allocate and pre-zero space for dummy DCT blocks. */ + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->dummy_buffer[i] = buffer + i; + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdapimin.c mame-0.145/src/lib/libjpeg/jdapimin.c --- mame-0.144/src/lib/libjpeg/jdapimin.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdapimin.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,396 @@ +/* + * jdapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-decompression case or the + * transcoding-only case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jdapistd.c. But also see jcomapi.c for routines + * shared by compression and decompression, and jdtrans.c for the transcoding + * case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG decompression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_decompress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = TRUE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->src = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Initialize marker processor so application can override methods + * for COM, APPn markers before calling jpeg_read_header. + */ + cinfo->marker_list = NULL; + jinit_marker_reader(cinfo); + + /* And initialize the overall input controller. */ + jinit_input_controller(cinfo); + + /* OK, I'm ready */ + cinfo->global_state = DSTATE_START; +} + + +/* + * Destruction of a JPEG decompression object + */ + +GLOBAL(void) +jpeg_destroy_decompress (j_decompress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG decompression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_decompress (j_decompress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Set default decompression parameters. + */ + +LOCAL(void) +default_decompress_parms (j_decompress_ptr cinfo) +{ + /* Guess the input colorspace, and set output colorspace accordingly. */ + /* (Wish JPEG committee had provided a real way to specify this...) */ + /* Note application may override our guesses. */ + switch (cinfo->num_components) { + case 1: + cinfo->jpeg_color_space = JCS_GRAYSCALE; + cinfo->out_color_space = JCS_GRAYSCALE; + break; + + case 3: + if (cinfo->saw_JFIF_marker) { + cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ + } else if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_RGB; + break; + case 1: + cinfo->jpeg_color_space = JCS_YCbCr; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + break; + } + } else { + /* Saw no special markers, try to guess from the component IDs */ + int cid0 = cinfo->comp_info[0].component_id; + int cid1 = cinfo->comp_info[1].component_id; + int cid2 = cinfo->comp_info[2].component_id; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) + cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ + else if (cid0 == 82 && cid1 == 71 && cid2 == 66) + cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ + else { + TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + } + } + /* Always guess RGB is proper output colorspace. */ + cinfo->out_color_space = JCS_RGB; + break; + + case 4: + if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_CMYK; + break; + case 2: + cinfo->jpeg_color_space = JCS_YCCK; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ + break; + } + } else { + /* No special markers, assume straight CMYK. */ + cinfo->jpeg_color_space = JCS_CMYK; + } + cinfo->out_color_space = JCS_CMYK; + break; + + default: + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->out_color_space = JCS_UNKNOWN; + break; + } + + /* Set defaults for other decompression parameters. */ + cinfo->scale_num = cinfo->block_size; /* 1:1 scaling */ + cinfo->scale_denom = cinfo->block_size; + cinfo->output_gamma = 1.0; + cinfo->buffered_image = FALSE; + cinfo->raw_data_out = FALSE; + cinfo->dct_method = JDCT_DEFAULT; + cinfo->do_fancy_upsampling = TRUE; + cinfo->do_block_smoothing = TRUE; + cinfo->quantize_colors = FALSE; + /* We set these in case application only sets quantize_colors. */ + cinfo->dither_mode = JDITHER_FS; +#ifdef QUANT_2PASS_SUPPORTED + cinfo->two_pass_quantize = TRUE; +#else + cinfo->two_pass_quantize = FALSE; +#endif + cinfo->desired_number_of_colors = 256; + cinfo->colormap = NULL; + /* Initialize for no mode change in buffered-image mode. */ + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; +} + + +/* + * Decompression startup: read start of JPEG datastream to see what's there. + * Need only initialize JPEG object and supply a data source before calling. + * + * This routine will read as far as the first SOS marker (ie, actual start of + * compressed data), and will save all tables and parameters in the JPEG + * object. It will also initialize the decompression parameters to default + * values, and finally return JPEG_HEADER_OK. On return, the application may + * adjust the decompression parameters and then call jpeg_start_decompress. + * (Or, if the application only wanted to determine the image parameters, + * the data need not be decompressed. In that case, call jpeg_abort or + * jpeg_destroy to release any temporary space.) + * If an abbreviated (tables only) datastream is presented, the routine will + * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then + * re-use the JPEG object to read the abbreviated image datastream(s). + * It is unnecessary (but OK) to call jpeg_abort in this case. + * The JPEG_SUSPENDED return code only occurs if the data source module + * requests suspension of the decompressor. In this case the application + * should load more source data and then re-call jpeg_read_header to resume + * processing. + * If a non-suspending data source is used and require_image is TRUE, then the + * return code need not be inspected since only JPEG_HEADER_OK is possible. + * + * This routine is now just a front end to jpeg_consume_input, with some + * extra error checking. + */ + +GLOBAL(int) +jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) +{ + int retcode; + + if (cinfo->global_state != DSTATE_START && + cinfo->global_state != DSTATE_INHEADER) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + retcode = jpeg_consume_input(cinfo); + + switch (retcode) { + case JPEG_REACHED_SOS: + retcode = JPEG_HEADER_OK; + break; + case JPEG_REACHED_EOI: + if (require_image) /* Complain if application wanted an image */ + ERREXIT(cinfo, JERR_NO_IMAGE); + /* Reset to start state; it would be safer to require the application to + * call jpeg_abort, but we can't change it now for compatibility reasons. + * A side effect is to free any temporary memory (there shouldn't be any). + */ + jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ + retcode = JPEG_HEADER_TABLES_ONLY; + break; + case JPEG_SUSPENDED: + /* no work */ + break; + } + + return retcode; +} + + +/* + * Consume data in advance of what the decompressor requires. + * This can be called at any time once the decompressor object has + * been created and a data source has been set up. + * + * This routine is essentially a state machine that handles a couple + * of critical state-transition actions, namely initial setup and + * transition from header scanning to ready-for-start_decompress. + * All the actual input is done via the input controller's consume_input + * method. + */ + +GLOBAL(int) +jpeg_consume_input (j_decompress_ptr cinfo) +{ + int retcode = JPEG_SUSPENDED; + + /* NB: every possible DSTATE value should be listed in this switch */ + switch (cinfo->global_state) { + case DSTATE_START: + /* Start-of-datastream actions: reset appropriate modules */ + (*cinfo->inputctl->reset_input_controller) (cinfo); + /* Initialize application's data source module */ + (*cinfo->src->init_source) (cinfo); + cinfo->global_state = DSTATE_INHEADER; + /*FALLTHROUGH*/ + case DSTATE_INHEADER: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ + /* Set up default parameters based on header data */ + default_decompress_parms(cinfo); + /* Set global state: ready for start_decompress */ + cinfo->global_state = DSTATE_READY; + } + break; + case DSTATE_READY: + /* Can't advance past first SOS until start_decompress is called */ + retcode = JPEG_REACHED_SOS; + break; + case DSTATE_PRELOAD: + case DSTATE_PRESCAN: + case DSTATE_SCANNING: + case DSTATE_RAW_OK: + case DSTATE_BUFIMAGE: + case DSTATE_BUFPOST: + case DSTATE_STOPPING: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + break; + default: + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + return retcode; +} + + +/* + * Have we finished reading the input file? + */ + +GLOBAL(boolean) +jpeg_input_complete (j_decompress_ptr cinfo) +{ + /* Check for valid jpeg object */ + if (cinfo->global_state < DSTATE_START || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->eoi_reached; +} + + +/* + * Is there more than one scan? + */ + +GLOBAL(boolean) +jpeg_has_multiple_scans (j_decompress_ptr cinfo) +{ + /* Only valid after jpeg_read_header completes */ + if (cinfo->global_state < DSTATE_READY || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->has_multiple_scans; +} + + +/* + * Finish JPEG decompression. + * + * This will normally just verify the file trailer and release temp storage. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_decompress (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { + /* Terminate final pass of non-buffered mode */ + if (cinfo->output_scanline < cinfo->output_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state == DSTATE_BUFIMAGE) { + /* Finishing after a buffered-image operation */ + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state != DSTATE_STOPPING) { + /* STOPPING = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read until EOI */ + while (! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + /* Do final cleanup */ + (*cinfo->src->term_source) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); + return TRUE; +} diff -Nru mame-0.144/src/lib/libjpeg/jdapistd.c mame-0.145/src/lib/libjpeg/jdapistd.c --- mame-0.144/src/lib/libjpeg/jdapistd.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdapistd.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,275 @@ +/* + * jdapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-decompression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_decompress, it will end up linking in the entire decompressor. + * We thus must separate this file from jdapimin.c to avoid linking the + * whole decompression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); + + +/* + * Decompression initialization. + * jpeg_read_header must be completed before calling this. + * + * If a multipass operating mode was selected, this will do all but the + * last pass, and thus may take a great deal of time. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_start_decompress (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize master control, select active modules */ + jinit_master_decompress(cinfo); + if (cinfo->buffered_image) { + /* No more work here; expecting jpeg_start_output next */ + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; + } + cinfo->global_state = DSTATE_PRELOAD; + } + if (cinfo->global_state == DSTATE_PRELOAD) { + /* If file has multiple scans, absorb them all into the coef buffer */ + if (cinfo->inputctl->has_multiple_scans) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return FALSE; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* jdmaster underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + } + cinfo->output_scan_number = cinfo->input_scan_number; + } else if (cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any dummy output passes, and set up for the final pass */ + return output_pass_setup(cinfo); +} + + +/* + * Set up for an output pass, and perform any dummy pass(es) needed. + * Common subroutine for jpeg_start_decompress and jpeg_start_output. + * Entry: global_state = DSTATE_PRESCAN only if previously suspended. + * Exit: If done, returns TRUE and sets global_state for proper output mode. + * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. + */ + +LOCAL(boolean) +output_pass_setup (j_decompress_ptr cinfo) +{ + if (cinfo->global_state != DSTATE_PRESCAN) { + /* First call: do pass setup */ + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; + cinfo->global_state = DSTATE_PRESCAN; + } + /* Loop over any required dummy passes */ + while (cinfo->master->is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Crank through the dummy pass */ + while (cinfo->output_scanline < cinfo->output_height) { + JDIMENSION last_scanline; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* Process some data */ + last_scanline = cinfo->output_scanline; + (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, + &cinfo->output_scanline, (JDIMENSION) 0); + if (cinfo->output_scanline == last_scanline) + return FALSE; /* No progress made, must suspend */ + } + /* Finish up dummy pass, and set up for another one */ + (*cinfo->master->finish_output_pass) (cinfo); + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } + /* Ready for application to drive output pass through + * jpeg_read_scanlines or jpeg_read_raw_data. + */ + cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; + return TRUE; +} + + +/* + * Read some scanlines of data from the JPEG decompressor. + * + * The return value will be the number of lines actually read. + * This may be less than the number requested in several cases, + * including bottom of image, data source suspension, and operating + * modes that emit multiple scanlines at a time. + * + * Note: we warn about excess calls to jpeg_read_scanlines() since + * this likely signals an application programmer error. However, + * an oversize buffer (max_lines > scanlines remaining) is not an error. + */ + +GLOBAL(JDIMENSION) +jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION max_lines) +{ + JDIMENSION row_ctr; + + if (cinfo->global_state != DSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Process some data */ + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); + cinfo->output_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to read raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION max_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != DSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Verify that at least one iMCU row can be returned. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size; + if (max_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Decompress directly into user's buffer. */ + if (! (*cinfo->coef->decompress_data) (cinfo, data)) + return 0; /* suspension forced, can do nothing more */ + + /* OK, we processed one iMCU row. */ + cinfo->output_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} + + +/* Additional entry points for buffered-image mode. */ + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Initialize for an output pass in buffered-image mode. + */ + +GLOBAL(boolean) +jpeg_start_output (j_decompress_ptr cinfo, int scan_number) +{ + if (cinfo->global_state != DSTATE_BUFIMAGE && + cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Limit scan number to valid range */ + if (scan_number <= 0) + scan_number = 1; + if (cinfo->inputctl->eoi_reached && + scan_number > cinfo->input_scan_number) + scan_number = cinfo->input_scan_number; + cinfo->output_scan_number = scan_number; + /* Perform any dummy output passes, and set up for the real pass */ + return output_pass_setup(cinfo); +} + + +/* + * Finish up after an output pass in buffered-image mode. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_output (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { + /* Terminate this pass. */ + /* We do not require the whole pass to have been completed. */ + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_BUFPOST; + } else if (cinfo->global_state != DSTATE_BUFPOST) { + /* BUFPOST = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read markers looking for SOS or EOI */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jdarith.c mame-0.145/src/lib/libjpeg/jdarith.c --- mame-0.144/src/lib/libjpeg/jdarith.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdarith.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,772 @@ +/* + * jdarith.c + * + * Developed 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy decoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy decoder object for arithmetic decoding. */ + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval + input bit buffer */ + INT32 a; /* A register, normalized size of coding interval */ + int ct; /* bit shift counter, # of bits left in bit buffer part of C */ + /* init: ct = -16 */ + /* run: ct = 0..7 */ + /* error: ct = -1 */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_decoder; + +typedef arith_entropy_decoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + + +LOCAL(int) +get_byte (j_decompress_ptr cinfo) +/* Read next input byte; we do not support suspension in this module. */ +{ + struct jpeg_source_mgr * src = cinfo->src; + + if (src->bytes_in_buffer == 0) + if (! (*src->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + src->bytes_in_buffer--; + return GETJOCTET(*src->next_input_byte++); +} + + +/* + * The core arithmetic decoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Return value is 0 or 1 (binary decision). + * + * Note: I've changed the handling of the code base & bit + * buffer register C compared to other implementations + * based on the standards layout & procedures. + * While it also contains both the actual base of the + * coding interval (16 bits) and the next-bits buffer, + * the cut-point between these two parts is floating + * (instead of fixed) with the bit shift counter CT. + * Thus, we also need only one (variable instead of + * fixed size) shift for the LPS/MPS decision, and + * we can get away with any renormalization update + * of C (except for new data insertion, of course). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(int) +arith_decode (j_decompress_ptr cinfo, unsigned char *st) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv, data; + + /* Renormalization & data input per section D.2.6 */ + while (e->a < 0x8000L) { + if (--e->ct < 0) { + /* Need to fetch next data byte */ + if (cinfo->unread_marker) + data = 0; /* stuff zero data */ + else { + data = get_byte(cinfo); /* read next input byte */ + if (data == 0xFF) { /* zero stuff or marker code */ + do data = get_byte(cinfo); + while (data == 0xFF); /* swallow extra 0xFF bytes */ + if (data == 0) + data = 0xFF; /* discard stuffed zero byte */ + else { + /* Note: Different from the Huffman decoder, hitting + * a marker while processing the compressed data + * segment is legal in arithmetic coding. + * The convention is to supply zero data + * then until decoding is complete. + */ + cinfo->unread_marker = data; + data = 0; + } + } + } + e->c = (e->c << 8) | data; /* insert data into C register */ + if ((e->ct += 8) < 0) /* update bit shift counter */ + /* Need more initial bytes */ + if (++e->ct == 0) + /* Got 2 initial bytes -> re-init A and exit loop */ + e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */ + } + e->a <<= 1; + } + + /* Fetch values from our compact representation of Table D.2: + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Decode & estimation procedures per sections D.2.4 & D.2.5 */ + temp = e->a - qe; + e->a = temp; + temp <<= e->ct; + if (e->c >= temp) { + e->c -= temp; + /* Conditional LPS (less probable symbol) exchange */ + if (e->a < qe) { + e->a = qe; + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } else { + e->a = qe; + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } + } else if (e->a < 0x8000L) { + /* Conditional MPS (more probable symbol) exchange */ + if (e->a < qe) { + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } else { + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + } + + return sv >> 7; +} + + +/* + * Check for a restart marker & resynchronize decoder. + */ + +LOCAL(void) +process_restart (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Arithmetic MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * arithmetic-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign; + int v, m; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + /* Figure F.20: Decode_AC_coefficients */ + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int p1, blkn; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* Encoded data is simply the next bit of the two's-complement DC value */ + if (arith_decode(cinfo, st)) + MCU_data[blkn][0][0] |= p1; + } + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + JCOEFPTR thiscoef; + unsigned char *st; + int tbl, k, kex; + int p1, m1; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = cinfo->Se; kex > 0; kex--) + if ((*block)[natural_order[kex]]) break; + + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + if (arith_decode(cinfo, st)) break; /* EOB flag */ + for (;;) { + thiscoef = *block + natural_order[k]; + if (*thiscoef) { /* previously nonzero coef */ + if (arith_decode(cinfo, st + 2)) { + if (*thiscoef < 0) + *thiscoef += m1; + else + *thiscoef += p1; + } + break; + } + if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ + if (arith_decode(cinfo, entropy->fixed_bin)) + *thiscoef = m1; + else + *thiscoef = p1; + break; + } + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + } + + return TRUE; +} + + +/* + * Decode one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + (*block)[0] = (JCOEF) entropy->last_dc_val[ci]; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + tbl = compptr->ac_tbl_no; + + /* Figure F.20: Decode_AC_coefficients */ + for (k = 1; k <= cinfo->lim_Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->lim_Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + (*block)[natural_order[k]] = (JCOEF) v; + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + /* Select MCU decoding routine */ + entropy->pub.decode_mcu = decode_mcu; + } + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); + } + } + + /* Initialize arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for arithmetic entropy decoding. + */ + +GLOBAL(void) +jinit_arith_decoder (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdatadst.c mame-0.145/src/lib/libjpeg/jdatadst.c --- mame-0.144/src/lib/libjpeg/jdatadst.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdatadst.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,267 @@ +/* + * jdatadst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains compression data destination routines for the case of + * emitting JPEG data to memory or to a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different destination manager. + * IMPORTANT: we assume that fwrite() will correctly transcribe an array of + * JOCTETs into 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* Expanded data destination object for stdio output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + FILE * outfile; /* target stream */ + JOCTET * buffer; /* start of buffer */ +} my_destination_mgr; + +typedef my_destination_mgr * my_dest_ptr; + +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ + + +/* Expanded data destination object for memory output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + unsigned char ** outbuffer; /* target buffer */ + unsigned long * outsize; + unsigned char * newbuffer; /* newly allocated buffer */ + JOCTET * buffer; /* start of buffer */ + size_t bufsize; +} my_mem_destination_mgr; + +typedef my_mem_destination_mgr * my_mem_dest_ptr; + + +/* + * Initialize destination --- called by jpeg_start_compress + * before any data is actually written. + */ + +METHODDEF(void) +init_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + /* Allocate the output buffer --- it will be released when done with image */ + dest->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + OUTPUT_BUF_SIZE * SIZEOF(JOCTET)); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; +} + +METHODDEF(void) +init_mem_destination (j_compress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Empty the output buffer --- called whenever buffer fills up. + * + * In typical applications, this should write the entire output buffer + * (ignoring the current state of next_output_byte & free_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been dumped. + * + * In applications that need to be able to suspend compression due to output + * overrun, a FALSE return indicates that the buffer cannot be emptied now. + * In this situation, the compressor will return to its caller (possibly with + * an indication that it has not accepted all the supplied scanlines). The + * application should resume compression after it has made more room in the + * output buffer. Note that there are substantial restrictions on the use of + * suspension --- see the documentation. + * + * When suspending, the compressor will back up to a convenient restart point + * (typically the start of the current MCU). next_output_byte & free_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point will be regenerated after resumption, so do not + * write it out when emptying the buffer externally. + */ + +METHODDEF(boolean) +empty_output_buffer (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) != + (size_t) OUTPUT_BUF_SIZE) + ERREXIT(cinfo, JERR_FILE_WRITE); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; + + return TRUE; +} + +METHODDEF(boolean) +empty_mem_output_buffer (j_compress_ptr cinfo) +{ + size_t nextsize; + JOCTET * nextbuffer; + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + /* Try to allocate new buffer with double size */ + nextsize = dest->bufsize * 2; + nextbuffer = (JOCTET*)malloc(nextsize); + + if (nextbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + + MEMCOPY(nextbuffer, dest->buffer, dest->bufsize); + + if (dest->newbuffer != NULL) + free(dest->newbuffer); + + dest->newbuffer = nextbuffer; + + dest->pub.next_output_byte = nextbuffer + dest->bufsize; + dest->pub.free_in_buffer = dest->bufsize; + + dest->buffer = nextbuffer; + dest->bufsize = nextsize; + + return TRUE; +} + + +/* + * Terminate destination --- called by jpeg_finish_compress + * after all data has been written. Usually needs to flush buffer. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; + + /* Write any data remaining in the buffer */ + if (datacount > 0) { + if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount) + ERREXIT(cinfo, JERR_FILE_WRITE); + } + fflush(dest->outfile); + /* Make sure we wrote the output file OK */ + if (ferror(dest->outfile)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + +METHODDEF(void) +term_mem_destination (j_compress_ptr cinfo) +{ + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + *dest->outbuffer = dest->buffer; + *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; +} + + +/* + * Prepare for output to a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing compression. + */ + +GLOBAL(void) +jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) +{ + my_dest_ptr dest; + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same file without re-executing jpeg_stdio_dest. + * This makes it dangerous to use this manager and a different destination + * manager serially with the same JPEG object, because their private object + * sizes may be different. Caveat programmer. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_destination_mgr)); + } + + dest = (my_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_destination; + dest->pub.empty_output_buffer = empty_output_buffer; + dest->pub.term_destination = term_destination; + dest->outfile = outfile; +} + + +/* + * Prepare for output to a memory buffer. + * The caller may supply an own initial buffer with appropriate size. + * Otherwise, or when the actual data output exceeds the given size, + * the library adapts the buffer size as necessary. + * The standard library functions malloc/free are used for allocating + * larger memory, so the buffer is available to the application after + * finishing compression, and then the application is responsible for + * freeing the requested memory. + */ + +GLOBAL(void) +jpeg_mem_dest (j_compress_ptr cinfo, + unsigned char ** outbuffer, unsigned long * outsize) +{ + my_mem_dest_ptr dest; + + if (outbuffer == NULL || outsize == NULL) /* sanity check */ + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same buffer without re-executing jpeg_mem_dest. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_mem_destination_mgr)); + } + + dest = (my_mem_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_mem_destination; + dest->pub.empty_output_buffer = empty_mem_output_buffer; + dest->pub.term_destination = term_mem_destination; + dest->outbuffer = outbuffer; + dest->outsize = outsize; + dest->newbuffer = NULL; + + if (*outbuffer == NULL || *outsize == 0) { + /* Allocate initial buffer */ + dest->newbuffer = *outbuffer = (unsigned char*)malloc(OUTPUT_BUF_SIZE); + if (dest->newbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + *outsize = OUTPUT_BUF_SIZE; + } + + dest->pub.next_output_byte = dest->buffer = *outbuffer; + dest->pub.free_in_buffer = dest->bufsize = *outsize; +} diff -Nru mame-0.144/src/lib/libjpeg/jdatasrc.c mame-0.145/src/lib/libjpeg/jdatasrc.c --- mame-0.144/src/lib/libjpeg/jdatasrc.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdatasrc.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,274 @@ +/* + * jdatasrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains decompression data source routines for the case of + * reading JPEG data from memory or from a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different source manager. + * IMPORTANT: we assume that fread() will correctly transcribe an array of + * JOCTETs from 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + + +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + FILE * infile; /* source stream */ + JOCTET * buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ + + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +METHODDEF(void) +init_source (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + src->start_of_file = TRUE; +} + +METHODDEF(void) +init_mem_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In typical applications, this should read fresh data into the buffer + * (ignoring the current state of next_input_byte & bytes_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been reloaded. It is not necessary to + * fill the buffer entirely, only to obtain at least one more byte. + * + * There is no such thing as an EOF return. If the end of the file has been + * reached, the routine has a choice of ERREXIT() or inserting fake data into + * the buffer. In most cases, generating a warning message and inserting a + * fake EOI marker is the best course of action --- this will allow the + * decompressor to output however much of the image is there. However, + * the resulting error message is misleading if the real problem is an empty + * input file, so we handle that case specially. + * + * In applications that need to be able to suspend compression due to input + * not being available yet, a FALSE return indicates that no more data can be + * obtained right now, but more may be forthcoming later. In this situation, + * the decompressor will return to its caller (with an indication of the + * number of scanlines it has read, if any). The application should resume + * decompression after it has loaded more data into the input buffer. Note + * that there are substantial restrictions on the use of suspension --- see + * the documentation. + * + * When suspending, the decompressor will back up to a convenient restart point + * (typically the start of the current MCU). next_input_byte & bytes_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point must be rescanned after resumption, so move it to + * the front of the buffer rather than discarding it. + */ + +METHODDEF(boolean) +fill_input_buffer (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + size_t nbytes; + + nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); + + if (nbytes <= 0) { + if (src->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET) 0xFF; + src->buffer[1] = (JOCTET) JPEG_EOI; + nbytes = 2; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + + return TRUE; +} + +METHODDEF(boolean) +fill_mem_input_buffer (j_decompress_ptr cinfo) +{ + static JOCTET mybuffer[4]; + + /* The whole JPEG data is expected to reside in the supplied memory + * buffer, so any request for more data beyond the given buffer size + * is treated as an error. + */ + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + mybuffer[0] = (JOCTET) 0xFF; + mybuffer[1] = (JOCTET) JPEG_EOI; + + cinfo->src->next_input_byte = mybuffer; + cinfo->src->bytes_in_buffer = 2; + + return TRUE; +} + + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * Writers of suspendable-input applications must note that skip_input_data + * is not granted the right to give a suspension return. If the skip extends + * beyond the data currently in the buffer, the buffer can be marked empty so + * that the next read will cause a fill_input_buffer call that can suspend. + * Arranging for additional bytes to be discarded before reloading the input + * buffer is the application writer's problem. + */ + +METHODDEF(void) +skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + struct jpeg_source_mgr * src = cinfo->src; + + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) src->bytes_in_buffer) { + num_bytes -= (long) src->bytes_in_buffer; + (void) (*src->fill_input_buffer) (cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->next_input_byte += (size_t) num_bytes; + src->bytes_in_buffer -= (size_t) num_bytes; + } +} + + +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Prepare for input from a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing decompression. + */ + +GLOBAL(void) +jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) +{ + my_src_ptr src; + + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_source_mgr)); + src = (my_src_ptr) cinfo->src; + src->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + INPUT_BUF_SIZE * SIZEOF(JOCTET)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + src->infile = infile; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} + + +/* + * Prepare for input from a supplied memory buffer. + * The buffer must contain the whole JPEG data. + */ + +GLOBAL(void) +jpeg_mem_src (j_decompress_ptr cinfo, + unsigned char * inbuffer, unsigned long insize) +{ + struct jpeg_source_mgr * src; + + if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + + /* The source object is made permanent so that a series of JPEG images + * can be read from the same buffer by calling jpeg_mem_src only before + * the first one. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(struct jpeg_source_mgr)); + } + + src = cinfo->src; + src->init_source = init_mem_source; + src->fill_input_buffer = fill_mem_input_buffer; + src->skip_input_data = skip_input_data; + src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->term_source = term_source; + src->bytes_in_buffer = (size_t) insize; + src->next_input_byte = (JOCTET *) inbuffer; +} diff -Nru mame-0.144/src/lib/libjpeg/jdcoefct.c mame-0.145/src/lib/libjpeg/jdcoefct.c --- mame-0.144/src/lib/libjpeg/jdcoefct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdcoefct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,736 @@ +/* + * jdcoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for decompression. + * This controller is the top level of the JPEG decompressor proper. + * The coefficient buffer lies between entropy decoding and inverse-DCT steps. + * + * In buffered-image mode, this controller is the interface between + * input-oriented processing and output-oriented processing. + * Also, the input side (only) is used when reading a file for transcoding. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* Block smoothing is only applicable for progressive JPEG, so: */ +#ifndef D_PROGRESSIVE_SUPPORTED +#undef BLOCK_SMOOTHING_SUPPORTED +#endif + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_coef_controller pub; /* public fields */ + + /* These variables keep track of the current location of the input side. */ + /* cinfo->input_iMCU_row is also used for this. */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* The output side's location is represented by cinfo->output_iMCU_row. */ + + /* In single-pass modes, it's sufficient to buffer just one MCU. + * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, + * and let the entropy decoder write into that workspace each time. + * (On 80x86, the workspace is FAR even though it's not really very big; + * this is to keep the module interfaces unchanged when a large coefficient + * buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays; it is used only by the input side. + */ + JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +#endif + +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* When doing block smoothing, we latch coefficient Al values here */ + int * coef_bits_latch; +#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ +#endif +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + +/* Forward declarations */ +METHODDEF(int) decompress_onepass + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#ifdef D_MULTISCAN_FILES_SUPPORTED +METHODDEF(int) decompress_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif +#ifdef BLOCK_SMOOTHING_SUPPORTED +LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); +METHODDEF(int) decompress_smooth_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_decompress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row (input side) */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->MCU_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for an input processing pass. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + cinfo->input_iMCU_row = 0; + start_iMCU_row(cinfo); +} + + +/* + * Initialize for an output processing pass. + */ + +METHODDEF(void) +start_output_pass (j_decompress_ptr cinfo) +{ +#ifdef BLOCK_SMOOTHING_SUPPORTED + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* If multipass, check to see whether to use block smoothing on this pass */ + if (coef->pub.coef_arrays != NULL) { + if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) + coef->pub.decompress_data = decompress_smooth_data; + else + coef->pub.decompress_data = decompress_data; + } +#endif + cinfo->output_iMCU_row = 0; +} + + +/* + * Decompress and return some data in the single-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Input and output must run in lockstep since we have only a one-MCU buffer. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(int) +decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, useful_width; + JSAMPARRAY output_ptr; + JDIMENSION start_col, output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Loop to process as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ + jzero_far((void FAR *) coef->MCU_buffer[0], + (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + /* Determine where data should go in output_buf and do the IDCT thing. + * We skip dummy blocks at the right and bottom edges (but blkn gets + * incremented past them!). Note the inner loop relies on having + * allocated the MCU_buffer[] blocks sequentially. + */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) { + blkn += compptr->MCU_blocks; + continue; + } + inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; + useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + output_ptr = output_buf[compptr->component_index] + + yoffset * compptr->DCT_v_scaled_size; + start_col = MCU_col_num * compptr->MCU_sample_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (cinfo->input_iMCU_row < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + output_col = start_col; + for (xindex = 0; xindex < useful_width; xindex++) { + (*inverse_DCT) (cinfo, compptr, + (JCOEFPTR) coef->MCU_buffer[blkn+xindex], + output_ptr, output_col); + output_col += compptr->DCT_h_scaled_size; + } + } + blkn += compptr->MCU_width; + output_ptr += compptr->DCT_v_scaled_size; + } + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + cinfo->output_iMCU_row++; + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Dummy consume-input routine for single-pass operation. + */ + +METHODDEF(int) +dummy_consume_data (j_decompress_ptr cinfo) +{ + return JPEG_SUSPENDED; /* Always indicate nothing was done */ +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Consume input data and store it in the full-image coefficient buffer. + * We read as much as one fully interleaved MCU row ("iMCU" row) per call, + * ie, v_samp_factor block rows for each component in the scan. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + */ + +METHODDEF(int) +consume_data (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + cinfo->input_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Note: entropy decoder expects buffer to be zeroed, + * but this is handled automatically by the memory manager + * because we requested a pre-zeroed array. + */ + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to fetch the MCU. */ + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Decompress and return some data in the multi-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image. + */ + +METHODDEF(int) +decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num; + int ci, block_row, block_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number < cinfo->output_scan_number || + (cinfo->input_scan_number == cinfo->output_scan_number && + cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + cinfo->output_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + output_col = 0; + for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { + (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, + output_ptr, output_col); + buffer_ptr++; + output_col += compptr->DCT_h_scaled_size; + } + output_ptr += compptr->DCT_v_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +#ifdef BLOCK_SMOOTHING_SUPPORTED + +/* + * This code applies interblock smoothing as described by section K.8 + * of the JPEG standard: the first 5 AC coefficients are estimated from + * the DC values of a DCT block and its 8 neighboring blocks. + * We apply smoothing only for progressive JPEG decoding, and only if + * the coefficients it can estimate are not yet known to full precision. + */ + +/* Natural-order array positions of the first 5 zigzag-order coefficients */ +#define Q01_POS 1 +#define Q10_POS 8 +#define Q20_POS 16 +#define Q11_POS 9 +#define Q02_POS 2 + +/* + * Determine whether block smoothing is applicable and safe. + * We also latch the current states of the coef_bits[] entries for the + * AC coefficients; otherwise, if the input side of the decompressor + * advances into a new scan, we might think the coefficients are known + * more accurately than they really are. + */ + +LOCAL(boolean) +smoothing_ok (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + boolean smoothing_useful = FALSE; + int ci, coefi; + jpeg_component_info *compptr; + JQUANT_TBL * qtable; + int * coef_bits; + int * coef_bits_latch; + + if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) + return FALSE; + + /* Allocate latch area if not already done */ + if (coef->coef_bits_latch == NULL) + coef->coef_bits_latch = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * + (SAVED_COEFS * SIZEOF(int))); + coef_bits_latch = coef->coef_bits_latch; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* All components' quantization values must already be latched. */ + if ((qtable = compptr->quant_table) == NULL) + return FALSE; + /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ + if (qtable->quantval[0] == 0 || + qtable->quantval[Q01_POS] == 0 || + qtable->quantval[Q10_POS] == 0 || + qtable->quantval[Q20_POS] == 0 || + qtable->quantval[Q11_POS] == 0 || + qtable->quantval[Q02_POS] == 0) + return FALSE; + /* DC values must be at least partly known for all components. */ + coef_bits = cinfo->coef_bits[ci]; + if (coef_bits[0] < 0) + return FALSE; + /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ + for (coefi = 1; coefi <= 5; coefi++) { + coef_bits_latch[coefi] = coef_bits[coefi]; + if (coef_bits[coefi] != 0) + smoothing_useful = TRUE; + } + coef_bits_latch += SAVED_COEFS; + } + + return smoothing_useful; +} + + +/* + * Variant of decompress_data for use when doing block smoothing. + */ + +METHODDEF(int) +decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num, last_block_column; + int ci, block_row, block_rows, access_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr, prev_block_row, next_block_row; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + boolean first_row, last_row; + JBLOCK workspace; + int *coef_bits; + JQUANT_TBL *quanttbl; + INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; + int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; + int Al, pred; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if (cinfo->input_scan_number == cinfo->output_scan_number) { + /* If input is working on current scan, we ordinarily want it to + * have completed the current row. But if input scan is DC, + * we want it to keep one row ahead so that next block row's DC + * values are up to date. + */ + JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; + if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) + break; + } + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) { + block_rows = compptr->v_samp_factor; + access_rows = block_rows * 2; /* this and next iMCU row */ + last_row = FALSE; + } else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + access_rows = block_rows; /* this iMCU row only */ + last_row = TRUE; + } + /* Align the virtual buffer for this component. */ + if (cinfo->output_iMCU_row > 0) { + access_rows += compptr->v_samp_factor; /* prior iMCU row too */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, + (JDIMENSION) access_rows, FALSE); + buffer += compptr->v_samp_factor; /* point to current iMCU row */ + first_row = FALSE; + } else { + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); + first_row = TRUE; + } + /* Fetch component-dependent info */ + coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + quanttbl = compptr->quant_table; + Q00 = quanttbl->quantval[0]; + Q01 = quanttbl->quantval[Q01_POS]; + Q10 = quanttbl->quantval[Q10_POS]; + Q20 = quanttbl->quantval[Q20_POS]; + Q11 = quanttbl->quantval[Q11_POS]; + Q02 = quanttbl->quantval[Q02_POS]; + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + if (first_row && block_row == 0) + prev_block_row = buffer_ptr; + else + prev_block_row = buffer[block_row-1]; + if (last_row && block_row == block_rows-1) + next_block_row = buffer_ptr; + else + next_block_row = buffer[block_row+1]; + /* We fetch the surrounding DC values using a sliding-register approach. + * Initialize all nine here so as to do the right thing on narrow pics. + */ + DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; + DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; + DC7 = DC8 = DC9 = (int) next_block_row[0][0]; + output_col = 0; + last_block_column = compptr->width_in_blocks - 1; + for (block_num = 0; block_num <= last_block_column; block_num++) { + /* Fetch current DCT block into workspace so we can modify it. */ + jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); + /* Update DC values */ + if (block_num < last_block_column) { + DC3 = (int) prev_block_row[1][0]; + DC6 = (int) buffer_ptr[1][0]; + DC9 = (int) next_block_row[1][0]; + } + /* Compute coefficient estimates per K.8. + * An estimate is applied only if coefficient is still zero, + * and is not known to be fully accurate. + */ + /* AC01 */ + if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { + num = 36 * Q00 * (DC4 - DC6); + if (num >= 0) { + pred = (int) (((Q01<<7) + num) / (Q01<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q10<<7) + num) / (Q10<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q20<<7) + num) / (Q20<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q11<<7) + num) / (Q11<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q02<<7) + num) / (Q02<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_h_scaled_size; + } + output_ptr += compptr->DCT_v_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* BLOCK_SMOOTHING_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_d_coef_controller *) coef; + coef->pub.start_input_pass = start_input_pass; + coef->pub.start_output_pass = start_output_pass; +#ifdef BLOCK_SMOOTHING_SUPPORTED + coef->coef_bits_latch = NULL; +#endif + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + /* Note we ask for a pre-zeroed array. */ + int ci, access_rows; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + access_rows = compptr->v_samp_factor; +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* If block smoothing could be used, need a bigger window */ + if (cinfo->progressive_mode) + access_rows *= 3; +#endif + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) access_rows); + } + coef->pub.consume_data = consume_data; + coef->pub.decompress_data = decompress_data; + coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->pub.consume_data = dummy_consume_data; + coef->pub.decompress_data = decompress_onepass; + coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdcolor.c mame-0.145/src/lib/libjpeg/jdcolor.c --- mame-0.144/src/lib/libjpeg/jdcolor.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdcolor.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,396 @@ +/* + * jdcolor.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains output colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_deconverter pub; /* public fields */ + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ +} my_color_deconverter; + +typedef my_color_deconverter * my_cconvert_ptr; + + +/**************** YCbCr -> RGB conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * R = Y + 1.40200 * Cr + * G = Y - 0.34414 * Cb - 0.71414 * Cr + * B = Y + 1.77200 * Cb + * where Cb and Cr represent the incoming values less CENTERJSAMPLE. + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * Notice that Y, being an integral input, does not contribute any fraction + * so it need not participate in the rounding. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times Cb and Cr for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The Cr=>R and Cb=>B values can be rounded to integers in advance; the + * values for the G calculation are left scaled up, since we must add them + * together before rounding. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + int i; + INT32 x; + SHIFT_TEMPS + + cconvert->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + cconvert->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + cconvert->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + cconvert->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Convert some rows of samples to the output colorspace. + * + * Note that we change from noninterleaved, one-plane-per-component format + * to interleaved-pixel format. The output buffer is therefore three times + * as wide as the input buffer. + * A starting row offset is provided only for the input buffer. The caller + * can easily adjust the passed output_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +ycc_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; + outptr[RGB_GREEN] = range_limit[y + + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS))]; + outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/**************** Cases other than YCbCr -> RGB **************/ + + +/* + * Color conversion for no colorspace change: just copy the data, + * converting from separate-planes to interleaved representation. + */ + +METHODDEF(void) +null_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION count; + register int num_components = cinfo->num_components; + JDIMENSION num_cols = cinfo->output_width; + int ci; + + while (--num_rows >= 0) { + for (ci = 0; ci < num_components; ci++) { + inptr = input_buf[ci][input_row]; + outptr = output_buf[0] + ci; + for (count = num_cols; count > 0; count--) { + *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ + outptr += num_components; + } + } + input_row++; + output_buf++; + } +} + + +/* + * Color conversion for grayscale: just copy the data. + * This also works for YCbCr -> grayscale conversion, in which + * we just copy the Y (luminance) component and ignore chrominance. + */ + +METHODDEF(void) +grayscale_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, + num_rows, cinfo->output_width); +} + + +/* + * Convert grayscale to RGB: just duplicate the graylevel three times. + * This is provided to support applications that don't want to cope + * with grayscale as a separate case. + */ + +METHODDEF(void) +gray_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr = input_buf[0][input_row++]; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/* + * Adobe-style YCCK->CMYK conversion. + * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same + * conversion as above, while passing K (black) unchanged. + * We assume build_ycc_rgb_table has been called. + */ + +METHODDEF(void) +ycck_cmyk_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2, inptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + inptr3 = input_buf[3][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ + outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS)))]; + outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ + /* K passes through unchanged */ + outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr += 4; + } + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +start_pass_dcolor (j_decompress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for output colorspace conversion. + */ + +GLOBAL(void) +jinit_color_deconverter (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + int ci; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_deconverter)); + cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; + cconvert->pub.start_pass = start_pass_dcolor; + + /* Make sure num_components agrees with jpeg_color_space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_RGB: + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->num_components < 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + } + + /* Set out_color_components and conversion method based on requested space. + * Also clear the component_needed flags for any unused components, + * so that earlier pipeline stages can avoid useless computation. + */ + + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + if (cinfo->jpeg_color_space == JCS_GRAYSCALE || + cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = grayscale_convert; + /* For color->grayscale conversion, only the Y (0) component is needed */ + for (ci = 1; ci < cinfo->num_components; ci++) + cinfo->comp_info[ci].component_needed = FALSE; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + cinfo->out_color_components = RGB_PIXELSIZE; + if (cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = ycc_rgb_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { + cconvert->pub.color_convert = gray_rgb_convert; + } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + cinfo->out_color_components = 4; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cconvert->pub.color_convert = ycck_cmyk_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_CMYK) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: + /* Permit null conversion to same output space */ + if (cinfo->out_color_space == cinfo->jpeg_color_space) { + cinfo->out_color_components = cinfo->num_components; + cconvert->pub.color_convert = null_convert; + } else /* unsupported non-null conversion */ + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + } + + if (cinfo->quantize_colors) + cinfo->output_components = 1; /* single colormapped output component */ + else + cinfo->output_components = cinfo->out_color_components; +} diff -Nru mame-0.144/src/lib/libjpeg/jdct.h mame-0.145/src/lib/libjpeg/jdct.h --- mame-0.144/src/lib/libjpeg/jdct.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdct.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,393 @@ +/* + * jdct.h + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file contains common declarations for the forward and + * inverse DCT modules. These declarations are private to the DCT managers + * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. + * The individual DCT algorithms are kept in separate files to ease + * machine-dependent tuning (e.g., assembly coding). + */ + + +/* + * A forward DCT routine is given a pointer to an input sample array and + * a pointer to a work area of type DCTELEM[]; the DCT is to be performed + * in-place in that buffer. Type DCTELEM is int for 8-bit samples, INT32 + * for 12-bit samples. (NOTE: Floating-point DCT implementations use an + * array of type FAST_FLOAT, instead.) + * The input data is to be fetched from the sample array starting at a + * specified column. (Any row offset needed will be applied to the array + * pointer before it is passed to the FDCT code.) + * Note that the number of samples fetched by the FDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. + * The DCT outputs are returned scaled up by a factor of 8; they therefore + * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This + * convention improves accuracy in integer implementations and saves some + * work in floating-point ones. + * Quantization of the output coefficients is done by jcdctmgr.c. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef int DCTELEM; /* 16 or 32 bits is fine */ +#else +typedef INT32 DCTELEM; /* must have 32 bits */ +#endif + +typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); + + +/* + * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer + * to an output sample array. The routine must dequantize the input data as + * well as perform the IDCT; for dequantization, it uses the multiplier table + * pointed to by compptr->dct_table. The output data is to be placed into the + * sample array starting at a specified column. (Any row offset needed will + * be applied to the array pointer before it is passed to the IDCT code.) + * Note that the number of samples emitted by the IDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. + */ + +/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ + +/* + * Each IDCT routine has its own ideas about the best dct_table element type. + */ + +typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ +#if BITS_IN_JSAMPLE == 8 +typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ +#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ +#else +typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ +#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ +#endif +typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ + + +/* + * Each IDCT routine is responsible for range-limiting its results and + * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could + * be quite far out of range if the input data is corrupt, so a bulletproof + * range-limiting step is required. We use a mask-and-table-lookup method + * to do the combined operations quickly. See the comments with + * prepare_range_limit_table (in jdmaster.c) for more info. + */ + +#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) + +#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_fdct_islow jFDislow +#define jpeg_fdct_ifast jFDifast +#define jpeg_fdct_float jFDfloat +#define jpeg_fdct_7x7 jFD7x7 +#define jpeg_fdct_6x6 jFD6x6 +#define jpeg_fdct_5x5 jFD5x5 +#define jpeg_fdct_4x4 jFD4x4 +#define jpeg_fdct_3x3 jFD3x3 +#define jpeg_fdct_2x2 jFD2x2 +#define jpeg_fdct_1x1 jFD1x1 +#define jpeg_fdct_9x9 jFD9x9 +#define jpeg_fdct_10x10 jFD10x10 +#define jpeg_fdct_11x11 jFD11x11 +#define jpeg_fdct_12x12 jFD12x12 +#define jpeg_fdct_13x13 jFD13x13 +#define jpeg_fdct_14x14 jFD14x14 +#define jpeg_fdct_15x15 jFD15x15 +#define jpeg_fdct_16x16 jFD16x16 +#define jpeg_fdct_16x8 jFD16x8 +#define jpeg_fdct_14x7 jFD14x7 +#define jpeg_fdct_12x6 jFD12x6 +#define jpeg_fdct_10x5 jFD10x5 +#define jpeg_fdct_8x4 jFD8x4 +#define jpeg_fdct_6x3 jFD6x3 +#define jpeg_fdct_4x2 jFD4x2 +#define jpeg_fdct_2x1 jFD2x1 +#define jpeg_fdct_8x16 jFD8x16 +#define jpeg_fdct_7x14 jFD7x14 +#define jpeg_fdct_6x12 jFD6x12 +#define jpeg_fdct_5x10 jFD5x10 +#define jpeg_fdct_4x8 jFD4x8 +#define jpeg_fdct_3x6 jFD3x6 +#define jpeg_fdct_2x4 jFD2x4 +#define jpeg_fdct_1x2 jFD1x2 +#define jpeg_idct_islow jRDislow +#define jpeg_idct_ifast jRDifast +#define jpeg_idct_float jRDfloat +#define jpeg_idct_7x7 jRD7x7 +#define jpeg_idct_6x6 jRD6x6 +#define jpeg_idct_5x5 jRD5x5 +#define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_3x3 jRD3x3 +#define jpeg_idct_2x2 jRD2x2 +#define jpeg_idct_1x1 jRD1x1 +#define jpeg_idct_9x9 jRD9x9 +#define jpeg_idct_10x10 jRD10x10 +#define jpeg_idct_11x11 jRD11x11 +#define jpeg_idct_12x12 jRD12x12 +#define jpeg_idct_13x13 jRD13x13 +#define jpeg_idct_14x14 jRD14x14 +#define jpeg_idct_15x15 jRD15x15 +#define jpeg_idct_16x16 jRD16x16 +#define jpeg_idct_16x8 jRD16x8 +#define jpeg_idct_14x7 jRD14x7 +#define jpeg_idct_12x6 jRD12x6 +#define jpeg_idct_10x5 jRD10x5 +#define jpeg_idct_8x4 jRD8x4 +#define jpeg_idct_6x3 jRD6x3 +#define jpeg_idct_4x2 jRD4x2 +#define jpeg_idct_2x1 jRD2x1 +#define jpeg_idct_8x16 jRD8x16 +#define jpeg_idct_7x14 jRD7x14 +#define jpeg_idct_6x12 jRD6x12 +#define jpeg_idct_5x10 jRD5x10 +#define jpeg_idct_4x8 jRD4x8 +#define jpeg_idct_3x6 jRD3x8 +#define jpeg_idct_2x4 jRD2x4 +#define jpeg_idct_1x2 jRD1x2 +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Extern declarations for the forward and inverse DCT routines. */ + +EXTERN(void) jpeg_fdct_islow + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_ifast + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_float + JPP((FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_9x9 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_11x11 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_13x13 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_15x15 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); + +EXTERN(void) jpeg_idct_islow + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_ifast + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_float + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_9x9 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_11x11 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_13x13 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_15x15 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); + + +/* + * Macros for handling fixed-point arithmetic; these are used by many + * but not all of the DCT/IDCT modules. + * + * All values are expected to be of type INT32. + * Fractional constants are scaled left by CONST_BITS bits. + * CONST_BITS is defined within each module using these macros, + * and may differ from one module to the next. + */ + +#define ONE ((INT32) 1) +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. + * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, + * thus causing a lot of useless floating-point operations at run time. + */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * This macro is used only when the two inputs will actually be no more than + * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a + * full 32x32 multiply. This provides a useful speedup on many machines. + * Unfortunately there is no way to specify a 16x16->32 multiply portably + * in C, but some C compilers will do the right thing if you provide the + * correct combination of casts. + */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif + +#ifndef MULTIPLY16C16 /* default definition */ +#define MULTIPLY16C16(var,const) ((var) * (const)) +#endif + +/* Same except both inputs are variables. */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) +#endif + +#ifndef MULTIPLY16V16 /* default definition */ +#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) +#endif diff -Nru mame-0.144/src/lib/libjpeg/jddctmgr.c mame-0.145/src/lib/libjpeg/jddctmgr.c --- mame-0.144/src/lib/libjpeg/jddctmgr.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jddctmgr.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,384 @@ +/* + * jddctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the inverse-DCT management logic. + * This code selects a particular IDCT implementation to be used, + * and it performs related housekeeping chores. No code in this file + * is executed per IDCT step, only during output pass setup. + * + * Note that the IDCT routines are responsible for performing coefficient + * dequantization as well as the IDCT proper. This module sets up the + * dequantization multiplier table needed by the IDCT routine. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* + * The decompressor input side (jdinput.c) saves away the appropriate + * quantization table for each component at the start of the first scan + * involving that component. (This is necessary in order to correctly + * decode files that reuse Q-table slots.) + * When we are ready to make an output pass, the saved Q-table is converted + * to a multiplier table that will actually be used by the IDCT routine. + * The multiplier table contents are IDCT-method-dependent. To support + * application changes in IDCT method between scans, we can remake the + * multiplier tables if necessary. + * In buffered-image mode, the first output pass may occur before any data + * has been seen for some components, and thus before their Q-tables have + * been saved away. To handle this case, multiplier tables are preset + * to zeroes; the result of the IDCT will be a neutral gray level. + */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_inverse_dct pub; /* public fields */ + + /* This array contains the IDCT method code that each multiplier table + * is currently set up for, or -1 if it's not yet set up. + * The actual multiplier tables are pointed to by dct_table in the + * per-component comp_info structures. + */ + int cur_method[MAX_COMPONENTS]; +} my_idct_controller; + +typedef my_idct_controller * my_idct_ptr; + + +/* Allocated multiplier tables: big enough for any supported variant */ + +typedef union { + ISLOW_MULT_TYPE islow_array[DCTSIZE2]; +#ifdef DCT_IFAST_SUPPORTED + IFAST_MULT_TYPE ifast_array[DCTSIZE2]; +#endif +#ifdef DCT_FLOAT_SUPPORTED + FLOAT_MULT_TYPE float_array[DCTSIZE2]; +#endif +} multiplier_table; + + +/* The current scaled-IDCT routines require ISLOW-style multiplier tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef IDCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Prepare for an output pass. + * Here we select the proper IDCT routine for each component and build + * a matching multiplier table. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + my_idct_ptr idct = (my_idct_ptr) cinfo->idct; + int ci, i; + jpeg_component_info *compptr; + int method = 0; + inverse_DCT_method_ptr method_ptr = NULL; + JQUANT_TBL * qtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper IDCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef IDCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + method_ptr = jpeg_idct_1x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 2): + method_ptr = jpeg_idct_2x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 3): + method_ptr = jpeg_idct_3x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 4): + method_ptr = jpeg_idct_4x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 5): + method_ptr = jpeg_idct_5x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 6): + method_ptr = jpeg_idct_6x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 7): + method_ptr = jpeg_idct_7x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((9 << 8) + 9): + method_ptr = jpeg_idct_9x9; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 10): + method_ptr = jpeg_idct_10x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((11 << 8) + 11): + method_ptr = jpeg_idct_11x11; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 12): + method_ptr = jpeg_idct_12x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((13 << 8) + 13): + method_ptr = jpeg_idct_13x13; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 14): + method_ptr = jpeg_idct_14x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((15 << 8) + 15): + method_ptr = jpeg_idct_15x15; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 16): + method_ptr = jpeg_idct_16x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 8): + method_ptr = jpeg_idct_16x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 7): + method_ptr = jpeg_idct_14x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 6): + method_ptr = jpeg_idct_12x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 5): + method_ptr = jpeg_idct_10x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 4): + method_ptr = jpeg_idct_8x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 3): + method_ptr = jpeg_idct_6x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 2): + method_ptr = jpeg_idct_4x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 1): + method_ptr = jpeg_idct_2x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 16): + method_ptr = jpeg_idct_8x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 14): + method_ptr = jpeg_idct_7x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 12): + method_ptr = jpeg_idct_6x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 10): + method_ptr = jpeg_idct_5x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 8): + method_ptr = jpeg_idct_4x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 6): + method_ptr = jpeg_idct_3x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 4): + method_ptr = jpeg_idct_2x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((1 << 8) + 2): + method_ptr = jpeg_idct_1x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + method_ptr = jpeg_idct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + method_ptr = jpeg_idct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + method_ptr = jpeg_idct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + idct->pub.inverse_DCT[ci] = method_ptr; + /* Create multiplier table from quant table. + * However, we can skip this if the component is uninteresting + * or if we already built the table. Also, if no quant table + * has yet been saved for the component, we leave the + * multiplier table all-zero; we'll be reading zeroes from the + * coefficient controller's buffer anyway. + */ + if (! compptr->component_needed || idct->cur_method[ci] == method) + continue; + qtbl = compptr->quant_table; + if (qtbl == NULL) /* happens if no data yet for component */ + continue; + idct->cur_method[ci] = method; + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + { + /* For LL&M IDCT method, multipliers are equal to raw quantization + * coefficients, but are stored as ints to ensure access efficiency. + */ + ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; + for (i = 0; i < DCTSIZE2; i++) { + ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; + } + } + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * For integer operation, the multiplier table is to be scaled by + * IFAST_SCALE_BITS. + */ + IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + for (i = 0; i < DCTSIZE2; i++) { + ifmtbl[i] = (IFAST_MULT_TYPE) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-IFAST_SCALE_BITS); + } + } + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 1/8. + */ + FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fmtbl[i] = (FLOAT_MULT_TYPE) + ((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 0.125); + i++; + } + } + } + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize IDCT manager. + */ + +GLOBAL(void) +jinit_inverse_dct (j_decompress_ptr cinfo) +{ + my_idct_ptr idct; + int ci; + jpeg_component_info *compptr; + + idct = (my_idct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_idct_controller)); + cinfo->idct = (struct jpeg_inverse_dct *) idct; + idct->pub.start_pass = start_pass; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate and pre-zero a multiplier table for each component */ + compptr->dct_table = + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(multiplier_table)); + MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); + /* Mark multiplier table not yet set up for any method */ + idct->cur_method[ci] = -1; + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdhuff.c mame-0.145/src/lib/libjpeg/jdhuff.c --- mame-0.144/src/lib/libjpeg/jdhuff.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdhuff.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1541 @@ +/* + * jdhuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines. + * Both sequential and progressive modes are supported in this single module. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Derived data constructed for each Huffman table */ + +#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ + +typedef struct { + /* Basic tables: (element [0] of each array is unused) */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ + INT32 valoffset[17]; /* huffval[] offset for codes of length k */ + /* valoffset[k] = huffval[] index of 1st symbol of code length k, less + * the smallest code of length k; so given a code of length k, the + * corresponding symbol is huffval[code + valoffset[k]] + */ + + /* Link to public Huffman table (needed only in jpeg_huff_decode) */ + JHUFF_TBL *pub; + + /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of + * the input data stream. If the next Huffman code is no more + * than HUFF_LOOKAHEAD bits long, we can obtain its length and + * the corresponding symbol directly from these tables. + */ + int look_nbits[1< 32 bits on your machine, and shifting/masking longs is + * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE + * appropriately should be a win. Unfortunately we can't define the size + * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) + * because not all machines measure sizeof in 8-bit bytes. + */ + +typedef struct { /* Bitreading state saved across MCUs */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ +} bitread_perm_state; + +typedef struct { /* Bitreading working state within an MCU */ + /* Current data source location */ + /* We need a copy, rather than munging the original, in case of suspension */ + const JOCTET * next_input_byte; /* => next byte to read from source */ + size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ + /* Bit input buffer --- note these values are kept in register variables, + * not in this struct, inside the inner loops. + */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ + /* Pointer needed by jpeg_fill_bit_buffer. */ + j_decompress_ptr cinfo; /* back link to decompress master record */ +} bitread_working_state; + +/* Macros to declare and load/save bitread local variables. */ +#define BITREAD_STATE_VARS \ + register bit_buf_type get_buffer; \ + register int bits_left; \ + bitread_working_state br_state + +#define BITREAD_LOAD_STATE(cinfop,permstate) \ + br_state.cinfo = cinfop; \ + br_state.next_input_byte = cinfop->src->next_input_byte; \ + br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ + get_buffer = permstate.get_buffer; \ + bits_left = permstate.bits_left; + +#define BITREAD_SAVE_STATE(cinfop,permstate) \ + cinfop->src->next_input_byte = br_state.next_input_byte; \ + cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ + permstate.get_buffer = get_buffer; \ + permstate.bits_left = bits_left + +/* + * These macros provide the in-line portion of bit fetching. + * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer + * before using GET_BITS, PEEK_BITS, or DROP_BITS. + * The variables get_buffer and bits_left are assumed to be locals, + * but the state struct might not be (jpeg_huff_decode needs this). + * CHECK_BIT_BUFFER(state,n,action); + * Ensure there are N bits in get_buffer; if suspend, take action. + * val = GET_BITS(n); + * Fetch next N bits. + * val = PEEK_BITS(n); + * Fetch next N bits without removing them from the buffer. + * DROP_BITS(n); + * Discard next N bits. + * The value N should be a simple variable, not an expression, because it + * is evaluated multiple times. + */ + +#define CHECK_BIT_BUFFER(state,nbits,action) \ + { if (bits_left < (nbits)) { \ + if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ + { action; } \ + get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } + +#define GET_BITS(nbits) \ + (((int) (get_buffer >> (bits_left -= (nbits)))) & BIT_MASK(nbits)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & BIT_MASK(nbits)) + +#define DROP_BITS(nbits) \ + (bits_left -= (nbits)) + + +/* + * Code for extracting next Huffman-coded symbol from input bit stream. + * Again, this is time-critical and we make the main paths be macros. + * + * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits + * without looping. Usually, more than 95% of the Huffman codes will be 8 + * or fewer bits long. The few overlength codes are handled with a loop, + * which need not be inline code. + * + * Notes about the HUFF_DECODE macro: + * 1. Near the end of the data segment, we may fail to get enough bits + * for a lookahead. In that case, we do it the hard way. + * 2. If the lookahead table contains no entry, the next code must be + * more than HUFF_LOOKAHEAD bits long. + * 3. jpeg_huff_decode returns -1 if forced to suspend. + */ + +#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ +{ register int nb, look; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + nb = 1; goto slowlabel; \ + } \ + } \ + look = PEEK_BITS(HUFF_LOOKAHEAD); \ + if ((nb = htbl->look_nbits[look]) != 0) { \ + DROP_BITS(nb); \ + result = htbl->look_sym[look]; \ + } else { \ + nb = HUFF_LOOKAHEAD+1; \ +slowlabel: \ + if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ + { failaction; } \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + } \ +} + + +/* + * Expanded entropy decoder object for Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).EOBRUN = (src).EOBRUN, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + boolean insufficient_data; /* set TRUE after emitting warning */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Following two fields used only in progressive mode */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ + + /* Following fields used only in sequential mode */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Precalculated info set up by start_pass for use in decode_mcu: */ + + /* Pointers to derived tables to be used for each block within an MCU */ + d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + /* Whether we care about the DC and AC coefficient values for each block */ + int coef_limit[D_MAX_BLOCKS_IN_MCU]; +} huff_entropy_decoder; + +typedef huff_entropy_decoder * huff_entropy_ptr; + + +static const int jpeg_zigzag_order[8][8] = { + { 0, 1, 5, 6, 14, 15, 27, 28 }, + { 2, 4, 7, 13, 16, 26, 29, 42 }, + { 3, 8, 12, 17, 25, 30, 41, 43 }, + { 9, 11, 18, 24, 31, 40, 44, 53 }, + { 10, 19, 23, 32, 39, 45, 52, 54 }, + { 20, 22, 33, 38, 46, 51, 55, 60 }, + { 21, 34, 37, 47, 50, 56, 59, 61 }, + { 35, 36, 48, 49, 57, 58, 62, 63 } +}; + +static const int jpeg_zigzag_order7[7][7] = { + { 0, 1, 5, 6, 14, 15, 27 }, + { 2, 4, 7, 13, 16, 26, 28 }, + { 3, 8, 12, 17, 25, 29, 38 }, + { 9, 11, 18, 24, 30, 37, 39 }, + { 10, 19, 23, 31, 36, 40, 45 }, + { 20, 22, 32, 35, 41, 44, 46 }, + { 21, 33, 34, 42, 43, 47, 48 } +}; + +static const int jpeg_zigzag_order6[6][6] = { + { 0, 1, 5, 6, 14, 15 }, + { 2, 4, 7, 13, 16, 25 }, + { 3, 8, 12, 17, 24, 26 }, + { 9, 11, 18, 23, 27, 32 }, + { 10, 19, 22, 28, 31, 33 }, + { 20, 21, 29, 30, 34, 35 } +}; + +static const int jpeg_zigzag_order5[5][5] = { + { 0, 1, 5, 6, 14 }, + { 2, 4, 7, 13, 15 }, + { 3, 8, 12, 16, 21 }, + { 9, 11, 17, 20, 22 }, + { 10, 18, 19, 23, 24 } +}; + +static const int jpeg_zigzag_order4[4][4] = { + { 0, 1, 5, 6 }, + { 2, 4, 7, 12 }, + { 3, 8, 11, 13 }, + { 9, 10, 14, 15 } +}; + +static const int jpeg_zigzag_order3[3][3] = { + { 0, 1, 5 }, + { 2, 4, 6 }, + { 3, 7, 8 } +}; + +static const int jpeg_zigzag_order2[2][2] = { + { 0, 1 }, + { 2, 3 } +}; + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + */ + +LOCAL(void) +jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, + d_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + d_derived_tbl *dtbl; + int p, i, l, si, numsymbols; + int lookbits, ctr; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (d_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(d_derived_tbl)); + dtbl = *pdtbl; + dtbl->pub = htbl; /* fill in back link */ + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + numsymbols = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure F.15: generate decoding tables for bit-sequential decoding */ + + p = 0; + for (l = 1; l <= 16; l++) { + if (htbl->bits[l]) { + /* valoffset[l] = huffval[] index of 1st symbol of code length l, + * minus the minimum code of length l + */ + dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; + p += htbl->bits[l]; + dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ + } else { + dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ + } + } + dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ + + /* Compute lookahead tables to speed up decoding. + * First we set all the table entries to 0, indicating "too long"; + * then we iterate through the Huffman codes that are short enough and + * fill in all the entries that correspond to bit sequences starting + * with that code. + */ + + MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); + + p = 0; + for (l = 1; l <= HUFF_LOOKAHEAD; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { + /* l = current code's length, p = its index in huffcode[] & huffval[]. */ + /* Generate left-justified code followed by all possible bit sequences */ + lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); + for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { + dtbl->look_nbits[lookbits] = l; + dtbl->look_sym[lookbits] = htbl->huffval[p]; + lookbits++; + } + } + } + + /* Validate symbols as being reasonable. + * For AC tables, we make no check, but accept all byte values 0..255. + * For DC tables, we require the symbols to be in range 0..15. + * (Tighter bounds could be applied depending on the data depth and mode, + * but this is sufficient to ensure safe decoding.) + */ + if (isDC) { + for (i = 0; i < numsymbols; i++) { + int sym = htbl->huffval[i]; + if (sym < 0 || sym > 15) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + } + } +} + + +/* + * Out-of-line code for bit fetching. + * Note: current values of get_buffer and bits_left are passed as parameters, + * but are returned in the corresponding fields of the state struct. + * + * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width + * of get_buffer to be used. (On machines with wider words, an even larger + * buffer could be used.) However, on some machines 32-bit shifts are + * quite slow and take time proportional to the number of places shifted. + * (This is true with most PC compilers, for instance.) In this case it may + * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the + * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. + */ + +#ifdef SLOW_SHIFT_32 +#define MIN_GET_BITS 15 /* minimum allowable value */ +#else +#define MIN_GET_BITS (BIT_BUF_SIZE-7) +#endif + + +LOCAL(boolean) +jpeg_fill_bit_buffer (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + int nbits) +/* Load up the bit buffer to a depth of at least nbits */ +{ + /* Copy heavily used state fields into locals (hopefully registers) */ + register const JOCTET * next_input_byte = state->next_input_byte; + register size_t bytes_in_buffer = state->bytes_in_buffer; + j_decompress_ptr cinfo = state->cinfo; + + /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ + /* (It is assumed that no request will be for more than that many bits.) */ + /* We fail to do so only if we hit a marker or are forced to suspend. */ + + if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ + while (bits_left < MIN_GET_BITS) { + register int c; + + /* Attempt to read a byte */ + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + + /* If it's 0xFF, check and discard stuffed zero byte */ + if (c == 0xFF) { + /* Loop here to discard any padding FF's on terminating marker, + * so that we can save a valid unread_marker value. NOTE: we will + * accept multiple FF's followed by a 0 as meaning a single FF data + * byte. This data pattern is not valid according to the standard. + */ + do { + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + } while (c == 0xFF); + + if (c == 0) { + /* Found FF/00, which represents an FF data byte */ + c = 0xFF; + } else { + /* Oops, it's actually a marker indicating end of compressed data. + * Save the marker code for later use. + * Fine point: it might appear that we should save the marker into + * bitread working state, not straight into permanent state. But + * once we have hit a marker, we cannot need to suspend within the + * current MCU, because we will read no more bytes from the data + * source. So it is OK to update permanent state right away. + */ + cinfo->unread_marker = c; + /* See if we need to insert some fake zero bits. */ + goto no_more_bytes; + } + } + + /* OK, load c into get_buffer */ + get_buffer = (get_buffer << 8) | c; + bits_left += 8; + } /* end while */ + } else { + no_more_bytes: + /* We get here if we've read the marker that terminates the compressed + * data segment. There should be enough bits in the buffer register + * to satisfy the request; if so, no problem. + */ + if (nbits > bits_left) { + /* Uh-oh. Report corrupted data to user and stuff zeroes into + * the data stream, so that we can produce some kind of image. + * We use a nonvolatile flag to ensure that only one warning message + * appears per data segment. + */ + if (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) { + WARNMS(cinfo, JWRN_HIT_MARKER); + ((huff_entropy_ptr) cinfo->entropy)->insufficient_data = TRUE; + } + /* Fill the buffer with zero bits */ + get_buffer <<= MIN_GET_BITS - bits_left; + bits_left = MIN_GET_BITS; + } + } + + /* Unload the local registers */ + state->next_input_byte = next_input_byte; + state->bytes_in_buffer = bytes_in_buffer; + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + return TRUE; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and sub will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define BIT_MASK(nbits) ((1<<(nbits))-1) +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) - ((1<<(s))-1) : (x)) + +#else + +#define BIT_MASK(nbits) bmask[nbits] +#define HUFF_EXTEND(x,s) ((x) <= bmask[(s) - 1] ? (x) - bmask[s] : (x)) + +static const int bmask[16] = /* bmask[n] is mask for n rightmost bits */ + { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF }; + +#endif /* AVOID_TABLES */ + + +/* + * Out-of-line code for Huffman code decoding. + */ + +LOCAL(int) +jpeg_huff_decode (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + d_derived_tbl * htbl, int min_bits) +{ + register int l = min_bits; + register INT32 code; + + /* HUFF_DECODE has determined that the code is at least min_bits */ + /* bits long, so fetch that many bits in one swoop. */ + + CHECK_BIT_BUFFER(*state, l, return -1); + code = GET_BITS(l); + + /* Collect the rest of the Huffman code one bit at a time. */ + /* This is per Figure F.16 in the JPEG spec. */ + + while (code > htbl->maxcode[l]) { + code <<= 1; + CHECK_BIT_BUFFER(*state, 1, return -1); + code |= GET_BITS(1); + l++; + } + + /* Unload the local registers */ + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + /* With garbage input we may reach the sentinel value l = 17. */ + + if (l > 16) { + WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); + return 0; /* fake a zero as the safest result */ + } + + return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; +} + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Re-init EOB run count, too */ + entropy->saved.EOBRUN = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Huffman MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + * (Wholesale zeroing is usually a little faster than retail...) + * + * We return FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * spectral selection, since we'll just re-assign them on the next call. + * Successive approximation AC refinement has to be more careful, however.) + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int Al = cinfo->Al; + register int s, r; + int blkn, ci; + JBLOCKROW block; + BITREAD_STATE_VARS; + savable_state state; + d_derived_tbl * tbl; + jpeg_component_info * compptr; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + tbl = entropy->derived_tbls[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, tbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (s << Al); + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Load up working state. + * We can avoid loading/saving bitread state if in an EOB run. + */ + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + + if (EOBRUN > 0) /* if it's a band of zeroes... */ + EOBRUN--; /* ...process it now (we do nothing) */ + else { + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + for (k = cinfo->Ss; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, return FALSE, label2); + r = s >> 4; + s &= 15; + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (s << Al); + } else { + if (r == 15) { /* ZRL */ + k += 15; /* skip 15 zeroes in band */ + } else { /* EOBr, run length is 2^r + appended bits */ + EOBRUN = 1 << r; + if (r) { /* EOBr, r > 0 */ + CHECK_BIT_BUFFER(br_state, r, return FALSE); + r = GET_BITS(r); + EOBRUN += r; + } + EOBRUN--; /* this band is processed at this moment */ + break; /* force end-of-band */ + } + } + } + + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + } + + /* Completed MCU, so update state */ + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int blkn; + JBLOCKROW block; + BITREAD_STATE_VARS; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* Not worth the cycles to check insufficient_data here, + * since we will not change the data anyway if we read zeroes. + */ + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* Encoded data is simply the next bit of the two's-complement DC value */ + CHECK_BIT_BUFFER(br_state, 1, return FALSE); + if (GET_BITS(1)) + (*block)[0] |= p1; + /* Note: since we use |=, repeating the assignment later is safe */ + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, p1, m1; + const int * natural_order; + JBLOCKROW block; + JCOEFPTR thiscoef; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + int num_newnz; + int newnz_pos[DCTSIZE2]; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, don't modify the MCU. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + natural_order = cinfo->natural_order; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + /* If we are forced to suspend, we must undo the assignments to any newly + * nonzero coefficients in the block, because otherwise we'd get confused + * next time about which coefficients were already nonzero. + * But we need not undo addition of bits to already-nonzero coefficients; + * instead, we can test the current bit to see if we already did it. + */ + num_newnz = 0; + + /* initialize coefficient loop counter to start of band */ + k = cinfo->Ss; + + if (EOBRUN == 0) { + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, goto undoit, label3); + r = s >> 4; + s &= 15; + if (s) { + if (s != 1) /* size of new coef should always be 1 */ + WARNMS(cinfo, JWRN_HUFF_BAD_CODE); + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) + s = p1; /* newly nonzero coef is positive */ + else + s = m1; /* newly nonzero coef is negative */ + } else { + if (r != 15) { + EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ + if (r) { + CHECK_BIT_BUFFER(br_state, r, goto undoit); + r = GET_BITS(r); + EOBRUN += r; + } + break; /* rest of block is handled by EOB logic */ + } + /* note s = 0 for processing ZRL */ + } + /* Advance over already-nonzero coefs and r still-zero coefs, + * appending correction bits to the nonzeroes. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + do { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } else { + if (--r < 0) + break; /* reached target zero coefficient */ + } + k++; + } while (k <= Se); + if (s) { + int pos = natural_order[k]; + /* Output newly nonzero coefficient */ + (*block)[pos] = (JCOEF) s; + /* Remember its position in case we have to suspend */ + newnz_pos[num_newnz++] = pos; + } + } + } + + if (EOBRUN > 0) { + /* Scan any remaining coefficient positions after the end-of-band + * (the last newly nonzero coefficient, if any). Append a correction + * bit to each already-nonzero coefficient. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + for (; k <= Se; k++) { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } + } + /* Count one block completed in EOB run */ + EOBRUN--; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; + +undoit: + /* Re-zero any output coefficients that we made newly nonzero */ + while (num_newnz > 0) + (*block)[newnz_pos[--num_newnz]] = 0; + + return FALSE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * partial blocks. + */ + +METHODDEF(boolean) +decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + const int * natural_order; + int Se, blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + natural_order = cinfo->natural_order; + Se = cinfo->lim_Se; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in natural_order[] will save us + * if k > Se, which could happen if the data is corrupted. + */ + (*block)[natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * full-size blocks. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in jpeg_natural_order[] will save us + * if k >= DCTSIZE2, which could happen if the data is corrupted. + */ + (*block)[jpeg_natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, blkn, tbl, i; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + /* Arguably the maximum Al value should be less than 13 for 8-bit precision, + * but the spec doesn't say so, and we try to be liberal about what we + * accept. Note: large Al values could result in out-of-range DC + * coefficients during early scans, leading to bizarre displays due to + * overflows in the IDCT math. But we won't crash. + */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present, and compute derived tables. + * We may build same derived table more than once, but it's not expensive. + */ + if (cinfo->Ss == 0) { + if (cinfo->Ah == 0) { /* DC refinement needs no table */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->derived_tbls[tbl]); + } + } else { + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->derived_tbls[tbl]); + /* remember the single active table */ + entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize private state variables */ + entropy->saved.EOBRUN = 0; + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning because + * there are some baseline files out there with all zeroes in these bytes. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + ((cinfo->is_baseline || cinfo->Se < DCTSIZE2) && + cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + /* Select MCU decoding routine */ + /* We retain the hard-coded case for full-size blocks. + * This is not necessary, but it appears that this version is slightly + * more performant in the given implementation. + * With an improved implementation we would prefer a single optimized + * function. + */ + if (cinfo->lim_Se != DCTSIZE2-1) + entropy->pub.decode_mcu = decode_mcu_sub; + else + entropy->pub.decode_mcu = decode_mcu; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + if (cinfo->lim_Se) { /* AC needs no table when not present */ + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Precalculate decoding info for each block in an MCU of this scan */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Precalculate which table to use for each block */ + entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; + entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; + /* Decide whether we really care about the coefficient values */ + if (compptr->component_needed) { + ci = compptr->DCT_v_scaled_size; + i = compptr->DCT_h_scaled_size; + switch (cinfo->lim_Se) { + case (1*1-1): + entropy->coef_limit[blkn] = 1; + break; + case (2*2-1): + if (ci <= 0 || ci > 2) ci = 2; + if (i <= 0 || i > 2) i = 2; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1]; + break; + case (3*3-1): + if (ci <= 0 || ci > 3) ci = 3; + if (i <= 0 || i > 3) i = 3; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1]; + break; + case (4*4-1): + if (ci <= 0 || ci > 4) ci = 4; + if (i <= 0 || i > 4) i = 4; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1]; + break; + case (5*5-1): + if (ci <= 0 || ci > 5) ci = 5; + if (i <= 0 || i > 5) i = 5; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1]; + break; + case (6*6-1): + if (ci <= 0 || ci > 6) ci = 6; + if (i <= 0 || i > 6) i = 6; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1]; + break; + case (7*7-1): + if (ci <= 0 || ci > 7) ci = 7; + if (i <= 0 || i > 7) i = 7; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1]; + break; + default: + if (ci <= 0 || ci > 8) ci = 8; + if (i <= 0 || i > 8) i = 8; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1]; + break; + } + } else { + entropy->coef_limit[blkn] = 0; + } + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_huff_decoder; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + } else { + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + } + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdinput.c mame-0.145/src/lib/libjpeg/jdinput.c --- mame-0.144/src/lib/libjpeg/jdinput.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdinput.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,661 @@ +/* + * jdinput.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input control logic for the JPEG decompressor. + * These routines are concerned with controlling the decompressor's input + * processing (marker reading and coefficient decoding). The actual input + * reading is done in jdmarker.c, jdhuff.c, and jdarith.c. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_input_controller pub; /* public fields */ + + int inheaders; /* Nonzero until first SOS is reached */ +} my_input_controller; + +typedef my_input_controller * my_inputctl_ptr; + + +/* Forward declarations */ +METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); + + +/* + * Routines to calculate various quantities related to the size of the image. + */ + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_core_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for transcoding and full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { + /* Provide 1/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { + /* Provide 2/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) { + /* Provide 3/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { + /* Provide 4/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) { + /* Provide 5/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) { + /* Provide 6/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) { + /* Provide 7/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { + /* Provide 8/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) { + /* Provide 9/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) { + /* Provide 10/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) { + /* Provide 11/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) { + /* Provide 12/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) { + /* Provide 13/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) { + /* Provide 14/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) { + /* Provide 15/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide 16/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + + /* Recompute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +initial_setup (j_decompress_ptr cinfo) +/* Called once, when first SOS marker is reached */ +{ + int ci; + jpeg_component_info *compptr; + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Derive block_size, natural_order, and lim_Se */ + if (cinfo->is_baseline || (cinfo->progressive_mode && + cinfo->comps_in_scan)) { /* no pseudo SOS marker */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + } else + switch (cinfo->Se) { + case (1*1-1): + cinfo->block_size = 1; + cinfo->natural_order = jpeg_natural_order; /* not needed */ + cinfo->lim_Se = cinfo->Se; + break; + case (2*2-1): + cinfo->block_size = 2; + cinfo->natural_order = jpeg_natural_order2; + cinfo->lim_Se = cinfo->Se; + break; + case (3*3-1): + cinfo->block_size = 3; + cinfo->natural_order = jpeg_natural_order3; + cinfo->lim_Se = cinfo->Se; + break; + case (4*4-1): + cinfo->block_size = 4; + cinfo->natural_order = jpeg_natural_order4; + cinfo->lim_Se = cinfo->Se; + break; + case (5*5-1): + cinfo->block_size = 5; + cinfo->natural_order = jpeg_natural_order5; + cinfo->lim_Se = cinfo->Se; + break; + case (6*6-1): + cinfo->block_size = 6; + cinfo->natural_order = jpeg_natural_order6; + cinfo->lim_Se = cinfo->Se; + break; + case (7*7-1): + cinfo->block_size = 7; + cinfo->natural_order = jpeg_natural_order7; + cinfo->lim_Se = cinfo->Se; + break; + case (8*8-1): + cinfo->block_size = 8; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (9*9-1): + cinfo->block_size = 9; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (10*10-1): + cinfo->block_size = 10; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (11*11-1): + cinfo->block_size = 11; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (12*12-1): + cinfo->block_size = 12; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (13*13-1): + cinfo->block_size = 13; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (14*14-1): + cinfo->block_size = 14; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (15*15-1): + cinfo->block_size = 15; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (16*16-1): + cinfo->block_size = 16; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + default: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + break; + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. + * In the full decompressor, + * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c; + * but in the transcoder, + * jpeg_calc_output_dimensions is not used, so we must do it here. + */ + cinfo->min_DCT_h_scaled_size = cinfo->block_size; + cinfo->min_DCT_v_scaled_size = cinfo->block_size; + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->block_size; + compptr->DCT_v_scaled_size = cinfo->block_size; + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + /* downsampled_width and downsampled_height will also be overridden by + * jdmaster.c if we are doing full decompression. The transcoder library + * doesn't use these values, but the calling application might. + */ + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) cinfo->max_h_samp_factor); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) cinfo->max_v_samp_factor); + /* Mark component needed, until color conversion says otherwise */ + compptr->component_needed = TRUE; + /* Mark no quantization table yet saved for component */ + compptr->quant_table = NULL; + } + + /* Compute number of fully interleaved MCU rows. */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + /* Decide whether file contains multiple scans */ + if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) + cinfo->inputctl->has_multiple_scans = TRUE; + else + cinfo->inputctl->has_multiple_scans = FALSE; +} + + +LOCAL(void) +per_scan_setup (j_decompress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } +} + + +/* + * Save away a copy of the Q-table referenced by each component present + * in the current scan, unless already saved during a prior scan. + * + * In a multiple-scan JPEG file, the encoder could assign different components + * the same Q-table slot number, but change table definitions between scans + * so that each component uses a different Q-table. (The IJG encoder is not + * currently capable of doing this, but other encoders might.) Since we want + * to be able to dequantize all the components at the end of the file, this + * means that we have to save away the table actually used for each component. + * We do this by copying the table at the start of the first scan containing + * the component. + * The JPEG spec prohibits the encoder from changing the contents of a Q-table + * slot between scans of a component using that slot. If the encoder does so + * anyway, this decoder will simply use the Q-table values that were current + * at the start of the first scan for the component. + * + * The decompressor output side looks only at the saved quant tables, + * not at the current Q-table slots. + */ + +LOCAL(void) +latch_quant_tables (j_decompress_ptr cinfo) +{ + int ci, qtblno; + jpeg_component_info *compptr; + JQUANT_TBL * qtbl; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* No work if we already saved Q-table for this component */ + if (compptr->quant_table != NULL) + continue; + /* Make sure specified quantization table is present */ + qtblno = compptr->quant_tbl_no; + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + /* OK, save away the quantization table */ + qtbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(JQUANT_TBL)); + MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); + compptr->quant_table = qtbl; + } +} + + +/* + * Initialize the input modules to read a scan of compressed data. + * The first call to this is done by jdmaster.c after initializing + * the entire decompressor (during jpeg_start_decompress). + * Subsequent calls come from consume_markers, below. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + per_scan_setup(cinfo); + latch_quant_tables(cinfo); + (*cinfo->entropy->start_pass) (cinfo); + (*cinfo->coef->start_input_pass) (cinfo); + cinfo->inputctl->consume_input = cinfo->coef->consume_data; +} + + +/* + * Finish up after inputting a compressed-data scan. + * This is called by the coefficient controller after it's read all + * the expected data of the scan. + */ + +METHODDEF(void) +finish_input_pass (j_decompress_ptr cinfo) +{ + cinfo->inputctl->consume_input = consume_markers; +} + + +/* + * Read JPEG markers before, between, or after compressed-data scans. + * Change state as necessary when a new scan is reached. + * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * The consume_input method pointer points either here or to the + * coefficient controller's consume_data routine, depending on whether + * we are reading a compressed data segment or inter-segment markers. + * + * Note: This function should NOT return a pseudo SOS marker (with zero + * component number) to the caller. A pseudo marker received by + * read_markers is processed and then skipped for other markers. + */ + +METHODDEF(int) +consume_markers (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + int val; + + if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ + return JPEG_REACHED_EOI; + + for (;;) { /* Loop to pass pseudo SOS marker */ + val = (*cinfo->marker->read_markers) (cinfo); + + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + if (inputctl->inheaders == 1) + initial_setup(cinfo); + if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */ + inputctl->inheaders = 2; + break; + } + inputctl->inheaders = 0; + /* Note: start_input_pass must be called by jdmaster.c + * before any more input can be consumed. jdapimin.c is + * responsible for enforcing this sequencing. + */ + } else { /* 2nd or later SOS marker */ + if (! inputctl->pub.has_multiple_scans) + ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ + if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */ + break; + start_input_pass(cinfo); + } + return val; + case JPEG_REACHED_EOI: /* Found EOI */ + inputctl->pub.eoi_reached = TRUE; + if (inputctl->inheaders) { /* Tables-only datastream, apparently */ + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_NO_SOS); + } else { + /* Prevent infinite loop in coef ctlr's decompress_data routine + * if user set output_scan_number larger than number of scans. + */ + if (cinfo->output_scan_number > cinfo->input_scan_number) + cinfo->output_scan_number = cinfo->input_scan_number; + } + return val; + case JPEG_SUSPENDED: + return val; + default: + return val; + } + } +} + + +/* + * Reset state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + + inputctl->pub.consume_input = consume_markers; + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = 1; + /* Reset other modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->marker->reset_marker_reader) (cinfo); + /* Reset progression state -- would be cleaner if entropy decoder did this */ + cinfo->coef_bits = NULL; +} + + +/* + * Initialize the input controller module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl; + + /* Create subobject in permanent pool */ + inputctl = (my_inputctl_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_input_controller)); + cinfo->inputctl = (struct jpeg_input_controller *) inputctl; + /* Initialize method pointers */ + inputctl->pub.consume_input = consume_markers; + inputctl->pub.reset_input_controller = reset_input_controller; + inputctl->pub.start_input_pass = start_input_pass; + inputctl->pub.finish_input_pass = finish_input_pass; + /* Initialize state: can't use reset_input_controller since we don't + * want to try to reset other modules yet. + */ + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = 1; +} diff -Nru mame-0.144/src/lib/libjpeg/jdmainct.c mame-0.145/src/lib/libjpeg/jdmainct.c --- mame-0.144/src/lib/libjpeg/jdmainct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdmainct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,512 @@ +/* + * jdmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for decompression. + * The main buffer lies between the JPEG decompressor proper and the + * post-processor; it holds downsampled data in the JPEG colorspace. + * + * Note that this code is bypassed in raw-data mode, since the application + * supplies the equivalent of the main buffer in that case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * In the current system design, the main buffer need never be a full-image + * buffer; any full-height buffers will be found inside the coefficient or + * postprocessing controllers. Nonetheless, the main controller is not + * trivial. Its responsibility is to provide context rows for upsampling/ + * rescaling, and doing this in an efficient fashion is a bit tricky. + * + * Postprocessor input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. (We require DCT_scaled_size values to be + * chosen such that these numbers are integers. In practice DCT_scaled_size + * values will likely be powers of two, so we actually have the stronger + * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) + * Upsampling will typically produce max_v_samp_factor pixel rows from each + * row group (times any additional scale factor that the upsampler is + * applying). + * + * The coefficient controller will deliver data to us one iMCU row at a time; + * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or + * exactly min_DCT_scaled_size row groups. (This amount of data corresponds + * to one row of MCUs when the image is fully interleaved.) Note that the + * number of sample rows varies across components, but the number of row + * groups does not. Some garbage sample rows may be included in the last iMCU + * row at the bottom of the image. + * + * Depending on the vertical scaling algorithm used, the upsampler may need + * access to the sample row(s) above and below its current input row group. + * The upsampler is required to set need_context_rows TRUE at global selection + * time if so. When need_context_rows is FALSE, this controller can simply + * obtain one iMCU row at a time from the coefficient controller and dole it + * out as row groups to the postprocessor. + * + * When need_context_rows is TRUE, this controller guarantees that the buffer + * passed to postprocessing contains at least one row group's worth of samples + * above and below the row group(s) being processed. Note that the context + * rows "above" the first passed row group appear at negative row offsets in + * the passed buffer. At the top and bottom of the image, the required + * context rows are manufactured by duplicating the first or last real sample + * row; this avoids having special cases in the upsampling inner loops. + * + * The amount of context is fixed at one row group just because that's a + * convenient number for this controller to work with. The existing + * upsamplers really only need one sample row of context. An upsampler + * supporting arbitrary output rescaling might wish for more than one row + * group of context when shrinking the image; tough, we don't handle that. + * (This is justified by the assumption that downsizing will be handled mostly + * by adjusting the DCT_scaled_size values, so that the actual scale factor at + * the upsample step needn't be much less than one.) + * + * To provide the desired context, we have to retain the last two row groups + * of one iMCU row while reading in the next iMCU row. (The last row group + * can't be processed until we have another row group for its below-context, + * and so we have to save the next-to-last group too for its above-context.) + * We could do this most simply by copying data around in our buffer, but + * that'd be very slow. We can avoid copying any data by creating a rather + * strange pointer structure. Here's how it works. We allocate a workspace + * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number + * of row groups per iMCU row). We create two sets of redundant pointers to + * the workspace. Labeling the physical row groups 0 to M+1, the synthesized + * pointer lists look like this: + * M+1 M-1 + * master pointer --> 0 master pointer --> 0 + * 1 1 + * ... ... + * M-3 M-3 + * M-2 M + * M-1 M+1 + * M M-2 + * M+1 M-1 + * 0 0 + * We read alternate iMCU rows using each master pointer; thus the last two + * row groups of the previous iMCU row remain un-overwritten in the workspace. + * The pointer lists are set up so that the required context rows appear to + * be adjacent to the proper places when we pass the pointer lists to the + * upsampler. + * + * The above pictures describe the normal state of the pointer lists. + * At top and bottom of the image, we diddle the pointer lists to duplicate + * the first or last sample row as necessary (this is cheaper than copying + * sample rows around). + * + * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that + * situation each iMCU row provides only one row group so the buffering logic + * must be different (eg, we must read two iMCU rows before we can emit the + * first row group). For now, we simply do not support providing context + * rows when min_DCT_scaled_size is 1. That combination seems unlikely to + * be worth providing --- if someone wants a 1/8th-size preview, they probably + * want it quick and dirty, so a context-free upsampler is sufficient. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_main_controller pub; /* public fields */ + + /* Pointer to allocated workspace (M or M+2 row groups). */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + + boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ + JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ + + /* Remaining fields are only used in the context case. */ + + /* These are the master pointers to the funny-order pointer lists. */ + JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ + + int whichptr; /* indicates which pointer set is now in use */ + int context_state; /* process_data state machine status */ + JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ + JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + +/* context_state values: */ +#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ +#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ +#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +METHODDEF(void) process_data_context_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) process_data_crank_post + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#endif + + +LOCAL(void) +alloc_funny_pointers (j_decompress_ptr cinfo) +/* Allocate space for the funny pointer lists. + * This is done only once, not once per pass. + */ +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + int ci, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + /* Get top-level space for component array pointers. + * We alloc both arrays with one call to save a few cycles. + */ + mymain->xbuffer[0] = (JSAMPIMAGE) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); + mymain->xbuffer[1] = mymain->xbuffer[0] + cinfo->num_components; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + /* Get space for pointer lists --- M+4 row groups in each list. + * We alloc both pointer lists with one call to save a few cycles. + */ + xbuf = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); + xbuf += rgroup; /* want one row group at negative offsets */ + mymain->xbuffer[0][ci] = xbuf; + xbuf += rgroup * (M + 4); + mymain->xbuffer[1][ci] = xbuf; + } +} + + +LOCAL(void) +make_funny_pointers (j_decompress_ptr cinfo) +/* Create the funny pointer lists discussed in the comments above. + * The actual workspace is already allocated (in main->buffer), + * and the space for the pointer lists is allocated too. + * This routine just fills in the curiously ordered lists. + * This will be repeated at the beginning of each pass. + */ +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY buf, xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = mymain->xbuffer[0][ci]; + xbuf1 = mymain->xbuffer[1][ci]; + /* First copy the workspace pointers as-is */ + buf = mymain->buffer[ci]; + for (i = 0; i < rgroup * (M + 2); i++) { + xbuf0[i] = xbuf1[i] = buf[i]; + } + /* In the second list, put the last four row groups in swapped order */ + for (i = 0; i < rgroup * 2; i++) { + xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; + xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; + } + /* The wraparound pointers at top and bottom will be filled later + * (see set_wraparound_pointers, below). Initially we want the "above" + * pointers to duplicate the first actual data line. This only needs + * to happen in xbuffer[0]. + */ + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[0]; + } + } +} + + +LOCAL(void) +set_wraparound_pointers (j_decompress_ptr cinfo) +/* Set up the "wraparound" pointers at top and bottom of the pointer lists. + * This changes the pointer list state from top-of-image to the normal state. + */ +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_v_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = mymain->xbuffer[0][ci]; + xbuf1 = mymain->xbuffer[1][ci]; + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; + xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; + xbuf0[rgroup*(M+2) + i] = xbuf0[i]; + xbuf1[rgroup*(M+2) + i] = xbuf1[i]; + } + } +} + + +LOCAL(void) +set_bottom_pointers (j_decompress_ptr cinfo) +/* Change the pointer lists to duplicate the last sample row at the bottom + * of the image. whichptr indicates which xbuffer holds the final iMCU row. + * Also sets rowgroups_avail to indicate number of nondummy row groups in row. + */ +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + int ci, i, rgroup, iMCUheight, rows_left; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Count sample rows in one iMCU row and in one row group */ + iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size; + /* Count nondummy sample rows remaining for this component */ + rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); + if (rows_left == 0) rows_left = iMCUheight; + /* Count nondummy row groups. Should get same answer for each component, + * so we need only do it once. + */ + if (ci == 0) { + mymain->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); + } + /* Duplicate the last real sample row rgroup*2 times; this pads out the + * last partial rowgroup and ensures at least one full rowgroup of context. + */ + xbuf = mymain->xbuffer[mymain->whichptr][ci]; + for (i = 0; i < rgroup * 2; i++) { + xbuf[rows_left + i] = xbuf[rows_left-1]; + } + } +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->upsample->need_context_rows) { + mymain->pub.process_data = process_data_context_main; + make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ + mymain->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ + mymain->context_state = CTX_PREPARE_FOR_IMCU; + mymain->iMCU_row_ctr = 0; + } else { + /* Simple case with no context needed */ + mymain->pub.process_data = process_data_simple_main; + } + mymain->buffer_full = FALSE; /* Mark buffer empty */ + mymain->rowgroup_ctr = 0; + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_CRANK_DEST: + /* For last pass of 2-pass quantization, just crank the postprocessor */ + mymain->pub.process_data = process_data_crank_post; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This handles the simple case where no context is required. + */ + +METHODDEF(void) +process_data_simple_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + JDIMENSION rowgroups_avail; + + /* Read input data if we haven't filled the main buffer yet */ + if (! mymain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, mymain->buffer)) + return; /* suspension forced, can do nothing more */ + mymain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + } + + /* There are always min_DCT_scaled_size row groups in an iMCU row. */ + rowgroups_avail = (JDIMENSION) cinfo->min_DCT_v_scaled_size; + /* Note: at the bottom of the image, we may pass extra garbage row groups + * to the postprocessor. The postprocessor has to check for bottom + * of image anyway (at row resolution), so no point in us doing it too. + */ + + /* Feed the postprocessor */ + (*cinfo->post->post_process_data) (cinfo, mymain->buffer, + &mymain->rowgroup_ctr, rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + + /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ + if (mymain->rowgroup_ctr >= rowgroups_avail) { + mymain->buffer_full = FALSE; + mymain->rowgroup_ctr = 0; + } +} + + +/* + * Process some data. + * This handles the case where context rows must be provided. + */ + +METHODDEF(void) +process_data_context_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr mymain = (my_main_ptr) cinfo->main; + + /* Read input data if we haven't filled the main buffer yet */ + if (! mymain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, + mymain->xbuffer[mymain->whichptr])) + return; /* suspension forced, can do nothing more */ + mymain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + mymain->iMCU_row_ctr++; /* count rows received */ + } + + /* Postprocessor typically will not swallow all the input data it is handed + * in one call (due to filling the output buffer first). Must be prepared + * to exit and restart. This switch lets us keep track of how far we got. + * Note that each case falls through to the next on successful completion. + */ + switch (mymain->context_state) { + case CTX_POSTPONED_ROW: + /* Call postprocessor using previously set pointers for postponed row */ + (*cinfo->post->post_process_data) (cinfo, mymain->xbuffer[mymain->whichptr], + &mymain->rowgroup_ctr, mymain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (mymain->rowgroup_ctr < mymain->rowgroups_avail) + return; /* Need to suspend */ + mymain->context_state = CTX_PREPARE_FOR_IMCU; + if (*out_row_ctr >= out_rows_avail) + return; /* Postprocessor exactly filled output buf */ + /*FALLTHROUGH*/ + case CTX_PREPARE_FOR_IMCU: + /* Prepare to process first M-1 row groups of this iMCU row */ + mymain->rowgroup_ctr = 0; + mymain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1); + /* Check for bottom of image: if so, tweak pointers to "duplicate" + * the last sample row, and adjust rowgroups_avail to ignore padding rows. + */ + if (mymain->iMCU_row_ctr == cinfo->total_iMCU_rows) + set_bottom_pointers(cinfo); + mymain->context_state = CTX_PROCESS_IMCU; + /*FALLTHROUGH*/ + case CTX_PROCESS_IMCU: + /* Call postprocessor using previously set pointers */ + (*cinfo->post->post_process_data) (cinfo, mymain->xbuffer[mymain->whichptr], + &mymain->rowgroup_ctr, mymain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (mymain->rowgroup_ctr < mymain->rowgroups_avail) + return; /* Need to suspend */ + /* After the first iMCU, change wraparound pointers to normal state */ + if (mymain->iMCU_row_ctr == 1) + set_wraparound_pointers(cinfo); + /* Prepare to load new iMCU row using other xbuffer list */ + mymain->whichptr ^= 1; /* 0=>1 or 1=>0 */ + mymain->buffer_full = FALSE; + /* Still need to process last row group of this iMCU row, */ + /* which is saved at index M+1 of the other xbuffer */ + mymain->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1); + mymain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2); + mymain->context_state = CTX_POSTPONED_ROW; + } +} + + +/* + * Process some data. + * Final pass of two-pass quantization: just call the postprocessor. + * Source data will be the postprocessor controller's internal buffer. + */ + +#ifdef QUANT_2PASS_SUPPORTED + +METHODDEF(void) +process_data_crank_post (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, + (JDIMENSION *) NULL, (JDIMENSION) 0, + output_buf, out_row_ctr, out_rows_avail); +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr mymain; + int ci, rgroup, ngroups; + jpeg_component_info *compptr; + + mymain = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_d_main_controller *) mymain; + mymain->pub.start_pass = start_pass_main; + + if (need_full_buffer) /* shouldn't happen */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Allocate the workspace. + * ngroups is the number of row groups we need. + */ + if (cinfo->upsample->need_context_rows) { + if (cinfo->min_DCT_v_scaled_size < 2) /* unsupported, see comments above */ + ERREXIT(cinfo, JERR_NOTIMPL); + alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ + ngroups = cinfo->min_DCT_v_scaled_size + 2; + } else { + ngroups = cinfo->min_DCT_v_scaled_size; + } + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + mymain->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) (rgroup * ngroups)); + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdmarker.c mame-0.145/src/lib/libjpeg/jdmarker.c --- mame-0.144/src/lib/libjpeg/jdmarker.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdmarker.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1406 @@ +/* + * jdmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to decode JPEG datastream markers. + * Most of the complexity arises from our desire to support input + * suspension: if not all of the data for a marker is available, + * we must exit back to the application. On resumption, we reprocess + * the marker. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_reader pub; /* public fields */ + + /* Application-overridable marker processing methods */ + jpeg_marker_parser_method process_COM; + jpeg_marker_parser_method process_APPn[16]; + + /* Limit on marker data length to save for each marker type */ + unsigned int length_limit_COM; + unsigned int length_limit_APPn[16]; + + /* Status of COM/APPn marker saving */ + jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ + unsigned int bytes_read; /* data bytes read so far in marker */ + /* Note: cur_marker is not linked into marker_list until it's all read. */ +} my_marker_reader; + +typedef my_marker_reader * my_marker_ptr; + + +/* + * Macros for fetching data from the data source module. + * + * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect + * the current restart point; we update them only when we have reached a + * suitable place to restart if a suspension occurs. + */ + +/* Declare and initialize local copies of input pointer/count */ +#define INPUT_VARS(cinfo) \ + struct jpeg_source_mgr * datasrc = (cinfo)->src; \ + const JOCTET * next_input_byte = datasrc->next_input_byte; \ + size_t bytes_in_buffer = datasrc->bytes_in_buffer + +/* Unload the local copies --- do this only at a restart boundary */ +#define INPUT_SYNC(cinfo) \ + ( datasrc->next_input_byte = next_input_byte, \ + datasrc->bytes_in_buffer = bytes_in_buffer ) + +/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ +#define INPUT_RELOAD(cinfo) \ + ( next_input_byte = datasrc->next_input_byte, \ + bytes_in_buffer = datasrc->bytes_in_buffer ) + +/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. + * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, + * but we must reload the local copies after a successful fill. + */ +#define MAKE_BYTE_AVAIL(cinfo,action) \ + if (bytes_in_buffer == 0) { \ + if (! (*datasrc->fill_input_buffer) (cinfo)) \ + { action; } \ + INPUT_RELOAD(cinfo); \ + } + +/* Read a byte into variable V. + * If must suspend, take the specified action (typically "return FALSE"). + */ +#define INPUT_BYTE(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = GETJOCTET(*next_input_byte++); ) + +/* As above, but read two bytes interpreted as an unsigned 16-bit integer. + * V should be declared unsigned int or perhaps INT32. + */ +#define INPUT_2BYTES(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ + MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V += GETJOCTET(*next_input_byte++); ) + + +/* + * Routines to process JPEG markers. + * + * Entry condition: JPEG marker itself has been read and its code saved + * in cinfo->unread_marker; input restart point is just after the marker. + * + * Exit: if return TRUE, have read and processed any parameters, and have + * updated the restart point to point after the parameters. + * If return FALSE, was forced to suspend before reaching end of + * marker parameters; restart point has not been moved. Same routine + * will be called again after application supplies more input data. + * + * This approach to suspension assumes that all of a marker's parameters + * can fit into a single input bufferload. This should hold for "normal" + * markers. Some COM/APPn markers might have large parameter segments + * that might not fit. If we are simply dropping such a marker, we use + * skip_input_data to get past it, and thereby put the problem on the + * source manager's shoulders. If we are saving the marker's contents + * into memory, we use a slightly different convention: when forced to + * suspend, the marker processor updates the restart point to the end of + * what it's consumed (ie, the end of the buffer) before returning FALSE. + * On resumption, cinfo->unread_marker still contains the marker code, + * but the data source will point to the next chunk of marker data. + * The marker processor must retain internal state to deal with this. + * + * Note that we don't bother to avoid duplicate trace messages if a + * suspension occurs within marker parameters. Other side effects + * require more care. + */ + + +LOCAL(boolean) +get_soi (j_decompress_ptr cinfo) +/* Process an SOI marker */ +{ + int i; + + TRACEMS(cinfo, 1, JTRC_SOI); + + if (cinfo->marker->saw_SOI) + ERREXIT(cinfo, JERR_SOI_DUPLICATE); + + /* Reset all parameters that are defined to be reset by SOI */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + cinfo->restart_interval = 0; + + /* Set initial assumptions for colorspace etc */ + + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ + + cinfo->saw_JFIF_marker = FALSE; + cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; + cinfo->X_density = 1; + cinfo->Y_density = 1; + cinfo->saw_Adobe_marker = FALSE; + cinfo->Adobe_transform = 0; + + cinfo->marker->saw_SOI = TRUE; + + return TRUE; +} + + +LOCAL(boolean) +get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog, + boolean is_arith) +/* Process a SOFn marker */ +{ + INT32 length; + int c, ci; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + cinfo->is_baseline = is_baseline; + cinfo->progressive_mode = is_prog; + cinfo->arith_code = is_arith; + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); + INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); + + length -= 8; + + TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, + (int) cinfo->image_width, (int) cinfo->image_height, + cinfo->num_components); + + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_DUPLICATE); + + /* We don't support files in which the image height is initially specified */ + /* as 0 and is later redefined by DNL. As long as we have to check that, */ + /* might as well have a general sanity check. */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + if (length != (cinfo->num_components * 3)) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + if (cinfo->comp_info == NULL) /* do only once, even if suspend */ + cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * SIZEOF(jpeg_component_info)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->component_index = ci; + INPUT_BYTE(cinfo, compptr->component_id, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); + + TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, + compptr->component_id, compptr->h_samp_factor, + compptr->v_samp_factor, compptr->quant_tbl_no); + } + + cinfo->marker->saw_SOF = TRUE; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_sos (j_decompress_ptr cinfo) +/* Process a SOS marker */ +{ + INT32 length; + int i, ci, n, c, cc; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + if (! cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOS_NO_SOF); + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ + + TRACEMS1(cinfo, 1, JTRC_SOS, n); + + if (length != (n * 2 + 6) || n > MAX_COMPS_IN_SCAN || + (n == 0 && !cinfo->progressive_mode)) + /* pseudo SOS marker only allowed in progressive mode */ + ERREXIT(cinfo, JERR_BAD_LENGTH); + + cinfo->comps_in_scan = n; + + /* Collect the component-spec parameters */ + + for (i = 0; i < n; i++) { + INPUT_BYTE(cinfo, cc, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (cc == compptr->component_id) + goto id_found; + } + + ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); + + id_found: + + cinfo->cur_comp_info[i] = compptr; + compptr->dc_tbl_no = (c >> 4) & 15; + compptr->ac_tbl_no = (c ) & 15; + + TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, + compptr->dc_tbl_no, compptr->ac_tbl_no); + } + + /* Collect the additional scan parameters Ss, Se, Ah/Al. */ + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ss = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Se = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ah = (c >> 4) & 15; + cinfo->Al = (c ) & 15; + + TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, + cinfo->Ah, cinfo->Al); + + /* Prepare to scan data & restart markers */ + cinfo->marker->next_restart_num = 0; + + /* Count another (non-pseudo) SOS marker */ + if (n) cinfo->input_scan_number++; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +#ifdef D_ARITH_CODING_SUPPORTED + +LOCAL(boolean) +get_dac (j_decompress_ptr cinfo) +/* Process a DAC marker */ +{ + INT32 length; + int index, val; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, index, return FALSE); + INPUT_BYTE(cinfo, val, return FALSE); + + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_DAC, index, val); + + if (index < 0 || index >= (2*NUM_ARITH_TBLS)) + ERREXIT1(cinfo, JERR_DAC_INDEX, index); + + if (index >= NUM_ARITH_TBLS) { /* define AC table */ + cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; + } else { /* define DC table */ + cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); + cinfo->arith_dc_U[index] = (UINT8) (val >> 4); + if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) + ERREXIT1(cinfo, JERR_DAC_VALUE, val); + } + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + +#else /* ! D_ARITH_CODING_SUPPORTED */ + +#define get_dac(cinfo) skip_variable(cinfo) + +#endif /* D_ARITH_CODING_SUPPORTED */ + + +LOCAL(boolean) +get_dht (j_decompress_ptr cinfo) +/* Process a DHT marker */ +{ + INT32 length; + UINT8 bits[17]; + UINT8 huffval[256]; + int i, index, count; + JHUFF_TBL **htblptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 16) { + INPUT_BYTE(cinfo, index, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DHT, index); + + bits[0] = 0; + count = 0; + for (i = 1; i <= 16; i++) { + INPUT_BYTE(cinfo, bits[i], return FALSE); + count += bits[i]; + } + + length -= 1 + 16; + + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[1], bits[2], bits[3], bits[4], + bits[5], bits[6], bits[7], bits[8]); + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[9], bits[10], bits[11], bits[12], + bits[13], bits[14], bits[15], bits[16]); + + /* Here we just do minimal validation of the counts to avoid walking + * off the end of our table space. jdhuff.c will check more carefully. + */ + if (count > 256 || ((INT32) count) > length) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + for (i = 0; i < count; i++) + INPUT_BYTE(cinfo, huffval[i], return FALSE); + + length -= count; + + if (index & 0x10) { /* AC table definition */ + index -= 0x10; + htblptr = &cinfo->ac_huff_tbl_ptrs[index]; + } else { /* DC table definition */ + htblptr = &cinfo->dc_huff_tbl_ptrs[index]; + } + + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dqt (j_decompress_ptr cinfo) +/* Process a DQT marker */ +{ + INT32 length, count, i; + int n, prec; + unsigned int tmp; + JQUANT_TBL *quant_ptr; + const int *natural_order; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + length--; + INPUT_BYTE(cinfo, n, return FALSE); + prec = n >> 4; + n &= 0x0F; + + TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); + + if (n >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, n); + + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); + quant_ptr = cinfo->quant_tbl_ptrs[n]; + + if (prec) { + if (length < DCTSIZE2 * 2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length >> 1; + } else + count = DCTSIZE2; + } else { + if (length < DCTSIZE2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length; + } else + count = DCTSIZE2; + } + + switch (count) { + case (2*2): natural_order = jpeg_natural_order2; break; + case (3*3): natural_order = jpeg_natural_order3; break; + case (4*4): natural_order = jpeg_natural_order4; break; + case (5*5): natural_order = jpeg_natural_order5; break; + case (6*6): natural_order = jpeg_natural_order6; break; + case (7*7): natural_order = jpeg_natural_order7; break; + default: natural_order = jpeg_natural_order; break; + } + + for (i = 0; i < count; i++) { + if (prec) + INPUT_2BYTES(cinfo, tmp, return FALSE); + else + INPUT_BYTE(cinfo, tmp, return FALSE); + /* We convert the zigzag-order table to natural array order. */ + quant_ptr->quantval[natural_order[i]] = (UINT16) tmp; + } + + if (cinfo->err->trace_level >= 2) { + for (i = 0; i < DCTSIZE2; i += 8) { + TRACEMS8(cinfo, 2, JTRC_QUANTVALS, + quant_ptr->quantval[i], quant_ptr->quantval[i+1], + quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], + quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], + quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); + } + } + + length -= count; + if (prec) length -= count; + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dri (j_decompress_ptr cinfo) +/* Process a DRI marker */ +{ + INT32 length; + unsigned int tmp; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + + if (length != 4) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_2BYTES(cinfo, tmp, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DRI, tmp); + + cinfo->restart_interval = tmp; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Routines for processing APPn and COM markers. + * These are either saved in memory or discarded, per application request. + * APP0 and APP14 are specially checked to see if they are + * JFIF and Adobe markers, respectively. + */ + +#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ +#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ +#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ + + +LOCAL(void) +examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP0. + * Take appropriate action if it is a JFIF marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + INT32 totallen = (INT32) datalen + remaining; + + if (datalen >= APP0_DATA_LEN && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x49 && + GETJOCTET(data[3]) == 0x46 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF APP0 marker: save info */ + cinfo->saw_JFIF_marker = TRUE; + cinfo->JFIF_major_version = GETJOCTET(data[5]); + cinfo->JFIF_minor_version = GETJOCTET(data[6]); + cinfo->density_unit = GETJOCTET(data[7]); + cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); + cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); + /* Check version. + * Major version must be 1, anything else signals an incompatible change. + * (We used to treat this as an error, but now it's a nonfatal warning, + * because some bozo at Hijaak couldn't read the spec.) + * Minor version should be 0..2, but process anyway if newer. + */ + if (cinfo->JFIF_major_version != 1) + WARNMS2(cinfo, JWRN_JFIF_MAJOR, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version); + /* Generate trace messages */ + TRACEMS5(cinfo, 1, JTRC_JFIF, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version, + cinfo->X_density, cinfo->Y_density, cinfo->density_unit); + /* Validate thumbnail dimensions and issue appropriate messages */ + if (GETJOCTET(data[12]) | GETJOCTET(data[13])) + TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, + GETJOCTET(data[12]), GETJOCTET(data[13])); + totallen -= APP0_DATA_LEN; + if (totallen != + ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) + TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); + } else if (datalen >= 6 && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x58 && + GETJOCTET(data[3]) == 0x58 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF "JFXX" extension APP0 marker */ + /* The library doesn't actually do anything with these, + * but we try to produce a helpful trace message. + */ + switch (GETJOCTET(data[5])) { + case 0x10: + TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); + break; + case 0x11: + TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); + break; + case 0x13: + TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); + break; + default: + TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, + GETJOCTET(data[5]), (int) totallen); + break; + } + } else { + /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); + } +} + + +LOCAL(void) +examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP14. + * Take appropriate action if it is an Adobe marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + unsigned int version, flags0, flags1, transform; + + if (datalen >= APP14_DATA_LEN && + GETJOCTET(data[0]) == 0x41 && + GETJOCTET(data[1]) == 0x64 && + GETJOCTET(data[2]) == 0x6F && + GETJOCTET(data[3]) == 0x62 && + GETJOCTET(data[4]) == 0x65) { + /* Found Adobe APP14 marker */ + version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); + flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); + flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); + transform = GETJOCTET(data[11]); + TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); + cinfo->saw_Adobe_marker = TRUE; + cinfo->Adobe_transform = (UINT8) transform; + } else { + /* Start of APP14 does not match "Adobe", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); + } +} + + +METHODDEF(boolean) +get_interesting_appn (j_decompress_ptr cinfo) +/* Process an APP0 or APP14 marker without saving it */ +{ + INT32 length; + JOCTET b[APPN_DATA_LEN]; + unsigned int i, numtoread; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + /* get the interesting part of the marker data */ + if (length >= APPN_DATA_LEN) + numtoread = APPN_DATA_LEN; + else if (length > 0) + numtoread = (unsigned int) length; + else + numtoread = 0; + for (i = 0; i < numtoread; i++) + INPUT_BYTE(cinfo, b[i], return FALSE); + length -= numtoread; + + /* process it */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + case M_APP14: + examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + default: + /* can't get here unless jpeg_save_markers chooses wrong processor */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +#ifdef SAVE_MARKERS_SUPPORTED + +METHODDEF(boolean) +save_marker (j_decompress_ptr cinfo) +/* Save an APPn or COM marker into the marker list */ +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + jpeg_saved_marker_ptr cur_marker = marker->cur_marker; + unsigned int bytes_read, data_length; + JOCTET FAR * data; + INT32 length = 0; + INPUT_VARS(cinfo); + + if (cur_marker == NULL) { + /* begin reading a marker */ + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + if (length >= 0) { /* watch out for bogus length word */ + /* figure out how much we want to save */ + unsigned int limit; + if (cinfo->unread_marker == (int) M_COM) + limit = marker->length_limit_COM; + else + limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; + if ((unsigned int) length < limit) + limit = (unsigned int) length; + /* allocate and initialize the marker item */ + cur_marker = (jpeg_saved_marker_ptr) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(struct jpeg_marker_struct) + limit); + cur_marker->next = NULL; + cur_marker->marker = (UINT8) cinfo->unread_marker; + cur_marker->original_length = (unsigned int) length; + cur_marker->data_length = limit; + /* data area is just beyond the jpeg_marker_struct */ + data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); + marker->cur_marker = cur_marker; + marker->bytes_read = 0; + bytes_read = 0; + data_length = limit; + } else { + /* deal with bogus length word */ + bytes_read = data_length = 0; + data = NULL; + } + } else { + /* resume reading a marker */ + bytes_read = marker->bytes_read; + data_length = cur_marker->data_length; + data = cur_marker->data + bytes_read; + } + + while (bytes_read < data_length) { + INPUT_SYNC(cinfo); /* move the restart point to here */ + marker->bytes_read = bytes_read; + /* If there's not at least one byte in buffer, suspend */ + MAKE_BYTE_AVAIL(cinfo, return FALSE); + /* Copy bytes with reasonable rapidity */ + while (bytes_read < data_length && bytes_in_buffer > 0) { + *data++ = *next_input_byte++; + bytes_in_buffer--; + bytes_read++; + } + } + + /* Done reading what we want to read */ + if (cur_marker != NULL) { /* will be NULL if bogus length word */ + /* Add new marker to end of list */ + if (cinfo->marker_list == NULL) { + cinfo->marker_list = cur_marker; + } else { + jpeg_saved_marker_ptr prev = cinfo->marker_list; + while (prev->next != NULL) + prev = prev->next; + prev->next = cur_marker; + } + /* Reset pointer & calc remaining data length */ + data = cur_marker->data; + length = cur_marker->original_length - data_length; + } + /* Reset to initial state for next marker */ + marker->cur_marker = NULL; + + /* Process the marker if interesting; else just make a generic trace msg */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, data, data_length, length); + break; + case M_APP14: + examine_app14(cinfo, data, data_length, length); + break; + default: + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, + (int) (data_length + length)); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +METHODDEF(boolean) +skip_variable (j_decompress_ptr cinfo) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + INT32 length; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); + + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +/* + * Find the next JPEG marker, save it in cinfo->unread_marker. + * Returns FALSE if had to suspend before reaching a marker; + * in that case cinfo->unread_marker is unchanged. + * + * Note that the result might not be a valid marker code, + * but it will never be 0 or FF. + */ + +LOCAL(boolean) +next_marker (j_decompress_ptr cinfo) +{ + int c; + INPUT_VARS(cinfo); + + for (;;) { + INPUT_BYTE(cinfo, c, return FALSE); + /* Skip any non-FF bytes. + * This may look a bit inefficient, but it will not occur in a valid file. + * We sync after each discarded byte so that a suspending data source + * can discard the byte from its buffer. + */ + while (c != 0xFF) { + cinfo->marker->discarded_bytes++; + INPUT_SYNC(cinfo); + INPUT_BYTE(cinfo, c, return FALSE); + } + /* This loop swallows any duplicate FF bytes. Extra FFs are legal as + * pad bytes, so don't count them in discarded_bytes. We assume there + * will not be so many consecutive FF bytes as to overflow a suspending + * data source's input buffer. + */ + do { + INPUT_BYTE(cinfo, c, return FALSE); + } while (c == 0xFF); + if (c != 0) + break; /* found a valid marker, exit loop */ + /* Reach here if we found a stuffed-zero data sequence (FF/00). + * Discard it and loop back to try again. + */ + cinfo->marker->discarded_bytes += 2; + INPUT_SYNC(cinfo); + } + + if (cinfo->marker->discarded_bytes != 0) { + WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); + cinfo->marker->discarded_bytes = 0; + } + + cinfo->unread_marker = c; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +first_marker (j_decompress_ptr cinfo) +/* Like next_marker, but used to obtain the initial SOI marker. */ +/* For this marker, we do not allow preceding garbage or fill; otherwise, + * we might well scan an entire input file before realizing it ain't JPEG. + * If an application wants to process non-JFIF files, it must seek to the + * SOI before calling the JPEG library. + */ +{ + int c, c2; + INPUT_VARS(cinfo); + + INPUT_BYTE(cinfo, c, return FALSE); + INPUT_BYTE(cinfo, c2, return FALSE); + if (c != 0xFF || c2 != (int) M_SOI) + ERREXIT2(cinfo, JERR_NO_SOI, c, c2); + + cinfo->unread_marker = c2; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Read markers until SOS or EOI. + * + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * Note: This function may return a pseudo SOS marker (with zero + * component number) for treat by input controller's consume_input. + * consume_input itself should filter out (skip) the pseudo marker + * after processing for the caller. + */ + +METHODDEF(int) +read_markers (j_decompress_ptr cinfo) +{ + /* Outer loop repeats once for each marker. */ + for (;;) { + /* Collect the marker proper, unless we already did. */ + /* NB: first_marker() enforces the requirement that SOI appear first. */ + if (cinfo->unread_marker == 0) { + if (! cinfo->marker->saw_SOI) { + if (! first_marker(cinfo)) + return JPEG_SUSPENDED; + } else { + if (! next_marker(cinfo)) + return JPEG_SUSPENDED; + } + } + /* At this point cinfo->unread_marker contains the marker code and the + * input point is just past the marker proper, but before any parameters. + * A suspension will cause us to return with this state still true. + */ + switch (cinfo->unread_marker) { + case M_SOI: + if (! get_soi(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_SOF0: /* Baseline */ + if (! get_sof(cinfo, TRUE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF1: /* Extended sequential, Huffman */ + if (! get_sof(cinfo, FALSE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF2: /* Progressive, Huffman */ + if (! get_sof(cinfo, FALSE, TRUE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF9: /* Extended sequential, arithmetic */ + if (! get_sof(cinfo, FALSE, FALSE, TRUE)) + return JPEG_SUSPENDED; + break; + + case M_SOF10: /* Progressive, arithmetic */ + if (! get_sof(cinfo, FALSE, TRUE, TRUE)) + return JPEG_SUSPENDED; + break; + + /* Currently unsupported SOFn types */ + case M_SOF3: /* Lossless, Huffman */ + case M_SOF5: /* Differential sequential, Huffman */ + case M_SOF6: /* Differential progressive, Huffman */ + case M_SOF7: /* Differential lossless, Huffman */ + case M_JPG: /* Reserved for JPEG extensions */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); + break; + + case M_SOS: + if (! get_sos(cinfo)) + return JPEG_SUSPENDED; + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_SOS; + + case M_EOI: + TRACEMS(cinfo, 1, JTRC_EOI); + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_EOI; + + case M_DAC: + if (! get_dac(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DHT: + if (! get_dht(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DQT: + if (! get_dqt(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DRI: + if (! get_dri(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_APP0: + case M_APP1: + case M_APP2: + case M_APP3: + case M_APP4: + case M_APP5: + case M_APP6: + case M_APP7: + case M_APP8: + case M_APP9: + case M_APP10: + case M_APP11: + case M_APP12: + case M_APP13: + case M_APP14: + case M_APP15: + if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ + cinfo->unread_marker - (int) M_APP0]) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_COM: + if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_RST0: /* these are all parameterless */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); + break; + + case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ + if (! skip_variable(cinfo)) + return JPEG_SUSPENDED; + break; + + default: /* must be DHP, EXP, JPGn, or RESn */ + /* For now, we treat the reserved markers as fatal errors since they are + * likely to be used to signal incompatible JPEG Part 3 extensions. + * Once the JPEG 3 version-number marker is well defined, this code + * ought to change! + */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + /* Successfully processed marker, so reset state variable */ + cinfo->unread_marker = 0; + } /* end loop */ +} + + +/* + * Read a restart marker, which is expected to appear next in the datastream; + * if the marker is not there, take appropriate recovery action. + * Returns FALSE if suspension is required. + * + * This is called by the entropy decoder after it has read an appropriate + * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder + * has already read a marker from the data source. Under normal conditions + * cinfo->unread_marker will be reset to 0 before returning; if not reset, + * it holds a marker which the decoder will be unable to read past. + */ + +METHODDEF(boolean) +read_restart_marker (j_decompress_ptr cinfo) +{ + /* Obtain a marker unless we already did. */ + /* Note that next_marker will complain if it skips any data. */ + if (cinfo->unread_marker == 0) { + if (! next_marker(cinfo)) + return FALSE; + } + + if (cinfo->unread_marker == + ((int) M_RST0 + cinfo->marker->next_restart_num)) { + /* Normal case --- swallow the marker and let entropy decoder continue */ + TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); + cinfo->unread_marker = 0; + } else { + /* Uh-oh, the restart markers have been messed up. */ + /* Let the data source manager determine how to resync. */ + if (! (*cinfo->src->resync_to_restart) (cinfo, + cinfo->marker->next_restart_num)) + return FALSE; + } + + /* Update next-restart state */ + cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; + + return TRUE; +} + + +/* + * This is the default resync_to_restart method for data source managers + * to use if they don't have any better approach. Some data source managers + * may be able to back up, or may have additional knowledge about the data + * which permits a more intelligent recovery strategy; such managers would + * presumably supply their own resync method. + * + * read_restart_marker calls resync_to_restart if it finds a marker other than + * the restart marker it was expecting. (This code is *not* used unless + * a nonzero restart interval has been declared.) cinfo->unread_marker is + * the marker code actually found (might be anything, except 0 or FF). + * The desired restart marker number (0..7) is passed as a parameter. + * This routine is supposed to apply whatever error recovery strategy seems + * appropriate in order to position the input stream to the next data segment. + * Note that cinfo->unread_marker is treated as a marker appearing before + * the current data-source input point; usually it should be reset to zero + * before returning. + * Returns FALSE if suspension is required. + * + * This implementation is substantially constrained by wanting to treat the + * input as a data stream; this means we can't back up. Therefore, we have + * only the following actions to work with: + * 1. Simply discard the marker and let the entropy decoder resume at next + * byte of file. + * 2. Read forward until we find another marker, discarding intervening + * data. (In theory we could look ahead within the current bufferload, + * without having to discard data if we don't find the desired marker. + * This idea is not implemented here, in part because it makes behavior + * dependent on buffer size and chance buffer-boundary positions.) + * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). + * This will cause the entropy decoder to process an empty data segment, + * inserting dummy zeroes, and then we will reprocess the marker. + * + * #2 is appropriate if we think the desired marker lies ahead, while #3 is + * appropriate if the found marker is a future restart marker (indicating + * that we have missed the desired restart marker, probably because it got + * corrupted). + * We apply #2 or #3 if the found marker is a restart marker no more than + * two counts behind or ahead of the expected one. We also apply #2 if the + * found marker is not a legal JPEG marker code (it's certainly bogus data). + * If the found marker is a restart marker more than 2 counts away, we do #1 + * (too much risk that the marker is erroneous; with luck we will be able to + * resync at some future point). + * For any valid non-restart JPEG marker, we apply #3. This keeps us from + * overrunning the end of a scan. An implementation limited to single-scan + * files might find it better to apply #2 for markers other than EOI, since + * any other marker would have to be bogus data in that case. + */ + +GLOBAL(boolean) +jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + int marker = cinfo->unread_marker; + int action = 1; + + /* Always put up a warning. */ + WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); + + /* Outer loop handles repeated decision after scanning forward. */ + for (;;) { + if (marker < (int) M_SOF0) + action = 2; /* invalid marker */ + else if (marker < (int) M_RST0 || marker > (int) M_RST7) + action = 3; /* valid non-restart marker */ + else { + if (marker == ((int) M_RST0 + ((desired+1) & 7)) || + marker == ((int) M_RST0 + ((desired+2) & 7))) + action = 3; /* one of the next two expected restarts */ + else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || + marker == ((int) M_RST0 + ((desired-2) & 7))) + action = 2; /* a prior restart, so advance */ + else + action = 1; /* desired restart or too far away */ + } + TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); + switch (action) { + case 1: + /* Discard marker and let entropy decoder resume processing. */ + cinfo->unread_marker = 0; + return TRUE; + case 2: + /* Scan to the next marker, and repeat the decision loop. */ + if (! next_marker(cinfo)) + return FALSE; + marker = cinfo->unread_marker; + break; + case 3: + /* Return without advancing past this marker. */ + /* Entropy decoder will be forced to process an empty segment. */ + return TRUE; + } + } /* end loop */ +} + + +/* + * Reset marker processing state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + cinfo->comp_info = NULL; /* until allocated by get_sof */ + cinfo->input_scan_number = 0; /* no SOS seen yet */ + cinfo->unread_marker = 0; /* no pending marker */ + marker->pub.saw_SOI = FALSE; /* set internal state too */ + marker->pub.saw_SOF = FALSE; + marker->pub.discarded_bytes = 0; + marker->cur_marker = NULL; +} + + +/* + * Initialize the marker reader module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker; + int i; + + /* Create subobject in permanent pool */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_marker_reader)); + cinfo->marker = (struct jpeg_marker_reader *) marker; + /* Initialize public method pointers */ + marker->pub.reset_marker_reader = reset_marker_reader; + marker->pub.read_markers = read_markers; + marker->pub.read_restart_marker = read_restart_marker; + /* Initialize COM/APPn processing. + * By default, we examine and then discard APP0 and APP14, + * but simply discard COM and all other APPn. + */ + marker->process_COM = skip_variable; + marker->length_limit_COM = 0; + for (i = 0; i < 16; i++) { + marker->process_APPn[i] = skip_variable; + marker->length_limit_APPn[i] = 0; + } + marker->process_APPn[0] = get_interesting_appn; + marker->process_APPn[14] = get_interesting_appn; + /* Reset marker processing state */ + reset_marker_reader(cinfo); +} + + +/* + * Control saving of COM and APPn markers into marker_list. + */ + +#ifdef SAVE_MARKERS_SUPPORTED + +GLOBAL(void) +jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + long maxlength; + jpeg_marker_parser_method processor; + + /* Length limit mustn't be larger than what we can allocate + * (should only be a concern in a 16-bit environment). + */ + maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); + if (((long) length_limit) > maxlength) + length_limit = (unsigned int) maxlength; + + /* Choose processor routine to use. + * APP0/APP14 have special requirements. + */ + if (length_limit) { + processor = save_marker; + /* If saving APP0/APP14, save at least enough for our internal use. */ + if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) + length_limit = APP0_DATA_LEN; + else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) + length_limit = APP14_DATA_LEN; + } else { + processor = skip_variable; + /* If discarding APP0/APP14, use our regular on-the-fly processor. */ + if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) + processor = get_interesting_appn; + } + + if (marker_code == (int) M_COM) { + marker->process_COM = processor; + marker->length_limit_COM = length_limit; + } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { + marker->process_APPn[marker_code - (int) M_APP0] = processor; + marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; + } else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +/* + * Install a special processing method for COM or APPn markers. + */ + +GLOBAL(void) +jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + if (marker_code == (int) M_COM) + marker->process_COM = routine; + else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) + marker->process_APPn[marker_code - (int) M_APP0] = routine; + else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} diff -Nru mame-0.144/src/lib/libjpeg/jdmaster.c mame-0.145/src/lib/libjpeg/jdmaster.c --- mame-0.144/src/lib/libjpeg/jdmaster.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdmaster.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,533 @@ +/* + * jdmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG decompressor. + * These routines are concerned with selecting the modules to be executed + * and with determining the number of passes and the work to be done in each + * pass. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_decomp_master pub; /* public fields */ + + int pass_number; /* # of passes completed */ + + boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ + + /* Saved references to initialized quantizer modules, + * in case we need to switch modes. + */ + struct jpeg_color_quantizer * quantizer_1pass; + struct jpeg_color_quantizer * quantizer_2pass; +} my_decomp_master; + +typedef my_decomp_master * my_master_ptr; + + +/* + * Determine whether merged upsample/color conversion should be used. + * CRUCIAL: this must match the actual capabilities of jdmerge.c! + */ + +LOCAL(boolean) +use_merged_upsample (j_decompress_ptr cinfo) +{ +#ifdef UPSAMPLE_MERGING_SUPPORTED + /* Merging is the equivalent of plain box-filter upsampling */ + if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) + return FALSE; + /* jdmerge.c only supports YCC=>RGB color conversion */ + if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || + cinfo->out_color_space != JCS_RGB || + cinfo->out_color_components != RGB_PIXELSIZE) + return FALSE; + /* and it only handles 2h1v or 2h2v sampling ratios */ + if (cinfo->comp_info[0].h_samp_factor != 2 || + cinfo->comp_info[1].h_samp_factor != 1 || + cinfo->comp_info[2].h_samp_factor != 1 || + cinfo->comp_info[0].v_samp_factor > 2 || + cinfo->comp_info[1].v_samp_factor != 1 || + cinfo->comp_info[2].v_samp_factor != 1) + return FALSE; + /* furthermore, it doesn't work if we've scaled the IDCTs differently */ + if (cinfo->comp_info[0].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size) + return FALSE; + /* ??? also need to test for upsample-time rescaling, when & if supported */ + return TRUE; /* by golly, it'll work... */ +#else + return FALSE; +#endif +} + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + * Also note that it may be called before the master module is initialized! + */ + +GLOBAL(void) +jpeg_calc_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; +#endif + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_READY) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Compute core output image dimensions and DCT scaling choices. */ + jpeg_core_output_dimensions(cinfo); + +#ifdef IDCT_SCALING_SUPPORTED + + /* In selecting the actual DCT scaling for each component, we try to + * scale up the chroma components via IDCT scaling rather than upsampling. + * This saves time if the upsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + int ssize = 1; + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support IDCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + } + + /* Recompute downsampled dimensions of components; + * application needs to know these if using raw downsampled data. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Size in samples, after IDCT scaling */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); + } + +#endif /* IDCT_SCALING_SUPPORTED */ + + /* Report number of components in selected colorspace. */ + /* Probably this should be in the color conversion module... */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + break; + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + cinfo->out_color_components = RGB_PIXELSIZE; + break; +#endif /* else share code with YCbCr */ + case JCS_YCbCr: + cinfo->out_color_components = 3; + break; + case JCS_CMYK: + case JCS_YCCK: + cinfo->out_color_components = 4; + break; + default: /* else must be same colorspace as in file */ + cinfo->out_color_components = cinfo->num_components; + break; + } + cinfo->output_components = (cinfo->quantize_colors ? 1 : + cinfo->out_color_components); + + /* See if upsampler will want to emit more than one row at a time */ + if (use_merged_upsample(cinfo)) + cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; + else + cinfo->rec_outbuf_height = 1; +} + + +/* + * Several decompression processes need to range-limit values to the range + * 0..MAXJSAMPLE; the input value may fall somewhat outside this range + * due to noise introduced by quantization, roundoff error, etc. These + * processes are inner loops and need to be as fast as possible. On most + * machines, particularly CPUs with pipelines or instruction prefetch, + * a (subscript-check-less) C table lookup + * x = sample_range_limit[x]; + * is faster than explicit tests + * if (x < 0) x = 0; + * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; + * These processes all use a common table prepared by the routine below. + * + * For most steps we can mathematically guarantee that the initial value + * of x is within MAXJSAMPLE+1 of the legal range, so a table running from + * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial + * limiting step (just after the IDCT), a wildly out-of-range value is + * possible if the input data is corrupt. To avoid any chance of indexing + * off the end of memory and getting a bad-pointer trap, we perform the + * post-IDCT limiting thus: + * x = range_limit[x & MASK]; + * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit + * samples. Under normal circumstances this is more than enough range and + * a correct output will be generated; with bogus input data the mask will + * cause wraparound, and we will safely generate a bogus-but-in-range output. + * For the post-IDCT step, we want to convert the data from signed to unsigned + * representation by adding CENTERJSAMPLE at the same time that we limit it. + * So the post-IDCT limiting table ends up looking like this: + * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, + * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0,1,...,CENTERJSAMPLE-1 + * Negative inputs select values from the upper half of the table after + * masking. + * + * We can save some space by overlapping the start of the post-IDCT table + * with the simpler range limiting table. The post-IDCT table begins at + * sample_range_limit + CENTERJSAMPLE. + * + * Note that the table is allocated in near data space on PCs; it's small + * enough and used often enough to justify this. + */ + +LOCAL(void) +prepare_range_limit_table (j_decompress_ptr cinfo) +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ + cinfo->sample_range_limit = table; + /* First segment of "simple" table: limit[x] = 0 for x < 0 */ + MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); + /* Main part of "simple" table: limit[x] = x */ + for (i = 0; i <= MAXJSAMPLE; i++) + table[i] = (JSAMPLE) i; + table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ + /* End of simple table, rest of first half of post-IDCT table */ + for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) + table[i] = MAXJSAMPLE; + /* Second half of post-IDCT table */ + MEMZERO(table + (2 * (MAXJSAMPLE+1)), + (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), + cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); +} + + +/* + * Master selection of decompression modules. + * This is done once at jpeg_start_decompress time. We determine + * which modules will be used and give them appropriate initialization calls. + * We also initialize the decompressor input side to begin consuming data. + * + * Since jpeg_read_header has finished, we know what is in the SOF + * and (first) SOS markers. We also have all the application parameter + * settings. + */ + +LOCAL(void) +master_selection (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + boolean use_c_buffer; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + /* Initialize dimensions and other stuff */ + jpeg_calc_output_dimensions(cinfo); + prepare_range_limit_table(cinfo); + + /* Width of an output scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* Initialize my private state */ + master->pass_number = 0; + master->using_merged_upsample = use_merged_upsample(cinfo); + + /* Color quantizer selection */ + master->quantizer_1pass = NULL; + master->quantizer_2pass = NULL; + /* No mode changes if not using buffered-image mode. */ + if (! cinfo->quantize_colors || ! cinfo->buffered_image) { + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + } + if (cinfo->quantize_colors) { + if (cinfo->raw_data_out) + ERREXIT(cinfo, JERR_NOTIMPL); + /* 2-pass quantizer only works in 3-component color space. */ + if (cinfo->out_color_components != 3) { + cinfo->enable_1pass_quant = TRUE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + cinfo->colormap = NULL; + } else if (cinfo->colormap != NULL) { + cinfo->enable_external_quant = TRUE; + } else if (cinfo->two_pass_quantize) { + cinfo->enable_2pass_quant = TRUE; + } else { + cinfo->enable_1pass_quant = TRUE; + } + + if (cinfo->enable_1pass_quant) { +#ifdef QUANT_1PASS_SUPPORTED + jinit_1pass_quantizer(cinfo); + master->quantizer_1pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + + /* We use the 2-pass code to map to external colormaps. */ + if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { +#ifdef QUANT_2PASS_SUPPORTED + jinit_2pass_quantizer(cinfo); + master->quantizer_2pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + /* If both quantizers are initialized, the 2-pass one is left active; + * this is necessary for starting with quantization to an external map. + */ + } + + /* Post-processing: in particular, color conversion first */ + if (! cinfo->raw_data_out) { + if (master->using_merged_upsample) { +#ifdef UPSAMPLE_MERGING_SUPPORTED + jinit_merged_upsampler(cinfo); /* does color conversion too */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + jinit_color_deconverter(cinfo); + jinit_upsampler(cinfo); + } + jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); + } + /* Inverse DCT */ + jinit_inverse_dct(cinfo); + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); + } + + /* Initialize principal buffer controllers. */ + use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; + jinit_d_coef_controller(cinfo, use_c_buffer); + + if (! cinfo->raw_data_out) + jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* If jpeg_start_decompress will read the whole file, initialize + * progress monitoring appropriately. The input step is counted + * as one pass. + */ + if (cinfo->progress != NULL && ! cinfo->buffered_image && + cinfo->inputctl->has_multiple_scans) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); + /* Count the input pass as done */ + master->pass_number++; + } +#endif /* D_MULTISCAN_FILES_SUPPORTED */ +} + + +/* + * Per-pass setup. + * This is called at the beginning of each output pass. We determine which + * modules will be active during this pass and give them appropriate + * start_pass calls. We also set is_dummy_pass to indicate whether this + * is a "real" output pass or a dummy pass for color quantization. + * (In the latter case, jdapistd.c will crank the pass to completion.) + */ + +METHODDEF(void) +prepare_for_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (master->pub.is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Final pass of 2-pass quantization */ + master->pub.is_dummy_pass = FALSE; + (*cinfo->cquantize->start_pass) (cinfo, FALSE); + (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); + (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + if (cinfo->quantize_colors && cinfo->colormap == NULL) { + /* Select new quantization method */ + if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { + cinfo->cquantize = master->quantizer_2pass; + master->pub.is_dummy_pass = TRUE; + } else if (cinfo->enable_1pass_quant) { + cinfo->cquantize = master->quantizer_1pass; + } else { + ERREXIT(cinfo, JERR_MODE_CHANGE); + } + } + (*cinfo->idct->start_pass) (cinfo); + (*cinfo->coef->start_output_pass) (cinfo); + if (! cinfo->raw_data_out) { + if (! master->using_merged_upsample) + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->upsample->start_pass) (cinfo); + if (cinfo->quantize_colors) + (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); + (*cinfo->post->start_pass) (cinfo, + (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + } + } + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->pass_number + + (master->pub.is_dummy_pass ? 2 : 1); + /* In buffered-image mode, we assume one more output pass if EOI not + * yet reached, but no more passes if EOI has been reached. + */ + if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { + cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); + } + } +} + + +/* + * Finish up at end of an output pass. + */ + +METHODDEF(void) +finish_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (cinfo->quantize_colors) + (*cinfo->cquantize->finish_pass) (cinfo); + master->pass_number++; +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Switch to a new external colormap between output passes. + */ + +GLOBAL(void) +jpeg_new_colormap (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_BUFIMAGE) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (cinfo->quantize_colors && cinfo->enable_external_quant && + cinfo->colormap != NULL) { + /* Select 2-pass quantizer for external colormap use */ + cinfo->cquantize = master->quantizer_2pass; + /* Notify quantizer of colormap change */ + (*cinfo->cquantize->new_color_map) (cinfo); + master->pub.is_dummy_pass = FALSE; /* just in case */ + } else + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +/* + * Initialize master decompression control and select active modules. + * This is performed at the start of jpeg_start_decompress. + */ + +GLOBAL(void) +jinit_master_decompress (j_decompress_ptr cinfo) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_decomp_master)); + cinfo->master = (struct jpeg_decomp_master *) master; + master->pub.prepare_for_output_pass = prepare_for_output_pass; + master->pub.finish_output_pass = finish_output_pass; + + master->pub.is_dummy_pass = FALSE; + + master_selection(cinfo); +} diff -Nru mame-0.144/src/lib/libjpeg/jdmerge.c mame-0.145/src/lib/libjpeg/jdmerge.c --- mame-0.144/src/lib/libjpeg/jdmerge.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdmerge.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,400 @@ +/* + * jdmerge.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains code for merged upsampling/color conversion. + * + * This file combines functions from jdsample.c and jdcolor.c; + * read those files first to understand what's going on. + * + * When the chroma components are to be upsampled by simple replication + * (ie, box filtering), we can save some work in color conversion by + * calculating all the output pixels corresponding to a pair of chroma + * samples at one time. In the conversion equations + * R = Y + K1 * Cr + * G = Y + K2 * Cb + K3 * Cr + * B = Y + K4 * Cb + * only the Y term varies among the group of pixels corresponding to a pair + * of chroma samples, so the rest of the terms can be calculated just once. + * At typical sampling ratios, this eliminates half or three-quarters of the + * multiplications needed for color conversion. + * + * This file currently provides implementations for the following cases: + * YCbCr => RGB color conversion only. + * Sampling ratios of 2h1v or 2h2v. + * No scaling needed at upsample time. + * Corner-aligned (non-CCIR601) sampling alignment. + * Other special cases could be added, but in most applications these are + * the only common cases. (For uncommon cases we fall back on the more + * general code in jdsample.c and jdcolor.c.) + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef UPSAMPLE_MERGING_SUPPORTED + + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Pointer to routine to do actual upsampling/conversion of one row group */ + JMETHOD(void, upmethod, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf)); + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* For 2:1 vertical sampling, we produce two output rows at a time. + * We need a "spare" row buffer to hold the second output row if the + * application provides just a one-row buffer; we also use the spare + * to discard the dummy last row if the image height is odd. + */ + JSAMPROW spare_row; + boolean spare_full; /* T if spare buffer is occupied */ + + JDIMENSION out_row_width; /* samples per output row */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + * This is taken directly from jdcolor.c; see that file for more info. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int i; + INT32 x; + SHIFT_TEMPS + + upsample->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + upsample->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + upsample->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + upsample->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_merged_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the spare buffer empty */ + upsample->spare_full = FALSE; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * The control routine just handles the row buffering considerations. + */ + +METHODDEF(void) +merged_2v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 2:1 vertical sampling case: may need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPROW work_ptrs[2]; + JDIMENSION num_rows; /* number of rows returned to caller */ + + if (upsample->spare_full) { + /* If we have a spare row saved from a previous cycle, just return it. */ + jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, + 1, upsample->out_row_width); + num_rows = 1; + upsample->spare_full = FALSE; + } else { + /* Figure number of rows to return to caller. */ + num_rows = 2; + /* Not more than the distance to the end of the image. */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + /* Create output pointer array for upsampler. */ + work_ptrs[0] = output_buf[*out_row_ctr]; + if (num_rows > 1) { + work_ptrs[1] = output_buf[*out_row_ctr + 1]; + } else { + work_ptrs[1] = upsample->spare_row; + upsample->spare_full = TRUE; + } + /* Now do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); + } + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (! upsample->spare_full) + (*in_row_group_ctr)++; +} + + +METHODDEF(void) +merged_1v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 1:1 vertical sampling case: much easier, never need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Just do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, + output_buf + *out_row_ctr); + /* Adjust counts */ + (*out_row_ctr)++; + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by the control routines to do + * the actual upsampling/conversion. One row group is processed per call. + * + * Note: since we may be writing directly into application-supplied buffers, + * we have to be honest about the output width; we can't assume the buffer + * has been rounded up to an even width. + */ + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. + */ + +METHODDEF(void) +h2v1_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr; + JSAMPROW inptr0, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr0 = input_buf[0][in_row_group_ctr]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr = output_buf[0]; + /* Loop for each pair of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 2 Y values and emit 2 pixels */ + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr0); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. + */ + +METHODDEF(void) +h2v2_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr0, outptr1; + JSAMPROW inptr00, inptr01, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr00 = input_buf[0][in_row_group_ctr*2]; + inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr0 = output_buf[0]; + outptr1 = output_buf[1]; + /* Loop for each group of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 4 Y values and emit 4 pixels */ + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr00); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + y = GETJSAMPLE(*inptr01); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Module initialization routine for merged upsampling/color conversion. + * + * NB: this is called under the conditions determined by use_merged_upsample() + * in jdmaster.c. That routine MUST correspond to the actual capabilities + * of this module; no safety checks are made here. + */ + +GLOBAL(void) +jinit_merged_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_merged_upsample; + upsample->pub.need_context_rows = FALSE; + + upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; + + if (cinfo->max_v_samp_factor == 2) { + upsample->pub.upsample = merged_2v_upsample; + upsample->upmethod = h2v2_merged_upsample; + /* Allocate a spare row buffer */ + upsample->spare_row = (JSAMPROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); + } else { + upsample->pub.upsample = merged_1v_upsample; + upsample->upmethod = h2v1_merged_upsample; + /* No spare row needed */ + upsample->spare_row = NULL; + } + + build_ycc_rgb_table(cinfo); +} + +#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jdpostct.c mame-0.145/src/lib/libjpeg/jdpostct.c --- mame-0.144/src/lib/libjpeg/jdpostct.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdpostct.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,290 @@ +/* + * jdpostct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the decompression postprocessing controller. + * This controller manages the upsampling, color conversion, and color + * quantization/reduction steps; specifically, it controls the buffering + * between upsample/color conversion and color quantization/reduction. + * + * If no color quantization/reduction is required, then this module has no + * work to do, and it just hands off to the upsample/color conversion code. + * An integrated upsample/convert/quantize process would replace this module + * entirely. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_post_controller pub; /* public fields */ + + /* Color quantization source buffer: this holds output data from + * the upsample/color conversion step to be passed to the quantizer. + * For two-pass color quantization, we need a full-image buffer; + * for one-pass operation, a strip buffer is sufficient. + */ + jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ + JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ + JDIMENSION strip_height; /* buffer size in rows */ + /* for two-pass mode only: */ + JDIMENSION starting_row; /* row # of first row in current strip */ + JDIMENSION next_row; /* index of next row to fill/empty in strip */ +} my_post_controller; + +typedef my_post_controller * my_post_ptr; + + +/* Forward declarations */ +METHODDEF(void) post_process_1pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) post_process_prepass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +METHODDEF(void) post_process_2pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->quantize_colors) { + /* Single-pass processing with color quantization. */ + post->pub.post_process_data = post_process_1pass; + /* We could be doing buffered-image output before starting a 2-pass + * color quantization; in that case, jinit_d_post_controller did not + * allocate a strip buffer. Use the virtual-array buffer as workspace. + */ + if (post->buffer == NULL) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + (JDIMENSION) 0, post->strip_height, TRUE); + } + } else { + /* For single-pass processing without color quantization, + * I have no work to do; just call the upsampler directly. + */ + post->pub.post_process_data = cinfo->upsample->upsample; + } + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_SAVE_AND_PASS: + /* First pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_prepass; + break; + case JBUF_CRANK_DEST: + /* Second pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_2pass; + break; +#endif /* QUANT_2PASS_SUPPORTED */ + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } + post->starting_row = post->next_row = 0; +} + + +/* + * Process some data in the one-pass (strip buffer) case. + * This is used for color precision reduction as well as one-pass quantization. + */ + +METHODDEF(void) +post_process_1pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Fill the buffer, but not more than what we can dump out in one go. */ + /* Note we rely on the upsampler to detect bottom of image. */ + max_rows = out_rows_avail - *out_row_ctr; + if (max_rows > post->strip_height) + max_rows = post->strip_height; + num_rows = 0; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &num_rows, max_rows); + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer, output_buf + *out_row_ctr, (int) num_rows); + *out_row_ctr += num_rows; +} + + +#ifdef QUANT_2PASS_SUPPORTED + +/* + * Process some data in the first pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_prepass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION old_next_row, num_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, TRUE); + } + + /* Upsample some data (up to a strip height's worth). */ + old_next_row = post->next_row; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &post->next_row, post->strip_height); + + /* Allow quantizer to scan new data. No data is emitted, */ + /* but we advance out_row_ctr so outer loop can tell when we're done. */ + if (post->next_row > old_next_row) { + num_rows = post->next_row - old_next_row; + (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, + (JSAMPARRAY) NULL, (int) num_rows); + *out_row_ctr += num_rows; + } + + /* Advance if we filled the strip. */ + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + + +/* + * Process some data in the second pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_2pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, FALSE); + } + + /* Determine number of rows to emit. */ + num_rows = post->strip_height - post->next_row; /* available in strip */ + max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ + if (num_rows > max_rows) + num_rows = max_rows; + /* We have to check bottom of image here, can't depend on upsampler. */ + max_rows = cinfo->output_height - post->starting_row; + if (num_rows > max_rows) + num_rows = max_rows; + + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer + post->next_row, output_buf + *out_row_ctr, + (int) num_rows); + *out_row_ctr += num_rows; + + /* Advance if we filled the strip. */ + post->next_row += num_rows; + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize postprocessing controller. + */ + +GLOBAL(void) +jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_post_ptr post; + + post = (my_post_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_post_controller)); + cinfo->post = (struct jpeg_d_post_controller *) post; + post->pub.start_pass = start_pass_dpost; + post->whole_image = NULL; /* flag for no virtual arrays */ + post->buffer = NULL; /* flag for no strip buffer */ + + /* Create the quantization buffer, if needed */ + if (cinfo->quantize_colors) { + /* The buffer strip height is max_v_samp_factor, which is typically + * an efficient number of rows for upsampling to return. + * (In the presence of output rescaling, we might want to be smarter?) + */ + post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; + if (need_full_buffer) { + /* Two-pass color quantization: need full-image storage. */ + /* We round up the number of rows to a multiple of the strip height. */ +#ifdef QUANT_2PASS_SUPPORTED + post->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + cinfo->output_width * cinfo->out_color_components, + (JDIMENSION) jround_up((long) cinfo->output_height, + (long) post->strip_height), + post->strip_height); +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + /* One-pass color quantization: just make a strip buffer. */ + post->buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width * cinfo->out_color_components, + post->strip_height); + } + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdsample.c mame-0.145/src/lib/libjpeg/jdsample.c --- mame-0.144/src/lib/libjpeg/jdsample.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdsample.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,361 @@ +/* + * jdsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2002-2008 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains upsampling routines. + * + * Upsampling input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_v_scaled_size / min_DCT_v_scaled_size) + * sample rows of each component. Upsampling will normally produce + * max_v_samp_factor pixel rows from each row group (but this could vary + * if the upsampler is applying a scale factor of its own). + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to upsample a single component */ +typedef JMETHOD(void, upsample1_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Color conversion buffer. When using separate upsampling and color + * conversion steps, this buffer holds one upsampled row group until it + * has been color converted and output. + * Note: we do not allocate any storage for component(s) which are full-size, + * ie do not need rescaling. The corresponding entry of color_buf[] is + * simply set to point to the input data array, thereby avoiding copying. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + /* Per-component upsampling method pointers */ + upsample1_ptr methods[MAX_COMPONENTS]; + + int next_row_out; /* counts rows emitted from color_buf */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ + + /* Height of an input row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_expand need not + * recompute them each time. They are unused for other upsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the conversion buffer empty */ + upsample->next_row_out = cinfo->max_v_samp_factor; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * In this version we upsample each component independently. + * We upsample one row group into the conversion buffer, then apply + * color conversion a row at a time. + */ + +METHODDEF(void) +sep_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int ci; + jpeg_component_info * compptr; + JDIMENSION num_rows; + + /* Fill the conversion buffer, if it's empty */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Invoke per-component upsample method. Notice we pass a POINTER + * to color_buf[ci], so that fullsize_upsample can change it. + */ + (*upsample->methods[ci]) (cinfo, compptr, + input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), + upsample->color_buf + ci); + } + upsample->next_row_out = 0; + } + + /* Color-convert and emit rows */ + + /* How many we have in the buffer: */ + num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); + /* Not more than the distance to the end of the image. Need this test + * in case the image height is not a multiple of max_v_samp_factor: + */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + + (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, + (JDIMENSION) upsample->next_row_out, + output_buf + *out_row_ctr, + (int) num_rows); + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + upsample->next_row_out += num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by sep_upsample to upsample pixel values + * of a single component. One row group is processed per call. + */ + + +/* + * For full-size components, we just make color_buf[ci] point at the + * input buffer, and thus avoid copying any data. Note that this is + * safe only because sep_upsample doesn't declare the input row group + * "consumed" until we are done color converting and emitting it. + */ + +METHODDEF(void) +fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = input_data; +} + + +/* + * This is a no-op version used for "uninteresting" components. + * These components will not be referenced by color conversion. + */ + +METHODDEF(void) +noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = NULL; /* safety check */ +} + + +/* + * This version handles any integral sampling ratios. + * This is not used for typical JPEG files, so it need not be fast. + * Nor, for that matter, is it particularly accurate: the algorithm is + * simple replication of the input pixel onto the corresponding output + * pixels. The hi-falutin sampling literature refers to this as a + * "box filter". A box filter tends to introduce visible artifacts, + * so if you are actually going to use 3:1 or 4:1 sampling ratios + * you would be well advised to improve this code. + */ + +METHODDEF(void) +int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + register int h; + JSAMPROW outend; + int h_expand, v_expand; + int inrow, outrow; + + h_expand = upsample->h_expand[compptr->component_index]; + v_expand = upsample->v_expand[compptr->component_index]; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + /* Generate one output row with proper horizontal expansion */ + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + for (h = h_expand; h > 0; h--) { + *outptr++ = invalue; + } + } + /* Generate any additional output rows by duplicating the first one */ + if (v_expand > 1) { + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + v_expand-1, cinfo->output_width); + } + inrow++; + outrow += v_expand; + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int outrow; + + for (outrow = 0; outrow < cinfo->max_v_samp_factor; outrow++) { + inptr = input_data[outrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow, outrow; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + 1, cinfo->output_width); + inrow++; + outrow += 2; + } +} + + +/* + * Module initialization routine for upsampling. + */ + +GLOBAL(void) +jinit_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + int ci; + jpeg_component_info * compptr; + boolean need_buffer; + int h_in_group, v_in_group, h_out_group, v_out_group; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_upsample; + upsample->pub.upsample = sep_upsample; + upsample->pub.need_context_rows = FALSE; /* until we find out differently */ + + if (cinfo->CCIR601_sampling) /* this isn't supported */ + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* Verify we can handle the sampling factors, select per-component methods, + * and create storage as needed. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "input group" after IDCT scaling. This many samples + * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. + */ + h_in_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_out_group = cinfo->max_h_samp_factor; + v_out_group = cinfo->max_v_samp_factor; + upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ + need_buffer = TRUE; + if (! compptr->component_needed) { + /* Don't bother to upsample an uninteresting component. */ + upsample->methods[ci] = noop_upsample; + need_buffer = FALSE; + } else if (h_in_group == h_out_group && v_in_group == v_out_group) { + /* Fullsize components can be processed without any work. */ + upsample->methods[ci] = fullsize_upsample; + need_buffer = FALSE; + } else if (h_in_group * 2 == h_out_group && + v_in_group == v_out_group) { + /* Special case for 2h1v upsampling */ + upsample->methods[ci] = h2v1_upsample; + } else if (h_in_group * 2 == h_out_group && + v_in_group * 2 == v_out_group) { + /* Special case for 2h2v upsampling */ + upsample->methods[ci] = h2v2_upsample; + } else if ((h_out_group % h_in_group) == 0 && + (v_out_group % v_in_group) == 0) { + /* Generic integral-factors upsampling method */ + upsample->methods[ci] = int_upsample; + upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); + upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + if (need_buffer) { + upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) jround_up((long) cinfo->output_width, + (long) cinfo->max_h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff -Nru mame-0.144/src/lib/libjpeg/jdtrans.c mame-0.145/src/lib/libjpeg/jdtrans.c --- mame-0.144/src/lib/libjpeg/jdtrans.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jdtrans.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,140 @@ +/* + * jdtrans.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding decompression, + * that is, reading raw DCT coefficient arrays from an input JPEG file. + * The routines in jdapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); + + +/* + * Read the coefficient arrays from a JPEG file. + * jpeg_read_header must be completed before calling this. + * + * The entire image is read into a set of virtual coefficient-block arrays, + * one per component. The return value is a pointer to the array of + * virtual-array descriptors. These can be manipulated directly via the + * JPEG memory manager, or handed off to jpeg_write_coefficients(). + * To release the memory occupied by the virtual arrays, call + * jpeg_finish_decompress() when done with the data. + * + * An alternative usage is to simply obtain access to the coefficient arrays + * during a buffered-image-mode decompression operation. This is allowed + * after any jpeg_finish_output() call. The arrays can be accessed until + * jpeg_finish_decompress() is called. (Note that any call to the library + * may reposition the arrays, so don't rely on access_virt_barray() results + * to stay valid across library calls.) + * + * Returns NULL if suspended. This case need be checked only if + * a suspending data source is used. + */ + +GLOBAL(jvirt_barray_ptr *) +jpeg_read_coefficients (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize active modules */ + transdecode_master_selection(cinfo); + cinfo->global_state = DSTATE_RDCOEFS; + } + if (cinfo->global_state == DSTATE_RDCOEFS) { + /* Absorb whole file into the coef buffer */ + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return NULL; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* startup underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } + /* Set state so that jpeg_finish_decompress does the right thing */ + cinfo->global_state = DSTATE_STOPPING; + } + /* At this point we should be in state DSTATE_STOPPING if being used + * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access + * to the coefficients during a full buffered-image-mode decompression. + */ + if ((cinfo->global_state == DSTATE_STOPPING || + cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { + return cinfo->coef->coef_arrays; + } + /* Oops, improper usage */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return NULL; /* keep compiler happy */ +} + + +/* + * Master selection of decompression modules for transcoding. + * This substitutes for jdmaster.c's initialization of the full decompressor. + */ + +LOCAL(void) +transdecode_master_selection (j_decompress_ptr cinfo) +{ + /* This is effectively a buffered-image operation. */ + cinfo->buffered_image = TRUE; + + /* Compute output image dimensions and related values. */ + jpeg_core_output_dimensions(cinfo); + + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); + } + + /* Always get a full-image coefficient buffer. */ + jinit_d_coef_controller(cinfo, TRUE); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + + /* Initialize progress monitoring. */ + if (cinfo->progress != NULL) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else if (cinfo->inputctl->has_multiple_scans) { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } else { + nscans = 1; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = 1; + } +} diff -Nru mame-0.144/src/lib/libjpeg/jerror.c mame-0.145/src/lib/libjpeg/jerror.c --- mame-0.144/src/lib/libjpeg/jerror.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jerror.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,252 @@ +/* + * jerror.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains simple error-reporting and trace-message routines. + * These are suitable for Unix-like systems and others where writing to + * stderr is the right thing to do. Many applications will want to replace + * some or all of these routines. + * + * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, + * you get a Windows-specific hack to display error messages in a dialog box. + * It ain't much, but it beats dropping error messages into the bit bucket, + * which is what happens to output to stderr under most Windows C compilers. + * + * These routines are used by both the compression and decompression code. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jversion.h" +#include "jerror.h" + +#ifdef USE_WINDOWS_MESSAGEBOX +#include +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif + + +/* + * Create the message string table. + * We do this from the master message list in jerror.h by re-reading + * jerror.h with a suitable definition for macro JMESSAGE. + * The message table is made an external symbol just in case any applications + * want to refer to it directly. + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_message_table jMsgTable +#endif + +#define JMESSAGE(code,string) string , + +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; + + +/* + * Error exit handler: must not return to caller. + * + * Applications may override this if they want to get control back after + * an error. Typically one would longjmp somewhere instead of exiting. + * The setjmp buffer can be made a private field within an expanded error + * handler object. Note that the info needed to generate an error message + * is stored in the error object, so you can generate the message now or + * later, at your convenience. + * You should make sure that the JPEG object is cleaned up (with jpeg_abort + * or jpeg_destroy) at some point. + */ + +METHODDEF(void) +error_exit (j_common_ptr cinfo) +{ + /* Always display the message */ + (*cinfo->err->output_message) (cinfo); + + /* Let the memory manager delete any temp files before we die */ + jpeg_destroy(cinfo); + + exit(EXIT_FAILURE); +} + + +/* + * Actual output of an error or trace message. + * Applications may override this method to send JPEG messages somewhere + * other than stderr. + * + * On Windows, printing to stderr is generally completely useless, + * so we provide optional code to produce an error-dialog popup. + * Most Windows applications will still prefer to override this routine, + * but if they don't, it'll do something at least marginally useful. + * + * NOTE: to use the library in an environment that doesn't support the + * C stdio library, you may have to delete the call to fprintf() entirely, + * not just not use this routine. + */ + +METHODDEF(void) +output_message (j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + /* Create the message */ + (*cinfo->err->format_message) (cinfo, buffer); + +#ifdef USE_WINDOWS_MESSAGEBOX + /* Display it in a message dialog box */ + MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", + MB_OK | MB_ICONERROR); +#else + /* Send it to stderr, adding a newline */ + fprintf(stderr, "%s\n", buffer); +#endif +} + + +/* + * Decide whether to emit a trace or warning message. + * msg_level is one of: + * -1: recoverable corrupt-data warning, may want to abort. + * 0: important advisory messages (always display to user). + * 1: first level of tracing detail. + * 2,3,...: successively more detailed tracing messages. + * An application might override this method if it wanted to abort on warnings + * or change the policy about which messages to display. + */ + +METHODDEF(void) +emit_message (j_common_ptr cinfo, int msg_level) +{ + struct jpeg_error_mgr * err = cinfo->err; + + if (msg_level < 0) { + /* It's a warning message. Since corrupt files may generate many warnings, + * the policy implemented here is to show only the first warning, + * unless trace_level >= 3. + */ + if (err->num_warnings == 0 || err->trace_level >= 3) + (*err->output_message) (cinfo); + /* Always count warnings in num_warnings. */ + err->num_warnings++; + } else { + /* It's a trace message. Show it if trace_level >= msg_level. */ + if (err->trace_level >= msg_level) + (*err->output_message) (cinfo); + } +} + + +/* + * Format a message string for the most recent JPEG error or message. + * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX + * characters. Note that no '\n' character is added to the string. + * Few applications should need to override this method. + */ + +METHODDEF(void) +format_message (j_common_ptr cinfo, char * buffer) +{ + struct jpeg_error_mgr * err = cinfo->err; + int msg_code = err->msg_code; + const char * msgtext = NULL; + const char * msgptr; + char ch; + boolean isstring; + + /* Look up message string in proper table */ + if (msg_code > 0 && msg_code <= err->last_jpeg_message) { + msgtext = err->jpeg_message_table[msg_code]; + } else if (err->addon_message_table != NULL && + msg_code >= err->first_addon_message && + msg_code <= err->last_addon_message) { + msgtext = err->addon_message_table[msg_code - err->first_addon_message]; + } + + /* Defend against bogus message number */ + if (msgtext == NULL) { + err->msg_parm.i[0] = msg_code; + msgtext = err->jpeg_message_table[0]; + } + + /* Check for string parameter, as indicated by %s in the message text */ + isstring = FALSE; + msgptr = msgtext; + while ((ch = *msgptr++) != '\0') { + if (ch == '%') { + if (*msgptr == 's') isstring = TRUE; + break; + } + } + + /* Format the message into the passed buffer */ + if (isstring) + sprintf(buffer, msgtext, err->msg_parm.s); + else + sprintf(buffer, msgtext, + err->msg_parm.i[0], err->msg_parm.i[1], + err->msg_parm.i[2], err->msg_parm.i[3], + err->msg_parm.i[4], err->msg_parm.i[5], + err->msg_parm.i[6], err->msg_parm.i[7]); +} + + +/* + * Reset error state variables at start of a new image. + * This is called during compression startup to reset trace/error + * processing to default state, without losing any application-specific + * method pointers. An application might possibly want to override + * this method if it has additional error processing state. + */ + +METHODDEF(void) +reset_error_mgr (j_common_ptr cinfo) +{ + cinfo->err->num_warnings = 0; + /* trace_level is not reset since it is an application-supplied parameter */ + cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ +} + + +/* + * Fill in the standard error-handling methods in a jpeg_error_mgr object. + * Typical call is: + * struct jpeg_compress_struct cinfo; + * struct jpeg_error_mgr err; + * + * cinfo.err = jpeg_std_error(&err); + * after which the application may override some of the methods. + */ + +GLOBAL(struct jpeg_error_mgr *) +jpeg_std_error (struct jpeg_error_mgr * err) +{ + err->error_exit = error_exit; + err->emit_message = emit_message; + err->output_message = output_message; + err->format_message = format_message; + err->reset_error_mgr = reset_error_mgr; + + err->trace_level = 0; /* default = no tracing */ + err->num_warnings = 0; /* no warnings emitted yet */ + err->msg_code = 0; /* may be useful as a flag for "no error" */ + + /* Initialize message table pointers */ + err->jpeg_message_table = jpeg_std_message_table; + err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; + + err->addon_message_table = NULL; + err->first_addon_message = 0; /* for safety */ + err->last_addon_message = 0; + + return err; +} diff -Nru mame-0.144/src/lib/libjpeg/jerror.h mame-0.145/src/lib/libjpeg/jerror.h --- mame-0.144/src/lib/libjpeg/jerror.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jerror.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,304 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff -Nru mame-0.144/src/lib/libjpeg/jfdctflt.c mame-0.145/src/lib/libjpeg/jfdctflt.c --- mame-0.144/src/lib/libjpeg/jfdctflt.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jfdctflt.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,174 @@ +/* + * jfdctflt.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * forward DCT (Discrete Cosine Transform). + * + * This implementation should be more accurate than either of the integer + * DCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; + FAST_FLOAT *dataptr; + JSAMPROW elemptr; + int ctr; + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7])); + tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7])); + tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6])); + tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6])); + tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5])); + tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5])); + tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4])); + tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4])); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jfdctfst.c mame-0.145/src/lib/libjpeg/jfdctfst.c --- mame-0.144/src/lib/libjpeg/jfdctfst.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jfdctfst.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,230 @@ +/* + * jfdctfst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jfdctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * Again to save a few shifts, the intermediate results between pass 1 and + * pass 2 are not upscaled, but are represented only to integral precision. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#define CONST_BITS 8 + + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ +#else +#define FIX_0_382683433 FIX(0.382683433) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_707106781 FIX(0.707106781) +#define FIX_1_306562965 FIX(1.306562965) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z1, z2, z3, z4, z5, z11, z13; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jfdctint.c mame-0.145/src/lib/libjpeg/jfdctint.c --- mame-0.144/src/lib/libjpeg/jfdctint.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jfdctint.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,4348 @@ +/* + * jfdctint.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modification developed 2003-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide FDCT routines with various input sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 output DCT block. + * + * For N<8 we fill the remaining block coefficients with zero. + * For N>8 we apply a partial N-point FDCT on the input samples, computing + * just the lower 8 frequency coefficients and discarding the rest. + * + * We must scale the output coefficients of the N-point FDCT appropriately + * to the standard 8-point FDCT level by 8/N per 1-D pass. This scaling + * is folded into the constant multipliers (pass 2) and/or final/initial + * shifting. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * In the IJG code, this factor of 8 is removed by the quantization step + * (in jcdctmgr.c), NOT in this module. + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (For 12-bit sample data, the intermediate + * array is INT32 anyway.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#ifdef DCT_SCALING_SUPPORTED + + +/* + * Perform the forward DCT on a 7x7 sample block. + */ + +GLOBAL(void) +jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)**2 = 64/49, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x6 sample block. + */ + +GLOBAL(void) +jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)**2 = 16/9, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x5 sample block. + */ + +GLOBAL(void) +jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1)); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)**2 = 64/25, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x4 sample block. + */ + +GLOBAL(void) +jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-3); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-2); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x3 sample block. + */ + +GLOBAL(void) +jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2**2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-2); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/3)**2 = 64/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x2 sample block. + */ + +GLOBAL(void) +jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + + /* Row 0 */ + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Row 1 */ + elemptr = sample_data[1] + start_col; + + tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)**2 = 2**4. + */ + + /* Column 0 */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4); + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4); + + /* Column 1 */ + data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4); + data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4); +} + + +/* + * Perform the forward DCT on a 1x1 sample block. + */ + +GLOBAL(void) +jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* We leave the result scaled up by an overall factor of 8. */ + /* We must also scale the output by (8/1)**2 = 2**6. */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) + ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6); +} + + +/* + * Perform the forward DCT on a 9x9 sample block. + */ + +GLOBAL(void) +jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2; + DCTELEM workspace[8]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/18). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]); + tmp4 = GETJSAMPLE(elemptr[4]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]); + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1); + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)), /* c6 */ + CONST_BITS-1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441)) /* c4 */ + + z1 + z2, CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608)) /* c8 */ + + z1 - z2, CONST_BITS-1); + + /* Odd part */ + + dataptr[3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)), /* c3 */ + CONST_BITS-1); + + tmp11 = MULTIPLY(tmp11, FIX(1.224744871)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525)); /* c7 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481)); /* c1 */ + + dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 9) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/9)**2 = 64/81, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/18) * 128/81. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5]; + tmp4 = dataptr[DCTSIZE*4]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5]; + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)), /* 128/81 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)), /* c6 */ + CONST_BITS+2); + z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190)) /* c4 */ + + z1 + z2, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096)) /* c8 */ + + z1 - z2, CONST_BITS+2); + + /* Odd part */ + + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)), /* c3 */ + CONST_BITS+2); + + tmp11 = MULTIPLY(tmp11, FIX(1.935399303)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879)); /* c7 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883)); /* c1 */ + + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x10 sample block. + */ + +GLOBAL(void) +jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-1); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-1); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-1); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/10)**2 = 16/25, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+2); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+2); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+2); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 11x11 sample block. + */ + +GLOBAL(void) +jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3; + DCTELEM workspace[8*3]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/22). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]); + tmp5 = GETJSAMPLE(elemptr[5]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.201263574)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156)); /* c4 */ + dataptr[2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.390975730)), /* c4+c10 */ + CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.356927976)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.587485545)), /* c8 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.788749120)), /* c8+c10 */ + CONST_BITS-1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.398430003)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.068791298)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.399818907)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.286413905)); /* c3 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 11) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/11)**2 = 64/121, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/22) * 128/121. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6]; + tmp5 = dataptr[DCTSIZE*5]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7]; + tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5, + FIX(1.057851240)), /* 128/121 */ + CONST_BITS+2); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.212906922)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479)); /* c4 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.471445400)), /* c4+c10 */ + CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.435427942)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.621472312)), /* c8 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.834379234)), /* c8+c10 */ + CONST_BITS+2); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.421479672)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.130622199)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.480800167)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.360834544)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x12 sample block. + */ + +GLOBAL(void) +jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE); + dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/12)**2 = 4/9, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 13x13 sample block. + */ + +GLOBAL(void) +jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 z1, z2; + DCTELEM workspace[8*5]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/26). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]); + tmp6 = GETJSAMPLE(elemptr[6]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) + /* c2 */ + MULTIPLY(tmp1, FIX(1.058554052)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.501487041)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.170464608)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.803364869)) - /* c8 */ + MULTIPLY(tmp5, FIX(1.252223920)), /* c4 */ + CONST_BITS); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.316450131)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.486914739)); /* (c8+c12)/2 */ + + dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.338443458)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(2.020082300)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.318774355)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.338443458)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.837223564)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(2.341699410)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.572116027)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(2.260109708)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(2.205608352)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.742345811)); /* c1+c11 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 13) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/13)**2 = 64/169, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/26) * 128/169. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7]; + tmp6 = dataptr[DCTSIZE*6]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0]; + tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6, + FIX(0.757396450)), /* 128/169 */ + CONST_BITS+1); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) + /* c2 */ + MULTIPLY(tmp1, FIX(0.801745081)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.379824504)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.129109289)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.608465700)) - /* c8 */ + MULTIPLY(tmp5, FIX(0.948429952)), /* c4 */ + CONST_BITS+1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.239678205)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.368787494)); /* (c8+c12)/2 */ + + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.256335874)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(1.530003162)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.241438564)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.256335874)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.634110155)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(1.773594819)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.190715098)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(1.711799069)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(1.670519935)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.319646532)); /* c1+c11 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x14 sample block. + */ + +GLOBAL(void) +jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/14)**2 = 16/49, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+1); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+1); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+1); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 15x15 sample block. + */ + +GLOBAL(void) +jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*7]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/30). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]); + tmp7 = GETJSAMPLE(elemptr[7]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]); + tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]); + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE); + z3 += z3; + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.437016024)), /* c12 */ + CONST_BITS); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.238241955)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.091361227)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.790569415)); /* (c6+c12)/2 */ + + dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS); + dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.224744871)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.224744871)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.575212477)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.513743148)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.176250899)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 15) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/15)**2 = 64/225, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/30) * 256/225. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0]; + tmp7 = dataptr[DCTSIZE*7]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2]; + tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1]; + tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0]; + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)), /* 256/225 */ + CONST_BITS+2); + z3 += z3; + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.497227121)), /* c12 */ + CONST_BITS+2); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.546621957)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.103948774)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.899492312)); /* (c6+c12)/2 */ + + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.393487498)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.393487498)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.654463974)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.584525538)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.476089912)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x16 sample block. + */ + +GLOBAL(void) +jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/16)**2 = 1/2**2. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+2); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+10 */ + CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+2); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x8 sample block. + * + * 16-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS+PASS1_BITS+1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x7 sample block. + * + * 14-point FDCT in pass 1 (rows), 7-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero bottom row of output coefficient block. */ + MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/14)*(8/7) = 32/49, which we + * partially fold into the constant multipliers and final shifting: + * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS+1); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x6 sample block. + * + * 12-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 2 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/12)*(8/6) = 8/9, which we + * partially fold into the constant multipliers and final shifting: + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x5 sample block. + * + * 10-point FDCT in pass 1 (rows), 5-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 3 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/10)*(8/5) = 32/25, which we + * fold into the constant multipliers: + * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 8x4 sample block. + * + * 8-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 4 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1)); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS-1); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS-1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x3 sample block. + * + * 6-point FDCT in pass 1 (rows), 3-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS-1); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1))); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1)); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1))); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x2 sample block. + * + * 4-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */ + /* 4-point FDCT kernel, */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-4); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-3); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x1 sample block. + * + * 2-point FDCT in pass 1 (rows), 1-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)*(8/1) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + + +/* + * Perform the forward DCT on an 8x16 sample block. + * + * 8-point FDCT in pass 1 (rows), 16-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+1); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 7x14 sample block. + * + * 7-point FDCT in pass 1 (rows), 14-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)*(8/14) = 32/49, which we + * fold into the constant multipliers: + * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x12 sample block. + * + * 6-point FDCT in pass 1 (rows), 12-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/12) = 8/9, which we + * fold into the constant multipliers: + * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x10 sample block. + * + * 5-point FDCT in pass 1 (rows), 10-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)*(8/10) = 32/25, which we + * fold into the constant multipliers: + * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x8 sample block. + * + * 4-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-2); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x6 sample block. + * + * 3-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x4 sample block. + * + * 2-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3); + + /* Odd part */ + + dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * 4-point FDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. + */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1); + dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 1x2 sample block. + * + * 1-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + tmp0 = GETJSAMPLE(sample_data[0][start_col]); + tmp1 = GETJSAMPLE(sample_data[1][start_col]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/1)*(8/2) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + +#endif /* DCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jidctflt.c mame-0.145/src/lib/libjpeg/jidctflt.c --- mame-0.144/src/lib/libjpeg/jidctflt.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jidctflt.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,235 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * This implementation should be more accurate than either of the integer + * IDCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a float result. + */ + +#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z5, z10, z11, z12, z13; + JCOEFPTR inptr; + FLOAT_MULT_TYPE * quantptr; + FAST_FLOAT * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int ctr; + FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 - tmp5; + + wsptr[DCTSIZE*0] = tmp0 + tmp7; + wsptr[DCTSIZE*7] = tmp0 - tmp7; + wsptr[DCTSIZE*1] = tmp1 + tmp6; + wsptr[DCTSIZE*6] = tmp1 - tmp6; + wsptr[DCTSIZE*2] = tmp2 + tmp5; + wsptr[DCTSIZE*5] = tmp2 - tmp5; + wsptr[DCTSIZE*3] = tmp3 + tmp4; + wsptr[DCTSIZE*4] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * And testing floats for zero is relatively expensive, so we don't bother. + */ + + /* Even part */ + + /* Apply signed->unsigned and prepare float->int conversion */ + z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5); + tmp10 = z5 + wsptr[4]; + tmp11 = z5 - wsptr[4]; + + tmp13 = wsptr[2] + wsptr[6]; + tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = wsptr[5] + wsptr[3]; + z10 = wsptr[5] - wsptr[3]; + z11 = wsptr[1] + wsptr[7]; + z12 = wsptr[1] - wsptr[7]; + + tmp7 = z11 + z13; + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 - tmp5; + + /* Final output stage: float->int conversion and range-limit */ + + outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK]; + outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK]; + outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK]; + outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK]; + outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK]; + outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK]; + outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK]; + outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jidctfst.c mame-0.145/src/lib/libjpeg/jidctfst.c --- mame-0.144/src/lib/libjpeg/jidctfst.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jidctfst.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,368 @@ +/* + * jidctfst.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jidctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * The dequantized coefficients are not integers because the AA&N scaling + * factors have been incorporated. We represent them scaled up by PASS1_BITS, + * so that the first and second IDCT rounds have the same input scaling. + * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to + * avoid a descaling shift; this compromises accuracy rather drastically + * for small quantization table entries, but it saves a lot of shifts. + * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, + * so we use a much larger scaling factor to preserve accuracy. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 8 +#define PASS1_BITS 2 +#else +#define CONST_BITS 8 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ +#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ +#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ +#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ +#else +#define FIX_1_082392200 FIX(1.082392200) +#define FIX_1_414213562 FIX(1.414213562) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_613125930 FIX(2.613125930) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 + * multiplication will do. For 12-bit data, the multiplier table is + * declared INT32, so a 32-bit multiply will be used. + */ + +#if BITS_IN_JSAMPLE == 8 +#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) +#else +#define DEQUANTIZE(coef,quantval) \ + DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) +#endif + + +/* Like DESCALE, but applies to a DCTELEM and produces an int. + * We assume that int right shift is unsigned if INT32 right shift is. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS DCTELEM ishift_temp; +#if BITS_IN_JSAMPLE == 8 +#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ +#else +#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ +#endif +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + +#ifdef USE_ACCURATE_ROUNDING +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) +#else +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) +#endif + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z5, z10, z11, z12, z13; + JCOEFPTR inptr; + IFAST_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS /* for DESCALE */ + ISHIFT_TEMPS /* for IDESCALE */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); + wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); + wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); + wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); + wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); + wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); + wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); + wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); + tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); + + tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); + tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) + - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; + z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; + z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; + z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jidctint.c mame-0.145/src/lib/libjpeg/jidctint.c --- mame-0.144/src/lib/libjpeg/jidctint.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jidctint.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,5137 @@ +/* + * jidctint.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modification developed 2002-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide IDCT routines with various output sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block. + * + * For N<8 we simply take the corresponding low-frequency coefficients of + * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block + * to yield the downscaled outputs. + * This can be seen as direct low-pass downsampling from the DCT domain + * point of view rather than the usual spatial domain point of view, + * yielding significant computational savings and results at least + * as good as common bilinear (averaging) spatial downsampling. + * + * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as + * lower frequencies and higher frequencies assumed to be zero. + * It turns out that the computational effort is similar to the 8x8 IDCT + * regarding the output size. + * Furthermore, the scaling and descaling is the same for all IDCT sizes. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x7 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/14). + */ + +GLOBAL(void) +jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp13 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp13 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp13 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x6 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/12). + */ + +GLOBAL(void) +jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) (tmp11 + tmp1); + wsptr[6*4] = (int) (tmp11 - tmp1); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 5x5 output block. + * + * Optimized algorithm with 5 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/10). + */ + +GLOBAL(void) +jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp0 = (INT32) wsptr[2]; + tmp1 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[4*0] = (int) (tmp10 + tmp0); + wsptr[4*3] = (int) (tmp10 - tmp0); + wsptr[4*1] = (int) (tmp12 + tmp2); + wsptr[4*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x3 output block. + * + * Optimized algorithm with 2 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/6). + */ + +GLOBAL(void) +jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + * + * Multiplication-less algorithm. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: process columns from input. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Column 0 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + /* Add fudge factor here for final descale. */ + tmp4 += ONE << 2; + + tmp0 = tmp4 + tmp5; + tmp2 = tmp4 - tmp5; + + /* Column 1 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]); + + tmp1 = tmp4 + tmp5; + tmp3 = tmp4 - tmp5; + + /* Pass 2: process 2 rows, store into output array. */ + + /* Row 0 */ + outptr = output_buf[0] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK]; + + /* Row 1 */ + outptr = output_buf[1] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + * + * We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + int dcval; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* 1x1 is trivial: just take the DC coefficient divided by 8. */ + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + dcval = DEQUANTIZE(coef_block[0], quantptr[0]); + dcval = (int) DESCALE((INT32) dcval, 3); + + output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 9x9 output block. + * + * Optimized algorithm with 10 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/18). + */ + +GLOBAL(void) +jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*9]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 9 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 9; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x10 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/20). + */ + +GLOBAL(void) +jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) (tmp22 + tmp12); + wsptr[8*7] = (int) (tmp22 - tmp12); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 11x11 output block. + * + * Optimized algorithm with 24 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/22). + */ + +GLOBAL(void) +jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*11]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 11 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 11; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x12 output block. + * + * Optimized algorithm with 15 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/24). + */ + +GLOBAL(void) +jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 13x13 output block. + * + * Optimized algorithm with 29 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/26). + */ + +GLOBAL(void) +jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*13]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 13 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 13; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x14 output block. + * + * Optimized algorithm with 20 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/28). + */ + +GLOBAL(void) +jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) (tmp23 + tmp13); + wsptr[8*10] = (int) (tmp23 - tmp13); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 15x15 output block. + * + * Optimized algorithm with 22 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/30). + */ + +GLOBAL(void) +jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*15]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 15 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 15; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[5]; + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = (INT32) wsptr[7]; + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x16 output block. + * + * Optimized algorithm with 28 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/32). + */ + +GLOBAL(void) +jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += 1 << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 16 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x8 output block. + * + * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x7 output block. + * + * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp23 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp23 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x6 output block. + * + * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS); + tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) (tmp21 + tmp11); + wsptr[8*4] = (int) (tmp21 - tmp11); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x5 output block. + * + * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x4 output block. + * + * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[8*0] = (int) (tmp10 + tmp0); + wsptr[8*3] = (int) (tmp10 - tmp0); + wsptr[8*1] = (int) (tmp12 + tmp2); + wsptr[8*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x3 output block. + * + * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x2 output block. + * + * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[4*2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + /* Odd part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + wsptr[4*0] = tmp10 + tmp0; + wsptr[4*1] = tmp10 - tmp0; + } + + /* Pass 2: process 2 rows from work array, store into output array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = wsptr[0] + (ONE << 2); + tmp2 = wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = wsptr[1]; + z3 = wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x1 output block. + * + * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: empty. */ + + /* Pass 2: process 1 row from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + outptr = output_buf[0] + output_col; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]); + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x16 output block. + * + * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x14 output block. + * + * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) (tmp23 + tmp13); + wsptr[7*10] = (int) (tmp23 - tmp13); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp23 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 6x12 output block. + * + * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + tmp12 = (INT32) wsptr[4]; + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = tmp10 - tmp20 - tmp20; + tmp20 = (INT32) wsptr[2]; + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 5x10 output block. + * + * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) (tmp22 + tmp12); + wsptr[5*7] = (int) (tmp22 - tmp12); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp13 = (INT32) wsptr[2]; + tmp14 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x8 output block. + * + * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 4; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[4*0] = dcval; + wsptr[4*1] = dcval; + wsptr[4*2] = dcval; + wsptr[4*3] = dcval; + wsptr[4*4] = dcval; + wsptr[4*5] = dcval; + wsptr[4*6] = dcval; + wsptr[4*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x6 output block. + * + * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) (tmp11 + tmp1); + wsptr[3*4] = (int) (tmp11 - tmp1); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x4 output block. + * + * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[2*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + wsptr[2*0] = tmp10 + tmp0; + wsptr[2*3] = tmp10 - tmp0; + wsptr[2*1] = tmp12 + tmp2; + wsptr[2*2] = tmp12 - tmp2; + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = wsptr[0] + (ONE << (CONST_BITS+2)); + + /* Odd part */ + + tmp0 = wsptr[1]; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 2; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 1x2 output block. + * + * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Process 1 column from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) + & RANGE_MASK]; + output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) + & RANGE_MASK]; +} + +#endif /* IDCT_SCALING_SUPPORTED */ +#endif /* DCT_ISLOW_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jinclude.h mame-0.145/src/lib/libjpeg/jinclude.h --- mame-0.144/src/lib/libjpeg/jinclude.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jinclude.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,91 @@ +/* + * jinclude.h + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file exists to provide a single place to fix any problems with + * including the wrong system include files. (Common problems are taken + * care of by the standard jconfig symbols, but on really weird systems + * you may have to edit this file.) + * + * NOTE: this file is NOT intended to be included by applications using the + * JPEG library. Most applications need only include jpeglib.h. + */ + + +/* Include auto-config file to find out which system include files we need. */ + +#include "jconfig.h" /* auto configuration options */ +#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ + +/* + * We need the NULL macro and size_t typedef. + * On an ANSI-conforming system it is sufficient to include . + * Otherwise, we get them from or ; we may have to + * pull in as well. + * Note that the core JPEG library does not require ; + * only the default error handler and data source/destination modules do. + * But we must pull it in because of the references to FILE in jpeglib.h. + * You can remove those references if you want to compile without . + */ + +#ifdef HAVE_STDDEF_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef NEED_SYS_TYPES_H +#include +#endif + +#include + +/* + * We need memory copying and zeroing functions, plus strncpy(). + * ANSI and System V implementations declare these in . + * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). + * Some systems may declare memset and memcpy in . + * + * NOTE: we assume the size parameters to these functions are of type size_t. + * Change the casts in these macros if not! + */ + +#ifdef NEED_BSD_STRINGS + +#include +#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) +#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) + +#else /* not BSD, assume ANSI/SysV string lib */ + +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) + +#endif + +/* + * In ANSI C, and indeed any rational implementation, size_t is also the + * type returned by sizeof(). However, it seems there are some irrational + * implementations out there, in which sizeof() returns an int even though + * size_t is defined as long or unsigned long. To ensure consistent results + * we always use this SIZEOF() macro in place of using sizeof() directly. + */ + +#define SIZEOF(object) ((size_t) sizeof(object)) + +/* + * The modules that use fread() and fwrite() always invoke them through + * these macros. On some systems you may need to twiddle the argument casts. + * CAUTION: argument order is different from underlying functions! + */ + +#define JFREAD(file,buf,sizeofbuf) \ + ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) +#define JFWRITE(file,buf,sizeofbuf) \ + ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff -Nru mame-0.144/src/lib/libjpeg/jmemansi.c mame-0.145/src/lib/libjpeg/jmemansi.c --- mame-0.144/src/lib/libjpeg/jmemansi.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jmemansi.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,167 @@ +/* + * jmemansi.c + * + * Copyright (C) 1992-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a simple generic implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that you have the ANSI-standard library routine tmpfile(). + * Also, the problem of determining the amount of memory available + * is shoved onto the user. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + +#ifndef SEEK_SET /* pre-ANSI systems may not define this; */ +#define SEEK_SET 0 /* if not, assume 0 is correct */ +#endif + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * It's impossible to do this in a portable way; our current solution is + * to make the user tell us (with a default value set at compile time). + * If you can actually get the available space, it's a good idea to subtract + * a slop factor of 5% or so. + */ + +#ifndef DEFAULT_MAX_MEM /* so can override from makefile */ +#define DEFAULT_MAX_MEM 1000000L /* default: one megabyte */ +#endif + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return cinfo->mem->max_memory_to_use - already_allocated; +} + + +/* + * Backing store (temporary file) management. + * Backing store objects are only used when the value returned by + * jpeg_mem_available is less than the total space needed. You can dispense + * with these routines if you have plenty of virtual memory; see jmemnobs.c. + */ + + +METHODDEF(void) +read_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFREAD(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_READ); +} + + +METHODDEF(void) +write_backing_store (j_common_ptr cinfo, backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count) +{ + if (fseek(info->temp_file, file_offset, SEEK_SET)) + ERREXIT(cinfo, JERR_TFILE_SEEK); + if (JFWRITE(info->temp_file, buffer_address, byte_count) + != (size_t) byte_count) + ERREXIT(cinfo, JERR_TFILE_WRITE); +} + + +METHODDEF(void) +close_backing_store (j_common_ptr cinfo, backing_store_ptr info) +{ + fclose(info->temp_file); + /* Since this implementation uses tmpfile() to create the file, + * no explicit file deletion is needed. + */ +} + + +/* + * Initial opening of a backing-store object. + * + * This version uses tmpfile(), which constructs a suitable file name + * behind the scenes. We don't have to use info->temp_name[] at all; + * indeed, we can't even find out the actual name of the temp file. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + if ((info->temp_file = tmpfile()) == NULL) + ERREXITS(cinfo, JERR_TFILE_CREATE, ""); + info->read_backing_store = read_backing_store; + info->write_backing_store = write_backing_store; + info->close_backing_store = close_backing_store; +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff -Nru mame-0.144/src/lib/libjpeg/jmemmgr.c mame-0.145/src/lib/libjpeg/jmemmgr.c --- mame-0.144/src/lib/libjpeg/jmemmgr.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jmemmgr.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1118 @@ +/* + * jmemmgr.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the JPEG system-independent memory management + * routines. This code is usable across a wide variety of machines; most + * of the system dependencies have been isolated in a separate file. + * The major functions provided here are: + * * pool-based allocation and freeing of memory; + * * policy decisions about how to divide available memory among the + * virtual arrays; + * * control logic for swapping virtual arrays between main memory and + * backing storage. + * The separate system-dependent file provides the actual backing-storage + * access code, and it contains the policy decision about how much total + * main memory to use. + * This file is system-dependent in the sense that some of its functions + * are unnecessary in some systems. For example, if there is enough virtual + * memory so that backing storage will never be used, much of the virtual + * array control logic could be removed. (Of course, if you have that much + * memory then you shouldn't care about a little bit of unused code...) + */ + +#define JPEG_INTERNALS +#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef NO_GETENV +#ifndef HAVE_STDLIB_H /* should declare getenv() */ +extern char * getenv JPP((const char * name)); +#endif +#endif + + +/* + * Some important notes: + * The allocation routines provided here must never return NULL. + * They should exit to error_exit if unsuccessful. + * + * It's not a good idea to try to merge the sarray and barray routines, + * even though they are textually almost the same, because samples are + * usually stored as bytes while coefficients are shorts or ints. Thus, + * in machines where byte pointers have a different representation from + * word pointers, the resulting machine code could not be the same. + */ + + +/* + * Many machines require storage alignment: longs must start on 4-byte + * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() + * always returns pointers that are multiples of the worst-case alignment + * requirement, and we had better do so too. + * There isn't any really portable way to determine the worst-case alignment + * requirement. This module assumes that the alignment requirement is + * multiples of sizeof(ALIGN_TYPE). + * By default, we define ALIGN_TYPE as double. This is necessary on some + * workstations (where doubles really do need 8-byte alignment) and will work + * fine on nearly everything. If your machine has lesser alignment needs, + * you can save a few bytes by making ALIGN_TYPE smaller. + * The only place I know of where this will NOT work is certain Macintosh + * 680x0 compilers that define double as a 10-byte IEEE extended float. + * Doing 10-byte alignment is counterproductive because longwords won't be + * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have + * such a compiler. + */ + +#ifndef ALIGN_TYPE /* so can override from jconfig.h */ +#define ALIGN_TYPE double +#endif + + +/* + * We allocate objects from "pools", where each pool is gotten with a single + * request to jpeg_get_small() or jpeg_get_large(). There is no per-object + * overhead within a pool, except for alignment padding. Each pool has a + * header with a link to the next pool of the same class. + * Small and large pool headers are identical except that the latter's + * link pointer must be FAR on 80x86 machines. + * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE + * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple + * of the alignment requirement of ALIGN_TYPE. + */ + +typedef union small_pool_struct * small_pool_ptr; + +typedef union small_pool_struct { + struct { + small_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} small_pool_hdr; + +typedef union large_pool_struct FAR * large_pool_ptr; + +typedef union large_pool_struct { + struct { + large_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} large_pool_hdr; + + +/* + * Here is the full definition of a memory manager object. + */ + +typedef struct { + struct jpeg_memory_mgr pub; /* public fields */ + + /* Each pool identifier (lifetime class) names a linked list of pools. */ + small_pool_ptr small_list[JPOOL_NUMPOOLS]; + large_pool_ptr large_list[JPOOL_NUMPOOLS]; + + /* Since we only have one lifetime class of virtual arrays, only one + * linked list is necessary (for each datatype). Note that the virtual + * array control blocks being linked together are actually stored somewhere + * in the small-pool list. + */ + jvirt_sarray_ptr virt_sarray_list; + jvirt_barray_ptr virt_barray_list; + + /* This counts total space obtained from jpeg_get_small/large */ + long total_space_allocated; + + /* alloc_sarray and alloc_barray set this value for use by virtual + * array routines. + */ + JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ +} my_memory_mgr; + +typedef my_memory_mgr * my_mem_ptr; + + +/* + * The control blocks for virtual arrays. + * Note that these blocks are allocated in the "small" pool area. + * System-dependent info for the associated backing store (if any) is hidden + * inside the backing_store_info struct. + */ + +struct jvirt_sarray_control { + JSAMPARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_sarray_ptr next; /* link to next virtual sarray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +struct jvirt_barray_control { + JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_barray_ptr next; /* link to next virtual barray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + + +#ifdef MEM_STATS /* optional extra stuff for statistics */ + +LOCAL(void) +print_mem_stats (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + + /* Since this is only a debugging stub, we can cheat a little by using + * fprintf directly rather than going through the trace message code. + * This is helpful because message parm array can't handle longs. + */ + fprintf(stderr, "Freeing pool %d, total space = %ld\n", + pool_id, mem->total_space_allocated); + + for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; + lhdr_ptr = lhdr_ptr->hdr.next) { + fprintf(stderr, " Large chunk used %ld\n", + (long) lhdr_ptr->hdr.bytes_used); + } + + for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; + shdr_ptr = shdr_ptr->hdr.next) { + fprintf(stderr, " Small chunk used %ld free %ld\n", + (long) shdr_ptr->hdr.bytes_used, + (long) shdr_ptr->hdr.bytes_left); + } +} + +#endif /* MEM_STATS */ + + +LOCAL(void) +out_of_memory (j_common_ptr cinfo, int which) +/* Report an out-of-memory error and stop execution */ +/* If we compiled MEM_STATS support, report alloc requests before dying */ +{ +#ifdef MEM_STATS + cinfo->err->trace_level = 2; /* force self_destruct to report stats */ +#endif + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); +} + + +/* + * Allocation of "small" objects. + * + * For these, we use pooled storage. When a new pool must be created, + * we try to get enough space for the current request plus a "slop" factor, + * where the slop will be the amount of leftover space in the new pool. + * The speed vs. space tradeoff is largely determined by the slop values. + * A different slop value is provided for each pool class (lifetime), + * and we also distinguish the first pool of a class from later ones. + * NOTE: the values given work fairly well on both 16- and 32-bit-int + * machines, but may be too small if longs are 64 bits or more. + */ + +static const size_t first_pool_slop[JPOOL_NUMPOOLS] = +{ + 1600, /* first PERMANENT pool */ + 16000 /* first IMAGE pool */ +}; + +static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = +{ + 0, /* additional PERMANENT pools */ + 5000 /* additional IMAGE pools */ +}; + +#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ + + +METHODDEF(void *) +alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "small" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr hdr_ptr, prev_hdr_ptr; + char * data_ptr; + size_t odd_bytes, min_request, slop; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) + out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* See if space is available in any existing pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + prev_hdr_ptr = NULL; + hdr_ptr = mem->small_list[pool_id]; + while (hdr_ptr != NULL) { + if (hdr_ptr->hdr.bytes_left >= sizeofobject) + break; /* found pool with enough space */ + prev_hdr_ptr = hdr_ptr; + hdr_ptr = hdr_ptr->hdr.next; + } + + /* Time to make a new pool? */ + if (hdr_ptr == NULL) { + /* min_request is what we need now, slop is what will be leftover */ + min_request = sizeofobject + SIZEOF(small_pool_hdr); + if (prev_hdr_ptr == NULL) /* first pool in class? */ + slop = first_pool_slop[pool_id]; + else + slop = extra_pool_slop[pool_id]; + /* Don't ask for more than MAX_ALLOC_CHUNK */ + if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) + slop = (size_t) (MAX_ALLOC_CHUNK-min_request); + /* Try to get space, if fail reduce slop and try again */ + for (;;) { + hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); + if (hdr_ptr != NULL) + break; + slop /= 2; + if (slop < MIN_SLOP) /* give up when it gets real small */ + out_of_memory(cinfo, 2); /* jpeg_get_small failed */ + } + mem->total_space_allocated += min_request + slop; + /* Success, initialize the new pool header and add to end of list */ + hdr_ptr->hdr.next = NULL; + hdr_ptr->hdr.bytes_used = 0; + hdr_ptr->hdr.bytes_left = sizeofobject + slop; + if (prev_hdr_ptr == NULL) /* first pool in class? */ + mem->small_list[pool_id] = hdr_ptr; + else + prev_hdr_ptr->hdr.next = hdr_ptr; + } + + /* OK, allocate the object from the current pool */ + data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ + data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ + hdr_ptr->hdr.bytes_used += sizeofobject; + hdr_ptr->hdr.bytes_left -= sizeofobject; + + return (void *) data_ptr; +} + + +/* + * Allocation of "large" objects. + * + * The external semantics of these are the same as "small" objects, + * except that FAR pointers are used on 80x86. However the pool + * management heuristics are quite different. We assume that each + * request is large enough that it may as well be passed directly to + * jpeg_get_large; the pool management just links everything together + * so that we can free it all on demand. + * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY + * structures. The routines that create these structures (see below) + * deliberately bunch rows together to ensure a large request size. + */ + +METHODDEF(void FAR *) +alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "large" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + large_pool_ptr hdr_ptr; + size_t odd_bytes; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) + out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* Always make a new pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject + + SIZEOF(large_pool_hdr)); + if (hdr_ptr == NULL) + out_of_memory(cinfo, 4); /* jpeg_get_large failed */ + mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); + + /* Success, initialize the new pool header and add to list */ + hdr_ptr->hdr.next = mem->large_list[pool_id]; + /* We maintain space counts in each pool header for statistical purposes, + * even though they are not needed for allocation. + */ + hdr_ptr->hdr.bytes_used = sizeofobject; + hdr_ptr->hdr.bytes_left = 0; + mem->large_list[pool_id] = hdr_ptr; + + return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ +} + + +/* + * Creation of 2-D sample arrays. + * The pointers are in near heap, the samples themselves in FAR heap. + * + * To minimize allocation overhead and to allow I/O of large contiguous + * blocks, we allocate the sample rows in groups of as many rows as possible + * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. + * NB: the virtual array control routines, later in this file, know about + * this chunking of rows. The rowsperchunk value is left in the mem manager + * object so that it can be saved away if this sarray is the workspace for + * a virtual array. + */ + +METHODDEF(JSAMPARRAY) +alloc_sarray (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, JDIMENSION numrows) +/* Allocate a 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JSAMPARRAY result; + JSAMPROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) samplesperrow * SIZEOF(JSAMPLE)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JSAMPARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JSAMPROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow + * SIZEOF(JSAMPLE))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + } + + return result; +} + + +/* + * Creation of 2-D coefficient-block arrays. + * This is essentially the same as the code for sample arrays, above. + */ + +METHODDEF(JBLOCKARRAY) +alloc_barray (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, JDIMENSION numrows) +/* Allocate a 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JBLOCKARRAY result; + JBLOCKROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) blocksperrow * SIZEOF(JBLOCK)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JBLOCKROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow + * SIZEOF(JBLOCK))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + } + + return result; +} + + +/* + * About virtual array management: + * + * The above "normal" array routines are only used to allocate strip buffers + * (as wide as the image, but just a few rows high). Full-image-sized buffers + * are handled as "virtual" arrays. The array is still accessed a strip at a + * time, but the memory manager must save the whole array for repeated + * accesses. The intended implementation is that there is a strip buffer in + * memory (as high as is possible given the desired memory limit), plus a + * backing file that holds the rest of the array. + * + * The request_virt_array routines are told the total size of the image and + * the maximum number of rows that will be accessed at once. The in-memory + * buffer must be at least as large as the maxaccess value. + * + * The request routines create control blocks but not the in-memory buffers. + * That is postponed until realize_virt_arrays is called. At that time the + * total amount of space needed is known (approximately, anyway), so free + * memory can be divided up fairly. + * + * The access_virt_array routines are responsible for making a specific strip + * area accessible (after reading or writing the backing file, if necessary). + * Note that the access routines are told whether the caller intends to modify + * the accessed strip; during a read-only pass this saves having to rewrite + * data to disk. The access routines are also responsible for pre-zeroing + * any newly accessed rows, if pre-zeroing was requested. + * + * In current usage, the access requests are usually for nonoverlapping + * strips; that is, successive access start_row numbers differ by exactly + * num_rows = maxaccess. This means we can get good performance with simple + * buffer dump/reload logic, by making the in-memory buffer be a multiple + * of the access height; then there will never be accesses across bufferload + * boundaries. The code will still work with overlapping access requests, + * but it doesn't handle bufferload overlaps very efficiently. + */ + + +METHODDEF(jvirt_sarray_ptr) +request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION samplesperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_sarray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_sarray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->samplesperrow = samplesperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ + mem->virt_sarray_list = result; + + return result; +} + + +METHODDEF(jvirt_barray_ptr) +request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION blocksperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_barray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_barray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->blocksperrow = blocksperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_barray_list; /* add to list of virtual arrays */ + mem->virt_barray_list = result; + + return result; +} + + +METHODDEF(void) +realize_virt_arrays (j_common_ptr cinfo) +/* Allocate the in-memory buffers for any unrealized virtual arrays */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + long space_per_minheight, maximum_space, avail_mem; + long minheights, max_minheights; + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + /* Compute the minimum space needed (maxaccess rows in each buffer) + * and the maximum space needed (full image height in each buffer). + * These may be of use to the system-dependent jpeg_mem_available routine. + */ + space_per_minheight = 0; + maximum_space = 0; + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) sptr->maxaccess * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + maximum_space += (long) sptr->rows_in_array * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + } + } + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) bptr->maxaccess * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + maximum_space += (long) bptr->rows_in_array * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + } + } + + if (space_per_minheight <= 0) + return; /* no unrealized arrays, no work */ + + /* Determine amount of memory to actually use; this is system-dependent. */ + avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, + mem->total_space_allocated); + + /* If the maximum space needed is available, make all the buffers full + * height; otherwise parcel it out with the same number of minheights + * in each buffer. + */ + if (avail_mem >= maximum_space) + max_minheights = 1000000000L; + else { + max_minheights = avail_mem / space_per_minheight; + /* If there doesn't seem to be enough space, try to get the minimum + * anyway. This allows a "stub" implementation of jpeg_mem_available(). + */ + if (max_minheights <= 0) + max_minheights = 1; + } + + /* Allocate the in-memory buffers and initialize backing store as needed. */ + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + sptr->rows_in_mem = sptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); + jpeg_open_backing_store(cinfo, & sptr->b_s_info, + (long) sptr->rows_in_array * + (long) sptr->samplesperrow * + (long) SIZEOF(JSAMPLE)); + sptr->b_s_open = TRUE; + } + sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, + sptr->samplesperrow, sptr->rows_in_mem); + sptr->rowsperchunk = mem->last_rowsperchunk; + sptr->cur_start_row = 0; + sptr->first_undef_row = 0; + sptr->dirty = FALSE; + } + } + + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + bptr->rows_in_mem = bptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); + jpeg_open_backing_store(cinfo, & bptr->b_s_info, + (long) bptr->rows_in_array * + (long) bptr->blocksperrow * + (long) SIZEOF(JBLOCK)); + bptr->b_s_open = TRUE; + } + bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, + bptr->blocksperrow, bptr->rows_in_mem); + bptr->rowsperchunk = mem->last_rowsperchunk; + bptr->cur_start_row = 0; + bptr->first_undef_row = 0; + bptr->dirty = FALSE; + } + } +} + + +LOCAL(void) +do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual sample array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +LOCAL(void) +do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual coefficient-block array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +METHODDEF(JSAMPARRAY) +access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual sample array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_sarray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_sarray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +METHODDEF(JBLOCKARRAY) +access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual block array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_barray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_barray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +/* + * Release all objects belonging to a specified pool. + */ + +METHODDEF(void) +free_pool (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + size_t space_freed; + + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + +#ifdef MEM_STATS + if (cinfo->err->trace_level > 1) + print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ +#endif + + /* If freeing IMAGE pool, close any virtual arrays first */ + if (pool_id == JPOOL_IMAGE) { + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->b_s_open) { /* there may be no backing store */ + sptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); + } + } + mem->virt_sarray_list = NULL; + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->b_s_open) { /* there may be no backing store */ + bptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); + } + } + mem->virt_barray_list = NULL; + } + + /* Release large objects */ + lhdr_ptr = mem->large_list[pool_id]; + mem->large_list[pool_id] = NULL; + + while (lhdr_ptr != NULL) { + large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; + space_freed = lhdr_ptr->hdr.bytes_used + + lhdr_ptr->hdr.bytes_left + + SIZEOF(large_pool_hdr); + jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + lhdr_ptr = next_lhdr_ptr; + } + + /* Release small objects */ + shdr_ptr = mem->small_list[pool_id]; + mem->small_list[pool_id] = NULL; + + while (shdr_ptr != NULL) { + small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; + space_freed = shdr_ptr->hdr.bytes_used + + shdr_ptr->hdr.bytes_left + + SIZEOF(small_pool_hdr); + jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + shdr_ptr = next_shdr_ptr; + } +} + + +/* + * Close up shop entirely. + * Note that this cannot be called unless cinfo->mem is non-NULL. + */ + +METHODDEF(void) +self_destruct (j_common_ptr cinfo) +{ + int pool; + + /* Close all backing store, release all memory. + * Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + free_pool(cinfo, pool); + } + + /* Release the memory manager control block too. */ + jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); + cinfo->mem = NULL; /* ensures I will be called only once */ + + jpeg_mem_term(cinfo); /* system-dependent cleanup */ +} + + +/* + * Memory manager initialization. + * When this is called, only the error manager pointer is valid in cinfo! + */ + +GLOBAL(void) +jinit_memory_mgr (j_common_ptr cinfo) +{ + my_mem_ptr mem; + long max_to_use; + int pool; + size_t test_mac; + + cinfo->mem = NULL; /* for safety if init fails */ + + /* Check for configuration errors. + * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably + * doesn't reflect any real hardware alignment requirement. + * The test is a little tricky: for X>0, X and X-1 have no one-bits + * in common if and only if X is a power of 2, ie has only one one-bit. + * Some compilers may give an "unreachable code" warning here; ignore it. + */ + if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) + ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); + /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be + * a multiple of SIZEOF(ALIGN_TYPE). + * Again, an "unreachable code" warning may be ignored here. + * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. + */ + test_mac = (size_t) MAX_ALLOC_CHUNK; + if ((long) test_mac != MAX_ALLOC_CHUNK || + (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + + max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ + + /* Attempt to allocate memory manager's control block */ + mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); + + if (mem == NULL) { + jpeg_mem_term(cinfo); /* system-dependent cleanup */ + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); + } + + /* OK, fill in the method pointers */ + mem->pub.alloc_small = alloc_small; + mem->pub.alloc_large = alloc_large; + mem->pub.alloc_sarray = alloc_sarray; + mem->pub.alloc_barray = alloc_barray; + mem->pub.request_virt_sarray = request_virt_sarray; + mem->pub.request_virt_barray = request_virt_barray; + mem->pub.realize_virt_arrays = realize_virt_arrays; + mem->pub.access_virt_sarray = access_virt_sarray; + mem->pub.access_virt_barray = access_virt_barray; + mem->pub.free_pool = free_pool; + mem->pub.self_destruct = self_destruct; + + /* Make MAX_ALLOC_CHUNK accessible to other modules */ + mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; + + /* Initialize working state */ + mem->pub.max_memory_to_use = max_to_use; + + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + mem->small_list[pool] = NULL; + mem->large_list[pool] = NULL; + } + mem->virt_sarray_list = NULL; + mem->virt_barray_list = NULL; + + mem->total_space_allocated = SIZEOF(my_memory_mgr); + + /* Declare ourselves open for business */ + cinfo->mem = & mem->pub; + + /* Check for an environment variable JPEGMEM; if found, override the + * default max_memory setting from jpeg_mem_init. Note that the + * surrounding application may again override this value. + * If your system doesn't support getenv(), define NO_GETENV to disable + * this feature. + */ +#ifndef NO_GETENV + { char * memenv; + + if ((memenv = getenv("JPEGMEM")) != NULL) { + char ch = 'x'; + + if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { + if (ch == 'm' || ch == 'M') + max_to_use *= 1000L; + mem->pub.max_memory_to_use = max_to_use * 1000L; + } + } + } +#endif + +} diff -Nru mame-0.144/src/lib/libjpeg/jmemsys.h mame-0.145/src/lib/libjpeg/jmemsys.h --- mame-0.144/src/lib/libjpeg/jmemsys.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jmemsys.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,198 @@ +/* + * jmemsys.h + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file defines the interface between the system-independent + * and system-dependent portions of the JPEG memory manager. No other + * modules need include it. (The system-independent portion is jmemmgr.c; + * there are several different versions of the system-dependent portion.) + * + * This file works as-is for the system-dependent memory managers supplied + * in the IJG distribution. You may need to modify it if you write a + * custom memory manager. If system-dependent changes are needed in + * this file, the best method is to #ifdef them based on a configuration + * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR + * and USE_MAC_MEMMGR. + */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_get_small jGetSmall +#define jpeg_free_small jFreeSmall +#define jpeg_get_large jGetLarge +#define jpeg_free_large jFreeLarge +#define jpeg_mem_available jMemAvail +#define jpeg_open_backing_store jOpenBackStore +#define jpeg_mem_init jMemInit +#define jpeg_mem_term jMemTerm +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* + * These two functions are used to allocate and release small chunks of + * memory. (Typically the total amount requested through jpeg_get_small is + * no more than 20K or so; this will be requested in chunks of a few K each.) + * Behavior should be the same as for the standard library functions malloc + * and free; in particular, jpeg_get_small must return NULL on failure. + * On most systems, these ARE malloc and free. jpeg_free_small is passed the + * size of the object being freed, just in case it's needed. + * On an 80x86 machine using small-data memory model, these manage near heap. + */ + +EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); +EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, + size_t sizeofobject)); + +/* + * These two functions are used to allocate and release large chunks of + * memory (up to the total free space designated by jpeg_mem_available). + * The interface is the same as above, except that on an 80x86 machine, + * far pointers are used. On most other machines these are identical to + * the jpeg_get/free_small routines; but we keep them separate anyway, + * in case a different allocation strategy is desirable for large chunks. + */ + +EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, + size_t sizeofobject)); +EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, + size_t sizeofobject)); + +/* + * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may + * be requested in a single call to jpeg_get_large (and jpeg_get_small for that + * matter, but that case should never come into play). This macro is needed + * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. + * On those machines, we expect that jconfig.h will provide a proper value. + * On machines with 32-bit flat address spaces, any large constant may be used. + * + * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type + * size_t and will be a multiple of sizeof(align_type). + */ + +#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ +#define MAX_ALLOC_CHUNK 1000000000L +#endif + +/* + * This routine computes the total space still available for allocation by + * jpeg_get_large. If more space than this is needed, backing store will be + * used. NOTE: any memory already allocated must not be counted. + * + * There is a minimum space requirement, corresponding to the minimum + * feasible buffer sizes; jmemmgr.c will request that much space even if + * jpeg_mem_available returns zero. The maximum space needed, enough to hold + * all working storage in memory, is also passed in case it is useful. + * Finally, the total space already allocated is passed. If no better + * method is available, cinfo->mem->max_memory_to_use - already_allocated + * is often a suitable calculation. + * + * It is OK for jpeg_mem_available to underestimate the space available + * (that'll just lead to more backing-store access than is really necessary). + * However, an overestimate will lead to failure. Hence it's wise to subtract + * a slop factor from the true available space. 5% should be enough. + * + * On machines with lots of virtual memory, any large constant may be returned. + * Conversely, zero may be returned to always use the minimum amount of memory. + */ + +EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, + long min_bytes_needed, + long max_bytes_needed, + long already_allocated)); + + +/* + * This structure holds whatever state is needed to access a single + * backing-store object. The read/write/close method pointers are called + * by jmemmgr.c to manipulate the backing-store object; all other fields + * are private to the system-dependent backing store routines. + */ + +#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ + + +#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ + +typedef unsigned short XMSH; /* type of extended-memory handles */ +typedef unsigned short EMSH; /* type of expanded-memory handles */ + +typedef union { + short file_handle; /* DOS file handle if it's a temp file */ + XMSH xms_handle; /* handle if it's a chunk of XMS */ + EMSH ems_handle; /* handle if it's a chunk of EMS */ +} handle_union; + +#endif /* USE_MSDOS_MEMMGR */ + +#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ +#include +#endif /* USE_MAC_MEMMGR */ + + +typedef struct backing_store_struct * backing_store_ptr; + +typedef struct backing_store_struct { + /* Methods for reading/writing/closing this backing-store object */ + JMETHOD(void, read_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, write_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, close_backing_store, (j_common_ptr cinfo, + backing_store_ptr info)); + + /* Private fields for system-dependent backing-store management */ +#ifdef USE_MSDOS_MEMMGR + /* For the MS-DOS manager (jmemdos.c), we need: */ + handle_union handle; /* reference to backing-store storage object */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else +#ifdef USE_MAC_MEMMGR + /* For the Mac manager (jmemmac.c), we need: */ + short temp_file; /* file reference number to temp file */ + FSSpec tempSpec; /* the FSSpec for the temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else + /* For a typical implementation with temp files, we need: */ + FILE * temp_file; /* stdio reference to temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ +#endif +#endif +} backing_store_info; + + +/* + * Initial opening of a backing-store object. This must fill in the + * read/write/close pointers in the object. The read/write routines + * may take an error exit if the specified maximum file size is exceeded. + * (If jpeg_mem_available always returns a large value, this routine can + * just take an error exit.) + */ + +EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, + backing_store_ptr info, + long total_bytes_needed)); + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. jpeg_mem_init will be called before anything is + * allocated (and, therefore, nothing in cinfo is of use except the error + * manager pointer). It should return a suitable default value for + * max_memory_to_use; this may subsequently be overridden by the surrounding + * application. (Note that max_memory_to_use is only important if + * jpeg_mem_available chooses to consult it ... no one else will.) + * jpeg_mem_term may assume that all requested memory has been freed and that + * all opened backing-store objects have been closed. + */ + +EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff -Nru mame-0.144/src/lib/libjpeg/jmorecfg.h mame-0.145/src/lib/libjpeg/jmorecfg.h --- mame-0.144/src/lib/libjpeg/jmorecfg.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jmorecfg.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,371 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JSAMPLE; +#ifdef CHAR_IS_UNSIGNED +#define GETJSAMPLE(value) ((int) (value)) +#else +#define GETJSAMPLE(value) ((int) (value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ + +typedef char JOCTET; +#ifdef CHAR_IS_UNSIGNED +#define GETJOCTET(value) (value) +#else +#define GETJOCTET(value) ((value) & 0xFF) +#endif /* CHAR_IS_UNSIGNED */ + +#endif /* HAVE_UNSIGNED_CHAR */ + + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ +typedef int INT32; +#endif +#endif +#endif +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#ifdef HAVE_PROTOTYPES +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define JMETHOD(type,methodname,arglist) type (*methodname) () +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifndef FAR +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif +#endif + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef int boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff -Nru mame-0.144/src/lib/libjpeg/jpegint.h mame-0.145/src/lib/libjpeg/jpegint.h --- mame-0.144/src/lib/libjpeg/jpegint.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jpegint.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,407 @@ +/* + * jpegint.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides common declarations for the various JPEG modules. + * These declarations are considered internal to the JPEG library; most + * applications using the library shouldn't need to include this file. + */ + + +/* Declarations for both compression & decompression */ + +typedef enum { /* Operating modes for buffer controllers */ + JBUF_PASS_THRU, /* Plain stripwise operation */ + /* Remaining modes require a full-image buffer to have been created */ + JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ + JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ + JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ +} J_BUF_MODE; + +/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ +#define CSTATE_START 100 /* after create_compress */ +#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ +#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ +#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ +#define DSTATE_START 200 /* after create_decompress */ +#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ +#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ +#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ +#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ +#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ +#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ +#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ +#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ +#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ +#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ + + +/* Declarations for compression modules */ + +/* Master control module */ +struct jpeg_comp_master { + JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); + JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean call_pass_startup; /* True if pass_startup must be called */ + boolean is_last_pass; /* True during last pass */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_c_main_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail)); +}; + +/* Compression preprocessing (downsampling input buffer control) */ +struct jpeg_c_prep_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, + JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_c_coef_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf)); +}; + +/* Colorspace conversion */ +struct jpeg_color_converter { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, color_convert, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows)); +}; + +/* Downsampling */ +struct jpeg_downsampler { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, downsample, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, + JDIMENSION out_row_group_index)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Forward DCT (also controls coefficient quantization) */ +typedef JMETHOD(void, forward_DCT_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); + +struct jpeg_forward_dct { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + /* It is useful to allow each component to have a separate FDCT method. */ + forward_DCT_ptr forward_DCT[MAX_COMPONENTS]; +}; + +/* Entropy encoding */ +struct jpeg_entropy_encoder { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); + JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); +}; + +/* Marker writing */ +struct jpeg_marker_writer { + JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); + JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); + /* These routines are exported to allow insertion of extra markers */ + /* Probably only COM and APPn markers should be written this way */ + JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, + unsigned int datalen)); + JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); +}; + + +/* Declarations for decompression modules */ + +/* Master control module */ +struct jpeg_decomp_master { + JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ +}; + +/* Input control module */ +struct jpeg_input_controller { + JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); + JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean has_multiple_scans; /* True if file has multiple scans */ + boolean eoi_reached; /* True when EOI has been consumed */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_d_main_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_d_coef_controller { + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); + JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, + JSAMPIMAGE output_buf)); + /* Pointer to array of coefficient virtual arrays, or NULL if none */ + jvirt_barray_ptr *coef_arrays; +}; + +/* Decompression postprocessing (color quantization buffer control) */ +struct jpeg_d_post_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Marker reading & parsing */ +struct jpeg_marker_reader { + JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); + /* Read markers until SOS or EOI. + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); + /* Read a restart marker --- exported for use by entropy decoder only */ + jpeg_marker_parser_method read_restart_marker; + + /* State of marker reader --- nominally internal, but applications + * supplying COM or APPn handlers might like to know the state. + */ + boolean saw_SOI; /* found SOI? */ + boolean saw_SOF; /* found SOF? */ + int next_restart_num; /* next restart number expected (0-7) */ + unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ +}; + +/* Entropy decoding */ +struct jpeg_entropy_decoder { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +}; + +/* Inverse DCT (also performs dequantization) */ +typedef JMETHOD(void, inverse_DCT_method_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col)); + +struct jpeg_inverse_dct { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + /* It is useful to allow each component to have a separate IDCT method. */ + inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; +}; + +/* Upsampling (note that upsampler must also call color converter) */ +struct jpeg_upsampler { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, upsample, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Colorspace conversion */ +struct jpeg_color_deconverter { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, color_convert, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows)); +}; + +/* Color quantization or color precision reduction */ +struct jpeg_color_quantizer { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); + JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, + int num_rows)); + JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); +}; + + +/* Miscellaneous useful macros */ + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +/* We assume that right shift corresponds to signed division by 2 with + * rounding towards minus infinity. This is correct for typical "arithmetic + * shift" instructions that shift in copies of the sign bit. But some + * C compilers implement >> with an unsigned shift. For these machines you + * must define RIGHT_SHIFT_IS_UNSIGNED. + * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. + * It is only applied with constant shift counts. SHIFT_TEMPS must be + * included in the variables of any routine using RIGHT_SHIFT. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define SHIFT_TEMPS INT32 shift_temp; +#define RIGHT_SHIFT(x,shft) \ + ((shift_temp = (x)) < 0 ? \ + (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ + (shift_temp >> (shft))) +#else +#define SHIFT_TEMPS +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jinit_compress_master jICompress +#define jinit_c_master_control jICMaster +#define jinit_c_main_controller jICMainC +#define jinit_c_prep_controller jICPrepC +#define jinit_c_coef_controller jICCoefC +#define jinit_color_converter jICColor +#define jinit_downsampler jIDownsampler +#define jinit_forward_dct jIFDCT +#define jinit_huff_encoder jIHEncoder +#define jinit_arith_encoder jIAEncoder +#define jinit_marker_writer jIMWriter +#define jinit_master_decompress jIDMaster +#define jinit_d_main_controller jIDMainC +#define jinit_d_coef_controller jIDCoefC +#define jinit_d_post_controller jIDPostC +#define jinit_input_controller jIInCtlr +#define jinit_marker_reader jIMReader +#define jinit_huff_decoder jIHDecoder +#define jinit_arith_decoder jIADecoder +#define jinit_inverse_dct jIIDCT +#define jinit_upsampler jIUpsampler +#define jinit_color_deconverter jIDColor +#define jinit_1pass_quantizer jI1Quant +#define jinit_2pass_quantizer jI2Quant +#define jinit_merged_upsampler jIMUpsampler +#define jinit_memory_mgr jIMemMgr +#define jdiv_round_up jDivRound +#define jround_up jRound +#define jcopy_sample_rows jCopySamples +#define jcopy_block_row jCopyBlocks +#define jzero_far jZeroFar +#define jpeg_zigzag_order jZIGTable +#define jpeg_natural_order jZAGTable +#define jpeg_natural_order7 jZAGTable7 +#define jpeg_natural_order6 jZAGTable6 +#define jpeg_natural_order5 jZAGTable5 +#define jpeg_natural_order4 jZAGTable4 +#define jpeg_natural_order3 jZAGTable3 +#define jpeg_natural_order2 jZAGTable2 +#define jpeg_aritab jAriTab +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Compression module initialization routines */ +EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, + boolean transcode_only)); +EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); +/* Decompression module initialization routines */ +EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); +/* Memory manager initialization */ +EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); + +/* Utility routines in jutils.c */ +EXTERN(long) jdiv_round_up JPP((long a, long b)); +EXTERN(long) jround_up JPP((long a, long b)); +EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols)); +EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks)); +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); +/* Constant tables in jutils.c */ +#if 0 /* This table is not actually needed in v6a */ +extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ +#endif +extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ +extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */ +extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */ +extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */ +extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */ +extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */ +extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */ + +/* Arithmetic coding probability estimation tables in jaricom.c */ +extern const INT32 jpeg_aritab[]; + +/* Suppress undefined-structure complaints if necessary. */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +#endif +#endif /* INCOMPLETE_TYPES_BROKEN */ diff -Nru mame-0.144/src/lib/libjpeg/jpeglib.h mame-0.145/src/lib/libjpeg/jpeglib.h --- mame-0.144/src/lib/libjpeg/jpeglib.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jpeglib.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1160 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". + */ + +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 3 + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. + */ + int DCT_h_scaled_size; + int DCT_v_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.txt concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +} +#endif +#endif + +#endif /* JPEGLIB_H */ diff -Nru mame-0.144/src/lib/libjpeg/jpegtran.c mame-0.145/src/lib/libjpeg/jpegtran.c --- mame-0.144/src/lib/libjpeg/jpegtran.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jpegtran.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,560 @@ +/* + * jpegtran.c + * + * Copyright (C) 1995-2010, Thomas G. Lane, Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a command-line user interface for JPEG transcoding. + * It is very similar to cjpeg.c, and partly to djpeg.c, but provides + * lossless transcoding between different JPEG file formats. It also + * provides some lossless and sort-of-lossless transformations of JPEG data. + */ + +#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ +#include "transupp.h" /* Support routines for jpegtran */ +#include "jversion.h" /* for version message */ + +#ifdef USE_CCOMMAND /* command-line reader for Macintosh */ +#ifdef __MWERKS__ +#include /* Metrowerks needs this */ +#include /* ... and this */ +#endif +#ifdef THINK_C +#include /* Think declares it here */ +#endif +#endif + + +/* + * Argument-parsing code. + * The switch parser is designed to be useful with DOS-style command line + * syntax, ie, intermixed switches and file names, where only the switches + * to the left of a given file name affect processing of that file. + * The main program in this file doesn't actually use this capability... + */ + + +static const char * progname; /* program name for error messages */ +static char * outfilename; /* for -outfile switch */ +static char * scaleoption; /* -scale switch */ +static JCOPY_OPTION copyoption; /* -copy switch */ +static jpeg_transform_info transformoption; /* image transformation options */ + + +LOCAL(void) +usage (void) +/* complain about bad command line */ +{ + fprintf(stderr, "usage: %s [switches] ", progname); +#ifdef TWO_FILE_COMMANDLINE + fprintf(stderr, "inputfile outputfile\n"); +#else + fprintf(stderr, "[inputfile]\n"); +#endif + + fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -copy none Copy no extra markers from source file\n"); + fprintf(stderr, " -copy comments Copy only comment markers (default)\n"); + fprintf(stderr, " -copy all Copy all extra markers\n"); +#ifdef ENTROPY_OPT_SUPPORTED + fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); +#endif +#ifdef C_PROGRESSIVE_SUPPORTED + fprintf(stderr, " -progressive Create progressive JPEG file\n"); +#endif + fprintf(stderr, "Switches for modifying the image:\n"); +#if TRANSFORMS_SUPPORTED + fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n"); + fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n"); + fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n"); + fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n"); + fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n"); +#endif + fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n"); +#if TRANSFORMS_SUPPORTED + fprintf(stderr, " -transpose Transpose image\n"); + fprintf(stderr, " -transverse Transverse transpose image\n"); + fprintf(stderr, " -trim Drop non-transformable edge blocks\n"); +#endif + fprintf(stderr, "Switches for advanced users:\n"); + fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); + fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); + fprintf(stderr, " -outfile name Specify name for output file\n"); + fprintf(stderr, " -verbose or -debug Emit debug output\n"); + fprintf(stderr, "Switches for wizards:\n"); +#ifdef C_ARITH_CODING_SUPPORTED + fprintf(stderr, " -arithmetic Use arithmetic coding\n"); +#endif +#ifdef C_MULTISCAN_FILES_SUPPORTED + fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); +#endif + exit(EXIT_FAILURE); +} + + +LOCAL(void) +select_transform (JXFORM_CODE transform) +/* Silly little routine to detect multiple transform options, + * which we can't handle. + */ +{ +#if TRANSFORMS_SUPPORTED + if (transformoption.transform == JXFORM_NONE || + transformoption.transform == transform) { + transformoption.transform = transform; + } else { + fprintf(stderr, "%s: can only do one image transformation at a time\n", + progname); + usage(); + } +#else + fprintf(stderr, "%s: sorry, image transformation was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif +} + + +LOCAL(int) +parse_switches (j_compress_ptr cinfo, int argc, char **argv, + int last_file_arg_seen, boolean for_real) +/* Parse optional switches. + * Returns argv[] index of first file-name argument (== argc if none). + * Any file names with indexes <= last_file_arg_seen are ignored; + * they have presumably been processed in a previous iteration. + * (Pass 0 for last_file_arg_seen on the first or only iteration.) + * for_real is FALSE on the first (dummy) pass; we may skip any expensive + * processing. + */ +{ + int argn; + char * arg; + boolean simple_progressive; + char * scansarg = NULL; /* saves -scans parm if any */ + + /* Set up default JPEG parameters. */ + simple_progressive = FALSE; + outfilename = NULL; + scaleoption = NULL; + copyoption = JCOPYOPT_DEFAULT; + transformoption.transform = JXFORM_NONE; + transformoption.perfect = FALSE; + transformoption.trim = FALSE; + transformoption.force_grayscale = FALSE; + transformoption.crop = FALSE; + cinfo->err->trace_level = 0; + + /* Scan command line options, adjust parameters */ + + for (argn = 1; argn < argc; argn++) { + arg = argv[argn]; + if (*arg != '-') { + /* Not a switch, must be a file name argument */ + if (argn <= last_file_arg_seen) { + outfilename = NULL; /* -outfile applies to just one input file */ + continue; /* ignore this name if previously processed */ + } + break; /* else done parsing switches */ + } + arg++; /* advance past switch marker character */ + + if (keymatch(arg, "arithmetic", 1)) { + /* Use arithmetic coding. */ +#ifdef C_ARITH_CODING_SUPPORTED + cinfo->arith_code = TRUE; +#else + fprintf(stderr, "%s: sorry, arithmetic coding not supported\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "copy", 2)) { + /* Select which extra markers to copy. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "none", 1)) { + copyoption = JCOPYOPT_NONE; + } else if (keymatch(argv[argn], "comments", 1)) { + copyoption = JCOPYOPT_COMMENTS; + } else if (keymatch(argv[argn], "all", 1)) { + copyoption = JCOPYOPT_ALL; + } else + usage(); + + } else if (keymatch(arg, "crop", 2)) { + /* Perform lossless cropping. */ +#if TRANSFORMS_SUPPORTED + if (++argn >= argc) /* advance to next argument */ + usage(); + if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) { + fprintf(stderr, "%s: bogus -crop argument '%s'\n", + progname, argv[argn]); + exit(EXIT_FAILURE); + } +#else + select_transform(JXFORM_NONE); /* force an error */ +#endif + + } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) { + /* Enable debug printouts. */ + /* On first -d, print version identification */ + static boolean printed_version = FALSE; + + if (! printed_version) { + fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n", + JVERSION, JCOPYRIGHT); + printed_version = TRUE; + } + cinfo->err->trace_level++; + + } else if (keymatch(arg, "flip", 1)) { + /* Mirror left-right or top-bottom. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "horizontal", 1)) + select_transform(JXFORM_FLIP_H); + else if (keymatch(argv[argn], "vertical", 1)) + select_transform(JXFORM_FLIP_V); + else + usage(); + + } else if (keymatch(arg, "grayscale", 1) || keymatch(arg, "greyscale",1)) { + /* Force to grayscale. */ +#if TRANSFORMS_SUPPORTED + transformoption.force_grayscale = TRUE; +#else + select_transform(JXFORM_NONE); /* force an error */ +#endif + + } else if (keymatch(arg, "maxmemory", 3)) { + /* Maximum memory in Kb (or Mb with 'm'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (ch == 'm' || ch == 'M') + lval *= 1000L; + cinfo->mem->max_memory_to_use = lval * 1000L; + + } else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) { + /* Enable entropy parm optimization. */ +#ifdef ENTROPY_OPT_SUPPORTED + cinfo->optimize_coding = TRUE; +#else + fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "outfile", 4)) { + /* Set output file name. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + outfilename = argv[argn]; /* save it away for later use */ + + } else if (keymatch(arg, "perfect", 2)) { + /* Fail if there is any partial edge MCUs that the transform can't + * handle. */ + transformoption.perfect = TRUE; + + } else if (keymatch(arg, "progressive", 2)) { + /* Select simple progressive mode. */ +#ifdef C_PROGRESSIVE_SUPPORTED + simple_progressive = TRUE; + /* We must postpone execution until num_components is known. */ +#else + fprintf(stderr, "%s: sorry, progressive output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "restart", 1)) { + /* Restart interval in MCU rows (or in MCUs with 'b'). */ + long lval; + char ch = 'x'; + + if (++argn >= argc) /* advance to next argument */ + usage(); + if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1) + usage(); + if (lval < 0 || lval > 65535L) + usage(); + if (ch == 'b' || ch == 'B') { + cinfo->restart_interval = (unsigned int) lval; + cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */ + } else { + cinfo->restart_in_rows = (int) lval; + /* restart_interval will be computed during startup */ + } + + } else if (keymatch(arg, "rotate", 2)) { + /* Rotate 90, 180, or 270 degrees (measured clockwise). */ + if (++argn >= argc) /* advance to next argument */ + usage(); + if (keymatch(argv[argn], "90", 2)) + select_transform(JXFORM_ROT_90); + else if (keymatch(argv[argn], "180", 3)) + select_transform(JXFORM_ROT_180); + else if (keymatch(argv[argn], "270", 3)) + select_transform(JXFORM_ROT_270); + else + usage(); + + } else if (keymatch(arg, "scale", 4)) { + /* Scale the output image by a fraction M/N. */ + if (++argn >= argc) /* advance to next argument */ + usage(); + scaleoption = argv[argn]; + /* We must postpone processing until decompression startup. */ + + } else if (keymatch(arg, "scans", 1)) { + /* Set scan script. */ +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (++argn >= argc) /* advance to next argument */ + usage(); + scansarg = argv[argn]; + /* We must postpone reading the file in case -progressive appears. */ +#else + fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n", + progname); + exit(EXIT_FAILURE); +#endif + + } else if (keymatch(arg, "transpose", 1)) { + /* Transpose (across UL-to-LR axis). */ + select_transform(JXFORM_TRANSPOSE); + + } else if (keymatch(arg, "transverse", 6)) { + /* Transverse transpose (across UR-to-LL axis). */ + select_transform(JXFORM_TRANSVERSE); + + } else if (keymatch(arg, "trim", 3)) { + /* Trim off any partial edge MCUs that the transform can't handle. */ + transformoption.trim = TRUE; + + } else { + usage(); /* bogus switch */ + } + } + + /* Post-switch-scanning cleanup */ + + if (for_real) { + +#ifdef C_PROGRESSIVE_SUPPORTED + if (simple_progressive) /* process -progressive; -scans can override */ + jpeg_simple_progression(cinfo); +#endif + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (scansarg != NULL) /* process -scans if it was present */ + if (! read_scan_script(cinfo, scansarg)) + usage(); +#endif + } + + return argn; /* return index of next arg (file name) */ +} + + +/* + * The main program. + */ + +int +main (int argc, char **argv) +{ + struct jpeg_decompress_struct srcinfo; + struct jpeg_compress_struct dstinfo; + struct jpeg_error_mgr jsrcerr, jdsterr; +#ifdef PROGRESS_REPORT + struct cdjpeg_progress_mgr progress; +#endif + jvirt_barray_ptr * src_coef_arrays; + jvirt_barray_ptr * dst_coef_arrays; + int file_index; + /* We assume all-in-memory processing and can therefore use only a + * single file pointer for sequential input and output operation. + */ + FILE * fp; + + /* On Mac, fetch a command line. */ +#ifdef USE_CCOMMAND + argc = ccommand(&argv); +#endif + + progname = argv[0]; + if (progname == NULL || progname[0] == 0) + progname = "jpegtran"; /* in case C library doesn't provide it */ + + /* Initialize the JPEG decompression object with default error handling. */ + srcinfo.err = jpeg_std_error(&jsrcerr); + jpeg_create_decompress(&srcinfo); + /* Initialize the JPEG compression object with default error handling. */ + dstinfo.err = jpeg_std_error(&jdsterr); + jpeg_create_compress(&dstinfo); + + /* Now safe to enable signal catcher. + * Note: we assume only the decompression object will have virtual arrays. + */ +#ifdef NEED_SIGNAL_CATCHER + enable_signal_catcher((j_common_ptr) &srcinfo); +#endif + + /* Scan command line to find file names. + * It is convenient to use just one switch-parsing routine, but the switch + * values read here are mostly ignored; we will rescan the switches after + * opening the input file. Also note that most of the switches affect the + * destination JPEG object, so we parse into that and then copy over what + * needs to affects the source too. + */ + + file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE); + jsrcerr.trace_level = jdsterr.trace_level; + srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use; + +#ifdef TWO_FILE_COMMANDLINE + /* Must have either -outfile switch or explicit output file name */ + if (outfilename == NULL) { + if (file_index != argc-2) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + outfilename = argv[file_index+1]; + } else { + if (file_index != argc-1) { + fprintf(stderr, "%s: must name one input and one output file\n", + progname); + usage(); + } + } +#else + /* Unix style: expect zero or one file name */ + if (file_index < argc-1) { + fprintf(stderr, "%s: only one input file\n", progname); + usage(); + } +#endif /* TWO_FILE_COMMANDLINE */ + + /* Open the input file. */ + if (file_index < argc) { + if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]); + exit(EXIT_FAILURE); + } + } else { + /* default input file is stdin */ + fp = read_stdin(); + } + +#ifdef PROGRESS_REPORT + start_progress_monitor((j_common_ptr) &dstinfo, &progress); +#endif + + /* Specify data source for decompression */ + jpeg_stdio_src(&srcinfo, fp); + + /* Enable saving of extra markers that we want to copy */ + jcopy_markers_setup(&srcinfo, copyoption); + + /* Read file header */ + (void) jpeg_read_header(&srcinfo, TRUE); + + /* Adjust default decompression parameters */ + if (scaleoption != NULL) + if (sscanf(scaleoption, "%d/%d", + &srcinfo.scale_num, &srcinfo.scale_denom) < 1) + usage(); + + /* Any space needed by a transform option must be requested before + * jpeg_read_coefficients so that memory allocation will be done right. + */ +#if TRANSFORMS_SUPPORTED + /* Fail right away if -perfect is given and transformation is not perfect. + */ + if (!jtransform_request_workspace(&srcinfo, &transformoption)) { + fprintf(stderr, "%s: transformation is not perfect\n", progname); + exit(EXIT_FAILURE); + } +#endif + + /* Read source file as DCT coefficients */ + src_coef_arrays = jpeg_read_coefficients(&srcinfo); + + /* Initialize destination compression parameters from source values */ + jpeg_copy_critical_parameters(&srcinfo, &dstinfo); + + /* Adjust destination parameters if required by transform options; + * also find out which set of coefficient arrays will hold the output. + */ +#if TRANSFORMS_SUPPORTED + dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo, + src_coef_arrays, + &transformoption); +#else + dst_coef_arrays = src_coef_arrays; +#endif + + /* Close input file, if we opened it. + * Note: we assume that jpeg_read_coefficients consumed all input + * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will + * only consume more while (! cinfo->inputctl->eoi_reached). + * We cannot call jpeg_finish_decompress here since we still need the + * virtual arrays allocated from the source object for processing. + */ + if (fp != stdin) + fclose(fp); + + /* Open the output file. */ + if (outfilename != NULL) { + if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) { + fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename); + exit(EXIT_FAILURE); + } + } else { + /* default output file is stdout */ + fp = write_stdout(); + } + + /* Adjust default compression parameters by re-parsing the options */ + file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE); + + /* Specify data destination for compression */ + jpeg_stdio_dest(&dstinfo, fp); + + /* Start compressor (note no image data is actually written here) */ + jpeg_write_coefficients(&dstinfo, dst_coef_arrays); + + /* Copy to the output file any extra markers that we want to preserve */ + jcopy_markers_execute(&srcinfo, &dstinfo, copyoption); + + /* Execute image transformation, if any */ +#if TRANSFORMS_SUPPORTED + jtransform_execute_transformation(&srcinfo, &dstinfo, + src_coef_arrays, + &transformoption); +#endif + + /* Finish compression and release memory */ + jpeg_finish_compress(&dstinfo); + jpeg_destroy_compress(&dstinfo); + (void) jpeg_finish_decompress(&srcinfo); + jpeg_destroy_decompress(&srcinfo); + + /* Close output file, if we opened it */ + if (fp != stdout) + fclose(fp); + +#ifdef PROGRESS_REPORT + end_progress_monitor((j_common_ptr) &dstinfo); +#endif + + /* All done. */ + exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS); + return 0; /* suppress no-return-value warnings */ +} diff -Nru mame-0.144/src/lib/libjpeg/jquant1.c mame-0.145/src/lib/libjpeg/jquant1.c --- mame-0.144/src/lib/libjpeg/jquant1.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jquant1.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,856 @@ +/* + * jquant1.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 1-pass color quantization (color mapping) routines. + * These routines provide mapping to a fixed color map using equally spaced + * color values. Optional Floyd-Steinberg or ordered dithering is available. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_1PASS_SUPPORTED + + +/* + * The main purpose of 1-pass quantization is to provide a fast, if not very + * high quality, colormapped output capability. A 2-pass quantizer usually + * gives better visual quality; however, for quantized grayscale output this + * quantizer is perfectly adequate. Dithering is highly recommended with this + * quantizer, though you can turn it off if you really want to. + * + * In 1-pass quantization the colormap must be chosen in advance of seeing the + * image. We use a map consisting of all combinations of Ncolors[i] color + * values for the i'th component. The Ncolors[] values are chosen so that + * their product, the total number of colors, is no more than that requested. + * (In most cases, the product will be somewhat less.) + * + * Since the colormap is orthogonal, the representative value for each color + * component can be determined without considering the other components; + * then these indexes can be combined into a colormap index by a standard + * N-dimensional-array-subscript calculation. Most of the arithmetic involved + * can be precalculated and stored in the lookup table colorindex[]. + * colorindex[i][j] maps pixel value j in component i to the nearest + * representative value (grid plane) for that component; this index is + * multiplied by the array stride for component i, so that the + * index of the colormap entry closest to a given pixel value is just + * sum( colorindex[component-number][pixel-component-value] ) + * Aside from being fast, this scheme allows for variable spacing between + * representative values with no additional lookup cost. + * + * If gamma correction has been applied in color conversion, it might be wise + * to adjust the color grid spacing so that the representative colors are + * equidistant in linear space. At this writing, gamma correction is not + * implemented by jdcolor, so nothing is done here. + */ + + +/* Declarations for ordered dithering. + * + * We use a standard 16x16 ordered dither array. The basic concept of ordered + * dithering is described in many references, for instance Dale Schumacher's + * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). + * In place of Schumacher's comparisons against a "threshold" value, we add a + * "dither" value to the input pixel and then round the result to the nearest + * output value. The dither value is equivalent to (0.5 - threshold) times + * the distance between output values. For ordered dithering, we assume that + * the output colors are equally spaced; if not, results will probably be + * worse, since the dither may be too much or too little at a given point. + * + * The normal calculation would be to form pixel value + dither, range-limit + * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. + * We can skip the separate range-limiting step by extending the colorindex + * table in both directions. + */ + +#define ODITHER_SIZE 16 /* dimension of dither matrix */ +/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ +#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ +#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ + +typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; +typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; + +static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { + /* Bayer's order-4 dither array. Generated by the code given in + * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. + * The values in this array must range from 0 to ODITHER_CELLS-1. + */ + { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, + { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, + { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, + { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, + { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, + { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, + { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, + { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, + { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, + { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, + { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, + { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, + { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, + { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, + { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, + { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } +}; + + +/* Declarations for Floyd-Steinberg dithering. + * + * Errors are accumulated into the array fserrors[], at a resolution of + * 1/16th of a pixel count. The error at a given pixel is propagated + * to its not-yet-processed neighbors using the standard F-S fractions, + * ... (here) 7/16 + * 3/16 5/16 1/16 + * We work left-to-right on even rows, right-to-left on odd rows. + * + * We can get away with a single array (holding one row's worth of errors) + * by using it to store the current row's errors at pixel columns not yet + * processed, but the next row's errors at columns already processed. We + * need only a few extra variables to hold the errors immediately around the + * current column. (If we are lucky, those variables are in registers, but + * even if not, they're probably cheaper to access than array elements are.) + * + * The fserrors[] array is indexed [component#][position]. + * We provide (#columns + 2) entries per component; the extra entry at each + * end saves us from special-casing the first and last pixels. + * + * Note: on a wide image, we might not have enough room in a PC's near data + * segment to hold the error array; so it is allocated with alloc_large. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef INT16 FSERROR; /* 16 bits should be enough */ +typedef int LOCFSERROR; /* use 'int' for calculation temps */ +#else +typedef INT32 FSERROR; /* may need more than 16 bits */ +typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ +#endif + +typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ + + +/* Private subobject */ + +#define MAX_Q_COMPS 4 /* max components I can handle */ + +typedef struct { + struct jpeg_color_quantizer pub; /* public fields */ + + /* Initially allocated colormap is saved here */ + JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ + int sv_actual; /* number of entries in use */ + + JSAMPARRAY colorindex; /* Precomputed mapping for speed */ + /* colorindex[i][j] = index of color closest to pixel value j in component i, + * premultiplied as described above. Since colormap indexes must fit into + * JSAMPLEs, the entries of this array will too. + */ + boolean is_padded; /* is the colorindex padded for odither? */ + + int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ + + /* Variables for ordered dithering */ + int row_index; /* cur row's vertical index in dither matrix */ + ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ + + /* Variables for Floyd-Steinberg dithering */ + FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ + boolean on_odd_row; /* flag to remember which row we are on */ +} my_cquantizer; + +typedef my_cquantizer * my_cquantize_ptr; + + +/* + * Policy-making subroutines for create_colormap and create_colorindex. + * These routines determine the colormap to be used. The rest of the module + * only assumes that the colormap is orthogonal. + * + * * select_ncolors decides how to divvy up the available colors + * among the components. + * * output_value defines the set of representative values for a component. + * * largest_input_value defines the mapping from input values to + * representative values for a component. + * Note that the latter two routines may impose different policies for + * different components, though this is not currently done. + */ + + +LOCAL(int) +select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) +/* Determine allocation of desired colors to components, */ +/* and fill in Ncolors[] array to indicate choice. */ +/* Return value is total number of colors (product of Ncolors[] values). */ +{ + int nc = cinfo->out_color_components; /* number of color components */ + int max_colors = cinfo->desired_number_of_colors; + int total_colors, iroot, i, j; + boolean changed; + long temp; + static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; + + /* We can allocate at least the nc'th root of max_colors per component. */ + /* Compute floor(nc'th root of max_colors). */ + iroot = 1; + do { + iroot++; + temp = iroot; /* set temp = iroot ** nc */ + for (i = 1; i < nc; i++) + temp *= iroot; + } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ + iroot--; /* now iroot = floor(root) */ + + /* Must have at least 2 color values per component */ + if (iroot < 2) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); + + /* Initialize to iroot color values for each component */ + total_colors = 1; + for (i = 0; i < nc; i++) { + Ncolors[i] = iroot; + total_colors *= iroot; + } + /* We may be able to increment the count for one or more components without + * exceeding max_colors, though we know not all can be incremented. + * Sometimes, the first component can be incremented more than once! + * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) + * In RGB colorspace, try to increment G first, then R, then B. + */ + do { + changed = FALSE; + for (i = 0; i < nc; i++) { + j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); + /* calculate new total_colors if Ncolors[j] is incremented */ + temp = total_colors / Ncolors[j]; + temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ + if (temp > (long) max_colors) + break; /* won't fit, done with this pass */ + Ncolors[j]++; /* OK, apply the increment */ + total_colors = (int) temp; + changed = TRUE; + } + } while (changed); + + return total_colors; +} + + +LOCAL(int) +output_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return j'th output value, where j will range from 0 to maxj */ +/* The output values must fall in 0..MAXJSAMPLE in increasing order */ +{ + /* We always provide values 0 and MAXJSAMPLE for each component; + * any additional values are equally spaced between these limits. + * (Forcing the upper and lower values to the limits ensures that + * dithering can't produce a color outside the selected gamut.) + */ + return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); +} + + +LOCAL(int) +largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return largest input value that should map to j'th output value */ +/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ +{ + /* Breakpoints are halfway between values returned by output_value */ + return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); +} + + +/* + * Create the colormap. + */ + +LOCAL(void) +create_colormap (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colormap; /* Created colormap */ + int total_colors; /* Number of distinct output colors */ + int i,j,k, nci, blksize, blkdist, ptr, val; + + /* Select number of colors for each component */ + total_colors = select_ncolors(cinfo, cquantize->Ncolors); + + /* Report selected color counts */ + if (cinfo->out_color_components == 3) + TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, + total_colors, cquantize->Ncolors[0], + cquantize->Ncolors[1], cquantize->Ncolors[2]); + else + TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); + + /* Allocate and fill in the colormap. */ + /* The colors are ordered in the map in standard row-major order, */ + /* i.e. rightmost (highest-indexed) color changes most rapidly. */ + + colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + /* blkdist is distance between groups of identical entries for a component */ + blkdist = total_colors; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colormap entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blkdist / nci; + for (j = 0; j < nci; j++) { + /* Compute j'th output value (out of nci) for component */ + val = output_value(cinfo, i, j, nci-1); + /* Fill in all colormap entries that have this value of this component */ + for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { + /* fill in blksize entries beginning at ptr */ + for (k = 0; k < blksize; k++) + colormap[i][ptr+k] = (JSAMPLE) val; + } + } + blkdist = blksize; /* blksize of this color is blkdist of next */ + } + + /* Save the colormap in private storage, + * where it will survive color quantization mode changes. + */ + cquantize->sv_colormap = colormap; + cquantize->sv_actual = total_colors; +} + + +/* + * Create the color index table. + */ + +LOCAL(void) +create_colorindex (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPROW indexptr; + int i,j,k, nci, blksize, val, pad; + + /* For ordered dither, we pad the color index tables by MAXJSAMPLE in + * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). + * This is not necessary in the other dithering modes. However, we + * flag whether it was done in case user changes dithering mode. + */ + if (cinfo->dither_mode == JDITHER_ORDERED) { + pad = MAXJSAMPLE*2; + cquantize->is_padded = TRUE; + } else { + pad = 0; + cquantize->is_padded = FALSE; + } + + cquantize->colorindex = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (MAXJSAMPLE+1 + pad), + (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + blksize = cquantize->sv_actual; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colorindex entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blksize / nci; + + /* adjust colorindex pointers to provide padding at negative indexes. */ + if (pad) + cquantize->colorindex[i] += MAXJSAMPLE; + + /* in loop, val = index of current output value, */ + /* and k = largest j that maps to current val */ + indexptr = cquantize->colorindex[i]; + val = 0; + k = largest_input_value(cinfo, i, 0, nci-1); + for (j = 0; j <= MAXJSAMPLE; j++) { + while (j > k) /* advance val if past boundary */ + k = largest_input_value(cinfo, i, ++val, nci-1); + /* premultiply so that no multiplication needed in main processing */ + indexptr[j] = (JSAMPLE) (val * blksize); + } + /* Pad at both ends if necessary */ + if (pad) + for (j = 1; j <= MAXJSAMPLE; j++) { + indexptr[-j] = indexptr[0]; + indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; + } + } +} + + +/* + * Create an ordered-dither array for a component having ncolors + * distinct output values. + */ + +LOCAL(ODITHER_MATRIX_PTR) +make_odither_array (j_decompress_ptr cinfo, int ncolors) +{ + ODITHER_MATRIX_PTR odither; + int j,k; + INT32 num,den; + + odither = (ODITHER_MATRIX_PTR) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ODITHER_MATRIX)); + /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). + * Hence the dither value for the matrix cell with fill order f + * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). + * On 16-bit-int machine, be careful to avoid overflow. + */ + den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); + for (j = 0; j < ODITHER_SIZE; j++) { + for (k = 0; k < ODITHER_SIZE; k++) { + num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) + * MAXJSAMPLE; + /* Ensure round towards zero despite C's lack of consistency + * about rounding negative values in integer division... + */ + odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); + } + } + return odither; +} + + +/* + * Create the ordered-dither tables. + * Components having the same number of representative colors may + * share a dither table. + */ + +LOCAL(void) +create_odither_tables (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + ODITHER_MATRIX_PTR odither; + int i, j, nci; + + for (i = 0; i < cinfo->out_color_components; i++) { + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + odither = NULL; /* search for matching prior component */ + for (j = 0; j < i; j++) { + if (nci == cquantize->Ncolors[j]) { + odither = cquantize->odither[j]; + break; + } + } + if (odither == NULL) /* need a new table? */ + odither = make_odither_array(cinfo, nci); + cquantize->odither[i] = odither; + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colorindex = cquantize->colorindex; + register int pixcode, ci; + register JSAMPROW ptrin, ptrout; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + register int nc = cinfo->out_color_components; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = 0; + for (ci = 0; ci < nc; ci++) { + pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); + } + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW ptrin, ptrout; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + int * dither; /* points to active row of dither matrix */ + int row_index, col_index; /* current indexes into dither matrix */ + int nc = cinfo->out_color_components; + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + row_index = cquantize->row_index; + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + colorindex_ci = cquantize->colorindex[ci]; + dither = cquantize->odither[ci][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, + * select output value, accumulate into output code for this pixel. + * Range-limiting need not be done explicitly, as we have extended + * the colorindex table to produce the right answers for out-of-range + * inputs. The maximum dither is +- MAXJSAMPLE; this sets the + * required amount of padding. + */ + *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; + input_ptr += nc; + output_ptr++; + col_index = (col_index + 1) & ODITHER_MASK; + } + } + /* Advance row index for next row */ + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int * dither0; /* points to active row of dither matrix */ + int * dither1; + int * dither2; + int row_index, col_index; /* current indexes into dither matrix */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + row_index = cquantize->row_index; + input_ptr = input_buf[row]; + output_ptr = output_buf[row]; + dither0 = cquantize->odither[0][row_index]; + dither1 = cquantize->odither[1][row_index]; + dither2 = cquantize->odither[2][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + + dither0[col_index]]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + + dither1[col_index]]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + + dither2[col_index]]); + *output_ptr++ = (JSAMPLE) pixcode; + col_index = (col_index + 1) & ODITHER_MASK; + } + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register LOCFSERROR cur; /* current error or pixel value */ + LOCFSERROR belowerr; /* error for pixel below cur */ + LOCFSERROR bpreverr; /* error for below/prev col */ + LOCFSERROR bnexterr; /* error for below/next col */ + LOCFSERROR delta; + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + JSAMPROW colormap_ci; + int pixcode; + int nc = cinfo->out_color_components; + int dir; /* 1 for left-to-right, -1 for right-to-left */ + int dirnc; /* dir * nc */ + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + input_ptr += (width-1) * nc; /* so point to rightmost pixel */ + output_ptr += width-1; + dir = -1; + dirnc = -nc; + errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ + } else { + /* work left to right in this row */ + dir = 1; + dirnc = nc; + errorptr = cquantize->fserrors[ci]; /* => entry before first column */ + } + colorindex_ci = cquantize->colorindex[ci]; + colormap_ci = cquantize->sv_colormap[ci]; + /* Preset error values: no error propagated to first pixel from left */ + cur = 0; + /* and no error propagated to row below yet */ + belowerr = bpreverr = 0; + + for (col = width; col > 0; col--) { + /* cur holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE; this sets the required size + * of the range_limit array. + */ + cur += GETJSAMPLE(*input_ptr); + cur = GETJSAMPLE(range_limit[cur]); + /* Select output value, accumulate into output code for this pixel */ + pixcode = GETJSAMPLE(colorindex_ci[cur]); + *output_ptr += (JSAMPLE) pixcode; + /* Compute actual representation error at this pixel */ + /* Note: we can do this even though we don't have the final */ + /* pixel code, because the colormap is orthogonal. */ + cur -= GETJSAMPLE(colormap_ci[pixcode]); + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + bnexterr = cur; + delta = cur * 2; + cur += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr + cur); + cur += delta; /* form error * 5 */ + bpreverr = belowerr + cur; + belowerr = bnexterr; + cur += delta; /* form error * 7 */ + /* At this point cur contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + input_ptr += dirnc; /* advance input ptr to next column */ + output_ptr += dir; /* advance output ptr to next column */ + errorptr += dir; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error value into the + * final fserrors[] entry. Note we need not unload belowerr because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ + } + cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); + } +} + + +/* + * Allocate workspace for Floyd-Steinberg errors. + */ + +LOCAL(void) +alloc_fs_workspace (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) { + cquantize->fserrors[i] = (FSERRPTR) + (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + } +} + + +/* + * Initialize for one-pass color quantization. + */ + +METHODDEF(void) +start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + /* Install my colormap. */ + cinfo->colormap = cquantize->sv_colormap; + cinfo->actual_number_of_colors = cquantize->sv_actual; + + /* Initialize for desired dithering mode. */ + switch (cinfo->dither_mode) { + case JDITHER_NONE: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = color_quantize3; + else + cquantize->pub.color_quantize = color_quantize; + break; + case JDITHER_ORDERED: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = quantize3_ord_dither; + else + cquantize->pub.color_quantize = quantize_ord_dither; + cquantize->row_index = 0; /* initialize state for ordered dither */ + /* If user changed to ordered dither from another mode, + * we must recreate the color index table with padding. + * This will cost extra space, but probably isn't very likely. + */ + if (! cquantize->is_padded) + create_colorindex(cinfo); + /* Create ordered-dither tables if we didn't already. */ + if (cquantize->odither[0] == NULL) + create_odither_tables(cinfo); + break; + case JDITHER_FS: + cquantize->pub.color_quantize = quantize_fs_dither; + cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ + /* Allocate Floyd-Steinberg workspace if didn't already. */ + if (cquantize->fserrors[0] == NULL) + alloc_fs_workspace(cinfo); + /* Initialize the propagated errors to zero. */ + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) + jzero_far((void FAR *) cquantize->fserrors[i], arraysize); + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } +} + + +/* + * Finish up at the end of the pass. + */ + +METHODDEF(void) +finish_pass_1_quant (j_decompress_ptr cinfo) +{ + /* no work in 1-pass case */ +} + + +/* + * Switch to a new external colormap between output passes. + * Shouldn't get to this module! + */ + +METHODDEF(void) +new_color_map_1_quant (j_decompress_ptr cinfo) +{ + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + + +/* + * Module initialization routine for 1-pass color quantization. + */ + +GLOBAL(void) +jinit_1pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_1_quant; + cquantize->pub.finish_pass = finish_pass_1_quant; + cquantize->pub.new_color_map = new_color_map_1_quant; + cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ + cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ + + /* Make sure my internal arrays won't overflow */ + if (cinfo->out_color_components > MAX_Q_COMPS) + ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); + + /* Create the colormap and color index table. */ + create_colormap(cinfo); + create_colorindex(cinfo); + + /* Allocate Floyd-Steinberg workspace now if requested. + * We do this now since it is FAR storage and may affect the memory + * manager's space calculations. If the user changes to FS dither + * mode in a later pass, we will allocate the space then, and will + * possibly overrun the max_memory_to_use setting. + */ + if (cinfo->dither_mode == JDITHER_FS) + alloc_fs_workspace(cinfo); +} + +#endif /* QUANT_1PASS_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jquant2.c mame-0.145/src/lib/libjpeg/jquant2.c --- mame-0.144/src/lib/libjpeg/jquant2.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jquant2.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,1310 @@ +/* + * jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 2-pass color quantization (color mapping) routines. + * These routines provide selection of a custom color map for an image, + * followed by mapping of the image to that color map, with optional + * Floyd-Steinberg dithering. + * It is also possible to use just the second pass to map to an arbitrary + * externally-given color map. + * + * Note: ordered dithering is not supported, since there isn't any fast + * way to compute intercolor distances; it's unclear that ordered dither's + * fundamental assumptions even hold with an irregularly spaced color map. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_2PASS_SUPPORTED + + +/* + * This module implements the well-known Heckbert paradigm for color + * quantization. Most of the ideas used here can be traced back to + * Heckbert's seminal paper + * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", + * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. + * + * In the first pass over the image, we accumulate a histogram showing the + * usage count of each possible color. To keep the histogram to a reasonable + * size, we reduce the precision of the input; typical practice is to retain + * 5 or 6 bits per color, so that 8 or 4 different input values are counted + * in the same histogram cell. + * + * Next, the color-selection step begins with a box representing the whole + * color space, and repeatedly splits the "largest" remaining box until we + * have as many boxes as desired colors. Then the mean color in each + * remaining box becomes one of the possible output colors. + * + * The second pass over the image maps each input pixel to the closest output + * color (optionally after applying a Floyd-Steinberg dithering correction). + * This mapping is logically trivial, but making it go fast enough requires + * considerable care. + * + * Heckbert-style quantizers vary a good deal in their policies for choosing + * the "largest" box and deciding where to cut it. The particular policies + * used here have proved out well in experimental comparisons, but better ones + * may yet be found. + * + * In earlier versions of the IJG code, this module quantized in YCbCr color + * space, processing the raw upsampled data without a color conversion step. + * This allowed the color conversion math to be done only once per colormap + * entry, not once per pixel. However, that optimization precluded other + * useful optimizations (such as merging color conversion with upsampling) + * and it also interfered with desired capabilities such as quantizing to an + * externally-supplied colormap. We have therefore abandoned that approach. + * The present code works in the post-conversion color space, typically RGB. + * + * To improve the visual quality of the results, we actually work in scaled + * RGB space, giving G distances more weight than R, and R in turn more than + * B. To do everything in integer math, we must use integer scale factors. + * The 2/3/1 scale factors used here correspond loosely to the relative + * weights of the colors in the NTSC grayscale equation. + * If you want to use this code to quantize a non-RGB color space, you'll + * probably need to change these scale factors. + */ + +#define R_SCALE 2 /* scale R distances by this much */ +#define G_SCALE 3 /* scale G distances by this much */ +#define B_SCALE 1 /* and B by this much */ + +/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined + * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B + * and B,G,R orders. If you define some other weird order in jmorecfg.h, + * you'll get compile errors until you extend this logic. In that case + * you'll probably want to tweak the histogram sizes too. + */ + +#if RGB_RED == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE == 2 +#define C2_SCALE B_SCALE +#endif + + +/* + * First we have the histogram data structure and routines for creating it. + * + * The number of bits of precision can be adjusted by changing these symbols. + * We recommend keeping 6 bits for G and 5 each for R and B. + * If you have plenty of memory and cycles, 6 bits all around gives marginally + * better results; if you are short of memory, 5 bits all around will save + * some space but degrade the results. + * To maintain a fully accurate histogram, we'd need to allocate a "long" + * (preferably unsigned long) for each cell. In practice this is overkill; + * we can get by with 16 bits per cell. Few of the cell counts will overflow, + * and clamping those that do overflow to the maximum value will give close- + * enough results. This reduces the recommended histogram size from 256Kb + * to 128Kb, which is a useful savings on PC-class machines. + * (In the second pass the histogram space is re-used for pixel mapping data; + * in that capacity, each cell must be able to store zero to the number of + * desired colors. 16 bits/cell is plenty for that too.) + * Since the JPEG code is intended to run in small memory model on 80x86 + * machines, we can't just allocate the histogram in one chunk. Instead + * of a true 3-D array, we use a row of pointers to 2-D arrays. Each + * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and + * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that + * on 80x86 machines, the pointer row is in near memory but the actual + * arrays are in far memory (same arrangement as we use for image arrays). + */ + +#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ + +/* These will do the right thing for either R,G,B or B,G,R color order, + * but you may not like the results for other color orders. + */ +#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ +#define HIST_C1_BITS 6 /* bits of precision in G histogram */ +#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ + +/* Number of elements along histogram axes. */ +#define HIST_C0_ELEMS (1<cquantize; + register JSAMPROW ptr; + register histptr histp; + register hist3d histogram = cquantize->histogram; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptr = input_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the histogram */ + histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] + [GETJSAMPLE(ptr[1]) >> C1_SHIFT] + [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + ptr += 3; + } + } +} + + +/* + * Next we have the really interesting routines: selection of a colormap + * given the completed histogram. + * These routines work with a list of "boxes", each representing a rectangular + * subset of the input color space (to histogram precision). + */ + +typedef struct { + /* The bounds of the box (inclusive); expressed as histogram indexes */ + int c0min, c0max; + int c1min, c1max; + int c2min, c2max; + /* The volume (actually 2-norm) of the box */ + INT32 volume; + /* The number of nonzero histogram cells within this box */ + long colorcount; +} box; + +typedef box * boxptr; + + +LOCAL(boxptr) +find_biggest_color_pop (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest color population */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +LOCAL(boxptr) +find_biggest_volume (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest (scaled) volume */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +LOCAL(void) +update_box (j_decompress_ptr cinfo, boxptr boxp) +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ +/* and recompute its volume and population */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + /* Update box volume. + * We use 2-norm rather than real volume here; this biases the method + * against making long narrow boxes, and it has the side benefit that + * a box is splittable iff norm > 0. + * Since the differences are expressed in histogram-cell units, + * we have to shift back to JSAMPLE units to get consistent distances; + * after which, we scale according to the selected distance scale factors. + */ + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + /* Now scan remaining volume of box and compute population */ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +LOCAL(int) +median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, + int desired_colors) +/* Repeatedly select and split the largest box until we have enough boxes */ +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if (numboxes*2 <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + * Current algorithm: longest scaled axis. + * See notes in update_box about scaling distances. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + /* We want to break any ties in favor of green, then red, blue last. + * This code does the right thing for R,G,B or B,G,R color orders only. + */ +#if RGB_RED == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + /* Choose split point along selected axis, and update box bounds. + * Current algorithm: split at halfway point. + * (Since the box has been shrunk to minimum volume, + * any split will produce two nonempty subboxes.) + * Note that lb value is max for lower box, so must be < old max. + */ + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(cinfo, b1); + update_box(cinfo, b2); + numboxes++; + } + return numboxes; +} + + +LOCAL(void) +compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) +/* Compute representative color for a box, put it in colormap[icolor] */ +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +LOCAL(void) +select_colors (j_decompress_ptr cinfo, int desired_colors) +/* Master routine for color selection */ +{ + boxptr boxlist; + int numboxes; + int i; + + /* Allocate workspace for box list */ + boxlist = (boxptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(cinfo, & boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(cinfo, & boxlist[i], i); + cinfo->actual_number_of_colors = numboxes; + TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); +} + + +/* + * These routines are concerned with the time-critical task of mapping input + * colors to the nearest color in the selected colormap. + * + * We re-use the histogram space as an "inverse color map", essentially a + * cache for the results of nearest-color searches. All colors within a + * histogram cell will be mapped to the same colormap entry, namely the one + * closest to the cell's center. This may not be quite the closest entry to + * the actual input color, but it's almost as good. A zero in the cache + * indicates we haven't found the nearest color for that cell yet; the array + * is cleared to zeroes before starting the mapping pass. When we find the + * nearest color for a cell, its colormap index plus one is recorded in the + * cache for future use. The pass2 scanning routines call fill_inverse_cmap + * when they need to use an unfilled entry in the cache. + * + * Our method of efficiently finding nearest colors is based on the "locally + * sorted search" idea described by Heckbert and on the incremental distance + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that + * the distances from a given colormap entry to each cell of the histogram can + * be computed quickly using an incremental method: the differences between + * distances to adjacent cells themselves differ by a constant. This allows a + * fairly fast implementation of the "brute force" approach of computing the + * distance from every colormap entry to every histogram cell. Unfortunately, + * it needs a work array to hold the best-distance-so-far for each histogram + * cell (because the inner loop has to be over cells, not colormap entries). + * The work array elements have to be INT32s, so the work array would need + * 256Kb at our recommended precision. This is not feasible in DOS machines. + * + * To get around these problems, we apply Thomas' method to compute the + * nearest colors for only the cells within a small subbox of the histogram. + * The work array need be only as big as the subbox, so the memory usage + * problem is solved. Furthermore, we need not fill subboxes that are never + * referenced in pass2; many images use only part of the color gamut, so a + * fair amount of work is saved. An additional advantage of this + * approach is that we can apply Heckbert's locality criterion to quickly + * eliminate colormap entries that are far away from the subbox; typically + * three-fourths of the colormap entries are rejected by Heckbert's criterion, + * and we need not compute their distances to individual cells in the subbox. + * The speed of this approach is heavily influenced by the subbox size: too + * small means too much overhead, too big loses because Heckbert's criterion + * can't eliminate as many colormap entries. Empirically the best subbox + * size seems to be about 1/512th of the histogram (1/8th in each direction). + * + * Thomas' article also describes a refined method which is asymptotically + * faster than the brute-force method, but it is also far more complex and + * cannot efficiently be applied to small subboxes. It is therefore not + * useful for programs intended to be portable to DOS machines. On machines + * with plenty of memory, filling the whole histogram in one shot with Thomas' + * refined method might be faster than the present code --- but then again, + * it might not be any faster, and it's certainly more complicated. + */ + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<actual_number_of_colors; + int maxc0, maxc1, maxc2; + int centerc0, centerc1, centerc2; + int i, x, ncolors; + INT32 minmaxdist, min_dist, max_dist, tdist; + INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ + + /* Compute true coordinates of update box's upper corner and center. + * Actually we compute the coordinates of the center of the upper-corner + * histogram cell, which are the upper bounds of the volume we care about. + * Note that since ">>" rounds down, the "center" values may be closer to + * min than to max; hence comparisons to them must be "<=", not "<". + */ + maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); + centerc0 = (minc0 + maxc0) >> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + /* For each color in colormap, find: + * 1. its minimum squared-distance to any point in the update box + * (zero if color is within update box); + * 2. its maximum squared-distance to any point in the update box. + * Both of these can be found by considering only the corners of the box. + * We save the minimum distance for each color in mindist[]; + * only the smallest maximum distance is of interest. + */ + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = GETJSAMPLE(cinfo->colormap[0][i]); + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[1][i]); + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[2][i]); + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + /* Now we know that no cell in the update box is more than minmaxdist + * away from some colormap entry. Therefore, only colors that are + * within minmaxdist of some part of the box need be considered. + */ + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +LOCAL(void) +find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, + int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) +/* Find the closest colormap entry for each cell in the update box, + * given the list of candidate colors prepared by find_nearby_colors. + * Return the indexes of the closest entries in the bestcolor[] array. + * This routine uses Thomas' incremental distance calculation method to + * find the distance from a colormap entry to successive cells in the box. + */ +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* For each color selected by find_nearby_colors, + * compute its distance to the center of each cell in the box. + * If that's less than best-so-far, update best distance and color number. + */ + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = GETJSAMPLE(colorlist[i]); + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +LOCAL(void) +fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) +/* Fill the inverse-colormap entries in the update box that contains */ +/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ +/* we can fill as many others as we wish.) */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + /* Compute true coordinates of update box's origin corner. + * Actually we compute the coordinates of the center of the corner + * histogram cell, which are the lower bounds of the volume we care about. + */ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + /* Determine which colormap entries are close enough to be candidates + * for the nearest entry to some cell in the update box. + */ + numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, + bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); + } + } + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +pass2_no_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register JSAMPROW inptr, outptr; + register histptr cachep; + register int c0, c1, c2; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the cache */ + c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; + c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; + c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + cachep = & histogram[c0][c1][c2]; + /* If we have not seen this color before, find nearest colormap entry */ + /* and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, c0,c1,c2); + /* Now emit the colormap index for this cell */ + *outptr++ = (JSAMPLE) (*cachep - 1); + } + } +} + + +METHODDEF(void) +pass2_fs_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int *error_limit = cquantize->error_limiter; + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ + cquantize->on_odd_row = FALSE; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = cquantize->fserrors; /* => entry before first real column */ + cquantize->on_odd_row = TRUE; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) { + /* curN holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); + cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); + cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); + /* Limit the error using transfer function set by init_error_limit. + * See comments with init_error_limit for rationale. + */ + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE (or less with error limiting); + * this sets the required size of the range_limit array. + */ + cur0 += GETJSAMPLE(inptr[0]); + cur1 += GETJSAMPLE(inptr[1]); + cur2 += GETJSAMPLE(inptr[2]); + cur0 = GETJSAMPLE(range_limit[cur0]); + cur1 = GETJSAMPLE(range_limit[cur1]); + cur2 = GETJSAMPLE(range_limit[cur2]); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= GETJSAMPLE(colormap0[pixcode]); + cur1 -= GETJSAMPLE(colormap1[pixcode]); + cur2 -= GETJSAMPLE(colormap2[pixcode]); + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +/* + * Initialize the error-limiting transfer function (lookup table). + * The raw F-S error computation can potentially compute error values of up to + * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be + * much less, otherwise obviously wrong pixels will be created. (Typical + * effects include weird fringes at color-area boundaries, isolated bright + * pixels in a dark area, etc.) The standard advice for avoiding this problem + * is to ensure that the "corners" of the color cube are allocated as output + * colors; then repeated errors in the same direction cannot cause cascading + * error buildup. However, that only prevents the error from getting + * completely out of hand; Aaron Giles reports that error limiting improves + * the results even with corner colors allocated. + * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty + * well, but the smoother transfer function used below is even better. Thanks + * to Aaron Giles for this idea. + */ + +LOCAL(void) +init_error_limit (j_decompress_ptr cinfo) +/* Allocate and fill in the error_limiter table */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + int * table; + int in, out; + + table = (int *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); + table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ + cquantize->error_limiter = table; + +#define STEPSIZE ((MAXJSAMPLE+1)/16) + /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ + for (; in <= MAXJSAMPLE; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} + + +/* + * Finish up at the end of each pass. + */ + +METHODDEF(void) +finish_pass1 (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Select the representative colors and fill in cinfo->colormap */ + cinfo->colormap = cquantize->sv_colormap; + select_colors(cinfo, cquantize->desired); + /* Force next pass to zero the color index table */ + cquantize->needs_zeroed = TRUE; +} + + +METHODDEF(void) +finish_pass2 (j_decompress_ptr cinfo) +{ + /* no work */ +} + + +/* + * Initialize for each processing pass. + */ + +METHODDEF(void) +start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int i; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + if (is_pre_scan) { + /* Set up method pointers */ + cquantize->pub.color_quantize = prescan_quantize; + cquantize->pub.finish_pass = finish_pass1; + cquantize->needs_zeroed = TRUE; /* Always zero histogram */ + } else { + /* Set up method pointers */ + if (cinfo->dither_mode == JDITHER_FS) + cquantize->pub.color_quantize = pass2_fs_dither; + else + cquantize->pub.color_quantize = pass2_no_dither; + cquantize->pub.finish_pass = finish_pass2; + + /* Make sure color count is acceptable */ + i = cinfo->actual_number_of_colors; + if (i < 1) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); + if (i > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + + if (cinfo->dither_mode == JDITHER_FS) { + size_t arraysize = (size_t) ((cinfo->output_width + 2) * + (3 * SIZEOF(FSERROR))); + /* Allocate Floyd-Steinberg workspace if we didn't already. */ + if (cquantize->fserrors == NULL) + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + /* Initialize the propagated errors to zero. */ + jzero_far((void FAR *) cquantize->fserrors, arraysize); + /* Make the error-limit table if we didn't already. */ + if (cquantize->error_limiter == NULL) + init_error_limit(cinfo); + cquantize->on_odd_row = FALSE; + } + + } + /* Zero the histogram or inverse color map, if necessary */ + if (cquantize->needs_zeroed) { + for (i = 0; i < HIST_C0_ELEMS; i++) { + jzero_far((void FAR *) histogram[i], + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = FALSE; + } +} + + +/* + * Switch to a new external colormap between output passes. + */ + +METHODDEF(void) +new_color_map_2_quant (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Reset the inverse color map */ + cquantize->needs_zeroed = TRUE; +} + + +/* + * Module initialization routine for 2-pass color quantization. + */ + +GLOBAL(void) +jinit_2pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + int i; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_2_quant; + cquantize->pub.new_color_map = new_color_map_2_quant; + cquantize->fserrors = NULL; /* flag optional arrays not allocated */ + cquantize->error_limiter = NULL; + + /* Make sure jdmaster didn't give me a case I can't handle */ + if (cinfo->out_color_components != 3) + ERREXIT(cinfo, JERR_NOTIMPL); + + /* Allocate the histogram/inverse colormap storage */ + cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); + for (i = 0; i < HIST_C0_ELEMS; i++) { + cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ + + /* Allocate storage for the completed colormap, if required. + * We do this now since it is FAR storage and may affect + * the memory manager's space calculations. + */ + if (cinfo->enable_2pass_quant) { + /* Make sure color count is acceptable */ + int desired = cinfo->desired_number_of_colors; + /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ + if (desired < 8) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (desired > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); + cquantize->desired = desired; + } else + cquantize->sv_colormap = NULL; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + /* Allocate Floyd-Steinberg workspace if necessary. + * This isn't really needed until pass 2, but again it is FAR storage. + * Although we will cope with a later change in dither_mode, + * we do not promise to honor max_memory_to_use if dither_mode changes. + */ + if (cinfo->dither_mode == JDITHER_FS) { + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); + /* Might as well create the error-limiting table too. */ + init_error_limit(cinfo); + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ diff -Nru mame-0.144/src/lib/libjpeg/jutils.c mame-0.145/src/lib/libjpeg/jutils.c --- mame-0.144/src/lib/libjpeg/jutils.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jutils.c 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,231 @@ +/* + * jutils.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains tables and miscellaneous utility routines needed + * for both compression and decompression. + * Note we prefix all global names with "j" to minimize conflicts with + * a surrounding application. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element + * of a DCT block read in natural order (left to right, top to bottom). + */ + +#if 0 /* This table is not actually needed in v6a */ + +const int jpeg_zigzag_order[DCTSIZE2] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 +}; + +#endif + +/* + * jpeg_natural_order[i] is the natural-order position of the i'th element + * of zigzag order. + * + * When reading corrupted data, the Huffman decoders could attempt + * to reference an entry beyond the end of this array (if the decoded + * zero run length reaches past the end of the block). To prevent + * wild stores without adding an inner-loop test, we put some extra + * "63"s after the real entries. This will cause the extra coefficient + * to be stored in location 63 of the block, not somewhere random. + * The worst case would be a run-length of 15, which means we need 16 + * fake entries. + */ + +const int jpeg_natural_order[DCTSIZE2+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order7[7*7+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 14, 21, 28, 35, + 42, 49, 50, 43, 36, 29, 22, 30, + 37, 44, 51, 52, 45, 38, 46, 53, + 54, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order6[6*6+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 41, 34, 27, + 20, 13, 21, 28, 35, 42, 43, 36, + 29, 37, 44, 45, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order5[5*5+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 12, + 19, 26, 33, 34, 27, 20, 28, 35, + 36, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order4[4*4+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 25, 18, 11, 19, 26, 27, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order3[3*3+16] = { + 0, 1, 8, 16, 9, 2, 10, 17, + 18, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order2[2*2+16] = { + 0, 1, 8, 9, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + + +/* + * Arithmetic utilities + */ + +GLOBAL(long) +jdiv_round_up (long a, long b) +/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ +/* Assumes a >= 0, b > 0 */ +{ + return (a + b - 1L) / b; +} + + +GLOBAL(long) +jround_up (long a, long b) +/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ +/* Assumes a >= 0, b > 0 */ +{ + a += b - 1L; + return a - (a % b); +} + + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#endif +#endif + + +GLOBAL(void) +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols) +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas may overlap for duplication. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register JDIMENSION count; +#endif + register int row; + + input_array += source_row; + output_array += dest_row; + + for (row = num_rows; row > 0; row--) { + inptr = *input_array++; + outptr = *output_array++; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = num_cols; count > 0; count--) + *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + + +GLOBAL(void) +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks) +/* Copy a row of coefficient blocks from one place to another. */ +{ +#ifdef FMEMCOPY + FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); +#else + register JCOEFPTR inptr, outptr; + register long count; + + inptr = (JCOEFPTR) input_row; + outptr = (JCOEFPTR) output_row; + for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { + *outptr++ = *inptr++; + } +#endif +} + + +GLOBAL(void) +jzero_far (void FAR * target, size_t bytestozero) +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_large data. */ +{ +#ifdef FMEMZERO + FMEMZERO(target, bytestozero); +#else + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +#endif +} diff -Nru mame-0.144/src/lib/libjpeg/jversion.h mame-0.145/src/lib/libjpeg/jversion.h --- mame-0.144/src/lib/libjpeg/jversion.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/jversion.h 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,14 @@ +/* + * jversion.h + * + * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains software version identification. + */ + + +#define JVERSION "8c 16-Jan-2011" + +#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding" diff -Nru mame-0.144/src/lib/libjpeg/libjpeg.txt mame-0.145/src/lib/libjpeg/libjpeg.txt --- mame-0.144/src/lib/libjpeg/libjpeg.txt 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/libjpeg.txt 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,3084 @@ +USING THE IJG JPEG LIBRARY + +Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file describes how to use the IJG JPEG library within an application +program. Read it if you want to write a program that uses the library. + +The file example.c provides heavily commented skeleton code for calling the +JPEG library. Also see jpeglib.h (the include file to be used by application +programs) for full details about data structures and function parameter lists. +The library source code, of course, is the ultimate reference. + +Note that there have been *major* changes from the application interface +presented by IJG version 4 and earlier versions. The old design had several +inherent limitations, and it had accumulated a lot of cruft as we added +features while trying to minimize application-interface changes. We have +sacrificed backward compatibility in the version 5 rewrite, but we think the +improvements justify this. + + +TABLE OF CONTENTS +----------------- + +Overview: + Functions provided by the library + Outline of typical usage +Basic library usage: + Data formats + Compression details + Decompression details + Mechanics of usage: include files, linking, etc +Advanced features: + Compression parameter selection + Decompression parameter selection + Special color spaces + Error handling + Compressed data handling (source and destination managers) + I/O suspension + Progressive JPEG support + Buffered-image mode + Abbreviated datastreams and multiple images + Special markers + Raw (downsampled) image data + Really raw data: DCT coefficients + Progress monitoring + Memory management + Memory usage + Library compile-time options + Portability considerations + Notes for MS-DOS implementors + +You should read at least the overview and basic usage sections before trying +to program with the library. The sections on advanced features can be read +if and when you need them. + + +OVERVIEW +======== + +Functions provided by the library +--------------------------------- + +The IJG JPEG library provides C code to read and write JPEG-compressed image +files. The surrounding application program receives or supplies image data a +scanline at a time, using a straightforward uncompressed image format. All +details of color conversion and other preprocessing/postprocessing can be +handled by the library. + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. The application indirectly selects use of this code +by specifying the format in which it wishes to supply or receive image data. +For example, if colormapped output is requested, then the decompression +library automatically invokes color quantization. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + +A word about functions *not* provided by the library. We handle a subset of +the ISO JPEG standard; most baseline, extended-sequential, and progressive +JPEG processes are supported. (Our subset includes all features now in common +use.) Unsupported ISO options include: + * Hierarchical storage + * Lossless JPEG + * DNL marker + * Nonintegral subsampling ratios +We support both 8- and 12-bit data precision, but this is a compile-time +choice rather than a run-time choice; hence it is difficult to use both +precisions in a single application. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, this library is +used by the free LIBTIFF library to support JPEG compression in TIFF.) + + +Outline of typical usage +------------------------ + +The rough outline of a JPEG compression operation is: + + Allocate and initialize a JPEG compression object + Specify the destination for the compressed data (eg, a file) + Set parameters for compression, including image size & colorspace + jpeg_start_compress(...); + while (scan lines remain to be written) + jpeg_write_scanlines(...); + jpeg_finish_compress(...); + Release the JPEG compression object + +A JPEG compression object holds parameters and working state for the JPEG +library. We make creation/destruction of the object separate from starting +or finishing compression of an image; the same object can be re-used for a +series of image compression operations. This makes it easy to re-use the +same parameter settings for a sequence of images. Re-use of a JPEG object +also has important implications for processing abbreviated JPEG datastreams, +as discussed later. + +The image data to be compressed is supplied to jpeg_write_scanlines() from +in-memory buffers. If the application is doing file-to-file compression, +reading image data from the source file is the application's responsibility. +The library emits compressed data by calling a "data destination manager", +which typically will write the data into a file; but the application can +provide its own destination manager to do something else. + +Similarly, the rough outline of a JPEG decompression operation is: + + Allocate and initialize a JPEG decompression object + Specify the source of the compressed data (eg, a file) + Call jpeg_read_header() to obtain image info + Set parameters for decompression + jpeg_start_decompress(...); + while (scan lines remain to be read) + jpeg_read_scanlines(...); + jpeg_finish_decompress(...); + Release the JPEG decompression object + +This is comparable to the compression outline except that reading the +datastream header is a separate step. This is helpful because information +about the image's size, colorspace, etc is available when the application +selects decompression parameters. For example, the application can choose an +output scaling ratio that will fit the image into the available screen size. + +The decompression library obtains compressed data by calling a data source +manager, which typically will read the data from a file; but other behaviors +can be obtained with a custom source manager. Decompressed data is delivered +into in-memory buffers passed to jpeg_read_scanlines(). + +It is possible to abort an incomplete compression or decompression operation +by calling jpeg_abort(); or, if you do not need to retain the JPEG object, +simply release it by calling jpeg_destroy(). + +JPEG compression and decompression objects are two separate struct types. +However, they share some common fields, and certain routines such as +jpeg_destroy() can work on either type of object. + +The JPEG library has no static variables: all state is in the compression +or decompression object. Therefore it is possible to process multiple +compression and decompression operations concurrently, using multiple JPEG +objects. + +Both compression and decompression can be done in an incremental memory-to- +memory fashion, if suitable source/destination managers are used. See the +section on "I/O suspension" for more details. + + +BASIC LIBRARY USAGE +=================== + +Data formats +------------ + +Before diving into procedural details, it is helpful to understand the +image data format that the JPEG library expects or returns. + +The standard input image format is a rectangular array of pixels, with each +pixel having the same number of "component" or "sample" values (color +channels). You must specify how many components there are and the colorspace +interpretation of the components. Most applications will use RGB data +(three components per pixel) or grayscale data (one component per pixel). +PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. +A remarkable number of people manage to miss this, only to find that their +programs don't work with grayscale JPEG files. + +There is no provision for colormapped input. JPEG files are always full-color +or full grayscale (or sometimes another colorspace such as CMYK). You can +feed in a colormapped image by expanding it to full-color format. However +JPEG often doesn't work very well with source data that has been colormapped, +because of dithering noise. This is discussed in more detail in the JPEG FAQ +and the other references mentioned in the README file. + +Pixels are stored by scanlines, with each scanline running from left to +right. The component values for each pixel are adjacent in the row; for +example, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an +array of data type JSAMPLE --- which is typically "unsigned char", unless +you've changed jmorecfg.h. (You can also change the RGB pixel layout, say +to B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in +that file before doing so.) + +A 2-D array of pixels is formed by making a list of pointers to the starts of +scanlines; so the scanlines need not be physically adjacent in memory. Even +if you process just one scanline at a time, you must make a one-element +pointer array to conform to this structure. Pointers to JSAMPLE rows are of +type JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. + +The library accepts or supplies one or more complete scanlines per call. +It is not possible to process part of a row at a time. Scanlines are always +processed top-to-bottom. You can process an entire image in one call if you +have it all in memory, but usually it's simplest to process one scanline at +a time. + +For best results, source data values should have the precision specified by +BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress +data that's only 6 bits/channel, you should left-justify each value in a +byte before passing it to the compressor. If you need to compress data +that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. +(See "Library compile-time options", later.) + + +The data format returned by the decompressor is the same in all details, +except that colormapped output is supported. (Again, a JPEG file is never +colormapped. But you can ask the decompressor to perform on-the-fly color +quantization to deliver colormapped output.) If you request colormapped +output then the returned data array contains a single JSAMPLE per pixel; +its value is an index into a color map. The color map is represented as +a 2-D JSAMPARRAY in which each row holds the values of one color component, +that is, colormap[i][j] is the value of the i'th color component for pixel +value (map index) j. Note that since the colormap indexes are stored in +JSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE +(ie, at most 256 colors for an 8-bit JPEG library). + + +Compression details +------------------- + +Here we revisit the JPEG compression outline given in the overview. + +1. Allocate and initialize a JPEG compression object. + +A JPEG compression object is a "struct jpeg_compress_struct". (It also has +a bunch of subsidiary structures which are allocated via malloc(), but the +application doesn't control those directly.) This struct can be just a local +variable in the calling routine, if a single routine is going to execute the +whole JPEG compression sequence. Otherwise it can be static or allocated +from malloc(). + +You will also need a structure representing a JPEG error handler. The part +of this that the library cares about is a "struct jpeg_error_mgr". If you +are providing your own error handler, you'll typically want to embed the +jpeg_error_mgr struct in a larger structure; this is discussed later under +"Error handling". For now we'll assume you are just using the default error +handler. The default error handler will print JPEG error/warning messages +on stderr, and it will call exit() if a fatal error occurs. + +You must initialize the error handler structure, store a pointer to it into +the JPEG object's "err" field, and then call jpeg_create_compress() to +initialize the rest of the JPEG object. + +Typical code for this step, if you are using the default error handler, is + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + +jpeg_create_compress allocates a small amount of memory, so it could fail +if you are out of memory. In that case it will exit via the error handler; +that's why the error handler must be initialized first. + + +2. Specify the destination for the compressed data (eg, a file). + +As previously mentioned, the JPEG library delivers compressed data to a +"data destination" module. The library includes one data destination +module which knows how to write to a stdio stream. You can use your own +destination module if you want to do something else, as discussed later. + +If you use the standard destination module, you must open the target stdio +stream beforehand. Typical code for this step looks like: + + FILE * outfile; + ... + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + +where the last line invokes the standard destination module. + +WARNING: it is critical that the binary compressed data be delivered to the +output file unchanged. On non-Unix systems the stdio library may perform +newline translation or otherwise corrupt binary data. To suppress this +behavior, you may need to use a "b" option to fopen (as shown above), or use +setmode() or another routine to put the stdio stream in binary mode. See +cjpeg.c and djpeg.c for code that has been found to work on many systems. + +You can select the data destination after setting other parameters (step 3), +if that's more convenient. You may not change the destination between +calling jpeg_start_compress() and jpeg_finish_compress(). + + +3. Set parameters for compression, including image size & colorspace. + +You must supply information about the source image by setting the following +fields in the JPEG object (cinfo structure): + + image_width Width of image, in pixels + image_height Height of image, in pixels + input_components Number of color channels (samples per pixel) + in_color_space Color space of source image + +The image dimensions are, hopefully, obvious. JPEG supports image dimensions +of 1 to 64K pixels in either direction. The input color space is typically +RGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special +color spaces", later, for more info.) The in_color_space field must be +assigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or +JCS_GRAYSCALE. + +JPEG has a large number of compression parameters that determine how the +image is encoded. Most applications don't need or want to know about all +these parameters. You can set all the parameters to reasonable defaults by +calling jpeg_set_defaults(); then, if there are particular values you want +to change, you can do so after that. The "Compression parameter selection" +section tells about all the parameters. + +You must set in_color_space correctly before calling jpeg_set_defaults(), +because the defaults depend on the source image colorspace. However the +other three source image parameters need not be valid until you call +jpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more +than once, if that happens to be convenient. + +Typical code for a 24-bit RGB source image is + + cinfo.image_width = Width; /* image width and height, in pixels */ + cinfo.image_height = Height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + /* Make optional parameter settings here */ + + +4. jpeg_start_compress(...); + +After you have established the data destination and set all the necessary +source image info and other parameters, call jpeg_start_compress() to begin +a compression cycle. This will initialize internal state, allocate working +storage, and emit the first few bytes of the JPEG datastream header. + +Typical code: + + jpeg_start_compress(&cinfo, TRUE); + +The "TRUE" parameter ensures that a complete JPEG interchange datastream +will be written. This is appropriate in most cases. If you think you might +want to use an abbreviated datastream, read the section on abbreviated +datastreams, below. + +Once you have called jpeg_start_compress(), you may not alter any JPEG +parameters or other fields of the JPEG object until you have completed +the compression cycle. + + +5. while (scan lines remain to be written) + jpeg_write_scanlines(...); + +Now write all the required image data by calling jpeg_write_scanlines() +one or more times. You can pass one or more scanlines in each call, up +to the total image height. In most applications it is convenient to pass +just one or a few scanlines at a time. The expected format for the passed +data is discussed under "Data formats", above. + +Image data should be written in top-to-bottom scanline order. The JPEG spec +contains some weasel wording about how top and bottom are application-defined +terms (a curious interpretation of the English language...) but if you want +your files to be compatible with everyone else's, you WILL use top-to-bottom +order. If the source data must be read in bottom-to-top order, you can use +the JPEG library's virtual array mechanism to invert the data efficiently. +Examples of this can be found in the sample application cjpeg. + +The library maintains a count of the number of scanlines written so far +in the next_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.next_scanline < cinfo.image_height)". + +Code for this step depends heavily on the way that you store the source data. +example.c shows the following code for the case of a full-size 2-D source +array containing 3-byte RGB pixels: + + JSAMPROW row_pointer[1]; /* pointer to a single row */ + int row_stride; /* physical row width in buffer */ + + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + +jpeg_write_scanlines() returns the number of scanlines actually written. +This will normally be equal to the number passed in, so you can usually +ignore the return value. It is different in just two cases: + * If you try to write more scanlines than the declared image height, + the additional scanlines are ignored. + * If you use a suspending data destination manager, output buffer overrun + will cause the compressor to return before accepting all the passed lines. + This feature is discussed under "I/O suspension", below. The normal + stdio destination manager will NOT cause this to happen. +In any case, the return value is the same as the change in the value of +next_scanline. + + +6. jpeg_finish_compress(...); + +After all the image data has been written, call jpeg_finish_compress() to +complete the compression cycle. This step is ESSENTIAL to ensure that the +last bufferload of data is written to the data destination. +jpeg_finish_compress() also releases working memory associated with the JPEG +object. + +Typical code: + + jpeg_finish_compress(&cinfo); + +If using the stdio destination manager, don't forget to close the output +stdio stream (if necessary) afterwards. + +If you have requested a multi-pass operating mode, such as Huffman code +optimization, jpeg_finish_compress() will perform the additional passes using +data buffered by the first pass. In this case jpeg_finish_compress() may take +quite a while to complete. With the default compression parameters, this will +not happen. + +It is an error to call jpeg_finish_compress() before writing the necessary +total number of scanlines. If you wish to abort compression, call +jpeg_abort() as discussed below. + +After completing a compression cycle, you may dispose of the JPEG object +as discussed next, or you may use it to compress another image. In that case +return to step 2, 3, or 4 as appropriate. If you do not change the +destination manager, the new datastream will be written to the same target. +If you do not change any JPEG parameters, the new datastream will be written +with the same parameters as before. Note that you can change the input image +dimensions freely between cycles, but if you change the input colorspace, you +should call jpeg_set_defaults() to adjust for the new colorspace; and then +you'll need to repeat all of step 3. + + +7. Release the JPEG compression object. + +When you are done with a JPEG compression object, destroy it by calling +jpeg_destroy_compress(). This will free all subsidiary memory (regardless of +the previous state of the object). Or you can call jpeg_destroy(), which +works for either compression or decompression objects --- this may be more +convenient if you are sharing code between compression and decompression +cases. (Actually, these routines are equivalent except for the declared type +of the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() +should be passed a j_common_ptr.) + +If you allocated the jpeg_compress_struct structure from malloc(), freeing +it is your responsibility --- jpeg_destroy() won't. Ditto for the error +handler structure. + +Typical code: + + jpeg_destroy_compress(&cinfo); + + +8. Aborting. + +If you decide to abort a compression cycle before finishing, you can clean up +in either of two ways: + +* If you don't need the JPEG object any more, just call + jpeg_destroy_compress() or jpeg_destroy() to release memory. This is + legitimate at any point after calling jpeg_create_compress() --- in fact, + it's safe even if jpeg_create_compress() fails. + +* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call + jpeg_abort() which works on both compression and decompression objects. + This will return the object to an idle state, releasing any working memory. + jpeg_abort() is allowed at any time after successful object creation. + +Note that cleaning up the data destination, if required, is your +responsibility; neither of these routines will call term_destination(). +(See "Compressed data handling", below, for more about that.) + +jpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG +object that has reported an error by calling error_exit (see "Error handling" +for more info). The internal state of such an object is likely to be out of +whack. Either of these two routines will return the object to a known state. + + +Decompression details +--------------------- + +Here we revisit the JPEG decompression outline given in the overview. + +1. Allocate and initialize a JPEG decompression object. + +This is just like initialization for compression, as discussed above, +except that the object is a "struct jpeg_decompress_struct" and you +call jpeg_create_decompress(). Error handling is exactly the same. + +Typical code: + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + +(Both here and in the IJG code, we usually use variable name "cinfo" for +both compression and decompression objects.) + + +2. Specify the source of the compressed data (eg, a file). + +As previously mentioned, the JPEG library reads compressed data from a "data +source" module. The library includes one data source module which knows how +to read from a stdio stream. You can use your own source module if you want +to do something else, as discussed later. + +If you use the standard source module, you must open the source stdio stream +beforehand. Typical code for this step looks like: + + FILE * infile; + ... + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_src(&cinfo, infile); + +where the last line invokes the standard source module. + +WARNING: it is critical that the binary compressed data be read unchanged. +On non-Unix systems the stdio library may perform newline translation or +otherwise corrupt binary data. To suppress this behavior, you may need to use +a "b" option to fopen (as shown above), or use setmode() or another routine to +put the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that +has been found to work on many systems. + +You may not change the data source between calling jpeg_read_header() and +jpeg_finish_decompress(). If you wish to read a series of JPEG images from +a single source file, you should repeat the jpeg_read_header() to +jpeg_finish_decompress() sequence without reinitializing either the JPEG +object or the data source module; this prevents buffered input data from +being discarded. + + +3. Call jpeg_read_header() to obtain image info. + +Typical code for this step is just + + jpeg_read_header(&cinfo, TRUE); + +This will read the source datastream header markers, up to the beginning +of the compressed data proper. On return, the image dimensions and other +info have been stored in the JPEG object. The application may wish to +consult this information before selecting decompression parameters. + +More complex code is necessary if + * A suspending data source is used --- in that case jpeg_read_header() + may return before it has read all the header data. See "I/O suspension", + below. The normal stdio source manager will NOT cause this to happen. + * Abbreviated JPEG files are to be processed --- see the section on + abbreviated datastreams. Standard applications that deal only in + interchange JPEG files need not be concerned with this case either. + +It is permissible to stop at this point if you just wanted to find out the +image dimensions and other header info for a JPEG file. In that case, +call jpeg_destroy() when you are done with the JPEG object, or call +jpeg_abort() to return it to an idle state before selecting a new data +source and reading another header. + + +4. Set parameters for decompression. + +jpeg_read_header() sets appropriate default decompression parameters based on +the properties of the image (in particular, its colorspace). However, you +may well want to alter these defaults before beginning the decompression. +For example, the default is to produce full color output from a color file. +If you want colormapped output you must ask for it. Other options allow the +returned image to be scaled and allow various speed/quality tradeoffs to be +selected. "Decompression parameter selection", below, gives details. + +If the defaults are appropriate, nothing need be done at this step. + +Note that all default values are set by each call to jpeg_read_header(). +If you reuse a decompression object, you cannot expect your parameter +settings to be preserved across cycles, as you can for compression. +You must set desired parameter values each time. + + +5. jpeg_start_decompress(...); + +Once the parameter values are satisfactory, call jpeg_start_decompress() to +begin decompression. This will initialize internal state, allocate working +memory, and prepare for returning data. + +Typical code is just + + jpeg_start_decompress(&cinfo); + +If you have requested a multi-pass operating mode, such as 2-pass color +quantization, jpeg_start_decompress() will do everything needed before data +output can begin. In this case jpeg_start_decompress() may take quite a while +to complete. With a single-scan (non progressive) JPEG file and default +decompression parameters, this will not happen; jpeg_start_decompress() will +return quickly. + +After this call, the final output image dimensions, including any requested +scaling, are available in the JPEG object; so is the selected colormap, if +colormapped output has been requested. Useful fields include + + output_width image width and height, as scaled + output_height + out_color_components # of color components in out_color_space + output_components # of color components returned per pixel + colormap the selected colormap, if any + actual_number_of_colors number of entries in colormap + +output_components is 1 (a colormap index) when quantizing colors; otherwise it +equals out_color_components. It is the number of JSAMPLE values that will be +emitted per pixel in the output arrays. + +Typically you will need to allocate data buffers to hold the incoming image. +You will need output_width * output_components JSAMPLEs per scanline in your +output buffer, and a total of output_height scanlines will be returned. + +Note: if you are using the JPEG library's internal memory manager to allocate +data buffers (as djpeg does), then the manager's protocol requires that you +request large buffers *before* calling jpeg_start_decompress(). This is a +little tricky since the output_XXX fields are not normally valid then. You +can make them valid by calling jpeg_calc_output_dimensions() after setting the +relevant parameters (scaling, output color space, and quantization flag). + + +6. while (scan lines remain to be read) + jpeg_read_scanlines(...); + +Now you can read the decompressed image data by calling jpeg_read_scanlines() +one or more times. At each call, you pass in the maximum number of scanlines +to be read (ie, the height of your working buffer); jpeg_read_scanlines() +will return up to that many lines. The return value is the number of lines +actually read. The format of the returned data is discussed under "Data +formats", above. Don't forget that grayscale and color JPEGs will return +different data formats! + +Image data is returned in top-to-bottom scanline order. If you must write +out the image in bottom-to-top order, you can use the JPEG library's virtual +array mechanism to invert the data efficiently. Examples of this can be +found in the sample application djpeg. + +The library maintains a count of the number of scanlines returned so far +in the output_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test +should NOT be against image_height, unless you never use scaling. The +image_height field is the height of the original unscaled image.) +The return value always equals the change in the value of output_scanline. + +If you don't use a suspending data source, it is safe to assume that +jpeg_read_scanlines() reads at least one scanline per call, until the +bottom of the image has been reached. + +If you use a buffer larger than one scanline, it is NOT safe to assume that +jpeg_read_scanlines() fills it. (The current implementation returns only a +few scanlines per call, no matter how large a buffer you pass.) So you must +always provide a loop that calls jpeg_read_scanlines() repeatedly until the +whole image has been read. + + +7. jpeg_finish_decompress(...); + +After all the image data has been read, call jpeg_finish_decompress() to +complete the decompression cycle. This causes working memory associated +with the JPEG object to be released. + +Typical code: + + jpeg_finish_decompress(&cinfo); + +If using the stdio source manager, don't forget to close the source stdio +stream if necessary. + +It is an error to call jpeg_finish_decompress() before reading the correct +total number of scanlines. If you wish to abort decompression, call +jpeg_abort() as discussed below. + +After completing a decompression cycle, you may dispose of the JPEG object as +discussed next, or you may use it to decompress another image. In that case +return to step 2 or 3 as appropriate. If you do not change the source +manager, the next image will be read from the same source. + + +8. Release the JPEG decompression object. + +When you are done with a JPEG decompression object, destroy it by calling +jpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of +destroying compression objects applies here too. + +Typical code: + + jpeg_destroy_decompress(&cinfo); + + +9. Aborting. + +You can abort a decompression cycle by calling jpeg_destroy_decompress() or +jpeg_destroy() if you don't need the JPEG object any more, or +jpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. +The previous discussion of aborting compression cycles applies here too. + + +Mechanics of usage: include files, linking, etc +----------------------------------------------- + +Applications using the JPEG library should include the header file jpeglib.h +to obtain declarations of data types and routines. Before including +jpeglib.h, include system headers that define at least the typedefs FILE and +size_t. On ANSI-conforming systems, including is sufficient; on +older Unix systems, you may need to define size_t. + +If the application needs to refer to individual JPEG library error codes, also +include jerror.h to define those symbols. + +jpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are +installing the JPEG header files in a system directory, you will want to +install all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. + +The most convenient way to include the JPEG code into your executable program +is to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix +machines) and reference it at your link step. If you use only half of the +library (only compression or only decompression), only that much code will be +included from the library, unless your linker is hopelessly brain-damaged. +The supplied makefiles build libjpeg.a automatically (see install.txt). + +While you can build the JPEG library as a shared library if the whim strikes +you, we don't really recommend it. The trouble with shared libraries is that +at some point you'll probably try to substitute a new version of the library +without recompiling the calling applications. That generally doesn't work +because the parameter struct declarations usually change with each new +version. In other words, the library's API is *not* guaranteed binary +compatible across versions; we only try to ensure source-code compatibility. +(In hindsight, it might have been smarter to hide the parameter structs from +applications and introduce a ton of access functions instead. Too late now, +however.) + +On some systems your application may need to set up a signal handler to ensure +that temporary files are deleted if the program is interrupted. This is most +critical if you are on MS-DOS and use the jmemdos.c memory manager back end; +it will try to grab extended memory for temp files, and that space will NOT be +freed automatically. See cjpeg.c or djpeg.c for an example signal handler. + +It may be worth pointing out that the core JPEG library does not actually +require the stdio library: only the default source/destination managers and +error handler need it. You can use the library in a stdio-less environment +if you replace those modules and use jmemnobs.c (or another memory manager of +your own devising). More info about the minimum system library requirements +may be found in jinclude.h. + + +ADVANCED FEATURES +================= + +Compression parameter selection +------------------------------- + +This section describes all the optional parameters you can set for JPEG +compression, as well as the "helper" routines provided to assist in this +task. Proper setting of some parameters requires detailed understanding +of the JPEG standard; if you don't know what a parameter is for, it's best +not to mess with it! See REFERENCES in the README file for pointers to +more info about JPEG. + +It's a good idea to call jpeg_set_defaults() first, even if you plan to set +all the parameters; that way your code is more likely to work with future JPEG +libraries that have additional parameters. For the same reason, we recommend +you use a helper routine where one is provided, in preference to twiddling +cinfo fields directly. + +The helper routines are: + +jpeg_set_defaults (j_compress_ptr cinfo) + This routine sets all JPEG parameters to reasonable defaults, using + only the input image's color space (field in_color_space, which must + already be set in cinfo). Many applications will only need to use + this routine and perhaps jpeg_set_quality(). + +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) + Sets the JPEG file's colorspace (field jpeg_color_space) as specified, + and sets other color-space-dependent parameters appropriately. See + "Special color spaces", below, before using this. A large number of + parameters, including all per-component parameters, are set by this + routine; if you want to twiddle individual parameters you should call + jpeg_set_colorspace() before rather than after. + +jpeg_default_colorspace (j_compress_ptr cinfo) + Selects an appropriate JPEG colorspace based on cinfo->in_color_space, + and calls jpeg_set_colorspace(). This is actually a subroutine of + jpeg_set_defaults(). It's broken out in case you want to change + just the colorspace-dependent JPEG parameters. + +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) + Constructs JPEG quantization tables appropriate for the indicated + quality setting. The quality value is expressed on the 0..100 scale + recommended by IJG (cjpeg's "-quality" switch uses this routine). + Note that the exact mapping from quality values to tables may change + in future IJG releases as more is learned about DCT quantization. + If the force_baseline parameter is TRUE, then the quantization table + entries are constrained to the range 1..255 for full JPEG baseline + compatibility. In the current implementation, this only makes a + difference for quality settings below 25, and it effectively prevents + very small/low quality files from being generated. The IJG decoder + is capable of reading the non-baseline files generated at low quality + settings when force_baseline is FALSE, but other decoders may not be. + +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) + Same as jpeg_set_quality() except that the generated tables are the + sample tables given in the JPEC spec section K.1, multiplied by the + specified scale factor (which is expressed as a percentage; thus + scale_factor = 100 reproduces the spec's tables). Note that larger + scale factors give lower quality. This entry point is useful for + conforming to the Adobe PostScript DCT conventions, but we do not + recommend linear scaling as a user-visible quality scale otherwise. + force_baseline again constrains the computed table entries to 1..255. + +int jpeg_quality_scaling (int quality) + Converts a value on the IJG-recommended quality scale to a linear + scaling percentage. Note that this routine may change or go away + in future releases --- IJG may choose to adopt a scaling method that + can't be expressed as a simple scalar multiplier, in which case the + premise of this routine collapses. Caveat user. + +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) + Set default quantization tables with linear q_scale_factor[] values + (see below). + +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) + Allows an arbitrary quantization table to be created. which_tbl + indicates which table slot to fill. basic_table points to an array + of 64 unsigned ints given in normal array order. These values are + multiplied by scale_factor/100 and then clamped to the range 1..65535 + (or to 1..255 if force_baseline is TRUE). + CAUTION: prior to library version 6a, jpeg_add_quant_table expected + the basic table to be given in JPEG zigzag order. If you need to + write code that works with either older or newer versions of this + routine, you must check the library version number. Something like + "#if JPEG_LIB_VERSION >= 61" is the right test. + +jpeg_simple_progression (j_compress_ptr cinfo) + Generates a default scan script for writing a progressive-JPEG file. + This is the recommended method of creating a progressive file, + unless you want to make a custom scan sequence. You must ensure that + the JPEG color space is set correctly before calling this routine. + + +Compression parameters (cinfo fields) include: + +int block_size + Set DCT block size. All N from 1 to 16 are possible. + Default is 8 (baseline format). + Larger values produce higher compression, + smaller values produce higher quality. + An exact DCT stage is possible with 1 or 2. + With the default quality of 75 and default Luminance qtable + the DCT+Quantization stage is lossless for value 1. + Note that values other than 8 require a SmartScale capable decoder, + introduced with IJG JPEG 8. Setting the block_size parameter for + compression works with version 8c and later. + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are: + JDCT_ISLOW: slow but accurate integer algorithm + JDCT_IFAST: faster, less accurate integer method + JDCT_FLOAT: floating-point method + JDCT_DEFAULT: default method (normally JDCT_ISLOW) + JDCT_FASTEST: fastest method (normally JDCT_IFAST) + The FLOAT method is very slightly more accurate than the ISLOW method, + but may give different results on different machines due to varying + roundoff behavior. The integer methods should give the same results + on all machines. On machines with sufficiently fast FP hardware, the + floating-point method may also be the fastest. The IFAST method is + considerably less accurate than the other two; its use is not + recommended if high quality is a concern. JDCT_DEFAULT and + JDCT_FASTEST are macros configurable by each installation. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Default is + 1/1, or no scaling. Currently, the supported scaling ratios are + M/N with all N from 1 to 16, where M is the destination DCT size, + which is 8 by default (see block_size parameter above). + (The library design allows for arbitrary scaling ratios but this + is not likely to be implemented any time soon.) + +J_COLOR_SPACE jpeg_color_space +int num_components + The JPEG color space and corresponding number of components; see + "Special color spaces", below, for more info. We recommend using + jpeg_set_color_space() if you want to change these. + +boolean optimize_coding + TRUE causes the compressor to compute optimal Huffman coding tables + for the image. This requires an extra pass over the data and + therefore costs a good deal of space and time. The default is + FALSE, which tells the compressor to use the supplied or default + Huffman tables. In most cases optimal tables save only a few percent + of file size compared to the default tables. Note that when this is + TRUE, you need not supply Huffman tables at all, and any you do + supply will be overwritten. + +unsigned int restart_interval +int restart_in_rows + To emit restart markers in the JPEG file, set one of these nonzero. + Set restart_interval to specify the exact interval in MCU blocks. + Set restart_in_rows to specify the interval in MCU rows. (If + restart_in_rows is not 0, then restart_interval is set after the + image width in MCUs is computed.) Defaults are zero (no restarts). + One restart marker per MCU row is often a good choice. + NOTE: the overhead of restart markers is higher in grayscale JPEG + files than in color files, and MUCH higher in progressive JPEGs. + If you use restarts, you may want to use larger intervals in those + cases. + +const jpeg_scan_info * scan_info +int num_scans + By default, scan_info is NULL; this causes the compressor to write a + single-scan sequential JPEG file. If not NULL, scan_info points to + an array of scan definition records of length num_scans. The + compressor will then write a JPEG file having one scan for each scan + definition record. This is used to generate noninterleaved or + progressive JPEG files. The library checks that the scan array + defines a valid JPEG scan sequence. (jpeg_simple_progression creates + a suitable scan definition array for progressive JPEG.) This is + discussed further under "Progressive JPEG support". + +boolean do_fancy_downsampling + If TRUE, use direct DCT scaling with DCT size > 8 for downsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate downsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_upsampling value in decompression. + +int smoothing_factor + If non-zero, the input image is smoothed; the value should be 1 for + minimal smoothing to 100 for maximum smoothing. Consult jcsample.c + for details of the smoothing algorithm. The default is zero. + +boolean write_JFIF_header + If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space + (ie, YCbCr or grayscale) is selected, otherwise FALSE. + +UINT8 JFIF_major_version +UINT8 JFIF_minor_version + The version number to be written into the JFIF marker. + jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). + You should set it to 1.02 (major=1, minor=2) if you plan to write + any JFIF 1.02 extension markers. + +UINT8 density_unit +UINT16 X_density +UINT16 Y_density + The resolution information to be written into the JFIF marker; + not used otherwise. density_unit may be 0 for unknown, + 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 + indicating square pixels of unknown size. + +boolean write_Adobe_marker + If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, + or YCCK is selected, otherwise FALSE. It is generally a bad idea + to set both write_JFIF_header and write_Adobe_marker. In fact, + you probably shouldn't change the default settings at all --- the + default behavior ensures that the JPEG file's color space can be + recognized by the decoder. + +JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS] + Pointers to coefficient quantization tables, one per table slot, + or NULL if no table is defined for a slot. Usually these should + be set via one of the above helper routines; jpeg_add_quant_table() + is general enough to define any quantization table. The other + routines will set up table slot 0 for luminance quality and table + slot 1 for chrominance. + +int q_scale_factor[NUM_QUANT_TBLS] + Linear quantization scaling factors (percentage, initialized 100) + for use with jpeg_default_qtables(). + See rdswitch.c and cjpeg.c for an example of usage. + Note that the q_scale_factor[] fields are the "linear" scales, so you + have to convert from user-defined ratings via jpeg_quality_scaling(). + Here is an example code which corresponds to cjpeg -quality 90,70: + + jpeg_set_defaults(cinfo); + + /* Set luminance quality 90. */ + cinfo->q_scale_factor[0] = jpeg_quality_scaling(90); + /* Set chrominance quality 70. */ + cinfo->q_scale_factor[1] = jpeg_quality_scaling(70); + + jpeg_default_qtables(cinfo, force_baseline); + + CAUTION: You must also set 1x1 subsampling for efficient separate + color quality selection, since the default value used by library + is 2x2: + + cinfo->comp_info[0].v_samp_factor = 1; + cinfo->comp_info[0].h_samp_factor = 1; + +JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS] +JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS] + Pointers to Huffman coding tables, one per table slot, or NULL if + no table is defined for a slot. Slots 0 and 1 are filled with the + JPEG sample tables by jpeg_set_defaults(). If you need to allocate + more table structures, jpeg_alloc_huff_table() may be used. + Note that optimal Huffman tables can be computed for an image + by setting optimize_coding, as discussed above; there's seldom + any need to mess with providing your own Huffman tables. + + +The actual dimensions of the JPEG image that will be written to the file are +given by the following fields. These are computed from the input image +dimensions and the compression parameters by jpeg_start_compress(). You can +also call jpeg_calc_jpeg_dimensions() to obtain the values that will result +from the current parameter settings. This can be useful if you are trying +to pick a scaling ratio that will get close to a desired target size. + +JDIMENSION jpeg_width Actual dimensions of output image. +JDIMENSION jpeg_height + + +Per-component parameters are stored in the struct cinfo.comp_info[i] for +component number i. Note that components here refer to components of the +JPEG color space, *not* the source image color space. A suitably large +comp_info[] array is allocated by jpeg_set_defaults(); if you choose not +to use that routine, it's up to you to allocate the array. + +int component_id + The one-byte identifier code to be recorded in the JPEG file for + this component. For the standard color spaces, we recommend you + leave the default values alone. + +int h_samp_factor +int v_samp_factor + Horizontal and vertical sampling factors for the component; must + be 1..4 according to the JPEG standard. Note that larger sampling + factors indicate a higher-resolution component; many people find + this behavior quite unintuitive. The default values are 2,2 for + luminance components and 1,1 for chrominance components, except + for grayscale where 1,1 is used. + +int quant_tbl_no + Quantization table number for component. The default value is + 0 for luminance components and 1 for chrominance components. + +int dc_tbl_no +int ac_tbl_no + DC and AC entropy coding table numbers. The default values are + 0 for luminance components and 1 for chrominance components. + +int component_index + Must equal the component's index in comp_info[]. (Beginning in + release v6, the compressor library will fill this in automatically; + you don't have to.) + + +Decompression parameter selection +--------------------------------- + +Decompression parameter selection is somewhat simpler than compression +parameter selection, since all of the JPEG internal parameters are +recorded in the source file and need not be supplied by the application. +(Unless you are working with abbreviated files, in which case see +"Abbreviated datastreams", below.) Decompression parameters control +the postprocessing done on the image to deliver it in a format suitable +for the application's use. Many of the parameters control speed/quality +tradeoffs, in which faster decompression may be obtained at the price of +a poorer-quality image. The defaults select the highest quality (slowest) +processing. + +The following fields in the JPEG object are set by jpeg_read_header() and +may be useful to the application in choosing decompression parameters: + +JDIMENSION image_width Width and height of image +JDIMENSION image_height +int num_components Number of color components +J_COLOR_SPACE jpeg_color_space Colorspace of image +boolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen + UINT8 JFIF_major_version Version information from JFIF marker + UINT8 JFIF_minor_version + UINT8 density_unit Resolution data from JFIF marker + UINT16 X_density + UINT16 Y_density +boolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen + UINT8 Adobe_transform Color transform code from Adobe marker + +The JPEG color space, unfortunately, is something of a guess since the JPEG +standard proper does not provide a way to record it. In practice most files +adhere to the JFIF or Adobe conventions, and the decoder will recognize these +correctly. See "Special color spaces", below, for more info. + + +The decompression parameters that determine the basic properties of the +returned image are: + +J_COLOR_SPACE out_color_space + Output color space. jpeg_read_header() sets an appropriate default + based on jpeg_color_space; typically it will be RGB or grayscale. + The application can change this field to request output in a different + colorspace. For example, set it to JCS_GRAYSCALE to get grayscale + output from a color file. (This is useful for previewing: grayscale + output is faster than full color since the color components need not + be processed.) Note that not all possible color space transforms are + currently implemented; you may need to extend jdcolor.c if you want an + unusual conversion. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Currently, + the supported scaling ratios are M/N with all M from 1 to 16, where + N is the source DCT size, which is 8 for baseline JPEG. (The library + design allows for arbitrary scaling ratios but this is not likely + to be implemented any time soon.) The values are initialized by + jpeg_read_header() with the source DCT size. For baseline JPEG + this is 8/8. If you change only the scale_num value while leaving + the other unchanged, then this specifies the DCT scaled size to be + applied on the given input. For baseline JPEG this is equivalent + to M/8 scaling, since the source DCT size for baseline JPEG is 8. + Smaller scaling ratios permit significantly faster decoding since + fewer pixels need be processed and a simpler IDCT method can be used. + +boolean quantize_colors + If set TRUE, colormapped output will be delivered. Default is FALSE, + meaning that full-color output will be delivered. + +The next three parameters are relevant only if quantize_colors is TRUE. + +int desired_number_of_colors + Maximum number of colors to use in generating a library-supplied color + map (the actual number of colors is returned in a different field). + Default 256. Ignored when the application supplies its own color map. + +boolean two_pass_quantize + If TRUE, an extra pass over the image is made to select a custom color + map for the image. This usually looks a lot better than the one-size- + fits-all colormap that is used otherwise. Default is TRUE. Ignored + when the application supplies its own color map. + +J_DITHER_MODE dither_mode + Selects color dithering method. Supported values are: + JDITHER_NONE no dithering: fast, very low quality + JDITHER_ORDERED ordered dither: moderate speed and quality + JDITHER_FS Floyd-Steinberg dither: slow, high quality + Default is JDITHER_FS. (At present, ordered dither is implemented + only in the single-pass, standard-colormap case. If you ask for + ordered dither when two_pass_quantize is TRUE or when you supply + an external color map, you'll get F-S dithering.) + +When quantize_colors is TRUE, the target color map is described by the next +two fields. colormap is set to NULL by jpeg_read_header(). The application +can supply a color map by setting colormap non-NULL and setting +actual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() +selects a suitable color map and sets these two fields itself. +[Implementation restriction: at present, an externally supplied colormap is +only accepted for 3-component output color spaces.] + +JSAMPARRAY colormap + The color map, represented as a 2-D pixel array of out_color_components + rows and actual_number_of_colors columns. Ignored if not quantizing. + CAUTION: if the JPEG library creates its own colormap, the storage + pointed to by this field is released by jpeg_finish_decompress(). + Copy the colormap somewhere else first, if you want to save it. + +int actual_number_of_colors + The number of colors in the color map. + +Additional decompression parameters that the application may set include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are the same + as described above for compression. + +boolean do_fancy_upsampling + If TRUE, use direct DCT scaling with DCT size > 8 for upsampling + of chroma components. + If FALSE, use only DCT size <= 8 and simple separate upsampling. + Default is TRUE. + For better image stability in multiple generation compression cycles + it is preferable that this value matches the corresponding + do_fancy_downsampling value in compression. + +boolean do_block_smoothing + If TRUE, interblock smoothing is applied in early stages of decoding + progressive JPEG files; if FALSE, not. Default is TRUE. Early + progression stages look "fuzzy" with smoothing, "blocky" without. + In any case, block smoothing ceases to be applied after the first few + AC coefficients are known to full accuracy, so it is relevant only + when using buffered-image mode for progressive images. + +boolean enable_1pass_quant +boolean enable_external_quant +boolean enable_2pass_quant + These are significant only in buffered-image mode, which is + described in its own section below. + + +The output image dimensions are given by the following fields. These are +computed from the source image dimensions and the decompression parameters +by jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() +to obtain the values that will result from the current parameter settings. +This can be useful if you are trying to pick a scaling ratio that will get +close to a desired target size. It's also important if you are using the +JPEG library's memory manager to allocate output buffer space, because you +are supposed to request such buffers *before* jpeg_start_decompress(). + +JDIMENSION output_width Actual dimensions of output image. +JDIMENSION output_height +int out_color_components Number of color components in out_color_space. +int output_components Number of color components returned. +int rec_outbuf_height Recommended height of scanline buffer. + +When quantizing colors, output_components is 1, indicating a single color map +index per pixel. Otherwise it equals out_color_components. The output arrays +are required to be output_width * output_components JSAMPLEs wide. + +rec_outbuf_height is the recommended minimum height (in scanlines) of the +buffer passed to jpeg_read_scanlines(). If the buffer is smaller, the +library will still work, but time will be wasted due to unnecessary data +copying. In high-quality modes, rec_outbuf_height is always 1, but some +faster, lower-quality modes set it to larger values (typically 2 to 4). +If you are going to ask for a high-speed processing mode, you may as well +go to the trouble of honoring rec_outbuf_height so as to avoid data copying. +(An output buffer larger than rec_outbuf_height lines is OK, but won't +provide any material speed improvement over that height.) + + +Special color spaces +-------------------- + +The JPEG standard itself is "color blind" and doesn't specify any particular +color space. It is customary to convert color data to a luminance/chrominance +color space before compressing, since this permits greater compression. The +existing de-facto JPEG file format standards specify YCbCr or grayscale data +(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special +applications such as multispectral images, other color spaces can be used, +but it must be understood that such files will be unportable. + +The JPEG library can handle the most common colorspace conversions (namely +RGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown +color space, passing it through without conversion. If you deal extensively +with an unusual color space, you can easily extend the library to understand +additional color spaces and perform appropriate conversions. + +For compression, the source data's color space is specified by field +in_color_space. This is transformed to the JPEG file's color space given +by jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color +space depending on in_color_space, but you can override this by calling +jpeg_set_colorspace(). Of course you must select a supported transformation. +jccolor.c currently supports the following transformations: + RGB => YCbCr + RGB => GRAYSCALE + YCbCr => GRAYSCALE + CMYK => YCCK +plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, +YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. + +The de-facto file format standards (JFIF and Adobe) specify APPn markers that +indicate the color space of the JPEG file. It is important to ensure that +these are written correctly, or omitted if the JPEG file's color space is not +one of the ones supported by the de-facto standards. jpeg_set_colorspace() +will set the compression parameters to include or omit the APPn markers +properly, so long as it is told the truth about the JPEG color space. +For example, if you are writing some random 3-component color space without +conversion, don't try to fake out the library by setting in_color_space and +jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an +APPn marker of your own devising to identify the colorspace --- see "Special +markers", below. + +When told that the color space is UNKNOWN, the library will default to using +luminance-quality compression parameters for all color components. You may +well want to change these parameters. See the source code for +jpeg_set_colorspace(), in jcparam.c, for details. + +For decompression, the JPEG file's color space is given in jpeg_color_space, +and this is transformed to the output color space out_color_space. +jpeg_read_header's setting of jpeg_color_space can be relied on if the file +conforms to JFIF or Adobe conventions, but otherwise it is no better than a +guess. If you know the JPEG file's color space for certain, you can override +jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also +selects a default output color space based on (its guess of) jpeg_color_space; +set out_color_space to override this. Again, you must select a supported +transformation. jdcolor.c currently supports + YCbCr => GRAYSCALE + YCbCr => RGB + GRAYSCALE => RGB + YCCK => CMYK +as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an +application can force grayscale JPEGs to look like color JPEGs if it only +wants to handle one case.) + +The two-pass color quantizer, jquant2.c, is specialized to handle RGB data +(it weights distances appropriately for RGB colors). You'll need to modify +the code if you want to use it for non-RGB output color spaces. Note that +jquant2.c is used to map to an application-supplied colormap as well as for +the normal two-pass colormap selection process. + +CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG +files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. +This is arguably a bug in Photoshop, but if you need to work with Photoshop +CMYK files, you will have to deal with it in your application. We cannot +"fix" this in the library by inverting the data during the CMYK<=>YCCK +transform, because that would break other applications, notably Ghostscript. +Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK +data in the same inverted-YCCK representation used in bare JPEG files, but +the surrounding PostScript code performs an inversion using the PS image +operator. I am told that Photoshop 3.0 will write uninverted YCCK in +EPS/JPEG files, and will omit the PS-level inversion. (But the data +polarity used in bare JPEG files will not change in 3.0.) In either case, +the JPEG library must not invert the data itself, or else Ghostscript would +read these EPS files incorrectly. + + +Error handling +-------------- + +When the default error handler is used, any error detected inside the JPEG +routines will cause a message to be printed on stderr, followed by exit(). +You can supply your own error handling routines to override this behavior +and to control the treatment of nonfatal warnings and trace/debug messages. +The file example.c illustrates the most common case, which is to have the +application regain control after an error rather than exiting. + +The JPEG library never writes any message directly; it always goes through +the error handling routines. Three classes of messages are recognized: + * Fatal errors: the library cannot continue. + * Warnings: the library can continue, but the data is corrupt, and a + damaged output image is likely to result. + * Trace/informational messages. These come with a trace level indicating + the importance of the message; you can control the verbosity of the + program by adjusting the maximum trace level that will be displayed. + +You may, if you wish, simply replace the entire JPEG error handling module +(jerror.c) with your own code. However, you can avoid code duplication by +only replacing some of the routines depending on the behavior you need. +This is accomplished by calling jpeg_std_error() as usual, but then overriding +some of the method pointers in the jpeg_error_mgr struct, as illustrated by +example.c. + +All of the error handling routines will receive a pointer to the JPEG object +(a j_common_ptr which points to either a jpeg_compress_struct or a +jpeg_decompress_struct; if you need to tell which, test the is_decompressor +field). This struct includes a pointer to the error manager struct in its +"err" field. Frequently, custom error handler routines will need to access +additional data which is not known to the JPEG library or the standard error +handler. The most convenient way to do this is to embed either the JPEG +object or the jpeg_error_mgr struct in a larger structure that contains +additional fields; then casting the passed pointer provides access to the +additional fields. Again, see example.c for one way to do it. (Beginning +with IJG version 6b, there is also a void pointer "client_data" in each +JPEG object, which the application can also use to find related data. +The library does not touch client_data at all.) + +The individual methods that you might wish to override are: + +error_exit (j_common_ptr cinfo) + Receives control for a fatal error. Information sufficient to + generate the error message has been stored in cinfo->err; call + output_message to display it. Control must NOT return to the caller; + generally this routine will exit() or longjmp() somewhere. + Typically you would override this routine to get rid of the exit() + default behavior. Note that if you continue processing, you should + clean up the JPEG object with jpeg_abort() or jpeg_destroy(). + +output_message (j_common_ptr cinfo) + Actual output of any JPEG message. Override this to send messages + somewhere other than stderr. Note that this method does not know + how to generate a message, only where to send it. + +format_message (j_common_ptr cinfo, char * buffer) + Constructs a readable error message string based on the error info + stored in cinfo->err. This method is called by output_message. Few + applications should need to override this method. One possible + reason for doing so is to implement dynamic switching of error message + language. + +emit_message (j_common_ptr cinfo, int msg_level) + Decide whether or not to emit a warning or trace message; if so, + calls output_message. The main reason for overriding this method + would be to abort on warnings. msg_level is -1 for warnings, + 0 and up for trace messages. + +Only error_exit() and emit_message() are called from the rest of the JPEG +library; the other two are internal to the error handler. + +The actual message texts are stored in an array of strings which is pointed to +by the field err->jpeg_message_table. The messages are numbered from 0 to +err->last_jpeg_message, and it is these code numbers that are used in the +JPEG library code. You could replace the message texts (for instance, with +messages in French or German) by changing the message table pointer. See +jerror.h for the default texts. CAUTION: this table will almost certainly +change or grow from one library version to the next. + +It may be useful for an application to add its own message texts that are +handled by the same mechanism. The error handler supports a second "add-on" +message table for this purpose. To define an addon table, set the pointer +err->addon_message_table and the message numbers err->first_addon_message and +err->last_addon_message. If you number the addon messages beginning at 1000 +or so, you won't have to worry about conflicts with the library's built-in +messages. See the sample applications cjpeg/djpeg for an example of using +addon messages (the addon messages are defined in cderror.h). + +Actual invocation of the error handler is done via macros defined in jerror.h: + ERREXITn(...) for fatal errors + WARNMSn(...) for corrupt-data warnings + TRACEMSn(...) for trace and informational messages. +These macros store the message code and any additional parameters into the +error handler struct, then invoke the error_exit() or emit_message() method. +The variants of each macro are for varying numbers of additional parameters. +The additional parameters are inserted into the generated message using +standard printf() format codes. + +See jerror.h and jerror.c for further details. + + +Compressed data handling (source and destination managers) +---------------------------------------------------------- + +The JPEG compression library sends its compressed data to a "destination +manager" module. The default destination manager just writes the data to a +memory buffer or to a stdio stream, but you can provide your own manager to +do something else. Similarly, the decompression library calls a "source +manager" to obtain the compressed data; you can provide your own source +manager if you want the data to come from somewhere other than a memory +buffer or a stdio stream. + +In both cases, compressed data is processed a bufferload at a time: the +destination or source manager provides a work buffer, and the library invokes +the manager only when the buffer is filled or emptied. (You could define a +one-character buffer to force the manager to be invoked for each byte, but +that would be rather inefficient.) The buffer's size and location are +controlled by the manager, not by the library. For example, the memory +source manager just makes the buffer pointer and length point to the original +data in memory. In this case the buffer-reload procedure will be invoked +only if the decompressor ran off the end of the datastream, which would +indicate an erroneous datastream. + +The work buffer is defined as an array of datatype JOCTET, which is generally +"char" or "unsigned char". On a machine where char is not exactly 8 bits +wide, you must define JOCTET as a wider data type and then modify the data +source and destination modules to transcribe the work arrays into 8-bit units +on external storage. + +A data destination manager struct contains a pointer and count defining the +next byte to write in the work buffer and the remaining free space: + + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is filled. The manager's empty_output_buffer method must reset the pointer +and count. The manager is expected to remember the buffer's starting address +and total size in private fields not visible to the library. + +A data destination manager provides three methods: + +init_destination (j_compress_ptr cinfo) + Initialize destination. This is called by jpeg_start_compress() + before any data is actually written. It must initialize + next_output_byte and free_in_buffer. free_in_buffer must be + initialized to a positive value. + +empty_output_buffer (j_compress_ptr cinfo) + This is called whenever the buffer has filled (free_in_buffer + reaches zero). In typical applications, it should write out the + *entire* buffer (use the saved start address and buffer length; + ignore the current state of next_output_byte and free_in_buffer). + Then reset the pointer & count to the start of the buffer, and + return TRUE indicating that the buffer has been dumped. + free_in_buffer must be set to a positive value when TRUE is + returned. A FALSE return should only be used when I/O suspension is + desired (this operating mode is discussed in the next section). + +term_destination (j_compress_ptr cinfo) + Terminate destination --- called by jpeg_finish_compress() after all + data has been written. In most applications, this must flush any + data remaining in the buffer. Use either next_output_byte or + free_in_buffer to determine how much data is in the buffer. + +term_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you +want the destination manager to be cleaned up during an abort, you must do it +yourself. + +You will also need code to create a jpeg_destination_mgr struct, fill in its +method pointers, and insert a pointer to the struct into the "dest" field of +the JPEG compression object. This can be done in-line in your setup code if +you like, but it's probably cleaner to provide a separate routine similar to +the jpeg_stdio_dest() or jpeg_mem_dest() routines of the supplied destination +managers. + +Decompression source managers follow a parallel design, but with some +additional frammishes. The source manager struct contains a pointer and count +defining the next byte to read from the work buffer and the number of bytes +remaining: + + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is emptied. The manager's fill_input_buffer method must reset the pointer and +count. In most applications, the manager must remember the buffer's starting +address and total size in private fields not visible to the library. + +A data source manager provides five methods: + +init_source (j_decompress_ptr cinfo) + Initialize source. This is called by jpeg_read_header() before any + data is actually read. Unlike init_destination(), it may leave + bytes_in_buffer set to 0 (in which case a fill_input_buffer() call + will occur immediately). + +fill_input_buffer (j_decompress_ptr cinfo) + This is called whenever bytes_in_buffer has reached zero and more + data is wanted. In typical applications, it should read fresh data + into the buffer (ignoring the current state of next_input_byte and + bytes_in_buffer), reset the pointer & count to the start of the + buffer, and return TRUE indicating that the buffer has been reloaded. + It is not necessary to fill the buffer entirely, only to obtain at + least one more byte. bytes_in_buffer MUST be set to a positive value + if TRUE is returned. A FALSE return should only be used when I/O + suspension is desired (this mode is discussed in the next section). + +skip_input_data (j_decompress_ptr cinfo, long num_bytes) + Skip num_bytes worth of data. The buffer pointer and count should + be advanced over num_bytes input bytes, refilling the buffer as + needed. This is used to skip over a potentially large amount of + uninteresting data (such as an APPn marker). In some applications + it may be possible to optimize away the reading of the skipped data, + but it's not clear that being smart is worth much trouble; large + skips are uncommon. bytes_in_buffer may be zero on return. + A zero or negative skip count should be treated as a no-op. + +resync_to_restart (j_decompress_ptr cinfo, int desired) + This routine is called only when the decompressor has failed to find + a restart (RSTn) marker where one is expected. Its mission is to + find a suitable point for resuming decompression. For most + applications, we recommend that you just use the default resync + procedure, jpeg_resync_to_restart(). However, if you are able to back + up in the input data stream, or if you have a-priori knowledge about + the likely location of restart markers, you may be able to do better. + Read the read_restart_marker() and jpeg_resync_to_restart() routines + in jdmarker.c if you think you'd like to implement your own resync + procedure. + +term_source (j_decompress_ptr cinfo) + Terminate source --- called by jpeg_finish_decompress() after all + data has been read. Often a no-op. + +For both fill_input_buffer() and skip_input_data(), there is no such thing +as an EOF return. If the end of the file has been reached, the routine has +a choice of exiting via ERREXIT() or inserting fake data into the buffer. +In most cases, generating a warning message and inserting a fake EOI marker +is the best course of action --- this will allow the decompressor to output +however much of the image is there. In pathological cases, the decompressor +may swallow the EOI and again demand data ... just keep feeding it fake EOIs. +jdatasrc.c illustrates the recommended error recovery behavior. + +term_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want +the source manager to be cleaned up during an abort, you must do it yourself. + +You will also need code to create a jpeg_source_mgr struct, fill in its method +pointers, and insert a pointer to the struct into the "src" field of the JPEG +decompression object. This can be done in-line in your setup code if you +like, but it's probably cleaner to provide a separate routine similar to the +jpeg_stdio_src() or jpeg_mem_src() routines of the supplied source managers. + +For more information, consult the memory and stdio source and destination +managers in jdatasrc.c and jdatadst.c. + + +I/O suspension +-------------- + +Some applications need to use the JPEG library as an incremental memory-to- +memory filter: when the compressed data buffer is filled or emptied, they want +control to return to the outer loop, rather than expecting that the buffer can +be emptied or reloaded within the data source/destination manager subroutine. +The library supports this need by providing an "I/O suspension" mode, which we +describe in this section. + +The I/O suspension mode is not a panacea: nothing is guaranteed about the +maximum amount of time spent in any one call to the library, so it will not +eliminate response-time problems in single-threaded applications. If you +need guaranteed response time, we suggest you "bite the bullet" and implement +a real multi-tasking capability. + +To use I/O suspension, cooperation is needed between the calling application +and the data source or destination manager; you will always need a custom +source/destination manager. (Please read the previous section if you haven't +already.) The basic idea is that the empty_output_buffer() or +fill_input_buffer() routine is a no-op, merely returning FALSE to indicate +that it has done nothing. Upon seeing this, the JPEG library suspends +operation and returns to its caller. The surrounding application is +responsible for emptying or refilling the work buffer before calling the +JPEG library again. + +Compression suspension: + +For compression suspension, use an empty_output_buffer() routine that returns +FALSE; typically it will not do anything else. This will cause the +compressor to return to the caller of jpeg_write_scanlines(), with the return +value indicating that not all the supplied scanlines have been accepted. +The application must make more room in the output buffer, adjust the output +buffer pointer/count appropriately, and then call jpeg_write_scanlines() +again, pointing to the first unconsumed scanline. + +When forced to suspend, the compressor will backtrack to a convenient stopping +point (usually the start of the current MCU); it will regenerate some output +data when restarted. Therefore, although empty_output_buffer() is only +called when the buffer is filled, you should NOT write out the entire buffer +after a suspension. Write only the data up to the current position of +next_output_byte/free_in_buffer. The data beyond that point will be +regenerated after resumption. + +Because of the backtracking behavior, a good-size output buffer is essential +for efficiency; you don't want the compressor to suspend often. (In fact, an +overly small buffer could lead to infinite looping, if a single MCU required +more data than would fit in the buffer.) We recommend a buffer of at least +several Kbytes. You may want to insert explicit code to ensure that you don't +call jpeg_write_scanlines() unless there is a reasonable amount of space in +the output buffer; in other words, flush the buffer before trying to compress +more data. + +The compressor does not allow suspension while it is trying to write JPEG +markers at the beginning and end of the file. This means that: + * At the beginning of a compression operation, there must be enough free + space in the output buffer to hold the header markers (typically 600 or + so bytes). The recommended buffer size is bigger than this anyway, so + this is not a problem as long as you start with an empty buffer. However, + this restriction might catch you if you insert large special markers, such + as a JFIF thumbnail image, without flushing the buffer afterwards. + * When you call jpeg_finish_compress(), there must be enough space in the + output buffer to emit any buffered data and the final EOI marker. In the + current implementation, half a dozen bytes should suffice for this, but + for safety's sake we recommend ensuring that at least 100 bytes are free + before calling jpeg_finish_compress(). + +A more significant restriction is that jpeg_finish_compress() cannot suspend. +This means you cannot use suspension with multi-pass operating modes, namely +Huffman code optimization and multiple-scan output. Those modes write the +whole file during jpeg_finish_compress(), which will certainly result in +buffer overrun. (Note that this restriction applies only to compression, +not decompression. The decompressor supports input suspension in all of its +operating modes.) + +Decompression suspension: + +For decompression suspension, use a fill_input_buffer() routine that simply +returns FALSE (except perhaps during error recovery, as discussed below). +This will cause the decompressor to return to its caller with an indication +that suspension has occurred. This can happen at four places: + * jpeg_read_header(): will return JPEG_SUSPENDED. + * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. + * jpeg_read_scanlines(): will return the number of scanlines already + completed (possibly 0). + * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. +The surrounding application must recognize these cases, load more data into +the input buffer, and repeat the call. In the case of jpeg_read_scanlines(), +increment the passed pointers past any scanlines successfully read. + +Just as with compression, the decompressor will typically backtrack to a +convenient restart point before suspending. When fill_input_buffer() is +called, next_input_byte/bytes_in_buffer point to the current restart point, +which is where the decompressor will backtrack to if FALSE is returned. +The data beyond that position must NOT be discarded if you suspend; it needs +to be re-read upon resumption. In most implementations, you'll need to shift +this data down to the start of your work buffer and then load more data after +it. Again, this behavior means that a several-Kbyte work buffer is essential +for decent performance; furthermore, you should load a reasonable amount of +new data before resuming decompression. (If you loaded, say, only one new +byte each time around, you could waste a LOT of cycles.) + +The skip_input_data() source manager routine requires special care in a +suspension scenario. This routine is NOT granted the ability to suspend the +decompressor; it can decrement bytes_in_buffer to zero, but no more. If the +requested skip distance exceeds the amount of data currently in the input +buffer, then skip_input_data() must set bytes_in_buffer to zero and record the +additional skip distance somewhere else. The decompressor will immediately +call fill_input_buffer(), which should return FALSE, which will cause a +suspension return. The surrounding application must then arrange to discard +the recorded number of bytes before it resumes loading the input buffer. +(Yes, this design is rather baroque, but it avoids complexity in the far more +common case where a non-suspending source manager is used.) + +If the input data has been exhausted, we recommend that you emit a warning +and insert dummy EOI markers just as a non-suspending data source manager +would do. This can be handled either in the surrounding application logic or +within fill_input_buffer(); the latter is probably more efficient. If +fill_input_buffer() knows that no more data is available, it can set the +pointer/count to point to a dummy EOI marker and then return TRUE just as +though it had read more data in a non-suspending situation. + +The decompressor does not attempt to suspend within standard JPEG markers; +instead it will backtrack to the start of the marker and reprocess the whole +marker next time. Hence the input buffer must be large enough to hold the +longest standard marker in the file. Standard JPEG markers should normally +not exceed a few hundred bytes each (DHT tables are typically the longest). +We recommend at least a 2K buffer for performance reasons, which is much +larger than any correct marker is likely to be. For robustness against +damaged marker length counts, you may wish to insert a test in your +application for the case that the input buffer is completely full and yet +the decoder has suspended without consuming any data --- otherwise, if this +situation did occur, it would lead to an endless loop. (The library can't +provide this test since it has no idea whether "the buffer is full", or +even whether there is a fixed-size input buffer.) + +The input buffer would need to be 64K to allow for arbitrary COM or APPn +markers, but these are handled specially: they are either saved into allocated +memory, or skipped over by calling skip_input_data(). In the former case, +suspension is handled correctly, and in the latter case, the problem of +buffer overrun is placed on skip_input_data's shoulders, as explained above. +Note that if you provide your own marker handling routine for large markers, +you should consider how to deal with buffer overflow. + +Multiple-buffer management: + +In some applications it is desirable to store the compressed data in a linked +list of buffer areas, so as to avoid data copying. This can be handled by +having empty_output_buffer() or fill_input_buffer() set the pointer and count +to reference the next available buffer; FALSE is returned only if no more +buffers are available. Although seemingly straightforward, there is a +pitfall in this approach: the backtrack that occurs when FALSE is returned +could back up into an earlier buffer. For example, when fill_input_buffer() +is called, the current pointer & count indicate the backtrack restart point. +Since fill_input_buffer() will set the pointer and count to refer to a new +buffer, the restart position must be saved somewhere else. Suppose a second +call to fill_input_buffer() occurs in the same library call, and no +additional input data is available, so fill_input_buffer must return FALSE. +If the JPEG library has not moved the pointer/count forward in the current +buffer, then *the correct restart point is the saved position in the prior +buffer*. Prior buffers may be discarded only after the library establishes +a restart point within a later buffer. Similar remarks apply for output into +a chain of buffers. + +The library will never attempt to backtrack over a skip_input_data() call, +so any skipped data can be permanently discarded. You still have to deal +with the case of skipping not-yet-received data, however. + +It's much simpler to use only a single buffer; when fill_input_buffer() is +called, move any unconsumed data (beyond the current pointer/count) down to +the beginning of this buffer and then load new data into the remaining buffer +space. This approach requires a little more data copying but is far easier +to get right. + + +Progressive JPEG support +------------------------ + +Progressive JPEG rearranges the stored data into a series of scans of +increasing quality. In situations where a JPEG file is transmitted across a +slow communications link, a decoder can generate a low-quality image very +quickly from the first scan, then gradually improve the displayed quality as +more scans are received. The final image after all scans are complete is +identical to that of a regular (sequential) JPEG file of the same quality +setting. Progressive JPEG files are often slightly smaller than equivalent +sequential JPEG files, but the possibility of incremental display is the main +reason for using progressive JPEG. + +The IJG encoder library generates progressive JPEG files when given a +suitable "scan script" defining how to divide the data into scans. +Creation of progressive JPEG files is otherwise transparent to the encoder. +Progressive JPEG files can also be read transparently by the decoder library. +If the decoding application simply uses the library as defined above, it +will receive a final decoded image without any indication that the file was +progressive. Of course, this approach does not allow incremental display. +To perform incremental display, an application needs to use the decoder +library's "buffered-image" mode, in which it receives a decoded image +multiple times. + +Each displayed scan requires about as much work to decode as a full JPEG +image of the same size, so the decoder must be fairly fast in relation to the +data transmission rate in order to make incremental display useful. However, +it is possible to skip displaying the image and simply add the incoming bits +to the decoder's coefficient buffer. This is fast because only Huffman +decoding need be done, not IDCT, upsampling, colorspace conversion, etc. +The IJG decoder library allows the application to switch dynamically between +displaying the image and simply absorbing the incoming bits. A properly +coded application can automatically adapt the number of display passes to +suit the time available as the image is received. Also, a final +higher-quality display cycle can be performed from the buffered data after +the end of the file is reached. + +Progressive compression: + +To create a progressive JPEG file (or a multiple-scan sequential JPEG file), +set the scan_info cinfo field to point to an array of scan descriptors, and +perform compression as usual. Instead of constructing your own scan list, +you can call the jpeg_simple_progression() helper routine to create a +recommended progression sequence; this method should be used by all +applications that don't want to get involved in the nitty-gritty of +progressive scan sequence design. (If you want to provide user control of +scan sequences, you may wish to borrow the scan script reading code found +in rdswitch.c, so that you can read scan script files just like cjpeg's.) +When scan_info is not NULL, the compression library will store DCT'd data +into a buffer array as jpeg_write_scanlines() is called, and will emit all +the requested scans during jpeg_finish_compress(). This implies that +multiple-scan output cannot be created with a suspending data destination +manager, since jpeg_finish_compress() does not support suspension. We +should also note that the compressor currently forces Huffman optimization +mode when creating a progressive JPEG file, because the default Huffman +tables are unsuitable for progressive files. + +Progressive decompression: + +When buffered-image mode is not used, the decoder library will read all of +a multi-scan file during jpeg_start_decompress(), so that it can provide a +final decoded image. (Here "multi-scan" means either progressive or +multi-scan sequential.) This makes multi-scan files transparent to the +decoding application. However, existing applications that used suspending +input with version 5 of the IJG library will need to be modified to check +for a suspension return from jpeg_start_decompress(). + +To perform incremental display, an application must use the library's +buffered-image mode. This is described in the next section. + + +Buffered-image mode +------------------- + +In buffered-image mode, the library stores the partially decoded image in a +coefficient buffer, from which it can be read out as many times as desired. +This mode is typically used for incremental display of progressive JPEG files, +but it can be used with any JPEG file. Each scan of a progressive JPEG file +adds more data (more detail) to the buffered image. The application can +display in lockstep with the source file (one display pass per input scan), +or it can allow input processing to outrun display processing. By making +input and display processing run independently, it is possible for the +application to adapt progressive display to a wide range of data transmission +rates. + +The basic control flow for buffered-image decoding is + + jpeg_create_decompress() + set data source + jpeg_read_header() + set overall decompression parameters + cinfo.buffered_image = TRUE; /* select buffered-image mode */ + jpeg_start_decompress() + for (each output pass) { + adjust output decompression parameters if required + jpeg_start_output() /* start a new output pass */ + for (all scanlines in image) { + jpeg_read_scanlines() + display scanlines + } + jpeg_finish_output() /* terminate output pass */ + } + jpeg_finish_decompress() + jpeg_destroy_decompress() + +This differs from ordinary unbuffered decoding in that there is an additional +level of looping. The application can choose how many output passes to make +and how to display each pass. + +The simplest approach to displaying progressive images is to do one display +pass for each scan appearing in the input file. In this case the outer loop +condition is typically + while (! jpeg_input_complete(&cinfo)) +and the start-output call should read + jpeg_start_output(&cinfo, cinfo.input_scan_number); +The second parameter to jpeg_start_output() indicates which scan of the input +file is to be displayed; the scans are numbered starting at 1 for this +purpose. (You can use a loop counter starting at 1 if you like, but using +the library's input scan counter is easier.) The library automatically reads +data as necessary to complete each requested scan, and jpeg_finish_output() +advances to the next scan or end-of-image marker (hence input_scan_number +will be incremented by the time control arrives back at jpeg_start_output()). +With this technique, data is read from the input file only as needed, and +input and output processing run in lockstep. + +After reading the final scan and reaching the end of the input file, the +buffered image remains available; it can be read additional times by +repeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() +sequence. For example, a useful technique is to use fast one-pass color +quantization for display passes made while the image is arriving, followed by +a final display pass using two-pass quantization for highest quality. This +is done by changing the library parameters before the final output pass. +Changing parameters between passes is discussed in detail below. + +In general the last scan of a progressive file cannot be recognized as such +until after it is read, so a post-input display pass is the best approach if +you want special processing in the final pass. + +When done with the image, be sure to call jpeg_finish_decompress() to release +the buffered image (or just use jpeg_destroy_decompress()). + +If input data arrives faster than it can be displayed, the application can +cause the library to decode input data in advance of what's needed to produce +output. This is done by calling the routine jpeg_consume_input(). +The return value is one of the following: + JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) + JPEG_REACHED_EOI: reached the EOI marker (end of image) + JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data + JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan + JPEG_SUSPENDED: suspended before completing any of the above +(JPEG_SUSPENDED can occur only if a suspending data source is used.) This +routine can be called at any time after initializing the JPEG object. It +reads some additional data and returns when one of the indicated significant +events occurs. (If called after the EOI marker is reached, it will +immediately return JPEG_REACHED_EOI without attempting to read more data.) + +The library's output processing will automatically call jpeg_consume_input() +whenever the output processing overtakes the input; thus, simple lockstep +display requires no direct calls to jpeg_consume_input(). But by adding +calls to jpeg_consume_input(), you can absorb data in advance of what is +being displayed. This has two benefits: + * You can limit buildup of unprocessed data in your input buffer. + * You can eliminate extra display passes by paying attention to the + state of the library's input processing. + +The first of these benefits only requires interspersing calls to +jpeg_consume_input() with your display operations and any other processing +you may be doing. To avoid wasting cycles due to backtracking, it's best to +call jpeg_consume_input() only after a hundred or so new bytes have arrived. +This is discussed further under "I/O suspension", above. (Note: the JPEG +library currently is not thread-safe. You must not call jpeg_consume_input() +from one thread of control if a different library routine is working on the +same JPEG object in another thread.) + +When input arrives fast enough that more than one new scan is available +before you start a new output pass, you may as well skip the output pass +corresponding to the completed scan. This occurs for free if you pass +cinfo.input_scan_number as the target scan number to jpeg_start_output(). +The input_scan_number field is simply the index of the scan currently being +consumed by the input processor. You can ensure that this is up-to-date by +emptying the input buffer just before calling jpeg_start_output(): call +jpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or +JPEG_REACHED_EOI. + +The target scan number passed to jpeg_start_output() is saved in the +cinfo.output_scan_number field. The library's output processing calls +jpeg_consume_input() whenever the current input scan number and row within +that scan is less than or equal to the current output scan number and row. +Thus, input processing can "get ahead" of the output processing but is not +allowed to "fall behind". You can achieve several different effects by +manipulating this interlock rule. For example, if you pass a target scan +number greater than the current input scan number, the output processor will +wait until that scan starts to arrive before producing any output. (To avoid +an infinite loop, the target scan number is automatically reset to the last +scan number when the end of image is reached. Thus, if you specify a large +target scan number, the library will just absorb the entire input file and +then perform an output pass. This is effectively the same as what +jpeg_start_decompress() does when you don't select buffered-image mode.) +When you pass a target scan number equal to the current input scan number, +the image is displayed no faster than the current input scan arrives. The +final possibility is to pass a target scan number less than the current input +scan number; this disables the input/output interlock and causes the output +processor to simply display whatever it finds in the image buffer, without +waiting for input. (However, the library will not accept a target scan +number less than one, so you can't avoid waiting for the first scan.) + +When data is arriving faster than the output display processing can advance +through the image, jpeg_consume_input() will store data into the buffered +image beyond the point at which the output processing is reading data out +again. If the input arrives fast enough, it may "wrap around" the buffer to +the point where the input is more than one whole scan ahead of the output. +If the output processing simply proceeds through its display pass without +paying attention to the input, the effect seen on-screen is that the lower +part of the image is one or more scans better in quality than the upper part. +Then, when the next output scan is started, you have a choice of what target +scan number to use. The recommended choice is to use the current input scan +number at that time, which implies that you've skipped the output scans +corresponding to the input scans that were completed while you processed the +previous output scan. In this way, the decoder automatically adapts its +speed to the arriving data, by skipping output scans as necessary to keep up +with the arriving data. + +When using this strategy, you'll want to be sure that you perform a final +output pass after receiving all the data; otherwise your last display may not +be full quality across the whole screen. So the right outer loop logic is +something like this: + do { + absorb any waiting input by calling jpeg_consume_input() + final_pass = jpeg_input_complete(&cinfo); + adjust output decompression parameters if required + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + } while (! final_pass); +rather than quitting as soon as jpeg_input_complete() returns TRUE. This +arrangement makes it simple to use higher-quality decoding parameters +for the final pass. But if you don't want to use special parameters for +the final pass, the right loop logic is like this: + for (;;) { + absorb any waiting input by calling jpeg_consume_input() + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + if (jpeg_input_complete(&cinfo) && + cinfo.input_scan_number == cinfo.output_scan_number) + break; + } +In this case you don't need to know in advance whether an output pass is to +be the last one, so it's not necessary to have reached EOF before starting +the final output pass; rather, what you want to test is whether the output +pass was performed in sync with the final input scan. This form of the loop +will avoid an extra output pass whenever the decoder is able (or nearly able) +to keep up with the incoming data. + +When the data transmission speed is high, you might begin a display pass, +then find that much or all of the file has arrived before you can complete +the pass. (You can detect this by noting the JPEG_REACHED_EOI return code +from jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) +In this situation you may wish to abort the current display pass and start a +new one using the newly arrived information. To do so, just call +jpeg_finish_output() and then start a new pass with jpeg_start_output(). + +A variant strategy is to abort and restart display if more than one complete +scan arrives during an output pass; this can be detected by noting +JPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This +idea should be employed with caution, however, since the display process +might never get to the bottom of the image before being aborted, resulting +in the lower part of the screen being several passes worse than the upper. +In most cases it's probably best to abort an output pass only if the whole +file has arrived and you want to begin the final output pass immediately. + +When receiving data across a communication link, we recommend always using +the current input scan number for the output target scan number; if a +higher-quality final pass is to be done, it should be started (aborting any +incomplete output pass) as soon as the end of file is received. However, +many other strategies are possible. For example, the application can examine +the parameters of the current input scan and decide whether to display it or +not. If the scan contains only chroma data, one might choose not to use it +as the target scan, expecting that the scan will be small and will arrive +quickly. To skip to the next scan, call jpeg_consume_input() until it +returns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher +number as the target scan for jpeg_start_output(); but that method doesn't +let you inspect the next scan's parameters before deciding to display it. + + +In buffered-image mode, jpeg_start_decompress() never performs input and +thus never suspends. An application that uses input suspension with +buffered-image mode must be prepared for suspension returns from these +routines: +* jpeg_start_output() performs input only if you request 2-pass quantization + and the target scan isn't fully read yet. (This is discussed below.) +* jpeg_read_scanlines(), as always, returns the number of scanlines that it + was able to produce before suspending. +* jpeg_finish_output() will read any markers following the target scan, + up to the end of the file or the SOS marker that begins another scan. + (But it reads no input if jpeg_consume_input() has already reached the + end of the file or a SOS marker beyond the target output scan.) +* jpeg_finish_decompress() will read until the end of file, and thus can + suspend if the end hasn't already been reached (as can be tested by + calling jpeg_input_complete()). +jpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() +all return TRUE if they completed their tasks, FALSE if they had to suspend. +In the event of a FALSE return, the application must load more input data +and repeat the call. Applications that use non-suspending data sources need +not check the return values of these three routines. + + +It is possible to change decoding parameters between output passes in the +buffered-image mode. The decoder library currently supports only very +limited changes of parameters. ONLY THE FOLLOWING parameter changes are +allowed after jpeg_start_decompress() is called: +* dct_method can be changed before each call to jpeg_start_output(). + For example, one could use a fast DCT method for early scans, changing + to a higher quality method for the final scan. +* dither_mode can be changed before each call to jpeg_start_output(); + of course this has no impact if not using color quantization. Typically + one would use ordered dither for initial passes, then switch to + Floyd-Steinberg dither for the final pass. Caution: changing dither mode + can cause more memory to be allocated by the library. Although the amount + of memory involved is not large (a scanline or so), it may cause the + initial max_memory_to_use specification to be exceeded, which in the worst + case would result in an out-of-memory failure. +* do_block_smoothing can be changed before each call to jpeg_start_output(). + This setting is relevant only when decoding a progressive JPEG image. + During the first DC-only scan, block smoothing provides a very "fuzzy" look + instead of the very "blocky" look seen without it; which is better seems a + matter of personal taste. But block smoothing is nearly always a win + during later stages, especially when decoding a successive-approximation + image: smoothing helps to hide the slight blockiness that otherwise shows + up on smooth gradients until the lowest coefficient bits are sent. +* Color quantization mode can be changed under the rules described below. + You *cannot* change between full-color and quantized output (because that + would alter the required I/O buffer sizes), but you can change which + quantization method is used. + +When generating color-quantized output, changing quantization method is a +very useful way of switching between high-speed and high-quality display. +The library allows you to change among its three quantization methods: +1. Single-pass quantization to a fixed color cube. + Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. +2. Single-pass quantization to an application-supplied colormap. + Selected by setting cinfo.colormap to point to the colormap (the value of + two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. +3. Two-pass quantization to a colormap chosen specifically for the image. + Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. + (This is the default setting selected by jpeg_read_header, but it is + probably NOT what you want for the first pass of progressive display!) +These methods offer successively better quality and lesser speed. However, +only the first method is available for quantizing in non-RGB color spaces. + +IMPORTANT: because the different quantizer methods have very different +working-storage requirements, the library requires you to indicate which +one(s) you intend to use before you call jpeg_start_decompress(). (If we did +not require this, the max_memory_to_use setting would be a complete fiction.) +You do this by setting one or more of these three cinfo fields to TRUE: + enable_1pass_quant Fixed color cube colormap + enable_external_quant Externally-supplied colormap + enable_2pass_quant Two-pass custom colormap +All three are initialized FALSE by jpeg_read_header(). But +jpeg_start_decompress() automatically sets TRUE the one selected by the +current two_pass_quantize and colormap settings, so you only need to set the +enable flags for any other quantization methods you plan to change to later. + +After setting the enable flags correctly at jpeg_start_decompress() time, you +can change to any enabled quantization method by setting two_pass_quantize +and colormap properly just before calling jpeg_start_output(). The following +special rules apply: +1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass + or 2-pass mode from a different mode, or when you want the 2-pass + quantizer to be re-run to generate a new colormap. +2. To switch to an external colormap, or to change to a different external + colormap than was used on the prior pass, you must call + jpeg_new_colormap() after setting cinfo.colormap. +NOTE: if you want to use the same colormap as was used in the prior pass, +you should not do either of these things. This will save some nontrivial +switchover costs. +(These requirements exist because cinfo.colormap will always be non-NULL +after completing a prior output pass, since both the 1-pass and 2-pass +quantizers set it to point to their output colormaps. Thus you have to +do one of these two things to notify the library that something has changed. +Yup, it's a bit klugy, but it's necessary to do it this way for backwards +compatibility.) + +Note that in buffered-image mode, the library generates any requested colormap +during jpeg_start_output(), not during jpeg_start_decompress(). + +When using two-pass quantization, jpeg_start_output() makes a pass over the +buffered image to determine the optimum color map; it therefore may take a +significant amount of time, whereas ordinarily it does little work. The +progress monitor hook is called during this pass, if defined. It is also +important to realize that if the specified target scan number is greater than +or equal to the current input scan number, jpeg_start_output() will attempt +to consume input as it makes this pass. If you use a suspending data source, +you need to check for a FALSE return from jpeg_start_output() under these +conditions. The combination of 2-pass quantization and a not-yet-fully-read +target scan is the only case in which jpeg_start_output() will consume input. + + +Application authors who support buffered-image mode may be tempted to use it +for all JPEG images, even single-scan ones. This will work, but it is +inefficient: there is no need to create an image-sized coefficient buffer for +single-scan images. Requesting buffered-image mode for such an image wastes +memory. Worse, it can cost time on large images, since the buffered data has +to be swapped out or written to a temporary file. If you are concerned about +maximum performance on baseline JPEG files, you should use buffered-image +mode only when the incoming file actually has multiple scans. This can be +tested by calling jpeg_has_multiple_scans(), which will return a correct +result at any time after jpeg_read_header() completes. + +It is also worth noting that when you use jpeg_consume_input() to let input +processing get ahead of output processing, the resulting pattern of access to +the coefficient buffer is quite nonsequential. It's best to use the memory +manager jmemnobs.c if you can (ie, if you have enough real or virtual main +memory). If not, at least make sure that max_memory_to_use is set as high as +possible. If the JPEG memory manager has to use a temporary file, you will +probably see a lot of disk traffic and poor performance. (This could be +improved with additional work on the memory manager, but we haven't gotten +around to it yet.) + +In some applications it may be convenient to use jpeg_consume_input() for all +input processing, including reading the initial markers; that is, you may +wish to call jpeg_consume_input() instead of jpeg_read_header() during +startup. This works, but note that you must check for JPEG_REACHED_SOS and +JPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. +Once the first SOS marker has been reached, you must call +jpeg_start_decompress() before jpeg_consume_input() will consume more input; +it'll just keep returning JPEG_REACHED_SOS until you do. If you read a +tables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI +without ever returning JPEG_REACHED_SOS; be sure to check for this case. +If this happens, the decompressor will not read any more input until you call +jpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not +using buffered-image mode, but in that case it's basically a no-op after the +initial markers have been read: it will just return JPEG_SUSPENDED. + + +Abbreviated datastreams and multiple images +------------------------------------------- + +A JPEG compression or decompression object can be reused to process multiple +images. This saves a small amount of time per image by eliminating the +"create" and "destroy" operations, but that isn't the real purpose of the +feature. Rather, reuse of an object provides support for abbreviated JPEG +datastreams. Object reuse can also simplify processing a series of images in +a single input or output file. This section explains these features. + +A JPEG file normally contains several hundred bytes worth of quantization +and Huffman tables. In a situation where many images will be stored or +transmitted with identical tables, this may represent an annoying overhead. +The JPEG standard therefore permits tables to be omitted. The standard +defines three classes of JPEG datastreams: + * "Interchange" datastreams contain an image and all tables needed to decode + the image. These are the usual kind of JPEG file. + * "Abbreviated image" datastreams contain an image, but are missing some or + all of the tables needed to decode that image. + * "Abbreviated table specification" (henceforth "tables-only") datastreams + contain only table specifications. +To decode an abbreviated image, it is necessary to load the missing table(s) +into the decoder beforehand. This can be accomplished by reading a separate +tables-only file. A variant scheme uses a series of images in which the first +image is an interchange (complete) datastream, while subsequent ones are +abbreviated and rely on the tables loaded by the first image. It is assumed +that once the decoder has read a table, it will remember that table until a +new definition for the same table number is encountered. + +It is the application designer's responsibility to figure out how to associate +the correct tables with an abbreviated image. While abbreviated datastreams +can be useful in a closed environment, their use is strongly discouraged in +any situation where data exchange with other applications might be needed. +Caveat designer. + +The JPEG library provides support for reading and writing any combination of +tables-only datastreams and abbreviated images. In both compression and +decompression objects, a quantization or Huffman table will be retained for +the lifetime of the object, unless it is overwritten by a new table definition. + + +To create abbreviated image datastreams, it is only necessary to tell the +compressor not to emit some or all of the tables it is using. Each +quantization and Huffman table struct contains a boolean field "sent_table", +which normally is initialized to FALSE. For each table used by the image, the +header-writing process emits the table and sets sent_table = TRUE unless it is +already TRUE. (In normal usage, this prevents outputting the same table +definition multiple times, as would otherwise occur because the chroma +components typically share tables.) Thus, setting this field to TRUE before +calling jpeg_start_compress() will prevent the table from being written at +all. + +If you want to create a "pure" abbreviated image file containing no tables, +just call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the +tables. If you want to emit some but not all tables, you'll need to set the +individual sent_table fields directly. + +To create an abbreviated image, you must also call jpeg_start_compress() +with a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() +will force all the sent_table fields to FALSE. (This is a safety feature to +prevent abbreviated images from being created accidentally.) + +To create a tables-only file, perform the same parameter setup that you +normally would, but instead of calling jpeg_start_compress() and so on, call +jpeg_write_tables(&cinfo). This will write an abbreviated datastream +containing only SOI, DQT and/or DHT markers, and EOI. All the quantization +and Huffman tables that are currently defined in the compression object will +be emitted unless their sent_tables flag is already TRUE, and then all the +sent_tables flags will be set TRUE. + +A sure-fire way to create matching tables-only and abbreviated image files +is to proceed as follows: + + create JPEG compression object + set JPEG parameters + set destination to tables-only file + jpeg_write_tables(&cinfo); + set destination to image file + jpeg_start_compress(&cinfo, FALSE); + write data... + jpeg_finish_compress(&cinfo); + +Since the JPEG parameters are not altered between writing the table file and +the abbreviated image file, the same tables are sure to be used. Of course, +you can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence +many times to produce many abbreviated image files matching the table file. + +You cannot suppress output of the computed Huffman tables when Huffman +optimization is selected. (If you could, there'd be no way to decode the +image...) Generally, you don't want to set optimize_coding = TRUE when +you are trying to produce abbreviated files. + +In some cases you might want to compress an image using tables which are +not stored in the application, but are defined in an interchange or +tables-only file readable by the application. This can be done by setting up +a JPEG decompression object to read the specification file, then copying the +tables into your compression object. See jpeg_copy_critical_parameters() +for an example of copying quantization tables. + + +To read abbreviated image files, you simply need to load the proper tables +into the decompression object before trying to read the abbreviated image. +If the proper tables are stored in the application program, you can just +allocate the table structs and fill in their contents directly. For example, +to load a fixed quantization table into table slot "n": + + if (cinfo.quant_tbl_ptrs[n] == NULL) + cinfo.quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) &cinfo); + quant_ptr = cinfo.quant_tbl_ptrs[n]; /* quant_ptr is JQUANT_TBL* */ + for (i = 0; i < 64; i++) { + /* Qtable[] is desired quantization table, in natural array order */ + quant_ptr->quantval[i] = Qtable[i]; + } + +Code to load a fixed Huffman table is typically (for AC table "n"): + + if (cinfo.ac_huff_tbl_ptrs[n] == NULL) + cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); + huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ + for (i = 1; i <= 16; i++) { + /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ + huff_ptr->bits[i] = counts[i]; + } + for (i = 0; i < 256; i++) { + /* symbols[] is the list of Huffman symbols, in code-length order */ + huff_ptr->huffval[i] = symbols[i]; + } + +(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a +constant JQUANT_TBL object is not safe. If the incoming file happened to +contain a quantization table definition, your master table would get +overwritten! Instead allocate a working table copy and copy the master table +into it, as illustrated above. Ditto for Huffman tables, of course.) + +You might want to read the tables from a tables-only file, rather than +hard-wiring them into your application. The jpeg_read_header() call is +sufficient to read a tables-only file. You must pass a second parameter of +FALSE to indicate that you do not require an image to be present. Thus, the +typical scenario is + + create JPEG decompression object + set source to tables-only file + jpeg_read_header(&cinfo, FALSE); + set source to abbreviated image file + jpeg_read_header(&cinfo, TRUE); + set decompression parameters + jpeg_start_decompress(&cinfo); + read data... + jpeg_finish_decompress(&cinfo); + +In some cases, you may want to read a file without knowing whether it contains +an image or just tables. In that case, pass FALSE and check the return value +from jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, +JPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, +JPEG_SUSPENDED, is possible when using a suspending data source manager.) +Note that jpeg_read_header() will not complain if you read an abbreviated +image for which you haven't loaded the missing tables; the missing-table check +occurs later, in jpeg_start_decompress(). + + +It is possible to read a series of images from a single source file by +repeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, +without releasing/recreating the JPEG object or the data source module. +(If you did reinitialize, any partial bufferload left in the data source +buffer at the end of one image would be discarded, causing you to lose the +start of the next image.) When you use this method, stored tables are +automatically carried forward, so some of the images can be abbreviated images +that depend on tables from earlier images. + +If you intend to write a series of images into a single destination file, +you might want to make a specialized data destination module that doesn't +flush the output buffer at term_destination() time. This would speed things +up by some trifling amount. Of course, you'd need to remember to flush the +buffer after the last image. You can make the later images be abbreviated +ones by passing FALSE to jpeg_start_compress(). + + +Special markers +--------------- + +Some applications may need to insert or extract special data in the JPEG +datastream. The JPEG standard provides marker types "COM" (comment) and +"APP0" through "APP15" (application) to hold application-specific data. +Unfortunately, the use of these markers is not specified by the standard. +COM markers are fairly widely used to hold user-supplied text. The JFIF file +format spec uses APP0 markers with specified initial strings to hold certain +data. Adobe applications use APP14 markers beginning with the string "Adobe" +for miscellaneous data. Other APPn markers are rarely seen, but might +contain almost anything. + +If you wish to store user-supplied text, we recommend you use COM markers +and place readable 7-bit ASCII text in them. Newline conventions are not +standardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR +(Mac style). A robust COM reader should be able to cope with random binary +garbage, including nulls, since some applications generate COM markers +containing non-ASCII junk. (But yours should not be one of them.) + +For program-supplied data, use an APPn marker, and be sure to begin it with an +identifying string so that you can tell whether the marker is actually yours. +It's probably best to avoid using APP0 or APP14 for any private markers. +(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you +not use APP8 markers for any private purposes, either.) + +Keep in mind that at most 65533 bytes can be put into one marker, but you +can have as many markers as you like. + +By default, the IJG compression library will write a JFIF APP0 marker if the +selected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if +the selected colorspace is RGB, CMYK, or YCCK. You can disable this, but +we don't recommend it. The decompression library will recognize JFIF and +Adobe markers and will set the JPEG colorspace properly when one is found. + + +You can write special markers immediately following the datastream header by +calling jpeg_write_marker() after jpeg_start_compress() and before the first +call to jpeg_write_scanlines(). When you do this, the markers appear after +the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before +all else. Specify the marker type parameter as "JPEG_COM" for COM or +"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write +any marker type, but we don't recommend writing any other kinds of marker.) +For example, to write a user comment string pointed to by comment_text: + jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); + +If it's not convenient to store all the marker data in memory at once, +you can instead call jpeg_write_m_header() followed by multiple calls to +jpeg_write_m_byte(). If you do it this way, it's your responsibility to +call jpeg_write_m_byte() exactly the number of times given in the length +parameter to jpeg_write_m_header(). (This method lets you empty the +output buffer partway through a marker, which might be important when +using a suspending data destination module. In any case, if you are using +a suspending destination, you should flush its buffer after inserting +any special markers. See "I/O suspension".) + +Or, if you prefer to synthesize the marker byte sequence yourself, +you can just cram it straight into the data destination module. + +If you are writing JFIF 1.02 extension markers (thumbnail images), don't +forget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the +correct JFIF version number in the JFIF header marker. The library's default +is to write version 1.01, but that's wrong if you insert any 1.02 extension +markers. (We could probably get away with just defaulting to 1.02, but there +used to be broken decoders that would complain about unknown minor version +numbers. To reduce compatibility risks it's safest not to write 1.02 unless +you are actually using 1.02 extensions.) + + +When reading, two methods of handling special markers are available: +1. You can ask the library to save the contents of COM and/or APPn markers +into memory, and then examine them at your leisure afterwards. +2. You can supply your own routine to process COM and/or APPn markers +on-the-fly as they are read. +The first method is simpler to use, especially if you are using a suspending +data source; writing a marker processor that copes with input suspension is +not easy (consider what happens if the marker is longer than your available +input buffer). However, the second method conserves memory since the marker +data need not be kept around after it's been processed. + +For either method, you'd normally set up marker handling after creating a +decompression object and before calling jpeg_read_header(), because the +markers of interest will typically be near the head of the file and so will +be scanned by jpeg_read_header. Once you've established a marker handling +method, it will be used for the life of that decompression object +(potentially many datastreams), unless you change it. Marker handling is +determined separately for COM markers and for each APPn marker code. + + +To save the contents of special markers in memory, call + jpeg_save_markers(cinfo, marker_code, length_limit) +where marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. +(To arrange to save all the special marker types, you need to call this +routine 17 times, for COM and APP0-APP15.) If the incoming marker is longer +than length_limit data bytes, only length_limit bytes will be saved; this +parameter allows you to avoid chewing up memory when you only need to see the +first few bytes of a potentially large marker. If you want to save all the +data, set length_limit to 0xFFFF; that is enough since marker lengths are only +16 bits. As a special case, setting length_limit to 0 prevents that marker +type from being saved at all. (That is the default behavior, in fact.) + +After jpeg_read_header() completes, you can examine the special markers by +following the cinfo->marker_list pointer chain. All the special markers in +the file appear in this list, in order of their occurrence in the file (but +omitting any markers of types you didn't ask for). Both the original data +length and the saved data length are recorded for each list entry; the latter +will not exceed length_limit for the particular marker type. Note that these +lengths exclude the marker length word, whereas the stored representation +within the JPEG file includes it. (Hence the maximum data length is really +only 65533.) + +It is possible that additional special markers appear in the file beyond the +SOS marker at which jpeg_read_header stops; if so, the marker list will be +extended during reading of the rest of the file. This is not expected to be +common, however. If you are short on memory you may want to reset the length +limit to zero for all marker types after finishing jpeg_read_header, to +ensure that the max_memory_to_use setting cannot be exceeded due to addition +of later markers. + +The marker list remains stored until you call jpeg_finish_decompress or +jpeg_abort, at which point the memory is freed and the list is set to empty. +(jpeg_destroy also releases the storage, of course.) + +Note that the library is internally interested in APP0 and APP14 markers; +if you try to set a small nonzero length limit on these types, the library +will silently force the length up to the minimum it wants. (But you can set +a zero length limit to prevent them from being saved at all.) Also, in a +16-bit environment, the maximum length limit may be constrained to less than +65533 by malloc() limitations. It is therefore best not to assume that the +effective length limit is exactly what you set it to be. + + +If you want to supply your own marker-reading routine, you do it by calling +jpeg_set_marker_processor(). A marker processor routine must have the +signature + boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) +Although the marker code is not explicitly passed, the routine can find it +in cinfo->unread_marker. At the time of call, the marker proper has been +read from the data source module. The processor routine is responsible for +reading the marker length word and the remaining parameter bytes, if any. +Return TRUE to indicate success. (FALSE should be returned only if you are +using a suspending data source and it tells you to suspend. See the standard +marker processors in jdmarker.c for appropriate coding methods if you need to +use a suspending data source.) + +If you override the default APP0 or APP14 processors, it is up to you to +recognize JFIF and Adobe markers if you want colorspace recognition to occur +properly. We recommend copying and extending the default processors if you +want to do that. (A better idea is to save these marker types for later +examination by calling jpeg_save_markers(); that method doesn't interfere +with the library's own processing of these markers.) + +jpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive +--- if you call one it overrides any previous call to the other, for the +particular marker type specified. + +A simple example of an external COM processor can be found in djpeg.c. +Also, see jpegtran.c for an example of using jpeg_save_markers. + + +Raw (downsampled) image data +---------------------------- + +Some applications need to supply already-downsampled image data to the JPEG +compressor, or to receive raw downsampled data from the decompressor. The +library supports this requirement by allowing the application to write or +read raw data, bypassing the normal preprocessing or postprocessing steps. +The interface is different from the standard one and is somewhat harder to +use. If your interest is merely in bypassing color conversion, we recommend +that you use the standard interface and simply set jpeg_color_space = +in_color_space (or jpeg_color_space = out_color_space for decompression). +The mechanism described in this section is necessary only to supply or +receive downsampled image data, in which not all components have the same +dimensions. + + +To compress raw data, you must supply the data in the colorspace to be used +in the JPEG file (please read the earlier section on Special color spaces) +and downsampled to the sampling factors specified in the JPEG parameters. +You must supply the data in the format used internally by the JPEG library, +namely a JSAMPIMAGE array. This is an array of pointers to two-dimensional +arrays, each of type JSAMPARRAY. Each 2-D array holds the values for one +color component. This structure is necessary since the components are of +different sizes. If the image dimensions are not a multiple of the MCU size, +you must also pad the data correctly (usually, this is done by replicating +the last column and/or row). The data must be padded to a multiple of a DCT +block in each component: that is, each downsampled row must contain a +multiple of 8 valid samples, and there must be a multiple of 8 sample rows +for each component. (For applications such as conversion of digital TV +images, the standard image size is usually a multiple of the DCT block size, +so that no padding need actually be done.) + +The procedure for compression of raw data is basically the same as normal +compression, except that you call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do +the following: + * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) + This notifies the library that you will be supplying raw data. + Furthermore, set cinfo->do_fancy_downsampling to FALSE if you want to use + real downsampled data. (It is set TRUE by jpeg_set_defaults().) + * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() + call is a good idea. Note that since color conversion is bypassed, + in_color_space is ignored, except that jpeg_set_defaults() uses it to + choose the default jpeg_color_space setting. + * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and + cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the + dimensions of the data you are supplying, it's wise to set them + explicitly, rather than assuming the library's defaults are what you want. + +To pass raw data to the library, call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). The two routines work similarly except that +jpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. +The scanlines count passed to and returned from jpeg_write_raw_data is +measured in terms of the component with the largest v_samp_factor. + +jpeg_write_raw_data() processes one MCU row per call, which is to say +v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines +value must be at least max_v_samp_factor*DCTSIZE, and the return value will +be exactly that amount (or possibly some multiple of that amount, in future +library versions). This is true even on the last call at the bottom of the +image; don't forget to pad your data as necessary. + +The required dimensions of the supplied data can be computed for each +component as + cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row + cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image +after jpeg_start_compress() has initialized those fields. If the valid data +is smaller than this, it must be padded appropriately. For some sampling +factors and image sizes, additional dummy DCT blocks are inserted to make +the image a multiple of the MCU dimensions. The library creates such dummy +blocks itself; it does not read them from your supplied data. Therefore you +need never pad by more than DCTSIZE samples. An example may help here. +Assume 2h2v downsampling of YCbCr data, that is + cinfo->comp_info[0].h_samp_factor = 2 for Y + cinfo->comp_info[0].v_samp_factor = 2 + cinfo->comp_info[1].h_samp_factor = 1 for Cb + cinfo->comp_info[1].v_samp_factor = 1 + cinfo->comp_info[2].h_samp_factor = 1 for Cr + cinfo->comp_info[2].v_samp_factor = 1 +and suppose that the nominal image dimensions (cinfo->image_width and +cinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will +compute downsampled_width = 101 and width_in_blocks = 13 for Y, +downsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same +for the height fields). You must pad the Y data to at least 13*8 = 104 +columns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The +MCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 +scanlines on each call to jpeg_write_raw_data(), which is to say 16 actual +sample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, +so you must pass a total of 7*16 = 112 "scanlines". The last DCT block row +of Y data is dummy, so it doesn't matter what you pass for it in the data +arrays, but the scanlines count must total up to 112 so that all of the Cb +and Cr data gets passed. + +Output suspension is supported with raw-data compression: if the data +destination module suspends, jpeg_write_raw_data() will return 0. +In this case the same data rows must be passed again on the next call. + + +Decompression with raw data output implies bypassing all postprocessing. +You must deal with the color space and sampling factors present in the +incoming file. If your application only handles, say, 2h1v YCbCr data, +you must check for and fail on other color spaces or other sampling factors. +The library will not convert to a different color space for you. + +To obtain raw data output, set cinfo->raw_data_out = TRUE before +jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to +verify that the color space and sampling factors are ones you can handle. +Furthermore, set cinfo->do_fancy_upsampling = FALSE if you want to get real +downsampled data (it is set TRUE by jpeg_read_header()). +Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The +decompression process is otherwise the same as usual. + +jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a +buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is +the same as for raw-data compression). The buffer you pass must be large +enough to hold the actual data plus padding to DCT-block boundaries. As with +compression, any entirely dummy DCT blocks are not processed so you need not +allocate space for them, but the total scanline count includes them. The +above example of computing buffer dimensions for raw-data compression is +equally valid for decompression. + +Input suspension is supported with raw-data decompression: if the data source +module suspends, jpeg_read_raw_data() will return 0. You can also use +buffered-image mode to read raw data in multiple passes. + + +Really raw data: DCT coefficients +--------------------------------- + +It is possible to read or write the contents of a JPEG file as raw DCT +coefficients. This facility is mainly intended for use in lossless +transcoding between different JPEG file formats. Other possible applications +include lossless cropping of a JPEG image, lossless reassembly of a +multi-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. + +To read the contents of a JPEG file as DCT coefficients, open the file and do +jpeg_read_header() as usual. But instead of calling jpeg_start_decompress() +and jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the +entire image into a set of virtual coefficient-block arrays, one array per +component. The return value is a pointer to an array of virtual-array +descriptors. Each virtual array can be accessed directly using the JPEG +memory manager's access_virt_barray method (see Memory management, below, +and also read structure.txt's discussion of virtual array handling). Or, +for simple transcoding to a different JPEG file format, the array list can +just be handed directly to jpeg_write_coefficients(). + +Each block in the block arrays contains quantized coefficient values in +normal array order (not JPEG zigzag order). The block arrays contain only +DCT blocks containing real data; any entirely-dummy blocks added to fill out +interleaved MCUs at the right or bottom edges of the image are discarded +during reading and are not stored in the block arrays. (The size of each +block array can be determined from the width_in_blocks and height_in_blocks +fields of the component's comp_info entry.) This is also the data format +expected by jpeg_write_coefficients(). + +When you are done using the virtual arrays, call jpeg_finish_decompress() +to release the array storage and return the decompression object to an idle +state; or just call jpeg_destroy() if you don't need to reuse the object. + +If you use a suspending data source, jpeg_read_coefficients() will return +NULL if it is forced to suspend; a non-NULL return value indicates successful +completion. You need not test for a NULL return value when using a +non-suspending data source. + +It is also possible to call jpeg_read_coefficients() to obtain access to the +decoder's coefficient arrays during a normal decode cycle in buffered-image +mode. This frammish might be useful for progressively displaying an incoming +image and then re-encoding it without loss. To do this, decode in buffered- +image mode as discussed previously, then call jpeg_read_coefficients() after +the last jpeg_finish_output() call. The arrays will be available for your use +until you call jpeg_finish_decompress(). + + +To write the contents of a JPEG file as DCT coefficients, you must provide +the DCT coefficients stored in virtual block arrays. You can either pass +block arrays read from an input JPEG file by jpeg_read_coefficients(), or +allocate virtual arrays from the JPEG compression object and fill them +yourself. In either case, jpeg_write_coefficients() is substituted for +jpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is + * Create compression object + * Set all compression parameters as necessary + * Request virtual arrays if needed + * jpeg_write_coefficients() + * jpeg_finish_compress() + * Destroy or re-use compression object +jpeg_write_coefficients() is passed a pointer to an array of virtual block +array descriptors; the number of arrays is equal to cinfo.num_components. + +The virtual arrays need only have been requested, not realized, before +jpeg_write_coefficients() is called. A side-effect of +jpeg_write_coefficients() is to realize any virtual arrays that have been +requested from the compression object's memory manager. Thus, when obtaining +the virtual arrays from the compression object, you should fill the arrays +after calling jpeg_write_coefficients(). The data is actually written out +when you call jpeg_finish_compress(); jpeg_write_coefficients() only writes +the file header. + +When writing raw DCT coefficients, it is crucial that the JPEG quantization +tables and sampling factors match the way the data was encoded, or the +resulting file will be invalid. For transcoding from an existing JPEG file, +we recommend using jpeg_copy_critical_parameters(). This routine initializes +all the compression parameters to default values (like jpeg_set_defaults()), +then copies the critical information from a source decompression object. +The decompression object should have just been used to read the entire +JPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). + +jpeg_write_coefficients() marks all tables stored in the compression object +as needing to be written to the output file (thus, it acts like +jpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid +emitting abbreviated JPEG files by accident. If you really want to emit an +abbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' +individual sent_table flags, between calling jpeg_write_coefficients() and +jpeg_finish_compress(). + + +Progress monitoring +------------------- + +Some applications may need to regain control from the JPEG library every so +often. The typical use of this feature is to produce a percent-done bar or +other progress display. (For a simple example, see cjpeg.c or djpeg.c.) +Although you do get control back frequently during the data-transferring pass +(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes +will occur inside jpeg_finish_compress or jpeg_start_decompress; those +routines may take a long time to execute, and you don't get control back +until they are done. + +You can define a progress-monitor routine which will be called periodically +by the library. No guarantees are made about how often this call will occur, +so we don't recommend you use it for mouse tracking or anything like that. +At present, a call will occur once per MCU row, scanline, or sample row +group, whichever unit is convenient for the current processing mode; so the +wider the image, the longer the time between calls. During the data +transferring pass, only one call occurs per call of jpeg_read_scanlines or +jpeg_write_scanlines, so don't pass a large number of scanlines at once if +you want fine resolution in the progress count. (If you really need to use +the callback mechanism for time-critical tasks like mouse tracking, you could +insert additional calls inside some of the library's inner loops.) + +To establish a progress-monitor callback, create a struct jpeg_progress_mgr, +fill in its progress_monitor field with a pointer to your callback routine, +and set cinfo->progress to point to the struct. The callback will be called +whenever cinfo->progress is non-NULL. (This pointer is set to NULL by +jpeg_create_compress or jpeg_create_decompress; the library will not change +it thereafter. So if you allocate dynamic storage for the progress struct, +make sure it will live as long as the JPEG object does. Allocating from the +JPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You +can use the same callback routine for both compression and decompression. + +The jpeg_progress_mgr struct contains four fields which are set by the library: + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +During any one pass, pass_counter increases from 0 up to (not including) +pass_limit; the step size is usually but not necessarily 1. The pass_limit +value may change from one pass to another. The expected total number of +passes is in total_passes, and the number of passes already completed is in +completed_passes. Thus the fraction of work completed may be estimated as + completed_passes + (pass_counter/pass_limit) + -------------------------------------------- + total_passes +ignoring the fact that the passes may not be equal amounts of work. + +When decompressing, pass_limit can even change within a pass, because it +depends on the number of scans in the JPEG file, which isn't always known in +advance. The computed fraction-of-work-done may jump suddenly (if the library +discovers it has overestimated the number of scans) or even decrease (in the +opposite case). It is not wise to put great faith in the work estimate. + +When using the decompressor's buffered-image mode, the progress monitor work +estimate is likely to be completely unhelpful, because the library has no way +to know how many output passes will be demanded of it. Currently, the library +sets total_passes based on the assumption that there will be one more output +pass if the input file end hasn't yet been read (jpeg_input_complete() isn't +TRUE), but no more output passes if the file end has been reached when the +output pass is started. This means that total_passes will rise as additional +output passes are requested. If you have a way of determining the input file +size, estimating progress based on the fraction of the file that's been read +will probably be more useful than using the library's value. + + +Memory management +----------------- + +This section covers some key facts about the JPEG library's built-in memory +manager. For more info, please read structure.txt's section about the memory +manager, and consult the source code if necessary. + +All memory and temporary file allocation within the library is done via the +memory manager. If necessary, you can replace the "back end" of the memory +manager to control allocation yourself (for example, if you don't want the +library to use malloc() and free() for some reason). + +Some data is allocated "permanently" and will not be freed until the JPEG +object is destroyed. Most data is allocated "per image" and is freed by +jpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the +memory manager yourself to allocate structures that will automatically be +freed at these times. Typical code for this is + ptr = (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, size); +Use JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. +Use alloc_large instead of alloc_small for anything bigger than a few Kbytes. +There are also alloc_sarray and alloc_barray routines that automatically +build 2-D sample or block arrays. + +The library's minimum space requirements to process an image depend on the +image's width, but not on its height, because the library ordinarily works +with "strip" buffers that are as wide as the image but just a few rows high. +Some operating modes (eg, two-pass color quantization) require full-image +buffers. Such buffers are treated as "virtual arrays": only the current strip +need be in memory, and the rest can be swapped out to a temporary file. + +If you use the simplest memory manager back end (jmemnobs.c), then no +temporary files are used; virtual arrays are simply malloc()'d. Images bigger +than memory can be processed only if your system supports virtual memory. +The other memory manager back ends support temporary files of various flavors +and thus work in machines without virtual memory. They may also be useful on +Unix machines if you need to process images that exceed available swap space. + +When using temporary files, the library will make the in-memory buffers for +its virtual arrays just big enough to stay within a "maximum memory" setting. +Your application can set this limit by setting cinfo->mem->max_memory_to_use +after creating the JPEG object. (Of course, there is still a minimum size for +the buffers, so the max-memory setting is effective only if it is bigger than +the minimum space needed.) If you allocate any large structures yourself, you +must allocate them before jpeg_start_compress() or jpeg_start_decompress() in +order to have them counted against the max memory limit. Also keep in mind +that space allocated with alloc_small() is ignored, on the assumption that +it's too small to be worth worrying about; so a reasonable safety margin +should be left when setting max_memory_to_use. + +If you use the jmemname.c or jmemdos.c memory manager back end, it is +important to clean up the JPEG object properly to ensure that the temporary +files get deleted. (This is especially crucial with jmemdos.c, where the +"temporary files" may be extended-memory segments; if they are not freed, +DOS will require a reboot to recover the memory.) Thus, with these memory +managers, it's a good idea to provide a signal handler that will trap any +early exit from your program. The handler should call either jpeg_abort() +or jpeg_destroy() for any active JPEG objects. A handler is not needed with +jmemnobs.c, and shouldn't be necessary with jmemansi.c or jmemmac.c either, +since the C library is supposed to take care of deleting files made with +tmpfile(). + + +Memory usage +------------ + +Working memory requirements while performing compression or decompression +depend on image dimensions, image characteristics (such as colorspace and +JPEG process), and operating mode (application-selected options). + +As of v6b, the decompressor requires: + 1. About 24K in more-or-less-fixed-size data. This varies a bit depending + on operating mode and image characteristics (particularly color vs. + grayscale), but it doesn't depend on image dimensions. + 2. Strip buffers (of size proportional to the image width) for IDCT and + upsampling results. The worst case for commonly used sampling factors + is about 34 bytes * width in pixels for a color image. A grayscale image + only needs about 8 bytes per pixel column. + 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG + file (including progressive JPEGs), or whenever you select buffered-image + mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's + 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires + 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. + 4. To perform 2-pass color quantization, the decompressor also needs a + 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). +This does not count any memory allocated by the application, such as a +buffer to hold the final output image. + +The above figures are valid for 8-bit JPEG data precision and a machine with +32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and +quantization pixel buffer. The "fixed-size" data will be somewhat smaller +with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual +color spaces will require different amounts of space. + +The full-image coefficient and pixel buffers, if needed at all, do not +have to be fully RAM resident; you can have the library use temporary +files instead when the total memory usage would exceed a limit you set. +(But if your OS supports virtual memory, it's probably better to just use +jmemnobs and let the OS do the swapping.) + +The compressor's memory requirements are similar, except that it has no need +for color quantization. Also, it needs a full-image DCT coefficient buffer +if Huffman-table optimization is asked for, even if progressive mode is not +requested. + +If you need more detailed information about memory usage in a particular +situation, you can enable the MEM_STATS code in jmemmgr.c. + + +Library compile-time options +---------------------------- + +A number of compile-time options are available by modifying jmorecfg.h. + +The JPEG standard provides for both the baseline 8-bit DCT process and +a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define +BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be +larger than a char, so it affects the surrounding application's image data. +The sample applications cjpeg and djpeg can support 12-bit mode only for PPM +and GIF file formats; you must disable the other file formats to compile a +12-bit cjpeg or djpeg. (install.txt has more information about that.) +At present, a 12-bit library can handle *only* 12-bit images, not both +precisions. (If you need to include both 8- and 12-bit libraries in a single +application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES +for just one of the copies. You'd have to access the 8-bit and 12-bit copies +from separate application source files. This is untested ... if you try it, +we'd like to hear whether it works!) + +Note that a 12-bit library always compresses in Huffman optimization mode, +in order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. If you need to output 12-bit +files in one pass, you'll have to supply suitable default Huffman tables. +You may also want to supply your own DCT quantization tables; the existing +quality-scaling code has been developed for 8-bit use, and probably doesn't +generate especially good tables for 12-bit. + +The maximum number of components (color channels) in the image is determined +by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we +expect that few applications will need more than four or so. + +On machines with unusual data type sizes, you may be able to improve +performance or reduce memory space by tweaking the various typedefs in +jmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s +is quite slow; consider trading memory for speed by making JCOEF, INT16, and +UINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. +You probably don't want to make JSAMPLE be int unless you have lots of memory +to burn. + +You can reduce the size of the library by compiling out various optional +functions. To do this, undefine xxx_SUPPORTED symbols as necessary. + +You can also save a few K by not having text error messages in the library; +the standard error message table occupies about 5Kb. This is particularly +reasonable for embedded applications where there's no good way to display +a message anyway. To do this, remove the creation of the message table +(jpeg_std_message_table[]) from jerror.c, and alter format_message to do +something reasonable without it. You could output the numeric value of the +message code number, for example. If you do this, you can also save a couple +more K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; +you don't need trace capability anyway, right? + + +Portability considerations +-------------------------- + +The JPEG library has been written to be extremely portable; the sample +applications cjpeg and djpeg are slightly less so. This section summarizes +the design goals in this area. (If you encounter any bugs that cause the +library to be less portable than is claimed here, we'd appreciate hearing +about them.) + +The code works fine on ANSI C, C++, and pre-ANSI C compilers, using any of +the popular system include file setups, and some not-so-popular ones too. +See install.txt for configuration procedures. + +The code is not dependent on the exact sizes of the C data types. As +distributed, we make the assumptions that + char is at least 8 bits wide + short is at least 16 bits wide + int is at least 16 bits wide + long is at least 32 bits wide +(These are the minimum requirements of the ANSI C standard.) Wider types will +work fine, although memory may be used inefficiently if char is much larger +than 8 bits or short is much bigger than 16 bits. The code should work +equally well with 16- or 32-bit ints. + +In a system where these assumptions are not met, you may be able to make the +code work by modifying the typedefs in jmorecfg.h. However, you will probably +have difficulty if int is less than 16 bits wide, since references to plain +int abound in the code. + +char can be either signed or unsigned, although the code runs faster if an +unsigned char type is available. If char is wider than 8 bits, you will need +to redefine JOCTET and/or provide custom data source/destination managers so +that JOCTET represents exactly 8 bits of data on external storage. + +The JPEG library proper does not assume ASCII representation of characters. +But some of the image file I/O modules in cjpeg/djpeg do have ASCII +dependencies in file-header manipulation; so does cjpeg's select_file_type() +routine. + +The JPEG library does not rely heavily on the C library. In particular, C +stdio is used only by the data source/destination modules and the error +handler, all of which are application-replaceable. (cjpeg/djpeg are more +heavily dependent on stdio.) malloc and free are called only from the memory +manager "back end" module, so you can use a different memory allocator by +replacing that one file. + +The code generally assumes that C names must be unique in the first 15 +characters. However, global function names can be made unique in the +first 6 characters by defining NEED_SHORT_EXTERNAL_NAMES. + +More info about porting the code may be gleaned by reading jconfig.txt, +jmorecfg.h, and jinclude.h. + + +Notes for MS-DOS implementors +----------------------------- + +The IJG code is designed to work efficiently in 80x86 "small" or "medium" +memory models (i.e., data pointers are 16 bits unless explicitly declared +"far"; code pointers can be either size). You may be able to use small +model to compile cjpeg or djpeg by itself, but you will probably have to use +medium model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model (perhaps 10%-25%), and you should avoid "huge" model +if at all possible. + +The JPEG library typically needs 2Kb-3Kb of stack space. It will also +malloc about 20K-30K of near heap space while executing (and lots of far +heap, but that doesn't count in this calculation). This figure will vary +depending on selected operating mode, and to a lesser extent on image size. +There is also about 5Kb-6Kb of constant data which will be allocated in the +near data segment (about 4Kb of this is the error message table). +Thus you have perhaps 20K available for other modules' static data and near +heap space before you need to go to a larger memory model. The C library's +static data will account for several K of this, but that still leaves a good +deal for your needs. (If you are tight on space, you could reduce the sizes +of the I/O buffers allocated by jdatasrc.c and jdatadst.c, say from 4K to +1K. Another possibility is to move the error message table to far memory; +this should be doable with only localized hacking on jerror.c.) + +About 2K of the near heap space is "permanent" memory that will not be +released until you destroy the JPEG object. This is only an issue if you +save a JPEG object between compression or decompression operations. + +Far data space may also be a tight resource when you are dealing with large +images. The most memory-intensive case is decompression with two-pass color +quantization, or single-pass quantization to an externally supplied color +map. This requires a 128Kb color lookup table plus strip buffers amounting +to about 40 bytes per column for typical sampling ratios (eg, about 25600 +bytes for a 640-pixel-wide image). You may not be able to process wide +images if you have large data structures of your own. + +Of course, all of these concerns vanish if you use a 32-bit flat-memory-model +compiler, such as DJGPP or Watcom C. We highly recommend flat model if you +can use it; the JPEG library is significantly faster in flat model. diff -Nru mame-0.144/src/lib/libjpeg/README mame-0.145/src/lib/libjpeg/README --- mame-0.144/src/lib/libjpeg/README 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/lib/libjpeg/README 2012-02-06 21:30:29.000000000 +0000 @@ -0,0 +1,326 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 8c of 16-Jan-2011 +==================================== + +This distribution contains the eighth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, +Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, +Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, +and other members of the Independent JPEG Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +ACKNOWLEDGMENTS Special thanks. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.txt How to configure and install the IJG software. + usage.txt Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.txt). + wizard.txt Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.txt How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.txt Overview of the JPEG library's internal structure. + filelist.txt Road map of IJG files. + coderules.txt Coding style rules --- please read if you contribute code. + +Please read at least the files install.txt and usage.txt. Some information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image encoding, decoding, +and transcoding. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +We have made no provision for supporting the hierarchical or lossless +processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. + +We have also included "jpegtran", a utility for lossless transcoding between +different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple +applications for inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article is +available at http://www.ijg.org/files/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best currently available description of JPEG is the textbook "JPEG Still +Image Data Compression Standard" by William B. Pennebaker and Joan L. +Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG +standards (DIS 10918-1 and draft DIS 10918-2). +Although this is by far the most detailed and comprehensive exposition of +JPEG publicly available, we point out that it is still missing an explanation +of the most essential properties and algorithms of the underlying DCT +technology. +If you think that you know about DCT-based JPEG after reading this book, +then you are in delusion. The real fundamentals and corresponding potential +of DCT-based JPEG are not publicly known so far, and that is the reason for +all the mistaken developments taking place in the image coding domain. + +The original JPEG standard is divided into two parts, Part 1 being the actual +specification, while Part 2 covers compliance testing methods. Part 1 is +titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. +IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension +which is specified in a contributed document at ITU and ISO with title "ITU-T +JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image Coding", April +2006, Geneva, Switzerland. The latest version of the document is Revision 3. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report +and thus received a formal publication status. It is available as a free +download in PDF format from +http://www.ecma-international.org/publications/techreports/E-TR-098.htm. +A PostScript version of the JFIF document is available at +http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at +http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from +http://www.ijg.org/files/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is www.ijg.org. +The most recent released version can always be found there in +directory "files". This particular version will be archived as +http://www.ijg.org/files/jpegsrc.v8c.tar.gz, and in Windows-compatible +"zip" archive format as http://www.ijg.org/files/jpegsr8c.zip. + +The JPEG FAQ (Frequently Asked Questions) article is a source of some +general information about JPEG. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +ACKNOWLEDGMENTS +=============== + +Thank to Juergen Bruder for providing me with a copy of the common DCT +algorithm article, only to find out that I had come to the same result +in a more direct and comprehensible way with a more generative approach. + +Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the +ITU JPEG (Study Group 16) meeting in Geneva, Switzerland. + +Thank to Thomas Wiegand and Gary Sullivan for inviting me to the +Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland. + +Thank to John Korejwa and Massimo Ballerini for inviting me to +fruitful consultations in Boston, MA and Milan, Italy. + +Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther +Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel +for corresponding business development. + +Thank to Nico Zschach and Dirk Stelling of the technical support team +at the Digital Images company in Halle for providing me with extra +equipment for configuration tests. + +Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful +communication about JPEG configuration in Sigma Photo Pro software. + +Thank to Andrew Finkenstadt for hosting the ijg.org site. + +Last but not least special thank to Thomas G. Lane for the original +design and development of this singular software package. + + +FILE FORMAT WARS +================ + +The ISO JPEG standards committee actually promotes different formats like +"JPEG 2000" or "JPEG XR" which are incompatible with original DCT-based +JPEG and which are based on faulty technologies. IJG therefore does not +and will not support such momentary mistakes (see REFERENCES). +We have little or no sympathy for the promotion of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, interoperable format standards for JPEG files. +Don't use an incompatible file format! +(In any case, our decoder will remain capable of reading existing JPEG +image files indefinitely.) + + +TO DO +===== + +Version 8 is the first release of a new generation JPEG standard +to overcome the limitations of the original JPEG specification. +More features are being prepared for coming releases... + +Please send bug reports, offers of help, etc. to jpeg-info@uc.ag. diff -Nru mame-0.144/src/lib/lib.mak mame-0.145/src/lib/lib.mak --- mame-0.144/src/lib/lib.mak 2012-01-13 15:34:30.000000000 +0000 +++ mame-0.145/src/lib/lib.mak 2012-02-06 21:30:29.000000000 +0000 @@ -19,7 +19,9 @@ $(LIBOBJ)/formats \ $(LIBOBJ)/zlib \ $(LIBOBJ)/softfloat \ - $(LIBOBJ)/cothread \ + $(LIBOBJ)/libjpeg \ + $(LIBOBJ)/libflac \ + $(LIBOBJ)/libflacpp \ @@ -48,7 +50,6 @@ $(LIBOBJ)/util/png.o \ $(LIBOBJ)/util/pool.o \ $(LIBOBJ)/util/sha1.o \ - $(LIBOBJ)/util/tagmap.o \ $(LIBOBJ)/util/unicode.o \ $(LIBOBJ)/util/unzip.o \ $(LIBOBJ)/util/vbiparse.o \ @@ -108,6 +109,7 @@ $(LIBOBJ)/formats/d64_dsk.o \ $(LIBOBJ)/formats/d81_dsk.o \ $(LIBOBJ)/formats/d88_dsk.o \ + $(LIBOBJ)/formats/dfi_dsk.o \ $(LIBOBJ)/formats/dim_dsk.o \ $(LIBOBJ)/formats/dsk_dsk.o \ $(LIBOBJ)/formats/fdi_dsk.o \ @@ -119,6 +121,7 @@ $(LIBOBJ)/formats/hect_tap.o \ $(LIBOBJ)/formats/imd_dsk.o \ $(LIBOBJ)/formats/ipf_dsk.o \ + $(LIBOBJ)/formats/kc_cas.o \ $(LIBOBJ)/formats/kim1_cas.o \ $(LIBOBJ)/formats/lviv_lvt.o \ $(LIBOBJ)/formats/msx_dsk.o \ @@ -129,6 +132,7 @@ $(LIBOBJ)/formats/oric_dsk.o \ $(LIBOBJ)/formats/oric_tap.o \ $(LIBOBJ)/formats/p6001_cas.o \ + $(LIBOBJ)/formats/pasti_dsk.o \ $(LIBOBJ)/formats/pc_dsk.o \ $(LIBOBJ)/formats/pmd_pmd.o \ $(LIBOBJ)/formats/primoptp.o \ @@ -207,14 +211,101 @@ #------------------------------------------------- -# cothread library objects +# libJPEG library objects #------------------------------------------------- -COTHREADOBJS = \ - $(LIBOBJ)/cothread/libco.o +LIBJPEGOBJS= \ + $(LIBOBJ)/libjpeg/jaricom.o \ + $(LIBOBJ)/libjpeg/jcapimin.o \ + $(LIBOBJ)/libjpeg/jcapistd.o \ + $(LIBOBJ)/libjpeg/jcarith.o \ + $(LIBOBJ)/libjpeg/jccoefct.o \ + $(LIBOBJ)/libjpeg/jccolor.o \ + $(LIBOBJ)/libjpeg/jcdctmgr.o \ + $(LIBOBJ)/libjpeg/jchuff.o \ + $(LIBOBJ)/libjpeg/jcinit.o \ + $(LIBOBJ)/libjpeg/jcmainct.o \ + $(LIBOBJ)/libjpeg/jcmarker.o \ + $(LIBOBJ)/libjpeg/jcmaster.o \ + $(LIBOBJ)/libjpeg/jcomapi.o \ + $(LIBOBJ)/libjpeg/jcparam.o \ + $(LIBOBJ)/libjpeg/jcprepct.o \ + $(LIBOBJ)/libjpeg/jcsample.o \ + $(LIBOBJ)/libjpeg/jctrans.o \ + $(LIBOBJ)/libjpeg/jdapimin.o \ + $(LIBOBJ)/libjpeg/jdapistd.o \ + $(LIBOBJ)/libjpeg/jdarith.o \ + $(LIBOBJ)/libjpeg/jdatadst.o \ + $(LIBOBJ)/libjpeg/jdatasrc.o \ + $(LIBOBJ)/libjpeg/jdcoefct.o \ + $(LIBOBJ)/libjpeg/jdcolor.o \ + $(LIBOBJ)/libjpeg/jddctmgr.o \ + $(LIBOBJ)/libjpeg/jdhuff.o \ + $(LIBOBJ)/libjpeg/jdinput.o \ + $(LIBOBJ)/libjpeg/jdmainct.o \ + $(LIBOBJ)/libjpeg/jdmarker.o \ + $(LIBOBJ)/libjpeg/jdmaster.o \ + $(LIBOBJ)/libjpeg/jdmerge.o \ + $(LIBOBJ)/libjpeg/jdpostct.o \ + $(LIBOBJ)/libjpeg/jdsample.o \ + $(LIBOBJ)/libjpeg/jdtrans.o \ + $(LIBOBJ)/libjpeg/jerror.o \ + $(LIBOBJ)/libjpeg/jfdctflt.o \ + $(LIBOBJ)/libjpeg/jfdctfst.o \ + $(LIBOBJ)/libjpeg/jfdctint.o \ + $(LIBOBJ)/libjpeg/jidctflt.o \ + $(LIBOBJ)/libjpeg/jidctfst.o \ + $(LIBOBJ)/libjpeg/jidctint.o \ + $(LIBOBJ)/libjpeg/jquant1.o \ + $(LIBOBJ)/libjpeg/jquant2.o \ + $(LIBOBJ)/libjpeg/jutils.o \ + $(LIBOBJ)/libjpeg/jmemmgr.o \ + $(LIBOBJ)/libjpeg/jmemansi.o \ -$(OBJ)/libco.a: $(COTHREADOBJS) +$(OBJ)/libjpeg.a: $(LIBJPEGOBJS) -$(LIBOBJ)/cothread/%.o: $(LIBSRC)/cothread/%.c | $(OSPREBUILD) +$(LIBOBJ)/libjpeg/%.o: $(LIBSRC)/libjpeg/%.c | $(OSPREBUILD) @echo Compiling $<... - $(CC) $(CDEFS) $(CCOMFLAGS) -c -fomit-frame-pointer $< -o $@ + $(CC) $(CDEFS) $(CCOMFLAGS) $(CONLYFLAGS) -I$(LIBSRC)/libjpeg -c $< -o $@ + + +#------------------------------------------------- +# libflac library objects +#------------------------------------------------- + +FLACOPTS=-DFLAC__NO_ASM -DHAVE_INTTYPES_H -DHAVE_ICONV -DHAVE_LANGINFO_CODESET -DHAVE_SOCKLEN_T -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 + +LIBFLACOBJS = \ + $(LIBOBJ)/libflac/bitmath.o \ + $(LIBOBJ)/libflac/bitreader.o \ + $(LIBOBJ)/libflac/bitwriter.o \ + $(LIBOBJ)/libflac/cpu.o \ + $(LIBOBJ)/libflac/crc.o \ + $(LIBOBJ)/libflac/fixed.o \ + $(LIBOBJ)/libflac/float.o \ + $(LIBOBJ)/libflac/format.o \ + $(LIBOBJ)/libflac/lpc.o \ + $(LIBOBJ)/libflac/md5.o \ + $(LIBOBJ)/libflac/memory.o \ + $(LIBOBJ)/libflac/stream_decoder.o \ + $(LIBOBJ)/libflac/stream_encoder.o \ + $(LIBOBJ)/libflac/stream_encoder_framing.o \ + $(LIBOBJ)/libflac/window.o + +$(OBJ)/libflac.a: $(LIBFLACOBJS) + +$(LIBOBJ)/libflac/%.o: $(LIBSRC)/libflac/libflac/%.c | $(OSPREBUILD) + @echo Compiling $<... + $(CC) $(CDEFS) $(FLACOPTS) $(CONLYFLAGS) -I$(LIBSRC)/libflac/include -c $< -o $@ + + +# LIBFLACPPOBJS = \ +# $(LIBOBJ)/libflacpp/metadata.o \ +# $(LIBOBJ)/libflacpp/stream_decoder.o \ +# $(LIBOBJ)/libflacpp/stream_encoder.o + +# $(OBJ)/libflac++.a: $(LIBFLACPPOBJS) + +# $(LIBOBJ)/libflacpp/%.o: $(LIBSRC)/libflac/libflac++/%.cpp | $(OSPREBUILD) +# @echo Compiling $<... +# $(CC) $(CDEFS) $(FLACOPTS) $(CPPONLYFLAGS) -I$(LIBSRC)/libflac/include -c $< -o $@ diff -Nru mame-0.144/src/lib/util/astring.c mame-0.145/src/lib/util/astring.c --- mame-0.144/src/lib/util/astring.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/astring.c 2012-02-06 21:30:29.000000000 +0000 @@ -44,202 +44,107 @@ #include #include #include - +#include /*************************************************************************** GLOBAL VARIABLES ***************************************************************************/ -static const char dummy_text[2] = { 0 }; - -#ifdef __cplusplus static const astring dummy_astring; -#else -static const astring dummy_astring = { (char *)dummy_text, 1, { 0 } }; -#endif -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** -/*------------------------------------------------- - ensure_room - ensure we have room for a - given string, or else reallocate our buffer --------------------------------------------------*/ +//------------------------------------------------- +// ensure_room - ensure we have room for a +// given string, or else reallocate our buffer +//------------------------------------------------- -INLINE int ensure_room(astring *str, int length) +bool astring::ensure_room(int length) { - char *newbuf, *oldbuf; - int alloclen; + // always fail to expand the dummy + if (this == &dummy_astring) + return false; - /* always fail to expand the dummy */ - if (str == &dummy_astring) - return FALSE; + // if we have the room, do nothing + if (m_alloclen >= length + 1) + return true; - /* if we have the room, do nothing */ - if (str->alloclen >= length + 1) - return TRUE; + // allocate a new buffer with some slop + int alloclen = length + 256; + char *newbuf = new char[alloclen]; - /* allocate a new buffer with some slop */ - alloclen = length + 256; - newbuf = (char *)malloc(alloclen); - if (newbuf == NULL) - return FALSE; + // swap in the new buffer and free the old one + char *oldbuf = (m_text == m_smallbuf) ? NULL : m_text; + m_text = strcpy(newbuf, m_text); + m_alloclen = alloclen; + delete[] oldbuf; - /* swap in the new buffer and free the old one */ - oldbuf = (str->text == str->smallbuf) ? NULL : str->text; - str->text = strcpy(newbuf, str->text); - str->alloclen = alloclen; - if (oldbuf != NULL) - free(oldbuf); - - return TRUE; + return true; } -/*------------------------------------------------- - safe_string_base - return a "safe" string - base for a given start index --------------------------------------------------*/ +//------------------------------------------------- +// safe_string_base - return a "safe" string +// base for a given start index +//------------------------------------------------- -INLINE char *safe_string_base(char *base, int start) +inline char *astring::safe_string_base(int start) const { - int max = strlen(base); - return (start >= 0 && start < max) ? base + start : base + max; + int max = len(); + return (start >= 0 && start < max) ? m_text + start : m_text + max; } -/*------------------------------------------------- - normalize_substr - normalize substr parameters --------------------------------------------------*/ +//------------------------------------------------- +// normalize_substr - normalize substr parameters +//------------------------------------------------- -INLINE void normalize_substr(int *start, int *count, int length) +inline void astring::normalize_substr(int &start, int &count, int length) const { - /* limit start */ - if (*start < 0) - *start = 0; - else if (*start > length) - *start = length; + // limit start + if (start < 0) + start = 0; + else if (start > length) + start = length; - /* update count */ - if (*count == -1 || *start + *count > length) - *count = length - *start; + // update count + if (count == -1 || start + count > length) + count = length - start; } -/*************************************************************************** - ASTRING ALLOCATION -***************************************************************************/ - -#ifdef __cplusplus - -#include +//************************************************************************** +// ASTRING ALLOCATION +//************************************************************************** -/*------------------------------------------------- - init - constructor helper --------------------------------------------------*/ +//------------------------------------------------- +// init - constructor helper +//------------------------------------------------- astring &astring::init() { - text = smallbuf; - alloclen = ARRAY_LENGTH(smallbuf); - smallbuf[0] = 0; + // initialize ourselves to point to the internal buffer + m_text = m_smallbuf; + m_alloclen = ARRAY_LENGTH(m_smallbuf); + m_smallbuf[0] = 0; return *this; } -/*------------------------------------------------- - ~astring - basic destructor --------------------------------------------------*/ +//------------------------------------------------- +// ~astring - destructor +//------------------------------------------------- astring::~astring() { - if (text != smallbuf) - free(text); -} - - -/*------------------------------------------------- - astring_alloc - allocate a new astring --------------------------------------------------*/ - -astring *astring_alloc(void) -{ - // we do our own malloc and use placement new here to - // make our memory tracking happy - void *ptr = malloc(sizeof(astring)); - if (ptr == NULL) - return NULL; - return new(ptr) astring; -} - - -/*------------------------------------------------- - astring_free - free an astring --------------------------------------------------*/ - -void astring_free(astring *str) -{ - // since we malloc'ed the memory ourselves, we directly - // call the destructor and free the memory ourselves - str->~astring(); - free(str); -} - -#else - -/*------------------------------------------------- - astring_alloc - allocate a new astring --------------------------------------------------*/ - -astring *astring_alloc(void) -{ - astring *str; - - /* allocate memory; if we fail, return the dummy */ - str = (astring *)malloc(sizeof(*str)); - if (str == NULL) - return (astring *)&dummy_astring; - memset(str, 0, sizeof(*str)); - - /* initialize the small buffer */ - str->text = str->smallbuf; - str->alloclen = ARRAY_LENGTH(str->smallbuf); - return str; -} - - -/*------------------------------------------------- - astring_free - free an astring --------------------------------------------------*/ - -void astring_free(astring *str) -{ - /* ignore attempts to free the dummy */ - if (str == &dummy_astring) - return; - - /* if we allocated additional memory, free that */ - if (str->text != str->smallbuf) - free(str->text); - free(str); -} - -#endif - - -/*------------------------------------------------- - astring_expand - expand an astring to - guarantee the given amount of space --------------------------------------------------*/ - -void astring_expand(astring *str, int length) -{ - ensure_room(str, length); + if (m_text != m_smallbuf) + delete[] m_text; } @@ -248,238 +153,146 @@ INLINE ASTRING CHANGES ***************************************************************************/ -/*------------------------------------------------- - astring_cpy - copy one astring into another --------------------------------------------------*/ - -astring *astring_cpy(astring *dst, const astring *src) -{ - return astring_cpyc(dst, src->text); -} - - -/*------------------------------------------------- - astring_cpyc - copy a C string into an astring --------------------------------------------------*/ - -astring *astring_cpyc(astring *dst, const char *src) -{ - return astring_cpych(dst, src, strlen(src)); -} - - -/*------------------------------------------------- - astring_cpych - copy a character array into - an astring --------------------------------------------------*/ - -astring *astring_cpych(astring *dst, const char *src, int count) -{ - /* make room; if we fail or if dst is the dummy, do nothing */ - if (!ensure_room(dst, count)) - return dst; - - /* copy the raw data and NULL-terminate */ - if ((count > 0) && (dst->text != src)) - memcpy(dst->text, src, count); - dst->text[count] = 0; - return dst; -} - - -/*------------------------------------------------- - astring_cpysubstr - copy a substring of one - string to another --------------------------------------------------*/ - -astring *astring_cpysubstr(astring *dst, const astring *src, int start, int count) -{ - normalize_substr(&start, &count, strlen(src->text)); - return astring_cpych(dst, src->text + start, count); -} - - -/*------------------------------------------------- - astring_ins - insert one astring into another --------------------------------------------------*/ - -astring *astring_ins(astring *dst, int insbefore, const astring *src) -{ - return astring_insc(dst, insbefore, src->text); +//------------------------------------------------- +// cpy - copy a character array into an astring +//------------------------------------------------- + +astring &astring::cpy(const char *src, int count) +{ + // make room; if we fail or if we are the dummy, do nothing + if (!ensure_room(count)) + return *this; + + // copy the raw data and NULL-terminate + if (count > 0 && m_text != src) + memcpy(m_text, src, count); + m_text[count] = 0; + return *this; } -/*------------------------------------------------- - astring_insc - insert a C string into an - astring --------------------------------------------------*/ +//------------------------------------------------- +// cpysubstr - copy a substring of one string to +// another +//------------------------------------------------- -astring *astring_insc(astring *dst, int insbefore, const char *src) +astring &astring::cpysubstr(const astring &src, int start, int count) { - return astring_insch(dst, insbefore, src, strlen(src)); + normalize_substr(start, count, strlen(src.m_text)); + return cpy(src.m_text + start, count); } -/*------------------------------------------------- - astring_insch - insert a character array - into an astring --------------------------------------------------*/ +//------------------------------------------------- +// ins - insert a character array into an astring +//------------------------------------------------- -astring *astring_insch(astring *dst, int insbefore, const char *src, int count) +astring &astring::ins(int insbefore, const char *src, int count) { - int dstlength = strlen(dst->text); - - /* make room; if we fail or if dst is the dummy, do nothing */ - if (!ensure_room(dst, dstlength + count)) - return dst; + // make room; if we fail or if we are the dummy, do nothing + int dstlength = len(); + if (!ensure_room(dstlength + count)) + return *this; - /* adjust insbefore to be logical */ + // adjust insbefore to be logical if (insbefore < 0 || insbefore > dstlength) insbefore = dstlength; - /* copy the data an NULL-terminate */ + // copy the data an NULL-terminate if (insbefore < dstlength) - memmove(dst->text + insbefore + count, dst->text + insbefore, dstlength - insbefore); - memcpy(dst->text + insbefore, src, count); - dst->text[dstlength + count] = 0; - return dst; + memmove(m_text + insbefore + count, m_text + insbefore, dstlength - insbefore); + memcpy(m_text + insbefore, src, count); + m_text[dstlength + count] = 0; + return *this; } -/*------------------------------------------------- - astring_inssubstr - insert a substring of - one string to another --------------------------------------------------*/ +//------------------------------------------------- +// inssubstr - insert a substring of one string +// into another +//------------------------------------------------- -astring *astring_inssubstr(astring *dst, int insbefore, const astring *src, int start, int count) +astring &astring::inssubstr(int insbefore, const astring &src, int start, int count) { - normalize_substr(&start, &count, strlen(src->text)); - return astring_insch(dst, insbefore, src->text + start, count); + normalize_substr(start, count, strlen(src.m_text)); + return ins(insbefore, src.m_text + start, count); } -/*------------------------------------------------- - astring_substr - extract a substring of - ourself, removing everything else --------------------------------------------------*/ +//------------------------------------------------- +// substr - extract a substring of ourself, +// removing everything else +//------------------------------------------------- -astring *astring_substr(astring *str, int start, int count) +astring &astring::substr(int start, int count) { - /* ignore attempts to do this on the dummy */ - if (str == &dummy_astring) - return str; + // ignore attempts to do this on the dummy + if (this == &dummy_astring) + return *this; - /* normalize parameters */ - normalize_substr(&start, &count, strlen(str->text)); + // normalize parameters + normalize_substr(start, count, strlen(m_text)); - /* move the data and NULL-terminate */ + // move the data and NULL-terminate if (count > 0 && start > 0) - memmove(str->text, str->text + start, count); - str->text[count] = 0; - return str; + memmove(m_text, m_text + start, count); + m_text[count] = 0; + return *this; } -/*------------------------------------------------- - astring_del - delete a substring of - ourself, keeping everything else --------------------------------------------------*/ - -astring *astring_del(astring *str, int start, int count) -{ - int strlength = strlen(str->text); - - /* ignore attempts to do this on the dummy */ - if (str == &dummy_astring) - return str; +//------------------------------------------------- +// del - delete a substring of ourself, keeping +// everything else +//------------------------------------------------- + +astring &astring::del(int start, int count) +{ + // ignore attempts to do this on the dummy + if (this == &dummy_astring) + return *this; + + // normalize parameters + int strlength = strlen(m_text); + normalize_substr(start, count, strlength); - /* normalize parameters */ - normalize_substr(&start, &count, strlength); - - /* move the data and NULL-terminate */ + // move the data and NULL-terminate if (count > 0) - memmove(str->text + start, str->text + start + count, strlength - (start + count)); - str->text[strlength - count] = 0; - return str; -} - - -/*------------------------------------------------- - astring_printf - printf text into an astring --------------------------------------------------*/ - -int astring_printf(astring *dst, const char *format, ...) -{ - char tempbuf[4096]; - va_list args; - int result; - - /* sprintf into the temporary buffer */ - va_start(args, format); - result = vsprintf(tempbuf, format, args); - va_end(args); - - /* set the result */ - astring_cpyc(dst, tempbuf); - return result; -} - - -/*------------------------------------------------- - astring_vprintf - vprintf text into an astring --------------------------------------------------*/ - -int astring_vprintf(astring *dst, const char *format, va_list args) -{ - char tempbuf[4096]; - int result; - - /* sprintf into the temporary buffer */ - result = vsprintf(tempbuf, format, args); - - /* set the result */ - astring_cpyc(dst, tempbuf); - return result; + memmove(m_text + start, m_text + start + count, strlength - (start + count)); + m_text[strlength - count] = 0; + return *this; } -/*------------------------------------------------- - astring_catprintf - formatted printf to - the end of an astring --------------------------------------------------*/ +//------------------------------------------------- +// vprintf - vprintf text into an astring +//-------------------------------------------------*/ -int astring_catprintf(astring *dst, const char *format, ...) +int astring::vprintf(const char *format, va_list args) { + // sprintf into the temporary buffer char tempbuf[4096]; - va_list args; - int result; - - /* sprintf into the temporary buffer */ - va_start(args, format); - result = vsprintf(tempbuf, format, args); - va_end(args); + int result = vsprintf(tempbuf, format, args); - /* append the result */ - astring_catc(dst, tempbuf); + // set the result + cpy(tempbuf); return result; } -/*------------------------------------------------- - astring_catprintf - formatted vprintf to - the end of an astring --------------------------------------------------*/ +//------------------------------------------------- +// catprintf - formatted vprintf to the end of +// an astring +//------------------------------------------------- -int astring_catvprintf(astring *dst, const char *format, va_list args) +int astring::catvprintf(const char *format, va_list args) { + // sprintf into the temporary buffer char tempbuf[4096]; - int result; - - /* sprintf into the temporary buffer */ - result = vsprintf(tempbuf, format, args); + int result = vsprintf(tempbuf, format, args); - /* append the result */ - astring_catc(dst, tempbuf); + // append the result + cat(tempbuf); return result; } @@ -489,316 +302,203 @@ ASTRING QUERIES ***************************************************************************/ -/*------------------------------------------------- - astring_c - return a pointer to a C string - from an astring --------------------------------------------------*/ - -const char *astring_c(const astring *str) -{ - return str->text; -} - - -/*------------------------------------------------- - astring_len - return the length of an astring --------------------------------------------------*/ - -int astring_len(const astring *str) -{ - return strlen(str->text); -} - - -/*------------------------------------------------- - astring_cmp - compare one astring to another --------------------------------------------------*/ - -int astring_cmp(const astring *str1, const astring *str2) -{ - return astring_cmpc(str1, str2->text); -} - - -/*------------------------------------------------- - astring_cmpc - compare a C string to an astring --------------------------------------------------*/ +//------------------------------------------------- +// cmp - compare a character array to an astring +//------------------------------------------------- -int astring_cmpc(const astring *str1, const char *str2) +int astring::cmp(const char *str2, int count) const { - const char *s1 = str1->text; + // loop while equal until we hit the end of strings + int index; + for (index = 0; index < count; index++) + if (m_text[index] == 0 || m_text[index] != str2[index]) + break; - /* loop while equal until we hit the end of strings */ - while (*s1 != 0 && *str2 != 0 && *s1 == *str2) - s1++, str2++; - return *s1 - *str2; + // determine the final result + if (index < count) + return m_text[index] - str2[index]; + if (m_text[index] == 0) + return 0; + return 1; } -/*------------------------------------------------- - astring_cmpch - compare a character array to - an astring --------------------------------------------------*/ +//------------------------------------------------- +// cmpsubstr - compare a substring to an astring +//------------------------------------------------- -int astring_cmpch(const astring *str1, const char *str2, int count) +int astring::cmpsubstr(const astring &str2, int start, int count) const { - const char *s1 = str1->text; - int result; - - /* loop while equal until we hit the end of strings */ - while (count-- > 0 && *s1 != 0 && *str2 != 0 && *s1 == *str2) - s1++, str2++; - result = (count == -1) ? 0 : *s1 - *str2; - if (result == 0 && *s1 != 0) - result = 1; - return result; + normalize_substr(start, count, strlen(str2.m_text)); + return cmp(str2.m_text + start, count); } -/*------------------------------------------------- - astring_cmpsubstr - compare a substring to - an astring --------------------------------------------------*/ +//------------------------------------------------- +// icmp - compare a character array to an astring +//------------------------------------------------- -int astring_cmpsubstr(const astring *str1, const astring *str2, int start, int count) +int astring::icmp(const char *str2, int count) const { - normalize_substr(&start, &count, strlen(str2->text)); - return astring_cmpch(str1, str2->text + start, count); -} - - -/*------------------------------------------------- - astring_icmp - case-insenstive compare one - astring to another --------------------------------------------------*/ + // loop while equal until we hit the end of strings + int index; + for (index = 0; index < count; index++) + if (m_text[index] == 0 || tolower(m_text[index]) != tolower(str2[index])) + break; -int astring_icmp(const astring *str1, const astring *str2) -{ - return astring_icmpc(str1, str2->text); + // determine the final result + if (index < count) + return tolower(m_text[index]) - tolower(str2[index]); + if (m_text[index] == 0) + return 0; + return 1; } -/*------------------------------------------------- - astring_icmpc - case-insenstive compare a C - string to an astring --------------------------------------------------*/ +//------------------------------------------------- +// icmpsubstr - compare a substring to an astring +//------------------------------------------------- -int astring_icmpc(const astring *str1, const char *str2) +int astring::icmpsubstr(const astring &str2, int start, int count) const { - const char *s1 = str1->text; - - /* loop while equal until we hit the end of strings */ - while (*s1 != 0 && *str2 != 0 && tolower((UINT8)*s1) == tolower((UINT8)*str2)) - s1++, str2++; - return tolower((UINT8)*s1) - tolower((UINT8)*str2); + normalize_substr(start, count, strlen(str2.m_text)); + return icmp(str2.m_text + start, count); } -/*------------------------------------------------- - astring_icmpch - case-insenstive compare a - character array to an astring --------------------------------------------------*/ +//------------------------------------------------- +// chr - return the index of a character in an +// astring +//------------------------------------------------- -int astring_icmpch(const astring *str1, const char *str2, int count) +int astring::chr(int start, int ch) const { - const char *s1 = str1->text; - int result; - - /* loop while equal until we hit the end of strings */ - while (count-- > 0 && *s1 != 0 && *str2 != 0 && tolower((UINT8)*s1) == tolower((UINT8)*str2)) - s1++, str2++; - result = (count == -1) ? 0 : tolower((UINT8)*s1) - tolower((UINT8)*str2); - if (result == 0 && *s1 != 0) - result = 1; - return result; + char *result = strchr(safe_string_base(start), ch); + return (result != NULL) ? (result - m_text) : -1; } -/*------------------------------------------------- - astring_icmpsubstr - case-insenstive compare a - substring to an astring --------------------------------------------------*/ +//------------------------------------------------- +// rchr - return the index of a character in an +// astring, searching from the end +//------------------------------------------------- -int astring_icmpsubstr(const astring *str1, const astring *str2, int start, int count) +int astring::rchr(int start, int ch) const { - normalize_substr(&start, &count, strlen(str2->text)); - return astring_icmpch(str1, str2->text + start, count); + char *result = strrchr(safe_string_base(start), ch); + return (result != NULL) ? (result - m_text) : -1; } -/*------------------------------------------------- - astring_chr - return the index of a character - in an astring --------------------------------------------------*/ +//------------------------------------------------- +// find - find a C string in an astring +//-------------------------------------------------*/ -int astring_chr(const astring *str, int start, int ch) +int astring::find(int start, const char *search) const { - char *result = strchr(safe_string_base(str->text, start), ch); - return (result != NULL) ? (result - str->text) : -1; + char *result = strstr(safe_string_base(start), search); + return (result != NULL) ? (result - m_text) : -1; } -/*------------------------------------------------- - astring_rchr - return the index of a character - in an astring, searching from the end --------------------------------------------------*/ +//------------------------------------------------- +// replacec - search in an astring for a C string, +// replacing all instances with another C string +// and returning the number of matches +//------------------------------------------------- -int astring_rchr(const astring *str, int start, int ch) -{ - char *result = strrchr(safe_string_base(str->text, start), ch); - return (result != NULL) ? (result - str->text) : -1; -} - - -/*------------------------------------------------- - astring_find - find one astring in another --------------------------------------------------*/ - -int astring_find(const astring *str, int start, const astring *search) -{ - return astring_findc(str, start, search->text); -} - - -/*------------------------------------------------- - astring_findc - find a C string in an astring --------------------------------------------------*/ - -int astring_findc(const astring *str, int start, const char *search) -{ - char *result = strstr(safe_string_base(str->text, start), search); - return (result != NULL) ? (result - str->text) : -1; -} - - -/*------------------------------------------------- - astring_replace - search in an astring for - another astring, replacing all instances with - a third and returning the number of matches --------------------------------------------------*/ - -int astring_replace(astring *str, int start, const astring *search, const astring *replace) -{ - return astring_replacec(str, start, search->text, replace->text); -} - - -/*------------------------------------------------- - astring_replacec - search in an astring for a - C string, replacing all instances with another - C string and returning the number of matches --------------------------------------------------*/ - -int astring_replacec(astring *str, int start, const char *search, const char *replace) +int astring::replace(int start, const char *search, const char *replace) { int searchlen = strlen(search); int replacelen = strlen(replace); int matches = 0; - int curindex; - for (curindex = astring_findc(str, start, search); curindex != -1; curindex = astring_findc(str, curindex + replacelen, search)) + for (int curindex = find(start, search); curindex != -1; curindex = find(curindex + replacelen, search)) { matches++; - astring_del(str, curindex, searchlen); - astring_insc(str, curindex, replace); + del(curindex, searchlen).ins(curindex, replace); } return matches; } -/*************************************************************************** - ASTRING UTILITIES -***************************************************************************/ - -/*------------------------------------------------- - astring_delchr - delete all instances of - 'ch' --------------------------------------------------*/ - -astring *astring_delchr(astring *str, int ch) -{ - char *src, *dst; - - /* simple deletion */ - for (src = dst = str->text; *src != 0; src++) +//************************************************************************** +// ASTRING UTILITIES +//************************************************************************** + +//------------------------------------------------- +// delchr - delete all instances of 'ch' +//------------------------------------------------- + +astring &astring::delchr(int ch) +{ + // simple deletion + char *dst = m_text; + for (char *src = m_text; *src != 0; src++) if (*src != ch) *dst++ = *src; *dst = 0; - - return str; + return *this; } -/*------------------------------------------------- - astring_replacechr - replace all instances of - 'ch' with 'newch' --------------------------------------------------*/ +//------------------------------------------------- +// replacechr - replace all instances of 'ch' +// with 'newch' +//------------------------------------------------- -astring *astring_replacechr(astring *str, int ch, int newch) +astring &astring::replacechr(int ch, int newch) { - char *text; - - /* simple replacement */ - for (text = str->text; *text != 0; text++) + // simple replacement + for (char *text = m_text; *text != 0; text++) if (*text == ch) *text = newch; - - return str; + return *this; } -/*------------------------------------------------- - astring_toupper - convert string to all - upper-case --------------------------------------------------*/ +//------------------------------------------------- +// makeupper - convert string to all upper-case +//------------------------------------------------- -astring *astring_toupper(astring *str) +astring &astring::makeupper() { - char *text; - - /* just toupper() on all characters */ - for (text = str->text; *text != 0; text++) + // just makeupper() on all characters + for (char *text = m_text; *text != 0; text++) *text = toupper((UINT8)*text); - - return str; + return *this; } -/*------------------------------------------------- - astring_tolower - convert string to all - lower-case --------------------------------------------------*/ +//------------------------------------------------- +// makelower - convert string to all lower-case +//------------------------------------------------- -astring *astring_tolower(astring *str) +astring &astring::makelower() { - char *text; - - /* just tolower() on all characters */ - for (text = str->text; *text != 0; text++) + // just tolower() on all characters + for (char *text = m_text; *text != 0; text++) *text = tolower((UINT8)*text); - - return str; + return *this; } -/*------------------------------------------------- - astring_trimspace - remove all space - characters from beginning/end --------------------------------------------------*/ +//------------------------------------------------- +// trimspace - remove all space characters from +// beginning/end +//------------------------------------------------- -astring *astring_trimspace(astring *str) +astring &astring::trimspace() { - char *ptr; - - /* first remove stuff from the end */ - for (ptr = str->text + strlen(str->text) - 1; ptr >= str->text && (!(*ptr & 0x80) && isspace((UINT8)*ptr)); ptr--) + // first remove stuff from the end + for (char *ptr = m_text + strlen(m_text) - 1; ptr >= m_text && (!(*ptr & 0x80) && isspace(UINT8(*ptr))); ptr--) *ptr = 0; - /* then count how much to remove from the beginning */ - for (ptr = str->text; *ptr != 0 && (!(*ptr & 0x80) && isspace((UINT8)*ptr)); ptr++) ; - if (ptr > str->text) - astring_substr(str, ptr - str->text, -1); - - return str; + // then count how much to remove from the beginning + char *ptr; + for (ptr = m_text; *ptr != 0 && (!(*ptr & 0x80) && isspace(UINT8(*ptr))); ptr++) ; + if (ptr > m_text) + substr(ptr - m_text); + return *this; } diff -Nru mame-0.144/src/lib/util/astring.h mame-0.145/src/lib/util/astring.h --- mame-0.144/src/lib/util/astring.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/astring.h 2012-02-06 21:30:29.000000000 +0000 @@ -46,278 +46,21 @@ #include #include "osdcomm.h" -#ifdef toupper -#undef toupper -#endif -#ifdef tolower -#undef tolower -#endif - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* base astring structure */ -typedef struct _astring_base astring_base; -struct _astring_base -{ - char * text; - int alloclen; - char smallbuf[64 - sizeof(int) - sizeof(char *)]; -}; - - -/* class for C++, direct map for C */ -#ifdef __cplusplus -class astring; -#else -typedef astring_base astring; -#endif - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- astring allocation ----- */ - -/* allocate a new astring */ -astring *astring_alloc(void); - -/* free an astring */ -void astring_free(astring *str); - -/* free an astring */ -void astring_expand(astring *str, int length); - - - -/* ----- inline astring changes ----- */ - -/* copy one astring into another */ -astring *astring_cpy(astring *dst, const astring *src); - -/* copy a C string into an astring */ -astring *astring_cpyc(astring *dst, const char *src); - -/* copy a character array into an astring */ -astring *astring_cpych(astring *dst, const char *src, int count); - -/* copy a substring of one string into another */ -astring *astring_cpysubstr(astring *dst, const astring *src, int start, int count); - -/* insert one astring into another */ -astring *astring_ins(astring *dst, int insbefore, const astring *src); - -/* insert a C string into an astring */ -astring *astring_insc(astring *dst, int insbefore, const char *src); - -/* insert a character array into an astring */ -astring *astring_insch(astring *dst, int insbefore, const char *src, int count); - -/* insert a substring of one string into another */ -astring *astring_inssubstr(astring *dst, int insbefore, const astring *src, int start, int count); - -/* extract a substring of ourself, removing everything else */ -astring *astring_substr(astring *str, int start, int count); - -/* delete a substring from ourself, keeping everything else */ -astring *astring_del(astring *str, int start, int count); - -/* formatted printf to an astring */ -int astring_printf(astring *dst, const char *format, ...) ATTR_PRINTF(2,3); - -/* formatted vprintf to an astring */ -int astring_vprintf(astring *dst, const char *format, va_list args); - -/* formatted printf to the end of an astring */ -int astring_catprintf(astring *dst, const char *format, ...) ATTR_PRINTF(2,3); - -/* formatted vprintf to the end of an astring */ -int astring_catvprintf(astring *dst, const char *format, va_list args); - - - -/* ----- astring queries ----- */ - -/* return a pointer to a C string from an astring */ -const char *astring_c(const astring *str); - -/* return the length of an astring */ -int astring_len(const astring *str); - -/* compare two astrings */ -int astring_cmp(const astring *str1, const astring *str2); - -/* compare an astring to a C string */ -int astring_cmpc(const astring *str1, const char *str2); - -/* compare an astring to a character buffer */ -int astring_cmpch(const astring *str1, const char *str2, int count); - -/* compare an astring to a character buffer */ -int astring_cmpsubstr(const astring *str1, const astring *str2, int start, int count); - -/* case-insenstive compare two astrings */ -int astring_icmp(const astring *str1, const astring *str2); - -/* case-insenstive compare an astring to a C string */ -int astring_icmpc(const astring *str1, const char *str2); - -/* case-insenstive compare an astring to a character buffer */ -int astring_icmpch(const astring *str1, const char *str2, int count); - -/* case-insenstive compare an astring to a character buffer */ -int astring_icmpsubstr(const astring *str1, const astring *str2, int start, int count); - -/* search an astring for a character, returning offset or -1 if not found */ -int astring_chr(const astring *str, int start, int ch); - -/* reverse search an astring for a character, returning offset or -1 if not found */ -int astring_rchr(const astring *str, int start, int ch); - -/* search in an astring for another astring, returning offset or -1 if not found */ -int astring_find(const astring *str, int start, const astring *search); - -/* search in an astring for a C string, returning offset or -1 if not found */ -int astring_findc(const astring *str, int start, const char *search); - -/* search in an astring for another astring, replacing all instances with a third and returning the number of matches */ -int astring_replace(astring *str, int start, const astring *search, const astring *replace); - -/* search in an astring for a C string, replacing all instances with another C string and returning the number of matches */ -int astring_replacec(astring *str, int start, const char *search, const char *replace); - - -/* ----- astring utilties ----- */ -/* delete all instances of 'ch' */ -astring *astring_delchr(astring *str, int ch); +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -/* replace all instances of 'ch' with 'newch' */ -astring *astring_replacechr(astring *str, int ch, int newch); - -/* convert string to all upper-case */ -astring *astring_toupper(astring *str); - -/* convert string to all lower-case */ -astring *astring_tolower(astring *str); - -/* remove all space characters from beginning/end */ -astring *astring_trimspace(astring *str); - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/* allocate a new duplicate of an astring */ -INLINE astring *astring_dup(const astring *str) -{ - return astring_cpy(astring_alloc(), str); -} - -/* allocate a new duplicate of an astring */ -INLINE astring *astring_dupc(const char *str) -{ - return astring_cpyc(astring_alloc(), str); -} - -/* allocate a new duplicate of an astring */ -INLINE astring *astring_dupch(const char *str, int count) -{ - return astring_cpych(astring_alloc(), str, count); -} - -/* allocate a duplicate of a substring */ -INLINE astring *astring_dupsubstr(const astring *str, int start, int count) -{ - return astring_cpysubstr(astring_alloc(), str, start, count); -} - - -/* reset an astring to an empty string */ -INLINE astring *astring_reset(astring *dst) -{ - return astring_cpyc(dst, ""); -} - - -/* concatenate one astring to the end of another */ -INLINE astring *astring_cat(astring *dst, const astring *src) -{ - return astring_ins(dst, -1, src); -} - -/* concatenate a C string to the end of an astring */ -INLINE astring *astring_catc(astring *dst, const char *src) -{ - return astring_insc(dst, -1, src); -} - -/* concatenate a character array to the end of an astring */ -INLINE astring *astring_catch(astring *dst, const char *src, int count) -{ - return astring_insch(dst, -1, src, count); -} - -/* concatenate a substring of one string into another */ -INLINE astring *astring_catsubstr(astring *dst, const astring *src, int start, int count) +// derived class for C++ +class astring { - return astring_inssubstr(dst, -1, src, start, count); -} - - -/* assemble an astring from 2 C strings */ -INLINE astring *astring_assemble_2(astring *dst, const char *src1, const char *src2) -{ - return astring_catc(astring_cpyc(dst, src1), src2); -} - -/* assemble an astring from 3 C strings */ -INLINE astring *astring_assemble_3(astring *dst, const char *src1, const char *src2, const char *src3) -{ - return astring_catc(astring_assemble_2(dst, src1, src2), src3); -} - -/* assemble an astring from 4 C strings */ -INLINE astring *astring_assemble_4(astring *dst, const char *src1, const char *src2, const char *src3, const char *src4) -{ - return astring_catc(astring_assemble_3(dst, src1, src2, src3), src4); -} - -/* assemble an astring from 5 C strings */ -INLINE astring *astring_assemble_5(astring *dst, const char *src1, const char *src2, const char *src3, const char *src4, const char *src5) -{ - return astring_catc(astring_assemble_4(dst, src1, src2, src3, src4), src5); -} - - - -/*************************************************************************** - C++ WRAPPERS -***************************************************************************/ - -#ifdef __cplusplus -#ifdef SDLMAME_NETBSD -#undef toupper -#undef tolower -#endif - -/* derived class for C++ */ -class astring : public astring_base -{ -private: - astring &init(); - public: + // simple construction/destruction astring() { init(); } ~astring(); + // construction with copy astring(const char *string) { init().cpy(string); } astring(const char *string, int length) { init().cpy(string, length); } astring(const char *str1, const char *str2) { init().cpy(str1).cat(str2); } @@ -327,14 +70,17 @@ astring(const astring &string) { init().cpy(string); } astring(const astring &string, int start, int count = -1) { init().cpysubstr(string, start, count); } + // assignment operators astring &operator=(const char *string) { return cpy(string); } astring &operator=(const astring &string) { return cpy(string); } + // concatenation operators astring& operator+=(const astring &string) { return cat(string); } friend astring operator+(const astring &lhs, const astring &rhs) { return astring(lhs) += rhs; } friend astring operator+(const astring &lhs, const char *rhs) { return astring(lhs) += rhs; } friend astring operator+(const char *lhs, const astring &rhs) { return astring(lhs) += rhs; } + // comparison operators bool operator==(const char *string) const { return (cmp(string) == 0); } bool operator==(const astring &string) const { return (cmp(string) == 0); } bool operator!=(const char *string) const { return (cmp(string) != 0); } @@ -348,68 +94,97 @@ bool operator>=(const char *string) const { return (cmp(string) >= 0); } bool operator>=(const astring &string) const { return (cmp(string) >= 0); } + // character access operators + char operator[](int index) const { return (index < len()) ? m_text[index] : 0; } + + // implicit boolean conversion operators + operator bool() { return m_text[0] != 0; } + operator bool() const { return m_text[0] != 0; } + + // C string conversion operators and helpers + operator const char *() const { return m_text; } + const char *cstr() const { return m_text; } + char *stringbuffer(int size) { ensure_room(size); return m_text; } + + // buffer management astring &reset() { return cpy(""); } - astring &expand(int length) { astring_expand(this, length); return *this; } + astring &expand(int length) { ensure_room(length); return *this; } + + // length query + int len() const { return strlen(m_text); } + + // copy helpers + astring &cpy(const char *src, int count); + astring &cpysubstr(const astring &src, int start, int count = -1); + astring &cpy(const astring &src) { return cpy(src.cstr(), src.len()); } + astring &cpy(const char *src) { return cpy(src, strlen(src)); } + + // insertion helpers + astring &ins(int insbefore, const char *src, int count); + astring &inssubstr(int insbefore, const astring &src, int start, int count = -1); + astring &ins(int insbefore, const astring &src) { return ins(insbefore, src.cstr(), src.len()); } + astring &ins(int insbefore, const char *src) { return ins(insbefore, src, strlen(src)); } - operator bool() { return this->text[0] != 0; } - operator bool() const { return this->text[0] != 0; } - operator const char *() const { return astring_c(this); } - const char *cstr() const { return astring_c(this); } - int len() const { return astring_len(this); } - - astring &cpy(const astring &src) { return *astring_cpy(this, &src); } - astring &cpy(const char *src) { return *astring_cpyc(this, src); } - astring &cpy(const char *src, int count) { return *astring_cpych(this, src, count); } - astring &cpysubstr(const astring &src, int start, int count) { return *astring_cpysubstr(this, &src, start, count); } - - astring &cat(char ch) { return *astring_insch(this, -1, &ch, 1); } - astring &cat(const astring &src) { return ins(-1, src); } - astring &cat(const char *src) { return ins(-1, src); } + // concatenation helpers (== insert at end) astring &cat(const char *src, int count) { return ins(-1, src, count); } - astring &catsubstr(const astring &src, int start, int count) { return inssubstr(-1, src, start, count); } + astring &catsubstr(const astring &src, int start, int count = -1) { return inssubstr(-1, src, start, count); } + astring &cat(const astring &src) { return ins(-1, src.cstr(), src.len()); } + astring &cat(const char *src) { return ins(-1, src, strlen(src)); } + astring &cat(char ch) { return ins(-1, &ch, 1); } + + // substring helpers + astring &substr(int start, int count = -1); + astring &del(int start, int count = -1); + + // formatted string helpers + int vprintf(const char *format, va_list args); + int catvprintf(const char *format, va_list args); + int printf(const char *format, ...) { va_list ap; va_start(ap, format); int result = this->vprintf(format, ap); va_end(ap); return result; } + int catprintf(const char *format, ...) { va_list ap; va_start(ap, format); int result = catvprintf(format, ap); va_end(ap); return result; } + astring &format(const char *format, ...) { va_list ap; va_start(ap, format); this->vprintf(format, ap); va_end(ap); return *this; } + astring &catformat(const char *format, ...) { va_list ap; va_start(ap, format); catvprintf(format, ap); va_end(ap); return *this; } + + // comparison helpers + int cmp(const char *str2, int count) const; + int cmpsubstr(const astring &str2, int start, int count = -1) const; + int cmp(const astring &str2) const { return cmp(str2.cstr(), str2.len()); } + int cmp(const char *str2) const { return cmp(str2, strlen(str2)); } + + // case-insensitive comparison helpers + int icmp(const char *str2, int count) const; + int icmpsubstr(const astring &str2, int start, int count = -1) const; + int icmp(const astring &str2) const { return icmp(str2.cstr(), str2.len()); } + int icmp(const char *str2) const { return icmp(str2, strlen(str2)); } + + // character searching helpers + int chr(int start, int ch) const; + int rchr(int start, int ch) const; + + // string searching/replacing helpers + int find(int start, const char *search) const; + int find(const char *search) const { return find(0, search); } + int replace(int start, const char *search, const char *replace); + int replace(const char *search, const char *_replace) { return replace(0, search, _replace); } + + // misc utilities + astring &delchr(int ch); + astring &replacechr(int ch, int newch); + astring &makeupper(); + astring &makelower(); + astring &trimspace(); - astring &ins(int insbefore, const astring &src) { return *astring_ins(this, insbefore, &src); } - astring &ins(int insbefore, const char *src) { return *astring_insc(this, insbefore, src); } - astring &ins(int insbefore, const char *src, int count) { return *astring_insch(this, insbefore, src, count); } - astring &inssubstr(int insbefore, const astring &src, int start, int count) { return *astring_inssubstr(this, insbefore, &src, start, count); } - - astring &substr(int start, int count) { return *astring_substr(this, start, count); } - astring &del(int start, int count) { return *astring_del(this, start, count); } - - int printf(const char *format, ...) { va_list ap; va_start(ap, format); int result = astring_vprintf(this, format, ap); va_end(ap); return result; } - int vprintf(const char *format, va_list args) { return astring_vprintf(this, format, args); } - int catprintf(const char *format, ...) { va_list ap; va_start(ap, format); int result = astring_catvprintf(this, format, ap); va_end(ap); return result; } - int catvprintf(const char *format, va_list args) { return astring_catvprintf(this, format, args); } - - astring &format(const char *format, ...) { va_list ap; va_start(ap, format); astring_vprintf(this, format, ap); va_end(ap); return *this; } - - int cmp(const astring &str2) const { return astring_cmp(this, &str2); } - int cmp(const char *str2) const { return astring_cmpc(this, str2); } - int cmp(const char *str2, int count) const { return astring_cmpch(this, str2, count); } - int cmpsubstr(const astring &str2, int start, int count) const { return astring_cmpsubstr(this, &str2, start, count); } - - int icmp(const astring &str2) const { return astring_icmp(this, &str2); } - int icmp(const char *str2) const { return astring_icmpc(this, str2); } - int icmp(const char *str2, int count) const { return astring_icmpch(this, str2, count); } - int icmpsubstr(const astring &str2, int start, int count) const { return astring_icmpsubstr(this, &str2, start, count); } - - int chr(int start, int ch) const { return astring_chr(this, start, ch); } - int rchr(int start, int ch) const { return astring_rchr(this, start, ch); } - - int find(int start, const astring &search) const { return astring_find(this, start, &search); } - int find(int start, const char *search) const { return astring_findc(this, start, search); } - - int replace(int start, const astring &search, const astring &replace) { return astring_replace(this, start, &search, &replace); } - int replace(int start, const char *search, const char *replace) { return astring_replacec(this, start, search, replace); } - - astring &delchr(int ch) { return *astring_delchr(this, ch); } - astring &replacechr(int ch, int newch) { return *astring_replacechr(this, ch, newch); } - astring &toupper() { return *astring_toupper(this); } - astring &tolower() { return *astring_tolower(this); } - astring &trimspace() { return *astring_trimspace(this); } +private: + // internal helpers + astring &init(); + char *safe_string_base(int start) const; + bool ensure_room(int length); + void normalize_substr(int &start, int &count, int length) const; + + // internal state + char * m_text; + int m_alloclen; + char m_smallbuf[64]; }; -#endif - #endif /* __ASTRING_H__ */ diff -Nru mame-0.144/src/lib/util/avcomp.c mame-0.145/src/lib/util/avcomp.c --- mame-0.144/src/lib/util/avcomp.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/avcomp.c 2012-02-06 21:30:29.000000000 +0000 @@ -92,6 +92,7 @@ #include #include +#include /*************************************************************************** @@ -106,8 +107,19 @@ TYPE DEFINITIONS ***************************************************************************/ -struct _avcomp_state +struct avcomp_state { + avcomp_state() + : maxwidth(0), + maxheight(0), + maxchannels(0), + audiodata(NULL), + ycontext(NULL), + cbcontext(NULL), + crcontext(NULL), + audiohicontext(NULL), + audiolocontext(NULL) { } + /* video parameters */ UINT32 maxwidth, maxheight; @@ -167,20 +179,17 @@ return NULL; /* allocate memory for state block */ - state = (avcomp_state *)malloc(sizeof(*state)); + state = new(std::nothrow) avcomp_state; if (state == NULL) return NULL; - /* clear the buffers */ - memset(state, 0, sizeof(*state)); - /* compute the core info */ state->maxwidth = maxwidth; state->maxheight = maxheight; state->maxchannels = maxchannels; /* now allocate data buffers */ - state->audiodata = (UINT8 *)malloc(65536 * state->maxchannels * 2); + state->audiodata = new(std::nothrow) UINT8[65536 * state->maxchannels * 2]; if (state->audiodata == NULL) goto cleanup; @@ -216,8 +225,7 @@ void avcomp_free(avcomp_state *state) { /* free the data buffers */ - if (state->audiodata != NULL) - free(state->audiodata); + delete[] state->audiodata; /* free the contexts */ if (state->ycontext != NULL) @@ -231,7 +239,7 @@ if (state->audiolocontext != NULL) huffman_free_context(state->audiolocontext); - free(state); + delete state; } @@ -240,9 +248,14 @@ parameters -------------------------------------------------*/ -void avcomp_config_compress(avcomp_state *state, const av_codec_compress_config *config) +void avcomp_config_compress(avcomp_state *state, av_codec_compress_config *config) { - state->compress = *config; + state->compress.video.wrap(config->video, config->video.cliprect()); + state->compress.channels = config->channels; + state->compress.samples = config->samples; + memcpy(state->compress.audio, config->audio, sizeof(state->compress.audio)); + state->compress.metalength = config->metalength; + state->compress.metadata = config->metadata; } @@ -251,9 +264,15 @@ decompression parameters -------------------------------------------------*/ -void avcomp_config_decompress(avcomp_state *state, const av_codec_decompress_config *config) +void avcomp_config_decompress(avcomp_state *state, av_codec_decompress_config *config) { - state->decompress = *config; + state->decompress.video.wrap(config->video, config->video.cliprect()); + state->decompress.maxsamples = config->maxsamples; + state->decompress.actsamples = config->actsamples; + memcpy(state->decompress.audio, config->audio, sizeof(state->decompress.audio)); + state->decompress.maxmetalength = config->maxmetalength; + state->decompress.actmetalength = config->actmetalength; + state->decompress.metadata = config->metadata; } @@ -326,12 +345,12 @@ /* extract video information */ videostart = NULL; videostride = width = height = 0; - if (state->compress.video != NULL) + if (state->compress.video.valid()) { - videostart = (const UINT8 *)state->compress.video->base; - videostride = state->compress.video->rowpixels * 2; - width = state->compress.video->width; - height = state->compress.video->height; + videostart = reinterpret_cast(&state->compress.video.pix(0)); + videostride = state->compress.video.rowpixels() * 2; + width = state->compress.video.width(); + height = state->compress.video.height(); } /* data is assumed to be native-endian */ @@ -483,15 +502,15 @@ metastart = state->decompress.metadata; for (chnum = 0; chnum < channels; chnum++) audiostart[chnum] = (UINT8 *)state->decompress.audio[chnum]; - videostart = (state->decompress.video != NULL) ? (UINT8 *)state->decompress.video->base : NULL; - videostride = (state->decompress.video != NULL) ? state->decompress.video->rowpixels * 2 : 0; + videostart = (state->decompress.video.valid()) ? reinterpret_cast(&state->decompress.video.pix(0)) : NULL; + videostride = (state->decompress.video.valid()) ? state->decompress.video.rowpixels() * 2 : 0; /* data is assumed to be native-endian */ *(UINT8 *)&betest = 1; audioxor = videoxor = (betest == 1) ? 1 : 0; /* verify against sizes */ - if (state->decompress.video != NULL && (state->decompress.video->width < width || state->decompress.video->height < height)) + if (state->decompress.video.valid() && (state->decompress.video.width() < width || state->decompress.video.height() < height)) return AVCERR_VIDEO_TOO_LARGE; for (chnum = 0; chnum < channels; chnum++) if (state->decompress.audio[chnum] != NULL && state->decompress.maxsamples < samples) diff -Nru mame-0.144/src/lib/util/avcomp.h mame-0.145/src/lib/util/avcomp.h --- mame-0.144/src/lib/util/avcomp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/avcomp.h 2012-02-06 21:30:29.000000000 +0000 @@ -76,10 +76,18 @@ ***************************************************************************/ /* compression configuration */ -typedef struct _av_codec_compress_config av_codec_compress_config; -struct _av_codec_compress_config +struct av_codec_compress_config { - bitmap_t * video; /* pointer to video bitmap */ + av_codec_compress_config() + : channels(0), + samples(0), + metalength(0), + metadata(NULL) + { + memset(audio, 0, sizeof(audio)); + } + + bitmap_yuy16 video; /* pointer to video bitmap */ UINT32 channels; /* number of channels */ UINT32 samples; /* number of samples per channel */ INT16 * audio[16]; /* pointer to individual audio channels */ @@ -89,10 +97,19 @@ /* decompression configuration */ -typedef struct _av_codec_decompress_config av_codec_decompress_config; -struct _av_codec_decompress_config +struct av_codec_decompress_config { - bitmap_t * video; /* pointer to video bitmap */ + av_codec_decompress_config() + : maxsamples(0), + actsamples(0), + maxmetalength(0), + actmetalength(0), + metadata(NULL) + { + memset(audio, 0, sizeof(audio)); + } + + bitmap_yuy16 video; /* pointer to video bitmap */ UINT32 maxsamples; /* maximum number of samples per channel */ UINT32 * actsamples; /* actual number of samples per channel */ INT16 * audio[16]; /* pointer to individual audio channels */ @@ -103,7 +120,7 @@ /* opaque state */ -typedef struct _avcomp_state avcomp_state; +struct avcomp_state; @@ -114,8 +131,8 @@ avcomp_state *avcomp_init(UINT32 maxwidth, UINT32 maxheight, UINT32 maxchannels); void avcomp_free(avcomp_state *state); -void avcomp_config_compress(avcomp_state *state, const av_codec_compress_config *config); -void avcomp_config_decompress(avcomp_state *state, const av_codec_decompress_config *config); +void avcomp_config_compress(avcomp_state *state, av_codec_compress_config *config); +void avcomp_config_decompress(avcomp_state *state, av_codec_decompress_config *config); avcomp_error avcomp_encode_data(avcomp_state *state, const UINT8 *source, UINT8 *dest, UINT32 *complength); avcomp_error avcomp_decode_data(avcomp_state *state, const UINT8 *source, UINT32 complength, UINT8 *dest); diff -Nru mame-0.144/src/lib/util/aviio.c mame-0.145/src/lib/util/aviio.c --- mame-0.144/src/lib/util/aviio.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/aviio.c 2012-02-06 21:30:29.000000000 +0000 @@ -250,15 +250,15 @@ static avi_error soundbuf_flush(avi_file *file, int only_flush_full); /* RGB helpers */ -static avi_error rgb32_compress_to_rgb(avi_stream *stream, const bitmap_t *bitmap, UINT8 *data, UINT32 numbytes); +static avi_error rgb32_compress_to_rgb(avi_stream *stream, const bitmap_rgb32 &bitmap, UINT8 *data, UINT32 numbytes); /* YUY helpers */ -static avi_error yuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_t *bitmap); -static avi_error yuy16_compress_to_yuy(avi_stream *stream, const bitmap_t *bitmap, UINT8 *data, UINT32 numbytes); +static avi_error yuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_yuy16 &bitmap); +static avi_error yuy16_compress_to_yuy(avi_stream *stream, const bitmap_yuy16 &bitmap, UINT8 *data, UINT32 numbytes); /* HuffYUV helpers */ static avi_error huffyuv_extract_tables(avi_stream *stream, const UINT8 *chunkdata, UINT32 size); -static avi_error huffyuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_t *bitmap); +static avi_error huffyuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_yuy16 &bitmap); /* debugging */ static void printf_chunk_recursive(avi_file *file, avi_chunk *chunk, int indent); @@ -788,12 +788,12 @@ /*------------------------------------------------- - avi_read_video_frame_yuy16 - read video data + avi_read_video_frame - read video data for a particular frame from the AVI file, converting to YUY16 format -------------------------------------------------*/ -avi_error avi_read_video_frame_yuy16(avi_file *file, UINT32 framenum, bitmap_t *bitmap) +avi_error avi_read_video_frame(avi_file *file, UINT32 framenum, bitmap_yuy16 &bitmap) { avi_error avierr = AVIERR_NONE; UINT32 bytes_read, chunkid; @@ -814,7 +814,7 @@ return AVIERR_INVALID_FRAME; /* we only support YUY-style bitmaps (16bpp) */ - if (bitmap->format != BITMAP_FORMAT_YUY16 || bitmap->width < stream->width || bitmap->height < stream->height) + if (bitmap.width() < stream->width || bitmap.height() < stream->height) return AVIERR_INVALID_BITMAP; /* expand the tempbuffer to hold the data if necessary */ @@ -957,7 +957,7 @@ of video in YUY16 format -------------------------------------------------*/ -avi_error avi_append_video_frame_yuy16(avi_file *file, const bitmap_t *bitmap) +avi_error avi_append_video_frame(avi_file *file, bitmap_yuy16 &bitmap) { avi_stream *stream = get_video_stream(file); avi_error avierr; @@ -967,10 +967,6 @@ if (stream->format != FORMAT_UYVY && stream->format != FORMAT_VYUY && stream->format != FORMAT_YUY2 && stream->format != FORMAT_HFYU) return AVIERR_UNSUPPORTED_VIDEO_FORMAT; - /* double check bitmap format */ - if (bitmap->format != BITMAP_FORMAT_YUY16) - return AVIERR_INVALID_BITMAP; - /* write out any sound data first */ avierr = soundbuf_write_chunk(file, stream->chunks); if (avierr != AVIERR_NONE) @@ -1003,7 +999,7 @@ of video in RGB32 format -------------------------------------------------*/ -avi_error avi_append_video_frame_rgb32(avi_file *file, const bitmap_t *bitmap) +avi_error avi_append_video_frame(avi_file *file, bitmap_rgb32 &bitmap) { avi_stream *stream = get_video_stream(file); avi_error avierr; @@ -1017,10 +1013,6 @@ if (stream->depth != 24) return AVIERR_UNSUPPORTED_VIDEO_FORMAT; - /* double check bitmap format */ - if (bitmap->format != BITMAP_FORMAT_RGB32) - return AVIERR_INVALID_BITMAP; - /* write out any sound data first */ avierr = soundbuf_write_chunk(file, stream->chunks); if (avierr != AVIERR_NONE) @@ -2343,17 +2335,17 @@ bitmap to an RGB encoded frame -------------------------------------------------*/ -static avi_error rgb32_compress_to_rgb(avi_stream *stream, const bitmap_t *bitmap, UINT8 *data, UINT32 numbytes) +static avi_error rgb32_compress_to_rgb(avi_stream *stream, const bitmap_rgb32 &bitmap, UINT8 *data, UINT32 numbytes) { - int height = MIN(stream->height, bitmap->height); - int width = MIN(stream->width, bitmap->width); + int height = MIN(stream->height, bitmap.height()); + int width = MIN(stream->width, bitmap.width()); UINT8 *dataend = data + numbytes; int x, y; /* compressed video */ for (y = 0; y < height; y++) { - const UINT32 *source = (UINT32 *)bitmap->base + y * bitmap->rowpixels; + const UINT32 *source = &bitmap.pix32(y); UINT8 *dest = data + (stream->height - 1 - y) * stream->width * 3; for (x = 0; x < width && dest < dataend; x++) @@ -2394,7 +2386,7 @@ encoded frame to a YUY16 bitmap -------------------------------------------------*/ -static avi_error yuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_t *bitmap) +static avi_error yuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_yuy16 &bitmap) { const UINT16 *dataend = (const UINT16 *)(data + numbytes); int x, y; @@ -2403,7 +2395,7 @@ for (y = 0; y < stream->height; y++) { const UINT16 *source = (const UINT16 *)data + y * stream->width; - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *dest = &bitmap.pix16(y); /* switch off the compression */ switch (stream->format) @@ -2433,7 +2425,7 @@ bitmap to a YUV encoded frame -------------------------------------------------*/ -static avi_error yuy16_compress_to_yuy(avi_stream *stream, const bitmap_t *bitmap, UINT8 *data, UINT32 numbytes) +static avi_error yuy16_compress_to_yuy(avi_stream *stream, const bitmap_yuy16 &bitmap, UINT8 *data, UINT32 numbytes) { const UINT16 *dataend = (const UINT16 *)(data + numbytes); int x, y; @@ -2441,7 +2433,7 @@ /* compressed video */ for (y = 0; y < stream->height; y++) { - const UINT16 *source = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + const UINT16 *source = &bitmap.pix16(y); UINT16 *dest = (UINT16 *)data + y * stream->width; /* switch off the compression */ @@ -2611,7 +2603,7 @@ HuffYUV-encoded frame to a YUY16 bitmap -------------------------------------------------*/ -static avi_error huffyuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_t *bitmap) +static avi_error huffyuv_decompress_to_yuy16(avi_stream *stream, const UINT8 *data, UINT32 numbytes, bitmap_yuy16 &bitmap) { huffyuv_data *huffyuv = stream->huffyuv; int prevlines = (stream->height > 288) ? 2 : 1; @@ -2625,7 +2617,7 @@ /* compressed video */ for (y = 0; y < stream->height; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); /* handle the first four bytes independently */ x = 0; @@ -2713,8 +2705,8 @@ lastprevy = lastprevcb = lastprevcr = 0; for (y = 0; y < stream->height; y++) { - UINT16 *prevrow = BITMAP_ADDR16(bitmap, y - prevlines, 0); - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *prevrow = &bitmap.pix16(y - prevlines); + UINT16 *dest = &bitmap.pix16(y); /* handle the first four bytes independently */ x = 0; diff -Nru mame-0.144/src/lib/util/aviio.h mame-0.145/src/lib/util/aviio.h --- mame-0.144/src/lib/util/aviio.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/aviio.h 2012-02-06 21:30:29.000000000 +0000 @@ -143,11 +143,11 @@ const avi_movie_info *avi_get_movie_info(avi_file *file); UINT32 avi_first_sample_in_frame(avi_file *file, UINT32 framenum); -avi_error avi_read_video_frame_yuy16(avi_file *file, UINT32 framenum, bitmap_t *bitmap); +avi_error avi_read_video_frame(avi_file *file, UINT32 framenum, bitmap_yuy16 &bitmap); avi_error avi_read_sound_samples(avi_file *file, int channel, UINT32 firstsample, UINT32 numsamples, INT16 *output); -avi_error avi_append_video_frame_yuy16(avi_file *file, const bitmap_t *bitmap); -avi_error avi_append_video_frame_rgb32(avi_file *file, const bitmap_t *bitmap); +avi_error avi_append_video_frame(avi_file *file, bitmap_yuy16 &bitmap); +avi_error avi_append_video_frame(avi_file *file, bitmap_rgb32 &bitmap); avi_error avi_append_sound_samples(avi_file *file, int channel, const INT16 *samples, UINT32 numsamples, UINT32 sampleskip); #endif diff -Nru mame-0.144/src/lib/util/bitmap.c mame-0.145/src/lib/util/bitmap.c --- mame-0.144/src/lib/util/bitmap.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/bitmap.c 2012-02-06 21:30:29.000000000 +0000 @@ -39,468 +39,371 @@ #include "bitmap.h" -#include - -#ifdef __cplusplus #include -#endif -/*************************************************************************** - BITMAP ALLOCATION/CONFIGURATION -***************************************************************************/ -#ifdef __cplusplus +//************************************************************************** +// CONSTANTS +//************************************************************************** + +// alignment values; 128 bytes is the largest cache line on typical +// architectures today +const UINT32 BITMAP_OVERALL_ALIGN = 128; +const UINT32 BITMAP_ROWBYTES_ALIGN = 128; + -/*------------------------------------------------- - bitmap_t - basic constructor --------------------------------------------------*/ -bitmap_t::bitmap_t() +//************************************************************************** +// INLINE HELPERS +//************************************************************************** + +//------------------------------------------------- +// compute_rowpixels - compute an aligned +// rowpixels value +//------------------------------------------------- + +inline INT32 bitmap_t::compute_rowpixels(int width, int xslop) { - /* initialize base fields by hand */ - alloc = NULL; - base = NULL; - rowpixels = 0; - width = 0; - height = 0; - format = BITMAP_FORMAT_INVALID; - bpp = 0; - palette = NULL; - cliprect.min_x = cliprect.min_y = 0; - cliprect.max_x = cliprect.max_y = 0; + int rowpixels_align = BITMAP_ROWBYTES_ALIGN / (m_bpp / 8); + return ((width + 2 * xslop + (rowpixels_align - 1)) / rowpixels_align) * rowpixels_align; } -bitmap_t::bitmap_t(int _width, int _height, bitmap_format _format, int _xslop, int _yslop) -{ - /* initialize base fields by hand */ - alloc = NULL; - base = NULL; - rowpixels = (_width + 2 * _xslop + 7) & ~7; - width = _width; - height = _height; - format = _format; - bpp = bitmap_format_to_bpp(_format); - palette = NULL; - cliprect.min_x = cliprect.min_y = 0; - cliprect.max_x = width - 1; - cliprect.max_y = height - 1; +//------------------------------------------------- +// compute_base - compute an aligned bitmap base +// address with the given slop values +//------------------------------------------------- - /* fail if invalid format */ - if (bpp == 0) - throw std::bad_alloc(); +inline void bitmap_t::compute_base(int xslop, int yslop) +{ + m_base = m_alloc + (m_rowpixels * yslop + xslop) * (m_bpp / 8); + UINT64 aligned_base = ((reinterpret_cast(m_base) + (BITMAP_OVERALL_ALIGN - 1)) / BITMAP_OVERALL_ALIGN) * BITMAP_OVERALL_ALIGN; + m_base = reinterpret_cast(aligned_base); +} - /* allocate memory for the bitmap itself */ - size_t allocbytes = rowpixels * (height + 2 * _yslop) * bpp / 8; - alloc = malloc(allocbytes); - if (alloc == NULL) - throw std::bad_alloc(); - /* clear to 0 by default */ - memset(alloc, 0, allocbytes); - /* compute the base */ - base = (UINT8 *)alloc + (rowpixels * _yslop + _xslop) * (bpp / 8); -} +//************************************************************************** +// BITMAP ALLOCATION/CONFIGURATION +//************************************************************************** +//------------------------------------------------- +// bitmap_t - basic constructor +//------------------------------------------------- -bitmap_t::bitmap_t(void *_base, int _width, int _height, int _rowpixels, bitmap_format _format) +bitmap_t::bitmap_t(bitmap_format format, int bpp, int width, int height, int xslop, int yslop) + : m_alloc(NULL), + m_allocbytes(0), + m_format(format), + m_bpp(bpp), + m_palette(NULL) { - /* initialize base fields by hand */ - alloc = NULL; - base = _base; - rowpixels = _rowpixels; - width = _width; - height = _height; - format = _format; - bpp = bitmap_format_to_bpp(_format); - palette = NULL; - cliprect.min_x = cliprect.min_y = 0; - cliprect.max_x = width - 1; - cliprect.max_y = height - 1; - - /* fail if invalid format */ - if (bpp == 0) - throw std::bad_alloc(); + // allocate intializes all other fields + allocate(width, height, xslop, yslop); } -/*------------------------------------------------- - ~bitmap_t - basic destructor --------------------------------------------------*/ - -bitmap_t::~bitmap_t() +bitmap_t::bitmap_t(bitmap_format format, int bpp, void *base, int width, int height, int rowpixels) + : m_alloc(NULL), + m_allocbytes(0), + m_base(base), + m_rowpixels(rowpixels), + m_width(width), + m_height(height), + m_format(format), + m_bpp(bpp), + m_palette(NULL), + m_cliprect(0, width - 1, 0, height - 1) { - /* dereference the palette */ - if (palette != NULL) - palette_deref(palette); - - /* free any allocated memory */ - if (alloc != NULL) - free(alloc); } -/*------------------------------------------------- - bitmap_alloc -- allocate memory for a new - bitmap of the given format --------------------------------------------------*/ - -bitmap_t *bitmap_alloc(int width, int height, bitmap_format format) +bitmap_t::bitmap_t(bitmap_format format, int bpp, bitmap_t &source, const rectangle &subrect) + : m_alloc(NULL), + m_allocbytes(0), + m_base(source.raw_pixptr(subrect.min_y, subrect.min_x)), + m_rowpixels(source.m_rowpixels), + m_width(subrect.width()), + m_height(subrect.height()), + m_format(format), + m_bpp(bpp), + m_palette(NULL), + m_cliprect(0, subrect.width() - 1, 0, subrect.height() - 1) { - return new bitmap_t(width, height, format); + assert(format == source.m_format); + assert(bpp == source.m_bpp); + assert(source.cliprect().contains(subrect)); } -/*------------------------------------------------- - bitmap_alloc_slop -- allocate a new bitmap with - additional slop on the borders --------------------------------------------------*/ +//------------------------------------------------- +// ~bitmap_t - basic destructor +//------------------------------------------------- -bitmap_t *bitmap_alloc_slop(int width, int height, int xslop, int yslop, bitmap_format format) +bitmap_t::~bitmap_t() { - return new bitmap_t(width, height, format, xslop, yslop); + // delete any existing stuff + reset(); } -/*------------------------------------------------- - bitmap_wrap -- wrap an existing memory buffer - as a bitmap --------------------------------------------------*/ +//------------------------------------------------- +// allocate -- (re)allocate memory for the bitmap +// at the given size, destroying anything that +// already exists +//------------------------------------------------- -bitmap_t *bitmap_wrap(void *base, int width, int height, int rowpixels, bitmap_format format) +void bitmap_t::allocate(int width, int height, int xslop, int yslop) { - return new bitmap_t(base, width, height, rowpixels, format); -} + assert(m_format != BITMAP_FORMAT_INVALID); + assert(m_bpp == 8 || m_bpp == 16 || m_bpp == 32 || m_bpp == 64); + // delete any existing stuff + reset(); -/*------------------------------------------------- - bitmap_free -- release memory allocated for - a bitmap --------------------------------------------------*/ + // handle empty requests cleanly + if (width <= 0 || height <= 0) + return; -void bitmap_free(bitmap_t *bitmap) -{ - delete bitmap; -} + // initialize fields + m_rowpixels = compute_rowpixels(width, xslop); + m_width = width; + m_height = height; + m_cliprect.set(0, width - 1, 0, height - 1); -#else + // allocate memory for the bitmap itself + m_allocbytes = m_rowpixels * (m_height + 2 * yslop) * m_bpp / 8; + m_allocbytes += BITMAP_OVERALL_ALIGN - 1; + m_alloc = new UINT8[m_allocbytes]; -/*------------------------------------------------- - bitmap_alloc -- allocate memory for a new - bitmap of the given format --------------------------------------------------*/ + // clear to 0 by default + memset(m_alloc, 0, m_allocbytes); -bitmap_t *bitmap_alloc(int width, int height, bitmap_format format) -{ - return bitmap_alloc_slop(width, height, 0, 0, format); + // compute the base + compute_base(xslop, yslop); } -/*------------------------------------------------- - bitmap_alloc_slop -- allocate a new bitmap with - additional slop on the borders --------------------------------------------------*/ +//------------------------------------------------- +// resize -- resize a bitmap, reusing existing +// memory if the new size is smaller than the +// current size +//------------------------------------------------- -bitmap_t *bitmap_alloc_slop(int width, int height, int xslop, int yslop, bitmap_format format) +void bitmap_t::resize(int width, int height, int xslop, int yslop) { - int bpp = bitmap_format_to_bpp(format); - size_t allocbytes; - bitmap_t *bitmap; - int rowpixels; + assert(m_format != BITMAP_FORMAT_INVALID); + assert(m_bpp == 8 || m_bpp == 16 || m_bpp == 32 || m_bpp == 64); - /* fail if invalid format */ - if (bpp == 0) - return NULL; + // handle empty requests cleanly + if (width <= 0 || height <= 0) + width = height = 0; - /* allocate the bitmap itself */ - bitmap = (bitmap_t *)malloc(sizeof(*bitmap)); - if (bitmap == NULL) - return NULL; - memset(bitmap, 0, sizeof(*bitmap)); + // determine how much memory we need for the new bitmap + int new_rowpixels = compute_rowpixels(width, xslop); + UINT32 new_allocbytes = new_rowpixels * (height + 2 * yslop) * m_bpp / 8; + new_allocbytes += BITMAP_OVERALL_ALIGN - 1; - /* round the width to a multiple of 8 and add some padding */ - rowpixels = (width + 2 * xslop + 7) & ~7; - - /* allocate memory for the bitmap itself */ - allocbytes = rowpixels * (height + 2 * yslop) * bpp / 8; - bitmap->alloc = malloc(allocbytes); - if (bitmap->alloc == NULL) + // if we need more memory, just realloc + if (new_allocbytes > m_allocbytes) { - free(bitmap); - return NULL; + palette_t *palette = m_palette; + allocate(width, height, xslop, yslop); + set_palette(palette); + return; } - /* clear to 0 by default */ - memset(bitmap->alloc, 0, allocbytes); - - /* fill in the data */ - bitmap->format = format; - bitmap->width = width; - bitmap->height = height; - bitmap->bpp = bpp; - bitmap->rowpixels = rowpixels; - bitmap->base = (UINT8 *)bitmap->alloc + (rowpixels * yslop + xslop) * (bpp / 8); - bitmap->cliprect.min_x = 0; - bitmap->cliprect.max_x = width - 1; - bitmap->cliprect.min_y = 0; - bitmap->cliprect.max_y = height - 1; + // otherwise, reconfigure + m_rowpixels = new_rowpixels; + m_width = width; + m_height = height; + m_cliprect.set(0, width - 1, 0, height - 1); - return bitmap; + // re-compute the base + compute_base(xslop, yslop); } -/*------------------------------------------------- - bitmap_wrap -- wrap an existing memory buffer - as a bitmap --------------------------------------------------*/ +//------------------------------------------------- +// reset -- reset to an invalid bitmap, deleting +// all allocated stuff +//------------------------------------------------- -bitmap_t *bitmap_wrap(void *base, int width, int height, int rowpixels, bitmap_format format) +void bitmap_t::reset() { - int bpp = bitmap_format_to_bpp(format); - bitmap_t *bitmap; + // delete any existing stuff + set_palette(NULL); + delete[] m_alloc; + m_alloc = NULL; + m_base = NULL; - /* fail if invalid format */ - if (bpp == 0) - return NULL; - - /* allocate memory */ - bitmap = (bitmap_t *)malloc(sizeof(*bitmap)); - if (bitmap == NULL) - return NULL; - memset(bitmap, 0, sizeof(*bitmap)); - - /* fill in the data */ - bitmap->format = format; - bitmap->width = width; - bitmap->height = height; - bitmap->bpp = bpp; - bitmap->rowpixels = rowpixels; - bitmap->base = base; - bitmap->cliprect.min_x = 0; - bitmap->cliprect.max_x = width - 1; - bitmap->cliprect.min_y = 0; - bitmap->cliprect.max_y = height - 1; - - return bitmap; + // reset all fields + m_rowpixels = 0; + m_width = 0; + m_height = 0; + m_cliprect.set(0, -1, 0, -1); } -/*------------------------------------------------- - bitmap_free -- release memory allocated for - a bitmap --------------------------------------------------*/ +//------------------------------------------------- +// wrap -- wrap an array of memory; the target +// bitmap does not own the memory +//------------------------------------------------- -void bitmap_free(bitmap_t *bitmap) +void bitmap_t::wrap(void *base, int width, int height, int rowpixels) { - /* dereference the palette */ - if (bitmap->palette != NULL) - palette_deref(bitmap->palette); + // delete any existing stuff + reset(); - /* free any allocated memory */ - if (bitmap->alloc != NULL) - free(bitmap->alloc); - - /* free the bitmap */ - free(bitmap); + // initialize relevant fields + m_base = base; + m_rowpixels = rowpixels; + m_width = width; + m_height = height; + m_cliprect.set(0, m_width - 1, 0, m_height - 1); } -#endif - -/*------------------------------------------------- - bitmap_clone_existing -- clone an existing - bitmap by copying its fields; the target - bitmap does not own the memory --------------------------------------------------*/ +//------------------------------------------------- +// wrap -- wrap a subrectangle of an existing +// bitmap by copying its fields; the target +// bitmap does not own the memory +//------------------------------------------------- -void bitmap_clone_existing(bitmap_t *bitmap, const bitmap_t *srcbitmap) +void bitmap_t::wrap(bitmap_t &source, const rectangle &subrect) { - if (bitmap->alloc != NULL) - free(bitmap->alloc); - bitmap->alloc = NULL; + assert(m_format == source.m_format); + assert(m_bpp == source.m_bpp); + assert(source.cliprect().contains(subrect)); + + // delete any existing stuff + reset(); - bitmap->base = srcbitmap->base; - bitmap->rowpixels = srcbitmap->rowpixels; - bitmap->width = srcbitmap->width; - bitmap->height = srcbitmap->height; - bitmap->format = srcbitmap->format; - bitmap->bpp = srcbitmap->bpp; - bitmap->palette = srcbitmap->palette; - bitmap->cliprect = srcbitmap->cliprect; + // copy relevant fields + m_base = source.raw_pixptr(subrect.min_y, subrect.min_x); + m_rowpixels = source.m_rowpixels; + m_width = subrect.width(); + m_height = subrect.height(); + set_palette(source.m_palette); + m_cliprect.set(0, m_width - 1, 0, m_height - 1); } -/*------------------------------------------------- - bitmap_set_palette -- associate a palette with - a bitmap --------------------------------------------------*/ +//------------------------------------------------- +// set_palette -- associate a palette with a +// bitmap +//------------------------------------------------- -void bitmap_set_palette(bitmap_t *bitmap, palette_t *palette) +void bitmap_t::set_palette(palette_t *palette) { - /* first dereference any existing palette */ - if (bitmap->palette != NULL) + // first dereference any existing palette + if (m_palette != NULL) { - palette_deref(bitmap->palette); - bitmap->palette = NULL; + palette_deref(m_palette); + m_palette = NULL; } - /* then reference any new palette */ + // then reference any new palette if (palette != NULL) { palette_ref(palette); - bitmap->palette = palette; + m_palette = palette; } } - -/*************************************************************************** - BITMAP DRAWING -***************************************************************************/ - -/*------------------------------------------------- - bitmap_fill -- fill a bitmap with a solid - color --------------------------------------------------*/ - -void bitmap_fill(bitmap_t *dest, const rectangle *cliprect, UINT32 color) -{ - rectangle fill = dest->cliprect; - int x, y; - - /* if we have a cliprect, intersect with that */ - if (cliprect != NULL) - sect_rect(&fill, cliprect); - - /* early out if nothing to do */ - if (fill.min_x > fill.max_x || fill.min_y > fill.max_y) +//------------------------------------------------- +// fill -- fill a bitmap with a solid color +//------------------------------------------------- + +void bitmap_t::fill(UINT32 color, const rectangle &cliprect) +{ + // if we have a cliprect, intersect with that + rectangle fill = cliprect; + fill &= m_cliprect; + if (fill.empty()) return; - /* based on the bpp go from there */ - switch (dest->bpp) + // based on the bpp go from there + switch (m_bpp) { case 8: - /* 8bpp always uses memset */ - for (y = fill.min_y; y <= fill.max_y; y++) - memset(BITMAP_ADDR8(dest, y, fill.min_x), (UINT8)color, fill.max_x + 1 - fill.min_x); + // 8bpp always uses memset + for (INT32 y = fill.min_y; y <= fill.max_y; y++) + memset(raw_pixptr(y, fill.min_x), (UINT8)color, fill.width()); break; case 16: - /* 16bpp can use memset if the bytes are equal */ + // 16bpp can use memset if the bytes are equal if ((UINT8)(color >> 8) == (UINT8)color) { - for (y = fill.min_y; y <= fill.max_y; y++) - memset(BITMAP_ADDR16(dest, y, fill.min_x), (UINT8)color, (fill.max_x + 1 - fill.min_x) * 2); + for (INT32 y = fill.min_y; y <= fill.max_y; y++) + memset(raw_pixptr(y, fill.min_x), (UINT8)color, fill.width() * 2); } else { - UINT16 *destrow, *destrow0; - - /* Fill the first line the hard way */ - destrow = BITMAP_ADDR16(dest, fill.min_y, 0); - for (x = fill.min_x; x <= fill.max_x; x++) + // Fill the first line the hard way + UINT16 *destrow = &pixt(fill.min_y); + for (INT32 x = fill.min_x; x <= fill.max_x; x++) destrow[x] = (UINT16)color; - /* For the other lines, just copy the first one */ - destrow0 = BITMAP_ADDR16(dest, fill.min_y, fill.min_x); - for (y = fill.min_y + 1; y <= fill.max_y; y++) + // For the other lines, just copy the first one + void *destrow0 = &pixt(fill.min_y, fill.min_x); + for (INT32 y = fill.min_y + 1; y <= fill.max_y; y++) { - destrow = BITMAP_ADDR16(dest, y, fill.min_x); - memcpy(destrow, destrow0, (fill.max_x + 1 - fill.min_x) * 2); + destrow = &pixt(y, fill.min_x); + memcpy(destrow, destrow0, fill.width() * 2); } } break; case 32: - /* 32bpp can use memset if the bytes are equal */ + // 32bpp can use memset if the bytes are equal if ((UINT8)(color >> 8) == (UINT8)color && (UINT16)(color >> 16) == (UINT16)color) { - for (y = fill.min_y; y <= fill.max_y; y++) - memset(BITMAP_ADDR32(dest, y, fill.min_x), (UINT8)color, (fill.max_x + 1 - fill.min_x) * 4); + for (INT32 y = fill.min_y; y <= fill.max_y; y++) + memset(&pixt(y, fill.min_x), (UINT8)color, fill.width() * 4); } else { - UINT32 *destrow, *destrow0; - - /* Fill the first line the hard way */ - destrow = BITMAP_ADDR32(dest, fill.min_y, 0); - for (x = fill.min_x; x <= fill.max_x; x++) + // Fill the first line the hard way + UINT32 *destrow = &pixt(fill.min_y); + for (INT32 x = fill.min_x; x <= fill.max_x; x++) destrow[x] = (UINT32)color; - /* For the other lines, just copy the first one */ - destrow0 = BITMAP_ADDR32(dest, fill.min_y, fill.min_x); - for (y = fill.min_y + 1; y <= fill.max_y; y++) + // For the other lines, just copy the first one + UINT32 *destrow0 = &pixt(fill.min_y, fill.min_x); + for (INT32 y = fill.min_y + 1; y <= fill.max_y; y++) { - destrow = BITMAP_ADDR32(dest, y, fill.min_x); - memcpy(destrow, destrow0, (fill.max_x + 1 - fill.min_x) * 4); + destrow = &pixt(y, fill.min_x); + memcpy(destrow, destrow0, fill.width() * 4); } } break; case 64: - /* 64bpp can use memset if the bytes are equal */ + // 64bpp can use memset if the bytes are equal if ((UINT8)(color >> 8) == (UINT8)color && (UINT16)(color >> 16) == (UINT16)color) { - for (y = fill.min_y; y <= fill.max_y; y++) - memset(BITMAP_ADDR64(dest, y, fill.min_x), (UINT8)color, (fill.max_x + 1 - fill.min_x) * 4); + for (INT32 y = fill.min_y; y <= fill.max_y; y++) + memset(&pixt(y, fill.min_x), (UINT8)color, fill.width() * 8); } else { - UINT64 *destrow, *destrow0; - - /* Fill the first line the hard way */ - destrow = BITMAP_ADDR64(dest, fill.min_y, 0); - for (x = fill.min_x; x <= fill.max_x; x++) + // Fill the first line the hard way + UINT64 *destrow = &pixt(fill.min_y); + for (INT32 x = fill.min_x; x <= fill.max_x; x++) destrow[x] = (UINT64)color; - /* For the other lines, just copy the first one */ - destrow0 = BITMAP_ADDR64(dest, fill.min_y, fill.min_x); - for (y = fill.min_y + 1; y <= fill.max_y; y++) + // For the other lines, just copy the first one + UINT64 *destrow0 = &pixt(fill.min_y, fill.min_x); + for (INT32 y = fill.min_y + 1; y <= fill.max_y; y++) { - destrow = BITMAP_ADDR64(dest, y, fill.min_x); - memcpy(destrow, destrow0, (fill.max_x + 1 - fill.min_x) * 4); + destrow = &pixt(y, fill.min_x); + memcpy(destrow, destrow0, fill.width() * 8); } } break; } } - - - -/*************************************************************************** - BITMAP UTILITIES -***************************************************************************/ - -/*------------------------------------------------- - bitmap_format_to_bpp - given a format, return - the bpp --------------------------------------------------*/ - -int bitmap_format_to_bpp(bitmap_format format) -{ - /* choose a depth for the format */ - switch (format) - { - case BITMAP_FORMAT_INDEXED8: - return 8; - - case BITMAP_FORMAT_INDEXED16: - case BITMAP_FORMAT_RGB15: - case BITMAP_FORMAT_YUY16: - return 16; - - case BITMAP_FORMAT_INDEXED32: - case BITMAP_FORMAT_RGB32: - case BITMAP_FORMAT_ARGB32: - return 32; - - case BITMAP_FORMAT_INDEXED64: - return 64; - - default: - break; - } - return 0; -} diff -Nru mame-0.144/src/lib/util/bitmap.h mame-0.145/src/lib/util/bitmap.h --- mame-0.144/src/lib/util/bitmap.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/bitmap.h 2012-02-06 21:30:29.000000000 +0000 @@ -44,184 +44,378 @@ #include "osdcore.h" #include "palette.h" +#include -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* bitmap_format describes the various bitmap formats we use */ -enum _bitmap_format -{ - BITMAP_FORMAT_INVALID = 0, /* invalid format */ - BITMAP_FORMAT_INDEXED8, /* 8bpp indexed */ - BITMAP_FORMAT_INDEXED16, /* 16bpp indexed */ - BITMAP_FORMAT_INDEXED32, /* 32bpp indexed */ - BITMAP_FORMAT_INDEXED64, /* 64bpp indexed */ - BITMAP_FORMAT_RGB15, /* 15bpp 5-5-5 RGB */ - BITMAP_FORMAT_RGB32, /* 32bpp 8-8-8 RGB */ - BITMAP_FORMAT_ARGB32, /* 32bpp 8-8-8-8 ARGB */ - BITMAP_FORMAT_YUY16, /* 16bpp 8-8 Y/Cb, Y/Cr in sequence */ - BITMAP_FORMAT_LAST -}; -typedef enum _bitmap_format bitmap_format; - +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** -/* rectangles describe a bitmap portion */ -typedef struct _rectangle rectangle; -struct _rectangle +// bitmap_format describes the various bitmap formats we use +enum bitmap_format { - int min_x; /* minimum X, or left coordinate */ - int max_x; /* maximum X, or right coordinate (inclusive) */ - int min_y; /* minimum Y, or top coordinate */ - int max_y; /* maximum Y, or bottom coordinate (inclusive) */ + BITMAP_FORMAT_INVALID = 0, // invalid forma + BITMAP_FORMAT_IND8, // 8bpp indexed + BITMAP_FORMAT_IND16, // 16bpp indexed + BITMAP_FORMAT_IND32, // 32bpp indexed + BITMAP_FORMAT_IND64, // 64bpp indexed + BITMAP_FORMAT_RGB32, // 32bpp 8-8-8 RGB + BITMAP_FORMAT_ARGB32, // 32bpp 8-8-8-8 ARGB + BITMAP_FORMAT_YUY16, // 16bpp 8-8 Y/Cb, Y/Cr in sequence + BITMAP_FORMAT_LAST }; -/* bitmaps describe a rectangular array of pixels */ -typedef struct _bitmap_base bitmap_base; -struct _bitmap_base +// ======================> rectangle + +// rectangles describe a bitmap portion +class rectangle { - void * alloc; /* pointer to allocated pixel memory */ - void * base; /* pointer to pixel (0,0) (adjusted for padding) */ - int rowpixels; /* pixels per row (including padding) */ - int width; /* width of the bitmap */ - int height; /* height of the bitmap */ - bitmap_format format; /* format of the bitmap */ - int bpp; /* bits per pixel */ - palette_t * palette; /* optional palette */ - rectangle cliprect; /* a clipping rectangle covering the full bitmap */ +public: + // construction/destruction + rectangle() { } + rectangle(INT32 minx, INT32 maxx, INT32 miny, INT32 maxy) + : min_x(minx), max_x(maxx), min_y(miny), max_y(maxy) { } + + // compute intersection with another rect + rectangle &operator&=(const rectangle &src) + { + if (src.min_x > min_x) min_x = src.min_x; + if (src.max_x < max_x) max_x = src.max_x; + if (src.min_y > min_y) min_y = src.min_y; + if (src.max_y < max_y) max_y = src.max_y; + return *this; + } + + // compute union with another rect + rectangle &operator|=(const rectangle &src) + { + if (src.min_x < min_x) min_x = src.min_x; + if (src.max_x > max_x) max_x = src.max_x; + if (src.min_y < min_y) min_y = src.min_y; + if (src.max_y > max_y) max_y = src.max_y; + return *this; + } + + // other helpers + bool empty() const { return (min_x > max_x || min_y > max_y); } + bool contains(INT32 x, INT32 y) const { return (x >= min_x && x <= max_x && y >= min_y && y <= max_y); } + bool contains(const rectangle &rect) const { return (min_x <= rect.min_x && max_x >= rect.max_x && min_y <= rect.min_y && max_y >= rect.max_y); } + INT32 width() const { return max_x + 1 - min_x; } + INT32 height() const { return max_y + 1 - min_y; } + INT32 xcenter() const { return (min_x + max_x + 1) / 2; } + INT32 ycenter() const { return (min_y + max_y + 1) / 2; } + + // setters + void set(INT32 minx, INT32 maxx, INT32 miny, INT32 maxy) { min_x = minx; max_x = maxx; min_y = miny; max_y = maxy; } + void setx(INT32 minx, INT32 maxx) { min_x = minx; max_x = maxx; } + void sety(INT32 miny, INT32 maxy) { min_y = miny; max_y = maxy; } + void set_width(INT32 width) { max_x = min_x + width - 1; } + void set_height(INT32 height) { max_y = min_y + height - 1; } + void set_origin(INT32 x, INT32 y) { max_x += x - min_x; max_y += y - min_y; min_x = x; min_y = y; } + void set_size(INT32 width, INT32 height) { set_width(width); set_height(height); } + + // internal state + INT32 min_x; // minimum X, or left coordinate + INT32 max_x; // maximum X, or right coordinate (inclusive) + INT32 min_y; // minimum Y, or top coordinate + INT32 max_y; // maximum Y, or bottom coordinate (inclusive) }; -#ifdef __cplusplus +// ======================> bitmap_t -/* class for C++ */ -class bitmap_t : public bitmap_base +// bitmaps describe a rectangular array of pixels +class bitmap_t { private: + // prevent implicit copying bitmap_t(const bitmap_t &); bitmap_t &operator=(const bitmap_t &); +protected: + // construction/destruction -- subclasses only to ensure type correctness + bitmap_t(bitmap_format format, int bpp, int width = 0, int height = 0, int xslop = 0, int yslop = 0); + bitmap_t(bitmap_format format, int bpp, void *base, int width, int height, int rowpixels); + bitmap_t(bitmap_format format, int bpp, bitmap_t &source, const rectangle &subrect); + virtual ~bitmap_t(); + public: - bitmap_t(); - bitmap_t(int _width, int _height, bitmap_format _format, int _xslop = 0, int _yslop = 0); - bitmap_t(void *_base, int _width, int _height, int _rowpixels, bitmap_format _format); - ~bitmap_t(); + // allocation/deallocation + void reset(); + + // getters + INT32 width() const { return m_width; } + INT32 height() const { return m_height; } + INT32 rowpixels() const { return m_rowpixels; } + INT32 rowbytes() const { return m_rowpixels * m_bpp / 8; } + UINT8 bpp() const { return m_bpp; } + bitmap_format format() const { return m_format; } + bool valid() const { return (m_base != NULL); } + palette_t *palette() const { return m_palette; } + const rectangle &cliprect() const { return m_cliprect; } + + // allocation/sizing + void allocate(int width, int height, int xslop = 0, int yslop = 0); + void resize(int width, int height, int xslop = 0, int yslop = 0); + + // operations + void set_palette(palette_t *palette); + void fill(rgb_t color) { fill(color, m_cliprect); } + void fill(rgb_t color, const rectangle &cliprect); + void plot_box(int x, int y, int width, int height, UINT32 color) + { + rectangle clip(x, x + width - 1, y, y + height - 1); + fill(color, clip); + } + + // pixel access + template + _PixelType &pixt(INT32 y, INT32 x = 0) const { return *(reinterpret_cast<_PixelType *>(m_base) + y * m_rowpixels + x); } + void *raw_pixptr(INT32 y, INT32 x = 0) const { return reinterpret_cast(m_base) + (y * m_rowpixels + x) * m_bpp / 8; } + +protected: + // for use by subclasses only to ensure type correctness + void wrap(void *base, int width, int height, int rowpixels); + void wrap(bitmap_t &source, const rectangle &subrect); + +private: + // internal helpers + INT32 compute_rowpixels(int width, int xslop); + void compute_base(int xslop, int yslop); + + // internal state + UINT8 * m_alloc; // pointer to allocated pixel memory + UINT32 m_allocbytes; // size of our allocation + void * m_base; // pointer to pixel (0,0) (adjusted for padding) + INT32 m_rowpixels; // pixels per row (including padding) + INT32 m_width; // width of the bitmap + INT32 m_height; // height of the bitmap + bitmap_format m_format; // format of the bitmap + UINT8 m_bpp; // bits per pixel + palette_t * m_palette; // optional palette + rectangle m_cliprect; // a clipping rectangle covering the full bitmap }; -#else -/* direct map for C */ -typedef bitmap_base bitmap_t; +// ======================> bitmap8_t, bitmap16_t, bitmap32_t, bitmap64_t + +// 8bpp bitmaps +class bitmap8_t : public bitmap_t +{ +private: + // private helpers + bool valid_format(bitmap_format format) const { return (format == BITMAP_FORMAT_IND8); } + +protected: + // construction/destruction -- subclasses only + bitmap8_t(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap_t(format, 8, width, height, xslop, yslop) { } + bitmap8_t(bitmap_format format, UINT8 *base, int width, int height, int rowpixels) : bitmap_t(format, 8, base, width, height, rowpixels) { assert(valid_format(format)); } + bitmap8_t(bitmap_format format, bitmap8_t &source, const rectangle &subrect) : bitmap_t(format, 8, source, subrect) { } -#endif +public: + // getters + UINT8 bpp() const { return 8; } + // pixel accessors + typedef UINT8 pixel_t; + pixel_t &pix(INT32 y, INT32 x = 0) const { return pixt(y, x); } + pixel_t &pix8(INT32 y, INT32 x = 0) const { return pixt(y, x); } +}; +// 16bpp bitmaps +class bitmap16_t : public bitmap_t +{ +private: + // private helpers + bool valid_format(bitmap_format format) const { return (format == BITMAP_FORMAT_IND16 || format == BITMAP_FORMAT_YUY16); } -/*************************************************************************** - MACROS -***************************************************************************/ +protected: + // construction/destruction -- subclasses only + bitmap16_t(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap_t(format, 16, width, height, xslop, yslop) { assert(valid_format(format)); } + bitmap16_t(bitmap_format format, UINT16 *base, int width, int height, int rowpixels) : bitmap_t(format, 16, base, width, height, rowpixels) { assert(valid_format(format)); } + bitmap16_t(bitmap_format format, bitmap16_t &source, const rectangle &subrect) : bitmap_t(format, 16, source, subrect) { } -/* Macros for accessing bitmap pixels */ -#define BITMAP_ADDR(bitmap, type, y, x) \ - ((type *)(bitmap)->base + (y) * (bitmap)->rowpixels + (x)) +public: + // getters + UINT8 bpp() const { return 16; } -#define BITMAP_ADDR8(bitmap, y, x) BITMAP_ADDR(bitmap, UINT8, y, x) -#define BITMAP_ADDR16(bitmap, y, x) BITMAP_ADDR(bitmap, UINT16, y, x) -#define BITMAP_ADDR32(bitmap, y, x) BITMAP_ADDR(bitmap, UINT32, y, x) -#define BITMAP_ADDR64(bitmap, y, x) BITMAP_ADDR(bitmap, UINT64, y, x) + // pixel accessors + typedef UINT16 pixel_t; + pixel_t &pix(INT32 y, INT32 x = 0) const { return pixt(y, x); } + pixel_t &pix16(INT32 y, INT32 x = 0) const { return pixt(y, x); } +}; +// 32bpp bitmaps +class bitmap32_t : public bitmap_t +{ +private: + // private helpers + bool valid_format(bitmap_format format) const { return (format == BITMAP_FORMAT_IND32 || format == BITMAP_FORMAT_RGB32 || format == BITMAP_FORMAT_ARGB32); } +protected: + // construction/destruction -- subclasses only + bitmap32_t(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap_t(format, 32, width, height, xslop, yslop) { assert(valid_format(format)); } + bitmap32_t(bitmap_format format, UINT32 *base, int width, int height, int rowpixels) : bitmap_t(format, 32, base, width, height, rowpixels) { assert(valid_format(format)); } + bitmap32_t(bitmap_format format, bitmap32_t &source, const rectangle &subrect) : bitmap_t(format, 32, source, subrect) { } -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +public: + // getters + UINT8 bpp() const { return 32; } + // pixel accessors + typedef UINT32 pixel_t; + pixel_t &pix(INT32 y, INT32 x = 0) const { return pixt(y, x); } + pixel_t &pix32(INT32 y, INT32 x = 0) const { return pixt(y, x); } +}; -/* ----- bitmap allocation ----- */ +// 64bpp bitmaps +class bitmap64_t : public bitmap_t +{ +private: + // private helpers + bool valid_format(bitmap_format format) const { return (format == BITMAP_FORMAT_IND64); } -/* allocate a new bitmap of the given dimensions and format */ -bitmap_t *bitmap_alloc(int width, int height, bitmap_format format); +protected: + // construction/destruction -- subclasses only + bitmap64_t(bitmap_format format, int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap_t(format, 64, width, height, xslop, yslop) { assert(valid_format(format)); } + bitmap64_t(bitmap_format format, UINT64 *base, int width, int height, int rowpixels) : bitmap_t(format, 64, base, width, height, rowpixels) { assert(valid_format(format)); } + bitmap64_t(bitmap_format format, bitmap64_t &source, const rectangle &subrect) : bitmap_t(format, 64, source, subrect) { } -/* allocate a new bitmap with additional slop on the borders */ -bitmap_t *bitmap_alloc_slop(int width, int height, int xslop, int yslop, bitmap_format format); +public: + // getters + UINT8 bpp() const { return 64; } -/* wrap a bitmap object around an existing array of data */ -bitmap_t *bitmap_wrap(void *base, int width, int height, int rowpixels, bitmap_format format); + // pixel accessors + typedef UINT64 pixel_t; + pixel_t &pix(INT32 y, INT32 x = 0) const { return pixt(y, x); } + pixel_t &pix64(INT32 y, INT32 x = 0) const { return pixt(y, x); } +}; -/* associate a palette with a bitmap */ -void bitmap_set_palette(bitmap_t *bitmap, palette_t *palette); -/* free allocated data for a bitmap */ -void bitmap_free(bitmap_t *bitmap); +// ======================> bitmap_ind8, bitmap_ind16, bitmap_ind32, bitmap_ind64 -/* clone an existing bitmap by copying its fields; the target bitmap does not own the memory */ -void bitmap_clone_existing(bitmap_t *bitmap, const bitmap_t *srcbitmap); +// BITMAP_FORMAT_IND8 bitmaps +class bitmap_ind8 : public bitmap8_t +{ + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_IND8; +public: + // construction/destruction + bitmap_ind8(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap8_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_ind8(UINT8 *base, int width, int height, int rowpixels) : bitmap8_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_ind8(bitmap_ind8 &source, const rectangle &subrect) : bitmap8_t(k_bitmap_format, source, subrect) { } + void wrap(UINT8 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_ind8 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } + // getters + bitmap_format format() const { return k_bitmap_format; } +}; -/* ----- bitmap drawing ----- */ +// BITMAP_FORMAT_IND16 bitmaps +class bitmap_ind16 : public bitmap16_t +{ + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_IND16; -/* fill a bitmap with a single color, clipping to the given rectangle */ -void bitmap_fill(bitmap_t *dest, const rectangle *clip, rgb_t color); +public: + // construction/destruction + bitmap_ind16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_ind16(UINT16 *base, int width, int height, int rowpixels) : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_ind16(bitmap_ind16 &source, const rectangle &subrect) : bitmap16_t(k_bitmap_format, source, subrect) { } + void wrap(UINT16 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_ind8 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } + // getters + bitmap_format format() const { return k_bitmap_format; } +}; +// BITMAP_FORMAT_IND32 bitmaps +class bitmap_ind32 : public bitmap32_t +{ + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_IND32; -/* ----- bitmap utilities ----- */ +public: + // construction/destruction + bitmap_ind32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_ind32(UINT32 *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_ind32(bitmap_ind32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { } + void wrap(UINT32 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_ind8 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } -/* return the number of bits per pixel for a given bitmap format */ -int bitmap_format_to_bpp(bitmap_format format); + // getters + bitmap_format format() const { return k_bitmap_format; } +}; +// BITMAP_FORMAT_IND64 bitmaps +class bitmap_ind64 : public bitmap64_t +{ + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_IND64; +public: + // construction/destruction + bitmap_ind64(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap64_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_ind64(UINT64 *base, int width, int height, int rowpixels) : bitmap64_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_ind64(bitmap_ind64 &source, const rectangle &subrect) : bitmap64_t(k_bitmap_format, source, subrect) { } + void wrap(UINT64 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_ind8 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } + // getters + bitmap_format format() const { return k_bitmap_format; } +}; -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ -/*------------------------------------------------- - sect_rect - compute the intersection of two - rectangles --------------------------------------------------*/ +// ======================> bitmap_yuy16, bitmap_rgb32, bitmap_argb32 -INLINE void sect_rect(rectangle *dst, const rectangle *src) +// BITMAP_FORMAT_YUY16 bitmaps +class bitmap_yuy16 : public bitmap16_t { - if (src->min_x > dst->min_x) dst->min_x = src->min_x; - if (src->max_x < dst->max_x) dst->max_x = src->max_x; - if (src->min_y > dst->min_y) dst->min_y = src->min_y; - if (src->max_y < dst->max_y) dst->max_y = src->max_y; -} + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_YUY16; +public: + // construction/destruction + bitmap_yuy16(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap16_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_yuy16(UINT16 *base, int width, int height, int rowpixels) : bitmap16_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_yuy16(bitmap_yuy16 &source, const rectangle &subrect) : bitmap16_t(k_bitmap_format, source, subrect) { } + void wrap(UINT16 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_yuy16 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } -/*------------------------------------------------- - union_rect - compute the union of two - rectangles --------------------------------------------------*/ + // getters + bitmap_format format() const { return k_bitmap_format; } +}; -INLINE void union_rect(rectangle *dst, const rectangle *src) +// BITMAP_FORMAT_RGB32 bitmaps +class bitmap_rgb32 : public bitmap32_t { - if (src->min_x < dst->min_x) dst->min_x = src->min_x; - if (src->max_x > dst->max_x) dst->max_x = src->max_x; - if (src->min_y < dst->min_y) dst->min_y = src->min_y; - if (src->max_y > dst->max_y) dst->max_y = src->max_y; -} + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_RGB32; +public: + // construction/destruction + bitmap_rgb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_rgb32(UINT32 *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_rgb32(bitmap_rgb32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { } + void wrap(UINT32 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_rgb32 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } -/*------------------------------------------------- - plot_box - draw a filled rectangle into a - bitmap of arbitrary depth --------------------------------------------------*/ + // getters + bitmap_format format() const { return k_bitmap_format; } +}; -INLINE void plot_box(bitmap_t *bitmap, int x, int y, int width, int height, UINT32 color) +// BITMAP_FORMAT_ARGB32 bitmaps +class bitmap_argb32 : public bitmap32_t { - rectangle clip; - clip.min_x = x; - clip.min_y = y; - clip.max_x = x + width - 1; - clip.max_y = y + height - 1; - bitmap_fill(bitmap, &clip, color); -} + static const bitmap_format k_bitmap_format = BITMAP_FORMAT_ARGB32; + +public: + // construction/destruction + bitmap_argb32(int width = 0, int height = 0, int xslop = 0, int yslop = 0) : bitmap32_t(k_bitmap_format, width, height, xslop, yslop) { } + bitmap_argb32(UINT32 *base, int width, int height, int rowpixels) : bitmap32_t(k_bitmap_format, base, width, height, rowpixels) { } + bitmap_argb32(bitmap_argb32 &source, const rectangle &subrect) : bitmap32_t(k_bitmap_format, source, subrect) { } + void wrap(UINT32 *base, int width, int height, int rowpixels) { bitmap_t::wrap(base, width, height, rowpixels); } + void wrap(bitmap_argb32 &source, const rectangle &subrect) { bitmap_t::wrap(static_cast(source), subrect); } + + // getters + bitmap_format format() const { return k_bitmap_format; } +}; -#endif /* __BITMAP_H__ */ +#endif // __BITMAP_H__ diff -Nru mame-0.144/src/lib/util/cdrom.c mame-0.145/src/lib/util/cdrom.c --- mame-0.144/src/lib/util/cdrom.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/lib/util/cdrom.c 2012-02-06 21:30:29.000000000 +0000 @@ -829,6 +829,9 @@ track->pgsubsize = 0; cdrom_convert_type_string_to_pregap_info(pgtype, track); cdrom_convert_subtype_string_to_pregap_info(pgsub, track); + + /* set the postgap info */ + track->postgap = postgap; } /* if we got any tracks this way, we're done */ diff -Nru mame-0.144/src/lib/util/cdrom.h mame-0.145/src/lib/util/cdrom.h --- mame-0.144/src/lib/util/cdrom.h 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/lib/util/cdrom.h 2012-02-06 21:30:29.000000000 +0000 @@ -56,7 +56,7 @@ #define CD_MAX_SUBCODE_DATA (96) #define CD_FRAME_SIZE (CD_MAX_SECTOR_DATA + CD_MAX_SUBCODE_DATA) -#define CD_FRAMES_PER_HUNK (4) +#define CD_FRAMES_PER_HUNK (4) // should be 8 for v5 CDs, with a 4-frame pad at the end to maintain SHA1 compatibility #define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6)) diff -Nru mame-0.144/src/lib/util/chd.c mame-0.145/src/lib/util/chd.c --- mame-0.144/src/lib/util/chd.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/chd.c 2012-02-06 21:30:29.000000000 +0000 @@ -41,12 +41,14 @@ #include "avcomp.h" #include "md5.h" #include "sha1.h" +#include "cdrom.h" #include #include #include #include +#include - +#include "../../lib/libflac/include/flac/all.h" /*************************************************************************** @@ -69,13 +71,15 @@ #define MAP_ENTRY_FLAG_TYPE_MASK 0x0f /* what type of hunk */ #define MAP_ENTRY_FLAG_NO_CRC 0x10 /* no CRC is present */ +#define MAP_ENTRY_FLAG_HALF_HUNK 0x20 /* only the first half of this hunk is included in the SHA1 calculation (workaround for CD track padding issue) */ -#define MAP_ENTRY_TYPE_INVALID 0x00 /* invalid type */ -#define MAP_ENTRY_TYPE_COMPRESSED 0x01 /* standard compression */ -#define MAP_ENTRY_TYPE_UNCOMPRESSED 0x02 /* uncompressed data */ -#define MAP_ENTRY_TYPE_MINI 0x03 /* mini: use offset as raw data */ -#define MAP_ENTRY_TYPE_SELF_HUNK 0x04 /* same as another hunk in this file */ -#define MAP_ENTRY_TYPE_PARENT_HUNK 0x05 /* same as a hunk in the parent file */ +#define MAP_ENTRY_TYPE_INVALID 0x00 /* invalid type */ +#define MAP_ENTRY_TYPE_COMPRESSED 0x01 /* standard compression */ +#define MAP_ENTRY_TYPE_UNCOMPRESSED 0x02 /* uncompressed data */ +#define MAP_ENTRY_TYPE_MINI 0x03 /* mini: use offset as raw data */ +#define MAP_ENTRY_TYPE_SELF_HUNK 0x04 /* same as another hunk in this file */ +#define MAP_ENTRY_TYPE_PARENT_HUNK 0x05 /* same as a hunk in the parent file */ +#define MAP_ENTRY_TYPE_2ND_COMPRESSED 0x06 /* compressed with secondary algorithm (usually FLAC CDDA) */ #define CHD_V1_SECTOR_SIZE 512 /* size of a "sector" in the V1 header */ @@ -112,6 +116,10 @@ chd_error (*compress)(chd_file *chd, const void *src, UINT32 *complen); /* compress data */ chd_error (*decompress)(chd_file *chd, UINT32 complen, void *dst); /* decompress data */ chd_error (*config)(chd_file *chd, int param, void *config); /* configure */ + + chd_error (*secondary_compress)(chd_file *chd, const void *src, UINT32 *complen); /* secondary compress data */ + chd_error (*secondary_decompress)(chd_file *chd, UINT32 complen, void *dst); /* secondary decompress data */ + }; @@ -205,8 +213,7 @@ /* codec-private data for the A/V codec */ -typedef struct _av_codec_data av_codec_data; -struct _av_codec_data +struct av_codec_data { avcomp_state * compstate; av_codec_compress_config compress; @@ -249,7 +256,7 @@ /* internal hunk read/write */ static chd_error hunk_read_into_cache(chd_file *chd, UINT32 hunknum); static chd_error hunk_read_into_memory(chd_file *chd, UINT32 hunknum, UINT8 *dest); -static chd_error hunk_write_from_memory(chd_file *chd, UINT32 hunknum, const UINT8 *src); +static chd_error hunk_write_from_memory(chd_file *chd, UINT32 hunknum, const UINT8 *src, int is_half_hunk = 0); /* internal map access */ static chd_error map_write_initial(core_file *file, chd_file *parent, const chd_header *header); @@ -275,6 +282,12 @@ static voidpf zlib_fast_alloc(voidpf opaque, uInt items, uInt size); static void zlib_fast_free(voidpf opaque, voidpf address); +/* flac compression codec */ +static chd_error flac_codec_compress(chd_file *chd, const void *src, UINT32 *length, int swap); +static chd_error flac_codec_compress_normal(chd_file *chd, const void *src, UINT32 *length); +static chd_error flac_codec_decompress(chd_file *chd, UINT32 srclength, void *dest); + + /* A/V compression codec */ static chd_error av_codec_init(chd_file *chd); static void av_codec_free(chd_file *chd); @@ -300,6 +313,8 @@ NULL, NULL, NULL, + NULL, + NULL, NULL }, @@ -312,6 +327,8 @@ zlib_codec_free, zlib_codec_compress, zlib_codec_decompress, + NULL, + NULL, NULL }, @@ -324,6 +341,8 @@ zlib_codec_free, zlib_codec_compress, zlib_codec_decompress, + NULL, + NULL, NULL }, @@ -336,8 +355,24 @@ av_codec_free, av_codec_compress, av_codec_decompress, - av_codec_config - } + av_codec_config, + NULL, + NULL + }, + + /* zlib+ with FLAC compression */ + { + CHDCOMPRESSION_ZLIB_PLUS_WITH_FLAC, + "zlib+ with FLAC", + FALSE, + zlib_codec_init, + zlib_codec_free, + zlib_codec_compress, + zlib_codec_decompress, + NULL, + flac_codec_compress_normal, + flac_codec_decompress, + }, }; @@ -1421,7 +1456,7 @@ that is being compressed -------------------------------------------------*/ -chd_error chd_compress_hunk(chd_file *chd, const void *data, double *curratio) +chd_error chd_compress_hunk(chd_file *chd, const void *data, double *curratio, int is_half_hunk) { UINT32 thishunk = chd->comphunk++; UINT64 sourceoffset = (UINT64)thishunk * (UINT64)chd->header.hunkbytes; @@ -1434,7 +1469,7 @@ return CHDERR_INVALID_STATE; /* write out the hunk */ - err = hunk_write_from_memory(chd, thishunk, (const UINT8 *)data); + err = hunk_write_from_memory(chd, thishunk, (const UINT8 *)data, is_half_hunk); if (err != CHDERR_NONE) return err; @@ -1444,6 +1479,12 @@ /* update the MD5/SHA1 */ bytestochecksum = chd->header.hunkbytes; + + if (is_half_hunk) + { + bytestochecksum = bytestochecksum/2; + } + if (sourceoffset + chd->header.hunkbytes > chd->header.logicalbytes) { if (sourceoffset >= chd->header.logicalbytes) @@ -1552,10 +1593,18 @@ if (err != CHDERR_NONE) return err; + entry = &chd->map[thishunk]; + /* update the MD5/SHA1 */ if (hunkoffset < chd->header.logicalbytes) { UINT64 bytestochecksum = MIN(chd->header.hunkbytes, chd->header.logicalbytes - hunkoffset); + + if (entry->flags & MAP_ENTRY_FLAG_HALF_HUNK) + { + bytestochecksum /= 2; + } + if (bytestochecksum > 0) { MD5Update(&chd->vermd5, chd->cache, bytestochecksum); @@ -1564,7 +1613,6 @@ } /* validate the CRC if we have one */ - entry = &chd->map[thishunk]; if (!(entry->flags & MAP_ENTRY_FLAG_NO_CRC) && entry->crc != crc32(0, chd->cache, chd->header.hunkbytes)) return CHDERR_DECOMPRESSION_ERROR; @@ -1983,6 +2031,22 @@ if (err != CHDERR_NONE) return err; break; + + case MAP_ENTRY_TYPE_2ND_COMPRESSED: + /* read it into the decompression buffer */ + core_fseek(chd->file, entry->offset, SEEK_SET); + bytes = core_fread(chd->file, chd->compressed, entry->length); + if (bytes != entry->length) + return CHDERR_READ_ERROR; + + /* now decompress using the codec */ + err = CHDERR_NONE; + if (chd->codecintf->secondary_decompress != NULL) + err = (*chd->codecintf->secondary_decompress)(chd, entry->length, dest); + if (err != CHDERR_NONE) + return err; + break; + } return CHDERR_NONE; } @@ -1993,7 +2057,8 @@ memory into a CHD -------------------------------------------------*/ -static chd_error hunk_write_from_memory(chd_file *chd, UINT32 hunknum, const UINT8 *src) + +static chd_error hunk_write_from_memory(chd_file *chd, UINT32 hunknum, const UINT8 *src, int is_half_hunk) { map_entry *entry = &chd->map[hunknum]; map_entry newentry; @@ -2001,12 +2066,17 @@ const void *data = src; UINT32 bytes = 0, match; chd_error err; + bool is_likely_cd = false; + int strategy = 0; /* track the max */ if (hunknum > chd->maxhunk) chd->maxhunk = hunknum; /* first compute the CRC of the original data */ + newentry.flags = 0; + newentry.length = 0; + newentry.offset = 0; newentry.crc = 0; if (src != NULL) newentry.crc = crc32(0, &src[0], chd->header.hunkbytes); @@ -2056,10 +2126,83 @@ } } - /* now try compressing the data */ - err = CHDERR_COMPRESSION_ERROR; - if (chd->codecintf->compress != NULL) - err = (*chd->codecintf->compress)(chd, src, &bytes); + if (chd->codecintf->secondary_compress != NULL) + { + if (chd->header.hunkbytes == (CD_MAX_SECTOR_DATA+CD_MAX_SUBCODE_DATA) * CD_FRAMES_PER_HUNK) + is_likely_cd = true; + + if (is_likely_cd) + { + int offset = 0; + for (int frames=0;framesheader.hunkbytes); + UINT32 tempbytes = 0; + chd_error temperror = err; + int tempstrategy = 0; + + /* try strategy 0 - zlib */ + if (chd->codecintf->compress != NULL) + { + err = (*chd->codecintf->compress)(chd, src, &bytes); + + /* store current results and errors */ + memcpy(tempram, chd->compressed, bytes); + tempbytes = bytes; + temperror = err; + tempstrategy = 0; + } + + /* try strategy 1 - flac */ + if (chd->codecintf->secondary_compress != NULL) + { + strategy = 1; + + err = (*chd->codecintf->secondary_compress)(chd, src, &bytes); + + /* check against previous compression attempt if that was successful */ + if (temperror == CHDERR_NONE) + { + /* if the previous compression was better, restore that ... */ + if (bytes>=tempbytes) + { + strategy = tempstrategy; + memcpy(chd->compressed, tempram, tempbytes); + bytes = tempbytes; + err = temperror; + } + } + } + + free(tempram); + } + else + { + /* now try compressing the data */ + err = CHDERR_COMPRESSION_ERROR; + if (chd->codecintf->compress != NULL) + err = (*chd->codecintf->compress)(chd, src, &bytes); + } /* if that worked, and we're lossy, decompress and CRC the result */ if (err == CHDERR_NONE && (chd->codecintf->lossy || src == NULL)) @@ -2074,7 +2217,15 @@ { data = chd->compressed; newentry.length = bytes; - newentry.flags = MAP_ENTRY_TYPE_COMPRESSED; + + if (strategy == 0) + { + newentry.flags = MAP_ENTRY_TYPE_COMPRESSED; + } + else if (strategy == 1) + { + newentry.flags = MAP_ENTRY_TYPE_2ND_COMPRESSED; + } } /* otherwise, mark it uncompressed and use the original data */ @@ -2084,6 +2235,7 @@ newentry.flags = MAP_ENTRY_TYPE_UNCOMPRESSED; } + /* if the data doesn't fit into the previous entry, make a new one at the eof */ newentry.offset = entry->offset; if (newentry.offset == 0 || newentry.length > entry->length) @@ -2097,6 +2249,10 @@ /* update the entry in memory */ write_entry: + + if (is_half_hunk) + newentry.flags |= MAP_ENTRY_FLAG_HALF_HUNK; + *entry = newentry; /* update the map on file */ @@ -2246,6 +2402,7 @@ /* track the maximum offset */ for (j = 0; j < entries; j++) if ((chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == MAP_ENTRY_TYPE_COMPRESSED || + (chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == MAP_ENTRY_TYPE_2ND_COMPRESSED || (chd->map[i + j].flags & MAP_ENTRY_FLAG_TYPE_MASK) == MAP_ENTRY_TYPE_UNCOMPRESSED) maxoffset = MAX(maxoffset, chd->map[i + j].offset + chd->map[i + j].length); } @@ -2385,20 +2542,20 @@ for (curentry = chd->crctable[crc % CRCMAP_HASH_SIZE]; curentry; curentry = curentry->next) { curhunk = curentry->hunknum; - if (chd->map[curhunk].crc == crc && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_NO_CRC) && crcmap_verify_hunk_match(chd, curhunk, rawdata)) + if (chd->map[curhunk].crc == crc && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_NO_CRC) && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_HALF_HUNK) && crcmap_verify_hunk_match(chd, curhunk, rawdata)) return curhunk; } return NO_MATCH; } /* first see if the last match is a valid one */ - if (chd->comparehunk < chd->header.totalhunks && chd->map[chd->comparehunk].crc == crc && !(chd->map[chd->comparehunk].flags & MAP_ENTRY_FLAG_NO_CRC) && + if (chd->comparehunk < chd->header.totalhunks && chd->map[chd->comparehunk].crc == crc && !(chd->map[chd->comparehunk].flags & MAP_ENTRY_FLAG_NO_CRC) && !(chd->map[chd->comparehunk].flags & MAP_ENTRY_FLAG_HALF_HUNK) && memcmp(rawdata, chd->compare, chd->header.hunkbytes) == 0) return chd->comparehunk; /* scan through the CHD's hunk map looking for a match */ for (curhunk = 0; curhunk < lasthunk; curhunk++) - if (chd->map[curhunk].crc == crc && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_NO_CRC) && crcmap_verify_hunk_match(chd, curhunk, rawdata)) + if (chd->map[curhunk].crc == crc && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_NO_CRC) && !(chd->map[curhunk].flags & MAP_ENTRY_FLAG_HALF_HUNK) && crcmap_verify_hunk_match(chd, curhunk, rawdata)) return curhunk; return NO_MATCH; @@ -2865,6 +3022,317 @@ } } +/*------------------------------------------------- + flac_codec_compress - compress data using the + FLAC codec +-------------------------------------------------*/ + + +const int INITIAL_BUFFER_SIZE = 0x20000; +const int INITIAL_GROW_SIZE = 0x20000; + + +struct flac_encoder_data +{ + FLAC__int32* pcm; + FLAC__byte* tempbuffer; + UINT8* flac_outputbuffer; + size_t flac_outputbuffer_size; + FLAC__uint64 flac_output_buffer_curpos; + FLAC__uint64 flac_output_buffer_total; +}; + +static FLAC__StreamEncoderWriteStatus flac_encoder_write_callback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) +{ + if (((flac_encoder_data*)client_data)->flac_output_buffer_curpos + bytes >= ((flac_encoder_data*)client_data)->flac_outputbuffer_size) + { + ((flac_encoder_data*)client_data)->flac_outputbuffer = (UINT8*)realloc(((flac_encoder_data*)client_data)->flac_outputbuffer, ((flac_encoder_data*)client_data)->flac_outputbuffer_size+INITIAL_GROW_SIZE); + ((flac_encoder_data*)client_data)->flac_outputbuffer_size = ((flac_encoder_data*)client_data)->flac_outputbuffer_size+INITIAL_GROW_SIZE; + } + + memcpy(((flac_encoder_data*)client_data)->flac_outputbuffer+((flac_encoder_data*)client_data)->flac_output_buffer_curpos, buffer, bytes); + if (((flac_encoder_data*)client_data)->flac_output_buffer_curpos+bytes > ((flac_encoder_data*)client_data)->flac_output_buffer_total) + ((flac_encoder_data*)client_data)->flac_output_buffer_total=((flac_encoder_data*)client_data)->flac_output_buffer_curpos+bytes; + + ((flac_encoder_data*)client_data)->flac_output_buffer_curpos+=bytes; + + return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; +} + +#define FLAC_HEADER_SIZE (86) + +static chd_error flac_codec_compress(chd_file *chd, const void *src, UINT32 *length, int swap) +{ + int FLAC_ENCODER_READSIZE = (CD_MAX_SECTOR_DATA/4); + int FLAC_ENCODER_FULLSIZE = ((CD_MAX_SECTOR_DATA+CD_MAX_SUBCODE_DATA)/4); + + flac_encoder_data flac_encoder_client; + flac_encoder_data* flac_encoder_client_ptr = &flac_encoder_client; + flac_encoder_client_ptr->flac_outputbuffer = (UINT8*)malloc(INITIAL_BUFFER_SIZE); + flac_encoder_client_ptr->flac_outputbuffer_size = INITIAL_BUFFER_SIZE; + flac_encoder_client_ptr->flac_output_buffer_curpos = 0; + flac_encoder_client_ptr->flac_output_buffer_total = 0; + flac_encoder_client_ptr->pcm=(FLAC__int32*)malloc(FLAC_ENCODER_READSIZE * 2 * 4); + flac_encoder_client_ptr->tempbuffer=(FLAC__byte*)malloc(FLAC_ENCODER_READSIZE * 2 * 2); + + + + FLAC__StreamEncoder *encoder = 0; + FLAC__bool ok = true; + + if((encoder = FLAC__stream_encoder_new()) == NULL) + { + printf("ERROR: allocating encoder\n"); + return CHDERR_COMPRESSION_ERROR; + } + + ok &= FLAC__stream_encoder_set_verify(encoder, false); // we trust libFLAC ;-) + ok &= FLAC__stream_encoder_set_compression_level(encoder, 8); + ok &= FLAC__stream_encoder_set_channels(encoder, 2); + ok &= FLAC__stream_encoder_set_bits_per_sample(encoder, 16); + ok &= FLAC__stream_encoder_set_sample_rate(encoder, 44100); + ok &= FLAC__stream_encoder_set_total_samples_estimate(encoder, 0); + ok &= FLAC__stream_encoder_set_streamable_subset(encoder, false); + ok &= FLAC__stream_encoder_set_blocksize(encoder, ((CD_MAX_SECTOR_DATA)*CD_FRAMES_PER_HUNK)/4 ); // /4 because this is in SAMPLES, not bytes + + if (!ok) + { + printf("error setting up stream encoder\n"); + return CHDERR_COMPRESSION_ERROR; + } + + if (FLAC__stream_encoder_init_stream(encoder, flac_encoder_write_callback, NULL, NULL, NULL, flac_encoder_client_ptr) != FLAC__STREAM_ENCODER_INIT_STATUS_OK) + { + printf("error initializing encoder\n"); + return CHDERR_COMPRESSION_ERROR; + } + + size_t left = (size_t)chd->header.hunkbytes; + UINT8* srcdata = (UINT8*)src; + + while(ok && left) + { + memcpy(flac_encoder_client_ptr->tempbuffer, srcdata, FLAC_ENCODER_READSIZE*4); + srcdata += FLAC_ENCODER_FULLSIZE*4; + { + size_t i; + for(i = 0; i < FLAC_ENCODER_READSIZE*2; i++) + { + if (!swap) flac_encoder_client_ptr->pcm[i] = (FLAC__int32)(((FLAC__int16)(FLAC__int8)flac_encoder_client_ptr->tempbuffer[2*i] << 8) | (FLAC__int16)flac_encoder_client_ptr->tempbuffer[2*i+1]); + else flac_encoder_client_ptr->pcm[i] = (FLAC__int32)(((FLAC__int16)(FLAC__int8)flac_encoder_client_ptr->tempbuffer[2*i+1] << 8) | (FLAC__int16)flac_encoder_client_ptr->tempbuffer[2*i]); + } + + ok = FLAC__stream_encoder_process_interleaved(encoder, flac_encoder_client_ptr->pcm, FLAC_ENCODER_READSIZE); + } + + + left -= (FLAC_ENCODER_FULLSIZE*4); + } + + if (!ok) + { + printf("error encoding!\n"); + return CHDERR_COMPRESSION_ERROR; + } + + ok &= FLAC__stream_encoder_finish(encoder); + + if (!ok) + { + printf("error finishing!\n"); + return CHDERR_COMPRESSION_ERROR; + } + + int totalout = flac_encoder_client_ptr->flac_output_buffer_total-FLAC_HEADER_SIZE; + + + + FLAC__stream_encoder_delete(encoder); + + if (totalout >= chd->header.hunkbytes) + { + free(flac_encoder_client_ptr->flac_outputbuffer); + return CHDERR_COMPRESSION_ERROR; + } + + *length = totalout; + memcpy(chd->compressed, flac_encoder_client_ptr->flac_outputbuffer+FLAC_HEADER_SIZE, flac_encoder_client_ptr->flac_output_buffer_total-FLAC_HEADER_SIZE); + + free(flac_encoder_client_ptr->flac_outputbuffer); + free(flac_encoder_client_ptr->pcm); + free(flac_encoder_client_ptr->tempbuffer); + return CHDERR_NONE; +} + +static chd_error flac_codec_compress_normal(chd_file *chd, const void *src, UINT32 *length) +{ + return flac_codec_compress(chd, src, length, 0); +} + +// this data is always the same for our blocks, so don't store it in the file. +static UINT8 flacHeader[FLAC_HEADER_SIZE] = { + 0x66, 0x4C, 0x61, 0x43, 0x00, 0x00, 0x00, 0x22, 0x12, 0x60, 0x12, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xC4, 0x42, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x28, 0x20, 0x00, + 0x00, 0x00, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x20, + 0x6C, 0x69, 0x62, 0x46, 0x4C, 0x41, 0x43, 0x20, 0x31, 0x2E, 0x32, 0x2E, + 0x31, 0x20, 0x32, 0x30, 0x30, 0x37, 0x30, 0x39, 0x31, 0x37, 0x00, 0x00, + 0x00, 0x00, +}; +/*------------------------------------------------- + flac_codec_decompress - decomrpess data using + the FLAC codec +-------------------------------------------------*/ + + +struct flac_decoder_data +{ + int readoffset; + size_t readbuffersize; + UINT8* readbuffer; + + int writeoffset; + INT16 tempbuffer[(CD_MAX_SECTOR_DATA * CD_FRAMES_PER_HUNK)/2]; + UINT64 amount_to_decode; +}; + +FLAC__StreamDecoderWriteStatus flac_decoder_write_callback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 *const buffer[], void *client_data) +{ + + int blocksize = frame->header.blocksize; + int i = 0; + while (blocksize && ((flac_decoder_data*)client_data)->amount_to_decode) + { + ((flac_decoder_data*)client_data)->tempbuffer[(((flac_decoder_data*)client_data)->writeoffset*2)+0] = buffer[0][i]; + ((flac_decoder_data*)client_data)->tempbuffer[(((flac_decoder_data*)client_data)->writeoffset*2)+1] = buffer[1][i]; + + blocksize--; + i++; + ((flac_decoder_data*)client_data)->amount_to_decode-=4; + ((flac_decoder_data*)client_data)->writeoffset++; + } + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +FLAC__StreamDecoderReadStatus flac_decoder_read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) +{ + size_t readsize = *bytes; + size_t readbuffersize = ((flac_decoder_data*)client_data)->readbuffersize; + + if ((((flac_decoder_data*)client_data)->readoffset + readsize) > readbuffersize) + { + readsize = ((flac_decoder_data*)client_data)->readbuffersize-((flac_decoder_data*)client_data)->readoffset; + } + + if (readsize==0) return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + + memcpy(buffer, ((flac_decoder_data*)client_data)->readbuffer+((flac_decoder_data*)client_data)->readoffset, readsize); + + ((flac_decoder_data*)client_data)->readoffset += readsize; + + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + + + +void flac_decoder_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) +{ + +} + +void flac_decoder_error_callback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) +{ + +} + +static chd_error flac_codec_decompress(chd_file *chd, UINT32 srclength, void *dest) +{ + FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); + flac_decoder_data flac_decoder_client; + flac_decoder_data* flac_decoder_client_ptr = &flac_decoder_client; + + flac_decoder_client_ptr->readoffset = 0; + + flac_decoder_client_ptr->readbuffersize = srclength+FLAC_HEADER_SIZE; + flac_decoder_client_ptr->readbuffer = (UINT8*)malloc(flac_decoder_client_ptr->readbuffersize); + flac_decoder_client_ptr->amount_to_decode = (CD_MAX_SECTOR_DATA*CD_FRAMES_PER_HUNK); + int frames_to_decode = flac_decoder_client_ptr->amount_to_decode / CD_MAX_SECTOR_DATA; + + flac_decoder_client_ptr->writeoffset = 0; + + memcpy(flac_decoder_client_ptr->readbuffer, flacHeader, FLAC_HEADER_SIZE); + memcpy(flac_decoder_client_ptr->readbuffer+FLAC_HEADER_SIZE, chd->compressed, srclength); + + if (!decoder) + { + printf("unable to create FLAC decoder\n"); + return CHDERR_READ_ERROR; + } + + if(FLAC__stream_decoder_init_stream( + decoder, + flac_decoder_read_callback, + NULL, + NULL, + NULL, + NULL, + flac_decoder_write_callback, + flac_decoder_metadata_callback, + flac_decoder_error_callback, + flac_decoder_client_ptr ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) + { + printf("unable to init FLAC decoder\n"); + return CHDERR_READ_ERROR; + } + + if (FLAC__stream_decoder_process_until_end_of_metadata(decoder) != FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM) + { + printf("Fail FLAC__stream_decoder_process_until_end_of_metadata\n"); + return CHDERR_READ_ERROR; + } + + /* only ever a single frame */ + if (FLAC__stream_decoder_process_single(decoder) != FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM) + { + printf("Fail FLAC__stream_decoder_process_until_end_of_metadata\n"); + return CHDERR_READ_ERROR; + } + + + int srcoffset = 0; + UINT8* dest2 = (UINT8*)dest; + for (int frame = 0; frametempbuffer[srcoffset] & 0xff; + dest2[ destoffset + index ] = flac_decoder_client_ptr->tempbuffer[srcoffset] >> 8; + + srcoffset++; + } + } + + + if (FLAC__stream_decoder_finish (decoder) != true) + { + printf("unable to finish FLAC decoder\n"); + return CHDERR_READ_ERROR; + } + + FLAC__stream_decoder_delete(decoder); + free(flac_decoder_client_ptr->readbuffer); + + return CHDERR_NONE; +} + + /*************************************************************************** @@ -2904,12 +3372,11 @@ av_codec_data *data; /* allocate memory for the 2 stream buffers */ - data = (av_codec_data *)malloc(sizeof(*data)); + data = new(std::nothrow) av_codec_data; if (data == NULL) return CHDERR_OUT_OF_MEMORY; /* clear the buffers */ - memset(data, 0, sizeof(*data)); chd->codecdata = data; /* attempt to do a post-init now; if we're creating a new CHD, this won't work */ @@ -2933,7 +3400,7 @@ { if (data->compstate != NULL) avcomp_free(data->compstate); - free(data); + delete data; } } @@ -3025,7 +3492,13 @@ /* if we're getting the compression configuration, apply it now */ if (param == AV_CODEC_COMPRESS_CONFIG) { - data->compress = *(av_codec_compress_config *)config; + av_codec_compress_config *configsrc = reinterpret_cast(config); + data->compress.video.wrap(configsrc->video, configsrc->video.cliprect()); + data->compress.channels = configsrc->channels; + data->compress.samples = configsrc->samples; + memcpy(data->compress.audio, configsrc->audio, sizeof(data->compress.audio)); + data->compress.metalength = configsrc->metalength; + data->compress.metadata = configsrc->metadata; if (data->compstate != NULL) avcomp_config_compress(data->compstate, &data->compress); return CHDERR_NONE; @@ -3034,7 +3507,14 @@ /* if we're getting the decompression configuration, apply it now */ else if (param == AV_CODEC_DECOMPRESS_CONFIG) { - data->decompress = *(av_codec_decompress_config *)config; + av_codec_decompress_config *configsrc = reinterpret_cast(config); + data->decompress.video.wrap(configsrc->video, configsrc->video.cliprect()); + data->decompress.maxsamples = configsrc->maxsamples; + data->decompress.actsamples = configsrc->actsamples; + memcpy(data->decompress.audio, configsrc->audio, sizeof(data->decompress.audio)); + data->decompress.maxmetalength = configsrc->maxmetalength; + data->decompress.actmetalength = configsrc->actmetalength; + data->decompress.metadata = configsrc->metadata; if (data->compstate != NULL) avcomp_config_decompress(data->compstate, &data->decompress); return CHDERR_NONE; diff -Nru mame-0.144/src/lib/util/chdcd.c mame-0.145/src/lib/util/chdcd.c --- mame-0.144/src/lib/util/chdcd.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/lib/util/chdcd.c 2012-02-06 21:30:29.000000000 +0000 @@ -588,7 +588,7 @@ { FILE *infile; int i, trknum; - static char token[128]; + static char token[512]; static char lastfname[256]; UINT32 wavlen, wavoffs; astring path = astring(tocfname); @@ -850,19 +850,26 @@ { FILE *infile; int i, trknum; - static char token[128]; + static char token[512]; + char tocftemp[512]; - if (strstr(tocfname,".gdi")) + strcpy(tocftemp, tocfname); + for (i = 0; i < strlen(tocfname); i++) + { + tocftemp[i] = tolower(tocftemp[i]); + } + + if (strstr(tocftemp,".gdi")) { return chdcd_parse_gdi(tocfname, outtoc, outinfo); } - if (strstr(tocfname,".cue")) + if (strstr(tocftemp,".cue")) { return chdcd_parse_cue(tocfname, outtoc, outinfo); } - if (strstr(tocfname,".nrg")) + if (strstr(tocftemp,".nrg")) { return chdcd_parse_nero(tocfname, outtoc, outinfo); } diff -Nru mame-0.144/src/lib/util/chd.h mame-0.145/src/lib/util/chd.h --- mame-0.144/src/lib/util/chd.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/chd.h 2012-02-06 21:30:29.000000000 +0000 @@ -149,10 +149,11 @@ #define CHDFLAGS_UNDEFINED 0xfffffffc /* compression types */ -#define CHDCOMPRESSION_NONE 0 -#define CHDCOMPRESSION_ZLIB 1 -#define CHDCOMPRESSION_ZLIB_PLUS 2 -#define CHDCOMPRESSION_AV 3 +#define CHDCOMPRESSION_NONE 0 +#define CHDCOMPRESSION_ZLIB 1 +#define CHDCOMPRESSION_ZLIB_PLUS 2 +#define CHDCOMPRESSION_AV 3 +#define CHDCOMPRESSION_ZLIB_PLUS_WITH_FLAC 4 /* A/V codec configuration parameters */ #define AV_CODEC_COMPRESS_CONFIG 1 @@ -358,7 +359,7 @@ chd_error chd_compress_begin(chd_file *chd); /* compress the next hunk of data */ -chd_error chd_compress_hunk(chd_file *chd, const void *data, double *curratio); +chd_error chd_compress_hunk(chd_file *chd, const void *data, double *curratio, int is_half_hunk = 0); /* finish compressing data to a CHD */ chd_error chd_compress_finish(chd_file *chd, int write_protect); diff -Nru mame-0.144/src/lib/util/corefile.c mame-0.145/src/lib/util/corefile.c --- mame-0.144/src/lib/util/corefile.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/lib/util/corefile.c 2012-02-06 21:30:29.000000000 +0000 @@ -883,7 +883,7 @@ assumptions about path separators -------------------------------------------------*/ -astring *core_filename_extract_base(astring *result, const char *name, int strip_extension) +astring &core_filename_extract_base(astring &result, const char *name, bool strip_extension) { /* find the start of the name */ const char *start = name + strlen(name); @@ -891,11 +891,11 @@ start--; /* copy the rest into an astring */ - astring_cpyc(result, start); + result.cpy(start); /* chop the extension if present */ if (strip_extension) - astring_substr(result, 0, astring_rchr(result, 0, '.')); + result.substr(0, result.rchr(0, '.')); return result; } diff -Nru mame-0.144/src/lib/util/corefile.h mame-0.145/src/lib/util/corefile.h --- mame-0.144/src/lib/util/corefile.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/corefile.h 2012-02-06 21:30:29.000000000 +0000 @@ -149,7 +149,7 @@ /* ----- filename utilities ----- */ /* extract the base part of a filename (remove extensions and paths) */ -astring *core_filename_extract_base(astring *result, const char *name, int strip_extension); +astring &core_filename_extract_base(astring &result, const char *name, bool strip_extension = false); /* true if the given filename ends with a particular extension */ int core_filename_ends_with(const char *filename, const char *extension); diff -Nru mame-0.144/src/lib/util/png.c mame-0.145/src/lib/util/png.c --- mame-0.144/src/lib/util/png.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/png.c 2012-02-06 21:30:29.000000000 +0000 @@ -43,6 +43,8 @@ #include #include "png.h" +#include + /*************************************************************************** TYPE DEFINITIONS @@ -604,10 +606,10 @@ /*------------------------------------------------- png_read_bitmap - load a PNG file into a - bitmap_t + bitmap -------------------------------------------------*/ -png_error png_read_bitmap(core_file *fp, bitmap_t **bitmap) +png_error png_read_bitmap(core_file *fp, bitmap_argb32 &bitmap) { png_error result; png_info png; @@ -631,12 +633,7 @@ png_expand_buffer_8bit(&png); /* allocate a bitmap of the appropriate size and copy it */ - *bitmap = bitmap_alloc(png.width, png.height, BITMAP_FORMAT_ARGB32); - if (*bitmap == NULL) - { - png_free(&png); - return PNGERR_OUT_OF_MEMORY; - } + bitmap.allocate(png.width, png.height); /* handle 8bpp palettized case */ src = png.image; @@ -648,7 +645,7 @@ { /* determine alpha and expand to 32bpp */ UINT8 alpha = (*src < png.num_trans) ? png.trans[*src] : 0xff; - *BITMAP_ADDR32(*bitmap, y, x) = (alpha << 24) | (png.palette[*src * 3] << 16) | (png.palette[*src * 3 + 1] << 8) | png.palette[*src * 3 + 2]; + bitmap.pix32(y, x) = (alpha << 24) | (png.palette[*src * 3] << 16) | (png.palette[*src * 3 + 1] << 8) | png.palette[*src * 3 + 2]; } } @@ -657,7 +654,7 @@ { for (y = 0; y < png.height; y++) for (x = 0; x < png.width; x++, src++) - *BITMAP_ADDR32(*bitmap, y, x) = 0xff000000 | (*src << 16) | (*src << 8) | *src; + bitmap.pix32(y, x) = 0xff000000 | (*src << 16) | (*src << 8) | *src; } /* handle 32bpp non-alpha case */ @@ -665,7 +662,7 @@ { for (y = 0; y < png.height; y++) for (x = 0; x < png.width; x++, src += 3) - *BITMAP_ADDR32(*bitmap, y, x) = 0xff000000 | (src[0] << 16) | (src[1] << 8) | src[2]; + bitmap.pix32(y, x) = 0xff000000 | (src[0] << 16) | (src[1] << 8) | src[2]; } /* handle 32bpp alpha case */ @@ -673,7 +670,7 @@ { for (y = 0; y < png.height; y++) for (x = 0; x < png.width; x++, src += 4) - *BITMAP_ADDR32(*bitmap, y, x) = (src[3] << 24) | (src[0] << 16) | (src[1] << 8) | src[2]; + bitmap.pix32(y, x) = (src[3] << 24) | (src[0] << 16) | (src[1] << 8) | src[2]; } /* free our temporary data and return */ @@ -902,14 +899,14 @@ bitmap to a palettized image -------------------------------------------------*/ -static png_error convert_bitmap_to_image_palette(png_info *pnginfo, const bitmap_t *bitmap, int palette_length, const rgb_t *palette) +static png_error convert_bitmap_to_image_palette(png_info *pnginfo, const bitmap_t &bitmap, int palette_length, const rgb_t *palette) { int rowbytes; int x, y; /* set the common info */ - pnginfo->width = bitmap->width; - pnginfo->height = bitmap->height; + pnginfo->width = bitmap.width(); + pnginfo->height = bitmap.height(); pnginfo->bit_depth = 8; pnginfo->color_type = 3; pnginfo->num_palette = 256; @@ -941,7 +938,7 @@ /* copy in the pixels, specifying a NULL filter */ for (y = 0; y < pnginfo->height; y++) { - UINT16 *src = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *src = reinterpret_cast(bitmap.raw_pixptr(y)); UINT8 *dst = pnginfo->image + y * (rowbytes + 1); /* store the filter byte, then copy the data */ @@ -959,15 +956,15 @@ bitmap to an RGB image -------------------------------------------------*/ -static png_error convert_bitmap_to_image_rgb(png_info *pnginfo, const bitmap_t *bitmap, int palette_length, const rgb_t *palette) +static png_error convert_bitmap_to_image_rgb(png_info *pnginfo, const bitmap_t &bitmap, int palette_length, const rgb_t *palette) { - int alpha = (bitmap->format == BITMAP_FORMAT_ARGB32); + int alpha = (bitmap.format() == BITMAP_FORMAT_ARGB32); int rowbytes; int x, y; /* set the common info */ - pnginfo->width = bitmap->width; - pnginfo->height = bitmap->height; + pnginfo->width = bitmap.width(); + pnginfo->height = bitmap.height(); pnginfo->bit_depth = 8; pnginfo->color_type = alpha ? 6 : 2; rowbytes = pnginfo->width * (alpha ? 4 : 3); @@ -980,16 +977,15 @@ /* copy in the pixels, specifying a NULL filter */ for (y = 0; y < pnginfo->height; y++) { - UINT32 *src32 = BITMAP_ADDR32(bitmap, y, 0); - UINT16 *src16 = BITMAP_ADDR16(bitmap, y, 0); UINT8 *dst = pnginfo->image + y * (rowbytes + 1); /* store the filter byte, then copy the data */ *dst++ = 0; /* 16bpp palettized format */ - if (bitmap->format == BITMAP_FORMAT_INDEXED16) + if (bitmap.format() == BITMAP_FORMAT_IND16) { + UINT16 *src16 = reinterpret_cast(bitmap.raw_pixptr(y)); for (x = 0; x < pnginfo->width; x++) { rgb_t color = palette[*src16++]; @@ -999,21 +995,10 @@ } } - /* RGB formats */ - else if (bitmap->format == BITMAP_FORMAT_RGB15) - { - for (x = 0; x < pnginfo->width; x++) - { - UINT16 raw = *src16++; - *dst++ = pal5bit(raw >> 10); - *dst++ = pal5bit(raw >> 5); - *dst++ = pal5bit(raw >> 0); - } - } - /* 32-bit RGB direct */ - else if (bitmap->format == BITMAP_FORMAT_RGB32) + else if (bitmap.format() == BITMAP_FORMAT_RGB32) { + UINT32 *src32 = reinterpret_cast(bitmap.raw_pixptr(y)); for (x = 0; x < pnginfo->width; x++) { UINT32 raw = *src32++; @@ -1024,8 +1009,9 @@ } /* 32-bit ARGB direct */ - else if (bitmap->format == BITMAP_FORMAT_ARGB32) + else if (bitmap.format() == BITMAP_FORMAT_ARGB32) { + UINT32 *src32 = reinterpret_cast(bitmap.raw_pixptr(y)); for (x = 0; x < pnginfo->width; x++) { UINT32 raw = *src32++; @@ -1050,14 +1036,14 @@ chunks to the given file -------------------------------------------------*/ -static png_error write_png_stream(core_file *fp, png_info *pnginfo, const bitmap_t *bitmap, int palette_length, const rgb_t *palette) +static png_error write_png_stream(core_file *fp, png_info *pnginfo, const bitmap_t &bitmap, int palette_length, const rgb_t *palette) { UINT8 tempbuff[16]; png_text *text; png_error error; /* create an unfiltered image in either palette or RGB form */ - if (bitmap->format == BITMAP_FORMAT_INDEXED16 && palette_length <= 256) + if (bitmap.format() == BITMAP_FORMAT_IND16 && palette_length <= 256) error = convert_bitmap_to_image_palette(pnginfo, bitmap, palette_length, palette); else error = convert_bitmap_to_image_rgb(pnginfo, bitmap, palette_length, palette); @@ -1105,8 +1091,7 @@ } - -png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t *bitmap, int palette_length, const UINT32 *palette) +png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const UINT32 *palette) { png_info pnginfo; png_error error; @@ -1141,7 +1126,7 @@ ********************************************************************************/ -png_error mng_capture_start(core_file *fp, bitmap_t *bitmap, double rate) +png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate) { UINT8 mhdr[28]; png_error error; @@ -1150,8 +1135,8 @@ return PNGERR_FILE_ERROR; memset(mhdr, 0, 28); - put_32bit(mhdr + 0, bitmap->width); - put_32bit(mhdr + 4, bitmap->height); + put_32bit(mhdr + 0, bitmap.width()); + put_32bit(mhdr + 4, bitmap.height()); put_32bit(mhdr + 8, rate); put_32bit(mhdr + 24, 0x0041); /* Simplicity profile */ /* frame count and play time unspecified because @@ -1163,7 +1148,7 @@ return PNGERR_NONE; } -png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t *bitmap, int palette_length, const UINT32 *palette) +png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const UINT32 *palette) { return write_png_stream(fp, info, bitmap, palette_length, palette); } diff -Nru mame-0.144/src/lib/util/png.h mame-0.145/src/lib/util/png.h --- mame-0.144/src/lib/util/png.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/png.h 2012-02-06 21:30:29.000000000 +0000 @@ -152,14 +152,14 @@ void png_free(png_info *pnginfo); png_error png_read_file(core_file *fp, png_info *pnginfo); -png_error png_read_bitmap(core_file *fp, bitmap_t **bitmap); +png_error png_read_bitmap(core_file *fp, bitmap_argb32 &bitmap); png_error png_expand_buffer_8bit(png_info *p); png_error png_add_text(png_info *pnginfo, const char *keyword, const char *text); -png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t *bitmap, int palette_length, const UINT32 *palette); +png_error png_write_bitmap(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const UINT32 *palette); -png_error mng_capture_start(core_file *fp, bitmap_t *bitmap, double rate); -png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t *bitmap, int palette_length, const UINT32 *palette); +png_error mng_capture_start(core_file *fp, bitmap_t &bitmap, double rate); +png_error mng_capture_frame(core_file *fp, png_info *info, bitmap_t &bitmap, int palette_length, const UINT32 *palette); png_error mng_capture_stop(core_file *fp); #endif /* __PNG_H__ */ diff -Nru mame-0.144/src/lib/util/tagmap.c mame-0.145/src/lib/util/tagmap.c --- mame-0.144/src/lib/util/tagmap.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/tagmap.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,218 +0,0 @@ -/*************************************************************************** - - tagmap.c - - Simple tag->object mapping functions. - -**************************************************************************** - - 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 "tagmap.h" - -#include - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -static tagmap_error tagmap_add_common(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate, UINT8 unique_hash); - - - -/*************************************************************************** - MAP ALLOCATION AND MANAGEMENT -***************************************************************************/ - -/*------------------------------------------------- - tagmap_alloc - allocate a new tagmap --------------------------------------------------*/ - -tagmap *tagmap_alloc(void) -{ - tagmap *map = (tagmap *)malloc(sizeof(*map)); - if (map != NULL) - memset(map, 0, sizeof(*map)); - return map; -} - - -/*------------------------------------------------- - tagmap_free - free a tagmap, and all - entries within it --------------------------------------------------*/ - -void tagmap_free(tagmap *map) -{ - tagmap_reset(map); - free(map); -} - - -/*------------------------------------------------- - tagmap_reset - reset a tagmap by freeing - all entries --------------------------------------------------*/ - -void tagmap_reset(tagmap *map) -{ - UINT32 hashindex; - - for (hashindex = 0; hashindex < ARRAY_LENGTH(map->table); hashindex++) - { - tagmap_entry *entry, *next; - - for (entry = map->table[hashindex]; entry != NULL; entry = next) - { - next = entry->next; - free(entry); - } - map->table[hashindex] = NULL; - } -} - - - -/*************************************************************************** - MAP ALLOCATION AND MANAGEMENT -***************************************************************************/ - -/*------------------------------------------------- - tagmap_add - add a new object to the - tagmap --------------------------------------------------*/ - -tagmap_error tagmap_add(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate) -{ - return tagmap_add_common(map, tag, object, replace_if_duplicate, FALSE); -} - - -/*------------------------------------------------- - tagmap_add_unique_hash - add a new entry to a - tagmap, ensuring it has a unique hash value --------------------------------------------------*/ - -tagmap_error tagmap_add_unique_hash(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate) -{ - return tagmap_add_common(map, tag, object, replace_if_duplicate, TRUE); -} - - -/*------------------------------------------------- - tagmap_remove - remove an entr from a - tagmap --------------------------------------------------*/ - -void tagmap_remove(tagmap *map, const char *tag) -{ - UINT32 fullhash = tagmap_hash(tag); - tagmap_entry **entryptr; - - for (entryptr = &map->table[fullhash % ARRAY_LENGTH(map->table)]; *entryptr != NULL; entryptr = &(*entryptr)->next) - if ((*entryptr)->fullhash == fullhash && strcmp((*entryptr)->tag, tag) == 0) - { - tagmap_entry *entry = *entryptr; - *entryptr = entry->next; - free(entry); - break; - } -} - - -/*------------------------------------------------- - tagmap_remove_object - remove an entry from a - tagmap by object pointer --------------------------------------------------*/ - -void tagmap_remove_object(tagmap *map, void *object) -{ - UINT32 hashindex; - - for (hashindex = 0; hashindex < ARRAY_LENGTH(map->table); hashindex++) - { - tagmap_entry **entryptr; - - for (entryptr = &map->table[hashindex]; *entryptr != NULL; entryptr = &(*entryptr)->next) - if ((*entryptr)->object == object) - { - tagmap_entry *entry = *entryptr; - *entryptr = entry->next; - free(entry); - return; - } - } -} - - - -/*************************************************************************** - LOCAL FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - tagmap_add_common - core implementation of - a tagmap addition --------------------------------------------------*/ - -static tagmap_error tagmap_add_common(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate, UINT8 unique_hash) -{ - UINT32 fullhash = tagmap_hash(tag); - UINT32 hashindex = fullhash % ARRAY_LENGTH(map->table); - tagmap_entry *entry; - - /* first make sure we don't have a duplicate */ - for (entry = map->table[hashindex]; entry != NULL; entry = entry->next) - if (entry->fullhash == fullhash) - if (unique_hash || strcmp(tag, entry->tag) == 0) - { - if (replace_if_duplicate) - entry->object = object; - return TMERR_DUPLICATE; - } - - /* now allocate a new entry */ - entry = (tagmap_entry *)malloc(sizeof(*entry) + strlen(tag)); - if (entry == NULL) - return TMERR_OUT_OF_MEMORY; - - /* fill in the entry */ - entry->object = object; - entry->fullhash = fullhash; - strcpy(entry->tag, tag); - - /* add it to the head of the list */ - entry->next = map->table[hashindex]; - map->table[hashindex] = entry; - return TMERR_NONE; -} diff -Nru mame-0.144/src/lib/util/tagmap.h mame-0.145/src/lib/util/tagmap.h --- mame-0.144/src/lib/util/tagmap.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/tagmap.h 2012-02-06 21:30:29.000000000 +0000 @@ -43,181 +43,202 @@ #define __TAGMAP_H__ #include "osdcore.h" +#include "astring.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ +//************************************************************************** +// CONSTANTS +//************************************************************************** -#define TAGMAP_HASH_SIZE 97 - - -enum _tagmap_error +enum tagmap_error { TMERR_NONE, - TMERR_OUT_OF_MEMORY, TMERR_DUPLICATE }; -typedef enum _tagmap_error tagmap_error; - - - -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ - -/* an entry in a tagmap */ -typedef struct _tagmap_entry tagmap_entry; -struct _tagmap_entry -{ - tagmap_entry * next; - void * object; - UINT32 fullhash; - char tag[1]; -}; - - -/* base tagmap structure */ -typedef struct _tagmap tagmap; -struct _tagmap -{ - tagmap_entry * table[TAGMAP_HASH_SIZE]; -}; - - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - - -/* ----- map allocation and management ----- */ - -/* allocate a new tagmap */ -tagmap *tagmap_alloc(void); - -/* free a tagmap, and all entries within it */ -void tagmap_free(tagmap *map); - -/* reset a tagmap by freeing all entries */ -void tagmap_reset(tagmap *map); - - - -/* ----- object management ----- */ - -/* add a new entry to a tagmap */ -tagmap_error tagmap_add(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate); - -/* add a new entry to a tagmap, ensuring it has a unique hash value */ -tagmap_error tagmap_add_unique_hash(tagmap *map, const char *tag, void *object, UINT8 replace_if_duplicate); - -/* remove an entry from a tagmap */ -void tagmap_remove(tagmap *map, const char *tag); - -/* remove an entry from a tagmap by object pointer */ -void tagmap_remove_object(tagmap *map, void *object); -/*************************************************************************** - C++ WRAPPERS -***************************************************************************/ - -#ifdef __cplusplus - -/* derived class for C++ */ -template class tagmap_t : public tagmap +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// generally used for small tables, though the hash size can be increased +// as necessary; good primes are: 53, 97, 193, 389, 769, 1543, 3079, 6151, etc +template +class tagmap_t { private: - tagmap_t(const tagmap &); - tagmap_t &operator=(const tagmap &); + // disable copying/assignment + tagmap_t(const tagmap_t &); + tagmap_t &operator=(const tagmap_t &); public: - tagmap_t() { memset(table, 0, sizeof(table)); } - ~tagmap_t() { reset(); } - - void reset() { tagmap_reset(this); } - - tagmap_error add(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return tagmap_add(this, tag, (void *)object, replace_if_duplicate); } - tagmap_error add_unique_hash(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return tagmap_add_unique_hash(this, tag, (void *)object, replace_if_duplicate); } - void remove(const char *tag) { tagmap_remove(this, tag); } - void remove(_ElementType object) { tagmap_remove_object(this, object); } - - _ElementType find(const char *tag) const { return reinterpret_cast<_ElementType>(tagmap_find(this, tag)); } - _ElementType find(const char *tag, UINT32 hash) const { return reinterpret_cast<_ElementType>(tagmap_find_prehashed(this, tag, hash)); } - _ElementType find_hash_only(const char *tag) const { return reinterpret_cast<_ElementType>(tagmap_find_hash_only(this, tag)); } -}; - -#endif - - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - tagmap_hash - compute the hash of a tag --------------------------------------------------*/ - -INLINE UINT32 tagmap_hash(const char *string) -{ - UINT32 hash = *string++; - char c; - - while ((c = *string++) != 0) - hash = ((hash << 5) | (hash >> 27)) + c; + // an entry in the table + class entry_t + { + friend class tagmap_t<_ElementType, _HashSize>; + + public: + // construction/destruction + entry_t(const char *tag, UINT32 fullhash, _ElementType object) + : m_next(NULL), + m_fullhash(fullhash), + m_tag(tag), + m_object(object) { } + + // accessors + const astring &tag() const { return m_tag; } + _ElementType object() const { return m_object; } + + // setters + void set_object(_ElementType object) { m_object = object; } + + private: + // internal helpers + entry_t *next() const { return m_next; } + UINT32 fullhash() const { return m_fullhash; } + + // internal state + entry_t * m_next; + UINT32 m_fullhash; + astring m_tag; + _ElementType m_object; + }; - return hash; -} - - -/*------------------------------------------------- - tagmap_find_prehashed - find an object - associated with a tag, given the tag's - hash --------------------------------------------------*/ - -INLINE void *tagmap_find_prehashed(const tagmap *map, const char *tag, UINT32 fullhash) -{ - tagmap_entry *entry; - - for (entry = map->table[fullhash % ARRAY_LENGTH(map->table)]; entry != NULL; entry = entry->next) - if (entry->fullhash == fullhash && strcmp(entry->tag, tag) == 0) - return entry->object; - return NULL; -} + // construction/destruction + tagmap_t() { memset(m_table, 0, sizeof(m_table)); } + ~tagmap_t() { reset(); } + // core hashing function + UINT32 hash(const char *string) const + { + UINT32 result = *string++; + for (char c = *string++; c != 0; c = *string++) + result = ((result << 5) | (result >> 27)) + c; + return result; + } + + // empty the list + void reset() + { + for (UINT32 hashindex = 0; hashindex < ARRAY_LENGTH(m_table); hashindex++) + while (m_table[hashindex] != NULL) + remove_common(&m_table[hashindex]); + } + + // add/remove + tagmap_error add(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return add_common(tag, object, replace_if_duplicate, false); } + tagmap_error add_unique_hash(const char *tag, _ElementType object, bool replace_if_duplicate = false) { return add_common(tag, object, replace_if_duplicate, true); } + + // remove by tag + void remove(const char *tag) + { + UINT32 fullhash = hash(tag); + for (entry_t **entryptr = &m_table[fullhash % ARRAY_LENGTH(m_table)]; *entryptr != NULL; entryptr = &(*entryptr)->m_next) + if ((*entryptr)->fullhash() == fullhash && (*entryptr)->tag() == tag) + return remove_common(entryptr); + } + + // remove by object + void remove(_ElementType object) + { + for (UINT32 hashindex = 0; hashindex < ARRAY_LENGTH(m_table); hashindex++) + for (entry_t **entryptr = &m_table[hashindex]; *entryptr != NULL; entryptr = &(*entryptr)->m_next) + if ((*entryptr)->object() == object) + return remove_common(entryptr); + } + + // find by tag + _ElementType find(const char *tag) const { return find(tag, hash(tag)); } + + // find by tag with precomputed hash + _ElementType find(const char *tag, UINT32 fullhash) const + { + for (entry_t *entry = m_table[fullhash % ARRAY_LENGTH(m_table)]; entry != NULL; entry = entry->next()) + if (entry->fullhash() == fullhash && entry->tag() == tag) + return entry->object(); + return (_ElementType)NULL; + } + + // find by tag without checking anything but the hash + _ElementType find_hash_only(const char *tag) const + { + UINT32 fullhash = hash(tag); + for (entry_t *entry = m_table[fullhash % ARRAY_LENGTH(m_table)]; entry != NULL; entry = entry->next()) + if (entry->fullhash() == fullhash) + return entry->object(); + return NULL; + } + + // return first object in the table + entry_t *first() const { return next(NULL); } + + // return next object in the table + entry_t *next(entry_t *after) const + { + // if there's another item in this hash bucket, just return it + if (after != NULL && after->next() != NULL) + return after->next(); + + // otherwise scan forward for the next bucket with an entry + UINT32 firstindex = (after != NULL) ? (after->fullhash() % ARRAY_LENGTH(m_table) + 1) : 0; + for (UINT32 hashindex = firstindex; hashindex < ARRAY_LENGTH(m_table); hashindex++) + if (m_table[hashindex] != NULL) + return m_table[hashindex]; + + // all out + return NULL; + } -/*------------------------------------------------- - tagmap_find - find an object associated - with a tag --------------------------------------------------*/ +private: + // internal helpers + tagmap_error add_common(const char *tag, _ElementType object, bool replace_if_duplicate, bool unique_hash); -INLINE void *tagmap_find(const tagmap *map, const char *tag) -{ - return tagmap_find_prehashed(map, tag, tagmap_hash(tag)); -} + // remove an entry given a pointer to its pointer + void remove_common(entry_t **entryptr) + { + entry_t *entry = *entryptr; + *entryptr = entry->next(); + delete entry; + } + // internal state + entry_t * m_table[_HashSize]; +}; -/*------------------------------------------------- - tagmap_find_hash_only - find an object - associated with a tag using only the hash; - this generally works well but may occasionally - return a false positive --------------------------------------------------*/ -INLINE void *tagmap_find_hash_only(const tagmap *map, const char *tag) -{ - UINT32 fullhash = tagmap_hash(tag); - tagmap_entry *entry; - for (entry = map->table[fullhash % ARRAY_LENGTH(map->table)]; entry != NULL; entry = entry->next) - if (entry->fullhash == fullhash) - return entry->object; - return NULL; +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +//------------------------------------------------- +// add_common - core implementation of a tagmap +// addition +//------------------------------------------------- + +template +tagmap_error tagmap_t<_ElementType, _HashSize>::add_common(const char *tag, _ElementType object, bool replace_if_duplicate, bool unique_hash) +{ + UINT32 fullhash = hash(tag); + UINT32 hashindex = fullhash % ARRAY_LENGTH(m_table); + + // first make sure we don't have a duplicate + for (entry_t *entry = m_table[hashindex]; entry != NULL; entry = entry->next()) + if (entry->fullhash() == fullhash) + if (unique_hash || entry->tag() == tag) + { + if (replace_if_duplicate) + entry->set_object(object); + return TMERR_DUPLICATE; + } + + // now allocate a new entry and add to the head of the list + entry_t *entry = new entry_t(tag, fullhash, object); + entry->m_next = m_table[hashindex]; + m_table[hashindex] = entry; + return TMERR_NONE; } diff -Nru mame-0.144/src/lib/util/zippath.c mame-0.145/src/lib/util/zippath.c --- mame-0.144/src/lib/util/zippath.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/zippath.c 2012-02-06 21:30:29.000000000 +0000 @@ -8,6 +8,7 @@ #include #include +#include #include "zippath.h" #include "unzip.h" #include "corestr.h" @@ -18,28 +19,35 @@ TYPE DEFINITIONS ***************************************************************************/ -typedef struct _zippath_returned_directory zippath_returned_directory; -struct _zippath_returned_directory +struct zippath_returned_directory { zippath_returned_directory *next; - char name[1]; + astring name; }; -struct _zippath_directory +class zippath_directory { +public: + zippath_directory() + : returned_parent(false), + directory(NULL), + called_zip_first(false), + zipfile(NULL), + returned_dirlist(NULL) { } + /* common */ - unsigned int returned_parent : 1; + bool returned_parent; osd_directory_entry returned_entry; /* specific to normal directories */ osd_directory *directory; /* specific to ZIP directories */ - unsigned int called_zip_first : 1; + bool called_zip_first; zip_file *zipfile; - astring *zipprefix; + astring zipprefix; zippath_returned_directory *returned_dirlist; }; @@ -99,13 +107,13 @@ zippath_parent - retrieves the parent directory -------------------------------------------------*/ -astring *zippath_parent(astring *dst, const char *path) +astring &zippath_parent(astring &dst, const char *path) { int pos; parse_parent_path(path, &pos, NULL); /* return the result */ - return (pos >= 0) ? astring_cpych(dst, path, pos + 1) : astring_cpyc(dst, ""); + return (pos >= 0) ? dst.cpy(path, pos + 1) : dst.reset(); } @@ -115,12 +123,12 @@ directory basename -------------------------------------------------*/ -astring *zippath_parent_basename(astring *dst, const char *path) +astring &zippath_parent_basename(astring &dst, const char *path) { int beginpos, endpos; parse_parent_path(path, &beginpos, &endpos); - return astring_cpych(dst, path + beginpos + 1, endpos - beginpos); + return dst.cpy(path + beginpos + 1, endpos - beginpos); } @@ -129,31 +137,29 @@ zippath_combine - combines two paths -------------------------------------------------*/ -astring *zippath_combine(astring *dst, const char *path1, const char *path2) +astring &zippath_combine(astring &dst, const char *path1, const char *path2) { - astring *result; - if (!strcmp(path2, ".")) { - result = astring_cpyc(dst, path1); + dst.cpy(path1); } else if (!strcmp(path2, "..")) { - result = zippath_parent(dst, path1); + zippath_parent(dst, path1); } else if (osd_is_absolute_path(path2)) { - result = astring_cpyc(dst, path2); + dst.cpy(path2); } else if ((path1[0] != '\0') && !is_path_separator(path1[strlen(path1) - 1])) { - result = astring_assemble_3(dst, path1, PATH_SEPARATOR, path2); + dst.cpy(path1).cat(PATH_SEPARATOR).cat(path2); } else { - result = astring_assemble_2(dst, path1, path2); + dst.cpy(path1).cat(path2); } - return result; + return dst; } @@ -200,7 +206,7 @@ from a zip file entry -------------------------------------------------*/ -static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, core_file **file) +static file_error create_core_file_from_zip(zip_file *zip, const zip_file_header *header, core_file *&file) { file_error filerr; zip_error ziperr; @@ -220,7 +226,7 @@ goto done; } - filerr = core_fopen_ram_copy(ptr, header->uncompressed_length, OPEN_FLAG_READ, file); + filerr = core_fopen_ram_copy(ptr, header->uncompressed_length, OPEN_FLAG_READ, &file); if (filerr != FILERR_NONE) goto done; @@ -235,36 +241,30 @@ zippath_fopen - opens a zip path file -------------------------------------------------*/ -file_error zippath_fopen(const char *filename, UINT32 openflags, core_file **file, astring *revised_path) +file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&file, astring &revised_path) { file_error filerr = FILERR_NOT_FOUND; zip_error ziperr; zip_file *zip = NULL; const zip_file_header *header; osd_dir_entry_type entry_type; - astring *mainpath; - astring *subpath; - astring *temp; - astring *temp2; char *alloc_fullpath = NULL; int len; /* first, set up the two types of paths */ - mainpath = astring_cpyc(astring_alloc(), filename); - subpath = astring_alloc(); - temp = astring_alloc(); - temp2 = astring_alloc(); - *file = NULL; + astring mainpath(filename); + astring subpath; + file = NULL; /* loop through */ - while((*file == NULL) && (astring_len(mainpath) > 0) - && ((openflags == OPEN_FLAG_READ) || (astring_len(subpath) == 0))) + while((file == NULL) && (mainpath.len() > 0) + && ((openflags == OPEN_FLAG_READ) || (subpath.len() == 0))) { /* is the mainpath a ZIP path? */ - if (is_zip_file(astring_c(mainpath))) + if (is_zip_file(mainpath)) { /* this file might be a zip file - lets take a look */ - ziperr = zip_file_open(astring_c(mainpath), &zip); + ziperr = zip_file_open(mainpath, &zip); if (ziperr == ZIPERR_NONE) { /* it is a zip file - error if we're not opening for reading */ @@ -274,8 +274,8 @@ goto done; } - if (astring_len(subpath) > 0) - header = zippath_find_sub_path(zip, astring_c(subpath), &entry_type); + if (subpath.len() > 0) + header = zippath_find_sub_path(zip, subpath, &entry_type); else header = zip_file_first_file(zip); @@ -291,16 +291,16 @@ goto done; /* update subpath, if appropriate */ - if (astring_len(subpath) == 0) - astring_cpyc(subpath, header->filename); + if (subpath.len() == 0) + subpath.cpy(header->filename); /* we're done */ goto done; } } - if (astring_len(subpath) == 0) - filerr = core_fopen(filename, openflags, file); + if (subpath.len() == 0) + filerr = core_fopen(filename, openflags, &file); else filerr = FILERR_NOT_FOUND; @@ -308,56 +308,45 @@ if (filerr != FILERR_NONE) { /* go up a directory */ - zippath_parent(temp, astring_c(mainpath)); + astring temp; + zippath_parent(temp, mainpath); /* append to the sub path */ - if (astring_len(subpath) > 0) + if (subpath.len() > 0) { - astring_assemble_3(temp2, astring_c(mainpath) + astring_len(temp), PATH_SEPARATOR, astring_c(subpath)); - astring_cpy(subpath, temp2); + astring temp2; + temp2.cpysubstr(mainpath, temp.len()).cat(PATH_SEPARATOR).cat(subpath); + subpath.cpy(temp2); } else - { - astring_cpyc(subpath, astring_c(mainpath) + astring_len(temp)); - } + subpath.cpysubstr(mainpath, temp.len()); /* get the new main path, truncating path separators */ - len = astring_len(temp); - while((len > 0) && is_zip_file_separator(astring_c(temp)[len - 1])) + len = temp.len(); + while (len > 0 && is_zip_file_separator(temp[len - 1])) len--; - astring_cpych(mainpath, astring_c(temp), len); + mainpath.cpysubstr(temp, 0, len); } } done: - /* store the revised path if appropriate */ - if (revised_path != NULL) + /* store the revised path */ + revised_path.reset(); + if (filerr == FILERR_NONE) { - astring_cpyc(revised_path, ""); + /* cannonicalize mainpath */ + filerr = osd_get_full_path(&alloc_fullpath, mainpath); if (filerr == FILERR_NONE) { - /* cannonicalize mainpath */ - filerr = osd_get_full_path(&alloc_fullpath, astring_c(mainpath)); - if (filerr == FILERR_NONE) - { - if (astring_len(subpath) > 0) - astring_assemble_3(revised_path, alloc_fullpath, PATH_SEPARATOR, astring_c(subpath)); - else - astring_cpyc(revised_path, alloc_fullpath); - } + if (subpath.len() > 0) + revised_path.cpy(alloc_fullpath).cat(PATH_SEPARATOR).cat(subpath); + else + revised_path.cpy(alloc_fullpath); } } if (zip != NULL) zip_file_close(zip); - if (mainpath != NULL) - astring_free(mainpath); - if (subpath != NULL) - astring_free(subpath); - if (temp != NULL) - astring_free(temp); - if (temp2 != NULL) - astring_free(temp2); if (alloc_fullpath != NULL) osd_free(alloc_fullpath); return filerr; @@ -526,32 +515,32 @@ true path and ZIP entry components -------------------------------------------------*/ -static file_error zippath_resolve(const char *path, osd_dir_entry_type *entry_type, - zip_file **zipfile, astring *newpath) +static file_error zippath_resolve(const char *path, osd_dir_entry_type &entry_type, zip_file *&zipfile, astring &newpath) { file_error err; osd_directory_entry *current_entry = NULL; osd_dir_entry_type current_entry_type; - astring *apath = astring_cpyc(astring_alloc(), path); - astring *apath_trimmed = astring_alloc(); - astring *parent = NULL; int went_up = FALSE; int i; + newpath.reset(); + /* be conservative */ - *entry_type = ENTTYPE_NONE; - *zipfile = NULL; + entry_type = ENTTYPE_NONE; + zipfile = NULL; + astring apath(path); + astring apath_trimmed; do { /* trim the path of trailing path separators */ - i = astring_len(apath); - while((i > 1) && is_path_separator(astring_c(apath)[i - 1])) + i = apath.len(); + while (i > 1 && is_path_separator(apath[i - 1])) i--; - apath_trimmed = astring_cpysubstr(apath_trimmed, apath, 0, i); + apath_trimmed.cpysubstr(apath, 0, i); /* stat the path */ - current_entry = osd_stat(astring_c(apath_trimmed)); + current_entry = osd_stat(apath_trimmed); /* did we find anything? */ if (current_entry != NULL) @@ -566,12 +555,11 @@ /* if we have not found the file or directory, go up */ current_entry_type = ENTTYPE_NONE; went_up = TRUE; - parent = zippath_parent(astring_alloc(), astring_c(apath)); - astring_free(apath); - apath = parent; + astring parent; + apath.cpy(zippath_parent(parent, apath)); } } - while((current_entry_type == ENTTYPE_NONE) && (apath != NULL) && !is_root(astring_c(apath))); + while (current_entry_type == ENTTYPE_NONE && !is_root(apath)); /* if we did not find anything, then error out */ if (current_entry_type == ENTTYPE_NONE) @@ -581,16 +569,16 @@ } /* is this file a ZIP file? */ - if ((current_entry_type == ENTTYPE_FILE) && is_zip_file(astring_c(apath_trimmed)) - && (zip_file_open(astring_c(apath_trimmed), zipfile) == ZIPERR_NONE)) + if ((current_entry_type == ENTTYPE_FILE) && is_zip_file(apath_trimmed) + && (zip_file_open(apath_trimmed, &zipfile) == ZIPERR_NONE)) { - i = strlen(path + astring_len(apath)); - while((i > 0) && is_zip_path_separator(path[astring_len(apath) + i - 1])) + i = strlen(path + apath.len()); + while (i > 0 && is_zip_path_separator(path[apath.len() + i - 1])) i--; - astring_cpych(newpath, path + astring_len(apath), i); + newpath.cpy(path + apath.len(), i); /* this was a true ZIP path - attempt to identify the type of path */ - zippath_find_sub_path(*zipfile, astring_c(newpath), ¤t_entry_type); + zippath_find_sub_path(zipfile, newpath, ¤t_entry_type); if (current_entry_type == ENTTYPE_NONE) { err = FILERR_NOT_FOUND; @@ -605,18 +593,14 @@ err = FILERR_NOT_FOUND; goto done; } - astring_cpyc(newpath, path); + newpath.cpy(path); } /* success! */ - *entry_type = current_entry_type; + entry_type = current_entry_type; err = FILERR_NONE; done: - if (apath != NULL) - astring_free(apath); - if (apath_trimmed != NULL) - astring_free(apath_trimmed); return err; } @@ -628,21 +612,18 @@ file_error zippath_opendir(const char *path, zippath_directory **directory) { file_error err; - osd_dir_entry_type entry_type; - astring *newpath = astring_alloc(); - zippath_directory *result; /* allocate a directory */ - result = (zippath_directory *) malloc(sizeof(*result)); + zippath_directory *result = new(std::nothrow) zippath_directory; if (result == NULL) { err = FILERR_OUT_OF_MEMORY; goto done; } - memset(result, 0, sizeof(*result)); /* resolve the path */ - err = zippath_resolve(path, &entry_type, &result->zipfile, newpath); + osd_dir_entry_type entry_type; + err = zippath_resolve(path, entry_type, result->zipfile, result->zipprefix); if (err != FILERR_NONE) goto done; @@ -654,12 +635,7 @@ } /* was the result a ZIP? */ - if (result->zipfile != NULL) - { - result->zipprefix = newpath; - newpath = NULL; - } - else + if (result->zipfile == NULL) { /* a conventional directory */ result->directory = osd_opendir(path); @@ -671,20 +647,15 @@ /* is this path the root? if so, pretend we've already returned the parent */ if (is_root(path)) - result->returned_parent = TRUE; + result->returned_parent = true; } done: - if (((directory == NULL) || (err != FILERR_NONE)) && (result != NULL)) + if ((directory == NULL || err != FILERR_NONE) && result != NULL) { zippath_closedir(result); result = NULL; } - if (newpath != NULL) - { - astring_free(newpath); - newpath = NULL; - } if (directory != NULL) *directory = result; return err; @@ -697,25 +668,20 @@ void zippath_closedir(zippath_directory *directory) { - zippath_returned_directory *dirlist; - if (directory->directory != NULL) osd_closedir(directory->directory); if (directory->zipfile != NULL) zip_file_close(directory->zipfile); - if (directory->zipprefix != NULL) - astring_free(directory->zipprefix); - - while(directory->returned_dirlist != NULL) + while (directory->returned_dirlist != NULL) { - dirlist = directory->returned_dirlist; + zippath_returned_directory *dirlist = directory->returned_dirlist; directory->returned_dirlist = directory->returned_dirlist->next; - free(dirlist); + delete dirlist; } - free(directory); + delete directory; } @@ -728,10 +694,10 @@ static const char *get_relative_path(zippath_directory *directory, const zip_file_header *header) { const char *result = NULL; - int len = astring_len(directory->zipprefix); + int len = directory->zipprefix.len(); if ((len <= strlen(header->filename)) - && !strncmp(astring_c(directory->zipprefix), header->filename, len)) + && !strncmp(directory->zipprefix, header->filename, len)) { result = &header->filename[len]; while(is_zip_file_separator(*result)) @@ -758,7 +724,7 @@ if (!directory->returned_parent) { /* first thing's first - return parent directory */ - directory->returned_parent = TRUE; + directory->returned_parent = true; memset(&directory->returned_entry, 0, sizeof(directory->returned_entry)); directory->returned_entry.name = ".."; directory->returned_entry.type = ENTTYPE_DIR; @@ -793,7 +759,7 @@ header = zip_file_first_file(directory->zipfile); else header = zip_file_next_file(directory->zipfile); - directory->called_zip_first = TRUE; + directory->called_zip_first = true; relpath = NULL; } while((header != NULL) && ((relpath = get_relative_path(directory, header)) == NULL)); @@ -817,10 +783,9 @@ if (rdent == NULL) { /* we've found a new directory; add this to returned_dirlist */ - rdent = (zippath_returned_directory *)malloc(sizeof(*rdent) + (separator - relpath)); + rdent = new zippath_returned_directory; rdent->next = directory->returned_dirlist; - memcpy(rdent->name, relpath, (separator - relpath) * sizeof(rdent->name[0])); - rdent->name[separator - relpath] = '\0'; + rdent->name.cpy(relpath, separator - relpath); directory->returned_dirlist = rdent; /* ...and return it */ diff -Nru mame-0.144/src/lib/util/zippath.h mame-0.145/src/lib/util/zippath.h --- mame-0.144/src/lib/util/zippath.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/lib/util/zippath.h 2012-02-06 21:30:29.000000000 +0000 @@ -14,14 +14,13 @@ #include "corefile.h" #include "astring.h" #include "unzip.h" -#include "astring.h" /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef struct _zippath_directory zippath_directory; +class zippath_directory; @@ -32,19 +31,19 @@ /* ----- path operations ----- */ /* retrieves the parent directory */ -astring *zippath_parent(astring *dst, const char *path); +astring &zippath_parent(astring &dst, const char *path); /* retrieves the parent directory basename */ -astring *zippath_parent_basename(astring *dst, const char *path); +astring &zippath_parent_basename(astring &dst, const char *path); /* combines two paths */ -astring *zippath_combine(astring *dst, const char *path1, const char *path2); +astring &zippath_combine(astring &dst, const char *path1, const char *path2); /* ----- file operations ----- */ /* opens a zip path file */ -file_error zippath_fopen(const char *filename, UINT32 openflags, core_file **file, astring *revised_path); +file_error zippath_fopen(const char *filename, UINT32 openflags, core_file *&file, astring &revised_path); /* ----- directory operations ----- */ diff -Nru mame-0.144/src/mame/audio/8080bw.c mame-0.145/src/mame/audio/8080bw.c --- mame-0.144/src/mame/audio/8080bw.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/mame/audio/8080bw.c 2012-02-06 21:30:30.000000000 +0000 @@ -107,15 +107,15 @@ static const char *const lrescue_sample_names[] = { "*lrescue", - "alienexplosion.wav", - "rescueshipexplosion.wav", - "beamgun.wav", - "thrust.wav", - "bonus2.wav", - "bonus3.wav", - "shootingstar.wav", - "stepl.wav", - "steph.wav", + "alienexplosion", + "rescueshipexplosion", + "beamgun", + "thrust", + "bonus2", + "bonus3", + "shootingstar", + "stepl", + "steph", 0 }; diff -Nru mame-0.144/src/mame/audio/astrof.c mame-0.145/src/mame/audio/astrof.c --- mame-0.144/src/mame/audio/astrof.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/astrof.c 2012-02-06 21:30:31.000000000 +0000 @@ -126,17 +126,17 @@ static const char *const astrof_sample_names[] = { "*astrof", - "fire.wav", - "ekilled.wav", - "wave1.wav", - "wave2.wav", - "wave3.wav", - "wave4.wav", - "bossfire.wav", - "fuel.wav", - "death.wav", - "bosshit.wav", - "bosskill.wav", + "fire", + "ekilled", + "wave1", + "wave2", + "wave3", + "wave4", + "bossfire", + "fuel", + "death", + "bosshit", + "bosskill", 0 }; diff -Nru mame-0.144/src/mame/audio/blockade.c mame-0.145/src/mame/audio/blockade.c --- mame-0.144/src/mame/audio/blockade.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/blockade.c 2012-02-06 21:30:30.000000000 +0000 @@ -59,7 +59,7 @@ static const char *const blockade_sample_names[] = { "*blockade", - "boom.wav", + "boom", 0 }; diff -Nru mame-0.144/src/mame/audio/carnival.c mame-0.145/src/mame/audio/carnival.c --- mame-0.144/src/mame/audio/carnival.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/carnival.c 2012-02-06 21:30:30.000000000 +0000 @@ -83,16 +83,16 @@ static const char *const carnival_sample_names[] = { "*carnival", - "bear.wav", - "bonus1.wav", - "bonus2.wav", - "clang.wav", - "duck1.wav", - "duck2.wav", - "duck3.wav", - "pipehit.wav", - "ranking.wav", - "rifle.wav", + "bear", + "bonus1", + "bonus2", + "clang", + "duck1", + "duck2", + "duck3", + "pipehit", + "ranking", + "rifle", 0 }; diff -Nru mame-0.144/src/mame/audio/cinemat.c mame-0.145/src/mame/audio/cinemat.c --- mame-0.144/src/mame/audio/cinemat.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/cinemat.c 2012-02-06 21:30:30.000000000 +0000 @@ -124,14 +124,14 @@ static const char *const spacewar_sample_names[] = { "*spacewar", - "explode1.wav", - "fire1.wav", - "idle.wav", - "thrust1.wav", - "thrust2.wav", - "pop.wav", - "explode2.wav", - "fire2.wav", + "explode1", + "fire1", + "idle", + "thrust1", + "thrust2", + "pop", + "explode2", + "fire2", 0 }; @@ -209,9 +209,9 @@ static const char *const barrier_sample_names[] = { "*barrier", - "playrdie.wav", - "playmove.wav", - "enemmove.wav", + "playrdie", + "playmove", + "enemmove", 0 }; @@ -265,7 +265,7 @@ static const char *const speedfrk_sample_names[] = { "*speedfrk", - "offroad.wav", + "offroad", NULL }; @@ -327,12 +327,12 @@ static const char *const starhawk_sample_names[] = { "*starhawk", - "explode.wav", - "rlaser.wav", - "llaser.wav", - "k.wav", - "master.wav", - "kexit.wav", + "explode", + "rlaser", + "llaser", + "k", + "master", + "kexit", NULL }; @@ -404,12 +404,12 @@ static const char *const sundance_sample_names[] = { "*sundance", - "bong.wav", - "whoosh.wav", - "explsion.wav", - "ping1.wav", - "ping2.wav", - "hatch.wav", + "bong", + "whoosh", + "explsion", + "ping1", + "ping2", + "hatch", 0 }; @@ -475,12 +475,12 @@ static const char *const tailg_sample_names[] = { "*tailg", - "sexplode.wav", - "thrust1.wav", - "slaser.wav", - "shield.wav", - "bounce.wav", - "hypersp.wav", + "sexplode", + "thrust1", + "slaser", + "shield", + "bounce", + "hypersp", NULL }; @@ -566,11 +566,11 @@ static const char *const warrior_sample_names[] = { "*warrior", - "bgmhum1.wav", - "bgmhum2.wav", - "killed.wav", - "fall.wav", - "appear.wav", + "bgmhum1", + "bgmhum2", + "killed", + "fall", + "appear", NULL }; @@ -636,13 +636,13 @@ static const char *const armora_sample_names[] = { "*armora", - "loexp.wav", - "jeepfire.wav", - "hiexp.wav", - "tankfire.wav", - "tankeng.wav", - "beep.wav", - "chopper.wav", + "loexp", + "jeepfire", + "hiexp", + "tankfire", + "tankeng", + "beep", + "chopper", NULL }; @@ -733,19 +733,19 @@ static const char *const ripoff_sample_names[] = { "*ripoff", - "bonuslvl.wav", - "eattack.wav", - "shipfire.wav", - "efire.wav", - "explosn.wav", - "bg1.wav", - "bg2.wav", - "bg3.wav", - "bg4.wav", - "bg5.wav", - "bg6.wav", - "bg7.wav", - "bg8.wav", + "bonuslvl", + "eattack", + "shipfire", + "efire", + "explosn", + "bg1", + "bg2", + "bg3", + "bg4", + "bg5", + "bg6", + "bg7", + "bg8", NULL }; @@ -827,14 +827,14 @@ static const char *const starcas_sample_names[] = { "*starcas", - "cfire.wav", - "shield.wav", - "star.wav", - "thrust.wav", - "drone.wav", - "lexplode.wav", - "sexplode.wav", - "pfire.wav", + "cfire", + "shield", + "star", + "thrust", + "drone", + "lexplode", + "sexplode", + "pfire", 0 }; @@ -942,14 +942,14 @@ static const char *const solarq_sample_names[] = { "*solarq", - "bigexpl.wav", - "smexpl.wav", - "lthrust.wav", - "slaser.wav", - "pickup.wav", - "nuke2.wav", - "nuke1.wav", - "music.wav", + "bigexpl", + "smexpl", + "lthrust", + "slaser", + "pickup", + "nuke2", + "nuke1", + "music", NULL }; @@ -1079,18 +1079,18 @@ static const char *const boxingb_sample_names[] = { "*boxingb", - "softexpl.wav", - "loudexpl.wav", - "chirp.wav", - "eggcrack.wav", - "bugpusha.wav", - "bugpushb.wav", - "bugdie.wav", - "beetle.wav", - "music.wav", - "cannon.wav", - "bounce.wav", - "bell.wav", + "softexpl", + "loudexpl", + "chirp", + "eggcrack", + "bugpusha", + "bugpushb", + "bugdie", + "beetle", + "music", + "cannon", + "bounce", + "bell", NULL }; @@ -1216,14 +1216,14 @@ static const char *const wotw_sample_names[] = { "*wotw", - "cfire.wav", - "shield.wav", - "star.wav", - "thrust.wav", - "drone.wav", - "lexplode.wav", - "sexplode.wav", - "pfire.wav", + "cfire", + "shield", + "star", + "thrust", + "drone", + "lexplode", + "sexplode", + "pfire", 0 }; @@ -1331,14 +1331,14 @@ static const char *const wotwc_sample_names[] = { "*wotwc", - "cfire.wav", - "shield.wav", - "star.wav", - "thrust.wav", - "drone.wav", - "lexplode.wav", - "sexplode.wav", - "pfire.wav", + "cfire", + "shield", + "star", + "thrust", + "drone", + "lexplode", + "sexplode", + "pfire", 0 }; diff -Nru mame-0.144/src/mame/audio/circus.c mame-0.145/src/mame/audio/circus.c --- mame-0.144/src/mame/audio/circus.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/circus.c 2012-02-06 21:30:30.000000000 +0000 @@ -5,9 +5,9 @@ static const char *const circus_sample_names[] = { "*circus", - "pop.wav", - "miss.wav", - "bounce.wav", + "pop", + "miss", + "bounce", 0 }; @@ -20,7 +20,7 @@ static const char *const crash_sample_names[] = { "*crash", - "crash.wav", + "crash", 0 }; @@ -33,10 +33,10 @@ static const char *const ripcord_sample_names[] = { "*ripcord", - "splash.wav", - "scream.wav", - "chute.wav", - "whistle.wav", + "splash", + "scream", + "chute", + "whistle", 0 }; @@ -49,11 +49,11 @@ static const char *const robotbwl_sample_names[] = { "*robotbwl", - "hit.wav", - "roll.wav", - "balldrop.wav", - "demerit.wav", - "reward.wav", + "hit", + "roll", + "balldrop", + "demerit", + "reward", 0 }; diff -Nru mame-0.144/src/mame/audio/depthch.c mame-0.145/src/mame/audio/depthch.c --- mame-0.144/src/mame/audio/depthch.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/depthch.c 2012-02-06 21:30:30.000000000 +0000 @@ -21,10 +21,10 @@ static const char *const depthch_sample_names[] = { "*depthch", - "longex.wav", - "shortex.wav", - "spray.wav", - "sonar.wav", + "longex", + "shortex", + "spray", + "sonar", 0 }; diff -Nru mame-0.144/src/mame/audio/dkong.c mame-0.145/src/mame/audio/dkong.c --- mame-0.144/src/mame/audio/dkong.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/dkong.c 2012-02-06 21:30:30.000000000 +0000 @@ -1192,15 +1192,15 @@ static const char *const radarscp1_sample_names[] = { "*radarscp1", - "10.wav", - "12.wav", - "14.wav", - "16.wav", - "18.wav", - "1A.wav", - "1C.wav", - "1E.wav", - "20.wav", + "10", + "12", + "14", + "16", + "18", + "1A", + "1C", + "1E", + "20", 0 }; diff -Nru mame-0.144/src/mame/audio/dsbz80.c mame-0.145/src/mame/audio/dsbz80.c --- mame-0.144/src/mame/audio/dsbz80.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/audio/dsbz80.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,246 @@ +/*************************************************************************** + + Sega Z80 Digital Sound Board + + used for Model 1/2/3 + +***************************************************************************/ + +#define ADDRESS_MAP_MODERN + +#include "emu.h" +#include "audio/dsbz80.h" + +#define Z80_TAG "mpegcpu" +#define YMZ770_TAG "ymz770" + +static ADDRESS_MAP_START( dsbz80_map, AS_PROGRAM, 8, dsbz80_device ) + AM_RANGE(0x0000, 0x7fff) AM_ROM AM_REGION(":mpegcpu", 0) + AM_RANGE(0x8000, 0xffff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( dsbz80io_map, AS_IO, 8, dsbz80_device ) + AM_RANGE(0xe0, 0xe0) AM_MIRROR(0xff00) AM_WRITE(mpeg_trigger_w) + AM_RANGE(0xe2, 0xe4) AM_MIRROR(0xff00) AM_READWRITE(mpeg_pos_r, mpeg_start_w) + AM_RANGE(0xe5, 0xe7) AM_MIRROR(0xff00) AM_WRITE(mpeg_end_w) + AM_RANGE(0xe8, 0xe8) AM_MIRROR(0xff00) AM_WRITE(mpeg_volume_w) + AM_RANGE(0xe9, 0xe9) AM_MIRROR(0xff00) AM_WRITE(mpeg_stereo_w) + AM_RANGE(0xf0, 0xf0) AM_MIRROR(0xff00) AM_READ(latch_r) + AM_RANGE(0xf1, 0xf1) AM_MIRROR(0xff00) AM_READ(status_r) +ADDRESS_MAP_END + + +MACHINE_CONFIG_FRAGMENT( dsbz80 ) + MCFG_CPU_ADD(Z80_TAG, Z80, 1000000) /* unknown clock, but probably pretty slow considering the z80 does like nothing */ + MCFG_CPU_PROGRAM_MAP(dsbz80_map) + MCFG_CPU_IO_MAP(dsbz80io_map) +#if 0 + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_YMZ770_ADD(YMZ770_TAG, 8000000) /* clock ignored for this */ + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +#endif +MACHINE_CONFIG_END + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type DSBZ80 = &device_creator; + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor dsbz80_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( dsbz80 ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// dsbz80_device - constructor +//------------------------------------------------- + +dsbz80_device::dsbz80_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, DSBZ80, "Sega Z80-based Digital Sound Board", tag, owner, clock), + m_ourcpu(*this, Z80_TAG), + m_ymz770(*this, YMZ770_TAG) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void dsbz80_device::device_start() +{ +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void dsbz80_device::device_reset() +{ + m_dsb_latch = 0; + status = 1; + start = end = 0; +} + +WRITE8_MEMBER(dsbz80_device::latch_w) +{ + device_set_input_line(m_ourcpu, INPUT_LINE_IRQ0, ASSERT_LINE); + m_dsb_latch = data; + status |= 2; +// printf("%02x to DSB latch\n", data); +} + +READ8_MEMBER(dsbz80_device::latch_r) +{ + device_set_input_line(m_ourcpu, INPUT_LINE_IRQ0, CLEAR_LINE); +// printf("DSB Z80 read %02x\n", m_dsb_latch); + status &= ~2; + return m_dsb_latch; +} + +WRITE8_MEMBER(dsbz80_device::mpeg_trigger_w) +{ + mp_state = data; + + if (data == 0) // stop + { +// MPEG_Stop_Playing(); +// printf("MPEG stop\n"); + } + else if (data == 1) // play without loop + { +// MPEG_Set_Loop(NULL, 0); +// MPEG_Play_Memory(ROM + mp_start, mp_end-mp_start); +// printf("MPEG start, one-shot from %x\n", mp_start); + } + else if (data == 2) // play with loop + { +// MPEG_Play_Memory(ROM + mp_start, mp_end-mp_start); +// printf("MPEG start, loop from %x\n", mp_start); + } +} + +READ8_MEMBER(dsbz80_device::mpeg_pos_r) +{ + int mp_prg = 0; //MPEG_Get_Progress(); // returns the byte offset currently playing + + mp_prg += mp_start; + + switch (offset) + { + case 0: + return (mp_prg>>16)&0xff; + break; + case 1: + return (mp_prg>>8)&0xff; + break; + case 2: + return mp_prg&0xff; + break; + } + + return 0; +} + +/* NOTE: writes to the start and end while playback is already in progress + get latched. When the current stream ends, the MPEG hardware starts playing + immediately from the latched start and end position. In this way, the Z80 + enforces looping where appropriate and multi-part songs in other cases + (song #16 is a good example) +*/ + +WRITE8_MEMBER(dsbz80_device::mpeg_start_w) +{ + switch (offset) + { + case 0: + start &= 0x00ffff; + start |= (int)data<<16; + break; + case 1: + start &= 0xff00ff; + start |= (int)data<<8; + break; + case 2: + start &= 0xffff00; + start |= data; + + if (mp_state == 0) + { + mp_start = start; + } + else + { + lp_start = start; + // SWA: if loop end is zero, it means "keep previous end marker" + if (lp_end == 0) + { +// MPEG_Set_Loop(ROM + lp_start, mp_end-lp_start); + } + else + { +// MPEG_Set_Loop(ROM + lp_start, lp_end-lp_start); + } + } + break; + } +} + +WRITE8_MEMBER(dsbz80_device::mpeg_end_w) +{ + switch (offset) + { + case 0: + end &= 0x00ffff; + end |= (int)data<<16; + break; + case 1: + end &= 0xff00ff; + end |= (int)data<<8; + break; + case 2: + end &= 0xffff00; + end |= data; + + if (mp_state == 0) + { + mp_end = end; + } + else + { + lp_end = end; +// MPEG_Set_Loop(ROM + lp_start, lp_end-lp_start); + } + break; + } +} + +WRITE8_MEMBER(dsbz80_device::mpeg_volume_w) +{ + mp_vol = 0x7f - data; +} + +WRITE8_MEMBER(dsbz80_device::mpeg_stereo_w) +{ + mp_pan = data & 3; +} + +READ8_MEMBER(dsbz80_device::status_r) +{ + // bit 0 = ??? (must be 1 for most games) + // bit 1 = command is pending (used by SWA instead of IRQ) + // other bits = ??? + // SWA requires that status & 0x38 = 0 or else it loops endlessly... + return status; +} diff -Nru mame-0.144/src/mame/audio/dsbz80.h mame-0.145/src/mame/audio/dsbz80.h --- mame-0.144/src/mame/audio/dsbz80.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/audio/dsbz80.h 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,57 @@ +#pragma once + +#ifndef __DSBZ80_H__ +#define __DSBZ80_H__ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "sound/ymz770.h" + +#define DSBZ80_TAG "dsbz80" + +#define MCFG_DSBZ80_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, DSBZ80, 0) + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class dsbz80_device : public device_t +{ +public: + // construction/destruction + dsbz80_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const; + + DECLARE_WRITE8_MEMBER(latch_w); + + required_device m_ourcpu; + optional_device m_ymz770; + + DECLARE_WRITE8_MEMBER(mpeg_trigger_w); + DECLARE_WRITE8_MEMBER(mpeg_start_w); + DECLARE_WRITE8_MEMBER(mpeg_end_w); + DECLARE_WRITE8_MEMBER(mpeg_volume_w); + DECLARE_WRITE8_MEMBER(mpeg_stereo_w); + DECLARE_READ8_MEMBER(mpeg_pos_r); + DECLARE_READ8_MEMBER(latch_r); + DECLARE_READ8_MEMBER(status_r); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + UINT8 m_dsb_latch; + UINT32 mp_start, mp_end, mp_vol, mp_pan, mp_state, lp_start, lp_end, start, end; + int status; +}; + + +// device type definition +extern const device_type DSBZ80; + +#endif /* __DSBZ80_H__ */ diff -Nru mame-0.144/src/mame/audio/gorf.c mame-0.145/src/mame/audio/gorf.c --- mame-0.144/src/mame/audio/gorf.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/gorf.c 2012-02-06 21:30:30.000000000 +0000 @@ -79,32 +79,32 @@ const char *const gorf_sample_names[] = { - "*gorf","a.wav","a.wav","again.wav","am.wav","am.wav","and.wav","anhilatn.wav", - "another.wav","another.wav","are.wav","are.wav", - "avenger.wav","bad.wav","bad.wav","be.wav", - "been.wav","but.wav","button.wav","cadet.wav", - "cannot.wav","captain.wav","chronicl.wav","coin.wav","coins.wav","colonel.wav", - "consciou.wav","defender.wav","destroy.wav","destroyd.wav", - "doom.wav","draws.wav","empire.wav","end.wav", - "enemy.wav","escape.wav","flagship.wav","for.wav","galactic.wav", - "general.wav","gorf.wav","gorphian.wav","gorphian.wav","gorphins.wav", - "hahahahu.wav","hahaher.wav","harder.wav","have.wav", - "hitting.wav","i.wav","i.wav","impossib.wav","in.wav","insert.wav", - "is.wav","live.wav","long.wav","meet.wav","move.wav", - "my.wav","my.wav", - "near.wav","next.wav","nice.wav","no.wav", - "now.wav","pause.wav","player.wav","prepare.wav","prisonrs.wav", - "promoted.wav","push.wav","robot.wav","robots.wav","robots.wav", - "seek.wav","ship.wav","shot.wav","some.wav","space.wav","spause.wav", - "survival.wav","take.wav","the.wav","the.wav","the.wav","time.wav", - "to.wav","to.wav","unbeatab.wav", - "warrior.wav","warriors.wav","will.wav", - "you.wav","you.wav","you.wav","you.wav","your.wav","your.wav","yourself.wav", - "s.wav","for.wav","for.wav","will.wav","gorph.wav", + "*gorf","a","a","again","am","am","and","anhilatn", + "another","another","are","are", + "avenger","bad","bad","be", + "been","but","button","cadet", + "cannot","captain","chronicl","coin","coins","colonel", + "consciou","defender","destroy","destroyd", + "doom","draws","empire","end", + "enemy","escape","flagship","for","galactic", + "general","gorf","gorphian","gorphian","gorphins", + "hahahahu","hahaher","harder","have", + "hitting","i","i","impossib","in","insert", + "is","live","long","meet","move", + "my","my", + "near","next","nice","no", + "now","pause","player","prepare","prisonrs", + "promoted","push","robot","robots","robots", + "seek","ship","shot","some","space","spause", + "survival","take","the","the","the","time", + "to","to","unbeatab", + "warrior","warriors","will", + "you","you","you","you","your","your","yourself", + "s","for","for","will","gorph", // Missing Samples - "coin.wav", "attack.wav","bite.wav","conquer.wav","devour.wav","dust.wav", - "galaxy.wav","got.wav","power.wav","try.wav","supreme.wav","all.wav", - "hail.wav","emperor.wav", + "coin", "attack","bite","conquer","devour","dust", + "galaxy","got","power","try","supreme","all", + "hail","emperor", 0 }; diff -Nru mame-0.144/src/mame/audio/gottlieb.c mame-0.145/src/mame/audio/gottlieb.c --- mame-0.144/src/mame/audio/gottlieb.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/mame/audio/gottlieb.c 2012-02-06 21:30:30.000000000 +0000 @@ -514,6 +514,40 @@ space->machine().device("spsnd")->reset(); } +static WRITE8_HANDLER( cobram3_speech_control_w ) +{ + gottlieb_state *state = space->machine().driver_data(); + UINT8 previous = state->m_speech_control; + state->m_speech_control = data; + + /* bit 0 enables/disables the NMI line */ + nmi_state_update(space->machine()); + + /* bit 1 controls a LED on the sound board */ + + if ( data & 0x10 ) + { + state->m_psg_data_latch = *state->m_psg_latch; + } + else + { + device_t *ay = space->machine().device((data & 0x08) ? "ay1" : "ay2"); + ay8910_address_w(ay, 0, *state->m_psg_latch); + ay8910_data_w(ay, 0, state->m_psg_data_latch); + } + /* bit 5 goes to the speech chip DIRECT DATA TEST pin */ + + /* bit 6 = speech chip DATA PRESENT pin; high then low to make the chip read data */ + if ((previous & 0x40) == 0 && (data & 0x40) != 0) + { + device_t *sp = space->machine().device("spsnd"); + sp0250_w(sp, 0, *state->m_sp0250_latch); + } + + /* bit 7 goes to the speech chip RESET pin */ + if ((previous ^ data) & 0x80) + space->machine().device("spsnd")->reset(); +} /************************************* @@ -560,6 +594,18 @@ ADDRESS_MAP_END +static ADDRESS_MAP_START( gottlieb_cobram3_speech2_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM + AM_RANGE(0x2000, 0x2000) AM_MIRROR(0x1fff) AM_WRITEONLY AM_BASE_MEMBER(gottlieb_state, m_sp0250_latch) + AM_RANGE(0x4000, 0x4000) AM_MIRROR(0x1fff) AM_WRITE(cobram3_speech_control_w) + AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x1fff) AM_READ_PORT("SB2") + AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x1fff) AM_WRITEONLY AM_BASE_MEMBER(gottlieb_state, m_psg_latch) + AM_RANGE(0xa000, 0xa000) AM_MIRROR(0x07ff) AM_WRITE(nmi_rate_w) + AM_RANGE(0xa800, 0xa800) AM_MIRROR(0x07ff) AM_READ(speech_data_r) + AM_RANGE(0xb000, 0xb000) AM_MIRROR(0x07ff) AM_WRITE(signal_audio_nmi_w) + AM_RANGE(0xc000, 0xffff) AM_ROM +ADDRESS_MAP_END + static ADDRESS_MAP_START( gottlieb_audio2_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x3c00) AM_RAM AM_RANGE(0x4000, 0x4001) AM_MIRROR(0x3ffe) AM_DEVWRITE("dac1", gottlieb_dac_w) AM_BASE_MEMBER(gottlieb_state, m_dac_data) @@ -602,6 +648,33 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +MACHINE_CONFIG_FRAGMENT( gottlieb_cobram3_soundrev2 ) + /* audio CPUs */ + MCFG_CPU_ADD("audiocpu", M6502, SOUND2_CLOCK/4) + MCFG_DEVICE_DISABLE() + MCFG_CPU_PROGRAM_MAP(gottlieb_audio2_map) + + MCFG_CPU_ADD("speech", M6502, SOUND2_CLOCK/4) + MCFG_CPU_PROGRAM_MAP(gottlieb_cobram3_speech2_map) + + /* sound hardware */ + MCFG_SOUND_START( gottlieb2 ) + + MCFG_SOUND_ADD("dac1", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) + + MCFG_SOUND_ADD("dac2", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) + + MCFG_SOUND_ADD("ay1", AY8913, SOUND2_CLOCK/2) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + + MCFG_SOUND_ADD("ay2", AY8913, SOUND2_CLOCK/2) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + + MCFG_SOUND_ADD("spsnd", SP0250, SOUND2_SPEECH_CLOCK) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_CONFIG_END /************************************* diff -Nru mame-0.144/src/mame/audio/invinco.c mame-0.145/src/mame/audio/invinco.c --- mame-0.144/src/mame/audio/invinco.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/invinco.c 2012-02-06 21:30:30.000000000 +0000 @@ -23,14 +23,14 @@ static const char *const invinco_sample_names[] = { "*invinco", - "saucer.wav", - "move1.wav", - "move2.wav", - "fire.wav", - "invhit.wav", - "shiphit.wav", - "move3.wav", /* currently not used */ - "move4.wav", /* currently not used */ + "saucer", + "move1", + "move2", + "fire", + "invhit", + "shiphit", + "move3", /* currently not used */ + "move4", /* currently not used */ 0 }; diff -Nru mame-0.144/src/mame/audio/jaguar.c mame-0.145/src/mame/audio/jaguar.c --- mame-0.144/src/mame/audio/jaguar.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/jaguar.c 2012-02-06 21:30:30.000000000 +0000 @@ -262,7 +262,9 @@ } #if ENABLE_SPEEDUP_HACKS - machine.device("audiocpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xf1a100, 0xf1a103, FUNC(dsp_flags_w)); + if (jaguar_hacks_enabled) + machine.device("audiocpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0xf1a100, 0xf1a103, FUNC(dsp_flags_w)); + #endif } @@ -369,18 +371,24 @@ TIMER_DEVICE_CALLBACK( jaguar_serial_callback ) { - /* assert the A2S IRQ on CPU #2 (DSP) */ - cputag_set_input_line(timer.machine(), "audiocpu", 1, ASSERT_LINE); - jaguar_dsp_resume(timer.machine()); - - /* fix flaky code in interrupt handler which thwarts our speedup */ - if ((jaguar_dsp_ram[0x3e/4] & 0xffff) == 0xbfbc && - (jaguar_dsp_ram[0x42/4] & 0xffff) == 0xe400) - { - /* move the store r28,(r29) into the branch delay slot, swapping it with */ - /* the nop that's currently there */ - jaguar_dsp_ram[0x3e/4] = (jaguar_dsp_ram[0x3e/4] & 0xffff0000) | 0xe400; - jaguar_dsp_ram[0x42/4] = (jaguar_dsp_ram[0x42/4] & 0xffff0000) | 0xbfbc; + if (jaguar_hacks_enabled) { + /* assert the A2S IRQ on CPU #2 (DSP) */ + cputag_set_input_line(timer.machine(), "audiocpu", 1, ASSERT_LINE); + jaguar_dsp_resume(timer.machine()); + + /* fix flaky code in interrupt handler which thwarts our speedup */ + if ((jaguar_dsp_ram[0x3e/4] & 0xffff) == 0xbfbc && + (jaguar_dsp_ram[0x42/4] & 0xffff) == 0xe400) + { + /* move the store r28,(r29) into the branch delay slot, swapping it with */ + /* the nop that's currently there */ + jaguar_dsp_ram[0x3e/4] = (jaguar_dsp_ram[0x3e/4] & 0xffff0000) | 0xe400; + jaguar_dsp_ram[0x42/4] = (jaguar_dsp_ram[0x42/4] & 0xffff0000) | 0xbfbc; + } + } else { + /* assert the A2S IRQ on CPU #2 (DSP) */ + cputag_set_input_line(timer.machine(), "audiocpu", 1, ASSERT_LINE); + jaguar_dsp_resume(timer.machine()); } } diff -Nru mame-0.144/src/mame/audio/mw8080bw.c mame-0.145/src/mame/audio/mw8080bw.c --- mame-0.144/src/mame/audio/mw8080bw.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/mame/audio/mw8080bw.c 2012-02-06 21:30:30.000000000 +0000 @@ -137,11 +137,11 @@ static const char *const seawolf_sample_names[] = { "*seawolf", - "shiphit.wav", - "torpedo.wav", - "dive.wav", - "sonar.wav", - "minehit.wav", + "shiphit", + "torpedo", + "dive", + "sonar", + "minehit", 0 }; @@ -201,8 +201,8 @@ static const char *const gunfight_sample_names[] = { "*gunfight", - "gunshot.wav", - "killed.wav", + "gunshot", + "killed", 0 }; @@ -1559,8 +1559,8 @@ static const char *const gmissile_sample_names[] = { "*gmissile", - "1.wav", /* missle */ - "2.wav", /* explosion */ + "1", /* missle */ + "2", /* explosion */ 0 }; @@ -1658,8 +1658,8 @@ static const char *const m4_sample_names[] = { "*m4", - "1.wav", /* missle */ - "2.wav", /* explosion */ + "1", /* missle */ + "2", /* explosion */ 0 }; @@ -1922,7 +1922,7 @@ static const char *const clowns_sample_names[] = { "*clowns", - "miss.wav", + "miss", 0 }; @@ -3324,8 +3324,8 @@ static const char *const phantom2_sample_names[] = { "*phantom2", - "1.wav", /* shot */ - "2.wav", /* explosion */ + "1", /* shot */ + "2", /* explosion */ 0 }; @@ -3598,15 +3598,15 @@ static const char *const invaders_sample_names[] = { "*invaders", - "1.wav", /* shot/missle */ - "2.wav", /* base hit/explosion */ - "3.wav", /* invader hit */ - "4.wav", /* fleet move 1 */ - "5.wav", /* fleet move 2 */ - "6.wav", /* fleet move 3 */ - "7.wav", /* fleet move 4 */ - "8.wav", /* UFO/saucer hit */ - "9.wav", /* bonus base */ + "1", /* shot/missle */ + "2", /* base hit/explosion */ + "3", /* invader hit */ + "4", /* fleet move 1 */ + "5", /* fleet move 2 */ + "6", /* fleet move 3 */ + "7", /* fleet move 4 */ + "8", /* UFO/saucer hit */ + "9", /* bonus base */ 0 }; diff -Nru mame-0.144/src/mame/audio/pulsar.c mame-0.145/src/mame/audio/pulsar.c --- mame-0.144/src/mame/audio/pulsar.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/pulsar.c 2012-02-06 21:30:30.000000000 +0000 @@ -36,18 +36,18 @@ static const char *const pulsar_sample_names[] = { "*pulsar", - "clang.wav", - "key.wav", - "alienhit.wav", - "phit.wav", - "ashoot.wav", - "pshoot.wav", - "bonus.wav", - "sizzle.wav", - "gate.wav", - "birth.wav", - "hbeat.wav", - "movmaze.wav", + "clang", + "key", + "alienhit", + "phit", + "ashoot", + "pshoot", + "bonus", + "sizzle", + "gate", + "birth", + "hbeat", + "movmaze", 0 }; diff -Nru mame-0.144/src/mame/audio/segag80r.c mame-0.145/src/mame/audio/segag80r.c --- mame-0.144/src/mame/audio/segag80r.c 2012-01-13 15:34:31.000000000 +0000 +++ mame-0.145/src/mame/audio/segag80r.c 2012-02-06 21:30:30.000000000 +0000 @@ -158,22 +158,22 @@ static const char *const astrob_sample_names[] = { "*astrob", - "invadr1.wav", /* 0 */ - "winvadr1.wav", /* 1 */ - "invadr2.wav", /* 2 */ - "winvadr2.wav", /* 3 */ - "invadr3.wav", /* 4 */ - "winvadr3.wav", /* 5 */ - "invadr4.wav", /* 6 */ - "winvadr4.wav", /* 7 */ - "asteroid.wav", /* 8 */ - "refuel.wav", /* 9 */ - "pbullet.wav", /* 10 */ - "ebullet.wav", /* 11 */ - "eexplode.wav", /* 12 */ - "pexplode.wav", /* 13 */ - "deedle.wav", /* 14 */ - "sonar.wav", /* 15 */ + "invadr1", /* 0 */ + "winvadr1", /* 1 */ + "invadr2", /* 2 */ + "winvadr2", /* 3 */ + "invadr3", /* 4 */ + "winvadr3", /* 5 */ + "invadr4", /* 6 */ + "winvadr4", /* 7 */ + "asteroid", /* 8 */ + "refuel", /* 9 */ + "pbullet", /* 10 */ + "ebullet", /* 11 */ + "eexplode", /* 12 */ + "pexplode", /* 13 */ + "deedle", /* 14 */ + "sonar", /* 15 */ 0 }; @@ -386,13 +386,13 @@ static const char *const sega005_sample_names[] = { "*005", - "lexplode.wav", /* 0 */ - "sexplode.wav", /* 1 */ - "dropbomb.wav", /* 2 */ - "shoot.wav", /* 3 */ - "missile.wav", /* 4 */ - "helicopt.wav", /* 5 */ - "whistle.wav", /* 6 */ + "lexplode", /* 0 */ + "sexplode", /* 1 */ + "dropbomb", /* 2 */ + "shoot", /* 3 */ + "missile", /* 4 */ + "helicopt", /* 5 */ + "whistle", /* 6 */ 0 }; @@ -637,17 +637,17 @@ static const char *const spaceod_sample_names[] = { "*spaceod", - "fire.wav", /* 0 */ - "bomb.wav", /* 1 */ - "eexplode.wav", /* 2 */ - "pexplode.wav", /* 3 */ - "warp.wav", /* 4 */ - "birth.wav", /* 5 */ - "scoreup.wav", /* 6 */ - "ssound.wav", /* 7 */ - "accel.wav", /* 8 */ - "damaged.wav", /* 9 */ - "erocket.wav", /* 10 */ + "fire", /* 0 */ + "bomb", /* 1 */ + "eexplode", /* 2 */ + "pexplode", /* 3 */ + "warp", /* 4 */ + "birth", /* 5 */ + "scoreup", /* 6 */ + "ssound", /* 7 */ + "accel", /* 8 */ + "damaged", /* 9 */ + "erocket", /* 10 */ 0 }; @@ -773,8 +773,8 @@ static const char *const monsterb_sample_names[] = { "*monsterb", - "zap.wav", - "jumpdown.wav", + "zap", + "jumpdown", 0 }; diff -Nru mame-0.144/src/mame/audio/snk6502.c mame-0.145/src/mame/audio/snk6502.c --- mame-0.144/src/mame/audio/snk6502.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/snk6502.c 2012-02-06 21:30:30.000000000 +0000 @@ -65,10 +65,10 @@ "*sasuke", // SN76477 and discrete - "hit.wav", - "boss_start.wav", - "shot.wav", - "boss_attack.wav", + "hit", + "boss_start", + "shot", + "boss_attack", 0 }; @@ -84,26 +84,26 @@ "*vanguard", // SN76477 and discrete - "fire.wav", - "explsion.wav", + "fire", + "explsion", // HD38880 speech - "vg_voi-0.wav", - "vg_voi-1.wav", - "vg_voi-2.wav", - "vg_voi-3.wav", - "vg_voi-4.wav", - "vg_voi-5.wav", - "vg_voi-6.wav", - "vg_voi-7.wav", - "vg_voi-8.wav", - "vg_voi-9.wav", - "vg_voi-a.wav", - "vg_voi-b.wav", - "vg_voi-c.wav", - "vg_voi-d.wav", - "vg_voi-e.wav", - "vg_voi-f.wav", + "vg_voi-0", + "vg_voi-1", + "vg_voi-2", + "vg_voi-3", + "vg_voi-4", + "vg_voi-5", + "vg_voi-6", + "vg_voi-7", + "vg_voi-8", + "vg_voi-9", + "vg_voi-a", + "vg_voi-b", + "vg_voi-c", + "vg_voi-d", + "vg_voi-e", + "vg_voi-f", 0 }; @@ -119,18 +119,18 @@ "*fantasy", // HD38880 speech - "ft_voi-0.wav", - "ft_voi-1.wav", - "ft_voi-2.wav", - "ft_voi-3.wav", - "ft_voi-4.wav", - "ft_voi-5.wav", - "ft_voi-6.wav", - "ft_voi-7.wav", - "ft_voi-8.wav", - "ft_voi-9.wav", - "ft_voi-a.wav", - "ft_voi-b.wav", + "ft_voi-0", + "ft_voi-1", + "ft_voi-2", + "ft_voi-3", + "ft_voi-4", + "ft_voi-5", + "ft_voi-6", + "ft_voi-7", + "ft_voi-8", + "ft_voi-9", + "ft_voi-a", + "ft_voi-b", 0 }; diff -Nru mame-0.144/src/mame/audio/spacefb.c mame-0.145/src/mame/audio/spacefb.c --- mame-0.144/src/mame/audio/spacefb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/spacefb.c 2012-02-06 21:30:30.000000000 +0000 @@ -70,10 +70,10 @@ static const char *const spacefb_sample_names[] = { "*spacefb", - "ekilled.wav", - "shipfire.wav", - "explode1.wav", - "explode2.wav", + "ekilled", + "shipfire", + "explode1", + "explode2", 0 }; diff -Nru mame-0.144/src/mame/audio/targ.c mame-0.145/src/mame/audio/targ.c --- mame-0.144/src/mame/audio/targ.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/targ.c 2012-02-06 21:30:30.000000000 +0000 @@ -136,11 +136,11 @@ static const char *const sample_names[] = { "*targ", - "expl.wav", - "shot.wav", - "sexpl.wav", - "spslow.wav", - "spfast.wav", + "expl", + "shot", + "sexpl", + "spslow", + "spfast", 0 }; diff -Nru mame-0.144/src/mame/audio/triplhnt.c mame-0.145/src/mame/audio/triplhnt.c --- mame-0.144/src/mame/audio/triplhnt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/triplhnt.c 2012-02-06 21:30:30.000000000 +0000 @@ -11,8 +11,8 @@ static const char *const triplhnt_sample_names[] = { "*triplhnt", - "bear_rac.wav", - "witch.wav", + "bear_rac", + "witch", 0 }; diff -Nru mame-0.144/src/mame/audio/turbo.c mame-0.145/src/mame/audio/turbo.c --- mame-0.144/src/mame/audio/turbo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/turbo.c 2012-02-06 21:30:30.000000000 +0000 @@ -172,15 +172,15 @@ static const char *const turbo_sample_names[] = { "*turbo", - "01.wav", /* 0: Trig1 */ - "02.wav", /* 1: Trig2 */ - "03.wav", /* 2: Trig3 */ - "04.wav", /* 3: Trig4 */ - "05.wav", /* 4: Screech */ - "06.wav", /* 5: Crash */ - "skidding.wav", /* 6: Spin */ - "idle.wav", /* 7: Idle */ - "ambulanc.wav", /* 8: Ambulance */ + "01", /* 0: Trig1 */ + "02", /* 1: Trig2 */ + "03", /* 2: Trig3 */ + "04", /* 3: Trig4 */ + "05", /* 4: Screech */ + "06", /* 5: Crash */ + "skidding", /* 6: Spin */ + "idle", /* 7: Idle */ + "ambulanc", /* 8: Ambulance */ 0 }; @@ -428,17 +428,17 @@ static const char *const subroc3d_sample_names[] = { "*subroc3d", - "01.wav", /* 0: enemy missile */ - "02.wav", /* 1: enemy torpedo */ - "03.wav", /* 2: enemy fighter */ - "04.wav", /* 3: explosion in sky */ - "05.wav", /* 4: explosion on sea */ - "06.wav", /* 5: missile shoot */ - "07.wav", /* 6: torpedo shoot */ - "08.wav", /* 7: my ship expl */ - "09.wav", /* 8: prolog sound */ - "11.wav", /* 9: alarm 0 */ - "12.wav", /* 10: alarm 1 */ + "01", /* 0: enemy missile */ + "02", /* 1: enemy torpedo */ + "03", /* 2: enemy fighter */ + "04", /* 3: explosion in sky */ + "05", /* 4: explosion on sea */ + "06", /* 5: missile shoot */ + "07", /* 6: torpedo shoot */ + "08", /* 7: my ship expl */ + "09", /* 8: prolog sound */ + "11", /* 9: alarm 0 */ + "12", /* 10: alarm 1 */ 0 }; @@ -583,17 +583,17 @@ static const char *const buckrog_sample_names[]= { "*buckrog", - "alarm0.wav", /* 0 */ - "alarm1.wav", /* 1 */ - "alarm2.wav", /* 2 */ - "alarm3.wav", /* 3 */ - "exp.wav", /* 4 */ - "fire.wav", /* 5 */ - "rebound.wav", /* 6 */ - "hit.wav", /* 7 */ - "shipsnd1.wav", /* 8 */ - "shipsnd2.wav", /* 9 */ - "shipsnd3.wav", /* 10 */ + "alarm0", /* 0 */ + "alarm1", /* 1 */ + "alarm2", /* 2 */ + "alarm3", /* 3 */ + "exp", /* 4 */ + "fire", /* 5 */ + "rebound", /* 6 */ + "hit", /* 7 */ + "shipsnd1", /* 8 */ + "shipsnd2", /* 9 */ + "shipsnd3", /* 10 */ 0 }; diff -Nru mame-0.144/src/mame/audio/vicdual.c mame-0.145/src/mame/audio/vicdual.c --- mame-0.144/src/mame/audio/vicdual.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/audio/vicdual.c 2012-02-06 21:30:31.000000000 +0000 @@ -103,12 +103,12 @@ static const char *const frogs_sample_names[] = { "*frogs", - "boing.wav", - "buzzz.wav", - "croak.wav", - "hop.wav", - "splash.wav", - "zip.wav", + "boing", + "buzzz", + "croak", + "hop", + "splash", + "zip", 0 }; diff -Nru mame-0.144/src/mame/audio/wow.c mame-0.145/src/mame/audio/wow.c --- mame-0.144/src/mame/audio/wow.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/wow.c 2012-02-06 21:30:30.000000000 +0000 @@ -41,10 +41,10 @@ 0 }; -/* Missing samples : ready.wav from.wav one.wav bite.wav youl.wav explode.wav if.wav myself.wav back.wav - cant.wav do.wav wait.wav worlings.wav very.wav babies.wav breath.wav fire.wav beat.wav rest.wav - then.wav never.wav worlock.wav escape.wav door.wav try.wav any.wav harder.wav only.wav meet.wav with.wav - doom.wav pop.wav +/* Missing samples : ready, from, one, bite, youl, explode, if, myself, back, + cant, do, wait, worlings, very, babies, breath, fire, beat, rest, + then, never, worlock, escape, door, try, any, harder, only, meet, with, + doom, pop, Problems with YOU and YOU'LL and YOU'DD */ static const char *const wowWordTable[] = @@ -77,26 +77,26 @@ const char *const wow_sample_names[] = { "*wow", - "a.wav", "again.wav", "ahh.wav", "am.wav", "and.wav", - "anew.wav", "another.wav", "any.wav", "anyone.wav", "appear.wav", "are.wav", "are.wav", "babies.wav", "back.wav", - "beat.wav", "become.wav", "best.wav", "better.wav", "bite.wav", "bones.wav", "breath.wav", "but.wav", "can.wav", "cant.wav", - "chance.wav", "chest.wav", "coin.wav", "dance.wav", "destroy.wav", - "develop.wav", "do.wav", "dont.wav", "doom.wav", "door.wav", "draw.wav", "dungeon.wav", "dungeons.wav", - "each.wav", "eaten.wav", "escape.wav", "explode.wav", "fear.wav", "find.wav", "find.wav", "fire.wav", "for.wav", "from.wav", - "garwor.wav", "get.wav", "get.wav", "get.wav", "getting.wav", "good.wav", "hahahaha.wav", "harder.wav", - "hasnt.wav", "have.wav", "heavyw.wav", "hey.wav", "hope.wav", - "hungry.wav", "hungry.wav", "hurry.wav", "i.wav", "i.wav", "if.wav", "if.wav", "im.wav", "i1.wav", "ill.wav", "in.wav", - "insert.wav", "invisibl.wav", "it.wav", "lie.wav", "magic.wav", - "magical.wav", "me.wav", "meet.wav", "months.wav", - "my.wav", "my.wav", "my.wav", "my.wav", "my.wav", "myself.wav", "near.wav", "never.wav", - "now.wav", "of.wav", "off.wav", "one.wav", "only.wav", "oven.wav", "pause.wav", "pets.wav", "powerful.wav", "pop.wav", - "radar.wav", "ready.wav", - "rest.wav", "say.wav", "science.wav", "see.wav", "spause.wav", "start.wav", "the.wav", "the.wav", "the.wav", "the.wav", "then.wav", - "through.wav", "thurwor.wav", "time.wav", "to.wav", "to.wav", "to.wav", "treasure.wav", "try.wav", "very.wav", "wait.wav", - "war.wav", "warrior.wav", "watch.wav", "we.wav", "welcome.wav", - "were.wav", "while.wav", "will.wav", "with.wav", "wizard.wav", "wont.wav", - "wor.wav", "world.wav", "worlings.wav", "worlock.wav", - "you.wav", "you.wav", "you.wav", "you.wav", "you.wav", "youl.wav", "youl.wav", "youd.wav", "your.wav",0 + "a", "again", "ahh", "am", "and", + "anew", "another", "any", "anyone", "appear", "are", "are", "babies", "back", + "beat", "become", "best", "better", "bite", "bones", "breath", "but", "can", "cant", + "chance", "chest", "coin", "dance", "destroy", + "develop", "do", "dont", "doom", "door", "draw", "dungeon", "dungeons", + "each", "eaten", "escape", "explode", "fear", "find", "find", "fire", "for", "from", + "garwor", "get", "get", "get", "getting", "good", "hahahaha", "harder", + "hasnt", "have", "heavyw", "hey", "hope", + "hungry", "hungry", "hurry", "i", "i", "if", "if", "im", "i1", "ill", "in", + "insert", "invisibl", "it", "lie", "magic", + "magical", "me", "meet", "months", + "my", "my", "my", "my", "my", "myself", "near", "never", + "now", "of", "off", "one", "only", "oven", "pause", "pets", "powerful", "pop", + "radar", "ready", + "rest", "say", "science", "see", "spause", "start", "the", "the", "the", "the", "then", + "through", "thurwor", "time", "to", "to", "to", "treasure", "try", "very", "wait", + "war", "warrior", "watch", "we", "welcome", + "were", "while", "will", "with", "wizard", "wont", + "wor", "world", "worlings", "worlock", + "you", "you", "you", "you", "you", "youl", "youl", "youd", "your",0 }; diff -Nru mame-0.144/src/mame/audio/zaxxon.c mame-0.145/src/mame/audio/zaxxon.c --- mame-0.144/src/mame/audio/zaxxon.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/audio/zaxxon.c 2012-02-06 21:30:30.000000000 +0000 @@ -74,18 +74,18 @@ static const char *const zaxxon_sample_names[] = { "*zaxxon", - "03.wav", /* 0 - Homing Missile */ - "02.wav", /* 1 - Base Missile */ - "01.wav", /* 2 - Laser (force field) */ - "00.wav", /* 3 - Battleship (end of level boss) */ - "11.wav", /* 4 - S-Exp (enemy explosion) */ - "10.wav", /* 5 - M-Exp (ship explosion) */ - "08.wav", /* 6 - Cannon (ship fire) */ - "23.wav", /* 7 - Shot (enemy fire) */ - "21.wav", /* 8 - Alarm 2 (target lock) */ - "20.wav", /* 9 - Alarm 3 (low fuel) */ - "05.wav", /* 10 - initial background noise */ - "04.wav", /* 11 - looped asteroid noise */ + "03", /* 0 - Homing Missile */ + "02", /* 1 - Base Missile */ + "01", /* 2 - Laser (force field) */ + "00", /* 3 - Battleship (end of level boss) */ + "11", /* 4 - S-Exp (enemy explosion) */ + "10", /* 5 - M-Exp (ship explosion) */ + "08", /* 6 - Cannon (ship fire) */ + "23", /* 7 - Shot (enemy fire) */ + "21", /* 8 - Alarm 2 (target lock) */ + "20", /* 9 - Alarm 3 (low fuel) */ + "05", /* 10 - initial background noise */ + "04", /* 11 - looped asteroid noise */ 0 }; @@ -193,11 +193,11 @@ static const char *const congo_sample_names[] = { "*congo", - "gorilla.wav", /* 0 */ - "bass.wav", /* 1 */ - "congal.wav", /* 2 */ - "congah.wav", /* 3 */ - "rim.wav", /* 4 */ + "gorilla", /* 0 */ + "bass", /* 1 */ + "congal", /* 2 */ + "congah", /* 3 */ + "rim", /* 4 */ 0 }; diff -Nru mame-0.144/src/mame/drivers/1942.c mame-0.145/src/mame/drivers/1942.c --- mame-0.144/src/mame/drivers/1942.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/1942.c 2012-02-06 21:30:40.000000000 +0000 @@ -274,12 +274,11 @@ MCFG_PALETTE_LENGTH(64*4+4*32*8+16*16) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(1942) + MCFG_SCREEN_UPDATE_STATIC(1942) MCFG_PALETTE_INIT(1942) MCFG_VIDEO_START(1942) diff -Nru mame-0.144/src/mame/drivers/1943.c mame-0.145/src/mame/drivers/1943.c --- mame-0.144/src/mame/drivers/1943.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/1943.c 2012-02-06 21:30:40.000000000 +0000 @@ -270,10 +270,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(1943) + MCFG_SCREEN_UPDATE_STATIC(1943) MCFG_GFXDECODE(1943) MCFG_PALETTE_LENGTH(32*4+16*16+16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/1945kiii.c mame-0.145/src/mame/drivers/1945kiii.c --- mame-0.144/src/mame/drivers/1945kiii.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/1945kiii.c 2012-02-06 21:30:40.000000000 +0000 @@ -74,7 +74,7 @@ { k3_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_k3_bg_tile_info ) @@ -90,7 +90,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_k3_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 64); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { k3_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -116,11 +116,11 @@ } } -static SCREEN_UPDATE(k3) +static SCREEN_UPDATE_IND16(k3) { - k3_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + k3_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -128,13 +128,13 @@ static WRITE16_HANDLER( k3_scrollx_w ) { k3_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } static WRITE16_HANDLER( k3_scrolly_w ) { k3_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } static WRITE16_HANDLER( k3_soundbanks_w ) @@ -262,10 +262,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(k3) + MCFG_SCREEN_UPDATE_STATIC(k3) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/20pacgal.c mame-0.145/src/mame/drivers/20pacgal.c --- mame-0.144/src/mame/drivers/20pacgal.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/20pacgal.c 2012-02-06 21:30:37.000000000 +0000 @@ -77,11 +77,10 @@ static WRITE8_HANDLER( irqack_w ) { _20pacgal_state *state = space->machine().driver_data<_20pacgal_state>(); - int bit = data & 1; - cpu_interrupt_enable(state->m_maincpu, bit); + state->m_irq_mask = data & 1; - if (!bit) + if (!state->m_irq_mask) device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); } @@ -333,6 +332,8 @@ state->save_item(NAME(state->m_game_selected)); state->save_item(NAME(state->m_ram_48000)); + state->save_item(NAME(state->m_irq_mask)); + machine.save().register_postload(save_prepost_delegate(FUNC(set_bankptr), &machine)); } @@ -343,13 +344,21 @@ state->m_game_selected = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + _20pacgal_state *state = device->machine().driver_data<_20pacgal_state>(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); // TODO: assert breaks the inputs in 25pacman test mode +} + static MACHINE_CONFIG_START( 20pacgal, _20pacgal_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z180, MAIN_CPU_CLOCK) MCFG_CPU_PROGRAM_MAP(20pacgal_map) MCFG_CPU_IO_MAP(20pacgal_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) // assert breaks the inputs in 25pacman test mode + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(20pacgal) MCFG_MACHINE_RESET(20pacgal) diff -Nru mame-0.144/src/mame/drivers/2mindril.c mame-0.145/src/mame/drivers/2mindril.c --- mame-0.144/src/mame/drivers/2mindril.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/2mindril.c 2012-02-06 21:30:42.000000000 +0000 @@ -448,11 +448,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* inaccurate, same as Taito F3? (needs screen raw params anyway) */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8+48*2, 32*8) MCFG_SCREEN_VISIBLE_AREA(46, 40*8-1 + 46, 24, 24+224-1) - MCFG_SCREEN_UPDATE(f3) - MCFG_SCREEN_EOF(f3) + MCFG_SCREEN_UPDATE_STATIC(f3) + MCFG_SCREEN_VBLANK_STATIC(f3) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/30test.c mame-0.145/src/mame/drivers/30test.c --- mame-0.144/src/mame/drivers/30test.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/30test.c 2012-02-06 21:30:37.000000000 +0000 @@ -16,8 +16,8 @@ - [0xb0-0xb3] timer lamps: -?OK???!! = really OK! (91+) -???????? = pretty good (80+) +?OK???!! = really OK! (91+) (0x81) +???????? = pretty good (80+) (0x82) ???~??? = not bad (70+) (0x84) ??? = normal (55+) (0x88) ????? = pretty bad (40+) (0x90) @@ -65,7 +65,7 @@ } -static SCREEN_UPDATE( 30test ) +static SCREEN_UPDATE_IND16( 30test ) { return 0; } @@ -277,10 +277,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(30test) + MCFG_SCREEN_UPDATE_STATIC(30test) // MCFG_PALETTE_INIT(30test) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/39in1.c mame-0.145/src/mame/drivers/39in1.c --- mame-0.144/src/mame/drivers/39in1.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/39in1.c 2012-02-06 21:30:36.000000000 +0000 @@ -1512,15 +1512,15 @@ PORT_SERVICE_NO_TOGGLE( 0x80000000, IP_ACTIVE_LOW ) INPUT_PORTS_END -static SCREEN_UPDATE( 39in1 ) +static SCREEN_UPDATE_RGB32( 39in1 ) { - _39in1_state *state = screen->machine().driver_data<_39in1_state>(); + _39in1_state *state = screen.machine().driver_data<_39in1_state>(); int x = 0; int y = 0; for(y = 0; y <= (state->m_lcd_regs.lccr2 & PXA255_LCCR2_LPP); y++) { - UINT32 *d = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *d = &bitmap.pix32(y); for(x = 0; x <= (state->m_lcd_regs.lccr1 & PXA255_LCCR1_PPL); x++) { d[x] = state->m_pxa255_lcd_palette[state->m_pxa255_lcd_framebuffer[y*((state->m_lcd_regs.lccr1 & PXA255_LCCR1_PPL) + 1) + x]]; @@ -1593,10 +1593,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(1024, 1024) MCFG_SCREEN_VISIBLE_AREA(0, 295, 0, 479) - MCFG_SCREEN_UPDATE(39in1) + MCFG_SCREEN_UPDATE_STATIC(39in1) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/3do.c mame-0.145/src/mame/drivers/3do.c --- mame-0.144/src/mame/drivers/3do.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/3do.c 2012-02-06 21:30:34.000000000 +0000 @@ -163,14 +163,11 @@ MCFG_MACHINE_RESET( 3do ) -// MCFG_VIDEO_START( generic_bitmapped ) MCFG_VIDEO_START( _3do ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT( BITMAP_FORMAT_RGB32 ) MCFG_SCREEN_RAW_PARAMS( X2_CLOCK_NTSC / 2, 1592, 254, 1534, 263, 22, 262 ) -// MCFG_SCREEN_UPDATE( generic_bitmapped ) - MCFG_SCREEN_UPDATE( _3do ) + MCFG_SCREEN_UPDATE_STATIC( _3do ) MCFG_CDROM_ADD( "cdrom", _3do_cdrom) MACHINE_CONFIG_END @@ -184,14 +181,11 @@ MCFG_MACHINE_RESET( 3do ) - MCFG_VIDEO_START( generic_bitmapped ) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT( BITMAP_FORMAT_RGB32 ) + MCFG_SCREEN_UPDATE_STATIC( _3do ) MCFG_SCREEN_SIZE( 640, 625 ) MCFG_SCREEN_VISIBLE_AREA( 0, 639, 0, 479 ) MCFG_SCREEN_REFRESH_RATE( 50 ) - MCFG_SCREEN_UPDATE( generic_bitmapped ) MCFG_CDROM_ADD( "cdrom", _3do_cdrom) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/40love.c mame-0.145/src/mame/drivers/40love.c --- mame-0.144/src/mame/drivers/40love.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/40love.c 2012-02-06 21:30:42.000000000 +0000 @@ -1091,10 +1091,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(128,128+255, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fortyl) + MCFG_SCREEN_UPDATE_STATIC(fortyl) MCFG_GFXDECODE(40love) MCFG_PALETTE_LENGTH(1024) @@ -1149,10 +1148,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(128,128+255, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fortyl) + MCFG_SCREEN_UPDATE_STATIC(fortyl) MCFG_GFXDECODE(40love) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/4enraya.c mame-0.145/src/mame/drivers/4enraya.c --- mame-0.144/src/mame/drivers/4enraya.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/4enraya.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,11 +1,13 @@ /*************************************************************************** -Driver by Tomasz Slanina dox@space.pl +Driver by Tomasz Slanina TODO: - video and irq timings; - there's a waitstate penalty on the VRAM apparently? +- unknown Pac-Man gambling game (whats the real title?) sound issues + *************************************************************************** RAM : @@ -55,6 +57,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" +#include "machine/nvram.h" #include "includes/4enraya.h" #define MAIN_CLOCK XTAL_8MHz @@ -69,7 +72,7 @@ { _4enraya_state *state = device->machine().driver_data<_4enraya_state>(); - if ((state->m_last_snd_ctrl & 0x04) == 0x04 && (data & 0x4) == 0x00) + if ((state->m_last_snd_ctrl & state->m_snd_latch_bit ) == state->m_snd_latch_bit && (data & state->m_snd_latch_bit) == 0x00) ay8910_data_address_w(device, state->m_last_snd_ctrl, state->m_soundlatch); state->m_last_snd_ctrl = data; @@ -157,6 +160,21 @@ AM_RANGE(0x33, 0x33) AM_DEVWRITE("aysnd", sound_control_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( unkpacg_main_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x6000, 0x67ff) AM_RAM AM_SHARE("nvram") + AM_RANGE(0x7000, 0x7fff) AM_WRITE(fenraya_videoram_w) AM_BASE_SIZE_MEMBER(_4enraya_state, m_videoram, m_videoram_size) + AM_RANGE(0x8000, 0x9fff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( unkpacg_main_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_READ_PORT("DSW1") + AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") + AM_RANGE(0x02, 0x02) AM_READ_PORT("IN2") + AM_RANGE(0x20, 0x20) AM_WRITE(sound_data_w) + AM_RANGE(0x30, 0x30) AM_DEVWRITE("aysnd", sound_control_w) +ADDRESS_MAP_END static INPUT_PORTS_START( 4enraya ) PORT_START("DSW") @@ -204,6 +222,65 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) INPUT_PORTS_END +static INPUT_PORTS_START( unkpacg ) + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x00, "0-0") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + + PORT_DIPNAME( 0x02, 0x00, "0-1") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + + PORT_DIPNAME( 0x04, 0x00, "0-2") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + + PORT_DIPNAME( 0x08, 0x00, "0-3") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + + PORT_DIPNAME( 0x10, 0x00, "0-4") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + + PORT_DIPNAME( 0x20, 0x00, "0-5") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + + PORT_DIPNAME( 0x40, 0x00, "0-6") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + + PORT_DIPNAME( 0x80, 0x00, "0-7") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) // 1 credits / initiate minigame + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) // 5 credits / initiate gambling + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) // 10 credits + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_DIPNAME( 0x80, 0x80, "DIP8") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +INPUT_PORTS_END + static const gfx_layout charlayout = { 8,8, @@ -259,10 +336,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(4enraya) + MCFG_SCREEN_UPDATE_STATIC(4enraya) MCFG_GFXDECODE(4enraya) @@ -277,6 +353,14 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( unkpacg, 4enraya ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(unkpacg_main_map) + MCFG_CPU_IO_MAP(unkpacg_main_portmap) + MCFG_NVRAM_ADD_0FILL("nvram") +MACHINE_CONFIG_END + + /*************************************************************************** Game driver(s) @@ -297,4 +381,32 @@ ROM_LOAD( "1.bpr", 0x0000, 0x0020, CRC(dcbd2352) SHA1(ce72e84129ed1b455aaf648e1dfaa4333e7e7628) ) /* system control: used for memory mapping */ ROM_END -GAME( 1990, 4enraya, 0, 4enraya, 4enraya, 0, ROT0, "IDSA", "4 En Raya", GAME_SUPPORTS_SAVE ) + +ROM_START(unkpacg) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("1.u14", 0x00000, 0x2000, CRC(848c4143) SHA1(3cff26181c58e5f52f1ac81df7d5d43e644585a2)) + ROM_LOAD("2.u46", 0x08000, 0x2000, CRC(9e6e0bd3) SHA1(f502132a0460108dad243632cc13d9116c534291)) + + ROM_REGION( 0x6000, "gfx1", 0 ) + ROM_LOAD( "3.u20", 0x2000, 0x2000, CRC(d00b04ea) SHA1(e65901d8586507257d74ab103001207e28fa28af) ) + ROM_LOAD( "4.u19", 0x4000, 0x2000, CRC(4a123a3d) SHA1(26300b8af0d0df0023a153a212699727311d1b74) ) + ROM_LOAD( "5.u18", 0x0000, 0x2000, CRC(44f272d2) SHA1(b39cbc1f290d9fb2453396906e4da4a682c41ef4) ) +ROM_END + +static DRIVER_INIT( unkpacg ) +{ + _4enraya_state *state = machine.driver_data<_4enraya_state>(); + UINT8 *rom = machine.region("maincpu")->base(); + + state->m_snd_latch_bit = 2; + + { + for(int i=0x8000;i<0xa000;++i) + { + rom[i]=BITSWAP8(rom[i], 7,6,5,4,3,2,0,1); + } + } +} + +GAME( 1990, 4enraya, 0, 4enraya, 4enraya, 0, ROT0, "IDSA", "4 En Raya", GAME_SUPPORTS_SAVE ) +GAME( 199?, unkpacg, 0, unkpacg, unkpacg, unkpacg, ROT0, "", "unknown Pac-Man gambling game", GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/4roses.c mame-0.145/src/mame/drivers/4roses.c --- mame-0.144/src/mame/drivers/4roses.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/4roses.c 2012-02-06 21:30:39.000000000 +0000 @@ -393,10 +393,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((124+1)*4, (30+1)*8) /* guess. taken from funworld games */ MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 29*8-1) /* guess. taken from funworld games */ - MCFG_SCREEN_UPDATE(funworld) + MCFG_SCREEN_UPDATE_STATIC(funworld) MCFG_GFXDECODE(4roses) diff -Nru mame-0.144/src/mame/drivers/5clown.c mame-0.145/src/mame/drivers/5clown.c --- mame-0.144/src/mame/drivers/5clown.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/5clown.c 2012-02-06 21:30:42.000000000 +0000 @@ -481,14 +481,14 @@ { _5clown_state *state = space->machine().driver_data<_5clown_state>(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fclown_colorram_w ) { _5clown_state *state = space->machine().driver_data<_5clown_state>(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -521,10 +521,10 @@ } -static SCREEN_UPDATE( fclown ) +static SCREEN_UPDATE_IND16( fclown ) { - _5clown_state *state = screen->machine().driver_data<_5clown_state>(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + _5clown_state *state = screen.machine().driver_data<_5clown_state>(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1068,10 +1068,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(fclown) + MCFG_SCREEN_UPDATE_STATIC(fclown) MCFG_GFXDECODE(fclown) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/8080bw.c mame-0.145/src/mame/drivers/8080bw.c --- mame-0.144/src/mame/drivers/8080bw.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/8080bw.c 2012-02-06 21:30:38.000000000 +0000 @@ -395,7 +395,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(invadpt2) + MCFG_SCREEN_UPDATE_STATIC(invadpt2) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -571,7 +571,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(cosmo) + MCFG_SCREEN_UPDATE_STATIC(cosmo) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -801,7 +801,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(invadpt2) + MCFG_SCREEN_UPDATE_STATIC(invadpt2) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -950,7 +950,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(rollingc) + MCFG_SCREEN_UPDATE_STATIC(rollingc) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1068,7 +1068,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(schaser) + MCFG_SCREEN_UPDATE_STATIC(schaser) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1137,7 +1137,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(schasercv) + MCFG_SCREEN_UPDATE_STATIC(schasercv) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1218,7 +1218,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(sflush) + MCFG_SCREEN_UPDATE_STATIC(sflush) MACHINE_CONFIG_END @@ -1325,7 +1325,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(indianbt) + MCFG_SCREEN_UPDATE_STATIC(indianbt) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1345,7 +1345,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(lupin3) + MCFG_SCREEN_UPDATE_STATIC(lupin3) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1466,7 +1466,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(polaris) + MCFG_SCREEN_UPDATE_STATIC(polaris) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1589,7 +1589,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ballbomb) + MCFG_SCREEN_UPDATE_STATIC(ballbomb) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1763,7 +1763,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(indianbt) + MCFG_SCREEN_UPDATE_STATIC(indianbt) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1837,7 +1837,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(invadpt2) + MCFG_SCREEN_UPDATE_STATIC(invadpt2) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -1972,7 +1972,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1) - MCFG_SCREEN_UPDATE(shuttlei) + MCFG_SCREEN_UPDATE_STATIC(shuttlei) /* sound hardware */ MCFG_FRAGMENT_ADD(invaders_samples_audio) @@ -2153,7 +2153,7 @@ /* video hardware */ // TODO: replace with modified invaders color renderer code allowing midscanline color writes MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(invaders) + MCFG_SCREEN_UPDATE_STATIC(invaders) /* add shifter */ MCFG_MB14241_ADD("mb14241") diff -Nru mame-0.144/src/mame/drivers/88games.c mame-0.145/src/mame/drivers/88games.c --- mame-0.144/src/mame/drivers/88games.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/88games.c 2012-02-06 21:30:36.000000000 +0000 @@ -396,10 +396,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(88games) + MCFG_SCREEN_UPDATE_STATIC(88games) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/ace.c mame-0.145/src/mame/drivers/ace.c --- mame-0.144/src/mame/drivers/ace.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ace.c 2012-02-06 21:30:34.000000000 +0000 @@ -82,27 +82,27 @@ gfx_element_set_source(machine.gfx[4], state->m_scoreram); } -static SCREEN_UPDATE( ace ) +static SCREEN_UPDATE_IND16( ace ) { - ace_state *state = screen->machine().driver_data(); + ace_state *state = screen.machine().driver_data(); int offs; /* first of all, fill the screen with the background color */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[1], 0, 0, 0, 0, state->m_objpos[0], state->m_objpos[1]); - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[2], + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[2], 0, 0, 0, 0, state->m_objpos[2], state->m_objpos[3]); - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[3], + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[3], 0, 0, 0, 0, @@ -111,7 +111,7 @@ for (offs = 0; offs < 8; offs++) { drawgfx_opaque(bitmap,/* ?? */ - cliprect, screen->machine().gfx[4], + cliprect, screen.machine().gfx[4], offs, 0, 0, 0, @@ -354,10 +354,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(ace) + MCFG_SCREEN_UPDATE_STATIC(ace) MCFG_GFXDECODE(ace) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/acefruit.c mame-0.145/src/mame/drivers/acefruit.c --- mame-0.144/src/mame/drivers/acefruit.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/acefruit.c 2012-02-06 21:30:41.000000000 +0000 @@ -76,11 +76,11 @@ state->m_refresh_timer->adjust( attotime::zero ); } -static SCREEN_UPDATE( acefruit ) +static SCREEN_UPDATE_IND16( acefruit ) { - acefruit_state *state = screen->machine().driver_data(); - int startrow = cliprect->min_y / 8; - int endrow = cliprect->max_y / 8; + acefruit_state *state = screen.machine().driver_data(); + int startrow = cliprect.min_y / 8; + int endrow = cliprect.max_y / 8; int row; int col; @@ -98,7 +98,7 @@ if( color < 0x4 ) { - drawgfx_opaque( bitmap, cliprect, screen->machine().gfx[ 1 ], code, color, 0, 0, col * 16, row * 8 ); + drawgfx_opaque( bitmap, cliprect, screen.machine().gfx[ 1 ], code, color, 0, 0, col * 16, row * 8 ); } else if( color >= 0x5 && color <= 0x7 ) { @@ -106,7 +106,7 @@ int x; static const int spriteskip[] = { 1, 2, 4 }; int spritesize = spriteskip[ color - 5 ]; - const gfx_element *gfx = screen->machine().gfx[ 0 ]; + const gfx_element *gfx = screen.machine().gfx[ 0 ]; for( x = 0; x < 16; x++ ) { @@ -115,7 +115,7 @@ for( y = 0; y < 8; y++ ) { - UINT16 *dst = BITMAP_ADDR16( bitmap, y + ( row * 8 ), x + ( col * 16 ) ); + UINT16 *dst = &bitmap.pix16(y + ( row * 8 ), x + ( col * 16 ) ); *( dst ) = *( gfxdata + ( ( spriterow + y ) * gfx->line_modulo ) + ( ( spriteindex % 64 ) >> 1 ) ); } @@ -131,7 +131,7 @@ { for( y = 0; y < 8; y++ ) { - UINT16 *dst = BITMAP_ADDR16( bitmap, y + ( row * 8 ), x + ( col * 16 ) ); + UINT16 *dst = &bitmap.pix16(y + ( row * 8 ), x + ( col * 16 ) ); *( dst ) = 0; } } @@ -578,10 +578,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 255) - MCFG_SCREEN_UPDATE(acefruit) + MCFG_SCREEN_UPDATE_STATIC(acefruit) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/aces1.c mame-0.145/src/mame/drivers/aces1.c --- mame-0.144/src/mame/drivers/aces1.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/aces1.c 2012-02-06 21:30:39.000000000 +0000 @@ -11,6 +11,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -18,18 +20,25 @@ { public: aces1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( aces1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( aces1_map, AS_PROGRAM, 8, aces1_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( aces1_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( aces1_portmap, AS_IO, 8, aces1_state ) ADDRESS_MAP_END @@ -232,25 +241,24 @@ DRIVER_INIT( aces1 ) { - } -GAME( 199?, ac1cshtw ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Cash Towers (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1clbmn ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Money (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1gogld ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Go For Gold (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1hotpf ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Hot Profit (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1pster ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Pound Sterling (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1pstrt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Pcp", "Pound Stretcher (Pcp) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1primt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Primetime (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1taklv ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Take It Or Leave It (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, ac1cshtw ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Cash Towers (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1clbmn ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Money (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1gogld ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Go For Gold (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1hotpf ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Hot Profit (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1pster ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Pound Sterling (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1pstrt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Pcp", "Pound Stretcher (Pcp) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1primt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Primetime (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1taklv ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Take It Or Leave It (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) // guessed hw -GAME( 199?, ac1bbclb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Big Break Club (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1clbsv ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Sovereign (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1clbxt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Xtra (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1piaca ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Play It Again Casino (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // Same ROMs were in 'Play It Again Deluxe' -GAME( 199?, ac1piacl ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Play It Again Club (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1prmcl ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Premier Club (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1rundx ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Runner Deluxe Club (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1totb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Top Of The Bill (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1sptb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Pcp", "Simply the Best (Pcp) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, ac1shid ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Super Hi De Hi (Ace) (ACESYS1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, ac1bbclb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Big Break Club (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1clbsv ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Sovereign (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1clbxt ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Club Xtra (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1piaca ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Play It Again Casino (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) // Same ROMs were in 'Play It Again Deluxe' +GAME( 199?, ac1piacl ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Play It Again Club (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1prmcl ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Premier Club (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1rundx ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Runner Deluxe Club (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1totb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Top Of The Bill (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1sptb ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Pcp", "Simply the Best (Pcp) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ac1shid ,0 ,aces1 ,aces1 ,aces1 ,ROT0 ,"Ace", "Super Hi De Hi (Ace) (ACESYS1)",GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/acesp.c mame-0.145/src/mame/drivers/acesp.c --- mame-0.144/src/mame/drivers/acesp.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/acesp.c 2012-02-06 21:30:39.000000000 +0000 @@ -7,6 +7,8 @@ should all games have OKI roms? are most missing? */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -14,18 +16,25 @@ { public: ace_sp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( ace_sp_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( ace_sp_map, AS_PROGRAM, 8, ace_sp_state ) AM_RANGE(0x0000, 0x1fff) AM_RAM AM_RANGE(0x2000, 0xffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( ace_sp_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( ace_sp_portmap, AS_IO, 8, ace_sp_state ) ADDRESS_MAP_END @@ -34,11 +43,9 @@ static MACHINE_CONFIG_START( ace_sp, ace_sp_state ) - MCFG_CPU_ADD("maincpu", HD6301, 1000000) // 6303? MCFG_CPU_PROGRAM_MAP(ace_sp_map) MCFG_CPU_IO_MAP(ace_sp_portmap) - MACHINE_CONFIG_END @@ -1239,70 +1246,70 @@ } -GAME( 199?, sp_cbowl ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Cash Bowl (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_crime ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Crime Watch (Ace) (sp.ACE, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_cw ,sp_crime ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Crime Watch (Ace) (sp.ACE, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // roms all contain Emmerdale strings?? -GAME( 199?, sp_emmrd ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Emmerdale (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_goldm ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Mile (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_gnat ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Grand National (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_gprix ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Grand Prix (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_hideh ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Hi De Hi (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_hifly ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Hi Flyer (Ace) [Mps] (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_juras ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Jurassic Trial (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_openb ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Open The Box (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_payrs ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Payrise (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_playa ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_playaa ,sp_playa ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // set was marked as a BWB set -GAME( 199?, sp_playab ,sp_playa ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_spell ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Spellbound (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_swop ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Swop Shop (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_timem ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Time Machine (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_tz ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_tzbwb ,sp_tz ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone (Ace/Bwb?) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // set marked as Bwb -GAME( 199?, sp_tzfe ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone - Further Encounters (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, sp_cbowl ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Cash Bowl (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_crime ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Crime Watch (Ace) (sp.ACE, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_cw ,sp_crime ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Crime Watch (Ace) (sp.ACE, set 2)",GAME_IS_SKELETON_MECHANICAL ) // roms all contain Emmerdale strings?? +GAME( 199?, sp_emmrd ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Emmerdale (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_goldm ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Mile (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_gnat ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Grand National (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_gprix ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Grand Prix (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_hideh ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Hi De Hi (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_hifly ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Hi Flyer (Ace) [Mps] (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_juras ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Jurassic Trial (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_openb ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Open The Box (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_payrs ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Payrise (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_playa ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 1)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_playaa ,sp_playa ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 2)",GAME_IS_SKELETON_MECHANICAL ) // set was marked as a BWB set +GAME( 199?, sp_playab ,sp_playa ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Play It Again (Ace) (sp.ACE, set 3)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_spell ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Spellbound (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_swop ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Swop Shop (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_timem ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Time Machine (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_tz ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_tzbwb ,sp_tz ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone (Ace/Bwb?) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) // set marked as Bwb +GAME( 199?, sp_tzfe ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Twilight Zone - Further Encounters (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) // these look like sp.ACE roms too -GAME( 199?, sp_beau ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Beau Peep (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_bigbd ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Big Break Deluxe Club (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_brkbk ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Break The Bank (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_camel ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Camelot (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_clbna ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Club National (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_coder ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Code Red (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_criss ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Criss Cross Cash (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_daytr ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Daytripper (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_donky ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Donkey Derby (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_dyour ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Double Your Money (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_festi ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Festival (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_beau2 ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Further Adventures Of Beau Peep (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_ghost ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Ghost Trapper (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_globe ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Globe Trotter (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_gol ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Gol (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_golda ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Arrow Club (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_golds ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Streak (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_goldt ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Touch (Golden Streak?) (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_here ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Here We Go (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_holid ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Holiday Club (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_lotto ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Lotto (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_magmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Magic Money (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_megmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Mega Money (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_monma ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Money Magic (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_monmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Money Mountain (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_nudex ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Nudge Explosion (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_onbox ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "On The Box (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_piste ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "On The Piste (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_pound ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Pound For Pound (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_przna ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Prize National (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_road ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Road To Hell (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_skylm ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Sky's The Limit Club, The (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_tkpik ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Take Your Pick (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sp_woolp ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Woolpack (Emmerdale?) (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // roms all contain Emmerdale strings?? -GAME( 199?, sp_zigzg ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Zig Zag (Emmerdale?) (Ace) (sp.ACE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // roms all contain Emmerdale strings?? +GAME( 199?, sp_beau ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Beau Peep (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_bigbd ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Big Break Deluxe Club (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_brkbk ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Break The Bank (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_camel ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Camelot (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_clbna ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Club National (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_coder ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Code Red (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_criss ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Criss Cross Cash (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_daytr ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Daytripper (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_donky ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Donkey Derby (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_dyour ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Double Your Money (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_festi ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Festival (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_beau2 ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Further Adventures Of Beau Peep (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_ghost ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Ghost Trapper (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_globe ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Globe Trotter (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_gol ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Gol (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_golda ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Arrow Club (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_golds ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Streak (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_goldt ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Golden Touch (Golden Streak?) (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_here ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Here We Go (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_holid ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Holiday Club (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_lotto ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Lotto (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_magmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Magic Money (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_megmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Mega Money (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_monma ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Money Magic (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_monmo ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Money Mountain (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_nudex ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Nudge Explosion (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_onbox ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "On The Box (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_piste ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "On The Piste (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_pound ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Pound For Pound (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_przna ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Prize National (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_road ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Road To Hell (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_skylm ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Sky's The Limit Club, The (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_tkpik ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Take Your Pick (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, sp_woolp ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Woolpack (Emmerdale?) (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) // roms all contain Emmerdale strings?? +GAME( 199?, sp_zigzg ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Ace", "Zig Zag (Emmerdale?) (Ace) (sp.ACE)",GAME_IS_SKELETON_MECHANICAL ) // roms all contain Emmerdale strings?? -GAME( 199?, sp_carry ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Pcp", "Carry On (Pcp) (sp.ACE?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // not sure.. looks like 6303 code to me -GAME( 199?, sp_front ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Bwb", "Final Frontier (Bwb) (sp.ACE?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // not sure.. looks like 6303 code to me +GAME( 199?, sp_carry ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Pcp", "Carry On (Pcp) (sp.ACE?)",GAME_IS_SKELETON_MECHANICAL ) // not sure.. looks like 6303 code to me +GAME( 199?, sp_front ,0 ,ace_sp ,ace_sp ,ace_sp ,ROT0 ,"Bwb", "Final Frontier (Bwb) (sp.ACE?)",GAME_IS_SKELETON_MECHANICAL ) // not sure.. looks like 6303 code to me // I'm not 100% sure if these are Space hardware.. but they seem to be 6303 code at least -GAME(199?, sp_atw ,0 ,ace_sp ,ace_sp ,ace_sp, ROT0, "Crystal","Around The World In Eighty Days (Crystal) (sp.ACE?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, sp_crun ,0 ,ace_sp ,ace_sp ,ace_cr, ROT0, "Crystal","Cash Run (Crystal) (sp.ACE?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, sp_five ,0 ,ace_sp ,ace_sp ,ace_cr, ROT0, "Crystal","Fiver Fever (Crystal) (sp.ACE?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME(199?, sp_atw ,0 ,ace_sp ,ace_sp ,ace_sp, ROT0, "Crystal","Around The World In Eighty Days (Crystal) (sp.ACE?)",GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, sp_crun ,0 ,ace_sp ,ace_sp ,ace_cr, ROT0, "Crystal","Cash Run (Crystal) (sp.ACE?)",GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, sp_five ,0 ,ace_sp ,ace_sp ,ace_cr, ROT0, "Crystal","Fiver Fever (Crystal) (sp.ACE?)",GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/acommand.c mame-0.145/src/mame/drivers/acommand.c --- mame-0.144/src/mame/drivers/acommand.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/acommand.c 2012-02-06 21:30:41.000000000 +0000 @@ -110,7 +110,7 @@ 0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority, int pri_mask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority, int pri_mask) { acommand_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -177,7 +177,7 @@ state->m_ac_vregs = auto_alloc_array(machine, UINT16, 0x80/2); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_tx_tilemap->set_transparent_pen(15); } @@ -203,47 +203,47 @@ /* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/ static const UINT8 led_fill[0x10] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x00,0x00,0x00,0x00,0x00}; -static void draw_led(bitmap_t *bitmap, int x, int y,UINT8 value) +static void draw_led(bitmap_ind16 &bitmap, int x, int y,UINT8 value) { - plot_box(bitmap, x, y, 6, 10, 0x00000000); + bitmap.plot_box(x, y, 6, 10, 0x00000000); /*a*/ - *BITMAP_ADDR16(bitmap, y+0, x+1) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+0, x+2) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+0, x+3) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+1) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+2) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+3) = ((led_fill[value] & 0x0001) ? LED_ON : LED_OFF); /*b*/ - *BITMAP_ADDR16(bitmap, y+1, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+2, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+3, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); + bitmap.pix16(y+1, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); + bitmap.pix16(y+2, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); + bitmap.pix16(y+3, x+4) = ((led_fill[value] & 0x0002) ? LED_ON : LED_OFF); /*c*/ - *BITMAP_ADDR16(bitmap, y+5, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+6, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+7, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); + bitmap.pix16(y+5, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); + bitmap.pix16(y+6, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); + bitmap.pix16(y+7, x+4) = ((led_fill[value] & 0x0004) ? LED_ON : LED_OFF); /*d*/ - *BITMAP_ADDR16(bitmap, y+8, x+1) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+8, x+2) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+8, x+3) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+1) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+2) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+3) = ((led_fill[value] & 0x0008) ? LED_ON : LED_OFF); /*e*/ - *BITMAP_ADDR16(bitmap, y+5, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+6, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+7, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); + bitmap.pix16(y+5, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); + bitmap.pix16(y+6, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); + bitmap.pix16(y+7, x+0) = ((led_fill[value] & 0x0010) ? LED_ON : LED_OFF); /*f*/ - *BITMAP_ADDR16(bitmap, y+1, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+2, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+3, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); + bitmap.pix16(y+1, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); + bitmap.pix16(y+2, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); + bitmap.pix16(y+3, x+0) = ((led_fill[value] & 0x0020) ? LED_ON : LED_OFF); /*g*/ - *BITMAP_ADDR16(bitmap, y+4, x+1) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+4, x+2) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+4, x+3) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+1) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+2) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+3) = ((led_fill[value] & 0x0040) ? LED_ON : LED_OFF); } -static SCREEN_UPDATE( acommand ) +static SCREEN_UPDATE_IND16( acommand ) { - acommand_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect,0,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + acommand_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); /*Order might be wrong,but these for sure are the led numbers tested*/ draw_led(bitmap, 0, 20, (state->m_led0 & 0x0f00) >> 8); @@ -261,14 +261,14 @@ { acommand_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ac_bgvram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( ac_txvram_w ) { acommand_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ac_txvram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER(ac_bgscroll_w) @@ -276,8 +276,8 @@ acommand_state *state = space->machine().driver_data(); switch(offset) { - case 0: tilemap_set_scrollx(state->m_bg_tilemap,0,data); break; - case 1: tilemap_set_scrolly(state->m_bg_tilemap,0,data); break; + case 0: state->m_bg_tilemap->set_scrollx(0,data); break; + case 1: state->m_bg_tilemap->set_scrolly(0,data); break; case 2: /*BG_TILEMAP priority?*/ break; } } @@ -287,8 +287,8 @@ acommand_state *state = space->machine().driver_data(); switch(offset) { - case 0: tilemap_set_scrollx(state->m_tx_tilemap,0,data); break; - case 1: tilemap_set_scrolly(state->m_tx_tilemap,0,data); break; + case 0: state->m_tx_tilemap->set_scrollx(0,data); break; + case 1: state->m_tx_tilemap->set_scrolly(0,data); break; case 2: /*TX_TILEMAP priority?*/ break; } } @@ -602,10 +602,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(acommand) + MCFG_SCREEN_UPDATE_STATIC(acommand) MCFG_GFXDECODE(acommand) MCFG_PALETTE_LENGTH(0x4000) diff -Nru mame-0.144/src/mame/drivers/actfancr.c mame-0.145/src/mame/drivers/actfancr.c --- mame-0.144/src/mame/drivers/actfancr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/actfancr.c 2012-02-06 21:30:40.000000000 +0000 @@ -347,16 +347,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(actfancr) + MCFG_SCREEN_UPDATE_STATIC(actfancr) MCFG_GFXDECODE(actfan) MCFG_PALETTE_LENGTH(768) MCFG_DEVICE_ADD("tilegen1", DECO_BAC06, 0) - deco_bac06_device::set_gfx_region_wide(*device, 2,2,1); + deco_bac06_device::set_gfx_region_wide(*device, 2,2,2); MCFG_DEVICE_ADD("tilegen2", DECO_BAC06, 0) deco_bac06_device::set_gfx_region_wide(*device, 0,0,0); @@ -401,10 +400,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(actfancr) + MCFG_SCREEN_UPDATE_STATIC(actfancr) MCFG_GFXDECODE(triothep) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/adp.c mame-0.145/src/mame/drivers/adp.c --- mame-0.144/src/mame/drivers/adp.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/adp.c 2012-02-06 21:30:34.000000000 +0000 @@ -162,8 +162,7 @@ required_device m_h63484; - virtual void video_start(); - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); /* misc */ UINT8 m_mux_data; @@ -175,37 +174,32 @@ device_t *m_duart; }; -void adp_state::video_start() -{ - VIDEO_START_NAME(generic_bitmapped)(machine()); -} - static H63484_DISPLAY_PIXELS( acrtc_display_pixels ) { - *BITMAP_ADDR16(bitmap, y, x) = data & 0xf; + bitmap.pix16(y, x) = data & 0xf; } -bool adp_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) +UINT32 adp_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bitmap_fill(&bitmap, &cliprect, 0); + bitmap.fill(0, cliprect); /* graphics */ - m_h63484->update_screen(&bitmap, &cliprect); + m_h63484->update_screen(screen, bitmap, cliprect); return 0; } #if 0 -static SCREEN_UPDATE( adp ) +static SCREEN_UPDATE_IND16( adp ) { - adp_state *state = screen->machine().driver_data(); + adp_state *state = screen.machine().driver_data(); state->m_h63484->update_screen(bitmap, cliprect); #if 0 - adp_state *state = screen->machine().driver_data(); + adp_state *state = screen.machine().driver_data(); int x, y, b, src; b = ((hd63484_regs_r(state->m_hd63484, 0xcc/2, 0xffff) & 0x000f) << 16) + hd63484_regs_r(state->m_hd63484, 0xce/2, 0xffff); @@ -216,14 +210,14 @@ { b &= (HD63484_RAM_SIZE - 1); src = hd63484_ram_r(state->m_hd63484, b, 0xffff); - *BITMAP_ADDR16(bitmap, y, x ) = ((src & 0x000f) >> 0) << 0; - *BITMAP_ADDR16(bitmap, y, x + 1) = ((src & 0x00f0) >> 4) << 0; - *BITMAP_ADDR16(bitmap, y, x + 2) = ((src & 0x0f00) >> 8) << 0; - *BITMAP_ADDR16(bitmap, y, x + 3) = ((src & 0xf000) >> 12) << 0; + bitmap.pix16(y, x ) = ((src & 0x000f) >> 0) << 0; + bitmap.pix16(y, x + 1) = ((src & 0x00f0) >> 4) << 0; + bitmap.pix16(y, x + 2) = ((src & 0x0f00) >> 8) << 0; + bitmap.pix16(y, x + 3) = ((src & 0xf000) >> 12) << 0; b++; } } -if (!screen->machine().input().code_pressed(KEYCODE_O)) // debug: toggle window +if (!screen.machine().input().code_pressed(KEYCODE_O)) // debug: toggle window if ((hd63484_regs_r(state->m_hd63484, 0x06/2, 0xffff) & 0x0300) == 0x0300) { int sy = (hd63484_regs_r(state->m_hd63484, 0x94/2, 0xffff) & 0x0fff) - (hd63484_regs_r(state->m_hd63484, 0x88/2, 0xffff) >> 8); @@ -243,10 +237,10 @@ if (x <= w && x + sx >= 0 && x + sx < (hd63484_regs_r(state->m_hd63484, 0xca/2, 0xffff) & 0x0fff) * 4) { - *BITMAP_ADDR16(bitmap, y, x + sx ) = ((src & 0x000f) >> 0) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 1) = ((src & 0x00f0) >> 4) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 2) = ((src & 0x0f00) >> 8) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 3) = ((src & 0xf000) >> 12) << 0; + bitmap.pix16(y, x + sx ) = ((src & 0x000f) >> 0) << 0; + bitmap.pix16(y, x + sx + 1) = ((src & 0x00f0) >> 4) << 0; + bitmap.pix16(y, x + sx + 2) = ((src & 0x0f00) >> 8) << 0; + bitmap.pix16(y, x + sx + 3) = ((src & 0xf000) >> 12) << 0; } b++; } @@ -671,15 +665,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 280) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1) -// MCFG_SCREEN_UPDATE(adp) + MCFG_SCREEN_UPDATE_DRIVER(adp_state, screen_update) MCFG_PALETTE_LENGTH(0x10) MCFG_PALETTE_INIT(adp) -// MCFG_VIDEO_START(adp) MCFG_H63484_ADD("h63484", 0, adp_h63484_intf, adp_h63484_map) @@ -704,15 +696,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 280) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1) -// MCFG_SCREEN_UPDATE(adp) + MCFG_SCREEN_UPDATE_DRIVER(adp_state, screen_update) MCFG_PALETTE_LENGTH(0x10) MCFG_PALETTE_INIT(adp) -// MCFG_VIDEO_START(adp) MCFG_H63484_ADD("h63484", 0, adp_h63484_intf, adp_h63484_map) @@ -736,15 +726,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) -// MCFG_SCREEN_UPDATE(adp) + MCFG_SCREEN_UPDATE_DRIVER(adp_state, screen_update) MCFG_PALETTE_LENGTH(0x10) // MCFG_PALETTE_INIT(adp) -// MCFG_VIDEO_START(adp) MCFG_H63484_ADD("h63484", 0, adp_h63484_intf, adp_h63484_map) diff -Nru mame-0.144/src/mame/drivers/aeroboto.c mame-0.145/src/mame/drivers/aeroboto.c --- mame-0.144/src/mame/drivers/aeroboto.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/aeroboto.c 2012-02-06 21:30:42.000000000 +0000 @@ -270,10 +270,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(aeroboto) + MCFG_SCREEN_UPDATE_STATIC(aeroboto) MCFG_GFXDECODE(aeroboto) diff -Nru mame-0.144/src/mame/drivers/aerofgt.c mame-0.145/src/mame/drivers/aerofgt.c --- mame-0.144/src/mame/drivers/aerofgt.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/aerofgt.c 2012-02-06 21:30:41.000000000 +0000 @@ -1346,10 +1346,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(61.31) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+4, 44*8+4-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(pspikes) + MCFG_SCREEN_UPDATE_STATIC(pspikes) MCFG_GFXDECODE(pspikes) MCFG_PALETTE_LENGTH(2048) @@ -1383,10 +1382,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 320-1, 0*8+4, 224+4-1) - MCFG_SCREEN_UPDATE(spikes91) + MCFG_SCREEN_UPDATE_STATIC(spikes91) MCFG_GFXDECODE(spikes91) MCFG_PALETTE_LENGTH(2048) @@ -1416,10 +1414,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+4, 44*8+4-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(pspikesb) + MCFG_SCREEN_UPDATE_STATIC(pspikesb) MCFG_GFXDECODE(pspikesb) MCFG_PALETTE_LENGTH(2048) @@ -1447,10 +1444,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+4, 44*8+4-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(pspikes) + MCFG_SCREEN_UPDATE_STATIC(pspikes) MCFG_GFXDECODE(pspikes) MCFG_PALETTE_LENGTH(2048) @@ -1483,10 +1479,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 45*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(karatblz) + MCFG_SCREEN_UPDATE_STATIC(karatblz) MCFG_GFXDECODE(turbofrc) MCFG_PALETTE_LENGTH(1024) @@ -1523,10 +1518,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 45*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(spinlbrk) + MCFG_SCREEN_UPDATE_STATIC(spinlbrk) MCFG_GFXDECODE(turbofrc) MCFG_PALETTE_LENGTH(1024) @@ -1563,10 +1557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(61.31) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(turbofrc) + MCFG_SCREEN_UPDATE_STATIC(turbofrc) MCFG_GFXDECODE(turbofrc) MCFG_PALETTE_LENGTH(1024) @@ -1604,10 +1597,9 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(500)) /* wrong but improves sprite-background synchronization */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+12, 40*8-1+12, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(turbofrc) + MCFG_SCREEN_UPDATE_STATIC(turbofrc) MCFG_GFXDECODE(aerofgtb) MCFG_PALETTE_LENGTH(1024) @@ -1645,10 +1637,9 @@ MCFG_SCREEN_REFRESH_RATE(61.31) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(400)) /* wrong but improves sprite-background synchronization */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(aerofgt) + MCFG_SCREEN_UPDATE_STATIC(aerofgt) MCFG_GFXDECODE(aerofgt) MCFG_PALETTE_LENGTH(1024) @@ -1684,10 +1675,9 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(500)) /* wrong but improves sprite-background synchronization */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+12, 40*8-1+12, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(aerfboot) + MCFG_SCREEN_UPDATE_STATIC(aerfboot) MCFG_GFXDECODE(aerfboot) MCFG_PALETTE_LENGTH(1024) @@ -1716,10 +1706,9 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(500)) /* wrong but improves sprite-background synchronization */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+12, 40*8-1+12, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(aerfboo2) + MCFG_SCREEN_UPDATE_STATIC(aerfboo2) MCFG_GFXDECODE(aerfboo2) MCFG_PALETTE_LENGTH(1024) @@ -1750,10 +1739,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8+14, 44*8-1+4, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(wbbc97) + MCFG_SCREEN_UPDATE_STATIC(wbbc97) MCFG_GFXDECODE(wbbc97) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/airbustr.c mame-0.145/src/mame/drivers/airbustr.c --- mame-0.144/src/mame/drivers/airbustr.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/airbustr.c 2012-02-06 21:30:39.000000000 +0000 @@ -658,11 +658,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(airbustr) - MCFG_SCREEN_EOF(airbustr) + MCFG_SCREEN_UPDATE_STATIC(airbustr) + MCFG_SCREEN_VBLANK_STATIC(airbustr) MCFG_GFXDECODE(airbustr) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/ajax.c mame-0.145/src/mame/drivers/ajax.c --- mame-0.144/src/mame/drivers/ajax.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ajax.c 2012-02-06 21:30:37.000000000 +0000 @@ -74,7 +74,7 @@ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30000 150000" ) PORT_DIPSETTING( 0x10, "50000 200000" ) PORT_DIPSETTING( 0x08, "30000" ) @@ -92,7 +92,7 @@ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") // Listed as "unused" and forced to be off in the manual. + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") // Listed as "unused" and forced to be off in the manual. (US) // "Normal Upright / Upright Double" (JP) PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) @@ -229,10 +229,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(ajax) + MCFG_SCREEN_UPDATE_STATIC(ajax) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/albazc.c mame-0.145/src/mame/drivers/albazc.c --- mame-0.144/src/mame/drivers/albazc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/albazc.c 2012-02-06 21:30:40.000000000 +0000 @@ -51,7 +51,7 @@ { } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { albazc_state *state = machine.driver_data(); int i; @@ -77,10 +77,10 @@ } } -static SCREEN_UPDATE(hanaroku) +static SCREEN_UPDATE_IND16(hanaroku) { - bitmap_fill(bitmap, cliprect, 0x1f0); // ??? - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(0x1f0, cliprect); // ??? + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -267,10 +267,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hanaroku) + MCFG_SCREEN_UPDATE_STATIC(hanaroku) MCFG_GFXDECODE(hanaroku) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/albazg.c mame-0.145/src/mame/drivers/albazg.c --- mame-0.144/src/mame/drivers/albazg.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/albazg.c 2012-02-06 21:30:40.000000000 +0000 @@ -83,10 +83,10 @@ state->m_bg_tilemap = tilemap_create(machine, y_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( yumefuda ) +static SCREEN_UPDATE_IND16( yumefuda ) { - albazg_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + albazg_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -112,14 +112,14 @@ { albazg_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( yumefuda_cram_w ) { albazg_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /*Custom RAM (Thrash Protection)*/ @@ -391,10 +391,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE( yumefuda ) + MCFG_SCREEN_UPDATE_STATIC( yumefuda ) MCFG_MC6845_ADD("crtc", H46505, MASTER_CLOCK/16, mc6845_intf) /* hand tuned to get ~60 fps */ diff -Nru mame-0.144/src/mame/drivers/aleck64.c mame-0.145/src/mame/drivers/aleck64.c --- mame-0.144/src/mame/drivers/aleck64.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/aleck64.c 2012-02-06 21:30:42.000000000 +0000 @@ -277,19 +277,21 @@ static ADDRESS_MAP_START( n64_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x007fffff) AM_RAM /*AM_MIRROR(0xc0000000)*/ AM_BASE(&rdram) // RDRAM + + AM_RANGE(0x03f00000, 0x03f00027) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, rdram_reg_r, rdram_reg_w) AM_RANGE(0x04000000, 0x04000fff) AM_RAM AM_SHARE("dmem") // RSP DMEM AM_RANGE(0x04001000, 0x04001fff) AM_RAM AM_SHARE("imem") // RSP IMEM AM_RANGE(0x04040000, 0x040fffff) AM_DEVREADWRITE("rsp", n64_sp_reg_r, n64_sp_reg_w) // RSP AM_RANGE(0x04100000, 0x041fffff) AM_DEVREADWRITE("rsp", n64_dp_reg_r, n64_dp_reg_w) // RDP - AM_RANGE(0x04300000, 0x043fffff) AM_READWRITE(n64_mi_reg_r, n64_mi_reg_w) // MIPS Interface - AM_RANGE(0x04400000, 0x044fffff) AM_READWRITE(n64_vi_reg_r, n64_vi_reg_w) // Video Interface - AM_RANGE(0x04500000, 0x045fffff) AM_READWRITE(n64_ai_reg_r, n64_ai_reg_w) // Audio Interface - AM_RANGE(0x04600000, 0x046fffff) AM_READWRITE(n64_pi_reg_r, n64_pi_reg_w) // Peripheral Interface - AM_RANGE(0x04700000, 0x047fffff) AM_READWRITE(n64_ri_reg_r, n64_ri_reg_w) // RDRAM Interface - AM_RANGE(0x04800000, 0x048fffff) AM_READWRITE(n64_si_reg_r, n64_si_reg_w) // Serial Interface + AM_RANGE(0x04300000, 0x043fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, mi_reg_r, mi_reg_w) // MIPS Interface + AM_RANGE(0x04400000, 0x044fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, vi_reg_r, vi_reg_w) // Video Interface + AM_RANGE(0x04500000, 0x045fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, ai_reg_r, ai_reg_w) // Audio Interface + AM_RANGE(0x04600000, 0x046fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pi_reg_r, pi_reg_w) // Peripheral Interface + AM_RANGE(0x04700000, 0x047fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, ri_reg_r, ri_reg_w) // RDRAM Interface + AM_RANGE(0x04800000, 0x048fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, si_reg_r, si_reg_w) // Serial Interface AM_RANGE(0x10000000, 0x13ffffff) AM_ROM AM_REGION("user2", 0) // Cartridge AM_RANGE(0x1fc00000, 0x1fc007bf) AM_ROM AM_REGION("user1", 0) // PIF ROM - AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_READWRITE(n64_pif_ram_r, n64_pif_ram_w) + AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pif_ram_r, pif_ram_w) /* Surely this should mirror main ram? srmvs crashes, and @@ -821,10 +823,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 525) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239) - MCFG_SCREEN_UPDATE(n64) + MCFG_SCREEN_UPDATE_STATIC(n64) MCFG_PALETTE_LENGTH(0x1000) @@ -836,6 +837,8 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) MCFG_SOUND_ADD("dac2", DMADAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) + + MCFG_N64_PERIPHS_ADD("rcp"); MACHINE_CONFIG_END static DRIVER_INIT( aleck64 ) diff -Nru mame-0.144/src/mame/drivers/alg.c mame-0.145/src/mame/drivers/alg.c --- mame-0.144/src/mame/drivers/alg.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/alg.c 2012-02-06 21:30:34.000000000 +0000 @@ -24,7 +24,7 @@ #include "cpu/m68000/m68000.h" #include "render.h" #include "includes/amiga.h" -#include "machine/laserdsc.h" +#include "machine/ldstub.h" #include "machine/6526cia.h" #include "machine/nvram.h" #include "machine/amigafdc.h" @@ -34,10 +34,11 @@ { public: alg_state(const machine_config &mconfig, device_type type, const char *tag) - : amiga_state(mconfig, type, tag) { } + : amiga_state(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; emu_timer *m_serial_timer; UINT8 m_serial_timer_active; UINT16 m_input_select; @@ -63,8 +64,8 @@ if (xpos == -1 || ypos == -1) return FALSE; - *x = visarea.min_x + xpos * (visarea.max_x - visarea.min_x + 1) / 255; - *y = visarea.min_y + ypos * (visarea.max_y - visarea.min_y + 1) / 255; + *x = visarea.min_x + xpos * visarea.width() / 255; + *y = visarea.min_y + ypos * visarea.height() / 255; return TRUE; } @@ -97,7 +98,6 @@ static MACHINE_START( alg ) { alg_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); state->m_serial_timer = machine.scheduler().timer_alloc(FUNC(response_timer)); state->m_serial_timer_active = FALSE; @@ -122,16 +122,16 @@ alg_state *state = machine.driver_data(); /* if we still have data to send, do it now */ - if (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL) == ASSERT_LINE) + if (state->m_laserdisc->data_available_r() == ASSERT_LINE) { - UINT8 data = laserdisc_data_r(state->m_laserdisc); + UINT8 data = state->m_laserdisc->data_r(); if (data != 0x0a) mame_printf_debug("Sending serial data = %02X\n", data); amiga_serial_in_w(machine, data); } /* if there's more to come, set another timer */ - if (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL) == ASSERT_LINE) + if (state->m_laserdisc->data_available_r() == ASSERT_LINE) state->m_serial_timer->adjust(amiga_get_serial_char_period(machine)); else state->m_serial_timer_active = FALSE; @@ -143,7 +143,7 @@ alg_state *state = machine.driver_data(); /* if we have data available, set a timer to read it */ - if (!state->m_serial_timer_active && laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL) == ASSERT_LINE) + if (!state->m_serial_timer_active && state->m_laserdisc->data_available_r() == ASSERT_LINE) { state->m_serial_timer->adjust(amiga_get_serial_char_period(machine)); state->m_serial_timer_active = TRUE; @@ -156,10 +156,10 @@ alg_state *state = machine.driver_data(); /* write to the laserdisc player */ - laserdisc_data_w(state->m_laserdisc, data & 0xff); + state->m_laserdisc->data_w(data & 0xff); /* if we have data available, set a timer to read it */ - if (!state->m_serial_timer_active && laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL) == ASSERT_LINE) + if (!state->m_serial_timer_active && state->m_laserdisc->data_available_r() == ASSERT_LINE) { state->m_serial_timer->adjust(amiga_get_serial_char_period(machine)); state->m_serial_timer_active = TRUE; @@ -437,12 +437,12 @@ MCFG_MACHINE_RESET(alg) MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_LASERDISC_ADD("laserdisc", SONY_LDP1450, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(amiga, 512*2, 262, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDP1450_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(512*2, 262, amiga) MCFG_LASERDISC_OVERLAY_CLIP((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_SCREEN_REFRESH_RATE(59.997) MCFG_SCREEN_SIZE(512*2, 262) MCFG_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) @@ -461,7 +461,7 @@ MCFG_SOUND_ROUTE(2, "rspeaker", 0.25) MCFG_SOUND_ROUTE(3, "lspeaker", 0.25) - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) diff -Nru mame-0.144/src/mame/drivers/alien.c mame-0.145/src/mame/drivers/alien.c --- mame-0.144/src/mame/drivers/alien.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/alien.c 2012-02-06 21:30:40.000000000 +0000 @@ -13,6 +13,8 @@ ***********************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/sh4/sh4.h" @@ -22,26 +24,40 @@ { public: alien_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + DECLARE_READ64_MEMBER(test_r); + + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); + virtual void video_start(); }; -static VIDEO_START( alien ) +void alien_state::video_start() { } -static SCREEN_UPDATE( alien ) +UINT32 alien_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; } -static READ64_HANDLER( test_r ) +READ64_MEMBER( alien_state::test_r ) { - return space->machine().rand(); + return machine().rand(); } -static ADDRESS_MAP_START( alien_map, AS_PROGRAM, 64 ) +static ADDRESS_MAP_START( alien_map, AS_PROGRAM, 64, alien_state ) AM_RANGE(0x00000000, 0x0003ffff) AM_ROM AM_RANGE(0x08000000, 0x08000007) AM_READ(test_r) //hangs if zero AM_RANGE(0x0cfe0000, 0x0cffffff) AM_RAM @@ -56,9 +72,10 @@ INPUT_PORTS_END -static MACHINE_RESET( alien ) + +void alien_state::machine_reset() { - //cputag_set_input_line(machine, "maincpu", INPUT_LINE_HALT, ASSERT_LINE); + //cputag_set_input_line(machine(), "maincpu", INPUT_LINE_HALT, ASSERT_LINE); } static MACHINE_CONFIG_START( alien, alien_state ) @@ -71,15 +88,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_DRIVER(alien_state, screen_update) MCFG_SCREEN_SIZE((32)*8, (32)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_MACHINE_RESET(alien) - - MCFG_VIDEO_START(alien) - MCFG_SCREEN_UPDATE(alien) - MCFG_PALETTE_LENGTH(0x1000) /* sound hardware */ diff -Nru mame-0.144/src/mame/drivers/aliens.c mame-0.145/src/mame/drivers/aliens.c --- mame-0.144/src/mame/drivers/aliens.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/aliens.c 2012-02-06 21:30:41.000000000 +0000 @@ -283,10 +283,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(aliens) + MCFG_SCREEN_UPDATE_STATIC(aliens) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/allied.c mame-0.145/src/mame/drivers/allied.c --- mame-0.144/src/mame/drivers/allied.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/allied.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m6502.h" @@ -5,10 +7,21 @@ { public: allied_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( allied_map, AS_PROGRAM, 8 ) + +static ADDRESS_MAP_START( allied_map, AS_PROGRAM, 8, allied_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x1400, 0x1fff) AM_ROM @@ -17,7 +30,7 @@ static INPUT_PORTS_START( allied ) INPUT_PORTS_END -static MACHINE_RESET( allied ) +void allied_state::machine_reset() { } @@ -29,10 +42,9 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6504, 3572549/4) MCFG_CPU_PROGRAM_MAP(allied_map) - - MCFG_MACHINE_RESET( allied ) MACHINE_CONFIG_END + ROM_START( allied ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "alliedu5.bin", 0x1400, 0x0400, CRC(e4fb64fb) SHA1(a3d9de7cbfb42180a860e0bbbeaeba96d8bd1e20)) @@ -52,16 +64,16 @@ #define rom_circa33 rom_allied #define rom_starshot rom_allied -GAME(1977, allied, 0, allied, allied, allied, ROT0, "Allied Leisure", "Allied System", GAME_IS_BIOS_ROOT) -GAME(1977, suprpick, allied, allied, allied, allied, ROT0, "Allied Leisure", "Super Picker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1977, royclark, allied, allied, allied, allied, ROT0, "Fascination Int.", "Roy Clark - The Entertainer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1977, thndbolt, allied, allied, allied, allied, ROT0, "Allied Leisure", "Thunderbolt", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, hoedown, allied, allied, allied, allied, ROT0, "Allied Leisure", "Hoe Down", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, takefive, allied, allied, allied, allied, ROT0, "Allied Leisure", "Take Five", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, heartspd, allied, allied, allied, allied, ROT0, "Allied Leisure", "Hearts & Spades", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, foathens, allied, allied, allied, allied, ROT0, "Allied Leisure", "Flame of Athens", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, disco79, allied, allied, allied, allied, ROT0, "Allied Leisure", "Disco '79", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, erosone, allied, allied, allied, allied, ROT0, "Fascination Int.", "Eros One", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, circa33, allied, allied, allied, allied, ROT0, "Fascination Int.", "Circa 1933", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, starshot, allied, allied, allied, allied, ROT0, "Allied Leisure", "Star Shooter", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1977, allied, 0, allied, allied, allied, ROT0, "Allied Leisure", "Allied System", GAME_IS_BIOS_ROOT) +GAME(1977, suprpick, allied, allied, allied, allied, ROT0, "Allied Leisure", "Super Picker", GAME_IS_SKELETON_MECHANICAL) +GAME(1977, royclark, allied, allied, allied, allied, ROT0, "Fascination Int.", "Roy Clark - The Entertainer", GAME_IS_SKELETON_MECHANICAL) +GAME(1977, thndbolt, allied, allied, allied, allied, ROT0, "Allied Leisure", "Thunderbolt", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, hoedown, allied, allied, allied, allied, ROT0, "Allied Leisure", "Hoe Down", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, takefive, allied, allied, allied, allied, ROT0, "Allied Leisure", "Take Five", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, heartspd, allied, allied, allied, allied, ROT0, "Allied Leisure", "Hearts & Spades", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, foathens, allied, allied, allied, allied, ROT0, "Allied Leisure", "Flame of Athens", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, disco79, allied, allied, allied, allied, ROT0, "Allied Leisure", "Disco '79", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, erosone, allied, allied, allied, allied, ROT0, "Fascination Int.", "Eros One", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, circa33, allied, allied, allied, allied, ROT0, "Fascination Int.", "Circa 1933", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, starshot, allied, allied, allied, allied, ROT0, "Allied Leisure", "Star Shooter", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/alpha68k.c mame-0.145/src/mame/drivers/alpha68k.c --- mame-0.144/src/mame/drivers/alpha68k.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/alpha68k.c 2012-02-06 21:30:39.000000000 +0000 @@ -20,6 +20,11 @@ Super Champion Baseball (V board?) SNK/Alpha/Romstar/Sega 1989 The Next Space A8004-1 PIC SNK 1989 +TODO: +- Super Stingray MCU irq controls timer speed, needs the MCU to be hooked up. +- Super Champion Baseball "ball speed" protection +- Fix sound CPU crashes properly on Alpha 68k II / V HW games (nested NMIs) + General notes: All II & V games are 68000, z80 plus a custom Alpha microcontroller, @@ -190,8 +195,8 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "cpu/z80/z80.h" +#include "cpu/mcs48/mcs48.h" #include "sound/ay8910.h" #include "sound/dac.h" #include "sound/3812intf.h" @@ -1830,13 +1835,34 @@ DEVCB_MEMORY_HANDLER("audiocpu", PROGRAM, soundlatch_r) }; +static WRITE8_HANDLER( porta_w ) +{ + alpha68k_state *state = space->machine().driver_data(); + + if(data == 0xff) + return; // skip + + /* guess */ + if(data == 0 && state->m_sound_pa_latch) // 1 -> 0 transition = enables NMI + state->m_sound_nmi_mask = 1; + + if(data && state->m_sound_pa_latch == 0) // 0 -> 1 transition = disables NMI + state->m_sound_nmi_mask = 0; + + state->m_sound_pa_latch = data & 1; +} + static const ym2203_interface ym2203_config = { { AY8910_LEGACY_OUTPUT, AY8910_DEFAULT_LOADS, - DEVCB_MEMORY_HANDLER("audiocpu", PROGRAM, soundlatch_r) - } + DEVCB_MEMORY_HANDLER("audiocpu", PROGRAM, soundlatch_r), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("audiocpu", PROGRAM, porta_w), + DEVCB_NULL + }, + NULL }; static void YM3812_irq( device_t *device, int param ) @@ -1850,14 +1876,6 @@ YM3812_irq }; -static INTERRUPT_GEN( alpha68k_interrupt ) -{ - if (cpu_getiloops(device) == 0) - device_set_input_line(device, 1, HOLD_LINE); - else - device_set_input_line(device, 2, HOLD_LINE); -} -//ZT /******************************************************************************/ @@ -1945,20 +1963,34 @@ } + +static ADDRESS_MAP_START( i8748_portmap, AS_IO, 8 ) +// AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(saiyugoub1_mcu_command_r) +// AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_DEVWRITE("adpcm", saiyugoub1_m5205_clk_w) /* Drives the clock on the m5205 at 1/8 of this frequency */ +// AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(saiyugoub1_m5205_irq_r) +// AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(saiyugoub1_adpcm_rom_addr_w) +// AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_DEVWRITE("adpcm", saiyugoub1_adpcm_control_w) +ADDRESS_MAP_END + + static MACHINE_CONFIG_START( sstingry, alpha68k_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 6000000) /* 24MHz/4? */ MCFG_CPU_PROGRAM_MAP(kyros_map) - MCFG_CPU_VBLANK_INT_HACK(alpha68k_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq1_line_hold) + MCFG_CPU_PERIODIC_INT(irq2_line_hold,60) // MCU irq MCFG_CPU_ADD("audiocpu", Z80, 3579545) MCFG_CPU_PROGRAM_MAP(sstingry_sound_map) MCFG_CPU_IO_MAP(kyros_sound_portmap) -//AT - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold, 2) + MCFG_CPU_PERIODIC_INT(irq0_line_hold, 2*60) MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 4000) -//ZT + + MCFG_CPU_ADD("mcu", I8748, 9263750) /* 9.263750 MHz oscillator, divided by 3*5 internally */ +// MCFG_CPU_PROGRAM_MAP(i8748_map) + MCFG_CPU_IO_MAP(i8748_portmap) + MCFG_DEVICE_DISABLE() MCFG_MACHINE_START(common) MCFG_MACHINE_RESET(common) @@ -1967,19 +1999,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(sstingry) + MCFG_SCREEN_UPDATE_STATIC(sstingry) MCFG_GFXDECODE(sstingry) MCFG_PALETTE_LENGTH(256 + 1) -//AT MCFG_PALETTE_INIT(kyros) -//ZT /* sound hardware */ -//AT MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym1", YM2203, 3000000) @@ -1993,7 +2021,6 @@ MCFG_SOUND_ADD("dac", DAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -//ZT MACHINE_CONFIG_END static MACHINE_CONFIG_START( kyros, alpha68k_state ) @@ -2001,15 +2028,14 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/4) /* Verified on bootleg PCB */ MCFG_CPU_PROGRAM_MAP(kyros_map) - MCFG_CPU_VBLANK_INT_HACK(alpha68k_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq1_line_hold) + MCFG_CPU_PERIODIC_INT(irq2_line_hold,60) // MCU irq MCFG_CPU_ADD("audiocpu", Z80, XTAL_24MHz/6) /* Verified on bootleg PCB */ MCFG_CPU_PROGRAM_MAP(kyros_sound_map) MCFG_CPU_IO_MAP(kyros_sound_portmap) -//AT - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold, 2) + MCFG_CPU_PERIODIC_INT(irq0_line_hold, 2*60) MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 4000) -//ZT MCFG_MACHINE_START(common) MCFG_MACHINE_RESET(common) @@ -2018,10 +2044,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kyros) + MCFG_SCREEN_UPDATE_STATIC(kyros) MCFG_GFXDECODE(kyros) MCFG_PALETTE_LENGTH(256 + 1) @@ -2029,7 +2054,6 @@ MCFG_PALETTE_INIT(kyros) /* sound hardware */ -//AT MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym1", YM2203, XTAL_24MHz/12) /* Verified on bootleg PCB */ @@ -2043,7 +2067,6 @@ MCFG_SOUND_ADD("dac", DAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) -//ZT MACHINE_CONFIG_END static MACHINE_CONFIG_START( jongbou, alpha68k_state ) @@ -2051,12 +2074,13 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) MCFG_CPU_PROGRAM_MAP(kyros_map) - MCFG_CPU_VBLANK_INT_HACK(alpha68k_interrupt,17) // must be at least 4 for the controls to be smooth + MCFG_CPU_VBLANK_INT("screen",irq1_line_hold) + MCFG_CPU_PERIODIC_INT(irq2_line_hold,60*16) // MCU irq MCFG_CPU_ADD("audiocpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(jongbou_sound_map) MCFG_CPU_IO_MAP(jongbou_sound_portmap) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold, 160) // guess, controls sound speed + MCFG_CPU_PERIODIC_INT(irq0_line_hold, 160*60) MCFG_MACHINE_START(common) MCFG_MACHINE_RESET(common) @@ -2065,10 +2089,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kyros) + MCFG_SCREEN_UPDATE_STATIC(kyros) MCFG_GFXDECODE(jongbou) MCFG_PALETTE_LENGTH(256 + 1) @@ -2100,17 +2123,14 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_I) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_I) MCFG_GFXDECODE(paddle) -//AT MCFG_PALETTE_LENGTH(1024) MCFG_PALETTE_INIT(paddlem) -//ZT /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -2120,6 +2140,14 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static INTERRUPT_GEN( alpha68k_sound_nmi ) +{ + alpha68k_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( alpha68k_II, alpha68k_state ) /* basic machine hardware */ @@ -2127,10 +2155,10 @@ MCFG_CPU_PROGRAM_MAP(alpha68k_II_map) MCFG_CPU_VBLANK_INT("screen", irq3_line_hold)/* VBL */ - MCFG_CPU_ADD("audiocpu", Z80, /*3579545*/3579545*2) /* Unlikely but needed to stop nested NMI's */ + MCFG_CPU_ADD("audiocpu", Z80, 3579545*2) /* Unlikely but needed to stop nested NMI's */ MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_CPU_IO_MAP(sound_portmap) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 7500) //AT + MCFG_CPU_PERIODIC_INT(alpha68k_sound_nmi, 7500) MCFG_MACHINE_START(alpha68k_II) MCFG_MACHINE_RESET(alpha68k_II) @@ -2139,10 +2167,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_II) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_II) MCFG_GFXDECODE(alpha68k_II) MCFG_PALETTE_LENGTH(2048) @@ -2165,21 +2192,22 @@ static MACHINE_CONFIG_DERIVED( btlfieldb, alpha68k_II ) MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT_HACK(alpha68k_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq1_line_hold) + MCFG_CPU_PERIODIC_INT(irq2_line_hold,60*4) // MCU irq MACHINE_CONFIG_END -//AT static MACHINE_CONFIG_START( alpha68k_II_gm, alpha68k_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) MCFG_CPU_PROGRAM_MAP(alpha68k_II_map) - MCFG_CPU_VBLANK_INT_HACK(alpha68k_interrupt, 4) + MCFG_CPU_VBLANK_INT("screen",irq1_line_hold) + MCFG_CPU_PERIODIC_INT(irq2_line_hold,60*3) // MCU irq - MCFG_CPU_ADD("audiocpu", Z80, 4000000*2) + MCFG_CPU_ADD("audiocpu", Z80, 4000000*2) // TODO: fix this MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_CPU_IO_MAP(sound_portmap) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 7500) + MCFG_CPU_PERIODIC_INT(alpha68k_sound_nmi, 7500) MCFG_MACHINE_START(alpha68k_II) MCFG_MACHINE_RESET(alpha68k_II) @@ -2188,10 +2216,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_II) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_II) MCFG_GFXDECODE(alpha68k_II) MCFG_PALETTE_LENGTH(2048) @@ -2223,7 +2250,7 @@ MCFG_CPU_ADD("audiocpu", Z80, /*3579545*/3579545*2) /* Unlikely but needed to stop nested NMI's */ MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_CPU_IO_MAP(sound_portmap) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 8500) //AT + MCFG_CPU_PERIODIC_INT(alpha68k_sound_nmi, 8500) MCFG_MACHINE_START(alpha68k_V) MCFG_MACHINE_RESET(alpha68k_V) @@ -2232,10 +2259,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_V) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_V) MCFG_GFXDECODE(alpha68k_V) MCFG_PALETTE_LENGTH(4096) @@ -2266,7 +2292,7 @@ MCFG_CPU_ADD("audiocpu", Z80, /*3579545*/3579545*2) /* Unlikely but needed to stop nested NMI's */ MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_CPU_IO_MAP(sound_portmap) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 8500) //AT + MCFG_CPU_PERIODIC_INT(alpha68k_sound_nmi, 8500) MCFG_MACHINE_START(alpha68k_V) MCFG_MACHINE_RESET(alpha68k_V) @@ -2275,10 +2301,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_V_sb) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_V_sb) MCFG_GFXDECODE(alpha68k_V) MCFG_PALETTE_LENGTH(4096) @@ -2317,10 +2342,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(alpha68k_I) + MCFG_SCREEN_UPDATE_STATIC(alpha68k_I) MCFG_GFXDECODE(tnextspc) @@ -2349,7 +2373,7 @@ ROM_LOAD( "ss_01.rom", 0x0000, 0x4000, CRC(fef09a92) SHA1(77b6aded1eed1bd5e6ffb25b56b62b10b7b9a304) ) ROM_LOAD( "ss_02.rom", 0x4000, 0x4000, CRC(ab4e8c01) SHA1(d96e7f97945fff48fb7b4661fdb575ac7ff77445) ) - ROM_REGION( 0x0400, "cpu2", 0 ) /* 8748 MCU code */ + ROM_REGION( 0x0400, "mcu", 0 ) /* 8748 MCU code */ ROM_LOAD( "d8748.bin", 0x0000, 0x0400, CRC(7fcbfc30) SHA1(6d087a3d44e475b6c8260a5134952097f26459b7) ) ROM_REGION( 0x60000, "gfx1", 0 ) @@ -2485,6 +2509,10 @@ ROM_LOAD( "2s.1f", 0x00000, 0x4000, CRC(800ceb27) SHA1(4daa1b8adcad7a90cfd5d20704a7c431673c4995) ) ROM_LOAD( "1s.1d", 0x04000, 0x8000, CRC(87d3e719) SHA1(4b8b1b600c7c1de3a77030001e7e6f0ff118f294) ) + ROM_REGION( 0x1000, "mcu", 0 ) // these comes from original set + ROM_LOAD( "kyros_68705u3.bin", 0x0000, 0x1000, BAD_DUMP CRC(c20880b7) SHA1(b041c36cbc4f348d74e0548df5cb14727f2d353b) ) // this one is from a bootleg PCB, program code *might* be compatible. + ROM_LOAD( "kyros_mcu.bin", 0x0000, 0x0800, BAD_DUMP CRC(3a902a19) SHA1(af1be8894c899b27b1106663ffaf2ab43fa1cdaa) ) // original MCU? (HD6805U1) + ROM_REGION( 0x60000, "gfx1", 0 ) ROM_LOAD( "8.9r", 0x00000, 0x8000, CRC(d8203284) SHA1(7dede410239be6b674644fa76c91dd01837f841f) ) ROM_LOAD( "11.12m", 0x08000, 0x8000, CRC(a2f9738c) SHA1(31be81274bf70674bf0c32fcddbacf0f58d8f897) ) @@ -2518,6 +2546,9 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "p7.i1", 0x00000, 0x8000, CRC(88d74794) SHA1(98dbbb4d88c1e96a0e251e39ef43b02bd68e0bba) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x30000, "gfx1", 0 ) ROM_LOAD( "p6.l15", 0x00000, 0x10000, CRC(1facee65) SHA1(6c98338c616e53106960063d0d31483131b492b0) ) ROM_LOAD( "p5.k15", 0x10000, 0x10000, CRC(db0ad6bb) SHA1(c2ce0e78a4be9314f4f14ea87f521a79bab3697c) ) @@ -2544,6 +2575,9 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ ROM_LOAD( "padlem.18c", 0x000000, 0x10000, CRC(9269778d) SHA1(bdc9100827f2e018db943d9f7d81b7936c155bf0) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x80000, "gfx1", 0 ) ROM_LOAD( "padlem.16m", 0x00000, 0x10000, CRC(0984fb4d) SHA1(6bc529db93fad277f286e4a380812c40c7f42301) ) ROM_LOAD( "padlem.16n", 0x10000, 0x10000, CRC(4249e047) SHA1(9f35b316b5de65f8b1878fca283c9d534bb8ae25) ) @@ -2578,6 +2612,9 @@ ROM_LOAD( "bf.8", 0x30000, 0x10000, CRC(8a43497b) SHA1(c64519b2aced8b072efdd1a6286f082094a50e61) ) ROM_LOAD( "bf.9", 0x50000, 0x10000, CRC(1408416f) SHA1(d7a32de156791f923635d7fdddc8db97f66bfb2a) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x010000, "gfx1", 0 ) /* chars */ ROM_LOAD( "bf.5", 0x00000, 0x08000, CRC(3cec2f55) SHA1(e4fca0c8193680385c7dd4d6c599492c9e0dd4af) ) ROM_LOAD( "bf.6", 0x08000, 0x08000, CRC(086a364d) SHA1(b008d4b351ada4240dd6c82c45405a2489e36019) ) @@ -2610,6 +2647,9 @@ ROM_LOAD( "bf.8", 0x30000, 0x10000, CRC(8a43497b) SHA1(c64519b2aced8b072efdd1a6286f082094a50e61) ) ROM_LOAD( "bf.9", 0x50000, 0x10000, CRC(1408416f) SHA1(d7a32de156791f923635d7fdddc8db97f66bfb2a) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x010000, "gfx1", 0 ) /* chars */ ROM_LOAD( "bf.5", 0x00000, 0x08000, CRC(3cec2f55) SHA1(e4fca0c8193680385c7dd4d6c599492c9e0dd4af) ) ROM_LOAD( "bf.6", 0x08000, 0x08000, CRC(086a364d) SHA1(b008d4b351ada4240dd6c82c45405a2489e36019) ) @@ -2674,6 +2714,9 @@ ROM_LOAD( "bf.8", 0x30000, 0x10000, CRC(8a43497b) SHA1(c64519b2aced8b072efdd1a6286f082094a50e61) ) ROM_LOAD( "bf.9", 0x50000, 0x10000, CRC(1408416f) SHA1(d7a32de156791f923635d7fdddc8db97f66bfb2a) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x010000, "gfx1", 0 ) /* chars */ ROM_LOAD( "bfv1_05.bin", 0x00000, 0x08000, CRC(be269dbf) SHA1(3240badbf65e076cc1f7caaec1081df9a4371d47) ) ROM_LOAD( "bfv1_06.bin", 0x08000, 0x08000, CRC(022b9de9) SHA1(5a736a4cfe05e7681c78ab816dfe04074fe0293d) ) @@ -2722,6 +2765,9 @@ ROM_LOAD( "ss.8", 0x30000, 0x10000, CRC(e5cf7b37) SHA1(770ee80a1cc0f877486c6b47812db2b1118651d9) ) ROM_LOAD( "ss.9", 0x50000, 0x10000, CRC(76124ca2) SHA1(5b87178ab663cd8aa67670f0c14c9cbb8616b04d) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x010000, "gfx1", 0 ) /* chars */ ROM_LOAD( "ss.5", 0x00000, 0x08000, CRC(928ba287) SHA1(c415c5b84b83ee0e5e0aa60eb33132145fcd7487) ) ROM_LOAD( "ss.6", 0x08000, 0x08000, CRC(93b30b55) SHA1(51cacc48f4a298131852d41da80126bda5988920) ) @@ -2768,6 +2814,9 @@ ROM_CONTINUE( 0x10000, 0x78000 ) #endif + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x80000, "audiocpu", 0 ) // banking is slightly different from other Alpha68kII games ROM_LOAD( "38.bin", 0x00000, 0x08000, BAD_DUMP CRC(4bf251b8) SHA1(d69a6607e92dbe8081c7c66b6853f02d578ef73f) ) // we use the bootleg set instead ROM_CONTINUE( 0x18000, 0x08000 ) @@ -2801,6 +2850,9 @@ ROM_LOAD( "40.bin", 0x30000, 0x10000, BAD_DUMP CRC(8dafc4e8) SHA1(7d4898557ad638ab8461060bc7ae406d7d24c5a4) ) ROM_LOAD( "1.bin", 0x40000, 0x10000, BAD_DUMP CRC(1e78062c) SHA1(821c037edf32eb8b03e5c487d3bab0622337e80b) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x010000, "gfx1", 0 ) /* chars */ ROM_LOAD( "gm.5", 0x000000, 0x08000, CRC(667f33f1) SHA1(6d05603b49927f09c9bb34e787b003eceaaf7062) ) ROM_LOAD( "gm.6", 0x008000, 0x08000, CRC(56020b13) SHA1(17e176a9c82ed0d6cb5c4014034ce4e16b8ef4fb) ) @@ -2859,6 +2911,9 @@ ROM_LOAD( "sa.5", 0x50000, 0x10000, CRC(11cdb868) SHA1(6cd9c7952b4789e819272cbe0623f3e6f607b7eb) ) ROM_LOAD( "sa.6", 0x70000, 0x08000, CRC(237d93fd) SHA1(4c65169e4ce6a9be229410bbfd9b823060a829d7) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "sa.7", 0x000000, 0x08000, CRC(ea26e9c5) SHA1(13cb5a5955c813cd48f98f62f045a4cbc61806a1) ) @@ -2881,6 +2936,9 @@ ROM_LOAD( "sa.5", 0x50000, 0x10000, CRC(11cdb868) SHA1(6cd9c7952b4789e819272cbe0623f3e6f607b7eb) ) ROM_LOAD( "sa.6", 0x70000, 0x08000, CRC(237d93fd) SHA1(4c65169e4ce6a9be229410bbfd9b823060a829d7) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "sa.7", 0x000000, 0x08000, CRC(ea26e9c5) SHA1(13cb5a5955c813cd48f98f62f045a4cbc61806a1) ) @@ -2903,6 +2961,9 @@ ROM_LOAD( "sa.5", 0x50000, 0x10000, CRC(11cdb868) SHA1(6cd9c7952b4789e819272cbe0623f3e6f607b7eb) ) ROM_LOAD( "sa.6", 0x70000, 0x08000, CRC(237d93fd) SHA1(4c65169e4ce6a9be229410bbfd9b823060a829d7) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "sa.7", 0x000000, 0x08000, CRC(ea26e9c5) SHA1(13cb5a5955c813cd48f98f62f045a4cbc61806a1) ) @@ -2929,6 +2990,9 @@ ROM_LOAD( "gw-10.13f", 0x50000, 0x10000, CRC(eb305d42) SHA1(93910cf60c1b8a87969888d8693c7d6782f1e799) ) ROM_LOAD( "gw-9.15f", 0x70000, 0x10000, CRC(84e5c946) SHA1(0b071d15b664a9c529713b1b896bdb5ebfa16c25) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "gw-13.4l", 0x000000, 0x10000, CRC(b75bf1d0) SHA1(c22c0049274c45701be0a7be2afc0517620a3a10) ) @@ -3005,6 +3069,9 @@ ROM_LOAD( "u10", 0x50000, 0x10000, CRC(636978ae) SHA1(5d8093bc43192c89e230af318609222a69866b6e) ) ROM_LOAD( "u9", 0x70000, 0x10000, CRC(9136745e) SHA1(d7a2bfeac69ab2dbd4565a5bd1abb1f3f1199b42) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "gwb_ic.m19", 0x000000, 0x10000, CRC(b75bf1d0) SHA1(c22c0049274c45701be0a7be2afc0517620a3a10) ) @@ -3031,6 +3098,9 @@ ROM_LOAD( "snksb5.bin", 0x50000, 0x10000, CRC(f45ee36f) SHA1(cdfdf696e9fcd2827ab1dd6adc2a45085911333d) ) ROM_LOAD( "snksb6.bin", 0x70000, 0x10000, CRC(651c9472) SHA1(bcff6679e22143cd6816c441c5a67b4956ee7ee0) ) + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + ROM_REGION( 0x020000, "gfx1", 0 ) /* chars */ ROM_LOAD( "snksb7.bin", 0x000000, 0x10000, CRC(8f3c2e25) SHA1(a5b3880f3079cce607678fd4ea5971560ce9ed8d) ) @@ -3267,7 +3337,7 @@ /******************************************************************************/ -GAME( 1986, sstingry, 0, sstingry, sstingry, sstingry, ROT90, "Alpha Denshi Co.", "Super Stingray", GAME_SUPPORTS_SAVE ) +GAME( 1986, sstingry, 0, sstingry, sstingry, sstingry, ROT90, "Alpha Denshi Co.", "Super Stingray (Japan)", GAME_SUPPORTS_SAVE | GAME_UNEMULATED_PROTECTION ) GAME( 1987, kyros, 0, kyros, kyros, kyros, ROT90, "Alpha Denshi Co. (World Games Inc. license)", "Kyros", GAME_SUPPORTS_SAVE ) GAME( 1986, kyrosj, kyros, kyros, kyros, kyros, ROT90, "Alpha Denshi Co.", "Kyros No Yakata (Japan)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/alvg.c mame-0.145/src/mame/drivers/alvg.c --- mame-0.144/src/mame/drivers/alvg.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/alvg.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m65ce02.h" @@ -5,11 +7,21 @@ { public: alvg_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( alvg_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( alvg_map, AS_PROGRAM, 8, alvg_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x3fff) AM_RAM AM_RANGE(0x4000, 0xffff) AM_ROM @@ -18,7 +30,7 @@ static INPUT_PORTS_START( alvg ) INPUT_PORTS_END -static MACHINE_RESET( alvg ) +void alvg_state::machine_reset() { } @@ -30,8 +42,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M65C02, 2000000) MCFG_CPU_PROGRAM_MAP(alvg_map) - - MCFG_MACHINE_RESET( alvg ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -229,11 +239,12 @@ ROM_RELOAD(0x000000 + 0xc0000, 0x40000) ROM_END -GAME(1991, agsoccer, 0, alvg, alvg, alvg, ROT0, "Alvin G", "A.G. Soccer Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, wrldtour, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, wrldtour2, wrldtour, alvg, alvg, alvg, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour R02b", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, usafootb, 0, alvg, alvg, alvg, ROT0, "Alvin G", "U.S.A. Football", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, mystcast, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Mystery Castle", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, pstlpkr, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Pistol Poker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, punchy, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Punchy The Clown", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, dinoeggs, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Dinosaur Eggs", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1991, agsoccer, 0, alvg, alvg, alvg, ROT0, "Alvin G", "A.G. Soccer Ball", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, wrldtour, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, wrldtour2, wrldtour, alvg, alvg, alvg, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour R02b", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, usafootb, 0, alvg, alvg, alvg, ROT0, "Alvin G", "U.S.A. Football", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, mystcast, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Mystery Castle", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, pstlpkr, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Pistol Poker", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, punchy, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Punchy The Clown", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, dinoeggs, 0, alvg, alvg, alvg, ROT0, "Alvin G", "Dinosaur Eggs", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/amaticmg.c mame-0.145/src/mame/drivers/amaticmg.c --- mame-0.144/src/mame/drivers/amaticmg.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/amaticmg.c 2012-02-06 21:30:34.000000000 +0000 @@ -406,7 +406,7 @@ { } -static SCREEN_UPDATE( amaticmg ) +static SCREEN_UPDATE_IND16( amaticmg ) { return 0; } @@ -686,10 +686,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(amaticmg) + MCFG_SCREEN_UPDATE_STATIC(amaticmg) // MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/ambush.c mame-0.145/src/mame/drivers/ambush.c --- mame-0.144/src/mame/drivers/ambush.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/ambush.c 2012-02-06 21:30:41.000000000 +0000 @@ -238,10 +238,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-3) /* The -3 makes the cocktail mode perfect */ - MCFG_SCREEN_UPDATE(ambush) + MCFG_SCREEN_UPDATE_STATIC(ambush) MCFG_GFXDECODE(ambush) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/ampoker2.c mame-0.145/src/mame/drivers/ampoker2.c --- mame-0.144/src/mame/drivers/ampoker2.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/ampoker2.c 2012-02-06 21:30:37.000000000 +0000 @@ -1180,10 +1180,9 @@ /* if VBLANK is used, the watchdog timer stop to work. MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(20*8, 56*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(ampoker2) + MCFG_SCREEN_UPDATE_STATIC(ampoker2) MCFG_GFXDECODE(ampoker2) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/amspdwy.c mame-0.145/src/mame/drivers/amspdwy.c --- mame-0.144/src/mame/drivers/amspdwy.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/amspdwy.c 2012-02-06 21:30:40.000000000 +0000 @@ -290,10 +290,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(amspdwy) + MCFG_SCREEN_UPDATE_STATIC(amspdwy) MCFG_GFXDECODE(amspdwy) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/angelkds.c mame-0.145/src/mame/drivers/angelkds.c --- mame-0.144/src/mame/drivers/angelkds.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/angelkds.c 2012-02-06 21:30:34.000000000 +0000 @@ -24,7 +24,6 @@ can do) Unknown Reads / Writes Whats the Prom for? nothing important? -Clock Speeds etc. Is the level order correct? the progress sprite on the side of the screen re-appears at the bottom when you get to the top, but the wrap-around is needed for other things, actual game bug? @@ -606,12 +605,12 @@ static MACHINE_CONFIG_START( angelkds, angelkds_state ) - MCFG_CPU_ADD("maincpu", Z80, 8000000) /* 8MHz? 6 seems too slow? */ + MCFG_CPU_ADD("maincpu", Z80, XTAL_6MHz) MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_portmap) MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) - MCFG_CPU_ADD("sub", Z80, 4000000) /* 8 MHz? */ + MCFG_CPU_ADD("sub", Z80, XTAL_4MHz) MCFG_CPU_PROGRAM_MAP(sub_map) MCFG_CPU_IO_MAP(sub_portmap) @@ -624,10 +623,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(angelkds) + MCFG_SCREEN_UPDATE_STATIC(angelkds) MCFG_GFXDECODE(angelkds) MCFG_PALETTE_LENGTH(0x100) @@ -636,14 +634,14 @@ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ym1", YM2203, 4000000) + MCFG_SOUND_ADD("ym1", YM2203, XTAL_4MHz) MCFG_SOUND_CONFIG(ym2203_config) MCFG_SOUND_ROUTE(0, "mono", 0.65) MCFG_SOUND_ROUTE(1, "mono", 0.65) MCFG_SOUND_ROUTE(2, "mono", 0.65) MCFG_SOUND_ROUTE(3, "mono", 0.45) - MCFG_SOUND_ADD("ym2", YM2203, 4000000) + MCFG_SOUND_ADD("ym2", YM2203, XTAL_4MHz) MCFG_SOUND_ROUTE(0, "mono", 0.65) MCFG_SOUND_ROUTE(1, "mono", 0.65) MCFG_SOUND_ROUTE(2, "mono", 0.65) diff -Nru mame-0.144/src/mame/drivers/appoooh.c mame-0.145/src/mame/drivers/appoooh.c --- mame-0.144/src/mame/drivers/appoooh.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/appoooh.c 2012-02-06 21:30:35.000000000 +0000 @@ -421,13 +421,21 @@ state->m_priority = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + appoooh_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( appoooh_common, appoooh_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,18432000/6) /* ??? the main xtal is 18.432 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(appoooh) MCFG_MACHINE_RESET(appoooh) @@ -456,10 +464,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(appoooh) + MCFG_SCREEN_UPDATE_STATIC(appoooh) MCFG_GFXDECODE(appoooh) MCFG_PALETTE_LENGTH(32*8+32*8) @@ -475,10 +482,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(robowres) + MCFG_SCREEN_UPDATE_STATIC(robowres) MCFG_GFXDECODE(robowres) MCFG_PALETTE_LENGTH(32*8+32*8) diff -Nru mame-0.144/src/mame/drivers/aquarium.c mame-0.145/src/mame/drivers/aquarium.c --- mame-0.144/src/mame/drivers/aquarium.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/aquarium.c 2012-02-06 21:30:41.000000000 +0000 @@ -20,31 +20,16 @@ YM2151 M6295 4 32MHz 1 Z80-6 5 SW2Q -*/ - -/* To Do (top are higher priorities) - -Controls + Dipswitches *done* - stephh -Verify Z80 program banking -Fix Priority Problems *done* - Pierpaolo Prazzoli -Merge with gcpinbal.c (and clean up gcpinbal.c) - -Note, a bug in the program code causes the OKI to be reset on the very -first coin inserted. - - -Stephh's notes (based on the game M68000 code and some tests) : - - - The current set is a Japan set (0x0a5c.w = 0x0000), so there must exist - a non-Japan set which is AFAIK not dumped at the moment. - I have however no clue about what should be the value in the non-Japan set. - - Use AQUARIUS_HACK to be able to change the game to English language - via the FAKE Dip Switch. - Change the Dip Switch then reset the game to make the changes effective. - - I haven't found a way to enter sort of "test mode", even if there seems - to be code (or at least data) for it. +To Do: +- Merge with gcpinbal.c (and clean up gcpinbal.c) +Notes: +- A bug in the program code causes the OKI to be reset on the very + first coin inserted. +- The current dump is Japanese. The game also includes English text, + so it may have been released overseas too. Use cheat/debugger and + set RAM[0x000a5c / 2] to 1 to be able to change the game to English. */ @@ -56,21 +41,6 @@ #include "sound/okim6295.h" #include "includes/aquarium.h" -#define AQUARIUS_HACK 0 - - -#if AQUARIUS_HACK -static MACHINE_RESET( aquarium_hack ) -{ - UINT16 *RAM = (UINT16 *)machine.region("maincpu")->base(); - int data = input_port_read(machine, "FAKE"); - - /* Language : 0x0000 = Japanese - Other value = English */ - - RAM[0x000a5c / 2] = data; - -} -#endif static READ16_HANDLER( aquarium_coins_r ) { @@ -214,7 +184,7 @@ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* used in testmode, but not in game? */ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) @@ -222,26 +192,19 @@ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* used in testmode, but not in game? */ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START1 ) PORT_START("SYSTEM") - PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* untested */ + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_TILT ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE( 0x1000, IP_ACTIVE_LOW ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* sound status */ - -#if AQUARIUS_HACK - PORT_START("FAKE") /* FAKE DSW to support language */ - PORT_DIPNAME( 0xffff, 0x0001, DEF_STR( Language ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Japanese ) ) - PORT_DIPSETTING( 0x0001, DEF_STR( English ) ) // This is a guess of what should be the value -#endif INPUT_PORTS_END static const gfx_layout char5bpplayout = @@ -353,20 +316,16 @@ { aquarium_state *state = machine.driver_data(); state->m_aquarium_snd_ack = 0; - -#if AQUARIUS_HACK - MACHINE_RESET_CALL(aquarium_hack); -#endif } static MACHINE_CONFIG_START( aquarium, aquarium_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000, 32000000/2) + MCFG_CPU_ADD("maincpu", M68000, XTAL_32MHz/2) // clock not verified on pcb MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_VBLANK_INT("screen", irq1_line_hold) - MCFG_CPU_ADD("audiocpu", Z80, 6000000) + MCFG_CPU_ADD("audiocpu", Z80, XTAL_32MHz/6) // clock not verified on pcb MCFG_CPU_PROGRAM_MAP(snd_map) MCFG_CPU_IO_MAP(snd_portmap) @@ -377,10 +336,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 42*8-1, 2*8, 34*8-1) - MCFG_SCREEN_UPDATE(aquarium) + MCFG_SCREEN_UPDATE_STATIC(aquarium) MCFG_GFXDECODE(aquarium) MCFG_PALETTE_LENGTH(0x1000/2) @@ -390,7 +348,7 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ymsnd", YM2151, 3579545) + MCFG_SOUND_ADD("ymsnd", YM2151, XTAL_14_31818MHz/4) // clock not verified on pcb MCFG_SOUND_CONFIG(ym2151_config) MCFG_SOUND_ROUTE(0, "lspeaker", 0.45) MCFG_SOUND_ROUTE(1, "rspeaker", 0.45) @@ -404,9 +362,8 @@ ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_WORD_SWAP( "aquar3", 0x000000, 0x080000, CRC(344509a1) SHA1(9deb610732dee5066b3225cd7b1929b767579235) ) - ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 (sound) code */ + ROM_REGION( 0x40000, "audiocpu", 0 ) /* z80 (sound) code */ ROM_LOAD( "aquar5", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) ) - ROM_RELOAD( 0x010000, 0x40000 ) ROM_REGION( 0x100000, "gfx1", 0 ) /* BG Tiles */ ROM_LOAD( "aquar1", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp @@ -430,8 +387,4 @@ ROM_LOAD( "aquar4", 0x000000, 0x80000, CRC(9a4af531) SHA1(bb201b7a6c9fd5924a0d79090257efffd8d4aba1) ) ROM_END -#if !AQUARIUS_HACK GAME( 1996, aquarium, 0, aquarium, aquarium, aquarium, ROT0, "Excellent System", "Aquarium (Japan)", GAME_SUPPORTS_SAVE | GAME_NO_COCKTAIL ) -#else -GAME( 1996, aquarium, 0, aquarium, aquarium, aquarium, ROT0, "Excellent System", "Aquarium", GAME_SUPPORTS_SAVE | GAME_NO_COCKTAIL ) -#endif diff -Nru mame-0.144/src/mame/drivers/arabian.c mame-0.145/src/mame/drivers/arabian.c --- mame-0.144/src/mame/drivers/arabian.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/arabian.c 2012-02-06 21:30:33.000000000 +0000 @@ -382,10 +382,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 11, 244) - MCFG_SCREEN_UPDATE(arabian) + MCFG_SCREEN_UPDATE_STATIC(arabian) MCFG_PALETTE_LENGTH(256*32) diff -Nru mame-0.144/src/mame/drivers/arcadecl.c mame-0.145/src/mame/drivers/arcadecl.c --- mame-0.144/src/mame/drivers/arcadecl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/arcadecl.c 2012-02-06 21:30:37.000000000 +0000 @@ -341,11 +341,10 @@ MCFG_PALETTE_LENGTH(512) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240) - MCFG_SCREEN_UPDATE(arcadecl) + MCFG_SCREEN_UPDATE_STATIC(arcadecl) MCFG_VIDEO_START(arcadecl) diff -Nru mame-0.144/src/mame/drivers/arcadia.c mame-0.145/src/mame/drivers/arcadia.c --- mame-0.144/src/mame/drivers/arcadia.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/arcadia.c 2012-02-06 21:30:36.000000000 +0000 @@ -312,10 +312,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.997) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512*2, 262) MCFG_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) - MCFG_SCREEN_UPDATE(amiga) + MCFG_SCREEN_UPDATE_STATIC(amiga) MCFG_PALETTE_LENGTH(4096) MCFG_PALETTE_INIT(amiga) diff -Nru mame-0.144/src/mame/drivers/argus.c mame-0.145/src/mame/drivers/argus.c --- mame-0.144/src/mame/drivers/argus.c 2012-01-13 15:34:32.000000000 +0000 +++ mame-0.145/src/mame/drivers/argus.c 2012-02-06 21:30:41.000000000 +0000 @@ -557,10 +557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* This value is referred to psychic5 driver */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(argus) + MCFG_SCREEN_UPDATE_STATIC(argus) MCFG_GFXDECODE(argus) MCFG_PALETTE_LENGTH(896) @@ -602,10 +601,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* This value is referred to psychic5 driver */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(valtric) + MCFG_SCREEN_UPDATE_STATIC(valtric) MCFG_GFXDECODE(valtric) MCFG_PALETTE_LENGTH(768) @@ -647,10 +645,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* This value is taken from psychic5 driver */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(butasan) + MCFG_SCREEN_UPDATE_STATIC(butasan) MCFG_GFXDECODE(butasan) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/aristmk4.c mame-0.145/src/mame/drivers/aristmk4.c --- mame-0.144/src/mame/drivers/aristmk4.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/aristmk4.c 2012-02-06 21:30:41.000000000 +0000 @@ -331,10 +331,10 @@ } } -static SCREEN_UPDATE(aristmk4) +static SCREEN_UPDATE_IND16(aristmk4) { - aristmk4_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + aristmk4_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int x,y; int count = 0; int color; @@ -350,7 +350,7 @@ color = ((state->m_mkiv_vram[count]) & 0xe0) >> 5; tile = (state->m_mkiv_vram[count+1]|state->m_mkiv_vram[count]<<8) & 0x3ff; bgtile = (state->m_mkiv_vram[count+1]|state->m_mkiv_vram[count]<<8) & 0xff; // first 256 tiles - uBackgroundColour(screen->machine()); // read sw7 + uBackgroundColour(screen.machine()); // read sw7 gfx_element_decode(gfx, bgtile); // force the machine to update only the first 256 tiles. // as we only update the background, not the entire display. flipx = ((state->m_mkiv_vram[count]) & 0x04); @@ -587,7 +587,7 @@ static const char *const meter_sample_names[] = { "*aristmk4", - "tick.wav", + "tick", 0 }; @@ -1674,7 +1674,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 304-1, 0, 216-1) /* from the crtc registers... updated by crtc */ @@ -1683,7 +1682,7 @@ MCFG_PALETTE_INIT(aristmk4) MCFG_VIDEO_START(aristmk4) - MCFG_SCREEN_UPDATE(aristmk4) + MCFG_SCREEN_UPDATE_STATIC(aristmk4) MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf1 ) MCFG_VIA6522_ADD("via6522_0", 0, via_interface) /* 1 MHz.(only 1 or 2 MHz.are valid) */ diff -Nru mame-0.144/src/mame/drivers/aristmk5.c mame-0.145/src/mame/drivers/aristmk5.c --- mame-0.144/src/mame/drivers/aristmk5.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/aristmk5.c 2012-02-06 21:30:41.000000000 +0000 @@ -428,14 +428,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 400) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1) MCFG_PALETTE_LENGTH(0x200) MCFG_VIDEO_START(archimds_vidc) - MCFG_SCREEN_UPDATE(archimds_vidc) + MCFG_SCREEN_UPDATE_STATIC(archimds_vidc) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac0", DAC, 0) @@ -475,14 +474,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 400) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1) MCFG_PALETTE_LENGTH(0x200) MCFG_VIDEO_START(archimds_vidc) - MCFG_SCREEN_UPDATE(archimds_vidc) + MCFG_SCREEN_UPDATE_STATIC(archimds_vidc) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac0", DAC, 0) diff -Nru mame-0.144/src/mame/drivers/aristmk6.c mame-0.145/src/mame/drivers/aristmk6.c --- mame-0.144/src/mame/drivers/aristmk6.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/aristmk6.c 2012-02-06 21:30:41.000000000 +0000 @@ -27,43 +27,43 @@ { } -SCREEN_UPDATE(aristmk6) +SCREEN_UPDATE_RGB32(aristmk6) { - aristmk6_state *state = screen->machine().driver_data(); + aristmk6_state *state = screen.machine().driver_data(); int x,y,count; - const UINT8 *blit_ram = screen->machine().region("maincpu")->base(); + const UINT8 *blit_ram = screen.machine().region("maincpu")->base(); - if(screen->machine().input().code_pressed(KEYCODE_Z)) + if(screen.machine().input().code_pressed(KEYCODE_Z)) state->m_test_x++; - if(screen->machine().input().code_pressed(KEYCODE_X)) + if(screen.machine().input().code_pressed(KEYCODE_X)) state->m_test_x--; - if(screen->machine().input().code_pressed(KEYCODE_A)) + if(screen.machine().input().code_pressed(KEYCODE_A)) state->m_test_y++; - if(screen->machine().input().code_pressed(KEYCODE_S)) + if(screen.machine().input().code_pressed(KEYCODE_S)) state->m_test_y--; - if(screen->machine().input().code_pressed(KEYCODE_Q)) + if(screen.machine().input().code_pressed(KEYCODE_Q)) state->m_start_offs+=0x2000; - if(screen->machine().input().code_pressed(KEYCODE_W)) + if(screen.machine().input().code_pressed(KEYCODE_W)) state->m_start_offs-=0x2000; - if(screen->machine().input().code_pressed(KEYCODE_E)) + if(screen.machine().input().code_pressed(KEYCODE_E)) state->m_start_offs++; - if(screen->machine().input().code_pressed(KEYCODE_R)) + if(screen.machine().input().code_pressed(KEYCODE_R)) state->m_start_offs--; - if(screen->machine().input().code_pressed_once(KEYCODE_L)) + if(screen.machine().input().code_pressed_once(KEYCODE_L)) state->m_type^=1; popmessage("%d %d %04x %d",state->m_test_x,state->m_test_y,state->m_start_offs,state->m_type); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = (state->m_start_offs); @@ -86,8 +86,8 @@ g = (g << 2) | (g & 3); b = (b << 3) | (b & 0x7); - if((x)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = r | g<<8 | b<<16; + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = r | g<<8 | b<<16; count+=2; } @@ -97,8 +97,8 @@ color = blit_ram[count]; - if((x)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = screen->machine().pens[color]; + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = screen.machine().pens[color]; count++; } @@ -144,10 +144,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE(aristmk6) + MCFG_SCREEN_UPDATE_STATIC(aristmk6) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/arkanoid.c mame-0.145/src/mame/drivers/arkanoid.c --- mame-0.144/src/mame/drivers/arkanoid.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/arkanoid.c 2012-02-06 21:30:36.000000000 +0000 @@ -1036,10 +1036,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(arkanoid) + MCFG_SCREEN_UPDATE_STATIC(arkanoid) MCFG_GFXDECODE(arkanoid) MCFG_PALETTE_LENGTH(512) @@ -1070,10 +1069,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hexa) + MCFG_SCREEN_UPDATE_STATIC(hexa) MCFG_GFXDECODE(hexa) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/armedf.c mame-0.145/src/mame/drivers/armedf.c --- mame-0.144/src/mame/drivers/armedf.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/armedf.c 2012-02-06 21:30:40.000000000 +0000 @@ -725,7 +725,7 @@ armedf_state *state = space->machine().driver_data(); state->m_text_videoram[offset] = (data & 0xff) | (state->m_text_videoram[offset] & 0xff00); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_scrollx_w ) @@ -1209,13 +1209,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) @@ -1259,13 +1258,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1304,13 +1302,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) // 320 x 240, trusted MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1349,13 +1346,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) MCFG_VIDEO_START(armedf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1394,13 +1390,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1439,13 +1434,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1484,13 +1478,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) MCFG_VIDEO_START(terraf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) @@ -1544,13 +1537,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) MCFG_VIDEO_START(armedf) - MCFG_SCREEN_UPDATE(armedf) - MCFG_SCREEN_EOF(armedf) + MCFG_SCREEN_UPDATE_STATIC(armedf) + MCFG_SCREEN_VBLANK_STATIC(armedf) MCFG_GFXDECODE(armedf) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/artmagic.c mame-0.145/src/mame/drivers/artmagic.c --- mame-0.144/src/mame/drivers/artmagic.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/artmagic.c 2012-02-06 21:30:36.000000000 +0000 @@ -498,7 +498,8 @@ "screen", /* the screen operated on */ MASTER_CLOCK_40MHz/6, /* pixel clock */ 1, /* pixels per clock */ - artmagic_scanline, /* scanline update */ + NULL, /* scanline update (indexed16) */ + artmagic_scanline, /* scanline update (rgb32) */ m68k_gen_int, /* generate interrupt */ artmagic_to_shiftreg, /* write to shiftreg function */ artmagic_from_shiftreg /* read from shiftreg function */ @@ -857,9 +858,8 @@ MCFG_VIDEO_START(artmagic) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_40MHz/6, 428, 0, 320, 313, 0, 256) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1036,7 +1036,7 @@ 2x 27c1001 eproms 2x mk48t08b-15 timekeeper RAM -- common adp i/o board (see adp.c ) with MC68681 an YM2149F +- common adp i/o board (see adp.c ) with MC68681 and YM2149F - lamp board with triacs diff -Nru mame-0.144/src/mame/drivers/ashnojoe.c mame-0.145/src/mame/drivers/ashnojoe.c --- mame-0.144/src/mame/drivers/ashnojoe.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ashnojoe.c 2012-02-06 21:30:42.000000000 +0000 @@ -369,10 +369,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(14*8, 50*8-1, 3*8, 29*8-1) - MCFG_SCREEN_UPDATE(ashnojoe) + MCFG_SCREEN_UPDATE_STATIC(ashnojoe) MCFG_GFXDECODE(ashnojoe) MCFG_PALETTE_LENGTH(0x1000/2) diff -Nru mame-0.144/src/mame/drivers/asterix.c mame-0.145/src/mame/drivers/asterix.c --- mame-0.144/src/mame/drivers/asterix.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/asterix.c 2012-02-06 21:30:37.000000000 +0000 @@ -314,10 +314,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(asterix) + MCFG_SCREEN_UPDATE_STATIC(asterix) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/asteroid.c mame-0.145/src/mame/drivers/asteroid.c --- mame-0.144/src/mame/drivers/asteroid.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/asteroid.c 2012-02-06 21:30:42.000000000 +0000 @@ -264,12 +264,12 @@ AM_RANGE(0x2400, 0x2407) AM_READ(asteroid_IN1_r) /* IN1 */ AM_RANGE(0x2800, 0x2803) AM_READ(asteroid_DSW1_r) /* DSW1 */ AM_RANGE(0x2c00, 0x2c0f) AM_DEVREADWRITE("pokey", pokey_r, pokey_w) - AM_RANGE(0x2c40, 0x2c7f) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x2c40, 0x2c7f) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x3000, 0x3000) AM_WRITE(avgdvg_go_w) - AM_RANGE(0x3200, 0x323f) AM_DEVWRITE("earom", atari_vg_earom_w) + AM_RANGE(0x3200, 0x323f) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) AM_RANGE(0x3400, 0x3400) AM_WRITE(watchdog_reset_w) AM_RANGE(0x3600, 0x3600) AM_DEVWRITE("discrete", asteroid_explode_w) - AM_RANGE(0x3a00, 0x3a00) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) + AM_RANGE(0x3a00, 0x3a00) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) AM_RANGE(0x3c00, 0x3c01) AM_WRITE(astdelux_led_w) AM_RANGE(0x3c03, 0x3c03) AM_DEVWRITE("discrete", astdelux_sounds_w) AM_RANGE(0x3c04, 0x3c04) AM_WRITE(astdelux_bank_switch_w) @@ -624,7 +624,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(400,300) MCFG_SCREEN_VISIBLE_AREA(522, 1566, 394, 1182) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(dvg) @@ -675,7 +675,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_VISIBLE_AREA(522, 1566, 270, 1070) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(dvg) @@ -792,6 +792,19 @@ ROM_LOAD( "prom.bin", 0x0000, 0x0100, CRC(9e237193) SHA1(f663e12d5db0fa50ea49d03591475ae0a7168bc0) ) ROM_END +ROM_START( hyperspc ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "035145-01.bin", 0x6800, 0x0800, CRC(e9bfda64) SHA1(291dc567ebb31b35df83d9fb87f4080f251ff9c8) ) + ROM_LOAD( "035144-01.bin", 0x7000, 0x0800, CRC(e53c28a9) SHA1(d9f081e73511ec43377f0c6457747f15a470d4dc) ) + ROM_LOAD( "035143-01.bin", 0x7800, 0x0800, CRC(7d4e3d05) SHA1(d88000e904e158efde50e453e2889ecd2cb95f24) ) + /* Vector ROM */ + ROM_LOAD( "035127-01.bin", 0x5000, 0x0800, CRC(7dec48bd) SHA1(8bc926a763ff80b101b2e1c24d45615c3daf67d5) ) + + /* DVG PROM */ + ROM_REGION( 0x100, "user1", 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) +ROM_END + ROM_START( astdelux ) ROM_REGION( 0x8000, "maincpu", 0 ) @@ -943,9 +956,10 @@ GAME( 1979, asteroid2,asteroid, asteroid, asteroid, 0, ROT0, "Atari", "Asteroids (rev 2)", GAME_SUPPORTS_SAVE ) GAME( 1979, asteroid1,asteroid, asteroid, asteroid, 0, ROT0, "Atari", "Asteroids (rev 1)", GAME_SUPPORTS_SAVE ) GAME( 1979, asteroidb,asteroid, asteroid, asteroidb,asteroidb,ROT0, "bootleg", "Asteroids (bootleg on Lunar Lander hardware)", GAME_SUPPORTS_SAVE ) -GAME( 1979, asterock, asteroid, asterock, asterock, asterock, ROT0, "bootleg (Sidam)", "Asterock", GAME_SUPPORTS_SAVE ) -GAME( 1979, meteorts, asteroid, asteroid, asteroid, 0, ROT0, "bootleg (VGG)", "Meteorites (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) -GAME( 1980, meteorho, asteroid, asteroid, asteroid, 0, ROT0, "bootleg (Hoei)", "Meteor (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) +GAME( 1979, asterock, asteroid, asterock, asterock, asterock, ROT0, "bootleg (Sidam)", "Asterock (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) +GAME( 1979, meteorts, asteroid, asteroid, asteroid, 0, ROT0, "bootleg (VGG)", "Meteorites (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) +GAME( 1979, meteorho, asteroid, asteroid, asteroid, 0, ROT0, "bootleg (Hoei)", "Meteor (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) +GAME( 1979, hyperspc, asteroid, asteroid, asteroid, 0, ROT0, "bootleg (Rumiano)", "Hyperspace (bootleg of Asteroids)", GAME_SUPPORTS_SAVE ) GAMEL(1980, astdelux, 0, astdelux, astdelux, 0, ROT0, "Atari", "Asteroids Deluxe (rev 3)", GAME_SUPPORTS_SAVE, layout_ho88ffff ) GAMEL(1980, astdelux2,astdelux, astdelux, astdelux, 0, ROT0, "Atari", "Asteroids Deluxe (rev 2)", GAME_SUPPORTS_SAVE, layout_ho88ffff ) GAMEL(1980, astdelux1,astdelux, astdelux, astdelux, 0, ROT0, "Atari", "Asteroids Deluxe (rev 1)", GAME_SUPPORTS_SAVE, layout_ho88ffff ) diff -Nru mame-0.144/src/mame/drivers/astinvad.c mame-0.145/src/mame/drivers/astinvad.c --- mame-0.144/src/mame/drivers/astinvad.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/astinvad.c 2012-02-06 21:30:38.000000000 +0000 @@ -134,47 +134,47 @@ * *************************************/ -static void plot_byte( running_machine &machine, bitmap_t *bitmap, UINT8 y, UINT8 x, UINT8 data, UINT8 color ) +static void plot_byte( running_machine &machine, bitmap_rgb32 &bitmap, UINT8 y, UINT8 x, UINT8 data, UINT8 color ) { astinvad_state *state = machine.driver_data(); pen_t fore_pen = MAKE_RGB(pal1bit(color >> 0), pal1bit(color >> 2), pal1bit(color >> 1)); UINT8 flip_xor = state->m_screen_flip & 7; - *BITMAP_ADDR32(bitmap, y, x + (0 ^ flip_xor)) = (data & 0x01) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (1 ^ flip_xor)) = (data & 0x02) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (2 ^ flip_xor)) = (data & 0x04) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (3 ^ flip_xor)) = (data & 0x08) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (4 ^ flip_xor)) = (data & 0x10) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (5 ^ flip_xor)) = (data & 0x20) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (6 ^ flip_xor)) = (data & 0x40) ? fore_pen : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x + (7 ^ flip_xor)) = (data & 0x80) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (0 ^ flip_xor)) = (data & 0x01) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (1 ^ flip_xor)) = (data & 0x02) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (2 ^ flip_xor)) = (data & 0x04) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (3 ^ flip_xor)) = (data & 0x08) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (4 ^ flip_xor)) = (data & 0x10) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (5 ^ flip_xor)) = (data & 0x20) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (6 ^ flip_xor)) = (data & 0x40) ? fore_pen : RGB_BLACK; + bitmap.pix32(y, x + (7 ^ flip_xor)) = (data & 0x80) ? fore_pen : RGB_BLACK; } -static SCREEN_UPDATE( astinvad ) +static SCREEN_UPDATE_RGB32( astinvad ) { - astinvad_state *state = screen->machine().driver_data(); - const UINT8 *color_prom = screen->machine().region("proms")->base(); + astinvad_state *state = screen.machine().driver_data(); + const UINT8 *color_prom = screen.machine().region("proms")->base(); UINT8 yoffs = state->m_flip_yoffs & state->m_screen_flip; int x, y; /* render the visible pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - for (x = cliprect->min_x & ~7; x <= cliprect->max_x; x += 8) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (x = cliprect.min_x & ~7; x <= cliprect.max_x; x += 8) { UINT8 color = color_prom[((y & 0xf8) << 2) | (x >> 3)] >> (state->m_screen_flip ? 0 : 4); UINT8 data = state->m_videoram[(((y ^ state->m_screen_flip) + yoffs) << 5) | ((x ^ state->m_screen_flip) >> 3)]; - plot_byte(screen->machine(), bitmap, y, x, data, state->m_screen_red ? 1 : color); + plot_byte(screen.machine(), bitmap, y, x, data, state->m_screen_red ? 1 : color); } return 0; } -static SCREEN_UPDATE( spaceint ) +static SCREEN_UPDATE_RGB32( spaceint ) { - astinvad_state *state = screen->machine().driver_data(); - const UINT8 *color_prom = screen->machine().region("proms")->base(); + astinvad_state *state = screen.machine().driver_data(); + const UINT8 *color_prom = screen.machine().region("proms")->base(); int offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -189,7 +189,7 @@ offs_t n = ((offs >> 5) & 0xf0) | color; color = color_prom[n] & 0x07; - plot_byte(screen->machine(), bitmap, y, x, data, color); + plot_byte(screen.machine(), bitmap, y, x, data, color); } return 0; @@ -558,15 +558,15 @@ static const char *const astinvad_sample_names[] = { "*invaders", - "0.wav", - "1.wav", - "2.wav", - "3.wav", - "4.wav", - "5.wav", - "6.wav", - "7.wav", - "8.wav", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", 0 }; @@ -599,9 +599,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 320, 0, 256, 256, 32, 256) - MCFG_SCREEN_UPDATE(astinvad) + MCFG_SCREEN_UPDATE_STATIC(astinvad) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -635,11 +634,10 @@ MCFG_VIDEO_START(spaceint) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(spaceint) + MCFG_SCREEN_UPDATE_STATIC(spaceint) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/astrafr.c mame-0.145/src/mame/drivers/astrafr.c --- mame-0.144/src/mame/drivers/astrafr.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/astrafr.c 2012-02-06 21:30:39.000000000 +0000 @@ -1786,203 +1786,203 @@ } // Single games? -GAME( 200?, as_srb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V004)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_srba, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V100)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_srbb, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V101)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_srbc, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V201)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_srbd, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V202)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_srbe, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V203)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_srb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V004)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_srba, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V100)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_srbb, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V101)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_srbc, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V201)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_srbd, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V202)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_srbe, as_srb , astra_single, astrafr, 0, ROT0, "Astra", "Super Ring a Bell (Astra, V203)", GAME_IS_SKELETON_MECHANICAL) // Linked games (single rom per CPU with master/slave?) -GAME( 200?, as_party, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V105)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_partya, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V110)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_partyb, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V112)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_partyc, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V206)" ,GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_partyd, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V401)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // significantly different set -GAME( 200?, as_partye, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V907)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_partyf, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V906)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_letsp, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Let's Party (Astra, V904)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_topsl, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V103)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_topsla, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V104)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_topslb, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V201)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_topslc, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V203)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_topsld, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V205)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_party, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V105)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_partya, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V110)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_partyb, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V112)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_partyc, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V206)" ,GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_partyd, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V401)", GAME_IS_SKELETON_MECHANICAL) // significantly different set +GAME( 200?, as_partye, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V907)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_partyf, as_party , astrafr_dual, astrafr, 0, ROT0, "Astra", "Party Time (Astra, V906)", GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_letsp, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Let's Party (Astra, V904)", GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_topsl, 0 , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V103)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_topsla, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V104)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_topslb, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V201)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_topslc, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V203)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_topsld, as_topsl , astrafr_dual, astrafr, 0, ROT0, "Astra", "Top Slot (Astra, V205)", GAME_IS_SKELETON_MECHANICAL) // Other HW? (has u1/u2 pairing) -GAME( 200?, as_bigtm, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "Big Time (Astra, V003)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_acp, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "unknown Astra 'ACP' (Astra, V403)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // no sound data in here? -GAME( 200?, as_celeb, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V100)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_celeba, as_celeb , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V101)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_celebb, as_celeb , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V201)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_bigtm, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "Big Time (Astra, V003)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_acp, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "unknown Astra 'ACP' (Astra, V403)", GAME_IS_SKELETON_MECHANICAL) // no sound data in here? +GAME( 200?, as_celeb, 0 , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V100)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_celeba, as_celeb , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V101)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_celebb, as_celeb , astra_single , astrafr, astradec, ROT0, "Astra", "Celebration (Astra, V201)", GAME_IS_SKELETON_MECHANICAL) // u1/u2 pairing and Linked? -GAME( 200?, as_hc, 0 , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V107)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hca, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V109)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hcb, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V110)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hcc, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V111)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hcd, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V909)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_hc, 0 , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V107)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hca, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V109)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hcb, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V110)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hcc, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V111)", GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hcd, as_hc , astrafr_dual , astrafr, astradec_dual, ROT0, "Astra", "Hokey Cokey (Astra, V909)", GAME_IS_SKELETON_MECHANICAL) // Non-Astra, same hw? -GAME( 200?, as_cshah, 0 , astra_single , astrafr, astradec, ROT0, "Lowen", "Cash Ahoi (Lowen, V105)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_cshah, 0 , astra_single , astrafr, astradec, ROT0, "Lowen", "Cash Ahoi (Lowen, V105)", GAME_IS_SKELETON_MECHANICAL) -GAME( 200?, as_big10, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V500)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BB96 -GAME( 200?, as_big10a, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V503)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BB96 -GAME( 200?, as_big10b, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V507)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BB96 -GAME( 200?, as_big10c, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V601)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BB96 -GAME( 200?, as_big10d, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V605)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BB96 -GAME( 200?, as_big15, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big 15 (Astra, V101)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // DL98 -GAME( 200?, as_bigcs, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big Cash (Astra, V101)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CF97/CF98 -GAME( 200?, as_bigcsa, as_bigcs , astra_single, astrafr, 0, ROT0, "Astra", "Big Cash (Astra, V103)", GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CF97/CF98 - -GAME( 200?, as_bbr, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FA00/CU98 -GAME( 200?, as_bbra, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V102,alt)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FA00/CU98 -GAME( 200?, as_bbrb, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V201)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FA00/CU98 -GAME( 200?, as_bbrc, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V003)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CU98 -GAME( 200?, as_bbrd, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CU98 -GAME( 200?, as_bbre, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V105)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FG01 -GAME( 200?, as_bbrf, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V004)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FN01 - -GAME( 200?, as_dblcs, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V110)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BR97 -GAME( 200?, as_dblcsa, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V112)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BR97 -GAME( 200?, as_dblcsb, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V108)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // BR97 -GAME( 200?, as_dblcsc, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V109)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CN97 -GAME( 200?, as_dblcsd, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // CN97 -GAME( 200?, as_dblcse, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FB00 -GAME( 200?, as_dblcsf, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V100)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FB00 -GAME( 200?, as_dblcsg, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V100, alt)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // DN98 -GAME( 200?, as_dblcsh, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V004)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // FO01 - -GAME( 200?, as_fortn, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Fortune Teller (Astra, V009)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_gof, 0 , astra_single, astrafr, astradec, ROT0, "Lowen", "Game Of Fortune (Lowen, V208)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hog, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Hearts Of Gold (Astra, V002)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hxr, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Hot Cross Run (Astra, V108)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_hr, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Hot Reel (Astra, V004)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_djp, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Double Jackpot (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_djpa, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Double Jackpot (Astra, V004)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_djpb, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Double Jackpot (Astra, V109)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_cshcs, 0 , astra_single, astrafr, 0, ROT0, "Lowen", "Cash Castle (Lowen, V006)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_colmn, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Colour Of Money (Astra, V200)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_colmna, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_colmnb, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V108)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_colmnc, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V109)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_colmnd, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V908)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jackb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jackpot Bell (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jpx, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V100)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jpxa, as_jpx , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jpxb, as_jpx , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V002)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jolly, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jolly Roger (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jmpj, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jumping Jackpots (Astra, V100)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jmpja, as_jmpj , astra_single, astrafr, 0, ROT0, "Astra", "Jumping Jackpots (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjive, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjivea, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjiveb, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjivec, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjived, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjivee, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V101, alt)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjivef, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V004)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_jjiveg, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V005)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_kingc, 0 , astra_single, astrafr, 0, ROT0, "Astra", "King Cash (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_kingca, as_kingc , astra_single, astrafr, 0, ROT0, "Astra", "King Cash (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_koc, 0 , astra_single, astrafr, 0, ROT0, "Astra", "King Of Clubs (Astra, V200)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_koca, as_koc , astra_single, astrafr, 0, ROT0, "Astra", "King Of Clubs (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_lbt, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Little Big 10 (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_lbta, as_lbt , astra_single, astrafr, 0, ROT0, "Astra", "Little Big 10 (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_ldl, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V700)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ldla, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V600)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ldlb, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V312)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ldlc, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V003)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ldld, as_ldl , astra_single, astrafr, 0, ROT0, "Astra", "Little Devils (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ldle, as_ldl , astra_single, astrafr, 0, ROT0, "Astra", "Little Devils (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_mp, 0 , astra_single, astrafr, astradec, ROT0, "Lowen", "Mission Possible (Lowen, V118)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_mp2, 0 , astra_single, astrafr, 0, ROT0, "Lowen", "Mission Possible 2 (Lowen, V114)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_otr, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Over The Rainbow (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_otra, as_otr , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Over The Rainbow (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // incomplete set -GAME( 200?, as_ptf, 0 , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // strange extra sound(?) roms in here -GAME( 200?, as_ptfa, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V803)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ptfb, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V905)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ptfc, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_pia, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V202)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_piaa, as_pia , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V206)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_piab, as_pia , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V904)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_pharg, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V005)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_pharga, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_phargb, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_phargc, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_phargd, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_pharge, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_pb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Piggy Banking (Astra, V105)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 200?, as_big10, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V500)", GAME_IS_SKELETON_MECHANICAL) // BB96 +GAME( 200?, as_big10a, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V503)", GAME_IS_SKELETON_MECHANICAL) // BB96 +GAME( 200?, as_big10b, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V507)", GAME_IS_SKELETON_MECHANICAL) // BB96 +GAME( 200?, as_big10c, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V601)", GAME_IS_SKELETON_MECHANICAL) // BB96 +GAME( 200?, as_big10d, as_big10 , astra_single, astrafr, 0, ROT0, "Astra", "Big 10 (Astra, V605)", GAME_IS_SKELETON_MECHANICAL) // BB96 +GAME( 200?, as_big15, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big 15 (Astra, V101)", GAME_IS_SKELETON_MECHANICAL) // DL98 +GAME( 200?, as_bigcs, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Big Cash (Astra, V101)", GAME_IS_SKELETON_MECHANICAL) // CF97/CF98 +GAME( 200?, as_bigcsa, as_bigcs , astra_single, astrafr, 0, ROT0, "Astra", "Big Cash (Astra, V103)", GAME_IS_SKELETON_MECHANICAL) // CF97/CF98 + +GAME( 200?, as_bbr, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) // FA00/CU98 +GAME( 200?, as_bbra, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V102,alt)" , GAME_IS_SKELETON_MECHANICAL) // FA00/CU98 +GAME( 200?, as_bbrb, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V201)" , GAME_IS_SKELETON_MECHANICAL) // FA00/CU98 +GAME( 200?, as_bbrc, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V003)" , GAME_IS_SKELETON_MECHANICAL) // CU98 +GAME( 200?, as_bbrd, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) // CU98 +GAME( 200?, as_bbre, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V105)" , GAME_IS_SKELETON_MECHANICAL) // FG01 +GAME( 200?, as_bbrf, as_bbr , astra_single, astrafr, 0, ROT0, "Astra", "Bullion Bars (Astra, V004)" , GAME_IS_SKELETON_MECHANICAL) // FN01 + +GAME( 200?, as_dblcs, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V110)" , GAME_IS_SKELETON_MECHANICAL) // BR97 +GAME( 200?, as_dblcsa, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V112)" , GAME_IS_SKELETON_MECHANICAL) // BR97 +GAME( 200?, as_dblcsb, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V108)" , GAME_IS_SKELETON_MECHANICAL) // BR97 +GAME( 200?, as_dblcsc, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V109)" , GAME_IS_SKELETON_MECHANICAL) // CN97 +GAME( 200?, as_dblcsd, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) // CN97 +GAME( 200?, as_dblcse, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) // FB00 +GAME( 200?, as_dblcsf, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V100)" , GAME_IS_SKELETON_MECHANICAL) // FB00 +GAME( 200?, as_dblcsg, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V100, alt)" , GAME_IS_SKELETON_MECHANICAL) // DN98 +GAME( 200?, as_dblcsh, as_dblcs , astra_single, astrafr, 0, ROT0, "Astra", "Double Cash (Astra, V004)" , GAME_IS_SKELETON_MECHANICAL) // FO01 + +GAME( 200?, as_fortn, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Fortune Teller (Astra, V009)" , GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_gof, 0 , astra_single, astrafr, astradec, ROT0, "Lowen", "Game Of Fortune (Lowen, V208)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hog, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Hearts Of Gold (Astra, V002)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hxr, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Hot Cross Run (Astra, V108)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_hr, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Hot Reel (Astra, V004)" , GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_djp, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Double Jackpot (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_djpa, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Double Jackpot (Astra, V004)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_djpb, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Double Jackpot (Astra, V109)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_cshcs, 0 , astra_single, astrafr, 0, ROT0, "Lowen", "Cash Castle (Lowen, V006)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_colmn, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Colour Of Money (Astra, V200)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_colmna, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_colmnb, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V108)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_colmnc, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V109)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_colmnd, as_colmn , astra_single, astrafr, 0, ROT0, "Astra", "Colour Of Money (Astra, V908)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jackb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jackpot Bell (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jpx, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V100)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jpxa, as_jpx , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jpxb, as_jpx , astra_single, astrafr, astradec, ROT0, "Astra", "Jackpot X (Astra, V002)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jolly, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jolly Roger (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jmpj, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Jumping Jackpots (Astra, V100)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jmpja, as_jmpj , astra_single, astrafr, 0, ROT0, "Astra", "Jumping Jackpots (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjive, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjivea, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjiveb, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjivec, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjived, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjivee, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V101, alt)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjivef, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V004)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_jjiveg, as_jjive , astra_single, astrafr, astradec, ROT0, "Astra", "Jungle Jive (Astra, V005)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_kingc, 0 , astra_single, astrafr, 0, ROT0, "Astra", "King Cash (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_kingca, as_kingc , astra_single, astrafr, 0, ROT0, "Astra", "King Cash (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_koc, 0 , astra_single, astrafr, 0, ROT0, "Astra", "King Of Clubs (Astra, V200)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_koca, as_koc , astra_single, astrafr, 0, ROT0, "Astra", "King Of Clubs (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_lbt, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Little Big 10 (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_lbta, as_lbt , astra_single, astrafr, 0, ROT0, "Astra", "Little Big 10 (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_ldl, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V700)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ldla, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V600)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ldlb, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V312)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ldlc, as_ldl , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Little Devils (Astra, V003)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ldld, as_ldl , astra_single, astrafr, 0, ROT0, "Astra", "Little Devils (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ldle, as_ldl , astra_single, astrafr, 0, ROT0, "Astra", "Little Devils (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_mp, 0 , astra_single, astrafr, astradec, ROT0, "Lowen", "Mission Possible (Lowen, V118)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_mp2, 0 , astra_single, astrafr, 0, ROT0, "Lowen", "Mission Possible 2 (Lowen, V114)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_otr, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Over The Rainbow (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_otra, as_otr , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Over The Rainbow (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) // incomplete set +GAME( 200?, as_ptf, 0 , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) // strange extra sound(?) roms in here +GAME( 200?, as_ptfa, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V803)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ptfb, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra, V905)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ptfc, as_ptf , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Astra", "Party Fruits (Astra)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_pia, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V202)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_piaa, as_pia , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V206)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_piab, as_pia , astra_single, astrafr, 0, ROT0, "Astra", "Pay It Again (Astra, V904)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_pharg, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V005)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_pharga, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_phargb, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_phargc, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_phargd, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_pharge, as_pharg , astra_single, astrafr, astradec, ROT0, "Astra", "Pharaoh's Gold (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_pb, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Piggy Banking (Astra, V105)" , GAME_IS_SKELETON_MECHANICAL) // this might be another mix of master / slave sets, and multiple games.... -GAME( 200?, as_rtr, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtra, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 1)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrb, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 2)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrc, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 3)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrd, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V100, )" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtre, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V100, alt)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrf, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V200)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrg, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V200, alt)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rtrh, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V202)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_rab, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V105)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_raba, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rabb, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rabc, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbg, 0 , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V304)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbga, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V303)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbgb, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbgc, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbgd, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbge, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V008)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rbglo, 0 , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Lowen", "River Boat Gambler (Lowen, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_rox, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Roll X (Astra, V006)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_csv, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Slot Slant (?) (Astra, V202)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_sltcl, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Slots Classic (?) (Astra)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_stp, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_stpa, as_stp , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_stpb, as_stp , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V105)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_siu, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Step It Up (Astra, V202)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // extra sound roms(?) in this set -GAME( 200?, as_siua, as_siu , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Step It Up (Astra, V203)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_sld, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V700)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_slda, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V600)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_sldb, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V500)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_sldc, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V400)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_sldd, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V200)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_slde, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tem, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Temptation (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tema, as_tem , astra_single, astrafr, astradec, ROT0, "Astra", "Temptation (Astra, V006)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tbl, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tbla, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V105)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tblb, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tblc, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tbld, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V304)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tble, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V303)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_tblf, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V301)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_td, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Twin Dragons (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 200?, as_twp, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Twin Pots (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_twpa, as_twp , astra_single, astrafr, 0, ROT0, "Astra", "Twin Pots (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vn, 0 , astrafr_dual, astrafr, astradec_dual, ROT0, "Astra", "Vegas Nights (Astra, V205)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcv, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V005)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcva, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V107)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcvb, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V106)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcvc, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcvd, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_vcve, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V101)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ww, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V203)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_wwa, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V204)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_wwb, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V205)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_wwc, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V104)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_wwd, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V103)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_wwe, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V102)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 200?, as_ws, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Win Streak (Astra, V100)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // incomplete dump +GAME( 200?, as_rtr, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtra, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 1)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrb, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 2)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrc, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V101, alt 3)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrd, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V100, )" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtre, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V100, alt)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrf, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V200)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrg, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V200, alt)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rtrh, as_rtr , astra_single, astrafr, astradec, ROT0, "Astra", "Ready To Roll (Astra, V202)" , GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_rab, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V105)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_raba, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rabb, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rabc, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "Ring A Bell (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbg, 0 , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V304)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbga, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V303)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbgb, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbgc, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbgd, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbge, as_rab , astra_single, astrafr, 0, ROT0, "Astra", "River Boat Gambler (Astra, V008)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rbglo, 0 , astrafr_dual, astrafr, astradec_sml_dual, ROT0, "Lowen", "River Boat Gambler (Lowen, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_rox, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Roll X (Astra, V006)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_csv, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Slot Slant (?) (Astra, V202)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_sltcl, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Slots Classic (?) (Astra)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_stp, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_stpa, as_stp , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_stpb, as_stp , astra_single, astrafr, astradec, ROT0, "Astra", "Stampede (Astra, V105)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_siu, 0 , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Step It Up (Astra, V202)" , GAME_IS_SKELETON_MECHANICAL) // extra sound roms(?) in this set +GAME( 200?, as_siua, as_siu , astra_single, astrafr, astradec_sml, ROT0, "Astra", "Step It Up (Astra, V203)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_sld, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V700)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_slda, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V600)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_sldb, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V500)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_sldc, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V400)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_sldd, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V200)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_slde, as_sld , astra_single, astrafr, 0, ROT0, "Astra", "Super Little Devil (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tem, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Temptation (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tema, as_tem , astra_single, astrafr, astradec, ROT0, "Astra", "Temptation (Astra, V006)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tbl, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tbla, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V105)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tblb, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tblc, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tbld, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V304)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tble, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V303)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_tblf, as_tbl , astra_single, astrafr, 0, ROT0, "Astra", "Triple Bells (Astra, V301)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_td, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Twin Dragons (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) + +GAME( 200?, as_twp, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Twin Pots (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_twpa, as_twp , astra_single, astrafr, 0, ROT0, "Astra", "Twin Pots (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vn, 0 , astrafr_dual, astrafr, astradec_dual, ROT0, "Astra", "Vegas Nights (Astra, V205)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcv, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V005)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcva, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V107)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcvb, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V106)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcvc, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcvd, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_vcve, as_vcv , astra_single, astrafr, astradec, ROT0, "Astra", "Viva Cash Vegas (Astra, V101)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ww, 0 , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V203)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_wwa, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V204)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_wwb, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V205)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_wwc, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V104)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_wwd, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V103)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_wwe, as_ww , astra_single, astrafr, 0, ROT0, "Astra", "Wicked Willy (Astra, V102)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 200?, as_ws, 0 , astra_single, astrafr, astradec, ROT0, "Astra", "Win Streak (Astra, V100)" , GAME_IS_SKELETON_MECHANICAL) // incomplete dump diff -Nru mame-0.144/src/mame/drivers/astrocde.c mame-0.145/src/mame/drivers/astrocde.c --- mame-0.144/src/mame/drivers/astrocde.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/astrocde.c 2012-02-06 21:30:41.000000000 +0000 @@ -1245,11 +1245,11 @@ static const char *const seawolf_sample_names[] = { "*seawolf", - "shiphit.wav", - "torpedo.wav", - "dive.wav", - "sonar.wav", - "minehit.wav", + "shiphit", + "torpedo", + "dive", + "sonar", + "minehit", 0 }; @@ -1305,10 +1305,9 @@ MCFG_PALETTE_LENGTH(512) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(ASTROCADE_CLOCK, 455, 0, 352, 262, 0, 240) MCFG_SCREEN_DEFAULT_POSITION(1.1, 0.0, 1.18, -0.018) /* clip out borders */ - MCFG_SCREEN_UPDATE(astrocde) + MCFG_SCREEN_UPDATE_STATIC(astrocde) MCFG_PALETTE_INIT(astrocde) MCFG_VIDEO_START(astrocde) @@ -1327,7 +1326,7 @@ MCFG_VIDEO_START(profpac) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(profpac) + MCFG_SCREEN_UPDATE_STATIC(profpac) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/astrocorp.c mame-0.145/src/mame/drivers/astrocorp.c --- mame-0.144/src/mame/drivers/astrocorp.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/astrocorp.c 2012-02-06 21:30:41.000000000 +0000 @@ -30,7 +30,6 @@ *************************************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "machine/eeprom.h" #include "machine/ticket.h" @@ -49,7 +48,7 @@ size_t m_spriteram_size; /* video-related */ - bitmap_t * m_bitmap; + bitmap_ind16 m_bitmap; UINT16 m_screen_enable; UINT16 m_draw_sprites; }; @@ -62,9 +61,9 @@ { astrocorp_state *state = machine.driver_data(); - state->m_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap); - state->save_item(NAME(*state->m_bitmap)); + state->save_item(NAME(state->m_bitmap)); state->save_item (NAME(state->m_screen_enable)); state->save_item (NAME(state->m_draw_sprites)); } @@ -91,7 +90,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { astrocorp_state *state = machine.driver_data(); UINT16 *source = state->m_spriteram; @@ -139,14 +138,14 @@ } } -static SCREEN_UPDATE(astrocorp) +static SCREEN_UPDATE_IND16(astrocorp) { - astrocorp_state *state = screen->machine().driver_data(); + astrocorp_state *state = screen.machine().driver_data(); if (state->m_screen_enable & 1) copybitmap(bitmap, state->m_bitmap, 0,0,0,0, cliprect); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -164,7 +163,7 @@ UINT16 now = COMBINE_DATA(&state->m_draw_sprites); if (!old && now) - draw_sprites(space->machine(), state->m_bitmap, &space->machine().primary_screen->visible_area()); + draw_sprites(space->machine(), state->m_bitmap, space->machine().primary_screen->visible_area()); } static WRITE16_HANDLER( astrocorp_eeprom_w ) @@ -475,10 +474,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58.846) // measured on pcb MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(astrocorp) + MCFG_SCREEN_UPDATE_STATIC(astrocorp) MCFG_GFXDECODE(astrocorp) MCFG_PALETTE_LENGTH(0x100) @@ -499,13 +497,15 @@ MACHINE_CONFIG_END -static INTERRUPT_GEN( skilldrp_irq ) +static TIMER_DEVICE_CALLBACK( skilldrp_scanline ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 4, HOLD_LINE); break; // sprites, sound, i/o - case 1: device_set_input_line(device, 2, HOLD_LINE); break; // palette - } + int scanline = param; + + if(scanline == 240) // vblank-out irq. controls sprites, sound, i/o + cputag_set_input_line(timer.machine(), "maincpu", 4, HOLD_LINE); + + if(scanline == 0) // vblank-in? controls palette + cputag_set_input_line(timer.machine(), "maincpu", 2, HOLD_LINE); } static MACHINE_CONFIG_START( skilldrp, astrocorp_state ) @@ -513,7 +513,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz / 2) // JX-1689F1028N GRX586.V5 MCFG_CPU_PROGRAM_MAP(skilldrp_map) - MCFG_CPU_VBLANK_INT_HACK(skilldrp_irq, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", skilldrp_scanline, "screen", 0, 1) MCFG_NVRAM_ADD_0FILL("nvram") MCFG_EEPROM_93C46_ADD("eeprom") @@ -525,10 +525,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58.846) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x200-1, 0, 0xf0-1) - MCFG_SCREEN_UPDATE(astrocorp) + MCFG_SCREEN_UPDATE_STATIC(astrocorp) MCFG_GFXDECODE(astrocorp) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/astrof.c mame-0.145/src/mame/drivers/astrof.c --- mame-0.144/src/mame/drivers/astrof.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/astrof.c 2012-02-06 21:30:42.000000000 +0000 @@ -376,7 +376,7 @@ } -static void video_update_common( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, pen_t *pens ) +static void video_update_common( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, pen_t *pens ) { astrof_state *state = machine.driver_data(); offs_t offs; @@ -397,7 +397,7 @@ if (!state->m_flipscreen) y = ~y; - if ((y <= cliprect->min_y) || (y >= cliprect->max_y)) + if ((y <= cliprect.min_y) || (y >= cliprect.max_y)) continue; if (state->m_screen_off) @@ -410,9 +410,9 @@ pen_t pen = (data & 0x01) ? fore_pen : back_pen; if (state->m_flipscreen) - *BITMAP_ADDR32(bitmap, y, 255 - x) = pen; + bitmap.pix32(y, 255 - x) = pen; else - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data = data >> 1; @@ -421,25 +421,25 @@ } -static SCREEN_UPDATE( astrof ) +static SCREEN_UPDATE_RGB32( astrof ) { pen_t pens[ASTROF_NUM_PENS]; - astrof_get_pens(screen->machine(), pens); + astrof_get_pens(screen.machine(), pens); - video_update_common(screen->machine(), bitmap, cliprect, pens); + video_update_common(screen.machine(), bitmap, cliprect, pens); return 0; } -static SCREEN_UPDATE( tomahawk ) +static SCREEN_UPDATE_RGB32( tomahawk ) { pen_t pens[TOMAHAWK_NUM_PENS]; - tomahawk_get_pens(screen->machine(), pens); + tomahawk_get_pens(screen.machine(), pens); - video_update_common(screen->machine(), bitmap, cliprect, pens); + video_update_common(screen.machine(), bitmap, cliprect, pens); return 0; } @@ -965,7 +965,6 @@ MCFG_VIDEO_START(astrof) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MACHINE_CONFIG_END @@ -980,7 +979,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(astrof) + MCFG_SCREEN_UPDATE_STATIC(astrof) /* audio hardware */ MCFG_FRAGMENT_ADD(astrof_audio) @@ -1006,7 +1005,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(astrof) + MCFG_SCREEN_UPDATE_STATIC(astrof) /* audio hardware */ MCFG_FRAGMENT_ADD(spfghmk2_audio) @@ -1023,7 +1022,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(tomahawk) + MCFG_SCREEN_UPDATE_STATIC(tomahawk) /* audio hardware */ MCFG_FRAGMENT_ADD(tomahawk_audio) diff -Nru mame-0.144/src/mame/drivers/astropc.c mame-0.145/src/mame/drivers/astropc.c --- mame-0.144/src/mame/drivers/astropc.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/astropc.c 2012-02-06 21:30:39.000000000 +0000 @@ -9,6 +9,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" @@ -16,15 +18,22 @@ { public: astropc_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( astropc_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( astropc_map, AS_PROGRAM, 32, astropc_state ) + AM_RANGE(0x000c0000, 0x000fffff) AM_ROM AM_REGION("bios", 0 ) AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("bios", 0 ) ADDRESS_MAP_END -static ADDRESS_MAP_START( astropc_io, AS_IO, 32 ) +static ADDRESS_MAP_START( astropc_io, AS_IO, 32, astropc_state ) ADDRESS_MAP_END @@ -151,16 +160,15 @@ } -GAME( 2002, blackbd, 0, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002, blackbda, blackbd, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002, blackbdb, blackbd, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002, dslayrr, 0, astropc, astropc, astropc, ROT0, "Astro", "Dragon Slayer (Russia, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002, dslayrra, dslayrr, astropc, astropc, astropc, ROT0, "Astro", "Dragon Slayer (Russia, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002, blackbd, 0, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 1)", GAME_IS_SKELETON ) +GAME( 2002, blackbda, blackbd, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 2)", GAME_IS_SKELETON ) +GAME( 2002, blackbdb, blackbd, astropc, astropc, astropc, ROT0, "Astro", "Black Beard (Russia, set 3)", GAME_IS_SKELETON ) -GAME( 2002, hawaii, 0, astropc, astropc, astropc, ROT0, "Astro", "Hawaii (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002, dslayrr, 0, astropc, astropc, astropc, ROT0, "Astro", "Dragon Slayer (Russia, set 1)", GAME_IS_SKELETON ) +GAME( 2002, dslayrra, dslayrr, astropc, astropc, astropc, ROT0, "Astro", "Dragon Slayer (Russia, set 2)", GAME_IS_SKELETON ) -GAME( 2002, oligam, 0, astropc, astropc, astropc, ROT0, "Astro", "Olympian Games (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002, hawaii, 0, astropc, astropc, astropc, ROT0, "Astro", "Hawaii (Russia)", GAME_IS_SKELETON ) -GAME( 2002, rasce, 0, astropc, astropc, astropc, ROT0, "Astro", "Ra Sceptor (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002, oligam, 0, astropc, astropc, astropc, ROT0, "Astro", "Olympian Games (Russia)", GAME_IS_SKELETON ) +GAME( 2002, rasce, 0, astropc, astropc, astropc, ROT0, "Astro", "Ra Sceptor (Russia)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/asuka.c mame-0.145/src/mame/drivers/asuka.c --- mame-0.144/src/mame/drivers/asuka.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/asuka.c 2012-02-06 21:30:41.000000000 +0000 @@ -819,12 +819,12 @@ static const pc090oj_interface asuka_pc090oj_intf = { - 0, 0, 8, 0 + 0, 0, 8, 1 }; -static const pc090oj_interface cadash_pc090oj_intf = +static const pc090oj_interface bonzeadv_pc090oj_intf = { - 0, 0, 8, 1 + 0, 0, 8, 0 }; static const tc0110pcr_interface asuka_tc0110pcr_intf = @@ -874,10 +874,14 @@ memset(state->m_cval, 0, 26); } -static SCREEN_EOF( asuka ) +static SCREEN_VBLANK( asuka ) { - asuka_state *state = machine.driver_data(); - pc090oj_eof_callback(state->m_pc090oj); + // rising edge + if (vblank_on) + { + asuka_state *state = screen.machine().driver_data(); + pc090oj_eof_callback(state->m_pc090oj); + } } static const tc0220ioc_interface asuka_io_intf = @@ -911,16 +915,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(bonzeadv) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(bonzeadv) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) - MCFG_PC090OJ_ADD("pc090oj", asuka_pc090oj_intf) + MCFG_PC090OJ_ADD("pc090oj", bonzeadv_pc090oj_intf) MCFG_TC0100SCN_ADD("tc0100scn", asuka_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", asuka_tc0110pcr_intf) @@ -957,11 +960,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(asuka) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(asuka) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) @@ -1010,16 +1012,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(bonzeadv) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(bonzeadv) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) - MCFG_PC090OJ_ADD("pc090oj", cadash_pc090oj_intf) + MCFG_PC090OJ_ADD("pc090oj", asuka_pc090oj_intf) MCFG_TC0100SCN_ADD("tc0100scn", cadash_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", asuka_tc0110pcr_intf) @@ -1055,16 +1056,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(asuka) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(asuka) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) /* only Mofflott uses full palette space */ - MCFG_PC090OJ_ADD("pc090oj", asuka_pc090oj_intf) + MCFG_PC090OJ_ADD("pc090oj", bonzeadv_pc090oj_intf) MCFG_TC0100SCN_ADD("tc0100scn", cadash_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", asuka_tc0110pcr_intf) @@ -1104,16 +1104,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(asuka) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(asuka) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) /* only Mofflott uses full palette space */ - MCFG_PC090OJ_ADD("pc090oj", asuka_pc090oj_intf) + MCFG_PC090OJ_ADD("pc090oj", bonzeadv_pc090oj_intf) MCFG_TC0100SCN_ADD("tc0100scn", cadash_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", asuka_tc0110pcr_intf) @@ -1149,16 +1148,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(asuka) - MCFG_SCREEN_EOF(asuka) + MCFG_SCREEN_UPDATE_STATIC(asuka) + MCFG_SCREEN_VBLANK_STATIC(asuka) MCFG_GFXDECODE(asuka) MCFG_PALETTE_LENGTH(4096) - MCFG_PC090OJ_ADD("pc090oj", asuka_pc090oj_intf) + MCFG_PC090OJ_ADD("pc090oj", bonzeadv_pc090oj_intf) MCFG_TC0100SCN_ADD("tc0100scn", cadash_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", asuka_tc0110pcr_intf) diff -Nru mame-0.144/src/mame/drivers/atarifb.c mame-0.145/src/mame/drivers/atarifb.c --- mame-0.144/src/mame/drivers/atarifb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarifb.c 2012-02-06 21:30:37.000000000 +0000 @@ -566,10 +566,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2037) /* 16.3ms * 1/8 = 2037.5. Is it 1/8th or 3/32nds? (1528?) */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(38*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 38*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(atarifb) + MCFG_SCREEN_UPDATE_STATIC(atarifb) MCFG_GFXDECODE(atarifb) MCFG_PALETTE_LENGTH(12) @@ -602,7 +601,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(abaseb) + MCFG_SCREEN_UPDATE_STATIC(abaseb) /* sound hardware */ MCFG_SOUND_REPLACE("discrete", DISCRETE, 0) @@ -620,7 +619,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 38*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(soccer) + MCFG_SCREEN_UPDATE_STATIC(soccer) MCFG_GFXDECODE(soccer) MACHINE_CONFIG_END @@ -713,24 +712,24 @@ ROM_LOAD_NIB_LOW ( "034726.b0", 0x6400, 0x0400, CRC(1f8d506c) SHA1(875464ca2ee50b36ceb5989cd40a28c69953c641) ) ROM_LOAD_NIB_HIGH( "034724.l0", 0x6400, 0x0400, CRC(ecd18ed2) SHA1(6ffbc9a4108ebf190455fad3725b72dda4125ac7) ) ROM_LOAD_NIB_LOW ( "034721.d1", 0x6800, 0x0400, CRC(1a0541f2) SHA1(ba74f024deb173678166262c4c6b1c328248aa9a) ) - ROM_LOAD_NIB_HIGH( "034715.j1", 0x6800, 0x0400, CRC(accb96f5) SHA1(1cd6603c818dacf4f71fc350ebd3adf3369056b2) ) /* created from 8-bit set */ + ROM_LOAD_NIB_HIGH( "034715.h1", 0x6800, 0x0400, CRC(accb96f5) SHA1(1cd6603c818dacf4f71fc350ebd3adf3369056b2) ) /* created from 8-bit set */ ROM_LOAD_NIB_LOW ( "034722.d0", 0x6c00, 0x0400, CRC(f9c1174e) SHA1(9d1be9ce4985edd19e0969d8998946d05fbbdf1f) ) /* The code in these 2 differs */ - ROM_LOAD_NIB_HIGH( "034716.j0", 0x6c00, 0x0400, CRC(d5622749) SHA1(6a48d428751939857be6869b44a61b8f054d4206) ) /* from the 8-bit set */ - ROM_LOAD_NIB_LOW ( "034717.e1", 0x7000, 0x0400, CRC(c941f64b) SHA1(e4d309c8ae71adc42dab0ffeea8f58da310c52f3) ) + ROM_LOAD_NIB_HIGH( "034716.h0", 0x6c00, 0x0400, CRC(d5622749) SHA1(6a48d428751939857be6869b44a61b8f054d4206) ) /* from the 8-bit set */ + ROM_LOAD_NIB_LOW ( "034717.f1", 0x7000, 0x0400, CRC(c941f64b) SHA1(e4d309c8ae71adc42dab0ffeea8f58da310c52f3) ) ROM_LOAD_NIB_HIGH( "034711.k1", 0x7000, 0x0400, CRC(fab61782) SHA1(01b6de2822d09ebe0725307eeeaeb667f53ca8f1) ) - ROM_LOAD_NIB_LOW ( "034718.e0", 0x7400, 0x0400, CRC(3fe7dc1c) SHA1(91c3af7d8acdb5c4275f5fa57c19dc589f4a63aa) ) + ROM_LOAD_NIB_LOW ( "034718.f0", 0x7400, 0x0400, CRC(3fe7dc1c) SHA1(91c3af7d8acdb5c4275f5fa57c19dc589f4a63aa) ) ROM_LOAD_NIB_HIGH( "034712.k0", 0x7400, 0x0400, CRC(0e368e1a) SHA1(29bbe4be07d8d441a4251ed6fbfa9e225487c2d8) ) - ROM_LOAD_NIB_LOW ( "034719.h1", 0x7800, 0x0400, CRC(85046ee5) SHA1(2e8559349460a44734c95a1440a84713c5344495) ) - ROM_LOAD_NIB_HIGH( "034713.f1", 0x7800, 0x0400, CRC(0c67c48d) SHA1(eec24da32632c1ba00aee22f1b9abb144b38cc8a) ) - ROM_LOAD_NIB_LOW ( "034720.h0", 0x7c00, 0x0400, CRC(37c5f149) SHA1(89ad4471b949f8318abbdb38c4f373f711130198) ) - ROM_LOAD_NIB_HIGH( "034714.f0", 0x7c00, 0x0400, CRC(920979ea) SHA1(aba499376c084b8ceb6f0cc6599bd51cec133cc7) ) + ROM_LOAD_NIB_LOW ( "034719.e1", 0x7800, 0x0400, CRC(85046ee5) SHA1(2e8559349460a44734c95a1440a84713c5344495) ) + ROM_LOAD_NIB_HIGH( "034713.j1", 0x7800, 0x0400, CRC(0c67c48d) SHA1(eec24da32632c1ba00aee22f1b9abb144b38cc8a) ) + ROM_LOAD_NIB_LOW ( "034720.e0", 0x7c00, 0x0400, CRC(37c5f149) SHA1(89ad4471b949f8318abbdb38c4f373f711130198) ) + ROM_LOAD_NIB_HIGH( "034714.j0", 0x7c00, 0x0400, CRC(920979ea) SHA1(aba499376c084b8ceb6f0cc6599bd51cec133cc7) ) ROM_REGION( 0x0400, "gfx1", 0 ) - ROM_LOAD_NIB_LOW ( "034710.d5", 0x0000, 0x0400, CRC(31275d86) SHA1(465ff2032e62bcd5a7bb5c947212da4ea4d59353) ) + ROM_LOAD_NIB_LOW ( "034710.n7", 0x0000, 0x0400, CRC(31275d86) SHA1(465ff2032e62bcd5a7bb5c947212da4ea4d59353) ) ROM_REGION( 0x0200, "gfx2", 0 ) - ROM_LOAD_NIB_LOW ( "034708.n7", 0x0000, 0x0200, CRC(8a0f971b) SHA1(f7de50eeb15c8291f1560e299e3b1b29bba58422) ) - ROM_LOAD_NIB_HIGH( "034709.c5", 0x0000, 0x0200, CRC(021d1067) SHA1(da0fa8e4f6c0240a4feb41312fa057c65d809e62) ) + ROM_LOAD_NIB_LOW ( "034708.c5", 0x0000, 0x0200, CRC(8a0f971b) SHA1(f7de50eeb15c8291f1560e299e3b1b29bba58422) ) + ROM_LOAD_NIB_HIGH( "034709.d5", 0x0000, 0x0200, CRC(021d1067) SHA1(da0fa8e4f6c0240a4feb41312fa057c65d809e62) ) ROM_END diff -Nru mame-0.144/src/mame/drivers/atarig1.c mame-0.145/src/mame/drivers/atarig1.c --- mame-0.144/src/mame/drivers/atarig1.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarig1.c 2012-02-06 21:30:37.000000000 +0000 @@ -469,11 +469,10 @@ MCFG_PALETTE_LENGTH(1280) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atarig1) - MCFG_SCREEN_EOF(atarig1) + MCFG_SCREEN_UPDATE_STATIC(atarig1) + MCFG_SCREEN_VBLANK_STATIC(atarig1) MCFG_VIDEO_START(atarig1) diff -Nru mame-0.144/src/mame/drivers/atarig42.c mame-0.145/src/mame/drivers/atarig42.c --- mame-0.144/src/mame/drivers/atarig42.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarig42.c 2012-02-06 21:30:41.000000000 +0000 @@ -578,12 +578,11 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atarig42) - MCFG_SCREEN_EOF(atarig42) + MCFG_SCREEN_UPDATE_STATIC(atarig42) + MCFG_SCREEN_VBLANK_STATIC(atarig42) MCFG_VIDEO_START(atarig42) diff -Nru mame-0.144/src/mame/drivers/atarigt.c mame-0.145/src/mame/drivers/atarigt.c --- mame-0.144/src/mame/drivers/atarigt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarigt.c 2012-02-06 21:30:37.000000000 +0000 @@ -829,12 +829,11 @@ MCFG_PALETTE_LENGTH(32768) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) /* note: these parameters are from published specs, not derived */ /* the board uses a pair of GALs to determine H and V parameters */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atarigt) - MCFG_SCREEN_EOF(atarigt) + MCFG_SCREEN_UPDATE_STATIC(atarigt) + MCFG_SCREEN_VBLANK_STATIC(atarigt) MCFG_VIDEO_START(atarigt) diff -Nru mame-0.144/src/mame/drivers/atarigx2.c mame-0.145/src/mame/drivers/atarigx2.c --- mame-0.144/src/mame/drivers/atarigx2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarigx2.c 2012-02-06 21:30:41.000000000 +0000 @@ -1449,12 +1449,11 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a pair of GALs to determine H and V parameters */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atarigx2) - MCFG_SCREEN_EOF(atarigx2) + MCFG_SCREEN_UPDATE_STATIC(atarigx2) + MCFG_SCREEN_VBLANK_STATIC(atarigx2) MCFG_VIDEO_START(atarigx2) diff -Nru mame-0.144/src/mame/drivers/atari_s1.c mame-0.145/src/mame/drivers/atari_s1.c --- mame-0.144/src/mame/drivers/atari_s1.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atari_s1.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,6 +1,9 @@ /* Atari Generation/System 1 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -9,10 +12,20 @@ { public: atari_s1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x01ff) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( atari_s1 ) INPUT_PORTS_END -static MACHINE_RESET( atari_s1 ) +void atari_s1_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(atari_s1_map) - - MCFG_MACHINE_RESET( atari_s1 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -94,9 +105,10 @@ ROM_LOAD("spacel.bin", 0x7800, 0x0800, CRC(66ffb04e) SHA1(42d8b7fb7206b30478f631d0e947c0908dcf5419)) ROM_END -GAME( 1976, atarians, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","The Atarians", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -//GAME( 2002, atarianb, atarians, atari_s1, atari_s1, atari_s1, ROT0, "Atari / Gaston","The Atarians (working bootleg)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, time2000, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Time 2000", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, aavenger, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Airborne Avenger", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, midearth, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Middle Earth", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, spcrider, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Space Riders", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1976, atarians, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","The Atarians", GAME_IS_SKELETON_MECHANICAL) +//GAME( 2002, atarianb, atarians, atari_s1, atari_s1, atari_s1, ROT0, "Atari / Gaston","The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, time2000, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Time 2000", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, aavenger, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Airborne Avenger", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, midearth, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Middle Earth", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, spcrider, 0, atari_s1, atari_s1, atari_s1, ROT0, "Atari","Space Riders", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/atari_s2.c mame-0.145/src/mame/drivers/atari_s2.c --- mame-0.144/src/mame/drivers/atari_s2.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atari_s2.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,6 +1,9 @@ /* Atari Generation/System 2 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,11 +11,21 @@ { public: atari_s2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( atari_s2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( atari_s2_map, AS_PROGRAM, 8, atari_s2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x3fff) AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x0700) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( atari_s2 ) INPUT_PORTS_END -static MACHINE_RESET( atari_s2 ) +void atari_s2_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(atari_s2_map) - - MCFG_MACHINE_RESET( atari_s2 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -71,5 +82,6 @@ ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b)) ROM_END -GAME( 1979, supermap, 0, atari_s2, atari_s2, atari_s2, ROT0, "Atari","Superman (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, hercules, 0, atari_s2, atari_s2, atari_s2, ROT0, "Atari","Hercules", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1979, supermap, 0, atari_s2, atari_s2, atari_s2, ROT0, "Atari", "Superman (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, hercules, 0, atari_s2, atari_s2, atari_s2, ROT0, "Atari", "Hercules", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/atari_s3.c mame-0.145/src/mame/drivers/atari_s3.c --- mame-0.144/src/mame/drivers/atari_s3.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atari_s3.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,6 +1,9 @@ /* Atari Generation/System 3 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,11 +11,21 @@ { public: atari_s3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( atari_s3_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( atari_s3_map, AS_PROGRAM, 8, atari_s3_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x3fff) AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x0700) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( atari_s3 ) INPUT_PORTS_END -static MACHINE_RESET( atari_s3 ) +void atari_s3_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(atari_s3_map) - - MCFG_MACHINE_RESET( atari_s3 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -55,4 +66,5 @@ ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b)) ROM_END -GAME( 1979, roadrunr, 0, atari_s3, atari_s3, atari_s3, ROT0, "Atari","Road Runner", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1979, roadrunr, 0, atari_s3, atari_s3, atari_s3, ROT0, "Atari", "Road Runner", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/atarisy1.c mame-0.145/src/mame/drivers/atarisy1.c --- mame-0.144/src/mame/drivers/atarisy1.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarisy1.c 2012-02-06 21:30:41.000000000 +0000 @@ -785,11 +785,10 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* video timing comes from an 82S163 (H) and an 82S129 (V) */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atarisy1) + MCFG_SCREEN_UPDATE_STATIC(atarisy1) MCFG_VIDEO_START(atarisy1) diff -Nru mame-0.144/src/mame/drivers/atarisy2.c mame-0.145/src/mame/drivers/atarisy2.c --- mame-0.144/src/mame/drivers/atarisy2.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarisy2.c 2012-02-06 21:30:41.000000000 +0000 @@ -1281,8 +1281,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 640, 0, 512, 416, 0, 384) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(atarisy2) + MCFG_SCREEN_UPDATE_STATIC(atarisy2) MCFG_VIDEO_START(atarisy2) diff -Nru mame-0.144/src/mame/drivers/atarisy4.c mame-0.145/src/mame/drivers/atarisy4.c --- mame-0.144/src/mame/drivers/atarisy4.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/atarisy4.c 2012-02-06 21:30:41.000000000 +0000 @@ -134,9 +134,9 @@ gpu.vblank_wait = 0; } -static SCREEN_UPDATE( atarisy4 ) +static SCREEN_UPDATE_RGB32( atarisy4 ) { - atarisy4_state *state = screen->machine().driver_data(); + atarisy4_state *state = screen.machine().driver_data(); int y; UINT32 offset = 0; @@ -151,18 +151,18 @@ //UINT32 offset = gpu.dpr << 5; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT16 *src = &state->m_screen_ram[(offset + (4096 * y)) / 2]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, cliprect->min_x); + UINT32 *dest = &bitmap.pix32(y, cliprect.min_x); int x; - for (x = cliprect->min_x; x < cliprect->max_x; x += 2) + for (x = cliprect.min_x; x < cliprect.max_x; x += 2) { UINT16 data = *src++; - *dest++ = screen->machine().pens[data & 0xff]; - *dest++ = screen->machine().pens[data >> 8]; + *dest++ = screen.machine().pens[data & 0xff]; + *dest++ = screen.machine().pens[data >> 8]; } } return 0; @@ -251,10 +251,7 @@ poly_vertex v1, v2, v3; poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); - clip.min_x = 0; - clip.min_y = 0; - clip.max_x = 511; - clip.max_y = 511; + clip.set(0, 511, 0, 511); extra->color = color; extra->screen_ram = state->m_screen_ram; @@ -271,7 +268,7 @@ v3.x = gpu.points[i].x; v3.y = gpu.points[i].y; - poly_render_triangle(state->m_poly, 0, &clip, draw_scanline, 1, &v1, &v2, &v3); + poly_render_triangle(state->m_poly, 0, clip, draw_scanline, 1, &v1, &v2, &v3); v2 = v3; } } @@ -736,8 +733,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(32000000/2, 660, 0, 512, 404, 0, 384) MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(atarisy4) + MCFG_SCREEN_UPDATE_STATIC(atarisy4) MCFG_PALETTE_LENGTH(256) MCFG_VIDEO_START(atarisy4) diff -Nru mame-0.144/src/mame/drivers/atetris.c mame-0.145/src/mame/drivers/atetris.c --- mame-0.144/src/mame/drivers/atetris.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/atetris.c 2012-02-06 21:30:34.000000000 +0000 @@ -351,11 +351,10 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atetris) + MCFG_SCREEN_UPDATE_STATIC(atetris) MCFG_VIDEO_START(atetris) @@ -387,11 +386,10 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(atetris) + MCFG_SCREEN_UPDATE_STATIC(atetris) MCFG_VIDEO_START(atetris) diff -Nru mame-0.144/src/mame/drivers/atronic.c mame-0.145/src/mame/drivers/atronic.c --- mame-0.144/src/mame/drivers/atronic.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atronic.c 2012-02-06 21:30:41.000000000 +0000 @@ -11,6 +11,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -19,19 +21,23 @@ { public: atronic_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } - -}; + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: + // devices + required_device m_maincpu; +}; -static ADDRESS_MAP_START( atronic_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( atronic_map, AS_PROGRAM, 8, atronic_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( atronic_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( atronic_portmap, AS_IO, 8, atronic_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_END @@ -785,33 +791,33 @@ -GAME( 1999, atronic, 0, atronic, atronic, 0, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 1999, atronica, atronic, atronic, atronic, 0, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND) +GAME( 1999, atronic, 0, atronic, atronic, 0, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 1)", GAME_IS_SKELETON) +GAME( 1999, atronica, atronic, atronic, atronic, 0, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 2)", GAME_IS_SKELETON) -GAME( 2002, atlantca, 0, atronic, atronic, 0, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, atlantcaa, atlantca, atronic, atronic, 0, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, baboshka, 0, atronic, atronic, 0, ROT0, "Atronic", "Baboshka (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, cfblue, 0, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, cfbluea, cfblue, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, cfgreen, 0, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Green (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, chicken, 0, atronic, atronic, 0, ROT0, "Atronic", "Chicken (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, aclown, 0, atronic, atronic, 0, ROT0, "Atronic", "Clown (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, goldglen, 0, atronic, atronic, 0, ROT0, "Atronic", "Golden Glenn (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, iccash, 0, atronic, atronic, 0, ROT0, "Atronic", "I C Cash (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, shpinxii, 0, atronic, atronic, 0, ROT0, "Atronic", "Sphinx II (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, bearnec, 0, atronic, atronic, 0, ROT0, "Atronic", "Bear Necessities (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, beachpt, 0, atronic, atronic, 0, ROT0, "Atronic", "Beach Patrol (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, beetleup, 0, atronic, atronic, 0, ROT0, "Atronic", "Beetles Unplugged (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, abigchs, 0, atronic, atronic, 0, ROT0, "Atronic", "Big Cheese (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, bigblue, 0, atronic, atronic, 0, ROT0, "Atronic", "Big Blue (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, castaway, 0, atronic, atronic, 0, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, castawaya, castaway, atronic, atronic, 0, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, dncsprt, 0, atronic, atronic, 0, ROT0, "Atronic", "Dancing Spirit (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, drmmake, 0, atronic, atronic, 0, ROT0, "Atronic", "Dream Maker (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, goldcity, 0, atronic, atronic, 0, ROT0, "Atronic", "Gold City (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, jumpjkpt, 0, atronic, atronic, 0, ROT0, "Atronic", "Jumping Jackpots (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, mushmagi, 0, atronic, atronic, 0, ROT0, "Atronic", "Mushroom Magic (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, santam, 0, atronic, atronic, 0, ROT0, "Atronic", "Santa Maria (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, splmastr, 0, atronic, atronic, 0, ROT0, "Atronic", "Spell Master (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, tajmah, 0, atronic, atronic, 0, ROT0, "Atronic", "Tajmahal (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 2002, 3wishrd, 0, atronic, atronic, 0, ROT0, "Atronic", "Three Wishes Red (Russia) (Atronic)", GAME_NOT_WORKING|GAME_NO_SOUND) +GAME( 2002, atlantca, 0, atronic, atronic, 0, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 1)", GAME_IS_SKELETON) +GAME( 2002, atlantcaa, atlantca, atronic, atronic, 0, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 2)", GAME_IS_SKELETON) +GAME( 2002, baboshka, 0, atronic, atronic, 0, ROT0, "Atronic", "Baboshka (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, cfblue, 0, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 1)", GAME_IS_SKELETON) +GAME( 2002, cfbluea, cfblue, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 2)", GAME_IS_SKELETON) +GAME( 2002, cfgreen, 0, atronic, atronic, 0, ROT0, "Atronic", "Crazy Fruits Green (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, chicken, 0, atronic, atronic, 0, ROT0, "Atronic", "Chicken (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, aclown, 0, atronic, atronic, 0, ROT0, "Atronic", "Clown (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, goldglen, 0, atronic, atronic, 0, ROT0, "Atronic", "Golden Glenn (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, iccash, 0, atronic, atronic, 0, ROT0, "Atronic", "I C Cash (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, shpinxii, 0, atronic, atronic, 0, ROT0, "Atronic", "Sphinx II (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, bearnec, 0, atronic, atronic, 0, ROT0, "Atronic", "Bear Necessities (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, beachpt, 0, atronic, atronic, 0, ROT0, "Atronic", "Beach Patrol (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, beetleup, 0, atronic, atronic, 0, ROT0, "Atronic", "Beetles Unplugged (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, abigchs, 0, atronic, atronic, 0, ROT0, "Atronic", "Big Cheese (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, bigblue, 0, atronic, atronic, 0, ROT0, "Atronic", "Big Blue (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, castaway, 0, atronic, atronic, 0, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 1)", GAME_IS_SKELETON) +GAME( 2002, castawaya, castaway, atronic, atronic, 0, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 2)", GAME_IS_SKELETON) +GAME( 2002, dncsprt, 0, atronic, atronic, 0, ROT0, "Atronic", "Dancing Spirit (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, drmmake, 0, atronic, atronic, 0, ROT0, "Atronic", "Dream Maker (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, goldcity, 0, atronic, atronic, 0, ROT0, "Atronic", "Gold City (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, jumpjkpt, 0, atronic, atronic, 0, ROT0, "Atronic", "Jumping Jackpots (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, mushmagi, 0, atronic, atronic, 0, ROT0, "Atronic", "Mushroom Magic (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, santam, 0, atronic, atronic, 0, ROT0, "Atronic", "Santa Maria (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, splmastr, 0, atronic, atronic, 0, ROT0, "Atronic", "Spell Master (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, tajmah, 0, atronic, atronic, 0, ROT0, "Atronic", "Tajmahal (Russia) (Atronic)", GAME_IS_SKELETON) +GAME( 2002, 3wishrd, 0, atronic, atronic, 0, ROT0, "Atronic", "Three Wishes Red (Russia) (Atronic)", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/attckufo.c mame-0.145/src/mame/drivers/attckufo.c --- mame-0.144/src/mame/drivers/attckufo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/attckufo.c 2012-02-06 21:30:35.000000000 +0000 @@ -160,9 +160,9 @@ mos6560_raster_interrupt_gen(state->m_mos6560); } -static SCREEN_UPDATE( attckufo ) +static SCREEN_UPDATE_IND16( attckufo ) { - attckufo_state *state = screen->machine().driver_data(); + attckufo_state *state = screen.machine().driver_data(); mos6560_video_update(state->m_mos6560, bitmap, cliprect); return 0; } @@ -200,10 +200,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(MOS6560_VRETRACERATE) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((MOS6560_XSIZE + 7) & ~7, MOS6560_YSIZE) MCFG_SCREEN_VISIBLE_AREA(0, 23*8 - 1, 0, 22*8 - 1) - MCFG_SCREEN_UPDATE(attckufo) + MCFG_SCREEN_UPDATE_STATIC(attckufo) MCFG_PALETTE_LENGTH(ARRAY_LENGTH(attckufo_palette)) MCFG_PALETTE_INIT(attckufo) diff -Nru mame-0.144/src/mame/drivers/atvtrack.c mame-0.145/src/mame/drivers/atvtrack.c --- mame-0.144/src/mame/drivers/atvtrack.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/atvtrack.c 2012-02-06 21:30:42.000000000 +0000 @@ -305,7 +305,7 @@ { } -SCREEN_UPDATE(atvtrack) +SCREEN_UPDATE_RGB32(atvtrack) { return 0; } @@ -388,10 +388,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE(atvtrack) + MCFG_SCREEN_UPDATE_STATIC(atvtrack) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/avalnche.c mame-0.145/src/mame/drivers/avalnche.c --- mame-0.144/src/mame/drivers/avalnche.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/avalnche.c 2012-02-06 21:30:35.000000000 +0000 @@ -44,9 +44,9 @@ * *************************************/ -static SCREEN_UPDATE( avalnche ) +static SCREEN_UPDATE_RGB32( avalnche ) { - avalnche_state *state = screen->machine().driver_data(); + avalnche_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -66,7 +66,7 @@ else pen = (data & 0x80) ? RGB_BLACK : RGB_WHITE; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data << 1; x = x + 1; @@ -261,10 +261,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(avalnche) + MCFG_SCREEN_UPDATE_STATIC(avalnche) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/avt.c mame-0.145/src/mame/drivers/avt.c --- mame-0.144/src/mame/drivers/avt.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/avt.c 2012-02-06 21:30:34.000000000 +0000 @@ -5,6 +5,8 @@ Driver by Roberto Fresca. + TODO: + - needs CTC and daisy chain to make progresses Games running on this hardware: @@ -399,6 +401,7 @@ ************************************************************************************************/ +#define ADDRESS_MAP_MODERN #define MASTER_CLOCK XTAL_10MHz /* unknown */ @@ -418,13 +421,42 @@ { public: avt_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_crtc(*this, "crtc") + { } + + DECLARE_WRITE8_MEMBER(avt_6845_address_w); + DECLARE_WRITE8_MEMBER(avt_6845_data_w); + DECLARE_READ8_MEMBER( avt_6845_data_r ); + DECLARE_WRITE8_MEMBER(avt_videoram_w); + DECLARE_WRITE8_MEMBER(avt_colorram_w); UINT8 *m_videoram; UINT8 *m_colorram; tilemap_t *m_bg_tilemap; + UINT8 m_crtc_vreg[0x100],m_crtc_index; + + required_device m_maincpu; + required_device m_crtc; }; +#define mc6845_h_char_total (state->m_crtc_vreg[0]) +#define mc6845_h_display (state->m_crtc_vreg[1]) +#define mc6845_h_sync_pos (state->m_crtc_vreg[2]) +#define mc6845_sync_width (state->m_crtc_vreg[3]) +#define mc6845_v_char_total (state->m_crtc_vreg[4]) +#define mc6845_v_total_adj (state->m_crtc_vreg[5]) +#define mc6845_v_display (state->m_crtc_vreg[6]) +#define mc6845_v_sync_pos (state->m_crtc_vreg[7]) +#define mc6845_mode_ctrl (state->m_crtc_vreg[8]) +#define mc6845_tile_height (state->m_crtc_vreg[9]+1) +#define mc6845_cursor_y_start (state->m_crtc_vreg[0x0a]) +#define mc6845_cursor_y_end (state->m_crtc_vreg[0x0b]) +#define mc6845_start_addr (((state->m_crtc_vreg[0x0c]<<8) & 0x3f00) | (state->m_crtc_vreg[0x0d] & 0xff)) +#define mc6845_cursor_addr (((state->m_crtc_vreg[0x0e]<<8) & 0x3f00) | (state->m_crtc_vreg[0x0f] & 0xff)) +#define mc6845_light_pen_addr (((state->m_crtc_vreg[0x10]<<8) & 0x3f00) | (state->m_crtc_vreg[0x11] & 0xff)) +#define mc6845_update_addr (((state->m_crtc_vreg[0x12]<<8) & 0x3f00) | (state->m_crtc_vreg[0x13] & 0xff)) /********************************************* @@ -432,19 +464,17 @@ *********************************************/ -static WRITE8_HANDLER( avt_videoram_w ) +WRITE8_MEMBER( avt_state::avt_videoram_w ) { - avt_state *state = space->machine().driver_data(); - state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + m_videoram[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset); } -static WRITE8_HANDLER( avt_colorram_w ) +WRITE8_MEMBER( avt_state::avt_colorram_w ) { - avt_state *state = space->machine().driver_data(); - state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + m_colorram[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset); } @@ -457,7 +487,7 @@ ---- xxxx seems unused. */ int attr = state->m_colorram[tile_index]; - int code = state->m_videoram[tile_index]; + int code = state->m_videoram[tile_index] | ((attr & 1) << 8); int color = (attr & 0xf0)>>4; SET_TILE_INFO( 0, code, color, 0); @@ -471,10 +501,28 @@ } -static SCREEN_UPDATE( avt ) +static SCREEN_UPDATE_IND16( avt ) { - avt_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + avt_state *state = screen.machine().driver_data(); + int x,y; + int count; + const gfx_element *gfx = screen.machine().gfx[0]; + + count = 0; + + for(y=0;ym_videoram[count] | ((state->m_colorram[count] & 1) << 8); + UINT8 color = (state->m_colorram[count] & 0xf0) >> 4; + + drawgfx_opaque(bitmap,cliprect,gfx,tile,color,0,0,x*8,(y*8)); + + count++; + } + } + //state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -539,32 +587,50 @@ // popmessage("written : %02X", data); //} +WRITE8_MEMBER( avt_state::avt_6845_address_w ) +{ + m_crtc_index = data; + m_crtc->address_w(space, offset, data); +} + +WRITE8_MEMBER( avt_state::avt_6845_data_w ) +{ + m_crtc_vreg[m_crtc_index] = data; + m_crtc->register_w(space, offset, data); +} + +READ8_MEMBER( avt_state::avt_6845_data_r ) +{ + //m_crtc_vreg[m_crtc_index] = data; + return m_crtc->register_r(space, offset); +} /********************************************* * Memory Map Information * *********************************************/ /* avtnfl, avtbingo */ -static ADDRESS_MAP_START( avt_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( avt_map, AS_PROGRAM, 8, avt_state ) AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x6000, 0x7fff) AM_RAM AM_RANGE(0x8000, 0x9fff) AM_RAM // AM_SHARE("nvram") - AM_RANGE(0xa000, 0xa7ff) AM_RAM_WRITE(avt_videoram_w) AM_BASE_MEMBER(avt_state, m_videoram) - AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(avt_colorram_w) AM_BASE_MEMBER(avt_state, m_colorram) + AM_RANGE(0xa000, 0xa7ff) AM_RAM_WRITE(avt_videoram_w) AM_BASE(m_videoram) + AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(avt_colorram_w) AM_BASE(m_colorram) ADDRESS_MAP_END -static ADDRESS_MAP_START( avt_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( avt_portmap, AS_IO, 8, avt_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) // AM_RANGE(0x00, 0x03) unk, maybe IO // AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0") // AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1") + AM_RANGE(0x02, 0x02) AM_READ_PORT("DSW1") // AM_RANGE(0x08, 0x0b) unk, maybe IO // AM_RANGE(0x08, 0x08) AM_READ_PORT("IN2") // AM_RANGE(0x09, 0x09) AM_READ_PORT("IN3") - AM_RANGE(0x21, 0x21) AM_DEVWRITE("aysnd", ay8910_data_w) /* AY8910 data */ - AM_RANGE(0x23, 0x23) AM_DEVWRITE("aysnd", ay8910_address_w) /* AY8910 control */ - AM_RANGE(0x28, 0x28) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) - AM_RANGE(0x29, 0x29) AM_DEVREADWRITE_MODERN("crtc", mc6845_device, register_r, register_w) + AM_RANGE(0x21, 0x21) AM_DEVWRITE_LEGACY("aysnd", ay8910_data_w) /* AY8910 data */ + AM_RANGE(0x23, 0x23) AM_DEVWRITE_LEGACY("aysnd", ay8910_address_w) /* AY8910 control */ + AM_RANGE(0x28, 0x28) AM_WRITE(avt_6845_address_w) + AM_RANGE(0x29, 0x29) AM_READWRITE(avt_6845_data_r,avt_6845_data_w) ADDRESS_MAP_END /* I/O byte R/W @@ -810,22 +876,29 @@ * Machine Drivers * *********************************************/ +/* IM 2 */ +static INTERRUPT_GEN( avt_vblank_irq ) +{ + avt_state *state = device->machine().driver_data(); + + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x06); +} + static MACHINE_CONFIG_START( avt, avt_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) /* guess */ MCFG_CPU_PROGRAM_MAP(avt_map) MCFG_CPU_IO_MAP(avt_portmap) -// MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", avt_vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) /* 240x224 (through CRTC) */ - MCFG_SCREEN_UPDATE(avt) + MCFG_SCREEN_UPDATE_STATIC(avt) MCFG_GFXDECODE(avt) diff -Nru mame-0.144/src/mame/drivers/aztarac.c mame-0.145/src/mame/drivers/aztarac.c --- mame-0.144/src/mame/drivers/aztarac.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/aztarac.c 2012-02-06 21:30:39.000000000 +0000 @@ -164,7 +164,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(aztarac) diff -Nru mame-0.144/src/mame/drivers/backfire.c mame-0.145/src/mame/drivers/backfire.c --- mame-0.144/src/mame/drivers/backfire.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/backfire.c 2012-02-06 21:30:36.000000000 +0000 @@ -35,8 +35,8 @@ UINT32 * m_right_priority; /* video related */ - bitmap_t *m_left; - bitmap_t *m_right; + bitmap_ind16 *m_left; + bitmap_ind16 *m_right; /* devices */ device_t *m_maincpu; @@ -70,8 +70,8 @@ state->save_item(NAME(state->m_pf3_rowscroll)); state->save_item(NAME(state->m_pf4_rowscroll)); - state->m_left = auto_bitmap_alloc(machine, 80*8, 32*8, BITMAP_FORMAT_INDEXED16); - state->m_right = auto_bitmap_alloc(machine, 80*8, 32*8, BITMAP_FORMAT_INDEXED16); + state->m_left = auto_bitmap_ind16_alloc(machine, 80*8, 32*8); + state->m_right = auto_bitmap_ind16_alloc(machine, 80*8, 32*8); state->save_pointer(NAME(state->m_spriteram_1), 0x2000/2); state->save_pointer(NAME(state->m_spriteram_2), 0x2000/2); @@ -82,59 +82,69 @@ -static SCREEN_UPDATE( backfire ) +static SCREEN_UPDATE_IND16( backfire_left ) { - backfire_state *state = screen->machine().driver_data(); + backfire_state *state = screen.machine().driver_data(); //FIXME: flip_screen_x should not be written! - flip_screen_set_no_update(screen->machine(), 1); + flip_screen_set_no_update(screen.machine(), 1); /* screen 1 uses pf1 as the forground and pf3 as the background */ /* screen 2 uses pf2 as the foreground and pf4 as the background */ deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); - if (screen == state->m_lscreen) + screen.machine().priority_bitmap.fill(0); + bitmap.fill(0x100, cliprect); + + if (state->m_left_priority[0] == 0) + { + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 1); + deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram_1, 0x800); + } + else if (state->m_left_priority[0] == 2) { + deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram_1, 0x800); + } + else + popmessage( "unknown left priority %08x", state->m_left_priority[0]); + + return 0; +} - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - bitmap_fill(bitmap, cliprect, 0x100); +static SCREEN_UPDATE_IND16( backfire_right ) +{ + backfire_state *state = screen.machine().driver_data(); + + //FIXME: flip_screen_x should not be written! + flip_screen_set_no_update(screen.machine(), 1); - if (state->m_left_priority[0] == 0) - { - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 1); - deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_1, 0x800); - } - else if (state->m_left_priority[0] == 2) - { - deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_1, 0x800); - } - else - popmessage( "unknown left priority %08x", state->m_left_priority[0]); + /* screen 1 uses pf1 as the forground and pf3 as the background */ + /* screen 2 uses pf2 as the foreground and pf4 as the background */ + deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); + deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); + + screen.machine().priority_bitmap.fill(0); + bitmap.fill(0x500, cliprect); + + if (state->m_right_priority[0] == 0) + { + deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 1); + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, state->m_spriteram_2, 0x800); } - else if (screen == state->m_rscreen) + else if (state->m_right_priority[0] == 2) { - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - bitmap_fill(bitmap, cliprect, 0x500); - - if (state->m_right_priority[0] == 0) - { - deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 1); - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - screen->machine().device("spritegen2")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_2, 0x800); - } - else if (state->m_right_priority[0] == 2) - { - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); - screen->machine().device("spritegen2")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_2, 0x800); - } - else - popmessage( "unknown right priority %08x", state->m_right_priority[0]); + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); + deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, state->m_spriteram_2, 0x800); } + else + popmessage( "unknown right priority %08x", state->m_right_priority[0]); + return 0; } @@ -481,20 +491,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(backfire) + MCFG_SCREEN_UPDATE_STATIC(backfire_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(backfire) + MCFG_SCREEN_UPDATE_STATIC(backfire_right) MCFG_VIDEO_START(backfire) diff -Nru mame-0.144/src/mame/drivers/badlands.c mame-0.145/src/mame/drivers/badlands.c --- mame-0.144/src/mame/drivers/badlands.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/badlands.c 2012-02-06 21:30:33.000000000 +0000 @@ -524,11 +524,10 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(badlands) + MCFG_SCREEN_UPDATE_STATIC(badlands) MCFG_VIDEO_START(badlands) @@ -693,9 +692,9 @@ { /* sound IRQ is on 32V */ // if (scanline & 32) -// atarigen_6502_irq_ack_r(screen->machine(), 0); +// atarigen_6502_irq_ack_r(screen.machine(), 0); // else if (!(input_port_read(machine, "FE4000") & 0x40)) -// atarigen_6502_irq_gen(screen->machine().device("audiocpu")); +// atarigen_6502_irq_gen(screen.machine().device("audiocpu")); } @@ -733,11 +732,10 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(badlands) + MCFG_SCREEN_UPDATE_STATIC(badlands) MCFG_VIDEO_START(badlands) diff -Nru mame-0.144/src/mame/drivers/bagman.c mame-0.145/src/mame/drivers/bagman.c --- mame-0.144/src/mame/drivers/bagman.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/bagman.c 2012-02-06 21:30:41.000000000 +0000 @@ -102,12 +102,11 @@ coin_counter_w(space->machine(), offset,data); } -static WRITE8_DEVICE_HANDLER( bagman_interrupt_w ) +static WRITE8_HANDLER( irq_mask_w ) { - data &= 1; - if (!data) - device_set_input_line(device, 0, CLEAR_LINE); - cpu_interrupt_enable(device, data); + bagman_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; } static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) @@ -118,7 +117,7 @@ AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */ AM_RANGE(0xa000, 0xa000) AM_READ(bagman_pal16r6_r) //AM_RANGE(0xa800, 0xa805) AM_READ(bagman_ls259_r) /*just for debugging purposes*/ - AM_RANGE(0xa000, 0xa000) AM_DEVWRITE("maincpu", bagman_interrupt_w) + AM_RANGE(0xa000, 0xa000) AM_WRITE(irq_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w) AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(bagman_state, m_video_enable) AM_RANGE(0xc000, 0xffff) AM_ROM /* Super Bagman only */ @@ -148,7 +147,7 @@ /* here only to initialize the pointer, */ /* writes are handled by bagman_colorram_w */ AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */ - AM_RANGE(0xa000, 0xa000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_WRITE(irq_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w) AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(bagman_state, m_video_enable) AM_RANGE(0xa004, 0xa004) AM_WRITE(bagman_coin_counter_w) @@ -467,21 +466,29 @@ DEVCB_NULL /* rom clock - Only used to drive the data lines */ }; +static INTERRUPT_GEN( vblank_irq ) +{ + bagman_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( bagman, bagman_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(bagman) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(bagman) + MCFG_SCREEN_UPDATE_STATIC(bagman) MCFG_GFXDECODE(bagman) MCFG_PALETTE_LENGTH(64) @@ -510,15 +517,14 @@ MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_PROGRAM_MAP(pickin_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(bagman) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(bagman) + MCFG_SCREEN_UPDATE_STATIC(bagman) MCFG_GFXDECODE(pickin) MCFG_PALETTE_LENGTH(64) @@ -563,15 +569,14 @@ MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_PROGRAM_MAP(pickin_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(bagman) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BAGMAN_HCLK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(bagman) + MCFG_SCREEN_UPDATE_STATIC(bagman) MCFG_GFXDECODE(bagman) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/balsente.c mame-0.145/src/mame/drivers/balsente.c --- mame-0.144/src/mame/drivers/balsente.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/balsente.c 2012-02-06 21:30:41.000000000 +0000 @@ -1223,9 +1223,8 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BALSENTE_PIXEL_CLOCK, BALSENTE_HTOTAL, BALSENTE_HBEND, BALSENTE_HBSTART, BALSENTE_VTOTAL, BALSENTE_VBEND, BALSENTE_VBSTART) - MCFG_SCREEN_UPDATE(balsente) + MCFG_SCREEN_UPDATE_STATIC(balsente) MCFG_PALETTE_LENGTH(1024) @@ -1599,19 +1598,19 @@ ROM_START( triviabb ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */ - ROM_LOAD( "ab01.bin", 0x10000, 0x4000, CRC(1b7c439d) SHA1(8b3020dcb375b2f2e5e975a8067df6504aa8691e) ) - ROM_LOAD( "ab23.bin", 0x14000, 0x4000, CRC(e4f1e704) SHA1(e5135134b54e1e2e95c5bfe6e5f0e2dd280db69d) ) - ROM_LOAD( "ab45.bin", 0x18000, 0x4000, CRC(daa2d8bc) SHA1(feae215877ba42ab33182dfd74083f1d48443d8c) ) - ROM_LOAD( "ab67.bin", 0x1c000, 0x4000, CRC(3622c4f1) SHA1(d180bb1c4a73d95c369cc507697421fb38a92d2c) ) - ROM_LOAD( "cd45.bin", 0x28000, 0x4000, CRC(07fd88ff) SHA1(c3168ecf6562e09790c4f18cdd91c7a347223323) ) - ROM_LOAD( "cd6ef.bin", 0x2c000, 0x4000, CRC(2d03f241) SHA1(986ca6ea20c306e83ae88acc2d6837c7ed5fe351) ) + ROM_LOAD( "ab01.u8a", 0x10000, 0x4000, CRC(1b7c439d) SHA1(8b3020dcb375b2f2e5e975a8067df6504aa8691e) ) + ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(e4f1e704) SHA1(e5135134b54e1e2e95c5bfe6e5f0e2dd280db69d) ) + ROM_LOAD( "ab45.u6a", 0x18000, 0x4000, CRC(daa2d8bc) SHA1(feae215877ba42ab33182dfd74083f1d48443d8c) ) + ROM_LOAD( "ab67.u5a", 0x1c000, 0x4000, CRC(3622c4f1) SHA1(d180bb1c4a73d95c369cc507697421fb38a92d2c) ) + ROM_LOAD( "cd45.u2a", 0x28000, 0x4000, CRC(07fd88ff) SHA1(c3168ecf6562e09790c4f18cdd91c7a347223323) ) + ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(2d03f241) SHA1(986ca6ea20c306e83ae88acc2d6837c7ed5fe351) ) SOUNDBOARD_ROMS ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */ - ROM_LOAD( "gr01.bin", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) ) - ROM_LOAD( "gr23.bin", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) ) - ROM_LOAD( "gr45.bin", 0x08000, 0x4000, CRC(92fb6fb1) SHA1(1a322bd3cfacdf82d4fcc4b4d47f78a701411919) ) + ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) ) + ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) ) + ROM_LOAD( "gr45.u4b", 0x08000, 0x4000, CRC(92fb6fb1) SHA1(1a322bd3cfacdf82d4fcc4b4d47f78a701411919) ) ROM_REGION( 0x00001, "cart_pals", 0) /* PAL's located on the cartridge */ ROM_LOAD( "pal10l8.u1c", 0x0000, 0x0001, NO_DUMP ) /* PAL10L8CN */ @@ -1856,18 +1855,18 @@ ROM_START( sfootbal ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */ - ROM_LOAD( "sfbab01.bin", 0x10000, 0x4000, CRC(2a69803f) SHA1(ca86c9d079fbebae4c93c889d98a8573facc05da) ) - ROM_LOAD( "sfbab23.bin", 0x14000, 0x4000, CRC(89f157c2) SHA1(59701b7770dce7ec01d0feb01d67450943e6cfbb) ) - ROM_LOAD( "sfbab45.bin", 0x18000, 0x4000, CRC(91ad42c5) SHA1(0b6fc3ed3a633c825809668d49f209c130f3e978) ) - ROM_LOAD( "sfbcd6ef.bin", 0x2c000, 0x4000, CRC(bf80bb1a) SHA1(2b70b36d946c36e3f354c7edfd3e34784ffce406) ) + ROM_LOAD( "ab01.u8a", 0x10000, 0x4000, CRC(2a69803f) SHA1(ca86c9d079fbebae4c93c889d98a8573facc05da) ) + ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(89f157c2) SHA1(59701b7770dce7ec01d0feb01d67450943e6cfbb) ) + ROM_LOAD( "ab45.u6a", 0x18000, 0x4000, CRC(91ad42c5) SHA1(0b6fc3ed3a633c825809668d49f209c130f3e978) ) + ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(bf80bb1a) SHA1(2b70b36d946c36e3f354c7edfd3e34784ffce406) ) SOUNDBOARD_ROMS ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */ - ROM_LOAD( "sfbgr01.bin", 0x00000, 0x4000, CRC(e3108d35) SHA1(05b7f1a1a18d7f72a3d3f6102cb8ab42421b7366) ) - ROM_LOAD( "sfbgr23.bin", 0x04000, 0x4000, CRC(5c5af726) SHA1(04cdd476e6689d17273659fb1fe0ca642edbe5a8) ) - ROM_LOAD( "sfbgr45.bin", 0x08000, 0x4000, CRC(e767251e) SHA1(3c05295317a673fb1de5924f27de276d2846d805) ) - ROM_LOAD( "sfbgr67.bin", 0x0c000, 0x4000, CRC(42452a7a) SHA1(37479d6e9071ac775215a6815dbaf280b3c6a57f) ) + ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(e3108d35) SHA1(05b7f1a1a18d7f72a3d3f6102cb8ab42421b7366) ) + ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(5c5af726) SHA1(04cdd476e6689d17273659fb1fe0ca642edbe5a8) ) + ROM_LOAD( "gr45.u2c", 0x08000, 0x4000, CRC(e767251e) SHA1(3c05295317a673fb1de5924f27de276d2846d805) ) + ROM_LOAD( "gr67.u1c", 0x0c000, 0x4000, CRC(42452a7a) SHA1(37479d6e9071ac775215a6815dbaf280b3c6a57f) ) ROM_REGION( 0x00001, "cart_pals", 0) /* PAL's located on the cartridge */ ROM_LOAD( "pal16r8.u7c", 0x0000, 0x0001, NO_DUMP ) /* PAL16R8ANC */ @@ -1896,6 +1895,46 @@ ROM_END +ROM_START( spiker2 ) /* Spiker U.R. 5/5/86 */ + ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */ + ROM_LOAD( "ab01.u8a", 0x10000, 0x4000, CRC(59025e39) SHA1(f0e3e45bb32cc6664831c4ef6b0cfabf3fc71f58) ) + ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(ffb23288) SHA1(3458e486794f6c936d15e837be0f419027b01311) ) + ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(7f04774d) SHA1(c49ac3aa86425cdbab9877fc253999329bb99a49) ) + + SOUNDBOARD_ROMS + + ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */ + ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(1228b7a3) SHA1(70a207714ba7bc4f4dbc492768480afa424b31c0) ) + ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(970c81f6) SHA1(f22189e172a795d115597feb48ccbc04be3859b9) ) + ROM_LOAD( "gr45.u2c", 0x08000, 0x4000, CRC(bf2b413d) SHA1(f0f797853ac1b6e45ff606d7aa5c9350765efd48) ) + + ROM_REGION( 0x00001, "cart_pals", 0) /* PAL's located on the cartridge */ + ROM_LOAD( "pal16r8.u7c", 0x0000, 0x0001, NO_DUMP ) /* PAL16R8ANC */ + + MOTHERBOARD_PALS +ROM_END + + +ROM_START( spiker3 ) /* Spiker U.R. 6/9/86 */ + ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */ + ROM_LOAD( "ab01.u8a", 0x10000, 0x4000, CRC(2d53d023) SHA1(01c1d2cd7d8be60c40527e9c1571b84388a39bd8) ) + ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(3be87edf) SHA1(0d4f1ff501d5d865abc3906f6b232ec04586d3dc) ) + ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(5b5a6d86) SHA1(a173637991601adc87f0fc8fd1ee9102f5fb2b81) ) + + SOUNDBOARD_ROMS + + ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */ + ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(0caa6e3e) SHA1(ce6765d44e444d24129ec99f04a41a866a32eee2) ) + ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(970c81f6) SHA1(f22189e172a795d115597feb48ccbc04be3859b9) ) + ROM_LOAD( "gr45.u2c", 0x08000, 0x4000, CRC(90ddd737) SHA1(8e1dde2f42e9bf755dedeef218745d1fc54faac7) ) + + ROM_REGION( 0x00001, "cart_pals", 0) /* PAL's located on the cartridge */ + ROM_LOAD( "pal16r8.u7c", 0x0000, 0x0001, NO_DUMP ) /* PAL16R8ANC */ + + MOTHERBOARD_PALS +ROM_END + + ROM_START( stompin ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */ ROM_LOAD( "ab 01.u8a", 0x10000, 0x4000, CRC(46f428c6) SHA1(06c59d06ccc0bd7067e419f12781050ab4ac98c2) ) @@ -2188,7 +2227,7 @@ /* Board: 006-8003-01-0D Rev D */ GAME( 1984, hattrick, 0, balsente, hattrick, hattrick, ROT0, "Bally/Sente", "Hat Trick", GAME_SUPPORTS_SAVE ) -GAME( 1984, trivia12, 0, balsente, triviag1, triviag1, ROT0, "Bally/Sente", "Trivial Pursuit (Genus I) (12-14-84)", GAME_SUPPORTS_SAVE ) +GAME( 1984, trivia12, 0, balsente, triviag1, triviag1, ROT0, "Bally/Sente", "Trivial Pursuit (Genus I) (12/14/84)", GAME_SUPPORTS_SAVE ) /* Board: Unknown (From a picture on eBay Snacks'n Jaxson does not match any documented types here.) */ GAME( 1984, otwalls, 0, balsente, otwalls, otwalls, ROT0, "Bally/Sente", "Off the Wall (Sente)", GAME_SUPPORTS_SAVE ) @@ -2199,8 +2238,8 @@ GAMEL(1984, stocker, 0, balsente, stocker, stocker, ROT0, "Bally/Sente", "Stocker (3/19/85)", GAME_SUPPORTS_SAVE, layout_stocker ) // date from ROM chips GAME( 1985, gimeabrk, 0, balsente, gimeabrk, gimeabrk, ROT0, "Bally/Sente", "Gimme A Break (7/7/85)", GAME_SUPPORTS_SAVE ) GAME( 1985, minigolf, 0, balsente, minigolf, minigolf, ROT0, "Bally/Sente", "Mini Golf (set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1985, minigolf2,minigolf, balsente, minigolf2,minigolf2,ROT0, "Bally/Sente", "Mini Golf (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1984, triviabb, 0, balsente, triviag1, triviag2, ROT0, "Bally/Sente", "Trivial Pursuit (Baby Boomer Edition)", GAME_SUPPORTS_SAVE ) +GAME( 1985, minigolf2,minigolf, balsente, minigolf2,minigolf2,ROT0, "Bally/Sente", "Mini Golf (10/8/85)", GAME_SUPPORTS_SAVE ) +GAME( 1984, triviabb, 0, balsente, triviag1, triviag2, ROT0, "Bally/Sente", "Trivial Pursuit (Baby Boomer Edition) (3/20/85)", GAME_SUPPORTS_SAVE ) /* Board: Unknown */ GAME( 1984, triviag1, 0, balsente, triviag1, triviag1, ROT0, "Bally/Sente", "Trivial Pursuit (Genus I) (set 1)", GAME_SUPPORTS_SAVE ) @@ -2215,10 +2254,12 @@ GAME( 1986, nametune2,nametune, balsente, nametune, nametune, ROT0, "Bally/Sente", "Name That Tune (3/23/86)", GAME_SUPPORTS_SAVE ) /* Board: 006-8027-01-0B Rev B */ -GAME( 1986, nstocker, 0, balsente, nstocker, nstocker, ROT0, "Bally/Sente", "Night Stocker (set 1)", GAME_SUPPORTS_SAVE ) -GAME( 1986, nstocker2,nstocker, balsente, nstocker, nstocker, ROT0, "Bally/Sente", "Night Stocker (set 2)", GAME_SUPPORTS_SAVE ) -GAME( 1986, sfootbal, 0, balsente, sfootbal, sfootbal, ROT0, "Bally/Sente", "Street Football", GAME_SUPPORTS_SAVE ) +GAME( 1986, nstocker, 0, balsente, nstocker, nstocker, ROT0, "Bally/Sente", "Night Stocker (10/6/86)", GAME_SUPPORTS_SAVE ) +GAME( 1986, nstocker2,nstocker, balsente, nstocker, nstocker, ROT0, "Bally/Sente", "Night Stocker (8/27/86)", GAME_SUPPORTS_SAVE ) +GAME( 1986, sfootbal, 0, balsente, sfootbal, sfootbal, ROT0, "Bally/Sente", "Street Football (11/12/86)", GAME_SUPPORTS_SAVE ) GAME( 1986, spiker, 0, balsente, spiker, spiker, ROT0, "Bally/Sente", "Spiker", GAME_SUPPORTS_SAVE ) +GAME( 1986, spiker2, spiker, balsente, spiker, spiker, ROT0, "Bally/Sente", "Spiker (5/5/86)", GAME_SUPPORTS_SAVE ) +GAME( 1986, spiker3, spiker, balsente, spiker, spiker, ROT0, "Bally/Sente", "Spiker (6/9/86)", GAME_SUPPORTS_SAVE ) GAME( 1986, stompin, 0, balsente, stompin, stompin, ROT0, "Bally/Sente", "Stompin' (4/4/86)", GAME_SUPPORTS_SAVE ) /* Board: A084-91889-A000 (Not a cartridge, but dedicated board) */ diff -Nru mame-0.144/src/mame/drivers/bankp.c mame-0.145/src/mame/drivers/bankp.c --- mame-0.144/src/mame/drivers/bankp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bankp.c 2012-02-06 21:30:40.000000000 +0000 @@ -267,13 +267,21 @@ state->m_priority = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + bankp_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( bankp, bankp_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, BANKP_CPU_CLOCK) MCFG_CPU_PROGRAM_MAP(bankp_map) MCFG_CPU_IO_MAP(bankp_io_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(bankp) @@ -281,10 +289,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(3*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bankp) + MCFG_SCREEN_UPDATE_STATIC(bankp) MCFG_GFXDECODE(bankp) MCFG_PALETTE_LENGTH(32*4+16*8) diff -Nru mame-0.144/src/mame/drivers/baraduke.c mame-0.145/src/mame/drivers/baraduke.c --- mame-0.144/src/mame/drivers/baraduke.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/baraduke.c 2012-02-06 21:30:42.000000000 +0000 @@ -100,7 +100,8 @@ DIP locations verified for: -------------------------- -- metrocrs (manual) +- baraduke (manual JP) +- metrocrs (manual US, JP) ***************************************************************************/ @@ -231,15 +232,15 @@ PORT_START("DSWB") PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:1,2") - PORT_DIPSETTING( 0x80, "Every 10k" ) - PORT_DIPSETTING( 0xc0, "10k And Every 20k" ) - PORT_DIPSETTING( 0x40, "Every 20k" ) - PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPSETTING( 0x80, "Every 10k" ) // "B" + PORT_DIPSETTING( 0xc0, "10k And Every 20k" ) // "A" (default) + PORT_DIPSETTING( 0x40, "Every 20k" ) // "C" + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) // "D" PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:3,4") - PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) // "B" + PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) // "A" (default) + PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) // "C" + PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) // "D" /* To advance rounds: set SWB:5 to ON, coin up game and push 1P start. Use joystick to select round 1 - 48. Set SWB:5 to OFF to play selected round. */ PORT_DIPNAME( 0x08, 0x08, "Round Select" ) PORT_DIPLOCATION("SWB:5") @@ -297,11 +298,11 @@ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWA:4,5") - PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SWA:6") + PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) // "B" + PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) // "A" (default) + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // "C" + PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) // "D" + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SWA:6") // metrocrs: after round 8, metrocrsa: after round 4 PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) @@ -394,11 +395,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(baraduke) - MCFG_SCREEN_EOF(baraduke) + MCFG_SCREEN_UPDATE_STATIC(baraduke) + MCFG_SCREEN_VBLANK_STATIC(baraduke) MCFG_GFXDECODE(baraduke) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/bartop52.c mame-0.145/src/mame/drivers/bartop52.c --- mame-0.144/src/mame/drivers/bartop52.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bartop52.c 2012-02-06 21:30:41.000000000 +0000 @@ -16,7 +16,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "includes/atari.h" #include "sound/speaker.h" @@ -121,16 +120,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT) MCFG_CPU_PROGRAM_MAP(a5200_mem) - MCFG_CPU_VBLANK_INT_HACK(a5200_interrupt, TOTAL_LINES_60HZ) + MCFG_TIMER_ADD_SCANLINE("scantimer", a5200_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_VISIBLE_AREA(MIN_X, MAX_X, MIN_Y, MAX_Y) MCFG_SCREEN_REFRESH_RATE(FRAME_RATE_60HZ) MCFG_SCREEN_SIZE(HWIDTH*8, TOTAL_LINES_60HZ) - MCFG_SCREEN_UPDATE(atari) + MCFG_SCREEN_UPDATE_STATIC(atari) MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(atari) diff -Nru mame-0.144/src/mame/drivers/batman.c mame-0.145/src/mame/drivers/batman.c --- mame-0.144/src/mame/drivers/batman.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/batman.c 2012-02-06 21:30:42.000000000 +0000 @@ -113,7 +113,7 @@ if ((oldword ^ state->m_latch_data) & 0x7000) { space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); - tilemap_mark_all_tiles_dirty(state->m_alpha_tilemap); + state->m_alpha_tilemap->mark_all_dirty(); state->m_alpha_tile_bank = (state->m_latch_data >> 12) & 7; } } @@ -249,11 +249,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a VAD chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(batman) + MCFG_SCREEN_UPDATE_STATIC(batman) MCFG_VIDEO_START(batman) diff -Nru mame-0.144/src/mame/drivers/battlane.c mame-0.145/src/mame/drivers/battlane.c --- mame-0.144/src/mame/drivers/battlane.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/battlane.c 2012-02-06 21:30:42.000000000 +0000 @@ -312,10 +312,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32 * 8, 32 * 8) MCFG_SCREEN_VISIBLE_AREA(1 * 8, 31 * 8 - 1, 0 * 8, 32 * 8 - 1) - MCFG_SCREEN_UPDATE(battlane) + MCFG_SCREEN_UPDATE_STATIC(battlane) MCFG_GFXDECODE(battlane) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/battlera.c mame-0.145/src/mame/drivers/battlera.c --- mame-0.144/src/mame/drivers/battlera.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/battlera.c 2012-02-06 21:30:42.000000000 +0000 @@ -13,6 +13,7 @@ Twice as much VRAM. Todo: + - Convert this driver to use proper PC-Engine video. - Priority is wrong for the submarine at the end of level 1. - There seems to be a bug with a stuck note from the YM2203 FM channel at the start of scene 3 and near the ending when your characters are @@ -21,7 +22,6 @@ **********************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/h6280/h6280.h" #include "sound/2203intf.h" #include "sound/msm5205.h" @@ -236,7 +236,7 @@ MCFG_CPU_ADD("maincpu", H6280,21477200/3) MCFG_CPU_PROGRAM_MAP(battlera_map) MCFG_CPU_IO_MAP(battlera_portmap) - MCFG_CPU_VBLANK_INT_HACK(battlera_interrupt,256) /* 8 prelines, 232 lines, 16 vblank? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", battlera_irq, "screen", 0, 1) /* 8 prelines, 232 lines, 16 vblank? */ MCFG_CPU_ADD("audiocpu", H6280,21477200/3) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -245,10 +245,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 30*8-1) - MCFG_SCREEN_UPDATE(battlera) + MCFG_SCREEN_UPDATE_STATIC(battlera) MCFG_GFXDECODE(battlera) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/battlex.c mame-0.145/src/mame/drivers/battlex.c --- mame-0.144/src/mame/drivers/battlex.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/battlex.c 2012-02-06 21:30:37.000000000 +0000 @@ -262,10 +262,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(battlex) + MCFG_SCREEN_UPDATE_STATIC(battlex) MCFG_GFXDECODE(battlex) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/battlnts.c mame-0.145/src/mame/drivers/battlnts.c --- mame-0.144/src/mame/drivers/battlnts.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/battlnts.c 2012-02-06 21:30:42.000000000 +0000 @@ -131,7 +131,7 @@ PORT_START("P1") KONAMI8_B1(1) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:4") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x80, "3 Times" ) PORT_DIPSETTING( 0x00, "5 Times" ) @@ -139,24 +139,21 @@ KONAMI8_B1_UNK(2) INPUT_PORTS_END -static INPUT_PORTS_START( thehustlj ) +static INPUT_PORTS_START( rackemup ) PORT_INCLUDE( battlnts ) PORT_MODIFY("DSW2") PORT_DIPNAME( 0x03, 0x02, "Balls" ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x03, "1" ) - PORT_DIPSETTING( 0x02, "2" ) - PORT_DIPSETTING( 0x01, "3" ) - PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x18, 0x18, "Time To Aim" ) PORT_DIPLOCATION("SW2:4,5") + PORT_DIPSETTING( 0x03, "2" ) + PORT_DIPSETTING( 0x02, "3" ) + PORT_DIPSETTING( 0x01, "4" ) + PORT_DIPSETTING( 0x00, "7" ) + PORT_DIPNAME( 0x18, 0x10, "Time To Aim" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "25s (Stage 1: 30s)" ) PORT_DIPSETTING( 0x10, "20s (Stage 1: 25s)" ) PORT_DIPSETTING( 0x08, "17s (Stage 1: 22s)" ) PORT_DIPSETTING( 0x00, "15s (Stage 1: 20s)" ) - PORT_MODIFY("DSW3") - PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW3:2" ) - PORT_MODIFY("P1") KONAMI8_B12(1) PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW3:4" ) @@ -165,6 +162,13 @@ KONAMI8_B12_UNK(2) INPUT_PORTS_END +static INPUT_PORTS_START( thehustl ) + PORT_INCLUDE( rackemup ) + + PORT_MODIFY("DSW3") + PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW3:2" ) +INPUT_PORTS_END + /************************************* * @@ -259,10 +263,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(battlnts) + MCFG_SCREEN_UPDATE_STATIC(battlnts) MCFG_GFXDECODE(battlnts) MCFG_PALETTE_LENGTH(128) @@ -415,6 +418,6 @@ GAME( 1987, battlnts, 0, battlnts, battlnts, 0, ROT90, "Konami", "Battlantis", GAME_SUPPORTS_SAVE ) GAME( 1987, battlntsj, battlnts, battlnts, battlnts, 0, ROT90, "Konami", "Battlantis (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1987, rackemup, 0, battlnts, thehustlj,rackemup, ROT90, "Konami", "Rack 'em Up", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1987, thehustl, rackemup, battlnts, thehustlj,0, ROT90, "Konami", "The Hustler (Japan version M)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1987, thehustlj, rackemup, battlnts, thehustlj,0, ROT90, "Konami", "The Hustler (Japan version J)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1987, rackemup, 0, battlnts, rackemup, rackemup, ROT90, "Konami", "Rack 'em Up", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1987, thehustl, rackemup, battlnts, thehustl, 0, ROT90, "Konami", "The Hustler (Japan version M)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1987, thehustlj, rackemup, battlnts, thehustl, 0, ROT90, "Konami", "The Hustler (Japan version J)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/bbusters.c mame-0.145/src/mame/drivers/bbusters.c --- mame-0.144/src/mame/drivers/bbusters.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/bbusters.c 2012-02-06 21:30:34.000000000 +0000 @@ -664,18 +664,26 @@ /******************************************************************************/ -static SCREEN_EOF( bbuster ) +static SCREEN_VBLANK( bbuster ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - - buffer_spriteram16_w(space,0,0,0xffff); - buffer_spriteram16_2_w(space,0,0,0xffff); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + + buffer_spriteram16_w(space,0,0,0xffff); + buffer_spriteram16_2_w(space,0,0,0xffff); + } } -static SCREEN_EOF( mechatt ) +static SCREEN_VBLANK( mechatt ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space,0,0,0xffff); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram16_w(space,0,0,0xffff); + } } static MACHINE_CONFIG_START( bbusters, bbusters_state ) @@ -696,11 +704,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bbuster) - MCFG_SCREEN_EOF(bbuster) + MCFG_SCREEN_UPDATE_STATIC(bbuster) + MCFG_SCREEN_VBLANK_STATIC(bbuster) MCFG_GFXDECODE(bbusters) MCFG_PALETTE_LENGTH(2048) @@ -734,11 +741,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mechatt) - MCFG_SCREEN_EOF(mechatt) + MCFG_SCREEN_UPDATE_STATIC(mechatt) + MCFG_SCREEN_VBLANK_STATIC(mechatt) MCFG_GFXDECODE(mechatt) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/beaminv.c mame-0.145/src/mame/drivers/beaminv.c --- mame-0.144/src/mame/drivers/beaminv.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/beaminv.c 2012-02-06 21:30:41.000000000 +0000 @@ -33,7 +33,7 @@ . 2 players game : [0x1839] = 0xaa (player 1) or 0x55 (player 2) - Credits are stored at address 0x1837 (BCD coded, range 0x00-0x99) -2) 'beaminva' +2) 'pacominv' - Routine to handle the analog inputs at 0x04bd. Contents from 0x3400 (IN2) is compared with contents from 0x1d05 (value in RAM). @@ -53,6 +53,7 @@ #include "emu.h" #include "cpu/z80/z80.h" +#include "beaminv.lh" class beaminv_state : public driver_device @@ -164,9 +165,9 @@ * *************************************/ -static SCREEN_UPDATE( beaminv ) +static SCREEN_UPDATE_RGB32( beaminv ) { - beaminv_state *state = screen->machine().driver_data(); + beaminv_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -180,7 +181,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data >> 1; x = x + 1; @@ -297,7 +298,7 @@ INPUT_PORTS_END -static INPUT_PORTS_START( beaminva ) +static INPUT_PORTS_START( pacominv ) PORT_INCLUDE( beaminv ) PORT_MODIFY("DSW") @@ -339,11 +340,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 247, 16, 231) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(beaminv) + MCFG_SCREEN_UPDATE_STATIC(beaminv) MACHINE_CONFIG_END @@ -366,7 +366,7 @@ ROM_END -ROM_START( beaminva ) +ROM_START( pacominv ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "rom_0", 0x0000, 0x0400, CRC(67e100dd) SHA1(5f58e2ed3da14c48f7c382ee6091a59caf8e0609) ) ROM_LOAD( "rom_1", 0x0400, 0x0400, CRC(442bbe98) SHA1(0e0382d4f6491629449759747019bd453a458b66) ) @@ -384,5 +384,5 @@ * *************************************/ -GAME( 1979, beaminv, 0, beaminv, beaminv, 0, ROT270, "Tekunon Kougyou", "Beam Invader (set 1)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1979, beaminva, beaminv, beaminv, beaminva, 0, ROT270, "Tekunon Kougyou", "Beam Invader (set 2)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) // what's the real title ? +GAMEL( 1979, beaminv, 0, beaminv, beaminv, 0, ROT270, "Tekunon Kougyou", "Beam Invader", GAME_NO_SOUND | GAME_SUPPORTS_SAVE, layout_beaminv ) +GAMEL( 1979, pacominv, beaminv, beaminv, pacominv, 0, ROT270, "Pacom Corporation", "Pacom Invader", GAME_NO_SOUND | GAME_SUPPORTS_SAVE, layout_beaminv ) diff -Nru mame-0.144/src/mame/drivers/beathead.c mame-0.145/src/mame/drivers/beathead.c --- mame-0.144/src/mame/drivers/beathead.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/beathead.c 2012-02-06 21:30:41.000000000 +0000 @@ -413,7 +413,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(beathead_state, screen_update) MCFG_SCREEN_SIZE(42*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 0*8, 30*8-1) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/beezer.c mame-0.145/src/mame/drivers/beezer.c --- mame-0.144/src/mame/drivers/beezer.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/beezer.c 2012-02-06 21:30:36.000000000 +0000 @@ -4,10 +4,12 @@ Written by Mathis Rosenhauer + TODO: + - what's really wrong with the sound? Any reference available? + */ #include "emu.h" -#include "deprecat.h" #include "machine/6522via.h" #include "cpu/m6809/m6809.h" #include "sound/dac.h" @@ -23,9 +25,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM // RAM at 0D AM_RANGE(0x0800, 0x0fff) AM_RAM // optional RAM at 2D (can be rom here instead) - AM_RANGE(0x1000, 0x1007) AM_MIRROR(0x07F8) AM_DEVREADWRITE("custom", beezer_sh6840_r, beezer_sh6840_w) - AM_RANGE(0x1800, 0x180F) AM_MIRROR(0x07F0) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) - AM_RANGE(0x8000, 0x8003) AM_MIRROR(0x1FFC) AM_DEVWRITE("custom", beezer_sfxctrl_w) + AM_RANGE(0x1000, 0x1007) AM_MIRROR(0x07f8) AM_DEVREADWRITE("custom", beezer_sh6840_r, beezer_sh6840_w) + AM_RANGE(0x1800, 0x180F) AM_MIRROR(0x07f0) AM_DEVREADWRITE_MODERN("via6522_1", via6522_device, read, write) + AM_RANGE(0x8000, 0x8003) AM_MIRROR(0x1ffc) AM_DEVWRITE("custom", beezer_sfxctrl_w) //AM_RANGE(0xa000, 0xbfff) AM_ROM // ROM at 2D (can be ram here instead), unpopulated //AM_RANGE(0xc000, 0xdfff) AM_ROM // ROM at 4D, unpopulated AM_RANGE(0xe000, 0xffff) AM_ROM // ROM at 6D @@ -75,12 +77,19 @@ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) INPUT_PORTS_END +static MACHINE_START(beezer) +{ + beezer_state *state = machine.driver_data(); + + state->m_maincpu = machine.device("maincpu"); +} + static MACHINE_CONFIG_START( beezer, beezer_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1000000) /* 1 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT_HACK(beezer_interrupt,128) + MCFG_TIMER_ADD_SCANLINE("scantimer", beezer_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M6809, 1000000) /* 1 MHz */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -89,13 +98,14 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(256, 384) - MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 303) - MCFG_SCREEN_UPDATE(beezer) + MCFG_SCREEN_SIZE(384, 256) + MCFG_SCREEN_VISIBLE_AREA(16, 304-1, 0, 240-1) // 288 x 240, correct? + MCFG_SCREEN_UPDATE_STATIC(beezer) MCFG_PALETTE_LENGTH(16) + MCFG_MACHINE_START(beezer) + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -159,5 +169,5 @@ ROM_LOAD( "e1.cpu", 0x100, 0x0100, CRC(3c775c5e) SHA1(ac86f45938c0c9d5fec1245bf86718442baf445b) ) ROM_END -GAME( 1982, beezer, 0, beezer, beezer, beezer, ORIENTATION_FLIP_X, "Tong Electronic", "Beezer (set 1)", GAME_IMPERFECT_SOUND ) -GAME( 1982, beezer1, beezer, beezer, beezer, beezer, ORIENTATION_FLIP_X, "Tong Electronic", "Beezer (set 2)", GAME_IMPERFECT_SOUND ) +GAME( 1982, beezer, 0, beezer, beezer, beezer, ROT90, "Tong Electronic", "Beezer (set 1)", GAME_IMPERFECT_SOUND ) +GAME( 1982, beezer1, beezer, beezer, beezer, beezer, ROT90, "Tong Electronic", "Beezer (set 2)", GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/belatra.c mame-0.145/src/mame/drivers/belatra.c --- mame-0.144/src/mame/drivers/belatra.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/belatra.c 2012-02-06 21:30:36.000000000 +0000 @@ -37,6 +37,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/arm7/arm7.h" #include "cpu/arm7/arm7core.h" @@ -45,11 +47,17 @@ { public: belatra_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( belatra_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( belatra_map, AS_PROGRAM, 32, belatra_state ) AM_RANGE(0x00000000, 0x003fffff) AM_ROM ADDRESS_MAP_END @@ -64,6 +72,7 @@ /* unknown sound */ MACHINE_CONFIG_END + ROM_START( merryjn ) ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD( "am29f160bd_mery_up.bin", 0x000000, 0x200000, CRC(475161a5) SHA1(784904ffb949e56cac1126eaacf09db19a51b2f0) ) @@ -109,14 +118,12 @@ ROM_END -GAME( 2004, fairyl2 ,0, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2004, fairyl2a ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2004, fairyl2b ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2004, fairyl2bl ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (bootleg)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2004, ldrink ,0, belatra, belatra, 0, ROT0, "Belatra","Lucky Drink (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2004, ldrinka ,ldrink, belatra, belatra, 0, ROT0, "Belatra","Lucky Drink (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2004, merryjn ,0, belatra, belatra, 0, ROT0, "Belatra","Merry Joiner", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2004, fairyl2 ,0, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 1)", GAME_IS_SKELETON ) +GAME( 2004, fairyl2a ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 2)", GAME_IS_SKELETON ) +GAME( 2004, fairyl2b ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (set 3)", GAME_IS_SKELETON ) +GAME( 2004, fairyl2bl ,fairyl2, belatra, belatra, 0, ROT0, "Belatra","Fairy Land 2 (bootleg)", GAME_IS_SKELETON ) +GAME( 2004, ldrink ,0, belatra, belatra, 0, ROT0, "Belatra","Lucky Drink (set 1)", GAME_IS_SKELETON ) +GAME( 2004, ldrinka ,ldrink, belatra, belatra, 0, ROT0, "Belatra","Lucky Drink (set 2)", GAME_IS_SKELETON ) +GAME( 2004, merryjn ,0, belatra, belatra, 0, ROT0, "Belatra","Merry Joiner", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/berzerk.c mame-0.145/src/mame/drivers/berzerk.c --- mame-0.144/src/mame/drivers/berzerk.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/berzerk.c 2012-02-06 21:30:38.000000000 +0000 @@ -444,13 +444,13 @@ } -static SCREEN_UPDATE( berzerk ) +static SCREEN_UPDATE_RGB32( berzerk ) { - berzerk_state *state = screen->machine().driver_data(); + berzerk_state *state = screen.machine().driver_data(); pen_t pens[NUM_PENS]; offs_t offs; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); for (offs = 0; offs < state->m_videoram_size; offs++) { @@ -465,7 +465,7 @@ for (i = 0; i < 4; i++) { pen_t pen = (data & 0x80) ? pens[color >> 4] : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data = data << 1; @@ -474,7 +474,7 @@ for (; i < 8; i++) { pen_t pen = (data & 0x80) ? pens[color & 0x0f] : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data = data << 1; @@ -1084,9 +1084,8 @@ MCFG_VIDEO_START(berzerk) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(berzerk) + MCFG_SCREEN_UPDATE_STATIC(berzerk) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/bestleag.c mame-0.145/src/mame/drivers/bestleag.c --- mame-0.144/src/mame/drivers/bestleag.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bestleag.c 2012-02-06 21:30:39.000000000 +0000 @@ -98,8 +98,8 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,bsb_bg_scan,16,16,128, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,bsb_bg_scan,16,16,128, 64); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); - tilemap_set_transparent_pen(state->m_fg_tilemap,15); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_transparent_pen(15); } /* @@ -107,7 +107,7 @@ include several similiarities with other Playmark games (including the sprite end code and the data being offset (i.e. spriteram starting from 0x16/2)) */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { bestleag_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -163,37 +163,37 @@ } } -static SCREEN_UPDATE(bestleag) +static SCREEN_UPDATE_IND16(bestleag) { - bestleag_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,(state->m_vregs[0x00/2] & 0xfff) + (state->m_vregs[0x08/2] & 0x7) - 3); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_vregs[0x02/2]); - tilemap_set_scrollx(state->m_tx_tilemap,0,state->m_vregs[0x04/2]); - tilemap_set_scrolly(state->m_tx_tilemap,0,state->m_vregs[0x06/2]); - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_vregs[0x08/2] & 0xfff8); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_vregs[0x0a/2]); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + bestleag_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,(state->m_vregs[0x00/2] & 0xfff) + (state->m_vregs[0x08/2] & 0x7) - 3); + state->m_bg_tilemap->set_scrolly(0,state->m_vregs[0x02/2]); + state->m_tx_tilemap->set_scrollx(0,state->m_vregs[0x04/2]); + state->m_tx_tilemap->set_scrolly(0,state->m_vregs[0x06/2]); + state->m_fg_tilemap->set_scrollx(0,state->m_vregs[0x08/2] & 0xfff8); + state->m_fg_tilemap->set_scrolly(0,state->m_vregs[0x0a/2]); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -static SCREEN_UPDATE(bestleaw) +static SCREEN_UPDATE_IND16(bestleaw) { - bestleag_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_vregs[0x08/2]); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_vregs[0x0a/2]); - tilemap_set_scrollx(state->m_tx_tilemap,0,state->m_vregs[0x00/2]); - tilemap_set_scrolly(state->m_tx_tilemap,0,state->m_vregs[0x02/2]); - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_vregs[0x04/2]); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_vregs[0x06/2]); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + bestleag_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_vregs[0x08/2]); + state->m_bg_tilemap->set_scrolly(0,state->m_vregs[0x0a/2]); + state->m_tx_tilemap->set_scrollx(0,state->m_vregs[0x00/2]); + state->m_tx_tilemap->set_scrolly(0,state->m_vregs[0x02/2]); + state->m_fg_tilemap->set_scrollx(0,state->m_vregs[0x04/2]); + state->m_fg_tilemap->set_scrolly(0,state->m_vregs[0x06/2]); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -201,21 +201,21 @@ { bestleag_state *state = space->machine().driver_data(); state->m_txram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( bestleag_bgram_w ) { bestleag_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( bestleag_fgram_w ) { bestleag_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE16_DEVICE_HANDLER( oki_bank_w ) @@ -363,10 +363,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bestleag) + MCFG_SCREEN_UPDATE_STATIC(bestleag) MCFG_GFXDECODE(bestleag) MCFG_PALETTE_LENGTH(0x800) @@ -382,7 +381,7 @@ static MACHINE_CONFIG_DERIVED( bestleaw, bestleag ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(bestleaw) + MCFG_SCREEN_UPDATE_STATIC(bestleaw) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/bfcobra.c mame-0.145/src/mame/drivers/bfcobra.c --- mame-0.144/src/mame/drivers/bfcobra.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfcobra.c 2012-02-06 21:30:41.000000000 +0000 @@ -339,9 +339,9 @@ } } -static SCREEN_UPDATE( bfcobra ) +static SCREEN_UPDATE_RGB32( bfcobra ) { - bfcobra_state *state = screen->machine().driver_data(); + bfcobra_state *state = screen.machine().driver_data(); int x, y; UINT8 *src; UINT32 *dest; @@ -372,26 +372,26 @@ lorescol = state->m_col8bit; } - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT16 y_offset = (y + state->m_v_scroll) * 256; src = &state->m_video_ram[offset + y_offset]; - dest = BITMAP_ADDR32(bitmap, y, 0); + dest = &bitmap.pix32(y); - for (x = cliprect->min_x; x <= cliprect->max_x / 2; ++x) + for (x = cliprect.min_x; x <= cliprect.max_x / 2; ++x) { UINT8 x_offset = x + state->m_h_scroll; UINT8 pen = *(src + x_offset); if ( ( state->m_videomode & 0x81 ) == 1 || (state->m_videomode & 0x80 && pen & 0x80) ) { - *dest++ = screen->machine().pens[hirescol[pen & 0x0f]]; - *dest++ = screen->machine().pens[hirescol[(pen >> 4) & 0x0f]]; + *dest++ = screen.machine().pens[hirescol[pen & 0x0f]]; + *dest++ = screen.machine().pens[hirescol[(pen >> 4) & 0x0f]]; } else { - *dest++ = screen->machine().pens[lorescol[pen]]; - *dest++ = screen->machine().pens[lorescol[pen]]; + *dest++ = screen.machine().pens[lorescol[pen]]; + *dest++ = screen.machine().pens[lorescol[pen]]; } } } @@ -1785,10 +1785,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512 - 1, 0, 256 - 1) - MCFG_SCREEN_UPDATE(bfcobra) + MCFG_SCREEN_UPDATE_STATIC(bfcobra) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/bfm_sc1.c mame-0.145/src/mame/drivers/bfm_sc1.c --- mame-0.144/src/mame/drivers/bfm_sc1.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_sc1.c 2012-02-06 21:30:33.000000000 +0000 @@ -1097,11 +1097,10 @@ MCFG_DEFAULT_LAYOUT(layout_bfm_sc1) MCFG_SCREEN_ADD("adder", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_SIZE( 400, 300) MCFG_SCREEN_VISIBLE_AREA( 0, 400-1, 0, 300-1) - MCFG_SCREEN_UPDATE(adder2) + MCFG_SCREEN_UPDATE_STATIC(adder2) MCFG_VIDEO_START( adder2) MCFG_VIDEO_RESET( adder2) @@ -2691,157 +2690,158 @@ ///////////////////////////////////////////////////////////////////////////////////// +#define GAME_FLAGS GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL -GAME( 1988, sc1lotus , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Lotus SE (Dutch)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1988, sc1roul , 0 , scorpion1 , scorpion1 , rou029 , 0, "BFM/ELAM", "Roulette (Dutch, Game Card 39-360-129?)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, sc1clatt , 0 , scorpion1 , clatt , clatt , 0, "BFM", "Club Attraction (UK, Game Card 39-370-196)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, sc1clatta , sc1clatt , scorpion1 , clatt , clatt , 0, "BFM", "Club Attraction (set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1actv8 , 0 , scorpion1_viper , scorpion1 , nocrypt , 0, "BFM", "Active 8 (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1armad , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Armada (Bellfruit) (Dutch) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1bartk , 0 , scorpion1_viper , clatt , lotse , 0, "BFM", "Bar Trek (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1barcd , 0 , scorpion1_viper , clatt , lotse , 0, "BFM", "Barcode (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1bigmt , 0 , scorpion1_viper , clatt , nocrypt , 0, "BFM", "The Big Match (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1calyp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Calypso (Bellfruit) (Dutch) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1carro , 0 , scorpion1 , scorpion1 , nocrypt_bank0 , 0, "BFM/ELAM", "Carrousel (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshat , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Attraction (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshcd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cash Card (Bellfruit) (Dutch) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshcda , sc1cshcd , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Card (Bellfruit) (Scorpion 1, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshcdb , sc1cshcd , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Card (Bellfruit) (Scorpion 1, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1ccoin , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Coin (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cexpd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cash Explosion (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cexpl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Explosion (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshwz , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Wise (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cshin , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cashino (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1china , 0 , scorpion1_viper , scorpion1 , lotse , 0, "BFM", "China Town Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1class , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Classic (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cwcl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Clockwise Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clown , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Clown Around (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cl2k , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Club 2000 (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cl2k1 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Club 2001 (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1cl65 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club 65 Special (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbdm , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Diamond (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbxp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Explosion (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbrn , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Runner (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbsp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Spinner (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbtm , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Temptation (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1clbw , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Wise (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1copdd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cops 'n' Robbers Deluxe (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1copdx , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cops 'n' Robbers Deluxe (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // is this really sc1? it does nothing -GAME( 198?, sc1count , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Count Cash Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1dago , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Dagobert's Vault (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1disc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Discovey (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1dblch , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Double Chance (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1dream , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Dream Machine (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1final , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Final Touch (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1flash , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Flash (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1fruit , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Fruit Lines (Bellfruit) (Scorpion 1, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1frtln , sc1fruit , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Fruit Lines (Bellfruit) (Scorpion 1, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1funh , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Fun House Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1gtime , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Good Times (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1tiara , 0 , scorpion1 , scorpion1 , nocrypt , 0, "ELAM", "Tiara (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1gprix , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Grand Prix (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1gslam , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM", "Grand Slam (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1happy , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM", "Happy Hour (Bellfruit - Elam) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1impc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Impact (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1kings , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Kings Club (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1linx , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Linx (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1magc , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Magic Circle (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1manha , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Manhattan (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1mast , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Master Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1quat , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Quatro (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1mist , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Mistral (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1olym , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Olympia (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1orac , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Oracle (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1pwrl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Power Lines (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1rain , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Rainbow (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1re , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Reel Cash (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1rese , sc1re , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Reel Cash SE (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // doesn't say 'SE' -GAME( 198?, sc1revo , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Revolution (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1rose , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Rose 'n' Crown (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1sant , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Santana (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1sat , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Satellite (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1shan , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Shanghai (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1spct , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Spectre (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1spit , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Spitfire (Elam) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1ster , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Sterling (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1str4 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Strike 4 (Bellfruit) (Scorpion 1, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1str4a , sc1str4 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Strike 4 (Bellfruit) (Scorpion 1, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1sir , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Strike It Rich (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1sups , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Superstar (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1torn , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Tornado (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1tri , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Tri Star (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1typ , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Typhoon Club (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1ult , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Ultimate (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1vent , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Ventura (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1vict , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Victory (Bellfruit) [Dutch] (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1voy , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Voyager (Bellfruit) (Scorpion 1, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1voya , sc1voy , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Voyager (Bellfruit) (Scorpion 1, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1winfl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Winfalls [Dutch] (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1winst , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Winning Streak (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1zep , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Zeppelin (Bellfruit) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, sc1wthn , 0 , scorpion1 , scorpion1 , lotse , 0, "Eurocoin", "Wild Thing (Eurocoin) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, sc1moonl , 0 , scorpion1 , scorpion1 , lotse , 0, "Bwb", "Moon Lite (Bwb)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1ltdv , 0 , scorpion1 , scorpion1 , lotse , 0, "Pcp", "Little Devil (Pcp)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 198?, sc1t1k , 0 , scorpion1 , scorpion1 , lotse , 0, "Eurocoin", "Top 1000 (Eurocoin) (Scorpion 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 1988, sc1lotus , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Lotus SE (Dutch)", GAME_FLAGS ) +GAME( 1988, sc1roul , 0 , scorpion1 , scorpion1 , rou029 , 0, "BFM/ELAM", "Roulette (Dutch, Game Card 39-360-129?)", GAME_FLAGS ) +GAME( 1990, sc1clatt , 0 , scorpion1 , clatt , clatt , 0, "BFM", "Club Attraction (UK, Game Card 39-370-196)", GAME_FLAGS ) +GAME( 1990, sc1clatta , sc1clatt , scorpion1 , clatt , clatt , 0, "BFM", "Club Attraction (set 2)", GAME_FLAGS ) +GAME( 198?, sc1actv8 , 0 , scorpion1_viper , scorpion1 , nocrypt , 0, "BFM", "Active 8 (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1armad , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Armada (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1bartk , 0 , scorpion1_viper , clatt , lotse , 0, "BFM", "Bar Trek (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1barcd , 0 , scorpion1_viper , clatt , lotse , 0, "BFM", "Barcode (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1bigmt , 0 , scorpion1_viper , clatt , nocrypt , 0, "BFM", "The Big Match (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1calyp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Calypso (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1carro , 0 , scorpion1 , scorpion1 , nocrypt_bank0 , 0, "BFM/ELAM", "Carrousel (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cshat , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Attraction (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cshcd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cash Card (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cshcda , sc1cshcd , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Card (Bellfruit) (Scorpion 1, set 1)", GAME_FLAGS ) +GAME( 198?, sc1cshcdb , sc1cshcd , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Card (Bellfruit) (Scorpion 1, set 2)", GAME_FLAGS ) +GAME( 198?, sc1ccoin , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Coin (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cexpd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cash Explosion (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cexpl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Explosion (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cshwz , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Wise (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cshin , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cashino (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1china , 0 , scorpion1_viper , scorpion1 , lotse , 0, "BFM", "China Town Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1class , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Classic (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cwcl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Clockwise Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clown , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Clown Around (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cl2k , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Club 2000 (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cl2k1 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Club 2001 (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1cl65 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club 65 Special (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbdm , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Diamond (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbxp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Explosion (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbrn , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Runner (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbsp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Spinner (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbtm , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Temptation (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1clbw , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club Wise (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1copdd , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Cops 'n' Robbers Deluxe (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1copdx , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cops 'n' Robbers Deluxe (Bellfruit) (Scorpion 1)", GAME_FLAGS ) // is this really sc1? it does nothing +GAME( 198?, sc1count , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Count Cash Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1dago , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Dagobert's Vault (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1disc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Discovey (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1dblch , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Double Chance (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1dream , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Dream Machine (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1final , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Final Touch (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1flash , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Flash (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1fruit , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Fruit Lines (Bellfruit) (Scorpion 1, set 1)", GAME_FLAGS ) +GAME( 198?, sc1frtln , sc1fruit , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Fruit Lines (Bellfruit) (Scorpion 1, set 2)", GAME_FLAGS ) +GAME( 198?, sc1funh , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Fun House Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1gtime , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Good Times (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1tiara , 0 , scorpion1 , scorpion1 , nocrypt , 0, "ELAM", "Tiara (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1gprix , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Grand Prix (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1gslam , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM", "Grand Slam (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1happy , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM", "Happy Hour (Bellfruit - Elam) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1impc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Impact (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1kings , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Kings Club (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1linx , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Linx (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1magc , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Magic Circle (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1manha , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Manhattan (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1mast , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Master Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1quat , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Quatro (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1mist , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "BFM/ELAM", "Mistral (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1olym , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Olympia (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1orac , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Oracle (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1pwrl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Power Lines (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1rain , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Rainbow (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1re , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Reel Cash (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1rese , sc1re , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Reel Cash SE (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) // doesn't say 'SE' +GAME( 198?, sc1revo , 0 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Revolution (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1rose , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Rose 'n' Crown (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1sant , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Santana (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1sat , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Satellite (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1shan , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Shanghai (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1spct , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Spectre (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1spit , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Spitfire (Elam) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1ster , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Sterling (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1str4 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Strike 4 (Bellfruit) (Scorpion 1, set 1)", GAME_FLAGS ) +GAME( 198?, sc1str4a , sc1str4 , scorpion1 , scorpion1 , nocrypt , 0, "BFM/ELAM", "Strike 4 (Bellfruit) (Scorpion 1, set 2)", GAME_FLAGS ) +GAME( 198?, sc1sir , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Strike It Rich (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1sups , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Superstar (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1torn , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Tornado (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1tri , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Tri Star (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1typ , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Typhoon Club (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1ult , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Ultimate (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1vent , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Ventura (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1vict , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Victory (Bellfruit) [Dutch] (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1voy , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Voyager (Bellfruit) (Scorpion 1, set 1)", GAME_FLAGS ) +GAME( 198?, sc1voya , sc1voy , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Voyager (Bellfruit) (Scorpion 1, set 2)", GAME_FLAGS ) +GAME( 198?, sc1winfl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Winfalls [Dutch] (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1winst , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Winning Streak (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1zep , 0 , scorpion1 , scorpion1 , lotse , 0, "ELAM", "Zeppelin (Bellfruit) (Scorpion 1)", GAME_FLAGS ) +GAME( 198?, sc1wthn , 0 , scorpion1 , scorpion1 , lotse , 0, "Eurocoin", "Wild Thing (Eurocoin) (Scorpion 1)", GAME_FLAGS ) +GAME( 199?, sc1moonl , 0 , scorpion1 , scorpion1 , lotse , 0, "Bwb", "Moon Lite (Bwb)", GAME_FLAGS) +GAME( 199?, sc1ltdv , 0 , scorpion1 , scorpion1 , lotse , 0, "Pcp", "Little Devil (Pcp)", GAME_FLAGS) +GAME( 198?, sc1t1k , 0 , scorpion1 , scorpion1 , lotse , 0, "Eurocoin", "Top 1000 (Eurocoin) (Scorpion 1)", GAME_FLAGS ) GAME( 199?, sc1smoke , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Mdm", "Smokey Vs The Bandit (Mdm) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) GAME( 199?, sc1ccroc , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Mdm", "Crazy Crocs (Mdm) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) GAME( 199?, sc1crocr , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Mdm", "Croc And Roll (Mdm) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) GAME( 199?, sc1btclk , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Mdm", "Beat The Clock (Mdm) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME( 199?, sc1clins , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/PCP", "Cash Lines (Bellfruit) (Scorpion 1) (set 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clinsa , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM/PCP", "Cash Lines (Bellfruit) (Scorpion 1) (set 2)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clinsb , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clinsc , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clinsd , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 5)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clinse , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 6)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clb3 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club 3000 (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1czbrk , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Crazy Break (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // Battery Defect -GAME( 199?, sc1energ , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Energy (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // Battery Defect -GAME( 199?, sc1hipt , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "High Point (Bellfruit) (Scorpion 1) (set 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1hipta , sc1hipt , scorpion1 , scorpion1 , lotse , 0, "BFM", "High Point (Bellfruit) (Scorpion 1) (set 2)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1satse , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Satellite SE (Bellfruit) (Dutch) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1strk , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Strike (Bellfruit) (Dutch) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1supfl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Super Flush (Bellfruit) (Dutch) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc1clins , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/PCP", "Cash Lines (Bellfruit) (Scorpion 1) (set 1)", GAME_FLAGS) +GAME( 199?, sc1clinsa , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM/PCP", "Cash Lines (Bellfruit) (Scorpion 1) (set 2)", GAME_FLAGS) +GAME( 199?, sc1clinsb , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 3)", GAME_FLAGS) +GAME( 199?, sc1clinsc , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 4)", GAME_FLAGS) +GAME( 199?, sc1clinsd , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 5)", GAME_FLAGS) +GAME( 199?, sc1clinse , sc1clins , scorpion1 , scorpion1 , lotse , 0, "BFM", "Cash Lines (Bellfruit) (Scorpion 1) (set 6)", GAME_FLAGS) +GAME( 199?, sc1clb3 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Club 3000 (Bellfruit) (Scorpion 1)", GAME_FLAGS) +GAME( 199?, sc1czbrk , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Crazy Break (Bellfruit) (Scorpion 1)", GAME_FLAGS) // Battery Defect +GAME( 199?, sc1energ , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Energy (Bellfruit) (Scorpion 1)", GAME_FLAGS) // Battery Defect +GAME( 199?, sc1hipt , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "High Point (Bellfruit) (Scorpion 1) (set 1)", GAME_FLAGS) +GAME( 199?, sc1hipta , sc1hipt , scorpion1 , scorpion1 , lotse , 0, "BFM", "High Point (Bellfruit) (Scorpion 1) (set 2)", GAME_FLAGS) +GAME( 199?, sc1satse , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Satellite SE (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS) +GAME( 199?, sc1strk , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Strike (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS) +GAME( 199?, sc1supfl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM/ELAM", "Super Flush (Bellfruit) (Dutch) (Scorpion 1)", GAME_FLAGS) // are they really SC1? -GAME( 199?, sc1btbc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Beat The Bank Club (Bellfruit) (Scorpion 1?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // behaves like sc1clbdya, but then locks up -GAME( 199?, sc1frpus , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Fruit Pursuit (Bellfruit) (Scorpion 1?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1ofs56 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "unknown 'ofs56cp' (Bellfruit) (Scorpion 1?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // OFAH - Phoenix 1 -GAME( 199?, sc1boncl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Bonanza Club (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc1btbc , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Beat The Bank Club (Bellfruit) (Scorpion 1?)", GAME_FLAGS) // behaves like sc1clbdya, but then locks up +GAME( 199?, sc1frpus , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Fruit Pursuit (Bellfruit) (Scorpion 1?)", GAME_FLAGS) +GAME( 199?, sc1ofs56 , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "unknown 'ofs56cp' (Bellfruit) (Scorpion 1?)", GAME_FLAGS) // OFAH - Phoenix 1 +GAME( 199?, sc1boncl , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Bonanza Club (Bellfruit) (Scorpion 1)", GAME_FLAGS) // are these really SC1? they do more here than in SC2 at least! -GAME( 199?, sc1days , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "All In A Days Work (Global)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1cscl , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Cash Classic (Global)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1driv , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Driving School (Global)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1vsd , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Vegas Super Deal (Global)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc1days , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "All In A Days Work (Global)", GAME_FLAGS) +GAME( 199?, sc1cscl , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Cash Classic (Global)", GAME_FLAGS) +GAME( 199?, sc1driv , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Driving School (Global)", GAME_FLAGS) +GAME( 199?, sc1vsd , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Vegas Super Deal (Global)", GAME_FLAGS) -GAME( 199?, sc1wof , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Wheel Of Fortune (Global) (set 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1wofa , sc1wof , scorpion1 , scorpion1 , lotse , 0, "Global", "Wheel Of Fortune (Global) (set 2)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1wofb , sc1wof , scorpion1 , scorpion1 , nocrypt , 0, "Global", "Wheel Of Fortune (Global) (set 3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1crzyc , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Crazy Cash (Global) (set 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1crzyca , sc1crzyc , scorpion1 , scorpion1 , lotse , 0, "Global", "Crazy Cash (Global) (set 2)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clbdy , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Club Dynamite (Global) (set 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1clbdya , sc1clbdy , scorpion1 , scorpion1 , lotse , 0, "Global", "Club Dynamite (Global) (set 2)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1chqfl , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Chequered Flag (Global)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1992, sc1s1000 , 0 , scorpion1 , scorpion1 , lotse , 0, "Deltasoft", "Super 1000 (Deltasoft)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // JT/Deltasoft Nov 1992 +GAME( 199?, sc1wof , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Wheel Of Fortune (Global) (set 1)", GAME_FLAGS) +GAME( 199?, sc1wofa , sc1wof , scorpion1 , scorpion1 , lotse , 0, "Global", "Wheel Of Fortune (Global) (set 2)", GAME_FLAGS) +GAME( 199?, sc1wofb , sc1wof , scorpion1 , scorpion1 , nocrypt , 0, "Global", "Wheel Of Fortune (Global) (set 3)", GAME_FLAGS) +GAME( 199?, sc1crzyc , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Crazy Cash (Global) (set 1)", GAME_FLAGS) +GAME( 199?, sc1crzyca , sc1crzyc , scorpion1 , scorpion1 , lotse , 0, "Global", "Crazy Cash (Global) (set 2)", GAME_FLAGS) +GAME( 199?, sc1clbdy , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Club Dynamite (Global) (set 1)", GAME_FLAGS) +GAME( 199?, sc1clbdya , sc1clbdy , scorpion1 , scorpion1 , lotse , 0, "Global", "Club Dynamite (Global) (set 2)", GAME_FLAGS) +GAME( 199?, sc1chqfl , 0 , scorpion1 , scorpion1 , lotse , 0, "Global", "Chequered Flag (Global)", GAME_FLAGS) +GAME( 1992, sc1s1000 , 0 , scorpion1 , scorpion1 , lotse , 0, "Deltasoft", "Super 1000 (Deltasoft)", GAME_FLAGS) // JT/Deltasoft Nov 1992 -GAME( 199?, sc1dip , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Diplomat (Eurocoin) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // 53 RY error -GAME( 199?, sc1lamb , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Lambada (Eurocoin) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // -GAME( 199?, sc1reply , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Replay (Eurocoin) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // +GAME( 199?, sc1dip , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Diplomat (Eurocoin) (Scorpion 1)", GAME_FLAGS) // 53 RY error +GAME( 199?, sc1lamb , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Lambada (Eurocoin) (Scorpion 1)", GAME_FLAGS) // +GAME( 199?, sc1reply , 0 , scorpion1 , scorpion1 , nocrypt , 0, "Eurocoin", "Replay (Eurocoin) (Scorpion 1)", GAME_FLAGS) // -GAME( 199?, sc1cdm , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Crystal", "Club Diamond (Crystal) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1hfcc , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Crystal", "Hi Flyer Club (Crystal) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc1cdm , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Crystal", "Club Diamond (Crystal) (Scorpion 1)", GAME_FLAGS) +GAME( 199?, sc1hfcc , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Crystal", "Hi Flyer Club (Crystal) (Scorpion 1)", GAME_FLAGS) -GAME( 199?, sc1twice , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Associated Leisure", "Twice As Nice (Associated Leisure) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data? -GAME( 199?, sc1chain , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Chain Reaction (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc1potp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Pick Of The Pack (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) //was mixed with the sc4/5 potp roms.. System status 98 -GAME( 199?, sc1potpa , sc1potp , scorpion1 , scorpion1 , lotse , 0, "BFM", "Double Dealer (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // ^ with above.. seems the same game, but different name +GAME( 199?, sc1twice , 0 , scorpion1 , scorpion1 , lotse_bank0 , 0, "Associated Leisure", "Twice As Nice (Associated Leisure) (Scorpion 1)", GAME_FLAGS) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data? +GAME( 199?, sc1chain , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Chain Reaction (Bellfruit) (Scorpion 1)", GAME_FLAGS) +GAME( 199?, sc1potp , 0 , scorpion1 , scorpion1 , lotse , 0, "BFM", "Pick Of The Pack (Bellfruit) (Scorpion 1)", GAME_FLAGS) //was mixed with the sc4/5 potp roms.. System status 98 +GAME( 199?, sc1potpa , sc1potp , scorpion1 , scorpion1 , lotse , 0, "BFM", "Double Dealer (Bellfruit) (Scorpion 1)", GAME_FLAGS) // ^ with above.. seems the same game, but different name -GAME( 199?, sc1scunk , 0 , scorpion1 , scorpion1 , lotse , 0, "", "unknown Scorpion 1 'Super ?' (Bellfruit) (Scorpion 1)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // ^ with above.. seems the same game, but different name +GAME( 199?, sc1scunk , 0 , scorpion1 , scorpion1 , lotse , 0, "", "unknown Scorpion 1 'Super ?' (Bellfruit) (Scorpion 1)", GAME_FLAGS) // ^ with above.. seems the same game, but different name //Adder 2 -GAME( 1996, m_tppokr, 0, scorpion1_adder2 , toppoker , toppoker , 0, "BFM/ELAM", "Top Poker (Dutch, Game Card 95-750-899)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK ) +GAME( 1996, m_tppokr, 0, scorpion1_adder2 , toppoker , toppoker , 0, "BFM/ELAM", "Top Poker (Dutch, Game Card 95-750-899)", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/bfm_sc2.c mame-0.145/src/mame/drivers/bfm_sc2.c --- mame-0.144/src/mame/drivers/bfm_sc2.c 2012-01-13 15:34:33.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_sc2.c 2012-02-06 21:30:33.000000000 +0000 @@ -1401,15 +1401,15 @@ BFM_BD1_init(1); } -static SCREEN_UPDATE( addersc2 ) +static SCREEN_UPDATE_IND16( addersc2 ) { - bfm_sc2_state *state = screen->machine().driver_data(); + bfm_sc2_state *state = screen.machine().driver_data(); if ( state->m_sc2_show_door ) { - output_set_value("door",( Scorpion2_GetSwitchState(screen->machine(),state->m_sc2_door_state>>4, state->m_sc2_door_state & 0x0F) ) ); + output_set_value("door",( Scorpion2_GetSwitchState(screen.machine(),state->m_sc2_door_state>>4, state->m_sc2_door_state & 0x0F) ) ); } - return SCREEN_UPDATE_CALL(adder2); + return SCREEN_UPDATE16_CALL(adder2); } @@ -2146,11 +2146,10 @@ MCFG_DEFAULT_LAYOUT(layout_bfm_sc2) MCFG_SCREEN_ADD("adder", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 400, 280) MCFG_SCREEN_VISIBLE_AREA( 0, 400-1, 0, 280-1) MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE(addersc2) + MCFG_SCREEN_UPDATE_STATIC(addersc2) MCFG_VIDEO_START( adder2) MCFG_VIDEO_RESET( adder2) @@ -5394,6 +5393,8 @@ /* Video Based (Adder 2) */ +#define GAME_FLAGS GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL + GAMEL( 1993, qntoondo, qntoond, scorpion2_vid, qntoond, adder_dutch,0, "BFM/ELAM", "Quintoon (Dutch, Game Card 95-750-136)", GAME_SUPPORTS_SAVE,layout_quintoon ) GAMEL( 1993, quintoon, 0, scorpion2_vid, quintoon, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-750-206)", GAME_SUPPORTS_SAVE|GAME_IMPERFECT_SOUND,layout_quintoon ) //Current samples need verification GAMEL( 1993, quintond, quintoon, scorpion2_vid, quintoon, quintoon, 0, "BFM", "Quintoon (UK, Game Card 95-751-206, Datapak)",GAME_SUPPORTS_SAVE|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING,layout_quintoon ) //Current samples need verification @@ -5433,96 +5434,96 @@ GAMEL( 1994, sc2drwho19 , sc2drwho , scorpion2 , drwho , drwhon , 0, "BFM/Mazooma", "Dr.Who The Timelord (set 20) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL | GAME_NOT_WORKING,layout_drwho) // error 99 GAMEL( 1994, sc2drwho20 , sc2drwho , scorpion2 , drwho , drwhon , 0, "BFM", "Dr.Who The Timelord Deluxe (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL,layout_drwho) -GAME( 1994, sc2brkfs , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 1 UK, Game Card 95-750-524) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfs1 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 2) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfs2 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 3) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfs3 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 4) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfs4 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 5) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfs5 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 6) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 1994, sc2brkfsm , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM/Mazooma", "The Big Breakfast Casino (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 1994, sc2brkfs , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 1 UK, Game Card 95-750-524) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfs1 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 2) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfs2 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 3) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfs3 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 4) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfs4 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 5) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfs5 , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "The Big Breakfast (set 6) (Scorpion 2/3)", GAME_FLAGS) +GAME( 1994, sc2brkfsm , sc2brkfs , scorpion2 , bbrkfst , bbrkfst , 0, "BFM/Mazooma", "The Big Breakfast Casino (Scorpion 2/3)", GAME_FLAGS) GAME( 1995, sc2focus , 0 , scorpion3 , scorpion3 , focus , 0, "BFM/ELAM", "Focus (Dutch, Game Card 95-750-347) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL) GAME( 1996, sc2gslam , 0 , scorpion2 , bfmcgslm , bfmcgslm , 0, "BFM", "Grandslam Club (UK, Game Card 95-750-843) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL) -GAME( 199?, sc2cshcl , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "Cashino Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2catms , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "Cat & Mouse (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2eggs , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Eggs On Legs Tour (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2gsclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "The Game Show Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2suprz , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Surprise Surprize (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cpg , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Pharaoh's Gold Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2motd , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Match Of The Day (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2easy , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Easy Money (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2majes , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Majestic Bells (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2dels , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Del's Millions (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2wembl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Road To Wembley (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2wemblm , sc2wembl , scorpion2 , drwho , drwho , 0, "BFM/Mazooma", "Road To Wembley (Bellfruit/Mazooma) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // error 99 -GAME( 199?, sc2downt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Down Town (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2inst , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Instant Jackpot (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2mam , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Make A Million (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2mamcl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Make A Million Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2showt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Showtime Spectacular (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2sstar , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Superstar (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2wwcl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Wild West Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc2cshcl , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "Cashino Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2catms , 0 , scorpion2 , bbrkfst , bbrkfst , 0, "BFM", "Cat & Mouse (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2eggs , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Eggs On Legs Tour (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2gsclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "The Game Show Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2suprz , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Surprise Surprize (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cpg , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Pharaoh's Gold Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2motd , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Match Of The Day (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2easy , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Easy Money (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2majes , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Majestic Bells (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2dels , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Del's Millions (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2wembl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Road To Wembley (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2wemblm , sc2wembl , scorpion2 , drwho , drwho , 0, "BFM/Mazooma", "Road To Wembley (Bellfruit/Mazooma) (Scorpion 2/3)", GAME_FLAGS) // error 99 +GAME( 199?, sc2downt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Down Town (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2inst , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Instant Jackpot (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2mam , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Make A Million (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2mamcl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Make A Million Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2showt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Showtime Spectacular (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2sstar , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Superstar (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2wwcl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Wild West Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) // this one is a bit strange (not encrypted, gives 'PROM ERROR 2'), is it really sc2? BFMemulator layout dat says it is -GAME( 199?, sc2pe1g , 0 , scorpion2 , drwho , drwhon , 0, "BFM", "Public Enemy No.1 (Bellfruit) [German] (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc2pe1g , 0 , scorpion2 , drwho , drwhon , 0, "BFM", "Public Enemy No.1 (Bellfruit) [German] (Scorpion 2/3)", GAME_FLAGS) // these need inverted service door, and seem to have some issues with the reels jumping between 2 values? -GAME( 199?, sc2goldr , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "Gold Reserve (Mdm) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2hifly , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "High Flyer (Mdm) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2scc , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "Safe Cracker Club (Mdm) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // also marked as 'GLOBAL'? +GAME( 199?, sc2goldr , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "Gold Reserve (Mdm) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2hifly , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "High Flyer (Mdm) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2scc , 0 , scorpion2 , drwho , drwho , 0, "Mdm", "Safe Cracker Club (Mdm) (Scorpion 2/3)", GAME_FLAGS) // also marked as 'GLOBAL'? // custom Global sound system? -GAME( 199?, sc2dick , 0 , scorpion2 , drwho , drwho , 0, "Global", "Spotted Dick (Global) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2pick , 0 , scorpion2 , drwho , drwho , 0, "Global", "Pick Of The Bunch (Global) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2rock , 0 , scorpion2 , drwho , drwho , 0, "Global", "How Big's Your Rock (Global) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2call , 0 , scorpion2 , drwho , drwho , 0, "Global", "It's Your Call (Global) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 199?, sc2prom , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Along The Prom (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2payr , 0 , scorpion2 , drwho , drwho , 0, "BFM/Mazooma", "Pay Roll Casino (Bellfruit/Mazooma) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 199?, sc2bar7 , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Bar 7 (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2bbar7 , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Big Bar 7 (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2flutr , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Flutter (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2smnud , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Multi Nudger (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc2dick , 0 , scorpion2 , drwho , drwho , 0, "Global", "Spotted Dick (Global) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2pick , 0 , scorpion2 , drwho , drwho , 0, "Global", "Pick Of The Bunch (Global) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2rock , 0 , scorpion2 , drwho , drwho , 0, "Global", "How Big's Your Rock (Global) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2call , 0 , scorpion2 , drwho , drwho , 0, "Global", "It's Your Call (Global) (Scorpion 2/3)", GAME_FLAGS) + +GAME( 199?, sc2prom , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Along The Prom (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2payr , 0 , scorpion2 , drwho , drwho , 0, "BFM/Mazooma", "Pay Roll Casino (Bellfruit/Mazooma) (Scorpion 2/3)", GAME_FLAGS) + +GAME( 199?, sc2bar7 , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Bar 7 (Concept)", GAME_FLAGS) +GAME( 199?, sc2bbar7 , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Big Bar 7 (Concept)", GAME_FLAGS) +GAME( 199?, sc2flutr , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Flutter (Concept)", GAME_FLAGS) +GAME( 199?, sc2smnud , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Multi Nudger (Concept)", GAME_FLAGS) //Seems to be plain Scorpion 2 - keeps tripping watchdog? -GAME( 199?, sc2scshx , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2sghst , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Ghost (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2scshxgman, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept) (Gamesman Hardware)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2scshxstar, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept) (Starpoint Hardware)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2scshxcas, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Casino Cash X (Concept)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - -GAME( 199?, sc2cgc , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Carrot Gold Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cnile , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cash On The Nile Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2casr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Casino Royale (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cmbt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cat & Mouse & Bonzo Too (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2dbl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Double Diamond (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2flaca , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Flash Cash (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2foot , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Football Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2gcclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Casino Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2groul , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Roulette (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2gldsh , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Shot (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2gtr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Great Train Robbery (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2heypr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Hey Presto (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2hypr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Hyperactive (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2kcclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "King Cash Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2maina , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Main Attraction (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2olgld , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Olympic Gold (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2relgm , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Reel Gems (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2topwk , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Top Wack (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cb7 , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Casino Bar 7 (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cgcas , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Club Grand Casino (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cvega , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cash Vegas (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc2scshx , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept)", GAME_FLAGS) +GAME( 199?, sc2sghst , 0 , scorpion2 , drwho , drwho , 0, "Concept", "Super Ghost (Concept)", GAME_FLAGS) +GAME( 199?, sc2scshxgman, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept) (Gamesman Hardware)", GAME_FLAGS) +GAME( 199?, sc2scshxstar, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Cash X (Concept) (Starpoint Hardware)", GAME_FLAGS) +GAME( 199?, sc2scshxcas, sc2scshx , scorpion2 , drwho , drwho , 0, "Concept", "Super Casino Cash X (Concept)", GAME_FLAGS) + +GAME( 199?, sc2cgc , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Carrot Gold Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cnile , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cash On The Nile Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2casr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Casino Royale (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cmbt , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cat & Mouse & Bonzo Too (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2dbl , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Double Diamond (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2flaca , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Flash Cash (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2foot , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Football Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2gcclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Casino Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2groul , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Roulette (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2gldsh , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Golden Shot (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2gtr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Great Train Robbery (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2heypr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Hey Presto (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2hypr , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Hyperactive (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2kcclb , 0 , scorpion2 , drwho , drwho , 0, "BFM", "King Cash Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2maina , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Main Attraction (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2olgld , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Olympic Gold (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2relgm , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Reel Gems (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2topwk , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Top Wack (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cb7 , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Casino Bar 7 (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cgcas , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Club Grand Casino (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cvega , 0 , scorpion2 , drwho , drwho , 0, "BFM", "Cash Vegas (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) // Games with Dot Matrix Displays */ GAME( 1996, sc2luvv , 0 , scorpion2_dm01 , luvjub , luvjub , 0, "BFM", "Luvvly Jubbly (UK Multisite 10/25p, Game Card 95-750-808) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL) GAME( 1996, sc2cpe , 0 , scorpion2_dm01 , cpeno1 , cpeno1 , 0, "BFM", "Club Public Enemy No.1 (UK, Game Card 95-750-846) (Scorpion 2/3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL) -GAME( 199?, sc2town , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Round The Town (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2ofool , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Only Fools & Horses (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2ptytm , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Party Time (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2cops , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2copcl , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2copdc , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, sc2prem , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Premier Club Manager (Bellfruit) (Scorpion 2/3)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, sc2town , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Round The Town (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2ofool , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Only Fools & Horses (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2ptytm , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Party Time (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2cops , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2copcl , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers Club (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2copdc , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Cops 'n' Robbers Club Deluxe (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) +GAME( 199?, sc2prem , 0 , scorpion2_dm01 , drwho , drwho , 0, "BFM", "Premier Club Manager (Bellfruit) (Scorpion 2/3)", GAME_FLAGS) diff -Nru mame-0.144/src/mame/drivers/bfm_sc45.h mame-0.145/src/mame/drivers/bfm_sc45.h --- mame-0.144/src/mame/drivers/bfm_sc45.h 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_sc45.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,2854 +0,0 @@ -/* Scorpion 4 + 5 driver releated includes */ -/* mainly used for stuff which is currently shared between sc4 / 5 sets to avoid duplication */ - -#define sc_ivply_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004313.snd", 0x0000, 0x080000, CRC(28faed9e) SHA1(624d6cfcc97dd1950b5d908cde2e4d2eb6ea1dc6) ) \ - -#define sc_plays_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891106.bin", 0x0000, 0x5000, CRC(1f616820) SHA1(c0b19d4243f250c3159564c65e9a2247e61e315f) ) \ - ROM_LOAD( "95891107.bin", 0x0000, 0x5000, CRC(6af72c14) SHA1(4666e338fc629a32178f617c8536e7f11d703b14) ) \ - ROM_LOAD( "95891108.bin", 0x0000, 0x5000, CRC(f44de048) SHA1(783ae2b12e8e548a90f626a2050968e3f38b6042) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009013.bin", 0x0000, 0x0f3ee2, CRC(f324a590) SHA1(0533af3304100c99af5fdeba2773d92384101f43) ) \ - -#define sc_a40_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890123.bin", 0x0000, 0x5000, CRC(e3f5466e) SHA1(ae2f45f79d0113e651b8cf5f655a9ceb32a3ddaa) ) \ - ROM_LOAD( "95890124.bin", 0x0000, 0x5000, CRC(9663025a) SHA1(097246412fd4084c1185d8dfd91e884abc5a3f8a) ) \ - ROM_LOAD( "95890125.bin", 0x0000, 0x5000, CRC(08d9ce06) SHA1(9087170d6c6edad735ab5a2abbc0a2191aabfd03) ) \ - ROM_REGION( 0x1000000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008511.bin", 0x0000, 0x0ff5c3, CRC(6fac2014) SHA1(5b364406f7b5d8f4c54561e3977571e4a47273a0) ) \ - -#define sc_acesh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008292.bin", 0x0000, 0x100000, CRC(1c238098) SHA1(e2e2cb52ea84a7dc5e557b61b3ee21bd5a063833) ) \ - -#define sc_adjb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008699.bin", 0x0000, 0x100000, CRC(6d49b54a) SHA1(d64caa1dae40c3bf536f8739d6995b589c7184b7) ) \ - ROM_LOAD( "95008700.bin", 0x0000, 0x100000, CRC(49c37b2a) SHA1(5a59a540becb8c83288ae3a15cfac069fd792e74) ) \ - -#define sc_adga_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_adgtc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_adren_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_alad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008075.bin", 0x0000, 0x080000, CRC(c9306583) SHA1(8bccb9529e7d24be7b4f3ffda0d35780a170be43) ) \ - -#define sc_adsnt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008478.bin", 0x0000, 0x100000, CRC(d8aa3daf) SHA1(dafeb014f04179882921622df9b5c9917279bd02) ) \ - ROM_LOAD( "95008479.bin", 0x0000, 0x100000, CRC(f1ec9928) SHA1(cd2eb8115217c205f248564c9340353c84db2ac5) ) \ - -#define sc_a40cl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008527.bin", 0x0000, 0x0ff5c3, CRC(6fac2014) SHA1(5b364406f7b5d8f4c54561e3977571e4a47273a0) ) \ - -#define sc_adwta_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_aztec_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004286.snd", 0x0000, 0x080000, CRC(20de4ebe) SHA1(0ea12d0c46f90efd8b040c2374d749fb7b15698e) ) \ - -#define sc_bjob_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009126.bin", 0x0000, 0x100000, CRC(55940c44) SHA1(e4f2f36ccf28446011e43f5c8a72fa9d15f72df0) ) \ - ROM_LOAD( "95009127.bin", 0x0000, 0x100000, CRC(0d3ee6d9) SHA1(a40bffaf631010d53ce9228758bbf5dba8423f6e) ) \ - -#define sc_bkngx_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890139.bin", 0x0000, 0x5000, CRC(03d69c54) SHA1(9e1e79378874092a19eb31af8d8b5b2422364086) ) \ - ROM_LOAD( "95890140.bin", 0x0000, 0x5000, CRC(1f006ce8) SHA1(4ce346e7b72546d5d6d9137a5fa6c449c6da292d) ) \ - ROM_LOAD( "95890141.bin", 0x0000, 0x5000, CRC(dc5a4e78) SHA1(31aefb5dcf67eafdd9fc83e086fc00e678f0093a) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bucc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008806.bin", 0x0000, 0x100000, CRC(16ee0143) SHA1(0890da3b2108ec67db1cc8ed2dc40f2eac2a5fbc) ) \ - ROM_LOAD( "95008807.bin", 0x0000, 0x100000, CRC(7141737f) SHA1(74607352f32df2a27f0724f243532c98ca315910) ) \ - -#define sc_bunny_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008907.bin", 0x0000, 0x08b8c3, CRC(2b4911fd) SHA1(7ccdb5e5accb548c10ef288fd901825505559866) ) \ - -#define sc_bantm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008962.bin", 0x0000, 0x100000, CRC(3c10480f) SHA1(67c86228b6199e336beaa21b2982ce3cf5867ed1) ) \ - ROM_LOAD( "95008963.bin", 0x0000, 0x100000, CRC(8ceb0bf8) SHA1(b5712f145ff515c10b0a3b131d0c215a31adbb42) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890434.bin", 0x0000, 0x5000, CRC(37740955) SHA1(c7a9839a4f7f01c916b696a8baedf33d0c146fa3) ) \ - ROM_LOAD( "95890435.bin", 0x0000, 0x5000, CRC(42e24d61) SHA1(dd915ccf979d61cdb0ff7598d35cdceb43d6d8e9) ) \ - ROM_LOAD( "95890436.bin", 0x0000, 0x5000, CRC(dc58813d) SHA1(9bad2c6cdacaa016f5239e578600f1ff03f1ed63) ) \ - -#define sc_bar7_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008409.bin", 0x0000, 0x080000, CRC(ec29c758) SHA1(ceb99fb6edcab5c5e1b0ec46d622ee0f2cdb20be) ) \ - ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) \ - ROM_LOAD( "95008502.bin", 0x0000, 0x080000, CRC(d9bc2c75) SHA1(b9e637d47287a844a6ff1f0b1d1a34b48a806aad) ) \ - ROM_REGION( 0x400000, "other", ROMREGION_ERASE00 ) /* shouldn't be here? - sc1/2 */ \ - ROM_LOAD( "95751960.p1", 0x0000, 0x010000, CRC(9f944d0c) SHA1(feb8fe4ce0a8f5c4a034aafec0f5aae29a834e8d) ) \ - -#define sc_batl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008541.bin", 0x0000, 0x100000, CRC(a739cba8) SHA1(b968cfa18c671aaf027909961a843fc01101d68a) ) \ - ROM_LOAD( "95008542.bin", 0x0000, 0x100000, CRC(686bb7cc) SHA1(4e809f2d1401030127d7afa853189c4fca9742e5) ) \ - -#define sc_bedcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008397.bin", 0x0000, 0x0fe1b3, CRC(d59cd40d) SHA1(585e42b66e691ab9a3df5bb7dae4368226861b04) ) \ - -#define sc_bblas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008302", 0x0000, 0x0fea01, CRC(ef880aee) SHA1(00177f6a0bfe2006d8545834ea4fb22427be97c4) ) \ - -#define sc_bbust_others \ - ROM_REGION( 0x100000, "ymz", 0 ) \ - ROM_LOAD( "95008050.bin", 0x0000, 0x0fc8a1, CRC(8f1a49b5) SHA1(9d75e7118c628b3665a31376a3e35797b7058f6b) ) \ - -#define sc_bigdl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bingb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_blast_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_blue_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bob_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890312.bin", 0x0000, 0x5000, CRC(9dfc2404) SHA1(c35f4197c0e0cd45b35f70cce166497de385b212) ) \ - ROM_LOAD( "95890313.bin", 0x0000, 0x5000, CRC(e86a6030) SHA1(c7fd1ae68aa60c448a31eb9d4103aa0a8c1892d0) ) \ - ROM_LOAD( "95890314.bin", 0x0000, 0x5000, CRC(76d0ac6c) SHA1(83d150737f942abf19a480b06dc09e1063bb0e64) ) \ - -#define sc_bobcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008967.bin", 0x0000, 0x0f64c6, CRC(cf1e1c59) SHA1(f7ccbc6ed20aed329c2a199a489686bb8e87edfb) ) \ - -#define sc_bonbx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_brksp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008210.bin", 0x0000, 0x1aea2f, CRC(da15a50e) SHA1(2f068526992358789e5f2c347a5adf56a1bfde52) ) \ - -#define sc_brix_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bugs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bpfpb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008771.bin", 0x0000, 0x100000, CRC(121b6db2) SHA1(634f435635fcb08013729629fc8f56a4180c2034) ) \ - ROM_LOAD( "95008772.bin", 0x0000, 0x100000, CRC(c8813870) SHA1(5c4571a3ca9a06c49e80c5e10e9fd288de560324) ) \ - -#define sc_btiab_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_btrip_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bpb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008553.bin", 0x0000, 0x100000, CRC(f8019fb2) SHA1(aa5baed73538ebc6e39c6e35437b77a5cc22135e) ) \ - ROM_LOAD( "95008554.bin", 0x0000, 0x100000, CRC(8e00a011) SHA1(821686d96ee6fb45ab0b771934ce25ab7a230c0c) ) \ - -#define sc_bull_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008520.bin", 0x0000, 0x100000, CRC(ab418ce0) SHA1(39afbd449a21a31016acaffcfb4f6d684db300e7) ) /* PR1702 BULLSEYE */ \ - ROM_LOAD( "95008521.bin", 0x0000, 0x100000, CRC(7fd0f70c) SHA1(e6bf85b9e2528dac5811277ee89599e58e6358b0) ) \ - ROM_LOAD( "95008544.bin", 0x0000, 0x100000, CRC(19777f20) SHA1(da0cc08b00f9ab565a0e559761adbf7bcd7c327b) ) /* PR1743 CASINO BULLSEYE */ \ - ROM_LOAD( "95008575.bin", 0x0000, 0x100000, CRC(715901d2) SHA1(a7d3d0c7b9fc3eefb0df372cdf0cae7abe8bd959) ) /* PR1758 BULLSEYE TRIPLE */ \ - ROM_LOAD( "95009116.bin", 0x0000, 0x100000, CRC(5a01e206) SHA1(38ee3706d9edb68d17c90bb627aa17b4f908d721) ) /* PR3318 BULLSEYE */ \ - ROM_LOAD( "95009117.bin", 0x0000, 0x100000, CRC(c3623829) SHA1(92b0cf89678023bb02394699e2e214389317ec6c) ) \ - -#define sc_butch_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008604.bin", 0x0000, 0x100000, CRC(dede59e0) SHA1(de56b80d0a53fbb18acce2b907f48801e8fced12) ) \ - ROM_LOAD( "95008605.bin", 0x0000, 0x100000, CRC(3db1a818) SHA1(2c20d39dc0d7eb3996209a0b34afae3cd2eebbdc) ) \ - -#define sc_cbrun_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cfact_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008508.bin", 0x0000, 0x100000, CRC(97d26d77) SHA1(828e3797184b39e1b8fd788253071f323f2d890e) ) \ - ROM_LOAD( "95008509.bin", 0x0000, 0x100000, CRC(8d1e1f36) SHA1(8976a74c050158fc63fbcbfbadd3f41fca187a24) ) \ - -#define sc_ctit_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008762.bin", 0x0000, 0x100000, CRC(cf7fc030) SHA1(0c34d9b35eb6229ae48b27f2f88ff682b4601816) ) \ - ROM_LOAD( "95008763.bin", 0x0000, 0x100000, CRC(767b94d9) SHA1(5cac6831e54af03eea065143c04bda54f44fec7d) ) \ - -#define sc_craid_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890715.bin", 0x0000, 0x5000, CRC(60af654b) SHA1(ec714992a41b154f534aac0a515e1ef490dad0db) ) \ - ROM_LOAD( "95890716.bin", 0x0000, 0x5000, CRC(1539217f) SHA1(bc766636048c720ac5df55bbf643e2801536e58f) ) \ - ROM_LOAD( "95890717.bin", 0x0000, 0x5000, CRC(8b83ed23) SHA1(43d56d728fbbb81c9e660e537746cd2aa01aadd1) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008851.bin", 0x0000, 0x0fa2fc, CRC(ec82c860) SHA1(7806065db24c13208c77009c64de91a3fb0f4311) ) \ - -#define sc_cvega_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008477.bin", 0x0000, 0x100000, CRC(74607f2f) SHA1(8ce25e6af2fa8b2b4acd794dd78511983d10f7f5) ) \ - -#define sc_chopc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008908.bin", 0x0000, 0x0fa18a, CRC(78e8e1cf) SHA1(0211fffcaab36d88610525c85efb5ea7835fb641) ) \ - -#define sc_cbar7_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891086.bin", 0x0000, 0x5000, CRC(64066892) SHA1(acdf17a6fec87c3094b4b363d5f5a21d58e6260a) ) \ - ROM_LOAD( "95891087.bin", 0x0000, 0x5000, CRC(11902ca6) SHA1(2c7fbf5ec8f22cf1d29d7eb437b8e0403ebbfb13) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009002.bin", 0x0000, 0x05dab2, CRC(7763eeea) SHA1(946ec95a75e3ffdba98c67d58162f7d2e456480e) ) \ - -#define sc_clu70_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891124.bin", 0x0000, 0x5000, CRC(efb25e7e) SHA1(f1da25d6f6c2fe9953c0f95e889b845e65a1fe27) ) \ - ROM_LOAD( "95891125.bin", 0x0000, 0x5000, CRC(9a241a4a) SHA1(3383c31a1de5f4a0ced5e3346de7b7e1f7fdbe04) ) \ - ROM_LOAD( "95891126.bin", 0x0000, 0x5000, CRC(049ed616) SHA1(2c29271dfebff92b3f537dd3cc89aea53decf978) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009017.bin", 0x0000, 0x100000, CRC(4df62a63) SHA1(1d3b7927683d45bf81c038527b57881a58657e21) ) \ - ROM_LOAD( "95009018.bin", 0x0000, 0x030022, CRC(90c95f34) SHA1(a63d52b7ec202f6757ed24251e542be2409ba2a9) ) \ - -#define sc_clcas_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890486.bin", 0x0000, 0x5000, CRC(52bab0b5) SHA1(2144c1c9b980f6dbc1948e94c34fc2213fc5aa70) ) \ - ROM_LOAD( "95890487.bin", 0x0000, 0x5000, CRC(4e6c4009) SHA1(44ae2ce42ff9b91174e214213ccf52c281827434) ) \ - ROM_LOAD( "95890488.bin", 0x0000, 0x5000, CRC(8d366299) SHA1(1d0cd59dfb39ca3a78ae2398992a992d34b2e61a) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008985.bin", 0x0000, 0x0b57f9, CRC(63366697) SHA1(cdab5d0aa1bf738e4e326ed31f78f2a797bd8bd6) ) \ - -#define sc_clnot_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009135.bin", 0x0000, 0x100000, CRC(af699e46) SHA1(e8f685847f4eb83a67074cae92ed59e96f37653b) ) \ - ROM_LOAD( "95009136.bin", 0x0000, 0x100000, CRC(cd1ea94c) SHA1(8010ba1490c656f870230611d15255db175a5a49) ) \ - -#define sc_clus_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890495.bin", 0x0000, 0x5000, CRC(a475b60f) SHA1(4f02f0e0c19be7378736d6d4707f7b4a3068be9b) ) \ - ROM_LOAD( "95890496.bin", 0x0000, 0x5000, CRC(d1e3f23b) SHA1(6f9032c000bcc0cd61180193d85d0a4623026d14) ) \ - ROM_LOAD( "95890497.bin", 0x0000, 0x5000, CRC(4f593e67) SHA1(3a4591ae8ca140dff54d5e74143359fbecc14bfc) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008988.bin", 0x0000, 0x0d23ea, CRC(b33581a0) SHA1(667bf4e499b50fd072313bad671ffcbd299fd97b) ) \ - -#define sc_cmony_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009031.bin", 0x0000, 0x100000, CRC(58ded502) SHA1(27c05614b03b51fe4a168b8c64535ec3ca9e85c1) ) \ - ROM_LOAD( "95009032.bin", 0x0000, 0x100000, CRC(e1eb711a) SHA1(f6c0c10992f2aacd6f9fadc4e15d8ad5ba5b4ed8) ) \ - ROM_LOAD( "95009124.bin", 0x0000, 0x100000, CRC(798d8d5a) SHA1(931bfca5d204c62fc834959d9babcd9488fc7f07) ) \ - ROM_LOAD( "95009125.bin", 0x0000, 0x100000, CRC(d6090812) SHA1(16ca4868725eff0cc4bd056d751dc7861c1e53a1) ) \ - -#define sc_cfnc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009178.bin", 0x0000, 0x100000, CRC(eb938e0a) SHA1(978fa5554462d5d2cbf6a696c6c754318e950223) ) \ - ROM_LOAD( "95009179.bin", 0x0000, 0x100000, CRC(baf8b8b7) SHA1(43b967f3909270b99b563dab4bd1035079a5cb78) ) \ - -#define sc_cfcp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009035.bin", 0x0000, 0x100000, CRC(8138c442) SHA1(ceaeb84a27d0e3eba8d3a9a7c76e86b4214178c9) ) \ - ROM_LOAD( "95009036.bin", 0x0000, 0x100000, CRC(757f44b9) SHA1(61fe15024f7c7f97f865b1b666a5f837a57446a5) ) \ - -#define sc_cfpt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008348.bin", 0x0000, 0x100000, CRC(9c6db3d1) SHA1(f2f613326d0a8c0a1c2e1eea1e91ed34cd344f41) ) \ - ROM_LOAD( "95008349.bin", 0x0000, 0x100000, CRC(6f7716a0) SHA1(75f8fbee605b96e36e8596068dd4570928a5a02d) ) \ - ROM_LOAD( "95008363.bin", 0x0000, 0x100000, CRC(6d211d7b) SHA1(59dbb6201aa355a585253d17302e4f8ceed9a220) ) \ - -#define sc_cknig_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009193.bin", 0x0000, 0x100000, CRC(6c3cb54b) SHA1(a140209d19f9cbd18ede08924b94718264ba4118) ) \ - ROM_LOAD( "95009194.bin", 0x0000, 0x100000, CRC(44229686) SHA1(eda0481282614e6bd82985486ef4eea0eb0ddccd) ) \ - -#define sc_cpays_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008528.bin", 0x0000, 0x100000, CRC(eccde2dc) SHA1(83fc283269fea98ea1b2c0b846bb790bf84d3053) ) \ - -#define sc_canca \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004270.bin", 0x0000, 0x0d4379, CRC(c0db303d) SHA1(8929e4901d517e6063dc75ff40cbcd478bb0be8a) ) \ - -#define sc_carry_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008240.bin", 0x0000, 0x100000, CRC(7c693111) SHA1(6807d78d32e817babd4e1ed2c0b7313d7cc8ebc2) ) \ - -#define sc_cmous_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008439.bin", 0x0000, 0x0e94e0, CRC(9bcded46) SHA1(9f1b431ac010f2ab9a8d393b167ff81baf7f86a5) ) \ - ROM_LOAD( "95008947.bin", 0x0000, 0x0fc44b, CRC(457a86c3) SHA1(e36ba57a981bb0f8b581c4b8e1ddd6e55c24bf00) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890395.bin", 0x0000, 0x5000, CRC(31480d43) SHA1(9ac6254b539d57f79fbb2483948db393ca4823eb) ) \ - ROM_LOAD( "95890396.bin", 0x0000, 0x5000, CRC(2d9efdff) SHA1(0b6642bb202092eb1ef8791a3a1f2b79ad1b5fff) ) \ - ROM_LOAD( "95890397.bin", 0x0000, 0x5000, CRC(eec4df6f) SHA1(b4fd028f28fa43d54c6aaf6062ba79a37f232025) ) \ - -#define sc_cnfr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004130.lo", 0x000000, 0x080000, CRC(223e2bd4) SHA1(f8e187cc74e524496c9e5b35260ac56b93e6e83b) ) \ - ROM_LOAD( "95004131.hi", 0x080000, 0x080000, CRC(3840ffd6) SHA1(d72901b08c11d1f5b16fdb1a8fe57625cc25bd44) ) \ - -#define sc_cad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008396.bin", 0x0000, 0x0ff641, CRC(f24c5ef6) SHA1(83395f64b79efbd4f3153e5d0a2d2b0d0183f857) ) \ - -#define sc_cadcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008486.bin", 0x0000, 0x0ff641, CRC(05e8cba2) SHA1(7a99ab3f45588cff0e54a94ffd75df337cff7351) ) \ - -#define sc_cconx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_ccrus_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cerup_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cexpl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_chand_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_clash_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008374.bin", 0x0000, 0x0feb46, CRC(47ea13e2) SHA1(f9b6e23b3857da5f1f364469c8d4deb4f8d836a6) ) \ - -#define sc_cr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008245.bin", 0x0000, 0x0ffadf, CRC(6528bb5c) SHA1(d54e1f0a18dbbc91316d57be25e0cf5236e856e6) ) \ - -#define sc_crcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008338.bin", 0x0000, 0x0ffadf, CRC(b26edbfe) SHA1(9f5c7a8e6781bad6448f767d19474bbad8024df5) ) \ - -#define sc_cckey_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008425.bin", 0x0000, 0x100000, CRC(99bf2289) SHA1(596fe427dd7abf2779e12e3f20a5ba2eda553f2e) ) \ - -#define sc_chub_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004109", 0x0000, 0x080000, CRC(2e3e2f6e) SHA1(217197bdbcd27271afce7809de7c49cca4ef3656) ) \ - ROM_LOAD( "95004110", 0x0000, 0x080000, CRC(29f3caef) SHA1(dddf38b3da4b9756103b32de4d5d12d612223298) ) \ - -#define sc_cla7_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004334.bin", 0x0000, 0x080000, CRC(bd8a3d25) SHA1(9dd5d124ce467293417575bf316dc1b371bc3169) ) \ - -#define sc_clclo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008889.bin", 0x0000, 0x0edfec, CRC(fb894b4f) SHA1(60b3f28efda4ecb9f7804540291c8c3b8bead27a) ) \ - -#define sc_clucl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_colos_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004235.sn1", 0x0000, 0x080000, CRC(e543f4ab) SHA1(7d72f1392fbd43afe390d4f3059b06cd789528d4) ) \ - ROM_LOAD( "95004236.sn2", 0x0000, 0x080000, CRC(0f26a957) SHA1(b0949534d44dd22b6f676203f52fad978b36d04b) ) \ - -#define sc_cyc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008249.bin", 0x0000, 0x100000, CRC(e8eac90a) SHA1(f79dc6912a8fbeb12c577c402d84ef4780bf4333) ) \ - -#define sc_cyccl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008310.bin", 0x0000, 0x100000, CRC(4dddf82d) SHA1(4bab8cdc5f6bf59c3686dfd01f2f96858f776df3) ) \ - -#define sc_crzcs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* start is empty?? */ \ - ROM_LOAD( "95008005.lo", 0x00000, 0x100000, CRC(0b10db9f) SHA1(e0ea7b4f2dd98ef23ab42ffe7a7892e5327f646e) ) \ - ROM_LOAD( "95008006.hi", 0x100000, 0x100000, CRC(be2cdfd5) SHA1(87e25d6e26052dca8d79fbda705b2df1c06e2c67) ) \ - -#define sc_crzwl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cccsh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004173", 0x0000, 0x080000, CRC(67970fed) SHA1(938414921a0956841ce4447471b7663f5c2c2d4f) ) \ - ROM_LOAD( "95004174", 0x0000, 0x080000, CRC(1f1dd01f) SHA1(6ed312c1e50056bf3cae156e595b26374d7d4816) ) \ - -#define sc_ckx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008995.bin", 0x0000, 0x0931b3, CRC(e874bd15) SHA1(8adb32532dd053ca2c4e0987352013310ce197a0) ) \ - -#define sc_chick_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008291.bin", 0x0000, 0x0b2877, CRC(8e9f53d4) SHA1(7c91e64d7214e1c08b0976f901713228bb64ee49) ) \ - -#define sc_cabin_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008902.bin", 0x0000, 0x0e7fd3, CRC(c7b0f675) SHA1(e19d4e65d73329a58b9cbc6828c7e0c287f2906a) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890306.bin", 0x0000, 0x5000, CRC(eff2e8d8) SHA1(0749d543bf760b2037330ade671c7ce7ed64b275) ) \ - ROM_LOAD( "95890307.bin", 0x0000, 0x5000, CRC(9a64acec) SHA1(51c49e8d415d99e61fda99ade43bb925d99f3825) ) \ - ROM_LOAD( "95890308.bin", 0x0000, 0x5000, CRC(04de60b0) SHA1(cee280d9528f9e167be1c373e7a99f1f2f1bc1c0) ) \ - -#define sc_cari_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "97000070.bin", 0x0000, 0x0f8526, CRC(27ba6768) SHA1(708e836f3fc35fabd0a5c8dc9cd8e9327d7bcdc7) ) \ - ROM_LOAD( "95008981.bin", 0x0000, 0x0ff245, CRC(3a888f98) SHA1(b113c17acda287200fdcd734a1b384879a5e7101) ) \ - ROM_LOAD( "caribbeancashsnd1.bin", 0x0000, 0x080000, CRC(89da9fc4) SHA1(d56364e2e71d03d7d8888966b64ff1fab4bfc3e9) ) \ - ROM_LOAD( "caribbeancashsnd2.bin", 0x0000, 0x080000, CRC(99d33f61) SHA1(7caf3b9540372900e90a7141f14383fe06936a2e) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890474.bin", 0x0000, 0x5000, CRC(bcb54114) SHA1(0236171b34f3e47db9aa253f9605ff6bd21b1460) ) \ - ROM_LOAD( "95890475.bin", 0x0000, 0x5000, CRC(c9230520) SHA1(5cf9c3d130f114dac633d696e0bf1bda94afb9ee) ) \ - ROM_LOAD( "95890476.bin", 0x0000, 0x5000, CRC(5799c97c) SHA1(5dab858e61815c04f874f231848c376d8fce1c3d) ) \ - -#define sc_cblas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008539.bin", 0x0000, 0x0e0033, CRC(068349f4) SHA1(b27cba3217122397eb7aea0d9a382fda9ee6a43b) ) \ - - -#define sc_casxt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008854.bin", 0x0000, 0x08cba2, CRC(f7b3ad12) SHA1(08108745f7e048e9aa27777bdc6edeb5d5836a6d) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890718.bin", 0x0000, 0x5000, CRC(dd65993f) SHA1(db2af897e36d7b55ed1d1d2efe350f4802449945) ) \ - ROM_LOAD( "95890719.bin", 0x0000, 0x5000, CRC(c1b36983) SHA1(2b74336915c7156723e2554f152ed34f6c88a16a) ) \ - ROM_LOAD( "95890720.bin", 0x0000, 0x5000, CRC(02e94b13) SHA1(2d8fffc631e1a590774131bdea1f0b5ec8c6e8f3) ) \ - -#define sc_clue_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890356.bin", 0x0000, 0x5000, CRC(fd78e03f) SHA1(029e2fd7e9cff3793d905d192c889873ad2a0d26) ) \ - ROM_LOAD( "95890357.bin", 0x0000, 0x5000, CRC(88eea40b) SHA1(5a730add3f9941dfcbfa5cd8f6a6142d19065482) ) \ - ROM_LOAD( "95890358.bin", 0x0000, 0x5000, CRC(16546857) SHA1(d8b81b3df5e041c83c4f359c487165a6a2d5c513) ) \ - -#define sc_cmani_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008295.bin", 0x0000, 0x100000, CRC(a5646d3b) SHA1(9aca69f103f959a85026fd0d0ffb3bd65eebae34) ) \ - -#define sc_cj_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008427.bin", 0x0000, 0x100000, CRC(a6093378) SHA1(30a64e8857da269cbc0b3febf30a62f5647d10b9) ) \ - -#define sc_ctl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008225.bin", 0x0000, 0x100000, CRC(b185224e) SHA1(a4b4c618903c4c207de8dae74b55fd2c85a5e4ff) ) \ - -#define sc_crsc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008681.bin", 0x0000, 0x100000, CRC(7a459110) SHA1(51f0a51af485a0f4e447ee0c22f488a924e45117) ) \ - -#define sc_cfqps_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004101.bin", 0x0000, 0x080000, CRC(31e5785a) SHA1(8da2bd3571640b0ae23e9fdcc2235dcf9d2de122) ) \ - ROM_LOAD( "95004102.bin", 0x0000, 0x080000, CRC(bf059b21) SHA1(89a96c593e5385e9b40f694768986691eed4b5c5) ) \ - ROM_LOAD( "95008339.bin", 0x0000, 0x100000, CRC(bae07fa8) SHA1(a86a5d9ff6ac802bd15275f46894374317627e23) ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95420324.bin", 0x0000, 0x100000, CRC(41729e8f) SHA1(adb15067f61eb2e4adf537137dd24876749da8a2) ) \ - -#define sc_czfr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* 3 different sets of sound! */ \ - ROM_LOAD( "crazy sound 1.bin", 0x0000, 0x080000, CRC(31e5785a) SHA1(8da2bd3571640b0ae23e9fdcc2235dcf9d2de122) ) \ - ROM_LOAD( "crazy sound 2.bin", 0x0000, 0x080000, CRC(bf059b21) SHA1(89a96c593e5385e9b40f694768986691eed4b5c5) ) \ - \ - ROM_LOAD( "95004150.bin", 0x0000, 0x080000, CRC(7707ea0d) SHA1(efe187a4c64a3a5f8d10e21c269afbb603186ae7) ) \ - ROM_LOAD( "95004151.bin", 0x0000, 0x080000, CRC(54845756) SHA1(e53dfa8f836044232ee1a8006051ef586ac24d8c) ) \ - \ - ROM_LOAD( "95004280.sn1", 0x0000, 0x080000, CRC(44d1b0d9) SHA1(2e361a1b65955acecbc26ba47000e4ef6316a22d) ) \ - ROM_LOAD( "95004281.sn2", 0x0000, 0x080000, CRC(31f057f3) SHA1(a6415eee8499ada43225901dee2d12c93d494658) ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - ROM_LOAD( "ccfsnd.bin", 0x0000, 0x02196a, CRC(15e542c2) SHA1(9bd9218b7392c882f68e330619bea7996afd001e) ) /* oki sound rom, doubt it belongs here */ \ - -#define sc_crnjw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008469.bin", 0x0000, 0x100000, CRC(07df5a41) SHA1(56dacba05e26258e50085f78dfe965196917addf) ) /* PR1608 CROWN JEWELS SOUNDS11 */ \ - \ - ROM_LOAD( "95009176.bin", 0x0000, 0x100000, CRC(d1db2564) SHA1(641f94108df9dffde599012018d944e3848f50ed) ) /* PR000055 CJEWELS */ \ - ROM_LOAD( "95009177.bin", 0x0000, 0x100000, CRC(e574cc1c) SHA1(760284d60d336571495da921ff666ac5725d7c19) ) \ - -#define sc_cclim_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008243.bin", 0x0000, 0x100000, CRC(b21e073b) SHA1(dfe309490c5c69052041c2121258c17b974f88ed) ) \ - -#define sc_chavi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008563.bin", 0x0000, 0x100000, CRC(e4d30521) SHA1(70a2d88842ee40c77011a2ed8ca45f71316d2579) ) \ - -#define sc_chavy_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008964.bin", 0x0000, 0x0fc821, CRC(597bc1c8) SHA1(f28d3fe1dd5ccf4d5ff6e1088a392b4713e6d1b5) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890437.bin", 0x0000, 0x5000, CRC(e4c29dae) SHA1(5e81acde46a489b8a9056167e33efec3d2d1b95a) ) \ - ROM_LOAD( "95890438.bin", 0x0000, 0x5000, CRC(9154d99a) SHA1(61ef137e6db5f8394b948c589c0cee506a48f9ed) ) \ - ROM_LOAD( "95890439.bin", 0x0000, 0x5000, CRC(0fee15c6) SHA1(3d24e9861c2c7a67a3d4d156b9281e857de30a55) ) \ - -#define sc_cinv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_crotr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009049.bin", 0x0000, 0x100000, CRC(10c94788) SHA1(8fb5113036a0122a4dbc9af15b600ffe99e51094) ) \ - ROM_LOAD( "95009050.bin", 0x0000, 0x100000, CRC(5e47e86c) SHA1(9aaca1390852f9079cd355c48b889fb5962c5c09) ) \ - -#define sc_crsgc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_crsgr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009139.bin", 0x0000, 0x100000, CRC(f2e4fa3c) SHA1(1909de32f232e5bfb3ee3c624f29c585cca254c2) ) \ - ROM_LOAD( "95009140.bin", 0x0000, 0x100000, CRC(81bdf47f) SHA1(49c02fb87a4ffc1be4c748c469f5518c314b1391) ) \ - -#define sc_copsr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "cops_rob_snd.bin", 0x0000, 0x080000, CRC(e25bddb7) SHA1(96d6be2407bf876ad685bdc13d96585782ad4a50) ) \ - ROM_LOAD( "95008393.bin", 0x0000, 0x100000, CRC(693cd9be) SHA1(e965b2dcd6d6619815c919b7d2c372c726abfea3) ) \ - ROM_LOAD( "95008787.bin", 0x0000, 0x100000, CRC(82713d8b) SHA1(317cb1c482bd13e1cad2e5739c99f6e3ca163684) ) \ - ROM_LOAD( "95008846.bin", 0x0000, 0x080000, CRC(44f9eaab) SHA1(394bd36121c33aba97bc957b3d46d2944c1daeed) ) \ - ROM_LOAD( "95009130.bin", 0x0000, 0x100000, CRC(f6813371) SHA1(bd9e5d009c7870d50149d9de396f363fb19b183c) ) \ - -#define sc_crcpt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_corst_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009037.bin", 0x0000, 0x100000, CRC(c2d3b6ee) SHA1(36e7e9c956ab91fd1b2e52800b4482ce3a3597f5) ) \ - ROM_LOAD( "95009038.bin", 0x0000, 0x100000, CRC(45dc4df3) SHA1(7710a0ba9bbe7ae6f590b61bbc1395cd408926d2) ) \ - -#define sc_coro_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008939.bin", 0x0000, 0x100000, CRC(02c9a21d) SHA1(7f27a8d706a7d66feafc5faab23ee28ebfa02b53) ) \ - ROM_LOAD( "95008940.bin", 0x0000, 0x05fdb4, CRC(09c8a19a) SHA1(21a58f8183c29d61c0132c2fc7339e459521a16e) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890365.bin", 0x0000, 0x5000, CRC(12f90bc7) SHA1(09cdfddfa7fb430eccd87d677673f203120bef51) ) \ - ROM_LOAD( "95890366.bin", 0x0000, 0x5000, CRC(676f4ff3) SHA1(c6a3c2b01b79e9abaa249b548fb59584c63fc682) ) \ - ROM_LOAD( "95890367.bin", 0x0000, 0x5000, CRC(f9d583af) SHA1(f22e3ed7c4d954a98cec9dc077113761fdcef858) ) \ - ROM_LOAD( "95890377.bin", 0x0000, 0x5000, CRC(edbf2523) SHA1(8165c2c2f12fd85f706aed31bc3cbd51648440de) ) \ - ROM_LOAD( "95890378.bin", 0x0000, 0x5000, CRC(f169d59f) SHA1(fa8116f43c25de7af05f1cf8a379a24cce489f21) ) \ - ROM_LOAD( "95890379.bin", 0x0000, 0x5000, CRC(3233f70f) SHA1(df485c4df31872921c3d97973a7b3e7d4a58446d) ) \ - -#define sc_count_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008615.bin", 0x0000, 0x100000, CRC(97c602c0) SHA1(cd71c062df3ac700ab72fc992542e08651270ec8) ) \ - ROM_LOAD( "95008616.bin", 0x0000, 0x100000, CRC(2b80b1a5) SHA1(a94b4402ba738a6369f58c73a5b9d66e0476eeb1) ) \ - -#define sc_corcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008867.bin", 0x0000, 0x100000, CRC(b11779d2) SHA1(720d30445232baa18e613259bded1a6827777de6) ) \ - ROM_LOAD( "95008868.bin", 0x0000, 0x05fdb4, CRC(424b08e5) SHA1(fc0fe01516c0c6bb20adcf2bf8b1263ff59657e8) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890770.bin", 0x0000, 0x5000, CRC(551ab279) SHA1(39e4c16f3cc708d84762ba5b80c720cbbc123f0d) ) /* why is this in an sc4 set? */ \ - - -#define sc_devil_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890464.bin", 0x0000, 0x5000, CRC(35e24491) SHA1(e762854ac074df67db843fed4c6c7cfe1d8f754b) ) \ - ROM_LOAD( "95890465.bin", 0x0000, 0x5000, CRC(407400a5) SHA1(dba6f4204a27f26056ffc3d9b512c0f4a8f17562) ) \ - ROM_LOAD( "95890466.bin", 0x0000, 0x5000, CRC(dececcf9) SHA1(6ebaec58330b7ce8bb166d2aefd203147c4823fa) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008978.bin", 0x0000, 0x0ff462, CRC(b0dac89b) SHA1(afdc4fec96849b81e52aa03d9df821e336001c74) ) \ - -#define sc_dracp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_db_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_daylt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "daylsnd1.bin", 0x0000, 0x080000, CRC(4510d156) SHA1(b001bdf3bfad6124647f640065b411c07c8cf555) ) \ - ROM_LOAD( "daylsnd2.bin", 0x0000, 0x080000, CRC(71a1428f) SHA1(029ae979f192bcd7704ae78aba14815acdabe60f) ) \ - -#define sc_derby_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008129.bin", 0x0000, 0x100000, CRC(4892cf07) SHA1(9ce745f4b3aee623a7855e2fee4cc35de20646a3) ) \ - ROM_LOAD( "95008130.bin", 0x0000, 0x100000, CRC(b9bfde2a) SHA1(25329d5b93318586095715111fbbb854bba394b9) ) \ - -#define sc_deepi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008329.bin", 0x0000, 0x100000, CRC(427dad17) SHA1(f8834dfbe6608abb08d6214cd87ec809df963805) ) \ - -#define sc_ddosh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008299.bin", 0x0000, 0x100000, CRC(fee81425) SHA1(188cb7275963193a39571d3e4da3b9f6693a79d0) ) \ - -#define sc_dhh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008586.bin", 0x0000, 0x100000, CRC(43fde3ad) SHA1(662402449b025bbf75a10c3b1ac746d9359b0b0d) ) \ - ROM_LOAD( "95008587.bin", 0x0000, 0x100000, CRC(6f7a607f) SHA1(da3c8aaa69b30f10f122a9bde49d987dd0950474) ) \ - -#define sc_dmine_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008293.bin", 0x0000, 0x100000, CRC(acbed8e1) SHA1(607dafa2215632d02c34e65b79bf1341b981f63b) ) \ - -#define sc_dnd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* Regular */ \ - ROM_LOAD( "95008606.bin", 0x0000, 0x100000, CRC(c63c8663) SHA1(4718baf87340fe93ccfe642a1a0cdb9d9dcac57f) ) /* 0 (1907) DOND SOUNDS 11 */ \ - ROM_LOAD( "95008607.bin", 0x0000, 0x100000, CRC(a615514f) SHA1(d4ff7d4fe6f1dd1d7b00cc504f90b2921aa5e8fb) ) /* 1 */ \ - \ - /* Casino */ \ - ROM_LOAD( "95008631.bin", 0x0000, 0x100000, CRC(7208854a) SHA1(a02de60cfcbafe5da4f67596ab65237f5b5f41b7) ) /* 0 (1954) DOND SOUNDS 11 */ \ - \ - ROM_LOAD( "95008632.bin", 0x0000, 0x100000, CRC(fd81a317) SHA1(1e597fd58aab5a7a8321dc4daf138ee07b42c094) ) /* 0 (1945) DOND SOUNDS 11 */ \ - ROM_LOAD( "95008633.bin", 0x0000, 0x100000, CRC(a7a445d4) SHA1(dbb1938c33ce654c2d4aa3b6af8c210f5aad2ae3) ) /* 1 */ \ - \ - /* Casino */ \ - ROM_LOAD( "95008661.bin", 0x0000, 0x100000, CRC(2d9ebcd5) SHA1(d824a227420cbe616aca6e2fd279af691ddfd87a) ) /* 0 (1945) DOND SOUNDS 12 */ \ - \ - ROM_LOAD( "95008680.bin", 0x0000, 0x100000, CRC(9bd439d1) SHA1(5e71d04e5697e92998bae28f7352ea7742cafe07) ) /* 0 (1964) DOND SOUNDS 11 */ \ - \ - ROM_LOAD( "95008698.bin", 0x0000, 0x100000, CRC(8eea7754) SHA1(7612c128d6c062bba3477d55aee3089e1255f61e) ) /* 0 (1964) DOND SOUNDS 12 */ \ - - -#define sc_dndbb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008788.bin", 0x0000, 0x100000, CRC(51384d64) SHA1(3af87bcc7fb4881ae671d9cbb484fb6a2a534cce) ) \ - ROM_LOAD( "95008789.bin", 0x0000, 0x100000, CRC(4f2d72c3) SHA1(f167ad8d7178682833e7e9efcc393b5826108d70) ) \ - -#define sc_dndbo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009158.bin", 0x0000, 0x100000, CRC(27f11b81) SHA1(f2690c2828ad09d73cb14c5c1cb53c2ad1fc7b53) ) \ - ROM_LOAD( "95009159.bin", 0x0000, 0x100000, CRC(95e278c8) SHA1(7d85b6dbe3ccacd6c5a5b4eb475598a3d5548ce0) ) \ - -#define sc_dndbl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_dndbq_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891057.bin", 0x0000, 0x5000, CRC(75c0cf91) SHA1(20e7fb3a279cc127cec08a78b6633852b0a950f7) ) \ - ROM_LOAD( "95891058.bin", 0x0000, 0x5000, CRC(69163f2d) SHA1(66b6b593126c452f01b36c03e82d003860340025) ) \ - ROM_LOAD( "95891059.bin", 0x0000, 0x5000, CRC(aa4c1dbd) SHA1(4ebd1b132a4125bdcf58d5867cffb821e3e7b1a3) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008887.bin", 0x0000, 0x100000, CRC(53cb9dc5) SHA1(66cdf8624736ea5a4e239bdb81fc96366ec4623e) ) \ - -#define sc_dndcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* club dond */ \ - ROM_LOAD( "95008629.bin", 0x0000, 0x100000, CRC(6f7cf500) SHA1(bf3db728872251116b32aa2c44f72a87d29b13d2) ) \ - ROM_LOAD( "95008630.bin", 0x0000, 0x100000, CRC(5dfda41e) SHA1(6d61d0eedc6a1599777f47d3880689f954f326c9) ) \ - /* beat the banker */ \ - ROM_LOAD( "95008713.bin", 0x0000, 0x100000, CRC(7311db5e) SHA1(24a4b3f44fa6dbbe756b0acac2b513c6e92cdf26) ) /* R3068? */ \ - ROM_LOAD( "95008714.bin", 0x0000, 0x100000, CRC(c6ebc845) SHA1(6a135f42940b8c44422736650e369fa12b51e0df) ) \ - -#define sc_dndcr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009033.bin", 0x0000, 0x100000, CRC(4e167844) SHA1(d0e7101fe033bc9fc0e279c3d457a7da8e8aab00) ) \ - ROM_LOAD( "95009034.bin", 0x0000, 0x100000, CRC(a3e7b40a) SHA1(09f1fde693750f15e78da91c796e8593d06d19e9) ) \ - -#define sc_dnddd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* dond double */ \ - ROM_LOAD( "95008804.bin", 0x0000, 0x100000, CRC(19fd19fa) SHA1(db68a40d8bb3de130c6d5777217fb3c3a4c13d17) ) \ - ROM_LOAD( "95008805.bin", 0x0000, 0x100000, CRC(f497337d) SHA1(9e827116f8b1d882cfcd0b56aaede9de14b2e943) ) \ - -#define sc_dndde_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009053.bin", 0x0000, 0x100000, CRC(f06acb47) SHA1(043756eda04d193f7365f2fd0fafc36c3b6b0bd9) ) \ - ROM_LOAD( "95009054.bin", 0x0000, 0x100000, CRC(595baae8) SHA1(9aa03b265294eaed0051b0a25cc9a0e1481b4390) ) \ - -#define sc_dnddi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009191.bin", 0x0000, 0x100000, CRC(2f3cda1a) SHA1(017533caadf86d0d70e1b57b697621e0b4a8fef2) ) \ - ROM_LOAD( "95009192.bin", 0x0000, 0x100000, CRC(eb9b6b0b) SHA1(127bb283b32a997c04a1b29c18f4093f4d969151) ) \ - -#define sc_dnddt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009106.bin", 0x0000, 0x100000, CRC(afa266cf) SHA1(adc80bc677a7524bec4bbd102a4a5ff293571abc) ) \ - ROM_LOAD( "95009107.bin", 0x0000, 0x100000, CRC(493981a8) SHA1(77308e453848d092d63330e10e3b1e88caeb4fb5) ) \ - -#define sc_dnddo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009120.bin", 0x0000, 0x100000, CRC(327c01a0) SHA1(9b7fa28ff6ecc83c2e9ee73aac0af98be170b28f) ) \ - ROM_LOAD( "95009121.bin", 0x0000, 0x100000, CRC(d7991c7e) SHA1(4f4e4043f272ff2325b0fa64c66b34cb1aefb97c) ) \ - -#define sc_dndfl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008847.bin", 0x0000, 0x100000, CRC(7f3eae56) SHA1(f5d25c87caf76fc1961c8fb5c389bb73cefbcb28) ) \ - ROM_LOAD( "95008848.bin", 0x0000, 0x100000, CRC(ba00c16d) SHA1(f2e55441857e5f036e19d2ee29dfad97b99134b8) ) \ - -#define sc_dndgo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009197.bin", 0x0000, 0x100000, CRC(bdf253cb) SHA1(6f046f1c27bae1141919874b27a8d87295b39261) ) \ - ROM_LOAD( "95009198.bin", 0x0000, 0x100000, CRC(420105d4) SHA1(23e4eac4146a3985c3a7dc5f80f1b5900a116303) ) \ - -#define sc_dndgl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009102.bin", 0x0000, 0x100000, CRC(9d03cd95) SHA1(e062c816a19af0dc86bfa5a66f69342e69fffcfa) ) \ - ROM_LOAD( "95009103.bin", 0x0000, 0x100000, CRC(51ae4095) SHA1(b397984d3b0beb4ca95050ff595648a80e5ea87a) ) \ - -#define sc_dndld_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009184.bin", 0x0000, 0x100000, CRC(25a36077) SHA1(92c05f410456414b825b09338a474c52f7c1bd9b) ) \ - ROM_LOAD( "95009185.bin", 0x0000, 0x100000, CRC(eacdfc26) SHA1(8ab462e7f49ca9374b9245d9d97cf909ea979ae3) ) \ - -#define sc_dndmb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009156.bin", 0x0000, 0x100000, CRC(7c68c70c) SHA1(eb4006e185f3cd4e7d66999b3ff064a7903f5bc8) ) \ - ROM_LOAD( "95009157.bin", 0x0000, 0x100000, CRC(a0541504) SHA1(689ba32fd1b1a9592a9cd7039424655a652b1bcd) ) \ - -#define sc_dndmd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009170.bin", 0x0000, 0x100000, CRC(6ab363a5) SHA1(1a98566161aec187074cbbdb7372ed8484202639) ) \ - ROM_LOAD( "95009171.bin", 0x0000, 0x100000, CRC(bc5d3113) SHA1(836eff78265f6d0371be18467c5edc6d32aba6d5) ) \ - -#define sc_dndpa_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009150.bin", 0x0000, 0x100000, CRC(54d9f01a) SHA1(6d62ca07443c42e16243a843dee6a11c7a1383fc) ) \ - ROM_LOAD( "95009151.bin", 0x0000, 0x100000, CRC(89bb7543) SHA1(e8bea8a00798329af590be5e2ccbfcc54f70f98d) ) \ - -#define sc_ddptg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009041.bin", 0x0000, 0x100000, CRC(143d05fb) SHA1(f3d2735dc5b1bdc4e3f4205521f1b614d4b4c4b0) ) \ - ROM_LOAD( "95009042.bin", 0x0000, 0x100000, CRC(65efd8fd) SHA1(c7f2d1f6b31767a56269f53e9327de3abe64218f) ) \ - -#define sc_ddply_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008830.bin", 0x0000, 0x100000, CRC(bb66ae0c) SHA1(4a7df180dd67aa96059a83986cb98721a81963d8) ) \ - ROM_LOAD( "95008831.bin", 0x0000, 0x100000, CRC(8a632940) SHA1(e955b05a82312ab356117f348903292d6f26a5a5) ) \ - -#define sc_dndrr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009188.bin", 0x0000, 0x100000, CRC(a2dceadd) SHA1(af1696bf32f37005c6a01bb209f38b90daab4e29) ) \ - ROM_LOAD( "95009189.bin", 0x0000, 0x100000, CRC(02b0d336) SHA1(7713212ebf59fa2464110b0238a870e81d43be05) ) \ - -#define sc_dndsi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008838.bin", 0x0000, 0x100000, CRC(34e9d2eb) SHA1(140f9ccf287e24e3917b1a6bb8d8118bf20f232c) ) \ - ROM_LOAD( "95008839.bin", 0x0000, 0x100000, CRC(4475bb6b) SHA1(864575f9b35495bfe0d8f7563e2d4b5e35b6a396) ) \ - -#define sc_dndrt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009141.bin", 0x0000, 0x100000, CRC(e53f8ba3) SHA1(10eea3246352bf65e1ca7b4cd6e1a873d6a2f7fe) ) \ - ROM_LOAD( "95009142.bin", 0x0000, 0x100000, CRC(54b47cbd) SHA1(71e8f49b0d031fcc8c5450279dc26d39b90af678) ) \ - -#define sc_dndpd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009172.bin", 0x0000, 0x100000, CRC(f124785f) SHA1(2291dca731bb6037d655dc8bbdfa7f35f6a4d4d1) ) \ - ROM_LOAD( "95009173.bin", 0x0000, 0x100000, CRC(aae9318c) SHA1(4b53bec7284950fbca4650117e727ab9a01b5509) ) \ - -#define sc_dndpc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_dndtb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009186.bin", 0x0000, 0x100000, CRC(1da5489b) SHA1(b282e523b52e34a625502ec99ca42f059e701448) ) \ - ROM_LOAD( "95009187.bin", 0x0000, 0x100000, CRC(2c3ea82c) SHA1(50ade918503e224288407abf60b3d53e5334aadb) ) \ - -#define sc_dndhf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008705.bin", 0x0000, 0x100000, CRC(09e02843) SHA1(a6ac658c857eca2aca0bacda423dd012434e93bc) ) \ - ROM_LOAD( "95008706.bin", 0x0000, 0x100000, CRC(805e7eb8) SHA1(107c6ba26e37d8f2eec81b62c3edf3efb7e44ca2) ) \ - -#define sc_dndys_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008779.bin", 0x0000, 0x100000, CRC(cf04d115) SHA1(3255b58cd4fba7d231ca35c00d1cb70da1f6cfbd) ) \ - ROM_LOAD( "95008780.bin", 0x0000, 0x100000, CRC(ec270dbe) SHA1(f649ffd4530feed491dc050f40aa0205f4bfdd89) ) \ - -#define sc_dndww_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008730.bin", 0x0000, 0x100000, CRC(e2aebdb0) SHA1(d22fee7ff3d5912ea9a7440ec82de52a7d016090) ) /* casino wow */ \ - -#define sc_dndtr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008832.bin", 0x0000, 0x100000, CRC(1d2aa204) SHA1(52ad7a6ea369198b48d593de508f317ed11e84de) ) \ - ROM_LOAD( "95008833.bin", 0x0000, 0x100000, CRC(92f462f6) SHA1(c0782639d4cd2653a3d14e1b422c2d6117dac029) ) \ - -#define sc_dndwb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008651.bin", 0x0000, 0x100000, CRC(c3738d54) SHA1(bf3c62e196a2cea144868729f136000a7b924c3d) ) /* wiyb */ \ - ROM_LOAD( "95008652.bin", 0x0000, 0x100000, CRC(ba8f5b62) SHA1(2683623e8b90d5e9586295d720aa1d985b416117) ) \ - ROM_LOAD( "95008715.bin", 0x0000, 0x100000, CRC(1796b604) SHA1(9045f9424e6447d696a6fdd7f5bdcbfda4b57c90) ) /* wiyb */ \ - ROM_LOAD( "95008766.bin", 0x0000, 0x100000, CRC(62accb81) SHA1(ed0456cefed2fbf9a1cfd911f871262e892a4ce8) ) /* wiyb */ \ - ROM_LOAD( "95008767.bin", 0x0000, 0x100000, CRC(0aa49d8a) SHA1(a2baffc495656f0b5426b720cac298a78774b7fa) ) /* super slam?? */ \ - -#define sc_dndpg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008822.bin", 0x0000, 0x100000, CRC(16411f05) SHA1(11f2d17b6647b9d9e713e38bab6604e4feb51432) ) \ - ROM_LOAD( "95008823.bin", 0x0000, 0x100000, CRC(4f7bab89) SHA1(bbb203cff3212571c313e8f22f9083980baf2566) ) \ - -#define sc_dndtp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008673.bin", 0x0000, 0x100000, CRC(4b8d1e0b) SHA1(8cba9632abb2800f8e9a45d1bf0abbc9abe8cb8c) ) \ - ROM_LOAD( "95008674.bin", 0x0000, 0x100000, CRC(66236e20) SHA1(222fefdeddb22eb290302528a8f937468ccd5698) ) \ - - -#define sc_dndbe_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008624.bin", 0x0000, 0x100000, CRC(bf9620ea) SHA1(63f5a209da3d0117fcb579364a53b23d2b02cfe5) ) \ - ROM_LOAD( "95008625.bin", 0x0000, 0x100000, CRC(2e1a1db0) SHA1(41ebad0615d0ad3fea6f2c00e2bb170d5e417e4a) ) \ - -#define sc_dndbc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009100.bin", 0x0000, 0x100000, CRC(b06110c0) SHA1(84289721a8c71124cc4df79fc90d0ded8d43fd07) ) \ - ROM_LOAD( "95009101.bin", 0x0000, 0x100000, CRC(53b38d0a) SHA1(1da40cbee8a18713864e3a578ac49c2108585e44) ) \ - -#define sc_dndlp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008792.bin", 0x0000, 0x100000, CRC(2e7e1a5a) SHA1(000cb48c67b7f23d00318d37206c2df426c79281) ) \ - ROM_LOAD( "95008793.bin", 0x0000, 0x100000, CRC(4b91b638) SHA1(b97cb1d22f91a791fc4d47bbae8965882898a317) ) \ - -#define sc_dndra_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008752.bin", 0x0000, 0x100000, CRC(82bfd510) SHA1(857f294d46d64275b15c56187bbbc19e2aa0f5bc) ) \ - ROM_LOAD( "95008753.bin", 0x0000, 0x100000, CRC(ee0b5da9) SHA1(f6cb6037f525df504c1ba8106f19990ecf8d1bd2) ) \ - -#define sc_dndbd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008790.bin", 0x0000, 0x100000, CRC(3c56a8b6) SHA1(8c06aa725233f4feb7c2e703f203cf9b0c6669a1) ) \ - ROM_LOAD( "95008791.bin", 0x0000, 0x100000, CRC(7378a4a8) SHA1(af9dd1fcbd8b77fab4afc85a325c0eb011f35e3a) ) \ - -#define sc_dndbr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008723.bin", 0x0000, 0x100000, CRC(6e1d9bd5) SHA1(92b2fd0b75a195af6ddfbdee3316f8af4bc4eb1a) ) \ - ROM_LOAD( "95008724.bin", 0x0000, 0x100000, CRC(309c1bf1) SHA1(82811b503a06e30a915eebdbdbcd63b567f241c1) ) \ - -#define sc_dndcc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008746.bin", 0x0000, 0x100000, CRC(ef3c39b9) SHA1(21b9788080de68acd436608d7d46fd9663d1589b) ) /* crazy chair */ \ - ROM_LOAD( "95008747.bin", 0x0000, 0x100000, CRC(9f9b638f) SHA1(5eae49f8a9571f8fade9acf0fc80ea3d70cc9e18) ) \ - \ - ROM_LOAD( "95008840.bin", 0x0000, 0x100000, CRC(2aa17d67) SHA1(43bdee1b3d0a0bf28f672620867fa3dc95727fbc) ) /* crazy chair */ \ - ROM_LOAD( "95008841.bin", 0x0000, 0x100000, CRC(594a9cd7) SHA1(667fa3106327ce4ff23877f2d48d3e3e360848d0) ) \ - \ - ROM_LOAD( "95009131.bin", 0x0000, 0x100000, CRC(59a9e50a) SHA1(15d79b177a1e926cd5aee0f969f5ef8b30fac203) ) /* crazy chair */ \ - ROM_LOAD( "95009132.bin", 0x0000, 0x100000, CRC(5e8a7ca6) SHA1(419ecc6ac15004bdd83bcd5b3e00d9dcd0d24936) ) \ - -#define sc_dnddw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008754.bin", 0x0000, 0x100000, CRC(d2c3e3e5) SHA1(3d21c812456618471a331d596760ea8746afc036) ) \ - ROM_LOAD( "95008755.bin", 0x0000, 0x100000, CRC(e6906180) SHA1(81215fd3dfe315123d5b028047a93e30baa52b5d) ) \ - -#define sc_dnddf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008738.bin", 0x0000, 0x100000, CRC(2a06f488) SHA1(666bd9c8091edda4b003fa586e5ae270831c119f) ) \ - ROM_LOAD( "95008739.bin", 0x0000, 0x100000, CRC(33d677b0) SHA1(5283d23671e340e3fda4eb4c6795d1d56b073206) ) \ - -#define sc_disco_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004220", 0x0000, 0x080000, CRC(530be6ac) SHA1(eede25d9d8a429dace91c1dc37ce4da7152b1836) ) \ - ROM_LOAD( "95004221", 0x0000, 0x080000, CRC(0b2020c9) SHA1(75c7af9312ea1b84df66a640fac903aedac5a0eb) ) \ - -#define sc_dbldm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008540.bin", 0x0000, 0x0ff77d, CRC(752628b0) SHA1(42b07736549b0e5e9d15cccd4922fac1e4135687) ) \ - -#define sc_dblfr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004307.bin", 0x0000, 0x080000, CRC(69b55ce9) SHA1(c635add8001dc7c5c81ffcae05b2b83bb37e9e72) ) \ - -#define sc_dough_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008505.bin", 0x0000, 0x100000, CRC(e18549be) SHA1(7062f05b6245c4188ed68a51dc7fbc8b138698f4) ) \ - -#define sc_ducks_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890347.bin", 0x0000, 0x5000, CRC(9faa9c11) SHA1(5e2add80ad17a27dd7b5b0a298ea6753b6adca11) ) \ - ROM_LOAD( "95890348.bin", 0x0000, 0x5000, CRC(ea3cd825) SHA1(0ecef82b32b0166ef5f8deecd7a85fd52fc66bf8) ) \ - ROM_LOAD( "95890349.bin", 0x0000, 0x5000, CRC(74861479) SHA1(7ba29931336985b96995688afdfe2b83a7602a84) ) \ - -#define sc_emmer_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008973.bin", 0x0000, 0x0fc2ce, CRC(a6ef4f4c) SHA1(4749e008e8cd0a7f92da85fcbf1a9dfd9fd5e721) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890452.bin", 0x0000, 0x5000, CRC(193927ce) SHA1(fe02d1d1519139199fbb743ce0e67b810261e9a2) ) \ - ROM_LOAD( "95890453.bin", 0x0000, 0x5000, CRC(6caf63fa) SHA1(86657e0e14eac91f91bd4da4c04b88c8ee28de45) ) \ - ROM_LOAD( "95890454.bin", 0x0000, 0x5000, CRC(f215afa6) SHA1(0e28affa6557474856087dbeeb0a3127616b7fe6) ) \ - -#define sc_evol_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "evolsnd.p1", 0x0000, 0x100000, CRC(13e18cc3) SHA1(114301af1abf86cdd9c2f01b316d257bb1ca086d) ) \ - ROM_LOAD( "evolsnd.p2", 0x0000, 0x08399a, CRC(345f3f11) SHA1(dd4d4f0f32650304cc6010b8f059c23dd5535919) ) \ - -#define sc_fgbh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009118.bin", 0x0000, 0x100000, CRC(f6ce47b9) SHA1(bb3917a3eed718e23dc37b1ffe93f2e349990d3c) ) \ - ROM_LOAD( "95009119.bin", 0x0000, 0x100000, CRC(9d96e3fd) SHA1(5d2d3939a2f1f765c2272f7747a0eea7d0cf1bf8) ) \ - -#define sc_fggp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008824.bin", 0x0000, 0x100000, CRC(58119c7f) SHA1(40f6376b5e1caf0c3231a9b870f584e9b2362676) ) \ - ROM_LOAD( "95008825.bin", 0x0000, 0x100000, CRC(7fdae5e2) SHA1(57bcb01b66bdd7ad68dc601f67bc13229ad604f8) ) \ - -#define sc_fast_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008453.bin", 0x0000, 0x0a5c12, CRC(bc1d0d4b) SHA1(1a6de68ead3287b32741dd596ca23b64e2a47925) ) \ - -#define sc_fnclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008670.bin", 0x0000, 0x100000, CRC(345c0993) SHA1(9fdc586c415c5f4586b8395d4a8d93d87792d43e) ) \ - ROM_LOAD( "95008671.bin", 0x0000, 0x100000, CRC(11dd3c77) SHA1(f125c510a10819dac3391a582277f99b53c131fa) ) \ - -#define sc_fdice_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_fires_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008442.bin", 0x0000, 0x100000, CRC(8b815735) SHA1(8374c706a5378bb8923fd331b96dd07f0204b2e7) ) \ - -#define sc_ftcas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008894.bin", 0x0000, 0x0ff163, CRC(9a25809f) SHA1(8be16ac75056be025b4881d50493650c8e290183) ) \ - -#define sc_floop_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890455.bin", 0x0000, 0x5000, CRC(e69028e8) SHA1(4b2f2daf0f0cda3fb9c48fe04eaedce3a1bb1bcd) ) \ - ROM_LOAD( "95890456.bin", 0x0000, 0x5000, CRC(93066cdc) SHA1(6bae40c87d083d11ec3b920637c10427ab30d0e2) ) \ - ROM_LOAD( "95890457.bin", 0x0000, 0x5000, CRC(0dbca080) SHA1(3855987a78f1110741ed8580999c3eceb9126378) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008974.bin", 0x0000, 0x0fdd10, CRC(22b0f002) SHA1(df0e66b693ea5587b6cb54847adafc4720dddaa6) ) \ - -#define sc_fbspn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008526.bin", 0x0000, 0x100000, CRC(81890751) SHA1(1e9cedc07c9028eb65620371d9fcf73ae84ad274) ) \ - -#define sc_fire_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008307.bin", 0x0000, 0x100000, CRC(e1b9b37c) SHA1(96bc9cb530f94b77c3243b2d9d743aeed209d64d) ) \ - -#define sc_fguy_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008813.bin", 0x0000, 0x100000, CRC(e5548d68) SHA1(ac20af71cedd0c6d61d6a28afa8d700c1446e442) ) \ - ROM_LOAD( "95008814.bin", 0x0000, 0x100000, CRC(06f3165c) SHA1(936a8c1d31bca93a5b985e89c48a1faaef602ae0) ) \ - -#define sc_fmj_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008982.bin", 0x0000, 0x0fe74c, CRC(c5ce4a41) SHA1(abbecddba4dd4691240df112138fa95f1e125a85) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890477.bin", 0x0000, 0x5000, CRC(a7dd60c5) SHA1(dfa3a89939cec2225d975984caf4703d83708b85) ) \ - ROM_LOAD( "95890478.bin", 0x0000, 0x5000, CRC(d24b24f1) SHA1(0c3a9c9579bb1066ea3e82e58b65d3bcac7fe900) ) \ - ROM_LOAD( "95890479.bin", 0x0000, 0x5000, CRC(4cf1e8ad) SHA1(924b454aa9c7340374b98201fbbaf922b836d779) ) \ - -#define sc_fwp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "5wayssnd.bin", 0x0000, 0x0f0833, CRC(0f165ccb) SHA1(709c91845cbe6b17c888e143eb121d649a221418) ) \ - -#define sc_fwpcs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_grq_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008357.bin", 0x0000, 0x100000, CRC(c5d8c1ba) SHA1(b017c0b616b5ad2e54f111571b16067269a0e69f) ) \ - -#define sc_gldfv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008347.bin", 0x0000, 0x100000, CRC(1d24f3ed) SHA1(01c7a8d2c8811cccee3748305681df75361f2254) ) \ - -#define sc_gldgo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009166.bin", 0x0000, 0x100000, CRC(06ae879f) SHA1(b4357306f4361bd26532e3db399f105f09fdf5be) ) \ - ROM_LOAD( "95009167.bin", 0x0000, 0x100000, CRC(5e34266d) SHA1(35fa153ccb7fd9001cd23dc0c9e683291615e9e0) ) \ - -#define sc_gldsp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008543.bin", 0x0000, 0x0d877c, CRC(eabb0fd5) SHA1(260807cf2ce23e02bfaa7d880823e606f8240bee) ) \ - -#define sc_gmclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009112.bin", 0x0000, 0x100000, CRC(80be159b) SHA1(2e6d19f97613152fcb17d027efc886815102fd56) ) \ - ROM_LOAD( "95009113.bin", 0x0000, 0x100000, CRC(edd3d30e) SHA1(94a56fda349d998b8571c271041d11cc79afaec2) ) \ - -#define sc_gamcs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004285.snd", 0x0000, 0x080000, CRC(034a84a6) SHA1(f5b815d943fe9f7eaff4358657426be5260753bf) ) \ - -#define sc_game_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004285.snd", 0x0000, 0x080000, CRC(034a84a6) SHA1(f5b815d943fe9f7eaff4358657426be5260753bf) ) \ - -#define sc_ziggy_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008472.bin", 0x0000, 0x0ece7a, CRC(12a9ec95) SHA1(1c3634b27718b1ce496c02c7dd6ef29800d1d2ee) ) \ - -#define sc_gldcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008968.bin", 0x0000, 0x0f4e4e, CRC(23e718a6) SHA1(1c781380d6b4fb307af6cb81be830159ce610352) ) \ - -#define sc_ghost_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008594.bin", 0x0000, 0x0b2ad7, CRC(3f7767d0) SHA1(b7ca39a42b59d1ac2088412fbb5f987b68f0189a) ) \ - -#define sc_ggrid_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008346.bin", 0x0000, 0x0e486b, CRC(1ec79154) SHA1(d6aff554e882e6f689caed383db79c752c9e672b) ) \ - -#define sc4ggcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008400.bin", 0x0000, 0x0e486b, CRC(78704d20) SHA1(c5f62434785b10d2bff5bcf415c2236b4f1ee551) ) \ - -#define sc4goldo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004165.bin", 0x0000, 0x080000, CRC(c52f4218) SHA1(2648f3ef35d68bdd14a0a773151157dae0271067) ) \ - ROM_LOAD( "95004166.bin", 0x0000, 0x080000, CRC(a77f1337) SHA1(e292c87fa8e643846cc0ddd7b9a585429b7efdd6) ) \ - -#define sc_gocas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_gshot_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008904.bin", 0x0000, 0x0b32a1, CRC(6e11054e) SHA1(45ff06ce84cf1675747976b11e144a43d96977ac) ) \ - -#define sc_goldw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008356.bin", 0x0000, 0x080000, CRC(c8f1ca20) SHA1(13136df35c09fea102c5176e249436f9e64616a5) ) /* golden winner */ \ - ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) /* triple casino */ \ - ROM_REGION( 0x400000, "sc1", ROMREGION_ERASE00 ) /* looks like a sc1/sc2 game, move */ \ - ROM_LOAD16_BYTE( "958402.11 10p no enrich.bin", 0x0000, 0x008000, CRC(00ed0ab4) SHA1(60e6a4abcf74ed705007cda699cdf8f52160a683) ) \ - ROM_LOAD16_BYTE( "958402.12 10p no enrich.bin", 0x0000, 0x008000, CRC(51af0108) SHA1(e6333e2879f7b2b3b558b6909e177f3101f503e6) ) \ - -#define sc_gx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004185", 0x0000, 0x080000, CRC(86756ea2) SHA1(86180e038a9bb3a3a700af1ddc571794e6948165) ) \ - -#define sc_gxcas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004185", 0x0000, 0x080000, CRC(86756ea2) SHA1(86180e038a9bb3a3a700af1ddc571794e6948165) ) \ - -#define sc_gx3_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_gd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008187.bin", 0x0000, 0x100000, CRC(1fbbc7cc) SHA1(6e19b582a3654bbbcf65b8f42bd556029f43e8cb) ) \ - ROM_LOAD( "95008188.bin", 0x0000, 0x100000, CRC(a74b23a7) SHA1(f7948edfb5524eaf80039c07ca7a9f76883f5a6f) ) \ - ROM_LOAD( "95009061.bin", 0x0000, 0x100000, CRC(c4cad720) SHA1(ce67af8d9e0b2f4f79d38b7a01dfc5ff7323e162) ) \ - ROM_LOAD( "95009062.bin", 0x0000, 0x100000, CRC(509761d3) SHA1(6a133cc33bac6a1696de98a4961572a86cefc1c8) ) \ - -#define sc_gdmz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008980.bin", 0x0000, 0x0fe431, CRC(c09277a0) SHA1(227609194f7d7e8b00cbd5cb94f8679f8fff71c6) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890471.bin", 0x0000, 0x5000, CRC(98fce599) SHA1(559534c3b33c6390a06b2e97e4c595055c8c4fea) ) \ - ROM_LOAD( "95890472.bin", 0x0000, 0x5000, CRC(ed6aa1ad) SHA1(83b69606398a30cb9c2ebc2f7406ef3215afab9e) ) \ - ROM_LOAD( "95890473.bin", 0x0000, 0x5000, CRC(73d06df1) SHA1(6959ee1b1c05398bc95430fea3590e5a86dd4312) ) \ - -#define sc_gdclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008248.bin", 0x0000, 0x100000, CRC(abfba7ee) SHA1(95b61b34080196d745cc00ae32a333edb111da89) ) \ - -#define sc_glad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_gunp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008744.bin", 0x0000, 0x100000, CRC(be8313a2) SHA1(247ec0b2140d261bf5e7ab21cedb4ad2fd708ca7) ) \ - ROM_LOAD( "95008745.bin", 0x0000, 0x100000, CRC(355caf88) SHA1(82951c00efd27533ccbc78b46cd5b69be5c3e26d) ) \ - -#define sc_gag_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004132.1_1", 0x0000, 0x080000, CRC(17320a32) SHA1(113ab1db5227fe17053969dd98f94f0b3b7555f5) ) \ - ROM_LOAD( "95004132.1_2", 0x0000, 0x080000, CRC(03593875) SHA1(a5f6730664b1bbfdb7b98b41379e9b240f43c53c) ) \ - -#define sc_goud_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004288.sn1", 0x0000, 0x080000, CRC(ae6d0680) SHA1(467d0127e2a63ca031ebf2816dde99273b513913) ) \ - ROM_LOAD( "95004289.sn2", 0x0000, 0x080000, CRC(9c88f3c8) SHA1(1152077f59cc28726f1428a9fdaf2c92ddef6c73) ) \ - -#define sc_hirol_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890458.bin", 0x0000, 0x5000, CRC(237fc19f) SHA1(41c0dad102e8345c568f6178b13a17acedcbe1b3) ) \ - ROM_LOAD( "95890459.bin", 0x0000, 0x5000, CRC(56e985ab) SHA1(48c425f85a8feba6775f2b34be8c91c78c233d66) ) \ - ROM_LOAD( "95890460.bin", 0x0000, 0x5000, CRC(c85349f7) SHA1(7be87d120dc5d5972663ede3df6c9221deddff9b) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008977.bin", 0x0000, 0x0d9fcb, CRC(99173f54) SHA1(86d6432a37453865f6ee3b80bf8e1c1c84c6e3f9) ) \ - -#define sc_hulk_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008367.bin", 0x0000, 0x100000, CRC(37eea219) SHA1(e612b2c0bca83d742b35fbaf487b6805cfac024d) ) \ - ROM_LOAD( "95008368.bin", 0x0000, 0x100000, CRC(06549054) SHA1(923a320f9689361802dc82db467b294f7bc85147) ) \ - -#define sc_hapnt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008290.bin", 0x0000, 0x100000, CRC(427fc43d) SHA1(c63154c7f2bb3e7ec78e31268a8040d0eb131f2f) ) \ - ROM_LOAD( "95008312.bin", 0x0000, 0x100000, CRC(cf33e14d) SHA1(33382be257a145784d9de7050b5c90f725241de4) ) \ - -#define sc_hfcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004272.bin", 0x0000, 0x080000, CRC(843cea31) SHA1(1d3a524600c8a0b7d6e3a32cad71f7f53c8190a1) ) \ - ROM_LOAD( "95004273.bin", 0x0000, 0x080000, CRC(c0782f35) SHA1(d763f7f8377c97129485522b201413e35c9c5760) ) \ - -#define sc_hill_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008494.bin", 0x0000, 0x100000, CRC(b2a2d2ca) SHA1(f9cd50c043dd58e4c92f94e4255c2fcb47963d39) ) \ - -#define sc_himi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008268.bin", 0x0000, 0x0ff264, CRC(6d5e7041) SHA1(bcc7b5c000aa8c25818aa063cd74f998484224a2) ) \ - - -#define sc_hiss_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008910.bin", 0x0000, 0x0fff2c, CRC(e5079d76) SHA1(0c44060d695e44720e7c34a9a142bdccd86ee943) ) \ - -#define sc_hotdg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_hotrd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008571.bin", 0x0000, 0x100000, CRC(50331772) SHA1(84aa448320210bfa8ea656f59cc4a320a0a46a32) ) \ - -#define sc_hotsh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008382.bin", 0x0000, 0x100000, CRC(cbf27ec8) SHA1(5be29fb836688e63d90e5a5108c6bdec09dd12a5) ) \ - -#define sc_hotwd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008309.bin", 0x0000, 0x100000, CRC(8cd75778) SHA1(5d75c10b32477faa24c73ad03de75914385787f6) ) \ - ROM_LOAD( "95008334.bin", 0x0000, 0x100000, CRC(0c334241) SHA1(3e5bde03330a5684a2a40fa94b33345039cd3755) ) \ - -#define sc_celeb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008440.bin", 0x0000, 0x100000, CRC(72a98e5d) SHA1(5f3e441d6c3fa2373284cee704630028cf7800ad) ) \ - ROM_LOAD( "95008441.bin", 0x0000, 0x100000, CRC(d7382975) SHA1(f5a4d92f243ec745f91d008d623b43dfa024635c) ) \ - -#define sc_iab_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890446.bin", 0x0000, 0x5000, CRC(8fbf0046) SHA1(5e121f73fcf1777041995c9891465e17c37c8163) ) \ - ROM_LOAD( "95890447.bin", 0x0000, 0x5000, CRC(fa294472) SHA1(71fa4cfaf8ba81f446d9f3504123e3c0c9a9af90) ) \ - ROM_LOAD( "95890448.bin", 0x0000, 0x5000, CRC(6493882e) SHA1(c69401b35ef710d0df51541e615818dbd259c7f7) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008969.bin", 0x0000, 0x0fe101, CRC(798c9559) SHA1(4afb21a78be73353741b5903099d3c48e44fcebb) ) \ - -#define sc_ijbdo_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891076.bin", 0x0000, 0x5000, CRC(d535ed90) SHA1(0e349023bec422b356d7b9cf7f892a10fabbdedd) ) \ - ROM_LOAD( "95891077.bin", 0x0000, 0x5000, CRC(a0a3a9a4) SHA1(e74ec6d2729bbef737300a014e83409ef034f605) ) \ - ROM_LOAD( "95891078.bin", 0x0000, 0x5000, CRC(3e1965f8) SHA1(b37c73edf7f4b17fe3554fa394846929ad2031c0) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008896.bin", 0x0000, 0x0eeaef, CRC(d581cb00) SHA1(16b44ba6cf4008109792a016d7aef12e6d6329d7) ) \ - -#define sc_inspn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008909.bin", 0x0000, 0x0face9, CRC(e79bdfa0) SHA1(b31362a2d14c17b1367b45ea8734e408a2899fc2) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890327.bin", 0x0000, 0x5000, CRC(f63a2e4f) SHA1(2982130035f122a3d9a4f4a277bc272c9613562b) ) \ - ROM_LOAD( "95890328.bin", 0x0000, 0x5000, CRC(83ac6a7b) SHA1(e4aae883b1070278314c6d388a132d362a059c5b) ) \ - ROM_LOAD( "95890329.bin", 0x0000, 0x5000, CRC(1d16a627) SHA1(985d526178de176869fdad3c4264f47de14d4d7f) ) \ - -#define sc_ijob_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008764.bin", 0x0000, 0x100000, CRC(995c0c63) SHA1(7459e92ad80d4eb61008a011bf5ae3a1d5cb8f9d) ) \ - ROM_LOAD( "95008765.bin", 0x0000, 0x0fb251, CRC(3c2feab2) SHA1(797ef43d2166c0522f6da5dd17bf4443f08891a5) ) \ - -#define sc_jjok_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_kingx_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890374.bin", 0x0000, 0x5000, CRC(87f2ca06) SHA1(480be8b0a42c9be55cb9e4c264438667734eb644) ) \ - ROM_LOAD( "95890375.bin", 0x0000, 0x5000, CRC(9b243aba) SHA1(537783dff8f155921a378224f2a8fe754c4947a5) ) \ - ROM_LOAD( "95890376.bin", 0x0000, 0x5000, CRC(587e182a) SHA1(23de9e8b4d2631e53917346d4902813d474e64a0) ) \ - ROM_LOAD( "95890700.bin", 0x0000, 0x5000, CRC(fab9a6f1) SHA1(a7901e76e96f083ca65ffbd847b36e1140c6caaf) ) \ - ROM_LOAD( "95890701.bin", 0x0000, 0x5000, CRC(e66f564d) SHA1(7267fd9d4ad1b1886870eb89c940f59a8f84c014) ) \ - ROM_LOAD( "95890702.bin", 0x0000, 0x5000, CRC(253574dd) SHA1(15b9aac5e9a176f792eefcbd7de2ad8df38ff67b) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008995.bin", 0x0000, 0x0931b3, CRC(e874bd15) SHA1(8adb32532dd053ca2c4e0987352013310ce197a0) ) /* = 95008995.bin sc4ckx Casino King X (Mazooma) (Scorpion 4) */ \ - -#define sc_ldvl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008866.bin", 0x0000, 0x0ff4f6, CRC(de0f7488) SHA1(dc9d546efa940f0cc69afb296bda0f07f82a4258) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890764.bin", 0x0000, 0x5000, CRC(15baa871) SHA1(9d3f021cfde738bc68d99f072160aee3eeaf8798) ) \ - ROM_LOAD( "95890765.bin", 0x0000, 0x5000, CRC(602cec45) SHA1(94f97824a90c4771e8c1fbab2cb41723b786f7be) ) \ - ROM_LOAD( "95890766.bin", 0x0000, 0x5000, CRC(fe962019) SHA1(e7283db78ac104bb47a37e5e81d50cd81db477f5) ) \ - -#define sc_lotrf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008251.bin", 0x0000, 0x100000, CRC(2af25e80) SHA1(fb606e434ac99eee6e114d6639f28f0fa1e7ffb3) ) \ - ROM_LOAD( "95008252.bin", 0x0000, 0x100000, CRC(fbca1cfb) SHA1(27c610af14b10d1d72774186fd3afc12d5db925e) ) \ - -#define sc_lotr2_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008320.bin", 0x0000, 0x100000, CRC(8ba801e3) SHA1(4d6a009c2f4f4478276f1227af6315b4be90fc87) ) \ - ROM_LOAD( "95008321.bin", 0x0000, 0x100000, CRC(42482ddc) SHA1(304961f267b85bc599dd64c97c14f34b2913dd59) ) \ - -#define sc_ltr2c_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008342.bin", 0x0000, 0x100000, CRC(44f48bf6) SHA1(2b36fb9ca6eb9cb35cf67e580d736c711d96ea25) ) \ - ROM_LOAD( "95008343.bin", 0x0000, 0x100000, CRC(f35a7927) SHA1(f2a93c8ff4699c7e6572a7a43b6b2bc50683594c) ) \ - -#define sc_lotrt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008517.bin", 0x0000, 0x100000, CRC(8092eaeb) SHA1(fea226ea7fb97226c79132aa67b89078f67cd920) ) \ - ROM_LOAD( "95008518.bin", 0x0000, 0x100000, CRC(6ac28d4e) SHA1(cdf50c856324130156115259efbfb7553480c749) ) \ - -#define sc_lotrr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008413.bin", 0x0000, 0x100000, CRC(66d6fd58) SHA1(dff5cc3f09fb4082fde4d5d4a9ecfe00cbce7242) ) \ - ROM_LOAD( "95008414.bin", 0x0000, 0x100000, CRC(8ec846ac) SHA1(3f66cbe5bc7190406425488beccb3e1d15356b1a) ) \ - -#define sc_luck7_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "lucky7s.bin", 0x0000, 0x200000, CRC(93002e7d) SHA1(50edf9064fb3bc9fd13efc65be6b12a4329fdb41) ) \ - -#define sc_monky_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890706.bin", 0x0000, 0x5000, CRC(4b2c5ee0) SHA1(e5bdcc4f076cc5550e51f3f4d4de5d8c59a4f545) ) \ - ROM_LOAD( "95890707.bin", 0x0000, 0x5000, CRC(3eba1ad4) SHA1(c780a4813c6b507a7e21ef2d7a401f3d764fd0f7) ) \ - ROM_LOAD( "95890708.bin", 0x0000, 0x5000, CRC(a000d688) SHA1(bcc197af2596b9c81cc56926fefc5854d7a94a27) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008998.bin", 0x0000, 0x0f0a3e, CRC(cc0dd8f2) SHA1(c99c54ce1289604f57ce2345ec5cb69be91b69d6) ) \ - -#define sc_mobob_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008842.bin", 0x0000, 0x100000, CRC(3205f4c9) SHA1(a8b92e1558911e02281b1c38c64c5e04836794b0) ) \ - ROM_LOAD( "95008843.bin", 0x0000, 0x100000, CRC(95057e16) SHA1(6c26451dd336f908ce0fcea0c56176b589111868) ) \ - -#define sc_momil_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009110.bin", 0x0000, 0x100000, CRC(8ec67890) SHA1(ba7f8cd4315a4ca8d2adeedc40c50e9e9a9b38f6) ) \ - ROM_LOAD( "95009111.bin", 0x0000, 0x100000, CRC(de68000c) SHA1(be69779ccb213a95698c2eafafe1f4a339febc4f) ) \ - -#define sc_mombc_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890597.bin", 0x0000, 0x5000, CRC(0d24f414) SHA1(85912d9e07995ffd6682d1ef65e4d71090b6584f) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_moms_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891135.bin", 0x0000, 0x5000, CRC(3fdecc78) SHA1(271699c347bcd2b40282d22f9e1a4e36713845e1) ) \ - ROM_LOAD( "95891136.bin", 0x0000, 0x5000, CRC(4a48884c) SHA1(d641295cdcc0226c64797d24799d8508ef13f204) ) \ - ROM_LOAD( "95891137.bin", 0x0000, 0x5000, CRC(d4f24410) SHA1(a35803e69aa8a45d46409baebbcbc20a35c1ac5d) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009023.bin", 0x0000, 0x0ffbf6, CRC(a10e8614) SHA1(85fc093f176cb81660717eb84301e9204402e83e) ) \ - -#define sc_mopl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mor2r_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891090.bin", 0x0000, 0x5000, CRC(a5009c47) SHA1(38b08c39ded1f1baef8a01373f19694b49d032b7) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009004.bin", 0x0000, 0x0ffe87, CRC(2403a082) SHA1(cd69739b2249724e3a88ea1c0b61151aeae0ea01) ) \ - -#define sc_monwa_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891094.bin", 0x0000, 0x5000, CRC(a241259b) SHA1(94dfcc7371593d983c8b62dba085b3ec51a33ed1) ) \ - ROM_LOAD( "95891095.bin", 0x0000, 0x5000, CRC(d7d761af) SHA1(a7adda6fe7bcec0f40587273a9a1d16a220f400a) ) \ - ROM_LOAD( "95891096.bin", 0x0000, 0x5000, CRC(496dadf3) SHA1(997f91c4c96b8971cc3ccfcaaaa42af6aac42ddd) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008010.bin", 0x0000, 0x0d5d57, CRC(1a75f403) SHA1(3bb5ca732d27aa4b8a2c96945be7e32c2abfe1c4) ) \ - -#define sc_cmcob_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891127.bin", 0x0000, 0x5000, CRC(7e7d858c) SHA1(8fe2b07275ad36ae80149e091582f729c8a1d240) ) \ - ROM_LOAD( "95891128.bin", 0x0000, 0x5000, CRC(acfcec9c) SHA1(270b9ae893016d6272f599fa29402d911650b85f) ) \ - ROM_LOAD( "95891129.bin", 0x0000, 0x5000, CRC(c7299792) SHA1(f6279d507091d257a74b2419ec883c363b3c548f) ) \ - ROM_LOAD( "95891130.bin", 0x0000, 0x5000, CRC(15a8fe82) SHA1(7fb448b5559d8248a302b7b0cfaa7dfa07dc16dd) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009021.bin", 0x0000, 0x0ff73b, CRC(068c715c) SHA1(25f80da3b548b9b0b6331d402d732a312985993b) ) \ - -#define sc_mogta_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009039.bin", 0x0000, 0x100000, CRC(0756b1b7) SHA1(82a8f9bf4c70a492ae2d4f478ecc73cccf9aecdd) ) \ - ROM_LOAD( "95009040.bin", 0x0000, 0x100000, CRC(9a928ef4) SHA1(5b19f70d067540aef3dc140115c12601d2b8176e) ) \ - -#define sc_monsp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004291.snd", 0x0000, 0x080000, CRC(0ea304f7) SHA1(3d524e108cd12e83956fec3997316a92a9e0898d) ) \ - ROM_LOAD( "95008183.bin", 0x0000, 0x080000, CRC(ab29f841) SHA1(908603184c3f7ead278dabd224d60e5362cdafbe) ) \ - ROM_LOAD( "95008184.bin", 0x0000, 0x080000, CRC(45ef95ea) SHA1(1e1126b542621e723eaf6e38918162fe701247e0) ) \ - -#define sc_monop_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008391.bin", 0x0000, 0x0ec7b3, CRC(fad36ca8) SHA1(67918353945429183befba56ab891a1d138f2e8b) ) \ - ROM_LOAD( "95008514.bin", 0x0000, 0x0ed840, CRC(2608cbde) SHA1(4831570fbc825592781e6473173d6ec911a0054d) ) \ - -#define sc_mmm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008944.bin", 0x0000, 0x0c76af, CRC(d2683fa2) SHA1(ebccd3da695cc69826493ac9e745b8dc2ce2ab8c) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890425.bin", 0x0000, 0x5000, CRC(fde2f6d4) SHA1(e62c28175138ed7d92c1e00c0a07a8e1f4a41ad2) ) \ - ROM_LOAD( "95890426.bin", 0x0000, 0x5000, CRC(8874b2e0) SHA1(0ba474cd47a65a5120df20b0f1ffcfe0aa51b0c5) ) \ - ROM_LOAD( "95890427.bin", 0x0000, 0x5000, CRC(16ce7ebc) SHA1(8561cf7808f09a92af8715999000684c1bef11bb) ) \ - -#define sc_mmad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008519.bin", 0x0000, 0x0fe4d6, CRC(e16efe22) SHA1(144e93e01967f343607ee8cee6add3d8ac8f5f28) ) \ - -#define sc_mdm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mhn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008857.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) /* r2r sounds */ \ - -#define sc_mhp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008707.bin", 0x0000, 0x100000, CRC(88ffdb28) SHA1(724a2fe6703d4e5aab7d3989be9d3ae4dc8ab057) ) \ - ROM_LOAD( "95008708.bin", 0x0000, 0x100000, CRC(fa8aa99e) SHA1(bd4dd726b0af371d9b8589de461316990c3232dc) ) \ - -#define sc_mmb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008612.bin", 0x0000, 0x100000, CRC(5f76152c) SHA1(c9f0ac000ec0b11ac3ba5eb5ff7e3dc2084f6744) ) \ - ROM_LOAD( "95008613.bin", 0x0000, 0x100000, CRC(df266121) SHA1(ece6b5a42ec3d18d97cffe3e6c98c6e6cd34682b) ) \ - ROM_LOAD( "95009168.bin", 0x0000, 0x100000, CRC(1ad311a5) SHA1(bd7728423cd855ea58fe21097d3d3db5a7e08339) ) \ - ROM_LOAD( "95009169.bin", 0x0000, 0x100000, CRC(23a8705f) SHA1(a36e71706cee64b56958fe4aefba8b85d2369e38) ) \ - -#define sc_mrh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008852.bin", 0x0000, 0x0c845b, CRC(265db01b) SHA1(6b9b62eded887ec528bb53b255d539122124eccc) ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890721.bin", 0x0000, 0x5000, CRC(766aaa4d) SHA1(bd1bfd7209e4d54e1fc798b720b749dd7ce8f9e6) ) \ - ROM_LOAD( "95890722.bin", 0x0000, 0x5000, CRC(6abc5af1) SHA1(61ef7254ab948899df9de693227e0eff2ad22e74) ) \ - ROM_LOAD( "95890723.bin", 0x0000, 0x5000, CRC(a9e67861) SHA1(2ce81fb21e709438c63d5eb74d107e6dc1905dd2) ) \ - -#define sc_mr2r_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008893.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) \ -/* ROM_LOAD( "95008983.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) */ \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890480.bin", 0x0000, 0x5000, CRC(3618777f) SHA1(97ab5be3bcdbe1c94e638c4dceac69bbfe359a0e) ) \ - ROM_LOAD( "95890481.bin", 0x0000, 0x5000, CRC(438e334b) SHA1(69b132ea3cbe31d31fd6fa6b915ddc2f4e66f068) ) \ - ROM_LOAD( "95890482.bin", 0x0000, 0x5000, CRC(dd34ff17) SHA1(b057c4a70066e8e8f9657e16adc4e0bfb6f00494) ) \ - -#define sc_mcas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008436.bin", 0x0000, 0x0e6369, CRC(32e8df77) SHA1(fa044287970d4e54af53ff492eabc50afa9a7a92) ) \ - ROM_LOAD( "95008991.bin", 0x0000, 0x0ec7b3, CRC(fad36ca8) SHA1(67918353945429183befba56ab891a1d138f2e8b) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890727.bin", 0x0000, 0x5000, CRC(10ec3f00) SHA1(986bfce992e113bab26eea8d1981905a54367b94) ) \ - ROM_LOAD( "95890728.bin", 0x0000, 0x5000, CRC(0c3acfbc) SHA1(ff39c8236d5bd44c7d238edd1827af5aebc46e5c) ) \ - ROM_LOAD( "95890729.bin", 0x0000, 0x5000, CRC(cf60ed2c) SHA1(df015b71567d6762b4c8ea6ad6d719cefdfdc60f) ) \ - -#define sc_mowow_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890712.bin", 0x0000, 0x5000, CRC(ec6db00b) SHA1(d16a1527caa3c115e3326c897ce0fa66e3a0420d) ) \ - ROM_LOAD( "95890713.bin", 0x0000, 0x5000, CRC(f0bb40b7) SHA1(33c19dab3086cdeae4f503fbf3f3cc5f0dad98c4) ) \ - ROM_LOAD( "95890714.bin", 0x0000, 0x5000, CRC(33e16227) SHA1(87efc1a046ef6af0b72cc76a6ee393a4d1ddbce3) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008550.bin", 0x0000, 0x100000, CRC(db6343bf) SHA1(e4d702020af67aa5be0560027706c1cbf34296fa) ) \ - ROM_LOAD( "95008551.bin", 0x0000, 0x100000, CRC(2d89a52a) SHA1(244101df7f6beae545f9b823750f908f532ac1e4) ) \ - ROM_LOAD( "95008850.bin", 0x0000, 0x0af41f, CRC(8ca16e09) SHA1(9b494ad6946c2c7bbfad6591e62fa699fd53b6dc) ) \ - ROM_LOAD( "95008869.bin", 0x0000, 0x0b9d9d, CRC(f3ef3bbb) SHA1(92f9835e96c4fc444a451e97b2b8a7b66e5794b7) ) \ - -#define sc_nmare_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008664.bin", 0x0000, 0x100000, CRC(54d245d7) SHA1(503db10681bc1d6cf1cffb2a6f818c5d912a7f56) ) \ - ROM_LOAD( "95008665.bin", 0x0000, 0x100000, CRC(79a00527) SHA1(b8207d3a81e97b2233fea1df883a4128388570e4) ) \ - ROM_LOAD( "95008703.bin", 0x0000, 0x100000, CRC(5c095089) SHA1(ffba71efccf4679c2b29ab620e67f3fa45ff19d4) ) \ - ROM_LOAD( "95008704.bin", 0x0000, 0x100000, CRC(61e5d6f4) SHA1(6d221e0b3dce7507253bb7f07d99d03025d813cb) ) \ - -#define sc_nunsb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_nunsm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008522.bin", 0x0000, 0x0f9907, CRC(df612d06) SHA1(cbca56230c4ad4c6411aa5c2e2ca2ae8152b5297) ) \ - -#define sc_rainb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009122.bin", 0x0000, 0x100000, CRC(7197027f) SHA1(216e43135c00452556ad5e7647891f14641840ed) ) \ - ROM_LOAD( "95009123.bin", 0x0000, 0x100000, CRC(3454f17d) SHA1(fc45d2653a0f260702a94663939b0d0176fc1c87) ) \ - -#define sc_parot_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008736.bin", 0x0000, 0x100000, CRC(148a7600) SHA1(d57f4a667151e78715d617b3d1e963d29d83b538) ) \ - ROM_LOAD( "95008737.bin", 0x0000, 0x100000, CRC(4e61167f) SHA1(6faa7a395bd2d9067b88a9c9c365198ea26ebb39) ) \ - -#define sc_pilep_others \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891066.bin", 0x0000, 0x5000, CRC(c058097e) SHA1(f6940ac1fe02498d13d62bd4318fd7445880c9a9) ) \ - ROM_LOAD( "95891067.bin", 0x0000, 0x5000, CRC(b5ce4d4a) SHA1(918009698696ce6bd9d0d68b4dc3e4234ff552bb) ) \ - ROM_LOAD( "95891068.bin", 0x0000, 0x5000, CRC(2b748116) SHA1(f6100c3ce79b4456d2f7fcda8e48734aad48141c) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008892.bin", 0x0000, 0x0fe398, CRC(e59abfb2) SHA1(fbe9ec614774a46f93ffb3ef9b8d4ee430d0aeed) ) \ - -#define sc_potsm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008966.bin", 0x0000, 0x0ff8c9, CRC(1cc159e9) SHA1(f7f5a027806c561825656c5741166e0893a30b10) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890443.bin", 0x0000, 0x5000, CRC(d6ee4a71) SHA1(f638c1e150ae089533ea43ca66010cb7190eb646) ) \ - ROM_LOAD( "95890444.bin", 0x0000, 0x5000, CRC(a3780e45) SHA1(4babae846051a0199f0e0baa6de0c7b16c73a185) ) \ - ROM_LOAD( "95890445.bin", 0x0000, 0x5000, CRC(3dc2c219) SHA1(acad92fd6d5112a5366b609761fbd2907bbce91a) ) \ - -#define sc_cpen1_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009057.bin", 0x0000, 0x100000, CRC(7b83611b) SHA1(6163ab8e848f019190af446710b31e3516386c57) ) \ - ROM_LOAD( "95009058.bin", 0x0000, 0x100000, CRC(43858a26) SHA1(fdb831e6a2ba161e72883100c22e2e9eee335fe6) ) \ - -#define sc_potp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008483.bin", 0x0000, 0x100000, CRC(d208755d) SHA1(f87b9b7dc077f4a1bf141ae8ca1e985796c4bada) ) \ - -#define sc_pp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008942.bin", 0x0000, 0x0ebc96, CRC(42765fbc) SHA1(ab5b9240a8e71695897fd55a1385b64f63ce52c8) ) \ - ROM_LOAD( "95008948.bin", 0x0000, 0x08b98b, CRC(35e995c5) SHA1(9d12a3002423e9434bcd76fe13f9fc0891354e40) ) \ - ROM_LOAD( "95008953.bin", 0x0000, 0x0fabc8, CRC(12d96e7a) SHA1(4f5179b5817e471b891f377f0bec81dcb4a2077c) ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890380.bin", 0x0000, 0x5000, CRC(1ba73039) SHA1(6f07fa6f412e92c5a55be15f8cce7aa6f5e8dca0) ) \ - ROM_LOAD( "95890381.bin", 0x0000, 0x5000, CRC(0771c085) SHA1(5eb89b14c03cac0f56d057dc2c0c7210cc9443ea) ) \ - ROM_LOAD( "95890382.bin", 0x0000, 0x5000, CRC(c42be215) SHA1(4da4820ee08a102a2a49ce64a49f66c9548b8ab1) ) \ - ROM_LOAD( "95890398.bin", 0x0000, 0x5000, CRC(007c15b3) SHA1(8330f7e8d2dc062118016d8f003df48930a5aeb8) ) \ - ROM_LOAD( "95890399.bin", 0x0000, 0x5000, CRC(1caae50f) SHA1(1e978f7f4851384cd800ebecd9beeff1a5df8156) ) \ - ROM_LOAD( "95890400.bin", 0x0000, 0x5000, CRC(dff0c79f) SHA1(aae28c245a672417962cd19388e4d5c401708911) ) \ - -#define sc_ppcr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008950.bin", 0x0000, 0x0fabc8, CRC(291b1b0d) SHA1(9d4149d2eb1303742dcba6e0e6d1b914f8a4019e) ) \ - -#define sc_ppctc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008785.bin", 0x000000, 0x100000, CRC(4f2284e6) SHA1(4a85bce29d9ae7181aef8874d46928e397ba915a) ) \ - ROM_LOAD( "95008786.bin", 0x100000, 0x100000, CRC(2c96e78e) SHA1(feab56483b6075ffcf8f60f8c573198ee91e7d64) ) \ - -#define sc_ppdym_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008984.bin", 0x0000, 0x0e6770, CRC(8257c559) SHA1(9088fd4d28ad9701767a2a255164e7201410c33a) ) \ - ROM_LOAD( "95008989.bin", 0x0000, 0x0e6770, CRC(fb60e407) SHA1(50f7ed9d2106db2f1e746081d7ca768177e7680c) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890483.bin", 0x0000, 0x5000, CRC(0ee68077) SHA1(163a46b16da238123cd542a62119dbaa726fca1b) ) \ - ROM_LOAD( "95890484.bin", 0x0000, 0x5000, CRC(123070cb) SHA1(4f3b313c3f7bd43120dd390fd9a187523838f559) ) \ - ROM_LOAD( "95890485.bin", 0x0000, 0x5000, CRC(d16a525b) SHA1(7358a180b1db0e2c5f4442481e9483a1170974a1) ) \ - -#define sc_ppsag_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008975.bin", 0x0000, 0x100000, CRC(0203bef7) SHA1(01b1f3225eb97303a3ddc678ad51aef90d2bb84a) ) \ - -#define sc_pony_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008408.bin", 0x0000, 0x100000, CRC(a28ef50e) SHA1(c5080418585a37ea63372b427c7e67b8c010f40c) ) \ - -#define sc_popey_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008798.bin", 0x0000, 0x100000, CRC(916cb144) SHA1(c75fa7a27be4e8dbd85fa074f6228877b5c86fc9) ) \ - ROM_LOAD( "95008799.bin", 0x0000, 0x100000, CRC(2f4c8eb6) SHA1(ca02b32705352735c4217aa20e9bc82eac8c3645) ) \ - -#define sc_pwrpl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_pwrbl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008496.bin", 0x0000, 0x100000, CRC(66b32a17) SHA1(3adaa7067f91c071ca70e4c8b1c3d07f0402e1bb) ) \ - -#define sc_qual_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008354.bin", 0x0000, 0x100000, CRC(1fb18180) SHA1(c21456253b670ce140efeaff6a590f8a50112bd4) ) \ - -#define sc_quidv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008993.bin", 0x0000, 0x0fab1c, CRC(e99defa5) SHA1(43954ec9acfedc86794d577d1e3058320264471e) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890703.bin", 0x0000, 0x5000, CRC(c87e0232) SHA1(c8de2c6b4f327ffd5b6bdb1248df1ba5573b21f0) ) \ - ROM_LOAD( "95890704.bin", 0x0000, 0x5000, CRC(bde84606) SHA1(0fe8285d862b97fee2a5a43082294a061b01bb16) ) \ - ROM_LOAD( "95890705.bin", 0x0000, 0x5000, CRC(23528a5a) SHA1(ac5b5a16a1e96a600be3760bd82cae2903459c24) ) \ - -#define sc_rssh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_rhog_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008783.bin", 0x0000, 0x100000, CRC(50d2c89b) SHA1(f3e592f009765118009f97bd7d0951b72ffc2898) ) \ - ROM_LOAD( "95008784.bin", 0x0000, 0x100000, CRC(88185c65) SHA1(b3a6d06aca91dc04d9efbc1e4ff89b37bcf87a57) ) \ - -#define sc_rhclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008802.bin", 0x0000, 0x100000, CRC(36647f4a) SHA1(ffa0cdf4f2b8ccc9afda67160a50e603b2a41ae6) ) \ - ROM_LOAD( "95008803.bin", 0x0000, 0x100000, CRC(2d26ff8a) SHA1(b9c797dfb2b06b3558e9a02d197e046244f4f2fc) ) \ - -#define sc_rdrag_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008485.bin", 0x0000, 0x0e7e1d, CRC(037269cd) SHA1(7b528427740c9f1b28e00d9b45ebeb5e77ca9ead) ) /* red dragon */ \ - ROM_LOAD( "95008525.bin", 0x0000, 0x0e7e1d, CRC(0c7aa11d) SHA1(3d028d2d5558056e84626ba66f7c22286be34bd9) ) /* club red dragon */ \ - -#define sc_rdrcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008525.bin", 0x0000, 0x0e7e1d, CRC(0c7aa11d) SHA1(3d028d2d5558056e84626ba66f7c22286be34bd9) ) \ - -#define sc_rhr \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_rhx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008331.bin", 0x000000, 0x100000, CRC(b41748dd) SHA1(458409a4d2f6444af564ebe28d80e110fdb845b6) ) \ - ROM_LOAD( "95008927.bin", 0x100000, 0x0f1c08, CRC(38fccc48) SHA1(9ef11b3fbe3bbd3c5b74cee2c35581f3e41cb372) ) \ - -#define sc_rhxcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008313.bin", 0x0000, 0x0c8958, CRC(4850fb2b) SHA1(9dde245c5b4afd6dbfd33372dff35fcbeefc2fe4) ) \ - -#define sc_r2r_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_relcz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008185.bin", 0x000000, 0x100000, CRC(d41a9b86) SHA1(9269000ec8d81b24e04a98b63e3294d56439820d) ) \ - ROM_LOAD( "95008186.bin", 0x100000, 0x100000, CRC(8f5bfdaf) SHA1(ecba8cacc83224d75b8076c6fd5fe46863a0689e) ) \ - -#define sc_rotc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "rotcsnd.bin", 0x0000, 0x100000, CRC(301147a2) SHA1(49a31e1e3c8af19e524f4f4b68533e4b2cc5e03d) ) \ - -#define sc_revo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008871.bin", 0x0000, 0x0fd182, CRC(e4f3b731) SHA1(ef829105e1b45c307546127ba85f5e0e5403ab98) ) \ - -#define sc_rttt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008306.bin", 0x0000, 0x100000, CRC(9c61f2ff) SHA1(5f000dcb2ec694fa8578f32fa485e61ad065e3d5) ) \ - -#define sc_roksc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008405.bin", 0x0000, 0x0fec18, CRC(847c5cbb) SHA1(cd304c31bd1f87e6b2444b50450ab9dd42ca79eb) ) \ - -#define sc_rollo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_r66_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_rhxcs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008853.bin", 0x0000, 0x0d11f1, CRC(c055b73c) SHA1(0c668e1733a089f95c61d1fe50fde2d4217e0e5f) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890724.bin", 0x0000, 0x5000, CRC(118e80ca) SHA1(9cd3dc111710224a8916f7b0f24e8997a9d98a8c) ) \ - ROM_LOAD( "95890725.bin", 0x0000, 0x5000, CRC(0d587076) SHA1(b470b3f1c1c82526c9dd08ae7dedbdc38bfb334d) ) \ - ROM_LOAD( "95890726.bin", 0x0000, 0x5000, CRC(ce0252e6) SHA1(9d6f69de70647e12d8352bc73922393006602797) ) \ - -#define sc_redsq_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008920.bin", 0x0000, 0x0f8d12, CRC(ac69f283) SHA1(4b62d2759f82effea988310df5ca92dd9f417a6d) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890350.bin", 0x0000, 0x5000, CRC(3e015e16) SHA1(c3a180d3611f46c9d7e93309d751b2422ec672cc) ) \ - ROM_LOAD( "95890351.bin", 0x0000, 0x5000, CRC(4b971a22) SHA1(205feec301bb69bf461fc4377704f675b5664944) ) \ - ROM_LOAD( "95890352.bin", 0x0000, 0x5000, CRC(d52dd67e) SHA1(8e5623d1fe4e096b1a19a153b0d2184424642469) ) \ - -#define sc_rich_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008084.lo", 0x000000, 0x100000, CRC(2231c842) SHA1(2180109949281b053313c8a8de33496d31d4279e) ) \ - ROM_LOAD( "95008085.hi", 0x100000, 0x100000, CRC(eb748aa3) SHA1(b81acfbceb5ff9df8bb30d3da82deea70bfce2fe) ) \ - - -#define sc_rosts_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008820.bin", 0x000000, 0x100000, CRC(31c0d215) SHA1(7d0172de75e54a7c00b7c28e21d738e64597f4f5) ) \ - ROM_LOAD( "95008821.bin", 0x100000, 0x100000, CRC(9c934f26) SHA1(2598870f724a2b070c5f791a2d30e582f87c06da) ) \ - -#define sc_rovrt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008961.bin", 0x0000, 0x0feba0, CRC(174f22f8) SHA1(e96c7019a48f1499c4b766e1fb700b2d4db59d5e) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890431.bin", 0x0000, 0x5000, CRC(a3d4624e) SHA1(4d66727af8cd1f10708635655777d80fe99e02af) ) \ - ROM_LOAD( "95890432.bin", 0x0000, 0x5000, CRC(d642267a) SHA1(9f2d0cd87e6acfebd855a7669c862dc20f1a52e3) ) \ - ROM_LOAD( "95890433.bin", 0x0000, 0x5000, CRC(48f8ea26) SHA1(156a83c1980483b12577fdb680d85a3f0f7bfdbd) ) \ - -#define sc_sharp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008561.bin", 0x0000, 0x100000, CRC(98d21491) SHA1(e06156dbe83fc26968da1a2432d697d68e6b88ee) ) \ - ROM_LOAD( "95008562.bin", 0x0000, 0x100000, CRC(fb3a25e7) SHA1(e8a60e4e870438fd4a330453ce1bdf8ad836fbc0) ) \ - -#define sc_sfts_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_srrqp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891091.bin", 0x0000, 0x5000, CRC(e8a89f86) SHA1(0260292e43320b4d7a7cd93c9c058be6250a1441) ) \ - ROM_LOAD( "95891092.bin", 0x0000, 0x5000, CRC(9d3edbb2) SHA1(6a1f3030dc6438da5e83f1d9144bd7f4fab98c97) ) \ - ROM_LOAD( "95891093.bin", 0x0000, 0x5000, CRC(038417ee) SHA1(5e4234bf9b7d698b0f82af702209789948456e32) ) \ - -#define sc_witwi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008756.bin", 0x0000, 0x100000, CRC(bde21cff) SHA1(fc8945e66416447d690515161acf9260620d7768) ) \ - ROM_LOAD( "95008757.bin", 0x0000, 0x100000, CRC(7c33cf90) SHA1(f3ad90c5623d97e3bf013927945383115042b84b) ) \ - -#define sc_spnrn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008538.bin", 0x0000, 0x0de67f, CRC(5f689b5c) SHA1(a0469987b93fdd0c661ef622403e03c6edbc561a) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890178.bin", 0x0000, 0x5000, CRC(bb0186be) SHA1(575f212b555035a6a30fea7f49836f4ad72868d2) ) \ - ROM_LOAD( "95890179.bin", 0x0000, 0x5000, CRC(ea390914) SHA1(ac34e41f6e277115e5fc2ea2bb1675c1d7df0dfe) ) \ - ROM_LOAD( "95890180.bin", 0x0000, 0x5000, CRC(7483c548) SHA1(06675caa6e0e4f136995d542210bddbb2e9e2ba4) ) \ - -#define sc_srace_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_sleut_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008870.bin", 0x0000, 0x0fa9dd, CRC(9b219ee5) SHA1(a488919d305bc8a2f8d92ea73054ea9e467dbb4e) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890777.bin", 0x0000, 0x5000, CRC(12e0a0db) SHA1(f7360b7f7086111dd951c9742f4b0402dfdd988c) ) \ - ROM_LOAD( "95890778.bin", 0x0000, 0x5000, CRC(6776e4ef) SHA1(a39e7aefb57521e4782dd0a8b37c904b7b76ff29) ) \ - ROM_LOAD( "95890779.bin", 0x0000, 0x5000, CRC(f9cc28b3) SHA1(031df3658b5aec9f318f42f04e8041fd9ae1b761) ) \ - - - -#define sc_showt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008656.bin", 0x0000, 0x100000, CRC(632a4cbb) SHA1(455e6242f5c5c1a0d84aadfdda33873e8e7b2418) ) \ - ROM_LOAD( "95008657.bin", 0x0000, 0x100000, CRC(aa68db50) SHA1(52ee314549fac989dd9ee494144ee3bbb99ee283) ) \ - ROM_LOAD( "95008734.bin", 0x0000, 0x100000, CRC(8b469657) SHA1(514b3f4cbbafb3cee618b9ce0bae572f1a4fcf7b) ) \ - ROM_LOAD( "95008735.bin", 0x0000, 0x100000, CRC(fa614cc1) SHA1(e5ecce4936a8db267b08b938ab5bc7500cf98f99) ) \ - ROM_LOAD( "95008777.bin", 0x0000, 0x100000, CRC(1ff19229) SHA1(6db08982ee923ef4568caf76e05088574f99fc36) ) \ - ROM_LOAD( "95008778.bin", 0x0000, 0x100000, CRC(2f2f3ee1) SHA1(cade826fec6c07a1fffa548c96404da83db14dd7) ) \ - -#define sc_slad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008375.bin", 0x0000, 0x100000, CRC(967e41ec) SHA1(4ca9eb1db89b6f918b416f1c68805c4306850c7a) ) \ - -#define sc_srrmz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008155.bin", 0x000000, 0x100000, CRC(2c12d323) SHA1(78199130f15b90f2c8f932f40d7e1e0e0646ce57) ) \ - ROM_LOAD( "95008156.bin", 0x100000, 0x100000, CRC(775dd1cd) SHA1(2b0ffa326ae53b60dbda6eb1f066b2ea29e6dd26) ) \ - -#define sc_srrca_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_s2k_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_splgb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_spred_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_stag_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008017.lo", 0x000000, 0x100000, CRC(dab74220) SHA1(321f765e1908b65ec9d3e64bb33533d78c9cc58a) ) /* start of rom is blank?! */ \ - ROM_LOAD( "95008018.hi", 0x100000, 0x100000, CRC(ba328f08) SHA1(99880f22c2cac61b32c3e2a574b9b30daefefb3e) ) \ - -#define sc_sahed_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008353.bin", 0x0000, 0x0fbc01, CRC(593626e0) SHA1(f348d6ea347efa706b1587235241231562c447d3) ) \ - -#define sc_sirpz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "sound_1", 0x000000, 0x080000, CRC(e5e1b0d5) SHA1(bfdc90e09534b97d9a6b6804284c80800db1aff7) ) \ - ROM_LOAD( "sound_2", 0x080000, 0x080000, CRC(3f8c71ed) SHA1(3bab20e8f6af2cfb8c7bba04b29f5aec4c692c1b) ) \ - -#define sc_smk7_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004163.lo", 0x000000, 0x080000, CRC(fd8fd1a9) SHA1(a6c1bfefc7200f9ad429bf166d0deeb6092e9e4d) ) \ - ROM_LOAD( "95004164.hi", 0x080000, 0x080000, CRC(9d8d69d3) SHA1(345ea1b517828cd4b140ec91e7014176cd45f6ad) ) \ - -#define sc_smtm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95416744.bin", 0x0000, 0x100000, CRC(3aa90fed) SHA1(d399f67bbe1d6f58d4c0a9e322156055cf3dccdc) ) \ - -#define sc_spice_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008585.bin", 0x0000, 0x100000, CRC(2f15c4a4) SHA1(df543cd6ebecbbd3922bb8550e4bf349fd8eb45c) ) \ - -#define sc_swywm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_sus_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008960.bin", 0x0000, 0x0f4505, CRC(a3279a7d) SHA1(da3cc1f3c0b9301e9b4d9f5253cafa3a9385be56) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890413.bin", 0x0000, 0x5000, CRC(5cdcd7cc) SHA1(7eaf28a20ca68c7edda1ee0cb5efefd00831c024) ) \ - ROM_LOAD( "95890414.bin", 0x0000, 0x5000, CRC(294a93f8) SHA1(f81f4cdb1b7e9107835f54702772c4e5f18d9731) ) \ - ROM_LOAD( "95890415.bin", 0x0000, 0x5000, CRC(b7f05fa4) SHA1(4cfbb0c7752edc6a0df8f9b6ab77f3fb9cd8db8e) ) \ - -#define sc_srr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008213.bin", 0x0000, 0x100000, CRC(e8f82b1d) SHA1(9357f587d638289b2cd5029e5895f69097d69089) ) \ - -#define sc_sslam_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008731.bin", 0x0000, 0x100000, CRC(b6f92b76) SHA1(69be21d12940dc415816dd3c77f4eb2c1bd1a555) ) \ - -#define sc_swbak_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008929.bin", 0x0000, 0x0f973a, CRC(016f4cc0) SHA1(763c6bf389e0c1e83d903d7aec23ac1a53261e7c) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890368.bin", 0x0000, 0x5000, CRC(01900e28) SHA1(c3e86b917b48249bdf0f1072f0cf5fa4b749d834) ) \ - ROM_LOAD( "95890369.bin", 0x0000, 0x5000, CRC(74064a1c) SHA1(0c254916fd56026dfd0df2abb4dc1c0b2dff1a7d) ) \ - ROM_LOAD( "95890370.bin", 0x0000, 0x5000, CRC(eabc8640) SHA1(41a5f5530289672563210d3ef71eb896cf6b3d5d) ) \ - -#define sc_tsmp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - - -#define sc_tempt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008654.bin", 0x0000, 0x100000, CRC(9963724c) SHA1(90d22b11934e95fd2bfda026dcde51dcd74f93cc) ) \ - ROM_LOAD( "95008655.bin", 0x0000, 0x100000, CRC(12735319) SHA1(166fbcc5828fd26ace63eed127427cbd0c81570d) ) \ - -#define sc_tpsht_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_tbox_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_typ_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008662.bin", 0x0000, 0x100000, CRC(51959c94) SHA1(8a4b68460da4223071e33158747ae0ea18b83a52) ) \ - ROM_LOAD( "95008663.bin", 0x0000, 0x100000, CRC(839687b2) SHA1(a9fd3645eb903cb52b348dd8313f0d953d5a5ec0) ) \ - - -#define sc5pompa_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_vamp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008890.bin", 0x0000, 0x0ffd25, CRC(bdf5491b) SHA1(231264d83a84fcc54bf45a43a37464fc5c604d9b) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891062.bin", 0x0000, 0x5000, CRC(3816210d) SHA1(890eed46cf9d7285887d0fe422ff6c8d8bf35820) ) \ - ROM_LOAD( "95891063.bin", 0x0000, 0x5000, CRC(4d806539) SHA1(73958733c49fa020f6425aef511489965df13907) ) \ - -#define sc_viper_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* 95008474.bin = 95008910.bin sc4hiss Hissing Quid (Qps) (Scorpion 4) */ \ - -#define sc_viz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008859.bin", 0x0000, 0x100000, CRC(86e4b4a1) SHA1(21344c9e5757d8d9ad7f1cd5ce5deb9f93d18fcc) ) \ - ROM_LOAD( "95008860.bin", 0x0000, 0x0ae3ea, CRC(0e49df2c) SHA1(629b90f91e8840560ea6eaf0e94d6b2fb6aba71c) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890742.bin", 0x0000, 0x5000, CRC(247f75ec) SHA1(92d63123aabf6932b283bbbd581c1bbe526318ce) ) \ - ROM_LOAD( "95890743.bin", 0x0000, 0x5000, CRC(51e931d8) SHA1(91ceb930eac97e090de5471c8a789ddd31c65a10) ) \ - ROM_LOAD( "95890744.bin", 0x0000, 0x5000, CRC(cf53fd84) SHA1(0de52e4ce83f41f2928866fc914ed36023415a4f) ) \ - -#define sc_wacky_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008834.bin", 0x0000, 0x100000, CRC(def73602) SHA1(681aafa4c035fdbb0f03e92fa56d31c13e27ca59) ) \ - ROM_LOAD( "95008835.bin", 0x0000, 0x100000, CRC(9a10ff4f) SHA1(903e43d9db726dc5ee92abaf23b61454611064b1) ) \ - ROM_LOAD( "95009128.bin", 0x0000, 0x100000, CRC(d9883f0c) SHA1(3cfeb470248a9d5d6b653175c16f88c54d51fceb) ) \ - ROM_LOAD( "95009129.bin", 0x0000, 0x100000, CRC(969f418a) SHA1(ca65dfa23f9e6a516bc65baa8ddd80faa530af1f) ) \ - -#define sc_wotw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008925.bin", 0x0000, 0x0eea8c, CRC(9cb8a972) SHA1(9b99eea5264fa0764f4598330f442335a8024cdb) ) \ - -#define sc_wild_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890339.bin", 0x0000, 0x5000, CRC(e3fbc85c) SHA1(8fc235f53b9359d378f86819e04377e7c102428c) ) \ - ROM_LOAD( "95890340.bin", 0x0000, 0x5000, CRC(ff2d38e0) SHA1(3b62d6c6448312f999502c244d483df8a60be77a) ) \ - ROM_LOAD( "95890341.bin", 0x0000, 0x5000, CRC(3c771a70) SHA1(bf47ecdea05757d9636526308f4aeabe3748d307) ) \ - -#define sc_wca_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008524.bin", 0x0000, 0x0ec9a6, CRC(a585c613) SHA1(dbe4f3b8584b92012e84d48c232b31a0fba6e20c) ) \ - -#define sc_wok_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008811.bin", 0x0000, 0x100000, CRC(0aae3aea) SHA1(a13ca57b4ff95022392b6bf06065593c3271637a) ) \ - ROM_LOAD( "95008812.bin", 0x0000, 0x100000, CRC(4a48eabd) SHA1(30dc0cccc636c1472b7577353c1db8e88242bba4) ) \ - -#define sc_srrcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_pircl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95009200.bin", 0x0000, 0x100000, CRC(45392f4b) SHA1(9a71834e52480f87ab303c22efe15157b8f25b5c) ) \ - ROM_LOAD( "95009201.bin", 0x0000, 0x100000, CRC(3aece97c) SHA1(fc469870fef892da0a4aa49077c7746315933d40) ) \ - -#define sc_mrrcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_gball_pthers \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008161.bin", 0x0000, 0x080000, CRC(ecd13fd9) SHA1(51d11b9133d4e840ce9afd7cf716520ea0fc0343) ) \ - ROM_LOAD( "95008162.bin", 0x0000, 0x080000, CRC(b4b4a5c5) SHA1(d0748decfaee7da52d2f6a4bc0877be4243ed6fb) ) \ - ROM_LOAD( "95008465.bin", 0x0000, 0x100000, CRC(5d1fa2c9) SHA1(c12de2b89f0bcb8f1b35630fffd205fd9d5b9777) ) \ - ROM_LOAD( "95008466.bin", 0x0000, 0x100000, CRC(418068ab) SHA1(342939e9bcc1d213bc2f52666cc3765442e18635) ) \ - -#define sc_gfev_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95416146.bin", 0x0000, 0x100000, CRC(17e92fa0) SHA1(7dea5166f3f70e5d249da56f01bbe2267ce43d6a) ) \ - -#define sc_ggame_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008515.bin", 0x0000, 0x0ab5c3, CRC(70cd8480) SHA1(2da34a0c1d9d84471005f5d6491499e707c0b0d4) ) /* KGXDX */ \ - ROM_LOAD( "95008958.bin", 0x0000, 0x0435d3, CRC(31ffdb64) SHA1(e48cfa2e5b158555b4ba204fc1175810b81cbbed) ) /* MULTIGG */ \ - ROM_LOAD( "95008992.bin", 0x0000, 0x0aa536, CRC(aad10089) SHA1(d8a32f66432ee901be05435e8930d3897f4b4e33) ) /* BARX */ \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890410.bin", 0x0000, 0x5000, CRC(9588ae1d) SHA1(ae45d9e0272b2b048b99e337def1acfb2524597e) ) \ - ROM_LOAD( "95890411.bin", 0x0000, 0x5000, CRC(895e5ea1) SHA1(070df49baca709f69fa1e522b21e42b716af0ba5) ) \ - ROM_LOAD( "95890412.bin", 0x0000, 0x5000, CRC(4a047c31) SHA1(aeb969801c89b60a644b4ffc2e1bbb73f6d61643) ) \ - -#define sc_ggg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008992.bin", 0x0000, 0x0aa536, CRC(aad10089) SHA1(d8a32f66432ee901be05435e8930d3897f4b4e33) ) \ - ROM_LOAD( "95009015.bin", 0x0000, 0x0b7821, CRC(8b6ca362) SHA1(4c50935b6d1038738ce631fbdc359416197b8c03) ) \ - ROM_REGION( 0x400000, "pivs", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95890730.bin", 0x0000, 0x5000, CRC(9673d1ce) SHA1(fee90139fc8de5e7b6dfe741b4852a363c17eb93) ) \ - ROM_LOAD( "95890731.bin", 0x0000, 0x5000, CRC(8aa52172) SHA1(441a649e3da00556a8ea966a88ee9b58b4943d3b) ) \ - ROM_LOAD( "95890732.bin", 0x0000, 0x5000, CRC(49ff03e2) SHA1(f8b77c97f2b1bb5de06f4c9835275ae9b83d0988) ) \ - -#define sc_ggcas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_gnc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_hellb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004211.bin", 0x0000, 0x080000, CRC(2e729642) SHA1(c8dcdce52f930b3fa894c46907691a28a5499a16) ) \ - ROM_LOAD( "95008341.bin", 0x0000, 0x100000, CRC(486e5395) SHA1(0ad68f271f4839d50a790b7f4427e1f1f1933bd4) ) \ - -#define sc_leg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008093.bin", 0x0000, 0x100000, CRC(86e27465) SHA1(1d27358fe795286676a8031382387ff4225f7118) ) \ - ROM_LOAD( "95008094.bin", 0x0000, 0x100000, CRC(08909b00) SHA1(3e5b3da186036d7fe67ed2739de6fba79d4a978a) ) \ - -#define sc_legcb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008197.bin", 0x0000, 0x100000, CRC(234ff677) SHA1(571c2fa2b5a24d07e90e43061d9947f64874e482) ) \ - ROM_LOAD( "95008198.bin", 0x0000, 0x100000, CRC(4b03df47) SHA1(13c24cc90a618ebc7c150ab3694a1b787fb049d6) ) \ - -#define sc_luckb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008161.bin", 0x0000, 0x080000, CRC(ecd13fd9) SHA1(51d11b9133d4e840ce9afd7cf716520ea0fc0343) ) /* golden balls */ \ - ROM_LOAD( "95008162.bin", 0x0000, 0x080000, CRC(b4b4a5c5) SHA1(d0748decfaee7da52d2f6a4bc0877be4243ed6fb) ) \ - ROM_LOAD( "95008167.bin", 0x0000, 0x080000, CRC(13aaf063) SHA1(70ab005c867c0c8f63b16722f4fc3ba0c935a96f) ) /* lucky balls */ \ - ROM_LOAD( "95008168.bin", 0x0000, 0x080000, CRC(71aebb68) SHA1(479b3915552be029d459d3f05ccf668c21f05554) ) \ - -#define sc_mww_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008593.bin", 0x0000, 0x06a118, CRC(e4aee21b) SHA1(bda104a05bd2c0d4506f389c54e8842dc20d84b0) ) \ - \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890162.bin", 0x0000, 0x5000, CRC(acf9118a) SHA1(b2c9073f0496de62d66edbc1da5546b9239ac1ba) ) \ - ROM_LOAD( "95890163.bin", 0x0000, 0x5000, CRC(b02fe136) SHA1(ac52b411f8117564a8dae25b19c9395e9030bfa0) ) \ - ROM_LOAD( "95890164.bin", 0x0000, 0x5000, CRC(7375c3a6) SHA1(8e5340e201261ccd8b47334f5d23e8adb33d031f) ) \ - ROM_LOAD( "95890387.bin", 0x0000, 0x5000, CRC(7e8703c6) SHA1(139dab5081ce9bdfade8c2a188562d98a15f8bb2) ) \ - ROM_LOAD( "95890388.bin", 0x0000, 0x5000, CRC(6251f37a) SHA1(3c8beafa021b6f4d32bd46f3fd755a7f877414ea) ) \ - ROM_LOAD( "95890389.bin", 0x0000, 0x5000, CRC(a10bd1ea) SHA1(e575a7cd0d40a7282aee2b7cd9f4801408ff846d) ) \ - -#define sc_manic_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008684.bin", 0x0000, 0x100000, CRC(52b7d26e) SHA1(ba6629dbad8d00c132c0ddf6a8a41ddc99231c75) ) \ - ROM_LOAD( "95008685.bin", 0x0000, 0x100000, CRC(dc9717c0) SHA1(27234bb7c7e7bd1f395972ce2958d55e84005313) ) \ - -#define sc_pacmn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004183", 0x000000, 0x080000, CRC(4b28f610) SHA1(fff01c890a8c109bb4b522ee2391c15abdc2758c) ) \ - ROM_LOAD( "95004184", 0x080000, 0x080000, CRC(bee11fdd) SHA1(b5ce97108812e296c92a000444c1fb7a11286de4) ) \ - ROM_LOAD( "95004199.lo", 0x000000, 0x080000, CRC(3a9605c8) SHA1(ce1c94fe26eac9e145e94539f62f2bde740e5b9a) ) \ - ROM_LOAD( "95004199.hi", 0x080000, 0x080000, CRC(0ecfc531) SHA1(15e20eedf4b7d9102c40834612d111559b4dcbca) ) \ - ROM_LOAD( "97000000.evn", 0x000000, 0x080000, CRC(5b13fe7b) SHA1(1bd32e577914ab4e3bc3282261f8c3cdf015b85d) ) /* pacp */ \ - ROM_LOAD( "97000000.odd", 0x080000, 0x080000, CRC(8bab1c78) SHA1(ddc915a8c56473ba4d67d8c62c66105dd622b593) ) \ - -#define sc_paccs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_paccl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008145.bin", 0x0000, 0x100000, CRC(e2ec54f8) SHA1(bb1c40b13151ed1e3c7ba603506701457392bb8b) ) \ - ROM_LOAD( "pacmancsnd.bin", 0x0000, 0x0bbb33, CRC(c505aa18) SHA1(a99bd1c4101269e2eb2b6becf210d9991fee1da1) ) \ - -#define sc_pacpl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008049", 0x0000, 0x0ff7f5, CRC(efb3c1aa) SHA1(345ad862a329eedf7c016ddd809c8b60185d9962) ) \ - -#define sc_pmani_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008201.bin", 0x0000, 0x100000, CRC(4e0358c5) SHA1(b9d8b78c77f87eebb9408a4ea1b9fd3a64ae724d) ) \ - -#define sc_polem_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "pole_p.sn1", 0x000000, 0x080000, CRC(cbb7b019) SHA1(1404ff5fe2c3e54370a79ea141617e58e56217e9) ) \ - ROM_LOAD( "pole_p.sn2", 0x080000, 0x080000, CRC(95d9939b) SHA1(29d03f2f2d33a807df002271e14b614bae3d10e4) ) \ - -#define sc_polen_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "polesnd1.bin", 0x0000, 0x080000, CRC(09f720e3) SHA1(1a5c581b16b974e949679c3d71696984755f3c7c) ) \ - ROM_LOAD( "polesnd2.bin", 0x0000, 0x080000, CRC(80c2702b) SHA1(6c7b1d535d8f1eeb25a1a84ccf9e97b3e453af6d) ) \ - -#define sc_pog_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008750.bin", 0x0000, 0x100000, CRC(25a94ab7) SHA1(9ee3a1acb2734a5663d925fa050c15d154f79678) ) \ - ROM_LOAD( "95008751.bin", 0x0000, 0x100000, CRC(53c97577) SHA1(5ec3868967073b4ed429fed943fbcd568a85b4f3) ) \ - -#define sc_rt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008203_1.bin", 0x000000, 0x100000, CRC(778a18e5) SHA1(2ad4d0259f08786f50928064a4d345ffa6bb52e2) ) \ - ROM_LOAD( "95008204_2.bin", 0x100000, 0x100000, CRC(ef036383) SHA1(cb26a334fe043c6aba312dc6d3fe91bd93e0cb2f) ) \ - - -#define sc_rtclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_sace_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008270.bin", 0x0000, 0x0fde91, CRC(5c87d4ce) SHA1(6fce212a89334a9595411aa2d20bde5e3fae4710) ) \ - -#define sc_sf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_starp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "star prize snd1.bin", 0x0000, 0x080000, CRC(9f7f7442) SHA1(576e5e92455455ad18ae596a9dae500a17912faa) ) \ - ROM_LOAD( "star prize snd2.bin", 0x0000, 0x080000, CRC(0ae992b5) SHA1(b3a8ba472aa3a6785678a554a7fe789f9f3dc6c0) ) \ - ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "sprizesn.1", 0x0000, 0x080000, CRC(5a9a9903) SHA1(ac79fedeaa1b37661d0ec28bf6c5b141c7fcc328) ) \ - -#define sc_tetri_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008097_1.bin", 0x0000, 0x100000, CRC(01a251eb) SHA1(0cb63736065b97956f02710867ac11609b1f282c) ) \ - ROM_LOAD( "95008098_2.bin", 0x0000, 0x100000, CRC(5ebcfd20) SHA1(be415d965732b3fde47684dacdfe93711182faf4) ) \ - -#define sc_trail_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "trailblazer.bin", 0x0000, 0x0f6a6c, CRC(c27b5f9d) SHA1(24ac4ae0bec9a898690dfa2a78f765026d58255b) ) \ - -#define sc_ttpie_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008579.bin", 0x0000, 0x100000, CRC(b3741823) SHA1(77890bf89b848fa2222e885aeb51f05f033143ba) ) \ - -#define sc_vivam_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004246.bin", 0x0000, 0x080000, CRC(4e5a0143) SHA1(a9e668aceb21671a78b584fd55c21d5501ea1f8a) ) \ - ROM_LOAD( "95004247.bin", 0x0000, 0x080000, CRC(4a35b6a1) SHA1(24e4ed93149b7f6caf785ecaa5a4685585a36f5b) ) \ - ROM_LOAD( "95008719.bin", 0x0000, 0x100000, CRC(f99eafef) SHA1(7a7dedf5bf8292b94ac6da78478441335bfcb66f) ) \ - ROM_LOAD( "95008720.bin", 0x0000, 0x100000, CRC(6419033f) SHA1(3d222696dd9f4f201596fd444a031690cc8c1b0d) ) \ - ROM_LOAD( "viva_mex.sn1", 0x0000, 0x080000, CRC(ed357575) SHA1(610047e83062fd4a6d23d9b9281a3a6c04d63f7d) ) \ - ROM_LOAD( "viva_mex.sn2", 0x0000, 0x080000, CRC(aab9421d) SHA1(db2941e013597be3fe05a2b002aebdfb0f7a2b41) ) \ - -#define sc_vmclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008101.bin", 0x0000, 0x100000, CRC(751a433f) SHA1(36aaf1b2425c58bd49671fc6bd61addc33a082f1) ) \ - ROM_LOAD( "95008102.bin", 0x0000, 0x100000, CRC(155ec8ab) SHA1(5f38fb49facab94d041f315178a3d2adf9d95853) ) \ - -#define sc_vmnv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_vrgcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008143.bin", 0x0000, 0x100000, CRC(8bf35d69) SHA1(0a5017d02ba839f2f21402df99e7684ce559d931) ) \ - ROM_LOAD( "95008144.bin", 0x0000, 0x100000, CRC(1ce7f671) SHA1(ccca34515217e72ef1879a3cbad77c7adea3a665) ) \ - -#define sc_wldjk_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008999.bin", 0x0000, 0x0b4dd9, CRC(0fa36a2e) SHA1(0168a326fd50c15e8f48293dff45e1411e5044f8) ) \ - ROM_REGION( 0x400000, "pics", 0 ) \ - ROM_LOAD( "95890709.bin", 0x0000, 0x5000, CRC(4b3ba87a) SHA1(6ec85bc6d14825ea0a497e6ee6e38d17c0c7b79f) ) \ - ROM_LOAD( "95890710.bin", 0x0000, 0x5000, CRC(3eadec4e) SHA1(bbb80a6325fd561ca762a0261b68b550285bb8f6) ) \ - ROM_LOAD( "95890711.bin", 0x0000, 0x5000, CRC(a0172012) SHA1(07ceb089ec88801700ea12f52e4cc49e8c1d5d36) ) \ - -#define sc_bsp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008725.bin", 0x0000, 0x100000, CRC(e0a46426) SHA1(f6bc41c48ec1c4f113968a6ccc7a7dc81a7674b2) ) \ - ROM_LOAD( "95008726.bin", 0x0000, 0x100000, CRC(f01062bb) SHA1(a75937e85010ff4da01277336ad37bcbb8d0ba9f) ) \ - -#define sc_chain_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008318.bin", 0x0000, 0x100000, CRC(d4fb4702) SHA1(b6cdeb8e34d081a403d5918ec95e2eb387102538) ) \ - -#define sc_clown_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008552.bin", 0x0000, 0x100000, CRC(89173513) SHA1(7c332b6c14725897b0ae1ed33d38a384eae9cfdd) ) \ - -#define sc_abra_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008350.bin", 0x0000, 0x0e3be3, CRC(b19e617c) SHA1(46eb761ac44fef0ff0f1731b098b067ce6843461) ) \ - -#define sc_bbclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008383.bin", 0x0000, 0x0f350f, CRC(a93300db) SHA1(4f2864cc71b3fe7ac1b323dfd226c18be83d301f) ) \ - -#define sc_botn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008484.bin", 0x0000, 0x0f8e5a, CRC(83e34402) SHA1(e90c3ef784dfce7df2d60b06bc84ec9a21ff9a12) ) \ - -#define sc_brkfs_others \ - ROM_REGION( 0x200000, "ymz", 0 ) \ - ROM_LOAD( "95008013.lo", 0x00001, 0x100000, CRC(286e59da) SHA1(e43901f4ad9fc7f083cbb7ef5cd7e4ad6289833b) ) \ - ROM_LOAD( "95008014.hi", 0x00000, 0x100000, CRC(1b9936ad) SHA1(0c98618d1ca30fa4f9913a5214a5f431e520917c) ) \ - -#define sc_broll_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bulcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008547.bin", 0x0000, 0x100000, CRC(33d997ba) SHA1(22c28360757bad350907b145e18a8e438d68f2b1) ) \ - ROM_LOAD( "95008548.bin", 0x0000, 0x100000, CRC(896bae80) SHA1(264127b6d22c048a0a54e7a63433c3aed6f053e2) ) \ - -#define sc_bankb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008350.bin", 0x0000, 0x0e3be3, CRC(b19e617c) SHA1(46eb761ac44fef0ff0f1731b098b067ce6843461) ) \ - -#define sc_bed_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008315.bin", 0x0000, 0x100000, CRC(5098077e) SHA1(8ecba67e3585dc7851f8bacb7c5235959f883143) ) \ - -#define sc_captn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008139.bin", 0x0000, 0x0c076f, CRC(8c87abf8) SHA1(2dfdf9202378723db267ed9d8f2abd076b5214d6) ) \ - -#define sc_cashn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004292.sn1", 0x0000, 0x080000, CRC(e7efab30) SHA1(b2587c14e427fdb51cb5c96e5e017c69f5c134e8) ) \ - ROM_LOAD( "95004293.sn2", 0x0000, 0x080000, CRC(89584d87) SHA1(935b6e873342aefd1c39bb474c6b780799a0e049) ) \ - -#define sc_cashm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008123_1.bin", 0x0000, 0x100000, CRC(9f1fc98b) SHA1(9233ef6a82f8b23066f959957a7561fb33120d46) ) \ - ROM_LOAD( "95008124_2.bin", 0x0000, 0x100000, CRC(4795c128) SHA1(7b55b39f335b81f6a895ed9beb123464e10a48ee) ) \ - -#define sc_casry_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cbaz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008317.bin", 0x0000, 0x100000, CRC(05ef55b5) SHA1(5130b9243647b9724998600b5f2ef2bbe7b5b1e5) ) \ - -#define sc_cburn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "97000034.p1", 0x0000, 0x100000, CRC(f06cb0f1) SHA1(856bdd31a35e93e6f52f88f2ac738cc3fab09c11) ) \ - ROM_LOAD( "97000034.p2", 0x0000, 0x100000, CRC(cce5a2a7) SHA1(4884e8abe2dde81f70ddc13a3a68d690fc097dae) ) \ - -#define sc_ccc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004282.snd", 0x0000, 0x080000, CRC(e17fb009) SHA1(27fa336c8576bd4a2414f4d71857e9113102cb3d) ) \ - -#define sc_ccogs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_cclas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004250.bin", 0x0000, 0x080000, CRC(5250f18b) SHA1(bbdc556df845753f9ce15dd7dfb2347539dfa00f) ) \ - ROM_LOAD( "95004251.bin", 0x0000, 0x080000, CRC(7a0a7876) SHA1(f172c8a1fbe214f201e6bf671c2f0534b6d9d395) ) \ - -#define sc_cjcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008435.bin", 0x0000, 0x100000, CRC(f0b58825) SHA1(124132a510e7473ade3d03fb63f24f120d3a08e4) ) \ - -#define sc_ctlcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008181.bin", 0x0000, 0x100000, CRC(9eb3e51e) SHA1(95e90e9574cba0526e495a8b17150a5081c13df8) ) \ - ROM_LOAD( "95008182.bin", 0x0000, 0x100000, CRC(5d31955a) SHA1(49dbb4f3efc7e03d1763abb3c6db21c81e961735) ) \ - -#define sc_cfcla_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "ccfsnd1.bin", 0x000000, 0x080000, CRC(d389aeb3) SHA1(855f3d4bba4922026b1fa963e60c5e58556739c3) ) \ - ROM_LOAD( "ccfsnd2.bin", 0x080000, 0x080000, CRC(6fbda954) SHA1(812c2c96a9e750daf5ac4a878c63847bfd5a2593) ) \ - -#define sc_cfclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004144.lo", 0x000000, 0x080000, CRC(9d861825) SHA1(4b8776a014e31f5041f7e172ae69cb172f42fae5) ) \ - ROM_LOAD( "95004145.hi", 0x080000, 0x080000, CRC(9570fbbc) SHA1(34bdca9ef125e5304b238dd8f1421a888c9ba33e) ) \ - -#define sc_cfdu_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008184.bin", 0x0000, 0x100000, CRC(dc98ec1b) SHA1(6b600d7790bb0a90c5309d7e7684e4cca26c5a50) ) \ - -#define sc_cfgcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008577.bin", 0x0000, 0x100000, CRC(f18f1116) SHA1(ba47360e7b489c1bcded786dd1efe518b62b039e) ) \ - -#define sc_crcp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008743.bin", 0x0000, 0x100000, CRC(d44e91bf) SHA1(f42a8c8b0ee5f233cddb4b6084a37e45e2490dd9) ) \ - -#define sc_crcc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD16_BYTE( "95004120.lo", 0x000000, 0x080000, CRC(770a9c0f) SHA1(2d06e32b1d07bc9dc51f39f9ba22c9fe8a678ef3) ) \ - ROM_LOAD16_BYTE( "95004121.hi", 0x080000, 0x080000, CRC(239f389c) SHA1(75d6f9f500aab5f114f8b86c4ca1f8dce6ea2ca4) ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95000611.mtx", 0x0000, 0x007231, CRC(440c355b) SHA1(884eb0fdc5f6c7c4fac4157d1e5f6bddcb70e148) ) /* unzip this */ \ - -#define sc_crgc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008323.bin", 0x0000, 0x100000, CRC(461dd238) SHA1(cab717b285fb217bf47ebe07bd6e7737cf0517c9) ) \ - -#define sc_crzky_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008242.bin", 0x0000, 0x100000, CRC(7d5c1356) SHA1(efab297024650c95a0abb1296b2ebabd09b299a8) ) \ - -#define sc_crzgn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004248.lo", 0x000000, 0x080000, CRC(4fff74c5) SHA1(2704a15e3afd73848c8f3963920f606310b86963) ) \ - ROM_LOAD( "95004249.hi", 0x080000, 0x080000, CRC(2c8cdeb1) SHA1(771bcc907be91be2d178b87a76b72bd3cc07fe30) ) \ - -#define sc_cvani_others \ - ROM_REGION( 0x400000, "ymz", 0 ) \ - ROM_LOAD( "95008237.bin", 0x0000, 0x0fdb37, CRC(ce0a3555) SHA1(7ba0c53709236d41f9e73b3a5151174ca2bf3fae) ) \ - -#define sc_cvclb_others \ - ROM_REGION( 0x400000, "ymz", 0 ) \ - ROM_LOAD( "95008345.bin", 0x0000, 0x0fdb37, CRC(1e01057c) SHA1(f54cd2b59b1b4901b972b8b33c85defc975b0fac) ) \ - -#define sc_druby_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) /* triple casino */ \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - /* not sc4/sc5?, scorpion 1/2? */ \ - ROM_LOAD( "95730028.bin", 0x0000, 0x008000, CRC(015f3760) SHA1(74dfd188f4a7ad057fda45a349e684be37a3f6bc) ) \ - ROM_LOAD( "95730068.bin", 0x0000, 0x008000, CRC(2bcbcf0d) SHA1(30dbb5ec3be34520ad89aedead42e1eda7841b63) ) \ - -#define sc_darw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008214.bin", 0x0000, 0x0e7add, CRC(423575e6) SHA1(52d9a22824b0ee828095f99dcc5209787f5a2c32) ) \ - -#define sc_duckq_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008337.bin", 0x0000, 0x0fd2ce, CRC(d452995e) SHA1(3a8196f44078a4730ec18f16ce3a68b647205a29) ) \ - -#define sc_dyna_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008209.bin", 0x0000, 0x100000, CRC(7845c5e7) SHA1(14cd505e11149b6bdfa0e8a92236f3229f7a2a0e) ) \ - -#define sc_easy_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008195.bin", 0x0000, 0x100000, CRC(e032e67a) SHA1(062f48bd2c38b51ffba8cda7860bb37abad40c71) ) \ - ROM_LOAD( "95008196.bin", 0x0000, 0x100000, CRC(4a23e184) SHA1(2d1c1d92c9cdccd95ca4f466a2d7765def7d990b) ) \ - ROM_LOAD( "95008288.bin", 0x0000, 0x100000, CRC(da74e2d3) SHA1(a16b3d6c0590b0ccc7b2488a2f23383a332c332a) ) /* casino */ \ - -#define sc_fastf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008272.bin", 0x0000, 0x0fafac, CRC(a9bdc1e2) SHA1(60ff02ff4906d8b0f6392cccb96976b912c61e2d) ) \ - -#define sc_fbcrz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - /* DMD? */ \ - ROM_LOAD( "95751937.hex", 0x0000, 0x025f91, CRC(8f412e97) SHA1(a5ff924fbc327114e59d75de644ed0d5cd7fa6b3) ) \ - ROM_LOAD( "95751937.bin", 0x0000, 0x010000, CRC(4a99ee11) SHA1(335398ebc64bbfe86e2652ac080a5943dd413928) ) /* contains PC-like references and 'Rasterspeed' stuff - the only other reference I find to this is on unmamed regarding 'Zool' */ \ - -#define sc_fd7th_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "frankie snd1.bin", 0x0000, 0x080000, CRC(5d74001e) SHA1(f157706c0970af9b396c2973774c828ed1c0d275) ) \ - ROM_LOAD( "frankie snd2.bin", 0x0000, 0x080000, CRC(8863c8e6) SHA1(0e852155cb2d50d8f0b892c055b37e9955fd8da4) ) \ - \ - ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "frdesnd1", 0x0000, 0x080000, CRC(deb93ffa) SHA1(5a549b6bde6f92561952584e3184c1985903464f) ) \ - -#define sc_frboo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_frenz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008052.bin", 0x0000, 0x100000, CRC(36b422b2) SHA1(1ee085393922b46588a604c5e88ad454357711bb) ) \ - -#define sc_ftopi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "frtsnd.bin", 0x0000, 0x0a6326, CRC(f718f2f0) SHA1(eccedf4eda8eda34633b917165e063d2fbb03abf) ) \ - -#define sc_ffru_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "ff_snd.bin", 0x0000, 0x0e54bf, CRC(9d1b711d) SHA1(29386915460b8be92fc5f79177efaf05b7f613cd) ) \ - ROM_LOAD( "ff_snd1.bin", 0x0000, 0x080000, CRC(3f0cb386) SHA1(a400177b1e3b986ba5ddfa5f549180b006ced5a2) ) \ - ROM_LOAD( "ff_snd2.bin", 0x0000, 0x080000, CRC(88d7cc1a) SHA1(7cb45ccc41f0c4a842595598f6f30b78e6c42480) ) \ - -#define sc_fever_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004239.sn1", 0x0000, 0x080000, CRC(12c4d8eb) SHA1(a404bce7eb1a1148cba4a4d8326ea36e31e881b4) ) \ - ROM_LOAD( "95004240.sn2", 0x0000, 0x080000, CRC(a990a2c4) SHA1(2630dc0408359f32d05ecfd5bcc81789854e5229) ) \ - ROM_LOAD( "95008137.bin", 0x0000, 0x100000, CRC(f74f3916) SHA1(659b160db41e46a53149688f8677e73a78f22e63) ) \ - ROM_LOAD( "95008138.bin", 0x0000, 0x100000, CRC(68563cdd) SHA1(df92dadecf9242bfa147e3134039266e9016faea) ) \ - -#define sc_fevnx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004318.sn1", 0x0000, 0x080000, CRC(bb5d74bd) SHA1(104dd8b2faedce3382533c755ca05d03ec2bc50a) ) \ - ROM_LOAD( "95004319.sn2", 0x0000, 0x080000, CRC(73dc297e) SHA1(a826e7d0b88b9e01ceab21a2a92f69f15b402acb) ) \ - -#define sc_fpitc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008091.bin", 0x0000, 0x100000, CRC(81a28437) SHA1(99b9e5c04c2ab7e9aba0b9b8a0bacee424a079de) ) \ - ROM_LOAD( "95008092.bin", 0x0000, 0x100000, CRC(0987737f) SHA1(bab6bf1ffd3df5465c87996795b1c25f5e863beb) ) \ - -#define sc_fcc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004103.lo", 0x000000, 0x080000, CRC(9926f103) SHA1(f29a0d25eebd0a0990cd165116b425b795ed62e0) ) \ - ROM_LOAD( "95004104.hi", 0x080000, 0x080000, CRC(bec75a23) SHA1(cdf895081ebf3afb52d5bfaab29f713800c85fc9) ) \ - \ - ROM_REGION( 0x400000, "other", ROMREGION_ERASE00 ) \ - ROM_LOAD( "club-firecracker_mtx_ass.bin", 0x0000, 0x010000, CRC(c23ffee9) SHA1(b4f2542e8ed0b282a439e523baa6cd43c5b2cb50) ) /* DMD01 */ \ - -#define sc_frsu_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004229.bin", 0x0000, 0x080000, CRC(fe94f724) SHA1(6cebd17d277f1fa88982158d5ac9422f6f16bc3b) ) \ - ROM_LOAD( "95004230.bin", 0x0000, 0x080000, CRC(4b0a6a18) SHA1(6df706b4431cc97318df612c9533c34085cd341d) ) \ - -#define sc_fullt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008449.bin", 0x0000, 0x0fde7d, CRC(9e3ce927) SHA1(00ce43a0ca94e81ac90f53c647e40ac6cb454937) ) \ - -#define sc_gcb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_greed_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008325.bin", 0x0000, 0x100000, CRC(82356c95) SHA1(bbf9dc2e4ca20a35a8bc581e322956e17f220022) ) \ - -#define sc_gslam_others \ - ROM_REGION( 0x200000, "ymz", 0 ) \ - ROM_LOAD( "95004169.bin", 0x000000, 0x080000, CRC(d2293b2f) SHA1(e3eed38a15885c5a6d63fc79d95f77c5225e9168) ) \ - ROM_LOAD( "95004170.bin", 0x080000, 0x080000, CRC(1da0db8f) SHA1(b3c37b5e02efe7267556d8603c362298ed55bb88) ) \ - -#define sc_heatw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004287.snd", 0x0000, 0x080000, CRC(7a86c853) SHA1(60a5582f43cda30e9c48a1207ee1a4cafdce0276) ) \ - -#define sc_helrd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004326.snd", 0x0000, 0x080000, CRC(193851ca) SHA1(de71622b6d50d039bd625189303191d316bdc671) ) \ - -#define sc_helrs_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004326.snd", 0x0000, 0x080000, CRC(193851ca) SHA1(de71622b6d50d039bd625189303191d316bdc671) ) \ - -#define sc_hdd_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_hi5_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008107.bin", 0x0000, 0x100000, CRC(f2b5a284) SHA1(c2b427aa59a233eedefff55d3afdc120f486af83) ) \ - ROM_LOAD( "95008108.bin", 0x0000, 0x100000, CRC(c8bd435d) SHA1(cc78030ae92424db3ba572f355d12db7f9291bd7) ) \ - -#define sc_sprng_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008276.bin", 0x0000, 0x0f7b99, CRC(e13380bd) SHA1(f4ec3f2d4d8f20e82324fda89e5383a9689bf02a) ) \ - -#define sc_hilo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008177.bin", 0x0000, 0x100000, CRC(4dad5ea3) SHA1(efa226af2bae5bab25deb3507a635412b0f031e8) ) \ - ROM_LOAD( "95008178.bin", 0x0000, 0x100000, CRC(3a59e427) SHA1(7d530426a57dd9651aef51730b0b8a5324f81024) ) \ - -#define sc_hitsh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008239.bin", 0x0000, 0x100000, CRC(cc12346b) SHA1(dd3656a3024c3d26348482c3aa04e0f6638053f7) ) \ - -#define sc_holyw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008071.bin", 0x0000, 0x100000, CRC(005c5847) SHA1(9d8a801e70f5b1c07d46a4f6e9fab22adf5a9415) ) \ - ROM_LOAD( "95008072.bin", 0x0000, 0x100000, CRC(78756706) SHA1(56b744ec5cb431b30c13bc748d323ebe14727546) ) \ - -#define sc_h6cl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008576.bin", 0x0000, 0x100000, CRC(15d77734) SHA1(db314df1dc558ce66d3c4d62895ab699d36bdf46) ) \ - -#define sc_hyde_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_hyper_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_hf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008163.bin", 0x0000, 0x100000, CRC(0d8abe3c) SHA1(e3dc45ca8aea3113c5884ae3af9216f627ce71ba) ) \ - -#define sc_hotpr_others \ - ROM_REGION( 0x800000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "hotpropertysnd1.bin", 0x0000, 0x100000, CRC(f06cb0f1) SHA1(856bdd31a35e93e6f52f88f2ac738cc3fab09c11) ) \ - ROM_LOAD( "hotpropertysnd2.bin", 0x0000, 0x100000, CRC(cce5a2a7) SHA1(4884e8abe2dde81f70ddc13a3a68d690fc097dae) ) \ - /* bad dumps of snd1? */ \ - ROM_LOAD( "95008015.lo", 0x00000, 0x800000, CRC(6553f5b9) SHA1(17ab5162f4fd3fa5a56641f0b1cbc31c0fe1a52c) ) \ - ROM_LOAD( "95008016.lo", 0x00000, 0x800000, CRC(6553f5b9) SHA1(17ab5162f4fd3fa5a56641f0b1cbc31c0fe1a52c) ) \ - /* more alternates, or are these Monopoly Hot Property? */ \ - ROM_LOAD( "hot_p.sn1", 0x0000, 0x080000, CRC(c918da0e) SHA1(7eebd41c70be65b1455bafd4087246f41a8b3622) ) \ - ROM_LOAD( "hot_p.sn2", 0x0000, 0x080000, CRC(31fa3827) SHA1(aa099bfda63d3627cab2b5f12fe0ec7d8600f90e) ) \ - -#define sc_ijclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008888.bin", 0x0000, 0x0fc30c, CRC(71ad9f31) SHA1(40d42bbe7e3d38cab48006a4f0d4d25d2b56a647) ) \ - ROM_REGION( 0x5000, "pics", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95891060.bin", 0x0000, 0x5000, CRC(791ebcf2) SHA1(88298c6d1eec718b84e51aae447ffd74493a27f4) ) \ - -#define sc_jack_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008289.bin", 0x0000, 0x0ffb45, CRC(76d2af0f) SHA1(0460ecc4f80cceb6861b8b0ebf59f0e87bf2b38c) ) \ - ROM_LOAD( "jack the kipper sound 1 maz fc64.bin", 0x0000, 0x100000, CRC(f31090f9) SHA1(4e9edfdf6472b4229d4393cb3033134f6b27920b) ) \ - -#define sc_jjunc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008284.bin", 0x0000, 0x100000, CRC(f90feeb8) SHA1(672abc79a88b2237fa584d12b9123a2baeec83b8) ) \ - -#define sc_jjucl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008395.bin", 0x0000, 0x100000, CRC(619865d6) SHA1(9e76267140709ae2ca09ea0866fc0b27b94d26af) ) \ - -#define sc_jiggn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004179", 0x0000, 0x080000, CRC(fd2521e8) SHA1(58027efa8110004fc4d823dc19d4de115a925711) ) \ - ROM_LOAD( "95004180", 0x0000, 0x080000, CRC(7750b004) SHA1(4c6cb7a5c4b69ca1d65b57271798ac17cd06ce61) ) \ - -#define sc_jiggr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_jive_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_jolly_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008254.bin", 0x0000, 0x0f9355, CRC(4742beac) SHA1(2f060a5f54719fdf5aea1077d8d5de6534b41f0c) ) \ - -#define sc_juicy_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008216.bin", 0x0000, 0x100000, CRC(1fcf52e3) SHA1(0e585678cb928e107343ebc64f77434ac6a62555) ) \ - ROM_LOAD( "95008217.bin", 0x0000, 0x100000, CRC(995f77f6) SHA1(ac964bc58490448cd3b5a1ed0c7636c2354c8c7d) ) \ - -#define sc_jbuck_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_jjc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_jjf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004085.lo", 0x000000, 0x080000, CRC(1b1f3455) SHA1(8733193640b907cf0aae3bc474dd4f1766c6e74c) ) \ - ROM_LOAD( "95004086.hi", 0x080000, 0x080000, CRC(5b678da4) SHA1(05c3760b35e77ea70401e47762dcbf0cc779ea3c) ) \ - -#define sc_kalei_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008444.bin", 0x0000, 0x0f8d34, CRC(a6a6c950) SHA1(97b9859a8795a5890156ce68f71b3f67707efdd2) ) \ - -#define sc_kkong_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_knok_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_lasv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004261.snd", 0x0000, 0x080000, CRC(a2fbd1f1) SHA1(7ae7108235f4b9758282506558054b056d92abed) ) \ - -#define sc_lined_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004241.bin", 0x0000, 0x080000, CRC(e524fd19) SHA1(af0bcf9cf75592beb928f78a915875f3e3ecedac) ) \ - ROM_LOAD( "95004242.bin", 0x0000, 0x080000, CRC(6d86611e) SHA1(2ec6a6745446502a77c10c487b75b59be1fc266e) ) \ - - -#define sc_ldcas_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_ldvcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008897.bin", 0x0000, 0x0ff4f6, CRC(3b459b50) SHA1(ba4aa9bcf42cd95f366fbe51c343680cd3fbcd47) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95891079.bin", 0x0000, 0x5000, CRC(378bb888) SHA1(054cdcad83a3909c8c17852f3848c7a7c4daae31) ) \ - -#define sc4lockb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008223.bin", 0x0000, 0x100000, CRC(1b938782) SHA1(501567017e5097c616b90623b16e503b5ab941fd) ) \ - -#define sc_lkbcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008285.bin", 0x0000, 0x100000, CRC(c6a5033b) SHA1(9c7abea9052f606dd501e359a4fc4b69860c5269) ) \ - -#define sc_lir_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008103.bin", 0x0000, 0x100000, CRC(74ec1e6c) SHA1(1636192a63afcb060ee9453d24d7deb3a6776f51) ) \ - ROM_LOAD( "95008104.bin", 0x0000, 0x100000, CRC(b11bd959) SHA1(1739035495a14fedcbc67b724e7595693425d15f) ) \ - -#define sc_miljo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004305.sn1", 0x0000, 0x080000, CRC(1fffefe8) SHA1(e4dd8ee3ac82c598b50fe49afeddf11bcca96581) ) \ - ROM_LOAD( "95004306.sn2", 0x0000, 0x080000, CRC(afc501d4) SHA1(9a28381a7c1c047d6e7bb70736d2c8308c8911a3) ) \ - -#define sc_milja_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004305.sn1", 0x0000, 0x080000, CRC(1fffefe8) SHA1(e4dd8ee3ac82c598b50fe49afeddf11bcca96581) ) \ - ROM_LOAD( "95004306.sn2", 0x0000, 0x080000, CRC(afc501d4) SHA1(9a28381a7c1c047d6e7bb70736d2c8308c8911a3) ) \ - -#define sc_mbags_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mgr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008212.bin", 0x0000, 0x100000, CRC(1d0fffb3) SHA1(da7e10479b1ba9e67af94feaa20702bae687168f) ) \ - ROM_LOAD( "snd_mgo.p1", 0x0000, 0x100000, CRC(b2f8dd11) SHA1(2db747a0c422d7dd18972f80ba94570c69564c9b) ) \ - -#define sc_mspid_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008278.bin", 0x0000, 0x100000, CRC(8fc20733) SHA1(6ede5578fa11cb3322291958d6e1ef8f6cd99da0) ) \ - -#define sc_msclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008191.bin", 0x0000, 0x100000, CRC(4d392e0c) SHA1(798ba07fdb0bebe5367f58b1e13226827153e0e8) ) \ - -#define sc_mtb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "mtb_snd1.bin", 0x0000, 0x080000, CRC(4abca575) SHA1(8f0e3fd169cbf0876368dac335bf81ab0601c923) ) \ - ROM_LOAD( "mtb_snd2.bin", 0x0000, 0x080000, CRC(034a49dc) SHA1(aac70d867856f13f5948e81ed3ca7f2746edf134) ) \ - -#define sc_mtbcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008009.lo", 0x00001, 0x100000, CRC(b9334137) SHA1(e7481688e18b56bddee4a2eff219f83ac5180082) ) \ - ROM_LOAD( "95008010.hi", 0x00000, 0x100000, CRC(cb197b7e) SHA1(56fb416a98bc2875df11024518babf4a07418a79) ) \ - -#define sc_m2m_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_magci_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008480.bin", 0x0000, 0x0c4846, CRC(025a1417) SHA1(6f522e71b4707829c98f77551f7cd4f2910f15b5) ) \ - -#define sc_magic_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008340.bin", 0x0000, 0x0ff5d7, CRC(1371b0d9) SHA1(aa8c23a86cbd5e8274bb035c1132da11d71fd2f8) ) \ - -#define sc_maxim_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008151.bin", 0x0000, 0x184af2, CRC(775d8471) SHA1(d784e25f52e6df18da9eabf93e6b50de5217c374) ) \ - -#define sc_maxcc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_monob_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008359.bin", 0x0000, 0x0e89fa, CRC(763e4367) SHA1(c44b70f8336c2d6c00cd0dde9b6ca014667c59a6) ) \ - ROM_LOAD( "monopoly95008359_sound1.bin", 0x0000, 0x100000, CRC(93f005f2) SHA1(d2351982d6352d9793efac617ac9fb9569f229c6) ) \ - -#define sc_monod_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mou_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008364.bin", 0x0000, 0x0e98ac, CRC(47aae23d) SHA1(0964a4f68c3688ebd65daf317b17e1341fcd3ceb) ) \ - -#define sc_nmtj_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008472.bin", 0x0000, 0x0fe798, CRC(a522157a) SHA1(f1fea963579cb8caddd5fcbfa36e33dc35c6e2a0) ) \ - -#define sc_mclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mdlx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008514.bin", 0x0000, 0x0ed840, CRC(2608cbde) SHA1(4831570fbc825592781e6473173d6ec911a0054d) ) \ - -#define sc_mwwcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_mont_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004314.bin", 0x0000, 0x0ccf04, CRC(0faba601) SHA1(1f21e39c2a9a18dd74292e68456c725ec2631aac) ) /* lotech sounds? */ \ - -#define sc_motor_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_nudit_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95404303.bin", 0x000000, 0x080000, CRC(adb71c93) SHA1(e91165b0280da9f79415b1cd7bb2ff8c1ea974fe) ) \ - ROM_LOAD( "95404304.bin", 0x080000, 0x080000, CRC(96190422) SHA1(0e3192d959f1ea4296474684f04847c50a983400) ) \ - -#define sc_pen1_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "pub-en.s1", 0x0000, 0x080000, CRC(7e3f4295) SHA1(b7a2c538d79663a3d21f89311195619158fa7197) ) /* need testing */ \ - ROM_LOAD( "pub-en.s2", 0x0000, 0x080000, CRC(637d3c0f) SHA1(193964efc28e56b05f39099a696dd3e9119b80dd) ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - ROM_LOAD( "pbemydot", 0x0000, 0x010000, CRC(b056d3d4) SHA1(6c1dbc6fcb4761c25f9cc8123e9f0fe791488c19) ) /* DMD rom? Possibly SC2 DM01 */ \ - -#define sc_oyf_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008301.bin", 0x0000, 0x100000, CRC(0e042883) SHA1(2e73e5a49bcc525edfddf56e0d4ef5137116eec2) ) \ - -#define sc_opses_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008211.bin", 0x0000, 0x100000, CRC(535fbad0) SHA1(25804a47e20dcfe364f49195da0ab057bce31266) ) \ - -#define sc_outlw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_party_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008113.bin", 0x0000, 0x100000, CRC(7e54f87c) SHA1(b64e4da7c088ba2f328d6adcfd0a3824d98a5f31) ) \ - ROM_LOAD( "95008114.bin", 0x0000, 0x100000, CRC(594fef43) SHA1(8549d372ffb0194823afc11992d8a16f6caed2ff) ) \ - -#define sc_paytm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004224.sn1", 0x0000, 0x080000, CRC(74382d29) SHA1(bd0323b7208e9b03e2d8468f7d4603fb4a3fe394) ) \ - ROM_LOAD( "95004225.sn2", 0x0000, 0x080000, CRC(23efa88d) SHA1(af52ec3dcb45a2ea26eaa273c783134402105168) ) \ - -#define sc_pgold_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004316.snd", 0x0000, 0x080000, CRC(94a9ec9c) SHA1(bab1a431e2857b9db9fa3f3ef28f150e19c4ae50) ) /* casino */ \ - ROM_LOAD( "95008141.bin", 0x0000, 0x100000, CRC(e1b214dc) SHA1(811f6ec42961496f8cd9fb3434ab6a07457ca61a) ) \ - ROM_LOAD( "95008142.bin", 0x0000, 0x100000, CRC(faa84d52) SHA1(f5139df5e9ff95fab3c01ac2b1aa44b1d939bf7a) ) \ - -#define sc_polic_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008327.bin", 0x0000, 0x0d24fe, CRC(767251af) SHA1(9cc9f4f2c6f6762a1929b845521549256e9b9f4f) ) \ - -#define sc_potsh_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008431.bin", 0x0000, 0x0ffeaf, CRC(400843fd) SHA1(35a0195b120e61c40e8f5e193b44f9fcb5b7d99d) ) \ - -#define sc_pogbl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008750.bin", 0x0000, 0x100000, CRC(25a94ab7) SHA1(9ee3a1acb2734a5663d925fa050c15d154f79678) ) \ - ROM_LOAD( "95008751.bin", 0x0000, 0x100000, CRC(53c97577) SHA1(5ec3868967073b4ed429fed943fbcd568a85b4f3) ) \ - -#define sc_pwrsg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008257.bin", 0x0000, 0x0dc608, CRC(ac648ab0) SHA1(58c919be129388ca9c34cad177520175ef08cfaa) ) \ - -#define sc_pwrbq_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_pir_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008264.bin", 0x0000, 0x100000, CRC(c3301cf1) SHA1(59e3c5c8ab7be1901800d493fe98e72dd24c181c) ) \ - -#define sc_ppclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008934.bin", 0x0000, 0x100000, CRC(87290522) SHA1(27deddd66b0ac9a0f4fe526f0eda7f6b2e73a8b6) ) \ - ROM_LOAD( "95008935.bin", 0x0000, 0x100000, CRC(7517053c) SHA1(d83019c52b8c78539359e9277864717c76fae0ce) ) \ - -#define sc_pipe_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "pipingsnd.bin", 0x0000, 0x0c50d9, CRC(ff240faa) SHA1(f0961b3207c0c8779479c773d1453ac4ff376bd2) ) \ - -#define sc_plumb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008430.bin", 0x0000, 0x0c690f, CRC(29059625) SHA1(4e46f794726b778e03f67ab3ec3cd4cb71be0b64) ) \ - -#define sc_pwcrz_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - - -#define sc_ibiza_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) - -#define sc_qmodo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "97000080.bin", 0x0000, 0x0ea2e7, CRC(060bf37a) SHA1(732fa84ed0145f931557e3fef66276370dde6884) ) \ - -#define sc_quidr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008269.bin", 0x0000, 0x0e5ee2, CRC(b61e664a) SHA1(9ee423015b5532cc4c06ddb76846800fa325074c) ) \ - -#define sc_quart_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_redad_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004266.snd", 0x0000, 0x080000, CRC(457fffbf) SHA1(ede2adc836ba4904cdf3d1ed825f9128c27b2b58) ) \ - -#define sc_redal_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004266.snd", 0x0000, 0x080000, CRC(457fffbf) SHA1(ede2adc836ba4904cdf3d1ed825f9128c27b2b58) ) \ - -#define sc_rio_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004309.snd", 0x0000, 0x080000, CRC(60eb25fc) SHA1(66f3ac8bc1be99eda07c71f63ebc818014ef7800) ) \ - -#define sc_rvlnx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004320.snd", 0x0000, 0x080000, CRC(b20c0557) SHA1(f61df4a80751571caf4d44add753b5477c13b7f0) ) \ - -#define sc_rvl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004259.sn1", 0x0000, 0x080000, CRC(c26ed994) SHA1(da336ab76c1c148906c734d7239b2b83a05ec083) ) \ - ROM_LOAD( "95004260.sn2", 0x0000, 0x080000, CRC(1a32d1bd) SHA1(e88ba7b8b353ea168a689e1d2be8c753a56f8f1d) ) \ - -#define sc_rogds_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008256.bin", 0x0000, 0x0fafa4, CRC(6d70436f) SHA1(adf7d18d9fcbb216ee461183951c1ab2972b8ef7) ) \ - -#define sc_rmo_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_royle_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008207.bin", 0x000000, 0x100000, CRC(269f845f) SHA1(eaddeaebdafd3f237b6af5c3539da407a6782210) ) \ - ROM_LOAD( "95008208.bin", 0x100000, 0x100000, CRC(07d4d9fa) SHA1(841fead29de19da0436f937614de50e1f07ebc8b) ) \ - -#define sc_rbank_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008233.bin", 0x000000, 0x100000, CRC(ebdb6017) SHA1(ca723483f6a7ae6512fa4abc4437c1f8eb606784) ) \ - ROM_LOAD( "95008234.bin", 0x100000, 0x100000, CRC(4b7ac02a) SHA1(29c51906e5ca1e0c9c70db86e3a24f08be06b7e0) ) \ - -#define sc_pstat_others \ - ROM_REGION( 0x100000, "ymz", 0 ) \ - ROM_LOAD( "95008294.bin", 0x0000, 0x0e410e, CRC(89e20874) SHA1(d6539d3051938d01c980360046e33c04e35a7929) ) \ - ROM_LOAD( "paystation_sound", 0x0000, 0x100000, CRC(0d87f9af) SHA1(7b00cbe3ba69f646fd692bfd6f002bd37801325e) ) \ - -#define sc_po8_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008416.bin", 0x0000, 0x0fe66d, CRC(9ae69b6a) SHA1(7bb94d7c941c64c1ea53e391b3f66a6e1b483417) ) \ - -#define sc_sidsp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008369.bin", 0x0000, 0x100000, CRC(76ea0074) SHA1(6cc4f320d8e331477569dfc7e961afd30a4ce7b2) ) \ - -#define sc_stl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "sk_t_lim.sn1", 0x0000, 0x080000, CRC(1b88bf7d) SHA1(76a8453fd2f8375030f69a3a569b45daceb3e4f7) ) /*Need testing*/ \ - ROM_LOAD( "sk_t_lim.sn2", 0x0000, 0x080000, CRC(b3ecf658) SHA1(bf4ce85a3662df6dacfa42e3b4f9dfd6bba43b24) ) \ - -#define sc_sbust_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008255.bin", 0x0000, 0x0d55db, CRC(feef5ac9) SHA1(83b7de3bd3a1fa3f5ae17f102cc54467d564740f) ) \ - -#define sc_strbr_others \ - ROM_REGION( 0x400000, "unk", ROMREGION_ERASE00 ) \ - /* this looks encrypted, or like samples.. I don't think it belongs here, check */ \ - ROM_LOAD16_BYTE( "sbar713.bin", 0x0000, 0x010000, CRC(c7e26d6e) SHA1(1e270d4f5de92083f54cc3fe246b2bc1d2f441b3) ) \ - ROM_LOAD16_BYTE( "sbar714.bin", 0x0000, 0x010000, CRC(57dbca5f) SHA1(22a6fcf1e11dd9ba2b3f73cd7520e2b4a740a893) ) \ - ROM_LOAD16_BYTE( "sbar715.bin", 0x0000, 0x010000, CRC(e9192085) SHA1(a030e81f54338bcb8667c59bad9a6b35a41bbd9f) ) \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004290.snd", 0x0000, 0x080000, CRC(488972c2) SHA1(4cd9bbb6df0fbaf9b8dd93294046c71c82bf4b5b) ) \ - -#define sc_strx_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008247.bin", 0x0000, 0x100000, CRC(0817596f) SHA1(250db171d1f7893883ffbcfdd3fd3f6e62524bdc) ) \ - -#define sc_s6c_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004095.p1", 0x000000, 0x080000, CRC(d9d7b876) SHA1(fdd9b5f07665b7b7edd198e00d3b005b32d1609c) ) \ - ROM_LOAD( "95004096.p1", 0x080000, 0x080000, CRC(fb8e103f) SHA1(fd8e2c8ae1e459f7426aa6b5de20f91dfae7bec9) ) \ - -#define sc_sdr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_slc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008412.bin", 0x0000, 0x100000, CRC(197edb63) SHA1(f1851029f6870d41d6aaf2df0a49fc54f5c79e4c) ) \ - -#define sc_sstep_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "97000120.bin", 0x0000, 0x080000, CRC(d887ca0a) SHA1(b1fd4633ca47fe1d99c9938af48768cd0cf451c6) ) \ - -#define sc_supst_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_solgl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008159.bin", 0x000000, 0x100000, CRC(e6ad55e4) SHA1(4bea205a9e6e2832cd06d0d5c96599f2a83f8fec) ) \ - ROM_LOAD( "95008160.bin", 0x100000, 0x100000, CRC(d52329ca) SHA1(e0feebe0d0ec13cd15cf4af1023246a1a3a9adc7) ) \ - -#define sc_slih_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "s_l_i_ho.snd", 0x0000, 0x080000, CRC(13abf434) SHA1(99d7a323c03448827d16bcfb4358c09ab691b500) ) \ - -#define sc_spark_others \ - ROM_REGION( 0x200000, "ymz", 0 ) \ - ROM_LOAD( "95008031.bin", 0x000000, 0x100000, CRC(445d3cf7) SHA1(ded74e46b4fb4ef405eb74027a63d301efce1f45) ) \ - ROM_LOAD( "95008032.bin", 0x100000, 0x0fd082, CRC(88781139) SHA1(e8e972032664c314f5263d7acb5a3f0769c7fb2a) ) \ - -#define sc_stirc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008117.bin", 0x0000, 0x197791, CRC(9d555ddf) SHA1(753b838fa7f64317b64fe0ae0ee7e6484f2a5af3) ) \ - -#define sc_suscl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008865.bin", 0x0000, 0x0f4505, CRC(8e375291) SHA1(d7563adf330023f4fe47c11eb9ef77d593c3eaab) ) \ - ROM_REGION( 0x5000, "pics", 0 ) \ - ROM_LOAD( "95890751.bin", 0x0000, 0x5000, CRC(57c944b0) SHA1(5f9aadffda6e83780e89c64315c8289a7d364ef6) ) /* does this belong with an sc5 set? */ \ - -#define sc_strk_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008492.bin", 0x0000, 0x0fa055, CRC(4f37c766) SHA1(352dc95bb1f0fe31db233ac731618acb3046681e) ) \ - -#define sc_taekw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008283.bin", 0x0000, 0x0fd772, CRC(59a3924c) SHA1(ceba9236db0b26eb79feabc9564eb6dec10c4ab9) ) \ - -#define sc_taknt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008273.bin", 0x0000, 0x100000, CRC(c8695859) SHA1(5998d1f3467e522d4fa5ad6cf75b86ae1760fdd6) ) \ - -#define sc_takcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008314.bin", 0x0000, 0x100000, CRC(64d2a26a) SHA1(f01944363e77bf33b44a06224e44828b065fdee4) ) \ - -#define sc_tbana_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008229.bin", 0x0000, 0x100000, CRC(003f9c3d) SHA1(38ea111096e84e77e727fb784992b525767f5b0c) ) \ - -#define sc_ticlb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004082.p1", 0x0000, 0x080000, CRC(b7caba0f) SHA1(777afdb6a2f78edad5f4df506eb4cd571f9f357b) ) \ - ROM_LOAD( "95004083.p2", 0x0000, 0x080000, CRC(c0cc21b7) SHA1(d0b22db4c1faeef34b794ac4c31bc9fd386493ea) ) \ - \ - ROM_REGION( 0x400000, "others", 0 ) \ - ROM_LOAD( "club-treasure-island_mtx_ass.bin", 0x0000, 0x010000, CRC(74f97b29) SHA1(9334bf1e4b4e2bcbbfaa5ae32201ceaab0641d83) ) /* DMD */ \ - -#define sc_tri7_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008308.bin", 0x0000, 0x100000, CRC(87a25bc3) SHA1(bf3d6b86f8f217131c33b681787f4a6fe84b8b8d) ) \ - -#define sc_tfclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008043.bin", 0x0000, 0x100000, CRC(b168cec4) SHA1(42b891ba918c7063420688c99dc72609801a1987) ) \ - ROM_LOAD( "95008044.bin", 0x0000, 0x100000, CRC(6074fa77) SHA1(1d4fa88a7ba2b020042ef3681e0f8eb732705d55) ) \ - -#define sc_ttp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004148.bin", 0x0000, 0x080000, CRC(6b352d5b) SHA1(b32f08828aad1c8cf0281faa387c9a1536fbd382) ) \ - -#define sc_lions_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004142.bin", 0x0000, 0x080000, CRC(aee399f7) SHA1(54c9683f2f3159122ef35855fe19380f1a2771ca) ) \ - -#define sc_tic2_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004231_1.bin", 0x0000, 0x080000, CRC(af1512be) SHA1(4196820fa06b5e09f7108894ca89fc43e4ac3da5) ) \ - ROM_LOAD( "95004232_2.bin", 0x0000, 0x080000, CRC(bddddec8) SHA1(3dd7dab9ad3e4475cd10c675bbc5a5fd28cf953e) ) \ - -#define sc_tgear_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008063.1", 0x0000, 0x100000, CRC(f87314dc) SHA1(00528243bd58e50ab24dde879f352feec2721019) ) \ - ROM_LOAD( "95008063.2", 0x0000, 0x100000, CRC(5d25d9e8) SHA1(a7f1abcf4bdb5ced2b414d43a13568d13ac334de) ) \ - -#define sc_tload_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008362.bin", 0x0000, 0x100000, CRC(fb14b937) SHA1(c8cbdda6184cc3d5b837a3cda105a39cf745bd4d) ) \ - -#define sc_trist_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008499.bin", 0x0000, 0x0efbd7, CRC(90710d1f) SHA1(923f6396941b713d3f55bb002c36b0e42063ae4d) ) \ - -#define sc_ttomb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008287.bin", 0x0000, 0x100000, CRC(9a3f47f9) SHA1(5844f3be0fe4febe04d924afc00f2f55273c15f1) ) \ - -#define sc_tridn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008335.bin", 0x0000, 0x0fd5ab, CRC(f0fed8d5) SHA1(dd974c70adfb9a5fb37a069eb736d5ef23b43ddf) ) \ - -#define sc_tub_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008164.bin", 0x0000, 0x100000, CRC(37fb6004) SHA1(d171223dd4a4162bfb1e63e4af26ea012a2de5ea) ) \ - -#define sc_twilt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004299.snd", 0x0000, 0x080000, CRC(f4837e10) SHA1(78c4455b1585ca60ed15734dac517f5f1ef4d237) ) \ - -#define sc_ufg_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004167.bin", 0x0000, 0x080000, CRC(9dcd31cc) SHA1(2ce9e167debbc2315b4be964116fdc35e19b6046) ) \ - -#define sc_ufi_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - - -#define sc_valnv_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "sound1.bin", 0x0000, 0x080000, CRC(cedee498) SHA1(311ab99746cff8f72ec8ffb9ac386a713fc300dd) ) \ - ROM_LOAD( "sound2.bin", 0x0000, 0x080000, CRC(0994b7bb) SHA1(ad79998467fee8fd95c944ea6a33450fcf6d3d56) ) \ - -#define sc_valqp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004296.sn1", 0x0000, 0x080000, CRC(aecc8138) SHA1(64fd18666c2c753899bff971227b9358c2bf22f1) ) \ - ROM_LOAD( "95004297.sn2", 0x0000, 0x080000, CRC(2c8b698b) SHA1(7b8dd1f2215579b5ad69a2a1f11bfcd04e3d07f9) ) \ - -#define sc_wadzl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wernr_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "gw_snd_1.8mb", 0x0000, 0x100000, CRC(990a3471) SHA1(356120558681440cac8252223c31fb9eca2572db) ) \ - ROM_LOAD( "gw_snd_2.8mb", 0x0000, 0x100000, CRC(468431e6) SHA1(90e8dd52b1ce752672b0a02d3cb7715cfa3fb49d) ) \ - -#define sc_wrnlt_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_waw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004292.bin", 0x0000, 0x17ba49, CRC(a5a03ead) SHA1(f1319d0e254b980262e3d404410e6ddbf18057b6) ) \ - \ - ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 )/*no alarm sound, is this right */ \ - ROM_LOAD( "wetsnd1", 0x0000, 0x080000, CRC(5fb985b3) SHA1(19f85535b5082546a6098a751a2e2244ed4373ec) ) \ - -#define sc_wdw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_winsp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008504.bin", 0x0000, 0x0bd369, CRC(c27f88ca) SHA1(bfc34cc433b68dc6377af7ee464cbdb74a6e0e8d) ) \ - -#define sc_wag_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wldbn_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wthng_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wthnm_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wtc_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_wspin_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008516.bin", 0x0000, 0x0c35e4, CRC(b8deeea9) SHA1(5bc5f96e5f1b994448d90f05eea2e1c01e17ab66) ) \ - -#define sc_wwys_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008277.bin", 0x0000, 0x100000, CRC(19051eb6) SHA1(accc9b452dd80e6ca40e79dcc7d4fc6d4f234243) ) \ - -#define sc_winxp_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004265.snd", 0x0000, 0x080000, CRC(1e3e761d) SHA1(81c1e1af72836b25a053cf62c52341a0f8837e3e) ) \ - -#define sc_wondw_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008330.bin", 0x0000, 0x100000, CRC(15e80096) SHA1(da02a8afc83400fdf1ead9dad8a461eb9e911586) ) \ - -#define sc_xmark_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008263.bin", 0x0000, 0x100000, CRC(43507f43) SHA1(a5eb9e142847a338bf18f4b26da7fe5a2807a027) ) \ - -#define sc_xcash_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95004321.snd", 0x0000, 0x080000, CRC(97682381) SHA1(b1ef910e7b2e3574576fb6583a088c3de61e6019) ) \ - -#define sc4s16_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_bgold_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_blokq_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - -#define sc_clbtm_others \ - ROM_REGION( 0x800000, "ymz", ROMREGION_ERASE00 ) \ - /* very large sound roms! */ \ - ROM_LOAD( "95008055.p1", 0x0000, 0x800000, CRC(ef474fd3) SHA1(e7427184683603b57a3a8b37452fa6ec7a41e34c) ) \ - ROM_LOAD( "95008056.p2", 0x0000, 0x800000, CRC(39b1b566) SHA1(937ec27964124b92b75d4b37d09a35585baa68c6) ) \ - \ - ROM_LOAD( "95008055.bin", 0x0000, 0x100000, CRC(df9ae6e3) SHA1(5766cb1749aa92c34a76270a641f7a9302cc44d7) ) \ - \ - ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ - /* dot matrix roms? */ \ - ROM_LOAD( "club-temptation_mtx_(ihex)ss.hex", 0x0000, 0x01d0da, CRC(08ebee96) SHA1(2e87d734c966abab1d4a59c9481ebea161f77286) ) \ - ROM_LOAD( "clubtempdot.bin", 0x0000, 0x010000, CRC(283d2d9c) SHA1(5b76a13ad674f8a40c270e5dbc61dac04d411d02) ) /* DM01 */ \ - ROM_LOAD( "95717692a.bin", 0x0000, 0x008000, CRC(f9fe7b9a) SHA1(0e3fe5da9fc837726d08f02a2c6ed782f016c982) ) /* is this something else? sc1/2? */ \ - -#define sc_dcrls_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008482.bin", 0x0000, 0x04c048, CRC(e0b13788) SHA1(e364ccedd31e1fe0560312a28ad6d5cfaac5bfaa) ) \ - -#define sc_gcclb_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - /* this is intel hex format - convert */ \ - ROM_LOAD( "95004252.bin", 0x0000, 0x134084, CRC(b05844f8) SHA1(e2a2f3ad69cc9a66ca703e9e07ac008300d4139d) ) \ - ROM_LOAD( "95004253.bin", 0x0000, 0x134084, CRC(a546da40) SHA1(fead6e4f8dab919f65c48cf04100a7742432b1f4) ) \ - -#define sc_onup_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008298.bin", 0x0000, 0x100000, CRC(6dcdcbfa) SHA1(1742f54ddd74d7513e8efb8cecfff574263c65df) ) \ - -#define sc_phgcl_others \ - ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ - ROM_LOAD( "95008475.bin", 0x0000, 0x100000, CRC(30f77b7e) SHA1(bbb16020f33c8440344670beec8b13dd554be858) ) \ - - - - - - diff -Nru mame-0.144/src/mame/drivers/bfm_sc4.c mame-0.145/src/mame/drivers/bfm_sc4.c --- mame-0.144/src/mame/drivers/bfm_sc4.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_sc4.c 2012-02-06 21:30:34.000000000 +0000 @@ -44,28 +44,48 @@ ------------------------------- */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" -#include "bfm_sc45.h" +#include "includes/bfm_sc45.h" class sc4_state : public driver_device { public: sc4_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; +class sc4_adder4_state : public sc4_state +{ +public: + sc4_adder4_state(const machine_config &mconfig, device_type type, const char *tag) + : sc4_state(mconfig, type, tag), + m_adder4cpu(*this, "adder4") + { } -static ADDRESS_MAP_START( sc4_map, AS_PROGRAM, 16 ) - AM_RANGE(0x0000000, 0x2fffff) AM_ROM - AM_RANGE(0x0000000, 0x80ffff) AM_RAM +protected: + // devices + required_device m_adder4cpu; +}; + +static ADDRESS_MAP_START( sc4_map, AS_PROGRAM, 16, sc4_state ) + AM_RANGE(0x0000000, 0x2fffff) AM_ROM + AM_RANGE(0x0000000, 0x80ffff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( sc4_addre4_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( sc4_adder4_map, AS_PROGRAM, 32, sc4_adder4_state ) AM_RANGE(0x000000, 0x2fffff) AM_ROM ADDRESS_MAP_END @@ -83,11 +103,12 @@ MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( sc4_adder4, sc4 ) +static MACHINE_CONFIG_DERIVED_CLASS( sc4_adder4, sc4, sc4_adder4_state ) MCFG_CPU_ADD("adder4", M68340, 25175000) // 68340 (CPU32 core) - MCFG_CPU_PROGRAM_MAP(sc4_addre4_map) + MCFG_CPU_PROGRAM_MAP(sc4_adder4_map) MACHINE_CONFIG_END + ROM_START( sc4tst ) ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "ftu_sc4_testrig.hi", 0x00000, 0x080000, CRC(dacba04e) SHA1(fb96c790600f55769ddff4868d10b431d07777a4) ) @@ -22717,4257 +22738,4255 @@ /* Scorpion 4 */ -GAME( 200?, sc4tst ,0, sc4, sc4, sc4, ROT0, "BFM","Scorpion 4 Test Rig (Bellfruit) (Scorpion ?)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tst ,0, sc4, sc4, sc4, ROT0, "BFM","Scorpion 4 Test Rig (Bellfruit) (Scorpion ?)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV2.0 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstat ,0, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatb ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstat ,0, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatb ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV2.1 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstata ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatc ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstata ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatc ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV2.2 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstatd ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.2) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstatd ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.2) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV2.3 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstate ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.3) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstate ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V2.3) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV4.0 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstath ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatm ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstath ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatm ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V4.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV011 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstatf ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstati ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstatf ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstati ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATION 012 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstatn ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatp ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstatn ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatp ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATIONV041 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstatg ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatj ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstatg ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatj ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2516 PAYSTATION 042 PAYSTATIONSND PAYSTATION -GAME( 200?, sc4pstato ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pstatq ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pstato ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pstatq ,sc4pstat, sc4, sc4, sc4, ROT0, "QPS","Paystation (V042) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2052 CASHLVANIA VANIASND CASH'!'VANIA -GAME( 200?, sc4cvani ,0, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvania ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanib ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanic ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanid ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanie ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanif ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanig ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanih ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvanii ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cvani ,0, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvania ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanib ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanic ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanid ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanie ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanif ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanig ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanih ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvanii ,sc4cvani, sc4, sc4, sc4, ROT0, "QPS","Cashvania (Qps) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUBCASHLVANIA V1.0 CLUBVANIASND CLUB CASH!VANIA -GAME( 200?, sc4cvclb ,0, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvclba ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvclbc ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvclbd ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cvclb ,0, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvclba ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvclbc ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvclbd ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUBCASHLVANIA V2.0 CLUBVANIASND CLUB CASH!VANIA -GAME( 200?, sc4cvclbb ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvclbe ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cvclbb ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvclbe ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUBCASHLVANIA 411 CLUBVANIASND CLUB CASH!VANIA -GAME( 200?, sc4cvclbf ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cvclbg ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cvclbf ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cvclbg ,sc4cvclb, sc4, sc4, sc4, ROT0, "QPS","Cashvania Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6912 SOUTH PARK PR6912 SOUTH PARK SOUNDS11 SOUTH PARK -GAME( 200?, sc4spark ,0, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sparka ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sparkb ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sparkc ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sparkd ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sparke ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4spark ,0, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sparka ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sparkb ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sparkc ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sparkd ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sparke ,sc4spark, sc4, sc4, sc4, ROT0, "BFM","South Park (BFM) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR6910 BIG BREAKFAST PR6910 BRKF SOUNDS11 BIG BREAKFAST -GAME( 200?, sc4brkfs ,0, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brkfsa ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brkfsb ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brkfsc ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4brkfs ,0, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brkfsa ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brkfsb ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brkfsc ,sc4brkfs, sc4, sc4, sc4, ROT0, "BFM","The Big Breakfast (BFM) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6934 GRAND SLAM PR6934 SLM2 SOUNDS11 GRAND SLAM -GAME( 200?, sc4gslam ,0, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslama ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslamb ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslamc ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslamd ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslame ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gslamf ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gslam ,0, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslama ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslamb ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslamc ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslamd ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslame ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gslamf ,sc4gslam, sc4, sc4, sc4, ROT0, "BFM","Grandslam Club (BFM) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR1227 4PLAY ART13 95004313 4PLAY PR1227 -GAME( 200?, sc4ivply ,0, sc4, sc4, sc4, ROT0, "BFM","4 Play (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ivply ,0, sc4, sc4, sc4, ROT0, "BFM","4 Play (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2540 ABRACADABRA ABRA SOUNDS ABRACADABRA -GAME( 200?, sc4abra ,0, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4abraa ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4abrab ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4abrac ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4abrad ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4abrae ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4abra ,0, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4abraa ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4abrab ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4abrac ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4abrad ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4abrae ,sc4abra, sc4, sc4, sc4, ROT0, "Qps","Abracadabra (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2070 ACES HIGH ACEHI SOUNDS ACES HIGH -GAME( 200?, sc4acesh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4acesha ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4aceshb ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4aceshc ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4acesh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4acesha ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4aceshb ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4aceshc ,sc4acesh, sc4, sc4, sc4, ROT0, "Mazooma","Aces High (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2118 ADRENALIN COTL SOUNDS ADRENALIN -GAME( 200?, sc4adren ,0, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adrena ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adrenb ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adrenc ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4adren ,0, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adrena ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adrenb ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adrenc ,sc4adren, sc4, sc4, sc4, ROT0, "Mazooma","Adrenalin (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7068 ALADDIN'S CAVE CAVE SOUNDS -GAME( 200?, sc4alad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4alada ,sc4alad, sc4, sc4, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4alad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4alada ,sc4alad, sc4, sc4, sc4, ROT0, "Mazooma","Aladdin's Cave (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2154 CLUB AROUND BOAR CLB AROUND BOARD CLUB AROU SOUNDS -GAME( 200?, sc4a40cl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40cla ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40clb ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40clc ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4a40cl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40cla ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40clb ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40clc ,sc4a40cl, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1225 AZTEC CASINO -GAME( 200?, sc4aztec ,0, sc4, sc4, sc4, ROT0, "BFM","Aztec (Casino) (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4aztec ,0, sc4, sc4, sc4, ROT0, "BFM","Aztec (Casino) (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1215 AZTEC EURO -GAME( 200?, sc4azteca ,sc4aztec, sc4, sc4, sc4, ROT0, "BFM","Aztec (Euro) (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4azteca ,sc4aztec, sc4, sc4, sc4, ROT0, "BFM","Aztec (Euro) (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2538 BACK OF THE NET V011 BACKOFTHENETSND BACK OF THE NET -GAME( 200?, sc4botn ,0, sc4, sc4, sc4, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4botna ,sc4botn, sc4, sc4, sc4, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4botn ,0, sc4, sc4, sc4, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4botna ,sc4botn, sc4, sc4, sc4, ROT0, "Qps","Back Of The Net (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2034 BANK ROLL ROL SOUNDS BANK ROLL -GAME( 200?, sc4broll ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brolla ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brollb ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brollc ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4broll ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brolla ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brollb ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brollc ,sc4broll, sc4, sc4, sc4, ROT0, "Mazooma","Bank Roll (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR???? BANKETYBANK V1.0 BANKETYBANKSND BANKETY BANK -GAME( 200?, sc4bankb ,0, sc4, sc4, sc4, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bankba ,sc4bankb, sc4, sc4, sc4, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bankb ,0, sc4, sc4, sc4, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bankba ,sc4bankb, sc4, sc4, sc4, ROT0, "Qps","Bankety Bank (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2094 BEDAZZLED BEDZ SOUNDS BEDAZZLED -GAME( 200?, sc4bed ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4beda ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedb ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedc ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedd ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bede ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bed ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4beda ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedb ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedc ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedd ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bede ,sc4bed, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2102 CLUB BEDAZZLED CBED SOUNDS CLUB BEDAZZLED -GAME( 200?, sc4bedcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bedcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2102 CLUB BEDAZZLED CLUB BEDAZZLED CLUB CBED SOUNDS CLUB BEDAZZLED -GAME( 200?, sc4bedcla ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedclb ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedclc ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bedcld ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bedcla ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedclb ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedclc ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bedcld ,sc4bedcl, sc4, sc4, sc4, ROT0, "Mazooma","Bedazzled Club (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2083 BIG BLASTER BBST SOUNDS BIG BLASTER -GAME( 200?, sc4bblas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblasa ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblasb ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblasc ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblasd ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblase ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bblasf ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bblas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblasa ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblasb ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblasc ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblasd ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblase ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bblasf ,sc4bblas, sc4, sc4, sc4, ROT0, "Mazooma","Big Blaster (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR2501 BIG DEAL BIGDEALSND BIG DEAL -GAME( 200?, sc4bigdl ,0, sc4, sc4, sc4, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bigdla ,sc4bigdl, sc4, sc4, sc4, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bigdl ,0, sc4, sc4, sc4, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bigdla ,sc4bigdl, sc4, sc4, sc4, ROT0, "Qps","Big Deal (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR21xx BINGO BELLE SSPT SOUNDS BINGO BELLE -GAME( 200?, sc4bingb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bingba ,sc4bingb, sc4, sc4, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bingb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bingba ,sc4bingb, sc4, sc4, sc4, ROT0, "Mazooma","Bingo Belle (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? BANKETYBANK 011 BANKETYBANKSND BANKETY BANK -GAME( 200?, sc4bb ,0, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bba ,sc4bb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bb ,0, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bba ,sc4bb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUB BANKETY BANK VER1.0 CLUBBANKSND CLUB BANKETYBANK -GAME( 200?, sc4bbclb ,0, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V1.0) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bbclb ,0, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V1.0) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUB BANKETY BANK VER1.1 CLUBBANKSND CLUB BANKETYBANK -GAME( 200?, sc4bbclba ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V1.1) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bbclba ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V1.1) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX CLUB BANKETY BANK 411 CLUBBANKSND CLUB BANKETYBANK -GAME( 200?, sc4bbclbb ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bbclbc ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bbclbb ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bbclbc ,sc4bbclb, sc4, sc4, sc4, ROT0, "Qps","Blankety Bank Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2539 BLAST OFF011 ROCKETSCIENCESND BLAST OFF -GAME( 200?, sc4blast ,0, sc4, sc4, sc4, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blastb ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4blast ,0, sc4, sc4, sc4, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blastb ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2539 BLAST OFF041 ROCKETSCIENCESND BLAST OFF -GAME( 200?, sc4blasta ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blastc ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4blasta ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blastc ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2539 BLAST OFF 042 ROCKETSCIENCESND BLAST OFF -GAME( 200?, sc4blastd ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blaste ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4blastd ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blaste ,sc4blast, sc4, sc4, sc4, ROT0, "Qps","Blast Off (042) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7011 BLUE RINSE BRINSE SOUNDS -GAME( 200?, sc4blue ,0, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bluea ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blueb ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bluec ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blued ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bluee ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4blue ,0, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bluea ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blueb ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bluec ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blued ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bluee ,sc4blue, sc4, sc4, sc4, ROT0, "Mazooma","Blue Rinse (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2298 CLUB BOBBY DAZZLER CLUB BOB DAZZLER CLUB CLUBBOBD SOUNDS -GAME( 200?, sc4bobcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobcla ,sc4bobcl, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bobcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobcla ,sc4bobcl, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7036GOLDEN X GOLDEN X ARCADE BARX SOUNDS GOLDEN X -GAME( 200?, sc4bonbx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxc ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxd ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxe ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxf ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bonbx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxc ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxd ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxe ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxf ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR7036GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4bonbxa ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxb ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxg ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxh ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxi ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxj ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxk ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bonbxl ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bonbxa ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxb ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxg ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxh ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxi ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxj ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxk ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bonbxl ,sc4bonbx, sc4, sc4, sc4, ROT0, "Mazooma","Bonus Bar X (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) // PR2033 BREAK THE SPELL SPELL SOUNDS BREAK THE SPELL -GAME( 200?, sc4brksp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brkspa ,sc4brksp, sc4, sc4, sc4, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4brksp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brkspa ,sc4brksp, sc4, sc4, sc4, ROT0, "Mazooma","Break The Spell (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2023.GERMAN BRIX...........PR2023,German BRIX,......PR2023 SOUNDS V1 (non-standard header) -GAME( 200?, sc4brix ,0, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brixa ,sc4brix, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4brixb ,sc4brix, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4brix ,0, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brixa ,sc4brix, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4brixb ,sc4brix, sc4, sc4, sc4, ROT0, "Nova","Brix (German) (Nova) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR7109 BUGS MONEY PR7109 BUGS MONEY SOUNDS11 BUGS MONEY -GAME( 200?, sc4bugs ,0, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bugsa ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bugsb ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bugsc ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bugs ,0, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bugsa ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bugsb ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bugsc ,sc4bugs, sc4, sc4, sc4, ROT0, "BFM","Bugs Money (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1753 CLUB BULLSEYE BULLSEYE CLUB PR1751 BULLSEYE SOUNDS11 BULLSYE -GAME( 200?, sc4bulcl ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcla ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulclb ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulclc ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcld ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcle ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulclf ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulclg ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulclh ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcli ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bulcl ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcla ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulclb ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulclc ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcld ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcle ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulclf ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulclg ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulclh ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcli ,sc4bulcl, sc4, sc4, sc4, ROT0, "BFM","Bullseye Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR7017CASINO CAN CAN CASH PR7017,Casino CAN CAN CASH, LINE SOUNDS CAN CAN CASH -GAME( 200?, sc4canca ,0, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cancaa ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cancab ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cancac ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4canca ,0, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cancaa ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cancab ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cancac ,sc4canca, sc4, sc4, sc4, ROT0, "Mazooma","Can Can Cash Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2013 CAPTAIN CASH CCASH SOUNDS CAPTAIN CASH -GAME( 200?, sc4captn ,0, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4captnb ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4captnc ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4captn ,0, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4captnb ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4captnc ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR9999 CAPTAIN CASH CCASH SOUNDS CAPTAIN CASH (invalid project number) -GAME( 200?, sc4captna ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4captnd ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4captne ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4captnf ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4captna ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4captnd ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4captne ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4captnf ,sc4captn, sc4, sc4, sc4, ROT0, "Qps","Captain Cash (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR1113 CARRY ON WINNING PR1113 CARRY ON WINNING SOUNDS11 -GAME( 200?, sc4carry ,0, sc4, sc4, sc4, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4carrya ,sc4carry, sc4, sc4, sc4, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4carry ,0, sc4, sc4, sc4, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4carrya ,sc4carry, sc4, sc4, sc4, ROT0, "BFM","Carry On Winning (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2534 CASH AND MOUSE V041 CASHANDMOUSESND CASH AND MOUSE -GAME( 200?, sc4cmous ,0, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cmousb ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cmous ,0, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cmousb ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2534 CASH AND MOUSE V011 CASHANDMOUSESND CASH AND MOUSE -GAME( 200?, sc4cmousa ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cmousc ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cmousa ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cmousc ,sc4cmous, sc4, sc4, sc4, ROT0, "Qps","Cash & Mouse (V011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6911 HOT PROPERTY PR6911 HOT PROPERTY SOUNDS11 $$ CASH 'N' BURN -GAME( 200?, sc4cburn ,0, sc4, sc4, sc4, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cburn ,0, sc4, sc4, sc4, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR6911 HOT PROPERTY V4.0 PR6911 HOT PROPERTY SOUNDS11 $ CASH 'N' BURN -GAME( 200?, sc4cburna ,sc4cburn, sc4, sc4, sc4, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cburna ,sc4cburn, sc4, sc4, sc4, ROT0, "Qps","Cash 'n' Burn (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6815 CASH N FRUIT PR6815 CASH N FRUIT SOUNDS11 -GAME( 200?, sc4cnfr ,0, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfra ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfrb ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfre ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfrf ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfrg ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cnfr ,0, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfra ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfrb ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfre ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfrf ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfrg ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR4615 CASH N FRUIT S+P98 PR6815 CASH N FRUIT SOUNDS11 -GAME( 200?, sc4cnfrc ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfrd ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfrh ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cnfri ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cnfrc ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfrd ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfrh ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cnfri ,sc4cnfr, sc4, sc4, sc4, ROT0, "BFM","Cash 'n' Fruit S+P98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER V1.0 CASHADDERSND CASH ADDER -GAME( 200?, sc4cad ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cada ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadf ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadg ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cad ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cada ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadf ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadg ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 011 CASHADDERSND CASH ADDER -GAME( 200?, sc4cadb ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadh ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadb ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadh ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 041 CASHADDERSND CASH ADDER -GAME( 200?, sc4cadc ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadi ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadc ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadi ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 012 CASHADDERSND CASH ADDER -GAME( 200?, sc4cadd ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadj ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadd ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadj ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 042 CASHADDERSND CASH ADDER -GAME( 200?, sc4cade ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadk ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cade ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadk ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V042) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 013 CASHADDERSND CASH ADDER -GAME( 200?, sc4cadl ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadm ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadl ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadm ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V013) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 014 CASHADDERSND CASH ADDER -GAME( 200?, sc4cadn ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadp ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadn ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadp ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V014) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2528 CASH ADDER 043 CASHADDERSND CASH ADDER -GAME( 200?, sc4cado ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadq ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cado ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadq ,sc4cad, sc4, sc4, sc4, ROT0, "Qps","Cash Adder (V043) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PRXXXX QPS155 CLUB CASH ADDER Version 411 CLUBCASHADDERSND CLUB CASH ADDER -GAME( 200?, sc4cadcl ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cadcla ,sc4cadcl, sc4, sc4, sc4, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cadcl ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cadcla ,sc4cadcl, sc4, sc4, sc4, ROT0, "Qps","Cash Adder Club (411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1349 CLUB CASH BAZAAR PR1349 CLUB CASH BAZAAR SOUNDS11 -GAME( 200?, sc4cbaz ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbaza ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazb ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazc ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazd ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbaze ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazf ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazg ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazh ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazi ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cbaz ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbaza ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazb ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazc ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazd ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbaze ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazf ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazg ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazh ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazi ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1349 CLUB CASH BAZAAR CLUB CASH BAZAAR CLUB PR1349 CLUB CASH BAZAAR SOUNDS11 -GAME( 200?, sc4cbazj ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cbazk ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cbazj ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cbazk ,sc4cbaz, sc4, sc4, sc4, ROT0, "BFM","Cash Bazaar Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR7038 CASH CONNEXION MTOM SOUNDS -GAME( 200?, sc4cconx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cconxa ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cconxb ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cconxc ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cconxd ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cconx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cconxa ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cconxb ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cconxc ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cconxd ,sc4cconx, sc4, sc4, sc4, ROT0, "Mazooma","Cash Connexion (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2006 CASH CRUSADERS CASH SOUNDS CASH CRUSADERS -GAME( 200?, sc4ccrus ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ccrusa ,sc4ccrus, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ccrusb ,sc4ccrus, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ccrus ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ccrusa ,sc4ccrus, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ccrusb ,sc4ccrus, sc4, sc4, sc4, ROT0, "Mazooma","Cash Crusaders (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2020 CASH ERUPTION ERUP SOUNDS CASH ERUPTION -GAME( 200?, sc4cerup ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Eruption (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cerup ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Eruption (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2076 CASH EXPLOSION CEXP SOUNDS CASH EXPLSION -GAME( 200?, sc4cexpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexpla ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexplb ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexplc ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexplf ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexplg ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cexpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexpla ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexplb ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexplc ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexplf ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexplg ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2076) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2120 CASH EXPLOSION CEXP SOUNDS CASH EXPLSION -GAME( 200?, sc4cexpld ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cexple ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cexpld ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cexple ,sc4cexpl, sc4, sc4, sc4, ROT0, "Mazooma","Cash Explosion (PR2120) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7108 CASH IN HAND PR7108 CASH IN HAND SOUNDS11 CASH IN HAND -GAME( 200?, sc4chand ,0, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chanda ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chandb ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chandc ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chand ,0, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chanda ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chandb ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chandc ,sc4chand, sc4, sc4, sc4, ROT0, "BFM","Cash In Hand (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6809 CASHINVADERS PR6809 CASHINVADERS SOUNDS -GAME( 200?, sc4cinv ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinva ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvb ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvc ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvd ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinve ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvf ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvg ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvh ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cinvi ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cinv ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinva ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvb ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvc ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvd ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinve ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvf ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvg ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvh ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cinvi ,sc4cinv, sc4, sc4, sc4, ROT0, "BFM","Cash Invaders (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2118 CASH ON THE LASH COTL SOUNDS CASH ON THE LASH -GAME( 200?, sc4clash ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clasha ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashb ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashc ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashd ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashe ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashf ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clashg ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clash ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clasha ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashb ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashc ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashd ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashe ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashf ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clashg ,sc4clash, sc4, sc4, sc4, ROT0, "Mazooma","Cash On The Lash (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2061 CASHRAKER RAKERSND CASHRAKER -GAME( 200?, sc4cr ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cra ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crb ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cr ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cra ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crb ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2061 CASHRAKER V2.1 RAKERSND CASHRAKER -GAME( 200?, sc4crc ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cre ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crc ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cre ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2061 CASHRAKER V2.2 RAKERSND CASHRAKER -GAME( 200?, sc4crd ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crf ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crd ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crf ,sc4cr, sc4, sc4, sc4, ROT0, "Qps","Cash Raker (V2.2) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB CASHRAKER V1.0 CLUBRAKERSND CLUB CASHRAKER -GAME( 200?, sc4crcl ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crclb ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcl ,0, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crclb ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB CASHRAKER V1.1 CLUBRAKERSND CLUB CASHRAKER -GAME( 200?, sc4crcla ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crclc ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcla ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crclc ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB CASHRAKER V1.3 CLUBRAKERSND CLUB CASHRAKER -GAME( 200?, sc4crcld ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.3) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcld ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (V1.3) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB CASHRAKER 411 CLUBRAKERSND CLUB CASHRAKER -GAME( 200?, sc4crcle ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crclf ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcle ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crclf ,sc4crcl, sc4, sc4, sc4, ROT0, "Qps","Cash Raker Club (411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2038E Dutch12 Cashanova (not a standard string) -GAME( 200?, sc4cashn ,0, sc4, sc4, sc4, ROT0, "Mazooma / Eurocoin","Cashanova (Dutch) (Mazooma / Eurocoin) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cashn ,0, sc4, sc4, sc4, ROT0, "Mazooma / Eurocoin","Cashanova (Dutch) (Mazooma / Eurocoin) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2022 GERMAN CASHANOVA (not a standard string) -GAME( 200?, sc4cashg ,0, sc4, sc4, sc4, ROT0, "Mazooma / Nova","Cashanova (German) (Mazooma / Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cashg ,0, sc4, sc4, sc4, ROT0, "Mazooma / Nova","Cashanova (German) (Mazooma / Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2008 CASHANOVA CASH SOUNDS -GAME( 200?, sc4cashm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cashma ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cashmb ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cashmc ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cashmd ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cashme ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cashm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cashma ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cashmb ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cashmc ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cashmd ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cashme ,sc4cashm, sc4, sc4, sc4, ROT0, "Mazooma","Cashanova (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1426 CASINO CRAZY FRUITS GOLD PR1426 CRAZY F GOLD SOUNDS11 CRAZY FRUIT GOLD S.SITE (set was marked as Casino Crazy Keys) -GAME( 200?, sc4cckey ,0, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeya ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyb ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyc ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyd ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeye ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyf ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyg ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyh ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyi ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyj ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cckeyk ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cckey ,0, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeya ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyb ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyc ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyd ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeye ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyf ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyg ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyh ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyi ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyj ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cckeyk ,sc4cckey, sc4, sc4, sc4, ROT0, "BFM","Casino Crazy Fruits Gold (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR2360 CASINO KING X BARKX SOUNDS 8 KING X -GAME( 200?, sc4ckx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxd ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ckx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxd ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2360 CASINO KING X KING X MAZ BARKX SOUNDS KING X 3P -GAME( 200?, sc4ckxa ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxb ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxc ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxe ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxf ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ckxg ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ckxa ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxb ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxc ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxe ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxf ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ckxg ,sc4ckx, sc4, sc4, sc4, ROT0, "Mazooma","Casino King X (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2062 CASINO ROYALE CROY SOUNDS CASINO ROYALE -GAME( 200?, sc4casry ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casryc ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4casry ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casryc ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2062) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2075 CASINO ROYALE DUCRV46 CROY CROY SOUNDS CASINO ROYALE (Jumping Bean copyright?) -GAME( 200?, sc4casryd ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casrye ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4casryd ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casrye ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2075) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2073, CZECH CASINO ROYALE.......................CROY SOUNDS... (not standard header) -GAME( 200?, sc4casrya ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casryb ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4casrya ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casryb ,sc4casry, sc4, sc4, sc4, ROT0, "Mazooma","Casino Royale (PR2073) (Czech) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7060CASINO CHICKEN DALES TTTWO SOUNDS CHICKEN DALES -GAME( 200?, sc4chick ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chickendales (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chick ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chickendales (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7008 CHUBBY DOES VEGAS VEGAS SOUNDS11 -GAME( 200?, sc4chub ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chuba ,sc4chub, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chubb ,sc4chub, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chub ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chuba ,sc4chub, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chubb ,sc4chub, sc4, sc4, sc4, ROT0, "Mazooma","Chubby Does Vegas (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2111 CLASSIC 7'S CLASS SOUNDS CLASSIC 7'S -GAME( 200?, sc4cla7 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cla7a ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cla7b ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cla7c ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cla7 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cla7a ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cla7b ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cla7c ,sc4cla7, sc4, sc4, sc4, ROT0, "Mazooma","Classic 7s (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2522 CLEVERCOGS V1.0 CLEVERCOGSSND CLEVER COGS -GAME( 200?, sc4ccogs ,0, sc4, sc4, sc4, ROT0, "Qps","Clever Cogs (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ccogs ,0, sc4, sc4, sc4, ROT0, "Qps","Clever Cogs (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7148 CLUB CLASS PR7148 CLUB CLASS SOUNDS11 CLUB CLASS -GAME( 200?, sc4cclas ,0, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasa ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasb ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasc ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasd ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasf ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasi ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasj ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclask ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasl ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasm ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasn ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclaso ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasq ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasr ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclass ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclast ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasu ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasv ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasw ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cclas ,0, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasa ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasb ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasc ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasd ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasf ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasi ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasj ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclask ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasl ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasm ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasn ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclaso ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasq ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasr ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclass ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclast ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasu ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasv ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasw ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) // PR7148 CLUB CLASS CLUB CLASS CLUB PR7148 CLUB CLASS SOUNDS11 CLUB CLASS -GAME( 200?, sc4cclasx ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasy ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasz ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclas0 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclas1 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 25)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclas2 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 26)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclas3 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 27)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclas4 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 28)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cclasx ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasy ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasz ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclas0 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclas1 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 25)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclas2 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 26)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclas3 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 27)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclas4 ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (Bellfruit) (Scorpion 4) (set 28)", GAME_IS_SKELETON_MECHANICAL ) // PR7148 CLUB CLASS 65% FERRY PR7148 CLUB CLASS SOUNDS11 CLUB CLASS -GAME( 200?, sc4cclase ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasg ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclash ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclasp ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cclase ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasg ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclash ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclasp ,sc4cclas, sc4, sc4, sc4, ROT0, "BFM","Club Class (65% Ferry) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2383 CLUBCLOUSEAU CLUBCLOUSEAU CLUB CCLOU SOUNDS CLUB CLOSEAU -GAME( 200?, sc4clclo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Club Clouseau (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clclo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Club Clouseau (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2237 CLUB CLUEDO CLUB CLUEDO CLUB CCLU SOUNDS CLUB CLUEDO -GAME( 200?, sc4clucl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clucla ,sc4clucl, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clucl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clucla ,sc4clucl, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1208 COLOSSUS 95004235 COLOSSUS PR7155 COLOSSUS -GAME( 200?, sc4colos ,0, sc4, sc4, sc4, ROT0, "BFM","Colossus (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4colos ,0, sc4, sc4, sc4, ROT0, "BFM","Colossus (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1621 CLUB COOL JEWELS PR1621 COOL SOUNDS11 CLUB COOL JEWELS CLUB -GAME( 200?, sc4cjcl ,0, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjcla ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjclb ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjclc ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjcld ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjcle ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjclf ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cjcl ,0, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjcla ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjclb ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjclc ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjcld ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjcle ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjclf ,sc4cjcl, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR1036 CLUB COP THE LOT PR1036 CLOT SOUNDS11 COP THE LOT -GAME( 200?, sc4ctlcl ,0, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctlcla ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ctlcl ,0, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctlcla ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1036 CLUB COP THE LOT COP THE LOT CLUB PR1036 CLOT SOUNDS11 COP THE LOT -GAME( 200?, sc4ctlclb ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctlclc ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ctlclb ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctlclc ,sc4ctlcl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6837 CLASSIC CLUB COPS AND ROBBERS PR6837 COPS SOUNDS11 COPS AND ROBBERS -GAME( 200?, sc4crcc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcca ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcca ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6837 CLASSIC CLUB COPS AND ROBBERS 65% PR6837 COPS SOUNDS11 -GAME( 200?, sc4crccb ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crccc ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crccb ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crccc ,sc4crcc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Classic (65%) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3241 CLUB COPS AND ROBBERS PLATINUM SCORP4 COPS & ROBRS PLT CLUB PR3241 C N R PLATINUM SOUNDS11 COPS AND ROBBERS -GAME( 200?, sc4crcp ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpa ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpc ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpd ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpe ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpf ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcpg ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crcph ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crcp ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpa ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpc ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpd ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpe ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpf ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcpg ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crcph ,sc4crcp, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Club Platinum (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1348 CLUB COPS AND ROBBERS GOLD PR1348 CCRG SOUNDS11 COPS AND ROBBERS -GAME( 200?, sc4crgc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgca ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcb ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcc ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcd ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgce ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcf ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcg ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgch ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgci ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcj ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgck ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcl ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcm ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgco ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcq ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgct ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcw ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crgc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgca ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcb ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcc ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcd ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgce ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcf ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcg ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgch ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgci ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcj ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgck ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcl ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcm ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgco ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcq ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgct ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcw ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR1348 CLUB COPS AND ROBBERS GOLD COPS & ROBRS GLD CLUB PR1348 CCRG SOUNDS11 COPS AND ROBBERS -GAME( 200?, sc4crgcn ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcp ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcr ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcu ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crgcn ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcp ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcr ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcu ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PR1348 !500 CLUB COPS AND ROBBERS GOLD COPS & ROBRS GLD CLUB PR1348 CCRG SOUNDS11 COPS AND ROBBERS -GAME( 200?, sc4crgcs ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crgcv ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crgcs ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crgcv ,sc4crgc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Gold Club (Bellfruit) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL ) // PR2383 CLUBCORONATIONSTREET CLUBCORONATIONST CLUB CCORO SOUNDS CLUB CORO ST -GAME( 200?, sc4corcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corcla ,sc4corcl, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4corcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corcla ,sc4corcl, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2058 COUNT YER CASH PR2058 COUNT YER CASH SOUNDS11 -GAME( 200?, sc4cyc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cyca ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cycb ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cycc ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cycd ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cyc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cyca ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cycb ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cycc ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cycd ,sc4cyc, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2092 CLUB COUNT YER CASH COUNT YER CASH CLUB CLCC SOUNDS -GAME( 200?, sc4cyccl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cyccla ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cycclb ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cycclc ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cyccl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cyccla ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cycclb ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cycclc ,sc4cyccl, sc4, sc4, sc4, ROT0, "Mazooma","Count Yer Cash Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6906 CRAZY CASINO SP98 PR6906 CRCS SOUNDS11 -GAME( 200?, sc4crzcs ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzcsa ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzcsb ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzcsc ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzcs ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzcsa ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzcsb ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzcsc ,sc4crzcs, sc4, sc4, sc4, ROT0, "BFM","Crazy Casino SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1129 CASINO CRAZY CLIMBER PR1129 CRAZY CLIMBER SOUNDS11 -GAME( 200?, sc4cclim ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclima ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimb ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimc ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimd ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimh ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimi ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimm ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimn ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimo ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimp ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cclim ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclima ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimb ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimc ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimd ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimh ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimi ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimm ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimn ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimo ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimp ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR1129 CASINO CRAZY CLIMBER CRAZY CLIMBER S.SITE PR1129 CRAZY CLIMBER SOUNDS11 -GAME( 200?, sc4cclime ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimf ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimg ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimj ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cclimk ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ccliml ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cclime ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimf ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimg ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimj ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cclimk ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ccliml ,sc4cclim, sc4, sc4, sc4, ROT0, "BFM","Crazy Climber (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) // PR6813 CRAZY FRUITS PR6813 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4cfqps ,0, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsa ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsb ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsd ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsk ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfqps ,0, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsa ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsb ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsd ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsk ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits (PR6813) (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2521 CRAZY FRUITS V1.0 PR6813 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4cfqpsc ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpse ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsf ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsg ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsh ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfqpsi ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfqpsc ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpse ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsf ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsg ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsh ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfqpsi ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits V1.0 (PR2521) (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR4613 CRAZY FRUITS SP98 PR6813 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4cfqpsj ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits SP98 (PR4613) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfqpsj ,sc4cfqps, sc4, sc4, sc4, ROT0, "Qps","Crazy Fruits SP98 (PR4613) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6923 CASINO CRAZY FRUITS PR6923 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4cfcas ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Casino (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfcas ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Casino (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1396 CLASSIC CRAZY FRUITS PR1396 CLSIC CRAZY FRUITS SND11 -GAME( 200?, sc4cfcla ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclab ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclac ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclad ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclae ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclaf ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfcla ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclab ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclac ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclad ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclae ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclaf ,sc4cfcla, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Classic (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR6931 CLUB CRAZY FRUITS PR6931 CRZY SOUNDS11 -GAME( 200?, sc4cfclb ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclba ,sc4cfclb, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfclbb ,sc4cfclb, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfclb ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclba ,sc4cfclb, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfclbb ,sc4cfclb, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR1107 CRAZY FRUITS DOWNUNDER PR1107 DOWN UNDER SOUNDS11 -GAME( 200?, sc4cfdu ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfdua ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfdub ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfduc ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfdu ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfdua ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfdub ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfduc ,sc4cfdu, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Down Under (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1620 CLUB CRAZY FRUITS GOLD PR1620 CRAZY SOUNDS11 CRAZY FRUITS CLUB -GAME( 200?, sc4cfgcl ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfgcla ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfgclb ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cfgclc ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cfgcl ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfgcla ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfgclb ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cfgclc ,sc4cfgcl, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7141 CRAZY GANG PR7141 CRAZY GANG SOUNDS11 CRAZY GANG -GAME( 200?, sc4crzgn ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgna ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnb ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnc ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnd ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgne ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnf ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgng ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnh ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgni ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnj ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnk ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnl ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnm ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnn ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgno ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnp ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnq ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnx ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4crzgny ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnz ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn0 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn1 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn2 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzgn ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgna ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnb ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnc ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnd ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgne ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnf ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgng ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnh ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgni ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnj ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnk ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnl ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnm ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnn ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgno ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnp ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnq ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnx ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4crzgny ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnz ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn0 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn1 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn2 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang (Bellfruit) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL ) // NUMBER PR7141 CRAZY GANG PR7141 CRAZY GANG SOUNDS11 CRAZY GANG ARCADE -GAME( 200?, sc4crzgnr ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgns ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnt ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnu ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnv ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgnw ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn3 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn4 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn5 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn6 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn7 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzgn8 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzgnr ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgns ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnt ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnu ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnv ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgnw ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn3 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn4 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn5 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn6 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn7 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzgn8 ,sc4crzgn, sc4, sc4, sc4, ROT0, "BFM","Crazy Gang Arcade (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1128 CASINO CRAZY KEYS PR1128 CRAZY KEYS SOUNDS11 -GAME( 200?, sc4crzky ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkya ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyb ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyc ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyd ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkye ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyf ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyg ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4crzkyh ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyl ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkym ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyn ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzky ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkya ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyb ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyc ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyd ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkye ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyf ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyg ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4crzkyh ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyl ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkym ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyn ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1128 CASINO CRAZY KEYS CRAZY KEYS ARCADE PR1128 CRAZY KEYS SOUNDS11 -GAME( 200?, sc4crzkyi ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyj ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyk ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyo ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyp ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyq ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkyr ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzkys ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzkyi ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyj ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyk ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyo ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyp ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyq ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkyr ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzkys ,sc4crzky, sc4, sc4, sc4, ROT0, "BFM","Crazy Keys Casino Arcade (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR7001 IT'S A CRAZY WORLD CRAZY WORLD SOUNDS -GAME( 200?, sc4crzwl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwla ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwlb ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwlc ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwld ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwle ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwlf ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crzwlg ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crzwl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwla ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwlb ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwlc ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwld ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwle ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwlf ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crzwlg ,sc4crzwl, sc4, sc4, sc4, ROT0, "Mazooma","Crazy World (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR7023 CRISS CROSS CASH CCC SOUNDS -GAME( 200?, sc4cccsh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cccsha ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cccshb ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cccshc ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cccshd ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cccshe ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cccsh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cccsha ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cccshb ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cccshc ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cccshd ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cccshe ,sc4cccsh, sc4, sc4, sc4, ROT0, "Mazooma","Criss Cross Cash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1221 CRISSCROSSCRAZY ART13 95004282 CRISSCROSS PR1161 -GAME( 200?, sc4ccc ,0, sc4, sc4, sc4, ROT0, "BFM","Criss Cross Crazy (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ccc ,0, sc4, sc4, sc4, ROT0, "BFM","Criss Cross Crazy (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6801 DAYLIGHT ROBBERY PR6801 DAYLIGHT SOUNDS -GAME( 200?, sc4daylt ,0, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4daylta ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltb ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltc ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltg ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4daylth ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4daylti ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltj ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4daylt ,0, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4daylta ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltb ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltc ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltg ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4daylth ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4daylti ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltj ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR4601 DAYLIGHT ROBBERY SP98 PR6801 DAYLIGHT SOUNDS -GAME( 200?, sc4dayltd ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4daylte ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltf ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltk ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltl ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dayltm ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dayltd ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4daylte ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltf ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltk ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltl ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dayltm ,sc4daylt, sc4, sc4, sc4, ROT0, "BFM","Daylight Robbery SP98 (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2099 DEEP IMPACT DIMP SOUNDS DEEP IMPACT -GAME( 200?, sc4deepi ,0, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4deepia ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4deepib ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4deepid ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4deepi ,0, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4deepia ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4deepib ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4deepid ,sc4deepi, sc4, sc4, sc4, ROT0, "Mazooma","Deep Impact (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1006 DEMOLITION DERBY PR1006 DEMDERBY SOUNDS11 -GAME( 200?, sc4derby ,0, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4derbya ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4derbyb ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4derbyc ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4derbyd ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4derbye ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4derby ,0, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4derbya ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4derbyb ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4derbyc ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4derbyd ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4derbye ,sc4derby, sc4, sc4, sc4, ROT0, "BFM","Demolition Derby (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1439 DIAMONDS & RUBIES PR1436 TRIPLE CASINO SOUNDS11 -GAME( 200?, sc4druby ,0, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4drubya ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4drubyb ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4drubyc ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4drubyd ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4druby ,0, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4drubya ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4drubyb ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4drubyc ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4drubyd ,sc4druby, sc4, sc4, sc4, ROT0, "BFM","Diamonds & Rubys (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR7048 DISCO INFERNO DISCO SOUNDS DISCO INFERNO -GAME( 200?, sc4disco ,0, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4discoa ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4discob ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4discoc ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4discod ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4disco ,0, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4discoa ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4discob ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4discoc ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4discod ,sc4disco, sc4, sc4, sc4, ROT0, "Mazooma","Disco Inferno (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2558 DOUBLE DIAMOND 011 DOUBLEDIAMONDSND DOUBLE DIAMOND -GAME( 200?, sc4dbldm ,0, sc4, sc4, sc4, ROT0, "Qps","Double Diamond (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dbldm ,0, sc4, sc4, sc4, ROT0, "Qps","Double Diamond (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7060 DOUBLE FRENZY DFRZYSND -GAME( 200?, sc4dblfr ,0, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dblfra ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dblfrb ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dblfrc ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dblfr ,0, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dblfra ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dblfrb ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dblfrc ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR7060) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2276 DOUBLE FRENZY 212 DFRZYSND -GAME( 200?, sc4dblfrd ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dblfre ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dblfrd ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dblfre ,sc4dblfr, sc4, sc4, sc4, ROT0, "Qps","Double Frenzy (PR2276) (212) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2026 DOUGH AND ARROW DOUGHSND DOUGH AND ARROW -GAME( 200?, sc4darw ,0, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4darwa ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4darwb ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4darwc ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4darw ,0, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4darwa ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4darwb ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4darwc ,sc4darw, sc4, sc4, sc4, ROT0, "Qps","Dough & Arrow (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2519 THEDUCKSOFHAZZARD V1.0 DUCKSOFHAZZARDSND DUCKS OF HAZZARD -GAME( 200?, sc4duckq ,0, sc4, sc4, sc4, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4duckqa ,sc4duckq, sc4, sc4, sc4, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4duckq ,0, sc4, sc4, sc4, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4duckqa ,sc4duckq, sc4, sc4, sc4, ROT0, "Qps","Ducks Of Hazzard (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1104 DYNAMITE PR1104 DYNAMITE SOUNDS11 -GAME( 200?, sc4dyna ,0, sc4, sc4, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dynaa ,sc4dyna, sc4, sc4, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dyna ,0, sc4, sc4, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dynaa ,sc4dyna, sc4, sc4, sc4, ROT0, "BFM","Dynamite (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1017 EASY STREAK PR1017 EASY STREAK SOUNDS11 EASY STREAK -GAME( 200?, sc4easy ,0, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easya ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easyb ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easyc ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easyd ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easye ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4easyf ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4easy ,0, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easya ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easyb ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easyc ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easyd ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easye ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4easyf ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR1326 CASINO EASY STREAK PR1326 EASY STREAK SOUNDS11 -GAME( 200?, sc4eascs ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsa ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsb ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsc ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsd ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascse ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsf ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsg ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsh ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsi ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsj ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4eascsk ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4eascs ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsa ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsb ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsc ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsd ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascse ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsf ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsg ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsh ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsi ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsj ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4eascsk ,sc4easy, sc4, sc4, sc4, ROT0, "BFM","Easy Streak Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR2071 FAST 'N' FURIOUS FNF SOUNDS FAST 'N' FURIOUS -GAME( 200?, sc4fastf ,0, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fastfa ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fastfb ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fastfc ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fastf ,0, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fastfa ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fastfb ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fastfc ,sc4fastf, sc4, sc4, sc4, ROT0, "Mazooma","Fast 'n' Furious (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7070 FAST FRUIT FFRUIT SOUNDS FAST FRUIT -GAME( 200?, sc4ffru ,0, sc4, sc4, sc4, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // has 'MAZ' game code in roms -GAME( 200?, sc4ffrub ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // has 'MAZ' game code in roms -GAME( 200?, sc4ffrua ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ffruc ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ffrud ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ffrue ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ffru ,0, sc4, sc4, sc4, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // has 'MAZ' game code in roms +GAME( 200?, sc4ffrub ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps / Mazooma","Fast Fruit (Qps / Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // has 'MAZ' game code in roms +GAME( 200?, sc4ffrua ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ffruc ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ffrud ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ffrue ,sc4ffru, sc4, sc4, sc4, ROT0, "Qps","Fast Fruit (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1007 FEVER PR1007 FEVER SOUNDS11 -GAME( 200?, sc4fever ,0, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fevera ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverb ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverc ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverd ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fevere ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverf ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverg ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverh ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverk ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fever ,0, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fevera ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverb ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverc ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverd ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fevere ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverf ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverg ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverh ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverk ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1007) (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1202 FEVER 95004239 FEVER PR7157 -GAME( 200?, sc4feveri ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverj ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4feverl ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4feveri ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverj ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4feverl ,sc4fever, sc4, sc4, sc4, ROT0, "BFM","Fever (PR1202) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR7119 FEVER_PITCH PR7119 FEVER PITCH SOUNDS11 -GAME( 200?, sc4fpitc ,0, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitca ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcb ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcc ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcd ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitce ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcf ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcg ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitch ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitci ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitcj ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fpitck ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fpitc ,0, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitca ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcb ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcc ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcd ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitce ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcf ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcg ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitch ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitci ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitcj ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fpitck ,sc4fpitc, sc4, sc4, sc4, ROT0, "BFM","Fever Pitch (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1216 FEVER ART12 95004318 FEVER T N PR1251 -GAME( 200?, sc4fevnx ,0, sc4, sc4, sc4, ROT0, "BFM","Fever The Next (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fevnxa ,sc4fevnx, sc4, sc4, sc4, ROT0, "BFM","Fever The Next (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fevnx ,0, sc4, sc4, sc4, ROT0, "BFM","Fever The Next (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fevnxa ,sc4fevnx, sc4, sc4, sc4, ROT0, "BFM","Fever The Next (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6835 FIRE CRACKER PR6835 FIRE SOUNDS11 -GAME( 200?, sc4fcc ,0, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fcca ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fccb ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fccc ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fcc ,0, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fcca ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fccb ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fccc ,sc4fcc, sc4, sc4, sc4, ROT0, "BFM","Firecracker Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2082 FIRE POWER FPOW SOUNDS FIRE POWER -GAME( 200?, sc4fire ,0, sc4, sc4, sc4, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4firea ,sc4fire, sc4, sc4, sc4, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fire ,0, sc4, sc4, sc4, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4firea ,sc4fire, sc4, sc4, sc4, ROT0, "Mazooma","Firepower (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2016 WAYSPAYS PR2016,5WAYSPAYS, FWAY SOUNDS 5 WAYS PAYS -GAME( 200?, sc4fwp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fwpa ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fwpb ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fwpc ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fwp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fwpa ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fwpb ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fwpc ,sc4fwp, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2016 WAYSPAYS PR2016,5WAYSPAYS, FWAY SOUNDS 5 WAYS PAYS (same ident string as above?) -GAME( 200?, sc4fwpcs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fwpcsa ,sc4fwpcs, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fwpcsb ,sc4fwpcs, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fwpcs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fwpcsa ,sc4fwpcs, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fwpcsb ,sc4fwpcs, sc4, sc4, sc4, ROT0, "Mazooma","Five Ways Pays Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR6814 FOOTBALL CRAZY PR6814 FOOTBALL CRAZY SOUNDS -GAME( 200?, sc4fbcrz ,0, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrza ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzb ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzc ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzd ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrze ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzf ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzg ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzh ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbcrzi ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fbcrz ,0, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrza ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzb ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzc ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzd ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrze ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzf ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzg ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzh ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbcrzi ,sc4fbcrz, sc4, sc4, sc4, ROT0, "BFM","Football Crazy (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR6804 FRANKIE DETTORI PR6804 FRANKIE SOUNDS -GAME( 200?, sc4fd7th ,0, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7tha ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thb ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7the ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thf ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thg ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fd7th ,0, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7tha ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thb ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7the ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thf ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thg ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR6804 FRANKIE DETTORI SP98 PR6804 FRANKIE SOUNDS -GAME( 200?, sc4fd7thc ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thd ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thh ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fd7thi ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fd7thc ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thd ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thh ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fd7thi ,sc4fd7th, sc4, sc4, sc4, ROT0, "BFM","Frankie Dettori's 7th Heaven SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6916 FROOTY BOOTY PR6916 FROOTY BOOTY SOUNDS11 FROOTY BOOTY -GAME( 200?, sc4frboo ,0, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frbooa ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frboob ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frbooc ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4frboo ,0, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frbooa ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frboob ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frbooc ,sc4frboo, sc4, sc4, sc4, ROT0, "BFM","Frooty Booty (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1101 FRUIT FRENZY PR1101 FRUIT FRENZY SOUNDS11 -GAME( 200?, sc4frenz ,0, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frenza ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frenzb ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frenzc ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frenzd ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frenze ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4frenz ,0, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frenza ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frenzb ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frenzc ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frenzd ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frenze ,sc4frenz, sc4, sc4, sc4, ROT0, "BFM","Fruit Frenzy (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2027 FRUITOPIA FRUITOPIASND FRUITOPIA -GAME( 200?, sc4ftopi ,0, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopia ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopib ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopic ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ftopi ,0, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopia ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopib ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopic ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2027 FRUITOPIA_17/04/03 V1.1 FRUITOPIASND FRUITOPIA -GAME( 200?, sc4ftopif ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopii ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ftopif ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopii ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2027 FRUITOPIA V2.1 FRUITOPIASND FRUITOPIA -GAME( 200?, sc4ftopid ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopig ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ftopid ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopig ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2027 FRUITOPIA V2.2 FRUITOPIASND FRUITOPIA -GAME( 200?, sc4ftopie ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ftopih ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ftopie ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ftopih ,sc4ftopi, sc4, sc4, sc4, ROT0, "Qps","Fruitopia (V2.2) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6928 CASINO FRUIT N SUITS PR6928 FRUIT N SUITS SOUNDS11 -GAME( 200?, sc4frsu ,0, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsua ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsub ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsuc ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsud ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsue ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsuf ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4frsug ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4frsu ,0, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsua ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsub ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsuc ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsud ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsue ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsuf ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4frsug ,sc4frsu, sc4, sc4, sc4, ROT0, "BFM","Fruits 'n' Suits (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2537 FULL THROTTLE 011 FULLTHROTTLESND FULL THROTTLE -GAME( 200?, sc4fullt ,0, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fulltb ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fullt ,0, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fulltb ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2537 FULL THROTTLE 041 FULLTHROTTLESND FULL THROTTLE -GAME( 200?, sc4fullta ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fulltc ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fullta ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fulltc ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2537 FULL THROTTLE 012 FULLTHROTTLESND FULL THROTTLE -GAME( 200?, sc4fulltd ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fulltg ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fulltd ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fulltg ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2537 FULL THROTTLE 042 FULLTHROTTLESND FULL THROTTLE -GAME( 200?, sc4fullte ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fullth ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fullte ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fullth ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (042) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // R2537 FULL THROTTLE 013 FULLTHROTTLESND FULL THROTTLE -GAME( 200?, sc4fulltf ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fullti ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fulltf ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fullti ,sc4fullt, sc4, sc4, sc4, ROT0, "Qps","Full Throttle (013) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1224 THE GAME CASINO 95004285 THEGAME PR1153 -GAME( 200?, sc4gamcs ,0, sc4, sc4, sc4, ROT0, "BFM","The Game Casino (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gamcs ,0, sc4, sc4, sc4, ROT0, "BFM","The Game Casino (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1213 THE GAME 95004285 THEGAME PR1153 -GAME( 200?, sc4game ,0, sc4, sc4, sc4, ROT0, "BFM","The Game (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4game ,0, sc4, sc4, sc4, ROT0, "BFM","The Game (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2162 GETTIN' ZIGGY ZIGY SOUNDS GETTIN' ZIGGY -GAME( 200?, sc4ziggy ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggya ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggyb ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggyc ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggyd ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggye ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggyf ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ziggyg ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ziggy ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggya ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggyb ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggyc ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggyd ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggye ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggyf ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ziggyg ,sc4ziggy, sc4, sc4, sc4, ROT0, "Mazooma","Gettin Ziggy With It (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2292 CLUB GLADIATOR CLUB GLADIATOR CLUB CLUB GLAD SOUNDS CLUB GLADIATOR -GAME( 200?, sc4gldcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gldcla ,sc4gldcl, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gldcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gldcla ,sc4gldcl, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc4gfev ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR20XX GOLD FEVER PUSHER GOLDFEVER SOUNDS GOLD FEVER -GAME( 200?, sc4gfeva ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER -GAME( 200?, sc4gfevb ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ +GAME( 200?, sc4gfev ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR20XX GOLD FEVER PUSHER GOLDFEVER SOUNDS GOLD FEVER +GAME( 200?, sc4gfeva ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER +GAME( 200?, sc4gfevb ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ // PR2142 GOLD FEVER PUSHER USA GOLDFEVER SOUNDS GOLD FEVER (mislabeled?) -GAME( 200?, sc4db ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ (was D & B (Mazooma) (Scorpion 4) but D&B just seem to be a company associated with Mazooma? ) +GAME( 200?, sc4db ,sc4gfev, sc4, sc4, sc4, ROT0, "Mazooma","Gold Fever (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ (was D & B (Mazooma) (Scorpion 4) but D&B just seem to be a company associated with Mazooma? ) // PR7090 GOLDEN GHOST GOLDEN GHOST MAZ GHOST SOUNDS GOLDEN GHOST -GAME( 200?, sc4ghost ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghostb ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghostc ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghoste ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghostf ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghostg ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ghost ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghostb ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghostc ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghoste ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghostf ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghostg ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7090 GOLD GHOST TRIPLE GHOST SOUNDS 8 GOLDEN GHOST -GAME( 200?, sc4ghosta ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghostd ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ghosth ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ghosta ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghostd ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ghosth ,sc4ghost, sc4, sc4, sc4, ROT0, "Mazooma","Golden Ghost (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V1.0 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggrid ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggrida ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggride ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridf ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggrid ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggrida ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggride ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridf ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.0) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V1.1 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggridb ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridc ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridg ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridh ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggridb ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridc ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridg ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridh ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.1) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V1.3 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggridd ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.3) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggridd ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V1.3) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V011 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggridi ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridk ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggridi ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridk ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V011) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V041 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggridj ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridl ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggridj ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridl ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2518 GOLDEN GRID V012 GOLDENGRIDSND GOLDEN GRID -GAME( 200?, sc4ggridm ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggridn ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggridm ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggridn ,sc4ggrid, sc4, sc4, sc4, ROT0, "Qps","Golden Grid (V012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB GOLDEN GRID V1.0 CLUBGOLDENGRIDSND CLUB GOLDEN GRID -GAME( 200?, sc4ggcl ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V1.0) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggcl ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V1.0) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB GOLDEN GRID 411 CLUBGOLDENGRIDSND CLUB GOLDEN GRID -GAME( 200?, sc4ggcla ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggclb ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggcla ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggclb ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB GOLDEN GRID 412 CLUBGOLDENGRIDSND CLUB GOLDEN GRID -GAME( 200?, sc4ggclc ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggcld ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggclc ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggcld ,sc4ggcl, sc4, sc4, sc4, ROT0, "Qps","Golden Grid Club (V412) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7024 GOLDEN OLDIE OLDIE SOUNDS -GAME( 200?, sc4goldo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldoa ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldob ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldoc ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4goldo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldoa ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldob ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldoc ,sc4goldo, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7024 GOLDEN OLDIE OLDIE SOUNDS (same as above?) -GAME( 200?, sc4gocas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gocasa ,sc4gocas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gocas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gocasa ,sc4gocas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Oldie Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2564 GOLDEN SHOT Standard Version GOLDENSHOTLOTECHSND -GAME( 200?, sc4gshot ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gshotb ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gshot ,0, sc4, sc4, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gshotb ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2564 GOLDEN SHOT Arcade Version GOLDENSHOTLOTECHSND -GAME( 200?, sc4gshota ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gshotc ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gshota ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gshotc ,sc4gshot, sc4, sc4, sc4, ROT0, "Qps","Golden Shot Arcade (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1431 GOLDEN WINNER PR1431 GOLDEN WINNER SND11 -GAME( 200?, sc4goldw ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwa ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwb ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwc ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4goldw ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwa ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwb ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwc ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1437 GOLDEN WINNER PR1436 TRIPLE CASINO SOUNDS11 -GAME( 200?, sc4goldwd ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwe ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwf ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4goldwg ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4goldwd ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwe ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwf ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4goldwg ,sc4goldw, sc4, sc4, sc4, ROT0, "BFM","Golden Winner (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR7036 GOLDEN X BARX SOUNDS -GAME( 200?, sc4gx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR7036GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4gxa ,sc4gx, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxb ,sc4gx, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gxa ,sc4gx, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxb ,sc4gx, sc4, sc4, sc4, ROT0, "Mazooma","Golden X (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR7036 GOLDEN X BARX SOUNDS -GAME( 200?, sc4gxcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxcasa ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxcasb ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxcasc ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxcasd ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gxcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxcasa ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxcasb ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxcasc ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxcasd ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR7036GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4gxcase ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gxcasf ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gxcase ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gxcasf ,sc4gxcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Casino (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4gx3 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3a ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3b ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3c ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3d ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3e ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3f ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gx3g ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gx3 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3a ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3b ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3c ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3d ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3e ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3f ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gx3g ,sc4gx3, sc4, sc4, sc4, ROT0, "Mazooma","Golden X Triple (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1211 GOUDKOORTS 95004288 GOUDKOORTS PR1151 -GAME( 200?, sc4goud ,0, sc4, sc4, sc4, ROT0, "BFM","Goudkoorts (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4goud ,0, sc4, sc4, sc4, ROT0, "BFM","Goudkoorts (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7019 GRAB A GRANNY GRANNY SOUNDS -GAME( 200?, sc4gag ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gaga ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gagb ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gagc ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gag ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gaga ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gagb ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gagc ,sc4gag, sc4, sc4, sc4, ROT0, "Mazooma","Grab A Granny (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2125 GRAND BLASTER CASH GRAN SOUNDS GRAND BLASTER -GAME( 200?, sc4gcb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcba ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbb ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbc ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbd ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbe ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbf ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbg ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbh ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbi ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcbj ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gcb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcba ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbb ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbc ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbd ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbe ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbf ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbg ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbh ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbi ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcbj ,sc4gcb, sc4, sc4, sc4, ROT0, "Mazooma","Grand Blaster Cash (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR1401 AWP GREEDY GONZALEZ PR1401 GREEDY GONZ SOUNDS11 -GAME( 200?, sc4greed ,0, sc4, sc4, sc4, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4greeda ,sc4greed, sc4, sc4, sc4, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4greed ,0, sc4, sc4, sc4, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4greeda ,sc4greed, sc4, sc4, sc4, ROT0, "BFM","Greedy Gonzalez (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) //PR1011 HAPPY FRUITS PR1011 HAPPY FRUITS SOUNDS11 -GAME( 200?, sc4hf ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfa ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfb ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfc ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfd ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfe ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hff ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfg ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hf ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfa ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfb ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfc ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfd ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfe ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hff ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfg ,sc4hf, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1021 CLUB HAPPY FRUITS PR1021 HAPPY SOUNDS11 HAPPY FRUITS -GAME( 200?, sc4hfcl ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hfcla ,sc4hfcl, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hfcl ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hfcla ,sc4hfcl, sc4, sc4, sc4, ROT0, "BFM","Happy Fruits Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1216 HEATWAVE ART 12 95004287 HEATWAVE PR1156 -GAME( 200?, sc4heatw ,0, sc4, sc4, sc4, ROT0, "BFM","Heatwave (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4heatw ,0, sc4, sc4, sc4, ROT0, "BFM","Heatwave (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1254 HELLRAISER ART12 95004326 HELLRAISER PR1254 -GAME( 200?, sc4helrd ,0, sc4, sc4, sc4, ROT0, "BFM","Hellraiser (Bellfruit) [Dutch] (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4helrd ,0, sc4, sc4, sc4, ROT0, "BFM","Hellraiser (Bellfruit) [Dutch] (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1254 HELLRAISER ART12 95004326 HELLRAISER PR1254 -GAME( 200?, sc4helrs ,0, sc4, sc4, sc4, ROT0, "BFM","Hellraiser (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4helrs ,0, sc4, sc4, sc4, ROT0, "BFM","Hellraiser (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7016 HICKORY DICKORY DOSH HICKORY SOUNDS -GAME( 200?, sc4hdd ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hddc ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hddd ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hdd ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hddc ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hddd ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7016) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR7045 HICKORY DICKORY DOSH HICKORY SOUNDS -GAME( 200?, sc4hdda ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hddb ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hdde ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hddf ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hdda ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hddb ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hdde ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hddf ,sc4hdd, sc4, sc4, sc4, ROT0, "Mazooma","Hickory Dickory Dosh (PR7045) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2999 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY -GAME( 200?, sc4himi ,0, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himic ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himif ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himig ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himih ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himii ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4himi ,0, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himic ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himif ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himig ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himih ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himii ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2999) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2119 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY -GAME( 200?, sc4himia ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himie ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4himia ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himie ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2119) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2067 HIGH 'N' MIGHTY MITY SOUNDS HIGH 'N' MIGHTY -GAME( 200?, sc4himib ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4himid ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4himib ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4himid ,sc4himi, sc4, sc4, sc4, ROT0, "Mazooma","High 'n' Mighty (PR2067) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1003 HIGH FIVE PR1003 HIGH FIVE SOUNDS11 -GAME( 200?, sc4hi5 ,0, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5a ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5b ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5c ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5d ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5e ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5f ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hi5g ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hi5 ,0, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5a ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5b ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5c ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5d ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5e ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5f ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hi5g ,sc4hi5, sc4, sc4, sc4, ROT0, "BFM","High 5 (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2066 HIGHLY SPRUNG HIGH SOUNDS HIGHLY SPRUNG -GAME( 200?, sc4sprng ,0, sc4, sc4, sc4, ROT0, "Mazooma","Highly Sprung (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sprng ,0, sc4, sc4, sc4, ROT0, "Mazooma","Highly Sprung (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1013 HILOWATHA PR1013 HILOWATHA SOUNDS11 -GAME( 200?, sc4hilo ,0, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloa ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilob ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloc ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilod ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloe ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilof ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilog ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloh ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloi ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hiloj ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilok ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hilo ,0, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloa ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilob ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloc ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilod ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloe ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilof ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilog ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloh ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloi ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hiloj ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilok ,sc4hilo, sc4, sc4, sc4, ROT0, "BFM","Hilowatha (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1112 HIT SHOT PR1112 HIT SHOT SOUNDS11 -GAME( 200?, sc4hitsh ,0, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hitsha ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hitshb ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hitshc ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hitshd ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hitshe ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hitsh ,0, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hitsha ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hitshb ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hitshc ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hitshd ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hitshe ,sc4hitsh, sc4, sc4, sc4, ROT0, "BFM","Hit Shot (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7115 HOLLYWOOD PR7115 HOLLYWOOD SOUNDS11 -GAME( 200?, sc4holyw ,0, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4holywa ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4holywb ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4holywc ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4holyw ,0, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4holywa ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4holywb ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4holywc ,sc4holyw, sc4, sc4, sc4, ROT0, "BFM","Hollywood (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6911 HOT PROPERTY PR6911 HOT PROPERTY SOUNDS11 HOT PROPERTY -GAME( 200?, sc4hotpr ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotpra ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotprb ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotprc ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotprd ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotpre ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotpr ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotpra ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotprb ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotprc ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotprd ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotpre ,sc4hotpr, sc4, sc4, sc4, ROT0, "BFM","Hot Property (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1759 CLUB HOT SIX HOT SIX CLUB PR1759 HOSX SOUNDS11 -GAME( 200?, sc4h6cl ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4h6cla ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4h6clb ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4h6clc ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4h6cl ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4h6cla ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4h6clb ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4h6clc ,sc4h6cl, sc4, sc4, sc4, ROT0, "BFM","Hot Six Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2036 HYDE & STREAK HYDE SOUNDS HYDE & STREAK -GAME( 200?, sc4hyde ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hydea ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hydeb ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hydec ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hyde ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hydea ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hydeb ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hydec ,sc4hyde, sc4, sc4, sc4, ROT0, "Mazooma","Hyde & Streak (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2053 HYPERACTIVEL HYPE SOUNDS HYPERACTIVE -GAME( 200?, sc4hyper ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hypera ,sc4hyper, sc4, sc4, sc4, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hyper ,0, sc4, sc4, sc4, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hypera ,sc4hyper, sc4, sc4, sc4, ROT0, "Mazooma","Hyperactive (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2403 CLUB ITALIAN JOB CLUB ITALIAN JOB CLUB CLUB ITJB SOUNDS -GAME( 200?, sc4ijclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job Club (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ijclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job Club (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2078 JACK THE KIPPER JKIP SOUNDS JACK THE KIPPER -GAME( 200?, sc4jack ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jacka ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jackb ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jackc ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jackd ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jacke ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jackf ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jackg ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jack ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jacka ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jackb ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jackc ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jackd ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jacke ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jackf ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jackg ,sc4jack, sc4, sc4, sc4, ROT0, "Mazooma","Jack The Kipper (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1304 JACKPOT JUNCTION PR1304 JACKPOT JUNCTION SOUNDS11 -GAME( 200?, sc4jjunc ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjunca ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuncb ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuncc ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuncd ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjunce ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuncf ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuncg ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjunch ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjunci ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjunc ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjunca ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuncb ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuncc ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuncd ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjunce ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuncf ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuncg ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjunch ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjunci ,sc4jjunc, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1422 CLUB JACKPOT JUNCTION PR1422 JACKPOT JUNCTION SOUNDS11 -GAME( 200?, sc4jjucl ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuclb ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjucl ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuclb ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1422 CLUB JACKPOT JUNCTION JACKPOT JUNCTION CLUB PR1422 JACKPOT JUNCTION SOUNDS11 -GAME( 200?, sc4jjucld ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjucle ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjucld ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjucle ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1422 CLUB JACKPOT JUNCTION FERRY PR1422 JACKPOT JUNCTION SOUNDS11 -GAME( 200?, sc4jjucla ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjuclc ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjucla ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjuclc ,sc4jjucl, sc4, sc4, sc4, ROT0, "BFM","Jackpot Junction Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7044 GERMAN JIGGERY POKERY PR7044SND -GAME( 200?, sc4jiggn ,0, sc4, sc4, sc4, ROT0, "Nova","Jiggery Pockery (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jiggn ,0, sc4, sc4, sc4, ROT0, "Nova","Jiggery Pockery (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7021 JIGGERY POKERY PR7021 SOUNDS -GAME( 200?, sc4jiggr ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jiggra ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jiggrb ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jiggrc ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jiggr ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jiggra ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jiggrb ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jiggrc ,sc4jiggr, sc4, sc4, sc4, ROT0, "Mazooma","Jiggery Pokery (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2096 JIVE MONEY JIVE SOUNDS JIVE MONEY -GAME( 200?, sc4jive ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2096) (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jive ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2096) (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2160 JIVE MONEY JMON SOUNDS JIVE MONEY -GAME( 200?, sc4jivea ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jiveb ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jivec ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jived ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jivea ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jiveb ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jivec ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jived ,sc4jive, sc4, sc4, sc4, ROT0, "Mazooma","Jive Money (PR2160) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2054 JOLLY JOUSTINGV2.0 JJOLLSND JOLLY JOUSTING -GAME( 200?, sc4jolly ,0, sc4, sc4, sc4, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jollya ,sc4jolly, sc4, sc4, sc4, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jolly ,0, sc4, sc4, sc4, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jollya ,sc4jolly, sc4, sc4, sc4, ROT0, "Qps","Jolly Jousting (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1136 JUICY JACKPOTS 65% FERRY PR1136 JUICY JACKPOTS SOUNDS11 -GAME( 200?, sc4juicy ,0, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicyb ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4juicy ,0, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicyb ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (65% Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1136 JUICY JACKPOTS PR1136 JUICY JACKPOTS SOUNDS11 -GAME( 200?, sc4juicyd ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicye ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicyf ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicyg ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4juicyd ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicye ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicyf ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicyg ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1136 JUICY JACKPOTS JUICY JACKPOTS CLUB PR1136 JUICY JACKPOTS SOUNDS11 -GAME( 200?, sc4juicyi ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicyj ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4juicyi ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicyj ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1136) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1123 JUICY JACKPOTS PR1136 JUICY JACKPOTS SOUNDS11 -GAME( 200?, sc4juicya ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4juicyc ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4juicya ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4juicyc ,sc4juicy, sc4, sc4, sc4, ROT0, "BFM","Juicy Jackpots Club (PR1123) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2152 JUMPIN JACK CASH JACK SOUNDS JUMPIN JACK CASH -GAME( 200?, sc4jjc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjca ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjcb ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjcc ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjcd ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjce ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjcf ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjcg ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjch ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjci ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjca ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjcb ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjcc ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjcd ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjce ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjcf ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjcg ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjch ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjci ,sc4jjc, sc4, sc4, sc4, ROT0, "Mazooma","Jumping Jack Cash (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR6807 JUMPING JACK FLASH PR6807 JUMP SOUNDS11 -GAME( 200?, sc4jjf ,0, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfa ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfb ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfg ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfh ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfi ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjf ,0, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfa ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfb ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfg ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfh ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfi ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash (PR6807) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR4607 JUMPING JACK FLASH SP98 PR6807 JUMP SOUNDS11 -GAME( 200?, sc4jjfc ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfd ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfe ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjff ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfj ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfk ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfl ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjfm ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjfc ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfd ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfe ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjff ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfj ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfk ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfl ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjfm ,sc4jjf, sc4, sc4, sc4, ROT0, "BFM","Jumping Jack Flash SP98 (PR4607) (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR7103 JUNGLE BUCKS PR7103 JUNGLEBUCKS SOUNDS11 JUNGLE BUCKS -GAME( 200?, sc4jbuck ,0, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jbucka ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jbuckb ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jbuckc ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jbuckd ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jbuck ,0, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jbucka ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jbuckb ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jbuckc ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jbuckd ,sc4jbuck, sc4, sc4, sc4, ROT0, "BFM","Jungle Bucks (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2538 KALEIDOSCOPE 011 KALEIDOSCOPESND KALEIDOSCOPE -GAME( 200?, sc4kalei ,0, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kaleib ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4kalei ,0, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kaleib ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (011) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2538 KALEIDOSCOPE 041 KALEIDOSCOPESND KALEIDOSCOPE -GAME( 200?, sc4kaleia ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kaleic ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4kaleia ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kaleic ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (041) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2538 KALEIDOSCOPE 051 KALEIDOSCOPESND KALEIDOSCOPE -GAME( 200?, sc4kaleid ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kaleie ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4kaleid ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kaleie ,sc4kalei, sc4, sc4, sc4, ROT0, "Qps","Kaleidoscope (051) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2161 KING KONG CASH 000 KKCSH SOUNDS KING KONG CASH -GAME( 200?, sc4kkong ,0, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkonga ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongb ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongc ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongd ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkonge ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongf ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongg ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongh ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongi ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4kkongj ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4kkong ,0, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkonga ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongb ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongc ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongd ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkonge ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongf ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongg ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongh ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongi ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4kkongj ,sc4kkong, sc4, sc4, sc4, ROT0, "Mazooma","King Kong Cash (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR7061 KNOCKOUT KOUT SOUNDS -GAME( 200?, sc4knok ,0, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR7061) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4knoka ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR7061) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4knok ,0, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR7061) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4knoka ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR7061) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2057 KNOCK OUT PKOT SOUNDS KNOCK OUT -GAME( 200?, sc4knokb ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR2057) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4knokc ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR2057) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4knokb ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR2057) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4knokc ,sc4knok, sc4, sc4, sc4, ROT0, "Mazooma","Knockout (PR2057) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1209 LAS VEGAS 95004261 LASVEGAS PR7159 -GAME( 200?, sc4lasv ,0, sc4, sc4, sc4, ROT0, "BFM","Las Vegas (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lasva ,sc4lasv, sc4, sc4, sc4, ROT0, "BFM","Las Vegas (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lasv ,0, sc4, sc4, sc4, ROT0, "BFM","Las Vegas (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lasva ,sc4lasv, sc4, sc4, sc4, ROT0, "BFM","Las Vegas (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1001 LET IT ROLL PR1001 LETITROLL SOUNDS11 -GAME( 200?, sc4lir ,0, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lira ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lirb ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lirc ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lird ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lire ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lirf ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lirg ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lirh ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4liri ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lir ,0, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lira ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lirb ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lirc ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lird ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lire ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lirf ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lirg ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lirh ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4liri ,sc4lir, sc4, sc4, sc4, ROT0, "BFM","Let It Roll (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR7067CASINO LINE DANCER LINE SOUNDS LINE DANCER -GAME( 200?, sc4lined ,0, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lineda ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedb ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedc ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lined ,0, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lineda ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedb ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedc ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7067CASINO LINE DANCER LINE DANCER ARCADE LINE SOUNDS LINE DANCER -GAME( 200?, sc4linedd ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linede ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedf ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedg ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedh ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4linedi ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4linedd ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linede ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedf ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedg ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedh ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4linedi ,sc4lined, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7067CASINO LINE DANCER LINE SOUNDS LINE DANCER (same as above?) -GAME( 200?, sc4ldcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldcasa ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldcasb ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldcasc ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldcasd ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldcase ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ldcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldcasa ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldcasb ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldcasc ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldcasd ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldcase ,sc4ldcas, sc4, sc4, sc4, ROT0, "Mazooma","Line Dancer Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2421 LITTLEDEVIL CLUB LITTLEDEVIL CLUB CLILDEV SOUNDS CLUB LITTLEDEVIL -GAME( 200?, sc4ldvcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil Club (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ldvcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil Club (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1108 LOCKBUSTER PR1108 LOCKBUSTER SOUNDS11 -GAME( 200?, sc4lockb ,0, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockba ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbb ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbc ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbd ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbe ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbf ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lockbg ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lockb ,0, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockba ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbb ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbc ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbd ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbe ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbf ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lockbg ,sc4lockb, sc4, sc4, sc4, ROT0, "BFM","Lock Buster (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1321 CLUB LOCKBUSTER PR1321 CLUB LOCKBUSTER SOUNDS11 -GAME( 200?, sc4lkbcl ,0, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbclb ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbcle ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbclg ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lkbcl ,0, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbclb ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbcle ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbclg ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1321 CLUB LOCKBUSTER CLUB LOCKBUSTER CLUB PR1321 CLUB LOCKBUSTER SOUNDS11 -GAME( 200?, sc4lkbclh ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbcli ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lkbclh ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbcli ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1321 CLUB LOCKBUSTER EURO PR1321 CLUB LOCKBUSTER SOUNDS11 -GAME( 200?, sc4lkbcla ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbclc ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lkbcla ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbclc ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Euro) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1321 CLUB LOCKBUSTER FERRY PR1321 CLUB LOCKBUSTER SOUNDS11 -GAME( 200?, sc4lkbcld ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lkbclf ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lkbcld ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lkbclf ,sc4lkbcl, sc4, sc4, sc4, ROT0, "BFM","Lock Buster Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1115 LORD OF THE RINGS PR1115 L O T RINGS SOUNDS11 -GAME( 200?, sc4lotrf ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrfa ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotrf ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrfa ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1115 LORD OF THE RINGS ISS 2 PR1115 L O T RINGS SOUNDS11 -GAME( 200?, sc4lotrfb ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrfc ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrfd ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrfe ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrff ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrfg ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotrfb ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrfc ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrfd ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrfe ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrff ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrfg ,sc4lotrf, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Fellowship Of The Ring (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1115 LORD OF THE RINGS ISS 2 PR1115 L O T RINGS SOUNDS11 (the same as sc4lotrfb+ ?) -GAME( 200?, sc4lotrt ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings Triology (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrta ,sc4lotrt, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings Triology (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotrt ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings Triology (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrta ,sc4lotrt, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings Triology (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1315 TWO TOWERS PR1313 TWO TOWERS SOUNDS11 -GAME( 200?, sc4lotr2 ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2a ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2b ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2c ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2d ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2e ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2j ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2k ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2l ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2m ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotr2 ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2a ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2b ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2c ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2d ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2e ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2j ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2k ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2l ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2m ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1315 TWO TOWERS PR1313 TWO TOWERS SOUNDS11 TWO TOWERS S.SITE -GAME( 200?, sc4lotr2f ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2g ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2h ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotr2i ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotr2f ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2g ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2h ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotr2i ,sc4lotr2, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR1420 CLUB LOTR TWO TOWERS PR1420 CLUB TWOTOWERS SOUNDS11 -GAME( 200?, sc4ltr2c ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2ca ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cb ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cc ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cd ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2ce ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cf ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cg ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ltr2c ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2ca ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cb ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cc ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cd ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2ce ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cf ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cg ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1420 CLUB LOTR TWO TOWERS PR1420 CLUB TWOTOWERS SOUNDS11 CLUB TWO TOWERS -GAME( 200?, sc4ltr2ch ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2ci ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2cj ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ltr2ck ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ltr2ch ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2ci ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2cj ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ltr2ck ,sc4ltr2c, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - The Two Towers Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR2085 LUCKY SEVENS LUCKY SOUNDS -GAME( 200?, sc4luck7 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luck7a ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luck7b ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luck7c ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4luck7 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luck7a ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luck7b ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luck7c ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2085 LUCKY SEVENS LUCKY SEVENS ARCADE LUCKY SOUNDS LUCKY SEVENS -GAME( 200?, sc4luck7d ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4luck7d ,sc4luck7, sc4, sc4, sc4, ROT0, "Mazooma","Lucky 7s (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1033 CASINO LUCKY BALLS PR1033 LUCKY BALLS SOUNDS11 -GAME( 200?, sc4luckb ,0, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckba ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbb ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbc ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbd ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbe ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbf ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbg ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbh ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbi ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbj ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbk ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbl ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbm ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbn ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbo ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbp ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbt ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbu ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbv ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbw ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbx ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4luckb ,0, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckba ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbb ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbc ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbd ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbe ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbf ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbg ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbh ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbi ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbj ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbk ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbl ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbm ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbn ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbo ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbp ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbt ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbu ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbv ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbw ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbx ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino (Bellfruit) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PR1033 CASINO LUCKY BALLS PR1033 LUCKY BALLS SOUNDS11 LUCKY BALLS ARCADE -GAME( 200?, sc4luckbq ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbr ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbs ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckby ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4luckbz ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4luckb0 ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4luckbq ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbr ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbs ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckby ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4luckbz ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4luckb0 ,sc4luckb, sc4, sc4, sc4, ROT0, "BFM","Lucky Balls Casino Arcade (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 011 MAGICSND -GAME( 200?, sc4magci ,0, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcik ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magci ,0, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcik ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 021 MAGICSND -GAME( 200?, sc4magcia ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcil ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcia ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcil ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (021) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 031 MAGICSND -GAME( 200?, sc4magcib ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcim ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcib ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcim ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (031) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 012 MAGICSND -GAME( 200?, sc4magcic ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcin ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcid ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcio ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcic ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcin ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcid ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcio ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (012) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) //P R2535 MAGIC CIRCLE STANDARD 022 MAGICSND -GAME( 200?, sc4magcie ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcip ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcie ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcip ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (022) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 032 MAGICSND -GAME( 200?, sc4magcif ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magciq ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcif ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magciq ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (032) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 013 MAGICSND -GAME( 200?, sc4magcig ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcir ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcig ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcir ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (013) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 014 MAGICSND -GAME( 200?, sc4magcih ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcis ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcih ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcis ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (014) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 024 MAGICSND -GAME( 200?, sc4magcii ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magcit ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcii ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magcit ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (024) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2535 MAGIC CIRCLE STANDARD 034 MAGICSND -GAME( 200?, sc4magcij ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magciu ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magcij ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magciu ,sc4magci, sc4, sc4, sc4, ROT0, "Qps","Magic Circle (034) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2520 MAGIC POUND ABOUT V1.0 MAGICPOUNDABOUTSND MAGIC POUNDABOUT -GAME( 200?, sc4magic ,0, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magica ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magicb ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4magicc ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4magic ,0, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magica ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magicb ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4magicc ,sc4magic, sc4, sc4, sc4, ROT0, "Qps","Magic Poundabout (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2019 MAXIMUS CASH MAX SOUNDS MAXIMUS CASH -GAME( 200?, sc4maxim ,0, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maxima ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maximb ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maximc ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maximd ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maxime ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maximf ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maximg ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4maxim ,0, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maxima ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maximb ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maximc ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maximd ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maxime ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maximf ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maximg ,sc4maxim, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2130 CLUB MAXIMUS CASH MAXIMUS CASH CLUB CMAX SOUNDS MAXIMUS CASH -GAME( 200?, sc4maxcc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maxcca ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maxccb ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4maxccc ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4maxcc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maxcca ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maxccb ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4maxccc ,sc4maxcc, sc4, sc4, sc4, ROT0, "Mazooma","Maximus Cash Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1217 MILJONAIRSART12 95004305 MILJONAIRE PR1157 -GAME( 200?, sc4miljo ,0, sc4, sc4, sc4, ROT0, "BFM","Miljonairs (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4miljo ,0, sc4, sc4, sc4, ROT0, "BFM","Miljonairs (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR1223 MILJONAIRS 95004305 MILJONAIRE PR1157 -GAME( 200?, sc4milja ,0, sc4, sc4, sc4, ROT0, "BFM","Miljonairs Arcade (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4milja ,0, sc4, sc4, sc4, ROT0, "BFM","Miljonairs Arcade (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6904 MONEY BAGS PR6904 MONEY BAGS SOUNDS11 -GAME( 200?, sc4mbags ,0, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mbagsa ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mbagsb ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mbagsc ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mbags ,0, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mbagsa ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mbagsb ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mbagsc ,sc4mbags, sc4, sc4, sc4, ROT0, "BFM","Money Bags (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1132 CASINO MONEY GO ROUND PR1132 MONEY GO ROUND SOUNDS11 -GAME( 200?, sc4mgr ,0, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgra ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgrh ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgri ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mgr ,0, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgra ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgrh ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgri ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1132 CASINO MONEY GO ROUND PR1132 MONEY GO ROUND SOUNDS11 MONEY GO ROUND S.SITE -GAME( 200?, sc4mgrb ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgrc ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgrd ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgre ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgrf ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mgrg ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mgrb ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgrc ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgrd ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgre ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgrf ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mgrg ,sc4mgr, sc4, sc4, sc4, ROT0, "BFM","Money Go Round Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1325 CASINO MONEY SPIDER PR1325 MONEYSPIDER SOUNDS11 -GAME( 200?, sc4mspid ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspida ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidb ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidc ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidd ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspide ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidf ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidg ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidj ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidk ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidl ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidm ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mspid ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspida ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidb ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidc ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidd ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspide ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidf ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidg ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidj ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidk ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidl ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidm ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1325 CASINO MONEY SPIDER MONEY SPIDER ARCADE PR1325 MONEYSPIDER SOUNDS11 -GAME( 200?, sc4mspidh ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mspidi ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mspidh ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mspidi ,sc4mspid, sc4, sc4, sc4, ROT0, "BFM","Money Spider Casino Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1040 MONEY SPINNER PR1040 MON S CLUB SOUNDS11 -GAME( 200?, sc4msclb ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclba ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbb ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbc ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbd ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbe ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbf ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4msclbg ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4msclb ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclba ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbb ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbc ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbd ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbe ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbf ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4msclbg ,sc4msclb, sc4, sc4, sc4, ROT0, "BFM","Money Spinner Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR6803 MONEY TO BURN PR6803 BURN SOUNDS11 -GAME( 200?, sc4mtb ,0, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtba ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbb ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbe ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbf ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbg ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbj ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mtb ,0, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtba ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbb ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbe ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbf ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbg ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbj ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR4603 MONEY TO BURN SP98 PR6803 BURN SOUNDS11 -GAME( 200?, sc4mtbc ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbd ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbh ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbi ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mtbc ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbd ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbh ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbi ,sc4mtb, sc4, sc4, sc4, ROT0, "BFM","Money To Burn SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6932 CLUB MONEY TO BURN PR6932 BURN SOUNDS11 -GAME( 200?, sc4mtbcl ,0, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcla ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclb ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclc ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcld ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcle ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclf ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclg ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclh ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcli ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclj ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclk ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcll ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclm ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbcln ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mtbclo ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mtbcl ,0, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcla ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclb ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclc ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcld ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcle ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclf ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclg ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclh ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcli ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclj ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclk ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcll ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclm ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbcln ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mtbclo ,sc4mtbcl, sc4, sc4, sc4, ROT0, "BFM","Money To Burn Club (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR7029 MONEY TO MONEY MTOM SOUNDS -GAME( 200?, sc4m2m ,0, sc4, sc4, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4m2ma ,sc4m2m, sc4, sc4, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4m2m ,0, sc4, sc4, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4m2ma ,sc4m2m, sc4, sc4, sc4, ROT0, "Mazooma","Money To Money (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2121 MONOPOLY MPLY SOUNDS MONOPOLY -GAME( 200?, sc4monob ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monoba ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobb ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobc ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobd ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobe ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobf ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobg ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobh ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobi ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobj ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobk ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobl ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monobm ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4monob ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monoba ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobb ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobc ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobd ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobe ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobf ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobg ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobh ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobi ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobj ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobk ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobl ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monobm ,sc4monob, sc4, sc4, sc4, ROT0, "BFM","Monopoly (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR2055.GERMAN MONOPOLY... (non-standard header) -GAME( 200?, sc4monod ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monoda ,sc4monod, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monodb ,sc4monod, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4monod ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monoda ,sc4monod, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monodb ,sc4monod, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (Mazooma) [German] (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2164 CLUB MONOPOLY CLB MONOPOLY WOW CLUB CWOW SOUNDS CLUB MONOPOLOY -GAME( 200?, sc4mclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mclba ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mclbb ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mclbc ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mclbd ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mclbe ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mclba ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mclbb ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mclbc ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mclbd ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mclbe ,sc4mclb, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Club (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2202 MONOPOLY MONOPOLY TRIPLE MAZ MONOPOLY DELUXE (same as sc4mondx?) -GAME( 200?, sc4mdlx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mdlx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2510 MONTEGO PAY LOWTECHSND MONTEGO PAY -GAME( 200?, sc4mont ,0, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monta ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4montb ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4montc ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4montd ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monte ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4montf ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4montg ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4month ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4monti ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mont ,0, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monta ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4montb ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4montc ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4montd ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monte ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4montf ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4montg ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4month ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4monti ,sc4mont, sc4, sc4, sc4, ROT0, "Qps","Montego Pay (Qps) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR6806 MOTORWAY MAYHEM PR6806 MAYH SOUNDS11 -GAME( 200?, sc4motor ,0, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motora ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motorb ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motorc ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motord ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motore ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motorf ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motorg ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4motorh ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4motor ,0, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motora ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motorb ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motorc ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motord ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motore ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motorf ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motorg ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4motorh ,sc4motor, sc4, sc4, sc4, ROT0, "BFM","Motorway Mania (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2523 MOVE ON UP V1.0 MOVEONUPSND MOVE ON UP -GAME( 200?, sc4mou ,0, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4moua ,sc4mou, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4moub ,sc4mou, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mou ,0, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4moua ,sc4mou, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4moub ,sc4mou, sc4, sc4, sc4, ROT0, "Qps","Move On Up (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2171 NEVER MIND JPS NMTJ SOUNDS NEVER MIND JPS -GAME( 200?, sc4nmtj ,0, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmtja ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmtjb ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmtjc ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmtjd ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4nmtj ,0, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmtja ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmtjb ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmtjc ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmtjd ,sc4nmtj, sc4, sc4, sc4, ROT0, "Mazooma","Never Mind The Jackpots (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2043 NUDGE IT WILD SOUNDS NUDGE IT -GAME( 200?, sc4nudit ,0, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nudita ,sc4nudit, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nuditb ,sc4nudit, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4nudit ,0, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nudita ,sc4nudit, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nuditb ,sc4nudit, sc4, sc4, sc4, ROT0, "Mazooma","Nudge It (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR1310 AWP OFF YOUR FACE PR1310 OFF YOUR FACE SOUNDS11 -GAME( 200?, sc4oyf ,0, sc4, sc4, sc4, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4oyfa ,sc4oyf, sc4, sc4, sc4, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4oyf ,0, sc4, sc4, sc4, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4oyfa ,sc4oyf, sc4, sc4, sc4, ROT0, "BFM","Off Your Face (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1106 OPEN SESAME PR1106 OPEN SESAME SOUNDS11 -GAME( 200?, sc4opses ,0, sc4, sc4, sc4, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4opsesa ,sc4opses, sc4, sc4, sc4, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4opses ,0, sc4, sc4, sc4, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4opsesa ,sc4opses, sc4, sc4, sc4, ROT0, "BFM","Open Sesame (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6908 OUTLAW PR6908 OUTLAW SOUNDS11 -GAME( 200?, sc4outlw ,0, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4outlwa ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4outlwb ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4outlwc ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4outlw ,0, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4outlwa ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4outlwb ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4outlwc ,sc4outlw, sc4, sc4, sc4, ROT0, "BFM","Outlaw (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7026 PACMAN PACMAN SOUNDS -GAME( 200?, sc4pacmn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacmna ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacmnb ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pacmn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacmna ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacmnb ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7026) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR7072 PAC MAN PACP SOUNDS PAC-MAN -GAME( 200?, sc4pacmnc ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacmnd ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacmne ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pacmnc ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacmnd ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacmne ,sc4pacmn, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man (PR7072) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7049CASINO PACMAN PACMAN SOUNDS -GAME( 200?, sc4paccs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsa ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsb ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsc ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsd ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccse ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsf ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsg ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsh ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsi ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsj ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsk ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccsl ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4paccs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsa ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsb ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsc ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsd ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccse ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsf ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsg ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsh ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsi ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsj ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsk ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccsl ,sc4paccs, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Casino (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) // PR2018 PACMAN CLUB CLUB PACMAN SOUNDS PACMAN C L U B -GAME( 200?, sc4paccl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4paccla ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacclb ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacclc ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4paccl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4paccla ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacclb ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacclc ,sc4paccl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7058 PACMAN PACP SOUNDS PACMAN PLUS -GAME( 200?, sc4pacpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacpla ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacplb ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacplc ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacpld ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacple ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacplf ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacplg ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pacplh ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pacpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacpla ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacplb ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacplc ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacpld ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacple ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacplf ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacplg ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pacplh ,sc4pacpl, sc4, sc4, sc4, ROT0, "Mazooma","Pac Man Plus (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2031 PACMANIA ANIA SOUNDS PACMANIA -GAME( 200?, sc4pmani ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Mania (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pmania ,sc4pmani, sc4, sc4, sc4, ROT0, "Mazooma","Pac Mania (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pmani ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pac Mania (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pmania ,sc4pmani, sc4, sc4, sc4, ROT0, "Mazooma","Pac Mania (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7151 PARTY TIME 1.02 95008113 G PARTYTIME SOUNDS11 -GAME( 200?, sc4party ,0, sc4, sc4, sc4, ROT0, "Nova","Party Time (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4party ,0, sc4, sc4, sc4, ROT0, "Nova","Party Time (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1205 PAY TIME 95004224 PAYTIME PR7156 PAY TIME -GAME( 200?, sc4paytm ,0, sc4, sc4, sc4, ROT0, "BFM","Pay Time (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4paytm ,0, sc4, sc4, sc4, ROT0, "BFM","Pay Time (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1012 PHARAOH'S GOLD PR1012 PHARAOHS GOLD SOUNDS11 -GAME( 200?, sc4pgold ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pgolda ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pgoldb ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pgoldc ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pgoldd ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pgoldf ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pgold ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pgolda ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pgoldb ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pgoldc ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pgoldd ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pgoldf ,sc4pgold, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1261 PHARAOH'S GOLD 95004316 CAS PHAR GOLD PR1261 -GAME( 200?, sc4pglcs ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglcsa ,sc4pglcs, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglcsb ,sc4pglcs, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pglcs ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglcsa ,sc4pglcs, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglcsb ,sc4pglcs, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2236 CLUB PINK PANTHER 411 CLUBPINKPANTHERSND CLUB PINKPANTHER -GAME( 200?, sc4ppclb ,0, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // also in a set marked 'Pink Pannther Think Pink' -GAME( 200?, sc4ppclbb ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppclb ,0, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // also in a set marked 'Pink Pannther Think Pink' +GAME( 200?, sc4ppclbb ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2236 CLUB PINK PANTHER 412 CLUBPINKPANTHERSND CLUB PINKPANTHER -GAME( 200?, sc4ppclba ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppclbc ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppclba ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppclbc ,sc4ppclb, sc4, sc4, sc4, ROT0, "Qps","Pink Panther Club (412) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2110 PIPING HOT PIPE SOUNDS PIPING HOT -GAME( 200?, sc4pipe ,0, sc4, sc4, sc4, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pipea ,sc4pipe, sc4, sc4, sc4, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pipe ,0, sc4, sc4, sc4, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pipea ,sc4pipe, sc4, sc4, sc4, ROT0, "Mazooma","Piping Hot (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS142 CLUB PLUMB CRAZY 413 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY -GAME( 200?, sc4plumb ,0, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4plumba ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4plumb ,0, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4plumba ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (413) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS142 CLUB PLUMB CRAZY 411 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY -GAME( 200?, sc4plumbb ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4plumbc ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4plumbb ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4plumbc ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS142 CLUB PLUMB CRAZY 412 CLUBPLUMBCRAZYSND CLUB PLUMB CRAZY -GAME( 200?, sc4plumbd ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4plumbe ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4plumbd ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4plumbe ,sc4plumb, sc4, sc4, sc4, ROT0, "Qps","Plumb Crazy Club (412) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7009 POLE POSITION POLE POSITION SOUNDS -GAME( 200?, sc4polem ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4polema ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4polemb ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4polemc ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4polemd ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4polem ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4polema ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4polemb ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4polemc ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4polemd ,sc4polem, sc4, sc4, sc4, ROT0, "Mazooma","Pole Position (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR7012 GERMAN POLE POSITION PR7012 SOUNDS -GAME( 200?, sc4polen ,0, sc4, sc4, sc4, ROT0, "Nova","Pole Position (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4polen ,0, sc4, sc4, sc4, ROT0, "Nova","Pole Position (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2514 POLICE SQUID V1.0 POLICESQUIDSND POLICE SQUID -GAME( 200?, sc4polic ,0, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4policb ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4polic ,0, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4policb ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2514 POLICE SQUID V2.0 POLICESQUIDSND POLICE SQUID -GAME( 200?, sc4polica ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4policc ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4polica ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4policc ,sc4polic, sc4, sc4, sc4, ROT0, "Qps","Police Squid (V2.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS143 POT SHOT V1.0 POTSHOTSND POT SHOT -GAME( 200?, sc4potsh ,0, sc4, sc4, sc4, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4potsha ,sc4potsh, sc4, sc4, sc4, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4potsh ,0, sc4, sc4, sc4, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4potsha ,sc4potsh, sc4, sc4, sc4, ROT0, "Qps","Pot Shot (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3083 CLUB POTS OF GOLD POTS OF GOLD CLUB PR3082 C POTS OF GOLD SOUNDS11 POTS OF GOLD -GAME( 200?, sc4pogbl ,0, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogbla ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogblb ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogblc ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pogbl ,0, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogbla ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogblb ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogblc ,sc4pogbl, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6810 POWER CRAZY PR6810 POWER SOUNDS11 -GAME( 200?, sc4pwcrz ,0, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrza ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrzb ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrze ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrzf ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4pwcrzg ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwcrz ,0, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrza ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrzb ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrze ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrzf ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4pwcrzg ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR4610 POWER CRAZY SP98 PR6810 POWER SOUNDS11 -GAME( 200?, sc4pwcrzc ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrzd ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrzh ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwcrzi ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwcrzc ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrzd ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrzh ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwcrzi ,sc4pwcrz, sc4, sc4, sc4, ROT0, "BFM","Power Crazy SP98 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2053 POWERSURGE SURGESND POWERSURGE -GAME( 200?, sc4pwrsg ,0, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrsga ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrsgb ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrsgc ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwrsg ,0, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrsga ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrsgb ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrsgc ,sc4pwrsg, sc4, sc4, sc4, ROT0, "Qps","Power Surge (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7054 POWER BALL POWERBALL SOUNDS -GAME( 200?, sc4pwrbq ,0, sc4, sc4, sc4, ROT0, "Qps","Powerball (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrbqa ,sc4pwrbq, sc4, sc4, sc4, ROT0, "Qps","Powerball (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwrbq ,0, sc4, sc4, sc4, ROT0, "Qps","Powerball (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrbqa ,sc4pwrbq, sc4, sc4, sc4, ROT0, "Qps","Powerball (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1303 THE PRIZE IS RIGHT PR1303 T PRIZE I R SOUNDS11 -GAME( 200?, sc4pir ,0, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pira ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pirb ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pirc ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pird ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pire ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pirf ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pirg ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pir ,0, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pira ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pirb ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pirc ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pird ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pire ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pirf ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pirg ,sc4pir, sc4, sc4, sc4, ROT0, "BFM","The Prize Is Right (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR6914 PUBLIC ENEMY PR6914 PUBLIC ENEMY SOUNDS11 PUBLIC ENEMY -GAME( 200?, sc4pen1 ,0, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pen1a ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pen1b ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pen1c ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pen1d ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pen1 ,0, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pen1a ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pen1b ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pen1c ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pen1d ,sc4pen1, sc4, sc4, sc4, ROT0, "BFM","Public Enemy No1 (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1191 QUARTERBACK QBCK SOUNDS QUARTERBACK -GAME( 200?, sc4quart ,0, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quarta ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4quart ,0, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quarta ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QUARTERBACK .PR2072.ITALIAN QUARTERBACK.. (non-standard header) -GAME( 200?, sc4quartb ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quarte ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quarti ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartk ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4quartb ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quarte ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quarti ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartk ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2072) (Italian) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // QUARTERBACK .PR2064.GERMAN QUARTERBACK.. (non-standard header) -GAME( 200?, sc4quartc ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartd ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartf ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartg ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quarth ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartj ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartl ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quartm ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4quartc ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartd ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartf ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartg ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quarth ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartj ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartl ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quartm ,sc4quart, sc4, sc4, sc4, ROT0, "Mazooma","Quaterback (PR2064) (German) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // QUAZZI MO' DOUGH..........QUAZZSND....... (no standard header) -GAME( 200?, sc4qmodo ,0, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4qmodoa ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4qmodob ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4qmodoc ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4qmodod ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4qmodo ,0, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4qmodoa ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4qmodob ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4qmodoc ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4qmodod ,sc4qmodo, sc4, sc4, sc4, ROT0, "Qps","Quazzi Mo Dough (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc4quidr ,0, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidra ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidrb ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidrc ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4quidr ,0, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidra ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidrb ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidrc ,sc4quidr, sc4, sc4, sc4, ROT0, "Qps","Quid Rock (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1206 RED ALERT 95004266 REDALERT PR1051 -GAME( 200?, sc4redad ,0, sc4, sc4, sc4, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4redada ,sc4redad, sc4, sc4, sc4, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4redad ,0, sc4, sc4, sc4, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4redada ,sc4redad, sc4, sc4, sc4, ROT0, "BFM","Red Alert (Dutch) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2542 RED DRAGON 011 REDDRAGONSND RED DRAGON -GAME( 200?, sc4rdrag ,0, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rdraga ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rdrag ,0, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rdraga ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2542 RED DRAGON 021 REDDRAGONSND RED DRAGON -GAME( 200?, sc4rdragc ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rdragf ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rdragc ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rdragf ,sc4rdrag, sc4, sc4, sc4, ROT0, "Qps","Red Dragon (021) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS160 CLUB RED DRAGON 411 CLUBREDDRAGONSND CLUB RED DRAGON -GAME( 200?, sc4rdrcl ,0, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rdrclb ,sc4rdrcl, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rdrcl ,0, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rdrclb ,sc4rdrcl, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (411) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS160 CLUB RED DRAGON 412 CLUBREDDRAGONSND CLUB RED DRAGON -GAME( 200?, sc4rdrcla ,sc4rdrcl, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (412) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rdrcla ,sc4rdrcl, sc4, sc4, sc4, ROT0, "Qps","Red Dragon Club (412) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6902 RED HOT IBIZA PR6902 IBIZ SOUNDS11 -GAME( 200?, sc4ibiza ,0, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizaa ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizab ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizac ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizad ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizae ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizaf ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizag ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizah ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ibizai ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ibiza ,0, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizaa ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizab ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizac ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizad ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizae ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizaf ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizag ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizah ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ibizai ,sc4ibiza, sc4, sc4, sc4, ROT0, "BFM","Red Hot Ibiza (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 RED HOT X CLUB REDX SOUNDS RED HOT X CLUB -GAME( 200?, sc4rhxcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcla ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxclb ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxclc ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rhxcl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcla ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxclb ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxclc ,sc4rhxcl, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2037 REEL TO REEL RTOR SOUNDS REEL 2 REEL -GAME( 200?, sc4r2r ,0, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4r2ra ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4r2rb ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4r2rc ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4r2r ,0, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4r2ra ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4r2rb ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4r2rc ,sc4r2r, sc4, sc4, sc4, ROT0, "Mazooma","Reel To Reel (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1015 REELY CRAZY PR1015 REELY CRAZY SOUNDS11 -GAME( 200?, sc4relcz ,0, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4relcza ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4relczb ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4relczc ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4relcz ,0, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4relcza ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4relczb ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4relczc ,sc4relcz, sc4, sc4, sc4, ROT0, "BFM","Reely Crazy (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2132 RETURN OF THE COUNT ROTC SOUNDS THE COUNT -GAME( 200?, sc4rotc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rotca ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rotcb ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rotcc ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rotcd ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rotc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rotca ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rotcb ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rotcc ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rotcd ,sc4rotc, sc4, sc4, sc4, ROT0, "Mazooma","Return Of The Count (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1252 REVOLUTION NEXT 95004320 REVOLUTIONTN PR1252 -GAME( 200?, sc4rvlnx ,0, sc4, sc4, sc4, ROT0, "BFM","Revolution The Next (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rvlnx ,0, sc4, sc4, sc4, ROT0, "BFM","Revolution The Next (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1203 REVOLUTION 95004259 REVOLUTION PR7158 -GAME( 200?, sc4rvl ,0, sc4, sc4, sc4, ROT0, "BFM","Revolution (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rvl ,0, sc4, sc4, sc4, ROT0, "BFM","Revolution (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2020 REVOLVER REV SOUNDS REVOLVER -GAME( 200?, sc4revo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4revoa ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4revob ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4revoc ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4revod ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4revoe ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4revo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4revoa ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4revob ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4revoc ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4revod ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4revoe ,sc4revo, sc4, sc4, sc4, ROT0, "Mazooma","Revolver (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7118 RICH GEEZER PR7118 RICH GEEZER SOUNDS11 -GAME( 200?, sc4rich ,0, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richa ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richb ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richc ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richd ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4riche ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richf ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richg ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richh ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richi ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richj ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richk ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4richl ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rich ,0, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richa ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richb ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richc ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richd ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4riche ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richf ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richg ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richh ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richi ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richj ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richk ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4richl ,sc4rich, sc4, sc4, sc4, ROT0, "BFM","Rich Geezer (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) // PR1222 RIO GRANDE 95004309 RIO GRANDE SOUNDS11 -GAME( 200?, sc4rio ,0, sc4, sc4, sc4, ROT0, "BFM","Rio Grande (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rio ,0, sc4, sc4, sc4, ROT0, "BFM","Rio Grande (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2089 RISE TO THE TOP RISE SOUNDS RISE TO THE TOP -GAME( 200?, sc4rttt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rttta ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtttb ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtttc ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtttd ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rttte ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rttt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rttta ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtttb ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtttc ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtttd ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rttte ,sc4rttt, sc4, sc4, sc4, ROT0, "Mazooma","Rise To The Top (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2527 ROCKET SCIENCE V1.1 ROCKETSCIENCESND ROCKET SCIENCE -GAME( 200?, sc4roksc ,0, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rokscb ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4roksc ,0, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rokscb ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2527 ROCKET SCIENCE 011 ROCKETSCIENCESND ROCKET SCIENCE -GAME( 200?, sc4roksca ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rokscc ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4roksca ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rokscc ,sc4roksc, sc4, sc4, sc4, ROT0, "Qps","Rocket Science (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2060 ROGAN DOSH ROGANSND ROGAN DOSH -GAME( 200?, sc4rogds ,0, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rogdsa ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rogdsb ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rogdsc ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rogds ,0, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rogdsa ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rogdsb ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rogdsc ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2060 ROGAN DOSH V1.6 ROGANSND ROGAN DOSH -GAME( 200?, sc4rogdse ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v1.6) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rogdse ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v1.6) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2060 ROGAN DOSH V2.0 ROGANSND ROGAN DOSH -GAME( 200?, sc4rogdsd ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rogdsf ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rogdsd ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rogdsf ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2060 ROGAN DOSH V2.1 ROGANSND ROGAN DOSH -GAME( 200?, sc4rogdsg ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.1) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rogdsg ,sc4rogds, sc4, sc4, sc4, ROT0, "Qps","Rogan Dosh (v2.1) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1031 CASINO ROLL ME OVER PR1031 ROLL ME OVER SOUNDS11 -GAME( 200?, sc4rmo ,0, sc4, sc4, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rmoa ,sc4rmo, sc4, sc4, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rmo ,0, sc4, sc4, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rmoa ,sc4rmo, sc4, sc4, sc4, ROT0, "BFM","Roll Me Over Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2034 ROLLING THUNDER ROL SOUNDS ROLLING THUNDER -GAME( 200?, sc4rt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rta ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtb ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtc ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtd ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rta ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtb ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtc ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtd ,sc4rt, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2051 CLUB ROLLING THUNDER CLRT SOUNDS ROLLING THUNDER -GAME( 200?, sc4rtclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rtclba ,sc4rtclb, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rtclb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rtclba ,sc4rtclb, sc4, sc4, sc4, ROT0, "Mazooma","Rolling Thunder Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7002 ROLLOVER JACKPOT PR7002 ROLLOVER SOUNDS -GAME( 200?, sc4rollo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rolloa ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rolloc ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rollod ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rollo ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rolloa ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rolloc ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rollod ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7002) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7032 ROLLOVER JACKPOT PR7002 ROLLOVER SOUNDS -GAME( 200?, sc4rollob ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rolloe ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rollof ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rollob ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rolloe ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rollof ,sc4rollo, sc4, sc4, sc4, ROT0, "Mazooma","Rollover Jackpot (PR7032) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2086 ROUTE66 RT66 SOUNDS ROUTE 66 -GAME( 200?, sc4r66 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Route 66 (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4r66 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Route 66 (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1111 ROYAL BANKER PR1111 ROYLEBANKER SOUNDS11 -GAME( 200?, sc4rbank ,0, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rbanka ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rbankb ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rbankc ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rbank ,0, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rbanka ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rbankb ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rbankc ,sc4rbank, sc4, sc4, sc4, ROT0, "BFM","Royle Banker (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1102 ROYLEFAMILY PR1102 ROYLEFAMILY SOUNDS11 -GAME( 200?, sc4royle ,0, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylea ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4royleb ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylec ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4royled ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylee ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4royleh ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylei ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4royle ,0, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylea ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4royleb ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylec ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4royled ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylee ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4royleh ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylei ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1102 ROYLEFAMILY REV2 PR1102 ROYLEFAMILY SOUNDS11 -GAME( 200?, sc4roylef ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4royleg ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylej ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylek ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylel ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4roylem ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4roylef ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4royleg ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylej ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylek ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylel ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4roylem ,sc4royle, sc4, sc4, sc4, ROT0, "BFM","Royle Family (REV 2) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7141 SHAKE RATTLE ROLL LINE SOUNDS * SHAKE RATT ROLL -GAME( 200?, sc4srrmz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4srrmz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR7079CASINO SHAKE RATTLE AND ROL PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS ROCK AND ROLL -GAME( 200?, sc4srrmza ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzb ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzc ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmze ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4srrmza ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzb ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzc ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmze ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7079CASINO SHAKE RATTLE AND ROL PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS ROCK AND ROLL (the same as some of the above.. ) -GAME( 200?, sc4srrca ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrcaa ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrcab ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrcac ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrcad ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrcae ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4srrca ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrcaa ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrcab ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrcac ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrcad ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrcae ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Casino (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR7079CASINO SHAKE RATTLE AND ROL SHAK RATTLE ROLL ARCADE PR7079,Casino SHAKE RATTLE AND ROLL, LINE SOUNDS -GAME( 200?, sc4srrmzd ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzf ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzg ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzh ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzi ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzj ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzk ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzl ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrmzm ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4srrmzd ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzf ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzg ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzh ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzi ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzj ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzk ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzl ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrmzm ,sc4srrmz, sc4, sc4, sc4, ROT0, "Mazooma","Shake Rattle Roll Arcade (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2117 SIDE SPLITTER SSPT SOUNDS SIDE SPLITTER -GAME( 200?, sc4sidsp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sidspa ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sidspb ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sidspc ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sidsp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sidspa ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sidspb ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sidspc ,sc4sidsp, sc4, sc4, sc4, ROT0, "Mazooma","Side Splitter (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7076 GERMAN SINBAD2001 PR7076,German SINBAD2001, PR7076 SOUNDS V1 -GAME( 200?, sc4s2k ,0, sc4, sc4, sc4, ROT0, "Nova","Sinbad 2000 (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4s2k ,0, sc4, sc4, sc4, ROT0, "Nova","Sinbad 2000 (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2004CASINO SIR PRIZE LINE SOUNDS SIR PRIZE 8 + -GAME( 200?, sc4sirpz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR2004) (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sirpz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR2004) (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7079CASINO SIR PRIZE PR7079,Casino SIR PRIZE, LINE SOUNDS SIR PRIZE -GAME( 200?, sc4sirpza ,sc4sirpz, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR7079) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sirpzb ,sc4sirpz, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR7079) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sirpza ,sc4sirpz, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR7079) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sirpzb ,sc4sirpz, sc4, sc4, sc4, ROT0, "Mazooma","Sir Prize (PR7079) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6905 SKY'S THE LIMIT PR6905 SKY'S THE LIMIT SOUNDS11 -GAME( 200?, sc4stl ,0, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stla ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stlb ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stlc ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stld ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stle ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stlf ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stlg ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4stl ,0, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stla ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stlb ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stlc ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stld ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stle ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stlf ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stlg ,sc4stl, sc4, sc4, sc4, ROT0, "BFM","Sky's The Limit, The (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR6924 SMOKIN SEVENS PR6924 SMOKIN SEVENS SOUNDS11 -GAME( 200?, sc4smk7 ,0, sc4, sc4, sc4, ROT0, "BFM","Smoking 7's (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4smk7 ,0, sc4, sc4, sc4, ROT0, "BFM","Smoking 7's (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1105 SNAKE RATTLE 'N' ROLL PR1105 SNAKERR SOUNDS11 -GAME( 200?, sc4srr ,0, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srra ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrb ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4srrc ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4srr ,0, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srra ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrb ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4srrc ,sc4srr, sc4, sc4, sc4, ROT0, "BFM","Snake Rattle 'n' Roll (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1423 CLUB SNAKES N LADDERS PR1423 CSNK SOUNDS11 SNAKES N LADDERS -GAME( 200?, sc4slc ,0, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcb ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcc ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slce ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slci ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcm ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcn ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4slc ,0, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcb ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcc ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slce ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slci ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcm ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcn ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR1423 CLUB SNAKES N LADDERS SNAKES N LADDERS CLUB PR1423 CSNK SOUNDS11 SNAKES N LADDERS -GAME( 200?, sc4slca ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcd ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcf ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcg ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slch ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcj ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slck ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slcl ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4slca ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcd ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcf ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcg ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slch ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcj ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slck ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slcl ,sc4slc, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders Club (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) // PR1010 SOLID GOLD PR1010 SOLID GOLD SOUNDS11 -GAME( 200?, sc4solgl ,0, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4solgla ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4solglb ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4solglc ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4solgl ,0, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4solgla ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4solglb ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4solglc ,sc4solgl, sc4, sc4, sc4, ROT0, "BFM","Solid Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2145 SOME LIKE IT HOT SLIH SOUNDS SOME LIKE IT HOT -GAME( 200?, sc4slih ,0, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sliha ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slihb ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slihc ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slihd ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slihe ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4slih ,0, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sliha ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slihb ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slihc ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slihd ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slihe ,sc4slih, sc4, sc4, sc4, ROT0, "Mazooma","Some Like It Hot (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2509 SPACE ACE V2.2 SPACESND SPACE ACE -GAME( 200?, sc4sace ,0, sc4, sc4, sc4, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sacea ,sc4sace, sc4, sc4, sc4, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sace ,0, sc4, sc4, sc4, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sacea ,sc4sace, sc4, sc4, sc4, ROT0, "Qps","Space Ace (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2506 SPACEBUSTER BUSTERSND SPACEBUSTER -GAME( 200?, sc4sbust ,0, sc4, sc4, sc4, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sbusta ,sc4sbust, sc4, sc4, sc4, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sbust ,0, sc4, sc4, sc4, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sbusta ,sc4sbust, sc4, sc4, sc4, ROT0, "Qps","Space Buster (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7055 SPLASH N GRAB GRAB SOUNDS -GAME( 200?, sc4splgb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4splgba ,sc4splgb, sc4, sc4, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4splgb ,0, sc4, sc4, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4splgba ,sc4splgb, sc4, sc4, sc4, ROT0, "Mazooma","Splash & Grab (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2044 CASINO SPREAD YOUR BET SBET SOUNDS SPREAD YOUR BET -GAME( 200?, sc4spred ,0, sc4, sc4, sc4, ROT0, "Mazooma","Spread Your Bet (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4spred ,0, sc4, sc4, sc4, ROT0, "Mazooma","Spread Your Bet (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6915 stag night PR6915 STAG NIGHT SOUNDS11 -GAME( 200?, sc4stag ,0, sc4, sc4, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4staga ,sc4stag, sc4, sc4, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4stag ,0, sc4, sc4, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4staga ,sc4stag, sc4, sc4, sc4, ROT0, "BFM","Stag Night (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6805 STARPRIZE PR6805 STARPRIZE SOUNDS -GAME( 200?, sc4starp ,0, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpa ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpb ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpc ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpd ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpe ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpf ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpg ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starph ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpi ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpj ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4starpk ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4starp ,0, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpa ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpb ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpc ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpd ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpe ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpf ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpg ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starph ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpi ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpj ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4starpk ,sc4starp, sc4, sc4, sc4, ROT0, "BFM","Starprize (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1219 STARS 'N BARS 95004290 STARSNBARS PR1159 -GAME( 200?, sc4strbr ,0, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars (PR1219) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strbrb ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars (PR1219) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4strbr ,0, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars (PR1219) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strbrb ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars (PR1219) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1263 SNBA ART13 STARS 'N' BARS ARCADE - ART13 95004290 STARSNBARS PR1159 -GAME( 200?, sc4strbra ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strbrc ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strbrd ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4strbra ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strbrc ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strbrd ,sc4strbr, sc4, sc4, sc4, ROT0, "BFM","Stars 'n' Bars Arcade (PR1263) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2005 STIR CRAZY STIR SOUNDS STIR CRAZY -GAME( 200?, sc4stirc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stirca ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircb ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircc ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircd ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stirce ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircf ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircg ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stirch ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stirci ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4stircj ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4stirc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stirca ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircb ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircc ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircd ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stirce ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircf ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircg ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stirch ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stirci ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4stircj ,sc4stirc, sc4, sc4, sc4, ROT0, "Mazooma","Stir Crazy (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR2167CASINO THE STREAK PR7017,CASINO STREAK, STRK SOUNDS THE STREAK -GAME( 200?, sc4strk ,0, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strka ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkb ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkc ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkd ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strke ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkf ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkg ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkh ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strki ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkj ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strkk ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4strk ,0, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strka ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkb ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkc ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkd ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strke ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkf ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkg ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkh ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strki ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkj ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strkk ,sc4strk, sc4, sc4, sc4, ROT0, "Mazooma","The Streak (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PRxxxx STREAKS AHEAD V1.0 STREAKSSND STREAKS AHEAD -GAME( 200?, sc4sahed ,0, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4saheda ,sc4sahed, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sahedb ,sc4sahed, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sahed ,0, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4saheda ,sc4sahed, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sahedb ,sc4sahed, sc4, sc4, sc4, ROT0, "Qps","Streaks Ahead (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // NUMBER PR2024 STREET FIGHTER STRF SOUNDS STREET FIGHTER -GAME( 200?, sc4sf ,0, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sfa ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sfb ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sfc ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sfd ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sf ,0, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sfa ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sfb ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sfc ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sfd ,sc4sf, sc4, sc4, sc4, ROT0, "Mazooma","Street Fighter (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1114 STRIKE X PR1114 STRIKX SOUNDS11 -GAME( 200?, sc4strx ,0, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strxa ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strxb ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4strxc ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4strx ,0, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strxa ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strxb ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4strxc ,sc4strx, sc4, sc4, sc4, ROT0, "BFM","Strike X (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2357 CLUB SUITS U SIR SUITS U SIR CLUB CLUB SUIT SOUNDS -GAME( 200?, sc4suscl ,0, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4suscla ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susclb ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susclc ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4suscl ,0, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4suscla ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susclb ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susclc ,sc4suscl, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir Club (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6834 SUPER 6 FIXED 65% PR6834 SSIX SOUNDS11 -GAME( 200?, sc4s6c ,0, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4s6cb ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4s6c ,0, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4s6cb ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (65% Fixed) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6834 SUPER 6 PR6834 SSIX SOUNDS11 -GAME( 200?, sc4s6ca ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4s6cc ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4s6cd ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4s6ce ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4s6ca ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4s6cc ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4s6cd ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4s6ce ,sc4s6c, sc4, sc4, sc4, ROT0, "BFM","Super 6 Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6921 DIAMONDS AND RUBIES PR6921 DARB SOUNDS11 -GAME( 200?, sc4sdr ,0, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sdrb ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sdr ,0, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sdrb ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies (PR6921) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6921 DIAMONDS AND RUBIES SP98 PR6921 DARB SOUNDS11 -GAME( 200?, sc4sdra ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sdrc ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sdra ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sdrc ,sc4sdr, sc4, sc4, sc4, ROT0, "BFM","Super Diamonds & Rubies SP98 (PR6921) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // SUPER STEP..........................................................................................SUPERSTEPSND. (non-standard header) -GAME( 200?, sc4sstep ,0, sc4, sc4, sc4, ROT0, "Qps","Super Step / Dough & Arrow (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // Dough & Arrow clone? Super Step in header -GAME( 200?, sc4sstepa ,sc4sstep, sc4, sc4, sc4, ROT0, "Qps","Super Step / Dough & Arrow (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // Dough & Arrow clone? Super Step in header -GAME( 200?, sc4sstepb ,sc4sstep, sc4, sc4, sc4, ROT0, "Qps / 21 Casino","Super Step (Qps / 21 Casino) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // This one contains 21-Casino and Super Step strings +GAME( 200?, sc4sstep ,0, sc4, sc4, sc4, ROT0, "Qps","Super Step / Dough & Arrow (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // Dough & Arrow clone? Super Step in header +GAME( 200?, sc4sstepa ,sc4sstep, sc4, sc4, sc4, ROT0, "Qps","Super Step / Dough & Arrow (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // Dough & Arrow clone? Super Step in header +GAME( 200?, sc4sstepb ,sc4sstep, sc4, sc4, sc4, ROT0, "Qps / 21 Casino","Super Step (Qps / 21 Casino) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // This one contains 21-Casino and Super Step strings // PR2206 STREAKX STRX SOUNDS SUPER STREAX -GAME( 200?, sc4supst ,0, sc4, sc4, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4supsta ,sc4supst, sc4, sc4, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4supst ,0, sc4, sc4, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4supsta ,sc4supst, sc4, sc4, sc4, ROT0, "Mazooma","Super Streax (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2515 TAE KWON DOUGH TAEKWONSND TAE KWON DOUGH -GAME( 200?, sc4taekw ,0, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwa ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwb ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwc ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwd ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwe ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwf ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwg ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwh ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwi ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taekwj ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4taekw ,0, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwa ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwb ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwc ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwd ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwe ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwf ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwg ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwh ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwi ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taekwj ,sc4taekw, sc4, sc4, sc4, ROT0, "Qps","Tae Kwon Dough (Qps) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR1302 AWP TAKE NOTE PR1302 TAKE NOTE SOUNDS11 -GAME( 200?, sc4taknt ,0, sc4, sc4, sc4, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4taknta ,sc4taknt, sc4, sc4, sc4, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4taknt ,0, sc4, sc4, sc4, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4taknta ,sc4taknt, sc4, sc4, sc4, ROT0, "BFM","Take Note (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1323 CLUB TAKE NOTE PR1323 CNOT SOUNDS11 -GAME( 200?, sc4takcl ,0, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takcld ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takcli ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takclj ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4takcl ,0, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takcld ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takcli ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takclj ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1323 CLUB TAKE NOTE CLUB TAKE NOTE CLUB PR1323 CNOT SOUNDS11 -GAME( 200?, sc4takclg ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takclh ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4takclg ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takclh ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1323 CLUB TAKE NOTE 500 PR1323 CNOT SOUNDS11 -GAME( 200?, sc4takcla ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club 500 (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4takcla ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club 500 (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1323 CLUB TAKE NOTE FERRY PR1323 CNOT SOUNDS11 -GAME( 200?, sc4takclb ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takclc ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takcle ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4takclf ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4takclb ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takclc ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takcle ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4takclf ,sc4takcl, sc4, sc4, sc4, ROT0, "BFM","Take Note Club (Ferry) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7016 TAKE THE PISTE PISTE SOUNDS -GAME( 200?, sc4ttp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpa ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpb ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpc ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpd ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpe ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpf ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ttp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpa ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpb ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpc ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpd ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpe ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpf ,sc4ttp, sc4, sc4, sc4, ROT0, "Mazooma","Take The Piste (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PROJECT NUMBER PR7113 TEMPTATION PR7113 TEMPTATION SOUNDS11 -GAME( 200?, sc4tempt ,0, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tempta ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4temptb ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4temptc ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4temptd ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tempte ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4temptf ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4temptg ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tempt ,0, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tempta ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4temptb ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4temptc ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4temptd ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tempte ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4temptf ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4temptg ,sc4tempt, sc4, sc4, sc4, ROT0, "BFM","Temptation (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR7077 TETRIS TETR SOUNDS -GAME( 200?, sc4tetri ,0, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetria ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrib ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetric ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrid ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrie ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrif ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrig ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrih ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrii ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrij ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tetrik ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tetri ,0, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetria ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrib ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetric ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrid ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrie ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrif ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrig ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrih ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrii ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrij ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tetrik ,sc4tetri, sc4, sc4, sc4, ROT0, "Mazooma","Tetris (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR7017 THREE LIONS LION SOUNDS -GAME( 200?, sc4lions ,0, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionsa ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionsb ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionsc ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionsd ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionse ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lionsf ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lions ,0, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionsa ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionsb ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionsc ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionsd ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionse ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lionsf ,sc4lions, sc4, sc4, sc4, ROT0, "Mazooma","Three Lions (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR7060CASINO TICTACTWO TTTWO SOUNDS TIC TAC TWO -GAME( 200?, sc4tic2 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2a ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2b ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2c ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2d ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2e ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2f ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2g ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2n ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2o ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tic2 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2a ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2b ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2c ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2d ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2e ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2f ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2g ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2n ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2o ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR7060CASINO TICTACTWO TIC TAC TWO ARCADE TTTWO SOUNDS TIC TAC TWO -GAME( 200?, sc4tic2h ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2i ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2j ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2k ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2l ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tic2m ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tic2h ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2i ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2j ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2k ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2l ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tic2m ,sc4tic2, sc4, sc4, sc4, ROT0, "Mazooma","Tic Tac Two Casino Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1110 TOP BANANA PR1110 TOP BANANA SOUNDS11 -GAME( 200?, sc4tbana ,0, sc4, sc4, sc4, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tbanaa ,sc4tbana, sc4, sc4, sc4, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tbana ,0, sc4, sc4, sc4, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tbanaa ,sc4tbana, sc4, sc4, sc4, ROT0, "BFM","Top Banana (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7062 TOP GEARS GEARS SOUNDS TOP GEARS -GAME( 200?, sc4tgear ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgeara ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgearb ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgearc ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgeard ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgeare ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgearf ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tgearg ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tgear ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgeara ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgearb ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgearc ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgeard ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgeare ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgearf ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tgearg ,sc4tgear, sc4, sc4, sc4, ROT0, "Mazooma","Top Gear (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2112 TOP LOADER LOAD SOUNDS TOP LOADER -GAME( 200?, sc4tload ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Loader (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tload ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Loader (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6832 TREASURE ISLAND FIXED 65% PR6832 TRES SOUNDS11 -GAME( 200?, sc4ticlb ,0, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ticlbb ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ticlb ,0, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ticlbb ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Fixed 65%) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6832 TREASURE ISLAND PR6832 TRES SOUNDS11 -GAME( 200?, sc4ticlba ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ticlbc ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ticlba ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ticlbc ,sc4ticlb, sc4, sc4, sc4, ROT0, "BFM","Treasure Island Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1305 TREASURE TOMB PR1305 TRES TOMB SOUNDS11 / HIT SHOT -GAME( 200?, sc4ttomb ,0, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttomba ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttombb ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttombc ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ttomb ,0, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttomba ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttombb ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttombc ,sc4ttomb, sc4, sc4, sc4, ROT0, "BFM","Treasure Tomb (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2103 THE TRIDENT TRID SOUNDS THE TRIDENT -GAME( 200?, sc4tridn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Trident, The (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tridna ,sc4tridn, sc4, sc4, sc4, ROT0, "Mazooma","Trident, The (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tridn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Trident, The (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tridna ,sc4tridn, sc4, sc4, sc4, ROT0, "Mazooma","Trident, The (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1328 TRIPLE 7'S PR1328 TRIPLE 7S SOUNDS11 TRIPLE 7'S ABOVE -GAME( 200?, sc4tri7 ,0, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7a ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7f ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7g ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7h ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7i ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7j ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7k ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7l ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7m ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7n ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7o ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7p ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7q ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7r ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7s ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7t ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7u ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7v ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7w ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tri7 ,0, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7a ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7f ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7g ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7h ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7i ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7j ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7k ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7l ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7m ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7n ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7o ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7p ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7q ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7r ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7s ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7t ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7u ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7v ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7w ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's (Bellfruit) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) // PR1328 TRIPLE 7'S PR1328 TRIPLE 7S SOUNDS11 SEVENS ABOVE ARCADE TRIPLE 7'S ABOVE -GAME( 200?, sc4tri7b ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7c ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7d ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tri7e ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tri7b ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7c ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7d ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tri7e ,sc4tri7, sc4, sc4, sc4, ROT0, "BFM","Triple 7's Arcade (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2188 TRIPLE STREAK STR3 SOUNDS " THE STREAK -GAME( 200?, sc4trist ,0, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4trista ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4trist ,0, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4trista ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2188) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2167CASINO THE STREAK PR7017,CASINO STREAK, STR3 SOUNDS THE STREAK -GAME( 200?, sc4tristb ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristc ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristd ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4triste ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristf ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristg ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristh ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristi ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristj ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristk ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristl ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristm ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristn ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristo ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristp ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristq ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristr ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4trists ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristt ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristu ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristv ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristw ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristx ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tristy ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tristb ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristc ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristd ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4triste ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristf ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristg ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristh ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristi ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristj ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristk ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristl ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristm ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristn ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristo ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristp ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristq ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristr ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4trists ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristt ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristu ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristv ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristw ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristx ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tristy ,sc4trist, sc4, sc4, sc4, ROT0, "Mazooma","Triple Streak (PR2167) (Mazooma) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL ) // PR1103 TUBULAR BELLS PR1103 TUBULAR BELLS SOUNDS11 -GAME( 200?, sc4tub ,0, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tuba ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tubb ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tubc ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tub ,0, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tuba ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tubb ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tubc ,sc4tub, sc4, sc4, sc4, ROT0, "BFM","Tubular Bells (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6938 TUTTI FRUTTI PR6938 FRUT SOUNDS11 TUTTI FRUTTI -GAME( 200?, sc4tfclb ,0, sc4, sc4, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tfclba ,sc4tfclb, sc4, sc4, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tfclb ,0, sc4, sc4, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tfclba ,sc4tfclb, sc4, sc4, sc4, ROT0, "BFM","Tutti Frutti Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1214 TWILIGHT 95004299 TWILIGHT PR1154 -GAME( 200?, sc4twilt ,0, sc4, sc4, sc4, ROT0, "BFM","Twilight (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4twilt ,0, sc4, sc4, sc4, ROT0, "BFM","Twilight (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7022 UP FOR GRABS GRAB SOUNDS -GAME( 200?, sc4ufg ,0, sc4, sc4, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufga ,sc4ufg, sc4, sc4, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ufg ,0, sc4, sc4, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufga ,sc4ufg, sc4, sc4, sc4, ROT0, "Mazooma","Up For Grabs (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6819 UP FOT IT PR6819 UP FOR IT SOUNDS11 -GAME( 200?, sc4ufi ,0, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufia ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufib ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufic ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufid ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ufie ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4ufi ,0, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufia ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufib ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufic ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufid ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ufie ,sc4ufi, sc4, sc4, sc4, ROT0, "BFM","Up For It (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR7025 GERMAN VALHALLA 7025 VER1 SOUNDS -GAME( 200?, sc4valnv ,0, sc4, sc4, sc4, ROT0, "Nova","Valhalla (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4valnv ,0, sc4, sc4, sc4, ROT0, "Nova","Valhalla (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2040E VALHALLA...PR2040 SOUNDS V1.... (non-standard header) -GAME( 200?, sc4valqp ,0, sc4, sc4, sc4, ROT0, "Qps / Eurocoin","Valhalla (Dutch) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4valqp ,0, sc4, sc4, sc4, ROT0, "Qps / Eurocoin","Valhalla (Dutch) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1037 CLUB VERY RICH GEEZER PR1037 RICH SOUNDS11 VERY RICH GEEZER -GAME( 200?, sc4vrgcl ,0, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgcla ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgclb ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgclc ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgcld ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgcle ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgclf ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgclg ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vrgcl ,0, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgcla ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgclb ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgclc ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgcld ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgcle ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgclf ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgclg ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1037 CLUB VERY RICH GEEZER VERY RICH GEEZER CLUB PR1037 RICH SOUNDS11 VERY RICH GEEZER -GAME( 200?, sc4vrgclh ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vrgcli ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vrgclh ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vrgcli ,sc4vrgcl, sc4, sc4, sc4, ROT0, "BFM","Very Rich Geezer Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR6984 VIVA MEXICO 1.30 95008095 VIVA MEXICO PR6984 -GAME( 200?, sc4vmnv ,0, sc4, sc4, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vmnv ,0, sc4, sc4, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR6984 VIVA MEXICO 1.00 95008095 VIVA MEXICO PR6984 -GAME( 200?, sc4vmnva ,sc4vmnv, sc4, sc4, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vmnva ,sc4vmnv, sc4, sc4, sc4, ROT0, "Nova","Viva Mexico (Nova) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // / PR7132 CLUB VIVA MEXICO PR7132 VIVA SOUNDS11 VIVA MEXICO -GAME( 200?, sc4vmclb ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vmclba ,sc4vmclb, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vmclbb ,sc4vmclb, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vmclb ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vmclba ,sc4vmclb, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vmclbb ,sc4vmclb, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2052 WADZILLA WADZ SOUNDS WADZILLA -GAME( 200?, sc4wadzl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wadzla ,sc4wadzl, sc4, sc4, sc4, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wadzl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wadzla ,sc4wadzl, sc4, sc4, sc4, ROT0, "Mazooma","Wadzilla (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7027 GERMAN WERNER PR7027 SOUNDS V1 -GAME( 200?, sc4wernr ,0, sc4, sc4, sc4, ROT0, "Nova","Werner (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wrnlt ,sc4wernr, sc4, sc4, sc4, ROT0, "Nova","Werner Light (German) (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wernr ,0, sc4, sc4, sc4, ROT0, "Nova","Werner (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wrnlt ,sc4wernr, sc4, sc4, sc4, ROT0, "Nova","Werner Light (German) (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7065 WET 'N' WILD WILD SOUNDS WET 'N' WILD -GAME( 200?, sc4waw ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawa ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawb ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawc ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawd ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawe ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wawf ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4waw ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawa ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawb ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawc ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawd ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawe ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wawf ,sc4waw, sc4, sc4, sc4, ROT0, "Mazooma","Wet & Wild (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR6812 WHO DARES WINS PR6812 WHO DARES WINS SOUNDS -GAME( 200?, sc4wdw ,0, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwa ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwb ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwc ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwd ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwe ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwf ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwg ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwh ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwi ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wdwj ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wdw ,0, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwa ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwb ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwc ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwd ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwe ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwf ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwg ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwh ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwi ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wdwj ,sc4wdw, sc4, sc4, sc4, ROT0, "BFM","Who Dares Wins (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR7120 WHO WANTS TO BE A LEGIONNAIRE PR7120 LEGIONNAIRE SOUNDS11 -GAME( 200?, sc4leg ,0, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lega ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legb ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legc ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legd ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lege ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legf ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legg ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4leg ,0, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lega ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legb ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legc ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legd ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lege ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legf ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legg ,sc4leg, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1038 CLUB WHO WANTS TO BE A LEGIONNAIRE PR1038 CLUB WWTBAL SOUNDS11 -GAME( 200?, sc4legcb ,0, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legcba ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legcbb ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legcbc ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4legcb ,0, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legcba ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legcbb ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legcbc ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1038 CLUB WHO WANTS TO BE A LEGIONNAIRE WWTB LEGIONNAIRE CLUB PR1038 CLUB WWTBAL SOUNDS11 -GAME( 200?, sc4legcbd ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4legcbe ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4legcbd ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4legcbe ,sc4legcb, sc4, sc4, sc4, ROT0, "BFM","Who Wants To Be A Legionnaire Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR7144 WILD BUNCH PR7144 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4wldbn ,0, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbna ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnb ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnc ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnd ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbne ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnf ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbni ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnj ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnk ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wldbn ,0, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbna ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnb ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnc ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnd ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbne ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnf ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbni ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnj ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnk ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR7144 WILD BUNCH PR7144 WILD BUNCH SOUNDS11 CAS WILD BUNCH S.SITE -GAME( 200?, sc4wldbng ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnh ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnl ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldbnm ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wldbng ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnh ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnl ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldbnm ,sc4wldbn, sc4, sc4, sc4, ROT0, "BFM","Wild Bunch Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7110 WILD THING PR7110 WILD THING SOUNDS11 -GAME( 200?, sc4wthng ,0, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnga ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthngb ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthngc ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wthng ,0, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnga ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthngb ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthngc ,sc4wthng, sc4, sc4, sc4, ROT0, "BFM","Wild Thing (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7060CASINO WILDTHING WILD THING ARCADE WILD SOUNDS WILD THING -GAME( 200?, sc4wthnm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnma ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnmb ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnmc ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnmd ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnme ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wthnmf ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wthnm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnma ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnmb ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnmc ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnmd ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnme ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wthnmf ,sc4wthnm, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino Arcade (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR7060CASINO WILDTHING WILD SOUNDS WILD THING -GAME( 200?, sc4wtc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtca ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtcb ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtcc ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtcd ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtce ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wtcf ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wtc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtca ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtcb ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtcc ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtcd ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtce ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wtcf ,sc4wtc, sc4, sc4, sc4, ROT0, "Mazooma","Wild Thing Casino (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR2526 WINNING SPIN TOP BOX WINNINGSPINSND WINNING SPIN (does this belong to sc4winsp instead, or do both share the same top box) -GAME( 200?, sc4wspin ,0, sc4, sc4, sc4, ROT0, "Qps","Winning Spin Top Box (PR2526) (Win Spinner?) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wspin ,0, sc4, sc4, sc4, ROT0, "Qps","Winning Spin Top Box (PR2526) (Win Spinner?) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // QPS162 WIN SPINNER Arcade Version 011 WINSPINNERSND WIN SPINNER -GAME( 200?, sc4wspina ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wspinc ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wspina ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wspinc ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner Arcade (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // QPS162 WIN SPINNER SP Arcade Version 011 WINSPINNERSND WIN SPINNER -GAME( 200?, sc4wspinb ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wspind ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wspinb ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wspind ,sc4wspin, sc4, sc4, sc4, ROT0, "Qps","Win Spinner SP Arcade (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1301 WIN WHEN YOUR SPINNING PR1301 WIN W Y S SOUNDS11 -GAME( 200?, sc4wwys ,0, sc4, sc4, sc4, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wwysa ,sc4wwys, sc4, sc4, sc4, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wwys ,0, sc4, sc4, sc4, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wwysa ,sc4wwys, sc4, sc4, sc4, ROT0, "BFM","Win When Your Spinning (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1207 WIN XPLOSION 95004265 WINXPLOSION PR1053 -GAME( 200?, sc4winxp ,0, sc4, sc4, sc4, ROT0, "BFM","Win X-plosion (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winxp ,0, sc4, sc4, sc4, ROT0, "BFM","Win X-plosion (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc4winsp ,0, sc4, sc4, sc4, ROT0, "Qps","Winning Spin Top Box (PR2526) (Qps) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winsp ,0, sc4, sc4, sc4, ROT0, "Qps","Winning Spin Top Box (PR2526) (Qps) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Bingo Version011 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspa ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winsph ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspa ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winsph ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Bingo Version 012 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspe ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspl ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspq ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspw ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspe ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspl ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspq ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspw ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Bingo V012) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Arcade Version011 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspd ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspk ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspd ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspk ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Arcade Version 012 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspt ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspz ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspt ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspz ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Version 021 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspb ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspi ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspb ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspi ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V021) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Version 022 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspf ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspm ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspr ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspx ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspf ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspm ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspr ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspx ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V022) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Version 031 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspc ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspj ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspc ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspj ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V031) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Version 032 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspg ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspn ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winsps ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspy ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspg ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspn ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winsps ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspy ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (V032) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Arcade Version 061 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspo ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspu ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspo ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspu ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V061) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 WINNING SPIN Arcade Version 062 WINNINGSPINSND WINNING SPIN -GAME( 200?, sc4winspp ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4winspv ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4winspp ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4winspv ,sc4winsp, sc4, sc4, sc4, ROT0, "Qps","Winning Spin (Arcade V062) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1318 WONDER WHEEL PR1314 WONDER WHEEL SOUNDS11 -GAME( 200?, sc4wondw ,0, sc4, sc4, sc4, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wondwa ,sc4wondw, sc4, sc4, sc4, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wondw ,0, sc4, sc4, sc4, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wondwa ,sc4wondw, sc4, sc4, sc4, ROT0, "BFM","Wonder Wheel (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1116 X MARKS THE SPOT PR1116 X MARKS THE SPOT SOUNDS11 -GAME( 200?, sc4xmark ,0, sc4, sc4, sc4, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4xmarka ,sc4xmark, sc4, sc4, sc4, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4xmark ,0, sc4, sc4, sc4, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4xmarka ,sc4xmark, sc4, sc4, sc4, ROT0, "BFM","X Marks The Spot (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1264 XTRA CASH ART13 XTRA CASH CASINO (LOTECH) - ART13 95004321 XTRACASH PR1264 -GAME( 200?, sc4xcash ,0, sc4, sc4, sc4, ROT0, "BFM","Xtra Cash Casino (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4xcash ,0, sc4, sc4, sc4, ROT0, "BFM","Xtra Cash Casino (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR21xx SECTION 16 SECT SOUNDS SECTION 16 -GAME( 200?, sc4s16 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4s16a ,sc4s16, sc4, sc4, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4s16 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4s16a ,sc4s16, sc4, sc4, sc4, ROT0, "Mazooma","Section 16 (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // both of these are incomplete // P_O_E_T_N_M_E_ _R_0_1_B_A_K_G_L_ _._0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _9_0_8_6_ _L_C_ _O_D_G_S_U_D_1_ -GAME( 200?, sc4bgold ,0, sc4, sc4, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4bgolda ,sc4bgold, sc4, sc4, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4bgold ,0, sc4, sc4, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4bgolda ,sc4bgold, sc4, sc4, sc4, ROT0, "Nova","Black Gold (Nova) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR2025 BLOCK BUSTER BUSTERSND BLOCK BUSTER -GAME( 200?, sc4blokq ,0, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blokqa ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blokqb ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blokqc ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blokqd ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4blokqe ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4blokq ,0, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blokqa ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blokqb ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blokqc ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blokqd ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4blokqe ,sc4blokq, sc4, sc4, sc4, ROT0, "Qps","Blockbuster (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2025 BLOCK BUSTER BUSTERSND BLOCK BUSTER (same as sc4blokq ?) -GAME( 200?, sc4bbust ,sc4blokq, sc4, sc4, sc4, ROT0, "Mazooma","Blockbuster (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bbust ,sc4blokq, sc4, sc4, sc4, ROT0, "Mazooma","Blockbuster (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR7131 CLUB TEMPTATION PR7131 TEMPTATION SOUNDS11 -GAME( 200?, sc4clbtm ,0, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clbtma ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clbtmb ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clbtmc ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clbtmd ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clbtme ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clbtm ,0, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clbtma ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clbtmb ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clbtmc ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clbtmd ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clbtme ,sc4clbtm, sc4, sc4, sc4, ROT0, "BFM","Club Temptation (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 021 DCRZYSND -GAME( 200?, sc4dcrls ,0, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsf ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrls ,0, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsf ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (021) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 031 DCRZYSND -GAME( 200?, sc4dcrlsa ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsg ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrlsa ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsg ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (031) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 022 DCRZYSND -GAME( 200?, sc4dcrlsb ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsh ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrlsb ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsh ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (022) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 032 DCRZYSND -GAME( 200?, sc4dcrlsc ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsi ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrlsc ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsi ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (032) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 023 DCRZYSND -GAME( 200?, sc4dcrlsd ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsj ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrlsd ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsj ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (023) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2544 DOUBLE CRAZY REELS 033 DCRZYSND -GAME( 200?, sc4dcrlse ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dcrlsk ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dcrlse ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dcrlsk ,sc4dcrls, sc4, sc4, sc4, ROT0, "Mazooma","Double Crazy Reels (033) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7194 GRAND CASINO PR6934 SLM2 SOUNDS11 GRAND CASINO -GAME( 200?, sc4gcclb ,0, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclba ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbb ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbc ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbd ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbe ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbf ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbg ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbh ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbi ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbj ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbk ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gcclb ,0, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclba ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbb ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbc ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbd ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbe ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbf ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbg ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbh ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbi ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbj ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbk ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR7194 GRAND CASINO PR6934 SLM2 SOUNDS11 GRAND CASINO GRAND CASINO CLUB -GAME( 200?, sc4gcclbl ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbm ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbn ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbp ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gcclbl ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbm ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbn ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbp ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR7149 GRAND CASINO GRAND CASINO CLUB PR6934 SLM2 SOUNDS11 GRAND CASINO -GAME( 200?, sc4gcclbo ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gcclbq ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gcclbo ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gcclbq ,sc4gcclb, sc4, sc4, sc4, ROT0, "BFM","Grand Casino Club (Bellfruit) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR2076 ON THE UP HYPE SOUNDS ON THE UP -GAME( 200?, sc4onup ,0, sc4, sc4, sc4, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4onupa ,sc4onup, sc4, sc4, sc4, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4onup ,0, sc4, sc4, sc4, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4onupa ,sc4onup, sc4, sc4, sc4, ROT0, "BFM","On The Up (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1623 PHARAOHS GOLD PHARAOHS GOLD CLUB PR1623 CLASS PHAR GOLD SOUNDS11 -GAME( 200?, sc4pglcl ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglcla ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglclb ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglclc ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglcld ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglcle ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglclf ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglclg ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pglclh ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pglcl ,0, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglcla ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglclb ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglclc ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglcld ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglcle ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglclf ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglclg ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pglclh ,sc4pglcl, sc4, sc4, sc4, ROT0, "BFM","Pharaoh's Gold Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT V1.0 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8 ,0, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8e ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8f ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8 ,0, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8e ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8f ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.0) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT V1.1 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8a ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8b ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8g ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8h ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8a ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8b ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8g ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8h ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (V1.1) (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT 011 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8c ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8m ,sc4po8, sc4, sc4, sc4, ROT0, "QPS","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8c ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8m ,sc4po8, sc4, sc4, sc4, ROT0, "QPS","Pieces Of Eight (011) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT 012 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8i ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8k ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8i ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8k ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (012) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT 041 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8d ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8n ,sc4po8, sc4, sc4, sc4, ROT0, "QPS","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8d ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8n ,sc4po8, sc4, sc4, sc4, ROT0, "QPS","Pieces Of Eight (041) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2530 PIECES OF EIGHT 042 PIECESOFEIGHTSND PIECES OF EIGHT -GAME( 200?, sc4po8j ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4po8l ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4po8j ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4po8l ,sc4po8, sc4, sc4, sc4, ROT0, "Qps","Pieces Of Eight (042) (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // no identifiaction string -GAME( 200?, sc4wag ,0, sc4, sc4, sc4, ROT0, "Mazooma/Nova","Win-A-Gain (Nova) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wag ,0, sc4, sc4, sc4, ROT0, "Mazooma/Nova","Win-A-Gain (Nova) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) /* These contained a mix of SC4/SC5/AD5. These have been split by HW type, SC5/AD5 roms are now in bfm_sc5.c It's possible some of these are just topbox / link units for games otherwise on SC5 hardware, although many are just revisions of games which were released on both */ // PR3039 AWP ANT N DECS JIGGY BANK S4 PR3009 JIGGY BANK SOUNDS11 JIGGY BANK S.SITE -GAME( 200?, sc4adjb ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjba ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbb ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbc ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbd ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbe ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbf ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbg ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbh ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adjbi ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4adjb ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjba ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbb ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbc ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbd ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbe ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbf ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbg ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbh ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adjbi ,sc4adjb, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 4) (Set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1940 AWP ANT N DECS WTAD S4 PR1940 ADSNT SHOWTIME SOUNDS11 ANTNDECSWTAD S.SITE -GAME( 200?, sc4adwta ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adwtaa ,sc4adwta, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4adwta ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adwtaa ,sc4adwta, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2200 AROUND THE BOARD AROU SOUNDS AROUND THE BOARD -GAME( 200?, sc4a40 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40a ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40b ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4a40c ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4a40 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40a ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40b ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4a40c ,sc4a40, sc4, sc4, sc4, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2301 BANTAM OF THE OPERA BANTAM SOUNDS BANTAMOFTHEOPERA -GAME( 200?, sc4bantm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bantma ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bantmb ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bantmc ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bantm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bantma ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bantmb ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bantmc ,sc4bantm, sc4, sc4, sc4, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1433 BAR7S PR1433 BAR SEVENS SOUNDS11 -GAME( 200?, sc4bar7 ,0, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bar7a ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bar7 ,0, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bar7a ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1433) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1438 BAR7S PR1436 TRIPLE CASINO SOUNDS11 -GAME( 200?, sc4bar7b ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bar7c ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bar7d ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bar7e ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bar7b ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bar7c ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bar7d ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bar7e ,sc4bar7, sc4, sc4, sc4, ROT0, "BFM","Bar 7's (PR1438) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1724 AWP BATTLESHIPS AND CRUISERS S4 PR1704 B AND C SOUNDS11 BATTLESHIPSCRUIS S.SITE -GAME( 200?, sc4batl ,0, sc4, sc4, sc4, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4batla ,sc4batl, sc4, sc4, sc4, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4batl ,0, sc4, sc4, sc4, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4batla ,sc4batl, sc4, sc4, sc4, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2170 BOBBY DAZZLER BOBD SOUNDS BOBBY DAZZLER -GAME( 200?, sc4bob ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4boba ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobb ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobc ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobd ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobe ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobf ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobg ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobh ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bobi ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bob ,0, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4boba ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobb ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobc ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobd ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobe ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobf ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobg ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobh ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bobi ,sc4bob, sc4, sc4, sc4, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1722 AWP BULLSEYE SCORP4 PR1702 BULLSEYE SOUNDS11 BULLSEYE S.SITE -GAME( 200?, sc4bull ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulla ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bullb ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bullc ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bull ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulla ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bullb ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bullc ,sc4bull, sc4, sc4, sc4, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1740 AWP BULLSEYE CLASSIC SCORP4 PR1702 BULLSEYE SOUNDS11 BULLSEYE CLASSIC S.SITE -GAME( 200?, sc4bulcs ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcsa ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcsb ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bulcsc ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bulcs ,0, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcsa ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcsb ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bulcsc ,sc4bulcs, sc4, sc4, sc4, ROT0, "BFM","Bullseye Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1930 AWP BUTCH CASHIDY AND THE SUNDANCE QUID S4 PR1910 B C AND THE S Q SOUNDS11 BUTCH N SUNDANCE S.SITE -GAME( 200?, sc4butch ,0, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butcha ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butchb ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butchc ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butchd ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butche ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butchf ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4butchg ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4butch ,0, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butcha ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butchb ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butchc ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butchd ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butche ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butchf ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4butchg ,sc4butch, sc4, sc4, sc4, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2209 CABIN FEVER CABF SOUNDS CABIN FEVER -GAME( 200?, sc4cabin ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabina ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinb ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinc ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabind ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabine ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinf ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabing ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinh ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabini ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinj ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabink ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinl ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cabinm ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cabin ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabina ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinb ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinc ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabind ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabine ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinf ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabing ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinh ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabini ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinj ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabink ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinl ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cabinm ,sc4cabin, sc4, sc4, sc4, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR2326 CARIBBEAN CASH CABC SOUNDS CARIBBEAN CASH -GAME( 200?, sc4cari ,0, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4caria ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4carib ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4caric ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4carid ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4carie ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cari ,0, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4caria ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4carib ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4caric ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4carid ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4carie ,sc4cari, sc4, sc4, sc4, ROT0, "Mazooma","Caribbean Cash (PR2326) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // these lack identification strings, I think it's a different game to the above one -GAME( 200?, sc4cariq ,0, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqa ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqb ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqc ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqd ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqe ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqf ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cariqg ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cariq ,0, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqa ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqb ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqc ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqd ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqe ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqf ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cariqg ,sc4cariq, sc4, sc4, sc4, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1683 BLAS14 -GAME( 200?, sc4cblas ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cblas ,0, sc4, sc4, sc4, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2338 XTRAVAGANZA XTRV SOUNDS XTRAVAGANZA -GAME( 200?, sc4casxt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casxta ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casxtb ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casxtc ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casxtd ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4casxte ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4casxt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casxta ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casxtb ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casxtc ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casxtd ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4casxte ,sc4casxt, sc4, sc4, sc4, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1731 AWP CHAV IT SCORP4 PR1711 CHAV IT SOUNDS11 CHAV IT S.SITE -GAME( 200?, sc4chavi ,0, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavia ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavib ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavic ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavid ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavie ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavif ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavig ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chavi ,0, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavia ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavib ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavic ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavid ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavie ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavif ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavig ,sc4chavi, sc4, sc4, sc4, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2305 CHAVVY CHASE CHVY SOUNDS -GAME( 200?, sc4chavy ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavya ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavyb ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavyc ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavyd ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavye ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavyf ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chavyg ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chavy ,0, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavya ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavyb ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavyc ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavyd ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavye ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavyf ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chavyg ,sc4chavy, sc4, sc4, sc4, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2230 CLUEDO CLUE SOUNDS CLUEDO -GAME( 200?, sc4clue ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cluea ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clueb ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cluec ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clued ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cluee ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cluef ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clueg ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clue ,0, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cluea ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clueb ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cluec ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clued ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cluee ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cluef ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clueg ,sc4clue, sc4, sc4, sc4, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1308 COLOUR MANIA PR1308 COLOUR MAN SOUNDS11 -GAME( 200?, sc4cmani ,0, sc4, sc4, sc4, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cmania ,sc4cmani, sc4, sc4, sc4, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4cmani ,0, sc4, sc4, sc4, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cmania ,sc4cmani, sc4, sc4, sc4, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1416 COOL JEWELS PR1416 COOL JEWELS SOUNDS11 COOL JEWELS S.SITE -GAME( 200?, sc4cj ,0, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cja ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjb ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjc ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4cjd ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4cj ,0, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cja ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjb ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjc ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4cjd ,sc4cj, sc4, sc4, sc4, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR1109 AWP COP THE LOT PR1109 CTLOT SOUNDS11 -GAME( 200?, sc4ctl ,0, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctla ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctlb ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctlc ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctld ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ctle ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ctl ,0, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctla ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctlb ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctlc ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctld ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ctle ,sc4ctl, sc4, sc4, sc4, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3035 AWP COPS AND ROBBERS SAFE CRACKER S4 PR3005 SAFE CRACKER SOUNDS11 SAFE CRACKER S.SITE -GAME( 200?, sc4crsc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crsca ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crscb ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crscc ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crscd ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crsce ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crscf ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crscg ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crsc ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crsca ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crscb ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crscc ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crscd ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crsce ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crscf ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crscg ,sc4crsc, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2252 CORONATION ST CORRY SOUNDS CORONATION ST -GAME( 200?, sc4coro ,0, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4coroa ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corof ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corog ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4coroj ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corok ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corol ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corom ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4coro ,0, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4coroa ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corof ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corog ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4coroj ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corok ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corol ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corom ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION ST Arcade Version 012 COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc4coroc ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Arcade (PR2249) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4coroh ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Arcade (PR2249) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4coroc ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Arcade (PR2249) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4coroh ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Arcade (PR2249) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET CORS MAZ COROST_TRIPLE SOUNDS -GAME( 200?, sc4corod ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4coroi ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4corod ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4coroi ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2526 CORONATION ST TOP BOX COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc4corotb ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Top Box (PR2526) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4corotba ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Top Box (PR2526) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4corotb ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Top Box (PR2526) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4corotba ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street Top Box (PR2526) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // P_2_4_ _O_O_A_I_N_S_ _i_g_ _e_s_o_ _1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _O_O_T_T_I_L_ _O_N_S_ _ _ _ _ _ _ _C_R_N_T_O_ _S_ _ _ _ -GAME( 200?, sc4coron ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street ?i?g? ?e?s?o? ?1 (PR2?4?) (Mazooma) (Scorpion 4) ", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pair, was in 'show me the money' set +GAME( 200?, sc4coron ,sc4coro, sc4, sc4, sc4, ROT0, "Mazooma","Coronation Street ?i?g? ?e?s?o? ?1 (PR2?4?) (Mazooma) (Scorpion 4) ", GAME_IS_SKELETON_MECHANICAL ) // incomplete pair, was in 'show me the money' set // PR1929 AWP COUNTDOWN S4 PR1909 COUNTDOWN SOUNDS11 COUNTDOWN S.SITE -GAME( 200?, sc4count ,0, sc4, sc4, sc4, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4counta ,sc4count, sc4, sc4, sc4, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4count ,0, sc4, sc4, sc4, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4counta ,sc4count, sc4, sc4, sc4, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6982 CRAZY FRUITS 1.02 95004150 CRAZY FRUITS PR6982 CRAZY FRUITS -GAME( 200?, sc4czfr ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits 1.02 (PR6982) (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4czfr ,0, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits 1.02 (PR6982) (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // _R_J_C_ _U_B_R_P_6_8_ _R_Z_ _R_I_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _5_0_1_0_C_A_Y_F_U_T_ _R_9_2_ _ -GAME( 200?, sc4czfrd ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6982) (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing (in 'up for it' set) +GAME( 200?, sc4czfrd ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6982) (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing (in 'up for it' set) // PR1212 CRAZY FRUITS PR1152 CRAZY FRUITS SOUNDS11 -GAME( 200?, sc4czfra ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR1212) (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4czfra ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR1212) (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6813 CRAZY FRUITS PR6813 CRAZY FRUITS SOUNDS11 (same code as sc4cfqps etc.) -GAME( 200?, sc4czfrb ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6813) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4czfrc ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6813) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4czfrb ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6813) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4czfrc ,sc4czfr, sc4, sc4, sc4, ROT0, "BFM","Crazy Fruits (PR6813) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1638 AWP CROWN JEWELS PR1608 CROWN JEWELS SOUNDS11 CROWN JEWELS S.SITE -GAME( 200?, sc4crnjw ,0, sc4, sc4, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4crnjwa ,sc4crnjw, sc4, sc4, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4crnjw ,0, sc4, sc4, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4crnjwa ,sc4crnjw, sc4, sc4, sc4, ROT0, "BFM","Crown Jewels (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1927 AWP DEAL OR NO DEAL S4 PR1907 DEAL OR NO DEAL SOUNDS11 -GAME( 200?, sc4dnd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnda ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4dndb ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndc ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndd ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnde ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndf ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndg ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndh ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndi ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndj ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndk ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndl ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndm ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndn ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndo ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dnd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnda ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4dndb ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndc ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndd ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnde ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndf ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndg ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndh ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndi ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndj ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndk ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndl ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndm ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndn ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndo ,sc4dnd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR1967 AWP CLASSIC DEAL OR NO DEAL S4 PR1907 DEAL OR NO DEAL SOUNDS11 -GAME( 200?, sc4dndcs ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcsa ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcsb ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcsc ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndcs ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcsa ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcsb ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcsc ,sc4dndcs, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3229 AWP DEAL OR NO DEAL BREAK THE BANK SCORP4 PR3209 BREAK THE BANK SOUNDS11 -GAME( 200?, sc4dndbb ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbba ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbb ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbc ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbd ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbe ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbf ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbg ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbh ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbbi ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndbb ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbba ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbb ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbc ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbd ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbe ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbf ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbg ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbh ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbbi ,sc4dndbb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1949 CLUB DEAL OR NO DEAL DEAL OR NO DEAL CLUB PR1949 DEAL O N D SOUNDS11 -GAME( 200?, sc4dndcl ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcla ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndclb ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndclc ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcld ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcle ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndclf ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndclg ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndcl ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcla ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndclb ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndclc ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcld ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcle ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndclf ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndclg ,sc4dndcl, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3235 AWP DEAL OR NO DEAL DOUBLE S4 PR3215 DOND DOUBLE SOUNDS11 DOUBLE DOND S.SITE -GAME( 200?, sc4dnddd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddda ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndddb ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndddc ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndddd ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddde ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndddf ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndddg ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dnddd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddda ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndddb ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndddc ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndddd ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddde ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndddf ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndddg ,sc4dnddd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3038 DEAL OR NO DEAL HALL OF FAME SCORP4 PR3008 HALL OF FAME SOUNDS11 HALL OF FAME S.SITE -GAME( 200?, sc4dndhf ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfa ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfb ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfc ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfd ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfe ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhff ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfg ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfh ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndhfi ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndhf ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfa ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfb ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfc ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfd ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfe ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhff ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfg ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfh ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndhfi ,sc4dndhf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3227 AWP DEAL OR NO DEAL ITS YOUR SHOW SCORP4 PR3207 ITS YOUR SHOW SOUNDS11 ITS YOUR SHOW S.SITE -GAME( 200?, sc4dndys ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndysa ,sc4dndys, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndysb ,sc4dndys, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndys ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndysa ,sc4dndys, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndysb ,sc4dndys, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR3212 AWP DEAL OR NO DEAL LETS PLAY DEAL OR NO DEAL SCORP4 PR3212 LETS PLAY DOND SOUNDS11 LETS PLAY DOND S.SITE -GAME( 200?, sc4dndlp ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndlpa ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndlpb ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndlpc ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndlpd ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndlpe ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndlp ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndlpa ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndlpb ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndlpc ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndlpd ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndlpe ,sc4dndlp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3221 AWP DEAL OR NO DEAL RED ALERT SCORP4 PR3201 DOND RED ALERT SOUNDS11 RED ALERT S.SITE -GAME( 200?, sc4dndra ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndraa ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndrab ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndrac ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndrad ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndrae ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndra ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndraa ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndrab ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndrac ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndrad ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndrae ,sc4dndra, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3230 AWP DEAL OR NO DEAL THE BIG DEAL SCORP4 PR3210 THE BIG DEAL SOUNDS11 THE BIG DEAL S.SITE -GAME( 200?, sc4dndbd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbda ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbdb ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbdc ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbdd ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbde ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndbd ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbda ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbdb ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbdc ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbdd ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbde ,sc4dndbd, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3041 AWP DEAL OR NO DEAL THE BIG REDS S4 PR3011 THE BIG REDS SOUNDS11 THE BIG REDS S.SITE -GAME( 200?, sc4dndbr ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbra ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbrb ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbrc ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbrd ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbre ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbrf ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbrg ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndbr ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbra ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbrb ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbrc ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbrd ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbre ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbrf ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbrg ,sc4dndbr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Big Reds (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3047 AWP DEAL OR NO DEAL THE CRAZY CHAIR SCORP4 PR3017 CRAZY CHAIR SOUNDS11 CRAZY CHAIR S.SITE -GAME( 200?, sc4dndcc ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcca ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndccb ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4dndccc ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndccd ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcce ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndccf ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndcc ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcca ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndccb ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4dndccc ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndccd ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcce ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndccf ,sc4dndcc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR3043 AWP THE DEAL WHEEL S4 PR3202 THE DEAL WHEEL SOUNDS11 THE DEAL WHEEL S.SITE -GAME( 200?, sc4dnddw ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwa ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwb ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwc ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwd ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwe ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwf ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddwg ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dnddw ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwa ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwb ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwc ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwd ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwe ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwf ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddwg ,sc4dnddw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3044 AWP DEAL OR NO DEAL THE DREAM FACTORY SCORP4 PR3014 DREAM FACTORY SOUNDS11 DREAM FACTORY S.SITE -GAME( 200?, sc4dnddf ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddfa ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4dnddfb ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddfc ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddfd ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dnddfe ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dnddf ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddfa ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4dnddfb ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddfc ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddfd ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dnddfe ,sc4dnddf, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3240 AWP DEAL OR NO DEAL THE PERFECT GAME SCORP4 PR3220 DOND PERFECT SOUNDS11 THE PERFECT GAME S.SITE -GAME( 200?, sc4dndpg ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndpga ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndpgb ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndpgc ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndpgd ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndpge ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndpg ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndpga ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndpgb ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndpgc ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndpgd ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndpge ,sc4dndpg, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3033 AWP DOND THE POWER 5 SCORP4 PR3033 POWER FIVE SOUNDS11 DOND THE POWER 5 S.SITE -GAME( 200?, sc4dndtp ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpa ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpb ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpc ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpd ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpe ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpf ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpg ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtph ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpi ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpj ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpk ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpl ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtpm ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndtp ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpa ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpb ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpc ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpd ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpe ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpf ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpg ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtph ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpi ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpj ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpk ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpl ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtpm ,sc4dndtp, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR3006 AWP DEAL OR NO DEAL THE WALK OF WEALTH SCORP4 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE -GAME( 200?, sc4dndww ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwwa ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwwb ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwwc ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwwd ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwwe ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndww ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwwa ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwwb ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwwc ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwwd ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwwe ,sc4dndww, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3027 AWP CLASSIC DEAL OR NO DEAL THE WALK OF WEALTH SCORP4 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE -GAME( 200?, sc4dndcw ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcwa ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcwb ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndcwc ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndcw ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcwa ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcwb ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndcwc ,sc4dndcw, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3329 DOND THINK RED S4 PR3304 THINK RED SOUNDS11 THINK RED S.SITE -GAME( 200?, sc4dndtr ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndtra ,sc4dndtr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndtr ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndtra ,sc4dndtr, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1982 AWP DEAL OR NO DEAL WHATS IN YOUR BOX SCORP4 PR1962 WHATS IN Y BOX SOUNDS11 WHATS IN YOUR BX S.SITE -GAME( 200?, sc4dndwb ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwba ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbb ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbc ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbd ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbe ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbf ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndwbg ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndwb ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwba ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbb ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbc ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbd ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbe ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbf ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndwbg ,sc4dndwb, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1307 AWP DIAMOND MINE PR1307 DIAM MINE SOUNDS11 -GAME( 200?, sc4dmine ,0, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dminea ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dmineb ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dminec ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dmined ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dminee ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dmine ,0, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dminea ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dmineb ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dminec ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dmined ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dminee ,sc4dmine, sc4, sc4, sc4, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1309 AWP DOCTOR DOSH PR1309 DOCTOR DOSH SOUNDS11 -GAME( 200?, sc4ddosh ,0, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddosha ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshb ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshc ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshd ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshe ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshl ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshm ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshn ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddosho ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ddosh ,0, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddosha ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshb ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshc ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshd ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshe ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshl ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshm ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshn ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddosho ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1309 AWP DOCTOR DOSH PR1309 DOCTOR DOSH SOUNDS11 DOCTOR DOSH S.SITE -GAME( 200?, sc4ddoshf ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshg ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshh ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshi ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshj ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ddoshk ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ddoshf ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshg ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshh ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshi ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshj ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ddoshk ,sc4ddosh, sc4, sc4, sc4, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR1736 AWP DOUGH HO HO S4 PR1716 DOUGH HO HO SOUNDS11 DOUGH HO HO S.SITE -GAME( 200?, sc4dhh ,0, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dhha ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dhhb ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dhhc ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dhhd ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dhhe ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dhh ,0, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dhha ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dhhb ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dhhc ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dhhd ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dhhe ,sc4dhh, sc4, sc4, sc4, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR1615 AWP DOUGH SELECTA SCORP4 PR1615 DOUGH SELECTA SOUNDS11 DOUGH SELECTA S.SITE -GAME( 200?, sc4dough ,0, sc4, sc4, sc4, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dougha ,sc4dough, sc4, sc4, sc4, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dough ,0, sc4, sc4, sc4, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dougha ,sc4dough, sc4, sc4, sc4, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2118 DUCKS OF HAZZARD DUCKSOFHAZZARDSND DUCKS OF HAZZARD -GAME( 200?, sc4ducks ,0, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ducksa ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ducksb ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ducksc ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ducks ,0, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ducksa ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ducksb ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ducksc ,sc4ducks, sc4, sc4, sc4, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2313 EMMERDALE EMMR SOUNDS EMMERDALE -GAME( 200?, sc4emmer ,0, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4emmera ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4emmerb ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4emmerc ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4emmer ,0, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4emmera ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4emmerb ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4emmerc ,sc4emmer, sc4, sc4, sc4, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2135 EVOLUTION EVOL SOUNDS EVOLUTION -GAME( 200?, sc4evol ,0, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evola ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evolb ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evolc ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evold ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evole ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evolf ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4evolg ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4evol ,0, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evola ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evolb ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evolc ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evold ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evole ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evolf ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4evolg ,sc4evol, sc4, sc4, sc4, ROT0, "Qps","Evolution (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3233 AWP FAMILY GUY S4 PR3213 FAMILY GUY SOUNDS11 FAMILY GUY S.SITE -GAME( 200?, sc4fguy ,0, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fguya ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fguyb ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fguyc ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fguy ,0, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fguya ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fguyb ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fguyc ,sc4fguy, sc4, sc4, sc4, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1721 AWP FAT BOY SPIN SCORP4 PR1701 FAT BOY SPIN SOUNDS11 FAT BOY SPIN S.SITE -GAME( 200?, sc4fbspn ,0, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbspna ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbspnb ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fbspnc ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fbspn ,0, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbspna ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbspnb ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fbspnc ,sc4fbspn, sc4, sc4, sc4, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2328 FULL METAL JACKPOT FULLM SOUNDS F METAL JACKPOT -GAME( 200?, sc4fmj ,0, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fmja ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fmjb ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4fmjc ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4fmj ,0, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fmja ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fmjb ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4fmjc ,sc4fmj, sc4, sc4, sc4, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2255 GLADIATOR GLAD SOUNDS GLADIATOR -GAME( 200?, sc4glad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4glada ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gladb ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gladc ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gladd ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4glade ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gladf ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gladg ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4glad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4glada ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gladb ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gladc ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gladd ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4glade ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gladf ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gladg ,sc4glad, sc4, sc4, sc4, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1016 GOLD DIGGER PR1016 GOLD DIGGER SOUNDS11 -GAME( 200?, sc4gd ,0, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gda ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdb ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdc ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdd ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gde ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdf ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdg ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gd ,0, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gda ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdb ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdc ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdd ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gde ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdf ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdg ,sc4gd, sc4, sc4, sc4, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X BARX SOUNDS GOLDEN X (are these really Gold Diggers?) -GAME( 200?, sc4gdmz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gold Diggers? / Golden X Game (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdmza ,sc4gdmz, sc4, sc4, sc4, ROT0, "Mazooma","Gold Diggers? / Golden X Game (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gdmz ,0, sc4, sc4, sc4, ROT0, "Mazooma","Gold Diggers? / Golden X Game (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdmza ,sc4gdmz, sc4, sc4, sc4, ROT0, "Mazooma","Gold Diggers? / Golden X Game (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1137 CLUB GOLD DIGGER PR1137 GOLDD CL SOUNDS11 -GAME( 200?, sc4gdclb ,0, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclba ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbb ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbc ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbd ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbe ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbf ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbg ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbh ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbi ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbj ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gdclbk ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gdclb ,0, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclba ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbb ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbc ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbd ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbe ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbf ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbg ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbh ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbi ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbj ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gdclbk ,sc4gdclb, sc4, sc4, sc4, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1034 CASINO GOLDEN BALLS PR1034 GOLDEN BALLS SOUNDS11 -GAME( 200?, sc4gbcas ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gbcasa ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gbcasb ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gbcasc ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gbcas ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gbcasa ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gbcasb ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gbcasc ,sc4gbcas, sc4, sc4, sc4, ROT0, "BFM","Golden Balls Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1604 AWP GOLDEN BALLS PR1604 GOLDEN BALLS SOUNDS12 GOLDEN BALLS S.SITE -GAME( 200?, sc4gball ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gballa ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gballb ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gballc ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gball ,0, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gballa ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gballb ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gballc ,sc4gball, sc4, sc4, sc4, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3046 AWP THE GUNPOWDER SLOT S4 PR3016 GUNPOWDER SLOT SOUNDS11 GUNPOWDER SLOT S.SITE -GAME( 200?, sc4gunp ,0, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpa ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpb ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpc ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpd ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpe ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpf ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gunpg ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4gunp ,0, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpa ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpb ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpc ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpd ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpe ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpf ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gunpg ,sc4gunp, sc4, sc4, sc4, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1306 AWP HAPPY NOTES PR1306 HAPPY NOTES SOUNDS11 -GAME( 200?, sc4hapnt ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hapnta ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hapntb ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hapntc ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hapntd ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hapnte ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hapnt ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hapnta ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hapntb ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hapntc ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hapntd ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hapnte ,sc4hapnt, sc4, sc4, sc4, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1327 CASINO HAPPY NOTES HAPPY NOTES S.SITE PR1327 CAS_HAPPY_NOTES SOUNDS11 -GAME( 200?, sc4hntcs ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsa ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsb ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsc ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hntcs ,0, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsa ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsb ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsc ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1327 CASINO HAPPY NOTES PR1327 CAS_HAPPY_NOTES SOUNDS11 -GAME( 200?, sc4hntcsd ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcse ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsf ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsg ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsh ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsi ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsj ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsk ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsl ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsm ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcsn ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hntcso ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hntcsd ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcse ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsf ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsg ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsh ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsi ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsj ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsk ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsl ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsm ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcsn ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hntcso ,sc4hntcs, sc4, sc4, sc4, ROT0, "BFM","Happy Notes Casino (Bellfruit) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR1201 HELLS BELLS 95004211 HELLS BELLS PR6945 HELLS BELLS (non english?) -GAME( 200?, sc4hellb ,0, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1201) (Dutch?) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hellb ,0, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1201) (Dutch?) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR1419 AWP HELLS BELLS PR1402 HELLS BELLS SOUNDS11 -GAME( 200?, sc4hellba ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbb ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbc ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbd ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbe ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbf ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hellba ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbb ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbc ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbd ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbe ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbf ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1419 AWP HELLS BELLS PR1402 HELLS BELLS SOUNDS11 HELLS BELLS S.SITE -GAME( 200?, sc4hellbg ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbh ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbi ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hellbj ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hellbg ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbh ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbi ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hellbj ,sc4hellb, sc4, sc4, sc4, ROT0, "BFM","Hells Bells (PR1419) (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1643 AWP HILLBILLIONAIRE SCORP4 PR1613 HILLBILLIONAIRE SOUNDS11 HILLBILLIONAIRE S.SITE -GAME( 200?, sc4hill ,0, sc4, sc4, sc4, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hilla ,sc4hill, sc4, sc4, sc4, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hill ,0, sc4, sc4, sc4, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hilla ,sc4hill, sc4, sc4, sc4, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2176 HISSING QUID VIPA SOUNDS HISSING QUID -GAME( 200?, sc4hiss ,0, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissa ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissb ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissc ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissd ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hisse ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissf ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hissg ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hiss ,0, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissa ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissb ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissc ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissd ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hisse ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissf ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hissg ,sc4hiss, sc4, sc4, sc4, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1936 AWP HOT DOG SCORP4 PR1916 HOT DOG SOUNDS11 HOT DOG S.SITE -GAME( 200?, sc4hotdg ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotdga ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4hotdgb ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotdgc ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotdg ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotdga ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4hotdgb ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotdgc ,sc4hotdg, sc4, sc4, sc4, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1733 AWP HOT ROD SCORP4 PR1713 HOT ROD SOUNDS11 HOT ROD S.SITE -GAME( 200?, sc4hotrd ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotrda ,sc4hotrd, sc4, sc4, sc4, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotrd ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotrda ,sc4hotrd, sc4, sc4, sc4, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3231 AWP HOT SHOT SCORP4 PR3211 HOT SHOT SOUNDS11 HOT SHOT S.SITE -GAME( 200?, sc4hotsh ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotsha ,sc4hotsh, sc4, sc4, sc4, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotsh ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotsha ,sc4hotsh, sc4, sc4, sc4, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1311 HOT WAD PR1311 HOT WAD SOUNDS11 -GAME( 200?, sc4hotwd ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotwda ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotwd ,0, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotwda ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1311 HOT WAD PR1311 HOT WAD SOUNDS11 2 HOT WAD S.SITE -GAME( 200?, sc4hotwdb ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotwdc ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotwdd ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4hotwde ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4hotwdb ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotwdc ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotwdd ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4hotwde ,sc4hotwd, sc4, sc4, sc4, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1603 AWP IM A CELEBRITY PR1603 IM A CELEB SOUNDS11 IM A CELEBRITY S.SITE -GAME( 200?, sc4celeb ,0, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4celeba ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4celebb ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4celebc ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4celebd ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4celeb ,0, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4celeba ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4celebb ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4celebc ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4celebd ,sc4celeb, sc4, sc4, sc4, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2555 INNER SPIN V013 INNERSPINSND INNER SPIN -GAME( 200?, sc4inspn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4inspna ,sc4inspn, sc4, sc4, sc4, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4inspn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4inspna ,sc4inspn, sc4, sc4, sc4, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2366 AWP THE ITALIAN JOB S4 PR2366 THE ITALIAN JOB SOUNDS11 ITALIAN JOB S.SITE -GAME( 200?, sc4ijob ,0, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijoba ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobb ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobc ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobd ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobe ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobf ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobg ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobh ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobi ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobj ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ijobk ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ijob ,0, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijoba ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobb ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobc ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobd ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobe ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobf ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobg ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobh ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobi ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobj ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ijobk ,sc4ijob, sc4, sc4, sc4, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1609 JACKPOT JOKERS PR1609 JACKPOT JOKERS SOUNDS11 JACKPOT JOKERS S.SITE -GAME( 200?, sc4jjok ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4jjoka ,sc4jjok, sc4, sc4, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4jjok ,0, sc4, sc4, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4jjoka ,sc4jjok, sc4, sc4, sc4, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2376 LITTLE DEVIL LDEVIL SOUNDS LITTLE DEVIL -GAME( 200?, sc4ldvl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldvla ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldvlb ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ldvlc ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ldvl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldvla ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldvlb ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ldvlc ,sc4ldvl, sc4, sc4, sc4, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1427 AWP RETURN OF THE KING PR1413 RETURN OF THE SOUNDS11 RETURN OF KING S.SITE -GAME( 200?, sc4lotrr ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrra ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrrb ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrrc ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrrd ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4lotrre ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4lotrr ,0, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrra ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrrb ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrrc ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrrd ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4lotrre ,sc4lotrr, sc4, sc4, sc4, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3034 AWP MANIC MINER SCORP4 PR3004 MANIC MINER SOUNDS11 MANIC MINER S.SITE -GAME( 200?, sc4manic ,0, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manica ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manicb ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manicc ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manicd ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manice ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manicf ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4manicg ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4manic ,0, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manica ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manicb ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manicc ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manicd ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manice ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manicf ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4manicg ,sc4manic, sc4, sc4, sc4, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2282 MENTALMONEYMONSTERS MMMO SOUNDS MONEY MONSTERS -GAME( 200?, sc4mmm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmma ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmmb ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmmc ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmmd ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmme ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmmf ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmmg ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mmm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmma ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmmb ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmmc ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmmd ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmme ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmmf ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmmg ,sc4mmm, sc4, sc4, sc4, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2533 MONEY MADNESS MONM SOUNDS MONEY MADNESS -GAME( 200?, sc4mmad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmada ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmadb ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmadc ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mmad ,0, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmada ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmadb ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmadc ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR2533) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR0000 MONEY MADNESS MONM SOUNDS MONEY MADNESS (did Mazooma mess up this release? it has an invalid project code of PR0000, and 3 of the sets are missing their other half) -GAME( 200?, sc4mmadd ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmade ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4mmadf ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing -GAME( 200?, sc4mmadg ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4mmadd ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmade ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4mmadf ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4mmadg ,sc4mmad, sc4, sc4, sc4, ROT0, "Mazooma","Money Madness (PR0000) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR1218 MONEY SPINNER ART12 95004291 MONEYSPINNER PR1158 -GAME( 200?, sc4monsp ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4monsp ,0, sc4, sc4, sc4, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc4monop ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2056) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE -GAME( 200?, sc4monopa ,sc4monop, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2056) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE +GAME( 200?, sc4monop ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2056) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE +GAME( 200?, sc4monopa ,sc4monop, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2056) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE -GAME( 200?, sc4mono5 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR7089) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY -GAME( 200?, sc4mono5a ,sc4mono5, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR7089) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY +GAME( 200?, sc4mono5 ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR7089) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY +GAME( 200?, sc4mono5a ,sc4mono5, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR7089) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR7089 MONO 5 MONO SOUNDS MONOPOLY -GAME( 200?, sc4monoa ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONO SOUNDS MONOPOLY -GAME( 200?, sc4monoaa ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoab ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoac ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoad ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoae ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoaf ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoag ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoah ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4monoai ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoaj ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoak ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoal ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONOPOLY TRIPLE -GAME( 200?, sc4monoam ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoan ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2122 MONOPOLY MONO SOUNDS MONOPOLY -GAME( 200?, sc4monoao ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoap ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monoaq ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ - -GAME( 200?, sc4monot ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2133MONOPOLY TTT MONOPOLY TTT MAZ MONL SOUNDS MONOPOLY -GAME( 200?, sc4monota ,sc4monot, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4monotb ,sc4monot, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ - -GAME( 200?, sc4mondx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MPDX SOUNDS MONOPOLY -GAME( 200?, sc4mondxa ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mondxb ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mondxc ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mondxd ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MONOPOLY TRIPLE -GAME( 200?, sc4mondxg ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ (found in an sc4a40 set) -GAME( 200?, sc4mondxe ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2202 MONOPOLY MONOPOLY TRIPLE MAZ MONOPOLY DELUXE -GAME( 200?, sc4mondxf ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4monoa ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONO SOUNDS MONOPOLY +GAME( 200?, sc4monoaa ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoab ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoac ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoad ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoae ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoaf ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoag ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoah ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4monoai ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoaj ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoak ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoal ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL )// PR2122 MONOPOLY MONOPOLY TRIPLE ARCADE MONOPOLY TRIPLE +GAME( 200?, sc4monoam ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoan ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL )// PR2122 MONOPOLY MONO SOUNDS MONOPOLY +GAME( 200?, sc4monoao ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoap ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monoaq ,sc4monoa, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly (PR2122) (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL )// ^^ + +GAME( 200?, sc4monot ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL )// PR2133MONOPOLY TTT MONOPOLY TTT MAZ MONL SOUNDS MONOPOLY +GAME( 200?, sc4monota ,sc4monot, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4monotb ,sc4monot, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT (PR2133) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL )// ^^ + +GAME( 200?, sc4mondx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MPDX SOUNDS MONOPOLY +GAME( 200?, sc4mondxa ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mondxb ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mondxc ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mondxd ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL )// PR2202 MONOPOLY DELUXE MONOPOLY DELUXE MAZ MONOPOLY TRIPLE +GAME( 200?, sc4mondxg ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL )// ^^ (found in an sc4a40 set) +GAME( 200?, sc4mondxe ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL )// PR2202 MONOPOLY MONOPOLY TRIPLE MAZ MONOPOLY DELUXE +GAME( 200?, sc4mondxf ,sc4mondx, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Deluxe (PR2202) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL )// ^^ // I think these belong to one of the 'Golden Game / Golden X' sets -GAME( 200?, sc4monog ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly? / Golden X Game (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE -GAME( 200?, sc4monoga ,sc4monog, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly? / Golden X Game (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE +GAME( 200?, sc4monog ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly? / Golden X Game (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE +GAME( 200?, sc4monoga ,sc4monog, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly? / Golden X Game (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL )// PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE -GAME( 200?, sc4mcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT Casino (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2133MONOPOLY TTT MONOPOLY TTT ARCADE MONL SOUNDS MONOPOLY +GAME( 200?, sc4mcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly TTT Casino (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2133MONOPOLY TTT MONOPOLY TTT ARCADE MONL SOUNDS MONOPOLY -GAME( 200?, sc4mcasa ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2133 CASINO MONOPOLY MONOPOLY ARCADE MONL SOUNDS MONOPOLY -GAME( 200?, sc4mcasb ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasc ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasd ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcase ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasf ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasg ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcash ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasi ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasj ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ - -GAME( 200?, sc4mcasl ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2354 MONOPOLY CASINO MONOPOLY TRIPLE MAZ MONO SOUNDS MONOPOLY -GAME( 200?, sc4mcasm ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasn ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcaso ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasp ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasq ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasr ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcass ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcast ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mcasv ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcasw ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcasx ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcasy ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcasz ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcas0 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcas1 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcas2 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcas3 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ - -GAME( 200?, sc4mcask ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE -GAME( 200?, sc4mcasu ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mcas4 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4mcasa ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2133 CASINO MONOPOLY MONOPOLY ARCADE MONL SOUNDS MONOPOLY +GAME( 200?, sc4mcasb ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasc ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasd ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcase ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasf ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasg ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcash ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasi ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasj ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2133) (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ + +GAME( 200?, sc4mcasl ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2354 MONOPOLY CASINO MONOPOLY TRIPLE MAZ MONO SOUNDS MONOPOLY +GAME( 200?, sc4mcasm ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasn ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcaso ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasp ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasq ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasr ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcass ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcast ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mcasv ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcasw ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcasx ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcasy ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcasz ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcas0 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcas1 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcas2 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcas3 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2354) (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL )// ^^ + +GAME( 200?, sc4mcask ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL )// PR2056 MONOP TRIPLE MONO SOUNDS MONOP TRIPLE +GAME( 200?, sc4mcasu ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mcas4 ,sc4mcas, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Casino (PR2056) (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL )// ^^ // PR3333 AWP MONOPOLY DOUBLE MONEY S4 PR3308 MPOLY D MONEY SOUNDS11 DOUBLE MONEY S.SITE -GAME( 200?, sc4mdm ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mdma ,sc4mdm, sc4, sc4, sc4, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mdm ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mdma ,sc4mdm, sc4, sc4, sc4, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2380 MONOPOLY HERE AND NOW MR2R SOUNDS NITH -GAME( 200?, sc4mhn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhna ,sc4mhn, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mhn ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhna ,sc4mhn, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2345 AWP MONOPOLY HOT PROPERTY S4 PR2345 HOT PROPERTY SOUNDS11 HOT PROPERTY S.SITE -GAME( 200?, sc4mhp ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpa ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpb ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpc ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpd ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpe ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpf ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpg ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhph ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpi ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpj ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mhpk ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mhp ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpa ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpb ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpc ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpd ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpe ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpf ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpg ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhph ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpi ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpj ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mhpk ,sc4mhp, sc4, sc4, sc4, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1931 AWP MONOLOLY MONEY BAGS SCORP4 PR1911 MPOLY MONEYBAGS SOUNDS11 MONEYBAGS S.SITE -GAME( 200?, sc4mmb ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mmba ,sc4mmb, sc4, sc4, sc4, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mmb ,0, sc4, sc4, sc4, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mmba ,sc4mmb, sc4, sc4, sc4, ROT0, "BFM","Monopoly Money Bags (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2363 RED HOT MONOP MONOPOLY ARCADE MONO SOUNDS MONOPOLY -GAME( 200?, sc4mrh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mrha ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mrhb ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mrhc ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mrhd ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mrhe ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mrh ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mrha ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mrhb ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mrhc ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mrhd ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mrhe ,sc4mrh, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2329 MONOPOLY ROAD TO RICHES MR2R SOUNDS ROAD TO RICHES -GAME( 200?, sc4mr2r ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mr2ra ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mr2rb ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mr2rc ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mr2rd ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4mr2re ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4mr2r ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mr2ra ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mr2rb ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mr2rc ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mr2rd ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4mr2re ,sc4mr2r, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3032 AWP NIGHTMARE ON ELM STREET S4 PR3002 ELM STREET SOUNDS11 NIGHTMARE ELM ST S.SITE -GAME( 200?, sc4nmare ,0, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmarea ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmareb ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nmarec ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4nmare ,0, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmarea ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmareb ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nmarec ,sc4nmare, sc4, sc4, sc4, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1612 PICK OF THE PACK PR1612 PICK OF THE PACK SOUNDS11 PICK OF THE PACK S.SITE -GAME( 200?, sc4potp ,0, sc4, sc4, sc4, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4potpa ,sc4potp, sc4, sc4, sc4, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4potp ,0, sc4, sc4, sc4, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4potpa ,sc4potp, sc4, sc4, sc4, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2562 PINK PANTHER PINK SOUNDS PINK PANTHER -GAME( 200?, sc4pp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppa ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppb ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppc ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppd ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pp ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppa ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppb ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppc ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppd ,sc4pp, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2279 PINK PANTHER CLOUSEAUS REVENGE REVENGE QPS REVENGE SOUNDS -GAME( 200?, sc4ppcr ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcra ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrb ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrd ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcre ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrf ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrg ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrh ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcri ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppcrj ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppcr ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcra ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrb ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrd ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcre ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrf ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrg ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrh ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcri ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppcrj ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2279 CLOUSEAU TOP BOX COROST_TRIPLE SOUNDS REVENGE TIME -GAME( 200?, sc4ppcrtb ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge Top Box (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppcrtb ,sc4ppcr, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Clouseau's Revenge Top Box (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2407 AWP PINK PANTHER CRACK THE CODE SCORP4 PR2407 CRACK THE CODE SOUNDS11 CRACK THE CODE S.SITE -GAME( 200?, sc4ppctc ,0, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctca ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctcb ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctcc ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctcd ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctce ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctcf ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppctcg ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppctc ,0, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctca ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctcb ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctcc ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctcd ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctce ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctcf ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppctcg ,sc4ppctc, sc4, sc4, sc4, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2330 PINK PANTHER DYM PINK PANTHER DYM QPS DYMT SOUNDS PINK PANTHER DYM - -GAME( 200?, sc4ppdym ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymb ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymc ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymd ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymf ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymg ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymh ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymi ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppdym ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymb ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymc ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymd ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymf ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymg ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymh ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymi ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2333 PINK PANTHER TOP BOX DYMT SOUNDS ALL YOUR BASE -GAME( 200?, sc4ppdymtb ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppdymtba ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppdymtb ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppdymtba ,sc4ppdym, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Double Your Money Top Box (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2303 STRIKES AGAIN PPSA SOUNDS STRIKES AGAIN -GAME( 200?, sc4ppsag ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsaga ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagb ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagc ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagd ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsage ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagf ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagg ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagh ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ppsagi ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ppsag ,0, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsaga ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagb ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagc ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagd ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsage ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagf ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagg ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagh ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ppsagi ,sc4ppsag, sc4, sc4, sc4, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1408 PONY EXPRESS PR1408 PONY EXPRESS SOUNDS11 PONY EXPRESS S.SITE -GAME( 200?, sc4pony ,0, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ponya ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ponyb ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ponyc ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ponyd ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ponye ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc4pony ,0, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ponya ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ponyb ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ponyc ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ponyd ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ponye ,sc4pony, sc4, sc4, sc4, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR2417 AWP POPEYE S4 PR2417 POPEYE SOUNDS11 POPEYE S.SITE -GAME( 200?, sc4popey ,0, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4popeya ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4popeyb ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4popeyc ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4popey ,0, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4popeya ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4popeyb ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4popeyc ,sc4popey, sc4, sc4, sc4, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1938 AWP POTS OF GOLD SCORP4 PR1918 POTS OF GOLD SOUNDS11 POTS OF GOLD S.SITE -GAME( 200?, sc4pog ,0, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4poga ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogb ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogc ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogd ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4poge ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogf ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pogg ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pog ,0, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4poga ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogb ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogc ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogd ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4poge ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogf ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pogg ,sc4pog, sc4, sc4, sc4, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2272 POWER PLAY PPLY SOUNDS -GAME( 200?, sc4pwrpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrpla ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrplb ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrplc ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwrpl ,0, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrpla ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrplb ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrplc ,sc4pwrpl, sc4, sc4, sc4, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1614 AWP POWERBALL POWERBALL S.SITE PR1614 POWERBALL SOUNDS11 -GAME( 200?, sc4pwrbl ,0, sc4, sc4, sc4, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4pwrbla ,sc4pwrbl, sc4, sc4, sc4, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4pwrbl ,0, sc4, sc4, sc4, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4pwrbla ,sc4pwrbl, sc4, sc4, sc4, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2342 QUID VICIOUS QUIDV SOUNDS QUID VICIOUS -GAME( 200?, sc4quidv ,0, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidva ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidvb ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4quidvc ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4quidv ,0, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidva ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidvb ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4quidvc ,sc4quidv, sc4, sc4, sc4, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2077 RED HOT X REDX SOUNDS RED HOT X -GAME( 200?, sc4rhx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxa ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxd ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxe ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxj ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxk ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxl ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxm ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rhx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxa ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxd ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxe ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxj ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxk ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxl ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxm ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2077 RED HOT X RED HOT X ARCADE REDX SOUNDS RED HOT X -GAME( 200?, sc4rhxb ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxc ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxf ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxg ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxh ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxi ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxn ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxo ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxp ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxq ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxr ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxs ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxt ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxu ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxv ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxw ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rhxb ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxc ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxf ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxg ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxh ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxi ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxn ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxo ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxp ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxq ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxr ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxs ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxt ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxu ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxv ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxw ,sc4rhx, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL ) // PR2364 CASINO RED HOT X RED HOT X CRHX SOUNDS RED HOT X -GAME( 200?, sc4rhxcs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcsa ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcsb ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcsc ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcsd ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rhxcse ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rhxcs ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcsa ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcsb ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcsc ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcsd ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rhxcse ,sc4rhxcs, sc4, sc4, sc4, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2557 RED SQUARE REDS SOUNDS RED SQUARE -GAME( 200?, sc4redsq ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4redsqa ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4redsqb ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4redsqc ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4redsq ,0, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4redsqa ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4redsqb ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4redsqc ,sc4redsq, sc4, sc4, sc4, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3256 CLUB RONNIE O SULLIVANS TOURNAMENT SCORP4 RONNIE OSULLIVAN CLUB PR3256 RONNIE O SOUNDS11 RONNIE SULLIVAN -GAME( 200?, sc4rosts ,0, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsa ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsb ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsc ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsd ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostse ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsf ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rostsg ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rosts ,0, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsa ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsb ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsc ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsd ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostse ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsf ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rostsg ,sc4rosts, sc4, sc4, sc4, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2311 ROVERS RETURN ROVERS RETURN SOUNDS ROVERS RETURN -GAME( 200?, sc4rovrt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rovrta ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rovrtb ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rovrtc ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rovrtd ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4rovrte ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4rovrt ,0, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rovrta ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rovrtb ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rovrtc ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rovrtd ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4rovrte ,sc4rovrt, sc4, sc4, sc4, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3043 AWP SHOW TIME S4 PR3013 SHOWTIME SOUNDS11 SHOW TIME S.SITE -GAME( 200?, sc4showt ,0, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4showta ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4showtb ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4showtc ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4showtd ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4showte ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4showt ,0, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4showta ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4showtb ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4showtc ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4showtd ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4showte ,sc4showt, sc4, sc4, sc4, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1411 AWP SNAKES AND LADDERS PR1411 SNAKES A L SOUNDS11 SNAKES & LADDERS S.SITE -GAME( 200?, sc4slad ,0, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slada ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladb ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladc ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladd ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4slade ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladf ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladg ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sladh ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4slad ,0, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slada ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladb ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladc ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladd ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4slade ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladf ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladg ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sladh ,sc4slad, sc4, sc4, sc4, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR1921 AWP SPICE IT UP SCORP4 PR1901 SPICE IT UP SOUNDS11 SPICE IT UP S.SITE -GAME( 200?, sc4spice ,0, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4spicea ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4spiceb ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4spicec ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4spice ,0, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4spicea ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4spiceb ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4spicec ,sc4spice, sc4, sc4, sc4, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2232 SPIN WHEN YOU'RE WINNING SPIN SOUNDS -GAME( 200?, sc4swywm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywma ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywmb ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywmc ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywmd ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywme ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywmf ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swywmg ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4swywm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywma ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywmb ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywmc ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywmd ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywme ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywmf ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swywmg ,sc4swywm, sc4, sc4, sc4, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2176 SUMMIT UP SUMMIT SOUNDS SUMMIT UP (was in the Suits U Sir set) -GAME( 200?, sc4sumit ,0, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sumita ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sumitb ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sumitc ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sumit ,0, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sumita ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sumitb ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sumitc ,sc4sus, sc4, sc4, sc4, ROT0, "Mazooma","Summit Up (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2255 SUITUSIR SUIT SOUNDS SUITS U SIR -GAME( 200?, sc4sus ,0, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susc ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susf ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susg ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sush ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susi ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susj ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4susk ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sus ,0, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susc ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susf ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susg ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sush ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susi ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susj ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4susk ,sc4sus, sc4, sc4, sc4, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3081 CLUB SUPER SLAM SUPER SLAM CLUB PR3080 SUPER SLAM SOUNDS11 -GAME( 200?, sc4sslam ,0, sc4, sc4, sc4, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4sslama ,sc4sslam, sc4, sc4, sc4, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4sslam ,0, sc4, sc4, sc4, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4sslama ,sc4sslam, sc4, sc4, sc4, ROT0, "BFM","Super Slam (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2235 SWITCHBACK SWBK SOUNDS SWITCHBACK -GAME( 200?, sc4swbak ,0, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swbaka ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swbakb ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4swbakc ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4swbak ,0, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swbaka ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swbakb ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4swbakc ,sc4swbak, sc4, sc4, sc4, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1714 AWP TAKE THE PIECE S4 PR1714 TAKE THE PIECE SOUNDS11 TAKETHEPIECE S.SITE -GAME( 200?, sc4ttpie ,0, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpiec ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ttpie ,0, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpiec ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1734 AWP TAKE THE PIECE S4 PR1714 TAKE THE PIECE SOUNDS11 TAKETHEPIECE S.SITE -GAME( 200?, sc4ttpiea ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpieb ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpied ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpiee ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpief ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ttpieg ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ttpiea ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpieb ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpied ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpiee ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpief ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ttpieg ,sc4ttpie, sc4, sc4, sc4, ROT0, "BFM","Take The Piece (Bellfruit) (PR1734) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3031 AWP TAKE YOUR PICK S4 PR3001 TAKE YOUR PICK SOUNDS11 TAKE YOUR PICK S.SITE -GAME( 200?, sc4typ ,0, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4typa ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4typb ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4typc ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4typ ,0, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4typa ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4typb ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4typc ,sc4typ, sc4, sc4, sc4, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLD X TRIPLE BARX SOUNDS J GOLD X TRIPLE (is this really a game called Top Box or just the top box roms for one of the Golden X Game sets) -GAME( 200?, sc4tbox ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tbox ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2211 TOP OF THE SHOTS TOTS SOUNDS TOP OF THE SHOTS -GAME( 200?, sc4tpsht ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshta ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshtb ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshtc ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshtd ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshte ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshtf ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4tpshtg ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4tpsht ,0, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshta ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshtb ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshtc ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshtd ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshte ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshtf ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4tpshtg ,sc4tpsht, sc4, sc4, sc4, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2170 TRAIL BLAZER TRAB SOUNDS TRAIL BLAZER -GAME( 200?, sc4trail ,0, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4traila ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4trailb ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4trailc ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4trail ,0, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4traila ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4trailb ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4trailc ,sc4trail, sc4, sc4, sc4, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6907 VIVA MEXICO PR6907 VIVA MEXICO SOUNDS11 -GAME( 200?, sc4vivam ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivama ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivamb ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivamc ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vivam ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivama ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivamb ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivamc ,sc4vivam, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR6927 CASINO VIVA MEXICO PR6927 VIVAMEXICO SOUNDS11 -GAME( 200?, sc4vivcs ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcsa ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vivcs ,0, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcsa ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR6927 CASINO VIVA MEXICO PR6927 VIVAMEXICO SOUNDS21 -GAME( 200?, sc4vivcsb ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcsc ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcsd ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcse ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcsf ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4vivcsg ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4vivcsb ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcsc ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcsd ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcse ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcsf ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4vivcsg ,sc4vivcs, sc4, sc4, sc4, ROT0, "BFM","Viva Mexico Casino (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR0000 WILD JACKPOTS WJPT SOUNDS WILD JACKPOTS -GAME( 200?, sc4wldjk ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjka ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjkb ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjkc ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjkd ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjke ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjkf ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4wldjkg ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4wldjk ,0, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjka ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjkb ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjkc ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjkd ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjke ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjkf ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4wldjkg ,sc4wldjk, sc4, sc4, sc4, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1611 AWP ANT AND DECS PR1611 ANT AND DECS SOUNDS11 ANT AND DECS S.SITE -GAME( 200?, sc4adsnt ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4adsnta ,sc4adsnt, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4adsnt ,0, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4adsnta ,sc4adsnt, sc4, sc4, sc4, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1728 AWP BULLY'S PRIZE BOARD PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE -GAME( 200?, sc4bpb ,0, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bpbc ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bpb ,0, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bpbc ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1728 AWP BULLY'S PRIZE BOARD S4 PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE -GAME( 200?, sc4bpba ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bpbb ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bpbd ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bpbe ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bpba ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bpbb ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bpbd ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bpbe ,sc4bpb, sc4, sc4, sc4, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3040 AWP BULLYS STAR PRIZE SCORP4 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE -GAME( 200?, sc4bsp ,0, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspa ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspb ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspc ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspd ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspg ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bsp ,0, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspa ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspb ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspc ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspd ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspg ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3040) (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3042 AWP BULLYS STAR PRIZE SCORP4 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE -GAME( 200?, sc4bspe ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4bspf ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4bspe ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4bspf ,sc4bsp, sc4, sc4, sc4, ROT0, "BFM","Bully's Star Prize (PR3042) (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1316 AWP CHAIN REACTION PR1312 CHAIN REACT SOUNDS11 -GAME( 200?, sc4chain ,0, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chaina ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chainb ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4chainc ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4chain ,0, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chaina ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chainb ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4chainc ,sc4chain, sc4, sc4, sc4, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1727 AWP CLOWN AROUND SCORP4 PR1707 CLOWN AROUND SOUNDS11 CLOWN AROUND S.SITE -GAME( 200?, sc4clown ,0, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clowna ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clownb ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clownc ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clownd ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clowne ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clownf ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4clowng ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4clown ,0, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clowna ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clownb ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clownc ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clownd ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clowne ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clownf ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4clowng ,sc4clown, sc4, sc4, sc4, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1412 AWP COPS AND ROBBERS PR1412 COPS AND ROBBERS SOUNDS11 COPS AND ROBBERS S.SITE -GAME( 200?, sc4copsr ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsra ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrb ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrc ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrd ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsre ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrf ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrg ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsrh ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4copsri ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4copsr ,0, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsra ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrb ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrc ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrd ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsre ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrf ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrg ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsrh ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4copsri ,sc4copsr, sc4, sc4, sc4, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1935 AWP DEAL OR NO DEAL BEAT THE BANKER S4 PR1915 BEAT THE BANKER SOUNDS11 BEAT THE BANKER S.SITE -GAME( 200?, sc4dndbe ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbeb ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbec ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbed ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbee ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbef ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbeg ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbeh ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbei ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbej ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbek ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbel ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbem ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndben ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndbe ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbeb ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbec ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbed ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbee ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbef ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbeg ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbeh ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbei ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbej ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbek ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbel ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbem ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndben ,sc4dndbe, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR3337 AWP DEAL OR NO DEAL BOX CLEVER SCORP4 PR3312 DOND BOXCLEVER SOUNDS11 BOX CLEVER S.SITE -GAME( 200?, sc4dndbc ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4dndbca ,sc4dndbc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4dndbc ,0, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4dndbca ,sc4dndbc, sc4, sc4, sc4, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc4mowow ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2118 MONOPOLY WOTW WOTW SOUNDS MONOPOLY WOTW 8P -GAME( 200?, sc4mowowa ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowb ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowc ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowd ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR1726 AWP WHEEL OF WEALTH PR1706 WHEEL OF WEALTH SOUNDS11 WHEEL OF WEALTH S.SITE -GAME( 200?, sc4mowowe ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowf ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2389 WHEEL OF WEALTH WOWT SOUNDS WHEEL OF WEAL -GAME( 200?, sc4mowowg ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowh ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4mowowi ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4mowowj ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4mowow ,0, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2118 MONOPOLY WOTW WOTW SOUNDS MONOPOLY WOTW 8P +GAME( 200?, sc4mowowa ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowb ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowc ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowd ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1726 AWP WHEEL OF WEALTH PR1706 WHEEL OF WEALTH SOUNDS11 WHEEL OF WEALTH S.SITE +GAME( 200?, sc4mowowe ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowf ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR2389 WHEEL OF WEALTH WOWT SOUNDS WHEEL OF WEAL +GAME( 200?, sc4mowowg ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowh ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4mowowi ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4mowowj ,sc4mowow, sc4, sc4, sc4, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ // PR2166 NUN N ROSES NANR SOUNDS NUNS N ROSES -GAME( 200?, sc4nunsm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmb ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmc ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmd ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsme ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmf ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmg ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmh ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmi ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4nunsmj ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4nunsm ,0, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmb ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmc ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmd ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsme ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmf ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmg ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmh ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmi ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4nunsmj ,sc4nunsm, sc4, sc4, sc4, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 200?, sc_unsrt ,0, sc4, sc4, sc4, ROT0, "","unknown Scorpion 'Unsorted Sound' (Unknown) (Scorpion ?)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc_unsrt ,0, sc4, sc4, sc4, ROT0, "","unknown Scorpion 'Unsorted Sound' (Unknown) (Scorpion ?)", GAME_IS_SKELETON_MECHANICAL ) // These all basically seem to have the same strings as header info... probably all builds of the same basic game // PR2056 GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4ggcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggcasa ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggcasb ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4ggcasc ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc4ggcas ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggcasa ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggcasb ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4ggcasc ,sc4ggcas, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Casino (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4gnc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gnca ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gncb ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gncc ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gncd ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc4gnce ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 200?, sc4ggame ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE -GAME( 200?, sc4ggamee ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggameo ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameh ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X -GAME( 200?, sc4ggamei ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamel ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamem ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamep ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameq ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamer ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamew ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamex ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 25)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamey ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 26)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamez ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 27)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame1 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 29)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame2 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 30)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame7 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 35)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame8 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 36)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame9 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 37)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameaa ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 38)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameab ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 39)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameac ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 40)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamead ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 41)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameae ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 42)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamea ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 GOLDEN X BARX SOUNDS GOLDEN X -GAME( 200?, sc4ggameb ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggamec ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggamed ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggamef ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggameg ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggamej ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamek ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamen ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggames ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamet ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggameu ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggamev ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame0 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 28)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame3 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 31)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame4 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 32)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame5 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 33)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggame6 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 34)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4gnc ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gnca ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gncb ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gncc ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gncd ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc4gnce ,sc4gnc, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Club (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) + +GAME( 200?, sc4ggame ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE +GAME( 200?, sc4ggamee ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggameo ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameh ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X +GAME( 200?, sc4ggamei ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamel ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamem ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamep ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameq ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamer ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamew ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 24)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamex ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 25)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamey ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 26)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamez ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 27)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame1 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 29)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame2 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 30)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame7 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 35)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame8 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 36)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame9 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 37)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameaa ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 38)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameab ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 39)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameac ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 40)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamead ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 41)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameae ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 42)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamea ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X BARX SOUNDS GOLDEN X +GAME( 200?, sc4ggameb ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggamec ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggamed ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggamef ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggameg ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggamej ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamek ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamen ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggames ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamet ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 21)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggameu ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 22)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggamev ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 23)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame0 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 28)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame3 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 31)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame4 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 32)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame5 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 33)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggame6 ,sc4ggame, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 4) (set 34)", GAME_IS_SKELETON_MECHANICAL )// ^^ // these were in the above sets -GAME( 200?, sc4ggdlx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2201 GOLDEN X GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX -GAME( 200?, sc4ggdlxc ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggdlxa ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2201 GOLDEN X GOLDEN GAME DLX MAZ GXDX SOUNDS GOLDEN X -GAME( 200?, sc4ggdlxb ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggdlxd ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggdlxe ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggdlxf ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR2201 GOLDEN GAME DELUXE GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX -GAME( 200?, sc4ggdlxg ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4ggdlx ,0, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL )// PR2201 GOLDEN X GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX +GAME( 200?, sc4ggdlxc ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggdlxa ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL )// PR2201 GOLDEN X GOLDEN GAME DLX MAZ GXDX SOUNDS GOLDEN X +GAME( 200?, sc4ggdlxb ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggdlxd ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggdlxe ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggdlxf ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL )// PR2201 GOLDEN GAME DELUXE GOLDEN GAME MAZ GXDX SOUNDS GOLDEN GAME DLX +GAME( 200?, sc4ggdlxg ,sc4ggdlx, sc4, sc4, sc4, ROT0, "Mazooma","Golden Game Deluxe (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL )// ^^ // most of these look similar -GAME( 200?, sc4ggg ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE -GAME( 200?, sc4gggj ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4ggga ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X -GAME( 200?, sc4gggb ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4gggc ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4gggd ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4ggge ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4gggf ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4gggk ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggl ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggm ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggn ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggo ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggp ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggg ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2353 GRAND GOLDEN GAME GRAND GOLDEN GAME MAZ BARX SOUNDS GOLDEN GAME -GAME( 200?, sc4gggh ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc4gggi ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggq ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggr ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc4gggs ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ +GAME( 200?, sc4ggg ,0, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLD X TRIPLE BARX SOUNDS GOLD X TRIPLE +GAME( 200?, sc4gggj ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4ggga ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2056 GOLDEN X GOLDEN GAME ARCADE BARX SOUNDS GOLDEN X +GAME( 200?, sc4gggb ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4gggc ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4gggd ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4ggge ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4gggf ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4gggk ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 12)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggl ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 13)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggm ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 14)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggn ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 15)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggo ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 16)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggp ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 17)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggg ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2353 GRAND GOLDEN GAME GRAND GOLDEN GAME MAZ BARX SOUNDS GOLDEN GAME +GAME( 200?, sc4gggh ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc4gggi ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggq ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 18)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggr ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 19)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc4gggs ,sc4ggg, sc4, sc4, sc4, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 4) (set 20)", GAME_IS_SKELETON_MECHANICAL )// ^^ /* Scorpion 4 + Adder 4 */ -GAME( 200?, ad4skill ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Skill Dice (BFM) (Scorpion 4 + Adder 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad4film ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // the 68k vectors differ from usual, but it contains the expected strings for an Adder 4 title. No main program roms tho? :/ -GAME( 200?, ad4filma ,ad4film, sc4_adder4, sc4, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, ad4ctl ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad4ctla ,ad4ctl, sc4_adder4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - - +GAME( 200?, ad4skill ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Skill Dice (BFM) (Scorpion 4 + Adder 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad4film ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // the 68k vectors differ from usual, but it contains the expected strings for an Adder 4 title. No main program roms tho? :/ +GAME( 200?, ad4filma ,ad4film, sc4_adder4, sc4, sc4, ROT0, "BFM","Film Premiere (Video?) (Bellfruit) (Adder 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, ad4ctl ,0, sc4_adder4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad4ctla ,ad4ctl, sc4_adder4, sc4, sc4, ROT0, "BFM","Cop The Lot Club (Video) (Bellfruit) (Adder 4) (set 2)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/bfm_sc5.c mame-0.145/src/mame/drivers/bfm_sc5.c --- mame-0.144/src/mame/drivers/bfm_sc5.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_sc5.c 2012-02-06 21:30:34.000000000 +0000 @@ -14,20 +14,28 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" -#include "bfm_sc45.h" +#include "includes/bfm_sc45.h" class sc5_state : public driver_device { public: sc5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( sc5_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( sc5_map, AS_PROGRAM, 32, sc5_state ) AM_RANGE(0x00000000, 0x002fffff) AM_ROM AM_RANGE(0x01000000, 0x0100ffff) AM_RAM AM_RANGE(0x40000000, 0x40000fff) AM_RAM @@ -46,8 +54,6 @@ - - ROM_START( sc5plays ) ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD16_BYTE( "95424604.lo", 0x00001, 0x080000, CRC(5246dbec) SHA1(427134776ec8301c2eaea0c998234dd439952749) ) @@ -11808,2150 +11814,2150 @@ } // PR2437 28 PLAYS LATER TEDL SOUNDS NITH -GAME( 200?, sc5plays ,0, sc5, sc5, sc5, ROT0, "Qps","28 Plays Later (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5playsa ,sc5plays, sc5, sc5, sc5, ROT0, "Qps","28 Plays Later (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5plays ,0, sc5, sc5, sc5, ROT0, "Qps","28 Plays Later (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5playsa ,sc5plays, sc5, sc5, sc5, ROT0, "Qps","28 Plays Later (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3214 AWP ANT N DECS SNT GRAB THE ADS S5 PR3214 SNT GRAB THE ADS SOUNDS11 GRAB THE ADS S.SITE -GAME( 200?, sc5adga ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adgaa ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adgab ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adgac ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5adga ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adgaa ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adgab ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adgac ,sc5adga, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Ads (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3214 AWP ANT N DECS GRAB THE CASH S5 PR3214 GRAB THE CASH SOUNDS11 GRAB THE CASH S.SITE -GAME( 200?, sc5adgtc ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Cash (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adgtca ,sc5adgtc, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Cash (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5adgtc ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Cash (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adgtca ,sc5adgtc, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Grab The Cash (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // Z053 BANKJOB PR000053 BANKJOB 1 BANKJOB AWP (this numbering looks more like QPS) -GAME( 200?, sc5bjob ,0, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjoba ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobb ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobc ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobd ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobe ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobf ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobg ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobh ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bjobi ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bjob ,0, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjoba ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobb ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobc ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobd ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobe ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobf ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobg ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobh ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bjobi ,sc5bjob, sc5, sc5, sc5, ROT0, "BFM","Bank Job (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2077KING X KING X MAZ BARKX SOUNDS KING X -GAME( 200?, sc5bkngx ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bar King X (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bkngxa ,sc5bkngx, sc5, sc5, sc5, ROT0, "Mazooma","Bar King X (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bkngx ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bar King X (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bkngxa ,sc5bkngx, sc5, sc5, sc5, ROT0, "Mazooma","Bar King X (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3216 AWP BUCKANEERS SCORP5 PR3216 BUCKANEERS SOUNDS11 BUCKANEERS S.SITE -GAME( 200?, sc5bucc ,0, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bucca ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5buccb ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5buccc ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5buccd ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bucce ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bucc ,0, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bucca ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5buccb ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5buccc ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5buccd ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bucce ,sc5bucc, sc5, sc5, sc5, ROT0, "BFM","Buccaneers (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3205 AWP BULLSEYE POUNDS FOR POINTS S5 PR3205 BULLYS PNDSFPTS SOUNDS11 POUNDS FOR POINT S.SITE -GAME( 200?, sc5bpfpb ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Pounds For Points (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bpfpba ,sc5bpfpb, sc5, sc5, sc5, ROT0, "BFM","Bullseye Pounds For Points (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bpfpb ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Pounds For Points (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bpfpba ,sc5bpfpb, sc5, sc5, sc5, ROT0, "BFM","Bullseye Pounds For Points (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1914 AWP THREE IN A BED BULLSEYE SCORP5 PR1914 THREE I A BED B SOUNDS11 3IAB BULLSEYE S.SITE -GAME( 200?, sc5btiab ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Three In A Bed (Bellfruit) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5btiab ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Three In A Bed (Bellfruit) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR1744 BULLSEYE TRIPLE BULLSEYE TRIPLE ARCADE PR1743 CASINO BULLSEYE SOUNDS11 -GAME( 200?, sc5btrip ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5btripa ,sc5btrip, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5btrip ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5btripa ,sc5btrip, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2197 BUNNY MONEY BUNNY MONEY BUNN SOUNDS BUNNY MONEY -GAME( 200?, sc5bunny ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bunny Money (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bunnya ,sc5bunny, sc5, sc5, sc5, ROT0, "Mazooma","Bunny Money (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bunny ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bunny Money (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bunnya ,sc5bunny, sc5, sc5, sc5, ROT0, "Mazooma","Bunny Money (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // Z054 CANNON PR000054 CANNON 1 CANNON AWP (looks more like a QPS header) -GAME( 200?, sc5cbrun ,0, sc5, sc5, sc5, ROT0, "BFM","Cannonball Run (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cbruna ,sc5cbrun, sc5, sc5, sc5, ROT0, "BFM","Cannonball Run (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cbrun ,0, sc5, sc5, sc5, ROT0, "BFM","Cannonball Run (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cbruna ,sc5cbrun, sc5, sc5, sc5, ROT0, "BFM","Cannonball Run (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1681 181104 CASH FACTOR PR1681 CASH FACTOR 1 CASH FACTOR AWP -GAME( 200?, sc5cfact ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Factor (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfacta ,sc5cfact, sc5, sc5, sc5, ROT0, "BFM","Cash Factor (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cfact ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Factor (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfacta ,sc5cfact, sc5, sc5, sc5, ROT0, "BFM","Cash Factor (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3204 AWP CASH OF THE TITANS S5 PR3204 CASH TITANS SOUNDS11 CASH OF TITANS S.SITE -GAME( 200?, sc5ctit ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Of The Titans (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ctita ,sc5ctit, sc5, sc5, sc5, ROT0, "BFM","Cash Of The Titans (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ctit ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Of The Titans (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ctita ,sc5ctit, sc5, sc5, sc5, ROT0, "BFM","Cash Of The Titans (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2343 CASH RAIDER RAID SOUNDS NITH -GAME( 200?, sc5craid ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cash Raider (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5craida ,sc5craid, sc5, sc5, sc5, ROT0, "Mazooma","Cash Raider (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5craid ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cash Raider (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5craida ,sc5craid, sc5, sc5, sc5, ROT0, "Mazooma","Cash Raider (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1610 AWP CASH VEGAS PR1610 CASH VEGAS SOUNDS11 CASH VEGAS S.SITE -GAME( 200?, sc5cvega ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Vegas (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cvegaa ,sc5cvega, sc5, sc5, sc5, ROT0, "BFM","Cash Vegas (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cvega ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Vegas (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cvegaa ,sc5cvega, sc5, sc5, sc5, ROT0, "BFM","Cash Vegas (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2210 CHOP 'N' CHANGE CHOP SOUNDS CHOP 'N' CHANGE -GAME( 200?, sc5chopc ,0, sc5, sc5, sc5, ROT0, "Mazooma","Chop 'n' Change (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chopca ,sc5chopc, sc5, sc5, sc5, ROT0, "Mazooma","Chop 'n' Change (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5chopc ,0, sc5, sc5, sc5, ROT0, "Mazooma","Chop 'n' Change (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chopca ,sc5chopc, sc5, sc5, sc5, ROT0, "Mazooma","Chop 'n' Change (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2422 BINGO BAR7 S5 PR1433 BAR SEVENS SOUNDS11 BAR7 S.SITE -GAME( 200?, sc5cbar7 ,0, sc5, sc5, sc5, ROT0, "Mazooma","Classic Bar 7 (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cbar7a ,sc5cbar7, sc5, sc5, sc5, ROT0, "Mazooma","Classic Bar 7 (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cbar7 ,0, sc5, sc5, sc5, ROT0, "Mazooma","Classic Bar 7 (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cbar7a ,sc5cbar7, sc5, sc5, sc5, ROT0, "Mazooma","Classic Bar 7 (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2495 CLUEDO CLUEDO SOUNDS CLUEDO -GAME( 200?, sc5clu70 ,0, sc5, sc5, sc5, ROT0, "Qps","Cluedo 70 (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clu70a ,sc5clu70, sc5, sc5, sc5, ROT0, "Qps","Cluedo 70 (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clu70 ,0, sc5, sc5, sc5, ROT0, "Qps","Cluedo 70 (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clu70a ,sc5clu70, sc5, sc5, sc5, ROT0, "Qps","Cluedo 70 (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2339 CLUEDO CASINO CLUEDO CASINO MAZ CCLU SOUNDS GET A CLUE -GAME( 200?, sc5clcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo Casino (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clcasa ,sc5clcas, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo Casino (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo Casino (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clcasa ,sc5clcas, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo Casino (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3320 AWP CLUEDO NOTORIOUS S5 PR3320 CLUEDO SOUNDS11 CLUEDO NOTORIOUS S.SITE -GAME( 200?, sc5clnot ,0, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnota ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnotb ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnotc ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnotd ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnote ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnotf ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clnotg ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clnot ,0, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnota ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnotb ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnotc ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnotd ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnote ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnotf ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clnotg ,sc5clnot, sc5, sc5, sc5, ROT0, "BFM","Cluedo Notorious (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2332 CLUEDO THE USUAL SUSPECTS CTUS SOUNDS CLUEDO CTUL -GAME( 200?, sc5clus ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusa ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusb ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusc ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusd ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cluse ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusf ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusg ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clush ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusi ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusj ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clusk ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clus ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusa ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusb ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusc ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusd ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cluse ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusf ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusg ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clush ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusi ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusj ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clusk ,sc5clus, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo The Usual Suspects (Mazooma) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR3317 AWP THE COLOUR OF MONEY S5 PR3317 COLOUR OF MONEY SOUNDS11 COLOUR OF MONEY S.SITE -GAME( 200?, sc5colmo ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5colmoa ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5colmob ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5colmoc ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5colmo ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5colmoa ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5colmob ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5colmoc ,sc5colmo, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3502 AWP THE COLOUR OF MONEY NEW S5 PR3502 C OF M TEN SOUNDS11 COLOUR OF MONEY2 S.SITE -GAME( 200?, sc5newcm ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5newcma ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5newcmb ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5newcmc ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5newcm ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5newcma ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5newcmb ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5newcmc ,sc5newcm, sc5, sc5, sc5, ROT0, "BFM","Colour Of Money New, The (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3506 AWP COPS AND ROBBERS ON THE RUN S5 PR3506 C & R ON T RUN SOUNDS11 ON THE RUN S.SITE -GAME( 200?, sc5crotr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers On The Run (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crotra ,sc5crotr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers On The Run (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crotr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers On The Run (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crotra ,sc5crotr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers On The Run (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3427 CLUB COPS N ROBBERS SMASH N GRAB SCORP5 PR3421 CNR_SNG SOUNDS11 SMASH N GRAB CLUB -GAME( 200?, sc5crsgc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsgca ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crsgc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsgca ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3421 CLUB COPS N ROBBERS SMASH N GRAB SCORP5 PR3421 CNR_SNG SOUNDS11 SMASH N GRAB CLUB -GAME( 200?, sc5crsgcb ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsgcc ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crsgcb ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsgcc ,sc5crsgc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3421 CLUB COPS N ROBBERS SMASH N GRAB SCORP5 PR3421 CNR_SNG SOUNDS11 SMASH N GRAB CLUB (same ident as some of the sc5crsgc sets..) -GAME( 200?, sc5crsgr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsgra ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsgrb ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsgrc ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crsgr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsgra ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsgrb ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsgrc ,sc5crsgr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Smash 'n' Grab (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3521 AWP CORONATION STREET SCORP5 PR3521 CORRONATION ST SOUNDS11 CORONATION ST S.SITE -GAME( 200?, sc5corst ,0, sc5, sc5, sc5, ROT0, "BFM","Coronation Street (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corsta ,sc5corst, sc5, sc5, sc5, ROT0, "BFM","Coronation Street (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5corst ,0, sc5, sc5, sc5, ROT0, "BFM","Coronation Street (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corsta ,sc5corst, sc5, sc5, sc5, ROT0, "BFM","Coronation Street (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3417 AWP CRAZYFRUIT AND NUTCASE SCORP5 PR3417 CF NUTCASE SOUNDS11 CF& NUTCASE S.SITE -GAME( 200?, sc5cfnc ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruit & Nutcase (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfnca ,sc5cfnc, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruit & Nutcase (Bellfruit) (Scorpion 5) (set 2", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cfnc ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruit & Nutcase (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfnca ,sc5cfnc, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruit & Nutcase (Bellfruit) (Scorpion 5) (set 2", GAME_IS_SKELETON_MECHANICAL ) // PR3436 CRAZY FRUITS COMMUNITY PARTY CRAZY FRUITS CP ARCADE PR3436 CF COMMUNITY P SOUNDS11 -GAME( 200?, sc5cfcp ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfcpa ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfcpb ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfcpc ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfcpd ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfcpe ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cfcp ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfcpa ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfcpb ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfcpc ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfcpd ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfcpe ,sc5cfcp, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Community Party (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1359 CASINO CRAZY FRUITS PARTY PR1359 CRAZY F PARTY SOUNDS11 -GAME( 200?, sc5cfpt ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfpta ,sc5cfpt, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cfptb ,sc5cfpt, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cfpt ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfpta ,sc5cfpt, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cfptb ,sc5cfpt, sc5, sc5, sc5, ROT0, "BFM","Crazy Fruits Party Time (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR3418 AWP CRAZY KNIGHTS SCORP5 PR3418 CRAZY KNIGHTS SOUNDS11 CRAZY KNIGHTS S.SITE -GAME( 200?, sc5cknig ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Knights (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ckniga ,sc5cknig, sc5, sc5, sc5, ROT0, "BFM","Crazy Knights (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cknig ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Knights (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ckniga ,sc5cknig, sc5, sc5, sc5, ROT0, "BFM","Crazy Knights (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1741 CRAZY PAYS SCORP5 PR1741 CRAZY PAYS SOUNDS11 CRAZY PAYS S.SITE -GAME( 200?, sc5cpays ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Pays (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cpaysa ,sc5cpays, sc5, sc5, sc5, ROT0, "BFM","Crazy Pays (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cpays ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Pays (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cpaysa ,sc5cpays, sc5, sc5, sc5, ROT0, "BFM","Crazy Pays (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3409 AWP DEAL OR NO DEAL BANKERS BONUS S5 PR3409 BANKERS BONUS SOUNDS11 BANKERS BONUS S.SITE -GAME( 200?, sc5dndbo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndboa ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbob ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndboc ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbod ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndboe ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbof ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbog ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndboh ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndboi ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndboa ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbob ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndboc ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbod ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndboe ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbof ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbog ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndboh ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndboi ,sc5dndbo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Banker's Bonus (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3068 CLUB BEAT THE BANKER BEAT THE BANKER CLUB PR3068 BEAT THE BANKER SOUNDS11 -GAME( 200?, sc5dndbl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbla ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblb ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblc ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbld ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndble ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblf ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblg ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblh ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbli ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblj ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblk ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbll ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblm ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbln ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndblo ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbla ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblb ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblc ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbld ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndble ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblf ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblg ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblh ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbli ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblj ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblk ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbll ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblm ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbln ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndblo ,sc5dndbl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Club (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // these contain no 'PROJECT NUMBER' ident string. -GAME( 200?, sc5dndbq ,0, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbqa ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbqb ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbqc ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbqd ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbqe ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbq ,0, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbqa ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbqb ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbqc ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbqd ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbqe ,sc5dndbq, sc5, sc5, sc5, ROT0, "Qps","Deal Or No Deal Beat The Banker (Qps) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3503 AWP DEAL OR NO DEAL COPS AND ROBBERS S5 PR3503 DOND CNR SOUNDS11 DOND COPS S.SITE -GAME( 200?, sc5dndcr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcra ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcrb ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcrc ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndcr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcra ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcrb ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcrc ,sc5dndcr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3545 AWP DESERT ISLAND DEAL S5 PR3545 DOND D I D SOUNDS11 DESERT ISLAND DL S.SITE -GAME( 200?, sc5dndde ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Desert Island Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddea ,sc5dndde, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Desert Island Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndde ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Desert Island Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddea ,sc5dndde, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Desert Island Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3420 AWP DIAMOND DOND S5 PR3420 DIAMOND DOND SOUNDS11 DIAMOND DOND S.SITE -GAME( 200?, sc5dnddi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddia ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddib ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddic ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddia ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddib ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddic ,sc5dnddi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Diamond (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3313 AWP DEAL OR NO DEAL DOUBLE TAKE S5 PR3313 DOUBLE TAKE SOUNDS11 DOUBLE TAKE S.SITE -GAME( 200?, sc5dnddt ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddta ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddtb ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddtc ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddtd ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddte ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddtf ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddt ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddta ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddtb ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddtc ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddtd ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddte ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddtf ,sc5dnddt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Take (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR3316 AWP DOND DREAM OFFER S5 PR3316 DREAM OFFER SOUNDS11 DREAM OFFER S.SITE -GAME( 200?, sc5dnddo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddoa ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddob ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddoc ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddoa ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddob ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddoc ,sc5dnddo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Dream Offer (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3432 AWP DEAL OR NO DEAL FEELING LUCKY SCORP5 PR3309 FEELING LUCKY SOUNDS11 FEELING LUCKY S.SITE -GAME( 200?, sc5dndfl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3432) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndfla ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3432) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndfl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3432) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndfla ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3432) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3309 AWP DEAL OR NO DEAL FEELING LUCKY SCORP5 PR3309 FEELING LUCKY SOUNDS11 FEELING LUCKY S.SITE -GAME( 200?, sc5dndflb ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndflc ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndfld ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndfle ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndflb ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndflc ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndfld ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndfle ,sc5dndfl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Feeling Lucky (PR3309) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3501 AWP DEAL OR NO DEAL GAME ON SCORP5 PR3501 DOND GAME ON SOUNDS11 DOND GAME ON S.SITE -GAME( 200?, sc5dndgo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Game On (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndgoa ,sc5dndgo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Game On (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndgo ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Game On (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndgoa ,sc5dndgo, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Game On (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3310 AWP DEAL OR NO DEAL GOLD S5 PR3310 DOND GOLD SOUNDS11 DOND GOLD S.SITE -GAME( 200?, sc5dndgl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndgla ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglb ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglc ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndgld ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndgle ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglf ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglg ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglh ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndgli ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglj ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndglk ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndgl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndgla ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglb ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglc ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndgld ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndgle ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglf ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglg ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglh ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndgli ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglj ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndglk ,sc5dndgl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Gold (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR3415 AWP DEAL OR NO DEAL LIVE THE DREAM S5 PR3415 LIVE THE DREAM SOUNDS11 LIVE THE DREAM S.SITE -GAME( 200?, sc5dndld ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Live The Dream (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlda ,sc5dndld, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Live The Dream (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndld ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Live The Dream (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlda ,sc5dndld, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Live The Dream (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3407 AWP DEAL OR NO DEAL MAKE OR BREAK S5 PR3407 MAKE OR BREAK SOUNDS11 MAKE OR BREAK S.SITE -GAME( 200?, sc5dndmb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmba ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbb ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbc ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbd ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbe ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbf ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbg ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbh ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbi ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbj ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmbk ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndmb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmba ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbb ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbc ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbd ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbe ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbf ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbg ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbh ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbi ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbj ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmbk ,sc5dndmb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Make Or Break (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR3411 AWP MEGA DEAL OR NO DEAL S5 PR3411 MEGA DOND SOUNDS11 MEGA DOND S.SITE -GAME( 200?, sc5dndmd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmda ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdd ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmde ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdf ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdi ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndmd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmda ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdd ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmde ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdf ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdi ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3411) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3496 AWP MEGA DEAL OR NO DEAL S5 PR3411 MEGA DOND SOUNDS11 MEGA DOND S.SITE -GAME( 200?, sc5dndmdb ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdc ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdg ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndmdh ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndmdb ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdc ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdg ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndmdh ,sc5dndmd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Mega Deal Or No Deal (PR3496) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3404 AWP DEAL OR NO DEAL PLAY IT AGAIN SCORP5 PR3404 PLAY IT AGAIN SOUNDS11 PLAY IT AGAIN S.SITE -GAME( 200?, sc5dndpa ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpaa ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpab ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpac ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndpa ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpaa ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpab ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpac ,sc5dndpa, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play It Again (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3505 AWP DEAL OR NO DEAL PLAY THE GAME S5 PR3505 PLAY THE GAME SOUNDS11 PLAY THE GAME S.SITE -GAME( 200?, sc5ddptg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddptga ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddptgb ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddptgc ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ddptg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddptga ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddptgb ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddptgc ,sc5ddptg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Play The Game (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3303 AWP DEAL OR NO DEAL THE PLAYERS CHOICE SCORP5 PR3303 PLAYERS CHOICE SOUNDS11 PLAYERS CHOICE S.SITE -GAME( 200?, sc5ddply ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Player's Choice (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddplya ,sc5ddply, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Player's Choice (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ddply ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Player's Choice (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddplya ,sc5ddply, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Player's Choice (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3419 AWP DOND ROAD TO RICHES SCORP5 PR3419 ROAD TO RICHES SOUNDS11 ROAD TO RICHES S.SITE -GAME( 200?, sc5dndrr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrra ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrrb ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrrc ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndrr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrra ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrrb ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrrc ,sc5dndrr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Road To Riches (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3239 AWP SIMPLY DEAL OR NO DEAL SCORP5 PR3219 SIMPLY DOND SOUNDS11 SIMPLY DOND S.SITE -GAME( 200?, sc5dndsi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndsia ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndsib ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndsic ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndsid ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndsi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndsia ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndsib ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndsic ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndsid ,sc5dndsi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Simply Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR3405 AWP DEAL OR NO DEAL THE BANKER RINGS TWICE S5 PR3405 DOND BANKER SOUNDS11 DOND THE BANKER S.SITE -GAME( 200?, sc5dndrt ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrta ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrtb ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrtc ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrtd ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrte ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndrt ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrta ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrtb ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrtc ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrtd ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrte ,sc5dndrt, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Banker Rings Twice (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3412 AWP DEAL OR NO DEAL THE PERFECT DEAL SCORP5 PR3412 PERFECT DEAL SOUNDS11 THE PERFECT DEAL S.SITE -GAME( 200?, sc5dndpd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpda ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpdb ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpdc ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndpd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpda ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpdb ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpdc ,sc5dndpd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3303 AWP DEAL OR NO DEAL THE PLAYERS CHOICE SCORP5 PR3303 PLAYERS CHOICE SOUNDS11 PLAYERS CHOICE S.SITE -GAME( 200?, sc5dndpc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Players Choice (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpca ,sc5dndpc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Players Choice (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndpc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Players Choice (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpca ,sc5dndpc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Players Choice (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3416 AWP DEAL OR NO DEAL THINK BIG SCORP5 PR3416 DOND THINK BIG SOUNDS11 DOND THINK BIG S.SITE -GAME( 200?, sc5dndtb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Big (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtba ,sc5dndtb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Big (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndtb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Big (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtba ,sc5dndtb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Big (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2323 DEVIL OF A DEAL DOAD SOUNDS DEVIL OF A DEAL S.SITE -GAME( 200?, sc5devil ,0, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5devila ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5devilb ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5devilc ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5devil ,0, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5devila ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5devilb ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5devilc ,sc5devil, sc5, sc5, sc5, ROT0, "Mazooma","Devil Of A Deal (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3007 AWP DRAC PACK SCORP5 PR3007 DRACPACK SOUNDS11 DRAC PACK S.SITE -GAME( 200?, sc5dracp ,0, sc5, sc5, sc5, ROT0, "BFM","Drac Pack (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dracpa ,sc5dracp, sc5, sc5, sc5, ROT0, "BFM","Drac Pack (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dracp ,0, sc5, sc5, sc5, ROT0, "BFM","Drac Pack (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dracpa ,sc5dracp, sc5, sc5, sc5, ROT0, "BFM","Drac Pack (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3306 AWP FAMILY GUY BOOZE HOUND SCORP5 PR3306 BOOZE HOUND SOUNDS11 BOOZE HOUND S.SITE -GAME( 200?, sc5fgbh ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fgbha ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fgbhb ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fgbhc ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fgbh ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fgbha ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fgbhb ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fgbhc ,sc5fgbh, sc5, sc5, sc5, ROT0, "BFM","Family Guy Booze Hound (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3301 AWP FAMILY GUY GRIFFIN PLUMBING S5 PR3301 GRIFFIN PLUMB SOUNDS11 GRIFFIN PLUMBING S.SITE -GAME( 200?, sc5fggp ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpa ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpb ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpc ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpd ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpe ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpf ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fggpg ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fggp ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpa ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpb ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpc ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpd ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpe ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpf ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fggpg ,sc5fggp, sc5, sc5, sc5, ROT0, "BFM","Family Guy Griffin Plumbing (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR IT FAST CASH FASTCASHSOUND FAST CASH -GAME( 200?, sc5fast ,0, sc5, sc5, sc5, ROT0, "Qps","Fast Cash (Qps) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fast ,0, sc5, sc5, sc5, ROT0, "Qps","Fast Cash (Qps) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR3061 CLUB FIGHT NIGHT FIGHT NIGHT CLUB PR3061 CLUB FIGHT NIGHT SOUNDS11 CLUB FIGHT NIGHT -GAME( 200?, sc5fnclb ,0, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fnclba ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fnclbb ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fnclbc ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fnclbd ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fnclbe ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fnclb ,0, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fnclba ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fnclbb ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fnclbc ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fnclbd ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fnclbe ,sc5fnclb, sc5, sc5, sc5, ROT0, "BFM","Fight Night Club (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1939 FIRE N DICE PR1919 FIRE N DICE SOUNDS11 FIRE N DICE S.SITE -GAME( 200?, sc5fdice ,0, sc5, sc5, sc5, ROT0, "BFM","Fire 'n' Dice (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fdicea ,sc5fdice, sc5, sc5, sc5, ROT0, "BFM","Fire 'n' Dice (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fdice ,0, sc5, sc5, sc5, ROT0, "BFM","Fire 'n' Dice (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fdicea ,sc5fdice, sc5, sc5, sc5, ROT0, "BFM","Fire 'n' Dice (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1602 AWP FIRESTARTER SCORP5 PR1602 FIRESTARTER SOUNDS11 FIRESTARTER S.SITE -GAME( 200?, sc5fires ,0, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5firesa ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5firesb ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5firesc ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fires ,0, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5firesa ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5firesb ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5firesc ,sc5fires, sc5, sc5, sc5, ROT0, "BFM","Firestarter (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2418 FLASH THE CASH FLASHCASH SOUNDS FLASHTHECASH -GAME( 200?, sc5ftcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Flash The Cash (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ftcasa ,sc5ftcas, sc5, sc5, sc5, ROT0, "Mazooma","Flash The Cash (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ftcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Flash The Cash (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ftcasa ,sc5ftcas, sc5, sc5, sc5, ROT0, "Mazooma","Flash The Cash (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2319 FRUIT LOOP FLOOP SOUNDS FRUIT LOOP -GAME( 200?, sc5floop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Loops (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5floopa ,sc5floop, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Loops (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5floop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Loops (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5floopa ,sc5floop, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Loops (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1404 GET RICH QUICK PR1404 GET RICH QUICK SOUNDS11 -GAME( 200?, sc5grq ,0, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5grqa ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5grqb ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5grqc ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5grq ,0, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5grqa ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5grqb ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5grqc ,sc5grq, sc5, sc5, sc5, ROT0, "BFM","Get Rich Quick (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1403 GOLD FEVER PR1403 GOLD FEVER SOUNDS11 -GAME( 200?, sc5gldfv ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfva ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfvb ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfvc ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfvd ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfve ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfvf ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldfvg ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gldfv ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfva ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfvb ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfvc ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfvd ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfve ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfvf ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldfvg ,sc5gldfv, sc5, sc5, sc5, ROT0, "BFM","Gold Fever (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3410 AWP GOLDEN GOALS SCORP5 PR3410 GOLDEN GOALS SOUNDS11 GOLDEN GOALS S.SITE -GAME( 200?, sc5gldgo ,0, sc5, sc5, sc5, ROT0, "BFM","Golden Goals (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldgoa ,sc5gldgo, sc5, sc5, sc5, ROT0, "BFM","Golden Goals (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gldgo ,0, sc5, sc5, sc5, ROT0, "BFM","Golden Goals (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldgoa ,sc5gldgo, sc5, sc5, sc5, ROT0, "BFM","Golden Goals (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2203 GOLDEN SPINNER GSPINSND (top box?) -GAME( 200?, sc5gldsp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner (PR2203) (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gldsp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner (PR2203) (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 GOLDEN SPINNER Bingo Version 011 GSPINSND GOLDEN SPINNER -GAME( 200?, sc5gldspa ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspb ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspc ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspe ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspg ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspi ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspj ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspk ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspl ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspm ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspo ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gldspa ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspb ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspc ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspe ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspg ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspi ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspj ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspk ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspl ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspm ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspo ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Bingo (011) (PR2546) (Mazooma) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) // PR2546 GOLDEN SPINNER Arcade Version 061 GSPINSND GOLDEN SPINNER -GAME( 200?, sc5gldspd ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspf ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldsph ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspn ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gldspp ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gldspd ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspf ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldsph ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspn ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gldspp ,sc5gldsp, sc5, sc5, sc5, ROT0, "Mazooma","Golden Spinner Arcade (061) (PR2546) (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // Z052 GRANDMASTER PR000052 GRANDMASTER 1 GRANDMASTER AWP (looks like a QPS header) -GAME( 200?, sc5gmclb ,0, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gmclba ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gmclbb ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gmclbc ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gmclb ,0, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gmclba ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gmclbb ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gmclbc ,sc5gmclb, sc5, sc5, sc5, ROT0, "BFM","Grand Master Cash (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2318 HI ROLLER HIROLL SOUNDS HIGH ROLLER -GAME( 200?, sc5hirol ,0, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hirola ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hirolb ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hirolc ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hirold ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hirole ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hirol ,0, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hirola ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hirolb ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hirolc ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hirold ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hirole ,sc5hirol, sc5, sc5, sc5, ROT0, "Mazooma","High Roller (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1405 THE HULK PR1405 THE HULK SOUNDS11 -GAME( 200?, sc5hulk ,0, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulka ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkb ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkc ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkd ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulke ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkf ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkg ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulkh ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hulki ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hulk ,0, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulka ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkb ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkc ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkd ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulke ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkf ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkg ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulkh ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hulki ,sc5hulk, sc5, sc5, sc5, ROT0, "BFM","Hulk, The (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR2316 IT'S A BULLSEYE ITSBULLSEYE SOUNDS IT'S A BULLSEYE -GAME( 200?, sc5iab ,0, sc5, sc5, sc5, ROT0, "Mazooma","It's A Bullseye (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5iaba ,sc5iab, sc5, sc5, sc5, ROT0, "Mazooma","It's A Bullseye (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5iab ,0, sc5, sc5, sc5, ROT0, "Mazooma","It's A Bullseye (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5iaba ,sc5iab, sc5, sc5, sc5, ROT0, "Mazooma","It's A Bullseye (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2450 ITALIAN JOB BTDO ITLY SOUNDS NITH -GAME( 200?, sc5ijbdo ,0, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijbdoa ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijbdob ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijbdoc ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ijbdo ,0, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijbdoa ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijbdob ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijbdoc ,sc5ijbdo, sc5, sc5, sc5, ROT0, "Qps","Italian Job - Blow The Doors Off (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2077KING X KING X MAZ BARKX SOUNDS KING X 3 -GAME( 200?, sc5kingx ,0, sc5, sc5, sc5, ROT0, "BFM","King X (PR2077) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5kingxa ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X (PR2077) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5kingx ,0, sc5, sc5, sc5, ROT0, "BFM","King X (PR2077) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5kingxa ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X (PR2077) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2336KING X KING X MAZ BARKX SOUNDS KING X 3P -GAME( 200?, sc5kingxc ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X 3P (PR2336) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5kingxe ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X 3P (PR2336) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5kingxc ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X 3P (PR2336) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5kingxe ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X 3P (PR2336) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2279 KING X TRIPLE BARKX SOUNDS + + -GAME( 200?, sc5kingxb ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X Triple (PR2279) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5kingxd ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X Triple (PR2279) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5kingxb ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X Triple (PR2279) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5kingxd ,sc5kingx, sc5, sc5, sc5, ROT0, "BFM","King X Triple (PR2279) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2344 TOSSTHEMONKEY TOSTM SOUNDS TOSS THE MONKEY -GAME( 200?, sc5monky ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monkey Business / Toss The Monkey (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5monkya ,sc5monky, sc5, sc5, sc5, ROT0, "Mazooma","Monkey Business / Toss The Monkey (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5monky ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monkey Business / Toss The Monkey (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5monkya ,sc5monky, sc5, sc5, sc5, ROT0, "Mazooma","Monkey Business / Toss The Monkey (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3431 AWP MONOPOLY BOOM OR BUST CLASSIC S5 PR3307 MPOLY BOOM OR B SOUNDS11 BOOM OR BUST S.SITE -GAME( 200?, sc5mobob ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5moboba ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobd ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobe ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mobob ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5moboba ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobd ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobe ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3307 AWP MONOPOLY BOOM OR BUST S5 PR3307 MPOLY BOOM OR B SOUNDS11 BOOM OR BUST S.SITE -GAME( 200?, sc5mobobb ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobc ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobf ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobg ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobh ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mobobi ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mobobb ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobc ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobf ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobg ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobh ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mobobi ,sc5mobob, sc5, sc5, sc5, ROT0, "BFM","Monopoly Boom Or Bust (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3504 AWP MONOPOLY AUCTION SCORP5 PR3504 MPOLY AUCTION SOUNDS11 MONO AUCTION S.SITE -GAME( 200?, sc5mogta ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mogtaa ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mogtab ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mogtac ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mogta ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mogtaa ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mogtab ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mogtac ,sc5mogta, sc5, sc5, sc5, ROT0, "BFM","Monopoly Go To Auction (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3311 AWP MONOPOLY MILLIONAIRE SCORP5 PR3311 MPOLY MILL SOUNDS11 MILLIONAIRE S.SITE -GAME( 200?, sc5momil ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momila ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momilb ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momilc ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momild ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momile ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5momil ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momila ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momilb ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momilc ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momild ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momile ,sc5momil, sc5, sc5, sc5, ROT0, "BFM","Monopoly Millionaire (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1945 CLUB MONEYBAGS MONEY BAGS CLUB PR1955 C M MONEYBAGS SOUNDS11 DEAL OR NO DEAL -GAME( 200?, sc5mombc ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Money Bags Club (PR1945) (Deal or No Deal?) (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mombc ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Money Bags Club (PR1945) (Deal or No Deal?) (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2496 MONOPOLY MONEY SPINNER MONY SOUNDS NITH -GAME( 200?, sc5moms ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momsa ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momsc ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momsd ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5moms ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momsa ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momsc ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momsd ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Monopoly Money Spinner (PR2496) (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2395 MONEY SPINNER MONY SOUNDS NITH (== sc5monsp code?) -GAME( 200?, sc5momsb ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Money Spinner (PR2395) (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5momse ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Money Spinner (PR2395) (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5momsb ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Money Spinner (PR2395) (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5momse ,sc5moms, sc5, sc5, sc5, ROT0, "Qps","Money Spinner (PR2395) (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3408 AWP MONOPOLY PROPERTY LADDER S5 PR3408 MPOLY PROP LAD SOUNDS11 PROPERTY LADDER S.SITE -GAME( 200?, sc5mopl ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mopla ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5moplb ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5moplc ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mopl ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mopla ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5moplb ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5moplc ,sc5mopl, sc5, sc5, sc5, ROT0, "BFM","Monopoly Property Ladder (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2457 ROADTORICHES CLUBROADTORICHES CLUB CRTR SOUNDS CLUB ROAD TO RICHES -GAME( 200?, sc5mor2r ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Road To Riches (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mor2ra ,sc5mor2r, sc5, sc5, sc5, ROT0, "Qps","Monopoly Road To Riches (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mor2r ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Road To Riches (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mor2ra ,sc5mor2r, sc5, sc5, sc5, ROT0, "Qps","Monopoly Road To Riches (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2449 PR2449,MONOPOLY WA MONOPOLY WA MAZ -GAME( 200?, sc5monwa ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Win Again (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5monwaa ,sc5monwa, sc5, sc5, sc5, ROT0, "Qps","Monopoly Win Again (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5monwa ,0, sc5, sc5, sc5, ROT0, "Qps","Monopoly Win Again (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5monwaa ,sc5monwa, sc5, sc5, sc5, ROT0, "Qps","Monopoly Win Again (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2485 CLUB MONTE CARLO OR BUST CLUB MONTE CARLO CLUB CLUB MONTE SOUNDS CLUB MONTE CARLO -GAME( 200?, sc5cmcob ,0, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmcoba ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmcobb ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmcobc ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cmcob ,0, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmcoba ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmcobb ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmcobc ,sc5cmcob, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust Club (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2166 NUN N ROSES NANR SOUNDS NUNS N ROSES -GAME( 200?, sc5nunsb ,0, sc5, sc5, sc5, ROT0, "BFM","Nuns 'n' Roses (Bellfruit) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5nunsb ,0, sc5, sc5, sc5, ROT0, "BFM","Nuns 'n' Roses (Bellfruit) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR3315 AWP OVER THE RAINBOW SCORP5 PR3315 OV THE RAINBOW SOUNDS11 OVER THE RAINBOW S.SITE -GAME( 200?, sc5rainb ,0, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rainba ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rainbb ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rainbc ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rainbd ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rainbe ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rainb ,0, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rainba ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rainbb ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rainbc ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rainbd ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rainbe ,sc5rainb, sc5, sc5, sc5, ROT0, "BFM","Over The Rainbow (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3015 AWP PARROTS OF THE CARIBBEAN SCORP5 PR3015 P CARIBBEAN SOUNDS11 PARROT CARIBBEAN S.SITE -GAME( 200?, sc5parot ,0, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parota ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parotb ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parotc ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parotd ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parote ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parotf ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5parotg ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5parot ,0, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parota ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parotb ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parotc ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parotd ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parote ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parotf ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5parotg ,sc5parot, sc5, sc5, sc5, ROT0, "BFM","Parrots Of The Caribbean (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2411 PILEONTHEPOUNDS PILE SOUNDS PILE -GAME( 200?, sc5pilep ,0, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pilepa ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pilepb ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pilepc ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pilep ,0, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pilepa ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pilepb ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pilepc ,sc5pilep, sc5, sc5, sc5, ROT0, "Qps","Pile On The Pounds (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2306 POTS OF LUCK POTSOFLUCKSOUNDS POTS OF LUCK -GAME( 200?, sc5potsm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pots Of Luck (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potsma ,sc5potsm, sc5, sc5, sc5, ROT0, "Mazooma","Pots Of Luck (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5potsm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pots Of Luck (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potsma ,sc5potsm, sc5, sc5, sc5, ROT0, "Mazooma","Pots Of Luck (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3528 CLUB PUBLIC ENEMY S5 PR3528 PUBLIC ENEMY SOUNDS11 PUBLIC ENEMY S.SITE -GAME( 200?, sc5cpen1 ,0, sc5, sc5, sc5, ROT0, "BFM","Public Enemy No1 Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cpen1a ,sc5cpen1, sc5, sc5, sc5, ROT0, "BFM","Public Enemy No1 Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cpen1 ,0, sc5, sc5, sc5, ROT0, "BFM","Public Enemy No1 Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cpen1a ,sc5cpen1, sc5, sc5, sc5, ROT0, "BFM","Public Enemy No1 Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1406 QUALITY STREAK PR1406 QUALITY STREAK SOUNDS11 -GAME( 200?, sc5qual ,0, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quala ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualb ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualc ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quald ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quale ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualf ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualg ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualh ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quali ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualj ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualk ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quall ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5qualm ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5qual ,0, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quala ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualb ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualc ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quald ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quale ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualf ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualg ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualh ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quali ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualj ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualk ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quall ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5qualm ,sc5qual, sc5, sc5, sc5, ROT0, "BFM","Quality Streak (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) // PR2169 REEL SPIN SHADY TRSS SOUNDS REEL SPIN SHADY -GAME( 200?, sc5rssh ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Spin Shady (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rssha ,sc5rssh, sc5, sc5, sc5, ROT0, "Mazooma","Reel Spin Shady (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rssh ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Spin Shady (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rssha ,sc5rssh, sc5, sc5, sc5, ROT0, "Mazooma","Reel Spin Shady (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3208 AWP ROAD HOG S5 PR3208 ROAD HOG SOUNDS11 ROAD HOG S.SITE -GAME( 200?, sc5hog ,0, sc5, sc5, sc5, ROT0, "BFM","Road Hog (PR3208) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hoga ,sc5hog, sc5, sc5, sc5, ROT0, "BFM","Road Hog (PR3208) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hog ,0, sc5, sc5, sc5, ROT0, "BFM","Road Hog (PR3208) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hoga ,sc5hog, sc5, sc5, sc5, ROT0, "BFM","Road Hog (PR3208) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3248 ROAD HOG SCORP5 ROAD HOG CLUB PR3248 ROAD HOG SOUNDS11 ROAD HOG -GAME( 200?, sc5rhclb ,0, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhclba ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhclbb ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhclbc ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhclbd ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhclbe ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rhclb ,0, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhclba ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhclbb ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhclbc ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhclbd ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhclbe ,sc5rhclb, sc5, sc5, sc5, ROT0, "BFM","Road Hog Club (PR3248) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1774 181104 SHARP SHOOTER PR1774 SHARP SHOOTER 1 SHARP SHOOTER AWP -GAME( 200?, sc5sharp ,0, sc5, sc5, sc5, ROT0, "Voodoo","Sharp Shooter (Voodoo) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sharpa ,sc5sharp, sc5, sc5, sc5, ROT0, "Voodoo","Sharp Shooter (Voodoo) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sharp ,0, sc5, sc5, sc5, ROT0, "Voodoo","Sharp Shooter (Voodoo) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sharpa ,sc5sharp, sc5, sc5, sc5, ROT0, "Voodoo","Sharp Shooter (Voodoo) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // Z056 SHOOTSTARS PR000056 SHOOTSTARS 1 SHOOTSTARS AWP (Qps header?) -GAME( 200?, sc5sfts ,0, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sftsa ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sftsb ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sftsc ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sfts ,0, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sftsa ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sftsb ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sftsc ,sc5sfts, sc5, sc5, sc5, ROT0, "BFM","Shoot For The Stars (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2466 SNAKE RATTLE AND ROLL SNAKERR SOUNDS SNAKE R AND ROLL -GAME( 200?, sc5srrqp ,0, sc5, sc5, sc5, ROT0, "Qps","Snake Rattle & Roll (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5srrqpa ,sc5srrqp, sc5, sc5, sc5, ROT0, "Qps","Snake Rattle & Roll (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5srrqp ,0, sc5, sc5, sc5, ROT0, "Qps","Snake Rattle & Roll (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5srrqpa ,sc5srrqp, sc5, sc5, sc5, ROT0, "Qps","Snake Rattle & Roll (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3223 AWP SPINIT TO WINIT S5 PR3203 SPIN IT TO W IT SOUNDS11 SPINIT TO WINIT S.SITE -GAME( 200?, sc5sitwi ,0, sc5, sc5, sc5, ROT0, "BFM","Spin It To Win It (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sitwia ,sc5sitwi, sc5, sc5, sc5, ROT0, "BFM","Spin It To Win It (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sitwi ,0, sc5, sc5, sc5, ROT0, "BFM","Spin It To Win It (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sitwia ,sc5sitwi, sc5, sc5, sc5, ROT0, "BFM","Spin It To Win It (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2205 SPINNING AROUND SPIN SOUNDS SPINNING AROUND -GAME( 200?, sc5spnrn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Spinning Around (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5spnrna ,sc5spnrn, sc5, sc5, sc5, ROT0, "Mazooma","Spinning Around (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5spnrn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Spinning Around (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5spnrna ,sc5spnrn, sc5, sc5, sc5, ROT0, "Mazooma","Spinning Around (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR0003 RACE02 -GAME( 200?, sc5srace ,0, sc5, sc5, sc5, ROT0, "BFM","Streak Racer (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sracea ,sc5srace, sc5, sc5, sc5, ROT0, "BFM","Streak Racer (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5srace ,0, sc5, sc5, sc5, ROT0, "BFM","Streak Racer (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sracea ,sc5srace, sc5, sc5, sc5, ROT0, "BFM","Streak Racer (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2355 SUPER SLEUTH SSLEUTH SOUNDS SUPER SLEUTH -GAME( 200?, sc5sleut ,0, sc5, sc5, sc5, ROT0, "Mazooma","Super Sleuth (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sleuta ,sc5sleut, sc5, sc5, sc5, ROT0, "Mazooma","Super Sleuth (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sleut ,0, sc5, sc5, sc5, ROT0, "Mazooma","Super Sleuth (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sleuta ,sc5sleut, sc5, sc5, sc5, ROT0, "Mazooma","Super Sleuth (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1630 TRICK SHOT MULTI PLAYER TRICK SHOT MULTI ARCADE PR1630 TRICKSHOTMULT SOUNDS11 -GAME( 200?, sc5tsmp ,0, sc5, sc5, sc5, ROT0, "BFM","Trick Shot Multi Player (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tsmpa ,sc5tsmp, sc5, sc5, sc5, ROT0, "BFM","Trick Shot Multi Player (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5tsmp ,0, sc5, sc5, sc5, ROT0, "BFM","Trick Shot Multi Player (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tsmpa ,sc5tsmp, sc5, sc5, sc5, ROT0, "BFM","Trick Shot Multi Player (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1606 UP POMPAY PR1636 UP POMPAY SOUNDS11 UP POMPAY S.SITE -GAME( 200?, sc5pompa ,0, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pompaa ,sc5pompa, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pompab ,sc5pompa, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc5pompa ,0, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pompaa ,sc5pompa, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pompab ,sc5pompa, sc5, sc5, sc5, ROT0, "BFM","Up Pompay (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR2402 VAMPIREPAYER VAMP SOUNDS VAMP -GAME( 200?, sc5vamp ,0, sc5, sc5, sc5, ROT0, "Qps","Vampire Payer (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5vampa ,sc5vamp, sc5, sc5, sc5, ROT0, "Qps","Vampire Payer (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5vamp ,0, sc5, sc5, sc5, ROT0, "Qps","Vampire Payer (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5vampa ,sc5vamp, sc5, sc5, sc5, ROT0, "Qps","Vampire Payer (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2176 VIPER ACTIVE VIPA SOUNDS VIPER ACTIVE -GAME( 200?, sc5viper ,0, sc5, sc5, sc5, ROT0, "BFM","Viper Active (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5vipera ,sc5viper, sc5, sc5, sc5, ROT0, "BFM","Viper Active (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5viper ,0, sc5, sc5, sc5, ROT0, "BFM","Viper Active (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5vipera ,sc5viper, sc5, sc5, sc5, ROT0, "BFM","Viper Active (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2358 VIZ VIZ SOUNDS VIZ -GAME( 200?, sc5viz ,0, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5viza ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5vizb ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5vizc ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5viz ,0, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5viza ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5vizb ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5vizc ,sc5viz, sc5, sc5, sc5, ROT0, "Qps","Viz (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3305 AWP WACKY RACES SCORP5 PR3330 WACKY RACES SOUNDS11 WACKY RACES S.SITE -GAME( 200?, sc5wacky ,0, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wackya ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wackyb ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wackyc ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wacky ,0, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wackya ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wackyb ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wackyc ,sc5wacky, sc5, sc5, sc5, ROT0, "BFM","Wacky Racers (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2213 WAR OF THE WORLDS WADS SOUNDS -GAME( 200?, sc5wotw ,0, sc5, sc5, sc5, ROT0, "Mazooma","War Of The Wads (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wotwa ,sc5wotw, sc5, sc5, sc5, ROT0, "Mazooma","War Of The Wads (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wotw ,0, sc5, sc5, sc5, ROT0, "Mazooma","War Of The Wads (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wotwa ,sc5wotw, sc5, sc5, sc5, ROT0, "Mazooma","War Of The Wads (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2196 WILD REELS WILD REELS MAZ WIDR SOUNDS WILD REELS -GAME( 200?, sc5wild ,0, sc5, sc5, sc5, ROT0, "Mazooma","Wild Reels (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wilda ,sc5wild, sc5, sc5, sc5, ROT0, "Mazooma","Wild Reels (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wild ,0, sc5, sc5, sc5, ROT0, "Mazooma","Wild Reels (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wilda ,sc5wild, sc5, sc5, sc5, ROT0, "Mazooma","Wild Reels (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2552 WIN CAN ALLEY WINCANALLEYSND WIN CAN ALLEY -GAME( 200?, sc5wca ,0, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcaa ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcad ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcaf ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcah ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcai ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcal ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcan ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wca ,0, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcaa ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcad ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcaf ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcah ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcai ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcal ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcan ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (Qps) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2552 WIN CAN ALLEY 5 pound 10p Version WINCANALLEYSND WIN CAN ALLEY -GAME( 200?, sc5wcab ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcae ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcaj ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcam ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wcab ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcae ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcaj ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcam ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p version) (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2552 WIN CAN ALLEY 5 pound 10p Arcade Version WINCANALLEYSND -GAME( 200?, sc5wcac ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcag ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcak ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wcao ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wcac ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcag ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcak ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wcao ,sc5wca, sc5, sc5, sc5, ROT0, "Qps","Win Can Alley (5 pound 10p Arcade version) (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3218 AWP WOK N ROLL S5 PR3218 WOK N ROLL SOUNDS11 WOK N ROLL S.SITE -GAME( 200?, sc5wok ,0, sc5, sc5, sc5, ROT0, "BFM","Wok n' Roll (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5woka ,sc5wok, sc5, sc5, sc5, ROT0, "BFM","Wok n' Roll (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wok ,0, sc5, sc5, sc5, ROT0, "BFM","Wok n' Roll (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5woka ,sc5wok, sc5, sc5, sc5, ROT0, "BFM","Wok n' Roll (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2556 RED HOT REELS RHRL SOUNDS RED HOT REELS -GAME( 200?, sc5rhr ,0, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhra ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhrb ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhrc ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhrd ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhre ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rhr ,0, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhra ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhrb ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhrc ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhrd ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhre ,sc5rhr, sc5, sc5, sc5, ROT0, "Qps","Red Hot Reels (Qps) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2458 CLUB SNAKE RATTLE AND ROLL CLUB SRAR CLUB CLUB SRAR SND CLUB SNAKE RATTLE AND ROLL -GAME( 200?, sc5srrcl ,0, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5srrcla ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5srrclb ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5srrclc ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5srrcl ,0, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5srrcla ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5srrclb ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5srrclc ,sc5srrcl, sc5, sc5, sc5, ROT0, "BFM","Snake Rattle 'n' Roll Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3422 CLUB THE PRIZE IS RIGHT S5 PR3422 PRIZE IS RIGHT SOUNDS11 THE PRIZE IS RIGHT S.SITE -GAME( 200?, sc5pircl ,0, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pircla ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pirclb ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pirclc ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pircl ,0, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pircla ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pirclb ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pirclc ,sc5pircl, sc5, sc5, sc5, ROT0, "BFM","The Prize Is Right Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2457 ROADTORICHES CLUBROADTORICHES CLUB CRTR SOUNDS CLUB ROAD TO RICHES -GAME( 200?, sc5mrrcl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mrrcla ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mrrclb ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mrrclc ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mrrcl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mrrcla ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mrrclb ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mrrclc ,sc5mrrcl, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // these contained sc4/sc5/ad5 stuff, split by platform // BFGP1234..............G95427832.RAZY_.PR3436 CF COMMUNITY P SOUNDS11. (non-standard header, seems to indicate that these are actually Crazy Fruits Community Parts?) -GAME( 200?, sc5crcpt ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crcpta ,sc5crcpt, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crcpt ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crcpta ,sc5crcpt, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3009 AWP ANT N DECS JIGGY BANK S5 PR3009 JIGGY BANK SOUNDS11 JIGGY BANK S.SITE -GAME( 200?, sc5adjb ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjba ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbb ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbc ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbd ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbe ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbf ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbg ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbh ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbi ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbj ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbk ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbl ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbm ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbn ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbo ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbp ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbq ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adjbr ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5adjb ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjba ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbb ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbc ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbd ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbe ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbf ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbg ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbh ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbi ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbj ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbk ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbl ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbm ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbn ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbo ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbp ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbq ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adjbr ,sc5adjb, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Jiggy Bank (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) // PR1920 AWP ANT N DECS WTAD S5 PR1940 ADSNT SHOWTIME SOUNDS11 ANTNDECSWTAD S.SITE -GAME( 200?, sc5adwta ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adwtaa ,sc5adwta, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5adwta ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adwtaa ,sc5adwta, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway Win The Ads (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2200 AROUND THE BOARD AROU SOUNDS AROUND THE BOARD -GAME( 200?, sc5a40 ,0, sc5, sc5, sc5, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5a40a ,sc5a40, sc5, sc5, sc5, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5a40 ,0, sc5, sc5, sc5, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5a40a ,sc5a40, sc5, sc5, sc5, ROT0, "Mazooma","Around The Board In 40 Days (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2301 BANTAM OF THE OPERA BANTAM SOUNDS BANTAMOFTHEOPERA -GAME( 200?, sc5bantm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bantma ,sc5bantm, sc5, sc5, sc5, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bantm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bantma ,sc5bantm, sc5, sc5, sc5, ROT0, "Mazooma","Bantam Of The Opera (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1447 BAR7S PR1492 CAS BAR SEVENS SOUNDS11 BAR 7S M.SITE -GAME( 200?, sc5bar7 ,0, sc5, sc5, sc5, ROT0, "BFM","Bar 7's (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7a ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bar7 ,0, sc5, sc5, sc5, ROT0, "BFM","Bar 7's (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7a ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3064 BINGO BAR7 S5 PR1433 BAR SEVENS SOUNDS11 BAR7 S.SITE -GAME( 200?, sc5bar7b ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7c ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7d ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7e ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7f ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bar7g ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bar7b ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7c ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7d ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7e ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7f ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bar7g ,sc5bar7, sc5, sc5, sc5, ROT0, "BFM","Bar 7's Bingo (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1704 AWP BATTLESHIPS AND CRUISERS PR1704 B AND C SOUNDS11 BATTLESHIPSCRUIS S.SITE -GAME( 200?, sc5batl ,0, sc5, sc5, sc5, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5batla ,sc5batl, sc5, sc5, sc5, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5batl ,0, sc5, sc5, sc5, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5batla ,sc5batl, sc5, sc5, sc5, ROT0, "BFM","Battleships & Cruisers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2170 BOBBY DAZZLER BOBD SOUNDS BOBBY DAZZLER -GAME( 200?, sc5bob ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5boba ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bobb ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bobc ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bob ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5boba ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bobb ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bobc ,sc5bob, sc5, sc5, sc5, ROT0, "Mazooma","Bobby Dazzler (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1702 AWP BULLSEYE SCORP5 PR1702 BULLSEYE SOUNDS11 BULLSEYE S.SITE -GAME( 200?, sc5bull ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bulla ,sc5bull, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bull ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bulla ,sc5bull, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1719 AWP SUPER BULLSEYE SCORP5 PR1702 BULLSEYE SOUNDS11 SUPER BULLSEYE S.SITE -GAME( 200?, sc5sbull ,0, sc5, sc5, sc5, ROT0, "BFM","Super Bullseye (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sbulla ,sc5sbull, sc5, sc5, sc5, ROT0, "BFM","Super Bullseye (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sbull ,0, sc5, sc5, sc5, ROT0, "BFM","Super Bullseye (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sbulla ,sc5sbull, sc5, sc5, sc5, ROT0, "BFM","Super Bullseye (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3318 AWP BULLSEYE 5 REELS S5 PR3318 BULLSEYE SOUNDS11 BULLSEYE S.SITE -GAME( 200?, sc5bull5 ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bull5a ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bull5b ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bull5c ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bull5 ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bull5a ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bull5b ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bull5c ,sc5bull5, sc5, sc5, sc5, ROT0, "BFM","Bullseye 5 Reels (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1910 AWP BUTCH CASHIDY AND THE SUNDANCE QUID S5 PR1910 B C AND THE S Q SOUNDS11 BUTCH N SUNDANCE S.SITE -GAME( 200?, sc5butch ,0, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5butcha ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5butchb ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5butchc ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5butchd ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5butche ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5butch ,0, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5butcha ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5butchb ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5butchc ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5butchd ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5butche ,sc5butch, sc5, sc5, sc5, ROT0, "BFM","Butch Cashidy & The Sundance Quid (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2209 CABIN FEVER CABF SOUNDS CABIN FEVER -GAME( 200?, sc5cabin ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cabina ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cabinb ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cabinc ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cabin ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cabina ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cabinb ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cabinc ,sc5cabin, sc5, sc5, sc5, ROT0, "Mazooma","Cabin Fever (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2326 CARIBBEAN CASH CABC SOUNDS CARIBBEAN CASH -GAME( 200?, sc5cari ,0, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5caria ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5carib ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5caric ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5carid ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5carie ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5carif ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5carig ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cari ,0, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5caria ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5carib ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5caric ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5carid ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5carie ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5carif ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5carig ,sc5cari, sc5, sc5, sc5, ROT0, "Qps","Caribbean Cash (Qps) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1683 BLAS14 -GAME( 200?, sc5cblas ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cblasa ,sc5cblas, sc5, sc5, sc5, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cblas ,0, sc5, sc5, sc5, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cblasa ,sc5cblas, sc5, sc5, sc5, ROT0, "BFM","Cash Blast (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2338 XTRAVAGANZA XTRV SOUNDS XTRAVAGANZA -GAME( 200?, sc5casxt ,0, sc5, sc5, sc5, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5casxta ,sc5casxt, sc5, sc5, sc5, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5casxt ,0, sc5, sc5, sc5, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5casxta ,sc5casxt, sc5, sc5, sc5, ROT0, "Mazooma","Casino Xtravaganza (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1711 AWP CHAV IT SCORP5 PR1711 CHAV IT SOUNDS11 CHAV IT S.SITE -GAME( 200?, sc5chavi ,0, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavia ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavib ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavic ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavid ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavie ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5chavi ,0, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavia ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavib ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavic ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavid ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavie ,sc5chavi, sc5, sc5, sc5, ROT0, "BFM","Chav It (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2305 CHAVVY CHASE CHVY SOUNDS -GAME( 200?, sc5chavy ,0, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavya ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavyb ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chavyc ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5chavy ,0, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavya ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavyb ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chavyc ,sc5chavy, sc5, sc5, sc5, ROT0, "Mazooma","Chavy Chase (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2230 CLUEDO CLUE SOUNDS CLUEDO -GAME( 200?, sc5clue ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cluea ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clueb ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cluec ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clue ,0, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cluea ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clueb ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cluec ,sc5clue, sc5, sc5, sc5, ROT0, "Mazooma","Cluedo (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1308 COLOUR MANIA PR1308 COLOUR MAN SOUNDS11 -GAME( 200?, sc5cmani ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmania ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmanib ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cmanic ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cmani ,0, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmania ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmanib ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cmanic ,sc5cmani, sc5, sc5, sc5, ROT0, "BFM","Colour Mania (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1416 COOL JEWELS PR1416 COOL JEWELS SOUNDS11 COOL JEWELS S.SITE -GAME( 200?, sc5cj ,0, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cja ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjb ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjc ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjd ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cje ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cj ,0, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cja ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjb ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjc ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjd ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cje ,sc5cj, sc5, sc5, sc5, ROT0, "BFM","Cool Jewels (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1109 AWP COP THE LOT PR1109 CTLOT SOUNDS11 -GAME( 200?, sc5ctl ,0, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ctla ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ctlb ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ctlc ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ctl ,0, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ctla ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ctlb ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ctlc ,sc5ctl, sc5, sc5, sc5, ROT0, "BFM","Cop The Lot (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3005 AWP COPS AND ROBBERS SAFE CRACKER S5 PR3005 SAFE CRACKER SOUNDS11 SAFE CRACKER S.SITE -GAME( 200?, sc5crsc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsca ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscb ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscc ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscd ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsce ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscf ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscg ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsch ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsci ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscj ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsck ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscl ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscm ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscn ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsco ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscp ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscq ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscr ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscs ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crsct ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crscu ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crsc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsca ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscb ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscc ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscd ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsce ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscf ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscg ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsch ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsci ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscj ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsck ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscl ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscm ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscn ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsco ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscp ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscq ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscr ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscs ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crsct ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crscu ,sc5crsc, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PROJECT NUMBER PR2252 CORONATION ST CORRY SOUNDS CORONATION ST -GAME( 200?, sc5coro ,0, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corom ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coroy ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coro0 ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coro ,0, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corom ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coroy ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coro0 ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street (PR2252) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2552 CORONATION ST COROST_SINGLE CORONATION ST -GAME( 200?, sc5coroe ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corof ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corog ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coroh ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coroq ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coror ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coros ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corot ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coroe ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corof ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corog ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coroh ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coroq ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coror ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coros ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corot ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Single (PR2252) (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION ST TRIPLE COROST SOUNDS (top box maybe?) -GAME( 200?, sc5coroa ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coroa ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET CORS MAZ COROST_TRIPLE SOUNDS -GAME( 200?, sc5corok ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corol ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corow ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corox ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5corok ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corol ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corow ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corox ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple (PR2249) (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET Arcade Version 061 COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc5corob ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V061) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coron ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V061) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5corob ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V061) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coron ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V061) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET Arcade Version 063 COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc5coroj ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V063) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corov ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V063) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coroj ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V063) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corov ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Arcade (V063) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET Bingo Version 012 COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc5coroc ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corod ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coroi ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coroo ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corop ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5corou ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coroc ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corod ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coroi ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coroo ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corop ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5corou ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V012) (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2249 CORONATION STREET Bingo Version 013 COROST_TRIPLE SOUNDS CORONATION ST -GAME( 200?, sc5coroz ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V013) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5coro1 ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V013) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5coroz ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V013) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5coro1 ,sc5coro, sc5, sc5, sc5, ROT0, "Mazooma","Coronation Street Triple Bingo (V013) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1909 AWP COUNTDOWN S5 PR1909 COUNTDOWN SOUNDS11 COUNTDOWN S.SITE -GAME( 200?, sc5count ,0, sc5, sc5, sc5, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5counta ,sc5count, sc5, sc5, sc5, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5count ,0, sc5, sc5, sc5, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5counta ,sc5count, sc5, sc5, sc5, ROT0, "BFM","Countdown (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2387. T FRUIT CRAZY T FRUIT CRAZY QPS GOLD X TRIPLE (but contains Crazy Keys strings as well?) -GAME( 200?, sc5czfr ,0, sc5, sc5, sc5, ROT0, "QPS","Fruit Crazy Triple / Crazy Keys (QPS) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5czfr ,0, sc5, sc5, sc5, ROT0, "QPS","Fruit Crazy Triple / Crazy Keys (QPS) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2388 FRUIT CRAZY SINGLE FRUIT CRAZY CRZ SOUNDS PR2388 FRUIT CRAZY FRUIT CRAZY MAZ (not a standard header) -GAME( 200?, sc5frcrz ,0, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Crazy (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5frcrza ,sc5czfr, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Crazy (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5frcrz ,0, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Crazy (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5frcrza ,sc5czfr, sc5, sc5, sc5, ROT0, "Mazooma","Fruit Crazy (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1608 AWP CROWN JEWELS PR1608 CROWN JEWELS SOUNDS11 CROWN JEWELS S.SITE -GAME( 200?, sc5crnjw ,0, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crnjwa ,sc5crnjw, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5crnjwb ,sc5crnjw, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5crnjw ,0, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crnjwa ,sc5crnjw, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5crnjwb ,sc5crnjw, sc5, sc5, sc5, ROT0, "BFM","Crown Jewels (PR1608) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // Z055 CJEWELS PR000055 CJEWELS 1 CJEWELS AWP -GAME( 200?, sc5cjqps ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjqpsa ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjqpsb ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5cjqpsc ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5cjqps ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjqpsa ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjqpsb ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5cjqpsc ,sc5crnjw, sc5, sc5, sc5, ROT0, "QPS","Crown Jewels (Z055) (QPS) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1907 AWP DEAL OR NO DEAL S5 PR1907 DEAL OR NO DEAL SOUNDS11 DEALORNODEAL S.SITE -GAME( 200?, sc5dnd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnda ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndb ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndc ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndd ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnde ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndf ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndg ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndh ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndi ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndj ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndk ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndl ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndm ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndn ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndo ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndp ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndq ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndr ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnds ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndt ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnda ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndb ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndc ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndd ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnde ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndf ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndg ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndh ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndi ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndj ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndk ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndl ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndm ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndn ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndo ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndp ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndq ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndr ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnds ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndt ,sc5dnd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) // PR1954 CASINO DOND REELS CASINO DOND ARCADE PR1954 CASINO DOND R SOUNDS11 -GAME( 200?, sc5dndcs ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsa ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsb ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsc ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsd ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcse ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsf ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsg ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsh ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsi ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcsj ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 200?, sc5dndc2 ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE -GAME( 200?, sc5dndc2a ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc2b ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ - -GAME( 200?, sc5dndc2c ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR1964 CASINO DOND TOP DOND TOPBOX ARCADE PR1964 CASINO DOND R SOUNDS11 -GAME( 200?, sc5dndc2d ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ - -GAME( 200?, sc5dndc2e ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE -GAME( 200?, sc5dndc2f ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc2g ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc2h ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc2i ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2j ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2k ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2l ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2m ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE PR1964 CASINO DOND R SOUNDS11 -GAME( 200?, sc5dndc2n ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2o ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE PR1964 CASINO DOND SOUNDS12 -GAME( 200?, sc5dndc2p ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ - -GAME( 200?, sc5dndc2q ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE PR1964 CASINO DOND R SOUNDS11 -GAME( 200?, sc5dndc2r ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2s ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2t ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2u ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE PR1964 CASINO DOND SOUNDS12 -GAME( 200?, sc5dndc2v ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// ^^ -GAME( 200?, sc5dndc2w ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE - -GAME( 200?, sc5dndc3 ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR1965 CASINO DOND TOPBOX CASINO DOND ARCADE PR1965 CASINO DOND R SOUNDS11 -GAME( 200?, sc5dndc3a ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc3b ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5dndc3c ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ +GAME( 200?, sc5dndcs ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsa ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsb ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsc ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsd ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcse ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsf ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsg ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsh ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsi ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcsj ,sc5dndcs, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1954) (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) + +GAME( 200?, sc5dndc2 ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE +GAME( 200?, sc5dndc2a ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc2b ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ + +GAME( 200?, sc5dndc2c ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1964 CASINO DOND TOP DOND TOPBOX ARCADE PR1964 CASINO DOND R SOUNDS11 +GAME( 200?, sc5dndc2d ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // ^^ + +GAME( 200?, sc5dndc2e ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE +GAME( 200?, sc5dndc2f ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc2g ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc2h ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc2i ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2j ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2k ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2l ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2m ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL )// PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE PR1964 CASINO DOND R SOUNDS11 +GAME( 200?, sc5dndc2n ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2o ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL )// PR1964 CASINO DOND TOP S5 DOND TOPBOX ARCADE PR1964 CASINO DOND SOUNDS12 +GAME( 200?, sc5dndc2p ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL )// ^^ + +GAME( 200?, sc5dndc2q ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE PR1964 CASINO DOND R SOUNDS11 +GAME( 200?, sc5dndc2r ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2s ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2t ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2u ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE PR1964 CASINO DOND SOUNDS12 +GAME( 200?, sc5dndc2v ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 23)", GAME_IS_SKELETON_MECHANICAL )// ^^ +GAME( 200?, sc5dndc2w ,sc5dndc2, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1964) (Bellfruit) (Scorpion 5) (set 24)", GAME_IS_SKELETON_MECHANICAL )// PR1964 CASINO DOND MULTI DOND MULTIPLAYER ARCADE + +GAME( 200?, sc5dndc3 ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR1965 CASINO DOND TOPBOX CASINO DOND ARCADE PR1965 CASINO DOND R SOUNDS11 +GAME( 200?, sc5dndc3a ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc3b ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5dndc3c ,sc5dndc3, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Casino (PR1965) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ // PR3209 AWP DEAL OR NO DEAL BREAK THE BANK SCORP5 PR3209 BREAK THE BANK SOUNDS11 BREAK THE BANK S.SITE -GAME( 200?, sc5dndbb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbba ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbb ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbc ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbd ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbe ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbf ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbbg ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbba ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbb ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbc ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbd ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbe ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbf ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbbg ,sc5dndbb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Break The Bank (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB DEAL OR NO DEAL DEAL OR NO DEAL CLUB PR3068 BEAT THE BANKER SOUNDS11 DEAL OR NO DEAL -GAME( 200?, sc5dndcl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcla ,sc5dndcl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndcl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcla ,sc5dndcl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR???? CLUB DEAL OR NO DEAL BEAT THE BANKER CLUB PR3068 BEAT THE BANKER SOUNDS11 (there were in the Walk of Wealth sets) -GAME( 200?, sc5dndcb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club Beat The Banker (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcba ,sc5dndcb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club Beat The Banker (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndcb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club Beat The Banker (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcba ,sc5dndcb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club Beat The Banker (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3215 AWP DEAL OR NO DEAL DOUBLE S5 PR3215 DOND DOUBLE SOUNDS11 DOUBLE DOND S.SITE -GAME( 200?, sc5dnddd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddda ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndddb ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndddc ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndddd ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddde ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndddf ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndddg ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddda ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndddb ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndddc ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndddd ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddde ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndddf ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndddg ,sc5dnddd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3008 DEAL OR NO DEAL HALL OF FAME SCORP5 PR3008 HALL OF FAME SOUNDS11 HALL OF FAME S.SITE -GAME( 200?, sc5dndhf ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfa ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfb ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfc ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfd ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfe ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhff ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfg ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfh ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfi ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfj ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfk ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfl ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfm ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfn ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfo ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfp ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfq ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfr ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndhfs ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndhf ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfa ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfb ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfc ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfd ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfe ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhff ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfg ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfh ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfi ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfj ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfk ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfl ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfm ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfn ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfo ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfp ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfq ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfr ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndhfs ,sc5dndhf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Hall Of Fame (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) // PR3207 AWP DEAL OR NO DEAL ITS YOUR SHOW SCORP5 PR3207 ITS YOUR SHOW SOUNDS11 ITS YOUR SHOW S.SITE -GAME( 200?, sc5dndys ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysa ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysb ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysc ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysd ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndyse ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysf ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndysg ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndys ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysa ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysb ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysc ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysd ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndyse ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysf ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndysg ,sc5dndys, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal It's Your Show (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3232 AWP DEAL OR NO DEAL LETS PLAY DEAL OR NO DEAL SCORP5 PR3212 LETS PLAY DOND SOUNDS11 LETS PLAY DOND S.SITE -GAME( 200?, sc5dndlp ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpa ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpb ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpc ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpd ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpe ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpf ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpg ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlph ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpi ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpj ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpk ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpl ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpm ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpn ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpo ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpp ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpq ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpr ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlps ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpt ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndlpu ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndlp ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpa ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpb ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpc ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpd ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpe ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpf ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpg ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlph ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpi ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpj ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpk ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpl ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpm ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpn ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpo ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpp ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpq ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpr ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlps ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpt ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndlpu ,sc5dndlp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Let's Play Deal Or No Deal (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PR3201 AWP DEAL OR NO DEAL RED ALERT SCORP5 PR3201 DOND RED ALERT SOUNDS11 RED ALERT S.SITE -GAME( 200?, sc5dndra ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndraa ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrab ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrac ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrad ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrae ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndraf ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrag ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrah ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrai ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndraj ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndrak ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndra ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndraa ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrab ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrac ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrad ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrae ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndraf ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrag ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrah ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrai ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndraj ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndrak ,sc5dndra, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Red Alert (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR3210 AWP DEAL OR NO DEAL THE BIG DEAL SCORP5 PR3210 THE BIG DEAL SOUNDS11 THE BIG DEAL S.SITE -GAME( 200?, sc5dndbd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbda ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdb ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdc ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdd ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbde ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdf ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdg ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdh ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbdi ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbda ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdb ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdc ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdd ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbde ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdf ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdg ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdh ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbdi ,sc5dndbd, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Deal (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3011 AWP DEAL OR NO DEAL THE BIG REDS S5 PR3011 THE BIG REDS SOUNDS11 THE BIG REDS S.SITE -GAME( 200?, sc5dndbr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbra ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrd ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrf ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrg ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrj ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrl ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrm ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrn ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbro ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrp ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrq ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrr ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrs ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrt ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbru ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrv ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrw ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbra ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrd ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrf ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrg ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrj ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrl ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrm ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrn ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbro ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrp ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrq ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrr ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrs ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrt ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbru ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrv ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrw ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3011) (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR3018 AWP DEAL OR NO DEAL THE BIG REDS S5 PR3011 THE BIG REDS SOUNDS11 THE BIG REDS S.SITE -GAME( 200?, sc5dndbrb ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrc ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbre ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrh ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbri ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbrk ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbrb ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrc ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbre ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrh ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbri ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbrk ,sc5dndbr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Big Reds (PR3018) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3017 AWP DEAL OR NO DEAL THE CRAZY CHAIR SCORP5 PR3017 CRAZY CHAIR SOUNDS11 CRAZY CHAIR S.SITE -GAME( 200?, sc5dndcc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcca ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccb ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccc ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccd ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcce ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccf ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccg ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcch ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcci ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccj ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcck ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccl ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccm ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccn ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcco ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccp ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccq ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndccr ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndcc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcca ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccb ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccc ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccd ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcce ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccf ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccg ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcch ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcci ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccj ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcck ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccl ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccm ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccn ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcco ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccp ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccq ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndccr ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) // PR3250 DOND THE CRAZY CHAIR CRAZY CHAIR ARCADE PR3250 THE CRAZY CHAIR SOUNDS11 -GAME( 200?, sc5dndca ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcaa ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcab ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcac ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndca ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcaa ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcab ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcac ,sc5dndca, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3250) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3362 DOND THE CRAZY CHAIR CRAZY CHAIR ARCADE PR3362 THE CRAZY CHAIR SOUNDS11 -GAME( 200?, sc5dndcad ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3362) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndcae ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3362) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndcad ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3362) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndcae ,sc5dndcc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Crazy Chair Arcade (PR3362) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3013 AWP THE DEAL WHEEL S5 PR3202 THE DEAL WHEEL SOUNDS11 THE DEAL WHEEL S.SITE -GAME( 200?, sc5dnddw ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwa ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwb ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwc ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwd ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwe ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwf ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwg ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwh ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddwi ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddw ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwa ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwb ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwc ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwd ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwe ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwf ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwg ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwh ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddwi ,sc5dnddw, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Deal Wheel (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3014 AWP DEAL OR NO DEAL THE DREAM FACTORY SCORP5 PR3014 DREAM FACTORY SOUNDS11 DREAM FACTORY S.SITE -GAME( 200?, sc5dnddf ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfa ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfb ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfc ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfd ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfe ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddff ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfg ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfh ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfi ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfj ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfk ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfl ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfm ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dnddfn ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dnddf ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfa ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfb ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfc ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfd ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfe ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddff ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfg ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfh ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfi ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfj ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfk ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfl ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfm ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dnddfn ,sc5dnddf, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Dream Factory (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) // PR3220 AWP DEAL OR NO DEAL THE PERFECT GAME SCORP5 PR3220 DOND PERFECT SOUNDS11 THE PERFECT GAME S.SITE -GAME( 200?, sc5dndpg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpga ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgb ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgc ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgd ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpge ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgf ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgg ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgh ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgi ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgj ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgk ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgl ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgm ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgn ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgo ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgp ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgq ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgr ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgs ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgt ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpgu ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndpg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpga ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgb ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgc ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgd ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpge ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgf ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgg ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgh ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgi ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgj ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgk ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgl ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgm ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgn ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgo ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgp ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgq ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgr ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgs ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgt ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpgu ,sc5dndpg, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PR3403 AWP CLASSIC DEAL OR NO DEAL THE PERFECT GAME SCORP5 PR3220 DOND PERFECT SOUNDS11 THE PERFECT GAME S.SITE -GAME( 200?, sc5dndpl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndpla ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndplb ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndplc ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndpl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndpla ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndplb ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndplc ,sc5dndpl, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3003 AWP DOND THE POWER 5 SCORP5 PR3033 POWER FIVE SOUNDS11 DOND THE POWER 5 S.SITE -GAME( 200?, sc5dndtp ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpa ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpb ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpc ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpd ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpe ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpf ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpg ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtph ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpi ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpj ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpk ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpl ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpm ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpn ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpo ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpp ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpq ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpr ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtps ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpt ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtpu ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndtp ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpa ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpb ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpc ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpd ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpe ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpf ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpg ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtph ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpi ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpj ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpk ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpl ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpm ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpn ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpo ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpp ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpq ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpr ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtps ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpt ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtpu ,sc5dndtp, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Power (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL ) // PR3036 AWP DEAL OR NO DEAL THE WALK OF WEALTH SCORP5 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE -GAME( 200?, sc5dndww ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwa ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwb ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwc ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwd ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwe ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwf ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwg ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwh ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwi ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwj ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwk ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwl ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwm ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwn ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwo ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwp ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwwq ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndww ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwa ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwb ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwc ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwd ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwe ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwf ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwg ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwh ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwi ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwj ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwk ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwl ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwm ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwn ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwo ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwp ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwwq ,sc5dndww, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR3026 AWP CLASSIC DEAL OR NO DEAL THE WALK OF WEALTH SCORP5 PR3006 WALK OF WEALTH SOUNDS11 WALK OF WEALTH S.SITE -GAME( 200?, sc5dndwc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwca ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwcb ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwcc ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwcd ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwce ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwcf ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwcg ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndwc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwca ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwcb ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwcc ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwcd ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwce ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwcf ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwcg ,sc5dndwc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Walk Of Wealth Classic (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3304 DOND THINK RED S5 PR3304 THINK RED SOUNDS11 THINK RED S.SITE -GAME( 200?, sc5dndtr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtra ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrb ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrc ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrd ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtre ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrf ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrg ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrh ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtri ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrj ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndtrk ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndtr ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtra ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrb ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrc ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrd ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtre ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrf ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrg ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrh ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtri ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrj ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndtrk ,sc5dndtr, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Think Red (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1962 AWP DEAL OR NO DEAL WHATS IN YOUR BOX SCORP5 PR1962 WHATS IN Y BOX SOUNDS11 WHATS IN YOUR BX S.SITE -GAME( 200?, sc5dndwb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwba ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbb ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbc ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbd ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbe ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbf ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbg ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbh ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbi ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbj ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbk ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbl ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbm ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbn ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbo ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbp ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbq ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbr ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwbs ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndwb ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwba ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbb ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbc ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbd ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbe ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbf ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbg ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbh ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbi ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbj ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbk ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbl ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbm ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbn ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbo ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbp ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbq ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbr ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwbs ,sc5dndwb, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) // PR3071 CASINO DOND WIYB REELS CASINO DOND ARCADE PR3071 W IN YOUR BOX SOUNDS11 -GAME( 200?, sc5dndwi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwia ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwib ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwic ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwid ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwie ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwif ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndwig ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndwi ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwia ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwib ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwic ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwid ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwie ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwif ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndwig ,sc5dndwi, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal What's In Your Box Casino (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1307 AWP DIAMOND MINE PR1307 DIAM MINE SOUNDS11 -GAME( 200?, sc5dmine ,0, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminea ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dmineb ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminec ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dmined ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminee ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminef ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dmineg ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dmineh ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminei ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dmine ,0, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminea ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dmineb ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminec ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dmined ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminee ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminef ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dmineg ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dmineh ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminei ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1307 AWP DIAMOND MINE PR1307 DIAM MINE SOUNDS11 DIAMOND MINE S.SITE -GAME( 200?, sc5dminej ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminek ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dminel ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dminej ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminek ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dminel ,sc5dmine, sc5, sc5, sc5, ROT0, "BFM","Diamond Mine (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) // PR1394 AWP DOCTOR DOSH SCORP5 PR1309 DOCTOR DOSH SOUNDS11 -GAME( 200?, sc5ddosh ,0, sc5, sc5, sc5, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddosha ,sc5ddosh, sc5, sc5, sc5, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ddosh ,0, sc5, sc5, sc5, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddosha ,sc5ddosh, sc5, sc5, sc5, ROT0, "BFM","Doctor Dosh (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1716 AWP DOUGH HO HO S5 PR1716 DOUGH HO HO SOUNDS11 DOUGH HO HO S.SITE -GAME( 200?, sc5dhh ,0, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhha ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhb ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhc ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhd ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhe ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhf ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dhhg ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc5dhh ,0, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhha ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhb ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhc ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhd ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhe ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhf ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dhhg ,sc5dhh, sc5, sc5, sc5, ROT0, "BFM","Dough Ho Ho (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing // PR1615 AWP DOUGH SELECTA SCORP5 PR1615 DOUGH SELECTA SOUNDS11 DOUGH SELECTA S.SITE -GAME( 200?, sc5dough ,0, sc5, sc5, sc5, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dougha ,sc5dough, sc5, sc5, sc5, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dough ,0, sc5, sc5, sc5, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dougha ,sc5dough, sc5, sc5, sc5, ROT0, "BFM","Dough Selecta (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2118 DUCKS OF HAZZARD DUCKSOFHAZZARDSND DUCKS OF HAZZARD -GAME( 200?, sc5ducks ,0, sc5, sc5, sc5, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ducks ,0, sc5, sc5, sc5, ROT0, "Mazooma","Ducks Of Hazzard (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2313 EMMERDALE EMMR SOUNDS EMMERDALE -GAME( 200?, sc5emmer ,0, sc5, sc5, sc5, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5emmera ,sc5emmer, sc5, sc5, sc5, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5emmer ,0, sc5, sc5, sc5, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5emmera ,sc5emmer, sc5, sc5, sc5, ROT0, "Mazooma","Emmerdale (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3213 AWP FAMILY GUY S5 PR3213 FAMILY GUY SOUNDS11 FAMILY GUY S.SITE -GAME( 200?, sc5fguy ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fguya ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fguyb ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fguyc ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fguyd ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fguye ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fguy ,0, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fguya ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fguyb ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fguyc ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fguyd ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fguye ,sc5fguy, sc5, sc5, sc5, ROT0, "BFM","Family Guy (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1701 AWP FAT BOY SPIN SCORP5 PR1701 FAT BOY SPIN SOUNDS11 FAT BOY SPIN S.SITE -GAME( 200?, sc5fbspn ,0, sc5, sc5, sc5, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fbspna ,sc5fbspn, sc5, sc5, sc5, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fbspn ,0, sc5, sc5, sc5, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fbspna ,sc5fbspn, sc5, sc5, sc5, ROT0, "BFM","Fat Boy Spin (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2328 FULL METAL JACKPOT FULLM SOUNDS F METAL JACKPOT -GAME( 200?, sc5fmj ,0, sc5, sc5, sc5, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5fmja ,sc5fmj, sc5, sc5, sc5, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5fmj ,0, sc5, sc5, sc5, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5fmja ,sc5fmj, sc5, sc5, sc5, ROT0, "Mazooma","Full Metal Jackpot (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2255 GLADIATOR GLAD SOUNDS GLADIATOR -GAME( 200?, sc5glad ,0, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5glada ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gladb ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gladc ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5glad ,0, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5glada ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gladb ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gladc ,sc5glad, sc5, sc5, sc5, ROT0, "Mazooma","Gladiator (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3509 AWP GOLD DIGGER SCORP5 PR3509 GOLD DIGGER SOUNDS11 GOLD DIGGER S.SITE -GAME( 200?, sc5gd ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gda ,sc5gd, sc5, sc5, sc5, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gd ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gda ,sc5gd, sc5, sc5, sc5, ROT0, "BFM","Gold Digger (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2325 GOLD DIGGERS GOLD SOUNDS GOLD DIGGERS -GAME( 200?, sc5gdmz ,0, sc5, sc5, sc5, ROT0, "Mazooma","Gold Diggers (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdmza ,sc5gdmz, sc5, sc5, sc5, ROT0, "Mazooma","Gold Diggers (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gdmz ,0, sc5, sc5, sc5, ROT0, "Mazooma","Gold Diggers (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdmza ,sc5gdmz, sc5, sc5, sc5, ROT0, "Mazooma","Gold Diggers (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1137 CLUB GOLD DIGGER CLUB GOLD DIGGER CLUB PR1137 GOLDD CL SOUNDS11 -GAME( 200?, sc5gdclb ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdclba ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdclbb ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdclbc ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdclbd ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gdclbe ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gdclb ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdclba ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdclbb ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdclbc ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdclbd ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gdclbe ,sc5gdclb, sc5, sc5, sc5, ROT0, "BFM","Gold Digger Club (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1604 AWP GOLDEN BALLS PR1604 GOLDEN BALLS SOUNDS12 GOLDEN BALLS S.SITE (same as the SC4 version) -GAME( 200?, sc5gball ,0, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gballa ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gballb ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gballc ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gball ,0, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gballa ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gballb ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gballc ,sc5gball, sc5, sc5, sc5, ROT0, "BFM","Golden Balls (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2208 GOLDEN GAME PLASMA GOLDEN GAME MAZ BARX SOUNDS -GAME( 200?, sc5ggame ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ggamea ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ggameb ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ggamec ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ggamed ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 200?, sc5ggg ,0, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2371 GRAND GOLDEN GAME GRAND GOLDEN GAM MAZ ( GOLD X TRIPLE -GAME( 200?, sc5ggga ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5gggb ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2353 GRAND GOLDEN GAME GRAND GOLDEN GAM MAZ BARX SOUNDS GOLDEN GAME -GAME( 200?, sc5gggc ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ +GAME( 200?, sc5ggame ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ggamea ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ggameb ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ggamec ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ggamed ,sc5ggame, sc5, sc5, sc5, ROT0, "Mazooma","Golden Game (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) + +GAME( 200?, sc5ggg ,0, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2371 GRAND GOLDEN GAME GRAND GOLDEN GAM MAZ ( GOLD X TRIPLE +GAME( 200?, sc5ggga ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5gggb ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2353 GRAND GOLDEN GAME GRAND GOLDEN GAM MAZ BARX SOUNDS GOLDEN GAME +GAME( 200?, sc5gggc ,sc5ggg, sc5, sc5, sc5, ROT0, "Mazooma","Grand Golden Game (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ // PR3016 AWP THE GUNPOWDER SLOT S5 PR3016 GUNPOWDER SLOT SOUNDS11 GUNPOWDER SLOT S.SITE -GAME( 200?, sc5gunp ,0, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpa ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpb ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpc ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpd ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpe ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpf ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpg ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunph ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpi ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpj ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpk ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5gunpl ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5gunp ,0, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpa ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpb ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpc ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpd ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpe ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpf ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpg ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunph ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpi ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpj ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpk ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5gunpl ,sc5gunp, sc5, sc5, sc5, ROT0, "BFM","Gunpowder Slot (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) // PR1388 AWP HAPPY NOTES SCORP5 PR1306 HAPPY NOTES SOUNDS11 -GAME( 200?, sc5hapnt ,0, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapnta ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapntb ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapntc ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapntd ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapnte ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapntf ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hapntg ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hapnt ,0, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapnta ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapntb ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapntc ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapntd ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapnte ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapntf ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hapntg ,sc5hapnt, sc5, sc5, sc5, ROT0, "BFM","Happy Notes (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1402 AWP HELLS BELLS PR1402 HELLS BELLS SOUNDS11 -GAME( 200?, sc5hellb ,0, sc5, sc5, sc5, ROT0, "BFM","Hells Bells (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hellba ,sc5hellb, sc5, sc5, sc5, ROT0, "BFM","Hells Bells (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hellb ,0, sc5, sc5, sc5, ROT0, "BFM","Hells Bells (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hellba ,sc5hellb, sc5, sc5, sc5, ROT0, "BFM","Hells Bells (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1613 AWP HILLBILLIONAIRE SCORP5 PR1613 HILLBILLIONAIRE SOUNDS11 HILLBILLIONAIRE S.SITE -GAME( 200?, sc5hill ,0, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hilla ,sc5hill, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hillb ,sc5hill, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hill ,0, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hilla ,sc5hill, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hillb ,sc5hill, sc5, sc5, sc5, ROT0, "BFM","Hill Billionaire (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // PR2176 HISSING QUID VIPA SOUNDS HISSING QUID -GAME( 200?, sc5hiss ,0, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hissa ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hissb ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hissc ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hiss ,0, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hissa ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hissb ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hissc ,sc5hiss, sc5, sc5, sc5, ROT0, "Qps","Hissing Quid (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1936 AWP HOT DOG SCORP5 PR1916 HOT DOG SOUNDS11 HOT DOG S.SITE -GAME( 200?, sc5hotdg ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotdga ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotdgb ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotdgc ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotdgd ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotdge ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hotdg ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotdga ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotdgb ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotdgc ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotdgd ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotdge ,sc5hotdg, sc5, sc5, sc5, ROT0, "BFM","Hot Dog (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1733 AWP HOT ROD SCORP5 PR1713 HOT ROD SOUNDS11 HOT ROD S.SITE -GAME( 200?, sc5hotrd ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotrda ,sc5hotrd, sc5, sc5, sc5, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hotrd ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotrda ,sc5hotrd, sc5, sc5, sc5, ROT0, "BFM","Hot Rod (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3211 AWP HOT SHOT SCORP5 PR3211 HOT SHOT SOUNDS11 HOT SHOT S.SITE -GAME( 200?, sc5hotsh ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotsha ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshb ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshc ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshd ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshe ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshf ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshg ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshh ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshi ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshj ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshk ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshl ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshm ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshn ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotsho ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshp ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotshq ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hotsh ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotsha ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshb ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshc ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshd ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshe ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshf ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshg ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshh ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshi ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshj ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshk ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshl ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshm ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshn ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotsho ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshp ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotshq ,sc5hotsh, sc5, sc5, sc5, ROT0, "BFM","Hot Shots (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR1311 HOT WAD PR1311 HOT WAD SOUNDS11 -GAME( 200?, sc5hotwd ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwda ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwdb ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwdc ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwdd ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwde ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwdf ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5hotwdg ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5hotwd ,0, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwda ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwdb ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwdc ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwdd ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwde ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwdf ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5hotwdg ,sc5hotwd, sc5, sc5, sc5, ROT0, "BFM","Hot Wad (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1603 AWP IM A CELEBRITY PR1603 IM A CELEB SOUNDS11 IM A CELEBRITY S.SITE -GAME( 200?, sc5celeb ,0, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5celeba ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5celebb ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5celebc ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5celebd ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5celeb ,0, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5celeba ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5celebb ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5celebc ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5celebd ,sc5celeb, sc5, sc5, sc5, ROT0, "BFM","I'm A Celebrity (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2555 INNER SPIN V013 INNERSPINSND INNER SPIN -GAME( 200?, sc5inspn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5inspna ,sc5inspn, sc5, sc5, sc5, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5inspn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5inspna ,sc5inspn, sc5, sc5, sc5, ROT0, "Mazooma","Inner Spin (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2366 AWP THE ITALIAN JOB S5 PR2366 THE ITALIAN JOB SOUNDS11 ITALIAN JOB S.SITE -GAME( 200?, sc5ijob ,0, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijoba ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobb ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobc ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobd ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobe ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobf ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobg ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobh ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ijobi ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ijob ,0, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijoba ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobb ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobc ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobd ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobe ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobf ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobg ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobh ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ijobi ,sc5ijob, sc5, sc5, sc5, ROT0, "Mazooma","Italian Job (Mazooma) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1609 JACKPOT JOKERS PR1609 JACKPOT JOKERS SOUNDS11 JACKPOT JOKERS S.SITE -GAME( 200?, sc5jjok ,0, sc5, sc5, sc5, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5jjoka ,sc5jjok, sc5, sc5, sc5, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5jjok ,0, sc5, sc5, sc5, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5jjoka ,sc5jjok, sc5, sc5, sc5, ROT0, "BFM","Jackpot Jokers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2376 LITTLE DEVIL LDEVIL SOUNDS LITTLE DEVIL -GAME( 200?, sc5ldvl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ldvla ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ldvlb ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ldvlc ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ldvld ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ldvle ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ldvl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ldvla ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ldvlb ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ldvlc ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ldvld ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ldvle ,sc5ldvl, sc5, sc5, sc5, ROT0, "Mazooma","Little Devil (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1413 AWP RETURN OF THE KING PR1413 RETURN OF THE SOUNDS11 RETURN OF KING S.SITE -GAME( 200?, sc5lotrr ,0, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrra ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrb ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrc ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrd ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrre ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrf ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrg ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrrh ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5lotrri ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5lotrr ,0, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrra ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrb ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrc ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrd ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrre ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrf ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrg ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrrh ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5lotrri ,sc5lotrr, sc5, sc5, sc5, ROT0, "BFM","Lord Of The Rings - Return Of The King (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3004 AWP MANIC MINER SCORP5 PR3004 MANIC MINER SOUNDS11 MANIC MINER S.SITE -GAME( 200?, sc5manic ,0, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manica ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicb ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicc ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicd ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manice ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicf ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicg ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manich ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manici ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicj ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manick ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicl ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicm ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicn ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manico ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicp ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicq ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicr ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 19)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manics ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 20)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manict ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 21)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicu ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 22)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicv ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 23)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5manicw ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 24)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5manic ,0, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manica ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicb ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicc ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicd ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manice ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicf ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicg ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manich ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manici ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicj ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manick ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicl ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicm ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicn ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manico ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicp ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicq ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicr ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 19)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manics ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 20)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manict ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 21)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicu ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 22)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicv ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 23)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5manicw ,sc5manic, sc5, sc5, sc5, ROT0, "BFM","Manic Miner (Bellfruit) (Scorpion 5) (set 24)", GAME_IS_SKELETON_MECHANICAL ) // PR2282 MENTALMONEYMONSTERS MMMO SOUNDS MONEY MONSTERS -GAME( 200?, sc5mmm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmma ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmmb ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmmc ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mmm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmma ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmmb ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmmc ,sc5mmm, sc5, sc5, sc5, ROT0, "Mazooma","Mental Money Monsters (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR0000 MONEY MADNESS MONM SOUNDS MONEY MADNESS -GAME( 200?, sc5mmad ,0, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmada ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmadb ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmadc ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mmad ,0, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmada ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmadb ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmadc ,sc5mmad, sc5, sc5, sc5, ROT0, "Mazooma","Money Madness (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2395 MONEY SPINNER MONY SOUNDS NITH -GAME( 200?, sc5monsp ,0, sc5, sc5, sc5, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5monspa ,sc5monsp, sc5, sc5, sc5, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5monsp ,0, sc5, sc5, sc5, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5monspa ,sc5monsp, sc5, sc5, sc5, ROT0, "BFM","Money Spinner (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PROJECT NUMBER PR0_0_ MONOPOLY P_S_E_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _U_A_S_U_D_ _ _ _ _ _ _ _ _ _ _ _ _ _T_I_K_P_N_ _ _ _ -GAME( 200?, sc5monop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // incomplete pairing +GAME( 200?, sc5monop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // incomplete pairing -GAME( 200?, sc5mcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2372 CASINO MONOPOLY MONO SOUNDS CASINO MONOPOLY -GAME( 200?, sc5mcasa ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ -GAME( 200?, sc5mcasb ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // PR2372 CASINO MONOPOLY CASINO MONOPOLY MAZ MONO SOUNDS CASINO MONOPOLY -GAME( 200?, sc5mcasc ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // ^^ +GAME( 200?, sc5mcas ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2372 CASINO MONOPOLY MONO SOUNDS CASINO MONOPOLY +GAME( 200?, sc5mcasa ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) // ^^ +GAME( 200?, sc5mcasb ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2372 CASINO MONOPOLY CASINO MONOPOLY MAZ MONO SOUNDS CASINO MONOPOLY +GAME( 200?, sc5mcasc ,sc5mcas, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Casino (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // ^^ // PR3308 AWP MONOPOLY DOUBLE MONEY S5 PR3308 MPOLY D MONEY SOUNDS11 DOUBLE MONEY S.SITE -GAME( 200?, sc5mdm ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mdma ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mdmb ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mdmc ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mdm ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mdma ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mdmb ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mdmc ,sc5mdm, sc5, sc5, sc5, ROT0, "BFM","Monopoly Double Money (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2380 MONOPOLY HERE AND NOW MR2R SOUNDS NITH -GAME( 200?, sc5mhn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhna ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhnb ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhnc ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhnd ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhne ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mhn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhna ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhnb ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhnc ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhnd ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhne ,sc5mhn, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Here & Now (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2345 AWP MONOPOLY HOT PROPERTY S5 PR2345 HOT PROPERTY SOUNDS11 HOT PROPERTY S.SITE -GAME( 200?, sc5mhp ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpa ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpb ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpc ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpd ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpe ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpf ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpg ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhph ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mhpi ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mhp ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpa ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpb ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpc ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpd ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpe ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpf ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpg ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhph ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mhpi ,sc5mhp, sc5, sc5, sc5, ROT0, "BFM","Monopoly Hot Property (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3413 AWP MONOPOLY MONEYBAGS S5 PR3413 MONEYBAGS SOUNDS11 MONEYBAGS S.SITE -GAME( 200?, sc5mmb ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmba ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmbb ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmbc ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mmb ,0, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmba ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmbb ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmbc ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR3413) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1911 AWP MONOLOLY MONEY BAGS SCORP5 PR1911 MPOLY MONEYBAGS SOUNDS11 MONEYBAGS S.SITE -GAME( 200?, sc5mmbd ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR1911) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mmbe ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR1911) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mmbd ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR1911) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mmbe ,sc5mmb, sc5, sc5, sc5, ROT0, "BFM","Monopoly Money Bags (PR1911) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2363 RED HOT MONOP RED HOT MONOPOLY MAZ MONO SOUNDS MONOPOLY -GAME( 200?, sc5mrh ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mrha ,sc5mrh, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mrh ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mrha ,sc5mrh, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Red Hot (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2329 MONOPOLY ROAD TO RICHES MR2R SOUNDS ROAD TO RICHES -GAME( 200?, sc5mr2r ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (PR2329) (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mr2ra ,sc5mr2r, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (PR2329) (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mr2r ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (PR2329) (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mr2ra ,sc5mr2r, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (PR2329) (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2457 ROADTORICHES CLUBROADTORICHES CLUB CRTR SOUNDS CLUB ROAD TO RICHES -GAME( 200?, sc5mr2rb ,sc5mr2r, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (PR2457) (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mr2rb ,sc5mr2r, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches Club (PR2457) (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2190 MONOPOLY WOW MONOPOLY WOW MAZ TWOW SOUNDS -GAME( 200?, sc5mww ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mwwa ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mwwb ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mwwc ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mww ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mwwa ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mwwb ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mwwc ,sc5mww, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR3002 AWP NIGHTMARE ON ELM STREET S5 PR3002 ELM STREET SOUNDS11 NIGHTMARE ELM ST S.SITE -GAME( 200?, sc5nmare ,0, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nmarea ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nmareb ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nmarec ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5nmare ,0, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nmarea ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nmareb ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nmarec ,sc5nmare, sc5, sc5, sc5, ROT0, "BFM","A Nightmare On Elm Street (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1612 PICK OF THE PACK PR1612 PICK OF THE PACK SOUNDS11 PICK OF THE PACK S.SITE -GAME( 200?, sc5potp ,0, sc5, sc5, sc5, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potpa ,sc5potp, sc5, sc5, sc5, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5potp ,0, sc5, sc5, sc5, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potpa ,sc5potp, sc5, sc5, sc5, ROT0, "BFM","Pick Of The Pack (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2562 PINK PANTHER PINK SOUNDS PINK PANTHER -GAME( 200?, sc5pp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppa ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppb ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppc ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppd ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppe ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppf ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppg ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppa ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppb ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppc ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppd ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppe ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppf ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppg ,sc5pp, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2279 PINK PANTHER CLOUSEAUS REVENGE REVENGE QPS REVENGE SOUNDS -GAME( 200?, sc5ppcr ,0, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppcrb ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppcrc ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppcrd ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ppcr ,0, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppcrb ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppcrc ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppcrd ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Clouseau's Revenge (Mazooma / QPS) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2279 CLOUSEAUS REVENGE REVENGE SOUNDS -GAME( 200?, sc5ppcra ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ppcra ,sc5ppcr, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Clouseau's Revenge (Mazooma) (Scorpion 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2407 AWP PINK PANTHER CRACK THE CODE SCORP5 PR2407 CRACK THE CODE SOUNDS11 CRACK THE CODE S.SITE -GAME( 200?, sc5ppctc ,0, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctca ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctcb ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctcc ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctcd ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctce ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctcf ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctcg ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppctch ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ppctc ,0, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctca ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctcb ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctcc ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctcd ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctce ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctcf ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctcg ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppctch ,sc5ppctc, sc5, sc5, sc5, ROT0, "BFM","Pink Panther Crack The Code (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) // PR2330 PINK PANTHER DYM PINK PANTHER DYM QPS DYMN SOUNDS PINK PANTHER DYM -GAME( 200?, sc5ppdym ,0, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Double Your Money (Mazooma / QPS) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppdyma ,sc5ppdym, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Double Your Money (Mazooma / QPS) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ppdym ,0, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Double Your Money (Mazooma / QPS) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppdyma ,sc5ppdym, sc5, sc5, sc5, ROT0, "Mazooma / QPS","Pink Panther Double Your Money (Mazooma / QPS) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2303 STRIKES AGAIN PPSA SOUNDS STRIKES AGAIN -GAME( 200?, sc5ppsag ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppsaga ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppsagb ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppsagc ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppsagd ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ppsage ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ppsag ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppsaga ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppsagb ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppsagc ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppsagd ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ppsage ,sc5ppsag, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Strikes Again (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1408 PONY EXPRESS PR1408 PONY EXPRESS SOUNDS11 PONY EXPRESS S.SITE -GAME( 200?, sc5pony ,0, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ponya ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ponyb ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ponyc ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ponyd ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pony ,0, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ponya ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ponyb ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ponyc ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ponyd ,sc5pony, sc5, sc5, sc5, ROT0, "BFM","Pony Express (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2417 AWP POPEYE S5 PR2417 POPEYE SOUNDS11 POPEYE S.SITE -GAME( 200?, sc5popey ,0, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5popeya ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5popeyb ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5popeyc ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5popey ,0, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5popeya ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5popeyb ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5popeyc ,sc5popey, sc5, sc5, sc5, ROT0, "Mazooma","Popeye (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1918 AWP POTS OF GOLD SCORP5 PR1918 POTS OF GOLD SOUNDS11 POTS OF GOLD S.SITE -GAME( 200?, sc5pog ,0, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5poga ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pogb ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pogc ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pogd ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5poge ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pog ,0, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5poga ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pogb ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pogc ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pogd ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5poge ,sc5pog, sc5, sc5, sc5, ROT0, "BFM","Pots Of Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // Z050 POTOFGLD PR000050 POTOFGLD 1 POTOFGLD AWP -GAME( 200?, sc5potog ,0, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potoga ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potogb ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potogc ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potogd ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potoge ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potogf ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5potogg ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5potog ,0, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potoga ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potogb ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potogc ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potogd ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potoge ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potogf ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5potogg ,sc5potog, sc5, sc5, sc5, ROT0, "QPS","Pot Of Gold (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2272 POWER PLAY PPLY SOUNDS -GAME( 200?, sc5pwrpl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pwrpla ,sc5pwrpl, sc5, sc5, sc5, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pwrpl ,0, sc5, sc5, sc5, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pwrpla ,sc5pwrpl, sc5, sc5, sc5, ROT0, "Mazooma","Power Play (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1614 AWP POWERBALL POWERBALL S.SITE PR1614 POWERBALL SOUNDS11 -GAME( 200?, sc5pwrbl ,0, sc5, sc5, sc5, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5pwrbla ,sc5pwrbl, sc5, sc5, sc5, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5pwrbl ,0, sc5, sc5, sc5, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5pwrbla ,sc5pwrbl, sc5, sc5, sc5, ROT0, "BFM","Powerball (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2342 QUID VICIOUS QUIDV SOUNDS QUID VICIOUS -GAME( 200?, sc5quidv ,0, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidva ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidvb ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidvc ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidvd ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidve ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidvf ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5quidvg ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5quidv ,0, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidva ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidvb ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidvc ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidvd ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidve ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidvf ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5quidvg ,sc5quidv, sc5, sc5, sc5, ROT0, "Mazooma","Quid Vicious (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR2077 RED HOT X SDRDX SOUNDS -GAME( 200?, sc5rhx ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rhx ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) // PR2077 RED HOT X SDRDX SOUNDS -GAME( 200?, sc5rhxa ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxb ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxc ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxd ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxe ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxf ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rhxa ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxb ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxc ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxd ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxe ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxf ,sc5rhx, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) // PR2364 CASINO RED HOT X RED HOT X CRHX SOUNDS RED HOT X -GAME( 200?, sc5rhxcs ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rhxcsa ,sc5rhxcs, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rhxcs ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rhxcsa ,sc5rhxcs, sc5, sc5, sc5, ROT0, "Mazooma","Red Hot X Casino (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2557 RED SQUARE REDS SOUNDS RED SQUARE -GAME( 200?, sc5redsq ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5redsqa ,sc5redsq, sc5, sc5, sc5, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5redsq ,0, sc5, sc5, sc5, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5redsqa ,sc5redsq, sc5, sc5, sc5, ROT0, "Mazooma","Red Square (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3257 CLUB RONNIE O SULLIVANS TOURNAMENT SCORP5 RONNIE OSULLIVAN CLUB PR3256 RONNIE O SOUNDS11 RONNIE SULLIVAN -GAME( 200?, sc5rosts ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rostsa ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rostsb ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rostsc ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rostsd ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rostse ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rosts ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rostsa ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rostsb ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rostsc ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rostsd ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rostse ,sc5rosts, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Tournament Snooker (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2311 ROVERS RETURN ROVERS RETURN SOUNDS ROVERS RETURN -GAME( 200?, sc5rovrt ,0, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rovrta ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rovrtb ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5rovrtc ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5rovrt ,0, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rovrta ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rovrtb ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5rovrtc ,sc5rovrt, sc5, sc5, sc5, ROT0, "Mazooma","Rovers Return (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2280 SHOW ME THE MONEY SMTM SOUNDS -GAME( 200?, sc5smtm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Show Me The Money (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5smtma ,sc5smtm, sc5, sc5, sc5, ROT0, "Mazooma","Show Me The Money (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5smtm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Show Me The Money (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5smtma ,sc5smtm, sc5, sc5, sc5, ROT0, "Mazooma","Show Me The Money (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3013 AWP SHOW TIME S5 PR3013 SHOWTIME SOUNDS11 SHOW TIME S.SITE -GAME( 200?, sc5showt ,0, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showta ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtb ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtc ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtd ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showte ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtf ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtg ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showth ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showti ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtj ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtk ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtl ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtm ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtn ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showto ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtp ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5showtq ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5showt ,0, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showta ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtb ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtc ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtd ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showte ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtf ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtg ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showth ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showti ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtj ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtk ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtl ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtm ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtn ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showto ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtp ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5showtq ,sc5showt, sc5, sc5, sc5, ROT0, "BFM","Showtime (Bellfruit) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR1411 AWP SNAKES AND LADDERS PR1411 SNAKES A L SOUNDS11 -GAME( 200?, sc5slad ,0, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5slada ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sladb ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sladc ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5slad ,0, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5slada ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sladb ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sladc ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1411 AWP SNAKES AND LADDERS PR1411 SNAKES A L SOUNDS11 SNAKES N LADDERS S.SITE -GAME( 200?, sc5sladd ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5slade ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sladf ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sladg ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sladd ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5slade ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sladf ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sladg ,sc5slad, sc5, sc5, sc5, ROT0, "BFM","Snakes & Ladders (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR1901 AWP SPICE IT UP SCORP5 PR1901 SPICE IT UP SOUNDS11 SPICE IT UP S.SITE -GAME( 200?, sc5spice ,0, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5spiceb ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5spice ,0, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5spiceb ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1921 AWP SPICE IT UP SCORP4 PR1901 SPICE IT UP SOUNDS11 SPICE IT UP S.SITE (this header is incorrect, these are SCORP 5 sets, they use opcodes not present in the SC4 cpu and have the 'SC5' at the start of the ROM) -GAME( 200?, sc5spicea ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5spicec ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5spiced ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5spicee ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5spicea ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5spicec ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5spiced ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5spicee ,sc5spice, sc5, sc5, sc5, ROT0, "BFM","Spice It Up (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR2232 SPIN WHEN YOU'RE WINNING SPIN SOUNDS -GAME( 200?, sc5swywm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5swywma ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5swywmb ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5swywmc ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5swywm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5swywma ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5swywmb ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5swywmc ,sc5swywm, sc5, sc5, sc5, ROT0, "Mazooma","Spin When Your Winning (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2176 SUMMIT UP SUMMIT SOUNDS SUMMIT UP H -GAME( 200?, sc5sumit ,0, sc5, sc5, sc5, ROT0, "Qps","Summit Up (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5sumita ,sc5sumit, sc5, sc5, sc5, ROT0, "Qps","Summit Up (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sumit ,0, sc5, sc5, sc5, ROT0, "Qps","Summit Up (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5sumita ,sc5sumit, sc5, sc5, sc5, ROT0, "Qps","Summit Up (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2255 SUITUSIR SUIT SOUNDS SUITS U SIR -GAME( 200?, sc5sus ,0, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5susa ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5susb ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5susc ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5sus ,0, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5susa ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5susb ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5susc ,sc5sus, sc5, sc5, sc5, ROT0, "Qps","Suits U Sir (Qps) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2235 SWITCHBACK SWBK SOUNDS SWITCHBACK -GAME( 200?, sc5swbak ,0, sc5, sc5, sc5, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5swbaka ,sc5swbak, sc5, sc5, sc5, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5swbak ,0, sc5, sc5, sc5, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5swbaka ,sc5swbak, sc5, sc5, sc5, ROT0, "Mazooma","Switch Back (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1714 AWP TAKE THE PIECE S5 PR1714 TAKE THE PIECE SOUNDS11 TAKETHEPIECE S.SITE -GAME( 200?, sc5ttpie ,0, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpiea ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpieb ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpiec ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpied ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpiee ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpief ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpieg ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpieh ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ttpiei ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ttpie ,0, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpiea ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpieb ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpiec ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpied ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpiee ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpief ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpieg ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpieh ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ttpiei ,sc5ttpie, sc5, sc5, sc5, ROT0, "BFM","Take The Piece (Bellfruit) (PR1714) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR3001 AWP TAKE YOUR PICK S5 PR3001 TAKE YOUR PICK SOUNDS11 TAKE YOUR PICK S.SITE -GAME( 200?, sc5typ ,0, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5typa ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5typb ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5typc ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5typ ,0, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5typa ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5typb ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5typc ,sc5typ, sc5, sc5, sc5, ROT0, "BFM","Take Your Pick (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR2140 MONOPOLY X SDMON SOUNDS (are these really a game called Top Box, or are they Top Box roms for Monopoly?) -GAME( 200?, sc5tbox ,0, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxa, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxb, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxc, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxd, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxe, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxf, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxg, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxh, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxi, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxj, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxk, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxl, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxm, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxn, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxo, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxp, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 17)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tboxq, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 18)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5tbox ,0, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxa, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxb, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxc, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxd, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxe, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxf, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxg, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxh, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxi, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxj, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxk, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxl, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxm, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxn, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxo, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxp, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 17)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tboxq, sc5tbox, sc5, sc5, sc5, ROT0, "Mazooma","Top Box (Mazooma) (Scorpion 5) (set 18)", GAME_IS_SKELETON_MECHANICAL ) // PR2211 TOP OF THE SHOTS TOTS SOUNDS TOP OF THE SHOTS -GAME( 200?, sc5tpsht ,0, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tpshta ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tpshtb ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tpshtc ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5tpshtd ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5tpsht ,0, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tpshta ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tpshtb ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tpshtc ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5tpshtd ,sc5tpsht, sc5, sc5, sc5, ROT0, "Mazooma","Top Of The Shots (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) // PR2175 TRAIL BLAZER TRAB SOUNDS TRAIL BLAZER -GAME( 200?, sc5trail ,0, sc5, sc5, sc5, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5traila ,sc5trail, sc5, sc5, sc5, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5trail ,0, sc5, sc5, sc5, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5traila ,sc5trail, sc5, sc5, sc5, ROT0, "Mazooma","Trailblazer (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR3010 AWP VIVA MEXICO SCORP5 PR3010 VIVA MEXICO SOUNDS11 VIVA MEXICO S.SITE -GAME( 200?, sc5vivam ,0, sc5, sc5, sc5, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5vivama ,sc5vivam, sc5, sc5, sc5, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5vivam ,0, sc5, sc5, sc5, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5vivama ,sc5vivam, sc5, sc5, sc5, ROT0, "BFM","Viva Mexico (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2341 WILD JACKPOTS WILDJACK SOUNDS WILD JACKPOTS -GAME( 200?, sc5wldjk ,0, sc5, sc5, sc5, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5wldjka ,sc5wldjk, sc5, sc5, sc5, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5wldjk ,0, sc5, sc5, sc5, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5wldjka ,sc5wldjk, sc5, sc5, sc5, ROT0, "Mazooma","Wild Jackpots (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1611 AWP ANT AND DECS PR1611 ANT AND DECS SOUNDS11 ANT AND DECS S.SITE -GAME( 200?, sc5adsnt ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5adsnta ,sc5adsnt, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5adsnt ,0, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5adsnta ,sc5adsnt, sc5, sc5, sc5, ROT0, "BFM","Ant & Dec's Saturday Night Takeaway (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1708 AWP BULLY'S PRIZE BOARD PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE -GAME( 200?, sc5bpb ,0, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bpbb ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bpbd ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bpbe ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bpb ,0, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bpbb ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bpbd ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bpbe ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1708 AWP BULLY'S PRIZE BOARD S5 PR1708 B PRIZE BOARD SOUNDS11 BULLYSPRIZEBOARD S.SITE -GAME( 200?, sc5bpba ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bpbc ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bpba ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bpbc ,sc5bpb, sc5, sc5, sc5, ROT0, "BFM","Bully's Prize Board (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR3010 AWP BULLYS STAR PRIZE SCORP5 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE -GAME( 200?, sc5bsp ,0, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspa ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspb ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspc ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspd ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspe ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspf ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspg ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bsph ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspi ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspl ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspm ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspn ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspo ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bsp ,0, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspa ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspb ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspc ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspd ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspe ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspf ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspg ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bsph ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspi ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspl ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspm ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspn ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspo ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3010) (Bellfruit) (Scorpion 5) (set 16)", GAME_IS_SKELETON_MECHANICAL ) // PR3012 AWP BULLYS STAR PRIZE SCORP5 PR3012 BULLYS STAR P SOUNDS11 BULLYS STARPRIZE S.SITE -GAME( 200?, sc5bspj ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3012) (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5bspk ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3012) (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5bspj ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3012) (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5bspk ,sc5bsp, sc5, sc5, sc5, ROT0, "BFM","Bully's Star Prize (PR3012) (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR1312 AWP CHAIN REACTION PR1312 CHAIN REACT SOUNDS11 -GAME( 200?, sc5chain ,0, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chaina ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chainb ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chainc ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chaind ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5chaine ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5chain ,0, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chaina ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chainb ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chainc ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chaind ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5chaine ,sc5chain, sc5, sc5, sc5, ROT0, "BFM","Chain Reaction (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // PR1707 AWP CLOWN AROUND SCORP5 PR1707 CLOWN AROUND SOUNDS11 CLOWN AROUND S.SITE -GAME( 200?, sc5clown ,0, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clowna ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clownb ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5clownc ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5clown ,0, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clowna ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clownb ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5clownc ,sc5clown, sc5, sc5, sc5, ROT0, "BFM","Clown Around (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) // PR1412 AWP COPS AND ROBBERS PR1412 COPS AND ROBBERS SOUNDS11 COPS AND ROBBERS S.SITE -GAME( 200?, sc5copsr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsra ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrb ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrc ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrd ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsre ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrf ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrg ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsrh ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5copsri ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5copsr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsra ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrb ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrc ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrd ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsre ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrf ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrg ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsrh ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5copsri ,sc5copsr, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) // PR1915 AWP DEAL OR NO DEAL BEAT THE BANKER S5 PR1915 BEAT THE BANKER SOUNDS11 BEAT THE BANKER S.SITE -GAME( 200?, sc5dndbe ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbea ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbeb ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbec ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbed ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbee ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbef ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbeg ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbeh ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbei ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbej ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbek ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbel ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbem ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndben ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbe ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbea ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbeb ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbec ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbed ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbee ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbef ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbeg ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbeh ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbei ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbej ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbek ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbel ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 13)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbem ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 14)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndben ,sc5dndbe, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker (Bellfruit) (Scorpion 5) (set 15)", GAME_IS_SKELETON_MECHANICAL ) // PR3063 CASINO DOND CAN YOU BEAT THE BANKER CASINO DOND ARCADE PR3063 BEAT THE BANKER SOUNDS11 -GAME( 200?, sc5ddbbc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbca ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbcb ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbcc ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbcd ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbce ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbcf ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5ddbbcg ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5ddbbc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbca ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbcb ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbcc ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbcd ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbce ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbcf ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5ddbbcg ,sc5ddbbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Beat The Banker Casino (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) // PR3312 AWP DEAL OR NO DEAL BOX CLEVER SCORP5 PR3312 DOND BOXCLEVER SOUNDS11 BOX CLEVER S.SITE -GAME( 200?, sc5dndbc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbca ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcb ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcc ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcd ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbce ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcf ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcg ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbch ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbci ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbcj ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5dndbck ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5dndbc ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbca ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcb ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcc ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcd ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbce ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcf ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcg ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbch ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbci ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbcj ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 11)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5dndbck ,sc5dndbc, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Box Clever (Bellfruit) (Scorpion 5) (set 12)", GAME_IS_SKELETON_MECHANICAL ) // PR1706 AWP WHEEL OF WEALTH PR1706 WHEEL OF WEALTH SOUNDS11 WHEEL OF WEALTH S.SITE -GAME( 200?, sc5mowow ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5mowowb ,sc5mowow, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5mowow ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5mowowb ,sc5mowow, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) // PR2166 NUN N ROSES NANR SOUNDS NUNS N ROSES -GAME( 200?, sc5nunsm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nunsma ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nunsmb ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nunsmc ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nunsmd ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, sc5nunsme ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, sc5nunsm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nunsma ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nunsmb ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nunsmc ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nunsmd ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, sc5nunsme ,sc5nunsm, sc5, sc5, sc5, ROT0, "Mazooma","Nuns 'n' Roses (Mazooma) (Scorpion 5) (set 6)", GAME_IS_SKELETON_MECHANICAL ) // Adder 5 -GAME( 200?, ad5bpfpm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bullseye Pounds For Points (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5btc ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5cmons ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Money (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5dndpl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Platinum (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5eyes ,0, sc5, sc5, sc5, ROT0, "Mazooma","Eyes Down (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5gldmn ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Mine (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5gldwn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Winner (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5hir ,0, sc5, sc5, sc5, ROT0, "BFM","Hi Roller (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5hircl ,0, sc5, sc5, sc5, ROT0, "BFM","Hi Roller Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5jckmo ,0, sc5, sc5, sc5, ROT0, "Mazooma","Jackpot Monopoly (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5mcob ,0, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust (Qps) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5ppbtb ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Break The Bank (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5pking ,0, sc5, sc5, sc5, ROT0, "BFM","Poker King (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rsnw ,0, sc5, sc5, sc5, ROT0, "Mazooma","Random Spin 'n' Win (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rspin ,0, sc5, sc5, sc5, ROT0, "BFM","Random Spinner (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rsclb ,0, sc5, sc5, sc5, ROT0, "BFM","Random Spinner Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rwclb ,0, sc5, sc5, sc5, ROT0, "BFM","Random Winner Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rapid ,0, sc5, sc5, sc5, ROT0, "BFM","Rapid Pay (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rcash ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Cash (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rroul ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Roulette (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rsrm ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Rocket Money (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5rsrr ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Rocket Ronnie (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5tornc ,0, sc5, sc5, sc5, ROT0, "BFM","Tornado Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5vpa ,0, sc5, sc5, sc5, ROT0, "BFM","Video Poker Ace (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5vlv ,0, sc5, sc5, sc5, ROT0, "BFM","Viva Las Vegas (Bellfruit) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5u1337 ,0, sc5, sc5, sc5, ROT0, "Mazooma","unknown Scorpion '39211337' (Mazooma) (Scorpion 5, Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 200?, ad5crcpt ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5bull ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5crsc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5dnd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5dndcl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5dnddd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5dndpg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5evol ,0, sc5, sc5, sc5, ROT0, "Qps","Evolution (Qps) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5monop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly (Mazooma) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5mr2r ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5mww ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5pp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5sslam ,0, sc5, sc5, sc5, ROT0, "BFM","Super Slam (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5copsr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, ad5mowow ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Adder 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, ad5bpfpm ,0, sc5, sc5, sc5, ROT0, "Mazooma","Bullseye Pounds For Points (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5btc ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye Triple Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5cmons ,0, sc5, sc5, sc5, ROT0, "BFM","Crazy Money (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5dndpl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Platinum (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5eyes ,0, sc5, sc5, sc5, ROT0, "Mazooma","Eyes Down (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5gldmn ,0, sc5, sc5, sc5, ROT0, "BFM","Gold Mine (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5gldwn ,0, sc5, sc5, sc5, ROT0, "Mazooma","Golden Winner (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5hir ,0, sc5, sc5, sc5, ROT0, "BFM","Hi Roller (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5hircl ,0, sc5, sc5, sc5, ROT0, "BFM","Hi Roller Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5jckmo ,0, sc5, sc5, sc5, ROT0, "Mazooma","Jackpot Monopoly (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5mcob ,0, sc5, sc5, sc5, ROT0, "Qps","Monte Carlo Or Bust (Qps) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5ppbtb ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther Break The Bank (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5pking ,0, sc5, sc5, sc5, ROT0, "BFM","Poker King (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rsnw ,0, sc5, sc5, sc5, ROT0, "Mazooma","Random Spin 'n' Win (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rspin ,0, sc5, sc5, sc5, ROT0, "BFM","Random Spinner (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rsclb ,0, sc5, sc5, sc5, ROT0, "BFM","Random Spinner Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rwclb ,0, sc5, sc5, sc5, ROT0, "BFM","Random Winner Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rapid ,0, sc5, sc5, sc5, ROT0, "BFM","Rapid Pay (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rcash ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Cash (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rroul ,0, sc5, sc5, sc5, ROT0, "Mazooma","Reel Roulette (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rsrm ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Rocket Money (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5rsrr ,0, sc5, sc5, sc5, ROT0, "BFM","Ronnie O'Sullivan's Rocket Ronnie (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5tornc ,0, sc5, sc5, sc5, ROT0, "BFM","Tornado Club (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5vpa ,0, sc5, sc5, sc5, ROT0, "BFM","Video Poker Ace (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5vlv ,0, sc5, sc5, sc5, ROT0, "BFM","Viva Las Vegas (Bellfruit) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5u1337 ,0, sc5, sc5, sc5, ROT0, "Mazooma","unknown Scorpion '39211337' (Mazooma) (Scorpion 5, Adder 5)", GAME_IS_SKELETON_MECHANICAL ) + +GAME( 200?, ad5crcpt ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Community Party (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5bull ,0, sc5, sc5, sc5, ROT0, "BFM","Bullseye (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5crsc ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers Safe Cracker (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5dnd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5dndcl ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Club (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5dnddd ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal Double Deal Or No Deal (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5dndpg ,0, sc5, sc5, sc5, ROT0, "BFM","Deal Or No Deal The Perfect Game (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5evol ,0, sc5, sc5, sc5, ROT0, "Qps","Evolution (Qps) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5monop ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly (Mazooma) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5mr2r ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Road To Riches (Mazooma) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5mww ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wonders Of The World (Mazooma) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5pp ,0, sc5, sc5, sc5, ROT0, "Mazooma","Pink Panther (Mazooma) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5sslam ,0, sc5, sc5, sc5, ROT0, "BFM","Super Slam (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5copsr ,0, sc5, sc5, sc5, ROT0, "BFM","Cops 'n' Robbers (Bellfruit) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, ad5mowow ,0, sc5, sc5, sc5, ROT0, "Mazooma","Monopoly Wheel Of Wealth (Mazooma) (Adder 5)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/bfm_swp.c mame-0.145/src/mame/drivers/bfm_swp.c --- mame-0.144/src/mame/drivers/bfm_swp.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfm_swp.c 2012-02-06 21:30:34.000000000 +0000 @@ -129,6 +129,11 @@ public: bfm_swp_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } + + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) + { + return 0; + } }; @@ -152,7 +157,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_DRIVER(bfm_swp_state, screen_update) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) @@ -246,7 +251,7 @@ -GAME( 199?, c3_rtime , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Radio Times (Bellfruit) (Cobra 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, c3_telly , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Telly Addicts (Bellfruit) (Cobra 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, c3_totp , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Top of the Pops (Bellfruit) (Cobra 3?)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, c3_ppays , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "The Phrase That Pays (Bellfruit) (Cobra 3?)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, c3_rtime , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Radio Times (Bellfruit) (Cobra 3)", GAME_IS_SKELETON ) +GAME( 199?, c3_telly , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Telly Addicts (Bellfruit) (Cobra 3)", GAME_IS_SKELETON ) +GAME( 199?, c3_totp , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "Top of the Pops (Bellfruit) (Cobra 3?)", GAME_IS_SKELETON ) +GAME( 199?, c3_ppays , 0 , bfm_swp, bfm_swp, 0, ROT0, "Maygay", "The Phrase That Pays (Bellfruit) (Cobra 3?)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/bfmsys83.c mame-0.145/src/mame/drivers/bfmsys83.c --- mame-0.144/src/mame/drivers/bfmsys83.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bfmsys83.c 2012-02-06 21:30:39.000000000 +0000 @@ -59,5 +59,5 @@ ROM_LOAD( "cops.p4", 0x8000, 0x2000, CRC(ce573b35) SHA1(f2ba22f0d55f882dd91b37e80e4bb14effd9113a) ) ROM_END -GAME( 198?, b83catms , 0 , bfmsys83 , bfmsys83 , 0 , 0, "BFM", "Cat & Mouse (Bellfruit) (System 83)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 198?, b83cops , 0 , bfmsys83 , bfmsys83 , 0 , 0, "BFM", "Cops & Robbers (Bellfruit) (System 83)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 198?, b83catms , 0 , bfmsys83 , bfmsys83 , 0 , 0, "BFM", "Cat & Mouse (Bellfruit) (System 83)", GAME_IS_SKELETON_MECHANICAL) +GAME( 198?, b83cops , 0 , bfmsys83 , bfmsys83 , 0 , 0, "BFM", "Cops & Robbers (Bellfruit) (System 83)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/bgt.c mame-0.145/src/mame/drivers/bgt.c --- mame-0.144/src/mame/drivers/bgt.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bgt.c 2012-02-06 21:30:34.000000000 +0000 @@ -5,6 +5,7 @@ */ +#define ADDRESS_MAP_MODERN #include "emu.h" #include "cpu/nec/nec.h" @@ -15,19 +16,25 @@ { public: bgt_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( bgt_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( bgt_map, AS_PROGRAM, 16, bgt_state ) AM_RANGE(0x00000, 0x7ffff) AM_ROM AM_RANGE(0xf8000, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( bgt_io, AS_IO, 16 ) +static ADDRESS_MAP_START( bgt_io, AS_IO, 16, bgt_state ) ADDRESS_MAP_END @@ -82,9 +89,7 @@ ROM_END - - -GAME( 199?, bg_ddb ,0 ,bgt ,bgt ,0 ,ROT0 ,"BGT", "Ding Dong Bells (BGT)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, bg_barmy ,0 ,bgt ,bgt ,0 ,ROT0 ,"BGT", "Barmy Army (BGT)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, bg_max ,0 ,bgt ,bgt ,0 ,ROT0 ,"BGT", "Max A Million (BGT) (set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, bg_maxa ,bg_max ,bgt ,bgt ,0 ,ROT0 ,"BGT", "Max A Million (BGT) (set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, bg_ddb, 0, bgt, bgt, 0, ROT0, "BGT", "Ding Dong Bells (BGT)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_barmy, 0, bgt, bgt, 0, ROT0, "BGT", "Barmy Army (BGT)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_max, 0, bgt, bgt, 0, ROT0, "BGT", "Max A Million (BGT) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, bg_maxa, bg_max, bgt, bgt, 0, ROT0, "BGT", "Max A Million (BGT) (set 2)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/big10.c mame-0.145/src/mame/drivers/big10.c --- mame-0.144/src/mame/drivers/big10.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/big10.c 2012-02-06 21:30:41.000000000 +0000 @@ -61,15 +61,16 @@ #include "sound/ay8910.h" #include "video/v9938.h" #include "machine/nvram.h" -#include "deprecat.h" class big10_state : public driver_device { public: big10_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") { } + required_device m_v9938; UINT8 m_mux_data; }; @@ -81,22 +82,15 @@ * Interrupt handling & Video * ***************************************/ -static void big10_vdp_interrupt(running_machine &machine, int i) +static void big10_vdp_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line (machine, "maincpu", 0, (i ? ASSERT_LINE : CLEAR_LINE)); + cputag_set_input_line (device.machine(), "maincpu", 0, (i ? ASSERT_LINE : CLEAR_LINE)); } -static INTERRUPT_GEN( big10_interrupt ) +static TIMER_DEVICE_CALLBACK( big10_interrupt ) { - v9938_interrupt(device->machine(), 0); -} - - -static VIDEO_START( big10 ) -{ - VIDEO_START_CALL(generic_bitmapped); - v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, VDP_MEM, big10_vdp_interrupt); - v9938_reset(0); + big10_state *state = timer.machine().driver_data(); + state->m_v9938->interrupt(); } @@ -106,7 +100,6 @@ static MACHINE_RESET(big10) { - v9938_reset(0); } @@ -149,10 +142,7 @@ ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ(mux_r) /* present in test mode */ AM_RANGE(0x02, 0x02) AM_READ_PORT("SYSTEM") /* coins and service */ - AM_RANGE(0x98, 0x98) AM_WRITE(v9938_0_vram_w) AM_READ(v9938_0_vram_r) - AM_RANGE(0x99, 0x99) AM_WRITE(v9938_0_command_w) AM_READ(v9938_0_status_r) - AM_RANGE(0x9a, 0x9a) AM_WRITE(v9938_0_palette_w) - AM_RANGE(0x9b, 0x9b) AM_WRITE(v9938_0_register_w) + AM_RANGE(0x98, 0x9b) AM_DEVREADWRITE_MODERN("v9938", v9938_device, read, write) AM_RANGE(0xa0, 0xa1) AM_DEVWRITE("aysnd", ay8910_address_data_w) AM_RANGE(0xa2, 0xa2) AM_DEVREAD("aysnd", ay8910_r) /* Dip-Switches routes here. */ ADDRESS_MAP_END @@ -256,24 +246,25 @@ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* guess */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_io) - MCFG_CPU_VBLANK_INT_HACK(big10_interrupt, 262) + MCFG_TIMER_ADD_SCANLINE("scantimer", big10_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(big10) MCFG_NVRAM_ADD_0FILL("nvram") /* video hardware */ + MCFG_V9938_ADD("v9938", "screen", VDP_MEM) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(big10_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2) MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1) - MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT(v9938) - MCFG_VIDEO_START(big10) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/bigevglf.c mame-0.145/src/mame/drivers/bigevglf.c --- mame-0.144/src/mame/drivers/bigevglf.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bigevglf.c 2012-02-06 21:30:39.000000000 +0000 @@ -533,10 +533,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bigevglf) + MCFG_SCREEN_UPDATE_STATIC(bigevglf) MCFG_GFXDECODE(bigevglf) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/bigstrkb.c mame-0.145/src/mame/drivers/bigstrkb.c --- mame-0.144/src/mame/drivers/bigstrkb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bigstrkb.c 2012-02-06 21:30:39.000000000 +0000 @@ -205,10 +205,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bigstrkb) + MCFG_SCREEN_UPDATE_STATIC(bigstrkb) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/bingo.c mame-0.145/src/mame/drivers/bingo.c --- mame-0.144/src/mame/drivers/bingo.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/bingo.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/s2650/s2650.h" #include "cpu/i8085/i8085.h" @@ -7,11 +9,21 @@ { public: bingo_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( bingo_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( bingo_map, AS_PROGRAM, 8, bingo_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x1eff) AM_ROM AM_RANGE(0x1f00, 0x1fff) AM_RAM @@ -20,7 +32,7 @@ static INPUT_PORTS_START( bingo ) INPUT_PORTS_END -static MACHINE_RESET( bingo ) +void bingo_state::machine_reset() { } @@ -32,25 +44,33 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", S2650, 1000000) MCFG_CPU_PROGRAM_MAP(bingo_map) - - MCFG_MACHINE_RESET( bingo ) MACHINE_CONFIG_END class seeben_state : public driver_device { public: seeben_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( seeben_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( seeben_map, AS_PROGRAM, 8, seeben_state ) ADDRESS_MAP_END static INPUT_PORTS_START( seeben ) INPUT_PORTS_END -static MACHINE_RESET( seeben ) +void seeben_state::machine_reset() { } @@ -62,19 +82,26 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8085A, 1000000) MCFG_CPU_PROGRAM_MAP(seeben_map) - - MCFG_MACHINE_RESET( seeben ) MACHINE_CONFIG_END class splin_state : public driver_device { public: splin_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } -}; + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: -static ADDRESS_MAP_START( splin_map, AS_PROGRAM, 16 ) + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); +}; + +static ADDRESS_MAP_START( splin_map, AS_PROGRAM, 16, splin_state ) AM_RANGE(0x00000, 0x0bfff) AM_RAM AM_RANGE(0x0d900, 0x0d9ff) AM_RAM AM_RANGE(0xe0000, 0xfffff) AM_ROM @@ -83,7 +110,7 @@ static INPUT_PORTS_START( splin ) INPUT_PORTS_END -static MACHINE_RESET( splin ) +void splin_state::machine_reset() { } @@ -95,8 +122,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I80186, 8000000) MCFG_CPU_PROGRAM_MAP(splin_map) - - MCFG_MACHINE_RESET( splin ) MACHINE_CONFIG_END ROM_START(cntinntl) @@ -266,27 +291,28 @@ ROM_LOAD( "13006-2", 0x0000, 0x4000, CRC(c7104e8f) SHA1(a3737f70cb9c97df24b5da915ef53b6d30f2470d)) ROM_END -GAME(1980, cntinntl, 0, bingo, bingo, bingo, ROT0, "Bally", "Continental (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, goldgame, 0, splin, splin, splin, ROT0, "Splin", "Golden Game (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, goldgkitb, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Kit Bingo Stake 6/10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, goldgstake, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Bingo Stake 6/10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, goldgnew, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Bingo New (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, goldgkit1, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Kit 1 Generation (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, michigan, 0, splin, splin, splin, ROT0, "Splin", "Michigan (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, michkit1, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo Kit 1 Generation (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, michkitb, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Kit Bingo Stake 6/10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, michstake, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo Stake 6/10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, michnew, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo New (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, montana, 0, splin, splin, splin, ROT0, "Splin", "Montana Bingo Stake 6/10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, topgame, 0, splin, splin, splin, ROT0, "Splin", "Top Game Laser L10 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, topgamet, topgame, splin, splin, splin, ROT0, "Splin", "Top Game Turbo (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, penalty, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Penalty (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, brooklyn, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Brooklyn (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, brooklyna, brooklyn, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Brooklyn (alternate set)(Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, newdixie, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "New Dixieland (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, superdix, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Super Dixieland (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, cntine31, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Continental 3 in 1 (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, domino2, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Domino II (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, tripjok, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Triple Joker (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, ggate, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Golden Gate (Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, ggatea, ggate, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Golden Gate (alternate set)(Bingo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1980, cntinntl, 0, bingo, bingo, bingo, ROT0, "Bally", "Continental (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, goldgame, 0, splin, splin, splin, ROT0, "Splin", "Golden Game (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, goldgkitb, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Kit Bingo Stake 6/10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, goldgstake, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Bingo Stake 6/10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, goldgnew, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Bingo New (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, goldgkit1, goldgame, splin, splin, splin, ROT0, "Splin", "Golden Game Kit 1 Generation (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, michigan, 0, splin, splin, splin, ROT0, "Splin", "Michigan (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, michkit1, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo Kit 1 Generation (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, michkitb, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Kit Bingo Stake 6/10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, michstake, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo Stake 6/10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, michnew, michigan, splin, splin, splin, ROT0, "Splin", "Michigan Bingo New (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, montana, 0, splin, splin, splin, ROT0, "Splin", "Montana Bingo Stake 6/10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, topgame, 0, splin, splin, splin, ROT0, "Splin", "Top Game Laser L10 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, topgamet, topgame, splin, splin, splin, ROT0, "Splin", "Top Game Turbo (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, penalty, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Penalty (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, brooklyn, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Brooklyn (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, brooklyna, brooklyn, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Brooklyn (alternate set)(Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, newdixie, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "New Dixieland (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, superdix, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Super Dixieland (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, cntine31, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Continental 3 in 1 (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, domino2, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Domino II (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, tripjok, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Triple Joker (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, ggate, 0, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Golden Gate (Bingo)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, ggatea, ggate, seeben, seeben, seeben, ROT0, "Seeben (Belgium)", "Golden Gate (alternate set)(Bingo)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/bingoc.c mame-0.145/src/mame/drivers/bingoc.c --- mame-0.144/src/mame/drivers/bingoc.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bingoc.c 2012-02-06 21:30:33.000000000 +0000 @@ -51,7 +51,7 @@ } -static SCREEN_UPDATE(bingoc) +static SCREEN_UPDATE_IND16(bingoc) { return 0; } @@ -153,10 +153,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(bingoc) + MCFG_SCREEN_UPDATE_STATIC(bingoc) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/bingor.c mame-0.145/src/mame/drivers/bingor.c --- mame-0.144/src/mame/drivers/bingor.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/bingor.c 2012-02-06 21:30:33.000000000 +0000 @@ -457,12 +457,12 @@ { } -static SCREEN_UPDATE(bingor) +static SCREEN_UPDATE_RGB32(bingor) { - bingor_state *state = screen->machine().driver_data(); + bingor_state *state = screen.machine().driver_data(); int x,y,count; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = (0x2000/2); @@ -474,23 +474,23 @@ color = (state->m_blit_ram[count] & 0xf000)>>12; - if((x+3)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x+3) = screen->machine().pens[color]; + if(cliprect.contains(x+3, y)) + bitmap.pix32(y, x+3) = screen.machine().pens[color]; color = (state->m_blit_ram[count] & 0x0f00)>>8; - if((x+2)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x+2) = screen->machine().pens[color]; + if(cliprect.contains(x+2, y)) + bitmap.pix32(y, x+2) = screen.machine().pens[color]; color = (state->m_blit_ram[count] & 0x00f0)>>4; - if((x+1)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x+1) = screen->machine().pens[color]; + if(cliprect.contains(x+1, y)) + bitmap.pix32(y, x+1) = screen.machine().pens[color]; color = (state->m_blit_ram[count] & 0x000f)>>0; - if((x+0)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x+0) = screen->machine().pens[color]; + if(cliprect.contains(x+0, y)) + bitmap.pix32(y, x+0) = screen.machine().pens[color]; count++; } @@ -629,10 +629,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1) - MCFG_SCREEN_UPDATE(bingor) + MCFG_SCREEN_UPDATE_STATIC(bingor) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/bionicc.c mame-0.145/src/mame/drivers/bionicc.c --- mame-0.144/src/mame/drivers/bionicc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/bionicc.c 2012-02-06 21:30:36.000000000 +0000 @@ -380,11 +380,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bionicc) - MCFG_SCREEN_EOF(bionicc) + MCFG_SCREEN_UPDATE_STATIC(bionicc) + MCFG_SCREEN_VBLANK_STATIC(bionicc) MCFG_GFXDECODE(bionicc) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/bishi.c mame-0.145/src/mame/drivers/bishi.c --- mame-0.144/src/mame/drivers/bishi.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bishi.c 2012-02-06 21:30:41.000000000 +0000 @@ -428,10 +428,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1200)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(29, 29+288-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(bishi) + MCFG_SCREEN_UPDATE_STATIC(bishi) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/bking.c mame-0.145/src/mame/drivers/bking.c --- mame-0.144/src/mame/drivers/bking.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bking.c 2012-02-06 21:30:41.000000000 +0000 @@ -501,11 +501,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bking) - MCFG_SCREEN_EOF(bking) + MCFG_SCREEN_UPDATE_STATIC(bking) + MCFG_SCREEN_VBLANK_STATIC(bking) MCFG_GFXDECODE(bking) MCFG_PALETTE_LENGTH(4*8+4*4+4*2+4*2) diff -Nru mame-0.144/src/mame/drivers/blackt96.c mame-0.145/src/mame/drivers/blackt96.c --- mame-0.144/src/mame/drivers/blackt96.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/blackt96.c 2012-02-06 21:30:36.000000000 +0000 @@ -68,7 +68,7 @@ { } -static void draw_strip(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int stripnum, int xbase, int ybase, int bg) +static void draw_strip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int stripnum, int xbase, int ybase, int bg) { blackt96_state *state = machine.driver_data(); const gfx_element *gfxspr = machine.gfx[1]; @@ -98,7 +98,7 @@ } -static void draw_main(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bg) +static void draw_main(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bg) { blackt96_state *state = machine.driver_data(); @@ -128,17 +128,17 @@ } -static SCREEN_UPDATE( blackt96 ) +static SCREEN_UPDATE_IND16( blackt96 ) { - blackt96_state *state = screen->machine().driver_data(); + blackt96_state *state = screen.machine().driver_data(); int count; int x,y; - const gfx_element *gfx = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[2]; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - draw_main(screen->machine(),bitmap,cliprect,1); - draw_main(screen->machine(),bitmap,cliprect,0); + draw_main(screen.machine(),bitmap,cliprect,1); + draw_main(screen.machine(),bitmap,cliprect,0); /* Text Layer */ count = 0; @@ -495,11 +495,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) // MCFG_SCREEN_VISIBLE_AREA(0*8, 16*32-1, 0*8, 16*32-1) MCFG_SCREEN_VISIBLE_AREA(0*8, 256-1, 0*8, 208-1) - MCFG_SCREEN_UPDATE(blackt96) + MCFG_SCREEN_UPDATE_STATIC(blackt96) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/bladestl.c mame-0.145/src/mame/drivers/bladestl.c --- mame-0.144/src/mame/drivers/bladestl.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/bladestl.c 2012-02-06 21:30:37.000000000 +0000 @@ -349,10 +349,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bladestl) + MCFG_SCREEN_UPDATE_STATIC(bladestl) MCFG_GFXDECODE(bladestl) MCFG_PALETTE_INIT(bladestl) diff -Nru mame-0.144/src/mame/drivers/blitz68k.c mame-0.145/src/mame/drivers/blitz68k.c --- mame-0.144/src/mame/drivers/blitz68k.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blitz68k.c 2012-02-06 21:30:40.000000000 +0000 @@ -25,16 +25,18 @@ - ilpag, steaser: some minor issues with the blitter emulation; - ilpag: sound uses a MP7524 8-bit DAC (bottom right, by the edge connector -PJB), but the MCU controls the sound writes? - steaser: sound uses an OkiM6295 (controlled by the sub MCU), check if it can be simulated; +- deucesw2: colour cycling effect on attract mode is ugly (background should be blue, it's instead a MAME-esque + palette), protection? *****************************************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "video/mc6845.h" #include "sound/dac.h" #include "sound/saa1099.h" #include "machine/nvram.h" +#include "video/ramdac.h" class blitz68k_state : public driver_device { @@ -46,8 +48,6 @@ optional_shared_ptr m_nvram; UINT8 *m_blit_buffer; UINT16 *m_frame_buffer; - struct { int r,g,b,offs,offs_internal; } m_pal; - struct { UINT8 r, g, b, offs, offs_internal, ram[256*3]; } m_btpal; UINT16 *m_blit_romaddr; UINT16 *m_blit_attr1_ram; UINT16 *m_blit_dst_ram_loword; @@ -90,9 +90,9 @@ blit.addr_factor = 1; } -static SCREEN_UPDATE(blitz68k) +static SCREEN_UPDATE_RGB32(blitz68k) { - blitz68k_state *state = screen->machine().driver_data(); + blitz68k_state *state = screen.machine().driver_data(); int x,y; UINT8 *src = state->m_blit_buffer; @@ -101,7 +101,7 @@ { for(x = 0; x < 512; x++) { - *BITMAP_ADDR32(bitmap, y, x) = screen->machine().pens[*src++]; + bitmap.pix32(y, x) = screen.machine().pens[*src++]; } } @@ -111,9 +111,9 @@ // Blitter-less board (SPI-68K) -static SCREEN_UPDATE(blitz68k_noblit) +static SCREEN_UPDATE_RGB32(blitz68k_noblit) { - blitz68k_state *state = screen->machine().driver_data(); + blitz68k_state *state = screen.machine().driver_data(); int x,y; UINT16 *src = state->m_frame_buffer; @@ -123,10 +123,10 @@ for(x = 0; x < 512; ) { UINT16 pen = *src++; - *BITMAP_ADDR32(bitmap, y, x++) = screen->machine().pens[(pen >> 8) & 0xf]; - *BITMAP_ADDR32(bitmap, y, x++) = screen->machine().pens[(pen >> 12) & 0xf]; - *BITMAP_ADDR32(bitmap, y, x++) = screen->machine().pens[(pen >> 0) & 0xf]; - *BITMAP_ADDR32(bitmap, y, x++) = screen->machine().pens[(pen >> 4) & 0xf]; + bitmap.pix32(y, x++) = screen.machine().pens[(pen >> 8) & 0xf]; + bitmap.pix32(y, x++) = screen.machine().pens[(pen >> 12) & 0xf]; + bitmap.pix32(y, x++) = screen.machine().pens[(pen >> 0) & 0xf]; + bitmap.pix32(y, x++) = screen.machine().pens[(pen >> 4) & 0xf]; } } @@ -135,121 +135,6 @@ /************************************************************************************************************* - Palette - -*************************************************************************************************************/ - -static WRITE16_HANDLER( paletteram_io_w ) -{ - blitz68k_state *state = space->machine().driver_data(); - int pal_data; - - switch(offset*2) - { - case 0: - state->m_pal.offs = (data & 0xff00) >> 8; - break; - case 4: - state->m_pal.offs_internal = 0; - break; - case 2: - switch(state->m_pal.offs_internal) - { - case 0: - pal_data = (data & 0xff00) >> 8; - state->m_pal.r = ((pal_data & 0x3f) << 2) | ((pal_data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 1: - pal_data = (data & 0xff00) >> 8; - state->m_pal.g = ((pal_data & 0x3f) << 2) | ((pal_data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 2: - pal_data = (data & 0xff00) >> 8; - state->m_pal.b = ((pal_data & 0x3f) << 2) | ((pal_data & 0x30) >> 4); - palette_set_color(space->machine(), state->m_pal.offs, MAKE_RGB(state->m_pal.r, state->m_pal.g, state->m_pal.b)); - state->m_pal.offs_internal = 0; - state->m_pal.offs++; - break; - } - - break; - } -} - -/************************************************************************************************************* - - Palette (Bt476 RAMDAC) - To do: merge with above, implement as a device - -*************************************************************************************************************/ - - -static WRITE8_HANDLER( paletteram_bt476_w ) -{ - blitz68k_state *state = space->machine().driver_data(); - switch(offset) - { - case 0: - state->m_btpal.offs = data; - state->m_btpal.offs_internal = 0; - break; - case 2: - state->m_btpal.offs = data; - state->m_btpal.offs_internal = 0; - break; - case 1: - data &= 0x3f; - state->m_btpal.ram[state->m_btpal.offs * 3 + state->m_btpal.offs_internal] = data; - switch(state->m_btpal.offs_internal) - { - case 0: - state->m_btpal.r = data << 2; - state->m_btpal.offs_internal++; - break; - case 1: - state->m_btpal.g = data << 2; - state->m_btpal.offs_internal++; - break; - case 2: - state->m_btpal.b = data << 2; - palette_set_color(space->machine(), state->m_btpal.offs, MAKE_RGB(state->m_btpal.r, state->m_btpal.g, state->m_btpal.b)); - state->m_btpal.offs_internal = 0; - state->m_btpal.offs++; - break; - } - break; - } -} - -static READ8_HANDLER( paletteram_bt476_r ) -{ - blitz68k_state *state = space->machine().driver_data(); - UINT8 ret = 0xff; - - switch(offset) - { - case 0: - ret = state->m_btpal.offs; - break; - - case 1: - ret = state->m_btpal.ram[state->m_btpal.offs * 3 + state->m_btpal.offs_internal]; - state->m_btpal.offs_internal++; - if (state->m_btpal.offs_internal >= 3) - { - state->m_btpal.offs_internal = 0; - state->m_btpal.offs++; - } - break; - } - - return ret; -} - -/************************************************************************************************************* - Blitter (ilpag, steaser) To do: @@ -601,7 +486,9 @@ // AM_RANGE(0x800000, 0x800001) AM_READ(test_r) // AM_RANGE(0x880000, 0x880001) AM_READ(test_r) - AM_RANGE(0x900000, 0x900005) AM_WRITE( paletteram_io_w ) //RAMDAC + AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0xff00 ) + AM_RANGE(0x900004, 0x900005) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) AM_RANGE(0x980000, 0x98000f) AM_RAM AM_BASE_MEMBER(blitz68k_state, m_blit_transpen) //video registers for the blitter write AM_RANGE(0x990000, 0x990007) AM_RAM AM_BASE_MEMBER(blitz68k_state, m_blit_vregs) //pens AM_RANGE(0x998000, 0x998001) AM_RAM AM_BASE_MEMBER(blitz68k_state, m_blit_romaddr) @@ -628,7 +515,9 @@ AM_RANGE(0x880000, 0x880001) AM_READ(test_r) // AM_RANGE(0x8c0000, 0x8c0001) AM_WRITE(sound_write_w) - AM_RANGE(0x900000, 0x900005) AM_WRITE( paletteram_io_w ) //RAMDAC + AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0xff00 ) + AM_RANGE(0x900004, 0x900005) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) AM_RANGE(0x940000, 0x940001) AM_WRITENOP //? Seems a dword write for some read, written consecutively AM_RANGE(0x980000, 0x98000f) AM_RAM AM_BASE_MEMBER(blitz68k_state, m_blit_transpen)//probably transparency pens AM_RANGE(0x990000, 0x990005) AM_RAM AM_BASE_MEMBER(blitz68k_state, m_blit_vregs) @@ -690,7 +579,8 @@ AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM - AM_RANGE(0x220002, 0x220003) AM_READ8 ( paletteram_bt476_r, 0xff00 ) // RAMDAC + AM_RANGE(0x220000, 0x220001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x220002, 0x220003) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0xff00 ) AM_RANGE(0x240000, 0x240001) AM_WRITE8(blit_addr0_w, 0xff00) AM_RANGE(0x240002, 0x240003) AM_WRITE8(blit_addr1_w, 0xff00) @@ -722,7 +612,9 @@ AM_RANGE(0x2e000c, 0x2e000d) AM_WRITE8(blit_flag6_w, 0xff00) AM_RANGE(0x2e000e, 0x2e000f) AM_WRITE8(blit_flag7_w, 0xff00) - AM_RANGE(0x300000, 0x300007) AM_WRITE8( paletteram_bt476_w, 0xff00 ) // RAMDAC + AM_RANGE(0x300000, 0x300001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x300002, 0x300003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0xff00 ) + AM_RANGE(0x300004, 0x300005) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) AM_RANGE(0x400000, 0x400001) AM_READ8(bankrob_mcu_status_write_r, 0x00ff) AM_RANGE(0x400002, 0x400003) AM_READ8(bankrob_mcu_status_read_r, 0x00ff) @@ -778,7 +670,9 @@ AM_RANGE(0x880000, 0x880001) AM_WRITE8(bankroba_mcu2_r, 0x00ff) // lev 3 AM_RANGE(0x8c0000, 0x8c0001) AM_WRITE8(bankroba_mcu2_w, 0x00ff) - AM_RANGE(0x900000, 0x900007) AM_WRITE8( paletteram_bt476_w, 0xff00 ) // RAMDAC + AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0xff00 ) + AM_RANGE(0x900004, 0x900005) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) // AM_RANGE(0x940000, 0x940001) AM_WRITE // lev 6 @@ -805,7 +699,8 @@ AM_RANGE(0x9b8000, 0x9b8001) AM_WRITE8(blit_draw_w, 0x00ff) - AM_RANGE(0x9c0002, 0x9c0003) AM_READ8 ( paletteram_bt476_r, 0xff00 ) // RAMDAC + AM_RANGE(0x9c0000, 0x9c0001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x9c0002, 0x9c0003) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0xff00 ) AM_RANGE(0x9d0000, 0x9d0001) AM_READ8(bankroba_mcu1_status_write_r, 0xff00) @@ -924,8 +819,11 @@ AM_RANGE(0x874000, 0x874001) AM_READ_PORT("IN2") AM_RANGE(0x876000, 0x876001) AM_READ_PORT("DSW") - AM_RANGE(0x880000, 0x880003) AM_WRITE8( paletteram_bt476_w, 0xffff ) // RAMDAC - AM_RANGE(0x880000, 0x880001) AM_READ8 ( paletteram_bt476_r, 0xffff ) // "" + AM_RANGE(0x880000, 0x880001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x880000, 0x880001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0x00ff ) + AM_RANGE(0x880002, 0x880003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) + AM_RANGE(0x880000, 0x880001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x880000, 0x880001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0x00ff ) AM_RANGE(0x8a0000, 0x8a0007) AM_WRITE8(blit_hwyxa_draw_w, 0xffff) @@ -1015,7 +913,8 @@ AM_RANGE(0x800000, 0x800007) AM_WRITE8(blit_hwyxa_draw_w, 0xffff) - AM_RANGE(0x812000, 0x812001) AM_READ8 ( paletteram_bt476_r, 0xffff ) // RAMDAC + AM_RANGE(0x812000, 0x812001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x812000, 0x812001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0x00ff ) AM_RANGE(0x830000, 0x830001) AM_READ( deucesw2_mcu_r ) @@ -1026,7 +925,9 @@ AM_RANGE(0x880000, 0x880007) AM_WRITE8(blit_hwyxa_draw_w, 0xffff) - AM_RANGE(0x890000, 0x890003) AM_WRITE8( paletteram_bt476_w, 0xffff ) // RAMDAC + AM_RANGE(0x890000, 0x890001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x890000, 0x890001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0x00ff ) + AM_RANGE(0x890002, 0x890003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) AM_RANGE(0x894000, 0x894003) AM_WRITE8(blit_pens_w, 0xffff) @@ -1084,7 +985,8 @@ AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x100000, 0x10ffff) AM_RAM - AM_RANGE(0x220002, 0x220003) AM_READ8 ( paletteram_bt476_r, 0xff00 ) // RAMDAC + AM_RANGE(0x220002, 0x220003) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x220002, 0x220003) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0x00ff ) AM_RANGE(0x240000, 0x240001) AM_WRITE8(blit_addr0_w, 0xff00) AM_RANGE(0x240002, 0x240003) AM_WRITE8(blit_addr1_w, 0xff00) @@ -1119,7 +1021,9 @@ AM_RANGE(0x2e000c, 0x2e000d) AM_WRITE8(blit_flag6_w, 0xff00) AM_RANGE(0x2e000e, 0x2e000f) AM_WRITE8(blit_flag7_w, 0xff00) - AM_RANGE(0x300000, 0x300007) AM_WRITE8( paletteram_bt476_w, 0xff00 ) // RAMDAC + AM_RANGE(0x300000, 0x300001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x300002, 0x300003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0xff00 ) + AM_RANGE(0x300004, 0x300005) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) AM_RANGE(0x400000, 0x400001) AM_READ8(dualgame_mcu_status_write_r, 0x00ff) AM_RANGE(0x400002, 0x400003) AM_READ8(dualgame_mcu_status_read_r, 0x00ff) @@ -1186,9 +1090,15 @@ AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_RANGE(0x400000, 0x41ffff) AM_RAM - AM_RANGE(0x800000, 0x800003) AM_WRITE8( paletteram_bt476_w, 0xffff ) // RAMDAC - AM_RANGE(0x840000, 0x840003) AM_WRITE8( paletteram_bt476_w, 0xffff ) // RAMDAC - AM_RANGE(0x840000, 0x840001) AM_READ8 ( paletteram_bt476_r, 0xffff ) // "" + AM_RANGE(0x800000, 0x800001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x800000, 0x800001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0x00ff ) + AM_RANGE(0x800002, 0x800003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) + AM_RANGE(0x840000, 0x840001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, index_w, 0xff00 ) + AM_RANGE(0x840000, 0x840001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, pal_w, 0x00ff ) + AM_RANGE(0x840002, 0x840003) AM_DEVWRITE8_MODERN("ramdac",ramdac_device, mask_w, 0xff00 ) + AM_RANGE(0x840000, 0x840001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, index_r, 0xff00 ) + AM_RANGE(0x840000, 0x840001) AM_DEVREAD8_MODERN("ramdac",ramdac_device, pal_r, 0x00ff ) + AM_RANGE(0x8c0000, 0x8c0003) AM_WRITE8( blit_pens_w, 0xffff ) @@ -1686,6 +1596,15 @@ crtc_addr /* update address callback */ }; +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE_MODERN("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 0 +}; + static MACHINE_CONFIG_START( ilpag, blitz68k_state ) MCFG_CPU_ADD("maincpu", M68000, 11059200 ) // ? MCFG_CPU_PROGRAM_MAP(ilpag_map) @@ -1694,10 +1613,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_NVRAM_ADD_0FILL("nvram") @@ -1705,6 +1623,8 @@ MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) + MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) @@ -1748,17 +1668,11 @@ state->m_nvram[0x8ac/2] = input_port_read(timer.machine(), "HOLD4_HOLD5") & 0xffff; } -/* TODO: remove this hack.*/ -static INTERRUPT_GEN( steaser_irq ) -{ - int num=cpu_getiloops(device)+3; - device_set_input_line(device, num, HOLD_LINE); -} static MACHINE_CONFIG_DERIVED( steaser, ilpag ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(steaser_map) - MCFG_CPU_VBLANK_INT_HACK(steaser_irq,4) + MCFG_CPU_VBLANK_INT("screen",irq5_line_hold) //3, 4 & 6 used, mcu comms? MCFG_TIMER_ADD_PERIODIC("coinsim", steaser_mcu_sim, attotime::from_hz(10000)) // not real, but for simulating the MCU MACHINE_CONFIG_END @@ -1774,16 +1688,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-8-1) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", R6545_1, XTAL_22_1184MHz/8, mc6845_intf_irq1) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1806,16 +1720,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", H46505, XTAL_11_0592MHz/4, mc6845_intf_irq3) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1836,16 +1750,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+7, 256-1) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", H46505, XTAL_11_0592MHz/4, mc6845_intf_irq5) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k_addr_factor1) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1865,16 +1779,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", R6545_1, XTAL_22_1184MHz/8, mc6845_intf_irq3) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1896,16 +1810,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", H46505, XTAL_11_0592MHz/4, mc6845_intf_irq3) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1925,16 +1839,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4) - MCFG_SCREEN_UPDATE(blitz68k) + MCFG_SCREEN_UPDATE_STATIC(blitz68k) MCFG_MC6845_ADD("crtc", H46505, XTAL_22_1184MHz/8, mc6845_intf_irq1) MCFG_PALETTE_LENGTH(0x100) MCFG_VIDEO_START(blitz68k) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("dac", DAC, 0) @@ -1959,14 +1873,14 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(blitz68k_noblit) + MCFG_SCREEN_UPDATE_STATIC(blitz68k_noblit) MCFG_MC6845_ADD("crtc", H46505, XTAL_11_0592MHz/4, mc6845_intf_irq3) MCFG_PALETTE_LENGTH(0x100) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("saa", SAA1099, XTAL_8MHz/2) @@ -2622,7 +2536,7 @@ *************************************************************************************************************/ ROM_START( poker52 ) - ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code + gfx + ROM_REGION( 0x40000, "maincpu", ROMREGION_ERASE00 ) // 68000 code + gfx ROM_LOAD16_BYTE( "unknown_label.u25", 0x00000, 0x20000, CRC(63e0dd69) SHA1(970e6363ade714a2b9a844c5683ab1365193457a) ) ROM_LOAD16_BYTE( "unknown_label.u24", 0x00001, 0x20000, NO_DUMP ) diff -Nru mame-0.144/src/mame/drivers/blitz.c mame-0.145/src/mame/drivers/blitz.c --- mame-0.144/src/mame/drivers/blitz.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/blitz.c 2012-02-06 21:30:41.000000000 +0000 @@ -315,14 +315,14 @@ { blitz_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( megadpkr_colorram_w ) { blitz_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -352,10 +352,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( megadpkr ) +static SCREEN_UPDATE_IND16( megadpkr ) { - blitz_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + blitz_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -802,10 +802,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((32)*8, (32)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(megadpkr) + MCFG_SCREEN_UPDATE_STATIC(megadpkr) MCFG_MC6845_ADD("crtc", MC6845, CPU_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/blktiger.c mame-0.145/src/mame/drivers/blktiger.c --- mame-0.144/src/mame/drivers/blktiger.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blktiger.c 2012-02-06 21:30:40.000000000 +0000 @@ -342,11 +342,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(blktiger) - MCFG_SCREEN_EOF(blktiger) + MCFG_SCREEN_UPDATE_STATIC(blktiger) + MCFG_SCREEN_VBLANK_STATIC(blktiger) MCFG_GFXDECODE(blktiger) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/blmbycar.c mame-0.145/src/mame/drivers/blmbycar.c --- mame-0.144/src/mame/drivers/blmbycar.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blmbycar.c 2012-02-06 21:30:38.000000000 +0000 @@ -370,10 +370,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0x100-1) - MCFG_SCREEN_UPDATE(blmbycar) + MCFG_SCREEN_UPDATE_STATIC(blmbycar) MCFG_GFXDECODE(blmbycar) MCFG_PALETTE_LENGTH(0x300) @@ -417,10 +416,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 16, 0x100-1) - MCFG_SCREEN_UPDATE(blmbycar) + MCFG_SCREEN_UPDATE_STATIC(blmbycar) MCFG_GFXDECODE(blmbycar) MCFG_PALETTE_LENGTH(0x300) diff -Nru mame-0.144/src/mame/drivers/blockade.c mame-0.145/src/mame/drivers/blockade.c --- mame-0.144/src/mame/drivers/blockade.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blockade.c 2012-02-06 21:30:39.000000000 +0000 @@ -485,10 +485,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(blockade) + MCFG_SCREEN_UPDATE_STATIC(blockade) MCFG_GFXDECODE(blockade) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/blockhl.c mame-0.145/src/mame/drivers/blockhl.c --- mame-0.144/src/mame/drivers/blockhl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/blockhl.c 2012-02-06 21:30:42.000000000 +0000 @@ -236,10 +236,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(blockhl) + MCFG_SCREEN_UPDATE_STATIC(blockhl) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/blockout.c mame-0.145/src/mame/drivers/blockout.c --- mame-0.144/src/mame/drivers/blockout.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blockout.c 2012-02-06 21:30:40.000000000 +0000 @@ -125,6 +125,26 @@ AM_RANGE(0x280200, 0x2805ff) AM_RAM_WRITE(blockout_paletteram_w) AM_BASE_MEMBER(blockout_state, m_paletteram) ADDRESS_MAP_END +static ADDRESS_MAP_START( agress_map, AS_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM + AM_RANGE(0x100000, 0x100001) AM_READ_PORT("P1") + AM_RANGE(0x100002, 0x100003) AM_READ_PORT("P2") + AM_RANGE(0x100004, 0x100005) AM_READ_PORT("SYSTEM") + AM_RANGE(0x100006, 0x100007) AM_READ_PORT("DSW1") + AM_RANGE(0x100008, 0x100009) AM_READ_PORT("DSW2") + AM_RANGE(0x100010, 0x100011) AM_WRITE(blockout_irq6_ack_w) + AM_RANGE(0x100012, 0x100013) AM_WRITE(blockout_irq5_ack_w) + AM_RANGE(0x100014, 0x100015) AM_WRITE(blockout_sound_command_w) + AM_RANGE(0x100016, 0x100017) AM_WRITENOP /* don't know, maybe reset sound CPU */ + AM_RANGE(0x180000, 0x1bffff) AM_RAM_WRITE(blockout_videoram_w) AM_BASE_MEMBER(blockout_state, m_videoram) + AM_RANGE(0x1d4000, 0x1dffff) AM_RAM /* work RAM */ + AM_RANGE(0x1f4000, 0x1fffff) AM_RAM /* work RAM */ + AM_RANGE(0x200000, 0x203fff) AM_RAM AM_BASE_MEMBER(blockout_state, m_frontvideoram) AM_MIRROR(0x004000) // agress checks at F3A that this is mirrored, blockout glitches if you do it to it + AM_RANGE(0x208000, 0x21ffff) AM_RAM /* ??? */ + AM_RANGE(0x280002, 0x280003) AM_WRITE(blockout_frontcolor_w) + AM_RANGE(0x280200, 0x2805ff) AM_RAM_WRITE(blockout_paletteram_w) AM_BASE_MEMBER(blockout_state, m_paletteram) +ADDRESS_MAP_END + static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM @@ -307,10 +327,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 247) - MCFG_SCREEN_UPDATE(blockout) + MCFG_SCREEN_UPDATE_STATIC(blockout) MCFG_PALETTE_LENGTH(513) @@ -329,7 +348,10 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) MACHINE_CONFIG_END - +static MACHINE_CONFIG_DERIVED( agress, blockout ) + MCFG_CPU_MODIFY( "maincpu" ) + MCFG_CPU_PROGRAM_MAP(agress_map) +MACHINE_CONFIG_END /************************************* * @@ -423,5 +445,5 @@ GAME( 1989, blockout, 0, blockout, blockout, 0, ROT0, "Technos Japan / California Dreams", "Block Out (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1989, blockout2,blockout, blockout, blockout, 0, ROT0, "Technos Japan / California Dreams", "Block Out (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1989, blockoutj,blockout, blockout, blockoutj,0, ROT0, "Technos Japan / California Dreams", "Block Out (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1991, agress, 0, blockout, agress, 0, ROT0, "Palco", "Agress", GAME_SUPPORTS_SAVE ) -GAME( 2003, agressb, agress, blockout, agress, 0, ROT0, "bootleg", "Agress (English bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1991, agress, 0, agress, agress, 0, ROT0, "Palco", "Agress", GAME_SUPPORTS_SAVE ) +GAME( 2003, agressb, agress, agress, agress, 0, ROT0, "bootleg", "Agress (English bootleg)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/bloodbro.c mame-0.145/src/mame/drivers/bloodbro.c --- mame-0.144/src/mame/drivers/bloodbro.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bloodbro.c 2012-02-06 21:30:36.000000000 +0000 @@ -435,10 +435,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.39) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bloodbro) + MCFG_SCREEN_UPDATE_STATIC(bloodbro) MCFG_GFXDECODE(bloodbro) MCFG_PALETTE_LENGTH(2048) @@ -459,7 +458,7 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(weststry) + MCFG_SCREEN_UPDATE_STATIC(weststry) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( skysmash, bloodbro ) @@ -468,7 +467,7 @@ MCFG_CPU_VBLANK_INT("screen", irq2_line_hold) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(skysmash) + MCFG_SCREEN_UPDATE_STATIC(skysmash) MACHINE_CONFIG_END /* ROMs */ diff -Nru mame-0.144/src/mame/drivers/blstroid.c mame-0.145/src/mame/drivers/blstroid.c --- mame-0.144/src/mame/drivers/blstroid.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/blstroid.c 2012-02-06 21:30:40.000000000 +0000 @@ -218,11 +218,10 @@ MCFG_PALETTE_LENGTH(512) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 320*2, 262, 0, 240) - MCFG_SCREEN_UPDATE(blstroid) + MCFG_SCREEN_UPDATE_STATIC(blstroid) MCFG_VIDEO_START(blstroid) diff -Nru mame-0.144/src/mame/drivers/blueprnt.c mame-0.145/src/mame/drivers/blueprnt.c --- mame-0.144/src/mame/drivers/blueprnt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/blueprnt.c 2012-02-06 21:30:40.000000000 +0000 @@ -315,10 +315,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(blueprnt) + MCFG_SCREEN_UPDATE_STATIC(blueprnt) MCFG_GFXDECODE(blueprnt) MCFG_PALETTE_LENGTH(128*4+8) diff -Nru mame-0.144/src/mame/drivers/bmcbowl.c mame-0.145/src/mame/drivers/bmcbowl.c --- mame-0.144/src/mame/drivers/bmcbowl.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/bmcbowl.c 2012-02-06 21:30:41.000000000 +0000 @@ -131,16 +131,16 @@ { } -static SCREEN_UPDATE( bmcbowl ) +static SCREEN_UPDATE_IND16( bmcbowl ) { - bmcbowl_state *state = screen->machine().driver_data(); + bmcbowl_state *state = screen.machine().driver_data(); /* 280x230,4 bitmap layers, 8bpp, missing scroll and priorities (maybe fixed ones) */ int x,y,z,pixdat; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); z=0; for (y=0;y<230;y++) @@ -150,30 +150,30 @@ pixdat = state->m_vid2[0x8000+z]; if(pixdat&0xff) - *BITMAP_ADDR16(bitmap, y, x+1) = (pixdat&0xff); + bitmap.pix16(y, x+1) = (pixdat&0xff); if(pixdat>>8) - *BITMAP_ADDR16(bitmap, y, x) = (pixdat>>8); + bitmap.pix16(y, x) = (pixdat>>8); pixdat = state->m_vid2[z]; if(pixdat&0xff) - *BITMAP_ADDR16(bitmap, y, x+1) = (pixdat&0xff); + bitmap.pix16(y, x+1) = (pixdat&0xff); if(pixdat>>8) - *BITMAP_ADDR16(bitmap, y, x) = (pixdat>>8); + bitmap.pix16(y, x) = (pixdat>>8); pixdat = state->m_vid1[0x8000+z]; if(pixdat&0xff) - *BITMAP_ADDR16(bitmap, y, x+1) = (pixdat&0xff); + bitmap.pix16(y, x+1) = (pixdat&0xff); if(pixdat>>8) - *BITMAP_ADDR16(bitmap, y, x) = (pixdat>>8); + bitmap.pix16(y, x) = (pixdat>>8); pixdat = state->m_vid1[z]; if(pixdat&0xff) - *BITMAP_ADDR16(bitmap, y, x+1) = (pixdat&0xff); + bitmap.pix16(y, x+1) = (pixdat&0xff); if(pixdat>>8) - *BITMAP_ADDR16(bitmap, y, x) = (pixdat>>8); + bitmap.pix16(y, x) = (pixdat>>8); z++; } @@ -495,10 +495,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(35*8, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 0*8, 29*8-1) - MCFG_SCREEN_UPDATE(bmcbowl) + MCFG_SCREEN_UPDATE_STATIC(bmcbowl) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/bmcpokr.c mame-0.145/src/mame/drivers/bmcpokr.c --- mame-0.144/src/mame/drivers/bmcpokr.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/bmcpokr.c 2012-02-06 21:30:33.000000000 +0000 @@ -0,0 +1,235 @@ +/* + + similar to koftball.c? + + +An (unknown) gambling / poker game with sub-games +BMC 1999 + +PCB Layout +---------- + +BMC-A81212 +|---------------------------------------| +| CH-A-401 CH-M-301 CH-M-701 | +|M11B416256A UM3567 | +|42MHz CH-M-201 CH-M-101 M6295 | +| VDB40817 1| +| HM86171-80 VOL 0| +| SYA70521 W| +| LM324 7805 A| +|DSW1 Y| +| 68000 TDA2003 | +|DSW2 CH-M-505 CH-M-605 | +| 6264 6264 2| +|DSW3 CPLD 74HC132 74LS05 2| +| 555 W| +|DSW4 A| +| BATT SW JAMMA Y| +|---------------------------------------| +Notes: + RAM - M11B416256, 6264(x2) + VDB40817/SYA70521 - Unknown QFP100 + CPLD - unknown PLCC44 chip labelled 'BMC B816140' + BATT - 5.5 volt 0.047F super cap + 68000 @10.50MHz (42/4) + M6295 @1.05MHz (42/40) + UM3567 @3.50MHz (42/12) + HSync - 15.440kHz + VSync - 58.935Hz + +*/ + +#include "emu.h" +#include "cpu/m68000/m68000.h" + +class bmcpokr_state : public driver_device +{ +public: + bmcpokr_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } + + required_device m_maincpu; +}; + + + +static ADDRESS_MAP_START( bmcpokr_mem, AS_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM +ADDRESS_MAP_END + +static INPUT_PORTS_START( bmcpokr ) + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x00, "DSW1:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW1:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW1:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW1:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW1:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW1:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW1:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW1:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x00, "DSW2:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW2:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW2:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW2:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW2:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW2:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW2:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW2:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW3") + PORT_DIPNAME( 0x01, 0x00, "DSW3:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW3:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW3:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW3:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW3:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW3:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW3:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW3:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW4") + PORT_DIPNAME( 0x01, 0x00, "DSW4:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW4:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW4:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW4:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW4:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW4:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW4:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW4:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + +INPUT_PORTS_END + + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + RGN_FRAC(1,2), + 8, + { 0, 1, 2, 3, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3 }, + { 0, 4, 8, 12, 16, 20, 24, 28 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 +}; + +static GFXDECODE_START( bmcpokr ) + GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 ) +GFXDECODE_END + +SCREEN_UPDATE_IND16( bmcpokr ) +{ + return 0; +} + +VIDEO_START(bmcpokr) +{ + +} + + +static MACHINE_CONFIG_START( bmcpokr, bmcpokr_state ) + MCFG_CPU_ADD("maincpu", M68000, XTAL_42MHz/4) + MCFG_CPU_PROGRAM_MAP(bmcpokr_mem) + //MCFG_CPU_VBLANK_INT("screen",irq3_line_hold) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_UPDATE_STATIC(bmcpokr) + + MCFG_GFXDECODE(bmcpokr) + + MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) + MCFG_PALETTE_LENGTH(256) + + MCFG_VIDEO_START(bmcpokr) +MACHINE_CONFIG_END + + +ROM_START( bmcpokr ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "ch-m-505.u12", 0x000001, 0x20000, CRC(d6effaf1) SHA1(b446d3beb3393bc8b3bcd0d543945e6fb6a375b9) ) + ROM_LOAD16_BYTE( "ch-m-605.u13", 0x000000, 0x20000, CRC(c5c3fcd1) SHA1(b77fef734c290d52ae877a24bb3ee42b24eb5cb8) ) + + ROM_REGION( 0x200000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "ch-m-101.u39", 0x000000, 0x80000, CRC(f4b82e0a) SHA1(f545c6ab1375518de06900f02a0eb5af1edeeb47) ) + ROM_LOAD16_BYTE( "ch-m-201.u40", 0x000001, 0x80000, CRC(520571cb) SHA1(5c006f10d6192939003f8197e8bb64908a826fc1) ) + ROM_LOAD16_BYTE( "ch-m-301.u45", 0x100000, 0x80000, CRC(daba09c3) SHA1(e5d2f92b63288c36faa367a3306d1999264843e8) ) + ROM_LOAD16_BYTE( "ch-a-401.u29", 0x100001, 0x80000, CRC(5ee5d39f) SHA1(f6881aa5c755831d885f7adf35a5a094f7302205) ) + + ROM_REGION( 0x040000, "oki", 0 ) /* Samples */ + ROM_LOAD( "ch-m-701.u10", 0x00000, 0x40000, CRC(e01be644) SHA1(b68682786d5b40cb5672cfd7f717adcfb8fac7d3) ) +ROM_END + + + + +GAME( 1999, bmcpokr, 0, bmcpokr, bmcpokr, 0, ROT0, "BMC", "Unknown BMC Poker Game", GAME_NOT_WORKING | GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/bnstars.c mame-0.145/src/mame/drivers/bnstars.c --- mame-0.144/src/mame/drivers/bnstars.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bnstars.c 2012-02-06 21:30:42.000000000 +0000 @@ -89,7 +89,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/v60/v60.h" -#include "deprecat.h" #include "sound/ymf271.h" #include "rendlay.h" #include "machine/jalcrpt.h" @@ -151,14 +150,14 @@ { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_tx0_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_tx_tilemap[0],offset/2); + state->m_ms32_tx_tilemap[0]->mark_tile_dirty(offset/2); } static WRITE32_HANDLER( ms32_tx1_ram_w ) { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_tx1_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_tx_tilemap[1],offset/2); + state->m_ms32_tx_tilemap[1]->mark_tile_dirty(offset/2); } /* BG Layers */ @@ -189,19 +188,19 @@ { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_bg0_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_bg_tilemap[0],offset/2); + state->m_ms32_bg_tilemap[0]->mark_tile_dirty(offset/2); } static WRITE32_HANDLER( ms32_bg1_ram_w ) { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_bg1_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_bg_tilemap[1],offset/2); + state->m_ms32_bg_tilemap[1]->mark_tile_dirty(offset/2); } /* ROZ Layers */ -static void draw_roz(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority, int chip) +static void draw_roz(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority, int chip) { bnstars_state *state = machine.driver_data(); /* TODO: registers 0x40/4 / 0x44/4 and 0x50/4 / 0x54/4 are used, meaning unknown */ @@ -214,11 +213,11 @@ rectangle my_clip; int y,maxy; - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; - y = cliprect->min_y; - maxy = cliprect->max_y; + y = cliprect.min_y; + maxy = cliprect.max_y; while (y <= maxy) { @@ -246,7 +245,7 @@ if (incxx & 0x10000) incxx |= ~0x1ffff; if (incxy & 0x10000) incxy |= ~0x1ffff; - tilemap_draw_roz(bitmap, &my_clip, state->m_ms32_roz_tilemap, + state->m_ms32_roz_tilemap->draw_roz(bitmap, &my_clip, (start2x+startx+offsx)<<16, (start2y+starty+offsy)<<16, incxx<<8, incxy<<8, 0, 0, 1, // Wrap @@ -278,7 +277,7 @@ if (incyy & 0x10000) incyy |= ~0x1ffff; if (incyx & 0x10000) incyx |= ~0x1ffff; - tilemap_draw_roz(bitmap, cliprect, state->m_ms32_roz_tilemap[chip], + state->m_ms32_roz_tilemap[chip]->draw_roz(bitmap, cliprect, (startx+offsx)<<16, (starty+offsy)<<16, incxx<<8, incxy<<8, incyx<<8, incyy<<8, 1, // Wrap @@ -313,14 +312,14 @@ { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_roz0_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_roz_tilemap[0],offset/2); + state->m_ms32_roz_tilemap[0]->mark_tile_dirty(offset/2); } static WRITE32_HANDLER( ms32_roz1_ram_w ) { bnstars_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_ms32_roz1_ram[offset]); - tilemap_mark_tile_dirty(state->m_ms32_roz_tilemap[1],offset/2); + state->m_ms32_roz_tilemap[1]->mark_tile_dirty(offset/2); } @@ -352,7 +351,7 @@ /* SPRITES based on tetrisp2 for now, readd priority bits later */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 *sprram_top, size_t sprram_size, int region) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 *sprram_top, size_t sprram_size, int region) { bnstars_state *state = machine.driver_data(); /*************************************************************************** @@ -492,18 +491,18 @@ bnstars_state *state = machine.driver_data(); state->m_ms32_tx_tilemap[0] = tilemap_create(machine, get_ms32_tx0_tile_info,tilemap_scan_rows, 8, 8,64,64); state->m_ms32_tx_tilemap[1] = tilemap_create(machine, get_ms32_tx1_tile_info,tilemap_scan_rows, 8, 8,64,64); - tilemap_set_transparent_pen(state->m_ms32_tx_tilemap[0],0); - tilemap_set_transparent_pen(state->m_ms32_tx_tilemap[1],0); + state->m_ms32_tx_tilemap[0]->set_transparent_pen(0); + state->m_ms32_tx_tilemap[1]->set_transparent_pen(0); state->m_ms32_bg_tilemap[0] = tilemap_create(machine, get_ms32_bg0_tile_info,tilemap_scan_rows,16,16,64,64); state->m_ms32_bg_tilemap[1] = tilemap_create(machine, get_ms32_bg1_tile_info,tilemap_scan_rows,16,16,64,64); - tilemap_set_transparent_pen(state->m_ms32_bg_tilemap[0],0); - tilemap_set_transparent_pen(state->m_ms32_bg_tilemap[1],0); + state->m_ms32_bg_tilemap[0]->set_transparent_pen(0); + state->m_ms32_bg_tilemap[1]->set_transparent_pen(0); state->m_ms32_roz_tilemap[0] = tilemap_create(machine, get_ms32_roz0_tile_info,tilemap_scan_rows,16,16,128,128); state->m_ms32_roz_tilemap[1] = tilemap_create(machine, get_ms32_roz1_tile_info,tilemap_scan_rows,16,16,128,128); - tilemap_set_transparent_pen(state->m_ms32_roz_tilemap[0],0); - tilemap_set_transparent_pen(state->m_ms32_roz_tilemap[1],0); + state->m_ms32_roz_tilemap[0]->set_transparent_pen(0); + state->m_ms32_roz_tilemap[1]->set_transparent_pen(0); } @@ -512,49 +511,51 @@ -static SCREEN_UPDATE(bnstars) +static SCREEN_UPDATE_IND16(bnstars_left) { - bnstars_state *state = screen->machine().driver_data(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + bnstars_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - if (screen==left_screen) - { - bitmap_fill(bitmap,cliprect,0); /* bg color */ + bitmap.fill(0, cliprect); /* bg color */ - tilemap_set_scrollx(state->m_ms32_bg_tilemap[0], 0, state->m_ms32_bg0_scroll[0x00/4] + state->m_ms32_bg0_scroll[0x08/4] + 0x10 ); - tilemap_set_scrolly(state->m_ms32_bg_tilemap[0], 0, state->m_ms32_bg0_scroll[0x0c/4] + state->m_ms32_bg0_scroll[0x14/4] ); - tilemap_draw(bitmap,cliprect,state->m_ms32_bg_tilemap[0],0,1); + state->m_ms32_bg_tilemap[0]->set_scrollx(0, state->m_ms32_bg0_scroll[0x00/4] + state->m_ms32_bg0_scroll[0x08/4] + 0x10 ); + state->m_ms32_bg_tilemap[0]->set_scrolly(0, state->m_ms32_bg0_scroll[0x0c/4] + state->m_ms32_bg0_scroll[0x14/4] ); + state->m_ms32_bg_tilemap[0]->draw(bitmap, cliprect, 0,1); - draw_roz(screen->machine(),bitmap,cliprect,2,0); + draw_roz(screen.machine(),bitmap,cliprect,2,0); - tilemap_set_scrollx(state->m_ms32_tx_tilemap[0], 0, state->m_ms32_tx0_scroll[0x00/4] + state->m_ms32_tx0_scroll[0x08/4] + 0x18); - tilemap_set_scrolly(state->m_ms32_tx_tilemap[0], 0, state->m_ms32_tx0_scroll[0x0c/4] + state->m_ms32_tx0_scroll[0x14/4]); - tilemap_draw(bitmap,cliprect,state->m_ms32_tx_tilemap[0],0,4); + state->m_ms32_tx_tilemap[0]->set_scrollx(0, state->m_ms32_tx0_scroll[0x00/4] + state->m_ms32_tx0_scroll[0x08/4] + 0x18); + state->m_ms32_tx_tilemap[0]->set_scrolly(0, state->m_ms32_tx0_scroll[0x0c/4] + state->m_ms32_tx0_scroll[0x14/4]); + state->m_ms32_tx_tilemap[0]->draw(bitmap, cliprect, 0,4); - draw_sprites(screen->machine(),bitmap,cliprect, state->m_ms32_spram, 0x20000, 0); - } - else if (screen == right_screen) - { - bitmap_fill(bitmap,cliprect,0x8000+0); /* bg color */ + draw_sprites(screen.machine(),bitmap,cliprect, state->m_ms32_spram, 0x20000, 0); + + return 0; +} +static SCREEN_UPDATE_IND16(bnstars_right) +{ + bnstars_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_ms32_bg_tilemap[1], 0, state->m_ms32_bg1_scroll[0x00/4] + state->m_ms32_bg1_scroll[0x08/4] + 0x10 ); - tilemap_set_scrolly(state->m_ms32_bg_tilemap[1], 0, state->m_ms32_bg1_scroll[0x0c/4] + state->m_ms32_bg1_scroll[0x14/4] ); - tilemap_draw(bitmap,cliprect,state->m_ms32_bg_tilemap[1],0,1); + screen.machine().priority_bitmap.fill(0, cliprect); - draw_roz(screen->machine(),bitmap,cliprect,2,1); + bitmap.fill(0x8000+0, cliprect); /* bg color */ - tilemap_set_scrollx(state->m_ms32_tx_tilemap[1], 0, state->m_ms32_tx1_scroll[0x00/4] + state->m_ms32_tx1_scroll[0x08/4] + 0x18); - tilemap_set_scrolly(state->m_ms32_tx_tilemap[1], 0, state->m_ms32_tx1_scroll[0x0c/4] + state->m_ms32_tx1_scroll[0x14/4]); - tilemap_draw(bitmap,cliprect,state->m_ms32_tx_tilemap[1],0,4); - draw_sprites(screen->machine(),bitmap,cliprect, state->m_ms32_spram+(0x20000/4), 0x20000, 4); - } + state->m_ms32_bg_tilemap[1]->set_scrollx(0, state->m_ms32_bg1_scroll[0x00/4] + state->m_ms32_bg1_scroll[0x08/4] + 0x10 ); + state->m_ms32_bg_tilemap[1]->set_scrolly(0, state->m_ms32_bg1_scroll[0x0c/4] + state->m_ms32_bg1_scroll[0x14/4] ); + state->m_ms32_bg_tilemap[1]->draw(bitmap, cliprect, 0,1); + + draw_roz(screen.machine(),bitmap,cliprect,2,1); + + state->m_ms32_tx_tilemap[1]->set_scrollx(0, state->m_ms32_tx1_scroll[0x00/4] + state->m_ms32_tx1_scroll[0x08/4] + 0x18); + state->m_ms32_tx_tilemap[1]->set_scrolly(0, state->m_ms32_tx1_scroll[0x0c/4] + state->m_ms32_tx1_scroll[0x14/4]); + state->m_ms32_tx_tilemap[1]->draw(bitmap, cliprect, 0,4); + + draw_sprites(screen.machine(),bitmap,cliprect, state->m_ms32_spram+(0x20000/4), 0x20000, 4); return 0; } @@ -1202,9 +1203,9 @@ /* sprites are contained in 256x256 "tiles" */ -static GFXLAYOUT_RAW( spritelayout, 8, 256, 256, 256*8, 256*256*8 ) -static GFXLAYOUT_RAW( bglayout, 8, 16, 16, 16*8, 16*16*8 ) -static GFXLAYOUT_RAW( txlayout, 8, 8, 8, 8*8, 8*8*8 ) +static GFXLAYOUT_RAW( spritelayout, 256, 256, 256*8, 256*256*8 ) +static GFXLAYOUT_RAW( bglayout, 16, 16, 16*8, 16*16*8 ) +static GFXLAYOUT_RAW( txlayout, 8, 8, 8*8, 8*8*8 ) static GFXDECODE_START( bnstars ) GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0x0000, 0x10 ) @@ -1332,11 +1333,12 @@ cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); } - -static INTERRUPT_GEN(ms32_interrupt) +/* TODO: fix this arrangement (derived from old deprecat lib) */ +static TIMER_DEVICE_CALLBACK(ms32_interrupt) { - if( cpu_getiloops(device) == 0 ) irq_raise(device->machine(), 10); - if( cpu_getiloops(device) == 1 ) irq_raise(device->machine(), 9); + int scanline = param; + if( scanline == 0 ) irq_raise(timer.machine(), 10); + if( scanline == 8) irq_raise(timer.machine(), 9); /* hayaosi1 needs at least 12 IRQ 0 per frame to work (see code at FFE02289) kirarast needs it too, at least 8 per frame, but waits for a variable amount 47pi2 needs ?? per frame (otherwise it hangs when you lose) @@ -1345,7 +1347,7 @@ desertwr p47aces */ - if( cpu_getiloops(device) >= 3 && cpu_getiloops(device) <= 32 ) irq_raise(device->machine(), 0); + if( (scanline % 8) == 0 && scanline <= 224 ) irq_raise(timer.machine(), 0); } static MACHINE_RESET( ms32 ) @@ -1359,7 +1361,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", V70, 20000000) // 20MHz MCFG_CPU_PROGRAM_MAP(bnstars_map) - MCFG_CPU_VBLANK_INT_HACK(ms32_interrupt,32) + MCFG_TIMER_ADD_SCANLINE("scantimer", ms32_interrupt, "lscreen", 0, 1) // MCFG_CPU_ADD("audiocpu", Z80, 4000000) // MCFG_CPU_PROGRAM_MAP(bnstars_z80_map) @@ -1374,20 +1376,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(40*8, 28*8) + MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(bnstars) + MCFG_SCREEN_UPDATE_STATIC(bnstars_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(40*8, 28*8) + MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(bnstars) + MCFG_SCREEN_UPDATE_STATIC(bnstars_right) MCFG_VIDEO_START(bnstars) @@ -1413,7 +1413,7 @@ ROM_LOAD32_BYTE( "mb-93142.39", 0x000000, 0x80000, CRC(56b98539) SHA1(5eb0e77729b31e6a100c1b43813a39fea57bedee) ) /* Sprites - shared by both screens? */ - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr96004-01.20", 0x0000000, 0x200000, CRC(3366d104) SHA1(2de0cabe2ead777b5b02cade7f2003ef7f90b75b) ) ROM_LOAD32_WORD( "mr96004-02.28", 0x0000002, 0x200000, CRC(ad556664) SHA1(4b36f8d8d9efa37cf515af41d14433e7eafa27a2) ) ROM_LOAD32_WORD( "mr96004-03.21", 0x0400000, 0x200000, CRC(b399e2b1) SHA1(9b6a00a219db8d66dcf592160b7b5f7a86b8f0c9) ) @@ -1424,27 +1424,27 @@ ROM_LOAD32_WORD( "mr96004-08.31", 0x0c00002, 0x200000, CRC(f6df27b2) SHA1(60590976020d86bdccd4eaf57b349ea31bec6830) ) /* Roz Tiles #1 (Screen 1) */ - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr96004-09.1", 0x000000, 0x400000, CRC(7f8ea9f0) SHA1(f1fe682dcb884f1aa4a5536e17ab94157a99f519) ) /* Roz Tiles #2 (Screen 2) */ - ROM_REGION( 0x400000, "gfx3", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx3", 0 ) /* roz tiles */ ROM_LOAD( "mr96004-09.7", 0x000000, 0x400000, CRC(7f8ea9f0) SHA1(f1fe682dcb884f1aa4a5536e17ab94157a99f519) ) /* BG Tiles #1 (Screen 1?) */ - ROM_REGION( 0x200000, "gfx4", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx4", 0 ) /* bg tiles */ ROM_LOAD( "mr96004-11.11", 0x000000, 0x200000, CRC(e6da552c) SHA1(69a5af3015883793c7d1343243ccae23db9ef77c) ) /* TX Tiles #1 (Screen 1?) */ - ROM_REGION( 0x080000, "gfx5", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx5", 0 ) /* tx tiles */ ROM_LOAD( "vsjanshi6.5", 0x000000, 0x080000, CRC(fdbbac21) SHA1(c77d852e53126cc8ebfe1e79d1134e42b54d1aab) ) /* BG Tiles #2 (Screen 2?) */ - ROM_REGION( 0x200000, "gfx6", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx6", 0 ) /* bg tiles */ ROM_LOAD( "mr96004-11.13", 0x000000, 0x200000, CRC(e6da552c) SHA1(69a5af3015883793c7d1343243ccae23db9ef77c) ) /* TX Tiles #2 (Screen 2?) */ - ROM_REGION( 0x080000, "gfx7", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx7", 0 ) /* tx tiles */ ROM_LOAD( "vsjanshi5.6", 0x000000, 0x080000, CRC(fdbbac21) SHA1(c77d852e53126cc8ebfe1e79d1134e42b54d1aab) ) /* Sound Program (one, driving both screen sound) */ @@ -1475,4 +1475,4 @@ memory_set_bankptr(machine, "bank1", machine.region("maincpu")->base()); } -GAME( 1997, bnstars1, 0, bnstars, bnstars, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars", GAME_NO_SOUND ) +GAME( 1997, bnstars1, 0, bnstars, bnstars, bnstars, ROT0, "Jaleco", "Vs. Janshi Brandnew Stars", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/bntyhunt.c mame-0.145/src/mame/drivers/bntyhunt.c --- mame-0.144/src/mame/drivers/bntyhunt.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/bntyhunt.c 2012-02-06 21:30:34.000000000 +0000 @@ -0,0 +1,76 @@ +/* Bounty Hunter + + PC hardware.. no dumps of the bios roms tho + +*/ + +#define ADDRESS_MAP_MODERN + +#include "emu.h" +#include "cpu/i386/i386.h" + + +class bntyhunt_state : public driver_device +{ +public: + bntyhunt_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); +}; + + +void bntyhunt_state::video_start() +{ +} + +UINT32 bntyhunt_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +static ADDRESS_MAP_START( bntyhunt_map, AS_PROGRAM, 32, bntyhunt_state ) + AM_RANGE(0x00000000, 0x0001ffff) AM_ROM +ADDRESS_MAP_END + +static INPUT_PORTS_START( bntyhunt ) +INPUT_PORTS_END + + +static MACHINE_CONFIG_START( bntyhunt, bntyhunt_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", PENTIUM, 2000000000) /* Probably a Pentium or higher .. ?? Mhz*/ + MCFG_CPU_PROGRAM_MAP(bntyhunt_map) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_UPDATE_DRIVER(bntyhunt_state, screen_update) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) + + MCFG_PALETTE_LENGTH(0x100) +MACHINE_CONFIG_END + + +ROM_START(bntyhunt) + ROM_REGION32_LE(0x20000, "maincpu", 0) /* motherboard bios */ + ROM_LOAD("bntyhunt.pcbios", 0x000000, 0x10000, NO_DUMP ) + + DISK_REGION( "disks" ) + DISK_IMAGE( "bntyhunt", 0, SHA1(f5c737aaf3da5b57de3fb6bb5dfb85f8f3d4b1b1) ) +ROM_END + + +GAME( 200?, bntyhunt, 0, bntyhunt, bntyhunt, 0, ROT0, "GCTech Co., LTD", "Bounty Hunter (GCTech Co., LTD)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/bogeyman.c mame-0.145/src/mame/drivers/bogeyman.c --- mame-0.144/src/mame/drivers/bogeyman.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bogeyman.c 2012-02-06 21:30:34.000000000 +0000 @@ -227,7 +227,7 @@ if((data & 1) != (state->m_colbank & 1)) { state->m_colbank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } } @@ -257,10 +257,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(bogeyman) + MCFG_SCREEN_UPDATE_STATIC(bogeyman) MCFG_GFXDECODE(bogeyman) MCFG_PALETTE_LENGTH(16+256) diff -Nru mame-0.144/src/mame/drivers/bombjack.c mame-0.145/src/mame/drivers/bombjack.c --- mame-0.144/src/mame/drivers/bombjack.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bombjack.c 2012-02-06 21:30:33.000000000 +0000 @@ -130,6 +130,13 @@ * *************************************/ +static WRITE8_HANDLER( irq_mask_w ) +{ + bombjack_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x8fff) AM_RAM @@ -140,7 +147,7 @@ AM_RANGE(0x9c00, 0x9cff) AM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x9e00, 0x9e00) AM_WRITE(bombjack_background_w) AM_RANGE(0xb000, 0xb000) AM_READ_PORT("P1") - AM_RANGE(0xb000, 0xb000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xb000, 0xb000) AM_WRITE(irq_mask_w) AM_RANGE(0xb001, 0xb001) AM_READ_PORT("P2") AM_RANGE(0xb002, 0xb002) AM_READ_PORT("SYSTEM") AM_RANGE(0xb003, 0xb003) AM_READNOP /* watchdog reset? */ @@ -344,14 +351,22 @@ } +static INTERRUPT_GEN( vblank_irq ) +{ + bombjack_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( bombjack, bombjack_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz */ + MCFG_CPU_ADD("maincpu", Z80, XTAL_4MHz) /* Confirmed from PCB */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) - MCFG_CPU_ADD("audiocpu", Z80, 3072000) /* 3.072 MHz????? */ + MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz/4) /* Confirmed from PCB */ MCFG_CPU_PROGRAM_MAP(audio_map) MCFG_CPU_IO_MAP(audio_io_map) MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) @@ -363,10 +378,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bombjack) + MCFG_SCREEN_UPDATE_STATIC(bombjack) MCFG_GFXDECODE(bombjack) MCFG_PALETTE_LENGTH(128) @@ -376,13 +390,13 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ay1", AY8910, 1500000) + MCFG_SOUND_ADD("ay1", AY8910, XTAL_12MHz/8) /* Confirmed from PCB */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.13) - MCFG_SOUND_ADD("ay2", AY8910, 1500000) + MCFG_SOUND_ADD("ay2", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.13) - MCFG_SOUND_ADD("ay3", AY8910, 1500000) + MCFG_SOUND_ADD("ay3", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.13) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/boogwing.c mame-0.145/src/mame/drivers/boogwing.c --- mame-0.144/src/mame/drivers/boogwing.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/boogwing.c 2012-02-06 21:30:34.000000000 +0000 @@ -88,6 +88,7 @@ #include "sound/okim6295.h" #include "video/deco16ic.h" #include "video/decocomn.h" +#include "video/decospr.h" static ADDRESS_MAP_START( boogwing_map, AS_PROGRAM, 16 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM @@ -354,19 +355,26 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(boogwing) + MCFG_SCREEN_UPDATE_STATIC(boogwing) MCFG_PALETTE_LENGTH(2048) MCFG_GFXDECODE(boogwing) + MCFG_VIDEO_START(boogwing) + MCFG_DECOCOMN_ADD("deco_common", boogwing_decocomn_intf) MCFG_DECO16IC_ADD("tilegen1", boogwing_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", boogwing_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + + MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 4); + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/bottom9.c mame-0.145/src/mame/drivers/bottom9.c --- mame-0.144/src/mame/drivers/bottom9.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bottom9.c 2012-02-06 21:30:40.000000000 +0000 @@ -380,10 +380,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(bottom9) + MCFG_SCREEN_UPDATE_STATIC(bottom9) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/boxer.c mame-0.145/src/mame/drivers/boxer.c --- mame-0.144/src/mame/drivers/boxer.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/boxer.c 2012-02-06 21:30:42.000000000 +0000 @@ -109,7 +109,7 @@ palette_set_color(machine,3, MAKE_RGB(0x00,0x00,0x00)); } -static void draw_boxer( running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect ) +static void draw_boxer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { boxer_state *state = machine.driver_data(); int n; @@ -157,12 +157,12 @@ } -static SCREEN_UPDATE( boxer ) +static SCREEN_UPDATE_IND16( boxer ) { - boxer_state *state = screen->machine().driver_data(); + boxer_state *state = screen.machine().driver_data(); int i, j; - bitmap_fill(bitmap, cliprect, 1); + bitmap.fill(1, cliprect); for (i = 0; i < 16; i++) { @@ -171,7 +171,7 @@ UINT8 code = state->m_tile_ram[32 * i + j]; drawgfx_transpen(bitmap, cliprect, - screen->machine().gfx[2], + screen.machine().gfx[2], code, 0, code & 0x40, code & 0x40, @@ -180,7 +180,7 @@ } } - draw_boxer(screen->machine(), bitmap, cliprect); + draw_boxer(screen.machine(), bitmap, cliprect); return 0; } @@ -447,10 +447,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(8, 247, 0, 239) - MCFG_SCREEN_UPDATE(boxer) + MCFG_SCREEN_UPDATE_STATIC(boxer) MCFG_GFXDECODE(boxer) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/brkthru.c mame-0.145/src/mame/drivers/brkthru.c --- mame-0.144/src/mame/drivers/brkthru.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/brkthru.c 2012-02-06 21:30:36.000000000 +0000 @@ -68,18 +68,27 @@ static WRITE8_HANDLER( brkthru_1803_w ) { brkthru_state *state = space->machine().driver_data(); + /* bit 0 = NMI enable */ - cpu_interrupt_enable(state->m_maincpu, ~data & 1); + state->m_nmi_mask = ~data & 1; + + if(data & 2) + device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); /* bit 1 = ? maybe IRQ acknowledge */ } + static WRITE8_HANDLER( darwin_0803_w ) { brkthru_state *state = space->machine().driver_data(); /* bit 0 = NMI enable */ - /*cpu_interrupt_enable(state->m_audiocpu, ~data & 1);*/ + state->m_nmi_mask = data & 1; logerror("0803 %02X\n",data); - cpu_interrupt_enable(state->m_maincpu, data & 1); + + if(data & 2) + device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); + + /* bit 1 = ? maybe IRQ acknowledge */ } @@ -93,8 +102,10 @@ static INPUT_CHANGED( coin_inserted ) { brkthru_state *state = field.machine().driver_data(); + /* coin insertion causes an IRQ */ - device_set_input_line(state->m_maincpu, 0, newval ? CLEAR_LINE : ASSERT_LINE); + if(oldval) + device_set_input_line(state->m_maincpu, 0, ASSERT_LINE); } @@ -384,12 +395,20 @@ state->m_flipscreen = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + brkthru_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( brkthru, brkthru_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/8) /* 1.5 MHz ? */ MCFG_CPU_PROGRAM_MAP(brkthru_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", M6809, MASTER_CLOCK/8) /* 1.5 MHz ? */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -404,8 +423,7 @@ /* not sure; assuming to be the same as darwin */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 384, 8, 248, 272, 8, 248) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(brkthru) + MCFG_SCREEN_UPDATE_STATIC(brkthru) MCFG_PALETTE_INIT(brkthru) MCFG_VIDEO_START(brkthru) @@ -430,7 +448,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/8) /* 1.5 MHz ? */ MCFG_CPU_PROGRAM_MAP(darwin_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", M6809, MASTER_CLOCK/8) /* 1.5 MHz ? */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -456,8 +474,7 @@ = 15.625kHz / (240 + 32) = 57.444855Hz tuned by Shingo SUZUKI(VSyncMAME Project) 2000/10/19 */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(brkthru) + MCFG_SCREEN_UPDATE_STATIC(brkthru) MCFG_PALETTE_INIT(brkthru) MCFG_VIDEO_START(brkthru) diff -Nru mame-0.144/src/mame/drivers/bsktball.c mame-0.145/src/mame/drivers/bsktball.c --- mame-0.144/src/mame/drivers/bsktball.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bsktball.c 2012-02-06 21:30:40.000000000 +0000 @@ -260,10 +260,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(bsktball) + MCFG_SCREEN_UPDATE_STATIC(bsktball) MCFG_GFXDECODE(bsktball) MCFG_PALETTE_LENGTH(2*4 + 4*4*4*4) diff -Nru mame-0.144/src/mame/drivers/btime.c mame-0.145/src/mame/drivers/btime.c --- mame-0.144/src/mame/drivers/btime.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/btime.c 2012-02-06 21:30:42.000000000 +0000 @@ -1499,9 +1499,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(HCLK, 384, 8, 248, 272, 8, 248) - MCFG_SCREEN_UPDATE(btime) + MCFG_SCREEN_UPDATE_STATIC(btime) MCFG_MACHINE_START(btime) MCFG_MACHINE_RESET(btime) @@ -1547,7 +1546,7 @@ MCFG_PALETTE_LENGTH(16) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(cookrace) + MCFG_SCREEN_UPDATE_STATIC(cookrace) MACHINE_CONFIG_END @@ -1565,7 +1564,7 @@ MCFG_PALETTE_INIT(lnc) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(lnc) + MCFG_SCREEN_UPDATE_STATIC(lnc) MACHINE_CONFIG_END @@ -1575,7 +1574,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(eggs) + MCFG_SCREEN_UPDATE_STATIC(eggs) MACHINE_CONFIG_END @@ -1602,7 +1601,7 @@ MCFG_VIDEO_START(bnj) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(bnj) + MCFG_SCREEN_UPDATE_STATIC(bnj) MACHINE_CONFIG_END @@ -1630,7 +1629,7 @@ MCFG_PALETTE_LENGTH(64) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(zoar) + MCFG_SCREEN_UPDATE_STATIC(zoar) MCFG_SOUND_REPLACE("ay1", AY8910, HCLK1) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) @@ -1656,7 +1655,7 @@ MCFG_PALETTE_LENGTH(32) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(disco) + MCFG_SCREEN_UPDATE_STATIC(disco) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/btoads.c mame-0.145/src/mame/drivers/btoads.c --- mame-0.144/src/mame/drivers/btoads.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/btoads.c 2012-02-06 21:30:39.000000000 +0000 @@ -304,7 +304,8 @@ "screen", /* the screen operated on */ VIDEO_CLOCK/2, /* pixel clock */ 1, /* pixels per clock */ - btoads_state::static_scanline_update, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + btoads_state::static_scanline_update, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ btoads_state::static_to_shiftreg, /* write to shiftreg function */ btoads_state::static_from_shiftreg /* read from shiftreg function */ @@ -335,9 +336,8 @@ MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 640, 0, 512, 257, 0, 224) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/bublbobl.c mame-0.145/src/mame/drivers/bublbobl.c --- mame-0.144/src/mame/drivers/bublbobl.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bublbobl.c 2012-02-06 21:30:36.000000000 +0000 @@ -784,9 +784,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MAIN_XTAL/4, 384, 0, 256, 264, 16, 240) - MCFG_SCREEN_UPDATE(bublbobl) + MCFG_SCREEN_UPDATE_STATIC(bublbobl) MCFG_GFXDECODE(bublbobl) MCFG_PALETTE_LENGTH(256) @@ -868,9 +867,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MAIN_XTAL/4, 384, 0, 256, 264, 16, 240) - MCFG_SCREEN_UPDATE(bublbobl) + MCFG_SCREEN_UPDATE_STATIC(bublbobl) MCFG_GFXDECODE(bublbobl) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/buggychl.c mame-0.145/src/mame/drivers/buggychl.c --- mame-0.144/src/mame/drivers/buggychl.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/buggychl.c 2012-02-06 21:30:41.000000000 +0000 @@ -415,10 +415,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(buggychl) + MCFG_SCREEN_UPDATE_STATIC(buggychl) MCFG_GFXDECODE(buggychl) MCFG_PALETTE_LENGTH(128+128) diff -Nru mame-0.144/src/mame/drivers/buster.c mame-0.145/src/mame/drivers/buster.c --- mame-0.144/src/mame/drivers/buster.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/buster.c 2012-02-06 21:30:41.000000000 +0000 @@ -26,10 +26,10 @@ { } -static SCREEN_UPDATE(buster) +static SCREEN_UPDATE_IND16(buster) { - buster_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + buster_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x0000; int y,x; @@ -335,10 +335,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(buster) + MCFG_SCREEN_UPDATE_STATIC(buster) MCFG_MC6845_ADD("crtc", MC6845, XTAL_3_579545MHz/4, mc6845_intf) //unknown clock / type MCFG_GFXDECODE(buster) diff -Nru mame-0.144/src/mame/drivers/bwidow.c mame-0.145/src/mame/drivers/bwidow.c --- mame-0.144/src/mame/drivers/bwidow.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/bwidow.c 2012-02-06 21:30:42.000000000 +0000 @@ -368,7 +368,7 @@ AM_RANGE(0x2800, 0x5fff) AM_ROM AM_RANGE(0x6000, 0x67ff) AM_DEVREADWRITE("pokey1", pokey_r, pokey_w) AM_RANGE(0x6800, 0x6fff) AM_DEVREADWRITE("pokey2", pokey_r, pokey_w) - AM_RANGE(0x7000, 0x7000) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x7000, 0x7000) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x7800, 0x7800) AM_READ_PORT("IN0") AM_RANGE(0x8000, 0x8000) AM_READ_PORT("IN3") AM_RANGE(0x8800, 0x8800) AM_READ_PORT("IN4") @@ -376,8 +376,8 @@ AM_RANGE(0x8840, 0x8840) AM_WRITE(avgdvg_go_w) AM_RANGE(0x8880, 0x8880) AM_WRITE(avgdvg_reset_w) AM_RANGE(0x88c0, 0x88c0) AM_WRITE(irq_ack_w) /* interrupt acknowledge */ - AM_RANGE(0x8900, 0x8900) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x8940, 0x897f) AM_DEVWRITE("earom", atari_vg_earom_w) + AM_RANGE(0x8900, 0x8900) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x8940, 0x897f) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) AM_RANGE(0x8980, 0x89ed) AM_WRITENOP /* watchdog clear */ AM_RANGE(0x9000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -388,14 +388,14 @@ AM_RANGE(0x0800, 0x0800) AM_READ_PORT("IN0") AM_RANGE(0x0900, 0x0907) AM_READ(spacduel_IN3_r) /* IN1 */ AM_RANGE(0x0905, 0x0906) AM_WRITENOP /* ignore? */ - AM_RANGE(0x0a00, 0x0a00) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x0a00, 0x0a00) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) // AM_RANGE(0x0c00, 0x0c00) AM_WRITE(coin_counter_w) /* coin out */ AM_RANGE(0x0c80, 0x0c80) AM_WRITE(avgdvg_go_w) AM_RANGE(0x0d00, 0x0d00) AM_WRITENOP /* watchdog clear */ AM_RANGE(0x0d80, 0x0d80) AM_WRITE(avgdvg_reset_w) AM_RANGE(0x0e00, 0x0e00) AM_WRITE(irq_ack_w) /* interrupt acknowledge */ - AM_RANGE(0x0e80, 0x0e80) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x0f00, 0x0f3f) AM_DEVWRITE("earom", atari_vg_earom_w) + AM_RANGE(0x0e80, 0x0e80) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x0f00, 0x0f3f) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) AM_RANGE(0x1000, 0x100f) AM_DEVREADWRITE("pokey1", pokey_r, pokey_w) AM_RANGE(0x1400, 0x140f) AM_DEVREADWRITE("pokey2", pokey_r, pokey_w) AM_RANGE(0x2000, 0x27ff) AM_RAM AM_BASE(&avgdvg_vectorram) AM_SIZE(&avgdvg_vectorram_size) AM_REGION("maincpu", 0x2000) @@ -734,7 +734,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 480, 0, 440) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg) diff -Nru mame-0.144/src/mame/drivers/bwing.c mame-0.145/src/mame/drivers/bwing.c --- mame-0.144/src/mame/drivers/bwing.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bwing.c 2012-02-06 21:30:42.000000000 +0000 @@ -396,10 +396,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600)) // must be long enough for polling - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(bwing) + MCFG_SCREEN_UPDATE_STATIC(bwing) MCFG_GFXDECODE(bwing) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/by17.c mame-0.145/src/mame/drivers/by17.c --- mame-0.144/src/mame/drivers/by17.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/by17.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* Bally MPU AS-2518-17 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,11 +11,21 @@ { public: by17_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( by17_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by17_map, AS_PROGRAM, 8, by17_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x007f) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( by17 ) INPUT_PORTS_END -static MACHINE_RESET( by17 ) +void by17_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(by17_map) - - MCFG_MACHINE_RESET( by17 ) MACHINE_CONFIG_END /*-------------------------------- @@ -145,13 +156,14 @@ ROM_RELOAD( 0xf800, 0x0800) ROM_END -GAME( 1978, blackjck, 0, by17, by17, by17, ROT0, "Bally","Black Jack (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1976, bowarrow, 0, by17, by17, by17, ROT0, "Bally","Bow & Arrow (Prototype)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, eightbll, 0, by17, by17, by17, ROT0, "Bally","Eight Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, evelknie, 0, by17, by17, by17, ROT0, "Bally","Evel Knievel", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, freedom, 0, by17, by17, by17, ROT0, "Bally","Freedom", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, matahari, 0, by17, by17, by17, ROT0, "Bally","Mata Hari", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, nightrdr, 0, by17, by17, by17, ROT0, "Bally","Night Rider (rev. 21)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, nightr20, nightrdr, by17, by17, by17, ROT0, "Bally","Night Rider (rev. 20)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, pwerplay, 0, by17, by17, by17, ROT0, "Bally","Power Play (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, stk_sprs, 0, by17, by17, by17, ROT0, "Bally","Strikes and Spares", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1978, blackjck, 0, by17, by17, by17, ROT0, "Bally","Black Jack (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1976, bowarrow, 0, by17, by17, by17, ROT0, "Bally","Bow & Arrow (Prototype)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, eightbll, 0, by17, by17, by17, ROT0, "Bally","Eight Ball", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, evelknie, 0, by17, by17, by17, ROT0, "Bally","Evel Knievel", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, freedom, 0, by17, by17, by17, ROT0, "Bally","Freedom", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, matahari, 0, by17, by17, by17, ROT0, "Bally","Mata Hari", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, nightrdr, 0, by17, by17, by17, ROT0, "Bally","Night Rider (rev. 21)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, nightr20, nightrdr, by17, by17, by17, ROT0, "Bally","Night Rider (rev. 20)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, pwerplay, 0, by17, by17, by17, ROT0, "Bally","Power Play (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, stk_sprs, 0, by17, by17, by17, ROT0, "Bally","Strikes and Spares", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/by35.c mame-0.145/src/mame/drivers/by35.c --- mame-0.144/src/mame/drivers/by35.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/by35.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* Bally MPU AS-2518-35 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,11 +11,21 @@ { public: by35_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( by35_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by35_map, AS_PROGRAM, 8, by35_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x007f) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( by35 ) INPUT_PORTS_END -static MACHINE_RESET( by35 ) +void by35_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(by35_map) - - MCFG_MACHINE_RESET( by35 ) MACHINE_CONFIG_END /*-------------------------------- @@ -1271,77 +1282,77 @@ ROM_END -GAME( 1986, bullseye, 0, by35, by35, by35, ROT0, "Grand Products","301/Bullseye", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, blakpyra, 0, by35, by35, by35, ROT0, "Bally","Black Pyramid", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, bmx, 0, by35, by35, by35, ROT0, "Bally","BMX", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, centaur, 0, by35, by35, by35, ROT0, "Bally","Centaur", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, cosflash, flashgdn, by35, by35, by35, ROT0, "Bell Games","Cosmic Flash", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, cybrnaut, 0, by35, by35, by35, ROT0, "Bally","Cybernaut", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, dollyptn, 0, by35, by35, by35, ROT0, "Bally","Dolly Parton", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, eballdlx, 0, by35, by35, by35, ROT0, "Bally","Eight Ball Deluxe (rev. 15)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, eballd14, eballdlx, by35, by35, by35, ROT0, "Bally","Eight Ball Deluxe (rev. 14)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, elektra, 0, by35, by35, by35, ROT0, "Bally","Elektra", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, embryon, 0, by35, by35, by35, ROT0, "Bally","Embryon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, fathom, 0, by35, by35, by35, ROT0, "Bally","Fathom", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, fbclass, 0, by35, by35, by35, ROT0, "Bally","Fireball Classic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, fball_ii, 0, by35, by35, by35, ROT0, "Bally","Fireball II", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, flashgdn, 0, by35, by35, by35, ROT0, "Bally","Flash Gordon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, flashgdnf, flashgdn, by35, by35, by35, ROT0, "Bally","Flash Gordon (French)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, flashgdnv, flashgdn, by35, by35, by35, ROT0, "Bally","Flash Gordon (Vocalizer sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, frontier, 0, by35, by35, by35, ROT0, "Bally","Frontier", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, futurspa, 0, by35, by35, by35, ROT0, "Bally","Future Spa", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, goldball, 0, by35, by35, by35, ROT0, "Bally","Gold Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, goldballn, goldball, by35, by35, by35, ROT0, "Bally / Oliver","Gold Ball (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, granslam, 0, by35, by35, by35, ROT0, "Bally","Grand Slam", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, granslam4, granslam, by35, by35, by35, ROT0, "Bally","Grand Slam (4 Players)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, hglbtrtr, 0, by35, by35, by35, ROT0, "Bally","Harlem Globetrotters On Tour", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, hotdoggn, 0, by35, by35, by35, ROT0, "Bally","Hotdoggin'", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, kosteel, 0, by35, by35, by35, ROT0, "Bally","Kings of Steel", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, kiss, 0, by35, by35, by35, ROT0, "Bally","Kiss", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, lostwrlp, 0, by35, by35, by35, ROT0, "Bally","Lost World", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1981, medusa, 0, by35, by35, by35, ROT0, "Bally","Medusa", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, m_mpac, 0, by35, by35, by35, ROT0, "Bally","Mr. and Mrs. PacMan", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, mystic, 0, by35, by35, by35, ROT0, "Bally","Mystic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, myststar, 0, by35, by35, by35, ROT0, "Bally","Mystic Star", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, newwave, blakpyra, by35, by35, by35, ROT0, "Bell Games","New Wave", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, ngndshkr, 0, by35, by35, by35, ROT0, "Bally","Nitro Ground Shaker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, paragon, 0, by35, by35, by35, ROT0, "Bally","Paragon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, playboy , 0, by35, by35, by35, ROT0, "Bally","Playboy", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, rapidfip, 0, by35, by35, by35, ROT0, "Bally","Rapid Fire", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, rollston, 0, by35, by35, by35, ROT0, "Bally","Rolling Stones", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, saturn2, spyhuntr, by35, by35, by35, ROT0, "Bell Games","Saturn 2", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, slbmania, 0, by35, by35, by35, ROT0, "Bally","Silverball Mania", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, skatebll, 0, by35, by35, by35, ROT0, "Bally","Skateball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, spacehaw, cybrnaut, by35, by35, by35, ROT0, "Nuova Bell Games","Space Hawks", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, spaceinv, 0, by35, by35, by35, ROT0, "Bally","Space Invaders", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, speakesy, 0, by35, by35, by35, ROT0, "Bally","Speakeasy", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, speakesy4p, speakesy, by35, by35, by35, ROT0, "Bally","Speakeasy 4 Player", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, spectrm, 0, by35, by35, by35, ROT0, "Bally","Spectrum", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, spectrm4, spectrm, by35, by35, by35, ROT0, "Bally","Spectrum (ver 4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, spyhuntr, 0, by35, by35, by35, ROT0, "Bally","Spy Hunter (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, startrep, 0, by35, by35, by35, ROT0, "Bally","Star Trek (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1979, sst, 0, by35, by35, by35, ROT0, "Bally","Supersonic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, smman, 0, by35, by35, by35, ROT0, "Bally","Six Million Dollar Man", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, tigerrag, kosteel, by35, by35, by35, ROT0, "Bell Games","Tiger Rag", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1982, vector, 0, by35, by35, by35, ROT0, "Bally","Vector", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, viking, 0, by35, by35, by35, ROT0, "Bally","Viking", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, voltan, 0, by35, by35, by35, ROT0, "Bally","Voltan Escapes Cosmic Doom", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1983, xsandos, 0, by35, by35, by35, ROT0, "Bally","X's & O's", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, xenon, 0, by35, by35, by35, ROT0, "Bally","Xenon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1980, xenonf, xenon, by35, by35, by35, ROT0, "Bally","Xenon (French)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, worlddef, 0, by35, by35, by35, ROT0, "Bell Games","World Defender", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, darkshad, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Dark Shadow", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - -GAME( 1986, skflight, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Skill Flight", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, cobrap, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Cobra", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, futrquen, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Future Queen", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, f1gpp, 0, by35, by35, by35, ROT0, "Nuova Bell Games","F1 Grand Prix", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, toppin, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Top Pin", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, uboat65, 0, by35, by35, by35, ROT0, "Nuova Bell Games","U-boat 65", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - -GAME( 1988, bbbowlin, 0, by35, by35, by35, ROT0, "United","Big Ball Bowling (Bowler)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, monrobwl, 0, by35, by35, by35, ROT0, "Monroe Bowling Co.","Stars & Strikes (Bowler)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, mdntmrdr, 0, by35, by35, by35, ROT0, "Bally Midway","Midnight Marauders (Gun game)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, blbeauty, 0, by35, by35, by35, ROT0, "Stern","Black Beauty (Shuffle)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME( 1986, bullseye, 0, by35, by35, by35, ROT0, "Grand Products","301/Bullseye", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, blakpyra, 0, by35, by35, by35, ROT0, "Bally","Black Pyramid", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, bmx, 0, by35, by35, by35, ROT0, "Bally","BMX", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, centaur, 0, by35, by35, by35, ROT0, "Bally","Centaur", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, cosflash, flashgdn, by35, by35, by35, ROT0, "Bell Games","Cosmic Flash", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, cybrnaut, 0, by35, by35, by35, ROT0, "Bally","Cybernaut", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, dollyptn, 0, by35, by35, by35, ROT0, "Bally","Dolly Parton", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, eballdlx, 0, by35, by35, by35, ROT0, "Bally","Eight Ball Deluxe (rev. 15)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, eballd14, eballdlx, by35, by35, by35, ROT0, "Bally","Eight Ball Deluxe (rev. 14)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, elektra, 0, by35, by35, by35, ROT0, "Bally","Elektra", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, embryon, 0, by35, by35, by35, ROT0, "Bally","Embryon", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, fathom, 0, by35, by35, by35, ROT0, "Bally","Fathom", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, fbclass, 0, by35, by35, by35, ROT0, "Bally","Fireball Classic", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, fball_ii, 0, by35, by35, by35, ROT0, "Bally","Fireball II", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, flashgdn, 0, by35, by35, by35, ROT0, "Bally","Flash Gordon", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, flashgdnf, flashgdn, by35, by35, by35, ROT0, "Bally","Flash Gordon (French)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, flashgdnv, flashgdn, by35, by35, by35, ROT0, "Bally","Flash Gordon (Vocalizer sound)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, frontier, 0, by35, by35, by35, ROT0, "Bally","Frontier", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, futurspa, 0, by35, by35, by35, ROT0, "Bally","Future Spa", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, goldball, 0, by35, by35, by35, ROT0, "Bally","Gold Ball", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, goldballn, goldball, by35, by35, by35, ROT0, "Bally / Oliver","Gold Ball (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, granslam, 0, by35, by35, by35, ROT0, "Bally","Grand Slam", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, granslam4, granslam, by35, by35, by35, ROT0, "Bally","Grand Slam (4 Players)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, hglbtrtr, 0, by35, by35, by35, ROT0, "Bally","Harlem Globetrotters On Tour", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, hotdoggn, 0, by35, by35, by35, ROT0, "Bally","Hotdoggin'", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, kosteel, 0, by35, by35, by35, ROT0, "Bally","Kings of Steel", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, kiss, 0, by35, by35, by35, ROT0, "Bally","Kiss", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, lostwrlp, 0, by35, by35, by35, ROT0, "Bally","Lost World", GAME_IS_SKELETON_MECHANICAL) +GAME( 1981, medusa, 0, by35, by35, by35, ROT0, "Bally","Medusa", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, m_mpac, 0, by35, by35, by35, ROT0, "Bally","Mr. and Mrs. PacMan", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, mystic, 0, by35, by35, by35, ROT0, "Bally","Mystic", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, myststar, 0, by35, by35, by35, ROT0, "Bally","Mystic Star", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, newwave, blakpyra, by35, by35, by35, ROT0, "Bell Games","New Wave", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, ngndshkr, 0, by35, by35, by35, ROT0, "Bally","Nitro Ground Shaker", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, paragon, 0, by35, by35, by35, ROT0, "Bally","Paragon", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, playboy , 0, by35, by35, by35, ROT0, "Bally","Playboy", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, rapidfip, 0, by35, by35, by35, ROT0, "Bally","Rapid Fire", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, rollston, 0, by35, by35, by35, ROT0, "Bally","Rolling Stones", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, saturn2, spyhuntr, by35, by35, by35, ROT0, "Bell Games","Saturn 2", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, slbmania, 0, by35, by35, by35, ROT0, "Bally","Silverball Mania", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, skatebll, 0, by35, by35, by35, ROT0, "Bally","Skateball", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, spacehaw, cybrnaut, by35, by35, by35, ROT0, "Nuova Bell Games","Space Hawks", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, spaceinv, 0, by35, by35, by35, ROT0, "Bally","Space Invaders", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, speakesy, 0, by35, by35, by35, ROT0, "Bally","Speakeasy", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, speakesy4p, speakesy, by35, by35, by35, ROT0, "Bally","Speakeasy 4 Player", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, spectrm, 0, by35, by35, by35, ROT0, "Bally","Spectrum", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, spectrm4, spectrm, by35, by35, by35, ROT0, "Bally","Spectrum (ver 4)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, spyhuntr, 0, by35, by35, by35, ROT0, "Bally","Spy Hunter (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, startrep, 0, by35, by35, by35, ROT0, "Bally","Star Trek (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1979, sst, 0, by35, by35, by35, ROT0, "Bally","Supersonic", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, smman, 0, by35, by35, by35, ROT0, "Bally","Six Million Dollar Man", GAME_IS_SKELETON_MECHANICAL) +GAME( 1984, tigerrag, kosteel, by35, by35, by35, ROT0, "Bell Games","Tiger Rag", GAME_IS_SKELETON_MECHANICAL) +GAME( 1982, vector, 0, by35, by35, by35, ROT0, "Bally","Vector", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, viking, 0, by35, by35, by35, ROT0, "Bally","Viking", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, voltan, 0, by35, by35, by35, ROT0, "Bally","Voltan Escapes Cosmic Doom", GAME_IS_SKELETON_MECHANICAL) +GAME( 1983, xsandos, 0, by35, by35, by35, ROT0, "Bally","X's & O's", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, xenon, 0, by35, by35, by35, ROT0, "Bally","Xenon", GAME_IS_SKELETON_MECHANICAL) +GAME( 1980, xenonf, xenon, by35, by35, by35, ROT0, "Bally","Xenon (French)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, worlddef, 0, by35, by35, by35, ROT0, "Bell Games","World Defender", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, darkshad, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Dark Shadow", GAME_IS_SKELETON_MECHANICAL) + +GAME( 1986, skflight, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Skill Flight", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, cobrap, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Cobra", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, futrquen, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Future Queen", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, f1gpp, 0, by35, by35, by35, ROT0, "Nuova Bell Games","F1 Grand Prix", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, toppin, 0, by35, by35, by35, ROT0, "Nuova Bell Games","Top Pin", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, uboat65, 0, by35, by35, by35, ROT0, "Nuova Bell Games","U-boat 65", GAME_IS_SKELETON_MECHANICAL) + +GAME( 1988, bbbowlin, 0, by35, by35, by35, ROT0, "United","Big Ball Bowling (Bowler)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, monrobwl, 0, by35, by35, by35, ROT0, "Monroe Bowling Co.","Stars & Strikes (Bowler)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, mdntmrdr, 0, by35, by35, by35, ROT0, "Bally Midway","Midnight Marauders (Gun game)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, blbeauty, 0, by35, by35, by35, ROT0, "Stern","Black Beauty (Shuffle)", GAME_IS_SKELETON_MECHANICAL) -GAME( 1984, suprbowl, xsandos, by35, by35, by35, ROT0, "Bell Games","Super Bowl", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME( 1984, suprbowl, xsandos, by35, by35, by35, ROT0, "Bell Games","Super Bowl", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/by6803.c mame-0.145/src/mame/drivers/by6803.c --- mame-0.144/src/mame/drivers/by6803.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/by6803.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,6 +1,9 @@ /* Bally MPU A084-91786-AH06 (6803) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" #include "cpu/m6809/m6809.h" @@ -9,11 +12,21 @@ { public: by6803_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( by6803_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by6803_map, AS_PROGRAM, 8, by6803_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x00ff) AM_RAM AM_RANGE(0x1000, 0x17ff) AM_RAM @@ -23,7 +36,7 @@ static INPUT_PORTS_START( by6803 ) INPUT_PORTS_END -static MACHINE_RESET( by6803 ) +void by6803_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6803, 1000000) MCFG_CPU_PROGRAM_MAP(by6803_map) - - MCFG_MACHINE_RESET( by6803 ) MACHINE_CONFIG_END /*----------------------------------------------------------- @@ -305,23 +316,24 @@ ROM_RELOAD(0x20000 +0x8000, 0x8000) ROM_END -GAME( 1989, atlantip, 0, by6803, by6803, by6803, ROT0, "Bally","Atlantis", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, beatclck, 0, by6803, by6803, by6803, ROT0, "Bally","Beat the Clock", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, blackblt, 0, by6803, by6803, by6803, ROT0, "Bally","Black Belt", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, black100, 0, by6803, by6803, by6803, ROT0, "Bally","Blackwater 100", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, black100s, black100, by6803, by6803, by6803, ROT0, "Bally","Blackwater 100 (Single Ball Play)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, cityslck, 0, by6803, by6803, by6803, ROT0, "Bally","City Slicker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, dungdrag, 0, by6803, by6803, by6803, ROT0, "Bally","Dungeons & Dragons", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1985, eballchp, 0, by6803, by6803, by6803, ROT0, "Bally","Eight Ball Champ", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, esclwrld, 0, by6803, by6803, by6803, ROT0, "Bally","Escape from the Lost World", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, esclwrldg, esclwrld, by6803, by6803, by6803, ROT0, "Bally","Escape from the Lost World (German)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, hardbody, 0, by6803, by6803, by6803, ROT0, "Bally","Hardbody", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, hardbodyg, hardbody, by6803, by6803, by6803, ROT0, "Bally","Hardbody (German)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, hvymetap, 0, by6803, by6803, by6803, ROT0, "Bally","Heavy Metal Meltdown", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, ladyluck, 0, by6803, by6803, by6803, ROT0, "Bally","Lady Luck", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, motrdome, 0, by6803, by6803, by6803, ROT0, "Bally","MotorDome", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, prtyanim, 0, by6803, by6803, by6803, ROT0, "Bally","Party Animal", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, specforc, 0, by6803, by6803, by6803, ROT0, "Bally","Special Force", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, strngsci, 0, by6803, by6803, by6803, ROT0, "Bally","Strange Science", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, trucksp3, 0, by6803, by6803, by6803, ROT0, "Bally","Truck Stop (P-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1988, trucksp2, trucksp3, by6803, by6803, by6803, ROT0, "Bally","Truck Stop (P-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1989, atlantip, 0, by6803, by6803, by6803, ROT0, "Bally","Atlantis", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, beatclck, 0, by6803, by6803, by6803, ROT0, "Bally","Beat the Clock", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, blackblt, 0, by6803, by6803, by6803, ROT0, "Bally","Black Belt", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, black100, 0, by6803, by6803, by6803, ROT0, "Bally","Blackwater 100", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, black100s, black100, by6803, by6803, by6803, ROT0, "Bally","Blackwater 100 (Single Ball Play)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, cityslck, 0, by6803, by6803, by6803, ROT0, "Bally","City Slicker", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, dungdrag, 0, by6803, by6803, by6803, ROT0, "Bally","Dungeons & Dragons", GAME_IS_SKELETON_MECHANICAL) +GAME( 1985, eballchp, 0, by6803, by6803, by6803, ROT0, "Bally","Eight Ball Champ", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, esclwrld, 0, by6803, by6803, by6803, ROT0, "Bally","Escape from the Lost World", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, esclwrldg, esclwrld, by6803, by6803, by6803, ROT0, "Bally","Escape from the Lost World (German)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, hardbody, 0, by6803, by6803, by6803, ROT0, "Bally","Hardbody", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, hardbodyg, hardbody, by6803, by6803, by6803, ROT0, "Bally","Hardbody (German)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, hvymetap, 0, by6803, by6803, by6803, ROT0, "Bally","Heavy Metal Meltdown", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, ladyluck, 0, by6803, by6803, by6803, ROT0, "Bally","Lady Luck", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, motrdome, 0, by6803, by6803, by6803, ROT0, "Bally","MotorDome", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, prtyanim, 0, by6803, by6803, by6803, ROT0, "Bally","Party Animal", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, specforc, 0, by6803, by6803, by6803, ROT0, "Bally","Special Force", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, strngsci, 0, by6803, by6803, by6803, ROT0, "Bally","Strange Science", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, trucksp3, 0, by6803, by6803, by6803, ROT0, "Bally","Truck Stop (P-3)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1988, trucksp2, trucksp3, by6803, by6803, by6803, ROT0, "Bally","Truck Stop (P-2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/by68701.c mame-0.145/src/mame/drivers/by68701.c --- mame-0.144/src/mame/drivers/by68701.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/by68701.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -5,11 +7,21 @@ { public: by68701_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( by68701_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by68701_map, AS_PROGRAM, 8, by68701_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x00ff) AM_RAM AM_RANGE(0x0400, 0x04ff) AM_RAM @@ -20,7 +32,7 @@ static INPUT_PORTS_START( by68701 ) INPUT_PORTS_END -static MACHINE_RESET( by68701 ) +void by68701_state::machine_reset() { } @@ -32,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6803, 3579545/4) MCFG_CPU_PROGRAM_MAP(by68701_map) - - MCFG_MACHINE_RESET( by68701 ) MACHINE_CONFIG_END /*------------------ @@ -116,9 +126,10 @@ ROM_LOAD("838-16_5.532", 0xf000, 0x1000, CRC(63d92025) SHA1(2f8e8435326a39064b99b9971b0d8944586571fb)) ROM_END -GAME(1981, flashgdnp1, flashgdn, by68701, by68701, by68701, ROT0, "Bally", "Flash Gordon (prototype rev. 1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, flashgdnp2, flashgdn, by68701, by68701, by68701, ROT0, "Bally", "Flash Gordon (prototype rev. 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, eballdlxp1, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, eballdlxp2, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, eballdlxp3, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, eballdlxp4, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1981, flashgdnp1, flashgdn, by68701, by68701, by68701, ROT0, "Bally", "Flash Gordon (prototype rev. 1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, flashgdnp2, flashgdn, by68701, by68701, by68701, ROT0, "Bally", "Flash Gordon (prototype rev. 2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, eballdlxp1, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, eballdlxp2, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, eballdlxp3, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, eballdlxp4, eballdlx, by68701, by68701, by68701, ROT0, "Bally", "Eight Ball Deluxe (prototype rev. 4)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/byvid.c mame-0.145/src/mame/drivers/byvid.c --- mame-0.144/src/mame/drivers/byvid.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/byvid.c 2012-02-06 21:30:33.000000000 +0000 @@ -2,6 +2,8 @@ Bally MPU AS-2518-133 */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" #include "cpu/m6809/m6809.h" @@ -10,16 +12,28 @@ { public: by133_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_videocpu(*this, "videocpu") + { } + +protected: + + // devices + required_device m_maincpu; + required_device m_videocpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( by133_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by133_map, AS_PROGRAM, 8, by133_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x1000, 0x7fff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( by133_video_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( by133_video_map, AS_PROGRAM, 8, by133_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -27,7 +41,7 @@ static INPUT_PORTS_START( by133 ) INPUT_PORTS_END -static MACHINE_RESET( by133 ) +void by133_state::machine_reset() { } @@ -42,8 +56,6 @@ MCFG_CPU_ADD("videocpu", M6809, 3580000/4) MCFG_CPU_PROGRAM_MAP(by133_video_map) - - MCFG_MACHINE_RESET( by133 ) MACHINE_CONFIG_END /*----------------------------------------------------- @@ -86,5 +98,6 @@ ROM_LOAD( "cs_u3.764", 0xe000, 0x2000, CRC(0a39a51d) SHA1(98342ba38e48578ce9870f2ee85b553d46c0e35f)) ROM_END -GAME( 1982, babypac, 0, by133, by133, by133, ROT0, "Bally","Baby Pacman (Video/Pinball Combo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1984, granny, 0, by133, by133, by133, ROT0, "Bally","Granny and the Gators (Video/Pinball Combo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1982, babypac, 0, by133, by133, by133, ROT0, "Bally", "Baby Pacman (Video/Pinball Combo)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, granny, 0, by133, by133, by133, ROT0, "Bally", "Granny and the Gators (Video/Pinball Combo)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/bzone.c mame-0.145/src/mame/drivers/bzone.c --- mame-0.144/src/mame/drivers/bzone.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/bzone.c 2012-02-06 21:30:33.000000000 +0000 @@ -332,9 +332,9 @@ AM_RANGE(0x1806, 0x1806) AM_DEVREAD("mathbox", mathbox_hi_r) AM_RANGE(0x1808, 0x1808) AM_DEVWRITE("custom", redbaron_joysound_w) /* and select joystick pot also */ AM_RANGE(0x180a, 0x180a) AM_WRITENOP /* sound reset, yet todo */ - AM_RANGE(0x180c, 0x180c) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) + AM_RANGE(0x180c, 0x180c) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) AM_RANGE(0x1810, 0x181f) AM_DEVREADWRITE("pokey", pokey_r, pokey_w) - AM_RANGE(0x1820, 0x185f) AM_DEVREADWRITE("earom", atari_vg_earom_r, atari_vg_earom_w) + AM_RANGE(0x1820, 0x185f) AM_DEVREADWRITE_MODERN("earom", atari_vg_earom_device, read, write) AM_RANGE(0x1860, 0x187f) AM_DEVWRITE("mathbox", mathbox_go_w) AM_RANGE(0x2000, 0x2fff) AM_RAM AM_BASE(&avgdvg_vectorram) AM_SIZE(&avgdvg_vectorram_size) AM_REGION("maincpu", 0x2000) AM_RANGE(0x3000, 0x7fff) AM_ROM @@ -561,7 +561,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 580, 0, 400) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_bzone) diff -Nru mame-0.144/src/mame/drivers/cabal.c mame-0.145/src/mame/drivers/cabal.c --- mame-0.144/src/mame/drivers/cabal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cabal.c 2012-02-06 21:30:41.000000000 +0000 @@ -296,10 +296,10 @@ PORT_DIPSETTING( 0x0100, "5" ) PORT_DIPSETTING( 0x0000, "121 (Cheat)") PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3,4") - PORT_DIPSETTING( 0x0c00, "20k 50k" ) - PORT_DIPSETTING( 0x0800, "30k 100k" ) - PORT_DIPSETTING( 0x0400, "50k 150k" ) - PORT_DIPSETTING( 0x0000, "70K" ) + PORT_DIPSETTING( 0x0c00, "150k 650k 500k+" ) + PORT_DIPSETTING( 0x0800, "200k 800k 600k+" ) + PORT_DIPSETTING( 0x0400, "300k 1000k 700k+" ) + PORT_DIPSETTING( 0x0000, "300k Only" ) PORT_DIPNAME( 0x3000, 0x2000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x3000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x2000, DEF_STR( Normal ) ) @@ -500,10 +500,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.60) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cabal) + MCFG_SCREEN_UPDATE_STATIC(cabal) MCFG_GFXDECODE(cabal) MCFG_PALETTE_LENGTH(1024) @@ -557,10 +556,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cabal) + MCFG_SCREEN_UPDATE_STATIC(cabal) MCFG_GFXDECODE(cabal) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/cabaret.c mame-0.145/src/mame/drivers/cabaret.c --- mame-0.144/src/mame/drivers/cabaret.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/cabaret.c 2012-02-06 21:30:34.000000000 +0000 @@ -55,14 +55,14 @@ { cabaret_state *state = space->machine().driver_data(); state->m_bg_scroll[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap,offset,data); + state->m_bg_tilemap->set_scrolly(offset,data); } static WRITE8_HANDLER( bg_tile_w ) { cabaret_state *state = space->machine().driver_data(); state->m_bg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -84,14 +84,14 @@ { cabaret_state *state = space->machine().driver_data(); state->m_fg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_color_w ) { cabaret_state *state = space->machine().driver_data(); state->m_fg_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static VIDEO_START(cabaret) @@ -99,19 +99,19 @@ cabaret_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 32, 64, 8); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 64); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(64); } -static SCREEN_UPDATE(cabaret) +static SCREEN_UPDATE_IND16(cabaret) { - cabaret_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + cabaret_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -338,10 +338,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(cabaret) + MCFG_SCREEN_UPDATE_STATIC(cabaret) MCFG_GFXDECODE(cabaret) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/calchase.c mame-0.145/src/mame/drivers/calchase.c --- mame-0.144/src/mame/drivers/calchase.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/calchase.c 2012-02-06 21:30:41.000000000 +0000 @@ -2,14 +2,13 @@ California Chase (c) 1999 The Game Room -preliminary driver by Angelo Salese +preliminary driver by Angelo Salese & Grull Osgo TODO: -- currently calls int 13h with ah=0 -> "Reset Disk Drives" and returns an error code -for whatever reason; -- video emulation not even started (it currently fills vram with 0x0720, hence it's -unneeded for now...) -- clean-ups; +- get Win 98 to boot; +- Various graphics bugs (title screen uses ROZ?); +- fix 129 Hz refresh rate bug; +- inputs (is there a service mode?) I/O Memo (http://bochs.sourceforge.net/techspec/PORTS.LST): 46E8 ---- 8514/A and compatible video cards (e.g. ATI Graphics Ultra) @@ -20,11 +19,6 @@ 43c4 is a 83c4 mirror? -04D0-04D1 ---- EISA IRQ control -00F0-00F5 ---- PCjr Disk Controller -(or) -00F0-00FF ---- coprocessor (8087..80387) - ===================================================================================== California Chase @@ -82,6 +76,36 @@ all files across to new HDD, boots up fine. ************************************************************************************/ +/* +Grull Osgo - Improvements + +-Changes about BIOS memory management so ROM Shadow now works properly. + The changes are: + Rom Memory Map remmapped to 128K size AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) + +-Changes in mtxc write handler and bios_ram write handler. Now The internal register access are +compatible with chipset VIA. + (this motherboard has VIA Apollo VXPro chipset. It is not compatible with Intel i430). + With this changes now BIOS Shadow ram works fine, BIOS can relocate and decompress the full code + necesary to run the Extended Bios, POST and Boot). No more BIOS Checksum error. + +- Suppressed all video related items wich will be replaced with VGA driver. + +- Temporarily added a VGA driver that is working based on original IBM VGA BIOS.(From MESS) + (This VGA driver doesn't work yet with TRIDENT VGA BIOS as I can see). + +- Added the flag READONLY to the calchase imagen rom load function, to avoid + "DIFF CHD ERROR". + +- Minor changes and NOPS into address maps for debugging purposes. + +- Now Bios is looking for the disk (BIOS Auto detection). It seems all works fine but must be there +something wrong in the disk geometry reported by calchase.chd (20,255,63) since BIOS does not accept + 255 heads as parameter. Perhaps a bad dump? + + TODO: A lot of work to do yet!!! + */ + #include "emu.h" #include "cpu/i386/i386.h" @@ -96,16 +120,19 @@ #include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" +#include "video/pc_vga.h" +#include "sound/dac.h" class calchase_state : public driver_device { public: calchase_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } UINT32 *m_bios_ram; - UINT32 *m_vga_vram; int m_dma_channel; UINT8 m_dma_offset[2][4]; UINT8 m_at_pages[0x10]; @@ -117,47 +144,15 @@ device_t *m_pic8259_2; device_t *m_dma8237_1; device_t *m_dma8237_2; + + UINT32 m_idle_skip_ram; + required_device m_maincpu; }; static void ide_interrupt(device_t *device, int state); -static VIDEO_START(calchase) -{ -} - -static SCREEN_UPDATE(calchase) -{ - calchase_state *state = screen->machine().driver_data(); - int x,y,count,i; - - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - - count = (0); - - for(y=0;y<256;y++) - { - for(x=0;x<320;x+=32) - { - for (i=0;i<32;i++) - { - UINT32 color; - - color = (state->m_vga_vram[count])>>(32-i) & 0x1; - - if((x+i)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x+(32-i)) = screen->machine().pens[color]; - - } - - count++; - } - } - - return 0; -} - static READ8_DEVICE_HANDLER(at_dma8237_2_r) { return i8237_r(device, offset / 2); @@ -307,6 +302,10 @@ ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); } + + + + static READ32_DEVICE_HANDLER( fdc_r ) { return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); @@ -318,7 +317,9 @@ ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); } + // Intel 82439TX System Controller (MXTC) +// TODO: change with a VIA82C585VPX (North Bridge - APOLLO Chipset) static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) { @@ -335,15 +336,27 @@ switch(reg) { - case 0x59: // PAM0 + //case 0x59: + case 0x63: // PAM0 { - if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + //if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + if ((data & 0x50) | (data & 0xA0)) { memory_set_bankptr(busdevice->machine(), "bank1", state->m_bios_ram); } - else // disable RAM access (reads go to BIOS ROM) + else // disable RAM access (reads go to BIOS ROM) { - memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("bios")->base() + 0x10000); + //Execution Hack to avoid crash when switch back from Shadow RAM to Bios ROM, since i386 emu haven't yet pipelined execution structure. + //It happens when exit from BIOS SETUP. + #if 0 + if ((state->m_mxtc_config_reg[0x63] & 0x50) | ( state->m_mxtc_config_reg[0x63] & 0xA0)) // Only DO if comes a change to disable ROM. + { + if ( cpu_get_pc(busdevice->machine().device("maincpu"))==0xff74e) cpu_set_reg(busdevice->machine().device("maincpu"), STATE_GENPC, 0xff74d); + } + #endif + + //memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("bios")->base() + 0x10000); + memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("bios")->base()); } break; } @@ -366,6 +379,10 @@ static UINT32 intel82439tx_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) { UINT32 r = 0; + + if(reg == 0) + return 0x05851106; // VT82C585VPX, VIA + if (ACCESSING_BITS_24_31) { r |= mxtc_config_r(busdevice, device, function, reg + 3) << 24; @@ -406,6 +423,7 @@ } // Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) +//TODO: change with VIA82C586B (South Bridge - APOLLO Chipset) static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) { @@ -424,6 +442,10 @@ static UINT32 intel82371ab_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) { UINT32 r = 0; + + if(reg == 0) + return 0x30401106; // VT82C586B, VIA + if (ACCESSING_BITS_24_31) { r |= piix4_config_r(busdevice, device, function, reg + 3) << 24; @@ -466,28 +488,77 @@ static WRITE32_HANDLER(bios_ram_w) { calchase_state *state = space->machine().driver_data(); - if (state->m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + //if (state->m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + if (state->m_mxtc_config_reg[0x63] & 0x50) { COMBINE_DATA(state->m_bios_ram + offset); } } +static READ16_HANDLER( calchase_iocard1_r ) +{ + return input_port_read(space->machine(), "IOCARD1"); +} + +static READ16_HANDLER( calchase_iocard2_r ) +{ + return input_port_read(space->machine(), "IOCARD2"); +} + +static READ16_HANDLER( calchase_iocard3_r ) +{ + return input_port_read(space->machine(), "IOCARD3"); +} + +/* These two controls wheel pot or whatever this game uses ... */ +static READ16_HANDLER( calchase_iocard4_r ) +{ + return input_port_read(space->machine(), "IOCARD4"); +} + +static READ16_HANDLER( calchase_iocard5_r ) +{ + return input_port_read(space->machine(), "IOCARD5"); +} + + +static WRITE16_DEVICE_HANDLER( calchase_dac_w ) +{ + dac_data_16_w(device, ((data & 0xfff) << 4)); +} + static ADDRESS_MAP_START( calchase_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0x000a0000, 0x000bffff) AM_RAM AM_BASE_MEMBER(calchase_state, m_vga_vram) + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM // VGA VRAM AM_RANGE(0x000c0000, 0x000c7fff) AM_RAM AM_REGION("video_bios", 0) - AM_RANGE(0x000e0000, 0x000effff) AM_RAM - AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bank1") - AM_RANGE(0x000f0000, 0x000fffff) AM_WRITE(bios_ram_w) - AM_RANGE(0x00100000, 0x01ffffff) AM_RAM - AM_RANGE(0x04000000, 0x040001ff) AM_RAM - AM_RANGE(0x08000000, 0x080001ff) AM_RAM - AM_RANGE(0x0c000000, 0x0c0001ff) AM_RAM - AM_RANGE(0x10000000, 0x100001ff) AM_RAM - AM_RANGE(0x14000000, 0x140001ff) AM_RAM - AM_RANGE(0x18000000, 0x180001ff) AM_RAM - AM_RANGE(0x20000000, 0x200001ff) AM_RAM - AM_RANGE(0x28000000, 0x280001ff) AM_RAM + AM_RANGE(0x000c8000, 0x000cffff) AM_NOP + //AM_RANGE(0x000d0000, 0x000d0003) AM_RAM // XYLINX - Sincronus serial communication + AM_RANGE(0x000d0004, 0x000d0007) AM_READ16(calchase_iocard1_r, 0x0000ffff) + AM_RANGE(0x000d000c, 0x000d000f) AM_READ16(calchase_iocard2_r, 0x0000ffff) + AM_RANGE(0x000d0030, 0x000d0033) AM_READ16(calchase_iocard3_r, 0xffff0000) + AM_RANGE(0x000d0030, 0x000d0033) AM_READ16(calchase_iocard4_r, 0x0000ffff) + AM_RANGE(0x000d0034, 0x000d0037) AM_READ16(calchase_iocard5_r, 0x0000ffff) + AM_RANGE(0x000d0008, 0x000d000b) AM_WRITENOP // ??? + AM_RANGE(0x000d0024, 0x000d0027) AM_DEVWRITE16("dac_l",calchase_dac_w,0x0000ffff) + AM_RANGE(0x000d0028, 0x000d002b) AM_DEVWRITE16("dac_r",calchase_dac_w,0x0000ffff) + AM_RANGE(0x000d0800, 0x000d0fff) AM_ROM AM_REGION("nvram",0) // + AM_RANGE(0x000d0800, 0x000d0fff) AM_RAM // GAME_CMOS + + //GRULL AM_RANGE(0x000e0000, 0x000effff) AM_RAM + //GRULL-AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bank1") + //GRULL AM_RANGE(0x000f0000, 0x000fffff) AM_WRITE(bios_ram_w) + AM_RANGE(0x000e0000, 0x000fffff) AM_ROMBANK("bank1") + AM_RANGE(0x000e0000, 0x000fffff) AM_WRITE(bios_ram_w) + AM_RANGE(0x00100000, 0x03ffffff) AM_RAM // 64MB + AM_RANGE(0x02000000, 0x28ffffff) AM_NOP + //AM_RANGE(0x04000000, 0x040001ff) AM_RAM + //AM_RANGE(0x08000000, 0x080001ff) AM_RAM + //AM_RANGE(0x0c000000, 0x0c0001ff) AM_RAM + //AM_RANGE(0x10000000, 0x100001ff) AM_RAM + //AM_RANGE(0x14000000, 0x140001ff) AM_RAM + //AM_RANGE(0x18000000, 0x180001ff) AM_RAM + //AM_RANGE(0x20000000, 0x200001ff) AM_RAM + //AM_RANGE(0x28000000, 0x280001ff) AM_RAM AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END @@ -496,58 +567,69 @@ AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8("pit8254", pit8253_r, pit8253_w, 0xffffffff) AM_RANGE(0x0060, 0x006f) AM_READWRITE(kbdc8042_32le_r, kbdc8042_32le_w) - AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8_MODERN("rtc", mc146818_device, read, write, 0xffffffff) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8_MODERN("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ AM_RANGE(0x0080, 0x009f) AM_READWRITE(at_page32_r, at_page32_w) AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) - AM_RANGE(0x00e8, 0x00eb) AM_NOP + //AM_RANGE(0x00e8, 0x00eb) AM_NOP + AM_RANGE(0x00e8, 0x00ef) AM_NOP //AMI BIOS write to this ports as delays between I/O ports operations sending al value -> NEWIODELAY + AM_RANGE(0x0170, 0x0177) AM_NOP //To debug AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE("ide", ide_r, ide_w) - AM_RANGE(0x0300, 0x03af) AM_NOP - AM_RANGE(0x03b0, 0x03df) AM_NOP + AM_RANGE(0x0200, 0x021f) AM_NOP //To debug + AM_RANGE(0x0260, 0x026f) AM_NOP //To debug AM_RANGE(0x0278, 0x027b) AM_WRITENOP//AM_WRITE(pnp_config_w) - AM_RANGE(0x03f0, 0x03ff) AM_DEVREADWRITE("ide", fdc_r, fdc_w) + AM_RANGE(0x0280, 0x0287) AM_NOP //To debug + AM_RANGE(0x02a0, 0x02a7) AM_NOP //To debug + AM_RANGE(0x02c0, 0x02c7) AM_NOP //To debug + AM_RANGE(0x02e0, 0x02ef) AM_NOP //To debug + AM_RANGE(0x0278, 0x02ff) AM_NOP //To debug + AM_RANGE(0x02f8, 0x02ff) AM_NOP //To debug + AM_RANGE(0x0320, 0x038f) AM_NOP //To debug + AM_RANGE(0x03a0, 0x03a7) AM_NOP //To debug + AM_RANGE(0x03e0, 0x03ef) AM_NOP //To debug + AM_RANGE(0x0378, 0x037f) AM_NOP //To debug + // AM_RANGE(0x0300, 0x03af) AM_NOP + // AM_RANGE(0x03b0, 0x03df) AM_NOP + AM_RANGE(0x03f0, 0x03f7) AM_DEVREADWRITE("ide", fdc_r, fdc_w) + AM_RANGE(0x03f8, 0x03ff) AM_NOP // To debug Serial Port COM1: AM_RANGE(0x0a78, 0x0a7b) AM_WRITENOP//AM_WRITE(pnp_data_w) AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE("pcibus", pci_32le_r, pci_32le_w) + AM_RANGE(0x42e8, 0x43ef) AM_NOP //To debug AM_RANGE(0x43c0, 0x43cf) AM_RAM AM_SHARE("share1") + AM_RANGE(0x46e8, 0x46ef) AM_NOP //To debug + AM_RANGE(0x4ae8, 0x4aef) AM_NOP //To debug AM_RANGE(0x83c0, 0x83cf) AM_RAM AM_SHARE("share1") -ADDRESS_MAP_END - + AM_RANGE(0x92e8, 0x92ef) AM_NOP //To debug -static const gfx_layout CGA_charlayout = -{ - 8,8, - 256, - 1, - { 0 }, - { 0,1,2,3,4,5,6,7 }, - { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 }, - 8*8 -}; - -static GFXDECODE_START( CGA ) - GFXDECODE_ENTRY( "video_bios", 0x5182, CGA_charlayout, 0, 256 ) - //there's also a 8x16 entry (just after the 8x8) -GFXDECODE_END +ADDRESS_MAP_END #define AT_KEYB_HELPER(bit, text, key1) \ PORT_BIT( bit, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME(text) PORT_CODE(key1) + + +#if 1 static INPUT_PORTS_START( calchase ) PORT_START("pc_keyboard_0") PORT_BIT ( 0x0001, 0x0000, IPT_UNUSED ) /* unused scancode 0 */ AT_KEYB_HELPER( 0x0002, "Esc", KEYCODE_Q ) /* Esc 01 81 */ PORT_START("pc_keyboard_1") + AT_KEYB_HELPER( 0x0010, "T", KEYCODE_T ) /* T 14 94 */ AT_KEYB_HELPER( 0x0020, "Y", KEYCODE_Y ) /* Y 15 95 */ + AT_KEYB_HELPER( 0x0100, "O", KEYCODE_O ) /* O 18 98 */ AT_KEYB_HELPER( 0x1000, "Enter", KEYCODE_ENTER ) /* Enter 1C 9C */ PORT_START("pc_keyboard_2") PORT_START("pc_keyboard_3") + AT_KEYB_HELPER( 0x0001, "B", KEYCODE_B ) /* B 30 B0 */ AT_KEYB_HELPER( 0x0002, "N", KEYCODE_N ) /* N 31 B1 */ AT_KEYB_HELPER( 0x0800, "F1", KEYCODE_S ) /* F1 3B BB */ +// AT_KEYB_HELPER( 0x8000, "F5", KEYCODE_F5 ) PORT_START("pc_keyboard_4") +// AT_KEYB_HELPER( 0x0004, "F8", KEYCODE_F8 ) PORT_START("pc_keyboard_5") @@ -555,13 +637,153 @@ AT_KEYB_HELPER( 0x0040, "(MF2)Cursor Up", KEYCODE_UP ) /* Up 67 e7 */ AT_KEYB_HELPER( 0x0080, "(MF2)Page Up", KEYCODE_PGUP ) /* Page Up 68 e8 */ AT_KEYB_HELPER( 0x0100, "(MF2)Cursor Left", KEYCODE_LEFT ) /* Left 69 e9 */ - AT_KEYB_HELPER( 0x0200, "(MF2)Cursor Right", KEYCODE_RIGHT ) /* Right 6a ea */ + AT_KEYB_HELPER( 0x0200, "(MF2)Cursor Right", KEYCODE_RIGHT ) /* Right 6a ea */ AT_KEYB_HELPER( 0x0800, "(MF2)Cursor Down", KEYCODE_DOWN ) /* Down 6c ec */ AT_KEYB_HELPER( 0x1000, "(MF2)Page Down", KEYCODE_PGDN ) /* Page Down 6d ed */ - AT_KEYB_HELPER( 0x4000, "Del", KEYCODE_A ) /* Delete 6f ef */ + AT_KEYB_HELPER( 0x4000, "Del", KEYCODE_A ) /* Delete 6f ef */ PORT_START("pc_keyboard_7") + + PORT_START("IOCARD1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) + PORT_DIPNAME( 0x0008, 0x0008, "1" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Accelerator") + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("IOCARD2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE1 ) // guess + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset SW") + PORT_DIPNAME( 0x0004, 0x0004, "2" ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Turbo") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // returns back to MS-DOS (likely to be unmapped and actually used as a lame protection check) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("IOCARD3") + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_VBLANK ) + PORT_BIT( 0xdfff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IOCARD4") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_START("IOCARD5") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END +#endif static IRQ_CALLBACK(irq_callback) { @@ -569,6 +791,8 @@ return pic8259_acknowledge( state->m_pic8259_1); } +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color + static MACHINE_START(calchase) { calchase_state *state = machine.driver_data(); @@ -595,7 +819,7 @@ static READ8_DEVICE_HANDLER( get_slave_ack ) { calchase_state *state = device->machine().driver_data(); - if (offset==2) { // IRQ = 2 + if (offset==2) { return pic8259_acknowledge(state->m_pic8259_2); } return 0x00; @@ -616,6 +840,8 @@ }; + + /************************************************************* * * pit8254 configuration @@ -643,7 +869,8 @@ static MACHINE_RESET(calchase) { - memory_set_bankptr(machine, "bank1", machine.region("bios")->base() + 0x10000); + //memory_set_bankptr(machine, "bank1", machine.region("bios")->base() + 0x10000); + memory_set_bankptr(machine, "bank1", machine.region("bios")->base()); } static void set_gate_a20(running_machine &machine, int a20) @@ -671,7 +898,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, calchase_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, calchase_get_out2 }; static void calchase_set_keyb_int(running_machine &machine, int state) @@ -680,9 +907,8 @@ pic8259_ir1_w(drvstate->m_pic8259_1, state); } - static MACHINE_CONFIG_START( calchase, calchase_state ) - MCFG_CPU_ADD("maincpu", PENTIUM, 200000000) // Cyrix 686MX-PR200 CPU + MCFG_CPU_ADD("maincpu", PENTIUM, 133000000) // Cyrix 686MX-PR200 CPU MCFG_CPU_PROGRAM_MAP(calchase_map) MCFG_CPU_IO_MAP(calchase_io) @@ -695,37 +921,58 @@ MCFG_PIC8259_ADD( "pic8259_1", calchase_pic8259_1_config ) MCFG_PIC8259_ADD( "pic8259_2", calchase_pic8259_2_config ) MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) MCFG_PCI_BUS_ADD("pcibus", 0) MCFG_PCI_BUS_DEVICE(0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) MCFG_PCI_BUS_DEVICE(7, NULL, intel82371ab_pci_r, intel82371ab_pci_w) - MCFG_PALETTE_LENGTH(0x200) - MCFG_GFXDECODE( CGA ) + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(calchase) + /* sound hardware */ + MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker") + MCFG_SOUND_ADD("dac_l", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) + + MCFG_SOUND_ADD("dac_r", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) - MCFG_VIDEO_START(calchase) MACHINE_CONFIG_END + +static READ32_HANDLER( calchase_idle_skip_r ) +{ + calchase_state *state = space->machine().driver_data(); + + if(cpu_get_pc(&space->device())==0x1406f48) + device_spin_until_interrupt(state->m_maincpu); + + return state->m_idle_skip_ram; +} + +static WRITE32_HANDLER( calchase_idle_skip_w ) +{ + calchase_state *state = space->machine().driver_data(); + + COMBINE_DATA(&state->m_idle_skip_ram); +} + static DRIVER_INIT( calchase ) { calchase_state *state = machine.driver_data(); - state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x10000/4); + state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x20000/4); + pc_vga_init(machine, vga_setting, NULL); + pc_svga_trident_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); init_pc_common(machine, PCCOMMON_KEYBOARD_AT, calchase_set_keyb_int); intel82439tx_init(machine); kbdc8042_init(machine, &at8042); -} + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x3f0b160, 0x3f0b163, FUNC(calchase_idle_skip_r), FUNC(calchase_idle_skip_w)); +} ROM_START( calchase ) ROM_REGION( 0x40000, "bios", 0 ) @@ -739,8 +986,7 @@ ROM_LOAD( "ds1220y_nv.bin", 0x000, 0x800, CRC(7912c070) SHA1(b4c55c7ca76bcd8dad1c4b50297233349ae02ed3) ) DISK_REGION( "ide" ) - DISK_IMAGE( "calchase", 0,SHA1(487e304ffeed23ca618fa936258136605ce9d1a1) ) + DISK_IMAGE_READONLY( "calchase", 0,SHA1(6ae51a9b3f31cf4166322328a98c0235b0874eb3) ) ROM_END - -GAME( 1999, calchase, 0, calchase, calchase, calchase, ROT0, "The Game Room", "California Chase", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1999, calchase, 0, calchase, calchase, calchase, ROT0, "The Game Room", "California Chase", GAME_NOT_WORKING|GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/calomega.c mame-0.145/src/mame/drivers/calomega.c --- mame-0.144/src/mame/drivers/calomega.c 2012-01-13 15:34:34.000000000 +0000 +++ mame-0.145/src/mame/drivers/calomega.c 2012-02-06 21:30:39.000000000 +0000 @@ -2753,10 +2753,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 31*8-1) /* Taken from MC6845 init, registers 01 & 06 */ - MCFG_SCREEN_UPDATE(calomega) + MCFG_SCREEN_UPDATE_STATIC(calomega) MCFG_GFXDECODE(calomega) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/calorie.c mame-0.145/src/mame/drivers/calorie.c --- mame-0.144/src/mame/drivers/calorie.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/calorie.c 2012-02-06 21:30:40.000000000 +0000 @@ -136,22 +136,22 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( calorie ) +static SCREEN_UPDATE_IND16( calorie ) { - calorie_state *state = screen->machine().driver_data(); + calorie_state *state = screen.machine().driver_data(); int x; if (state->m_bg_bank & 0x10) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); } @@ -166,7 +166,7 @@ ypos = 0xff - state->m_sprites[x + 2]; xpos = state->m_sprites[x + 3]; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { if (state->m_sprites[x + 1] & 0x10) ypos = 0xff - ypos + 32; @@ -181,12 +181,12 @@ if (state->m_sprites[x + 1] & 0x10) { /* 32x32 sprites */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[3], tileno | 0x40, color, flipx, flipy, xpos, ypos - 31, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[3], tileno | 0x40, color, flipx, flipy, xpos, ypos - 31, 0); } else { /* 16x16 sprites */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2], tileno, color, flipx, flipy, xpos, ypos - 15, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[2], tileno, color, flipx, flipy, xpos, ypos - 15, 0); } } return 0; @@ -202,14 +202,14 @@ { calorie_state *state = space->machine().driver_data(); state->m_fg_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } static WRITE8_HANDLER( bg_bank_w ) { calorie_state *state = space->machine().driver_data(); if((state->m_bg_bank & ~0x10) != (data & ~0x10)) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_bg_bank = data; } @@ -449,10 +449,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(calorie) + MCFG_SCREEN_UPDATE_STATIC(calorie) MCFG_GFXDECODE(calorie) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/canyon.c mame-0.145/src/mame/drivers/canyon.c --- mame-0.144/src/mame/drivers/canyon.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/canyon.c 2012-02-06 21:30:38.000000000 +0000 @@ -246,10 +246,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(22 * 1000000 / 15750)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 240) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(canyon) + MCFG_SCREEN_UPDATE_STATIC(canyon) MCFG_GFXDECODE(canyon) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/capbowl.c mame-0.145/src/mame/drivers/capbowl.c --- mame-0.144/src/mame/drivers/capbowl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/capbowl.c 2012-02-06 21:30:34.000000000 +0000 @@ -374,7 +374,7 @@ MCFG_MACHINE_START(capbowl) MCFG_MACHINE_RESET(capbowl) - MCFG_NVRAM_ADD_CUSTOM("nvram", capbowl_state, init_nvram) + MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", capbowl_state, init_nvram) MCFG_TICKET_DISPENSER_ADD("ticket", 100, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW) @@ -382,11 +382,10 @@ MCFG_VIDEO_START(capbowl) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(360, 256) MCFG_SCREEN_VISIBLE_AREA(0, 359, 0, 244) MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_UPDATE(capbowl) + MCFG_SCREEN_UPDATE_STATIC(capbowl) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/capcom.c mame-0.145/src/mame/drivers/capcom.c --- mame-0.144/src/mame/drivers/capcom.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/capcom.c 2012-02-06 21:30:38.000000000 +0000 @@ -2,6 +2,8 @@ Capcom A0015405 */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -9,18 +11,28 @@ { public: capcom_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( capcom_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( capcom_map, AS_PROGRAM, 16, capcom_state ) AM_RANGE(0x0000, 0xffffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( capcom ) INPUT_PORTS_END -static MACHINE_RESET( capcom ) +void capcom_state::machine_reset() { } @@ -32,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16670000) // M68306 MCFG_CPU_PROGRAM_MAP(capcom_map) - - MCFG_MACHINE_RESET( capcom ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -277,17 +287,18 @@ ROM_REGION(0x00500000, "maincpu", ROMREGION_ERASEFF) ROM_END -GAME(1996, abv106, 0, capcom, capcom, capcom, ROT0, "Capcom", "Airborne", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, abv106r, abv106, capcom, capcom, capcom, ROT0, "Capcom", "Airborne (Redemption)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bbb109, 0, capcom, capcom, capcom, ROT0, "Capcom", "Big Bang Bar (Beta 1.9 US)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bbb108, bbb109, capcom, capcom, capcom, ROT0, "Capcom", "Big Bang Bar (Beta 1.8 US)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bsv103, 0, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bsv100r, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Redemption 1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bsv102r, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Redemption 1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, bsb105, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Beta)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ffv104, 0, capcom, capcom, capcom, ROT0, "Capcom", "Flipper Football (v1.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ffv101, ffv104, capcom, capcom, capcom, ROT0, "Capcom", "Flipper Football (v1.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, kpv106, 0, capcom, capcom, capcom, ROT0, "Capcom", "Kingpin", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, pmv112, 0, capcom, capcom, capcom, ROT0, "Capcom", "Pinball Magic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, pmv112r, pmv112, capcom, capcom, capcom, ROT0, "Capcom", "Pinball Magic (Redemption)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, ghv101, 0, capcom, capcom, capcom, ROT0, "Romstar", "Goofy Hoops", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1996, abv106, 0, capcom, capcom, capcom, ROT0, "Capcom", "Airborne", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, abv106r, abv106, capcom, capcom, capcom, ROT0, "Capcom", "Airborne (Redemption)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bbb109, 0, capcom, capcom, capcom, ROT0, "Capcom", "Big Bang Bar (Beta 1.9 US)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bbb108, bbb109, capcom, capcom, capcom, ROT0, "Capcom", "Big Bang Bar (Beta 1.8 US)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bsv103, 0, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bsv100r, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Redemption 1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bsv102r, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Redemption 1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, bsb105, bsv103, capcom, capcom, capcom, ROT0, "Capcom", "Breakshot (Beta)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ffv104, 0, capcom, capcom, capcom, ROT0, "Capcom", "Flipper Football (v1.04)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ffv101, ffv104, capcom, capcom, capcom, ROT0, "Capcom", "Flipper Football (v1.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, kpv106, 0, capcom, capcom, capcom, ROT0, "Capcom", "Kingpin", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, pmv112, 0, capcom, capcom, capcom, ROT0, "Capcom", "Pinball Magic", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, pmv112r, pmv112, capcom, capcom, capcom, ROT0, "Capcom", "Pinball Magic (Redemption)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, ghv101, 0, capcom, capcom, capcom, ROT0, "Romstar", "Goofy Hoops", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/cardline.c mame-0.145/src/mame/drivers/cardline.c --- mame-0.144/src/mame/drivers/cardline.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cardline.c 2012-02-06 21:30:40.000000000 +0000 @@ -44,11 +44,11 @@ x<<3, y<<3,\ transparency?transparency:(UINT32)-1); -static SCREEN_UPDATE( cardline ) +static SCREEN_UPDATE_IND16( cardline ) { - cardline_state *state = screen->machine().driver_data(); + cardline_state *state = screen.machine().driver_data(); int x,y; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); for(y=0;y<32;y++) { for(x=0;x<64;x++) @@ -56,14 +56,14 @@ int index=y*64+x; if(state->m_video&1) { - DRAW_TILE(screen->machine(),0,0); - DRAW_TILE(screen->machine(),0x800,1); + DRAW_TILE(screen.machine(),0,0); + DRAW_TILE(screen.machine(),0x800,1); } if(state->m_video&2) { - DRAW_TILE(screen->machine(),0x1000,0); - DRAW_TILE(screen->machine(),0x1800,1); + DRAW_TILE(screen.machine(),0x1000,0); + DRAW_TILE(screen.machine(),0x1800,1); } } } @@ -219,10 +219,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 35*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(cardline) + MCFG_SCREEN_UPDATE_STATIC(cardline) MCFG_GFXDECODE(cardline) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/carjmbre.c mame-0.145/src/mame/drivers/carjmbre.c --- mame-0.144/src/mame/drivers/carjmbre.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/carjmbre.c 2012-02-06 21:30:39.000000000 +0000 @@ -50,11 +50,19 @@ * *************************************/ +static WRITE8_HANDLER( nmi_mask_w ) +{ + carjmbre_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + + static ADDRESS_MAP_START( carjmbre_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM // AM_RANGE(0x8800, 0x8800) AM_READNOP // watchdog? - AM_RANGE(0x8803, 0x8803) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x8803, 0x8803) AM_WRITE(nmi_mask_w) AM_RANGE(0x8805, 0x8805) AM_WRITE(carjmbre_bgcolor_w) // guessed AM_RANGE(0x8806, 0x8806) AM_WRITE(carjmbre_8806_w) // video related? AM_RANGE(0x8807, 0x8807) AM_WRITE(carjmbre_flipscreen_w) @@ -184,12 +192,20 @@ state->m_bgcolor = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + carjmbre_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( carjmbre, carjmbre_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(carjmbre_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(carjmbre) @@ -202,10 +218,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(carjmbre) + MCFG_SCREEN_UPDATE_STATIC(carjmbre) MCFG_GFXDECODE(carjmbre) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/carpolo.c mame-0.145/src/mame/drivers/carpolo.c --- mame-0.144/src/mame/drivers/carpolo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/carpolo.c 2012-02-06 21:30:39.000000000 +0000 @@ -264,11 +264,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 239, 0, 255) - MCFG_SCREEN_UPDATE(carpolo) - MCFG_SCREEN_EOF(carpolo) + MCFG_SCREEN_UPDATE_STATIC(carpolo) + MCFG_SCREEN_VBLANK_STATIC(carpolo) MCFG_GFXDECODE(carpolo) MCFG_PALETTE_LENGTH(12*2+2*16+4*2) diff -Nru mame-0.144/src/mame/drivers/carrera.c mame-0.145/src/mame/drivers/carrera.c --- mame-0.144/src/mame/drivers/carrera.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/carrera.c 2012-02-06 21:30:39.000000000 +0000 @@ -244,9 +244,9 @@ GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 1 ) GFXDECODE_END -static SCREEN_UPDATE(carrera) +static SCREEN_UPDATE_IND16(carrera) { - carrera_state *state = screen->machine().driver_data(); + carrera_state *state = screen.machine().driver_data(); int x,y; int count = 0; @@ -257,7 +257,7 @@ { int tile = state->m_tileram[count&0x7ff] | state->m_tileram[(count&0x7ff)+0x800]<<8; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,0,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,0,0,0,x*8,y*8); count++; } } @@ -332,10 +332,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(carrera) + MCFG_SCREEN_UPDATE_STATIC(carrera) MCFG_MC6845_ADD("crtc", MC6845, MASTER_CLOCK / 16, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/castle.c mame-0.145/src/mame/drivers/castle.c --- mame-0.144/src/mame/drivers/castle.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/castle.c 2012-02-06 21:30:38.000000000 +0000 @@ -41,6 +41,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -48,14 +50,22 @@ { public: castle_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( V1rvE_mastermap, AS_PROGRAM, 8 ) + +static ADDRESS_MAP_START( V1rvE_mastermap, AS_PROGRAM, 8, castle_state ) AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( V1rvE_slavemap, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( V1rvE_slavemap, AS_PROGRAM, 8, castle_state ) AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -75,7 +85,7 @@ -static ADDRESS_MAP_START( V2rvA_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( V2rvA_map, AS_PROGRAM, 8, castle_state ) AM_RANGE(0x2000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -102,7 +112,7 @@ // 4.00 JACKPOT. VERSION 1 (for revision E CPU) Written by and copyright of David John Powell - 25th February 1987 -GAME( 1987, castrev, 0, castle_V1rvE, castrev, 0, ROT0, "Castle","Revolution (Castle) (MACH2000 V1rvE)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 1987, castrev, 0, castle_V1rvE, castrev, 0, ROT0, "Castle","Revolution (Castle) (MACH2000 V1rvE)",GAME_IS_SKELETON_MECHANICAL ) // I'm *guessing* this is on MACH2000 V2rvA hardware, it contains strings saying 'MACH 2000 test' and is designed for a single CPU. -GAME( 198?, castfpt, 0, castle_V2rvA, castrev, 0, ROT0, "Castle","Fortune Pot (Castle) (MACH2000 V2rvA)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, castfpt, 0, castle_V2rvA, castrev, 0, ROT0, "Castle","Fortune Pot (Castle) (MACH2000 V2rvA)",GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/caswin.c mame-0.145/src/mame/drivers/caswin.c --- mame-0.144/src/mame/drivers/caswin.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/caswin.c 2012-02-06 21:30:38.000000000 +0000 @@ -79,10 +79,10 @@ state->m_sc0_tilemap = tilemap_create(machine, get_sc0_tile_info,tilemap_scan_rows,8,8,32,32); } -static SCREEN_UPDATE(vvillage) +static SCREEN_UPDATE_IND16(vvillage) { - caswin_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); + caswin_state *state = screen.machine().driver_data(); + state->m_sc0_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -90,14 +90,14 @@ { caswin_state *state = space->machine().driver_data(); state->m_sc0_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( sc0_attr_w ) { caswin_state *state = space->machine().driver_data(); state->m_sc0_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); } /*These two are tested during the two cherry sub-games.I really don't know what is supposed to do...*/ @@ -302,10 +302,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(vvillage) + MCFG_SCREEN_UPDATE_STATIC(vvillage) MCFG_NVRAM_ADD_0FILL("nvram") diff -Nru mame-0.144/src/mame/drivers/cave.c mame-0.145/src/mame/drivers/cave.c --- mame-0.144/src/mame/drivers/cave.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cave.c 2012-02-06 21:30:37.000000000 +0000 @@ -1867,10 +1867,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(dfeveron) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -1910,10 +1909,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(ddonpach) MCFG_PALETTE_LENGTH(0x8000 + 0x40*16) // $400 extra entries for layers 1&2 @@ -1957,10 +1955,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(donpachi) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2004,10 +2001,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(esprade) MCFG_PALETTE_LENGTH(0x8000) @@ -2045,10 +2041,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(esprade) MCFG_PALETTE_LENGTH(0x8000) @@ -2087,10 +2082,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(esprade) MCFG_PALETTE_LENGTH(0x8000) @@ -2132,10 +2126,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 240) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(hotdogst) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2185,10 +2178,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1-2, 0, 240-1-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(korokoro) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2240,10 +2232,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 240) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(mazinger) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2299,10 +2290,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 240) MCFG_SCREEN_VISIBLE_AREA(0x7d, 0x7d + 0x180-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(donpachi) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2355,10 +2345,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 240) MCFG_SCREEN_VISIBLE_AREA(0x80, 0x80 + 0x140-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(tjumpman) MCFG_PALETTE_LENGTH(0x8000) @@ -2412,10 +2401,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 240) MCFG_SCREEN_VISIBLE_AREA(0x70, 0x70 + 0x140-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(pwrinst2) MCFG_PALETTE_LENGTH(0x8000+0x2800) @@ -2476,10 +2464,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320+1, 240) MCFG_SCREEN_VISIBLE_AREA(0+1, 320+1-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(sailormn) MCFG_PALETTE_LENGTH(0x8000) /* $8000 palette entries for consistency with the other games */ @@ -2531,10 +2518,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 240) MCFG_SCREEN_VISIBLE_AREA(0x80, 0x80 + 0x140-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(tjumpman) MCFG_PALETTE_LENGTH(0x8000) @@ -2573,10 +2559,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(15625/271.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(cave) + MCFG_SCREEN_UPDATE_STATIC(cave) MCFG_GFXDECODE(uopoko) MCFG_PALETTE_LENGTH(0x8000) diff -Nru mame-0.144/src/mame/drivers/cb2001.c mame-0.145/src/mame/drivers/cb2001.c --- mame-0.144/src/mame/drivers/cb2001.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/cb2001.c 2012-02-06 21:30:40.000000000 +0000 @@ -321,16 +321,11 @@ */ -// these areas are wrong -static const rectangle visible1 = { 0*8, (14+48)*8-1, 3*8, (3+7)*8-1 }; -static const rectangle visible2 = { 0*8, (14+48)*8-1, 10*8, (10+7)*8-1 }; -static const rectangle visible3 = { 0*8, (14+48)*8-1, 17*8, (17+7)*8-1 }; - -static SCREEN_UPDATE(cb2001) +static SCREEN_UPDATE_RGB32(cb2001) { - cb2001_state *state = screen->machine().driver_data(); + cb2001_state *state = screen.machine().driver_data(); int count,x,y; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = 0x0000; @@ -351,7 +346,7 @@ tile += state->m_videobank*0x2000; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,colour,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,colour,0,0,x*8,y*8); count++; } @@ -370,27 +365,32 @@ scroll >>=8; scroll &=0xff; - tilemap_set_scrolly(state->m_reel2_tilemap, i, scroll); + state->m_reel2_tilemap->set_scrolly(i, scroll); scroll = state->m_vram_bg[0x800/2 + i/2]; if (i&1) scroll >>=8; scroll &=0xff; - tilemap_set_scrolly(state->m_reel1_tilemap, i, scroll); + state->m_reel1_tilemap->set_scrolly(i, scroll); scroll = state->m_vram_bg[0xc00/2 + i/2]; if (i&1) scroll >>=8; scroll &=0xff; - tilemap_set_scrolly(state->m_reel3_tilemap, i, scroll); + state->m_reel3_tilemap->set_scrolly(i, scroll); } - tilemap_draw(bitmap, &visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &visible3, state->m_reel3_tilemap, 0, 0); + // these areas are wrong + const rectangle visible1(0*8, (14+48)*8-1, 3*8, (3+7)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 10*8, (10+7)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 17*8, (17+7)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } } @@ -412,7 +412,7 @@ tile += 0x1000; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],tile,colour,0,0,x*8,y*8,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0],tile,colour,0,0,x*8,y*8,0); count++; } } @@ -518,9 +518,9 @@ state->m_reel2_tilemap = tilemap_create(machine,get_cb2001_reel2_tile_info,tilemap_scan_rows, 8, 32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_cb2001_reel3_tile_info,tilemap_scan_rows, 8, 32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); } WRITE16_HANDLER( cb2001_bg_w ) @@ -532,24 +532,24 @@ /* if (offset<0x200/2) { - tilemap_mark_tile_dirty(state->m_reel1_tilemap,(offset&0xff)/2); + state->m_reel1_tilemap->mark_tile_dirty((offset&0xff)/2); } else if (offset<0x400/2) { - tilemap_mark_tile_dirty(state->m_reel2_tilemap,(offset&0xff)/2); + state->m_reel2_tilemap->mark_tile_dirty((offset&0xff)/2); } else if (offset<0x600/2) { - tilemap_mark_tile_dirty(state->m_reel3_tilemap,(offset&0xff)/2); + state->m_reel3_tilemap->mark_tile_dirty((offset&0xff)/2); } else if (offset<0x800/2) { - // tilemap_mark_tile_dirty(reel4_tilemap,(offset&0xff)/2); + // reel4_tilemap->mark_tile_dirty((offset&0xff)/2); } */ - tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap); + state->m_reel1_tilemap->mark_all_dirty(); + state->m_reel2_tilemap->mark_all_dirty(); + state->m_reel3_tilemap->mark_all_dirty(); } @@ -844,10 +844,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(cb2001) + MCFG_SCREEN_UPDATE_STATIC(cb2001) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/cball.c mame-0.145/src/mame/drivers/cball.c --- mame-0.144/src/mame/drivers/cball.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cball.c 2012-02-06 21:30:41.000000000 +0000 @@ -39,7 +39,7 @@ cball_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -50,15 +50,15 @@ } -static SCREEN_UPDATE( cball ) +static SCREEN_UPDATE_IND16( cball ) { - cball_state *state = screen->machine().driver_data(); + cball_state *state = screen.machine().driver_data(); /* draw playfield */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw sprite */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_video_ram[0x399] >> 4, 0, 0, 0, @@ -235,10 +235,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223) - MCFG_SCREEN_UPDATE(cball) + MCFG_SCREEN_UPDATE_STATIC(cball) MCFG_GFXDECODE(cball) MCFG_PALETTE_LENGTH(6) diff -Nru mame-0.144/src/mame/drivers/cbasebal.c mame-0.145/src/mame/drivers/cbasebal.c --- mame-0.144/src/mame/drivers/cbasebal.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/cbasebal.c 2012-02-06 21:30:34.000000000 +0000 @@ -295,10 +295,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(cbasebal) + MCFG_SCREEN_UPDATE_STATIC(cbasebal) MCFG_GFXDECODE(cbasebal) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/cbuster.c mame-0.145/src/mame/drivers/cbuster.c --- mame-0.144/src/mame/drivers/cbuster.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cbuster.c 2012-02-06 21:30:40.000000000 +0000 @@ -342,10 +342,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(twocrude) + MCFG_SCREEN_UPDATE_STATIC(twocrude) MCFG_VIDEO_START(twocrude) MCFG_GFXDECODE(cbuster) diff -Nru mame-0.144/src/mame/drivers/ccastles.c mame-0.145/src/mame/drivers/ccastles.c --- mame-0.144/src/mame/drivers/ccastles.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ccastles.c 2012-02-06 21:30:42.000000000 +0000 @@ -210,10 +210,7 @@ assert(state->m_vblank_end < state->m_vblank_start); /* reconfigure the visible area to match */ - visarea.min_x = 0; - visarea.max_x = 255; - visarea.min_y = state->m_vblank_end; - visarea.max_y = state->m_vblank_start - 1; + visarea.set(0, 255, state->m_vblank_end, state->m_vblank_start - 1); machine.primary_screen->configure(320, 256, visarea, HZ_TO_ATTOSECONDS(PIXEL_CLOCK) * VTOTAL * HTOTAL); /* configure the ROM banking */ @@ -496,9 +493,8 @@ MCFG_PALETTE_LENGTH(32) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, 0, HTOTAL - 1, VTOTAL, 0, VTOTAL - 1) /* will be adjusted later */ - MCFG_SCREEN_UPDATE(ccastles) + MCFG_SCREEN_UPDATE_STATIC(ccastles) MCFG_VIDEO_START(ccastles) diff -Nru mame-0.144/src/mame/drivers/cchance.c mame-0.145/src/mame/drivers/cchance.c --- mame-0.144/src/mame/drivers/cchance.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cchance.c 2012-02-06 21:30:34.000000000 +0000 @@ -231,11 +231,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT(arknoid2) diff -Nru mame-0.144/src/mame/drivers/cchasm.c mame-0.145/src/mame/drivers/cchasm.c --- mame-0.144/src/mame/drivers/cchasm.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/cchasm.c 2012-02-06 21:30:39.000000000 +0000 @@ -171,7 +171,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 768-1) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(cchasm) diff -Nru mame-0.144/src/mame/drivers/cclimber.c mame-0.145/src/mame/drivers/cclimber.c --- mame-0.144/src/mame/drivers/cclimber.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cclimber.c 2012-02-06 21:30:42.000000000 +0000 @@ -256,26 +256,24 @@ memory_set_bank(space->machine(), "bank1", state->m_toprollr_rombank); } - -static TIMER_CALLBACK( disable_interrupts ) -{ - cpu_interrupt_enable(machine.device("maincpu"), 0); -} - - static MACHINE_RESET( cclimber ) { cclimber_state *state = machine.driver_data(); - /* Disable interrupts, River Patrol / Silver Land needs this */ - /* we must do this on a timer in order to have it take effect */ - /* otherwise, the reset process will override our changes */ - machine.scheduler().synchronize(FUNC(disable_interrupts)); + /* Disable interrupts, River Patrol / Silver Land needs this otherwise returns bad RAM on POST */ + state->m_nmi_mask = 0; state->m_toprollr_rombank = 0; } +static WRITE8_HANDLER( nmi_mask_w ) +{ + cclimber_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + /* Note that River Patrol reads/writes to a000-a4f0. This is a bug in the code. The instruction at 0x0593 should say LD DE,$8000 */ @@ -294,9 +292,9 @@ AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, m_bigsprite_control) AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */ AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, m_colorram) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_flip_screen) - AM_RANGE(0xa003, 0xa003) AM_WRITE(interrupt_enable_w) //used by Crazy Kong Bootleg with alt levels and speed up + AM_RANGE(0xa003, 0xa003) AM_WRITE(nmi_mask_w) //used by Crazy Kong Bootleg with alt levels and speed up AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_WRITE(cclimber_sample_rate_w) AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(cclimber_sample_volume_w) @@ -318,7 +316,7 @@ AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, m_bigsprite_control) AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */ AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, m_colorram) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITE(cannonb_flip_screen_w) AM_BASE_MEMBER(cclimber_state, m_flip_screen) AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_WRITE(cclimber_sample_rate_w) @@ -335,7 +333,7 @@ AM_RANGE(0x9880, 0x989f) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_spriteram) AM_RANGE(0x98fc, 0x98ff) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_bigsprite_control) AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, m_colorram) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_WRITE(nmi_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_flip_screen) AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_swimmer_side_background_enabled) AM_RANGE(0xa004, 0xa004) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_swimmer_palettebank) @@ -361,7 +359,7 @@ AM_RANGE(0x98dc, 0x98df) AM_RAM AM_BASE_MEMBER(cclimber_state, m_bigsprite_control) AM_RANGE(0x9800, 0x9bff) AM_RAM /* not used, but initialized */ AM_RANGE(0x9c00, 0x9fff) AM_RAM_WRITE(cclimber_colorram_w) AM_BASE_MEMBER(cclimber_state, m_colorram) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_flip_screen) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") @@ -380,7 +378,7 @@ AM_RANGE(0x9880, 0x995f) AM_RAM AM_BASE_MEMBER(cclimber_state, m_spriteram) AM_RANGE(0x99dc, 0x99df) AM_RAM AM_BASE_MEMBER(cclimber_state, m_bigsprite_control) AM_RANGE(0x9c00, 0x9fff) AM_RAM AM_BASE_MEMBER(cclimber_state, m_colorram) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w) AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_BASE_MEMBER(cclimber_state, m_flip_screen) AM_RANGE(0xa004, 0xa004) AM_WRITE(cclimber_sample_trigger_w) AM_RANGE(0xa005, 0xa006) AM_WRITE(toprollr_rombank_w) @@ -982,7 +980,13 @@ GFXDECODE_ENTRY( "gfx3", 0x0000, cclimber_charlayout, 24*4, 16 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + cclimber_state *state = device->machine().driver_data(); + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( root, cclimber_state ) @@ -990,7 +994,7 @@ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/3/2) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(cclimber_map) MCFG_CPU_IO_MAP(cclimber_portmap) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(cclimber) @@ -998,10 +1002,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cclimber) + MCFG_SCREEN_UPDATE_STATIC(cclimber) MCFG_GFXDECODE(cclimber) MCFG_PALETTE_LENGTH(16*4+8*4) @@ -1052,7 +1055,7 @@ MCFG_PALETTE_LENGTH(16*4+8*4+256) MCFG_PALETTE_INIT(yamato) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(yamato) + MCFG_SCREEN_UPDATE_STATIC(yamato) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1078,7 +1081,7 @@ MCFG_VIDEO_START(toprollr) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(toprollr) + MCFG_SCREEN_UPDATE_STATIC(toprollr) MACHINE_CONFIG_END @@ -1087,7 +1090,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(swimmer_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,XTAL_4MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(swimmer_audio_map) @@ -1098,10 +1101,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.57) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(swimmer) + MCFG_SCREEN_UPDATE_STATIC(swimmer) MCFG_GFXDECODE(swimmer) MCFG_PALETTE_LENGTH(32*8+4*8+1) @@ -1958,6 +1960,37 @@ ROM_LOAD( "guzzler.001", 0x0200, 0x020, CRC(69089495) SHA1(96b067b22be14536bac748f8d61e5587a8a04e92) ) ROM_END +ROM_START( guzzlers ) /* Swimmer Conversion, 1k vs 2k romsize in maincpu */ + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "guzz1.l9", 0x0000, 0x1000, CRC(48f751ee) SHA1(a8ff19d150d382a43ad705fe2a470450e317aac3) ) + ROM_LOAD( "guzz2.k9", 0x1000, 0x1000, CRC(c13f23e6) SHA1(2cd31e0419875c50433f1763e35e32afcaf68fde) ) + ROM_LOAD( "guzz3.j9", 0x2000, 0x1000, CRC(7a523fd8) SHA1(683249d2ffdde21f74d80280e538645ac143d45c) ) + ROM_LOAD( "guzz4.f9", 0x3000, 0x1000, CRC(d2bb2204) SHA1(87f821f1cb92577e10beb67be29d9eecd9e8a04f) ) + ROM_LOAD( "guzz5.e9", 0x4000, 0x1000, CRC(09856fd0) SHA1(f2eeffe2c35f652a855502f808fd5056252ce7fd) ) + ROM_LOAD( "guzz6.d9", 0x5000, 0x1000, CRC(80990d1e) SHA1(282f5247b88f29ee6178c771ecddf2a5ed995913) ) + ROM_LOAD( "guzz7.c9", 0x6000, 0x1000, CRC(fe37b99d) SHA1(9219fe4506e81e574f5ae84ec10dc1df511f76a1) ) + ROM_LOAD( "guzz8.a9", 0x7000, 0x1000, CRC(8d44f5f8) SHA1(957f1b880f6f815ac31c1a37c40cdff75dd119cf) ) + ROM_LOAD( "guzz-16.bin", 0xe000, 0x2000, CRC(61ee00b7) SHA1(ea8516c8dfb2de32a8034f94c7d0c086e3596740) ) // 16. + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "guzz-12.bin", 0x0000, 0x1000, CRC(f3754d9e) SHA1(bb30832aba4e82ab0ecce40fc1223d9771ff7dd2) ) // GUZZ12.L4 + + ROM_REGION( 0x3000, "gfx1", 0 ) /* chars */ + ROM_LOAD( "guzz-13.bin", 0x0000, 0x1000, CRC(afc464e2) SHA1(61730b5e5add24ba3d4e8903c5d71cf4df9b77e0) ) // GUZZ13.JK18 + ROM_LOAD( "guzz-14.bin", 0x1000, 0x1000, CRC(acbdfe1f) SHA1(ab7abe4bb321fc7dc4e73acab4b1a7133e6bcf20) ) // GUZZ14.L18 + ROM_LOAD( "guzz-15.bin", 0x2000, 0x1000, CRC(66978c05) SHA1(2c8d5545f8b1d3cd7cd63448f8064fd3712d6fee) ) // GUZZ15.MN18 + + ROM_REGION( 0x3000, "gfx2", 0 ) /* big sprite */ + ROM_LOAD( "guzz-11.bin", 0x0000, 0x1000, CRC(ec2e9d86) SHA1(2fc631229e78db68777e74a03f98f660f324a885) ) // 11.C6 + ROM_LOAD( "guzz-10.bin", 0x1000, 0x1000, CRC(bd3f0bf7) SHA1(c57aff05812801c22104a4afc8a8a6bca33dda96) ) // 10.C5 + ROM_LOAD( "guzz-09.bin", 0x2000, 0x1000, CRC(18927579) SHA1(414676193ef1f6ce79a4cba73e4d017312f766f4) ) // 9.C4 + + ROM_REGION( 0x0220, "proms", 0 ) + ROM_LOAD( "guzzler.003", 0x0000, 0x100, CRC(f86930c1) SHA1(58efc8cbef05e1612d12e2f0babddf15571d42bb) ) // B.B13 + ROM_LOAD( "guzzler.002", 0x0100, 0x100, CRC(b566ea9e) SHA1(345078af6a339fbe6cd966046acd9d04c8926b5c) ) // A.A13 + ROM_LOAD( "c.c12", 0x0200, 0x020, CRC(51cd9980) SHA1(9c4858a01c9b03ff8c87ba9f11049e0c1af5d519) ) +ROM_END + ROM_START( yamato ) ROM_REGION( 2*0x10000, "maincpu", 0 ) ROM_LOAD( "2.5de", 0x0000, 0x2000, CRC(20895096) SHA1(af76786e3c519e710899f143d46c53087e9817c7) ) @@ -2117,6 +2150,7 @@ GAME( 1982, swimmerb, swimmer, swimmer, swimmerb, 0, ROT0, "Tehkan", "Swimmer (set 3)", 0 ) GAME( 1983, guzzler, 0, swimmer, guzzler, 0, ROT90, "Tehkan", "Guzzler", 0 ) +GAME( 1983, guzzlers, guzzler, swimmer, guzzler, 0, ROT90, "Tehkan", "Guzzler (Swimmer Conversion)", 0 ) GAME( 1983, yamato, 0, yamato, yamato, yamato, ROT90, "Sega", "Yamato (US)", GAME_IMPERFECT_GRAPHICS ) GAME( 1983, yamato2, yamato, yamato, yamato, yamato, ROT90, "Sega", "Yamato (World?)", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/cd32.c mame-0.145/src/mame/drivers/cd32.c --- mame-0.144/src/mame/drivers/cd32.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cd32.c 2012-02-06 21:30:37.000000000 +0000 @@ -777,10 +777,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512*2, 312) MCFG_SCREEN_VISIBLE_AREA((129-8-8)*2, (449+8-1+8)*2, 44-8, 300+8-1) - MCFG_SCREEN_UPDATE(amiga_aga) + MCFG_SCREEN_UPDATE_STATIC(amiga_aga) MCFG_VIDEO_START(amiga_aga) diff -Nru mame-0.144/src/mame/drivers/cdi.c mame-0.145/src/mame/drivers/cdi.c --- mame-0.144/src/mame/drivers/cdi.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cdi.c 2012-02-06 21:30:34.000000000 +0000 @@ -229,6 +229,15 @@ scc68070_set_quizard_mcu_ack(machine, 0x5a); } +/* Untested - copied from quizrd17 */ +static MACHINE_RESET( quizrd18 ) +{ + MACHINE_RESET_CALL( cdi ); + + scc68070_set_quizard_mcu_value(machine, 0x021f); + scc68070_set_quizard_mcu_ack(machine, 0x5a); +} + static MACHINE_RESET( quizrd22 ) { MACHINE_RESET_CALL( cdi ); @@ -241,6 +250,19 @@ scc68070_set_quizard_mcu_ack(machine, 0x59); } +/* Untested - copied from quizrd22 */ +static MACHINE_RESET( quizrd23 ) +{ + MACHINE_RESET_CALL( cdi ); + + // 0x2b1: Italian + // 0x001: French + // 0x188: German + + scc68070_set_quizard_mcu_value(machine, 0x188); + scc68070_set_quizard_mcu_ack(machine, 0x59); +} + static MACHINE_RESET( quizrd32 ) { MACHINE_RESET_CALL( cdi ); @@ -249,6 +271,15 @@ scc68070_set_quizard_mcu_ack(machine, 0x58); } +/* Untested - copied from quizrd32 */ +static MACHINE_RESET( quizrd34 ) +{ + MACHINE_RESET_CALL( cdi ); + + scc68070_set_quizard_mcu_value(machine, 0x00ae); + scc68070_set_quizard_mcu_ack(machine, 0x58); +} + /* Untested - copied from quizrr41 */ static MACHINE_RESET( quizrr40 ) { @@ -272,7 +303,7 @@ { MACHINE_RESET_CALL( cdi ); - scc68070_set_quizard_mcu_value(machine, 0x011f); + scc68070_set_quizard_mcu_value(machine, 0x01ae); scc68070_set_quizard_mcu_ack(machine, 0x57); } @@ -301,18 +332,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(384, 302) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 22, 302-1) //dynamic resolution,TODO - MCFG_SCREEN_UPDATE(cdimono1) + MCFG_SCREEN_UPDATE_STATIC(cdimono1) MCFG_SCREEN_ADD("lcd", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(192, 22) MCFG_SCREEN_VISIBLE_AREA(0, 192-1, 0, 22-1) - MCFG_SCREEN_UPDATE(cdimono1_lcd) + MCFG_SCREEN_UPDATE_STATIC(cdimono1_lcd) MCFG_PALETTE_LENGTH(0x100) @@ -371,14 +400,26 @@ MCFG_MACHINE_RESET( quizrd17 ) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( quizrd18, quizard ) + MCFG_MACHINE_RESET( quizrd18 ) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( quizrd22, quizard ) MCFG_MACHINE_RESET( quizrd22 ) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( quizrd23, quizard ) + MCFG_MACHINE_RESET( quizrd23 ) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( quizrd32, quizard ) MCFG_MACHINE_RESET( quizrd32 ) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( quizrd34, quizard ) + MCFG_MACHINE_RESET( quizrd34 ) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( quizrr40, quizard ) MCFG_MACHINE_RESET( quizrr40 ) MACHINE_CONFIG_END @@ -475,6 +516,48 @@ DISK_IMAGE_READONLY( "quizrd12", 0, SHA1(6e41683b96b74e903040842aeb18437ad7813c82) ) ROM_END +ROM_START( quizrd18 ) /* CD-ROM printed ??/?? */ + ROM_REGION(0x80000, "maincpu", 0) + ROM_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e) ) + + ROM_REGION(0x2000, "cdic", 0) + ROM_LOAD( "cdic.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + ROM_REGION(0x2000, "slave", 0) + ROM_LOAD( "slave.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + DISK_REGION( "cdrom" ) + DISK_IMAGE_READONLY( "quizrd18", 0, SHA1(ede873b22957f2a707bbd3039e962ef2ca5aedbd) ) +ROM_END + +ROM_START( quizrd23 ) /* CD-ROM printed ??/?? */ + ROM_REGION(0x80000, "maincpu", 0) + ROM_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e) ) + + ROM_REGION(0x2000, "cdic", 0) + ROM_LOAD( "cdic.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + ROM_REGION(0x2000, "slave", 0) + ROM_LOAD( "slave.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + DISK_REGION( "cdrom" ) + DISK_IMAGE_READONLY( "quizrd23", 0, SHA1(cd909d9a54275d6f2d36e03e83eea996e781b4d3) ) +ROM_END + +ROM_START( quizrd34 ) /* CD-ROM printed ??/?? */ + ROM_REGION(0x80000, "maincpu", 0) + ROM_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e) ) + + ROM_REGION(0x2000, "cdic", 0) + ROM_LOAD( "cdic.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + ROM_REGION(0x2000, "slave", 0) + ROM_LOAD( "slave.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping + + DISK_REGION( "cdrom" ) + DISK_IMAGE_READONLY( "quizrd34", 0, SHA1(37ad49b72b5175afbb87141d57bc8604347fe032) ) +ROM_END + ROM_START( quizrr42 ) /* CD-ROM printed 09/98 */ ROM_REGION(0x80000, "maincpu", 0) ROM_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e) ) @@ -532,6 +615,10 @@ GAME( 1995, quizrd17, cdimono1, quizrd17, quizard, 0, ROT0, "TAB Austria", "Quizard 1.7", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) GAME( 1995, quizrd22, cdimono1, quizrd22, quizard, 0, ROT0, "TAB Austria", "Quizard 2.2", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) +GAME( 1995, quizrd18, cdimono1, quizrd18, quizard, 0, ROT0, "TAB Austria", "Quizard 1.8", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) +GAME( 1995, quizrd23, cdimono1, quizrd23, quizard, 0, ROT0, "TAB Austria", "Quizard 2.3", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) +GAME( 1995, quizrd34, cdimono1, quizrd34, quizard, 0, ROT0, "TAB Austria", "Quizard 3.4", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) + // Partially working GAME( 1996, quizard, cdimono1, quizrd32, quizard, 0, ROT0, "TAB Austria", "Quizard 3.2", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) GAME( 1997, quizrr40, cdimono1, quizrr40, quizard, 0, ROT0, "TAB Austria", "Quizard Rainbow 4.0", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION ) diff -Nru mame-0.144/src/mame/drivers/centiped.c mame-0.145/src/mame/drivers/centiped.c --- mame-0.144/src/mame/drivers/centiped.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/centiped.c 2012-02-06 21:30:41.000000000 +0000 @@ -699,9 +699,9 @@ AM_RANGE(0x0c03, 0x0c03) AM_READ_PORT("IN3") /* IN3 */ AM_RANGE(0x1000, 0x100f) AM_DEVREADWRITE("pokey", pokey_r, pokey_w) AM_RANGE(0x1400, 0x140f) AM_WRITE(centiped_paletteram_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x1600, 0x163f) AM_DEVWRITE("earom", atari_vg_earom_w) - AM_RANGE(0x1680, 0x1680) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x1700, 0x173f) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x1600, 0x163f) AM_DEVWRITE_MODERN("earom",atari_vg_earom_device, write) + AM_RANGE(0x1680, 0x1680) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x1700, 0x173f) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x1800, 0x1800) AM_WRITE(irq_ack_w) AM_RANGE(0x1c00, 0x1c02) AM_WRITE(coin_count_w) AM_RANGE(0x1c03, 0x1c04) AM_WRITE(led_w) @@ -725,9 +725,9 @@ AM_RANGE(0x1000, 0x1001) AM_MIRROR(0x4000) AM_DEVWRITE("pokey", ay8910_data_address_w) AM_RANGE(0x1001, 0x1001) AM_MIRROR(0x4000) AM_DEVREAD("pokey", ay8910_r) AM_RANGE(0x1400, 0x140f) AM_MIRROR(0x4000) AM_WRITE(centiped_paletteram_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0x1600, 0x163f) AM_MIRROR(0x4000) AM_DEVWRITE("earom", atari_vg_earom_w) - AM_RANGE(0x1680, 0x1680) AM_MIRROR(0x4000) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x1700, 0x173f) AM_MIRROR(0x4000) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x1600, 0x163f) AM_MIRROR(0x4000) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) + AM_RANGE(0x1680, 0x1680) AM_MIRROR(0x4000) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x1700, 0x173f) AM_MIRROR(0x4000) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x1800, 0x1800) AM_MIRROR(0x4000) AM_WRITE(irq_ack_w) AM_RANGE(0x1c00, 0x1c02) AM_MIRROR(0x4000) AM_WRITE(coin_count_w) AM_RANGE(0x1c03, 0x1c04) AM_MIRROR(0x4000) AM_WRITE(led_w) @@ -756,7 +756,7 @@ AM_RANGE(0x2001, 0x2001) AM_READ(milliped_IN1_r) AM_RANGE(0x2010, 0x2010) AM_READ(milliped_IN2_r) AM_RANGE(0x2011, 0x2011) AM_READ_PORT("IN3") - AM_RANGE(0x2030, 0x2030) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x2030, 0x2030) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x2480, 0x249f) AM_WRITE(milliped_paletteram_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x2500, 0x2502) AM_WRITE(coin_count_w) AM_RANGE(0x2503, 0x2504) AM_WRITE(led_w) @@ -765,8 +765,8 @@ AM_RANGE(0x2507, 0x2507) AM_WRITE(control_select_w) /* CNTRLSEL */ AM_RANGE(0x2600, 0x2600) AM_WRITE(irq_ack_w) AM_RANGE(0x2680, 0x2680) AM_WRITE(watchdog_reset_w) - AM_RANGE(0x2700, 0x2700) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x2780, 0x27bf) AM_DEVWRITE("earom", atari_vg_earom_w) + AM_RANGE(0x2700, 0x2700) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x2780, 0x27bf) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) AM_RANGE(0x4000, 0x7fff) AM_ROM ADDRESS_MAP_END @@ -815,7 +815,7 @@ AM_RANGE(0x2010, 0x2010) AM_READ_PORT("IN2") AM_RANGE(0x2011, 0x2011) AM_READ_PORT("IN3") AM_RANGE(0x2020, 0x2020) AM_READ(mazeinv_input_r) - AM_RANGE(0x2030, 0x2030) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x2030, 0x2030) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x2480, 0x249f) AM_WRITE(mazeinv_paletteram_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x2500, 0x2502) AM_WRITE(coin_count_w) AM_RANGE(0x2503, 0x2504) AM_WRITE(led_w) @@ -824,8 +824,8 @@ AM_RANGE(0x2580, 0x2583) AM_WRITE(mazeinv_input_select_w) AM_RANGE(0x2600, 0x2600) AM_WRITE(irq_ack_w) AM_RANGE(0x2680, 0x2680) AM_WRITE(watchdog_reset_w) - AM_RANGE(0x2700, 0x2700) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x2780, 0x27bf) AM_DEVWRITE("earom", atari_vg_earom_w) + AM_RANGE(0x2700, 0x2700) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x2780, 0x27bf) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) AM_RANGE(0x3000, 0x7fff) AM_ROM ADDRESS_MAP_END @@ -843,8 +843,8 @@ AM_RANGE(0x1080, 0x1080) AM_MIRROR(0x6000) AM_READ(centiped_IN0_r) AM_RANGE(0x1081, 0x1081) AM_MIRROR(0x6000) AM_READ_PORT("IN1") AM_RANGE(0x1082, 0x1082) AM_MIRROR(0x6000) AM_READ(centiped_IN2_r) - AM_RANGE(0x1200, 0x123f) AM_MIRROR(0x6000) AM_DEVREADWRITE("earom", atari_vg_earom_r, atari_vg_earom_w) - AM_RANGE(0x1280, 0x1280) AM_MIRROR(0x6000) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) + AM_RANGE(0x1200, 0x123f) AM_MIRROR(0x6000) AM_DEVREADWRITE_MODERN("earom",atari_vg_earom_device, read, write) + AM_RANGE(0x1280, 0x1280) AM_MIRROR(0x6000) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) AM_RANGE(0x1300, 0x1300) AM_MIRROR(0x6000) AM_READ_PORT("DSW2") AM_RANGE(0x1400, 0x140f) AM_MIRROR(0x6000) AM_WRITE(centiped_paletteram_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x1481, 0x1481) AM_MIRROR(0x6000) AM_WRITE(bullsdrt_coin_count_w) @@ -1615,10 +1615,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(centiped) + MCFG_SCREEN_UPDATE_STATIC(centiped) MCFG_GFXDECODE(centiped) MCFG_PALETTE_LENGTH(4+4*4*4*4) @@ -1680,7 +1679,7 @@ MCFG_VIDEO_START(milliped) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(milliped) + MCFG_SCREEN_UPDATE_STATIC(milliped) /* sound hardware */ MCFG_SOUND_REPLACE("pokey", POKEY, 12096000/8) @@ -1706,7 +1705,7 @@ MCFG_PALETTE_INIT(warlords) MCFG_VIDEO_START(warlords) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(warlords) + MCFG_SCREEN_UPDATE_STATIC(warlords) /* sound hardware */ MCFG_SOUND_REPLACE("pokey", POKEY, 12096000/8) @@ -1721,7 +1720,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(mazeinv_map) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(centiped) + MCFG_SCREEN_UPDATE_STATIC(centiped) MACHINE_CONFIG_END @@ -1737,10 +1736,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(bullsdrt) + MCFG_SCREEN_UPDATE_STATIC(bullsdrt) MCFG_GFXDECODE(centiped) MCFG_PALETTE_LENGTH(4+4*4*4*4) diff -Nru mame-0.144/src/mame/drivers/cesclass.c mame-0.145/src/mame/drivers/cesclass.c --- mame-0.144/src/mame/drivers/cesclass.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cesclass.c 2012-02-06 21:30:37.000000000 +0000 @@ -2,62 +2,272 @@ CES Classic wall games + driver by Angelo Salese + + Notes: + - to play Home Run Classic you have to select a pitcher shot and keep pressed the + wall strobe. When you release the strobe, batter does the swing. + + TODO: + - custom layout for dual LCDs + - artwork and lamps position needed to make progresses + - U43 and U44 bad in Trap Shoot Classic + - games are incredibly sluggish by now + - irq sources are unknown + - sound doesn't play most samples + - Trap Shoot Classic runs on a single LCD, needs mods + */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" +#include "sound/okim6295.h" +#include "rendlay.h" +#include "machine/nvram.h" class cesclassic_state : public driver_device { public: cesclassic_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) {} + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_oki(*this, "oki") + { } + + DECLARE_WRITE16_MEMBER(irq2_ack_w); + DECLARE_WRITE16_MEMBER(irq3_ack_w); + DECLARE_WRITE16_MEMBER(lamps_w); + DECLARE_WRITE16_MEMBER(outputs_w); + + UINT16 *m_vram; + + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + +protected: + + // devices + required_device m_maincpu; + required_device m_oki; + + // driver_device overrides + virtual void video_start(); + }; -static VIDEO_START( cesclassic ) + +void cesclassic_state::video_start() { } -static SCREEN_UPDATE( cesclassic ) +UINT32 cesclassic_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { + int x,y,xi; + + bitmap.fill(get_black_pen(machine()), cliprect); + + { + for(y=0;y<64;y++) + { + for(x=0;x<16;x++) + { + for(xi=0;xi<16;xi++) + { + UINT8 color; + + color = (((m_vram[x+y*16+0x400])>>(15-xi)) & 1); + color |= (((m_vram[x+y*16])>>(15-xi)) & 1)<<1; + + if((x*16+xi)<256 && ((y)+0)<256) + bitmap.pix32(y, x*16+xi) = machine().pens[color]; + } + } + } + } + return 0; } -static READ16_HANDLER(cesclassic_60000_r) +WRITE16_MEMBER( cesclassic_state::irq2_ack_w ) +{ + device_set_input_line(m_maincpu, 2, CLEAR_LINE); +} + +WRITE16_MEMBER( cesclassic_state::irq3_ack_w ) { - return 0x100 | 0x200; + device_set_input_line(m_maincpu, 3, CLEAR_LINE); } -static ADDRESS_MAP_START( cesclassic_map, AS_PROGRAM, 16 ) +WRITE16_MEMBER( cesclassic_state::lamps_w ) +{ + //popmessage("%04x",data); +} + +WRITE16_MEMBER( cesclassic_state::outputs_w ) +{ + /* + -x-- ---- OKI bankswitch + --x- ---- probably screen enable + ---- --x- coin counter + */ + m_oki->set_bank_base((data & 0x40) ? 0x40000 : 0); + coin_counter_w(machine(), 0, data & 2); + if(data & ~0x62) + logerror("Output: %02x\n",data); +} + +static ADDRESS_MAP_START( cesclassic_map, AS_PROGRAM, 16, cesclassic_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x400000, 0x40ffff) AM_RAM - AM_RANGE(0x600000, 0x600001) AM_READ(cesclassic_60000_r) - AM_RANGE(0x640040, 0x640041) AM_WRITENOP - AM_RANGE(0x904000, 0x904001) AM_WRITENOP + AM_RANGE(0x400000, 0x40cfff) AM_RAM + AM_RANGE(0x40d000, 0x40ffff) AM_RAM AM_BASE(m_vram) + AM_RANGE(0x410000, 0x410001) AM_READ_PORT("VBLANK") //probably m68681 lies there instead + AM_RANGE(0x410004, 0x410005) AM_WRITE(irq3_ack_w) + AM_RANGE(0x410006, 0x410007) AM_WRITE(irq2_ack_w) + AM_RANGE(0x480000, 0x481fff) AM_RAM AM_SHARE("nvram") //8k according to schematics (games doesn't use that much tho) + AM_RANGE(0x600000, 0x600001) AM_READ_PORT("SYSTEM") + AM_RANGE(0x610000, 0x610001) AM_WRITE(outputs_w) +// AM_RANGE(0x640000, 0x640001) AM_WRITENOP + AM_RANGE(0x640040, 0x640041) AM_WRITE(lamps_w) + AM_RANGE(0x670000, 0x670001) AM_READ_PORT("DSW") + AM_RANGE(0x70ff00, 0x70ff01) AM_WRITENOP // writes 0xffff at irq 3 end of service, watchdog? + AM_RANGE(0x900000, 0x900001) AM_DEVREAD8("oki", okim6295_device, read,0x00ff) // unsure about this ... + AM_RANGE(0x900100, 0x900101) AM_DEVWRITE8("oki", okim6295_device, write,0x00ff) +// AM_RANGE(0x904000, 0x904001) AM_WRITENOP //some kind of serial ADDRESS_MAP_END static INPUT_PORTS_START( cesclassic ) + PORT_START("SYSTEM") + PORT_DIPNAME( 0x0001, 0x0001, "SYSTEM" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "SYSTEM" ) // hangs system at POST if active + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_SERVICE ) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_BUTTON1 ) // hit strobe + + PORT_START("DSW") + PORT_DIPNAME( 0x0001, 0x0001, "DSW" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "SYSTEM" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) // LCD test + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("VBLANK") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) INPUT_PORTS_END +static PALETTE_INIT( cesclassic ) +{ + int i; + + for (i = 0; i < 4; i++) + palette_set_color_rgb(machine, i, pal2bit(i), 0, 0); +} + static MACHINE_CONFIG_START( cesclassic, cesclassic_state ) MCFG_CPU_ADD("maincpu", M68000, 24000000/2 ) MCFG_CPU_PROGRAM_MAP(cesclassic_map) + MCFG_CPU_VBLANK_INT("l_lcd", irq2_line_assert) // TODO: unknown sources + MCFG_CPU_PERIODIC_INT(irq3_line_assert,60*8) + + MCFG_NVRAM_ADD_0FILL("nvram") /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_ADD("l_lcd", LCD) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cesclassic) - - MCFG_PALETTE_LENGTH(16) - - MCFG_VIDEO_START(cesclassic) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_UPDATE_DRIVER(cesclassic_state, screen_update) + MCFG_SCREEN_SIZE(8*16*2, 8*8+3*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 8*16*2-1, 0*8, 8*8-1) + MCFG_DEFAULT_LAYOUT( layout_lcd ) + + MCFG_PALETTE_LENGTH(4) + MCFG_PALETTE_INIT(cesclassic) + + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_OKIM6295_ADD("oki", 24000000/16, OKIM6295_PIN7_LOW) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) MACHINE_CONFIG_END + ROM_START(hrclass) ROM_REGION( 0x100000, "maincpu", 0 ) ROM_LOAD16_BYTE("hrclassic-v121-u44.bin", 0x000000, 0x80000, CRC(cbbbbbdb) SHA1(d406a27a823f5e530a9cf7615c396fe52df1c387) ) @@ -78,12 +288,13 @@ ROM_START(tsclass) ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD("tsclassic-v100-u43u44.bin", 0x000000, 0x100000, CRC(a820ec9a) SHA1(84e38c7e54bb9e80142ed4e7763c9e36df560f42) ) + ROM_LOAD("tsclassic-v100-u43u44.bin", 0x000000, 0x100000, BAD_DUMP CRC(a820ec9a) SHA1(84e38c7e54bb9e80142ed4e7763c9e36df560f42) ) ROM_REGION( 0x80000, "oki", 0 ) ROM_LOAD( "tsclassic-v100-u28.bin", 0x00000, 0x80000, CRC(5bf53ca3) SHA1(5767391175fa9488ba0fb17a16de6d5013712a01) ) ROM_END -GAME(1996, hrclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Home Run Classic", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME(1996, ccclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Country Club Classic", GAME_NOT_WORKING | GAME_NO_SOUND ) -GAME(1996, tsclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Trap Shoot Classic", GAME_NOT_WORKING | GAME_NO_SOUND ) + +GAME(1997, hrclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Home Run Classic (v1.21 12-feb-1997)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +GAME(1997, ccclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Country Club Classic (v1.10 03-apr-1997)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +GAME(1997, tsclass, 0, cesclassic, cesclassic, 0, ROT0, "Creative Electronics And Software", "Trap Shoot Classic (v1.0 21-mar-1997)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/chaknpop.c mame-0.145/src/mame/drivers/chaknpop.c --- mame-0.144/src/mame/drivers/chaknpop.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/chaknpop.c 2012-02-06 21:30:38.000000000 +0000 @@ -386,10 +386,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1828) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(chaknpop) + MCFG_SCREEN_UPDATE_STATIC(chaknpop) MCFG_GFXDECODE(chaknpop) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/cham24.c mame-0.145/src/mame/drivers/cham24.c --- mame-0.144/src/mame/drivers/cham24.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cham24.c 2012-02-06 21:30:36.000000000 +0000 @@ -128,7 +128,8 @@ static WRITE8_HANDLER( sprite_dma_w ) { int source = (data & 7); - ppu2c0x_spriteram_dma(space, space->machine().device("ppu"), source); + ppu2c0x_device *ppu = space->machine().device("ppu"); + ppu->spriteram_dma(space, source); } static READ8_DEVICE_HANDLER( psg_4015_r ) @@ -222,7 +223,7 @@ static ADDRESS_MAP_START( cham24_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM /* NES RAM */ - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -264,7 +265,8 @@ static PALETTE_INIT( cham24 ) { - ppu2c0x_init_palette(machine, 0); + ppu2c0x_device *ppu = machine.device("ppu"); + ppu->init_palette(machine, 0); } static void ppu_irq( device_t *device, int *ppu_regs ) @@ -275,6 +277,8 @@ /* our ppu interface */ static const ppu2c0x_interface ppu_interface = { + "maincpu", + "screen", 0, /* gfxlayout num */ 0, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -285,10 +289,11 @@ { } -static SCREEN_UPDATE( cham24 ) +static SCREEN_UPDATE_IND16( cham24 ) { /* render the ppu */ - ppu2c0x_render(screen->machine().device("ppu"), bitmap, 0, 0, 0, 0); + ppu2c0x_device *ppu = screen.machine().device("ppu"); + ppu->render(bitmap, 0, 0, 0, 0); return 0; } @@ -337,10 +342,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(cham24) + MCFG_SCREEN_UPDATE_STATIC(cham24) MCFG_GFXDECODE(cham24) MCFG_PALETTE_LENGTH(8*4*16) diff -Nru mame-0.144/src/mame/drivers/champbas.c mame-0.145/src/mame/drivers/champbas.c --- mame-0.144/src/mame/drivers/champbas.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/champbas.c 2012-02-06 21:30:41.000000000 +0000 @@ -95,13 +95,17 @@ * *************************************/ -static SCREEN_EOF( champbas ) +static SCREEN_VBLANK( champbas ) { - champbas_state *state = machine.driver_data(); - state->m_watchdog_count++; + // rising edge + if (vblank_on) + { + champbas_state *state = screen.machine().driver_data(); + state->m_watchdog_count++; - if (state->m_watchdog_count == 0x10) - machine.schedule_soft_reset(); + if (state->m_watchdog_count == 0x10) + screen.machine().schedule_soft_reset(); + } } @@ -127,10 +131,10 @@ static WRITE8_HANDLER( irq_enable_w ) { champbas_state *state = space->machine().driver_data(); - int bit = data & 1; - cpu_interrupt_enable(state->m_maincpu, bit); - if (!bit) + state->m_irq_mask = data & 1; + + if (!state->m_irq_mask) device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); } @@ -596,13 +600,21 @@ state->m_gfx_bank = 0; // talbot has only 1 bank } +static INTERRUPT_GEN( vblank_irq ) +{ + champbas_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} + static MACHINE_CONFIG_START( talbot, champbas_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(talbot_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* MCU */ MCFG_CPU_ADD(CPUTAG_MCU, ALPHA8201, XTAL_18_432MHz/6/8) @@ -614,11 +626,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(champbas) - MCFG_SCREEN_EOF(champbas) + MCFG_SCREEN_UPDATE_STATIC(champbas) + MCFG_SCREEN_VBLANK_STATIC(champbas) MCFG_GFXDECODE(talbot) MCFG_PALETTE_LENGTH(0x200) @@ -639,7 +650,7 @@ /* main cpu */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(champbas_main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("sub", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(champbas_sub_map) @@ -650,11 +661,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(champbas) - MCFG_SCREEN_EOF(champbas) + MCFG_SCREEN_UPDATE_STATIC(champbas) + MCFG_SCREEN_VBLANK_STATIC(champbas) MCFG_GFXDECODE(champbas) MCFG_PALETTE_LENGTH(0x200) @@ -691,7 +701,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6 ) MCFG_CPU_PROGRAM_MAP(exctsccr_main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_14_31818MHz/4 ) MCFG_CPU_PROGRAM_MAP(exctsccr_sub_map) @@ -708,11 +718,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.54) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(exctsccr) - MCFG_SCREEN_EOF(champbas) + MCFG_SCREEN_UPDATE_STATIC(exctsccr) + MCFG_SCREEN_VBLANK_STATIC(champbas) MCFG_GFXDECODE(exctsccr) MCFG_PALETTE_LENGTH(0x200) @@ -749,7 +758,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(exctsccrb_main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("sub", Z80, XTAL_18_432MHz/6) MCFG_CPU_PROGRAM_MAP(champbas_sub_map) @@ -760,11 +769,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(exctsccr) - MCFG_SCREEN_EOF(champbas) + MCFG_SCREEN_UPDATE_STATIC(exctsccr) + MCFG_SCREEN_VBLANK_STATIC(champbas) MCFG_GFXDECODE(exctsccr) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/champbwl.c mame-0.145/src/mame/drivers/champbwl.c --- mame-0.144/src/mame/drivers/champbwl.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/champbwl.c 2012-02-06 21:30:41.000000000 +0000 @@ -449,20 +449,22 @@ } -SCREEN_UPDATE( champbwl ) +SCREEN_UPDATE_IND16( champbwl ) { - bitmap_fill(bitmap, cliprect, 0x1f0); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); - screen->machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); + screen.machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); + screen.machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(), bitmap, cliprect, 0x800, 1 ); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(), bitmap, cliprect, 0x800, 1 ); return 0; } -SCREEN_EOF( champbwl ) +SCREEN_VBLANK( champbwl ) { - machine.device("spritegen")->tnzs_eof(); + // rising edge + if (vblank_on) + screen.machine().device("spritegen")->tnzs_eof(); } @@ -484,11 +486,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(champbwl) - MCFG_SCREEN_EOF(champbwl) + MCFG_SCREEN_UPDATE_STATIC(champbwl) + MCFG_SCREEN_VBLANK_STATIC(champbwl) MCFG_GFXDECODE(champbwl) MCFG_PALETTE_LENGTH(512) @@ -507,20 +508,22 @@ -static SCREEN_UPDATE( doraemon ) +static SCREEN_UPDATE_IND16( doraemon ) { - bitmap_fill(bitmap, cliprect, 0x1f0); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->set_bg_yoffsets( 0x00, 0x01 ); - screen->machine().device("spritegen")->set_fg_yoffsets( 0x00, 0x10 ); + screen.machine().device("spritegen")->set_bg_yoffsets( 0x00, 0x01 ); + screen.machine().device("spritegen")->set_fg_yoffsets( 0x00, 0x10 ); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(), bitmap, cliprect, 0x800, 1 ); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(), bitmap, cliprect, 0x800, 1 ); return 0; } -static SCREEN_EOF( doraemon ) +static SCREEN_VBLANK( doraemon ) { - machine.device("spritegen")->setac_eof(); + // rising edge + if (vblank_on) + screen.machine().device("spritegen")->setac_eof(); } static MACHINE_START( doraemon ) @@ -546,11 +549,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(doraemon) - MCFG_SCREEN_EOF(doraemon) + MCFG_SCREEN_UPDATE_STATIC(doraemon) + MCFG_SCREEN_VBLANK_STATIC(doraemon) MCFG_GFXDECODE(champbwl) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/chanbara.c mame-0.145/src/mame/drivers/chanbara.c --- mame-0.144/src/mame/drivers/chanbara.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/chanbara.c 2012-02-06 21:30:40.000000000 +0000 @@ -94,7 +94,7 @@ chanbara_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( chanbara_colorram_w ) @@ -102,7 +102,7 @@ chanbara_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( chanbara_videoram2_w ) @@ -110,7 +110,7 @@ chanbara_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset); + state->m_bg2_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( chanbara_colorram2_w ) @@ -118,7 +118,7 @@ chanbara_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset); + state->m_bg2_tilemap->mark_tile_dirty(offset); } @@ -145,10 +145,10 @@ chanbara_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,8, 8, 32, 32); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows,16, 16, 16, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { chanbara_state *state = machine.driver_data(); int offs; @@ -192,14 +192,14 @@ } } -static SCREEN_UPDATE( chanbara ) +static SCREEN_UPDATE_IND16( chanbara ) { - chanbara_state *state = screen->machine().driver_data(); + chanbara_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_scroll | (state->m_scrollhi << 8)); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg2_tilemap->set_scrolly(0, state->m_scroll | (state->m_scrollhi << 8)); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -396,10 +396,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.4122) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(chanbara) + MCFG_SCREEN_UPDATE_STATIC(chanbara) MCFG_GFXDECODE(chanbara) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/changela.c mame-0.145/src/mame/drivers/changela.c --- mame-0.144/src/mame/drivers/changela.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/changela.c 2012-02-06 21:30:41.000000000 +0000 @@ -534,10 +534,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) /* vert size is a guess */ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(changela) + MCFG_SCREEN_UPDATE_STATIC(changela) MCFG_PALETTE_LENGTH(0x40) diff -Nru mame-0.144/src/mame/drivers/cheekyms.c mame-0.145/src/mame/drivers/cheekyms.c --- mame-0.144/src/mame/drivers/cheekyms.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cheekyms.c 2012-02-06 21:30:42.000000000 +0000 @@ -117,13 +117,22 @@ state->m_dac = machine.device("dac"); } +static INTERRUPT_GEN( vblank_irq ) +{ + cheekyms_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( cheekyms, cheekyms_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,5000000/2) /* 2.5 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(cheekyms) @@ -131,10 +140,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(cheekyms) + MCFG_SCREEN_UPDATE_STATIC(cheekyms) MCFG_GFXDECODE(cheekyms) MCFG_PALETTE_LENGTH(0xc0) diff -Nru mame-0.144/src/mame/drivers/chihiro.c mame-0.145/src/mame/drivers/chihiro.c --- mame-0.144/src/mame/drivers/chihiro.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/chihiro.c 2012-02-06 21:30:36.000000000 +0000 @@ -371,6 +371,7 @@ #include "debug/debugcpu.h" #define LOG_PCI +#define LOG_OHCI static struct { device_t *pic8259_1; @@ -649,46 +650,107 @@ static READ32_HANDLER( geforce_r ) { -static int x; +static int x,ret; + ret=0; if (offset == 0x1804f6) { x = x ^ 0x08080808; - return x; + ret=x; } - return 0; + logerror("NV_2A: read at %08X mask %08X value %08X\n",0xfd000000+offset*4,mem_mask,ret); + return ret; } static WRITE32_HANDLER( geforce_w ) { + logerror("NV_2A: write at %08X mask %08X value %08X\n",0xfd000000+offset*4,mem_mask,data); } -static UINT32 dummy_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +static UINT32 geforce_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) { #ifdef LOG_PCI - logerror(" bus:0 function:%d register:%d mask:%08X\n",function,reg,mem_mask); + logerror(" bus:1 function:%d register:%d mask:%08X\n",function,reg,mem_mask); #endif return 0; } -static void dummy_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +static void geforce_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) { #ifdef LOG_PCI - logerror(" bus:0 function:%d register:%d data:%08X mask:%08X\n",function,reg,data,mem_mask); + logerror(" bus:1 function:%d register:%d data:%08X mask:%08X\n",function,reg,data,mem_mask); #endif } -static UINT32 geforce_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +/* + * ohci usb controller placeholder + */ + +static const char *const usbregnames[]={ + "HcRevision", + "HcControl", + "HcCommandStatus", + "HcInterruptStatus", + "HcInterruptEnable", + "HcInterruptDisable", + "HcHCCA", + "HcPeriodCurrentED", + "HcControlHeadED", + "HcControlCurrentED", + "HcBulkHeadED", + "HcBulkCurrentED", + "HcDoneHead", + "HcFmInterval", + "HcFmRemaining", + "HcFmNumber", + "HcPeriodicStart", + "HcLSThreshold", + "HcRhDescriptorA", + "HcRhDescriptorB", + "HcRhStatus", + "HcRhPortStatus[1]" +}; + +static READ32_HANDLER( usbctrl_r ) +{ + if (offset == 0) { /* hack needed until usb (and jvs) is implemented */ + chihiro_devices.pic8259_1->machine().firstcpu->space(0)->write_byte(0x6a79f,0x01); + chihiro_devices.pic8259_1->machine().firstcpu->space(0)->write_byte(0x6a7a0,0x00); + } +#ifdef LOG_OHCI + if (offset >= 0x54/4) + logerror("usb controller 0 register HcRhPortStatus[%d] read\n",(offset-0x54/4)+1); + else + logerror("usb controller 0 register %s read\n",usbregnames[offset]); +#endif + return 0; +} + +static WRITE32_HANDLER( usbctrl_w ) +{ +#ifdef LOG_OHCI + if (offset >= 0x54/4) + logerror("usb controller 0 register HcRhPortStatus[%d] write %08X\n",(offset-0x54/4)+1,data); + else + logerror("usb controller 0 register %s write %08X\n",usbregnames[offset],data); +#endif +} + +/* + * dummy for non connected devices + */ + +static UINT32 dummy_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) { #ifdef LOG_PCI - logerror(" bus:1 function:%d register:%d mask:%08X\n",function,reg,mem_mask); + logerror(" bus:0 function:%d register:%d mask:%08X\n",function,reg,mem_mask); #endif return 0; } -static void geforce_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +static void dummy_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) { #ifdef LOG_PCI - logerror(" bus:1 function:%d register:%d data:%08X mask:%08X\n",function,reg,data,mem_mask); + logerror(" bus:0 function:%d register:%d data:%08X mask:%08X\n",function,reg,data,mem_mask); #endif } @@ -895,11 +957,19 @@ return 0; } -static int eeprom_buffer[256]; +// let's try to fake the missing eeprom +static int dummyeeprom[256]={0x94,0x18,0x10,0x59,0x83,0x58,0x15,0xDA,0xDF,0xCC,0x1D,0x78,0x20,0x8A,0x61,0xB8,0x08,0xB4,0xD6,0xA8, + 0x9E,0x77,0x9C,0xEB,0xEA,0xF8,0x93,0x6E,0x3E,0xD6,0x9C,0x49,0x6B,0xB5,0x6E,0xAB,0x6D,0xBC,0xB8,0x80,0x68,0x9D,0xAA,0xCD,0x0B,0x83, + 0x17,0xEC,0x2E,0xCE,0x35,0xA8,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00,0x00, + 0x4F,0x6E,0x6C,0x69,0x6E,0x65,0x6B,0x65,0x79,0x69,0x6E,0x76,0x61,0x6C,0x69,0x64,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF, + 0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; int smbus_eeprom(int command,int rw,int data) { - if (rw == 1) { // 8003b744,3b744=0x90 0x90 + if (command >= 112) + return 0; + if (rw == 1) { // if reading + // 8003b744,3b744=0x90 0x90 // hack to avoid hanging if eeprom contents are not correct // this would need dumping the serial eeprom on the xbox board if (command == 0) { @@ -908,12 +978,12 @@ chihiro_devices.pic8259_1->machine().firstcpu->space(0)->write_byte(0x3b766,0xc9); chihiro_devices.pic8259_1->machine().firstcpu->space(0)->write_byte(0x3b767,0xc3); } - data = eeprom_buffer[command]+eeprom_buffer[command+1]*256; + data = dummyeeprom[command]+dummyeeprom[command+1]*256; logerror("eeprom: %d %d %d\n",command,rw,data); return data; } logerror("eeprom: %d %d %d\n",command,rw,data); - eeprom_buffer[command]=data; + dummyeeprom[command]=data; return 0; } @@ -998,6 +1068,7 @@ static ADDRESS_MAP_START( xbox_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x07ffffff) AM_RAM AM_RANGE(0xfd000000, 0xfdffffff) AM_READWRITE(geforce_r, geforce_w) + AM_RANGE(0xfed00000, 0xfed003ff) AM_READWRITE(usbctrl_r, usbctrl_w) AM_RANGE(0xff000000, 0xffffffff) AM_ROM AM_REGION("bios", 0) AM_MIRROR(0x00f80000) ADDRESS_MAP_END @@ -1015,7 +1086,7 @@ static INPUT_PORTS_START( chihiro ) INPUT_PORTS_END -static SCREEN_UPDATE( chihiro ) +static SCREEN_UPDATE_RGB32( chihiro ) { return 0; } @@ -1064,10 +1135,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(chihiro) + MCFG_SCREEN_UPDATE_STATIC(chihiro) MCFG_MACHINE_START(chihiro) @@ -1075,7 +1145,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( chihirogd, chihiro_base ) - MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", "gdrom", "pic", NULL, "maincpu", NULL) + MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "pic", NULL, "maincpu", NULL) MACHINE_CONFIG_END #define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \ diff -Nru mame-0.144/src/mame/drivers/chinagat.c mame-0.145/src/mame/drivers/chinagat.c --- mame-0.144/src/mame/drivers/chinagat.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/chinagat.c 2012-02-06 21:30:38.000000000 +0000 @@ -588,9 +588,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) /* based on ddragon driver */ - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_GFXDECODE(chinagat) MCFG_PALETTE_LENGTH(384) @@ -633,9 +632,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) /* based on ddragon driver */ - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_GFXDECODE(chinagat) MCFG_PALETTE_LENGTH(384) @@ -675,9 +673,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) /* based on ddragon driver */ - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_GFXDECODE(chinagat) MCFG_PALETTE_LENGTH(384) diff -Nru mame-0.144/src/mame/drivers/chinsan.c mame-0.145/src/mame/drivers/chinsan.c --- mame-0.144/src/mame/drivers/chinsan.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/chinsan.c 2012-02-06 21:30:37.000000000 +0000 @@ -84,9 +84,9 @@ { } -static SCREEN_UPDATE( chinsan ) +static SCREEN_UPDATE_IND16( chinsan ) { - chinsan_state *state = screen->machine().driver_data(); + chinsan_state *state = screen.machine().driver_data(); int y, x, count; count = 0; for (y = 0; y < 32; y++) @@ -96,7 +96,7 @@ int tileno, colour; tileno = state->m_video[count] | (state->m_video[count + 0x800] << 8); colour = state->m_video[count + 0x1000] >> 3; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tileno,colour,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tileno,colour,0,0,x*8,y*8); count++; } } @@ -603,12 +603,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_VISIBLE_AREA(24, 512-24-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(chinsan) + MCFG_SCREEN_UPDATE_STATIC(chinsan) MCFG_GFXDECODE(chinsan) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/chqflag.c mame-0.145/src/mame/drivers/chqflag.c --- mame-0.144/src/mame/drivers/chqflag.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/chqflag.c 2012-02-06 21:30:38.000000000 +0000 @@ -380,10 +380,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(chqflag) + MCFG_SCREEN_UPDATE_STATIC(chqflag) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/chsuper.c mame-0.145/src/mame/drivers/chsuper.c --- mame-0.144/src/mame/drivers/chsuper.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/chsuper.c 2012-02-06 21:30:42.000000000 +0000 @@ -1,5 +1,9 @@ /******************************************************************************************* +Champion Super (c) 1999 + +driver by Angelo Salese & David Haywood + Notes: -To init chsuper3, just soft-reset and keep pressed both service keys (9 & 0) @@ -10,33 +14,49 @@ *******************************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z180/z180.h" #include "sound/dac.h" #include "machine/nvram.h" - +#include "video/ramdac.h" class chsuper_state : public driver_device { public: chsuper_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") { } + + DECLARE_WRITE8_MEMBER(chsuper_vram_w); + DECLARE_READ8_MEMBER(ff_r); int m_tilexor; - struct { int r,g,b,offs,offs_internal; } m_pal; + UINT8 *m_vram; + + required_device m_maincpu; + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // driver_device overrides + //virtual void machine_start(); + //virtual void machine_reset(); + + virtual void video_start(); }; -static VIDEO_START(chsuper) +void chsuper_state::video_start() { + m_vram = auto_alloc_array_clear(machine(), UINT8, 1 << 14); } -static SCREEN_UPDATE(chsuper) +UINT32 chsuper_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { - //chsuper_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; - UINT8 *vram = screen->machine().region("vram")->base(); + const gfx_element *gfx = machine().gfx[0]; int count = 0x0000; int y,x; @@ -44,9 +64,7 @@ { for (x=0;x<128;x++) { - int tile = ((vram[count+1]<<8) | vram[count]) & 0xffff; - - //tile ^=state->m_tilexor; + int tile = ((m_vram[count+1]<<8) | m_vram[count]) & 0xffff; drawgfx_opaque(bitmap,cliprect,gfx,tile,0,0,0,x*4,y*8); count+=2; @@ -56,53 +74,17 @@ return 0; } -static WRITE8_HANDLER( paletteram_io_w ) -{ - chsuper_state *state = space->machine().driver_data(); - switch(offset) - { - case 0: - state->m_pal.offs = data; - break; - case 2: - state->m_pal.offs_internal = 0; - break; - case 1: - switch(state->m_pal.offs_internal) - { - case 0: - state->m_pal.r = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 1: - state->m_pal.g = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 2: - state->m_pal.b = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - palette_set_color(space->machine(), state->m_pal.offs, MAKE_RGB(state->m_pal.r, state->m_pal.g, state->m_pal.b)); - state->m_pal.offs_internal = 0; - state->m_pal.offs++; - break; - } - - break; - } -} - -static READ8_HANDLER( ff_r ) +READ8_MEMBER( chsuper_state::ff_r ) { return 0xff; } -static WRITE8_HANDLER( chsuper_vram_w ) +WRITE8_MEMBER( chsuper_state::chsuper_vram_w ) { - UINT8 *vram = space->machine().region("vram")->base(); - - vram[offset] = data; + m_vram[offset] = data; } -static ADDRESS_MAP_START( chsuper_prg_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( chsuper_prg_map, AS_PROGRAM, 8, chsuper_state ) AM_RANGE(0x00000, 0x0efff) AM_ROM AM_RANGE(0x00000, 0x01fff) AM_WRITE( chsuper_vram_w ) AM_RANGE(0x0f000, 0x0ffff) AM_RAM AM_REGION("maincpu", 0xf000) @@ -111,15 +93,17 @@ // AM_RANGE(0xaff8, 0xaff8) AM_DEVWRITE_MODERN("oki", okim6295_device, write) -static ADDRESS_MAP_START( chsuper_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( chsuper_portmap, AS_IO, 8, chsuper_state ) AM_RANGE( 0x0000, 0x003f ) AM_RAM // Z180 internal regs AM_RANGE( 0x00e8, 0x00e8 ) AM_READ_PORT("IN0") AM_RANGE( 0x00e9, 0x00e9 ) AM_READ_PORT("IN1") AM_RANGE( 0x00ea, 0x00ea ) AM_READ_PORT("DSW0") AM_RANGE( 0x00ed, 0x00ef ) AM_WRITENOP //lamps - AM_RANGE( 0x00fc, 0x00fe ) AM_WRITE( paletteram_io_w ) + AM_RANGE( 0x00fc, 0x00fc ) AM_DEVWRITE("ramdac", ramdac_device, index_w) + AM_RANGE( 0x00fd, 0x00fd ) AM_DEVWRITE("ramdac", ramdac_device, pal_w) + AM_RANGE( 0x00fe, 0x00fe ) AM_DEVWRITE("ramdac", ramdac_device, mask_w) AM_RANGE( 0x8300, 0x8300 ) AM_READ( ff_r ) //probably data for the dac - AM_RANGE( 0xff20, 0xff3f ) AM_DEVWRITE("dac", dac_w) // unk writes + AM_RANGE( 0xff20, 0xff3f ) AM_DEVWRITE_LEGACY("dac", dac_w) // unk writes ADDRESS_MAP_END static INPUT_PORTS_START( chsuper ) @@ -201,6 +185,15 @@ GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout, 0, 1 ) GFXDECODE_END +static ADDRESS_MAP_START( ramdac_map, AS_0, 8, chsuper_state ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 0 +}; + static MACHINE_CONFIG_START( chsuper, chsuper_state ) /* basic machine hardware */ @@ -213,17 +206,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(chsuper_state, screen_update) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(chsuper) MCFG_NVRAM_ADD_0FILL("nvram") MCFG_GFXDECODE(chsuper) MCFG_PALETTE_LENGTH(0x100) - MCFG_VIDEO_START(chsuper) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -244,8 +236,6 @@ ROM_LOAD( "a.bin", 0x00000, 0x80000, CRC(ace8b591) SHA1(e9ba5efebdc9b655056ed8b2621f062f50e0528f) ) ROM_LOAD( "b.bin", 0x80000, 0x80000, CRC(5f58c722) SHA1(d339ae27af010b058eae9084fba85fb2fbed3952) ) - ROM_REGION( 0x10000, "vram", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "adpcm", 0 ) ROM_COPY( "maincpu", 0x10000, 0x00000, 0x70000 ) ROM_END @@ -258,8 +248,6 @@ ROM_LOAD( "chsuper2-a.bin", 0x00000, 0x80000, CRC(7caa8ebe) SHA1(440306a208ec8afd570b15f05b5dc542acc98510) ) ROM_LOAD( "chsuper2-b.bin", 0x80000, 0x80000, CRC(7bb463d7) SHA1(fb3842ba53e545fa47574c91df7281a9cb417395) ) - ROM_REGION( 0x10000, "vram", ROMREGION_ERASE00 ) - ROM_REGION( 0x80000, "adpcm", 0 ) ROM_COPY( "maincpu", 0x10000, 0x00000, 0x70000 ) ROM_END @@ -268,8 +256,6 @@ ROM_REGION( 0x80000, "maincpu", 0 ) // code + samples ROM_LOAD( "3.ic11", 0x00000, 0x80000, CRC(46aa2ce7) SHA1(036d67a26c890c4dc26599bfcd2c67f12e30fb52) ) - ROM_REGION( 0x010000, "vram", ROMREGION_ERASE00 ) - ROM_REGION( 0x100000, "gfx1", 0 ) ROM_LOAD( "1.ic18", 0x00000, 0x80000, CRC(8e202eaa) SHA1(156b498873111e5890c00d447201ba4bcbe6e633) ) ROM_LOAD( "2.ic19", 0x80000, 0x80000, CRC(dc0790b0) SHA1(4550f85e609338635a3987f7832517ed1d6388d4) ) @@ -299,8 +285,6 @@ } memcpy(rom,buffer,0x100000); - - state->m_tilexor = 0x0000; } static DRIVER_INIT( chsuper3 ) @@ -324,8 +308,6 @@ } memcpy(rom,buffer,0x100000); - - state->m_tilexor = 0x0000; } static DRIVER_INIT( chmpnum ) @@ -353,8 +335,6 @@ } memcpy(rom,buffer,0x100000); - - state->m_tilexor = 0x0000; } diff -Nru mame-0.144/src/mame/drivers/cinemat.c mame-0.145/src/mame/drivers/cinemat.c --- mame-0.144/src/mame/drivers/cinemat.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cinemat.c 2012-02-06 21:30:39.000000000 +0000 @@ -1009,7 +1009,7 @@ MCFG_SCREEN_REFRESH_RATE(MASTER_CLOCK/4/16/16/16/16/2) MCFG_SCREEN_SIZE(1024, 768) MCFG_SCREEN_VISIBLE_AREA(0, 1023, 0, 767) - MCFG_SCREEN_UPDATE(cinemat) + MCFG_SCREEN_UPDATE_STATIC(cinemat) MCFG_VIDEO_START(cinemat_bilevel) MACHINE_CONFIG_END @@ -1056,7 +1056,7 @@ static MACHINE_CONFIG_DERIVED( spacewar, cinemat_nojmi_4k ) MCFG_FRAGMENT_ADD(spacewar_sound) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(spacewar) + MCFG_SCREEN_UPDATE_STATIC(spacewar) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/circus.c mame-0.145/src/mame/drivers/circus.c --- mame-0.144/src/mame/drivers/circus.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/circus.c 2012-02-06 21:30:39.000000000 +0000 @@ -298,10 +298,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3500) /* frames per second, vblank duration (complete guess) */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(circus) + MCFG_SCREEN_UPDATE_STATIC(circus) MCFG_GFXDECODE(circus) MCFG_PALETTE_LENGTH(2) @@ -336,10 +335,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3500) /* frames per second, vblank duration (complete guess) */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(robotbwl) + MCFG_SCREEN_UPDATE_STATIC(robotbwl) MCFG_GFXDECODE(robotbwl) MCFG_PALETTE_LENGTH(2) @@ -381,10 +379,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3500) /* frames per second, vblank duration (complete guess) */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 40*8) //TODO MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(crash) + MCFG_SCREEN_UPDATE_STATIC(crash) MCFG_GFXDECODE(circus) MCFG_PALETTE_LENGTH(2) @@ -418,10 +415,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3500) /* frames per second, vblank duration (complete guess) */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(ripcord) + MCFG_SCREEN_UPDATE_STATIC(ripcord) MCFG_GFXDECODE(circus) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/circusc.c mame-0.145/src/mame/drivers/circusc.c --- mame-0.144/src/mame/drivers/circusc.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/circusc.c 2012-02-06 21:30:35.000000000 +0000 @@ -143,11 +143,16 @@ } } +static WRITE8_HANDLER( irq_mask_w ) +{ + circusc_state *state = space->machine().driver_data(); + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( circusc_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0000) AM_MIRROR(0x03f8) AM_WRITE(circusc_flipscreen_w) /* FLIP */ - AM_RANGE(0x0001, 0x0001) AM_MIRROR(0x03f8) AM_WRITE(interrupt_enable_w) /* INTST */ + AM_RANGE(0x0001, 0x0001) AM_MIRROR(0x03f8) AM_WRITE(irq_mask_w) /* INTST */ // AM_RANGE(0x0002, 0x0002) AM_MIRROR(0x03f8) AM_WRITENOP /* MUT - not used /* AM_RANGE(0x0003, 0x0004) AM_MIRROR(0x03f8) AM_WRITE(circusc_coin_counter_w) /* COIN1, COIN2 */ AM_RANGE(0x0005, 0x0005) AM_MIRROR(0x03f8) AM_WRITEONLY AM_BASE_MEMBER(circusc_state, m_spritebank) /* OBJ CHENG */ @@ -331,15 +336,23 @@ DISCRETE_SOUND_END +static INTERRUPT_GEN( vblank_irq ) +{ + circusc_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( circusc, circusc_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 2048000) /* 2 MHz */ + MCFG_CPU_ADD("maincpu", M6809, 2048000) /* 2 MHz? */ MCFG_CPU_PROGRAM_MAP(circusc_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(8) - MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* Z80 Clock is derived from a 14.31818 MHz crystal */ + MCFG_CPU_ADD("audiocpu", Z80, XTAL_14_31818MHz/4) MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_MACHINE_START(circusc) @@ -349,10 +362,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(circusc) + MCFG_SCREEN_UPDATE_STATIC(circusc) MCFG_GFXDECODE(circusc) MCFG_PALETTE_LENGTH(16*16+16*16) @@ -363,10 +375,10 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("sn1", SN76496, 14318180/8) + MCFG_SOUND_ADD("sn1", SN76496, XTAL_14_31818MHz/8) MCFG_SOUND_ROUTE_EX(0, "fltdisc", 1.0, 0) - MCFG_SOUND_ADD("sn2", SN76496, 14318180/8) + MCFG_SOUND_ADD("sn2", SN76496, XTAL_14_31818MHz/8) MCFG_SOUND_ROUTE_EX(0, "fltdisc", 1.0, 1) MCFG_SOUND_ADD("dac", DAC, 0) diff -Nru mame-0.144/src/mame/drivers/cischeat.c mame-0.145/src/mame/drivers/cischeat.c --- mame-0.144/src/mame/drivers/cischeat.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cischeat.c 2012-02-06 21:30:39.000000000 +0000 @@ -1582,10 +1582,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) //TODO: wrong! MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(bigrun) + MCFG_SCREEN_UPDATE_STATIC(bigrun) MCFG_GFXDECODE(bigrun) MCFG_PALETTE_LENGTH(16*16 * 3 + 64*16 * 2 + 64*16) /* scroll 0,1,2; road 0,1; sprites */ @@ -1627,7 +1626,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-8-1) - MCFG_SCREEN_UPDATE(cischeat) + MCFG_SCREEN_UPDATE_STATIC(cischeat) MCFG_GFXDECODE(cischeat) MCFG_PALETTE_LENGTH(32*16 * 3 + 64*16 * 2 + 128*16) /* scroll 0,1,2; road 0,1; sprites */ @@ -1660,7 +1659,7 @@ MCFG_VIDEO_START(f1gpstar) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(f1gpstar) + MCFG_SCREEN_UPDATE_STATIC(f1gpstar) MACHINE_CONFIG_END @@ -1716,10 +1715,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) //TODO: wrong! MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500 * 3) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0 +16, 256-1 -16) - MCFG_SCREEN_UPDATE(scudhamm) + MCFG_SCREEN_UPDATE_STATIC(scudhamm) MCFG_GFXDECODE(scudhamm) MCFG_PALETTE_LENGTH(16*16+16*16+128*16) diff -Nru mame-0.144/src/mame/drivers/citycon.c mame-0.145/src/mame/drivers/citycon.c --- mame-0.144/src/mame/drivers/citycon.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/citycon.c 2012-02-06 21:30:41.000000000 +0000 @@ -222,10 +222,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(citycon) + MCFG_SCREEN_UPDATE_STATIC(citycon) MCFG_GFXDECODE(citycon) MCFG_PALETTE_LENGTH(640+1024) /* 640 real palette + 1024 virtual palette */ diff -Nru mame-0.144/src/mame/drivers/clayshoo.c mame-0.145/src/mame/drivers/clayshoo.c --- mame-0.144/src/mame/drivers/clayshoo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/clayshoo.c 2012-02-06 21:30:41.000000000 +0000 @@ -183,9 +183,9 @@ * *************************************/ -static SCREEN_UPDATE( clayshoo ) +static SCREEN_UPDATE_RGB32( clayshoo ) { - clayshoo_state *state = screen->machine().driver_data(); + clayshoo_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -198,7 +198,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data << 1; x = x + 1; @@ -334,12 +334,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 64, 255) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(clayshoo) + MCFG_SCREEN_UPDATE_STATIC(clayshoo) MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] ) MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) diff -Nru mame-0.144/src/mame/drivers/cliffhgr.c mame-0.145/src/mame/drivers/cliffhgr.c --- mame-0.144/src/mame/drivers/cliffhgr.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cliffhgr.c 2012-02-06 21:30:40.000000000 +0000 @@ -76,7 +76,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "render.h" -#include "machine/laserdsc.h" +#include "machine/ldpr8210.h" #include "video/tms9928a.h" #include "sound/discrete.h" #include "machine/nvram.h" @@ -84,12 +84,23 @@ #define CLIFF_ENABLE_SND_1 NODE_01 #define CLIFF_ENABLE_SND_2 NODE_02 -static device_t *laserdisc; +class cliffhgr_state : public driver_device +{ +public: + cliffhgr_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc"), + m_port_bank(0), + m_phillips_code(0) { } + + required_device m_laserdisc; -static int port_bank = 0; -static int phillips_code = 0; + int m_port_bank; + UINT32 m_phillips_code; + + emu_timer *m_irq_timer; +}; -static emu_timer *irq_timer; /********************************************************/ @@ -100,19 +111,23 @@ static WRITE8_HANDLER( cliff_port_bank_w ) { + cliffhgr_state *state = space->machine().driver_data(); + /* writing 0x0f clears the LS174 flip flop */ if (data == 0x0f) - port_bank = 0; + state->m_port_bank = 0; else - port_bank = data & 0x0f; /* only D3-D0 are connected */ + state->m_port_bank = data & 0x0f; /* only D3-D0 are connected */ } static READ8_HANDLER( cliff_port_r ) { static const char *const banknames[] = { "BANK0", "BANK1", "BANK2", "BANK3", "BANK4", "BANK5", "BANK6" }; - if (port_bank < 7) - return input_port_read(space->machine(), banknames[port_bank]); + cliffhgr_state *state = space->machine().driver_data(); + + if (state->m_port_bank < 7) + return input_port_read(space->machine(), banknames[state->m_port_bank]); /* output is pulled up for non-mapped ports */ return 0xff; @@ -120,10 +135,8 @@ static READ8_HANDLER( cliff_phillips_code_r ) { - if (laserdisc != NULL) - return (phillips_code >> (8 * offset)) & 0xff; - - return 0x00; + cliffhgr_state *state = space->machine().driver_data(); + return (state->m_phillips_code >> (8 * offset)) & 0xff; } static WRITE8_HANDLER( cliff_phillips_clear_w ) @@ -146,29 +159,17 @@ static WRITE8_DEVICE_HANDLER( cliff_sound_overlay_w ) { - int sound = data & 3; - int overlay = (data & 0x10) ? 1 : 0; - - /* configure pen 0 and 1 as transparent in the renderer and use it as the compositing color */ - if (overlay) - { - palette_set_color(device->machine(), 0, palette_get_color(device->machine(), 0) & MAKE_ARGB(0,255,255,255)); - palette_set_color(device->machine(), 1, palette_get_color(device->machine(), 1) & MAKE_ARGB(0,255,255,255)); - } - else - { - palette_set_color(device->machine(), 0, palette_get_color(device->machine(), 0) | MAKE_ARGB(255,0,0,0)); - palette_set_color(device->machine(), 1, palette_get_color(device->machine(), 1) | MAKE_ARGB(255,0,0,0)); - } - /* audio */ - discrete_sound_w(device, CLIFF_ENABLE_SND_1, sound & 1); - discrete_sound_w(device, CLIFF_ENABLE_SND_2, (sound >> 1) & 1); + discrete_sound_w(device, CLIFF_ENABLE_SND_1, data & 1); + discrete_sound_w(device, CLIFF_ENABLE_SND_2, (data >> 1) & 1); + + // bit 4 (data & 0x10) is overlay related? } static WRITE8_HANDLER( cliff_ldwire_w ) { - laserdisc_line_w(laserdisc, LASERDISC_LINE_CONTROL, (data & 1) ? ASSERT_LINE : CLEAR_LINE); + cliffhgr_state *state = space->machine().driver_data(); + state->m_laserdisc->control_w((data & 1) ? ASSERT_LINE : CLEAR_LINE); } @@ -176,29 +177,30 @@ static TIMER_CALLBACK( cliff_irq_callback ) { - phillips_code = 0; + cliffhgr_state *state = machine.driver_data(); + state->m_phillips_code = 0; switch (param) { case 17: - phillips_code = laserdisc_get_field_code(laserdisc, LASERDISC_CODE_LINE17, TRUE); + state->m_phillips_code = state->m_laserdisc->get_field_code(LASERDISC_CODE_LINE17, true); param = 18; break; case 18: - phillips_code = laserdisc_get_field_code(laserdisc, LASERDISC_CODE_LINE18, TRUE); + state->m_phillips_code = state->m_laserdisc->get_field_code(LASERDISC_CODE_LINE18, true); param = 17; break; } /* if we have a valid code, trigger an IRQ */ - if (phillips_code & 0x800000) + if (state->m_phillips_code & 0x800000) { // printf("%2d:code = %06X\n", param, phillips_code); cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); } - irq_timer->adjust(machine.primary_screen->time_until_pos(param * 2), param); + state->m_irq_timer->adjust(machine.primary_screen->time_until_pos(param * 2), param); } static WRITE_LINE_DEVICE_HANDLER(vdp_interrupt) @@ -210,15 +212,16 @@ static MACHINE_START( cliffhgr ) { - laserdisc = machine.device("laserdisc"); - irq_timer = machine.scheduler().timer_alloc(FUNC(cliff_irq_callback)); + cliffhgr_state *state = machine.driver_data(); + state->m_irq_timer = machine.scheduler().timer_alloc(FUNC(cliff_irq_callback)); } static MACHINE_RESET( cliffhgr ) { - port_bank = 0; - phillips_code = 0; - irq_timer->adjust(machine.primary_screen->time_until_pos(17), 17); + cliffhgr_state *state = machine.driver_data(); + state->m_port_bank = 0; + state->m_phillips_code = 0; + state->m_irq_timer->adjust(machine.primary_screen->time_until_pos(17), 17); } /********************************************************/ @@ -668,14 +671,6 @@ DEVCB_LINE(vdp_interrupt) }; -static SCREEN_UPDATE( cliffhgr ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - DISCRETE_SOUND_EXTERN( cliffhgr ); @@ -686,7 +681,7 @@ * *************************************/ -static MACHINE_CONFIG_START( cliffhgr, driver_device ) +static MACHINE_CONFIG_START( cliffhgr, cliffhgr_state ) MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4MHz */ MCFG_CPU_PROGRAM_MAP(mainmem) @@ -697,21 +692,20 @@ MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_LASERDISC_ADD("laserdisc", PIONEER_PR8210, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(cliffhgr, 12+32*8+12, 12+24*8+12, BITMAP_FORMAT_INDEXED16) - MCFG_LASERDISC_OVERLAY_CLIP(TMS9928A_HORZ_DISPLAY_START-12, 12+32*8+12-1, TMS9928A_VERT_DISPLAY_START_NTSC - 12, 12+24*8+12-1) + MCFG_LASERDISC_PR8210_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_DEVICE(TMS9928A_TOTAL_HORZ, TMS9928A_TOTAL_VERT_NTSC, "tms9928a", tms9928a_device, screen_update) + MCFG_LASERDISC_OVERLAY_CLIP(TMS9928A_HORZ_DISPLAY_START-12, TMS9928A_HORZ_DISPLAY_START+32*8+12-1, TMS9928A_VERT_DISPLAY_START_NTSC - 12, TMS9928A_VERT_DISPLAY_START_NTSC+24*8+12-1) /* start with the TMS9928a video configuration */ MCFG_TMS9928A_ADD( "tms9928a", TMS9128, cliffhgr_tms9928a_interface ) /* TMS9128NL on the board */ /* override video rendering and raw screen info */ - MCFG_DEVICE_REMOVE("screen") - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) diff -Nru mame-0.144/src/mame/drivers/cloak.c mame-0.145/src/mame/drivers/cloak.c --- mame-0.144/src/mame/drivers/cloak.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cloak.c 2012-02-06 21:30:33.000000000 +0000 @@ -348,10 +348,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(cloak) + MCFG_SCREEN_UPDATE_STATIC(cloak) MCFG_GFXDECODE(cloak) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/cloud9.c mame-0.145/src/mame/drivers/cloud9.c --- mame-0.144/src/mame/drivers/cloud9.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cloud9.c 2012-02-06 21:30:34.000000000 +0000 @@ -179,10 +179,7 @@ assert(state->m_vblank_end < state->m_vblank_start); /* reconfigure the visible area to match */ - visarea.min_x = 0; - visarea.max_x = 255; - visarea.min_y = state->m_vblank_end + 1; - visarea.max_y = state->m_vblank_start; + visarea.set(0, 255, state->m_vblank_end + 1, state->m_vblank_start); machine.primary_screen->configure(320, 256, visarea, HZ_TO_ATTOSECONDS(PIXEL_CLOCK) * VTOTAL * HTOTAL); /* create a timer for IRQs and set up the first callback */ @@ -443,12 +440,11 @@ MCFG_PALETTE_LENGTH(64) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE((float)PIXEL_CLOCK / (float)VTOTAL / (float)HTOTAL) MCFG_SCREEN_SIZE(HTOTAL, VTOTAL) MCFG_SCREEN_VBLANK_TIME(0) /* VBLANK is handled manually */ MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 231) - MCFG_SCREEN_UPDATE(cloud9) + MCFG_SCREEN_UPDATE_STATIC(cloud9) MCFG_VIDEO_START(cloud9) diff -Nru mame-0.144/src/mame/drivers/clshroad.c mame-0.145/src/mame/drivers/clshroad.c --- mame-0.144/src/mame/drivers/clshroad.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/clshroad.c 2012-02-06 21:30:35.000000000 +0000 @@ -243,10 +243,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x120, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x120-1, 0x0+16, 0x100-16-1) - MCFG_SCREEN_UPDATE(clshroad) + MCFG_SCREEN_UPDATE_STATIC(clshroad) MCFG_GFXDECODE(firebatl) MCFG_PALETTE_LENGTH(512+64*4) @@ -278,10 +277,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x120, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x120-1, 0x0+16, 0x100-16-1) - MCFG_SCREEN_UPDATE(clshroad) + MCFG_SCREEN_UPDATE_STATIC(clshroad) MCFG_GFXDECODE(clshroad) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/cmmb.c mame-0.145/src/mame/drivers/cmmb.c --- mame-0.144/src/mame/drivers/cmmb.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cmmb.c 2012-02-06 21:30:37.000000000 +0000 @@ -61,11 +61,11 @@ } -static SCREEN_UPDATE( cmmb ) +static SCREEN_UPDATE_IND16( cmmb ) { - cmmb_state *state = screen->machine().driver_data(); + cmmb_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x00000; int y,x; @@ -310,10 +310,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // unknown - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(cmmb) + MCFG_SCREEN_UPDATE_STATIC(cmmb) MCFG_GFXDECODE(cmmb) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/cninja.c mame-0.145/src/mame/drivers/cninja.c --- mame-0.144/src/mame/drivers/cninja.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cninja.c 2012-02-06 21:30:36.000000000 +0000 @@ -153,16 +153,16 @@ static WRITE16_HANDLER( cninja_pf12_control_w ) { cninja_state *state = space->machine().driver_data(); - deco16ic_pf_control_w(state->m_deco_tilegen1, offset, data, mem_mask); space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); + deco16ic_pf_control_w(state->m_deco_tilegen1, offset, data, mem_mask); } static WRITE16_HANDLER( cninja_pf34_control_w ) { cninja_state *state = space->machine().driver_data(); - deco16ic_pf_control_w(state->m_deco_tilegen2, offset, data, mem_mask); space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); + deco16ic_pf_control_w(state->m_deco_tilegen2, offset, data, mem_mask); } @@ -928,10 +928,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cninja) + MCFG_SCREEN_UPDATE_STATIC(cninja) MCFG_GFXDECODE(cninja) MCFG_PALETTE_LENGTH(2048) @@ -983,10 +982,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cninja) + MCFG_SCREEN_UPDATE_STATIC(cninja) MCFG_GFXDECODE(cninja) MCFG_PALETTE_LENGTH(2048) @@ -1038,10 +1036,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cninjabl) + MCFG_SCREEN_UPDATE_STATIC(cninjabl) MCFG_GFXDECODE(cninjabl) MCFG_PALETTE_LENGTH(2048) @@ -1084,10 +1081,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(edrandy) + MCFG_SCREEN_UPDATE_STATIC(edrandy) MCFG_GFXDECODE(cninja) MCFG_PALETTE_LENGTH(2048) @@ -1139,10 +1135,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(robocop2) + MCFG_SCREEN_UPDATE_STATIC(robocop2) MCFG_GFXDECODE(robocop2) MCFG_PALETTE_LENGTH(2048) @@ -1195,10 +1190,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mutantf) + MCFG_SCREEN_UPDATE_STATIC(mutantf) MCFG_VIDEO_START(mutantf) diff -Nru mame-0.144/src/mame/drivers/cntsteer.c mame-0.145/src/mame/drivers/cntsteer.c --- mame-0.144/src/mame/drivers/cntsteer.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cntsteer.c 2012-02-06 21:30:39.000000000 +0000 @@ -117,9 +117,9 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 64, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - //tilemap_set_flip(state->m_bg_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + //state->m_bg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY); } static VIDEO_START( zerotrgt ) @@ -128,9 +128,9 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - //tilemap_set_flip(state->m_bg_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + //state->m_bg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY); } /* @@ -146,7 +146,7 @@ [2] xxxx xxxx X attribute [3] xxxx xxxx sprite number */ -static void zerotrgt_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void zerotrgt_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cntsteer_state *state = machine.driver_data(); int offs; @@ -204,7 +204,7 @@ ---- --xx tile bank */ -static void cntsteer_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void cntsteer_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cntsteer_state *state = machine.driver_data(); int offs; @@ -253,12 +253,12 @@ } } -static SCREEN_UPDATE( zerotrgt ) +static SCREEN_UPDATE_IND16( zerotrgt ) { - cntsteer_state *state = screen->machine().driver_data(); + cntsteer_state *state = screen.machine().driver_data(); if (state->m_disable_roz) - bitmap_fill(bitmap, cliprect, screen->machine().pens[8 * state->m_bg_color_bank]); + bitmap.fill(screen.machine().pens[8 * state->m_bg_color_bank], cliprect); else { int p1, p2, p3, p4; @@ -290,7 +290,7 @@ x = -256 - (state->m_scrollx | state->m_scrollx_hi); y = 256 + (state->m_scrolly | state->m_scrolly_hi); - tilemap_draw_roz(bitmap, cliprect, state->m_bg_tilemap, + state->m_bg_tilemap->draw_roz(bitmap, cliprect, (x << 16), (y << 16), p1, p2, p3, p4, @@ -298,18 +298,18 @@ 0, 0); } - zerotrgt_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + zerotrgt_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -static SCREEN_UPDATE( cntsteer ) +static SCREEN_UPDATE_IND16( cntsteer ) { - cntsteer_state *state = screen->machine().driver_data(); + cntsteer_state *state = screen.machine().driver_data(); if (state->m_disable_roz) - bitmap_fill(bitmap, cliprect, screen->machine().pens[8 * state->m_bg_color_bank]); + bitmap.fill(screen.machine().pens[8 * state->m_bg_color_bank], cliprect); else { int p1, p2, p3, p4; @@ -339,7 +339,7 @@ x = 256 + (state->m_scrollx | state->m_scrollx_hi); y = 256 - (state->m_scrolly | state->m_scrolly_hi); - tilemap_draw_roz(bitmap, cliprect, state->m_bg_tilemap, + state->m_bg_tilemap->draw_roz(bitmap, cliprect, (x << 16), (y << 16), p1, p2, p3, p4, @@ -347,8 +347,8 @@ 0, 0); } - cntsteer_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + cntsteer_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -380,7 +380,7 @@ case 2: state->m_bg_bank = (data & 0x30) << 4; state->m_bg_color_bank = (data & 7); state->m_disable_roz = (data & 0x40); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); break; case 3: state->m_rotation_sign = (data & 1); flip_screen_set(space->machine(), !(data & 4)); @@ -405,7 +405,7 @@ case 1: state->m_scrollx = data; break; case 2: state->m_bg_bank = (data & 0x01) << 8; state->m_bg_color_bank = (data & 6) >> 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); break; case 3: state->m_rotation_sign = (data & 7); state->m_disable_roz = (~data & 0x08); @@ -420,21 +420,21 @@ { cntsteer_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( cntsteer_foreground_attr_w ) { cntsteer_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( cntsteer_background_w ) { cntsteer_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /************************************* @@ -891,10 +891,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cntsteer) + MCFG_SCREEN_UPDATE_STATIC(cntsteer) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) @@ -941,10 +940,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(zerotrgt) + MCFG_SCREEN_UPDATE_STATIC(zerotrgt) MCFG_GFXDECODE(zerotrgt) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/cobra.c mame-0.145/src/mame/drivers/cobra.c --- mame-0.144/src/mame/drivers/cobra.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cobra.c 2012-02-06 21:30:33.000000000 +0000 @@ -63,7 +63,7 @@ DECLARE_WRITE64_MEMBER(gfx_buf_w); - bitmap_t *framebuffer; + bitmap_rgb32 *framebuffer; poly_manager *poly; int polybuffer_ptr; @@ -74,8 +74,8 @@ #if 0 static void render_scan(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { - bitmap_t *destmap = (bitmap_t *)dest; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT32 *fb = &destmap->pix32(scanline); int x; for (x = extent->startx; x < extent->stopx; x++) @@ -87,12 +87,12 @@ static void render_texture_scan(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; float u = extent->param[0].start; float v = extent->param[1].start; float du = extent->param[0].dpdx; float dv = extent->param[1].dpdx; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); + UINT32 *fb = &destmap->pix32(scanline); int x; for (x = extent->startx; x < extent->stopx; x++) @@ -136,12 +136,12 @@ cobra->poly = poly_alloc(machine, 4000, 10, POLYFLAG_ALLOW_QUADS); machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(cobra_video_exit), &machine)); - cobra->framebuffer = auto_bitmap_alloc(machine, 64*8, 32*8, BITMAP_FORMAT_RGB32); + cobra->framebuffer = auto_bitmap_rgb32_alloc(machine, 64*8, 32*8); } -SCREEN_UPDATE( cobra ) +SCREEN_UPDATE_RGB32( cobra ) { - cobra_state *cobra = screen->machine().driver_data(); + cobra_state *cobra = screen.machine().driver_data(); if (cobra->polybuffer_ptr > 0) { @@ -149,14 +149,14 @@ for (i=0; i < cobra->polybuffer_ptr; i++) { - poly_render_triangle(cobra->poly, cobra->framebuffer, &screen->machine().primary_screen->visible_area(), render_texture_scan, 2, + poly_render_triangle(cobra->poly, cobra->framebuffer, screen.machine().primary_screen->visible_area(), render_texture_scan, 2, &cobra->polybuffer[i].v[0], &cobra->polybuffer[i].v[1], &cobra->polybuffer[i].v[2]); poly_wait(cobra->poly, "Finished render"); } cobra->polybuffer_ptr = 0; } - copybitmap_trans(bitmap, cobra->framebuffer, 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *cobra->framebuffer, 0, 0, 0, 0, cliprect, 0); return 0; } @@ -2028,11 +2028,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1) MCFG_PALETTE_LENGTH(65536) - MCFG_SCREEN_UPDATE(cobra) + MCFG_SCREEN_UPDATE_STATIC(cobra) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/coinmstr.c mame-0.145/src/mame/drivers/coinmstr.c --- mame-0.144/src/mame/drivers/coinmstr.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/coinmstr.c 2012-02-06 21:30:40.000000000 +0000 @@ -51,7 +51,7 @@ videoram[offset] = data; if(offset >= 0x0240) - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset - 0x0240); + state->m_bg_tilemap->mark_tile_dirty(offset - 0x0240); } @@ -97,7 +97,7 @@ { // the later games also use attr3 for something.. UINT32 paldata = (state->m_attr_ram1[offset] & 0x7f) | ((state->m_attr_ram2[offset] & 0x7f) << 7); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset - 0x0240); + state->m_bg_tilemap->mark_tile_dirty(offset - 0x0240); coinmstr_set_pal(space->machine(), paldata, offset - 0x240); @@ -113,7 +113,7 @@ { // the later games also use attr3 for something.. UINT32 paldata = (state->m_attr_ram1[offset] & 0x7f) | ((state->m_attr_ram2[offset] & 0x7f) << 7); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset - 0x0240); + state->m_bg_tilemap->mark_tile_dirty(offset - 0x0240); coinmstr_set_pal(space->machine(), paldata, offset - 0x240); @@ -126,7 +126,7 @@ state->m_attr_ram3[offset] = data; if(offset >= 0x0240) - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset - 0x0240); + state->m_bg_tilemap->mark_tile_dirty(offset - 0x0240); } @@ -914,10 +914,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 46, 32); } -static SCREEN_UPDATE( coinmstr ) +static SCREEN_UPDATE_IND16( coinmstr ) { - coinmstr_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + coinmstr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1014,10 +1014,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 46*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(coinmstr) + MCFG_SCREEN_UPDATE_STATIC(coinmstr) MCFG_GFXDECODE(coinmstr) MCFG_PALETTE_LENGTH(46*32*4) diff -Nru mame-0.144/src/mame/drivers/coinmvga.c mame-0.145/src/mame/drivers/coinmvga.c --- mame-0.144/src/mame/drivers/coinmvga.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/coinmvga.c 2012-02-06 21:30:40.000000000 +0000 @@ -240,10 +240,10 @@ } -static SCREEN_UPDATE( coinmvga ) +static SCREEN_UPDATE_IND16( coinmvga ) { - coinmvga_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + coinmvga_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x04000/2; int y,x; @@ -674,10 +674,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640,480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE(coinmvga) + MCFG_SCREEN_UPDATE_STATIC(coinmvga) MCFG_GFXDECODE(coinmvga) diff -Nru mame-0.144/src/mame/drivers/combatsc.c mame-0.145/src/mame/drivers/combatsc.c --- mame-0.144/src/mame/drivers/combatsc.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/combatsc.c 2012-02-06 21:30:35.000000000 +0000 @@ -140,11 +140,11 @@ combatsc_state *state = space->machine().driver_data(); if (data != state->m_vreg) { - tilemap_mark_all_tiles_dirty(state->m_textlayer); + state->m_textlayer->mark_all_dirty(); if ((data & 0x0f) != (state->m_vreg & 0x0f)) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[0]); + state->m_bg_tilemap[0]->mark_all_dirty(); if ((data >> 4) != (state->m_vreg >> 4)) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[1]); + state->m_bg_tilemap[1]->mark_all_dirty(); state->m_vreg = data; } } @@ -770,10 +770,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(combatsc) + MCFG_SCREEN_UPDATE_STATIC(combatsc) MCFG_GFXDECODE(combatsc) MCFG_PALETTE_LENGTH(8*16*16) @@ -823,10 +822,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(combatscb) + MCFG_SCREEN_UPDATE_STATIC(combatscb) MCFG_GFXDECODE(combatscb) MCFG_PALETTE_LENGTH(8*16*16) diff -Nru mame-0.144/src/mame/drivers/comebaby.c mame-0.145/src/mame/drivers/comebaby.c --- mame-0.144/src/mame/drivers/comebaby.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/comebaby.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,6 +1,9 @@ /* Come On Baby (c) 2000 ExPotato Co. Ltd (Excellent Potato) +TODO: +can't be emulated without proper mb bios + There also appears to be a sequel which may be running on the same hardware Come On Baby - Ballympic Heroes! (c) 2001 @@ -56,6 +59,8 @@ Easy enough to fix a broken game if you have the controls to plug into it. */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" @@ -64,21 +69,32 @@ { public: comebaby_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; -static VIDEO_START(comebaby) +void comebaby_state::video_start() { } -static SCREEN_UPDATE(comebaby) +UINT32 comebaby_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } -static ADDRESS_MAP_START( comebaby_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( comebaby_map, AS_PROGRAM, 32, comebaby_state ) AM_RANGE(0x00000000, 0x0001ffff) AM_ROM ADDRESS_MAP_END @@ -93,16 +109,13 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(comebaby_state, screen_update) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(comebaby) MCFG_PALETTE_LENGTH(0x100) - - MCFG_VIDEO_START(comebaby) MACHINE_CONFIG_END @@ -115,4 +128,4 @@ ROM_END -GAME( 2000, comebaby, 0, comebaby, comebaby, 0, ROT0, "ExPotato", "Come On Baby", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2000, comebaby, 0, comebaby, comebaby, 0, ROT0, "ExPotato", "Come On Baby", GAME_NOT_WORKING|GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/commando.c mame-0.145/src/mame/drivers/commando.c --- mame-0.144/src/mame/drivers/commando.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/commando.c 2012-02-06 21:30:40.000000000 +0000 @@ -264,11 +264,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(commando) - MCFG_SCREEN_EOF(commando) + MCFG_SCREEN_UPDATE_STATIC(commando) + MCFG_SCREEN_VBLANK_STATIC(commando) MCFG_GFXDECODE(commando) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/compgolf.c mame-0.145/src/mame/drivers/compgolf.c --- mame-0.144/src/mame/drivers/compgolf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/compgolf.c 2012-02-06 21:30:36.000000000 +0000 @@ -262,10 +262,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(1*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(compgolf) + MCFG_SCREEN_UPDATE_STATIC(compgolf) MCFG_PALETTE_LENGTH(0x100) MCFG_PALETTE_INIT(compgolf) diff -Nru mame-0.144/src/mame/drivers/contra.c mame-0.145/src/mame/drivers/contra.c --- mame-0.144/src/mame/drivers/contra.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/contra.c 2012-02-06 21:30:38.000000000 +0000 @@ -206,10 +206,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(37*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(contra) + MCFG_SCREEN_UPDATE_STATIC(contra) MCFG_GFXDECODE(contra) MCFG_PALETTE_LENGTH(2*8*16*16) diff -Nru mame-0.144/src/mame/drivers/coolpool.c mame-0.145/src/mame/drivers/coolpool.c --- mame-0.144/src/mame/drivers/coolpool.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/coolpool.c 2012-02-06 21:30:42.000000000 +0000 @@ -54,12 +54,12 @@ * *************************************/ -static void amerdart_scanline(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void amerdart_scanline(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { coolpool_state *state = screen.machine().driver_data(); UINT16 *vram = &state->m_vram_base[(params->rowaddr << 8) & 0xff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); rgb_t pens[16]; int coladdr = params->coladdr; int x; @@ -83,12 +83,12 @@ } -static void coolpool_scanline(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void coolpool_scanline(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { coolpool_state *state = screen.machine().driver_data(); UINT16 *vram = &state->m_vram_base[(params->rowaddr << 8) & 0x1ff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); int coladdr = params->coladdr; int x; @@ -835,7 +835,8 @@ "screen", /* the screen operated on */ XTAL_40MHz/12, /* pixel clock */ 2, /* pixels per clock */ - amerdart_scanline, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + amerdart_scanline, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ coolpool_to_shiftreg, /* write to shiftreg function */ coolpool_from_shiftreg /* read from shiftreg function */ @@ -848,7 +849,8 @@ "screen", /* the screen operated on */ XTAL_40MHz/6, /* pixel clock */ 1, /* pixels per clock */ - coolpool_scanline, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + coolpool_scanline, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ coolpool_to_shiftreg, /* write to shiftreg function */ coolpool_from_shiftreg /* read from shiftreg function */ @@ -882,9 +884,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_40MHz/6, 212*2, 0, 161*2, 262, 0, 241) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -914,9 +915,8 @@ MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_40MHz/6, 424, 0, 320, 262, 0, 240) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/coolridr.c mame-0.145/src/mame/drivers/coolridr.c --- mame-0.144/src/mame/drivers/coolridr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/coolridr.c 2012-02-06 21:30:33.000000000 +0000 @@ -6,6 +6,7 @@ special thanks to Guru for references and HW advices TODO: + - decode compressed GFX ROMs for "sprite" blitter (6,141,122 is the patent number) - DMA is still a bit of a mystery; - video emulation is pratically non-existant; - SCSP; @@ -248,7 +249,6 @@ #include "debugger.h" #include "cpu/sh2/sh2.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/scsp.h" @@ -256,7 +256,11 @@ { public: coolridr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_subcpu(*this,"sub"), + m_soundcpu(*this,"soundcpu") + { } UINT32* m_sysh1_workram_h; UINT32* m_framebuffer_vram; @@ -265,7 +269,7 @@ UINT32* m_h1_vram; UINT32* m_sysh1_txt_blit; UINT32* m_txt_vram; - bitmap_t* m_temp_bitmap_sprites; + bitmap_rgb32 m_temp_bitmap_sprites; UINT32 m_test_offs; int m_color; UINT8 m_vblank; @@ -276,6 +280,10 @@ UINT32 m_attr_buff[0x10]; UINT8 m_txt_index; UINT8 m_attr_index; + + required_device m_maincpu; + required_device m_subcpu; + required_device m_soundcpu; }; @@ -285,44 +293,41 @@ static VIDEO_START(coolridr) { coolridr_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); - - state->m_temp_bitmap_sprites = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); + machine.primary_screen->register_screen_bitmap(state->m_temp_bitmap_sprites); state->m_test_offs = 0x2000; } -static SCREEN_UPDATE(coolridr) +static SCREEN_UPDATE_RGB32(coolridr) { - coolridr_state *state = screen->machine().driver_data(); + coolridr_state *state = screen.machine().driver_data(); /* planes seems to basically be at 0x8000 and 0x28000... */ - const gfx_element *gfx = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[2]; UINT32 count; int y,x; - if(screen->machine().input().code_pressed(KEYCODE_Z)) + if(screen.machine().input().code_pressed(KEYCODE_Z)) state->m_test_offs+=4; - if(screen->machine().input().code_pressed(KEYCODE_X)) + if(screen.machine().input().code_pressed(KEYCODE_X)) state->m_test_offs-=4; - if(screen->machine().input().code_pressed(KEYCODE_C)) + if(screen.machine().input().code_pressed(KEYCODE_C)) state->m_test_offs+=0x40; - if(screen->machine().input().code_pressed(KEYCODE_V)) + if(screen.machine().input().code_pressed(KEYCODE_V)) state->m_test_offs-=0x40; - if(screen->machine().input().code_pressed(KEYCODE_B)) + if(screen.machine().input().code_pressed(KEYCODE_B)) state->m_test_offs+=0x400; - if(screen->machine().input().code_pressed(KEYCODE_N)) + if(screen.machine().input().code_pressed(KEYCODE_N)) state->m_test_offs-=0x400; - if(screen->machine().input().code_pressed_once(KEYCODE_A)) + if(screen.machine().input().code_pressed_once(KEYCODE_A)) state->m_color++; - if(screen->machine().input().code_pressed_once(KEYCODE_S)) + if(screen.machine().input().code_pressed_once(KEYCODE_S)) state->m_color--; if(state->m_test_offs > 0x100000*4) @@ -349,7 +354,7 @@ } copybitmap_trans(bitmap, state->m_temp_bitmap_sprites, 0, 0, 0, 0, cliprect, 0); - bitmap_fill(state->m_temp_bitmap_sprites, cliprect, 0); + state->m_temp_bitmap_sprites.fill(0, cliprect); return 0; @@ -469,12 +474,9 @@ y2 = (state->m_attr_buff[9] & 0x01ff0000) >> 16; x2 = (state->m_attr_buff[9] & 0x000001ff); - clip.min_x = 0; - clip.max_x = state->m_temp_bitmap_sprites->width; - clip.min_y = 0; - clip.max_y = state->m_temp_bitmap_sprites->height; + clip = state->m_temp_bitmap_sprites.cliprect(); - drawgfx_opaque(state->m_temp_bitmap_sprites,&clip,gfx,1,1,0,0,x2,y2); + drawgfx_opaque(state->m_temp_bitmap_sprites,clip,gfx,1,1,0,0,x2,y2); } } if(state->m_attr_index == 0xc) @@ -1064,26 +1066,23 @@ INPUT_PORTS_END -// IRQs 4 & 6 are valid on SH-2 +// IRQs 4, 6 (& 8?) are valid on SH-2 static INTERRUPT_GEN( system_h1 ) { device_set_input_line(device, 4, HOLD_LINE); -/* switch(cpu_getiloops(device)) - { - case 0: break; - case 1:device_set_input_line(device, 6, HOLD_LINE); break; -// case 2:device_set_input_line(device, 8, HOLD_LINE); break; - }*/ } //IRQs 10,12 and 14 are valid on SH-1 instead -static INTERRUPT_GEN( system_h1_sub ) +static TIMER_DEVICE_CALLBACK( system_h1_sub ) { - switch(cpu_getiloops(device)) + coolridr_state *state = timer.machine().driver_data(); + int scanline = param; + + switch(scanline) { - case 0:device_set_input_line(device, 0xa, HOLD_LINE); break; - case 1:device_set_input_line(device, 0xc, HOLD_LINE); break; - case 2:device_set_input_line(device, 0xe, HOLD_LINE); break; + case 512:device_set_input_line(state->m_subcpu, 0xa, HOLD_LINE); break; + case 256:device_set_input_line(state->m_subcpu, 0xc, HOLD_LINE); break; + case 0:device_set_input_line(state->m_subcpu, 0xe, HOLD_LINE); break; } } @@ -1098,22 +1097,21 @@ MCFG_CPU_PROGRAM_MAP(system_h1_map) MCFG_CPU_VBLANK_INT("screen",system_h1) - MCFG_CPU_ADD("soundcpu", M68000, 16000000) // 16 mhz + MCFG_CPU_ADD("soundcpu", M68000, 11289600) //256 x 44100 Hz = 11.2896 MHz MCFG_CPU_PROGRAM_MAP(system_h1_sound_map) MCFG_CPU_ADD("sub", SH1, 16000000) // SH7032 HD6417032F20!! 16 mhz MCFG_CPU_PROGRAM_MAP(coolridr_submap) - MCFG_CPU_VBLANK_INT_HACK(system_h1_sub, 3) + MCFG_TIMER_ADD_SCANLINE("scantimer", system_h1_sub, "screen", 0, 1) MCFG_GFXDECODE(coolridr) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(128*8, 64*8) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE(128*8+22, 64*8+44) MCFG_SCREEN_VISIBLE_AREA(0*8, 128*8-1, 0*8, 64*8-1) //TODO: these are just two different screens - MCFG_SCREEN_UPDATE(coolridr) + MCFG_SCREEN_UPDATE_STATIC(coolridr) MCFG_PALETTE_LENGTH(0x10000) MCFG_MACHINE_RESET(coolridr) @@ -1162,7 +1160,6 @@ ROM_LOAD32_WORD_SWAP( "mpr-17649.ic10",0x2000000, 0x0400000, CRC(618c47ae) SHA1(5b69ad36fcf8e70d34c3b2fc71412ce953c5ceb3) ) ROM_END -/*TODO: there must be an irq line with custom vector located somewhere that writes to here...*/ #if 0 static READ32_HANDLER( coolridr_hack1_r ) { @@ -1175,6 +1172,7 @@ } #endif +/*TODO: there must be an irq line with custom vector located somewhere that writes to here...*/ static READ32_HANDLER( coolridr_hack2_r ) { coolridr_state *state = space->machine().driver_data(); diff -Nru mame-0.144/src/mame/drivers/cop01.c mame-0.145/src/mame/drivers/cop01.c --- mame-0.144/src/mame/drivers/cop01.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cop01.c 2012-02-06 21:30:33.000000000 +0000 @@ -474,10 +474,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cop01) + MCFG_SCREEN_UPDATE_STATIC(cop01) MCFG_GFXDECODE(cop01) MCFG_PALETTE_LENGTH(16+8*16+16*16) @@ -517,10 +516,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cop01) + MCFG_SCREEN_UPDATE_STATIC(cop01) MCFG_GFXDECODE(cop01) MCFG_PALETTE_LENGTH(16+8*16+16*16) diff -Nru mame-0.144/src/mame/drivers/copsnrob.c mame-0.145/src/mame/drivers/copsnrob.c --- mame-0.144/src/mame/drivers/copsnrob.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/copsnrob.c 2012-02-06 21:30:40.000000000 +0000 @@ -279,10 +279,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 26*8-1) - MCFG_SCREEN_UPDATE(copsnrob) + MCFG_SCREEN_UPDATE_STATIC(copsnrob) MCFG_GFXDECODE(copsnrob) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/corona.c mame-0.145/src/mame/drivers/corona.c --- mame-0.144/src/mame/drivers/corona.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/corona.c 2012-02-06 21:30:38.000000000 +0000 @@ -447,26 +447,26 @@ state->m_videobuf = auto_alloc_array_clear(machine, UINT8, VIDEOBUF_SIZE); } -static SCREEN_UPDATE(winner) +static SCREEN_UPDATE_IND16(winner) { - corona_state *state = screen->machine().driver_data(); + corona_state *state = screen.machine().driver_data(); int x, y; for (y = 0; y < 256; y++) for (x = 0; x < 256; x++) - *BITMAP_ADDR16(bitmap, y, x) = state->m_videobuf[y * 512 + x]; + bitmap.pix16(y, x) = state->m_videobuf[y * 512 + x]; return 0; } -static SCREEN_UPDATE(luckyrlt) +static SCREEN_UPDATE_IND16(luckyrlt) { - corona_state *state = screen->machine().driver_data(); + corona_state *state = screen.machine().driver_data(); int x, y; for (y = 0; y < 256; y++) for (x = 0; x < 256; x++) - *BITMAP_ADDR16(bitmap, 255 - y, x) = state->m_videobuf[y * 512 + x]; + bitmap.pix16(255 - y, x) = state->m_videobuf[y * 512 + x]; return 0; } @@ -1362,12 +1362,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(winner) + MCFG_SCREEN_UPDATE_STATIC(winner) MCFG_PALETTE_LENGTH(0x100) @@ -1396,12 +1395,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(winner) + MCFG_SCREEN_UPDATE_STATIC(winner) MCFG_PALETTE_LENGTH(0x100) @@ -1430,12 +1428,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 32*8-1) - MCFG_SCREEN_UPDATE(winner) + MCFG_SCREEN_UPDATE_STATIC(winner) MCFG_PALETTE_LENGTH(0x100) @@ -1463,12 +1460,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 32*8-1) - MCFG_SCREEN_UPDATE(winner) + MCFG_SCREEN_UPDATE_STATIC(winner) MCFG_PALETTE_LENGTH(0x100) @@ -1497,12 +1493,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 30*8-1) - MCFG_SCREEN_UPDATE(luckyrlt) + MCFG_SCREEN_UPDATE_STATIC(luckyrlt) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/cosmic.c mame-0.145/src/mame/drivers/cosmic.c --- mame-0.144/src/mame/drivers/cosmic.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cosmic.c 2012-02-06 21:30:38.000000000 +0000 @@ -886,19 +886,19 @@ static const char *const cosmica_sample_names[] = { "*cosmica", - "backgr.wav", - "extend.wav", - "divea.wav", - "diveb1.wav", - "diveb2.wav", - "diveb3.wav", - "diveb4.wav", - "diveb5.wav", - "diveb6.wav", - "fire.wav", - "loudexp.wav", - "smallexp.wav", - "coin.wav", + "backgr", + "extend", + "divea", + "diveb1", + "diveb2", + "diveb3", + "diveb4", + "diveb5", + "diveb6", + "fire", + "loudexp", + "smallexp", + "coin", 0 /* end of array */ }; @@ -913,17 +913,17 @@ static const char *const panic_sample_names[] = { "*panic", - "walk.wav", - "upordown.wav", - "trapped.wav", - "falling.wav", - "escaping.wav", - "ekilled.wav", - "death.wav", - "elaugh.wav", - "extral.wav", - "oxygen.wav", - "coin.wav", + "walk", + "upordown", + "trapped", + "falling", + "escaping", + "ekilled", + "death", + "elaugh", + "extral", + "oxygen", + "coin", 0 }; @@ -936,21 +936,21 @@ static const char *const cosmicg_sample_names[] = { "*cosmicg", - "cg_m0.wav", /* 8 Different pitches of March Sound */ - "cg_m1.wav", - "cg_m2.wav", - "cg_m3.wav", - "cg_m4.wav", - "cg_m5.wav", - "cg_m6.wav", - "cg_m7.wav", - "cg_att.wav", /* Killer Attack */ - "cg_chnc.wav", /* Bonus Chance */ - "cg_gotb.wav", /* Got Bonus - have not got correct sound for */ - "cg_dest.wav", /* Gun Destroy */ - "cg_gun.wav", /* Gun Shot */ - "cg_gotm.wav", /* Got Monster */ - "cg_ext.wav", /* Coin Extend */ + "cg_m0", /* 8 Different pitches of March Sound */ + "cg_m1", + "cg_m2", + "cg_m3", + "cg_m4", + "cg_m5", + "cg_m6", + "cg_m7", + "cg_att", /* Killer Attack */ + "cg_chnc", /* Bonus Chance */ + "cg_gotb", /* Got Bonus - have not got correct sound for */ + "cg_dest", /* Gun Destroy */ + "cg_gun", /* Gun Shot */ + "cg_gotm", /* Got Monster */ + "cg_ext", /* Coin Extend */ 0 }; @@ -1001,7 +1001,6 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) MACHINE_CONFIG_END @@ -1031,7 +1030,7 @@ MCFG_PALETTE_INIT(panic) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(panic) + MCFG_SCREEN_UPDATE_STATIC(panic) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1057,7 +1056,7 @@ MCFG_PALETTE_INIT(cosmica) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(cosmica) + MCFG_SCREEN_UPDATE_STATIC(cosmica) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1089,10 +1088,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(cosmicg) + MCFG_SCREEN_UPDATE_STATIC(cosmicg) MCFG_PALETTE_LENGTH(16) @@ -1122,7 +1120,7 @@ MCFG_PALETTE_INIT(magspot) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(magspot) + MCFG_SCREEN_UPDATE_STATIC(magspot) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1138,7 +1136,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(devzone) + MCFG_SCREEN_UPDATE_STATIC(devzone) MACHINE_CONFIG_END @@ -1154,7 +1152,7 @@ MCFG_PALETTE_INIT(nomnlnd) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(nomnlnd) + MCFG_SCREEN_UPDATE_STATIC(nomnlnd) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/cps1.c mame-0.145/src/mame/drivers/cps1.c --- mame-0.144/src/mame/drivers/cps1.c 2012-01-13 15:34:35.000000000 +0000 +++ mame-0.145/src/mame/drivers/cps1.c 2012-02-06 21:30:38.000000000 +0000 @@ -2745,7 +2745,7 @@ INPUT_PORTS_END /* Needs further checking */ -static INPUT_PORTS_START( pang3n ) +static INPUT_PORTS_START( pang3b ) PORT_INCLUDE( pang3 ) PORT_MODIFY("DSWC") @@ -2983,8 +2983,28 @@ 64*8 }; -static GFXLAYOUT_RAW( cps1_layout16x16, 4, 16, 16, 8*8, 128*8 ) -static GFXLAYOUT_RAW( cps1_layout32x32, 4, 32, 32, 16*8, 512*8 ) +static const gfx_layout cps1_layout16x16 = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4, 9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4 }, + { STEP16(0,4*16) }, + 4*16*16 +}; + +static const gfx_layout cps1_layout32x32 = +{ + 32,32, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4, 9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4, + 17*4, 16*4, 19*4, 18*4, 21*4, 20*4, 23*4, 22*4, 25*4, 24*4, 27*4, 26*4, 29*4, 28*4, 31*4, 30*4 }, + { STEP32(0,4*32) }, + 4*32*32 +}; GFXDECODE_START( cps1 ) GFXDECODE_ENTRY( "gfx", 0, cps1_layout8x8, 0, 0x100 ) @@ -3053,11 +3073,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.61) /* verified on one of the input gates of the 74ls08@4J on GNG romboard 88620-b-2 */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(cps1) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(cps1) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(0xc00) @@ -3138,11 +3157,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(cps1) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(cps1) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(0xc00) @@ -3213,11 +3231,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(cps1) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(cps1) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(0xc00) @@ -3298,11 +3315,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(cps1) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(cps1) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(0xc00) @@ -3341,14 +3357,13 @@ /* B-Board 88621B-2 */ /* These ROMs read from a dead and very unique top board. All EPROMs are type 27C1000, except LW_00.13C which is a 27C512. - There are 6 surface mounted ROMs each on it's own small 88621B-sub satellite board, type HN62404FP-18 package is QFP44. + There are 5 surface mounted ROMs each on it's own small 88621B-sub satellite board, type HN62404FP-18 package is QFP44. The ROMs on the satellite boards are named and located as follows: LW-02 @ 6B LW-05 @ 6D LW-08 @ 9B LW-06 @ 9D - LW-13 @ 10D LW-07 @ 10G OTHER: @@ -3380,9 +3395,12 @@ ROMX_LOAD( "lw_14.10b", 0x200002, 0x20000, CRC(82862cce) SHA1(727ca4ee55e076185b071a49afc87533fde9ec27) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw_13.10a", 0x200003, 0x20000, CRC(b81c0e96) SHA1(09f4235786b8ff92a57112669c0385b64477eb01) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw-06.9d", 0x200004, 0x80000, CRC(5b9edffc) SHA1(6fd8f4a3ab070733b52365ab1945bf86acb2bf62) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-06.12e - ROMX_LOAD( "lw-13.10d", 0x200006, 0x80000, CRC(8e058ef5) SHA1(00f2c0050fd106276ea5398511c5861ebfbc0d10) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-13.12g + ROMX_LOAD( "lw_26.10e", 0x200006, 0x20000, CRC(57bcd032) SHA1(6db0f96fb909ed02fe4b7ee25fe662ea23f884d2) , ROM_SKIP(7) ) + ROMX_LOAD( "lw_25.10c", 0x200007, 0x20000, CRC(bac91554) SHA1(52f5de144193e0f78b9824cc8fd6f934dc19bab0) , ROM_SKIP(7) ) ROMX_LOAD( "lw_16.11b", 0x300002, 0x20000, CRC(40b26554) SHA1(b4b27573d6c329bc2bc4c64fd857475bf2a10877) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw_15.11a", 0x300003, 0x20000, CRC(1b7d2e07) SHA1(0edf4d4b314fd9c29e7915d5d1adef6f9617f921) , ROM_SKIP(7) ) // == lw-09.12f + ROMX_LOAD( "lw_28.11e", 0x300006, 0x20000, CRC(a805ad30) SHA1(baded4ab5fe4e87d53233b5df88edc693c292fc4) , ROM_SKIP(7) ) + ROMX_LOAD( "lw_27.11c", 0x300007, 0x20000, CRC(103c1bd2) SHA1(fc7ce74e108c30554139e55651c5348b11e9e3bd) , ROM_SKIP(7) ) ROM_REGION( 0x8000, "stars", 0 ) ROM_COPY( "gfx", 0x200000, 0x000000, 0x8000 ) @@ -3408,6 +3426,8 @@ ROM_END /* B-Board 88621B-2 */ +/* This set comes from a USA board with the same pcb layout of the parent forgottn, but uses one more surface mounted ROM + named LW-13 and located @ 10D instead of LW_25.10C, LW_26.10E, LW_27.11C, LW_28.11E EPROMs. */ /* Note that ROMs are labeled left to right, top to bottom, instead of top to bottom, left to right as usual. */ ROM_START( forgottnu ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) @@ -3432,7 +3452,12 @@ ROMX_LOAD( "lw_14.10b", 0x200002, 0x20000, CRC(82862cce) SHA1(727ca4ee55e076185b071a49afc87533fde9ec27) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw_13.10a", 0x200003, 0x20000, CRC(b81c0e96) SHA1(09f4235786b8ff92a57112669c0385b64477eb01) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw-06.9d", 0x200004, 0x80000, CRC(5b9edffc) SHA1(6fd8f4a3ab070733b52365ab1945bf86acb2bf62) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-06.12e - ROMX_LOAD( "lw-13.10d", 0x200006, 0x80000, CRC(8e058ef5) SHA1(00f2c0050fd106276ea5398511c5861ebfbc0d10) , ROM_GROUPWORD | ROM_SKIP(6) ) // == lw-13.12g + ROMX_LOAD( "lw-13.10d", 0x200006, 0x80000, BAD_DUMP CRC(8e058ef5) SHA1(00f2c0050fd106276ea5398511c5861ebfbc0d10) , ROM_GROUPWORD | ROM_SKIP(6) ) +/* +The dumper missed to dump the surface mounted ROM LW-13.10D assuming it was identical to the MASK ROM LW-13.12G taken from +the other sets, but it could not be correct since the four EPROMs used in forgottn LW_25.10C, LW_26.10E, LW_27.11C, LW_28.11E +doesn't match with LW-13.12G. +*/ ROMX_LOAD( "lw_16.11b", 0x300002, 0x20000, CRC(40b26554) SHA1(b4b27573d6c329bc2bc4c64fd857475bf2a10877) , ROM_SKIP(7) ) // == lw-09.12f ROMX_LOAD( "lw_15.11a", 0x300003, 0x20000, CRC(1b7d2e07) SHA1(0edf4d4b314fd9c29e7915d5d1adef6f9617f921) , ROM_SKIP(7) ) // == lw-09.12f @@ -3497,7 +3522,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, CRC(54ed4c39) SHA1(961309335dc1c84482ebe99ea938b32d3a6ae9a8) ) ROM_LOAD( "lwio.15e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END @@ -3539,7 +3564,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, CRC(54ed4c39) SHA1(961309335dc1c84482ebe99ea938b32d3a6ae9a8) ) ROM_LOAD( "lwio.15e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END @@ -3581,7 +3606,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "lwchr.3a", 0x0000, 0x0117, CRC(54ed4c39) SHA1(961309335dc1c84482ebe99ea938b32d3a6ae9a8) ) ROM_LOAD( "lwio.15e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END @@ -3936,6 +3961,10 @@ ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) ) ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "st22b.1a", 0x0000, 0x0117, CRC(68fecc55) SHA1(238f6781f972e834f2c6054cfe925ffec579dec3) ) + ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal & position verification required ROM_END /* B-Board 91634B-2 */ @@ -4083,7 +4112,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "tk22b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "tk22b.1a", 0x0000, 0x0117, CRC(1a1ab6d7) SHA1(eacd3a21a09683e1d8ad36215c1f8ea96a1f7c12) ) ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END @@ -4149,7 +4178,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "tk22b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "tk22b.1a", 0x0000, 0x0117, CRC(1a1ab6d7) SHA1(eacd3a21a09683e1d8ad36215c1f8ea96a1f7c12) ) ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END @@ -4534,16 +4563,17 @@ ROM_END /* B-Board 89624B-3 */ +/* Note that this set is equivalent to ffightu, but the 4Mbit MASK ROM FF-32M located @ 8H is replaced by 4 1Mbit EPROMs. */ ROM_START( ffightu1 ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "ff_36.11f", 0x00000, 0x20000, CRC(f9a5ce83) SHA1(0756ae576a1f6d5b8b22f8630dca40ef38567ea6) ) // in "30" socket ROM_LOAD16_BYTE( "ff_42.11h", 0x00001, 0x20000, CRC(65f11215) SHA1(5045a467f3e228c02b4a355b52f58263ffa90113) ) // in "35" socket ROM_LOAD16_BYTE( "ff_37.12f", 0x40000, 0x20000, CRC(e1033784) SHA1(38f44434c8befd623953ae23d6e5ff4e201d6627) ) // in "31" socket ROM_LOAD16_BYTE( "ffu_43.12h", 0x40001, 0x20000, CRC(4ca65947) SHA1(74ffe00df96273770a24d9a46f13e53ea8812670) ) // in "36" socket - ROM_LOAD16_BYTE( "ff_34.10f", 0x80000, 0x20000, CRC(0c8dc3fc) SHA1(edcce3efd9cdd131ef0c96df15a68722d5c3498e) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ff_40.10h", 0x80001, 0x20000, CRC(8075bab9) SHA1(f9c7405133f6fc5557c90e60e8ccc459e4f6fd7d) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ff_35.11f", 0xc0000, 0x20000, CRC(4a934121) SHA1(3982c261582755a0eac340d6d7ed96e6c263c8b6) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ff_41.11h", 0xc0001, 0x20000, CRC(2af68154) SHA1(7d549cb38650b4b79c68ad6d0dfcefdd62be4e99) ) // == ff-32m.8h + ROM_LOAD16_BYTE( "ff_34.9f", 0x80000, 0x20000, CRC(0c8dc3fc) SHA1(edcce3efd9cdd131ef0c96df15a68722d5c3498e) ) // in "28" socket // == ff-32m.8h + ROM_LOAD16_BYTE( "ff_40.9h", 0x80001, 0x20000, CRC(8075bab9) SHA1(f9c7405133f6fc5557c90e60e8ccc459e4f6fd7d) ) // in "33" socket // == ff-32m.8h + ROM_LOAD16_BYTE( "ff_35.10f", 0xc0000, 0x20000, CRC(4a934121) SHA1(3982c261582755a0eac340d6d7ed96e6c263c8b6) ) // in "29" socket // == ff-32m.8h + ROM_LOAD16_BYTE( "ff_41.10h", 0xc0001, 0x20000, CRC(2af68154) SHA1(7d549cb38650b4b79c68ad6d0dfcefdd62be4e99) ) // in "34" socket // == ff-32m.8h ROM_REGION( 0x200000, "gfx", 0 ) ROMX_LOAD( "ff-5m.7a", 0x000000, 0x80000, CRC(9c284108) SHA1(7868f5801347340867720255f8380548ad1a65a7) , ROM_GROUPWORD | ROM_SKIP(6) ) @@ -4552,7 +4582,7 @@ ROMX_LOAD( "ff-3m.5a", 0x000006, 0x80000, CRC(52291cd2) SHA1(df5f3d3aa96a7a33ff22f2a31382942c4c4f1111) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ff_09.12b", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) /* seen the same pcb with 23.12B */ + ROM_LOAD( "ff_09.12b", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -4577,7 +4607,7 @@ ROM_LOAD16_BYTE( "ffu_36.11f", 0x00000, 0x20000, CRC(e2a48af9) SHA1(11e06f95bdf575af396dded2b84d858f6c7388f1) ) // in "30" socket ROM_LOAD16_BYTE( "ffu_42.11h", 0x00001, 0x20000, CRC(f4bb480e) SHA1(32114df1d2f4f98a4a2280a330c7b6af8ab4d862) ) // in "35" socket ROM_LOAD16_BYTE( "ffu_37.12f", 0x40000, 0x20000, CRC(c371c667) SHA1(633977c91a8ff09b7fe83128eced7c4dee9aee1d) ) // in "31" socket - ROM_LOAD16_BYTE( "ffu_43.12h", 0x40001, 0x20000, CRC(2f5771f9) SHA1(fb532402bc00b5619a23dfa7e4525f1717020303) ) // in "36" socket + ROM_LOAD16_BYTE( "ffu_43.36", 0x40001, 0x20000, CRC(2f5771f9) SHA1(fb532402bc00b5619a23dfa7e4525f1717020303) ) // in "36" socket /* different CRC from ffightu, ffightu1 but same label, pcb verified */ ROM_LOAD16_WORD_SWAP( "ff-32m.8h", 0x80000, 0x80000, CRC(c747696e) SHA1(d3362dadded31ccb7eaf71ef282d698d18edd722) ) ROM_REGION( 0x200000, "gfx", 0 ) @@ -4641,13 +4671,13 @@ ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_END -/* B-Board 88622B */ +/* FIXME B-Board uncertain but should be 88622B/89625B from the program ROM names */ ROM_START( ffightj ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "ff_36.11f", 0x00000, 0x20000, CRC(f9a5ce83) SHA1(0756ae576a1f6d5b8b22f8630dca40ef38567ea6) ) - ROM_LOAD16_BYTE( "ff_42.11h", 0x00001, 0x20000, CRC(65f11215) SHA1(5045a467f3e228c02b4a355b52f58263ffa90113) ) - ROM_LOAD16_BYTE( "ff_37.12f", 0x40000, 0x20000, CRC(e1033784) SHA1(38f44434c8befd623953ae23d6e5ff4e201d6627) ) - ROM_LOAD16_BYTE( "ff_43.12h", 0x40001, 0x20000, CRC(b6dee1c3) SHA1(3a85312a2e9d8e06259b73d91ccb5e66a6bad62d) ) // Should this one be ffj_43.12h?? + ROM_LOAD16_BYTE( "ff36.bin", 0x00000, 0x20000, CRC(f9a5ce83) SHA1(0756ae576a1f6d5b8b22f8630dca40ef38567ea6) ) // == ff_36.11f + ROM_LOAD16_BYTE( "ff42.bin", 0x00001, 0x20000, CRC(65f11215) SHA1(5045a467f3e228c02b4a355b52f58263ffa90113) ) // == ff_42.11h + ROM_LOAD16_BYTE( "ff37.bin", 0x40000, 0x20000, CRC(e1033784) SHA1(38f44434c8befd623953ae23d6e5ff4e201d6627) ) // == ff_37.12f + ROM_LOAD16_BYTE( "ff43.bin", 0x40001, 0x20000, CRC(b6dee1c3) SHA1(3a85312a2e9d8e06259b73d91ccb5e66a6bad62d) ) ROM_LOAD16_BYTE( "ffj_34.10f", 0x80000, 0x20000, CRC(0c8dc3fc) SHA1(edcce3efd9cdd131ef0c96df15a68722d5c3498e) ) // == ff-32m.8h ROM_LOAD16_BYTE( "ffj_40.10h", 0x80001, 0x20000, CRC(8075bab9) SHA1(f9c7405133f6fc5557c90e60e8ccc459e4f6fd7d) ) // == ff-32m.8h ROM_LOAD16_BYTE( "ffj_35.11f", 0xc0000, 0x20000, CRC(4a934121) SHA1(3982c261582755a0eac340d6d7ed96e6c263c8b6) ) // == ff-32m.8h @@ -4672,12 +4702,12 @@ ROMX_LOAD( "ffj_33.9f", 0x100007, 0x20000, CRC(7369fa07) SHA1(3b2750fe33729395217c96909b4b6c5f3d6e9943) , ROM_SKIP(7) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ff_23.13c", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b + ROM_LOAD( "ff_23.bin", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "ffj_30.12e", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c - ROM_LOAD( "ffj_31.13e", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c + ROM_LOAD( "ffj_30.bin", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c + ROM_LOAD( "ffj_31.bin", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -4688,20 +4718,20 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "s222b.1a", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal verification required + ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal & position verification required ROM_END -/* B-Board 88622B-? */ +/* B-Board 89625B-1 */ ROM_START( ffightj1 ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "ffj_36.12f", 0x00000, 0x20000, CRC(e2a48af9) SHA1(11e06f95bdf575af396dded2b84d858f6c7388f1) ) // == ffu_36.11f - ROM_LOAD16_BYTE( "ffj_42.12h", 0x00001, 0x20000, CRC(f4bb480e) SHA1(32114df1d2f4f98a4a2280a330c7b6af8ab4d862) ) // == ffu_42.11h - ROM_LOAD16_BYTE( "ffj_37.13f", 0x40000, 0x20000, CRC(c371c667) SHA1(633977c91a8ff09b7fe83128eced7c4dee9aee1d) ) // == ffu_37.12f - ROM_LOAD16_BYTE( "ffj_43.13h", 0x40001, 0x20000, CRC(6f81f194) SHA1(2cddf75a0a607cf57395583876cf81bcca005871) ) - ROM_LOAD16_BYTE( "ffj_34.10f", 0x80000, 0x20000, CRC(0c8dc3fc) SHA1(edcce3efd9cdd131ef0c96df15a68722d5c3498e) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ffj_40.10h", 0x80001, 0x20000, CRC(8075bab9) SHA1(f9c7405133f6fc5557c90e60e8ccc459e4f6fd7d) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ffj_35.11f", 0xc0000, 0x20000, CRC(4a934121) SHA1(3982c261582755a0eac340d6d7ed96e6c263c8b6) ) // == ff-32m.8h - ROM_LOAD16_BYTE( "ffj_41.11h", 0xc0001, 0x20000, CRC(2af68154) SHA1(7d549cb38650b4b79c68ad6d0dfcefdd62be4e99) ) // == ff-32m.8h + ROM_LOAD16_BYTE( "ffj_36.12f", 0x00000, 0x20000, CRC(e2a48af9) SHA1(11e06f95bdf575af396dded2b84d858f6c7388f1) ) // == ffu_36.11f + ROM_LOAD16_BYTE( "ffj_42.12h", 0x00001, 0x20000, CRC(f4bb480e) SHA1(32114df1d2f4f98a4a2280a330c7b6af8ab4d862) ) // == ffu_42.11h + ROM_LOAD16_BYTE( "ffj_37.13f", 0x40000, 0x20000, CRC(c371c667) SHA1(633977c91a8ff09b7fe83128eced7c4dee9aee1d) ) // == ffu_37.12f + ROM_LOAD16_BYTE( "ffj_43.13h", 0x40001, 0x20000, CRC(6f81f194) SHA1(2cddf75a0a607cf57395583876cf81bcca005871) ) + ROM_LOAD16_BYTE( "ffj_34.10f", 0x80000, 0x20000, CRC(0c8dc3fc) SHA1(edcce3efd9cdd131ef0c96df15a68722d5c3498e) ) // == ff-32m.8h + ROM_LOAD16_BYTE( "ffj_40.10h", 0x80001, 0x20000, CRC(8075bab9) SHA1(f9c7405133f6fc5557c90e60e8ccc459e4f6fd7d) ) // == ff-32m.8h + ROM_LOAD16_BYTE( "ffj_35.11f", 0xc0000, 0x20000, CRC(4a934121) SHA1(3982c261582755a0eac340d6d7ed96e6c263c8b6) ) // == ff-32m.8h + ROM_LOAD16_BYTE( "ffj_41.11h", 0xc0001, 0x20000, CRC(2af68154) SHA1(7d549cb38650b4b79c68ad6d0dfcefdd62be4e99) ) // == ff-32m.8h ROM_REGION( 0x200000, "gfx", 0 ) ROMX_LOAD( "ffj_09.4b", 0x000000, 0x20000, CRC(5b116d0d) SHA1(a24e829fdfa043bd27b508d7cc0788ad80fd180e) , ROM_SKIP(7) ) @@ -4722,12 +4752,12 @@ ROMX_LOAD( "ffj_33.9f", 0x100007, 0x20000, CRC(7369fa07) SHA1(3b2750fe33729395217c96909b4b6c5f3d6e9943) , ROM_SKIP(7) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ff_23.13c", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b + ROM_LOAD( "ff_23.13b", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "ffj_30.12e", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c - ROM_LOAD( "ffj_31.13e", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c + ROM_LOAD( "ffj_30.12c", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c + ROM_LOAD( "ffj_31.13c", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -4738,10 +4768,10 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "s222b.1a", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal verification required + ROM_LOAD( "lwio.12e", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) ROM_END -/* FIXME B-Board uncertain, we assume it's the same as the other Japanese set */ +/* FIXME B-Board uncertain but should be 88622B/89625B from the program ROM names */ ROM_START( ffightj2 ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "ff30-36.rom", 0x00000, 0x20000, CRC(088ed1c9) SHA1(7b96cd45f4d3d2c0fe94904882652814b7790869) ) @@ -4772,12 +4802,12 @@ ROMX_LOAD( "ffj_33.9f", 0x100007, 0x20000, CRC(7369fa07) SHA1(3b2750fe33729395217c96909b4b6c5f3d6e9943) , ROM_SKIP(7) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ff_23.13c", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b + ROM_LOAD( "ff_23.bin", 0x00000, 0x08000, CRC(b8367eb5) SHA1(ec3db29fdd6200e9a8f4f8073a7e34aef731354f) ) // == ff_09.12b ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "ffj_30.12e", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c - ROM_LOAD( "ffj_31.13e", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c + ROM_LOAD( "ffj_30.bin", 0x00000, 0x20000, CRC(375c66e7) SHA1(36189e23209ce4ae5d9cbabd1574540d0591e7b3) ) // == ff_18.11c + ROM_LOAD( "ffj_31.bin", 0x20000, 0x20000, CRC(1ef137f9) SHA1(974b5e72aa28b87ebfa7438efbdfeda769dedf5e) ) // == ff_19.12c ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -4788,7 +4818,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "s222b.1a", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal verification required + ROM_LOAD( "lwio.12c", 0x0000, 0x0117, CRC(ad52b90c) SHA1(f0fd6aeea515ee449320fe15684e6b3ab7f97bf4) ) // pal & position verification required ROM_END /* B-Board 91634B-2 */ @@ -4830,7 +4860,7 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_END -/* FIXME B-Board PAL code implies 89624B, actual PCB locations need to be verified */ +/* B-Board 89624B-? */ ROM_START( 1941 ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "41e_30.11f", 0x00000, 0x20000, CRC(9deb1e75) SHA1(68d9f91bef6a5c9e1bcbf286629aed6b37b4acb9) ) @@ -4846,11 +4876,11 @@ ROMX_LOAD( "41-3m.5a", 0x000006, 0x80000, CRC(983be58f) SHA1(83a4decdd775f859240771269b8af3a5981b244c) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "41_9.12b", 0x00000, 0x08000, CRC(0f9d8527) SHA1(3a00dd5772f38081fde11d8d61ba467379e2a636) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "41_09.12b", 0x00000, 0x08000, CRC(0f9d8527) SHA1(3a00dd5772f38081fde11d8d61ba467379e2a636) ) // could be 41_9.12b + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "41_18.11c", 0x00000, 0x20000, CRC(d1f15aeb) SHA1(88089383f2d54fc97026a67f067d448eee5bd0c2) ) + ROM_LOAD( "41_18.11c", 0x00000, 0x20000, CRC(d1f15aeb) SHA1(88089383f2d54fc97026a67f067d448eee5bd0c2) ) // could be 41e_18.11c ROM_LOAD( "41_19.12c", 0x20000, 0x20000, CRC(15aec3a6) SHA1(8153c03aba005bab62bf0e8b3d15ec1c346326fd) ) ROM_REGION( 0x0200, "aboardplds", 0 ) @@ -4861,7 +4891,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "yi24b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "yi24b.1a", 0x0000, 0x0117, CRC(3004dcdf) SHA1(a73d86d1545af1d99a03d88af83449ec82b03c5c) ) ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) // pal verification required ROM_END @@ -4896,7 +4926,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "yi24b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "yi24b.1a", 0x0000, 0x0117, CRC(3004dcdf) SHA1(a73d86d1545af1d99a03d88af83449ec82b03c5c) ) ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_END @@ -4931,12 +4961,12 @@ ROMX_LOAD( "41_33.9f", 0x100007, 0x20000, CRC(7a31b0e2) SHA1(f2eca12f4e89266d923a94d0837c555bc1c6cb29) , ROM_SKIP(7) ) // == 41-3m.5a ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "41_23.13b", 0x00000, 0x08000, CRC(0f9d8527) SHA1(3a00dd5772f38081fde11d8d61ba467379e2a636) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "41_23.13b", 0x00000, 0x08000, CRC(0f9d8527) SHA1(3a00dd5772f38081fde11d8d61ba467379e2a636) ) + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "41_30.12c", 0x00000, 0x20000, CRC(d1f15aeb) SHA1(88089383f2d54fc97026a67f067d448eee5bd0c2) ) - ROM_LOAD( "41_31.13c", 0x20000, 0x20000, CRC(15aec3a6) SHA1(8153c03aba005bab62bf0e8b3d15ec1c346326fd) ) + ROM_LOAD( "41_30.12c", 0x00000, 0x20000, CRC(d1f15aeb) SHA1(88089383f2d54fc97026a67f067d448eee5bd0c2) ) + ROM_LOAD( "41_31.13c", 0x20000, 0x20000, CRC(15aec3a6) SHA1(8153c03aba005bab62bf0e8b3d15ec1c346326fd) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -5656,7 +5686,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // missing sticker, could be sf2_9.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // missing sticker, could be sf2_09.12a ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -5671,7 +5701,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -5705,7 +5735,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -5720,7 +5750,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -5756,7 +5786,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -5771,14 +5801,14 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob2.11d", 0x0000, 0x0117, NO_DUMP ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "c632b.ic1", 0x0000, 0x0117, NO_DUMP ) ROM_END -/* B-Board 90629B-2 & 90629B-3 */ +/* B-Board 90629B-2 */ ROM_START( sf2ua ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "sf2u_30a.11e", 0x00000, 0x20000, CRC(08beb861) SHA1(d47f16d0d692dc6405df0aecd7d9fc3f9718c0d1) ) @@ -5805,7 +5835,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -5820,7 +5850,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -5854,7 +5884,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -5869,7 +5899,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -5903,12 +5933,12 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.bin", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // could be sf2_09.12a + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "sf2_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) - ROM_LOAD( "sf2_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) + ROM_LOAD( "sf2_18.11c", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) + ROM_LOAD( "sf2_19.12c", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -5918,24 +5948,24 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) ROM_END -/* B-Board 90629B */ +/* B-Board 90629B-? */ ROM_START( sf2ud ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "sf2u_30d.11e", 0x00000, 0x20000, CRC(4bb2657c) SHA1(b2d077296b77be7db371f953b7fc446a67d8a9d6) ) ROM_LOAD16_BYTE( "sf2u_37d.11f", 0x00001, 0x20000, CRC(b33b42f2) SHA1(2e0babc8734c79dc2b51a6be64433bb2411c3da5) ) ROM_LOAD16_BYTE( "sf2u_31d.12e", 0x40000, 0x20000, CRC(d57b67d7) SHA1(43d0b47c9fada8d9b445caa4b96ac8493061aa8b) ) ROM_LOAD16_BYTE( "sf2u_38d.12f", 0x40001, 0x20000, CRC(9c8916ef) SHA1(a4629356a816454bcc1d7b41e70e147d4769a682) ) - ROM_LOAD16_BYTE( "sf2u_28d.9c", 0x80000, 0x20000, CRC(175819d1) SHA1(c98b6b7af4e57735dbfb3d1e61ba1bfb9f145d33) ) + ROM_LOAD16_BYTE( "sf2u_28d.9e", 0x80000, 0x20000, CRC(175819d1) SHA1(c98b6b7af4e57735dbfb3d1e61ba1bfb9f145d33) ) ROM_LOAD16_BYTE( "sf2u_35d.9f", 0x80001, 0x20000, CRC(82060da4) SHA1(7487cfc28cce3d76772ece657aef83b56034011e) ) - ROM_LOAD16_BYTE( "sf2_29a.10e", 0xc0000, 0x20000, CRC(bb4af315) SHA1(75f0827f4f7e9f292add46467f8d4fe19b2514c9) ) // == sf2_29b.10e - ROM_LOAD16_BYTE( "sf2_36a.10f", 0xc0001, 0x20000, CRC(c02a13eb) SHA1(b807cc495bff3f95d03b061fc629c95f965cb6d8) ) // == sf2_36b.10f + ROM_LOAD16_BYTE( "sf2_29b.10e", 0xc0000, 0x20000, CRC(bb4af315) SHA1(75f0827f4f7e9f292add46467f8d4fe19b2514c9) ) + ROM_LOAD16_BYTE( "sf2_36b.10f", 0xc0001, 0x20000, CRC(c02a13eb) SHA1(b807cc495bff3f95d03b061fc629c95f965cb6d8) ) ROM_REGION( 0x600000, "gfx", 0 ) ROMX_LOAD( "sf2-5m.4a", 0x000000, 0x80000, CRC(22c9cc8e) SHA1(b9194fb337b30502c1c9501cd6c64ae4035544d4) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "2" socket @@ -5952,12 +5982,12 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.bin", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // could be sf2_09.12a + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "sf2_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) - ROM_LOAD( "sf2_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) + ROM_LOAD( "sf2_18.11c", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) + ROM_LOAD( "sf2_19.12c", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -5967,7 +5997,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6003,7 +6033,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // missing sticker, could be sf2_9.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // missing sticker, could be sf2_09.12a ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6018,14 +6048,14 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob2.11d", 0x0000, 0x0117, NO_DUMP ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "c632b.ic1", 0x0000, 0x0117, NO_DUMP ) ROM_END -/* B-Board 90629B */ +/* B-Board 90629B-3 */ ROM_START( sf2uf ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "sf2u_30f.11e", 0x00000, 0x20000, CRC(fe39ee33) SHA1(22558eb15e035b09b80935a32b8425d91cd79669) ) // == sf2e_30g.11e @@ -6034,8 +6064,8 @@ ROM_LOAD16_BYTE( "sf2u_38f.12f", 0x40001, 0x20000, CRC(1510e4e2) SHA1(fbfdd4e42c4bc894592dbe5a84c88d5f13d21da4) ) ROM_LOAD16_BYTE( "sf2u_28f.9e", 0x80000, 0x20000, CRC(acd8175b) SHA1(504991c46fa568d31ce69bd63e2a67926a06b5a9) ) ROM_LOAD16_BYTE( "sf2u_35f.9f", 0x80001, 0x20000, CRC(c0a80bd1) SHA1(ac25a9ed488e03baf4115541fdcce3973ce6a442) ) - ROM_LOAD16_BYTE( "sf2_29a.10e", 0xc0000, 0x20000, CRC(bb4af315) SHA1(75f0827f4f7e9f292add46467f8d4fe19b2514c9) ) // == sf2_29b.10e - ROM_LOAD16_BYTE( "sf2_36a.10f", 0xc0001, 0x20000, CRC(c02a13eb) SHA1(b807cc495bff3f95d03b061fc629c95f965cb6d8) ) // == sf2_36b.10f + ROM_LOAD16_BYTE( "sf2_29b.10e", 0xc0000, 0x20000, CRC(bb4af315) SHA1(75f0827f4f7e9f292add46467f8d4fe19b2514c9) ) + ROM_LOAD16_BYTE( "sf2_36b.10f", 0xc0001, 0x20000, CRC(c02a13eb) SHA1(b807cc495bff3f95d03b061fc629c95f965cb6d8) ) ROM_REGION( 0x600000, "gfx", 0 ) ROMX_LOAD( "sf2-5m.4a", 0x000000, 0x80000, CRC(22c9cc8e) SHA1(b9194fb337b30502c1c9501cd6c64ae4035544d4) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "2" socket @@ -6052,12 +6082,12 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.bin", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "sf2_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) - ROM_LOAD( "sf2_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) + ROM_LOAD( "sf2_18.11c", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) + ROM_LOAD( "sf2_19.12c", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -6067,7 +6097,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6101,7 +6131,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2_9.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6116,7 +6146,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6150,7 +6180,7 @@ ROMX_LOAD( "sf2-11m.5d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "22" socket ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) + ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_9.12a ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6165,7 +6195,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6214,7 +6244,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6248,7 +6278,7 @@ ROMX_LOAD( "sf2_26.9d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // == sf2-11m.5d ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2j_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_09.12a + ROM_LOAD( "sf2j_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_9.12a ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6263,7 +6293,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6275,10 +6305,10 @@ ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "sf2j_30c.11e", 0x00000, 0x20000, CRC(8add35ec) SHA1(b08428ff262ca4feddd3c72058b4b674a5401aba) ) ROM_LOAD16_BYTE( "sf2j_37c.11f", 0x00001, 0x20000, CRC(0d74a256) SHA1(587fd0ee1c2ef54554237486eb5b0d1ec30c2868) ) - ROM_LOAD16_BYTE( "sf2j_31c.12e", 0x40000, 0x20000, CRC(c4fff4a9) SHA1(4b593ace201fe7f5a00b5cd7f4e8fc3f8dd4ceed) ) - ROM_LOAD16_BYTE( "sf2j_38c.12f", 0x40001, 0x20000, CRC(8210fc0e) SHA1(7d6cfb99afa89d0e6e991d9f7c1808b740def125) ) - ROM_LOAD16_BYTE( "sf2j_28c.9e", 0x80000, 0x20000, CRC(6eddd5e8) SHA1(62bd1c2fc0321809421c9a592f691b5b1a1d8807) ) - ROM_LOAD16_BYTE( "sf2j_35c.9f", 0x80001, 0x20000, CRC(6bcb404c) SHA1(b5f24556c633c521aadd94e016d78db6922e3dfa) ) + ROM_LOAD16_BYTE( "sf2j_31c.12e", 0x40000, 0x20000, CRC(c4fff4a9) SHA1(4b593ace201fe7f5a00b5cd7f4e8fc3f8dd4ceed) ) // == sf2u_31c.12e + ROM_LOAD16_BYTE( "sf2j_38c.12f", 0x40001, 0x20000, CRC(8210fc0e) SHA1(7d6cfb99afa89d0e6e991d9f7c1808b740def125) ) // == sf2u_38c.12f + ROM_LOAD16_BYTE( "sf2j_28c.9e", 0x80000, 0x20000, CRC(6eddd5e8) SHA1(62bd1c2fc0321809421c9a592f691b5b1a1d8807) ) // == sf2u_28c.9e + ROM_LOAD16_BYTE( "sf2j_35c.9f", 0x80001, 0x20000, CRC(6bcb404c) SHA1(b5f24556c633c521aadd94e016d78db6922e3dfa) ) // == sf2u_35c.9f ROM_LOAD16_BYTE( "sf2j_29c.10e", 0xc0000, 0x20000, CRC(bb4af315) SHA1(75f0827f4f7e9f292add46467f8d4fe19b2514c9) ) // == sf2_29b.10e ROM_LOAD16_BYTE( "sf2j_36c.10f", 0xc0001, 0x20000, CRC(c02a13eb) SHA1(b807cc495bff3f95d03b061fc629c95f965cb6d8) ) // == sf2_36b.10f @@ -6297,7 +6327,7 @@ ROMX_LOAD( "sf2_26.9d", 0x400006, 0x80000, CRC(0627c831) SHA1(f9a92d614e8877d648449de2612fc8b43c85e4c2) , ROM_GROUPWORD | ROM_SKIP(6) ) // == sf2-11m.5d ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // could be sf2j_09.12a + ROM_LOAD( "sf2_09.12a", 0x00000, 0x08000, CRC(a4823a1b) SHA1(7b6bf59dfd578bfbbdb64c27988796783442d659) ) // == sf2_9.12a // could be sf2j_09.12a ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6312,7 +6342,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "stf29.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "stf29.1a", 0x0000, 0x0117, CRC(043309c5) SHA1(f6b9610c9f896c495041ba56a654776a521c356b) ) ROM_LOAD( "iob1.11d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -6515,14 +6545,14 @@ /* B-Board 89624B-3 */ ROM_START( 3wondersu ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "3wonders.30", 0x00000, 0x20000, CRC(0b156fd8) SHA1(1ec811cd7cbd12066f876db7255394e754ceb25e) ) // missing sticker - ROM_LOAD16_BYTE( "3wonders.35", 0x00001, 0x20000, CRC(57350bf4) SHA1(33e8685cce82eee7bcb7c2787318a130764e97e2) ) // missing sticker - ROM_LOAD16_BYTE( "3wonders.31", 0x40000, 0x20000, CRC(0e723fcc) SHA1(91eeab6376a5aa852152af9920aef60bc7c689dd) ) // missing sticker - ROM_LOAD16_BYTE( "3wonders.36", 0x40001, 0x20000, CRC(523a45dc) SHA1(6d6743803016fa5ba713e0d6f61affce8a3255ec) ) // missing sticker - ROM_LOAD16_BYTE( "rt_28a.9f", 0x80000, 0x20000, CRC(054137c8) SHA1(e4c406e0a32198323a5931093fbaa6836510b8ad) ) - ROM_LOAD16_BYTE( "rt_33a.9h", 0x80001, 0x20000, CRC(7264cb1b) SHA1(b367acb9f6579569321ecaa98a14e29dd775b9db) ) - ROM_LOAD16_BYTE( "3wonders.29", 0xc0000, 0x20000, CRC(37ba3e20) SHA1(a128b1a17639b06a4fd8acffe0357f1dbd1d4fe9) ) // missing sticker - ROM_LOAD16_BYTE( "3wonders.34", 0xc0001, 0x20000, CRC(f99f46c0) SHA1(cda24a6baa3f861e7078fb2fa91328cc1cddc866) ) // missing sticker + ROM_LOAD16_BYTE( "rtu_30a.11f", 0x00000, 0x20000, CRC(0b156fd8) SHA1(1ec811cd7cbd12066f876db7255394e754ceb25e) ) + ROM_LOAD16_BYTE( "rtu_35a.11h", 0x00001, 0x20000, CRC(57350bf4) SHA1(33e8685cce82eee7bcb7c2787318a130764e97e2) ) + ROM_LOAD16_BYTE( "rtu_31a.12f", 0x40000, 0x20000, CRC(0e723fcc) SHA1(91eeab6376a5aa852152af9920aef60bc7c689dd) ) + ROM_LOAD16_BYTE( "rtu_36a.12h", 0x40001, 0x20000, CRC(523a45dc) SHA1(6d6743803016fa5ba713e0d6f61affce8a3255ec) ) + ROM_LOAD16_BYTE( "rt_28a.9f", 0x80000, 0x20000, CRC(054137c8) SHA1(e4c406e0a32198323a5931093fbaa6836510b8ad) ) + ROM_LOAD16_BYTE( "rt_33a.9h", 0x80001, 0x20000, CRC(7264cb1b) SHA1(b367acb9f6579569321ecaa98a14e29dd775b9db) ) + ROM_LOAD16_BYTE( "rtu_29a.10f", 0xc0000, 0x20000, CRC(37ba3e20) SHA1(a128b1a17639b06a4fd8acffe0357f1dbd1d4fe9) ) + ROM_LOAD16_BYTE( "rtu_34a.10h", 0xc0001, 0x20000, CRC(f99f46c0) SHA1(cda24a6baa3f861e7078fb2fa91328cc1cddc866) ) ROM_REGION( 0x400000, "gfx", 0 ) ROMX_LOAD( "rt-5m.7a", 0x000000, 0x80000, CRC(86aef804) SHA1(723927ef3bf992d12395c52db051ece7bf57d5e5) , ROM_GROUPWORD | ROM_SKIP(6) ) @@ -6551,7 +6581,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "rt24b.1a", 0x0000, 0x0117, CRC(54b85159) SHA1(c6f4fb5d747a215f4f50e4f2258e35d3f9bdbb2e) ) - ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) + ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) /* seen the same pcb with LWIO.11E */ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -6605,6 +6635,7 @@ ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ ROM_LOAD( "rt_23.13b", 0x00000, 0x08000, CRC(abfca165) SHA1(428069d3bdc45775854cd0e8abe447f134fe5492) ) // == rt_9.12b +// ROM_LOAD( "rt_23.13b", 0x00000, 0x08000, CRC(7d5a77a7) SHA1(4f2a6534d7a9e518061102c1dd7d7aca39600c33) ) // one byte different, verification required ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -6861,6 +6892,7 @@ ROM_END /* B-Board 89625B-1 */ +/* Note that this set is equivalent to kodj, but each 4Mbit EPROM is replaced by 4 1Mbit EPROMs. */ ROM_START( kodja ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "kdj_36a.12f", 0x00000, 0x20000, CRC(ebc788ad) SHA1(f4a297e409fcdbb2c15a13b39a16e4a83e7e060b) ) // == kdj_30a.11e @@ -6966,7 +6998,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "cc63b.1a", 0x0000, 0x0117, CRC(cae8f0f9) SHA1(eadbd45e184195b2d170cd71a68e5caed64b69f7) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) - ROM_LOAD( "ccprg1.11d", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "ccprg1.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -7009,7 +7041,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "cc63b.1a", 0x0000, 0x0117, CRC(cae8f0f9) SHA1(eadbd45e184195b2d170cd71a68e5caed64b69f7) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) - ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) + ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, NO_DUMP ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -7052,7 +7084,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "cc63b.1a", 0x0000, 0x0117, CRC(cae8f0f9) SHA1(eadbd45e184195b2d170cd71a68e5caed64b69f7) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) - ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) + ROM_LOAD( "ccprg1.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) /* seen the same pcb with CCPRG.11D */ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -7095,11 +7127,11 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "cc63b.1a", 0x0000, 0x0117, CRC(cae8f0f9) SHA1(eadbd45e184195b2d170cd71a68e5caed64b69f7) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) - ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) /* seen the same pcb with CCPRG1.11D */ + ROM_LOAD( "ccprg1.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) /* seen the same pcb with CCPRG.11D */ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) - ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) /* seen the same pcb with C632B.IC1 */ + ROM_LOAD( "c632b.ic1", 0x0000, 0x0117, NO_DUMP ) /* seen the same pcb with C632.IC1 */ ROM_END /* B-Board 91634B-2 */ @@ -7138,7 +7170,7 @@ ROM_REGION( 0x0200, "bboardplds", 0 ) ROM_LOAD( "cc63b.1a", 0x0000, 0x0117, CRC(cae8f0f9) SHA1(eadbd45e184195b2d170cd71a68e5caed64b69f7) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) - ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, CRC(e1c225c4) SHA1(97146451ca9aa3cecd443cc6881151ed8df47fbf) ) + ROM_LOAD( "ccprg.11d", 0x0000, 0x0117, NO_DUMP ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -7327,6 +7359,7 @@ ROM_END /* B-Board 89625B-1 */ +/* Note that this set is equivalent to knightsj, but each 4Mbit EPROM is replaced by 4 1Mbit EPROMs. */ ROM_START( knightsja ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "krj_36.12f", 0x00000, 0x20000, CRC(ad3d1a8e) SHA1(327f9e818f1500836fc549afeffbb2a3c5aafe8c) ) // == kr_23j.8f @@ -7604,12 +7637,12 @@ ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) ROM_END -/* B-Board 91635B */ +/* B-Board 91635B-2 */ ROM_START( sf2ceuc ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "s92-23c", 0x000000, 0x80000, CRC(0a8b6aa2) SHA1(a19871271172119e1cf1ff47700bb1917b08514b) ) - ROM_LOAD16_WORD_SWAP( "s92-22c", 0x080000, 0x80000, CRC(5fd8630b) SHA1(f0ef9c5ab91a4b421fb4b1747eef99c964c15de3) ) - ROM_LOAD16_WORD_SWAP( "s92-21b", 0x100000, 0x80000, CRC(b383cb1c) SHA1(fd527d5b27a853758bc6ed0f4108f3c634484de6) ) + ROM_LOAD16_WORD_SWAP( "s92u_23c.8f", 0x000000, 0x80000, CRC(0a8b6aa2) SHA1(a19871271172119e1cf1ff47700bb1917b08514b) ) + ROM_LOAD16_WORD_SWAP( "s92_22c.7f", 0x080000, 0x80000, CRC(5fd8630b) SHA1(f0ef9c5ab91a4b421fb4b1747eef99c964c15de3) ) + ROM_LOAD16_WORD_SWAP( "s92_21a.6f", 0x100000, 0x80000, CRC(925a7877) SHA1(1960dca35f0ca6f2b399a9fccfbc0132ac6425d1) ) ROM_REGION( 0x600000, "gfx", 0 ) ROMX_LOAD( "s92-1m.3a", 0x000000, 0x80000, CRC(03b0d852) SHA1(f370f25c96ad2b94f8c53d6b7139100285a25bef) , ROM_GROUPWORD | ROM_SKIP(6) ) @@ -7626,12 +7659,12 @@ ROMX_LOAD( "s92-13m.6c", 0x400006, 0x80000, CRC(ed2c67f6) SHA1(0083c0ffaf6fe7659ff0cf822be4346cd6e61329) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "s92_09.bin", 0x00000, 0x08000, CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "s92_09.11a", 0x00000, 0x08000, CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c) ) + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "s92_18.bin", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) - ROM_LOAD( "s92_19.bin", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) + ROM_LOAD( "s92_18.11c", 0x00000, 0x20000, CRC(7f162009) SHA1(346bf42992b4c36c593e21901e22c87ae4a7d86d) ) + ROM_LOAD( "s92_19.12c", 0x20000, 0x20000, CRC(beade53f) SHA1(277c397dc12752719ec6b47d2224750bd1c07f79) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -8349,7 +8382,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "va24b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "va24b.1a", 0x0000, 0x0117, CRC(cc476650) SHA1(a417f7971b8709023932fc2b68c9e3cd699ab6f2) ) ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_END @@ -8387,7 +8420,7 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "va24b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "va24b.1a", 0x0000, 0x0117, CRC(cc476650) SHA1(a417f7971b8709023932fc2b68c9e3cd699ab6f2) ) ROM_LOAD( "iob1.11e", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_END @@ -8555,31 +8588,31 @@ ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) ROM_END -/* FIXME B-Board uncertain but should be 91635B from the program ROM names */ +/* B-Board 91635B-2 */ ROM_START( wof ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "tk2e_23b.rom", 0x000000, 0x80000, CRC(11fb2ed1) SHA1(19e09ad6f9edc7997b030cddfe1d9c96d88135f2) ) - ROM_LOAD16_WORD_SWAP( "tk2e_22b.rom", 0x080000, 0x80000, CRC(479b3f24) SHA1(9fb8ae06856fe115addfb6794c28978a4f6716ec) ) + ROM_LOAD16_WORD_SWAP( "tk2e_23c.8f", 0x000000, 0x80000, CRC(0d708505) SHA1(10b8cb53a4600e3e76f471a3eee8a600e93096fc) ) + ROM_LOAD16_WORD_SWAP( "tk2e_22c.7f", 0x080000, 0x80000, CRC(608c17e3) SHA1(52c2d05279623d93b27856e6b76830796a089eae) ) ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "tk2_gfx1.rom", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx3.rom", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx2.rom", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx4.rom", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx5.rom", 0x200000, 0x80000, CRC(291f0f0b) SHA1(094baf0f960f25fc2525b3b1cc378a49d9a0955d) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx7.rom", 0x200002, 0x80000, CRC(3edeb949) SHA1(c155698dd9ee9eb24bbc97a21118ef2e897ea82f) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx6.rom", 0x200004, 0x80000, CRC(1abd14d6) SHA1(dffff3126f102b4ec028a81405fc5b9bd7bb65b3) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx8.rom", 0x200006, 0x80000, CRC(b27948e3) SHA1(870d5d23f56798831c641e877ea94217058b2ddc) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-1m.3a", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-3m.5a", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-2m.4a", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-4m.6a", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-5m.7a", 0x200000, 0x80000, CRC(291f0f0b) SHA1(094baf0f960f25fc2525b3b1cc378a49d9a0955d) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-7m.9a", 0x200002, 0x80000, CRC(3edeb949) SHA1(c155698dd9ee9eb24bbc97a21118ef2e897ea82f) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-6m.8a", 0x200004, 0x80000, CRC(1abd14d6) SHA1(dffff3126f102b4ec028a81405fc5b9bd7bb65b3) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-8m.10a", 0x200006, 0x80000, CRC(b27948e3) SHA1(870d5d23f56798831c641e877ea94217058b2ddc) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "tk2_qa.rom", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "tk2_qa.5k", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "tk2_q1.rom", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) - ROM_LOAD( "tk2_q2.rom", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) - ROM_LOAD( "tk2_q3.rom", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) - ROM_LOAD( "tk2_q4.rom", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) + ROM_LOAD( "tk2-q1.1k", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) + ROM_LOAD( "tk2-q2.2k", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) + ROM_LOAD( "tk2-q3.3k", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) + ROM_LOAD( "tk2-q4.4k", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -8594,6 +8627,59 @@ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) +ROM_END + +/* B-Board 91635B-2 */ +ROM_START( wofr1 ) + ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "tk2e_23b.8f", 0x000000, 0x80000, CRC(11fb2ed1) SHA1(19e09ad6f9edc7997b030cddfe1d9c96d88135f2) ) + ROM_LOAD16_WORD_SWAP( "tk2e_22b.7f", 0x080000, 0x80000, CRC(479b3f24) SHA1(9fb8ae06856fe115addfb6794c28978a4f6716ec) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROMX_LOAD( "tk2-1m.3a", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-3m.5a", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-2m.4a", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-4m.6a", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-5m.7a", 0x200000, 0x80000, CRC(291f0f0b) SHA1(094baf0f960f25fc2525b3b1cc378a49d9a0955d) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-7m.9a", 0x200002, 0x80000, CRC(3edeb949) SHA1(c155698dd9ee9eb24bbc97a21118ef2e897ea82f) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-6m.8a", 0x200004, 0x80000, CRC(1abd14d6) SHA1(dffff3126f102b4ec028a81405fc5b9bd7bb65b3) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-8m.10a", 0x200006, 0x80000, CRC(b27948e3) SHA1(870d5d23f56798831c641e877ea94217058b2ddc) , ROM_GROUPWORD | ROM_SKIP(6) ) + + ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ + ROM_LOAD( "tk2_qa.5k", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + + ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ + ROM_LOAD( "tk2-q1.1k", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) + ROM_LOAD( "tk2-q2.2k", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) + ROM_LOAD( "tk2-q3.3k", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) + ROM_LOAD( "tk2-q4.4k", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) + + ROM_REGION( 0x0200, "aboardplds", 0 ) + ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) + ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) ) + ROM_LOAD( "prg2", 0x0000, 0x0117, CRC(4386879a) SHA1(c36896d169d8c78393609acbbe4397931292a033) ) + ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "tk263b.1a", 0x0000, 0x0117, CRC(c4b0349b) SHA1(b4873dd5ad8735048deb3475222dde3c0b67eaaf) ) + ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) + ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) + + ROM_REGION( 0x0200, "cboardplds", 0 ) + ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* B-Board 91635B-2 */ @@ -8637,37 +8723,38 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END -/* FIXME B-Board uncertain but should be 91634B from the program ROM names */ +/* B-Board 91634B-2 */ +/* Note that this Asia set seems to be the only one where GFX are stored into MASK ROMs instead of the usual EPROMs. */ ROM_START( wofa ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "tk2a_23b.rom", 0x000000, 0x80000, CRC(2e024628) SHA1(647f8700fe3b410d798a823bac2e4a89cc9ad8d5) ) - ROM_LOAD16_WORD_SWAP( "tk2a_22b.rom", 0x080000, 0x80000, CRC(900ad4cd) SHA1(988007447f93f3467029b9c29fd9670a7ecadaa3) ) + ROM_LOAD16_WORD_SWAP( "tk2a_23c.8f", 0x000000, 0x80000, CRC(2e024628) SHA1(647f8700fe3b410d798a823bac2e4a89cc9ad8d5) ) + ROM_LOAD16_WORD_SWAP( "tk2a_22c.7f", 0x080000, 0x80000, CRC(900ad4cd) SHA1(988007447f93f3467029b9c29fd9670a7ecadaa3) ) ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "tk2_gfx1.rom", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx3.rom", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx2.rom", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx4.rom", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx5.rom", 0x200000, 0x80000, CRC(291f0f0b) SHA1(094baf0f960f25fc2525b3b1cc378a49d9a0955d) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx7.rom", 0x200002, 0x80000, CRC(3edeb949) SHA1(c155698dd9ee9eb24bbc97a21118ef2e897ea82f) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx6.rom", 0x200004, 0x80000, CRC(1abd14d6) SHA1(dffff3126f102b4ec028a81405fc5b9bd7bb65b3) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx8.rom", 0x200006, 0x80000, CRC(b27948e3) SHA1(870d5d23f56798831c641e877ea94217058b2ddc) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-1m.3a", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-3m.5a", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-2m.4a", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-4m.6a", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-5m.7a", 0x200000, 0x80000, CRC(291f0f0b) SHA1(094baf0f960f25fc2525b3b1cc378a49d9a0955d) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-7m.9a", 0x200002, 0x80000, CRC(3edeb949) SHA1(c155698dd9ee9eb24bbc97a21118ef2e897ea82f) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-6m.8a", 0x200004, 0x80000, CRC(1abd14d6) SHA1(dffff3126f102b4ec028a81405fc5b9bd7bb65b3) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-8m.10a", 0x200006, 0x80000, CRC(b27948e3) SHA1(870d5d23f56798831c641e877ea94217058b2ddc) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "tk2_qa.rom", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "tk2_qa.5k", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "tk2_q1.rom", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) - ROM_LOAD( "tk2_q2.rom", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) - ROM_LOAD( "tk2_q3.rom", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) - ROM_LOAD( "tk2_q4.rom", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) + ROM_LOAD( "tk2-q1.1k", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) + ROM_LOAD( "tk2-q2.2k", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) + ROM_LOAD( "tk2-q3.3k", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) + ROM_LOAD( "tk2-q4.4k", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -8682,33 +8769,39 @@ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END -/* FIXME B-Board uncertain but should be 91634B from the program ROM names */ +/* B-Board 91634B-2 */ ROM_START( wofj ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "tk2j23c.bin", 0x000000, 0x80000, CRC(9b215a68) SHA1(fc83ed26441fbfb15e21b093c7a6bed44b586e51) ) - ROM_LOAD16_WORD_SWAP( "tk2j22c.bin", 0x080000, 0x80000, CRC(b74b09ac) SHA1(3a44d6db5f51e1b5d2b43ef0ad1191da21e48427) ) + ROM_LOAD16_WORD_SWAP( "tk2j_23c.8f", 0x000000, 0x80000, CRC(9b215a68) SHA1(fc83ed26441fbfb15e21b093c7a6bed44b586e51) ) + ROM_LOAD16_WORD_SWAP( "tk2j_22c.7f", 0x080000, 0x80000, CRC(b74b09ac) SHA1(3a44d6db5f51e1b5d2b43ef0ad1191da21e48427) ) ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "tk2_gfx1.rom", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx3.rom", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx2.rom", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx4.rom", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk205.bin", 0x200000, 0x80000, CRC(e4a44d53) SHA1(b747679f4d63e5e62d9fd81b3120fba0401fadfb) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk206.bin", 0x200002, 0x80000, CRC(58066ba8) SHA1(c93af968e21094d020e4b2002e0c6fc0d746af0b) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk207.bin", 0x200004, 0x80000, CRC(d706568e) SHA1(7886414dc86c42e35d24b85c4bfa41a9f0c167ac) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk208.bin", 0x200006, 0x80000, CRC(d4a19a02) SHA1(ff396b1d33d9b4842140f2c6d085fe05748e3244) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2_01.3a", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2-1m.3a + ROMX_LOAD( "tk2_02.4a", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2-3m.5a + ROMX_LOAD( "tk2_03.5a", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2-2m.4a + ROMX_LOAD( "tk2_04.6a", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2-4m.6a + ROMX_LOAD( "tk2_05.7a", 0x200000, 0x80000, CRC(e4a44d53) SHA1(b747679f4d63e5e62d9fd81b3120fba0401fadfb) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2_06.8a", 0x200002, 0x80000, CRC(58066ba8) SHA1(c93af968e21094d020e4b2002e0c6fc0d746af0b) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2_07.9a", 0x200004, 0x80000, CRC(d706568e) SHA1(7886414dc86c42e35d24b85c4bfa41a9f0c167ac) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2_08.10a", 0x200006, 0x80000, CRC(d4a19a02) SHA1(ff396b1d33d9b4842140f2c6d085fe05748e3244) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "tk2_qa.rom", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "tk2_qa.5k", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "tk2_q1.rom", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) - ROM_LOAD( "tk2_q2.rom", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) - ROM_LOAD( "tk2_q3.rom", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) - ROM_LOAD( "tk2_q4.rom", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) + ROM_LOAD( "tk2-q1.1k", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) + ROM_LOAD( "tk2-q2.2k", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) + ROM_LOAD( "tk2-q3.3k", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) + ROM_LOAD( "tk2-q4.4k", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -8723,6 +8816,12 @@ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* Chinese bootleg board without QSound */ @@ -8922,7 +9021,7 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, CRC(ef72e902) SHA1(82fea3f63869c245d0dce2809085208fe719b57a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) @@ -8930,10 +9029,10 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* B-Board 91635B-2 */ @@ -8970,7 +9069,7 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, CRC(ef72e902) SHA1(82fea3f63869c245d0dce2809085208fe719b57a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) @@ -8978,38 +9077,38 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* FIXME B-Board uncertain but should be 91634B from the program ROM names */ ROM_START( dinoj ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "cdj-23a.8f", 0x000000, 0x80000, CRC(5f3ece96) SHA1(33ffb08ff8c5d3bfb2fa17fa00f254da2fc61f44) ) - ROM_LOAD16_WORD_SWAP( "cdj-22a.7f", 0x080000, 0x80000, CRC(a0d8de29) SHA1(79d916f181804b6176581efe2a1b7f210ec79c07) ) - ROM_LOAD16_WORD_SWAP( "cde_21a.rom", 0x100000, 0x80000, CRC(66d23de2) SHA1(19b8a365f630411d524d055459020f4c8cf930f1) ) + ROM_LOAD16_WORD_SWAP( "cdj_23a.8f", 0x000000, 0x80000, CRC(5f3ece96) SHA1(33ffb08ff8c5d3bfb2fa17fa00f254da2fc61f44) ) + ROM_LOAD16_WORD_SWAP( "cdj_22a.7f", 0x080000, 0x80000, CRC(a0d8de29) SHA1(79d916f181804b6176581efe2a1b7f210ec79c07) ) + ROM_LOAD16_WORD_SWAP( "cdj_21a.6f", 0x100000, 0x80000, CRC(66d23de2) SHA1(19b8a365f630411d524d055459020f4c8cf930f1) ) // == cde_21a.6f ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "cd_gfx01.rom", 0x000000, 0x80000, CRC(8da4f917) SHA1(4f7b2304b7d9b545d6707d7ec921d3e28200699d) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx03.rom", 0x000002, 0x80000, CRC(6c40f603) SHA1(cdbd11dfcec08e87355d7e21e9fd39f7eacab016) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx02.rom", 0x000004, 0x80000, CRC(09c8fc2d) SHA1(d0c0a1258ec5dd484ab6ec1c5663425431f929ee) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx04.rom", 0x000006, 0x80000, CRC(637ff38f) SHA1(859926b33b9955b3ed67471c61faa442d42b9696) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx05.rom", 0x200000, 0x80000, CRC(470befee) SHA1(a42e38319e9b7424381352512f11bd8edf0bbb96) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx07.rom", 0x200002, 0x80000, CRC(22bfb7a3) SHA1(c44959bd3d42b9fc8ecb482dfaf63fbd469d2c3e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx06.rom", 0x200004, 0x80000, CRC(e7599ac4) SHA1(0e788a38547a8701115d01190ddeaca64388db4d) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "cd_gfx08.rom", 0x200006, 0x80000, CRC(211b4b15) SHA1(374f6b185faa0f14f5c45b9b1d60d0772d93fb17) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "cd_01.3a", 0x000000, 0x80000, CRC(8da4f917) SHA1(4f7b2304b7d9b545d6707d7ec921d3e28200699d) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-1m.3a + ROMX_LOAD( "cd_02.4a", 0x000002, 0x80000, CRC(6c40f603) SHA1(cdbd11dfcec08e87355d7e21e9fd39f7eacab016) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-3m.5a + ROMX_LOAD( "cd_03.5a", 0x000004, 0x80000, CRC(09c8fc2d) SHA1(d0c0a1258ec5dd484ab6ec1c5663425431f929ee) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-2m.4a + ROMX_LOAD( "cd_04.6a", 0x000006, 0x80000, CRC(637ff38f) SHA1(859926b33b9955b3ed67471c61faa442d42b9696) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-4m.6a + ROMX_LOAD( "cd_05.7a", 0x200000, 0x80000, CRC(470befee) SHA1(a42e38319e9b7424381352512f11bd8edf0bbb96) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-5m.7a + ROMX_LOAD( "cd_06.8a", 0x200002, 0x80000, CRC(22bfb7a3) SHA1(c44959bd3d42b9fc8ecb482dfaf63fbd469d2c3e) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-7m.9a + ROMX_LOAD( "cd_07.9a", 0x200004, 0x80000, CRC(e7599ac4) SHA1(0e788a38547a8701115d01190ddeaca64388db4d) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-6m.8a + ROMX_LOAD( "cd_08.10a", 0x200006, 0x80000, CRC(211b4b15) SHA1(374f6b185faa0f14f5c45b9b1d60d0772d93fb17) , ROM_GROUPWORD | ROM_SKIP(6) ) // == cd-8m.10a ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "cd_q.rom", 0x00000, 0x08000, CRC(605fdb0b) SHA1(9da90ddc6513aaaf2260f0c69719c6b0e585ba8c) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "cd_q.5k", 0x00000, 0x08000, CRC(605fdb0b) SHA1(9da90ddc6513aaaf2260f0c69719c6b0e585ba8c) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "cd_q1.rom", 0x000000, 0x80000, CRC(60927775) SHA1(f8599bc84c38573ebbe8685822c58b6a38b50462) ) - ROM_LOAD( "cd_q2.rom", 0x080000, 0x80000, CRC(770f4c47) SHA1(fec8ef00a6669d4d5e37787ecc7b58ee46709326) ) - ROM_LOAD( "cd_q3.rom", 0x100000, 0x80000, CRC(2f273ffc) SHA1(f0de462f6c4d251911258e0ebd886152c14d1586) ) - ROM_LOAD( "cd_q4.rom", 0x180000, 0x80000, CRC(2c67821d) SHA1(6e2528d0b22508300a6a142a796dd3bf53a66946) ) + ROM_LOAD( "cd-q1.1k", 0x000000, 0x80000, CRC(60927775) SHA1(f8599bc84c38573ebbe8685822c58b6a38b50462) ) + ROM_LOAD( "cd-q2.2k", 0x080000, 0x80000, CRC(770f4c47) SHA1(fec8ef00a6669d4d5e37787ecc7b58ee46709326) ) + ROM_LOAD( "cd-q3.3k", 0x100000, 0x80000, CRC(2f273ffc) SHA1(f0de462f6c4d251911258e0ebd886152c14d1586) ) + ROM_LOAD( "cd-q4.4k", 0x180000, 0x80000, CRC(2c67821d) SHA1(6e2528d0b22508300a6a142a796dd3bf53a66946) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -9018,12 +9117,18 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cd63b.1a", 0x0000, 0x0117, CRC(ef72e902) SHA1(82fea3f63869c245d0dce2809085208fe719b57a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* @@ -9208,10 +9313,10 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* B-Board 91635B-2 */ @@ -9262,38 +9367,38 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* FIXME B-Board uncertain but should be 91634B from the program ROM names */ ROM_START( punisherj ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "psj23.bin", 0x000000, 0x80000, CRC(6b2fda52) SHA1(5f95a79b7b802609ae9ddd6641cc52610d428bf4) ) - ROM_LOAD16_WORD_SWAP( "psj22.bin", 0x080000, 0x80000, CRC(e01036bc) SHA1(a01886014dabe8f9ab45619865c6bd9f27472eae) ) - ROM_LOAD16_WORD_SWAP( "ps_21.rom", 0x100000, 0x80000, CRC(8affa5a9) SHA1(268760b83b1723ff50a019ec51ef7af2e49935bf) ) + ROM_LOAD16_WORD_SWAP( "psj_23.8f", 0x000000, 0x80000, CRC(6b2fda52) SHA1(5f95a79b7b802609ae9ddd6641cc52610d428bf4) ) + ROM_LOAD16_WORD_SWAP( "psj_22.7f", 0x080000, 0x80000, CRC(e01036bc) SHA1(a01886014dabe8f9ab45619865c6bd9f27472eae) ) + ROM_LOAD16_WORD_SWAP( "psj_21.6f", 0x100000, 0x80000, CRC(8affa5a9) SHA1(268760b83b1723ff50a019ec51ef7af2e49935bf) ) // == ps_21.6f ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "ps_gfx1.rom", 0x000000, 0x80000, CRC(77b7ccab) SHA1(e08e5d55a79e4c0c8ca819d6d7d2a14f753c6ec3) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx3.rom", 0x000002, 0x80000, CRC(0122720b) SHA1(5f0d3097e097f64106048156fbb0d343fe78fffa) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx2.rom", 0x000004, 0x80000, CRC(64fa58d4) SHA1(d4a774285ed15273195b6b26d2965ce370e54e73) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx4.rom", 0x000006, 0x80000, CRC(60da42c8) SHA1(95eec4a58d9628a2d9764951dd8dc11e4860a899) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx5.rom", 0x200000, 0x80000, CRC(c54ea839) SHA1(0733f37329edd9d0cace1319a7544b40aa7ecb0b) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx7.rom", 0x200002, 0x80000, CRC(04c5acbd) SHA1(fddc94b0f36d4d22d7c357856ae15b7514c342d3) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx6.rom", 0x200004, 0x80000, CRC(a544f4cc) SHA1(9552df8934ba25f19a22f2e07783712d8c8ef03c) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "ps_gfx8.rom", 0x200006, 0x80000, CRC(8f02f436) SHA1(a2f0ebb7e9593469c7b843f8962a66f3d77f79e5) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "ps_01.3a", 0x000000, 0x80000, CRC(77b7ccab) SHA1(e08e5d55a79e4c0c8ca819d6d7d2a14f753c6ec3) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-1m.3a + ROMX_LOAD( "ps_02.4a", 0x000002, 0x80000, CRC(0122720b) SHA1(5f0d3097e097f64106048156fbb0d343fe78fffa) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-3m.5a + ROMX_LOAD( "ps_03.5a", 0x000004, 0x80000, CRC(64fa58d4) SHA1(d4a774285ed15273195b6b26d2965ce370e54e73) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-2m.4a + ROMX_LOAD( "ps_04.6a", 0x000006, 0x80000, CRC(60da42c8) SHA1(95eec4a58d9628a2d9764951dd8dc11e4860a899) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-4m.6a + ROMX_LOAD( "ps_05.7a", 0x200000, 0x80000, CRC(c54ea839) SHA1(0733f37329edd9d0cace1319a7544b40aa7ecb0b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-5m.7a + ROMX_LOAD( "ps_06.8a", 0x200002, 0x80000, CRC(04c5acbd) SHA1(fddc94b0f36d4d22d7c357856ae15b7514c342d3) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-7m.9a + ROMX_LOAD( "ps_07.9a", 0x200004, 0x80000, CRC(a544f4cc) SHA1(9552df8934ba25f19a22f2e07783712d8c8ef03c) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-6m.8a + ROMX_LOAD( "ps_08.10a", 0x200006, 0x80000, CRC(8f02f436) SHA1(a2f0ebb7e9593469c7b843f8962a66f3d77f79e5) , ROM_GROUPWORD | ROM_SKIP(6) ) // == ps-8m.10a ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "ps_q.rom", 0x00000, 0x08000, CRC(49ff4446) SHA1(87af12f87a940a6c5428b4574ad44a4b54867bc3) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "ps_q.5k", 0x00000, 0x08000, CRC(49ff4446) SHA1(87af12f87a940a6c5428b4574ad44a4b54867bc3) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "ps_q1.rom", 0x000000, 0x80000, CRC(31fd8726) SHA1(1d73a76682e9fb908db0c55b9a18163f7539fea1) ) - ROM_LOAD( "ps_q2.rom", 0x080000, 0x80000, CRC(980a9eef) SHA1(36571381f349bc726508a7e618ba1c635ec9d271) ) - ROM_LOAD( "ps_q3.rom", 0x100000, 0x80000, CRC(0dd44491) SHA1(903cea1d7f3120545ea3229d30fbd687d11ad68f) ) - ROM_LOAD( "ps_q4.rom", 0x180000, 0x80000, CRC(bed42f03) SHA1(21302f7e75f9c795392a3b34e16a959fc5f6e4e9) ) + ROM_LOAD( "ps-q1.1k", 0x000000, 0x80000, CRC(31fd8726) SHA1(1d73a76682e9fb908db0c55b9a18163f7539fea1) ) + ROM_LOAD( "ps-q2.2k", 0x080000, 0x80000, CRC(980a9eef) SHA1(36571381f349bc726508a7e618ba1c635ec9d271) ) + ROM_LOAD( "ps-q3.3k", 0x100000, 0x80000, CRC(0dd44491) SHA1(903cea1d7f3120545ea3229d30fbd687d11ad68f) ) + ROM_LOAD( "ps-q4.4k", 0x180000, 0x80000, CRC(bed42f03) SHA1(21302f7e75f9c795392a3b34e16a959fc5f6e4e9) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -9308,6 +9413,12 @@ ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* bootleg with pic, like dinopic / dinopic2 */ @@ -9517,7 +9628,7 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, CRC(b8392f02) SHA1(8dedf9f43b30991694f8009302ca628cb50a0b1a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) @@ -9525,10 +9636,10 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* B-Board 91635B-2 */ @@ -9580,7 +9691,7 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, CRC(b8392f02) SHA1(8dedf9f43b30991694f8009302ca628cb50a0b1a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) @@ -9588,10 +9699,10 @@ ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_REGION( 0x0200, "dboardplds", 0 ) - ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* FIXME B-Board uncertain but should be 91634B from the program ROM names */ @@ -9620,21 +9731,21 @@ ROMX_LOAD( "mb_13.bin", 0x400006, 0x80000, CRC(da810d5f) SHA1(392bbd405244b8c99024c9228cfec6a7ef0accdb) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "mb_qa.rom", 0x00000, 0x08000, CRC(e21a03c4) SHA1(98c03fd2c9b6bf8a4fc25a4edca87fff7c3c3819) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "mb_qa.5k", 0x00000, 0x08000, CRC(e21a03c4) SHA1(98c03fd2c9b6bf8a4fc25a4edca87fff7c3c3819) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x8000, "user1", 0 ) ROM_COPY( "audiocpu", 0x00000, 0x00000, 0x8000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "mb_q1.bin", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) - ROM_LOAD( "mb_q2.bin", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) - ROM_LOAD( "mb_q3.bin", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) - ROM_LOAD( "mb_q4.bin", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) - ROM_LOAD( "mb_q5.bin", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) - ROM_LOAD( "mb_q6.bin", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) - ROM_LOAD( "mb_q7.bin", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) - ROM_LOAD( "mb_q8.bin", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) + ROM_LOAD( "mb-q1.1k", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) + ROM_LOAD( "mb-q2.2k", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) + ROM_LOAD( "mb-q3.3k", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) + ROM_LOAD( "mb-q4.4k", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) + ROM_LOAD( "mb-q5.1m", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) + ROM_LOAD( "mb-q6.2m", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) + ROM_LOAD( "mb-q7.3m", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) + ROM_LOAD( "mb-q8.4m", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -9643,12 +9754,18 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, CRC(b8392f02) SHA1(8dedf9f43b30991694f8009302ca628cb50a0b1a) ) ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* FIXME B-Board uncertain but should be 91635B from the program ROM names */ @@ -9680,18 +9797,18 @@ ROMX_LOAD( "mb_13.bin", 0x400006, 0x80000, CRC(da810d5f) SHA1(392bbd405244b8c99024c9228cfec6a7ef0accdb) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "mb_q.bin", 0x00000, 0x08000, CRC(d6fa76d1) SHA1(3bfcb703e0e458ef1bb843230f8537167f1d4c3c) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "mb_q.5k", 0x00000, 0x08000, CRC(d6fa76d1) SHA1(3bfcb703e0e458ef1bb843230f8537167f1d4c3c) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "mb_q1.bin", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) - ROM_LOAD( "mb_q2.bin", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) - ROM_LOAD( "mb_q3.bin", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) - ROM_LOAD( "mb_q4.bin", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) - ROM_LOAD( "mb_q5.bin", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) - ROM_LOAD( "mb_q6.bin", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) - ROM_LOAD( "mb_q7.bin", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) - ROM_LOAD( "mb_q8.bin", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) + ROM_LOAD( "mb-q1.1k", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) + ROM_LOAD( "mb-q2.2k", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) + ROM_LOAD( "mb-q3.3k", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) + ROM_LOAD( "mb-q4.4k", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) + ROM_LOAD( "mb-q5.1m", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) + ROM_LOAD( "mb-q6.2m", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) + ROM_LOAD( "mb-q7.3m", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) + ROM_LOAD( "mb-q8.4m", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -9700,12 +9817,18 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, NO_DUMP ) // supposing it's the same as slammast and clones, pal verification required + ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, CRC(b8392f02) SHA1(8dedf9f43b30991694f8009302ca628cb50a0b1a) ) // supposing it's the same as slammast and clones, pal verification required ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* FIXME B-Board uncertain but should be 91634B from the program ROM names */ @@ -9737,18 +9860,18 @@ ROMX_LOAD( "mb_13.bin", 0x400006, 0x80000, CRC(da810d5f) SHA1(392bbd405244b8c99024c9228cfec6a7ef0accdb) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "mb_q.bin", 0x00000, 0x08000, CRC(d6fa76d1) SHA1(3bfcb703e0e458ef1bb843230f8537167f1d4c3c) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "mb_q.5k", 0x00000, 0x08000, CRC(d6fa76d1) SHA1(3bfcb703e0e458ef1bb843230f8537167f1d4c3c) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "mb_q1.bin", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) - ROM_LOAD( "mb_q2.bin", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) - ROM_LOAD( "mb_q3.bin", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) - ROM_LOAD( "mb_q4.bin", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) - ROM_LOAD( "mb_q5.bin", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) - ROM_LOAD( "mb_q6.bin", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) - ROM_LOAD( "mb_q7.bin", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) - ROM_LOAD( "mb_q8.bin", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) + ROM_LOAD( "mb-q1.1k", 0x000000, 0x80000, CRC(0630c3ce) SHA1(520fc74c5c3638f611fa2f1b5efb08b91747e29b) ) + ROM_LOAD( "mb-q2.2k", 0x080000, 0x80000, CRC(354f9c21) SHA1(1dc6b39791fd0f760697f409a6b62361a7bf62e9) ) + ROM_LOAD( "mb-q3.3k", 0x100000, 0x80000, CRC(7838487c) SHA1(056b7da05cfca46873edacd674ca25c70855c6db) ) + ROM_LOAD( "mb-q4.4k", 0x180000, 0x80000, CRC(ab66e087) SHA1(066ea69a0157e8647eea3c44d0a1843898860678) ) + ROM_LOAD( "mb-q5.1m", 0x200000, 0x80000, CRC(c789fef2) SHA1(10d1e3d92288fccd4e064a3716a788a165efc3c9) ) + ROM_LOAD( "mb-q6.2m", 0x280000, 0x80000, CRC(ecb81b61) SHA1(e339f21ae47de4782f3b338befcdac659c3503f6) ) + ROM_LOAD( "mb-q7.3m", 0x300000, 0x80000, CRC(041e49ba) SHA1(3220b033a5c0cfbbe75c0c113cf2db39fb093a7e) ) + ROM_LOAD( "mb-q8.4m", 0x380000, 0x80000, CRC(59fe702a) SHA1(807178dfc6d864e49fd7aabb5c4895835cf0e85b) ) ROM_REGION( 0x0200, "aboardplds", 0 ) ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) @@ -9757,12 +9880,18 @@ ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, NO_DUMP ) // supposing it's the same as slammast and clones, pal verification required + ROM_LOAD( "mb63b.1a", 0x0000, 0x0117, CRC(b8392f02) SHA1(8dedf9f43b30991694f8009302ca628cb50a0b1a) ) // supposing it's the same as slammast and clones, pal verification required ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic1", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k2.9k", 0x0000, 0x0117, CRC(cd85a156) SHA1(a88f8939c5d93e65d7bcc0eb3ee5b6f4f1114e3a) ) // pal verification required + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END /* B-Board 89625B-1 */ @@ -9871,7 +10000,8 @@ ROM_CONTINUE( 0x000006, 0x100000 ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(90a08c46) SHA1(7544adab2d7e052e0d21c920bff7841d9d718345) ) + ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(cb1423a2) SHA1(3191bf5d340168647881738cb2aed09b1d86146e) ) + ROM_IGNORE( 0x18000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ ROM_LOAD( "pa3_05.10d", 0x00000, 0x20000, CRC(73a10d5d) SHA1(999465e4fbc35a34746d2db61ad49f61403d5af7) ) @@ -9885,8 +10015,8 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, CRC(3979b8e3) SHA1(07c9819d68b4d93bc37b96bd15d689ce54fe034e) ) + ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, CRC(8a52ea7a) SHA1(47a59abc54a83292cfd6faa2d293c8f948c7ea03) ) ROM_LOAD( "cp1b9ka.9k", 0x0000, 0x0117, NO_DUMP ) ROM_REGION( 0x0200, "cboardplds", 0 ) @@ -9895,10 +10025,10 @@ ROM_END /* B-Board 94916-10 */ -ROM_START( pang3n ) /* this set isn't encrypted, is it actually an original? */ +ROM_START( pang3r1 ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "pa3w_17.11l", 0x00000, 0x80000, CRC(12138234) SHA1(956a2c847a3cfb94007d1a636167fd2bb9f826ec) ) // should be pa3e_17.11l - ROM_LOAD16_WORD_SWAP( "pa3w_16.10l", 0x80000, 0x80000, CRC(d1ba585c) SHA1(c6d04441fe97abf0a72b23c917777a7b58e94a85) ) // should be pa3e_16.10l + ROM_LOAD16_WORD_SWAP( "pa3e_17.11l", 0x00000, 0x80000, CRC(d7041d32) SHA1(b021f3defe7fc58030ba907125c713f987724187) ) + ROM_LOAD16_WORD_SWAP( "pa3e_16.10l", 0x80000, 0x80000, CRC(1be9a483) SHA1(6cff1dd15ca163237bc82fb4a3e1d469d35e7be8) ) ROM_REGION( 0x400000, "gfx", 0 ) ROMX_LOAD( "pa3-01m.2c", 0x000000, 0x100000, CRC(068a152c) SHA1(fa491874068924c39bcc7de93dfda3b27f5d9613) , ROM_GROUPWORD | ROM_SKIP(6) ) @@ -9907,7 +10037,8 @@ ROM_CONTINUE( 0x000006, 0x100000 ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(90a08c46) SHA1(7544adab2d7e052e0d21c920bff7841d9d718345) ) + ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(cb1423a2) SHA1(3191bf5d340168647881738cb2aed09b1d86146e) ) + ROM_IGNORE( 0x18000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ ROM_LOAD( "pa3_05.10d", 0x00000, 0x20000, CRC(73a10d5d) SHA1(999465e4fbc35a34746d2db61ad49f61403d5af7) ) @@ -9921,9 +10052,9 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "cp1b9ka.9k", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, CRC(3979b8e3) SHA1(07c9819d68b4d93bc37b96bd15d689ce54fe034e) ) + ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, CRC(8a52ea7a) SHA1(47a59abc54a83292cfd6faa2d293c8f948c7ea03) ) + ROM_LOAD( "cp1b9k.9k", 0x0000, 0x0117, CRC(a754bdc3) SHA1(9267b24cbddee4858b219468cc92f9df8f5fd0ef) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) @@ -9943,7 +10074,8 @@ ROM_CONTINUE( 0x000006, 0x100000 ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(90a08c46) SHA1(7544adab2d7e052e0d21c920bff7841d9d718345) ) + ROM_LOAD( "pa3_11.11f", 0x00000, 0x08000, CRC(cb1423a2) SHA1(3191bf5d340168647881738cb2aed09b1d86146e) ) + ROM_IGNORE( 0x18000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ ROM_LOAD( "pa3_05.10d", 0x00000, 0x20000, CRC(73a10d5d) SHA1(999465e4fbc35a34746d2db61ad49f61403d5af7) ) @@ -9957,16 +10089,56 @@ ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) ROM_REGION( 0x0200, "bboardplds", 0 ) - ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, NO_DUMP ) - ROM_LOAD( "cp1b9ka.9k", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, CRC(3979b8e3) SHA1(07c9819d68b4d93bc37b96bd15d689ce54fe034e) ) + ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, CRC(8a52ea7a) SHA1(47a59abc54a83292cfd6faa2d293c8f948c7ea03) ) + ROM_LOAD( "cp1b9k.9k", 0x0000, 0x0117, CRC(a754bdc3) SHA1(9267b24cbddee4858b219468cc92f9df8f5fd0ef) ) ROM_REGION( 0x0200, "cboardplds", 0 ) ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) ROM_END -/* B-Board 91634B-2 */ +/* B-Board 94916-10 */ +/* This set comes from a not encrypted bootleg that uses a very well reproduced Mitchell 94916-10 B-Board surmounted by an + original Capcom 92631C-6 C-Board. Mitchell mark has been erased, original 32 pin EPROM PA3_11.11F resized and replaced by + one with 28 pin while the protection chip MACH215 mounted on the B-Board has been replaced by a 22 pin PAL. */ +ROM_START( pang3b ) + ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_WORD_SWAP( "pa3w_17.11l", 0x00000, 0x80000, CRC(12138234) SHA1(956a2c847a3cfb94007d1a636167fd2bb9f826ec) ) + ROM_LOAD16_WORD_SWAP( "pa3w_16.10l", 0x80000, 0x80000, CRC(d1ba585c) SHA1(c6d04441fe97abf0a72b23c917777a7b58e94a85) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROMX_LOAD( "pa3-01m.2c", 0x000000, 0x100000, CRC(068a152c) SHA1(fa491874068924c39bcc7de93dfda3b27f5d9613) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROM_CONTINUE( 0x000004, 0x100000 ) + ROMX_LOAD( "pa3-07m.2f", 0x000002, 0x100000, CRC(3a4a619d) SHA1(cfe68e24632b53fb6cd6d03b2166d6b5ba28b778) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROM_CONTINUE( 0x000006, 0x100000 ) + + ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "pa3_11.11", 0x00000, 0x08000, CRC(90a08c46) SHA1(7544adab2d7e052e0d21c920bff7841d9d718345) ) // == pa3_11.11f but different size, resized by bootlegger + + ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ + ROM_LOAD( "pa3_05.10d", 0x00000, 0x20000, CRC(73a10d5d) SHA1(999465e4fbc35a34746d2db61ad49f61403d5af7) ) + ROM_LOAD( "pa3_06.11d", 0x20000, 0x20000, CRC(affa4f82) SHA1(27b9292bbc121cf585f53297a79fe8f0d0a729ae) ) + + ROM_REGION( 0x0200, "aboardplds", 0 ) + ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) + ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) ) + ROM_LOAD( "prg1", 0x0000, 0x0117, CRC(f1129744) SHA1(a5300f301c1a08a7da768f0773fa0fe3f683b237) ) + ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) + ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "cp1b1f.1f", 0x0000, 0x0117, CRC(3979b8e3) SHA1(07c9819d68b4d93bc37b96bd15d689ce54fe034e) ) + ROM_LOAD( "cp1b8k.8k", 0x0000, 0x0117, CRC(8a52ea7a) SHA1(47a59abc54a83292cfd6faa2d293c8f948c7ea03) ) + ROM_LOAD( "cp1b9k.9k", 0x0000, 0x0117, CRC(a754bdc3) SHA1(9267b24cbddee4858b219468cc92f9df8f5fd0ef) ) + + ROM_REGION( 0x0200, "cboardplds", 0 ) + ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) +ROM_END + +/* B-Board 91635B-2 */ +/* Note that this USA set seems to be the only one where GFX are stored into EPROMs instead of the usual MASK ROMs. */ ROM_START( megaman ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_WORD_SWAP( "rcmu_23b.8f", 0x000000, 0x80000, CRC(1cd33c7a) SHA1(687fb3b6d660d7350447193f1911c47972e7a020) ) @@ -9974,25 +10146,25 @@ ROM_LOAD16_WORD_SWAP( "rcmu_21a.6f", 0x100000, 0x80000, CRC(4376ea95) SHA1(7370ceffca513aa9f68a74f6869d561476589200) ) ROM_REGION( 0x800000, "gfx", 0 ) - ROMX_LOAD( "rcm_01.3a", 0x000000, 0x80000, CRC(6ecdf13f) SHA1(2a8fe06bf5011e3f990f90d9224f91d8631ec0cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "1" socket - ROMX_LOAD( "rcm_03.4a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "2" socket - ROMX_LOAD( "rcm_02.5a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "3" socket - ROMX_LOAD( "rcm_04.6a", 0x000006, 0x80000, CRC(54e622ff) SHA1(36f6297e3d410f041be5e582919478b0d52520ca) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "4" socket - ROMX_LOAD( "rcm_05.7a", 0x200000, 0x80000, CRC(5dd131fd) SHA1(1a7fc8cf38901245d40901996e946e7ad9c0e0c5) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "5" socket - ROMX_LOAD( "rcm_07.8a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "6" socket - ROMX_LOAD( "rcm_06.9a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "7" socket - ROMX_LOAD( "rcm_08.10a", 0x200006, 0x80000, CRC(fbff64cf) SHA1(f0cb531ef195dc1dcd224a208906a62fb5d199a1) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "8" socket - ROMX_LOAD( "rcm_10.3c", 0x400000, 0x80000, CRC(4dc8ada9) SHA1(776c2b3ef24c2b8f390c05a9c6728b14ceec696e) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "10" socket - ROMX_LOAD( "rcm_12.4c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "11" socket - ROMX_LOAD( "rcm_11.5c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "12" socket - ROMX_LOAD( "rcm_13.6c", 0x400006, 0x80000, CRC(5069d4a9) SHA1(b832b98be94371af52bd4bb911e18ec57430a7db) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "13" socket - ROMX_LOAD( "rcm_14.7c", 0x600000, 0x80000, CRC(303be3bd) SHA1(1e5c3fd71966ea9f457840c40582795b501c323e) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "14" socket - ROMX_LOAD( "rcm_16.8c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "15" socket - ROMX_LOAD( "rcm_15.9c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "16" socket - ROMX_LOAD( "rcm_17.10c", 0x600006, 0x80000, CRC(92371042) SHA1(c55833cbaddcc986edd23c009a3e3c7ff09c2708) , ROM_GROUPWORD | ROM_SKIP(6) ) // in "17" socket + ROMX_LOAD( "rcm_01.3a", 0x000000, 0x80000, CRC(6ecdf13f) SHA1(2a8fe06bf5011e3f990f90d9224f91d8631ec0cc) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_03.5a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_02.4a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_04.6a", 0x000006, 0x80000, CRC(54e622ff) SHA1(36f6297e3d410f041be5e582919478b0d52520ca) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_05.7a", 0x200000, 0x80000, CRC(5dd131fd) SHA1(1a7fc8cf38901245d40901996e946e7ad9c0e0c5) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_07.9a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_06.8a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_08.10a", 0x200006, 0x80000, CRC(fbff64cf) SHA1(f0cb531ef195dc1dcd224a208906a62fb5d199a1) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_10.3c", 0x400000, 0x80000, CRC(4dc8ada9) SHA1(776c2b3ef24c2b8f390c05a9c6728b14ceec696e) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_12.5c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_11.4c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_13.6c", 0x400006, 0x80000, CRC(5069d4a9) SHA1(b832b98be94371af52bd4bb911e18ec57430a7db) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_14.7c", 0x600000, 0x80000, CRC(303be3bd) SHA1(1e5c3fd71966ea9f457840c40582795b501c323e) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_16.9c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_15.8c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "rcm_17.10c", 0x600006, 0x80000, CRC(92371042) SHA1(c55833cbaddcc986edd23c009a3e3c7ff09c2708) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "rcm_09.9", 0x00000, 0x08000, CRC(22ac8f5f) SHA1(d1441d880f98034645cb4fcecd7bb746bde638af) ) /* different size from megamana, rockmanj but same label, pcb verified */ + ROM_LOAD( "rcm_09.11a", 0x00000, 0x08000, CRC(22ac8f5f) SHA1(d1441d880f98034645cb4fcecd7bb746bde638af) ) /* different size from megamana, rockmanj but same label, pcb verified */ ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ @@ -10025,20 +10197,20 @@ ROM_REGION( 0x800000, "gfx", 0 ) ROMX_LOAD( "rcm_01.3a", 0x000000, 0x80000, CRC(6ecdf13f) SHA1(2a8fe06bf5011e3f990f90d9224f91d8631ec0cc) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_02.4a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_03.4a - ROMX_LOAD( "rcm_03.5a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_02.5a + ROMX_LOAD( "rcm_02.4a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_03.5a + ROMX_LOAD( "rcm_03.5a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_02.4a ROMX_LOAD( "rcm_04.6a", 0x000006, 0x80000, CRC(54e622ff) SHA1(36f6297e3d410f041be5e582919478b0d52520ca) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_05.7a", 0x200000, 0x80000, CRC(5dd131fd) SHA1(1a7fc8cf38901245d40901996e946e7ad9c0e0c5) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_06.8a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_07.8a - ROMX_LOAD( "rcm_07.9a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_06.9a + ROMX_LOAD( "rcm_06.8a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_07.9a + ROMX_LOAD( "rcm_07.9a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_06.8a ROMX_LOAD( "rcm_08.10a", 0x200006, 0x80000, CRC(fbff64cf) SHA1(f0cb531ef195dc1dcd224a208906a62fb5d199a1) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_10.3c", 0x400000, 0x80000, CRC(4dc8ada9) SHA1(776c2b3ef24c2b8f390c05a9c6728b14ceec696e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_11.4c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_12.4c - ROMX_LOAD( "rcm_12.5c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_11.5c + ROMX_LOAD( "rcm_11.4c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_12.5c + ROMX_LOAD( "rcm_12.5c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_11.4c ROMX_LOAD( "rcm_13.6c", 0x400006, 0x80000, CRC(5069d4a9) SHA1(b832b98be94371af52bd4bb911e18ec57430a7db) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_14.7c", 0x600000, 0x80000, CRC(303be3bd) SHA1(1e5c3fd71966ea9f457840c40582795b501c323e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_15.8c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_16.8c - ROMX_LOAD( "rcm_16.9c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_15.9c + ROMX_LOAD( "rcm_15.8c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_16.9c + ROMX_LOAD( "rcm_16.9c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_15.8c ROMX_LOAD( "rcm_17.10c", 0x600006, 0x80000, CRC(92371042) SHA1(c55833cbaddcc986edd23c009a3e3c7ff09c2708) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ @@ -10075,20 +10247,20 @@ ROM_REGION( 0x800000, "gfx", 0 ) ROMX_LOAD( "rcm_01.3a", 0x000000, 0x80000, CRC(6ecdf13f) SHA1(2a8fe06bf5011e3f990f90d9224f91d8631ec0cc) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_02.4a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_03.4a - ROMX_LOAD( "rcm_03.5a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_02.5a + ROMX_LOAD( "rcm_02.4a", 0x000002, 0x80000, CRC(944d4f0f) SHA1(665dc9a537e9c9b565f6136f939ff5c2861f875f) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_03.5a + ROMX_LOAD( "rcm_03.5a", 0x000004, 0x80000, CRC(36f3073c) SHA1(457d68e63599d06a136e152a9ad60adac1c91edd) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_02.4a ROMX_LOAD( "rcm_04.6a", 0x000006, 0x80000, CRC(54e622ff) SHA1(36f6297e3d410f041be5e582919478b0d52520ca) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_05.7a", 0x200000, 0x80000, CRC(5dd131fd) SHA1(1a7fc8cf38901245d40901996e946e7ad9c0e0c5) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_06.8a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_07.8a - ROMX_LOAD( "rcm_07.9a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_06.9a + ROMX_LOAD( "rcm_06.8a", 0x200002, 0x80000, CRC(f0faf813) SHA1(adff01c2ecc4c8ce6f8a50cbd07d8f8bb9f48168) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_07.9a + ROMX_LOAD( "rcm_07.9a", 0x200004, 0x80000, CRC(826de013) SHA1(47f36b1d92a487c43c8dadc8293b8e6f40649286) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_06.8a ROMX_LOAD( "rcm_08.10a", 0x200006, 0x80000, CRC(fbff64cf) SHA1(f0cb531ef195dc1dcd224a208906a62fb5d199a1) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_10.3c", 0x400000, 0x80000, CRC(4dc8ada9) SHA1(776c2b3ef24c2b8f390c05a9c6728b14ceec696e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_11.4c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_12.4c - ROMX_LOAD( "rcm_12.5c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_11.5c + ROMX_LOAD( "rcm_11.4c", 0x400002, 0x80000, CRC(f2b9ee06) SHA1(db315b00d1caed1a8c0f6e0ae726e8fa05b011fa) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_12.5c + ROMX_LOAD( "rcm_12.5c", 0x400004, 0x80000, CRC(fed5f203) SHA1(23db14490519b5e2d0bb92ffe6e14540d1999e4b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_11.4c ROMX_LOAD( "rcm_13.6c", 0x400006, 0x80000, CRC(5069d4a9) SHA1(b832b98be94371af52bd4bb911e18ec57430a7db) , ROM_GROUPWORD | ROM_SKIP(6) ) ROMX_LOAD( "rcm_14.7c", 0x600000, 0x80000, CRC(303be3bd) SHA1(1e5c3fd71966ea9f457840c40582795b501c323e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "rcm_15.8c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_16.8c - ROMX_LOAD( "rcm_16.9c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_15.9c + ROMX_LOAD( "rcm_15.8c", 0x600002, 0x80000, CRC(4f2d372f) SHA1(db6a94d1f92c1b96e404b38ebcb1eedbec3ae6cc) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_16.9c + ROMX_LOAD( "rcm_16.9c", 0x600004, 0x80000, CRC(93d97fde) SHA1(e4be5216f98ad08a9118d629d398be2bd54e2e2a) , ROM_GROUPWORD | ROM_SKIP(6) ) // == rcm_15.8c ROMX_LOAD( "rcm_17.10c", 0x600006, 0x80000, CRC(92371042) SHA1(c55833cbaddcc986edd23c009a3e3c7ff09c2708) , ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x28000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ @@ -10116,48 +10288,60 @@ ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) ROM_END -/* CPS Changer sets - for MESS */ +/* Home 'CPS Changer' Unit - For MESS */ -ROM_START( sfach ) +/* B-Board 91635B-2 */ +ROM_START( wofch ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "sfach23", 0x000000, 0x80000, CRC(02a1a853) SHA1(d92b9e774844fdcc9d9946b3e892b021e672d876) ) - ROM_LOAD16_WORD_SWAP( "sfza22", 0x080000, 0x80000, CRC(8d9b2480) SHA1(405305c1572908d00eab735f28676fbbadb4fac6) ) - ROM_LOAD16_WORD_SWAP( "sfzch21", 0x100000, 0x80000, CRC(5435225d) SHA1(6b1156fd82d0710e244ede39faaae0847c598376) ) - ROM_LOAD16_WORD_SWAP( "sfza20", 0x180000, 0x80000, CRC(806e8f38) SHA1(b6d6912aa8f2f590335d7ff9a8214648e7131ebb) ) + ROM_LOAD16_WORD_SWAP( "tk2(ch)_23.8f", 0x000000, 0x80000, CRC(4e0b8dee) SHA1(d2fb716d62b7a259f46bbc74c1976a18d56696ea) ) + ROM_LOAD16_WORD_SWAP( "tk2(ch)_22.7f", 0x080000, 0x80000, CRC(d0937a8d) SHA1(01d7be446e2e3ef8ca767f59c178240dfd52dd93) ) - ROM_REGION( 0x800000, "gfx", 0 ) - ROMX_LOAD( "sfz01", 0x000000, 0x80000, CRC(0dd53e62) SHA1(5f3bcf5ca0fd564d115fe5075a4163d3ee3226df) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz02", 0x000002, 0x80000, CRC(94c31e3f) SHA1(2187b3d4977514f2ae486eb33ed76c86121d5745) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz03", 0x000004, 0x80000, CRC(9584ac85) SHA1(bbd62d66b0f6909630e801ce5d6331d43f44d741) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz04", 0x000006, 0x80000, CRC(b983624c) SHA1(841106bb9453e3dfb7869c4b0e9149cc610d515a) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz05", 0x200000, 0x80000, CRC(2b47b645) SHA1(bc6426eff5df9417f32666586744626fa544f7b5) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz06", 0x200002, 0x80000, CRC(74fd9fb1) SHA1(7945472591f3c06970e96611a0363ed8f3d52c36) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz07", 0x200004, 0x80000, CRC(bb2c734d) SHA1(97a06935f86f31755d2ffdc5b56bef53944bdecd) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz08", 0x200006, 0x80000, CRC(454f7868) SHA1(eecccba7542d893bc41676246a20aa4914b79bbc) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz10", 0x400000, 0x80000, CRC(2a7d675e) SHA1(0144ba34a29fb08b41c780ce65bb06d25724e88f) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz11", 0x400002, 0x80000, CRC(e35546c8) SHA1(7b08aa3413494d12c5c550263a5f00b64b98e6ab) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz12", 0x400004, 0x80000, CRC(f122693a) SHA1(71ce901d8d30207e506b6a8d6a4e0fcf3a1b0eac) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz13", 0x400006, 0x80000, CRC(7cf942c8) SHA1(a7109facb97a8a11ddf1b4e07de6ff3164d713a1) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz14", 0x600000, 0x80000, CRC(09038c81) SHA1(3461d70902fbfb92ce40f804be6388276a01d153) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz15", 0x600002, 0x80000, CRC(1aa17391) SHA1(b4d0f760a430b7fc4443b6c94da2659315c5b926) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz16", 0x600004, 0x80000, CRC(19a5abd6) SHA1(73ba1de15c883fdc69fd7dccdb58d00ca512d4ea) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz17", 0x600006, 0x80000, CRC(248b3b73) SHA1(95810a17b1caf6372b33ed3e4ee8a7e51482c70d) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROM_REGION( 0x400000, "gfx", 0 ) + ROMX_LOAD( "tk2-1m.3a", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-3m.5a", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-2m.4a", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2-4m.6a", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "tk2(ch)_05.7a", 0x200000, 0x80000, CRC(e4a44d53) SHA1(b747679f4d63e5e62d9fd81b3120fba0401fadfb) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2_05.7a + ROMX_LOAD( "tk2(ch)_06.8a", 0x200002, 0x80000, CRC(58066ba8) SHA1(c93af968e21094d020e4b2002e0c6fc0d746af0b) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2_06.8a + ROMX_LOAD( "tk2(ch)_07.9a", 0x200004, 0x80000, CRC(d706568e) SHA1(7886414dc86c42e35d24b85c4bfa41a9f0c167ac) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2_07.9a + ROMX_LOAD( "tk2(ch)_08.10a", 0x200006, 0x80000, CRC(d4a19a02) SHA1(ff396b1d33d9b4842140f2c6d085fe05748e3244) , ROM_GROUPWORD | ROM_SKIP(6) ) // == tk2_08.10a - ROM_REGION( 0x8000, "stars", 0 ) - ROM_COPY( "gfx", 0x000000, 0x000000, 0x8000 ) /* stars */ + ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ + ROM_LOAD( "tk2_qa.5k", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfz09", 0x00000, 0x08000, CRC(c772628b) SHA1(ebc5b7c173caf1e151f733f23c1b20abec24e16d) ) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ + ROM_LOAD( "tk2-q1.1k", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) + ROM_LOAD( "tk2-q2.2k", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) + ROM_LOAD( "tk2-q3.3k", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) + ROM_LOAD( "tk2-q4.4k", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) - ROM_REGION( 0x40000, "oki", 0 ) /* Samples */ - ROM_LOAD( "sfz18", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5) ) - ROM_LOAD( "sfz19", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58) ) + ROM_REGION( 0x0200, "aboardplds", 0 ) + ROM_LOAD( "buf1", 0x0000, 0x0117, CRC(eb122de7) SHA1(b26b5bfe258e3e184f069719f9fd008d6b8f6b9b) ) + ROM_LOAD( "ioa1", 0x0000, 0x0117, CRC(59c7ee3b) SHA1(fbb887c5b4f5cb8df77cec710eaac2985bc482a6) ) + ROM_LOAD( "prg2", 0x0000, 0x0117, CRC(4386879a) SHA1(c36896d169d8c78393609acbbe4397931292a033) ) + ROM_LOAD( "rom1", 0x0000, 0x0117, CRC(41dc73b9) SHA1(7d4c9f1693c821fbf84e32dd6ef62ddf14967845) ) + ROM_LOAD( "sou1", 0x0000, 0x0117, CRC(84f4b2fe) SHA1(dcc9e86cc36316fe42eace02d6df75d08bc8bb6d) ) + + ROM_REGION( 0x0200, "bboardplds", 0 ) + ROM_LOAD( "tk263b.1a", 0x0000, 0x0117, CRC(c4b0349b) SHA1(b4873dd5ad8735048deb3475222dde3c0b67eaaf) ) + ROM_LOAD( "iob1.12d", 0x0000, 0x0117, CRC(3abc0700) SHA1(973043aa46ec6d5d1db20dc9d5937005a0f9f6ae) ) + ROM_LOAD( "bprg1.11d", 0x0000, 0x0117, CRC(31793da7) SHA1(400fa7ac517421c978c1ee7773c30b9ed0c5d3f3) ) + + ROM_REGION( 0x0200, "cboardplds", 0 ) + ROM_LOAD( "ioc1.ic7", 0x0000, 0x0117, CRC(0d182081) SHA1(475b3d417785da4bc512cce2b274bb00d4cc6792) ) + ROM_LOAD( "c632.ic1", 0x0000, 0x0117, CRC(0fbd9270) SHA1(d7e737b20c44d41e29ca94be56114b31934dde81) ) + + ROM_REGION( 0x0200, "dboardplds", 0 ) + ROM_LOAD( "d7l1.7l", 0x0000, 0x0117, CRC(27b7410d) SHA1(06d0cba0226850f100ff1f539bd7d5db0f90c730) ) + ROM_LOAD( "d8l1.8l", 0x0000, 0x0117, CRC(539fc7da) SHA1(cad5c91629c6247e49ccbbcbfe6b08229eafae07) ) + ROM_LOAD( "d9k1.9k", 0x0000, 0x0117, NO_DUMP ) + ROM_LOAD( "d10f1.10f", 0x0000, 0x0117, CRC(6619c494) SHA1(3aef656c07182a2186f810f30e0d854dd5bd8d18) ) ROM_END -ROM_START( sfzbch ) +ROM_START( sfach ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "sfzbch23", 0x000000, 0x80000, CRC(53699f68) SHA1(d7f132faf8c31b5e79c32e6b0cce45377ec8d474) ) + ROM_LOAD16_WORD_SWAP( "sfach23", 0x000000, 0x80000, CRC(02a1a853) SHA1(d92b9e774844fdcc9d9946b3e892b021e672d876) ) ROM_LOAD16_WORD_SWAP( "sfza22", 0x080000, 0x80000, CRC(8d9b2480) SHA1(405305c1572908d00eab735f28676fbbadb4fac6) ) ROM_LOAD16_WORD_SWAP( "sfzch21", 0x100000, 0x80000, CRC(5435225d) SHA1(6b1156fd82d0710e244ede39faaae0847c598376) ) ROM_LOAD16_WORD_SWAP( "sfza20", 0x180000, 0x80000, CRC(806e8f38) SHA1(b6d6912aa8f2f590335d7ff9a8214648e7131ebb) ) @@ -10192,6 +10376,7 @@ ROM_LOAD( "sfz19", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58) ) ROM_END +/* FIXME B-Board uncertain but should be 91634B from the program ROM names */ ROM_START( sfzch ) ROM_REGION( CODE_SIZE, "maincpu",0 ) /* 68000 code */ ROM_LOAD16_WORD_SWAP( "sfzch23", 0x000000, 0x80000, CRC(1140743f) SHA1(10bcedb5cca266f2aa3ed99ede6f9a64fc877539)) @@ -10200,59 +10385,71 @@ ROM_LOAD16_WORD_SWAP( "sfza20", 0x180000, 0x80000, CRC(806e8f38) SHA1(b6d6912aa8f2f590335d7ff9a8214648e7131ebb)) ROM_REGION( 0x800000, "gfx", 0 ) - ROMX_LOAD( "sfz01", 0x000000, 0x80000, CRC(0dd53e62) SHA1(5f3bcf5ca0fd564d115fe5075a4163d3ee3226df), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz02", 0x000002, 0x80000, CRC(94c31e3f) SHA1(2187b3d4977514f2ae486eb33ed76c86121d5745), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz03", 0x000004, 0x80000, CRC(9584ac85) SHA1(bbd62d66b0f6909630e801ce5d6331d43f44d741), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz04", 0x000006, 0x80000, CRC(b983624c) SHA1(841106bb9453e3dfb7869c4b0e9149cc610d515a), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz05", 0x200000, 0x80000, CRC(2b47b645) SHA1(bc6426eff5df9417f32666586744626fa544f7b5), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz06", 0x200002, 0x80000, CRC(74fd9fb1) SHA1(7945472591f3c06970e96611a0363ed8f3d52c36), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz07", 0x200004, 0x80000, CRC(bb2c734d) SHA1(97a06935f86f31755d2ffdc5b56bef53944bdecd), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz08", 0x200006, 0x80000, CRC(454f7868) SHA1(eecccba7542d893bc41676246a20aa4914b79bbc), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz10", 0x400000, 0x80000, CRC(2a7d675e) SHA1(0144ba34a29fb08b41c780ce65bb06d25724e88f), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz11", 0x400002, 0x80000, CRC(e35546c8) SHA1(7b08aa3413494d12c5c550263a5f00b64b98e6ab), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz12", 0x400004, 0x80000, CRC(f122693a) SHA1(71ce901d8d30207e506b6a8d6a4e0fcf3a1b0eac), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz13", 0x400006, 0x80000, CRC(7cf942c8) SHA1(a7109facb97a8a11ddf1b4e07de6ff3164d713a1), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz14", 0x600000, 0x80000, CRC(09038c81) SHA1(3461d70902fbfb92ce40f804be6388276a01d153), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz15", 0x600002, 0x80000, CRC(1aa17391) SHA1(b4d0f760a430b7fc4443b6c94da2659315c5b926), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz16", 0x600004, 0x80000, CRC(19a5abd6) SHA1(73ba1de15c883fdc69fd7dccdb58d00ca512d4ea), ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "sfz17", 0x600006, 0x80000, CRC(248b3b73) SHA1(95810a17b1caf6372b33ed3e4ee8a7e51482c70d), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_01.3a", 0x000000, 0x80000, CRC(0dd53e62) SHA1(5f3bcf5ca0fd564d115fe5075a4163d3ee3226df), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_02.4a", 0x000002, 0x80000, CRC(94c31e3f) SHA1(2187b3d4977514f2ae486eb33ed76c86121d5745), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_03.5a", 0x000004, 0x80000, CRC(9584ac85) SHA1(bbd62d66b0f6909630e801ce5d6331d43f44d741), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_04.6a", 0x000006, 0x80000, CRC(b983624c) SHA1(841106bb9453e3dfb7869c4b0e9149cc610d515a), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_05.7a", 0x200000, 0x80000, CRC(2b47b645) SHA1(bc6426eff5df9417f32666586744626fa544f7b5), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_06.8a", 0x200002, 0x80000, CRC(74fd9fb1) SHA1(7945472591f3c06970e96611a0363ed8f3d52c36), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_07.9a", 0x200004, 0x80000, CRC(bb2c734d) SHA1(97a06935f86f31755d2ffdc5b56bef53944bdecd), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_08.10a", 0x200006, 0x80000, CRC(454f7868) SHA1(eecccba7542d893bc41676246a20aa4914b79bbc), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_10.3c", 0x400000, 0x80000, CRC(2a7d675e) SHA1(0144ba34a29fb08b41c780ce65bb06d25724e88f), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_11.4c", 0x400002, 0x80000, CRC(e35546c8) SHA1(7b08aa3413494d12c5c550263a5f00b64b98e6ab), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_12.5c", 0x400004, 0x80000, CRC(f122693a) SHA1(71ce901d8d30207e506b6a8d6a4e0fcf3a1b0eac), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_13.6c", 0x400006, 0x80000, CRC(7cf942c8) SHA1(a7109facb97a8a11ddf1b4e07de6ff3164d713a1), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_14.7c", 0x600000, 0x80000, CRC(09038c81) SHA1(3461d70902fbfb92ce40f804be6388276a01d153), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_15.8c", 0x600002, 0x80000, CRC(1aa17391) SHA1(b4d0f760a430b7fc4443b6c94da2659315c5b926), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_16.9c", 0x600004, 0x80000, CRC(19a5abd6) SHA1(73ba1de15c883fdc69fd7dccdb58d00ca512d4ea), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_17.10c", 0x600006, 0x80000, CRC(248b3b73) SHA1(95810a17b1caf6372b33ed3e4ee8a7e51482c70d), ROM_GROUPWORD | ROM_SKIP(6) ) ROM_REGION( 0x8000, "stars", 0 ) ROM_COPY( "gfx", 0x000000, 0x000000, 0x8000 ) - ROM_REGION( 0x28000, "audiocpu",0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfz09", 0x00000, 0x08000, CRC(c772628b) SHA1(ebc5b7c173caf1e151f733f23c1b20abec24e16d)) - ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_REGION( 0x18000, "audiocpu",0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "sfz_09.12a", 0x00000, 0x08000, CRC(c772628b) SHA1(ebc5b7c173caf1e151f733f23c1b20abec24e16d)) + ROM_CONTINUE( 0x10000, 0x08000 ) ROM_REGION( 0x40000, "oki",0 ) /* Samples */ - ROM_LOAD( "sfz18", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5)) - ROM_LOAD( "sfz19", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58)) + ROM_LOAD( "sfz_18.11c", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5)) + ROM_LOAD( "sfz_19.12c", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58)) ROM_END -ROM_START( wofch ) +/* FIXME B-Board uncertain but should be 91634B from the program ROM names */ +ROM_START( sfzbch ) ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_WORD_SWAP( "wofch_23.rom", 0x000000, 0x80000, CRC(4e0b8dee) SHA1(d2fb716d62b7a259f46bbc74c1976a18d56696ea) ) - ROM_LOAD16_WORD_SWAP( "wofch_22.rom", 0x080000, 0x80000, CRC(d0937a8d) SHA1(01d7be446e2e3ef8ca767f59c178240dfd52dd93) ) + ROM_LOAD16_WORD_SWAP( "sfzbch23", 0x000000, 0x80000, CRC(53699f68) SHA1(d7f132faf8c31b5e79c32e6b0cce45377ec8d474) ) + ROM_LOAD16_WORD_SWAP( "sfza22", 0x080000, 0x80000, CRC(8d9b2480) SHA1(405305c1572908d00eab735f28676fbbadb4fac6) ) + ROM_LOAD16_WORD_SWAP( "sfzch21", 0x100000, 0x80000, CRC(5435225d) SHA1(6b1156fd82d0710e244ede39faaae0847c598376) ) + ROM_LOAD16_WORD_SWAP( "sfza20", 0x180000, 0x80000, CRC(806e8f38) SHA1(b6d6912aa8f2f590335d7ff9a8214648e7131ebb) ) - ROM_REGION( 0x400000, "gfx", 0 ) - ROMX_LOAD( "tk2_gfx1.rom", 0x000000, 0x80000, CRC(0d9cb9bf) SHA1(cc7140e9a01a14b252cb1090bcea32b0de461928) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx3.rom", 0x000002, 0x80000, CRC(45227027) SHA1(b21afc593f0d4d8909dfa621d659cbb40507d1b2) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx2.rom", 0x000004, 0x80000, CRC(c5ca2460) SHA1(cbe14867f7b94b638ca80db7c8e0c60881183469) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk2_gfx4.rom", 0x000006, 0x80000, CRC(e349551c) SHA1(1d977bdf256accf750ad9930ec4a0a19bbf86964) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk205.bin", 0x200000, 0x80000, CRC(e4a44d53) SHA1(b747679f4d63e5e62d9fd81b3120fba0401fadfb) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk206.bin", 0x200002, 0x80000, CRC(58066ba8) SHA1(c93af968e21094d020e4b2002e0c6fc0d746af0b) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "wofch_06.rom", 0x200004, 0x80000, CRC(cc9006c9) SHA1(cfcbec3a67052268a7739538aa28a6391fe5400e) , ROM_GROUPWORD | ROM_SKIP(6) ) - ROMX_LOAD( "tk208.bin", 0x200006, 0x80000, CRC(d4a19a02) SHA1(ff396b1d33d9b4842140f2c6d085fe05748e3244) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROM_REGION( 0x800000, "gfx", 0 ) + ROMX_LOAD( "sfz_01.3a", 0x000000, 0x80000, CRC(0dd53e62) SHA1(5f3bcf5ca0fd564d115fe5075a4163d3ee3226df), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_02.4a", 0x000002, 0x80000, CRC(94c31e3f) SHA1(2187b3d4977514f2ae486eb33ed76c86121d5745), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_03.5a", 0x000004, 0x80000, CRC(9584ac85) SHA1(bbd62d66b0f6909630e801ce5d6331d43f44d741), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_04.6a", 0x000006, 0x80000, CRC(b983624c) SHA1(841106bb9453e3dfb7869c4b0e9149cc610d515a), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_05.7a", 0x200000, 0x80000, CRC(2b47b645) SHA1(bc6426eff5df9417f32666586744626fa544f7b5), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_06.8a", 0x200002, 0x80000, CRC(74fd9fb1) SHA1(7945472591f3c06970e96611a0363ed8f3d52c36), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_07.9a", 0x200004, 0x80000, CRC(bb2c734d) SHA1(97a06935f86f31755d2ffdc5b56bef53944bdecd), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_08.10a", 0x200006, 0x80000, CRC(454f7868) SHA1(eecccba7542d893bc41676246a20aa4914b79bbc), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_10.3c", 0x400000, 0x80000, CRC(2a7d675e) SHA1(0144ba34a29fb08b41c780ce65bb06d25724e88f), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_11.4c", 0x400002, 0x80000, CRC(e35546c8) SHA1(7b08aa3413494d12c5c550263a5f00b64b98e6ab), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_12.5c", 0x400004, 0x80000, CRC(f122693a) SHA1(71ce901d8d30207e506b6a8d6a4e0fcf3a1b0eac), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_13.6c", 0x400006, 0x80000, CRC(7cf942c8) SHA1(a7109facb97a8a11ddf1b4e07de6ff3164d713a1), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_14.7c", 0x600000, 0x80000, CRC(09038c81) SHA1(3461d70902fbfb92ce40f804be6388276a01d153), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_15.8c", 0x600002, 0x80000, CRC(1aa17391) SHA1(b4d0f760a430b7fc4443b6c94da2659315c5b926), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_16.9c", 0x600004, 0x80000, CRC(19a5abd6) SHA1(73ba1de15c883fdc69fd7dccdb58d00ca512d4ea), ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "sfz_17.10c", 0x600006, 0x80000, CRC(248b3b73) SHA1(95810a17b1caf6372b33ed3e4ee8a7e51482c70d), ROM_GROUPWORD | ROM_SKIP(6) ) - ROM_REGION( 0x28000, "audiocpu", 0 ) /* QSound Z80 code */ - ROM_LOAD( "tk2_qa.rom", 0x00000, 0x08000, CRC(c9183a0d) SHA1(d8b1d41c572f08581f8ab9eb878de77d6ea8615d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_REGION( 0x8000, "stars", 0 ) + ROM_COPY( "gfx", 0x000000, 0x000000, 0x8000 ) /* stars */ - ROM_REGION( 0x200000, "qsound", 0 ) /* QSound samples */ - ROM_LOAD( "tk2_q1.rom", 0x000000, 0x80000, CRC(611268cf) SHA1(83ab059f2110fb25fdcff928d56b790fc1f5c975) ) - ROM_LOAD( "tk2_q2.rom", 0x080000, 0x80000, CRC(20f55ca9) SHA1(90134e9a9c4749bb65c728b66ea4dac1fd4d88a4) ) - ROM_LOAD( "tk2_q3.rom", 0x100000, 0x80000, CRC(bfcf6f52) SHA1(2a85ff3fc89b4cbabd20779ec12da2e116333c7c) ) - ROM_LOAD( "tk2_q4.rom", 0x180000, 0x80000, CRC(36642e88) SHA1(8ab25b19e2b67215a5cb1f3aa81b9d26009cfeb8) ) + ROM_REGION( 0x18000, "audiocpu",0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "sfz_09.12a", 0x00000, 0x08000, CRC(c772628b) SHA1(ebc5b7c173caf1e151f733f23c1b20abec24e16d)) + ROM_CONTINUE( 0x10000, 0x08000 ) + + ROM_REGION( 0x40000, "oki",0 ) /* Samples */ + ROM_LOAD( "sfz_18.11c", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5)) + ROM_LOAD( "sfz_19.12c", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58)) ROM_END @@ -10325,7 +10522,7 @@ DRIVER_INIT_CALL(cps1); } -static DRIVER_INIT( pang3n ) +static DRIVER_INIT( pang3b ) { /* Pang 3 is the only non-QSound game to have an EEPROM. */ /* It is mapped in the CPS-B address range so probably is on the C-board. */ @@ -10355,7 +10552,7 @@ rom[A/2] = dst; } - DRIVER_INIT_CALL(pang3n); + DRIVER_INIT_CALL(pang3b); } static READ16_HANDLER( sf2mdt_r ) @@ -10516,7 +10713,8 @@ GAME( 1992, varthj, varth, cps1_12MHz, varth, cps1, ROT270, "Capcom", "Varth: Operation Thunderstorm (Japan 920714)", GAME_SUPPORTS_SAVE ) GAME( 1992, qad, 0, cps1_12MHz, qad, cps1, ROT0, "Capcom", "Quiz & Dragons: Capcom Quiz Game (USA 920701)", GAME_SUPPORTS_SAVE ) // 12MHz verified GAME( 1994, qadj, qad, cps1_12MHz, qadj, cps1, ROT0, "Capcom", "Quiz & Dragons: Capcom Quiz Game (Japan 940921)", GAME_SUPPORTS_SAVE ) -GAME( 1992, wof, 0, qsound, wof, wof, ROT0, "Capcom", "Warriors of Fate (World 921002)", GAME_SUPPORTS_SAVE ) // "ETC" +GAME( 1992, wof, 0, qsound, wof, wof, ROT0, "Capcom", "Warriors of Fate (World 921031)", GAME_SUPPORTS_SAVE ) // "ETC" +GAME( 1992, wofr1, wof, qsound, wof, wof, ROT0, "Capcom", "Warriors of Fate (World 921002)", GAME_SUPPORTS_SAVE ) // "ETC" GAME( 1992, wofu, wof, qsound, wof, wof, ROT0, "Capcom", "Warriors of Fate (USA 921031)", GAME_SUPPORTS_SAVE ) // World "warning" GAME( 1992, wofa, wof, qsound, wof, wof, ROT0, "Capcom", "Sangokushi II (Asia 921005)", GAME_SUPPORTS_SAVE ) // World "warning" GAME( 1992, wofj, wof, qsound, wof, wof, ROT0, "Capcom", "Tenchi wo Kurau II: Sekiheki no Tatakai (Japan 921031)", GAME_SUPPORTS_SAVE ) @@ -10542,7 +10740,7 @@ GAME( 1993, mbomberj, slammast, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber: The Body Explosion (Japan 930713)", GAME_SUPPORTS_SAVE ) GAME( 1993, mbombrd, 0, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo: Ultimate Team Battle (World 931206)", GAME_SUPPORTS_SAVE ) // "ETC" GAME( 1993, mbombrdj, mbombrd, qsound, slammast, slammast, ROT0, "Capcom", "Muscle Bomber Duo: Heat Up Warriors (Japan 931206)", GAME_SUPPORTS_SAVE ) -GAME( 1994, pnickj, 0, cps1_12MHz, pnickj, cps1, ROT0, "Capcom / Compile", "Pnickies (Japan 940608)", GAME_SUPPORTS_SAVE ) // Compile for the puyopuyo rights +GAME( 1994, pnickj, 0, cps1_12MHz, pnickj, cps1, ROT0, "Capcom (Compile license)", "Pnickies (Japan 940608)", GAME_SUPPORTS_SAVE ) GAME( 1995, qtono2j, 0, cps1_12MHz, qtono2j, cps1, ROT0, "Capcom", "Quiz Tonosama no Yabou 2: Zenkoku-ban (Japan 950123)", GAME_SUPPORTS_SAVE ) GAME( 1995, megaman, 0, cps1_12MHz, megaman, cps1, ROT0, "Capcom", "Mega Man: The Power Battle (CPS1, USA 951006)", GAME_SUPPORTS_SAVE ) GAME( 1995, megamana, megaman, cps1_12MHz, megaman, cps1, ROT0, "Capcom", "Mega Man: The Power Battle (CPS1, Asia 951006)", GAME_SUPPORTS_SAVE ) @@ -10551,13 +10749,14 @@ /* Games released on CPS-1 hardware by Mitchell */ GAME( 1995, pang3, 0, pang3, pang3, pang3, ROT0, "Mitchell", "Pang! 3 (Euro 950601)", GAME_SUPPORTS_SAVE ) -GAME( 1995, pang3n, pang3, pang3, pang3n, pang3n, ROT0, "Mitchell", "Pang! 3 (Euro 950511, not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1995, pang3j, pang3, pang3, pang3n, pang3, ROT0, "Mitchell", "Pang! 3: Kaitou Tachi no Karei na Gogo (Japan 950511)", GAME_SUPPORTS_SAVE ) +GAME( 1995, pang3r1, pang3, pang3, pang3, pang3, ROT0, "Mitchell", "Pang! 3 (Euro 950511)", GAME_SUPPORTS_SAVE ) +GAME( 1995, pang3j, pang3, pang3, pang3, pang3, ROT0, "Mitchell", "Pang! 3: Kaitou Tachi no Karei na Gogo (Japan 950511)", GAME_SUPPORTS_SAVE ) +GAME( 1995, pang3b, pang3, pang3, pang3b, pang3b, ROT0, "Mitchell", "Pang! 3 (bootleg)", GAME_SUPPORTS_SAVE ) // 950511 - based on Euro version -/* Home 'CPS Changer' Unit - For MESS */ -CONS( 1995, sfzch, 0, 0, cps1_10MHz, sfzch, cps1, "Capcom", "CPS Changer - Street Fighter Zero (Japan 951020)", 0 ) -// are the 2 legit sets, or did somebody region hack it? -CONS( 1995, sfach, sfzch, 0, cps1_10MHz, sfzch, cps1, "Capcom", "CPS Changer - Street Fighter Alpha - Warriors' Dreams (Publicity US 950727)", 0 ) -CONS( 1995, sfzbch, sfzch, 0, cps1_10MHz, sfzch, cps1, "Capcom", "CPS Changer - Street Fighter Zero (Brazil 950727)", 0 ) +/* Home 'CPS Changer' Unit - For MESS */ -CONS( 1995, wofch, 0, 0, qsound, wofch, wof, "Capcom", "CPS Changer - Tenchi Wo Kurau II (Japan 921031)", 0 ) +CONS( 1994, wofch, 0, 0, qsound, wofch, wof, "Capcom", "Tenchi wo Kurau II: Sekiheki no Tatakai (CPS Changer, Japan 921031)", 0 ) +CONS( 1995, sfzch, 0, 0, cps1_12MHz, sfzch, cps1, "Capcom", "Street Fighter Zero (CPS Changer, Japan 951020)", 0 ) +// are the 2 legit sets, or did somebody region hack it? +CONS( 1995, sfach, sfzch, 0, cps1_12MHz, sfzch, cps1, "Capcom", "Street Fighter Alpha: Warriors' Dreams (CPS Changer, Publicity USA 950727)", 0 ) +CONS( 1995, sfzbch, sfzch, 0, cps1_12MHz, sfzch, cps1, "Capcom", "Street Fighter Zero (CPS Changer, Brazil 950727)", 0 ) diff -Nru mame-0.144/src/mame/drivers/cps2.c mame-0.145/src/mame/drivers/cps2.c --- mame-0.144/src/mame/drivers/cps2.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/cps2.c 2012-02-06 21:30:38.000000000 +0000 @@ -593,7 +593,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "cpu/m68000/m68000.h" #include "sound/qsound.h" @@ -622,17 +621,13 @@ * *************************************/ -static INTERRUPT_GEN( cps2_interrupt ) +static TIMER_DEVICE_CALLBACK( cps2_interrupt ) { - cps_state *state = device->machine().driver_data(); + cps_state *state = timer.machine().driver_data(); /* 2 is vblank, 4 is some sort of scanline interrupt, 6 is both at the same time. */ - if (state->m_scancount >= 258) - { - state->m_scancount = -1; + if (param == 0) state->m_scancalls = 0; - } - state->m_scancount++; if (state->m_cps_b_regs[0x10 / 2] & 0x8000) state->m_cps_b_regs[0x10 / 2] &= 0x1ff; @@ -643,40 +638,40 @@ // popmessage("%04x %04x - %04x %04x",state->m_scanline1,state->m_scanline2,state->m_cps_b_regs[0x10/2],state->m_cps_b_regs[0x12/2]); /* raster effects */ - if (state->m_scanline1 == state->m_scancount || (state->m_scanline1 < state->m_scancount && !state->m_scancalls)) + if (state->m_scanline1 == param || (state->m_scanline1 < param && !state->m_scancalls)) { state->m_cps_b_regs[0x10/2] = 0; - device_set_input_line(device, 4, HOLD_LINE); - cps2_set_sprite_priorities(device->machine()); - device->machine().primary_screen->update_partial(16 - 10 + state->m_scancount); /* visarea.min_y - [first visible line?] + scancount */ + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + cps2_set_sprite_priorities(timer.machine()); + timer.machine().primary_screen->update_partial(param); state->m_scancalls++; -// popmessage("IRQ4 scancounter = %04i", state->m_scancount); +// popmessage("IRQ4 scancounter = %04i", param); } /* raster effects */ - if(state->m_scanline2 == state->m_scancount || (state->m_scanline2 < state->m_scancount && !state->m_scancalls)) + if(state->m_scanline2 == param || (state->m_scanline2 < param && !state->m_scancalls)) { state->m_cps_b_regs[0x12 / 2] = 0; - device_set_input_line(device, 4, HOLD_LINE); - cps2_set_sprite_priorities(device->machine()); - device->machine().primary_screen->update_partial(16 - 10 + state->m_scancount); /* visarea.min_y - [first visible line?] + scancount */ + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + cps2_set_sprite_priorities(timer.machine()); + timer.machine().primary_screen->update_partial(param); state->m_scancalls++; -// popmessage("IRQ4 scancounter = %04i",scancount); +// popmessage("IRQ4 scancounter = %04i", param); } - if (state->m_scancount == 240) /* VBlank */ + if (param == 240) /* VBlank */ { state->m_cps_b_regs[0x10 / 2] = state->m_scanline1; state->m_cps_b_regs[0x12 / 2] = state->m_scanline2; - device_set_input_line(device, 2, HOLD_LINE); + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); if(state->m_scancalls) { - cps2_set_sprite_priorities(device->machine()); - device->machine().primary_screen->update_partial(256); + cps2_set_sprite_priorities(timer.machine()); + timer.machine().primary_screen->update_partial(256); } - cps2_objram_latch(device->machine()); + cps2_objram_latch(timer.machine()); } - //popmessage("Raster calls = %i", state->m_scancalls); +// popmessage("Raster calls = %i", state->m_scancalls); } @@ -1182,8 +1177,28 @@ 64*8 }; -static GFXLAYOUT_RAW( layout16x16, 4, 16, 16, 8*8, 128*8 ) -static GFXLAYOUT_RAW( layout32x32, 4, 32, 32, 16*8, 512*8 ) +static const gfx_layout layout16x16 = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4, 9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4 }, + { STEP16(0,4*16) }, + 4*16*16 +}; + +static const gfx_layout layout32x32 = +{ + 32,32, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4, 9*4, 8*4, 11*4, 10*4, 13*4, 12*4, 15*4, 14*4, + 17*4, 16*4, 19*4, 18*4, 21*4, 20*4, 23*4, 22*4, 25*4, 24*4, 27*4, 26*4, 29*4, 28*4, 31*4, 30*4 }, + { STEP32(0,4*32) }, + 4*32*32 +}; static GFXDECODE_START( cps2 ) GFXDECODE_ENTRY( "gfx", 0, cps1_layout8x8, 0, 0x100 ) @@ -1206,8 +1221,6 @@ state->m_maincpu = machine.device("maincpu"); state->m_audiocpu = machine.device("audiocpu"); - state->save_item(NAME(state->m_scancount)); - if (state->m_audiocpu != NULL) // gigaman2 has no audiocpu memory_configure_bank(machine, "bank1", 0, (QSOUND_SIZE - 0x10000) / 0x4000, machine.region("audiocpu")->base() + 0x10000, 0x4000); } @@ -1218,7 +1231,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(cps2_map) - MCFG_CPU_VBLANK_INT_HACK(cps2_interrupt,259) // 262 /* ??? interrupts per frame */ + MCFG_TIMER_ADD_SCANLINE("scantimer", cps2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 8000000) MCFG_CPU_PROGRAM_MAP(qsound_sub_map) @@ -1232,10 +1245,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(XTAL_8MHz, 518, 64, 448, 259, 16, 240) - MCFG_SCREEN_UPDATE(cps1) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(cps1) + MCFG_SCREEN_VBLANK_STATIC(cps1) /* Measured clocks: V = 59.6376Hz @@ -7989,7 +8001,6 @@ /* Initialize some video elements */ DRIVER_INIT_CALL(cps2_video); - state->m_scancount = 0; state->m_cps2networkpresent = 0; machine.device("maincpu")->set_clock_scale(0.7375f); /* RAM access waitstates etc. aren't emulated - slow the CPU to compensate */ diff -Nru mame-0.144/src/mame/drivers/cps3.c mame-0.145/src/mame/drivers/cps3.c --- mame-0.144/src/mame/drivers/cps3.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/cps3.c 2012-02-06 21:30:38.000000000 +0000 @@ -67,13 +67,24 @@ Red Earth WZD96aA0F CP3000U0G USA* X CAP-WZD0A0 CAP-WZD-5 CAP-WZD-5 961121 Street Fighter III: New Generation 1997 SF397200F CP300000G JAPAN X CAP-SF3000 CAP-SF3-3 CAP-SF3-3 970204 +Street Fighter III: New Generation SF397200F CP300000G JAPAN X CAP-SF3000 ? ? 970312* +Street Fighter III: New Generation SF397200F CP300000G JAPAN X CAP-SF3000 ? ? 970403* Street Fighter III: New Generation SF3972A0F CP3000C0G ASIA X 970204 +Street Fighter III: New Generation SF3972A0F CP3000C0G ASIA X 970312* +Street Fighter III: New Generation SF3972A0F CP3000C0G ASIA X 970403* Street Fighter III: New Generation SF3972A0F CP3000H0G MEXICO X CAP-SF30A0 CAP-SF3-3 CAP-SF3-3 970204 +Street Fighter III: New Generation SF3972A0F CP3000H0G MEXICO X CAP-SF30A0 ? ? 970312* +Street Fighter III: New Generation SF3972A0F CP3000H0G MEXICO X CAP-SF30A0 ? ? 970403* Street Fighter III: New Generation SF3972A0F CP3000U0G USA X CAP-SF30A0 CAP-SF3-3 CAP-SF3-3 970204 +Street Fighter III: New Generation SF3972A0F CP3000U0G USA X CAP-SF30A0 ? ? 970312* +Street Fighter III: New Generation SF3972A0F CP3000U0G USA X CAP-SF30A0 ? ? 970403* Street Fighter III 2nd Impact: Giant Attack 1997 3GA97a00F CP300000G JAPAN X CAP-3GA000 CAP-3GA000 CAP-3GA-1 970930 +Street Fighter III 2nd Impact: Giant Attack 3GA97a00F CP300000G JAPAN X CAP-3GA000 ? ? 971016* Street Fighter III 2nd Impact: Giant Attack 3GA97aA0F CP3000C0G ASIA X 970930 +Street Fighter III 2nd Impact: Giant Attack 3GA97aA0F CP3000C0G ASIA X 971016* Street Fighter III 2nd Impact: Giant Attack 3GA97aA0F CP3000U0G USA X CAP-3GA0A0 CAP-3GA000 CAP-3GA-1 970930 +Street Fighter III 2nd Impact: Giant Attack 3GA97aA0F CP3000U0G USA X CAP-3GA0A0 ? ? 971016* JoJo no Kimyouna Bouken 1998 JJK98c00F CP300000G JAPAN X CAP-JJK000 CAP-JJK000 CAP-JJK-140 981202 JoJo no Kimyouna Bouken JJK98c00F CP300000G JAPAN X CAP-JJK000 CAP-JJK-2 CAP-JJK-160 990108 @@ -89,8 +100,8 @@ Street Fighter III 3rd Strike: Fight for the Future 33S99400F CP300000G JAPAN* X CAP-33S000 CAP-33S-2 CAP-33S-2 990608 Street Fighter III 3rd Strike: Fight for the Future 33S99400F CP300000G JAPAN X 990512 Street Fighter III 3rd Strike: Fight for the Future 33S99400F CP300000G JAPAN X 990608 -Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000B0G EUROPE* X CAP-33S0A0 CAP-33S-1 CAP-33S-1 990512 -Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000B0G EUROPE* X CAP-33S0A0 CAP-33S-2 CAP-33S-2 990608 +Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000B0G EUROPE X CAP-33S0A0 CAP-33S-1 CAP-33S-1 990512 +Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000B0G EUROPE X CAP-33S0A0 CAP-33S-2 CAP-33S-2 990608 Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000C0G ASIA* X CAP-33S0A0 CAP-33S-1 CAP-33S-1 990512 Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000C0G ASIA* X CAP-33S0A0 CAP-33S-2 CAP-33S-2 990608 Street Fighter III 3rd Strike: Fight for the Future 33S994A0F CP3000C0G ASIA* X 990512 @@ -177,12 +188,12 @@ |----------- Required SIMM Locations & Types -----------| Game 1 2 3 4 5 6 7 -------------------------------------------------------------------------------------------------------------- -JoJo's Venture 64MBit 64MBit 128MBit 128MBit 32MBit - - +Red Earth / Warzard 64MBit - 128MBit 128MBit 32MBit* - - +Street Fighter III: New Generation 64MBit - 128MBit 128MBit 32MBit* - - +Street Fighter III 2nd Impact: Giant Attack 64MBit 64MBit 128MBit 128MBit 128MBit - - +JoJo's Venture 64MBit 64MBit 128MBit 128MBit 32MBit* - - +Street Fighter III 3rd Strike: Fight for the Future 64MBit 64MBit 128MBit 128MBit 128MBit 128MBit - JoJo's Bizarre Adventure 64MBit 64MBit 128MBit 128MBit 128MBit - - -Street Fighter III New Generation 64MBit - 128MBit 128MBit 32MBit* - - -Street Fighter III 2nd Impact Giant Attack 64MBit 64MBit 128MBit 128MBit 128MBit - - -Street Fighter III 3rd Strike Fight for the Future 64MBit 64MBit 128MBit 128MBit 128MBit 128MBit - -Warzard / Red Earth 64MBit - 128MBit 128MBit 32MBit* - - Notes: - denotes not populated @@ -399,10 +410,10 @@ static void copy_from_nvram(running_machine &machine); -INLINE void cps3_drawgfxzoom(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +INLINE void cps3_drawgfxzoom(bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, unsigned int code,unsigned int color,int flipx,int flipy,int sx,int sy, int transparency,int transparent_color, - int scalex, int scaley,bitmap_t *pri_buffer,UINT32 pri_mask) + int scalex, int scaley,bitmap_ind8 *pri_buffer,UINT32 pri_mask) { cps3_state *state = gfx->machine().driver_data(); rectangle myclip; @@ -429,21 +440,8 @@ /* force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } - + myclip = clip; + myclip &= dest_bmp.cliprect(); /* 32-bit ONLY */ { @@ -489,30 +487,27 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -526,7 +521,7 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x("eeprom")->set_base(state->m_eeprom, 0x400); } -static DRIVER_INIT( jojo ) { init_common(machine, 0x02203ee3, 0x01301972, 0); } -static DRIVER_INIT( jojoba ) { init_common(machine, 0x23323ee3, 0x03021972, 0); } +static DRIVER_INIT( redearth ){ init_common(machine, 0x9e300ab1, 0xa175b82c, 0); } static DRIVER_INIT( sfiii ) { init_common(machine, 0xb5fe053e, 0xfc03925a, 0); } static DRIVER_INIT( sfiii2 ) { init_common(machine, 0x00000000, 0x00000000, 1); } +static DRIVER_INIT( jojo ) { init_common(machine, 0x02203ee3, 0x01301972, 0); } static DRIVER_INIT( sfiii3 ) { init_common(machine, 0xa55432b4, 0x0c129981, 0); } -static DRIVER_INIT( redearth ){ init_common(machine, 0x9e300ab1, 0xa175b82c, 0); } +static DRIVER_INIT( jojoba ) { init_common(machine, 0x23323ee3, 0x03021972, 0); } /* GFX decodes */ @@ -850,20 +845,17 @@ // the renderbuffer can be twice the size of the screen, this allows us to handle framebuffer zoom values // between 0x00 and 0x80 (0x40 is normal, 0x80 would be 'view twice as much', 0x20 is 'view half as much') - state->m_renderbuffer_bitmap = auto_bitmap_alloc(machine,512*2,224*2,machine.primary_screen->format()); + state->m_renderbuffer_bitmap.allocate(512*2,224*2); - state->m_renderbuffer_clip.min_x = 0; - state->m_renderbuffer_clip.max_x = state->m_screenwidth-1; - state->m_renderbuffer_clip.min_y = 0; - state->m_renderbuffer_clip.max_y = 224-1; + state->m_renderbuffer_clip.set(0, state->m_screenwidth-1, 0, 224-1); - bitmap_fill(state->m_renderbuffer_bitmap,&state->m_renderbuffer_clip,0x3f); + state->m_renderbuffer_bitmap.fill(0x3f, state->m_renderbuffer_clip); } // the 0x400 bit in the tilemap regs is "draw it upside-down" (bios tilemap during flashing, otherwise capcom logo is flipped) -static void cps3_draw_tilemapsprite_line(running_machine &machine, int tmnum, int drawline, bitmap_t *bitmap, const rectangle *cliprect ) +static void cps3_draw_tilemapsprite_line(running_machine &machine, int tmnum, int drawline, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { cps3_state *state = machine.driver_data(); UINT32* tmapregs[4] = { state->m_tilemap20_regs_base, state->m_tilemap30_regs_base, state->m_tilemap40_regs_base, state->m_tilemap50_regs_base }; @@ -915,14 +907,11 @@ drawline&=0x3ff; - if (drawline>cliprect->max_y+4) return; + if (drawline>cliprect.max_y+4) return; - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; - clip.min_y = drawline; - clip.max_y = drawline; + clip.set(cliprect.min_x, cliprect.max_x, drawline, drawline); - for (x=0;x<(cliprect->max_x/16)+2;x++) + for (x=0;x<(cliprect.max_x/16)+2;x++) { UINT32 dat; @@ -941,17 +930,17 @@ if (!bpp) machine.gfx[1]->color_granularity=256; else machine.gfx[1]->color_granularity=64; - cps3_drawgfxzoom(bitmap,&clip,machine.gfx[1],tileno,colour,xflip,yflip,(x*16)-scrollx%16,drawline-tilesubline,CPS3_TRANSPARENCY_PEN_INDEX,0, 0x10000, 0x10000, NULL, 0); + cps3_drawgfxzoom(bitmap,clip,machine.gfx[1],tileno,colour,xflip,yflip,(x*16)-scrollx%16,drawline-tilesubline,CPS3_TRANSPARENCY_PEN_INDEX,0, 0x10000, 0x10000, NULL, 0); } } } -static SCREEN_UPDATE(cps3) +static SCREEN_UPDATE_RGB32(cps3) { - cps3_state *state = screen->machine().driver_data(); + cps3_state *state = screen.machine().driver_data(); int y,x, count; - attoseconds_t period = screen->frame_period().attoseconds; - rectangle visarea = screen->visible_area(); + attoseconds_t period = screen.frame_period().attoseconds; + rectangle visarea = screen.visible_area(); int bg_drawn[4] = { 0, 0, 0, 0 }; @@ -969,9 +958,8 @@ if (state->m_screenwidth!=496) { state->m_screenwidth = 496; - visarea.min_x = 0; visarea.max_x = 496-1; - visarea.min_y = 0; visarea.max_y = 224-1; - screen->configure(496, 224, visarea, period); + visarea.set(0, 496-1, 0, 224-1); + screen.configure(496, 224, visarea, period); } } else @@ -979,9 +967,8 @@ if (state->m_screenwidth!=384) { state->m_screenwidth = 384; - visarea.min_x = 0; visarea.max_x = 384-1; - visarea.min_y = 0; visarea.max_y = 224-1; - screen->configure(384, 224, visarea, period); + visarea.set(0, 384-1, 0, 224-1); + screen.configure(384, 224, visarea, period); } } @@ -999,7 +986,7 @@ state->m_renderbuffer_clip.min_y = 0; state->m_renderbuffer_clip.max_y = ((224*fszx)>>16)-1; - bitmap_fill(state->m_renderbuffer_bitmap,&state->m_renderbuffer_clip,0); + state->m_renderbuffer_bitmap.fill(0, state->m_renderbuffer_clip); /* Sprites */ { @@ -1098,7 +1085,7 @@ { for (uu=0;uu<1023;uu++) { - cps3_draw_tilemapsprite_line(screen->machine(), tilemapnum, uu, state->m_renderbuffer_bitmap, &state->m_renderbuffer_clip ); + cps3_draw_tilemapsprite_line(screen.machine(), tilemapnum, uu, state->m_renderbuffer_bitmap, state->m_renderbuffer_clip ); } } bg_drawn[tilemapnum] = 1; @@ -1171,13 +1158,13 @@ /* use the bpp value from the main list or the sublists? */ if (whichbpp) { - if (!global_bpp) screen->machine().gfx[1]->color_granularity=256; - else screen->machine().gfx[1]->color_granularity=64; + if (!global_bpp) screen.machine().gfx[1]->color_granularity=256; + else screen.machine().gfx[1]->color_granularity=64; } else { - if (!bpp) screen->machine().gfx[1]->color_granularity=256; - else screen->machine().gfx[1]->color_granularity=64; + if (!bpp) screen.machine().gfx[1]->color_granularity=256; + else screen.machine().gfx[1]->color_granularity=64; } { @@ -1185,11 +1172,11 @@ if (global_alpha || alpha) { - cps3_drawgfxzoom(state->m_renderbuffer_bitmap,&state->m_renderbuffer_clip,screen->machine().gfx[1],realtileno,actualpal,0^flipx,0^flipy,current_xpos,current_ypos,CPS3_TRANSPARENCY_PEN_INDEX_BLEND,0,xinc,yinc, NULL, 0); + cps3_drawgfxzoom(state->m_renderbuffer_bitmap,state->m_renderbuffer_clip,screen.machine().gfx[1],realtileno,actualpal,0^flipx,0^flipy,current_xpos,current_ypos,CPS3_TRANSPARENCY_PEN_INDEX_BLEND,0,xinc,yinc, NULL, 0); } else { - cps3_drawgfxzoom(state->m_renderbuffer_bitmap,&state->m_renderbuffer_clip,screen->machine().gfx[1],realtileno,actualpal,0^flipx,0^flipy,current_xpos,current_ypos,CPS3_TRANSPARENCY_PEN_INDEX,0,xinc,yinc, NULL, 0); + cps3_drawgfxzoom(state->m_renderbuffer_bitmap,state->m_renderbuffer_clip,screen.machine().gfx[1],realtileno,actualpal,0^flipx,0^flipy,current_xpos,current_ypos,CPS3_TRANSPARENCY_PEN_INDEX,0,xinc,yinc, NULL, 0); } count++; } @@ -1215,8 +1202,8 @@ srcy=0; for (rendery=0;rendery<224;rendery++) { - dstbitmap = BITMAP_ADDR32(bitmap, rendery, 0); - srcbitmap = BITMAP_ADDR32(state->m_renderbuffer_bitmap, srcy>>16, 0); + dstbitmap = &bitmap.pix32(rendery); + srcbitmap = &state->m_renderbuffer_bitmap.pix32(srcy>>16); srcx=0; for (renderx=0;renderxm_screenwidth;renderx++) @@ -1255,7 +1242,7 @@ pal += state->m_ss_pal_base << 5; tile+=0x200; - cps3_drawgfxzoom(bitmap, cliprect, screen->machine().gfx[0],tile,pal,flipx,flipy,x*8,y*8,CPS3_TRANSPARENCY_PEN,0,0x10000,0x10000,NULL,0); + cps3_drawgfxzoom(bitmap, cliprect, screen.machine().gfx[0],tile,pal,flipx,flipy,x*8,y*8,CPS3_TRANSPARENCY_PEN,0,0x10000,0x10000,NULL,0); count++; } } @@ -2330,7 +2317,7 @@ static const SCSIConfigTable dev_table = { 1, /* 1 SCSI device */ - { { SCSI_ID_1, "cdrom", SCSI_DEVICE_CDROM } } /* SCSI ID 2, using CD 0, and it's a CD-ROM */ + { { SCSI_ID_1, ":cdrom", SCSI_DEVICE_CDROM } } /* SCSI ID 2, using CD 0, and it's a CD-ROM */ }; static const struct WD33C93interface scsi_intf = @@ -2586,9 +2573,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_60MHz/8, 486, 0, 384, 259, 0, 224) - MCFG_SCREEN_UPDATE(cps3) + MCFG_SCREEN_UPDATE_STATIC(cps3) /* Measured clocks: V = 59.5992Hz @@ -2617,35 +2603,34 @@ /* individual configs for each machine, depending on the SIMMs installed */ -MACHINE_CONFIG_DERIVED( jojo, cps3 ) +MACHINE_CONFIG_DERIVED( redearth, cps3 ) MCFG_FRAGMENT_ADD(simm1_64mbit) - MCFG_FRAGMENT_ADD(simm2_64mbit) MCFG_FRAGMENT_ADD(simm3_128mbit) MCFG_FRAGMENT_ADD(simm4_128mbit) MCFG_FRAGMENT_ADD(simm5_32mbit) MACHINE_CONFIG_END -MACHINE_CONFIG_DERIVED( jojoba, cps3 ) +MACHINE_CONFIG_DERIVED( sfiii, cps3 ) MCFG_FRAGMENT_ADD(simm1_64mbit) - MCFG_FRAGMENT_ADD(simm2_64mbit) MCFG_FRAGMENT_ADD(simm3_128mbit) MCFG_FRAGMENT_ADD(simm4_128mbit) - MCFG_FRAGMENT_ADD(simm5_128mbit) + MCFG_FRAGMENT_ADD(simm5_32mbit) MACHINE_CONFIG_END -MACHINE_CONFIG_DERIVED( sfiii, cps3 ) +MACHINE_CONFIG_DERIVED( sfiii2, cps3 ) MCFG_FRAGMENT_ADD(simm1_64mbit) + MCFG_FRAGMENT_ADD(simm2_64mbit) MCFG_FRAGMENT_ADD(simm3_128mbit) MCFG_FRAGMENT_ADD(simm4_128mbit) - MCFG_FRAGMENT_ADD(simm5_32mbit) + MCFG_FRAGMENT_ADD(simm5_128mbit) MACHINE_CONFIG_END -MACHINE_CONFIG_DERIVED( sfiii2, cps3 ) +MACHINE_CONFIG_DERIVED( jojo, cps3 ) MCFG_FRAGMENT_ADD(simm1_64mbit) MCFG_FRAGMENT_ADD(simm2_64mbit) MCFG_FRAGMENT_ADD(simm3_128mbit) MCFG_FRAGMENT_ADD(simm4_128mbit) - MCFG_FRAGMENT_ADD(simm5_128mbit) + MCFG_FRAGMENT_ADD(simm5_32mbit) MACHINE_CONFIG_END MACHINE_CONFIG_DERIVED( sfiii3, cps3 ) @@ -2657,13 +2642,68 @@ MCFG_FRAGMENT_ADD(simm6_128mbit) MACHINE_CONFIG_END -MACHINE_CONFIG_DERIVED( redearth, cps3 ) +MACHINE_CONFIG_DERIVED( jojoba, cps3 ) MCFG_FRAGMENT_ADD(simm1_64mbit) + MCFG_FRAGMENT_ADD(simm2_64mbit) MCFG_FRAGMENT_ADD(simm3_128mbit) MCFG_FRAGMENT_ADD(simm4_128mbit) - MCFG_FRAGMENT_ADD(simm5_32mbit) + MCFG_FRAGMENT_ADD(simm5_128mbit) MACHINE_CONFIG_END +#define REDEARTH_961121_FLASH \ + ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "redearth-simm1.0", 0x00000, 0x200000, CRC(cad468f8) SHA1(b3aa4f7d3fae84e8821417ccde9528d3eda2b7a6) ) \ + ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "redearth-simm1.1", 0x00000, 0x200000, CRC(e9721d89) SHA1(5c63d10bdbce52d50b6dde14d4a0f1369383d656) ) \ + ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "redearth-simm1.2", 0x00000, 0x200000, CRC(2889ec98) SHA1(a94310eb4777f908d87e9d90969db8504b4140ff) ) \ + ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "redearth-simm1.3", 0x00000, 0x200000, CRC(5a6cd148) SHA1(d65c6e8378a91828474a16a3bbcd13c4b3b15f13) ) \ + ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "redearth-simm3.0", 0x00000, 0x200000, CRC(83350cc5) SHA1(922b1abf80a4a89f35279b66311a7369d3965bd0) ) \ + ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "redearth-simm3.1", 0x00000, 0x200000, CRC(56734de6) SHA1(75699fa6efe5bec335e4b02e15b3c45726b68fa8) ) \ + ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "redearth-simm3.2", 0x00000, 0x200000, CRC(800ea0f1) SHA1(33871ab56dc1cd24441389d53e43fb8e43b149d9) ) \ + ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "redearth-simm3.3", 0x00000, 0x200000, CRC(97e9146c) SHA1(ab7744709615081440bee72f4080d6fd5b938668) ) \ + ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "redearth-simm3.4", 0x00000, 0x200000, CRC(0cb1d648) SHA1(7042a590c2b7ec55323062127e254da3cdc790a1) ) \ + ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "redearth-simm3.5", 0x00000, 0x200000, CRC(7a1099f0) SHA1(c6a92ec86eb24485f1db530e0e78f647e8432231) ) \ + ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "redearth-simm3.6", 0x00000, 0x200000, CRC(aeff8f54) SHA1(fd760e237c2e5fb2da45e32a1c12fd3defb4c3e4) ) \ + ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "redearth-simm3.7", 0x00000, 0x200000, CRC(f770acd0) SHA1(4b3ccb6f91568f95f04ede6c574144918d131201) ) \ + ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "redearth-simm4.0", 0x00000, 0x200000, CRC(301e56f2) SHA1(4847d971bff70a2aeed4599e1201c7ec9677da60) ) \ + ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "redearth-simm4.1", 0x00000, 0x200000, CRC(2048e103) SHA1(b21f95b05cd99749bd3f25cc71b2671c2026847b) ) \ + ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "redearth-simm4.2", 0x00000, 0x200000, CRC(c9433455) SHA1(63a269d76bac332c2e991d0f6a20c35e0e88680a) ) \ + ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "redearth-simm4.3", 0x00000, 0x200000, CRC(c02171a8) SHA1(2e9228729b27a6113d9f2e42af310a834979f714) ) \ + ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "redearth-simm4.4", 0x00000, 0x200000, CRC(2ddbf276) SHA1(b232baaa8edc8db18f8a3bdcc2d38fe984a94a34) ) \ + ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "redearth-simm4.5", 0x00000, 0x200000, CRC(fea820a6) SHA1(55ee8ef95751f5a509fb126513e1b2a70a3414e5) ) \ + ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "redearth-simm4.6", 0x00000, 0x200000, CRC(c7528df1) SHA1(aa312f80c2d7759d18d1aa8d416cf932b2850824) ) \ + ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "redearth-simm4.7", 0x00000, 0x200000, CRC(2449cf3b) SHA1(c60d8042136d74e547f668ad787cae529c42eed9) ) \ + ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "redearth-simm5.0", 0x00000, 0x200000, CRC(424451b9) SHA1(250fb92254c9e7ff5bc8dbeea5872f8a771dc9bd) ) \ + ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "redearth-simm5.1", 0x00000, 0x200000, CRC(9b8cb56b) SHA1(2ff1081dc99bb7c2f1e036f4c112137c96b83d23) ) \ + +#define REDEARTH_961121_CDROM \ + DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-wzd-5", 0, SHA1(e5676752b08283dc4a98c3d7b759e8aa6dcd0679) ) \ + +#define REDEARTH_961023_FLASH \ + ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "redeartha-simm1.0", 0x00000, 0x200000, CRC(65bac346) SHA1(6f4ba0c2cae91a37fc97bea5fc8a50aaf6ca6513) ) \ + ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "redeartha-simm1.1", 0x00000, 0x200000, CRC(a8ec4aae) SHA1(0012cb6ba630ddd74958f7759de34706bf919338) ) \ + ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "redeartha-simm1.2", 0x00000, 0x200000, CRC(2caf8995) SHA1(ca012b6dec0481b043edf9c7e931bd952ec74ebb) ) \ + ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "redeartha-simm1.3", 0x00000, 0x200000, CRC(13ebc21d) SHA1(465bdea0633526a8bf07b35495a5311c8bf213d5) ) \ + ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "redearth-simm3.0", 0x00000, 0x200000, CRC(83350cc5) SHA1(922b1abf80a4a89f35279b66311a7369d3965bd0) ) \ + ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "redearth-simm3.1", 0x00000, 0x200000, CRC(56734de6) SHA1(75699fa6efe5bec335e4b02e15b3c45726b68fa8) ) \ + ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "redearth-simm3.2", 0x00000, 0x200000, CRC(800ea0f1) SHA1(33871ab56dc1cd24441389d53e43fb8e43b149d9) ) \ + ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "redearth-simm3.3", 0x00000, 0x200000, CRC(97e9146c) SHA1(ab7744709615081440bee72f4080d6fd5b938668) ) \ + ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "redearth-simm3.4", 0x00000, 0x200000, CRC(0cb1d648) SHA1(7042a590c2b7ec55323062127e254da3cdc790a1) ) \ + ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "redearth-simm3.5", 0x00000, 0x200000, CRC(7a1099f0) SHA1(c6a92ec86eb24485f1db530e0e78f647e8432231) ) \ + ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "redearth-simm3.6", 0x00000, 0x200000, CRC(aeff8f54) SHA1(fd760e237c2e5fb2da45e32a1c12fd3defb4c3e4) ) \ + ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "redearth-simm3.7", 0x00000, 0x200000, CRC(f770acd0) SHA1(4b3ccb6f91568f95f04ede6c574144918d131201) ) \ + ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "redearth-simm4.0", 0x00000, 0x200000, CRC(301e56f2) SHA1(4847d971bff70a2aeed4599e1201c7ec9677da60) ) \ + ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "redearth-simm4.1", 0x00000, 0x200000, CRC(2048e103) SHA1(b21f95b05cd99749bd3f25cc71b2671c2026847b) ) \ + ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "redearth-simm4.2", 0x00000, 0x200000, CRC(c9433455) SHA1(63a269d76bac332c2e991d0f6a20c35e0e88680a) ) \ + ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "redearth-simm4.3", 0x00000, 0x200000, CRC(c02171a8) SHA1(2e9228729b27a6113d9f2e42af310a834979f714) ) \ + ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "redearth-simm4.4", 0x00000, 0x200000, CRC(2ddbf276) SHA1(b232baaa8edc8db18f8a3bdcc2d38fe984a94a34) ) \ + ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "redearth-simm4.5", 0x00000, 0x200000, CRC(fea820a6) SHA1(55ee8ef95751f5a509fb126513e1b2a70a3414e5) ) \ + ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "redearth-simm4.6", 0x00000, 0x200000, CRC(c7528df1) SHA1(aa312f80c2d7759d18d1aa8d416cf932b2850824) ) \ + ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "redearth-simm4.7", 0x00000, 0x200000, CRC(2449cf3b) SHA1(c60d8042136d74e547f668ad787cae529c42eed9) ) \ + ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "redearth-simm5.0", 0x00000, 0x200000, CRC(424451b9) SHA1(250fb92254c9e7ff5bc8dbeea5872f8a771dc9bd) ) \ + ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "redearth-simm5.1", 0x00000, 0x200000, CRC(9b8cb56b) SHA1(2ff1081dc99bb7c2f1e036f4c112137c96b83d23) ) \ + +#define REDEARTH_961023_CDROM \ + DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-wzd-3", 0, SHA1(a6ff67093db6bc80ee5fc46e4300e0177b213a52) ) \ + #define SFIII_970204_FLASH \ ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "sfiii-simm1.0", 0x00000, 0x200000, CRC(cfc9e45a) SHA1(5d9061f76680642e730373e3ac29b24926dc5c0c) ) \ ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "sfiii-simm1.1", 0x00000, 0x200000, CRC(57920546) SHA1(c8452e7e101b8888fb806d1c9874c6be49fc7dbd) ) \ @@ -2728,6 +2768,68 @@ #define SFIII2_970930_CDROM \ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-3ga000", 0, SHA1(4e162885b0b3265a56e0265037bcf247e820f027) ) \ +#define JOJO_990108_FLASH \ + ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "jojo-simm1.0", 0x00000, 0x200000, CRC(cfbc38d6) SHA1(c33e3a51fe8ab54e0912a1d6e662fe1ade73cee7) ) \ + ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "jojo-simm1.1", 0x00000, 0x200000, CRC(42578d94) SHA1(fa46f92ac1a6716430adec9ab27214a11fa61749) ) \ + ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "jojo-simm1.2", 0x00000, 0x200000, CRC(1b40c566) SHA1(9833799e9b4fecf7f9ce14bca64936646b3fdbde) ) \ + ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "jojo-simm1.3", 0x00000, 0x200000, CRC(bba709b4) SHA1(0dd71e575f2193505f2ab960568ac1eccf40d53f) ) \ + ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "jojo-simm2.0", 0x00000, 0x200000, CRC(417e5dc1) SHA1(54ee9596c1c51811f3bdef7dbe77b44b34f230ca) ) \ + ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "jojo-simm2.1", 0x00000, 0x200000, CRC(d3b3267d) SHA1(eb2cff347880f1489fb5b1b8bd16df8f50c7f494) ) \ + ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "jojo-simm2.2", 0x00000, 0x200000, CRC(c66d96b1) SHA1(909d5aac165748b549b6056a6091c41df012f5df) ) \ + ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "jojo-simm2.3", 0x00000, 0x200000, CRC(aa34cc85) SHA1(7677cc6fa913755fc699691b350698bbe8904118) ) \ + ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "jojo-simm3.0", 0x00000, 0x200000, CRC(de7fc9c1) SHA1(662b85a990b04c855773506c936317e62fab4a05) ) \ + ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "jojo-simm3.1", 0x00000, 0x200000, CRC(43d053d3) SHA1(54ff0e9c164e0d1649522c330ccc7e5d79e0bc85) ) \ + ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "jojo-simm3.2", 0x00000, 0x200000, CRC(2ffd7fa5) SHA1(9018c8e2b286a333ba606208e90caa764951ea3f) ) \ + ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "jojo-simm3.3", 0x00000, 0x200000, CRC(4da4985b) SHA1(2552b1730a21ce17d58b69a79ad212a6a5829439) ) \ + ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "jojo-simm3.4", 0x00000, 0x200000, CRC(fde98d72) SHA1(654563e12d033e8656dc74a268a08b15b171470d) ) \ + ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "jojo-simm3.5", 0x00000, 0x200000, CRC(edb2a266) SHA1(19ebada8422c7f4bf70d0c9ad42b84268967b316) ) \ + ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "jojo-simm3.6", 0x00000, 0x200000, CRC(be7cf319) SHA1(7893f5907992e6b903b2683980bba6d3d003bb06) ) \ + ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "jojo-simm3.7", 0x00000, 0x200000, CRC(56fe1a9f) SHA1(01741fe1256f4e682f687e94040f4e8bbb8bedb2) ) \ + ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "jojo-simm4.0", 0x00000, 0x200000, CRC(c4e7bf68) SHA1(a4d1ddea58a3d42db82a63a5e974cbf38d9b792a) ) \ + ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "jojo-simm4.1", 0x00000, 0x200000, CRC(b62b2719) SHA1(cb577b89e9e14fda67715716fefd47a782d518ab) ) \ + ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "jojo-simm4.2", 0x00000, 0x200000, CRC(18d15809) SHA1(2b406cd1aaa4799a436213dcaa65473eacb4c6d7) ) \ + ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "jojo-simm4.3", 0x00000, 0x200000, CRC(9af0ad79) SHA1(075ee048e17b50188876f25d7a6571d6ace84d7d) ) \ + ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "jojo-simm4.4", 0x00000, 0x200000, CRC(4124c1f0) SHA1(e4946a8029adc5d0bacead8d766521b4ccd1722b) ) \ + ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "jojo-simm4.5", 0x00000, 0x200000, CRC(5e001fd1) SHA1(6457a39f336381b46e587aa2f5f719810ee5bcf9) ) \ + ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "jojo-simm4.6", 0x00000, 0x200000, CRC(9affa23b) SHA1(e3d77e777c47277d841a9dadc1dd6e3157706a2e) ) \ + ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "jojo-simm4.7", 0x00000, 0x200000, CRC(2511572a) SHA1(725adcf71bcee5c8bb839d2d1c5e3456b8c6886b) ) \ + ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "jojo-simm5.0", 0x00000, 0x200000, CRC(797615fc) SHA1(29874be9f1da5515c90f5d601aa5924c263f8feb) ) \ + ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "jojo-simm5.1", 0x00000, 0x200000, CRC(734fd162) SHA1(16cdfac74d18a6c2216afb1ce6afbd7f15297c32) ) \ + +#define JOJO_990108_CDROM \ + DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-jjk-2", 0, SHA1(0f5c09171409213e191a607ee89ca3a91fe9c96a) ) \ + +#define JOJO_981202_FLASH \ + ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "jojoa-simm1.0", 0x00000, 0x200000, CRC(e06ba886) SHA1(4defd5e8e1e6d0c439fed8a6454e89a59e24ea4c) ) \ + ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "jojoa-simm1.1", 0x00000, 0x200000, CRC(6dd177c8) SHA1(c39db980f6fcca9c221e9be6f777eaf38f1b136b) ) \ + ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "jojoa-simm1.2", 0x00000, 0x200000, CRC(d35a15e0) SHA1(576b92a94505764a10b9bcf82c02335e7ef62014) ) \ + ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "jojoa-simm1.3", 0x00000, 0x200000, CRC(66d865ac) SHA1(5248c3f124af62b4a672d954ef15f86629feeacb) ) \ + ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "jojoa-simm2.0", 0x00000, 0x200000, CRC(417e5dc1) SHA1(54ee9596c1c51811f3bdef7dbe77b44b34f230ca) ) \ + ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "jojoa-simm2.1", 0x00000, 0x200000, CRC(c891c887) SHA1(42e84f774ee655e9a39b016a3cfe94262ed2e9f1) ) \ + ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "jojoa-simm2.2", 0x00000, 0x200000, CRC(1e101f30) SHA1(56518c1646bb9452334856bb8bcc58892f9f93b9) ) \ + ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "jojoa-simm2.3", 0x00000, 0x200000, CRC(1fd1d3e4) SHA1(bed2b77d58f1fdf7ba5ca7126d3db1dd0f8c80b4) ) \ + ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "jojo-simm3.0", 0x00000, 0x200000, CRC(de7fc9c1) SHA1(662b85a990b04c855773506c936317e62fab4a05) ) \ + ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "jojo-simm3.1", 0x00000, 0x200000, CRC(43d053d3) SHA1(54ff0e9c164e0d1649522c330ccc7e5d79e0bc85) ) \ + ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "jojo-simm3.2", 0x00000, 0x200000, CRC(2ffd7fa5) SHA1(9018c8e2b286a333ba606208e90caa764951ea3f) ) \ + ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "jojo-simm3.3", 0x00000, 0x200000, CRC(4da4985b) SHA1(2552b1730a21ce17d58b69a79ad212a6a5829439) ) \ + ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "jojo-simm3.4", 0x00000, 0x200000, CRC(fde98d72) SHA1(654563e12d033e8656dc74a268a08b15b171470d) ) \ + ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "jojo-simm3.5", 0x00000, 0x200000, CRC(edb2a266) SHA1(19ebada8422c7f4bf70d0c9ad42b84268967b316) ) \ + ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "jojo-simm3.6", 0x00000, 0x200000, CRC(be7cf319) SHA1(7893f5907992e6b903b2683980bba6d3d003bb06) ) \ + ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "jojo-simm3.7", 0x00000, 0x200000, CRC(56fe1a9f) SHA1(01741fe1256f4e682f687e94040f4e8bbb8bedb2) ) \ + ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "jojo-simm4.0", 0x00000, 0x200000, CRC(c4e7bf68) SHA1(a4d1ddea58a3d42db82a63a5e974cbf38d9b792a) ) \ + ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "jojo-simm4.1", 0x00000, 0x200000, CRC(b62b2719) SHA1(cb577b89e9e14fda67715716fefd47a782d518ab) ) \ + ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "jojo-simm4.2", 0x00000, 0x200000, CRC(18d15809) SHA1(2b406cd1aaa4799a436213dcaa65473eacb4c6d7) ) \ + ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "jojo-simm4.3", 0x00000, 0x200000, CRC(9af0ad79) SHA1(075ee048e17b50188876f25d7a6571d6ace84d7d) ) \ + ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "jojo-simm4.4", 0x00000, 0x200000, CRC(4124c1f0) SHA1(e4946a8029adc5d0bacead8d766521b4ccd1722b) ) \ + ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "jojo-simm4.5", 0x00000, 0x200000, CRC(5e001fd1) SHA1(6457a39f336381b46e587aa2f5f719810ee5bcf9) ) \ + ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "jojo-simm4.6", 0x00000, 0x200000, CRC(9affa23b) SHA1(e3d77e777c47277d841a9dadc1dd6e3157706a2e) ) \ + ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "jojo-simm4.7", 0x00000, 0x200000, CRC(2511572a) SHA1(725adcf71bcee5c8bb839d2d1c5e3456b8c6886b) ) \ + ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "jojo-simm5.0", 0x00000, 0x200000, CRC(797615fc) SHA1(29874be9f1da5515c90f5d601aa5924c263f8feb) ) \ + ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "jojo-simm5.1", 0x00000, 0x200000, CRC(734fd162) SHA1(16cdfac74d18a6c2216afb1ce6afbd7f15297c32) ) \ + +#define JOJO_981202_CDROM \ + DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-jjk000", 0, SHA1(09869f6d8c032b527e02d815749dc8fab1289e86) ) \ + #define SFIII3_990608_FLASH \ ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "sfiii3-simm1.0", 0x00000, 0x200000, CRC(11dfd3cd) SHA1(dba1f77c46e80317e3279298411154dfb6db2309) ) \ ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "sfiii3-simm1.1", 0x00000, 0x200000, CRC(c50585e6) SHA1(a289237957ea1c7f58b1c65e24c54ceb34cb1712) ) \ @@ -2774,112 +2876,50 @@ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-33s-2", 0, SHA1(41b0e246db91cbfc3f8f0f62d981734feb4b4ab5) ) \ #define SFIII3_990512_FLASH \ - ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "sfiii3a-simm1.0",0x00000, 0x200000, CRC(66e66235) SHA1(0a98038721d176458d4f85dbd76c5edb93a65322) ) \ - ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "sfiii3a-simm1.1",0x00000, 0x200000, CRC(186e8c5f) SHA1(a63040201a660b56217a8cbab32f5c2c466ee5dd) ) \ - ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "sfiii3a-simm1.2",0x00000, 0x200000, CRC(bce18cab) SHA1(a5c28063d98c22403756fc926a20631456fb7dcc) ) \ - ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "sfiii3a-simm1.3",0x00000, 0x200000, CRC(129dc2c9) SHA1(c1e634d94b1c8f7f02a47703622de5cab3d0da3f) ) \ - ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "sfiii3-simm2.0", 0x00000, 0x200000, CRC(06eb969e) SHA1(d89f6a6585b76692d57d337f0f8186398fb056da) ) \ - ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "sfiii3-simm2.1", 0x00000, 0x200000, CRC(e7039f82) SHA1(8e81e66b5a4f45ae14b070a491bde47a6a74499f) ) \ - ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "sfiii3-simm2.2", 0x00000, 0x200000, CRC(645c96f7) SHA1(06d5a54874d4bf100b776131ec9060da209ad037) ) \ - ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "sfiii3-simm2.3", 0x00000, 0x200000, CRC(610efab1) SHA1(bbc21ed6ff6220ff6017a3f02ebd9a341fbc9040) ) \ - ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "sfiii3-simm3.0", 0x00000, 0x200000, CRC(7baa1f79) SHA1(3f409df28c24dd7221966b5340d59898ea756b6f) ) \ - ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "sfiii3-simm3.1", 0x00000, 0x200000, CRC(234bf8fe) SHA1(2191781ae4d726cab28de97f27efa4a13f3bdd69) ) \ - ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "sfiii3-simm3.2", 0x00000, 0x200000, CRC(d9ebc308) SHA1(af6a0dca77e5181c9f20533a06760a782c5fd51d) ) \ - ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "sfiii3-simm3.3", 0x00000, 0x200000, CRC(293cba77) SHA1(294604cacdc24261aec4d39e489de91c41fa1758) ) \ - ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "sfiii3-simm3.4", 0x00000, 0x200000, CRC(6055e747) SHA1(3813852c5a4a5355ef739ca8f0913bbd390b984b) ) \ - ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "sfiii3-simm3.5", 0x00000, 0x200000, CRC(499aa6fc) SHA1(5b9b6eab3e99ff3e1d7c1f50b9d8bc6a81f3f8a9) ) \ - ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "sfiii3-simm3.6", 0x00000, 0x200000, CRC(6c13879e) SHA1(de189b0b8f42bc7dd89983e62bc2ecb4237b3277) ) \ - ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "sfiii3-simm3.7", 0x00000, 0x200000, CRC(cf4f8ede) SHA1(e0fb68fcb0e445f824c62fa828d6e1dcd7e3683a) ) \ - ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "sfiii3-simm4.0", 0x00000, 0x200000, CRC(091fd5ba) SHA1(3327ad7c2623c119bf728af717ea2ce3b74673a9) ) \ - ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "sfiii3-simm4.1", 0x00000, 0x200000, CRC(0bca8917) SHA1(b7b284e2f16f46d46bcfaae779b232c5b980924f) ) \ - ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "sfiii3-simm4.2", 0x00000, 0x200000, CRC(a0fd578b) SHA1(100c9db9f00ecd88d518076f5a0822e6ac3695b3) ) \ - ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "sfiii3-simm4.3", 0x00000, 0x200000, CRC(4bf8c699) SHA1(2c0b4288b5ebc5e54d9e782dfc39eb8c78fd4c21) ) \ - ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "sfiii3-simm4.4", 0x00000, 0x200000, CRC(137b8785) SHA1(56a579520a8ce2abbf36be57777f024e80474eee) ) \ - ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "sfiii3-simm4.5", 0x00000, 0x200000, CRC(4fb70671) SHA1(9aba83c18cfc099a5ce18793119bff0c2b9c777f) ) \ - ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "sfiii3-simm4.6", 0x00000, 0x200000, CRC(832374a4) SHA1(c84629e32fbf47cb7b5b4ee7555bfc2ac9b3857f) ) \ - ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "sfiii3-simm4.7", 0x00000, 0x200000, CRC(1c88576d) SHA1(0f039944d0c2305999ed5dbd351c3eb87812dc3b) ) \ - ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "sfiii3-simm5.0", 0x00000, 0x200000, CRC(c67d9190) SHA1(d265475244099d0ec153059986f3445c7bd910a3) ) \ - ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "sfiii3-simm5.1", 0x00000, 0x200000, CRC(6cb79868) SHA1(c94237f30e05bfcb2e23945530c812d9e4c73416) ) \ - ROM_REGION( 0x200000, "simm5.2", 0 ) ROM_LOAD( "sfiii3-simm5.2", 0x00000, 0x200000, CRC(df69930e) SHA1(c76b7c559a1d5558138afbc796249efa2f49f6a8) ) \ - ROM_REGION( 0x200000, "simm5.3", 0 ) ROM_LOAD( "sfiii3-simm5.3", 0x00000, 0x200000, CRC(333754e0) SHA1(4c18a569c26524a492ecd6f4c8b3c8e803a077d3) ) \ - ROM_REGION( 0x200000, "simm5.4", 0 ) ROM_LOAD( "sfiii3-simm5.4", 0x00000, 0x200000, CRC(78f6d417) SHA1(a69577cc5399fcf0a24548661168f27f3e7e8e40) ) \ - ROM_REGION( 0x200000, "simm5.5", 0 ) ROM_LOAD( "sfiii3-simm5.5", 0x00000, 0x200000, CRC(8ccad9b1) SHA1(f8bda399f87be2497b7ac39e9661f9863bf4f873) ) \ - ROM_REGION( 0x200000, "simm5.6", 0 ) ROM_LOAD( "sfiii3-simm5.6", 0x00000, 0x200000, CRC(85de59e5) SHA1(748b5c91f15777b85d8c1d35b685cd90d3185ec6) ) \ - ROM_REGION( 0x200000, "simm5.7", 0 ) ROM_LOAD( "sfiii3-simm5.7", 0x00000, 0x200000, CRC(ee7e29b3) SHA1(63dc30c6904ca2f58d229249bee5eef51fafa158) ) \ - ROM_REGION( 0x200000, "simm6.0", 0 ) ROM_LOAD( "sfiii3-simm6.0", 0x00000, 0x200000, CRC(8da69042) SHA1(fd3d08295342635b2136e48d543c9350d287bb22) ) \ - ROM_REGION( 0x200000, "simm6.1", 0 ) ROM_LOAD( "sfiii3-simm6.1", 0x00000, 0x200000, CRC(1c8c7ac4) SHA1(ac9f8353a4c356ef98aa7c226baba00b01f5a80f) ) \ - ROM_REGION( 0x200000, "simm6.2", 0 ) ROM_LOAD( "sfiii3-simm6.2", 0x00000, 0x200000, CRC(a671341d) SHA1(636f4c04962bc1e1ddb29d2e01244b00389b234f) ) \ - ROM_REGION( 0x200000, "simm6.3", 0 ) ROM_LOAD( "sfiii3-simm6.3", 0x00000, 0x200000, CRC(1a990249) SHA1(2acc639e2c0c53bf24096b8620eab090bc25d03b) ) \ - ROM_REGION( 0x200000, "simm6.4", 0 ) ROM_LOAD( "sfiii3-simm6.4", 0x00000, 0x200000, CRC(20cb39ac) SHA1(7d13a0fea1ef719dd2ff77dfb547d53c6023cc9e) ) \ - ROM_REGION( 0x200000, "simm6.5", 0 ) ROM_LOAD( "sfiii3-simm6.5", 0x00000, 0x200000, CRC(5f844b2f) SHA1(564e4934f89ed3b92a4c4874519f8f00f3b48696) ) \ - ROM_REGION( 0x200000, "simm6.6", 0 ) ROM_LOAD( "sfiii3-simm6.6", 0x00000, 0x200000, CRC(450e8d28) SHA1(885db658132aa27926df617ec2d2a1f38abdbb60) ) \ - ROM_REGION( 0x200000, "simm6.7", 0 ) ROM_LOAD( "sfiii3-simm6.7", 0x00000, 0x200000, CRC(cc5f4187) SHA1(248ddace21ed4736a56e92f77cc6ad219d7fef0b) ) \ + ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "sfiii3a-simm1.0", 0x00000, 0x200000, CRC(66e66235) SHA1(0a98038721d176458d4f85dbd76c5edb93a65322) ) \ + ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "sfiii3a-simm1.1", 0x00000, 0x200000, CRC(186e8c5f) SHA1(a63040201a660b56217a8cbab32f5c2c466ee5dd) ) \ + ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "sfiii3a-simm1.2", 0x00000, 0x200000, CRC(bce18cab) SHA1(a5c28063d98c22403756fc926a20631456fb7dcc) ) \ + ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "sfiii3a-simm1.3", 0x00000, 0x200000, CRC(129dc2c9) SHA1(c1e634d94b1c8f7f02a47703622de5cab3d0da3f) ) \ + ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "sfiii3-simm2.0", 0x00000, 0x200000, CRC(06eb969e) SHA1(d89f6a6585b76692d57d337f0f8186398fb056da) ) \ + ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "sfiii3-simm2.1", 0x00000, 0x200000, CRC(e7039f82) SHA1(8e81e66b5a4f45ae14b070a491bde47a6a74499f) ) \ + ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "sfiii3-simm2.2", 0x00000, 0x200000, CRC(645c96f7) SHA1(06d5a54874d4bf100b776131ec9060da209ad037) ) \ + ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "sfiii3-simm2.3", 0x00000, 0x200000, CRC(610efab1) SHA1(bbc21ed6ff6220ff6017a3f02ebd9a341fbc9040) ) \ + ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "sfiii3-simm3.0", 0x00000, 0x200000, CRC(7baa1f79) SHA1(3f409df28c24dd7221966b5340d59898ea756b6f) ) \ + ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "sfiii3-simm3.1", 0x00000, 0x200000, CRC(234bf8fe) SHA1(2191781ae4d726cab28de97f27efa4a13f3bdd69) ) \ + ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "sfiii3-simm3.2", 0x00000, 0x200000, CRC(d9ebc308) SHA1(af6a0dca77e5181c9f20533a06760a782c5fd51d) ) \ + ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "sfiii3-simm3.3", 0x00000, 0x200000, CRC(293cba77) SHA1(294604cacdc24261aec4d39e489de91c41fa1758) ) \ + ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "sfiii3-simm3.4", 0x00000, 0x200000, CRC(6055e747) SHA1(3813852c5a4a5355ef739ca8f0913bbd390b984b) ) \ + ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "sfiii3-simm3.5", 0x00000, 0x200000, CRC(499aa6fc) SHA1(5b9b6eab3e99ff3e1d7c1f50b9d8bc6a81f3f8a9) ) \ + ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "sfiii3-simm3.6", 0x00000, 0x200000, CRC(6c13879e) SHA1(de189b0b8f42bc7dd89983e62bc2ecb4237b3277) ) \ + ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "sfiii3-simm3.7", 0x00000, 0x200000, CRC(cf4f8ede) SHA1(e0fb68fcb0e445f824c62fa828d6e1dcd7e3683a) ) \ + ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "sfiii3-simm4.0", 0x00000, 0x200000, CRC(091fd5ba) SHA1(3327ad7c2623c119bf728af717ea2ce3b74673a9) ) \ + ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "sfiii3-simm4.1", 0x00000, 0x200000, CRC(0bca8917) SHA1(b7b284e2f16f46d46bcfaae779b232c5b980924f) ) \ + ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "sfiii3-simm4.2", 0x00000, 0x200000, CRC(a0fd578b) SHA1(100c9db9f00ecd88d518076f5a0822e6ac3695b3) ) \ + ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "sfiii3-simm4.3", 0x00000, 0x200000, CRC(4bf8c699) SHA1(2c0b4288b5ebc5e54d9e782dfc39eb8c78fd4c21) ) \ + ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "sfiii3-simm4.4", 0x00000, 0x200000, CRC(137b8785) SHA1(56a579520a8ce2abbf36be57777f024e80474eee) ) \ + ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "sfiii3-simm4.5", 0x00000, 0x200000, CRC(4fb70671) SHA1(9aba83c18cfc099a5ce18793119bff0c2b9c777f) ) \ + ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "sfiii3-simm4.6", 0x00000, 0x200000, CRC(832374a4) SHA1(c84629e32fbf47cb7b5b4ee7555bfc2ac9b3857f) ) \ + ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "sfiii3-simm4.7", 0x00000, 0x200000, CRC(1c88576d) SHA1(0f039944d0c2305999ed5dbd351c3eb87812dc3b) ) \ + ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "sfiii3-simm5.0", 0x00000, 0x200000, CRC(c67d9190) SHA1(d265475244099d0ec153059986f3445c7bd910a3) ) \ + ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "sfiii3-simm5.1", 0x00000, 0x200000, CRC(6cb79868) SHA1(c94237f30e05bfcb2e23945530c812d9e4c73416) ) \ + ROM_REGION( 0x200000, "simm5.2", 0 ) ROM_LOAD( "sfiii3-simm5.2", 0x00000, 0x200000, CRC(df69930e) SHA1(c76b7c559a1d5558138afbc796249efa2f49f6a8) ) \ + ROM_REGION( 0x200000, "simm5.3", 0 ) ROM_LOAD( "sfiii3-simm5.3", 0x00000, 0x200000, CRC(333754e0) SHA1(4c18a569c26524a492ecd6f4c8b3c8e803a077d3) ) \ + ROM_REGION( 0x200000, "simm5.4", 0 ) ROM_LOAD( "sfiii3-simm5.4", 0x00000, 0x200000, CRC(78f6d417) SHA1(a69577cc5399fcf0a24548661168f27f3e7e8e40) ) \ + ROM_REGION( 0x200000, "simm5.5", 0 ) ROM_LOAD( "sfiii3-simm5.5", 0x00000, 0x200000, CRC(8ccad9b1) SHA1(f8bda399f87be2497b7ac39e9661f9863bf4f873) ) \ + ROM_REGION( 0x200000, "simm5.6", 0 ) ROM_LOAD( "sfiii3-simm5.6", 0x00000, 0x200000, CRC(85de59e5) SHA1(748b5c91f15777b85d8c1d35b685cd90d3185ec6) ) \ + ROM_REGION( 0x200000, "simm5.7", 0 ) ROM_LOAD( "sfiii3-simm5.7", 0x00000, 0x200000, CRC(ee7e29b3) SHA1(63dc30c6904ca2f58d229249bee5eef51fafa158) ) \ + ROM_REGION( 0x200000, "simm6.0", 0 ) ROM_LOAD( "sfiii3-simm6.0", 0x00000, 0x200000, CRC(8da69042) SHA1(fd3d08295342635b2136e48d543c9350d287bb22) ) \ + ROM_REGION( 0x200000, "simm6.1", 0 ) ROM_LOAD( "sfiii3-simm6.1", 0x00000, 0x200000, CRC(1c8c7ac4) SHA1(ac9f8353a4c356ef98aa7c226baba00b01f5a80f) ) \ + ROM_REGION( 0x200000, "simm6.2", 0 ) ROM_LOAD( "sfiii3-simm6.2", 0x00000, 0x200000, CRC(a671341d) SHA1(636f4c04962bc1e1ddb29d2e01244b00389b234f) ) \ + ROM_REGION( 0x200000, "simm6.3", 0 ) ROM_LOAD( "sfiii3-simm6.3", 0x00000, 0x200000, CRC(1a990249) SHA1(2acc639e2c0c53bf24096b8620eab090bc25d03b) ) \ + ROM_REGION( 0x200000, "simm6.4", 0 ) ROM_LOAD( "sfiii3-simm6.4", 0x00000, 0x200000, CRC(20cb39ac) SHA1(7d13a0fea1ef719dd2ff77dfb547d53c6023cc9e) ) \ + ROM_REGION( 0x200000, "simm6.5", 0 ) ROM_LOAD( "sfiii3-simm6.5", 0x00000, 0x200000, CRC(5f844b2f) SHA1(564e4934f89ed3b92a4c4874519f8f00f3b48696) ) \ + ROM_REGION( 0x200000, "simm6.6", 0 ) ROM_LOAD( "sfiii3-simm6.6", 0x00000, 0x200000, CRC(450e8d28) SHA1(885db658132aa27926df617ec2d2a1f38abdbb60) ) \ + ROM_REGION( 0x200000, "simm6.7", 0 ) ROM_LOAD( "sfiii3-simm6.7", 0x00000, 0x200000, CRC(cc5f4187) SHA1(248ddace21ed4736a56e92f77cc6ad219d7fef0b) ) \ #define SFIII3_990512_CDROM \ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-33s-1", 0, SHA1(2f4a9006a31903114f9f9dc09465ae253e565c51) ) \ -#define JOJO_990108_FLASH \ - ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "jojo-simm1.0", 0x00000, 0x200000, CRC(cfbc38d6) SHA1(c33e3a51fe8ab54e0912a1d6e662fe1ade73cee7) ) \ - ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "jojo-simm1.1", 0x00000, 0x200000, CRC(42578d94) SHA1(fa46f92ac1a6716430adec9ab27214a11fa61749) ) \ - ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "jojo-simm1.2", 0x00000, 0x200000, CRC(1b40c566) SHA1(9833799e9b4fecf7f9ce14bca64936646b3fdbde) ) \ - ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "jojo-simm1.3", 0x00000, 0x200000, CRC(bba709b4) SHA1(0dd71e575f2193505f2ab960568ac1eccf40d53f) ) \ - ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "jojo-simm2.0", 0x00000, 0x200000, CRC(417e5dc1) SHA1(54ee9596c1c51811f3bdef7dbe77b44b34f230ca) ) \ - ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "jojo-simm2.1", 0x00000, 0x200000, CRC(d3b3267d) SHA1(eb2cff347880f1489fb5b1b8bd16df8f50c7f494) ) \ - ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "jojo-simm2.2", 0x00000, 0x200000, CRC(c66d96b1) SHA1(909d5aac165748b549b6056a6091c41df012f5df) ) \ - ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "jojo-simm2.3", 0x00000, 0x200000, CRC(aa34cc85) SHA1(7677cc6fa913755fc699691b350698bbe8904118) ) \ - ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "jojo-simm3.0", 0x00000, 0x200000, CRC(de7fc9c1) SHA1(662b85a990b04c855773506c936317e62fab4a05) ) \ - ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "jojo-simm3.1", 0x00000, 0x200000, CRC(43d053d3) SHA1(54ff0e9c164e0d1649522c330ccc7e5d79e0bc85) ) \ - ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "jojo-simm3.2", 0x00000, 0x200000, CRC(2ffd7fa5) SHA1(9018c8e2b286a333ba606208e90caa764951ea3f) ) \ - ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "jojo-simm3.3", 0x00000, 0x200000, CRC(4da4985b) SHA1(2552b1730a21ce17d58b69a79ad212a6a5829439) ) \ - ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "jojo-simm3.4", 0x00000, 0x200000, CRC(fde98d72) SHA1(654563e12d033e8656dc74a268a08b15b171470d) ) \ - ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "jojo-simm3.5", 0x00000, 0x200000, CRC(edb2a266) SHA1(19ebada8422c7f4bf70d0c9ad42b84268967b316) ) \ - ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "jojo-simm3.6", 0x00000, 0x200000, CRC(be7cf319) SHA1(7893f5907992e6b903b2683980bba6d3d003bb06) ) \ - ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "jojo-simm3.7", 0x00000, 0x200000, CRC(56fe1a9f) SHA1(01741fe1256f4e682f687e94040f4e8bbb8bedb2) ) \ - ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "jojo-simm4.0", 0x00000, 0x200000, CRC(c4e7bf68) SHA1(a4d1ddea58a3d42db82a63a5e974cbf38d9b792a) ) \ - ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "jojo-simm4.1", 0x00000, 0x200000, CRC(b62b2719) SHA1(cb577b89e9e14fda67715716fefd47a782d518ab) ) \ - ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "jojo-simm4.2", 0x00000, 0x200000, CRC(18d15809) SHA1(2b406cd1aaa4799a436213dcaa65473eacb4c6d7) ) \ - ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "jojo-simm4.3", 0x00000, 0x200000, CRC(9af0ad79) SHA1(075ee048e17b50188876f25d7a6571d6ace84d7d) ) \ - ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "jojo-simm4.4", 0x00000, 0x200000, CRC(4124c1f0) SHA1(e4946a8029adc5d0bacead8d766521b4ccd1722b) ) \ - ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "jojo-simm4.5", 0x00000, 0x200000, CRC(5e001fd1) SHA1(6457a39f336381b46e587aa2f5f719810ee5bcf9) ) \ - ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "jojo-simm4.6", 0x00000, 0x200000, CRC(9affa23b) SHA1(e3d77e777c47277d841a9dadc1dd6e3157706a2e) ) \ - ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "jojo-simm4.7", 0x00000, 0x200000, CRC(2511572a) SHA1(725adcf71bcee5c8bb839d2d1c5e3456b8c6886b) ) \ - ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "jojo-simm5.0", 0x00000, 0x200000, CRC(797615fc) SHA1(29874be9f1da5515c90f5d601aa5924c263f8feb) ) \ - ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "jojo-simm5.1", 0x00000, 0x200000, CRC(734fd162) SHA1(16cdfac74d18a6c2216afb1ce6afbd7f15297c32) ) \ - -#define JOJO_990108_CDROM \ - DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-jjk-2", 0, SHA1(0f5c09171409213e191a607ee89ca3a91fe9c96a) ) \ - -#define JOJO_981202_FLASH \ - ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "jojoa-simm1.0",0x00000, 0x200000, CRC(e06ba886) SHA1(4defd5e8e1e6d0c439fed8a6454e89a59e24ea4c) ) \ - ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "jojoa-simm1.1",0x00000, 0x200000, CRC(6dd177c8) SHA1(c39db980f6fcca9c221e9be6f777eaf38f1b136b) ) \ - ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "jojoa-simm1.2",0x00000, 0x200000, CRC(d35a15e0) SHA1(576b92a94505764a10b9bcf82c02335e7ef62014) ) \ - ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "jojoa-simm1.3",0x00000, 0x200000, CRC(66d865ac) SHA1(5248c3f124af62b4a672d954ef15f86629feeacb) ) \ - ROM_REGION( 0x200000, "simm2.0", 0 ) ROM_LOAD( "jojoa-simm2.0",0x00000, 0x200000, CRC(417e5dc1) SHA1(54ee9596c1c51811f3bdef7dbe77b44b34f230ca) ) \ - ROM_REGION( 0x200000, "simm2.1", 0 ) ROM_LOAD( "jojoa-simm2.1",0x00000, 0x200000, CRC(c891c887) SHA1(42e84f774ee655e9a39b016a3cfe94262ed2e9f1) ) \ - ROM_REGION( 0x200000, "simm2.2", 0 ) ROM_LOAD( "jojoa-simm2.2",0x00000, 0x200000, CRC(1e101f30) SHA1(56518c1646bb9452334856bb8bcc58892f9f93b9) ) \ - ROM_REGION( 0x200000, "simm2.3", 0 ) ROM_LOAD( "jojoa-simm2.3",0x00000, 0x200000, CRC(1fd1d3e4) SHA1(bed2b77d58f1fdf7ba5ca7126d3db1dd0f8c80b4) ) \ - ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "jojo-simm3.0", 0x00000, 0x200000, CRC(de7fc9c1) SHA1(662b85a990b04c855773506c936317e62fab4a05) ) \ - ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "jojo-simm3.1", 0x00000, 0x200000, CRC(43d053d3) SHA1(54ff0e9c164e0d1649522c330ccc7e5d79e0bc85) ) \ - ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "jojo-simm3.2", 0x00000, 0x200000, CRC(2ffd7fa5) SHA1(9018c8e2b286a333ba606208e90caa764951ea3f) ) \ - ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "jojo-simm3.3", 0x00000, 0x200000, CRC(4da4985b) SHA1(2552b1730a21ce17d58b69a79ad212a6a5829439) ) \ - ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "jojo-simm3.4", 0x00000, 0x200000, CRC(fde98d72) SHA1(654563e12d033e8656dc74a268a08b15b171470d) ) \ - ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "jojo-simm3.5", 0x00000, 0x200000, CRC(edb2a266) SHA1(19ebada8422c7f4bf70d0c9ad42b84268967b316) ) \ - ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "jojo-simm3.6", 0x00000, 0x200000, CRC(be7cf319) SHA1(7893f5907992e6b903b2683980bba6d3d003bb06) ) \ - ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "jojo-simm3.7", 0x00000, 0x200000, CRC(56fe1a9f) SHA1(01741fe1256f4e682f687e94040f4e8bbb8bedb2) ) \ - ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "jojo-simm4.0", 0x00000, 0x200000, CRC(c4e7bf68) SHA1(a4d1ddea58a3d42db82a63a5e974cbf38d9b792a) ) \ - ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "jojo-simm4.1", 0x00000, 0x200000, CRC(b62b2719) SHA1(cb577b89e9e14fda67715716fefd47a782d518ab) ) \ - ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "jojo-simm4.2", 0x00000, 0x200000, CRC(18d15809) SHA1(2b406cd1aaa4799a436213dcaa65473eacb4c6d7) ) \ - ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "jojo-simm4.3", 0x00000, 0x200000, CRC(9af0ad79) SHA1(075ee048e17b50188876f25d7a6571d6ace84d7d) ) \ - ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "jojo-simm4.4", 0x00000, 0x200000, CRC(4124c1f0) SHA1(e4946a8029adc5d0bacead8d766521b4ccd1722b) ) \ - ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "jojo-simm4.5", 0x00000, 0x200000, CRC(5e001fd1) SHA1(6457a39f336381b46e587aa2f5f719810ee5bcf9) ) \ - ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "jojo-simm4.6", 0x00000, 0x200000, CRC(9affa23b) SHA1(e3d77e777c47277d841a9dadc1dd6e3157706a2e) ) \ - ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "jojo-simm4.7", 0x00000, 0x200000, CRC(2511572a) SHA1(725adcf71bcee5c8bb839d2d1c5e3456b8c6886b) ) \ - ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "jojo-simm5.0", 0x00000, 0x200000, CRC(797615fc) SHA1(29874be9f1da5515c90f5d601aa5924c263f8feb) ) \ - ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "jojo-simm5.1", 0x00000, 0x200000, CRC(734fd162) SHA1(16cdfac74d18a6c2216afb1ce6afbd7f15297c32) ) \ - -#define JOJO_981202_CDROM \ - DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-jjk000", 0, SHA1(09869f6d8c032b527e02d815749dc8fab1289e86) ) \ - #define JOJOBA_990913_FLASH \ ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "jojoba-simm1.0", 0x00000, 0x200000, CRC(76976231) SHA1(90adde7e5983ec6a4e02789d5cefe9e85c9c52d5) ) \ ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "jojoba-simm1.1", 0x00000, 0x200000, CRC(cedd78e7) SHA1(964988b90a2f14c1da2cfc48d943e16e54da3fd3) ) \ @@ -2917,64 +2957,42 @@ #define JOJOBA_990913_CDROM \ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-jjm-0", 0, SHA1(0678a0baeb853dcff1d230c14f0873cc9f143d7b) ) \ -#define REDEARTH_961121_FLASH \ - ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "redearth-simm1.0", 0x00000, 0x200000, CRC(cad468f8) SHA1(b3aa4f7d3fae84e8821417ccde9528d3eda2b7a6) ) \ - ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "redearth-simm1.1", 0x00000, 0x200000, CRC(e9721d89) SHA1(5c63d10bdbce52d50b6dde14d4a0f1369383d656) ) \ - ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "redearth-simm1.2", 0x00000, 0x200000, CRC(2889ec98) SHA1(a94310eb4777f908d87e9d90969db8504b4140ff) ) \ - ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "redearth-simm1.3", 0x00000, 0x200000, CRC(5a6cd148) SHA1(d65c6e8378a91828474a16a3bbcd13c4b3b15f13) ) \ - ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "redearth-simm3.0", 0x00000, 0x200000, CRC(83350cc5) SHA1(922b1abf80a4a89f35279b66311a7369d3965bd0) ) \ - ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "redearth-simm3.1", 0x00000, 0x200000, CRC(56734de6) SHA1(75699fa6efe5bec335e4b02e15b3c45726b68fa8) ) \ - ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "redearth-simm3.2", 0x00000, 0x200000, CRC(800ea0f1) SHA1(33871ab56dc1cd24441389d53e43fb8e43b149d9) ) \ - ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "redearth-simm3.3", 0x00000, 0x200000, CRC(97e9146c) SHA1(ab7744709615081440bee72f4080d6fd5b938668) ) \ - ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "redearth-simm3.4", 0x00000, 0x200000, CRC(0cb1d648) SHA1(7042a590c2b7ec55323062127e254da3cdc790a1) ) \ - ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "redearth-simm3.5", 0x00000, 0x200000, CRC(7a1099f0) SHA1(c6a92ec86eb24485f1db530e0e78f647e8432231) ) \ - ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "redearth-simm3.6", 0x00000, 0x200000, CRC(aeff8f54) SHA1(fd760e237c2e5fb2da45e32a1c12fd3defb4c3e4) ) \ - ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "redearth-simm3.7", 0x00000, 0x200000, CRC(f770acd0) SHA1(4b3ccb6f91568f95f04ede6c574144918d131201) ) \ - ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "redearth-simm4.0", 0x00000, 0x200000, CRC(301e56f2) SHA1(4847d971bff70a2aeed4599e1201c7ec9677da60) ) \ - ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "redearth-simm4.1", 0x00000, 0x200000, CRC(2048e103) SHA1(b21f95b05cd99749bd3f25cc71b2671c2026847b) ) \ - ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "redearth-simm4.2", 0x00000, 0x200000, CRC(c9433455) SHA1(63a269d76bac332c2e991d0f6a20c35e0e88680a) ) \ - ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "redearth-simm4.3", 0x00000, 0x200000, CRC(c02171a8) SHA1(2e9228729b27a6113d9f2e42af310a834979f714) ) \ - ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "redearth-simm4.4", 0x00000, 0x200000, CRC(2ddbf276) SHA1(b232baaa8edc8db18f8a3bdcc2d38fe984a94a34) ) \ - ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "redearth-simm4.5", 0x00000, 0x200000, CRC(fea820a6) SHA1(55ee8ef95751f5a509fb126513e1b2a70a3414e5) ) \ - ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "redearth-simm4.6", 0x00000, 0x200000, CRC(c7528df1) SHA1(aa312f80c2d7759d18d1aa8d416cf932b2850824) ) \ - ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "redearth-simm4.7", 0x00000, 0x200000, CRC(2449cf3b) SHA1(c60d8042136d74e547f668ad787cae529c42eed9) ) \ - ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "redearth-simm5.0", 0x00000, 0x200000, CRC(424451b9) SHA1(250fb92254c9e7ff5bc8dbeea5872f8a771dc9bd) ) \ - ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "redearth-simm5.1", 0x00000, 0x200000, CRC(9b8cb56b) SHA1(2ff1081dc99bb7c2f1e036f4c112137c96b83d23) ) \ -#define REDEARTH_961121_CDROM \ - DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-wzd-5", 0, SHA1(e5676752b08283dc4a98c3d7b759e8aa6dcd0679) ) \ +/* CD sets - use CD BIOS roms */ +// we load the default flashed ROMs anyway +// if you want the flash process then comment out the _FLASH lines, and remove your NV file -#define REDEARTH_961023_FLASH \ - ROM_REGION( 0x200000, "simm1.0", 0 ) ROM_LOAD( "redeartha-simm1.0", 0x00000, 0x200000, CRC(65bac346) SHA1(6f4ba0c2cae91a37fc97bea5fc8a50aaf6ca6513) ) \ - ROM_REGION( 0x200000, "simm1.1", 0 ) ROM_LOAD( "redeartha-simm1.1", 0x00000, 0x200000, CRC(a8ec4aae) SHA1(0012cb6ba630ddd74958f7759de34706bf919338) ) \ - ROM_REGION( 0x200000, "simm1.2", 0 ) ROM_LOAD( "redeartha-simm1.2", 0x00000, 0x200000, CRC(2caf8995) SHA1(ca012b6dec0481b043edf9c7e931bd952ec74ebb) ) \ - ROM_REGION( 0x200000, "simm1.3", 0 ) ROM_LOAD( "redeartha-simm1.3", 0x00000, 0x200000, CRC(13ebc21d) SHA1(465bdea0633526a8bf07b35495a5311c8bf213d5) ) \ - ROM_REGION( 0x200000, "simm3.0", 0 ) ROM_LOAD( "redearth-simm3.0", 0x00000, 0x200000, CRC(83350cc5) SHA1(922b1abf80a4a89f35279b66311a7369d3965bd0) ) \ - ROM_REGION( 0x200000, "simm3.1", 0 ) ROM_LOAD( "redearth-simm3.1", 0x00000, 0x200000, CRC(56734de6) SHA1(75699fa6efe5bec335e4b02e15b3c45726b68fa8) ) \ - ROM_REGION( 0x200000, "simm3.2", 0 ) ROM_LOAD( "redearth-simm3.2", 0x00000, 0x200000, CRC(800ea0f1) SHA1(33871ab56dc1cd24441389d53e43fb8e43b149d9) ) \ - ROM_REGION( 0x200000, "simm3.3", 0 ) ROM_LOAD( "redearth-simm3.3", 0x00000, 0x200000, CRC(97e9146c) SHA1(ab7744709615081440bee72f4080d6fd5b938668) ) \ - ROM_REGION( 0x200000, "simm3.4", 0 ) ROM_LOAD( "redearth-simm3.4", 0x00000, 0x200000, CRC(0cb1d648) SHA1(7042a590c2b7ec55323062127e254da3cdc790a1) ) \ - ROM_REGION( 0x200000, "simm3.5", 0 ) ROM_LOAD( "redearth-simm3.5", 0x00000, 0x200000, CRC(7a1099f0) SHA1(c6a92ec86eb24485f1db530e0e78f647e8432231) ) \ - ROM_REGION( 0x200000, "simm3.6", 0 ) ROM_LOAD( "redearth-simm3.6", 0x00000, 0x200000, CRC(aeff8f54) SHA1(fd760e237c2e5fb2da45e32a1c12fd3defb4c3e4) ) \ - ROM_REGION( 0x200000, "simm3.7", 0 ) ROM_LOAD( "redearth-simm3.7", 0x00000, 0x200000, CRC(f770acd0) SHA1(4b3ccb6f91568f95f04ede6c574144918d131201) ) \ - ROM_REGION( 0x200000, "simm4.0", 0 ) ROM_LOAD( "redearth-simm4.0", 0x00000, 0x200000, CRC(301e56f2) SHA1(4847d971bff70a2aeed4599e1201c7ec9677da60) ) \ - ROM_REGION( 0x200000, "simm4.1", 0 ) ROM_LOAD( "redearth-simm4.1", 0x00000, 0x200000, CRC(2048e103) SHA1(b21f95b05cd99749bd3f25cc71b2671c2026847b) ) \ - ROM_REGION( 0x200000, "simm4.2", 0 ) ROM_LOAD( "redearth-simm4.2", 0x00000, 0x200000, CRC(c9433455) SHA1(63a269d76bac332c2e991d0f6a20c35e0e88680a) ) \ - ROM_REGION( 0x200000, "simm4.3", 0 ) ROM_LOAD( "redearth-simm4.3", 0x00000, 0x200000, CRC(c02171a8) SHA1(2e9228729b27a6113d9f2e42af310a834979f714) ) \ - ROM_REGION( 0x200000, "simm4.4", 0 ) ROM_LOAD( "redearth-simm4.4", 0x00000, 0x200000, CRC(2ddbf276) SHA1(b232baaa8edc8db18f8a3bdcc2d38fe984a94a34) ) \ - ROM_REGION( 0x200000, "simm4.5", 0 ) ROM_LOAD( "redearth-simm4.5", 0x00000, 0x200000, CRC(fea820a6) SHA1(55ee8ef95751f5a509fb126513e1b2a70a3414e5) ) \ - ROM_REGION( 0x200000, "simm4.6", 0 ) ROM_LOAD( "redearth-simm4.6", 0x00000, 0x200000, CRC(c7528df1) SHA1(aa312f80c2d7759d18d1aa8d416cf932b2850824) ) \ - ROM_REGION( 0x200000, "simm4.7", 0 ) ROM_LOAD( "redearth-simm4.7", 0x00000, 0x200000, CRC(2449cf3b) SHA1(c60d8042136d74e547f668ad787cae529c42eed9) ) \ - ROM_REGION( 0x200000, "simm5.0", 0 ) ROM_LOAD( "redearth-simm5.0", 0x00000, 0x200000, CRC(424451b9) SHA1(250fb92254c9e7ff5bc8dbeea5872f8a771dc9bd) ) \ - ROM_REGION( 0x200000, "simm5.1", 0 ) ROM_LOAD( "redearth-simm5.1", 0x00000, 0x200000, CRC(9b8cb56b) SHA1(2ff1081dc99bb7c2f1e036f4c112137c96b83d23) ) \ +ROM_START( redearth ) + ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ + ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) ) -#define REDEARTH_961023_CDROM \ - DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "cap-wzd-3", 0, SHA1(a6ff67093db6bc80ee5fc46e4300e0177b213a52) ) \ + REDEARTH_961121_FLASH + REDEARTH_961121_CDROM +ROM_END +ROM_START( redeartha ) + ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ + ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) ) -/* CD sets - use CD BIOS roms */ -// we load the default flashed ROMs anyway -// if you want the flash process then comment out the _FLASH lines, and remove your NV file + REDEARTH_961023_FLASH + REDEARTH_961023_CDROM +ROM_END + +ROM_START( warzard ) + ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ + ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) ) + + REDEARTH_961121_FLASH + REDEARTH_961121_CDROM +ROM_END + +ROM_START( warzarda ) + ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ + ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) ) + + REDEARTH_961023_FLASH + REDEARTH_961023_CDROM +ROM_END ROM_START( sfiii ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ @@ -3016,84 +3034,68 @@ SFIII2_970930_CDROM ROM_END -ROM_START( sfiii3 ) - ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) ) - - SFIII3_990608_FLASH - SFIII3_990608_CDROM -ROM_END - -ROM_START( sfiii3a ) - ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) ) - - SFIII3_990512_FLASH - SFIII3_990512_CDROM -ROM_END - -ROM_START( redearth ) +ROM_START( jojo ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) ) + ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) ) - REDEARTH_961121_FLASH - REDEARTH_961121_CDROM + JOJO_990108_FLASH + JOJO_990108_CDROM ROM_END -ROM_START( warzard ) +ROM_START( jojoa ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) ) + ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) ) - REDEARTH_961121_FLASH - REDEARTH_961121_CDROM + JOJO_981202_FLASH + JOJO_981202_CDROM ROM_END -ROM_START( redeartha ) +ROM_START( jojoj ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "redearth_euro.29f400.u2", 0x000000, 0x080000, CRC(02e0f336) SHA1(acc37e830dfeb9674f5a0fb24f4cc23217ae4ff5) ) + ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) ) - REDEARTH_961023_FLASH - REDEARTH_961023_CDROM + JOJO_990108_FLASH + JOJO_990108_CDROM ROM_END -ROM_START( warzarda ) +ROM_START( jojoaj ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "warzard_japan.29f400.u2", 0x000000, 0x080000, CRC(f8e2f0c6) SHA1(93d6a986f44c211fff014e55681eca4d2a2774d6) ) + ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) ) - REDEARTH_961023_FLASH - REDEARTH_961023_CDROM + JOJO_981202_FLASH + JOJO_981202_CDROM ROM_END -ROM_START( jojo ) +ROM_START( sfiii3 ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) ) + ROM_LOAD( "sfiii3_euro.29f400.u2", 0x000000, 0x080000, CRC(30bbf293) SHA1(f094c2eeaf4f6709060197aca371a4532346bf78) ) - JOJO_990108_FLASH - JOJO_990108_CDROM + SFIII3_990608_FLASH + SFIII3_990608_CDROM ROM_END -ROM_START( jojoj ) +ROM_START( sfiii3a ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) ) + ROM_LOAD( "sfiii3_euro.29f400.u2", 0x000000, 0x080000, CRC(30bbf293) SHA1(f094c2eeaf4f6709060197aca371a4532346bf78) ) - JOJO_990108_FLASH - JOJO_990108_CDROM + SFIII3_990512_FLASH + SFIII3_990512_CDROM ROM_END -ROM_START( jojoa ) +ROM_START( sfiii3u ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_usa.29f400.u2", 0x000000, 0x080000, CRC(8d40f7be) SHA1(2a4bd83db2f959c33b071e517941aa55a0f919c0) ) + ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) ) - JOJO_981202_FLASH - JOJO_981202_CDROM + SFIII3_990608_FLASH + SFIII3_990608_CDROM ROM_END -ROM_START( jojoaj ) +ROM_START( sfiii3au ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_japan.29f400.u2", 0x000000, 0x080000, CRC(02778f60) SHA1(a167f9ebe030592a0cdb0c6a3c75835c6a43be4c) ) + ROM_LOAD( "sfiii3_usa.29f400.u2", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) ) - JOJO_981202_FLASH - JOJO_981202_CDROM + SFIII3_990512_FLASH + SFIII3_990512_CDROM ROM_END ROM_START( jojoba ) @@ -3121,32 +3123,32 @@ SFIII2_970930_FLASH ROM_END -ROM_START( sfiii3n ) +ROM_START( jojon ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "sfiii3_japan_nocd.29f400.u2", 0x000000, 0x080000, CRC(1edc6366) SHA1(60b4b9adeb030a33059d74fdf03873029e465b52) ) + ROM_LOAD( "jojo_asia_nocd.29f400.u2", 0x000000, 0x080000, CRC(05b4f953) SHA1(c746c7bb5359acc9adced817cb4870b1912eaefd) ) - SFIII3_990608_FLASH + JOJO_990108_FLASH ROM_END -ROM_START( sfiii3an ) +ROM_START( jojoan ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "sfiii3_japan_nocd.29f400.u2", 0x000000, 0x080000, CRC(1edc6366) SHA1(60b4b9adeb030a33059d74fdf03873029e465b52) ) + ROM_LOAD( "jojo_asia_nocd.29f400.u2", 0x000000, 0x080000, CRC(05b4f953) SHA1(c746c7bb5359acc9adced817cb4870b1912eaefd) ) - SFIII3_990512_FLASH + JOJO_981202_FLASH ROM_END -ROM_START( jojon ) +ROM_START( sfiii3n ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_asia_nocd.29f400.u2", 0x000000, 0x080000, CRC(05b4f953) SHA1(c746c7bb5359acc9adced817cb4870b1912eaefd) ) + ROM_LOAD( "sfiii3_japan_nocd.29f400.u2", 0x000000, 0x080000, CRC(1edc6366) SHA1(60b4b9adeb030a33059d74fdf03873029e465b52) ) - JOJO_990108_FLASH + SFIII3_990608_FLASH ROM_END -ROM_START( jojoan ) +ROM_START( sfiii3an ) ROM_REGION32_BE( 0x080000, "user1", 0 ) /* bios region */ - ROM_LOAD( "jojo_asia_nocd.29f400.u2", 0x000000, 0x080000, CRC(05b4f953) SHA1(c746c7bb5359acc9adced817cb4870b1912eaefd) ) + ROM_LOAD( "sfiii3_japan_nocd.29f400.u2", 0x000000, 0x080000, CRC(1edc6366) SHA1(60b4b9adeb030a33059d74fdf03873029e465b52) ) - JOJO_981202_FLASH + SFIII3_990512_FLASH ROM_END ROM_START( jojoban ) @@ -3170,9 +3172,8 @@ /***************************************************************************************** - JoJo's Venture + Red Earth / Warzard - XXXXXX 0 JAPAN 1 ASIA 2 EURO 3 @@ -3180,116 +3181,112 @@ HISPANIC 5 BRAZIL 6 OCEANIA 7 - - DEVELOPMENT VERSION add 0x70 mask! + ASIA NCD 8 UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fec8/4]^=0x00000001; // region hack (clear jpn) - - rom[0x1fec8/4]^=0x00000004; // region - rom[0x1fec8/4]^=0x00000070; // DEV mode - rom[0x1fecc/4]^=0x01000000; // nocd + rom[0x1fed8/4]^=0x00000001; // clear region to 0 (invalid) + rom[0x1fed8/4]^=0x00000008; // region 8 - ASIA NO CD - doesn't actually skip the CD + // test on startup, only during game, must be another flag + // somewhere too, and we don't have any actual NCD dumps + // to compare (or it expects SCSI to report there being + // no cd drive?) *****************************************************************************************/ - /***************************************************************************************** - JoJo's Bizarre Adventure: Heritage for the Future + Street Fighter III: New Generation - XXXXXX 0 JAPAN 1 - ASIA 2 + ASIA NCD 2 EURO 3 USA 4 HISPANIC 5 BRAZIL 6 OCEANIA 7 + ASIA 8 - DEVELOPMENT VERSION add 0x70 mask! + // bios rom also lists korea, but game rom does not. UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fec8/4]^=0x00000001; // region (clear jpn) - rom[0x1fec8/4]^=0x00000002; // region - rom[0x1fec8/4]^=0x00000070; // DEV mode - rom[0x1fecc/4]^=0x01000000; // nocd + rom[0x1fec8/4]^=0x00000001; // region (clear region) + rom[0x1fec8/4]^=0x00000008; // region + rom[0x1fecc/4]^=0x01000000; // nocd - this ONLY skips the cd check in the bios test + // menu is region is ASIA NCD, otherwise it will report + // NG, Asia was probably the only NCD region for this *****************************************************************************************/ /***************************************************************************************** - Red Earth / Warzard + Street Fighter III 2nd Impact: Giant Attack JAPAN 1 - ASIA 2 + ASIA NCD 2 EURO 3 USA 4 HISPANIC 5 BRAZIL 6 OCEANIA 7 - ASIA NCD 8 + ASIA 8 UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fed8/4]^=0x00000001; // clear region to 0 (invalid) - rom[0x1fed8/4]^=0x00000008; // region 8 - ASIA NO CD - doesn't actually skip the CD - // test on startup, only during game, must be another flag - // somewhere too, and we don't have any actual NCD dumps - // to compare (or it expects SCSI to report there being - // no cd drive?) + rom[0x1fec8/4]^=0x00000001; // region (clear region) + rom[0x1fec8/4]^=0x00000008; // region + rom[0x1fecc/4]^=0x01000000; // nocd - this ONLY skips the cd check in the bios test + // menu is region is ASIA NCD, otherwise it will report + // NG, Asia was probably the only NCD region for this *****************************************************************************************/ /***************************************************************************************** - Street Fighter III: New Generation + JoJo's Venture / JoJo no Kimyouna Bouken + XXXXXX 0 JAPAN 1 - ASIA NCD 2 + ASIA 2 EURO 3 USA 4 HISPANIC 5 BRAZIL 6 OCEANIA 7 - ASIA 8 - // bios rom also lists korea, but game rom does not. + DEVELOPMENT VERSION add 0x70 mask! UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fec8/4]^=0x00000001; // region (clear region) - rom[0x1fec8/4]^=0x00000008; // region - rom[0x1fecc/4]^=0x01000000; // nocd - this ONLY skips the cd check in the bios test - // menu is region is ASIA NCD, otherwise it will report - // NG, Asia was probably the only NCD region for this + rom[0x1fec8/4]^=0x00000001; // region hack (clear jpn) + + rom[0x1fec8/4]^=0x00000004; // region + rom[0x1fec8/4]^=0x00000070; // DEV mode + rom[0x1fecc/4]^=0x01000000; // nocd *****************************************************************************************/ /***************************************************************************************** - Street Fighter III 2nd Impact + Street Fighter III 3rd Strike: Fight for the Future JAPAN 1 - ASIA NCD 2 + ASIA 2 EURO 3 USA 4 HISPANIC 5 BRAZIL 6 OCEANIA 7 - ASIA 8 UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fec8/4]^=0x00000001; // region (clear region) - rom[0x1fec8/4]^=0x00000008; // region - rom[0x1fecc/4]^=0x01000000; // nocd - this ONLY skips the cd check in the bios test - // menu is region is ASIA NCD, otherwise it will report - // NG, Asia was probably the only NCD region for this + rom[0x1fec8/4]^=0x00000004; // region (clear region) + rom[0x1fec8/4]^=0x00000001; // region + rom[0x1fecc/4]^=0x01000000; // nocd *****************************************************************************************/ - /***************************************************************************************** - Street Fighter III 3rd Strike + JoJo's Bizarre Adventure / JoJo no Kimyouna Bouken: Miraie no Isan + XXXXXX 0 JAPAN 1 ASIA 2 EURO 3 @@ -3298,9 +3295,12 @@ BRAZIL 6 OCEANIA 7 + DEVELOPMENT VERSION add 0x70 mask! + UINT32 *rom = (UINT32*)machine.region ( "user1" )->base(); - rom[0x1fec8/4]^=0x00000004; // region (clear region) - rom[0x1fec8/4]^=0x00000001; // region + rom[0x1fec8/4]^=0x00000001; // region (clear jpn) + rom[0x1fec8/4]^=0x00000002; // region + rom[0x1fec8/4]^=0x00000070; // DEV mode rom[0x1fecc/4]^=0x01000000; // nocd *****************************************************************************************/ @@ -3308,30 +3308,32 @@ /* todo: use BIOS for the bios roms, having clones only for CD / NO CD */ -GAME( 1996, redearth, 0, redearth, cps3_re, redearth, ROT0, "Capcom", "Red Earth (Euro 961121)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, redeartha,redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Red Earth (Euro 961023)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, warzard, redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Warzard (Japan 961121)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, warzarda, redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Warzard (Japan 961023)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiii, 0, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (USA 970204)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiiij, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Japan 970204)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiiih, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Hispanic 970204)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiii2, 0, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (USA 970930)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiii2j, sfiii2, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (Japan 970930)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojo, 0, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (USA 990108)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojoa, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (USA 981202)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojoj, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo no Kimyouna Bouken (Japan 990108)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojoaj, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo no Kimyouna Bouken (Japan 981202)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, sfiii3, 0, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (USA 990608)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, sfiii3a, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (USA 990512)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, jojoba, 0, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo no Kimyouna Bouken: Miraie no Isan (Japan 990913)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, redearth, 0, redearth, cps3_re, redearth, ROT0, "Capcom", "Red Earth (Euro 961121)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, redeartha, redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Red Earth (Euro 961023)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, warzard, redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Warzard (Japan 961121)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, warzarda, redearth, redearth, cps3_re, redearth, ROT0, "Capcom", "Warzard (Japan 961023)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiii, 0, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (USA 970204)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiiij, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Japan 970204)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiiih, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Hispanic 970204)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiii2, 0, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (USA 970930)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiii2j, sfiii2, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (Japan 970930)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojo, 0, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (USA 990108)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojoa, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (USA 981202)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojoj, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo no Kimyouna Bouken (Japan 990108)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojoaj, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo no Kimyouna Bouken (Japan 981202)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3, 0, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Euro 990608)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3a, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Euro 990512)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3u, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (USA 990608)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3au, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (USA 990512)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, jojoba, 0, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo no Kimyouna Bouken: Miraie no Isan (Japan 990913)", GAME_IMPERFECT_GRAPHICS ) /* NO CD sets */ -GAME( 1997, sfiiin, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Asia 970204, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, sfiii2n, sfiii2, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (Asia 970930, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojon, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (Asia 990108, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1998, jojoan, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (Asia 981202, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, sfiii3n, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Japan 990608, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, sfiii3an, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Japan 990512, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, jojoban, jojoba, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo no Kimyouna Bouken: Miraie no Isan (Japan 990913, NO CD)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, jojobane, jojoba, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo's Bizarre Adventure (Euro 990913, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiiin, sfiii, sfiii, cps3, sfiii, ROT0, "Capcom", "Street Fighter III: New Generation (Asia 970204, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, sfiii2n, sfiii2, sfiii2, cps3, sfiii2, ROT0, "Capcom", "Street Fighter III 2nd Impact: Giant Attack (Asia 970930, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojon, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (Asia 990108, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1998, jojoan, jojo, jojo, cps3_jojo, jojo, ROT0, "Capcom", "JoJo's Venture (Asia 981202, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3n, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Japan 990608, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, sfiii3an, sfiii3, sfiii3, cps3, sfiii3, ROT0, "Capcom", "Street Fighter III 3rd Strike: Fight for the Future (Japan 990512, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, jojoban, jojoba, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo no Kimyouna Bouken: Miraie no Isan (Japan 990913, NO CD)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1999, jojobane, jojoba, jojoba, cps3_jojo, jojoba, ROT0, "Capcom", "JoJo's Bizarre Adventure (Euro 990913, NO CD)", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/crbaloon.c mame-0.145/src/mame/drivers/crbaloon.c --- mame-0.144/src/mame/drivers/crbaloon.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/crbaloon.c 2012-02-06 21:30:37.000000000 +0000 @@ -158,11 +158,12 @@ static WRITE8_HANDLER( port_sound_w ) { + crbaloon_state *state = space->machine().driver_data(); device_t *discrete = space->machine().device("discrete"); device_t *sn = space->machine().device("snsnd"); /* D0 - interrupt enable - also goes to PC3259 as /HTCTRL */ - cpu_interrupt_enable(space->machine().device("maincpu"), (data & 0x01) ? TRUE : FALSE); + state->m_irq_mask = data & 0x01; crbaloon_set_clear_collision_address(space->machine(), (data & 0x01) ? TRUE : FALSE); /* D1 - SOUND STOP */ @@ -357,13 +358,22 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + crbaloon_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( crbaloon, crbaloon_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, CRBALOON_MASTER_XTAL / 3) MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(crballoon) @@ -378,10 +388,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(crbaloon) + MCFG_SCREEN_UPDATE_STATIC(crbaloon) /* audio hardware */ MCFG_FRAGMENT_ADD(crbaloon_audio) diff -Nru mame-0.144/src/mame/drivers/crimfght.c mame-0.145/src/mame/drivers/crimfght.c --- mame-0.144/src/mame/drivers/crimfght.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/crimfght.c 2012-02-06 21:30:35.000000000 +0000 @@ -294,10 +294,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) /* adjusted - compared with PCB speed */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(crimfght) + MCFG_SCREEN_UPDATE_STATIC(crimfght) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/crospang.c mame-0.145/src/mame/drivers/crospang.c --- mame-0.144/src/mame/drivers/crospang.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/crospang.c 2012-02-06 21:30:41.000000000 +0000 @@ -22,6 +22,10 @@ Bestri: Bestri includes Heuk San Baek Sa as one of it's three sub games. + Note: + Bestri tile banking / enable wrong (corrupt gfx in some modes?) + - check and merge with other Tumble Pop based implementations? + 2008-08 Added Service dipswitch and dip locations based on Service Mode. */ @@ -32,7 +36,7 @@ #include "sound/okim6295.h" #include "sound/3812intf.h" #include "includes/crospang.h" - +#include "video/decospr.h" static WRITE16_HANDLER ( crospang_soundlatch_w ) { @@ -330,8 +334,7 @@ state->m_audiocpu = machine.device("audiocpu"); state->save_item(NAME(state->m_bestri_tilebank)); - state->save_item(NAME(state->m_xsproff)); - state->save_item(NAME(state->m_ysproff)); + } static MACHINE_RESET( crospang ) @@ -339,17 +342,14 @@ crospang_state *state = machine.driver_data(); state->m_bestri_tilebank = 0; -// state->m_xsproff = 4; -// state->m_ysproff = 7; - state->m_xsproff = 5; - state->m_ysproff = 7; + } static MACHINE_CONFIG_START( crospang, crospang_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000, 14318180/2) + MCFG_CPU_ADD("maincpu", M68000, 14318180) MCFG_CPU_PROGRAM_MAP(crospang_map) MCFG_CPU_VBLANK_INT("screen", irq6_line_hold) @@ -364,16 +364,21 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(crospang) + MCFG_SCREEN_UPDATE_STATIC(crospang) MCFG_PALETTE_LENGTH(0x300) MCFG_GFXDECODE(crospang) MCFG_VIDEO_START(crospang) + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 0); + decospr_device::set_is_bootleg(*device, true); + decospr_device::set_offsets(*device, 5,7); + + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -385,43 +390,12 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END -static MACHINE_CONFIG_START( bestri, crospang_state ) +static MACHINE_CONFIG_DERIVED( bestri, crospang ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M68000, 14318180/2) + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bestri_map) - MCFG_CPU_VBLANK_INT("screen", irq6_line_hold) - - MCFG_CPU_ADD("audiocpu", Z80, 14318180/4) - MCFG_CPU_PROGRAM_MAP(crospang_sound_map) - MCFG_CPU_IO_MAP(crospang_sound_io_map) - - MCFG_MACHINE_START(crospang) - MCFG_MACHINE_RESET(crospang) - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(64*8, 64*8) - MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(crospang) - - MCFG_PALETTE_LENGTH(0x300) - MCFG_GFXDECODE(crospang) - - MCFG_VIDEO_START(crospang) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("ymsnd", YM3812, 14318180/4) - MCFG_SOUND_CONFIG(ym3812_config) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) - - MCFG_OKIM6295_ADD("oki", 1056000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/crshrace.c mame-0.145/src/mame/drivers/crshrace.c --- mame-0.144/src/mame/drivers/crshrace.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/crshrace.c 2012-02-06 21:30:40.000000000 +0000 @@ -486,11 +486,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(crshrace) - MCFG_SCREEN_EOF(crshrace) + MCFG_SCREEN_UPDATE_STATIC(crshrace) + MCFG_SCREEN_VBLANK_STATIC(crshrace) MCFG_GFXDECODE(crshrace) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/crystal.c mame-0.145/src/mame/drivers/crystal.c --- mame-0.144/src/mame/drivers/crystal.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/crystal.c 2012-02-06 21:30:42.000000000 +0000 @@ -633,10 +633,10 @@ } -static SCREEN_UPDATE( crystal ) +static SCREEN_UPDATE_IND16( crystal ) { - crystal_state *state = screen->machine().driver_data(); - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + crystal_state *state = screen.machine().driver_data(); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); int DoFlip; UINT32 B0 = 0x0; @@ -646,7 +646,7 @@ UINT16 *srcline; int y; UINT16 head, tail; - UINT32 width = screen->width(); + UINT32 width = screen.width(); if (GetVidReg(space, 0x8e) & 1) { @@ -689,36 +689,40 @@ srcline = (UINT16 *) Visible; for (y = 0; y < 240; y++) - memcpy(BITMAP_ADDR16(bitmap, y, 0), &srcline[y * 512], width * 2); + memcpy(&bitmap.pix16(y), &srcline[y * 512], width * 2); return 0; } -static SCREEN_EOF(crystal) +static SCREEN_VBLANK(crystal) { - crystal_state *state = machine.driver_data(); - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - UINT16 head, tail; - int DoFlip = 0; - - head = GetVidReg(space, 0x82); - tail = GetVidReg(space, 0x80); - while ((head & 0x7ff) != (tail & 0x7ff)) + // rising edge + if (vblank_on) { - UINT16 Packet0 = space->read_word(0x03800000 + head * 64); - if (Packet0 & 0x81) - DoFlip = 1; - head++; - head &= 0x7ff; + crystal_state *state = screen.machine().driver_data(); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + UINT16 head, tail; + int DoFlip = 0; + + head = GetVidReg(space, 0x82); + tail = GetVidReg(space, 0x80); + while ((head & 0x7ff) != (tail & 0x7ff)) + { + UINT16 Packet0 = space->read_word(0x03800000 + head * 64); + if (Packet0 & 0x81) + DoFlip = 1; + head++; + head &= 0x7ff; + if (DoFlip) + break; + } + SetVidReg(space, 0x82, head); if (DoFlip) - break; - } - SetVidReg(space, 0x82, head); - if (DoFlip) - { - if (state->m_FlipCount) - state->m_FlipCount--; + { + if (state->m_FlipCount) + state->m_FlipCount--; + } } } @@ -831,11 +835,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(crystal) - MCFG_SCREEN_EOF(crystal) + MCFG_SCREEN_UPDATE_STATIC(crystal) + MCFG_SCREEN_VBLANK_STATIC(crystal) MCFG_VIDEO_VRENDER0_ADD("vr0", vr0video_config) diff -Nru mame-0.144/src/mame/drivers/cshooter.c mame-0.145/src/mame/drivers/cshooter.c --- mame-0.144/src/mame/drivers/cshooter.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cshooter.c 2012-02-06 21:30:39.000000000 +0000 @@ -125,21 +125,21 @@ { cshooter_state *state = space->machine().driver_data(); state->m_txram[offset] = data; - tilemap_mark_tile_dirty(state->m_txtilemap,offset/2); + state->m_txtilemap->mark_tile_dirty(offset/2); } static VIDEO_START(cshooter) { cshooter_state *state = machine.driver_data(); state->m_txtilemap = tilemap_create(machine, get_cstx_tile_info,tilemap_scan_rows, 8,8,32, 32); - tilemap_set_transparent_pen(state->m_txtilemap, 3); + state->m_txtilemap->set_transparent_pen(3); } -static SCREEN_UPDATE(cshooter) +static SCREEN_UPDATE_IND16(cshooter) { - cshooter_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0/*get_black_pen(screen->screen->machine())*/); - tilemap_mark_all_tiles_dirty(state->m_txtilemap); + cshooter_state *state = screen.machine().driver_data(); + bitmap.fill(0/*get_black_pen(screen.screen.machine(, cliprect))*/); + state->m_txtilemap->mark_all_dirty(); //sprites { @@ -151,25 +151,25 @@ { int tile=0x30+((spriteram[i]>>2)&0x1f); - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, spriteram[i+1], 0, 0, spriteram[i+3],spriteram[i+2],3); - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, spriteram[i+1], 0, 0, spriteram[i+3]+8,spriteram[i+2],3); - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, spriteram[i+1], 0, 0, spriteram[i+3]+8,spriteram[i+2]+8,3); - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, spriteram[i+1], 0, 0, @@ -178,8 +178,8 @@ } } - tilemap_mark_all_tiles_dirty(state->m_txtilemap); - tilemap_draw(bitmap,cliprect,state->m_txtilemap,0,0); + state->m_txtilemap->mark_all_dirty(); + state->m_txtilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -437,10 +437,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16) - MCFG_SCREEN_UPDATE(cshooter) + MCFG_SCREEN_UPDATE_STATIC(cshooter) MCFG_GFXDECODE(cshooter) MCFG_PALETTE_LENGTH(0x1000) @@ -465,10 +464,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16) - MCFG_SCREEN_UPDATE(cshooter) + MCFG_SCREEN_UPDATE_STATIC(cshooter) MCFG_GFXDECODE(cshooter) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/csplayh5.c mame-0.145/src/mame/drivers/csplayh5.c --- mame-0.144/src/mame/drivers/csplayh5.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/csplayh5.c 2012-02-06 21:30:41.000000000 +0000 @@ -29,12 +29,17 @@ { public: csplayh5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_v9958(*this,"v9958") + { } - bitmap_t *m_vdp0_bitmap; UINT16 m_mux_data; UINT8 m_pio_dir[5]; UINT8 m_pio_latch[5]; + + required_device m_maincpu; + required_device m_v9958; }; @@ -49,31 +54,12 @@ #define MSX2_VISIBLE_XBORDER_PIXELS 8 * 2 #define MSX2_VISIBLE_YBORDER_PIXELS 14 * 2 -static void csplayh5_vdp0_interrupt(running_machine &machine, int i) +static void csplayh5_vdp0_interrupt(device_t *, v99x8_device &device, int i) { /* this is not used as the v9938 interrupt callbacks are broken interrupts seem to be fired quite randomly */ } -static VIDEO_START( csplayh5 ) -{ - csplayh5_state *state = machine.driver_data(); - state->m_vdp0_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - v9938_init (machine, 0, *machine.primary_screen, state->m_vdp0_bitmap, MODEL_V9958, 0x20000, csplayh5_vdp0_interrupt); - v9938_reset(0); -} - -static SCREEN_UPDATE( csplayh5 ) -{ - csplayh5_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - - copybitmap(bitmap, state->m_vdp0_bitmap, 0, 0, 0, 0, cliprect); - - return 0; -} - - static READ16_HANDLER( csplayh5_mux_r ) { csplayh5_state *state = space->machine().driver_data(); @@ -108,10 +94,7 @@ AM_RANGE(0x200200, 0x200201) AM_READWRITE(csplayh5_mux_r,csplayh5_mux_w) AM_RANGE(0x200400, 0x200401) AM_READ_PORT("SYSTEM") - AM_RANGE(0x200600, 0x200601) AM_READWRITE8(v9938_0_vram_r, v9938_0_vram_w,0xff) - AM_RANGE(0x200602, 0x200603) AM_READWRITE8(v9938_0_status_r, v9938_0_command_w,0xff) - AM_RANGE(0x200604, 0x200605) AM_WRITE8(v9938_0_palette_w,0xff) - AM_RANGE(0x200606, 0x200607) AM_WRITE8(v9938_0_register_w,0xff) + AM_RANGE(0x200600, 0x200607) AM_DEVREADWRITE8_MODERN("v9958", v9958_device, read, write, 0x00ff) AM_RANGE(0x800000, 0xbfffff) AM_ROM AM_REGION("blit_gfx",0) // GFX ROM routes here @@ -597,16 +580,20 @@ } } -static INTERRUPT_GEN( scanline_irq ) +static TIMER_DEVICE_CALLBACK( csplayh5_irq ) { - v9938_set_sprite_limit(0, 0); - v9938_set_resolution(0, RENDER_HIGH); - v9938_interrupt(device->machine(), 0); -} + csplayh5_state *state = timer.machine().driver_data(); + int scanline = param; -static INTERRUPT_GEN( csplayh5_irq ) -{ - device_set_input_line_and_vector(device, 1, HOLD_LINE,0x100/4); + if(scanline == 212*2) + device_set_input_line_and_vector(state->m_maincpu, 1, HOLD_LINE,0x100/4); + + if((scanline % 2) == 0) + { + state->m_v9958->set_sprite_limit(0); + state->m_v9958->set_resolution(RENDER_HIGH); + state->m_v9958->interrupt(); + } } static const z80_daisy_config daisy_chain_sound[] = @@ -621,8 +608,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu",M68000,16000000) /* TMP68301-16 */ MCFG_CPU_PROGRAM_MAP(csplayh5_map) - MCFG_CPU_VBLANK_INT("screen", csplayh5_irq ) - MCFG_CPU_PERIODIC_INT(scanline_irq,262*60) // unknown timing + MCFG_TIMER_ADD_SCANLINE("scantimer", csplayh5_irq, "screen", 0, 1) #if USE_H8 MCFG_CPU_ADD("subcpu", H83002, 16000000) /* unknown clock */ @@ -644,20 +630,19 @@ /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) + MCFG_V9958_ADD("v9958", "screen", 0x20000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(csplayh5_vdp0_interrupt) + MCFG_SCREEN_ADD("screen",RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) - MCFG_SCREEN_UPDATE(csplayh5) + MCFG_SCREEN_UPDATE_DEVICE("v9958", v9958_device, screen_update) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT( v9958 ) - MCFG_VIDEO_START(csplayh5) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/cubeqst.c mame-0.145/src/mame/drivers/cubeqst.c --- mame-0.144/src/mame/drivers/cubeqst.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cubeqst.c 2012-02-06 21:30:35.000000000 +0000 @@ -21,7 +21,7 @@ #include "cpu/m68000/m68000.h" #include "cpu/cubeqcpu/cubeqcpu.h" #include "sound/dac.h" -#include "machine/laserdsc.h" +#include "machine/ldpr8210.h" #include "machine/nvram.h" @@ -29,13 +29,14 @@ { public: cubeqst_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } UINT8 *m_depth_buffer; int m_video_field; UINT8 m_io_latch; UINT8 m_reset_latch; - device_t *m_laserdisc; + required_device m_laserdisc; rgb_t *m_colormap; }; @@ -58,8 +59,6 @@ * *************************************/ -static const rectangle overlay_clip = { 0, 320-1, 0, 256-8 }; - static VIDEO_START( cubeqst ) { cubeqst_state *state = machine.driver_data(); @@ -95,9 +94,9 @@ } /* TODO: This is a simplified version of what actually happens */ -static SCREEN_UPDATE( cubeqst ) +static SCREEN_UPDATE_RGB32( cubeqst ) { - cubeqst_state *state = screen->machine().driver_data(); + cubeqst_state *state = screen.machine().driver_data(); int y; /* @@ -106,15 +105,15 @@ */ /* Bit 3 selects LD/#GRAPHICS */ - bitmap_fill(bitmap, cliprect, state->m_colormap[255]); + bitmap.fill(state->m_colormap[255], cliprect); /* TODO: Add 1 for linebuffering? */ - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { int i; - int num_entries = cubeqcpu_get_ptr_ram_val(screen->machine().device("line_cpu"), y); - UINT32 *stk_ram = cubeqcpu_get_stack_ram(screen->machine().device("line_cpu")); - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + int num_entries = cubeqcpu_get_ptr_ram_val(screen.machine().device("line_cpu"), y); + UINT32 *stk_ram = cubeqcpu_get_stack_ram(screen.machine().device("line_cpu")); + UINT32 *dest = &bitmap.pix32(y); UINT32 pen; /* Zap the depth buffer */ @@ -155,7 +154,7 @@ } /* Draw the span, testing for depth */ - pen = state->m_colormap[screen->machine().generic.paletteram.u16[color]]; + pen = state->m_colormap[screen.machine().generic.paletteram.u16[color]]; for (x = h1; x <= h2; ++x) { if (!(state->m_depth_buffer[x] < depth)) @@ -198,7 +197,7 @@ static WRITE16_HANDLER( laserdisc_w ) { cubeqst_state *state = space->machine().driver_data(); - laserdisc_data_w(state->m_laserdisc, data & 0xff); + state->m_laserdisc->data_w(data & 0xff); } /* @@ -208,8 +207,8 @@ static READ16_HANDLER( laserdisc_r ) { cubeqst_state *state = space->machine().driver_data(); - int ldp_command_flag = (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_READY) == ASSERT_LINE) ? 0 : 1; - int ldp_seek_status = (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_STATUS) == ASSERT_LINE) ? 1 : 0; + int ldp_command_flag = (state->m_laserdisc->ready_r() == ASSERT_LINE) ? 0 : 1; + int ldp_seek_status = (state->m_laserdisc->status_r() == ASSERT_LINE) ? 1 : 0; return (ldp_seek_status << 1) | ldp_command_flag; } @@ -219,7 +218,7 @@ static WRITE16_HANDLER( ldaud_w ) { cubeqst_state *state = space->machine().driver_data(); - simutrek_set_audio_squelch(state->m_laserdisc, data & 1 ? ASSERT_LINE : CLEAR_LINE); + state->m_laserdisc->set_external_audio_squelch(data & 1 ? ASSERT_LINE : CLEAR_LINE); } /* @@ -235,7 +234,7 @@ static WRITE16_HANDLER( control_w ) { cubeqst_state *state = space->machine().driver_data(); - laserdisc_video_enable(state->m_laserdisc, data & 1); + state->m_laserdisc->video_enable(data & 1); } @@ -437,8 +436,6 @@ static MACHINE_START( cubeqst ) { - cubeqst_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } static MACHINE_RESET( cubeqst ) @@ -528,20 +525,20 @@ MCFG_MACHINE_RESET(cubeqst) MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_RGB32) - MCFG_VIDEO_START(cubeqst) - - MCFG_PALETTE_INIT(cubeqst) - - MCFG_LASERDISC_ADD("laserdisc", SIMUTREK_SPECIAL, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(cubeqst, CUBEQST_HBLANK, CUBEQST_VCOUNT, BITMAP_FORMAT_RGB32) + MCFG_LASERDISC_SIMUTREK_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(CUBEQST_HBLANK, CUBEQST_VCOUNT, cubeqst) MCFG_LASERDISC_OVERLAY_CLIP(0, 320-1, 0, 256-8) MCFG_LASERDISC_OVERLAY_POSITION(0.002, -0.018) MCFG_LASERDISC_OVERLAY_SCALE(1.0, 1.030) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") + + MCFG_VIDEO_START(cubeqst) + MCFG_PALETTE_INIT(cubeqst) + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) diff -Nru mame-0.144/src/mame/drivers/cultures.c mame-0.145/src/mame/drivers/cultures.c --- mame-0.144/src/mame/drivers/cultures.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/cultures.c 2012-02-06 21:30:42.000000000 +0000 @@ -73,44 +73,44 @@ state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_rows, 8, 8, 512, 512); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info,tilemap_scan_rows, 8, 8, 512, 512); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg0_tilemap, 0); + state->m_bg1_tilemap->set_transparent_pen(0); + state->m_bg0_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg0_tilemap, 502, 10); - tilemap_set_scrolldx(state->m_bg1_tilemap, 502, 10); - tilemap_set_scrolldx(state->m_bg2_tilemap, 502, 10); - - tilemap_set_scrolldy(state->m_bg0_tilemap, 255, 0); - tilemap_set_scrolldy(state->m_bg1_tilemap, 255, 0); - tilemap_set_scrolldy(state->m_bg2_tilemap, 255, 0); + state->m_bg0_tilemap->set_scrolldx(502, 10); + state->m_bg1_tilemap->set_scrolldx(502, 10); + state->m_bg2_tilemap->set_scrolldx(502, 10); + + state->m_bg0_tilemap->set_scrolldy(255, 0); + state->m_bg1_tilemap->set_scrolldy(255, 0); + state->m_bg2_tilemap->set_scrolldy(255, 0); } -static SCREEN_UPDATE( cultures ) +static SCREEN_UPDATE_IND16( cultures ) { - cultures_state *state = screen->machine().driver_data(); + cultures_state *state = screen.machine().driver_data(); int attr; // tilemaps attributes attr = (state->m_bg0_regs_x[3] & 1 ? TILEMAP_FLIPX : 0) | (state->m_bg0_regs_y[3] & 1 ? TILEMAP_FLIPY : 0); - tilemap_set_flip(state->m_bg0_tilemap, attr); + state->m_bg0_tilemap->set_flip(attr); attr = (state->m_bg1_regs_x[3] & 1 ? TILEMAP_FLIPX : 0) | (state->m_bg1_regs_y[3] & 1 ? TILEMAP_FLIPY : 0); - tilemap_set_flip(state->m_bg1_tilemap, attr); + state->m_bg1_tilemap->set_flip(attr); attr = (state->m_bg2_regs_x[3] & 1 ? TILEMAP_FLIPX : 0) | (state->m_bg2_regs_y[3] & 1 ? TILEMAP_FLIPY : 0); - tilemap_set_flip(state->m_bg2_tilemap, attr); + state->m_bg2_tilemap->set_flip(attr); // tilemaps scrolls - tilemap_set_scrollx(state->m_bg0_tilemap, 0, (state->m_bg0_regs_x[2] << 8) + state->m_bg0_regs_x[0]); - tilemap_set_scrollx(state->m_bg1_tilemap, 0, (state->m_bg1_regs_x[2] << 8) + state->m_bg1_regs_x[0]); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, (state->m_bg2_regs_x[2] << 8) + state->m_bg2_regs_x[0]); - tilemap_set_scrolly(state->m_bg0_tilemap, 0, (state->m_bg0_regs_y[2] << 8) + state->m_bg0_regs_y[0]); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, (state->m_bg1_regs_y[2] << 8) + state->m_bg1_regs_y[0]); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, (state->m_bg2_regs_y[2] << 8) + state->m_bg2_regs_y[0]); - - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg0_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg0_tilemap->set_scrollx(0, (state->m_bg0_regs_x[2] << 8) + state->m_bg0_regs_x[0]); + state->m_bg1_tilemap->set_scrollx(0, (state->m_bg1_regs_x[2] << 8) + state->m_bg1_regs_x[0]); + state->m_bg2_tilemap->set_scrollx(0, (state->m_bg2_regs_x[2] << 8) + state->m_bg2_regs_x[0]); + state->m_bg0_tilemap->set_scrolly(0, (state->m_bg0_regs_y[2] << 8) + state->m_bg0_regs_y[0]); + state->m_bg1_tilemap->set_scrolly(0, (state->m_bg1_regs_y[2] << 8) + state->m_bg1_regs_y[0]); + state->m_bg2_tilemap->set_scrolly(0, (state->m_bg2_regs_y[2] << 8) + state->m_bg2_regs_y[0]); + + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -141,7 +141,7 @@ else { state->m_bg0_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg0_tilemap, offset >> 1); + state->m_bg0_tilemap->mark_tile_dirty(offset >> 1); } } @@ -169,13 +169,13 @@ if (state->m_bg1_bank != (data & 3)) { state->m_bg1_bank = data & 3; - tilemap_mark_all_tiles_dirty(state->m_bg1_tilemap); + state->m_bg1_tilemap->mark_all_dirty(); } if (state->m_bg2_bank != ((data & 0xc) >> 2)) { state->m_bg2_bank = (data & 0xc) >> 2; - tilemap_mark_all_tiles_dirty(state->m_bg2_tilemap); + state->m_bg2_tilemap->mark_all_dirty(); } coin_counter_w(space->machine(), 0, data & 0x10); } @@ -400,10 +400,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(cultures) + MCFG_SCREEN_UPDATE_STATIC(cultures) MCFG_GFXDECODE(culture) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/cupidon.c mame-0.145/src/mame/drivers/cupidon.c --- mame-0.144/src/mame/drivers/cupidon.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/cupidon.c 2012-02-06 21:30:35.000000000 +0000 @@ -5,6 +5,7 @@ */ +#define ADDRESS_MAP_MODERN #include "emu.h" #include "cpu/m68000/m68000.h" @@ -13,18 +14,25 @@ { public: cupidon_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( cupidon_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( cupidon_map, AS_PROGRAM, 32, cupidon_state ) AM_RANGE(0x0000000, 0x07fffff) AM_ROM ADDRESS_MAP_END static INPUT_PORTS_START( cupidon ) INPUT_PORTS_END + static MACHINE_CONFIG_START( cupidon, cupidon_state ) MCFG_CPU_ADD("maincpu", M68340, 16000000) // The access to 3FF00 at the start would suggest this is a 68340 MCFG_CPU_PROGRAM_MAP(cupidon_map) @@ -35,7 +43,6 @@ - ROM_START( tsarevna ) ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASEFF ) ROM_LOAD16_WORD_SWAP( "ts_1_29_u2_32m.bin", 0x000000, 0x400000, CRC(e7798a5d) SHA1(5ad876a693c93df79ea5e5672c0a5f3952b2cb36) ) @@ -86,16 +93,13 @@ } /* (c) date is from string in ROM, revision date is noted next to sets - Spellings are as found in ROM */ -GAME( 2004, tsarevna ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Tsarevna (v1.29)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 12 Oct 2005 -GAME( 2004, tsarevnaa ,tsarevna, cupidon, cupidon, cupidon, ROT0, "Kupidon","Tsarevna (v1.31)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 17 Jan 2007 - -GAME( 2004, gangrose ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Gangster's Roses (v4.70)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 01 Sep 2004 - -GAME( 2004, funnyfm ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.17)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 02 Mar 2005 -GAME( 2004, funnyfma ,funnyfm, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.26)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 08 Aug 2005 -GAME( 2004, funnyfmb ,funnyfm, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.30)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 16 May 2006 - -GAME( 2005, cashtrn ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Cash Train (v1.10)", GAME_NOT_WORKING|GAME_NO_SOUND ) // 09 Jan 2006 +GAME( 2004, tsarevna ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Tsarevna (v1.29)", GAME_IS_SKELETON ) // 12 Oct 2005 +GAME( 2004, tsarevnaa ,tsarevna, cupidon, cupidon, cupidon, ROT0, "Kupidon","Tsarevna (v1.31)", GAME_IS_SKELETON ) // 17 Jan 2007 +GAME( 2004, gangrose ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Gangster's Roses (v4.70)", GAME_IS_SKELETON ) // 01 Sep 2004 +GAME( 2004, funnyfm ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.17)", GAME_IS_SKELETON ) // 02 Mar 2005 +GAME( 2004, funnyfma ,funnyfm, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.26)", GAME_IS_SKELETON ) // 08 Aug 2005 +GAME( 2004, funnyfmb ,funnyfm, cupidon, cupidon, cupidon, ROT0, "Kupidon","Funny Farm (v1.30)", GAME_IS_SKELETON ) // 16 May 2006 +GAME( 2005, cashtrn ,0, cupidon, cupidon, cupidon, ROT0, "Kupidon","Cash Train (v1.10)", GAME_IS_SKELETON ) // 09 Jan 2006 diff -Nru mame-0.144/src/mame/drivers/cvs.c mame-0.145/src/mame/drivers/cvs.c --- mame-0.144/src/mame/drivers/cvs.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/cvs.c 2012-02-06 21:30:34.000000000 +0000 @@ -1083,12 +1083,11 @@ MCFG_PALETTE_INIT(cvs) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 30*8-1, 1*8, 32*8-1) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1000)) - MCFG_SCREEN_UPDATE(cvs) + MCFG_SCREEN_UPDATE_STATIC(cvs) MCFG_S2636_ADD("s2636_0", s2636_0_config) MCFG_S2636_ADD("s2636_1", s2636_1_config) diff -Nru mame-0.144/src/mame/drivers/cyberbal.c mame-0.145/src/mame/drivers/cyberbal.c --- mame-0.144/src/mame/drivers/cyberbal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/cyberbal.c 2012-02-06 21:30:33.000000000 +0000 @@ -460,18 +460,16 @@ MCFG_PALETTE_LENGTH(4096) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240) - MCFG_SCREEN_UPDATE(cyberbal) + MCFG_SCREEN_UPDATE_STATIC(cyberbal_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240) - MCFG_SCREEN_UPDATE(cyberbal) + MCFG_SCREEN_UPDATE_STATIC(cyberbal_right) MCFG_VIDEO_START(cyberbal) @@ -508,11 +506,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240) - MCFG_SCREEN_UPDATE(cyberbal) + MCFG_SCREEN_UPDATE_STATIC(cyberbal2p) MCFG_VIDEO_START(cyberbal2p) diff -Nru mame-0.144/src/mame/drivers/cybertnk.c mame-0.145/src/mame/drivers/cybertnk.c --- mame-0.144/src/mame/drivers/cybertnk.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/cybertnk.c 2012-02-06 21:30:33.000000000 +0000 @@ -203,44 +203,27 @@ { cybertnk_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8,128,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_tx_tilemap->set_transparent_pen(0); } -static void draw_pixel( bitmap_t* bitmap, const rectangle *cliprect, int y, int x, int pen) +static void draw_pixel( bitmap_ind16 &bitmap, const rectangle &cliprect, int y, int x, int pen) { - if (x>cliprect->max_x) return; - if (xmin_x) return; - if (y>cliprect->max_y) return; - if (ymin_y) return; - - *BITMAP_ADDR16(bitmap, y, x) = pen; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = pen; } -static SCREEN_UPDATE( cybertnk ) +static UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen_shift) { - cybertnk_state *state = screen->machine().driver_data(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); - int screen_shift = 0; + cybertnk_state *state = screen.machine().driver_data(); - if (screen==left_screen) - { - screen_shift = 0; + state->m_tx_tilemap->set_scrolldx(screen_shift, screen_shift); - } - else if (screen==right_screen) - { - screen_shift = -256; - } - tilemap_set_scrolldx(state->m_tx_tilemap, screen_shift, screen_shift); - - - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); { int i; - const gfx_element *gfx = screen->machine().gfx[3]; + const gfx_element *gfx = screen.machine().gfx[3]; for (i=0;i<0x1000/4;i+=4) @@ -258,7 +241,7 @@ { int count,x,y; - const gfx_element *gfx = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[2]; count = 0; @@ -279,7 +262,7 @@ { int count,x,y; - const gfx_element *gfx = screen->machine().gfx[1]; + const gfx_element *gfx = screen.machine().gfx[1]; count = 0; @@ -301,7 +284,7 @@ /* non-tile based spriteram (BARE-BONES, looks pretty complex) */ if(1) { - const UINT8 *blit_ram = screen->machine().region("spr_gfx")->base(); + const UINT8 *blit_ram = screen.machine().region("spr_gfx")->base(); int offs,x,y,z,xsize,ysize,yi,xi,col_bank,fx,zoom; UINT32 spr_offs,spr_offs_helper; int xf,yf,xz,yz; @@ -354,11 +337,11 @@ dot|= col_bank<<4; if(fx) { - draw_pixel(bitmap, cliprect, y+yz, x+xsize-(xz)+screen_shift, screen->machine().pens[dot]); + draw_pixel(bitmap, cliprect, y+yz, x+xsize-(xz)+screen_shift, screen.machine().pens[dot]); } else { - draw_pixel(bitmap, cliprect, y+yz, x+xz+screen_shift, screen->machine().pens[dot]); + draw_pixel(bitmap, cliprect, y+yz, x+xz+screen_shift, screen.machine().pens[dot]); } } xf+=zoom; @@ -386,11 +369,11 @@ dot|= col_bank<<4; if(fx) { - draw_pixel(bitmap, cliprect, y+yz, x+xsize-(xz)+screen_shift, screen->machine().pens[dot]); + draw_pixel(bitmap, cliprect, y+yz, x+xsize-(xz)+screen_shift, screen.machine().pens[dot]); } else { - draw_pixel(bitmap, cliprect, y+yz, x+xz+screen_shift, screen->machine().pens[dot]); + draw_pixel(bitmap, cliprect, y+yz, x+xz+screen_shift, screen.machine().pens[dot]); } } xf+=zoom; @@ -422,58 +405,58 @@ } } - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); //0x62 0x9a 1c2d0 //0x62 0x9a 1e1e4 //0x20 0x9c 2011c - if (screen==left_screen) + if (screen_shift == 0) { if(0) //sprite gfx debug viewer { int x,y,count; - const UINT8 *blit_ram = screen->machine().region("spr_gfx")->base(); + const UINT8 *blit_ram = screen.machine().region("spr_gfx")->base(); - if(screen->machine().input().code_pressed(KEYCODE_Z)) + if(screen.machine().input().code_pressed(KEYCODE_Z)) state->m_test_x++; - if(screen->machine().input().code_pressed(KEYCODE_X)) + if(screen.machine().input().code_pressed(KEYCODE_X)) state->m_test_x--; - if(screen->machine().input().code_pressed(KEYCODE_A)) + if(screen.machine().input().code_pressed(KEYCODE_A)) state->m_test_y++; - if(screen->machine().input().code_pressed(KEYCODE_S)) + if(screen.machine().input().code_pressed(KEYCODE_S)) state->m_test_y--; - if(screen->machine().input().code_pressed(KEYCODE_Q)) + if(screen.machine().input().code_pressed(KEYCODE_Q)) state->m_start_offs+=0x200; - if(screen->machine().input().code_pressed(KEYCODE_W)) + if(screen.machine().input().code_pressed(KEYCODE_W)) state->m_start_offs-=0x200; - if(screen->machine().input().code_pressed_once(KEYCODE_T)) + if(screen.machine().input().code_pressed_once(KEYCODE_T)) state->m_start_offs+=0x20000; - if(screen->machine().input().code_pressed_once(KEYCODE_Y)) + if(screen.machine().input().code_pressed_once(KEYCODE_Y)) state->m_start_offs-=0x20000; - if(screen->machine().input().code_pressed(KEYCODE_E)) + if(screen.machine().input().code_pressed(KEYCODE_E)) state->m_start_offs+=4; - if(screen->machine().input().code_pressed(KEYCODE_R)) + if(screen.machine().input().code_pressed(KEYCODE_R)) state->m_start_offs-=4; - if(screen->machine().input().code_pressed(KEYCODE_D)) + if(screen.machine().input().code_pressed(KEYCODE_D)) state->m_color_pen++; - if(screen->machine().input().code_pressed(KEYCODE_F)) + if(screen.machine().input().code_pressed(KEYCODE_F)) state->m_color_pen--; popmessage("%02x %02x %04x %02x",state->m_test_x,state->m_test_y,state->m_start_offs,state->m_color_pen); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = (state->m_start_offs); @@ -490,28 +473,28 @@ color|= ((blit_ram[count+3] & 0xff) << 0); dot = (color & 0xf0000000) >> 28; - *BITMAP_ADDR16(bitmap, y, x+0) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+0) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x0f000000) >> 24; - *BITMAP_ADDR16(bitmap, y, x+4) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+4) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x00f00000) >> 20; - *BITMAP_ADDR16(bitmap, y, x+1) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+1) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x000f0000) >> 16; - *BITMAP_ADDR16(bitmap, y, x+5) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+5) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x0000f000) >> 12; - *BITMAP_ADDR16(bitmap, y, x+2) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+2) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x00000f00) >> 8; - *BITMAP_ADDR16(bitmap, y, x+6) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+6) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x000000f0) >> 4; - *BITMAP_ADDR16(bitmap, y, x+3) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+3) = screen.machine().pens[dot+(state->m_color_pen<<4)]; dot = (color & 0x0000000f) >> 0; - *BITMAP_ADDR16(bitmap, y, x+7) = screen->machine().pens[dot+(state->m_color_pen<<4)]; + bitmap.pix16(y, x+7) = screen.machine().pens[dot+(state->m_color_pen<<4)]; count+=4; } @@ -523,12 +506,15 @@ return 0; } +static SCREEN_UPDATE_IND16( cybertnk_left ) { return update_screen(screen, bitmap, cliprect, 0); } +static SCREEN_UPDATE_IND16( cybertnk_right ) { return update_screen(screen, bitmap, cliprect, -256); } + static WRITE16_HANDLER( tx_vram_w ) { cybertnk_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_vram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static READ16_HANDLER( io_r ) @@ -853,7 +839,19 @@ 8*8 }; -static GFXLAYOUT_RAW( roadlayout, 4, 1024, 1, 1024*4, 1024*4 ) // could be wrong.. needs to be 512 wide, might not be 8bpp +// could be wrong.. needs to be 512 wide, might not be 8bpp +static const UINT32 xoffsets[] = { STEP1024(0,4) }; +static const gfx_layout roadlayout = +{ + 1024,1, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + EXTENDED_XOFFS, + { 0 }, + 1024*4, + xoffsets +}; static GFXDECODE_START( cybertnk ) GFXDECODE_ENTRY( "gfx1", 0, tile_8x8x4, 0x1400, 16 ) /*Pal offset???*/ @@ -862,25 +860,6 @@ GFXDECODE_ENTRY( "road_data", 0, roadlayout, 0, 0x400 ) GFXDECODE_END -#if 0 -static INTERRUPT_GEN( master_irq ) -{ - switch(cpu_getiloops(device)) - { - case 0: device_set_input_line(device,1,HOLD_LINE); break; - case 1: device_set_input_line(device,3,HOLD_LINE); break; - } -} - -static INTERRUPT_GEN( slave_irq ) -{ - switch(cpu_getiloops(device)) - { - case 0: device_set_input_line(device,3,HOLD_LINE); break; - case 1: device_set_input_line(device,1,HOLD_LINE); break; - } -} -#endif static const y8950_interface y8950_config = { 0 /* TODO */ @@ -904,20 +883,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(cybertnk) + MCFG_SCREEN_UPDATE_STATIC(cybertnk_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(cybertnk) + MCFG_SCREEN_UPDATE_STATIC(cybertnk_right) MCFG_GFXDECODE(cybertnk) MCFG_PALETTE_LENGTH(0x4000) diff -Nru mame-0.144/src/mame/drivers/cyclemb.c mame-0.145/src/mame/drivers/cyclemb.c --- mame-0.144/src/mame/drivers/cyclemb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/cyclemb.c 2012-02-06 21:30:41.000000000 +0000 @@ -121,12 +121,12 @@ } -static SCREEN_UPDATE( cyclemb ) +static SCREEN_UPDATE_IND16( cyclemb ) { - cyclemb_state *state = screen->machine().driver_data(); + cyclemb_state *state = screen.machine().driver_data(); int x,y,count; - const gfx_element *gfx = screen->machine().gfx[0]; - UINT8 flip_screen = flip_screen_get(screen->machine()); + const gfx_element *gfx = screen.machine().gfx[0]; + UINT8 flip_screen = flip_screen_get(screen.machine()); count = 0; @@ -208,7 +208,7 @@ fx = !fx; fy = !fy; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[region],spr_offs,col,fx,fy,x,y,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[region],spr_offs,col,fx,fy,x,y,0); } } @@ -541,10 +541,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(cyclemb) + MCFG_SCREEN_UPDATE_STATIC(cyclemb) MCFG_GFXDECODE(cyclemb) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/d9final.c mame-0.145/src/mame/drivers/d9final.c --- mame-0.144/src/mame/drivers/d9final.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/d9final.c 2012-02-06 21:30:34.000000000 +0000 @@ -57,10 +57,10 @@ state->m_sc0_tilemap = tilemap_create(machine, get_sc0_tile_info,tilemap_scan_rows,8,8,64,32); } -static SCREEN_UPDATE(d9final) +static SCREEN_UPDATE_IND16(d9final) { - d9final_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); + d9final_state *state = screen.machine().driver_data(); + state->m_sc0_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -68,21 +68,21 @@ { d9final_state *state = space->machine().driver_data(); state->m_lo_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( sc0_hivram ) { d9final_state *state = space->machine().driver_data(); state->m_hi_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( sc0_cram ) { d9final_state *state = space->machine().driver_data(); state->m_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( d9final_bank_w ) @@ -286,10 +286,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(d9final) + MCFG_SCREEN_UPDATE_STATIC(d9final) MCFG_GFXDECODE(d9final) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/dacholer.c mame-0.145/src/mame/drivers/dacholer.c --- mame-0.144/src/mame/drivers/dacholer.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dacholer.c 2012-02-06 21:30:38.000000000 +0000 @@ -16,6 +16,18 @@ - just a guess - upper nibble of byte from port 3 _probably_ contains sound command (sound cpu writes it to port c) + Itazura Tenshi (Japan Ver.) + (c)1984 Nichibutsu / Alice + + + + --- Team Japump!!! --- + Dumped by Chack'n + Driver written by Hau + + based on driver from drivers/dacholer.c by Pierpaolo Prazzoli + note: + Sound test does not work. ******************************************************************************/ #include "emu.h" @@ -29,7 +41,10 @@ { public: dacholer_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_audiocpu(*this,"audiocpu") + { } /* memory pointers */ UINT8 * m_bgvideoram; @@ -41,6 +56,8 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; int m_bg_bank; + UINT8 m_scroll_x; + UINT8 m_scroll_y; /* sound-related */ int m_msm_data; @@ -50,23 +67,108 @@ UINT8 m_snd_ack; /* devices */ - device_t *m_audiocpu; + required_device m_maincpu; + required_device m_audiocpu; }; +static TILE_GET_INFO( get_bg_tile_info ) +{ + dacholer_state *state = machine.driver_data(); + SET_TILE_INFO(1, state->m_bgvideoram[tile_index] + state->m_bg_bank * 0x100, 0, 0); +} +static TILE_GET_INFO( get_fg_tile_info ) +{ + dacholer_state *state = machine.driver_data(); + SET_TILE_INFO(0, state->m_fgvideoram[tile_index], 0, 0); +} + +static VIDEO_START( dacholer ) +{ + dacholer_state *state = machine.driver_data(); + state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + + state->m_fg_tilemap->set_transparent_pen(0); +} + +static WRITE8_HANDLER( bg_scroll_x_w ) +{ + dacholer_state *state = space->machine().driver_data(); + state->m_scroll_x = data; +} + +static WRITE8_HANDLER( bg_scroll_y_w ) +{ + dacholer_state *state = space->machine().driver_data(); + state->m_scroll_y = data; +} + +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) +{ + dacholer_state *state = machine.driver_data(); + int offs, code, attr, sx, sy, flipx, flipy; + + for (offs = 0; offs < state->m_spriteram_size; offs += 4) + { + code = state->m_spriteram[offs + 1]; + attr = state->m_spriteram[offs + 2]; + + flipx = attr & 0x10; + flipy = attr & 0x20; + + sx = (state->m_spriteram[offs + 3] - 128) + 256 * (attr & 0x01); + sy = 255 - state->m_spriteram[offs]; + + if (flip_screen_get(machine)) + { + sx = 240 - sx; + sy = 240 - sy; + flipx = !flipx; + flipy = !flipy; + } + + drawgfx_transpen(bitmap, cliprect, machine.gfx[2], + code, + 0, + flipx,flipy, + sx,sy,0); + } +} + +static SCREEN_UPDATE_IND16(dacholer) +{ + dacholer_state *state = screen.machine().driver_data(); + + if (flip_screen_get(screen.machine())) + { + state->m_bg_tilemap->set_scrollx(0, 256 - state->m_scroll_x); + state->m_bg_tilemap->set_scrolly(0, 256 - state->m_scroll_y); + } + else + { + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_y); + } + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + return 0; +} static WRITE8_HANDLER( background_w ) { dacholer_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( foreground_w ) { dacholer_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( bg_bank_w ) @@ -75,7 +177,7 @@ if ((data & 3) != state->m_bg_bank) { state->m_bg_bank = data & 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } flip_screen_set(space->machine(), data & 0xc); // probably one bit for flipx and one for flipy @@ -98,14 +200,27 @@ device_set_input_line(state->m_audiocpu, INPUT_LINE_NMI, PULSE_LINE); } +static WRITE8_HANDLER( main_irq_ack_w ) +{ + dacholer_state *state = space->machine().driver_data(); + device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); +} + + static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8800, 0x97ff) AM_RAM - AM_RANGE(0xc000, 0xc3ff) AM_RAM_WRITE(background_w) AM_BASE_MEMBER(dacholer_state, m_bgvideoram) + AM_RANGE(0xc000, 0xc3ff) AM_MIRROR(0x400) AM_RAM_WRITE(background_w) AM_BASE_MEMBER(dacholer_state, m_bgvideoram) AM_RANGE(0xd000, 0xd3ff) AM_RAM_WRITE(foreground_w) AM_BASE_MEMBER(dacholer_state, m_fgvideoram) AM_RANGE(0xe000, 0xe0ff) AM_RAM AM_BASE_SIZE_MEMBER(dacholer_state, m_spriteram, m_spriteram_size) ADDRESS_MAP_END +static ADDRESS_MAP_START( itaten_main_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x9fff) AM_ROM + AM_RANGE(0xa000, 0xb7ff) AM_RAM + AM_IMPORT_FROM( main_map ) +ADDRESS_MAP_END + static ADDRESS_MAP_START( main_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_READ_PORT("P1") @@ -113,11 +228,12 @@ AM_RANGE(0x02, 0x02) AM_READ_PORT("SYSTEM") AM_RANGE(0x03, 0x03) AM_READ_PORT("DSWA") AM_RANGE(0x04, 0x04) AM_READ_PORT("DSWB") + AM_RANGE(0x05, 0x05) AM_READNOP // watchdog in itaten AM_RANGE(0x20, 0x20) AM_WRITE(coins_w) AM_RANGE(0x21, 0x21) AM_WRITE(bg_bank_w) - AM_RANGE(0x22, 0x22) AM_WRITENOP - AM_RANGE(0x23, 0x23) AM_WRITENOP - AM_RANGE(0x24, 0x24) AM_WRITENOP + AM_RANGE(0x22, 0x22) AM_WRITE(bg_scroll_x_w) + AM_RANGE(0x23, 0x23) AM_WRITE(bg_scroll_y_w) + AM_RANGE(0x24, 0x24) AM_WRITE(main_irq_ack_w) AM_RANGE(0x27, 0x27) AM_WRITE(snd_w) ADDRESS_MAP_END @@ -127,6 +243,13 @@ AM_RANGE(0xd000, 0xe7ff) AM_RAM ADDRESS_MAP_END + +static ADDRESS_MAP_START( itaten_snd_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x2fff) AM_ROM + AM_RANGE(0xe000, 0xe7ff) AM_RAM +ADDRESS_MAP_END + + static WRITE8_HANDLER( adpcm_w ) { dacholer_state *state = space->machine().driver_data(); @@ -170,6 +293,14 @@ AM_RANGE(0x8e, 0x8f) AM_DEVWRITE("ay3", ay8910_data_address_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( itaten_snd_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_READWRITE(soundlatch_r, soundlatch_clear_w ) + AM_RANGE(0x86, 0x87) AM_DEVWRITE("ay1", ay8910_data_address_w) + AM_RANGE(0x8a, 0x8b) AM_DEVWRITE("ay2", ay8910_data_address_w) + AM_RANGE(0x8e, 0x8f) AM_DEVWRITE("ay3", ay8910_data_address_w) +ADDRESS_MAP_END + static INPUT_PORTS_START( dacholer ) PORT_START("P1") @@ -309,68 +440,73 @@ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) INPUT_PORTS_END +static INPUT_PORTS_START( itaten ) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) -static TILE_GET_INFO( get_bg_tile_info ) -{ - dacholer_state *state = machine.driver_data(); - SET_TILE_INFO(1, state->m_bgvideoram[tile_index] + state->m_bg_bank * 0x100, 0, 0); -} - -static TILE_GET_INFO( get_fg_tile_info ) -{ - dacholer_state *state = machine.driver_data(); - SET_TILE_INFO(0, state->m_fgvideoram[tile_index], 0, 0); -} - -static VIDEO_START( dacholer ) -{ - dacholer_state *state = machine.driver_data(); - state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); -} - -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - dacholer_state *state = machine.driver_data(); - int offs, code, attr, sx, sy, flipx, flipy; - - for (offs = 0; offs < state->m_spriteram_size; offs += 4) - { - code = state->m_spriteram[offs + 1]; - attr = state->m_spriteram[offs + 2]; - - flipx = attr & 0x10; - flipy = attr & 0x20; - - sx = (state->m_spriteram[offs + 3] - 128) + 256 * (attr & 0x01); - sy = 248 - state->m_spriteram[offs]; + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - if (flip_screen_get(machine)) - { - sx = 240 - sx; - sy = 240 - sy; - flipx = !flipx; - flipy = !flipy; - } + PORT_START("SYSTEM") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - drawgfx_transpen(bitmap, cliprect, machine.gfx[2], - code, - 0, - flipx,flipy, - sx,sy,0); - } -} + PORT_START("DSWA") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:3,4") + PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_6C ) ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN ) -static SCREEN_UPDATE(dacholer) -{ - dacholer_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - return 0; -} + PORT_START("DSWB") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:3,4") + PORT_DIPSETTING( 0x0c, "3" ) + PORT_DIPSETTING( 0x08, "4" ) + PORT_DIPSETTING( 0x04, "5" ) + PORT_DIPSETTING( 0x00, "6" ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x30, "30k then every 50k" ) + PORT_DIPSETTING( 0x20, "60k then every 50k" ) + PORT_DIPSETTING( 0x10, "30k then every 90k" ) + PORT_DIPSETTING( 0x00, "60k then every 90k" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) +INPUT_PORTS_END static const gfx_layout charlayout = { @@ -401,6 +537,12 @@ GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x10, 1 ) GFXDECODE_END +static GFXDECODE_START( itaten ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x00, 1 ) + GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0x00, 1 ) + GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x10, 1 ) +GFXDECODE_END + static INTERRUPT_GEN( sound_irq ) { @@ -438,8 +580,6 @@ { dacholer_state *state = machine.driver_data(); - state->m_audiocpu = machine.device("audiocpu"); - state->save_item(NAME(state->m_bg_bank)); state->save_item(NAME(state->m_msm_data)); state->save_item(NAME(state->m_msm_toggle)); @@ -501,15 +641,16 @@ } } +/* note: clocks are taken from itaten sound reference recording */ static MACHINE_CONFIG_START( dacholer, dacholer_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, 4000000) /* ? */ + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/4) /* ? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) - MCFG_CPU_ADD("audiocpu", Z80, 4000000) /* ? */ + MCFG_CPU_ADD("audiocpu", Z80, XTAL_19_968MHz/8) /* ? */ MCFG_CPU_PROGRAM_MAP(snd_map) MCFG_CPU_IO_MAP(snd_io_map) MCFG_CPU_VBLANK_INT("screen",sound_irq) @@ -521,10 +662,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1-16) - MCFG_SCREEN_UPDATE(dacholer) + MCFG_SCREEN_UPDATE_STATIC(dacholer) MCFG_PALETTE_LENGTH(32) MCFG_PALETTE_INIT(dacholer) @@ -535,19 +675,32 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ay1", AY8910, 1500000) + MCFG_SOUND_ADD("ay1", AY8910, XTAL_19_968MHz/16) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) - MCFG_SOUND_ADD("ay2", AY8910, 1500000) + MCFG_SOUND_ADD("ay2", AY8910, XTAL_19_968MHz/16) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) - MCFG_SOUND_ADD("ay3", AY8910, 1500000) + MCFG_SOUND_ADD("ay3", AY8910, XTAL_19_968MHz/16) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) - MCFG_SOUND_ADD("msm", MSM5205, 375000) + MCFG_SOUND_ADD("msm", MSM5205, XTAL_384kHz) MCFG_SOUND_CONFIG(msm_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( itaten, dacholer ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(itaten_main_map) + + MCFG_CPU_MODIFY("audiocpu") + MCFG_CPU_PROGRAM_MAP(itaten_snd_map) + MCFG_CPU_IO_MAP(itaten_snd_io_map) + MCFG_CPU_VBLANK_INT(NULL,NULL) + MCFG_GFXDECODE(itaten) + + MCFG_DEVICE_REMOVE("msm") MACHINE_CONFIG_END ROM_START( dacholer ) @@ -607,5 +760,86 @@ ROM_LOAD( "k.13d", 0x0000, 0x0020, CRC(82f87a36) SHA1(5dc2059eb5b6cd541b014347c36198b8838d98fa) ) ROM_END -GAME( 1983, dacholer, 0, dacholer, dacholer, 0, ROT0, "Nichibutsu", "Dacholer", GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) -GAME( 1983, kickboy, 0, dacholer, kickboy, 0, ROT0, "Nichibutsu", "Kick Boy", GAME_SUPPORTS_SAVE ) +/* +-------------------------------- +IT A-1 +CPU :LH0080 Z80,LH0080A Z80A +Sound:AY-3-8910 x3 +OSC :16.000MHz +-------------------------------- +1.5K [84c8a010] 2764 +2.5L [19946038] | +3.5M [4f9e26fd] / + +6.6G [dfcb1a3e] 2764 +7.6H [844e78d6] 2732 + +AF-1.3N [5638e485] 82S123 + + +-------------------------------- +ITA-EXP +-------------------------------- +4.1F [35f85aeb] 2764 +5.1E [6cf30924] / + + +-------------------------------- +IT A-2 +OSC :19.968 ? +-------------------------------- +8.10A [c32b0859] 2764 +9.11A [919cac5e] | +10.12A [d2b60e5d] | +11.13A [ed3279d5] / + +12.1D [f0f64636] 2764 +13.2D [d32559f5] | +14.3D [8c532c74] | +15.4D [d119b483] / + +16.12J [8af2bfb8] 2764 + +AF-2.1H [e1cac297] 82S123 +AF-3.13D [875429ba] / +-------------------------------- +*/ + + +ROM_START( itaten ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.5k", 0x0000, 0x2000, CRC(84c8a010) SHA1(52d78ac70b3d5e905a11efd76acd99810c56e467) ) + ROM_LOAD( "2.5l", 0x2000, 0x2000, CRC(19946038) SHA1(74f76096e676535ead4386755fce853caac7673b) ) + ROM_LOAD( "3.5m", 0x4000, 0x2000, CRC(4f9e26fd) SHA1(33062724c46108611c9db16fdbf2cb9feed7e213) ) + ROM_LOAD( "4.1f", 0x6000, 0x2000, CRC(35f85aeb) SHA1(ecd8f62e304d1277332a5a2b7ec6aace9f77d8ad) ) + ROM_LOAD( "5.1e", 0x8000, 0x2000, CRC(6cf30924) SHA1(5e82e9aa0811ec1b853d300368c5ceec44938363) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "6.6g", 0x0000, 0x2000, CRC(dfcb1a3e) SHA1(cee0906cfbddd0254a947737da1cfbe47c445c32) ) + ROM_LOAD( "7.6h", 0x2000, 0x1000, CRC(844e78d6) SHA1(11b48af650809f8504b56e9a8e53c9f043782c5f) ) + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "16.12j", 0x0000, 0x2000, CRC(8af2bfb8) SHA1(6744db0deb4fda7920fcfddf7f9c1ed6681d3622) ) + + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "11.13a", 0x0000, 0x2000, CRC(ed3279d5) SHA1(e4bcae8038739c588f896ff35fa95288979fa683) ) + ROM_LOAD( "10.12a", 0x2000, 0x2000, CRC(d2b60e5d) SHA1(c833ac6e5d4d0a244ace600f5f02c6f43d3bd34b) ) + ROM_LOAD( "9.11a", 0x4000, 0x2000, CRC(919cac5e) SHA1(9602ad7618b5e4d93fa22676aa855256d4690dd1) ) + ROM_LOAD( "8.10a", 0x6000, 0x2000, CRC(c32b0859) SHA1(1bb00de55742a1f2cbbf3970b43b122114b0911b) ) + + ROM_REGION( 0x8000, "gfx3", 0 ) + ROM_LOAD( "13.2d", 0x0000, 0x2000, CRC(d32559f5) SHA1(a4f05b1c8c48aad367ff675c29a9a1828c71b693) ) + ROM_LOAD( "12.1d", 0x2000, 0x2000, CRC(f0f64636) SHA1(a3354be74460e45453fea62c8dd910f98b5d2fb5) ) + ROM_LOAD( "14.3d", 0x4000, 0x2000, CRC(8c532c74) SHA1(c95786c81f82f7211f4411a9f39fd4ba4def9073) ) + ROM_LOAD( "15.4d", 0x6000, 0x2000, CRC(d119b483) SHA1(c1e403369bfbda0233ec5764fc703522e9f312a7) ) + + ROM_REGION( 0x0060, "proms", 0 ) + ROM_LOAD( "af-3.13d", 0x0000, 0x0020, CRC(875429ba) SHA1(7186e1fb15806d60fd3e704be8db94c7b6c8c058) ) + ROM_LOAD( "af-2.1h", 0x0020, 0x0020, CRC(e1cac297) SHA1(f15326d04d006d9d029a6565aebf9daf3657bc2a) ) + ROM_LOAD( "af-1.3n", 0x0040, 0x0020, CRC(5638e485) SHA1(5d892111936a8eb7646c03a17300069be9a2b442) ) +ROM_END + + +GAME( 1983, dacholer, 0, dacholer, dacholer, 0, ROT0, "Nichibutsu", "Dacholer", GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) +GAME( 1983, kickboy, 0, dacholer, kickboy, 0, ROT0, "Nichibutsu", "Kick Boy", GAME_SUPPORTS_SAVE ) +GAME( 1984, itaten, 0, itaten, itaten, 0, ROT0, "Nichibutsu / Alice", "Itazura Tenshi (Japan)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/dai3wksi.c mame-0.145/src/mame/drivers/dai3wksi.c --- mame-0.144/src/mame/drivers/dai3wksi.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dai3wksi.c 2012-02-06 21:30:38.000000000 +0000 @@ -123,9 +123,9 @@ } -static SCREEN_UPDATE( dai3wksi ) +static SCREEN_UPDATE_RGB32( dai3wksi ) { - dai3wksi_state *state = screen->machine().driver_data(); + dai3wksi_state *state = screen.machine().driver_data(); offs_t offs; pen_t pens[8]; @@ -147,7 +147,7 @@ } else { - if (input_port_read(screen->machine(), "IN2") & 0x03) + if (input_port_read(screen.machine(), "IN2") & 0x03) color = vr_prom2[value]; else color = vr_prom1[value]; @@ -158,9 +158,9 @@ pen_t pen = (data & (1 << i)) ? pens[color] : pens[0]; if (state->m_dai3wksi_flipscreen) - *BITMAP_ADDR32(bitmap, 255-y, 255-x) = pen; + bitmap.pix32(255-y, 255-x) = pen; else - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x++; } @@ -262,14 +262,14 @@ static const char *const dai3wksi_sample_names[] = { "*dai3wksi", - "1.wav", - "2.wav", - "3.wav", - "3-2.wav", - "4.wav", - "5.wav", - "6.wav", - "6-2.wav", + "1", + "2", + "3", + "3-2", + "4", + "5", + "6", + "6-2", 0 }; @@ -599,11 +599,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(4, 251, 8, 247) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(dai3wksi) + MCFG_SCREEN_UPDATE_STATIC(dai3wksi) MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/dambustr.c mame-0.145/src/mame/drivers/dambustr.c --- mame-0.144/src/mame/drivers/dambustr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dambustr.c 2012-02-06 21:30:40.000000000 +0000 @@ -257,10 +257,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(dambustr) + MCFG_SCREEN_UPDATE_STATIC(dambustr) MCFG_GFXDECODE(dambustr) MCFG_PALETTE_LENGTH(32+2+64+8) /* 32 for the characters, 2 for the bullets, 64 for the stars, 8 for the background */ diff -Nru mame-0.144/src/mame/drivers/darius.c mame-0.145/src/mame/drivers/darius.c --- mame-0.144/src/mame/drivers/darius.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/darius.c 2012-02-06 21:30:34.000000000 +0000 @@ -959,28 +959,25 @@ MCFG_DEFAULT_LAYOUT(layout_darius) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 29*8-1) - MCFG_SCREEN_UPDATE(darius) + MCFG_SCREEN_UPDATE_STATIC(darius_left) MCFG_SCREEN_ADD("mscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 29*8-1) - MCFG_SCREEN_UPDATE(darius) + MCFG_SCREEN_UPDATE_STATIC(darius_middle) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 29*8-1) - MCFG_SCREEN_UPDATE(darius) + MCFG_SCREEN_UPDATE_STATIC(darius_right) MCFG_VIDEO_START(darius) diff -Nru mame-0.144/src/mame/drivers/darkhors.c mame-0.145/src/mame/drivers/darkhors.c --- mame-0.144/src/mame/drivers/darkhors.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/darkhors.c 2012-02-06 21:30:42.000000000 +0000 @@ -56,7 +56,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "sound/okim6295.h" #include "sound/st0016.h" @@ -68,7 +67,9 @@ { public: darkhors_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } tilemap_t *m_tmap; tilemap_t *m_tmap2; @@ -80,6 +81,8 @@ UINT32* m_jclub2_tileram; int m_jclub2_gfx_index; UINT32 *m_spriteram; + + required_device m_maincpu; }; @@ -94,7 +97,7 @@ ***************************************************************************/ static VIDEO_START( darkhors ); -static SCREEN_UPDATE( darkhors ); +static SCREEN_UPDATE_IND16( darkhors ); static TILE_GET_INFO( get_tile_info_0 ) @@ -117,16 +120,16 @@ { darkhors_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tmapram[offset]); - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); } static WRITE32_HANDLER( darkhors_tmapram2_w ) { darkhors_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tmapram2[offset]); - tilemap_mark_tile_dirty(state->m_tmap2, offset); + state->m_tmap2->mark_tile_dirty(offset); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { darkhors_state *state = machine.driver_data(); UINT32 *s = state->m_spriteram; @@ -170,39 +173,39 @@ state->m_tmap2 = tilemap_create( machine, get_tile_info_1, tilemap_scan_rows, 16,16, 0x40,0x40 ); - tilemap_set_transparent_pen(state->m_tmap, 0); - tilemap_set_transparent_pen(state->m_tmap2, 0); + state->m_tmap->set_transparent_pen(0); + state->m_tmap2->set_transparent_pen(0); machine.gfx[0]->color_granularity = 64; /* 256 colour sprites with palette selectable on 64 colour boundaries */ } -static SCREEN_UPDATE( darkhors ) +static SCREEN_UPDATE_IND16( darkhors ) { - darkhors_state *state = screen->machine().driver_data(); + darkhors_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #if DARKHORS_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) mask |= 4; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask |= 4; if (mask != 0) layers_ctrl &= mask; } #endif - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_set_scrollx(state->m_tmap,0, (state->m_tmapscroll[0] >> 16) - 5); - tilemap_set_scrolly(state->m_tmap,0, (state->m_tmapscroll[0] & 0xffff) - 0xff ); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_tmap, TILEMAP_DRAW_OPAQUE, 0); + state->m_tmap->set_scrollx(0, (state->m_tmapscroll[0] >> 16) - 5); + state->m_tmap->set_scrolly(0, (state->m_tmapscroll[0] & 0xffff) - 0xff ); + if (layers_ctrl & 1) state->m_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - tilemap_set_scrollx(state->m_tmap2,0, (state->m_tmapscroll2[0] >> 16) - 5); - tilemap_set_scrolly(state->m_tmap2,0, (state->m_tmapscroll2[0] & 0xffff) - 0xff ); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, state->m_tmap2, 0, 0); + state->m_tmap2->set_scrollx(0, (state->m_tmapscroll2[0] >> 16) - 5); + state->m_tmap2->set_scrolly(0, (state->m_tmapscroll2[0] & 0xffff) - 0xff ); + if (layers_ctrl & 2) state->m_tmap2->draw(bitmap, cliprect, 0, 0); - if (layers_ctrl & 4) draw_sprites(screen->machine(),bitmap,cliprect); + if (layers_ctrl & 4) draw_sprites(screen.machine(),bitmap,cliprect); #if DARKHORS_DEBUG #if 0 @@ -636,20 +639,25 @@ ***************************************************************************/ -static INTERRUPT_GEN( darkhors ) +static TIMER_DEVICE_CALLBACK( darkhors_irq ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 3, HOLD_LINE); break; - case 1: device_set_input_line(device, 4, HOLD_LINE); break; - case 2: device_set_input_line(device, 5, HOLD_LINE); break; - } + darkhors_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 248) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + + if(scanline >= 1 && scanline <= 247) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } static MACHINE_CONFIG_START( darkhors, darkhors_state ) MCFG_CPU_ADD("maincpu", M68EC020, 12000000) // 36MHz/3 ?? MCFG_CPU_PROGRAM_MAP(darkhors_map) - MCFG_CPU_VBLANK_INT_HACK(darkhors,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", darkhors_irq, "screen", 0, 1) MCFG_EEPROM_ADD("eeprom", eeprom_intf) @@ -657,10 +665,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(0x190, 0x100) + MCFG_SCREEN_SIZE(0x190, 0x100+16) MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 8, 0x100-8-1) - MCFG_SCREEN_UPDATE(darkhors) + MCFG_SCREEN_UPDATE_STATIC(darkhors) MCFG_GFXDECODE(darkhors) MCFG_PALETTE_LENGTH(0x10000) @@ -692,7 +699,7 @@ } -static SCREEN_UPDATE(jclub2) +static SCREEN_UPDATE_IND16(jclub2) { return 0; } @@ -700,7 +707,7 @@ static MACHINE_CONFIG_START( jclub2, darkhors_state ) MCFG_CPU_ADD("maincpu", M68EC020, 12000000) MCFG_CPU_PROGRAM_MAP(jclub2_map) - MCFG_CPU_VBLANK_INT_HACK(darkhors,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", darkhors_irq, "screen", 0, 1) MCFG_EEPROM_ADD("eeprom", eeprom_intf) @@ -708,10 +715,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(0x190, 0x100) + MCFG_SCREEN_SIZE(0x190, 0x100+16) MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 8, 0x100-8-1) - MCFG_SCREEN_UPDATE(jclub2) + MCFG_SCREEN_UPDATE_STATIC(jclub2) MCFG_GFXDECODE(jclub2) MCFG_PALETTE_LENGTH(0x10000) @@ -748,7 +754,7 @@ } -static SCREEN_UPDATE(jclub2o) +static SCREEN_UPDATE_IND16(jclub2o) { return 0; } @@ -761,7 +767,6 @@ MCFG_CPU_ADD("maincpu", M68EC020, 12000000) MCFG_CPU_PROGRAM_MAP(jclub2o_map) - //MCFG_CPU_VBLANK_INT_HACK(darkhors,3) MCFG_EEPROM_ADD("eeprom", eeprom_intf) @@ -769,10 +774,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x190, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x190-1, 8, 0x100-8-1) - MCFG_SCREEN_UPDATE(jclub2o) + MCFG_SCREEN_UPDATE_STATIC(jclub2o) MCFG_GFXDECODE(jclub2) MCFG_PALETTE_LENGTH(0x10000) diff -Nru mame-0.144/src/mame/drivers/darkmist.c mame-0.145/src/mame/drivers/darkmist.c --- mame-0.144/src/mame/drivers/darkmist.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/darkmist.c 2012-02-06 21:30:42.000000000 +0000 @@ -241,10 +241,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(darkmist) + MCFG_SCREEN_UPDATE_STATIC(darkmist) MCFG_GFXDECODE(darkmist) MCFG_PALETTE_INIT(darkmist) diff -Nru mame-0.144/src/mame/drivers/darkseal.c mame-0.145/src/mame/drivers/darkseal.c --- mame-0.144/src/mame/drivers/darkseal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/darkseal.c 2012-02-06 21:30:34.000000000 +0000 @@ -274,10 +274,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(darkseal) + MCFG_SCREEN_UPDATE_STATIC(darkseal) MCFG_GFXDECODE(darkseal) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/dassault.c mame-0.145/src/mame/drivers/dassault.c --- mame-0.144/src/mame/drivers/dassault.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dassault.c 2012-02-06 21:30:39.000000000 +0000 @@ -4,11 +4,6 @@ Desert Assault (c) 1991 Data East Corporation (USA 4 players) Desert Assault (c) 1991 Data East Corporation (USA 2 players) - I'm not sure if one of the alpha blending effects is correct (mode 0x8000, - the usual mode 0x4000 should be correct). It may be some kind of orthogonal - priority effect where it should cut a hole in other higher priority sprites - to reveal a non-alpha'd hole, or alpha against a further back tilemap. - Emulation by Bryan McPhail, mish@tendril.co.uk @@ -130,6 +125,7 @@ #include "sound/okim6295.h" #include "video/deco16ic.h" #include "video/decocomn.h" +#include "video/decospr.h" /**********************************************************************************/ @@ -505,8 +501,8 @@ GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 32 ) /* Characters 8x8 */ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 32 ) /* Tiles 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 512, 32 ) /* Tiles 16x16 */ - GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 1024, 64 ) /* Sprites 16x16 */ - GFXDECODE_ENTRY( "gfx5", 0, tilelayout, 2048, 64 ) /* Sprites 16x16 */ + GFXDECODE_ENTRY( "gfx4", 0, tilelayout, 0/*1024*/, 64 ) /* Sprites 16x16 */ + GFXDECODE_ENTRY( "gfx5", 0, tilelayout, 0/*2048*/, 64 ) /* Sprites 16x16 */ GFXDECODE_END /**********************************************************************************/ @@ -582,7 +578,8 @@ MCFG_CPU_ADD("audiocpu", H6280,32220000/8) /* Accurate */ MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_QUANTUM_TIME(attotime::from_hz(8400)) /* 140 CPU slices per frame */ +// MCFG_QUANTUM_TIME(attotime::from_hz(8400)) /* 140 CPU slices per frame */ + MCFG_QUANTUM_PERFECT_CPU("maincpu") // I was seeing random lockups.. let's see if this helps /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) @@ -590,10 +587,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dassault) + MCFG_SCREEN_UPDATE_STATIC(dassault) + + MCFG_VIDEO_START(dassault) MCFG_GFXDECODE(dassault) MCFG_PALETTE_LENGTH(4096) @@ -603,6 +601,13 @@ MCFG_DECO16IC_ADD("tilegen1", dassault_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", dassault_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + + MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 4); + + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -826,27 +831,6 @@ /**********************************************************************************/ -static READ16_HANDLER( dassault_main_skip ) -{ - dassault_state *state = space->machine().driver_data(); - int ret = state->m_ram[0]; - - if (cpu_get_previouspc(&space->device()) == 0x1170 && ret & 0x8000) - device_spin_until_interrupt(&space->device()); - - return ret; -} - -static READ16_HANDLER( thndzone_main_skip ) -{ - dassault_state *state = space->machine().driver_data(); - int ret = state->m_ram[0]; - - if (cpu_get_pc(&space->device()) == 0x114c && ret & 0x8000) - device_spin_until_interrupt(&space->device()); - - return ret; -} static DRIVER_INIT( dassault ) { @@ -863,9 +847,6 @@ memcpy(dst + 0x110000, src + 0x10000, 0x10000); auto_free(machine, tmp); - - /* Save time waiting on vblank bit */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x3f8000, 0x3f8001, FUNC(dassault_main_skip)); } static DRIVER_INIT( thndzone ) @@ -883,9 +864,6 @@ memcpy(dst + 0x110000, src + 0x10000, 0x10000); auto_free(machine, tmp); - - /* Save time waiting on vblank bit */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x3f8000, 0x3f8001, FUNC(thndzone_main_skip)); } /**********************************************************************************/ diff -Nru mame-0.144/src/mame/drivers/dblewing.c mame-0.145/src/mame/drivers/dblewing.c --- mame-0.144/src/mame/drivers/dblewing.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/dblewing.c 2012-02-06 21:30:34.000000000 +0000 @@ -93,20 +93,20 @@ -static SCREEN_UPDATE(dblewing) +static SCREEN_UPDATE_IND16(dblewing) { - dblewing_state *state = screen->machine().driver_data(); + dblewing_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 0); /* not Confirmed */ - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(0, cliprect); /* not Confirmed */ + screen.machine().priority_bitmap.fill(0); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); return 0; } @@ -652,10 +652,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dblewing) + MCFG_SCREEN_UPDATE_STATIC(dblewing) MCFG_PALETTE_LENGTH(4096) MCFG_GFXDECODE(dblewing) diff -Nru mame-0.144/src/mame/drivers/dbz.c mame-0.145/src/mame/drivers/dbz.c --- mame-0.144/src/mame/drivers/dbz.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dbz.c 2012-02-06 21:30:34.000000000 +0000 @@ -396,10 +396,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 40*8) MCFG_SCREEN_VISIBLE_AREA(0, 48*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(dbz) + MCFG_SCREEN_UPDATE_STATIC(dbz) MCFG_GFXDECODE(dbz) diff -Nru mame-0.144/src/mame/drivers/dcheese.c mame-0.145/src/mame/drivers/dcheese.c --- mame-0.144/src/mame/drivers/dcheese.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dcheese.c 2012-02-06 21:30:40.000000000 +0000 @@ -429,10 +429,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(360, 262) /* guess, need to see what the games write to the vid registers */ MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(dcheese) + MCFG_SCREEN_UPDATE_STATIC(dcheese) MCFG_PALETTE_LENGTH(65534) @@ -592,8 +591,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -625,8 +624,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -657,8 +656,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -690,8 +689,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -722,8 +721,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -754,8 +753,8 @@ ROM_RELOAD( 0x380000, 0x80000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(793c4bda) SHA1(5a8a2981b48922f4d9e617a9bf9ef6a47ab702b7) ) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(fe2c3521) SHA1(896e53427c7831620ca565be9c0b76aabc36b9f4) ) /* Palette - 1 at U145 */ ROM_REGION( 0x100, "user2", 0 ) ROM_LOAD16_BYTE( "93c46.u158", 0x00000, 0x0080, CRC(a40a7b87) SHA1(3632b7538b3bf41ee0cbe7541a0f5951f70b4a9b) ) /* EEPROM data at U158 */ @@ -795,8 +794,8 @@ ROM_RELOAD( 0x3c0000, 0x40000 ) ROM_REGION16_LE( 0x20000, "user1", 0 ) - ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(69b3cc85) SHA1(05f7204ac961274b5d2f42cc6c0d06e5fa146aef)) /* Pallette - 0 at U144 */ - ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(e64a8511) SHA1(0e3a1fe936c841b8acfb150bf63e564b1dec2363) ) /* Pallette - 1 at U145 */ + ROM_LOAD16_BYTE( "0.144", 0x00000, 0x10000, CRC(69b3cc85) SHA1(05f7204ac961274b5d2f42cc6c0d06e5fa146aef)) /* Palette - 0 at U144 */ + ROM_LOAD16_BYTE( "1.145", 0x00001, 0x10000, CRC(e64a8511) SHA1(0e3a1fe936c841b8acfb150bf63e564b1dec2363) ) /* Palette - 1 at U145 */ ROM_END diff -Nru mame-0.144/src/mame/drivers/dcon.c mame-0.145/src/mame/drivers/dcon.c --- mame-0.144/src/mame/drivers/dcon.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dcon.c 2012-02-06 21:30:37.000000000 +0000 @@ -258,10 +258,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(dcon) + MCFG_SCREEN_UPDATE_STATIC(dcon) MCFG_GFXDECODE(dcon) MCFG_PALETTE_LENGTH(2048) @@ -287,10 +286,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(sdgndmps) + MCFG_SCREEN_UPDATE_STATIC(sdgndmps) MCFG_GFXDECODE(dcon) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/dday.c mame-0.145/src/mame/drivers/dday.c --- mame-0.144/src/mame/drivers/dday.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/dday.c 2012-02-06 21:30:37.000000000 +0000 @@ -267,12 +267,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(dday) + MCFG_SCREEN_UPDATE_STATIC(dday) MCFG_GFXDECODE(dday) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/ddayjlc.c mame-0.145/src/mame/drivers/ddayjlc.c --- mame-0.144/src/mame/drivers/ddayjlc.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddayjlc.c 2012-02-06 21:30:39.000000000 +0000 @@ -151,10 +151,10 @@ ddayjlc_state *state = space->machine().driver_data(); if (!offset) - tilemap_set_scrollx(state->m_bg_tilemap, 0, data + 8); + state->m_bg_tilemap->set_scrollx(0, data + 8); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } static WRITE8_HANDLER( ddayjlc_videoram_w ) @@ -380,11 +380,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info_bg, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( ddayjlc ) +static SCREEN_UPDATE_IND16( ddayjlc ) { - ddayjlc_state *state = screen->machine().driver_data(); + ddayjlc_state *state = screen.machine().driver_data(); UINT32 i; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); for (i = 0; i < 0x400; i += 4) { @@ -398,7 +398,7 @@ code = (code & 0x7f) | ((flags & 0x30) << 3); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], code, color, xflip, yflip, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], code, color, xflip, yflip, x, y, 0); } { @@ -409,9 +409,9 @@ { c = state->m_videoram[y * 32 + x]; if (x > 1 && x < 30) - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], c + state->m_char_bank * 0x100, 2, 0, 0, x*8, y*8, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], c + state->m_char_bank * 0x100, 2, 0, 0, x*8, y*8, 0); else - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[1], c + state->m_char_bank * 0x100, 2, 0, 0, x*8, y*8); + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[1], c + state->m_char_bank * 0x100, 2, 0, 0, x*8, y*8); } } return 0; @@ -526,10 +526,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ddayjlc) + MCFG_SCREEN_UPDATE_STATIC(ddayjlc) MCFG_GFXDECODE(ddayjlc) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/ddealer.c mame-0.145/src/mame/drivers/ddealer.c --- mame-0.144/src/mame/drivers/ddealer.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddealer.c 2012-02-06 21:30:41.000000000 +0000 @@ -166,7 +166,7 @@ state->m_back_tilemap = tilemap_create(machine, get_back_tile_info, tilemap_scan_cols, 8, 8, 64, 32); } -static void ddealer_draw_video_layer( running_machine &machine, UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_t* bitmap, const rectangle *cliprect, int flipy) +static void ddealer_draw_video_layer( running_machine &machine, UINT16* vreg_base, UINT16* top, UINT16* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy) { const gfx_element *gfx = machine.gfx[1]; @@ -249,12 +249,12 @@ } -static SCREEN_UPDATE( ddealer ) +static SCREEN_UPDATE_IND16( ddealer ) { - ddealer_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_back_tilemap, 0, state->m_flipscreen ? -192 : -64); - tilemap_set_flip(state->m_back_tilemap, state->m_flipscreen ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0); - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, 0, 0); + ddealer_state *state = screen.machine().driver_data(); + state->m_back_tilemap->set_scrollx(0, state->m_flipscreen ? -192 : -64); + state->m_back_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0); + state->m_back_tilemap->draw(bitmap, cliprect, 0, 0); /* the fg tilemap handling is a little hacky right now, i'm not sure if it should be a single tilemap with @@ -266,24 +266,24 @@ { if (state->m_vregs[0xcc / 2] & 0x80) { - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0xcc / 2], state->m_right_fg_vram_top, state->m_right_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0xcc / 2], state->m_right_fg_vram_top, state->m_right_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); } else { - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); } } else { if (state->m_vregs[0xcc / 2] & 0x80) { - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0xcc / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0x1e0 / 2], state->m_right_fg_vram_top, state->m_right_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0xcc / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0x1e0 / 2], state->m_right_fg_vram_top, state->m_right_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); } else { - ddealer_draw_video_layer(screen->machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); + ddealer_draw_video_layer(screen.machine(), &state->m_vregs[0x1e0 / 2], state->m_left_fg_vram_top, state->m_left_fg_vram_bottom, bitmap, cliprect, state->m_flipscreen); } } @@ -362,7 +362,7 @@ { ddealer_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_back_vram[offset]); - tilemap_mark_tile_dirty(state->m_back_tilemap, offset); + state->m_back_tilemap->mark_tile_dirty(offset); } @@ -630,10 +630,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ddealer) + MCFG_SCREEN_UPDATE_STATIC(ddealer) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/ddenlovr.c mame-0.145/src/mame/drivers/ddenlovr.c --- mame-0.144/src/mame/drivers/ddenlovr.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddenlovr.c 2012-02-06 21:30:36.000000000 +0000 @@ -97,7 +97,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "sound/okim6295.h" @@ -1268,7 +1267,7 @@ } -static void copylayer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) +static void copylayer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) { dynax_state *state = machine.driver_data(); int x,y; @@ -1286,25 +1285,25 @@ if (((state->m_ddenlovr_layer_enable2 << 4) | state->m_ddenlovr_layer_enable) & (1 << layer)) { - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pen = state->m_ddenlovr_pixmap[layer][512 * ((y + scrolly) & 0x1ff) + ((x + scrollx) & 0x1ff)]; if ((pen & transmask) != transpen) { pen &= penmask; pen |= palbase; - *BITMAP_ADDR16(bitmap, y, x) = pen; + bitmap.pix16(y, x) = pen; } } } } } -SCREEN_UPDATE(ddenlovr) +SCREEN_UPDATE_IND16(ddenlovr) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); static const int order[24][4] = { @@ -1321,7 +1320,7 @@ #if 0 static int base = 0x0; - const UINT8 *gfx = screen->machine().region("blitter")->base(); + const UINT8 *gfx = screen.machine().region("blitter")->base(); int next; memset(state->m_ddenlovr_pixmap[0], 0, 512 * 512); memset(state->m_ddenlovr_pixmap[1], 0, 512 * 512); @@ -1332,38 +1331,38 @@ state->m_ddenlovr_blit_pen_mode = 0; state->m_ddenlovr_blit_y = 5; state->m_ddenlovr_clip_ctrl = 0x0f; - next = blit_draw(screen->machine(), base, 0); + next = blit_draw(screen.machine(), base, 0); popmessage("GFX %06x", base); - if (screen->machine().input().code_pressed(KEYCODE_S)) base = next; - if (screen->machine().input().code_pressed_once(KEYCODE_X)) base = next; - if (screen->machine().input().code_pressed(KEYCODE_C)) { base--; while ((gfx[base] & 0xf0) != 0x30) base--; } - if (screen->machine().input().code_pressed(KEYCODE_V)) { base++; while ((gfx[base] & 0xf0) != 0x30) base++; } - if (screen->machine().input().code_pressed_once(KEYCODE_D)) { base--; while ((gfx[base] & 0xf0) != 0x30) base--; } - if (screen->machine().input().code_pressed_once(KEYCODE_F)) { base++; while ((gfx[base] & 0xf0) != 0x30) base++; } + if (screen.machine().input().code_pressed(KEYCODE_S)) base = next; + if (screen.machine().input().code_pressed_once(KEYCODE_X)) base = next; + if (screen.machine().input().code_pressed(KEYCODE_C)) { base--; while ((gfx[base] & 0xf0) != 0x30) base--; } + if (screen.machine().input().code_pressed(KEYCODE_V)) { base++; while ((gfx[base] & 0xf0) != 0x30) base++; } + if (screen.machine().input().code_pressed_once(KEYCODE_D)) { base--; while ((gfx[base] & 0xf0) != 0x30) base--; } + if (screen.machine().input().code_pressed_once(KEYCODE_F)) { base++; while ((gfx[base] & 0xf0) != 0x30) base++; } #endif - bitmap_fill(bitmap, cliprect, state->m_ddenlovr_bgcolor); + bitmap.fill(state->m_ddenlovr_bgcolor, cliprect); #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask, mask2; mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) mask |= 4; - if (screen->machine().input().code_pressed(KEYCODE_R)) mask |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) mask |= 4; + if (screen.machine().input().code_pressed(KEYCODE_R)) mask |= 8; mask2 = 0; if (state->m_extra_layers) { - if (screen->machine().input().code_pressed(KEYCODE_A)) mask2 |= 1; - if (screen->machine().input().code_pressed(KEYCODE_S)) mask2 |= 2; - if (screen->machine().input().code_pressed(KEYCODE_D)) mask2 |= 4; - if (screen->machine().input().code_pressed(KEYCODE_F)) mask2 |= 8; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask2 |= 1; + if (screen.machine().input().code_pressed(KEYCODE_S)) mask2 |= 2; + if (screen.machine().input().code_pressed(KEYCODE_D)) mask2 |= 4; + if (screen.machine().input().code_pressed(KEYCODE_F)) mask2 |= 8; } if (mask || mask2) @@ -1382,10 +1381,10 @@ pri = 0; } - copylayer(screen->machine(), bitmap, cliprect, order[pri][0]); - copylayer(screen->machine(), bitmap, cliprect, order[pri][1]); - copylayer(screen->machine(), bitmap, cliprect, order[pri][2]); - copylayer(screen->machine(), bitmap, cliprect, order[pri][3]); + copylayer(screen.machine(), bitmap, cliprect, order[pri][0]); + copylayer(screen.machine(), bitmap, cliprect, order[pri][1]); + copylayer(screen.machine(), bitmap, cliprect, order[pri][2]); + copylayer(screen.machine(), bitmap, cliprect, order[pri][3]); if (state->m_extra_layers) { @@ -1397,10 +1396,10 @@ pri = 0; } - copylayer(screen->machine(), bitmap, cliprect, order[pri][0] + 4); - copylayer(screen->machine(), bitmap, cliprect, order[pri][1] + 4); - copylayer(screen->machine(), bitmap, cliprect, order[pri][2] + 4); - copylayer(screen->machine(), bitmap, cliprect, order[pri][3] + 4); + copylayer(screen.machine(), bitmap, cliprect, order[pri][0] + 4); + copylayer(screen.machine(), bitmap, cliprect, order[pri][1] + 4); + copylayer(screen.machine(), bitmap, cliprect, order[pri][2] + 4); + copylayer(screen.machine(), bitmap, cliprect, order[pri][3] + 4); } state->m_ddenlovr_layer_enable = enab; @@ -1750,7 +1749,7 @@ AM_RANGE(0x3002c0, 0x3002c1) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff)// Sound AM_RANGE(0x300300, 0x300303) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0x300340, 0x30035f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0x300340, 0x30035f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write,0x00ff) AM_RANGE(0x300380, 0x300383) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0x300384, 0x300385) AM_DEVREAD8("aysnd", ay8910_r, 0x00ff) AM_RANGE(0x3003c2, 0x3003c3) AM_DEVWRITE("oki", quiz365_oki_bank1_w) @@ -1804,7 +1803,7 @@ AM_RANGE(0x300080, 0x300083) AM_WRITE(ddenlovr_blitter_w) AM_RANGE(0x300086, 0x300087) AM_READ(ddenlovr_gfxrom_r) // Video Chip AM_RANGE(0x3000c0, 0x3000c3) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write,0x00ff) AM_RANGE(0x300140, 0x300143) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0x300180, 0x300181) AM_READ_PORT("P1") AM_RANGE(0x300182, 0x300183) AM_READ_PORT("P2") @@ -1875,7 +1874,7 @@ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) // AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write,0x00ff) AM_RANGE(0xe00600, 0xe00603) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0xe00604, 0xe00605) AM_DEVREAD8("aysnd", ay8910_r, 0x00ff) AM_RANGE(0xe00700, 0xe00701) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // Sound @@ -1913,7 +1912,7 @@ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) // AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write,0x00ff) AM_RANGE(0xe00600, 0xe00603) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0xe00604, 0xe00605) AM_DEVREAD8("aysnd", ay8910_r, 0x00ff) AM_RANGE(0xe00700, 0xe00701) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // Sound @@ -1993,7 +1992,7 @@ AM_RANGE(0x300080, 0x300083) AM_WRITE(ddenlovr_blitter_w) AM_RANGE(0x300086, 0x300087) AM_READ(ddenlovr_gfxrom_r) // Video Chip AM_RANGE(0x3000c0, 0x3000c3) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write,0x00ff) AM_RANGE(0x300140, 0x300143) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0x300180, 0x300181) AM_READ_PORT("P1") AM_RANGE(0x300182, 0x300183) AM_READ_PORT("P2") @@ -2069,7 +2068,7 @@ AM_RANGE(0x96, 0x96) AM_WRITE(ddenlovr_layer_enable_w) AM_RANGE(0x98, 0x98) AM_READ(unk_r) // ? must be 78 on startup - AM_RANGE(0xa0, 0xaf) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xa0, 0xaf) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0xc0, 0xc0) AM_DEVWRITE("oki", quizchq_oki_bank_w) AM_RANGE(0xc2, 0xc2) AM_WRITENOP // enables palette RAM at 8000 ADDRESS_MAP_END @@ -2092,7 +2091,7 @@ AM_RANGE(0x1c, 0x1c) AM_READ(rongrong_input_r) AM_RANGE(0x1e, 0x1e) AM_WRITE(rongrong_select_w) - AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x40, 0x40) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) AM_RANGE(0x60, 0x61) AM_DEVWRITE("ymsnd", ym2413_w) @@ -2198,7 +2197,7 @@ static ADDRESS_MAP_START( mmpanic_portmap, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x0f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x00, 0x0f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) // Layers 0-3: AM_RANGE(0x20, 0x23) AM_WRITE(ddenlovr_palette_base_w) @@ -2368,7 +2367,7 @@ AM_RANGE(0x1e, 0x1e) AM_WRITE(funkyfig_rombank_w) AM_RANGE(0x20, 0x21) AM_WRITE(funkyfig_blitter_w) AM_RANGE(0x23, 0x23) AM_READ(rongrong_gfxrom_r) // Video Chip - AM_RANGE(0x40, 0x4f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x40, 0x4f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) // Layers 0-3: AM_RANGE(0x60, 0x63) AM_WRITE(ddenlovr_palette_base_w) @@ -2558,7 +2557,7 @@ AM_RANGE(0x96, 0x96) AM_READ(hanakanz_rand_r) AM_RANGE(0xa0, 0xa1) AM_DEVWRITE("ymsnd", ym2413_w) AM_RANGE(0xc0, 0xc0) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) - AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) ADDRESS_MAP_END @@ -2579,7 +2578,7 @@ AM_RANGE(0xb4, 0xb4) AM_WRITE(hanakanz_keyb_w) AM_RANGE(0xb6, 0xb6) AM_READ(hanakanz_rand_r) AM_RANGE(0xc0, 0xc0) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) - AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) ADDRESS_MAP_END @@ -2613,7 +2612,7 @@ AM_RANGE(0x97, 0x97) AM_WRITE(hanakanz_coincounter_w) AM_RANGE(0xa0, 0xa1) AM_DEVWRITE("ymsnd", ym2413_w) AM_RANGE(0xc0, 0xc0) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) - AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xe0, 0xef) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) ADDRESS_MAP_END @@ -2746,7 +2745,7 @@ AM_RANGE(0x64, 0x64) AM_MIRROR(0xff00) AM_READ_PORT("DSW5") // DSW 1-4 high bits AM_RANGE(0x80, 0x80) AM_MIRROR(0xff00) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) AM_RANGE(0xa0, 0xa1) AM_MIRROR(0xff00) AM_DEVWRITE("ymsnd", ym2413_w) - AM_RANGE(0xc0, 0xcf) AM_MIRROR(0xff00) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xc0, 0xcf) AM_MIRROR(0xff00) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0xe0, 0xe1) AM_MIRROR(0xff00) AM_DEVWRITE("aysnd", ay8910_address_data_w) ADDRESS_MAP_END @@ -2866,7 +2865,7 @@ AM_RANGE(0x44, 0x44) AM_DEVREAD("aysnd", ay8910_r) AM_RANGE(0x46, 0x46) AM_DEVWRITE("aysnd", ay8910_data_w) AM_RANGE(0x48, 0x48) AM_DEVWRITE("aysnd", ay8910_address_w) - AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x80, 0x83) AM_WRITE(ddenlovr_palette_base_w) AM_RANGE(0x84, 0x87) AM_WRITE(ddenlovr_palette_mask_w) AM_RANGE(0x88, 0x8b) AM_WRITE(ddenlovr_transparency_pen_w) @@ -3045,7 +3044,7 @@ AM_RANGE(0x41, 0x41) AM_WRITE(hginga_coins_w) AM_RANGE(0x42, 0x42) AM_READ(hginga_coins_r) AM_RANGE(0x43, 0x43) AM_READ(hginga_input_r) - AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x80, 0x80) AM_WRITE(hginga_80_w) AM_RANGE(0xa0, 0xa3) AM_WRITE(ddenlovr_palette_base_w) AM_RANGE(0xa4, 0xa7) AM_WRITE(ddenlovr_palette_mask_w) @@ -3153,7 +3152,7 @@ AM_RANGE(0x03, 0x03) AM_READ(rongrong_gfxrom_r) AM_RANGE(0x1c, 0x1c) AM_READNOP AM_WRITE(mjmyster_rambank_w) // ? ack on RTC int AM_RANGE(0x1e, 0x1e) AM_WRITE(hginga_rombank_w) - AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x20, 0x2f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x40, 0x43) AM_WRITE(ddenlovr_palette_base_w) AM_RANGE(0x44, 0x47) AM_WRITE(ddenlovr_palette_mask_w) AM_RANGE(0x48, 0x4b) AM_WRITE(ddenlovr_transparency_pen_w) @@ -3219,7 +3218,7 @@ AM_RANGE(0x41, 0x41) AM_WRITE(hgokou_input_w) AM_RANGE(0x42, 0x42) AM_READ(hgokou_input_r) AM_RANGE(0x43, 0x43) AM_READ(hgokbang_input_r) - AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0xa0, 0xa3) AM_WRITE(ddenlovr_palette_base_w) AM_RANGE(0xa4, 0xa7) AM_WRITE(ddenlovr_palette_mask_w) AM_RANGE(0xa8, 0xab) AM_WRITE(ddenlovr_transparency_pen_w) @@ -3361,7 +3360,7 @@ AM_RANGE(0x44, 0x44) AM_DEVREAD("aysnd", ay8910_r) AM_RANGE(0x46, 0x46) AM_DEVWRITE("aysnd", ay8910_data_w) AM_RANGE(0x48, 0x48) AM_DEVWRITE("aysnd", ay8910_address_w) - AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x60, 0x6f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x80, 0x83) AM_WRITE(ddenlovr_palette_base_w) AM_RANGE(0x84, 0x87) AM_WRITE(ddenlovr_palette_mask_w) AM_RANGE(0x88, 0x8b) AM_WRITE(ddenlovr_transparency_pen_w) @@ -3462,7 +3461,7 @@ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) // AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ymsnd", ym2413_w, 0x00ff) - AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write, 0x00ff) AM_RANGE(0xe00600, 0xe00603) AM_DEVWRITE8("aysnd", ay8910_address_data_w, 0x00ff) AM_RANGE(0xe00604, 0xe00605) AM_DEVREAD8("aysnd", ay8910_r, 0x00ff) AM_RANGE(0xe00700, 0xe00701) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // Sound @@ -3556,7 +3555,7 @@ AM_RANGE(0x0181, 0x0181) AM_WRITENOP // ? int. enable AM_RANGE(0x0184, 0x0184) AM_WRITE(mjflove_coincounter_w) AM_RANGE(0x0200, 0x0201) AM_DEVWRITE("ymsnd", ym2413_w) - AM_RANGE(0x0280, 0x028f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x0280, 0x028f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x0300, 0x0301) AM_DEVWRITE("aysnd", ay8910_address_data_w) AM_RANGE(0x0380, 0x0380) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) ADDRESS_MAP_END @@ -3600,7 +3599,7 @@ AM_RANGE(0x63, 0x64) AM_READ(hanakanz_gfxrom_r) AM_RANGE(0x80, 0x81) AM_DEVWRITE("ymsnd", ym2413_w) AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) - AM_RANGE(0xc0, 0xcf) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0xc0, 0xcf) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) ADDRESS_MAP_END @@ -3676,7 +3675,7 @@ AM_RANGE(0x43, 0x43) AM_READ(rongrong_gfxrom_r) AM_RANGE(0x50, 0x50) AM_READ(hanakanz_rand_r) AM_RANGE(0x70, 0x70) AM_DEVWRITE("oki", quizchq_oki_bank_w) - AM_RANGE(0x80, 0x8f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x80, 0x8f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0x90, 0x90) AM_READ_PORT("DSW1") AM_RANGE(0x91, 0x91) AM_READ_PORT("DSW2") AM_RANGE(0x92, 0x92) AM_READ_PORT("DSW4") @@ -3803,7 +3802,7 @@ AM_RANGE(0x40, 0x40) AM_WRITE(daimyojn_blitter_data_palette_w) AM_RANGE(0x42, 0x44) AM_READ(hanakanz_gfxrom_r) AM_RANGE(0x8a, 0x8b) AM_READ(daimyojn_year_hack_r) // ? - AM_RANGE(0x80, 0x8f) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE(0x80, 0x8f) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE(0xa0, 0xa1) AM_DEVWRITE("ymsnd", ym2413_w) AM_RANGE(0xa2, 0xa2) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) AM_RANGE(0xa8, 0xa8) AM_READ_PORT("SYSTEM") @@ -7790,6 +7789,12 @@ Don Den Lover Vol.1 ***************************************************************************/ +static MSM6242_INTERFACE( ddenlovr_rtc_intf ) +{ + DEVCB_NULL +}; + + static MACHINE_CONFIG_START( ddenlovr, dynax_state ) /* basic machine hardware */ @@ -7804,10 +7809,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(336, 256) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-16+5-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x100) @@ -7827,7 +7831,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", ddenlovr_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( ddenlovj, ddenlovr ) @@ -7892,25 +7896,28 @@ static INTERRUPT_GEN( quizchq_irq ) { dynax_state *state = device->machine().driver_data(); +// int scanline = param; /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, otherwise quizchq would lock up. */ - if (downcast(device)->input_state(0)) - return; +// if (downcast(state->m_maincpu)->input_state(0)) +// return; - if ((++state->m_irq_count % 60) == 0) - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xfc); - else - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xee); + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xee); } -#ifdef UNUSED_FUNCTION -static INTERRUPT_GEN( rtc_irq ) +static WRITE_LINE_DEVICE_HANDLER( quizchq_rtc_irq ) { - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xfc); + dynax_state *drvstate = device->machine().driver_data(); + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0xfc); } -#endif + +static MSM6242_INTERFACE( quizchq_rtc_intf ) +{ + DEVCB_LINE(quizchq_rtc_irq) +}; static MACHINE_CONFIG_START( quizchq, dynax_state ) @@ -7918,7 +7925,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* Verified */ MCFG_CPU_PROGRAM_MAP(quizchq_map) MCFG_CPU_IO_MAP(quizchq_portmap) - MCFG_CPU_VBLANK_INT("screen", quizchq_irq) + MCFG_CPU_VBLANK_INT("screen",quizchq_irq) MCFG_MACHINE_START(rongrong) MCFG_MACHINE_RESET(ddenlovr) @@ -7927,10 +7934,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(336, 256) + MCFG_SCREEN_SIZE(336, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-16+5-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x100) @@ -7947,7 +7953,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", quizchq_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( rongrong, quizchq ) @@ -7967,32 +7973,45 @@ /* the CPU is in Interrupt Mode 0: RST 08 is vblank - RST 18 is from the blitter - RST 20 is from the 6242RTC + RST 18 is from the 6242RTC + RST 20 is from the link device? */ + static INTERRUPT_GEN( mmpanic_irq ) { dynax_state *state = device->machine().driver_data(); + //int scanline = param; /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, - otherwise the game would lock up. */ - if (downcast(device)->input_state(0)) - return; + otherwise quizchq would lock up. */ + //if (downcast(state->m_maincpu)->input_state(0)) + // return; - if ((++state->m_irq_count % 60) == 0) - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xe7); // RST 20, clock - else - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xcf); // RST 08, vblank + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xcf); // RST 08, vblank } + +static WRITE_LINE_DEVICE_HANDLER( mmpanic_rtc_irq ) +{ + dynax_state *drvstate = device->machine().driver_data(); + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0xdf); // RST 18, clock +} + +static MSM6242_INTERFACE( mmpanic_rtc_intf ) +{ + DEVCB_LINE(mmpanic_rtc_irq) +}; + + static MACHINE_CONFIG_START( mmpanic, dynax_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 8000000) MCFG_CPU_PROGRAM_MAP(mmpanic_map) MCFG_CPU_IO_MAP(mmpanic_portmap) - MCFG_CPU_VBLANK_INT("screen", mmpanic_irq) + MCFG_CPU_VBLANK_INT("screen",mmpanic_irq) MCFG_CPU_ADD("soundcpu", Z80, 3579545) MCFG_CPU_PROGRAM_MAP(mmpanic_sound_map) @@ -8006,10 +8025,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(336, 256) + MCFG_SCREEN_SIZE(336, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-16+5-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x100) @@ -8029,7 +8047,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", mmpanic_rtc_intf) MACHINE_CONFIG_END @@ -8044,6 +8062,7 @@ 0xe0 is vblank 0xe2 is from the 6242RTC */ + static INTERRUPT_GEN( hanakanz_irq ) { dynax_state *state = device->machine().driver_data(); @@ -8051,15 +8070,30 @@ /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, otherwise quizchq would lock up. */ - if (downcast(device)->input_state(0)) - return; + //if (downcast(state->m_maincpu)->input_state(0)) + // return; - if ((++state->m_irq_count % 60) == 0) - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xe2); - else - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xe0); + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xe0); +} + +static WRITE_LINE_DEVICE_HANDLER(hanakanz_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + /* I haven't found a irq ack register, so I need this kludge to + make sure I don't lose any interrupt generated by the blitter, + otherwise quizchq would lock up. */ + //if (downcast(drvstate->m_maincpu)->input_state(0)) + // return; + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0xe2); } +static MSM6242_INTERFACE( hanakanz_rtc_intf ) +{ + DEVCB_LINE(hanakanz_rtc_irq) +}; + static MACHINE_CONFIG_START( hanakanz, dynax_state ) /* basic machine hardware */ @@ -8075,10 +8109,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(336, 256) + MCFG_SCREEN_SIZE(336, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-11-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x200) @@ -8095,7 +8128,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", hanakanz_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( hkagerou, hanakanz ) @@ -8129,22 +8162,40 @@ /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, otherwise quizchq would lock up. */ - if (downcast(device)->input_state(0)) - return; + //if (downcast(state->m_maincpu)->input_state(0)) + // return; - if ((++state->m_irq_count % 60) == 0) - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xfa); - else - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xf8); + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xf8); } +static WRITE_LINE_DEVICE_HANDLER(mjchuuka_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + /* I haven't found a irq ack register, so I need this kludge to + make sure I don't lose any interrupt generated by the blitter, + otherwise quizchq would lock up. */ + //if (downcast(drvstate->m_maincpu)->input_state(0)) + // return; + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0xfa); +} + +static MSM6242_INTERFACE( mjchuuka_rtc_intf ) +{ + DEVCB_LINE(mjchuuka_rtc_irq) +}; + static MACHINE_CONFIG_DERIVED( mjchuuka, hanakanz ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(mjchuuka_portmap) - MCFG_CPU_VBLANK_INT("screen", mjchuuka_irq) + MCFG_CPU_VBLANK_INT("screen",mjchuuka_irq) + + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjchuuka_rtc_intf) MCFG_SOUND_ADD("aysnd", AY8910, 1789772) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) @@ -8155,10 +8206,13 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(funkyfig_map) MCFG_CPU_IO_MAP(funkyfig_portmap) - MCFG_CPU_VBLANK_INT("screen", mjchuuka_irq) + MCFG_CPU_VBLANK_INT("screen",mjchuuka_irq) MCFG_MACHINE_START(funkyfig) + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjchuuka_rtc_intf) + MCFG_CPU_MODIFY("soundcpu") MCFG_CPU_IO_MAP(funkyfig_sound_portmap) @@ -8182,24 +8236,23 @@ blitter interrupt I guess (nested blitter irqs?). Hence the hack to trigger the blitter irq every frame. */ -static INTERRUPT_GEN( mjmyster_irq ) + +static TIMER_DEVICE_CALLBACK( mjmyster_irq ) { + dynax_state *state = timer.machine().driver_data(); + int scanline = param; + /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, otherwise quizchq would lock up. */ - if (downcast(device)->input_state(0)) + if (downcast(state->m_maincpu)->input_state(0)) return; - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xf8); break; - case 1: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xfa); break; - } -} + if(scanline == 245) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xf8); -static INTERRUPT_GEN( rtc_nmi_irq ) -{ - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + if(scanline == 0) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xfa); } static const ay8910_interface mjmyster_ay8910_interface = @@ -8212,14 +8265,37 @@ DEVCB_HANDLER(ddenlovr_select_w) }; +static WRITE_LINE_DEVICE_HANDLER(mjmyster_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + /* I haven't found a irq ack register, so I need this kludge to + make sure I don't lose any interrupt generated by the blitter, + otherwise quizchq would lock up. */ + //if (downcast(drvstate->m_maincpu)->input_state(0)) + // return; + + device_set_input_line(drvstate->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); +} + +static MSM6242_INTERFACE( mjmyster_rtc_intf ) +{ + DEVCB_LINE(mjmyster_rtc_irq) +}; + + static MACHINE_CONFIG_DERIVED( mjmyster, quizchq ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* Verified */ MCFG_CPU_PROGRAM_MAP(mjmyster_map) MCFG_CPU_IO_MAP(mjmyster_portmap) - MCFG_CPU_VBLANK_INT_HACK(mjmyster_irq, 2) - MCFG_CPU_PERIODIC_INT(rtc_nmi_irq, 1) + MCFG_TIMER_ADD_SCANLINE("scantimer", mjmyster_irq, "screen", 0, 1) + + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjmyster_rtc_intf) MCFG_MACHINE_START(mjmyster) @@ -8241,17 +8317,15 @@ static INTERRUPT_GEN( hginga_irq ) { dynax_state *state = device->machine().driver_data(); +// int scanline = param; /* I haven't found a irq ack register, so I need this kludge to make sure I don't lose any interrupt generated by the blitter, otherwise hginga would lock up. */ - if (downcast(device)->input_state(0)) - return; +// if (downcast(state->m_maincpu)->input_state(0)) +// return; - if ((++state->m_irq_count % 60) == 0) - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xee); - else - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xf8); + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xf8); } static const ay8910_interface hginga_ay8910_interface = @@ -8263,13 +8337,35 @@ DEVCB_NULL, DEVCB_HANDLER(ddenlovr_select_w) // W }; +static WRITE_LINE_DEVICE_HANDLER(hginga_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + /* I haven't found a irq ack register, so I need this kludge to + make sure I don't lose any interrupt generated by the blitter, + otherwise quizchq would lock up. */ + //if (downcast(drvstate->m_maincpu)->input_state(0)) + // return; + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0xee); +} + +static MSM6242_INTERFACE( hginga_rtc_intf ) +{ + DEVCB_LINE(hginga_rtc_irq) +}; + + static MACHINE_CONFIG_DERIVED( hginga, quizchq ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(hginga_map) MCFG_CPU_IO_MAP(hginga_portmap) - MCFG_CPU_VBLANK_INT("screen", hginga_irq) + MCFG_CPU_VBLANK_INT("screen",hginga_irq) + + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(hginga_rtc_intf) MCFG_MACHINE_START(mjmyster) @@ -8284,7 +8380,10 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(hgokou_map) MCFG_CPU_IO_MAP(hgokou_portmap) - MCFG_CPU_VBLANK_INT("screen", hginga_irq) + MCFG_CPU_VBLANK_INT("screen",hginga_irq) + + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(hginga_rtc_intf) MCFG_MACHINE_START(mjmyster) @@ -8312,14 +8411,18 @@ static MACHINE_CONFIG_DERIVED( mjmyuniv, quizchq ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* Verified */ MCFG_CPU_PROGRAM_MAP(mjmyster_map) MCFG_CPU_IO_MAP(mjmyster_portmap) - MCFG_CPU_VBLANK_INT_HACK(mjmyster_irq, 2) - MCFG_CPU_PERIODIC_INT(rtc_nmi_irq, 1) + MCFG_TIMER_ADD_SCANLINE("scantimer", mjmyster_irq, "screen", 0, 1) MCFG_MACHINE_START(mjmyster) + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjmyster_rtc_intf) + MCFG_SOUND_ADD("aysnd", AY8910, 1789772) MCFG_SOUND_CONFIG(mjmyster_ay8910_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) @@ -8328,47 +8431,60 @@ static MACHINE_CONFIG_DERIVED( mjmyornt, quizchq ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* Verified */ + MCFG_CPU_PROGRAM_MAP(quizchq_map) MCFG_CPU_IO_MAP(mjmyster_portmap) - MCFG_CPU_VBLANK_INT_HACK(mjmyster_irq, 2) - MCFG_CPU_PERIODIC_INT(rtc_nmi_irq, 1) + MCFG_TIMER_ADD_SCANLINE("scantimer", mjmyster_irq, "screen", 0, 1) MCFG_MACHINE_START(mjmyster) + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjmyster_rtc_intf) + MCFG_SOUND_ADD("aysnd", AY8910, 1789772) MCFG_SOUND_CONFIG(mjmyster_ay8910_interface) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MACHINE_CONFIG_END + static INTERRUPT_GEN( mjflove_irq ) { dynax_state *state = device->machine().driver_data(); - state->m_mjflove_irq_cause = 1 | (1 << 1); + state->m_mjflove_irq_cause = 1; + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); +} - switch (cpu_getiloops(device)) - { - case 0: - state->m_mjflove_irq_cause &= 1; - device_set_input_line(device, 0, HOLD_LINE); - break; - case 1: - state->m_mjflove_irq_cause &= 1 << 1; - device_set_input_line(device, 0, HOLD_LINE); - break; - } +static WRITE_LINE_DEVICE_HANDLER(mjflove_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + drvstate->m_mjflove_irq_cause = 2; + device_set_input_line(drvstate->m_maincpu, 0, HOLD_LINE); } +static MSM6242_INTERFACE( mjflove_rtc_intf ) +{ + DEVCB_LINE(mjflove_rtc_irq) +}; + static MACHINE_CONFIG_DERIVED( mjflove, quizchq ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* Verified */ MCFG_CPU_PROGRAM_MAP(rongrong_map) MCFG_CPU_IO_MAP(mjflove_portmap) - MCFG_CPU_VBLANK_INT_HACK(mjflove_irq, 2) + MCFG_CPU_VBLANK_INT("screen",mjflove_irq) MCFG_MACHINE_START(mjflove) + MCFG_DEVICE_MODIFY("rtc") + MCFG_DEVICE_CONFIG(mjflove_rtc_intf) + MCFG_VIDEO_START(mjflove) // blitter commands in the roms are shuffled around MCFG_SOUND_ADD("aysnd", AY8910, 28636363/8) @@ -8393,6 +8509,8 @@ MCFG_MACHINE_START(hparadis) MACHINE_CONFIG_END + + static MACHINE_CONFIG_START( jongtei, dynax_state ) /* basic machine hardware */ @@ -8408,10 +8526,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(336, 256) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 5, 256-11-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x200) @@ -8428,7 +8545,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", hanakanz_rtc_intf) MACHINE_CONFIG_END /*************************************************************************** @@ -8441,7 +8558,7 @@ MCFG_CPU_ADD("maincpu",Z80, XTAL_16MHz / 2) // ? MCFG_CPU_PROGRAM_MAP(sryudens_map) MCFG_CPU_IO_MAP(sryudens_portmap) - MCFG_CPU_VBLANK_INT("screen", mjchuuka_irq) + MCFG_CPU_VBLANK_INT("screen",mjchuuka_irq) MCFG_MACHINE_START(sryudens) MCFG_MACHINE_RESET(ddenlovr) @@ -8450,10 +8567,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.8532) // VSync 60.8532Hz, HSync 15.2790kHz MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(336, 256) + MCFG_SCREEN_SIZE(336, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 0+5, 256-12-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x100) @@ -8473,13 +8589,14 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", mjchuuka_rtc_intf) MACHINE_CONFIG_END /*************************************************************************** Mahjong Daimyojin ***************************************************************************/ + static MACHINE_CONFIG_START( daimyojn, dynax_state ) /* basic machine hardware */ @@ -8495,10 +8612,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.7922) // HSync 15.4248kHz MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(336, 256) + MCFG_SCREEN_SIZE(336, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 336-1-1, 1, 256-15-1) - MCFG_SCREEN_UPDATE(ddenlovr) + MCFG_SCREEN_UPDATE_STATIC(ddenlovr) MCFG_PALETTE_LENGTH(0x200) @@ -8515,7 +8631,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", hanakanz_rtc_intf) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/ddragon3.c mame-0.145/src/mame/drivers/ddragon3.c --- mame-0.144/src/mame/drivers/ddragon3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddragon3.c 2012-02-06 21:30:35.000000000 +0000 @@ -605,9 +605,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 448, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */ - MCFG_SCREEN_UPDATE(ddragon3) + MCFG_SCREEN_UPDATE_STATIC(ddragon3) MCFG_GFXDECODE(ddragon3) MCFG_PALETTE_LENGTH(768) @@ -642,7 +641,7 @@ MCFG_CPU_PROGRAM_MAP(ctribe_sound_map) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ctribe) + MCFG_SCREEN_UPDATE_STATIC(ctribe) MCFG_SOUND_MODIFY("ym2151") MCFG_SOUND_ROUTE(0, "lspeaker", 1.20) diff -Nru mame-0.144/src/mame/drivers/ddragon.c mame-0.145/src/mame/drivers/ddragon.c --- mame-0.144/src/mame/drivers/ddragon.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddragon.c 2012-02-06 21:30:40.000000000 +0000 @@ -718,15 +718,20 @@ PORT_INCLUDE(ddragon) PORT_MODIFY("DSW1") - PORT_DIPNAME( 0x08, 0x08, "Hurricane Kick" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPSETTING( 0x01, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Medium ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x08, 0x00, "Hurricane Kick" ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x08, DEF_STR( Normal ) ) - PORT_DIPNAME( 0x30, 0x30, "Timer" ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPNAME( 0x30, 0x10, "Timer" ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x00, "60" ) PORT_DIPSETTING( 0x10, "65" ) PORT_DIPSETTING( 0x30, "70" ) PORT_DIPSETTING( 0x20, "80" ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:7,8") + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:7,8") PORT_DIPSETTING( 0xc0, "1" ) PORT_DIPSETTING( 0x80, "2" ) PORT_DIPSETTING( 0x40, "3" ) @@ -997,9 +1002,8 @@ MCFG_PALETTE_LENGTH(384) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_VIDEO_START(ddragon) @@ -1061,9 +1065,8 @@ MCFG_PALETTE_LENGTH(384) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_VIDEO_START(ddragon) @@ -1108,9 +1111,8 @@ MCFG_PALETTE_LENGTH(384) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 0, 240) - MCFG_SCREEN_UPDATE(ddragon) + MCFG_SCREEN_UPDATE_STATIC(ddragon) MCFG_VIDEO_START(ddragon) diff -Nru mame-0.144/src/mame/drivers/ddribble.c mame-0.145/src/mame/drivers/ddribble.c --- mame-0.144/src/mame/drivers/ddribble.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddribble.c 2012-02-06 21:30:35.000000000 +0000 @@ -305,12 +305,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) */ - MCFG_SCREEN_UPDATE(ddribble) + MCFG_SCREEN_UPDATE_STATIC(ddribble) MCFG_GFXDECODE(ddribble) MCFG_PALETTE_LENGTH(64 + 256) diff -Nru mame-0.144/src/mame/drivers/ddz.c mame-0.145/src/mame/drivers/ddz.c --- mame-0.144/src/mame/drivers/ddz.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ddz.c 2012-02-06 21:30:34.000000000 +0000 @@ -34,12 +34,12 @@ } -static SCREEN_UPDATE(ddz) +static SCREEN_UPDATE_RGB32(ddz) { return 0; } -static SCREEN_EOF(ddz) +static SCREEN_VBLANK(ddz) { } @@ -72,11 +72,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(ddz) - MCFG_SCREEN_EOF(ddz) + MCFG_SCREEN_UPDATE_STATIC(ddz) + MCFG_SCREEN_VBLANK_STATIC(ddz) MCFG_PALETTE_LENGTH(8192) @@ -100,4 +99,4 @@ ROM_END -GAME( 200?, ddz, 0, ddz, ddz, 0, ROT0, "IGS?", "Dou Di Zhu", GAME_NOT_WORKING ) +GAME( 200?, ddz, 0, ddz, ddz, 0, ROT0, "IGS?", "Dou Di Zhu", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/de_1.c mame-0.145/src/mame/drivers/de_1.c --- mame-0.144/src/mame/drivers/de_1.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/de_1.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* DataEast/Sega Version 1 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: de_1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( de_1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( de_1_map, AS_PROGRAM, 8, de_1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( de_1 ) INPUT_PORTS_END -static MACHINE_RESET( de_1 ) +void de_1_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(de_1_map) - - MCFG_MACHINE_RESET( de_1 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -62,5 +73,6 @@ ROM_RELOAD( 0x30000, 0x10000) ROM_END -GAME(1987, lwar_a83, 0, de_1, de_1, de_1, ROT0, "Data East", "Laser War (8.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, lwar_e90, lwar_a83, de_1, de_1, de_1, ROT0, "Data East", "Laser War (9.0 Europe)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1987, lwar_a83, 0, de_1, de_1, de_1, ROT0, "Data East", "Laser War (8.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, lwar_e90, lwar_a83, de_1, de_1, de_1, ROT0, "Data East", "Laser War (9.0 Europe)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/de_2.c mame-0.145/src/mame/drivers/de_2.c --- mame-0.144/src/mame/drivers/de_2.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/de_2.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* DataEast/Sega Version 2 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: de_2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( de_2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( de_2_map, AS_PROGRAM, 8, de_2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( de_2 ) INPUT_PORTS_END -static MACHINE_RESET( de_2 ) +void de_2_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(de_2_map) - - MCFG_MACHINE_RESET( de_2 ) MACHINE_CONFIG_END /*----------------------------------------------------------------------------------- @@ -160,11 +171,11 @@ ROM_RELOAD( 0x30000, 0x10000) ROM_END -GAME(1989, mnfb_c27, 0, de_2, de_2, de_2, ROT0, "Data East", "Monday Night Football (2.7, 50cts)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, poto_a32, 0, de_2, de_2, de_2, ROT0, "Data East", "The Phantom of the Opera (3.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, play_a24, 0, de_2, de_2, de_2, ROT0, "Data East", "Playboy 35th Anniversary (2.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, robo_a34, 0, de_2, de_2, de_2, ROT0, "Data East", "Robocop (3.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, ssvc_a26, 0, de_2, de_2, de_2, ROT0, "Data East", "Secret Service (2.6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, tmac_a24, 0, de_2, de_2, de_2, ROT0, "Data East", "Time Machine (2.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, tmac_a18, tmac_a24, de_2, de_2, de_2, ROT0, "Data East", "Time Machine (1.8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, torp_e21, 0, de_2, de_2, de_2, ROT0, "Data East", "Torpedo Alley (2.1, Europe)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1989, mnfb_c27, 0, de_2, de_2, de_2, ROT0, "Data East", "Monday Night Football (2.7, 50cts)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, poto_a32, 0, de_2, de_2, de_2, ROT0, "Data East", "The Phantom of the Opera (3.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, play_a24, 0, de_2, de_2, de_2, ROT0, "Data East", "Playboy 35th Anniversary (2.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, robo_a34, 0, de_2, de_2, de_2, ROT0, "Data East", "Robocop (3.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, ssvc_a26, 0, de_2, de_2, de_2, ROT0, "Data East", "Secret Service (2.6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, tmac_a24, 0, de_2, de_2, de_2, ROT0, "Data East", "Time Machine (2.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, tmac_a18, tmac_a24, de_2, de_2, de_2, ROT0, "Data East", "Time Machine (1.8)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, torp_e21, 0, de_2, de_2, de_2, ROT0, "Data East", "Torpedo Alley (2.1, Europe)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/de_3b.c mame-0.145/src/mame/drivers/de_3b.c --- mame-0.144/src/mame/drivers/de_3b.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/de_3b.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* DataEast/Sega Version 3b */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" #include "audio/decobsmt.h" @@ -10,24 +13,30 @@ { public: de_3b_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_decobsmt(*this, "decobsmt") + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_decobsmt(*this, "decobsmt") { } + // devices required_device m_maincpu; required_device m_decobsmt; + +protected: + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( de_3b_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( de_3b_map, AS_PROGRAM, 8, de_3b_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( de_3b ) INPUT_PORTS_END -static MACHINE_RESET( de_3b ) +void de_3b_state::machine_reset() { } @@ -40,8 +49,6 @@ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(de_3b_map) - MCFG_MACHINE_RESET( de_3b ) - /* sound hardware */ MCFG_DECOBSMT_ADD(DECOBSMT_TAG) MACHINE_CONFIG_END @@ -391,28 +398,29 @@ ROM_REGION(0x1000000, "bsmt", ROMREGION_ERASE00) ROM_END -GAME(1995, batmanf, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (4.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, batmanf3, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (3.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_uk, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (English)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_cn, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Canadian)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_no, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Norwegian)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_sv, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Swedish)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_at, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Austrian)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_ch, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Swiss)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_de, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (German)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_be, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Belgian)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_fr, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (French)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_nl, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Dutch)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_it, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Italian)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_sp, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Spanish)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_jp, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Japanese)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bmf_time, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Timed Play)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, baywatch, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Baywatch", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, frankst, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Mary Shelley's Frankenstein", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, frankstg, frankst, de_3b, de_3b, de_3b, ROT0, "Sega", "Mary Shelley's Frankenstein (Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, mav_402, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, mav_401, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, mav_400, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, mav_100, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (1.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, detest, 0, de_3b, de_3b, de_3b, ROT0, "Data East", "Data East Test Chip", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ctcheese, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Cut The Cheese (Redemption)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1995, batmanf, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (4.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, batmanf3, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (3.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_uk, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (English)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_cn, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Canadian)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_no, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Norwegian)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_sv, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Swedish)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_at, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Austrian)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_ch, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Swiss)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_de, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (German)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_be, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Belgian)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_fr, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (French)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_nl, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Dutch)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_it, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Italian)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_sp, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Spanish)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_jp, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Japanese)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bmf_time, batmanf, de_3b, de_3b, de_3b, ROT0, "Sega", "Batman Forever (Timed Play)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, baywatch, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Baywatch", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, frankst, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Mary Shelley's Frankenstein", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, frankstg, frankst, de_3b, de_3b, de_3b, ROT0, "Sega", "Mary Shelley's Frankenstein (Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(1994, mav_402, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.02)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, mav_401, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, mav_400, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (Display Rev. 4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, mav_100, mav_402, de_3b, de_3b, de_3b, ROT0, "Sega", "Maverick (1.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, detest, 0, de_3b, de_3b, de_3b, ROT0, "Data East", "Data East Test Chip", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ctcheese, 0, de_3b, de_3b, de_3b, ROT0, "Sega", "Cut The Cheese (Redemption)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/de_3.c mame-0.145/src/mame/drivers/de_3.c --- mame-0.144/src/mame/drivers/de_3.c 2012-01-13 15:34:36.000000000 +0000 +++ mame-0.145/src/mame/drivers/de_3.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* DataEast/Sega Version 3 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" #include "audio/decobsmt.h" @@ -15,19 +18,25 @@ m_decobsmt(*this, "decobsmt") { } + // devices required_device m_maincpu; required_device m_decobsmt; + +protected: + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( de_3_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( de_3_map, AS_PROGRAM, 8, de_3_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( de_3 ) INPUT_PORTS_END -static MACHINE_RESET( de_3 ) +void de_3_state::machine_reset() { } @@ -40,8 +49,6 @@ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(de_3_map) - MCFG_MACHINE_RESET( de_3 ) - /* sound hardware */ MCFG_DECOBSMT_ADD(DECOBSMT_TAG) MACHINE_CONFIG_END @@ -785,54 +792,55 @@ ROM_LOAD("wfsndu36.400", 0x100000, 0x80000, CRC(39db8d85) SHA1(a55dd88fd4d9154b523dca9160bf96119af1f94d)) ROM_END -GAME(1983, rab_320, 0, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (3.20)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, rab_130, rab_320, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (1.30)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, rab_103, rab_320, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (1.03 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, aar_101, 0, de_3, de_3, de_3, ROT0, "Data East", "Aaron Spelling (1.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, bttf_a27, 0, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, bttf_a20, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, bttf_a21, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To The Future (2.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(199?, bttf_g27, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.7 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, btmn_103, 0, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, btmn_101, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, btmn_g13, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.03 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, btmn_106, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.06)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, ckpt_a17, 0, de_3, de_3, de_3, ROT0, "Data East", "Checkpoint (1.7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, gnr_300, 0, de_3, de_3, de_3, ROT0, "Data East", "Guns N Roses (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, hook_408, 0, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.08)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, hook_401, hook_408, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, hook_404, hook_408, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jupk_513, 0, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.13)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jupk_501, jupk_513, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jupk_g51, jupk_513, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, lah_112, 0, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.12)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, lah_l104, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.04 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, lah_l108, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.08 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, lah_110, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.10)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, lw3_208, 0, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.08)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, lw3_207, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.07 Canada)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, lw3_205, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.05)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, lw3_200, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, trek_201, 0, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (2.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, trek_200, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (2.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, trek_120, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.20)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, trek_110, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.10)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, trek_11a, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.10 Alpha Display)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, stwr_103, 0, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, stwr_g11, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, stwr_a14, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (Display Rev.1.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, stwr_102, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, stwr_e12, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.02 England)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tftc_303, 0, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tftc_302, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.02 Dutch)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tftc_300, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tftc_200, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (2.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tftc_104, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (1.04 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, tmnt_104, 0, de_3, de_3, de_3, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, tmnt_103, tmnt_104, de_3, de_3, de_3, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, simp_a27, 0, de_3, de_3, de_3, ROT0, "Data East", "The Simpsons (2.7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, simp_a20, simp_a27, de_3, de_3, de_3, ROT0, "Data East", "The Simpsons (2.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tomy_400, 0, de_3, de_3, de_3, ROT0, "Data East", "The Who's Tommy Pinball Wizard (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tomy_h30, tomy_400, de_3, de_3, de_3, ROT0, "Data East", "The Who's Tommy Pinball Wizard (3.00 Holland)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wwfr_106, 0, de_3, de_3, de_3, ROT0, "Data East", "WWF Royal Rumble (1.06)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wwfr_103, wwfr_106, de_3, de_3, de_3, ROT0, "Data East", "WWF Royal Rumble (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1983, rab_320, 0, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (3.20)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, rab_130, rab_320, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (1.30)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, rab_103, rab_320, de_3, de_3, de_3, ROT0, "Data East", "Adventures of Rocky and Bullwinkle and Friends (1.03 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, aar_101, 0, de_3, de_3, de_3, ROT0, "Data East", "Aaron Spelling (1.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, bttf_a27, 0, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, bttf_a20, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, bttf_a21, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To The Future (2.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(199?, bttf_g27, bttf_a27, de_3, de_3, de_3, ROT0, "Data East", "Back To the Future (2.7 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, btmn_103, 0, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.03)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, btmn_101, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, btmn_g13, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.03 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, btmn_106, btmn_103, de_3, de_3, de_3, ROT0, "Data East", "Batman (1.06)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, ckpt_a17, 0, de_3, de_3, de_3, ROT0, "Data East", "Checkpoint (1.7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, gnr_300, 0, de_3, de_3, de_3, ROT0, "Data East", "Guns N Roses (3.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, hook_408, 0, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.08)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, hook_401, hook_408, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, hook_404, hook_408, de_3, de_3, de_3, ROT0, "Data East", "Hook (4.04)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jupk_513, 0, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.13)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jupk_501, jupk_513, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jupk_g51, jupk_513, de_3, de_3, de_3, ROT0, "Data East", "Jurassic Park (5.01 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, lah_112, 0, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.12)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, lah_l104, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.04 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, lah_l108, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.08 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, lah_110, lah_112, de_3, de_3, de_3, ROT0, "Data East", "Last Action Hero (1.10)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, lw3_208, 0, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.08)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, lw3_207, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.07 Canada)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, lw3_205, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.05)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, lw3_200, lw3_208, de_3, de_3, de_3, ROT0, "Data East", "Lethal Weapon 3 (2.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, trek_201, 0, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (2.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, trek_200, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (2.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, trek_120, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.20)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, trek_110, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.10)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, trek_11a, trek_201, de_3, de_3, de_3, ROT0, "Data East", "Star Trek 25th Anniversary (1.10 Alpha Display)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, stwr_103, 0, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.03)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, stwr_g11, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.01 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, stwr_a14, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (Display Rev.1.04)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, stwr_102, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.02)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, stwr_e12, stwr_103, de_3, de_3, de_3, ROT0, "Data East", "Star Wars (1.02 England)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tftc_303, 0, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.03)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tftc_302, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.02 Dutch)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tftc_300, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (3.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tftc_200, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (2.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tftc_104, tftc_303, de_3, de_3, de_3, ROT0, "Data East", "Tales From the Crypt (1.04 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, tmnt_104, 0, de_3, de_3, de_3, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.04)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, tmnt_103, tmnt_104, de_3, de_3, de_3, ROT0, "Data East", "Teenage Mutant Ninja Turtles (1.03)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, simp_a27, 0, de_3, de_3, de_3, ROT0, "Data East", "The Simpsons (2.7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, simp_a20, simp_a27, de_3, de_3, de_3, ROT0, "Data East", "The Simpsons (2.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tomy_400, 0, de_3, de_3, de_3, ROT0, "Data East", "The Who's Tommy Pinball Wizard (4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tomy_h30, tomy_400, de_3, de_3, de_3, ROT0, "Data East", "The Who's Tommy Pinball Wizard (3.00 Holland)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wwfr_106, 0, de_3, de_3, de_3, ROT0, "Data East", "WWF Royal Rumble (1.06)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wwfr_103, wwfr_106, de_3, de_3, de_3, ROT0, "Data East", "WWF Royal Rumble (1.03)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/deadang.c mame-0.145/src/mame/drivers/deadang.c --- mame-0.144/src/mame/drivers/deadang.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/deadang.c 2012-02-06 21:30:42.000000000 +0000 @@ -251,10 +251,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(deadang) + MCFG_SCREEN_UPDATE_STATIC(deadang) MCFG_GFXDECODE(deadang) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/dec0.c mame-0.145/src/mame/drivers/dec0.c --- mame-0.144/src/mame/drivers/dec0.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/dec0.c 2012-02-06 21:30:37.000000000 +0000 @@ -1437,9 +1437,8 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) - MCFG_SCREEN_UPDATE(robocop) + MCFG_SCREEN_UPDATE_STATIC(robocop) MCFG_GFXDECODE(automat) @@ -1481,11 +1480,10 @@ MCFG_SCREEN_ADD("screen", RASTER) //MCFG_SCREEN_REFRESH_RATE(57.41) //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) //MCFG_SCREEN_SIZE(32*8, 32*8) //MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(hbarrel) + MCFG_SCREEN_UPDATE_STATIC(hbarrel) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( baddudes, dec0_base_sound ) @@ -1502,11 +1500,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(baddudes) + MCFG_SCREEN_UPDATE_STATIC(baddudes) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( birdtry, dec0_base_sound ) @@ -1523,11 +1520,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(birdtry) + MCFG_SCREEN_UPDATE_STATIC(birdtry) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( robocop, dec0_base_sound ) @@ -1549,11 +1545,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(robocop) + MCFG_SCREEN_UPDATE_STATIC(robocop) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( robocopb, dec0_base_sound ) @@ -1570,11 +1565,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(robocop) + MCFG_SCREEN_UPDATE_STATIC(robocop) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( hippodrm, dec0_base_sound ) @@ -1596,11 +1590,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(hippodrm) + MCFG_SCREEN_UPDATE_STATIC(hippodrm) MACHINE_CONFIG_END static MACHINE_RESET( slyspy ) @@ -1623,11 +1616,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(slyspy) + MCFG_SCREEN_UPDATE_STATIC(slyspy) MCFG_VIDEO_START(dec0_nodma) @@ -1651,11 +1643,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(robocop) + MCFG_SCREEN_UPDATE_STATIC(robocop) MCFG_GFXDECODE(secretab) MCFG_VIDEO_START(dec0_nodma) @@ -1675,11 +1666,10 @@ MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(57.41) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 57.41 Hz, 529us Vblank */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(DEC0_PIXEL_CLOCK,DEC0_HTOTAL,DEC0_HBEND,DEC0_HBSTART,DEC0_VTOTAL,DEC0_VBEND,DEC0_VBSTART) // MCFG_SCREEN_SIZE(32*8, 32*8) // MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(midres) + MCFG_SCREEN_UPDATE_STATIC(midres) MCFG_GFXDECODE(midres) MCFG_VIDEO_START(dec0_nodma) diff -Nru mame-0.144/src/mame/drivers/dec8.c mame-0.145/src/mame/drivers/dec8.c --- mame-0.144/src/mame/drivers/dec8.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dec8.c 2012-02-06 21:30:38.000000000 +0000 @@ -65,10 +65,14 @@ } /* Only used by ghostb, gondo, garyoret, other games can control buffering */ -static SCREEN_EOF( dec8 ) +static SCREEN_VBLANK( dec8 ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - dec8_mxc06_karn_buffer_spriteram_w(space, 0, 0); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + dec8_mxc06_karn_buffer_spriteram_w(space, 0, 0); + } } static READ8_HANDLER( i8751_h_r ) @@ -2020,10 +2024,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cobracom) + MCFG_SCREEN_UPDATE_STATIC(cobracom) MCFG_GFXDECODE(cobracom) MCFG_PALETTE_LENGTH(256) @@ -2073,11 +2076,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(ghostb) - MCFG_SCREEN_EOF(dec8) + MCFG_SCREEN_UPDATE_STATIC(ghostb) + MCFG_SCREEN_VBLANK_STATIC(dec8) MCFG_GFXDECODE(ghostb) MCFG_PALETTE_LENGTH(1024) @@ -2130,10 +2132,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(oscar) + MCFG_SCREEN_UPDATE_STATIC(oscar) MCFG_GFXDECODE(oscar) MCFG_PALETTE_LENGTH(512) @@ -2175,10 +2176,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(srdarwin) + MCFG_SCREEN_UPDATE_STATIC(srdarwin) MCFG_GFXDECODE(srdarwin) MCFG_PALETTE_LENGTH(144) @@ -2225,11 +2225,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(gondo) - MCFG_SCREEN_EOF(dec8) + MCFG_SCREEN_UPDATE_STATIC(gondo) + MCFG_SCREEN_VBLANK_STATIC(dec8) MCFG_GFXDECODE(gondo) MCFG_PALETTE_LENGTH(1024) @@ -2276,10 +2275,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(lastmisn) + MCFG_SCREEN_UPDATE_STATIC(lastmisn) MCFG_GFXDECODE(shackled) MCFG_PALETTE_LENGTH(1024) @@ -2326,10 +2324,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(shackled) + MCFG_SCREEN_UPDATE_STATIC(shackled) MCFG_GFXDECODE(shackled) MCFG_PALETTE_LENGTH(1024) @@ -2377,10 +2374,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(lastmisn) + MCFG_SCREEN_UPDATE_STATIC(lastmisn) MCFG_GFXDECODE(shackled) MCFG_PALETTE_LENGTH(1024) @@ -2428,11 +2424,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(garyoret) - MCFG_SCREEN_EOF(dec8) + MCFG_SCREEN_UPDATE_STATIC(garyoret) + MCFG_SCREEN_VBLANK_STATIC(dec8) MCFG_GFXDECODE(gondo) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/deco156.c mame-0.145/src/mame/drivers/deco156.c --- mame-0.144/src/mame/drivers/deco156.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/deco156.c 2012-02-06 21:30:36.000000000 +0000 @@ -56,20 +56,20 @@ } -static SCREEN_UPDATE( wcvol95 ) +static SCREEN_UPDATE_RGB32( wcvol95 ) { //FIXME: flip_screen_x should not be written! - flip_screen_set_no_update(screen->machine(), 1); + flip_screen_set_no_update(screen.machine(), 1); - deco156_state *state = screen->machine().driver_data(); + deco156_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - bitmap_fill(bitmap, NULL, 0); + screen.machine().priority_bitmap.fill(0); + bitmap.fill(0); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x800); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x800); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(wcvol95) + MCFG_SCREEN_UPDATE_STATIC(wcvol95) MCFG_GFXDECODE(hvysmsh) MCFG_PALETTE_LENGTH(1024) @@ -389,10 +388,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(wcvol95) + MCFG_SCREEN_UPDATE_STATIC(wcvol95) MCFG_GFXDECODE(hvysmsh) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/deco32.c mame-0.145/src/mame/drivers/deco32.c --- mame-0.144/src/mame/drivers/deco32.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/deco32.c 2012-02-06 21:30:38.000000000 +0000 @@ -225,7 +225,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/arm/arm.h" #include "cpu/h6280/h6280.h" #include "cpu/m6809/m6809.h" @@ -275,22 +274,6 @@ -#if 0 -static WRITE32_HANDLER( deco32_pf12_control_w ) -{ - deco32_state *state = space->machine().driver_data(); - COMBINE_DATA(&state->m_pf12_control[offset]); - space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); -} - - -static WRITE32_HANDLER( deco32_pf34_control_w ) -{ - deco32_state *state = space->machine().driver_data(); - COMBINE_DATA(&state->m_pf34_control[offset]); - space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); -} -#endif static TIMER_DEVICE_CALLBACK( interrupt_gen ) @@ -300,6 +283,7 @@ static READ32_HANDLER( deco32_irq_controller_r ) { + deco32_state *state = space->machine().driver_data(); int vblank; switch (offset) @@ -326,7 +310,7 @@ if (vblank) return 0xffffff80 | 0x1 | 0x10; /* Assume VBL takes priority over possible raster/lightgun irq */ - return 0xffffff80 | vblank | (cpu_getiloops(&space->device()) ? 0x40 : 0x20); + return 0xffffff80 | vblank | ((state->m_irq_source) ? 0x40 : 0x20); // return 0xffffff80 | vblank | (0x40); //test for lock load guns } @@ -349,8 +333,7 @@ scanline=(data&0xff); if (state->m_raster_enable && scanline>0 && scanline<240) { - // needs +16 for the raster to align on captaven intro? (might just be our screen size / visible area / layer offsets need adjusting instead) - state->m_raster_irq_timer->adjust(space->machine().primary_screen->time_until_pos(scanline+16, 320)); + state->m_raster_irq_timer->adjust(space->machine().primary_screen->time_until_pos(scanline-1, 0)); } else state->m_raster_irq_timer->reset(); @@ -1768,11 +1751,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(captaven) - MCFG_SCREEN_EOF(captaven) + MCFG_SCREEN_UPDATE_STATIC(captaven) + MCFG_SCREEN_VBLANK_STATIC(captaven) MCFG_GFXDECODE(captaven) MCFG_PALETTE_LENGTH(2048) @@ -1820,10 +1802,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(fghthist) + MCFG_SCREEN_UPDATE_STATIC(fghthist) MCFG_GFXDECODE(fghthist) MCFG_PALETTE_LENGTH(2048) @@ -1867,10 +1848,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(fghthist) + MCFG_SCREEN_UPDATE_STATIC(fghthist) MCFG_GFXDECODE(fghthist) MCFG_PALETTE_LENGTH(2048) @@ -1983,11 +1963,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dragngun) - MCFG_SCREEN_EOF(dragngun) + MCFG_SCREEN_UPDATE_STATIC(dragngun) + MCFG_SCREEN_VBLANK_STATIC(dragngun) MCFG_DECO16IC_ADD("tilegen1", dragngun_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", dragngun_deco16ic_tilegen2_intf) @@ -2018,12 +1997,31 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MACHINE_CONFIG_END +static TIMER_DEVICE_CALLBACK( lockload_vbl_irq ) +{ + deco32_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 31*8) + { + state->m_irq_source = 0; + device_set_input_line(state->m_maincpu, ARM_IRQ_LINE, HOLD_LINE); + } + + if(scanline == 0) + { + state->m_irq_source = 1; + device_set_input_line(state->m_maincpu, ARM_IRQ_LINE, HOLD_LINE); + } +} + + static MACHINE_CONFIG_START( lockload, dragngun_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", ARM, 28000000/4) MCFG_CPU_PROGRAM_MAP(lockload_map) - MCFG_CPU_VBLANK_INT_HACK(deco32_vbl_interrupt,2) // From 2 + MCFG_TIMER_ADD_SCANLINE("scantimer", lockload_vbl_irq, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", H6280, 32220000/8) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -2038,11 +2036,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(42*8, 32*8) + MCFG_SCREEN_SIZE(42*8, 32*8+22) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dragngun) - MCFG_SCREEN_EOF(dragngun) + MCFG_SCREEN_UPDATE_STATIC(dragngun) + MCFG_SCREEN_VBLANK_STATIC(dragngun) MCFG_DECO16IC_ADD("tilegen1", lockload_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", lockload_deco16ic_tilegen2_intf) @@ -2117,11 +2114,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(nslasher) + MCFG_SCREEN_UPDATE_STATIC(nslasher) MCFG_DECO16IC_ADD("tilegen1", tattass_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", tattass_deco16ic_tilegen2_intf) @@ -2158,10 +2154,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(42*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(nslasher) + MCFG_SCREEN_UPDATE_STATIC(nslasher) MCFG_DECO16IC_ADD("tilegen1", tattass_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", tattass_deco16ic_tilegen2_intf) @@ -2616,19 +2611,21 @@ ROM_LOAD32_BYTE( "mar-15.bin", 0x000003, 0x100000, CRC(ec976b20) SHA1(c120b3c56d5e02162e41dc7f726c260d0f8d2f1a) ) ROM_LOAD32_BYTE( "mar-16.bin", 0x400003, 0x100000, CRC(8b329bc8) SHA1(6e34eb6e2628a01a699d20a5155afb2febc31255) ) - ROM_REGION( 0x100000, "gfx5", 0 ) /* Video data - unused for now */ - ROM_LOAD( "mar-17.bin", 0x00000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) - ROM_LOAD( "mar-18.bin", 0x00000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) ) - ROM_LOAD( "mar-19.bin", 0x00000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) ) - ROM_LOAD( "mar-20.bin", 0x00000, 0x100000, CRC(fa0462f0) SHA1(1a52617ad4d7abebc0f273dd979f4cf2d6a0306b) ) - ROM_LOAD( "mar-21.bin", 0x00000, 0x100000, CRC(2d0a28ae) SHA1(d87f6f71bb76880e4d4f1eab8e0451b5c3df69a5) ) - ROM_LOAD( "mar-22.bin", 0x00000, 0x100000, CRC(c85f3559) SHA1(a5d5cf9b18c9ef6a92d7643ca1ec9052de0d4a01) ) - ROM_LOAD( "mar-23.bin", 0x00000, 0x100000, CRC(ba907d6a) SHA1(1fd99b66e6297c8d927c1cf723a613b4ee2e2f90) ) - ROM_LOAD( "mar-24.bin", 0x00000, 0x100000, CRC(5cec45c8) SHA1(f99a26afaca9d9320477e469b09e3873bc8c156f) ) - ROM_LOAD( "mar-25.bin", 0x00000, 0x100000, CRC(d65d895c) SHA1(4508dfff95a7aff5109dc74622cbb4503b0b5840) ) - ROM_LOAD( "mar-26.bin", 0x00000, 0x100000, CRC(246a06c5) SHA1(447252be976a5059925f4ad98df8564b70198f62) ) - ROM_LOAD( "mar-27.bin", 0x00000, 0x100000, CRC(3fcbd10f) SHA1(70fc7b88bbe35bbae1de14364b03d0a06d541de5) ) - ROM_LOAD( "mar-28.bin", 0x00000, 0x100000, CRC(5a2ec71d) SHA1(447c404e6bb696f7eb7c61992a99b9be56f5d6b0) ) + // this is standard DVI data, see http://www.fileformat.info/format/dvi/egff.htm + // there are DVI headers at 0x000000, 0x580000, 0x800000, 0xB10000, 0xB80000 + ROM_REGION( 0xc00000, "dvi", 0 ) /* Video data - unused for now */ + ROM_LOAD32_BYTE( "mar-17.bin", 0x000000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) // 56 V / 41 A + ROM_LOAD32_BYTE( "mar-20.bin", 0x000001, 0x100000, CRC(fa0462f0) SHA1(1a52617ad4d7abebc0f273dd979f4cf2d6a0306b) ) // 44 D / 56 V + ROM_LOAD32_BYTE( "mar-28.bin", 0x000002, 0x100000, CRC(5a2ec71d) SHA1(447c404e6bb696f7eb7c61992a99b9be56f5d6b0) ) // 56 V / 53 S + ROM_LOAD32_BYTE( "mar-25.bin", 0x000003, 0x100000, CRC(d65d895c) SHA1(4508dfff95a7aff5109dc74622cbb4503b0b5840) ) // 49 I / 53 S + ROM_LOAD32_BYTE( "mar-18.bin", 0x400000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) ) + ROM_LOAD32_BYTE( "mar-21.bin", 0x400001, 0x100000, CRC(2d0a28ae) SHA1(d87f6f71bb76880e4d4f1eab8e0451b5c3df69a5) ) + ROM_LOAD32_BYTE( "mar-27.bin", 0x400002, 0x100000, CRC(3fcbd10f) SHA1(70fc7b88bbe35bbae1de14364b03d0a06d541de5) ) + ROM_LOAD32_BYTE( "mar-24.bin", 0x400003, 0x100000, CRC(5cec45c8) SHA1(f99a26afaca9d9320477e469b09e3873bc8c156f) ) + ROM_LOAD32_BYTE( "mar-19.bin", 0x800000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) ) // 56 V / 41 A + ROM_LOAD32_BYTE( "mar-22.bin", 0x800001, 0x100000, CRC(c85f3559) SHA1(a5d5cf9b18c9ef6a92d7643ca1ec9052de0d4a01) ) // 44 D / 56 V + ROM_LOAD32_BYTE( "mar-26.bin", 0x800002, 0x100000, CRC(246a06c5) SHA1(447252be976a5059925f4ad98df8564b70198f62) ) // 56 V / 53 S + ROM_LOAD32_BYTE( "mar-23.bin", 0x800003, 0x100000, CRC(ba907d6a) SHA1(1fd99b66e6297c8d927c1cf723a613b4ee2e2f90) ) // 49 I / 53 S ROM_REGION(0x80000, "oki1", 0 ) ROM_LOAD( "mar-06.n17", 0x000000, 0x80000, CRC(3e006c6e) SHA1(55786e0fde2bf6ba9802f3f4fa8d4c21625b976a) ) @@ -2776,19 +2773,19 @@ ROM_LOAD( "ve-01.4d", 0x0200, 0x0104, NO_DUMP ) /* PAL16L8 is read protected */ ROM_END -ROM_START( lockload ) /* Board No. DE-0420-1 + Bottom board DE-0421-0 slightly different hardware, likely a unique PCB and not a Dragongun conversion */ +ROM_START( lockload ) /* Board No. DE-0420-1 + Bottom board DE-0421-0 slightly different hardware, a unique PCB and not a Dragongun conversion */ ROM_REGION(0x400000, "maincpu", 0 ) /* ARM 32 bit code */ - ROM_LOAD32_BYTE( "nl-00-1.b5", 0x000002, 0x80000, CRC(7a39bf8d) SHA1(8b1a6407bab74b3960a243a6c04c0005a82126f1) ) - ROM_LOAD32_BYTE( "nl-01-1.b8", 0x000000, 0x80000, CRC(d23afcb7) SHA1(de7b5bc936a87cc6511d588b0bf082bbf745581c) ) - ROM_LOAD32_BYTE( "nl-02-1.d5", 0x000003, 0x80000, CRC(730e0168) SHA1(fdfa0d335c03c2c528326f90948e642f9ea43150) ) + ROM_LOAD32_BYTE( "nl-00-1.a6", 0x000002, 0x80000, CRC(7a39bf8d) SHA1(8b1a6407bab74b3960a243a6c04c0005a82126f1) ) + ROM_LOAD32_BYTE( "nl-01-1.a8", 0x000000, 0x80000, CRC(d23afcb7) SHA1(de7b5bc936a87cc6511d588b0bf082bbf745581c) ) + ROM_LOAD32_BYTE( "nl-02-1.d6", 0x000003, 0x80000, CRC(730e0168) SHA1(fdfa0d335c03c2c528326f90948e642f9ea43150) ) ROM_LOAD32_BYTE( "nl-03-1.d8", 0x000001, 0x80000, CRC(51a53ece) SHA1(ee2c8858844a47fa1e83c30c06d78cf49219dc33) ) ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */ - ROM_LOAD( "nm-06-.n22", 0x00000, 0x10000, CRC(31d1c245) SHA1(326e35e7ebd8ea761d90e856c50d86512327f2a5) ) + ROM_LOAD( "nm-06-.p22", 0x00000, 0x10000, CRC(31d1c245) SHA1(326e35e7ebd8ea761d90e856c50d86512327f2a5) ) ROM_REGION( 0x020000, "gfx1", 0 ) - ROM_LOAD16_BYTE( "nl-04-.b15", 0x00000, 0x10000, CRC(f097b3d9) SHA1(5748de9a796afddd78dad7f5c184269ee533c51c) ) /* Encrypted tiles */ - ROM_LOAD16_BYTE( "nl-05-.b17", 0x00001, 0x10000, CRC(448fec1e) SHA1(9a107959621cbb3688fd3ad9a8320aa5584f7d13) ) + ROM_LOAD16_BYTE( "nl-04-.a15", 0x00000, 0x10000, CRC(f097b3d9) SHA1(5748de9a796afddd78dad7f5c184269ee533c51c) ) /* Encrypted tiles */ + ROM_LOAD16_BYTE( "nl-05-.a17", 0x00001, 0x10000, CRC(448fec1e) SHA1(9a107959621cbb3688fd3ad9a8320aa5584f7d13) ) ROM_REGION( 0x100000, "gfx2", 0 ) ROM_LOAD( "mbm-00.d15", 0x00000, 0x80000, CRC(b97de8ff) SHA1(59508f7135af22c2ac89db78874b1e8a68c53434) ) /* Encrypted tiles */ @@ -2838,7 +2835,7 @@ ROM_LOAD32_BYTE( "mbm-14.a23", 0x000003, 0x100000, CRC(5aaaf929) SHA1(5ee30db9b83db664d77e6b5e0988ce3366460df6) ) ROM_LOAD32_BYTE( "mbm-15.a25", 0x400003, 0x100000, CRC(789ce7b1) SHA1(3fb390ce0620ce7a63f7f46eac1ff0eb8ed76d26) ) - ROM_REGION( 0x100000, "gfx5", ROMREGION_ERASE00 ) /* Video data - unique PCB and this region is not used? */ + ROM_REGION( 0xc00000, "dvi", ROMREGION_ERASE00 ) /* Video data - unique PCB and this region is not used? */ ROM_REGION(0x100000, "oki1", 0 ) ROM_LOAD( "mbm-06.n17", 0x00000, 0x100000, CRC(f34d5999) SHA1(265b5f4e8598bcf9183bf9bd95db69b01536acb2) ) @@ -2849,7 +2846,80 @@ ROM_LOAD( "mbm-07.n19", 0x00000, 0x80000, CRC(414f3793) SHA1(ed5f63e57390d503193fd1e9f7294ae1da6d3539) ) /* Does this go here or "oki2" ?? */ ROM_END -ROM_START( lockloadu ) +ROM_START( gunhard ) /* Board No. DE-0420-1 + Bottom board DE-0421-0 slightly different hardware, a unique PCB and not a Dragongun conversion */ + ROM_REGION(0x400000, "maincpu", 0 ) /* ARM 32 bit code */ + ROM_LOAD32_BYTE( "nf-00-1.a6", 0x000002, 0x80000, CRC(2c8045d4) SHA1(4c900951d56bd22e30905969b8eb687d9b4363bd) ) + ROM_LOAD32_BYTE( "nf-01-1.a8", 0x000000, 0x80000, CRC(6f160117) SHA1(05738f61890e9d6d2b25330958c0e7369f2ff4a6) ) + ROM_LOAD32_BYTE( "nf-02-1.d6", 0x000003, 0x80000, CRC(bd353948) SHA1(ddcc12b3d1c8919eb7eb961d61f6286e6b37a58e) ) + ROM_LOAD32_BYTE( "nf-03-1.d8", 0x000001, 0x80000, CRC(118a9a72) SHA1(e0b2fd21f477e531d6a04256767874f13e031a48) ) + + ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */ + ROM_LOAD( "nj-06-1.p22", 0x00000, 0x10000, CRC(31d1c245) SHA1(326e35e7ebd8ea761d90e856c50d86512327f2a5) ) + + ROM_REGION( 0x020000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "nf-04-1.a15", 0x00000, 0x10000, CRC(f097b3d9) SHA1(5748de9a796afddd78dad7f5c184269ee533c51c) ) /* Encrypted tiles */ + ROM_LOAD16_BYTE( "nf-05-1.a17", 0x00001, 0x10000, CRC(448fec1e) SHA1(9a107959621cbb3688fd3ad9a8320aa5584f7d13) ) + + ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_LOAD( "mbm-00.d15", 0x00000, 0x80000, CRC(b97de8ff) SHA1(59508f7135af22c2ac89db78874b1e8a68c53434) ) /* Encrypted tiles */ + ROM_LOAD( "mbm-01.d17", 0x80000, 0x80000, CRC(6d4b8fa0) SHA1(56e2b9adb4d010ba2592eccba654a24141441141) ) + + ROM_REGION( 0x800000, "gfx3", 0 ) + ROM_LOAD( "mbm-02.b21", 0x000000, 0x40000, CRC(e723019f) SHA1(15361d3e6db5707a7f0ead4254463c50163c864c) ) /* Encrypted tiles 0/4 */ + ROM_CONTINUE( 0x200000, 0x40000 ) /* 2 bpp per 0x40000 chunk, 1/4 */ + ROM_CONTINUE( 0x400000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x600000, 0x40000 ) /* 3/4 */ + ROM_CONTINUE( 0x040000, 0x40000 ) /* Next block 2bpp 0/4 */ + ROM_CONTINUE( 0x240000, 0x40000 ) /* 1/4 */ + ROM_CONTINUE( 0x440000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x640000, 0x40000 ) /* 3/4 */ + ROM_LOAD( "mbm-03.b22", 0x080000, 0x40000, CRC(e0d09894) SHA1(be2faa81cf92b6fadfb2ec4ca2173157b05071ec) ) /* Encrypted tiles 0/4 */ + ROM_CONTINUE( 0x280000, 0x40000 ) /* 2 bpp per 0x40000 chunk, 1/4 */ + ROM_CONTINUE( 0x480000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x680000, 0x40000 ) /* 3/4 */ + ROM_CONTINUE( 0x0c0000, 0x40000 ) /* Next block 2bpp 0/4 */ + ROM_CONTINUE( 0x2c0000, 0x40000 ) /* 1/4 */ + ROM_CONTINUE( 0x4c0000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x6c0000, 0x40000 ) /* 3/4 */ + ROM_LOAD( "mbm-04.e21", 0x100000, 0x40000, CRC(9e12466f) SHA1(51eaadfaf45d02d72b61052a606f97f36b3964fd) ) /* Encrypted tiles 0/4 */ + ROM_CONTINUE( 0x300000, 0x40000 ) /* 2 bpp per 0x40000 chunk, 1/4 */ + ROM_CONTINUE( 0x500000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x700000, 0x40000 ) /* 3/4 */ + ROM_CONTINUE( 0x140000, 0x40000 ) /* Next block 2bpp 0/4 */ + ROM_CONTINUE( 0x340000, 0x40000 ) /* 1/4 */ + ROM_CONTINUE( 0x540000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x740000, 0x40000 ) /* 3/4 */ + ROM_LOAD( "mbm-05.e22", 0x180000, 0x40000, CRC(6ff02dc0) SHA1(5862e2189a09f963d5ec58ca4aa1c06210a3c7ef) ) /* Encrypted tiles 0/4 */ + ROM_CONTINUE( 0x380000, 0x40000 ) /* 2 bpp per 0x40000 chunk, 1/4 */ + ROM_CONTINUE( 0x580000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x780000, 0x40000 ) /* 3/4 */ + ROM_CONTINUE( 0x1c0000, 0x40000 ) /* Next block 2bpp 0/4 */ + ROM_CONTINUE( 0x3c0000, 0x40000 ) /* 1/4 */ + ROM_CONTINUE( 0x5c0000, 0x40000 ) /* 2/4 */ + ROM_CONTINUE( 0x7c0000, 0x40000 ) /* 3/4 */ + + ROM_REGION( 0x800000, "gfx4", 0 ) + ROM_LOAD32_BYTE( "mbm-08.a14", 0x000000, 0x100000, CRC(5358a43b) SHA1(778637fc63a0957338c7da3adb2555ffada177c4) ) + ROM_LOAD32_BYTE( "mbm-09.a16", 0x400000, 0x100000, CRC(2cce162f) SHA1(db5795465a36971861e8fb7436db0805717ad101) ) + ROM_LOAD32_BYTE( "mbm-10.a19", 0x000001, 0x100000, CRC(232e1c91) SHA1(868d4eb4873ecc210cbb3a266cae0b6ad8f11add) ) + ROM_LOAD32_BYTE( "mbm-11.a20", 0x400001, 0x100000, CRC(8a2a2a9f) SHA1(d11e0ea2785e35123bc56a8f18ce22f58432b599) ) + ROM_LOAD32_BYTE( "mbm-12.a21", 0x000002, 0x100000, CRC(7d221d66) SHA1(25c9c20485e443969c0bf4d74c4211c3881dabcd) ) + ROM_LOAD32_BYTE( "mbm-13.a22", 0x400002, 0x100000, CRC(678b9052) SHA1(ae8fc921813e53e9dbc3960e772c1c4de94c22a7) ) + ROM_LOAD32_BYTE( "mbm-14.a23", 0x000003, 0x100000, CRC(5aaaf929) SHA1(5ee30db9b83db664d77e6b5e0988ce3366460df6) ) + ROM_LOAD32_BYTE( "mbm-15.a25", 0x400003, 0x100000, CRC(789ce7b1) SHA1(3fb390ce0620ce7a63f7f46eac1ff0eb8ed76d26) ) + + ROM_REGION( 0xc00000, "dvi", ROMREGION_ERASE00 ) /* Video data - unique PCB and this region is not used? */ + + ROM_REGION(0x100000, "oki1", 0 ) + ROM_LOAD( "mbm-06.n17", 0x00000, 0x100000, CRC(f34d5999) SHA1(265b5f4e8598bcf9183bf9bd95db69b01536acb2) ) + + ROM_REGION(0x80000, "oki2", ROMREGION_ERASE00 ) /* Sound data - unique PCB and this region is not used? */ + + ROM_REGION(0x80000, "oki3", 0 ) + ROM_LOAD( "mbm-07.n19", 0x00000, 0x80000, CRC(414f3793) SHA1(ed5f63e57390d503193fd1e9f7294ae1da6d3539) ) /* Does this go here or "oki2" ?? */ +ROM_END + +ROM_START( lockloadu ) /* Board No. DE-0359-2 + Bottom board DE-0360-4, a Dragongun conversion */ ROM_REGION(0x400000, "maincpu", 0 ) /* ARM 32 bit code */ ROM_LOAD32_BYTE( "nh-00-0.b5", 0x000002, 0x80000, CRC(b8a57164) SHA1(b700a08db2ad1aa1bf0a32635ffbd5d3f08713ee) ) ROM_LOAD32_BYTE( "nh-01-0.b8", 0x000000, 0x80000, CRC(e371ac50) SHA1(c448b54bc8962844b490994607b21b0c806d7714) ) @@ -2911,7 +2981,7 @@ ROM_LOAD32_BYTE( "mbm-14.a23", 0x000003, 0x100000, CRC(5aaaf929) SHA1(5ee30db9b83db664d77e6b5e0988ce3366460df6) ) ROM_LOAD32_BYTE( "mbm-15.a25", 0x400003, 0x100000, CRC(789ce7b1) SHA1(3fb390ce0620ce7a63f7f46eac1ff0eb8ed76d26) ) - ROM_REGION( 0x100000, "gfx5", ROMREGION_ERASE00 ) /* Video data - same as Dragongun, probably leftover from a conversion */ + ROM_REGION( 0xc00000, "dvi", ROMREGION_ERASE00 ) /* Video data - same as Dragongun, probably leftover from a conversion */ // ROM_LOAD( "mar-17.bin", 0x00000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) // ROM_LOAD( "mar-18.bin", 0x00000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) ) // ROM_LOAD( "mar-19.bin", 0x00000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) ) @@ -3203,6 +3273,22 @@ memcpy(DST_RAM+0x110000,SRC_RAM+0x10000,0x10000); ROM[0x1b32c/4]=0xe1a00000;// NOP test switch lock + + /* + { + UINT8 *ROM = machine.region("dvi")->base(); + + FILE *fp; + char filename[256]; + sprintf(filename,"video.dvi"); + fp=fopen(filename, "w+b"); + if (fp) + { + fwrite(ROM, 0xc00000, 1, fp); + fclose(fp); + } + } + */ } static DRIVER_INIT( fghthist ) @@ -3295,6 +3381,7 @@ GAME( 1993, fghthista, fghthist, fghthsta, fghthist, fghthist, ROT0, "Data East Corporation", "Fighter's History (US ver 42-05, alternate hardware)", GAME_UNEMULATED_PROTECTION ) GAME( 1993, fghthistj, fghthist, fghthist, fghthist, fghthist, ROT0, "Data East Corporation", "Fighter's History (Japan ver 42-03)", GAME_UNEMULATED_PROTECTION ) GAME( 1994, lockload, 0, lockload, lockload, lockload, ROT0, "Data East Corporation", "Locked 'n Loaded (World)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) +GAME( 1994, gunhard, lockload, lockload, lockload, lockload, ROT0, "Data East Corporation", "Gun Hard (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAME( 1994, lockloadu, lockload, lockload, lockload, lockload, ROT0, "Data East Corporation", "Locked 'n Loaded (US)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAME( 1994, tattass, 0, tattass, tattass, tattass, ROT0, "Data East Pinball", "Tattoo Assassins (US prototype)", GAME_IMPERFECT_GRAPHICS ) GAME( 1994, tattassa, tattass, tattass, tattass, tattass, ROT0, "Data East Pinball", "Tattoo Assassins (Asia prototype)", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/decocass.c mame-0.145/src/mame/drivers/decocass.c --- mame-0.144/src/mame/drivers/decocass.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/decocass.c 2012-02-06 21:30:39.000000000 +0000 @@ -10,6 +10,8 @@ Fabio Priuli Lord Nightmare The Dumping Union + Team Japump!!! + Hau The DECO cassette system consists of three PCBS in a card cage: Early boardset: (1980-1983) (proms unknown for this boardset, no schematics for this boardset) @@ -393,7 +395,7 @@ /* Switches 5, 6, 7 & 8 are listed as "Special Purpose" and "Don't Change" */ INPUT_PORTS_END -static INPUT_PORTS_START( cprosocc ) +static INPUT_PORTS_START( cpsoccer ) PORT_INCLUDE( decocass ) PORT_MODIFY("DSW2") @@ -648,9 +650,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(HCLK, 384, 8, 248, 272, 8, 248) - MCFG_SCREEN_UPDATE(decocass) + MCFG_SCREEN_UPDATE_STATIC(decocass) MCFG_GFXDECODE(decocass) MCFG_PALETTE_LENGTH(32+2*8+2*4) @@ -830,10 +831,10 @@ MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( cprosocc, decocass ) +static MACHINE_CONFIG_DERIVED( cpsoccer, decocass ) /* basic machine hardware */ - MCFG_MACHINE_RESET(cprosocc) + MCFG_MACHINE_RESET(cpsoccer) MACHINE_CONFIG_END @@ -874,23 +875,7 @@ MACHINE_CONFIG_END -#define ROM_LOAD_BIOS(bios,name,offset,length,hash) \ - ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios+1)) /* Note '+1' */ - - -#define DECOCASS_BIOS \ - ROM_REGION( 0x10000, "maincpu", 0 ) \ - ROM_SYSTEM_BIOS( 0, "bios1", "rms8.7e, New boardset bios, revision B" ) \ - ROM_LOAD_BIOS( 0, "rms8.7e", 0xf000, 0x1000, CRC(23d929b7) SHA1(063f83020ba3d6f43ab8471f95ca919767b93aa4) ) /* from RMS-8 board: 2732 EPROM @7E w/unknown label (probably 'V0B', needs checking; has HDRB01HDR string in it), bios code */ \ - ROM_SYSTEM_BIOS( 1, "bios0", "v0a.7e, New boardset bios, revision A" ) \ - ROM_LOAD_BIOS( 1, "v0a.7e", 0xf000, 0x1000, CRC(3D33AC34) SHA1(909D59E7A993AFFD10224402B4370E82A5F5545C) ) /* from RMS-8 board: 2732 EPROM @7E w/'V0A' label (has HDRA01HDR string inside it), bios code; doesn't seem to work properly yet (gives cassette 01 error, might use a different mcu revision?) */ \ - ROM_SYSTEM_BIOS( 2, "bios2", "dsp3.p0b/p1b, Old boardset bios, revision B?" ) /* from DSP-3 board? has HDRB01x string in it, 2x 2716 EPROM? */ \ - ROM_LOAD_BIOS( 2, "dsp3.p0b", 0xf000, 0x0800, CRC(b67a91d9) SHA1(681c040be0f0ed1ba0a50161b36d0ad8e1c8c5cb) ) \ - ROM_LOAD_BIOS( 2, "dsp3.p1b", 0xf800, 0x0800, CRC(3bfff5f3) SHA1(4e9437cb1b76d64da6b37f01bd6e879fb399e8ce) ) \ - #define DECOCASS_COMMON_ROMS \ - DECOCASS_BIOS \ -\ ROM_REGION( 0x10000, "audiocpu", 0 ) \ ROM_LOAD( "v1.5a", 0xf800, 0x0800, CRC(b66b2c2a) SHA1(0097f38beb4872e735e560148052e258a26b08fd) ) /* from RMS-8 board: 2716 eprom @5A w/V1 label, contains audio cpu code */ \ \ @@ -903,8 +888,36 @@ ROM_LOAD( "v3.3j", 0x0040, 0x0020, CRC(51eef657) SHA1(eaedce5caf55624ad6ae706aedf82c5717c60f1f) ) /* from RMS-8 board: M3-7603-5 (82s123 equiv, 32x8 TS) PROM @3J w/'V3' stamp, handles DRAM banking and timing */ \ +#define DECOCASS_BIOS_A_ROMS \ + /* v0a.7e, New boardset bios, revision A */ \ +\ + ROM_REGION( 0x10000, "maincpu", 0 ) \ + ROM_LOAD( "v0a.7e", 0xf000, 0x1000, CRC(3D33AC34) SHA1(909D59E7A993AFFD10224402B4370E82A5F5545C) ) /* from RMS-8 board: 2732 EPROM @7E w/'V0A' label (has HDRA01HDR string inside it), bios code */ \ +\ + DECOCASS_COMMON_ROMS \ + + +#define DECOCASS_BIOS_B_ROMS \ + /* rms8.7e, New boardset bios, revision B */ \ +\ + ROM_REGION( 0x10000, "maincpu", 0 ) \ + ROM_LOAD( "rms8.7e", 0xf000, 0x1000, CRC(23d929b7) SHA1(063f83020ba3d6f43ab8471f95ca919767b93aa4) ) /* from RMS-8 board: 2732 EPROM @7E w/unknown label (probably 'V0B', needs checking; has HDRB01HDR string in it), bios code */ \ +\ + DECOCASS_COMMON_ROMS \ + + +#define DECOCASS_BIOS_B2_ROMS \ + /* dsp3.p0b/p1b, Old boardset bios, revision B?; from DSP-3 board? has HDRB01x string in it, 2x 2716 EPROM? */ \ +\ + ROM_REGION( 0x10000, "maincpu", 0 ) \ + ROM_LOAD( "dsp3.p0b", 0xf000, 0x0800, CRC(b67a91d9) SHA1(681c040be0f0ed1ba0a50161b36d0ad8e1c8c5cb) ) \ + ROM_LOAD( "dsp3.p1b", 0xf800, 0x0800, CRC(3bfff5f3) SHA1(4e9437cb1b76d64da6b37f01bd6e879fb399e8ce) ) \ +\ + DECOCASS_COMMON_ROMS \ + + ROM_START( decocass ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_END @@ -912,7 +925,7 @@ (dongle data same for each game) */ ROM_START( ctsttape ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -922,7 +935,7 @@ ROM_END ROM_START( chwy ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ /* The dongle data is reverse engineered from manual decryption */ @@ -933,7 +946,7 @@ ROM_END ROM_START( clocknch ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -943,7 +956,7 @@ ROM_END ROM_START( ctisland ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -959,7 +972,7 @@ ROM_END ROM_START( ctisland2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -975,7 +988,7 @@ ROM_END ROM_START( ctisland3 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -991,7 +1004,7 @@ ROM_END ROM_START( csuperas ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -1001,7 +1014,7 @@ ROM_END ROM_START( castfant ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -1011,7 +1024,7 @@ ROM_END ROM_START( cluckypo ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -1021,7 +1034,7 @@ ROM_END ROM_START( cterrani ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -1031,7 +1044,7 @@ ROM_END ROM_START( cexplore ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ /* The dongle data is reverse engineered by table analysis */ @@ -1045,7 +1058,7 @@ ROM_END ROM_START( cprogolf ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */ ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) ) @@ -1058,7 +1071,7 @@ (dongle data differs for each game) */ ROM_START( cmissnx ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cmissnx.pro", 0x0000, 0x0800, CRC(8a41c071) SHA1(7b16d933707bf21d25dcd11db6a6c28834b11c5b) ) @@ -1068,7 +1081,7 @@ ROM_END ROM_START( cdiscon1 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cdiscon1.pro", 0x0000, 0x0800, CRC(0f793fab) SHA1(331f1b1b482fcd10f42c388a503f9af62d705401) ) @@ -1078,7 +1091,7 @@ ROM_END ROM_START( csweetht ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cdiscon1.pro", 0x0000, 0x0800, CRC(0f793fab) SHA1(331f1b1b482fcd10f42c388a503f9af62d705401) ) @@ -1088,7 +1101,7 @@ ROM_END ROM_START( cptennis ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cptennis.pro", 0x0000, 0x0800, CRC(59b8cede) SHA1(514861a652b5256a11477fc357bc01dfd87f712b) ) @@ -1098,7 +1111,7 @@ ROM_END ROM_START( ctornado ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */ ROM_LOAD( "ctornado.pro", 0x0000, 0x0800, CRC(c9a91697) SHA1(3f7163291edbdf1a596e3cd2b7a16bbb140ffb36) ) @@ -1111,7 +1124,7 @@ (dongle data differs for each game) */ ROM_START( cburnrub ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) ) @@ -1121,7 +1134,7 @@ ROM_END ROM_START( cburnrub2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) ) @@ -1131,7 +1144,7 @@ ROM_END ROM_START( cbnj ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) ) @@ -1141,7 +1154,7 @@ ROM_END ROM_START( cbtime ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cbtime.pro", 0x0000, 0x1000, CRC(25bec0f0) SHA1(9fb1f9699f37937421e26d4fb8fdbcd21a5ddc5c) ) @@ -1151,7 +1164,7 @@ ROM_END ROM_START( cgraplop ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cgraplop.pro", 0x0000, 0x1000, CRC(ee93787d) SHA1(0c753d62fdce2fdbd5b329a5aa259a967d07a651) ) @@ -1161,7 +1174,7 @@ ROM_END ROM_START( cgraplop2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cgraplop.pro", 0x0000, 0x1000, CRC(ee93787d) SHA1(0c753d62fdce2fdbd5b329a5aa259a967d07a651) ) /* is this right for this set? */ @@ -1171,7 +1184,7 @@ ROM_END ROM_START( clapapa ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "clapapa.pro", 0x0000, 0x1000, CRC(e172819a) SHA1(3492775f4f0a0b31ce5a1a998076829b3f264e98) ) @@ -1181,7 +1194,7 @@ ROM_END ROM_START( clapapa2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "clapapa.pro", 0x0000, 0x1000, CRC(e172819a) SHA1(3492775f4f0a0b31ce5a1a998076829b3f264e98) ) @@ -1191,7 +1204,7 @@ ROM_END ROM_START( cfghtice ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cfghtice.pro", 0x0000, 0x1000, CRC(5abd27b5) SHA1(2ab1c171adffd491759036d6ce2433706654aad2) ) @@ -1201,7 +1214,7 @@ ROM_END ROM_START( cprobowl ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cprobowl.pro", 0x0000, 0x1000, CRC(e3a88e60) SHA1(e6e9a2e5ab26e0463c63201a15f7d5a429ec836e) ) @@ -1211,7 +1224,7 @@ ROM_END ROM_START( cnightst ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cnightst.pro", 0x0000, 0x1000, CRC(553b0fbc) SHA1(2cdf4560992b62e59b6de760d7996be4ed25f505) ) @@ -1221,7 +1234,7 @@ ROM_END ROM_START( cnightst2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cnightst.pro", 0x0000, 0x1000, CRC(553b0fbc) SHA1(2cdf4560992b62e59b6de760d7996be4ed25f505) ) @@ -1230,8 +1243,8 @@ ROM_LOAD( "cnights2.cas", 0x0000, 0x8000, CRC(1a28128c) SHA1(4b620a1919d02814f734aba995115c09dc2db930) ) ROM_END -ROM_START( cprosocc ) - DECOCASS_COMMON_ROMS +ROM_START( cpsoccer ) + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cprosocc.pro", 0x0000, 0x1000, CRC(919fabb2) SHA1(3d6a0676cea7b0be0fe69d06e04ca08c36b2851a) ) @@ -1240,8 +1253,18 @@ ROM_LOAD( "cprosocc.cas", 0x0000, 0x10000, CRC(76b1ad2c) SHA1(6188667e5bc001dfdf83deaf7251eae794de4702) ) ROM_END +ROM_START( cpsoccerj ) + DECOCASS_BIOS_A_ROMS + + ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ + ROM_LOAD( "dp-133a.dgl", 0x0000, 0x1000, CRC(919fabb2) SHA1(3d6a0676cea7b0be0fe69d06e04ca08c36b2851a) ) + + ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */ + ROM_LOAD( "dt-133a.cas", 0x0000, 0x10000, CRC(de682a29) SHA1(2ee0dd8cb7fb595020d730a9da5d9cccda3f1264) ) +ROM_END + ROM_START( cppicf ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cppicf.pro", 0x0000, 0x1000, CRC(0b1a1ecb) SHA1(2106da6837c78812c102b0eaaa1127fcc21ea780) ) @@ -1251,7 +1274,7 @@ ROM_END ROM_START( cppicf2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cppicf.pro", 0x0000, 0x1000, CRC(0b1a1ecb) SHA1(2106da6837c78812c102b0eaaa1127fcc21ea780) ) @@ -1264,7 +1287,7 @@ (dongle data probably differs for each game, but only one is known using it atm) */ ROM_START( cscrtry ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x08000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cscrtry.pro", 0x0000, 0x8000, CRC(7bc3460b) SHA1(7c5668ff9a5073e27f4a83b02d79892eb4df6b92) ) @@ -1274,7 +1297,7 @@ ROM_END ROM_START( cscrtry2 ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x08000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "cscrtry.pro", 0x0000, 0x8000, CRC(7bc3460b) SHA1(7c5668ff9a5073e27f4a83b02d79892eb4df6b92) ) @@ -1287,7 +1310,7 @@ (dongle data not read) */ ROM_START( cbdash ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS /* ROM_REGION( 0x01000, "dongle", 0 ) */ /* (max) 4k for dongle data */ /* no proms */ @@ -1299,7 +1322,7 @@ /* The Following have no Dongles at all */ ROM_START( cflyball ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS /* no dongle data */ @@ -1311,7 +1334,7 @@ (dongle data not read) */ ROM_START( czeroize ) - DECOCASS_COMMON_ROMS + DECOCASS_BIOS_B_ROMS ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */ ROM_LOAD( "czeroize.pro", 0x0000, 0x1000, NO_DUMP ) @@ -1407,7 +1430,9 @@ /* 31 */ GAME( 1983, cprobowl, decocass, cprobowl, decocass, decocass, ROT270, "Data East Corporation", "Pro Bowling (Cassette)", 0 ) /* 32 */ GAME( 1983, cnightst, decocass, cnightst, cnightst, decocass, ROT270, "Data East Corporation", "Night Star (Cassette, set 1)", 0 ) /* 32 */ GAME( 1983, cnightst2,cnightst, cnightst, cnightst, decocass, ROT270, "Data East Corporation", "Night Star (Cassette, set 2)", 0 ) -/* 33 */ GAME( 1983, cprosocc, decocass, cprosocc, cprosocc, decocass, ROT270, "Data East Corporation", "Pro Soccer (Cassette)", 0 ) +/* 33 */ GAME( 1983, cpsoccer, decocass, cpsoccer, cpsoccer, decocass, ROT270, "Data East Corporation", "Pro Soccer (Cassette)", 0 ) +/* 33 */ GAME( 1983, cpsoccerj,cpsoccer, cpsoccer, cpsoccer, decocass, ROT270, "Data East Corporation", "Pro Soccer (Cassette, Japan)", 0 ) +/* 35 */ GAME( 1985, cflyball, decocass, cflyball, decocass, decocass, ROT270, "Data East Corporation", "Flying Ball (Cassette)", 0 ) /* 37 */ GAME( 1983, czeroize, decocass, czeroize, decocass, decocass, ROT270, "Data East Corporation", "Zeroize (Cassette)", 0 ) /* 38 */ GAME( 1984, cscrtry, decocass, cscrtry, cscrtry, decocass, ROT270, "Data East Corporation", "Scrum Try (Cassette, set 1)", 0 ) /* 38 */ GAME( 1984, cscrtry2, cscrtry, cscrtry, cscrtry, decocass, ROT270, "Data East Corporation", "Scrum Try (Cassette, set 2)", 0 ) @@ -1415,4 +1440,3 @@ /* 39 */ GAME( 1984, cppicf2, cppicf, cppicf, decocass, decocass, ROT270, "Data East Corporation", "Peter Pepper's Ice Cream Factory (Cassette, set 2)", 0 ) /* 40 */ GAME( 1984, cfghtice, decocass, cfghtice, cfghtice, decocass, ROT270, "Data East Corporation", "Fighting Ice Hockey (Cassette)", 0 ) /* 44 */ GAME( 1985, cbdash, decocass, cbdash, cbdash, decocass, ROT270, "Data East Corporation", "Boulder Dash (Cassette)", 0 ) - GAME( 1985, cflyball, decocass, cflyball, decocass, decocass, ROT270, "Data East Corporation", "Flying Ball (Cassette)", 0 ) diff -Nru mame-0.144/src/mame/drivers/deco_ld.c mame-0.145/src/mame/drivers/deco_ld.c --- mame-0.144/src/mame/drivers/deco_ld.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/deco_ld.c 2012-02-06 21:30:36.000000000 +0000 @@ -104,29 +104,30 @@ #include "emu.h" #include "cpu/m6502/m6502.h" #include "sound/ay8910.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" class deco_ld_state : public driver_device { public: deco_ld_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } UINT8 *m_videoram; UINT8 m_vram_bank; - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 m_laserdisc_data; int m_nmimask; }; -static SCREEN_UPDATE( rblaster ) +static SCREEN_UPDATE_IND16( rblaster ) { - deco_ld_state *state = screen->machine().driver_data(); + deco_ld_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x0000; int y,x; @@ -163,7 +164,7 @@ static READ8_HANDLER( laserdisc_r ) { deco_ld_state *state = space->machine().driver_data(); - UINT8 result = laserdisc_data_r(state->m_laserdisc); + UINT8 result = state->m_laserdisc->status_r(); // mame_printf_debug("laserdisc_r = %02X\n", result); return result; } @@ -510,8 +511,6 @@ static MACHINE_START( rblaster ) { - deco_ld_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } static MACHINE_CONFIG_START( rblaster, deco_ld_state ) @@ -527,11 +526,11 @@ // MCFG_CPU_VBLANK_INT("screen",irq0_line_hold) //test MCFG_CPU_PERIODIC_INT(sound_interrupt, 640) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") //Sony LDP-1000A, is it truly compatible with the Pioneer? - MCFG_LASERDISC_OVERLAY(rblaster, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") //Sony LDP-1000A, is it truly compatible with the Pioneer? + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, rblaster) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_GFXDECODE(rblaster) MCFG_PALETTE_LENGTH(512) MCFG_MACHINE_START(rblaster) @@ -544,7 +543,7 @@ MCFG_SOUND_ADD("ay2", AY8910, 1500000) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/deco_mlc.c mame-0.145/src/mame/drivers/deco_mlc.c --- mame-0.144/src/mame/drivers/deco_mlc.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/deco_mlc.c 2012-02-06 21:30:39.000000000 +0000 @@ -393,11 +393,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mlc) - MCFG_SCREEN_EOF(mlc) + MCFG_SCREEN_UPDATE_STATIC(mlc) + MCFG_SCREEN_VBLANK_STATIC(mlc) MCFG_GFXDECODE(deco_mlc) MCFG_PALETTE_LENGTH(2048) @@ -426,11 +425,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mlc) - MCFG_SCREEN_EOF(mlc) + MCFG_SCREEN_UPDATE_STATIC(mlc) + MCFG_SCREEN_VBLANK_STATIC(mlc) MCFG_GFXDECODE(deco_mlc) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/deniam.c mame-0.145/src/mame/drivers/deniam.c --- mame-0.144/src/mame/drivers/deniam.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/deniam.c 2012-02-06 21:30:39.000000000 +0000 @@ -285,11 +285,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) //MCFG_SCREEN_VISIBLE_AREA(24*8, 64*8-1, 0*8, 28*8-1) // looks better but doesn't match hardware MCFG_SCREEN_VISIBLE_AREA(24*8-4, 64*8-5, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(deniam) + MCFG_SCREEN_UPDATE_STATIC(deniam) MCFG_GFXDECODE(deniam) MCFG_PALETTE_LENGTH(2048) @@ -321,11 +320,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) //MCFG_SCREEN_VISIBLE_AREA(24*8, 64*8-1, 0*8, 28*8-1) // looks better but doesn't match hardware MCFG_SCREEN_VISIBLE_AREA(24*8-4, 64*8-5, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(deniam) + MCFG_SCREEN_UPDATE_STATIC(deniam) MCFG_GFXDECODE(deniam) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/deshoros.c mame-0.145/src/mame/drivers/deshoros.c --- mame-0.144/src/mame/drivers/deshoros.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/deshoros.c 2012-02-06 21:30:38.000000000 +0000 @@ -39,9 +39,9 @@ state->m_led_array[20] = 0; } -static SCREEN_UPDATE( deshoros ) +static SCREEN_UPDATE_IND16( deshoros ) { - deshoros_state *state = screen->machine().driver_data(); + deshoros_state *state = screen.machine().driver_data(); popmessage("%s",state->m_led_array); return 0; } @@ -183,10 +183,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(48*8, 16*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 16*8-1) - MCFG_SCREEN_UPDATE(deshoros) + MCFG_SCREEN_UPDATE_STATIC(deshoros) MCFG_PALETTE_LENGTH(16) MCFG_VIDEO_START(deshoros) diff -Nru mame-0.144/src/mame/drivers/destroyr.c mame-0.145/src/mame/drivers/destroyr.c --- mame-0.144/src/mame/drivers/destroyr.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/destroyr.c 2012-02-06 21:30:35.000000000 +0000 @@ -42,12 +42,12 @@ }; -static SCREEN_UPDATE( destroyr ) +static SCREEN_UPDATE_IND16( destroyr ) { - destroyr_state *state = screen->machine().driver_data(); + destroyr_state *state = screen.machine().driver_data(); int i, j; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* draw major objects */ for (i = 0; i < 16; i++) @@ -70,7 +70,7 @@ continue; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2], num, 0, flipx, 0, horz, 16 * i, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[2], num, 0, flipx, 0, horz, 16 * i, 0); } /* draw alpha numerics */ @@ -80,7 +80,7 @@ { int num = state->m_alpha_num_ram[32 * i + j]; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], num, 0, 0, 0, 8 * j, 8 * i, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], num, 0, 0, 0, 8 * j, 8 * i, 0); } } @@ -91,20 +91,20 @@ int horz = 256 - state->m_minor_obj_ram[i + 2]; int vert = 256 - state->m_minor_obj_ram[i + 4]; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], num, 0, 0, 0, horz, vert, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], num, 0, 0, 0, horz, vert, 0); } /* draw waves */ for (i = 0; i < 4; i++) { - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[3], state->m_wavemod ? 1 : 0, 0, 0, 0, 64 * i, 0x4e, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[3], state->m_wavemod ? 1 : 0, 0, 0, 0, 64 * i, 0x4e, 0); } /* draw cursor */ for (i = 0; i < 256; i++) { if (i & 4) - *BITMAP_ADDR16(bitmap, state->m_cursor ^ 0xff, i) = 7; + bitmap.pix16(state->m_cursor ^ 0xff, i) = 7; } return 0; } @@ -454,10 +454,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(destroyr) + MCFG_SCREEN_UPDATE_STATIC(destroyr) MCFG_GFXDECODE(destroyr) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/dfruit.c mame-0.145/src/mame/drivers/dfruit.c --- mame-0.144/src/mame/drivers/dfruit.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dfruit.c 2012-02-06 21:30:41.000000000 +0000 @@ -25,7 +25,7 @@ } -static SCREEN_UPDATE( dfruit ) +static SCREEN_UPDATE_IND16( dfruit ) { return 0; } @@ -123,10 +123,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(dfruit) + MCFG_SCREEN_UPDATE_STATIC(dfruit) MCFG_GFXDECODE( dfruit ) @@ -154,4 +153,4 @@ ROM_LOAD( "c2.ic10", 0x00000, 0x80000, CRC(d869ab24) SHA1(382e874a846855a7f6f8811625aaa30d9dfa1ce2) ) ROM_END -GAME( 199?, dfruit, 0, dfruit, dfruit, 0, ROT0, "", "Dream Fruit", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 199?, dfruit, 0, dfruit, dfruit, 0, ROT0, "", "Dream Fruit", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/dgpix.c mame-0.145/src/mame/drivers/dgpix.c --- mame-0.144/src/mame/drivers/dgpix.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dgpix.c 2012-02-06 21:30:34.000000000 +0000 @@ -285,16 +285,16 @@ state->m_vram = auto_alloc_array(machine, UINT32, 0x40000*2/4); } -static SCREEN_UPDATE( dgpix ) +static SCREEN_UPDATE_IND16( dgpix ) { - dgpix_state *state = screen->machine().driver_data(); + dgpix_state *state = screen.machine().driver_data(); int y; for (y = 0; y < 240; y++) { int x; UINT32 *src = &state->m_vram[(state->m_vbuffer ? 0 : 0x10000) | (y << 8)]; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); for (x = 0; x < 320; x += 2) { @@ -336,10 +336,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(dgpix) + MCFG_SCREEN_UPDATE_STATIC(dgpix) MCFG_PALETTE_INIT(BBBBB_GGGGG_RRRRR) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/dietgo.c mame-0.145/src/mame/drivers/dietgo.c --- mame-0.144/src/mame/drivers/dietgo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dietgo.c 2012-02-06 21:30:34.000000000 +0000 @@ -220,10 +220,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dietgo) + MCFG_SCREEN_UPDATE_STATIC(dietgo) MCFG_PALETTE_LENGTH(1024) MCFG_GFXDECODE(dietgo) diff -Nru mame-0.144/src/mame/drivers/discoboy.c mame-0.145/src/mame/drivers/discoboy.c --- mame-0.144/src/mame/drivers/discoboy.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/discoboy.c 2012-02-06 21:30:42.000000000 +0000 @@ -3,6 +3,10 @@ Similar to mitchell.c / egghunt.c .. clearly derived from that hardware +TODO: +- move sound HW into proper file (it's 99% IDENTICAL to yunsung8.c) +- ADPCM has sound volume issues, it's either too loud or too quiet; + PCB Layout ---------- @@ -52,7 +56,8 @@ UINT8 m_ram_bank; UINT8 m_gfxbank; UINT8 m_port_00; - int m_adpcm_data; + int m_adpcm; + UINT8 m_toggle; /* devices */ device_t *m_audiocpu; @@ -71,7 +76,7 @@ { } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { discoboy_state *state = machine.driver_data(); int flipscreen = 0; @@ -119,9 +124,9 @@ } -static SCREEN_UPDATE( discoboy ) +static SCREEN_UPDATE_IND16( discoboy ) { - discoboy_state *state = screen->machine().driver_data(); + discoboy_state *state = screen.machine().driver_data(); UINT16 x, y; int i; int count = 0; @@ -136,7 +141,7 @@ g = ((pal >> 4) & 0xf) << 4; r = ((pal >> 8) & 0xf) << 4; - palette_set_color(screen->machine(), i / 2, MAKE_RGB(r, g, b)); + palette_set_color(screen.machine(), i / 2, MAKE_RGB(r, g, b)); } for (i = 0; i < 0x800; i += 2) @@ -149,10 +154,10 @@ g = ((pal >> 4) & 0xf) << 4; r = ((pal >> 8) & 0xf) << 4; - palette_set_color(screen->machine(), (i / 2) + 0x400, MAKE_RGB(r, g, b)); + palette_set_color(screen.machine(), (i / 2) + 0x400, MAKE_RGB(r, g, b)); } - bitmap_fill(bitmap, cliprect, 0x3ff); + bitmap.fill(0x3ff, cliprect); for (y = 0; y < 32; y++) { @@ -168,12 +173,12 @@ tileno = 0x2000 + (tileno & 0x1fff) + 0x0000; } - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[1], tileno, state->m_ram_att[count / 2], 0, 0, x*8, y*8); + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[1], tileno, state->m_ram_att[count / 2], 0, 0, x*8, y*8); count += 2; } } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -316,21 +321,32 @@ /* Sound */ -//static WRITE8_HANDLER( splash_adpcm_data_w ){ -// state->m_adpcm_data = data; -//} +static WRITE8_DEVICE_HANDLER( yunsung8_sound_bankswitch_w ) +{ + /* Note: this is bit 5 on yunsung8.c */ + msm5205_reset_w(device, (data & 0x08) >> 3); + + memory_set_bank(device->machine(), "sndbank", data & 0x07); -static void splash_msm5205_int( device_t *device ) + if (data != (data & (~0x0f))) + logerror("%s: Bank %02X\n", device->machine().describe_context(), data); +} + +static WRITE8_HANDLER( yunsung8_adpcm_w ) { - discoboy_state *state = device->machine().driver_data(); - msm5205_data_w(device, state->m_adpcm_data >> 4); -// state->m_adpcm_data = (state->m_adpcm_data << 4) & 0xf0; + discoboy_state *state = space->machine().driver_data(); + + /* Swap the nibbles */ + state->m_adpcm = ((data & 0xf) << 4) | ((data >> 4) & 0xf); } static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0xf000, 0xf7ff) AM_RAM + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("sndbank") + AM_RANGE(0xe000, 0xe000) AM_DEVWRITE("msm",yunsung8_sound_bankswitch_w) + AM_RANGE(0xe400, 0xe400) AM_WRITE(yunsung8_adpcm_w) AM_RANGE(0xec00, 0xec01) AM_DEVWRITE("ymsnd", ym3812_w) + AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_RANGE(0xf800, 0xf800) AM_READ(soundlatch_r) ADDRESS_MAP_END @@ -365,9 +381,9 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -430,15 +446,6 @@ GFXDECODE_ENTRY( "gfx2", 0, tiles8x8_layout2, 0x000, 128 ) GFXDECODE_END - - -static const msm5205_interface discoboy_msm5205_interface = -{ - splash_msm5205_int, /* IRQ handler */ - MSM5205_S48_4B /* ??? unknown hz */ -}; - - static MACHINE_START( discoboy ) { discoboy_state *state = machine.driver_data(); @@ -448,7 +455,8 @@ state->save_item(NAME(state->m_ram_bank)); state->save_item(NAME(state->m_port_00)); state->save_item(NAME(state->m_gfxbank)); - state->save_item(NAME(state->m_adpcm_data)); + state->save_item(NAME(state->m_adpcm)); + state->save_item(NAME(state->m_toggle)); } static MACHINE_RESET( discoboy ) @@ -458,9 +466,26 @@ state->m_ram_bank = 0; state->m_port_00 = 0; state->m_gfxbank = 0; - state->m_adpcm_data = 0x80; + state->m_adpcm = 0x80; + state->m_toggle = 0; } +static void yunsung8_adpcm_int( device_t *device ) +{ + discoboy_state *state = device->machine().driver_data(); + + msm5205_data_w(device, state->m_adpcm >> 4); + state->m_adpcm <<= 4; + + state->m_toggle ^= 1; +} + +static const msm5205_interface yunsung8_msm5205_interface = +{ + yunsung8_adpcm_int, /* interrupt function */ + MSM5205_S96_4B /* 4KHz, 4 Bits */ +}; + static MACHINE_CONFIG_START( discoboy, discoboy_state ) /* basic machine hardware */ @@ -478,12 +503,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(8*8, 512-1-8*8, 0+8, 256-1-8) - MCFG_SCREEN_UPDATE(discoboy) + MCFG_SCREEN_UPDATE_STATIC(discoboy) MCFG_GFXDECODE(discoboy) MCFG_PALETTE_LENGTH(0x1000) @@ -491,15 +515,16 @@ MCFG_VIDEO_START(discoboy) /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("ymsnd", YM3812, 2500000) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) - + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.6) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.6) - MCFG_SOUND_ADD("msm", MSM5205, 384000) // ???? unknown - MCFG_SOUND_CONFIG(discoboy_msm5205_interface) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) + MCFG_SOUND_ADD("msm", MSM5205, XTAL_400kHz) // ???? unknown + MCFG_SOUND_CONFIG(yunsung8_msm5205_interface) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.80) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.80) MACHINE_CONFIG_END @@ -509,7 +534,7 @@ ROM_LOAD( "u18", 0x10000, 0x20000, CRC(88d1282d) SHA1(1f11dad0f577198c54a1dc182ba7502e398b998f) ) ROM_REGION( 0x20000, "audiocpu", 0 ) - ROM_LOAD( "2.u28", 0x00000, 0x10000, CRC(7c2ed174) SHA1(ace209dc4cc7a4ffca062842defd84cefc5b10d2)) + ROM_LOAD( "2.u28", 0x00000, 0x10000, CRC(7c2ed174) SHA1(ace209dc4cc7a4ffca062842defd84cefc5b10d2) ) ROM_LOAD( "1.u45", 0x10000, 0x10000, CRC(c266c6df) SHA1(f76e38ded43f56a486cf6569c679ddb57a4165fb) ) ROM_REGION( 0x100000, "gfx1", ROMREGION_INVERT ) @@ -534,6 +559,7 @@ { discoboy_state *state = machine.driver_data(); UINT8 *ROM = machine.region("maincpu")->base(); + UINT8 *AUDIO = machine.region("audiocpu")->base(); memset(state->m_ram_1, 0, sizeof(state->m_ram_1)); memset(state->m_ram_2, 0, sizeof(state->m_ram_2)); @@ -549,7 +575,9 @@ memory_configure_bank(machine, "bank1", 0, 8, &ROM[0x10000], 0x4000); memory_set_bank(machine, "bank1", 0); + memory_configure_bank(machine, "sndbank", 0, 8, &AUDIO[0x00000], 0x4000); + memory_set_bank(machine, "sndbank", 0); } -GAME( 1993, discoboy, 0, discoboy, discoboy, discoboy, ROT270, "Soft Art Co.", "Disco Boy", GAME_SUPPORTS_SAVE ) +GAME( 1993, discoboy, 0, discoboy, discoboy, discoboy, ROT270, "Soft Art Co.", "Disco Boy", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/diverboy.c mame-0.145/src/mame/drivers/diverboy.c --- mame-0.144/src/mame/drivers/diverboy.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/diverboy.c 2012-02-06 21:30:34.000000000 +0000 @@ -73,7 +73,7 @@ { } -static void draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { diverboy_state *state = machine.driver_data(); UINT16 *source = state->m_spriteram; @@ -109,10 +109,10 @@ } } -static SCREEN_UPDATE(diverboy) +static SCREEN_UPDATE_IND16(diverboy) { -// bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - draw_sprites(screen->machine(), bitmap, cliprect); +// bitmap.fill(get_black_pen(screen.machine()), cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -265,10 +265,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8+4, 40*8+1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(diverboy) + MCFG_SCREEN_UPDATE_STATIC(diverboy) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/djboy.c mame-0.145/src/mame/drivers/djboy.c --- mame-0.144/src/mame/drivers/djboy.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/djboy.c 2012-02-06 21:30:34.000000000 +0000 @@ -611,11 +611,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(djboy) - MCFG_SCREEN_EOF(djboy) + MCFG_SCREEN_UPDATE_STATIC(djboy) + MCFG_SCREEN_VBLANK_STATIC(djboy) MCFG_GFXDECODE(djboy) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/djmain.c mame-0.145/src/mame/drivers/djmain.c --- mame-0.144/src/mame/drivers/djmain.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/djmain.c 2012-02-06 21:30:36.000000000 +0000 @@ -1494,10 +1494,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(12, 512-12-1, 0, 384-1) - MCFG_SCREEN_UPDATE(djmain) + MCFG_SCREEN_UPDATE_STATIC(djmain) MCFG_PALETTE_LENGTH(0x4440/4) MCFG_GFXDECODE(djmain) diff -Nru mame-0.144/src/mame/drivers/dkong.c mame-0.145/src/mame/drivers/dkong.c --- mame-0.144/src/mame/drivers/dkong.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/dkong.c 2012-02-06 21:30:34.000000000 +0000 @@ -765,6 +765,12 @@ z80dma_rdy_w(device, data & 0x01); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + dkong_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} /************************************* * @@ -788,7 +794,7 @@ AM_RANGE(0x7d81, 0x7d81) AM_WRITE(radarscp_grid_enable_w) AM_RANGE(0x7d82, 0x7d82) AM_WRITE(dkong_flipscreen_w) AM_RANGE(0x7d83, 0x7d83) AM_WRITE(dkong_spritebank_w) /* 2 PSL Signal */ - AM_RANGE(0x7d84, 0x7d84) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x7d84, 0x7d84) AM_WRITE(nmi_mask_w) AM_RANGE(0x7d85, 0x7d85) AM_DEVWRITE("dma8257", p8257_drq_w) /* P8257 ==> /DRQ0 /DRQ1 */ AM_RANGE(0x7d86, 0x7d87) AM_WRITE(dkong_palettebank_w) ADDRESS_MAP_END @@ -812,7 +818,7 @@ AM_RANGE(0x7d80, 0x7d80) AM_READ_PORT("DSW0") AM_WRITE(dkong_audio_irq_w) /* DSW0 */ AM_RANGE(0x7d82, 0x7d82) AM_WRITE(dkong_flipscreen_w) AM_RANGE(0x7d83, 0x7d83) AM_WRITE(dkong_spritebank_w) /* 2 PSL Signal */ - AM_RANGE(0x7d84, 0x7d84) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x7d84, 0x7d84) AM_WRITE(nmi_mask_w) AM_RANGE(0x7d85, 0x7d85) AM_DEVWRITE("dma8257", p8257_drq_w) /* P8257 ==> /DRQ0 /DRQ1 */ AM_RANGE(0x7d86, 0x7d87) AM_WRITE(dkong_palettebank_w) AM_RANGE(0x7d80, 0x7d87) AM_DEVWRITE("ls259.5h", latch8_bit0_w) /* latch for sound and signals above*/ @@ -836,7 +842,7 @@ AM_RANGE(0x7e81, 0x7e81) AM_WRITE(dkong3_gfxbank_w) AM_RANGE(0x7e82, 0x7e82) AM_WRITE(dkong_flipscreen_w) AM_RANGE(0x7e83, 0x7e83) AM_WRITE(dkong_spritebank_w) /* 2 PSL Signal */ - AM_RANGE(0x7e84, 0x7e84) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x7e84, 0x7e84) AM_WRITE(nmi_mask_w) AM_RANGE(0x7e85, 0x7e85) AM_DEVWRITE("z80dma", dkong_z80dma_rdy_w) /* ==> DMA Chip */ AM_RANGE(0x7e86, 0x7e87) AM_WRITE(dkong_palettebank_w) AM_RANGE(0x8000, 0x9fff) AM_ROM /* DK3 and bootleg DKjr only */ @@ -1660,12 +1666,20 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + dkong_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( dkong_base, dkong_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, CLOCK_1H) MCFG_CPU_PROGRAM_MAP(dkong_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(dkong2b) MCFG_MACHINE_RESET(dkong) @@ -1674,9 +1688,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(dkong) + MCFG_SCREEN_UPDATE_STATIC(dkong) MCFG_GFXDECODE(dkong) MCFG_PALETTE_LENGTH(DK2B_PALETTE_LENGTH) @@ -1730,7 +1743,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz / 2) /* verified in schematics */ MCFG_CPU_PROGRAM_MAP(dkong3_map) MCFG_CPU_IO_MAP(dkong3_io_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(dkong3) @@ -1738,9 +1751,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(dkong) + MCFG_SCREEN_UPDATE_STATIC(dkong) MCFG_GFXDECODE(dkong) MCFG_PALETTE_LENGTH(DK3_PALETTE_LENGTH) @@ -1768,7 +1780,7 @@ MCFG_PALETTE_LENGTH(DK2B_PALETTE_LENGTH) MCFG_PALETTE_INIT(dkong2b) /* wrong! */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(pestplce) + MCFG_SCREEN_UPDATE_STATIC(pestplce) MACHINE_CONFIG_END @@ -1806,7 +1818,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(spclforc) + MCFG_SCREEN_UPDATE_STATIC(spclforc) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/dlair.c mame-0.145/src/mame/drivers/dlair.c --- mame-0.144/src/mame/drivers/dlair.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dlair.c 2012-02-06 21:30:34.000000000 +0000 @@ -36,7 +36,8 @@ #include "cpu/z80/z80.h" #include "render.h" #include "cpu/z80/z80daisy.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" +#include "machine/ldstub.h" #include "machine/z80ctc.h" #include "machine/z80sio.h" #include "sound/ay8910.h" @@ -48,12 +49,55 @@ { public: dlair_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_ldv1000(*this, "ld_ldv1000"), + m_pr7820(*this, "ld_pr7820"), + m_22vp932(*this, "ld_22vp932") { } + + void laserdisc_data_w(UINT8 data) + { + if (m_ldv1000 != NULL) m_ldv1000->data_w(data); + if (m_pr7820 != NULL) m_pr7820->data_w(data); + if (m_22vp932 != NULL) m_22vp932->data_w(data); + } + + void laserdisc_enter_w(UINT8 data) + { + if (m_pr7820 != NULL) m_pr7820->enter_w(data); + if (m_22vp932 != NULL) m_22vp932->enter_w(data); + } + + UINT8 laserdisc_data_r() + { + if (m_ldv1000 != NULL) return m_ldv1000->status_r(); + if (m_pr7820 != NULL) return m_pr7820->data_r(); + if (m_22vp932 != NULL) return m_22vp932->data_r(); + return 0; + } + + UINT8 laserdisc_data_available_r() + { + return CLEAR_LINE; + } + + UINT8 laserdisc_status_r() + { + if (m_ldv1000 != NULL) return m_ldv1000->status_strobe_r(); + return CLEAR_LINE; + } + + UINT8 laserdisc_ready_r() + { + if (m_ldv1000 != NULL) return m_ldv1000->command_strobe_r(); + if (m_pr7820 != NULL) return m_pr7820->ready_r(); + return CLEAR_LINE; + } UINT8 *m_videoram; - device_t *m_laserdisc; + optional_device m_ldv1000; + optional_device m_pr7820; + optional_device m_22vp932; UINT8 m_last_misc; - UINT8 m_laserdisc_type; UINT8 m_laserdisc_data; }; @@ -69,9 +113,6 @@ #define MASTER_CLOCK_US 16000000 #define MASTER_CLOCK_EURO 14318180 -#define LASERDISC_TYPE_FIXED 0 -#define LASERDISC_TYPE_VARIABLE 1 - /************************************* @@ -102,7 +143,7 @@ static WRITE8_DEVICE_HANDLER( serial_transmit ) { dlair_state *state = device->machine().driver_data(); - laserdisc_data_w(state->m_laserdisc, data); + state->laserdisc_data_w(data); } @@ -110,8 +151,8 @@ { dlair_state *state = device->machine().driver_data(); /* if we still have data to send, do it now */ - if (channel == 0 && laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL) == ASSERT_LINE) - return laserdisc_data_r(state->m_laserdisc); + if (channel == 0 && state->laserdisc_data_available_r() == ASSERT_LINE) + return state->laserdisc_data_r(); return -1; } @@ -172,9 +213,9 @@ * *************************************/ -static SCREEN_UPDATE( dleuro ) +static SCREEN_UPDATE_IND16( dleuro ) { - dlair_state *state = screen->machine().driver_data(); + dlair_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int x, y; @@ -183,7 +224,7 @@ for (x = 0; x < 32; x++) { UINT8 *base = &videoram[y * 64 + x * 2 + 1]; - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[0], base[0], base[1], 0, 0, 10 * x, 16 * y); + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], base[0], base[1], 0, 0, 10 * x, 16 * y); } return 0; @@ -199,20 +240,21 @@ static MACHINE_START( dlair ) { - dlair_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } static MACHINE_RESET( dlair ) { +#if 0 dlair_state *state = machine.driver_data(); + /* determine the laserdisc player from the DIP switches */ if (state->m_laserdisc_type == LASERDISC_TYPE_VARIABLE) { int newtype = (input_port_read(machine, "DSW2") & 0x08) ? LASERDISC_TYPE_PIONEER_LDV1000 : LASERDISC_TYPE_PIONEER_PR7820; laserdisc_set_type(state->m_laserdisc, newtype); } +#endif } @@ -260,10 +302,10 @@ /* on bit 5 going low, push the data out to the laserdisc player */ if ((diff & 0x20) && !(data & 0x20)) - laserdisc_data_w(state->m_laserdisc, state->m_laserdisc_data); + state->laserdisc_data_w(state->m_laserdisc_data); /* on bit 6 going low, we need to signal enter */ - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_ENTER, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + state->laserdisc_enter_w((data & 0x40) ? CLEAR_LINE : ASSERT_LINE); } @@ -288,10 +330,10 @@ /* on bit 5 going low, push the data out to the laserdisc player */ if ((diff & 0x20) && !(data & 0x20)) - laserdisc_data_w(state->m_laserdisc, state->m_laserdisc_data); + state->laserdisc_data_w(state->m_laserdisc_data); /* on bit 6 going low, we need to signal enter */ - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_ENTER, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); + state->laserdisc_enter_w((data & 0x40) ? CLEAR_LINE : ASSERT_LINE); } @@ -317,43 +359,21 @@ static CUSTOM_INPUT( laserdisc_status_r ) { dlair_state *state = field.machine().driver_data(); - switch (laserdisc_get_type(state->m_laserdisc)) - { - case LASERDISC_TYPE_PIONEER_PR7820: - return 0; - - case LASERDISC_TYPE_PIONEER_LDV1000: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_STATUS) == ASSERT_LINE) ? 0 : 1; - - case LASERDISC_TYPE_PHILLIPS_22VP932: - return 0; - } - return 0; + return state->laserdisc_status_r(); } static CUSTOM_INPUT( laserdisc_command_r ) { dlair_state *state = field.machine().driver_data(); - switch (laserdisc_get_type(state->m_laserdisc)) - { - case LASERDISC_TYPE_PIONEER_PR7820: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_READY) == ASSERT_LINE) ? 0 : 1; - - case LASERDISC_TYPE_PIONEER_LDV1000: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_COMMAND) == ASSERT_LINE) ? 0 : 1; - - case LASERDISC_TYPE_PHILLIPS_22VP932: - return 0; - } - return 0; + return (state->laserdisc_ready_r() == ASSERT_LINE) ? 0 : 1; } static READ8_HANDLER( laserdisc_r ) { dlair_state *state = space->machine().driver_data(); - UINT8 result = laserdisc_data_r(state->m_laserdisc); + UINT8 result = state->laserdisc_data_r(); mame_printf_debug("laserdisc_r = %02X\n", result); return result; } @@ -703,29 +723,28 @@ MCFG_MACHINE_START(dlair) MCFG_MACHINE_RESET(dlair) - /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_RGB32) - /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("aysnd", AY8910, MASTER_CLOCK_US/8) MCFG_SOUND_CONFIG(ay8910_config) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) - - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( dlair_pr7820, dlair_base ) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_PR7820, "screen", "ldsound") + MCFG_LASERDISC_PR7820_ADD("ld_pr7820") + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "ld_pr7820") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( dlair_ldv1000, dlair_base ) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") + MCFG_LASERDISC_LDV1000_ADD("ld_ldv1000") + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "ld_ldv1000") MACHINE_CONFIG_END @@ -746,11 +765,11 @@ MCFG_MACHINE_START(dlair) MCFG_MACHINE_RESET(dlair) - MCFG_LASERDISC_ADD("laserdisc", PHILLIPS_22VP932, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(dleuro, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_22VP932_ADD("ld_22vp932") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, dleuro) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_PAL("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_PAL("screen", "ld_22vp932") MCFG_GFXDECODE(dlair) MCFG_PALETTE_LENGTH(16) @@ -764,7 +783,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("ld_22vp932") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END @@ -784,7 +803,7 @@ ROM_LOAD( "dl_f2_u3.bin", 0x4000, 0x2000, CRC(ab514e5b) SHA1(29d1015b951f0f2d4e5257497f3bf007c5e2262c) ) ROM_LOAD( "dl_f2_u4.bin", 0x6000, 0x2000, CRC(f5ec23d2) SHA1(71149e2d359cc5944fbbb53dd7d0c2b42fbc9bb4) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -796,7 +815,7 @@ ROM_LOAD( "dl_a_u4.bin", 0x6000, 0x2000, CRC(924d12f2) SHA1(05b487e651a4817991dfc2308834b8f2fae918b4) ) ROM_LOAD( "dl_a_u5.bin", 0x8000, 0x2000, CRC(6ec2f9c1) SHA1(0b8026927697a99fe8fa0dd4bd643418779a1d45) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_pr7820" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -808,7 +827,7 @@ ROM_LOAD( "dl_b_u4.bin", 0x6000, 0x2000, CRC(924d12f2) SHA1(05b487e651a4817991dfc2308834b8f2fae918b4) ) ROM_LOAD( "dl_b_u5.bin", 0x8000, 0x2000, CRC(6ec2f9c1) SHA1(0b8026927697a99fe8fa0dd4bd643418779a1d45) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_pr7820" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -820,7 +839,7 @@ ROM_LOAD( "dl_c_u4.bin", 0x6000, 0x2000, CRC(924d12f2) SHA1(05b487e651a4817991dfc2308834b8f2fae918b4) ) ROM_LOAD( "dl_c_u5.bin", 0x8000, 0x2000, CRC(6ec2f9c1) SHA1(0b8026927697a99fe8fa0dd4bd643418779a1d45) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_pr7820" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -832,7 +851,7 @@ ROM_LOAD( "dl_d_u4.bin", 0x6000, 0x2000, CRC(5f7212cb) SHA1(69c34de1bb44b6cd2adc2947d00d8823d3e87130) ) ROM_LOAD( "dl_d_u5.bin", 0x8000, 0x2000, CRC(2b469c89) SHA1(646394b51325ca9163221a43b5af64a8067eb80b) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -843,7 +862,7 @@ ROM_LOAD( "dl_e_u3.bin", 0x4000, 0x2000, CRC(897bf075) SHA1(d2ff9c2fec37544cfe8fb60273524c6610488502) ) ROM_LOAD( "dl_e_u4.bin", 0x6000, 0x2000, CRC(4ebffba5) SHA1(d04711247ffa88e371ec461465dd75a8158d90bc) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -854,7 +873,7 @@ ROM_LOAD( "dl_f_u3.bin", 0x4000, 0x2000, CRC(ab514e5b) SHA1(29d1015b951f0f2d4e5257497f3bf007c5e2262c) ) ROM_LOAD( "dl_f_u4.bin", 0x6000, 0x2000, CRC(a817324e) SHA1(1299c83342fc70932f67bda8ae60bace91d66429) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "dlair", 0, NO_DUMP ) ROM_END @@ -868,7 +887,7 @@ ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD( "elu33.bin", 0x0000, 0x2000, CRC(e7506d96) SHA1(610ae25bd8db13b18b9e681e855ffa978043255b) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_22vp932" ) DISK_IMAGE_READONLY( "dleuro", 0, NO_DUMP ) ROM_END @@ -882,7 +901,7 @@ ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD( "dlita33.bin", 0x0000, 0x2000, CRC(e7506d96) SHA1(610ae25bd8db13b18b9e681e855ffa978043255b) ) /* Label: ELU 33 REV.B */ - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_22vp932" ) DISK_IMAGE_READONLY( "dleuro", 0, NO_DUMP ) ROM_END @@ -895,11 +914,11 @@ ROM_LOAD( "sa_a3_u4.bin", 0x6000, 0x2000, CRC(57db2a79) SHA1(5286905d9bde697845a98bd77f31f2a96a8874fc) ) ROM_LOAD( "sa_a3_u5.bin", 0x8000, 0x2000, CRC(85cbcdc4) SHA1(97e01e96c885ab7af4c3a3b586eb40374d54f12f) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "spaceace", 0, NO_DUMP ) ROM_END -ROM_START( spaceaa2 ) /* revision A2 */ +ROM_START( spaceacea2 ) /* revision A2 */ ROM_REGION( 0xa000, "maincpu", 0 ) ROM_LOAD( "sa_a2_u1.bin", 0x0000, 0x2000, CRC(71b39e27) SHA1(15a34eee9d541b186761a78b5c97449c7b496e4f) ) ROM_LOAD( "sa_a2_u2.bin", 0x2000, 0x2000, CRC(18d0262d) SHA1(c3920e3cabfe2b2add51881e262f090c5018e508) ) @@ -907,11 +926,11 @@ ROM_LOAD( "sa_a2_u4.bin", 0x6000, 0x2000, CRC(57db2a79) SHA1(5286905d9bde697845a98bd77f31f2a96a8874fc) ) ROM_LOAD( "sa_a2_u5.bin", 0x8000, 0x2000, CRC(85cbcdc4) SHA1(97e01e96c885ab7af4c3a3b586eb40374d54f12f) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "spaceace", 0, NO_DUMP ) ROM_END -ROM_START( spaceaa ) /* revision A */ +ROM_START( spaceacea ) /* revision A */ ROM_REGION( 0xa000, "maincpu", 0 ) ROM_LOAD( "sa_a_u1.bin", 0x0000, 0x2000, CRC(8eb1889e) SHA1(bfa2c5fc139c448b7b6b5c5757d4f2f74e610b85) ) ROM_LOAD( "sa_a_u2.bin", 0x2000, 0x2000, CRC(18d0262d) SHA1(c3920e3cabfe2b2add51881e262f090c5018e508) ) @@ -919,11 +938,11 @@ ROM_LOAD( "sa_a_u4.bin", 0x6000, 0x2000, CRC(57db2a79) SHA1(5286905d9bde697845a98bd77f31f2a96a8874fc) ) ROM_LOAD( "sa_a_u5.bin", 0x8000, 0x2000, CRC(85cbcdc4) SHA1(97e01e96c885ab7af4c3a3b586eb40374d54f12f) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_ldv1000" ) DISK_IMAGE_READONLY( "spaceace", 0, NO_DUMP ) ROM_END -ROM_START( saeuro ) /* Italian Sidam version */ +ROM_START( spaceaceeuro ) /* Italian Sidam version */ ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "sa_u45a.bin", 0x0000, 0x2000, CRC(41264d46) SHA1(3e0ecfb3249f857a29fe58a3853a55d31cbd63d6) ) ROM_LOAD( "sa_u46a.bin", 0x2000, 0x2000, CRC(bc1c70cf) SHA1(cd6d2456ac2fbbfb86e1f31bd7cbd0cec0d31b45) ) @@ -934,7 +953,7 @@ ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD( "sa_u33a.bin", 0x0000, 0x2000, CRC(a8c14612) SHA1(dbcf90b929e714f328bdcb0d8cd7c9e7d08a8be7) ) - DISK_REGION( "laserdisc" ) + DISK_REGION( "ld_22vp932" ) DISK_IMAGE_READONLY( "saeuro", 0, NO_DUMP ) ROM_END @@ -949,15 +968,15 @@ static DRIVER_INIT( fixed ) { - dlair_state *state = machine.driver_data(); - state->m_laserdisc_type = LASERDISC_TYPE_FIXED; +// dlair_state *state = machine.driver_data(); +// state->m_laserdisc_type = LASERDISC_TYPE_FIXED; } static DRIVER_INIT( variable ) { - dlair_state *state = machine.driver_data(); - state->m_laserdisc_type = LASERDISC_TYPE_VARIABLE; +// dlair_state *state = machine.driver_data(); +// state->m_laserdisc_type = LASERDISC_TYPE_VARIABLE; } @@ -978,7 +997,7 @@ GAMEL( 1983, dleuro, dlair, dleuro, dleuro, fixed, ROT0, "Cinematronics (Atari license)", "Dragon's Lair (European)", GAME_NOT_WORKING, layout_dlair ) GAMEL( 1983, dlital, dlair, dleuro, dleuro, fixed, ROT0, "Cinematronics (Sidam license?)","Dragon's Lair (Italian)", GAME_NOT_WORKING, layout_dlair ) -GAMEL( 1983, spaceace, 0, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A3)", GAME_NOT_WORKING, layout_dlair ) -GAMEL( 1983, spaceaa2, spaceace, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A2)", GAME_NOT_WORKING, layout_dlair ) -GAMEL( 1983, spaceaa, spaceace, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A)", GAME_NOT_WORKING, layout_dlair ) -GAMEL( 1983, saeuro, spaceace, dleuro, dleuro, fixed, ROT0, "Cinematronics (Atari license)", "Space Ace (European)", GAME_NOT_WORKING, layout_dlair ) +GAMEL( 1983, spaceace, 0, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A3)", GAME_NOT_WORKING, layout_dlair ) +GAMEL( 1983, spaceacea2, spaceace, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A2)", GAME_NOT_WORKING, layout_dlair ) +GAMEL( 1983, spaceacea, spaceace, dlair_ldv1000, dlaire, variable, ROT0, "Cinematronics", "Space Ace (US Rev. A)", GAME_NOT_WORKING, layout_dlair ) +GAMEL( 1983, spaceaceeuro, spaceace, dleuro, dleuro, fixed, ROT0, "Cinematronics (Atari license)", "Space Ace (European)", GAME_NOT_WORKING, layout_dlair ) diff -Nru mame-0.144/src/mame/drivers/dmndrby.c mame-0.145/src/mame/drivers/dmndrby.c --- mame-0.144/src/mame/drivers/dmndrby.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dmndrby.c 2012-02-06 21:30:39.000000000 +0000 @@ -334,20 +334,20 @@ dmndrby_state *state = machine.driver_data(); state->m_racetrack_tilemap_rom = machine.region("user1")->base(); state->m_racetrack_tilemap = tilemap_create(machine,get_dmndrby_tile_info,tilemap_scan_rows,16,16, 16, 512); - tilemap_mark_all_tiles_dirty(state->m_racetrack_tilemap); + state->m_racetrack_tilemap->mark_all_dirty(); } -static SCREEN_UPDATE(dderby) +static SCREEN_UPDATE_IND16(dderby) { - dmndrby_state *state = screen->machine().driver_data(); + dmndrby_state *state = screen.machine().driver_data(); int x,y,count; int off,scrolly; - const gfx_element *gfx = screen->machine().gfx[0]; - const gfx_element *sprites = screen->machine().gfx[1]; - const gfx_element *track = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[0]; + const gfx_element *sprites = screen.machine().gfx[1]; + const gfx_element *track = screen.machine().gfx[2]; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* Draw racetrack @@ -517,10 +517,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(dderby) + MCFG_SCREEN_UPDATE_STATIC(dderby) MCFG_GFXDECODE(dmndrby) MCFG_PALETTE_LENGTH(0x300) diff -Nru mame-0.144/src/mame/drivers/docastle.c mame-0.145/src/mame/drivers/docastle.c --- mame-0.144/src/mame/drivers/docastle.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/docastle.c 2012-02-06 21:30:38.000000000 +0000 @@ -611,10 +611,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.60) // measured on pcb, real refresh rate should be derived from XTAL_9_828MHz, how? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(docastle) + MCFG_SCREEN_UPDATE_STATIC(docastle) MCFG_GFXDECODE(docastle) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/dogfgt.c mame-0.145/src/mame/drivers/dogfgt.c --- mame-0.144/src/mame/drivers/dogfgt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dogfgt.c 2012-02-06 21:30:42.000000000 +0000 @@ -264,10 +264,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(dogfgt) + MCFG_SCREEN_UPDATE_STATIC(dogfgt) MCFG_GFXDECODE(dogfgt) MCFG_PALETTE_LENGTH(16+64) diff -Nru mame-0.144/src/mame/drivers/dominob.c mame-0.145/src/mame/drivers/dominob.c --- mame-0.144/src/mame/drivers/dominob.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dominob.c 2012-02-06 21:30:40.000000000 +0000 @@ -87,7 +87,7 @@ machine.gfx[0]->color_granularity = 8; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { dominob_state *state = machine.driver_data(); int offs; @@ -117,9 +117,9 @@ } -static SCREEN_UPDATE( dominob ) +static SCREEN_UPDATE_IND16( dominob ) { - dominob_state *state = screen->machine().driver_data(); + dominob_state *state = screen.machine().driver_data(); int x,y; int index = 0; @@ -130,7 +130,7 @@ { drawgfx_opaque(bitmap, cliprect, - screen->machine().gfx[1], + screen.machine().gfx[1], state->m_bgram[index] + 256 * (state->m_bgram[index + 1] & 0xf), state->m_bgram[index + 1] >> 4, 0, 0, @@ -145,7 +145,7 @@ { drawgfx_transpen( bitmap, cliprect, - screen->machine().gfx[0], + screen.machine().gfx[0], state->m_videoram[(y * 32 + x) * 2 + 1] + (state->m_videoram[(y * 32 + x) * 2] & 7) * 256, (state->m_videoram[(y * 32 + x) * 2] >> 3), 0, 0, @@ -153,7 +153,7 @@ } } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -300,10 +300,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1524) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(dominob) + MCFG_SCREEN_UPDATE_STATIC(dominob) MCFG_GFXDECODE(dominob) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/dooyong.c mame-0.145/src/mame/drivers/dooyong.c --- mame-0.144/src/mame/drivers/dooyong.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dooyong.c 2012-02-06 21:30:35.000000000 +0000 @@ -881,11 +881,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(lastday) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(lastday) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(lastday) MCFG_PALETTE_LENGTH(1024) @@ -924,11 +923,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(gulfstrm) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(gulfstrm) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(lastday) MCFG_PALETTE_LENGTH(1024) @@ -958,11 +956,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(pollux) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(pollux) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(lastday) MCFG_PALETTE_LENGTH(1024) @@ -991,11 +988,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(bluehawk) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(bluehawk) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(bluehawk) MCFG_PALETTE_LENGTH(1024) @@ -1024,11 +1020,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(flytiger) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(flytiger) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(flytiger) MCFG_PALETTE_LENGTH(1024) @@ -1055,11 +1050,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 0*8, 32*8-1 ) - MCFG_SCREEN_UPDATE(primella) - MCFG_SCREEN_EOF(dooyong) + MCFG_SCREEN_UPDATE_STATIC(primella) + MCFG_SCREEN_VBLANK_STATIC(dooyong) MCFG_GFXDECODE(primella) MCFG_PALETTE_LENGTH(1024) @@ -1098,11 +1092,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(rshark) - MCFG_SCREEN_EOF(rshark) + MCFG_SCREEN_UPDATE_STATIC(rshark) + MCFG_SCREEN_VBLANK_STATIC(rshark) MCFG_GFXDECODE(rshark) MCFG_PALETTE_LENGTH(2048) @@ -1129,11 +1122,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(rshark) - MCFG_SCREEN_EOF(rshark) + MCFG_SCREEN_UPDATE_STATIC(rshark) + MCFG_SCREEN_VBLANK_STATIC(rshark) MCFG_GFXDECODE(rshark) MCFG_PALETTE_LENGTH(2048) @@ -1160,11 +1152,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(popbingo) - MCFG_SCREEN_EOF(rshark) + MCFG_SCREEN_UPDATE_STATIC(popbingo) + MCFG_SCREEN_VBLANK_STATIC(rshark) MCFG_GFXDECODE(popbingo) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/dorachan.c mame-0.145/src/mame/drivers/dorachan.c --- mame-0.144/src/mame/drivers/dorachan.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dorachan.c 2012-02-06 21:30:36.000000000 +0000 @@ -77,16 +77,16 @@ } -static SCREEN_UPDATE( dorachan ) +static SCREEN_UPDATE_RGB32( dorachan ) { - dorachan_state *state = screen->machine().driver_data(); + dorachan_state *state = screen.machine().driver_data(); pen_t pens[NUM_PENS]; offs_t offs; const UINT8 *color_map_base; get_pens(pens); - color_map_base = screen->machine().region("proms")->base(); + color_map_base = screen.machine().region("proms")->base(); for (offs = 0; offs < state->m_videoram_size; offs++) { @@ -109,7 +109,7 @@ for (i = 0; i < 8; i++) { UINT8 color = (data & 0x01) ? fore_color : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; data = data >> 1; x = x + 1; @@ -250,11 +250,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(dorachan) + MCFG_SCREEN_UPDATE_STATIC(dorachan) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/dotrikun.c mame-0.145/src/mame/drivers/dotrikun.c --- mame-0.144/src/mame/drivers/dotrikun.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dotrikun.c 2012-02-06 21:30:34.000000000 +0000 @@ -59,15 +59,15 @@ } -static SCREEN_UPDATE( dotrikun ) +static SCREEN_UPDATE_RGB32( dotrikun ) { - dotrikun_state *state = screen->machine().driver_data(); + dotrikun_state *state = screen.machine().driver_data(); int x,y,i; pen_t back_pen = MAKE_RGB(pal1bit(state->m_color >> 3), pal1bit(state->m_color >> 4), pal1bit(state->m_color >> 5)); pen_t fore_pen = MAKE_RGB(pal1bit(state->m_color >> 0), pal1bit(state->m_color >> 1), pal1bit(state->m_color >> 2)); - for(y = (cliprect->min_y & ~1); y < cliprect->max_y; y+=2) + for(y = (cliprect.min_y & ~1); y < cliprect.max_y; y+=2) { for (x = 0; x < 256; x+=16) { @@ -78,10 +78,10 @@ pen_t pen = ((data >> (7 - i)) & 1) ? fore_pen : back_pen; /* I think the video hardware doubles pixels, screen would be too small otherwise */ - *BITMAP_ADDR32(bitmap, y + 0, (x + 0) + i*2) = pen; - *BITMAP_ADDR32(bitmap, y + 0, (x + 1) + i*2) = pen; - *BITMAP_ADDR32(bitmap, y + 1, (x + 0) + i*2) = pen; - *BITMAP_ADDR32(bitmap, y + 1, (x + 1) + i*2) = pen; + bitmap.pix32(y + 0, (x + 0) + i*2) = pen; + bitmap.pix32(y + 0, (x + 1) + i*2) = pen; + bitmap.pix32(y + 1, (x + 0) + i*2) = pen; + bitmap.pix32(y + 1, (x + 1) + i*2) = pen; } } } @@ -161,9 +161,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 256+32, 0, 256, 192+32, 0, 192) // FIXME: h/v params of this are completely inaccurate, shows it especially under the "CRT test" - MCFG_SCREEN_UPDATE(dotrikun) + MCFG_SCREEN_UPDATE_STATIC(dotrikun) /* sound hardware */ MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/dragrace.c mame-0.145/src/mame/drivers/dragrace.c --- mame-0.144/src/mame/drivers/dragrace.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dragrace.c 2012-02-06 21:30:42.000000000 +0000 @@ -348,10 +348,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(dragrace) + MCFG_SCREEN_UPDATE_STATIC(dragrace) MCFG_GFXDECODE(dragrace) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/dreamwld.c mame-0.145/src/mame/drivers/dreamwld.c --- mame-0.144/src/mame/drivers/dreamwld.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dreamwld.c 2012-02-06 21:30:37.000000000 +0000 @@ -150,7 +150,7 @@ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { dreamwld_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -219,8 +219,8 @@ { dreamwld_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset * 2); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset * 2 + 1); + state->m_bg_tilemap->mark_tile_dirty(offset * 2); + state->m_bg_tilemap->mark_tile_dirty(offset * 2 + 1); } static TILE_GET_INFO( get_dreamwld_bg_tile_info ) @@ -238,8 +238,8 @@ { dreamwld_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg2_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset * 2); - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset * 2 + 1); + state->m_bg2_tilemap->mark_tile_dirty(offset * 2); + state->m_bg2_tilemap->mark_tile_dirty(offset * 2 + 1); } static TILE_GET_INFO( get_dreamwld_bg2_tile_info ) @@ -258,13 +258,13 @@ state->m_bg_tilemap = tilemap_create(machine, get_dreamwld_bg_tile_info,tilemap_scan_rows, 16, 16, 64,32); state->m_bg2_tilemap = tilemap_create(machine, get_dreamwld_bg2_tile_info,tilemap_scan_rows, 16, 16, 64,32); - tilemap_set_transparent_pen(state->m_bg2_tilemap,0); + state->m_bg2_tilemap->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_bg_tilemap, 256); // line scrolling - tilemap_set_scroll_cols(state->m_bg_tilemap, 1); + state->m_bg_tilemap->set_scroll_rows(256); // line scrolling + state->m_bg_tilemap->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_bg2_tilemap, 256); // line scrolling - tilemap_set_scroll_cols(state->m_bg2_tilemap, 1); + state->m_bg2_tilemap->set_scroll_rows(256); // line scrolling + state->m_bg2_tilemap->set_scroll_cols(1); state->m_spritebuf1 = auto_alloc_array(machine, UINT32, 0x2000 / 4); state->m_spritebuf2 = auto_alloc_array(machine, UINT32, 0x2000 / 4); @@ -272,17 +272,21 @@ } -SCREEN_EOF( dreamwld ) +SCREEN_VBLANK( dreamwld ) { - dreamwld_state *state = machine.driver_data(); - memcpy(state->m_spritebuf2, state->m_spritebuf1, 0x2000); - memcpy(state->m_spritebuf1, state->m_spriteram, 0x2000); + // rising edge + if (vblank_on) + { + dreamwld_state *state = screen.machine().driver_data(); + memcpy(state->m_spritebuf2, state->m_spritebuf1, 0x2000); + memcpy(state->m_spritebuf1, state->m_spriteram, 0x2000); + } } -static SCREEN_UPDATE( dreamwld ) +static SCREEN_UPDATE_IND16( dreamwld ) { - dreamwld_state *state = screen->machine().driver_data(); + dreamwld_state *state = screen.machine().driver_data(); // int tm0size, tm1size; tilemap_t *tmptilemap0, *tmptilemap1; @@ -298,8 +302,8 @@ UINT32 layer0_ctrl = state->m_vregs[0x412 / 4]; UINT32 layer1_ctrl = state->m_vregs[0x416 / 4]; - tilemap_set_scrolly(tmptilemap0, 0, layer0_scrolly); - tilemap_set_scrolly(tmptilemap1, 0, layer1_scrolly); + tmptilemap0->set_scrolly(0, layer0_scrolly); + tmptilemap1->set_scrolly(0, layer1_scrolly); // not on this hw? #if 0 @@ -336,8 +340,8 @@ x0 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x000/2 + ((i + layer0_scrolly)&0xff))]; // different handling to psikyo.c? ( + scrolly ) } - tilemap_set_scrollx( - tmptilemap0, + + tmptilemap0->set_scrollx( (i + layer0_scrolly) % 256 /*tilemap_width(tm0size) */, layer0_scrollx + x0 ); @@ -353,8 +357,8 @@ x1 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x200/2 + ((i + layer1_scrolly)&0xff))]; // different handling to psikyo.c? ( + scrolly ) } - tilemap_set_scrollx( - tmptilemap1, + + tmptilemap1->set_scrollx( (i + layer1_scrolly) % 256 /* tilemap_width(tm1size) */, layer1_scrollx + x1 ); } @@ -366,19 +370,19 @@ if (state->m_tilebank[0] != state->m_tilebankold[0]) { state->m_tilebankold[0] = state->m_tilebank[0]; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (state->m_tilebank[1] != state->m_tilebankold[1]) { state->m_tilebankold[1] = state->m_tilebank[1]; - tilemap_mark_all_tiles_dirty(state->m_bg2_tilemap); + state->m_bg2_tilemap->mark_all_dirty(); } - tilemap_draw(bitmap, cliprect, tmptilemap0, 0, 0); - tilemap_draw(bitmap, cliprect, tmptilemap1, 0, 0); + tmptilemap0->draw(bitmap, cliprect, 0, 0); + tmptilemap1->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -584,11 +588,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512,256) MCFG_SCREEN_VISIBLE_AREA(0, 304-1, 0, 224-1) - MCFG_SCREEN_UPDATE(dreamwld) - MCFG_SCREEN_EOF(dreamwld) + MCFG_SCREEN_UPDATE_STATIC(dreamwld) + MCFG_SCREEN_VBLANK_STATIC(dreamwld) MCFG_PALETTE_LENGTH(0x1000) MCFG_GFXDECODE(dreamwld) diff -Nru mame-0.144/src/mame/drivers/drgnmst.c mame-0.145/src/mame/drivers/drgnmst.c --- mame-0.144/src/mame/drivers/drgnmst.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/drgnmst.c 2012-02-06 21:30:41.000000000 +0000 @@ -421,10 +421,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(drgnmst) + MCFG_SCREEN_UPDATE_STATIC(drgnmst) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/dribling.c mame-0.145/src/mame/drivers/dribling.c --- mame-0.144/src/mame/drivers/dribling.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dribling.c 2012-02-06 21:30:42.000000000 +0000 @@ -332,10 +332,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 40, 255) - MCFG_SCREEN_UPDATE(dribling) + MCFG_SCREEN_UPDATE_STATIC(dribling) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/drmicro.c mame-0.145/src/mame/drivers/drmicro.c --- mame-0.144/src/mame/drivers/drmicro.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/drmicro.c 2012-02-06 21:30:38.000000000 +0000 @@ -268,10 +268,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(drmicro) + MCFG_SCREEN_UPDATE_STATIC(drmicro) MCFG_GFXDECODE(drmicro) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/drtomy.c mame-0.145/src/mame/drivers/drtomy.c --- mame-0.144/src/mame/drivers/drtomy.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/drtomy.c 2012-02-06 21:30:39.000000000 +0000 @@ -68,7 +68,7 @@ 3 | xxxxxxxx xxxxxx-- | sprite code */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { drtomy_state *state = machine.driver_data(); int i, x, y, ex, ey; @@ -120,16 +120,16 @@ state->m_tilemap_bg = tilemap_create(machine, get_tile_info_bg, tilemap_scan_rows, 16, 16, 32, 32); state->m_tilemap_fg = tilemap_create(machine, get_tile_info_fg, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap_fg, 0); + state->m_tilemap_fg->set_transparent_pen(0); } -static SCREEN_UPDATE( drtomy ) +static SCREEN_UPDATE_IND16( drtomy ) { - drtomy_state *state = screen->machine().driver_data(); + drtomy_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap_bg, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_fg, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 0); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -137,14 +137,14 @@ { drtomy_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram_fg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_fg, offset); + state->m_tilemap_fg->mark_tile_dirty(offset); } static WRITE16_HANDLER( drtomy_vram_bg_w ) { drtomy_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram_bg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_bg, offset); + state->m_tilemap_bg->mark_tile_dirty(offset); } static WRITE16_DEVICE_HANDLER( drtomy_okibank_w ) @@ -305,10 +305,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(drtomy) + MCFG_SCREEN_UPDATE_STATIC(drtomy) MCFG_GFXDECODE(drtomy) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/drw80pkr.c mame-0.145/src/mame/drivers/drw80pkr.c --- mame-0.144/src/mame/drivers/drw80pkr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/drw80pkr.c 2012-02-06 21:30:38.000000000 +0000 @@ -134,7 +134,7 @@ state->m_video_ram[n_offs] += ((data & 0xf0) << 4 ); // high address } - tilemap_mark_tile_dirty(state->m_bg_tilemap, n_offs); + state->m_bg_tilemap->mark_tile_dirty(n_offs); } if (state->m_p2 == 0xc7) @@ -337,10 +337,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 24, 27); } -static SCREEN_UPDATE( drw80pkr ) +static SCREEN_UPDATE_IND16( drw80pkr ) { - drw80pkr_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + drw80pkr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -473,10 +473,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((31+1)*8, (31+1)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 24*8-1, 0*8, 27*8-1) - MCFG_SCREEN_UPDATE(drw80pkr) + MCFG_SCREEN_UPDATE_STATIC(drw80pkr) MCFG_GFXDECODE(drw80pkr) MCFG_PALETTE_LENGTH(16*16) diff -Nru mame-0.144/src/mame/drivers/dunhuang.c mame-0.145/src/mame/drivers/dunhuang.c --- mame-0.144/src/mame/drivers/dunhuang.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/dunhuang.c 2012-02-06 21:30:39.000000000 +0000 @@ -122,8 +122,8 @@ state->m_tmap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 0x40,0x20); state->m_tmap2 = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 8,32, 0x40,0x8); - tilemap_set_transparent_pen(state->m_tmap, 0); - tilemap_set_transparent_pen(state->m_tmap2, 0); + state->m_tmap->set_transparent_pen(0); + state->m_tmap2->set_transparent_pen(0); state->save_item(NAME(state->m_videoram)); state->save_item(NAME(state->m_colorram)); @@ -132,36 +132,36 @@ state->save_item(NAME(state->m_paldata)); } -static SCREEN_UPDATE( dunhuang ) +static SCREEN_UPDATE_IND16( dunhuang ) { - dunhuang_state *state = screen->machine().driver_data(); + dunhuang_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #if DUNHUANG_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; if (msk != 0) layers_ctrl &= msk; } #endif - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); switch (state->m_layers) { case 0x04: // girl select: bg over fg - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, state->m_tmap2, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + if (layers_ctrl & 2) state->m_tmap2->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) state->m_tmap->draw(bitmap, cliprect, 0, 0); break; case 0x05: // dips: must hide fg - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_tmap, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) state->m_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); break; case 0x07: // game,demo: fg over bg default: - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_tmap, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, state->m_tmap2, 0, 0); + if (layers_ctrl & 1) state->m_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 2) state->m_tmap2->draw(bitmap, cliprect, 0, 0); break; } @@ -210,7 +210,7 @@ case 1: state->m_videoram[addr] = (state->m_videoram[addr] & 0x00ff) | (data<<8); break; case 2: state->m_colorram[addr] = data; break; } - tilemap_mark_tile_dirty(state->m_tmap, addr); + state->m_tmap->mark_tile_dirty(addr); } static WRITE8_HANDLER( dunhuang_tile2_w ) @@ -237,7 +237,7 @@ case 1: state->m_videoram2[addr] = (state->m_videoram2[addr] & 0x00ff) | (data<<8); break; case 2: state->m_colorram2[addr] = data; break; } - tilemap_mark_tile_dirty(state->m_tmap2, addr); + state->m_tmap2->mark_tile_dirty(addr); } // Clear a row of tiles (videoram) @@ -258,7 +258,7 @@ state->m_videoram[addr] = 0; state->m_colorram[addr] = 0; - tilemap_mark_tile_dirty(state->m_tmap, addr); + state->m_tmap->mark_tile_dirty(addr); } } @@ -275,7 +275,7 @@ state->m_videoram2[addr] = 1; state->m_colorram2[addr] = 0; - tilemap_mark_tile_dirty(state->m_tmap2, addr); + state->m_tmap2->mark_tile_dirty(addr); } } @@ -351,7 +351,7 @@ state->m_videoram[addr] = (tile_addr[1] << 8) | tile_addr[0]; state->m_colorram[addr] = state->m_block_c; - tilemap_mark_tile_dirty(state->m_tmap, addr); + state->m_tmap->mark_tile_dirty(addr); tile_addr += 4; } } @@ -366,7 +366,7 @@ state->m_videoram2[addr] = (tile_addr[1] << 8) | tile_addr[0]; state->m_colorram2[addr] = state->m_block_c; - tilemap_mark_tile_dirty(state->m_tmap2, addr); + state->m_tmap2->mark_tile_dirty(addr); tile_addr += 4; } } @@ -829,10 +829,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0+8, 512-8-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(dunhuang) + MCFG_SCREEN_UPDATE_STATIC(dunhuang) MCFG_GFXDECODE(dunhuang) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/dwarfd.c mame-0.145/src/mame/drivers/dwarfd.c --- mame-0.144/src/mame/drivers/dwarfd.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/dwarfd.c 2012-02-06 21:30:34.000000000 +0000 @@ -8,7 +8,7 @@ TODO: - - finish 8275 CRT emulation, split off as device + - convert driver to use i8275 CRT device emulation - fix gfx glitches and banking - correct colors - DIPs @@ -297,7 +297,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/i8085/i8085.h" #include "sound/ay8910.h" @@ -305,7 +304,9 @@ { public: dwarfd_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* video-related */ int m_bank; @@ -330,6 +331,8 @@ /* memory */ UINT8 m_dw_ram[0x1000]; UINT8 m_videobuf[0x8000]; + + required_device m_maincpu; }; @@ -771,7 +774,7 @@ { } -static void drawCrt( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void drawCrt( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { dwarfd_state *state = machine.driver_data(); int x, y; @@ -832,10 +835,10 @@ } -static SCREEN_UPDATE( dwarfd ) +static SCREEN_UPDATE_IND16( dwarfd ) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - drawCrt(screen->machine(), bitmap, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + drawCrt(screen.machine(), bitmap, cliprect); return 0; } @@ -855,22 +858,25 @@ }; -#define NUM_LINES 25 -static INTERRUPT_GEN( dwarfd_interrupt ) +static TIMER_DEVICE_CALLBACK( dwarfd_interrupt ) { - dwarfd_state *state = device->machine().driver_data(); + dwarfd_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 8) != 0) + return; - if (cpu_getiloops(device) < NUM_LINES) + if (scanline < 25*8) { - device_set_input_line(device, I8085_RST65_LINE, HOLD_LINE); // 34 - every 8th line - state->m_line = cpu_getiloops(device); + device_set_input_line(state->m_maincpu, I8085_RST65_LINE, HOLD_LINE); // 34 - every 8th line + state->m_line = scanline/8; state->m_idx = 0; } else { - if (cpu_getiloops(device) == NUM_LINES) + if (scanline == 25*8) { - device_set_input_line(device, I8085_RST55_LINE, HOLD_LINE);//2c - generated by crt - end of frame + device_set_input_line(state->m_maincpu, I8085_RST55_LINE, HOLD_LINE);//2c - generated by crt - end of frame } } } @@ -1056,8 +1062,7 @@ MCFG_CPU_CONFIG(dwarfd_i8085_config) MCFG_CPU_PROGRAM_MAP(mem_map) MCFG_CPU_IO_MAP(io_map) - - MCFG_CPU_VBLANK_INT_HACK(dwarfd_interrupt,NUM_LINES+4) //16 +vblank + 1 unused + MCFG_TIMER_ADD_SCANLINE("scantimer", dwarfd_interrupt, "screen", 0, 1) MCFG_MACHINE_START(dwarfd) MCFG_MACHINE_RESET(dwarfd) @@ -1066,10 +1071,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(272*2, 200) + MCFG_SCREEN_SIZE(272*2, 200+4*8) MCFG_SCREEN_VISIBLE_AREA(0, 272*2-1, 0, 200-1) - MCFG_SCREEN_UPDATE(dwarfd) + MCFG_SCREEN_UPDATE_STATIC(dwarfd) MCFG_GFXDECODE(dwarfd) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/dynadice.c mame-0.145/src/mame/drivers/dynadice.c --- mame-0.144/src/mame/drivers/dynadice.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/dynadice.c 2012-02-06 21:30:40.000000000 +0000 @@ -62,8 +62,8 @@ { dynadice_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_all_tiles_dirty(state->m_top_tilemap); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_top_tilemap->mark_all_dirty(); } static WRITE8_HANDLER( sound_data_w ) @@ -203,16 +203,16 @@ /* pacman - style videoram layout */ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_top_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_cols, 8, 8, 2, 32); - tilemap_set_scrollx(state->m_bg_tilemap, 0, -16); + state->m_bg_tilemap->set_scrollx(0, -16); } -static SCREEN_UPDATE( dynadice ) +static SCREEN_UPDATE_IND16( dynadice ) { - dynadice_state *state = screen->machine().driver_data(); - rectangle myclip = *cliprect; + dynadice_state *state = screen.machine().driver_data(); + rectangle myclip = cliprect; myclip.max_x = 15; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, &myclip, state->m_top_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_top_tilemap->draw(bitmap, myclip, 0, 0); return 0; } @@ -255,10 +255,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256+16, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 3*8, 28*8-1) - MCFG_SCREEN_UPDATE(dynadice) + MCFG_SCREEN_UPDATE_STATIC(dynadice) MCFG_GFXDECODE(dynadice) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/dynax.c mame-0.145/src/mame/drivers/dynax.c --- mame-0.144/src/mame/drivers/dynax.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/dynax.c 2012-02-06 21:30:36.000000000 +0000 @@ -73,7 +73,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "includes/dynax.h" #include "cpu/tlcs90/tlcs90.h" #include "machine/msm6242.h" @@ -360,7 +359,9 @@ case 0x1c: // RTC { - msm6242_w(state->m_rtc, offset, data); + msm6242_device *rtc = space->machine().device("rtc"); + + rtc->write(*space, offset,data); } return; @@ -766,10 +767,15 @@ static WRITE8_HANDLER( yarunara_rombank_w ) { - dynax_state *state = space->machine().driver_data(); - memory_set_bank(space->machine(), "bank1", data); + dynax_state *state = space->machine().driver_data(); + int bank_n = (space->machine().region("maincpu")->bytes() - 0x10000) / 0x8000; - state->m_hnoridur_bank = data; + //logerror("%04x: rom bank = %02x\n", cpu_get_pc(&space->device()), data); + if (data < bank_n) + memory_set_bank(space->machine(), "bank1", data); + else + logerror("rom_bank = %02x (larger than the maximum bank %02x)\n",data, bank_n); + state->m_hnoridur_bank = data; } static WRITE8_HANDLER( yarunara_flipscreen_w ) @@ -1246,7 +1252,7 @@ AM_RANGE( 0x42, 0x42 ) AM_DEVREAD("aysnd", ay8910_r) // AM_RANGE( 0x44, 0x44 ) AM_DEVWRITE("aysnd", ay8910_data_w) // AM_RANGE( 0x46, 0x47 ) AM_DEVWRITE("ymsnd", ym2413_w) // - AM_RANGE( 0x80, 0x8f ) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) // 6242RTC + AM_RANGE( 0x80, 0x8f ) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE( 0xa0, 0xa3 ) AM_WRITE(ddenlovr_palette_base_w) // ddenlovr mixer chip AM_RANGE( 0xa4, 0xa7 ) AM_WRITE(ddenlovr_palette_mask_w) AM_RANGE( 0xa8, 0xab ) AM_WRITE(ddenlovr_transparency_pen_w) @@ -1470,7 +1476,11 @@ if (state->m_rombank < 0x10) return state->m_romptr[offset]; else if ((state->m_rombank == 0x10) && (offset < 0x10)) - return msm6242_r(state->m_rtc, offset); + { + msm6242_device *rtc = space->machine().device("rtc"); + + return rtc->read(*space, offset); + } else if (state->m_rombank == 0x12) return tenkai_palette_r(space, offset); @@ -1484,7 +1494,9 @@ if ((state->m_rombank == 0x10) && (offset < 0x10)) { - msm6242_w(state->m_rtc, offset, data); + msm6242_device *rtc = space->machine().device("rtc"); + + rtc->write(*space, offset, data); return; } else if (state->m_rombank == 0x12) @@ -4351,10 +4363,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1-4, 16+8, 255-8) - MCFG_SCREEN_UPDATE(hanamai) + MCFG_SCREEN_UPDATE_STATIC(hanamai) MCFG_PALETTE_LENGTH(512) @@ -4409,10 +4420,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 256) + MCFG_SCREEN_SIZE(512, 256+22) MCFG_SCREEN_VISIBLE_AREA(0, 512-1-4, 16, 256-1) - MCFG_SCREEN_UPDATE(hnoridur) + MCFG_SCREEN_UPDATE_STATIC(hnoridur) MCFG_PALETTE_LENGTH(16*256) @@ -4455,10 +4465,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1-4, 16, 256-1) - MCFG_SCREEN_UPDATE(hnoridur) + MCFG_SCREEN_UPDATE_STATIC(hnoridur) MCFG_PALETTE_LENGTH(16*256) @@ -4514,10 +4523,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 256-1) - MCFG_SCREEN_UPDATE(sprtmtch) + MCFG_SCREEN_UPDATE_STATIC(sprtmtch) MCFG_PALETTE_LENGTH(512) @@ -4557,10 +4565,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1) - MCFG_SCREEN_UPDATE(mjdialq2) + MCFG_SCREEN_UPDATE_STATIC(mjdialq2) MCFG_PALETTE_LENGTH(512) @@ -4608,6 +4615,11 @@ sprtmtch_update_irq(device->machine()); } +static MSM6242_INTERFACE( yarunara_rtc_intf ) +{ + DEVCB_NULL +}; + static MACHINE_CONFIG_DERIVED( yarunara, hnoridur ) /* basic machine hardware */ @@ -4619,11 +4631,10 @@ MCFG_NVRAM_REPLACE_0FILL("nvram") MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 8, 256-1-8-1) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", yarunara_rtc_intf) MACHINE_CONFIG_END @@ -4688,6 +4699,12 @@ MACHINE_START_CALL(dynax); } +static MSM6242_INTERFACE( jantouki_rtc_intf ) +{ + DEVCB_NULL +}; + + static MACHINE_CONFIG_START( jantouki, dynax_state ) /* basic machine hardware */ @@ -4711,20 +4728,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhuov) MCFG_SCREEN_ADD("top", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 256-1) - MCFG_SCREEN_UPDATE(jantouki) + MCFG_SCREEN_UPDATE_STATIC(jantouki_top) MCFG_SCREEN_ADD("bottom", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 256-1) - MCFG_SCREEN_UPDATE(jantouki) + MCFG_SCREEN_UPDATE_STATIC(jantouki_bottom) MCFG_PALETTE_INIT(sprtmtch) // static palette MCFG_VIDEO_START(jantouki) @@ -4747,7 +4762,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", jantouki_rtc_intf) MACHINE_CONFIG_END @@ -4800,24 +4815,24 @@ device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x42); } -static INTERRUPT_GEN( neruton_vblank_interrupt ) +static TIMER_DEVICE_CALLBACK( neruton_irq_scanline ) { - dynax_state *state = device->machine().driver_data(); + dynax_state *state = timer.machine().driver_data(); + int scanline = param; // This is a kludge to avoid losing blitter interrupts // there should be a vblank ack mechanism if (state->m_blitter_irq) return; - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x40); break; - default: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x46); break; - } + if(scanline == 256) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x40); + else if((scanline % 32) == 0) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x46); } static MACHINE_CONFIG_DERIVED( neruton, mjelctrn ) MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT_HACK(neruton_vblank_interrupt,1+10) /* IM 2 needs a vector on the data bus */ + MCFG_TIMER_ADD_SCANLINE("scantimer", neruton_irq_scanline, "screen", 0, 1) MCFG_VIDEO_START(neruton) MACHINE_CONFIG_END @@ -4829,21 +4844,25 @@ /* It runs in IM 2, thus needs a vector on the data bus: 0x42 and 0x44 are very similar, they should be triggered by the blitter 0x40 is vblank */ -static INTERRUPT_GEN( majxtal7_vblank_interrupt ) + +static TIMER_DEVICE_CALLBACK( majxtal7_vblank_interrupt ) { - dynax_state *state = device->machine().driver_data(); + dynax_state *state = timer.machine().driver_data(); + int scanline = param; // This is a kludge to avoid losing blitter interrupts // there should be a vblank ack mechanism if (state->m_blitter_irq) return; - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x40); + if(scanline == 256) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x40); + else if((scanline % 32) == 0) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x44); // temp kludge } static MACHINE_CONFIG_DERIVED( majxtal7, neruton ) - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", majxtal7_vblank_interrupt) /* IM 2 needs a vector on the data bus */ - + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(majxtal7_vblank_interrupt) MACHINE_CONFIG_END @@ -4860,6 +4879,12 @@ DEVCB_NULL, DEVCB_HANDLER(htengoku_dsw_w) // W }; +static MSM6242_INTERFACE( htengoku_rtc_intf ) +{ + DEVCB_NULL +}; + + static MACHINE_CONFIG_START( htengoku, dynax_state ) /* basic machine hardware */ @@ -4878,10 +4903,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 336-1, 0+8, 256-1-8) - MCFG_SCREEN_UPDATE(htengoku) + MCFG_SCREEN_UPDATE_STATIC(htengoku) MCFG_PALETTE_LENGTH(16*256) @@ -4899,7 +4923,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", htengoku_rtc_intf) MACHINE_CONFIG_END @@ -4907,14 +4931,16 @@ Mahjong Tenkaigen ***************************************************************************/ -static INTERRUPT_GEN( tenkai_interrupt ) +static TIMER_DEVICE_CALLBACK( tenkai_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, INPUT_LINE_IRQ0, HOLD_LINE); break; - case 1: device_set_input_line(device, INPUT_LINE_IRQ1, HOLD_LINE); break; - case 2: device_set_input_line(device, INPUT_LINE_IRQ2, HOLD_LINE); break; - } + dynax_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 256) + device_set_input_line(state->m_maincpu, INPUT_LINE_IRQ0, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, INPUT_LINE_IRQ1, HOLD_LINE); } static const ay8910_interface tenkai_ay8910_interface = @@ -4933,13 +4959,25 @@ machine.save().register_postload(save_prepost_delegate(FUNC(tenkai_update_rombank), &machine)); } +static WRITE_LINE_DEVICE_HANDLER(tenkai_rtc_irq) +{ + dynax_state *drvstate = device->machine().driver_data(); + + device_set_input_line(drvstate->m_maincpu, INPUT_LINE_IRQ2, HOLD_LINE); +} + +static MSM6242_INTERFACE( tenkai_rtc_intf ) +{ + DEVCB_LINE(tenkai_rtc_irq) +}; + static MACHINE_CONFIG_START( tenkai, dynax_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",TMP91640, 21472700 / 2) MCFG_CPU_PROGRAM_MAP(tenkai_map) MCFG_CPU_IO_MAP(tenkai_io_map) - MCFG_CPU_VBLANK_INT_HACK(tenkai_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", tenkai_interrupt, "screen", 0, 1) MCFG_MACHINE_START(tenkai) MCFG_MACHINE_RESET(dynax) @@ -4950,10 +4988,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 256) + MCFG_SCREEN_SIZE(512, 256+22) MCFG_SCREEN_VISIBLE_AREA(4, 512-1, 4, 255-8-4) // hide first 4 horizontal pixels (see scroll of gal 4 in test mode) - MCFG_SCREEN_UPDATE(hnoridur) + MCFG_SCREEN_UPDATE_STATIC(hnoridur) MCFG_PALETTE_LENGTH(16*256) @@ -4970,7 +5007,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", tenkai_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( majrjhdx, tenkai ) @@ -5020,10 +5057,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(2, 256-1, 16, 256-1) - MCFG_SCREEN_UPDATE(mjdialq2) + MCFG_SCREEN_UPDATE_STATIC(mjdialq2) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT(sprtmtch) // static palette diff -Nru mame-0.144/src/mame/drivers/dynduke.c mame-0.145/src/mame/drivers/dynduke.c --- mame-0.144/src/mame/drivers/dynduke.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/dynduke.c 2012-02-06 21:30:41.000000000 +0000 @@ -292,11 +292,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(dynduke) - MCFG_SCREEN_EOF(dynduke) + MCFG_SCREEN_UPDATE_STATIC(dynduke) + MCFG_SCREEN_VBLANK_STATIC(dynduke) MCFG_GFXDECODE(dynduke) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/ecoinf1.c mame-0.145/src/mame/drivers/ecoinf1.c --- mame-0.144/src/mame/drivers/ecoinf1.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/ecoinf1.c 2012-02-06 21:30:37.000000000 +0000 @@ -335,6 +335,6 @@ } // Early HW Type -GAME( 19??, ec_bar5, 0 , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Bar 5 (older PCB) (Electrocoin)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_barxo, ec_barx , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Bar X (older PCB) (Electrocoin)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_casbxo, ec_casbx , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Casino Bar X (older PCB) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, ec_bar5, 0 , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Bar 5 (older PCB) (Electrocoin)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 19??, ec_barxo, ec_barx , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Bar X (older PCB) (Electrocoin)" , GAME_IS_SKELETON_MECHANICAL) +GAME( 19??, ec_casbxo, ec_casbx , ecoinf1_older, ecoinf1, ecoinf1, ROT0, "Electrocoin", "Casino Bar X (older PCB) (Electrocoin) (?)" , GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/ecoinfr.c mame-0.145/src/mame/drivers/ecoinfr.c --- mame-0.144/src/mame/drivers/ecoinfr.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/ecoinfr.c 2012-02-06 21:30:37.000000000 +0000 @@ -1484,36 +1484,38 @@ // descramble here } +#define GAME_FLAGS GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL + // Regular HW Type (there are all rather jumbled up and need sorting properly at some point) -GAME( 19??, ec_barx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Bar X (Electrocoin)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_mag7s, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Magic 7s / Cool 7 / Bar X 7 (2001 COOL7) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // roms had various labels, but all seem to be the same thing / mixed up. -GAME( 19??, ec_bxd7s, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Bar X Diamond 7s (2006 COOL7) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_big7, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Big 7 / Super Big 7 (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // these sets were all mixed up, so I've just put them together for now. -GAME( 19??, ec_casbx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Casino Bar X (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_redbr, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Red Bar (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // a mix of REDBAR and 2001 REDBAR -GAME( 19??, ec_supbx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Super Bar X (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_spbxd, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Super Bar X Deluxe (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_unk1, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "unknown 'Electrocoin' Fruit Machine '300615' (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_unk5, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "unknown 'Electrocoin' Fruit Machine(s) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, ec_barx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Bar X (Electrocoin)" , GAME_FLAGS) +GAME( 19??, ec_mag7s, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Magic 7s / Cool 7 / Bar X 7 (2001 COOL7) (Electrocoin) (?)" , GAME_FLAGS) // roms had various labels, but all seem to be the same thing / mixed up. +GAME( 19??, ec_bxd7s, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Bar X Diamond 7s (2006 COOL7) (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_big7, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Big 7 / Super Big 7 (Electrocoin) (?)" , GAME_FLAGS) // these sets were all mixed up, so I've just put them together for now. +GAME( 19??, ec_casbx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Casino Bar X (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_redbr, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Red Bar (Electrocoin) (?)" , GAME_FLAGS) // a mix of REDBAR and 2001 REDBAR +GAME( 19??, ec_supbx, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Super Bar X (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_spbxd, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "Super Bar X Deluxe (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_unk1, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "unknown 'Electrocoin' Fruit Machine '300615' (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_unk5, 0 , ecoinfr, ecoinfr_barx, ecoinfr, ROT0, "Electrocoin", "unknown 'Electrocoin' Fruit Machine(s) (Electrocoin) (?)" , GAME_FLAGS) // 3rd party sets with MAB scrambling, game names might be incorrect, should be the same basic hardware as these tho. -GAME( 19??, ec_barxmab, ec_barx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Bar X (MAB PCB) (Electrocoin)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // scrambled roms -GAME( 19??, ec_spbg7mab,ec_big7 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Super Big 7 (MAB PCB) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_supbxmab,ec_supbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Super Bar X (MAB PCB) (Electrocoin) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, ec_barxmab, ec_barx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Bar X (MAB PCB) (Electrocoin)" , GAME_FLAGS) // scrambled roms +GAME( 19??, ec_spbg7mab,ec_big7 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Super Big 7 (MAB PCB) (Electrocoin) (?)" , GAME_FLAGS) +GAME( 19??, ec_supbxmab,ec_supbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Electrocoin", "Super Bar X (MAB PCB) (Electrocoin) (?)" , GAME_FLAGS) //Games using the MAB scrambling, but identified as being from Concept Games -GAME( 19??, ec_casbxcon,ec_casbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Casino Bar X (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_multb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Multi Bar (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_supbxcon,ec_supbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Super Bar X (MAB PCB) (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_casmb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Casino Multi Bar (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_supmb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Super Multi Bar (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_stkex, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Stake X (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_fltr, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Flutter (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_rdht7, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Red Hot 7 (MAB PCB?) (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_unkt, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Unknown 'T' (MAB PCB?) (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, ec_casbxcon,ec_casbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Casino Bar X (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_multb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Multi Bar (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_supbxcon,ec_supbx , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Super Bar X (MAB PCB) (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_casmb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Casino Multi Bar (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_supmb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Super Multi Bar (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_stkex, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Stake X (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_fltr, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Flutter (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_rdht7, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Red Hot 7 (MAB PCB?) (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_unkt, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Unknown 'T' (MAB PCB?) (Concept Games Ltd) (?)" , GAME_FLAGS) //These look more like some variant of Astra Gaming hardware than the MAB PCB, but I can't be sure. Certainly they dont seem to be on the base hardware -GAME( 19??, ec_gold7, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Golden 7 (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_mgbel, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Megabell (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_jackb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Jackpot Bars (MAB PCB?) (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, ec_ndgxs, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Nudge Xcess (MAB PCB?) (Concept Games Ltd) (?)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, ec_gold7, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Golden 7 (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_mgbel, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Megabell (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_jackb, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Jackpot Bars (MAB PCB?) (Concept Games Ltd) (?)" , GAME_FLAGS) +GAME( 19??, ec_ndgxs, 0 , ecoinfr, ecoinfr_barx, ecoinfrmab, ROT0, "Concept Games Ltd", "Nudge Xcess (MAB PCB?) (Concept Games Ltd) (?)" , GAME_FLAGS) diff -Nru mame-0.144/src/mame/drivers/egghunt.c mame-0.145/src/mame/drivers/egghunt.c --- mame-0.144/src/mame/drivers/egghunt.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/egghunt.c 2012-02-06 21:30:39.000000000 +0000 @@ -69,7 +69,7 @@ }; -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { egghunt_state *state = machine.driver_data(); int flipscreen = 0; @@ -150,7 +150,7 @@ else { state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } } @@ -158,7 +158,7 @@ { egghunt_state *state = space->machine().driver_data(); state->m_atram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -172,11 +172,11 @@ state->save_item(NAME(state->m_spram)); } -static SCREEN_UPDATE(egghunt) +static SCREEN_UPDATE_IND16(egghunt) { - egghunt_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + egghunt_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -187,7 +187,7 @@ // data & 0x30 is used for sprites banking state->m_gfx_banking = data & 0x33; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } static WRITE8_HANDLER( egghunt_vidram_bank_w ) @@ -423,10 +423,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(egghunt) + MCFG_SCREEN_UPDATE_STATIC(egghunt) MCFG_GFXDECODE(egghunt) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/embargo.c mame-0.145/src/mame/drivers/embargo.c --- mame-0.144/src/mame/drivers/embargo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/embargo.c 2012-02-06 21:30:37.000000000 +0000 @@ -31,9 +31,9 @@ * *************************************/ -static SCREEN_UPDATE( embargo ) +static SCREEN_UPDATE_RGB32( embargo ) { - embargo_state *state = screen->machine().driver_data(); + embargo_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -47,7 +47,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data >> 1; x = x + 1; @@ -264,11 +264,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(embargo) + MCFG_SCREEN_UPDATE_STATIC(embargo) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/enigma2.c mame-0.145/src/mame/drivers/enigma2.c --- mame-0.144/src/mame/drivers/enigma2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/enigma2.c 2012-02-06 21:30:33.000000000 +0000 @@ -196,13 +196,13 @@ } -static SCREEN_UPDATE( enigma2 ) +static SCREEN_UPDATE_RGB32( enigma2 ) { - enigma2_state *state = screen->machine().driver_data(); + enigma2_state *state = screen.machine().driver_data(); pen_t pens[NUM_PENS]; - const rectangle &visarea = screen->visible_area(); - UINT8 *prom = screen->machine().region("proms")->base(); + const rectangle &visarea = screen.visible_area(); + UINT8 *prom = screen.machine().region("proms")->base(); UINT8 *color_map_base = state->m_flip_screen ? &prom[0x0400] : &prom[0x0000]; UINT8 *star_map_base = (state->m_blink_count & 0x08) ? &prom[0x0c00] : &prom[0x0800]; @@ -226,7 +226,7 @@ offs_t color_map_address = (y >> 3 << 5) | (x >> 3); /* the schematics shows it like this, but it doesn't work as this would produce no stars, due to the contents of the PROM -- maybe there is - a star disabled bit somewhere that's connected here instead of flip_screen_get(screen->machine()) */ + a star disabled bit somewhere that's connected here instead of flip_screen_get(screen.machine()) */ /* star_map_address = (y >> 4 << 6) | (engima2_flip_screen_get() << 5) | (x >> 3); */ offs_t star_map_address = (y >> 4 << 6) | 0x20 | (x >> 3); @@ -260,7 +260,7 @@ /* stars only appear at certain positions */ color = ((x & y & 0x0f) == 0x0f) ? star_color : 0; - *BITMAP_ADDR32(bitmap, bitmap_y, x) = pens[color]; + bitmap.pix32(bitmap_y, x) = pens[color]; /* next pixel */ x = x + 1; @@ -284,11 +284,11 @@ } -static SCREEN_UPDATE( enigma2a ) +static SCREEN_UPDATE_RGB32( enigma2a ) { - enigma2_state *state = screen->machine().driver_data(); + enigma2_state *state = screen.machine().driver_data(); UINT8 x = 0; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); UINT16 bitmap_y = visarea.min_y; UINT8 y = (UINT8)vpos_to_vysnc_chain_counter(bitmap_y); UINT8 video_data = 0; @@ -323,7 +323,7 @@ } pen = bit ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, bitmap_y, x) = pen; + bitmap.pix32(bitmap_y, x) = pen; /* next pixel */ x = x + 1; @@ -615,9 +615,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(enigma2) + MCFG_SCREEN_UPDATE_STATIC(enigma2) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -644,9 +643,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(enigma2a) + MCFG_SCREEN_UPDATE_STATIC(enigma2a) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/eolith16.c mame-0.145/src/mame/drivers/eolith16.c --- mame-0.144/src/mame/drivers/eolith16.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/eolith16.c 2012-02-06 21:30:36.000000000 +0000 @@ -11,7 +11,6 @@ #include "emu.h" #include "cpu/e132xs/e132xs.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "sound/okim6295.h" #include "includes/eolithsp.h" @@ -122,9 +121,9 @@ state->m_vram = auto_alloc_array(machine, UINT16, 0x10000); } -static SCREEN_UPDATE( eolith16 ) +static SCREEN_UPDATE_IND16( eolith16 ) { - eolith16_state *state = screen->machine().driver_data(); + eolith16_state *state = screen.machine().driver_data(); int x,y,count; int color; @@ -134,10 +133,10 @@ for (x=0;x < 320/2;x++) { color = state->m_vram[count + (0x10000/2) * (state->m_vbuffer ^ 1)] & 0xff; - *BITMAP_ADDR16(bitmap, y, x*2 + 0) = color; + bitmap.pix16(y, x*2 + 0) = color; color = (state->m_vram[count + (0x10000/2) * (state->m_vbuffer ^ 1)] & 0xff00) >> 8; - *BITMAP_ADDR16(bitmap, y, x*2 + 1) = color; + bitmap.pix16(y, x*2 + 1) = color; count++; } @@ -175,18 +174,17 @@ static MACHINE_CONFIG_START( eolith16, eolith16_state ) MCFG_CPU_ADD("maincpu", E116T, 60000000) /* no internal multiplier */ MCFG_CPU_PROGRAM_MAP(eolith16_map) - MCFG_CPU_VBLANK_INT_HACK(eolith_speedup,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", eolith_speedup, "screen", 0, 1) MCFG_EEPROM_ADD("eeprom", eeprom_interface_93C66) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE(512, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 199) - MCFG_SCREEN_UPDATE(eolith16) + MCFG_SCREEN_UPDATE_STATIC(eolith16) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/eolith.c mame-0.145/src/mame/drivers/eolith.c --- mame-0.144/src/mame/drivers/eolith.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/eolith.c 2012-02-06 21:30:39.000000000 +0000 @@ -82,11 +82,8 @@ #include "emu.h" #include "cpu/e132xs/e132xs.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "includes/eolith.h" - - #include "includes/eolithsp.h" // It's configured for 512 bytes @@ -381,6 +378,55 @@ PORT_BIT( 0xfffffff0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END + +static INPUT_PORTS_START( stealsee ) + PORT_INCLUDE(landbrk) + + PORT_MODIFY("IN0") + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00000008, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(stealsee_speedup_getvblank, NULL) + PORT_BIT( 0x00003f80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_SERVICE_NO_TOGGLE( 0x00008000, IP_ACTIVE_LOW ) + PORT_BIT( 0x00010000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00020000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x00400000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00800000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01000000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x02000000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x04000000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x08000000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) + PORT_BIT( 0x10000000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20000000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x40000000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80000000, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_MODIFY("DSW1") + PORT_DIPNAME( 0x00000001, 0x00000001, "Show Settings" ) + PORT_DIPSETTING( 0x00000001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00000002, 0x00000002, "Show Counters" ) + PORT_DIPSETTING( 0x00000002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00000004, 0x00000004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00000004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00000008, 0x00000008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00000008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_BIT( 0xfffffff0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + static INPUT_PORTS_START( puzzlekg ) PORT_INCLUDE(common) PORT_MODIFY("IN0") @@ -397,7 +443,7 @@ static MACHINE_CONFIG_START( eolith45, eolith_state ) MCFG_CPU_ADD("maincpu", E132N, 45000000) /* 45 MHz */ MCFG_CPU_PROGRAM_MAP(eolith_map) - MCFG_CPU_VBLANK_INT_HACK(eolith_speedup,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", eolith_speedup, "screen", 0, 1) /* sound cpu */ @@ -406,11 +452,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) + MCFG_SCREEN_SIZE(512, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(eolith) + MCFG_SCREEN_UPDATE_STATIC(eolith) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) MCFG_PALETTE_LENGTH(32768) @@ -970,6 +1015,46 @@ ROM_END +ROM_START( stealsee ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Hyperstone CPU Code */ + ROM_LOAD( "ss.u43", 0x00000, 0x80000, CRC(b0a1a965) SHA1(e13f336035a266da66ca8f95b92cac7295323989) ) + + ROM_REGION32_BE( 0x2000000, "user1", ROMREGION_ERASEFF ) /* Game Data - banked ROM, swapping necessary */ + ROM_LOAD32_WORD_SWAP( "00.u5", 0x0000000, 0x200000, CRC(59d247a7) SHA1(a206cbb27f8054baca76dc72e6f45be4c9a914b1) ) // FIXED BITS (xxxxxxxx0xxxxxxx) + ROM_LOAD32_WORD_SWAP( "01.u1", 0x0000002, 0x200000, CRC(255764f2) SHA1(b1d25898961ddbed9865620269cb0cd0ab506cd9) ) + ROM_LOAD32_WORD_SWAP( "02.u6", 0x0400000, 0x200000, CRC(ebc33180) SHA1(7f59263754e9e2c32a5942daed60770dc4d4f6b5) ) + ROM_LOAD32_WORD_SWAP( "03.u2", 0x0400002, 0x200000, CRC(a81f9b6d) SHA1(0bc018f1503c2d43ba0b089cb1476dfc276af94a) ) + ROM_LOAD32_WORD_SWAP( "04.u7", 0x0800000, 0x200000, CRC(24bf37ad) SHA1(393bd11afd0135190d0c72f6affb625a933d8685) ) + ROM_LOAD32_WORD_SWAP( "05.u3", 0x0800002, 0x200000, CRC(ef6b9450) SHA1(ef99a2e4127890b2e954547371eddcb364c74503) ) + ROM_LOAD32_WORD_SWAP( "06.u8", 0x0c00000, 0x200000, CRC(284629c6) SHA1(46d3beb68885faff40f9abe5fdbc84547b94937d) ) + ROM_LOAD32_WORD_SWAP( "07.u4", 0x0c00002, 0x200000, CRC(a64d4434) SHA1(58ac9eef27a39d06723a13e7702d1c77d09eb9a5) ) + ROM_LOAD32_WORD_SWAP( "08.u15", 0x1000000, 0x200000, CRC(861eab08) SHA1(280c833553fb70252deb801a93b0685212e249fe) ) + ROM_LOAD32_WORD_SWAP( "09.u10", 0x1000002, 0x200000, CRC(fd96282e) SHA1(30e35bf61ad3fdd9bc2c384edd8619d8850f5c49) ) + ROM_LOAD32_WORD_SWAP( "10.u16", 0x1400000, 0x200000, CRC(761e0a26) SHA1(d9d73f9cf9d00e35298b5edfc4872a36019c9fcd) ) // FIXED BITS (xxxxxxxx0000000x) + ROM_LOAD32_WORD_SWAP( "11.u11", 0x1400002, 0x200000, CRC(574571e7) SHA1(8507b34c5b00253bf76d587e5a9e33aa71788139) ) // FIXED BITS (xxxxxxxx0000000x) + // these 4 are blank (0xff fill) but that appears to be correct. + ROM_LOAD32_WORD_SWAP( "12.u17", 0x1800000, 0x200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) + ROM_LOAD32_WORD_SWAP( "13.u12", 0x1800002, 0x200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) + ROM_LOAD32_WORD_SWAP( "14.u18", 0x1c00000, 0x200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) + ROM_LOAD32_WORD_SWAP( "15.u13", 0x1c00002, 0x200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) + + ROM_REGION( 0x008000, "cpu1", 0 ) /* QDSP ('51) Code */ + ROM_LOAD( "ss.u107", 0x0000, 0x8000, CRC(afd5263d) SHA1(71ace1b749d8a6b84d08b97185e7e512d04e4b8d) ) + + ROM_REGION( 0x008000, "cpu2", 0 ) /* Sound (80c301) CPU Code */ + ROM_LOAD( "ss.u111", 0x0000, 0x8000, CRC(79012474) SHA1(09a2d5705d7bc52cc2d1644c87c1e31ee44813ef) ) /* Only 0x3E6 bytes used */ + + ROM_REGION( 0x080000, "music", 0 ) /* Music data */ + ROM_LOAD( "ss.u108", 0x00000, 0x80000, CRC(95bd136d) SHA1(a6e2d75fc5e8d600d4dceab13c596f6a7edb6e72) ) + + ROM_REGION( 0x080000, "sfx", 0 ) /* QDSP samples (SFX) */ + ROM_LOAD( "ss.u97", 0x00000, 0x80000, CRC(56c9f4a4) SHA1(dfc7cb8b68ec9e77854287b8998131e3ef4ca18d) ) + + ROM_REGION( 0x080000, "wavetable", 0 ) /* QDSP wavetable rom */ + ROM_LOAD( "qs1001a.u96", 0x000000, 0x80000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) +ROM_END + + ROM_START( candy ) ROM_REGION( 0x80000, "maincpu", 0 ) /* Hyperstone CPU Code */ ROM_LOAD( "cc.u43", 0x00000, 0x80000, CRC(837c9967) SHA1(ccb38ec986d7cd598a48ee1c3806566c360fd783) ) @@ -1267,6 +1352,7 @@ GAME( 1999, landbrka, landbrk, eolith45, landbrk, landbrka, ROT0, "Eolith", "Land Breaker (World) / Miss Tang Ja Ru Gi (Korea) (pcb ver 3.03) (AT89c52 protected)", GAME_NO_SOUND ) // or Miss Ttang Jjareugi GAME( 1999, nhidctch, 0, eolith45, hidnctch, eolith, ROT0, "Eolith", "New Hidden Catch (World) / New Tul Lin Gu Lim Chat Ki '98 (Korea) (pcb ver 3.02)", GAME_NO_SOUND ) // or New Teurrin Geurim Chajgi '98 GAME( 1999, penfan, 0, eolith45, landbrk, eolith, ROT0, "Eolith", "Penfan Girls - Step1. Mild Mind", GAME_NO_SOUND ) // alt title of Ribbon +GAME( 2000, stealsee, 0, eolith45, stealsee, eolith, ROT0, "Moov Generation / Eolith", "Steal See (& Get Land)", GAME_NO_SOUND ) GAME( 2000, hidctch3, 0, eolith50, hidctch3, hidctch3, ROT0, "Eolith", "Hidden Catch 3 (ver 1.00 / pcb ver 3.05)", GAME_NO_SOUND ) GAME( 2001, fort2b, 0, eolith50, common, eolith, ROT0, "Eolith", "Fortress 2 Blue Arcade (ver 1.01 / pcb ver 3.05)", GAME_NO_SOUND ) GAME( 2001, fort2ba, fort2b, eolith50, common, eolith, ROT0, "Eolith", "Fortress 2 Blue Arcade (ver 1.00 / pcb ver 3.05)", GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/eolithsp.c mame-0.145/src/mame/drivers/eolithsp.c --- mame-0.144/src/mame/drivers/eolithsp.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/eolithsp.c 2012-02-06 21:30:36.000000000 +0000 @@ -9,8 +9,8 @@ */ #include "emu.h" -#include "deprecat.h" #include "includes/eolithsp.h" +#include "includes/eolith.h" static int eolith_speedup_address; static int eolith_speedup_resume_scanline; @@ -39,24 +39,24 @@ } eolith_speedup_table[] = { /* eolith.c */ - { "ironfort", 0x40020854, 239 }, - { "hidnctch", 0x4000bba0, 239 }, - { "raccoon", 0x40008204, 239 }, - { "puzzlekg", 0x40029458, 239 }, - { "hidctch2", 0x40009524, 239 }, - { "hidctch2a",0x40029B58, 239 }, - { "landbrk", 0x40023574, 239 }, - { "landbrka", 0x4002446c, 239 }, - { "nhidctch", 0x40012778, 239 }, - { "hidctch3", 0x4001f6a0, 239 }, - { "fort2b", 0x000081e0, 239 }, - { "fort2ba", 0x000081e0, 239 }, - { "penfan", 0x4001FA66, 239 }, - { "candy", 0x4001990C, 239 }, + { "ironfort", 0x40020854, 240 }, + { "hidnctch", 0x4000bba0, 240 }, + { "raccoon", 0x40008204, 240 }, + { "puzzlekg", 0x40029458, 240 }, + { "hidctch2", 0x40009524, 240 }, + { "hidctch2a",0x40029B58, 240 }, + { "landbrk", 0x40023574, 240 }, + { "landbrka", 0x4002446c, 240 }, + { "nhidctch", 0x40012778, 240 }, + { "hidctch3", 0x4001f6a0, 240 }, + { "fort2b", 0x000081e0, 240 }, + { "fort2ba", 0x000081e0, 240 }, + { "penfan", 0x4001FA66, 240 }, + { "candy", 0x4001990C, 240 }, /* eolith16.c */ - { "klondkp", 0x0001a046, 239 }, + { "klondkp", 0x0001a046, 240 }, /* vegaeo.c */ - { "crazywar", 0x00008cf8, 239 }, + { "crazywar", 0x00008cf8, 240 }, { NULL, 0, 0 } }; @@ -80,21 +80,19 @@ } /* todo, use timers instead! */ -INTERRUPT_GEN( eolith_speedup ) +TIMER_DEVICE_CALLBACK( eolith_speedup ) { - eolith_scanline = 261 - cpu_getiloops(device); - - if (eolith_scanline==0) + if (param==0) { eolith_vblank = 0; } - if (eolith_scanline==eolith_speedup_resume_scanline) + if (param==eolith_speedup_resume_scanline) { - device->machine().scheduler().trigger(1000); + timer.machine().scheduler().trigger(1000); } - if (eolith_scanline==240) + if (param==240) { eolith_vblank = 1; } @@ -102,5 +100,23 @@ CUSTOM_INPUT( eolith_speedup_getvblank ) { - return eolith_vblank&1; + +// printf("%s:eolith speedup_read data %02x\n",field.machine().describe_context(), eolith_vblank); + + + return (field.machine().primary_screen->vpos() >= 240); +} + +// StealSee doesn't use interrupts, just the vblank +CUSTOM_INPUT( stealsee_speedup_getvblank ) +{ + eolith_state *state = field.machine().driver_data(); + + int pc = cpu_get_pc(state->m_maincpu); + + if (pc==0x400081ec) + if(!eolith_vblank) + device_eat_cycles(state->m_maincpu, 500); + + return (field.machine().primary_screen->vpos() >= 240); } diff -Nru mame-0.144/src/mame/drivers/epos.c mame-0.145/src/mame/drivers/epos.c --- mame-0.144/src/mame/drivers/epos.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/epos.c 2012-02-06 21:30:38.000000000 +0000 @@ -407,10 +407,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(272, 241) MCFG_SCREEN_VISIBLE_AREA(0, 271, 0, 235) - MCFG_SCREEN_UPDATE(epos) + MCFG_SCREEN_UPDATE_STATIC(epos) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -436,10 +435,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(272, 241) MCFG_SCREEN_VISIBLE_AREA(0, 271, 0, 235) - MCFG_SCREEN_UPDATE(epos) + MCFG_SCREEN_UPDATE_STATIC(epos) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/eprom.c mame-0.145/src/mame/drivers/eprom.c --- mame-0.144/src/mame/drivers/eprom.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/eprom.c 2012-02-06 21:30:36.000000000 +0000 @@ -429,11 +429,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(eprom) + MCFG_SCREEN_UPDATE_STATIC(eprom) MCFG_VIDEO_START(eprom) @@ -461,11 +460,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(eprom) + MCFG_SCREEN_UPDATE_STATIC(eprom) MCFG_VIDEO_START(eprom) @@ -493,11 +491,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(guts) + MCFG_SCREEN_UPDATE_STATIC(guts) MCFG_VIDEO_START(guts) diff -Nru mame-0.144/src/mame/drivers/equites.c mame-0.145/src/mame/drivers/equites.c --- mame-0.144/src/mame/drivers/equites.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/equites.c 2012-02-06 21:30:40.000000000 +0000 @@ -1142,9 +1142,9 @@ static const char *const alphamc07_sample_names[] = { "*alphamc07", - "bongo1.wav", - "bongo2.wav", - "bongo3.wav", + "bongo1", + "bongo2", + "bongo3", 0 }; @@ -1275,10 +1275,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 3*8, 29*8-1) - MCFG_SCREEN_UPDATE(equites) + MCFG_SCREEN_UPDATE_STATIC(equites) MCFG_GFXDECODE(equites) MCFG_PALETTE_LENGTH(0x180) @@ -1313,10 +1312,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(splndrbt) + MCFG_SCREEN_UPDATE_STATIC(splndrbt) MCFG_GFXDECODE(splndrbt) MCFG_PALETTE_LENGTH(0x280) diff -Nru mame-0.144/src/mame/drivers/ertictac.c mame-0.145/src/mame/drivers/ertictac.c --- mame-0.144/src/mame/drivers/ertictac.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ertictac.c 2012-02-06 21:30:41.000000000 +0000 @@ -230,10 +230,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(1280, 1024) MCFG_SCREEN_VISIBLE_AREA(0, 1280-1, 0, 1024-1) - MCFG_SCREEN_UPDATE(archimds_vidc) + MCFG_SCREEN_UPDATE_STATIC(archimds_vidc) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/esd16.c mame-0.145/src/mame/drivers/esd16.c --- mame-0.144/src/mame/drivers/esd16.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/esd16.c 2012-02-06 21:30:37.000000000 +0000 @@ -48,7 +48,7 @@ #include "sound/okim6295.h" #include "sound/3812intf.h" #include "includes/esd16.h" - +#include "video/decospr.h" /*************************************************************************** @@ -91,9 +91,10 @@ /**/AM_RANGE(0x420000, 0x423fff) AM_RAM_WRITE(esd16_vram_1_w) AM_BASE_MEMBER(esd16_state, m_vram_1) // /**/AM_RANGE(0x500000, 0x500003) AM_RAM AM_BASE_MEMBER(esd16_state, m_scroll_0) // Scroll /**/AM_RANGE(0x500004, 0x500007) AM_RAM AM_BASE_MEMBER(esd16_state, m_scroll_1) // -/**/AM_RANGE(0x500008, 0x50000b) AM_RAM // -/**/AM_RANGE(0x50000c, 0x50000f) AM_RAM // - AM_RANGE(0x600000, 0x600001) AM_WRITENOP // IRQ Ack + AM_RANGE(0x500008, 0x500009) AM_WRITEONLY AM_BASE_MEMBER(esd16_state, m_headpanic_platform_x) + AM_RANGE(0x50000a, 0x50000b) AM_WRITEONLY AM_BASE_MEMBER(esd16_state, m_headpanic_platform_y) + AM_RANGE(0x50000c, 0x50000d) AM_WRITENOP // ?? + AM_RANGE(0x50000e, 0x50000f) AM_WRITEONLY AM_BASE_MEMBER(esd16_state, m_head_layersize) // ?? AM_RANGE(0x600002, 0x600003) AM_READ_PORT("P1_P2") AM_RANGE(0x600004, 0x600005) AM_READ_PORT("SYSTEM") AM_RANGE(0x600006, 0x600007) AM_READ_PORT("DSW") @@ -109,7 +110,7 @@ int offsets = state->m_headpanic_platform_x[0] + 0x40 * state->m_headpanic_platform_y[0]; state->m_vram_1[offsets] = data; - tilemap_mark_tile_dirty(state->m_tilemap_1_16x16, offsets); + state->m_tilemap_1_16x16->mark_tile_dirty(offsets); } @@ -434,11 +435,24 @@ RGN_FRAC(1,5), 5, { RGN_FRAC(4,5),RGN_FRAC(3,5),RGN_FRAC(2,5),RGN_FRAC(1,5), RGN_FRAC(0,5) }, - { STEP8(0+7,-1), STEP8(8*16+7,-1) }, + { STEP8(8*16,1), STEP8(0,1) }, { STEP16(0,8) }, 16*16 }; + +static const gfx_layout hedpanic_sprite_16x16x5 = +{ + 16,16, + RGN_FRAC(1,3), + 5, + { RGN_FRAC(2,3), RGN_FRAC(0,3), RGN_FRAC(0,3)+8, RGN_FRAC(1,3),RGN_FRAC(1,3)+8 }, + { 256+0,256+1,256+2,256+3,256+4,256+5,256+6,256+7,0,1,2,3,4,5,6,7 }, + { 0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16,8*16,9*16,10*16,11*16,12*16,13*16,14*16,15*16 }, + 16*32, +}; + + /* 8x8x8 */ static const gfx_layout layout_8x8x8 = { @@ -452,12 +466,6 @@ 8*8*2, }; -static GFXDECODE_START( esd16 ) - GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x5, 0x200, 8 ) // [0] Sprites - GFXDECODE_ENTRY( "gfx2", 0, layout_8x8x8, 0x000, 2 ) // [1] Layers - GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x5, 0x200, 8 ) // [0] Sprites -GFXDECODE_END - static const gfx_layout hedpanic_layout_8x8x8 = { 8,8, @@ -484,16 +492,12 @@ }; -static const gfx_layout hedpanic_sprite_16x16x5 = -{ - 16,16, - RGN_FRAC(1,3), - 5, - { RGN_FRAC(2,3), RGN_FRAC(0,3), RGN_FRAC(0,3)+8, RGN_FRAC(1,3),RGN_FRAC(1,3)+8 }, - { 7,6,5,4,3,2,1,0, 256+7,256+6,256+5,256+4,256+3,256+2,256+1,256+0 }, - { 0*16,1*16,2*16,3*16,4*16,5*16,6*16,7*16,8*16,9*16,10*16,11*16,12*16,13*16,14*16,15*16 }, - 16*32, -}; + +static GFXDECODE_START( esd16 ) + GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x5, 0x200, 8 ) // [0] Sprites + GFXDECODE_ENTRY( "gfx2", 0, layout_8x8x8, 0x000, 2 ) // [1] Layers + GFXDECODE_ENTRY( "gfx2", 0, hedpanic_layout_16x16x8, 0x000, 2 ) // [1] Layers +GFXDECODE_END static GFXDECODE_START( hedpanic ) @@ -536,7 +540,15 @@ state->m_tilemap0_color = 0; } -static MACHINE_CONFIG_START( multchmp, esd16_state ) +static UINT16 hedpanic_pri_callback(UINT16 x) +{ + if (x & 0x8000) + return 0xfffe; // under "tilemap 1" + else + return 0; // above everything +} + +static MACHINE_CONFIG_START( esd16, esd16_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",M68000, 16000000) @@ -555,10 +567,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0+8, 0x100-8-1) - MCFG_SCREEN_UPDATE(esd16) + MCFG_SCREEN_UPDATE_STATIC(hedpanic) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 0); + decospr_device::set_is_bootleg(*device, true); + decospr_device::set_pri_callback(*device, hedpanic_pri_callback); + decospr_device::set_flipallx(*device, 1); MCFG_GFXDECODE(esd16) MCFG_PALETTE_LENGTH(768) @@ -575,7 +592,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( hedpanic, multchmp ) +static MACHINE_CONFIG_DERIVED( hedpanic, esd16 ) /* basic machine hardware */ @@ -588,10 +605,13 @@ MCFG_GFXDECODE(hedpanic) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(hedpanic) + MCFG_SCREEN_UPDATE_STATIC(hedpanic) + MCFG_DEVICE_MODIFY("spritegen") + decospr_device::set_offsets(*device, -0x18,-0x100); MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( mchampdx, hedpanic ) /* basic machine hardware */ @@ -617,11 +637,16 @@ MCFG_GFXDECODE(tangtang) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( hedpanio, hedpanic ) - +static MACHINE_CONFIG_DERIVED( hedpanio, esd16 ) /* basic machine hardware */ - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(hedpanio) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(hedpanic_map) + + MCFG_EEPROM_93C46_ADD("eeprom") + + MCFG_PALETTE_LENGTH(0x1000/2) + + MCFG_GFXDECODE(hedpanic) MACHINE_CONFIG_END @@ -1279,8 +1304,8 @@ ***************************************************************************/ /* ESD 11-09-98 */ -GAME( 1999, multchmp, 0, multchmp, multchmp, 0, ROT0, "ESD", "Multi Champ (World, ver. 2.5)", GAME_SUPPORTS_SAVE ) -GAME( 1998, multchmpk,multchmp, multchmp, multchmp, 0, ROT0, "ESD", "Multi Champ (Korea)", GAME_SUPPORTS_SAVE ) +GAME( 1999, multchmp, 0, esd16, multchmp, 0, ROT0, "ESD", "Multi Champ (World, ver. 2.5)", GAME_SUPPORTS_SAVE ) +GAME( 1998, multchmpk,multchmp, esd16, multchmp, 0, ROT0, "ESD", "Multi Champ (Korea)", GAME_SUPPORTS_SAVE ) /* ESD 05-28-99 */ GAME( 1999, hedpanico,hedpanic, hedpanio, hedpanic, 0, ROT0, "ESD", "Head Panic (ver. 0615, 15/06/1999)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/esh.c mame-0.145/src/mame/drivers/esh.c --- mame-0.144/src/mame/drivers/esh.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/esh.c 2012-02-06 21:30:34.000000000 +0000 @@ -24,7 +24,7 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" #include "machine/nvram.h" @@ -32,9 +32,10 @@ { public: esh_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 *m_tile_ram; UINT8 *m_tile_control_ram; UINT8 m_ld_video_visible; @@ -46,13 +47,13 @@ /* VIDEO GOODS */ -static SCREEN_UPDATE( esh ) +static SCREEN_UPDATE_IND16( esh ) { - esh_state *state = screen->machine().driver_data(); + esh_state *state = screen.machine().driver_data(); int charx, chary; /* clear */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* Draw tiles */ for (charx = 0; charx < 32; charx++) @@ -66,7 +67,7 @@ //int blinkLine = (state->m_tile_control_ram[current_screen_character] & 0x40) >> 6; //int blinkChar = (state->m_tile_control_ram[current_screen_character] & 0x80) >> 7; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], state->m_tile_ram[current_screen_character] + (0x100 * tileOffs), palIndex, 0, 0, charx*8, chary*8, 0); @@ -83,13 +84,13 @@ static READ8_HANDLER(ldp_read) { esh_state *state = space->machine().driver_data(); - return laserdisc_data_r(state->m_laserdisc); + return state->m_laserdisc->status_r(); } static WRITE8_HANDLER(ldp_write) { esh_state *state = space->machine().driver_data(); - laserdisc_data_w(state->m_laserdisc,data); + state->m_laserdisc->data_w(data); } static WRITE8_HANDLER(misc_write) @@ -283,8 +284,6 @@ static MACHINE_START( esh ) { - esh_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } @@ -301,11 +300,11 @@ MCFG_MACHINE_START(esh) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(esh, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, esh) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(esh) @@ -315,7 +314,7 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/espial.c mame-0.145/src/mame/drivers/espial.c --- mame-0.144/src/mame/drivers/espial.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/espial.c 2012-02-06 21:30:36.000000000 +0000 @@ -66,14 +66,14 @@ } -static WRITE8_HANDLER( espial_master_interrupt_enable_w ) +static WRITE8_HANDLER( espial_master_interrupt_mask_w ) { espial_state *state = space->machine().driver_data(); state->m_main_nmi_enabled = ~(data & 1); } -WRITE8_HANDLER( espial_sound_nmi_enable_w ) +WRITE8_HANDLER( espial_sound_nmi_mask_w ) { espial_state *state = space->machine().driver_data(); state->m_sound_nmi_enabled = data & 1; @@ -118,7 +118,7 @@ AM_RANGE(0x6084, 0x6084) AM_READ_PORT("IN2") AM_RANGE(0x6090, 0x6090) AM_READWRITE(soundlatch2_r, espial_master_soundlatch_w) AM_RANGE(0x7000, 0x7000) AM_READWRITE(watchdog_reset_r, watchdog_reset_w) - AM_RANGE(0x7100, 0x7100) AM_WRITE(espial_master_interrupt_enable_w) + AM_RANGE(0x7100, 0x7100) AM_WRITE(espial_master_interrupt_mask_w) AM_RANGE(0x7200, 0x7200) AM_WRITE(espial_flipscreen_w) AM_RANGE(0x8000, 0x801f) AM_RAM AM_BASE_MEMBER(espial_state, m_spriteram_1) AM_RANGE(0x8020, 0x803f) AM_READONLY @@ -143,7 +143,7 @@ AM_RANGE(0x6084, 0x6084) AM_READ_PORT("IN2") AM_RANGE(0x6090, 0x6090) AM_READWRITE(soundlatch2_r, espial_master_soundlatch_w) AM_RANGE(0x7000, 0x7000) AM_READWRITE(watchdog_reset_r, watchdog_reset_w) - AM_RANGE(0x7100, 0x7100) AM_WRITE(espial_master_interrupt_enable_w) + AM_RANGE(0x7100, 0x7100) AM_WRITE(espial_master_interrupt_mask_w) AM_RANGE(0x7200, 0x7200) AM_WRITE(espial_flipscreen_w) AM_RANGE(0x8000, 0x801f) AM_RAM AM_BASE_MEMBER(espial_state, m_spriteram_1) AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(espial_videoram_w) AM_BASE_MEMBER(espial_state, m_videoram) @@ -158,7 +158,7 @@ static ADDRESS_MAP_START( espial_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x4000, 0x4000) AM_WRITE(espial_sound_nmi_enable_w) + AM_RANGE(0x4000, 0x4000) AM_WRITE(espial_sound_nmi_mask_w) AM_RANGE(0x6000, 0x6000) AM_READWRITE(soundlatch_r, soundlatch2_w) ADDRESS_MAP_END @@ -342,10 +342,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(espial) + MCFG_SCREEN_UPDATE_STATIC(espial) MCFG_GFXDECODE(espial) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/esripsys.c mame-0.145/src/mame/drivers/esripsys.c --- mame-0.144/src/mame/drivers/esripsys.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/esripsys.c 2012-02-06 21:30:36.000000000 +0000 @@ -734,9 +734,8 @@ /* Video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(ESRIPSYS_PIXEL_CLOCK, ESRIPSYS_HTOTAL, ESRIPSYS_HBLANK_END, ESRIPSYS_HBLANK_START, ESRIPSYS_VTOTAL, ESRIPSYS_VBLANK_END, ESRIPSYS_VBLANK_START) - MCFG_SCREEN_UPDATE(esripsys) + MCFG_SCREEN_UPDATE_STATIC(esripsys) MCFG_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) MCFG_VIDEO_START(esripsys) diff -Nru mame-0.144/src/mame/drivers/ettrivia.c mame-0.145/src/mame/drivers/ettrivia.c --- mame-0.144/src/mame/drivers/ettrivia.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ettrivia.c 2012-02-06 21:30:36.000000000 +0000 @@ -54,20 +54,20 @@ { ettrivia_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( ettrivia_bg_w ) { ettrivia_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( ettrivia_control_w ) { ettrivia_state *state = space->machine().driver_data(); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_palreg = (data >> 1) & 3; state->m_gfx_bank = (data >> 2) & 1; @@ -188,7 +188,7 @@ GFXDECODE_ENTRY( "gfx2", 0, charlayout, 32*4, 32 ) GFXDECODE_END -INLINE void get_tile_info(running_machine &machine, tile_data *tileinfo, int tile_index, UINT8 *vidram, int gfx_code) +INLINE void get_tile_info(running_machine &machine, tile_data &tileinfo, int tile_index, UINT8 *vidram, int gfx_code) { ettrivia_state *state = machine.driver_data(); int code = vidram[tile_index]; @@ -253,14 +253,14 @@ state->m_bg_tilemap = tilemap_create( machine, get_tile_info_bg,tilemap_scan_rows,8,8,64,32 ); state->m_fg_tilemap = tilemap_create( machine, get_tile_info_fg,tilemap_scan_rows,8,8,64,32 ); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( ettrivia ) +static SCREEN_UPDATE_IND16( ettrivia ) { - ettrivia_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + ettrivia_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -305,10 +305,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(ettrivia) + MCFG_SCREEN_UPDATE_STATIC(ettrivia) MCFG_GFXDECODE(ettrivia) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/exedexes.c mame-0.145/src/mame/drivers/exedexes.c --- mame-0.144/src/mame/drivers/exedexes.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/exedexes.c 2012-02-06 21:30:37.000000000 +0000 @@ -236,11 +236,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(exedexes) - MCFG_SCREEN_EOF(exedexes) + MCFG_SCREEN_UPDATE_STATIC(exedexes) + MCFG_SCREEN_VBLANK_STATIC(exedexes) MCFG_GFXDECODE(exedexes) MCFG_PALETTE_LENGTH(64*4+64*4+16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/exerion.c mame-0.145/src/mame/drivers/exerion.c --- mame-0.144/src/mame/drivers/exerion.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/exerion.c 2012-02-06 21:30:40.000000000 +0000 @@ -426,9 +426,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(EXERION_PIXEL_CLOCK, EXERION_HTOTAL, EXERION_HBEND, EXERION_HBSTART, EXERION_VTOTAL, EXERION_VBEND, EXERION_VBSTART) - MCFG_SCREEN_UPDATE(exerion) + MCFG_SCREEN_UPDATE_STATIC(exerion) MCFG_GFXDECODE(exerion) MCFG_PALETTE_LENGTH(256*3) diff -Nru mame-0.144/src/mame/drivers/exidy.c mame-0.145/src/mame/drivers/exidy.c --- mame-0.144/src/mame/drivers/exidy.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/exidy.c 2012-02-06 21:30:37.000000000 +0000 @@ -817,9 +817,8 @@ MCFG_PALETTE_LENGTH(8) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(EXIDY_PIXEL_CLOCK, EXIDY_HTOTAL, EXIDY_HBEND, EXIDY_HBSTART, EXIDY_VTOTAL, EXIDY_VBEND, EXIDY_VBSTART) - MCFG_SCREEN_UPDATE(exidy) + MCFG_SCREEN_UPDATE_STATIC(exidy) MACHINE_CONFIG_END @@ -1239,6 +1238,25 @@ ROM_END +ROM_START( pepper27 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "p2l12ar7.bin", 0x9000, 0x1000, CRC(b3bc51cd) SHA1(12475ac5784bb2ab6887476ee8166c3585864cd6) ) + ROM_LOAD( "p2l11ar7.bin", 0xa000, 0x1000, CRC(c8b834cd) SHA1(28b4de322de845effaa1d2fc6c9f129145965b8a) ) + ROM_LOAD( "p2l10ar7.bin", 0xb000, 0x1000, CRC(c3e864a2) SHA1(cfc769b34d181724a5826d3a1bb3313ef5fbbd62) ) + ROM_LOAD( "p2l9ar7.bin", 0xc000, 0x1000, CRC(451003b2) SHA1(87b9aecfcf861b3d812f0e3c23b40c98c198e933) ) + ROM_LOAD( "p2l8ar7.bin", 0xd000, 0x1000, CRC(c666cafb) SHA1(5783fcfeeb651c850a1d9676e97a6beaafb06c6e) ) + ROM_LOAD( "p2l7ar7.bin", 0xe000, 0x1000, CRC(ac1282ef) SHA1(34023d8a01c1f26ec8268d7387660d6f7e875014) ) + ROM_LOAD( "p2l6ar7.bin", 0xf000, 0x1000, CRC(db8dd4fc) SHA1(9ae00f8d1a19280670dc65a20cf9cc4e7f1cc973) ) + + ROM_REGION( 0x8000, "audiocpu", 0 ) + ROM_LOAD( "audio_5a", 0x6800, 0x0800, CRC(90e3c781) SHA1(d51a9e011167a132e8af9f4b1201600a58e86b62) ) + ROM_LOAD( "audio_6a", 0x7000, 0x0800, CRC(dd343e34) SHA1(4ec55bb73d6afbd167fa91d2606d1d55a15b5c39) ) + ROM_LOAD( "audio_7a", 0x7800, 0x0800, CRC(e02b4356) SHA1(9891e14d84221c1d6f2d15a29813eb41024290ca) ) + + ROM_REGION( 0x0800, "gfx1", 0 ) + ROM_LOAD( "main_11d", 0x0000, 0x0800, CRC(b25160cd) SHA1(3d768552960a3a660891dcb85da6a5c382b33991) ) +ROM_END + ROM_START( hardhat ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "hhl-2.11a", 0xa000, 0x1000, CRC(7623deea) SHA1(3c47c0439c80e66536af42c5ee4e522fea5f8374) ) @@ -1502,7 +1520,8 @@ GAME( 1981, venture2, venture, venture, venture, venture, ROT0, "Exidy", "Venture (version 5 set 2)", GAME_SUPPORTS_SAVE ) GAME( 1981, venture4, venture, venture, venture, venture, ROT0, "Exidy", "Venture (version 4)", GAME_SUPPORTS_SAVE ) GAME( 1982, teetert, 0, teetert, teetert, teetert, ROT0, "Exidy", "Teeter Torture (prototype)", GAME_SUPPORTS_SAVE ) -GAME( 1982, pepper2, 0, pepper2, pepper2, pepper2, ROT0, "Exidy", "Pepper II", GAME_SUPPORTS_SAVE ) +GAME( 1982, pepper2, 0, pepper2, pepper2, pepper2, ROT0, "Exidy", "Pepper II (version 8)", GAME_SUPPORTS_SAVE ) +GAME( 1982, pepper27, pepper2, pepper2, pepper2, pepper2, ROT0, "Exidy", "Pepper II (version 7)", GAME_SUPPORTS_SAVE ) GAME( 1982, hardhat, 0, pepper2, pepper2, pepper2, ROT0, "Exidy", "Hard Hat", GAME_SUPPORTS_SAVE ) GAME( 1983, fax, 0, fax, fax, fax, ROT0, "Exidy", "FAX", GAME_SUPPORTS_SAVE ) GAME( 1983, fax2, fax, fax, fax, fax, ROT0, "Exidy", "FAX 2", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/expro02.c mame-0.145/src/mame/drivers/expro02.c --- mame-0.144/src/mame/drivers/expro02.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/expro02.c 2012-02-06 21:30:36.000000000 +0000 @@ -513,10 +513,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(galsnew) + MCFG_SCREEN_UPDATE_STATIC(galsnew) MCFG_GFXDECODE(1x4bit_1x4bit) MCFG_PALETTE_LENGTH(2048 + 32768) diff -Nru mame-0.144/src/mame/drivers/exprraid.c mame-0.145/src/mame/drivers/exprraid.c --- mame-0.144/src/mame/drivers/exprraid.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/exprraid.c 2012-02-06 21:30:36.000000000 +0000 @@ -510,10 +510,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(exprraid) + MCFG_SCREEN_UPDATE_STATIC(exprraid) MCFG_GFXDECODE(exprraid) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/exterm.c mame-0.145/src/mame/drivers/exterm.c --- mame-0.144/src/mame/drivers/exterm.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/exterm.c 2012-02-06 21:30:34.000000000 +0000 @@ -413,7 +413,8 @@ "screen", /* the screen operated on */ 40000000/8, /* pixel clock */ 1, /* pixels per clock */ - exterm_scanline_update, /* scanline updater */ + exterm_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ exterm_to_shiftreg_master, /* write to shiftreg function */ exterm_from_shiftreg_master /* read from shiftreg function */ @@ -425,7 +426,8 @@ "screen", /* the screen operated on */ 40000000/8, /* pixel clock */ 1, /* pixels per clock */ - NULL, /* scanline updater */ + NULL, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ exterm_to_shiftreg_slave, /* write to shiftreg function */ exterm_from_shiftreg_slave /* read from shiftreg function */ @@ -466,9 +468,8 @@ MCFG_PALETTE_LENGTH(2048+32768) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(40000000/8, 318, 0, 256, 264, 0, 240) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_PALETTE_INIT(exterm) diff -Nru mame-0.144/src/mame/drivers/extrema.c mame-0.145/src/mame/drivers/extrema.c --- mame-0.144/src/mame/drivers/extrema.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/extrema.c 2012-02-06 21:30:41.000000000 +0000 @@ -155,13 +155,13 @@ -GAME( 200?, maski, 0, extrema, extrema, 0, ROT0, "Extrema", "Maski Show (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, adults, 0, extrema, extrema, 0, ROT0, "Extrema", "Adults Only (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, bloto, 0, extrema, extrema, 0, ROT0, "Extrema", "Blits Loto (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, blpearl, 0, extrema, extrema, 0, ROT0, "Extrema", "Black Pearl (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, grancan, 0, extrema, extrema, 0, ROT0, "Extrema", "Grand Canyon (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, luckshel, 0, extrema, extrema, 0, ROT0, "Extrema", "Lucky Shell (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, exsafar, 0, extrema, extrema, 0, ROT0, "Extrema", "Safari (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, strlink, 0, extrema, extrema, 0, ROT0, "Extrema", "Strong Link (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, extrmth, 0, extrema, extrema, 0, ROT0, "Extrema", "Treasure Hunt (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) -GAME( 200?, extrmti, 0, extrema, extrema, 0, ROT0, "Extrema", "Treasure Island (Russia) (Extrema)", GAME_NOT_WORKING|GAME_NO_SOUND) +GAME( 200?, maski, 0, extrema, extrema, 0, ROT0, "Extrema", "Maski Show (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, adults, 0, extrema, extrema, 0, ROT0, "Extrema", "Adults Only (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, bloto, 0, extrema, extrema, 0, ROT0, "Extrema", "Blits Loto (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, blpearl, 0, extrema, extrema, 0, ROT0, "Extrema", "Black Pearl (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, grancan, 0, extrema, extrema, 0, ROT0, "Extrema", "Grand Canyon (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, luckshel, 0, extrema, extrema, 0, ROT0, "Extrema", "Lucky Shell (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, exsafar, 0, extrema, extrema, 0, ROT0, "Extrema", "Safari (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, strlink, 0, extrema, extrema, 0, ROT0, "Extrema", "Strong Link (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, extrmth, 0, extrema, extrema, 0, ROT0, "Extrema", "Treasure Hunt (Russia) (Extrema)", GAME_IS_SKELETON) +GAME( 200?, extrmti, 0, extrema, extrema, 0, ROT0, "Extrema", "Treasure Island (Russia) (Extrema)", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/exzisus.c mame-0.145/src/mame/drivers/exzisus.c --- mame-0.144/src/mame/drivers/exzisus.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/exzisus.c 2012-02-06 21:30:39.000000000 +0000 @@ -299,10 +299,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(exzisus) + MCFG_SCREEN_UPDATE_STATIC(exzisus) MCFG_GFXDECODE(exzisus) MCFG_PALETTE_LENGTH(1024) @@ -407,7 +406,45 @@ ROM_LOAD( "b23-05.16l", 0x00800, 0x00400, CRC(87f0f69a) SHA1(37df6fd56245fab9beaabfd86fd8f95d7c42c2a5) ) ROM_END +ROM_START( exzisust ) + ROM_REGION( 0x48000, "cpua", 0 ) + ROM_LOAD( "b23-10.7d", 0x00000, 0x08000, CRC(c80216fc) SHA1(7b952779c420be08573768f09bd65d0a188df024) ) + ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "b23-12.9d", 0x18000, 0x10000, CRC(13637f54) SHA1(c175bc60120e32eec6ccca822fa497a42dd59823) ) + + ROM_REGION( 0x48000, "cpub", 0 ) + ROM_LOAD( "b23-15.7f", 0x00000, 0x08000, CRC(2f8b3752) SHA1(acfbb8aa20e6b031b9543e1e56268f3f5c7f7f07) ) + ROM_CONTINUE( 0x10000, 0x08000 ) + ROM_LOAD( "b12-12.8f", 0x18000, 0x10000, CRC(a662be67) SHA1(0643480d56d8ac020288db800a705dd5d0d3ad9f) ) + ROM_LOAD( "b12-13.10f", 0x28000, 0x10000, CRC(04a29633) SHA1(39476365241718f01f9630c12467cb24791a67e1) ) + + ROM_REGION( 0x10000, "cpuc", 0 ) + ROM_LOAD( "b23-13.12c", 0x00000, 0x08000, CRC(51110aa1) SHA1(34c2701625eb1987affad1efd19ff8c9971456ae) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "b23-14.19f", 0x00000, 0x08000, CRC(f7ca7df2) SHA1(6048d9341f0303546e447a76439e1927d14cdd57) ) + + ROM_REGION( 0x80000, "bg0", ROMREGION_INVERT ) + ROM_LOAD( "b12-16.17d", 0x00000, 0x10000, CRC(6fec6acb) SHA1(2289c116d3f6093988a088d011f192dd4a99aa77) ) + ROM_LOAD( "b12-18.19d", 0x10000, 0x10000, CRC(64e358aa) SHA1(cd1a23458b1a2f9c8c8aea8086dc04e0f6cc6908) ) + ROM_LOAD( "b12-20.20d", 0x20000, 0x10000, CRC(87f52e89) SHA1(3f8530aca087fa2a32dc6dfbcfe2f86604ee3ca1) ) + ROM_LOAD( "b12-15.17c", 0x40000, 0x10000, CRC(d81107c8) SHA1(c024c9b7956de493687e1373318d4cd74b3555b2) ) + ROM_LOAD( "b12-17.19c", 0x50000, 0x10000, CRC(db1d5a6c) SHA1(c2e1b8d92c2b3b2ce775ed50ca4a37e84ed35a93) ) + ROM_LOAD( "b12-19.20c", 0x60000, 0x10000, CRC(772b2641) SHA1(35cc6d5a725f1817791e710afde992e64d14104f) ) + + ROM_REGION( 0x80000, "bg1", ROMREGION_INVERT ) + ROM_LOAD( "b23-06.1c", 0x00000, 0x10000, CRC(44f8f661) SHA1(d77160a89e45556cd9ce211d89c398e1086d8d92) ) + ROM_LOAD( "b23-08.3c", 0x10000, 0x10000, CRC(1ce498c1) SHA1(a9ce3de997089bd40c99bd89919b459c9f215fc8) ) + ROM_LOAD( "b23-07.1d", 0x40000, 0x10000, CRC(d7f6ec89) SHA1(e8da207ddaf46ceff870b45ecec0e89c499291b4) ) + ROM_LOAD( "b23-09.3d", 0x50000, 0x10000, CRC(6651617f) SHA1(6351a0b01589cb181b896285ade70e9dfcd799ec) ) + + ROM_REGION( 0x00c00, "proms", 0 ) + /* These appear to be twice the correct size */ + ROM_LOAD( "b23-04.15l", 0x00000, 0x00400, CRC(5042cffa) SHA1(c969748866a12681cf2dbf25a46da2c4e4f92313) ) + ROM_LOAD( "b23-03.14l", 0x00400, 0x00400, BAD_DUMP CRC(9458fd45) SHA1(7f7cdacf37bb6f15de1109fa73ba3c5fc88893d0) ) /* D0 is fixed */ + ROM_LOAD( "b23-05.16l", 0x00800, 0x00400, CRC(87f0f69a) SHA1(37df6fd56245fab9beaabfd86fd8f95d7c42c2a5) ) +ROM_END GAME( 1987, exzisus, 0, exzisus, exzisus, 0, ROT0, "Taito Corporation", "Exzisus (Japan, dedicated)", 0 ) GAME( 1987, exzisusa, exzisus, exzisus, exzisus, 0, ROT0, "Taito Corporation", "Exzisus (Japan, conversion)", 0 ) -/* A third set exists with a 'TAD Corp.' copyright */ +GAME( 1987, exzisust, exzisus, exzisus, exzisus, 0, ROT0, "Taito Corporation (TAD license)", "Exzisus (TAD license)", 0 ) diff -Nru mame-0.144/src/mame/drivers/f1gp.c mame-0.145/src/mame/drivers/f1gp.c --- mame-0.144/src/mame/drivers/f1gp.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/f1gp.c 2012-02-06 21:30:37.000000000 +0000 @@ -477,10 +477,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(f1gp) + MCFG_SCREEN_UPDATE_STATIC(f1gp) MCFG_GFXDECODE(f1gp) MCFG_PALETTE_LENGTH(2048) @@ -521,10 +520,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(f1gpb) + MCFG_SCREEN_UPDATE_STATIC(f1gpb) MCFG_GFXDECODE(f1gp) MCFG_PALETTE_LENGTH(2048) @@ -550,7 +548,7 @@ MCFG_GFXDECODE(f1gp2) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(f1gp2) + MCFG_SCREEN_UPDATE_STATIC(f1gp2) MCFG_DEVICE_REMOVE("k053936") MCFG_K053936_ADD("k053936", f1gp2_k053936_intf) diff -Nru mame-0.144/src/mame/drivers/f-32.c mame-0.145/src/mame/drivers/f-32.c --- mame-0.144/src/mame/drivers/f-32.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/f-32.c 2012-02-06 21:30:37.000000000 +0000 @@ -30,9 +30,9 @@ }; -static SCREEN_UPDATE( mosaicf2 ) +static SCREEN_UPDATE_IND16( mosaicf2 ) { - mosaicf2_state *state = screen->machine().driver_data(); + mosaicf2_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 0x10000; offs++) @@ -42,8 +42,8 @@ if ((x < 0xa0) && (y < 0xe0)) { - *BITMAP_ADDR16(bitmap, y, (x * 2) + 0) = (state->m_videoram[offs] >> 16) & 0x7fff; - *BITMAP_ADDR16(bitmap, y, (x * 2) + 1) = (state->m_videoram[offs] >> 0) & 0x7fff; + bitmap.pix16(y, (x * 2) + 0) = (state->m_videoram[offs] >> 16) & 0x7fff; + bitmap.pix16(y, (x * 2) + 1) = (state->m_videoram[offs] >> 0) & 0x7fff; } } @@ -143,10 +143,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 223) - MCFG_SCREEN_UPDATE(mosaicf2) + MCFG_SCREEN_UPDATE_STATIC(mosaicf2) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/famibox.c mame-0.145/src/mame/drivers/famibox.c --- mame-0.144/src/mame/drivers/famibox.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/famibox.c 2012-02-06 21:30:37.000000000 +0000 @@ -156,8 +156,9 @@ static WRITE8_HANDLER( sprite_dma_w ) { + ppu2c0x_device *ppu = space->machine().device("ppu"); int source = (data & 7); - ppu2c0x_spriteram_dma(space, space->machine().device("ppu"), source); + ppu->spriteram_dma(space, source); } static READ8_DEVICE_HANDLER( psg_4015_r ) @@ -373,7 +374,7 @@ static ADDRESS_MAP_START( famibox_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_RAM - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -502,7 +503,8 @@ static PALETTE_INIT( famibox ) { - ppu2c0x_init_palette(machine, 0); + ppu2c0x_device *ppu = machine.device("ppu"); + ppu->init_palette(machine, 0); } static void ppu_irq( device_t *device, int *ppu_regs ) @@ -513,6 +515,8 @@ /* our ppu interface */ static const ppu2c0x_interface ppu_interface = { + "maincpu", + "screen", 0, /* gfxlayout num */ 0, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -523,10 +527,11 @@ { } -static SCREEN_UPDATE( famibox ) +static SCREEN_UPDATE_IND16( famibox ) { /* render the ppu */ - ppu2c0x_render(screen->machine().device("ppu"), bitmap, 0, 0, 0, 0); + ppu2c0x_device *ppu = screen.machine().device("ppu"); + ppu->render(bitmap, 0, 0, 0, 0); return 0; } @@ -574,10 +579,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(famibox) + MCFG_SCREEN_UPDATE_STATIC(famibox) MCFG_GFXDECODE(famibox) MCFG_PALETTE_LENGTH(8*4*16) diff -Nru mame-0.144/src/mame/drivers/fantland.c mame-0.145/src/mame/drivers/fantland.c --- mame-0.144/src/mame/drivers/fantland.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/fantland.c 2012-02-06 21:30:36.000000000 +0000 @@ -874,10 +874,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(352,256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 256-1) - MCFG_SCREEN_UPDATE(fantland) + MCFG_SCREEN_UPDATE_STATIC(fantland) MCFG_GFXDECODE(fantland) MCFG_PALETTE_LENGTH(256) @@ -925,10 +924,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(352,256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 256-1) - MCFG_SCREEN_UPDATE(fantland) + MCFG_SCREEN_UPDATE_STATIC(fantland) MCFG_GFXDECODE(fantland) MCFG_PALETTE_LENGTH(256) @@ -1032,10 +1030,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) // 54 Hz MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(352,256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 256-1) - MCFG_SCREEN_UPDATE(fantland) + MCFG_SCREEN_UPDATE_STATIC(fantland) MCFG_GFXDECODE(fantland) MCFG_PALETTE_LENGTH(256) @@ -1080,10 +1077,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256,224) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) - MCFG_SCREEN_UPDATE(fantland) + MCFG_SCREEN_UPDATE_STATIC(fantland) MCFG_GFXDECODE(fantland) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/fastfred.c mame-0.145/src/mame/drivers/fastfred.c --- mame-0.144/src/mame/drivers/fastfred.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/fastfred.c 2012-02-06 21:30:36.000000000 +0000 @@ -166,6 +166,20 @@ return 0xff; //not really used } +static WRITE8_HANDLER( nmi_mask_w ) +{ + fastfred_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + +static WRITE8_HANDLER( sound_nmi_mask_w ) +{ + fastfred_state *state = space->machine().driver_data(); + + state->m_sound_nmi_mask = data & 1; +} + static ADDRESS_MAP_START( fastfred_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc7ff) AM_RAM @@ -176,7 +190,7 @@ AM_RANGE(0xe000, 0xe000) AM_READ_PORT("BUTTONS") AM_WRITEONLY AM_BASE_MEMBER(fastfred_state, m_background_color) AM_RANGE(0xe800, 0xe800) AM_READ_PORT("JOYS") AM_RANGE(0xf000, 0xf000) AM_READ_PORT("DSW") AM_WRITENOP - AM_RANGE(0xf001, 0xf001) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xf001, 0xf001) AM_WRITE(nmi_mask_w) AM_RANGE(0xf002, 0xf002) AM_WRITE(fastfred_colorbank1_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(fastfred_colorbank2_w) AM_RANGE(0xf004, 0xf004) AM_WRITE(fastfred_charbank1_w) @@ -202,7 +216,7 @@ AM_RANGE(0xe802, 0xe802) AM_READ_PORT("BUTTONS") AM_RANGE(0xe803, 0xe803) AM_READ_PORT("JOYS") AM_RANGE(0xf000, 0xf000) AM_WRITENOP // Unused, but initialized - AM_RANGE(0xf001, 0xf001) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xf001, 0xf001) AM_WRITE(nmi_mask_w) AM_RANGE(0xf002, 0xf002) AM_WRITE(fastfred_colorbank1_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(fastfred_colorbank2_w) AM_RANGE(0xf004, 0xf004) AM_WRITE(fastfred_charbank1_w) @@ -231,7 +245,7 @@ AM_RANGE(0xe000, 0xe000) AM_READ_PORT("BUTTONS") AM_RANGE(0xe800, 0xe800) AM_READ_PORT("JOYS") AM_RANGE(0xf000, 0xf000) AM_READ_PORT("DSW") AM_WRITENOP // writes 1 when level starts, 0 when game over - AM_RANGE(0xf001, 0xf001) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xf001, 0xf001) AM_WRITE(nmi_mask_w) AM_RANGE(0xf002, 0xf002) AM_WRITE(fastfred_colorbank1_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(fastfred_colorbank2_w) AM_RANGE(0xf004, 0xf004) AM_WRITE(imago_dma_irq_w) @@ -246,7 +260,7 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r, interrupt_enable_w) + AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r, sound_nmi_mask_w) AM_RANGE(0x4000, 0x4000) AM_WRITEONLY // Reset PSG's AM_RANGE(0x5000, 0x5001) AM_DEVWRITE("ay8910.1", ay8910_address_data_w) AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("ay8910.2", ay8910_address_data_w) @@ -618,26 +632,40 @@ #define CLOCK 18432000 /* The crystal is 18.432MHz */ +static INTERRUPT_GEN( vblank_irq ) +{ + fastfred_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + +static INTERRUPT_GEN( sound_timer_irq ) +{ + fastfred_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( fastfred, fastfred_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(fastfred_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, CLOCK/12) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,4*60) + MCFG_CPU_PERIODIC_INT(sound_timer_irq,4*60) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) //CLOCK/16/60 - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fastfred) + MCFG_SCREEN_UPDATE_STATIC(fastfred) MCFG_GFXDECODE(fastfred) MCFG_PALETTE_LENGTH(32*8) @@ -684,7 +712,7 @@ MCFG_VIDEO_START(imago) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(imago) + MCFG_SCREEN_UPDATE_STATIC(imago) MACHINE_CONFIG_END #undef CLOCK diff -Nru mame-0.144/src/mame/drivers/fastlane.c mame-0.145/src/mame/drivers/fastlane.c --- mame-0.144/src/mame/drivers/fastlane.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/fastlane.c 2012-02-06 21:30:37.000000000 +0000 @@ -22,9 +22,9 @@ int scanline = param; if(scanline == 240 && k007121_ctrlram_r(state->m_k007121, 7) & 0x02) // vblank irq - cputag_set_input_line(timer.machine(), "maincpu", HD6309_IRQ_LINE, HOLD_LINE); + device_set_input_line(state->m_maincpu, HD6309_IRQ_LINE, HOLD_LINE); else if(((scanline % 32) == 0) && k007121_ctrlram_r(state->m_k007121, 7) & 0x01) // timer irq - cputag_set_input_line(timer.machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } @@ -100,43 +100,43 @@ /* verified from HD6309 code */ static INPUT_PORTS_START( fastlane ) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) /* The bonus life affects the starting high score too, 20000 or 30000 */ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x18, "20k 100k 200k 400k 800k" ) + PORT_DIPSETTING( 0x18, "20k 100k 200k 400k 800k" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x10, "30k 150k 300k 600k" ) PORT_DIPSETTING( 0x08, "20k only" ) PORT_DIPSETTING( 0x00, "30k only" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, "Demo Music" ) /* when levels are played by the computer */ + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, "Continue" ) - PORT_DIPSETTING( 0x08, "3" ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:4") + PORT_DIPSETTING( 0x08, "3 Times" ) PORT_DIPSETTING( 0x00, DEF_STR( Infinite ) ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -217,10 +217,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(37*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fastlane) + MCFG_SCREEN_UPDATE_STATIC(fastlane) MCFG_GFXDECODE(fastlane) MCFG_PALETTE_LENGTH(1024*16) diff -Nru mame-0.144/src/mame/drivers/fcombat.c mame-0.145/src/mame/drivers/fcombat.c --- mame-0.144/src/mame/drivers/fcombat.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/fcombat.c 2012-02-06 21:30:42.000000000 +0000 @@ -309,9 +309,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(FCOMBAT_PIXEL_CLOCK, FCOMBAT_HTOTAL, FCOMBAT_HBEND, FCOMBAT_HBSTART, FCOMBAT_VTOTAL, FCOMBAT_VBEND, FCOMBAT_VBSTART) - MCFG_SCREEN_UPDATE(fcombat) + MCFG_SCREEN_UPDATE_STATIC(fcombat) MCFG_GFXDECODE(fcombat) MCFG_PALETTE_LENGTH(256*3) diff -Nru mame-0.144/src/mame/drivers/fcrash.c mame-0.145/src/mame/drivers/fcrash.c --- mame-0.144/src/mame/drivers/fcrash.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/fcrash.c 2012-02-06 21:30:39.000000000 +0000 @@ -120,13 +120,13 @@ else mask = 0xffff; /* completely transparent if priority masks not defined (mercs, qad) */ - tilemap_set_transmask(state->m_bg_tilemap[0], i, mask, 0x8000); - tilemap_set_transmask(state->m_bg_tilemap[1], i, mask, 0x8000); - tilemap_set_transmask(state->m_bg_tilemap[2], i, mask, 0x8000); + state->m_bg_tilemap[0]->set_transmask(i, mask, 0x8000); + state->m_bg_tilemap[1]->set_transmask(i, mask, 0x8000); + state->m_bg_tilemap[2]->set_transmask(i, mask, 0x8000); } } -static void fcrash_render_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void fcrash_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cps_state *state = machine.driver_data(); int pos; @@ -159,7 +159,7 @@ } -static void fcrash_render_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int primask ) +static void fcrash_render_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask ) { cps_state *state = machine.driver_data(); @@ -171,14 +171,15 @@ case 1: case 2: case 3: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer - 1], TILEMAP_DRAW_LAYER1, primask); + state->m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask); break; } } -static void fcrash_render_high_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) +static void fcrash_render_high_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) { cps_state *state = machine.driver_data(); + bitmap_ind16 dummy_bitmap; switch (layer) { @@ -188,7 +189,7 @@ case 1: case 2: case 3: - tilemap_draw(NULL, cliprect, state->m_bg_tilemap[layer - 1], TILEMAP_DRAW_LAYER0, 1); + state->m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); break; } } @@ -216,27 +217,27 @@ } } -static SCREEN_UPDATE( fcrash ) +static SCREEN_UPDATE_IND16( fcrash ) { - cps_state *state = screen->machine().driver_data(); + cps_state *state = screen.machine().driver_data(); int layercontrol, l0, l1, l2, l3; int videocontrol = state->m_cps_a_regs[0x22 / 2]; - flip_screen_set(screen->machine(), videocontrol & 0x8000); + flip_screen_set(screen.machine(), videocontrol & 0x8000); layercontrol = state->m_cps_b_regs[0x20 / 2]; /* Get video memory base registers */ - cps1_get_video_base(screen->machine()); + cps1_get_video_base(screen.machine()); /* Build palette */ - fcrash_build_palette(screen->machine()); + fcrash_build_palette(screen.machine()); - fcrash_update_transmasks(screen->machine()); + fcrash_update_transmasks(screen.machine()); - tilemap_set_scrollx(state->m_bg_tilemap[0], 0, state->m_scroll1x - 62); - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_scroll1y); + state->m_bg_tilemap[0]->set_scrollx(0, state->m_scroll1x - 62); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_scroll1y); if (videocontrol & 0x01) /* linescroll enable */ { @@ -244,79 +245,79 @@ int i; int otheroffs; - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1024); + state->m_bg_tilemap[1]->set_scroll_rows(1024); otheroffs = state->m_cps_a_regs[CPS1_ROWSCROLL_OFFS]; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap[1], (i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); + state->m_bg_tilemap[1]->set_scrollx((i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1); - tilemap_set_scrollx(state->m_bg_tilemap[1], 0, state->m_scroll2x - 60); + state->m_bg_tilemap[1]->set_scroll_rows(1); + state->m_bg_tilemap[1]->set_scrollx(0, state->m_scroll2x - 60); } - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_scroll2y); - tilemap_set_scrollx(state->m_bg_tilemap[2], 0, state->m_scroll3x - 64); - tilemap_set_scrolly(state->m_bg_tilemap[2], 0, state->m_scroll3y); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_scroll2y); + state->m_bg_tilemap[2]->set_scrollx(0, state->m_scroll3x - 64); + state->m_bg_tilemap[2]->set_scrolly(0, state->m_scroll3y); /* turn all tilemaps on regardless of settings in get_video_base() */ /* write a custom get_video_base for this bootleg hardware? */ - tilemap_set_enable(state->m_bg_tilemap[0], 1); - tilemap_set_enable(state->m_bg_tilemap[1], 1); - tilemap_set_enable(state->m_bg_tilemap[2], 1); + state->m_bg_tilemap[0]->enable(1); + state->m_bg_tilemap[1]->enable(1); + state->m_bg_tilemap[2]->enable(1); /* Blank screen */ - bitmap_fill(bitmap, cliprect, 0xbff); + bitmap.fill(0xbff, cliprect); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); l0 = (layercontrol >> 0x06) & 03; l1 = (layercontrol >> 0x08) & 03; l2 = (layercontrol >> 0x0a) & 03; l3 = (layercontrol >> 0x0c) & 03; - fcrash_render_layer(screen->machine(), bitmap, cliprect, l0, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l0, 0); if (l1 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l0); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l0); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l1, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l1, 0); if (l2 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l1); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l1); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l2, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l2, 0); if (l3 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l2); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l2); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l3, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l3, 0); return 0; } // doesn't have the scroll offsets like fcrash -static SCREEN_UPDATE( kodb ) +static SCREEN_UPDATE_IND16( kodb ) { - cps_state *state = screen->machine().driver_data(); + cps_state *state = screen.machine().driver_data(); int layercontrol, l0, l1, l2, l3; int videocontrol = state->m_cps_a_regs[0x22 / 2]; - flip_screen_set(screen->machine(), videocontrol & 0x8000); + flip_screen_set(screen.machine(), videocontrol & 0x8000); layercontrol = state->m_cps_b_regs[0x20 / 2]; /* Get video memory base registers */ - cps1_get_video_base(screen->machine()); + cps1_get_video_base(screen.machine()); /* Build palette */ - fcrash_build_palette(screen->machine()); + fcrash_build_palette(screen.machine()); - fcrash_update_transmasks(screen->machine()); + fcrash_update_transmasks(screen.machine()); - tilemap_set_scrollx(state->m_bg_tilemap[0], 0, state->m_scroll1x); - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_scroll1y); + state->m_bg_tilemap[0]->set_scrollx(0, state->m_scroll1x); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_scroll1y); if (videocontrol & 0x01) /* linescroll enable */ { @@ -324,55 +325,55 @@ int i; int otheroffs; - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1024); + state->m_bg_tilemap[1]->set_scroll_rows(1024); otheroffs = state->m_cps_a_regs[CPS1_ROWSCROLL_OFFS]; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap[1], (i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); + state->m_bg_tilemap[1]->set_scrollx((i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1); - tilemap_set_scrollx(state->m_bg_tilemap[1], 0, state->m_scroll2x); + state->m_bg_tilemap[1]->set_scroll_rows(1); + state->m_bg_tilemap[1]->set_scrollx(0, state->m_scroll2x); } - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_scroll2y); - tilemap_set_scrollx(state->m_bg_tilemap[2], 0, state->m_scroll3x); - tilemap_set_scrolly(state->m_bg_tilemap[2], 0, state->m_scroll3y); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_scroll2y); + state->m_bg_tilemap[2]->set_scrollx(0, state->m_scroll3x); + state->m_bg_tilemap[2]->set_scrolly(0, state->m_scroll3y); /* turn all tilemaps on regardless of settings in get_video_base() */ /* write a custom get_video_base for this bootleg hardware? */ - tilemap_set_enable(state->m_bg_tilemap[0], 1); - tilemap_set_enable(state->m_bg_tilemap[1], 1); - tilemap_set_enable(state->m_bg_tilemap[2], 1); + state->m_bg_tilemap[0]->enable(1); + state->m_bg_tilemap[1]->enable(1); + state->m_bg_tilemap[2]->enable(1); /* Blank screen */ - bitmap_fill(bitmap, cliprect, 0xbff); + bitmap.fill(0xbff, cliprect); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); l0 = (layercontrol >> 0x06) & 03; l1 = (layercontrol >> 0x08) & 03; l2 = (layercontrol >> 0x0a) & 03; l3 = (layercontrol >> 0x0c) & 03; - fcrash_render_layer(screen->machine(), bitmap, cliprect, l0, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l0, 0); if (l1 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l0); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l0); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l1, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l1, 0); if (l2 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l1); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l1); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l2, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l2, 0); if (l3 == 0) - fcrash_render_high_layer(screen->machine(), bitmap, cliprect, l2); + fcrash_render_high_layer(screen.machine(), bitmap, cliprect, l2); - fcrash_render_layer(screen->machine(), bitmap, cliprect, l3, 0); + fcrash_render_layer(screen.machine(), bitmap, cliprect, l3, 0); return 0; } @@ -742,11 +743,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(fcrash) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(fcrash) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(4096) @@ -793,11 +793,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(kodb) - MCFG_SCREEN_EOF(cps1) + MCFG_SCREEN_UPDATE_STATIC(kodb) + MCFG_SCREEN_VBLANK_STATIC(cps1) MCFG_GFXDECODE(cps1) MCFG_PALETTE_LENGTH(0xc00) @@ -915,5 +914,76 @@ ROM_LOAD( "2.ic19", 0x00000, 0x40000, CRC(a2db1575) SHA1(1a4a29e4b045af50700adf1665697feab12cc234) ) ROM_END +ROM_START( cawingbl ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "caw2.bin", 0x00000, 0x80000, CRC(8125d3f0) SHA1(a0e48c326c6164ca189c9372f5c38a7c103772c1) ) + ROM_LOAD16_BYTE( "caw1.bin", 0x00001, 0x80000, CRC(b19b10ce) SHA1(3c71f1dc830d1e8b8ba26d8a71e12f477659480c) ) + + ROM_REGION( 0x200000, "gfx", 0 ) + ROMX_LOAD( "caw4.bin", 0x000000, 0x80000, CRC(4937fc41) SHA1(dac179715be483a521df8e515afc1fb7a2cd8f13) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "caw5.bin", 0x000002, 0x80000, CRC(30dd78db) SHA1(e0295001d6f5fb4a9276c432f971e88f73c5e39a) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "caw6.bin", 0x000004, 0x80000, CRC(61192f7c) SHA1(86643c62653a62a5c7541d50cfdecae9b607440d) , ROM_GROUPWORD | ROM_SKIP(6) ) + ROMX_LOAD( "caw7.bin", 0x000006, 0x80000, CRC(a045c689) SHA1(8946c55635121282ea03586a278e50de20d92633) , ROM_GROUPWORD | ROM_SKIP(6) ) + + ROM_REGION( 0x30000, "soundcpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "caw3.bin", 0x00000, 0x20000, CRC(ffe16cdc) SHA1(8069ea69f0b89d61c35995c8040a4989d7be9c1f) ) + ROM_RELOAD( 0x10000, 0x20000 ) +ROM_END + +// 24mhz crystal (maincpu), 28.322 crystal (video), 3.579545 crystal (sound) +// sound cpu is (239 V 249521 VC5006 KABUKI DL-030P-110V) - recycled Kabuki Z80 from genuine Capcom HW? +// 3x8 dsws + +static MACHINE_CONFIG_START( sgyxz, cps_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M68000, 12000000) + MCFG_CPU_PROGRAM_MAP(kodb_map) + MCFG_CPU_VBLANK_INT("screen", cps1_interrupt) + +// MCFG_CPU_ADD("soundcpu", Z80, 3579545) +// MCFG_CPU_PROGRAM_MAP(sub_map) + + MCFG_MACHINE_START(kodb) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) + MCFG_SCREEN_UPDATE_STATIC(kodb) + MCFG_SCREEN_VBLANK_STATIC(cps1) + + MCFG_GFXDECODE(cps1) + MCFG_PALETTE_LENGTH(0xc00) + + MCFG_VIDEO_START(cps1) +MACHINE_CONFIG_END + + + +ROM_START( sgyxz ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "sgyxz_prg1.bin", 0x000001, 0x80000, CRC(d8511929) SHA1(4de9263778f327693f4d1e21b48e43806f673487) ) + ROM_LOAD16_BYTE( "sgyxz_prg2.bin", 0x000000, 0x80000, CRC(95429c83) SHA1(e981624d018132e5625a66113b6ac4fc44e55cf7) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD16_BYTE("sgyxz_gfx1.bin", 0x000000, 0x200000, CRC(a60be9f6) SHA1(2298a4b6a2c83b76dc106a1efa19606b298d378a) ) // 'picture 1' + ROM_LOAD16_BYTE("sgyxz_gfx2.bin", 0x000001, 0x200000, CRC(6ad9d048) SHA1(d47212d28d0a1ce349e4c59e5d0d99c541b3458e) ) // 'picture 2' + + ROM_REGION( 0x10000, "soundcpu", 0 ) /* Z80 code */ + ROM_LOAD( "sgyxz_snd2.bin", 0x00000, 0x10000, CRC(210c376f) SHA1(0d937c86078d0a106f5636b7daf5fc0266c2c2ec) ) + + ROM_REGION( 0x040000, "oki", 0 ) /* Samples */ + ROM_LOAD( "sgyxz_snd1.bin", 0x00000, 0x40000, CRC(c15ac0f2) SHA1(8d9e5519d9820e4ac4f70555088c80e64d052c9d) ) +ROM_END + + + + + + GAME( 1990, fcrash, ffight, fcrash, fcrash, cps1, ROT0, "bootleg (Playmark)", "Final Crash (bootleg of Final Fight)", GAME_SUPPORTS_SAVE ) GAME( 1991, kodb, kod, kodb, kodb, cps1, ROT0, "bootleg (Playmark)", "The King of Dragons (bootleg)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) // 910731 "ETC" +GAME( 1990, cawingbl, cawing, fcrash, fcrash, cps1, ROT0, "bootleg", "Carrier Air Wing (bootleg with 2xYM2203)", GAME_NOT_WORKING ) +GAME( 199?, sgyxz, wof, sgyxz, fcrash, cps1, ROT0, "bootleg (All-In Electronic)", "Warriors of Fate ('sgyxz' bootleg)", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/feversoc.c mame-0.145/src/mame/drivers/feversoc.c --- mame-0.144/src/mame/drivers/feversoc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/feversoc.c 2012-02-06 21:30:36.000000000 +0000 @@ -82,13 +82,13 @@ } -static SCREEN_UPDATE( feversoc ) +static SCREEN_UPDATE_IND16( feversoc ) { - feversoc_state *state = screen->machine().driver_data(); + feversoc_state *state = screen.machine().driver_data(); UINT32 *spriteram32 = state->m_spriteram; int offs,spr_offs,colour,sx,sy,h,w,dx,dy; - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); //black pen + bitmap.fill(screen.machine().pens[0], cliprect); //black pen for(offs=(0x2000/4)-2;offs>-1;offs-=2) { @@ -106,7 +106,7 @@ for(dx=0;dxmachine().gfx[0],spr_offs++,colour,0,0,(sx+dx*16),(sy+dy*16),0x3f); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0],spr_offs++,colour,0,0,(sx+dx*16),(sy+dy*16),0x3f); } return 0; @@ -258,10 +258,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) //dynamic resolution? - MCFG_SCREEN_UPDATE(feversoc) + MCFG_SCREEN_UPDATE_STATIC(feversoc) MCFG_GFXDECODE(feversoc) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/fgoal.c mame-0.145/src/mame/drivers/fgoal.c --- mame-0.144/src/mame/drivers/fgoal.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/fgoal.c 2012-02-06 21:30:37.000000000 +0000 @@ -382,10 +382,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 263) MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 255) - MCFG_SCREEN_UPDATE(fgoal) + MCFG_SCREEN_UPDATE_STATIC(fgoal) MCFG_GFXDECODE(fgoal) MCFG_PALETTE_LENGTH(128 + 16 + 1) diff -Nru mame-0.144/src/mame/drivers/finalizr.c mame-0.145/src/mame/drivers/finalizr.c --- mame-0.144/src/mame/drivers/finalizr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/finalizr.c 2012-02-06 21:30:34.000000000 +0000 @@ -282,10 +282,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 35*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(finalizr) + MCFG_SCREEN_UPDATE_STATIC(finalizr) MCFG_GFXDECODE(finalizr) MCFG_PALETTE_LENGTH(2*16*16) diff -Nru mame-0.144/src/mame/drivers/firebeat.c mame-0.145/src/mame/drivers/firebeat.c --- mame-0.144/src/mame/drivers/firebeat.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/firebeat.c 2012-02-06 21:30:33.000000000 +0000 @@ -192,7 +192,7 @@ } -static void gcu_draw_object(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, UINT32 *cmd) +static void gcu_draw_object(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, UINT32 *cmd) { firebeat_state *state = machine.driver_data(); // 0x00: xxx----- -------- -------- -------- command type @@ -239,14 +239,14 @@ width = (((width * 65536) / xscale) * 64) / 65536; height = (((height * 65536) / yscale) * 64) / 65536; - if (y > cliprect->max_y || x > cliprect->max_x) { + if (y > cliprect.max_y || x > cliprect.max_x) { return; } - if ((y+height) > cliprect->max_y) { - height = cliprect->max_y - y; + if ((y+height) > cliprect.max_y) { + height = cliprect.max_y - y; } - if ((x+width) > cliprect->max_x) { - width = cliprect->max_x - x; + if ((x+width) > cliprect.max_x) { + width = cliprect.max_x - x; } v = 0; @@ -254,7 +254,7 @@ { int xi; int index; - UINT16 *d = BITMAP_ADDR16(bitmap, j+y, x); + UINT16 *d = &bitmap.pix16(j+y, x); //int index = address + ((v >> 6) * 1024); if (yflip) @@ -346,7 +346,7 @@ } } -static void gcu_fill_rect(bitmap_t *bitmap, const rectangle *cliprect, UINT32 *cmd) +static void gcu_fill_rect(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 *cmd) { int i, j; int x1, y1, x2, y2; @@ -375,14 +375,14 @@ } // clip - if (x1 < cliprect->min_x) x1 = cliprect->min_x; - if (y1 < cliprect->min_y) y1 = cliprect->min_y; - if (x2 > cliprect->max_x) x2 = cliprect->max_x; - if (y2 > cliprect->max_y) y2 = cliprect->max_y; + if (x1 < cliprect.min_x) x1 = cliprect.min_x; + if (y1 < cliprect.min_y) y1 = cliprect.min_y; + if (x2 > cliprect.max_x) x2 = cliprect.max_x; + if (y2 > cliprect.max_y) y2 = cliprect.max_y; for (j=y1; j < y2; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); for (i=x1; i < x2; i++) { if (color[i&3] & 0x8000) @@ -393,7 +393,7 @@ } } -static void gcu_draw_character(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, UINT32 *cmd) +static void gcu_draw_character(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, UINT32 *cmd) { firebeat_state *state = machine.driver_data(); // 0x00: xxx----- -------- -------- -------- command type @@ -422,14 +422,14 @@ color[3] = (cmd[3] >> 0) & 0xffff; - if (y > cliprect->max_y || x > cliprect->max_x) { + if (y > cliprect.max_y || x > cliprect.max_x) { return; } for (j=0; j < 8; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, y+j, x); + UINT16 *d = &bitmap.pix16(y+j, x); UINT16 line = vr[address^1]; address += 4; @@ -442,7 +442,7 @@ } } -static void gcu_exec_display_list(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, UINT32 address) +static void gcu_exec_display_list(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, UINT32 address) { firebeat_state *state = machine.driver_data(); int counter = 0; @@ -513,41 +513,35 @@ }; } -static SCREEN_UPDATE(firebeat) +static UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip) { - firebeat_state *state = screen->machine().driver_data(); - int chip; + firebeat_state *state = screen.machine().driver_data(); - if (screen == screen->machine().devicelist().find(SCREEN, 0)) - chip = 0; - else - chip = 1; - - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - if (mame_stricmp(screen->machine().system().name, "popn7") == 0) + if (mame_stricmp(screen.machine().system().name, "popn7") == 0) { - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x1f80000); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x1f80000); } else { if (state->m_layer >= 2) { - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x8000); - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x0000); - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x10000); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x8000); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x0000); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x10000); } else if (state->m_layer == 0) { - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x200000); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x200000); - //gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x186040); + //gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x186040); } else if (state->m_layer == 1) { - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x1d0800); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x1d0800); - gcu_exec_display_list(screen->machine(), bitmap, cliprect, chip, 0x1a9440); + gcu_exec_display_list(screen.machine(), bitmap, cliprect, chip, 0x1a9440); } } @@ -555,7 +549,7 @@ if (state->m_tick >= 5) { state->m_tick = 0; - if (screen->machine().input().code_pressed(KEYCODE_0)) + if (screen.machine().input().code_pressed(KEYCODE_0)) { state->m_layer++; if (state->m_layer > 2) @@ -565,7 +559,7 @@ } /* - if (screen->machine().input().code_pressed_once(KEYCODE_9)) + if (screen.machine().input().code_pressed_once(KEYCODE_9)) { FILE *file = fopen("vram0.bin", "wb"); int i; @@ -597,6 +591,9 @@ return 0; } +static SCREEN_UPDATE_IND16( firebeat_0 ) { return update_screen(screen, bitmap, cliprect, 0); } +static SCREEN_UPDATE_IND16( firebeat_1 ) { return update_screen(screen, bitmap, cliprect, 1); } + static UINT32 GCU_r(running_machine &machine, int chip, UINT32 offset, UINT32 mem_mask) { firebeat_state *state = machine.driver_data(); @@ -649,7 +646,8 @@ COMBINE_DATA( &state->m_gcu[chip].visible_area ); if (ACCESSING_BITS_0_15) { - screen_device *screen = downcast(machine.devicelist().find(SCREEN, chip)); + screen_device_iterator iter(machine.root_device()); + screen_device *screen = iter.byindex(chip); if (screen != NULL) { @@ -1765,8 +1763,8 @@ AM_RANGE(0x7d400000, 0x7d5fffff) AM_READWRITE(flashram_r, flashram_w) AM_RANGE(0x7d800000, 0x7dbfffff) AM_READWRITE(soundflash_r, soundflash_w) AM_RANGE(0x7dc00000, 0x7dc0000f) AM_READWRITE(comm_uart_r, comm_uart_w) - AM_RANGE(0x7e000000, 0x7e00003f) AM_DEVREADWRITE8("rtc", rtc65271_rtc_r, rtc65271_rtc_w, 0xffffffff) - AM_RANGE(0x7e000100, 0x7e00013f) AM_DEVREADWRITE8("rtc", rtc65271_xram_r, rtc65271_xram_w, 0xffffffff) + AM_RANGE(0x7e000000, 0x7e00003f) AM_DEVREADWRITE8_MODERN("rtc", rtc65271_device, rtc_r, rtc_w, 0xffffffff) + AM_RANGE(0x7e000100, 0x7e00013f) AM_DEVREADWRITE8_MODERN("rtc", rtc65271_device, xram_r, xram_w, 0xffffffff) AM_RANGE(0x7e800000, 0x7e8000ff) AM_READWRITE(gcu0_r, gcu0_w) AM_RANGE(0x7e800100, 0x7e8001ff) AM_READWRITE(gcu1_r, gcu1_w) AM_RANGE(0x7fe00000, 0x7fe0000f) AM_READWRITE(atapi_command_r, atapi_command_w) @@ -1969,6 +1967,11 @@ cdda_set_cdrom(machine.device("cdda"), cd); } +const rtc65271_interface firebeat_rtc = +{ + DEVCB_NULL +}; + static MACHINE_CONFIG_START( firebeat, firebeat_state ) /* basic machine hardware */ @@ -1979,7 +1982,7 @@ MCFG_MACHINE_START(firebeat) MCFG_MACHINE_RESET(firebeat) - MCFG_RTC65271_ADD("rtc", NULL) + MCFG_RTC65271_ADD("rtc", firebeat_rtc) MCFG_FUJITSU_29F016A_ADD("flash0") MCFG_FUJITSU_29F016A_ADD("flash1") @@ -1989,10 +1992,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(firebeat) + MCFG_SCREEN_UPDATE_STATIC(firebeat_0) MCFG_PALETTE_LENGTH(32768) @@ -2023,7 +2025,7 @@ MCFG_MACHINE_START(firebeat) MCFG_MACHINE_RESET(firebeat) - MCFG_RTC65271_ADD("rtc", NULL) + MCFG_RTC65271_ADD("rtc", firebeat_rtc) MCFG_FUJITSU_29F016A_ADD("flash0") MCFG_FUJITSU_29F016A_ADD("flash1") @@ -2034,20 +2036,18 @@ MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(firebeat) + MCFG_SCREEN_UPDATE_STATIC(firebeat_0) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(firebeat) + MCFG_SCREEN_UPDATE_STATIC(firebeat_1) MCFG_VIDEO_START(firebeat) diff -Nru mame-0.144/src/mame/drivers/firefox.c mame-0.145/src/mame/drivers/firefox.c --- mame-0.144/src/mame/drivers/firefox.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/firefox.c 2012-02-06 21:30:42.000000000 +0000 @@ -30,7 +30,7 @@ #include "cpu/m6502/m6502.h" #include "sound/pokey.h" #include "sound/tms5220.h" -#include "machine/laserdsc.h" +#include "machine/ldvp931.h" #include "machine/6532riot.h" #include "machine/x2212.h" @@ -39,9 +39,10 @@ { public: firefox_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; int m_n_disc_lock; int m_n_disc_data; int m_n_disc_read_data; @@ -93,9 +94,9 @@ UINT8 result = 0xff; result ^= 0x20; - if (!laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_READY)) + if (!state->m_laserdisc->ready_r()) result ^= 0x40; - if (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_DATA_AVAIL)) + if (state->m_laserdisc->data_available_r()) result ^= 0x80; return result; @@ -114,7 +115,7 @@ static WRITE8_HANDLER( firefox_disc_read_w ) { firefox_state *state = space->machine().driver_data(); - state->m_n_disc_read_data = laserdisc_data_r(state->m_laserdisc); + state->m_n_disc_read_data = state->m_laserdisc->data_r(); } static WRITE8_HANDLER( firefox_disc_lock_w ) @@ -125,13 +126,14 @@ static WRITE8_HANDLER( audio_enable_w ) { - space->machine().device("ldsound")->set_output_gain(~offset & 1, (data & 0x80) ? 1.0 : 0.0); + firefox_state *state = space->machine().driver_data(); + state->m_laserdisc->set_output_gain(~offset & 1, (data & 0x80) ? 1.0 : 0.0); } static WRITE8_HANDLER( firefox_disc_reset_w ) { firefox_state *state = space->machine().driver_data(); - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); + state->m_laserdisc->reset_w((data & 0x80) ? CLEAR_LINE : ASSERT_LINE); } /* active low on dbb7 */ @@ -139,7 +141,7 @@ { firefox_state *state = space->machine().driver_data(); if ( ( data & 0x80 ) == 0 ) - laserdisc_data_w(state->m_laserdisc, state->m_n_disc_data); + state->m_laserdisc->data_w(state->m_n_disc_data); } /* latch the data */ @@ -169,7 +171,7 @@ { firefox_state *state = space->machine().driver_data(); state->m_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_bgtiles, offset); + state->m_bgtiles->mark_tile_dirty(offset); } @@ -177,18 +179,18 @@ { firefox_state *state = machine.driver_data(); state->m_bgtiles = tilemap_create(machine, bgtile_get_info, tilemap_scan_rows, 8,8, 64,64); - tilemap_set_transparent_pen(state->m_bgtiles, 0); - tilemap_set_scrolldy(state->m_bgtiles, machine.primary_screen->visible_area().min_y, 0); + state->m_bgtiles->set_transparent_pen(0); + state->m_bgtiles->set_scrolldy(machine.primary_screen->visible_area().min_y, 0); } -static SCREEN_UPDATE( firefox ) +static SCREEN_UPDATE_RGB32( firefox ) { - firefox_state *state = screen->machine().driver_data(); + firefox_state *state = screen.machine().driver_data(); int sprite; - int gfxtop = screen->visible_area().min_y; + int gfxtop = screen.visible_area().min_y; - bitmap_fill( bitmap, cliprect, palette_get_color(screen->machine(), 256) ); + bitmap.fill(palette_get_color(screen.machine(), 256), cliprect); for( sprite = 0; sprite < 32; sprite++ ) { @@ -208,12 +210,12 @@ int flipx = flags & 0x20; int code = sprite_data[ 15 - row ] + ( 256 * ( ( flags >> 6 ) & 3 ) ); - drawgfx_transpen( bitmap, cliprect, screen->machine().gfx[ 1 ], code, color, flipx, flipy, x + 8, gfxtop + 500 - y - ( row * 16 ), 0 ); + drawgfx_transpen( bitmap, cliprect, screen.machine().gfx[ 1 ], code, color, flipx, flipy, x + 8, gfxtop + 500 - y - ( row * 16 ), 0 ); } } } - tilemap_draw( bitmap, cliprect, state->m_bgtiles, 0, 0 ); + state->m_bgtiles->draw(bitmap, cliprect, 0, 0 ); return 0; } @@ -459,10 +461,10 @@ -static void firq_gen(device_t *device, int state) +static void firq_gen(running_machine &machine, phillips_22vp931_device &laserdisc, int state) { if (state) - cputag_set_input_line( device->machine(), "maincpu", M6809_FIRQ_LINE, ASSERT_LINE ); + cputag_set_input_line( machine, "maincpu", M6809_FIRQ_LINE, ASSERT_LINE ); } @@ -473,8 +475,7 @@ state->m_nvram_1c = machine.device("nvram_1c"); state->m_nvram_1d = machine.device("nvram_1d"); - state->m_laserdisc = machine.device("laserdisc"); - vp931_set_data_ready_callback(state->m_laserdisc, firq_gen); + state->m_laserdisc->set_data_ready_callback(phillips_22vp931_device::data_ready_delegate(FUNC(firq_gen), &machine)); state->m_control_num = 0; state->m_sprite_bank = 0; @@ -698,17 +699,17 @@ MCFG_WATCHDOG_TIME_INIT(attotime::from_hz((double)MASTER_XTAL/8/16/16/16/16)) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_RGB32) - MCFG_GFXDECODE(firefox) MCFG_PALETTE_LENGTH(512) MCFG_VIDEO_START(firefox) - MCFG_LASERDISC_ADD("laserdisc", PHILLIPS_22VP931, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(firefox, 64*8, 525, BITMAP_FORMAT_RGB32) + MCFG_LASERDISC_22VP931_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(64*8, 525, firefox) MCFG_LASERDISC_OVERLAY_CLIP(7*8, 53*8-1, 44, 480+44) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") + MCFG_X2212_ADD_AUTOSAVE("nvram_1c") MCFG_X2212_ADD_AUTOSAVE("nvram_1d") MCFG_RIOT6532_ADD("riot", MASTER_XTAL/8, riot_intf) @@ -736,7 +737,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.75) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.75) - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/firetrap.c mame-0.145/src/mame/drivers/firetrap.c --- mame-0.144/src/mame/drivers/firetrap.c 2012-01-13 15:34:37.000000000 +0000 +++ mame-0.145/src/mame/drivers/firetrap.c 2012-02-06 21:30:36.000000000 +0000 @@ -168,7 +168,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "sound/3526intf.h" #include "sound/msm5205.h" @@ -317,7 +316,7 @@ { firetrap_state *state = space->machine().driver_data(); msm5205_reset_w(state->m_msm, ~data & 0x01); - state->m_irq_enable = data & 0x02; + state->m_sound_irq_enable = data & 0x02; } static WRITE8_HANDLER( firetrap_sound_bankselect_w ) @@ -333,7 +332,7 @@ state->m_msm5205next <<= 4; state->m_adpcm_toggle ^= 1; - if (state->m_irq_enable && state->m_adpcm_toggle) + if (state->m_sound_irq_enable && state->m_adpcm_toggle) device_set_input_line(state->m_audiocpu, M6502_IRQ_LINE, HOLD_LINE); } @@ -413,6 +412,25 @@ AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END +static INPUT_CHANGED( coin_inserted ) +{ + firetrap_state *state = field.machine().driver_data(); + + /* coin insertion causes an IRQ */ + if(newval) + { + state->m_coin_command_pending = (UINT8)(FPTR)(param); + + /* Make sure coin IRQ's aren't generated when another command is pending, the main cpu + definitely doesn't expect them as it locks out the coin routine */ + if (state->m_coin_command_pending && !state->m_i8751_current_command) + { + state->m_i8751_return = state->m_coin_command_pending; + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xff); + state->m_coin_command_pending = 0; + } + } +} /* verified from Z80 code */ static INPUT_PORTS_START( firetrap ) @@ -490,9 +508,9 @@ PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" ) PORT_START("COIN") /* Connected to i8751 directly */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED(coin_inserted, 1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_CHANGED(coin_inserted, 2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_CHANGED(coin_inserted, 3) INPUT_PORTS_END /* verified from Z80 code */ @@ -574,46 +592,9 @@ static INTERRUPT_GEN( firetrap_irq ) { firetrap_state *state = device->machine().driver_data(); - UINT8 coin = 0; - UINT8 port = input_port_read(device->machine(), "COIN") & 0x07; /* TODO: remove me */ - - /* Check for coin IRQ */ - if (cpu_getiloops(device)) - { - if (port != 0x07 && !state->m_int_latch) - { - if (!(port & 0x01)) /* COIN1 */ - coin = 1; - if (!(port & 0x02)) /* COIN2 */ - coin = 2; - if (!(port & 0x04)) /* SERVICE1 */ - coin = 3; - state->m_coin_command_pending = coin; - state->m_int_latch = 1; - } - if (port == 0x07) - state->m_int_latch = 0; - - /* Make sure coin IRQ's aren't generated when another command is pending, the main cpu - definitely doesn't expect them as it locks out the coin routine */ - if (state->m_coin_command_pending && !state->m_i8751_current_command) - { - state->m_i8751_return = state->m_coin_command_pending; - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xff); - state->m_coin_command_pending = 0; - } - } - - if (state->m_nmi_enable && !cpu_getiloops(device)) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); -} - -static INTERRUPT_GEN( bootleg_irq ) -{ - firetrap_state *state = device->machine().driver_data(); if (state->m_nmi_enable) - device_set_input_line (device, INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); } @@ -631,13 +612,12 @@ memory_configure_bank(machine, "bank2", 0, 2, &SOUND[0x10000], 0x4000); state->save_item(NAME(state->m_i8751_current_command)); - state->save_item(NAME(state->m_irq_enable)); + state->save_item(NAME(state->m_sound_irq_enable)); state->save_item(NAME(state->m_nmi_enable)); state->save_item(NAME(state->m_i8751_return)); state->save_item(NAME(state->m_i8751_init_ptr)); state->save_item(NAME(state->m_msm5205next)); state->save_item(NAME(state->m_adpcm_toggle)); - state->save_item(NAME(state->m_int_latch)); state->save_item(NAME(state->m_coin_command_pending)); state->save_item(NAME(state->m_scroll1_x)); state->save_item(NAME(state->m_scroll1_y)); @@ -659,13 +639,12 @@ } state->m_i8751_current_command = 0; - state->m_irq_enable = 0; + state->m_sound_irq_enable = 0; state->m_nmi_enable = 0; state->m_i8751_return = 0; state->m_i8751_init_ptr = 0; state->m_msm5205next = 0xff; state->m_adpcm_toggle = 0; - state->m_int_latch = 0; state->m_coin_command_pending = 0; } @@ -674,7 +653,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, FIRETRAP_XTAL/2) // 6 MHz MCFG_CPU_PROGRAM_MAP(firetrap_map) - MCFG_CPU_VBLANK_INT_HACK(firetrap_irq,2) + MCFG_CPU_VBLANK_INT("screen",firetrap_irq) MCFG_CPU_ADD("audiocpu", M6502, FIRETRAP_XTAL/8) // 1.5 MHz MCFG_CPU_PROGRAM_MAP(sound_map) @@ -688,10 +667,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.4034) // PCB measurement MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(firetrap) + MCFG_SCREEN_UPDATE_STATIC(firetrap) MCFG_GFXDECODE(firetrap) MCFG_PALETTE_LENGTH(256) @@ -715,7 +693,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, FIRETRAP_XTAL/2) // 6 MHz MCFG_CPU_PROGRAM_MAP(firetrap_bootleg_map) - MCFG_CPU_VBLANK_INT("screen", bootleg_irq) + MCFG_CPU_VBLANK_INT("screen", firetrap_irq) MCFG_CPU_ADD("audiocpu", M6502, FIRETRAP_XTAL/8) // 1.5 MHz MCFG_CPU_PROGRAM_MAP(sound_map) @@ -729,7 +707,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.4034) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) @@ -738,7 +715,7 @@ MCFG_PALETTE_INIT(firetrap) MCFG_VIDEO_START(firetrap) - MCFG_SCREEN_UPDATE(firetrap) + MCFG_SCREEN_UPDATE_STATIC(firetrap) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/firetrk.c mame-0.145/src/mame/drivers/firetrk.c --- mame-0.144/src/mame/drivers/firetrk.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/firetrk.c 2012-02-06 21:30:42.000000000 +0000 @@ -902,10 +902,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(firetrk) + MCFG_SCREEN_UPDATE_STATIC(firetrk) MCFG_VIDEO_START(firetrk) MCFG_PALETTE_INIT(firetrk) @@ -929,7 +928,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(superbug) + MCFG_SCREEN_UPDATE_STATIC(superbug) MCFG_VIDEO_START(superbug) MCFG_GFXDECODE(superbug) @@ -950,7 +949,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(montecar) + MCFG_SCREEN_UPDATE_STATIC(montecar) MCFG_VIDEO_START(montecar) MCFG_GFXDECODE(montecar) diff -Nru mame-0.144/src/mame/drivers/fitfight.c mame-0.145/src/mame/drivers/fitfight.c --- mame-0.144/src/mame/drivers/fitfight.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/fitfight.c 2012-02-06 21:30:37.000000000 +0000 @@ -751,10 +751,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 39*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fitfight) + MCFG_SCREEN_UPDATE_STATIC(fitfight) MCFG_PALETTE_LENGTH(0x800) @@ -780,10 +779,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 39*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(fitfight) + MCFG_SCREEN_UPDATE_STATIC(fitfight) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/flicker.c mame-0.145/src/mame/drivers/flicker.c --- mame-0.144/src/mame/drivers/flicker.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/flicker.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i4004/i4004.h" @@ -5,28 +7,38 @@ { public: flicker_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( flicker_rom, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( flicker_rom, AS_PROGRAM, 8, flicker_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x03FF) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START(flicker_map, AS_DATA, 8) +static ADDRESS_MAP_START(flicker_map, AS_DATA, 8, flicker_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x00FF) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( flicker_io , AS_IO, 8) +static ADDRESS_MAP_START( flicker_io , AS_IO, 8, flicker_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( flicker ) INPUT_PORTS_END -static MACHINE_RESET( flicker ) +void flicker_state::machine_reset() { } @@ -40,13 +52,13 @@ MCFG_CPU_PROGRAM_MAP(flicker_rom) MCFG_CPU_DATA_MAP(flicker_map) MCFG_CPU_IO_MAP(flicker_io) - - MCFG_MACHINE_RESET( flicker ) MACHINE_CONFIG_END + ROM_START(flicker) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("flicker.rom", 0x0000, 0x0400, CRC(c692e586) SHA1(5cabb28a074d18b589b5b8f700c57e1610071c68)) ROM_END -GAME(1974, flicker, 0, flicker, flicker, flicker, ROT0, "Nutting Associates", "Flicker (Prototype)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1974, flicker, 0, flicker, flicker, flicker, ROT0, "Nutting Associates", "Flicker (Prototype)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/flkatck.c mame-0.145/src/mame/drivers/flkatck.c --- mame-0.144/src/mame/drivers/flkatck.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/flkatck.c 2012-02-06 21:30:39.000000000 +0000 @@ -241,10 +241,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(37*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(flkatck) + MCFG_SCREEN_UPDATE_STATIC(flkatck) MCFG_GFXDECODE(flkatck) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/flower.c mame-0.145/src/mame/drivers/flower.c --- mame-0.144/src/mame/drivers/flower.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/flower.c 2012-02-06 21:30:41.000000000 +0000 @@ -269,10 +269,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // ? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(34*8, 33*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(flower) + MCFG_SCREEN_UPDATE_STATIC(flower) MCFG_GFXDECODE(flower) diff -Nru mame-0.144/src/mame/drivers/flstory.c mame-0.145/src/mame/drivers/flstory.c --- mame-0.144/src/mame/drivers/flstory.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/flstory.c 2012-02-06 21:30:34.000000000 +0000 @@ -1112,10 +1112,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(flstory) + MCFG_SCREEN_UPDATE_STATIC(flstory) MCFG_GFXDECODE(flstory) MCFG_PALETTE_LENGTH(512) @@ -1171,10 +1170,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(flstory) + MCFG_SCREEN_UPDATE_STATIC(flstory) MCFG_GFXDECODE(flstory) MCFG_PALETTE_LENGTH(512) @@ -1230,10 +1228,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(victnine) + MCFG_SCREEN_UPDATE_STATIC(victnine) MCFG_GFXDECODE(flstory) MCFG_PALETTE_LENGTH(512) @@ -1296,10 +1293,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rumba) + MCFG_SCREEN_UPDATE_STATIC(rumba) MCFG_GFXDECODE(flstory) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/flyball.c mame-0.145/src/mame/drivers/flyball.c --- mame-0.144/src/mame/drivers/flyball.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/flyball.c 2012-02-06 21:30:40.000000000 +0000 @@ -83,9 +83,9 @@ } -static SCREEN_UPDATE( flyball ) +static SCREEN_UPDATE_IND16( flyball ) { - flyball_state *state = screen->machine().driver_data(); + flyball_state *state = screen.machine().driver_data(); int pitcherx = state->m_pitcher_horz; int pitchery = state->m_pitcher_vert - 31; @@ -95,23 +95,20 @@ int x; int y; - tilemap_mark_all_tiles_dirty(state->m_tmap); + state->m_tmap->mark_all_dirty(); /* draw playfield */ - tilemap_draw(bitmap, cliprect, state->m_tmap, 0, 0); + state->m_tmap->draw(bitmap, cliprect, 0, 0); /* draw pitcher */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], state->m_pitcher_pic ^ 0xf, 0, 1, 0, pitcherx, pitchery, 1); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_pitcher_pic ^ 0xf, 0, 1, 0, pitcherx, pitchery, 1); /* draw ball */ for (y = bally; y < bally + 2; y++) for (x = ballx; x < ballx + 2; x++) - if (x >= cliprect->min_x && - x <= cliprect->max_x && - y >= cliprect->min_y && - y <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, y, x) = 1; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = 1; return 0; } @@ -419,10 +416,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(flyball) + MCFG_SCREEN_UPDATE_STATIC(flyball) MCFG_GFXDECODE(flyball) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/foodf.c mame-0.145/src/mame/drivers/foodf.c --- mame-0.144/src/mame/drivers/foodf.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/foodf.c 2012-02-06 21:30:38.000000000 +0000 @@ -376,9 +376,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 384, 0, 256, 259, 0, 224) - MCFG_SCREEN_UPDATE(foodf) + MCFG_SCREEN_UPDATE_STATIC(foodf) MCFG_VIDEO_START(foodf) diff -Nru mame-0.144/src/mame/drivers/forte2.c mame-0.145/src/mame/drivers/forte2.c --- mame-0.144/src/mame/drivers/forte2.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/forte2.c 2012-02-06 21:30:36.000000000 +0000 @@ -105,14 +105,6 @@ DEVCB_LINE(vdp_interrupt) }; -static SCREEN_UPDATE( forte2 ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - static MACHINE_RESET( forte2 ) { forte2_state *state = machine.driver_data(); @@ -140,7 +132,7 @@ /* video hardware */ MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, forte2_tms9928a_interface ) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( forte2 ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/fortecar.c mame-0.145/src/mame/drivers/fortecar.c --- mame-0.144/src/mame/drivers/fortecar.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/fortecar.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,45 +1,342 @@ -/* Forte Card */ +/************************************************************************************************* -/* - -TODO: --eeprom --inputs --missing color proms? - -bp 529 do pc=53e - ------------------------------------------------------ - -Forte Card (POKER GAME) + Forte Card + 1994, Fortex Ltd. -CPU SGS Z8400AB1 (Z80ACPU) -VIDEO CM607P -PIO M5L8255AP -snd ay38910/P (microchip) -+ 8251A + Driver by Angelo Salese. + Additional work by Roberto Fresca & Rob Ragon. -RAM 6116 + GOLDSTAR GM76C256ALL-70 -dip 1X8 - -*/ + Notes: + - NMI mask and vblank bit are made thru SW usage of the I register (that is unused + if the z80 is in IM 1). + + + TODO: + - fortecar requires a proper EEPROM dump, doesn't start due of it. + - fortecrd has non-default data in the default EEPROM. + + English set: bp 512 do pc=53e + Spanish set: bp 512 do pc=562 + +------------------------------------------------------------------------------------------------- + + The Fortex company manufactured its first game 'Forte Card' in 1994. It soon became a favorite + with the Bulgarian players. Improved versions were developed and were sold in Russia, Austria, + Brazil, Argentina and the Balkan peninsular. + + In 1995, Fortex, first of all Bulgarian games manufacturers, exibited at the Plovdiv Fair a com- + puter based version of Forte Card. The following years were times of hard teamwork, which resul- + ted in a variety of products: centralized cash desk, on-line jackpot and a network control and + management system for game centers. + +------------------------------------------------------------------------------------------------- + + Forte Card (POKER GAME) + + CPU SGS Z8400AB1 (Z80ACPU) + VIDEO CM607P + PIO M5L8255AP + snd ay38910/P (microchip) + + 8251A + + RAM 6116 + GOLDSTAR GM76C256ALL-70 + dip 1X8 + +------------------------------------------------------------------------------------------------- + + Forte Card - By Fortex Ltd. + (Spanish Version) + + Sound AY 3-8910 @1.5Mhz + USART 8251 + uProc Z80 @3MHz + Video 6845 @1.5MHz + PIO 8255 + NVRam 6116 + RAM 84256 (Video, I think) + EEPROM NM93CS56N - (MICROWIRETM Bus Interface) + 256-/1024-/2048-/4096-Bit Serial EEPROM + with Data Protect and Sequential Read. + RTC V3021 + Dip 1x8 + + Xtal: 12 MHz. + + + NOTE: + + The CM607P IC is an exact clone of Motorola's MC6845P CRT Controller circuit + from MC6800 family. Used to perform the interface to raster scan CRT displays. + Made in Bulgaria in the Pravetz factory, where Pravetz-8 and Pravetz-16 compu- + ters were made in 1980's. + + FULL equivalent to MC6845P, UM6845R, EF6845P, HD6845P, etc. + + The ST93CS56 and ST93CS57 are 2K bit Electrically Erasable Programmable Memory (EEPROM) + fabricated with SGS-THOMSON's High Endurance Single Polysilicon CMOS technology. The memory + is accessed through a serial input D and output Q. The 2K bit memory is organized as 128 x 16 bit + words.The memory is accessed by a set of instructions which include Read, Write, Page Write, Write + All and instructions used to set the memory protection. A Read instruction loads the address of the + first word to be read into an internal address pointer. + + +------------------------------------------------------------------------------------------------- + + Game Notes... + + + There are 3 keys for service modes: + + 1) The Owner Key. + 2) The Rental Key. + 3) The Credits Key. + + + To enter credits through an operator: + + 1) Turn ON the Credits Key. + 2) Press RED button to add x1000, or BLACK to add x100 + 3) Turn OFF the Credit Key. + + +------------------------------------------------------------------------------------------------- + + From the manual (sic)... + + Initialization of the Forte Card circuit board + (Init machine) + + 1) Open the door of the machine, switch on the game and wait until the message + 'Permanent RAM test failed' appears. + 2) Turn the Main Control and hold it in this position. + 3) Enter the serial number of the circuit board with the eight keys. + 4) Press STAR key and wait until the message 'Machine initialization completed' appears. + 5) Release the Main Control, switch off the game and close the door. + 6) Switch on the game and wait until the demonstration displays appear. + 7) Turn the Main Control, adjust the time. This is the last step of the initialization procedure. + + +------------------------------------------------------------------------------------------------- + + Edge Connector / Pinouts.... + + -------------------+--+------------------ + Components Side |PN| Solder Side + -------------------+--+------------------ + GND |01| GND + GND |02| GND + +5V |03| +5V + +5V |04| +5V + +12V |05| +12V + CUR. LOOP IN + |06| CUR. LOOP OUT + + CUR. LOOP IN - |07| CUR. LOOP OUT - + DOOR SWITCH |08| COUNTER IN + PAYMENT |09| COUNTER OUT + COIN |10| COUNTER KEY IN + HOPPER COUNT |11| HOPPER DRIVE + BANKNOTE IN |12| RESERVED + CREDIT |13| RESERVED + MANAGER |14| RESERVED + PAGE 1 |15| RESERVE OUT + RED BUTTON |16| RED LAMP + BLACK BUTTON |17| BLACK LAMP + HOLD 1 BUTTON |18| HOLD 1 LAMP + HOLD 2 BUTTON |19| HOLD 2 LAMP + HOLD 3 BUTTON |20| HOLD 3 LAMP + HOLD 4 BUTTON |21| HOLD 4 LAMP + HOLD 5 BUTTON |22| HOLD 5 LAMP + START BUTTON |23| START LAMP + GAIN SOUND |24| SPEAKER OUT + GND SOUND |25| SP.OUT R/INTENSITY + COMP.SYNC / H SYNC |26| RED + V SYNC |27| GREEN + GND MONITOR |28| BLUE + + + Note: MANAGER and PAGE 1, are "Owner" and "Rental" modes. + + +------------------------------------------------------------------------------------------------- + + Serial EEPROM + ------------- + + Forte Card (Ver 110, Spanish) + + 0x80 x 16bit words + + Word Bytes Description Mode Notes + -----+-------+-----------------------------------+-------+-------- + 0x00 00-01 Total Entradas (low) Owner + 0x01 02-03 Total Entradas (med) Owner + 0x02 04-05 Total Entradas (high) Owner + 0x03 06-07 Total Salidas (low) Owner + 0x04 08-09 Total Salidas (med) Owner + 0x05 0A-0B Total Salidas (high) Owner + 0x06 0C-0D Total Juegos (low) Owner + 0x07 0E-0F Total Juegos (med) Owner + 0x08 10-11 Total Juegos (high) Owner + 0x09 12-13 Total Ganancias (low) Owner + 0x0A 14-15 Total Ganancias (med) Owner + 0x0B 16-17 Total Ganancias (high) Owner + 0x0C 18-19 Total Ganancias C/Apuestas (low) Owner + 0x0D 1A-1B Total Ganancias C/Apuestas (med) Owner + 0x0E 1C-1D Total Ganancias C/Apuestas (high) Owner + 0x0F 1E-1F Total Apuestas (low) Owner + + 0x10 20-21 Total Apuestas (med) Owner + 0x11 22-23 Total Apuestas (high) Owner + 0x12 24-25 Valor Moneda / Nivel Ganancia + 0x13 26-27 Min Bet / Max Bet step (0-B) - (Clase C, bit1 active??) + 0x14 28-29 Jokers (1-2) / ???? + 0x15 2A-2B Registro Dinero Minimo (low) + 0x16 2C-2D Registro Dinero Minimo (high) + 0x17 2E-2F Factor de Calculo (1-10-100) + 0x18 30-31 Serial Number (low, 4 digits) + 0x19 32-33 Serial Number (high, 0970) + 0x1A 34-35 Unknown (6F2B) + 0x1B 36-37 Unknown (0341) + 0x1C 38-39 Unknown (980C) + 0x1D 3A-3B Balance (low) Owner + 0x1E 3C-3D Balance (med) Owner + 0x1F 3E-3F Balance (high) Owner + + 0x20 40-41 Unknown (0000) + 0x21 42-43 Unknown (0000) + 0x22 44-45 Unknown (0000) + 0x23 46-47 Unknown (0000) + 0x24 48-49 Unknown (0000) + 0x25 4A-4B Unknown (0000) + 0x26 4C-4D Unknown (0000) + 0x27 4E-4F Unknown (0000) + 0x28 50-51 Unknown (0000) + 0x29 52-53 Unknown (0000) + 0x2A 54-55 Unknown (0000) + 0x2B 56-57 Unknown (0000) + 0x2C 58-59 Unknown (0000) + 0x2D 5A-5B Unknown (0000) + 0x2E 5C-5D Unknown (0000) + 0x2F 5E-5F Unknown (0000) + + 0x30 60-61 Unknown (0000) + 0x31 62-63 Unknown (0000) + 0x32 64-65 Unknown (0000) + 0x33 66-67 Unknown (0000) + 0x34 68-69 Unknown (0000) + 0x35 6A-6B Unknown (0000) + 0x36 6C-6D Unknown (0000) + 0x37 6E-6F Unknown (0000) + 0x38 70-71 Unknown (0000) + 0x39 72-73 Unknown (0000) + 0x3A 74-75 Unknown (0000) + 0x3B 76-77 Unknown (0000) + 0x3C 78-79 Unknown (0000) + 0x3D 7A-7B Unknown (0000) + 0x3E 7C-7D Unknown (0000) + 0x3F 7E-7F Unknown (0000) + + 0x40 80-81 Unknown (0000) + 0x41 82-83 Unknown (0000) + 0x42 84-85 Unknown (0000) + 0x43 86-87 Unknown (1187) + 0x44 88-89 Unknown (B042) + 0x45 8A-8B Unknown (0000) + 0x46 8C-8D Unknown (0000) + 0x47 8E-8F Unknown (0000) + 0x48 90-91 Unknown (0000) + 0x49 92-93 Unknown (0000) + 0x4A 94-95 Unknown (0000) + 0x4B 96-97 Unknown (0000) + 0x4C 98-99 Unknown (0000) + 0x4D 9A-9B Unknown (0000) + 0x4E 9C-9D Unknown (0000) + 0x4F 9E-9F Unknown (0000) + + 0x50 A0-A1 Unknown (0000) + 0x51 A2-A3 Unknown (0000) + 0x52 A4-A5 Unknown (0000) + 0x53 A6-A7 Unknown (0000) + 0x54 A8-A9 Unknown (0000) + 0x55 AA-AB Unknown (0000) + 0x56 AC-AD Unknown (0000) + 0x57 AE-AF Unknown (0000) + 0x58 B0-B1 Unknown (0000) + 0x59 B2-B3 Unknown (0000) + 0x5A B4-B5 Unknown (0000) + 0x5B B6-B7 Unknown (0000) + 0x5C B8-B9 Unknown (0000) + 0x5D BA-BB Unknown (0000) + 0x5E BC-BD Unknown (0000) + 0x5F BE-BF Unknown (0000) + + 0x60 C0-C1 Unknown (0000) + 0x61 C2-C3 Unknown (0000) + 0x62 C4-C5 Unknown (0000) + 0x63 C6-C7 Unknown (0000) + 0x64 C8-C9 Unknown (0000) + 0x65 CA-CB Unknown (0000) + 0x66 CC-CD Unknown (0000) + 0x67 CE-CF Unknown (0000) + 0x68 D0-D1 Unknown (0000) + 0x69 D2-D3 Unknown (0000) + 0x6A D4-D5 Unknown (0000) + 0x6B D6-D7 Unknown (1187) + 0x6C D8-D9 Unknown (B042) + 0x6D DA-DB Global Entradas (low) Rental + 0x6E DC-DD Global Entradas (high) Rental + 0x6F DE-DF Unknown (1187) + + 0x70 E0-E1 Unknown (B042) + 0x71 E2-E3 Global Salidas (low) Rental + 0x72 E4-E5 Global Salidas (high) Rental + 0x73 E6-E7 Unknown (172E) + 0x74 E8-E9 Unknown (980B) + 0x75 EA-EB Total Entradas Anterior (low) + 0x76 EC-ED Total Entradas Anterior (high) + 0x77 EE-EF Unknown (172E) + 0x78 F0-F1 Unknown (980B) + 0x79 F2-F3 Total Salidas Anterior (low) + 0x7A F4-F5 Total Salidas Anterior (high) + 0x7B F6-F7 Unknown (2114) + 0x7C F8-F9 ??? / Valor Billete + 0x7D FA-FB Unknown (0000) + 0x7E FC-FD Unknown (0000) + 0x7F FE-FF Checksum + + +**************************************************************************************************/ + + +#define MASTER_CLOCK XTAL_12MHz +#define CPU_CLOCK (MASTER_CLOCK/4) +#define CRTC_CLOCK (MASTER_CLOCK/8) +#define AY_CLOCK (MASTER_CLOCK/8) #include "emu.h" #include "cpu/z80/z80.h" #include "machine/eeprom.h" #include "sound/ay8910.h" #include "machine/8255ppi.h" +#include "machine/v3021.h" #include "video/mc6845.h" +#include "machine/nvram.h" +#include "video/resnet.h" + +#include "fortecrd.lh" class fortecar_state : public driver_device { public: fortecar_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } - UINT8 *m_ram; - int m_bank; + UINT8 *m_vram; + size_t m_vram_size; + + required_device m_maincpu; }; @@ -47,9 +344,9 @@ { } -static SCREEN_UPDATE(fortecar) +static SCREEN_UPDATE_IND16(fortecar) { - fortecar_state *state = screen->machine().driver_data(); + fortecar_state *state = screen.machine().driver_data(); int x,y,count; count = 0; @@ -57,12 +354,16 @@ { for(x=0;x<0x4b;x++) { - int tile,color; + int tile,color,bpp; + + tile = (state->m_vram[(count*4)+1] | (state->m_vram[(count*4)+2]<<8)) & 0xfff; + color = state->m_vram[(count*4)+3] & 0x1f; + bpp = (state->m_vram[(count*4)+3] & 0x20) >> 5; - tile = (state->m_ram[(count*4)+1] | (state->m_ram[(count*4)+2]<<8)) & 0xfff; - color = state->m_ram[(count*4)+3] & 3; + if(bpp) + color&=0x3; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,color,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[bpp],tile,color,0,0,x*8,y*8); count++; } @@ -71,10 +372,69 @@ return 0; } +static PALETTE_INIT( fortecar ) +{ +/* Video resistors... + +O1 (LS374) R1K RED +O2 (LS374) R510 RED +O3 (LS374) R220 RED +O4 (LS374) R1K GREEN +O5 (LS374) R510 GREEN +O6 (LS374) R220 GREEN +O7 (LS374) R510 BLUE +O8 (LS374) R220 BLUE + +R = 82 Ohms Pull Down. +*/ + int i; + static const int resistances_rg[3] = { 1000, 510, 220 }; + static const int resistances_b [2] = { 510, 220 }; + double weights_r[3], weights_g[3], weights_b[2]; + + compute_resistor_weights(0, 255, -1.0, + 3, resistances_rg, weights_r, 82, 0, + 3, resistances_rg, weights_g, 82, 0, + 2, resistances_b, weights_b, 82, 0); + + for (i = 0; i < 512; i++) + { + int bit0, bit1, bit2, r, g, b; + + /* red component */ + bit0 = (color_prom[i] >> 0) & 0x01; + bit1 = (color_prom[i] >> 1) & 0x01; + bit2 = (color_prom[i] >> 2) & 0x01; + r = combine_3_weights(weights_r, bit0, bit1, bit2); + + /* green component */ + bit0 = (color_prom[i] >> 3) & 0x01; + bit1 = (color_prom[i] >> 4) & 0x01; + bit2 = (color_prom[i] >> 5) & 0x01; + g = combine_3_weights(weights_g, bit0, bit1, bit2); + + /* blue component */ + bit0 = (color_prom[i] >> 6) & 0x01; + bit1 = (color_prom[i] >> 7) & 0x01; + b = combine_2_weights(weights_b, bit0, bit1); + + palette_set_color(machine, i, MAKE_RGB(r, g, b)); + } +} + + static WRITE8_DEVICE_HANDLER( ppi0_portc_w ) { +/* +NM93CS56N Serial EEPROM + +CS PPI_PC0 +CK PPI_PC1 +DIN PPI_PC2 +DOUT PPI_PC4 +*/ eeprom_device *eeprom = downcast(device); - eeprom->write_bit(data & 0x04); + eeprom->write_bit((data & 0x04) >> 2); eeprom->set_cs_line((data & 0x01) ? CLEAR_LINE : ASSERT_LINE); eeprom->set_clock_line((data & 0x02) ? ASSERT_LINE : CLEAR_LINE); } @@ -83,38 +443,80 @@ { // popmessage("%s",device->machine().describe_context()); eeprom_device *eeprom = downcast(device); - return (~(eeprom->read_bit()<<1) & 2); + return ((eeprom->read_bit()<<4) & 0x10); } static const ppi8255_interface ppi0intf = { - DEVCB_INPUT_PORT("DSW1"), DEVCB_INPUT_PORT("IN2"), DEVCB_DEVICE_HANDLER("eeprom", ppi0_portc_r), - DEVCB_NULL, DEVCB_NULL, DEVCB_DEVICE_HANDLER("eeprom", ppi0_portc_w) +/* Init with 0x9a... A, B and high C as input + Serial Eprom connected to Port C +*/ + + DEVCB_INPUT_PORT("SYSTEM"), /* Port A read */ + DEVCB_INPUT_PORT("INPUT"), /* Port B read */ + DEVCB_DEVICE_HANDLER("eeprom", ppi0_portc_r), /* Port C read */ + DEVCB_NULL, /* Port A write */ + DEVCB_NULL, /* Port B write */ + DEVCB_DEVICE_HANDLER("eeprom", ppi0_portc_w) /* Port C write */ }; static WRITE8_DEVICE_HANDLER( ayporta_w ) { - logerror("AY port A write %02x\n",data); +/* System Lamps... - /* - lamps for POST? - 0x01: RAM test d000-d7ff - 0x02: VRAM test d800-ffff - 0x04: Video SYNC test - 0x08: ROM check - 0x10: NVRAM check - 0x20: IRQ test - 0x40: Stack RAM check - */ + - bits - + 7654 3210 + ---- ---x START lamp. + ---- --x- HOLD5 lamp. + ---- -x-- HOLD4 lamp. + ---- x--- HOLD3 lamp. + ---x ---- HOLD2 lamp. + --x- ---- HOLD1 lamp. + -x-- ---- BLACK lamp. + x--- ---- RED/BET lamp. + + Also used for POST?... + + 0x01 (start): RAM test d000-d7ff + 0x02 (hold5): VRAM test d800-ffff + 0x04 (hold4): Video SYNC test + 0x08 (hold3): ROM check + 0x10 (hold2): NVRAM check + 0x20 (hold1): IRQ test + 0x40 (black): Stack RAM check +*/ + int i; + + for(i=0;i<8;i++) + output_set_lamp_value(i, (data >> i) & 1); } -/* lamps? */ + static WRITE8_DEVICE_HANDLER( ayportb_w ) { - //logerror("AY port B write %02x\n",data); +/* + +There is a RC to 7705's Reset. +Bit7 of port B is a watchdog. + +A square wave is fed to through resistor R to capacitor C, with a constant charge/discharge +time relative to the value of resistor R and value of capacitor C. If the square wave halts, +capacitor C will charge beyond the hysteresis threshhold of the TL7705 (leg 6), causing it to +trigger a reset. + +Seems to work properly, but must be checked closely... + +*/ + if (((data >> 7) & 0x01) == 0) /* check for bit7 */ + { + watchdog_reset(device->machine()); + } + +// logerror("AY port B write %02x\n",data); } + static const ay8910_interface ay8910_config = { AY8910_LEGACY_OUTPUT, @@ -125,86 +527,98 @@ DEVCB_HANDLER(ayportb_w) }; + +static const mc6845_interface mc6845_intf = +{ + "screen", /* screen we are acting on */ + 8, /* number of pixels per video memory address */ + NULL, /* before pixel update callback */ + NULL, /* row update callback */ + NULL, /* after pixel update callback */ + DEVCB_NULL, /* callback for display state changes */ + DEVCB_NULL, /* callback for cursor state changes */ + DEVCB_NULL, /* HSYNC callback */ + DEVCB_NULL, /* VSYNC callback */ + NULL /* update address callback */ +}; + + +static const eeprom_interface forte_eeprom_intf = +{/* + Preliminary interface for NM93CS56N Serial EEPROM. + Correct address & data. Using 93C46 similar protocol. +*/ + 8, /* address bits */ + 16, /* data bits */ + "*110", /* read command */ + "*101", /* write command */ + "*111", /* erase command */ + "*10000xxxxxx", /* lock command */ + "*10011xxxxxx", /* unlock command */ +}; + + static ADDRESS_MAP_START( fortecar_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc7ff) AM_ROM - AM_RANGE(0xd000, 0xd7ff) AM_RAM - AM_RANGE(0xd800, 0xffff) AM_RAM AM_BASE_MEMBER(fortecar_state, m_ram) + AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_SHARE("nvram") + AM_RANGE(0xd800, 0xffff) AM_RAM AM_BASE_SIZE_MEMBER(fortecar_state, m_vram,m_vram_size) ADDRESS_MAP_END static ADDRESS_MAP_START( fortecar_ports, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x20, 0x20) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) + AM_RANGE(0x20, 0x20) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) // pc=444 AM_RANGE(0x21, 0x21) AM_DEVWRITE_MODERN("crtc", mc6845_device, register_w) AM_RANGE(0x40, 0x40) AM_DEVREAD("aysnd", ay8910_r) AM_RANGE(0x40, 0x41) AM_DEVWRITE("aysnd", ay8910_address_data_w) AM_RANGE(0x60, 0x63) AM_DEVREADWRITE("fcppi0", ppi8255_r, ppi8255_w)//M5L8255AP // AM_RANGE(0x80, 0x81) //8251A UART - AM_RANGE(0xa0, 0xa0) AM_READ_PORT("IN0") //written too,multiplexer? - AM_RANGE(0xa1, 0xa1) AM_READ_PORT("IN1") + AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE_MODERN("rtc", v3021_device, read, write) + AM_RANGE(0xa1, 0xa1) AM_READ_PORT("DSW") ADDRESS_MAP_END +/* +CRTC REGISTER: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f +CRTC DATA : 5f 4b 50 08 21 05 1e 1f 00 07 20 00 06 00 00 00 -static INPUT_PORTS_START( fortecar ) - PORT_START("IN0") /* 8bit */ - PORT_DIPNAME( 0x01, 0x01, "IN0" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +Error messages: + +"FALSA PRUEBA NVR" (NVRAM new, no serial EEPROM connected) +"FALLO EN NVR" (NVRAM ok, no serial EEPROM connected) +"FALSA PRUEBA NVRAM PERMANENTE" (NVRAM new, serial EEPROM connected) - PORT_START("IN1") /* 8bit */ - PORT_DIPNAME( 0x01, 0x01, "IN1" ) +*/ + +static INPUT_PORTS_START( fortecar ) + PORT_START("DSW") /* 8bit */ + PORT_DIPNAME( 0x01, 0x01, "DSW-1" ) PORT_DIPLOCATION("DSW:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, "Attract Mode" ) PORT_DIPLOCATION("DSW:2") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "DSW-3" ) PORT_DIPLOCATION("DSW:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x08, "DSW-4" ) PORT_DIPLOCATION("DSW:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, "DSW-5" ) PORT_DIPLOCATION("DSW:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x20, "DSW-6" ) PORT_DIPLOCATION("DSW:6") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x40, "DSW-7" ) PORT_DIPLOCATION("DSW:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x80, "DSW-8" ) PORT_DIPLOCATION("DSW:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("IN2") /* 8bit */ - PORT_DIPNAME( 0x01, 0x01, "IN2" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INPUT") /* 8bit */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_HIGH ) PORT_NAME("Red / Bet") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_LOW ) PORT_NAME("Black") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) @@ -212,122 +626,101 @@ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL ) - PORT_START("DSW1") /* 8bit */ - PORT_DIPNAME( 0x01, 0x01, "DSW1" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("SYSTEM") /* 8bit */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rear Door") PORT_CODE(KEYCODE_D) PORT_TOGGLE + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) PORT_NAME("Payout") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin In") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* to trace */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Note In") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Credits Key") PORT_CODE(KEYCODE_Q) PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Owner Key") PORT_CODE(KEYCODE_0) PORT_TOGGLE + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Rental Key") PORT_CODE(KEYCODE_9) PORT_TOGGLE INPUT_PORTS_END -static const gfx_layout tiles8x8_layout = + +static const gfx_layout tiles8x8_layout_3bpp = +{ + 8,8, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(2,3)+4, RGN_FRAC(1,3)+4, RGN_FRAC(0,3)+4 }, + { 8,9,10,11,0, 1, 2, 3 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, + 16*8 +}; + +static const gfx_layout tiles8x8_layout_6bpp = { 8,8, RGN_FRAC(1,3), 6, - { 0,4, RGN_FRAC(1,3)+0, RGN_FRAC(1,3)+4, RGN_FRAC(2,3)+0, RGN_FRAC(2,3)+4 }, + { RGN_FRAC(2,3)+0, RGN_FRAC(1,3)+0, RGN_FRAC(0,3)+0, RGN_FRAC(2,3)+4, RGN_FRAC(1,3)+4, RGN_FRAC(0,3)+4 }, { 8,9,10,11,0, 1, 2, 3 }, { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 }, 16*8 }; + static GFXDECODE_START( fortecar ) - GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 4 ) + GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout_3bpp, 0x000, 0x20 ) + GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout_6bpp, 0x100, 0x04 ) GFXDECODE_END + + static MACHINE_RESET(fortecar) { fortecar_state *state = machine.driver_data(); - state->m_bank = -1; -} + int i; -/* WRONG, just to see something */ -static PALETTE_INIT( fortecar ) -{ - int i,r,g,b; - - for (i = 0; i < 0x40*4; i++ ) - { - g = (i >> 0) & 3; - b = (i >> 2) & 3; - r = (i >> 4) & 3; - - palette_set_color(machine, i, MAKE_RGB(pal2bit(r), pal2bit(g), pal2bit(b))); - } + /* apparently there's a random fill in there (checked thru trojan TODO: extract proper algorythm) */ + for(i=0;im_vram_size;i++) + state->m_vram[i] = machine.rand(); } -static const mc6845_interface mc6845_intf = -{ - "screen", /* screen we are acting on */ - 8, /* number of pixels per video memory address */ - NULL, /* before pixel update callback */ - NULL, /* row update callback */ - NULL, /* after pixel update callback */ - DEVCB_NULL, /* callback for display state changes */ - DEVCB_NULL, /* callback for cursor state changes */ - DEVCB_NULL, /* HSYNC callback */ - DEVCB_NULL, /* VSYNC callback */ - NULL /* update address callback */ -}; -//51f static MACHINE_CONFIG_START( fortecar, fortecar_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80,6000000) /* ? MHz */ + MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) /* 3 MHz, measured */ MCFG_CPU_PROGRAM_MAP(fortecar_map) MCFG_CPU_IO_MAP(fortecar_ports) MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_WATCHDOG_TIME_INIT(attotime::from_msec(200)) /* guess */ + + MCFG_NVRAM_ADD_0FILL("nvram") /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 256) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1) - MCFG_SCREEN_UPDATE(fortecar) + MCFG_SCREEN_VISIBLE_AREA(0, 600-1, 0, 240-1) /* driven by CRTC */ + MCFG_SCREEN_UPDATE_STATIC(fortecar) MCFG_MACHINE_RESET(fortecar) - MCFG_EEPROM_93C46_ADD("eeprom") + MCFG_EEPROM_ADD("eeprom", forte_eeprom_intf) MCFG_EEPROM_DEFAULT_VALUE(0) MCFG_PPI8255_ADD("fcppi0", ppi0intf) + MCFG_V3021_ADD("rtc") MCFG_GFXDECODE(fortecar) - MCFG_PALETTE_LENGTH(0x100) + MCFG_PALETTE_LENGTH(0x200) MCFG_PALETTE_INIT(fortecar) MCFG_VIDEO_START(fortecar) - MCFG_MC6845_ADD("crtc", MC6845, 6000000/4, mc6845_intf) /* unknown type / hand tuned to get ~60 fps */ + MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) /* 1.5 MHz, measured */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("aysnd", AY8910, 1500000) + MCFG_SOUND_ADD("aysnd", AY8910, AY_CLOCK) /* 1.5 MHz, measured */ MCFG_SOUND_CONFIG(ay8910_config) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END + ROM_START( fortecar ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "fortecar.u7", 0x00000, 0x010000, CRC(2a4b3429) SHA1(8fa630dac949e758678a1a36b05b3412abe8ae16) ) @@ -337,12 +730,43 @@ ROM_LOAD( "fortecar.u39", 0x10000, 0x10000, CRC(fc3ddf4f) SHA1(4a95b24c4edb67f6d59f795f86dfbd12899e01b0) ) ROM_LOAD( "fortecar.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) ) - ROM_REGION( 0x200, "prom", 0 ) - ROM_LOAD( "prom.x", 0x000, 0x200, NO_DUMP ) + /* took from the Spanish version, these are likely to be identical anyway */ + ROM_REGION( 0x0800, "nvram", 0 ) /* default NVRAM */ + ROM_LOAD( "fortecrd_nvram.u6", 0x0000, 0x0800, BAD_DUMP CRC(7d3e7eb5) SHA1(788fe7adc381bcc6eaefed33f5aa1081340608a0) ) + + ROM_REGION( 0x0200, "eeprom", 0 ) /* default serial EEPROM */ + ROM_LOAD16_WORD_SWAP( "forte_card_93cs56_serial_12345678.u13", 0x0000, 0x0100, BAD_DUMP CRC(2fc5961d) SHA1(f958c8b2b4e48cc6e5a607a6751acde5592bd27f) ) + + ROM_REGION( 0x200, "proms", 0 ) + ROM_LOAD( "forte_card_82s147.u47", 0x0000, 0x0200, BAD_DUMP CRC(7e631818) SHA1(ac08b0de30260278af3a1c5dee5810d4304cb9ca) ) +ROM_END + +ROM_START( fortecrd ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "forte_card.u7", 0x00000, 0x010000, CRC(79fc6dd3) SHA1(5454f2ee12b62d573b61c54e48398f43332b000e) ) + + ROM_REGION( 0x30000, "gfx1", 0 ) + ROM_LOAD( "forte_card.u38", 0x00000, 0x10000, CRC(258fb7bf) SHA1(cd75001fe40836b2dc229caddfc38f6076df7a79) ) + ROM_LOAD( "forte_card.u39", 0x10000, 0x10000, CRC(3d9c478e) SHA1(eb86115d1c36038f2c80cd116f5aeddd94036424) ) + ROM_LOAD( "forte_card.u40", 0x20000, 0x10000, CRC(9693bb83) SHA1(e3e3bc750c89a1edd1072ce3890b2ce498dec633) ) + + ROM_REGION( 0x0800, "nvram", 0 ) /* default NVRAM */ + ROM_LOAD( "fortecrd_nvram.u6", 0x0000, 0x0800, CRC(7d3e7eb5) SHA1(788fe7adc381bcc6eaefed33f5aa1081340608a0) ) + + ROM_REGION( 0x0200, "eeprom", 0 ) /* default serial EEPROM */ + ROM_LOAD16_WORD_SWAP( "forte_card_93cs56_serial_12345678.u13", 0x0000, 0x0100, CRC(2fc5961d) SHA1(f958c8b2b4e48cc6e5a607a6751acde5592bd27f) ) + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD( "forte_card_82s147.u47", 0x0000, 0x0200, CRC(7e631818) SHA1(ac08b0de30260278af3a1c5dee5810d4304cb9ca) ) ROM_END + static DRIVER_INIT( fortecar ) { + // ... } -GAME( 19??, fortecar, 0, fortecar, fortecar, fortecar, ROT0, "Fortex Ltd", "Forte Card",GAME_NOT_WORKING | GAME_WRONG_COLORS) + +/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */ +GAMEL( 1994, fortecar, 0, fortecar, fortecar, fortecar, ROT0, "Fortex Ltd", "Forte Card (Ver 103, English)", GAME_NOT_WORKING, layout_fortecrd ) +GAMEL( 1994, fortecrd, fortecar, fortecar, fortecar, fortecar, ROT0, "Fortex Ltd", "Forte Card (Ver 110, Spanish)", 0, layout_fortecrd ) diff -Nru mame-0.144/src/mame/drivers/freekick.c mame-0.145/src/mame/drivers/freekick.c --- mame-0.144/src/mame/drivers/freekick.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/freekick.c 2012-02-06 21:30:38.000000000 +0000 @@ -645,10 +645,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pbillrd) + MCFG_SCREEN_UPDATE_STATIC(pbillrd) MCFG_PALETTE_LENGTH(0x200) MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) @@ -690,7 +689,7 @@ MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(freekick) + MCFG_SCREEN_UPDATE_STATIC(freekick) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( gigas, base ) @@ -703,7 +702,7 @@ MCFG_MACHINE_RESET(freekick) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(gigas) + MCFG_SCREEN_UPDATE_STATIC(gigas) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( oigas, gigas ) diff -Nru mame-0.144/src/mame/drivers/fromanc2.c mame-0.145/src/mame/drivers/fromanc2.c --- mame-0.144/src/mame/drivers/fromanc2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/fromanc2.c 2012-02-06 21:30:38.000000000 +0000 @@ -584,20 +584,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_right) MCFG_VIDEO_START(fromanc2) @@ -637,20 +635,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_right) MCFG_VIDEO_START(fromancr) @@ -687,20 +683,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(2048, 256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromanc2) + MCFG_SCREEN_UPDATE_STATIC(fromanc2_right) MCFG_VIDEO_START(fromanc4) diff -Nru mame-0.144/src/mame/drivers/fromance.c mame-0.145/src/mame/drivers/fromance.c --- mame-0.144/src/mame/drivers/fromance.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/fromance.c 2012-02-06 21:30:38.000000000 +0000 @@ -1025,10 +1025,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromance) + MCFG_SCREEN_UPDATE_STATIC(fromance) MCFG_GFXDECODE(fromance) MCFG_PALETTE_LENGTH(1024) @@ -1064,10 +1063,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromance) + MCFG_SCREEN_UPDATE_STATIC(fromance) MCFG_GFXDECODE(fromance) MCFG_PALETTE_LENGTH(2048) @@ -1103,10 +1101,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 352-1, 0, 240-1) - MCFG_SCREEN_UPDATE(fromance) + MCFG_SCREEN_UPDATE_STATIC(fromance) MCFG_GFXDECODE(fromance) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/funkball.c mame-0.145/src/mame/drivers/funkball.c --- mame-0.144/src/mame/drivers/funkball.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/funkball.c 2012-02-06 21:30:36.000000000 +0000 @@ -3,6 +3,11 @@ /*************************************************************************** +driver by Angelo Salese & Phil Bennett + +Notes: +- + Funky Ball dgPIX, 1998 @@ -60,69 +65,1132 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + + #include "emu.h" #include "cpu/i386/i386.h" #include "memconv.h" #include "devconv.h" +#include "machine/8237dma.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/mc146818.h" +#include "machine/pcshare.h" +#include "machine/pci.h" +#include "machine/8042kbdc.h" +#include "machine/pckeybrd.h" +#include "machine/idectrl.h" +#include "video/voodoo.h" class funkball_state : public driver_device { public: funkball_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pit8254(*this, "pit8254"), + m_dma8237_1(*this, "dma8237_1"), + m_dma8237_2(*this, "dma8237_2"), + m_pic8259_1(*this, "pic8259_1"), + m_pic8259_2(*this, "pic8259_2"), + m_voodoo(*this, "voodoo_0") + { } + + int m_dma_channel; + UINT8 m_dma_offset[2][4]; + UINT8 m_at_pages[0x10]; + + UINT8 m_funkball_config_reg_sel; + UINT8 m_funkball_config_regs[256]; + UINT32 m_cx5510_regs[256/4]; + UINT16 m_flash_addr; + UINT32 *m_unk_ram; + UINT8 *m_bios_ram; + UINT8 m_flash_cmd; + UINT8 m_flash_data_cmd; + + UINT32 m_biu_ctrl_reg[256/4]; + + // devices + required_device m_maincpu; + required_device m_pit8254; + required_device m_dma8237_1; + required_device m_dma8237_2; + required_device m_pic8259_1; + required_device m_pic8259_2; + required_device m_voodoo; + + DECLARE_READ8_MEMBER( get_slave_ack ); + DECLARE_WRITE8_MEMBER( flash_w ); + DECLARE_READ8_MEMBER( flash_data_r ); + DECLARE_WRITE8_MEMBER( flash_data_w ); +// DECLARE_WRITE8_MEMBER( bios_ram_w ); + DECLARE_READ8_MEMBER( test_r ); + + DECLARE_READ8_MEMBER( fdc_r ); + DECLARE_WRITE8_MEMBER( fdc_w ); + + virtual void video_start(); + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + struct + { + /* PCI */ + UINT32 command; + UINT32 base_addr; + UINT32 init_enable; + } m_voodoo_pci_regs; }; +void funkball_state::video_start() +{ + +} + +UINT32 funkball_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect ) +{ + return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; +} -static VIDEO_START(funkball) +static UINT32 voodoo_0_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) { + funkball_state* state = device->machine().driver_data(); + UINT32 val = 0; + + printf("Voodoo PCI R: %x\n", reg); + + switch (reg) + { + case 0: + val = 0x0001121a; + break; + case 0x10: + val = state->m_voodoo_pci_regs.base_addr; + break; + case 0x40: + val = state->m_voodoo_pci_regs.init_enable; + break; + } + return val; +} + +static void voodoo_0_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + funkball_state* state = device->machine().driver_data(); + + printf("Voodoo [%x]: %x\n", reg, data); + + switch (reg) + { + case 0x04: + state->m_voodoo_pci_regs.command = data & 0x3; + break; + case 0x10: + if (data == 0xffffffff) + state->m_voodoo_pci_regs.base_addr = 0xff000000; + else + state->m_voodoo_pci_regs.base_addr = data; + break; + case 0x40: + state->m_voodoo_pci_regs.init_enable = data; + voodoo_set_init_enable(state->m_voodoo, data); + break; + } +} + +static UINT32 cx5510_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + funkball_state *state = busdevice->machine().driver_data(); + + //mame_printf_debug("CX5510: PCI read %d, %02X, %08X\n", function, reg, mem_mask); + switch (reg) + { + case 0: return 0x00001078; + } + + return state->m_cx5510_regs[reg/4]; +} + +static void cx5510_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + funkball_state *state = busdevice->machine().driver_data(); + + //mame_printf_debug("CX5510: PCI write %d, %02X, %08X, %08X\n", function, reg, data, mem_mask); + COMBINE_DATA(state->m_cx5510_regs + (reg/4)); } -static SCREEN_UPDATE(funkball) +#if 0 +static READ32_DEVICE_HANDLER( ide_r ) { + return ide_controller32_r(device, 0x1f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( ide_w ) +{ + ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); +} + +static READ32_DEVICE_HANDLER( fdc_r ) +{ + return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( fdc_w ) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); +} +#endif + +READ8_MEMBER( funkball_state::fdc_r ) +{ + //printf("%02x\n",offset); + if(offset == 0xd) + return 0x20; + return 0; } -static ADDRESS_MAP_START(funkball_map, AS_PROGRAM, 32) - AM_RANGE(0xffff0000, 0xffffffff) AM_ROM AM_REGION("user1", 0) /* System BIOS */ +WRITE8_MEMBER( funkball_state::fdc_w ) +{ + if(offset == 8) + { + if(data == 0x0d) + printf("\n"); + else + printf("%c",data); + } +} + + +static READ8_HANDLER(at_page8_r) +{ + funkball_state *state = space->machine().driver_data(); + UINT8 data = state->m_at_pages[offset % 0x10]; + + switch(offset % 8) { + case 1: + data = state->m_dma_offset[(offset / 8) & 1][2]; + break; + case 2: + data = state->m_dma_offset[(offset / 8) & 1][3]; + break; + case 3: + data = state->m_dma_offset[(offset / 8) & 1][1]; + break; + case 7: + data = state->m_dma_offset[(offset / 8) & 1][0]; + break; + } + return data; +} + + +static WRITE8_HANDLER(at_page8_w) +{ + funkball_state *state = space->machine().driver_data(); + state->m_at_pages[offset % 0x10] = data; + + switch(offset % 8) { + case 1: + state->m_dma_offset[(offset / 8) & 1][2] = data; + break; + case 2: + state->m_dma_offset[(offset / 8) & 1][3] = data; + break; + case 3: + state->m_dma_offset[(offset / 8) & 1][1] = data; + break; + case 7: + state->m_dma_offset[(offset / 8) & 1][0] = data; + break; + } +} + +static READ32_HANDLER(at_page32_r) +{ + return read32le_with_read8_handler(at_page8_r, space, offset, mem_mask); +} + + +static WRITE32_HANDLER(at_page32_w) +{ + write32le_with_write8_handler(at_page8_w, space, offset, data, mem_mask); +} + +static READ8_DEVICE_HANDLER(at_dma8237_2_r) +{ + return i8237_r(device, offset / 2); +} + +static WRITE8_DEVICE_HANDLER(at_dma8237_2_w) +{ + i8237_w(device, offset / 2, data); +} + +static READ32_DEVICE_HANDLER(at32_dma8237_2_r) +{ + return read32le_with_read8_device_handler(at_dma8237_2_r, device, offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER(at32_dma8237_2_w) +{ + write32le_with_write8_device_handler(at_dma8237_2_w, device, offset, data, mem_mask); +} + + + + +static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed ) +{ + cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + /* Assert HLDA */ + i8237_hlda_w( device, state ); +} + + +static READ8_HANDLER( pc_dma_read_byte ) +{ + funkball_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + return space->read_byte(page_offset + offset); +} + + +static WRITE8_HANDLER( pc_dma_write_byte ) +{ + funkball_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + space->write_byte(page_offset + offset, data); +} + +static void set_dma_channel(device_t *device, int channel, int state) +{ + funkball_state *drvstate = device->machine().driver_data(); + if (!state) drvstate->m_dma_channel = channel; +} + +static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); } + +static I8237_INTERFACE( dma8237_1_config ) +{ + DEVCB_LINE(pc_dma_hrq_changed), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte), + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte), + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) } +}; + +static I8237_INTERFACE( dma8237_2_config ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } +}; + +static UINT8 funkball_config_reg_r(device_t *device) +{ + funkball_state *state = device->machine().driver_data(); + + //mame_printf_debug("funkball_config_reg_r %02X\n", funkball_config_reg_sel); + return state->m_funkball_config_regs[state->m_funkball_config_reg_sel]; +} + +static void funkball_config_reg_w(device_t *device, UINT8 data) +{ + funkball_state *state = device->machine().driver_data(); + + //mame_printf_debug("funkball_config_reg_w %02X, %02X\n", funkball_config_reg_sel, data); + state->m_funkball_config_regs[state->m_funkball_config_reg_sel] = data; +} + +static READ8_DEVICE_HANDLER( io20_r ) +{ + UINT8 r = 0; + + // 0x22, 0x23, Cyrix configuration registers + if (offset == 0x02) + { + } + else if (offset == 0x03) + { + r = funkball_config_reg_r(device); + } + else + { + r = pic8259_r(device, offset); + } + return r; +} + +static WRITE8_DEVICE_HANDLER( io20_w ) +{ + funkball_state *state = device->machine().driver_data(); + + // 0x22, 0x23, Cyrix configuration registers + if (offset == 0x02) + { + state->m_funkball_config_reg_sel = data; + } + else if (offset == 0x03) + { + funkball_config_reg_w(device, data); + } + else + { + pic8259_w(device, offset, data); + } +} + +WRITE8_MEMBER( funkball_state::flash_w ) +{ + if(!(offset & 0x2)) + { + m_flash_addr = (offset & 1) ? ((m_flash_addr & 0xff) | (data << 8)) : ((m_flash_addr & 0xff00) | (data)); + //printf("%08x ADDR\n",m_flash_addr << 16); + } + else if(offset == 2) + { + /* 0x83: read from u29/u30 + 0x03: read from u3 + 0x81: init device + */ + m_flash_cmd = data; + printf("%02x CMD\n",data); + } + else + printf("%02x %02x\n",offset,data); +} + +READ8_MEMBER( funkball_state::flash_data_r ) +{ + if(m_flash_data_cmd == 0x90) + { + if(offset == 0 && (m_flash_addr == 0)) + return 0x89; // manufacturer code + + if(offset == 2 && (m_flash_addr == 0)) + return 0x14; // device code, 32 MBit in both cases + + if(offset > 3) + printf("%02x FLASH DATA 0x90\n",offset); + + return 0; + } + + if(m_flash_data_cmd == 0xff) + { + UINT8 *ROM = machine().region(m_flash_cmd & 0x80 ? "prg_flash" : "data_flash")->base(); + + return ROM[offset + (m_flash_addr << 16)]; + } + + printf("%02x %08x %02x %02x\n",offset,m_flash_addr << 16,m_flash_cmd,m_flash_data_cmd); + + return 0; +} + +WRITE8_MEMBER( funkball_state::flash_data_w ) +{ + if(offset == 0) + { + m_flash_data_cmd = data; + } + else + printf("%08x %02x FLASH DATA W %08x\n",offset,data,m_flash_addr << 16); +} + +static READ32_HANDLER( biu_ctrl_r ) +{ + funkball_state *state = space->machine().driver_data(); + + if (offset == 0) + { + return 0xffffff; + } + return state->m_biu_ctrl_reg[offset]; +} + +static WRITE32_HANDLER( biu_ctrl_w ) +{ + funkball_state *state = space->machine().driver_data(); + + //mame_printf_debug("biu_ctrl_w %08X, %08X, %08X\n", data, offset, mem_mask); + COMBINE_DATA(state->m_biu_ctrl_reg + offset); + + if (offset == 0x0c/4) // BC_XMAP_3 register + { + const char *const banknames[8] = { "bios_ext1", "bios_ext2", "bios_ext3","bios_ext4", "bios_bank1", "bios_bank2", "bios_bank3", "bios_bank4" }; + int i; + + for(i=0;i<8;i++) + { + if (data & 0x1 << i*4) // enable RAM access to region 0xe0000 - 0xfffff + memory_set_bankptr(space->machine(), banknames[i], state->m_bios_ram + (0x4000 * i)); + else // disable RAM access (reads go to BIOS ROM) + memory_set_bankptr(space->machine(), banknames[i], space->machine().region("bios")->base() + (0x4000 * i)); + } + } +} + +static WRITE8_HANDLER( bios_ram_w ) +{ + funkball_state *state = space->machine().driver_data(); + + if(state->m_biu_ctrl_reg[0x0c/4] & (2 << ((offset & 0x4000)>>14)*4)) // memory is write-able + { + state->m_bios_ram[offset] = data; + } +} + +READ8_MEMBER( funkball_state::test_r ) +{ + static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7", + "IN8", "IN9", "INA", "INB", "INC", "IND", "INE", "INF",}; + + return input_port_read(machine(), portnames[offset]); +} + +static ADDRESS_MAP_START(funkball_map, AS_PROGRAM, 32, funkball_state) + AM_RANGE(0x00000000, 0x0009ffff) AM_RAM + AM_RANGE(0x000a0000, 0x000affff) AM_RAM + AM_RANGE(0x000b0000, 0x000bffff) AM_READWRITE8(flash_data_r,flash_data_w,0xffffffff) + AM_RANGE(0x000c0000, 0x000cffff) AM_RAM + AM_RANGE(0x000d0000, 0x000dffff) AM_RAM + AM_RANGE(0x000e0000, 0x000e3fff) AM_ROMBANK("bios_ext1") + AM_RANGE(0x000e4000, 0x000e7fff) AM_ROMBANK("bios_ext2") + AM_RANGE(0x000e8000, 0x000ebfff) AM_ROMBANK("bios_ext3") + AM_RANGE(0x000ec000, 0x000effff) AM_ROMBANK("bios_ext4") + AM_RANGE(0x000f0000, 0x000f3fff) AM_ROMBANK("bios_bank1") + AM_RANGE(0x000f4000, 0x000f7fff) AM_ROMBANK("bios_bank2") + AM_RANGE(0x000f8000, 0x000fbfff) AM_ROMBANK("bios_bank3") + AM_RANGE(0x000fc000, 0x000fffff) AM_ROMBANK("bios_bank4") + AM_RANGE(0x000e0000, 0x000fffff) AM_WRITE8_LEGACY(bios_ram_w,0xffffffff) + AM_RANGE(0x00100000, 0x07ffffff) AM_RAM +// AM_RANGE(0x08000000, 0x0fffffff) AM_NOP + AM_RANGE(0x40008000, 0x400080ff) AM_READWRITE_LEGACY(biu_ctrl_r, biu_ctrl_w) + AM_RANGE(0x40010e00, 0x40010eff) AM_RAM AM_BASE(m_unk_ram) + AM_RANGE(0xff000000, 0xffffdfff) AM_DEVREADWRITE_LEGACY("voodoo_0", voodoo_r, voodoo_w) + AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END -static ADDRESS_MAP_START(funkball_io, AS_IO, 32) +static ADDRESS_MAP_START(funkball_io, AS_IO, 32, funkball_state) + AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, 0xffffffff) + AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8_LEGACY("pic8259_1", io20_r, io20_w, 0xffffffff) + AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) + AM_RANGE(0x0060, 0x006f) AM_READWRITE_LEGACY(kbdc8042_32le_r, kbdc8042_32le_w) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ + AM_RANGE(0x0080, 0x009f) AM_READWRITE_LEGACY(at_page32_r, at_page32_w) + AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE_LEGACY("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) + AM_RANGE(0x00e8, 0x00ef) AM_NOP + +// AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE_LEGACY("ide", ide_r, ide_w) +// AM_RANGE(0x03f0, 0x03ff) AM_DEVREADWRITE_LEGACY("ide", fdc_r, fdc_w) + AM_RANGE(0x03f0, 0x03ff) AM_READWRITE8(fdc_r,fdc_w,0xffffffff) + + AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE_LEGACY("pcibus", pci_32le_r, pci_32le_w) + + AM_RANGE(0x0360, 0x0363) AM_WRITE8(flash_w,0xffffffff) + +// AM_RANGE(0x0320, 0x0323) AM_READ(test_r) + AM_RANGE(0x0360, 0x036f) AM_READ8(test_r,0xffffffff) // inputs ADDRESS_MAP_END static INPUT_PORTS_START( funkball ) + PORT_START("IN0") + PORT_DIPNAME( 0x01, 0x01, "0" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN1") + PORT_DIPNAME( 0x01, 0x01, "1" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN2") + PORT_DIPNAME( 0x01, 0x01, "2" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN3") + PORT_DIPNAME( 0x01, 0x01, "3" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN4") + PORT_DIPNAME( 0x01, 0x01, "4" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN5") + PORT_DIPNAME( 0x01, 0x01, "5" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN6") + PORT_DIPNAME( 0x01, 0x01, "6" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* 7-8 P1/P2 E-F "dgDelay" */ + PORT_START("IN7") + PORT_DIPNAME( 0x01, 0x01, "7" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN8") + PORT_DIPNAME( 0x01, 0x01, "8" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN9") + PORT_DIPNAME( 0x01, 0x01, "9" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INA") + PORT_DIPNAME( 0x01, 0x01, "A" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INB") + PORT_DIPNAME( 0x01, 0x01, "B" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INC") + PORT_DIPNAME( 0x01, 0x01, "C" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IND") + PORT_DIPNAME( 0x01, 0x01, "D" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INE") + PORT_DIPNAME( 0x01, 0x01, "E" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("INF") + PORT_DIPNAME( 0x01, 0x01, "F" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static const struct pit8253_config funkball_pit8254_config = +{ + { + { + 4772720/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +static WRITE_LINE_DEVICE_HANDLER( funkball_pic8259_1_set_int_line ) +{ + funkball_state *drvstate = device->machine().driver_data(); + device_set_input_line(drvstate->m_maincpu, 0, state ? HOLD_LINE : CLEAR_LINE); +} + +READ8_MEMBER( funkball_state::get_slave_ack ) +{ + if (offset==2) { // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface funkball_pic8259_1_config = +{ + DEVCB_LINE(funkball_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_MEMBER(funkball_state,get_slave_ack) +}; + +static const struct pic8259_interface funkball_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + +static void set_gate_a20(running_machine &machine, int a20) +{ + funkball_state *state = machine.driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + funkball_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static int funkball_get_out2(running_machine &machine) +{ + funkball_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2 ); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, funkball_get_out2 +}; + +static void funkball_set_keyb_int(running_machine &machine, int state) +{ + funkball_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static IRQ_CALLBACK(irq_callback) +{ + funkball_state *state = device->machine().driver_data(); + return pic8259_acknowledge( state->m_pic8259_1); +} + +static void ide_interrupt(device_t *device, int state) +{ + funkball_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} + +static MACHINE_START( funkball ) +{ + funkball_state *state = machine.driver_data(); + + state->m_bios_ram = auto_alloc_array(machine, UINT8, 0x20000); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, funkball_set_keyb_int); + + device_set_irq_callback(state->m_maincpu, irq_callback); + + kbdc8042_init(machine, &at8042); + + /* defaults, otherwise it won't boot */ + state->m_unk_ram[0x010/4] = 0x2f8d85ff; + state->m_unk_ram[0x018/4] = 0x000018c5; +} + +static MACHINE_RESET( funkball ) +{ + funkball_state *state = machine.driver_data(); + memory_set_bankptr(machine, "bios_ext1", machine.region("bios")->base() + 0x00000); + memory_set_bankptr(machine, "bios_ext2", machine.region("bios")->base() + 0x04000); + memory_set_bankptr(machine, "bios_ext3", machine.region("bios")->base() + 0x08000); + memory_set_bankptr(machine, "bios_ext4", machine.region("bios")->base() + 0x0c000); + memory_set_bankptr(machine, "bios_bank1", machine.region("bios")->base() + 0x10000); + memory_set_bankptr(machine, "bios_bank2", machine.region("bios")->base() + 0x14000); + memory_set_bankptr(machine, "bios_bank3", machine.region("bios")->base() + 0x18000); + memory_set_bankptr(machine, "bios_bank4", machine.region("bios")->base() + 0x1c000); + state->m_voodoo_pci_regs.base_addr = 0xff000000; +} + +SCREEN_UPDATE_RGB32( funkball ) +{ + voodoo_update(screen.machine().device("voodoo_0"), bitmap, cliprect); + return 0; +} + static MACHINE_CONFIG_START( funkball, funkball_state ) - MCFG_CPU_ADD("maincpu", MEDIAGX, 66666666*3.5) + MCFG_CPU_ADD("maincpu", MEDIAGX, 66666666*3.5) // 66,6 MHz x 3.5 MCFG_CPU_PROGRAM_MAP(funkball_map) MCFG_CPU_IO_MAP(funkball_io) + MCFG_MACHINE_START(funkball) + MCFG_MACHINE_RESET(funkball) + + MCFG_PIT8254_ADD( "pit8254", funkball_pit8254_config ) + MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) + MCFG_PIC8259_ADD( "pic8259_1", funkball_pic8259_1_config ) + MCFG_PIC8259_ADD( "pic8259_2", funkball_pic8259_2_config ) + + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + + MCFG_PCI_BUS_ADD("pcibus", 0) + MCFG_PCI_BUS_DEVICE(7, "voodoo_0", voodoo_0_pci_r, voodoo_0_pci_w) + MCFG_PCI_BUS_DEVICE(18, NULL, cx5510_pci_r, cx5510_pci_w) + + MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + /* video hardware */ + MCFG_3DFX_VOODOO_1_ADD("voodoo_0", STD_VOODOO_1_CLOCK, 2, "screen") + MCFG_3DFX_VOODOO_CPU("maincpu") + MCFG_3DFX_VOODOO_TMU_MEMORY(0, 4) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(funkball) - MCFG_PALETTE_LENGTH(16) - - MCFG_VIDEO_START(funkball) + MCFG_SCREEN_UPDATE_DRIVER(funkball_state, screen_update) + MCFG_SCREEN_SIZE(1024, 1024) + MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 447) MACHINE_CONFIG_END ROM_START( funkball ) - ROM_REGION32_LE(0x10000, "user1", 0) - ROM_LOAD( "512k-epr.u62", 0x000000, 0x010000, CRC(cced894a) SHA1(298c81716e375da4b7215f3e588a45ca3ea7e35c) ) + ROM_REGION32_LE(0x20000, "bios", ROMREGION_ERASEFF) + ROM_LOAD( "512k-epr.u62", 0x010000, 0x010000, CRC(cced894a) SHA1(298c81716e375da4b7215f3e588a45ca3ea7e35c) ) - ROM_REGION(0x400000, "user2", 0) - ROM_LOAD( "flash.u3", 0x000000, 0x400000, CRC(fb376abc) SHA1(ea4c48bb6cd2055431a33f5c426e52c7af6997eb) ) + ROM_REGION(0x8000000, "prg_flash", ROMREGION_ERASE00) + ROM_LOAD( "flash.u3", 0x0000000, 0x400000, CRC(fb376abc) SHA1(ea4c48bb6cd2055431a33f5c426e52c7af6997eb) ) - ROM_REGION(0x800000, "user3", 0) - ROM_LOAD( "flash.u29", 0x000000, 0x400000, CRC(7cf6ff4b) SHA1(4ccdd4864ad92cc218998f3923997119a1a9dd1d) ) - ROM_LOAD( "flash.u30", 0x400000, 0x400000, CRC(1d46717a) SHA1(acfbd0a2ccf4d717779733c4a9c639296c3bbe0e) ) + ROM_REGION(0x8000000, "data_flash", ROMREGION_ERASE00) + ROM_LOAD( "flash.u29",0x0000000, 0x400000, CRC(7cf6ff4b) SHA1(4ccdd4864ad92cc218998f3923997119a1a9dd1d) ) + ROM_LOAD( "flash.u30",0x0400000, 0x400000, CRC(1d46717a) SHA1(acfbd0a2ccf4d717779733c4a9c639296c3bbe0e) ) ROM_END -GAME(1998, funkball, 0, funkball, funkball, 0, ROT0, "dgPIX Entertainment Inc.", "Funky Ball", GAME_NO_SOUND|GAME_NOT_WORKING) +GAME(1998, funkball, 0, funkball, funkball, 0, ROT0, "dgPIX Entertainment Inc.", "Funky Ball", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/funkybee.c mame-0.145/src/mame/drivers/funkybee.c --- mame-0.144/src/mame/drivers/funkybee.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/funkybee.c 2012-02-06 21:30:39.000000000 +0000 @@ -307,10 +307,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12, 32*8-8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(funkybee) + MCFG_SCREEN_UPDATE_STATIC(funkybee) MCFG_GFXDECODE(funkybee) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/funkyjet.c mame-0.145/src/mame/drivers/funkyjet.c --- mame-0.144/src/mame/drivers/funkyjet.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/funkyjet.c 2012-02-06 21:30:39.000000000 +0000 @@ -322,10 +322,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(funkyjet) + MCFG_SCREEN_UPDATE_STATIC(funkyjet) MCFG_GFXDECODE(funkyjet) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/funworld.c mame-0.145/src/mame/drivers/funworld.c --- mame-0.144/src/mame/drivers/funworld.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/funworld.c 2012-02-06 21:30:35.000000000 +0000 @@ -2364,10 +2364,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((124+1)*4, (30+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1) */ MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06 */ - MCFG_SCREEN_UPDATE(funworld) + MCFG_SCREEN_UPDATE_STATIC(funworld) MCFG_GFXDECODE(fw1stpal) diff -Nru mame-0.144/src/mame/drivers/funybubl.c mame-0.145/src/mame/drivers/funybubl.c --- mame-0.144/src/mame/drivers/funybubl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/funybubl.c 2012-02-06 21:30:37.000000000 +0000 @@ -233,11 +233,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(12*8, 512-12*8-1, 16, 256-16-1) // MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(funybubl) + MCFG_SCREEN_UPDATE_STATIC(funybubl) MCFG_GFXDECODE(funybubl) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/fuukifg2.c mame-0.145/src/mame/drivers/fuukifg2.c --- mame-0.144/src/mame/drivers/fuukifg2.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/fuukifg2.c 2012-02-06 21:30:40.000000000 +0000 @@ -481,10 +481,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-16-1) - MCFG_SCREEN_UPDATE(fuuki16) + MCFG_SCREEN_UPDATE_STATIC(fuuki16) MCFG_GFXDECODE(fuuki16) MCFG_PALETTE_LENGTH(0x800*4) diff -Nru mame-0.144/src/mame/drivers/fuukifg3.c mame-0.145/src/mame/drivers/fuukifg3.c --- mame-0.144/src/mame/drivers/fuukifg3.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/fuukifg3.c 2012-02-06 21:30:40.000000000 +0000 @@ -615,11 +615,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(fuuki32) - MCFG_SCREEN_EOF(fuuki32) + MCFG_SCREEN_UPDATE_STATIC(fuuki32) + MCFG_SCREEN_VBLANK_STATIC(fuuki32) MCFG_GFXDECODE(fuuki32) MCFG_PALETTE_LENGTH(0x4000/2) diff -Nru mame-0.144/src/mame/drivers/g627.c mame-0.145/src/mame/drivers/g627.c --- mame-0.144/src/mame/drivers/g627.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/g627.c 2012-02-06 21:30:37.000000000 +0000 @@ -5,6 +5,9 @@ Only one of it's kind */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -12,18 +15,28 @@ { public: g627_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( g627_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( g627_map, AS_PROGRAM, 8, g627_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( g627 ) INPUT_PORTS_END -static MACHINE_RESET( g627 ) +void g627_state::machine_reset() { } @@ -35,8 +48,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 14138000/8) MCFG_CPU_PROGRAM_MAP(g627_map) - - MCFG_MACHINE_RESET( g627 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -49,4 +60,5 @@ ROM_LOAD("rot-c117.dat", 0x1000, 0x0800, CRC(3321ff08) SHA1(d6d94fea27ef58ca648b2829b32d62fcec108c9b)) ROM_END -GAME(1978, rotation, 0, g627, g627, g627, ROT0, "Midway", "Rotation VIII", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1978, rotation, 0, g627, g627, g627, ROT0, "Midway", "Rotation VIII", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gaelco2.c mame-0.145/src/mame/drivers/gaelco2.c --- mame-0.144/src/mame/drivers/gaelco2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gaelco2.c 2012-02-06 21:30:42.000000000 +0000 @@ -20,7 +20,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "machine/eeprom.h" #include "sound/gaelco.h" @@ -167,11 +166,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_GFXDECODE(0x0080000) MCFG_PALETTE_LENGTH(4096*16 - 16) /* game's palette is 4096 but we allocate 15 more for shadows & highlights */ @@ -291,7 +289,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 30000000/2) /* 15 MHz */ MCFG_CPU_PROGRAM_MAP(bang_map) - MCFG_CPU_VBLANK_INT_HACK(bang_interrupt, 6) + MCFG_TIMER_ADD_SCANLINE("scantimer", bang_irq, "screen", 0, 1) MCFG_EEPROM_ADD("eeprom", gaelco2_eeprom_interface) @@ -301,11 +299,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_GFXDECODE(0x0200000) MCFG_PALETTE_LENGTH(4096*16 - 16) /* game's palette is 4096 but we allocate 15 more for shadows & highlights */ @@ -543,11 +540,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_GFXDECODE(0x0400000) MCFG_PALETTE_LENGTH(4096*16 - 16) /* game's palette is 4096 but we allocate 15 more for shadows & highlights */ @@ -787,21 +783,19 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2_dual) + MCFG_SCREEN_UPDATE_STATIC(gaelco2_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2_dual) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2_right) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_VIDEO_START(gaelco2_dual) @@ -982,11 +976,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_GFXDECODE(0x0400000) MCFG_PALETTE_LENGTH(4096*16 - 16) /* game's palette is 4096 but we allocate 15 more for shadows & highlights */ @@ -1225,21 +1218,19 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(384, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2_dual) + MCFG_SCREEN_UPDATE_STATIC(gaelco2_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(59.1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(384, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 256-1) - MCFG_SCREEN_UPDATE(gaelco2_dual) - MCFG_SCREEN_EOF(gaelco2) + MCFG_SCREEN_UPDATE_STATIC(gaelco2_right) + MCFG_SCREEN_VBLANK_STATIC(gaelco2) MCFG_VIDEO_START(gaelco2_dual) diff -Nru mame-0.144/src/mame/drivers/gaelco3d.c mame-0.145/src/mame/drivers/gaelco3d.c --- mame-0.144/src/mame/drivers/gaelco3d.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gaelco3d.c 2012-02-06 21:30:41.000000000 +0000 @@ -1029,10 +1029,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(576, 432) MCFG_SCREEN_VISIBLE_AREA(0, 575, 0, 431) - MCFG_SCREEN_UPDATE(gaelco3d) + MCFG_SCREEN_UPDATE_STATIC(gaelco3d) MCFG_PALETTE_LENGTH(32768) @@ -1217,34 +1216,6 @@ static DRIVER_INIT( gaelco3d ) { - gaelco3d_state *state = machine.driver_data(); - UINT8 *src, *dst; - int x, y; - - /* allocate memory */ - state->m_texture_size = machine.region("gfx1")->bytes(); - state->m_texmask_size = machine.region("gfx2")->bytes() * 8; - state->m_texture = auto_alloc_array(machine, UINT8, state->m_texture_size); - state->m_texmask = auto_alloc_array(machine, UINT8, state->m_texmask_size); - - /* first expand the pixel data */ - src = machine.region("gfx1")->base(); - dst = state->m_texture; - for (y = 0; y < state->m_texture_size/4096; y += 2) - for (x = 0; x < 4096; x += 2) - { - dst[(y + 0) * 4096 + (x + 1)] = src[0*state->m_texture_size/4 + (y/2) * 2048 + (x/2)]; - dst[(y + 1) * 4096 + (x + 1)] = src[1*state->m_texture_size/4 + (y/2) * 2048 + (x/2)]; - dst[(y + 0) * 4096 + (x + 0)] = src[2*state->m_texture_size/4 + (y/2) * 2048 + (x/2)]; - dst[(y + 1) * 4096 + (x + 0)] = src[3*state->m_texture_size/4 + (y/2) * 2048 + (x/2)]; - } - - /* then expand the mask data */ - src = machine.region("gfx2")->base(); - dst = state->m_texmask; - for (y = 0; y < state->m_texmask_size/4096; y++) - for (x = 0; x < 4096; x++) - dst[y * 4096 + x] = (src[(x / 1024) * (state->m_texmask_size/8/4) + (y * 1024 + x % 1024) / 8] >> (x % 8)) & 1; } diff -Nru mame-0.144/src/mame/drivers/gaelco.c mame-0.145/src/mame/drivers/gaelco.c --- mame-0.144/src/mame/drivers/gaelco.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/gaelco.c 2012-02-06 21:30:40.000000000 +0000 @@ -80,7 +80,7 @@ data = gaelco_decrypt(space, offset, data, 0x0f, 0x4228); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap[offset >> 11], ((offset << 1) & 0x0fff) >> 2); + state->m_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); } @@ -103,7 +103,7 @@ data = gaelco_decrypt(space, offset, data, 0x0e, 0x4228); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap[offset >> 11], ((offset << 1) & 0x0fff) >> 2); + state->m_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); } static WRITE16_HANDLER(thoop_encrypted_w) @@ -525,10 +525,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(bigkarnk) + MCFG_SCREEN_UPDATE_STATIC(bigkarnk) MCFG_GFXDECODE(0x100000) MCFG_PALETTE_LENGTH(1024) @@ -558,10 +557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(maniacsq) + MCFG_SCREEN_UPDATE_STATIC(maniacsq) MCFG_GFXDECODE(0x100000) MCFG_PALETTE_LENGTH(1024) @@ -590,10 +588,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(maniacsq) + MCFG_SCREEN_UPDATE_STATIC(maniacsq) MCFG_GFXDECODE(0x100000) MCFG_PALETTE_LENGTH(1024) @@ -622,10 +619,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(maniacsq) + MCFG_SCREEN_UPDATE_STATIC(maniacsq) MCFG_GFXDECODE(0x100000) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/gaiden.c mame-0.145/src/mame/drivers/gaiden.c --- mame-0.144/src/mame/drivers/gaiden.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/gaiden.c 2012-02-06 21:30:41.000000000 +0000 @@ -785,10 +785,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(gaiden) + MCFG_SCREEN_UPDATE_STATIC(gaiden) MCFG_GFXDECODE(gaiden) MCFG_PALETTE_LENGTH(4096) @@ -818,8 +817,7 @@ static MACHINE_CONFIG_DERIVED( raiga, shadoww ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(raiga) + MCFG_SCREEN_UPDATE_STATIC(raiga) MCFG_VIDEO_START(raiga) MCFG_GFXDECODE(raiga) @@ -843,10 +841,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(drgnbowl) + MCFG_SCREEN_UPDATE_STATIC(drgnbowl) MCFG_GFXDECODE(drgnbowl) MCFG_PALETTE_LENGTH(4096) @@ -960,10 +957,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gaiden) + MCFG_SCREEN_UPDATE_STATIC(gaiden) MCFG_GFXDECODE(mastninj) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/gal3.c mame-0.145/src/mame/drivers/gal3.c --- mame-0.144/src/mame/drivers/gal3.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/gal3.c 2012-02-06 21:30:38.000000000 +0000 @@ -178,29 +178,29 @@ } } /* update_palette */ -static SCREEN_UPDATE(gal3) +static SCREEN_UPDATE_RGB32(gal3) { - gal3_state *state = screen->machine().driver_data(); + gal3_state *state = screen.machine().driver_data(); int i; char mst[18], slv[18]; static int pivot = 15; int pri; - update_palette(screen->machine()); + update_palette(screen.machine()); - if( screen->machine().input().code_pressed_once(KEYCODE_H)&&(pivot<15) ) pivot+=1; - if( screen->machine().input().code_pressed_once(KEYCODE_J)&&(pivot>0) ) pivot-=1; + if( screen.machine().input().code_pressed_once(KEYCODE_H)&&(pivot<15) ) pivot+=1; + if( screen.machine().input().code_pressed_once(KEYCODE_J)&&(pivot>0) ) pivot-=1; for( pri=0; primachine(), bitmap, cliprect, pri ); + namco_obj_draw(screen.machine(), bitmap, cliprect, pri ); } /* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf ); for( pri=pivot; pri<15; pri++ ) { - namco_obj_draw(screen->machine(), bitmap, cliprect, pri ); + namco_obj_draw(screen.machine(), bitmap, cliprect, pri ); }*/ // CPU Diag LEDs @@ -267,33 +267,6 @@ } } -/* shared RAM memory handlers */ - -static READ32_HANDLER( shareram0_r ) -{ - gal3_state *state = space->machine().driver_data(); - return state->m_mpSharedRAM0[offset]; -} - -static WRITE32_HANDLER( shareram0_w ) -{ - gal3_state *state = space->machine().driver_data(); - COMBINE_DATA( &state->m_mpSharedRAM0[offset] ); -} - -#if 0 -static READ32_HANDLER( shareram1_r ) -{ - gal3_state *state = space->machine().driver_data(); - return state->m_mpSharedRAM1[offset]; -} - -static WRITE32_HANDLER( shareram1_w ) -{ - gal3_state *state = space->machine().driver_data(); - COMBINE_DATA( &state->m_mpSharedRAM1[offset] ); -} -#endif /***************************************************************************************/ @@ -376,6 +349,7 @@ state->m_rsoSharedRAM[offset+1] = v&0xffff; } + static ADDRESS_MAP_START( cpu_mst_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_RANGE(0x20000000, 0x20001fff) AM_RAM AM_BASE_MEMBER(gal3_state, m_nvmem) AM_SIZE_MEMBER(gal3_state, m_nvmem_size) //NVRAM @@ -384,8 +358,8 @@ AM_RANGE(0x44800000, 0x44800003) AM_READ(led_mst_r) AM_WRITE(led_mst_w) //LEDs AM_RANGE(0x48000000, 0x48000003) AM_READNOP //irq1 v-blank ack AM_RANGE(0x4c000000, 0x4c000003) AM_READNOP //irq3 ack - AM_RANGE(0x60000000, 0x60007fff) AM_READ(shareram0_r) AM_WRITE(shareram0_w) AM_BASE_MEMBER(gal3_state, m_mpSharedRAM0) //CRAM - AM_RANGE(0x60010000, 0x60017fff) AM_READ(shareram0_r) AM_WRITE(shareram0_w) //Mirror + AM_RANGE(0x60000000, 0x60007fff) AM_RAM AM_SHARE("share1") //CRAM + AM_RANGE(0x60010000, 0x60017fff) AM_RAM AM_SHARE("share1") //Mirror AM_RANGE(0x80000000, 0x8007ffff) AM_RAM //512K Local RAM /// AM_RANGE(0xc0000000, 0xc000000b) AM_WRITENOP //upload? AM_RANGE(0xc000000c, 0xc000000f) AM_READNOP //irq2 ack @@ -401,8 +375,8 @@ AM_RANGE(0x48000000, 0x48000003) AM_READNOP //irq1 ack /// AM_RANGE(0x50000000, 0x50000003) AM_READ() AM_WRITE() /// AM_RANGE(0x54000000, 0x54000003) AM_READ() AM_WRITE() - AM_RANGE(0x60000000, 0x60007fff) AM_READ(shareram0_r) AM_WRITE(shareram0_w) - AM_RANGE(0x60010000, 0x60017fff) AM_READ(shareram0_r) AM_WRITE(shareram0_w) + AM_RANGE(0x60000000, 0x60007fff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x60010000, 0x60017fff) AM_RAM AM_SHARE("share1") AM_RANGE(0x80000000, 0x8007ffff) AM_RAM //512K Local RAM AM_RANGE(0xf1200000, 0xf120ffff) AM_RAM //DSP RAM @@ -680,18 +654,16 @@ MCFG_SCREEN_ADD("lscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1) - MCFG_SCREEN_UPDATE(gal3) + MCFG_SCREEN_UPDATE_STATIC(gal3) MCFG_SCREEN_ADD("rscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1) - MCFG_SCREEN_UPDATE(gal3) + MCFG_SCREEN_UPDATE_STATIC(gal3) MCFG_GFXDECODE(namcos21) MCFG_PALETTE_LENGTH(NAMCOS21_NUM_COLORS) diff -Nru mame-0.144/src/mame/drivers/galaga.c mame-0.145/src/mame/drivers/galaga.c --- mame-0.144/src/mame/drivers/galaga.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/galaga.c 2012-02-06 21:30:41.000000000 +0000 @@ -737,44 +737,43 @@ static WRITE8_HANDLER( bosco_latch_w ) { galaga_state *state = space->machine().driver_data(); - int bit = data & 1; switch (offset) { case 0x00: /* IRQ1 */ - cpu_interrupt_enable(space->machine().device("maincpu"), bit); - if (!bit) + state->m_main_irq_mask = data & 1; + if (!state->m_main_irq_mask) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; case 0x01: /* IRQ2 */ - cpu_interrupt_enable(space->machine().device("sub"), bit); - if (!bit) + state->m_sub_irq_mask = data & 1; + if (!state->m_sub_irq_mask) cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); break; case 0x02: /* NMION */ - cpu_interrupt_enable(space->machine().device("sub2"), !bit); + state->m_sub2_nmi_mask = !(data & 1); break; case 0x03: /* RESET */ - cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, bit ? CLEAR_LINE : ASSERT_LINE); - cputag_set_input_line(space->machine(), "sub2", INPUT_LINE_RESET, bit ? CLEAR_LINE : ASSERT_LINE); + cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); + cputag_set_input_line(space->machine(), "sub2", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); break; case 0x04: /* n.c. */ break; case 0x05: /* MOD 0 (xevious: n.c.) */ - state->m_custom_mod = (state->m_custom_mod & ~0x01) | (bit << 0); + state->m_custom_mod = (state->m_custom_mod & ~0x01) | ((data & 1) << 0); break; case 0x06: /* MOD 1 (xevious: n.c.) */ - state->m_custom_mod = (state->m_custom_mod & ~0x02) | (bit << 1); + state->m_custom_mod = (state->m_custom_mod & ~0x02) | ((data & 1) << 1); break; case 0x07: /* MOD 2 (xevious: n.c.) */ - state->m_custom_mod = (state->m_custom_mod & ~0x04) | (bit << 2); + state->m_custom_mod = (state->m_custom_mod & ~0x04) | ((data & 1) << 2); break; } } @@ -865,7 +864,8 @@ galaga_state *state = machine.driver_data(); int scanline = param; - nmi_line_pulse(machine.device("sub2")); + if(state->m_sub2_nmi_mask) + nmi_line_pulse(machine.device("sub2")); scanline = scanline + 128; if (scanline >= 272) @@ -884,6 +884,9 @@ state->m_cpu3_interrupt_timer = machine.scheduler().timer_alloc(FUNC(cpu3_interrupt_callback)); state->m_custom_mod = 0; state_save_register_global(machine, state->m_custom_mod); + state->save_item(NAME(state->m_main_irq_mask)); + state->save_item(NAME(state->m_sub_irq_mask)); + state->save_item(NAME(state->m_sub2_nmi_mask)); } static void bosco_latch_reset(running_machine &machine) @@ -987,8 +990,8 @@ AM_RANGE(0x9000, 0x93ff) AM_RAM AM_SHARE("share3") AM_BASE_MEMBER(digdug_state, m_digdug_posram) /* work RAM + sprite registers */ AM_RANGE(0x9800, 0x9bff) AM_RAM AM_SHARE("share4") AM_BASE_MEMBER(digdug_state, m_digdug_flpram) /* work RAM + sprite registers */ AM_RANGE(0xa000, 0xa007) AM_READNOP AM_WRITE(digdug_PORT_w) /* video latches (spurious reads when setting latch bits) */ - AM_RANGE(0xb800, 0xb83f) AM_DEVREADWRITE("earom", atari_vg_earom_r, atari_vg_earom_w) /* non volatile memory data */ - AM_RANGE(0xb840, 0xb840) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) /* non volatile memory control */ + AM_RANGE(0xb800, 0xb83f) AM_DEVREADWRITE_MODERN("earom", atari_vg_earom_device, read, write) /* non volatile memory data */ + AM_RANGE(0xb840, 0xb840) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) /* non volatile memory control */ ADDRESS_MAP_END @@ -1625,8 +1628,8 @@ static const char *const battles_sample_names[] = { "*battles", - "explo1.wav", /* ground target explosion */ - "explo2.wav", /* Solvalou explosion */ + "explo1", /* ground target explosion */ + "explo2", /* Solvalou explosion */ 0 /* end of array */ }; @@ -1637,17 +1640,32 @@ }; +static INTERRUPT_GEN( main_vblank_irq ) +{ + galaga_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} + +static INTERRUPT_GEN( sub_vblank_irq ) +{ + galaga_state *state = device->machine().driver_data(); + + if(state->m_sub_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} static MACHINE_CONFIG_START( bosco, bosco_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(bosco_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("sub", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(bosco_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("sub2", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(bosco_map) @@ -1669,10 +1687,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 288, 264, 16, 224+16) - MCFG_SCREEN_UPDATE(bosco) - MCFG_SCREEN_EOF(bosco) + MCFG_SCREEN_UPDATE_STATIC(bosco) + MCFG_SCREEN_VBLANK_STATIC(bosco) MCFG_GFXDECODE(bosco) MCFG_PALETTE_LENGTH(64*4+64*4+4+64) @@ -1699,11 +1716,11 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(galaga_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("sub", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(galaga_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("sub2", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(galaga_map) @@ -1721,10 +1738,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 288, 264, 0, 224) - MCFG_SCREEN_UPDATE(galaga) - MCFG_SCREEN_EOF(galaga) + MCFG_SCREEN_UPDATE_STATIC(galaga) + MCFG_SCREEN_VBLANK_STATIC(galaga) MCFG_GFXDECODE(galaga) MCFG_PALETTE_LENGTH(64*4+64*4+64) @@ -1768,11 +1784,11 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(xevious_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("sub", Z80,MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(xevious_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("sub2", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(xevious_map) @@ -1791,9 +1807,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 288, 264, 0, 224) - MCFG_SCREEN_UPDATE(xevious) + MCFG_SCREEN_UPDATE_STATIC(xevious) MCFG_GFXDECODE(xevious) MCFG_PALETTE_LENGTH(128*4+64*8+64*2) @@ -1850,11 +1865,11 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(digdug_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("sub", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(digdug_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("sub2", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(digdug_map) @@ -1873,9 +1888,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 288, 264, 0, 224) - MCFG_SCREEN_UPDATE(digdug) + MCFG_SCREEN_UPDATE_STATIC(digdug) MCFG_GFXDECODE(digdug) MCFG_PALETTE_LENGTH(16*2+64*4+64*4) diff -Nru mame-0.144/src/mame/drivers/galastrm.c mame-0.145/src/mame/drivers/galastrm.c --- mame-0.144/src/mame/drivers/galastrm.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/galastrm.c 2012-02-06 21:30:40.000000000 +0000 @@ -324,10 +324,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 50*8) MCFG_SCREEN_VISIBLE_AREA(0+96, 40*8-1+96, 3*8+60, 32*8-1+60) - MCFG_SCREEN_UPDATE(galastrm) + MCFG_SCREEN_UPDATE_STATIC(galastrm) MCFG_GFXDECODE(galastrm) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/galaxia.c mame-0.145/src/mame/drivers/galaxia.c --- mame-0.144/src/mame/drivers/galaxia.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/galaxia.c 2012-02-06 21:30:41.000000000 +0000 @@ -41,18 +41,14 @@ -static SCREEN_UPDATE( galaxia ) +static SCREEN_UPDATE_IND16( galaxia ) { - galaxia_state *state = screen->machine().driver_data(); + galaxia_state *state = screen.machine().driver_data(); int x,y, count; - bitmap_t *s2636_0_bitmap; - bitmap_t *s2636_1_bitmap; - bitmap_t *s2636_2_bitmap; - - device_t *s2636_0 = screen->machine().device("s2636_0"); - device_t *s2636_1 = screen->machine().device("s2636_1"); - device_t *s2636_2 = screen->machine().device("s2636_2"); + device_t *s2636_0 = screen.machine().device("s2636_0"); + device_t *s2636_1 = screen.machine().device("s2636_1"); + device_t *s2636_2 = screen.machine().device("s2636_2"); count = 0; @@ -61,37 +57,37 @@ for (x=0;x<256/8;x++) { int tile = state->m_video[count]; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,0,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,0,0,0,x*8,y*8); count++; } } - s2636_0_bitmap = s2636_update(s2636_0, cliprect); - s2636_1_bitmap = s2636_update(s2636_1, cliprect); - s2636_2_bitmap = s2636_update(s2636_2, cliprect); + bitmap_ind16 &s2636_0_bitmap = s2636_update(s2636_0, cliprect); + bitmap_ind16 &s2636_1_bitmap = s2636_update(s2636_1, cliprect); + bitmap_ind16 &s2636_2_bitmap = s2636_update(s2636_2, cliprect); /* copy the S2636 images into the main bitmap */ { int y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - int pixel0 = *BITMAP_ADDR16(s2636_0_bitmap, y, x); - int pixel1 = *BITMAP_ADDR16(s2636_1_bitmap, y, x); - int pixel2 = *BITMAP_ADDR16(s2636_2_bitmap, y, x); + int pixel0 = s2636_0_bitmap.pix16(y, x); + int pixel1 = s2636_1_bitmap.pix16(y, x); + int pixel2 = s2636_2_bitmap.pix16(y, x); if (S2636_IS_PIXEL_DRAWN(pixel0)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel0); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel0); if (S2636_IS_PIXEL_DRAWN(pixel1)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel1); if (S2636_IS_PIXEL_DRAWN(pixel2)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel2); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel2); } } } @@ -280,10 +276,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(galaxia) + MCFG_SCREEN_UPDATE_STATIC(galaxia) MCFG_GFXDECODE(galaxia) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/galaxian.c mame-0.145/src/mame/drivers/galaxian.c --- mame-0.144/src/mame/drivers/galaxian.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/galaxian.c 2012-02-06 21:30:40.000000000 +0000 @@ -2009,9 +2009,8 @@ MCFG_PALETTE_LENGTH(32) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART) - MCFG_SCREEN_UPDATE(galaxian) + MCFG_SCREEN_UPDATE_STATIC(galaxian) MCFG_PALETTE_INIT(galaxian) MCFG_VIDEO_START(galaxian) @@ -2121,7 +2120,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(zigzag) + MCFG_SCREEN_UPDATE_STATIC(zigzag) /* sound hardware */ MCFG_SOUND_ADD("aysnd", AY8910, 1789750) diff -Nru mame-0.144/src/mame/drivers/galaxi.c mame-0.145/src/mame/drivers/galaxi.c --- mame-0.144/src/mame/drivers/galaxi.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/galaxi.c 2012-02-06 21:30:41.000000000 +0000 @@ -117,35 +117,35 @@ { galaxi_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg1_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg1_tmap, offset); + state->m_bg1_tmap->mark_tile_dirty(offset); } static WRITE16_HANDLER( galaxi_bg2_w ) { galaxi_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg2_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg2_tmap, offset); + state->m_bg2_tmap->mark_tile_dirty(offset); } static WRITE16_HANDLER( galaxi_bg3_w ) { galaxi_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg3_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg3_tmap, offset); + state->m_bg3_tmap->mark_tile_dirty(offset); } static WRITE16_HANDLER( galaxi_bg4_w ) { galaxi_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg4_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg4_tmap, offset); + state->m_bg4_tmap->mark_tile_dirty(offset); } static WRITE16_HANDLER( galaxi_fg_w ) { galaxi_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_ram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tmap, offset); + state->m_fg_tmap->mark_tile_dirty(offset); } static VIDEO_START(galaxi) @@ -159,41 +159,41 @@ state->m_fg_tmap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 0x40, 0x20); - tilemap_set_transparent_pen(state->m_bg1_tmap, 0); - tilemap_set_transparent_pen(state->m_bg2_tmap, 0); - tilemap_set_transparent_pen(state->m_bg3_tmap, 0); - tilemap_set_transparent_pen(state->m_bg4_tmap, 0); + state->m_bg1_tmap->set_transparent_pen(0); + state->m_bg2_tmap->set_transparent_pen(0); + state->m_bg3_tmap->set_transparent_pen(0); + state->m_bg4_tmap->set_transparent_pen(0); - tilemap_set_transparent_pen(state->m_fg_tmap, 0); + state->m_fg_tmap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg3_tmap, -8, 0); + state->m_bg3_tmap->set_scrolldx(-8, 0); } -static SCREEN_UPDATE(galaxi) +static SCREEN_UPDATE_IND16(galaxi) { - galaxi_state *state = screen->machine().driver_data(); + galaxi_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_R)) // remapped due to inputs changes. + if (screen.machine().input().code_pressed(KEYCODE_R)) // remapped due to inputs changes. { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_T)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_Y)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_U)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_I)) msk |= 8; - if (screen->machine().input().code_pressed(KEYCODE_O)) msk |= 16; + if (screen.machine().input().code_pressed(KEYCODE_T)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_Y)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_U)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_I)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_O)) msk |= 16; if (msk != 0) layers_ctrl &= msk; } #endif - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_bg1_tmap, TILEMAP_DRAW_OPAQUE, 0); - else bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_bg2_tmap, 0, 0); - if (layers_ctrl & 4) tilemap_draw(bitmap, cliprect, state->m_bg3_tmap, 0, 0); - if (layers_ctrl & 8) tilemap_draw(bitmap, cliprect, state->m_bg4_tmap, 0, 0); + if (layers_ctrl & 1) state->m_bg1_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + else bitmap.fill(get_black_pen(screen.machine()), cliprect); + if (layers_ctrl & 2) state->m_bg2_tmap->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 4) state->m_bg3_tmap->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 8) state->m_bg4_tmap->draw(bitmap, cliprect, 0, 0); - if (layers_ctrl & 16) tilemap_draw(bitmap, cliprect, state->m_fg_tmap, 0, 0); + if (layers_ctrl & 16) state->m_fg_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -411,10 +411,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(16*5, 512-16*2-1, 16*1, 256-1) - MCFG_SCREEN_UPDATE(galaxi) + MCFG_SCREEN_UPDATE_STATIC(galaxi) MCFG_GFXDECODE(galaxi) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/galaxold.c mame-0.145/src/mame/drivers/galaxold.c --- mame-0.144/src/mame/drivers/galaxold.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/galaxold.c 2012-02-06 21:30:40.000000000 +0000 @@ -762,13 +762,20 @@ ADDRESS_MAP_END +static WRITE8_HANDLER( harem_nmi_mask_w ) +{ + galaxold_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + static ADDRESS_MAP_START( harem_cpu1, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x27ff) AM_RAM AM_RANGE(0x4000, 0x47ff) AM_RAM AM_RANGE(0x4800, 0x4fff) AM_READWRITE(galaxold_videoram_r, galaxold_videoram_w) AM_BASE_MEMBER(galaxold_state, m_videoram) AM_RANGE(0x5000, 0x5000) AM_WRITENOP - AM_RANGE(0x5800, 0x5800) AM_READNOP AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5800, 0x5800) AM_READNOP AM_WRITE(harem_nmi_mask_w) AM_RANGE(0x5801, 0x5807) AM_WRITENOP AM_RANGE(0x6101, 0x6101) AM_READ_PORT("IN0") AM_RANGE(0x6102, 0x6102) AM_READ_PORT("IN1") @@ -2135,9 +2142,8 @@ MCFG_PALETTE_LENGTH(32+2+64) /* 32 for the characters, 2 for the bullets, 64 for the stars */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_PALETTE_INIT(galaxold) MCFG_VIDEO_START(galaxold) @@ -2288,10 +2294,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_PALETTE_LENGTH(64) MCFG_GFXDECODE(gmgalax) @@ -2315,7 +2320,7 @@ MCFG_VIDEO_START(bongo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_SOUND_ADD("aysnd", AY8910, PIXEL_CLOCK/4) MCFG_SOUND_CONFIG(bongo_ay8910_interface) @@ -2335,12 +2340,20 @@ MCFG_FRAGMENT_ADD(galaxian_audio) MACHINE_CONFIG_END +static INTERRUPT_GEN( vblank_irq ) +{ + galaxold_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_DERIVED( harem, galaxold_base ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(harem_cpu1) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, 1620000) //? MCFG_CPU_PROGRAM_MAP(harem_cpu2) @@ -2382,9 +2395,8 @@ MCFG_PALETTE_LENGTH(32) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_PALETTE_INIT(rockclim) MCFG_VIDEO_START(racknrol) @@ -2438,9 +2450,8 @@ MCFG_PALETTE_LENGTH(32) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_PALETTE_INIT(rockclim) MCFG_VIDEO_START(racknrol) @@ -2892,13 +2903,13 @@ ROM_START( harem ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "p0_ic85.bin", 0x0000, 0x2000, CRC(4521b753) SHA1(9033f9c3be8fec1e5ff251e9f60faaf3848a1a1e) ) - ROM_LOAD( "p1_ic87.bin", 0x8000, 0x2000, BAD_DUMP CRC(3cc5d1e8) SHA1(827e2d20de2a00ec016ead249ed3afdccd0c856c) ) + ROM_LOAD( "p1_ic87.bin", 0x8000, 0x2000, BAD_DUMP CRC(3cc5d1e8) SHA1(827e2d20de2a00ec016ead249ed3afdccd0c856c) ) // encrypted? ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "s1_ic12.bin", 0x0000, 0x2000, CRC(b54799dd) SHA1(b6aeb010257cba48a52afd33b4f8031c7d99550c) ) ROM_LOAD( "s2_ic13.bin", 0x2000, 0x1000, CRC(2d5573a4) SHA1(1fdcd99d89e078509634742b2116a35bb199fe4b) ) - ROM_REGION( 0x2000, "unknown", 0 ) + ROM_REGION( 0x2000, "unknown", 0 ) /* TMS-based ROM? */ ROM_LOAD( "a1_ic25.bin", 0x0000, 0x2000, CRC(279f923a) SHA1(166b1b625997766f0de7cc18af52c42268022fcb) ) ROM_REGION( 0x4000, "gfx1", 0 ) diff -Nru mame-0.144/src/mame/drivers/galdrvr.c mame-0.145/src/mame/drivers/galdrvr.c --- mame-0.144/src/mame/drivers/galdrvr.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/galdrvr.c 2012-02-06 21:30:41.000000000 +0000 @@ -4580,7 +4580,7 @@ places in the memory map for moon cresta, (through the fluke 9100) but the game does not currently run. Roms dumped adn verified with no -anomolies. +anomalies. Rom 9 was placed on the through-socket and has pins 20 and 18 (/E and A11 respectively) tied to diff -Nru mame-0.144/src/mame/drivers/galgame.c mame-0.145/src/mame/drivers/galgame.c --- mame-0.144/src/mame/drivers/galgame.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/galgame.c 2012-02-06 21:30:41.000000000 +0000 @@ -160,13 +160,13 @@ * *************************************/ -static SCREEN_UPDATE( galaxygame ) +static SCREEN_UPDATE_IND16( galaxygame ) { - galaxygame_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + galaxygame_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); for (int i = 0; i < state->m_point_display_list_index; i++ ) { - *BITMAP_ADDR16(bitmap, state->m_point_display_list[i].x >> 7, state->m_point_display_list[i].y >> 7) = 1; + bitmap.pix16(state->m_point_display_list[i].x >> 7, state->m_point_display_list[i].y >> 7) = 1; } return 0; } @@ -335,10 +335,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 511) - MCFG_SCREEN_UPDATE(galaxygame) + MCFG_SCREEN_UPDATE_STATIC(galaxygame) MCFG_PALETTE_LENGTH(2) MCFG_PALETTE_INIT(galaxygame) diff -Nru mame-0.144/src/mame/drivers/galivan.c mame-0.145/src/mame/drivers/galivan.c --- mame-0.144/src/mame/drivers/galivan.c 2012-01-13 15:34:38.000000000 +0000 +++ mame-0.145/src/mame/drivers/galivan.c 2012-02-06 21:30:42.000000000 +0000 @@ -455,10 +455,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galivan) + MCFG_SCREEN_UPDATE_STATIC(galivan) MCFG_GFXDECODE(galivan) MCFG_PALETTE_LENGTH(8*16+16*16+256*16) @@ -499,10 +498,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ninjemak) + MCFG_SCREEN_UPDATE_STATIC(ninjemak) MCFG_GFXDECODE(ninjemak) MCFG_PALETTE_LENGTH(8*16+16*16+256*16) @@ -1114,5 +1112,5 @@ GAME( 1986, ninjemak, 0, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) GAME( 1986, youma, ninjemak, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) GAME( 1986, youma2, ninjemak, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan, alt)", GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) -GAME( 1986, youmab, ninjemak, ninjemak, ninjemak, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // scrolling doesn't work -GAME( 1986, youmab2, ninjemak, ninjemak, ninjemak, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // scrolling doesn't work +GAME( 1986, youmab, ninjemak, ninjemak, ninjemak, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // player is invincible +GAME( 1986, youmab2, ninjemak, ninjemak, ninjemak, youmab, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 2)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_UNEMULATED_PROTECTION ) // "" diff -Nru mame-0.144/src/mame/drivers/galpani2.c mame-0.145/src/mame/drivers/galpani2.c --- mame-0.144/src/mame/drivers/galpani2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/galpani2.c 2012-02-06 21:30:39.000000000 +0000 @@ -22,7 +22,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "includes/kaneko16.h" #include "includes/galpani2.h" @@ -554,28 +553,39 @@ /* CPU#1 Interrups , lev 3,4 & 5 are tested on power up. The rest is rte, but lev 6 */ -#define GALPANI2_INTERRUPTS_NUM 4 -static INTERRUPT_GEN( galpani2_interrupt1 ) +static TIMER_DEVICE_CALLBACK( galpani2_interrupt1 ) { - switch ( cpu_getiloops(device) ) + galpani2_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); + + /* MCU related? */ + if(scanline == 128) { - case 3: device_set_input_line(device, 3, HOLD_LINE); break; - case 2: device_set_input_line(device, 4, HOLD_LINE); break; - case 1: device_set_input_line(device, 5, HOLD_LINE); break; // vblank? - case 0: device_set_input_line(device, 6, HOLD_LINE); break; // hblank? + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); // hblank? } -/* CPU#2 Interrups , lev 3,4 & 5 are tested on power up. The rest is rte, but lev 7 */ -#define GALPANI2_INTERRUPTS_NUM2 3 -static INTERRUPT_GEN( galpani2_interrupt2 ) +/* CPU#2 interrupts, lev 3,4 & 5 are tested on power up. The rest is rte, but lev 7 */ +static TIMER_DEVICE_CALLBACK( galpani2_interrupt2 ) { - switch ( cpu_getiloops(device) ) - { - case 2: device_set_input_line(device, 3, HOLD_LINE); break; - case 1: device_set_input_line(device, 4, HOLD_LINE); break; - case 0: device_set_input_line(device, 5, HOLD_LINE); break; - } + galpani2_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_subcpu, 5, HOLD_LINE); + + if(scanline == 128) + device_set_input_line(state->m_subcpu, 4, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_subcpu, 3, HOLD_LINE); } static MACHINE_CONFIG_START( galpani2, galpani2_state ) @@ -583,12 +593,12 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_27MHz/2) /* Confirmed on galpani2i PCB */ MCFG_CPU_PROGRAM_MAP(galpani2_mem1) - MCFG_CPU_VBLANK_INT_HACK(galpani2_interrupt1,GALPANI2_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("m_scantimer", galpani2_interrupt1, "screen", 0, 1) //MCFG_QUANTUM_PERFECT_CPU("maincpu") MCFG_CPU_ADD("sub", M68000, XTAL_27MHz/2) /* Confirmed on galpani2i PCB */ MCFG_CPU_PROGRAM_MAP(galpani2_mem2) - MCFG_CPU_VBLANK_INT_HACK(galpani2_interrupt2,GALPANI2_INTERRUPTS_NUM2) + MCFG_TIMER_ADD_SCANLINE("s_scantimer", galpani2_interrupt2, "screen", 0, 1) MCFG_MACHINE_RESET(galpani2) MCFG_EEPROM_93C46_ADD("eeprom") @@ -597,10 +607,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1-16) - MCFG_SCREEN_UPDATE(galpani2) + MCFG_SCREEN_UPDATE_STATIC(galpani2) MCFG_GFXDECODE(galpani2) MCFG_PALETTE_LENGTH(0x4000 + 0x200 + 0x8000) // sprites, bg8, bg15 diff -Nru mame-0.144/src/mame/drivers/galpani3.c mame-0.145/src/mame/drivers/galpani3.c --- mame-0.144/src/mame/drivers/galpani3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/galpani3.c 2012-02-06 21:30:39.000000000 +0000 @@ -63,7 +63,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/ymz280b.h" #include "includes/kaneko16.h" #include "video/sknsspr.h" @@ -72,7 +71,9 @@ { public: galpani3_state(const machine_config &mconfig, device_type type, const char *tag) - : kaneko16_state(mconfig, type, tag) { } + : kaneko16_state(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16* m_priority_buffer; UINT16* m_framebuffer1; @@ -105,7 +106,7 @@ UINT16 *m_spriteram; UINT32 *m_spriteram32; UINT32 *m_spc_regs; - bitmap_t *m_sprite_bitmap_1; + bitmap_ind16 *m_sprite_bitmap_1; UINT16 *m_mcu_ram; UINT16 m_mcu_com[4]; int m_regs1_i; @@ -115,6 +116,7 @@ UINT16 m_regs2_address_regs[0x20]; UINT16 m_regs3_address_regs[0x20]; + required_device m_maincpu; sknsspr_device* m_spritegen; }; @@ -129,14 +131,19 @@ -static INTERRUPT_GEN( galpani3_vblank ) // 2, 3, 5 ? +static TIMER_DEVICE_CALLBACK( galpani3_vblank ) // 2, 3, 5 ? { - switch ( cpu_getiloops(device) ) - { - case 2: device_set_input_line(device, 2, HOLD_LINE); break; - case 1: device_set_input_line(device, 3, HOLD_LINE); break; - case 0: device_set_input_line(device, 5, HOLD_LINE); break; // sound? - } + galpani3_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + + if(scanline == 128) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); // timer, related to sound chip? } @@ -148,7 +155,7 @@ machine.generic.spriteram_size = 0x4000; state->m_spc_regs = auto_alloc_array(machine, UINT32, 0x40/4); - state->m_sprite_bitmap_1 = auto_bitmap_alloc(machine,1024,1024,BITMAP_FORMAT_INDEXED16); + state->m_sprite_bitmap_1 = auto_bitmap_ind16_alloc(machine,1024,1024); state->m_spritegen = machine.device("spritegen"); state->m_spritegen->skns_sprite_kludge(0,0); @@ -194,16 +201,16 @@ } -static SCREEN_UPDATE(galpani3) +static SCREEN_UPDATE_RGB32(galpani3) { - galpani3_state *state = screen->machine().driver_data(); + galpani3_state *state = screen.machine().driver_data(); int x,y; UINT16* src1; UINT32* dst; UINT16 pixdata1; - const pen_t *paldata = screen->machine().pens; + const pen_t *paldata = screen.machine().pens; - bitmap_fill(bitmap, cliprect, 0x0000); + bitmap.fill(0x0000, cliprect); { int drawy, drawx; @@ -229,7 +236,7 @@ UINT8 pridat = state->m_priority_buffer[(priline*0x200)+prioffs]; - UINT32* dst = BITMAP_ADDR32(bitmap, drawy, drawx); + UINT32* dst = &bitmap.pix32(drawy, drawx); @@ -261,7 +268,7 @@ UINT16 pen = dat1+0x4000; UINT32 pal = paldata[pen]; - if (gp3_is_alpha_pen(screen->machine(), pen)) + if (gp3_is_alpha_pen(screen.machine(), pen)) { int r,g,b; r = (pal & 0x00ff0000)>>16; @@ -289,7 +296,7 @@ UINT16 pen = dat2+0x4100; UINT32 pal = paldata[pen]; - if (gp3_is_alpha_pen(screen->machine(), pen)) + if (gp3_is_alpha_pen(screen.machine(), pen)) { int r,g,b; r = (pal & 0x00ff0000)>>16; @@ -321,20 +328,20 @@ /* else if (pridat==0x2f) // area outside of the girl { - //dst[0] = screen->machine().rand()&0x3fff; + //dst[0] = screen.machine().rand()&0x3fff; } else if (pridat==0x00) // the initial line / box that gets drawn { - //dst[0] = screen->machine().rand()&0x3fff; + //dst[0] = screen.machine().rand()&0x3fff; } else if (pridat==0x30) // during the 'gals boxes' on the intro { - //dst[0] = screen->machine().rand()&0x3fff; + //dst[0] = screen.machine().rand()&0x3fff; } else if (pridat==0x0c) // 'nice' at end of level { - //dst[0] = screen->machine().rand()&0x3fff; + //dst[0] = screen.machine().rand()&0x3fff; } else { @@ -345,15 +352,15 @@ } } - bitmap_fill(state->m_sprite_bitmap_1, cliprect, 0x0000); + state->m_sprite_bitmap_1->fill(0x0000, cliprect); - state->m_spritegen->skns_draw_sprites(screen->machine(), state->m_sprite_bitmap_1, cliprect, state->m_spriteram32, screen->machine().generic.spriteram_size, screen->machine().region("gfx1")->base(), screen->machine().region ("gfx1")->bytes(), state->m_spc_regs ); + state->m_spritegen->skns_draw_sprites(screen.machine(), *state->m_sprite_bitmap_1, cliprect, state->m_spriteram32, screen.machine().generic.spriteram_size, screen.machine().region("gfx1")->base(), screen.machine().region ("gfx1")->bytes(), state->m_spc_regs ); // ignoring priority bits for now.. for (y=0;y<240;y++) { - src1 = BITMAP_ADDR16(state->m_sprite_bitmap_1, y, 0); - dst = BITMAP_ADDR32(bitmap, y, 0); + src1 = &state->m_sprite_bitmap_1->pix16(y); + dst = &bitmap.pix32(y); for (x=0;x<320;x++) { @@ -946,19 +953,17 @@ }; static MACHINE_CONFIG_START( galpani3, galpani3_state ) - MCFG_CPU_ADD("maincpu", M68000, 16000000) // ? (from which clock?) + MCFG_CPU_ADD("maincpu", M68000, XTAL_28_63636MHz/2) // Confirmed from PCB MCFG_CPU_PROGRAM_MAP(galpani3_map) - MCFG_CPU_VBLANK_INT_HACK(galpani3_vblank, 3) - + MCFG_TIMER_ADD_SCANLINE("scantimer", galpani3_vblank, "screen", 0, 1) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) //MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 64*8-1) - MCFG_SCREEN_UPDATE(galpani3) + MCFG_SCREEN_UPDATE_STATIC(galpani3) MCFG_PALETTE_LENGTH(0x4303) @@ -969,14 +974,38 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ymz", YMZ280B, 28636400 / 2) + MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_33_333MHz / 2) // Confirmed from PCB MCFG_SOUND_CONFIG(ymz280b_intf) MCFG_SOUND_ROUTE(0, "mono", 1.0) MCFG_SOUND_ROUTE(1, "mono", 1.0) MACHINE_CONFIG_END -ROM_START( galpani3 ) +ROM_START( galpani3 ) /* All game text in English */ + ROM_REGION( 0x180000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "g3p0e0.u71", 0x000000, 0x080000, CRC(fa681118) SHA1(982b568a77ed620ba5708fec4c186d329d48cb48) ) + ROM_LOAD16_BYTE( "g3p1j1.u102", 0x000001, 0x080000, CRC(f1150f1b) SHA1(a6fb719937927a9a39c7a4888017c63c47c2dd6c) ) /* Is it really G3P1J1 like below or G3P1J0?? */ + + ROM_REGION( 0x200000, "gfx1", 0 ) /* Sprites - RLE encoded */ + ROM_LOAD( "gp320000.1", 0x000000, 0x200000, CRC(a0112827) SHA1(0a6c78d71b75a1d78215aab3104176aa1769b14f) ) + + ROM_REGION( 0x1000000, "gfx2", 0 ) /* Backgrounds - RLE encoded */ + ROM_LOAD( "gp340000.123", 0x000000, 0x200000, CRC(a58a26b1) SHA1(832d70cce1b4f04fa50fc221962ff6cc4287cb92) ) // 19950414GROMACap + ROM_LOAD( "gp340100.122", 0x200000, 0x200000, CRC(746fe4a8) SHA1(a5126ae9e83d556277d31b166296a708c311a902) ) // 19950414GROMBCap + ROM_LOAD( "gp340200.121", 0x400000, 0x200000, CRC(e9bc15c8) SHA1(2c6a10e768709d1937d9206970553f4101ce9016) ) // 19950414GROMCCap + ROM_LOAD( "gp340300.120", 0x600000, 0x200000, CRC(59062eef) SHA1(936977c20d83540c1e0f65d429c7ebea201ef991) ) // 19950414GROMDCap + ROM_LOAD16_BYTE( "g3g0j0.101", 0xe00000, 0x040000, CRC(fbb1e0dc) SHA1(14f6377afd93054aa5dc38af235ae12b932e847f) ) // 19950523GROMECap + ROM_LOAD16_BYTE( "g3g1j0.100", 0xe00001, 0x040000, CRC(18edb5f0) SHA1(5e2ed0105b3e6037f6116494d3b186a368824171) ) // + + ROM_REGION( 0x300000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "gp310100.40", 0x000000, 0x200000, CRC(6a0b1d12) SHA1(11fed80b96d07fddb27599743991c58c12c048e0) ) + ROM_LOAD( "gp310000.41", 0x200000, 0x100000, CRC(641062ef) SHA1(c8902fc46319eac94b3f95d18afa24bd895078d6) ) + + ROM_REGION( 0x20000, "mcudata", 0 ) /* MCU Code? */ + ROM_LOAD16_WORD_SWAP( "g3d0x0.134", 0x000000, 0x020000, CRC(4ace10f9) SHA1(d19e4540d535ce10d23cb0844be03a3239b3402e) ) +ROM_END + +ROM_START( galpani3j ) /* Some game text in Japanese, but no "For use in Japan" type region notice */ ROM_REGION( 0x180000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "g3p0j1.71", 0x000000, 0x080000, CRC(52893326) SHA1(78fdbf3436a4ba754d7608fedbbede5c719a4505) ) ROM_LOAD16_BYTE( "g3p1j1.102", 0x000001, 0x080000, CRC(05f935b4) SHA1(81e78875585bcdadad1c302614b2708e60563662) ) @@ -1009,4 +1038,5 @@ memset(state->m_mcu_com, 0, 4 * sizeof( UINT16) ); } -GAME( 1995, galpani3, 0, galpani3, galpani3, galpani3, ROT90, "Kaneko", "Gals Panic 3", GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, galpani3, 0, galpani3, galpani3, galpani3, ROT90, "Kaneko", "Gals Panic 3 (Euro)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1995, galpani3j, galpani3, galpani3, galpani3, galpani3, ROT90, "Kaneko", "Gals Panic 3 (Japan)", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/galpanic.c mame-0.145/src/mame/drivers/galpanic.c --- mame-0.144/src/mame/drivers/galpanic.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/galpanic.c 2012-02-06 21:30:39.000000000 +0000 @@ -125,10 +125,14 @@ #include "includes/galpanic.h" #include "includes/galpnipt.h" -static SCREEN_EOF( galpanic ) +static SCREEN_VBLANK( galpanic ) { - device_t *pandora = machine.device("pandora"); - pandora_eof(pandora); + // rising edge + if (vblank_on) + { + device_t *pandora = screen.machine().device("pandora"); + pandora_eof(pandora); + } } static TIMER_DEVICE_CALLBACK( galpanic_scanline ) @@ -574,11 +578,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) - MCFG_SCREEN_UPDATE(galpanic) - MCFG_SCREEN_EOF( galpanic ) + MCFG_SCREEN_UPDATE_STATIC(galpanic) + MCFG_SCREEN_VBLANK_STATIC( galpanic ) MCFG_GFXDECODE(galpanic) MCFG_PALETTE_LENGTH(1024 + 32768) @@ -615,8 +618,8 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(comad) - MCFG_SCREEN_EOF(0) + MCFG_SCREEN_UPDATE_STATIC(comad) + MCFG_SCREEN_VBLANK_NONE() MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( supmodel, comad ) @@ -629,8 +632,8 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(comad) - MCFG_SCREEN_EOF(0) + MCFG_SCREEN_UPDATE_STATIC(comad) + MCFG_SCREEN_VBLANK_NONE() /* sound hardware */ MCFG_OKIM6295_REPLACE("oki", 1584000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified @@ -647,8 +650,8 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(comad) - MCFG_SCREEN_EOF(0) + MCFG_SCREEN_UPDATE_STATIC(comad) + MCFG_SCREEN_VBLANK_NONE() MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( galhustl, comad ) @@ -662,8 +665,8 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(comad) - MCFG_SCREEN_EOF(0) + MCFG_SCREEN_UPDATE_STATIC(comad) + MCFG_SCREEN_VBLANK_NONE() /* sound hardware */ MCFG_OKIM6295_REPLACE("oki", 1056000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified @@ -681,7 +684,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(comad) + MCFG_SCREEN_UPDATE_STATIC(comad) /* sound hardware */ MCFG_OKIM6295_REPLACE("oki", 1056000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified diff -Nru mame-0.144/src/mame/drivers/galspnbl.c mame-0.145/src/mame/drivers/galspnbl.c --- mame-0.144/src/mame/drivers/galspnbl.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/galspnbl.c 2012-02-06 21:30:36.000000000 +0000 @@ -226,10 +226,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1) - MCFG_SCREEN_UPDATE(galspnbl) + MCFG_SCREEN_UPDATE_STATIC(galspnbl) MCFG_GFXDECODE(galspnbl) MCFG_PALETTE_LENGTH(1024 + 32768) diff -Nru mame-0.144/src/mame/drivers/gamecstl.c mame-0.145/src/mame/drivers/gamecstl.c --- mame-0.144/src/mame/drivers/gamecstl.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gamecstl.c 2012-02-06 21:30:40.000000000 +0000 @@ -3,6 +3,9 @@ Skeleton driver by R. Belmont, based on taitowlf.c by Ville Linde + Note: + - bp 000F16B5 do bx=0x16bb (can't skip this check?) + Specs: P3-866, SiS 630 graphics card, SiS 7018 sound, Windows 98, DirectX 8.1. Input is via a custom COM1 port JAMMA adaptor. @@ -114,7 +117,7 @@ palette_set_color(machine, i, cga_palette[i]); } -static void draw_char(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int ch, int att, int x, int y) +static void draw_char(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx, int ch, int att, int x, int y) { int i,j; const UINT8 *dp; @@ -123,7 +126,7 @@ for (j=y; j < y+8; j++) { - UINT16 *p = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *p = &bitmap.pix16(j); for (i=x; i < x+8; i++) { @@ -136,15 +139,15 @@ } } -static SCREEN_UPDATE(gamecstl) +static SCREEN_UPDATE_IND16(gamecstl) { - gamecstl_state *state = screen->machine().driver_data(); + gamecstl_state *state = screen.machine().driver_data(); int i, j; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; UINT32 *cga = state->m_cga_ram; int index = 0; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (j=0; j < 25; j++) { @@ -190,15 +193,14 @@ static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) { gamecstl_state *state = busdevice->machine().driver_data(); -// mame_printf_debug("MXTC: read %d, %02X\n", function, reg); - + printf("MXTC: read %d, %02X\n", function, reg); return state->m_mxtc_config_reg[reg]; } static void mxtc_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) { gamecstl_state *state = busdevice->machine().driver_data(); -// mame_printf_debug("%s:MXTC: write %d, %02X, %02X\n", busdevice->machine().describe_context(), function, reg, data); + printf("%s:MXTC: write %d, %02X, %02X\n", busdevice->machine().describe_context(), function, reg, data); switch(reg) { @@ -210,7 +212,7 @@ } else // disable RAM access (reads go to BIOS ROM) { - memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("user1")->base() + 0x30000); + memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("bios")->base() + 0x30000); } break; } @@ -277,14 +279,14 @@ static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) { gamecstl_state *state = busdevice->machine().driver_data(); -// mame_printf_debug("PIIX4: read %d, %02X\n", function, reg); + printf("PIIX4: read %d, %02X\n", function, reg); return state->m_piix4_config_reg[function][reg]; } static void piix4_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) { gamecstl_state *state = busdevice->machine().driver_data(); -// mame_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", busdevice->machine().describe_context(), function, reg, data); + printf("%s:PIIX4: write %d, %02X, %02X\n", busdevice->machine().describe_context(), function, reg, data); state->m_piix4_config_reg[function][reg] = data; } @@ -520,7 +522,7 @@ AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bank1") AM_RANGE(0x000f0000, 0x000fffff) AM_WRITE(bios_ram_w) AM_RANGE(0x00100000, 0x01ffffff) AM_RAM - AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("user1", 0) /* System BIOS */ + AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END static ADDRESS_MAP_START(gamecstl_io, AS_IO, 32) @@ -533,6 +535,7 @@ AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) AM_RANGE(0x00e8, 0x00eb) AM_NOP + AM_RANGE(0x00ec, 0x00ef) AM_NOP AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE("ide", ide_r, ide_w) AM_RANGE(0x0300, 0x03af) AM_NOP AM_RANGE(0x03b0, 0x03df) AM_NOP @@ -618,7 +621,7 @@ static MACHINE_RESET(gamecstl) { - memory_set_bankptr(machine, "bank1", machine.region("user1")->base() + 0x30000); + memory_set_bankptr(machine, "bank1", machine.region("bios")->base() + 0x30000); device_set_irq_callback(machine.device("maincpu"), irq_callback); } @@ -716,10 +719,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(gamecstl) + MCFG_SCREEN_UPDATE_STATIC(gamecstl) MCFG_GFXDECODE(CGA) MCFG_PALETTE_LENGTH(16) @@ -753,7 +755,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, gamecstl_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, gamecstl_get_out2 }; static void gamecstl_set_keyb_int(running_machine &machine, int state) @@ -778,22 +780,22 @@ // not the correct BIOS, f205v owes me a dump of it... ROM_START(gamecstl) - ROM_REGION32_LE(0x40000, "user1", 0) - ROM_LOAD( "bios.bin", 0x000000, 0x040000, CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) ) + ROM_REGION32_LE(0x40000, "bios", 0) + ROM_LOAD( "bios.bin", 0x000000, 0x040000, BAD_DUMP CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) ) ROM_REGION(0x08100, "gfx1", 0) - ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) + ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) DISK_REGION( "ide" ) DISK_IMAGE( "gamecstl", 0, SHA1(b431af3c42c48ba07972d77a3d24e60ee1e4359e) ) ROM_END ROM_START(gamecst2) - ROM_REGION32_LE(0x40000, "user1", 0) - ROM_LOAD( "bios.bin", 0x000000, 0x040000, CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) ) + ROM_REGION32_LE(0x40000, "bios", 0) + ROM_LOAD( "bios.bin", 0x000000, 0x040000, BAD_DUMP CRC(27834ce9) SHA1(134c546dd75138c6f4bc5729b40e20e118454df9) ) ROM_REGION(0x08100, "gfx1", 0) - ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) + ROM_LOAD("cga.chr", 0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) DISK_REGION( "ide" ) DISK_IMAGE( "gamecst2", 0, SHA1(14e1b311cb474801c7bdda3164a0c220fb102159) ) diff -Nru mame-0.144/src/mame/drivers/gamtor.c mame-0.145/src/mame/drivers/gamtor.c --- mame-0.144/src/mame/drivers/gamtor.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gamtor.c 2012-02-06 21:30:41.000000000 +0000 @@ -26,6 +26,7 @@ #include "emu.h" #include "cpu/m68000/m68000.h" +#include "video/ramdac.h" class gaminator_state : public driver_device { @@ -72,39 +73,6 @@ } -static WRITE8_HANDLER( gamtor_ramdac_w ) -{ - gaminator_state *state = space->machine().driver_data(); - switch(offset) - { - case 3: - state->m_pal.offs = data; - state->m_pal.offs_internal = 0; - break; - case 2: - switch(state->m_pal.offs_internal) - { - case 0: - state->m_pal.r = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 1: - state->m_pal.g = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 2: - state->m_pal.b = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - palette_set_color(space->machine(), state->m_pal.offs, MAKE_RGB(state->m_pal.r, state->m_pal.g, state->m_pal.b)); - state->m_pal.offs_internal = 0; - state->m_pal.offs++; - state->m_pal.offs&=0xff; - break; - } - - break; - } -} - static WRITE32_HANDLER( gamtor_unk6_w ) { @@ -146,19 +114,19 @@ } -SCREEN_UPDATE(gamtor) +SCREEN_UPDATE_IND16(gamtor) { - gaminator_state *state = screen->machine().driver_data(); + gaminator_state *state = screen.machine().driver_data(); int tile_base = 0x00000; // where does the base address come from? - if (!strcmp(screen->machine().system().name,"g4u5")) tile_base = 0x31BE4 - 2; - if (!strcmp(screen->machine().system().name,"llcharm")) tile_base = 0x2f58d - 2; + if (!strcmp(screen.machine().system().name,"g4u5")) tile_base = 0x31BE4 - 2; + if (!strcmp(screen.machine().system().name,"llcharm")) tile_base = 0x2f58d - 2; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0; for (int y=0;y<32;y++) { @@ -192,10 +160,12 @@ AM_RANGE(0x20000000, 0x2003ffff) AM_RAM - /* some kind of video control / blitter? */ + /* These are definitely VGA/SVGA ports, for example 0x3d4-0x3d5 = CRTC */ AM_RANGE(0x400003c0, 0x400003c3) AM_WRITE( gamtor_unk3_w ) AM_RANGE(0x400003c4, 0x400003c7) AM_READWRITE( gamtor_unk4_r, gamtor_unk4_w ) - AM_RANGE(0x400003c8, 0x400003cb) AM_WRITE8( gamtor_ramdac_w, 0xffffffff ) + AM_RANGE(0x400003c8, 0x400003cb) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, index_w, 0x000000ff) + AM_RANGE(0x400003c8, 0x400003cb) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, pal_w, 0x0000ff00) +// AM_RANGE(0x400003c8, 0x400003cb) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, mask_w, 0x00ff0000) AM_RANGE(0x400003cc, 0x400003cf) AM_WRITE( gamtor_unk6_w ) AM_RANGE(0x400003d4, 0x400003d7) AM_READWRITE( gamtor_unk2_r, gamtor_unk2_w ) AM_RANGE(0x400003d8, 0x400003fb) AM_READ( gamtor_unk7_r ) @@ -213,6 +183,15 @@ +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE_MODERN("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 0 +}; + static MACHINE_CONFIG_START( gaminator, gaminator_state ) MCFG_CPU_ADD("maincpu", MCF5206E, 40000000) /* definitely Coldfire, model / clock uncertain */ MCFG_CPU_PROGRAM_MAP(gaminator_map) @@ -222,13 +201,14 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(gamtor) + MCFG_SCREEN_UPDATE_STATIC(gamtor) MCFG_PALETTE_LENGTH(0x100) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) + MCFG_VIDEO_START(gamtor) @@ -1415,241 +1395,241 @@ +#define GAME_FLAGS GAME_NOT_WORKING|GAME_NO_SOUND +GAME( 2002?, g4u2 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 2 (94 5.6-0)", GAME_FLAGS ) -GAME( 2002?, g4u2 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 2 (94 5.6-0)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, g4u3 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 3 (94 5.6-4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, g4u3a ,g4u3, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 3 (94 5.6-5)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, g4u4 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 4 (94 5.6-5)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002?, g4u3 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 3 (94 5.6-4)", GAME_FLAGS ) +GAME( 2002?, g4u3a ,g4u3, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 3 (94 5.6-5)", GAME_FLAGS ) -GAME( 2002?, g4u5 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 5 (94 5.6-5)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002?, g4u4 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 4 (94 5.6-5)", GAME_FLAGS ) -GAME( 2002?, g4u6 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 6 (94 5.6-5)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, g4u7 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 7 (94 5.6-5a)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt1 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt1a ,gamt1, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt1b ,gamt1, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt1lotc ,gamt1, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 1 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt1ent ,gamt1, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 1 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt4 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4a ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4b ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4c ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4d ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4e ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4f ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4g ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4h ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4i ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4j ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt4lotc ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4lotca ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (C-Loto, MK4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4lotm ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Lotomatic)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4hmult ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4ent ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4dbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4fbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4hbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt4ibag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt5 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 5 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt6 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6a ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6b ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6c ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6d ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6e ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6f ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt6lotc ,gamt6, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 6 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt6ent ,gamt6, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 6 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt7 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7a ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7b ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7c ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7d ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7e ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7f ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7g ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt7h ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt8 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt8a ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt8b ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt8c ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt8d ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt8lotc ,gamt8, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 8 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt9 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 9 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt9a ,gamt9, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 9 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt9lotc ,gamt9, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 9 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt10 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10a ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10b ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10c ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10d ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10e ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10f ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10g ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10h ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10i ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10j ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10k ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10l ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 13)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10m ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 14)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10n ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 15)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10o ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 16)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt10lotc ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10lotm ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Lotomatic)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10gmult,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10ent ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt10bag ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Bag)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt11 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt11a ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt11b ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt11c ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt11bmult,gamt11, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 11 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt12 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt12a ,gamt12, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt12b ,gamt12, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt16 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16a ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16b ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16c ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16d ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16e ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16f ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16g ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 8)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16h ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 9)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16i ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 10)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16j ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 11)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16k ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 12)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt16lotc ,gamt16, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 16 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt16fmult,gamt16, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 16 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt17 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt17a ,gamt17, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt17b ,gamt17, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt18 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18a ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18b ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18c ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18d ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt18lotc ,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18bmult,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt18ent ,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt19 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 19 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt19a ,gamt19, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 19 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt19lotc ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt19mult ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt19ent ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt20 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt20a ,gamt20, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt20b ,gamt20, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt20lotc ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, C-Loto)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt20lotm ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, Lotomatic)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt20ent ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, Ent)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt21 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 21 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt21a ,gamt21, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 21 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt21amult,gamt21, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 21 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt22 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt22a ,gamt22, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt22b ,gamt22, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt22amult,gamt22, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 22 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, gamt23 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt23a ,gamt23, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt23b ,gamt23, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt29 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 29 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, gamt29a ,gamt29, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 29 (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt30 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 30 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt31 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 31 (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, gamt31mult ,gamt31, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 31 (bootleg, Multiloto)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 2002?, megakat ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Mega Katok 2", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, hspot2 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Hot Spot 2", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, hspot3 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Hot Spot 3", GAME_NOT_WORKING|GAME_NO_SOUND ) - - -GAME( 2002?, ancienta ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, ancientaa ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, ancientab ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, ancientac ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, ancientad ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bananas ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bananas Go Bahamas (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bananasa ,bananas, gaminator, gaminator, gaminator, ROT0, "Novotech","Bananas Go Bahamas (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebop ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebopa ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebopb ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebopc ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebopd ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beebope ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beetlem ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beetlema ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beetlemb ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beetlemc ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, beetlemd ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bungeem ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bungee Monkey (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bungeema ,bungeem, gaminator, gaminator, gaminator, ROT0, "Novotech","Bungee Monkey (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bookra ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Book Of Ra (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, bsplash ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Banana Splash (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, chillicc ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Chilli Con Cash (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbus ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbusa ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbusb ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbusc ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbusd ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbuse ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 6)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, columbusf ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 7)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, ditrio ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Diamond Trio (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, dolphinp ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Dolphin's Pearl (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, eurogame ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","The Euro Game (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, eurogamea ,eurogame, gaminator, gaminator, gaminator, ROT0, "Novotech","The Euro Game (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, firstcl ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","First Class Traveller (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, llcharm ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Lucky Lady's Charm (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2002?, llcharma ,llcharm, gaminator, gaminator, gaminator, ROT0, "Novotech","Lucky Lady's Charm (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002?, g4u5 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 5 (94 5.6-5)", GAME_FLAGS ) + +GAME( 2002?, g4u6 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 6 (94 5.6-5)", GAME_FLAGS ) + +GAME( 2002?, g4u7 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Games 4 U 7 (94 5.6-5a)", GAME_FLAGS ) + + +GAME( 2002?, gamt1 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt1a ,gamt1, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt1b ,gamt1, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 1 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt1lotc ,gamt1, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 1 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt1ent ,gamt1, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 1 (bootleg, Ent)", GAME_FLAGS ) + + +GAME( 2002?, gamt4 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt4a ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt4b ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt4c ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt4d ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 5)", GAME_FLAGS ) +GAME( 2002?, gamt4e ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 6)", GAME_FLAGS ) +GAME( 2002?, gamt4f ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 7)", GAME_FLAGS ) +GAME( 2002?, gamt4g ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 8)", GAME_FLAGS ) +GAME( 2002?, gamt4h ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 9)", GAME_FLAGS ) +GAME( 2002?, gamt4i ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 10)", GAME_FLAGS ) +GAME( 2002?, gamt4j ,gamt4, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 4 (set 11)", GAME_FLAGS ) + +GAME( 2002?, gamt4lotc ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt4lotca ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (C-Loto, MK4)", GAME_FLAGS ) +GAME( 2002?, gamt4lotm ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Lotomatic)", GAME_FLAGS ) +GAME( 2002?, gamt4hmult ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Multiloto)", GAME_FLAGS ) +GAME( 2002?, gamt4ent ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Ent)", GAME_FLAGS ) +GAME( 2002?, gamt4dbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 1)", GAME_FLAGS ) +GAME( 2002?, gamt4fbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 2)", GAME_FLAGS ) +GAME( 2002?, gamt4hbag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 3)", GAME_FLAGS ) +GAME( 2002?, gamt4ibag ,gamt4, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 4 (bootleg, Bag, set 4)", GAME_FLAGS ) + + +GAME( 2002?, gamt5 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 5 (set 1)", GAME_FLAGS ) + +GAME( 2002?, gamt6 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt6a ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt6b ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt6c ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt6d ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 5)", GAME_FLAGS ) +GAME( 2002?, gamt6e ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 6)", GAME_FLAGS ) +GAME( 2002?, gamt6f ,gamt6, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 6 (set 7)", GAME_FLAGS ) + +GAME( 2002?, gamt6lotc ,gamt6, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 6 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt6ent ,gamt6, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 6 (bootleg, Ent)", GAME_FLAGS ) + + +GAME( 2002?, gamt7 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt7a ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt7b ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt7c ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt7d ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 5)", GAME_FLAGS ) +GAME( 2002?, gamt7e ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 6)", GAME_FLAGS ) +GAME( 2002?, gamt7f ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 7)", GAME_FLAGS ) +GAME( 2002?, gamt7g ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 8)", GAME_FLAGS ) +GAME( 2002?, gamt7h ,gamt7, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 7 (set 9)", GAME_FLAGS ) + +GAME( 2002?, gamt8 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt8a ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt8b ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt8c ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt8d ,gamt8, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 8 (set 5)", GAME_FLAGS ) + +GAME( 2002?, gamt8lotc ,gamt8, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 8 (bootleg, C-Loto)", GAME_FLAGS ) + + +GAME( 2002?, gamt9 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 9 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt9a ,gamt9, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 9 (set 2)", GAME_FLAGS ) + +GAME( 2002?, gamt9lotc ,gamt9, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 9 (bootleg, C-Loto)", GAME_FLAGS ) + + +GAME( 2002?, gamt10 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt10a ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt10b ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt10c ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt10d ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 5)", GAME_FLAGS ) +GAME( 2002?, gamt10e ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 6)", GAME_FLAGS ) +GAME( 2002?, gamt10f ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 7)", GAME_FLAGS ) +GAME( 2002?, gamt10g ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 8)", GAME_FLAGS ) +GAME( 2002?, gamt10h ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 9)", GAME_FLAGS ) +GAME( 2002?, gamt10i ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 10)", GAME_FLAGS ) +GAME( 2002?, gamt10j ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 11)", GAME_FLAGS ) +GAME( 2002?, gamt10k ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 12)", GAME_FLAGS ) +GAME( 2002?, gamt10l ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 13)", GAME_FLAGS ) +GAME( 2002?, gamt10m ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 14)", GAME_FLAGS ) +GAME( 2002?, gamt10n ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 15)", GAME_FLAGS ) +GAME( 2002?, gamt10o ,gamt10, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 10 (set 16)", GAME_FLAGS ) + +GAME( 2002?, gamt10lotc ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt10lotm ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Lotomatic)", GAME_FLAGS ) +GAME( 2002?, gamt10gmult,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Multiloto)", GAME_FLAGS ) +GAME( 2002?, gamt10ent ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Ent)", GAME_FLAGS ) +GAME( 2002?, gamt10bag ,gamt10, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 10 (bootleg, Bag)", GAME_FLAGS ) + +GAME( 2002?, gamt11 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt11a ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt11b ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt11c ,gamt11, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 11 (set 4)", GAME_FLAGS ) + +GAME( 2002?, gamt11bmult,gamt11, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 11 (bootleg, Multiloto)", GAME_FLAGS ) + + +GAME( 2002?, gamt12 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt12a ,gamt12, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt12b ,gamt12, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 12 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt16 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt16a ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt16b ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt16c ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt16d ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 5)", GAME_FLAGS ) +GAME( 2002?, gamt16e ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 6)", GAME_FLAGS ) +GAME( 2002?, gamt16f ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 7)", GAME_FLAGS ) +GAME( 2002?, gamt16g ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 8)", GAME_FLAGS ) +GAME( 2002?, gamt16h ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 9)", GAME_FLAGS ) +GAME( 2002?, gamt16i ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 10)", GAME_FLAGS ) +GAME( 2002?, gamt16j ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 11)", GAME_FLAGS ) +GAME( 2002?, gamt16k ,gamt16, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 16 (set 12)", GAME_FLAGS ) + +GAME( 2002?, gamt16lotc ,gamt16, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 16 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt16fmult,gamt16, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 16 (bootleg, Multiloto)", GAME_FLAGS ) + + +GAME( 2002?, gamt17 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt17a ,gamt17, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt17b ,gamt17, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 17 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt18 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt18a ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt18b ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 3)", GAME_FLAGS ) +GAME( 2002?, gamt18c ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 4)", GAME_FLAGS ) +GAME( 2002?, gamt18d ,gamt18, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 18 (set 5)", GAME_FLAGS ) + +GAME( 2002?, gamt18lotc ,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt18bmult,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, Multiloto)", GAME_FLAGS ) +GAME( 2002?, gamt18ent ,gamt18, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 18 (bootleg, Ent)", GAME_FLAGS ) + + +GAME( 2002?, gamt19 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 19 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt19a ,gamt19, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 19 (set 2)", GAME_FLAGS ) + +GAME( 2002?, gamt19lotc ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt19mult ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, Multiloto)", GAME_FLAGS ) +GAME( 2002?, gamt19ent ,gamt19, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 19 (bootleg, Ent)", GAME_FLAGS ) + + +GAME( 2002?, gamt20 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt20a ,gamt20, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt20b ,gamt20, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 20 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt20lotc ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, C-Loto)", GAME_FLAGS ) +GAME( 2002?, gamt20lotm ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, Lotomatic)", GAME_FLAGS ) +GAME( 2002?, gamt20ent ,gamt20, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 20 (bootleg, Ent)", GAME_FLAGS ) + + +GAME( 2002?, gamt21 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 21 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt21a ,gamt21, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 21 (set 2)", GAME_FLAGS ) + +GAME( 2002?, gamt21amult,gamt21, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 21 (bootleg, Multiloto)", GAME_FLAGS ) + +GAME( 2002?, gamt22 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt22a ,gamt22, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt22b ,gamt22, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 22 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt22amult,gamt22, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 22 (bootleg, Multiloto)", GAME_FLAGS ) + + +GAME( 2002?, gamt23 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt23a ,gamt23, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 2)", GAME_FLAGS ) +GAME( 2002?, gamt23b ,gamt23, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 23 (set 3)", GAME_FLAGS ) + +GAME( 2002?, gamt29 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 29 (set 1)", GAME_FLAGS ) +GAME( 2002?, gamt29a ,gamt29, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 29 (set 2)", GAME_FLAGS ) + +GAME( 2002?, gamt30 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 30 (set 1)", GAME_FLAGS ) + +GAME( 2002?, gamt31 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Gaminator 31 (set 1)", GAME_FLAGS ) + +GAME( 2002?, gamt31mult ,gamt31, gaminator, gaminator, gaminator, ROT0, "bootleg","Gaminator 31 (bootleg, Multiloto)", GAME_FLAGS ) + +GAME( 2002?, megakat ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Mega Katok 2", GAME_FLAGS ) +GAME( 2002?, hspot2 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Hot Spot 2", GAME_FLAGS ) +GAME( 2002?, hspot3 ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Hot Spot 3", GAME_FLAGS ) + + +GAME( 2002?, ancienta ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 1)", GAME_FLAGS ) +GAME( 2002?, ancientaa ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 2)", GAME_FLAGS ) +GAME( 2002?, ancientab ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 3)", GAME_FLAGS ) +GAME( 2002?, ancientac ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 4)", GAME_FLAGS ) +GAME( 2002?, ancientad ,ancienta, gaminator, gaminator, gaminator, ROT0, "Novotech","Ancient Atlantis (set 5)", GAME_FLAGS ) +GAME( 2002?, bananas ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bananas Go Bahamas (set 1)", GAME_FLAGS ) +GAME( 2002?, bananasa ,bananas, gaminator, gaminator, gaminator, ROT0, "Novotech","Bananas Go Bahamas (set 2)", GAME_FLAGS ) +GAME( 2002?, beebop ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 1)", GAME_FLAGS ) +GAME( 2002?, beebopa ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 2)", GAME_FLAGS ) +GAME( 2002?, beebopb ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 3)", GAME_FLAGS ) +GAME( 2002?, beebopc ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 4)", GAME_FLAGS ) +GAME( 2002?, beebopd ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 5)", GAME_FLAGS ) +GAME( 2002?, beebope ,beebop, gaminator, gaminator, gaminator, ROT0, "Novotech","Bee Bop (set 6)", GAME_FLAGS ) +GAME( 2002?, beetlem ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 1)", GAME_FLAGS ) +GAME( 2002?, beetlema ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 2)", GAME_FLAGS ) +GAME( 2002?, beetlemb ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 3)", GAME_FLAGS ) +GAME( 2002?, beetlemc ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 4)", GAME_FLAGS ) +GAME( 2002?, beetlemd ,beetlem, gaminator, gaminator, gaminator, ROT0, "Novotech","Beetlemania (set 5)", GAME_FLAGS ) +GAME( 2002?, bungeem ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Bungee Monkey (set 1)", GAME_FLAGS ) +GAME( 2002?, bungeema ,bungeem, gaminator, gaminator, gaminator, ROT0, "Novotech","Bungee Monkey (set 2)", GAME_FLAGS ) +GAME( 2002?, bookra ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Book Of Ra (set 1)", GAME_FLAGS ) +GAME( 2002?, bsplash ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Banana Splash (set 1)", GAME_FLAGS ) +GAME( 2002?, chillicc ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Chilli Con Cash (set 1)", GAME_FLAGS ) +GAME( 2002?, columbus ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 1)", GAME_FLAGS ) +GAME( 2002?, columbusa ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 2)", GAME_FLAGS ) +GAME( 2002?, columbusb ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 3)", GAME_FLAGS ) +GAME( 2002?, columbusc ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 4)", GAME_FLAGS ) +GAME( 2002?, columbusd ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 5)", GAME_FLAGS ) +GAME( 2002?, columbuse ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 6)", GAME_FLAGS ) +GAME( 2002?, columbusf ,columbus, gaminator, gaminator, gaminator, ROT0, "Novotech","Columbus (set 7)", GAME_FLAGS ) +GAME( 2002?, ditrio ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Diamond Trio (set 1)", GAME_FLAGS ) +GAME( 2002?, dolphinp ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Dolphin's Pearl (set 1)", GAME_FLAGS ) +GAME( 2002?, eurogame ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","The Euro Game (set 1)", GAME_FLAGS ) +GAME( 2002?, eurogamea ,eurogame, gaminator, gaminator, gaminator, ROT0, "Novotech","The Euro Game (set 2)", GAME_FLAGS ) +GAME( 2002?, firstcl ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","First Class Traveller (set 1)", GAME_FLAGS ) +GAME( 2002?, llcharm ,0, gaminator, gaminator, gaminator, ROT0, "Novotech","Lucky Lady's Charm (set 1)", GAME_FLAGS ) +GAME( 2002?, llcharma ,llcharm, gaminator, gaminator, gaminator, ROT0, "Novotech","Lucky Lady's Charm (set 2)", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/gaplus.c mame-0.145/src/mame/drivers/gaplus.c --- mame-0.144/src/mame/drivers/gaplus.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gaplus.c 2012-02-06 21:30:41.000000000 +0000 @@ -172,26 +172,29 @@ static WRITE8_HANDLER( gaplus_irq_1_ctrl_w ) { + gaplus_state *state = space->machine().driver_data(); int bit = !BIT(offset, 11); - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit & 1; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } -static WRITE8_HANDLER( gaplus_irq_3_ctrl_w ) +static WRITE8_HANDLER( gaplus_irq_2_ctrl_w ) { - int bit = !BIT(offset, 13); - cpu_interrupt_enable(space->machine().device("sub2"), bit); + gaplus_state *state = space->machine().driver_data(); + int bit = offset & 1; + state->m_sub_irq_mask = bit & 1; if (!bit) - cputag_set_input_line(space->machine(), "sub2", 0, CLEAR_LINE); + cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); } -static WRITE8_HANDLER( gaplus_irq_2_ctrl_w ) +static WRITE8_HANDLER( gaplus_irq_3_ctrl_w ) { - int bit = offset & 1; - cpu_interrupt_enable(space->machine().device("sub"), bit); + gaplus_state *state = space->machine().driver_data(); + int bit = !BIT(offset, 13); + state->m_sub2_irq_mask = bit & 1; if (!bit) - cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); + cputag_set_input_line(space->machine(), "sub2", 0, CLEAR_LINE); } static WRITE8_HANDLER( gaplus_sreset_w ) @@ -231,8 +234,9 @@ static MACHINE_RESET( gaplus ) { + gaplus_state *state = machine.driver_data(); /* on reset, VINTON is reset, while the other flags don't seem to be affected */ - cpu_interrupt_enable(machine.device("sub"), 0); + state->m_sub_irq_mask = 0; cputag_set_input_line(machine, "sub", 0, CLEAR_LINE); } @@ -252,20 +256,37 @@ } } -static INTERRUPT_GEN( gaplus_interrupt_1 ) +static INTERRUPT_GEN( gaplus_vblank_main_irq ) { + gaplus_state *state = device->machine().driver_data(); + device_t *io58xx = device->machine().device("58xx"); device_t *io56xx = device->machine().device("56xx"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if(state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); if (!namcoio_read_reset_line(io58xx)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(namcoio_run)); if (!namcoio_read_reset_line(io56xx)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(namcoio_run), 1); +} + +static INTERRUPT_GEN( gaplus_vblank_sub_irq ) +{ + gaplus_state *state = device->machine().driver_data(); + + if(state->m_sub_irq_mask) + cputag_set_input_line(device->machine(), "sub", 0, ASSERT_LINE); +} + +static INTERRUPT_GEN( gaplus_vblank_sub2_irq ) +{ + gaplus_state *state = device->machine().driver_data(); + if(state->m_sub2_irq_mask) + cputag_set_input_line(device->machine(), "sub2", 0, ASSERT_LINE); } @@ -483,7 +504,7 @@ static const char *const gaplus_sample_names[] = { "*gaplus", - "bang.wav", + "bang", 0 }; @@ -545,15 +566,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 24576000/16) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(cpu1_map) - MCFG_CPU_VBLANK_INT("screen", gaplus_interrupt_1) + MCFG_CPU_VBLANK_INT("screen", gaplus_vblank_main_irq) MCFG_CPU_ADD("sub", M6809, 24576000/16) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", gaplus_vblank_sub_irq) MCFG_CPU_ADD("sub2", M6809, 24576000/16) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(cpu3_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", gaplus_vblank_sub2_irq) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* a high value to ensure proper synchronization of the CPUs */ MCFG_MACHINE_RESET(gaplus) @@ -567,11 +588,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(gaplus) - MCFG_SCREEN_EOF(gaplus) + MCFG_SCREEN_UPDATE_STATIC(gaplus) + MCFG_SCREEN_VBLANK_STATIC(gaplus) MCFG_GFXDECODE(gaplus) MCFG_PALETTE_LENGTH(64*4+64*8) diff -Nru mame-0.144/src/mame/drivers/gatron.c mame-0.145/src/mame/drivers/gatron.c --- mame-0.144/src/mame/drivers/gatron.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gatron.c 2012-02-06 21:30:42.000000000 +0000 @@ -448,10 +448,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(48*8, 16*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 16*16-1) - MCFG_SCREEN_UPDATE(gat) + MCFG_SCREEN_UPDATE_STATIC(gat) MCFG_GFXDECODE(gat) MCFG_PALETTE_INIT(gat) diff -Nru mame-0.144/src/mame/drivers/gauntlet.c mame-0.145/src/mame/drivers/gauntlet.c --- mame-0.144/src/mame/drivers/gauntlet.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gauntlet.c 2012-02-06 21:30:34.000000000 +0000 @@ -534,11 +534,10 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(gauntlet) + MCFG_SCREEN_UPDATE_STATIC(gauntlet) MCFG_VIDEO_START(gauntlet) diff -Nru mame-0.144/src/mame/drivers/gberet.c mame-0.145/src/mame/drivers/gberet.c --- mame-0.144/src/mame/drivers/gberet.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gberet.c 2012-02-06 21:30:41.000000000 +0000 @@ -15,13 +15,9 @@ gberetb is a bootleg hacked to run on different hardware. TODO - - Original Green Beret is currently running too fast so it was downgraded to an unlikely - refresh rate (30 Hz). Possible causes ranges from irq sources not understood (there's a custom - IC that controls irq timings) or even waitstates (see MT #3600). - - Dump Green Beret Bootleg proms. Bootleg has four proms while the original has three - and correct the locations. + - Measure IRQ and NMI frequency (of an original board), is IRQ really tied to the same timer that triggers NMI? + - Dump Green Beret Bootleg proms and correct the locations. Bootleg has four proms while the original has three. - Dump Green Beret Bootleg PAL - - Green Beret bootleg xtal is 20.000 MHz **************************************************************************** @@ -70,7 +66,7 @@ Interrupts - The game uses both IRQ (mode 1) and NMI. + The game uses both IRQ (mode 1) and NMI via a custom interrupt controller. ***************************************************************************/ @@ -80,95 +76,79 @@ #include "includes/konamipt.h" #include "includes/gberet.h" -#define MASTER_CLOCK XTAL_18_432MHz - /************************************* * * Interrupt generators * *************************************/ -static TIMER_DEVICE_CALLBACK( gberet_scanline ) +static TIMER_DEVICE_CALLBACK( gberet_interrupt_tick ) { gberet_state *state = timer.machine().driver_data(); - int scanline = param; + UINT8 ticks_mask = ~state->m_interrupt_ticks & (state->m_interrupt_ticks + 1); // 0->1 + state->m_interrupt_ticks++; - if(scanline == 240) - { - if (state->m_irq_enable) - cputag_set_input_line(timer.machine(), "maincpu", 0, HOLD_LINE); - } - else if ((scanline % 16) == 0) - { - if (state->m_nmi_enable) - cputag_set_input_line(timer.machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); - } -} - -static TIMER_DEVICE_CALLBACK( mrgoemon_scanline ) -{ - gberet_state *state = timer.machine().driver_data(); - int scanline = param; - - if(scanline == 240) - { - if (state->m_irq_enable) - cputag_set_input_line(timer.machine(), "maincpu", 0, HOLD_LINE); - } - else if ((scanline % 32) == 0) - { - if (state->m_nmi_enable) - cputag_set_input_line(timer.machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); - } + // NMI on d0 + if (ticks_mask & state->m_interrupt_mask & 1) + cputag_set_input_line(timer.machine(), "maincpu", INPUT_LINE_NMI, ASSERT_LINE); + + // IRQ on d3 (used by mrgoemon) + if (ticks_mask & state->m_interrupt_mask<<2 & 8) + cputag_set_input_line(timer.machine(), "maincpu", 0, ASSERT_LINE); + + // IRQ on d4 (used by gberet) + if (ticks_mask & state->m_interrupt_mask<<2 & 16) + cputag_set_input_line(timer.machine(), "maincpu", 0, ASSERT_LINE); } /************************************* * - * Memory handlers + * Address maps / Memory handlers * *************************************/ static WRITE8_HANDLER( gberet_coin_counter_w ) { /* bits 0/1 = coin counters */ - coin_counter_w(space->machine(), 0, data & 0x01); - coin_counter_w(space->machine(), 1, data & 0x02); -} - -static WRITE8_HANDLER( gberet_flipscreen_w ) -{ - gberet_state *state = space->machine().driver_data(); - state->m_nmi_enable = data & 0x01; - state->m_irq_enable = data & 0x04; - - flip_screen_set(space->machine(), data & 0x08); + coin_counter_w(space->machine(), 0, data & 1); + coin_counter_w(space->machine(), 1, data & 2); } static WRITE8_HANDLER( mrgoemon_coin_counter_w ) { /* bits 0/1 = coin counters */ - coin_counter_w(space->machine(), 0, data & 0x01); - coin_counter_w(space->machine(), 1, data & 0x02); + coin_counter_w(space->machine(), 0, data & 1); + coin_counter_w(space->machine(), 1, data & 2); /* bits 5-7 = ROM bank select */ memory_set_bank(space->machine(), "bank1", ((data & 0xe0) >> 5)); } -static WRITE8_HANDLER( mrgoemon_flipscreen_w ) +static WRITE8_HANDLER( gberet_flipscreen_w ) { gberet_state *state = space->machine().driver_data(); - state->m_nmi_enable = data & 0x01; - state->m_irq_enable = data & 0x02; - flip_screen_set(space->machine(), data & 0x08); + /* bits 0/1/2 = interrupt enable */ + UINT8 ack_mask = ~data & state->m_interrupt_mask; // 1->0 + + if (ack_mask & 1) + cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_NMI, CLEAR_LINE); + + if (ack_mask & 6) + cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); + + state->m_interrupt_mask = data & 7; + + /* bit 3 = flip screen */ + flip_screen_set(space->machine(), data & 8); } -/************************************* - * - * Address maps - * - *************************************/ +static WRITE8_HANDLER( gberet_sound_w ) +{ + gberet_state *state = space->machine().driver_data(); + sn76496_w(space->machine().device("snsnd"), 0, *state->m_soundlatch); +} static ADDRESS_MAP_START( gberet_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM @@ -182,15 +162,52 @@ AM_RANGE(0xe043, 0xe043) AM_WRITE(gberet_sprite_bank_w) AM_RANGE(0xe044, 0xe044) AM_WRITE(gberet_flipscreen_w) AM_RANGE(0xf000, 0xf000) AM_WRITE(gberet_coin_counter_w) - AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW2") AM_WRITENOP // Loads the snd command into the snd latch - AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW3") AM_DEVWRITE("snsnd", sn76496_w) // This address triggers the SN chip to read the data port. - AM_RANGE(0xf600, 0xf600) AM_READ_PORT("DSW1") + AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE_MEMBER(gberet_state, m_soundlatch) + AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW3") AM_WRITE(gberet_sound_w) + AM_RANGE(0xf600, 0xf600) AM_READ_PORT("DSW1") AM_WRITE(watchdog_reset_w) AM_RANGE(0xf601, 0xf601) AM_READ_PORT("P2") AM_RANGE(0xf602, 0xf602) AM_READ_PORT("P1") AM_RANGE(0xf603, 0xf603) AM_READ_PORT("SYSTEM") - AM_RANGE(0xf600, 0xf600) AM_WRITE(watchdog_reset_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( mrgoemon_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xbfff) AM_ROM + AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(gberet_colorram_w) AM_BASE_MEMBER(gberet_state, m_colorram) + AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(gberet_videoram_w) AM_BASE_MEMBER(gberet_state, m_videoram) + AM_RANGE(0xd000, 0xd0ff) AM_RAM AM_BASE_MEMBER(gberet_state, m_spriteram2) + AM_RANGE(0xd100, 0xd1ff) AM_RAM AM_BASE_MEMBER(gberet_state, m_spriteram) + AM_RANGE(0xd200, 0xdfff) AM_RAM + AM_RANGE(0xe000, 0xe03f) AM_RAM_WRITE(gberet_scroll_w) AM_BASE_MEMBER(gberet_state, m_scrollram) + AM_RANGE(0xe040, 0xe042) AM_WRITENOP // ??? + AM_RANGE(0xe043, 0xe043) AM_WRITE(gberet_sprite_bank_w) + AM_RANGE(0xe044, 0xe044) AM_WRITE(gberet_flipscreen_w) + AM_RANGE(0xf000, 0xf000) AM_WRITE(mrgoemon_coin_counter_w) + AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW2") AM_WRITEONLY AM_BASE_MEMBER(gberet_state, m_soundlatch) + AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW3") AM_WRITE(gberet_sound_w) + AM_RANGE(0xf600, 0xf600) AM_READ_PORT("DSW1") AM_WRITE(watchdog_reset_w) + AM_RANGE(0xf601, 0xf601) AM_READ_PORT("P2") + AM_RANGE(0xf602, 0xf602) AM_READ_PORT("P1") + AM_RANGE(0xf603, 0xf603) AM_READ_PORT("SYSTEM") + AM_RANGE(0xf800, 0xffff) AM_ROMBANK("bank1") +ADDRESS_MAP_END + + +static WRITE8_HANDLER( gberetb_flipscreen_w ) +{ + flip_screen_set(space->machine(), data & 8); +} + +static READ8_HANDLER( gberetb_irq_ack_r ) +{ + cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); + return 0xff; +} + +static WRITE8_HANDLER( gberetb_nmi_ack_w ) +{ + cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_NMI, CLEAR_LINE); +} + static ADDRESS_MAP_START( gberetb_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(gberet_colorram_w) AM_BASE_MEMBER(gberet_state, m_colorram) @@ -198,40 +215,20 @@ AM_RANGE(0xd000, 0xdfff) AM_RAM AM_RANGE(0xe000, 0xe03f) AM_RAM AM_RANGE(0xe040, 0xe043) AM_WRITENOP // ??? - AM_RANGE(0xe044, 0xe044) AM_WRITE(gberet_flipscreen_w) + AM_RANGE(0xe044, 0xe044) AM_WRITE(gberetb_flipscreen_w) // did hw even support flipscreen? AM_RANGE(0xe800, 0xe8ff) AM_RAM AM_RANGE(0xe900, 0xe9ff) AM_RAM AM_BASE_SIZE_MEMBER(gberet_state, m_spriteram, m_spriteram_size) - AM_RANGE(0xf000, 0xf000) AM_WRITENOP // coin counter not supported + AM_RANGE(0xf000, 0xf000) AM_WRITENOP // coin counter not supported AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW2") AM_RANGE(0xf400, 0xf400) AM_DEVWRITE("snsnd", sn76496_w) AM_RANGE(0xf600, 0xf600) AM_READ_PORT("P2") AM_RANGE(0xf601, 0xf601) AM_READ_PORT("DSW1") AM_RANGE(0xf602, 0xf602) AM_READ_PORT("P1") AM_RANGE(0xf603, 0xf603) AM_READ_PORT("SYSTEM") - AM_RANGE(0xf800, 0xf800) AM_NOP // IRQ/NMI acknowledge + AM_RANGE(0xf800, 0xf800) AM_READWRITE(gberetb_irq_ack_r, gberetb_nmi_ack_w) AM_RANGE(0xf900, 0xf901) AM_WRITE(gberetb_scroll_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( mrgoemon_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0xbfff) AM_ROM - AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(gberet_colorram_w) AM_BASE_MEMBER(gberet_state, m_colorram) - AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(gberet_videoram_w) AM_BASE_MEMBER(gberet_state, m_videoram) - AM_RANGE(0xd000, 0xd0ff) AM_RAM AM_BASE_MEMBER(gberet_state, m_spriteram2) - AM_RANGE(0xd100, 0xd1ff) AM_RAM AM_BASE_MEMBER(gberet_state, m_spriteram) - AM_RANGE(0xd200, 0xdfff) AM_RAM - AM_RANGE(0xe000, 0xe03f) AM_RAM_WRITE(gberet_scroll_w) AM_BASE_MEMBER(gberet_state, m_scrollram) - AM_RANGE(0xe040, 0xe042) AM_WRITENOP // ??? - AM_RANGE(0xe043, 0xe043) AM_WRITE(gberet_sprite_bank_w) - AM_RANGE(0xe044, 0xe044) AM_WRITE(mrgoemon_flipscreen_w) - AM_RANGE(0xf000, 0xf000) AM_WRITE(mrgoemon_coin_counter_w) - AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW2") AM_WRITENOP // Loads the snd command into the snd latch - AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW3") AM_DEVWRITE("snsnd", sn76496_w) // This address triggers the SN chip to read the data port. - AM_RANGE(0xf600, 0xf600) AM_READ_PORT("DSW1") AM_WRITE(watchdog_reset_w) - AM_RANGE(0xf601, 0xf601) AM_READ_PORT("P2") - AM_RANGE(0xf602, 0xf602) AM_READ_PORT("P1") - AM_RANGE(0xf603, 0xf603) AM_READ_PORT("SYSTEM") - AM_RANGE(0xf800, 0xffff) AM_ROMBANK("bank1") -ADDRESS_MAP_END /************************************* * @@ -241,7 +238,7 @@ static INPUT_PORTS_START( gberet ) PORT_START("P1") - KONAMI8_MONO_B12_UNK // button 1 = knife, button 2 = shoot + KONAMI8_MONO_B12_UNK PORT_START("P2") KONAMI8_COCKTAIL_B12_UNK @@ -256,7 +253,7 @@ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // factory default + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") @@ -264,12 +261,12 @@ PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30K, 70K, Every 70K" ) - PORT_DIPSETTING( 0x10, "40K, 80K, Every 80K" ) // Japanese default - PORT_DIPSETTING( 0x08, "50K, 100K, Every 100K" ) // US default + PORT_DIPSETTING( 0x10, "40K, 80K, Every 80K" ) // Japanese default + PORT_DIPSETTING( 0x08, "50K, 100K, Every 100K" ) // US default PORT_DIPSETTING( 0x00, "50K, 200K, Every 200K" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // factory default + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -309,7 +306,7 @@ PORT_MODIFY("DSW2") PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "20K, Every 60K" ) // factory default + PORT_DIPSETTING( 0x18, "20K, Every 60K" ) PORT_DIPSETTING( 0x10, "30K, Every 70K" ) PORT_DIPSETTING( 0x08, "40K, Every 80K" ) PORT_DIPSETTING( 0x00, "50K, Every 90K" ) @@ -318,6 +315,7 @@ PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) INPUT_PORTS_END + /************************************* * * Graphics definitions @@ -385,7 +383,7 @@ /************************************* * - * Machine driver + * Machine drivers * *************************************/ @@ -393,8 +391,8 @@ { gberet_state *state = machine.driver_data(); - state->save_item(NAME(state->m_irq_enable)); - state->save_item(NAME(state->m_nmi_enable)); + state->save_item(NAME(state->m_interrupt_mask)); + state->save_item(NAME(state->m_interrupt_ticks)); state->save_item(NAME(state->m_spritebank)); } @@ -402,29 +400,28 @@ { gberet_state *state = machine.driver_data(); - state->m_irq_enable = 0; - state->m_nmi_enable = 0; + state->m_interrupt_mask = 0; + state->m_interrupt_ticks = 0; state->m_spritebank = 0; } static MACHINE_CONFIG_START( gberet, gberet_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) // X1S (generated by a custom IC) + MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) // X1S (generated by a custom IC) MCFG_CPU_PROGRAM_MAP(gberet_map) - MCFG_TIMER_ADD_SCANLINE("scantimer", gberet_scanline, "screen", 0, 1) + MCFG_TIMER_ADD_SCANLINE("scantimer", gberet_interrupt_tick, "screen", 0, 16) // ? MCFG_MACHINE_START(gberet) MCFG_MACHINE_RESET(gberet) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(30) + MCFG_SCREEN_REFRESH_RATE(60.60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gberet) + MCFG_SCREEN_UPDATE_STATIC(gberet) MCFG_GFXDECODE(gberet) MCFG_PALETTE_LENGTH(2*16*16) @@ -435,38 +432,50 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("snsnd", SN76489A, MASTER_CLOCK/12) /* type verified on real and bootleg pcb */ + MCFG_SOUND_ADD("snsnd", SN76489A, XTAL_18_432MHz/12) /* type verified on real and bootleg pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( gberetb, gberet ) +static MACHINE_CONFIG_DERIVED( mrgoemon, gberet ) /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(mrgoemon_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( gberetb, gberet_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", Z80, XTAL_20MHz/4) // divider guessed MCFG_CPU_PROGRAM_MAP(gberetb_map) - MCFG_TIMER_MODIFY("scantimer")//, mrgoemon_scanline, "screen", 0, 1) - MCFG_TIMER_CALLBACK(mrgoemon_scanline) + MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_PERIODIC_INT(nmi_line_assert, XTAL_20MHz/0x8000) // divider guessed + + MCFG_MACHINE_START(gberet) + MCFG_MACHINE_RESET(gberet) /* video hardware */ - MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(gberetb) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) + MCFG_SCREEN_UPDATE_STATIC(gberetb) MCFG_GFXDECODE(gberetb) -MACHINE_CONFIG_END + MCFG_PALETTE_LENGTH(2*16*16) -static MACHINE_CONFIG_DERIVED( mrgoemon, gberet ) + MCFG_PALETTE_INIT(gberet) + MCFG_VIDEO_START(gberet) - /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(mrgoemon_map) - MCFG_TIMER_MODIFY("scantimer")//, mrgoemon_scanline, "screen", 0, 1) - MCFG_TIMER_CALLBACK(mrgoemon_scanline) + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SOUND_ADD("snsnd", SN76489A, XTAL_20MHz/12) // divider guessed + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END + /************************************* * * ROM definition(s) @@ -570,9 +579,10 @@ memory_configure_bank(machine, "bank1", 0, 8, &ROM[0x10000], 0x800); } + /************************************* * - * Game driver(s) + * Game drivers * *************************************/ diff -Nru mame-0.144/src/mame/drivers/gbusters.c mame-0.145/src/mame/drivers/gbusters.c --- mame-0.144/src/mame/drivers/gbusters.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gbusters.c 2012-02-06 21:30:36.000000000 +0000 @@ -326,10 +326,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(gbusters) + MCFG_SCREEN_UPDATE_STATIC(gbusters) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/gcpinbal.c mame-0.145/src/mame/drivers/gcpinbal.c --- mame-0.144/src/mame/drivers/gcpinbal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gcpinbal.c 2012-02-06 21:30:37.000000000 +0000 @@ -444,10 +444,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gcpinbal) + MCFG_SCREEN_UPDATE_STATIC(gcpinbal) MCFG_MACHINE_START(gcpinbal) MCFG_MACHINE_RESET(gcpinbal) diff -Nru mame-0.144/src/mame/drivers/gei.c mame-0.145/src/mame/drivers/gei.c --- mame-0.144/src/mame/drivers/gei.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gei.c 2012-02-06 21:30:34.000000000 +0000 @@ -79,12 +79,19 @@ gei_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } + virtual void video_start(); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + bitmap_ind16 m_bitmap; + UINT8 m_drawctrl[3]; UINT8 m_color[8]; int m_prevoffset; int m_yadd; int m_signature_answer; int m_signature_pos; + UINT8 m_nmi_mask; }; @@ -115,7 +122,7 @@ for (i = 0; i < 8; i++) - *BITMAP_ADDR16(space->machine().generic.tmpbitmap, sy, sx+i) = state->m_color[8-i-1]; + state->m_bitmap.pix16(sy, sx+i) = state->m_color[8-i-1]; } static PALETTE_INIT(gei) @@ -138,6 +145,17 @@ } } +void gei_state::video_start() +{ + machine().primary_screen->register_screen_bitmap(m_bitmap); +} + +UINT32 gei_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); + return 0; +} + static WRITE8_DEVICE_HANDLER( lamps_w ) { /* 5 button lamps */ @@ -157,6 +175,7 @@ static WRITE8_DEVICE_HANDLER( sound_w ) { address_space *space = device->machine().device("maincpu")->memory().space(AS_PROGRAM); + gei_state *state = space->machine().driver_data(); /* bit 3 - coin lockout, lamp10 in poker / lamp6 in trivia test modes */ coin_lockout_global_w(device->machine(), ~data & 0x08); @@ -166,7 +185,7 @@ ticket_dispenser_w(device->machine().device("ticket"), 0, (data & 0x20)<< 2); /* bit 6 enables NMI */ - interrupt_enable_w(space, 0, data & 0x40); + state->m_nmi_mask = data & 0x40; /* bit 7 goes directly to the sound amplifier */ dac_data_w(device->machine().device("dac"), ((data & 0x80) >> 7) * 255); @@ -198,12 +217,13 @@ static WRITE8_DEVICE_HANDLER( nmi_w ) { address_space *space = device->machine().device("maincpu")->memory().space(AS_PROGRAM); + gei_state *state = space->machine().driver_data(); /* bit 4 - play/raise button lamp, lamp 9 in selection test mode */ set_led_status(device->machine(), 8,data & 0x10); /* bit 6 enables NMI */ - interrupt_enable_w(space, 0, data & 0x40); + state->m_nmi_mask = data & 0x40; } static READ8_HANDLER( catchall ) @@ -1063,27 +1083,33 @@ } }; +static INTERRUPT_GEN( vblank_irq ) +{ + gei_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + static MACHINE_CONFIG_START( getrivia, gei_state ) MCFG_CPU_ADD("maincpu",Z80,4000000) /* 4 MHz */ MCFG_CPU_PROGRAM_MAP(getrivia_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(gei_state, screen_update) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(48, 511-48, 16, 255-16) - MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(8) MCFG_PALETTE_INIT(gei) MCFG_NVRAM_ADD_0FILL("nvram") - MCFG_VIDEO_START(generic_bitmapped) - MCFG_PPI8255_ADD( "ppi8255_0", getrivia_ppi8255_intf[0] ) MCFG_PPI8255_ADD( "ppi8255_1", getrivia_ppi8255_intf[1] ) MCFG_TICKET_DISPENSER_ADD("ticket", 100, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH) diff -Nru mame-0.144/src/mame/drivers/ggconnie.c mame-0.145/src/mame/drivers/ggconnie.c --- mame-0.144/src/mame/drivers/ggconnie.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ggconnie.c 2012-02-06 21:30:40.000000000 +0000 @@ -17,7 +17,6 @@ ****************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "machine/pcecommn.h" #include "video/vdc.h" #include "cpu/h6280/h6280.h" @@ -158,16 +157,15 @@ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) MCFG_CPU_PROGRAM_MAP(sgx_mem) MCFG_CPU_IO_MAP(sgx_io) - MCFG_CPU_VBLANK_INT_HACK(sgx_interrupt, VDC_LPF) + MCFG_TIMER_ADD_SCANLINE("scantimer", sgx_interrupt, "screen", 0, 1) - MCFG_QUANTUM_TIME(attotime::from_hz(60)) +// MCFG_QUANTUM_TIME(attotime::from_hz(60)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, VDC_WPF, 70, 70 + 512 + 32, VDC_LPF, 14, 14+242) - MCFG_SCREEN_UPDATE( pce ) + MCFG_SCREEN_UPDATE_STATIC( pce ) /* MCFG_GFXDECODE( pce_gfxdecodeinfo ) */ MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/ghosteo.c mame-0.145/src/mame/drivers/ghosteo.c --- mame-0.144/src/mame/drivers/ghosteo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ghosteo.c 2012-02-06 21:30:39.000000000 +0000 @@ -81,7 +81,6 @@ : driver_device(mconfig, type, tag) { } UINT32 *m_system_memory; - UINT32 *m_steppingstone; int m_security_count; UINT32 m_bballoon_port[20]; struct nand_t m_nand; @@ -111,10 +110,11 @@ 24-ch external interrupts Controller (Wake-up source 16-ch) */ -static const UINT8 security_data[] = { 0x01, 0xC4, 0xFF, 0x22 }; +// GPIO +static const UINT8 security_data[] = { 0x01, 0xC4, 0xFF, 0x22 }; -static UINT32 s3c2410_gpio_port_r( device_t *device, int port) +static UINT32 s3c2410_gpio_port_r( device_t *device, int port, UINT32 mask) { ghosteo_state *state = device->machine().driver_data(); UINT32 data = state->m_bballoon_port[port]; @@ -135,7 +135,7 @@ return data; } -static void s3c2410_gpio_port_w( device_t *device, int port, UINT32 data) +static void s3c2410_gpio_port_w( device_t *device, int port, UINT32 mask, UINT32 data) { ghosteo_state *state = device->machine().driver_data(); UINT32 old_value = state->m_bballoon_port[port]; @@ -165,6 +165,34 @@ } } +// CORE + +/* + +OM[1:0] = 00b : Enable NAND flash controller auto boot mode + +NAND flash memory page size should be 512Bytes. + +NCON : NAND flash memory address step selection +0 : 3 Step addressing +1 : 4 Step addressing + +*/ + +static int s3c2410_core_pin_r( device_t *device, int pin) +{ + int data = 0; + switch (pin) + { + case S3C2410_CORE_PIN_NCON : data = 1; break; + case S3C2410_CORE_PIN_OM0 : data = 0; break; + case S3C2410_CORE_PIN_OM1 : data = 0; break; + } + return data; +} + +// NAND + static WRITE8_DEVICE_HANDLER( s3c2410_nand_command_w ) { ghosteo_state *state = device->machine().driver_data(); @@ -276,6 +304,8 @@ logerror( "s3c2410_nand_data_w %02X\n", data); } +// I2C + static WRITE_LINE_DEVICE_HANDLER( s3c2410_i2c_scl_w ) { device_t *i2cmem = device->machine().device( "i2cmem"); @@ -316,7 +346,6 @@ } static ADDRESS_MAP_START( bballoon_map, AS_PROGRAM, 32 ) - AM_RANGE(0x00000000, 0x00000fff) AM_RAM AM_BASE_MEMBER(ghosteo_state, m_steppingstone) AM_MIRROR(0x40000000) AM_RANGE(0x10000000, 0x10000003) AM_READ_PORT("10000000") AM_RANGE(0x10100000, 0x10100003) AM_READ_PORT("10100000") AM_RANGE(0x10200000, 0x10200003) AM_READ_PORT("10200000") @@ -382,15 +411,10 @@ PORT_BIT( 0xFFFFFF50, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END -/* -static NAND_INTERFACE( bballoon_nand_intf ) -{ - DEVCB_DEVICE_LINE("s3c2410", s3c2410_pin_frnb_w) -}; -*/ - static const s3c2410_interface bballoon_s3c2410_intf = { + // CORE (pin read / pin write) + { s3c2410_core_pin_r, NULL }, // GPIO (port read / port write) { s3c2410_gpio_port_r, s3c2410_gpio_port_w }, // I2C (scl write / sda read / sda write) @@ -399,7 +423,7 @@ { NULL }, // I2S (data write) { NULL }, - // NAND (command write, address write, data read, data write) + // NAND (command write / address write / data read / data write) { s3c2410_nand_command_w, s3c2410_nand_address_w, s3c2410_nand_data_r, s3c2410_nand_data_w } }; @@ -450,10 +474,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(455, 262) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1) - MCFG_SCREEN_UPDATE(s3c2410) + MCFG_SCREEN_UPDATE_STATIC(s3c2410) MCFG_PALETTE_LENGTH(256) @@ -549,8 +572,6 @@ static DRIVER_INIT( bballoon ) { - ghosteo_state *state = machine.driver_data(); - memcpy( state->m_steppingstone, machine.region( "user1")->base(), 4 * 1024); } GAME( 2003, bballoon, 0, bballoon, bballoon, bballoon, ROT0, "Eolith", "BnB Arcade", GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/gijoe.c mame-0.145/src/mame/drivers/gijoe.c --- mame-0.144/src/mame/drivers/gijoe.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gijoe.c 2012-02-06 21:30:38.000000000 +0000 @@ -317,10 +317,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(24, 24+288-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(gijoe) + MCFG_SCREEN_UPDATE_STATIC(gijoe) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/ginganin.c mame-0.145/src/mame/drivers/ginganin.c --- mame-0.144/src/mame/drivers/ginganin.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ginganin.c 2012-02-06 21:30:34.000000000 +0000 @@ -277,10 +277,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0 + 16 , 255 - 16) - MCFG_SCREEN_UPDATE(ginganin) + MCFG_SCREEN_UPDATE_STATIC(ginganin) MCFG_GFXDECODE(ginganin) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/gladiatr.c mame-0.145/src/mame/drivers/gladiatr.c --- mame-0.144/src/mame/drivers/gladiatr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gladiatr.c 2012-02-06 21:30:39.000000000 +0000 @@ -689,10 +689,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ppking) + MCFG_SCREEN_UPDATE_STATIC(ppking) MCFG_GFXDECODE(ppking) MCFG_PALETTE_LENGTH(1024) @@ -738,10 +737,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gladiatr) + MCFG_SCREEN_UPDATE_STATIC(gladiatr) MCFG_GFXDECODE(gladiatr) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/glass.c mame-0.145/src/mame/drivers/glass.c --- mame-0.144/src/mame/drivers/glass.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/glass.c 2012-02-06 21:30:38.000000000 +0000 @@ -208,10 +208,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 368-1, 16, 256-1) - MCFG_SCREEN_UPDATE(glass) + MCFG_SCREEN_UPDATE_STATIC(glass) MCFG_GFXDECODE(glass) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/globalfr.c mame-0.145/src/mame/drivers/globalfr.c --- mame-0.144/src/mame/drivers/globalfr.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/globalfr.c 2012-02-06 21:30:39.000000000 +0000 @@ -30,7 +30,7 @@ /******************************************************************************/ -static ADDRESS_MAP_START( globalfr_map, AS_PROGRAM, 8, globalfr_state ) +static ADDRESS_MAP_START( globalfr_map, AS_PROGRAM, 16, globalfr_state ) AM_RANGE(0x002000, 0x002fff) AM_RAM AM_RANGE(0x008000, 0x07ffff) AM_ROM AM_REGION("maincpu", 0x8000) AM_RANGE(0x0a0000, 0x0a01ff) AM_RAM @@ -112,11 +112,11 @@ /******************************************************************************/ -GAME( 199?, gl_dow, 0, globalfr, globalfr, 0, ROT0, "Global", "Deals On Wheels (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_dowcl,0, globalfr, globalfr, 0, ROT0, "Global", "Deals On Wheels Club (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_wywh, 0, globalfr, globalfr, 0, ROT0, "Global", "Wish You Were Here Club (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_coc, 0, globalfr, globalfr, 0, ROT0, "Global", "Carry On Clubbin' (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_uyr, 0, globalfr, globalfr, 0, ROT0, "Global", "Up Yer Riggin Club (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_hbh, 0, globalfr, globalfr, 0, ROT0, "Global", "Heartbreak Hotel (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) -GAME( 199?, gl_hbhcl,0, globalfr, globalfr, 0, ROT0, "Global", "Heartbreak Hotel Club (Global) (Stealth)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 199?, gl_dow, 0, globalfr, globalfr, 0, ROT0, "Global", "Deals On Wheels (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_dowcl,0, globalfr, globalfr, 0, ROT0, "Global", "Deals On Wheels Club (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_wywh, 0, globalfr, globalfr, 0, ROT0, "Global", "Wish You Were Here Club (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_coc, 0, globalfr, globalfr, 0, ROT0, "Global", "Carry On Clubbin' (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_uyr, 0, globalfr, globalfr, 0, ROT0, "Global", "Up Yer Riggin Club (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_hbh, 0, globalfr, globalfr, 0, ROT0, "Global", "Heartbreak Hotel (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) +GAME( 199?, gl_hbhcl,0, globalfr, globalfr, 0, ROT0, "Global", "Heartbreak Hotel Club (Global) (Stealth)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gng.c mame-0.145/src/mame/drivers/gng.c --- mame-0.144/src/mame/drivers/gng.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gng.c 2012-02-06 21:30:34.000000000 +0000 @@ -320,6 +320,24 @@ state->m_scrollx[1] = 0; state->m_scrolly[0] = 0; state->m_scrolly[1] = 0; + + { + int i; + + /* TODO: PCB reference clearly shows that the POST has random/filled data on the paletteram. + For now let's fill everything with white colors until we have better info about it */ + for(i=0;i<0x100;i+=4) + { + machine.generic.paletteram.u8[i] = machine.generic.paletteram2.u8[i] = 0x00; + machine.generic.paletteram.u8[i+1] = machine.generic.paletteram2.u8[i+1] = 0x55; + machine.generic.paletteram.u8[i+2] = machine.generic.paletteram2.u8[i+2] = 0xaa; + machine.generic.paletteram.u8[i+3] = machine.generic.paletteram2.u8[i+3] = 0xff; + palette_set_color_rgb(machine,i+0,0x00,0x00,0x00); + palette_set_color_rgb(machine,i+1,0x55,0x55,0x55); + palette_set_color_rgb(machine,i+2,0xaa,0xaa,0xaa); + palette_set_color_rgb(machine,i+3,0xff,0xff,0xff); + } + } } static MACHINE_CONFIG_START( gng, gng_state ) @@ -342,11 +360,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.59) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gng) - MCFG_SCREEN_EOF(gng) + MCFG_SCREEN_UPDATE_STATIC(gng) + MCFG_SCREEN_VBLANK_STATIC(gng) MCFG_GFXDECODE(gng) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/go2000.c mame-0.145/src/mame/drivers/go2000.c --- mame-0.144/src/mame/drivers/go2000.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/go2000.c 2012-02-06 21:30:42.000000000 +0000 @@ -169,9 +169,9 @@ { } -static SCREEN_UPDATE(go2000) +static SCREEN_UPDATE_IND16(go2000) { - go2000_state *state = screen->machine().driver_data(); + go2000_state *state = screen.machine().driver_data(); int x,y; int count = 0; @@ -182,7 +182,7 @@ { int tile = state->m_videoram[count]; int attr = state->m_videoram2[count]; - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[0], tile, attr, 0, 0, x * 8, y * 8); + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], tile, attr, 0, 0, x * 8, y * 8); count++; } } @@ -194,7 +194,7 @@ { int tile = state->m_videoram[count]; int attr = state->m_videoram2[count]; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], tile, attr, 0, 0, x * 8, y * 8, 0xf); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], tile, attr, 0, 0, x * 8, y * 8, 0xf); count++; } } @@ -203,8 +203,8 @@ { int offs; - int max_x = screen->machine().primary_screen->width() - 8; - int max_y = screen->machine().primary_screen->height() - 8; + int max_x = screen.machine().primary_screen->width() - 8; + int max_y = screen.machine().primary_screen->height() - 8; for (offs = 0xf800 / 2; offs < 0x10000 / 2 ; offs += 4/2) { @@ -277,7 +277,7 @@ if (flipx) tile_flipx = !tile_flipx; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = max_x - sx; sy = max_y - sy; @@ -285,7 +285,7 @@ tile_flipy = !tile_flipy; } - drawgfx_transpen( bitmap, cliprect,screen->machine().gfx[0], + drawgfx_transpen( bitmap, cliprect,screen.machine().gfx[0], (tile & 0x1fff) + bank*0x4000, attr, tile_flipx, tile_flipy, @@ -335,10 +335,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(go2000) + MCFG_SCREEN_UPDATE_STATIC(go2000) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/goal92.c mame-0.145/src/mame/drivers/goal92.c --- mame-0.144/src/mame/drivers/goal92.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/goal92.c 2012-02-06 21:30:40.000000000 +0000 @@ -331,11 +331,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) // black border at bottom is a game bug... - MCFG_SCREEN_UPDATE(goal92) - MCFG_SCREEN_EOF(goal92) + MCFG_SCREEN_UPDATE_STATIC(goal92) + MCFG_SCREEN_VBLANK_STATIC(goal92) MCFG_GFXDECODE(goal92) MCFG_PALETTE_LENGTH(128*16) diff -Nru mame-0.144/src/mame/drivers/goindol.c mame-0.145/src/mame/drivers/goindol.c --- mame-0.144/src/mame/drivers/goindol.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/goindol.c 2012-02-06 21:30:41.000000000 +0000 @@ -32,7 +32,7 @@ if (state->m_char_bank != ((data & 0x10) >> 4)) { state->m_char_bank = (data & 0x10) >> 4; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } flip_screen_set(space->machine(), data & 0x20); @@ -260,10 +260,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goindol) + MCFG_SCREEN_UPDATE_STATIC(goindol) MCFG_GFXDECODE(goindol) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/goldngam.c mame-0.145/src/mame/drivers/goldngam.c --- mame-0.144/src/mame/drivers/goldngam.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/goldngam.c 2012-02-06 21:30:42.000000000 +0000 @@ -256,9 +256,9 @@ } -static SCREEN_UPDATE( goldngam ) +static SCREEN_UPDATE_IND16( goldngam ) { - goldngam_state *state = screen->machine().driver_data(); + goldngam_state *state = screen.machine().driver_data(); int x, y; @@ -269,7 +269,7 @@ { for(x = 0; x < 384; ++x) { - *BITMAP_ADDR16(bitmap, y, x) = tmp[index ^ 1]; /* swapped bytes in 16 bit word */ + bitmap.pix16(y, x) = tmp[index ^ 1]; /* swapped bytes in 16 bit word */ ++index; } } @@ -561,10 +561,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 43*8-1, 1*8, 37*8-1) // 312x288 - MCFG_SCREEN_UPDATE(goldngam) + MCFG_SCREEN_UPDATE_STATIC(goldngam) MCFG_GFXDECODE(goldngam) diff -Nru mame-0.144/src/mame/drivers/goldnpkr.c mame-0.145/src/mame/drivers/goldnpkr.c --- mame-0.144/src/mame/drivers/goldnpkr.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/goldnpkr.c 2012-02-06 21:30:33.000000000 +0000 @@ -739,14 +739,14 @@ { goldnpkr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( goldnpkr_colorram_w ) { goldnpkr_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -800,10 +800,10 @@ state->m_bg_tilemap = tilemap_create(machine, xtnd_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( goldnpkr ) +static SCREEN_UPDATE_IND16( goldnpkr ) { - goldnpkr_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + goldnpkr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -2935,10 +2935,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* From MC6845 init, registers 00 & 04 (programmed with value-1). */ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) /* From MC6845 init, registers 01 & 06. */ - MCFG_SCREEN_UPDATE(goldnpkr) + MCFG_SCREEN_UPDATE_STATIC(goldnpkr) MCFG_MC6845_ADD("crtc", MC6845, CPU_CLOCK, mc6845_intf) /* 68B45 or 6845s @ CPU clock */ diff -Nru mame-0.144/src/mame/drivers/goldstar.c mame-0.145/src/mame/drivers/goldstar.c --- mame-0.144/src/mame/drivers/goldstar.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/goldstar.c 2012-02-06 21:30:34.000000000 +0000 @@ -396,7 +396,7 @@ //popmessage("magodds_outb850_w %02x\n", data); - tilemap_mark_all_tiles_dirty (state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } @@ -5853,10 +5853,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(goldstar) MCFG_PALETTE_LENGTH(256) @@ -5888,10 +5887,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(bl) MCFG_PALETTE_LENGTH(256) @@ -5922,10 +5920,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(ml) MCFG_PALETTE_LENGTH(256) @@ -6022,10 +6019,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(chry10) MCFG_PALETTE_LENGTH(256) @@ -6064,10 +6060,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(cb3c) MCFG_PALETTE_LENGTH(256) @@ -6105,10 +6100,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(ncb3) MCFG_PALETTE_LENGTH(256) @@ -6146,10 +6140,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(cmbitmap) MCFG_PALETTE_LENGTH(256) @@ -6187,10 +6180,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(cm) MCFG_PALETTE_LENGTH(256) @@ -6223,10 +6215,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(cmast91) + MCFG_SCREEN_UPDATE_STATIC(cmast91) MCFG_GFXDECODE(cmast91) MCFG_PALETTE_LENGTH(256) @@ -6267,11 +6258,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) MCFG_PALETTE_INIT(lucky8) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(ncb3) MCFG_PALETTE_LENGTH(256) @@ -6307,11 +6297,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) MCFG_PALETTE_INIT(lucky8) - MCFG_SCREEN_UPDATE(bingowng) + MCFG_SCREEN_UPDATE_STATIC(bingowng) MCFG_GFXDECODE(ncb3) MCFG_PALETTE_LENGTH(256) @@ -6347,11 +6336,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) MCFG_PALETTE_INIT(lucky8) - MCFG_SCREEN_UPDATE(bingowng) + MCFG_SCREEN_UPDATE_STATIC(bingowng) MCFG_GFXDECODE(bingownga) /* GFX Decode is the only difference with the parent machine */ MCFG_PALETTE_LENGTH(256) @@ -6404,10 +6392,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(magical) + MCFG_SCREEN_UPDATE_STATIC(magical) MCFG_PALETTE_INIT(magodds) MCFG_GFXDECODE(magodds) @@ -6446,10 +6433,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_PALETTE_INIT(lucky8) MCFG_GFXDECODE(ncb3) @@ -6482,10 +6468,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_PALETTE_INIT(lucky8) MCFG_GFXDECODE(ncb3) @@ -6523,10 +6508,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_PALETTE_INIT(lucky8) MCFG_GFXDECODE(ncb3) @@ -6565,10 +6549,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(cm) MCFG_PALETTE_LENGTH(256) @@ -6605,10 +6588,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(amcoe1a) + MCFG_SCREEN_UPDATE_STATIC(amcoe1a) MCFG_GFXDECODE(cm) MCFG_PALETTE_LENGTH(256) @@ -6645,10 +6627,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(cm) MCFG_PALETTE_LENGTH(256) @@ -6680,10 +6661,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(nfm) MCFG_PALETTE_LENGTH(256) @@ -6712,10 +6692,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(unkch) + MCFG_SCREEN_UPDATE_STATIC(unkch) MCFG_GFXDECODE(unkch) MCFG_PALETTE_LENGTH(512) @@ -6761,10 +6740,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(goldstar) + MCFG_SCREEN_UPDATE_STATIC(goldstar) MCFG_GFXDECODE(pkrmast) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/gomoku.c mame-0.145/src/mame/drivers/gomoku.c --- mame-0.144/src/mame/drivers/gomoku.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gomoku.c 2012-02-06 21:30:41.000000000 +0000 @@ -127,10 +127,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(gomoku) + MCFG_SCREEN_UPDATE_STATIC(gomoku) MCFG_GFXDECODE(gomoku) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/good.c mame-0.145/src/mame/drivers/good.c --- mame-0.144/src/mame/drivers/good.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/good.c 2012-02-06 21:30:38.000000000 +0000 @@ -57,7 +57,7 @@ { good_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_tilemapram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_fg_tile_info ) @@ -72,7 +72,7 @@ { good_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_tilemapram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_bg_tile_info ) @@ -90,14 +90,14 @@ good_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xf); + state->m_fg_tilemap->set_transparent_pen(0xf); } -static SCREEN_UPDATE( good ) +static SCREEN_UPDATE_IND16( good ) { - good_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + good_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -284,10 +284,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(1*16, 23*16-1, 0*16, 14*16-1) - MCFG_SCREEN_UPDATE(good) + MCFG_SCREEN_UPDATE_STATIC(good) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/goodejan.c mame-0.145/src/mame/drivers/goodejan.c --- mame-0.144/src/mame/drivers/goodejan.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/goodejan.c 2012-02-06 21:30:40.000000000 +0000 @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) //TODO: dynamic resolution - MCFG_SCREEN_UPDATE(seibu_crtc) + MCFG_SCREEN_UPDATE_STATIC(seibu_crtc) MCFG_GFXDECODE(goodejan) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/gotcha.c mame-0.145/src/mame/drivers/gotcha.c --- mame-0.144/src/mame/drivers/gotcha.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gotcha.c 2012-02-06 21:30:42.000000000 +0000 @@ -291,10 +291,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(gotcha) + MCFG_SCREEN_UPDATE_STATIC(gotcha) MCFG_GFXDECODE(gotcha) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/gottlieb.c mame-0.145/src/mame/drivers/gottlieb.c --- mame-0.144/src/mame/drivers/gottlieb.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gottlieb.c 2012-02-06 21:30:35.000000000 +0000 @@ -196,7 +196,6 @@ #include "emu.h" #include "cpu/i86/i86.h" #include "machine/6532riot.h" -#include "machine/laserdsc.h" #include "sound/ay8910.h" #include "sound/dac.h" #include "sound/samples.h" @@ -244,7 +243,6 @@ state_save_register_global_array(machine, state->m_track); /* see if we have a laserdisc */ - state->m_laserdisc = machine.devicelist().first(PIONEER_PR8210); if (state->m_laserdisc != NULL) { /* attach to the I/O ports */ @@ -436,7 +434,7 @@ static TIMER_CALLBACK( laserdisc_philips_callback ) { gottlieb_state *state = machine.driver_data(); - int newcode = laserdisc_get_field_code(state->m_laserdisc, (param == 17) ? LASERDISC_CODE_LINE17 : LASERDISC_CODE_LINE18, TRUE); + UINT32 newcode = state->m_laserdisc->get_field_code((param == 17) ? LASERDISC_CODE_LINE17 : LASERDISC_CODE_LINE18, TRUE); /* the PR8210 sends line 17/18 data on each frame; the laserdisc interface board receives notification and latches the most recent frame number */ @@ -458,7 +456,7 @@ { gottlieb_state *state = machine.driver_data(); /* deassert the control line */ - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_CONTROL, CLEAR_LINE); + state->m_laserdisc->control_w(CLEAR_LINE); } @@ -470,7 +468,7 @@ attotime duration; /* assert the line and set a timer for deassertion */ - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_CONTROL, ASSERT_LINE); + state->m_laserdisc->control_w(ASSERT_LINE); machine.scheduler().timer_set(LASERDISC_CLOCK * 10, FUNC(laserdisc_bit_off_callback)); /* determine how long for the next command; there is a 555 timer with a @@ -596,10 +594,10 @@ } -static void laserdisc_audio_process(device_t *device, int samplerate, int samples, const INT16 *ch0, const INT16 *ch1) +static void laserdisc_audio_process(device_t *dummy, laserdisc_device &device, int samplerate, int samples, const INT16 *ch0, const INT16 *ch1) { - gottlieb_state *state = device->machine().driver_data(); - int logit = LOG_AUDIO_DECODE && device->machine().input().code_pressed(KEYCODE_L); + gottlieb_state *state = device.machine().driver_data(); + int logit = LOG_AUDIO_DECODE && device.machine().input().code_pressed(KEYCODE_L); attotime time_per_sample = attotime::from_hz(samplerate); attotime curtime = state->m_laserdisc_last_time; int cursamp; @@ -680,10 +678,8 @@ /* if we have a laserdisc, update it */ if (state->m_laserdisc != NULL) { - bitmap_t *dummy; - /* set the "disc ready" bit, which basically indicates whether or not we have a proper video frame */ - if (!laserdisc_get_video(state->m_laserdisc, &dummy)) + if (!state->m_laserdisc->video_active()) state->m_laserdisc_status &= ~0x20; else state->m_laserdisc_status |= 0x20; @@ -1750,77 +1746,77 @@ static const char *const reactor_sample_names[] = { "*reactor", - "fx_53.wav", /* "8 left" */ - "fx_54.wav", /* "16 left" */ - "fx_55.wav", /* "24 left" */ - "fx_56.wav", /* "32 left" */ - "fx_57.wav", /* "40 left" */ - "fx_58.wav", /* "warning, core unstable" */ - "fx_59.wav", /* "bonus" */ - "fx_31.wav", /* "chamber activated" */ - "fx_39a.wav", /* "2000" */ - "fx_39b.wav", /* "5000" */ - "fx_39c.wav", /* "10000" */ - "fx_39d.wav", /* "15000" */ - "fx_39e.wav", /* "20000" */ - "fx_39f.wav", /* "25000" */ - "fx_39g.wav", /* "30000" */ - "fx_39h.wav", /* "35000" */ - "fx_39i.wav", /* "40000" */ - "fx_39j.wav", /* "45000" */ - "fx_39k.wav", /* "50000" */ - "fx_39l.wav", /* "55000" */ + "fx_53", /* "8 left" */ + "fx_54", /* "16 left" */ + "fx_55", /* "24 left" */ + "fx_56", /* "32 left" */ + "fx_57", /* "40 left" */ + "fx_58", /* "warning, core unstable" */ + "fx_59", /* "bonus" */ + "fx_31", /* "chamber activated" */ + "fx_39a", /* "2000" */ + "fx_39b", /* "5000" */ + "fx_39c", /* "10000" */ + "fx_39d", /* "15000" */ + "fx_39e", /* "20000" */ + "fx_39f", /* "25000" */ + "fx_39g", /* "30000" */ + "fx_39h", /* "35000" */ + "fx_39i", /* "40000" */ + "fx_39j", /* "45000" */ + "fx_39k", /* "50000" */ + "fx_39l", /* "55000" */ 0 /* end of array */ }; static const char *const qbert_sample_names[] = { "*qbert", - "fx_17a.wav", /* random speech, voice clock 255 */ - "fx_17b.wav", /* random speech, voice clock 255 */ - "fx_17c.wav", /* random speech, voice clock 255 */ - "fx_17d.wav", /* random speech, voice clock 255 */ - "fx_17e.wav", /* random speech, voice clock 255 */ - "fx_17f.wav", /* random speech, voice clock 255 */ - "fx_17g.wav", /* random speech, voice clock 255 */ - "fx_17h.wav", /* random speech, voice clock 255 */ - "fx_18a.wav", /* random speech, voice clock 176 */ - "fx_18b.wav", /* random speech, voice clock 176 */ - "fx_18c.wav", /* random speech, voice clock 176 */ - "fx_18d.wav", /* random speech, voice clock 176 */ - "fx_18e.wav", /* random speech, voice clock 176 */ - "fx_18f.wav", /* random speech, voice clock 176 */ - "fx_18g.wav", /* random speech, voice clock 176 */ - "fx_18h.wav", /* random speech, voice clock 176 */ - "fx_19a.wav", /* random speech, voice clock 128 */ - "fx_19b.wav", /* random speech, voice clock 128 */ - "fx_19c.wav", /* random speech, voice clock 128 */ - "fx_19d.wav", /* random speech, voice clock 128 */ - "fx_19e.wav", /* random speech, voice clock 128 */ - "fx_19f.wav", /* random speech, voice clock 128 */ - "fx_19g.wav", /* random speech, voice clock 128 */ - "fx_19h.wav", /* random speech, voice clock 128 */ - "fx_20a.wav", /* random speech, voice clock 96 */ - "fx_20b.wav", /* random speech, voice clock 96 */ - "fx_20c.wav", /* random speech, voice clock 96 */ - "fx_20d.wav", /* random speech, voice clock 96 */ - "fx_20e.wav", /* random speech, voice clock 96 */ - "fx_20f.wav", /* random speech, voice clock 96 */ - "fx_20g.wav", /* random speech, voice clock 96 */ - "fx_20h.wav", /* random speech, voice clock 96 */ - "fx_21a.wav", /* random speech, voice clock 62 */ - "fx_21b.wav", /* random speech, voice clock 62 */ - "fx_21c.wav", /* random speech, voice clock 62 */ - "fx_21d.wav", /* random speech, voice clock 62 */ - "fx_21e.wav", /* random speech, voice clock 62 */ - "fx_21f.wav", /* random speech, voice clock 62 */ - "fx_21g.wav", /* random speech, voice clock 62 */ - "fx_21h.wav", /* random speech, voice clock 62 */ - "fx_22.wav", /* EH2 with decreasing voice clock */ - "fx_23.wav", /* O1 with varying voice clock */ - "fx_28.wav", - "fx_36.wav", - "knocker.wav", + "fx_17a", /* random speech, voice clock 255 */ + "fx_17b", /* random speech, voice clock 255 */ + "fx_17c", /* random speech, voice clock 255 */ + "fx_17d", /* random speech, voice clock 255 */ + "fx_17e", /* random speech, voice clock 255 */ + "fx_17f", /* random speech, voice clock 255 */ + "fx_17g", /* random speech, voice clock 255 */ + "fx_17h", /* random speech, voice clock 255 */ + "fx_18a", /* random speech, voice clock 176 */ + "fx_18b", /* random speech, voice clock 176 */ + "fx_18c", /* random speech, voice clock 176 */ + "fx_18d", /* random speech, voice clock 176 */ + "fx_18e", /* random speech, voice clock 176 */ + "fx_18f", /* random speech, voice clock 176 */ + "fx_18g", /* random speech, voice clock 176 */ + "fx_18h", /* random speech, voice clock 176 */ + "fx_19a", /* random speech, voice clock 128 */ + "fx_19b", /* random speech, voice clock 128 */ + "fx_19c", /* random speech, voice clock 128 */ + "fx_19d", /* random speech, voice clock 128 */ + "fx_19e", /* random speech, voice clock 128 */ + "fx_19f", /* random speech, voice clock 128 */ + "fx_19g", /* random speech, voice clock 128 */ + "fx_19h", /* random speech, voice clock 128 */ + "fx_20a", /* random speech, voice clock 96 */ + "fx_20b", /* random speech, voice clock 96 */ + "fx_20c", /* random speech, voice clock 96 */ + "fx_20d", /* random speech, voice clock 96 */ + "fx_20e", /* random speech, voice clock 96 */ + "fx_20f", /* random speech, voice clock 96 */ + "fx_20g", /* random speech, voice clock 96 */ + "fx_20h", /* random speech, voice clock 96 */ + "fx_21a", /* random speech, voice clock 62 */ + "fx_21b", /* random speech, voice clock 62 */ + "fx_21c", /* random speech, voice clock 62 */ + "fx_21d", /* random speech, voice clock 62 */ + "fx_21e", /* random speech, voice clock 62 */ + "fx_21f", /* random speech, voice clock 62 */ + "fx_21g", /* random speech, voice clock 62 */ + "fx_21h", /* random speech, voice clock 62 */ + "fx_22", /* EH2 with decreasing voice clock */ + "fx_23", /* O1 with varying voice clock */ + "fx_28", + "fx_36", + "knocker", 0 /* end of array */ }; @@ -1858,9 +1854,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(SYSTEM_CLOCK/4, GOTTLIEB_VIDEO_HCOUNT, 0, GOTTLIEB_VIDEO_HBLANK, GOTTLIEB_VIDEO_VCOUNT, 0, GOTTLIEB_VIDEO_VBLANK) - MCFG_SCREEN_UPDATE(gottlieb) + MCFG_SCREEN_UPDATE_STATIC(gottlieb) MCFG_GFXDECODE(gfxdecode) MCFG_PALETTE_LENGTH(16) @@ -1885,19 +1880,16 @@ static MACHINE_CONFIG_DERIVED( g2laser, gottlieb_core ) MCFG_FRAGMENT_ADD(gottlieb_soundrev2) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_PR8210, "screen", "ldsound") - MCFG_LASERDISC_AUDIO(laserdisc_audio_process) - MCFG_LASERDISC_OVERLAY(gottlieb, GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_PR8210_ADD("laserdisc") + MCFG_LASERDISC_AUDIO(laserdisc_audio_delegate(FUNC(laserdisc_audio_process), device)) + MCFG_LASERDISC_OVERLAY_STATIC(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, gottlieb) MCFG_LASERDISC_OVERLAY_CLIP(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8) - - MCFG_DEVICE_REMOVE("screen") - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) - - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) MCFG_SOUND_ROUTE(0, "mono", 1.0) /* right channel is processed as data */ -MACHINE_CONFIG_END + MCFG_DEVICE_REMOVE("screen") + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") +MACHINE_CONFIG_END /************************************* @@ -1935,8 +1927,18 @@ MCFG_VIDEO_START(screwloo) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( cobram3, gottlieb_core ) + MCFG_FRAGMENT_ADD(gottlieb_cobram3_soundrev2) -static MACHINE_CONFIG_DERIVED( cobram3, g2laser ) + MCFG_LASERDISC_PR8210_ADD("laserdisc") + MCFG_LASERDISC_AUDIO(laserdisc_audio_delegate(FUNC(laserdisc_audio_process), device)) + MCFG_LASERDISC_OVERLAY_STATIC(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, gottlieb) + MCFG_LASERDISC_OVERLAY_CLIP(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8) + MCFG_SOUND_ROUTE(0, "mono", 1.0) + /* right channel is processed as data */ + + MCFG_DEVICE_REMOVE("screen") + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") /* sound hardware */ MCFG_SOUND_MODIFY("dac1") @@ -1945,7 +1947,6 @@ MACHINE_CONFIG_END - /************************************* * * ROM definitions diff -Nru mame-0.144/src/mame/drivers/gotya.c mame-0.145/src/mame/drivers/gotya.c --- mame-0.144/src/mame/drivers/gotya.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gotya.c 2012-02-06 21:30:39.000000000 +0000 @@ -134,36 +134,36 @@ static const char *const sample_names[] = { // Address triggered at "*thehand", - "01.wav", /* game start tune */ // 075f - "02.wav", /* coin in */ // 0074 - "03.wav", /* eat dot */ // 0e45 - "05.wav", /* eat dollar sign */ // 0e45 + "01", /* game start tune */ // 075f + "02", /* coin in */ // 0074 + "03", /* eat dot */ // 0e45 + "05", /* eat dollar sign */ // 0e45 - "06.wav", /* door open */ // 19e1 - "07.wav", /* door close */ // 1965 + "06", /* door open */ // 19e1 + "07", /* door close */ // 1965 - "08.wav", /* theme song */ // 0821 - //"09.wav" // 1569 + "08", /* theme song */ // 0821 + //"09" // 1569 /* one of these two is played after eating the last dot */ - "0a.wav", /* piccolo */ // 17af - "0b.wav", /* tune */ // 17af + "0a", /* piccolo */ // 17af + "0b", /* tune */ // 17af - //"0f.wav" // 08ee - "10.wav", /* 'We're even. Bye Bye!' */ // 162a - "11.wav", /* 'You got me!' */ // 1657 - "12.wav", /* 'You have lost out' */ // 085e - - "13.wav", /* 'Rock' */ // 14de - "14.wav", /* 'Scissors' */ // 14f3 - "15.wav", /* 'Paper' */ // 1508 + //"0f" // 08ee + "10", /* 'We're even. Bye Bye!' */ // 162a + "11", /* 'You got me!' */ // 1657 + "12", /* 'You have lost out' */ // 085e + + "13", /* 'Rock' */ // 14de + "14", /* 'Scissors' */ // 14f3 + "15", /* 'Paper' */ // 1508 /* one of these is played when going by the girl between levels */ - "16.wav", /* 'Very good!' */ // 194a - "17.wav", /* 'Wonderful!' */ // 194a - "18.wav", /* 'Come on!' */ // 194a - "19.wav", /* 'I love you!' */ // 194a - "1a.wav", /* 'See you again!' */ // 194a + "16", /* 'Very good!' */ // 194a + "17", /* 'Wonderful!' */ // 194a + "18", /* 'Come on!' */ // 194a + "19", /* 'I love you!' */ // 194a + "1a", /* 'See you again!' */ // 194a 0 }; @@ -206,10 +206,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gotya) + MCFG_SCREEN_UPDATE_STATIC(gotya) MCFG_GFXDECODE(gotya) MCFG_PALETTE_LENGTH(16*4) diff -Nru mame-0.144/src/mame/drivers/gp_1.c mame-0.145/src/mame/drivers/gp_1.c --- mame-0.144/src/mame/drivers/gp_1.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gp_1.c 2012-02-06 21:30:38.000000000 +0000 @@ -2,6 +2,8 @@ Game Plan MPU-1 */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -9,18 +11,28 @@ { public: gp_1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gp_1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gp_1_map, AS_PROGRAM, 8, gp_1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( gp_1 ) INPUT_PORTS_END -static MACHINE_RESET( gp_1 ) +void gp_1_state::machine_reset() { } @@ -32,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 2457600) MCFG_CPU_PROGRAM_MAP(gp_1_map) - - MCFG_MACHINE_RESET( gp_1 ) MACHINE_CONFIG_END @@ -87,11 +97,11 @@ ROM_LOAD( "startrip.u13", 0x0800, 0x0800, CRC(b941a1a8) SHA1(a43f8acadb3db3e2274162d5305e30006f912339)) ROM_END -GAME(1978, blvelvet, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Black Velvet", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, camlight, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Camel Lights", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, chucklck, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Chuck-A-Luck", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, famlyfun, 0, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Family Fun!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, foxylady, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Foxy Lady", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, real, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Real", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, rio, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Rio", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, startrip, 0, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Star Trip", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1978, blvelvet, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Black Velvet", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, camlight, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Camel Lights", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, chucklck, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Chuck-A-Luck", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, famlyfun, 0, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Family Fun!", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, foxylady, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Foxy Lady", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, real, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Real", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, rio, gp_110, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Rio", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, startrip, 0, gp_1, gp_1, gp_1, ROT0, "Game Plan", "Star Trip", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gp_2.c mame-0.145/src/mame/drivers/gp_2.c --- mame-0.144/src/mame/drivers/gp_2.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gp_2.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,6 +1,9 @@ /* Game Plan MPU-2 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -8,18 +11,28 @@ { public: gp_2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gp_2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gp_2_map, AS_PROGRAM, 8, gp_2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( gp_2 ) INPUT_PORTS_END -static MACHINE_RESET( gp_2 ) +void gp_2_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 2457600) MCFG_CPU_PROGRAM_MAP(gp_2_map) - - MCFG_MACHINE_RESET( gp_2 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -237,20 +248,20 @@ ROM_LOAD( "140b.13", 0x0800, 0x0800, CRC(cf26d67b) SHA1(05481e880e23a7bc1d1716b52ac1effc0db437f2)) ROM_END -GAME(1984, agent777, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Agents 777", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, andromep, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Andromeda", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, andromepa, andromep, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Andromeda (alternate set)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, attila, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Attila The Hun", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, cpthook, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Captain Hook", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, cyclopes, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Cyclopes", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, gwarfare, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Global Warfare", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, ladyshot, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Lady Sharpshooter", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, ladyshota, ladyshot, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Lady Sharpshooter (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, mbossy, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Mike Bossy", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, coneyis, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Old Coney Island!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, lizard, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Pinball Lizard", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, sshootr2, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Sharp Shooter II", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, sshootep, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Sharpshooter", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, suprnova, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Super Nova", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, vegasgp, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Vegas (Game Plan)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1984, agent777, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Agents 777", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, andromep, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Andromeda", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, andromepa, andromep, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Andromeda (alternate set)",GAME_IS_SKELETON_MECHANICAL) +GAME(1984, attila, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Attila The Hun", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, cpthook, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Captain Hook", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, cyclopes, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Cyclopes", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, gwarfare, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Global Warfare", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, ladyshot, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Lady Sharpshooter", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, ladyshota, ladyshot, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Lady Sharpshooter (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, mbossy, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Mike Bossy", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, coneyis, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Old Coney Island!", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, lizard, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Pinball Lizard", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, sshootr2, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Sharp Shooter II", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, sshootep, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Sharpshooter", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, suprnova, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Super Nova", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, vegasgp, 0, gp_2, gp_2, gp_2, ROT0, "Game Plan", "Vegas (Game Plan)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gpworld.c mame-0.145/src/mame/drivers/gpworld.c --- mame-0.144/src/mame/drivers/gpworld.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gpworld.c 2012-02-06 21:30:39.000000000 +0000 @@ -41,14 +41,15 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" class gpworld_state : public driver_device { public: gpworld_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } UINT8 m_nmi_enable; UINT8 m_start_lamp; @@ -58,7 +59,7 @@ UINT8* m_tile_RAM; UINT8* m_sprite_RAM; UINT8* m_palette_RAM; - device_t *m_laserdisc; + required_device m_laserdisc; }; @@ -70,7 +71,7 @@ /* VIDEO GOODS */ -static void gpworld_draw_tiles(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void gpworld_draw_tiles(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { gpworld_state *state = machine.driver_data(); UINT8 characterX, characterY; @@ -88,24 +89,19 @@ } } -INLINE void draw_pixel(bitmap_t *bitmap,const rectangle *cliprect,int x,int y,int color,int flip) +INLINE void draw_pixel(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip) { if (flip) { - x = bitmap->width - x - 1; - y = bitmap->height - y - 1; + x = bitmap.width() - x - 1; + y = bitmap.height() - y - 1; } - if (x < cliprect->min_x || - x > cliprect->max_x || - y < cliprect->min_y || - y > cliprect->max_y) - return; - - *BITMAP_ADDR32(bitmap, y, x) = color; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = color; } -static void gpworld_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void gpworld_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { gpworld_state *state = machine.driver_data(); const int SPR_Y_TOP = 0; @@ -216,12 +212,12 @@ } -static SCREEN_UPDATE( gpworld ) +static SCREEN_UPDATE_IND16( gpworld ) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - gpworld_draw_tiles(screen->machine(), bitmap, cliprect); - gpworld_draw_sprites(screen->machine(), bitmap, cliprect); + gpworld_draw_tiles(screen.machine(), bitmap, cliprect); + gpworld_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -229,8 +225,6 @@ static MACHINE_START( gpworld ) { - gpworld_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } @@ -435,8 +429,8 @@ /* Do an NMI if the enabled bit is set */ if (state->m_nmi_enable) { - laserdisc_data_w(state->m_laserdisc,state->m_ldp_write_latch); - state->m_ldp_read_latch = laserdisc_data_r(state->m_laserdisc); + state->m_laserdisc->data_w(state->m_ldp_write_latch); + state->m_ldp_read_latch = state->m_laserdisc->status_r(); device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); } @@ -471,11 +465,11 @@ MCFG_MACHINE_START(gpworld) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(gpworld, 512, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(512, 256, gpworld) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_GFXDECODE(gpworld) MCFG_PALETTE_LENGTH(1024) @@ -483,7 +477,7 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/gradius3.c mame-0.145/src/mame/drivers/gradius3.c --- mame-0.144/src/mame/drivers/gradius3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gradius3.c 2012-02-06 21:30:35.000000000 +0000 @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(gradius3) + MCFG_SCREEN_UPDATE_STATIC(gradius3) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/grchamp.c mame-0.145/src/mame/drivers/grchamp.c --- mame-0.144/src/mame/drivers/grchamp.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/grchamp.c 2012-02-06 21:30:41.000000000 +0000 @@ -700,9 +700,8 @@ MCFG_GFXDECODE(grchamp) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(grchamp) + MCFG_SCREEN_UPDATE_STATIC(grchamp) MCFG_PALETTE_INIT(grchamp) MCFG_VIDEO_START(grchamp) diff -Nru mame-0.144/src/mame/drivers/gridlee.c mame-0.145/src/mame/drivers/gridlee.c --- mame-0.144/src/mame/drivers/gridlee.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gridlee.c 2012-02-06 21:30:39.000000000 +0000 @@ -406,8 +406,8 @@ static const char *const sample_names[] = { "*gridlee", - "bounce1.wav", - "bounce2.wav", + "bounce1", + "bounce2", 0 /* end of array */ }; @@ -437,9 +437,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(GRIDLEE_PIXEL_CLOCK, GRIDLEE_HTOTAL, GRIDLEE_HBEND, GRIDLEE_HBSTART, GRIDLEE_VTOTAL, GRIDLEE_VBEND, GRIDLEE_VBSTART) - MCFG_SCREEN_UPDATE(gridlee) + MCFG_SCREEN_UPDATE_STATIC(gridlee) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/groundfx.c mame-0.145/src/mame/drivers/groundfx.c --- mame-0.144/src/mame/drivers/groundfx.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/groundfx.c 2012-02-06 21:30:34.000000000 +0000 @@ -378,10 +378,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(groundfx) + MCFG_SCREEN_UPDATE_STATIC(groundfx) MCFG_GFXDECODE(groundfx) MCFG_PALETTE_LENGTH(16384) diff -Nru mame-0.144/src/mame/drivers/gstream.c mame-0.145/src/mame/drivers/gstream.c --- mame-0.144/src/mame/drivers/gstream.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gstream.c 2012-02-06 21:30:33.000000000 +0000 @@ -216,15 +216,15 @@ { if (offset >= 0x000 / 4 && offset < 0x400 / 4) { - tilemap_mark_tile_dirty(state->m_tilemap1, offset - (0x000 / 4)); + state->m_tilemap1->mark_tile_dirty(offset - (0x000 / 4)); } else if (offset >= 0x400 / 4 && offset < 0x800 / 4) { - tilemap_mark_tile_dirty(state->m_tilemap2, offset - (0x400 / 4)); + state->m_tilemap2->mark_tile_dirty(offset - (0x400 / 4)); } else if (offset >= 0x800 / 4 && offset < 0xc00 / 4) { - tilemap_mark_tile_dirty(state->m_tilemap3, offset - (0x800 / 4)); + state->m_tilemap3->mark_tile_dirty(offset - (0x800 / 4)); } } } @@ -469,11 +469,11 @@ state->m_tilemap2 = tilemap_create(machine, get_gs2_tile_info, tilemap_scan_rows, 32, 32, 16, 16); state->m_tilemap3 = tilemap_create(machine, get_gs3_tile_info, tilemap_scan_rows, 32, 32, 16, 16); - tilemap_set_transparent_pen(state->m_tilemap1, 0); - tilemap_set_transparent_pen(state->m_tilemap2, 0); + state->m_tilemap1->set_transparent_pen(0); + state->m_tilemap2->set_transparent_pen(0); } -static SCREEN_UPDATE(gstream) +static SCREEN_UPDATE_IND16(gstream) { /* The tilemaps and sprite are interleaved together. Even Words are tilemap tiles @@ -489,23 +489,23 @@ are being set ?! */ - gstream_state *state = screen->machine().driver_data(); + gstream_state *state = screen.machine().driver_data(); int i; //popmessage("(1) %08x %08x (2) %08x %08x (3) %08x %08x", state->m_tmap1_scrollx, state->m_tmap1_scrolly, state->m_tmap2_scrollx, state->m_tmap2_scrolly, state->m_tmap3_scrollx, state->m_tmap3_scrolly ); - tilemap_set_scrollx(state->m_tilemap3, 0, state->m_tmap3_scrollx >> 16); - tilemap_set_scrolly(state->m_tilemap3, 0, state->m_tmap3_scrolly >> 16); + state->m_tilemap3->set_scrollx(0, state->m_tmap3_scrollx >> 16); + state->m_tilemap3->set_scrolly(0, state->m_tmap3_scrolly >> 16); - tilemap_set_scrollx(state->m_tilemap1, 0, state->m_tmap1_scrollx >> 16); - tilemap_set_scrolly(state->m_tilemap1, 0, state->m_tmap1_scrolly >> 16); + state->m_tilemap1->set_scrollx(0, state->m_tmap1_scrollx >> 16); + state->m_tilemap1->set_scrolly(0, state->m_tmap1_scrolly >> 16); - tilemap_set_scrollx(state->m_tilemap2, 0, state->m_tmap2_scrollx >> 16); - tilemap_set_scrolly(state->m_tilemap2, 0, state->m_tmap2_scrolly >> 16); + state->m_tilemap2->set_scrollx(0, state->m_tmap2_scrollx >> 16); + state->m_tilemap2->set_scrolly(0, state->m_tmap2_scrolly >> 16); - tilemap_draw(bitmap, cliprect, state->m_tilemap3, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap2, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap1, 0, 0); + state->m_tilemap3->draw(bitmap, cliprect, 0, 0); + state->m_tilemap2->draw(bitmap, cliprect, 0, 0); + state->m_tilemap1->draw(bitmap, cliprect, 0, 0); for (i = 0x0000 / 4; i < 0x4000 / 4; i += 4) { @@ -519,7 +519,7 @@ if (x & 0x8000) x -= 0x10000; if (y & 0x8000) y -= 0x10000; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1],code,col,0,0,x-2,y,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1],code,col,0,0,x-2,y,0); } return 0; @@ -571,10 +571,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(gstream) + MCFG_SCREEN_UPDATE_STATIC(gstream) MCFG_PALETTE_LENGTH(0x1000 + 0x400 + 0x400 + 0x400) // sprites + 3 bg layers MCFG_GFXDECODE(gstream) diff -Nru mame-0.144/src/mame/drivers/gstriker.c mame-0.145/src/mame/drivers/gstriker.c --- mame-0.144/src/mame/drivers/gstriker.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gstriker.c 2012-02-06 21:30:35.000000000 +0000 @@ -557,10 +557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000) /* hand-tuned, it needs a bit */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(gstriker) + MCFG_SCREEN_UPDATE_STATIC(gstriker) MCFG_GFXDECODE(gstriker) MCFG_PALETTE_LENGTH(0x800) @@ -596,10 +595,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000) /* hand-tuned, it needs a bit */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(gstriker) + MCFG_SCREEN_UPDATE_STATIC(gstriker) MCFG_GFXDECODE(gstriker) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/gsword.c mame-0.145/src/mame/drivers/gsword.c --- mame-0.144/src/mame/drivers/gsword.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gsword.c 2012-02-06 21:30:39.000000000 +0000 @@ -688,10 +688,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gsword) + MCFG_SCREEN_UPDATE_STATIC(gsword) MCFG_GFXDECODE(gsword) MCFG_PALETTE_LENGTH(64*4+64*4) @@ -733,10 +732,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gsword) + MCFG_SCREEN_UPDATE_STATIC(gsword) MCFG_GFXDECODE(gsword) MCFG_PALETTE_LENGTH(64*4+64*4) diff -Nru mame-0.144/src/mame/drivers/gticlub.c mame-0.145/src/mame/drivers/gticlub.c --- mame-0.144/src/mame/drivers/gticlub.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gticlub.c 2012-02-06 21:30:41.000000000 +0000 @@ -816,10 +816,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(gticlub) + MCFG_SCREEN_UPDATE_STATIC(gticlub) MCFG_PALETTE_LENGTH(65536) @@ -917,18 +916,16 @@ MCFG_PALETTE_LENGTH(65536) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(hangplt) + MCFG_SCREEN_UPDATE_STATIC(hangplt) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(hangplt) + MCFG_SCREEN_UPDATE_STATIC(hangplt) MCFG_K001604_ADD("k001604_1", hangplt_k001604_intf_l) MCFG_K001604_ADD("k001604_2", hangplt_k001604_intf_r) diff -Nru mame-0.144/src/mame/drivers/gts1.c mame-0.145/src/mame/drivers/gts1.c --- mame-0.144/src/mame/drivers/gts1.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gts1.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,6 +1,9 @@ /* Gottlieb System 1 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/pps4/pps4.h" @@ -8,18 +11,28 @@ { public: gts1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gts1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gts1_map, AS_PROGRAM, 8, gts1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( gts1 ) INPUT_PORTS_END -static MACHINE_RESET( gts1 ) +void gts1_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", PPS4, 198864) MCFG_CPU_PROGRAM_MAP(gts1_map) - - MCFG_MACHINE_RESET( gts1 ) MACHINE_CONFIG_END @@ -285,27 +296,28 @@ ROM_LOAD("test.cpu", 0x2000, 0x0400, CRC(8b0704bb) SHA1(5f0eb8d5af867b815b6012c9d078927398efe6d8)) ROM_END + GAME(1977, gts1, 0, gts1, gts1, gts1, ROT0, "Gottlieb", "System 1", GAME_IS_BIOS_ROOT) //Exact same roms as gts1 with added hardware we'll likely need roms for to emulate properly GAME(1979, gts1s, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "System 1 with sound board", GAME_IS_BIOS_ROOT) -GAME(1980, astannie, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Asteroid Annie and the Aliens", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, buckrgrs, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Buck Rogers", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, charlies, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Charlie's Angels", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1977, cleoptra, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Cleopatra", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, closeenc, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Close Encounters of the Third Kind", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, countdwn, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Count-Down", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, dragon, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Dragon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, geniep, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Genie (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, jokrpokr, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Joker Poker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, pinpool, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Pinball Pool", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, roldisco, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Roller Disco", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, sinbad, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Sinbad", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, sinbadn, sinbad, gts1, gts1, gts1, ROT0, "Gottlieb", "Sinbad (Norway)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, solaride, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Solar Ride", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, hulk, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Incredible Hulk,The", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, torch, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Torch", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, totem, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Totem", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, hexagone, gts1s, gts1, gts1, gts1, ROT0, "Christian Tabart (France)", "L'Hexagone", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, sys1test, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "System 1 Test prom", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1980, astannie, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Asteroid Annie and the Aliens", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, buckrgrs, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Buck Rogers", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, charlies, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Charlie's Angels", GAME_IS_SKELETON_MECHANICAL) +GAME(1977, cleoptra, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Cleopatra", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, closeenc, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Close Encounters of the Third Kind", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, countdwn, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Count-Down", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, dragon, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Dragon", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, geniep, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Genie (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, jokrpokr, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Joker Poker", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, pinpool, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Pinball Pool", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, roldisco, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Roller Disco", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, sinbad, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Sinbad", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, sinbadn, sinbad, gts1, gts1, gts1, ROT0, "Gottlieb", "Sinbad (Norway)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, solaride, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "Solar Ride", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, hulk, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Incredible Hulk,The", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, torch, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Torch", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, totem, gts1s, gts1, gts1, gts1, ROT0, "Gottlieb", "Totem", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, hexagone, gts1s, gts1, gts1, gts1, ROT0, "Christian Tabart (France)", "L'Hexagone", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, sys1test, gts1, gts1, gts1, gts1, ROT0, "Gottlieb", "System 1 Test prom", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gts3.c mame-0.145/src/mame/drivers/gts3.c --- mame-0.144/src/mame/drivers/gts3.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gts3.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,6 +1,9 @@ /* Gottlieb System 3 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m65ce02.h" @@ -8,18 +11,28 @@ { public: gts3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gts3_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gts3_map, AS_PROGRAM, 8, gts3_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( gts3 ) INPUT_PORTS_END -static MACHINE_RESET( gts3 ) +void gts3_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M65C02, 2000000) MCFG_CPU_PROGRAM_MAP(gts3_map) - - MCFG_MACHINE_RESET( gts3 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -345,7 +356,7 @@ ROM_END /*------------------------------------------------------------------- -/ Operation Thunder (#732) +/ Operation: Thunder (#732) /-------------------------------------------------------------------*/ ROM_START(opthund) ROM_REGION(0x10000, "maincpu", 0) @@ -902,54 +913,54 @@ ROM_END -GAME(1996, barbwire, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Barb Wire", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, bellring, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Bell Ringer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, brooks, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Brooks & Dunn (rev.T1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, cactjack, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Cactus Jack's", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, carhop, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Car Hop", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, ccruise, 0, gts3, gts3, gts3, ROT0, "International Concepts","Caribbean Cruise", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, clas1812, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Class of 1812", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, cueball, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Cue Ball Wizard", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, deadweap, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Deadly Weapon", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, bighurt, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Frank Thomas' Big Hurt (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, freddy, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Freddy: A Nightmare on Elm Street (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, freddy4, freddy, gts3, gts3, gts3, ROT0, "Gottlieb", "Freddy: A Nightmare on Elm Street (rev.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, gladiatp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Gladiators", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, hoops, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Hoops", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, lca, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Lights...Camera...Action!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, lca2, lca, gts3, gts3, gts3, ROT0, "Gottlieb", "Lights...Camera...Action! (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, andretti, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Mario Andretti", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, andretti4, andretti, gts3, gts3, gts3, ROT0, "Gottlieb", "Mario Andretti (rev.T4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, nudgeit, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Nudge-It", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, opthund, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Operation Thunder", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rescu911, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Rescue 911 (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, shaqattq, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Shaq Attaq (rev.5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, shaqattq2, shaqattq, gts3, gts3, gts3, ROT0, "Gottlieb", "Shaq Attaq (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, silvslug, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Silver Slugger", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, stargatp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, stargatp1, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, stargatp2, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, stargatp3, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, stargatp4, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sfight2, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sfight2a, sfight2, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2 (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sfight2b, sfight2, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2 (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, smb, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, smb1, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, smb2, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, smb3, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, smbmush, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers Mushroom World", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, surfnsaf, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Surf'n Safari", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, teedoffp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, teedoffp1, teedoffp, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, teedoffp3, teedoffp, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, tfight, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Title Fight", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, vegas, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Vegas", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, waterwld, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Waterworld (rev.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, waterwld2, waterwld, gts3, gts3, gts3, ROT0, "Gottlieb", "Waterworld (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, wipeout, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Wipeout (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wcsoccer, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "World Challenge Soccer (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wcsoccerd2, wcsoccer, gts3, gts3, gts3, ROT0, "Gottlieb", "World Challenge Soccer (disp.rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, tt_game, 0, gts3, gts3, gts3, ROT0, "Toptronic", "unknown Toptronic pinball game", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, snspares, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Strikes n' Spares (rev.6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, snspares1, snspares, gts3, gts3, gts3, ROT0, "Gottlieb", "Strikes n' Spares (rev.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1996, barbwire, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Barb Wire", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, bellring, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Bell Ringer", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, brooks, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Brooks & Dunn (rev.T1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, cactjack, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Cactus Jack's", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, carhop, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Car Hop", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, ccruise, 0, gts3, gts3, gts3, ROT0, "International Concepts","Caribbean Cruise", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, clas1812, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Class of 1812", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, cueball, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Cue Ball Wizard", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, deadweap, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Deadly Weapon", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, bighurt, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Frank Thomas' Big Hurt (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, freddy, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Freddy: A Nightmare on Elm Street (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, freddy4, freddy, gts3, gts3, gts3, ROT0, "Gottlieb", "Freddy: A Nightmare on Elm Street (rev.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, gladiatp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Gladiators", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, hoops, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Hoops", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, lca, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Lights...Camera...Action!", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, lca2, lca, gts3, gts3, gts3, ROT0, "Gottlieb", "Lights...Camera...Action! (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, andretti, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Mario Andretti", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, andretti4, andretti, gts3, gts3, gts3, ROT0, "Gottlieb", "Mario Andretti (rev.T4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, nudgeit, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Nudge-It", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, opthund, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Operation: Thunder", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rescu911, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Rescue 911 (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, shaqattq, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Shaq Attaq (rev.5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, shaqattq2, shaqattq, gts3, gts3, gts3, ROT0, "Gottlieb", "Shaq Attaq (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, silvslug, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Silver Slugger", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, stargatp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, stargatp1, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, stargatp2, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, stargatp3, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, stargatp4, stargatp, gts3, gts3, gts3, ROT0, "Gottlieb", "Stargate (rev.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sfight2, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sfight2a, sfight2, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2 (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sfight2b, sfight2, gts3, gts3, gts3, ROT0, "Gottlieb", "Street Fighter 2 (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, smb, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, smb1, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, smb2, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, smb3, smb, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, smbmush, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Super Mario Brothers Mushroom World", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, surfnsaf, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Surf'n Safari", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, teedoffp, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, teedoffp1, teedoffp, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, teedoffp3, teedoffp, gts3, gts3, gts3, ROT0, "Gottlieb", "Tee'd Off (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, tfight, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Title Fight", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, vegas, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Vegas", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, waterwld, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Waterworld (rev.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, waterwld2, waterwld, gts3, gts3, gts3, ROT0, "Gottlieb", "Waterworld (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, wipeout, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Wipeout (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wcsoccer, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "World Challenge Soccer (rev.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wcsoccerd2, wcsoccer, gts3, gts3, gts3, ROT0, "Gottlieb", "World Challenge Soccer (disp.rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, tt_game, 0, gts3, gts3, gts3, ROT0, "Toptronic", "unknown Toptronic pinball game", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, snspares, 0, gts3, gts3, gts3, ROT0, "Gottlieb", "Strikes n' Spares (rev.6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, snspares1, snspares, gts3, gts3, gts3, ROT0, "Gottlieb", "Strikes n' Spares (rev.1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gts80a.c mame-0.145/src/mame/drivers/gts80a.c --- mame-0.144/src/mame/drivers/gts80a.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gts80a.c 2012-02-06 21:30:39.000000000 +0000 @@ -4,6 +4,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m6502.h" #include "cpu/i86/i86.h" @@ -12,17 +14,41 @@ { public: gts80a_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); +}; + +class caveman_state : public gts80a_state +{ +public: + caveman_state(const machine_config &mconfig, device_type type, const char *tag) + : gts80a_state(mconfig, type, tag), + m_videocpu(*this, "video_cpu") + { } + +protected: + + // devices + required_device m_videocpu; }; -static ADDRESS_MAP_START( gts80a_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gts80a_map, AS_PROGRAM, 8, gts80a_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0xc000) AM_ROM /* PROM */ AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0xc000) AM_ROM /* u2 ROM */ AM_RANGE(0x3000, 0x3fff) AM_MIRROR(0xc000) AM_ROM /* u3 ROM */ ADDRESS_MAP_END -static ADDRESS_MAP_START( caveman_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( caveman_map, AS_PROGRAM, 8, gts80a_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0xc000) AM_ROM /* PROM */ AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0xc000) AM_ROM /* u2 ROM */ @@ -35,7 +61,7 @@ static INPUT_PORTS_START( caveman ) INPUT_PORTS_END -static MACHINE_RESET( gts80a ) +void gts80a_state::machine_reset() { } @@ -48,8 +74,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80a_map) - MCFG_MACHINE_RESET( gts80a ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_s) MACHINE_CONFIG_END @@ -59,29 +83,25 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80a_map) - MCFG_MACHINE_RESET( gts80a ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_ss) MACHINE_CONFIG_END -static ADDRESS_MAP_START( video_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( video_map, AS_PROGRAM, 16, caveman_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x08000, 0x0ffff) AM_ROM AM_RANGE(0xf8000, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( video_io_map, AS_IO, 16 ) +static ADDRESS_MAP_START( video_io_map, AS_IO, 16, caveman_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END -static MACHINE_CONFIG_START( caveman, gts80a_state ) +static MACHINE_CONFIG_START( caveman, caveman_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(caveman_map) - MCFG_MACHINE_RESET( gts80a ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_ss) @@ -629,27 +649,28 @@ ROM_RELOAD( 0xf800, 0x0800) ROM_END -/* disp3 */GAME(1984, alienstr, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Alien Star", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, amazonh, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Amazon Hunt", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1981, dvlsdre, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Devil's Dare", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1981, dvlsdre2, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Devil's Dare (Sound Only)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1984, eldorado, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "El Dorado City of Gold", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1983, goinnuts, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Goin' Nuts", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1985, icefever, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Ice Fever", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1984, jack2opn, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Jacks to Open", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1983, krullp, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Krull (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1982, punk, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Punk!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, qbquest, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Q*Bert's Quest", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, rackempp, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Rack 'Em Up (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, raimfire, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Ready...Aim...Fire!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1982, rocky, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Rocky", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, rflshdlx, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Royal Flush Deluxe", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1982, spirit, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Spirit", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1982, striker, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Striker", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1983, sorbit, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Super Orbit", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1984, thegames, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "The Games", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp3 */GAME(1984, touchdn, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Touchdown", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +/* disp3 */GAME(1984, alienstr, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Alien Star", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, amazonh, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Amazon Hunt", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1981, dvlsdre, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Devil's Dare", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1981, dvlsdre2, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Devil's Dare (Sound Only)", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1984, eldorado, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "El Dorado City of Gold", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1983, goinnuts, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Goin' Nuts", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1985, icefever, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Ice Fever", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1984, jack2opn, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Jacks to Open", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1983, krullp, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Krull (Pinball)", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1982, punk, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Punk!", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, qbquest, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Q*Bert's Quest", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, rackempp, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Rack 'em Up! (Pinball)", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, raimfire, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Ready...Aim...Fire!", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1982, rocky, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Rocky", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, rflshdlx, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Royal Flush Deluxe", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1982, spirit, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Spirit", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1982, striker, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Striker", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1983, sorbit, 0, gts80a_ss, gts80a, gts80a, ROT0, "Gottlieb", "Super Orbit", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1984, thegames, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "The Games", GAME_IS_SKELETON_MECHANICAL) +/* disp3 */GAME(1984, touchdn, 0, gts80a_s, gts80a, gts80a, ROT0, "Gottlieb", "Touchdown", GAME_IS_SKELETON_MECHANICAL) /* custom (+video) */ -GAME(1981, caveman, 0, caveman, caveman, gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, cavemana, caveman, caveman, caveman, gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1981, caveman, 0, caveman, caveman, gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, cavemana, caveman, caveman, caveman, gts80a, ROT0, "Gottlieb", "Caveman (Pinball/Video Combo, set 2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gts80b.c mame-0.145/src/mame/drivers/gts80b.c --- mame-0.144/src/mame/drivers/gts80b.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gts80b.c 2012-02-06 21:30:39.000000000 +0000 @@ -4,6 +4,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m6502.h" @@ -11,10 +13,20 @@ { public: gts80b_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gts80b_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gts80b_map, AS_PROGRAM, 8, gts80b_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0xc000) AM_ROM /* PROM */ AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0xc000) AM_ROM /* u2 ROM */ @@ -25,7 +37,7 @@ static INPUT_PORTS_START( gts80b ) INPUT_PORTS_END -static MACHINE_RESET( gts80b ) +void gts80b_state::machine_reset() { } @@ -39,8 +51,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80b_map) - MCFG_MACHINE_RESET( gts80b ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_s) MACHINE_CONFIG_END @@ -50,8 +60,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80b_map) - MCFG_MACHINE_RESET( gts80b ) - /* related to src/mame/audio/gottlieb.c? */ // MCFG_IMPORT_FROM(gts80s_b1) MACHINE_CONFIG_END @@ -61,8 +69,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80b_map) - MCFG_MACHINE_RESET( gts80b ) - /* related to src/mame/audio/gottlieb.c? */ // MCFG_IMPORT_FROM(gts80s_b2) MACHINE_CONFIG_END @@ -72,8 +78,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80b_map) - MCFG_MACHINE_RESET( gts80b ) - /* related to src/mame/audio/gottlieb.c? */ // MCFG_IMPORT_FROM(gts80s_b3) MACHINE_CONFIG_END @@ -83,8 +87,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80b_map) - MCFG_MACHINE_RESET( gts80b ) - /* related to src/mame/audio/gottlieb.c? */ // MCFG_IMPORT_FROM(gts80s_b3a) MACHINE_CONFIG_END @@ -575,27 +577,28 @@ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(921a100e) SHA1(0c3c7eae4ceeb5a1a8150bac52203d3f1e8f917e)) ROM_END -GAME(1987, arena, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Arena", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, badgirls, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Bad Girls", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bighouse, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Big House", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bonebstr, 0, bonebstr, gts80b, gts80b, ROT0, "Gottlieb", "Bone Busters Inc.", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Bounty Hunter", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, triplay, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Triple Play", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, diamondp, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Diamond Lady", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, excalibr, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Excalibur", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, genesisp, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Genesis", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, goldwing, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Gold Wings", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, hlywoodh, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Hollywood Heat", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, hotshots, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Hot Shots", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, mntecrlo, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, nmoves, 0, gts80b_s2, gts80b, gts80b, ROT0, "International Concepts", "Night Moves", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, raven, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Raven", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, robowars, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Robo-War", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, rock, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Rock", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, rock_enc, rock, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Rock Encore", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, sprbreak, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Spring Break", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, sprbreaks, sprbreak,gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Spring Break (single ball game)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, tagteamp, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, tagteamp2, tagteamp, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, txsector, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "TX-Sector", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, victoryp, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Victory (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1987, arena, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Arena", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, badgirls, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Bad Girls", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bighouse, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Big House", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bonebstr, 0, bonebstr, gts80b, gts80b, ROT0, "Gottlieb", "Bone Busters Inc.", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Bounty Hunter", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, triplay, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Triple Play", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, diamondp, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Diamond Lady", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, excalibr, 0, gts80b_s3, gts80b, gts80b, ROT0, "Gottlieb", "Excalibur", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, genesisp, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Genesis", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, goldwing, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Gold Wings", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, hlywoodh, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Hollywood Heat", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, hotshots, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Hot Shots", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, mntecrlo, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, nmoves, 0, gts80b_s2, gts80b, gts80b, ROT0, "International Concepts", "Night Moves", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, raven, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Raven", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, robowars, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Robo-War", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, rock, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Rock", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, rock_enc, rock, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Rock Encore", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, sprbreak, 0, gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Spring Break", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, sprbreaks, sprbreak,gts80b_s1, gts80b, gts80b, ROT0, "Gottlieb", "Spring Break (single ball game)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, tagteamp, 0, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, tagteamp2, tagteamp, gts80b_s, gts80b, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, txsector, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "TX-Sector", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, victoryp, 0, gts80b_s2, gts80b, gts80b, ROT0, "Gottlieb", "Victory (Pinball)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/gts80.c mame-0.145/src/mame/drivers/gts80.c --- mame-0.144/src/mame/drivers/gts80.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gts80.c 2012-02-06 21:30:40.000000000 +0000 @@ -4,6 +4,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m6502.h" @@ -11,10 +13,20 @@ { public: gts80_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( gts80_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( gts80_map, AS_PROGRAM, 8, gts80_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x1000, 0x17ff) AM_MIRROR(0xc000) AM_ROM AM_RANGE(0x2000, 0x2fff) AM_MIRROR(0xc000) AM_ROM @@ -25,7 +37,7 @@ static INPUT_PORTS_START( gts80 ) INPUT_PORTS_END -static MACHINE_RESET( gts80 ) +void gts80_state::machine_reset() { } @@ -39,8 +51,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80_map) - MCFG_MACHINE_RESET( gts80 ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_s) MACHINE_CONFIG_END @@ -52,8 +62,6 @@ MCFG_CPU_ADD("maincpu", M6502, 850000) MCFG_CPU_PROGRAM_MAP(gts80_map) - MCFG_MACHINE_RESET( gts80 ) - /* related to src/mame/audio/gottlieb.c */ // MCFG_IMPORT_FROM(gts80s_ss) MACHINE_CONFIG_END @@ -682,24 +690,24 @@ ROM_LOAD("80tst-s2.snd", 0x7800, 0x0800, CRC(1a4b1e9d) SHA1(18e7ffbdbdaf83ab1c8daa5fa5201d9f54390758)) ROM_END -/* disp2 */GAME(1981, blckhole, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Rev. 4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1981, blckhole2, blckhole, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Rev. 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1981, blckhols, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Sound Only)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1980, circusp, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Circus", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1980, cntforce, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Counterforce", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1981, eclipse, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Eclipse", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, forceii, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Force II", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1982, hh, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Haunted House (Rev. 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1982, hh_1, hh, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Haunted House (Rev. 1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1980, jamesb, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "James Bond (Timed Play)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp2 */GAME(1980, jamesb2, jamesb, gts80_s, gts80, gts80, ROT0, "Gottlieb", "James Bond (3/5-Ball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, marsp, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Mars - God of War", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1980, panthera, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Panthera", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1981, pnkpnthr, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Pink Panther", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1980, starrace, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Star Race", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1980, spidermn, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "The Amazing Spider-Man", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* cust */GAME(1980, timeline, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Time Line", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, vlcno_ax, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Volcano", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, vlcno_1b, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Volcano (Sound Only)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, vlcno_1a, vlcno_1b, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Volcano (Sound Only, alternate version)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -/* disp1 */GAME(1981, s80tst, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "System 80 Test", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +/* disp2 */GAME(1981, blckhole, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Rev. 4)", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1981, blckhole2, blckhole, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Rev. 2)", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1981, blckhols, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Black Hole (Sound Only)", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1980, circusp, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Circus", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1980, cntforce, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Counterforce", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1981, eclipse, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Eclipse", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, forceii, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Force II", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1982, hh, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Haunted House (Rev. 2)", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1982, hh_1, hh, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Haunted House (Rev. 1)", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1980, jamesb, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "James Bond (Timed Play)", GAME_IS_SKELETON_MECHANICAL) +/* disp2 */GAME(1980, jamesb2, jamesb, gts80_s, gts80, gts80, ROT0, "Gottlieb", "James Bond (3/5-Ball)", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, marsp, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Mars - God of War", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1980, panthera, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Panthera", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1981, pnkpnthr, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Pink Panther", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1980, starrace, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Star Race", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1980, spidermn, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "The Amazing Spider-Man", GAME_IS_SKELETON_MECHANICAL) +/* cust */GAME(1980, timeline, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Time Line", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, vlcno_ax, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "Volcano", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, vlcno_1b, 0, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Volcano (Sound Only)", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, vlcno_1a, vlcno_1b, gts80_s, gts80, gts80, ROT0, "Gottlieb", "Volcano (Sound Only, alternate version)", GAME_IS_SKELETON_MECHANICAL) +/* disp1 */GAME(1981, s80tst, 0, gts80_ss, gts80, gts80, ROT0, "Gottlieb", "System 80 Test", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/guab.c mame-0.145/src/mame/drivers/guab.c --- mame-0.144/src/mame/drivers/guab.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/guab.c 2012-02-06 21:30:38.000000000 +0000 @@ -243,7 +243,7 @@ } -static SCREEN_UPDATE( guab ) +static SCREEN_UPDATE_IND16( guab ) { int x, y; struct tms34061_display state; @@ -253,22 +253,22 @@ /* If blanked, fill with black */ if (state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT8 *src = &state.vram[256 * y]; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { UINT8 pen = src[x >> 1]; /* Draw two 4-bit pixels */ - *dest++ = screen->machine().pens[pen >> 4]; - *dest++ = screen->machine().pens[pen & 0x0f]; + *dest++ = screen.machine().pens[pen >> 4]; + *dest++ = screen.machine().pens[pen & 0x0f]; } } @@ -797,10 +797,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(guab) + MCFG_SCREEN_UPDATE_STATIC(guab) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/gumbo.c mame-0.145/src/mame/drivers/gumbo.c --- mame-0.144/src/mame/drivers/gumbo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gumbo.c 2012-02-06 21:30:40.000000000 +0000 @@ -238,10 +238,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gumbo) + MCFG_SCREEN_UPDATE_STATIC(gumbo) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/gunbustr.c mame-0.145/src/mame/drivers/gunbustr.c --- mame-0.144/src/mame/drivers/gunbustr.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/gunbustr.c 2012-02-06 21:30:38.000000000 +0000 @@ -353,10 +353,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(gunbustr) + MCFG_SCREEN_UPDATE_STATIC(gunbustr) MCFG_GFXDECODE(gunbustr) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/gundealr.c mame-0.145/src/mame/drivers/gundealr.c --- mame-0.144/src/mame/drivers/gundealr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/gundealr.c 2012-02-06 21:30:39.000000000 +0000 @@ -421,10 +421,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gundealr) + MCFG_SCREEN_UPDATE_STATIC(gundealr) MCFG_GFXDECODE(gundealr) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/gunpey.c mame-0.145/src/mame/drivers/gunpey.c --- mame-0.144/src/mame/drivers/gunpey.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gunpey.c 2012-02-06 21:30:41.000000000 +0000 @@ -68,9 +68,9 @@ state->m_blit_buffer = auto_alloc_array(machine, UINT16, 512*512); } -static SCREEN_UPDATE( gunpey ) +static SCREEN_UPDATE_RGB32( gunpey ) { - gunpey_state *state = screen->machine().driver_data(); + gunpey_state *state = screen.machine().driver_data(); UINT16 *blit_buffer = state->m_blit_buffer; int x,y; int count; @@ -89,8 +89,8 @@ g = (color & 0x03e0) >> 2; r = (color & 0x7c00) >> 7; - if(xvisible_area().max_x && yvisible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = b | (g<<8) | (r<<16); + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = b | (g<<8) | (r<<16); count++; @@ -340,10 +340,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1) - MCFG_SCREEN_UPDATE(gunpey) + MCFG_SCREEN_UPDATE_STATIC(gunpey) MCFG_PALETTE_LENGTH(0x800) MCFG_PALETTE_INIT(gunpey) diff -Nru mame-0.144/src/mame/drivers/gunsmoke.c mame-0.145/src/mame/drivers/gunsmoke.c --- mame-0.144/src/mame/drivers/gunsmoke.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/gunsmoke.c 2012-02-06 21:30:41.000000000 +0000 @@ -312,7 +312,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) @@ -321,7 +320,7 @@ MCFG_PALETTE_INIT(gunsmoke) MCFG_VIDEO_START(gunsmoke) - MCFG_SCREEN_UPDATE(gunsmoke) + MCFG_SCREEN_UPDATE_STATIC(gunsmoke) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/gyruss.c mame-0.145/src/mame/drivers/gyruss.c --- mame-0.144/src/mame/drivers/gyruss.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/gyruss.c 2012-02-06 21:30:37.000000000 +0000 @@ -62,6 +62,7 @@ #include "cpu/mcs48/mcs48.h" #include "sound/ay8910.h" #include "sound/discrete.h" +#include "includes/konamipt.h" #include "includes/gyruss.h" @@ -143,6 +144,19 @@ device_set_input_line(state->m_audiocpu_2, 0, ASSERT_LINE); } +static WRITE8_HANDLER( master_nmi_mask_w ) +{ + gyruss_state *state = space->machine().driver_data(); + + state->m_master_nmi_mask = data & 1; +} + +static WRITE8_HANDLER( slave_irq_mask_w ) +{ + gyruss_state *state = space->machine().driver_data(); + + state->m_slave_irq_mask = data & 1; +} static ADDRESS_MAP_START( main_cpu1_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM @@ -156,13 +170,13 @@ AM_RANGE(0xc0c0, 0xc0c0) AM_READ_PORT("P2") AM_RANGE(0xc0e0, 0xc0e0) AM_READ_PORT("DSW1") AM_RANGE(0xc100, 0xc100) AM_READ_PORT("DSW3") AM_WRITE(soundlatch_w) - AM_RANGE(0xc180, 0xc180) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xc180, 0xc180) AM_WRITE(master_nmi_mask_w) AM_RANGE(0xc185, 0xc185) AM_WRITEONLY AM_BASE_MEMBER(gyruss_state, m_flipscreen) ADDRESS_MAP_END static ADDRESS_MAP_START( main_cpu2_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0000) AM_READ(gyruss_scanline_r) - AM_RANGE(0x2000, 0x2000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x2000, 0x2000) AM_WRITE(slave_irq_mask_w) AM_RANGE(0x4000, 0x403f) AM_RAM AM_RANGE(0x4040, 0x40ff) AM_RAM_WRITE(gyruss_spriteram_w) AM_BASE_MEMBER(gyruss_state, m_spriteram) AM_RANGE(0x4100, 0x47ff) AM_RAM @@ -238,54 +252,21 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW1") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3,4") - PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) ) - PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:5,6,7,8") - PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) ) - PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( Free_Play ), SW1) PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "255 (Cheat)") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */ - PORT_DIPSETTING( 0x08, "30k 90k 60k+" ) /* last bonus life at 810k : max. 14 bonus lives */ - PORT_DIPSETTING( 0x00, "40k 110k 70k+" ) /* last bonus life at 810k : max. 12 bonus lives */ - PORT_DIPNAME( 0x70, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */ + PORT_DIPSETTING( 0x08, "30k 90k 60k+" ) /* last bonus life at 810k : max. 14 bonus lives */ + PORT_DIPSETTING( 0x00, "40k 110k 70k+" ) /* last bonus life at 810k : max. 12 bonus lives */ + PORT_DIPNAME( 0x70, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") PORT_DIPSETTING( 0x70, "1 (Easiest)" ) PORT_DIPSETTING( 0x60, "2" ) PORT_DIPSETTING( 0x50, "3" ) @@ -294,24 +275,25 @@ PORT_DIPSETTING( 0x20, "6" ) PORT_DIPSETTING( 0x10, "7" ) PORT_DIPSETTING( 0x00, "8 (Hardest)" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x00, "Demo Music" ) PORT_DIPLOCATION("SW3:1") + PORT_DIPNAME( 0x01, 0x00, "Demo Music" ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END static INPUT_PORTS_START( gyrussce ) PORT_INCLUDE( gyruss ) PORT_MODIFY("DSW2") - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */ - PORT_DIPSETTING( 0x08, "50k 120k 70k+" ) /* last bonus life at 960k : max. 14 bonus lives */ - PORT_DIPSETTING( 0x00, "60k 140k 80k+" ) /* last bonus life at 940k : max. 12 bonus lives */ - PORT_DIPNAME( 0x70, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") /* "Difficult" default setting according to Centuri manual */ + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:3") /* tables at 0x1653 (15 bytes) or 0x4bf3 (13 bytes) */ + PORT_DIPSETTING( 0x08, "50k 120k 70k+" ) /* last bonus life at 960k : max. 14 bonus lives */ + PORT_DIPSETTING( 0x00, "60k 140k 80k+" ) /* last bonus life at 940k : max. 12 bonus lives */ + PORT_DIPNAME( 0x70, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") /* "Difficult" default setting according to Centuri manual */ PORT_DIPSETTING( 0x70, "1 (Easiest)" ) PORT_DIPSETTING( 0x60, "2" ) PORT_DIPSETTING( 0x50, "3" ) @@ -505,16 +487,32 @@ state->m_audiocpu_2 = machine.device("audio2"); } +static INTERRUPT_GEN( master_vblank_irq ) +{ + gyruss_state *state = device->machine().driver_data(); + + if(state->m_master_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + +static INTERRUPT_GEN( slave_vblank_irq ) +{ + gyruss_state *state = device->machine().driver_data(); + + if(state->m_slave_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( gyruss, gyruss_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz (?) */ MCFG_CPU_PROGRAM_MAP(main_cpu1_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", master_vblank_irq) MCFG_CPU_ADD("sub", M6809, 2000000) /* 2 MHz ??? */ MCFG_CPU_PROGRAM_MAP(main_cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", slave_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(audio_cpu1_map) @@ -532,10 +530,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gyruss) + MCFG_SCREEN_UPDATE_STATIC(gyruss) MCFG_GFXDECODE(gyruss) MCFG_PALETTE_LENGTH(16*4+16*16) diff -Nru mame-0.144/src/mame/drivers/halleys.c mame-0.145/src/mame/drivers/halleys.c --- mame-0.144/src/mame/drivers/halleys.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/halleys.c 2012-02-06 21:30:38.000000000 +0000 @@ -1245,7 +1245,7 @@ } -static void copy_scroll_op(bitmap_t *bitmap, UINT16 *source, int sx, int sy) +static void copy_scroll_op(bitmap_ind16 &bitmap, UINT16 *source, int sx, int sy) { //-------------------------------------------------------------------------- @@ -1268,8 +1268,8 @@ if ((bch = CLIP_H - sy) < 0) bch = 0; esi = source + CLIP_SKIP + (sy << SCREEN_WIDTH_L2); - edi = BITMAP_ADDR16(bitmap, VIS_MINY, VIS_MINX); - edx = bitmap->rowpixels; + edi = &bitmap.pix16(VIS_MINY, VIS_MINX); + edx = bitmap.rowpixels(); // draw top split for (ecx=bch; ecx; ecx--) OPCOPY_COMMON @@ -1283,7 +1283,7 @@ } -static void copy_scroll_xp(bitmap_t *bitmap, UINT16 *source, int sx, int sy) +static void copy_scroll_xp(bitmap_ind16 &bitmap, UINT16 *source, int sx, int sy) { //-------------------------------------------------------------------------- @@ -1325,8 +1325,8 @@ if ((bch = CLIP_H - sy) < 0) bch = 0; src_base = source + CLIP_SKIP + (sy << SCREEN_WIDTH_L2); - edi = BITMAP_ADDR16(bitmap, VIS_MINY, VIS_MINX); - dst_adv = bitmap->rowpixels - CLIP_W; + edi = &bitmap.pix16(VIS_MINY, VIS_MINX); + dst_adv = bitmap.rowpixels() - CLIP_W; // draw top split for (edx=bch; edx; edx--) YCOPY_COMMON @@ -1342,15 +1342,15 @@ -static void copy_fixed_xp(bitmap_t *bitmap, UINT16 *source) +static void copy_fixed_xp(bitmap_ind16 &bitmap, UINT16 *source) { UINT16 *esi, *edi; int dst_pitch, ecx, edx; UINT16 ax, bx; esi = source + CLIP_SKIP + CLIP_W; - edi = BITMAP_ADDR16(bitmap, VIS_MINY, VIS_MINX + CLIP_W); - dst_pitch = bitmap->rowpixels; + edi = &bitmap.pix16(VIS_MINY, VIS_MINX + CLIP_W); + dst_pitch = bitmap.rowpixels(); ecx = -CLIP_W; edx = CLIP_H; @@ -1377,15 +1377,15 @@ } -static void copy_fixed_2b(bitmap_t *bitmap, UINT16 *source) +static void copy_fixed_2b(bitmap_ind16 &bitmap, UINT16 *source) { UINT16 *esi, *edi; int dst_pitch, ecx, edx; UINT16 ax, bx; esi = source + CLIP_SKIP + CLIP_W; - edi = BITMAP_ADDR16(bitmap, VIS_MINY, VIS_MINX + CLIP_W); - dst_pitch = bitmap->rowpixels; + edi = &bitmap.pix16(VIS_MINY, VIS_MINX + CLIP_W); + dst_pitch = bitmap.rowpixels(); ecx = -CLIP_W; edx = CLIP_H; @@ -1424,7 +1424,7 @@ } -static void filter_bitmap(running_machine &machine, bitmap_t *bitmap, int mask) +static void filter_bitmap(running_machine &machine, bitmap_ind16 &bitmap, int mask) { halleys_state *state = machine.driver_data(); int dst_pitch; @@ -1434,8 +1434,8 @@ pal_ptr = state->m_internal_palette; esi = mask | 0xffffff00; - edi = (UINT32*)BITMAP_ADDR16(bitmap, VIS_MINY, VIS_MINX + CLIP_W); - dst_pitch = bitmap->rowpixels >> 1; + edi = (UINT32*)&bitmap.pix16(VIS_MINY, VIS_MINX + CLIP_W); + dst_pitch = bitmap.rowpixels() >> 1; ecx = -(CLIP_W>>1); edx = CLIP_H; @@ -1465,9 +1465,9 @@ } -static SCREEN_UPDATE( halleys ) +static SCREEN_UPDATE_IND16( halleys ) { - halleys_state *state = screen->machine().driver_data(); + halleys_state *state = screen.machine().driver_data(); int i, j; if (state->m_stars_enabled) @@ -1476,10 +1476,10 @@ copy_scroll_xp(bitmap, state->m_render_layer[4], *state->m_scrollx1, *state->m_scrolly1); } else - bitmap_fill(bitmap, cliprect, state->m_bgcolor); + bitmap.fill(state->m_bgcolor, cliprect); #ifdef MAME_DEBUG - if (input_port_read(screen->machine(), "DEBUG")) copy_scroll_xp(bitmap, state->m_render_layer[3], *state->m_scrollx0, *state->m_scrolly0); // not used??? + if (input_port_read(screen.machine(), "DEBUG")) copy_scroll_xp(bitmap, state->m_render_layer[3], *state->m_scrollx0, *state->m_scrolly0); // not used??? #endif copy_scroll_xp(bitmap, state->m_render_layer[2], *state->m_scrollx1, *state->m_scrolly1); @@ -1489,18 +1489,18 @@ // HALF-HACK: apply RGB filter when the following conditions are met i = state->m_io_ram[0xa0]; j = state->m_io_ram[0xa1]; - if (state->m_io_ram[0x2b] && (i>0xc6 && i<0xfe) && (j==0xc0 || j==0xed)) filter_bitmap(screen->machine(), bitmap, i); + if (state->m_io_ram[0x2b] && (i>0xc6 && i<0xfe) && (j==0xc0 || j==0xed)) filter_bitmap(screen.machine(), bitmap, i); return 0; } -static SCREEN_UPDATE( benberob ) +static SCREEN_UPDATE_IND16( benberob ) { - halleys_state *state = screen->machine().driver_data(); + halleys_state *state = screen.machine().driver_data(); if (state->m_io_ram[0xa0] & 0x80) copy_scroll_op(bitmap, state->m_render_layer[2], *state->m_scrollx1, *state->m_scrolly1); else - bitmap_fill(bitmap, cliprect, state->m_bgcolor); + bitmap.fill(state->m_bgcolor, cliprect); copy_fixed_xp (bitmap, state->m_render_layer[1]); copy_fixed_xp (bitmap, state->m_render_layer[0]); @@ -1964,10 +1964,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.50) /* verified on PCB */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(SCREEN_WIDTH, SCREEN_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(VIS_MINX, VIS_MAXX, VIS_MINY, VIS_MAXY) - MCFG_SCREEN_UPDATE(halleys) + MCFG_SCREEN_UPDATE_STATIC(halleys) MCFG_PALETTE_LENGTH(PALETTE_SIZE) MCFG_PALETTE_INIT(halleys) @@ -1999,7 +1998,7 @@ MCFG_TIMER_CALLBACK(benberob_scanline) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(benberob) + MCFG_SCREEN_UPDATE_STATIC(benberob) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/hanaawas.c mame-0.145/src/mame/drivers/hanaawas.c --- mame-0.144/src/mame/drivers/hanaawas.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/hanaawas.c 2012-02-06 21:30:42.000000000 +0000 @@ -213,10 +213,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(hanaawas) + MCFG_SCREEN_UPDATE_STATIC(hanaawas) MCFG_GFXDECODE(hanaawas) MCFG_PALETTE_LENGTH(32*8) diff -Nru mame-0.144/src/mame/drivers/hankin.c mame-0.145/src/mame/drivers/hankin.c --- mame-0.144/src/mame/drivers/hankin.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/hankin.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -5,18 +7,28 @@ { public: hankin_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( hankin_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( hankin_map, AS_PROGRAM, 8, hankin_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( hankin ) INPUT_PORTS_END -static MACHINE_RESET( hankin ) +void hankin_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6802, 900000) MCFG_CPU_PROGRAM_MAP(hankin_map) - - MCFG_MACHINE_RESET( hankin ) MACHINE_CONFIG_END /*-------------------------------- @@ -102,10 +112,9 @@ ROM_LOAD("sw_ic3.snd", 0xf000, 0x0200, CRC(db214f65) SHA1(1a499cf2059a5c0d860d5a4251a89a5735937ef8)) ROM_END -GAME(1978, fjholden, 0, hankin, hankin, hankin, ROT0, "Hankin", "FJ Holden", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, howzat, 0, hankin, hankin, hankin, ROT0, "Hankin", "Howzat!", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, orbit1, 0, hankin, hankin, hankin, ROT0, "Hankin", "Orbit 1", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, shark, 0, hankin, hankin, hankin, ROT0, "Hankin", "Shark", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, empsback, 0, hankin, hankin, hankin, ROT0, "Hankin", "The Empire Strike Back",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1978, fjholden, 0, hankin, hankin, hankin, ROT0, "Hankin", "FJ Holden", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, howzat, 0, hankin, hankin, hankin, ROT0, "Hankin", "Howzat!", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, orbit1, 0, hankin, hankin, hankin, ROT0, "Hankin", "Orbit 1", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, shark, 0, hankin, hankin, hankin, ROT0, "Hankin", "Shark", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, empsback, 0, hankin, hankin, hankin, ROT0, "Hankin", "The Empire Strike Back",GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/harddriv.c mame-0.145/src/mame/drivers/harddriv.c --- mame-0.144/src/mame/drivers/harddriv.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/harddriv.c 2012-02-06 21:30:41.000000000 +0000 @@ -341,7 +341,8 @@ "screen", /* the screen operated on */ 4000000, /* pixel clock */ 4, /* pixels per clock */ - harddriv_scanline_driver, /* scanline callback */ + harddriv_scanline_driver, /* scanline callback (indexed16) */ + NULL, /* scanline callback (rgb32) */ hdgsp_irq_gen, /* generate interrupt */ hdgsp_write_to_shiftreg, /* write to shiftreg function */ hdgsp_read_from_shiftreg /* read from shiftreg function */ @@ -355,7 +356,8 @@ "screen", /* the screen operated on */ 6000000, /* pixel clock */ 2, /* pixels per clock */ - harddriv_scanline_multisync, /* scanline callback */ + harddriv_scanline_multisync, /* scanline callback (indexed16) */ + NULL, /* scanline callback (rgb32 */ hdgsp_irq_gen, /* generate interrupt */ hdgsp_write_to_shiftreg, /* write to shiftreg function */ hdgsp_read_from_shiftreg /* read from shiftreg function */ @@ -369,7 +371,8 @@ "screen", /* the screen operated on */ 5000000, /* pixel clock */ 2, /* pixels per clock */ - harddriv_scanline_multisync, /* scanline callback */ + harddriv_scanline_multisync, /* scanline callback (indexed16) */ + NULL, /* scanline callback (rgb32 */ hdgsp_irq_gen, /* generate interrupt */ hdgsp_write_to_shiftreg, /* write to shiftreg function */ hdgsp_read_from_shiftreg /* read from shiftreg function */ @@ -382,7 +385,8 @@ "screen", /* the screen operated on */ 5000000, /* pixel clock */ 2, /* pixels per clock */ - NULL, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + NULL, /* scanline callback (rgb32 */ hdmsp_irq_gen /* generate interrupt */ }; @@ -1136,9 +1140,8 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(4000000*4, 160*4, 0, 127*4, 417, 0, 384) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(harddriv) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/hazelgr.c mame-0.145/src/mame/drivers/hazelgr.c --- mame-0.144/src/mame/drivers/hazelgr.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/hazelgr.c 2012-02-06 21:30:37.000000000 +0000 @@ -3,6 +3,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -10,14 +12,20 @@ { public: haze_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( haze_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( haze_map, AS_PROGRAM, 8, haze_state ) AM_RANGE(0x0000, 0x17ff) AM_ROM - AM_RANGE(0x9000, 0x9fff) AM_RAM ADDRESS_MAP_END @@ -27,7 +35,6 @@ static MACHINE_CONFIG_START( haze, haze_state ) - /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,2000000) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(haze_map) @@ -40,4 +47,5 @@ ROM_LOAD( "fd v 3-2 c.bin", 0x1000, 0x0800, CRC(77bb8d8c) SHA1(65b7dd8024747175c3bd5bc341e2e1a92699f1c6) ) ROM_END -GAME( 198?, hg_frd , 0 , haze , haze , 0 , 0, "Hazel Grove", "Fruit Deuce (Hazel Grove)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) + +GAME( 198?, hg_frd, 0, haze, haze, 0, ROT0, "Hazel Grove", "Fruit Deuce (Hazel Grove)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/hcastle.c mame-0.145/src/mame/drivers/hcastle.c --- mame-0.144/src/mame/drivers/hcastle.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/hcastle.c 2012-02-06 21:30:35.000000000 +0000 @@ -225,10 +225,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second verified by comparison with real board */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hcastle) + MCFG_SCREEN_UPDATE_STATIC(hcastle) MCFG_GFXDECODE(hcastle) MCFG_PALETTE_LENGTH(2*8*16*16) diff -Nru mame-0.144/src/mame/drivers/hexion.c mame-0.145/src/mame/drivers/hexion.c --- mame-0.144/src/mame/drivers/hexion.c 2012-01-13 15:34:39.000000000 +0000 +++ mame-0.145/src/mame/drivers/hexion.c 2012-02-06 21:30:35.000000000 +0000 @@ -141,46 +141,29 @@ static INPUT_PORTS_START( hexion ) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), DEF_STR( Free_Play )) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( Free_Play ), SW1) PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x70, DEF_STR( Easiest ) ) - PORT_DIPSETTING( 0x60, DEF_STR( Very_Easy) ) - PORT_DIPSETTING( 0x50, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) - PORT_DIPSETTING( 0x30, DEF_STR( Medium_Hard ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Very_Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x70, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") + PORT_DIPSETTING( 0x70, DEF_STR( Easiest ) ) // "1" + PORT_DIPSETTING( 0x60, DEF_STR( Very_Easy) ) // "2" + PORT_DIPSETTING( 0x50, DEF_STR( Easy ) ) // "3" + PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) // "4" + PORT_DIPSETTING( 0x30, DEF_STR( Medium_Hard ) ) // "5" + PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) // "6" + PORT_DIPSETTING( 0x10, DEF_STR( Very_Hard ) ) // "7" + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // "8" + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0xfa, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("P1") KONAMI8_B12_START(1) @@ -233,7 +216,8 @@ DEVCB_NULL, DEVCB_NULL, DEVCB_LINE(hexion_irq_ack_w), - DEVCB_LINE(hexion_nmi_ack_w) + DEVCB_LINE(hexion_nmi_ack_w), + 0, 0 }; static MACHINE_CONFIG_START( hexion, hexion_state ) @@ -249,10 +233,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 36*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(hexion) + MCFG_SCREEN_UPDATE_STATIC(hexion) MCFG_GFXDECODE(hexion) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/higemaru.c mame-0.145/src/mame/drivers/higemaru.c --- mame-0.144/src/mame/drivers/higemaru.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/higemaru.c 2012-02-06 21:30:42.000000000 +0000 @@ -168,10 +168,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(higemaru) + MCFG_SCREEN_UPDATE_STATIC(higemaru) MCFG_GFXDECODE(higemaru) MCFG_PALETTE_LENGTH(32*4+16*16) diff -Nru mame-0.144/src/mame/drivers/highvdeo.c mame-0.145/src/mame/drivers/highvdeo.c --- mame-0.144/src/mame/drivers/highvdeo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/highvdeo.c 2012-02-06 21:30:38.000000000 +0000 @@ -110,28 +110,28 @@ } -static SCREEN_UPDATE(tourvisn) +static SCREEN_UPDATE_RGB32(tourvisn) { - highvdeo_state *state = screen->machine().driver_data(); + highvdeo_state *state = screen.machine().driver_data(); int x,y,count; count = (0/2); - for(y=0;y<(screen->visible_area().max_y+1);y++) + for(y=0;y<(screen.visible_area().max_y+1);y++) { - for(x=0;x<(screen->visible_area().max_x+1)/2;x++) + for(x=0;x<(screen.visible_area().max_x+1)/2;x++) { UINT32 color; color = ((state->m_blit_ram[count]) & 0x00ff)>>0; - if((x*2)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*2)+0) = screen->machine().pens[color]; + if(cliprect.contains((x*2)+0, y)) + bitmap.pix32(y, (x*2)+0) = screen.machine().pens[color]; color = ((state->m_blit_ram[count]) & 0xff00)>>8; - if(((x*2)+1)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*2)+1) = screen->machine().pens[color]; + if(cliprect.contains((x*2)+1, y)) + bitmap.pix32(y, (x*2)+1) = screen.machine().pens[color]; count++; } @@ -141,9 +141,9 @@ } /*Later HW, RGB565 instead of RAM-based pens (+ ramdac).*/ -static SCREEN_UPDATE(brasil) +static SCREEN_UPDATE_RGB32(brasil) { - highvdeo_state *state = screen->machine().driver_data(); + highvdeo_state *state = screen.machine().driver_data(); int x,y,count; count = (0/2); @@ -162,8 +162,8 @@ b = (color & 0x001f) << 3; g = (color & 0x07e0) >> 3; r = (color & 0xf800) >> 8; - if(xvisible_area().max_x && yvisible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = b | (g<<8) | (r<<16); + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = b | (g<<8) | (r<<16); count++; } @@ -912,10 +912,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE(tourvisn) + MCFG_SCREEN_UPDATE_STATIC(tourvisn) MCFG_PALETTE_LENGTH(0x100) @@ -979,10 +978,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 300-1) - MCFG_SCREEN_UPDATE(brasil) + MCFG_SCREEN_UPDATE_STATIC(brasil) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/hikaru.c mame-0.145/src/mame/drivers/hikaru.c --- mame-0.144/src/mame/drivers/hikaru.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/hikaru.c 2012-02-06 21:30:38.000000000 +0000 @@ -332,7 +332,7 @@ } -static SCREEN_UPDATE(hikaru) +static SCREEN_UPDATE_RGB32(hikaru) { return 0; } @@ -429,10 +429,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE(hikaru) + MCFG_SCREEN_UPDATE_STATIC(hikaru) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/himesiki.c mame-0.145/src/mame/drivers/himesiki.c --- mame-0.144/src/mame/drivers/himesiki.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/himesiki.c 2012-02-06 21:30:39.000000000 +0000 @@ -308,10 +308,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1) - MCFG_SCREEN_UPDATE(himesiki) + MCFG_SCREEN_UPDATE_STATIC(himesiki) MCFG_GFXDECODE(himesiki) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/hitme.c mame-0.145/src/mame/drivers/hitme.c --- mame-0.144/src/mame/drivers/hitme.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/hitme.c 2012-02-06 21:30:40.000000000 +0000 @@ -44,7 +44,7 @@ /* mark this tile dirty */ state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } @@ -69,11 +69,11 @@ } -static SCREEN_UPDATE( hitme ) +static SCREEN_UPDATE_IND16( hitme ) { - hitme_state *state = screen->machine().driver_data(); + hitme_state *state = screen.machine().driver_data(); /* the card width resistor comes from an input port, scaled to the range 0-25 kOhms */ - double width_resist = input_port_read(screen->machine(), "WIDTH") * 25000 / 100; + double width_resist = input_port_read(screen.machine(), "WIDTH") * 25000 / 100; /* this triggers a oneshot for the following length of time */ double width_duration = 0.45 * 1000e-12 * width_resist; /* the dot clock runs at the standard horizontal frequency * 320+16 clocks per scanline */ @@ -84,12 +84,12 @@ offs_t offs = 0; /* start by drawing the tilemap */ - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); /* now loop over and invert anything */ for (y = 0; y < 19; y++) { - int dy = bitmap->rowpixels; + int dy = bitmap.rowpixels(); for (inv = x = 0; x < 40; x++, offs++) { /* if the high bit is set, reset the oneshot */ @@ -99,7 +99,7 @@ /* invert pixels until we run out */ for (xx = 0; xx < 8 && inv; xx++, inv--) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y * 10, x * 8 + xx); + UINT16 *dest = &bitmap.pix16(y * 10, x * 8 + xx); dest[0 * dy] ^= 1; dest[1 * dy] ^= 1; dest[2 * dy] ^= 1; @@ -117,10 +117,10 @@ } -static SCREEN_UPDATE( barricad ) +static SCREEN_UPDATE_IND16( barricad ) { - hitme_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + hitme_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -330,10 +330,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 19*10) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 19*10-1) - MCFG_SCREEN_UPDATE(hitme) + MCFG_SCREEN_UPDATE_STATIC(hitme) MCFG_GFXDECODE(hitme) MCFG_PALETTE_LENGTH(2) @@ -363,7 +362,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(32*8, 24*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1) - MCFG_SCREEN_UPDATE(barricad) + MCFG_SCREEN_UPDATE_STATIC(barricad) MCFG_GFXDECODE(barricad) diff -Nru mame-0.144/src/mame/drivers/hitpoker.c mame-0.145/src/mame/drivers/hitpoker.c --- mame-0.144/src/mame/drivers/hitpoker.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/hitpoker.c 2012-02-06 21:30:38.000000000 +0000 @@ -75,13 +75,13 @@ state->m_colorram = auto_alloc_array(machine, UINT8, 0x2000); } -static SCREEN_UPDATE(hitpoker) +static SCREEN_UPDATE_IND16(hitpoker) { - hitpoker_state *state = screen->machine().driver_data(); + hitpoker_state *state = screen.machine().driver_data(); int count = 0; int y,x; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (y=0;y<31;y++) { @@ -93,7 +93,7 @@ gfx_bpp = (state->m_colorram[count] & 0x80)>>7; //flag between 4 and 8 bpp color = gfx_bpp ? ((state->m_colorram[count] & 0x70)>>4) : (state->m_colorram[count] & 0xf); - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[gfx_bpp],tile,color,0,0,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[gfx_bpp],tile,color,0,0,x*8,y*8); count+=2; } @@ -494,10 +494,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(648, 480) //setted by the CRTC MCFG_SCREEN_VISIBLE_AREA(0, 648-1, 0, 240-1) - MCFG_SCREEN_UPDATE(hitpoker) + MCFG_SCREEN_UPDATE_STATIC(hitpoker) MCFG_MC6845_ADD("crtc", H46505, CRTC_CLOCK/2, mc6845_intf) /* hand tuned to get ~60 fps */ diff -Nru mame-0.144/src/mame/drivers/hnayayoi.c mame-0.145/src/mame/drivers/hnayayoi.c --- mame-0.144/src/mame/drivers/hnayayoi.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/hnayayoi.c 2012-02-06 21:30:33.000000000 +0000 @@ -572,10 +572,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(hnayayoi) + MCFG_SCREEN_UPDATE_STATIC(hnayayoi) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/hng64.c mame-0.145/src/mame/drivers/hng64.c --- mame-0.144/src/mame/drivers/hng64.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/hng64.c 2012-02-06 21:30:40.000000000 +0000 @@ -443,12 +443,20 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/nec/nec.h" -#include "deprecat.h" #include "cpu/mips/mips3.h" #include "machine/nvram.h" #include "includes/hng64.h" +/* TODO: NOT measured! */ +#define PIXEL_CLOCK ((MASTER_CLOCK*2)/4) // x 2 is due of the interlaced screen ... +#define HTOTAL (0x200+0x100) +#define HBEND (0) +#define HBSTART (0x200) + +#define VTOTAL (264*2) +#define VBEND (0) +#define VBSTART (224*2) #ifdef UNUSED_FUNCTION @@ -927,11 +935,8 @@ state->m_screen_dis = 0; - visarea.min_x = min_x; - visarea.max_x = min_x + max_x - 1; - visarea.min_y = min_y; - visarea.max_y = min_y + max_y - 1; - space->machine().primary_screen->configure(0x200, 0x1c0, visarea, space->machine().primary_screen->frame_period().attoseconds ); + visarea.set(min_x, min_x + max_x - 1, min_y, min_y + max_y - 1); + space->machine().primary_screen->configure(HTOTAL, VTOTAL, visarea, space->machine().primary_screen->frame_period().attoseconds ); } } @@ -1632,36 +1637,31 @@ 16384 /* data cache size */ }; -static TIMER_CALLBACK( irq_stop ) -{ - cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); -} -static INTERRUPT_GEN( irq_start ) +static TIMER_DEVICE_CALLBACK( hng64_irq ) { - hng64_state *state = device->machine().driver_data(); + hng64_state *state = timer.machine().driver_data(); + int scanline = param; + int irq_fired,irq_type; - logerror("HNG64 interrupt level %x\n", cpu_getiloops(device)); + irq_fired = irq_type = 0; /* there are more, the sources are unknown at the moment */ - switch (cpu_getiloops(device)) + switch(scanline) { - case 0x00: state->m_interrupt_level_request = 0; - break; - case 0x01: state->m_interrupt_level_request = 1; - break; - case 0x02: state->m_interrupt_level_request = 2; - break; - case 0x03: - if (state->m_mcu_type == RACING_MCU) - state->m_interrupt_level_request = 11; //network irq - else - return; - break; + case 224*2: state->m_interrupt_level_request = 0; irq_fired = 1; irq_type = 1; break; + case 0*2: state->m_interrupt_level_request = 1; irq_fired = 1; irq_type = 1; break; + case 64*2: state->m_interrupt_level_request = 2; irq_fired = 1; irq_type = 1; break; + case 128*2: state->m_interrupt_level_request = 11; irq_fired = 1; irq_type = 1; break; + case (0+1)*2: + case (224+1)*2: + case (64+1)*2: + case (128+1)*2: + irq_fired = 1; irq_type = 0; break; } - device_set_input_line(device, 0, ASSERT_LINE); - device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(irq_stop)); + if(irq_fired) + device_set_input_line(state->m_maincpu, 0, (irq_type) ? ASSERT_LINE : CLEAR_LINE); } @@ -1721,7 +1721,7 @@ MCFG_CPU_ADD("maincpu", VR4300BE, MASTER_CLOCK) // actually R4300 MCFG_CPU_CONFIG(vr4300_config) MCFG_CPU_PROGRAM_MAP(hng_map) - MCFG_CPU_VBLANK_INT_HACK(irq_start,4) + MCFG_TIMER_ADD_SCANLINE("scantimer", hng64_irq, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", V33, 8000000) // v53, 16? mhz! MCFG_CPU_PROGRAM_MAP(hng_sound_map) @@ -1737,16 +1737,13 @@ MCFG_MACHINE_RESET(hyperneo) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(1024, 1024) - MCFG_SCREEN_VISIBLE_AREA(0, 0x200-1, 0, 0x1c0-1) - MCFG_SCREEN_UPDATE(hng64) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(hng64) MCFG_PALETTE_LENGTH(0x1000) MCFG_VIDEO_START(hng64) + MCFG_SCREEN_VBLANK_STATIC(hng64) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/holeland.c mame-0.145/src/mame/drivers/holeland.c --- mame-0.144/src/mame/drivers/holeland.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/holeland.c 2012-02-06 21:30:37.000000000 +0000 @@ -286,10 +286,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 2*16, 30*16-1) - MCFG_SCREEN_UPDATE(holeland) + MCFG_SCREEN_UPDATE_STATIC(holeland) MCFG_GFXDECODE(holeland) MCFG_PALETTE_LENGTH(256) @@ -357,10 +356,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(crzrally) + MCFG_SCREEN_UPDATE_STATIC(crzrally) MCFG_GFXDECODE(crzrally) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/homedata.c mame-0.145/src/mame/drivers/homedata.c --- mame-0.144/src/mame/drivers/homedata.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/homedata.c 2012-02-06 21:30:41.000000000 +0000 @@ -1270,12 +1270,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) // visible area can be changed at runtime MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mrokumei) - MCFG_SCREEN_EOF(homedata) + MCFG_SCREEN_UPDATE_STATIC(mrokumei) + MCFG_SCREEN_VBLANK_STATIC(homedata) MCFG_GFXDECODE(mrokumei) MCFG_PALETTE_LENGTH(0x8000) @@ -1340,11 +1339,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 256-1-16) - MCFG_SCREEN_UPDATE(reikaids) - MCFG_SCREEN_EOF(homedata) + MCFG_SCREEN_UPDATE_STATIC(reikaids) + MCFG_SCREEN_VBLANK_STATIC(homedata) MCFG_GFXDECODE(reikaids) MCFG_PALETTE_LENGTH(0x8000) @@ -1391,12 +1389,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) // visible area can be changed at runtime MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pteacher) - MCFG_SCREEN_EOF(homedata) + MCFG_SCREEN_UPDATE_STATIC(pteacher) + MCFG_SCREEN_VBLANK_STATIC(homedata) MCFG_GFXDECODE(pteacher) MCFG_PALETTE_LENGTH(0x8000) @@ -1558,10 +1555,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mirderby) + MCFG_SCREEN_UPDATE_STATIC(mirderby) MCFG_GFXDECODE(mirderby) MCFG_PALETTE_LENGTH(0x8000) diff -Nru mame-0.144/src/mame/drivers/homerun.c mame-0.145/src/mame/drivers/homerun.c --- mame-0.144/src/mame/drivers/homerun.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/homerun.c 2012-02-06 21:30:42.000000000 +0000 @@ -234,10 +234,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-25) - MCFG_SCREEN_UPDATE(homerun) + MCFG_SCREEN_UPDATE_STATIC(homerun) MCFG_GFXDECODE(homerun) MCFG_PALETTE_LENGTH(16*4) diff -Nru mame-0.144/src/mame/drivers/hornet.c mame-0.145/src/mame/drivers/hornet.c --- mame-0.144/src/mame/drivers/hornet.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/hornet.c 2012-02-06 21:30:38.000000000 +0000 @@ -391,11 +391,11 @@ cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_IRQ1, ASSERT_LINE); } -static SCREEN_UPDATE( hornet ) +static SCREEN_UPDATE_RGB32( hornet ) { - hornet_state *state = screen->machine().driver_data(); - device_t *voodoo = screen->machine().device("voodoo0"); - device_t *k037122 = screen->machine().device("k037122_1"); + hornet_state *state = screen.machine().driver_data(); + device_t *voodoo = screen.machine().device("voodoo0"); + device_t *k037122 = screen.machine().device("k037122_1"); voodoo_update(voodoo, bitmap, cliprect); @@ -406,22 +406,22 @@ return 0; } -static SCREEN_UPDATE( hornet_2board ) +static SCREEN_UPDATE_RGB32( hornet_2board ) { - hornet_state *state = screen->machine().driver_data(); - if (strcmp(screen->tag(), "lscreen") == 0) + hornet_state *state = screen.machine().driver_data(); + if (strcmp(screen.tag(), "lscreen") == 0) { - device_t *k037122 = screen->machine().device("k037122_1"); - device_t *voodoo = screen->machine().device("voodoo0"); + device_t *k037122 = screen.machine().device("k037122_1"); + device_t *voodoo = screen.machine().device("voodoo0"); voodoo_update(voodoo, bitmap, cliprect); /* TODO: tilemaps per screen */ k037122_tile_draw(k037122, bitmap, cliprect); } - else if (strcmp(screen->tag(), "rscreen") == 0) + else if (strcmp(screen.tag(), "rscreen") == 0) { - device_t *k037122 = screen->machine().device("k037122_2"); - device_t *voodoo = screen->machine().device("voodoo1"); + device_t *k037122 = screen.machine().device("k037122_2"); + device_t *voodoo = screen.machine().device("voodoo1"); voodoo_update(voodoo, bitmap, cliprect); /* TODO: tilemaps per screen */ @@ -975,10 +975,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(hornet) + MCFG_SCREEN_UPDATE_STATIC(hornet) MCFG_PALETTE_LENGTH(65536) @@ -1047,18 +1046,16 @@ MCFG_DEVICE_REMOVE("screen") MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(hornet_2board) + MCFG_SCREEN_UPDATE_STATIC(hornet_2board) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(hornet_2board) + MCFG_SCREEN_UPDATE_STATIC(hornet_2board) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( terabrst, hornet_2board ) diff -Nru mame-0.144/src/mame/drivers/hotblock.c mame-0.145/src/mame/drivers/hotblock.c --- mame-0.144/src/mame/drivers/hotblock.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/hotblock.c 2012-02-06 21:30:41.000000000 +0000 @@ -138,19 +138,19 @@ state->save_item(NAME(state->m_pal)); } -static SCREEN_UPDATE(hotblock) +static SCREEN_UPDATE_IND16(hotblock) { - hotblock_state *state = screen->machine().driver_data(); + hotblock_state *state = screen.machine().driver_data(); int y, x, count; int i; static const int xxx = 320, yyy = 204; - bitmap_fill(bitmap, 0, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); for (i = 0; i < 256; i++) { int dat = (state->m_pal[i * 2 + 1] << 8) | state->m_pal[i * 2]; - palette_set_color_rgb(screen->machine(), i, pal5bit(dat >> 0), pal5bit(dat >> 5), pal5bit(dat >> 10)); + palette_set_color_rgb(screen.machine(), i, pal5bit(dat >> 0), pal5bit(dat >> 5), pal5bit(dat >> 10)); } count = 0; @@ -159,7 +159,7 @@ for(x = 0; x < xxx; x++) { if (state->m_port0 & 0x40) - *BITMAP_ADDR16(bitmap, y, x) = state->m_vram[count]; + bitmap.pix16(y, x) = state->m_vram[count]; count++; } } @@ -219,10 +219,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024,1024) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE(hotblock) + MCFG_SCREEN_UPDATE_STATIC(hotblock) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/hotstuff.c mame-0.145/src/mame/drivers/hotstuff.c --- mame-0.144/src/mame/drivers/hotstuff.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/hotstuff.c 2012-02-06 21:30:37.000000000 +0000 @@ -20,9 +20,9 @@ /* the first 0x20 bytes in every 0x200 (each line) of video ram are the colour data, providing a palette of 16 RGB444 colours for that line */ -SCREEN_UPDATE( hotstuff ) +SCREEN_UPDATE_RGB32( hotstuff ) { - hotstuff_state *state = screen->machine().driver_data(); + hotstuff_state *state = screen.machine().driver_data(); int count, y,yyy,x,xxx; UINT16 row_palette_data[0x10]; rgb_t row_palette_data_as_rgb32_pen_data[0x10]; @@ -46,13 +46,13 @@ for(x = 0; x < xxx; x++) { { - *BITMAP_ADDR32(bitmap, y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0xf000)>>12]; + bitmap.pix32(y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0xf000)>>12]; x++; - *BITMAP_ADDR32(bitmap, y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x0f00)>>8]; + bitmap.pix32(y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x0f00)>>8]; x++; - *BITMAP_ADDR32(bitmap, y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x00f0)>>4]; + bitmap.pix32(y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x00f0)>>4]; x++; - *BITMAP_ADDR32(bitmap, y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x000f)>>0]; + bitmap.pix32(y, x) = row_palette_data_as_rgb32_pen_data[(state->m_bitmapram[count] &0x000f)>>0]; } count++; @@ -82,10 +82,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(128*8, 64*8) MCFG_SCREEN_VISIBLE_AREA((0x10*4)+8, 101*8-1, 0*8, 33*8-1) - MCFG_SCREEN_UPDATE(hotstuff) + MCFG_SCREEN_UPDATE_STATIC(hotstuff) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/hvyunit.c mame-0.145/src/mame/drivers/hvyunit.c --- mame-0.144/src/mame/drivers/hvyunit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/hvyunit.c 2012-02-06 21:30:35.000000000 +0000 @@ -58,7 +58,6 @@ ***************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/mcs51/mcs51.h" #include "sound/2203intf.h" @@ -86,9 +85,6 @@ UINT16 m_scrolly; UINT16 m_port0_data; - /* Interrupts */ - UINT8 m_int_vector; - /* Mermaid */ UINT8 m_data_to_mermaid; UINT8 m_data_to_z80; @@ -129,7 +125,6 @@ { hvyunit_state *state = machine.driver_data(); - state->m_int_vector = 0xff; state->m_mermaid_int0_l = 1; state->m_mermaid_to_z80_full = 0; state->m_z80_to_mermaid_full = 0; @@ -159,25 +154,29 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); } -static SCREEN_UPDATE( hvyunit ) +static SCREEN_UPDATE_IND16( hvyunit ) { #define SX_POS 96 #define SY_POS 0 - hvyunit_state *state = screen->machine().driver_data(); + hvyunit_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_port0_data & 0x40) << 2) + state->m_scrollx + SX_POS); // TODO - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_port0_data & 0x80) << 1) + state->m_scrolly + SY_POS); // TODO - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, ((state->m_port0_data & 0x40) << 2) + state->m_scrollx + SX_POS); // TODO + state->m_bg_tilemap->set_scrolly(0, ((state->m_port0_data & 0x80) << 1) + state->m_scrolly + SY_POS); // TODO + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); pandora_update(state->m_pandora, bitmap, cliprect); return 0; } -static SCREEN_EOF( hvyunit ) +static SCREEN_VBLANK( hvyunit ) { - hvyunit_state *state = machine.driver_data(); - pandora_eof(state->m_pandora); + // rising edge + if (vblank_on) + { + hvyunit_state *state = screen.machine().driver_data(); + pandora_eof(state->m_pandora); + } } @@ -246,7 +245,7 @@ hvyunit_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( hu_colorram_w ) @@ -254,7 +253,7 @@ hvyunit_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( slave_bankswitch_w ) @@ -618,12 +617,18 @@ * *************************************/ -static INTERRUPT_GEN( hvyunit_interrupt ) +/* Main Z80 uses IM2 */ +static TIMER_DEVICE_CALLBACK( hvyunit_scanline ) { - hvyunit_state *state = device->machine().driver_data(); + hvyunit_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) // vblank-out irq + device_set_input_line_and_vector(state->m_master_cpu, 0, HOLD_LINE, 0xfd); - state->m_int_vector ^= 0x02; - device_set_input_line_and_vector(device, 0, HOLD_LINE, state->m_int_vector); + /* Pandora "sprite end dma" irq? TODO: timing is likely off */ + if(scanline == 64) + device_set_input_line_and_vector(state->m_master_cpu, 0, HOLD_LINE, 0xff); } static const kaneko_pandora_interface hvyunit_pandora_config = @@ -645,7 +650,7 @@ MCFG_CPU_ADD("master", Z80, 6000000) MCFG_CPU_PROGRAM_MAP(master_memory) MCFG_CPU_IO_MAP(master_io) - MCFG_CPU_VBLANK_INT_HACK(hvyunit_interrupt, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", hvyunit_scanline, "screen", 0, 1) MCFG_CPU_ADD("slave", Z80, 6000000) MCFG_CPU_PROGRAM_MAP(slave_memory) @@ -668,11 +673,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(hvyunit) - MCFG_SCREEN_EOF(hvyunit) + MCFG_SCREEN_UPDATE_STATIC(hvyunit) + MCFG_SCREEN_VBLANK_STATIC(hvyunit) MCFG_GFXDECODE(hvyunit) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/hyhoo.c mame-0.145/src/mame/drivers/hyhoo.c --- mame-0.144/src/mame/drivers/hyhoo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/hyhoo.c 2012-02-06 21:30:42.000000000 +0000 @@ -260,10 +260,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1) - MCFG_SCREEN_UPDATE(hyhoo) + MCFG_SCREEN_UPDATE_STATIC(hyhoo) MCFG_VIDEO_START(hyhoo) diff -Nru mame-0.144/src/mame/drivers/hyperspt.c mame-0.145/src/mame/drivers/hyperspt.c --- mame-0.144/src/mame/drivers/hyperspt.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/hyperspt.c 2012-02-06 21:30:40.000000000 +0000 @@ -26,6 +26,12 @@ coin_counter_w(space->machine(), offset, data); } +static WRITE8_HANDLER( irq_mask_w ) +{ + hyperspt_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( hyperspt_map, AS_PROGRAM, 8 ) AM_RANGE(0x1000, 0x10bf) AM_RAM AM_BASE_SIZE_MEMBER(hyperspt_state, m_spriteram, m_spriteram_size) @@ -34,7 +40,7 @@ AM_RANGE(0x1480, 0x1480) AM_WRITE(hyperspt_flipscreen_w) AM_RANGE(0x1481, 0x1481) AM_WRITE(konami_sh_irqtrigger_w) /* cause interrupt on audio CPU */ AM_RANGE(0x1483, 0x1484) AM_WRITE(hyperspt_coin_counter_w) - AM_RANGE(0x1487, 0x1487) AM_WRITE(interrupt_enable_w) /* Interrupt enable */ + AM_RANGE(0x1487, 0x1487) AM_WRITE(irq_mask_w) /* Interrupt enable */ AM_RANGE(0x1500, 0x1500) AM_WRITE(soundlatch_w) AM_RANGE(0x1600, 0x1600) AM_READ_PORT("DSW2") AM_RANGE(0x1680, 0x1680) AM_READ_PORT("SYSTEM") @@ -55,7 +61,7 @@ AM_RANGE(0x1480, 0x1480) AM_WRITE(hyperspt_flipscreen_w) AM_RANGE(0x1481, 0x1481) AM_WRITE(konami_sh_irqtrigger_w) /* cause interrupt on audio CPU */ AM_RANGE(0x1483, 0x1484) AM_WRITE(hyperspt_coin_counter_w) - AM_RANGE(0x1487, 0x1487) AM_WRITE(interrupt_enable_w) /* Interrupt enable */ + AM_RANGE(0x1487, 0x1487) AM_WRITE(irq_mask_w) /* Interrupt enable */ AM_RANGE(0x1500, 0x1500) AM_WRITE(soundlatch_w) AM_RANGE(0x1600, 0x1600) AM_READ_PORT("DSW2") AM_RANGE(0x1680, 0x1680) AM_READ_PORT("SYSTEM") @@ -267,6 +273,13 @@ GFXDECODE_ENTRY( "gfx2", 0, roadf_charlayout, 16*16, 16 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + hyperspt_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} static MACHINE_CONFIG_START( hyperspt, hyperspt_state ) @@ -274,7 +287,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, XTAL_18_432MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(hyperspt_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,XTAL_14_31818MHz/4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -285,10 +298,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hyperspt) + MCFG_SCREEN_UPDATE_STATIC(hyperspt) MCFG_GFXDECODE(hyperspt) MCFG_PALETTE_LENGTH(16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/hyprduel.c mame-0.145/src/mame/drivers/hyprduel.c --- mame-0.144/src/mame/drivers/hyprduel.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/hyprduel.c 2012-02-06 21:30:37.000000000 +0000 @@ -36,7 +36,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/2151intf.h" #include "sound/okim6295.h" #include "sound/2413intf.h" @@ -60,23 +59,23 @@ state->m_requested_int &= ~param; } -static INTERRUPT_GEN( hyprduel_interrupt ) +static TIMER_DEVICE_CALLBACK( hyprduel_interrupt ) { - hyprduel_state *state = device->machine().driver_data(); - int line = RASTER_LINES - cpu_getiloops(device); + hyprduel_state *state = timer.machine().driver_data(); + int line = param; - if (line == RASTER_LINES) + if (line == 0) /* TODO: fix this! */ { state->m_requested_int |= 0x01; /* vblank */ state->m_requested_int |= 0x20; - device_set_input_line(device, 2, HOLD_LINE); + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); /* the duration is a guess */ - device->machine().scheduler().timer_set(attotime::from_usec(2500), FUNC(vblank_end_callback), 0x20); + timer.machine().scheduler().timer_set(attotime::from_usec(2500), FUNC(vblank_end_callback), 0x20); } else state->m_requested_int |= 0x12; /* hsync */ - update_irq_state(device->machine()); + update_irq_state(timer.machine()); } static READ16_HANDLER( hyprduel_irq_cause_r ) @@ -607,10 +606,19 @@ ***************************************************************************/ /* 8x8x4 tiles */ -static GFXLAYOUT_RAW( layout_8x8x4, 4, 8, 8, 4*8, 32*8 ) +static const gfx_layout layout_8x8x4 = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 4*1,4*0, 4*3,4*2, 4*5,4*4, 4*7,4*6 }, + { STEP8(0,4*8) }, + 4*8*8 +}; /* 8x8x8 tiles for later games */ -static GFXLAYOUT_RAW( layout_8x8x8h, 8, 8, 8, 8*8, 32*8 ) +static GFXLAYOUT_RAW( layout_8x8x8h, 8, 8, 8*8, 32*8 ) static GFXDECODE_START( 14220 ) GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x4, 0x0, 0x200 ) // [0] 4 Bit Tiles @@ -676,7 +684,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,20000000/2) /* 10MHz */ MCFG_CPU_PROGRAM_MAP(hyprduel_map) - MCFG_CPU_VBLANK_INT_HACK(hyprduel_interrupt,RASTER_LINES) + MCFG_TIMER_ADD_SCANLINE("scantimer", hyprduel_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", M68000,20000000/2) /* 10MHz */ MCFG_CPU_PROGRAM_MAP(hyprduel_map2) @@ -690,10 +698,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 224) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, FIRST_VISIBLE_LINE, LAST_VISIBLE_LINE) - MCFG_SCREEN_UPDATE(hyprduel) + MCFG_SCREEN_UPDATE_STATIC(hyprduel) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -719,7 +726,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,20000000/2) /* 10MHz */ MCFG_CPU_PROGRAM_MAP(magerror_map) - MCFG_CPU_VBLANK_INT_HACK(hyprduel_interrupt,RASTER_LINES) + MCFG_TIMER_ADD_SCANLINE("scantimer", hyprduel_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", M68000,20000000/2) /* 10MHz */ MCFG_CPU_PROGRAM_MAP(magerror_map2) @@ -733,10 +740,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 224) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, FIRST_VISIBLE_LINE, LAST_VISIBLE_LINE) - MCFG_SCREEN_UPDATE(hyprduel) + MCFG_SCREEN_UPDATE_STATIC(hyprduel) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/icecold.c mame-0.145/src/mame/drivers/icecold.c --- mame-0.144/src/mame/drivers/icecold.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/icecold.c 2012-02-06 21:30:34.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: icecold_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( icecold_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( icecold_map, AS_PROGRAM, 8, icecold_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( icecold ) INPUT_PORTS_END -static MACHINE_RESET( icecold ) +void icecold_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1000000) MCFG_CPU_PROGRAM_MAP(icecold_map) - - MCFG_MACHINE_RESET( icecold ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -41,4 +51,5 @@ ROM_LOAD("icb24.bin", 0xc000, 0x2000, CRC(2d1e7282) SHA1(6f170e24f71d1504195face5f67176b55c933eef)) ROM_END -GAME(1983, icecold, 0, icecold, icecold, icecold, ROT0, "Taito", "Ice Cold Beer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1983, icecold, 0, icecold, icecold, icecold, ROT0, "Taito", "Ice Cold Beer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/ichiban.c mame-0.145/src/mame/drivers/ichiban.c --- mame-0.144/src/mame/drivers/ichiban.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/ichiban.c 2012-02-06 21:30:39.000000000 +0000 @@ -0,0 +1,170 @@ +/*************************************************************************** + +Ichi Ban Jyan +Excel, 199? + +TODO: code is encrypted (data, not opcodes) + +PCB Layout +---------- + +MJ911 +|----------------------------------| +|MB3712 DSW-D DSW-C DSW-B DSW-A SW| +| M6378 BATT | +|VOL 6264 3 | +| YM2413 MJB | +|M 1 2 | +|A YM2149 MJG |-------| | +|H |ALTERA | Z80 | +|J MJR |EP1810 | | +|O | | ALTERA | +|N |-------| EP910 | +|G | +| | +| 41464 41464 | +| 41464 41464 18.432MHz| +|----------------------------------| +Notes: +Z80 clock - 6.144MHz [18.432/3] +YM2149 clock - 1.536MHz [18.432/12] +YM2413 clock - 3.072MHz [18.432/6] +VSync - 60.5686Hz +HSync - 15.510kHz + +***************************************************************************/ + +#define ADDRESS_MAP_MODERN + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "sound/ay8910.h" +#include "sound/2413intf.h" + +#define MAIN_CLOCK XTAL_18_432MHz + +class ichibanjyan_state : public driver_device +{ +public: + ichibanjyan_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); + + virtual void video_start(); + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + DECLARE_WRITE8_MEMBER( bank_w ); +}; + +void ichibanjyan_state::video_start() +{ + +} + +UINT32 ichibanjyan_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) +{ + return 0; +} + + +static ADDRESS_MAP_START( ichibanjyan_map, AS_PROGRAM, 8, ichibanjyan_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank1") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( ichibanjyan_io, AS_IO, 8, ichibanjyan_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) +ADDRESS_MAP_END + +static INPUT_PORTS_START( ichibanjyan ) +INPUT_PORTS_END + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,1), + 8, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { STEP8( 0*512, 8 ) }, + { STEP8( 0*512, 8*8 ) }, + 8*8*8 +}; + +static GFXDECODE_START( ichibanjyan ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 1 ) +GFXDECODE_END + + +void ichibanjyan_state::machine_start() +{ + UINT8 *ROM = machine().region("code")->base(); + + memory_configure_bank(machine(), "bank1", 0, 4, ROM, 0x8000); +} + +void ichibanjyan_state::machine_reset() +{ +} + + +static MACHINE_CONFIG_START( ichibanjyan, ichibanjyan_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu",Z80,MAIN_CLOCK/3) + MCFG_CPU_PROGRAM_MAP(ichibanjyan_map) + MCFG_CPU_IO_MAP(ichibanjyan_io) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_UPDATE_DRIVER(ichibanjyan_state, screen_update) + MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + + MCFG_GFXDECODE(ichibanjyan) + + MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) + MCFG_PALETTE_LENGTH(512) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("aysnd", YM2149, MAIN_CLOCK/12) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) + + MCFG_SOUND_ADD("ymsnd", YM2413, MAIN_CLOCK/6) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) +MACHINE_CONFIG_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( ichiban ) + ROM_REGION( 0x20000, "code", 0 ) + ROM_LOAD( "3.u15", 0, 0x20000, CRC(76240568) SHA1(cf055d1eaae25661a49ec4722a2c7caca862e66a) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "1.u28", 0, 0x20000, CRC(2caa4d3f) SHA1(5e5af164880140b764c097a65388c22ba5ea572b) ) + + ROM_REGION( 0x20000, "gfx2", 0 ) + ROM_LOAD( "2.u14", 0, 0x20000, CRC(b4834d8e) SHA1(836ddf7586dc5440faf88f5ec50a32265e9a0ec8) ) + + ROM_REGION( 0x600, "proms", 0 ) + ROM_LOAD( "mjr.u36", 0x000, 0x200, CRC(31cd7a90) SHA1(1525ad19d748561a52626e4ab13df67d9bedf3b8) ) + ROM_LOAD( "mjg.u37", 0x200, 0x200, CRC(5b3562aa) SHA1(ada60d2a5a5a657d7b209d18a23b685305d9ff7b) ) + ROM_LOAD( "mjb.u38", 0x400, 0x200, CRC(0ef881cb) SHA1(44b61a443d683f5cb2d1b1a4f74d8a8f41021de5) ) +ROM_END + +GAME( 199?, ichiban, 0, ichibanjyan, ichibanjyan, 0, ROT0, "Excel", "Ichi Ban Jyan", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/igs009.c mame-0.145/src/mame/drivers/igs009.c --- mame-0.144/src/mame/drivers/igs009.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/igs009.c 2012-02-06 21:30:41.000000000 +0000 @@ -60,7 +60,7 @@ { igs009_state *state = space->machine().driver_data(); state->m_gp98_reel1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_gp98_reel1_tilemap,offset); + state->m_gp98_reel1_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jingbell_reel1_tile_info ) @@ -93,7 +93,7 @@ { igs009_state *state = space->machine().driver_data(); state->m_gp98_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_gp98_reel2_tilemap,offset); + state->m_gp98_reel2_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jingbell_reel2_tile_info ) @@ -126,7 +126,7 @@ { igs009_state *state = space->machine().driver_data(); state->m_gp98_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_gp98_reel3_tilemap,offset); + state->m_gp98_reel3_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jingbell_reel3_tile_info ) @@ -159,7 +159,7 @@ { igs009_state *state = space->machine().driver_data(); state->m_gp98_reel4_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_gp98_reel4_tilemap,offset); + state->m_gp98_reel4_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jingbell_reel4_tile_info ) @@ -196,7 +196,7 @@ { igs009_state *state = space->machine().driver_data(); state->m_bg_scroll[offset] = data; -// tilemap_set_scrolly(bg_tilemap,offset,data); +// bg_tilemap->set_scrolly(offset,data); } @@ -211,31 +211,31 @@ { igs009_state *state = space->machine().driver_data(); state->m_fg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_color_w ) { igs009_state *state = space->machine().driver_data(); state->m_fg_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static VIDEO_START(jingbell) { igs009_state *state = machine.driver_data(); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 0x80,0x20); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_gp98_reel1_tilemap = tilemap_create(machine,get_jingbell_reel1_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel2_tilemap = tilemap_create(machine,get_jingbell_reel2_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel3_tilemap = tilemap_create(machine,get_jingbell_reel3_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel4_tilemap = tilemap_create(machine,get_jingbell_reel4_tile_info,tilemap_scan_rows,8,32, 128, 8); - tilemap_set_scroll_cols(state->m_gp98_reel1_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel2_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel3_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel4_tilemap, 128); + state->m_gp98_reel1_tilemap->set_scroll_cols(128); + state->m_gp98_reel2_tilemap->set_scroll_cols(128); + state->m_gp98_reel3_tilemap->set_scroll_cols(128); + state->m_gp98_reel4_tilemap->set_scroll_cols(128); } @@ -243,33 +243,33 @@ { igs009_state *state = machine.driver_data(); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 0x80,0x20); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_gp98_reel1_tilemap = tilemap_create(machine,get_gp98_reel1_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel2_tilemap = tilemap_create(machine,get_gp98_reel2_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel3_tilemap = tilemap_create(machine,get_gp98_reel3_tile_info,tilemap_scan_rows,8,32, 128, 8); state->m_gp98_reel4_tilemap = tilemap_create(machine,get_gp98_reel4_tile_info,tilemap_scan_rows,8,32, 128, 8); - tilemap_set_scroll_cols(state->m_gp98_reel1_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel2_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel3_tilemap, 128); - tilemap_set_scroll_cols(state->m_gp98_reel4_tilemap, 128); + state->m_gp98_reel1_tilemap->set_scroll_cols(128); + state->m_gp98_reel2_tilemap->set_scroll_cols(128); + state->m_gp98_reel3_tilemap->set_scroll_cols(128); + state->m_gp98_reel4_tilemap->set_scroll_cols(128); } -static SCREEN_UPDATE(jingbell) +static SCREEN_UPDATE_IND16(jingbell) { - igs009_state *state = screen->machine().driver_data(); + igs009_state *state = screen.machine().driver_data(); int layers_ctrl = state->m_video_enable ? -1 : 0; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) mask |= 4; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask |= 4; if (mask != 0) layers_ctrl &= mask; } #endif @@ -278,15 +278,15 @@ { int zz,i; int startclipmin = 0; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); for (i= 0;i < 0x80;i++) { - tilemap_set_scrolly(state->m_gp98_reel1_tilemap, i, state->m_bg_scroll[i]*2); - tilemap_set_scrolly(state->m_gp98_reel2_tilemap, i, state->m_bg_scroll[i+0x80]*2); - tilemap_set_scrolly(state->m_gp98_reel3_tilemap, i, state->m_bg_scroll[i+0x100]*2); - tilemap_set_scrolly(state->m_gp98_reel4_tilemap, i, state->m_bg_scroll[i+0x180]*2); + state->m_gp98_reel1_tilemap->set_scrolly(i, state->m_bg_scroll[i]*2); + state->m_gp98_reel2_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x80]*2); + state->m_gp98_reel3_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x100]*2); + state->m_gp98_reel4_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x180]*2); } @@ -298,28 +298,25 @@ int rowenable = state->m_bg_scroll2[zz]; /* draw top of screen */ - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = startclipmin; - clip.max_y = startclipmin+2; + clip.set(visarea.min_x, visarea.max_x, startclipmin, startclipmin+2); - bitmap_fill(bitmap,&clip,screen->machine().pens[rowenable]); + bitmap.fill(screen.machine().pens[rowenable], clip); if (rowenable==0) { // 0 and 1 are the same? or is there a global switchoff? - tilemap_draw(bitmap,&clip,state->m_gp98_reel1_tilemap,0,0); + state->m_gp98_reel1_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==1) { - tilemap_draw(bitmap,&clip,state->m_gp98_reel2_tilemap,0,0); + state->m_gp98_reel2_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==2) { - tilemap_draw(bitmap,&clip,state->m_gp98_reel3_tilemap,0,0); + state->m_gp98_reel3_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==3) { - tilemap_draw(bitmap,&clip,state->m_gp98_reel4_tilemap,0,0); + state->m_gp98_reel4_tilemap->draw(bitmap, clip, 0,0); } @@ -327,10 +324,10 @@ } } - else bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + else bitmap.fill(get_black_pen(screen.machine()), cliprect); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + if (layers_ctrl & 2) state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -686,10 +683,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1) - MCFG_SCREEN_UPDATE(jingbell) + MCFG_SCREEN_UPDATE_STATIC(jingbell) MCFG_GFXDECODE(jingbell) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/igs011.c mame-0.145/src/mame/drivers/igs011.c --- mame-0.144/src/mame/drivers/igs011.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/igs011.c 2012-02-06 21:30:41.000000000 +0000 @@ -61,7 +61,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "sound/2413intf.h" @@ -85,7 +84,9 @@ { public: igs011_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } UINT8 *m_layer[8]; UINT16 m_priority; @@ -105,6 +106,8 @@ UINT16 m_lhb_irq_enable; UINT16 *m_vbowl_trackball; blitter_t m_blitter; + + required_device m_maincpu; }; @@ -154,9 +157,9 @@ state->m_lhb2_pen_hi = 0; } -static SCREEN_UPDATE( igs011 ) +static SCREEN_UPDATE_IND16( igs011 ) { - igs011_state *state = screen->machine().driver_data(); + igs011_state *state = screen.machine().driver_data(); #ifdef MAME_DEBUG int layer_enable = -1; #endif @@ -165,26 +168,26 @@ UINT16 *pri_ram; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 0x01; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 0x02; - if (screen->machine().input().code_pressed(KEYCODE_E)) mask |= 0x04; - if (screen->machine().input().code_pressed(KEYCODE_R)) mask |= 0x08; - if (screen->machine().input().code_pressed(KEYCODE_A)) mask |= 0x10; - if (screen->machine().input().code_pressed(KEYCODE_S)) mask |= 0x20; - if (screen->machine().input().code_pressed(KEYCODE_D)) mask |= 0x40; - if (screen->machine().input().code_pressed(KEYCODE_F)) mask |= 0x80; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 0x01; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 0x02; + if (screen.machine().input().code_pressed(KEYCODE_E)) mask |= 0x04; + if (screen.machine().input().code_pressed(KEYCODE_R)) mask |= 0x08; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask |= 0x10; + if (screen.machine().input().code_pressed(KEYCODE_S)) mask |= 0x20; + if (screen.machine().input().code_pressed(KEYCODE_D)) mask |= 0x40; + if (screen.machine().input().code_pressed(KEYCODE_F)) mask |= 0x80; if (mask) layer_enable &= mask; } #endif pri_ram = &state->m_priority_ram[(state->m_priority & 7) * 512/2]; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { scr_addr = x + y * 512; pri_addr = 0xff; @@ -204,10 +207,10 @@ #ifdef MAME_DEBUG if ((layer_enable != -1) && (pri_addr == 0xff)) - *BITMAP_ADDR16(bitmap, y, x) = get_black_pen(screen->machine()); + bitmap.pix16(y, x) = get_black_pen(screen.machine()); else #endif - *BITMAP_ADDR16(bitmap, y, x) = state->m_layer[l][scr_addr] | (l << 8); + bitmap.pix16(y, x) = state->m_layer[l][scr_addr] | (l << 8); } } return 0; @@ -433,7 +436,7 @@ } // plot it - if (x >= clip.min_x && x <= clip.max_x && y >= clip.min_y && y <= clip.max_y) + if (clip.contains(x, y)) { if (clear) dest[x + y * 512] = clear_pen; else if (pen != trans_pen) dest[x + y * 512] = pen | pen_hi; @@ -2385,11 +2388,15 @@ return 0xffff; } -static SCREEN_EOF( vbowl ) +static SCREEN_VBLANK( vbowl ) { - igs011_state *state = machine.driver_data(); - state->m_vbowl_trackball[0] = state->m_vbowl_trackball[1]; - state->m_vbowl_trackball[1] = (input_port_read(machine, "AN1") << 8) | input_port_read(machine, "AN0"); + // rising edge + if (vblank_on) + { + igs011_state *state = screen.machine().driver_data(); + state->m_vbowl_trackball[0] = state->m_vbowl_trackball[1]; + state->m_vbowl_trackball[1] = (input_port_read(screen.machine(), "AN1") << 8) | input_port_read(screen.machine(), "AN0"); + } } static WRITE16_HANDLER( vbowl_pen_hi_w ) @@ -3571,10 +3578,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) - MCFG_SCREEN_UPDATE( igs011 ) + MCFG_SCREEN_UPDATE_STATIC( igs011 ) MCFG_PALETTE_LENGTH(0x800) // MCFG_GFXDECODE(igs011) @@ -3587,20 +3593,19 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END -static INTERRUPT_GEN( drgnwrld_interrupt ) + +static TIMER_DEVICE_CALLBACK ( drgnworld_timer_irq_cb ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 6, HOLD_LINE); break; - default: - case 1: device_set_input_line(device, 5, HOLD_LINE); break; - } + igs011_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); } static MACHINE_CONFIG_DERIVED( drgnwrld, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(drgnwrld) - MCFG_CPU_VBLANK_INT_HACK(drgnwrld_interrupt,1+4) // lev5 frequency drives the music tempo + MCFG_CPU_VBLANK_INT("screen",irq6_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", drgnworld_timer_irq_cb, attotime::from_hz(240)) // lev5 frequency drives the music tempo MCFG_SOUND_ADD("ymsnd", YM3812, 3579545) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0) @@ -3613,43 +3618,47 @@ -static INTERRUPT_GEN( lhb_interrupt ) +static INTERRUPT_GEN( lhb_vblank_irq ) { igs011_state *state = device->machine().driver_data(); if (!state->m_lhb_irq_enable) return; - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 3, HOLD_LINE); break; - case 2: device_set_input_line(device, 6, HOLD_LINE); break; - default: - // It reads the inputs. Must be called more than once for test mode on boot to work - device_set_input_line(device, 5, HOLD_LINE); break; - } + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); +} + +static TIMER_DEVICE_CALLBACK ( lhb_timer_irq_cb ) +{ + igs011_state *state = timer.machine().driver_data(); + if (!state->m_lhb_irq_enable) + return; + + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); } static MACHINE_CONFIG_DERIVED( lhb, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(lhb) - MCFG_CPU_VBLANK_INT_HACK(lhb_interrupt,3+1) + MCFG_CPU_VBLANK_INT("screen",lhb_vblank_irq) + MCFG_TIMER_ADD_PERIODIC("timer_irq", lhb_timer_irq_cb, attotime::from_hz(240)) // lev5 frequency drives the music tempo + // irq 3 points to an apparently unneeded routine MACHINE_CONFIG_END -static INTERRUPT_GEN( wlcc_interrupt ) +static TIMER_DEVICE_CALLBACK ( wlcc_timer_irq_cb ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 3, HOLD_LINE); break; - case 1: device_set_input_line(device, 6, HOLD_LINE); break; - } + igs011_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); } + static MACHINE_CONFIG_DERIVED( wlcc, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(wlcc) - MCFG_CPU_VBLANK_INT_HACK(wlcc_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq6_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", wlcc_timer_irq_cb, attotime::from_hz(240)) // lev3 frequency drives the music tempo MACHINE_CONFIG_END @@ -3657,7 +3666,8 @@ static MACHINE_CONFIG_DERIVED( xymg, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(xymg) - MCFG_CPU_VBLANK_INT_HACK(wlcc_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq6_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", wlcc_timer_irq_cb, attotime::from_hz(240)) // lev3 frequency drives the music tempo MACHINE_CONFIG_END @@ -3665,7 +3675,8 @@ static MACHINE_CONFIG_DERIVED( lhb2, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(lhb2) - MCFG_CPU_VBLANK_INT_HACK(drgnwrld_interrupt,1+4) // lev5 frequency drives the music tempo + MCFG_CPU_VBLANK_INT("screen",irq6_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", drgnworld_timer_irq_cb, attotime::from_hz(240)) // lev5 frequency drives the music tempo // MCFG_GFXDECODE(igs011_hi) @@ -3680,25 +3691,16 @@ // cputag_set_input_line(machine, "maincpu", 3, state); } -static INTERRUPT_GEN( vbowl_interrupt ) -{ - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 4, HOLD_LINE); break; - case 1: device_set_input_line(device, 5, HOLD_LINE); break; - case 2: device_set_input_line(device, 6, HOLD_LINE); break; - default: - case 3: device_set_input_line(device, 3, HOLD_LINE); break; // sound - } -} - static MACHINE_CONFIG_DERIVED( vbowl, igs011_base ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(vbowl) - MCFG_CPU_VBLANK_INT_HACK(vbowl_interrupt,3+4) + MCFG_CPU_VBLANK_INT("screen",irq6_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", wlcc_timer_irq_cb, attotime::from_hz(240)) // lev3 frequency drives the music tempo + // irq 5 points to a debug function (all routines are clearly patched out) + // irq 4 points to an apparently unneeded routine MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(vbowl) // trackball + MCFG_SCREEN_VBLANK_STATIC(vbowl) // trackball // MCFG_GFXDECODE(igs011_hi) MCFG_DEVICE_REMOVE("oki") diff -Nru mame-0.144/src/mame/drivers/igs017.c mame-0.145/src/mame/drivers/igs017.c --- mame-0.144/src/mame/drivers/igs017.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/igs017.c 2012-02-06 21:30:42.000000000 +0000 @@ -42,7 +42,6 @@ ************************************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "cpu/z180/z180.h" #include "machine/8255ppi.h" @@ -54,7 +53,9 @@ { public: igs017_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } int m_toggle; int m_debug_addr; @@ -75,6 +76,8 @@ int m_irq1_enable; int m_irq2_enable; UINT8 *m_spriteram; + + required_device m_maincpu; }; @@ -125,14 +128,14 @@ { igs017_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/4); + state->m_fg_tilemap->mark_tile_dirty(offset/4); } static WRITE8_HANDLER( bg_w ) { igs017_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/4); + state->m_bg_tilemap->mark_tile_dirty(offset/4); } // 16-bit handlers for an 8-bit chip @@ -201,8 +204,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0xf); - tilemap_set_transparent_pen(state->m_bg_tilemap,0xf); + state->m_fg_tilemap->set_transparent_pen(0xf); + state->m_bg_tilemap->set_transparent_pen(0xf); state->m_toggle = 0; state->m_debug_addr = 0; @@ -244,7 +247,7 @@ ***************************************************************************/ -static void draw_sprite(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, int sx, int sy, int dimx, int dimy, int flipx, int flipy, int color, int addr) +static void draw_sprite(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect, int sx, int sy, int dimx, int dimy, int flipx, int flipy, int color, int addr) { igs017_state *state = machine.driver_data(); // prepare GfxElement on the fly @@ -262,7 +265,7 @@ sx, sy, 0x1f ); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { igs017_state *state = machine.driver_data(); UINT8 *s = state->m_spriteram; @@ -298,7 +301,7 @@ } // A simple gfx viewer (toggle with T) -static int debug_viewer(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static int debug_viewer(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { #ifdef MAME_DEBUG igs017_state *state = machine.driver_data(); @@ -327,7 +330,7 @@ if (w <= 0) w = 0; if (w > 1024) w = 1024; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); draw_sprite(machine, bitmap, cliprect, 0,0, w,h, 0,0, 0, a); @@ -341,35 +344,35 @@ return 0; } -static SCREEN_UPDATE( igs017 ) +static SCREEN_UPDATE_IND16( igs017 ) { - igs017_state *state = screen->machine().driver_data(); + igs017_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) mask |= 4; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask |= 4; if (mask != 0) layers_ctrl &= mask; } #endif - if (debug_viewer(screen->machine(), bitmap,cliprect)) + if (debug_viewer(screen.machine(), bitmap,cliprect)) return 0; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (state->m_video_disable) return 0; - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 4) draw_sprites(screen->machine(), bitmap, cliprect); + if (layers_ctrl & 4) draw_sprites(screen.machine(), bitmap, cliprect); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + if (layers_ctrl & 2) state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -2271,21 +2274,19 @@ Machine Drivers ***************************************************************************/ -static INTERRUPT_GEN( iqblocka_interrupt ) +static TIMER_DEVICE_CALLBACK( irqblocka_interrupt ) { - igs017_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) & 1) - { - if (state->m_nmi_enable) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - else - { - if (state->m_irq_enable) - device_set_input_line(device, 0, HOLD_LINE); - } + igs017_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240 && state->m_irq_enable) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + + if(scanline == 0 && state->m_nmi_enable) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } + // Dips are read through the 8255 static const ppi8255_interface iqblocka_ppi8255_intf = { @@ -2310,7 +2311,7 @@ MCFG_CPU_ADD("maincpu", Z180, XTAL_16MHz / 2) MCFG_CPU_PROGRAM_MAP(iqblocka_map) MCFG_CPU_IO_MAP(iqblocka_io) - MCFG_CPU_VBLANK_INT_HACK(iqblocka_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", irqblocka_interrupt, "screen", 0, 1) MCFG_PPI8255_ADD( "ppi8255", iqblocka_ppi8255_intf ) @@ -2320,10 +2321,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) - MCFG_SCREEN_UPDATE(igs017) + MCFG_SCREEN_UPDATE_STATIC(igs017) MCFG_GFXDECODE(igs017) MCFG_PALETTE_LENGTH(0x100*2) @@ -2344,19 +2344,16 @@ // mgcs -static INTERRUPT_GEN( mgcs_interrupt ) +static TIMER_DEVICE_CALLBACK( mgcs_interrupt ) { - igs017_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) & 1) - { - if (state->m_irq2_enable) - device_set_input_line(device, 2, HOLD_LINE); - } - else - { - if (state->m_irq1_enable) - device_set_input_line(device, 1, HOLD_LINE); - } + igs017_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240 && state->m_irq1_enable) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 0 && state->m_irq2_enable) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } static MACHINE_RESET( mgcs ) @@ -2383,7 +2380,7 @@ static MACHINE_CONFIG_START( mgcs, igs017_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz / 2) MCFG_CPU_PROGRAM_MAP(mgcs) - MCFG_CPU_VBLANK_INT_HACK(mgcs_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mgcs_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(mgcs) @@ -2393,10 +2390,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) - MCFG_SCREEN_UPDATE(igs017) + MCFG_SCREEN_UPDATE_STATIC(igs017) MCFG_GFXDECODE(igs017_flipped) MCFG_PALETTE_LENGTH(0x100*2) @@ -2428,7 +2424,7 @@ static MACHINE_CONFIG_START( sdmg2, igs017_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz/2) MCFG_CPU_PROGRAM_MAP(sdmg2) - MCFG_CPU_VBLANK_INT_HACK(mgcs_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mgcs_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(mgcs) @@ -2438,10 +2434,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // VSync 60Hz, HSync 15.3kHz MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1) - MCFG_SCREEN_UPDATE(igs017) + MCFG_SCREEN_UPDATE_STATIC(igs017) MCFG_GFXDECODE(igs017) MCFG_PALETTE_LENGTH(0x100*2) @@ -2458,19 +2453,16 @@ // mgdh -static INTERRUPT_GEN( mgdh_interrupt ) +static TIMER_DEVICE_CALLBACK( mgdh_interrupt ) { - igs017_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) & 1) - { - if (state->m_irq2_enable) - device_set_input_line(device, 3, HOLD_LINE); // lev 3 instead of 2 - } - else - { - if (state->m_irq1_enable) - device_set_input_line(device, 1, HOLD_LINE); - } + igs017_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240 && state->m_irq1_enable) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 0 && state->m_irq2_enable) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); // lev 3 instead of 2 } static const ppi8255_interface mgdh_ppi8255_intf = @@ -2487,7 +2479,7 @@ static MACHINE_CONFIG_START( mgdha, igs017_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_22MHz / 2) MCFG_CPU_PROGRAM_MAP(mgdha_map) - MCFG_CPU_VBLANK_INT_HACK(mgdh_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mgdh_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(mgcs) @@ -2497,10 +2489,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1) - MCFG_SCREEN_UPDATE(igs017) + MCFG_SCREEN_UPDATE_STATIC(igs017) MCFG_GFXDECODE(igs017_swapped) MCFG_PALETTE_LENGTH(0x100*2) @@ -2521,7 +2512,7 @@ MCFG_CPU_ADD("maincpu", Z180, XTAL_16MHz / 2) MCFG_CPU_PROGRAM_MAP(tjsb_map) MCFG_CPU_IO_MAP(tjsb_io) - MCFG_CPU_VBLANK_INT_HACK(iqblocka_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", irqblocka_interrupt, "screen", 0, 1) MCFG_PPI8255_ADD( "ppi8255", iqblocka_ppi8255_intf ) @@ -2531,10 +2522,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1) - MCFG_SCREEN_UPDATE(igs017) + MCFG_SCREEN_UPDATE_STATIC(igs017) MCFG_GFXDECODE(igs017) MCFG_PALETTE_LENGTH(0x100*2) diff -Nru mame-0.144/src/mame/drivers/igs_m027.c mame-0.145/src/mame/drivers/igs_m027.c --- mame-0.144/src/mame/drivers/igs_m027.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/igs_m027.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,4 +1,4 @@ -/* IGS ARM7 (IGS027A) based Mahjong platform +/* IGS ARM7 (IGS027A) based Mahjong / Gambling platform Driver by Xing Xing These games use the IGS027A processor. @@ -10,7 +10,7 @@ games make use of that feature. To emulate these games the Internal ROM will need dumping - There are at least 5 other games on the platform. + There are at least 20 other games on this and similar platforms. */ @@ -30,7 +30,7 @@ UINT32 *m_igs_cg_videoram; UINT32 *m_igs_tx_videoram; UINT32 *m_igs_bg_videoram; - UINT32 *m_igs_pallete32; + UINT32 *m_igs_palette32; tilemap_t *m_igs_tx_tilemap; tilemap_t *m_igs_bg_tilemap; }; @@ -42,7 +42,7 @@ Video 0x38001000, 0x380017ff CG_CONTROL,8 byte per object, 0x100 in total - 0x38001800, 0x380019ff PALLETE RAM,2 byte per color, 0x100 in total + 0x38001800, 0x380019ff PALETTE RAM,2 byte per color, 0x100 in total 0x38004000, 0x38005FFF TX Video RAM????????1E00??????512x240?????? 0x38006000, 0x38007FFF BG Video RAM????????1E00??????512x240?????? @@ -100,7 +100,7 @@ { igs_m027_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_igs_tx_videoram[offset]); - tilemap_mark_tile_dirty(state->m_igs_tx_tilemap,offset); + state->m_igs_tx_tilemap->mark_tile_dirty(offset); //if(data!=0) //logerror( "TX VIDEO RAM OFFSET %x ,data %x!\n",offset ,state->m_igs_tx_videoram[offset]); } @@ -121,7 +121,7 @@ { igs_m027_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_igs_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_igs_bg_tilemap,offset); + state->m_igs_bg_tilemap->mark_tile_dirty(offset); //if(data!=0) logerror("BG VIDEO RAM OFFSET %x ,data %x!\n",offset ,state->m_igs_bg_videoram[offset]); } @@ -138,16 +138,16 @@ } -/* Pallete Layer */ -static WRITE32_HANDLER( igs_pallete32_w ) +/* Palette Layer */ +static WRITE32_HANDLER( igs_palette32_w ) { igs_m027_state *state = space->machine().driver_data(); - space->machine().generic.paletteram.u16=(UINT16 *)state->m_igs_pallete32; - COMBINE_DATA(&state->m_igs_pallete32[offset]); + space->machine().generic.paletteram.u16=(UINT16 *)state->m_igs_palette32; + COMBINE_DATA(&state->m_igs_palette32[offset]); //paletteram16_xGGGGGRRRRRBBBBB_word_w(offset*2,space->machine().generic.paletteram.u16[offset*2],0); //paletteram16_xGGGGGRRRRRBBBBB_word_w(offset*2+1,space->machine().generic.paletteram.u16[offset*2+1],0); //if(data!=0) - //fprintf(stdout,"PALLETE RAM OFFSET %x ,data %x!\n",offset ,state->m_igs_pallete32[offset]); + //fprintf(stdout,"PALETTE RAM OFFSET %x ,data %x!\n",offset ,state->m_igs_palette32[offset]); } @@ -156,26 +156,26 @@ { igs_m027_state *state = machine.driver_data(); state->m_igs_tx_tilemap= tilemap_create(machine, get_tx_tilemap_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_igs_tx_tilemap,15); + state->m_igs_tx_tilemap->set_transparent_pen(15); state->m_igs_bg_tilemap= tilemap_create(machine, get_bg_tilemap_tile_info,tilemap_scan_rows, 8, 8,64,32); //state->m_igs_bg_tilemap= tilemap_create(machine, get_bg_tilemap_tile_info,tilemap_scan_rows, 8, 8,64,32); - //tilemap_set_transparent_pen(state->m_igs_bg_tilemap,15); + //state->m_igs_bg_tilemap->set_transparent_pen(15); logerror("Video START OK!\n"); } -static SCREEN_UPDATE(igs_majhong) +static SCREEN_UPDATE_IND16(igs_majhong) { - igs_m027_state *state = screen->machine().driver_data(); + igs_m027_state *state = screen.machine().driver_data(); //?????????? - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); //?????? - tilemap_draw(bitmap,cliprect,state->m_igs_bg_tilemap,0,0); + state->m_igs_bg_tilemap->draw(bitmap, cliprect, 0,0); //CG?????? //?????? - tilemap_draw(bitmap,cliprect,state->m_igs_tx_tilemap,0,0); + state->m_igs_tx_tilemap->draw(bitmap, cliprect, 0,0); //fprintf(stdout,"Video UPDATE OK!\n"); return 0; } @@ -197,8 +197,8 @@ AM_RANGE(0x10000000, 0x100003ff) AM_RAM AM_BASE_MEMBER(igs_m027_state, m_igs_mainram)// main ram for asic? AM_RANGE(0x18000000, 0x18007fff) AM_RAM - AM_RANGE(0x38001000, 0x380017ff) AM_RAM_WRITE(igs_cg_videoram_w) AM_BASE_MEMBER(igs_m027_state, m_igs_cg_videoram) //0x200 * 1 CG PALLETE? - AM_RANGE(0x38001800, 0x38001fff) AM_RAM_WRITE(igs_pallete32_w) AM_BASE_MEMBER(igs_m027_state, m_igs_pallete32) //0x200 * 1 + AM_RANGE(0x38001000, 0x380017ff) AM_RAM_WRITE(igs_cg_videoram_w) AM_BASE_MEMBER(igs_m027_state, m_igs_cg_videoram) //0x200 * 1 CG PALETTE? + AM_RANGE(0x38001800, 0x38001fff) AM_RAM_WRITE(igs_palette32_w) AM_BASE_MEMBER(igs_m027_state, m_igs_palette32) //0x200 * 1 AM_RANGE(0x38004000, 0x38005FFF) AM_RAM_WRITE(igs_tx_videoram_w) AM_BASE_MEMBER(igs_m027_state, m_igs_tx_videoram) /* Text Layer */ AM_RANGE(0x38006000, 0x38007FFF) AM_RAM_WRITE(igs_bg_videoram_w) AM_BASE_MEMBER(igs_m027_state, m_igs_bg_videoram) /* CG Layer */ @@ -401,10 +401,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE( igs_majhong ) + MCFG_SCREEN_UPDATE_STATIC( igs_majhong ) MCFG_PALETTE_LENGTH(0x200) @@ -613,6 +612,170 @@ ROM_LOAD( "s2602.u14", 0x00000, 0x100000, CRC(f137028c) SHA1(0e4114222820bca2f7026fa653e2b96a489a0183) ) ROM_END +/* + + +Gone Fishing II +IGS PCB-0388-05-FW + + +--------------------------------------------+ ++--+ 8-Liner Connecter +---+ +| | +| +---------------+ +-+ +| | IGS 0027A | +------+ | ++-+ | Plug-in | | IGS | +-+ + | | Daughter | | 025 | P| ++-+ | Card | +------+ r| +| +---------------+ +---+ i| +|J | | n| +|A +---+ +---+ +---+ | | t| +|M | | | | | | | U | +-+ +|M | | | | | | | 1 | +---+ | +|A | U | | U | | U | | 2 | | | +-+ +| | 1 | | 1 | | 1 | | | +----+ | U | | +|C | 5 | | 7 | | 4 | | | |Oki | | 1 | | +|o | | | | | * | | | |6295| | 3 | | +|n | | | | | | +---+ +----+ | | | +|n | | | | | | +---+ | +|e +---+ | | +---+ | +|c +---+ | +|t 62257 | +|e | +|r +-------+ | +| | | | +| | IGS | | +| | 031 | 61256 | ++-+ | | PAL V3021 | + | +-------+ | ++-+ X1 SW4 | +| | +| JP11 SW3 SW2 SW1 BT1 | +| | ++---------------------------------------------------+ + + +U12 - Program rom - 27C4096 +U15 - Text graphics - 27C4096 +U17 - Char graphics - 27C160 +U23 - Sound samples - 27C040 + +SW1-SW3 are unpopulated +U14* Not used (27C4096) or else it's U16 and 27C160 type EPROM + + X1 - 32.768kHZ OSC +V3021 - Micro Electronic Ultra Low Power 1-Bit 32kHz RTC (Real Time Clock) + PAL - ATF22V10C at U26 labeled FW U26 + BT1 - 3.6V battery + SW4 - Toggle switch + JP11 - 4 Pin header (HD4-156) + +IGS 025 - Custom programmed A8B1723(?) +IGS 0027 - Custom programmed ARM9 + +*/ + + + +ROM_START( gonefsh2 ) + ROM_REGION( 0x04000, "maincpu", 0 ) + /* Internal rom of IGS027A ARM based MCU */ + ROM_LOAD( "gonefsh2_igs027a", 0x00000, 0x4000, NO_DUMP ) + + ROM_REGION( 0x80000, "user1", 0 ) // external ARM data / prg + ROM_LOAD( "gfii_v-904uso.u12", 0x000000, 0x80000, CRC(ef0f6735) SHA1(0add92599b0989f3e50dc64e32ce234b4bd87d33) ) + + ROM_REGION( 0x80000, "gfx1", 0 ) + ROM_LOAD( "gfii_text.u15", 0x000000, 0x80000, CRC(b48118fd) SHA1(e718d23ce5f7f41ab94df2d05cdd3adbf27eef89) ) + + ROM_REGION( 0x400000, "gfx2", 0 ) + ROM_LOAD( "gfii_cg.u17", 0x000000, 0x200000, CRC(2568359c) SHA1(f1f240246e53496bf624c84f7cae3edb9675579f) ) + + ROM_REGION( 0x200000, "unknown", 0 ) + ROM_LOAD( "gfii_sp.u13", 0x00000, 0x080000, CRC(61da1d58) SHA1(0a79578f0daf15f0efe2b0eeac59a60d8372a644) ) +ROM_END + +/* + + +Chess Challenge II + +IGS PCB-0388-04-FW + + +--------------------------------------------+ ++--+ 8-Liner Connecter +---+ +| | +| +---------------+ +-+ +| | IGS 0027A | +------+ | ++-+ | Plug-in | | IGS | +-+ + | | Daughter | | 025 | P| ++-+ | Card | +------+ r| +| +---------------+ +---+ i| +|J | | n| +|A +---+ +---+ +---+ | | t| +|M | | | | | | | U | +-+ +|M | | | | | | | 1 | +---+ | +|A | U | | U | | U | | 2 | | | +-+ +| | 1 | | 1 | | 1 | | | +----+ | U | | +|C | 5 | | 7 | | 4 | | | |Oki | | 1 | | +|o | | | | | * | | | |6295| | 3 | | +|n | | | | | | +---+ +----+ | | | +|n | | | | | | +---+ | +|e +---+ | | +---+ | +|c +---+ | +|t 62257 | +|e | +|r +-------+ | +| | | | +| | IGS | | +| | 031 | 61256 | ++-+ | | PAL V3021 | + | +-------+ | ++-+ X1 SW4 | +| | +| JP11 SW3 SW2 SW1 BT1 | +| | ++---------------------------------------------------+ + + +U12 - Program rom - 27C4096 +U15 - Text graphics - 27C4096 +U17 - Char graphics - 27C160 +U23 - Sound samples - 27C040 + +SW1-SW3 are unpopulated +U14* Not used (27C4096) or else it's U16 and 27C160 type EPROM + + X1 - 32.768K OSC +V3021 - Micro Electronic Ultra Low Power 1-Bit 32kHz RTC (Real Time Clock) + PAL - ATF22V10C at U26 labeled FW U26 + BT1 - 3.6V battery + SW4 - Toggle switch + JP11 - 4 Pin header (HD4-156) + +IGS 025 - Custom programmed A8B1723(?) +IGS 0027 - Custom programmed ARM9 + +*/ + +ROM_START( chessc2 ) + ROM_REGION( 0x04000, "maincpu", 0 ) + /* Internal rom of IGS027A ARM based MCU */ + ROM_LOAD( "gonefsh2_igs027a", 0x00000, 0x4000, NO_DUMP ) + + ROM_REGION( 0x80000, "user1", 0 ) // external ARM data / prg + ROM_LOAD( "ccii_v-707uso.u12", 0x000000, 0x80000, CRC(5937b67b) SHA1(967b3adf6f5bf92d63ec460d595e473898a78372) ) + + ROM_REGION( 0x80000, "gfx1", 0 ) + ROM_LOAD( "ccii_text.u15", 0x000000, 0x80000, CRC(25fed033) SHA1(b321c4994f609906597c3f7d5cdfc2dca63cd340) ) + + ROM_REGION( 0x400000, "gfx2", 0 ) + ROM_LOAD( "ccii_cg.u17", 0x000000, 0x200000, CRC(47e45157) SHA1(4459799a4a6c30a2d0a3ad9ac54e92b62221e10b) ) + + ROM_REGION( 0x200000, "unknown", 0 ) + ROM_LOAD( "ccii_sp.u13", 0x00000, 0x080000, CRC(220a7b71) SHA1(7dab7baa97c20b83763cf46ef0a6e5e8c4d6a348) ) +ROM_END + + /*************************************************************************** @@ -620,10 +783,12 @@ ***************************************************************************/ -GAME( 2002, sdwx, 0, igs_majhong, sdwx, sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", GAME_NO_SOUND | GAME_NOT_WORKING ) // aka Christmas 5 Line? -GAME( 200?, sddz, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Super Dou Di Zhu", GAME_NO_SOUND | GAME_NOT_WORKING ) -GAME( 2000, bigd2,0, igs_majhong, sdwx, 0, ROT0, "IGS", "Big D2", GAME_NO_SOUND | GAME_NOT_WORKING ) -GAME( 200?, lhzb3,0, igs_majhong, sdwx, 0, ROT0, "IGS", "Long Hu Zheng Ba 3", GAME_NO_SOUND | GAME_NOT_WORKING ) // ????????3 -GAME( 200?, lhzb4,0, igs_majhong, sdwx, 0, ROT0, "IGS", "Long Hu Zheng Ba 4", GAME_NO_SOUND | GAME_NOT_WORKING ) // ????????4 -GAME( 200?, klxyj,0, igs_majhong, sdwx, 0, ROT0, "IGS", "Kuai Le Xi You Ji", GAME_NO_SOUND | GAME_NOT_WORKING ) // ?????????? -GAME( 2000, mgfx, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Man Guan Fu Xing", GAME_NO_SOUND | GAME_NOT_WORKING ) // ???????? +GAME( 2002, sdwx, 0, igs_majhong, sdwx, sdwx, ROT0, "IGS", "Sheng Dan Wu Xian", GAME_NO_SOUND | GAME_NOT_WORKING ) // aka Christmas 5 Line? +GAME( 200?, sddz, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Super Dou Di Zhu", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 2000, bigd2, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Big D2", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 200?, lhzb3, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Long Hu Zheng Ba 3", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 200?, lhzb4, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Long Hu Zheng Ba 4", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 200?, klxyj, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Kuai Le Xi You Ji", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 2000, mgfx, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Man Guan Fu Xing", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 200?, gonefsh2, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Gone Fishing 2", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 200?, chessc2, 0, igs_majhong, sdwx, 0, ROT0, "IGS", "Chess Challenge 2", GAME_NO_SOUND | GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/igspc.c mame-0.145/src/mame/drivers/igspc.c --- mame-0.144/src/mame/drivers/igspc.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/igspc.c 2012-02-06 21:30:41.000000000 +0000 @@ -2,6 +2,13 @@ IGS PC based hardware + + Speed Driver + ------------- + +TODO: +can't be emulated without proper mb bios + 4 boards 1x NV440 gfx card 1x sound card @@ -13,8 +20,28 @@ when detecting the HDDs which further backs up the theory that it is provided or decrypted by the 027A + EZTouch + -------------- + + Custom board + + AMD Geode Processor (MediaGX derived?) + marked + AGXD533AAXFDCC + 0452EQA + (c)2001 2.1 + TAIWAN + + IGS027 security chip (ARM with internal ROM) (dumped!) + + IGS035? (maybe..) + + CF card + */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" @@ -22,15 +49,21 @@ { public: speeddrv_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( speeddrv_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( speeddrv_map, AS_PROGRAM, 32, speeddrv_state ) AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("bios", 0 ) ADDRESS_MAP_END -static ADDRESS_MAP_START( speeddrv_io, AS_IO, 32 ) +static ADDRESS_MAP_START( speeddrv_io, AS_IO, 32, speeddrv_state ) ADDRESS_MAP_END @@ -58,9 +91,25 @@ DISK_IMAGE( "speeddrv", 0, SHA1(88712a37b75d84cf9b5a4bee9386285d1b3760b3) ) ROM_END +ROM_START( eztouch ) + ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ + ROM_LOAD( "szz_bios.rom", 0x0000, 0x040000, CRC(9b09f094) SHA1(a9c533afa29218339bbd4f12075f34f9574e3bf6) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "szz_027a.rom", 0x000000, 0x04000, CRC(f05dae69) SHA1(fa64e73cf045cda64aa0b702de3bd032a44d2c5c) ) + + ROM_REGION( 0x80000, "extarm", 0 ) /* external ROM for ARM? (encrypted) */ + ROM_LOAD( "szz_v116cn.rom", 0x000000, 0x80000, CRC(8c443a89) SHA1(efdbaa832def812e0786cab95ebf60cdc226d3c4)) + + DISK_REGION( "disks" ) + DISK_IMAGE( "szz_cf", 0, SHA1(2f19b68b1db8a0b5e85ad43dc3b5bf651d465bd9) ) +ROM_END + + static DRIVER_INIT(speeddrv) { } -GAME( 2004, speeddrv, 0, speeddrv, speeddrv, speeddrv, ROT0, "IGS", "Speed Driver", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2004, speeddrv, 0, speeddrv, speeddrv, speeddrv, ROT0, "IGS", "Speed Driver", GAME_IS_SKELETON ) +GAME( 200?, eztouch, 0, speeddrv, speeddrv, speeddrv, ROT0, "IGS", "EZ Touch (v116 China)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/igspoker.c mame-0.145/src/mame/drivers/igspoker.c --- mame-0.144/src/mame/drivers/igspoker.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/igspoker.c 2012-02-06 21:30:33.000000000 +0000 @@ -65,7 +65,6 @@ #define VERBOSE 0 #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/2413intf.h" #include "sound/okim6295.h" @@ -76,7 +75,9 @@ { public: igspoker_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } int m_nmi_enable; int m_bg_enable; @@ -88,6 +89,8 @@ tilemap_t *m_bg_tilemap; UINT8 m_out[3]; size_t m_protection_res; + + required_device m_maincpu; }; @@ -99,19 +102,27 @@ state->m_bg_enable = 1; } -static INTERRUPT_GEN( igs_interrupt ) + +static TIMER_DEVICE_CALLBACK( igs_interrupt ) { - igspoker_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) % 2) { - device_set_input_line(device, 0, HOLD_LINE); - } else { - if (state->m_nmi_enable) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } + igspoker_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 32) != 0) + return; + + if((scanline % 64) == 32) + device_set_input_line(state->m_maincpu, 0, ASSERT_LINE); + + if((scanline % 64) == 0 && state->m_nmi_enable) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } + static READ8_HANDLER( igs_irqack_r ) { + igspoker_state *state = space->machine().driver_data(); + device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); return 0; } @@ -140,21 +151,21 @@ { igspoker_state *state = space->machine().driver_data(); state->m_bg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_tile_w ) { igspoker_state *state = space->machine().driver_data(); state->m_fg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_color_w ) { igspoker_state *state = space->machine().driver_data(); state->m_fg_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static VIDEO_START(igs_video) @@ -163,18 +174,18 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 32, 64, 8); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE(igs_video) +static SCREEN_UPDATE_IND16(igs_video) { - igspoker_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + igspoker_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // FIX: CSK227IT must have some way to disable background, or wrong gfx? - if (state->m_bg_enable) tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + if (state->m_bg_enable) state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -185,10 +196,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); } -static SCREEN_UPDATE(cpokerpk) +static SCREEN_UPDATE_IND16(cpokerpk) { - igspoker_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + igspoker_state *state = screen.machine().driver_data(); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1746,7 +1757,7 @@ MCFG_CPU_ADD("maincpu",Z80, 3579545) MCFG_CPU_PROGRAM_MAP(igspoker_prg_map) MCFG_CPU_IO_MAP(igspoker_io_map) - MCFG_CPU_VBLANK_INT_HACK(igs_interrupt,8) + MCFG_TIMER_ADD_SCANLINE("scantimer", igs_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(igs) @@ -1754,10 +1765,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_SIZE(64*8, 32*8) // TODO: wrong screen size! MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(igs_video) + MCFG_SCREEN_UPDATE_STATIC(igs_video) MCFG_GFXDECODE(igspoker) MCFG_PALETTE_LENGTH(2048) @@ -1788,7 +1798,7 @@ MCFG_CPU_IO_MAP(number10_io_map) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(cpokerpk) + MCFG_SCREEN_UPDATE_STATIC(cpokerpk) MCFG_VIDEO_START(cpokerpk) MCFG_OKIM6295_ADD("oki", XTAL_12MHz / 12, OKIM6295_PIN7_HIGH) @@ -2432,22 +2442,22 @@ -GAMEL( 1993?, cpoker, 0, igspoker, cpoker, cpoker, ROT0, "IGS", "Champion Poker (v220I)", 0, layout_igspoker ) -GAMEL( 1993?, cpokert, cpoker, igspoker, cpoker, cpokert, ROT0, "IGS (Tuning license)", "Champion Poker (v200G)", 0, layout_igspoker ) -GAMEL( 1993, cpokerx, cpoker, igspoker, cpokerx, cpokert, ROT0, "IGS", "Champion Poker (v100)", 0, layout_igspoker ) -GAMEL( 2000, chleague, 0, igspoker, chleague, chleague, ROT0, "IGS", "Champion League (Poker)", 0, layout_igspoker ) -GAMEL( 2000, chleagul, chleague, igspoker, chleague, chleague, ROT0, "IGS", "Champion League (Lattine)", 0, layout_igspoker ) -GAMEL( 198?, csk227it, 0, csk227it, csk227, cska, ROT0, "IGS", "Champion Skill (with Ability)", 0, layout_igspoker ) /* SU 062 */ -GAMEL( 198?, csk234it, csk227it, csk234it, csk234, cska, ROT0, "IGS", "Champion Skill (Ability, Poker & Symbols)", 0, layout_igspoker ) /* SU 062 */ -GAMEL( 2000, number10, 0, number10, number10, number10, ROT0, "PlayMark SRL", "Number Dieci (Poker)", 0, layout_igspoker ) -GAMEL( 2000, numbr10l, number10, number10, number10, number10, ROT0, "PlayMark SRL", "Number Dieci (Lattine)", 0, layout_igspoker ) -GAMEL( 198?, igs_ncs, 0, igs_ncs, igs_ncs, igs_ncs, ROT0, "IGS", "New Champion Skill (v100n)", 0, layout_igspoker ) /* SU 062 */ -GAMEL( 199?, cpokerpk, 0, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian PK (bootleg, blue board)", 0, layout_igspoker ) -GAMEL( 199?, cpokerpkg, cpokerpk, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian PK (bootleg, green board)", 0, layout_igspoker ) -GAMEL( 199?, citalcup, cpokerpk, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian Cup (bootleg V220IT)", 0, layout_igspoker ) +GAMEL( 1993?,cpoker, 0, igspoker, cpoker, cpoker, ROT0, "IGS", "Champion Poker (v220I)", 0, layout_igspoker ) +GAMEL( 1993?,cpokert, cpoker, igspoker, cpoker, cpokert, ROT0, "IGS (Tuning license)", "Champion Poker (v200G)", 0, layout_igspoker ) +GAMEL( 1993, cpokerx, cpoker, igspoker, cpokerx, cpokert, ROT0, "IGS", "Champion Poker (v100)", 0, layout_igspoker ) +GAMEL( 2000, chleague, 0, igspoker, chleague, chleague, ROT0, "IGS", "Champion League (Poker)", 0, layout_igspoker ) +GAMEL( 2000, chleagul, chleague, igspoker, chleague, chleague, ROT0, "IGS", "Champion League (Lattine)", 0, layout_igspoker ) +GAMEL( 198?, csk227it, 0, csk227it, csk227, cska, ROT0, "IGS", "Champion Skill (with Ability)", 0, layout_igspoker ) /* SU 062 */ +GAMEL( 198?, csk234it, csk227it, csk234it, csk234, cska, ROT0, "IGS", "Champion Skill (Ability, Poker & Symbols)", 0, layout_igspoker ) /* SU 062 */ +GAMEL( 2000, number10, 0, number10, number10, number10, ROT0, "PlayMark SRL", "Number Dieci (Poker)", 0, layout_igspoker ) +GAMEL( 2000, numbr10l, number10, number10, number10, number10, ROT0, "PlayMark SRL", "Number Dieci (Lattine)", 0, layout_igspoker ) +GAMEL( 198?, igs_ncs, 0, igs_ncs, igs_ncs, igs_ncs, ROT0, "IGS", "New Champion Skill (v100n)", 0, layout_igspoker ) /* SU 062 */ +GAMEL( 199?, cpokerpk, 0, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian PK (bootleg, blue board)", 0, layout_igspoker ) +GAMEL( 199?, cpokerpkg, cpokerpk, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian PK (bootleg, green board)", 0, layout_igspoker ) +GAMEL( 199?, citalcup, cpokerpk, cpokerpk, cpokerpk, cpokerpk, ROT0, "bootleg (SGS)", "Champion Italian Cup (bootleg V220IT)", 0, layout_igspoker ) -GAMEL( 2000, igs_ncs2, 0, igs_ncs, igs_ncs, igs_ncs2, ROT0, "IGS", "New Champion Skill (v100n 2000)", GAME_IMPERFECT_GRAPHICS, layout_igspoker ) +GAMEL( 2000, igs_ncs2, 0, igs_ncs, igs_ncs, igs_ncs2, ROT0, "IGS", "New Champion Skill (v100n 2000)", GAME_IMPERFECT_GRAPHICS, layout_igspoker ) -GAMEL( 1998, stellecu, 0, number10, number10, 0, ROT0, "Sure", "Stelle e Cubi (Italy)", GAME_NOT_WORKING, layout_igspoker ) +GAMEL( 1998, stellecu, 0, number10, number10, 0, ROT0, "Sure", "Stelle e Cubi (Italy)", GAME_NOT_WORKING, layout_igspoker ) -GAMEL( 1993?, pktet346, 0, pktetris, pktet346, pktet346, ROT0, "IGS", "PK Tetris (v346I)", 0, layout_igspoker ) +GAMEL( 1993?,pktet346, 0, pktetris, pktet346, pktet346, ROT0, "IGS", "PK Tetris (v346I)", 0, layout_igspoker ) diff -Nru mame-0.144/src/mame/drivers/ikki.c mame-0.145/src/mame/drivers/ikki.c --- mame-0.144/src/mame/drivers/ikki.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ikki.c 2012-02-06 21:30:38.000000000 +0000 @@ -8,12 +8,12 @@ TODO: - understand proper CPU communications and irq firing; +- timings *****************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "sound/sn76496.h" #include "includes/ikki.h" @@ -26,11 +26,11 @@ static READ8_HANDLER( ikki_e000_r ) { + ikki_state *state = space->machine().driver_data(); + /* bit1: interrupt type?, bit0: CPU2 busack? */ - if (cpu_getiloops(&space->device()) == 0) - return 0; - return 2; + return (state->m_irq_source << 1); } static WRITE8_HANDLER( ikki_coin_counters ) @@ -174,9 +174,9 @@ static const gfx_layout charlayout = { 8,8, /* 8*8 characters */ - 2048, /* 2048 characters */ + RGN_FRAC(1,3), /* 2048 characters */ 3, /* 3 bits per pixel */ - {0,16384*8,16384*8*2}, + {RGN_FRAC(0,3),RGN_FRAC(1,3),RGN_FRAC(2,3)}, {7,6,5,4,3,2,1,0}, {8*0, 8*1, 8*2, 8*3, 8*4, 8*5, 8*6, 8*7}, 8*8 @@ -185,9 +185,9 @@ static const gfx_layout spritelayout = { 16,32, /* 16*32 characters */ - 256, /* 256 characters */ + RGN_FRAC(1,3), /* 256 characters */ 3, /* 3 bits per pixel */ - {16384*8*2,16384*8,0}, + {RGN_FRAC(0,3),RGN_FRAC(1,3),RGN_FRAC(2,3)}, {7,6,5,4,3,2,1,0, 8*16+7,8*16+6,8*16+5,8*16+4,8*16+3,8*16+2,8*16+1,8*16+0}, {8*0, 8*1, 8*2, 8*3, 8*4, 8*5, 8*6, 8*7, @@ -215,6 +215,7 @@ state->save_item(NAME(state->m_flipscreen)); state->save_item(NAME(state->m_punch_through_pen)); + state->save_item(NAME(state->m_irq_source)); } static MACHINE_RESET( ikki ) @@ -224,30 +225,46 @@ state->m_flipscreen = 0; } +static TIMER_DEVICE_CALLBACK( ikki_irq ) +{ + ikki_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240 || scanline == 120) // TODO: where non-timer IRQ happens? + { + device_set_input_line(state->m_maincpu,0,HOLD_LINE); + + state->m_irq_source = (scanline != 240); + } +} + + + + static MACHINE_CONFIG_START( ikki, ikki_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,8000000/2) /* 4.000MHz */ MCFG_CPU_PROGRAM_MAP(ikki_cpu1) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", ikki_irq, "screen", 0, 1) MCFG_CPU_ADD("sub", Z80,8000000/2) /* 4.000MHz */ MCFG_CPU_PROGRAM_MAP(ikki_cpu2) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) + MCFG_CPU_PERIODIC_INT(irq0_line_hold,2*60) - MCFG_QUANTUM_TIME(attotime::from_hz(600)) + MCFG_QUANTUM_PERFECT_CPU("maincpu") MCFG_MACHINE_START(ikki) MCFG_MACHINE_RESET(ikki) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) +// MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(32*8, 32*8+3*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ikki) + MCFG_SCREEN_UPDATE_STATIC(ikki) MCFG_GFXDECODE(ikki) MCFG_PALETTE_LENGTH(1024) @@ -284,14 +301,14 @@ ROM_LOAD( "tvg17_5", 0x0000, 0x2000, CRC(22bdb40e) SHA1(265801ad660a5a3fc5bb187fa92dbe6098b390f5) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* sprite */ - ROM_LOAD( "tvg17_6", 0x0000, 0x4000, CRC(dc8aa269) SHA1(fd8b5c2bead52e1e136d4df4c26f136d8992d9be) ) + ROM_LOAD( "tvg17_8", 0x0000, 0x4000, CRC(45c9087a) SHA1(9db82fc194096588fde5048e922a654e2ad12c23) ) ROM_LOAD( "tvg17_7", 0x4000, 0x4000, CRC(0e9efeba) SHA1(d922c4276a988b78b9a2a3ca632136e64a80d995) ) - ROM_LOAD( "tvg17_8", 0x8000, 0x4000, CRC(45c9087a) SHA1(9db82fc194096588fde5048e922a654e2ad12c23) ) + ROM_LOAD( "tvg17_6", 0x8000, 0x4000, CRC(dc8aa269) SHA1(fd8b5c2bead52e1e136d4df4c26f136d8992d9be) ) ROM_REGION( 0xc000, "gfx2", 0 ) /* bg */ - ROM_LOAD( "tvg17_9", 0x8000, 0x4000, CRC(c594f3c5) SHA1(6fe19d9ccbe6934a210eb2cab441cd0ba83cbcf4) ) - ROM_LOAD( "tvg17_10", 0x4000, 0x4000, CRC(2e510b4e) SHA1(c0ff4515e66ab4959b597a4d930cbbcc31c53cda) ) ROM_LOAD( "tvg17_11", 0x0000, 0x4000, CRC(35012775) SHA1(c90386660755c85fb9f020f8161805dd02a16271) ) + ROM_LOAD( "tvg17_10", 0x4000, 0x4000, CRC(2e510b4e) SHA1(c0ff4515e66ab4959b597a4d930cbbcc31c53cda) ) + ROM_LOAD( "tvg17_9", 0x8000, 0x4000, CRC(c594f3c5) SHA1(6fe19d9ccbe6934a210eb2cab441cd0ba83cbcf4) ) ROM_REGION( 0x0700, "proms", 0 ) /* color PROMs */ ROM_LOAD( "prom17_3", 0x0000, 0x0100, CRC(dbcd3bec) SHA1(1baeec277b16c82b67e10da9d4c84cf383ef4a82) ) /* R */ @@ -317,14 +334,14 @@ ROM_LOAD( "tvg-5.30", 0x0000, 0x2000, CRC(22bdb40e) SHA1(265801ad660a5a3fc5bb187fa92dbe6098b390f5) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* sprite */ - ROM_LOAD( "tvg-6.104", 0x0000, 0x4000, CRC(dc8aa269) SHA1(fd8b5c2bead52e1e136d4df4c26f136d8992d9be) ) + ROM_LOAD( "tvg-8.102", 0x0000, 0x4000, CRC(45c9087a) SHA1(9db82fc194096588fde5048e922a654e2ad12c23) ) ROM_LOAD( "tvg-7.103", 0x4000, 0x4000, CRC(0e9efeba) SHA1(d922c4276a988b78b9a2a3ca632136e64a80d995) ) - ROM_LOAD( "tvg-8.102", 0x8000, 0x4000, CRC(45c9087a) SHA1(9db82fc194096588fde5048e922a654e2ad12c23) ) + ROM_LOAD( "tvg-6.104", 0x8000, 0x4000, CRC(dc8aa269) SHA1(fd8b5c2bead52e1e136d4df4c26f136d8992d9be) ) ROM_REGION( 0xc000, "gfx2", 0 ) /* bg */ - ROM_LOAD( "tvg17_9", 0x8000, 0x4000, CRC(c594f3c5) SHA1(6fe19d9ccbe6934a210eb2cab441cd0ba83cbcf4) ) - ROM_LOAD( "tvg17_10", 0x4000, 0x4000, CRC(2e510b4e) SHA1(c0ff4515e66ab4959b597a4d930cbbcc31c53cda) ) ROM_LOAD( "tvg17_11", 0x0000, 0x4000, CRC(35012775) SHA1(c90386660755c85fb9f020f8161805dd02a16271) ) + ROM_LOAD( "tvg17_10", 0x4000, 0x4000, CRC(2e510b4e) SHA1(c0ff4515e66ab4959b597a4d930cbbcc31c53cda) ) + ROM_LOAD( "tvg17_9", 0x8000, 0x4000, CRC(c594f3c5) SHA1(6fe19d9ccbe6934a210eb2cab441cd0ba83cbcf4) ) ROM_REGION( 0x0700, "proms", 0 ) /* color PROMs */ ROM_LOAD( "prom17_3", 0x0000, 0x0100, CRC(dbcd3bec) SHA1(1baeec277b16c82b67e10da9d4c84cf383ef4a82) ) /* R */ diff -Nru mame-0.144/src/mame/drivers/imolagp.c mame-0.145/src/mame/drivers/imolagp.c --- mame-0.144/src/mame/drivers/imolagp.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/imolagp.c 2012-02-06 21:30:39.000000000 +0000 @@ -74,7 +74,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "machine/8255ppi.h" #include "sound/ay8910.h" @@ -87,7 +86,9 @@ { public: imolagp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_slave_workram; // used only ifdef HLE_COM @@ -110,6 +111,8 @@ /* memory */ UINT8 m_videoram[3][0x4000]; + + required_device m_maincpu; }; @@ -195,9 +198,9 @@ } -static SCREEN_UPDATE( imolagp ) +static SCREEN_UPDATE_IND16( imolagp ) { - imolagp_state *state = screen->machine().driver_data(); + imolagp_state *state = screen.machine().driver_data(); int scroll2 = state->m_scroll ^ 0x03; int pass; for (pass = 0; pass < 2; pass++) @@ -210,7 +213,7 @@ int pen; int y = (i / 0x40); int x = (i & 0x3f) * 4 - scroll2; - UINT16 *dest = BITMAP_ADDR16(bitmap, y & 0xff, 0); + UINT16 *dest = &bitmap.pix16(y & 0xff); int data = source[i]; if (data || pass == 0) { @@ -463,21 +466,13 @@ /***************************************************************************/ -static INTERRUPT_GEN( master_interrupt ) + +static TIMER_DEVICE_CALLBACK ( imolagp_nmi_cb ) { - imolagp_state *state = device->machine().driver_data(); - int which = cpu_getiloops(device); - if (which == 0) - { -#ifdef HLE_COM - memcpy(&state->m_slave_workram[0x80], state->m_mComData, state->m_mComCount); - state->m_mComCount = 0; -#endif - device_set_input_line(device, 0, HOLD_LINE); - } - else + imolagp_state *state = timer.machine().driver_data(); + { - int newsteer = input_port_read(device->machine(), "2802") & 0xf; + int newsteer = input_port_read(timer.machine(), "2802") & 0xf; if (newsteer != state->m_oldsteer) { if (state->m_steerlatch == 0) @@ -491,9 +486,20 @@ { state->m_oldsteer = (state->m_oldsteer + 1) & 0xf; } - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } } +} + +static INTERRUPT_GEN( vblank_irq ) +{ + imolagp_state *state = device->machine().driver_data(); + +#ifdef HLE_COM + memcpy(&state->m_slave_workram[0x80], state->m_mComData, state->m_mComCount); + state->m_mComCount = 0; +#endif + device_set_input_line(device, 0, HOLD_LINE); } /* master_interrupt */ @@ -550,7 +556,8 @@ MCFG_CPU_ADD("maincpu", Z80,8000000) /* ? */ MCFG_CPU_PROGRAM_MAP(imolagp_master) MCFG_CPU_IO_MAP(readport_master) - MCFG_CPU_VBLANK_INT_HACK(master_interrupt,4) + MCFG_CPU_VBLANK_INT("screen",vblank_irq) + MCFG_TIMER_ADD_PERIODIC("pot_irq", imolagp_nmi_cb, attotime::from_hz(60*3)) MCFG_CPU_ADD("slave", Z80,8000000) /* ? */ MCFG_CPU_PROGRAM_MAP(imolagp_slave) @@ -567,10 +574,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256,256) MCFG_SCREEN_VISIBLE_AREA(0+64-16,255,0+16,255) - MCFG_SCREEN_UPDATE(imolagp) + MCFG_SCREEN_UPDATE_STATIC(imolagp) MCFG_PALETTE_LENGTH(0x20) MCFG_VIDEO_START(imolagp) diff -Nru mame-0.144/src/mame/drivers/inder.c mame-0.145/src/mame/drivers/inder.c --- mame-0.144/src/mame/drivers/inder.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/inder.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -5,10 +7,20 @@ { public: inder_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( inder_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( inder_map, AS_PROGRAM, 8, inder_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x0000, 0x3fff) AM_ROM ADDRESS_MAP_END @@ -16,7 +28,7 @@ static INPUT_PORTS_START( inder ) INPUT_PORTS_END -static MACHINE_RESET( inder ) +void inder_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 2500000) MCFG_CPU_PROGRAM_MAP(inder_map) - - MCFG_MACHINE_RESET( inder ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -155,12 +165,12 @@ ROM_LOAD("sound_m3.bin", 0x40000, 0x20000, CRC(4d9f5ed2) SHA1(bc6b7c70369c25eddddac5304497f30cee7675d4)) ROM_END -GAME(1992, ind250cc, 0, inder, inder, inder, ROT0, "Inder", "250 CC", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, atleta, 0, inder, inder, inder, ROT0, "Inder", "Atleta", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, brvteam, 0, inder, inder, inder, ROT0, "Inder", "Brave Team", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, canasta, 0, inder, inder, inder, ROT0, "Inder", "Canasta '86'", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, pinclown, 0, inder, inder, inder, ROT0, "Inder", "Clown (Inder)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, corsario, 0, inder, inder, inder, ROT0, "Inder", "Corsario", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, mundial, 0, inder, inder, inder, ROT0, "Inder", "Mundial 90", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, metalman, 0, inder, inder, inder, ROT0, "Inder", "Metal Man", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, lapbylap, 0, inder, inder, inder, ROT0, "Inder", "Lap By Lap", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1992, ind250cc, 0, inder, inder, inder, ROT0, "Inder", "250 CC", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, atleta, 0, inder, inder, inder, ROT0, "Inder", "Atleta", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, brvteam, 0, inder, inder, inder, ROT0, "Inder", "Brave Team", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, canasta, 0, inder, inder, inder, ROT0, "Inder", "Canasta '86'", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, pinclown, 0, inder, inder, inder, ROT0, "Inder", "Clown (Inder)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, corsario, 0, inder, inder, inder, ROT0, "Inder", "Corsario", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, mundial, 0, inder, inder, inder, ROT0, "Inder", "Mundial 90", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, metalman, 0, inder, inder, inder, ROT0, "Inder", "Metal Man", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, lapbylap, 0, inder, inder, inder, ROT0, "Inder", "Lap By Lap", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/intrscti.c mame-0.145/src/mame/drivers/intrscti.c --- mame-0.144/src/mame/drivers/intrscti.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/intrscti.c 2012-02-06 21:30:42.000000000 +0000 @@ -66,13 +66,13 @@ { } -static SCREEN_UPDATE(intrscti) +static SCREEN_UPDATE_IND16(intrscti) { - intrscti_state *state = screen->machine().driver_data(); + intrscti_state *state = screen.machine().driver_data(); int y,x; int count; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = 0; for (y=0;y<64;y++) @@ -81,7 +81,7 @@ { int dat; dat = state->m_ram[count]; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],dat/*+0x100*/,0,0,0,x*8,y*8,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0],dat/*+0x100*/,0,0,0,x*8,y*8,0); count++; } } @@ -101,10 +101,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 512) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 512-1) - MCFG_SCREEN_UPDATE(intrscti) + MCFG_SCREEN_UPDATE_STATIC(intrscti) MCFG_GFXDECODE(intrscti) MCFG_PALETTE_LENGTH(0x100) @@ -138,4 +137,4 @@ } } -GAME( 19??, intrscti, 0, intrscti, intrscti, intrscti, ROT0, "", "Intersecti", GAME_NO_SOUND|GAME_NOT_WORKING ) +GAME( 19??, intrscti, 0, intrscti, intrscti, intrscti, ROT0, "", "Intersecti", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/inufuku.c mame-0.145/src/mame/drivers/inufuku.c --- mame-0.144/src/mame/drivers/inufuku.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/inufuku.c 2012-02-06 21:30:34.000000000 +0000 @@ -369,10 +369,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(2048, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319-1, 1, 224-1) - MCFG_SCREEN_UPDATE(inufuku) + MCFG_SCREEN_UPDATE_STATIC(inufuku) MCFG_GFXDECODE(inufuku) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/iqblock.c mame-0.145/src/mame/drivers/iqblock.c --- mame-0.144/src/mame/drivers/iqblock.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/iqblock.c 2012-02-06 21:30:36.000000000 +0000 @@ -52,7 +52,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/z180/z180.h" -#include "deprecat.h" #include "machine/8255ppi.h" #include "includes/iqblock.h" #include "sound/2413intf.h" @@ -76,14 +75,21 @@ } -static INTERRUPT_GEN( iqblock_interrupt ) +static TIMER_DEVICE_CALLBACK( iqblock_irq ) { - if (cpu_getiloops(device) & 1) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); /* ???? */ - else - device_set_input_line(device, 0, ASSERT_LINE); /* ???? */ + iqblock_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 16) != 0) + return; + + if((scanline % 32) == 16) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + else if ((scanline % 32) == 0) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } + static WRITE8_HANDLER( iqblock_irqack_w ) { cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); @@ -273,7 +279,7 @@ MCFG_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT_HACK(iqblock_interrupt,16) + MCFG_TIMER_ADD_SCANLINE("scantimer", iqblock_irq, "screen", 0, 1) MCFG_PPI8255_ADD( "ppi8255", ppi8255_intf ) @@ -281,10 +287,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(iqblock) + MCFG_SCREEN_UPDATE_STATIC(iqblock) MCFG_GFXDECODE(iqblock) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/irobot.c mame-0.145/src/mame/drivers/irobot.c --- mame-0.144/src/mame/drivers/irobot.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/irobot.c 2012-02-06 21:30:38.000000000 +0000 @@ -302,10 +302,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) - MCFG_SCREEN_UPDATE(irobot) + MCFG_SCREEN_UPDATE_STATIC(irobot) MCFG_GFXDECODE(irobot) MCFG_PALETTE_LENGTH(64 + 32) /* 64 for polygons, 32 for text */ diff -Nru mame-0.144/src/mame/drivers/ironhors.c mame-0.145/src/mame/drivers/ironhors.c --- mame-0.144/src/mame/drivers/ironhors.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ironhors.c 2012-02-06 21:30:38.000000000 +0000 @@ -8,7 +8,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/m6809/m6809.h" #include "sound/2203intf.h" #include "sound/discrete.h" @@ -21,19 +20,20 @@ * *************************************/ -static INTERRUPT_GEN( ironhors_interrupt ) +static TIMER_DEVICE_CALLBACK( ironhors_irq ) { - ironhors_state *state = device->machine().driver_data(); + ironhors_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) == 0) + if (scanline == 240) { if (*state->m_interrupt_enable & 4) - device_set_input_line(device, M6809_FIRQ_LINE, HOLD_LINE); + device_set_input_line(state->m_maincpu, M6809_FIRQ_LINE, HOLD_LINE); } - else if (cpu_getiloops(device) % 2) + else if (((scanline+16) % 64) == 0) { if (*state->m_interrupt_enable & 1) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } } @@ -67,8 +67,8 @@ AM_RANGE(0x0060, 0x00df) AM_RAM AM_RANGE(0x0800, 0x0800) AM_WRITE(soundlatch_w) AM_RANGE(0x0900, 0x0900) AM_READ_PORT("DSW3") AM_WRITE(ironhors_sh_irqtrigger_w) - AM_RANGE(0x0a00, 0x0a00) AM_READ_PORT("DSW1") AM_WRITE(ironhors_palettebank_w) - AM_RANGE(0x0b00, 0x0b00) AM_READ_PORT("DSW2") AM_WRITE(ironhors_flipscreen_w) + AM_RANGE(0x0a00, 0x0a00) AM_READ_PORT("DSW2") AM_WRITE(ironhors_palettebank_w) + AM_RANGE(0x0b00, 0x0b00) AM_READ_PORT("DSW1") AM_WRITE(ironhors_flipscreen_w) AM_RANGE(0x0b01, 0x0b01) AM_READ_PORT("P2") AM_RANGE(0x0b02, 0x0b02) AM_READ_PORT("P1") AM_RANGE(0x0b03, 0x0b03) AM_READ_PORT("SYSTEM") @@ -106,9 +106,9 @@ AM_RANGE(0x0060, 0x00ff) AM_RAM AM_RANGE(0x0800, 0x0800) AM_WRITE(soundlatch_w) AM_RANGE(0x0900, 0x0900) /*AM_READ_PORT("DSW3") */AM_WRITE(ironhors_sh_irqtrigger_w) - AM_RANGE(0x0a00, 0x0a00) AM_READ_PORT("DSW1") //AM_WRITE(ironhors_palettebank_w) - AM_RANGE(0x0b00, 0x0b00) AM_READ_PORT("DSW2") AM_WRITE(ironhors_flipscreen_w) - AM_RANGE(0x0b01, 0x0b01) AM_READ_PORT("DSW1") //AM_WRITE(ironhors_palettebank_w) + AM_RANGE(0x0a00, 0x0a00) AM_READ_PORT("DSW2") //AM_WRITE(ironhors_palettebank_w) + AM_RANGE(0x0b00, 0x0b00) AM_READ_PORT("DSW1") AM_WRITE(ironhors_flipscreen_w) + AM_RANGE(0x0b01, 0x0b01) AM_READ_PORT("DSW2") //AM_WRITE(ironhors_palettebank_w) AM_RANGE(0x0b02, 0x0b02) AM_READ_PORT("P1") AM_RANGE(0x0b03, 0x0b03) AM_READ_PORT("SYSTEM") @@ -154,40 +154,40 @@ KONAMI8_COCKTAIL_4WAY_B123_UNK PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) + /* "No Coin B" = coins produce sound, but no effect on coin counter */ + + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30K 70K+" ) PORT_DIPSETTING( 0x10, "40K 80K+" ) PORT_DIPSETTING( 0x08, "40K" ) PORT_DIPSETTING( 0x00, "50K" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // factory default (JP) + PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) // factory default (US) PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("DSW2") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") - /* "No Coin B" = coins produce sound, but no effect on coin counter */ - PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_DIPNAME( 0x04, 0x04, "Button Layout" ) + PORT_DIPNAME( 0x04, 0x04, "Button Layout" ) PORT_DIPLOCATION("SW3:3") // though US manual says unused PORT_DIPSETTING( 0x04, "Power Attack Squat" ) PORT_DIPSETTING( 0x00, "Squat Attack Power" ) PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -360,6 +360,7 @@ { ironhors_state *state = machine.driver_data(); + state->m_maincpu = machine.device("maincpu"); state->m_soundcpu = machine.device("soundcpu"); state->save_item(NAME(state->m_palettebank)); @@ -381,7 +382,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809,18432000/6) /* 3.072 MHz??? mod by Shingo Suzuki 1999/10/15 */ MCFG_CPU_PROGRAM_MAP(master_map) - MCFG_CPU_VBLANK_INT_HACK(ironhors_interrupt,8) + MCFG_TIMER_ADD_SCANLINE("scantimer", ironhors_irq, "screen", 0, 1) MCFG_CPU_ADD("soundcpu",Z80,18432000/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(slave_map) @@ -394,10 +395,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ironhors) + MCFG_SCREEN_UPDATE_STATIC(ironhors) MCFG_GFXDECODE(ironhors) MCFG_PALETTE_LENGTH(16*8*16+16*8*16) @@ -422,19 +422,20 @@ MACHINE_CONFIG_END -static INTERRUPT_GEN( farwest_interrupt ) +static TIMER_DEVICE_CALLBACK( farwest_irq ) { - ironhors_state *state = device->machine().driver_data(); + ironhors_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) &1) + if ((scanline % 2) == 1) { if (*state->m_interrupt_enable & 4) - device_set_input_line(device, M6809_FIRQ_LINE, HOLD_LINE); + device_set_input_line(state->m_maincpu, M6809_FIRQ_LINE, HOLD_LINE); } - else //if (cpu_getiloops() % 2) + else if ((scanline % 2) == 0) { if (*state->m_interrupt_enable & 1) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } } @@ -464,7 +465,8 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(farwest_master_map) - MCFG_CPU_VBLANK_INT_HACK(farwest_interrupt,255) + MCFG_DEVICE_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(farwest_irq) MCFG_CPU_MODIFY("soundcpu") MCFG_CPU_PROGRAM_MAP(farwest_slave_map) @@ -473,7 +475,7 @@ MCFG_GFXDECODE(farwest) MCFG_VIDEO_START(farwest) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(farwest) + MCFG_SCREEN_UPDATE_STATIC(farwest) MCFG_SOUND_MODIFY("ym2203") MCFG_SOUND_CONFIG(farwest_ym2203_config) diff -Nru mame-0.144/src/mame/drivers/istellar.c mame-0.145/src/mame/drivers/istellar.c --- mame-0.144/src/mame/drivers/istellar.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/istellar.c 2012-02-06 21:30:41.000000000 +0000 @@ -22,16 +22,17 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "render.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" class istellar_state : public driver_device { public: istellar_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 *m_tile_ram; UINT8 *m_tile_control_ram; UINT8 *m_sprite_ram; @@ -46,13 +47,13 @@ /* VIDEO GOODS */ -static SCREEN_UPDATE( istellar ) +static SCREEN_UPDATE_IND16( istellar ) { - istellar_state *state = screen->machine().driver_data(); + istellar_state *state = screen.machine().driver_data(); int charx, chary; /* clear */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* DEBUG */ /* @@ -70,7 +71,7 @@ { int current_screen_character = (chary*32) + charx; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], state->m_tile_ram[current_screen_character], (state->m_tile_control_ram[current_screen_character] & 0x0f), 0, 0, charx*8, chary*8, 0); @@ -86,8 +87,6 @@ static MACHINE_START( istellar ) { - istellar_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); } @@ -124,7 +123,7 @@ static READ8_HANDLER(z80_2_ldp_read) { istellar_state *state = space->machine().driver_data(); - UINT8 readResult = laserdisc_data_r(state->m_laserdisc); + UINT8 readResult = state->m_laserdisc->status_r(); logerror("CPU2 : reading LDP : %x\n", readResult); return readResult; } @@ -161,7 +160,7 @@ { istellar_state *state = space->machine().driver_data(); logerror("CPU2 : writing LDP : 0x%x\n", data); - laserdisc_data_w(state->m_laserdisc,data); + state->m_laserdisc->data_w(data); } @@ -354,11 +353,11 @@ MCFG_MACHINE_START(istellar) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(istellar, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, istellar) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(istellar) @@ -368,7 +367,7 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/itech32.c mame-0.145/src/mame/drivers/itech32.c --- mame-0.144/src/mame/drivers/itech32.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/itech32.c 2012-02-06 21:30:37.000000000 +0000 @@ -1709,7 +1709,7 @@ MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_MACHINE_RESET(itech32) - MCFG_NVRAM_ADD_CUSTOM("nvram", itech32_state, nvram_init) + MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", itech32_state, nvram_init) MCFG_TICKET_DISPENSER_ADD("ticket", 200, TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_HIGH) @@ -1719,8 +1719,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 508, 0, 384, 262, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(itech32) + MCFG_SCREEN_UPDATE_STATIC(itech32) MCFG_VIDEO_START(itech32) diff -Nru mame-0.144/src/mame/drivers/itech8.c mame-0.145/src/mame/drivers/itech8.c --- mame-0.144/src/mame/drivers/itech8.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/itech8.c 2012-02-06 21:30:40.000000000 +0000 @@ -662,10 +662,10 @@ } /* set the visible area */ - if (state->m_visarea) + if (state->m_visarea.width() > 1) { - machine.primary_screen->set_visible_area(state->m_visarea->min_x, state->m_visarea->max_x, state->m_visarea->min_y, state->m_visarea->max_y); - state->m_visarea = NULL; + machine.primary_screen->set_visible_area(state->m_visarea.min_x, state->m_visarea.max_x, state->m_visarea.min_y, state->m_visarea.max_y); + state->m_visarea.set(0, 0, 0, 0); } } @@ -1701,7 +1701,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 263) /* sound hardware */ @@ -1796,7 +1795,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2layer) + MCFG_SCREEN_UPDATE_STATIC(itech8_2layer) MACHINE_CONFIG_END @@ -1808,7 +1807,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE(itech8_grmatch) + MCFG_SCREEN_UPDATE_STATIC(itech8_grmatch) /* palette updater */ MCFG_TIMER_ADD_SCANLINE("palette", grmatch_palette_update, "screen", 0, 0) @@ -1823,7 +1822,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2layer) + MCFG_SCREEN_UPDATE_STATIC(itech8_2layer) MACHINE_CONFIG_END @@ -1835,7 +1834,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2layer) + MCFG_SCREEN_UPDATE_STATIC(itech8_2layer) MACHINE_CONFIG_END @@ -1851,7 +1850,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(slikshot) + MCFG_SCREEN_UPDATE_STATIC(slikshot) MCFG_VIDEO_START(slikshot) MACHINE_CONFIG_END @@ -1868,7 +1867,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(slikshot) + MCFG_SCREEN_UPDATE_STATIC(slikshot) MCFG_VIDEO_START(slikshot) MACHINE_CONFIG_END @@ -1881,7 +1880,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2page) + MCFG_SCREEN_UPDATE_STATIC(itech8_2page) MACHINE_CONFIG_END @@ -1901,7 +1900,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2page_large) + MCFG_SCREEN_UPDATE_STATIC(itech8_2page_large) MACHINE_CONFIG_END @@ -1913,7 +1912,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2page_large) + MCFG_SCREEN_UPDATE_STATIC(itech8_2page_large) MACHINE_CONFIG_END @@ -1929,7 +1928,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(24, 375, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2page_large) + MCFG_SCREEN_UPDATE_STATIC(itech8_2page_large) MACHINE_CONFIG_END @@ -1945,7 +1944,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(64, 423, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2page_large) + MCFG_SCREEN_UPDATE_STATIC(itech8_2page_large) MACHINE_CONFIG_END @@ -1960,7 +1959,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(itech8_2layer) + MCFG_SCREEN_UPDATE_STATIC(itech8_2layer) MACHINE_CONFIG_END @@ -2659,32 +2658,28 @@ static DRIVER_INIT( hstennis ) { itech8_state *state = machine.driver_data(); - static const rectangle visible = { 0, 375, 0, 239 }; - state->m_visarea = &visible; + state->m_visarea.set(0, 375, 0, 239); } static DRIVER_INIT( arligntn ) { itech8_state *state = machine.driver_data(); - static const rectangle visible = { 16, 389, 0, 239 }; - state->m_visarea = &visible; + state->m_visarea.set(16, 389, 0, 239); } static DRIVER_INIT( peggle ) { itech8_state *state = machine.driver_data(); - static const rectangle visible = { 18, 367, 0, 239 }; - state->m_visarea = &visible; + state->m_visarea.set(18, 367, 0, 239); } static DRIVER_INIT( neckneck ) { itech8_state *state = machine.driver_data(); - static const rectangle visible = { 8, 375, 0, 239 }; - state->m_visarea = &visible; + state->m_visarea.set(8, 375, 0, 239); } diff -Nru mame-0.144/src/mame/drivers/itgambl2.c mame-0.145/src/mame/drivers/itgambl2.c --- mame-0.144/src/mame/drivers/itgambl2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/itgambl2.c 2012-02-06 21:30:42.000000000 +0000 @@ -82,39 +82,39 @@ } /* (dirty) debug code for looking 8bpps blitter-based gfxs */ -static SCREEN_UPDATE( itgambl2 ) +static SCREEN_UPDATE_RGB32( itgambl2 ) { - itgambl2_state *state = screen->machine().driver_data(); + itgambl2_state *state = screen.machine().driver_data(); int x,y,count; - const UINT8 *blit_ram = screen->machine().region("gfx1")->base(); + const UINT8 *blit_ram = screen.machine().region("gfx1")->base(); - if(screen->machine().input().code_pressed(KEYCODE_Z)) + if(screen.machine().input().code_pressed(KEYCODE_Z)) state->m_test_x++; - if(screen->machine().input().code_pressed(KEYCODE_X)) + if(screen.machine().input().code_pressed(KEYCODE_X)) state->m_test_x--; - if(screen->machine().input().code_pressed(KEYCODE_A)) + if(screen.machine().input().code_pressed(KEYCODE_A)) state->m_test_y++; - if(screen->machine().input().code_pressed(KEYCODE_S)) + if(screen.machine().input().code_pressed(KEYCODE_S)) state->m_test_y--; - if(screen->machine().input().code_pressed(KEYCODE_Q)) + if(screen.machine().input().code_pressed(KEYCODE_Q)) state->m_start_offs+=0x200; - if(screen->machine().input().code_pressed(KEYCODE_W)) + if(screen.machine().input().code_pressed(KEYCODE_W)) state->m_start_offs-=0x200; - if(screen->machine().input().code_pressed(KEYCODE_E)) + if(screen.machine().input().code_pressed(KEYCODE_E)) state->m_start_offs++; - if(screen->machine().input().code_pressed(KEYCODE_R)) + if(screen.machine().input().code_pressed(KEYCODE_R)) state->m_start_offs--; popmessage("%d %d %04x",state->m_test_x,state->m_test_y,state->m_start_offs); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = (state->m_start_offs); @@ -126,8 +126,8 @@ color = (blit_ram[count] & 0xff)>>0; - if((x)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = screen->machine().pens[color]; + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = screen.machine().pens[color]; count++; } @@ -269,10 +269,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE( itgambl2 ) + MCFG_SCREEN_UPDATE_STATIC( itgambl2 ) MCFG_MACHINE_RESET( itgambl2 ) MCFG_PALETTE_INIT( itgambl2 ) @@ -926,19 +925,19 @@ *************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 1999, ntcash, 0, itgambl2, itgambl2, 0, ROT0, "", "NtCash", GAME_NOT_WORKING ) -GAME( 1999, wizard, 0, itgambl2, itgambl2, 0, ROT0, "A.A.", "Wizard (Ver 1.0)", GAME_NOT_WORKING ) -GAME( 200?, trstar2k, 0, itgambl2, itgambl2, 0, ROT0, "A.M.", "Triple Star 2000", GAME_NOT_WORKING ) -GAME( 2001, laser2k1, 0, itgambl2, itgambl2, 0, ROT0, "", "Laser 2001 (Ver 1.2)", GAME_NOT_WORKING ) -GAME( 2001, mdrink, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Drink (Ver 1.2)", GAME_NOT_WORKING ) -GAME( 2001, te0144, 0, itgambl2, itgambl2, 0, ROT0, "", "Puzzle Bobble (Italian Gambling Game)", GAME_NOT_WORKING ) -GAME( 200?, cmagica, 0, itgambl2, itgambl2, 0, ROT0, "", "Carta Magica (Ver 1.8)", GAME_NOT_WORKING ) -GAME( 200?, millsun, 0, itgambl2, itgambl2, 0, ROT0, "", "Millennium Sun", GAME_NOT_WORKING ) -GAME( 200?, sspac2k1, 0, itgambl2, itgambl2, 0, ROT0, "", "Super Space 2001", GAME_NOT_WORKING ) -GAME( 200?, elvis, 0, itgambl2, itgambl2, 0, ROT0, "", "Elvis?", GAME_NOT_WORKING ) -GAME( 200?, sstar, 0, itgambl2, itgambl2, 0, ROT0, "", "Super Star", GAME_NOT_WORKING ) -GAME( 2001, pirati, 0, itgambl2, itgambl2, 0, ROT0, "Cin", "Pirati", GAME_NOT_WORKING ) -GAME( 200?, mnumitg, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Number (Italian Gambling Game, Ver 1.5)", GAME_NOT_WORKING ) -GAME( 200?, mclass, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Class (Ver 2.2)", GAME_NOT_WORKING ) -GAME( 200?, europass, 0, itgambl2, itgambl2, 0, ROT0, "", "Euro Pass (Ver 1.1)", GAME_NOT_WORKING ) +GAME( 1999, ntcash, 0, itgambl2, itgambl2, 0, ROT0, "", "NtCash", GAME_IS_SKELETON ) +GAME( 1999, wizard, 0, itgambl2, itgambl2, 0, ROT0, "A.A.", "Wizard (Ver 1.0)", GAME_IS_SKELETON ) +GAME( 200?, trstar2k, 0, itgambl2, itgambl2, 0, ROT0, "A.M.", "Triple Star 2000", GAME_IS_SKELETON ) +GAME( 2001, laser2k1, 0, itgambl2, itgambl2, 0, ROT0, "", "Laser 2001 (Ver 1.2)", GAME_IS_SKELETON ) +GAME( 2001, mdrink, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Drink (Ver 1.2)", GAME_IS_SKELETON ) +GAME( 2001, te0144, 0, itgambl2, itgambl2, 0, ROT0, "", "Puzzle Bobble (Italian Gambling Game)", GAME_IS_SKELETON ) +GAME( 200?, cmagica, 0, itgambl2, itgambl2, 0, ROT0, "", "Carta Magica (Ver 1.8)", GAME_IS_SKELETON ) +GAME( 200?, millsun, 0, itgambl2, itgambl2, 0, ROT0, "", "Millennium Sun", GAME_IS_SKELETON ) +GAME( 200?, sspac2k1, 0, itgambl2, itgambl2, 0, ROT0, "", "Super Space 2001", GAME_IS_SKELETON ) +GAME( 200?, elvis, 0, itgambl2, itgambl2, 0, ROT0, "", "Elvis?", GAME_IS_SKELETON ) +GAME( 200?, sstar, 0, itgambl2, itgambl2, 0, ROT0, "", "Super Star", GAME_IS_SKELETON ) +GAME( 2001, pirati, 0, itgambl2, itgambl2, 0, ROT0, "Cin", "Pirati", GAME_IS_SKELETON ) +GAME( 200?, mnumitg, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Number (Italian Gambling Game, Ver 1.5)", GAME_IS_SKELETON ) +GAME( 200?, mclass, 0, itgambl2, itgambl2, 0, ROT0, "", "Magic Class (Ver 2.2)", GAME_IS_SKELETON ) +GAME( 200?, europass, 0, itgambl2, itgambl2, 0, ROT0, "", "Euro Pass (Ver 1.1)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/itgambl3.c mame-0.145/src/mame/drivers/itgambl3.c --- mame-0.144/src/mame/drivers/itgambl3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/itgambl3.c 2012-02-06 21:30:42.000000000 +0000 @@ -70,39 +70,39 @@ } /* (dirty) debug code for looking 8bpps blitter-based gfxs */ -static SCREEN_UPDATE( itgambl3 ) +static SCREEN_UPDATE_RGB32( itgambl3 ) { - itgambl3_state *state = screen->machine().driver_data(); + itgambl3_state *state = screen.machine().driver_data(); int x,y,count; - const UINT8 *blit_ram = screen->machine().region("gfx1")->base(); + const UINT8 *blit_ram = screen.machine().region("gfx1")->base(); - if(screen->machine().input().code_pressed(KEYCODE_Z)) + if(screen.machine().input().code_pressed(KEYCODE_Z)) state->m_test_x++; - if(screen->machine().input().code_pressed(KEYCODE_X)) + if(screen.machine().input().code_pressed(KEYCODE_X)) state->m_test_x--; - if(screen->machine().input().code_pressed(KEYCODE_A)) + if(screen.machine().input().code_pressed(KEYCODE_A)) state->m_test_y++; - if(screen->machine().input().code_pressed(KEYCODE_S)) + if(screen.machine().input().code_pressed(KEYCODE_S)) state->m_test_y--; - if(screen->machine().input().code_pressed(KEYCODE_Q)) + if(screen.machine().input().code_pressed(KEYCODE_Q)) state->m_start_offs+=0x200; - if(screen->machine().input().code_pressed(KEYCODE_W)) + if(screen.machine().input().code_pressed(KEYCODE_W)) state->m_start_offs-=0x200; - if(screen->machine().input().code_pressed(KEYCODE_E)) + if(screen.machine().input().code_pressed(KEYCODE_E)) state->m_start_offs++; - if(screen->machine().input().code_pressed(KEYCODE_R)) + if(screen.machine().input().code_pressed(KEYCODE_R)) state->m_start_offs--; popmessage("%d %d %04x",state->m_test_x,state->m_test_y,state->m_start_offs); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); count = (state->m_start_offs); @@ -114,8 +114,8 @@ color = (blit_ram[count] & 0xff)>>0; - if((x)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x) = screen->machine().pens[color]; + if(cliprect.contains(x, y)) + bitmap.pix32(y, x) = screen.machine().pens[color]; count++; } @@ -236,9 +236,9 @@ for(x=0;x<0x100;x++) { - r = (x & 0xf)*0x10; - g = ((x & 0x3c)>>2)*0x10; - b = ((x & 0xf0)>>4)*0x10; + r = (x & 0xf)*0x11; + g = ((x & 0x3c)>>2)*0x11; + b = ((x & 0xf0)>>4)*0x11; palette_set_color(machine,x,MAKE_RGB(r,g,b)); } } @@ -258,10 +258,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE( itgambl3 ) + MCFG_SCREEN_UPDATE_STATIC( itgambl3 ) MCFG_MACHINE_RESET( itgambl3 ) MCFG_PALETTE_INIT( itgambl3 ) @@ -487,7 +486,7 @@ *************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 200?, ejollyx5, 0, itgambl3, itgambl3, 0, ROT0, "Solar Games", "Euro Jolly X5", GAME_NOT_WORKING ) -GAME( 200?, grandprx, 0, itgambl3, itgambl3, 0, ROT0, "4fun", "Grand Prix", GAME_NOT_WORKING ) -GAME( 200?, supjolly, 0, itgambl3, itgambl3, 0, ROT0, "", "Super Jolly", GAME_NOT_WORKING ) -GAME( 200?, x5jokers, 0, itgambl3, itgambl3, 0, ROT0, "Electronic Projects", "X Five Jokers (Version 1.12)", GAME_NOT_WORKING ) +GAME( 200?, ejollyx5, 0, itgambl3, itgambl3, 0, ROT0, "Solar Games", "Euro Jolly X5", GAME_IS_SKELETON ) +GAME( 200?, grandprx, 0, itgambl3, itgambl3, 0, ROT0, "4fun", "Grand Prix", GAME_IS_SKELETON ) +GAME( 200?, supjolly, 0, itgambl3, itgambl3, 0, ROT0, "", "Super Jolly", GAME_IS_SKELETON ) +GAME( 200?, x5jokers, 0, itgambl3, itgambl3, 0, ROT0, "Electronic Projects", "X Five Jokers (Version 1.12)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/itgamble.c mame-0.145/src/mame/drivers/itgamble.c --- mame-0.144/src/mame/drivers/itgamble.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/itgamble.c 2012-02-06 21:30:42.000000000 +0000 @@ -53,6 +53,8 @@ #define EJOLLYX5_MAIN_CLOCK XTAL_16MHz +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/h83002/h8.h" #include "sound/okim6295.h" @@ -62,8 +64,20 @@ { public: itgamble_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); + virtual void video_start(); }; @@ -71,12 +85,13 @@ * Video Hardware * *************************/ -static VIDEO_START( itgamble ) +void itgamble_state::video_start() { } -static SCREEN_UPDATE( itgamble ) +UINT32 itgamble_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + bitmap.fill(get_black_pen(screen.machine())); return 0; } @@ -85,7 +100,7 @@ * Memory map information * *************************/ -static ADDRESS_MAP_START( itgamble_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( itgamble_map, AS_PROGRAM, 16, itgamble_state ) ADDRESS_MAP_GLOBAL_MASK(0xffffff) AM_RANGE(0x000000, 0xffffff) AM_ROM ADDRESS_MAP_END @@ -177,10 +192,10 @@ * Machine Reset * **************************/ -static MACHINE_RESET( itgamble ) +void itgamble_state::machine_reset() { /* stop the CPU, we have no code for it anyway */ - cputag_set_input_line(machine, "maincpu", INPUT_LINE_HALT, ASSERT_LINE); + cputag_set_input_line(machine(), "maincpu", INPUT_LINE_HALT, ASSERT_LINE); } @@ -198,16 +213,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(itgamble_state, screen_update) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE( itgamble ) - - MCFG_MACHINE_RESET( itgamble ) MCFG_GFXDECODE(itgamble) MCFG_PALETTE_LENGTH(0x200) - MCFG_VIDEO_START( itgamble ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -687,15 +698,15 @@ *************************/ /* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 2000, capunc, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Capitan Uncino (Ver 1.2)", GAME_NOT_WORKING ) -GAME( 2001, capcor, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Capitani Coraggiosi (Ver 1.3)", GAME_NOT_WORKING ) -GAME( 2002, laperla, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "La Perla Nera (Ver 2.0)", GAME_NOT_WORKING ) -GAME( 2001, laperlag, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "La Perla Nera Gold (Ver 2.0)", GAME_NOT_WORKING ) -GAME( 2001, euro2k2, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 (Ver 2.0, set 1)", GAME_NOT_WORKING ) -GAME( 2001, euro2k2a, euro2k2, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 (Ver 2.0, set 2)", GAME_NOT_WORKING ) -GAME( 2002, euro2k2s, euro2k2, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 Space (Ver 3.0)", GAME_NOT_WORKING ) -GAME( 200?, abacus, 0, itgamble, itgamble, 0, ROT0, "", "Abacus (Ver 1.0)", GAME_NOT_WORKING ) -GAME( 200?, bookthr, 0, itgamble, itgamble, 0, ROT0, "", "Book Theatre (Ver 1.2)", GAME_NOT_WORKING ) +GAME( 2000, capunc, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Capitan Uncino (Ver 1.2)", GAME_IS_SKELETON ) +GAME( 2001, capcor, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Capitani Coraggiosi (Ver 1.3)", GAME_IS_SKELETON ) +GAME( 2002, laperla, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "La Perla Nera (Ver 2.0)", GAME_IS_SKELETON ) +GAME( 2001, laperlag, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "La Perla Nera Gold (Ver 2.0)", GAME_IS_SKELETON ) +GAME( 2001, euro2k2, 0, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 (Ver 2.0, set 1)", GAME_IS_SKELETON ) +GAME( 2001, euro2k2a, euro2k2, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 (Ver 2.0, set 2)", GAME_IS_SKELETON ) +GAME( 2002, euro2k2s, euro2k2, itgamble, itgamble, 0, ROT0, "Nazionale Elettronica", "Europa 2002 Space (Ver 3.0)", GAME_IS_SKELETON ) +GAME( 200?, abacus, 0, itgamble, itgamble, 0, ROT0, "", "Abacus (Ver 1.0)", GAME_IS_SKELETON ) +GAME( 200?, bookthr, 0, itgamble, itgamble, 0, ROT0, "", "Book Theatre (Ver 1.2)", GAME_IS_SKELETON ) /* different hardware */ -GAME( 200?, mnumber, 0, mnumber, itgamble, 0, ROT0, "M.M. - B.R.L.", "Mystery Number", GAME_NOT_WORKING ) +GAME( 200?, mnumber, 0, mnumber, itgamble, 0, ROT0, "M.M. - B.R.L.", "Mystery Number", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/jackal.c mame-0.145/src/mame/drivers/jackal.c --- mame-0.144/src/mame/drivers/jackal.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/jackal.c 2012-02-06 21:30:38.000000000 +0000 @@ -382,10 +382,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jackal) + MCFG_SCREEN_UPDATE_STATIC(jackal) MCFG_GFXDECODE(jackal) MCFG_PALETTE_LENGTH(0x300) diff -Nru mame-0.144/src/mame/drivers/jack.c mame-0.145/src/mame/drivers/jack.c --- mame-0.144/src/mame/drivers/jack.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jack.c 2012-02-06 21:30:38.000000000 +0000 @@ -42,7 +42,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "includes/jack.h" @@ -835,10 +834,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jack) + MCFG_SCREEN_UPDATE_STATIC(jack) MCFG_GFXDECODE(jack) MCFG_PALETTE_LENGTH(32) @@ -860,15 +858,11 @@ MCFG_CPU_PERIODIC_INT(irq0_line_hold,2*60) /* tripool needs 2 or the palette is broken */ MACHINE_CONFIG_END -static INTERRUPT_GEN( joinem_interrupts ) +static INTERRUPT_GEN( joinem_vblank_irq ) { - if (cpu_getiloops(device) > 0) - device_set_input_line(device, 0, HOLD_LINE); - else - { - if (!(input_port_read(device->machine(), "IN2") & 0x80)) /* TODO: remove me */ - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } + /* TODO: looks hackish to me ... */ + if (!(input_port_read(device->machine(), "IN2") & 0x80)) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); } static MACHINE_CONFIG_DERIVED( joinem, jack ) @@ -876,14 +870,15 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(joinem_map) - MCFG_CPU_VBLANK_INT_HACK(joinem_interrupts,3) + MCFG_CPU_VBLANK_INT("screen",joinem_vblank_irq) + MCFG_CPU_PERIODIC_INT(irq0_line_hold,2*60) MCFG_GFXDECODE(joinem) MCFG_PALETTE_LENGTH(0x100) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(joinem) + MCFG_SCREEN_UPDATE_STATIC(joinem) MCFG_PALETTE_INIT(joinem) MCFG_VIDEO_START(joinem) @@ -902,7 +897,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(joinem) + MCFG_SCREEN_UPDATE_STATIC(joinem) MCFG_PALETTE_INIT(joinem) MCFG_VIDEO_START(joinem) diff -Nru mame-0.144/src/mame/drivers/jackie.c mame-0.145/src/mame/drivers/jackie.c --- mame-0.144/src/mame/drivers/jackie.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/jackie.c 2012-02-06 21:30:38.000000000 +0000 @@ -44,7 +44,6 @@ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/2413intf.h" @@ -53,7 +52,9 @@ { public: jackie_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_exp_bank; UINT8 *m_fg_tile_ram; @@ -73,6 +74,8 @@ int m_hopper; UINT8 m_out[3]; UINT16 m_unk_reg[3][5]; + + required_device m_maincpu; }; @@ -90,14 +93,14 @@ { jackie_state *state = space->machine().driver_data(); state->m_fg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_color_w ) { jackie_state *state = space->machine().driver_data(); state->m_fg_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -114,7 +117,7 @@ { jackie_state *state = space->machine().driver_data(); state->m_reel1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jackie_reel1_tile_info ) @@ -130,7 +133,7 @@ { jackie_state *state = space->machine().driver_data(); state->m_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jackie_reel2_tile_info ) @@ -145,7 +148,7 @@ { jackie_state *state = space->machine().driver_data(); state->m_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_jackie_reel3_tile_info ) @@ -162,29 +165,29 @@ state->m_reel2_tilemap = tilemap_create(machine,get_jackie_reel2_tile_info,tilemap_scan_rows,8,32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_jackie_reel3_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE(jackie) +static SCREEN_UPDATE_IND16(jackie) { - jackie_state *state = screen->machine().driver_data(); + jackie_state *state = screen.machine().driver_data(); int i,j; int startclipmin = 0; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); for (i=0;i < 0x40;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_bg_scroll[i+0x000]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_bg_scroll[i+0x040]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_bg_scroll[i+0x080]); + state->m_reel1_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x000]); + state->m_reel2_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x040]); + state->m_reel3_tilemap->set_scrolly(i, state->m_bg_scroll[i+0x080]); } for (j=0; j < 0x100-1; j++) @@ -193,22 +196,19 @@ int rowenable = state->m_bg_scroll2[j]; /* draw top of screen */ - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = startclipmin; - clip.max_y = startclipmin+1; + clip.set(visarea.min_x, visarea.max_x, startclipmin, startclipmin+1); if (rowenable==0) { - tilemap_draw(bitmap,&clip,state->m_reel1_tilemap,0,0); + state->m_reel1_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==1) { - tilemap_draw(bitmap,&clip,state->m_reel2_tilemap,0,0); + state->m_reel2_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==2) { - tilemap_draw(bitmap,&clip,state->m_reel3_tilemap,0,0); + state->m_reel3_tilemap->draw(bitmap, clip, 0,0); } else if (rowenable==3) { @@ -217,7 +217,7 @@ startclipmin+=1; } - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -233,18 +233,6 @@ state->m_bg_enable = 1; } -static INTERRUPT_GEN( jackie_interrupt ) -{ - jackie_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) % 2) { - if (state->m_irq_enable) - device_set_input_line(device, 0, HOLD_LINE); - } else { - if (state->m_nmi_enable) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } -} - static void show_out(jackie_state *state) { @@ -555,6 +543,19 @@ rom[0x7e86] = 0xc3; } +static TIMER_DEVICE_CALLBACK( jackie_irq ) +{ + jackie_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 32) != 0) + return; + + if((scanline % 64) == 32 && state->m_irq_enable) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + else if ((scanline % 64) == 0 && state->m_nmi_enable) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( jackie, jackie_state ) @@ -562,7 +563,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz / 2) MCFG_CPU_PROGRAM_MAP(jackie_prg_map) MCFG_CPU_IO_MAP(jackie_io_map) - MCFG_CPU_VBLANK_INT_HACK(jackie_interrupt,8) + MCFG_TIMER_ADD_SCANLINE("scantimer", jackie_irq, "screen", 0, 1) MCFG_MACHINE_RESET(jackie) @@ -570,10 +571,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(jackie) + MCFG_SCREEN_UPDATE_STATIC(jackie) MCFG_GFXDECODE(jackie) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/jackpool.c mame-0.145/src/mame/drivers/jackpool.c --- mame-0.144/src/mame/drivers/jackpool.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/jackpool.c 2012-02-06 21:30:38.000000000 +0000 @@ -37,10 +37,10 @@ { } -static SCREEN_UPDATE(jackpool) +static SCREEN_UPDATE_IND16(jackpool) { - jackpool_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + jackpool_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count;// = 0x00000/2; int y,x; @@ -259,10 +259,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(jackpool) + MCFG_SCREEN_UPDATE_STATIC(jackpool) MCFG_EEPROM_93C46_ADD("eeprom") diff -Nru mame-0.144/src/mame/drivers/jaguar.c mame-0.145/src/mame/drivers/jaguar.c --- mame-0.144/src/mame/drivers/jaguar.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/jaguar.c 2012-02-06 21:30:38.000000000 +0000 @@ -390,6 +390,7 @@ UINT32 *jaguar_wave_rom; UINT32* high_rom_base; UINT8 cojag_is_r3000; +bool jaguar_hacks_enabled; static int is_jaguar; @@ -514,14 +515,12 @@ static emu_file *jaguar_nvram_fopen( running_machine &machine, UINT32 openflags) { device_image_interface *image = dynamic_cast(machine.device("cart")); - astring *fname; file_error filerr; emu_file *file; if (image->exists()) { - fname = astring_assemble_4( astring_alloc(), machine.system().name, PATH_SEPARATOR, image->basename_noext(), ".nv"); - filerr = mame_fopen( SEARCHPATH_NVRAM, astring_c( fname), openflags, &file); - astring_free( fname); + astring fname(machine.system().name, PATH_SEPARATOR, image->basename_noext(), ".nv"); + filerr = mame_fopen( SEARCHPATH_NVRAM, fname, openflags, &file); return (filerr == FILERR_NONE) ? file : NULL; } else @@ -950,7 +949,7 @@ { #if ENABLE_SPEEDUP_HACKS /* spin if we're allowed */ - jaguar_gpu_suspend(space->machine()); + if (jaguar_hacks_enabled) jaguar_gpu_suspend(space->machine()); #endif /* no command is pending */ @@ -1694,8 +1693,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(COJAG_PIXEL_CLOCK/2, 456, 42, 402, 262, 17, 257) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(cojag) + MCFG_SCREEN_UPDATE_STATIC(cojag) MCFG_VIDEO_START(cojag) @@ -1743,8 +1741,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ MCFG_SCREEN_RAW_PARAMS(JAGUAR_CLOCK, 456, 42, 402, 262, 17, 257) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(cojag) + MCFG_SCREEN_UPDATE_STATIC(cojag) MCFG_VIDEO_START(jaguar) @@ -1800,6 +1797,7 @@ static DRIVER_INIT( jaguar ) { + jaguar_hacks_enabled = false; state_save_register_global(machine, joystick_data); using_cart = 0; @@ -2317,6 +2315,7 @@ static DRIVER_INIT( area51a ) { + jaguar_hacks_enabled = true; cojag_common_init(machine, 0x5c4, 0x5a0); #if ENABLE_SPEEDUP_HACKS @@ -2332,6 +2331,7 @@ static DRIVER_INIT( area51 ) { + jaguar_hacks_enabled = true; cojag_common_init(machine, 0x0c0, 0x09e); #if ENABLE_SPEEDUP_HACKS @@ -2347,6 +2347,7 @@ static DRIVER_INIT( maxforce ) { + jaguar_hacks_enabled = true; cojag_state *state = machine.driver_data(); cojag_common_init(machine, 0x0c0, 0x09e); @@ -2363,6 +2364,7 @@ static DRIVER_INIT( area51mx ) { + jaguar_hacks_enabled = true; cojag_state *state = machine.driver_data(); cojag_common_init(machine, 0x0c0, 0x09e); @@ -2378,6 +2380,7 @@ static DRIVER_INIT( a51mxr3k ) { + jaguar_hacks_enabled = true; cojag_state *state = machine.driver_data(); cojag_common_init(machine, 0x0c0, 0x09e); @@ -2394,6 +2397,7 @@ static DRIVER_INIT( fishfren ) { + jaguar_hacks_enabled = true; cojag_common_init(machine, 0x578, 0x554); #if ENABLE_SPEEDUP_HACKS @@ -2425,16 +2429,17 @@ #endif } -static DRIVER_INIT( freezeat ) { init_freeze_common(machine, 0x1001a9f4); } -static DRIVER_INIT( freezeat2 ) { init_freeze_common(machine, 0x1001a8c4); } -static DRIVER_INIT( freezeat3 ) { init_freeze_common(machine, 0x1001a134); } -static DRIVER_INIT( freezeat4 ) { init_freeze_common(machine, 0x1001a134); } -static DRIVER_INIT( freezeat5 ) { init_freeze_common(machine, 0x10019b34); } -static DRIVER_INIT( freezeat6 ) { init_freeze_common(machine, 0x10019684); } +static DRIVER_INIT( freezeat ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x1001a9f4); } +static DRIVER_INIT( freezeat2 ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x1001a8c4); } +static DRIVER_INIT( freezeat3 ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x1001a134); } +static DRIVER_INIT( freezeat4 ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x1001a134); } +static DRIVER_INIT( freezeat5 ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x10019b34); } +static DRIVER_INIT( freezeat6 ) { jaguar_hacks_enabled = true; init_freeze_common(machine, 0x10019684); } static DRIVER_INIT( vcircle ) { + jaguar_hacks_enabled = true; cojag_common_init(machine, 0x5c0, 0x5a0); #if ENABLE_SPEEDUP_HACKS diff -Nru mame-0.144/src/mame/drivers/jailbrek.c mame-0.145/src/mame/drivers/jailbrek.c --- mame-0.144/src/mame/drivers/jailbrek.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/jailbrek.c 2012-02-06 21:30:33.000000000 +0000 @@ -268,8 +268,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 396, 8, 248, 256, 16, 240) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(jailbrek) + MCFG_SCREEN_UPDATE_STATIC(jailbrek) MCFG_PALETTE_INIT(jailbrek) MCFG_VIDEO_START(jailbrek) diff -Nru mame-0.144/src/mame/drivers/jalmah.c mame-0.145/src/mame/drivers/jalmah.c --- mame-0.144/src/mame/drivers/jalmah.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jalmah.c 2012-02-06 21:30:39.000000000 +0000 @@ -278,25 +278,25 @@ state->m_jm_scrollram = auto_alloc_array(machine, UINT16, 0x80/2); state->m_jm_vregs = auto_alloc_array(machine, UINT16, 0x40/2); - tilemap_set_transparent_pen(state->m_sc0_tilemap_0,15); - tilemap_set_transparent_pen(state->m_sc0_tilemap_1,15); - tilemap_set_transparent_pen(state->m_sc0_tilemap_2,15); - tilemap_set_transparent_pen(state->m_sc0_tilemap_3,15); - - tilemap_set_transparent_pen(state->m_sc1_tilemap_0,15); - tilemap_set_transparent_pen(state->m_sc1_tilemap_1,15); - tilemap_set_transparent_pen(state->m_sc1_tilemap_2,15); - tilemap_set_transparent_pen(state->m_sc1_tilemap_3,15); - - tilemap_set_transparent_pen(state->m_sc2_tilemap_0,15); - tilemap_set_transparent_pen(state->m_sc2_tilemap_1,15); - tilemap_set_transparent_pen(state->m_sc2_tilemap_2,15); - tilemap_set_transparent_pen(state->m_sc2_tilemap_3,15); - - tilemap_set_transparent_pen(state->m_sc3_tilemap_0,15); - //tilemap_set_transparent_pen(state->m_sc3_tilemap_1,15); - tilemap_set_transparent_pen(state->m_sc3_tilemap_2,15); - tilemap_set_transparent_pen(state->m_sc3_tilemap_3,15); + state->m_sc0_tilemap_0->set_transparent_pen(15); + state->m_sc0_tilemap_1->set_transparent_pen(15); + state->m_sc0_tilemap_2->set_transparent_pen(15); + state->m_sc0_tilemap_3->set_transparent_pen(15); + + state->m_sc1_tilemap_0->set_transparent_pen(15); + state->m_sc1_tilemap_1->set_transparent_pen(15); + state->m_sc1_tilemap_2->set_transparent_pen(15); + state->m_sc1_tilemap_3->set_transparent_pen(15); + + state->m_sc2_tilemap_0->set_transparent_pen(15); + state->m_sc2_tilemap_1->set_transparent_pen(15); + state->m_sc2_tilemap_2->set_transparent_pen(15); + state->m_sc2_tilemap_3->set_transparent_pen(15); + + state->m_sc3_tilemap_0->set_transparent_pen(15); + //state->m_sc3_tilemap_1->set_transparent_pen(15); + state->m_sc3_tilemap_2->set_transparent_pen(15); + state->m_sc3_tilemap_3->set_transparent_pen(15); } static VIDEO_START( urashima ) @@ -308,8 +308,8 @@ state->m_jm_scrollram = auto_alloc_array(machine, UINT16, 0x80/2); state->m_jm_vregs = auto_alloc_array(machine, UINT16, 0x40/2); - tilemap_set_transparent_pen(state->m_sc0_tilemap_0,15); - tilemap_set_transparent_pen(state->m_sc3_tilemap_0,15); + state->m_sc0_tilemap_0->set_transparent_pen(15); + state->m_sc3_tilemap_0->set_transparent_pen(15); } @@ -347,128 +347,128 @@ //popmessage("%02x %02x %02x %02x",state->m_sc0_prin,state->m_sc1_prin,state->m_sc2_prin,state->m_sc3_prin); } -static void draw_sc0_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sc0_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { jalmah_state *state = machine.driver_data(); switch(state->m_jm_vregs[0] & 3) { - case 0: tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap_0,0,0); break; - case 1: tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap_1,0,0); break; - case 2: tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap_2,0,0); break; - case 3: tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap_3,0,0); break; + case 0: state->m_sc0_tilemap_0->draw(bitmap, cliprect, 0,0); break; + case 1: state->m_sc0_tilemap_1->draw(bitmap, cliprect, 0,0); break; + case 2: state->m_sc0_tilemap_2->draw(bitmap, cliprect, 0,0); break; + case 3: state->m_sc0_tilemap_3->draw(bitmap, cliprect, 0,0); break; } } -static void draw_sc1_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sc1_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { jalmah_state *state = machine.driver_data(); switch(state->m_jm_vregs[1] & 3) { - case 0: tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap_0,0,0); break; - case 1: tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap_1,0,0); break; - case 2: tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap_2,0,0); break; - case 3: tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap_3,0,0); break; + case 0: state->m_sc1_tilemap_0->draw(bitmap, cliprect, 0,0); break; + case 1: state->m_sc1_tilemap_1->draw(bitmap, cliprect, 0,0); break; + case 2: state->m_sc1_tilemap_2->draw(bitmap, cliprect, 0,0); break; + case 3: state->m_sc1_tilemap_3->draw(bitmap, cliprect, 0,0); break; } } -static void draw_sc2_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sc2_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { jalmah_state *state = machine.driver_data(); switch(state->m_jm_vregs[2] & 3) { - case 0: tilemap_draw(bitmap,cliprect,state->m_sc2_tilemap_0,0,0); break; - case 1: tilemap_draw(bitmap,cliprect,state->m_sc2_tilemap_1,0,0); break; - case 2: tilemap_draw(bitmap,cliprect,state->m_sc2_tilemap_2,0,0); break; - case 3: tilemap_draw(bitmap,cliprect,state->m_sc2_tilemap_3,0,0); break; + case 0: state->m_sc2_tilemap_0->draw(bitmap, cliprect, 0,0); break; + case 1: state->m_sc2_tilemap_1->draw(bitmap, cliprect, 0,0); break; + case 2: state->m_sc2_tilemap_2->draw(bitmap, cliprect, 0,0); break; + case 3: state->m_sc2_tilemap_3->draw(bitmap, cliprect, 0,0); break; } } -static void draw_sc3_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sc3_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { jalmah_state *state = machine.driver_data(); switch(state->m_jm_vregs[3] & 3) { case 0: - case 1: tilemap_draw(bitmap,cliprect,state->m_sc3_tilemap_0,0,0); break; - case 2: tilemap_draw(bitmap,cliprect,state->m_sc3_tilemap_2,0,0); break; - case 3: tilemap_draw(bitmap,cliprect,state->m_sc3_tilemap_3,0,0); break; + case 1: state->m_sc3_tilemap_0->draw(bitmap, cliprect, 0,0); break; + case 2: state->m_sc3_tilemap_2->draw(bitmap, cliprect, 0,0); break; + case 3: state->m_sc3_tilemap_3->draw(bitmap, cliprect, 0,0); break; } } -static SCREEN_UPDATE( jalmah ) +static SCREEN_UPDATE_IND16( jalmah ) { - jalmah_state *state = screen->machine().driver_data(); + jalmah_state *state = screen.machine().driver_data(); UINT16 *jm_scrollram = state->m_jm_scrollram; UINT8 cur_prin; - jalmah_priority_system(screen->machine()); + jalmah_priority_system(screen.machine()); - tilemap_set_scrollx(state->m_sc0_tilemap_0, 0, jm_scrollram[0] & 0xfff); - tilemap_set_scrollx(state->m_sc0_tilemap_1, 0, jm_scrollram[0] & 0x7ff); - tilemap_set_scrollx(state->m_sc0_tilemap_2, 0, jm_scrollram[0] & 0x3ff); - tilemap_set_scrollx(state->m_sc0_tilemap_3, 0, jm_scrollram[0] & 0x1ff); - - tilemap_set_scrollx(state->m_sc1_tilemap_0, 0, jm_scrollram[1] & 0xfff); - tilemap_set_scrollx(state->m_sc1_tilemap_1, 0, jm_scrollram[1] & 0x7ff); - tilemap_set_scrollx(state->m_sc1_tilemap_2, 0, jm_scrollram[1] & 0x3ff); - tilemap_set_scrollx(state->m_sc1_tilemap_3, 0, jm_scrollram[1] & 0x1ff); - - tilemap_set_scrollx(state->m_sc2_tilemap_0, 0, jm_scrollram[2] & 0xfff); - tilemap_set_scrollx(state->m_sc2_tilemap_1, 0, jm_scrollram[2] & 0x7ff); - tilemap_set_scrollx(state->m_sc2_tilemap_2, 0, jm_scrollram[2] & 0x3ff); - tilemap_set_scrollx(state->m_sc2_tilemap_3, 0, jm_scrollram[2] & 0x1ff); + state->m_sc0_tilemap_0->set_scrollx(0, jm_scrollram[0] & 0xfff); + state->m_sc0_tilemap_1->set_scrollx(0, jm_scrollram[0] & 0x7ff); + state->m_sc0_tilemap_2->set_scrollx(0, jm_scrollram[0] & 0x3ff); + state->m_sc0_tilemap_3->set_scrollx(0, jm_scrollram[0] & 0x1ff); + + state->m_sc1_tilemap_0->set_scrollx(0, jm_scrollram[1] & 0xfff); + state->m_sc1_tilemap_1->set_scrollx(0, jm_scrollram[1] & 0x7ff); + state->m_sc1_tilemap_2->set_scrollx(0, jm_scrollram[1] & 0x3ff); + state->m_sc1_tilemap_3->set_scrollx(0, jm_scrollram[1] & 0x1ff); + + state->m_sc2_tilemap_0->set_scrollx(0, jm_scrollram[2] & 0xfff); + state->m_sc2_tilemap_1->set_scrollx(0, jm_scrollram[2] & 0x7ff); + state->m_sc2_tilemap_2->set_scrollx(0, jm_scrollram[2] & 0x3ff); + state->m_sc2_tilemap_3->set_scrollx(0, jm_scrollram[2] & 0x1ff); - tilemap_set_scrollx(state->m_sc3_tilemap_0, 0, jm_scrollram[3] & 0x7ff); + state->m_sc3_tilemap_0->set_scrollx(0, jm_scrollram[3] & 0x7ff); // empty - tilemap_set_scrollx(state->m_sc3_tilemap_2, 0, jm_scrollram[3] & 0x3ff); - tilemap_set_scrollx(state->m_sc3_tilemap_3, 0, jm_scrollram[3] & 0x1ff); + state->m_sc3_tilemap_2->set_scrollx(0, jm_scrollram[3] & 0x3ff); + state->m_sc3_tilemap_3->set_scrollx(0, jm_scrollram[3] & 0x1ff); - tilemap_set_scrolly(state->m_sc0_tilemap_0, 0, jm_scrollram[4] & 0x1ff); - tilemap_set_scrolly(state->m_sc0_tilemap_1, 0, jm_scrollram[4] & 0x3ff); - tilemap_set_scrolly(state->m_sc0_tilemap_2, 0, jm_scrollram[4] & 0x7ff); - tilemap_set_scrolly(state->m_sc0_tilemap_3, 0, jm_scrollram[4] & 0xfff); - - tilemap_set_scrolly(state->m_sc1_tilemap_0, 0, jm_scrollram[5] & 0x1ff); - tilemap_set_scrolly(state->m_sc1_tilemap_1, 0, jm_scrollram[5] & 0x3ff); - tilemap_set_scrolly(state->m_sc1_tilemap_2, 0, jm_scrollram[5] & 0x7ff); - tilemap_set_scrolly(state->m_sc1_tilemap_3, 0, jm_scrollram[5] & 0xfff); - - tilemap_set_scrolly(state->m_sc2_tilemap_0, 0, jm_scrollram[6] & 0x1ff); - tilemap_set_scrolly(state->m_sc2_tilemap_1, 0, jm_scrollram[6] & 0x3ff); - tilemap_set_scrolly(state->m_sc2_tilemap_2, 0, jm_scrollram[6] & 0x7ff); - tilemap_set_scrolly(state->m_sc2_tilemap_3, 0, jm_scrollram[6] & 0xfff); + state->m_sc0_tilemap_0->set_scrolly(0, jm_scrollram[4] & 0x1ff); + state->m_sc0_tilemap_1->set_scrolly(0, jm_scrollram[4] & 0x3ff); + state->m_sc0_tilemap_2->set_scrolly(0, jm_scrollram[4] & 0x7ff); + state->m_sc0_tilemap_3->set_scrolly(0, jm_scrollram[4] & 0xfff); + + state->m_sc1_tilemap_0->set_scrolly(0, jm_scrollram[5] & 0x1ff); + state->m_sc1_tilemap_1->set_scrolly(0, jm_scrollram[5] & 0x3ff); + state->m_sc1_tilemap_2->set_scrolly(0, jm_scrollram[5] & 0x7ff); + state->m_sc1_tilemap_3->set_scrolly(0, jm_scrollram[5] & 0xfff); + + state->m_sc2_tilemap_0->set_scrolly(0, jm_scrollram[6] & 0x1ff); + state->m_sc2_tilemap_1->set_scrolly(0, jm_scrollram[6] & 0x3ff); + state->m_sc2_tilemap_2->set_scrolly(0, jm_scrollram[6] & 0x7ff); + state->m_sc2_tilemap_3->set_scrolly(0, jm_scrollram[6] & 0xfff); - tilemap_set_scrolly(state->m_sc3_tilemap_0, 0, jm_scrollram[7] & 0xff); + state->m_sc3_tilemap_0->set_scrolly(0, jm_scrollram[7] & 0xff); // empty - tilemap_set_scrolly(state->m_sc3_tilemap_2, 0, jm_scrollram[7] & 0x1ff); - tilemap_set_scrolly(state->m_sc3_tilemap_3, 0, jm_scrollram[7] & 0x3ff); + state->m_sc3_tilemap_2->set_scrolly(0, jm_scrollram[7] & 0x1ff); + state->m_sc3_tilemap_3->set_scrolly(0, jm_scrollram[7] & 0x3ff); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0xff]); //selectable by a ram address? + bitmap.fill(screen.machine().pens[0xff], cliprect); //selectable by a ram address? for(cur_prin=1;cur_prin<=0x8;cur_prin<<=1) { - if(cur_prin==state->m_sc0_prin) { draw_sc0_layer(screen->machine(),bitmap,cliprect); } - if(cur_prin==state->m_sc1_prin) { draw_sc1_layer(screen->machine(),bitmap,cliprect); } - if(cur_prin==state->m_sc2_prin) { draw_sc2_layer(screen->machine(),bitmap,cliprect); } - if(cur_prin==state->m_sc3_prin) { draw_sc3_layer(screen->machine(),bitmap,cliprect); } + if(cur_prin==state->m_sc0_prin) { draw_sc0_layer(screen.machine(),bitmap,cliprect); } + if(cur_prin==state->m_sc1_prin) { draw_sc1_layer(screen.machine(),bitmap,cliprect); } + if(cur_prin==state->m_sc2_prin) { draw_sc2_layer(screen.machine(),bitmap,cliprect); } + if(cur_prin==state->m_sc3_prin) { draw_sc3_layer(screen.machine(),bitmap,cliprect); } } return 0; } -static SCREEN_UPDATE( urashima ) +static SCREEN_UPDATE_IND16( urashima ) { - jalmah_state *state = screen->machine().driver_data(); + jalmah_state *state = screen.machine().driver_data(); UINT16 *jm_scrollram = state->m_jm_scrollram; /*this game doesn't use the RANGE register at all.*/ - tilemap_set_scrollx(state->m_sc0_tilemap_0, 0, jm_scrollram[0]); - tilemap_set_scrollx(state->m_sc3_tilemap_0, 0, jm_scrollram[3]); - tilemap_set_scrolly(state->m_sc0_tilemap_0, 0, jm_scrollram[4]); - tilemap_set_scrolly(state->m_sc3_tilemap_0, 0, jm_scrollram[7]); - - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x1ff]);//selectable by a ram address? - if(state->m_jm_vregs[0] & 1) { tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap_0,0,0); } - if(state->m_jm_vregs[3] & 1) { tilemap_draw(bitmap,cliprect,state->m_sc3_tilemap_0,0,0); } + state->m_sc0_tilemap_0->set_scrollx(0, jm_scrollram[0]); + state->m_sc3_tilemap_0->set_scrollx(0, jm_scrollram[3]); + state->m_sc0_tilemap_0->set_scrolly(0, jm_scrollram[4]); + state->m_sc3_tilemap_0->set_scrolly(0, jm_scrollram[7]); + + bitmap.fill(screen.machine().pens[0x1ff], cliprect);//selectable by a ram address? + if(state->m_jm_vregs[0] & 1) { state->m_sc0_tilemap_0->draw(bitmap, cliprect, 0,0); } + if(state->m_jm_vregs[3] & 1) { state->m_sc3_tilemap_0->draw(bitmap, cliprect, 0,0); } return 0; } @@ -477,13 +477,13 @@ jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc0_vram[offset]); /*2048x256 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc0_tilemap_0,offset); + state->m_sc0_tilemap_0->mark_tile_dirty(offset); /*1024x512 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc0_tilemap_1,offset); + state->m_sc0_tilemap_1->mark_tile_dirty(offset); /*512x1024 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc0_tilemap_2,offset); + state->m_sc0_tilemap_2->mark_tile_dirty(offset); /*256x2048 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc0_tilemap_3,offset); + state->m_sc0_tilemap_3->mark_tile_dirty(offset); } static WRITE16_HANDLER( sc3_vram_w ) @@ -491,11 +491,11 @@ jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc3_vram[offset]); /*2048x256 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc3_tilemap_0,offset); + state->m_sc3_tilemap_0->mark_tile_dirty(offset); /*1024x512 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc3_tilemap_2,offset); + state->m_sc3_tilemap_2->mark_tile_dirty(offset); /*512x1024 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc3_tilemap_3,offset); + state->m_sc3_tilemap_3->mark_tile_dirty(offset); } static WRITE16_HANDLER( sc1_vram_w ) @@ -503,13 +503,13 @@ jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc1_vram[offset]); /*2048x256 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc1_tilemap_0,offset); + state->m_sc1_tilemap_0->mark_tile_dirty(offset); /*1024x512 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc1_tilemap_1,offset); + state->m_sc1_tilemap_1->mark_tile_dirty(offset); /*512x1024 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc1_tilemap_2,offset); + state->m_sc1_tilemap_2->mark_tile_dirty(offset); /*256x2048 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc1_tilemap_3,offset); + state->m_sc1_tilemap_3->mark_tile_dirty(offset); } static WRITE16_HANDLER( sc2_vram_w ) @@ -517,13 +517,13 @@ jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc2_vram[offset]); /*2048x256 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc2_tilemap_0,offset); + state->m_sc2_tilemap_0->mark_tile_dirty(offset); /*1024x512 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc2_tilemap_1,offset); + state->m_sc2_tilemap_1->mark_tile_dirty(offset); /*512x1024 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc2_tilemap_2,offset); + state->m_sc2_tilemap_2->mark_tile_dirty(offset); /*256x2048 tilemap*/ - tilemap_mark_tile_dirty(state->m_sc2_tilemap_3,offset); + state->m_sc2_tilemap_3->mark_tile_dirty(offset); } static WRITE16_HANDLER( jalmah_tilebank_w ) @@ -539,10 +539,10 @@ if (state->m_sc0bank != ((data & 0xf0) >> 4)) { state->m_sc0bank = (data & 0xf0) >> 4; - tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_0); - tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_1); - tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_2); - tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_3); + state->m_sc0_tilemap_0->mark_all_dirty(); + state->m_sc0_tilemap_1->mark_all_dirty(); + state->m_sc0_tilemap_2->mark_all_dirty(); + state->m_sc0_tilemap_3->mark_all_dirty(); } if (state->m_pri != (data & 0x0f)) state->m_pri = data & 0x0f; @@ -587,9 +587,9 @@ if (state->m_sc0bank != (data & 0x0f)) { state->m_sc0bank = (data & 0x0f); - tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_0); - //tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_2); - //tilemap_mark_all_tiles_dirty(state->m_sc0_tilemap_3); + state->m_sc0_tilemap_0->mark_all_dirty(); + //state->m_sc0_tilemap_2->mark_all_dirty(); + //state->m_sc0_tilemap_3->mark_all_dirty(); } } } @@ -598,14 +598,14 @@ { jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc0_vram[offset]); - tilemap_mark_tile_dirty(state->m_sc0_tilemap_0,offset); + state->m_sc0_tilemap_0->mark_tile_dirty(offset); } static WRITE16_HANDLER( urashima_sc3_vram_w ) { jalmah_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_sc3_vram[offset]); - tilemap_mark_tile_dirty(state->m_sc3_tilemap_0,offset); + state->m_sc3_tilemap_0->mark_tile_dirty(offset); } /*Urashima Mahjong uses a bigger (and mostly unused/wasted) video register ram.*/ @@ -1387,10 +1387,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jalmah) + MCFG_SCREEN_UPDATE_STATIC(jalmah) MCFG_PALETTE_LENGTH(0x400) MCFG_MACHINE_RESET(jalmah) @@ -1413,7 +1412,7 @@ MCFG_VIDEO_START(urashima) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(urashima) + MCFG_SCREEN_UPDATE_STATIC(urashima) MACHINE_CONFIG_END /* diff -Nru mame-0.144/src/mame/drivers/jangou.c mame-0.145/src/mame/drivers/jangou.c --- mame-0.144/src/mame/drivers/jangou.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/jangou.c 2012-02-06 21:30:39.000000000 +0000 @@ -120,21 +120,21 @@ state->save_item(NAME(state->m_blit_buffer)); } -static SCREEN_UPDATE( jangou ) +static SCREEN_UPDATE_IND16( jangou ) { - jangou_state *state = screen->machine().driver_data(); + jangou_state *state = screen.machine().driver_data(); int x, y; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { - UINT8 *src = &state->m_blit_buffer[y * 512 / 2 + cliprect->min_x]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, cliprect->min_x); + UINT8 *src = &state->m_blit_buffer[y * 512 / 2 + cliprect.min_x]; + UINT16 *dst = &bitmap.pix16(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { UINT32 srcpix = *src++; - *dst++ = screen->machine().pens[srcpix & 0xf]; - *dst++ = screen->machine().pens[(srcpix >> 4) & 0xf]; + *dst++ = screen.machine().pens[srcpix & 0xf]; + *dst++ = screen.machine().pens[(srcpix >> 4) & 0xf]; } } @@ -999,10 +999,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(jangou) + MCFG_SCREEN_UPDATE_STATIC(jangou) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/jantotsu.c mame-0.145/src/mame/drivers/jantotsu.c --- mame-0.144/src/mame/drivers/jantotsu.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/jantotsu.c 2012-02-06 21:30:36.000000000 +0000 @@ -97,6 +97,8 @@ #include "sound/sn76496.h" #include "sound/msm5205.h" +#define MAIN_CLOCK XTAL_18_432MHz + class jantotsu_state : public driver_device { public: @@ -133,11 +135,12 @@ state->save_item(NAME(state->m_bitmap)); } -static SCREEN_UPDATE(jantotsu) +static SCREEN_UPDATE_RGB32(jantotsu) { - jantotsu_state *state = screen->machine().driver_data(); + jantotsu_state *state = screen.machine().driver_data(); int x, y, i; int count = 0; + UINT8 pen_i; if(!state->m_display_on) return 0; @@ -146,23 +149,17 @@ { for (x = 0; x < 256; x += 8) { - int pen[4], color; + UINT8 color; for (i = 0; i < 8; i++) { - pen[0] = (state->m_bitmap[count + 0x0000]) >> (7 - i); - pen[1] = (state->m_bitmap[count + 0x2000]) >> (7 - i); - pen[2] = (state->m_bitmap[count + 0x4000]) >> (7 - i); - pen[3] = (state->m_bitmap[count + 0x6000]) >> (7 - i); - - color = ((pen[0] & 1) << 0); - color |= ((pen[1] & 1) << 1); - color |= ((pen[2] & 1) << 2); - color |= ((pen[3] & 1) << 3); - color |= state->m_col_bank; + color = state->m_col_bank; + + for(pen_i = 0;pen_i<4;pen_i++) + color |= (((state->m_bitmap[count + pen_i*0x2000]) >> (7 - i)) & 1) << pen_i; - if ((x + i) <= screen->visible_area().max_x && (y + 0) < screen->visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, x + i) = screen->machine().pens[color]; + if (cliprect.contains(x + i, y)) + bitmap.pix32(y, x + i) = screen.machine().pens[color]; } count++; @@ -233,29 +230,26 @@ static READ8_HANDLER( jantotsu_mux_r ) { jantotsu_state *state = space->machine().driver_data(); - UINT8 coin_port = input_port_read(space->machine(), "COINS"); + const char *const portnames[] = { "PL1_1", "PL1_2", "PL1_3", "PL1_4", + "PL2_1", "PL2_2", "PL2_3", "PL2_4" }; + UINT8 i,res; // printf("%02x\n", state->m_mux_data); + res = input_port_read(space->machine(), "COINS"); - switch (state->m_mux_data) + for(i=0;i<8;i++) { - case 0x01: return input_port_read(space->machine(), "PL1_1") | coin_port; - case 0x02: return input_port_read(space->machine(), "PL1_2") | coin_port; - case 0x04: return input_port_read(space->machine(), "PL1_3") | coin_port; - case 0x08: return input_port_read(space->machine(), "PL1_4") | coin_port; - case 0x10: return input_port_read(space->machine(), "PL2_1") | coin_port; - case 0x20: return input_port_read(space->machine(), "PL2_2") | coin_port; - case 0x40: return input_port_read(space->machine(), "PL2_3") | coin_port; - case 0x80: return input_port_read(space->machine(), "PL2_4") | coin_port; + if((~state->m_mux_data) & (1 << i)) + res |= input_port_read(space->machine(), portnames[i]); } - return coin_port; + return res; } static WRITE8_HANDLER( jantotsu_mux_w ) { jantotsu_state *state = space->machine().driver_data(); - state->m_mux_data = ~data; + state->m_mux_data = data; } /*If bits 6 & 7 doesn't return 0x80,the game hangs until this bit is set, @@ -507,7 +501,7 @@ static MACHINE_CONFIG_START( jantotsu, jantotsu_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80,18432000/4) + MCFG_CPU_ADD("maincpu", Z80,MAIN_CLOCK/4) MCFG_CPU_PROGRAM_MAP(jantotsu_map) MCFG_CPU_IO_MAP(jantotsu_io) MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) @@ -519,10 +513,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(jantotsu) + MCFG_SCREEN_UPDATE_STATIC(jantotsu) MCFG_PALETTE_INIT(jantotsu) MCFG_PALETTE_LENGTH(0x20) @@ -532,13 +525,13 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("sn1", SN76489A, 18432000/4) + MCFG_SOUND_ADD("sn1", SN76489A, MAIN_CLOCK/4) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - MCFG_SOUND_ADD("sn2", SN76489A, 18432000/4) + MCFG_SOUND_ADD("sn2", SN76489A, MAIN_CLOCK/4) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - MCFG_SOUND_ADD("adpcm", MSM5205, 384000) + MCFG_SOUND_ADD("adpcm", MSM5205, XTAL_384kHz) MCFG_SOUND_CONFIG(msm5205_config) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/jchan.c mame-0.145/src/mame/drivers/jchan.c --- mame-0.144/src/mame/drivers/jchan.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/jchan.c 2012-02-06 21:30:42.000000000 +0000 @@ -17,7 +17,7 @@ jchan2 : "1995/10/24 Fists Of Fire" - main2sub comunication is done within $400000-$403fff (mainsub_shared_ram): + main2sub communication is done within $400000-$403fff (mainsub_shared_ram): - $403C02(W) : ] - $403C04(W) : ] main68k sets parameters before calling subcpu routine, when required - $403C06(W) : ] @@ -169,7 +169,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "machine/nvram.h" #include "sound/ymz280b.h" #include "includes/kaneko16.h" @@ -179,10 +178,13 @@ { public: jchan_state(const machine_config &mconfig, device_type type, const char *tag) - : kaneko16_state(mconfig, type, tag) { } + : kaneko16_state(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_subcpu(*this,"sub") + { } - bitmap_t *m_sprite_bitmap_1; - bitmap_t *m_sprite_bitmap_2; + bitmap_ind16 *m_sprite_bitmap_1; + bitmap_ind16 *m_sprite_bitmap_2; UINT32* m_sprite_ram32_1; UINT32* m_sprite_ram32_2; UINT32* m_sprite_regs32_1; @@ -198,6 +200,8 @@ UINT16 m_mcu_com[4]; UINT16 *m_ctrl; + required_device m_maincpu; + required_device m_subcpu; sknsspr_device* m_spritegen1; sknsspr_device* m_spritegen2; }; @@ -297,41 +301,27 @@ // if it is incorrect jchan2 will crash when // certain characters win/lose but no finish // move was performed -static INTERRUPT_GEN( jchan_vblank ) +static TIMER_DEVICE_CALLBACK( jchan_vblank ) { - jchan_state *state = device->machine().driver_data(); - int i = cpu_getiloops(device); - switch (i) - { + jchan_state *state = timer.machine().driver_data(); + int scanline = param; - case 0: - device_set_input_line(device, 1, HOLD_LINE); - break; - - case 100: - device_set_input_line(device, 2, HOLD_LINE); - break; + if(scanline == 240) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); - } + if(scanline == 11) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); if (state->m_irq_sub_enable) { - switch (i) - { + if(scanline == 240) + device_set_input_line(state->m_subcpu, 1, HOLD_LINE); - case 0: - cputag_set_input_line(device->machine(), "sub", 1, HOLD_LINE); - break; - - case 220: - cputag_set_input_line(device->machine(), "sub", 2, HOLD_LINE); - break; - - case 100: - cputag_set_input_line(device->machine(), "sub", 3, HOLD_LINE); - break; + if(scanline == 249) + device_set_input_line(state->m_subcpu, 2, HOLD_LINE); - } + if(scanline == 11) + device_set_input_line(state->m_subcpu, 3, HOLD_LINE); } } @@ -349,8 +339,8 @@ state->m_sprite_regs32_1 = auto_alloc_array(machine, UINT32, 0x40/4); state->m_sprite_regs32_2 = auto_alloc_array(machine, UINT32, 0x40/4); - state->m_sprite_bitmap_1 = auto_bitmap_alloc(machine,1024,1024,BITMAP_FORMAT_INDEXED16); - state->m_sprite_bitmap_2 = auto_bitmap_alloc(machine,1024,1024,BITMAP_FORMAT_INDEXED16); + state->m_sprite_bitmap_1 = auto_bitmap_ind16_alloc(machine,1024,1024); + state->m_sprite_bitmap_2 = auto_bitmap_ind16_alloc(machine,1024,1024); state->m_spritegen1 = machine.device("spritegen1"); state->m_spritegen2 = machine.device("spritegen2"); @@ -368,9 +358,9 @@ -static SCREEN_UPDATE(jchan) +static SCREEN_UPDATE_IND16(jchan) { - jchan_state *state = screen->machine().driver_data(); + jchan_state *state = screen.machine().driver_data(); int x,y; UINT16* src1; UINT16* src2; @@ -378,22 +368,22 @@ UINT16 pixdata1; UINT16 pixdata2; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - SCREEN_UPDATE_CALL(jchan_view2); + SCREEN_UPDATE16_CALL(jchan_view2); - bitmap_fill(state->m_sprite_bitmap_1, cliprect, 0x0000); - bitmap_fill(state->m_sprite_bitmap_2, cliprect, 0x0000); + state->m_sprite_bitmap_1->fill(0x0000, cliprect); + state->m_sprite_bitmap_2->fill(0x0000, cliprect); - state->m_spritegen1->skns_draw_sprites(screen->machine(), state->m_sprite_bitmap_1, cliprect, state->m_sprite_ram32_1, 0x4000, screen->machine().region("gfx1")->base(), screen->machine().region ("gfx1")->bytes(), state->m_sprite_regs32_1 ); - state->m_spritegen2->skns_draw_sprites(screen->machine(), state->m_sprite_bitmap_2, cliprect, state->m_sprite_ram32_2, 0x4000, screen->machine().region("gfx2")->base(), screen->machine().region ("gfx2")->bytes(), state->m_sprite_regs32_2 ); + state->m_spritegen1->skns_draw_sprites(screen.machine(), *state->m_sprite_bitmap_1, cliprect, state->m_sprite_ram32_1, 0x4000, screen.machine().region("gfx1")->base(), screen.machine().region ("gfx1")->bytes(), state->m_sprite_regs32_1 ); + state->m_spritegen2->skns_draw_sprites(screen.machine(), *state->m_sprite_bitmap_2, cliprect, state->m_sprite_ram32_2, 0x4000, screen.machine().region("gfx2")->base(), screen.machine().region ("gfx2")->bytes(), state->m_sprite_regs32_2 ); // ignoring priority bits for now - might use alpha too, check 0x8000 of palette writes for (y=0;y<240;y++) { - src1 = BITMAP_ADDR16(state->m_sprite_bitmap_1, y, 0); - src2 = BITMAP_ADDR16(state->m_sprite_bitmap_2, y, 0); - dst = BITMAP_ADDR16(bitmap, y, 0); + src1 = &state->m_sprite_bitmap_1->pix16(y); + src2 = &state->m_sprite_bitmap_2->pix16(y); + dst = &bitmap.pix16(y); for (x=0;x<320;x++) { @@ -668,7 +658,7 @@ MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_PROGRAM_MAP(jchan_main) - MCFG_CPU_VBLANK_INT_HACK(jchan_vblank, 224) + MCFG_TIMER_ADD_SCANLINE("scantimer", jchan_vblank, "screen", 0, 1) MCFG_CPU_ADD("sub", M68000, 16000000) MCFG_CPU_PROGRAM_MAP(jchan_sub) @@ -679,10 +669,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(jchan) + MCFG_SCREEN_UPDATE_STATIC(jchan) MCFG_PALETTE_LENGTH(0x10000) diff -Nru mame-0.144/src/mame/drivers/jeutel.c mame-0.145/src/mame/drivers/jeutel.c --- mame-0.144/src/mame/drivers/jeutel.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jeutel.c 2012-02-06 21:30:36.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -5,18 +7,28 @@ { public: jeutel_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( jeutel_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jeutel_map, AS_PROGRAM, 8, jeutel_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_END static INPUT_PORTS_START( jeutel ) INPUT_PORTS_END -static MACHINE_RESET( jeutel ) +void jeutel_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 3300000) MCFG_CPU_PROGRAM_MAP(jeutel_map) - - MCFG_MACHINE_RESET( jeutel ) MACHINE_CONFIG_END /*-------------------------------- @@ -72,5 +82,6 @@ ROM_RELOAD(0xe000, 0x2000) ROM_END -GAME(1983, leking, 0, jeutel, jeutel, jeutel, ROT0, "Jeutel", "Le King", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, olympic, 0, jeutel, jeutel, jeutel, ROT0, "Jeutel", "Olympic Games", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1983, leking, 0, jeutel, jeutel, jeutel, ROT0, "Jeutel", "Le King", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, olympic, 0, jeutel, jeutel, jeutel, ROT0, "Jeutel", "Olympic Games", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/jokrwild.c mame-0.145/src/mame/drivers/jokrwild.c --- mame-0.144/src/mame/drivers/jokrwild.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/jokrwild.c 2012-02-06 21:30:36.000000000 +0000 @@ -118,7 +118,7 @@ { jokrwild_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -126,7 +126,7 @@ { jokrwild_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -153,10 +153,10 @@ } -static SCREEN_UPDATE( jokrwild ) +static SCREEN_UPDATE_IND16( jokrwild ) { - jokrwild_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + jokrwild_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -484,10 +484,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((32+1)*8, (32+1)*8) /* From MC6845, registers 00 & 04. (value-1) */ MCFG_SCREEN_VISIBLE_AREA(0*8, 24*8-1, 0*8, 26*8-1) /* From MC6845, registers 01 & 06 */ - MCFG_SCREEN_UPDATE(jokrwild) + MCFG_SCREEN_UPDATE_STATIC(jokrwild) MCFG_GFXDECODE(jokrwild) MCFG_PALETTE_INIT(jokrwild) diff -Nru mame-0.144/src/mame/drivers/jollyjgr.c mame-0.145/src/mame/drivers/jollyjgr.c --- mame-0.144/src/mame/drivers/jollyjgr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/jollyjgr.c 2012-02-06 21:30:34.000000000 +0000 @@ -138,7 +138,7 @@ { jollyjgr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( jollyjgr_attrram_w ) @@ -151,11 +151,11 @@ int i; for (i = offset >> 1; i < 0x0400; i += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); } else { - tilemap_set_scrolly(state->m_bg_tilemap, offset >> 1, data); + state->m_bg_tilemap->set_scrolly(offset >> 1, data); } state->m_colorram[offset] = data; @@ -175,7 +175,7 @@ state->m_pri = data & 4; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flip_x ? TILEMAP_FLIPX : 0) | (state->m_flip_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flip_x ? TILEMAP_FLIPX : 0) | (state->m_flip_y ? TILEMAP_FLIPY : 0)); state->m_nmi_enable = data & 0x80; } @@ -441,11 +441,11 @@ jollyjgr_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); } -static void draw_bitmap( running_machine &machine, bitmap_t *bitmap ) +static void draw_bitmap( running_machine &machine, bitmap_ind16 &bitmap ) { jollyjgr_state *state = machine.driver_data(); int x, y, count; @@ -467,13 +467,13 @@ if(color) { if(state->m_flip_x && state->m_flip_y) - *BITMAP_ADDR16(bitmap, y, x * 8 + i) = color + 32; + bitmap.pix16(y, x * 8 + i) = color + 32; else if(state->m_flip_x && !state->m_flip_y) - *BITMAP_ADDR16(bitmap, 255 - y, x * 8 + i) = color + 32; + bitmap.pix16(255 - y, x * 8 + i) = color + 32; else if(!state->m_flip_x && state->m_flip_y) - *BITMAP_ADDR16(bitmap, y, 255 - x * 8 - i) = color + 32; + bitmap.pix16(y, 255 - x * 8 - i) = color + 32; else - *BITMAP_ADDR16(bitmap, 255 - y, 255 - x * 8 - i) = color + 32; + bitmap.pix16(255 - y, 255 - x * 8 - i) = color + 32; } } @@ -482,27 +482,27 @@ } } -static SCREEN_UPDATE( jollyjgr ) +static SCREEN_UPDATE_IND16( jollyjgr ) { - jollyjgr_state *state = screen->machine().driver_data(); + jollyjgr_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; - bitmap_fill(bitmap, cliprect, 32); + bitmap.fill(32, cliprect); if(state->m_pri) //used in Frog & Spiders level 3 { if(!(state->m_bitmap_disable)) - draw_bitmap(screen->machine(), bitmap); + draw_bitmap(screen.machine(), bitmap); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if(!(state->m_bitmap_disable)) - draw_bitmap(screen->machine(), bitmap); + draw_bitmap(screen.machine(), bitmap); } /* Sprites are the same as in Galaxian */ @@ -529,7 +529,7 @@ if (offs < 3 * 4) sy++; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], code,color, flipx,flipy, sx,sy,0); @@ -538,12 +538,12 @@ return 0; } -static SCREEN_UPDATE( fspider ) +static SCREEN_UPDATE_IND16( fspider ) { - jollyjgr_state *state = screen->machine().driver_data(); + jollyjgr_state *state = screen.machine().driver_data(); // Draw bg and sprites - SCREEN_UPDATE_CALL(jollyjgr); + SCREEN_UPDATE16_CALL(jollyjgr); /* Draw bullets 16 bytes, 2 bytes per bullet (y,x). 2 player bullets, 6 enemy bullets. @@ -559,10 +559,10 @@ if (state->m_flip_y) sy^=0xff; if (state->m_flip_x) sx+=8; - if (sy>=cliprect->min_y && sy<=cliprect->max_y) + if (sy>=cliprect.min_y && sy<=cliprect.max_y) for (int x=sx-4;x=cliprect->min_x && x<=cliprect->max_x) - *BITMAP_ADDR16(bitmap,sy,x)=bc; + if (x>=cliprect.min_x && x<=cliprect.max_x) + bitmap.pix16(sy, x)=bc; } return 0; @@ -655,10 +655,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jollyjgr) + MCFG_SCREEN_UPDATE_STATIC(jollyjgr) MCFG_GFXDECODE(jollyjgr) MCFG_PALETTE_LENGTH(32+8) /* 32 for tilemap and sprites + 8 for the bitmap */ @@ -679,7 +678,7 @@ MCFG_CPU_PROGRAM_MAP(fspider_map) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(fspider) + MCFG_SCREEN_UPDATE_STATIC(fspider) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/jongkyo.c mame-0.145/src/mame/drivers/jongkyo.c --- mame-0.144/src/mame/drivers/jongkyo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/jongkyo.c 2012-02-06 21:30:35.000000000 +0000 @@ -59,9 +59,9 @@ } -static SCREEN_UPDATE( jongkyo ) +static SCREEN_UPDATE_IND16( jongkyo ) { - jongkyo_state *state = screen->machine().driver_data(); + jongkyo_state *state = screen.machine().driver_data(); int y; for (y = 0; y < 256; ++y) @@ -89,7 +89,7 @@ for (b = 0; b < 4; ++b) { - *BITMAP_ADDR16(bitmap, 255 - y, 255 - (x + b)) = ((data2 & 0x01)) + ((data2 & 0x10) >> 3) + + bitmap.pix16(255 - y, 255 - (x + b)) = ((data2 & 0x01)) + ((data2 & 0x10) >> 3) + ((data1 & 0x01) << 2) + ((data1 & 0x10) >> 1) + ((data3 & 0x01) << 4) + ((data3 & 0x10) << 1); data1 >>= 1; @@ -497,10 +497,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 8, 256-8-1) - MCFG_SCREEN_UPDATE(jongkyo) + MCFG_SCREEN_UPDATE_STATIC(jongkyo) MCFG_PALETTE_LENGTH(0x100) MCFG_PALETTE_INIT(jongkyo) diff -Nru mame-0.144/src/mame/drivers/jp.c mame-0.145/src/mame/drivers/jp.c --- mame-0.144/src/mame/drivers/jp.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jp.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -5,18 +7,28 @@ { public: jp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( jp_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jp_map, AS_PROGRAM, 8, jp_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( jp ) INPUT_PORTS_END -static MACHINE_RESET( jp ) +void jp_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 5000000) MCFG_CPU_PROGRAM_MAP(jp_map) - - MCFG_MACHINE_RESET( jp ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -164,12 +174,12 @@ ROM_LOAD("jpsonid7.dat", 0x30000, 0x8000, CRC(ff430b1b) SHA1(423592a40eba174108dfc6817e549c643bb3c80f)) ROM_END -GAME(1986, america, 0, jp, jp, jp, ROT0, "Juegos Populares", "America 1492", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, aqualand, 0, jp, jp, jp, ROT0, "Juegos Populares", "Aqualand", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, faeton, 0, jp, jp, jp, ROT0, "Juegos Populares", "Faeton", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, lortium, 0, jp, jp, jp, ROT0, "Juegos Populares", "Lortium", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, pimbal, 0, jp, jp, jp, ROT0, "Juegos Populares", "Pimbal (Pinball 3000)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, petaco, 0, jp, jp, jp, ROT0, "Juegos Populares", "Petaco", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, petaco2, 0, jp, jp, jp, ROT0, "Juegos Populares", "Petaco 2", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, halley, 0, jp, jp, jp, ROT0, "Juegos Populares", "Halley Comet", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, olympus, 0, jp, jp, jp, ROT0, "Juegos Populares", "Olympus", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1986, america, 0, jp, jp, jp, ROT0, "Juegos Populares", "America 1492", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, aqualand, 0, jp, jp, jp, ROT0, "Juegos Populares", "Aqualand", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, faeton, 0, jp, jp, jp, ROT0, "Juegos Populares", "Faeton", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, lortium, 0, jp, jp, jp, ROT0, "Juegos Populares", "Lortium", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, pimbal, 0, jp, jp, jp, ROT0, "Juegos Populares", "Pimbal (Pinball 3000)",GAME_IS_SKELETON_MECHANICAL) +GAME(1984, petaco, 0, jp, jp, jp, ROT0, "Juegos Populares", "Petaco", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, petaco2, 0, jp, jp, jp, ROT0, "Juegos Populares", "Petaco 2", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, halley, 0, jp, jp, jp, ROT0, "Juegos Populares", "Halley Comet", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, olympus, 0, jp, jp, jp, ROT0, "Juegos Populares", "Olympus", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/jpmimpct.c mame-0.145/src/mame/drivers/jpmimpct.c --- mame-0.144/src/mame/drivers/jpmimpct.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jpmimpct.c 2012-02-06 21:30:40.000000000 +0000 @@ -802,7 +802,8 @@ "screen", /* the screen operated on */ 40000000/16, /* pixel clock */ 4, /* pixels per clock */ - jpmimpct_scanline_update, /* scanline updater */ + NULL, /* scanline updater (indexed16) */ + jpmimpct_scanline_update, /* scanline updater (rgb32) */ jpmimpct_tms_irq, /* generate interrupt */ jpmimpct_to_shiftreg, /* write to shiftreg function */ jpmimpct_from_shiftreg /* read from shiftreg function */ @@ -831,9 +832,8 @@ MCFG_TIMER_ADD( "duart_1_timer", duart_1_timer_event) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) MCFG_PALETTE_LENGTH(256) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -5503,240 +5503,231 @@ GAME( 199?, snlad, 0, jpmimpct, cluedo , 0, ROT0, "JPM", "Snake & Ladders" , GAME_NOT_WORKING) // probably incomplete /* Mechanical Below */ +#define GAME_FLAGS GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND -GAME( 199?, j6fifth , 0 , impctawp, tbirds, 0, ROT0, "Ace", "5th Dimension (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6aceclb , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Ace Of Clubs (Crystal) (IMPACT, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6aceclba , j6aceclb , impctawp, tbirds, 0, ROT0, "Crystal", "Ace Of Clubs (Crystal) (IMPACT, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6acehi , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Aces High (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6amdrm , 0 , impctawp, tbirds, 0, ROT0, "Mdm", "American Dream (Mdm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6arcade , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Arcadia (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bnkrcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Banker Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6big50 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big 50 (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigbnk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Banker (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigbuk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Bucks (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigcsh , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Big Cash Machine (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigpct , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Big Picture (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigtop , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Top Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bigwhl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Wheel (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bnza , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Bonanza (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6brkout , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Breakout (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bucks , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Bucks Fizz (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6buzz , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Buzzundrum (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cpclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Caesar's Palace Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6camelt , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Camelot (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6scarlt , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Captain Scarlet (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshbox , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Cash Box Club (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshbeu , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Cash Box Club (Empire) (Euro) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshbst , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Buster (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshcnt , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Countdown (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshrd , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Cash Raider (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshtwr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Towers (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cshvgs , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Vegas Strip (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cas5 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino 5ive Liner (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cascz , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cccla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Classic (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cascla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Classic Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6casclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6caslas , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Las Vegas (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cheque , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cheque Mate (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cluclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cluedo Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6col , 0 , impctawp, tbirds, 0, ROT0, "Mdm", "Coliseum (Mdm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6colcsh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Coliseum Cash (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6colmon , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Colour Of Money (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6coprob , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Cops 'n' Robbers (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6crack , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cracker (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6crzclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Crazy Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6crsfir , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cross Fire (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6daygld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Daytona Gold (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6dayml , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Daytona Millennium (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6dmnjkr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Demon Jokers (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6dmngz , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Diamond Geezer (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6dyfl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Do You Feel Lucky (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6drdogh , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Dr Dough (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6euphor , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Euphoria (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fastfr , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Fast Fruits Club (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fasttk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Fast Trak (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6filth , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Filthy Rich Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6firbl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Fireball (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fireck , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Firecracker (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6firclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Firecracker Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fivalv , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Five Alive Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fiveln , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Five Liner (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6frc10 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Force 10 (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6framft , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Frame & Fortune Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6frtmch , 0 , impctawp, tbirds, 0, ROT0, "JPM", "The Fruit Machine (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6frtpot , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Fruitpots (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gforce , 0 , impctawp, tbirds, 0, ROT0, "JPM", "G Force (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gforceb , j6gforce , impctawp, tbirds, 0, ROT0, "JPM", "G Force (Jpm) (IMPACT) (15GBP Jackpot)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gidogh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "G.I. Dough (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6guab , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Give Us A Break (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6guabcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Give Us A Break Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gldclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Gladiator Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gogold , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Go For Gold (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gldmin , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Gold Mine (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gldday , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Day (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6golddm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Demons (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6goldgl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Goal (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hapyhr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Happy Hour (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hifly , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hi Flyer (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6impact , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Impact (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6impactb , j6impact , impctawp, tbirds, 0, ROT0, "JPM", "Hi Impact (Jpm) (IMPACT) (15GBP Jackpot)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hilosv , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Lo Silver (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hirol , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Roller (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hirlcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Roller Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6histk , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Hi Stakes (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hiphop , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Hip Hopper (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hotsht , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Hot Shot (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6impuls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Impulse (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6indy , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Indiana Jones (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6showtm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "It's Showtime (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jackjs , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Jackpot Justice (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jkrgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Gold (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jkrpls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Plus (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jkpldx , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Plus Deluxe (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jkwld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Wild (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6jungfv , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Jungle Fever (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6kamel , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Kameleon (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6kungfu , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Kung Fu (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6luckla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Lucky Las Vegas (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6magcir , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Magic Circle Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6mavrk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maverick (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6maxod , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maximum Overdrive (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6maxcsh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maximus Cash (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6medal , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Medallion Job (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6megbck , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Mega Bucks (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6monmad , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Money Madness (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6monspd , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Money Spider (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6montlk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Money Talks (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6mono60 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly 60th Anniversary Edition (Jpm) (IMPACT, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6mono60a , j6mono60 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly 60th Anniversary Edition (Jpm) (IMPACT, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6monobn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly Bingo (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6outlaw , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, v3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6outlawd , j6outlaw , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, v3) (Protocol)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6outlawc , j6outlaw , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, Club?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6oxo , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Oxo (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6oxobin , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Oxo Bingo (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pacman , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Pac Man Plus (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6papa , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Paparazzi (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6phxgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Gold (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pnxgd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Gold De Luxe (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pnxmil , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Millennium (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pinwzd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pinball Wizard (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pirgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pirates Gold (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6popoli , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Popeye & Olive (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pog , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Pot Of Gold (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pogcls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pot Of Gold Classic (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pwrlin , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Power Lines (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pwrspn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Powerspin (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6quantm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Quantum Leap (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6quick , 0 , impctawp, tbirds, 0, ROT0, "RAL", "Quicksilver (RAL) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rager , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert (Jpm) [German] (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ra , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6raclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6redarw , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Arrow (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6redarww , j6redarw , impctawp, tbirds, 0, ROT0, "Whitbread / JPM", "Red Arrow (Whitbread / Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6reddmn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Demon (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 2002, j6rh6 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Hot 6 (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rhchil , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Red Hot Chili Stepper (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rh6cl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Hot Six Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6reelmn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Reel Money (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6reelth , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Reel Thing (Ace) (IMPACT, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6reeltha , j6reelth , impctawp, tbirds, 0, ROT0, "Ace", "Reel Thing (Ace) (IMPACT, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6richpk , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Rich Pickings (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rico , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Ricochet (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6robin , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Robin Hood (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6roller , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rccls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster Classic (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6royfls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Royal Flush Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6samur , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Samurai Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6sidewd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Sidewinder (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6snakes , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Snakes & Ladders (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6sonic , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Sonic The Hedgehog (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6spcinv , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Space Invaders (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6stards , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Stardust (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6start , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Starturn (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6strk10 , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Strike 10 (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6supbrk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Super Breakout (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6swpdrp , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Swop Till Ya Drop (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bags , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Three Bags Full (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6roof , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Thru' The Roof (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tbirds , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tbirdsa , j6tbirds , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tbirdsb , j6tbirds , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tbrdcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tomb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Tomb Raider (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6topflg , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Top Flight (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tutti , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Tutti Frutti (Qps) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6twst , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Twister (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6twstd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Twister (Jpm) [Dutch] (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6untch , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Untouchables (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pompay , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Up Pompay (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6vindal , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Vindaloot (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6vivark , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Viva Rock Vegas (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6vivrkc , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Viva Rock Vegas Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6wldkng , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Wild King Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6wthing , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Wild Thing (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6wildw , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Wild West (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6wizard , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Wizard Of Odds (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6knight , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Your Lucky Knight (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6svndb , 0 , impctawp, tbirds, 0, ROT0, "Ace", "7 Deadly Bins (Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ewn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Each Way Nudger (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hikar , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hi Karate (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hisprt , 0 , impctawp, tbirds, 0, ROT0, "Empire", "High Spirits (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6rcclub , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6slvgst , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Silver Ghost (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6footy , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Football Fever (Empire) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6fbcrz , 0 , impctawp, tbirds, j6fbcrz, ROT0, "JPM", "Football Crazy (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6h5clb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "High Five Club (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - - - - -GAME( 199?, j6bbankr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Banker (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bmc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Money Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6bno , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Nite Out (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6btbw , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Born To Be Wild Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cpal , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Crystal", "Caesar's Palace (Whitbread / Crystal) (IMPACT, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cpala , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Crystal", "Caesar's Palace (Whitbread / Crystal) (IMPACT, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // marked as ACE -GAME( 199?, j6cpalb , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Ace", "Caesar's Palace (Whitbread / Ace) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6cdivr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Cash Diver (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ccc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Casino Crazy Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6colic , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Coliseum (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6crakr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Cracker (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ewndg , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Each Way Nudger (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6easy , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Easy Money (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ffc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Frame & Fortune Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6grc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Gold Rush Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6hdc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hot Dogs Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6impls , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Impulse (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6kapang , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Kapang (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6kfc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Kung Fu Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6lucklo , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Lucky Lottery Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6monst , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Monster Cash Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pinfvr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Pinball Fever (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6pinwzdc , j6pinwzd , impctawp, tbirds, 0, ROT0, "Crystal", "Pinball Wizard (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6potg , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Pot Of Gold (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6ramese , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Rameses' Riches Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6r2rum , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Ready To Rumble (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6redal , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Red Alert (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6reelb , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Reel Bingo Classic Club (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6sl , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Snakes & Ladders (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6sla , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Snakes & Ladders Slides Again (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6thril , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Thriller (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6tqust , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Treasure Quest (Crystal) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j6gldpl , 0 , impctawp, tbirds, 0, ROT0, "Qps / Mazooma", "Golden Palace (Qps / Mazooma) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // Mazooma rebuild? only has QPS strings tho -GAME( 199?, j6shoot , 0 , impctawp, tbirds, 0, ROT0, "JPM / Whitbread", "ShootOut (Jpm / Whitbread) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // Mazooma rebuild? only has QPS strings tho +GAME( 199?, j6fifth , 0 , impctawp, tbirds, 0, ROT0, "Ace", "5th Dimension (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6aceclb , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Ace Of Clubs (Crystal) (IMPACT, set 1)", GAME_FLAGS ) +GAME( 199?, j6aceclba , j6aceclb , impctawp, tbirds, 0, ROT0, "Crystal", "Ace Of Clubs (Crystal) (IMPACT, set 2)", GAME_FLAGS ) +GAME( 199?, j6acehi , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Aces High (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6amdrm , 0 , impctawp, tbirds, 0, ROT0, "Mdm", "American Dream (Mdm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6arcade , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Arcadia (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bnkrcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Banker Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6big50 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big 50 (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigbnk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Banker (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigbuk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Bucks (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigcsh , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Big Cash Machine (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigpct , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Big Picture (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigtop , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Top Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bigwhl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Big Wheel (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bnza , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Bonanza (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6brkout , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Breakout (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bucks , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Bucks Fizz (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6buzz , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Buzzundrum (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cpclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Caesar's Palace Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6camelt , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Camelot (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6scarlt , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Captain Scarlet (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshbox , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Cash Box Club (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshbeu , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Cash Box Club (Empire) (Euro) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshbst , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Buster (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshcnt , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Countdown (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshrd , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Cash Raider (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshtwr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Towers (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cshvgs , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cash Vegas Strip (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cas5 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino 5ive Liner (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cascz , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cccla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Classic (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cascla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Classic Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6casclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Crazy Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6caslas , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Casino Las Vegas (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cheque , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cheque Mate (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cluclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cluedo Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6col , 0 , impctawp, tbirds, 0, ROT0, "Mdm", "Coliseum (Mdm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6colcsh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Coliseum Cash (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6colmon , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Colour Of Money (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6coprob , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Cops 'n' Robbers (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6crack , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cracker (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6crzclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Crazy Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6crsfir , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Cross Fire (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6daygld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Daytona Gold (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6dayml , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Daytona Millennium (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6dmnjkr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Demon Jokers (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6dmngz , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Diamond Geezer (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6dyfl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Do You Feel Lucky (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6drdogh , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Dr Dough (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6euphor , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Euphoria (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fastfr , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Fast Fruits Club (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fasttk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Fast Trak (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6filth , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Filthy Rich Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6firbl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Fireball (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fireck , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Firecracker (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6firclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Firecracker Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fivalv , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Five Alive Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fiveln , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Five Liner (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6frc10 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Force 10 (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6framft , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Frame & Fortune Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6frtmch , 0 , impctawp, tbirds, 0, ROT0, "JPM", "The Fruit Machine (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6frtpot , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Fruitpots (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gforce , 0 , impctawp, tbirds, 0, ROT0, "JPM", "G Force (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gforceb , j6gforce , impctawp, tbirds, 0, ROT0, "JPM", "G Force (Jpm) (IMPACT) (15GBP Jackpot)", GAME_FLAGS ) +GAME( 199?, j6gidogh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "G.I. Dough (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6guab , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Give Us A Break (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6guabcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Give Us A Break Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gldclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Gladiator Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gogold , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Go For Gold (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gldmin , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Gold Mine (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gldday , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Day (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6golddm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Demons (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6goldgl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Golden Goal (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hapyhr , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Happy Hour (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hifly , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hi Flyer (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6impact , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Impact (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6impactb , j6impact , impctawp, tbirds, 0, ROT0, "JPM", "Hi Impact (Jpm) (IMPACT) (15GBP Jackpot)", GAME_FLAGS ) +GAME( 199?, j6hilosv , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Lo Silver (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hirol , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Roller (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hirlcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Hi Roller Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6histk , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Hi Stakes (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hiphop , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Hip Hopper (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hotsht , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Hot Shot (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6impuls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Impulse (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6indy , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Indiana Jones (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6showtm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "It's Showtime (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jackjs , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Jackpot Justice (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jkrgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Gold (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jkrpls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Plus (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jkpldx , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Plus Deluxe (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jkwld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Jokers Wild (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6jungfv , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Jungle Fever (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6kamel , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Kameleon (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6kungfu , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Kung Fu (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6luckla , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Lucky Las Vegas (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6magcir , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Magic Circle Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6mavrk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maverick (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6maxod , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maximum Overdrive (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6maxcsh , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Maximus Cash (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6medal , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Medallion Job (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6megbck , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Mega Bucks (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6monmad , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Money Madness (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6monspd , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Money Spider (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6montlk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Money Talks (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6mono60 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly 60th Anniversary Edition (Jpm) (IMPACT, set 1)", GAME_FLAGS ) +GAME( 199?, j6mono60a , j6mono60 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly 60th Anniversary Edition (Jpm) (IMPACT, set 2)", GAME_FLAGS ) +GAME( 199?, j6monobn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Monopoly Bingo (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6outlaw , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, v3)", GAME_FLAGS ) +GAME( 199?, j6outlawd , j6outlaw , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, v3) (Protocol)", GAME_FLAGS ) +GAME( 199?, j6outlawc , j6outlaw , impctawp, tbirds, 0, ROT0, "JPM", "Outlaw (Jpm) (IMPACT, Club?)", GAME_FLAGS ) +GAME( 199?, j6oxo , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Oxo (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6oxobin , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Oxo Bingo (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pacman , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Pac Man Plus (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6papa , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Paparazzi (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6phxgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Gold (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pnxgd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Gold De Luxe (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pnxmil , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Phoenix Millennium (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pinwzd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pinball Wizard (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pirgld , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pirates Gold (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6popoli , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Popeye & Olive (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pog , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Pot Of Gold (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pogcls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Pot Of Gold Classic (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pwrlin , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Power Lines (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pwrspn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Powerspin (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6quantm , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Quantum Leap (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6quick , 0 , impctawp, tbirds, 0, ROT0, "RAL", "Quicksilver (RAL) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rager , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert (Jpm) [German] (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ra , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6raclb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Alert Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6redarw , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Arrow (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6redarww , j6redarw , impctawp, tbirds, 0, ROT0, "Whitbread / JPM", "Red Arrow (Whitbread / Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6reddmn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Demon (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 2002, j6rh6 , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Hot 6 (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rhchil , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Red Hot Chili Stepper (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rh6cl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Red Hot Six Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6reelmn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Reel Money (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6reelth , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Reel Thing (Ace) (IMPACT, set 1)", GAME_FLAGS ) +GAME( 199?, j6reeltha , j6reelth , impctawp, tbirds, 0, ROT0, "Ace", "Reel Thing (Ace) (IMPACT, set 2)", GAME_FLAGS ) +GAME( 199?, j6richpk , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Rich Pickings (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rico , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Ricochet (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6robin , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Robin Hood (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6roller , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rccls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster Classic (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6royfls , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Royal Flush Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6samur , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Samurai Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6sidewd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Sidewinder (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6snakes , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Snakes & Ladders (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6sonic , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Sonic The Hedgehog (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6spcinv , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Space Invaders (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6stards , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Stardust (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6start , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Starturn (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6strk10 , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Strike 10 (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6supbrk , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Super Breakout (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6swpdrp , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Swop Till Ya Drop (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bags , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Three Bags Full (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6roof , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Thru' The Roof (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6tbirds , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 1)", GAME_FLAGS ) +GAME( 199?, j6tbirdsa , j6tbirds , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 2)", GAME_FLAGS ) +GAME( 199?, j6tbirdsb , j6tbirds , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds (Jpm) (IMPACT, set 3)", GAME_FLAGS ) +GAME( 199?, j6tbrdcl , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Thunderbirds Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6tomb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Tomb Raider (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6topflg , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Top Flight (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6tutti , 0 , impctawp, tbirds, 0, ROT0, "Qps", "Tutti Frutti (Qps) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6twst , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Twister (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6twstd , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Twister (Jpm) [Dutch] (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6untch , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Untouchables (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pompay , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Up Pompay (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6vindal , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Vindaloot (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6vivark , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Viva Rock Vegas (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6vivrkc , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Viva Rock Vegas Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6wldkng , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Wild King Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6wthing , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Wild Thing (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6wildw , 0 , impctawp, tbirds, 0, ROT0, "Ace", "Wild West (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6wizard , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Wizard Of Odds (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6knight , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Your Lucky Knight (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6svndb , 0 , impctawp, tbirds, 0, ROT0, "Ace", "7 Deadly Bins (Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ewn , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Each Way Nudger (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hikar , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hi Karate (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hisprt , 0 , impctawp, tbirds, 0, ROT0, "Empire", "High Spirits (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6rcclub , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Roller Coaster Club (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6slvgst , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Silver Ghost (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6footy , 0 , impctawp, tbirds, 0, ROT0, "Empire", "Football Fever (Empire) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6fbcrz , 0 , impctawp, tbirds, j6fbcrz, ROT0, "JPM", "Football Crazy (Jpm) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6h5clb , 0 , impctawp, tbirds, 0, ROT0, "JPM", "High Five Club (Jpm) (IMPACT)", GAME_FLAGS ) + + + + +GAME( 199?, j6bbankr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Banker (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bmc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Money Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6bno , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Big Nite Out (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6btbw , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Born To Be Wild Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cpal , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Crystal", "Caesar's Palace (Whitbread / Crystal) (IMPACT, set 1)", GAME_FLAGS ) +GAME( 199?, j6cpala , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Crystal", "Caesar's Palace (Whitbread / Crystal) (IMPACT, set 2)", GAME_FLAGS ) // marked as ACE +GAME( 1998, j6cpalb , 0 , impctawp, tbirds, 0, ROT0, "Whitbread / Ace", "Caesar's Palace (Whitbread / Ace) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6cdivr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Cash Diver (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ccc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Casino Crazy Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6colic , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Coliseum (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6crakr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Cracker (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ewndg , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Each Way Nudger (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6easy , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Easy Money (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ffc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Frame & Fortune Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6grc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Gold Rush Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6hdc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Hot Dogs Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6impls , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Impulse (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6kapang , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Kapang (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6kfc , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Kung Fu Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6lucklo , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Lucky Lottery Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6monst , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Monster Cash Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pinfvr , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Pinball Fever (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6pinwzdc , j6pinwzd , impctawp, tbirds, 0, ROT0, "Crystal", "Pinball Wizard (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6potg , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Pot Of Gold (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6ramese , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Rameses' Riches Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6r2rum , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Ready To Rumble (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6redal , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Red Alert (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6reelb , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Reel Bingo Classic Club (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6sl , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Snakes & Ladders (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6sla , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Snakes & Ladders Slides Again (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6thril , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Thriller (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6tqust , 0 , impctawp, tbirds, 0, ROT0, "Crystal", "Treasure Quest (Crystal) (IMPACT)", GAME_FLAGS ) +GAME( 199?, j6gldpl , 0 , impctawp, tbirds, 0, ROT0, "Qps / Mazooma", "Golden Palace (Qps / Mazooma) (IMPACT)", GAME_FLAGS ) // Mazooma rebuild? only has QPS strings tho +GAME( 199?, j6shoot , 0 , impctawp, tbirds, 0, ROT0, "JPM / Whitbread", "ShootOut (Jpm / Whitbread) (IMPACT)", GAME_FLAGS ) // Mazooma rebuild? only has QPS strings tho // was marked as SWP, should this be a video game? - Apparently it's just a link box using the same hardware, but for 3 PC based units which aren't dumped, and probably can't really be emulated :-/ -GAME( 199?, j6milln , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Millionaire (Jpm) (IMPACT)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - - - - - - - - - - +GAME( 199?, j6milln , 0 , impctawp, tbirds, 0, ROT0, "JPM", "Millionaire (Jpm) (IMPACT)", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/jpmmps.c mame-0.145/src/mame/drivers/jpmmps.c --- mame-0.144/src/mame/drivers/jpmmps.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jpmmps.c 2012-02-06 21:30:41.000000000 +0000 @@ -21,6 +21,8 @@ what appear to be i8255 issues? */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/tms9900/tms9900.h" #include "sound/sn76496.h" @@ -30,23 +32,29 @@ { public: jpmmps_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( jpmmps_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jpmmps_map, AS_PROGRAM, 8, jpmmps_state ) AM_RANGE(0x0000, 0xbfff) AM_ROM - AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE_MODERN("ppi8255_ic26", i8255_device, read, write) - AM_RANGE(0xc004, 0xc007) AM_DEVREADWRITE_MODERN("ppi8255_ic21", i8255_device, read, write) - AM_RANGE(0xc008, 0xc00b) AM_DEVREADWRITE_MODERN("ppi8255_ic22", i8255_device, read, write) - AM_RANGE(0xc00c, 0xc00f) AM_DEVREADWRITE_MODERN("ppi8255_ic25", i8255_device, read, write) + AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("ppi8255_ic26", i8255_device, read, write) + AM_RANGE(0xc004, 0xc007) AM_DEVREADWRITE("ppi8255_ic21", i8255_device, read, write) + AM_RANGE(0xc008, 0xc00b) AM_DEVREADWRITE("ppi8255_ic22", i8255_device, read, write) + AM_RANGE(0xc00c, 0xc00f) AM_DEVREADWRITE("ppi8255_ic25", i8255_device, read, write) AM_RANGE(0xe800, 0xefff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( jpmmps_io_map, AS_IO, 8 ) +static ADDRESS_MAP_START( jpmmps_io_map, AS_IO, 8, jpmmps_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) - ADDRESS_MAP_END @@ -119,7 +127,6 @@ DRIVER_INIT( jpmmps ) { - } @@ -1979,200 +1986,200 @@ -GAME(198?, j2adnote ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnotea,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnoteb,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnotec,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnoted,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnotee,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnotef,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnoteg,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnoteh,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2adnotei,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 10)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bankch ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bank Chase (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bigbnk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Banker (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bigbox ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Box (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bigbuk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Buck$ (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bigdl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Deal (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2blkchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Black Cherry (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashbn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Bonus Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashfl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Falls (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashrl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Reels (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashrv ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Reserve (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashro ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Rolls (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashtk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Track (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashtd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Track Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2coppot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Copper Pot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2coprun ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Copper Run (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2crkbnk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Crack The Bank (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2droplt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Drop The Lot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2dropld ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Drop The Lot Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2ewn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Each Way Nudger (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2ews ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Each Way Shuffle (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2exec ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Executive Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fasttk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Fast Trak (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fqueen ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Find The Queen (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fiveal ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Alive (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fiveln ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Liner (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fws ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Way Shuffle (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2frmtch ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Fruit Match (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fullhs ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Full House Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2ghostb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Ghostbuster (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2goldrn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Gold Run (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2goldbr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Bars (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2gldchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Cherry (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2gldwin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Win (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hinote ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hi Note (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hiroll ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hi Roller (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hotpot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Pot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hotptd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Pot Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hotsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Shot Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hypnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hypernote (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2jackbr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jackpot Bars (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2jackdc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jackpot Dice (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2jokers ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jokers (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2kingcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","King Of Clubs (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2litean ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Lite A Nudge (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2lovsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Loot Shoot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2lovshd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Loot Shoot Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2lucky2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Lucky 2s (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2monblt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Belt (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2mongam ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Game (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2mongmd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Game Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2multwn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Multi Win (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2notexc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Note Exchange (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2notesh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Note Shoot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudbnz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Bonanza Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nuddup ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nuddud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudup3 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up MkIII (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudshf ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Shuffler (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2plsmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Money (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2plsmnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Money Deluxe (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2plsnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Nudge (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2potlck ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pot Luck (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2pndrsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pound Rush (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2pyramd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pyramid (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelbn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Bingo Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelbo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Bonus (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelmg ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelmgd,j2reelmg ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic (Jpm) [Dutch] (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelmc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelmo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Money (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2rotnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Rota Note (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2roulcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Roulette Club (Jpm) [Mps] (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2rdclb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Royal Deal Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2slvrgh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Silver Ghost (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2spcrsv ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Special Reserve (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2stahed ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Streets Ahead (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supfrt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Fruit (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supfrc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Fruit Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(1987, j2supsft ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supashifta (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supstp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Steppa (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2suptrk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Track (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2suprft ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Fruit (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supln ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Line (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2suppot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Pots (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2suprl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Reel (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2suprsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supershot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supstr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Superstars (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2swbank ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Switch Back (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2take2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Take 2 (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2topsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Top Shot (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2westrn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Western (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - - -GAME(198?, j2blustr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Blue Streak (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cshalm ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Alarm (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cshcrd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Cards (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cshfil ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash-Filla (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cshsmh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Smash (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2criscr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Criss Cross Jackpot (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2frucnx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Fruit Connexion (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hitmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Hit Money (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2penny ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","In For A Penny In For A Pound (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2maxima ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Maxima (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2montrp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Money Trapper (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Nudge Money (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2paypkt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Pay Packet (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2silvcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Silver Classic (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2silvsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Silver Shot (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2sstrea ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Supa Streak (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2tstplt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Test Pilot (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2bonanz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Eurocoin","Bonanza (Eurocoin) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2supchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Eurocoin","Super Cherry (Eurocoin) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2hilocl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Hi Lo Climber Club (Crystal) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2litnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Lite A Note Club (Crystal) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2missis ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Mississippi Gambler Club (Crystal) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2always ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Always Eight (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2coinsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Coin Shoot (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudfev ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Nudge Fever (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2trail ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Trailblazer (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2wag ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Win-A-Gain (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2cshnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Cash Nudger (Mdm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2fivepn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Fivepenny Nudger (Mdm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nolimt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","No Limit Nudge (Mdm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2strk10 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Ace?","Strike Ten (Ace) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // there was another (68k based) game in this set, which makes me wonder if this one is by Ace at all - - - - -GAME(198?, j2bkroll ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bank Roll (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2bodym ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Body Match (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cvault ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Vault (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashab ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cashablanca (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2cashry ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cashino Royale (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2casino ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Casino Classic (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2coinct ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Coin Count (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2loots ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Loot Shoot (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2match ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Match It (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2monbnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Bands (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2monmtx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Money Matrix (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2tst ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","MPS 1 Test Rom (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nudnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Nudge (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2pinac ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pinnacle (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2pinclb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pinnacle Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reelcz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Crazy (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2reeldc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Deal Club (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2topcd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Top Card (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2xxx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Triple X (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2tupnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Tuppenny Nudger (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2wrb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Wild Reel Bingo (Jpm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2ncsp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","unknown 'ncsp0pp' (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nrrp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","unknown 'nprpopp' (Bwb) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nsc15 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","unknown 'nsc15' (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nsw12 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","unknown 'nsw12' (Pcp) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2club77 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Club 77 (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2contnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Continuous Nudger (Mdm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2crown ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Crown Dealer (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2hirola ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Hi Roll (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2monmin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Money Mine (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2notspn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Note Spinner (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2super7 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Super 7's (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2sex ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Super Exchanger (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2sng ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Cotswold Microsystems","Super Nudge Gambler (Cotswold Microsystems) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2tupnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Tuppenny Nudger (Mdm) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2008 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown '008' (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2chsn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'chsnsn05' (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2lhs ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'lhs' (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nn2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'nn_2' (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2rm941 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'rm941' (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2pharo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Pharoah (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME(198?, j2nud5p ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","5p Nudger (JPM) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2b7 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bar 7? (JPM) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2ss ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Stepper (JPM) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2nbz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Bonanza (JPM) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j2adnote ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnotea,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnoteb,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnotec,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnoted,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnotee,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnotef,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 7)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnoteg,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 8)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnoteh,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 9)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2adnotei,j2adnote ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Add A Note (Jpm) (MPS, set 10)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bankch ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bank Chase (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bigbnk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Banker (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bigbox ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Box (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bigbuk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Buck$ (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bigdl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Big Deal (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2blkchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Black Cherry (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashbn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Bonus Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashfl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Falls (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashrl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Reels (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashrv ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Reserve (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashro ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Rolls (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashtk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Track (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashtd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Track Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2coppot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Copper Pot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2coprun ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Copper Run (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2crkbnk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Crack The Bank (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2droplt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Drop The Lot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2dropld ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Drop The Lot Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2ewn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Each Way Nudger (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2ews ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Each Way Shuffle (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2exec ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Executive Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fasttk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Fast Trak (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fqueen ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Find The Queen (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fiveal ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Alive (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fiveln ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Liner (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fws ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Five Way Shuffle (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2frmtch ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Fruit Match (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fullhs ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Full House Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2ghostb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Ghostbuster (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2goldrn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Gold Run (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2goldbr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Bars (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2gldchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Cherry (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2gldwin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Golden Win (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hinote ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hi Note (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hiroll ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hi Roller (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hotpot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Pot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hotptd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Pot Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hotsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hot Shot Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hypnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Hypernote (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2jackbr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jackpot Bars (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2jackdc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jackpot Dice (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2jokers ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Jokers (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2kingcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","King Of Clubs (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2litean ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Lite A Nudge (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2lovsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Loot Shoot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2lovshd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Loot Shoot Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2lucky2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Lucky 2s (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2monblt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Belt (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2mongam ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Game (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2mongmd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Game Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2multwn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Multi Win (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2notexc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Note Exchange (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2notesh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Note Shoot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudbnz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Bonanza Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nuddup ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nuddud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudup3 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Double Up MkIII (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudshf ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Shuffler (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2plsmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Money (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2plsmnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Money Deluxe (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2plsnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Plus Nudge (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2potlck ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pot Luck (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2pndrsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pound Rush (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2pyramd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pyramid (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelbn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Bingo Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelbo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Bonus (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelmg ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelmgd,j2reelmg ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic (Jpm) [Dutch] (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelmc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Magic Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelmo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Money (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2rotnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Rota Note (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2roulcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Roulette Club (Jpm) [Mps] (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2rdclb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Royal Deal Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2slvrgh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Silver Ghost (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2spcrsv ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Special Reserve (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2stahed ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Streets Ahead (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supfrt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Fruit (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supfrc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Fruit Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(1987, j2supsft ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supashifta (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supstp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Steppa (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2suptrk ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Track (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2suprft ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Fruit (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supln ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Line (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2suppot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Pots (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2suprl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Super Reel (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2suprsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supershot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supstr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Superstars (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2swbank ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Switch Back (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2take2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Take 2 (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2topsht ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Top Shot (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2westrn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Western (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + + +GAME(198?, j2blustr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Blue Streak (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cshalm ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Alarm (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cshcrd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Cards (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cshfil ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash-Filla (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cshsmh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cash Smash (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2criscr ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Criss Cross Jackpot (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2frucnx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Fruit Connexion (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hitmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Hit Money (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2penny ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","In For A Penny In For A Pound (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2maxima ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Maxima (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2montrp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Money Trapper (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudmon ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Nudge Money (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2paypkt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Pay Packet (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2silvcl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Silver Classic (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2silvsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Silver Shot (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2sstrea ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Supa Streak (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2tstplt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Test Pilot (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2bonanz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Eurocoin","Bonanza (Eurocoin) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2supchy ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Eurocoin","Super Cherry (Eurocoin) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2hilocl ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Hi Lo Climber Club (Crystal) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2litnot ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Lite A Note Club (Crystal) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2missis ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal","Mississippi Gambler Club (Crystal) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2always ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Always Eight (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2coinsh ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Coin Shoot (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudfev ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Nudge Fever (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2trail ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Trailblazer (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2wag ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Win-A-Gain (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2cshnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Cash Nudger (Mdm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2fivepn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Fivepenny Nudger (Mdm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nolimt ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","No Limit Nudge (Mdm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2strk10 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Ace?","Strike Ten (Ace) (MPS)", GAME_IS_SKELETON_MECHANICAL ) // there was another (68k based) game in this set, which makes me wonder if this one is by Ace at all + + + + +GAME(198?, j2bkroll ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bank Roll (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2bodym ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Body Match (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cvault ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cash Vault (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashab ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Cashablanca (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2cashry ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Cashino Royale (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2casino ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Casino Classic (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2coinct ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Coin Count (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2loots ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","Loot Shoot (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2match ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Match It (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2monbnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Money Bands (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2monmtx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Money Matrix (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2tst ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","MPS 1 Test Rom (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nudnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Nudge (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2pinac ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pinnacle (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2pinclb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Pinnacle Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reelcz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Crazy (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2reeldc ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Reel Deal Club (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2topcd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Top Card (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2xxx ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","Triple X (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2tupnud ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Tuppenny Nudger (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2wrb ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Wild Reel Bingo (Jpm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2ncsp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","unknown 'ncsp0pp' (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nrrp ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Bwb","unknown 'nprpopp' (Bwb) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nsc15 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","unknown 'nsc15' (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nsw12 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Pcp","unknown 'nsw12' (Pcp) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2club77 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Club 77 (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2contnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Continuous Nudger (Mdm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2crown ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Crown Dealer (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2hirola ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Hi Roll (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2monmin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Money Mine (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2notspn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Note Spinner (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2super7 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Super 7's (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2sex ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Super Exchanger (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2sng ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Cotswold Microsystems","Super Nudge Gambler (Cotswold Microsystems) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2tupnd ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Mdm","Tuppenny Nudger (Mdm) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2008 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown '008' (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2chsn ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'chsnsn05' (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2lhs ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'lhs' (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nn2 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'nn_2' (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2rm941 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","unknown 'rm941' (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2pharo ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Pharoah (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) + +GAME(198?, j2nud5p ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","5p Nudger (JPM) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2b7 ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Bar 7? (JPM) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2ss ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Supa Stepper (JPM) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2nbz ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Jpm","Nudge Bonanza (JPM) (MPS)", GAME_IS_SKELETON_MECHANICAL ) -GAME(198?, j2clbbin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal?","Club Bingo (Crystal) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j2clbbin ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Crystal?","Club Bingo (Crystal) (MPS)", GAME_IS_SKELETON_MECHANICAL ) -GAME(198?, j2sirich ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Maygay?","Strike It Rich (Maygay?) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // I don't think this is MayGay, it was just in a MayGay set with some actual MayGay roms +GAME(198?, j2sirich ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "Maygay?","Strike It Rich (Maygay?) (MPS)", GAME_IS_SKELETON_MECHANICAL ) // I don't think this is MayGay, it was just in a MayGay set with some actual MayGay roms -GAME(198?, j2hcash ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Hot Cash (Unk) (MPS)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j2sset ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Sunset Strip (v2.0) (Unk) (MPS?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j2hcash ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Hot Cash (Unk) (MPS)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j2sset ,0 ,jpmmps,jpmmps,jpmmps,ROT0, "","Sunset Strip (v2.0) (Unk) (MPS?)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/jpms80.c mame-0.145/src/mame/drivers/jpms80.c --- mame-0.144/src/mame/drivers/jpms80.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jpms80.c 2012-02-06 21:30:41.000000000 +0000 @@ -16,6 +16,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/tms9900/tms9900.h" #include "sound/ay8910.h" @@ -24,15 +26,22 @@ { public: jpms80_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( jpms80_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jpms80_map, AS_PROGRAM, 8, jpms80_state ) AM_RANGE(0x0000, 0x2fff) AM_ROM AM_RANGE(0x3000, 0x3fff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( jpms80_io_map, AS_IO, 8 ) +static ADDRESS_MAP_START( jpms80_io_map, AS_IO, 8, jpms80_state ) ADDRESS_MAP_END @@ -57,7 +66,6 @@ #define SOUND_CLOCK 2000000 static MACHINE_CONFIG_START( jpms80, jpms80_state ) - /* basic machine hardware */ MCFG_CPU_ADD("maincpu", TMS9995, MAIN_CLOCK) MCFG_CPU_PROGRAM_MAP(jpms80_map) @@ -68,16 +76,15 @@ MCFG_SOUND_ADD("aysnd", AY8910, 2000000) MCFG_SOUND_CONFIG(ay8910_interface_jpm) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) - MACHINE_CONFIG_END -static ADDRESS_MAP_START( jpms_older_e00_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jpms_older_e00_map, AS_PROGRAM, 8, jpms80_state ) AM_RANGE(0x0000, 0x0bff) AM_ROM AM_RANGE(0x0e00, 0x0eff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( jpms_older_e00_io, AS_IO, 8 ) +static ADDRESS_MAP_START( jpms_older_e00_io, AS_IO, 8, jpms80_state ) ADDRESS_MAP_END @@ -87,12 +94,12 @@ MCFG_CPU_IO_MAP(jpms_older_e00_io) MACHINE_CONFIG_END -static ADDRESS_MAP_START( jpms_older_c00_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( jpms_older_c00_map, AS_PROGRAM, 8, jpms80_state ) AM_RANGE(0x0000, 0x0bff) AM_ROM AM_RANGE(0x0c00, 0x0eff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( jpms_older_c00_io, AS_IO, 8 ) +static ADDRESS_MAP_START( jpms_older_c00_io, AS_IO, 8, jpms80_state ) ADDRESS_MAP_END @@ -105,13 +112,10 @@ DRIVER_INIT( jpms80 ) { - } - - ROM_START( j80bac ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "bankacoinp1.bin", 0x0000, 0x1000, CRC(7b82025b) SHA1(f698688c55f8c5dc891e470de8df2eb12f6b1ec5) ) @@ -290,28 +294,28 @@ -GAME(198?, j80bac ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Bank A Coin (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80bounc ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Bouncer (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80frogh ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Frog Hop (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80fruit ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Fruit Snappa (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80golds ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Golden Steppa (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80hotln ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Hot Lines (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80myspn ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Mystery Spin (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80nudg2 ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Nudge Double Up MkII (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80rr ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Road Runner (Jpm) (SYSTEM80, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80rra ,j80rr ,jpms80,jpms80,jpms80,ROT0, "Jpm","Road Runner (Jpm) (SYSTEM80, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80r66 ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Route 66 (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80supst ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Supa Steppa (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80supbk ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Superbank (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80topsp ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Top Sprint (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80topup ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Top Up (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80tumbl ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Tumble (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80wsprt ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Winsprint (Jpm) (SYSTEM80)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j80bac ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Bank A Coin (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80bounc ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Bouncer (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80frogh ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Frog Hop (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80fruit ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Fruit Snappa (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80golds ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Golden Steppa (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80hotln ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Hot Lines (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80myspn ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Mystery Spin (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80nudg2 ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Nudge Double Up MkII (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80rr ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Road Runner (Jpm) (SYSTEM80, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80rra ,j80rr ,jpms80,jpms80,jpms80,ROT0, "Jpm","Road Runner (Jpm) (SYSTEM80, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80r66 ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Route 66 (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80supst ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Supa Steppa (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80supbk ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Superbank (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80topsp ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Top Sprint (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80topup ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Top Up (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80tumbl ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Tumble (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80wsprt ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Winsprint (Jpm) (SYSTEM80)", GAME_IS_SKELETON_MECHANICAL ) // these look like they're probably SYSTEM80, not 100% sure tho -GAME(198?, j80alad ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Aladdin's Cave (PCP)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80fortr ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Fortune Trail (Jpm)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80mster ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Masterspy (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j80plsnd ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Plus Nudge (Jpm)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j80alad ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Aladdin's Cave (PCP)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80fortr ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Fortune Trail (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80mster ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Masterspy (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j80plsnd ,0 ,jpms80,jpms80,jpms80,ROT0, "Jpm","Plus Nudge (Jpm)", GAME_IS_SKELETON_MECHANICAL ) /* Not 100% sure what the stuff below is on, the profiles don't quite match System 85 */ @@ -362,10 +366,10 @@ -GAME(198?, j_ewnud ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "Barcrest?","Each Way Nudger (Barcrest?, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j_ewnda ,j_ewnud ,jpms_older_e00,jpms80,jpms80,ROT0, "Barcrest?","Each Way Nudger (Barcrest?, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j_luckac ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "","Lucky Aces (Unk)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME(198?, j_super2 ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "Jpm","Super 2 (Jpm)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j_ewnud ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "Barcrest?","Each Way Nudger (Barcrest?, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j_ewnda ,j_ewnud ,jpms_older_e00,jpms80,jpms80,ROT0, "Barcrest?","Each Way Nudger (Barcrest?, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j_luckac ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "","Lucky Aces (Unk)", GAME_IS_SKELETON_MECHANICAL ) +GAME(198?, j_super2 ,0 ,jpms_older_e00,jpms80,jpms80,ROT0, "Jpm","Super 2 (Jpm)", GAME_IS_SKELETON_MECHANICAL ) // this one is different again? -GAME(198?, j_plus2 ,0 ,jpms_older_c00,jpms80,jpms80,ROT0, "Jpm","Plus 2 (Jpm)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(198?, j_plus2 ,0 ,jpms_older_c00,jpms80,jpms80,ROT0, "Jpm","Plus 2 (Jpm)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/jpmsys5.c mame-0.145/src/mame/drivers/jpmsys5.c --- mame-0.144/src/mame/drivers/jpmsys5.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jpmsys5.c 2012-02-06 21:30:42.000000000 +0000 @@ -190,7 +190,7 @@ tms34061_start(machine, &tms34061intf); } -static SCREEN_UPDATE( jpmsys5v ) +static SCREEN_UPDATE_RGB32( jpmsys5v ) { int x, y; struct tms34061_display state; @@ -199,22 +199,22 @@ if (state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT8 *src = &state.vram[(state.dispstart & 0xffff)*2 + 256 * y]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, cliprect->min_x); + UINT32 *dest = &bitmap.pix32(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x +=2) + for (x = cliprect.min_x; x <= cliprect.max_x; x +=2) { - UINT8 pen = src[(x-cliprect->min_x)>>1]; + UINT8 pen = src[(x-cliprect.min_x)>>1]; /* Draw two 4-bit pixels */ - *dest++ = screen->machine().pens[(pen >> 4) & 0xf]; - *dest++ = screen->machine().pens[pen & 0xf]; + *dest++ = screen.machine().pens[(pen >> 4) & 0xf]; + *dest++ = screen.machine().pens[pen & 0xf]; } } @@ -670,9 +670,8 @@ MCFG_MACHINE_RESET(jpmsys5v) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_40MHz / 4, 676, 20*4, 147*4, 256, 0, 254) - MCFG_SCREEN_UPDATE(jpmsys5v) + MCFG_SCREEN_UPDATE_STATIC(jpmsys5v) MCFG_VIDEO_START(jpmsys5v) @@ -2300,182 +2299,174 @@ GAME( 1994, monopolya , monopoly , jpmsys5v, monopoly, 0, ROT0, "JPM", "Monopoly (Jpm) (SYSTEM5 VIDEO, set 2)", 0 ) GAME( 1995, monoplcl , monopoly , jpmsys5v, monopoly, 0, ROT0, "JPM", "Monopoly Classic (Jpm) (SYSTEM5 VIDEO)", 0 ) GAME( 1995, monopldx , 0 , jpmsys5v, monopoly, 0, ROT0, "JPM", "Monopoly Deluxe (Jpm) (SYSTEM5 VIDEO)", 0 ) -GAME( 199?, cashcade , 0 , jpmsys5v, monopoly, 0, ROT0, "JPM", "Cashcade (Jpm) (SYSTEM5 VIDEO)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // shows a loading error.. is the set incomplete? - -/* Non-Video */ -GAME( 199?, j5tstal , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Alpha Display Test Utility (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5tst1 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Test Set (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5tst2 , j5tst1 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Test Set (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME( 199?, j5fifth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "5th Avenue (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // This was also listed as by 'Crystal'. There was Crystal ROM in the set, but it wasn't an JPM SYS5 rom... -GAME( 199?, j5ar80a , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80b , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80c , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80d , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80cl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80cla , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80clb , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ar80clc , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5buc , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Buccaneer (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5cir , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5cira , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5cirb , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5circ , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5cird , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5clbnud , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Club Nudger (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5clbnuda , j5clbnud , jpmsys5, popeye, 0, ROT0, "JPM", "Club Nudger (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5daytn , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5daytna , j5daytn , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5daycls , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona Classic (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5dayclsa , j5daycls , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona Classic (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5dirty , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5dirtya , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5dirtyb , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5dirtyc , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairgd , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // or just 'Fairground' ? -GAME( 199?, j5fairgda , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairgdb , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairgdc , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairgdd , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairgde , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fair , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5faira , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairb , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairc , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5faird , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5faire , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairf , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairg , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairh , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairi , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 10)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairj , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 11)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairk , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 12)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairl , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 13)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairm , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 14)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairn , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 15)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairo , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 16)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairp , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 17)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fairq , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 18)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filtha , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthb , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthc , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthd , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthe , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthf , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthg , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthh , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthi , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 10)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5filthj , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 11)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5firebl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5firebla , j5firebl , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5fireblb , j5firebl , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5frmag , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fruit Magic (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5goldbr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Golden Bars (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagar , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagara , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarb , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarc , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagard , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagare , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarf , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarg , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarh , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagari , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 10)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagarj , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 11)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagsho , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagshoa , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagshob , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hagshoc , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5holly , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hollya , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hollyb , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hollyc , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hollyd , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hollye , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hotdog , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hot Dogs (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hotdoga , j5hotdog , jpmsys5, popeye, 0, ROT0, "JPM", "Hot Dogs (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5indsum , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Indian Summer (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5indy , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Indy 500 (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5intr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5intra , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5intrb , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5intrc , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgld , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokglda , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldb , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldc , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldd , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokglde , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldf , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldg , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5jokgldh , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5nite , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Nite Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5nitea , j5nite , jpmsys5, popeye, 0, ROT0, "JPM", "Nite Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5palm , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Palm Springs (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5palma , j5palm , jpmsys5, popeye, 0, ROT0, "JPM", "Palm Springs (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5phnx , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Phoenix (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5phnxa , j5phnx , jpmsys5, popeye, 0, ROT0, "JPM", "Phoenix (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeye , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // (20p/8 GBP Token) ? -GAME( 199?, j5popeyea , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyeb , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyec , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyed , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyee , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyef , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyeg , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyeh , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 9)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popeyei , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 10)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5poptha , j5popth , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popthb , j5popth , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popprz , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Prize Popeye Vending (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5popprza , j5popprz , jpmsys5, popeye, 0, ROT0, "JPM", "Prize Popeye Vending (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5reelgh , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Reel Ghost (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5roul , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5roulcl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5roulcla , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5roulclb , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5roulclc , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5slvree , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Reels (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5slvreea , j5slvree , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Reels (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5slvstr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5slvstra , j5slvstr , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5slvstrb , j5slvstr , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5street , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Streetwise (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5sup4 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super 4 (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5supbar , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super Bars (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5supbara , j5supbar , jpmsys5, popeye, 0, ROT0, "JPM", "Super Bars (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5suphi , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super Hi-Lo (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5swop , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Swop A Fruit Club (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5term , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Terminator (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5topshp , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Top Of The Shop Club (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5trail , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5traila , j5trail , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5trailb , j5trail , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5td , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Tumbling Dice (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5uj , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5uja , j5uj , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5ujb , j5uj , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5wsc , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Wall Street Club (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5wsca , j5wsc , jpmsys5, popeye, 0, ROT0, "JPM", "Wall Street Club (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - -GAME( 199?, j5movie , 0 , jpmsys5, popeye, 0, ROT0, "Crystal", "Movie Magic Club (Crystal) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) // apparently by Crystal - -GAME( 199?, j5nudfic , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Nudge Fiction (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5revo , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Revolver (Jpm) (SYSTEM5, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5revoa , j5revo , jpmsys5, popeye, 0, ROT0, "JPM", "Revolver (Jpm) (SYSTEM5, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5sizl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Sizzling (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, j5hilos , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hi Lo Silver (Jpm) (SYSTEM5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) - - - - - - - - +GAME( 199?, cashcade , 0 , jpmsys5v, monopoly, 0, ROT0, "JPM", "Cashcade (Jpm) (SYSTEM5 VIDEO)", GAME_NOT_WORKING|GAME_NO_SOUND ) // shows a loading error.. is the set incomplete? +#define GAME_FLAGS GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND +/* Non-Video */ +GAME( 199?, j5tstal , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Alpha Display Test Utility (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5tst1 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Test Set (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5tst2 , j5tst1 , jpmsys5, popeye, 0, ROT0, "JPM", "JPM System 5 Test Set (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) + +GAME( 199?, j5fifth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "5th Avenue (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5ar80 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) // This was also listed as by 'Crystal'. There was Crystal ROM in the set, but it wasn't an JPM SYS5 rom... +GAME( 199?, j5ar80a , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5ar80b , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5ar80c , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5ar80d , j5ar80 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World In Eighty Days (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5ar80cl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5ar80cla , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5ar80clb , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5ar80clc , j5ar80cl , jpmsys5, popeye, 0, ROT0, "JPM", "Around The World Club (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5buc , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Buccaneer (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5cir , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5cira , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5cirb , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5circ , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5cird , j5cir , jpmsys5, popeye, 0, ROT0, "JPM", "Circus (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5clbnud , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Club Nudger (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5clbnuda , j5clbnud , jpmsys5, popeye, 0, ROT0, "JPM", "Club Nudger (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5daytn , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5daytna , j5daytn , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5daycls , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona Classic (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5dayclsa , j5daycls , jpmsys5, popeye, 0, ROT0, "JPM", "Daytona Classic (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5dirty , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5dirtya , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5dirtyb , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5dirtyc , j5dirty , jpmsys5, popeye, 0, ROT0, "JPM", "Dirty Dozen (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5fairgd , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) // or just 'Fairground' ? +GAME( 199?, j5fairgda , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5fairgdb , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5fairgdc , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5fairgdd , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5fairgde , j5fairgd , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground Attraction Club (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5fair , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5faira , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5fairb , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5fairc , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5faird , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5faire , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5fairf , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 7)", GAME_FLAGS ) +GAME( 199?, j5fairg , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 8)", GAME_FLAGS ) +GAME( 199?, j5fairh , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 9)", GAME_FLAGS ) +GAME( 199?, j5fairi , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 10)", GAME_FLAGS ) +GAME( 199?, j5fairj , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 11)", GAME_FLAGS ) +GAME( 199?, j5fairk , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 12)", GAME_FLAGS ) +GAME( 199?, j5fairl , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 13)", GAME_FLAGS ) +GAME( 199?, j5fairm , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 14)", GAME_FLAGS ) +GAME( 199?, j5fairn , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 15)", GAME_FLAGS ) +GAME( 199?, j5fairo , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 16)", GAME_FLAGS ) +GAME( 199?, j5fairp , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 17)", GAME_FLAGS ) +GAME( 199?, j5fairq , j5fair , jpmsys5, popeye, 0, ROT0, "JPM", "Fairground (Jpm) (SYSTEM5, set 18)", GAME_FLAGS ) +GAME( 199?, j5filth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5filtha , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5filthb , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5filthc , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5filthd , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5filthe , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5filthf , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 7)", GAME_FLAGS ) +GAME( 199?, j5filthg , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 8)", GAME_FLAGS ) +GAME( 199?, j5filthh , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 9)", GAME_FLAGS ) +GAME( 199?, j5filthi , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 10)", GAME_FLAGS ) +GAME( 199?, j5filthj , j5filth , jpmsys5, popeye, 0, ROT0, "JPM", "Filthy Rich (Jpm) (SYSTEM5, set 11)", GAME_FLAGS ) +GAME( 199?, j5firebl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5firebla , j5firebl , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5fireblb , j5firebl , jpmsys5, popeye, 0, ROT0, "JPM", "Fireball (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5frmag , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Fruit Magic (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5goldbr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Golden Bars (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5hagar , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5hagara , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5hagarb , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5hagarc , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5hagard , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5hagare , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5hagarf , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 7)", GAME_FLAGS ) +GAME( 199?, j5hagarg , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 8)", GAME_FLAGS ) +GAME( 199?, j5hagarh , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 9)", GAME_FLAGS ) +GAME( 199?, j5hagari , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 10)", GAME_FLAGS ) +GAME( 199?, j5hagarj , j5hagar , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar (Jpm) (SYSTEM5, set 11)", GAME_FLAGS ) +GAME( 199?, j5hagsho , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5hagshoa , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5hagshob , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5hagshoc , j5hagsho , jpmsys5, popeye, 0, ROT0, "JPM", "Hagar Showcase (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5holly , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5hollya , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5hollyb , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5hollyc , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5hollyd , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5hollye , j5holly , jpmsys5, popeye, 0, ROT0, "JPM", "Hollywood Nights (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5hotdog , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hot Dogs (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5hotdoga , j5hotdog , jpmsys5, popeye, 0, ROT0, "JPM", "Hot Dogs (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5indsum , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Indian Summer (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5indy , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Indy 500 (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5intr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5intra , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5intrb , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5intrc , j5intr , jpmsys5, popeye, 0, ROT0, "JPM", "Intrigue (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5jokgld , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5jokglda , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5jokgldb , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5jokgldc , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5jokgldd , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5jokglde , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5jokgldf , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 7)", GAME_FLAGS ) +GAME( 199?, j5jokgldg , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 8)", GAME_FLAGS ) +GAME( 199?, j5jokgldh , j5jokgld , jpmsys5, popeye, 0, ROT0, "JPM", "Jokers Gold (Jpm) (SYSTEM5, set 9)", GAME_FLAGS ) +GAME( 199?, j5nite , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Nite Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5nitea , j5nite , jpmsys5, popeye, 0, ROT0, "JPM", "Nite Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5palm , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Palm Springs (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5palma , j5palm , jpmsys5, popeye, 0, ROT0, "JPM", "Palm Springs (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5phnx , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Phoenix (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5phnxa , j5phnx , jpmsys5, popeye, 0, ROT0, "JPM", "Phoenix (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5popeye , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) // (20p/8 GBP Token) ? +GAME( 199?, j5popeyea , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5popeyeb , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5popeyec , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5popeyed , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 5)", GAME_FLAGS ) +GAME( 199?, j5popeyee , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 6)", GAME_FLAGS ) +GAME( 199?, j5popeyef , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 7)", GAME_FLAGS ) +GAME( 199?, j5popeyeg , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 8)", GAME_FLAGS ) +GAME( 199?, j5popeyeh , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 9)", GAME_FLAGS ) +GAME( 199?, j5popeyei , j5popeye , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye (Jpm) (SYSTEM5, set 10)", GAME_FLAGS ) +GAME( 199?, j5popth , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5poptha , j5popth , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5popthb , j5popth , jpmsys5, popeye, 0, ROT0, "JPM", "Popeye's Treasure Hunt (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5popprz , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Prize Popeye Vending (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5popprza , j5popprz , jpmsys5, popeye, 0, ROT0, "JPM", "Prize Popeye Vending (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5reelgh , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Reel Ghost (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5roul , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5roulcl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5roulcla , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5roulclb , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5roulclc , j5roulcl , jpmsys5, popeye, 0, ROT0, "JPM", "Roulette Club (Jpm) (SYSTEM5, set 4)", GAME_FLAGS ) +GAME( 199?, j5slvree , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Reels (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5slvreea , j5slvree , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Reels (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5slvstr , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5slvstra , j5slvstr , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5slvstrb , j5slvstr , jpmsys5, popeye, 0, ROT0, "JPM", "Silver Streak (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5street , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Streetwise (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5sup4 , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super 4 (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5supbar , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super Bars (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5supbara , j5supbar , jpmsys5, popeye, 0, ROT0, "JPM", "Super Bars (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5suphi , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Super Hi-Lo (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5swop , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Swop A Fruit Club (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5term , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Terminator (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5topshp , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Top Of The Shop Club (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5trail , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5traila , j5trail , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5trailb , j5trail , jpmsys5, popeye, 0, ROT0, "JPM", "Trailblazer Club (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5td , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Tumbling Dice (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5uj , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5uja , j5uj , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5ujb , j5uj , jpmsys5, popeye, 0, ROT0, "JPM", "Union Jackpot (Jpm) (SYSTEM5, set 3)", GAME_FLAGS ) +GAME( 199?, j5wsc , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Wall Street Club (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5wsca , j5wsc , jpmsys5, popeye, 0, ROT0, "JPM", "Wall Street Club (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) + +GAME( 199?, j5movie , 0 , jpmsys5, popeye, 0, ROT0, "Crystal", "Movie Magic Club (Crystal) (SYSTEM5)", GAME_FLAGS ) // apparently by Crystal + +GAME( 199?, j5nudfic , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Nudge Fiction (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5revo , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Revolver (Jpm) (SYSTEM5, set 1)", GAME_FLAGS ) +GAME( 199?, j5revoa , j5revo , jpmsys5, popeye, 0, ROT0, "JPM", "Revolver (Jpm) (SYSTEM5, set 2)", GAME_FLAGS ) +GAME( 199?, j5sizl , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Sizzling (Jpm) (SYSTEM5)", GAME_FLAGS ) +GAME( 199?, j5hilos , 0 , jpmsys5, popeye, 0, ROT0, "JPM", "Hi Lo Silver (Jpm) (SYSTEM5)", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/jpmsys7.c mame-0.145/src/mame/drivers/jpmsys7.c --- mame-0.144/src/mame/drivers/jpmsys7.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jpmsys7.c 2012-02-06 21:30:42.000000000 +0000 @@ -4,6 +4,8 @@ /* I don't think this is Pluto, or other known platforms */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -11,12 +13,18 @@ { public: jpmsys7_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( jpmsys7_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( jpmsys7_map, AS_PROGRAM, 32, jpmsys7_state ) AM_RANGE(0x000000, 0x2fffff) AM_ROM ADDRESS_MAP_END @@ -195,16 +203,15 @@ ROM_END - -GAME( 200?, j7bmagic ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Black Magic (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7cexprs ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Cash Xpress (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7crztrl ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Crazy Trails (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7fantaz ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Fantaztec (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7kerchn ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Ker - Chinq (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7razzma ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Razzamataz (Jpm) (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7razzmaa ,j7razzma, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Razzamataz (Jpm) (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7r2roll ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Ready To Roll (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7tubgld ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Turbo Gold (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7wldwkd ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Wild 'N' Wicked (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7bullio ,0, jpmsys7, jpmsys7, 0, ROT0, "Ace","Bullionaire (Ace)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, j7clbmag ,0, jpmsys7, jpmsys7, 0, ROT0, "Qps","Club Magic (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, j7bmagic ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Black Magic (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7cexprs ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Cash Xpress (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7crztrl ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Crazy Trails (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7fantaz ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Fantaztec (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7kerchn ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Ker - Chinq (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7razzma ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Razzamataz (Jpm) (set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7razzmaa ,j7razzma, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Razzamataz (Jpm) (set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7r2roll ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Ready To Roll (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7tubgld ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Turbo Gold (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7wldwkd ,0, jpmsys7, jpmsys7, 0, ROT0, "Jpm","Wild 'N' Wicked (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7bullio ,0, jpmsys7, jpmsys7, 0, ROT0, "Ace","Bullionaire (Ace)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, j7clbmag ,0, jpmsys7, jpmsys7, 0, ROT0, "Qps","Club Magic (Jpm)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/jrpacman.c mame-0.145/src/mame/drivers/jrpacman.c --- mame-0.144/src/mame/drivers/jrpacman.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/jrpacman.c 2012-02-06 21:30:38.000000000 +0000 @@ -119,7 +119,12 @@ cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } +static WRITE8_HANDLER( irq_mask_w ) +{ + jrpacman_state *state = space->machine().driver_data(); + state->m_irq_mask = data & 1; +} /************************************* * @@ -133,7 +138,7 @@ AM_RANGE(0x4800, 0x4fef) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x5000, 0x503f) AM_READ_PORT("P1") - AM_RANGE(0x5000, 0x5000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5003, 0x5003) AM_WRITE(pacman_flipscreen_w) AM_RANGE(0x5040, 0x507f) AM_READ_PORT("P2") @@ -272,22 +277,29 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + jrpacman_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( jrpacman, jrpacman_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(port_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(pacman) + MCFG_SCREEN_UPDATE_STATIC(pacman) MCFG_GFXDECODE(jrpacman) MCFG_PALETTE_LENGTH(128*4) diff -Nru mame-0.144/src/mame/drivers/jubilee.c mame-0.145/src/mame/drivers/jubilee.c --- mame-0.144/src/mame/drivers/jubilee.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/jubilee.c 2012-02-06 21:30:35.000000000 +0000 @@ -110,7 +110,7 @@ { jubilee_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -131,10 +131,10 @@ } -static SCREEN_UPDATE( jubileep ) +static SCREEN_UPDATE_IND16( jubileep ) { - jubilee_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + jubilee_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -420,10 +420,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(jubileep) + MCFG_SCREEN_UPDATE_STATIC(jubileep) MCFG_GFXDECODE(jubileep) diff -Nru mame-0.144/src/mame/drivers/junofrst.c mame-0.145/src/mame/drivers/junofrst.c --- mame-0.144/src/mame/drivers/junofrst.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/junofrst.c 2012-02-06 21:30:42.000000000 +0000 @@ -334,22 +334,20 @@ KONAMI8_COCKTAIL_B213_UNK PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "256 (Cheat)") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" ) + PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") PORT_DIPSETTING( 0x70, "1 (Easiest)" ) PORT_DIPSETTING( 0x60, "2" ) PORT_DIPSETTING( 0x50, "3" ) @@ -358,7 +356,7 @@ PORT_DIPSETTING( 0x20, "6" ) PORT_DIPSETTING( 0x10, "7" ) PORT_DIPSETTING( 0x00, "8 (Hardest)" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -441,10 +439,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* not sure about the visible area */ - MCFG_SCREEN_UPDATE(tutankhm) + MCFG_SCREEN_UPDATE_STATIC(tutankhm) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/jvh.c mame-0.145/src/mame/drivers/jvh.c --- mame-0.144/src/mame/drivers/jvh.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/jvh.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/tms9900/tms9900.h" @@ -5,18 +7,29 @@ { public: jvh_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( jvh_map, AS_PROGRAM, 8 ) + +static ADDRESS_MAP_START( jvh_map, AS_PROGRAM, 8, jvh_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( jvh ) INPUT_PORTS_END -static MACHINE_RESET( jvh ) +void jvh_state::machine_reset() { } @@ -28,8 +41,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", TMS9980, 1000000) MCFG_CPU_PROGRAM_MAP(jvh_map) - - MCFG_MACHINE_RESET( jvh ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -39,6 +50,7 @@ ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("cpu_ic1.bin", 0x0000, 0x2000, CRC(fadb8f9a) SHA1(b7e7ea8e33847c14a3414f5e367e304f12c0bc00)) ROM_LOAD("cpu_ic7.bin", 0x2000, 0x2000, CRC(2f9402b4) SHA1(3d3bae7e4e5ad40e3c8019d55392defdffd21cc4)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("snd.bin", 0xc000, 0x2000, CRC(2477bbe2) SHA1(f636952822153f43e9d09f8211edde1057249203)) ROM_RELOAD(0xe000, 0x2000) @@ -51,10 +63,12 @@ ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("mm_ic1.764", 0x0000, 0x2000, CRC(fb59920d) SHA1(05536c4c036a8d73516766e14f4449665b2ec180)) ROM_LOAD("mm_ic7.764", 0x2000, 0x2000, CRC(9b47af41) SHA1(ae795c22aa437d6c71312d93de8a87f43ee500fb)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("snd.bin", 0xc000, 0x2000, NO_DUMP) ROM_RELOAD(0xe000, 0x2000) ROM_END -GAME(1987, escape, 0, jvh, jvh, jvh, ROT0, "Jac Van Ham (Royal)", "Escape", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, movmastr, 0, jvh, jvh, jvh, ROT0, "Jac Van Ham (Royal)", "Movie Masters", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1987, escape, 0, jvh, jvh, jvh, ROT0, "Jac Van Ham (Royal)", "Escape", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, movmastr, 0, jvh, jvh, jvh, ROT0, "Jac Van Ham (Royal)", "Movie Masters", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/kaneko16.c mame-0.145/src/mame/drivers/kaneko16.c --- mame-0.144/src/mame/drivers/kaneko16.c 2012-01-13 15:34:40.000000000 +0000 +++ mame-0.145/src/mame/drivers/kaneko16.c 2012-02-06 21:30:36.000000000 +0000 @@ -79,6 +79,7 @@ - shogwarr [general] +- interrupt timing/behaviour - replace sample bank copying with new ADDRESS MAP system for OKI and do banking like CPUs ***************************************************************************/ @@ -86,7 +87,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "includes/kaneko16.h" #include "sound/2203intf.h" @@ -1753,15 +1753,22 @@ ***************************************************************************/ -#define KANEKO16_INTERRUPTS_NUM 3 -static INTERRUPT_GEN( kaneko16_interrupt ) +static TIMER_DEVICE_CALLBACK( kaneko16_interrupt ) { - switch ( cpu_getiloops(device) ) - { - case 2: device_set_input_line(device, 3, HOLD_LINE); break; - case 1: device_set_input_line(device, 4, HOLD_LINE); break; - case 0: device_set_input_line(device, 5, HOLD_LINE); break; - } + kaneko16_state *state = timer.machine().driver_data(); + int scanline = param; + + // main vblank interrupt + if(scanline == 224) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); + + // each of these 2 int are responsible of translating a part of sprite buffer + // from work ram to sprite ram. How these are scheduled is unknown. + if(scanline == 64) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + + if(scanline == 144) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); } static const ay8910_interface ay8910_intf_dsw = @@ -1812,7 +1819,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 12000000) /* MC68000P12 */ MCFG_CPU_PROGRAM_MAP(berlwall) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", kaneko16_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(berlwall) @@ -1822,10 +1829,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(berlwall) + MCFG_SCREEN_UPDATE_STATIC(berlwall) MCFG_GFXDECODE(1x4bit_1x4bit) MCFG_PALETTE_LENGTH(2048 + 32768) /* 32768 static colors for the bg */ @@ -1858,7 +1864,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(bakubrkr) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", kaneko16_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(bakubrkr) MCFG_EEPROM_93C46_ADD("eeprom") @@ -1869,10 +1875,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(kaneko16) + MCFG_SCREEN_UPDATE_STATIC(kaneko16) MCFG_GFXDECODE(1x4bit_2x4bit) MCFG_PALETTE_LENGTH(2048) @@ -1913,7 +1918,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,12000000) /* TMP68HC000-12 */ MCFG_CPU_PROGRAM_MAP(blazeon) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", kaneko16_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80,4000000) /* D780C-2 */ MCFG_CPU_PROGRAM_MAP(blazeon_soundmem) @@ -1927,10 +1932,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1 -8) - MCFG_SCREEN_UPDATE(kaneko16) + MCFG_SCREEN_UPDATE_STATIC(kaneko16) MCFG_GFXDECODE(1x4bit_1x4bit) MCFG_PALETTE_LENGTH(2048) @@ -1964,9 +1968,9 @@ static MACHINE_CONFIG_START( gtmr, kaneko16_state ) /* basic machine hardware */ - MCFG_CPU_ADD("gtmr", M68000, XTAL_16MHz) /* verified on pcb */ + MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(gtmr_map) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", kaneko16_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(gtmr) MCFG_NVRAM_ADD_0FILL("nvram") @@ -1977,10 +1981,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(kaneko16) + MCFG_SCREEN_UPDATE_STATIC(kaneko16) MCFG_GFXDECODE(1x8bit_2x4bit) MCFG_PALETTE_LENGTH(32768) @@ -2004,7 +2007,7 @@ static MACHINE_CONFIG_DERIVED( bloodwar, gtmr ) /* basic machine hardware */ - MCFG_CPU_MODIFY("gtmr") + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bloodwar) MCFG_MACHINE_RESET( bloodwar ) @@ -2017,7 +2020,7 @@ static MACHINE_CONFIG_DERIVED( gtmr2, gtmr ) /* basic machine hardware */ - MCFG_CPU_MODIFY("gtmr") + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(gtmr2_map) MACHINE_CONFIG_END @@ -2025,22 +2028,11 @@ Bonk's Adventure ***************************************************************************/ -/* - Even though 3 interrupts are triggered, I set an int_num of 4. (notice '+1') - I agree that it is kind of a misuse of the function, but I haven't found - clues in code on how interrupts are scheduled... - IT5 is the main int, and needs more time to execute than IT 3 and 4. - Between other things, each of these 2 int are responsible of translating - a part of sprite buffer from work ram to sprite ram. - So now test mode is fully working and visible. - SebV -*/ static MACHINE_CONFIG_DERIVED( bonkadv, gtmr ) /* basic machine hardware */ - MCFG_CPU_MODIFY("gtmr") + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bonkadv) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM + 1 ) // comment above MCFG_MACHINE_RESET( bonkadv ) MACHINE_CONFIG_END @@ -2054,7 +2046,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mgcrystl) - MCFG_CPU_VBLANK_INT_HACK(kaneko16_interrupt,KANEKO16_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", kaneko16_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(mgcrystl) MCFG_EEPROM_93C46_ADD("eeprom") @@ -2065,10 +2057,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(kaneko16) + MCFG_SCREEN_UPDATE_STATIC(kaneko16) MCFG_GFXDECODE(1x4bit_2x4bit) MCFG_PALETTE_LENGTH(2048) @@ -2108,31 +2099,29 @@ other: busy loop */ -#define SHOGWARR_INTERRUPTS_NUM 3 -static INTERRUPT_GEN( shogwarr_interrupt ) +static TIMER_DEVICE_CALLBACK( shogwarr_interrupt ) { - //kaneko16_state *state = device->machine().driver_data(); - switch ( cpu_getiloops(device) ) - { - case 2: device_set_input_line(device, 2, HOLD_LINE); break; - case 1: device_set_input_line(device, 3, HOLD_LINE); break; + kaneko16_state *state = timer.machine().driver_data(); + int scanline = param; + if(scanline == 224) + { // the code for this interrupt is provided by the MCU.. - case 0: device_set_input_line(device, 4, HOLD_LINE); + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + calc3_mcu_run(timer.machine()); - calc3_mcu_run(device->machine()); - break; #if 0 - case 0: - { - // hack, clear this ram address to get into test mode (interrupt would clear it) - if (state->mainram[0x2dfe/2]==0xff00) - { - state->mainram[0x2dfe/2]=0x0000; - } - } + // hack, clear this ram address to get into test mode (interrupt would clear it) + if (state->mainram[0x2dfe/2]==0xff00) + state->mainram[0x2dfe/2]=0x0000; #endif } + + if(scanline == 64) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + + if(scanline == 144) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } /* @@ -2174,7 +2163,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz) MCFG_CPU_PROGRAM_MAP(shogwarr) - MCFG_CPU_VBLANK_INT_HACK(shogwarr_interrupt,SHOGWARR_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", shogwarr_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(shogwarr) MCFG_EEPROM_93C46_ADD("eeprom") @@ -2184,10 +2173,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1854) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(40, 296-1, 16, 240-1) - MCFG_SCREEN_UPDATE(kaneko16) + MCFG_SCREEN_UPDATE_STATIC(kaneko16) MCFG_GFXDECODE(1x4bit_1x4bit) MCFG_PALETTE_LENGTH(2048) @@ -2698,7 +2686,7 @@ ***************************************************************************/ ROM_START( bloodwar ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "ofp0f3.514", 0x000000, 0x080000, CRC(0c93da15) SHA1(65b6b1b4acfc32c551ae4fbe6a13f7f2b8554dbf) ) ROM_LOAD16_BYTE( "ofp1f3.513", 0x000001, 0x080000, CRC(894ecbe5) SHA1(bf403d19e6315266114ac742a08cac903e7b54b5) ) @@ -2743,7 +2731,7 @@ ROM_END ROM_START( oedfight ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "ofp0j3.514", 0x000000, 0x080000, CRC(0c93da15) SHA1(65b6b1b4acfc32c551ae4fbe6a13f7f2b8554dbf) ) ROM_LOAD16_BYTE( "ofp1j3.513", 0x000001, 0x080000, CRC(cc59de49) SHA1(48ff4ed40ad22768054a59bdf5ce0e00891d8f0e) ) @@ -2898,7 +2886,7 @@ master up= 94/07/18 15:12:35 */ ROM_START( gtmr ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "u2.bin", 0x000000, 0x080000, CRC(031799f7) SHA1(a59a9635002d139247828e3b74f6cf2fbdd5e569) ) ROM_LOAD16_BYTE( "u1.bin", 0x000001, 0x080000, CRC(6238790a) SHA1(a137fd581138804534f3193068f117611a982004) ) @@ -2927,7 +2915,7 @@ ROM_END ROM_START( gtmra ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "mmp0x2.u514.bin", 0x000000, 0x080000, CRC(ba4a77c8) SHA1(efb6ae0e7aa71ab0c5f486f799bf31edcec24e2b) ) ROM_LOAD16_BYTE( "mmp1x2.u513.bin", 0x000001, 0x080000, CRC(a2b9034e) SHA1(466bcb1bf7124eb15d23b25c4e1307b9706474ec) ) @@ -2963,7 +2951,7 @@ master up= 94/09/06 14:49:19 */ ROM_START( gtmre ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "gmmu2.bin", 0x000000, 0x080000, CRC(36dc4aa9) SHA1(0aea4dc169d7aad2ea957a1de698d1fa12c71556) ) ROM_LOAD16_BYTE( "gmmu1.bin", 0x000001, 0x080000, CRC(8653c144) SHA1(a253a01327a9443337a55a13c063ea5096444c4c) ) @@ -3002,7 +2990,7 @@ master up= 94/09/06 20:30:39 */ ROM_START( gtmrusa ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "gtmrusa.u2", 0x000000, 0x080000, CRC(5be615c4) SHA1(c14d11a5bf6e025a65b932039165302ff407c4e1) ) ROM_LOAD16_BYTE( "gtmrusa.u1", 0x000001, 0x080000, CRC(ae853e4e) SHA1(31eaa73b0c5ddab1292f521ceec43b202653efe9) ) @@ -3191,7 +3179,7 @@ ***************************************************************************/ ROM_START( gtmr2 ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "m2p0x1a.u8", 0x000000, 0x080000, CRC(c29039fb) SHA1(a16e8863608353c2931e9d45359fbcec8f11ef9d) ) ROM_LOAD16_BYTE( "m2p1x1a.u7", 0x000001, 0x080000, CRC(8ef392c4) SHA1(06bd720d931911e32264183dd215ab70ad6d2961) ) @@ -3222,7 +3210,7 @@ ROM_END ROM_START( gtmr2a ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "m2p0x1.u8", 0x000000, 0x080000, CRC(525f6618) SHA1(da8008cc7768b4e8c0091aa3ea21752d0ca33691) ) ROM_LOAD16_BYTE( "m2p1x1.u7", 0x000001, 0x080000, CRC(914683e5) SHA1(dbb2140f7de86073647abc6e73ba739ea201dd30) ) @@ -3253,7 +3241,7 @@ ROM_END ROM_START( gtmr2u ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "m2p0a1.u8", 0x000000, 0x080000, CRC(813e1d5e) SHA1(602df02933dc7b77be311113af1d1edad2751cc9) ) ROM_LOAD16_BYTE( "m2p1a1.u7", 0x000001, 0x080000, CRC(bee63666) SHA1(07585a63f901f50f2a2314eb4dc4307e7028ded7) ) @@ -3726,13 +3714,13 @@ ***************************************************************************/ -ROM_START( brapboys ) /* Single PCB, fully populated, no rom sub board */ +ROM_START( brapboys ) /* World 'normal version', no rom sub board, serial RB92E000?x; suffix codes -00 and -01 */ ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "rb-030.u61", 0x000000, 0x020000, CRC(ccbe9a53) SHA1(b96baf0ecbf6550bfaf8e512d9275c53a3928bee) ) /* eprom labeled RB-030/U61-01 */ - ROM_LOAD16_BYTE( "rb-031.u62", 0x000001, 0x020000, CRC(c72b8dda) SHA1(450e1fb8acb140fa0ab23630daad82924f7ce72b) ) /* eprom labeled RB-031/U62-01 */ + ROM_LOAD16_BYTE( "rb-030.01.u61", 0x000000, 0x020000, CRC(ccbe9a53) SHA1(b96baf0ecbf6550bfaf8e512d9275c53a3928bee) ) /* eprom labeled RB-030/U61-01 (green label) */ + ROM_LOAD16_BYTE( "rb-031.01.u62", 0x000001, 0x020000, CRC(c72b8dda) SHA1(450e1fb8acb140fa0ab23630daad82924f7ce72b) ) /* eprom labeled RB-031/U62-01 (green label) */ ROM_REGION( 0x020000, "cpu1", 0 ) /* MCU Code */ - ROM_LOAD( "rb-040.u33", 0x000000, 0x020000, CRC(757c6e19) SHA1(0f1c37b1b1eb6b230c593e4648c4302f413a61f5) ) /* eprom labeled RB-040/U33-00 */ + ROM_LOAD( "rb-040.00.u33", 0x000000, 0x020000, CRC(757c6e19) SHA1(0f1c37b1b1eb6b230c593e4648c4302f413a61f5) ) /* eprom labeled RB-040/U33-00 (green label) */ ROM_REGION( 0x800000, "gfx1", 0 ) /* Sprites */ ROM_LOAD( "rb-020.u100", 0x000000, 0x100000, CRC(ce220d38) SHA1(b88d7c89a3e1a826bf19a1fa692ec77c944596d9) ) @@ -3740,7 +3728,8 @@ ROM_LOAD( "rb-022.u77", 0x200000, 0x100000, CRC(cb3f42dc) SHA1(5415f15621924dd263b8fe7daaf3dc25d470b814) ) ROM_LOAD( "rb-023.u78", 0x300000, 0x100000, CRC(0e6530c5) SHA1(72bff46f0672927e540f4f3546ae533dd0a231e0) ) ROM_LOAD( "rb-024.u79", 0x400000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // correct, both halves identical when dumped as larger - ROM_LOAD( "rb-025.u80", 0x500000, 0x040000, CRC(36cd6b90) SHA1(45c50f2652726ded67c9c24185a71a6367e09270) ) // eprom labeled RB-025/U80-01, contains title logo for this version + ROM_LOAD( "rb-024.u79", 0x480000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // is it correct to mirror like this? + ROM_LOAD( "rb-025.01.u80", 0x500000, 0x040000, CRC(36cd6b90) SHA1(45c50f2652726ded67c9c24185a71a6367e09270) ) // eprom labeled RB-025/U80-01 (green label), contains title logo for this version ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles (scrambled) */ ROM_LOAD( "rb-010.u65", 0x000000, 0x100000, CRC(ffd73f87) SHA1(1a661f71976be61c22d9b962850e738ba17f1d45) ) @@ -3750,30 +3739,32 @@ ROM_REGION( 0x100000, "oki1", 0 ) ROM_LOAD( "rb-000.u43", 0x000000, 0x080000, CRC(58ad1a62) SHA1(1d2643b5f6eac22682972a88d284e00de3e3b223) ) - ROM_LOAD( "rb-003.u101", 0x080000, 0x080000, CRC(2cac25d7) SHA1(0412c317bf650a93051b9304d23035efde0c026a) ) /* eprom labeled RB-003/U43-00 however actual IC location is u101 */ + ROM_LOAD( "rb-003.00.u101", 0x080000, 0x080000, CRC(2cac25d7) SHA1(0412c317bf650a93051b9304d23035efde0c026a) ) /* eprom labeled RB-003/U43-00 (green label) however actual IC location is u101 */ ROM_REGION( 0x200000, "oki2", 0 ) ROM_LOAD( "rb-001.u44", 0x000000, 0x100000, CRC(7cf774b3) SHA1(3fb0a5096ce9480f97e311439042eb8cbc26efb4) ) ROM_LOAD( "rb-002.u45", 0x100000, 0x100000, CRC(e4b30444) SHA1(be6756dce3721226e0b7f5d4d168008c31aeea8e) ) ROM_END - -ROM_START( brapboysj ) /* The Japanese version has an extra rom??? and used a rom sub board */ +// TODO: the eproms for brapboysj are missing the region-specific numeric suffix; +// it should be something like -00 or -01 or -10 or -11 or etc +ROM_START( brapboysj ) /* Japanese 'special version' with EXROM sub board; serial unknown; suffix codes unknown */ ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_BYTE( "rb-004.u61", 0x000000, 0x020000, CRC(5432442c) SHA1(f0f7328ece96ef25e6d4fd1958d734f64a9ef371) ) - ROM_LOAD16_BYTE( "rb-005.u62", 0x000001, 0x020000, CRC(118b3cfb) SHA1(1690ecf5c629879bd97131ff77029e152919e45d) ) + ROM_LOAD16_BYTE( "rb-004.u61", 0x000000, 0x020000, CRC(5432442c) SHA1(f0f7328ece96ef25e6d4fd1958d734f64a9ef371) ) // fill in suffix! + ROM_LOAD16_BYTE( "rb-005.u62", 0x000001, 0x020000, CRC(118b3cfb) SHA1(1690ecf5c629879bd97131ff77029e152919e45d) ) // fill in suffix! ROM_REGION( 0x020000, "cpu1", 0 ) /* MCU Code */ - ROM_LOAD( "rb-006.u33", 0x000000, 0x020000, CRC(f1d76b20) SHA1(c571b5f28e529589ee2d7697ef5d4b60ccb66e7a) ) + ROM_LOAD( "rb-006.u33", 0x000000, 0x020000, CRC(f1d76b20) SHA1(c571b5f28e529589ee2d7697ef5d4b60ccb66e7a) ) // fill in suffix! ROM_REGION( 0x1000000, "gfx1", 0 ) /* Sprites */ - ROM_LOAD( "rb-020.u100", 0x000000, 0x100000, CRC(ce220d38) SHA1(b88d7c89a3e1a826bf19a1fa692ec77c944596d9) ) + ROM_LOAD( "rb-020.u100", 0x000000, 0x100000, CRC(ce220d38) SHA1(b88d7c89a3e1a826bf19a1fa692ec77c944596d9) ) // really at location next to capacitor C2 on Z01DK-EXROM daughterboard ROM_LOAD( "rb-021.u76", 0x100000, 0x100000, CRC(74001407) SHA1(90002056ceb4e0401246950b8c3f996af0a2463c) ) ROM_LOAD( "rb-022.u77", 0x200000, 0x100000, CRC(cb3f42dc) SHA1(5415f15621924dd263b8fe7daaf3dc25d470b814) ) ROM_LOAD( "rb-023.u78", 0x300000, 0x100000, CRC(0e6530c5) SHA1(72bff46f0672927e540f4f3546ae533dd0a231e0) ) ROM_LOAD( "rb-024.u79", 0x400000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // correct, both halves identical when dumped as larger - ROM_LOAD( "rb-025.u4", 0x500000, 0x080000, CRC(aa795ba5) SHA1(c5256dcceded2e76f548b60c18e51d0dd0209d81) ) // eprom, special title screen - ROM_LOAD( "rb-026.u5", 0x580000, 0x080000, CRC(bb7604d4) SHA1(57d51ce4ea2000f9a50bae326cfcb66ec494249f) ) // eprom, logs that bounce past + ROM_LOAD( "rb-024.u79", 0x480000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // is it correct to mirror like this? + ROM_LOAD( "rb-025.u80a", 0x500000, 0x080000, CRC(aa795ba5) SHA1(c5256dcceded2e76f548b60c18e51d0dd0209d81) ) // eprom, special title screen, really at location next to capacitor C4 on Z01DK-EXROM daughterboard; // fill in suffix! + ROM_LOAD( "rb-026.u80b", 0x580000, 0x080000, CRC(bb7604d4) SHA1(57d51ce4ea2000f9a50bae326cfcb66ec494249f) ) // eprom, logs that bounce past, really at location next to capacitor C5 on Z01DK-EXROM daughterboard; // fill in suffix! ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles (scrambled) */ ROM_LOAD( "rb-010.u65", 0x000000, 0x100000, CRC(ffd73f87) SHA1(1a661f71976be61c22d9b962850e738ba17f1d45) ) @@ -3783,13 +3774,46 @@ ROM_REGION( 0x100000, "oki1", 0 ) ROM_LOAD( "rb-000.u43", 0x000000, 0x080000, CRC(58ad1a62) SHA1(1d2643b5f6eac22682972a88d284e00de3e3b223) ) - ROM_LOAD( "rb-003.u101", 0x080000, 0x080000, CRC(2cac25d7) SHA1(0412c317bf650a93051b9304d23035efde0c026a) ) /* eprom labeled RB-003/U43-00 however actual IC location is u101 */ + ROM_LOAD( "rb-003.00.u101", 0x080000, 0x080000, CRC(2cac25d7) SHA1(0412c317bf650a93051b9304d23035efde0c026a) ) /* eprom labeled RB-003/U43-00 however actual IC location is u101 */ ROM_REGION( 0x200000, "oki2", 0 ) ROM_LOAD( "rb-001.u44", 0x000000, 0x100000, CRC(7cf774b3) SHA1(3fb0a5096ce9480f97e311439042eb8cbc26efb4) ) ROM_LOAD( "rb-002.u45", 0x100000, 0x100000, CRC(e4b30444) SHA1(be6756dce3721226e0b7f5d4d168008c31aeea8e) ) ROM_END +ROM_START( brapboysu ) /* US 'special version' with EXROM sub board; Serial RB92A0008x/9x; suffix code -10 */ + ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "rb-030.10.u61", 0x000000, 0x020000, CRC(527EB92A) SHA1(64727675E58A4A71BEA1D88D7F76F60929196505) ) /* eprom labeled RB-030/U61-10 (red label) */ + ROM_LOAD16_BYTE( "rb-031.10.u62", 0x000001, 0x020000, CRC(D5962BDD) SHA1(9BADAB4CC2A9064BD29C582D82EC0B003B9FB091) ) /* eprom labeled RB-031/U62-10 (red label) */ + + ROM_REGION( 0x020000, "cpu1", 0 ) /* MCU Code */ + ROM_LOAD( "rb-040.10.u33", 0x000000, 0x020000, CRC(0C90D758) SHA1(9B1A9856AB00F80F15BFFC01276F636F92F0BD12) ) /* eprom labeled RB-040/U33-10 (red label)*/ + + ROM_REGION( 0x1000000, "gfx1", 0 ) /* Sprites */ + ROM_LOAD( "rb-020.u100", 0x000000, 0x100000, CRC(ce220d38) SHA1(b88d7c89a3e1a826bf19a1fa692ec77c944596d9) ) // rb-020 0013 mask rom; really at location next to capacitor C2 on Z01DK-EXROM daughterboard + ROM_LOAD( "rb-021.u76", 0x100000, 0x100000, CRC(74001407) SHA1(90002056ceb4e0401246950b8c3f996af0a2463c) ) // rb-021 0014 mask rom + ROM_LOAD( "rb-022.u77", 0x200000, 0x100000, CRC(cb3f42dc) SHA1(5415f15621924dd263b8fe7daaf3dc25d470b814) ) // rb-022 0015 mask rom + ROM_LOAD( "rb-023.u78", 0x300000, 0x100000, CRC(0e6530c5) SHA1(72bff46f0672927e540f4f3546ae533dd0a231e0) ) // rb-023 0016 mask rom + ROM_LOAD( "rb-024.u79", 0x400000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // rb-023 0017 w29 mask rom, both halves identical when dumped as larger + ROM_LOAD( "rb-024.u79", 0x480000, 0x080000, CRC(65fa6447) SHA1(551e540d7bf412753b4a7098e25e6f9d8774bcf4) ) // is it correct to mirror like this? + ROM_LOAD( "rb-025.10.u80a", 0x500000, 0x080000, CRC(140FE400) SHA1(A764767AACEC2F895F93256AB82125962C272951) ) // eprom labeled RB-025/U80a10 (red label), really at location next to capacitor C4 on Z01DK-EXROM daughterboard + ROM_LOAD( "rb-026.10.u80b", 0x580000, 0x080000, CRC(bb7604d4) SHA1(57d51ce4ea2000f9a50bae326cfcb66ec494249f) ) // eprom labeled RB-026/U80b10 (red label), matches japan version of rb-026, really at location next to capacitor C5 on Z01DK-EXROM daughterboard + + ROM_REGION( 0x400000, "gfx2", 0 ) /* Tiles (scrambled) */ + ROM_LOAD( "rb-010.u65", 0x000000, 0x100000, CRC(ffd73f87) SHA1(1a661f71976be61c22d9b962850e738ba17f1d45) ) // rb-010 0009 w17 mask rom + ROM_LOAD( "rb-011.u66", 0x100000, 0x100000, CRC(d9325f78) SHA1(346832608664aa8f3ac9260a549903386b4125a8) ) // rb-011 0010 w18 mask rom + ROM_LOAD( "rb-012.u67", 0x200000, 0x100000, CRC(bfdbe0d1) SHA1(3abc5398ee8ee1871b4d081f9b748539d69bcdba) ) // rb-012 0011 w21 mask rom + ROM_LOAD( "rb-013.u68", 0x300000, 0x100000, CRC(28c37fe8) SHA1(e10dd1a810983077328b44e6e33ce2e899c506d2) ) // rb-013 0012 w22 mask rom + + ROM_REGION( 0x100000, "oki1", 0 ) + ROM_LOAD( "rb-000.u43", 0x000000, 0x080000, CRC(58ad1a62) SHA1(1d2643b5f6eac22682972a88d284e00de3e3b223) ) // rb-000 0006 w28 mask rom + ROM_LOAD( "rb-003.00.u101", 0x080000, 0x080000, CRC(2cac25d7) SHA1(0412c317bf650a93051b9304d23035efde0c026a) ) /* eprom labeled RB-003/U43-00 (green label) however actual IC location is u101 */ + + ROM_REGION( 0x200000, "oki2", 0 ) + ROM_LOAD( "rb-001.u44", 0x000000, 0x100000, CRC(7cf774b3) SHA1(3fb0a5096ce9480f97e311439042eb8cbc26efb4) ) // rb-001 0007 mask rom + ROM_LOAD( "rb-002.u45", 0x100000, 0x100000, CRC(e4b30444) SHA1(be6756dce3721226e0b7f5d4d168008c31aeea8e) ) // rb-002 0008 w11 mask rom +ROM_END + /********************************************************************** Bonk's Adventure @@ -3841,7 +3865,7 @@ **********************************************************************/ ROM_START( bonkadv ) - ROM_REGION( 0x100000, "gtmr", 0 ) /* 68000 Code */ + ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "prg.8", 0x000000, 0x080000, CRC(af2e60f8) SHA1(406f79e155d1244b84f8c89c25b37188e1b4f4a6) ) ROM_LOAD16_BYTE( "prg.7", 0x000001, 0x080000, CRC(a1cc6a78) SHA1(a9cea21a6a0dfd3b0952664681c057190aa27f8c) ) @@ -3948,6 +3972,7 @@ // some functionality of the protection chip still needs investigating on these, but they seem to be playable GAME( 1992, brapboys, 0, brapboys, brapboys, brapboys, ROT0, "Kaneko", "B.Rap Boys (World)", 0 ) GAME( 1992, brapboysj,brapboys, brapboys, brapboys, brapboys, ROT0, "Kaneko", "B.Rap Boys Special (Japan)", 0 ) +GAME( 1992, brapboysu,brapboys, brapboys, brapboys, brapboys, ROT0, "Kaneko", "B.Rap Boys Special (US)", 0 ) GAME( 1992, shogwarr, 0, shogwarr, shogwarr, shogwarr, ROT0, "Kaneko", "Shogun Warriors (World)", 0 ) GAME( 1992, shogwarru,shogwarr, shogwarr, shogwarr, shogwarr, ROT0, "Kaneko", "Shogun Warriors (US)", 0 ) GAME( 1992, fjbuster, shogwarr, shogwarr, shogwarr, shogwarr, ROT0, "Kaneko", "Fujiyama Buster (Japan)", 0 ) diff -Nru mame-0.144/src/mame/drivers/kangaroo.c mame-0.145/src/mame/drivers/kangaroo.c --- mame-0.144/src/mame/drivers/kangaroo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/kangaroo.c 2012-02-06 21:30:38.000000000 +0000 @@ -446,9 +446,8 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK, 320*2, 0*2, 256*2, 260, 8, 248) - MCFG_SCREEN_UPDATE(kangaroo) + MCFG_SCREEN_UPDATE_STATIC(kangaroo) MCFG_VIDEO_START(kangaroo) diff -Nru mame-0.144/src/mame/drivers/karnov.c mame-0.145/src/mame/drivers/karnov.c --- mame-0.144/src/mame/drivers/karnov.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/karnov.c 2012-02-06 21:30:36.000000000 +0000 @@ -830,10 +830,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(karnov) + MCFG_SCREEN_UPDATE_STATIC(karnov) MCFG_GFXDECODE(karnov) MCFG_PALETTE_LENGTH(1024) @@ -875,10 +874,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(karnov) + MCFG_SCREEN_UPDATE_STATIC(karnov) MCFG_GFXDECODE(karnov) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/kas89.c mame-0.145/src/mame/drivers/kas89.c --- mame-0.144/src/mame/drivers/kas89.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/kas89.c 2012-02-06 21:30:33.000000000 +0000 @@ -196,7 +196,6 @@ #include "sound/ay8910.h" #include "video/v9938.h" #include "machine/nvram.h" -#include "deprecat.h" #include "kas89.lh" @@ -204,7 +203,9 @@ { public: kas89_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") + { } UINT8 m_mux_data; UINT8 m_main_nmi_enable; @@ -216,6 +217,7 @@ device_t *m_maincpu; device_t *m_audiocpu; + required_device m_v9938; }; #define VDP_MEM 0x40000 @@ -225,22 +227,18 @@ * Interrupt handling & Video * ***************************************/ -static void kas89_vdp_interrupt(running_machine &machine, int i) +static void kas89_vdp_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line (machine, "maincpu", 0, (i ? ASSERT_LINE : CLEAR_LINE)); + cputag_set_input_line (device.machine(), "maincpu", 0, (i ? ASSERT_LINE : CLEAR_LINE)); } -static INTERRUPT_GEN( kas89_interrupt ) +static TIMER_DEVICE_CALLBACK( kas89_interrupt ) { - v9938_interrupt(device->machine(), 0); -} - + kas89_state *state = timer.machine().driver_data(); + int scanline = param; -static VIDEO_START( kas89 ) -{ - VIDEO_START_CALL(generic_bitmapped); - v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, VDP_MEM, kas89_vdp_interrupt); - v9938_reset(0); + if((scanline % 2) == 0) + state->m_v9938->interrupt(); } @@ -261,7 +259,6 @@ { kas89_state *state = machine.driver_data(); - v9938_reset(0); state->m_main_nmi_enable = 0; } @@ -306,16 +303,22 @@ return state->m_mux_data; } -static INTERRUPT_GEN ( kas89_nmi_interrupt ) +static TIMER_DEVICE_CALLBACK ( kas89_nmi_cb ) { - kas89_state *state = device->machine().driver_data(); + kas89_state *state = timer.machine().driver_data(); if (state->m_main_nmi_enable) - { - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } +static TIMER_DEVICE_CALLBACK ( kas89_sound_nmi_cb ) +{ + kas89_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_audiocpu, INPUT_LINE_NMI, PULSE_LINE); +} + + static WRITE8_HANDLER( control_w ) { /* - bits - @@ -513,10 +516,7 @@ static ADDRESS_MAP_START( kas89_io, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x40, 0x40) AM_WRITE(v9938_0_vram_w) AM_READ(v9938_0_vram_r) - AM_RANGE(0x41, 0x41) AM_WRITE(v9938_0_command_w) AM_READ(v9938_0_status_r) - AM_RANGE(0x42, 0x42) AM_WRITE(v9938_0_palette_w) - AM_RANGE(0x43, 0x43) AM_WRITE(v9938_0_register_w) + AM_RANGE(0x40, 0x43) AM_DEVREADWRITE_MODERN("v9938", v9938_device, read, write) AM_RANGE(0x80, 0x80) AM_WRITE(mux_w) AM_RANGE(0x81, 0x81) AM_READ(mux_r) AM_RANGE(0x82, 0x82) AM_WRITE(control_w) /* Bit6 trigger the 138Hz osc. tied to main Z80's NMI.*/ @@ -773,13 +773,13 @@ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* Confirmed */ MCFG_CPU_PROGRAM_MAP(kas89_map) MCFG_CPU_IO_MAP(kas89_io) - MCFG_CPU_VBLANK_INT_HACK(kas89_interrupt, 262) - MCFG_CPU_PERIODIC_INT(kas89_nmi_interrupt, 138) /* Connected to a 138Hz osc. *AND* bit6 of port $82 */ + MCFG_TIMER_ADD_SCANLINE("scantimer", kas89_interrupt, "screen", 0, 1) + MCFG_TIMER_ADD_PERIODIC("kas89_nmi", kas89_nmi_cb, attotime::from_hz(138)) /* Connected to a 138Hz osc. *AND* bit6 of port $82 */ MCFG_CPU_ADD("audiocpu", Z80, MASTER_CLOCK/6) /* Confirmed */ MCFG_CPU_PROGRAM_MAP(audio_map) MCFG_CPU_IO_MAP(audio_io) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse, 138) /* Connected to a 138Hz osc.*/ + MCFG_TIMER_ADD_PERIODIC("kas89_snmi", kas89_sound_nmi_cb, attotime::from_hz(138)) /* Connected to a 138Hz osc.*/ MCFG_MACHINE_START(kas89) MCFG_MACHINE_RESET(kas89) @@ -787,17 +787,18 @@ MCFG_NVRAM_ADD_0FILL("nvram") /* video hardware */ + MCFG_V9938_ADD("v9938", "screen", VDP_MEM) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(kas89_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(544, 480) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) + MCFG_SCREEN_SIZE(544, 524) MCFG_SCREEN_VISIBLE_AREA(0, 544 - 1, 0, 480 - 1) - MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT(v9938) - MCFG_VIDEO_START(kas89) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/kchamp.c mame-0.145/src/mame/drivers/kchamp.c --- mame-0.144/src/mame/drivers/kchamp.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/kchamp.c 2012-02-06 21:30:37.000000000 +0000 @@ -438,10 +438,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.10) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kchampvs) + MCFG_SCREEN_UPDATE_STATIC(kchampvs) MCFG_GFXDECODE(kchamp) MCFG_PALETTE_LENGTH(256) @@ -489,10 +488,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kchamp) + MCFG_SCREEN_UPDATE_STATIC(kchamp) MCFG_GFXDECODE(kchamp) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/kickgoal.c mame-0.145/src/mame/drivers/kickgoal.c --- mame-0.144/src/mame/drivers/kickgoal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/kickgoal.c 2012-02-06 21:30:35.000000000 +0000 @@ -695,10 +695,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(9*8, 55*8-1, 4*8, 60*8-1) - MCFG_SCREEN_UPDATE(kickgoal) + MCFG_SCREEN_UPDATE_STATIC(kickgoal) MCFG_GFXDECODE(kickgoal) MCFG_PALETTE_LENGTH(1024) @@ -733,10 +732,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(10*8+2, 54*8-1+2, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(actionhw) + MCFG_SCREEN_UPDATE_STATIC(actionhw) MCFG_GFXDECODE(actionhw) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/kingdrby.c mame-0.145/src/mame/drivers/kingdrby.c --- mame-0.144/src/mame/drivers/kingdrby.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/kingdrby.c 2012-02-06 21:30:34.000000000 +0000 @@ -146,7 +146,7 @@ color|0x40, 0); - tileinfo->category = (state->m_attr[tile_index] & 0x08)>>3; + tileinfo.category = (state->m_attr[tile_index] & 0x08)>>3; } static VIDEO_START(kingdrby) @@ -156,7 +156,7 @@ state->m_sc1_tilemap = tilemap_create(machine, get_sc1_tile_info,tilemap_scan_rows,8,8,32,24); state->m_sc0w_tilemap = tilemap_create(machine, get_sc0_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_sc1_tilemap,0); + state->m_sc1_tilemap->set_transparent_pen(0); } static const UINT8 hw_sprite[16] = @@ -165,7 +165,7 @@ 0x22, 0x22, 0x22, 0x22, 0x22, 0x11, 0x22, 0x22 }; -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kingdrby_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -210,28 +210,25 @@ } } -static SCREEN_UPDATE(kingdrby) +static SCREEN_UPDATE_IND16(kingdrby) { - kingdrby_state *state = screen->machine().driver_data(); - const rectangle &visarea = screen->visible_area(); + kingdrby_state *state = screen.machine().driver_data(); + const rectangle &visarea = screen.visible_area(); rectangle clip; - tilemap_set_scrollx( state->m_sc0_tilemap,0, state->m_vram[0x342]); - tilemap_set_scrolly( state->m_sc0_tilemap,0, state->m_vram[0x341]); - tilemap_set_scrollx( state->m_sc1_tilemap,0, state->m_vram[0x342]); - tilemap_set_scrolly( state->m_sc1_tilemap,0, state->m_vram[0x341]); - tilemap_set_scrolly( state->m_sc0w_tilemap,0, 32); + state->m_sc0_tilemap->set_scrollx(0, state->m_vram[0x342]); + state->m_sc0_tilemap->set_scrolly(0, state->m_vram[0x341]); + state->m_sc1_tilemap->set_scrollx(0, state->m_vram[0x342]); + state->m_sc1_tilemap->set_scrolly(0, state->m_vram[0x341]); + state->m_sc0w_tilemap->set_scrolly(0, 32); /* maybe it needs two window tilemaps? (one at the top, the other at the bottom)*/ - clip.min_x = visarea.min_x; - clip.max_x = 256; - clip.min_y = 192; - clip.max_y = visarea.max_y; + clip.set(visarea.min_x, 256, 192, visarea.max_y); /*TILEMAP_DRAW_CATEGORY + TILEMAP_DRAW_OPAQUE doesn't suit well?*/ - tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap,TILEMAP_DRAW_CATEGORY(1),0); - tilemap_draw(bitmap,&clip,state->m_sc0w_tilemap,0,0); + state->m_sc0_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_sc1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1),0); + state->m_sc0w_tilemap->draw(bitmap, clip, 0,0); return 0; } @@ -240,18 +237,18 @@ { kingdrby_state *state = space->machine().driver_data(); state->m_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); - tilemap_mark_tile_dirty(state->m_sc0w_tilemap,offset); - tilemap_mark_tile_dirty(state->m_sc1_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); + state->m_sc0w_tilemap->mark_tile_dirty(offset); + state->m_sc1_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( sc0_attr_w ) { kingdrby_state *state = space->machine().driver_data(); state->m_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset); - tilemap_mark_tile_dirty(state->m_sc0w_tilemap,offset); - tilemap_mark_tile_dirty(state->m_sc1_tilemap,offset); + state->m_sc0_tilemap->mark_tile_dirty(offset); + state->m_sc0w_tilemap->mark_tile_dirty(offset); + state->m_sc1_tilemap->mark_tile_dirty(offset); } /************************************* @@ -1037,10 +1034,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) /* controlled by CRTC */ - MCFG_SCREEN_UPDATE(kingdrby) + MCFG_SCREEN_UPDATE_STATIC(kingdrby) MCFG_VIDEO_START(kingdrby) diff -Nru mame-0.144/src/mame/drivers/kingobox.c mame-0.145/src/mame/drivers/kingobox.c --- mame-0.144/src/mame/drivers/kingobox.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/kingobox.c 2012-02-06 21:30:35.000000000 +0000 @@ -503,10 +503,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kingofb) + MCFG_SCREEN_UPDATE_STATIC(kingofb) MCFG_GFXDECODE(kingobox) MCFG_PALETTE_LENGTH(256+8*2) @@ -556,10 +555,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ringking) + MCFG_SCREEN_UPDATE_STATIC(ringking) MCFG_GFXDECODE(rk) MCFG_PALETTE_LENGTH(256+8*2) diff -Nru mame-0.144/src/mame/drivers/kingpin.c mame-0.145/src/mame/drivers/kingpin.c --- mame-0.144/src/mame/drivers/kingpin.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/kingpin.c 2012-02-06 21:30:35.000000000 +0000 @@ -144,14 +144,6 @@ DEVCB_LINE(vdp_interrupt) }; -static SCREEN_UPDATE( kingpin ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - static MACHINE_CONFIG_START( kingpin, kingpin_state ) /* MAIN CPU */ MCFG_CPU_ADD("maincpu", Z80, 3579545) @@ -166,7 +158,7 @@ /* VIDEO */ MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, kingpin_tms9928a_interface ) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( kingpin ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) MCFG_NVRAM_ADD_0FILL("nvram") diff -Nru mame-0.144/src/mame/drivers/kinst.c mame-0.145/src/mame/drivers/kinst.c --- mame-0.144/src/mame/drivers/kinst.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/kinst.c 2012-02-06 21:30:34.000000000 +0000 @@ -167,7 +167,7 @@ { kinst_state *state = machine.driver_data(); device_t *ide = machine.device("ide"); - UINT8 *features = ide_get_features(ide); + UINT8 *features = ide_get_features(ide,0); if (strncmp(machine.system().name, "kinst2", 6) != 0) { @@ -230,20 +230,20 @@ * *************************************/ -static SCREEN_UPDATE( kinst ) +static SCREEN_UPDATE_IND16( kinst ) { - kinst_state *state = screen->machine().driver_data(); + kinst_state *state = screen.machine().driver_data(); int y; /* loop over rows and copy to the destination */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 *src = &state->m_video_base[640/4 * y]; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, cliprect->min_x); + UINT16 *dest = &bitmap.pix16(y, cliprect.min_x); int x; /* loop over columns */ - for (x = cliprect->min_x; x < cliprect->max_x; x += 2) + for (x = cliprect.min_x; x < cliprect.max_x; x += 2) { UINT32 data = *src++; @@ -668,10 +668,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(kinst) + MCFG_SCREEN_UPDATE_STATIC(kinst) MCFG_PALETTE_INIT(BBBBB_GGGGG_RRRRR) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/kissproto.c mame-0.145/src/mame/drivers/kissproto.c --- mame-0.144/src/mame/drivers/kissproto.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/kissproto.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Bally Kiss 8035 prototype */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mcs48/mcs48.h" @@ -8,18 +11,28 @@ { public: kissp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( kissp_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( kissp_map, AS_PROGRAM, 8, kissp_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( kissp ) INPUT_PORTS_END -static MACHINE_RESET( kissp ) +void kissp_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8035, 6000000/15) MCFG_CPU_PROGRAM_MAP(kissp_map) - - MCFG_MACHINE_RESET( kissp ) MACHINE_CONFIG_END ROM_START(kissp) @@ -45,5 +56,5 @@ ROM_RELOAD( 0x4800, 0x0800) ROM_END -GAME( 1979, kissp, kiss, kissp, kissp, kissp, ROT0, "Bally","Kiss (prototype)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME( 1979, kissp, kiss, kissp, kissp, kissp, ROT0, "Bally", "Kiss (prototype)", GAME_NO_SOUND | GAME_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/klax.c mame-0.145/src/mame/drivers/klax.c --- mame-0.144/src/mame/drivers/klax.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/klax.c 2012-02-06 21:30:38.000000000 +0000 @@ -182,11 +182,10 @@ MCFG_PALETTE_LENGTH(512) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(klax) + MCFG_SCREEN_UPDATE_STATIC(klax) MCFG_VIDEO_START(klax) diff -Nru mame-0.144/src/mame/drivers/kncljoe.c mame-0.145/src/mame/drivers/kncljoe.c --- mame-0.144/src/mame/drivers/kncljoe.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/kncljoe.c 2012-02-06 21:30:39.000000000 +0000 @@ -293,10 +293,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(kncljoe) + MCFG_SCREEN_UPDATE_STATIC(kncljoe) MCFG_GFXDECODE(kncljoe) MCFG_PALETTE_LENGTH(16*8+16*8) diff -Nru mame-0.144/src/mame/drivers/koftball.c mame-0.145/src/mame/drivers/koftball.c --- mame-0.144/src/mame/drivers/koftball.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/koftball.c 2012-02-06 21:30:39.000000000 +0000 @@ -29,7 +29,6 @@ #define NVRAM_HACK 1 #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" @@ -38,7 +37,9 @@ { public: koftball_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_bmc_1_videoram; UINT16 *m_bmc_2_videoram; @@ -48,6 +49,8 @@ UINT8 *m_bmc_colorram; int m_clr_offset; UINT16 m_prot_data; + + required_device m_maincpu; }; @@ -79,14 +82,14 @@ state->m_tilemap_1 = tilemap_create(machine, get_t1_tile_info,tilemap_scan_rows,8,8,64,32); state->m_tilemap_2 = tilemap_create(machine, get_t2_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_tilemap_1,0); + state->m_tilemap_1->set_transparent_pen(0); } -static SCREEN_UPDATE( koftball ) +static SCREEN_UPDATE_IND16( koftball ) { - koftball_state *state = screen->machine().driver_data(); - tilemap_draw( bitmap, cliprect, state->m_tilemap_2, 0, 0); - tilemap_draw( bitmap, cliprect, state->m_tilemap_1, 0, 0); + koftball_state *state = screen.machine().driver_data(); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); return 0; } @@ -141,14 +144,14 @@ { koftball_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bmc_1_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1, offset); + state->m_tilemap_1->mark_tile_dirty(offset); } static WRITE16_HANDLER(bmc_2_videoram_w) { koftball_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bmc_2_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_2, offset); + state->m_tilemap_2->mark_tile_dirty(offset); } static ADDRESS_MAP_START( koftball_mem, AS_PROGRAM, 16 ) @@ -202,10 +205,19 @@ INPUT_PORTS_END -static INTERRUPT_GEN( bmc_interrupt ) +static TIMER_DEVICE_CALLBACK( bmc_interrupt ) { - static const int bmcints[]={2,3,6}; - device_set_input_line(device, bmcints[cpu_getiloops(device)], HOLD_LINE); + koftball_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + + if(scanline == 128) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + + if(scanline == 64) + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); } static const gfx_layout tilelayout = @@ -227,14 +239,13 @@ static MACHINE_CONFIG_START( koftball, koftball_state ) MCFG_CPU_ADD("maincpu", M68000, 21477270/2 ) MCFG_CPU_PROGRAM_MAP(koftball_mem) - MCFG_CPU_VBLANK_INT_HACK(bmc_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", bmc_interrupt, "screen", 0, 1) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(koftball) + MCFG_SCREEN_UPDATE_STATIC(koftball) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_GFXDECODE(koftball) MCFG_SCREEN_SIZE(64*8, 32*8) diff -Nru mame-0.144/src/mame/drivers/koikoi.c mame-0.145/src/mame/drivers/koikoi.c --- mame-0.144/src/mame/drivers/koikoi.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/koikoi.c 2012-02-06 21:30:35.000000000 +0000 @@ -132,10 +132,10 @@ state->m_tmap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE(koikoi) +static SCREEN_UPDATE_IND16(koikoi) { - koikoi_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tmap, 0, 0); + koikoi_state *state = screen.machine().driver_data(); + state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -149,7 +149,7 @@ { koikoi_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tmap, offset & 0x3ff); + state->m_tmap->mark_tile_dirty(offset & 0x3ff); } static READ8_DEVICE_HANDLER( input_r ) @@ -370,10 +370,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(koikoi) + MCFG_SCREEN_UPDATE_STATIC(koikoi) MCFG_GFXDECODE(koikoi) MCFG_PALETTE_LENGTH(8*32) diff -Nru mame-0.144/src/mame/drivers/konamigq.c mame-0.145/src/mame/drivers/konamigq.c --- mame-0.144/src/mame/drivers/konamigq.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/konamigq.c 2012-02-06 21:30:40.000000000 +0000 @@ -319,7 +319,7 @@ { 1, /* 1 SCSI device */ { - { SCSI_ID_0, "disk", SCSI_DEVICE_HARDDISK } /* SCSI ID 0, using CHD 0, and it's a HDD */ + { SCSI_ID_0, ":disk", SCSI_DEVICE_HARDDISK } /* SCSI ID 0, using CHD 0, and it's a HDD */ } }; diff -Nru mame-0.144/src/mame/drivers/konamigv.c mame-0.145/src/mame/drivers/konamigv.c --- mame-0.144/src/mame/drivers/konamigv.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/konamigv.c 2012-02-06 21:30:40.000000000 +0000 @@ -274,7 +274,7 @@ { 1, /* 1 SCSI device */ { - { SCSI_ID_4, "cdrom", SCSI_DEVICE_CDROM } /* SCSI ID 4, using CHD 0, and it's a CD-ROM */ + { SCSI_ID_4, ":cdrom", SCSI_DEVICE_CDROM } /* SCSI ID 4, using CHD 0, and it's a CD-ROM */ } }; diff -Nru mame-0.144/src/mame/drivers/konamigx.c mame-0.145/src/mame/drivers/konamigx.c --- mame-0.144/src/mame/drivers/konamigx.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/konamigx.c 2012-02-06 21:30:40.000000000 +0000 @@ -95,9 +95,6 @@ */ #include "emu.h" -#include "deprecat.h" - -#include "video/konamiic.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "cpu/tms57002/tms57002.h" @@ -105,6 +102,7 @@ #include "sound/k054539.h" #include "includes/konamigx.h" #include "machine/adc083x.h" +#include "video/konamiic.h" #include "rendlay.h" #define GX_DEBUG 0 @@ -659,41 +657,38 @@ dmastart_callback(0); } -static INTERRUPT_GEN(konamigx_vbinterrupt_type4) +static TIMER_DEVICE_CALLBACK(konamigx_hbinterrupt) { - // lift idle suspension - if (resume_trigger && suspension_active) { suspension_active = 0; device->machine().scheduler().trigger(resume_trigger); } - - // IRQ 1 is the main 60hz vblank interrupt - // the gx_syncen & 0x20 test doesn't work on type 3 or 4 ROM boards, likely because the ROM board - // generates the timing in those cases. With this change, rushing heroes and rng2 boot :) + konamigx_state *state = timer.machine().driver_data(); + int scanline = param; - // maybe this interrupt should only be every 30fps, or maybe there are flags to prevent the game running too fast - // the real hardware should output the display for each screen on alternate frames -// if(device->machine().primary_screen->frame_number() & 1) - if (1) // gx_syncen & 0x20) + if (scanline == 240) { - gx_syncen &= ~0x20; + // lift idle suspension + if (resume_trigger && suspension_active) { suspension_active = 0; timer.machine().scheduler().trigger(resume_trigger); } - if ((konamigx_wrport1_1 & 0x81) == 0x81 || (gx_syncen & 1)) - { - gx_syncen &= ~1; - device_set_input_line(device, 1, HOLD_LINE); + // IRQ 1 is the main 60hz vblank interrupt + // the gx_syncen & 0x20 test doesn't work on type 3 or 4 ROM boards, likely because the ROM board + // generates the timing in those cases. With this change, rushing heroes and rng2 boot :) - } - } + // maybe this interrupt should only be every 30fps, or maybe there are flags to prevent the game running too fast + // the real hardware should output the display for each screen on alternate frames + // if(device->machine().primary_screen->frame_number() & 1) + if (1) // gx_syncen & 0x20) + { + gx_syncen &= ~0x20; + if ((konamigx_wrport1_1 & 0x81) == 0x81 || (gx_syncen & 1)) + { + gx_syncen &= ~1; + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); - dmastart_callback(0); -} + } + } -static INTERRUPT_GEN(konamigx_hbinterrupt) -{ - if (!cpu_getiloops(device)) - { - konamigx_vbinterrupt_type4(device); + dmastart_callback(0); } - else // hblank + else if(scanline < 240) // hblank { // IRQ 2 is a programmable interrupt with scanline resolution if (gx_syncen & 0x40) @@ -703,7 +698,7 @@ if ((konamigx_wrport1_1 & 0x82) == 0x82 || (gx_syncen & 2)) { gx_syncen &= ~2; - device_set_input_line(device, 2, HOLD_LINE); + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } } } @@ -1785,7 +1780,7 @@ GFXDECODE_ENTRY( "gfx3", 0, bglayout_8bpp, 0x1800, 8 ) GFXDECODE_END -static MACHINE_CONFIG_START( konamigx, driver_device ) +static MACHINE_CONFIG_START( konamigx, konamigx_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68EC020, 24000000) MCFG_CPU_PROGRAM_MAP(gx_type2_map) @@ -1815,10 +1810,9 @@ tbyahhoo attract mode desync is caused by another matter. */ // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(24, 24+288-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(konamigx) + MCFG_SCREEN_UPDATE_STATIC(konamigx) MCFG_PALETTE_LENGTH(8192) @@ -1886,9 +1880,11 @@ static MACHINE_CONFIG_DERIVED( gxtype3, konamigx ) - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", M68EC020, 24000000) MCFG_CPU_PROGRAM_MAP(gx_type3_map) - MCFG_CPU_VBLANK_INT_HACK(konamigx_hbinterrupt, 262) + MCFG_TIMER_ADD_SCANLINE("scantimer", konamigx_hbinterrupt, "screen", 0, 1) MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS | VIDEO_UPDATE_AFTER_VBLANK | VIDEO_ALWAYS_UPDATE) @@ -1896,38 +1892,40 @@ MCFG_VIDEO_START(konamigx_type3) MCFG_PALETTE_LENGTH(16384) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_SIZE(576, 32*8) + MCFG_SCREEN_SIZE(576, 264) MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 16, 32*8-1-16) + MCFG_SCREEN_UPDATE_STATIC(konamigx_left) MCFG_SCREEN_ADD("screen2", RASTER) MCFG_SCREEN_RAW_PARAMS(6000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(576, 32*8) + MCFG_SCREEN_SIZE(576, 264) MCFG_SCREEN_VISIBLE_AREA(0, 576-1, 16, 32*8-1-16) - MCFG_SCREEN_UPDATE(konamigx) + MCFG_SCREEN_UPDATE_STATIC(konamigx_right) MCFG_GFXDECODE(type34) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( gxtype4, konamigx ) - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", M68EC020, 24000000) MCFG_CPU_PROGRAM_MAP(gx_type4_map) - MCFG_CPU_VBLANK_INT_HACK(konamigx_hbinterrupt, 262) + MCFG_TIMER_ADD_SCANLINE("scantimer", konamigx_hbinterrupt, "screen", 0, 1) MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS | VIDEO_UPDATE_AFTER_VBLANK | VIDEO_ALWAYS_UPDATE) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_SIZE(128*8, 32*8) + MCFG_SCREEN_SIZE(128*8, 264) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 32*8-1-16) + MCFG_SCREEN_UPDATE_STATIC(konamigx_left) MCFG_SCREEN_ADD("screen2", RASTER) MCFG_SCREEN_RAW_PARAMS(6000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(128*8, 32*8) + MCFG_SCREEN_SIZE(128*8, 264) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 16, 32*8-1-16) - MCFG_SCREEN_UPDATE(konamigx) + MCFG_SCREEN_UPDATE_STATIC(konamigx_right) MCFG_PALETTE_LENGTH(8192) MCFG_GFXDECODE(type4) diff -Nru mame-0.144/src/mame/drivers/konamim2.c mame-0.145/src/mame/drivers/konamim2.c --- mame-0.144/src/mame/drivers/konamim2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/konamim2.c 2012-02-06 21:30:40.000000000 +0000 @@ -233,9 +233,9 @@ { } -static SCREEN_UPDATE( m2 ) +static SCREEN_UPDATE_IND16( m2 ) { - konamim2_state *state = screen->machine().driver_data(); + konamim2_state *state = screen.machine().driver_data(); int i, j; UINT32 fb_start = 0xffffffff; @@ -250,7 +250,7 @@ for (j=0; j < 384; j++) { UINT16 *fb = &frame[(j*512)]; - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); for (i=0; i < 512; i++) { d[i^3] = *fb++ & 0x7fff; @@ -259,7 +259,7 @@ } else { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); } return 0; } @@ -1171,10 +1171,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(m2) + MCFG_SCREEN_UPDATE_STATIC(m2) MCFG_PALETTE_LENGTH(32768) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) @@ -1280,6 +1279,12 @@ DISK_IMAGE( "639jad01", 0, BAD_DUMP SHA1(39d41d5a9d1c40636d174c8bb8172b1121e313f8) ) ROM_END +ROM_START(3do_m2) + ROM_REGION64_BE( 0x100000, "boot", 0 ) + ROM_SYSTEM_BIOS( 0, "panafz35", "Panasonic FZ-35S (3DO M2)" ) + ROMX_LOAD( "fz35_jpn.bin", 0x000000, 0x100000, CRC(e1c5bfd3) SHA1(0a3e27d672be79eeee1d2dc2da60d82f6eba7934), ROM_BIOS(1) ) +ROM_END + static DRIVER_INIT( m2 ) { konamim2_state *state = machine.driver_data(); @@ -1297,3 +1302,5 @@ GAME( 1998, evilngt, 0, m2, m2, m2, ROT0, "Konami", "Evil Night (ver UBA)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 1998, evilngte, evilngt, m2, m2, m2, ROT0, "Konami", "Evil Night (ver EAA)", GAME_NOT_WORKING | GAME_NO_SOUND ) GAME( 1998, hellngt, evilngt, m2, m2, m2, ROT0, "Konami", "Hell Night (ver EAA)", GAME_NOT_WORKING | GAME_NO_SOUND ) + +CONS( 199?, 3do_m2, 0, 0, m2, m2, 0, "3DO", "3DO M2", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/konendev.c mame-0.145/src/mame/drivers/konendev.c --- mame-0.144/src/mame/drivers/konendev.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/konendev.c 2012-02-06 21:30:36.000000000 +0000 @@ -8,6 +8,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" #include "cpu/arm7/arm7.h" @@ -18,13 +20,18 @@ { public: konendev_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } -}; +protected: + // devices + required_device m_maincpu; +}; -static ADDRESS_MAP_START( konendev_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( konendev_map, AS_PROGRAM, 32, konendev_state ) AM_RANGE(0x000000, 0x0fffff) AM_ROM // main program ADDRESS_MAP_END @@ -157,11 +164,11 @@ { UINT8 *src = machine.region( "maincpu" )->base(); size_t srcsize = machine.region( "maincpu" )->bytes(); - for (int i=0;imachine().device("k056832"); + device_t *k056832 = screen.machine().device("k056832"); - bitmap_fill(bitmap, cliprect, 0); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(0, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); // k056832_tilemap_draw(k056832, bitmap, cliprect, 3, 0, 0); // k056832_tilemap_draw(k056832, bitmap, cliprect, 2, 0, 0); @@ -147,10 +147,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(kongambl) + MCFG_SCREEN_UPDATE_STATIC(kongambl) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/kopunch.c mame-0.145/src/mame/drivers/kopunch.c --- mame-0.144/src/mame/drivers/kopunch.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/kopunch.c 2012-02-06 21:30:36.000000000 +0000 @@ -202,10 +202,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(kopunch) + MCFG_SCREEN_UPDATE_STATIC(kopunch) MCFG_GFXDECODE(kopunch) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/ksayakyu.c mame-0.145/src/mame/drivers/ksayakyu.c --- mame-0.144/src/mame/drivers/ksayakyu.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ksayakyu.c 2012-02-06 21:30:40.000000000 +0000 @@ -291,10 +291,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(ksayakyu) + MCFG_SCREEN_UPDATE_STATIC(ksayakyu) MCFG_GFXDECODE(ksayakyu) MCFG_PALETTE_INIT(ksayakyu) diff -Nru mame-0.144/src/mame/drivers/ksys573.c mame-0.145/src/mame/drivers/ksys573.c --- mame-0.144/src/mame/drivers/ksys573.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/ksys573.c 2012-02-06 21:30:42.000000000 +0000 @@ -461,7 +461,7 @@ } } -static const char *const diskregions[] = { "cdrom0", "cdrom1" }; +static const char *const diskregions[] = { ":cdrom0", ":cdrom1" }; static WRITE32_HANDLER( mb89371_w ) { diff -Nru mame-0.144/src/mame/drivers/kungfur.c mame-0.145/src/mame/drivers/kungfur.c --- mame-0.144/src/mame/drivers/kungfur.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/kungfur.c 2012-02-06 21:30:38.000000000 +0000 @@ -81,46 +81,46 @@ #define LED_ON 0x0001 #define LED_OFF 0x0000 -static void draw_led(bitmap_t *bitmap, int x, int y,UINT8 value) +static void draw_led(bitmap_ind16 &bitmap, int x, int y,UINT8 value) { - plot_box(bitmap, x, y, 6, 10, 0x00000000); + bitmap.plot_box(x, y, 6, 10, 0x00000000); /*a*/ - *BITMAP_ADDR16(bitmap, y+0, x+1) = ((value & 0x01) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+0, x+2) = ((value & 0x01) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+0, x+3) = ((value & 0x01) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+1) = ((value & 0x01) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+2) = ((value & 0x01) ? LED_ON : LED_OFF); + bitmap.pix16(y+0, x+3) = ((value & 0x01) ? LED_ON : LED_OFF); /*b*/ - *BITMAP_ADDR16(bitmap, y+1, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+2, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+3, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); + bitmap.pix16(y+1, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); + bitmap.pix16(y+2, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); + bitmap.pix16(y+3, x+4) = ((value & 0x02) ? LED_ON : LED_OFF); /*c*/ - *BITMAP_ADDR16(bitmap, y+5, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+6, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+7, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); + bitmap.pix16(y+5, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); + bitmap.pix16(y+6, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); + bitmap.pix16(y+7, x+4) = ((value & 0x04) ? LED_ON : LED_OFF); /*d*/ - *BITMAP_ADDR16(bitmap, y+8, x+1) = ((value & 0x08) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+8, x+2) = ((value & 0x08) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+8, x+3) = ((value & 0x08) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+1) = ((value & 0x08) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+2) = ((value & 0x08) ? LED_ON : LED_OFF); + bitmap.pix16(y+8, x+3) = ((value & 0x08) ? LED_ON : LED_OFF); /*e*/ - *BITMAP_ADDR16(bitmap, y+5, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+6, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+7, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); + bitmap.pix16(y+5, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); + bitmap.pix16(y+6, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); + bitmap.pix16(y+7, x+0) = ((value & 0x10) ? LED_ON : LED_OFF); /*f*/ - *BITMAP_ADDR16(bitmap, y+1, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+2, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+3, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); + bitmap.pix16(y+1, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); + bitmap.pix16(y+2, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); + bitmap.pix16(y+3, x+0) = ((value & 0x20) ? LED_ON : LED_OFF); /*g*/ - *BITMAP_ADDR16(bitmap, y+4, x+1) = ((value & 0x40) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+4, x+2) = ((value & 0x40) ? LED_ON : LED_OFF); - *BITMAP_ADDR16(bitmap, y+4, x+3) = ((value & 0x40) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+1) = ((value & 0x40) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+2) = ((value & 0x40) ? LED_ON : LED_OFF); + bitmap.pix16(y+4, x+3) = ((value & 0x40) ? LED_ON : LED_OFF); /*"point" (just for debugging)*/ - *BITMAP_ADDR16(bitmap, y+9, x+4) = ((value & 0x80) ? LED_ON : LED_OFF); + bitmap.pix16(y+9, x+4) = ((value & 0x80) ? LED_ON : LED_OFF); } /* actually debugging purpose, it will be converted to the artwork system at some point. */ -static SCREEN_UPDATE( kungfur ) +static SCREEN_UPDATE_IND16( kungfur ) { - kungfur_state *state = screen->machine().driver_data(); + kungfur_state *state = screen.machine().driver_data(); // popmessage("%02x %02x %02x %02x %02x %02x",io_data[0],io_data[1],io_data[2],io_data[3],io_data[4],io_data[5]); int i; @@ -368,10 +368,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kungfur) + MCFG_SCREEN_UPDATE_STATIC(kungfur) MCFG_PALETTE_LENGTH(512) MCFG_VIDEO_START(kungfur) diff -Nru mame-0.144/src/mame/drivers/kyugo.c mame-0.145/src/mame/drivers/kyugo.c --- mame-0.144/src/mame/drivers/kyugo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/kyugo.c 2012-02-06 21:30:36.000000000 +0000 @@ -29,24 +29,11 @@ /************************************* * - * Memory handlers - * - *************************************/ - -static WRITE8_HANDLER( kyugo_sub_cpu_control_w ) -{ - kyugo_state *state = space->machine().driver_data(); - device_set_input_line(state->m_subcpu, INPUT_LINE_HALT, data ? CLEAR_LINE : ASSERT_LINE); -} - - -/************************************* - * * Main CPU memory handlers * *************************************/ -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( kyugo_main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(kyugo_bgvideoram_w) AM_BASE_MEMBER(kyugo_state, m_bgvideoram) AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(kyugo_bgattribram_w) AM_BASE_MEMBER(kyugo_state, m_bgattribram) @@ -67,18 +54,25 @@ * *************************************/ -#define Main_PortMap( name, base ) \ -static ADDRESS_MAP_START( name##_portmap, AS_IO, 8 ) \ - ADDRESS_MAP_GLOBAL_MASK(0xff) \ - AM_RANGE(base+0, base+0) AM_WRITE(interrupt_enable_w) \ - AM_RANGE(base+1, base+1) AM_WRITE(kyugo_flipscreen_w) \ - AM_RANGE(base+2, base+2) AM_WRITE(kyugo_sub_cpu_control_w) \ -ADDRESS_MAP_END +static WRITE8_HANDLER( kyugo_nmi_mask_w ) +{ + kyugo_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + +static WRITE8_HANDLER( kyugo_sub_cpu_control_w ) +{ + kyugo_state *state = space->machine().driver_data(); + device_set_input_line(state->m_subcpu, INPUT_LINE_HALT, data ? CLEAR_LINE : ASSERT_LINE); +} -Main_PortMap( gyrodine, 0x00 ) -Main_PortMap( flashgal, 0x40 ) -Main_PortMap( flashgala, 0xc0 ) -Main_PortMap( srdmissn, 0x08 ) +static ADDRESS_MAP_START( kyugo_main_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0x07) + AM_RANGE(0x00, 0x00) AM_WRITE(kyugo_nmi_mask_w) + AM_RANGE(0x01, 0x01) AM_WRITE(kyugo_flipscreen_w) + AM_RANGE(0x02, 0x02) AM_WRITE(kyugo_sub_cpu_control_w) +ADDRESS_MAP_END @@ -88,20 +82,49 @@ * *************************************/ -#define Sub_MemMap( name, rom_end, shared, in0, in1, in2 ) \ -static ADDRESS_MAP_START( name##_sub_map, AS_PROGRAM, 8 ) \ - AM_RANGE(0x0000, rom_end) AM_ROM \ - AM_RANGE(shared, shared+0x7ff) AM_RAM AM_SHARE("share1") \ - AM_RANGE(in0, in0) AM_READ_PORT("SYSTEM") \ - AM_RANGE(in1, in1) AM_READ_PORT("P1") \ - AM_RANGE(in2, in2) AM_READ_PORT("P2") \ +static ADDRESS_MAP_START( gyrodine_sub_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x4000, 0x47ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x8000, 0x8000) AM_READ_PORT("P2") + AM_RANGE(0x8040, 0x8040) AM_READ_PORT("P1") + AM_RANGE(0x8080, 0x8080) AM_READ_PORT("SYSTEM") ADDRESS_MAP_END -Sub_MemMap( gyrodine, 0x1fff, 0x4000, 0x8080, 0x8040, 0x8000 ) -Sub_MemMap( repulse, 0x7fff, 0xa000, 0xc080, 0xc040, 0xc000 ) -Sub_MemMap( srdmissn, 0x7fff, 0x8000, 0xf400, 0xf401, 0xf402 ) -Sub_MemMap( legend, 0x7fff, 0xc000, 0xf800, 0xf801, 0xf802 ) -Sub_MemMap( flashgala,0x7fff, 0xe000, 0xc040, 0xc080, 0xc0c0 ) + +static ADDRESS_MAP_START( repulse_sub_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0xc000, 0xc000) AM_READ_PORT("P2") + AM_RANGE(0xc040, 0xc040) AM_READ_PORT("P1") + AM_RANGE(0xc080, 0xc080) AM_READ_PORT("SYSTEM") +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( srdmissn_sub_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0xf400, 0xf400) AM_READ_PORT("SYSTEM") + AM_RANGE(0xf401, 0xf401) AM_READ_PORT("P1") + AM_RANGE(0xf402, 0xf402) AM_READ_PORT("P2") +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( legend_sub_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0xf800, 0xf800) AM_READ_PORT("SYSTEM") + AM_RANGE(0xf801, 0xf801) AM_READ_PORT("P1") + AM_RANGE(0xf802, 0xf802) AM_READ_PORT("P2") +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( flashgala_sub_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0xc040, 0xc040) AM_READ_PORT("SYSTEM") + AM_RANGE(0xc080, 0xc080) AM_READ_PORT("P1") + AM_RANGE(0xc0c0, 0xc0c0) AM_READ_PORT("P2") + AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_SHARE("share1") +ADDRESS_MAP_END @@ -111,18 +134,45 @@ * *************************************/ -#define Sub_PortMap( name, ay0_base, ay1_base ) \ -static ADDRESS_MAP_START( name##_sub_portmap, AS_IO, 8 ) \ - ADDRESS_MAP_GLOBAL_MASK(0xff) \ - AM_RANGE(ay0_base+0, ay0_base+1) AM_DEVWRITE("ay1", ay8910_address_data_w) \ - AM_RANGE(ay0_base+2, ay0_base+2) AM_DEVREAD("ay1", ay8910_r) \ - AM_RANGE(ay1_base+0, ay1_base+1) AM_DEVWRITE("ay2", ay8910_address_data_w) \ -ADDRESS_MAP_END \ - -Sub_PortMap( gyrodine, 0x00, 0xc0 ) -Sub_PortMap( repulse, 0x00, 0x40 ) -Sub_PortMap( srdmissn, 0x80, 0x84 ) -Sub_PortMap( flashgala,0x40, 0x80 ) +static WRITE8_HANDLER( kyugo_coin_counter_w ) +{ + coin_counter_w(space->machine(), offset, data & 1); +} + +static ADDRESS_MAP_START( gyrodine_sub_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_address_data_w) + AM_RANGE(0x02, 0x02) AM_DEVREAD("ay1", ay8910_r) + AM_RANGE(0xc0, 0xc1) AM_DEVWRITE("ay2", ay8910_address_data_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( repulse_sub_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_address_data_w) + AM_RANGE(0x02, 0x02) AM_DEVREAD("ay1", ay8910_r) + AM_RANGE(0x40, 0x41) AM_DEVWRITE("ay2", ay8910_address_data_w) + AM_RANGE(0xc0, 0xc1) AM_WRITE(kyugo_coin_counter_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( flashgala_sub_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x40, 0x41) AM_DEVWRITE("ay1", ay8910_address_data_w) + AM_RANGE(0x42, 0x42) AM_DEVREAD("ay1", ay8910_r) + AM_RANGE(0x80, 0x81) AM_DEVWRITE("ay2", ay8910_address_data_w) + AM_RANGE(0xc0, 0xc1) AM_WRITE(kyugo_coin_counter_w) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( srdmissn_sub_portmap, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x80, 0x81) AM_DEVWRITE("ay1", ay8910_address_data_w) + AM_RANGE(0x82, 0x82) AM_DEVREAD("ay1", ay8910_r) + AM_RANGE(0x84, 0x85) AM_DEVWRITE("ay2", ay8910_address_data_w) + AM_RANGE(0x90, 0x91) AM_WRITE(kyugo_coin_counter_w) +ADDRESS_MAP_END + /************************************* @@ -466,7 +516,7 @@ kyugo_state *state = machine.driver_data(); address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); // must start with interrupts and sub CPU disabled - cpu_interrupt_enable(machine.device("maincpu"), 0); + state->m_nmi_mask = 0; kyugo_sub_cpu_control_w(space, 0, 0); state->m_scroll_x_lo = 0; @@ -477,14 +527,22 @@ state->m_flipscreen = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + kyugo_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( gyrodine, kyugo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) /* verified on pcb */ - MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_IO_MAP(gyrodine_portmap) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_PROGRAM_MAP(kyugo_main_map) + MCFG_CPU_IO_MAP(kyugo_main_portmap) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("sub", Z80, XTAL_18_432MHz/6) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(gyrodine_sub_map) @@ -500,10 +558,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(kyugo) + MCFG_SCREEN_UPDATE_STATIC(kyugo) MCFG_GFXDECODE(kyugo) MCFG_PALETTE_LENGTH(256) @@ -533,27 +590,14 @@ static MACHINE_CONFIG_DERIVED( srdmissn, gyrodine ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_IO_MAP(srdmissn_portmap) - MCFG_CPU_MODIFY("sub") MCFG_CPU_PROGRAM_MAP(srdmissn_sub_map) MCFG_CPU_IO_MAP(srdmissn_sub_portmap) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( flashgal, repulse ) - - /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_IO_MAP(flashgal_portmap) -MACHINE_CONFIG_END - static MACHINE_CONFIG_DERIVED( flashgala, gyrodine ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_IO_MAP(flashgala_portmap) - MCFG_CPU_MODIFY("sub") MCFG_CPU_PROGRAM_MAP(flashgala_sub_map) MCFG_CPU_IO_MAP(flashgala_sub_portmap) @@ -1363,7 +1407,7 @@ GAME( 1985, 99lstwara, repulse, repulse, repulse, 0, ROT90, "Sega (Proma license)", "'99: The Last War (alternate)", GAME_SUPPORTS_SAVE ) GAME( 1985, 99lstwark, repulse, repulse, repulse, 0, ROT90, "Sega (Kyugo license)", "'99: The Last War (Kyugo)", GAME_SUPPORTS_SAVE ) GAME( 1985, sonofphx, repulse, repulse, repulse, 0, ROT90, "bootleg (Associated Overseas MFR, Inc)", "Son of Phoenix", GAME_SUPPORTS_SAVE ) -GAME( 1985, flashgal, 0, flashgal, flashgal, 0, ROT0, "Sega", "Flashgal (set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1985, flashgal, 0, repulse, flashgal, 0, ROT0, "Sega", "Flashgal (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1985, flashgala, flashgal, flashgala,flashgal, 0, ROT0, "Sega", "Flashgal (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1986, srdmissn, 0, srdmissn, srdmissn, srdmissn, ROT90, "Taito Corporation", "S.R.D. Mission", GAME_SUPPORTS_SAVE ) GAME( 1986, fx, srdmissn, srdmissn, srdmissn, srdmissn, ROT90, "bootleg", "F-X", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/labyrunr.c mame-0.145/src/mame/drivers/labyrunr.c --- mame-0.144/src/mame/drivers/labyrunr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/labyrunr.c 2012-02-06 21:30:37.000000000 +0000 @@ -9,7 +9,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/hd6309/hd6309.h" #include "sound/2203intf.h" #include "video/konicdev.h" @@ -17,20 +16,15 @@ #include "includes/labyrunr.h" -static INTERRUPT_GEN( labyrunr_interrupt ) +static TIMER_DEVICE_CALLBACK( labyrunr_scanline ) { - labyrunr_state *state = device->machine().driver_data(); + labyrunr_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) == 0) - { - if (k007121_ctrlram_r(state->m_k007121, 7) & 0x02) - device_set_input_line(device, HD6309_IRQ_LINE, HOLD_LINE); - } - else if (cpu_getiloops(device) % 2) - { - if (k007121_ctrlram_r(state->m_k007121, 7) & 0x01) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } + if(scanline == 240 && k007121_ctrlram_r(state->m_k007121, 7) & 0x02) // vblank irq + device_set_input_line(state->m_maincpu, HD6309_IRQ_LINE, HOLD_LINE); + else if(((scanline % 32) == 0) && k007121_ctrlram_r(state->m_k007121, 7) & 0x01) // timer irq + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } static WRITE8_HANDLER( labyrunr_bankswitch_w ) @@ -92,43 +86,43 @@ KONAMI8_COCKTAIL_B12_START PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), DEF_STR( None )) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SW1) /* "None" = coin slot B disabled */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30000 70000" ) PORT_DIPSETTING( 0x10, "40000 80000" ) PORT_DIPSETTING( 0x08, "40000" ) PORT_DIPSETTING( 0x00, "50000" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Continues ) ) - PORT_DIPSETTING( 0x08, "3" ) - PORT_DIPSETTING( 0x00, "5" ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:4") + PORT_DIPSETTING( 0x08, "3 Times" ) + PORT_DIPSETTING( 0x00, "5 Times" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -198,7 +192,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", HD6309, 3000000*4) /* 24MHz/8? */ MCFG_CPU_PROGRAM_MAP(labyrunr_map) - MCFG_CPU_VBLANK_INT_HACK(labyrunr_interrupt,8) /* 1 IRQ + 4 NMI (generated by 007121) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", labyrunr_scanline, "screen", 0, 1) MCFG_MACHINE_START(labyrunr) @@ -206,10 +200,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(37*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 35*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(labyrunr) + MCFG_SCREEN_UPDATE_STATIC(labyrunr) MCFG_GFXDECODE(labyrunr) MCFG_PALETTE_LENGTH(2*8*16*16) diff -Nru mame-0.144/src/mame/drivers/ladybug.c mame-0.145/src/mame/drivers/ladybug.c --- mame-0.144/src/mame/drivers/ladybug.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/ladybug.c 2012-02-06 21:30:41.000000000 +0000 @@ -785,10 +785,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(ladybug) + MCFG_SCREEN_UPDATE_STATIC(ladybug) MCFG_GFXDECODE(ladybug) MCFG_PALETTE_LENGTH(4*8+4*16) @@ -826,11 +825,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(sraider) - MCFG_SCREEN_EOF(sraider) + MCFG_SCREEN_UPDATE_STATIC(sraider) + MCFG_SCREEN_VBLANK_STATIC(sraider) MCFG_GFXDECODE(sraider) MCFG_PALETTE_LENGTH(4*8+4*16+32+2) diff -Nru mame-0.144/src/mame/drivers/ladyfrog.c mame-0.145/src/mame/drivers/ladyfrog.c --- mame-0.144/src/mame/drivers/ladyfrog.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ladyfrog.c 2012-02-06 21:30:38.000000000 +0000 @@ -328,10 +328,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 29*8-1) // black borders in ladyfrog gameplay are correct - MCFG_SCREEN_UPDATE(ladyfrog) + MCFG_SCREEN_UPDATE_STATIC(ladyfrog) MCFG_GFXDECODE(ladyfrog) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/laserbas.c mame-0.145/src/mame/drivers/laserbas.c --- mame-0.144/src/mame/drivers/laserbas.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/laserbas.c 2012-02-06 21:30:41.000000000 +0000 @@ -60,23 +60,23 @@ state->save_item(NAME(state->m_vram2)); } -static SCREEN_UPDATE(laserbas) +static SCREEN_UPDATE_IND16(laserbas) { - laserbas_state *state = screen->machine().driver_data(); + laserbas_state *state = screen.machine().driver_data(); int x, y; for (y = 0; y < 256; y++) for(x = 0; x < 128; x++) { if (state->m_vram2[y * 128 + x] & 0xf) - *BITMAP_ADDR16(bitmap, y, x * 2) = (state->m_vram2[y * 128 + x] & 0xf); + bitmap.pix16(y, x * 2) = (state->m_vram2[y * 128 + x] & 0xf); else - *BITMAP_ADDR16(bitmap, y, x * 2) = (state->m_vram1[y * 128 + x] & 0xf) + 16; + bitmap.pix16(y, x * 2) = (state->m_vram1[y * 128 + x] & 0xf) + 16; if (state->m_vram2[y * 128 + x] >> 4) - *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = (state->m_vram2[y * 128 + x] >> 4); + bitmap.pix16(y, x * 2 + 1) = (state->m_vram2[y * 128 + x] >> 4); else - *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = (state->m_vram1[y * 128 + x] >> 4) + 16; + bitmap.pix16(y, x * 2 + 1) = (state->m_vram1[y * 128 + x] >> 4) + 16; } return 0; } @@ -317,11 +317,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(laserbas) + MCFG_SCREEN_UPDATE_STATIC(laserbas) MCFG_MC6845_ADD("crtc", H46505, 3000000/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */ diff -Nru mame-0.144/src/mame/drivers/laserbat.c mame-0.145/src/mame/drivers/laserbat.c --- mame-0.144/src/mame/drivers/laserbat.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/laserbat.c 2012-02-06 21:30:41.000000000 +0000 @@ -34,12 +34,12 @@ if (state->m_video_page == 0) { state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } else if (state->m_video_page == 1) { state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); // wrong! + state->m_bg_tilemap->mark_tile_dirty(offset); // wrong! } } @@ -503,45 +503,42 @@ state->save_item(NAME(state->m_colorram)); } -static SCREEN_UPDATE( laserbat ) +static SCREEN_UPDATE_IND16( laserbat ) { - laserbat_state *state = screen->machine().driver_data(); + laserbat_state *state = screen.machine().driver_data(); int y; - bitmap_t *s2636_1_bitmap; - bitmap_t *s2636_2_bitmap; - bitmap_t *s2636_3_bitmap; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* update the S2636 chips */ - s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); - s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); - s2636_3_bitmap = s2636_update(state->m_s2636_3, cliprect); + bitmap_ind16 &s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); + bitmap_ind16 &s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); + bitmap_ind16 &s2636_3_bitmap = s2636_update(state->m_s2636_3, cliprect); /* copy the S2636 images into the main bitmap */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - int pixel1 = *BITMAP_ADDR16(s2636_1_bitmap, y, x); - int pixel2 = *BITMAP_ADDR16(s2636_2_bitmap, y, x); - int pixel3 = *BITMAP_ADDR16(s2636_3_bitmap, y, x); + int pixel1 = s2636_1_bitmap.pix16(y, x); + int pixel2 = s2636_2_bitmap.pix16(y, x); + int pixel3 = s2636_3_bitmap.pix16(y, x); if (S2636_IS_PIXEL_DRAWN(pixel1)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel1); if (S2636_IS_PIXEL_DRAWN(pixel2)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel2); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel2); if (S2636_IS_PIXEL_DRAWN(pixel3)) - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel3); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel3); } } if (state->m_sprite_enable) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_sprite_code, state->m_sprite_color, 0,0, @@ -780,10 +777,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(1*8, 29*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(laserbat) + MCFG_SCREEN_UPDATE_STATIC(laserbat) MCFG_GFXDECODE(laserbat) MCFG_PALETTE_LENGTH(1024) @@ -828,10 +824,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(laserbat) + MCFG_SCREEN_UPDATE_STATIC(laserbat) MCFG_GFXDECODE(laserbat) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/lasso.c mame-0.145/src/mame/drivers/lasso.c --- mame-0.144/src/mame/drivers/lasso.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/lasso.c 2012-02-06 21:30:35.000000000 +0000 @@ -4,21 +4,22 @@ driver by Phil Stroffolino, Nicola Salmoria, Luca Elia ---------------------------------------------------------------------------- -Year + Game By CPUs Sound Chips ---------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- +Year + Game By CPUs Sound Chips Misc Info +-------------------------------------------------------------------------------------- 82 Lasso SNK 3 x 6502 2 x SN76489 83 Chameleon Jaleco 2 x 6502 2 x SN76489 84 Wai Wai Jockey Gate-In! Jaleco/Casio 2 x 6502 2 x SN76489 + DAC -84 Pinbo Jaleco 6502 + Z80 2 x AY-8910 ---------------------------------------------------------------------------- +84 Pinbo Jaleco 6502 + Z80 2 x AY-8910 6502 @ 18MHz/24, Z80 @ 18MHz/6, AY @ 18MHz/12 +-------------------------------------------------------------------------------------- Notes: -- unknown CPU speeds (affect game timing), currently using same as the - Rock-Ola games of the same area. Lot of similarities between these - hardware. The music ends at the perfect time with this clock speed +- unknown CPU speeds unless noted above (affect game timing), currently using + same as the Rock-Ola games of the same area. Lot of similarities between + these hardware. The music ends at the perfect time with this clock speed - Lasso: fire button auto-repeats on high score entry screen (real behavior?) +- Pinbo: bgcolor is wrong, how does it generate it? ($a0, should be darkblue) *************************************************************************** @@ -181,6 +182,7 @@ AM_RANGE(0x0800, 0x0bff) AM_RAM_WRITE(lasso_colorram_w) AM_BASE_MEMBER(lasso_state, m_colorram) AM_RANGE(0x1000, 0x10ff) AM_RAM AM_BASE_SIZE_MEMBER(lasso_state, m_spriteram, m_spriteram_size) AM_RANGE(0x1800, 0x1800) AM_WRITE(pinbo_sound_command_w) + AM_RANGE(0x1801, 0x1801) AM_WRITEONLY AM_BASE_MEMBER(lasso_state, m_back_color) AM_RANGE(0x1802, 0x1802) AM_WRITE(pinbo_video_control_w) AM_RANGE(0x1804, 0x1804) AM_READ_PORT("1804") AM_RANGE(0x1805, 0x1805) AM_READ_PORT("1805") @@ -518,10 +520,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) /* guess, but avoids glitching of Chameleon's high score table */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lasso) + MCFG_SCREEN_UPDATE_STATIC(lasso) MCFG_GFXDECODE(lasso) MCFG_PALETTE_LENGTH(0x40) @@ -558,7 +559,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(chameleo) + MCFG_SCREEN_UPDATE_STATIC(chameleo) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( wwjgtin, base ) @@ -576,7 +577,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) // Smaller visible area? - MCFG_SCREEN_UPDATE(wwjgtin) + MCFG_SCREEN_UPDATE_STATIC(wwjgtin) MCFG_GFXDECODE(wwjgtin) // Has 1 additional layer MCFG_PALETTE_LENGTH(0x40 + 16*16) @@ -591,30 +592,30 @@ static MACHINE_CONFIG_DERIVED( pinbo, base ) /* basic machine hardware */ - MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", M6502, XTAL_18MHz/24) MCFG_CPU_PROGRAM_MAP(pinbo_main_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) - MCFG_CPU_REPLACE("audiocpu", Z80, 3000000) + MCFG_CPU_REPLACE("audiocpu", Z80, XTAL_18MHz/6) MCFG_CPU_PROGRAM_MAP(pinbo_audio_map) MCFG_CPU_IO_MAP(pinbo_audio_io_map) /* video hardware */ MCFG_GFXDECODE(pinbo) MCFG_PALETTE_LENGTH(256) - MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) MCFG_VIDEO_START(pinbo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(pinbo) + MCFG_SCREEN_UPDATE_STATIC(chameleo) /* sound hardware */ MCFG_DEVICE_REMOVE("sn76489.1") MCFG_DEVICE_REMOVE("sn76489.2") - MCFG_SOUND_ADD("ay1", AY8910, 1250000) + MCFG_SOUND_ADD("ay1", AY8910, XTAL_18MHz/12) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.55) - MCFG_SOUND_ADD("ay2", AY8910, 1250000) + MCFG_SOUND_ADD("ay2", AY8910, XTAL_18MHz/12) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.55) MACHINE_CONFIG_END @@ -789,9 +790,9 @@ ROM_CONTINUE( 0xb800, 0x0800 ) ROM_REGION( 0x00300, "proms", 0 ) - ROM_LOAD( "red.l10", 0x0000, 0x0100, CRC(e6c9ba52) SHA1(6ea96f9bd71de6181d675b0f2d59a8c5e1be5aa3) ) - ROM_LOAD( "green.k10", 0x0100, 0x0100, CRC(1bf2d335) SHA1(dcb074d3de939dfc652743e25bc66bd6fbdc3289) ) - ROM_LOAD( "blue.n10", 0x0200, 0x0100, CRC(e41250ad) SHA1(2e9a2babbacb1753057d46cf1dd6dc183611747e) ) + ROM_LOAD( "red.l10", 0x0000, 0x0100, CRC(e6c9ba52) SHA1(6ea96f9bd71de6181d675b0f2d59a8c5e1be5aa3) ) // 2nd half is garbage? + ROM_LOAD( "green.k10", 0x0100, 0x0100, CRC(1bf2d335) SHA1(dcb074d3de939dfc652743e25bc66bd6fbdc3289) ) // " + ROM_LOAD( "blue.n10", 0x0200, 0x0100, CRC(e41250ad) SHA1(2e9a2babbacb1753057d46cf1dd6dc183611747e) ) // " ROM_END ROM_START( pinboa ) diff -Nru mame-0.144/src/mame/drivers/lastbank.c mame-0.145/src/mame/drivers/lastbank.c --- mame-0.144/src/mame/drivers/lastbank.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/lastbank.c 2012-02-06 21:30:40.000000000 +0000 @@ -25,7 +25,7 @@ } -static SCREEN_UPDATE( lastbank ) +static SCREEN_UPDATE_IND16( lastbank ) { return 0; } @@ -121,10 +121,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lastbank) + MCFG_SCREEN_UPDATE_STATIC(lastbank) MCFG_GFXDECODE( lastbank ) @@ -158,4 +157,4 @@ ROM_LOAD( "7.u60", 0x40000, 0x80000, CRC(41be7146) SHA1(00f1c0d5809efccf888e27518a2a5876c4b633d8) ) ROM_END -GAME( 1994, lastbank, 0, lastbank, lastbank, 0, ROT0, "Excellent Systems", "Last Bank", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 1994, lastbank, 0, lastbank, lastbank, 0, ROT0, "Excellent Systems", "Last Bank", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/lastduel.c mame-0.145/src/mame/drivers/lastduel.c --- mame-0.144/src/mame/drivers/lastduel.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/lastduel.c 2012-02-06 21:30:41.000000000 +0000 @@ -117,7 +117,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/2203intf.h" #include "sound/okim6295.h" #include "includes/lastduel.h" @@ -456,28 +455,24 @@ irqhandler }; -static INTERRUPT_GEN( lastduel_interrupt ) +static TIMER_DEVICE_CALLBACK( lastduel_timer_cb ) { - if (cpu_getiloops(device) == 0) - device_set_input_line(device, 2, HOLD_LINE); /* VBL */ - else - device_set_input_line(device, 4, HOLD_LINE); /* Controls */ + lastduel_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); /* Controls */ } -static INTERRUPT_GEN( madgear_interrupt ) +static TIMER_DEVICE_CALLBACK( madgear_timer_cb ) { - if (cpu_getiloops(device) == 0) - device_set_input_line(device, 5, HOLD_LINE); /* VBL */ - else - device_set_input_line(device, 6, HOLD_LINE); /* Controls */ + lastduel_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); /* Controls */ } static MACHINE_START( lastduel ) { lastduel_state *state = machine.driver_data(); - state->m_audiocpu = machine.device("audiocpu"); - state->save_item(NAME(state->m_tilemap_priority)); state->save_item(NAME(state->m_scroll)); } @@ -507,7 +502,8 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 10000000) /* Could be 8 MHz */ MCFG_CPU_PROGRAM_MAP(lastduel_map) - MCFG_CPU_VBLANK_INT_HACK(lastduel_interrupt,3) /* 1 for vbl, 2 for control reads?? */ + MCFG_CPU_VBLANK_INT("screen",irq2_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", lastduel_timer_cb, attotime::from_hz(120)) /* control reads?? */ MCFG_CPU_ADD("audiocpu", Z80, 3579545) /* Accurate */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -521,11 +517,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(lastduel) - MCFG_SCREEN_EOF(lastduel) + MCFG_SCREEN_UPDATE_STATIC(lastduel) + MCFG_SCREEN_VBLANK_STATIC(lastduel) MCFG_GFXDECODE(lastduel) MCFG_PALETTE_LENGTH(1024) @@ -549,7 +544,8 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 10000000) /* Accurate */ MCFG_CPU_PROGRAM_MAP(madgear_map) - MCFG_CPU_VBLANK_INT_HACK(madgear_interrupt,3) /* 1 for vbl, 2 for control reads?? */ + MCFG_CPU_VBLANK_INT("screen",irq5_line_hold) + MCFG_TIMER_ADD_PERIODIC("timer_irq", madgear_timer_cb, attotime::from_hz(120)) /* control reads?? */ MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(madgear_sound_map) @@ -563,11 +559,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(madgear) - MCFG_SCREEN_EOF(lastduel) + MCFG_SCREEN_UPDATE_STATIC(madgear) + MCFG_SCREEN_VBLANK_STATIC(lastduel) MCFG_GFXDECODE(madgear) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/lastfght.c mame-0.145/src/mame/drivers/lastfght.c --- mame-0.144/src/mame/drivers/lastfght.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/lastfght.c 2012-02-06 21:30:41.000000000 +0000 @@ -63,7 +63,6 @@ *********************************************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/h83002/h8.h" #include "machine/nvram.h" @@ -71,10 +70,12 @@ { public: lastfght_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* video-related */ - bitmap_t *m_bitmap[2]; + bitmap_ind16 m_bitmap[2]; int m_clr_offset; int m_dest; int m_hi; @@ -97,7 +98,7 @@ UINT16 m_c00006; /* devices */ - device_t *m_maincpu; + required_device m_maincpu; /* memory */ UINT8 m_colorram[256 * 3]; @@ -113,41 +114,41 @@ lastfght_state *state = machine.driver_data(); int i; for (i = 0; i < 2; i++) - state->m_bitmap[i] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap[i]); - state->save_item(NAME(*state->m_bitmap[0])); - state->save_item(NAME(*state->m_bitmap[1])); + state->save_item(NAME(state->m_bitmap[0])); + state->save_item(NAME(state->m_bitmap[1])); state->save_item(NAME(state->m_colorram)); } -static SCREEN_UPDATE( lastfght ) +static SCREEN_UPDATE_IND16( lastfght ) { - lastfght_state *state = screen->machine().driver_data(); + lastfght_state *state = screen.machine().driver_data(); #ifdef MAME_DEBUG #if 1 // gfx roms viewer (toggle with enter, use pgup/down to browse) int x, y, count = 0; - UINT8 *gfxdata = screen->machine().region("gfx1")->base(); + UINT8 *gfxdata = screen.machine().region("gfx1")->base(); UINT8 data; - if (screen->machine().input().code_pressed_once(KEYCODE_ENTER)) state->m_view_roms ^= 1; + if (screen.machine().input().code_pressed_once(KEYCODE_ENTER)) state->m_view_roms ^= 1; if (state->m_view_roms) { - if (screen->machine().input().code_pressed_once(KEYCODE_PGDN)) state->m_base += 512 * 256; - if (screen->machine().input().code_pressed_once(KEYCODE_PGUP)) state->m_base -= 512 * 256; - state->m_base %= screen->machine().region("gfx1")->bytes(); + if (screen.machine().input().code_pressed_once(KEYCODE_PGDN)) state->m_base += 512 * 256; + if (screen.machine().input().code_pressed_once(KEYCODE_PGUP)) state->m_base -= 512 * 256; + state->m_base %= screen.machine().region("gfx1")->bytes(); count = state->m_base; - bitmap_fill(bitmap, cliprect , get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); for (y = 0 ; y < 256; y++) { for (x = 0; x < 512; x++) { - data = (((count & 0xf) == 0) && ((count & 0x1e00) == 0)) ? get_white_pen(screen->machine()) : gfxdata[count]; // white grid or data - *BITMAP_ADDR16(bitmap, y, x) = data; + data = (((count & 0xf) == 0) && ((count & 0x1e00) == 0)) ? get_white_pen(screen.machine()) : gfxdata[count]; // white grid or data + bitmap.pix16(y, x) = data; count++; } } @@ -322,7 +323,7 @@ { int x, y, addr; UINT8 *gfxdata = space->machine().region( "gfx1" )->base(); - bitmap_t *dest = state->m_bitmap[state->m_dest]; + bitmap_ind16 &dest = state->m_bitmap[state->m_dest]; #if 0 logerror("%06x: blit x %03x, y %03x, w %03x, h %03x, sx %03x.%02x, sx1 %03x.%02x, dsx %03x.%02x, sy %03x.%02x, sy1 %03x.%02x, dsy %03x.%02x, sp %02x, sr %02x, data %02x\n", cpu_get_pc(&space->device()), @@ -344,7 +345,7 @@ data = gfxdata[addr]; if (data && (state->m_x + x >= 0) && (state->m_x + x < 512) && (state->m_y + y >= 0) && (state->m_y + y < 256)) - *BITMAP_ADDR16(dest, state->m_y + y, state->m_x + x) = data; + dest.pix16(state->m_y + y, state->m_x + x) = data; } } } @@ -520,23 +521,14 @@ static INTERRUPT_GEN( unknown_interrupt ) { lastfght_state *state = device->machine().driver_data(); - switch (cpu_getiloops(device)) - { - case 0: - generic_pulse_irq_line(device, 0); - break; - default: - device_set_input_line(state->m_maincpu, H8_METRO_TIMER_HACK, HOLD_LINE); - break; - } + + device_set_input_line(state->m_maincpu, H8_METRO_TIMER_HACK, HOLD_LINE); } static MACHINE_START( lastfght ) { lastfght_state *state = machine.driver_data(); - state->m_maincpu = machine.device("maincpu"); - state->save_item(NAME(state->m_clr_offset)); state->save_item(NAME(state->m_dest)); state->save_item(NAME(state->m_hi)); @@ -582,7 +574,8 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H83044, 32000000/2) MCFG_CPU_PROGRAM_MAP( lastfght_map) - MCFG_CPU_VBLANK_INT_HACK(unknown_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",irq0_line_hold) + MCFG_CPU_PERIODIC_INT(unknown_interrupt,60) MCFG_NVRAM_ADD_0FILL("nvram") @@ -593,11 +586,10 @@ MCFG_PALETTE_LENGTH( 256 ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 512, 256 ) MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 ) MCFG_SCREEN_REFRESH_RATE( 60 ) - MCFG_SCREEN_UPDATE( lastfght ) + MCFG_SCREEN_UPDATE_STATIC( lastfght ) MCFG_VIDEO_START( lastfght ) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/lazercmd.c mame-0.145/src/mame/drivers/lazercmd.c --- mame-0.144/src/mame/drivers/lazercmd.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lazercmd.c 2012-02-06 21:30:42.000000000 +0000 @@ -221,7 +221,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/s2650/s2650.h" #include "sound/dac.h" #include "includes/lazercmd.h" @@ -237,21 +236,29 @@ * The rate should be at about 1 Hz *************************************************************/ -static INTERRUPT_GEN( lazercmd_timer ) +static TIMER_DEVICE_CALLBACK( lazercmd_timer ) { - lazercmd_state *state = device->machine().driver_data(); + lazercmd_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 2) == 1) + return; if (++state->m_timer_count >= 64 * 128) { state->m_timer_count = 0; state->m_sense_state ^= 1; - device_set_input_line(device, 1, (state->m_sense_state) ? ASSERT_LINE : CLEAR_LINE); + device_set_input_line(state->m_maincpu, 1, (state->m_sense_state) ? ASSERT_LINE : CLEAR_LINE); } } -static INTERRUPT_GEN( bbonk_timer ) +static TIMER_DEVICE_CALLBACK( bbonk_timer ) { - lazercmd_state *state = device->machine().driver_data(); + lazercmd_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 2) == 1) + return; if (++state->m_timer_count >= 64 * 128) state->m_timer_count = 0; @@ -634,7 +641,7 @@ thus requiring an extra loading of approx 3-5 */ MCFG_CPU_PROGRAM_MAP(lazercmd_map) MCFG_CPU_IO_MAP(lazercmd_portmap) - MCFG_CPU_VBLANK_INT_HACK(lazercmd_timer, 128) /* 7680 Hz */ + MCFG_TIMER_ADD_SCANLINE("scantimer", lazercmd_timer, "screen", 0, 1) /* 7680 Hz */ MCFG_MACHINE_START(lazercmd) MCFG_MACHINE_RESET(lazercmd) @@ -643,11 +650,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR) + MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR + 16) MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1) - MCFG_SCREEN_UPDATE(lazercmd) + MCFG_SCREEN_UPDATE_STATIC(lazercmd) MCFG_GFXDECODE(lazercmd) MCFG_PALETTE_LENGTH(5) @@ -672,7 +678,7 @@ thus requiring an extra loading of approx 3-5 */ MCFG_CPU_PROGRAM_MAP(medlanes_map) MCFG_CPU_IO_MAP(lazercmd_portmap) - MCFG_CPU_VBLANK_INT_HACK(lazercmd_timer, 128) /* 7680 Hz */ + MCFG_TIMER_ADD_SCANLINE("scantimer", lazercmd_timer, "screen", 0, 1) /* 7680 Hz */ MCFG_MACHINE_START(lazercmd) MCFG_MACHINE_RESET(lazercmd) @@ -681,11 +687,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR) MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, VERT_RES * VERT_CHR - 1) - MCFG_SCREEN_UPDATE(lazercmd) + MCFG_SCREEN_UPDATE_STATIC(lazercmd) MCFG_GFXDECODE(lazercmd) MCFG_PALETTE_LENGTH(5) @@ -710,7 +715,7 @@ thus requiring an extra loading of approx 3-5 */ MCFG_CPU_PROGRAM_MAP(bbonk_map) MCFG_CPU_IO_MAP(lazercmd_portmap) - MCFG_CPU_VBLANK_INT_HACK(bbonk_timer, 128) /* 7680 Hz */ + MCFG_TIMER_ADD_SCANLINE("scantimer", bbonk_timer, "screen", 0, 1) /* 7680 Hz */ MCFG_MACHINE_START(lazercmd) MCFG_MACHINE_RESET(lazercmd) @@ -719,11 +724,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(HORZ_RES * HORZ_CHR, VERT_RES * VERT_CHR) MCFG_SCREEN_VISIBLE_AREA(0 * HORZ_CHR, HORZ_RES * HORZ_CHR - 1, 0 * VERT_CHR, (VERT_RES - 1) * VERT_CHR - 1) - MCFG_SCREEN_UPDATE(lazercmd) + MCFG_SCREEN_UPDATE_STATIC(lazercmd) MCFG_GFXDECODE(lazercmd) MCFG_PALETTE_LENGTH(5) diff -Nru mame-0.144/src/mame/drivers/legionna.c mame-0.145/src/mame/drivers/legionna.c --- mame-0.144/src/mame/drivers/legionna.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/legionna.c 2012-02-06 21:30:36.000000000 +0000 @@ -1061,12 +1061,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(legionna) + MCFG_SCREEN_UPDATE_STATIC(legionna) MCFG_GFXDECODE(legionna) MCFG_PALETTE_LENGTH(128*16) @@ -1094,12 +1093,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(legionna) + MCFG_SCREEN_UPDATE_STATIC(legionna) MCFG_GFXDECODE(heatbrl) MCFG_PALETTE_LENGTH(128*16) @@ -1126,12 +1124,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(61) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(godzilla) + MCFG_SCREEN_UPDATE_STATIC(godzilla) MCFG_GFXDECODE(heatbrl) MCFG_PALETTE_LENGTH(128*16) @@ -1158,12 +1155,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_REFRESH_RATE(61) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(godzilla) + MCFG_SCREEN_UPDATE_STATIC(godzilla) MCFG_GFXDECODE(heatbrl) MCFG_PALETTE_LENGTH(128*16) @@ -1190,12 +1186,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 42*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(grainbow) + MCFG_SCREEN_UPDATE_STATIC(grainbow) MCFG_GFXDECODE(grainbow) MCFG_PALETTE_LENGTH(128*16) @@ -1223,12 +1218,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(grainbow) + MCFG_SCREEN_UPDATE_STATIC(grainbow) MCFG_GFXDECODE(cupsoc) MCFG_PALETTE_LENGTH(128*16) @@ -1264,12 +1258,11 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(grainbow) + MCFG_SCREEN_UPDATE_STATIC(grainbow) MCFG_GFXDECODE(heatbrl_csb) MCFG_PALETTE_LENGTH(128*16) diff -Nru mame-0.144/src/mame/drivers/lemmings.c mame-0.145/src/mame/drivers/lemmings.c --- mame-0.144/src/mame/drivers/lemmings.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lemmings.c 2012-02-06 21:30:37.000000000 +0000 @@ -21,6 +21,7 @@ #include "sound/2151intf.h" #include "sound/okim6295.h" #include "includes/lemmings.h" +#include "video/decospr.h" static WRITE16_HANDLER( lemmings_control_w ) { @@ -230,15 +231,15 @@ 4, { 0x30000*8, 0x20000*8, 0x10000*8, 0x00000*8 }, { - 7, 6, 5, 4, 3, 2, 1, 0, 16*8+7, 16*8+6, 16*8+5, 16*8+4, 16*8+3, 16*8+2, 16*8+1, 16*8+0 + 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7,0, 1, 2, 3, 4, 5, 6, 7 }, - { 15*8, 14*8, 13*8, 12*8, 11*8, 10*8, 9*8, 8*8, 7*8, 6*8, 5*8, 4*8, 3*8, 2*8, 1*8, 0*8 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 }, 32*8 }; static GFXDECODE_START( lemmings ) - GFXDECODE_ENTRY( "gfx1", 0, sprite_layout, 32*16, 16 ) /* Sprites 16x16 */ - GFXDECODE_ENTRY( "gfx2", 0, sprite_layout, 48*16, 16 ) /* Sprites 16x16 */ + GFXDECODE_ENTRY( "gfx1", 0, sprite_layout, 0, 16 ) /* Sprites 16x16 */ + GFXDECODE_ENTRY( "gfx2", 0, sprite_layout, 0, 16 ) /* Sprites 16x16 */ GFXDECODE_ENTRY( NULL, 0, charlayout, 0, 16 ) /* Dynamically modified */ GFXDECODE_END @@ -280,17 +281,23 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lemmings) - MCFG_SCREEN_EOF(lemmings) + MCFG_SCREEN_UPDATE_STATIC(lemmings) + MCFG_SCREEN_VBLANK_STATIC(lemmings) MCFG_GFXDECODE(lemmings) MCFG_PALETTE_LENGTH(1024) MCFG_VIDEO_START(lemmings) + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 1); + + MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 0); + + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/lethal.c mame-0.145/src/mame/drivers/lethal.c --- mame-0.144/src/mame/drivers/lethal.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/lethal.c 2012-02-06 21:30:38.000000000 +0000 @@ -671,10 +671,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.62) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(216, 504-1, 16, 240-1) - MCFG_SCREEN_UPDATE(lethalen) + MCFG_SCREEN_UPDATE_STATIC(lethalen) MCFG_PALETTE_LENGTH(7168+1) diff -Nru mame-0.144/src/mame/drivers/lethalj.c mame-0.145/src/mame/drivers/lethalj.c --- mame-0.144/src/mame/drivers/lethalj.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/lethalj.c 2012-02-06 21:30:35.000000000 +0000 @@ -602,9 +602,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 701, 0, 512, 263, 0, 236) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(lethalj) diff -Nru mame-0.144/src/mame/drivers/lgp.c mame-0.145/src/mame/drivers/lgp.c --- mame-0.144/src/mame/drivers/lgp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lgp.c 2012-02-06 21:30:35.000000000 +0000 @@ -66,16 +66,17 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "render.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" class lgp_state : public driver_device { public: lgp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 *m_tile_ram; UINT8 *m_tile_control_ram; emu_timer *m_irq_timer; @@ -88,16 +89,16 @@ /* VIDEO GOODS */ -static SCREEN_UPDATE( lgp ) +static SCREEN_UPDATE_IND16( lgp ) { - lgp_state *state = screen->machine().driver_data(); + lgp_state *state = screen.machine().driver_data(); int charx, chary; /* make color 0 transparent */ - palette_set_color(screen->machine(), 0, MAKE_ARGB(0,0,0,0)); + palette_set_color(screen.machine(), 0, MAKE_ARGB(0,0,0,0)); /* clear */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* Draw tiles */ for (charx = 0; charx < 32; charx++) @@ -108,7 +109,7 @@ /* Somewhere there's a flag that offsets the tilemap by 0x100*x */ /* Palette is likely set somewhere as well (tile_control_ram?) */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], state->m_tile_ram[current_screen_character], 0, 0, 0, charx*8, chary*8, 0); @@ -124,13 +125,13 @@ static READ8_HANDLER(ldp_read) { lgp_state *state = space->machine().driver_data(); - return laserdisc_data_r(state->m_laserdisc); + return state->m_laserdisc->status_r(); } static WRITE8_HANDLER(ldp_write) { lgp_state *state = space->machine().driver_data(); - laserdisc_data_w(state->m_laserdisc,data); + state->m_laserdisc->data_w(data); } @@ -346,7 +347,6 @@ static MACHINE_START( lgp ) { lgp_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); state->m_irq_timer = machine.scheduler().timer_alloc(FUNC(irq_stop)); } @@ -366,11 +366,11 @@ MCFG_MACHINE_START(lgp) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(lgp, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, lgp) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_PALETTE_LENGTH(256) /* MCFG_PALETTE_INIT(lgp) */ @@ -380,7 +380,7 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/liberate.c mame-0.145/src/mame/drivers/liberate.c --- mame-0.144/src/mame/drivers/liberate.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/liberate.c 2012-02-06 21:30:34.000000000 +0000 @@ -847,10 +847,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 529ms Vblank duration?? */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(liberate) + MCFG_SCREEN_UPDATE_STATIC(liberate) MCFG_GFXDECODE(liberate) MCFG_PALETTE_LENGTH(33) @@ -880,7 +879,7 @@ MCFG_VIDEO_START(boomrang) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(boomrang) + MCFG_SCREEN_UPDATE_STATIC(boomrang) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( prosoccr, liberate ) @@ -899,7 +898,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(prosoccr) + MCFG_SCREEN_UPDATE_STATIC(prosoccr) MCFG_GFXDECODE(prosoccr) @@ -927,10 +926,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1529) /* 529ms Vblank duration?? */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(prosport) + MCFG_SCREEN_UPDATE_STATIC(prosport) MCFG_GFXDECODE(prosport) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/liberatr.c mame-0.145/src/mame/drivers/liberatr.c --- mame-0.144/src/mame/drivers/liberatr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/liberatr.c 2012-02-06 21:30:34.000000000 +0000 @@ -398,7 +398,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_DRIVER(liberatr_state, screen_update) MCFG_SCREEN_SIZE(256,256) MCFG_SCREEN_VISIBLE_AREA(8, 247, 13, 244) diff -Nru mame-0.144/src/mame/drivers/limenko.c mame-0.145/src/mame/drivers/limenko.c --- mame-0.144/src/mame/drivers/limenko.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/limenko.c 2012-02-06 21:30:39.000000000 +0000 @@ -48,14 +48,14 @@ UINT32 *m_videoreg; UINT32 *m_mainram; int m_spriteram_bit; - bitmap_t *m_sprites_bitmap; - bitmap_t *m_sprites_bitmap_pri; + bitmap_ind16 m_sprites_bitmap; + bitmap_ind8 m_sprites_bitmap_pri; int m_prev_sprites_count; UINT8 m_spotty_sound_cmd; }; -static void draw_sprites(running_machine &machine, UINT32 *sprites, const rectangle *cliprect, int count); +static void draw_sprites(running_machine &machine, UINT32 *sprites, const rectangle &cliprect, int count); /***************************************************************************************************** MISC FUNCTIONS @@ -88,21 +88,21 @@ { limenko_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE32_HANDLER( md_videoram_w ) { limenko_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_md_videoram[offset]); - tilemap_mark_tile_dirty(state->m_md_tilemap,offset); + state->m_md_tilemap->mark_tile_dirty(offset); } static WRITE32_HANDLER( fg_videoram_w ) { limenko_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE32_HANDLER( spotty_soundlatch_w ) @@ -119,14 +119,10 @@ static WRITE32_HANDLER( spriteram_buffer_w ) { limenko_state *state = space->machine().driver_data(); - rectangle clip; - clip.min_x = 0; - clip.max_x = 383; - clip.min_y = 0; - clip.max_y = 239; + rectangle clip(0, 383, 0, 239); - bitmap_fill(state->m_sprites_bitmap_pri,&clip,0); - bitmap_fill(state->m_sprites_bitmap,&clip,0); + state->m_sprites_bitmap_pri.fill(0, clip); + state->m_sprites_bitmap.fill(0, clip); // toggle spriterams location in the memory map state->m_spriteram_bit ^= 1; @@ -134,12 +130,12 @@ if(state->m_spriteram_bit) { // draw the sprites to the frame buffer - draw_sprites(space->machine(),state->m_spriteram2,&clip,state->m_prev_sprites_count); + draw_sprites(space->machine(),state->m_spriteram2,clip,state->m_prev_sprites_count); } else { // draw the sprites to the frame buffer - draw_sprites(space->machine(),state->m_spriteram,&clip,state->m_prev_sprites_count); + draw_sprites(space->machine(),state->m_spriteram,clip,state->m_prev_sprites_count); } // buffer the next number of sprites to draw @@ -256,7 +252,7 @@ SET_TILE_INFO(0,tile,color,0); } -static void draw_single_sprite(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +static void draw_single_sprite(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int priority) { @@ -299,31 +295,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -333,8 +326,8 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(state->m_sprites_bitmap_pri, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &state->m_sprites_bitmap_pri.pix8(y); int x, x_index = x_index_base; for( x=sx; x(); int i; @@ -418,19 +411,19 @@ } } -static void copy_sprites(running_machine &machine, bitmap_t *bitmap, bitmap_t *sprites_bitmap, bitmap_t *priority_bitmap, const rectangle *cliprect) +static void copy_sprites(running_machine &machine, bitmap_ind16 &bitmap, bitmap_ind16 &sprites_bitmap, bitmap_ind8 &priority_bitmap, const rectangle &cliprect) { limenko_state *state = machine.driver_data(); int y; - for( y=cliprect->min_y; y<=cliprect->max_y; y++ ) + for( y=cliprect.min_y; y<=cliprect.max_y; y++ ) { - UINT16 *source = BITMAP_ADDR16(sprites_bitmap, y, 0); - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *dest_pri = BITMAP_ADDR8(priority_bitmap, y, 0); - UINT8 *source_pri = BITMAP_ADDR8(state->m_sprites_bitmap_pri, y, 0); + UINT16 *source = &sprites_bitmap.pix16(y); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *dest_pri = &priority_bitmap.pix8(y); + UINT8 *source_pri = &state->m_sprites_bitmap_pri.pix8(y); int x; - for( x=cliprect->min_x; x<=cliprect->max_x; x++ ) + for( x=cliprect.min_x; x<=cliprect.max_x; x++ ) { if( source[x]!= 0 ) { @@ -448,38 +441,38 @@ state->m_md_tilemap = tilemap_create(machine, get_md_tile_info,tilemap_scan_rows,8,8,128,64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,128,64); - tilemap_set_transparent_pen(state->m_md_tilemap,0); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_md_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); - state->m_sprites_bitmap = auto_bitmap_alloc(machine,384,240,BITMAP_FORMAT_INDEXED16); - state->m_sprites_bitmap_pri = auto_bitmap_alloc(machine,384,240,BITMAP_FORMAT_INDEXED8); + state->m_sprites_bitmap.allocate(384,240); + state->m_sprites_bitmap_pri.allocate(384,240); } -static SCREEN_UPDATE( limenko ) +static SCREEN_UPDATE_IND16( limenko ) { - limenko_state *state = screen->machine().driver_data(); + limenko_state *state = screen.machine().driver_data(); // state->m_videoreg[4] ???? It always has this value: 0xffeffff8 (2 signed bytes? values: -17 and -8 ?) - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_set_enable(state->m_bg_tilemap, state->m_videoreg[0] & 4); - tilemap_set_enable(state->m_md_tilemap, state->m_videoreg[0] & 2); - tilemap_set_enable(state->m_fg_tilemap, state->m_videoreg[0] & 1); - - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_videoreg[3] & 0xffff); - tilemap_set_scrolly(state->m_md_tilemap, 0, state->m_videoreg[2] & 0xffff); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_videoreg[1] & 0xffff); - - tilemap_set_scrollx(state->m_bg_tilemap, 0, (state->m_videoreg[3] & 0xffff0000) >> 16); - tilemap_set_scrollx(state->m_md_tilemap, 0, (state->m_videoreg[2] & 0xffff0000) >> 16); - tilemap_set_scrollx(state->m_fg_tilemap, 0, (state->m_videoreg[1] & 0xffff0000) >> 16); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_md_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,1); + state->m_bg_tilemap->enable(state->m_videoreg[0] & 4); + state->m_md_tilemap->enable(state->m_videoreg[0] & 2); + state->m_fg_tilemap->enable(state->m_videoreg[0] & 1); + + state->m_bg_tilemap->set_scrolly(0, state->m_videoreg[3] & 0xffff); + state->m_md_tilemap->set_scrolly(0, state->m_videoreg[2] & 0xffff); + state->m_fg_tilemap->set_scrolly(0, state->m_videoreg[1] & 0xffff); + + state->m_bg_tilemap->set_scrollx(0, (state->m_videoreg[3] & 0xffff0000) >> 16); + state->m_md_tilemap->set_scrollx(0, (state->m_videoreg[2] & 0xffff0000) >> 16); + state->m_fg_tilemap->set_scrollx(0, (state->m_videoreg[1] & 0xffff0000) >> 16); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_md_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,1); if(state->m_videoreg[0] & 8) - copy_sprites(screen->machine(), bitmap, state->m_sprites_bitmap, screen->machine().priority_bitmap, cliprect); + copy_sprites(screen.machine(), bitmap, state->m_sprites_bitmap, screen.machine().priority_bitmap, cliprect); return 0; } @@ -681,10 +674,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 240) MCFG_SCREEN_VISIBLE_AREA(0, 383, 0, 239) - MCFG_SCREEN_UPDATE(limenko) + MCFG_SCREEN_UPDATE_STATIC(limenko) MCFG_GFXDECODE(limenko) MCFG_PALETTE_LENGTH(0x1000) @@ -709,10 +701,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 240) MCFG_SCREEN_VISIBLE_AREA(0, 383, 0, 239) - MCFG_SCREEN_UPDATE(limenko) + MCFG_SCREEN_UPDATE_STATIC(limenko) MCFG_GFXDECODE(limenko) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/littlerb.c mame-0.145/src/mame/drivers/littlerb.c --- mame-0.144/src/mame/drivers/littlerb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/littlerb.c 2012-02-06 21:30:33.000000000 +0000 @@ -403,7 +403,7 @@ INPUT_PORTS_END -static void draw_sprite(running_machine &machine, bitmap_t *bitmap, int xsize,int ysize, int offset, int xpos, int ypos, int pal ) +static void draw_sprite(running_machine &machine, bitmap_ind16 &bitmap, int xsize,int ysize, int offset, int xpos, int ypos, int pal ) { littlerb_state *state = machine.driver_data(); UINT16* spritegfx = state->m_region4; @@ -426,12 +426,12 @@ if ((drawxpos < 320) && (drawypos < 256) && (drawxpos >= 0) && (drawypos >=0)) { - if(pix1&0xf) *BITMAP_ADDR16(bitmap, drawypos, drawxpos) = pix1; + if(pix1&0xf) bitmap.pix16(drawypos, drawxpos) = pix1; } drawxpos++; if ((drawxpos < 320) && (drawypos < 256) && (drawxpos >= 0) && (drawypos >=0)) { - if(pix2&0xf) *BITMAP_ADDR16(bitmap, drawypos, drawxpos) = pix2; + if(pix2&0xf) bitmap.pix16(drawypos, drawxpos) = pix2; } offset++; @@ -442,14 +442,14 @@ } /* sprite format / offset could be completely wrong, this is just based on our (currently incorrect) vram access */ -static SCREEN_UPDATE(littlerb) +static SCREEN_UPDATE_IND16(littlerb) { - littlerb_state *state = screen->machine().driver_data(); + littlerb_state *state = screen.machine().driver_data(); int x,y,offs, code; int xsize,ysize; int pal; UINT16* spriteregion = &state->m_region4[0x400]; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); //printf("frame\n"); /* the spriteram format is something like this .. */ for (offs=0x26/2;offs<0xc00;offs+=6) // start at 00x26? @@ -468,7 +468,7 @@ //if (code!=0) printf("%04x %04x %04x %04x %04x %04x\n", spriteregion[offs+0], spriteregion[offs+1], spriteregion[offs+2], spriteregion[offs+3], spriteregion[offs+4], spriteregion[offs+5]); - draw_sprite(screen->machine(),bitmap,xsize,ysize,code,x-8,y-16, pal); + draw_sprite(screen.machine(),bitmap,xsize,ysize,code,x-8,y-16, pal); } return 0; @@ -489,10 +489,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 320-1, 0*8, 256-1) - MCFG_SCREEN_UPDATE(littlerb) + MCFG_SCREEN_UPDATE_STATIC(littlerb) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/lkage.c mame-0.145/src/mame/drivers/lkage.c --- mame-0.144/src/mame/drivers/lkage.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lkage.c 2012-02-06 21:30:36.000000000 +0000 @@ -576,10 +576,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lkage) + MCFG_SCREEN_UPDATE_STATIC(lkage) MCFG_GFXDECODE(lkage) MCFG_PALETTE_LENGTH(1024) @@ -623,10 +622,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lkage) + MCFG_SCREEN_UPDATE_STATIC(lkage) MCFG_GFXDECODE(lkage) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/lockon.c mame-0.145/src/mame/drivers/lockon.c --- mame-0.144/src/mame/drivers/lockon.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/lockon.c 2012-02-06 21:30:40.000000000 +0000 @@ -541,10 +541,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(lockon) - MCFG_SCREEN_EOF(lockon) + MCFG_SCREEN_UPDATE_STATIC(lockon) + MCFG_SCREEN_VBLANK_STATIC(lockon) MCFG_GFXDECODE(lockon) MCFG_PALETTE_INIT(lockon) diff -Nru mame-0.144/src/mame/drivers/looping.c mame-0.145/src/mame/drivers/looping.c --- mame-0.144/src/mame/drivers/looping.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/looping.c 2012-02-06 21:30:39.000000000 +0000 @@ -184,7 +184,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 0x20); + state->m_bg_tilemap->set_scroll_cols(0x20); } @@ -199,7 +199,7 @@ { looping_state *state = space->machine().driver_data(); flip_screen_x_set(space->machine(), ~data & 0x01); - tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(space->machine()) ? 128 : 0); + state->m_bg_tilemap->set_scrollx(0, flip_screen_get(space->machine()) ? 128 : 0); } @@ -207,7 +207,7 @@ { looping_state *state = space->machine().driver_data(); flip_screen_y_set(space->machine(), ~data & 0x01); - tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(space->machine()) ? 128 : 0); + state->m_bg_tilemap->set_scrollx(0, flip_screen_get(space->machine()) ? 128 : 0); } @@ -215,7 +215,7 @@ { looping_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -232,12 +232,12 @@ /* mark the whole column dirty */ offs_t offs = (offset/2); for (i = 0; i < 0x20; i++) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i * 0x20 + offs); + state->m_bg_tilemap->mark_tile_dirty(i * 0x20 + offs); } /* even bytes are column scroll */ else - tilemap_set_scrolly(state->m_bg_tilemap, offset/2, data); + state->m_bg_tilemap->set_scrolly(offset/2, data); } @@ -248,7 +248,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { const UINT8 *source; looping_state *state = machine.driver_data(); @@ -279,12 +279,12 @@ } -static SCREEN_UPDATE( looping ) +static SCREEN_UPDATE_IND16( looping ) { - looping_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + looping_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -637,9 +637,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(looping) + MCFG_SCREEN_UPDATE_STATIC(looping) MCFG_GFXDECODE(looping) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/lordgun.c mame-0.145/src/mame/drivers/lordgun.c --- mame-0.144/src/mame/drivers/lordgun.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/lordgun.c 2012-02-06 21:30:42.000000000 +0000 @@ -679,10 +679,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x100) MCFG_SCREEN_VISIBLE_AREA(0,0x1c0-1, 0,0xe0-1) - MCFG_SCREEN_UPDATE(lordgun) + MCFG_SCREEN_UPDATE_STATIC(lordgun) MCFG_GFXDECODE(lordgun) MCFG_PALETTE_LENGTH(0x800 * 8) // 0x800 real colors, repeated per priority level @@ -723,10 +722,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x100) MCFG_SCREEN_VISIBLE_AREA(0,0x1c0-1, 0,0xe0-1) - MCFG_SCREEN_UPDATE(lordgun) + MCFG_SCREEN_UPDATE_STATIC(lordgun) MCFG_GFXDECODE(lordgun) MCFG_PALETTE_LENGTH(0x800 * 8) // 0x800 real colors, repeated per priority level diff -Nru mame-0.144/src/mame/drivers/lsasquad.c mame-0.145/src/mame/drivers/lsasquad.c --- mame-0.144/src/mame/drivers/lsasquad.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lsasquad.c 2012-02-06 21:30:36.000000000 +0000 @@ -640,10 +640,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lsasquad) + MCFG_SCREEN_UPDATE_STATIC(lsasquad) MCFG_GFXDECODE(lsasquad) MCFG_PALETTE_LENGTH(512) @@ -697,7 +696,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) @@ -705,7 +703,7 @@ MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) - MCFG_SCREEN_UPDATE(daikaiju) + MCFG_SCREEN_UPDATE_STATIC(daikaiju) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/ltcasino.c mame-0.145/src/mame/drivers/ltcasino.c --- mame-0.144/src/mame/drivers/ltcasino.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ltcasino.c 2012-02-06 21:30:37.000000000 +0000 @@ -56,14 +56,14 @@ { ltcasino_state *state = space->machine().driver_data(); state->m_tile_num_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( ltcasino_tile_atr_w ) { ltcasino_state *state = space->machine().driver_data(); state->m_tile_atr_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } @@ -632,10 +632,10 @@ GFXDECODE_END -static SCREEN_UPDATE(ltcasino) +static SCREEN_UPDATE_IND16(ltcasino) { - ltcasino_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + ltcasino_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -650,10 +650,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(6*8, 58*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(ltcasino) + MCFG_SCREEN_UPDATE_STATIC(ltcasino) MCFG_GFXDECODE(ltcasino) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/ltd.c mame-0.145/src/mame/drivers/ltd.c --- mame-0.144/src/mame/drivers/ltd.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/ltd.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -5,18 +7,28 @@ { public: ltd_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( ltd_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( ltd_map, AS_PROGRAM, 8, ltd_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( ltd ) INPUT_PORTS_END -static MACHINE_RESET( ltd ) +void ltd_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6803, 1000000) MCFG_CPU_PROGRAM_MAP(ltd_map) - - MCFG_MACHINE_RESET( ltd ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -117,11 +127,11 @@ ROM_RELOAD(0xf000, 0x1000) ROM_END -GAME(198?, alcapone, 0, ltd, ltd, ltd, ROT0, "LTD", "Al Capone", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, atla_ltd, 0, ltd, ltd, ltd, ROT0, "LTD", "Atlantis (LTD)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(19??, bhol_ltd, 0, ltd, ltd, ltd, ROT0, "LTD", "Black Hole (LTD)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, columbia, 0, ltd, ltd, ltd, ROT0, "LTD", "Columbia", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, cowboy, 0, ltd, ltd, ltd, ROT0, "LTD", "Cowboy Eight Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, pecmen, 0, ltd, ltd, ltd, ROT0, "LTD", "Mr. & Mrs. Pec-Men", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, zephy, 0, ltd, ltd, ltd, ROT0, "LTD", "Zephy", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(198?, alcapone, 0, ltd, ltd, ltd, ROT0, "LTD", "Al Capone", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, atla_ltd, 0, ltd, ltd, ltd, ROT0, "LTD", "Atlantis (LTD)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, bhol_ltd, 0, ltd, ltd, ltd, ROT0, "LTD", "Black Hole (LTD)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, columbia, 0, ltd, ltd, ltd, ROT0, "LTD", "Columbia", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, cowboy, 0, ltd, ltd, ltd, ROT0, "LTD", "Cowboy Eight Ball", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, pecmen, 0, ltd, ltd, ltd, ROT0, "LTD", "Mr. & Mrs. Pec-Men", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, zephy, 0, ltd, ltd, ltd, ROT0, "LTD", "Zephy", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/luckgrln.c mame-0.145/src/mame/drivers/luckgrln.c --- mame-0.144/src/mame/drivers/luckgrln.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/luckgrln.c 2012-02-06 21:30:36.000000000 +0000 @@ -11,7 +11,7 @@ - reel scroll / reel enable / reel colours - are the colours correct even on the text layer? they look odd in places, and there are unused bits - dunno where / how is the service mode bit is connected (I've accessed it once, but dunno how I've did it) - + - graphics in 7smash are quite off (encrypted ROM?) Lucky Girl Wing 1991 @@ -118,14 +118,14 @@ { luckgrln_state *state = space->machine().driver_data(); state->m_reel1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( luckgrln_reel1_attr_w ) { luckgrln_state *state = space->machine().driver_data(); state->m_reel1_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } @@ -152,14 +152,14 @@ { luckgrln_state *state = space->machine().driver_data(); state->m_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( luckgrln_reel2_attr_w ) { luckgrln_state *state = space->machine().driver_data(); state->m_reel2_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } @@ -184,14 +184,14 @@ { luckgrln_state *state = space->machine().driver_data(); state->m_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( luckgrln_reel3_attr_w ) { luckgrln_state *state = space->machine().driver_data(); state->m_reel3_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } @@ -215,14 +215,14 @@ { luckgrln_state *state = space->machine().driver_data(); state->m_reel4_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel4_tilemap,offset); + state->m_reel4_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( luckgrln_reel4_attr_w ) { luckgrln_state *state = space->machine().driver_data(); state->m_reel4_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_reel4_tilemap,offset); + state->m_reel4_tilemap->mark_tile_dirty(offset); } @@ -250,40 +250,35 @@ state->m_reel3_tilemap = tilemap_create(machine,get_luckgrln_reel3_tile_info,tilemap_scan_rows, 8, 32, 64, 8); state->m_reel4_tilemap = tilemap_create(machine,get_luckgrln_reel4_tile_info,tilemap_scan_rows, 8, 32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel4_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); + state->m_reel4_tilemap->set_scroll_cols(64); - tilemap_set_transparent_pen( state->m_reel1_tilemap, 0 ); - tilemap_set_transparent_pen( state->m_reel2_tilemap, 0 ); - tilemap_set_transparent_pen( state->m_reel3_tilemap, 0 ); - tilemap_set_transparent_pen( state->m_reel4_tilemap, 0 ); + state->m_reel1_tilemap->set_transparent_pen(0 ); + state->m_reel2_tilemap->set_transparent_pen(0 ); + state->m_reel3_tilemap->set_transparent_pen(0 ); + state->m_reel4_tilemap->set_transparent_pen(0 ); } -static SCREEN_UPDATE(luckgrln) +static SCREEN_UPDATE_IND16(luckgrln) { - luckgrln_state *state = screen->machine().driver_data(); + luckgrln_state *state = screen.machine().driver_data(); int y,x; int count = 0; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); int i; - rectangle clip; - - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + rectangle clip = visarea; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); - tilemap_set_scrolly(state->m_reel4_tilemap, i, state->m_reel4_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); + state->m_reel4_tilemap->set_scrolly(i, state->m_reel4_scroll[i]); } @@ -335,26 +330,26 @@ #if 0 // treat bit as fg enable if (tileattr&0x04) { - if (bgenable==0) tilemap_draw(bitmap, &clip, state->m_reel1_tilemap, 0, 0); - if (bgenable==1) tilemap_draw(bitmap, &clip, state->m_reel2_tilemap, 0, 0); - if (bgenable==2) tilemap_draw(bitmap, &clip, state->m_reel3_tilemap, 0, 0); - if (bgenable==3) tilemap_draw(bitmap, &clip, state->m_reel4_tilemap, 0, 0); + if (bgenable==0) state->m_reel1_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==1) state->m_reel2_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==2) state->m_reel3_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==3) state->m_reel4_tilemap->draw(bitmap, clip, 0, 0); } - if (tileattr&0x08) drawgfx_transpen(bitmap,clip,screen->machine().gfx[region],tile,col,0,0,x*8,y*8, 0); + if (tileattr&0x08) drawgfx_transpen(bitmap,clip,screen.machine().gfx[region],tile,col,0,0,x*8,y*8, 0); #else // treat it as priority flag instead (looks better in non-adult title screen - needs verifying) - if (!(tileattr&0x08)) drawgfx_transpen(bitmap,&clip,screen->machine().gfx[region],tile,col,0,0,x*8,y*8, 0); + if (!(tileattr&0x08)) drawgfx_transpen(bitmap,clip,screen.machine().gfx[region],tile,col,0,0,x*8,y*8, 0); if (tileattr&0x04) { - if (bgenable==0) tilemap_draw(bitmap, &clip, state->m_reel1_tilemap, 0, 0); - if (bgenable==1) tilemap_draw(bitmap, &clip, state->m_reel2_tilemap, 0, 0); - if (bgenable==2) tilemap_draw(bitmap, &clip, state->m_reel3_tilemap, 0, 0); - if (bgenable==3) tilemap_draw(bitmap, &clip, state->m_reel4_tilemap, 0, 0); + if (bgenable==0) state->m_reel1_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==1) state->m_reel2_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==2) state->m_reel3_tilemap->draw(bitmap, clip, 0, 0); + if (bgenable==3) state->m_reel4_tilemap->draw(bitmap, clip, 0, 0); } - if ((tileattr&0x08)) drawgfx_transpen(bitmap,&clip,screen->machine().gfx[region],tile,col,0,0,x*8,y*8, 0); + if ((tileattr&0x08)) drawgfx_transpen(bitmap,clip,screen.machine().gfx[region],tile,col,0,0,x*8,y*8, 0); #endif count++; @@ -398,6 +393,12 @@ AM_RANGE(0xf0000, 0xfffff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( _7smash_map, AS_PROGRAM, 8 ) + AM_RANGE(0x00000, 0x0bfff) AM_ROM + AM_IMPORT_FROM( mainmap ) + AM_RANGE(0x10000, 0x2ffff) AM_UNMAP + AM_RANGE(0xf0000, 0xfffff) AM_UNMAP +ADDRESS_MAP_END static WRITE8_HANDLER( output_w ) { @@ -543,7 +544,7 @@ /* are some of these reads / writes mirrored? there seem to be far too many */ static ADDRESS_MAP_START( portmap, AS_IO, 8 ) - ADDRESS_MAP_GLOBAL_MASK(0xff) // i think + ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x0000, 0x003f) AM_RAM // Z180 internal regs AM_RANGE(0x0060, 0x0060) AM_WRITE(output_w) @@ -596,6 +597,16 @@ ADDRESS_MAP_END +/* reads a bit 1 status there after every round played */ +static READ8_HANDLER( test_r ) +{ + return 0xff; +} + +static ADDRESS_MAP_START( _7smash_io, AS_IO, 8 ) + AM_RANGE(0x66, 0x66) AM_READ(test_r) + AM_IMPORT_FROM( portmap ) +ADDRESS_MAP_END static INPUT_PORTS_START( luckgrln ) PORT_START("IN0") @@ -797,6 +808,120 @@ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( _7smash ) + PORT_START("DSW1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, "DSW2" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW3") + PORT_DIPNAME( 0x01, 0x01, "DSW3" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW4") + PORT_DIPNAME( 0x01, 0x01, "DSW4" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("DSW5") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_NAME("Slot 3 / Odds") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_NAME("Slot 2 / Bet") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_NAME("Slot 1") + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN1") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service SW") + PORT_BIT( 0xef, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset SW") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) //PORT_NAME("Hopper Coin SW") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) //PORT_NAME("Hopper Coin Empty SW") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) +INPUT_PORTS_END + static const gfx_layout tiles8x8_layout = { @@ -857,10 +982,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(luckgrln) + MCFG_SCREEN_UPDATE_STATIC(luckgrln) MCFG_GFXDECODE(luckgrln) MCFG_PALETTE_LENGTH(0x8000) @@ -871,6 +995,12 @@ MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( _7smash, luckgrln ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(_7smash_map) + MCFG_CPU_IO_MAP(_7smash_io) +MACHINE_CONFIG_END + static DRIVER_INIT( luckgrln ) { int i; @@ -924,6 +1054,25 @@ ROM_LOAD( "falcon.6", 0x40000, 0x20000, CRC(bfb02c87) SHA1(1b5ca562ed76eb3f1b4a52d379a6af07e79b6ee5) ) ROM_END +ROM_START( 7smash ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "eagle.8", 0x000000, 0x020000, CRC(b115c5d5) SHA1(3f80613886b7f8092ec914c9bfb416078aca82a3) ) + ROM_LOAD( "7smash.bin", 0x000000, 0x004000, CRC(58396efa) SHA1(b957d28e321a5c4f9a90e0a7eaf8f01450662c0e) ) // internal Z180 rom + + ROM_REGION( 0x20000, "rom_data", ROMREGION_ERASEFF ) // external data / cpu rom + + + ROM_REGION( 0x60000, "reels", ROMREGION_ERASE00 ) // reel gfxs + ROM_LOAD( "eagle.3", 0x40000, 0x020000, CRC(d75b3b2f) SHA1(1d90bc17f9e645966126fa19c42a7c4d54098776) ) + ROM_LOAD( "eagle.2", 0x20000, 0x020000, CRC(211b5acb) SHA1(e35ae6c93a1daa9d3aa46970c5c3d39788f948bb) ) + ROM_LOAD( "eagle.1", 0x00000, 0x020000, CRC(21317c37) SHA1(7706045b85f86f6e58cc67c2d7dee01d80df3422) ) // half unused, 5bpp + + ROM_REGION( 0x60000, "gfx2", ROMREGION_ERASE00 ) + ROM_LOAD( "eagle.6", 0x40000, 0x20000, CRC(2c4416d4) SHA1(25d04d4d08ab491a9684b8e6f21e57479711ee87) ) + ROM_LOAD( "eagle.5", 0x20000, 0x20000, CRC(cd8bc456) SHA1(cefe211492158f445ceaaa9015e1143ea9afddbb) ) + ROM_LOAD( "eagle.4", 0x00000, 0x20000, CRC(dcf92dca) SHA1(87c7d88dc35981ad636376b53264cee87ccdaa71) ) // half unused, 5bpp +ROM_END + /********************************************* * Game Drivers * @@ -931,4 +1080,5 @@ YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */ GAMEL( 1991, luckgrln, 0, luckgrln, luckgrln, luckgrln, ROT0, "Wing Co., Ltd.", "Lucky Girl (newer Z180 based hardware)", GAME_NO_SOUND, layout_luckgrln ) +GAMEL( 1993, 7smash, 0, _7smash, _7smash, 0, ROT0, "Sovic", "7 Smash", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING | GAME_NO_SOUND, layout_luckgrln ) diff -Nru mame-0.144/src/mame/drivers/lucky74.c mame-0.145/src/mame/drivers/lucky74.c --- mame-0.144/src/mame/drivers/lucky74.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/lucky74.c 2012-02-06 21:30:38.000000000 +0000 @@ -1250,10 +1250,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 1*8, 30*8-1) - MCFG_SCREEN_UPDATE(lucky74) + MCFG_SCREEN_UPDATE_STATIC(lucky74) MCFG_GFXDECODE(lucky74) diff -Nru mame-0.144/src/mame/drivers/lvcards.c mame-0.145/src/mame/drivers/lvcards.c --- mame-0.144/src/mame/drivers/lvcards.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/lvcards.c 2012-02-06 21:30:42.000000000 +0000 @@ -477,10 +477,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(lvcards) + MCFG_SCREEN_UPDATE_STATIC(lvcards) MCFG_GFXDECODE(lvcards) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/lwings.c mame-0.145/src/mame/drivers/lwings.c --- mame-0.144/src/mame/drivers/lwings.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/lwings.c 2012-02-06 21:30:42.000000000 +0000 @@ -74,6 +74,8 @@ static WRITE8_HANDLER( lwings_bankswitch_w ) { + lwings_state *state = space->machine().driver_data(); + /* bit 0 is flip screen */ flip_screen_set(space->machine(), ~data & 0x01); @@ -81,7 +83,7 @@ memory_set_bank(space->machine(), "bank1", (data & 0x06) >> 1); /* bit 3 enables NMI */ - interrupt_enable_w(space, 0, data & 0x08); + state->m_nmi_mask = data & 8; /* bits 6 and 7 are coin counters */ coin_counter_w(space->machine(), 1, data & 0x40); @@ -90,10 +92,20 @@ static INTERRUPT_GEN( lwings_interrupt ) { - if (interrupt_enable_r(device->memory().space(AS_PROGRAM), 0)) + lwings_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xd7); /* RST 10h */ } +static INTERRUPT_GEN( avengers_interrupt ) +{ + lwings_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static WRITE8_HANDLER( avengers_protection_w ) { @@ -794,11 +806,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(lwings) - MCFG_SCREEN_EOF(lwings) + MCFG_SCREEN_UPDATE_STATIC(lwings) + MCFG_SCREEN_VBLANK_STATIC(lwings) MCFG_GFXDECODE(lwings) MCFG_PALETTE_LENGTH(1024) @@ -841,7 +852,7 @@ MCFG_VIDEO_START(trojan) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(trojan) + MCFG_SCREEN_UPDATE_STATIC(trojan) /* sound hardware */ MCFG_SOUND_ADD("5205", MSM5205, XTAL_455kHz) /* verified on PCB */ @@ -853,7 +864,7 @@ MCFG_CPU_MODIFY("maincpu") //AT: (avengers37b16gre) MCFG_CPU_PROGRAM_MAP(avengers_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) // RST 38h triggered by software + MCFG_CPU_VBLANK_INT("screen", avengers_interrupt) // RST 38h triggered by software MCFG_CPU_MODIFY("adpcm") MCFG_CPU_IO_MAP(avengers_adpcm_io_map) diff -Nru mame-0.144/src/mame/drivers/m107.c mame-0.145/src/mame/drivers/m107.c --- mame-0.144/src/mame/drivers/m107.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/m107.c 2012-02-06 21:30:38.000000000 +0000 @@ -104,6 +104,7 @@ static READ16_HANDLER( m107_soundlatch_r ) { + cputag_set_input_line(space->machine(), "soundcpu", NEC_INPUT_LINE_INTP1, CLEAR_LINE); return soundlatch_r(space, offset) | 0xff00; } @@ -788,10 +789,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(80, 511-112, 8, 247) /* 320 x 240 */ - MCFG_SCREEN_UPDATE(m107) + MCFG_SCREEN_UPDATE_STATIC(m107) MCFG_GFXDECODE(firebarr) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/m10.c mame-0.145/src/mame/drivers/m10.c --- mame-0.144/src/mame/drivers/m10.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/m10.c 2012-02-06 21:30:34.000000000 +0000 @@ -807,16 +807,16 @@ static const char *const m10_sample_names[] = { "*ipminvad", - "1.wav", /* shot/missle */ - "2.wav", /* base hit/explosion */ - "3.wav", /* invader hit */ - "4.wav", /* fleet move 1 */ - "5.wav", /* fleet move 2 */ - "6.wav", /* fleet move 3 */ - "7.wav", /* fleet move 4 */ - "8.wav", /* UFO/saucer hit */ - "9.wav", /* bonus base */ - "0.wav", /* UFO sound */ + "1", /* shot/missle */ + "2", /* base hit/explosion */ + "3", /* invader hit */ + "4", /* fleet move 1 */ + "5", /* fleet move 2 */ + "6", /* fleet move 3 */ + "7", /* fleet move 4 */ + "8", /* UFO/saucer hit */ + "9", /* bonus base */ + "0", /* UFO sound */ 0 }; @@ -846,9 +846,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(IREMM10_PIXEL_CLOCK, IREMM10_HTOTAL, IREMM10_HBEND, IREMM10_HBSTART, IREMM10_VTOTAL, IREMM10_VBEND, IREMM10_VBSTART) - MCFG_SCREEN_UPDATE(m10) + MCFG_SCREEN_UPDATE_STATIC(m10) MCFG_GFXDECODE(m10) MCFG_PALETTE_LENGTH(2*8) @@ -893,9 +892,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(IREMM15_PIXEL_CLOCK, IREMM15_HTOTAL, IREMM15_HBEND, IREMM15_HBSTART, IREMM15_VTOTAL, IREMM15_VBEND, IREMM15_VBSTART) - MCFG_SCREEN_UPDATE(m15) + MCFG_SCREEN_UPDATE_STATIC(m15) MCFG_PALETTE_LENGTH(2*8) diff -Nru mame-0.144/src/mame/drivers/m14.c mame-0.145/src/mame/drivers/m14.c --- mame-0.144/src/mame/drivers/m14.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/m14.c 2012-02-06 21:30:34.000000000 +0000 @@ -120,11 +120,11 @@ state->m_m14_tilemap = tilemap_create(machine, m14_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( m14 ) +static SCREEN_UPDATE_IND16( m14 ) { - m14_state *state = screen->machine().driver_data(); + m14_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_m14_tilemap, 0, 0); + state->m_m14_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -134,7 +134,7 @@ m14_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_m14_tilemap, offset); + state->m_m14_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( m14_cram_w ) @@ -142,7 +142,7 @@ m14_state *state = space->machine().driver_data(); state->m_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_m14_tilemap, offset); + state->m_m14_tilemap->mark_tile_dirty(offset); } /************************************* @@ -344,10 +344,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) //not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(m14) + MCFG_SCREEN_UPDATE_STATIC(m14) MCFG_GFXDECODE(m14) MCFG_PALETTE_LENGTH(0x20) MCFG_PALETTE_INIT(m14) diff -Nru mame-0.144/src/mame/drivers/m52.c mame-0.145/src/mame/drivers/m52.c --- mame-0.144/src/mame/drivers/m52.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/m52.c 2012-02-06 21:30:34.000000000 +0000 @@ -407,8 +407,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 136, 376, 282, 22, 274) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m52) + MCFG_SCREEN_UPDATE_STATIC(m52) MCFG_PALETTE_INIT(m52) MCFG_VIDEO_START(m52) diff -Nru mame-0.144/src/mame/drivers/m57.c mame-0.145/src/mame/drivers/m57.c --- mame-0.144/src/mame/drivers/m57.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/m57.c 2012-02-06 21:30:34.000000000 +0000 @@ -236,10 +236,9 @@ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */) /* the Lode Runner manual (similar but different hardware) */ /* talks about 55Hz and 1790ms vblank duration. */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(m57) + MCFG_SCREEN_UPDATE_STATIC(m57) MCFG_GFXDECODE(m57) MCFG_PALETTE_LENGTH(32*8+32*8) diff -Nru mame-0.144/src/mame/drivers/m58.c mame-0.145/src/mame/drivers/m58.c --- mame-0.144/src/mame/drivers/m58.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/m58.c 2012-02-06 21:30:34.000000000 +0000 @@ -201,8 +201,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 256, 282, 42, 266) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(yard) + MCFG_SCREEN_UPDATE_STATIC(yard) MCFG_PALETTE_INIT(yard) MCFG_VIDEO_START(yard) diff -Nru mame-0.144/src/mame/drivers/m62.c mame-0.145/src/mame/drivers/m62.c --- mame-0.144/src/mame/drivers/m62.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/m62.c 2012-02-06 21:30:34.000000000 +0000 @@ -970,10 +970,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* frames per second and vblank duration from the Lode Runner manual */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA((64*8-384)/2, 64*8-(64*8-384)/2-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(ldrun) + MCFG_SCREEN_UPDATE_STATIC(ldrun) MCFG_GFXDECODE(ldrun) MCFG_PALETTE_LENGTH(512) @@ -997,7 +996,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(kungfum) + MCFG_SCREEN_UPDATE_STATIC(kungfum) MCFG_VIDEO_START(kungfum) MACHINE_CONFIG_END @@ -1014,7 +1013,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(battroad) + MCFG_SCREEN_UPDATE_STATIC(battroad) MCFG_GFXDECODE(battroad) MCFG_PALETTE_LENGTH(544) @@ -1032,7 +1031,7 @@ MCFG_VIDEO_START(ldrun2) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ldrun) + MCFG_SCREEN_UPDATE_STATIC(ldrun) MACHINE_CONFIG_END @@ -1047,7 +1046,7 @@ MCFG_GFXDECODE(ldrun3) MCFG_VIDEO_START(ldrun2) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ldrun3) + MCFG_SCREEN_UPDATE_STATIC(ldrun3) MACHINE_CONFIG_END @@ -1062,7 +1061,7 @@ MCFG_GFXDECODE(ldrun3) MCFG_VIDEO_START(ldrun4) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ldrun4) + MCFG_SCREEN_UPDATE_STATIC(ldrun4) MACHINE_CONFIG_END @@ -1079,7 +1078,7 @@ MCFG_PALETTE_INIT(lotlot) MCFG_VIDEO_START(lotlot) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(lotlot) + MCFG_SCREEN_UPDATE_STATIC(lotlot) MACHINE_CONFIG_END @@ -1095,7 +1094,7 @@ MCFG_VIDEO_START(kidniki) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(kidniki) + MCFG_SCREEN_UPDATE_STATIC(kidniki) MACHINE_CONFIG_END @@ -1110,7 +1109,7 @@ MCFG_VIDEO_START(spelunkr) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(spelunkr) + MCFG_SCREEN_UPDATE_STATIC(spelunkr) MACHINE_CONFIG_END @@ -1127,7 +1126,7 @@ MCFG_PALETTE_INIT(spelunk2) MCFG_VIDEO_START(spelunk2) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(spelunk2) + MCFG_SCREEN_UPDATE_STATIC(spelunk2) MACHINE_CONFIG_END @@ -1142,7 +1141,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(youjyudn) + MCFG_SCREEN_UPDATE_STATIC(youjyudn) MCFG_GFXDECODE(youjyudn) MCFG_VIDEO_START(youjyudn) @@ -1158,7 +1157,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA((64*8-256)/2, 64*8-(64*8-256)/2-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(horizon) + MCFG_SCREEN_UPDATE_STATIC(horizon) MCFG_VIDEO_START(horizon) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/m63.c mame-0.145/src/mame/drivers/m63.c --- mame-0.144/src/mame/drivers/m63.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/m63.c 2012-02-06 21:30:34.000000000 +0000 @@ -134,6 +134,8 @@ UINT8 * m_scrollram; size_t m_spriteram_size; + UINT8 m_nmi_mask; + /* video-related */ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; @@ -216,7 +218,7 @@ m63_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( m63_colorram_w ) @@ -224,7 +226,7 @@ m63_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( m63_videoram2_w ) @@ -232,7 +234,7 @@ m63_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( m63_palbank_w ) @@ -242,7 +244,7 @@ if (state->m_pal_bank != (data & 0x01)) { state->m_pal_bank = data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -251,7 +253,7 @@ if (flip_screen_get(space->machine()) != (~data & 0x01)) { flip_screen_set(space->machine(), ~data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -291,11 +293,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_scroll_cols(32); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { m63_state *state = machine.driver_data(); int offs; @@ -336,18 +338,18 @@ } } -static SCREEN_UPDATE( m63 ) +static SCREEN_UPDATE_IND16( m63 ) { - m63_state *state = screen->machine().driver_data(); + m63_state *state = screen.machine().driver_data(); int col; for (col = 0; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, state->m_scrollram[col * 8]); + state->m_bg_tilemap->set_scrolly(col, state->m_scrollram[col * 8]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -434,6 +436,14 @@ sample_start_raw(state->m_samples, 0, state->m_samplebuf + ((data & 0xf0) << 8), 0x2000, 8000, 0); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + m63_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + + static ADDRESS_MAP_START( m63_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xd000, 0xdfff) AM_RAM @@ -443,7 +453,7 @@ AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(m63_videoram2_w) AM_BASE_MEMBER(m63_state, m_videoram2) AM_RANGE(0xe800, 0xebff) AM_RAM_WRITE(m63_videoram_w) AM_BASE_MEMBER(m63_state, m_videoram) AM_RANGE(0xec00, 0xefff) AM_RAM_WRITE(m63_colorram_w) AM_BASE_MEMBER(m63_state, m_colorram) - AM_RANGE(0xf000, 0xf000) AM_WRITE(interrupt_enable_w) /* NMI enable */ + AM_RANGE(0xf000, 0xf000) AM_WRITE(nmi_mask_w) AM_RANGE(0xf002, 0xf002) AM_WRITE(m63_flipscreen_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(m63_palbank_w) AM_RANGE(0xf006, 0xf007) AM_WRITE(coin_w) @@ -472,7 +482,7 @@ AM_RANGE(0xf001, 0xf001) AM_WRITENOP AM_RANGE(0xf002, 0xf002) AM_WRITE(soundlatch_w) AM_RANGE(0xf800, 0xf800) AM_WRITENOP - AM_RANGE(0xf801, 0xf801) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xf801, 0xf801) AM_WRITE(nmi_mask_w) AM_RANGE(0xf802, 0xf802) AM_WRITE(fghtbskt_flipscreen_w) AM_RANGE(0xf803, 0xf803) AM_WRITENOP AM_RANGE(0xf804, 0xf804) AM_WRITENOP @@ -734,12 +744,21 @@ state->m_p2 = 0; } + +static INTERRUPT_GEN( vblank_irq ) +{ + m63_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( m63, m63_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",Z80,XTAL_12MHz/4) /* 3 MHz */ MCFG_CPU_PROGRAM_MAP(m63_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("soundcpu",I8039,XTAL_12MHz/4) /* ????? */ MCFG_CPU_PROGRAM_MAP(i8039_map) @@ -753,10 +772,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(m63) + MCFG_SCREEN_UPDATE_STATIC(m63) MCFG_GFXDECODE(m63) MCFG_PALETTE_LENGTH(256+4) @@ -784,7 +802,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/4) /* 3 MHz */ MCFG_CPU_PROGRAM_MAP(fghtbskt_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("soundcpu", I8039,XTAL_12MHz/4) /* ????? */ MCFG_CPU_PROGRAM_MAP(i8039_map) @@ -798,10 +816,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(m63) + MCFG_SCREEN_UPDATE_STATIC(m63) MCFG_GFXDECODE(fghtbskt) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/m72.c mame-0.145/src/mame/drivers/m72.c --- mame-0.144/src/mame/drivers/m72.c 2012-01-13 15:34:41.000000000 +0000 +++ mame-0.145/src/mame/drivers/m72.c 2012-02-06 21:30:35.000000000 +0000 @@ -1874,8 +1874,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(m72) @@ -1930,8 +1929,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(m72) @@ -1968,8 +1966,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(xmultipl) @@ -2010,8 +2007,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(m72) @@ -2052,8 +2048,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(hharry) @@ -2094,8 +2089,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(m72) @@ -2136,8 +2130,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(rtype2) @@ -2178,8 +2171,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(majtitle) + MCFG_SCREEN_UPDATE_STATIC(majtitle) MCFG_VIDEO_START(majtitle) @@ -2220,8 +2212,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(hharry) @@ -2262,8 +2253,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(hharryu) @@ -2304,8 +2294,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(m72) @@ -2346,8 +2335,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(poundfor) @@ -2388,8 +2376,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(m72) + MCFG_SCREEN_UPDATE_STATIC(m72) MCFG_VIDEO_START(poundfor) diff -Nru mame-0.144/src/mame/drivers/m79amb.c mame-0.145/src/mame/drivers/m79amb.c --- mame-0.144/src/mame/drivers/m79amb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/m79amb.c 2012-02-06 21:30:39.000000000 +0000 @@ -80,9 +80,9 @@ state->m_videoram[offset] = data & ~*state->m_mask; } -static SCREEN_UPDATE( ramtek ) +static SCREEN_UPDATE_RGB32( ramtek ) { - m79amb_state *state = screen->machine().driver_data(); + m79amb_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 0x2000; offs++) @@ -96,7 +96,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x++; data <<= 1; @@ -214,10 +214,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(ramtek) + MCFG_SCREEN_UPDATE_STATIC(ramtek) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/m90.c mame-0.145/src/mame/drivers/m90.c --- mame-0.144/src/mame/drivers/m90.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/m90.c 2012-02-06 21:30:35.000000000 +0000 @@ -730,10 +730,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(6*8, 54*8-1, 17*8, 47*8-1) - MCFG_SCREEN_UPDATE(m90) + MCFG_SCREEN_UPDATE_STATIC(m90) MCFG_GFXDECODE(m90) MCFG_PALETTE_LENGTH(512) @@ -820,7 +819,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(10*8, 50*8-1, 17*8, 47*8-1) - MCFG_SCREEN_UPDATE(bomblord) + MCFG_SCREEN_UPDATE_STATIC(bomblord) MCFG_VIDEO_START(bomblord) MACHINE_CONFIG_END @@ -839,7 +838,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(dynablsb) + MCFG_SCREEN_UPDATE_STATIC(dynablsb) MCFG_VIDEO_START(dynablsb) diff -Nru mame-0.144/src/mame/drivers/m92.c mame-0.145/src/mame/drivers/m92.c --- mame-0.144/src/mame/drivers/m92.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/m92.c 2012-02-06 21:30:35.000000000 +0000 @@ -917,10 +917,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(80, 511-112, 8, 247) /* 320 x 240 */ - MCFG_SCREEN_UPDATE(m92) + MCFG_SCREEN_UPDATE_STATIC(m92) MCFG_GFXDECODE(m92) MCFG_PALETTE_LENGTH(2048) @@ -1004,10 +1003,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(80, 511-112, 8, 247) /* 320 x 240 */ - MCFG_SCREEN_UPDATE(ppan) + MCFG_SCREEN_UPDATE_STATIC(ppan) MCFG_GFXDECODE(m92) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/macrossp.c mame-0.145/src/mame/drivers/macrossp.c --- mame-0.144/src/mame/drivers/macrossp.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/macrossp.c 2012-02-06 21:30:35.000000000 +0000 @@ -642,11 +642,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*16, 16*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 0*16, 15*16-1) - MCFG_SCREEN_UPDATE(macrossp) - MCFG_SCREEN_EOF(macrossp) + MCFG_SCREEN_UPDATE_STATIC(macrossp) + MCFG_SCREEN_VBLANK_STATIC(macrossp) MCFG_GFXDECODE(macrossp) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/macs.c mame-0.145/src/mame/drivers/macs.c --- mame-0.144/src/mame/drivers/macs.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/macs.c 2012-02-06 21:30:39.000000000 +0000 @@ -482,10 +482,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(128*8, 128*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 128*8-1, 0*8, 128*8-1) - MCFG_SCREEN_UPDATE(st0016) + MCFG_SCREEN_UPDATE_STATIC(st0016) MCFG_GFXDECODE(macs) MCFG_PALETTE_LENGTH(16*16*4+1) diff -Nru mame-0.144/src/mame/drivers/madmotor.c mame-0.145/src/mame/drivers/madmotor.c --- mame-0.144/src/mame/drivers/madmotor.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/madmotor.c 2012-02-06 21:30:34.000000000 +0000 @@ -267,10 +267,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration taken from Burger Time */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(madmotor) + MCFG_SCREEN_UPDATE_STATIC(madmotor) MCFG_GFXDECODE(madmotor) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/magic10.c mame-0.145/src/mame/drivers/magic10.c --- mame-0.144/src/mame/drivers/magic10.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/magic10.c 2012-02-06 21:30:38.000000000 +0000 @@ -111,21 +111,21 @@ { magic10_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_layer0_videoram[offset]); - tilemap_mark_tile_dirty( state->m_layer0_tilemap, offset >> 1); + state->m_layer0_tilemap->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( layer1_videoram_w ) { magic10_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_layer1_videoram[offset]); - tilemap_mark_tile_dirty( state->m_layer1_tilemap, offset >> 1); + state->m_layer1_tilemap->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( layer2_videoram_w ) { magic10_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_layer2_videoram[offset]); - tilemap_mark_tile_dirty( state->m_layer2_tilemap, offset >> 1); + state->m_layer2_tilemap->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( paletteram_w ) @@ -179,27 +179,27 @@ state->m_layer1_tilemap = tilemap_create(machine, get_layer1_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_layer2_tilemap = tilemap_create(machine, get_layer2_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_layer1_tilemap, 0); - tilemap_set_transparent_pen(state->m_layer2_tilemap, 0); + state->m_layer1_tilemap->set_transparent_pen(0); + state->m_layer2_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( magic10 ) +static SCREEN_UPDATE_IND16( magic10 ) { - magic10_state *state = screen->machine().driver_data(); + magic10_state *state = screen.machine().driver_data(); /*TODO: understand where this comes from. */ - tilemap_set_scrollx(state->m_layer2_tilemap, 0, state->m_layer2_offset[0]); - tilemap_set_scrolly(state->m_layer2_tilemap, 0, state->m_layer2_offset[1]); + state->m_layer2_tilemap->set_scrollx(0, state->m_layer2_offset[0]); + state->m_layer2_tilemap->set_scrolly(0, state->m_layer2_offset[1]); /* 4 and 6 are y/x global register writes. 0 and 2 are y/x writes for the scrolling layer. */ - tilemap_set_scrolly(state->m_layer1_tilemap, 0, (state->m_vregs[0/2] - state->m_vregs[4/2])+0); - tilemap_set_scrollx(state->m_layer1_tilemap, 0, (state->m_vregs[2/2] - state->m_vregs[6/2])+4); + state->m_layer1_tilemap->set_scrolly(0, (state->m_vregs[0/2] - state->m_vregs[4/2])+0); + state->m_layer1_tilemap->set_scrollx(0, (state->m_vregs[2/2] - state->m_vregs[6/2])+4); - tilemap_draw(bitmap, cliprect, state->m_layer0_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_layer1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_layer2_tilemap, 0, 0); + state->m_layer0_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_layer1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_layer2_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -724,10 +724,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(magic10) + MCFG_SCREEN_UPDATE_STATIC(magic10) MCFG_PALETTE_LENGTH(0x100) MCFG_GFXDECODE(magic10) diff -Nru mame-0.144/src/mame/drivers/magicard.c mame-0.145/src/mame/drivers/magicard.c --- mame-0.144/src/mame/drivers/magicard.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/magicard.c 2012-02-06 21:30:34.000000000 +0000 @@ -379,13 +379,13 @@ } -static SCREEN_UPDATE(magicard) +static SCREEN_UPDATE_RGB32(magicard) { - magicard_state *state = screen->machine().driver_data(); + magicard_state *state = screen.machine().driver_data(); int x,y; UINT32 count; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); //TODO + bitmap.fill(get_black_pen(screen.machine()), cliprect); //TODO if(!(SCC_DE_VREG)) //display enable return 0; @@ -402,23 +402,23 @@ color = ((state->m_magicram[count]) & 0x000f)>>0; - if(((x*4)+3)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*4)+3) = screen->machine().pens[color]; + if(cliprect.contains((x*4)+3, y)) + bitmap.pix32(y, (x*4)+3) = screen.machine().pens[color]; color = ((state->m_magicram[count]) & 0x00f0)>>4; - if(((x*4)+2)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*4)+2) = screen->machine().pens[color]; + if(cliprect.contains((x*4)+2, y)) + bitmap.pix32(y, (x*4)+2) = screen.machine().pens[color]; color = ((state->m_magicram[count]) & 0x0f00)>>8; - if(((x*4)+1)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*4)+1) = screen->machine().pens[color]; + if(cliprect.contains((x*4)+1, y)) + bitmap.pix32(y, (x*4)+1) = screen.machine().pens[color]; color = ((state->m_magicram[count]) & 0xf000)>>12; - if(((x*4)+0)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*4)+0) = screen->machine().pens[color]; + if(cliprect.contains((x*4)+0, y)) + bitmap.pix32(y, (x*4)+0) = screen.machine().pens[color]; count++; } @@ -434,13 +434,13 @@ color = ((state->m_magicram[count]) & 0x00ff)>>0; - if(((x*2)+1)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*2)+1) = screen->machine().pens[color]; + if(cliprect.contains((x*2)+1, y)) + bitmap.pix32(y, (x*2)+1) = screen.machine().pens[color]; color = ((state->m_magicram[count]) & 0xff00)>>8; - if(((x*2)+0)visible_area().max_x && ((y)+0)visible_area().max_y) - *BITMAP_ADDR32(bitmap, y, (x*2)+0) = screen->machine().pens[color]; + if(cliprect.contains((x*2)+0, y)) + bitmap.pix32(y, (x*2)+0) = screen.machine().pens[color]; count++; } @@ -710,10 +710,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1) //dynamic resolution,TODO - MCFG_SCREEN_UPDATE(magicard) + MCFG_SCREEN_UPDATE_STATIC(magicard) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/magicfly.c mame-0.145/src/mame/drivers/magicfly.c --- mame-0.144/src/mame/drivers/magicfly.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/magicfly.c 2012-02-06 21:30:34.000000000 +0000 @@ -439,14 +439,14 @@ { magicfly_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( magicfly_colorram_w ) { magicfly_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_magicfly_tile_info ) @@ -513,10 +513,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_7mezzo_tile_info, tilemap_scan_rows, 8, 8, 32, 29); } -static SCREEN_UPDATE( magicfly ) +static SCREEN_UPDATE_IND16( magicfly ) { - magicfly_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + magicfly_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -809,10 +809,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((39+1)*8, (31+1)*8) /* Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). */ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) /* Taken from MC6845 init, registers 01 & 06. */ - MCFG_SCREEN_UPDATE(magicfly) + MCFG_SCREEN_UPDATE_STATIC(magicfly) MCFG_GFXDECODE(magicfly) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/magictg.c mame-0.145/src/mame/drivers/magictg.c --- mame-0.144/src/mame/drivers/magictg.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/magictg.c 2012-02-06 21:30:38.000000000 +0000 @@ -258,9 +258,9 @@ } -static SCREEN_UPDATE( magictg ) +static SCREEN_UPDATE_RGB32( magictg ) { - magictg_state* state = screen->machine().driver_data(); + magictg_state* state = screen.machine().driver_data(); return voodoo_update(state->m_voodoo[0], bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -946,12 +946,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(1024, 1024) MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 447) MCFG_VIDEO_START(magictg) - MCFG_SCREEN_UPDATE(magictg) + MCFG_SCREEN_UPDATE_STATIC(magictg) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/magmax.c mame-0.145/src/mame/drivers/magmax.c --- mame-0.144/src/mame/drivers/magmax.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/magmax.c 2012-02-06 21:30:36.000000000 +0000 @@ -368,10 +368,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(magmax) + MCFG_SCREEN_UPDATE_STATIC(magmax) MCFG_GFXDECODE(magmax) MCFG_PALETTE_LENGTH(1*16 + 16*16 + 256) diff -Nru mame-0.144/src/mame/drivers/magtouch.c mame-0.145/src/mame/drivers/magtouch.c --- mame-0.144/src/mame/drivers/magtouch.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/magtouch.c 2012-02-06 21:30:42.000000000 +0000 @@ -180,14 +180,7 @@ pic8259_ir1_w(machine.device("pic8259_1"), state); } -static const struct pc_vga_interface vga_interface = -{ - NULL, - NULL, - NULL, - AS_IO, - 0x0000 -}; +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static MACHINE_START( magtouch ) { @@ -240,7 +233,8 @@ static DRIVER_INIT(magtouch) { - pc_vga_init(machine, &vga_interface, NULL); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); } GAME( 1995, magtouch, 0, magtouch, magtouch, magtouch, ROT0, "Micro Manufacturing", "Magical Touch", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/mainevt.c mame-0.145/src/mame/drivers/mainevt.c --- mame-0.144/src/mame/drivers/mainevt.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mainevt.c 2012-02-06 21:30:42.000000000 +0000 @@ -100,12 +100,14 @@ upd7759_reset_w(state->m_upd, data & 2); upd7759_start_w(state->m_upd, data & 1); - interrupt_enable_w(space, 0, data & 4); + state->m_sound_irq_mask = data & 4; } static WRITE8_HANDLER( devstor_sh_irqcontrol_w ) { - interrupt_enable_w(space, 0, data & 4); + mainevt_state *state = space->machine().driver_data(); + + state->m_sound_irq_mask = data & 4; } static WRITE8_HANDLER( mainevt_sh_bankswitch_w ) @@ -439,6 +441,22 @@ state->m_nmi_enable = 0; } +static INTERRUPT_GEN( mainevt_sound_timer_irq ) +{ + mainevt_state *state = device->machine().driver_data(); + + if(state->m_sound_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + +static INTERRUPT_GEN( devstors_sound_timer_irq ) +{ + mainevt_state *state = device->machine().driver_data(); + + if(state->m_sound_irq_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( mainevt, mainevt_state ) /* basic machine hardware */ @@ -448,7 +466,7 @@ MCFG_CPU_ADD("audiocpu", Z80, 3579545) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(mainevt_sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,8*60) /* ??? */ + MCFG_CPU_PERIODIC_INT(mainevt_sound_timer_irq,8*60) /* ??? */ MCFG_MACHINE_START(mainevt) MCFG_MACHINE_RESET(mainevt) @@ -459,10 +477,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(mainevt) + MCFG_SCREEN_UPDATE_STATIC(mainevt) MCFG_PALETTE_LENGTH(256) @@ -509,7 +526,7 @@ MCFG_CPU_ADD("audiocpu", Z80, 3579545) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(devstors_sound_map) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,4*60) /* ??? */ + MCFG_CPU_PERIODIC_INT(devstors_sound_timer_irq,4*60) /* ??? */ MCFG_MACHINE_START(mainevt) MCFG_MACHINE_RESET(mainevt) @@ -520,10 +537,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(dv) + MCFG_SCREEN_UPDATE_STATIC(dv) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/mainsnk.c mame-0.145/src/mame/drivers/mainsnk.c --- mame-0.144/src/mame/drivers/mainsnk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mainsnk.c 2012-02-06 21:30:42.000000000 +0000 @@ -405,10 +405,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1) - MCFG_SCREEN_UPDATE(mainsnk) + MCFG_SCREEN_UPDATE_STATIC(mainsnk) MCFG_GFXDECODE(mainsnk) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/majorpkr.c mame-0.145/src/mame/drivers/majorpkr.c --- mame-0.144/src/mame/drivers/majorpkr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/majorpkr.c 2012-02-06 21:30:33.000000000 +0000 @@ -513,7 +513,7 @@ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, tilemap_scan_rows, 16, 8, 36, 28); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info, tilemap_scan_rows, 16, 8, 36, 28); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->machine().generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 4 * 0x800); @@ -521,29 +521,27 @@ } -static SCREEN_UPDATE(majorpkr) +static SCREEN_UPDATE_IND16(majorpkr) { - majorpkr_state *state = screen->machine().driver_data(); + majorpkr_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); rectangle custom_clip; /* The following custom_clip is to exclude the last char column (unused) form the render. We need more proof about how the video is working. */ - custom_clip.min_x=cliprect->min_x; - custom_clip.max_x=cliprect->max_x-16; - custom_clip.min_y=cliprect->min_y; - custom_clip.max_y=cliprect->max_y; + custom_clip = cliprect; + custom_clip.max_x -= 16; - tilemap_draw(bitmap, &custom_clip, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, &custom_clip, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, custom_clip, 0, 0); + state->m_fg_tilemap->draw(bitmap, custom_clip, 0, 0); if (state->m_flip_state == 1) { - tilemap_set_flip(state->m_bg_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); - tilemap_set_flip(state->m_fg_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + state->m_bg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY); + state->m_fg_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY); } return 0; @@ -604,13 +602,13 @@ if (state->m_vram_bank == 0) { - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } else { if (state->m_vram_bank == 1) { - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } else { @@ -1037,7 +1035,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(52.786) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((47+1)*16, (36+1)*8) /* through CRTC registers: 768 x 296 */ MCFG_SCREEN_VISIBLE_AREA(0, (36*16)-1, 0, (28*8)-1) /* through CRTC registers: 560(+16) x 224 */ @@ -1045,7 +1042,7 @@ MCFG_PALETTE_LENGTH(0x100 * 16) MCFG_VIDEO_START(majorpkr) - MCFG_SCREEN_UPDATE(majorpkr) + MCFG_SCREEN_UPDATE_STATIC(majorpkr) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) /* verified */ diff -Nru mame-0.144/src/mame/drivers/malzak.c mame-0.145/src/mame/drivers/malzak.c --- mame-0.144/src/mame/drivers/malzak.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/malzak.c 2012-02-06 21:30:37.000000000 +0000 @@ -409,10 +409,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(SAA5050_VBLANK)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(480, 512) /* vert size is a guess */ MCFG_SCREEN_VISIBLE_AREA(0, 479, 0, 479) - MCFG_SCREEN_UPDATE(malzak) + MCFG_SCREEN_UPDATE_STATIC(malzak) MCFG_GFXDECODE(malzak) MCFG_PALETTE_LENGTH(128) diff -Nru mame-0.144/src/mame/drivers/mappy.c mame-0.145/src/mame/drivers/mappy.c --- mame-0.144/src/mame/drivers/mappy.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mappy.c 2012-02-06 21:30:36.000000000 +0000 @@ -31,8 +31,8 @@ sprites are 4bpp instead of 2bpp, so the final stage of video generation is a little different as well, though the custom ICs are still the same. Dig Dig II and Motos are almost the same, apart from larger ROMs. - Tower of Druaga also has 4x the amount of sprite color combinations so it's - the most different of the four. + The Tower of Druaga also has 4x the amount of sprite color combinations so + it's the most different of the four. Custom ICs (Super Pacman and Mappy): @@ -117,7 +117,7 @@ Mappy memory map ---------------- -Tower of Druaga, Dig Dug 2, Motos are the same, with minor differences. +The Tower of Druaga, Dig Dug 2, Motos are the same, with minor differences. The main difference with Super Pac-Man is the increased video RAM, needed to implement a scrolling tilemap. @@ -154,7 +154,7 @@ 111xxxxxxxxxxxxx R xxxxxxxx ROM 1B program ROM [2] [1] only half of that space is actually used, because only 2 of the possible 4 I/O chips are present -[2] Tower of Druaga, Dig Dug 2, Motos have 2 128k ROMs instead of 3 64k: +[2] The Tower of Druaga, Dig Dug 2, Motos have 2 128k ROMs instead of 3 64k: 10xxxxxxxxxxxxxx R xxxxxxxx ROM 1D program ROM 11xxxxxxxxxxxxxx R xxxxxxxx ROM 1B program ROM [3] Overlaps the ROM region. Dig Dug 2 reads it. @@ -446,7 +446,7 @@ (c) 1983 NAMCO ALL RIGHTS RESERVED -- Tower of Druaga +- The Tower of Druaga - enter service mode - select sound 19 - press S to display the grid @@ -518,7 +518,7 @@ 99.99.999.9999.9999.9999 99.99.999.9999.9999.0000 -- Tower of Druaga: keep button 1 pressed while pressing the start button to +- The Tower of Druaga: keep button 1 pressed while pressing the start button to continue the previous game; you can choose which level to start from. - Grobda: when the Level Select dip switch is On, after inserting a coin press @@ -579,6 +579,7 @@ static WRITE8_HANDLER( superpac_latch_w ) { + mappy_state *state = space->machine().driver_data(); device_t *namcoio_1 = space->machine().device("namcoio_1"); device_t *namcoio_2 = space->machine().device("namcoio_2"); int bit = offset & 1; @@ -586,13 +587,13 @@ switch (offset & 0x0e) { case 0x00: /* INT ON 2 */ - cpu_interrupt_enable(space->machine().device("sub"), bit); + state->m_sub_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); break; case 0x02: /* INT ON */ - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; @@ -623,6 +624,7 @@ static WRITE8_HANDLER( phozon_latch_w ) { + mappy_state *state = space->machine().driver_data(); device_t *namcoio_1 = space->machine().device("namcoio_1"); device_t *namcoio_2 = space->machine().device("namcoio_2"); int bit = offset & 1; @@ -630,19 +632,19 @@ switch (offset & 0x0e) { case 0x00: - cpu_interrupt_enable(space->machine().device("sub"), bit); + state->m_sub_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); break; case 0x02: - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; case 0x04: - cpu_interrupt_enable(space->machine().device("sub2"), bit); + state->m_sub2_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "sub2", 0, CLEAR_LINE); break; @@ -671,6 +673,7 @@ static WRITE8_HANDLER( mappy_latch_w ) { + mappy_state *state = space->machine().driver_data(); device_t *namcoio_1 = space->machine().device("namcoio_1"); device_t *namcoio_2 = space->machine().device("namcoio_2"); int bit = offset & 1; @@ -678,13 +681,13 @@ switch (offset & 0x0e) { case 0x00: /* INT ON 2 */ - cpu_interrupt_enable(space->machine().device("sub"), bit); + state->m_sub_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); break; case 0x02: /* INT ON */ - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; @@ -763,13 +766,14 @@ } } -static INTERRUPT_GEN( superpac_interrupt_1 ) +static INTERRUPT_GEN( superpac_main_vblank_irq ) { + mappy_state *state = device->machine().driver_data(); device_t *namcoio_1 = device->machine().device("namcoio_1"); device_t *namcoio_2 = device->machine().device("namcoio_2"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if (state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); if (!namcoio_read_reset_line(namcoio_1)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(superpac_io_run)); @@ -794,13 +798,14 @@ } } -static INTERRUPT_GEN( pacnpal_interrupt_1 ) +static INTERRUPT_GEN( pacnpal_main_vblank_irq ) { + mappy_state *state = device->machine().driver_data(); device_t *namcoio_1 = device->machine().device("namcoio_1"); device_t *namcoio_2 = device->machine().device("namcoio_2"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if (state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); if (!namcoio_read_reset_line(namcoio_1)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(pacnpal_io_run)); @@ -825,13 +830,14 @@ } } -static INTERRUPT_GEN( phozon_interrupt_1 ) +static INTERRUPT_GEN( phozon_main_vblank_irq ) { + mappy_state *state = device->machine().driver_data(); device_t *namcoio_1 = device->machine().device("namcoio_1"); device_t *namcoio_2 = device->machine().device("namcoio_2"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if (state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); if (!namcoio_read_reset_line(namcoio_1)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(phozon_io_run)); @@ -856,13 +862,14 @@ } } -static INTERRUPT_GEN( mappy_interrupt_1 ) +static INTERRUPT_GEN( mappy_main_vblank_irq ) { + mappy_state *state = device->machine().driver_data(); device_t *namcoio_1 = device->machine().device("namcoio_1"); device_t *namcoio_2 = device->machine().device("namcoio_2"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if(state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); if (!namcoio_read_reset_line(namcoio_1)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(mappy_io_run)); @@ -871,6 +878,21 @@ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(mappy_io_run), 1); } +static INTERRUPT_GEN( sub_vblank_irq ) +{ + mappy_state *state = device->machine().driver_data(); + + if(state->m_sub_irq_mask) + cputag_set_input_line(device->machine(), "sub", 0, ASSERT_LINE); +} + +static INTERRUPT_GEN( sub2_vblank_irq ) +{ + mappy_state *state = device->machine().driver_data(); + + if(state->m_sub2_irq_mask) + cputag_set_input_line(device->machine(), "sub2", 0, ASSERT_LINE); +} static ADDRESS_MAP_START( superpac_cpu1_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM_WRITE(superpac_videoram_w) AM_BASE_MEMBER(mappy_state,m_videoram) /* video RAM */ @@ -1601,21 +1623,31 @@ NULL }; +static MACHINE_START( mappy ) +{ + mappy_state *state = machine.driver_data(); + + state->save_item(NAME(state->m_main_irq_mask)); + state->save_item(NAME(state->m_sub_irq_mask)); + state->save_item(NAME(state->m_sub2_irq_mask)); +} + static MACHINE_CONFIG_START( superpac, mappy_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, PIXEL_CLOCK/4) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(superpac_cpu1_map) - MCFG_CPU_VBLANK_INT("screen", superpac_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", superpac_main_vblank_irq) // also update the custom I/O chips MCFG_CPU_ADD("sub", M6809, PIXEL_CLOCK/4) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(superpac_cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(8) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ /* synchronization of the CPUs */ + MCFG_MACHINE_START(mappy) MCFG_MACHINE_RESET(superpac) MCFG_NAMCO56XX_ADD("namcoio_1", intf0) @@ -1626,9 +1658,8 @@ MCFG_PALETTE_LENGTH(64*4+64*4) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(superpac) + MCFG_SCREEN_UPDATE_STATIC(superpac) MCFG_PALETTE_INIT(superpac) MCFG_VIDEO_START(superpac) @@ -1645,7 +1676,7 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", pacnpal_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", pacnpal_main_vblank_irq) // also update the custom I/O chips MCFG_DEVICE_REMOVE("namcoio_1") MCFG_DEVICE_REMOVE("namcoio_2") @@ -1658,7 +1689,7 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", phozon_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", phozon_main_vblank_irq) // also update the custom I/O chips MCFG_DEVICE_REMOVE("namcoio_1") MCFG_DEVICE_REMOVE("namcoio_2") @@ -1676,19 +1707,20 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, PIXEL_CLOCK/4) /* MAIN CPU */ MCFG_CPU_PROGRAM_MAP(phozon_cpu1_map) - MCFG_CPU_VBLANK_INT("screen", phozon_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", phozon_main_vblank_irq) // also update the custom I/O chips MCFG_CPU_ADD("sub", M6809, PIXEL_CLOCK/4) /* SOUND CPU */ MCFG_CPU_PROGRAM_MAP(phozon_cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("sub2", M6809, PIXEL_CLOCK/4) /* SUB CPU */ MCFG_CPU_PROGRAM_MAP(phozon_cpu3_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub2_vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(8) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ /* synchronization of the CPUs */ + MCFG_MACHINE_START(mappy) MCFG_MACHINE_RESET(phozon) MCFG_NAMCO58XX_ADD("namcoio_1", intf0) @@ -1699,9 +1731,8 @@ MCFG_PALETTE_LENGTH(64*4+64*4) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(phozon) + MCFG_SCREEN_UPDATE_STATIC(phozon) MCFG_PALETTE_INIT(phozon) MCFG_VIDEO_START(phozon) @@ -1720,15 +1751,16 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, PIXEL_CLOCK/4) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(mappy_cpu1_map) - MCFG_CPU_VBLANK_INT("screen", mappy_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", mappy_main_vblank_irq) // also update the custom I/O chips MCFG_CPU_ADD("sub", M6809, PIXEL_CLOCK/4) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(mappy_cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(8) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ /* synchronization of the CPUs */ + MCFG_MACHINE_START(mappy) MCFG_MACHINE_RESET(mappy) MCFG_NAMCO58XX_ADD("namcoio_1", intf0) @@ -1739,9 +1771,8 @@ MCFG_PALETTE_LENGTH(64*4+16*16) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(mappy) + MCFG_SCREEN_UPDATE_STATIC(mappy) MCFG_PALETTE_INIT(mappy) MCFG_VIDEO_START(mappy) @@ -1758,7 +1789,7 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", phozon_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", phozon_main_vblank_irq) // also update the custom I/O chips MCFG_WATCHDOG_VBLANK_INIT(0) @@ -1772,7 +1803,7 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", phozon_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", phozon_main_vblank_irq) // also update the custom I/O chips MCFG_DEVICE_REMOVE("namcoio_1") MCFG_DEVICE_REMOVE("namcoio_2") @@ -1788,7 +1819,7 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT("screen", superpac_interrupt_1) // also update the custom I/O chips + MCFG_CPU_VBLANK_INT("screen", superpac_main_vblank_irq) // also update the custom I/O chips MCFG_DEVICE_REMOVE("namcoio_1") MCFG_DEVICE_REMOVE("namcoio_2") @@ -2266,9 +2297,9 @@ /* 2x6809, scroling tilemap, 4bpp sprites (Super Pacman type) */ GAME( 1983, mappy, 0, mappy, mappy, 0, ROT90, "Namco", "Mappy (US)", GAME_SUPPORTS_SAVE ) GAME( 1983, mappyj, mappy, mappy, mappy, 0, ROT90, "Namco", "Mappy (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1984, todruaga, 0, todruaga, todruaga, 0, ROT90, "Namco", "Tower of Druaga (New Ver.)", GAME_SUPPORTS_SAVE ) -GAME( 1984, todruagao,todruaga, todruaga, todruaga, 0, ROT90, "Namco", "Tower of Druaga (Old Ver.)", GAME_SUPPORTS_SAVE ) -GAME( 1984, todruagas,todruaga, todruaga, todruaga, 0, ROT90, "bootleg? (Sidam)", "Tower of Druaga (Sidam)", GAME_SUPPORTS_SAVE ) +GAME( 1984, todruaga, 0, todruaga, todruaga, 0, ROT90, "Namco", "The Tower of Druaga (New Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1984, todruagao,todruaga, todruaga, todruaga, 0, ROT90, "Namco", "The Tower of Druaga (Old Ver.)", GAME_SUPPORTS_SAVE ) +GAME( 1984, todruagas,todruaga, todruaga, todruaga, 0, ROT90, "bootleg? (Sidam)", "The Tower of Druaga (Sidam)", GAME_SUPPORTS_SAVE ) GAME( 1985, digdug2, 0, digdug2, digdug2, digdug2, ROT90, "Namco", "Dig Dug II (New Ver.)", GAME_SUPPORTS_SAVE ) GAME( 1985, digdug2o, digdug2, digdug2, digdug2, digdug2, ROT90, "Namco", "Dig Dug II (Old Ver.)", GAME_SUPPORTS_SAVE ) GAME( 1985, motos, 0, motos, motos, 0, ROT90, "Namco", "Motos", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/marineb.c mame-0.145/src/mame/drivers/marineb.c --- mame-0.144/src/mame/drivers/marineb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/marineb.c 2012-02-06 21:30:35.000000000 +0000 @@ -41,13 +41,6 @@ #include "includes/marineb.h" -static TIMER_CALLBACK( interrupt_disable ) -{ - marineb_state *state = machine.driver_data(); - //interrupt_enable = 0; - cpu_interrupt_enable(state->m_maincpu, 0); -} - static MACHINE_RESET( marineb ) { marineb_state *state = machine.driver_data(); @@ -57,9 +50,6 @@ state->m_flipscreen_x = 0; state->m_flipscreen_y = 0; state->m_marineb_active_low_flipscreen = 0; - - /* we must start with NMI interrupts disabled */ - machine.scheduler().synchronize(FUNC(interrupt_disable)); } static MACHINE_RESET( springer ) @@ -81,6 +71,13 @@ state->save_item(NAME(state->m_marineb_active_low_flipscreen)); } +static WRITE8_HANDLER( irq_mask_w ) +{ + marineb_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} + static ADDRESS_MAP_START( marineb_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM @@ -90,7 +87,7 @@ AM_RANGE(0x9800, 0x9800) AM_WRITE(marineb_column_scroll_w) AM_RANGE(0x9a00, 0x9a00) AM_WRITE(marineb_palette_bank_0_w) AM_RANGE(0x9c00, 0x9c00) AM_WRITE(marineb_palette_bank_1_w) - AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_WRITE(irq_mask_w) AM_RANGE(0xa001, 0xa001) AM_WRITE(marineb_flipscreen_y_w) AM_RANGE(0xa002, 0xa002) AM_WRITE(marineb_flipscreen_x_w) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P1") @@ -530,6 +527,22 @@ GFXDECODE_ENTRY( "gfx2", 0x0000, marineb_big_spritelayout, 0, 64 ) GFXDECODE_END +static INTERRUPT_GEN( marineb_vblank_irq ) +{ + marineb_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + +static INTERRUPT_GEN( wanted_vblank_irq ) +{ + marineb_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( marineb, marineb_state ) @@ -537,7 +550,7 @@ MCFG_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(marineb_map) MCFG_CPU_IO_MAP(marineb_io_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", marineb_vblank_irq) MCFG_MACHINE_START(marineb) MCFG_MACHINE_RESET(marineb) @@ -546,10 +559,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(marineb) + MCFG_SCREEN_UPDATE_STATIC(marineb) MCFG_GFXDECODE(marineb) MCFG_PALETTE_LENGTH(256) @@ -571,7 +583,7 @@ /* video hardware */ MCFG_GFXDECODE(changes) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(changes) + MCFG_SCREEN_UPDATE_STATIC(changes) MACHINE_CONFIG_END @@ -582,7 +594,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(springer) + MCFG_SCREEN_UPDATE_STATIC(springer) MACHINE_CONFIG_END @@ -593,7 +605,7 @@ /* video hardware */ MCFG_GFXDECODE(hoccer) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(hoccer) + MCFG_SCREEN_UPDATE_STATIC(hoccer) MACHINE_CONFIG_END @@ -602,12 +614,12 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(wanted_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", wanted_vblank_irq) /* video hardware */ MCFG_GFXDECODE(wanted) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(springer) + MCFG_SCREEN_UPDATE_STATIC(springer) /* sound hardware */ MCFG_SOUND_REPLACE("ay1", AY8910, 1500000) @@ -625,7 +637,7 @@ /* video hardware */ MCFG_GFXDECODE(hopprobo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(hopprobo) + MCFG_SCREEN_UPDATE_STATIC(hopprobo) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/marinedt.c mame-0.145/src/mame/drivers/marinedt.c --- mame-0.144/src/mame/drivers/marinedt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/marinedt.c 2012-02-06 21:30:42.000000000 +0000 @@ -107,9 +107,9 @@ UINT8 * m_tx_tileram; /* video-related */ - bitmap_t *m_tile; - bitmap_t *m_obj1; - bitmap_t *m_obj2; + bitmap_ind16 *m_tile; + bitmap_ind16 *m_obj1; + bitmap_ind16 *m_obj2; tilemap_t *m_tx_tilemap; UINT8 m_obj1_a; @@ -138,7 +138,7 @@ marinedt_state *state = space->machine().driver_data(); state->m_tx_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static READ8_HANDLER( marinedt_port1_r ) @@ -287,9 +287,9 @@ mame_printf_debug("tile non-flip\n"); if (data & 0x02) - tilemap_set_flip(state->m_tx_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + state->m_tx_tilemap->set_flip(TILEMAP_FLIPX | TILEMAP_FLIPY); else - tilemap_set_flip(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_flip(0); } state->m_pf = data; @@ -483,13 +483,13 @@ marinedt_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_scrolldx(state->m_tx_tilemap, 0, 4*8); - tilemap_set_scrolldy(state->m_tx_tilemap, 0, -4*8); - - state->m_tile = auto_bitmap_alloc(machine, 32 * 8, 32 * 8, machine.primary_screen->format()); - state->m_obj1 = auto_bitmap_alloc(machine, 32, 32, machine.primary_screen->format()); - state->m_obj2 = auto_bitmap_alloc(machine, 32, 32, machine.primary_screen->format()); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_scrolldx(0, 4*8); + state->m_tx_tilemap->set_scrolldy(0, -4*8); + + state->m_tile = auto_bitmap_ind16_alloc(machine, 32 * 8, 32 * 8); + state->m_obj1 = auto_bitmap_ind16_alloc(machine, 32, 32); + state->m_obj2 = auto_bitmap_ind16_alloc(machine, 32, 32); } @@ -506,37 +506,37 @@ #define OBJ_FLIPX(a) ((state->m_pf & 0x02) == 0) #define OBJ_FLIPY(a) ((a) & 0x80) -static SCREEN_UPDATE( marinedt ) +static SCREEN_UPDATE_IND16( marinedt ) { - marinedt_state *state = screen->machine().driver_data(); + marinedt_state *state = screen.machine().driver_data(); int sx, sy; - bitmap_fill(state->m_tile, NULL, 0); - tilemap_draw(state->m_tile, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tile->fill(0); + state->m_tx_tilemap->draw(*state->m_tile, cliprect, 0, 0); - bitmap_fill(state->m_obj1, NULL, 0); - drawgfx_transpen(state->m_obj1, NULL, screen->machine().gfx[1], + state->m_obj1->fill(0); + drawgfx_transpen(*state->m_obj1, state->m_obj1->cliprect(), screen.machine().gfx[1], OBJ_CODE(state->m_obj1_a), OBJ_COLOR(state->m_obj1_a), OBJ_FLIPX(state->m_obj1_a), OBJ_FLIPY(state->m_obj1_a), 0, 0, 0); - bitmap_fill(state->m_obj2, NULL, 0); - drawgfx_transpen(state->m_obj2, NULL, screen->machine().gfx[2], + state->m_obj2->fill(0); + drawgfx_transpen(*state->m_obj2, state->m_obj2->cliprect(), screen.machine().gfx[2], OBJ_CODE(state->m_obj2_a), OBJ_COLOR(state->m_obj2_a), OBJ_FLIPX(state->m_obj2_a), OBJ_FLIPY(state->m_obj2_a), 0, 0, 0); - bitmap_fill(bitmap, NULL, 0); + bitmap.fill(0); if (state->m_pd & 0x02) - copybitmap_trans(bitmap, state->m_obj2, 0, 0, OBJ_X(state->m_obj2_x), OBJ_Y(state->m_obj2_y), cliprect, 0); + copybitmap_trans(bitmap, *state->m_obj2, 0, 0, OBJ_X(state->m_obj2_x), OBJ_Y(state->m_obj2_y), cliprect, 0); if (state->m_pd & 0x01) - copybitmap_trans(bitmap, state->m_obj1, 0, 0, OBJ_X(state->m_obj1_x), OBJ_Y(state->m_obj1_y), cliprect, 0); + copybitmap_trans(bitmap, *state->m_obj1, 0, 0, OBJ_X(state->m_obj1_x), OBJ_Y(state->m_obj1_y), cliprect, 0); - copybitmap_trans(bitmap, state->m_tile, 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *state->m_tile, 0, 0, 0, 0, cliprect, 0); state->m_coll = state->m_cx = state->m_cyr = state->m_cyq = 0; if (state->m_pd & 0x01) @@ -547,13 +547,13 @@ int x = OBJ_X(state->m_obj1_x) + sx; int y = OBJ_Y(state->m_obj1_y) + sy; - if (x < cliprect->min_x || x > cliprect->max_x || y < cliprect->min_y || y > cliprect->max_y) + if (!cliprect.contains(x, y)) continue; - if (*BITMAP_ADDR16(state->m_obj1, sy, sx) == 0) + if (state->m_obj1->pix16(sy, sx) == 0) continue; - if (*BITMAP_ADDR16(state->m_tile, y, x) != 0) + if (state->m_tile->pix16(y, x) != 0) { state->m_coll = 0x08; @@ -586,10 +586,10 @@ if (xx < 0 || xx >= 32 || yy < 0 || yy >= 32) continue; - if (*BITMAP_ADDR16(state->m_obj1, sy, sx) == 0) + if (state->m_obj1->pix16(sy, sx) == 0) continue; - if (*BITMAP_ADDR16(state->m_obj2, yy, xx) != 0) + if (state->m_obj2->pix16(yy, xx) != 0) { state->m_collh = 0x80; @@ -672,10 +672,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(4*8+32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(marinedt) + MCFG_SCREEN_UPDATE_STATIC(marinedt) MCFG_GFXDECODE(marinedt) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/mario.c mame-0.145/src/mame/drivers/mario.c --- mame-0.144/src/mame/drivers/mario.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mario.c 2012-02-06 21:30:36.000000000 +0000 @@ -120,6 +120,12 @@ z80dma_rdy_w(device, data & 0x01); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + mario_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} /************************************* * @@ -138,7 +144,7 @@ AM_RANGE(0x7e80, 0x7e80) AM_WRITE(mario_gfxbank_w) AM_RANGE(0x7e82, 0x7e82) AM_WRITE(mario_flip_w) AM_RANGE(0x7e83, 0x7e83) AM_WRITE(mario_palettebank_w) - AM_RANGE(0x7e84, 0x7e84) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x7e84, 0x7e84) AM_WRITE(nmi_mask_w) AM_RANGE(0x7e85, 0x7e85) AM_DEVWRITE("z80dma", mario_z80dma_rdy_w) /* ==> DMA Chip */ AM_RANGE(0x7f00, 0x7f07) AM_WRITE(mario_sh3_w) /* Sound port */ AM_RANGE(0x7f80, 0x7f80) AM_READ_PORT("DSW") /* DSW */ @@ -158,7 +164,7 @@ AM_RANGE(0x7e80, 0x7e80) AM_WRITE(mario_gfxbank_w) AM_RANGE(0x7e82, 0x7e82) AM_WRITE(mario_flip_w) AM_RANGE(0x7e83, 0x7e83) AM_WRITE(mario_palettebank_w) - AM_RANGE(0x7e84, 0x7e84) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x7e84, 0x7e84) AM_WRITE(nmi_mask_w) AM_RANGE(0x7e85, 0x7e85) AM_DEVWRITE("z80dma", mario_z80dma_rdy_w) /* ==> DMA Chip */ AM_RANGE(0x7f00, 0x7f00) AM_WRITE(masao_sh_irqtrigger_w) AM_RANGE(0x7f80, 0x7f80) AM_READ_PORT("DSW") /* DSW */ @@ -317,22 +323,29 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + mario_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( mario_base, mario_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, Z80_CLOCK) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mario_map) MCFG_CPU_IO_MAP(mario_io_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* devices */ MCFG_Z80DMA_ADD("z80dma", Z80_CLOCK, mario_dma) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(mario) + MCFG_SCREEN_UPDATE_STATIC(mario) MCFG_GFXDECODE(mario) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/markham.c mame-0.145/src/mame/drivers/markham.c --- mame-0.144/src/mame/drivers/markham.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/markham.c 2012-02-06 21:30:35.000000000 +0000 @@ -189,10 +189,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(markham) + MCFG_SCREEN_UPDATE_STATIC(markham) MCFG_GFXDECODE(markham) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/mastboy.c mame-0.145/src/mame/drivers/mastboy.c --- mame-0.144/src/mame/drivers/mastboy.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mastboy.c 2012-02-06 21:30:37.000000000 +0000 @@ -470,9 +470,9 @@ gfx_element_set_source(machine.gfx[0], state->m_vram); } -static SCREEN_UPDATE(mastboy) +static SCREEN_UPDATE_IND16(mastboy) { - mastboy_state *state = screen->machine().driver_data(); + mastboy_state *state = screen.machine().driver_data(); int y,x,i; int count = 0x000; @@ -480,7 +480,7 @@ { int coldat = state->m_colram[i+1] | (state->m_colram[i+0]<<8); - palette_set_color_rgb(screen->machine(),i/2,pal4bit(coldat>>8),pal4bit(coldat>>12),pal4bit(coldat>>4)); + palette_set_color_rgb(screen.machine(),i/2,pal4bit(coldat>>8),pal4bit(coldat>>12),pal4bit(coldat>>4)); } for (y=0;y<32;y++) @@ -494,12 +494,12 @@ if (tileno&0x800) { - gfx = screen->machine().gfx[1]; + gfx = screen.machine().gfx[1]; tileno &=0x7ff; } else { - gfx = screen->machine().gfx[0]; + gfx = screen.machine().gfx[0]; } @@ -891,10 +891,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(6000000.0f / 384.0f / 282.0f) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(mastboy) + MCFG_SCREEN_UPDATE_STATIC(mastboy) MCFG_GFXDECODE(mastboy) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/matmania.c mame-0.145/src/mame/drivers/matmania.c --- mame-0.144/src/mame/drivers/matmania.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/matmania.c 2012-02-06 21:30:38.000000000 +0000 @@ -326,10 +326,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(matmania) + MCFG_SCREEN_UPDATE_STATIC(matmania) MCFG_GFXDECODE(matmania) MCFG_PALETTE_LENGTH(64+16) @@ -428,10 +427,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(maniach) + MCFG_SCREEN_UPDATE_STATIC(maniach) MCFG_GFXDECODE(maniach) MCFG_PALETTE_LENGTH(64+16) diff -Nru mame-0.144/src/mame/drivers/maxaflex.c mame-0.145/src/mame/drivers/maxaflex.c --- mame-0.144/src/mame/drivers/maxaflex.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/maxaflex.c 2012-02-06 21:30:36.000000000 +0000 @@ -11,7 +11,6 @@ ******************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "cpu/m6805/m6805.h" #include "includes/atari.h" @@ -368,26 +367,54 @@ atari_interrupt_cb }; +READ8_DEVICE_HANDLER(maxaflex_atari_pia_pa_r) +{ + return atari_input_disabled(device->machine()) ? 0xFF : input_port_read_safe(device->machine(), "djoy_0_1", 0); +} + +READ8_DEVICE_HANDLER(maxaflex_atari_pia_pb_r) +{ + return atari_input_disabled(device->machine()) ? 0xFF : input_port_read_safe(device->machine(), "djoy_2_3", 0); +} + + +const pia6821_interface maxaflex_atarixl_pia_interface = +{ + DEVCB_HANDLER(maxaflex_atari_pia_pa_r), /* port A in */ + DEVCB_HANDLER(maxaflex_atari_pia_pb_r), /* port B in */ + DEVCB_NULL, /* line CA1 in */ + DEVCB_NULL, /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_NULL, /* port A out */ + DEVCB_HANDLER(a600xl_pia_pb_w), /* port B out */ + DEVCB_NULL, /* line CA2 out */ + DEVCB_LINE(atari_pia_cb2_w), /* port CB2 out */ + DEVCB_NULL, /* IRQA */ + DEVCB_NULL /* IRQB */ +}; + + + static MACHINE_CONFIG_START( a600xl, maxaflex_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT) MCFG_CPU_PROGRAM_MAP(a600xl_mem) - MCFG_CPU_VBLANK_INT_HACK(a800xl_interrupt, TOTAL_LINES_60HZ) + MCFG_TIMER_ADD_SCANLINE("scantimer", a800xl_interrupt, "screen", 0, 1) MCFG_CPU_ADD("mcu", M68705, 3579545) MCFG_CPU_PROGRAM_MAP(mcu_mem) - MCFG_PIA6821_ADD("pia", atarixl_pia_interface) + MCFG_PIA6821_ADD("pia", maxaflex_atarixl_pia_interface) MCFG_TIMER_ADD("mcu_timer", mcu_timer_proc) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_VISIBLE_AREA(MIN_X, MAX_X, MIN_Y, MAX_Y) MCFG_SCREEN_REFRESH_RATE(FRAME_RATE_60HZ) MCFG_SCREEN_SIZE(HWIDTH*8, TOTAL_LINES_60HZ) - MCFG_SCREEN_UPDATE(atari) + MCFG_SCREEN_UPDATE_STATIC(atari) MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(atari) diff -Nru mame-0.144/src/mame/drivers/maygay1b.c mame-0.145/src/mame/drivers/maygay1b.c --- mame-0.144/src/mame/drivers/maygay1b.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/maygay1b.c 2012-02-06 21:30:40.000000000 +0000 @@ -969,6 +969,16 @@ ROM_LOAD( "supersleuth.p1", 0x000000, 0x080000, CRC(2417208f) SHA1(5c51bdcfa566aa8b2379d529441d37b2145864bb) )\ ROM_LOAD( "supersleuth.p2", 0x080000, 0x080000, CRC(892d3a4d) SHA1(bb585a9fda56f2f0859707973f771d60c5dfa080) )\ +#define m1_coderd_sound \ + ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 )\ + ROM_LOAD( "code_red.s1", 0x000000, 0x080000, CRC(616b939d) SHA1(1a94747efe430e508086fdb66da3f3e7daf7c4f3) )\ + ROM_LOAD( "code_red.s2", 0x080000, 0x080000, CRC(bee44524) SHA1(dd3837559b375e1055e6aa6c984bfd88102a5825) )\ + +#define m1_coro_sound \ + ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 )\ + ROM_LOAD( "digi0421.bin", 0x000000, 0x080000, CRC(9489c9cd) SHA1(1a858b2a6f41898bbf95611e9f13d668c8a05c9c) )\ + ROM_LOAD( "digi0422.bin", 0x080000, 0x080000, CRC(cf17088e) SHA1(54c9a52ccdd1ca622367367e1304fe4e4037b0b9) )\ + ROM_START( m1albsq ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "sa5-056", 0x0000, 0x010000, CRC(6f3bc318) SHA1(6dbe6e02ca762a8ffaed9c89a0da5f6a10d829cc) )//4.1 Normal Token @@ -1850,68 +1860,177 @@ +ROM_START( m1coderd ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sc991130", 0x0000, 0x020000, CRC(d3add67f) SHA1(f7387978f18680921a2aff0296de2b9609f3215d) )//ncr21 + m1_coderd_sound +ROM_END_M1A_MCU +ROM_START( m1coderdp ) + ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sc991131", 0x0000, 0x020000, CRC(d5b90a02) SHA1(18a5642175ee330832ce95ac2fcb3a662cfe4273) )//pcr21 + m1_coderd_sound +ROM_END_M1A_MCU +//1996 +ROM_START( m1coro ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa6-192", 0x0000, 0x010000, CRC(5a4b0f17) SHA1(04ae2db3a29485672faaedd22c5780dd71176c96) )//CORO + m1_coro_sound +ROM_END_M1A_MCU +ROM_START( m1corop ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa6-193", 0x0000, 0x010000, CRC(b2a392f1) SHA1(d7b908373eb3e225e399c36847ef2481ea3ad65a) )//PCORO + m1_coro_sound +ROM_END_M1A_MCU +//1995 +ROM_START( m1coro32g ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa6-049", 0x0000, 0x010000, CRC(dfa086ae) SHA1(c5fa5d435a603851ab6bbe5860ee38e41aea814e) )//3.2 G? + m1_coro_sound +ROM_END_M1A_MCU +ROM_START( m1coro32gh ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "cns58c", 0x0000, 0x010000, CRC(e254a369) SHA1(10c03b108f9fb9ffb16c4cf47fac74625d2e7877) )//sa6-049 alt 3.2 + m1_coro_sound +ROM_END_M1A_MCU +ROM_START( m1coro12a ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "cns58t", 0x0000, 0x010000, CRC(1b2c1306) SHA1(7fa7c0238685dc2a91354ae47674247e95707613) )//1.2 sa5-447 alt + m1_coro_sound +ROM_END_M1A_MCU +ROM_START( m1coro12g ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-447", 0x0000, 0x010000, CRC(5b292c6e) SHA1(584a5d64ee47054870785222f85a58a721165530) )//1.2 Gala? BwB labelled + m1_coro_sound +ROM_END_M1A_MCU -ROM_START( m1coderd ) - ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "sc991130", 0x0000, 0x020000, CRC(d3add67f) SHA1(f7387978f18680921a2aff0296de2b9609f3215d) ) +ROM_START( m1coro12gp ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-448", 0x0000, 0x010000, CRC(e0e481c3) SHA1(062b8f58a7d9fa9163fd98892a6cc8099d4d234c) )//1.2 Gala? protocol + m1_coro_sound +ROM_END_M1A_MCU - ROM_REGION( 0x20000, "altrevs", ROMREGION_ERASE00 ) - ROM_LOAD( "sc991131", 0x0000, 0x020000, CRC(d5b90a02) SHA1(18a5642175ee330832ce95ac2fcb3a662cfe4273) ) +ROM_START( m1coro10h1 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "cns5.10", 0x0000, 0x010000, CRC(91dc8625) SHA1(525c4311355bb3aa3052160bc439c49f5cecbcc6) )//1.0 G hack + m1_coro_sound +ROM_END_M1A_MCU - ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) - ROM_LOAD( "code_red.s1", 0x000000, 0x080000, CRC(616b939d) SHA1(1a94747efe430e508086fdb66da3f3e7daf7c4f3) ) - ROM_LOAD( "code_red.s2", 0x080000, 0x080000, CRC(bee44524) SHA1(dd3837559b375e1055e6aa6c984bfd88102a5825) ) +ROM_START( m1coro10h2 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "cst5p5bin", 0x0000, 0x010000, CRC(0ab4535b) SHA1(fc334b9da2736f8d57adb76095df8e957fb7667d) )//1.0 hack 5p 5GBP + m1_coro_sound ROM_END_M1A_MCU -ROM_START( m1coro ) +ROM_START( m1coro10h3 ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "cns58c", 0x0000, 0x010000, CRC(e254a369) SHA1(10c03b108f9fb9ffb16c4cf47fac74625d2e7877) ) + ROM_LOAD( "cnst5.5v2", 0x0000, 0x010000, CRC(a5b2589e) SHA1(cabd5abf996c1bb9ca7a0ffcc5d666aa632f6789) )//1.0 Gala hack 2 + m1_coro_sound +ROM_END_M1A_MCU - ROM_REGION( 0x20000, "altrevs", ROMREGION_ERASE00 ) - ROM_LOAD( "cns58t", 0x0000, 0x010000, CRC(1b2c1306) SHA1(7fa7c0238685dc2a91354ae47674247e95707613) ) - ROM_LOAD( "coro2010", 0x0000, 0x010000, CRC(a7cfd3e9) SHA1(1b8fee6397d137cfae8bcd93b6a3b8e36b2716b8) ) - ROM_LOAD( "cst5p5bin", 0x0000, 0x010000, CRC(0ab4535b) SHA1(fc334b9da2736f8d57adb76095df8e957fb7667d) ) - ROM_LOAD( "sa4-450", 0x0000, 0x010000, CRC(355e10f4) SHA1(5de193ea05988e6eb1190cff357581671a87c82f) ) - ROM_LOAD( "sa4-451", 0x0000, 0x010000, CRC(ddb68d12) SHA1(b399504a8a17129b88e9f95ab1942c7448e5fbb3) ) - ROM_LOAD( "sa4-529", 0x0000, 0x010000, CRC(ca486f81) SHA1(001669f92d9d548854b3c2c9e9c5b7141c9d2b32) ) - ROM_LOAD( "sa4-530", 0x0000, 0x010000, CRC(4ade92e9) SHA1(2d5d18cfab8ff5a5f5790168375548a56b6903b0) ) - ROM_LOAD( "sa5-048", 0x0000, 0x010000, CRC(fbd5c2ae) SHA1(c05959664fcee7f3f05c6f81c1a98d2fc6b59141) ) - ROM_LOAD( "sa5-049", 0x0000, 0x010000, CRC(133d5f48) SHA1(b4f89e5cf1d4ef60f73be18d372c38b22126e651) ) - ROM_LOAD( "sa5-208.bin", 0x0000, 0x010000, CRC(66f06d18) SHA1(fd14b09280815c03126d113e6be791a20483aae9) ) - ROM_LOAD( "sa5-209", 0x0000, 0x010000, CRC(8e18f0fe) SHA1(8d6c0fbd05484dc42b976228b7575e0ca0eea239) ) - ROM_LOAD( "sa5-393", 0x0000, 0x010000, CRC(abbdfe46) SHA1(a6e005849b6da9801331155eb73fa169f6f42265) ) - ROM_LOAD( "sa5-394", 0x0000, 0x010000, CRC(a7a5a6ff) SHA1(0805d3f1148e0aa83f8c0c804c08df3624a3af72) ) - ROM_LOAD( "sa5-395", 0x0000, 0x010000, CRC(980a56ba) SHA1(372744f165e0105346c567013b0c8ddec2ec0f7d) ) - ROM_LOAD( "sa5-396", 0x0000, 0x010000, CRC(2cb28869) SHA1(0dc78252b8e56a4b18342e5d1583ed4a0ea1db38) ) - ROM_LOAD( "sa5-397", 0x0000, 0x010000, CRC(6b91fff5) SHA1(e29ae21bfd7d7e3139bfb65b60bd4bafcece5b24) ) - ROM_LOAD( "sa5-399", 0x0000, 0x010000, CRC(0e290f63) SHA1(a5c8f2b125836ca76a7707d09d8e4a2f3058a9df) ) - ROM_LOAD( "sa6-192", 0x0000, 0x010000, CRC(5a4b0f17) SHA1(04ae2db3a29485672faaedd22c5780dd71176c96) ) - ROM_LOAD( "sa6-193", 0x0000, 0x010000, CRC(b2a392f1) SHA1(d7b908373eb3e225e399c36847ef2481ea3ad65a) ) - - ROM_LOAD( "cns5.10", 0x0000, 0x010000, CRC(91dc8625) SHA1(525c4311355bb3aa3052160bc439c49f5cecbcc6) ) - ROM_LOAD( "cnst5.5v2", 0x0000, 0x010000, CRC(a5b2589e) SHA1(cabd5abf996c1bb9ca7a0ffcc5d666aa632f6789) ) - ROM_LOAD( "sa5-306", 0x0000, 0x010000, CRC(a94a8f48) SHA1(56d5723d8087f523061280d9afe15a1bf8b269f5) ) - ROM_LOAD( "sa5-307", 0x0000, 0x010000, CRC(41a212ae) SHA1(463a7d93f3b8b073cb83bda2a957dab37070ba8b) ) - ROM_LOAD( "sa5-447", 0x0000, 0x010000, CRC(5b292c6e) SHA1(584a5d64ee47054870785222f85a58a721165530) ) - ROM_LOAD( "sa5-448", 0x0000, 0x010000, CRC(e0e481c3) SHA1(062b8f58a7d9fa9163fd98892a6cc8099d4d234c) ) - ROM_LOAD( "sa6-049", 0x0000, 0x010000, CRC(dfa086ae) SHA1(c5fa5d435a603851ab6bbe5860ee38e41aea814e) ) +//1993 +ROM_START( m1coro81 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-048", 0x0000, 0x010000, CRC(fbd5c2ae) SHA1(c05959664fcee7f3f05c6f81c1a98d2fc6b59141) )//8.1 + m1_coro_sound +ROM_END_M1A_MCU - // BWB Set - ROM_LOAD( "cs______.1_1", 0x0000, 0x010000, CRC(5b292c6e) SHA1(584a5d64ee47054870785222f85a58a721165530) ) +ROM_START( m1coro81p ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-049", 0x0000, 0x010000, CRC(133d5f48) SHA1(b4f89e5cf1d4ef60f73be18d372c38b22126e651) )//8.1 Protocol + m1_coro_sound +ROM_END_M1A_MCU +ROM_START( m1coro32n ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-399", 0x0000, 0x010000, CRC(0e290f63) SHA1(a5c8f2b125836ca76a7707d09d8e4a2f3058a9df) )//3.2 newer + m1_coro_sound +ROM_END_M1A_MCU - ROM_REGION( 0x100000, "oki", ROMREGION_ERASE00 ) - ROM_LOAD( "digi0421.bin", 0x000000, 0x080000, CRC(9489c9cd) SHA1(1a858b2a6f41898bbf95611e9f13d668c8a05c9c) ) - ROM_LOAD( "digi0422.bin", 0x080000, 0x080000, CRC(cf17088e) SHA1(54c9a52ccdd1ca622367367e1304fe4e4037b0b9) ) +ROM_START( m1coro32np ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-397", 0x0000, 0x010000, CRC(6b91fff5) SHA1(e29ae21bfd7d7e3139bfb65b60bd4bafcece5b24) )//3.2 newer protocol (Poss mislabel) + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro22n ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-395", 0x0000, 0x010000, CRC(980a56ba) SHA1(372744f165e0105346c567013b0c8ddec2ec0f7d) )//2.2 newer + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro21n ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-208", 0x0000, 0x010000, CRC(66f06d18) SHA1(fd14b09280815c03126d113e6be791a20483aae9) )//2.1 newer + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro21np ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-209", 0x0000, 0x010000, CRC(8e18f0fe) SHA1(8d6c0fbd05484dc42b976228b7575e0ca0eea239) )//2.1 newer protocol + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro12n ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-393", 0x0000, 0x010000, CRC(abbdfe46) SHA1(a6e005849b6da9801331155eb73fa169f6f42265) )//1.2 newer + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro12np ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-394", 0x0000, 0x010000, CRC(a7a5a6ff) SHA1(0805d3f1148e0aa83f8c0c804c08df3624a3af72) )//1.2 newer protocol + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro11n ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-306", 0x0000, 0x010000, CRC(a94a8f48) SHA1(56d5723d8087f523061280d9afe15a1bf8b269f5) )//1.1 newer + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro11np ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa5-307", 0x0000, 0x010000, CRC(41a212ae) SHA1(463a7d93f3b8b073cb83bda2a957dab37070ba8b) )//1.1 newer protocol + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro31 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa4-450", 0x0000, 0x010000, CRC(355e10f4) SHA1(5de193ea05988e6eb1190cff357581671a87c82f) )//3.1 Normal + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro31p ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa4-451", 0x0000, 0x010000, CRC(ddb68d12) SHA1(b399504a8a17129b88e9f95ab1942c7448e5fbb3) )//3.1 Protocol + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro30h ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "coro2010", 0x0000, 0x010000, CRC(a7cfd3e9) SHA1(1b8fee6397d137cfae8bcd93b6a3b8e36b2716b8) )//sa5-399 hack 20GBP? + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro21v ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa4-529", 0x0000, 0x010000, CRC(ca486f81) SHA1(001669f92d9d548854b3c2c9e9c5b7141c9d2b32) )//2.1 Multivend + m1_coro_sound +ROM_END_M1A_MCU + +ROM_START( m1coro21vp ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "sa4-530", 0x0000, 0x010000, CRC(4ade92e9) SHA1(2d5d18cfab8ff5a5f5790168375548a56b6903b0) )//2.1 Multivend Protocol + m1_coro_sound ROM_END_M1A_MCU ROM_START( m1cororr ) @@ -3874,277 +3993,306 @@ } } +#define GAME_FLAGS GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL -GAME( 1993, m1albsq ,0 ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v4.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1albsqp ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v4.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1albsq3 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v3.0 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1albsq2 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v2.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1albsq1 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1albsq1p ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 199?, m1alley ,0 ,m1,m1,m1, ROT0, "Maygay", "Alley Cat (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 1997, m1apollo ,0 ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollop ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apolloh ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apolloa ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apolloap ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apolloao ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older, 15GBP) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo9 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v9.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo9p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v9.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo4 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Newer) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo4p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo11 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo11b ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (BwB Rebuild) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo11p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo8 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v8.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo8p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v8.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo7 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v7.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo7p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v7.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo5 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v5.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo5p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v5.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo4o ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Older, Token)(M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo3 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v3.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo3p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v3.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo2 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1apollo2p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 199?, m1bankbs ,0 ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.9 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1bankbsp ,m1bankbs ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.9 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1bankbso ,m1bankbs ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.8 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1bankrl ,0 ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1bankrlp ,m1bankrl ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1bankrl2p ,m1bankrl ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1bargn ,0 ,m1,m1,m1, ROT0, "Maygay", "Bar-gain (Maygay) v7.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1bargnp ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Bar-gain (Maygay) v7.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1bargnc ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Casino Bar-gain (Maygay) v5.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1bargncp ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Casino Bar-gain (Maygay) v5.1 (Protocol)(M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 2000, m1bigdel ,0 ,m1,m1,m1, ROT0, "Maygay", "Big Deal (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1blkhol ,0 ,m1,m1,m1, ROT0, "Maygay", "Black Hole (Dutch) (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1992, m1bluemx ,0 ,m1,m1,m1, ROT0, "Maygay", "Blue Max (Maygay) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1992, m1bluemxp ,m1bluemx ,m1,m1,m1, ROT0, "Maygay", "Blue Max (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi ,0 ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Newer) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondip ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi4 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v4.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi4p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v4.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi3 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v3.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi2 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi2p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi2po ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi1 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bondi1p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1bounty ,0 ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1bountc ,0 ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter Club (Maygay) v1.3 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1bountcp ,m1bountc ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter Club (Maygay) v1.3 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik ,0 ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cikp ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cikh ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik51 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik51p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik51o ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik41 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v4.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik41p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v4.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik31 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v3.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik31p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v3.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik21 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik21p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik12 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik11 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik11p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik11n ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (alternate) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1997, m1cik11np ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (alternate,Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casclbp ,m1casclb ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casclb1 ,m1casclb ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casgcl ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Gambler Club (Maygay) v1.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casgclp ,m1casgcl ,m1,m1,m1, ROT0, "Maygay", "Casino Gambler Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casroy ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casroyp ,m1casroy ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1990, m1casroy1 ,m1casroy ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1chain ,0 ,m1,m1,m1, ROT0, "Maygay", "Chain Reaction (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1clbfvr ,0 ,m1,m1,m1, ROT0, "Maygay", "Club Fever (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1clbfvrp ,m1clbfvr ,m1,m1,m1, ROT0, "Maygay", "Club Fever (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedo ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v6.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedop ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v6.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedo5 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v5.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedo5p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v5.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedoi ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v7.2 (Isle of Man) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedoip ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v7.2 (Isle of Man) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedon ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.2 (Newer) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedonp ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.2 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob2 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob2p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob2h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob1 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob1p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1995, m1cluedob1h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo4 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v4.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo4p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v4.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo3 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo3p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo3h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo1 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo1p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluedo1h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (Hack?) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 1993, m1cluecb ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v3.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluecbp ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v3.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluecb2 ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v2.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluecb2p ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v2.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluecb1 ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v1.1 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluecb1p ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v1.1 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluesh ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1clueshp ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1cluesho ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1993, m1clueshop ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluess ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessh ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (Newer) (Hack) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessa ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Newer) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessap ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Newer) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessb ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessbp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessc ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v6.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesscp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v6.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessd ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessdp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesse ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessep ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessf ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessfp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessg ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (15GBP Jackpot) (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessi ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (10GBP Jackpot) (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessj ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (5GBP Jackpot) (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessk ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessl ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesslp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessm ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessmp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessn ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (10GBP Jackpot) (Older) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesso ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older, alternate) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessop ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older, alternate) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessq ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older, alternate) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessqp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older, alternate) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessr ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older, alternate) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluessrp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older, alternate) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesss ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1? (Older, alternate) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 1996, m1cluesssp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1? (Older, alternate) (Protocol) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 199?, m1coderd ,0 ,m1,m1,m1, ROT0, "Maygay", "Code Red Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1coro ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1cororr ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street - Rovers Return (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1corocb ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1corosh ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street Showcase (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1criss ,0 ,m1,m1,m1, ROT0, "Maygay", "Criss Cross Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1dxmono ,0 ,m1,m1,m1, ROT0, "Maygay", "Deluxe Monopoly (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1dmnhrt ,0 ,m1,m1,m1, ROT0, "Maygay", "Diamond Hearts (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1dm4ev ,0 ,m1,m1,m1, ROT0, "Maygay", "Diamonds Are Forever Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1dkong ,0 ,m1,m1,m1, ROT0, "Maygay", "Donkey Kong (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ee ,0 ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Bwb) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1eea ,m1ee ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Maygay - Bwb) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1eeb ,m1ee ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1eeqv ,0 ,m1,m1,m1, ROT0, "Maygay", "Eastenders - Queen Vic (Maygay - Whitbread) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1eeqva ,m1eeqv ,m1,m1,m1, ROT0, "Maygay", "Eastenders - Queen Vic (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1expclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Explorer Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1fantfb ,0 ,m1,m1,m1, ROT0, "Maygay", "Fantasy Football (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1fight ,0 ,m1,m1,m1, ROT0, "Maygay", "Fight Night (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1fivest ,0 ,m1,m1,m1, ROT0, "Maygay", "Five Star (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1frexpl ,0 ,m1,m1,m1, ROT0, "Maygay", "Fruit Explosion (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1glad ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1glada ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators Arcade (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1gladsh ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators Showcase (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1goldsv ,0 ,m1,m1,m1, ROT0, "Maygay", "Gold & Silver (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1gold10 ,0 ,m1,m1,m1, ROT0, "Maygay", "Golden 10 (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1goldng ,0 ,m1,m1,m1, ROT0, "Maygay", "Golden Nugget Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1gresc ,0 ,m1,m1,m1, ROT0, "Maygay", "Great Escape, The (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1guvnor ,0 ,m1,m1,m1, ROT0, "Maygay", "The Guvnor (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1htclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Hi Tension Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1hotpot ,0 ,m1,m1,m1, ROT0, "Maygay", "Hot Pots (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1infern ,0 ,m1,m1,m1, ROT0, "Maygay", "Inferno (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1imclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Instant Millionaire Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1inwin ,0 ,m1,m1,m1, ROT0, "Maygay", "Instant Win (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1itsko ,0 ,m1,m1,m1, ROT0, "Maygay", "It's A Knockout (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1itjob ,0 ,m1,m1,m1, ROT0, "Maygay", "Italian Job (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1jpmult ,0 ,m1,m1,m1, ROT0, "Maygay", "Jackpot Multiplier (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1jbond ,0 ,m1,m1,m1, ROT0, "Maygay", "James Bond (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1jdwins ,0 ,m1,m1,m1, ROT0, "Maygay", "Jim Davison's Winning Streak (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1liveam ,0 ,m1,m1,m1, ROT0, "Maygay", "Living In America (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1lotmil ,0 ,m1,m1,m1, ROT0, "Maygay", "Lottery Millionaire Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1luckno ,0 ,m1,m1,m1, ROT0, "Maygay", "Lucky Numbers (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1magic ,0 ,m1,m1,m1, ROT0, "Maygay", "Magic Squares (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1manhat ,0 ,m1,m1,m1, ROT0, "Maygay", "Manhattan Skylines (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1bignit ,0 ,m1,m1,m1, ROT0, "Maygay", "Mike Reid's Big Night Out (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1mongam ,0 ,m1,m1,m1, ROT0, "Maygay", "Money Game Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1monmon ,0 ,m1,m1,m1, ROT0, "Maygay", "Money Money Money (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1monod ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly (Maygay) [Dutch] (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1mono ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1moncls ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly Classic (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1monclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1monstr ,0 ,m1,m1,m1, ROT0, "Maygay", "Monster Cash (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1nhp ,0 ,m1,m1,m1, ROT0, "Maygay", "Noel's House Party (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1nudbnk ,0 ,m1,m1,m1, ROT0, "Maygay", "Nudge Banker (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1nudunl ,0 ,m1,m1,m1, ROT0, "Maygay", "Nudges Unlimited (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1omega ,0 ,m1,m1,m1, ROT0, "Maygay", "Omega (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1onbus ,0 ,m1,m1,m1, ROT0, "Maygay", "On The Buses (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ott ,0 ,m1,m1,m1, ROT0, "Maygay", "Over The Top (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1piggy ,0 ,m1,m1,m1, ROT0, "Maygay", "Piggy Bank (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ppd ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther (Maygay) [Dutch] (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1pp ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ppc ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1przclu ,0 ,m1,m1,m1, ROT0, "Maygay", "Prize Cluedo (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1przee ,0 ,m1,m1,m1, ROT0, "Maygay", "Prize Eastenders (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1reeldm ,0 ,m1,m1,m1, ROT0, "Maygay", "Reel Diamonds (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1retpp ,0 ,m1,m1,m1, ROT0, "Maygay", "Return Of The Pink Panther (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1search ,0 ,m1,m1,m1, ROT0, "Maygay", "Search Light (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sixspn ,0 ,m1,m1,m1, ROT0, "Maygay", "Six Spinner (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1spid ,0 ,m1,m1,m1, ROT0, "Maygay", "Spiderman (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1spid2 ,0 ,m1,m1,m1, ROT0, "Maygay", "Spiderman 2 (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sptlgt ,0 ,m1,m1,m1, ROT0, "Maygay", "Spotlight (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1stair ,0 ,m1,m1,m1, ROT0, "Maygay", "Stairway To Heaven (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sudnim ,0 ,m1,m1,m1, ROT0, "Maygay", "Sudden Impact (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sprnov ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Nova (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1suppot ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Pots (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1taknot ,0 ,m1,m1,m1, ROT0, "Maygay", "Take Note (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1tstunt ,0 ,m1,m1,m1, ROT0, "Maygay", "Test Unit (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1thatlf ,0 ,m1,m1,m1, ROT0, "Maygay", "That's Life (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1topten ,0 ,m1,m1,m1, ROT0, "Maygay", "Top Tenner (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1tp ,0 ,m1,m1,m1, ROT0, "Maygay", "Trivial Pursuit (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1tpclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Trivial Pursuit Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ultchl ,0 ,m1,m1,m1, ROT0, "Maygay", "Ultimate Challenge (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1undsie ,0 ,m1,m1,m1, ROT0, "Maygay", "Under Siege (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1vegas ,0 ,m1,m1,m1, ROT0, "Maygay", "Vegas Gambler Club (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1wagon ,0 ,m1,m1,m1, ROT0, "Maygay", "Wagon Trail (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1wotw ,0 ,m1,m1,m1, ROT0, "Maygay", "War Of The Worlds (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1wldzne ,0 ,m1,m1,m1, ROT0, "Maygay", "Wild Zone (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1winenc ,0 ,m1,m1,m1, ROT0, "Maygay", "Winners Enclosure (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1simps ,0 ,m1,m1,m1, ROT0, "Maygay", "The Simpsons (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 199?, m1bghou ,0 ,m1,m1,m1, ROT0, "Gemini", "Big Ghoulies (Gemini) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1crzco ,0 ,m1,m1,m1, ROT0, "Gemini", "Crazy Cobra (Gemini) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1luxor ,0 ,m1,m1,m1, ROT0, "Gemini", "Luxor Casino (Gemini) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 1993, m1albsq ,0 ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v4.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1albsqp ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v4.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1albsq3 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v3.0 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1albsq2 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v2.2 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1albsq1 ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1albsq1p ,m1albsq ,m1,m1,m1, ROT0, "Maygay", "Albert Square (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1alley ,0 ,m1,m1,m1, ROT0, "Maygay", "Alley Cat (Maygay) (M1A/B)",GAME_FLAGS ) + +GAME( 1997, m1apollo ,0 ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollop ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apolloh ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Newer) (Hack?) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apolloa ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apolloap ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apolloao ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) vA.1 (Older, 15GBP) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo9 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v9.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo9p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v9.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo4 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo4p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo11 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo11b ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (BwB Rebuild) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo11p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v11? (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo8 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v8.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo8p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v8.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo7 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v7.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo7p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v7.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo5 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v5.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo5p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v5.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo4o ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v4.1 (Older, Token)(M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo3 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v3.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo3p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v3.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo2 ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1apollo2p ,m1apollo ,m1,m1,m1, ROT0, "Maygay", "Apollo 9 (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1bankbs ,0 ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.9 (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1bankbsp ,m1bankbs ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.9 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1bankbso ,m1bankbs ,m1,m1,m1, ROT0, "Maygay", "Bank Buster Club (Maygay) v2.8 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1bankrl ,0 ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1bankrlp ,m1bankrl ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1bankrl2p ,m1bankrl ,m1,m1,m1, ROT0, "Maygay", "Bank Roll (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1bargn ,0 ,m1,m1,m1, ROT0, "Maygay", "Bar-gain (Maygay) v7.1 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1bargnp ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Bar-gain (Maygay) v7.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1bargnc ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Casino Bar-gain (Maygay) v5.1 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1bargncp ,m1bargn ,m1,m1,m1, ROT0, "Maygay", "Casino Bar-gain (Maygay) v5.1 (Protocol)(M1A/B)",GAME_FLAGS ) +GAME( 2000, m1bigdel ,0 ,m1,m1,m1, ROT0, "Maygay", "Big Deal (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1blkhol ,0 ,m1,m1,m1, ROT0, "Maygay", "Black Hole (Dutch) (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 1992, m1bluemx ,0 ,m1,m1,m1, ROT0, "Maygay", "Blue Max (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1992, m1bluemxp ,m1bluemx ,m1,m1,m1, ROT0, "Maygay", "Blue Max (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi ,0 ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondip ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi4 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v4.1 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi4p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v4.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi3 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v3.1 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi2 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi2p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi2po ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v2.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi1 ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bondi1p ,m1bondi ,m1,m1,m1, ROT0, "Maygay", "Bondi Beach (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1bounty ,0 ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1bountc ,0 ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter Club (Maygay) v1.3 (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1bountcp ,m1bountc ,m1,m1,m1, ROT0, "Maygay", "Bounty Hunter Club (Maygay) v1.3 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik ,0 ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cikp ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cikh ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v11? (Hack?) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik51 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik51p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik51o ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v5.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik41 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v4.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik41p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v4.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik31 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v3.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik31p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v3.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik21 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik21p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik12 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.2 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik11 ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik11p ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik11n ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1997, m1cik11np ,m1cik ,m1,m1,m1, ROT0, "Maygay", "Cash Is King (Maygay) v1.1 (alternate,Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.2 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casclbp ,m1casclb ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casclb1 ,m1casclb ,m1,m1,m1, ROT0, "Maygay", "Casino Club (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casgcl ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Gambler Club (Maygay) v1.2 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casgclp ,m1casgcl ,m1,m1,m1, ROT0, "Maygay", "Casino Gambler Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casroy ,0 ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.2 (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casroyp ,m1casroy ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.2 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1990, m1casroy1 ,m1casroy ,m1,m1,m1, ROT0, "Maygay", "Casino Royale Club (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1chain ,0 ,m1,m1,m1, ROT0, "Maygay", "Chain Reaction (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1clbfvr ,0 ,m1,m1,m1, ROT0, "Maygay", "Club Fever (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1clbfvrp ,m1clbfvr ,m1,m1,m1, ROT0, "Maygay", "Club Fever (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedo ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v6.1 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedop ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v6.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedo5 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v5.1 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedo5p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v5.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedoi ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v7.2 (Isle of Man) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedoip ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v7.2 (Isle of Man) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedon ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.2 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedonp ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.2 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob2 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob2p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob2h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v2.1 (Hack?) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob1 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob1p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1cluedob1h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay/BwB", "Cluedo (Maygay/BwB) v1.1 (Hack?) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo4 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v4.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo4p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v4.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo3 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo3p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo3h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v3.1 (Hack?) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo1 ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo1p ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluedo1h ,m1cluedo ,m1,m1,m1, ROT0, "Maygay", "Cluedo (Maygay) v1.1 (Hack?) (M1A/B)",GAME_FLAGS ) + +GAME( 1993, m1cluecb ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v3.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluecbp ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v3.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluecb2 ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluecb2p ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluecb1 ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v1.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluecb1p ,m1cluecb ,m1,m1,m1, ROT0, "Maygay", "Cluedo Club (Maygay) v1.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluesh ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1clueshp ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1cluesho ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1clueshop ,m1cluesh ,m1,m1,m1, ROT0, "Maygay", "Super Cluedo Showcase (Maygay) v1.2 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluess ,0 ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessh ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (Newer) (Hack) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessa ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessap ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessb ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessbp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessc ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v6.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesscp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v6.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessd ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessdp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesse ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessep ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessf ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessfp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessg ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v7.1 (15GBP Jackpot) (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessi ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (10GBP Jackpot) (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessj ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.3 (5GBP Jackpot) (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessk ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.2 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessl ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesslp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessm ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessmp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessn ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v1.1 (10GBP Jackpot) (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesso ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older, alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessop ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v2.1 (Older, alternate) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessq ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older, alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessqp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v5.1 (Older, alternate) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessr ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older, alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluessrp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v3.1 (Older, alternate) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesss ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1? (Older, alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1cluesssp ,m1cluess ,m1,m1,m1, ROT0, "Maygay", "Cluedo Super Sleuth (Maygay) v4.1? (Older, alternate) (Protocol) (M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1coderd ,0 ,m1,m1,m1, ROT0, "Maygay", "Code Red Club (Maygay) v2.1 (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1coderdp ,m1coderd ,m1,m1,m1, ROT0, "Maygay", "Code Red Club (Maygay) v2.1 (Protocol) (M1A/B)",GAME_FLAGS ) + +GAME( 1996, m1coro ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 1996, m1corop ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro32g ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.2 (Newer, G?) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro32gh ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.2 (Newer, G?) (Hack) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro12g ,m1coro ,m1,m1,m1, ROT0, "Maygay/BwB?", "Coronation Street (Maygay) v1.2 (Newer, G?) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro12gp ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.2 (Newer, G?) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro12a ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.2 (Newer, G?) (Alternate) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro10h1 ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.0 (Hack 1) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro10h2 ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.0 (Hack 2) (M1A/B)",GAME_FLAGS ) +GAME( 1995, m1coro10h3 ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.0 (Hack 3) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro81 ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v8.1 (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro81p ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v8.1 (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro32n ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.2 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro32np ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.2 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro22n ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v2.2 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro21n ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v2.1 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro21np ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v2.1 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro12n ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.2 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro12np ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.2 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro11n ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.1 (Newer) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro11np ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v1.1 (Newer) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro31 ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.1 (Older) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro31p ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.1 (Older) (Protocol) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro30h ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v3.0 (Hack) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro21v ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v2.1 (Multivend) (M1A/B)",GAME_FLAGS ) +GAME( 1993, m1coro21vp ,m1coro ,m1,m1,m1, ROT0, "Maygay", "Coronation Street (Maygay) v2.1 (Multivend) (Protocol)(M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1cororr ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street - Rovers Return (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1corocb ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1corosh ,0 ,m1,m1,m1, ROT0, "Maygay", "Coronation Street Showcase (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1criss ,0 ,m1,m1,m1, ROT0, "Maygay", "Criss Cross Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1dxmono ,0 ,m1,m1,m1, ROT0, "Maygay", "Deluxe Monopoly (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1dmnhrt ,0 ,m1,m1,m1, ROT0, "Maygay", "Diamond Hearts (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1dm4ev ,0 ,m1,m1,m1, ROT0, "Maygay", "Diamonds Are Forever Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1dkong ,0 ,m1,m1,m1, ROT0, "Maygay", "Donkey Kong (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ee ,0 ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Bwb) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1eea ,m1ee ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Maygay - Bwb) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1eeb ,m1ee ,m1,m1,m1, ROT0, "Maygay", "Eastenders (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1eeqv ,0 ,m1,m1,m1, ROT0, "Maygay", "Eastenders - Queen Vic (Maygay - Whitbread) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1eeqva ,m1eeqv ,m1,m1,m1, ROT0, "Maygay", "Eastenders - Queen Vic (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1expclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Explorer Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1fantfb ,0 ,m1,m1,m1, ROT0, "Maygay", "Fantasy Football (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1fight ,0 ,m1,m1,m1, ROT0, "Maygay", "Fight Night (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1fivest ,0 ,m1,m1,m1, ROT0, "Maygay", "Five Star (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1frexpl ,0 ,m1,m1,m1, ROT0, "Maygay", "Fruit Explosion (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1glad ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1glada ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators Arcade (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1gladsh ,0 ,m1,m1,m1, ROT0, "Maygay", "Gladiators Showcase (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1goldsv ,0 ,m1,m1,m1, ROT0, "Maygay", "Gold & Silver (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1gold10 ,0 ,m1,m1,m1, ROT0, "Maygay", "Golden 10 (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1goldng ,0 ,m1,m1,m1, ROT0, "Maygay", "Golden Nugget Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1gresc ,0 ,m1,m1,m1, ROT0, "Maygay", "Great Escape, The (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1guvnor ,0 ,m1,m1,m1, ROT0, "Maygay", "The Guvnor (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1htclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Hi Tension Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1hotpot ,0 ,m1,m1,m1, ROT0, "Maygay", "Hot Pots (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1infern ,0 ,m1,m1,m1, ROT0, "Maygay", "Inferno (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1imclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Instant Millionaire Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1inwin ,0 ,m1,m1,m1, ROT0, "Maygay", "Instant Win (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1itsko ,0 ,m1,m1,m1, ROT0, "Maygay", "It's A Knockout (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1itjob ,0 ,m1,m1,m1, ROT0, "Maygay", "Italian Job (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1jpmult ,0 ,m1,m1,m1, ROT0, "Maygay", "Jackpot Multiplier (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1jbond ,0 ,m1,m1,m1, ROT0, "Maygay", "James Bond (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1jdwins ,0 ,m1,m1,m1, ROT0, "Maygay", "Jim Davison's Winning Streak (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1liveam ,0 ,m1,m1,m1, ROT0, "Maygay", "Living In America (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1lotmil ,0 ,m1,m1,m1, ROT0, "Maygay", "Lottery Millionaire Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1luckno ,0 ,m1,m1,m1, ROT0, "Maygay", "Lucky Numbers (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1magic ,0 ,m1,m1,m1, ROT0, "Maygay", "Magic Squares (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1manhat ,0 ,m1,m1,m1, ROT0, "Maygay", "Manhattan Skylines (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1bignit ,0 ,m1,m1,m1, ROT0, "Maygay", "Mike Reid's Big Night Out (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1mongam ,0 ,m1,m1,m1, ROT0, "Maygay", "Money Game Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1monmon ,0 ,m1,m1,m1, ROT0, "Maygay", "Money Money Money (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1monod ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly (Maygay) [Dutch] (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1mono ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1moncls ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly Classic (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1monclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Monopoly Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1monstr ,0 ,m1,m1,m1, ROT0, "Maygay", "Monster Cash (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1nhp ,0 ,m1,m1,m1, ROT0, "Maygay", "Noel's House Party (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1nudbnk ,0 ,m1,m1,m1, ROT0, "Maygay", "Nudge Banker (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1nudunl ,0 ,m1,m1,m1, ROT0, "Maygay", "Nudges Unlimited (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1omega ,0 ,m1,m1,m1, ROT0, "Maygay", "Omega (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1onbus ,0 ,m1,m1,m1, ROT0, "Maygay", "On The Buses (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ott ,0 ,m1,m1,m1, ROT0, "Maygay", "Over The Top (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1piggy ,0 ,m1,m1,m1, ROT0, "Maygay", "Piggy Bank (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ppd ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther (Maygay) [Dutch] (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1pp ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ppc ,0 ,m1,m1,m1, ROT0, "Maygay", "Pink Panther Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1przclu ,0 ,m1,m1,m1, ROT0, "Maygay", "Prize Cluedo (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1przee ,0 ,m1,m1,m1, ROT0, "Maygay", "Prize Eastenders (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1reeldm ,0 ,m1,m1,m1, ROT0, "Maygay", "Reel Diamonds (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1retpp ,0 ,m1,m1,m1, ROT0, "Maygay", "Return Of The Pink Panther (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1search ,0 ,m1,m1,m1, ROT0, "Maygay", "Search Light (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sixspn ,0 ,m1,m1,m1, ROT0, "Maygay", "Six Spinner (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1spid ,0 ,m1,m1,m1, ROT0, "Maygay", "Spiderman (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1spid2 ,0 ,m1,m1,m1, ROT0, "Maygay", "Spiderman 2 (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sptlgt ,0 ,m1,m1,m1, ROT0, "Maygay", "Spotlight (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1stair ,0 ,m1,m1,m1, ROT0, "Maygay", "Stairway To Heaven (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sudnim ,0 ,m1,m1,m1, ROT0, "Maygay", "Sudden Impact (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sprnov ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Nova (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1suppot ,0 ,m1,m1,m1, ROT0, "Maygay", "Super Pots (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1taknot ,0 ,m1,m1,m1, ROT0, "Maygay", "Take Note (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1tstunt ,0 ,m1,m1,m1, ROT0, "Maygay", "Test Unit (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1thatlf ,0 ,m1,m1,m1, ROT0, "Maygay", "That's Life (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1topten ,0 ,m1,m1,m1, ROT0, "Maygay", "Top Tenner (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1tp ,0 ,m1,m1,m1, ROT0, "Maygay", "Trivial Pursuit (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1tpclb ,0 ,m1,m1,m1, ROT0, "Maygay", "Trivial Pursuit Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ultchl ,0 ,m1,m1,m1, ROT0, "Maygay", "Ultimate Challenge (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1undsie ,0 ,m1,m1,m1, ROT0, "Maygay", "Under Siege (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1vegas ,0 ,m1,m1,m1, ROT0, "Maygay", "Vegas Gambler Club (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1wagon ,0 ,m1,m1,m1, ROT0, "Maygay", "Wagon Trail (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1wotw ,0 ,m1,m1,m1, ROT0, "Maygay", "War Of The Worlds (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1wldzne ,0 ,m1,m1,m1, ROT0, "Maygay", "Wild Zone (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1winenc ,0 ,m1,m1,m1, ROT0, "Maygay", "Winners Enclosure (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1simps ,0 ,m1,m1,m1, ROT0, "Maygay", "The Simpsons (Maygay) (M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1bghou ,0 ,m1,m1,m1, ROT0, "Gemini", "Big Ghoulies (Gemini) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1crzco ,0 ,m1,m1,m1, ROT0, "Gemini", "Crazy Cobra (Gemini) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1luxor ,0 ,m1,m1,m1, ROT0, "Gemini", "Luxor Casino (Gemini) (M1A/B)",GAME_FLAGS ) // guessing these are M1A/B based on data/code starting at 0x2800 -GAME( 199?, m1hiloc ,0 ,m1,m1,m1, ROT0, "Global", "Hi Lo Casino (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1jtjob ,0 ,m1,m1,m1, ROT0, "Global", "Just The Job (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1kingsw ,0 ,m1,m1,m1, ROT0, "Global", "King Of The Swingers (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1lca ,0 ,m1,m1,m1, ROT0, "Global", "Lights Camera Action (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1mb ,0 ,m1,m1,m1, ROT0, "Global", "Monkey Business (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1mbclb ,0 ,m1,m1,m1, ROT0, "Global", "Monkey Business Club (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sycc ,0 ,m1,m1,m1, ROT0, "Global", "Stake Yer Claim Club (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1thrill ,0 ,m1,m1,m1, ROT0, "Global", "Thrills 'n' Spills (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1trtr ,0 ,m1,m1,m1, ROT0, "Global", "Trick Or Treat (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1trtrcl ,0 ,m1,m1,m1, ROT0, "Global", "Trick Or Treat Club (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1vegcrw ,0 ,m1,m1,m1, ROT0, "Global", "Vegetable Crew (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - -GAME( 199?, m1calyps ,0 ,m1,m1,m1, ROT0, "Maygay", "Calypso (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1cashln ,0 ,m1,m1,m1, ROT0, "Maygay", "Cash Lines (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1races ,0 ,m1,m1,m1, ROT0, "Maygay", "A Day At The Races (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1digdel ,0 ,m1,m1,m1, ROT0, "Global", "Diggers Delight (Global) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1startr ,0 ,m1,m1,m1, ROT0, "Mdm", "Star Trekking (Mdm) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1ttcash ,0 ,m1,m1,m1, ROT0, "Empire", "Tick Tock Cash (Empire) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1topstr ,0 ,m1,m1,m1, ROT0, "Maygay", "Top Strike (Maygay - Bwb) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1sirich ,0 ,m1,m1,m1, ROT0, "Maygay", "Strike It Rich (Maygay) (M1A/B)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m1gskill ,0 ,m1,m1,m1, ROT0, "Hitech Amusement", "Greek Skill (Hitech Amusement)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // no idea if this is m1ab but the code starts at 2800 +GAME( 199?, m1hiloc ,0 ,m1,m1,m1, ROT0, "Global", "Hi Lo Casino (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1jtjob ,0 ,m1,m1,m1, ROT0, "Global", "Just The Job (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1kingsw ,0 ,m1,m1,m1, ROT0, "Global", "King Of The Swingers (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1lca ,0 ,m1,m1,m1, ROT0, "Global", "Lights Camera Action (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1mb ,0 ,m1,m1,m1, ROT0, "Global", "Monkey Business (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1mbclb ,0 ,m1,m1,m1, ROT0, "Global", "Monkey Business Club (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sycc ,0 ,m1,m1,m1, ROT0, "Global", "Stake Yer Claim Club (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1thrill ,0 ,m1,m1,m1, ROT0, "Global", "Thrills 'n' Spills (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1trtr ,0 ,m1,m1,m1, ROT0, "Global", "Trick Or Treat (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1trtrcl ,0 ,m1,m1,m1, ROT0, "Global", "Trick Or Treat Club (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1vegcrw ,0 ,m1,m1,m1, ROT0, "Global", "Vegetable Crew (Global) (M1A/B)",GAME_FLAGS ) + +GAME( 199?, m1calyps ,0 ,m1,m1,m1, ROT0, "Maygay", "Calypso (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1cashln ,0 ,m1,m1,m1, ROT0, "Maygay", "Cash Lines (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1races ,0 ,m1,m1,m1, ROT0, "Maygay", "A Day At The Races (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1digdel ,0 ,m1,m1,m1, ROT0, "Global", "Diggers Delight (Global) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1startr ,0 ,m1,m1,m1, ROT0, "Mdm", "Star Trekking (Mdm) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1ttcash ,0 ,m1,m1,m1, ROT0, "Empire", "Tick Tock Cash (Empire) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1topstr ,0 ,m1,m1,m1, ROT0, "Maygay", "Top Strike (Maygay - Bwb) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1sirich ,0 ,m1,m1,m1, ROT0, "Maygay", "Strike It Rich (Maygay) (M1A/B)",GAME_FLAGS ) +GAME( 199?, m1gskill ,0 ,m1,m1,m1, ROT0, "Hitech Amusement", "Greek Skill (Hitech Amusement)",GAME_FLAGS ) // no idea if this is m1ab but the code starts at 2800 -GAME( 19??, m1atunk ,0 ,m1,m1,m1, ROT0, "Avantime?", "Random Runner (Avantime?)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 19??, m1atunk ,0 ,m1,m1,m1, ROT0, "Avantime?", "Random Runner (Avantime?)",GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/maygayep.c mame-0.145/src/mame/drivers/maygayep.c --- mame-0.144/src/mame/drivers/maygayep.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/maygayep.c 2012-02-06 21:30:40.000000000 +0000 @@ -24,6 +24,8 @@ ************************************************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/h83002/h8.h" #include "sound/ymz280b.h" @@ -33,18 +35,21 @@ { public: maygayep_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( maygayep_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( maygayep_map, AS_PROGRAM, 16, maygayep_state ) ADDRESS_MAP_GLOBAL_MASK(0xffffff) AM_RANGE( 0x000000, 0x07ffff ) AM_ROM AM_REGION("maincpu", 0) AM_RANGE( 0xfe8000, 0xfeffff ) AM_RAM // merln at least? - - ADDRESS_MAP_END static INPUT_PORTS_START( maygayep ) @@ -4516,204 +4521,204 @@ /* These have sound roms dumped */ -GAME( 1999, ep_simp, 0, maygayep, maygayep, 0, ROT0, "Maygay", "The Simpsons (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) +GAME( 1999, ep_simp, 0, maygayep, maygayep, 0, ROT0, "Maygay", "The Simpsons (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) // roms below don't contain epoch in the header, but appear to be anyway -GAME( 199?, ep_dblim , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Double Impact (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_itjb3 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 3 (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_itj3a , ep_itjb3, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 3 (Maygay) (EPOCH, Set 2)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_merln , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Merlin's Magic (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wipeo , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Wipeout (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) +GAME( 199?, ep_dblim , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Double Impact (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_itjb3 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 3 (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_itj3a , ep_itjb3, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 3 (Maygay) (EPOCH, Set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_merln , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Merlin's Magic (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wipeo , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Wipeout (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) /* These don't.. */ -GAME( 199?, ep_bingb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bingo Belle (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_calyp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Calypso (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cow , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Carry On Winning (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cfall , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Falls (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cflow , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Flow (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_doubl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Double Top (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_evil , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Evil Streak (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_nyny , 0, maygayep, maygayep, 0, ROT0, "Maygay", "New York New York (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pizza , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pizza The Action (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_crazy , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Reel Crazy (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mario , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tincn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tin Can Alley (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tonfn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tons Of Fun (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tcrwn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Triple Crown (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_word , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Word Up (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_xtra , 0, maygayep, maygayep, 0, ROT0, "Maygay", "X-tra X-tra (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) +GAME( 199?, ep_bingb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bingo Belle (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_calyp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Calypso (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cow , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Carry On Winning (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cfall , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Falls (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cflow , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Flow (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_doubl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Double Top (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_evil , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Evil Streak (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_nyny , 0, maygayep, maygayep, 0, ROT0, "Maygay", "New York New York (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pizza , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pizza The Action (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crazy , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Reel Crazy (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mario , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Super Mario (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tincn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tin Can Alley (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tonfn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tons Of Fun (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tcrwn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Triple Crown (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_word , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Word Up (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_xtra , 0, maygayep, maygayep, 0, ROT0, "Maygay", "X-tra X-tra (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) // roms below don't contain epoch in the header, but appear to be anyway -GAME( 199?, ep_25crt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "25 Carrot Gold (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bartk , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bar Trekkin (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_batls , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Battleships (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bbonz , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bingo Bonanza (Maygay - Union) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bubsq , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bubble & Squeak (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cdspn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cardinal Spin (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cosc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Carry On Screaming (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cahoy , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Ahoy (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ccock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Cocktail (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cgord , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Gordon (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cshpn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash In The Pan (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ctit , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Of The Titans (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cashn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cashino (Maygay - Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_casgc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Casino Grand Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_casrd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Casino Royale Deluxe Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_chock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Chocks Away (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cock A Doodle Dosh (Maygay - Union) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_commd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Complete Madness (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cor2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Coronation Street 2 (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cormn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Coronation Street Monopoly Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cycl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cyclone Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_duff , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Duff Beer Guide (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_simbg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Simpsons - Duff Beer Guide (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) // pretty sure this is the same game as Duff Beer Guide -GAME( 199?, ep_flash , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Flashback (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fortg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fortune & Glory (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fran , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Frantic (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fnclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fruit & Nudge Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fgods , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fruit Of The Gods (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fullm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Full Moon Fever (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_funny , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Funny Money (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_geron , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Geronimo (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_gldtp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Gold Top (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_gesc2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape 2 (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_geclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_gresc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_gridr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Gridrunner (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hhclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Haunted House Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hvns , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Heavens Above (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_highv , 0, maygayep, maygayep, 0, ROT0, "Maygay", "High Voltage (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hogmn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hog Money (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hmmlt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Homer's Meltdown (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_htdgs , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hot Dogs (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hubbl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hubble Bubble (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_huric , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hurricane (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hyst , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hysteria (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_icebg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Ice Burger (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_inca , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Inca Dinka Do (Maygay - Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_itjb2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 2 (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ijcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 2001, ep_ijob , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job (Maygay) (EPOCH, v2.1)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 2001, ep_ijoba , ep_ijob, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job (Maygay) (EPOCH, v1.1)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_jakbn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Jackpot & The Beanstreak (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_jsttt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Just The Ticket (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_loadd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Loaded (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_lukld , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Lucky Ladders (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_manic , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Manic Miner (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mkart , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mario Kart (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_matrx , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Matrix (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_midas , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Midas Touch Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_monbs , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Monte Carlo Or Bust (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mwom , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mortal Wombat (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mrmus , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mr Muscle (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_noter , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Note Runner (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_nuns , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Nuns Of Navarone (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_otm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Over The Moon (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_otmcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Over The Moon Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ozzie , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Ozzie Ozzie Ozzie (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pascl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Passport To Riches Classic Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_passp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Passport To Riches Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pharo , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pharaoh's Treasure (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pesos , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pick Yer Pesos (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_baskr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pounds Of The Baskervilles (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pwrpl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Power Play (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_rags , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Rags To Riches Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_react , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Reactor (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_roost , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Roosters Millions (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_rtt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Round The Twist (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_royrl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Royal Roulette (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_scrm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Screamin Demon (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_secag , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Secret Agent (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_simfr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Simply Fruits (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_srwin , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Sir Winalot (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spart , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spartacash (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spcbw , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Special Brew (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spec , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spectre (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spntn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spin & Tonic (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spin , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spin On It (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_step , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Stepping Stones (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_strat , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Stratagem (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_subb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Subbuteo (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_snw , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Super Nudge Wink (Maygay - Union) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_survi , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Survival (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tak5 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Take Five (Maygay - Union) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tits , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Title Shot Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tortr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Torture TV (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_trail , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trailblazer (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tree , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tree Amigos (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_trics , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Triple Cash (Maygay - Union) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trivial Pursuit (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tp2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trivial Pursuit 2 (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tutcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tutankhamun Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_21clb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Twenty One Club (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_vipjv , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Viper Jive (Maygay - Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wildf , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Wildfire (Maygay - Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_xspot , 0, maygayep, maygayep, 0, ROT0, "Maygay", "X Marks The Spot (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) - -GAME( 199?, ep_braid , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Bank Raid (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bathl , 0, maygayep, maygayep, 0, ROT0, "Global", "Bat Outa Hell (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_beavr , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas (Global) (EPOCH, set 1)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_beavra , ep_beavr, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas (Global) (EPOCH, set 2)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bvrcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bvruc , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Uncovered (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bjclb , 0, maygayep, maygayep, 0, ROT0, "Global", "Blackjack Club, The (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cbrun , 0, maygayep, maygayep, 0, ROT0, "Global", "Cannonball Run (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cbrcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Cannonball Run Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cclas , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Classic (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cgrc , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Grand Classic (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cgred , 0, maygayep, maygayep, 0, ROT0, "Global", "Club Greed (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cstrk , 0, maygayep, maygayep, 0, ROT0, "Global", "Crazy Streak Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ctc , 0, maygayep, maygayep, 0, ROT0, "Global", "Cut Throat Cash (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cyc , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Cyclone (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_dmbus , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Dambusters (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ddq , 0, maygayep, maygayep, 0, ROT0, "Global", "Dungeons & Drag Queens (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ddqcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Dungeons & Drag Queens Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fog , 0, maygayep, maygayep, 0, ROT0, "Global", "Fields of Gold (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_fmf , 0, maygayep, maygayep, 0, ROT0, "Global", "Full Moon Fever (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_gtrot , 0, maygayep, maygayep, 0, ROT0, "Global", "Globe Trotter (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) // contains maygay, global and impulse strings -GAME( 199?, ep_greed , 0, maygayep, maygayep, 0, ROT0, "Global", "Greed (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_grun , 0, maygayep, maygayep, 0, ROT0, "Global", "Grid Runner (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_grncl , 0, maygayep, maygayep, 0, ROT0, "Global", "Grid Runner Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_heybg , 0, maygayep, maygayep, 0, ROT0, "Global", "Hey Big Spender (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_heybc , 0, maygayep, maygayep, 0, ROT0, "Global", "Hey Big Spender Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hispr , 0, maygayep, maygayep, 0, ROT0, "Global", "Hi Spirits (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hiscl , 0, maygayep, maygayep, 0, ROT0, "Global", "Hi Spirits Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spirt , 0, maygayep, maygayep, 0, ROT0, "Global", "High Spirits (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_smoke , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Holy Smoke! (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_hur , 0, maygayep, maygayep, 0, ROT0, "Global", "Hurricane (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ifern , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Inferno (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_kopcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Knockout Punch Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ltt , 0, maygayep, maygayep, 0, ROT0, "Global", "Licence To Thrill (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_ll , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Lucky Ladders (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_monrt , 0, maygayep, maygayep, 0, ROT0, "Global", "Money Returns Club, The (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_monsh , 0, maygayep, maygayep, 0, ROT0, "Global", "The Moonshine Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mummy , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Mummy Talks (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_pkni , 0, maygayep, maygayep, 0, ROT0, "Global", "Phoenix Knights (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_redl , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Red Line (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_rchik , 0, maygayep, maygayep, 0, ROT0, "Global", "Rich Chics Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_royrc , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_snbev , 0, maygayep, maygayep, 0, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_spook , 0, maygayep, maygayep, 0, ROT0, "Global", "Spooky Hollow (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_sdcla , 0, maygayep, maygayep, 0, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_sdclb , 0, maygayep, maygayep, 0, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_stm , 0, maygayep, maygayep, 0, ROT0, "Global", "Storm Force (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_stmcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Storm Force Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_snset , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_twarp , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_tod , 0, maygayep, maygayep, 0, ROT0, "Global", "Truth Or Dare (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_utnut , 0, maygayep, maygayep, 0, ROT0, "Global", "Utter Nutter (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_utncl , 0, maygayep, maygayep, 0, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wleek , 0, maygayep, maygayep, 0, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wud , 0, maygayep, maygayep, 0, ROT0, "Global", "What's Up Doc (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_milhr , 0, maygayep, maygayep, 0, ROT0, "Global", "Who Wants To Be A Millionhare (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_mlhrc , 0, maygayep, maygayep, 0, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wf , 0, maygayep, maygayep, 0, ROT0, "Global", "Wildfire (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_bbars , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cslay , 0, maygayep, maygayep, 0, ROT0, "Global", "Cash Slayer (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_monky , 0, maygayep, maygayep, 0, ROT0, "Global", "Monkey Business (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_makmv , 0, maygayep, maygayep, 0, ROT0, "Global", "Make Your Move (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_lug , 0, maygayep, maygayep, 0, ROT0, "Maygay", "London Underground (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_crzbn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_cascz , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Crazy (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_wside , 0, maygayep, maygayep, 0, ROT0, "Global", "Wildside (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_goldf , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Gold Fever (Impulse) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_imj , 0, maygayep, maygayep, 0, ROT0, "Global", "I'm A Jackpot (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) -GAME( 199?, ep_party , 0, maygayep, maygayep, 0, ROT0, "Global", "Party Party (Global) (EPOCH)", GAME_NO_SOUND | GAME_NOT_WORKING | GAME_MECHANICAL ) +GAME( 199?, ep_25crt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "25 Carrot Gold (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bartk , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bar Trekkin (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_batls , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Battleships (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbonz , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bingo Bonanza (Maygay - Union) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bubsq , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Bubble & Squeak (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cdspn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cardinal Spin (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cosc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Carry On Screaming (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cahoy , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Ahoy (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ccock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Cocktail (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cgord , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Gordon (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cshpn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash In The Pan (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ctit , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cash Of The Titans (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cashn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cashino (Maygay - Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_casgc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Casino Grand Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_casrd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Casino Royale Deluxe Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_chock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Chocks Away (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cock , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cock A Doodle Dosh (Maygay - Union) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_commd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Complete Madness (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cor2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Coronation Street 2 (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cormn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Coronation Street Monopoly Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cycl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Cyclone Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_duff , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Duff Beer Guide (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_simbg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Simpsons - Duff Beer Guide (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) // pretty sure this is the same game as Duff Beer Guide +GAME( 199?, ep_flash , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Flashback (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fortg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fortune & Glory (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fran , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Frantic (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fnclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fruit & Nudge Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fgods , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Fruit Of The Gods (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fullm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Full Moon Fever (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_funny , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Funny Money (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_geron , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Geronimo (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_gldtp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Gold Top (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_gesc2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape 2 (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_geclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_gresc , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Great Escape (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_gridr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Gridrunner (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hhclb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Haunted House Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hvns , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Heavens Above (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_highv , 0, maygayep, maygayep, 0, ROT0, "Maygay", "High Voltage (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hogmn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hog Money (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hmmlt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Homer's Meltdown (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_htdgs , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hot Dogs (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hubbl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hubble Bubble (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_huric , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hurricane (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hyst , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Hysteria (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_icebg , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Ice Burger (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_inca , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Inca Dinka Do (Maygay - Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_itjb2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job 2 (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ijcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 2001, ep_ijob , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job (Maygay) (EPOCH, v2.1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 2001, ep_ijoba , ep_ijob, maygayep, maygayep, 0, ROT0, "Maygay", "Italian Job (Maygay) (EPOCH, v1.1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_jakbn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Jackpot & The Beanstreak (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_jsttt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Just The Ticket (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_loadd , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Loaded (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_lukld , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Lucky Ladders (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_manic , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Manic Miner (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mkart , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mario Kart (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_matrx , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Matrix (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_midas , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Midas Touch Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monbs , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Monte Carlo Or Bust (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mwom , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mortal Wombat (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mrmus , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Mr Muscle (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_noter , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Note Runner (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_nuns , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Nuns Of Navarone (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_otm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Over The Moon (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_otmcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Over The Moon Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ozzie , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Ozzie Ozzie Ozzie (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pascl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Passport To Riches Classic Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_passp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Passport To Riches Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pharo , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pharaoh's Treasure (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pesos , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pick Yer Pesos (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_baskr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Pounds Of The Baskervilles (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pwrpl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Power Play (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_rags , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Rags To Riches Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_react , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Reactor (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_roost , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Roosters Millions (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_rtt , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Round The Twist (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_royrl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Royal Roulette (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_scrm , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Screamin Demon (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_secag , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Secret Agent (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_simfr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Simply Fruits (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_srwin , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Sir Winalot (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spart , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spartacash (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spcbw , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Special Brew (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spec , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spectre (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spntn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spin & Tonic (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spin , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Spin On It (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_step , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Stepping Stones (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_strat , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Stratagem (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_subb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Subbuteo (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snw , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Super Nudge Wink (Maygay - Union) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_survi , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Survival (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tak5 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Take Five (Maygay - Union) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tits , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Title Shot Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tortr , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Torture TV (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_trail , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trailblazer (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tree , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tree Amigos (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_trics , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Triple Cash (Maygay - Union) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tp , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trivial Pursuit (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tp2 , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Trivial Pursuit 2 (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tutcl , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Tutankhamun Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_21clb , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Twenty One Club (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_vipjv , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Viper Jive (Maygay - Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wildf , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Wildfire (Maygay - Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_xspot , 0, maygayep, maygayep, 0, ROT0, "Maygay", "X Marks The Spot (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) + +GAME( 199?, ep_braid , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Bank Raid (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bathl , 0, maygayep, maygayep, 0, ROT0, "Global", "Bat Outa Hell (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_beavr , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas (Global) (EPOCH, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_beavra , ep_beavr, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas (Global) (EPOCH, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bvrcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Las Vegas Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bvruc , 0, maygayep, maygayep, 0, ROT0, "Global", "Beaver Uncovered (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bjclb , 0, maygayep, maygayep, 0, ROT0, "Global", "Blackjack Club, The (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cbrun , 0, maygayep, maygayep, 0, ROT0, "Global", "Cannonball Run (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cbrcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Cannonball Run Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cclas , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Classic (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cgrc , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Grand Classic (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cgred , 0, maygayep, maygayep, 0, ROT0, "Global", "Club Greed (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cstrk , 0, maygayep, maygayep, 0, ROT0, "Global", "Crazy Streak Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ctc , 0, maygayep, maygayep, 0, ROT0, "Global", "Cut Throat Cash (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cyc , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Cyclone (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_dmbus , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Dambusters (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ddq , 0, maygayep, maygayep, 0, ROT0, "Global", "Dungeons & Drag Queens (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ddqcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Dungeons & Drag Queens Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fog , 0, maygayep, maygayep, 0, ROT0, "Global", "Fields of Gold (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_fmf , 0, maygayep, maygayep, 0, ROT0, "Global", "Full Moon Fever (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_gtrot , 0, maygayep, maygayep, 0, ROT0, "Global", "Globe Trotter (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) // contains maygay, global and impulse strings +GAME( 199?, ep_greed , 0, maygayep, maygayep, 0, ROT0, "Global", "Greed (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_grun , 0, maygayep, maygayep, 0, ROT0, "Global", "Grid Runner (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_grncl , 0, maygayep, maygayep, 0, ROT0, "Global", "Grid Runner Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_heybg , 0, maygayep, maygayep, 0, ROT0, "Global", "Hey Big Spender (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_heybc , 0, maygayep, maygayep, 0, ROT0, "Global", "Hey Big Spender Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hispr , 0, maygayep, maygayep, 0, ROT0, "Global", "Hi Spirits (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hiscl , 0, maygayep, maygayep, 0, ROT0, "Global", "Hi Spirits Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spirt , 0, maygayep, maygayep, 0, ROT0, "Global", "High Spirits (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_smoke , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Holy Smoke! (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_hur , 0, maygayep, maygayep, 0, ROT0, "Global", "Hurricane (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ifern , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Inferno (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_kopcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Knockout Punch Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ltt , 0, maygayep, maygayep, 0, ROT0, "Global", "Licence To Thrill (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_ll , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Lucky Ladders (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monrt , 0, maygayep, maygayep, 0, ROT0, "Global", "Money Returns Club, The (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monsh , 0, maygayep, maygayep, 0, ROT0, "Global", "The Moonshine Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mummy , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Mummy Talks (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_pkni , 0, maygayep, maygayep, 0, ROT0, "Global", "Phoenix Knights (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_redl , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Red Line (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_rchik , 0, maygayep, maygayep, 0, ROT0, "Global", "Rich Chics Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_royrc , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Royal Roulette Club (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snbev , 0, maygayep, maygayep, 0, ROT0, "Global", "Saturday Night Beaver (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_spook , 0, maygayep, maygayep, 0, ROT0, "Global", "Spooky Hollow (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdcla , 0, maygayep, maygayep, 0, ROT0, "Global", "Spotted Dick Classic (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_sdclb , 0, maygayep, maygayep, 0, ROT0, "Global", "Spotted Dick Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stm , 0, maygayep, maygayep, 0, ROT0, "Global", "Storm Force (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_stmcl , 0, maygayep, maygayep, 0, ROT0, "Global", "Storm Force Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_snset , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Sunset Strip (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_twarp , 0, maygayep, maygayep, 0, ROT0, "Extreme", "Time Warp (Extreme) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_tod , 0, maygayep, maygayep, 0, ROT0, "Global", "Truth Or Dare (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utnut , 0, maygayep, maygayep, 0, ROT0, "Global", "Utter Nutter (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_utncl , 0, maygayep, maygayep, 0, ROT0, "Global", "Utter Nutter Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wleek , 0, maygayep, maygayep, 0, ROT0, "Global", "Weakest Leek Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wud , 0, maygayep, maygayep, 0, ROT0, "Global", "What's Up Doc (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_milhr , 0, maygayep, maygayep, 0, ROT0, "Global", "Who Wants To Be A Millionhare (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_mlhrc , 0, maygayep, maygayep, 0, ROT0, "Global", "Who Whats To Be A Millionhare Club (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wf , 0, maygayep, maygayep, 0, ROT0, "Global", "Wildfire (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_bbars , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Balloon Bars (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cslay , 0, maygayep, maygayep, 0, ROT0, "Global", "Cash Slayer (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_monky , 0, maygayep, maygayep, 0, ROT0, "Global", "Monkey Business (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_makmv , 0, maygayep, maygayep, 0, ROT0, "Global", "Make Your Move (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_lug , 0, maygayep, maygayep, 0, ROT0, "Maygay", "London Underground (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_crzbn , 0, maygayep, maygayep, 0, ROT0, "Maygay", "Crazy Bingo (Maygay) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_cascz , 0, maygayep, maygayep, 0, ROT0, "Global", "Casino Crazy (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_wside , 0, maygayep, maygayep, 0, ROT0, "Global", "Wildside (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_goldf , 0, maygayep, maygayep, 0, ROT0, "Impulse", "Gold Fever (Impulse) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_imj , 0, maygayep, maygayep, 0, ROT0, "Global", "I'm A Jackpot (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, ep_party , 0, maygayep, maygayep, 0, ROT0, "Global", "Party Party (Global) (EPOCH)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/maygaysw.c mame-0.145/src/mame/drivers/maygaysw.c --- mame-0.144/src/mame/drivers/maygaysw.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/maygaysw.c 2012-02-06 21:30:40.000000000 +0000 @@ -426,15 +426,15 @@ ROM_END // complete(?) dump -GAME( 199?, mg_gbr , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Guinness Book Of Records (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_risk , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Risk (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_bb , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Big Break (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_lug , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "London Underground (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_alad , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Aladdin's Cave (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, mg_gbr , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Guinness Book Of Records (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_risk , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Risk (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_bb , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Big Break (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_lug , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "London Underground (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_alad , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Aladdin's Cave (Maygay M2)", GAME_IS_SKELETON ) // incomplete dumps -GAME( 199?, mg_ewg , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Each Way Gambler (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_jv , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Jack & Vera (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_pbw , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Pinball Wizard (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_scl , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Super Clue (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mg_kf , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Krypton Factor (Maygay M2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, mg_ewg , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Each Way Gambler (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_jv , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Jack & Vera (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_pbw , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Pinball Wizard (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_scl , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Super Clue (Maygay M2)", GAME_IS_SKELETON ) +GAME( 199?, mg_kf , 0 , maygayew, maygayew, 0, ROT0, "Maygay", "Krypton Factor (Maygay M2)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/maygayv1.c mame-0.145/src/mame/drivers/maygayv1.c --- mame-0.144/src/mame/drivers/maygayv1.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/maygayv1.c 2012-02-06 21:30:40.000000000 +0000 @@ -280,9 +280,9 @@ } -static SCREEN_UPDATE( maygayv1 ) +static SCREEN_UPDATE_IND16( maygayv1 ) { - maygayv1_state *state = screen->machine().driver_data(); + maygayv1_state *state = screen.machine().driver_data(); i82716_t &i82716 = state->m_i82716; UINT16 *atable = &i82716.dram[VREG(ATBA)]; UINT16 *otable = &i82716.dram[VREG(ODTBA) & 0xfc00]; // both must be bank 0 @@ -297,18 +297,18 @@ /* If screen output is disabled, fill with black */ if (!(VREG(VCR0) & VCR0_DEN)) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* For every scanline... */ - for (sl = cliprect->min_x; sl <= cliprect->max_y; ++sl) + for (sl = cliprect.min_x; sl <= cliprect.max_y; ++sl) { int obj; UINT16 aflags = atable[sl]; UINT16 slmask_old = slmask; - UINT16 *bmp_ptr = BITMAP_ADDR16(bitmap, sl, 0); + UINT16 *bmp_ptr = &bitmap.pix16(sl); slmask = 0xffff ^ (slmask ^ aflags); @@ -399,7 +399,7 @@ } // Write it out - for (sx = cliprect->min_x; sx < cliprect->max_x; sx += 2) + for (sx = cliprect.min_x; sx < cliprect.max_x; sx += 2) { UINT8 pix = i82716.line_buf[sx / 2]; @@ -411,33 +411,37 @@ return 0; } -static SCREEN_EOF( maygayv1 ) +static SCREEN_VBLANK( maygayv1 ) { - maygayv1_state *state = machine.driver_data(); - i82716_t &i82716 = state->m_i82716; - // UCF - if (VREG(VCR0) & VCR0_UCF) - { - int i; - - for (i = 0; i < 16; ++i) - VREG(i) = i82716.dram[i]; - } - else + // rising edge + if (vblank_on) { - VREG(VCR0) = i82716.dram[VCR0]; - VREG(ATBA) = i82716.dram[ATBA]; - } + maygayv1_state *state = screen.machine().driver_data(); + i82716_t &i82716 = state->m_i82716; + // UCF + if (VREG(VCR0) & VCR0_UCF) + { + int i; - if (!(VREG(VCR0) & VCR0_DEI)) - { - int i; - UINT16 *palbase = &i82716.dram[VREG(CTBA)]; + for (i = 0; i < 16; ++i) + VREG(i) = i82716.dram[i]; + } + else + { + VREG(VCR0) = i82716.dram[VCR0]; + VREG(ATBA) = i82716.dram[ATBA]; + } - for (i = 0; i < 16; ++i) + if (!(VREG(VCR0) & VCR0_DEI)) { - UINT16 entry = *palbase++; - palette_set_color_rgb(machine, entry & 0xf, pal4bit(entry >> 12), pal4bit(entry >> 8), pal4bit(entry >> 4)); + int i; + UINT16 *palbase = &i82716.dram[VREG(CTBA)]; + + for (i = 0; i < 16; ++i) + { + UINT16 entry = *palbase++; + palette_set_color_rgb(screen.machine(), entry & 0xf, pal4bit(entry >> 12), pal4bit(entry >> 8), pal4bit(entry >> 4)); + } } } } @@ -1044,11 +1048,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(640, 300) MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 300 - 1) - MCFG_SCREEN_UPDATE(maygayv1) - MCFG_SCREEN_EOF(maygayv1) + MCFG_SCREEN_UPDATE_STATIC(maygayv1) + MCFG_SCREEN_VBLANK_STATIC(maygayv1) MCFG_PALETTE_LENGTH(16) @@ -1392,24 +1395,26 @@ state->m_p1 = state->m_p3 = 0xff; } -GAME( 1991, screenpl, 0, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 4.0)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp1, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp1a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp2, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, Isle of Man, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp2a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, Isle of Man, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp3, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, SA5-082)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp3a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, SA5-083)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 1991, screenp4 ,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. ?.?)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) +#define GAME_FLAGS GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK + +GAME( 1991, screenpl, 0, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 4.0)", GAME_FLAGS ) +GAME( 1991, screenp1, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, set 1)", GAME_FLAGS ) +GAME( 1991, screenp1a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, set 2)", GAME_FLAGS ) +GAME( 1991, screenp2, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, Isle of Man, set 1)", GAME_FLAGS ) +GAME( 1991, screenp2a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. 1.9, Isle of Man, set 2)", GAME_FLAGS ) +GAME( 1991, screenp3, screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, SA5-082)", GAME_FLAGS ) +GAME( 1991, screenp3a,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, SA5-083)", GAME_FLAGS ) +GAME( 1991, screenp4 ,screenpl, maygayv1, screenpl, screenpl, ROT0, "Maygay", "Screen Play (Maygay, MV1 Video, ver. ?.?)", GAME_FLAGS ) // incomplete sets -GAME( 199?, mv1bon , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Believe It Or Not (Maygay, MV1 Video)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1cpc , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1cpca , mv1cpc ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1cpcb , mv1cpc ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 3)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1cwq , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Crossword Quiz (Maygay, MV1 Video, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1cwqa , mv1cwq ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Crossword Quiz (Maygay, MV1 Video, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1guac , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Give Us A Clue (Maygay, MV1 Video, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1guaca, mv1guac ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Give Us A Clue (Maygay, MV1 Video, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1sfx , 0 ,maygayv1, screenpl, screenpl, ROT90, "Maygay", "Special Effects (Maygay, MV1 Video, set 1)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1sfxa , mv1sfx ,maygayv1, screenpl, screenpl, ROT90, "Maygay", "Special Effects (Maygay, MV1 Video, set 2)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) -GAME( 199?, mv1wc , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "World Cup (Maygay, MV1 Video)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_REQUIRES_ARTWORK ) +GAME( 199?, mv1bon , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Believe It Or Not (Maygay, MV1 Video)", GAME_FLAGS ) +GAME( 199?, mv1cpc , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 1)", GAME_FLAGS ) +GAME( 199?, mv1cpca , mv1cpc ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 2)", GAME_FLAGS ) +GAME( 199?, mv1cpcb , mv1cpc ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Caesar's Palace Club (Maygay, MV1 Video, set 3)", GAME_FLAGS ) +GAME( 199?, mv1cwq , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Crossword Quiz (Maygay, MV1 Video, set 1)", GAME_FLAGS ) +GAME( 199?, mv1cwqa , mv1cwq ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Crossword Quiz (Maygay, MV1 Video, set 2)", GAME_FLAGS ) +GAME( 199?, mv1guac , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Give Us A Clue (Maygay, MV1 Video, set 1)", GAME_FLAGS ) +GAME( 199?, mv1guaca, mv1guac ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "Give Us A Clue (Maygay, MV1 Video, set 2)", GAME_FLAGS ) +GAME( 199?, mv1sfx , 0 ,maygayv1, screenpl, screenpl, ROT90, "Maygay", "Special Effects (Maygay, MV1 Video, set 1)", GAME_FLAGS ) +GAME( 199?, mv1sfxa , mv1sfx ,maygayv1, screenpl, screenpl, ROT90, "Maygay", "Special Effects (Maygay, MV1 Video, set 2)", GAME_FLAGS ) +GAME( 199?, mv1wc , 0 ,maygayv1, screenpl, screenpl, ROT0, "Maygay", "World Cup (Maygay, MV1 Video)", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/mayumi.c mame-0.145/src/mame/drivers/mayumi.c --- mame-0.144/src/mame/drivers/mayumi.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/mayumi.c 2012-02-06 21:30:39.000000000 +0000 @@ -58,13 +58,13 @@ { mayumi_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset & 0x7ff); + state->m_tilemap->mark_tile_dirty(offset & 0x7ff); } -static SCREEN_UPDATE( mayumi ) +static SCREEN_UPDATE_IND16( mayumi ) { - mayumi_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + mayumi_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -382,10 +382,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 62*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mayumi) + MCFG_SCREEN_UPDATE_STATIC(mayumi) MCFG_GFXDECODE(mayumi) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/mazerbla.c mame-0.145/src/mame/drivers/mazerbla.c --- mame-0.144/src/mame/drivers/mazerbla.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mazerbla.c 2012-02-06 21:30:35.000000000 +0000 @@ -60,7 +60,7 @@ size_t m_videoram_size; /* video-related */ - bitmap_t * m_tmpbitmaps[4]; + bitmap_ind16 m_tmpbitmaps[4]; UINT8 m_vcu_video_reg[4]; UINT32 m_vcu_gfx_addr; @@ -158,22 +158,22 @@ state->m_dbg_lookup = 4; #endif - state->m_tmpbitmaps[0] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmaps[1] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmaps[2] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmaps[3] = machine.primary_screen->alloc_compatible_bitmap(); - - state->save_item(NAME(*state->m_tmpbitmaps[0])); - state->save_item(NAME(*state->m_tmpbitmaps[1])); - state->save_item(NAME(*state->m_tmpbitmaps[2])); - state->save_item(NAME(*state->m_tmpbitmaps[3])); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmaps[0]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmaps[1]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmaps[2]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmaps[3]); + + state->save_item(NAME(state->m_tmpbitmaps[0])); + state->save_item(NAME(state->m_tmpbitmaps[1])); + state->save_item(NAME(state->m_tmpbitmaps[2])); + state->save_item(NAME(state->m_tmpbitmaps[3])); } #ifdef UNUSED_DEFINITION -SCREEN_UPDATE( test_vcu ) +SCREEN_UPDATE_IND16( test_vcu ) { - mazerbla_state *state = screen->machine().driver_data(); + mazerbla_state *state = screen.machine().driver_data(); int *planes_enabled = state->m_planes_enabled; char buf[128]; @@ -185,7 +185,7 @@ if (state->m_game_id == GREATGUN) color_base = 0x00; - bitmap_fill(bitmap, NULL, 0); + bitmap.fill(0); // logerror("-->frame\n"); if (planes_enabled[3]) @@ -194,50 +194,50 @@ if (planes_enabled[2]) copybitmap_trans(bitmap, state->m_tmpbitmaps[2], 0, 0, 0, 0,cliprect, color_base); - bitmap_fill(state->m_tmpbitmaps[2], NULL, color_base); + state->m_tmpbitmaps[2].fill(color_base); if (planes_enabled[1]) copybitmap_trans(bitmap, state->m_tmpbitmaps[1], 0, 0, 0, 0,cliprect, color_base); - bitmap_fill(state->m_tmpbitmaps[1], NULL, color_base); + state->m_tmpbitmaps[1].fill(color_base); if (planes_enabled[0]) copybitmap_trans(bitmap, state->m_tmpbitmaps[0], 0, 0, 0, 0,cliprect, color_base); - bitmap_fill(state->m_tmpbitmaps[0], NULL, color_base); + state->m_tmpbitmaps[0].fill(color_base); - if (screen->machine().input().code_pressed_once(KEYCODE_1)) /* plane 1 */ + if (screen.machine().input().code_pressed_once(KEYCODE_1)) /* plane 1 */ planes_enabled[0] ^= 1; - if (screen->machine().input().code_pressed_once(KEYCODE_2)) /* plane 2 */ + if (screen.machine().input().code_pressed_once(KEYCODE_2)) /* plane 2 */ planes_enabled[1] ^= 1; - if (screen->machine().input().code_pressed_once(KEYCODE_3)) /* plane 3 */ + if (screen.machine().input().code_pressed_once(KEYCODE_3)) /* plane 3 */ planes_enabled[2] ^= 1; - if (screen->machine().input().code_pressed_once(KEYCODE_4)) /* plane 4 */ + if (screen.machine().input().code_pressed_once(KEYCODE_4)) /* plane 4 */ planes_enabled[3] ^= 1; - if (screen->machine().input().code_pressed_once(KEYCODE_I)) /* show/hide debug info */ + if (screen.machine().input().code_pressed_once(KEYCODE_I)) /* show/hide debug info */ state->m_dbg_info = !state->m_dbg_info; - if (screen->machine().input().code_pressed_once(KEYCODE_G)) /* enable gfx area handling */ + if (screen.machine().input().code_pressed_once(KEYCODE_G)) /* enable gfx area handling */ state->m_dbg_gfx_e = !state->m_dbg_gfx_e; - if (screen->machine().input().code_pressed_once(KEYCODE_C)) /* enable color area handling */ + if (screen.machine().input().code_pressed_once(KEYCODE_C)) /* enable color area handling */ state->m_dbg_clr_e = !state->m_dbg_clr_e; - if (screen->machine().input().code_pressed_once(KEYCODE_V)) /* draw only when vbank==dbg_vbank */ + if (screen.machine().input().code_pressed_once(KEYCODE_V)) /* draw only when vbank==dbg_vbank */ state->m_dbg_vbank ^= 1; - if (screen->machine().input().code_pressed_once(KEYCODE_L)) /* showlookup ram */ + if (screen.machine().input().code_pressed_once(KEYCODE_L)) /* showlookup ram */ state->m_dbg_lookup = (state->m_dbg_lookup + 1) % 5; //0,1,2,3, 4-off if (state->m_dbg_info) { sprintf(buf,"I-info, G-gfx, C-color, V-vbank, 1-4 enable planes"); - ui_draw_text(buf, 10, 0 * ui_get_line_height(screen->machine())); + ui_draw_text(buf, 10, 0 * ui_get_line_height(screen.machine())); sprintf(buf,"g:%1i c:%1i v:%1i vbk=%1i planes=%1i%1i%1i%1i ", state->m_dbg_gfx_e&1, state->m_dbg_clr_e&1, state->m_dbg_vbank, vbank&1, planes_enabled[0], @@ -245,7 +245,7 @@ planes_enabled[2], planes_enabled[3] ); - ui_draw_text(buf, 10, 1 * ui_get_line_height(screen->machine())); + ui_draw_text(buf, 10, 1 * ui_get_line_height(screen.machine())); if (state->m_dbg_lookup!=4) { @@ -260,7 +260,7 @@ { sprintf(buf + strlen(buf), "%02x ", lookup_ram[lookup_offs + x + y * 16]); } - ui_draw_text(buf, 0, (2 + y) * ui_get_line_height(screen->machine())); + ui_draw_text(buf, 0, (2 + y) * ui_get_line_height(screen.machine())); } } } @@ -270,9 +270,9 @@ #endif -static SCREEN_UPDATE( mazerbla ) +static SCREEN_UPDATE_IND16( mazerbla ) { - mazerbla_state *state = screen->machine().driver_data(); + mazerbla_state *state = screen.machine().driver_data(); // UINT32 color_base = 0; if (state->m_game_id == MAZERBLA) @@ -281,7 +281,7 @@ // if (state->m_game_id == GREATGUN) // color_base = 0x00; - // bitmap_fill(bitmap, NULL, 0); + // bitmap.fill(0); copybitmap(bitmap, state->m_tmpbitmaps[3], 0, 0, 0, 0, cliprect); copybitmap_trans(bitmap, state->m_tmpbitmaps[2], 0, 0, 0, 0, cliprect, 0); @@ -464,7 +464,7 @@ } if (((state->m_xpos + x) < 256) && ((state->m_ypos + y) < 256) ) - *BITMAP_ADDR16(state->m_tmpbitmaps[state->m_plane], state->m_ypos + y, state->m_xpos + x) = col; + state->m_tmpbitmaps[state->m_plane].pix16(state->m_ypos + y, state->m_xpos + x) = col; bits += 2; } @@ -493,7 +493,7 @@ /* color = 4 MSB = front PEN, 4 LSB = background PEN */ if (((state->m_xpos + x) < 256) && ((state->m_ypos + y) < 256)) - *BITMAP_ADDR16(state->m_tmpbitmaps[state->m_plane], state->m_ypos + y, state->m_xpos + x) = data ? color_base | ((state->m_color1 & 0xf0) >> 4): color_base | ((state->m_color1 & 0x0f)); + state->m_tmpbitmaps[state->m_plane].pix16(state->m_ypos + y, state->m_xpos + x) = data ? color_base | ((state->m_color1 & 0xf0) >> 4): color_base | ((state->m_color1 & 0x0f)); bits += 1; } @@ -521,7 +521,7 @@ col = color_base | data; if (((state->m_xpos + x) < 256) && ((state->m_ypos + y) < 256)) - *BITMAP_ADDR16(state->m_tmpbitmaps[state->m_plane], state->m_ypos + y, state->m_xpos + x) = col; + state->m_tmpbitmaps[state->m_plane].pix16(state->m_ypos + y, state->m_xpos + x) = col; bits += 4; } @@ -622,7 +622,7 @@ } if (((state->m_xpos + x) < 256) && ((state->m_ypos + y) < 256)) - *BITMAP_ADDR16(state->m_tmpbitmaps[state->m_plane], state->m_ypos + y, state->m_xpos + x) = col; + state->m_tmpbitmaps[state->m_plane].pix16(state->m_ypos + y, state->m_xpos + x) = col; bits += 2; } @@ -1524,10 +1524,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(mazerbla) + MCFG_SCREEN_UPDATE_STATIC(mazerbla) MCFG_PALETTE_LENGTH(256) @@ -1565,10 +1564,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(mazerbla) + MCFG_SCREEN_UPDATE_STATIC(mazerbla) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/mcatadv.c mame-0.145/src/mame/drivers/mcatadv.c --- mame-0.144/src/mame/drivers/mcatadv.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/mcatadv.c 2012-02-06 21:30:33.000000000 +0000 @@ -458,11 +458,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(mcatadv) - MCFG_SCREEN_EOF(mcatadv) // Buffer Spriteram + MCFG_SCREEN_UPDATE_STATIC(mcatadv) + MCFG_SCREEN_VBLANK_STATIC(mcatadv) // Buffer Spriteram MCFG_GFXDECODE(mcatadv) MCFG_PALETTE_LENGTH(0x2000/2) diff -Nru mame-0.144/src/mame/drivers/mcr3.c mame-0.145/src/mame/drivers/mcr3.c --- mame-0.144/src/mame/drivers/mcr3.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mcr3.c 2012-02-06 21:30:39.000000000 +0000 @@ -103,7 +103,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "machine/z80ctc.h" #include "audio/mcr.h" #include "machine/nvram.h" @@ -1094,7 +1093,7 @@ MCFG_CPU_PROGRAM_MAP(mcrmono_map) MCFG_CPU_IO_MAP(mcrmono_portmap) MCFG_CPU_CONFIG(mcr_daisy_chain) - MCFG_CPU_VBLANK_INT_HACK(mcr_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mcr_interrupt, "screen", 0, 1) MCFG_Z80CTC_ADD("ctc", MASTER_CLOCK/4 /* same as "maincpu" */, mcr_ctc_intf) @@ -1109,10 +1108,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 30*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 0*16, 30*16-1) - MCFG_SCREEN_UPDATE(mcr3) + MCFG_SCREEN_UPDATE_STATIC(mcr3) MCFG_GFXDECODE(mcr3) MCFG_PALETTE_LENGTH(64) @@ -1157,7 +1155,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_SIZE(30*16, 30*16) MCFG_SCREEN_VISIBLE_AREA(0, 30*16-1, 0, 30*16-1) - MCFG_SCREEN_UPDATE(spyhunt) + MCFG_SCREEN_UPDATE_STATIC(spyhunt) MCFG_GFXDECODE(spyhunt) MCFG_PALETTE_LENGTH(64+4) diff -Nru mame-0.144/src/mame/drivers/mcr68.c mame-0.145/src/mame/drivers/mcr68.c --- mame-0.144/src/mame/drivers/mcr68.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mcr68.c 2012-02-06 21:30:36.000000000 +0000 @@ -987,10 +987,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 30*16) MCFG_SCREEN_VISIBLE_AREA(0, 32*16-1, 0, 30*16-1) - MCFG_SCREEN_UPDATE(zwackery) + MCFG_SCREEN_UPDATE_STATIC(zwackery) MCFG_GFXDECODE(zwackery) MCFG_PALETTE_LENGTH(4096) @@ -1017,10 +1016,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 30*16) MCFG_SCREEN_VISIBLE_AREA(0, 32*16-1, 0, 30*16-1) - MCFG_SCREEN_UPDATE(mcr68) + MCFG_SCREEN_UPDATE_STATIC(mcr68) MCFG_GFXDECODE(mcr68) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/mcr.c mame-0.145/src/mame/drivers/mcr.c --- mame-0.144/src/mame/drivers/mcr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/mcr.c 2012-02-06 21:30:35.000000000 +0000 @@ -284,7 +284,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "machine/z80ctc.h" #include "machine/z80pio.h" #include "machine/z80sio.h" @@ -428,6 +427,32 @@ /************************************* * + * Two Tigers I/O ports + * + *************************************/ + +static WRITE8_HANDLER( twotiger_op4_w ) +{ + device_t *samples = space->machine().device("samples"); + + for (int i = 0; i < 2; i++) + { + /* play tape, and loop it */ + if (!sample_playing(samples, i)) + sample_start(samples, i, i, 1); + + /* bit 1 turns cassette on/off */ + sample_set_pause(samples, i, ~data & 2); + } + + // bit 2: lamp control? + // if (data & 0xfc) printf("%x ",data); +} + + + +/************************************* + * * Discs of Tron I/O ports * *************************************/ @@ -1548,7 +1573,7 @@ static const char *const journey_sample_names[] = { "*journey", - "sepways.wav", + "sepways", 0 }; @@ -1559,6 +1584,21 @@ }; +static const char *const twotiger_sample_names[] = +{ + "*twotiger", + "left", + "right", + 0 +}; + +static const samples_interface twotiger_samples_interface = +{ + 2, + twotiger_sample_names +}; + + /************************************* * @@ -1574,7 +1614,7 @@ MCFG_CPU_CONFIG(mcr_daisy_chain) MCFG_CPU_PROGRAM_MAP(cpu_90009_map) MCFG_CPU_IO_MAP(cpu_90009_portmap) - MCFG_CPU_VBLANK_INT_HACK(mcr_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mcr_interrupt, "screen", 0, 1) MCFG_Z80CTC_ADD("ctc", MAIN_OSC_MCR_I/8 /* same as "maincpu" */, mcr_ctc_intf) @@ -1589,10 +1629,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 30*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 0*16, 30*16-1) - MCFG_SCREEN_UPDATE(mcr) + MCFG_SCREEN_UPDATE_STATIC(mcr) MCFG_GFXDECODE(mcr) MCFG_PALETTE_LENGTH(32) @@ -1617,6 +1656,17 @@ MACHINE_CONFIG_END +/* as above, plus 8-track tape */ +static MACHINE_CONFIG_DERIVED( mcr_90010_tt, mcr_90010 ) + + /* sound hardware */ + MCFG_SOUND_ADD("samples", SAMPLES, 0) + MCFG_SOUND_CONFIG(twotiger_samples_interface) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.25) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.25) +MACHINE_CONFIG_END + + /* 91475 CPU board plus 90908/90913/91483 sound board plus cassette interface */ static MACHINE_CONFIG_DERIVED( mcr_91475, mcr_90010 ) @@ -1663,7 +1713,8 @@ MCFG_CPU_CONFIG(mcr_ipu_daisy_chain) MCFG_CPU_PROGRAM_MAP(ipu_91695_map) MCFG_CPU_IO_MAP(ipu_91695_portmap) - MCFG_CPU_VBLANK_INT_HACK(mcr_ipu_interrupt,2) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(mcr_ipu_interrupt) MCFG_Z80CTC_ADD("ipu_ctc", 7372800/2 /* same as "ipu" */, nflfoot_ctc_intf) MCFG_Z80PIO_ADD("ipu_pio0", 7372800/2, nflfoot_pio_intf) @@ -2580,6 +2631,8 @@ mcr_init(machine, 90010, 91399, 90913); mcr_sound_init(machine, MCR_SSIO); + ssio_set_custom_output(4, 0xff, twotiger_op4_w); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xe800, 0xefff, 0, 0x1000, FUNC(twotiger_videoram_r), FUNC(twotiger_videoram_w)); } @@ -2678,7 +2731,7 @@ GAME( 1984, twotigerc,twotiger, mcr_90010, twotigrc, mcr_90010, ROT0, "Bally Midway", "Two Tigers (Tron conversion)", GAME_SUPPORTS_SAVE ) /* hacked 90010 CPU board + 91399 video gen + 90913 sound I/O + 8-track interface */ -GAME( 1984, twotiger, 0, mcr_90010, twotiger, twotiger, ROT0, "Bally Midway", "Two Tigers (dedicated)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1984, twotiger, 0, mcr_90010_tt, twotiger, twotiger, ROT0, "Bally Midway", "Two Tigers (dedicated)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* 90010 CPU board + 91399 video gen + 91483 sound I/O */ GAME( 1982, kroozr, 0, mcr_90010, kroozr, kroozr, ROT0, "Bally Midway", "Kozmik Kroozr", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/meadows.c mame-0.145/src/mame/drivers/meadows.c --- mame-0.144/src/mame/drivers/meadows.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/meadows.c 2012-02-06 21:30:33.000000000 +0000 @@ -611,12 +611,12 @@ static const char *const bowl3d_sample_names[] = { "*bowl3d", - "roll.wav", /* "roll" */ - "rollback.wav", /* "roll back" */ - "sweep.wav", /* "sweep" */ - "footstep.wav", /* "foot sweep" */ - "crash.wav", /* "crash" */ - "cheering.wav", /* "cheering" */ + "roll", /* "roll" */ + "rollback", /* "roll back" */ + "sweep", /* "sweep" */ + "footstep", /* "foot sweep" */ + "crash", /* "crash" */ + "cheering", /* "cheering" */ 0 }; @@ -659,10 +659,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(meadows) + MCFG_SCREEN_UPDATE_STATIC(meadows) MCFG_GFXDECODE(meadows) MCFG_PALETTE_LENGTH(2) @@ -693,10 +692,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 24*8-1) - MCFG_SCREEN_UPDATE(meadows) + MCFG_SCREEN_UPDATE_STATIC(meadows) MCFG_GFXDECODE(minferno) MCFG_PALETTE_LENGTH(2) @@ -723,10 +721,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(meadows) + MCFG_SCREEN_UPDATE_STATIC(meadows) MCFG_GFXDECODE(meadows) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/mediagx.c mame-0.145/src/mame/drivers/mediagx.c --- mame-0.144/src/mame/drivers/mediagx.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mediagx.c 2012-02-06 21:30:38.000000000 +0000 @@ -76,6 +76,7 @@ #include "machine/pckeybrd.h" #include "machine/idectrl.h" #include "sound/dmadac.h" +#include "video/ramdac.h" #define SPEEDUP_HACKS 1 @@ -200,7 +201,7 @@ } } -static void draw_char(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int ch, int att, int x, int y) +static void draw_char(bitmap_rgb32 &bitmap, const rectangle &cliprect, const gfx_element *gfx, int ch, int att, int x, int y) { int i,j; const UINT8 *dp; @@ -211,7 +212,7 @@ for (j=y; j < y+8; j++) { - UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *p = &bitmap.pix32(j); for (i=x; i < x+8; i++) { UINT8 pen = dp[index++]; @@ -226,7 +227,7 @@ } } -static void draw_framebuffer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_framebuffer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { mediagx_state *state = machine.driver_data(); int i, j; @@ -250,9 +251,7 @@ state->m_frame_width = width; state->m_frame_height = height; - visarea.min_x = visarea.min_y = 0; - visarea.max_x = width - 1; - visarea.max_y = height - 1; + visarea.set(0, width - 1, 0, height - 1); machine.primary_screen->configure(width, height * 262 / 240, visarea, machine.primary_screen->frame_period().attoseconds); } @@ -263,7 +262,7 @@ for (j=0; j < state->m_frame_height; j++) { - UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *p = &bitmap.pix32(j); UINT8 *si = &framebuf[j * line_delta]; for (i=0; i < state->m_frame_width; i++) { @@ -285,7 +284,7 @@ { for (j=0; j < state->m_frame_height; j++) { - UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *p = &bitmap.pix32(j); UINT16 *si = &framebuf[j * (line_delta/2)]; for (i=0; i < state->m_frame_width; i++) { @@ -303,7 +302,7 @@ { for (j=0; j < state->m_frame_height; j++) { - UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *p = &bitmap.pix32(j); UINT16 *si = &framebuf[j * (line_delta/2)]; for (i=0; i < state->m_frame_width; i++) { @@ -319,7 +318,7 @@ } } -static void draw_cga(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_cga(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { mediagx_state *state = machine.driver_data(); int i, j; @@ -343,16 +342,16 @@ } } -static SCREEN_UPDATE(mediagx) +static SCREEN_UPDATE_RGB32(mediagx) { - mediagx_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); + mediagx_state *state = screen.machine().driver_data(); + bitmap.fill(0, cliprect); - draw_framebuffer(screen->machine(), bitmap, cliprect); + draw_framebuffer(screen.machine(), bitmap, cliprect); if (state->m_disp_ctrl_reg[DC_OUTPUT_CFG] & 0x1) // don't show MDA text screen on 16-bit mode. this is basically a hack { - draw_cga(screen->machine(), bitmap, cliprect); + draw_cga(screen.machine(), bitmap, cliprect); } return 0; } @@ -384,6 +383,7 @@ { mediagx_state *state = space->machine().driver_data(); +// printf("disp_ctrl_w %08X, %08X, %08X\n", data, offset*4, mem_mask); COMBINE_DATA(state->m_disp_ctrl_reg + offset); } @@ -432,18 +432,30 @@ { mediagx_state *state = space->machine().driver_data(); - //mame_printf_debug("memory_ctrl_w %08X, %08X, %08X\n", data, offset, mem_mask); - if (offset == 7) +// printf("memory_ctrl_w %08X, %08X, %08X\n", data, offset*4, mem_mask); + if (offset == 0x20/4) { - state->m_pal_index = 0; - } - else if (offset == 8) - { - state->m_pal[state->m_pal_index] = data & 0xff; - state->m_pal_index++; - if (state->m_pal_index >= 768) + ramdac_device *ramdac = space->machine().device("ramdac"); + + if((state->m_disp_ctrl_reg[DC_GENERAL_CFG] & 0x00e00000) == 0x00400000) + { + // guess: crtc params? + // ... + } + else if((state->m_disp_ctrl_reg[DC_GENERAL_CFG] & 0x00f00000) == 0x00000000) + { + state->m_pal_index = data; + ramdac->index_w( *space, 0, data ); + } + else if((state->m_disp_ctrl_reg[DC_GENERAL_CFG] & 0x00f00000) == 0x00100000) { - state->m_pal_index = 0; + state->m_pal[state->m_pal_index] = data & 0xff; + state->m_pal_index++; + if (state->m_pal_index >= 768) + { + state->m_pal_index = 0; + } + ramdac->pal_w( *space, 0, data ); } } else @@ -1103,6 +1115,14 @@ } }; +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE_MODERN("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 0 +}; static MACHINE_CONFIG_START( mediagx, mediagx_state ) @@ -1133,16 +1153,17 @@ MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 239) - MCFG_SCREEN_UPDATE(mediagx) + MCFG_SCREEN_UPDATE_STATIC(mediagx) MCFG_GFXDECODE(CGA) - MCFG_PALETTE_LENGTH(16) + MCFG_PALETTE_LENGTH(256) MCFG_VIDEO_START(mediagx) @@ -1184,7 +1205,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, mediagx_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, mediagx_get_out2 }; static void mediagx_set_keyb_int(running_machine &machine, int _state) @@ -1297,8 +1318,10 @@ ROM_START( a51site4 ) ROM_REGION32_LE(0x40000, "bios", 0) - ROM_LOAD("a51s4_bios_07-11-98.u1", 0x00000, 0x40000, CRC(5ee189cc) SHA1(0b0d9321a4c59b1deea6854923e655a4d8c4fcfe)) /* Build date 07/11/98 string stored at 0x3fff5 */ - ROM_LOAD("a51s4_bios_09-15-98.u1", 0x00000, 0x40000, CRC(f8cd6a6b) SHA1(75f851ae21517b729a5596ce5e042ebfaac51778)) /* Build date 09/15/98 string stored at 0x3fff5 */ + ROM_SYSTEM_BIOS(0, "new", "v1.0h" ) + ROMX_LOAD("a51s4_bios_09-15-98.u1", 0x00000, 0x40000, CRC(f8cd6a6b) SHA1(75f851ae21517b729a5596ce5e042ebfaac51778), ROM_BIOS(1)) /* Build date 09/15/98 string stored at 0x3fff5 */ + ROM_SYSTEM_BIOS(1, "old", "v1.0f" ) + ROMX_LOAD("a51s4_bios_07-11-98.u1", 0x00000, 0x40000, CRC(5ee189cc) SHA1(0b0d9321a4c59b1deea6854923e655a4d8c4fcfe), ROM_BIOS(2)) /* Build date 07/11/98 string stored at 0x3fff5 */ ROM_REGION(0x08100, "gfx1", 0) ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) diff -Nru mame-0.144/src/mame/drivers/megaplay.c mame-0.145/src/mame/drivers/megaplay.c --- mame-0.144/src/mame/drivers/megaplay.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/megaplay.c 2012-02-06 21:30:37.000000000 +0000 @@ -69,7 +69,7 @@ static INTERRUPT_GEN (megaplay_bios_irq) { int sline; - sline = 261 - cpu_getiloops(device); + sline = device->machine().primary_screen->vpos(); if (sline ==0) { hintcount = segae_vdp_regs[0][10]; @@ -617,17 +617,17 @@ // VIDEO_START_CALL(megaplay_normal); } -static SCREEN_UPDATE(megplay) +static SCREEN_UPDATE_RGB32(megplay) { //printf("megplay vu\n"); - SCREEN_UPDATE_CALL(megadriv); -// SCREEN_UPDATE_CALL(megaplay_normal); - SCREEN_UPDATE_CALL(megaplay_bios); + SCREEN_UPDATE32_CALL(megadriv); +// SCREEN_UPDATE32_CALL(megaplay_normal); + SCREEN_UPDATE32_CALL(megaplay_bios); return 0; } -//extern SCREEN_EOF(megadriv); +//extern SCREEN_VBLANK(megadriv); static MACHINE_RESET( megaplay ) { mplay_state *state = machine.driver_data(); @@ -638,10 +638,10 @@ MACHINE_RESET_CALL(megatech_bios); } -static SCREEN_EOF( megaplay ) +static SCREEN_VBLANK( megaplay ) { - SCREEN_EOF_CALL(megadriv); - SCREEN_EOF_CALL(megatech_bios); + SCREEN_VBLANK_CALL(megadriv); + SCREEN_VBLANK_CALL(megatech_bios); } static MACHINE_CONFIG_START( megaplay, mplay_state ) @@ -665,8 +665,8 @@ /* New update functions to handle the extra layer */ MCFG_VIDEO_START(megplay) MCFG_SCREEN_MODIFY("megadriv") - MCFG_SCREEN_UPDATE(megplay) - MCFG_SCREEN_EOF( megaplay ) + MCFG_SCREEN_UPDATE_STATIC(megplay) + MCFG_SCREEN_VBLANK_STATIC( megaplay ) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/megasys1.c mame-0.145/src/mame/drivers/megasys1.c --- mame-0.144/src/mame/drivers/megasys1.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/megasys1.c 2012-02-06 21:30:38.000000000 +0000 @@ -1477,11 +1477,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(megasys1) - MCFG_SCREEN_EOF(megasys1) + MCFG_SCREEN_UPDATE_STATIC(megasys1) + MCFG_SCREEN_VBLANK_STATIC(megasys1) MCFG_GFXDECODE(ABC) MCFG_PALETTE_LENGTH(1024) @@ -1538,11 +1537,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(megasys1) - MCFG_SCREEN_EOF(megasys1) + MCFG_SCREEN_UPDATE_STATIC(megasys1) + MCFG_SCREEN_VBLANK_STATIC(megasys1) MCFG_GFXDECODE(ABC) MCFG_PALETTE_LENGTH(1024) @@ -1611,11 +1609,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(megasys1) - MCFG_SCREEN_EOF(megasys1) + MCFG_SCREEN_UPDATE_STATIC(megasys1) + MCFG_SCREEN_VBLANK_STATIC(megasys1) MCFG_GFXDECODE(ABC) MCFG_PALETTE_LENGTH(1024) @@ -1675,10 +1672,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(megasys1) + MCFG_SCREEN_UPDATE_STATIC(megasys1) MCFG_GFXDECODE(Z) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/megatech.c mame-0.145/src/mame/drivers/megatech.c --- mame-0.144/src/mame/drivers/megatech.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/megatech.c 2012-02-06 21:30:38.000000000 +0000 @@ -442,34 +442,25 @@ } //attotime::never -static SCREEN_UPDATE(mtnew) +static SCREEN_UPDATE_RGB32(mtnew) { - mtech_state *state = screen->machine().driver_data(); - device_t *megadriv_screen = screen->machine().device("megadriv"); - device_t *menu_screen = screen->machine().device("menu"); + mtech_state *state = screen.machine().driver_data(); - if (screen == megadriv_screen) - { - /* if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip */ - if (!state->m_current_game_is_sms) - SCREEN_UPDATE_CALL(megadriv); - else - SCREEN_UPDATE_CALL(megatech_md_sms); - } - else if (screen == menu_screen) - SCREEN_UPDATE_CALL(megatech_bios); + /* if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip */ + if (!state->m_current_game_is_sms) + SCREEN_UPDATE32_CALL(megadriv); + else + SCREEN_UPDATE32_CALL(megatech_md_sms); return 0; } -static SCREEN_EOF(mtnew) +static SCREEN_VBLANK(mtnew) { - mtech_state *state = machine.driver_data(); + mtech_state *state = screen.machine().driver_data(); if (!state->m_current_game_is_sms) - SCREEN_EOF_CALL(megadriv); + SCREEN_VBLANK_CALL(megadriv); else - SCREEN_EOF_CALL(megatech_md_sms); - - SCREEN_EOF_CALL(megatech_bios); + SCREEN_VBLANK_CALL(megatech_md_sms); } static MACHINE_RESET(mtnew) @@ -499,15 +490,15 @@ MCFG_DEFAULT_LAYOUT(layout_dualhovu) MCFG_SCREEN_ADD("menu", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(342,262) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 224-1) - MCFG_SCREEN_UPDATE(mtnew) + MCFG_SCREEN_UPDATE_STATIC(megatech_bios) + MCFG_SCREEN_VBLANK_STATIC(megatech_bios) MCFG_SCREEN_MODIFY("megadriv") - MCFG_SCREEN_UPDATE(mtnew) - MCFG_SCREEN_EOF(mtnew) + MCFG_SCREEN_UPDATE_STATIC(mtnew) + MCFG_SCREEN_VBLANK_STATIC(mtnew) /* sound hardware */ MCFG_SOUND_ADD("sn2", SN76496, MASTER_CLOCK/15) diff -Nru mame-0.144/src/mame/drivers/megazone.c mame-0.145/src/mame/drivers/megazone.c --- mame-0.144/src/mame/drivers/megazone.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/megazone.c 2012-02-06 21:30:38.000000000 +0000 @@ -76,12 +76,18 @@ coin_counter_w(space->machine(), 1 - offset, data); /* 1-offset, because coin counters are in reversed order */ } +static WRITE8_HANDLER( irq_mask_w ) +{ + megazone_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( megazone_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0001) AM_WRITE(megazone_coin_counter_w) /* coin counter 2, coin counter 1 */ AM_RANGE(0x0005, 0x0005) AM_WRITE(megazone_flipscreen_w) - AM_RANGE(0x0007, 0x0007) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x0007, 0x0007) AM_WRITE(irq_mask_w) AM_RANGE(0x0800, 0x0800) AM_WRITE(watchdog_reset_w) AM_RANGE(0x1000, 0x1000) AM_WRITEONLY AM_BASE_MEMBER(megazone_state, m_scrolly) AM_RANGE(0x1800, 0x1800) AM_WRITEONLY AM_BASE_MEMBER(megazone_state, m_scrollx) @@ -101,8 +107,8 @@ AM_RANGE(0x6000, 0x6000) AM_READ_PORT("IN0") /* IO Coin */ AM_RANGE(0x6001, 0x6001) AM_READ_PORT("IN1") /* P1 IO */ AM_RANGE(0x6002, 0x6002) AM_READ_PORT("IN2") /* P2 IO */ - AM_RANGE(0x8000, 0x8000) AM_READ_PORT("DSW1") - AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW2") + AM_RANGE(0x8000, 0x8000) AM_READ_PORT("DSW2") + AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW1") AM_RANGE(0xa000, 0xa000) AM_WRITENOP /* INTMAIN - Interrupts main CPU (unused) */ AM_RANGE(0xc000, 0xc000) AM_WRITENOP /* INT (Actually is NMI) enable/disable (unused)*/ AM_RANGE(0xc001, 0xc001) AM_WRITE(watchdog_reset_w) @@ -139,41 +145,41 @@ PORT_START("IN2") KONAMI8_COCKTAIL_B1_UNK - /* 0x8000 -> 0xe020 (CPU1) = 0x3820 (CPU0) */ + /* 0x8001 -> 0xe021 (CPU1) = 0x3821 (CPU0) */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) + /* "No Coin B" = coins produce sound, but no effect on coin counter */ + + /* 0x8000 -> 0xe020 (CPU1) = 0x3820 (CPU0) */ + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20k 70k 70k+" ) PORT_DIPSETTING( 0x10, "20k 80k 80k+" ) PORT_DIPSETTING( 0x08, "30k 90k 90k+" ) PORT_DIPSETTING( 0x00, "30k 100k 100k+" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - /* 0x8001 -> 0xe021 (CPU1) = 0x3821 (CPU0) */ - PORT_START("DSW2") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") - /* "No Coin B" = coins produce sound, but no effect on coin counter */ INPUT_PORTS_END static INPUT_PORTS_START( megazona ) PORT_INCLUDE( megazone ) - PORT_MODIFY("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_MODIFY("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) @@ -244,12 +250,21 @@ state->m_i8039_status = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + megazone_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( megazone, megazone_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 18432000/9) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(megazone_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,18432000/6) /* Z80 Clock is derived from the H1 signal */ MCFG_CPU_PROGRAM_MAP(megazone_sound_map) @@ -268,10 +283,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(megazone) + MCFG_SCREEN_UPDATE_STATIC(megazone) MCFG_GFXDECODE(megazone) MCFG_PALETTE_LENGTH(16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/meijinsn.c mame-0.145/src/mame/drivers/meijinsn.c --- mame-0.144/src/mame/drivers/meijinsn.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/meijinsn.c 2012-02-06 21:30:41.000000000 +0000 @@ -61,7 +61,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "video/resnet.h" #include "sound/ay8910.h" @@ -69,7 +68,9 @@ { public: meijinsn_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* memory pointers */ UINT16 * m_shared_ram; @@ -86,6 +87,8 @@ UINT8 m_credits; UINT8 m_coinvalue; int m_mcu_latch; + + required_device m_maincpu; }; @@ -222,7 +225,7 @@ PORT_DIPSETTING( 0x02, "10:00" ) PORT_DIPSETTING( 0x01, "20:00" ) PORT_DIPSETTING( 0x00, "0:30" ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x08, "A 1C/1C B 1C/5C" ) PORT_DIPSETTING( 0x00, "A 1C/2C B 2C/1C" ) PORT_DIPNAME( 0x10, 0x00, "2 Player" ) @@ -280,9 +283,9 @@ } -static SCREEN_UPDATE(meijinsn) +static SCREEN_UPDATE_IND16(meijinsn) { - meijinsn_state *state = screen->machine().driver_data(); + meijinsn_state *state = screen.machine().driver_data(); int offs; for (offs = 0; offs < 0x4000; offs++) @@ -299,19 +302,23 @@ { color= BIT(data1, x) | (BIT(data1, x + 4) << 1); data = BIT(data2, x) | (BIT(data2, x + 4) << 1); - *BITMAP_ADDR16(bitmap, sy, (sx * 4 + (3 - x))) = color * 4 + data; + bitmap.pix16(sy, (sx * 4 + (3 - x))) = color * 4 + data; } } return 0; } -static INTERRUPT_GEN( meijinsn_interrupt ) +static TIMER_DEVICE_CALLBACK( meijinsn_interrupt ) { - if (cpu_getiloops(device) == 0) - device_set_input_line(device, 1, HOLD_LINE); - else - device_set_input_line(device, 2, HOLD_LINE); + meijinsn_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } static const ay8910_interface ay8910_config = @@ -345,7 +352,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 9000000 ) MCFG_CPU_PROGRAM_MAP(meijinsn_map) - MCFG_CPU_VBLANK_INT_HACK(meijinsn_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", meijinsn_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(meijinsn_sound_map) @@ -359,10 +366,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12, 243, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(meijinsn) + MCFG_SCREEN_UPDATE_STATIC(meijinsn) MCFG_PALETTE_LENGTH(32) MCFG_PALETTE_INIT(meijinsn) diff -Nru mame-0.144/src/mame/drivers/mephisto.c mame-0.145/src/mame/drivers/mephisto.c --- mame-0.144/src/mame/drivers/mephisto.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/mephisto.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i86/i86.h" @@ -5,11 +7,21 @@ { public: mephisto_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( mephisto_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( mephisto_map, AS_PROGRAM, 8, mephisto_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x00000, 0x0ffff) AM_ROM AM_RANGE(0x10000, 0x1ffff) AM_RAM @@ -19,7 +31,7 @@ static INPUT_PORTS_START( mephisto ) INPUT_PORTS_END -static MACHINE_RESET( mephisto ) +void mephisto_state::machine_reset() { } @@ -31,8 +43,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8088, 8000000) MCFG_CPU_PROGRAM_MAP(mephisto_map) - - MCFG_MACHINE_RESET( mephisto ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -74,5 +84,6 @@ ROM_LOAD("ic19_f", 0x38000, 0x8000, CRC(cc4bb629) SHA1(db46be2a8034bbd106b7dd80f50988c339684b5e)) ROM_END -GAME(1986, mephistp, 0, mephisto, mephisto, mephisto, ROT0, "Stargame", "Mephisto (rev. 1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, mephistp1, mephistp,mephisto, mephisto, mephisto, ROT0, "Stargame", "Mephisto (rev. 1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1986, mephistp, 0, mephisto, mephisto, mephisto, ROT0, "Stargame", "Mephisto (rev. 1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, mephistp1, mephistp, mephisto, mephisto, mephisto, ROT0, "Stargame", "Mephisto (rev. 1.1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/merit.c mame-0.145/src/mame/drivers/merit.c --- mame-0.144/src/mame/drivers/merit.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/merit.c 2012-02-06 21:30:37.000000000 +0000 @@ -246,7 +246,7 @@ col |= 0x03; col = state->m_ram_palette[col & 0x3ff]; - *BITMAP_ADDR32(bitmap, y, x) = pens[col ? col : (state->m_lscnblk ? 8 : 0)]; + bitmap.pix32(y, x) = pens[col ? col : (state->m_lscnblk ? 8 : 0)]; x++; } @@ -1153,14 +1153,6 @@ INPUT_PORTS_END -static SCREEN_UPDATE( merit ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - - return 0; -} - static const ppi8255_interface ppi8255_intf[2] = { { @@ -1236,9 +1228,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(merit) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) @@ -1275,7 +1266,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(dodge_map) - MCFG_NVRAM_REPLACE_CUSTOM("nvram", merit_state, dodge_nvram_init) + MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", merit_state, dodge_nvram_init) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( tictac, pitboss ) diff -Nru mame-0.144/src/mame/drivers/meritm.c mame-0.145/src/mame/drivers/meritm.c --- mame-0.144/src/mame/drivers/meritm.c 2012-01-13 15:34:42.000000000 +0000 +++ mame-0.145/src/mame/drivers/meritm.c 2012-02-06 21:30:34.000000000 +0000 @@ -95,12 +95,11 @@ - clean up V9938 interrupt implementation - finish inputs, dsw, outputs (lamps) - problem with registering touches on the bottom of the screen (currently hacked to work) - - megat5: has jmp $0000 in the initialization code causing infinite loop, rom U38 is dumped at half size / bad dump + - megat5a: has jmp $0000 in the initialization code causing infinite loop, rom U38 is dumped at half size / bad dump - for pbst30 only roms were found, it appears that two roms with graphics data were missing, using pitbossm roms for now */ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/z80/z80daisy.h" #include "sound/ay8910.h" @@ -128,21 +127,23 @@ { public: meritm_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938_0(*this, "v9938_0"), + m_v9938_1(*this, "v9938_1") { } UINT8* m_ram; device_t *m_z80pio[2]; int m_vint; int m_interrupt_vdp0_state; int m_interrupt_vdp1_state; - bitmap_t *m_vdp0_bitmap; - bitmap_t *m_vdp1_bitmap; int m_layer0_enabled; int m_layer1_enabled; int m_bank; int m_psd_a15; UINT16 m_questions_loword_address; ds1204_t m_ds1204; + required_device m_v9938_0; + required_device m_v9938_1; }; @@ -317,24 +318,30 @@ *************************************/ -static INTERRUPT_GEN( meritm_interrupt ) +static TIMER_DEVICE_CALLBACK( meritm_interrupt ) { - v9938_set_sprite_limit(0, 0); - v9938_set_resolution(0, RENDER_HIGH); - v9938_interrupt(device->machine(), 0); - - v9938_set_sprite_limit(1, 0); - v9938_set_resolution(1, RENDER_HIGH); - v9938_interrupt(device->machine(), 1); + meritm_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 2) == 0) + { + state->m_v9938_0->set_sprite_limit(0); + state->m_v9938_0->set_resolution(RENDER_HIGH); + state->m_v9938_0->interrupt(); + + state->m_v9938_1->set_sprite_limit(0); + state->m_v9938_1->set_resolution(RENDER_HIGH); + state->m_v9938_1->interrupt(); + } } -static void meritm_vdp0_interrupt(running_machine &machine, int i) +static void meritm_vdp0_interrupt(device_t *, v99x8_device &device, int i) { /* this is not used as the v9938 interrupt callbacks are broken interrupts seem to be fired quite randomly */ } -static void meritm_vdp1_interrupt(running_machine &machine, int i) +static void meritm_vdp1_interrupt(device_t *, v99x8_device &device, int i) { /* this is not used as the v9938 interrupt callbacks are broken interrupts seem to be fired quite randomly */ @@ -346,47 +353,36 @@ meritm_state *state = machine.driver_data(); state->m_layer0_enabled = state->m_layer1_enabled = 1; - state->m_vdp0_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - v9938_init (machine, 0, *machine.primary_screen, state->m_vdp0_bitmap, MODEL_V9938, 0x20000, meritm_vdp0_interrupt); - v9938_reset(0); - - state->m_vdp1_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - v9938_init (machine, 1, *machine.primary_screen, state->m_vdp1_bitmap, MODEL_V9938, 0x20000, meritm_vdp1_interrupt); - v9938_reset(1); - state->m_vint = 0x18; state_save_register_global(machine, state->m_vint); state_save_register_global(machine, state->m_interrupt_vdp0_state); state_save_register_global(machine, state->m_interrupt_vdp1_state); - state_save_register_global_bitmap(machine, state->m_vdp0_bitmap); - state_save_register_global_bitmap(machine, state->m_vdp1_bitmap); - } -static SCREEN_UPDATE( meritm ) +static SCREEN_UPDATE_IND16( meritm ) { - meritm_state *state = screen->machine().driver_data(); - if(screen->machine().input().code_pressed_once(KEYCODE_Q)) + meritm_state *state = screen.machine().driver_data(); + if(screen.machine().input().code_pressed_once(KEYCODE_Q)) { state->m_layer0_enabled^=1; popmessage("Layer 0 %sabled",state->m_layer0_enabled ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_W)) + if(screen.machine().input().code_pressed_once(KEYCODE_W)) { state->m_layer1_enabled^=1; popmessage("Layer 1 %sabled",state->m_layer1_enabled ? "en" : "dis"); } - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if ( state->m_layer0_enabled ) { - copybitmap(bitmap, state->m_vdp0_bitmap, 0, 0, 0, 0, cliprect); + copybitmap(bitmap, state->m_v9938_0->get_bitmap(), 0, 0, 0, 0, cliprect); } if ( state->m_layer1_enabled ) { - copybitmap_trans(bitmap, state->m_vdp1_bitmap, 0, 0, -6, -12, cliprect, v9938_get_transpen(1)); + copybitmap_trans(bitmap, state->m_v9938_1->get_bitmap(), 0, 0, -6, -12, cliprect, state->m_v9938_1->get_transpen()); } return 0; } @@ -580,14 +576,8 @@ static ADDRESS_MAP_START( meritm_crt250_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x10, 0x10) AM_READWRITE(v9938_0_vram_r, v9938_0_vram_w) - AM_RANGE(0x11, 0x11) AM_READWRITE(v9938_0_status_r, v9938_0_command_w) - AM_RANGE(0x12, 0x12) AM_WRITE(v9938_0_palette_w) - AM_RANGE(0x13, 0x13) AM_WRITE(v9938_0_register_w) - AM_RANGE(0x20, 0x20) AM_READWRITE(v9938_1_vram_r, v9938_1_vram_w) - AM_RANGE(0x21, 0x21) AM_READWRITE(v9938_1_status_r, v9938_1_command_w) - AM_RANGE(0x22, 0x22) AM_WRITE(v9938_1_palette_w) - AM_RANGE(0x23, 0x23) AM_WRITE(v9938_1_register_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_MODERN("v9938_0", v9938_device, read, write) + AM_RANGE(0x20, 0x23) AM_DEVREADWRITE_MODERN("v9938_1", v9938_device, read, write) AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("ppi8255", ppi8255_r, ppi8255_w) AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("z80pio_0", z80pio_cd_ba_r, z80pio_cd_ba_w) AM_RANGE(0x50, 0x53) AM_DEVREADWRITE("z80pio_1", z80pio_cd_ba_r, z80pio_cd_ba_w) @@ -598,14 +588,8 @@ static ADDRESS_MAP_START( meritm_crt250_crt258_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x10, 0x10) AM_READWRITE(v9938_0_vram_r, v9938_0_vram_w) - AM_RANGE(0x11, 0x11) AM_READWRITE(v9938_0_status_r, v9938_0_command_w) - AM_RANGE(0x12, 0x12) AM_WRITE(v9938_0_palette_w) - AM_RANGE(0x13, 0x13) AM_WRITE(v9938_0_register_w) - AM_RANGE(0x20, 0x20) AM_READWRITE(v9938_1_vram_r, v9938_1_vram_w) - AM_RANGE(0x21, 0x21) AM_READWRITE(v9938_1_status_r, v9938_1_command_w) - AM_RANGE(0x22, 0x22) AM_WRITE(v9938_1_palette_w) - AM_RANGE(0x23, 0x23) AM_WRITE(v9938_1_register_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_MODERN("v9938_0", v9938_device, read, write) + AM_RANGE(0x20, 0x23) AM_DEVREADWRITE_MODERN("v9938_1", v9938_device, read, write) AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("ppi8255", ppi8255_r, ppi8255_w) AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("z80pio_0", z80pio_cd_ba_r, z80pio_cd_ba_w) AM_RANGE(0x50, 0x53) AM_DEVREADWRITE("z80pio_1", z80pio_cd_ba_r, z80pio_cd_ba_w) @@ -625,14 +609,8 @@ ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x00, 0x00) AM_WRITE(meritm_psd_a15_w) AM_RANGE(0x01, 0x01) AM_WRITE(watchdog_reset_w) - AM_RANGE(0x10, 0x10) AM_READWRITE(v9938_0_vram_r, v9938_0_vram_w) - AM_RANGE(0x11, 0x11) AM_READWRITE(v9938_0_status_r, v9938_0_command_w) - AM_RANGE(0x12, 0x12) AM_WRITE(v9938_0_palette_w) - AM_RANGE(0x13, 0x13) AM_WRITE(v9938_0_register_w) - AM_RANGE(0x20, 0x20) AM_READWRITE(v9938_1_vram_r, v9938_1_vram_w) - AM_RANGE(0x21, 0x21) AM_READWRITE(v9938_1_status_r, v9938_1_command_w) - AM_RANGE(0x22, 0x22) AM_WRITE(v9938_1_palette_w) - AM_RANGE(0x23, 0x23) AM_WRITE(v9938_1_register_w) + AM_RANGE(0x10, 0x13) AM_DEVREADWRITE_MODERN("v9938_0", v9938_device, read, write) + AM_RANGE(0x20, 0x23) AM_DEVREADWRITE_MODERN("v9938_1", v9938_device, read, write) AM_RANGE(0x30, 0x33) AM_DEVREADWRITE("ppi8255", ppi8255_r, ppi8255_w) AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("z80pio_0", z80pio_cd_ba_r, z80pio_cd_ba_w) AM_RANGE(0x50, 0x53) AM_DEVREADWRITE("z80pio_1", z80pio_cd_ba_r, z80pio_cd_ba_w) @@ -1071,7 +1049,7 @@ MCFG_CPU_PROGRAM_MAP(meritm_crt250_map) MCFG_CPU_IO_MAP(meritm_crt250_io_map) MCFG_CPU_CONFIG(meritm_daisy_chain) - MCFG_CPU_VBLANK_INT_HACK(meritm_interrupt,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", meritm_interrupt, "screen", 0, 1) MCFG_MACHINE_START(meritm_crt250) @@ -1087,14 +1065,19 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) + MCFG_V9938_ADD("v9938_0", "screen", 0x20000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(meritm_vdp0_interrupt) + + MCFG_V9938_ADD("v9938_1", "screen", 0x20000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(meritm_vdp1_interrupt) + MCFG_SCREEN_ADD("screen",RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) + MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, 262*2) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) - MCFG_SCREEN_UPDATE(meritm) + MCFG_SCREEN_UPDATE_STATIC(meritm) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT( v9938 ) diff -Nru mame-0.144/src/mame/drivers/mermaid.c mame-0.145/src/mame/drivers/mermaid.c --- mame-0.144/src/mame/drivers/mermaid.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mermaid.c 2012-02-06 21:30:39.000000000 +0000 @@ -136,6 +136,14 @@ if (state->m_ay8910_enable[1]) ay8910_address_w(state->m_ay2, offset, data); } + +static WRITE8_HANDLER( nmi_mask_w ) +{ + mermaid_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + /* Memory Map */ static ADDRESS_MAP_START( mermaid_map, AS_PROGRAM, 8 ) @@ -152,7 +160,7 @@ AM_RANGE(0xe002, 0xe004) AM_WRITENOP // ??? AM_RANGE(0xe005, 0xe005) AM_WRITE(mermaid_flip_screen_x_w) AM_RANGE(0xe006, 0xe006) AM_WRITE(mermaid_flip_screen_y_w) - AM_RANGE(0xe007, 0xe007) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xe007, 0xe007) AM_WRITE(nmi_mask_w) AM_RANGE(0xe800, 0xe800) AM_READ_PORT("P1") AM_WRITENOP // ??? AM_RANGE(0xe801, 0xe801) AM_WRITENOP // ??? AM_RANGE(0xe802, 0xe802) AM_WRITENOP // ??? @@ -439,12 +447,20 @@ }; +static INTERRUPT_GEN( vblank_irq ) +{ + mermaid_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( mermaid, mermaid_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) // ??? MCFG_CPU_PROGRAM_MAP(mermaid_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(mermaid) MCFG_MACHINE_RESET(mermaid) @@ -453,11 +469,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mermaid) - MCFG_SCREEN_EOF(mermaid) + MCFG_SCREEN_UPDATE_STATIC(mermaid) + MCFG_SCREEN_VBLANK_STATIC(mermaid) MCFG_GFXDECODE(mermaid) MCFG_PALETTE_LENGTH(4*16+2*2) diff -Nru mame-0.144/src/mame/drivers/metalmx.c mame-0.145/src/mame/drivers/metalmx.c --- mame-0.144/src/mame/drivers/metalmx.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/metalmx.c 2012-02-06 21:30:40.000000000 +0000 @@ -278,10 +278,10 @@ } -static SCREEN_UPDATE( metalmx ) +static SCREEN_UPDATE_IND16( metalmx ) { /* TODO: TMS34020 should take care of this */ - metalmx_state *state = screen->machine().driver_data(); + metalmx_state *state = screen.machine().driver_data(); // UINT32 *src_base = &gsp_vram[(vreg_base[0x40/4] & 0x40) ? 0x20000 : 0]; UINT16 *src_base = state->m_gsp_vram; @@ -291,7 +291,7 @@ { int x; UINT16 *src = &src_base[512 * y]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); for(x = 0; x < 512; x++) *dst++ = *src++; @@ -720,7 +720,8 @@ "screen", /* the screen operated on */ 4000000, /* pixel clock */ 2, /* pixels per clock */ - NULL, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + NULL, /* scanline callback (rgb32) */ tms_interrupt, /* generate interrupt */ }; @@ -763,10 +764,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(metalmx) + MCFG_SCREEN_UPDATE_STATIC(metalmx) MCFG_PALETTE_LENGTH(65536) MCFG_PALETTE_INIT(RRRRR_GGGGGG_BBBBB) diff -Nru mame-0.144/src/mame/drivers/metlclsh.c mame-0.145/src/mame/drivers/metlclsh.c --- mame-0.144/src/mame/drivers/metlclsh.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/metlclsh.c 2012-02-06 21:30:40.000000000 +0000 @@ -32,7 +32,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m6809/m6809.h" #include "sound/2203intf.h" #include "sound/3526intf.h" @@ -133,6 +132,13 @@ ***************************************************************************/ + +static INPUT_CHANGED( coin_inserted ) +{ + if(newval != oldval) + cputag_set_input_line(field.machine(), "sub", INPUT_LINE_NMI, ASSERT_LINE); +} + static INPUT_PORTS_START( metlclsh ) PORT_START("IN0") /* c000 */ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) @@ -176,8 +182,8 @@ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) PORT_START("DSW") /* c003 */ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) @@ -196,7 +202,7 @@ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // cpu2 will clr c040 on startup forever - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_IMPULSE(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) INPUT_PORTS_END @@ -264,14 +270,6 @@ metlclsh_irqhandler }; -static INTERRUPT_GEN( metlclsh_interrupt2 ) -{ - if (cpu_getiloops(device) == 0) - return; - /* generate NMI on coin insertion */ - if ((~input_port_read(device->machine(), "IN2") & 0xc0) || (~input_port_read(device->machine(), "DSW") & 0x40)) /* TODO: remove me */ - device_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); -} static MACHINE_START( metlclsh ) { @@ -303,7 +301,6 @@ MCFG_CPU_ADD("sub", M6809, 1500000) // ? MCFG_CPU_PROGRAM_MAP(metlclsh_slave_map) - MCFG_CPU_VBLANK_INT_HACK(metlclsh_interrupt2,2) // IRQ by cpu #1, NMI by coins insertion MCFG_MACHINE_START(metlclsh) @@ -313,10 +310,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 30*8-1) - MCFG_SCREEN_UPDATE(metlclsh) + MCFG_SCREEN_UPDATE_STATIC(metlclsh) MCFG_GFXDECODE(metlclsh) MCFG_PALETTE_LENGTH(3 * 16) diff -Nru mame-0.144/src/mame/drivers/metro.c mame-0.145/src/mame/drivers/metro.c --- mame-0.144/src/mame/drivers/metro.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/metro.c 2012-02-06 21:30:37.000000000 +0000 @@ -84,7 +84,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "cpu/h83002/h8.h" @@ -98,6 +97,18 @@ #include "sound/ymf278b.h" #include "video/konicdev.h" +/* TODO: NOT measured! */ +#define PIXEL_CLOCK (XTAL_14_31818MHz/2) + +#define HTOTAL (456) +#define HBEND (0) +#define HBSTART (320) + +#define VTOTAL (262) +#define VBEND (0) +#define VBSTART (240) + + /*************************************************************************** @@ -109,7 +120,15 @@ static READ16_HANDLER( metro_irq_cause_r ) { metro_state *state = space->machine().driver_data(); + int res,i; + + res = 0; + for(i=0;i<8;i++) + res |= (state->m_requested_int[i] << i); + + return res; + #if 0 return state->m_requested_int[0] * 0x01 + // vblank state->m_requested_int[1] * 0x02 + state->m_requested_int[2] * 0x04 + // blitter @@ -118,6 +137,7 @@ state->m_requested_int[5] * 0x20 + state->m_requested_int[6] * 0x40 + // unused state->m_requested_int[7] * 0x80 ; // unused + #endif } @@ -167,6 +187,7 @@ static WRITE16_HANDLER( metro_irq_cause_w ) { metro_state *state = space->machine().driver_data(); + int i; //if (data & ~0x15) logerror("CPU #0 PC %06X : unknown bits of irqcause written: %04X\n", cpu_get_pc(&space->device()), data); @@ -174,6 +195,10 @@ { data &= ~*state->m_irq_enable; + for(i=0;i<8;i++) + if (BIT(data, i)) state->m_requested_int[i] = 0; + + #if 0 if (BIT(data, 0)) state->m_requested_int[0] = 0; if (BIT(data, 1)) state->m_requested_int[1] = 0; // DAITORIDE, BALCUBE, KARATOUR, MOUJA if (BIT(data, 2)) state->m_requested_int[2] = 0; @@ -182,84 +207,76 @@ if (BIT(data, 5)) state->m_requested_int[5] = 0; // KARATOUR, BLZNTRND if (BIT(data, 6)) state->m_requested_int[6] = 0; if (BIT(data, 7)) state->m_requested_int[7] = 0; + #endif } update_irq_state(space->machine()); } - -static INTERRUPT_GEN( metro_interrupt ) +static TIMER_DEVICE_CALLBACK( metro_interrupt ) { - metro_state *state = device->machine().driver_data(); + metro_state *state = timer.machine().driver_data(); + int scanline = param; - switch (cpu_getiloops(device)) + if(scanline == 240) { - case 0: - state->m_requested_int[0] = 1; - update_irq_state(device->machine()); - break; - - default: - state->m_requested_int[4] = 1; - update_irq_state(device->machine()); - break; + state->m_requested_int[0] = 1; + update_irq_state(timer.machine()); } -} -/* Lev 1. Lev 2 seems sound related */ -static INTERRUPT_GEN( bangball_interrupt ) -{ - metro_state *state = device->machine().driver_data(); - - state->m_requested_int[0] = 1; // set scroll regs if a flag is set - state->m_requested_int[4] = 1; // clear that flag - update_irq_state(device->machine()); + if(scanline == 0) + { + state->m_requested_int[4] = 1; + update_irq_state(timer.machine()); + } } -static INTERRUPT_GEN( msgogo_interrupt ) +static TIMER_DEVICE_CALLBACK( msgogo_interrupt ) { - metro_state *state = device->machine().driver_data(); + metro_state *state = timer.machine().driver_data(); + int scanline = param; - switch (cpu_getiloops(device)) - { - case 10: - state->m_requested_int[0] = 1; - update_irq_state(device->machine()); - break; + if(scanline == 224-16) // TODO: timing quirk + { + state->m_requested_int[0] = 1; + update_irq_state(timer.machine()); + } - case 224: - state->m_requested_int[4] = 1; - update_irq_state(device->machine()); - break; - } + if(scanline == 0) + { + state->m_requested_int[4] = 1; + update_irq_state(timer.machine()); + } } -static TIMER_CALLBACK( vblank_end_callback ) -{ - metro_state *state = machine.driver_data(); - state->m_requested_int[5] = param; -} - /* lev 2-7 (lev 1 seems sound related) */ -static INTERRUPT_GEN( karatour_interrupt ) +/* TODO: fix this arrangement (various things still doesn't work with this) */ +static TIMER_DEVICE_CALLBACK( karatour_interrupt ) { - metro_state *state = device->machine().driver_data(); + metro_state *state = timer.machine().driver_data(); + int scanline = param; - switch (cpu_getiloops(device)) + if(scanline == 224) { - case 0: - state->m_requested_int[0] = 1; - state->m_requested_int[5] = 1; // write the scroll registers - /* the duration is a guess */ - device->machine().scheduler().timer_set(attotime::from_usec(2500), FUNC(vblank_end_callback)); - update_irq_state(device->machine()); - break; - - default: - state->m_requested_int[4] = 1; - update_irq_state(device->machine()); - break; + state->m_requested_int[0] = 1; + state->m_requested_int[4] = 0; + //state->m_requested_int[5] = 0; + update_irq_state(timer.machine()); + } + else if(scanline == 240) + { + state->m_requested_int[0] = 1; + state->m_requested_int[4] = 0; + state->m_requested_int[5] = 1; + update_irq_state(timer.machine()); + } + else if(scanline == 0) + { + //state->m_requested_int[0] = 0; + state->m_requested_int[4] = 1; + state->m_requested_int[5] = 0; + update_irq_state(timer.machine()); } } @@ -293,29 +310,25 @@ { metro_state *state = device->machine().driver_data(); - switch (cpu_getiloops(device)) - { - case 0: - state->m_requested_int[1] = 1; - update_irq_state(device->machine()); - break; - } + state->m_requested_int[1] = 1; + update_irq_state(device->machine()); } -static INTERRUPT_GEN( dokyusei_interrupt ) +static TIMER_DEVICE_CALLBACK( dokyusei_interrupt ) { - metro_state *state = device->machine().driver_data(); + metro_state *state = timer.machine().driver_data(); + int scanline = param; - switch (cpu_getiloops(device)) + if(scanline == 240) { - case 0: - state->m_requested_int[1] = 1; - update_irq_state(device->machine()); - break; - case 1: // needed? - state->m_requested_int[5] = 1; - update_irq_state(device->machine()); - break; + state->m_requested_int[1] = 1; + update_irq_state(timer.machine()); + } + else if(scanline == 0) + { + // needed? + state->m_requested_int[5] = 1; + update_irq_state(timer.machine()); } } @@ -3380,16 +3393,34 @@ /* 8x8x4 tiles */ -static GFXLAYOUT_RAW( layout_8x8x4, 4, 8, 8, 4*8, 32*8 ) +static const gfx_layout layout_8x8x4 = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 4*1,4*0, 4*3,4*2, 4*5,4*4, 4*7,4*6 }, + { STEP8(0,4*8) }, + 4*8*8 +}; /* 8x8x8 tiles for later games */ -static GFXLAYOUT_RAW( layout_8x8x8h, 8, 8, 8, 8*8, 32*8 ) +static GFXLAYOUT_RAW( layout_8x8x8h, 8, 8, 8*8, 32*8 ) /* 16x16x4 tiles for later games */ -static GFXLAYOUT_RAW( layout_16x16x4q, 4, 16, 16, 8*8, 32*8 ) +static const gfx_layout layout_16x16x4q = +{ + 16,16, + RGN_FRAC(1,1), + 4, + { STEP4(0,1) }, + { 4*1,4*0, 4*3,4*2, 4*5,4*4, 4*7,4*6, 4*9,4*8, 4*11,4*10, 4*13,4*12, 4*15,4*14 }, + { STEP16(0,4*16) }, + 4*8*8 +}; /* 16x16x8 tiles for later games */ -static GFXLAYOUT_RAW( layout_16x16x8o, 8, 16, 16, 16*8, 32*8 ) +static GFXLAYOUT_RAW( layout_16x16x8o, 16, 16, 16*8, 32*8 ) static const gfx_layout layout_053936 = { @@ -3494,19 +3525,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(balcube_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3528,19 +3555,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(daitoa_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3562,19 +3585,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(msgogo_map) - MCFG_CPU_VBLANK_INT_HACK(msgogo_interrupt,262) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", msgogo_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3596,19 +3615,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(bangball_map) - MCFG_CPU_VBLANK_INT("screen", bangball_interrupt) + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3630,19 +3645,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(batlbubl_map) - MCFG_CPU_VBLANK_INT("screen", bangball_interrupt) + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3663,7 +3674,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_32MHz/2) MCFG_CPU_PROGRAM_MAP(daitorid_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_12MHz) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3675,12 +3686,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3706,7 +3713,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(dharma_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3718,12 +3725,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -3748,7 +3751,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(karatour_map) - MCFG_CPU_VBLANK_INT_HACK(karatour_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", karatour_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3760,12 +3763,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -3790,7 +3789,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(kokushi_map) - MCFG_CPU_VBLANK_INT_HACK(karatour_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", karatour_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3802,12 +3801,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14220) MCFG_PALETTE_LENGTH(8192) @@ -3832,7 +3827,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(lastfort_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3844,12 +3839,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(360, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 360-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART + 40, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -3873,7 +3864,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(lastforg_map) - MCFG_CPU_VBLANK_INT_HACK(karatour_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", karatour_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -3885,12 +3876,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(360, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 360-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART + 40, VTOTAL, VBEND, 224) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -3914,19 +3901,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(dokyusei_map) - MCFG_CPU_VBLANK_INT_HACK(dokyusei_interrupt,2) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", dokyusei_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 256-32) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) @@ -3958,12 +3941,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(384, 256-32) - MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, 384, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) @@ -3996,12 +3975,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) @@ -4034,12 +4009,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 240) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) @@ -4064,7 +4035,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(pangpoms_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -4076,12 +4047,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(360, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 360-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART + 40, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -4106,7 +4073,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(poitto_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -4118,12 +4085,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(360, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 360-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART + 40, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -4148,8 +4111,8 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) /* Not confirmed */ MCFG_CPU_PROGRAM_MAP(pururun_map) - //MCFG_CPU_VBLANK_INT_HACK(msgogo_interrupt,262) /* fixes the title screen scroll in GunMaster, but makes the game painfully slow */ - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ +// MCFG_TIMER_ADD_SCANLINE("scantimer", msgogo_interrupt, "screen", 0, 1) /* fixes the title screen scroll in GunMaster, but makes the game painfully slow */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) /* ? */ MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) /* Not confiremd */ MCFG_CPU_CONFIG(metro_cpu_config) @@ -4161,12 +4124,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -4192,7 +4151,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(skyalert_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -4204,12 +4163,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(360, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 360-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART + 40, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -4234,7 +4189,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/2) MCFG_CPU_PROGRAM_MAP(toride2g_map) - MCFG_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", metro_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", UPD7810, XTAL_24MHz/2) MCFG_CPU_CONFIG(metro_cpu_config) @@ -4246,12 +4201,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14100) MCFG_PALETTE_LENGTH(8192) @@ -4283,12 +4234,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 256) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) @@ -4317,7 +4264,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(blzntrnd_map) - MCFG_CPU_VBLANK_INT_HACK(karatour_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", karatour_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_16MHz/2) MCFG_CPU_PROGRAM_MAP(blzntrnd_sound_map) @@ -4328,12 +4275,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(8, 320-8-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(blzntrnd) MCFG_PALETTE_LENGTH(8192) @@ -4365,7 +4308,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(blzntrnd_map) - MCFG_CPU_VBLANK_INT_HACK(karatour_interrupt,10) /* ? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", karatour_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_16MHz/2) MCFG_CPU_PROGRAM_MAP(blzntrnd_sound_map) @@ -4376,12 +4319,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 224) - MCFG_SCREEN_VISIBLE_AREA(8, 320-8-1, 0, 224-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(gstrik2) MCFG_PALETTE_LENGTH(8192) @@ -4401,59 +4340,56 @@ MCFG_SOUND_ROUTE(2, "rspeaker", 1.0) MACHINE_CONFIG_END - -static INTERRUPT_GEN( puzzlet_interrupt ) +//1770e +static TIMER_DEVICE_CALLBACK( puzzlet_interrupt ) { - metro_state *state = device->machine().driver_data(); + metro_state *state = timer.machine().driver_data(); + int scanline = param; - switch (cpu_getiloops(device)) + if(scanline == 224) { - case 0: - state->m_requested_int[1] = 1; - update_irq_state(device->machine()); - break; - - case 1: - state->m_requested_int[3] = 1; - update_irq_state(device->machine()); - break; + state->m_requested_int[1] = 1; + update_irq_state(timer.machine()); + } - case 2: - state->m_requested_int[5] = 1; - update_irq_state(device->machine()); - break; + if(scanline == 0) + { + state->m_requested_int[2] = 1; + update_irq_state(timer.machine()); + } - case 3: - state->m_requested_int[2] = 1; - update_irq_state(device->machine()); - break; + if(scanline == 64) + { + state->m_requested_int[5] = 1; + update_irq_state(timer.machine()); + } - default: - // timer - device_set_input_line(state->m_maincpu, H8_METRO_TIMER_HACK, HOLD_LINE); - break; + if(scanline == 128) + { + state->m_requested_int[3] = 1; + update_irq_state(timer.machine()); } + + if(scanline == 0) + device_set_input_line(state->m_maincpu, H8_METRO_TIMER_HACK, HOLD_LINE); } + static MACHINE_CONFIG_START( puzzlet, metro_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", H83007, XTAL_20MHz) // H8/3007 - Hitachi HD6413007F20 CPU. Clock 20MHz MCFG_CPU_PROGRAM_MAP(puzzlet_map) MCFG_CPU_IO_MAP(puzzlet_io_map) - MCFG_CPU_VBLANK_INT_HACK(puzzlet_interrupt, 5) + MCFG_TIMER_ADD_SCANLINE("scantimer", puzzlet_interrupt, "screen", 0, 1) MCFG_MACHINE_START(metro) MCFG_MACHINE_RESET(metro) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(320, 256-32) - MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(metro) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, 224) // was 58fps? + MCFG_SCREEN_UPDATE_STATIC(metro) MCFG_GFXDECODE(14300) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/mexico86.c mame-0.145/src/mame/drivers/mexico86.c --- mame-0.144/src/mame/drivers/mexico86.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mexico86.c 2012-02-06 21:30:40.000000000 +0000 @@ -51,7 +51,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/m6805/m6805.h" #include "sound/2203intf.h" @@ -483,7 +482,7 @@ MCFG_CPU_ADD("mcu", M68705, 4000000) /* xtal is 4MHz, divided by 4 internally */ MCFG_CPU_PROGRAM_MAP(mexico86_m68705_map) - MCFG_CPU_VBLANK_INT_HACK(mexico86_m68705_interrupt,2) + MCFG_CPU_VBLANK_INT("screen",mexico86_m68705_interrupt) MCFG_CPU_ADD("sub", Z80, 8000000/2) /* 4 MHz, Uses 8Mhz OSC */ MCFG_CPU_PROGRAM_MAP(mexico86_sub_cpu_map) @@ -498,10 +497,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mexico86) + MCFG_SCREEN_UPDATE_STATIC(mexico86) MCFG_GFXDECODE(mexico86) MCFG_PALETTE_LENGTH(256) @@ -528,7 +526,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(kikikai) + MCFG_SCREEN_UPDATE_STATIC(kikikai) MACHINE_CONFIG_END @@ -543,7 +541,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(kikikai) + MCFG_SCREEN_UPDATE_STATIC(kikikai) MACHINE_CONFIG_END @@ -558,7 +556,7 @@ ROM_LOAD( "a85-17.h16", 0x00000, 0x08000, CRC(c141d5ab) SHA1(fe3622ba283e514416c43a44f83f922a958b27cd) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a85-16.h18", 0x10000, 0x10000, CRC(4094d750) SHA1(05e0ad177a3eb144b203784ecb6242a0fc5c4d4d) ) /* banked at 0x8000 */ - ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems + ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) // set as default to avoid banking problems ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a85-11.f6", 0x0000, 0x8000, CRC(cc3539db) SHA1(4239a40fdee65cba613e4b4ec54cf7899480e366) ) @@ -584,7 +582,7 @@ ROM_LOAD( "a85-17.h16", 0x00000, 0x08000, CRC(c141d5ab) SHA1(fe3622ba283e514416c43a44f83f922a958b27cd) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a85-16.h18", 0x10000, 0x10000, CRC(4094d750) SHA1(05e0ad177a3eb144b203784ecb6242a0fc5c4d4d) ) /* banked at 0x8000 */ - ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems + ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) // set as default to avoid banking problems ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a85-11.f6", 0x0000, 0x8000, CRC(cc3539db) SHA1(4239a40fdee65cba613e4b4ec54cf7899480e366) ) @@ -609,7 +607,7 @@ ROM_LOAD( "a87-08.h16", 0x00000, 0x08000, CRC(715e1b04) SHA1(60b7259758ec73f1cc945556e9c2b25766b745a8) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a87-07.h18", 0x10000, 0x10000, CRC(6cb6ebfe) SHA1(fca61fc2ad8fadc1e15b9ff84c7469b68d16e885) ) /* banked at 0x8000 */ - ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems + ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) // set as default to avoid banking problems ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) @@ -642,7 +640,7 @@ ROM_LOAD( "a87-23.h16", 0x00000, 0x08000, CRC(37182560) SHA1(8db393131f50af88b2e7489d6aae65bad0a5a65b) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "a87-22.h18", 0x10000, 0x10000, CRC(3b5a8354) SHA1(e0db4cb0657989d5a21f9a8d4e8f842adba636ad) ) /* banked at 0x8000 */ - ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems + ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) // set as default to avoid banking problems ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) @@ -675,7 +673,7 @@ ROM_LOAD( "2_g.bin", 0x00000, 0x08000, CRC(2bbfe0fb) SHA1(8f047e001ea8e49d28f73e546c82812af1c2533c) ) /* 1st half, main code */ ROM_CONTINUE( 0x20000, 0x08000 ) /* 2nd half, banked at 0x8000 */ ROM_LOAD( "1_f.bin", 0x10000, 0x10000, CRC(0b93e68e) SHA1(c6fbcce83103e3e71a7a1ef9f18a10622ed6b951) ) /* banked at 0x8000 */ - ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //AT: set as default to avoid banking problems + ROM_COPY( "maincpu", 0x10000, 0x08000, 0x04000 ) //set as default to avoid banking problems ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "a87-06.f6", 0x0000, 0x8000, CRC(1625b587) SHA1(7336384e13c114915de5e439df5731ce3fc2054a) ) diff -Nru mame-0.144/src/mame/drivers/mgolf.c mame-0.145/src/mame/drivers/mgolf.c --- mame-0.144/src/mame/drivers/mgolf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mgolf.c 2012-02-06 21:30:37.000000000 +0000 @@ -43,7 +43,7 @@ { mgolf_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -54,25 +54,25 @@ } -static SCREEN_UPDATE( mgolf ) +static SCREEN_UPDATE_IND16( mgolf ) { - mgolf_state *state = screen->machine().driver_data(); + mgolf_state *state = screen.machine().driver_data(); int i; /* draw playfield */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw sprites */ for (i = 0; i < 2; i++) { - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_video_ram[0x399 + 4 * i], i, 0, 0, state->m_video_ram[0x390 + 2 * i] - 7, state->m_video_ram[0x398 + 4 * i] - 16, 0); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_video_ram[0x39b + 4 * i], i, 0, 0, @@ -331,10 +331,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223) - MCFG_SCREEN_UPDATE(mgolf) + MCFG_SCREEN_UPDATE_STATIC(mgolf) MCFG_GFXDECODE(mgolf) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/mhavoc.c mame-0.145/src/mame/drivers/mhavoc.c --- mame-0.144/src/mame/drivers/mhavoc.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mhavoc.c 2012-02-06 21:30:36.000000000 +0000 @@ -492,7 +492,7 @@ MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 300, 0, 260) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_mhavoc) diff -Nru mame-0.144/src/mame/drivers/micro3d.c mame-0.145/src/mame/drivers/micro3d.c --- mame-0.144/src/mame/drivers/micro3d.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/micro3d.c 2012-02-06 21:30:41.000000000 +0000 @@ -293,7 +293,8 @@ "screen", /* the screen operated on */ XTAL_40MHz / 8, /* pixel clock */ 4, /* pixels per clock */ - micro3d_scanline_update, /* scanline updater */ + micro3d_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ micro3d_tms_interrupt, /* Generate interrupt */ NULL, NULL @@ -358,9 +359,8 @@ MCFG_PALETTE_LENGTH(4096) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(XTAL_40MHz/8*4, 192*4, 0, 144*4, 434, 0, 400) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(micro3d) MCFG_VIDEO_RESET(micro3d) diff -Nru mame-0.144/src/mame/drivers/micropin.c mame-0.145/src/mame/drivers/micropin.c --- mame-0.144/src/mame/drivers/micropin.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/micropin.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -5,18 +7,28 @@ { public: micropin_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( micropin_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( micropin_map, AS_PROGRAM, 8, micropin_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( micropin ) INPUT_PORTS_END -static MACHINE_RESET( micropin ) +void micropin_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(micropin_map) - - MCFG_MACHINE_RESET( micropin ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -55,6 +65,6 @@ ROM_LOAD("micro_4.bin", 0x1800, 0x0800, CRC(a804e7d6) SHA1(f414d6a5308266744645849940c00cd422e920d2)) ROM_END -GAME(1978, pentacup,0, micropin, micropin, micropin, ROT0, "Micropin", "Pentacup (rev. 1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, pentacup2,pentacup,micropin, micropin, micropin, ROT0, "Micropin", "Pentacup (rev. 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1978, pentacup, 0, micropin, micropin, micropin, ROT0, "Micropin", "Pentacup (rev. 1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, pentacup2, pentacup, micropin, micropin, micropin, ROT0, "Micropin", "Pentacup (rev. 2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/midas.c mame-0.145/src/mame/drivers/midas.c --- mame-0.144/src/mame/drivers/midas.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/midas.c 2012-02-06 21:30:37.000000000 +0000 @@ -70,7 +70,7 @@ static VIDEO_START( midas ); -static SCREEN_UPDATE( midas ); +static SCREEN_UPDATE_IND16( midas ); static TILE_GET_INFO( get_tile_info ) @@ -88,10 +88,10 @@ state->m_tmap = tilemap_create( machine, get_tile_info, tilemap_scan_cols, 8,8, 0x80,0x20 ); - tilemap_set_transparent_pen(state->m_tmap, 0); + state->m_tmap->set_transparent_pen(0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { midas_state *state = machine.driver_data(); UINT16 *s = state->m_gfxram + 0x8000; @@ -175,25 +175,25 @@ } } -static SCREEN_UPDATE( midas ) +static SCREEN_UPDATE_IND16( midas ) { - midas_state *state = screen->machine().driver_data(); + midas_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if ( screen->machine().input().code_pressed(KEYCODE_Z) ) + if ( screen.machine().input().code_pressed(KEYCODE_Z) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1 << 0; // for state->m_tmap - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 1 << 1; // for sprites + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1 << 0; // for state->m_tmap + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 1 << 1; // for sprites if (msk != 0) layers_ctrl &= msk; } #endif - bitmap_fill(bitmap,cliprect,4095); + bitmap.fill(4095, cliprect); - if (layers_ctrl & 2) draw_sprites(screen->machine(), bitmap,cliprect); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + if (layers_ctrl & 2) draw_sprites(screen.machine(), bitmap,cliprect); + if (layers_ctrl & 1) state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -232,7 +232,7 @@ state->m_gfxram[addr] = data; state->m_gfxregs[0] += state->m_gfxregs[2]; - if ( addr >= 0x7000 && addr <= 0x7fff ) tilemap_mark_tile_dirty(state->m_tmap, addr - 0x7000); + if ( addr >= 0x7000 && addr <= 0x7fff ) state->m_tmap->mark_tile_dirty(addr - 0x7000); break; } @@ -700,10 +700,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(midas) + MCFG_SCREEN_UPDATE_STATIC(midas) MCFG_GFXDECODE(midas) MCFG_PALETTE_LENGTH(0x10000) @@ -735,10 +734,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(midas) + MCFG_SCREEN_UPDATE_STATIC(midas) MCFG_GFXDECODE(midas) MCFG_PALETTE_LENGTH(0x10000) diff -Nru mame-0.144/src/mame/drivers/midqslvr.c mame-0.145/src/mame/drivers/midqslvr.c --- mame-0.144/src/mame/drivers/midqslvr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/midqslvr.c 2012-02-06 21:30:36.000000000 +0000 @@ -2,6 +2,9 @@ Midway Quicksilver skeleton driver + TODO: + - offrthnd: illegal opcode tripped just after that PIIX4 is recognized + Main CPU : Intel Celeron 333/366MHz Motherboard : Intel SE440BX-2 RAM : 64MB PC100-222-620 non-ecc @@ -18,6 +21,8 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" #include "memconv.h" @@ -31,81 +36,746 @@ #include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" - +#include "video/pc_vga.h" class midqslvr_state : public driver_device { public: midqslvr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pit8254(*this, "pit8254"), + m_dma8237_1(*this, "dma8237_1"), + m_dma8237_2(*this, "dma8237_2"), + m_pic8259_1(*this, "pic8259_1"), + m_pic8259_2(*this, "pic8259_2") + { } + + UINT32 *m_bios_ram; + UINT32 *m_bios_ext1_ram; + UINT32 *m_bios_ext2_ram; + UINT32 *m_bios_ext3_ram; + UINT32 *m_bios_ext4_ram; + UINT32 *m_isa_ram1; + UINT32 *m_isa_ram2; + int m_dma_channel; + UINT8 m_dma_offset[2][4]; + UINT8 m_at_pages[0x10]; + UINT8 m_mxtc_config_reg[256]; + UINT8 m_piix4_config_reg[4][256]; + + // devices + required_device m_maincpu; + required_device m_pit8254; + required_device m_dma8237_1; + required_device m_dma8237_2; + required_device m_pic8259_1; + required_device m_pic8259_2; + + DECLARE_READ8_MEMBER( get_slave_ack ); + + DECLARE_WRITE32_MEMBER( isa_ram1_w ); + DECLARE_WRITE32_MEMBER( isa_ram2_w ); + + DECLARE_WRITE32_MEMBER( bios_ext1_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext2_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext3_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext4_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ram_w ); }; -static VIDEO_START(midqslvr) +// Intel 82439TX System Controller (MXTC) + +static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + midqslvr_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("MXTC: read %d, %02X\n", function, reg); + + if((reg & 0xfc) == 0 && function == 0) // return vendor ID + return (0x71008086 >> (reg & 3)*8) & 0xff; + + return state->m_mxtc_config_reg[reg]; +} + +static void mxtc_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + midqslvr_state *state = busdevice->machine().driver_data(); + printf("MXTC: write %d, %02X, %02X\n", function, reg, data); + + /* + memory banking with North Bridge: + 0x59 (PAM0) xxxx ---- BIOS area 0xf0000-0xfffff + ---- xxxx Reserved + 0x5a (PAM1) xxxx ---- ISA add-on BIOS 0xc4000 - 0xc7fff + ---- xxxx ISA add-on BIOS 0xc0000 - 0xc3fff + 0x5b (PAM2) xxxx ---- ISA add-on BIOS 0xcc000 - 0xcffff + ---- xxxx ISA add-on BIOS 0xc8000 - 0xcbfff + 0x5c (PAM3) xxxx ---- ISA add-on BIOS 0xd4000 - 0xd7fff + ---- xxxx ISA add-on BIOS 0xd0000 - 0xd3fff + 0x5d (PAM4) xxxx ---- ISA add-on BIOS 0xdc000 - 0xdffff + ---- xxxx ISA add-on BIOS 0xd8000 - 0xdbfff + 0x5e (PAM5) xxxx ---- BIOS extension 0xe4000 - 0xe7fff + ---- xxxx BIOS extension 0xe0000 - 0xe3fff + 0x5f (PAM6) xxxx ---- BIOS extension 0xec000 - 0xeffff + ---- xxxx BIOS extension 0xe8000 - 0xebfff + + 3210 -> 3 = reserved, 2 = Cache Enable, 1 = Write Enable, 0 = Read Enable + */ + + switch(reg) + { + case 0x59: // PAM0 + { + if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + memory_set_bankptr(busdevice->machine(), "bios_bank", state->m_bios_ram); + else // disable RAM access (reads go to BIOS ROM) + memory_set_bankptr(busdevice->machine(), "bios_bank", busdevice->machine().region("bios")->base() + 0x70000); + break; + } + case 0x5a: // PAM1 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "video_bank1", state->m_isa_ram1); + else + memory_set_bankptr(busdevice->machine(), "video_bank1", busdevice->machine().region("video_bios")->base() + 0); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "video_bank2", state->m_isa_ram2); + else + memory_set_bankptr(busdevice->machine(), "video_bank2", busdevice->machine().region("video_bios")->base() + 0x4000); + + break; + } + case 0x5e: // PAM5 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext1", state->m_bios_ext1_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext1", busdevice->machine().region("bios")->base() + 0x60000); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext2", state->m_bios_ext2_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext2", busdevice->machine().region("bios")->base() + 0x64000); + + break; + } + case 0x5f: // PAM6 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext3", state->m_bios_ext3_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext3", busdevice->machine().region("bios")->base() + 0x68000); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext4", state->m_bios_ext4_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext4", busdevice->machine().region("bios")->base() + 0x6c000); + + break; + } + } + + state->m_mxtc_config_reg[reg] = data; +} + +static void intel82439tx_init(running_machine &machine) +{ + midqslvr_state *state = machine.driver_data(); + state->m_mxtc_config_reg[0x60] = 0x02; + state->m_mxtc_config_reg[0x61] = 0x02; + state->m_mxtc_config_reg[0x62] = 0x02; + state->m_mxtc_config_reg[0x63] = 0x02; + state->m_mxtc_config_reg[0x64] = 0x02; + state->m_mxtc_config_reg[0x65] = 0x02; +} + +static UINT32 intel82439tx_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= mxtc_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mxtc_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mxtc_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mxtc_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82439tx_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mxtc_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mxtc_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mxtc_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mxtc_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) + +static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + address_space *space = busdevice->machine().firstcpu->memory().space( AS_PROGRAM ); + midqslvr_state *state = busdevice->machine().driver_data(); + + function &= 3; + + if((reg & 0xfc) == 0) // return vendor ID + return (((0x71108086 | (function & 3) << 16) >> (reg & 3)*8) & 0xff); + + if(reg == 0xe) + { + const UINT8 header_type_val[4] = { 0x80, 0x00, 0x00, 0x00 }; + return header_type_val[function]; + } + + if((reg & 0xfc) == 0x8) + { + /* TODO: reg 8 indicates Revision ID */ + const UINT32 class_code_val[4] = { 0x06010000, 0x01018000, 0x0c030000, 0x06800000 }; + + return (((class_code_val[function]) >> (reg & 3)*8) & 0xff); + } + + printf("%08x PIIX4: read %d, %02X\n", cpu_get_pc(&space->device()), function, reg); + + return state->m_piix4_config_reg[function][reg]; +} + +static void piix4_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + midqslvr_state *state = busdevice->machine().driver_data(); + printf("PIIX4: write %d, %02X, %02X\n", function, reg, data); + + function &= 3; + + state->m_piix4_config_reg[function][reg] = data; +} + +static UINT32 intel82371ab_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82371ab_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + + +WRITE32_MEMBER(midqslvr_state::isa_ram1_w) +{ + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram1 + offset); + } +} + +WRITE32_MEMBER(midqslvr_state::isa_ram2_w) { + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram2 + offset); + } } -static SCREEN_UPDATE(midqslvr) +WRITE32_MEMBER(midqslvr_state::bios_ext1_ram_w) { - return 0; + if (m_mxtc_config_reg[0x5e] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext1_ram + offset); + } } -static ADDRESS_MAP_START(midqslvr_map, AS_PROGRAM, 32) + +WRITE32_MEMBER(midqslvr_state::bios_ext2_ram_w) +{ + if (m_mxtc_config_reg[0x5e] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext2_ram + offset); + } +} + + +WRITE32_MEMBER(midqslvr_state::bios_ext3_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext3_ram + offset); + } +} + + +WRITE32_MEMBER(midqslvr_state::bios_ext4_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext4_ram + offset); + } +} + + +WRITE32_MEMBER(midqslvr_state::bios_ram_w) +{ + if (m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram + offset); + } +} + +static READ32_DEVICE_HANDLER( ide_r ) +{ + return ide_controller32_r(device, 0x1f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( ide_w ) +{ + ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); +} + +static READ32_DEVICE_HANDLER( fdc_r ) +{ + return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( fdc_w ) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); +} + +static READ8_HANDLER(at_page8_r) +{ + midqslvr_state *state = space->machine().driver_data(); + UINT8 data = state->m_at_pages[offset % 0x10]; + + switch(offset % 8) { + case 1: + data = state->m_dma_offset[(offset / 8) & 1][2]; + break; + case 2: + data = state->m_dma_offset[(offset / 8) & 1][3]; + break; + case 3: + data = state->m_dma_offset[(offset / 8) & 1][1]; + break; + case 7: + data = state->m_dma_offset[(offset / 8) & 1][0]; + break; + } + return data; +} + + +static WRITE8_HANDLER(at_page8_w) +{ + midqslvr_state *state = space->machine().driver_data(); + state->m_at_pages[offset % 0x10] = data; + + switch(offset % 8) { + case 1: + state->m_dma_offset[(offset / 8) & 1][2] = data; + break; + case 2: + state->m_dma_offset[(offset / 8) & 1][3] = data; + break; + case 3: + state->m_dma_offset[(offset / 8) & 1][1] = data; + break; + case 7: + state->m_dma_offset[(offset / 8) & 1][0] = data; + break; + } +} + +static READ32_HANDLER(at_page32_r) +{ + return read32le_with_read8_handler(at_page8_r, space, offset, mem_mask); +} + + +static WRITE32_HANDLER(at_page32_w) +{ + write32le_with_write8_handler(at_page8_w, space, offset, data, mem_mask); +} + +static READ8_DEVICE_HANDLER(at_dma8237_2_r) +{ + return i8237_r(device, offset / 2); +} + +static WRITE8_DEVICE_HANDLER(at_dma8237_2_w) +{ + i8237_w(device, offset / 2, data); +} + +static READ32_DEVICE_HANDLER(at32_dma8237_2_r) +{ + return read32le_with_read8_device_handler(at_dma8237_2_r, device, offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER(at32_dma8237_2_w) +{ + write32le_with_write8_device_handler(at_dma8237_2_w, device, offset, data, mem_mask); +} + + + + +static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed ) +{ + cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + /* Assert HLDA */ + i8237_hlda_w( device, state ); +} + + +static READ8_HANDLER( pc_dma_read_byte ) +{ + midqslvr_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + return space->read_byte(page_offset + offset); +} + + +static WRITE8_HANDLER( pc_dma_write_byte ) +{ + midqslvr_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + space->write_byte(page_offset + offset, data); +} + +static void set_dma_channel(device_t *device, int channel, int state) +{ + midqslvr_state *drvstate = device->machine().driver_data(); + if (!state) drvstate->m_dma_channel = channel; +} + +static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); } + +static I8237_INTERFACE( dma8237_1_config ) +{ + DEVCB_LINE(pc_dma_hrq_changed), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte), + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte), + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) } +}; + +static I8237_INTERFACE( dma8237_2_config ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } +}; + + +static ADDRESS_MAP_START(midqslvr_map, AS_PROGRAM, 32, midqslvr_state) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0xfff80000, 0xffffffff) AM_ROM AM_REGION("user1", 0) /* System BIOS */ + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM + AM_RANGE(0x000c0000, 0x000c3fff) AM_ROMBANK("video_bank1") AM_WRITE(isa_ram1_w) + AM_RANGE(0x000c4000, 0x000c7fff) AM_ROMBANK("video_bank2") AM_WRITE(isa_ram2_w) + AM_RANGE(0x000e0000, 0x000e3fff) AM_ROMBANK("bios_ext1") AM_WRITE(bios_ext1_ram_w) + AM_RANGE(0x000e4000, 0x000e7fff) AM_ROMBANK("bios_ext2") AM_WRITE(bios_ext2_ram_w) + AM_RANGE(0x000e8000, 0x000ebfff) AM_ROMBANK("bios_ext3") AM_WRITE(bios_ext3_ram_w) + AM_RANGE(0x000ec000, 0x000effff) AM_ROMBANK("bios_ext4") AM_WRITE(bios_ext4_ram_w) + AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bios_bank") AM_WRITE(bios_ram_w) + AM_RANGE(0x00100000, 0x01ffffff) AM_RAM + AM_RANGE(0xfff80000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END -static ADDRESS_MAP_START(midqslvr_io, AS_IO, 32) +static ADDRESS_MAP_START(midqslvr_io, AS_IO, 32, midqslvr_state) + AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, 0xffffffff) + AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8_LEGACY("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) + AM_RANGE(0x0060, 0x006f) AM_READWRITE_LEGACY(kbdc8042_32le_r, kbdc8042_32le_w) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ + AM_RANGE(0x0080, 0x009f) AM_READWRITE_LEGACY(at_page32_r, at_page32_w) + AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE_LEGACY("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) + AM_RANGE(0x00e8, 0x00ef) AM_NOP + + AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE_LEGACY("ide", ide_r, ide_w) + AM_RANGE(0x03f0, 0x03f7) AM_DEVREADWRITE_LEGACY("ide", fdc_r, fdc_w) + + AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE_LEGACY("pcibus", pci_32le_r, pci_32le_w) ADDRESS_MAP_END -static INPUT_PORTS_START( midqslvr ) -INPUT_PORTS_END +static const struct pit8253_config midqslvr_pit8254_config = +{ + { + { + 4772720/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +static WRITE_LINE_DEVICE_HANDLER( midqslvr_pic8259_1_set_int_line ) +{ + midqslvr_state *drvstate = device->machine().driver_data(); + device_set_input_line(drvstate->m_maincpu, 0, state ? HOLD_LINE : CLEAR_LINE); +} + +READ8_MEMBER( midqslvr_state::get_slave_ack ) +{ + if (offset==2) { // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface midqslvr_pic8259_1_config = +{ + DEVCB_LINE(midqslvr_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_MEMBER(midqslvr_state,get_slave_ack) +}; + +static const struct pic8259_interface midqslvr_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + +static void set_gate_a20(running_machine &machine, int a20) +{ + midqslvr_state *state = machine.driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + midqslvr_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static int midqslvr_get_out2(running_machine &machine) +{ + midqslvr_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2 ); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, midqslvr_get_out2 +}; + +static void midqslvr_set_keyb_int(running_machine &machine, int state) +{ + midqslvr_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static IRQ_CALLBACK(irq_callback) +{ + midqslvr_state *state = device->machine().driver_data(); + return pic8259_acknowledge( state->m_pic8259_1); +} + +static void ide_interrupt(device_t *device, int state) +{ + midqslvr_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} + +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color + +static MACHINE_START( midqslvr ) +{ + midqslvr_state *state = machine.driver_data(); + + state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x10000/4); + state->m_bios_ext1_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext2_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext3_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext4_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram1 = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram2 = auto_alloc_array(machine, UINT32, 0x4000/4); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, midqslvr_set_keyb_int); + + device_set_irq_callback(state->m_maincpu, irq_callback); + intel82439tx_init(machine); + + kbdc8042_init(machine, &at8042); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} + +static MACHINE_RESET( midqslvr ) +{ + memory_set_bankptr(machine, "bios_bank", machine.region("bios")->base() + 0x70000); + memory_set_bankptr(machine, "bios_ext1", machine.region("bios")->base() + 0x60000); + memory_set_bankptr(machine, "bios_ext2", machine.region("bios")->base() + 0x64000); + memory_set_bankptr(machine, "bios_ext3", machine.region("bios")->base() + 0x68000); + memory_set_bankptr(machine, "bios_ext4", machine.region("bios")->base() + 0x6c000); + memory_set_bankptr(machine, "video_bank1", machine.region("video_bios")->base() + 0); + memory_set_bankptr(machine, "video_bank2", machine.region("video_bios")->base() + 0x4000); +} + static MACHINE_CONFIG_START( midqslvr, midqslvr_state ) MCFG_CPU_ADD("maincpu", PENTIUM, 333000000) // actually Celeron 333 MCFG_CPU_PROGRAM_MAP(midqslvr_map) MCFG_CPU_IO_MAP(midqslvr_io) - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(midqslvr) - MCFG_PALETTE_LENGTH(16) + MCFG_MACHINE_START(midqslvr) + MCFG_MACHINE_RESET(midqslvr) - MCFG_VIDEO_START(midqslvr) + MCFG_PIT8254_ADD( "pit8254", midqslvr_pit8254_config ) + MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) + MCFG_PIC8259_ADD( "pic8259_1", midqslvr_pic8259_1_config ) + MCFG_PIC8259_ADD( "pic8259_2", midqslvr_pic8259_2_config ) + + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + + MCFG_PCI_BUS_ADD("pcibus", 0) + MCFG_PCI_BUS_DEVICE( 0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) + MCFG_PCI_BUS_DEVICE(31, NULL, intel82371ab_pci_r, intel82371ab_pci_w) + + MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END + ROM_START( offrthnd ) - ROM_REGION32_LE(0x80000, "user1", 0) + ROM_REGION32_LE(0x80000, "bios", 0) ROM_LOAD( "lh28f004sct.u8b1", 0x000000, 0x080000, CRC(ab04a343) SHA1(ba77933400fe470f45ab187bc0d315922caadb12) ) + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) + DISK_REGION( "disk" ) DISK_IMAGE( "offrthnd", 0, SHA1(d88f1c5b75361a1e310565a8a5a09c674a4a1a22) ) ROM_END ROM_START( hydrthnd ) - ROM_REGION32_LE(0x80000, "user1", 0) + ROM_REGION32_LE(0x80000, "bios", 0) ROM_LOAD( "lh28f004sct.u8b1", 0x000000, 0x080000, CRC(ab04a343) SHA1(ba77933400fe470f45ab187bc0d315922caadb12) ) + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) + DISK_REGION( "disk" ) DISK_IMAGE( "hydro", 0, SHA1(d481d178782943c066b41764628a419cd55f676d) ) ROM_END ROM_START( arctthnd ) - ROM_REGION32_LE(0x80000, "user1", 0) - ROM_LOAD( "m29f002bt.u6", 0x000000, 0x040000, CRC(012c9290) SHA1(cdee6f19d5e5ea5bb1dd6a5ec397ac70b3452790) ) + ROM_REGION32_LE(0x80000, "bios", ROMREGION_ERASEFF) + ROM_LOAD( "m29f002bt.u6", 0x040000, 0x040000, CRC(012c9290) SHA1(cdee6f19d5e5ea5bb1dd6a5ec397ac70b3452790) ) + + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) DISK_REGION( "disk" ) DISK_IMAGE( "arctthnd", 0, SHA1(f4373e57c3f453ac09c735b5d8d99ff811416a23) ) ROM_END +// this also required a dongle to work +ROM_START( arctthndult ) + ROM_REGION32_LE(0x80000, "bios", ROMREGION_ERASEFF) + ROM_LOAD( "m29f002bt.u6", 0x040000, 0x040000, CRC(012c9290) SHA1(cdee6f19d5e5ea5bb1dd6a5ec397ac70b3452790) ) + + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) + + DISK_REGION( "disk" ) + DISK_IMAGE( "uarctict", 0, SHA1(8557a1d7ae8dc41c879350cb1c228f4c27a0dd09) ) +ROM_END + + // there are almost certainly multiple versions of these; updates were offered on floppy disk. The version numbers for the existing CHDs are unknown. -GAME(1999, hydrthnd, 0, midqslvr, midqslvr, 0, ROT0, "Midway Games", "Hydro Thunder", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2000, offrthnd, 0, midqslvr, midqslvr, 0, ROT0, "Midway Games", "Offroad Thunder", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2001, arctthnd, 0, midqslvr, midqslvr, 0, ROT0, "Midway Games", "Arctic Thunder (v1.002)", GAME_NO_SOUND|GAME_NOT_WORKING) +GAME(1999, hydrthnd, 0, midqslvr, at_keyboard, 0, ROT0, "Midway Games", "Hydro Thunder", GAME_IS_SKELETON) +GAME(2000, offrthnd, 0, midqslvr, at_keyboard, 0, ROT0, "Midway Games", "Offroad Thunder", GAME_IS_SKELETON) +GAME(2001, arctthnd, 0, midqslvr, at_keyboard, 0, ROT0, "Midway Games", "Arctic Thunder (v1.002)", GAME_IS_SKELETON) +GAME(2001, arctthndult, arctthnd, midqslvr, at_keyboard, 0, ROT0, "Midway Games", "Ultimate Arctic Thunder", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/midtunit.c mame-0.145/src/mame/drivers/midtunit.c --- mame-0.144/src/mame/drivers/midtunit.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/midtunit.c 2012-02-06 21:30:40.000000000 +0000 @@ -587,7 +587,8 @@ "screen", /* the screen operated on */ PIXEL_CLOCK, /* pixel clock */ 2, /* pixels per clock */ - midtunit_scanline_update, /* scanline updater */ + midtunit_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ midtunit_to_shiftreg, /* write to shiftreg function */ midtunit_from_shiftreg /* read from shiftreg function */ @@ -615,9 +616,8 @@ MCFG_PALETTE_LENGTH(32768) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK * 2, 505, 0, 399, 289, 0, 253) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(midtunit) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/midvunit.c mame-0.145/src/mame/drivers/midvunit.c --- mame-0.144/src/mame/drivers/midvunit.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/midvunit.c 2012-02-06 21:30:33.000000000 +0000 @@ -1033,8 +1033,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MIDVUNIT_VIDEO_CLOCK/2, 666, 0, 512, 432, 0, 400) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(midvunit) + MCFG_SCREEN_UPDATE_STATIC(midvunit) MCFG_VIDEO_START(midvunit) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/midwunit.c mame-0.145/src/mame/drivers/midwunit.c --- mame-0.144/src/mame/drivers/midwunit.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/midwunit.c 2012-02-06 21:30:35.000000000 +0000 @@ -619,7 +619,8 @@ "screen", /* the screen operated on */ PIXEL_CLOCK, /* pixel clock */ 1, /* pixels per clock */ - midtunit_scanline_update, /* scanline updater */ + midtunit_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ midtunit_to_shiftreg, /* write to shiftreg function */ midtunit_from_shiftreg /* read from shiftreg function */ @@ -646,9 +647,8 @@ MCFG_PALETTE_LENGTH(32768) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 505, 0, 399, 289, 0, 253) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(midwunit) diff -Nru mame-0.144/src/mame/drivers/midxunit.c mame-0.145/src/mame/drivers/midxunit.c --- mame-0.144/src/mame/drivers/midxunit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/midxunit.c 2012-02-06 21:30:36.000000000 +0000 @@ -243,7 +243,8 @@ "screen", /* the screen operated on */ PIXEL_CLOCK, /* pixel clock */ 1, /* pixels per clock */ - midxunit_scanline_update, /* scanline updater */ + midxunit_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ midtunit_to_shiftreg, /* write to shiftreg function */ midtunit_from_shiftreg /* read from shiftreg function */ @@ -271,9 +272,8 @@ MCFG_PALETTE_LENGTH(32768) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 505, 0, 399, 289, 0, 253) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(midxunit) /* sound hardware */ diff -Nru mame-0.144/src/mame/drivers/midyunit.c mame-0.145/src/mame/drivers/midyunit.c --- mame-0.144/src/mame/drivers/midyunit.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/midyunit.c 2012-02-06 21:30:38.000000000 +0000 @@ -969,7 +969,8 @@ "screen", /* the screen operated on */ MEDRES_PIXEL_CLOCK, /* pixel clock */ 2, /* pixels per clock */ - midyunit_scanline_update, /* scanline updater */ + midyunit_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ midyunit_to_shiftreg, /* write to shiftreg function */ midyunit_from_shiftreg /* read from shiftreg function */ @@ -981,7 +982,8 @@ "screen", /* the screen operated on */ STDRES_PIXEL_CLOCK, /* pixel clock */ 2, /* pixels per clock */ - midyunit_scanline_update, /* scanline updater */ + midyunit_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ NULL, /* generate interrupt */ midyunit_to_shiftreg, /* write to shiftreg function */ midyunit_from_shiftreg /* read from shiftreg function */ @@ -1010,9 +1012,8 @@ MCFG_PALETTE_LENGTH(8192) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MEDRES_PIXEL_CLOCK*2, 673, 0, 511, 433, 0, 399) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MCFG_VIDEO_START(midzunit) @@ -1043,9 +1044,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(STDRES_PIXEL_CLOCK*2, 505, 0, 399, 289, 0, 253) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/midzeus.c mame-0.145/src/mame/drivers/midzeus.c --- mame-0.144/src/mame/drivers/midzeus.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/midzeus.c 2012-02-06 21:30:34.000000000 +0000 @@ -531,8 +531,8 @@ { "GUNX1", "GUNY1" }, { "GUNX2", "GUNY2" } }; - gun_x[player] = input_port_read(space->machine(), names[player][0]) * (visarea.max_x + 1 - visarea.min_x) / 255 + visarea.min_x + BEAM_XOFFS; - gun_y[player] = input_port_read(space->machine(), names[player][1]) * (visarea.max_y + 1 - visarea.min_y) / 255 + visarea.min_y; + gun_x[player] = input_port_read(space->machine(), names[player][0]) * visarea.width() / 255 + visarea.min_x + BEAM_XOFFS; + gun_y[player] = input_port_read(space->machine(), names[player][1]) * visarea.height() / 255 + visarea.min_y; gun_timer[player]->adjust(space->machine().primary_screen->time_until_pos(MAX(0, gun_y[player] - BEAM_DY), MAX(0, gun_x[player] - BEAM_DX)), player); } } @@ -1105,8 +1105,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/8, 529, 0, 400, 278, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(midzeus) + MCFG_SCREEN_UPDATE_STATIC(midzeus) MCFG_VIDEO_START(midzeus) @@ -1144,8 +1143,7 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/4, 666, 0, 512, 438, 0, 400) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(midzeus2) + MCFG_SCREEN_UPDATE_STATIC(midzeus2) MCFG_VIDEO_START(midzeus2) diff -Nru mame-0.144/src/mame/drivers/mikie.c mame-0.145/src/mame/drivers/mikie.c --- mame-0.144/src/mame/drivers/mikie.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mikie.c 2012-02-06 21:30:37.000000000 +0000 @@ -83,6 +83,13 @@ coin_counter_w(space->machine(), offset, data); } +static WRITE8_HANDLER( irq_mask_w ) +{ + mikie_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} + /************************************* * * Address maps @@ -94,7 +101,7 @@ AM_RANGE(0x2000, 0x2001) AM_WRITE(mikie_coin_counter_w) AM_RANGE(0x2002, 0x2002) AM_WRITE(mikie_sh_irqtrigger_w) AM_RANGE(0x2006, 0x2006) AM_WRITE(mikie_flipscreen_w) - AM_RANGE(0x2007, 0x2007) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x2007, 0x2007) AM_WRITE(irq_mask_w) AM_RANGE(0x2100, 0x2100) AM_WRITE(watchdog_reset_w) AM_RANGE(0x2200, 0x2200) AM_WRITE(mikie_palettebank_w) AM_RANGE(0x2300, 0x2300) AM_WRITENOP // ??? @@ -143,32 +150,33 @@ KONAMI8_COCKTAIL_4WAY_B12_UNK PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20k 70k 50k+" ) PORT_DIPSETTING( 0x10, "30K 90k 60k+" ) PORT_DIPSETTING( 0x08, "30k only" ) PORT_DIPSETTING( 0x00, "40K only" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) /* 1 */ PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) /* 2 */ PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) /* 3 */ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) /* 4 */ - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* DSW3 is not mounted on PCB nor listed in manual */ PORT_START("DSW3") PORT_DIPNAME( 0x01, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) @@ -244,12 +252,20 @@ state->m_last_irq = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + mikie_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( mikie, mikie_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, OSC/12) MCFG_CPU_PROGRAM_MAP(mikie_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, CLK) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -261,10 +277,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mikie) + MCFG_SCREEN_UPDATE_STATIC(mikie) MCFG_GFXDECODE(mikie) MCFG_PALETTE_LENGTH(16*8*16+16*8*16) diff -Nru mame-0.144/src/mame/drivers/mil4000.c mame-0.145/src/mame/drivers/mil4000.c --- mame-0.144/src/mame/drivers/mil4000.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mil4000.c 2012-02-06 21:30:36.000000000 +0000 @@ -174,18 +174,18 @@ state->m_sc2_tilemap = tilemap_create(machine, get_sc2_tile_info,tilemap_scan_rows,8,8,64,64); state->m_sc3_tilemap = tilemap_create(machine, get_sc3_tile_info,tilemap_scan_rows,8,8,64,64); - tilemap_set_transparent_pen(state->m_sc1_tilemap,0); - tilemap_set_transparent_pen(state->m_sc2_tilemap,0); - tilemap_set_transparent_pen(state->m_sc3_tilemap,0); + state->m_sc1_tilemap->set_transparent_pen(0); + state->m_sc2_tilemap->set_transparent_pen(0); + state->m_sc3_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE(mil4000) +static SCREEN_UPDATE_IND16(mil4000) { - mil4000_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_sc1_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_sc2_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_sc3_tilemap,0,0); + mil4000_state *state = screen.machine().driver_data(); + state->m_sc0_tilemap->draw(bitmap, cliprect, 0,0); + state->m_sc1_tilemap->draw(bitmap, cliprect, 0,0); + state->m_sc2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_sc3_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -216,28 +216,28 @@ { mil4000_state *state = space->machine().driver_data(); state->m_sc0_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset/2); + state->m_sc0_tilemap->mark_tile_dirty(offset/2); } static WRITE16_HANDLER( sc1_vram_w ) { mil4000_state *state = space->machine().driver_data(); state->m_sc1_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc1_tilemap,offset/2); + state->m_sc1_tilemap->mark_tile_dirty(offset/2); } static WRITE16_HANDLER( sc2_vram_w ) { mil4000_state *state = space->machine().driver_data(); state->m_sc2_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc2_tilemap,offset/2); + state->m_sc2_tilemap->mark_tile_dirty(offset/2); } static WRITE16_HANDLER( sc3_vram_w ) { mil4000_state *state = space->machine().driver_data(); state->m_sc3_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc3_tilemap,offset/2); + state->m_sc3_tilemap->mark_tile_dirty(offset/2); } /*end of video stuff*/ @@ -374,10 +374,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 240-1) - MCFG_SCREEN_UPDATE(mil4000) + MCFG_SCREEN_UPDATE_STATIC(mil4000) MCFG_PALETTE_LENGTH(0x800) MCFG_PALETTE_INIT(all_black) diff -Nru mame-0.144/src/mame/drivers/miniboy7.c mame-0.145/src/mame/drivers/miniboy7.c --- mame-0.144/src/mame/drivers/miniboy7.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/miniboy7.c 2012-02-06 21:30:41.000000000 +0000 @@ -172,14 +172,14 @@ { miniboy7_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( miniboy7_colorram_w ) { miniboy7_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -208,10 +208,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 37, 37); } -static SCREEN_UPDATE( miniboy7 ) +static SCREEN_UPDATE_IND16( miniboy7 ) { - miniboy7_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + miniboy7_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -456,10 +456,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((47+1)*8, (39+1)*8) /* Taken from MC6845, registers 00 & 04. Normally programmed with (value-1) */ MCFG_SCREEN_VISIBLE_AREA(0*8, 37*8-1, 0*8, 37*8-1) /* Taken from MC6845, registers 01 & 06 */ - MCFG_SCREEN_UPDATE(miniboy7) + MCFG_SCREEN_UPDATE_STATIC(miniboy7) MCFG_GFXDECODE(miniboy7) diff -Nru mame-0.144/src/mame/drivers/minivadr.c mame-0.145/src/mame/drivers/minivadr.c --- mame-0.144/src/mame/drivers/minivadr.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/minivadr.c 2012-02-06 21:30:34.000000000 +0000 @@ -31,9 +31,9 @@ * *************************************/ -static SCREEN_UPDATE( minivadr ) +static SCREEN_UPDATE_RGB32( minivadr ) { - minivadr_state *state = screen->machine().driver_data(); + minivadr_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -47,7 +47,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data << 1; x = x + 1; @@ -89,10 +89,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(minivadr) + MCFG_SCREEN_UPDATE_STATIC(minivadr) /* the board has no sound hardware */ MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/mirage.c mame-0.145/src/mame/drivers/mirage.c --- mame-0.144/src/mame/drivers/mirage.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mirage.c 2012-02-06 21:30:39.000000000 +0000 @@ -69,34 +69,38 @@ static VIDEO_START( mirage ) { - machine.device("spritegen")->alloc_sprite_bitmap(machine); + machine.device("spritegen")->alloc_sprite_bitmap(); } -static SCREEN_UPDATE( mirage ) +static SCREEN_UPDATE_RGB32( mirage ) { - mirage_state *state = screen->machine().driver_data(); + mirage_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 256); /* not verified */ + bitmap.fill(256, cliprect); /* not verified */ deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0800, 0x0800, 0x200, 0x1ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x200, 0x1ff); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0800, 0x200, 0x1ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x200, 0x1ff); return 0; } -static SCREEN_EOF( mirage ) +static SCREEN_VBLANK( mirage ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space,0,0,0xffff); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram16_w(space,0,0,0xffff); + } } @@ -330,11 +334,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mirage) - MCFG_SCREEN_EOF(mirage) + MCFG_SCREEN_UPDATE_STATIC(mirage) + MCFG_SCREEN_VBLANK_STATIC(mirage) MCFG_VIDEO_START(mirage) diff -Nru mame-0.144/src/mame/drivers/mirax.c mame-0.145/src/mame/drivers/mirax.c --- mame-0.144/src/mame/drivers/mirax.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/mirax.c 2012-02-06 21:30:37.000000000 +0000 @@ -8,7 +8,7 @@ Olivier Galibert TODO: -- sound is hacky at the moment, so it can't be 100% trusted +- sound ports are a mystery (PC=0x02e0) - sprite offsets? - score / credits display should stay above the sprites? @@ -64,8 +64,6 @@ 22 +12 +12 -The End - ************************************************ */ @@ -82,7 +80,6 @@ UINT8 *m_spriteram; UINT8 m_nAyCtrl; - UINT8 m_nAyData; UINT8 m_nmi_mask; UINT8 *m_videoram; UINT8 *m_colorram; @@ -93,7 +90,7 @@ { } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { mirax_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -121,10 +118,10 @@ } } -static SCREEN_UPDATE(mirax) +static SCREEN_UPDATE_IND16(mirax) { - mirax_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + mirax_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x00000; int y,x; @@ -145,7 +142,7 @@ } } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); count = 0x00000; @@ -178,26 +175,22 @@ { mirax_state *state = machine.driver_data(); state->m_nAyCtrl = 0x00; - state->m_nAyData = 0x00; } static WRITE8_HANDLER(audio_w) { mirax_state *state = space->machine().driver_data(); - if(cpu_get_previouspc(&space->device())==0x2fd) - { - state->m_nAyCtrl=offset; - state->m_nAyData=data; - } + + state->m_nAyCtrl=offset; } static WRITE8_DEVICE_HANDLER(ay_sel) { mirax_state *state = device->machine().driver_data(); - if(cpu_get_previouspc(device->machine().device("audiocpu"))==0x309) + { ay8910_address_w(device,0,state->m_nAyCtrl); - ay8910_data_w(device,0,state->m_nAyData); + ay8910_data_w(device,0,data); } } @@ -220,6 +213,13 @@ cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_NMI, PULSE_LINE); } +/* might be coin counter instead */ +static WRITE8_HANDLER( coin_lockout_w ) +{ + coin_lockout_w(space->machine(), 0,data & 1); + coin_lockout_w(space->machine(), 1,data & 1); +} + static ADDRESS_MAP_START( mirax_main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc800, 0xd7ff) AM_RAM @@ -231,7 +231,7 @@ AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW1") AM_RANGE(0xf300, 0xf300) AM_READ(unk_r) //watchdog? value is always read then discarded AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW2") -// AM_RANGE(0xf500, 0xf500) //coin counter + AM_RANGE(0xf500, 0xf500) AM_WRITE(coin_lockout_w) AM_RANGE(0xf501, 0xf501) AM_WRITE(nmi_mask_w) // AM_RANGE(0xf506, 0xf506) // AM_RANGE(0xf507, 0xf507) @@ -244,13 +244,13 @@ AM_RANGE(0x8000, 0x8fff) AM_RAM AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r) - AM_RANGE(0xe000, 0xe000) AM_DEVWRITE("ay1", ay_sel) //1st ay ? + AM_RANGE(0xe000, 0xe000) AM_WRITENOP AM_RANGE(0xe001, 0xe001) AM_WRITENOP - AM_RANGE(0xe003, 0xe003) AM_WRITENOP + AM_RANGE(0xe003, 0xe003) AM_DEVWRITE("ay1", ay_sel) //1st ay ? - AM_RANGE(0xe400, 0xe400) AM_DEVWRITE("ay2", ay_sel) //2nd ay ? + AM_RANGE(0xe400, 0xe400) AM_WRITENOP AM_RANGE(0xe401, 0xe401) AM_WRITENOP - AM_RANGE(0xe403, 0xe403) AM_WRITENOP + AM_RANGE(0xe403, 0xe403) AM_DEVWRITE("ay2", ay_sel) //2nd ay ? AM_RANGE(0xf900, 0xf9ff) AM_WRITE(audio_w) ADDRESS_MAP_END @@ -406,10 +406,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mirax) + MCFG_SCREEN_UPDATE_STATIC(mirax) MCFG_PALETTE_LENGTH(0x40) MCFG_PALETTE_INIT(mirax) @@ -503,5 +502,5 @@ } -GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax", GAME_IMPERFECT_SOUND ) -GAME( 1985, miraxa, mirax, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax (set 2)", GAME_IMPERFECT_SOUND ) +GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax", 0 ) +GAME( 1985, miraxa, mirax, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax (set 2)", 0 ) diff -Nru mame-0.144/src/mame/drivers/missb2.c mame-0.145/src/mame/drivers/missb2.c --- mame-0.144/src/mame/drivers/missb2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/missb2.c 2012-02-06 21:30:39.000000000 +0000 @@ -35,9 +35,9 @@ /* Video Hardware */ -static SCREEN_UPDATE( missb2 ) +static SCREEN_UPDATE_IND16( missb2 ) { - missb2_state *state = screen->machine().driver_data(); + missb2_state *state = screen.machine().driver_data(); int offs; int sx, sy, xc, yc; int gfx_num, gfx_attr, gfx_offs; @@ -49,7 +49,7 @@ /* and sprites) are stored in the same memory region, and information on */ /* the background character columns is stored in the area dd00-dd3f */ - bitmap_fill(bitmap, cliprect, 255); + bitmap.fill(255, cliprect); if (!state->m_video_enable) return 0; @@ -58,7 +58,7 @@ //popmessage("%02x",(*state->m_bgvram) & 0x1f); for (bg_offs = ((*state->m_bgvram) << 4); bg_offs < (((*state->m_bgvram) << 4) | 0xf); bg_offs++) { - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[1], bg_offs, 1, 0,0, @@ -68,7 +68,7 @@ sx = 0; - prom = screen->machine().region("proms")->base(); + prom = screen.machine().region("proms")->base(); for (offs = 0; offs < state->m_objectram_size; offs += 4) { /* skip empty sprites */ @@ -110,7 +110,7 @@ x = sx + xc * 8; y = (sy + yc * 8) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { x = 248 - x; y = 248 - y; @@ -118,7 +118,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, 0, flipx,flipy, @@ -476,10 +476,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(missb2) + MCFG_SCREEN_UPDATE_STATIC(missb2) MCFG_GFXDECODE(missb2) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/missile.c mame-0.145/src/mame/drivers/missile.c --- mame-0.144/src/mame/drivers/missile.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/missile.c 2012-02-06 21:30:35.000000000 +0000 @@ -664,16 +664,16 @@ * *************************************/ -static SCREEN_UPDATE( missile ) +static SCREEN_UPDATE_IND16( missile ) { - missile_state *state = screen->machine().driver_data(); + missile_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int x, y; /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *dst = &bitmap.pix16(y); int effy = state->m_flipscreen ? ((256+24 - y) & 0xff) : y; UINT8 *src = &videoram[effy * 64]; @@ -684,7 +684,7 @@ src3 = &videoram[get_bit3_addr(effy << 8)]; /* loop over X */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 pix = src[x / 4] >> (x & 3); pix = ((pix >> 2) & 4) | ((pix << 1) & 2); @@ -1038,9 +1038,8 @@ MCFG_PALETTE_LENGTH(8) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(missile) + MCFG_SCREEN_UPDATE_STATIC(missile) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/mitchell.c mame-0.145/src/mame/drivers/mitchell.c --- mame-0.144/src/mame/drivers/mitchell.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mitchell.c 2012-02-06 21:30:40.000000000 +0000 @@ -68,7 +68,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "includes/cps1.h" // needed for decoding functions only #include "includes/mitchell.h" @@ -113,7 +112,7 @@ static READ8_HANDLER( pang_port5_r ) { - int bit = space->machine().device("eeprom")->read_bit() << 7; + mitchell_state *state = space->machine().driver_data(); /* bits 0 and (sometimes) 3 are checked in the interrupt handler. bit 3 is checked before updating the palette so it really seems to be vblank. @@ -121,10 +120,8 @@ Many games require two interrupts per frame and for these bits to toggle, otherwise music doesn't work. */ - if (cpu_getiloops(&space->device()) & 1) - bit |= 0x01; - return (input_port_read(space->machine(), "SYS0") & 0x7e) | bit; + return (input_port_read(space->machine(), "SYS0") & 0xfe) | (state->m_irq_source & 1); } static WRITE8_DEVICE_HANDLER( eeprom_cs_w ) @@ -357,7 +354,7 @@ AM_RANGE(0x02, 0x02) AM_WRITE(pang_bankswitch_w) /* Code bank register */ AM_RANGE(0x03, 0x03) AM_DEVWRITE("ymsnd", ym2413_data_port_w) AM_RANGE(0x04, 0x04) AM_DEVWRITE("ymsnd", ym2413_register_port_w) - AM_RANGE(0x05, 0x05) AM_READ(pang_port5_r) + AM_RANGE(0x05, 0x05) AM_READ_PORT("SYS0") AM_RANGE(0x06, 0x06) AM_WRITENOP /* watchdog? irq ack? */ AM_RANGE(0x07, 0x07) AM_WRITE(pang_video_bank_w) /* Video RAM bank register */ AM_RANGE(0x08, 0x08) AM_DEVWRITE("eeprom", eeprom_cs_w) @@ -434,7 +431,7 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -684,7 +681,7 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -720,6 +717,9 @@ static INPUT_PORTS_START( spangbl ) PORT_INCLUDE( pang ) + PORT_MODIFY("SYS0") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ + PORT_MODIFY("IN1") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be high for game to boot.. INPUT_PORTS_END @@ -727,12 +727,12 @@ static INPUT_PORTS_START( mstworld ) /* this port may not have the same role */ PORT_START("SYS0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* USED - handled in port5_r */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM (spang) */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -848,7 +848,7 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) /* same as the service mode farther down */ @@ -888,7 +888,7 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -930,7 +930,7 @@ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* unused? */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* data from EEPROM */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_device, read_bit) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1087,6 +1087,7 @@ state->save_item(NAME(state->m_keymatrix)); state->save_item(NAME(state->m_dir)); state->save_item(NAME(state->m_dial)); + state->save_item(NAME(state->m_irq_source)); // state_save_register_global(machine, init_eeprom_count); } @@ -1104,13 +1105,26 @@ state->m_keymatrix = 0; } +static TIMER_DEVICE_CALLBACK( mitchell_irq ) +{ + mitchell_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 240 || scanline == 0) + { + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + + state->m_irq_source = (scanline == 0); + } +} + static MACHINE_CONFIG_START( mgakuen, mitchell_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* probably same clock as the other mitchell hardware games */ MCFG_CPU_PROGRAM_MAP(mgakuen_map) MCFG_CPU_IO_MAP(mitchell_io_map) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) /* ??? one extra irq seems to be needed for music (see input5_r) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", mitchell_irq, "screen", 0, 1) /* ??? one extra irq seems to be needed for music (see input5_r) */ MCFG_MACHINE_START(mitchell) MCFG_MACHINE_RESET(mitchell) @@ -1121,10 +1135,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(pang) + MCFG_SCREEN_UPDATE_STATIC(pang) MCFG_GFXDECODE(mgakuen) MCFG_PALETTE_LENGTH(1024) /* less colors than the others */ @@ -1148,7 +1161,7 @@ MCFG_CPU_ADD("maincpu",Z80, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) /* ??? one extra irq seems to be needed for music (see input5_r) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", mitchell_irq, "screen", 0, 1) /* ??? one extra irq seems to be needed for music (see input5_r) */ MCFG_MACHINE_START(mitchell) MCFG_MACHINE_RESET(mitchell) @@ -1160,7 +1173,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) @@ -1168,7 +1180,7 @@ MCFG_PALETTE_LENGTH(2048) MCFG_VIDEO_START(pang) - MCFG_SCREEN_UPDATE(pang) + MCFG_SCREEN_UPDATE_STATIC(pang) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1224,6 +1236,8 @@ MCFG_CPU_IO_MAP(spangbl_io_map) MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_DEVICE_REMOVE("scantimer") + MCFG_CPU_ADD("audiocpu", Z80, 8000000) MCFG_CPU_PROGRAM_MAP(spangbl_sound_map) MCFG_CPU_IO_MAP(spangbl_sound_io_map) @@ -1259,7 +1273,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) @@ -1267,7 +1280,7 @@ MCFG_PALETTE_LENGTH(2048) MCFG_VIDEO_START(pang) - MCFG_SCREEN_UPDATE(pang) + MCFG_SCREEN_UPDATE_STATIC(pang) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1283,7 +1296,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) /* ??? one extra irq seems to be needed for music (see input5_r) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", mitchell_irq, "screen", 0, 1) /* ??? one extra irq seems to be needed for music (see input5_r) */ MCFG_NVRAM_HANDLER(mitchell) MCFG_EEPROM_ADD("eeprom", eeprom_intf) @@ -1292,7 +1305,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) @@ -1300,7 +1312,7 @@ MCFG_PALETTE_LENGTH(2048) MCFG_VIDEO_START(pang) - MCFG_SCREEN_UPDATE(pang) + MCFG_SCREEN_UPDATE_STATIC(pang) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1336,7 +1348,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(mitchell_map) MCFG_CPU_IO_MAP(mitchell_io_map) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) /* ??? one extra irq seems to be needed for music (see input5_r) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", mitchell_irq, "screen", 0, 1) /* ??? one extra irq seems to be needed for music (see input5_r) */ MCFG_NVRAM_HANDLER(mitchell) MCFG_EEPROM_ADD("eeprom", eeprom_intf) @@ -1345,7 +1357,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.09) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 1*8, 31*8-1 ) @@ -1353,7 +1364,7 @@ MCFG_PALETTE_LENGTH(2048) MCFG_VIDEO_START(pang) - MCFG_SCREEN_UPDATE(pang) + MCFG_SCREEN_UPDATE_STATIC(pang) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/mjkjidai.c mame-0.145/src/mame/drivers/mjkjidai.c --- mame-0.144/src/mame/drivers/mjkjidai.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mjkjidai.c 2012-02-06 21:30:41.000000000 +0000 @@ -371,6 +371,13 @@ GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0, 16 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + mjkjidai_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( mjkjidai, mjkjidai_state ) @@ -378,7 +385,7 @@ MCFG_CPU_ADD("maincpu", Z80,10000000/2) /* 5 MHz ??? */ MCFG_CPU_PROGRAM_MAP(mjkjidai_map) MCFG_CPU_IO_MAP(mjkjidai_io_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_NVRAM_HANDLER(mjkjidai) @@ -386,10 +393,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(3*8, 61*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mjkjidai) + MCFG_SCREEN_UPDATE_STATIC(mjkjidai) MCFG_GFXDECODE(mjkjidai) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/mjsister.c mame-0.145/src/mame/drivers/mjsister.c --- mame-0.144/src/mame/drivers/mjsister.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mjsister.c 2012-02-06 21:30:40.000000000 +0000 @@ -21,8 +21,8 @@ : driver_device(mconfig, type, tag) { } /* video-related */ - bitmap_t *m_tmpbitmap0; - bitmap_t *m_tmpbitmap1; + bitmap_ind16 *m_tmpbitmap0; + bitmap_ind16 *m_tmpbitmap1; int m_flip_screen; int m_video_enable; int m_screen_redraw; @@ -61,8 +61,8 @@ static VIDEO_START( mjsister ) { mjsister_state *state = machine.driver_data(); - state->m_tmpbitmap0 = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); - state->m_tmpbitmap1 = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); + state->m_tmpbitmap0 = auto_bitmap_ind16_alloc(machine, 256, 256); + state->m_tmpbitmap1 = auto_bitmap_ind16_alloc(machine, 256, 256); state->save_item(NAME(state->m_videoram0)); state->save_item(NAME(state->m_videoram1)); @@ -79,8 +79,8 @@ c1 = (data & 0x0f) + state->m_colorbank * 0x20; c2 = ((data & 0xf0) >> 4) + state->m_colorbank * 0x20; - *BITMAP_ADDR16(state->m_tmpbitmap0, y, x * 2 + 0) = c1; - *BITMAP_ADDR16(state->m_tmpbitmap0, y, x * 2 + 1) = c2; + state->m_tmpbitmap0->pix16(y, x * 2 + 0) = c1; + state->m_tmpbitmap0->pix16(y, x * 2 + 1) = c2; } static void mjsister_plot1( running_machine &machine, int offset, UINT8 data ) @@ -99,8 +99,8 @@ if (c2) c2 += state->m_colorbank * 0x20 + 0x10; - *BITMAP_ADDR16(state->m_tmpbitmap1, y, x * 2 + 0) = c1; - *BITMAP_ADDR16(state->m_tmpbitmap1, y, x * 2 + 1) = c2; + state->m_tmpbitmap1->pix16(y, x * 2 + 0) = c1; + state->m_tmpbitmap1->pix16(y, x * 2 + 1) = c2; } static WRITE8_HANDLER( mjsister_videoram_w ) @@ -118,9 +118,9 @@ } } -static SCREEN_UPDATE( mjsister ) +static SCREEN_UPDATE_IND16( mjsister ) { - mjsister_state *state = screen->machine().driver_data(); + mjsister_state *state = screen.machine().driver_data(); int flip = state->m_flip_screen; int i, j; @@ -130,8 +130,8 @@ for (offs = 0; offs < 0x8000; offs++) { - mjsister_plot0(screen->machine(), offs, state->m_videoram0[offs]); - mjsister_plot1(screen->machine(), offs, state->m_videoram1[offs]); + mjsister_plot0(screen.machine(), offs, state->m_videoram0[offs]); + mjsister_plot1(screen.machine(), offs, state->m_videoram1[offs]); } state->m_screen_redraw = 0; } @@ -140,13 +140,13 @@ { for (i = 0; i < 256; i++) for (j = 0; j < 4; j++) - *BITMAP_ADDR16(bitmap, i, 256 + j) = state->m_colorbank * 0x20; + bitmap.pix16(i, 256 + j) = state->m_colorbank * 0x20; - copybitmap(bitmap, state->m_tmpbitmap0, flip, flip, 0, 0, cliprect); - copybitmap_trans(bitmap, state->m_tmpbitmap1, flip, flip, 2, 0, cliprect, 0); + copybitmap(bitmap, *state->m_tmpbitmap0, flip, flip, 0, 0, cliprect); + copybitmap_trans(bitmap, *state->m_tmpbitmap1, flip, flip, 2, 0, cliprect, 0); } else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -508,10 +508,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256+4, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255+4, 8, 247) - MCFG_SCREEN_UPDATE(mjsister) + MCFG_SCREEN_UPDATE_STATIC(mjsister) MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/mlanding.c mame-0.145/src/mame/drivers/mlanding.c --- mame-0.144/src/mame/drivers/mlanding.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mlanding.c 2012-02-06 21:30:38.000000000 +0000 @@ -58,22 +58,22 @@ // 256: Cockpit // 512: control centre screen // 768: plane landing sequence -static SCREEN_UPDATE(mlanding) +static SCREEN_UPDATE_IND16(mlanding) { - mlanding_state *state = screen->machine().driver_data(); + mlanding_state *state = screen.machine().driver_data(); int x, y; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { - UINT16 *src = &state->m_g_ram[y * 512/2 + cliprect->min_x]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, cliprect->min_x); + UINT16 *src = &state->m_g_ram[y * 512/2 + cliprect.min_x]; + UINT16 *dst = &bitmap.pix16(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { UINT16 srcpix = *src++; - *dst++ = screen->machine().pens[256+(srcpix & 0xff) + (state->m_pal_fg_bank & 1 ? 0x100 : 0x000)]; - *dst++ = screen->machine().pens[256+(srcpix >> 8) + (state->m_pal_fg_bank & 1 ? 0x100 : 0x000)]; + *dst++ = screen.machine().pens[256+(srcpix & 0xff) + (state->m_pal_fg_bank & 1 ? 0x100 : 0x000)]; + *dst++ = screen.machine().pens[256+(srcpix >> 8) + (state->m_pal_fg_bank & 1 ? 0x100 : 0x000)]; } } @@ -771,12 +771,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 511, 14*8, 511) - MCFG_SCREEN_UPDATE(mlanding) + MCFG_SCREEN_UPDATE_STATIC(mlanding) MCFG_PALETTE_LENGTH(512*16) diff -Nru mame-0.144/src/mame/drivers/mmm.c mame-0.145/src/mame/drivers/mmm.c --- mame-0.144/src/mame/drivers/mmm.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mmm.c 2012-02-06 21:30:35.000000000 +0000 @@ -4,6 +4,8 @@ Z80 based Fruit Machine */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -11,12 +13,19 @@ { public: mmm_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( mmm_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( mmm_map, AS_PROGRAM, 8, mmm_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM ADDRESS_MAP_END @@ -26,12 +35,12 @@ static MACHINE_CONFIG_START( mmm, mmm_state ) - /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,2000000) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(mmm_map) MACHINE_CONFIG_END + ROM_START( mmm_ldip ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "ld1.bin", 0x0000, 0x001000, CRC(5a3c2402) SHA1(4972d309e6aabef4f9277ea851e45981d0cb3dbb) ) @@ -40,4 +49,5 @@ ROM_LOAD( "ld4.bin", 0x3000, 0x001000, CRC(970b749f) SHA1(fe6da7abc699db69c0761304f588b5bed899c674) ) ROM_END -GAME( 198?, mmm_ldip , 0 , mmm , mmm , 0 , 0, "Maygay", "Lucky Dip (Maygay)", GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL|GAME_NO_SOUND) + +GAME( 198?, mmm_ldip, 0, mmm, mmm, 0, ROT0, "Maygay", "Lucky Dip (Maygay)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/model1.c mame-0.145/src/mame/drivers/model1.c --- mame-0.144/src/mame/drivers/model1.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/model1.c 2012-02-06 21:30:36.000000000 +0000 @@ -626,7 +626,6 @@ #include "emu.h" #include "cpu/v60/v60.h" -#include "deprecat.h" #include "video/segaic24.h" #include "cpu/m68000/m68000.h" #include "cpu/mb86233/mb86233.h" @@ -635,8 +634,6 @@ #include "machine/nvram.h" #include "includes/model1.h" - - static READ16_HANDLER( io_r ) { static const char *const analognames[] = { "AN0", "AN1", "AN2", "AN3", "AN4", "AN5", "AN6", "AN7" }; @@ -714,21 +711,23 @@ device_set_irq_callback(machine.device("maincpu"), irq_callback); } -static INTERRUPT_GEN(model1_interrupt) +static TIMER_DEVICE_CALLBACK( model1_interrupt ) { - model1_state *state = device->machine().driver_data(); - if (cpu_getiloops(device)) + model1_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 384) { - irq_raise(device->machine(), 1); + irq_raise(timer.machine(), 1); } - else + else if(scanline == 384/2) { - irq_raise(device->machine(), state->m_sound_irq); + irq_raise(timer.machine(), state->m_sound_irq); // if the FIFO has something in it, signal the 68k too if (state->m_fifo_rptr != state->m_fifo_wptr) { - cputag_set_input_line(device->machine(), "audiocpu", 2, HOLD_LINE); + cputag_set_input_line(timer.machine(), "audiocpu", 2, HOLD_LINE); } } } @@ -859,6 +858,11 @@ state->m_fifo_wptr++; if (state->m_fifo_wptr >= ARRAY_LENGTH(state->m_to_68k)) state->m_fifo_wptr = 0; + if (state->m_dsbz80 != NULL) + { + state->m_dsbz80->latch_w(*space, 0, data); + } + // signal the 68000 that there's data waiting cputag_set_input_line(space->machine(), "audiocpu", 2, HOLD_LINE); // give the 68k time to reply @@ -1080,7 +1084,7 @@ static INPUT_PORTS_START( wingwar ) PORT_START("AN0") /* X */ - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) + PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_REVERSE PORT_START("AN1") /* Y */ PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_REVERSE @@ -1094,19 +1098,19 @@ PORT_SERVICE_NO_TOGGLE(0x0004, IP_ACTIVE_LOW) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("View 1") + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("View 2") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("View 3") PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("IN1") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("View 4") PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("Machine Gun") + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("Missile") + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("Smoke") PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1333,12 +1337,12 @@ ROM_LOAD( "mpr-16484.bin", 0x000000, 0x200000, CRC(9d4c334d) SHA1(8b4d903f14559fed425d225bb23ccfe8da23cbd3) ) ROM_LOAD( "mpr-16485.bin", 0x200000, 0x200000, CRC(95aadcad) SHA1(4276db655db9834692c3843eb96a3e3a89cb7252) ) - ROM_REGION( 0x20000, "cpu2", 0 ) /* Z80 DSB code */ - ROM_LOAD( "epr-16471.bin", 0x000000, 0x020000, CRC(f4ee84a4) SHA1(f12b214e6f195b0e5f49ba9f41d8e54bfcea9acc) ) + ROM_REGION( 0x20000, "mpegcpu", 0 ) /* Z80 DSB code */ + ROM_LOAD( "epr-16471.bin", 0x000000, 0x020000, CRC(f4ee84a4) SHA1(f12b214e6f195b0e5f49ba9f41d8e54bfcea9acc) ) - ROM_REGION( 0x400000, "mpeg", 0 ) /* DSB MPEG data */ - ROM_LOAD( "mpr-16514.bin", 0x000000, 0x200000, CRC(3175b0be) SHA1(63649d053c8c17ce1746d16d0cc8202be20c302f) ) - ROM_LOAD( "mpr-16515.bin", 0x000000, 0x200000, CRC(3114d748) SHA1(9ef090623cdd2a1d06b5d1bc4b9a07ab4eff5b76) ) + ROM_REGION( 0x400000, "ymz770", 0 ) /* DSB MPEG data */ + ROM_LOAD( "mpr-16514.bin", 0x000000, 0x200000, CRC(3175b0be) SHA1(63649d053c8c17ce1746d16d0cc8202be20c302f) ) + ROM_LOAD( "mpr-16515.bin", 0x200000, 0x200000, CRC(3114d748) SHA1(9ef090623cdd2a1d06b5d1bc4b9a07ab4eff5b76) ) ROM_REGION32_LE( 0xc00000, "user1", 0 ) /* TGP model roms */ ROM_LOAD32_WORD( "mpr-16476.26", 0x000000, 0x200000, CRC(d48609ae) SHA1(8c8686a5c9ca4837447a7f70ed194e2f1882b66d) ) @@ -1505,7 +1509,7 @@ MCFG_CPU_ADD("maincpu", V60, 16000000) MCFG_CPU_PROGRAM_MAP(model1_mem) MCFG_CPU_IO_MAP(model1_io) - MCFG_CPU_VBLANK_INT_HACK(model1_interrupt, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model1_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 10000000) // verified on real h/w MCFG_CPU_PROGRAM_MAP(model1_snd) @@ -1520,9 +1524,8 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_16MHz, 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) - MCFG_SCREEN_UPDATE(model1) - MCFG_SCREEN_EOF(model1) + MCFG_SCREEN_UPDATE_STATIC(model1) + MCFG_SCREEN_VBLANK_STATIC(model1) MCFG_PALETTE_LENGTH(8192) @@ -1543,11 +1546,15 @@ MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED(swa, model1) + MCFG_DSBZ80_ADD(DSBZ80_TAG) +MACHINE_CONFIG_END + static MACHINE_CONFIG_START( model1_vr, model1_state ) MCFG_CPU_ADD("maincpu", V60, 16000000) MCFG_CPU_PROGRAM_MAP(model1_vr_mem) MCFG_CPU_IO_MAP(model1_vr_io) - MCFG_CPU_VBLANK_INT_HACK(model1_interrupt, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model1_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 10000000) // verified on real h/w MCFG_CPU_PROGRAM_MAP(model1_snd) @@ -1566,9 +1573,8 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_16MHz, 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) - MCFG_SCREEN_UPDATE(model1) - MCFG_SCREEN_EOF(model1) + MCFG_SCREEN_UPDATE_STATIC(model1) + MCFG_SCREEN_VBLANK_STATIC(model1) MCFG_PALETTE_LENGTH(8192) @@ -1592,7 +1598,7 @@ GAME( 1993, vf, 0, model1, vf, 0, ROT0, "Sega", "Virtua Fighter", GAME_IMPERFECT_GRAPHICS ) GAME( 1992, vr, 0, model1_vr, vr, 0, ROT0, "Sega", "Virtua Racing", GAME_IMPERFECT_GRAPHICS ) GAME( 1993, vformula, vr, model1_vr, vr, 0, ROT0, "Sega", "Virtua Formula", GAME_IMPERFECT_GRAPHICS ) -GAME( 1993, swa, 0, model1, swa, 0, ROT0, "Sega", "Star Wars Arcade", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) +GAME( 1993, swa, 0, swa, swa, 0, ROT0, "Sega", "Star Wars Arcade", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) GAME( 1994, wingwar, 0, model1, wingwar, 0, ROT0, "Sega", "Wing War (World)", GAME_NOT_WORKING ) GAME( 1994, wingwaru, wingwar, model1, wingwar, 0, ROT0, "Sega", "Wing War (US)", GAME_NOT_WORKING ) GAME( 1994, wingwarj, wingwar, model1, wingwar, 0, ROT0, "Sega", "Wing War (Japan)", GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/model2.c mame-0.145/src/mame/drivers/model2.c --- mame-0.144/src/mame/drivers/model2.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/model2.c 2012-02-06 21:30:36.000000000 +0000 @@ -87,7 +87,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "machine/nvram.h" #include "video/segaic24.h" @@ -1785,49 +1784,50 @@ PORT_BIT( 0x00ff, 0x0000, IPT_AD_STICK_Y ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_PLAYER(1) INPUT_PORTS_END -static INTERRUPT_GEN(model2_interrupt) +static TIMER_DEVICE_CALLBACK(model2_interrupt) { - model2_state *state = device->machine().driver_data(); - switch (cpu_getiloops(device)) + model2_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 0) // 384 { - case 0: - state->m_intreq |= (1<<10); - if (state->m_intena & (1<<10)) - { - device_set_input_line(device, I960_IRQ3, ASSERT_LINE); - } - break; - case 1: - state->m_intreq |= (1<<0); - if (state->m_intena & (1<<0)) - { - device_set_input_line(device, I960_IRQ0, ASSERT_LINE); - } - break; + state->m_intreq |= (1<<10); + if (state->m_intena & (1<<10)) + device_set_input_line(state->m_maincpu, I960_IRQ3, ASSERT_LINE); + } + + if(scanline == 384/2) + { + state->m_intreq |= (1<<0); + if (state->m_intena & (1<<0)) + device_set_input_line(state->m_maincpu, I960_IRQ0, ASSERT_LINE); } } -static INTERRUPT_GEN(model2c_interrupt) +static TIMER_DEVICE_CALLBACK(model2c_interrupt) { - model2_state *state = device->machine().driver_data(); - switch (cpu_getiloops(device)) + model2_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 0) // 384 + { + state->m_intreq |= (1<<10); + if (state->m_intena & (1<<10)) + device_set_input_line(state->m_maincpu, I960_IRQ3, ASSERT_LINE); + } + + if(scanline == 256) + { + state->m_intreq |= (1<<2); + if (state->m_intena & (1<<2)) + device_set_input_line(state->m_maincpu, I960_IRQ2, ASSERT_LINE); + } + + if(scanline == 128) { - case 0: - state->m_intreq |= (1<<10); - if (state->m_intena & (1<<10)) - device_set_input_line(device, I960_IRQ3, ASSERT_LINE); - break; - case 1: - state->m_intreq |= (1<<2); - if (state->m_intena & (1<<2)) - device_set_input_line(device, I960_IRQ2, ASSERT_LINE); - - break; - case 2: - state->m_intreq |= (1<<0); - if (state->m_intena & (1<<0)) - device_set_input_line(device, I960_IRQ0, ASSERT_LINE); - break; + state->m_intreq |= (1<<0); + if (state->m_intena & (1<<0)) + device_set_input_line(state->m_maincpu, I960_IRQ0, ASSERT_LINE); } } @@ -2003,7 +2003,7 @@ static MACHINE_CONFIG_START( model2o, model2_state ) MCFG_CPU_ADD("maincpu", I960, 25000000) MCFG_CPU_PROGRAM_MAP(model2o_mem) - MCFG_CPU_VBLANK_INT_HACK(model2_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 10000000) MCFG_CPU_PROGRAM_MAP(model1_snd) @@ -2035,10 +2035,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(62*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(model2) + MCFG_SCREEN_UPDATE_STATIC(model2) MCFG_PALETTE_LENGTH(8192) @@ -2063,7 +2062,7 @@ static MACHINE_CONFIG_START( model2a, model2_state ) MCFG_CPU_ADD("maincpu", I960, 25000000) MCFG_CPU_PROGRAM_MAP(model2a_crx_mem) - MCFG_CPU_VBLANK_INT_HACK(model2_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model2_snd) @@ -2094,10 +2093,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(62*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(model2) + MCFG_SCREEN_UPDATE_STATIC(model2) MCFG_PALETTE_LENGTH(8192) @@ -2162,7 +2160,7 @@ static MACHINE_CONFIG_START( model2b, model2_state ) MCFG_CPU_ADD("maincpu", I960, 25000000) MCFG_CPU_PROGRAM_MAP(model2b_crx_mem) - MCFG_CPU_VBLANK_INT_HACK(model2_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model2_snd) @@ -2199,10 +2197,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(62*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(model2) + MCFG_SCREEN_UPDATE_STATIC(model2) MCFG_PALETTE_LENGTH(8192) @@ -2220,7 +2217,7 @@ static MACHINE_CONFIG_START( model2c, model2_state ) MCFG_CPU_ADD("maincpu", I960, 25000000) MCFG_CPU_PROGRAM_MAP(model2c_crx_mem) - MCFG_CPU_VBLANK_INT_HACK(model2c_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", model2c_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model2_snd) @@ -2247,10 +2244,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(62*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 62*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(model2) + MCFG_SCREEN_UPDATE_STATIC(model2) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/model3.c mame-0.145/src/mame/drivers/model3.c --- mame-0.144/src/mame/drivers/model3.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/model3.c 2012-02-06 21:30:36.000000000 +0000 @@ -646,7 +646,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "cpu/powerpc/ppc.h" #include "machine/eeprom.h" #include "machine/53c810.h" @@ -5133,17 +5132,15 @@ 0x02: Video (VBLANK start?) 0x01: Video (unused?) */ -static INTERRUPT_GEN(model3_interrupt) +static TIMER_DEVICE_CALLBACK(model3_interrupt) { - model3_state *state = device->machine().driver_data(); - if (state->m_vblank == 0) { - model3_set_irq_line(device->machine(), 0x02, ASSERT_LINE); - } else { - model3_set_irq_line(device->machine(), 0x0d, ASSERT_LINE); - } +// model3_state *state = timer.machine().driver_data(); + int scanline = param; - state->m_vblank++; - state->m_vblank &= 1; + if (scanline == 384) + model3_set_irq_line(timer.machine(), 0x02, ASSERT_LINE); + else if(scanline == 0) + model3_set_irq_line(timer.machine(), 0x0d, ASSERT_LINE); } static const powerpc_config model3_10 = @@ -5168,7 +5165,7 @@ MCFG_CPU_ADD("maincpu", PPC603E, 66000000) MCFG_CPU_CONFIG(model3_10) MCFG_CPU_PROGRAM_MAP(model3_mem) - MCFG_CPU_VBLANK_INT_HACK(model3_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model3_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model3_snd) @@ -5183,11 +5180,10 @@ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) MCFG_SCREEN_SIZE(512, 400) - MCFG_SCREEN_UPDATE(model3) + MCFG_SCREEN_UPDATE_STATIC(model3) MCFG_PALETTE_LENGTH(32768) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) @@ -5210,7 +5206,7 @@ MCFG_CPU_ADD("maincpu", PPC603E, 100000000) MCFG_CPU_CONFIG(model3_15) MCFG_CPU_PROGRAM_MAP(model3_mem) - MCFG_CPU_VBLANK_INT_HACK(model3_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model3_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model3_snd) @@ -5223,11 +5219,10 @@ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE(model3) + MCFG_SCREEN_UPDATE_STATIC(model3) MCFG_PALETTE_LENGTH(32768) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) @@ -5250,7 +5245,7 @@ MCFG_CPU_ADD("maincpu", PPC603R, 166000000) MCFG_CPU_CONFIG(model3_2x) MCFG_CPU_PROGRAM_MAP(model3_mem) - MCFG_CPU_VBLANK_INT_HACK(model3_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model3_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model3_snd) @@ -5263,11 +5258,10 @@ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE(model3) + MCFG_SCREEN_UPDATE_STATIC(model3) MCFG_PALETTE_LENGTH(32768) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) @@ -5290,7 +5284,7 @@ MCFG_CPU_ADD("maincpu", PPC603R, 166000000) MCFG_CPU_CONFIG(model3_2x) MCFG_CPU_PROGRAM_MAP(model3_mem) - MCFG_CPU_VBLANK_INT_HACK(model3_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", model3_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(model3_snd) @@ -5303,12 +5297,11 @@ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 383) MCFG_SCREEN_SIZE(496, 400) - MCFG_SCREEN_UPDATE(model3) + MCFG_SCREEN_UPDATE_STATIC(model3) MCFG_PALETTE_LENGTH(32768) MCFG_PALETTE_INIT(RRRRR_GGGGG_BBBBB) diff -Nru mame-0.144/src/mame/drivers/mogura.c mame-0.145/src/mame/drivers/mogura.c --- mame-0.144/src/mame/drivers/mogura.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/mogura.c 2012-02-06 21:30:37.000000000 +0000 @@ -78,26 +78,21 @@ state->m_tilemap = tilemap_create(machine, get_mogura_tile_info, tilemap_scan_rows, 8, 8, 64, 32); } -static SCREEN_UPDATE( mogura ) +static SCREEN_UPDATE_IND16( mogura ) { - mogura_state *state = screen->machine().driver_data(); - const rectangle &visarea = screen->visible_area(); + mogura_state *state = screen.machine().driver_data(); + const rectangle &visarea = screen.visible_area(); /* tilemap layout is a bit strange ... */ - rectangle clip; - clip.min_x = visarea.min_x; + rectangle clip = visarea; clip.max_x = 256 - 1; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; - tilemap_set_scrollx(state->m_tilemap, 0, 256); - tilemap_draw(bitmap, &clip, state->m_tilemap, 0, 0); + state->m_tilemap->set_scrollx(0, 256); + state->m_tilemap->draw(bitmap, clip, 0, 0); clip.min_x = 256; clip.max_x = 512 - 1; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; - tilemap_set_scrollx(state->m_tilemap, 0, -128); - tilemap_draw(bitmap, &clip, state->m_tilemap, 0, 0); + state->m_tilemap->set_scrollx(0, -128); + state->m_tilemap->draw(bitmap, clip, 0, 0); return 0; } @@ -106,7 +101,7 @@ { mogura_state *state = space->machine().driver_data(); state->m_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset & 0x7ff); + state->m_tilemap->mark_tile_dirty(offset & 0x7ff); } static WRITE8_HANDLER(mogura_dac_w) @@ -215,10 +210,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // ? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1) - MCFG_SCREEN_UPDATE(mogura) + MCFG_SCREEN_UPDATE_STATIC(mogura) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/mole.c mame-0.145/src/mame/drivers/mole.c --- mame-0.144/src/mame/drivers/mole.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mole.c 2012-02-06 21:30:39.000000000 +0000 @@ -104,7 +104,7 @@ mole_state *state = space->machine().driver_data(); state->m_tileram[offset] = data | (state->m_tile_bank << 8); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( mole_tilebank_w ) @@ -112,7 +112,7 @@ mole_state *state = space->machine().driver_data(); state->m_tile_bank = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } static WRITE8_HANDLER( mole_flipscreen_w ) @@ -120,11 +120,11 @@ flip_screen_set(space->machine(), data & 0x01); } -static SCREEN_UPDATE( mole ) +static SCREEN_UPDATE_IND16( mole ) { - mole_state *state = screen->machine().driver_data(); + mole_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -328,10 +328,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 25*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 25*8-1) - MCFG_SCREEN_UPDATE(mole) + MCFG_SCREEN_UPDATE_STATIC(mole) MCFG_GFXDECODE(mole) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/momoko.c mame-0.145/src/mame/drivers/momoko.c --- mame-0.144/src/mame/drivers/momoko.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/momoko.c 2012-02-06 21:30:37.000000000 +0000 @@ -277,10 +277,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 29*8-1) - MCFG_SCREEN_UPDATE(momoko) + MCFG_SCREEN_UPDATE_STATIC(momoko) MCFG_GFXDECODE(momoko) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/monzagp.c mame-0.145/src/mame/drivers/monzagp.c --- mame-0.144/src/mame/drivers/monzagp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/monzagp.c 2012-02-06 21:30:35.000000000 +0000 @@ -62,42 +62,42 @@ state->m_vram = auto_alloc_array(machine, UINT8, 0x10000); } -static SCREEN_UPDATE(monzagp) +static SCREEN_UPDATE_IND16(monzagp) { - monzagp_state *state = screen->machine().driver_data(); + monzagp_state *state = screen.machine().driver_data(); int x,y; - if(screen->machine().input().code_pressed_once(KEYCODE_Z)) + if(screen.machine().input().code_pressed_once(KEYCODE_Z)) state->m_bank--; - if(screen->machine().input().code_pressed_once(KEYCODE_X)) + if(screen.machine().input().code_pressed_once(KEYCODE_X)) state->m_bank++; - if(screen->machine().input().code_pressed_once(KEYCODE_Q)) + if(screen.machine().input().code_pressed_once(KEYCODE_Q)) { state->m_screenw--; printf("%x\n",state->m_screenw); } - if(screen->machine().input().code_pressed_once(KEYCODE_W)) + if(screen.machine().input().code_pressed_once(KEYCODE_W)) { state->m_screenw++; printf("%x\n",state->m_screenw); } - if(screen->machine().input().code_pressed_once(KEYCODE_A)) + if(screen.machine().input().code_pressed_once(KEYCODE_A)) { FILE * p=fopen("vram.bin","wb"); fwrite(&state->m_vram[0],1,0x10000,p); fclose(p); } - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for(y=0;y<256;y++) { for(x=0;x<256;x++) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[state->m_bank&1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[state->m_bank&1], state->m_vram[y*state->m_screenw+x], //(state->m_vram[y*state->m_screenw+x]&0x3f)+(state->m_bank>>1)*64, 0, @@ -260,10 +260,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(monzagp) + MCFG_SCREEN_UPDATE_STATIC(monzagp) MCFG_PALETTE_LENGTH(0x200) MCFG_PALETTE_INIT(monzagp) diff -Nru mame-0.144/src/mame/drivers/moo.c mame-0.145/src/mame/drivers/moo.c --- mame-0.144/src/mame/drivers/moo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/moo.c 2012-02-06 21:30:35.000000000 +0000 @@ -538,10 +538,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1200)) // should give IRQ4 sufficient time to update scroll registers - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(moo) + MCFG_SCREEN_UPDATE_STATIC(moo) MCFG_PALETTE_LENGTH(2048) @@ -582,10 +581,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1200)) // should give IRQ4 sufficient time to update scroll registers - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(moo) + MCFG_SCREEN_UPDATE_STATIC(moo) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/mosaic.c mame-0.145/src/mame/drivers/mosaic.c --- mame-0.144/src/mame/drivers/mosaic.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mosaic.c 2012-02-06 21:30:38.000000000 +0000 @@ -282,10 +282,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mosaic) + MCFG_SCREEN_UPDATE_STATIC(mosaic) MCFG_GFXDECODE(mosaic) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/mouser.c mame-0.145/src/mame/drivers/mouser.c --- mame-0.144/src/mame/drivers/mouser.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mouser.c 2012-02-06 21:30:38.000000000 +0000 @@ -225,10 +225,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mouser) + MCFG_SCREEN_UPDATE_STATIC(mouser) MCFG_GFXDECODE(mouser) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/mpoker.c mame-0.145/src/mame/drivers/mpoker.c --- mame-0.144/src/mame/drivers/mpoker.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpoker.c 2012-02-06 21:30:39.000000000 +0000 @@ -191,12 +191,12 @@ } -static SCREEN_UPDATE(mpoker) +static SCREEN_UPDATE_IND16(mpoker) { - mpoker_state *state = screen->machine().driver_data(); + mpoker_state *state = screen.machine().driver_data(); int y,x; int count; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; count = 0; for (y=0;y<32;y++) @@ -589,10 +589,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(mpoker) + MCFG_SCREEN_UPDATE_STATIC(mpoker) MCFG_GFXDECODE(mpoker) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/mpu2.c mame-0.145/src/mame/drivers/mpu2.c --- mame-0.144/src/mame/drivers/mpu2.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpu2.c 2012-02-06 21:30:39.000000000 +0000 @@ -34,6 +34,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -42,10 +44,17 @@ { public: mpu2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( mpu2_basemap, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( mpu2_basemap, AS_PROGRAM, 8, mpu2_state ) ADDRESS_MAP_GLOBAL_MASK(0x3fff) // A14/A15 Not Connected AM_RANGE(0x1000, 0x17ff) AM_ROM AM_REGION("maskrom", 0) AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("romp1", 0) @@ -89,5 +98,5 @@ ROM_LOAD( "sl1.bin", 0x0000, 0x0800, CRC(afe04b5a) SHA1(3b3385a9b039992279fda5b87926b5089a448581) ) ROM_END -GAME( 198?, m2hilite, 0 , mpu2, mpu2, 0, ROT0, "Barcrest", "Hi-Lights (Barcrest) (MPU2)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 198?, m2svlite, 0 , mpu2, mpu2, 0, ROT0, "Barcrest", "Silver Lights (Barcrest) (MPU2)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME(198?, m2hilite, 0, mpu2, mpu2, 0, ROT0, "Barcrest", "Hi-Lights (Barcrest) (MPU2)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, m2svlite, 0, mpu2, mpu2, 0, ROT0, "Barcrest", "Silver Lights (Barcrest) (MPU2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/mpu3.c mame-0.145/src/mame/drivers/mpu3.c --- mame-0.144/src/mame/drivers/mpu3.c 2012-01-13 15:34:43.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpu3.c 2012-02-06 21:30:39.000000000 +0000 @@ -1584,94 +1584,96 @@ /* Barcrest */ -GAME( 198?, m3tst, 0, mpu3base, mpu3, 0, ROT0, "Barcrest","MPU3 Unit Test (Program 5) (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +#define GAME_FLAGS GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL -GAME( 198?, m3autort, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Autoroute (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3big20j, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Big 20 Joker (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3bigsht, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Big Shot (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3blkhle, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Black Hole (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3cabret, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3cabreta, m3cabret, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3cunlim, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Chances Unlimited (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3cskill, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Circle Skill (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3cjoker, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Crazy Joker (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3xchngg, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Galore (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3xchngu, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3xchngua, m3xchngu, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3fortun, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3fortuna, m3fortun, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3fortund, m3fortun, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) [Dutch] (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3gaward, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Golden Award (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3hprvpr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3snappy, m3hprvpr, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Snappy Viper (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3replay, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Instant Replay (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3lineup, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Line Up (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3llotto, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Lotto (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3lstrik, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3lstrika, m3lstrik, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3magrp, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Magic Replay (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3nnice, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Naughty But Nice (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3nudge, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Nudges Unlimited (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3oddson, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Odds On (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3optunl, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Options Unlimited (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3razdaz, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3razdaza, m3razdaz, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3razdazd, m3razdaz, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) [Dutch] (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3rxchng, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3circle, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3circlea, m3circle, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3circleb, m3circle, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3slight, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Strike A Light (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supadr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Adders & Ladders (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3sdeal, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Deal (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3sexcu, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Exchanges Unlimited (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3suplin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3suplina, m3suplin, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supnud, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Nudges Unlimited (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supser, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Series (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3sweep, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3sweepa, m3sweep, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3topsht, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Top Shot (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3winstra, m3winstr, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Winstrike (Barcrest) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, m3tst, 0, mpu3base, mpu3, 0, ROT0, "Barcrest","MPU3 Unit Test (Program 5) (Barcrest) (MPU3)",GAME_FLAGS ) + +GAME( 198?, m3autort, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Autoroute (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3big20j, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Big 20 Joker (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3bigsht, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Big Shot (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3blkhle, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Black Hole (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3cabret, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3cabreta, m3cabret, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3cunlim, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Chances Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3cskill, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Circle Skill (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3cjoker, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Crazy Joker (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3xchngg, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Galore (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3xchngu, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3xchngua, m3xchngu, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3fortun, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3fortuna, m3fortun, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3fortund, m3fortun, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) [Dutch] (MPU3)",GAME_FLAGS ) +GAME( 198?, m3gaward, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Golden Award (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3hprvpr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3snappy, m3hprvpr, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Snappy Viper (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3replay, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Instant Replay (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3lineup, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Line Up (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3llotto, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Lotto (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3lstrik, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3lstrika, m3lstrik, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3magrp, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Magic Replay (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3nnice, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Naughty But Nice (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3nudge, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Nudges Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3oddson, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Odds On (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3optunl, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Options Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3razdaz, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3razdaza, m3razdaz, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3razdazd, m3razdaz, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) [Dutch] (MPU3)",GAME_FLAGS ) +GAME( 198?, m3rxchng, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3circle, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3circlea, m3circle, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3circleb, m3circle, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 3)",GAME_FLAGS ) +GAME( 198?, m3slight, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Strike A Light (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3supadr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Adders & Ladders (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3sdeal, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Deal (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3sexcu, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Exchanges Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3suplin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3suplina, m3suplin, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3supnud, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Nudges Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3supser, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Super Series (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3sweep, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3sweepa, m3sweep, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3topsht, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Top Shot (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3winstra, m3winstr, mpu3base, mpu3, m3hprvpr, ROT0, "Barcrest","Winstrike (Barcrest) (MPU3)",GAME_FLAGS ) /* Bwb */ -GAME( 198?, m3acech, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Ace Chase (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3bankr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Banker (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3chase, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Chase It (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3gmine, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Gold Mine (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3ratrce, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Rat Race (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supasw, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Supaswop (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supwin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supwina, m3supwin, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3winagn, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3winagna, m3winagn, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3winagnb, m3winagn, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3winstr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Winstrike (Bwb) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, m3acech, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Ace Chase (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3bankr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Banker (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3chase, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Chase It (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3gmine, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Gold Mine (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3ratrce, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Rat Race (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3supasw, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Supaswop (Bwb) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3supwin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3supwina, m3supwin, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3winagn, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3winagna, m3winagn, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3winagnb, m3winagn, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 3)",GAME_FLAGS ) +GAME( 198?, m3winstr, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Bwb","Winstrike (Bwb) (MPU3)",GAME_FLAGS ) /* Pcp */ -GAME( 198?, m3cdash, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Cash Dash (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3loony, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Loonybin (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3online, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","On Line (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3rockpl, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Rock Pile (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3rollem, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Roll 'Em (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3snaphp, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Snap Happy (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3spoof, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3spoofa, m3spoof, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supspo, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 1)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3supspoa, m3supspo, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 2)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3toplin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Top Line (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3wigwam, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Wig Wam (Pcp) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, m3cdash, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Cash Dash (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3loony, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Loonybin (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3online, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","On Line (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3rockpl, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Rock Pile (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3rollem, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Roll 'Em (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3snaphp, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Snap Happy (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3spoof, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3spoofa, m3spoof, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3supspo, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3supspoa, m3supspo, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 2)",GAME_FLAGS ) +GAME( 198?, m3toplin, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Top Line (Pcp) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3wigwam, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Pcp","Wig Wam (Pcp) (MPU3)",GAME_FLAGS ) /* Mdm */ -GAME( 198?, m3gcrown, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Golden Crowns (Mdm) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3tfair, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Tuppenny Fair (Mdm) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3wacky, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Wacky Racer (Mdm) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, m3gcrown, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Golden Crowns (Mdm) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3tfair, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Tuppenny Fair (Mdm) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3wacky, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Mdm","Wacky Racer (Mdm) (MPU3)",GAME_FLAGS ) /* Others */ -GAME( 198?, m3minmax, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Associated Leisure","Mini Max (Associated Leisure) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 198?, m3oxo, 0, mpu3base, mpu3, m3hprvpr, ROT0, "VFS","Noughts 'n' Crosses (VFS) (MPU3)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 198?, m3minmax, 0, mpu3base, mpu3, m3hprvpr, ROT0, "Associated Leisure","Mini Max (Associated Leisure) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3oxo, 0, mpu3base, mpu3, m3hprvpr, ROT0, "VFS","Noughts 'n' Crosses (VFS) (MPU3)",GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/mpu4.c mame-0.145/src/mame/drivers/mpu4.c --- mame-0.144/src/mame/drivers/mpu4.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpu4.c 2012-02-06 21:30:39.000000000 +0000 @@ -2971,7 +2971,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(mpu4_state, screen_update) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1) MCFG_PALETTE_LENGTH(0x200) @@ -15249,779 +15249,781 @@ GAME( 198?, m4tst2, 0, mod2 , mpu4, m4tst2, ROT0, "Barcrest","MPU4 Unit Test (Program 2)",GAME_MECHANICAL ) GAME( 198?, m4clr, 0, mod2 , mpu4, 0, ROT0, "Barcrest","MPU4 Meter Clear ROM",GAME_MECHANICAL ) +#define GAME_FLAGS (GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK) + /* I don't actually think all of these are Barcrest, some are mislabeled */ -GAME(199?, m4tenten ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","10 X 10 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) -GAME(199?, m421club ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","21 Club (Barcrest) [DTW, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // not english -GAME(199?, m4actbnk ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default ,ROT0, "Barcrest","Action Bank (Barcrest) [ACT] (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) // set jackpot key to 8GBP TOKEN -GAME(199?, m4actclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4actnot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Note (Barcrest) [AN 1.2] (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4actpak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Pack (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4addrd ,m4addr ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders (Barcrest) [DAL, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4addr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4addrc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4addrcc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Classic Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4addrcb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4alladv ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","All Cash Advance (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4alpha ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Alphabet (Barcrest) [A4B 1.0] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ambass ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ambassador (Barcrest) [DAM, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4amhiwy ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","American Highway (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // crash mame -GAME(199?, m4andycpd,m4andycp ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Capp (Barcrest) [DAC, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4andycp ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Capp (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4andyfl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Loves Flo (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4andybt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Andy's Big Time Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4andyfh ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy's Full House (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4andyge ,0 ,mod4oki ,grtecp ,m_grtecp ,ROT0, "Barcrest","Andy's Great Escape (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4apach ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Apache (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4atlan ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Atlantis (Barcrest) [DAT, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bagtel ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Bagatelle (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bnknot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Bank A Note (Barcrest) [BN 1.0] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bnkrol ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Bank Roller Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4btclok ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Beat The Clock (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4berser ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Berserk (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // crashes mame -GAME(199?, m4bigbn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Ben (Barcrest) [DBB, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bigchfd,m4bigchf ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Chief (Barcrest) [BCH, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // why code BCH on a dutch? -GAME(199?, m4bigchf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Chief (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4blkwhd ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black & White (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4blkbuld,m4blkbul ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black Bull (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4blkbul ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Bull (Barcrest) [XSP] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // XSP?? -GAME(199?, m4blkcat ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black Cat (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bj ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bjc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack Club (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bja ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bjac ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bjack ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bjsm ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack Super Multi (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4blstbk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blast A Bank (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bluedm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Blue Diamond (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bluemn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blue Moon (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bdash ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Boulder Dash (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) -GAME(199?, m4brktak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Break & Take (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4brdway ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Broadway (Barcrest) [DBR, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4brook ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Brooklyn (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4buc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Buccaneer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bucks ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Bucks Fizz Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4calamab,m4calama ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Calamari Club (Barcrest - Bwb) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4calama ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Calamari Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4calicl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","California Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cardcs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Card Cash (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cojok ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Carry On Joker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashat ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cash Attack (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashcn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Connect (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashco ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Counter (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashln ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cash Lines (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) -GAME(199?, m4cashmn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Cash Machine (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashmx ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Matrix (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cashzn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Zone (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4casmul ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Casino Multiplay (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // crashes mame -GAME(199?, m4celclb ,0 ,mod2 ,mpu4 ,m_ccelbr ,ROT0, "Barcrest","Celebration Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4centpt, 0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Centrepoint (Barcrest) (v1.3) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4centpta,m4centpt ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Centrepoint (Barcrest) (v1.5) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ceptr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Ceptor (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4chasei ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Chase Invaders (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4cheryo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cherryo (Barcrest) [DCH, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4click ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Clickity Click (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4c999 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud 999 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4c9 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud Nine (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4c9c ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud Nine Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbcls ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbclm ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Climber (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbcnt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Connect (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbdbl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Double (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbshf ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Club Shuffle (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbtro ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Tropicana (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbveg ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Club Vegas (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbx ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Club X (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4copcsh ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Coppa Cash (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4coscas ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cosmic Casino (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crkpot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Crackpot Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crzjk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Crazy Jokers (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crzjwl ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crown Jewels (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crjwl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Crown Jewels Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crjwl2 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Crown Jewels Mk II Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crdome ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crystal Dome (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crmaze ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crystal Maze (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4denmen ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Dennis The Menace (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4dbl9 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Double 9's (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4dbldmn ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Double Diamond Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4dblup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Double Up (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4drac ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Dracula (Barcrest - Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4dtyfre ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Duty Free (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4eighth ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Eighth Wonder (Barcrest) [WON 2.2] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4elite ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Elite (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4eaw ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Everyone's A Winner (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4exprs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Express (Barcrest) [DXP, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4exgam ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Extra Game (Fairplay - Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4fastfw ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fast Forward (Barcrest - Bwb) [FFD 1.0] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4class ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","First Class (Barcrest) [DFC, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4flash ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Flash Cash (Barcrest) [FC 1.0] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4fortcb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fortune Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtlt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit & Loot (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtfl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Full (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtflc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Full Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtgm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Game (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtlnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Link Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4frtprs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Preserve (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) +GAME(199?, m4tenten ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","10 X 10 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) +GAME(199?, m421club ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","21 Club (Barcrest) [DTW, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // not english +GAME(199?, m4actbnk ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default ,ROT0, "Barcrest","Action Bank (Barcrest) [ACT] (MPU4)", GAME_FLAGS ) // set jackpot key to 8GBP TOKEN +GAME(199?, m4actclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Club (Barcrest) (MPU4)", GAME_FLAGS ) +GAME(199?, m4actnot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Note (Barcrest) [AN 1.2] (MPU4)", GAME_FLAGS ) +GAME(199?, m4actpak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Action Pack (Barcrest) (MPU4)", GAME_FLAGS ) +GAME(199?, m4addrd ,m4addr ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders (Barcrest) [DAL, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4addr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4addrc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4addrcc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Classic Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4addrcb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Adders & Ladders Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4alladv ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","All Cash Advance (Barcrest) (MPU4)", GAME_FLAGS ) +GAME(199?, m4alpha ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Alphabet (Barcrest) [A4B 1.0] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ambass ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ambassador (Barcrest) [DAM, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4amhiwy ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","American Highway (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // crash mame +GAME(199?, m4andycpd,m4andycp ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Capp (Barcrest) [DAC, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4andycp ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Capp (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4andyfl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy Loves Flo (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4andybt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Andy's Big Time Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4andyfh ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Andy's Full House (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4andyge ,0 ,mod4oki ,grtecp ,m_grtecp ,ROT0, "Barcrest","Andy's Great Escape (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apach ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Apache (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4atlan ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Atlantis (Barcrest) [DAT, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bagtel ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Bagatelle (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bnknot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Bank A Note (Barcrest) [BN 1.0] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bnkrol ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Bank Roller Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4btclok ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Beat The Clock (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4berser ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Berserk (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // crashes mame +GAME(199?, m4bigbn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Ben (Barcrest) [DBB, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigchfd,m4bigchf ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Chief (Barcrest) [BCH, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // why code BCH on a dutch? +GAME(199?, m4bigchf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Big Chief (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blkwhd ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black & White (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blkbuld,m4blkbul ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black Bull (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blkbul ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Bull (Barcrest) [XSP] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // XSP?? +GAME(199?, m4blkcat ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black Cat (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bj ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bjc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack Club (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bja ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bjac ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bjack ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Black Jack (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bjsm ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blackjack Super Multi (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blstbk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blast A Bank (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bluedm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Blue Diamond (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bluemn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Blue Moon (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bdash ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Boulder Dash (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) +GAME(199?, m4brktak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Break & Take (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4brdway ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Broadway (Barcrest) [DBR, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4brook ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Brooklyn (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4buc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Buccaneer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bucks ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Bucks Fizz Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4calamab,m4calama ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Calamari Club (Barcrest - Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4calama ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Calamari Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4calicl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","California Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cardcs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Card Cash (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cojok ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Carry On Joker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashat ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cash Attack (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashcn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Connect (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashco ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Counter (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashln ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cash Lines (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) +GAME(199?, m4cashmn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Cash Machine (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashmx ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Matrix (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cashzn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cash Zone (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4casmul ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Casino Multiplay (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // crashes mame +GAME(199?, m4celclb ,0 ,mod2 ,mpu4 ,m_ccelbr ,ROT0, "Barcrest","Celebration Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4centpt, 0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Centrepoint (Barcrest) (v1.3) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4centpta,m4centpt ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Centrepoint (Barcrest) (v1.5) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ceptr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Ceptor (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chasei ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Chase Invaders (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cheryo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cherryo (Barcrest) [DCH, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4click ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Clickity Click (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4c999 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud 999 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4c9 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud Nine (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4c9c ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Cloud Nine Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbcls ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbclm ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Climber (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbcnt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Connect (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbdbl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Double (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbshf ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Club Shuffle (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbtro ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Club Tropicana (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbveg ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Club Vegas (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbx ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Club X (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4copcsh ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Coppa Cash (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4coscas ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Cosmic Casino (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crkpot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Crackpot Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzjk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Crazy Jokers (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzjwl ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crown Jewels (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crjwl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Crown Jewels Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crjwl2 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Crown Jewels Mk II Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crdome ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crystal Dome (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crmaze ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Crystal Maze (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4denmen ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Dennis The Menace (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dbl9 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Double 9's (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dbldmn ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Double Diamond Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dblup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Double Up (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4drac ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Dracula (Barcrest - Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dtyfre ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Duty Free (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4eighth ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Eighth Wonder (Barcrest) [WON 2.2] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4elite ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Elite (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4eaw ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Everyone's A Winner (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4exprs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Express (Barcrest) [DXP, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4exgam ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Extra Game (Fairplay - Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fastfw ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fast Forward (Barcrest - Bwb) [FFD 1.0] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4class ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","First Class (Barcrest) [DFC, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4flash ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Flash Cash (Barcrest) [FC 1.0] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fortcb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fortune Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtlt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit & Loot (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtfl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Full (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtflc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Full Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtgm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Game (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtlnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Link Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frtprs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Fruit Preserve (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) GAMEL(198?,m4gambal ,0 ,mod4yam ,gamball ,m_gmball ,ROT0, "Barcrest","Gamball (Barcrest) (MPU4)", GAME_REQUIRES_ARTWORK|GAME_MECHANICAL,layout_gamball )//Mechanical ball launcher -GAME(199?, m4gb006 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Games Bond 006 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gbust ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ghost Buster (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4giant ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Giant (Barcrest) [DGI, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gclue ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Give Us A Clue (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gldstr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Gold Strike (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gldgat ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Gate (Barcrest) [DGG, Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gldjok ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Joker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // dutch? -GAME(199?, m4gldnud ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Nudger (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4grbbnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Grab The Bank (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4graff ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Graffiti (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4graffd ,m4graff ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Grafitti (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4grands ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Grandstand Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4gnsmk ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Gun Smoke (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hpyjok ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Happy Joker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hijinx ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Hi Jinx (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hirise ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","High Rise (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hiroll ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","High Roller (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hittop ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hit The Top (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4thehit ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","The Hit (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4holdon ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hold On (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4holdtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hold Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hotrod ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hot Rod (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hypvip ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hypclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hyper Viper Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4intcep ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Interceptor (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jpgem ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Gems (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jpgemc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Gems Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jpjmp ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Jump (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jwlcwn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Jewel In the Crown (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jok300 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jokers 300 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jokmil ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jokers Millennium (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jolgem ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jolly Gems (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) (hangs) -GAME(199?, m4joljok ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4joljokd,m4joljok ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4joljokh,m4joljok ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) [Hungarian] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4joltav ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Taverner (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4lastrp ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Las Vegas Strip (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4goodtm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Let The Good Times Roll (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4libty ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Liberty (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4lineup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Line Up (Bwb - Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // no sound with any system? -GAME(199?, m4loadmn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Loads A Money (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luck7 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky 7 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luckdv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Devil (Barcrest) [Czech] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luckdvd,m4luckdv ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Devil (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4lucklv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Las Vegas (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luckst ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Lucky Strike (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4lucksc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Lucky Strike Club (Barcrest) [MPU 4] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luckwb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Wild Boar (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4luxor ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Luxor (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4madhse ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Mad House (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4magdrg ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Dragon (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4maglin ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Liner (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4magrep ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Replay DeLuxe (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4magtbo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Turbo (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4mag7s ,0 ,mod4oki ,mpu4jackpot8per ,m4default_bigbank ,ROT0, "Barcrest","Magnificent 7's (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4makmnt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Make A Mint (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4megbks ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Mega Bucks (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4meglnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Megalink (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4milclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Millionaire's Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4mirage ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Mirage (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4moneym ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Money Maker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4monte ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Monte Carlo (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4multcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Multiplay Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4multwy ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Multiway (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nhtt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","New Hit the Top (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nick ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nickelodeon (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nifty ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nifty Fifty (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nspot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Night Spot Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nile ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Nile Jewels (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nudgew ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge A Win (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // no sound with any system? -GAME(199?, m4nudbnk ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Banker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nnww ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Nudge Wink Wink (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nnwwc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Nudge Wink Wink Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nudqst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Quest (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nudshf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Shuffle (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4nudup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Up (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4num1 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Number One (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4oldtmr ,0 ,mod4oki ,mpu4 ,m_oldtmr ,ROT0, "Barcrest","Old Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4casot ,m4oldtmr ,mod4oki ,mpu4 ,m_oldtmr ,ROT0, "Barcrest","Casino Old Timer (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // uses the same program??? -GAME(199?, m4blkwht ,m4oldtmr ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black & White (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // uses the same program??? -GAME(199?, m4jpmcla ,m4oldtmr ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","JPM Classic (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // uses the same program??? -GAME(199?, m4omega ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Omega (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ordmnd ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Oriental Diamonds (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4overmn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Over The Moon (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4placbt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Place Your Bets (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4pont ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Pontoon Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4potblk ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Pot Black (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ptblkc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Pot Black Casino (Bwb - Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // main cpu crashes? -GAME(199?, m4potlck ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Pot Luck Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4prem ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Premier (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przdty ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Duty Free (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przfrt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Fruit & Loot (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przhr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize High Roller (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przlux ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Luxor (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przmon ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Money (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przmns ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Money ShowCase (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przmc ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Monte Carlo (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przrf ,0 ,mod2 ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Rich And Famous (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przrfm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Run For Your Money (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przsss ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Spend Spend Spend (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przve ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Viva Esapana (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przwo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize What's On (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4przwta ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Winner Takes All (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4randr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Random Roulette (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rsg ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ready Steady Go (Barcrest) (type 1) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rgsa ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Ready Steady Go (Barcrest) (type 2) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ra ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Red Alert (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rdht ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Heat (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhrc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhrcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rwb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red White & Blue (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4r2r ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel 2 Reel (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rmtp ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Magic Turbo Play (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rmtpd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Magic Turbo Play Deluxe (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4reelpk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Poker (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4reeltm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4richfm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Rich & Famous (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ringfr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ring Of Fire (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhog ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Hog (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhog2 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Road Hog 2 - I'm Back (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rhogc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Hog Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4roadrn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Runner (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rockmn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Rocket Money (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4royjwl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Royal Jewels (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4rfym ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Run For Your Money (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4runawy ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Runaway Trail (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4runawyb,m4runawy ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Runaway Trail (Barcrest) (v1.2?) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4salsa ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Salsa (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4samu ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Samurai (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sayno ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Say No More (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4showtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Show Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4shocm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Showcase Crystal Maze (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4shodf ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Showcase Duty Free (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4silshd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Silver Shadow (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sgrab ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Smash 'n' Grab (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4solsil ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Solid Silver Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sss ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Spend Spend Spend (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(1999, m4squid ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Squids In (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4stakeu ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stake Up Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4str300 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Star Play 300 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4stards ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stardust (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4starbr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stars And Bars (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4steptm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Step Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4stopcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stop the Clock (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sunset ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Sunset Boulevard (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supslt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Supa Slot (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4suptrn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Supatron (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supbj ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Super Blackjack (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supbjc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Super Blackjack Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supbf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Bucks Fizz Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4suphv ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Hyper Viper (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Streak (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4suptub ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Tubes (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4suptwo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Two (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4swpnot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Swap-A-Note (Barcrest) (v3.3) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4swpnota,m4swpnot ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Swap-A-Note (Barcrest) (v3.2) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4taj ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Taj Mahal (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4take5 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Take 5 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4take2 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Take Two (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4takepk ,0 ,mod4oki ,mpu4jackpot8per ,m4default_bigbank ,ROT0, "Barcrest","Take Your Pick (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tpcl ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Take Your Pick Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4techno ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Techno Reel (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toot ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ten Out Of Ten (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ttdia ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ten Ten Do It Again (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tiktak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tic Tak Cash (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toma ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tomahawk (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4topact ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Action (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4topdk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Deck (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4topgr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Gear (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toprn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Run (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4topst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Stop (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toptak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Take (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4topten ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Top Tenner (Barcrest) (type 1) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toptena,m4topten ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Tenner (Barcrest) (type 2) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toplot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top The Lot (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4toptim ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Top Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tricol ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tricolor (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tribnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Triple Bank (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tridic ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Triple Dice (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tropcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tropicana Club (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tupen ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tuppenny Cracker (Barcrest - Bootleg) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tbplay ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Play (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tbreel ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Reel (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tbrldx ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Reel Deluxe (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tutfrt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Tutti Fruity (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4tutcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Tutti Fruity Classic (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m421 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twenty One (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4twilgt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twilight (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4twintm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Twin Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4twist ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twist Again (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4univ ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Universe (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4uuaw ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Up Up and Away (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vegast ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Vegas Strip (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vegastg,m4vegast ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Vegas Strip (Barcrest) [German] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vivaes ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Espana (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vivess ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Espana Showcase (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vivalvd,m4vivalv ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas (Barcrest) [Dutch] (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vivalv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4vivasx ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas Six (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4viz ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viz (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4voodoo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Voodoo 1000 (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4wayin ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Way In (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4whaton ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","What's On (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4wildms ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Wild Mystery (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4wildtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Wild Timer (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4wta ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Winner Takes All (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4ch30 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'CH3 0.1' (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sb5 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'BSB 0.3' (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4stc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'STC 0.1' (Barcrest) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) +GAME(199?, m4gb006 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Games Bond 006 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gbust ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ghost Buster (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4giant ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Giant (Barcrest) [DGI, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gclue ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Give Us A Clue (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gldstr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Gold Strike (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gldgat ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Gate (Barcrest) [DGG, Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gldjok ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Joker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // dutch? +GAME(199?, m4gldnud ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Golden Nudger (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4grbbnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Grab The Bank (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4graff ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Graffiti (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4graffd ,m4graff ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Grafitti (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4grands ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Grandstand Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gnsmk ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Gun Smoke (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hpyjok ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Happy Joker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hijinx ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Hi Jinx (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hirise ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","High Rise (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hiroll ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","High Roller (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hittop ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hit The Top (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4thehit ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","The Hit (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4holdon ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hold On (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4holdtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hold Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hotrod ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Hot Rod (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hypvip ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hypclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Hyper Viper Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4intcep ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Interceptor (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jpgem ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Gems (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jpgemc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Gems Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jpjmp ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jackpot Jump (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jwlcwn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Jewel In the Crown (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jok300 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jokers 300 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jokmil ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jokers Millennium (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jolgem ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Jolly Gems (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // gives WRONG SOUND, NEEDS V1 (can be skipped with 1) (hangs) +GAME(199?, m4joljok ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4joljokd,m4joljok ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4joljokh,m4joljok ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Joker (Barcrest) [Hungarian] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4joltav ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Jolly Taverner (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lastrp ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Las Vegas Strip (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4goodtm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Let The Good Times Roll (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4libty ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Liberty (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lineup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Line Up (Bwb - Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // no sound with any system? +GAME(199?, m4loadmn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Loads A Money (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luck7 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky 7 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luckdv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Devil (Barcrest) [Czech] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luckdvd,m4luckdv ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Devil (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lucklv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Las Vegas (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luckst ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Lucky Strike (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lucksc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Lucky Strike Club (Barcrest) [MPU 4] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luckwb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Lucky Wild Boar (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4luxor ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Luxor (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4madhse ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Mad House (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4magdrg ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Dragon (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maglin ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Liner (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4magrep ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Replay DeLuxe (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4magtbo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Magic Turbo (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4mag7s ,0 ,mod4oki ,mpu4jackpot8per ,m4default_bigbank ,ROT0, "Barcrest","Magnificent 7's (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4makmnt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Make A Mint (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4megbks ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Mega Bucks (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4meglnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Megalink (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4milclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Millionaire's Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4mirage ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Mirage (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4moneym ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Money Maker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4monte ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Monte Carlo (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4multcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Multiplay Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4multwy ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Multiway (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nhtt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","New Hit the Top (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nick ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nickelodeon (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nifty ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nifty Fifty (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nspot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Night Spot Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nile ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Nile Jewels (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudgew ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge A Win (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // no sound with any system? +GAME(199?, m4nudbnk ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Banker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nnww ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Nudge Wink Wink (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nnwwc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Nudge Wink Wink Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudqst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Quest (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudshf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Shuffle (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudup ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Nudge Up (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4num1 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Number One (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4oldtmr ,0 ,mod4oki ,mpu4 ,m_oldtmr ,ROT0, "Barcrest","Old Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4casot ,m4oldtmr ,mod4oki ,mpu4 ,m_oldtmr ,ROT0, "Barcrest","Casino Old Timer (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // uses the same program??? +GAME(199?, m4blkwht ,m4oldtmr ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Black & White (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // uses the same program??? +GAME(199?, m4jpmcla ,m4oldtmr ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","JPM Classic (Old Timer Sound hack?) (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // uses the same program??? +GAME(199?, m4omega ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Omega (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ordmnd ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Oriental Diamonds (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4overmn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Over The Moon (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4placbt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Place Your Bets (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pont ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Pontoon Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4potblk ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Pot Black (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ptblkc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Pot Black Casino (Bwb - Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // main cpu crashes? +GAME(199?, m4potlck ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Pot Luck Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4prem ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Premier (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przdty ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Duty Free (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przfrt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Fruit & Loot (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przhr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize High Roller (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przlux ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Luxor (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przmon ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Money (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przmns ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Money ShowCase (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przmc ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Monte Carlo (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przrf ,0 ,mod2 ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Rich And Famous (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przrfm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Run For Your Money (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przsss ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Spend Spend Spend (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przve ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize Viva Esapana (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przwo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Prize What's On (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4przwta ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Prize Winner Takes All (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4randr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Random Roulette (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rsg ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Ready Steady Go (Barcrest) (type 1) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rgsa ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Ready Steady Go (Barcrest) (type 2) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ra ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Red Alert (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rdht ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Heat (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhrc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhrcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red Hot Roll Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rwb ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Red White & Blue (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4r2r ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel 2 Reel (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rmtp ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Magic Turbo Play (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rmtpd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Magic Turbo Play Deluxe (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4reelpk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Poker (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4reeltm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Reel Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4richfm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Rich & Famous (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ringfr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ring Of Fire (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhog ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Hog (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhog2 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Road Hog 2 - I'm Back (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhogc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Hog Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4roadrn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Road Runner (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rockmn ,0 ,mod4oki ,mpu4jackpot8tkn ,m4default_bigbank ,ROT0, "Barcrest","Rocket Money (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4royjwl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Royal Jewels (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rfym ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Run For Your Money (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4runawy ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Runaway Trail (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4runawyb,m4runawy ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Runaway Trail (Barcrest) (v1.2?) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4salsa ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Salsa (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4samu ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Samurai (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sayno ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Say No More (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4showtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Show Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4shocm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Showcase Crystal Maze (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4shodf ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Showcase Duty Free (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4silshd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Silver Shadow (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sgrab ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Smash 'n' Grab (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4solsil ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Solid Silver Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sss ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Spend Spend Spend (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(1999, m4squid ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Squids In (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4stakeu ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stake Up Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4str300 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Star Play 300 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4stards ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stardust (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4starbr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stars And Bars (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4steptm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Step Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4stopcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Stop the Clock (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sunset ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Sunset Boulevard (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supslt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Supa Slot (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4suptrn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Supatron (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supbj ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Super Blackjack (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supbjc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Super Blackjack Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supbf ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Bucks Fizz Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4suphv ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Hyper Viper (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Streak (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4suptub ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Tubes (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4suptwo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Super Two (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4swpnot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Swap-A-Note (Barcrest) (v3.3) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4swpnota,m4swpnot ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Swap-A-Note (Barcrest) (v3.2) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4taj ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Taj Mahal (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4take5 ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Take 5 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4take2 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Take Two (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4takepk ,0 ,mod4oki ,mpu4jackpot8per ,m4default_bigbank ,ROT0, "Barcrest","Take Your Pick (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tpcl ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Take Your Pick Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4techno ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Techno Reel (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toot ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ten Out Of Ten (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ttdia ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Ten Ten Do It Again (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tiktak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tic Tak Cash (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toma ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tomahawk (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topact ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Action (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topdk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Deck (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topgr ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Gear (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toprn ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Run (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topst ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Stop (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toptak ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Take (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topten ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Top Tenner (Barcrest) (type 1) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toptena,m4topten ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top Tenner (Barcrest) (type 2) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toplot ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Top The Lot (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4toptim ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Top Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tricol ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tricolor (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tribnk ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Triple Bank (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tridic ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Triple Dice (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tropcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tropicana Club (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tupen ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Tuppenny Cracker (Barcrest - Bootleg) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tbplay ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Play (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tbreel ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Reel (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tbrldx ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Turbo Reel Deluxe (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tutfrt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Tutti Fruity (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tutcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Tutti Fruity Classic (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m421 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twenty One (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4twilgt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twilight (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4twintm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Twin Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4twist ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Twist Again (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4univ ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Universe (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4uuaw ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Up Up and Away (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vegast ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Vegas Strip (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vegastg,m4vegast ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Barcrest","Vegas Strip (Barcrest) [German] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vivaes ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Espana (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vivess ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Espana Showcase (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vivalvd,m4vivalv ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas (Barcrest) [Dutch] (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vivalv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vivasx ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Barcrest","Viva Las Vegas Six (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4viz ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Viz (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4voodoo ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Voodoo 1000 (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wayin ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Way In (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4whaton ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","What's On (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wildms ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","Wild Mystery (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wildtm ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Wild Timer (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wta ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","Winner Takes All (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ch30 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'CH3 0.1' (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sb5 ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'BSB 0.3' (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4stc ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Barcrest","unknown MPU4 'STC 0.1' (Barcrest) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Bwb */ /* are all these really MPU4 hw? , check things like Daytona, doesn't boot at all. */ -GAME(199?, m4acechs ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Ace Chase (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigmt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","The Big Match (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bingbl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Belle (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bingbs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Belle Showcase (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bingcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Club (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4blflsh ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Blue Flash (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4blsbys ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Bwb","Blues Boys (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4bluesn ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","Blues Boys (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // German version, still has BWB strings, crashes during boot, but boots by chance the first time? -GAME(199?, m4cshenc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Cash Encounters (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4czne ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Cash Zone (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4csoc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Championship Soccer (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cpycat ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Copy Cat (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cpfinl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Cup Final (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4danced ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Dancing Diamonds (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4daytn ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Daytona (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4excal ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Excalibur (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4exotic ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Exotic Fruits (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4firice ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Fire & Ice (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4flshlt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Flashlite (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4fourmr ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Four More (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // no sound with either system? -GAME(199?, m4harle ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Harlequin (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hvhel ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Heaven & Hell (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4holywd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Hollywood (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4indycr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Indy Cars (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jakjok ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jackpot Jokers (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jakjoka,m4jakjok ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jackpot Jokers (Bwb) (MPU4, alternate)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jflash ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jumping Jack Flash (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4kingq ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Kings & Queens (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4kingqc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Kings & Queens Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4lazy ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Lazy Bones (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4lvlcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Lucky Las Vegas Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ln7 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Lucky No7 (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4madmon ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Mad Money (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4madmnc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Mad Money Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4mmm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Money Mummy Money (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4oadrac ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Ooh Aah Dracula (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4orland ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Orlando Magic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pzbing ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Prize Bingo (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4quidin ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Quids In (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4quidis ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Quids In Showcase (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rackem ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rack Em Up (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rbgold ,0 ,mod2 ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rainbow Gold (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rhfev ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Red Hot Fever (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rhs ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rocky Horror Show (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sinbd ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Sinbad (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sky ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Sky Sports (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4souls ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Soul Sister (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4specu ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Speculator Club (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // no sound with either system -GAME(199?, m4spinbt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Spin The Bottle (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4starst ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Stars & Stripes (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4thestr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","The Streak (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sunclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sun Club (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sunscl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sunset Club (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4supleg ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Super League (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4supscr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Super Soccer (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ssclas ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Super Streak Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sure ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sure Thing (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4tic ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ticcla ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ticgld ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Gold (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ticglc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Gold Classic (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4topdog ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Top Dog (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4trex ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Trex (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4volcan ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Volcano (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4vdexpr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Voodoo Express (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4xch ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-change (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4xs ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-s (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4xtrm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-treme (Bwb) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4acechs ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Ace Chase (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigmt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","The Big Match (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bingbl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Belle (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bingbs ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Belle Showcase (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bingcl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Bingo Club (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blflsh ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Blue Flash (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blsbys ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Bwb","Blues Boys (Bwb) (MPU4)", GAME_FLAGS ) +GAME(199?, m4bluesn ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","Blues Boys (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) // German version, still has BWB strings, crashes during boot, but boots by chance the first time? +GAME(199?, m4cshenc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Cash Encounters (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4czne ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Cash Zone (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4csoc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Championship Soccer (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cpycat ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Copy Cat (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cpfinl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Cup Final (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4danced ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Dancing Diamonds (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4daytn ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Daytona (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4excal ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Excalibur (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4exotic ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Exotic Fruits (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4firice ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Fire & Ice (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4flshlt ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Flashlite (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fourmr ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Four More (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // no sound with either system? +GAME(199?, m4harle ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Harlequin (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hvhel ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Heaven & Hell (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4holywd ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Hollywood (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4indycr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Indy Cars (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jakjok ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jackpot Jokers (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jakjoka,m4jakjok ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jackpot Jokers (Bwb) (MPU4, alternate)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jflash ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Jumping Jack Flash (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4kingq ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Kings & Queens (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4kingqc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Kings & Queens Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lazy ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Lazy Bones (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lvlcl ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Lucky Las Vegas Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ln7 ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Lucky No7 (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4madmon ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Mad Money (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4madmnc ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Mad Money Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4mmm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Money Mummy Money (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4oadrac ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Ooh Aah Dracula (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4orland ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Orlando Magic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pzbing ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Prize Bingo (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4quidin ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Quids In (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4quidis ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Quids In Showcase (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rackem ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rack Em Up (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rbgold ,0 ,mod2 ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rainbow Gold (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhfev ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Red Hot Fever (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rhs ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Rocky Horror Show (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sinbd ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Sinbad (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sky ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Sky Sports (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4souls ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Soul Sister (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4specu ,0 ,mod4yam ,mpu4 ,m4default ,ROT0, "Bwb","Speculator Club (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // no sound with either system +GAME(199?, m4spinbt ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Spin The Bottle (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4starst ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Stars & Stripes (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4thestr ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","The Streak (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sunclb ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sun Club (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sunscl ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sunset Club (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supleg ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Super League (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supscr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Super Soccer (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ssclas ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Super Streak Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sure ,0 ,mod2 ,mpu4 ,m4default ,ROT0, "Bwb","Sure Thing (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tic ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ticcla ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ticgld ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Gold (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ticglc ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Tic Tac Toe Gold Classic (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4topdog ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Top Dog (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4trex ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Bwb","Trex (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4volcan ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Volcano (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vdexpr ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","Voodoo Express (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4xch ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-change (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4xs ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-s (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4xtrm ,0 ,mod4oki ,mpu4 ,m4default_bigbank ,ROT0, "Bwb","X-treme (Bwb) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Concept most of these are rebuilds of other firm's games, often using the OKI chip to simulate MOD2 sound*/ -GAME(199?, m4rhfevc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Red Hot Fever (Concept Games Ltd) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME(199?, m4nudgwc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Nudge-A-Win (Concept Games Ltd) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME(199?, m4pulwnc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Pull-A-Win (Concept Games Ltd)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME(199?, m4spnwnc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Spin-A-Win (Concept Games Ltd) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME(199?, m4rhfevc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Red Hot Fever (Concept Games Ltd) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME(199?, m4nudgwc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Nudge-A-Win (Concept Games Ltd) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME(199?, m4pulwnc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Pull-A-Win (Concept Games Ltd)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME(199?, m4spnwnc , 0 ,mod4oki ,mpu4 ,m4default ,ROT0,"Concept Games Ltd","Spin-A-Win (Concept Games Ltd) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) /* Empire most of these boot (after a single reset to initialize) but have broken text, need to check VFD emulation */ -GAME(199?, m4apachg, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachga, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachgb, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachgc, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachgd, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachge, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4apachgf, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bangrs, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bangrsa, m4bangrs, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bangrsb, m4bangrs, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bankrd, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bankrda, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bankrdb, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bankrdc, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bankrdd, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigchs, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigchsa, m4bigchs, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigchsb, m4bigchs, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cstrik, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cstrika, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cstrikb, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cstrikc, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chacec, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Cards] (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chaceca, m4chacec, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Cards] (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chacef, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chacefa, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chacefb, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4chacefc, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzcap, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzcapa, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzcapb, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzcapc, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crfire, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Crossfire (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4crfirea, m4crfire, mod4oki, mpu4, m4default, ROT0, "Empire","Crossfire (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4eureka, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4eurekaa, m4eureka, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4eurekab, m4eureka, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4fright, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1X)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frighta, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frightb, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1i)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frightc, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v?.?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // bad dump -GAME(199?, m4frightd, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v3.3)",GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frighte, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v3.0)",GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gamblr, 0, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gamblra, m4gamblr, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gamblrb, m4gamblr, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gtrain, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gtraina, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gtrainb, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gtrainc, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4goldfv, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Gold Fever (Empire) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4haunt, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4haunta, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hauntb, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hauntc, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hauntd, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4haunte, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprt, 0, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprta, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprtb, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprtc, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprtd, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hisprte, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hotcsh, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hotcsha, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hotcshb, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hotcshc, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4monspn, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4monspna, m4monspn, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4monspnb, m4monspn, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pbnudg, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pbnudga, m4pbnudg, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pbnudgb, m4pbnudg, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pitfal, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4pitfala, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4pitfalb, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4pitfalc, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, alarm -GAME(199?, m4ttrail, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ttraila,m4ttrail, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ttrailb,m4ttrail, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4apachg, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachga, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachgb, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachgc, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachgd, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachge, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4apachgf, m4apachg, mod4oki, mpu4, m4default, ROT0, "Empire","Apache Gold (Empire) (MPU4, set 7)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bangrs, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bangrsa, m4bangrs, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bangrsb, m4bangrs, mod4oki, mpu4, m4default, ROT0, "Empire","Bangers 'n' Cash (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bankrd, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bankrda, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bankrdb, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bankrdc, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bankrdd, m4bankrd, mod4oki, mpu4, m4default, ROT0, "Empire","Bank Raid (Empire) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigchs, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigchsa, m4bigchs, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigchsb, m4bigchs, mod4oki, mpu4, m4default, ROT0, "Empire","Big Cheese (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cstrik, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cstrika, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cstrikb, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cstrikc, m4cstrik, mod4oki, mpu4, m4default, ROT0, "Empire","Cash Strike (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chacec, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Cards] (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chaceca, m4chacec, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Cards] (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chacef, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chacefa, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chacefb, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4chacefc, m4chacef, mod4oki, mpu4, m4default, ROT0, "Empire","Chase The Ace [Fruits] (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcap, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcapa, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcapb, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcapc, m4crzcap, mod4oki, mpu4, m4default, ROT0, "Empire","Crazy Capers (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crfire, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Crossfire (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4crfirea, m4crfire, mod4oki, mpu4, m4default, ROT0, "Empire","Crossfire (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4eureka, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4eurekaa, m4eureka, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4eurekab, m4eureka, mod4oki, mpu4, m4default, ROT0, "Empire","Eureka (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fright, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1X)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frighta, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frightb, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v4.1i)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frightc, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v?.?)", GAME_FLAGS|GAME_NO_SOUND ) // bad dump +GAME(199?, m4frightd, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v3.3)",GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frighte, m4fright, mod4oki, mpu4, m4default, ROT0, "Empire","Fright Night (Empire) (MPU4, v3.0)",GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gamblr, 0, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gamblra, m4gamblr, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gamblrb, m4gamblr, mod4oki, mpu4, m4default, ROT0, "Empire","The Gambler (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gtrain, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gtraina, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gtrainb, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gtrainc, m4gtrain, mod4oki, mpu4, m4default, ROT0, "Empire","Ghost Train (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4goldfv, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Gold Fever (Empire) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4haunt, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4haunta, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hauntb, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hauntc, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hauntd, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4haunte, m4haunt, mod4oki, mpu4, m4default, ROT0, "Empire","Haunted House (Empire) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprt, 0, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprta, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprtb, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprtc, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprtd, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hisprte, m4hisprt, mod4oki, mpu4, m4default, ROT0, "Empire","High Spirits (Empire) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hotcsh, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hotcsha, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hotcshb, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hotcshc, m4hotcsh, mod4oki, mpu4, m4default, ROT0, "Empire","Hot Cash (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4monspn, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4monspna, m4monspn, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4monspnb, m4monspn, mod4oki, mpu4, m4default, ROT0, "Empire","Money Spinner (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pbnudg, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pbnudga, m4pbnudg, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pbnudgb, m4pbnudg, mod4oki, mpu4, m4default, ROT0, "Empire","Pinball Nudger (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pitfal, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4pitfala, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4pitfalb, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4pitfalc, m4pitfal, mod4oki, mpu4, m4default, ROT0, "Empire","Pitfall (Empire) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, alarm +GAME(199?, m4ttrail, 0, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ttraila,m4ttrail, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ttrailb,m4ttrail, mod4oki, mpu4, m4default, ROT0, "Empire","Treasure Trail (Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't seem like the other Empire games (starts with RESETTING JNE, licensed, mislabeled?) //Looks like the only one to have a proper protection routine, too so I'm guessing it's just a game they distributed, rather than made themselves -GAME(199?, m4jne, 0, mod4oki, mpu4, m4default, ROT0, "Empire","The Jackpot's Not Enough (Empire) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4jne, 0, mod4oki, mpu4, m4default, ROT0, "Empire","The Jackpot's Not Enough (Empire) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* MDM most of these boot and act similar to the Empire games (ie bad text, but run OK) */ -GAME(199?, m42punlm, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","2p Unlimited (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4silnud, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","Silver Nudger (Mdm?) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // code is close to 2p Unlimited, same sound rom -GAME(199?, m4nud2p, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","2p Nudger (Mdm?) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // code is close to 2p Unlimited, same sound rom -GAME(199?, m4ctn, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","Tuppenny Nudger Classic (Mdm?) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // code is close to 2p Unlimited, same sound rom -GAME(199?, m4bigapl, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigapla, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigaplb, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigaplc, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigapld, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigaple, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4blztrl, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Blazing Trails (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4blztrla, m4blztrl, mod4oki, mpu4, m4default, ROT0, "Mdm","Blazing Trails (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bodymt, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Body Match (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // doesn't boot, various alarms -GAME(199?, m4coloss, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossa, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossb, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossc, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossd, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colosse, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossf, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4colossg, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4firebl, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // hangs after spin (sound status?) -GAME(199?, m4firebla, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // hangs after spin (sound status?) -GAME(199?, m4fireblb, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // hangs after spin (sound status?) -GAME(199?, m4fireblc, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // hangs after spin (sound status?) -GAME(199?, m4firebld, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // hangs after spin (sound status?) -GAME(199?, m4mayhem, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Mayhem (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4mayhema, m4mayhem, mod4oki, mpu4, m4default, ROT0, "Mdm","Mayhem (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4themob, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4themoba, m4themob, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4themobb, m4themob, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4nudbon, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Nudge Bonanza (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4nudbona, m4nudbon, mod2 ,mpu4, m4default, ROT0, "Mdm","Nudge Bonanza (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4nudgem, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Nudge Gems (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4smshgb, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4smshgba,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4smshgbb,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4smshgbc,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4snklad, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Snakes & Ladders (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m42punlm, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","2p Unlimited (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4silnud, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","Silver Nudger (Mdm?) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // code is close to 2p Unlimited, same sound rom +GAME(199?, m4nud2p, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","2p Nudger (Mdm?) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // code is close to 2p Unlimited, same sound rom +GAME(199?, m4ctn, 0, mod4oki, mpu4, m4default, ROT0, "Mdm?","Tuppenny Nudger Classic (Mdm?) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // code is close to 2p Unlimited, same sound rom +GAME(199?, m4bigapl, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigapla, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigaplb, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigaplc, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigapld, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigaple, m4bigapl, mod4oki, mpu4, m4default, ROT0, "Mdm","The Big Apple (Mdm) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blztrl, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Blazing Trails (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blztrla, m4blztrl, mod4oki, mpu4, m4default, ROT0, "Mdm","Blazing Trails (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bodymt, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Body Match (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // doesn't boot, various alarms +GAME(199?, m4coloss, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossa, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossb, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossc, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossd, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colosse, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossf, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 7)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4colossg, m4coloss, mod4oki, mpu4, m4default, ROT0, "Mdm","Colossus (Mdm) (MPU4, set 8)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4firebl, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) // hangs after spin (sound status?) +GAME(199?, m4firebla, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) // hangs after spin (sound status?) +GAME(199?, m4fireblb, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) // hangs after spin (sound status?) +GAME(199?, m4fireblc, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) // hangs after spin (sound status?) +GAME(199?, m4firebld, m4firebl, mod2 ,mpu4, m4default, ROT0, "Mdm","Fireball (Mdm) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) // hangs after spin (sound status?) +GAME(199?, m4mayhem, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Mayhem (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4mayhema, m4mayhem, mod4oki, mpu4, m4default, ROT0, "Mdm","Mayhem (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4themob, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4themoba, m4themob, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4themobb, m4themob, mod4oki, mpu4, m4default, ROT0, "Mdm","The Mob (Mdm) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudbon, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Nudge Bonanza (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudbona, m4nudbon, mod2 ,mpu4, m4default, ROT0, "Mdm","Nudge Bonanza (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudgem, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Nudge Gems (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4smshgb, 0, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4smshgba,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4smshgbb,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4smshgbc,m4smshgb, mod4oki, mpu4, m4default, ROT0, "Mdm","Smash 'n' Grab (Mdm) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4snklad, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Snakes & Ladders (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Pcp */ -GAME(199?, m4cshino ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Cashino Deluxe (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4jjc ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Jumping Jack Cash (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4spton ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Spot On (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4clbrpl ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Club Replay (PCP) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) // was also marked as a barcrest set? -GAME(199?, m4exlin ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Extra Lines (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4supjst ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Super Jester (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) +GAME(199?, m4cshino ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Cashino Deluxe (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jjc ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Jumping Jack Cash (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4spton ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Spot On (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4clbrpl ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Club Replay (PCP) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // was also marked as a barcrest set? +GAME(199?, m4exlin ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Extra Lines (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supjst ,0, mod2 ,mpu4, m4default, ROT0, "Pcp","Super Jester (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Nova - German licensed Barcrest / Bwb sets? */ -GAME(199?, m4bigban ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Big Bandit (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crzcsn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Crazy Casino (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4crzcav ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Crazy Cavern (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4dragon ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Dragon (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4hilonv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Hi Lo Casino (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4octo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Octopus (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) -GAME(199?, m4sctagt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Secret Agent (Nova) (MPU4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK ) +GAME(199?, m4bigban ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Big Bandit (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcsn ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Crazy Casino (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcav ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Crazy Cavern (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dragon ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Dragon (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hilonv ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Hi Lo Casino (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4octo ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Octopus (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sctagt ,0 ,mod4oki ,mpu4 ,m4default ,ROT0, "Nova","Secret Agent (Nova) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Union these don't boot, at best you get a 'CLEAR' message */ -GAME(199?, m4cwalk, 0, mod4oki, mpu4, m4default, ROT0, "Union","Cake Walk (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4eezee, 0, mod4oki, mpu4, m4default, ROT0, "Union","Eezee Fruits (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frdrop, 0, mod4oki, mpu4, m4default, ROT0, "Union","Fruit Drop (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gobana, 0, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gobanaa, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gobanab, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gobanac, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gobanad, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4lotty, 0, mod2 ,mpu4, m4default, ROT0, "Union","Lotty Time (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4maxmze, 0, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4maxmzea, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4maxmzeb, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4maxmzec, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4maxmzed, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4mecca, 0, mod2 ,mpu4, m4default, ROT0, "Union","Mecca Money (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4purmad, 0, mod4oki, mpu4, m4default, ROT0, "Union","Pure Madness (Union)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4revolv, 0, mod4oki, mpu4, m4default, ROT0, "Union","Revolva (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rotex, 0, mod4oki, mpu4, m4default, ROT0, "Union","Rotex (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4select, 0, mod4oki, mpu4, m4default, ROT0, "Union","Select (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4supfru, 0, mod4oki, mpu4, m4default, ROT0, "Union","Supafruits (Union) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4supfrua,m4supfru, mod4oki, mpu4, m4default, ROT0, "Union","Supafruits (Union) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4trimad, 0, mod4oki, mpu4, m4default, ROT0, "Union","Triple Madness (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4unibox, 0, mod4oki, mpu4, m4default, ROT0, "Union","Unibox (Union) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4uniboxa,m4unibox, mod4oki, mpu4, m4default, ROT0, "Union","Unibox (Union) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4unique, 0, mod4oki, mpu4, m4default, ROT0, "Union","Unique (Union) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4uniquep,m4unique, mod4oki, mpu4, m4default, ROT0, "Union","Unique (Union) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzbn, 0, mod4oki, mpu4, m4default, ROT0, "Union","Crazy Bingo (Union) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4cwalk, 0, mod4oki, mpu4, m4default, ROT0, "Union","Cake Walk (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4eezee, 0, mod4oki, mpu4, m4default, ROT0, "Union","Eezee Fruits (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frdrop, 0, mod4oki, mpu4, m4default, ROT0, "Union","Fruit Drop (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gobana, 0, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gobanaa, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gobanab, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gobanac, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gobanad, m4gobana, mod2 ,mpu4, m4default, ROT0, "Union","Go Bananas (Union) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lotty, 0, mod2 ,mpu4, m4default, ROT0, "Union","Lotty Time (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maxmze, 0, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maxmzea, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maxmzeb, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maxmzec, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4maxmzed, m4maxmze, mod2 ,mpu4, m4default, ROT0, "Union","Maximize (Union) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4mecca, 0, mod2 ,mpu4, m4default, ROT0, "Union","Mecca Money (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4purmad, 0, mod4oki, mpu4, m4default, ROT0, "Union","Pure Madness (Union)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4revolv, 0, mod4oki, mpu4, m4default, ROT0, "Union","Revolva (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rotex, 0, mod4oki, mpu4, m4default, ROT0, "Union","Rotex (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4select, 0, mod4oki, mpu4, m4default, ROT0, "Union","Select (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supfru, 0, mod4oki, mpu4, m4default, ROT0, "Union","Supafruits (Union) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4supfrua,m4supfru, mod4oki, mpu4, m4default, ROT0, "Union","Supafruits (Union) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4trimad, 0, mod4oki, mpu4, m4default, ROT0, "Union","Triple Madness (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4unibox, 0, mod4oki, mpu4, m4default, ROT0, "Union","Unibox (Union) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4uniboxa,m4unibox, mod4oki, mpu4, m4default, ROT0, "Union","Unibox (Union) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4unique, 0, mod4oki, mpu4, m4default, ROT0, "Union","Unique (Union) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4uniquep,m4unique, mod4oki, mpu4, m4default, ROT0, "Union","Unique (Union) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzbn, 0, mod4oki, mpu4, m4default, ROT0, "Union","Crazy Bingo (Union) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Union + Empire same as Union above */ -GAME(199?, m4gvibes, 0, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Good Vibrations (Union - Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4gvibesa, m4gvibes, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Good Vibrations (Union - Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rckrol, 0, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rckrola, m4rckrol, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rckrolb, m4rckrol, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4gvibes, 0, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Good Vibrations (Union - Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4gvibesa, m4gvibes, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Good Vibrations (Union - Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rckrol, 0, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rckrola, m4rckrol, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rckrolb, m4rckrol, mod4oki, mpu4, m4default, ROT0, "Union / Empire","Rock 'n' Roll (Union - Empire) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) /* Others */ -GAME(199?, m4aao, 0, mod4oki, mpu4, m4default, ROT0, "Eurotek","Against All Odds (Eurotek) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bandgd, 0, mod4oki, mpu4, m4default, ROT0, "Eurogames","Bands Of Gold (Eurogames) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bangin, 0, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bangina, m4bangin, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4banginb, m4bangin, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4wwc, 0, mod4oki, mpu4, m4default, ROT0, "Global","Wacky Weekend Club (Global) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4screw, 0, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.8)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4screwp, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.8) (Protocol)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4screwa, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.7)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4screwb, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4vfm, 0, mod4oki, mpu4, m4default, ROT0, "Global","Value For Money (Global) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigben, 0, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigbena, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigbenb, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigbenc, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigbend, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 5)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bigbene, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 6)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4kqclub, 0, mod2 ,mpu4, m4default, ROT0, "Newby","Kings & Queens Club (Newby) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4snookr, 0, mod2 ,mpu4, m4default, ROT0, "Eurocoin","Snooker (Eurocoin) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // works? -GAME(199?, m4spnwin, 0, mod2 ,mpu4, m4default, ROT0, "Cotswold Microsystems","Spin A Win (Cotswold Microsystems) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // works? -GAME(199?, m4stakex, 0, mod4oki, mpu4, m4default, ROT0, "Leisurama","Stake X (Leisurama) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // can't coin, no sound -GAME(199?, m4stakexa, m4stakex, mod4oki, mpu4, m4default, ROT0, "Leisurama","Stake X (Leisurama) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // works? -GAME(199?, m4sstrek, 0, mod2 ,mpu4, m4default, ROT0, "bootleg","Super Streak (bootleg) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // works?, no sound -GAME(199?, m4boltbl, 0, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4boltbla, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4boltblb, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4boltblc, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4dblchn, 0, mod4oki, mpu4, m4default, ROT0, "DJE","Double Chance (DJE) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4stand2, 0, mod2 ,mpu4, m4default, ROT0, "DJE","Stand To Deliver (DJE) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4aao, 0, mod4oki, mpu4, m4default, ROT0, "Eurotek","Against All Odds (Eurotek) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bandgd, 0, mod4oki, mpu4, m4default, ROT0, "Eurogames","Bands Of Gold (Eurogames) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bangin, 0, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bangina, m4bangin, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4banginb, m4bangin, mod4oki, mpu4, m4default, ROT0, "Global","Bangin' Away (Global) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wwc, 0, mod4oki, mpu4, m4default, ROT0, "Global","Wacky Weekend Club (Global) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4screw, 0, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.8)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4screwp, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.8) (Protocol)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4screwa, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.7)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4screwb, m4screw, mod4oki, mpu4, m4default, ROT0, "Global","Screwin' Around (Global) (MPU4, v0.5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4vfm, 0, mod4oki, mpu4, m4default, ROT0, "Global","Value For Money (Global) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigben, 0, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigbena, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigbenb, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigbenc, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigbend, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 5)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bigbene, m4bigben, mod4oki, mpu4, m4default, ROT0, "Coinworld","Big Ben (Coinworld) (MPU4, set 6)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4kqclub, 0, mod2 ,mpu4, m4default, ROT0, "Newby","Kings & Queens Club (Newby) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4snookr, 0, mod2 ,mpu4, m4default, ROT0, "Eurocoin","Snooker (Eurocoin) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // works? +GAME(199?, m4spnwin, 0, mod2 ,mpu4, m4default, ROT0, "Cotswold Microsystems","Spin A Win (Cotswold Microsystems) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // works? +GAME(199?, m4stakex, 0, mod4oki, mpu4, m4default, ROT0, "Leisurama","Stake X (Leisurama) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) // can't coin, no sound +GAME(199?, m4stakexa, m4stakex, mod4oki, mpu4, m4default, ROT0, "Leisurama","Stake X (Leisurama) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) // works? +GAME(199?, m4sstrek, 0, mod2 ,mpu4, m4default, ROT0, "bootleg","Super Streak (bootleg) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // works?, no sound +GAME(199?, m4boltbl, 0, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4boltbla, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4boltblb, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4boltblc, m4boltbl, mod2 ,mpu4, m4default, ROT0, "DJE","Bolt From The Blue (DJE) (MPU4, set 4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dblchn, 0, mod4oki, mpu4, m4default, ROT0, "DJE","Double Chance (DJE) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4stand2, 0, mod2 ,mpu4, m4default, ROT0, "DJE","Stand To Deliver (DJE) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* Unknown stuff that looks like it might be MPU4, but needs further verification, some could be bad */ -GAME(199?, m4barcrz , 0, mod4oki ,mpu4, m4default, ROT0, "","Bar Crazy (unknown) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bonzbn , 0, mod4oki ,mpu4, m4default, ROT0, "","Bingo Bonanza (unknown) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cld02 , 0, mod4oki ,mpu4, m4default, ROT0, "","unknown MPU4 'CLD 0.2C' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4dnj , 0, mod4oki ,mpu4, m4default, ROT0, "","Double Nudge (unknown) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4matdr , 0, mod4oki ,mpu4, m4default, ROT0, "","Matador (unknown) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ttak , 0, mod2 ,mpu4, m4default, ROT0, "","Tic Tac Take (unknown) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hslo , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'HOT 3.0' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4unkjok , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'Joker' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4remag , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'ZTP 0.7' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rmg , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'CTP 0.4' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4wnud , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'W Nudge' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4t266 , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'TTO 1.1' (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4brnze , 0, mod4oki, mpu4, m4default, ROT0, "","Bronze Voyage (unknown) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4riotrp , 0, mod4oki, mpu4, m4default, ROT0, "","Rio Tropico (unknown) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4barcrz , 0, mod4oki ,mpu4, m4default, ROT0, "","Bar Crazy (unknown) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bonzbn , 0, mod4oki ,mpu4, m4default, ROT0, "","Bingo Bonanza (unknown) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cld02 , 0, mod4oki ,mpu4, m4default, ROT0, "","unknown MPU4 'CLD 0.2C' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dnj , 0, mod4oki ,mpu4, m4default, ROT0, "","Double Nudge (unknown) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4matdr , 0, mod4oki ,mpu4, m4default, ROT0, "","Matador (unknown) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ttak , 0, mod2 ,mpu4, m4default, ROT0, "","Tic Tac Take (unknown) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hslo , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'HOT 3.0' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4unkjok , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'Joker' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4remag , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'ZTP 0.7' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rmg , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'CTP 0.4' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wnud , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'W Nudge' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4t266 , 0, mod2 ,mpu4, m4default, ROT0, "","unknown MPU4 'TTO 1.1' (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4brnze , 0, mod4oki, mpu4, m4default, ROT0, "","Bronze Voyage (unknown) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4riotrp , 0, mod4oki, mpu4, m4default, ROT0, "","Rio Tropico (unknown) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) /* *if* these are MPU4 they have a different sound system at least - The copyright strings in them are 'AET' tho (Ace?) - Could be related to the Crystal stuff? */ -GAME(199?, m4sbx , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Super Bear X (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bclimb , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Bear Climber (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4captb , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Captain Bear (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jungj , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Jungle Japes (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4fsx , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Fun Spot X (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ccop , 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Cash Cops (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ccc , 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Criss Cross Crazy (Coinworld) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4treel , 0, mod2 ,mpu4, m4default, ROT0, "Jpm","Turbo Reels (Jpm) (MPU4?)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) +GAME(199?, m4sbx , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Super Bear X (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bclimb , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Bear Climber (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4captb , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Captain Bear (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jungj , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Jungle Japes (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fsx , 0, mpu4crys ,mpu4, m_frkstn, ROT0, "AET/Coinworld","Fun Spot X (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ccop , 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Cash Cops (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ccc , 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Criss Cross Crazy (Coinworld) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4treel , 0, mod2 ,mpu4, m4default, ROT0, "Jpm","Turbo Reels (Jpm) (MPU4?)", GAME_FLAGS|GAME_NO_SOUND ) -GAME(199?, m4frkstn ,0 ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 1)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frkstna,m4frkstn ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 2)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frkstnb,m4frkstn ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 3)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // this set is encrypted -GAME(199?, m4aladn ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Aladdin's Cave (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bagcsh ,0 ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Bags Of Cash Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bucclb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Buccaneer Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4bullio ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Bullion Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4carou ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Carousel Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cclimb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Climber (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzcl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Climber Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4crzclc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Club Climber (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4elitc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Elite Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4fairg ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Fairground (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4frmani ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Fruit Mania (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4goldxc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Gold Exchange Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4goldfc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Gold Fever (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hirol ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Hi Roller Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4kingqn ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Kings & Queens Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4lotclb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Lottery Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4montrl ,0 ,mpu4crys ,mpu4 ,crystali, ROT0, "Crystal","Money Trail (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // encryption is inverted! -GAME(199?, m4mystiq ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Mystique Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4nudwin ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Nudge & Win (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4paracl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Paradise Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4rlpick ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Reel Picks (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4twstr ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Twister (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4twstcl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Twister Club (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4dz ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Danger Zone (Crystal) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4tylb ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Thank Your Lucky Bars (Crystal) (MPU4)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, m4magi7 ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Magic 7's (Crystal) (MPU4)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, m4rags ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Rags To Riches Club (Crystal) (MPU4)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, m4riocr ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Rio Grande (Crystal) (MPU4)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME(199?, m4ndup ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Nudge Double Up Deluxe (Crystal) (MPU4)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME(199?, m4frkstn ,0 ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 1)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frkstna,m4frkstn ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 2)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frkstnb,m4frkstn ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Frank 'n' Stein (Crystal) (MPU4, set 3)", GAME_FLAGS|GAME_NO_SOUND ) // this set is encrypted +GAME(199?, m4aladn ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Aladdin's Cave (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bagcsh ,0 ,mpu4crys ,mpu4 ,m_frkstn, ROT0, "Crystal","Bags Of Cash Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bucclb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Buccaneer Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4bullio ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Bullion Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4carou ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Carousel Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cclimb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Climber (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzcl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Climber Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4crzclc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Crazy Club Climber (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4elitc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Elite Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4fairg ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Fairground (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4frmani ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Fruit Mania (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4goldxc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Gold Exchange Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4goldfc ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Gold Fever (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hirol ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Hi Roller Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4kingqn ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Kings & Queens Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4lotclb ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Lottery Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4montrl ,0 ,mpu4crys ,mpu4 ,crystali, ROT0, "Crystal","Money Trail (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // encryption is inverted! +GAME(199?, m4mystiq ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Mystique Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4nudwin ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Nudge & Win (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4paracl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Paradise Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4rlpick ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Reel Picks (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4twstr ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Twister (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4twstcl ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Twister Club (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4dz ,0 ,mpu4crys ,mpu4 ,crystal, ROT0, "Crystal","Danger Zone (Crystal) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4tylb ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Thank Your Lucky Bars (Crystal) (MPU4)",GAME_FLAGS|GAME_NO_SOUND|GAME_MECHANICAL ) +GAME(199?, m4magi7 ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Magic 7's (Crystal) (MPU4)",GAME_FLAGS|GAME_NO_SOUND|GAME_MECHANICAL ) +GAME(199?, m4rags ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Rags To Riches Club (Crystal) (MPU4)",GAME_FLAGS|GAME_NO_SOUND|GAME_MECHANICAL ) +GAME(199?, m4riocr ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Rio Grande (Crystal) (MPU4)",GAME_FLAGS|GAME_NO_SOUND|GAME_MECHANICAL ) +GAME(199?, m4ndup ,0 ,mod4oki ,mpu4 ,m4default, ROT0, "Crystal","Nudge Double Up Deluxe (Crystal) (MPU4)",GAME_FLAGS|GAME_NO_SOUND|GAME_MECHANICAL ) //SWP GAMEL(1989?, m4conn4, 0, mod2 , connect4, connect4, ROT0, "Dolbeck Systems","Connect 4",GAME_IMPERFECT_GRAPHICS|GAME_REQUIRES_ARTWORK,layout_connect4 ) -GAME(199?, m4surf, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Super Surfin' (Gemini) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4wife, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Money Or Yer Wife (Gemini) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4blkgd, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Black Gold (Gemini) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4excam, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Excalibur (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4front, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Final Frontier (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4pick, 0, mod2 ,mpu4, m4default, ROT0, "Jpm","Pick A Fruit (Jpm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4safar, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Safari Club (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4zill, 0, mod4oki ,mpu4, m4default, ROT0, "Pure Leisure","Zillionare's Challenge (Pure Leisure) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) - -GAME(199?, m4snowbl, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Snowball Bingo (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hstr, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Happy Streak (Coinworld) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hstrcs, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Casino Happy Streak (Coinworld) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4ddb, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Ding Dong Bells (Coinworld) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4hapfrt, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Happy Fruits (Coinworld) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) - -GAME(199?, m4frcrak, 0, mod2 ,mpu4, m4default, ROT0, "Pcp","Fruit Cracker (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) - -GAME(199?, m4ewshft, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Each Way Shifter (Mdm) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jiggin, 0, mod4oki ,mpu4, m4default, ROT0, "Global","Jiggin' In The Riggin' (Global) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4sunday, 0, mod4oki ,mpu4, m4default, ROT0, "Pcp","Sunday Sport (Pcp) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4jp777, 0, mod4oki ,mpu4, m4default, ROT0, "Cotswold Microsystems","Jackpot 777 (Cotswold Microsystems) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4booze, 0, mod4oki ,mpu4, m4default, ROT0, "Extreme","Booze Cruise (Extreme) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) -GAME(199?, m4cbing, 0, mod4oki ,mpu4, m4default, ROT0, "Redpoint Systems","Cherry Bingo (Redpoint Systems) (MPU4)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_NO_SOUND ) // custom sound system +GAME(199?, m4surf, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Super Surfin' (Gemini) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4wife, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Money Or Yer Wife (Gemini) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4blkgd, 0, mod4oki ,mpu4, m4default, ROT0, "Gemini","Black Gold (Gemini) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4excam, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Excalibur (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4front, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Final Frontier (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4pick, 0, mod2 ,mpu4, m4default, ROT0, "Jpm","Pick A Fruit (Jpm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4safar, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Safari Club (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4zill, 0, mod4oki ,mpu4, m4default, ROT0, "Pure Leisure","Zillionare's Challenge (Pure Leisure) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) + +GAME(199?, m4snowbl, 0, mod2 ,mpu4, m4default, ROT0, "Mdm","Snowball Bingo (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hstr, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Happy Streak (Coinworld) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hstrcs, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Casino Happy Streak (Coinworld) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4ddb, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Ding Dong Bells (Coinworld) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4hapfrt, 0, mod4oki ,mpu4, m4default, ROT0, "Coinworld","Happy Fruits (Coinworld) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) + +GAME(199?, m4frcrak, 0, mod2 ,mpu4, m4default, ROT0, "Pcp","Fruit Cracker (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) + +GAME(199?, m4ewshft, 0, mod4oki ,mpu4, m4default, ROT0, "Mdm","Each Way Shifter (Mdm) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jiggin, 0, mod4oki ,mpu4, m4default, ROT0, "Global","Jiggin' In The Riggin' (Global) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4sunday, 0, mod4oki ,mpu4, m4default, ROT0, "Pcp","Sunday Sport (Pcp) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4jp777, 0, mod4oki ,mpu4, m4default, ROT0, "Cotswold Microsystems","Jackpot 777 (Cotswold Microsystems) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4booze, 0, mod4oki ,mpu4, m4default, ROT0, "Extreme","Booze Cruise (Extreme) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) +GAME(199?, m4cbing, 0, mod4oki ,mpu4, m4default, ROT0, "Redpoint Systems","Cherry Bingo (Redpoint Systems) (MPU4)", GAME_FLAGS|GAME_NO_SOUND ) // custom sound system -GAME( 1986, m4supsl , 0 , mod2, mpu4, m4default , ROT0, "", "Supa Silva (Bellfruit?) (MPU4)", GAME_NOT_WORKING|GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK ) -GAME( 199?, m4nod , 0 , mod4oki , mpu4 , m4default , 0, "Eurotech", "Nod And A Wink (Eurotech) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data? +GAME( 1986, m4supsl , 0 , mod2, mpu4, m4default , ROT0, "", "Supa Silva (Bellfruit?) (MPU4)", GAME_FLAGS|GAME_SUPPORTS_SAVE ) +GAME( 199?, m4nod , 0 , mod4oki , mpu4 , m4default , 0, "Eurotech", "Nod And A Wink (Eurotech) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) // this has valid strings in it BEFORE the bfm decode, but decodes to valid code, does it use some funky mapping, or did they just fill unused space with valid looking data? -GAME( 199?, m4dcrls , 0 , mod4oki , mpu4 , m4default , 0, "Mazooma", "Double Crazy Reels (Mazooma) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, m4dcrls , 0 , mod4oki , mpu4 , m4default , 0, "Mazooma", "Double Crazy Reels (Mazooma) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) // not sure about several of the nova ones -GAME( 199?, m4aliz , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "AlizBaz (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4c2 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Circus Circus 2 (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4coney , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Coney Island (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4cfinln , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Cup Final (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4dcrazy , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "D' Crazy Reels (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4goldnn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Golden Years (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4jungjk , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Jungle Jackpots (Mazooma - Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4clab , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Cash Lab (Mazooma - Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4looplt , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Loop The Loot (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4mgpn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Monaco Grand Prix (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4olygn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Olympic Gold (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4rhnote , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Notes (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4rhrock , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Rocks (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4rhwhl , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Wheels (Mazooma - Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4rdeal , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Reel Deal (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4shoknr , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Shock 'n' Roll (Mazooma - Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4shkwav , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Shockwave (Mazooma - Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbdn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbd2 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe 2 (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbd3 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe 3 (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbdd , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe [Wall Mount] (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbdj , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Jackpot Link] (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbdl , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Jackpot Link] [Wall Mount] (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sinbdw , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Wall Mount] (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4spotln , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Spotlight (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4sdquid , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Sundance Quid (Qps) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4tornad , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Tornado (Qps - Mazooma) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4vivan , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Viva Las Vegas (Nova) (MPU4)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 199?, m4ftladn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Find the Lady (Nova)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 199?, m4aliz , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "AlizBaz (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4c2 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Circus Circus 2 (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4coney , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Coney Island (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4cfinln , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Cup Final (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4dcrazy , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "D' Crazy Reels (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4goldnn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Golden Years (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4jungjk , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Jungle Jackpots (Mazooma - Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4clab , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Cash Lab (Mazooma - Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4looplt , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Loop The Loot (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4mgpn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Monaco Grand Prix (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4olygn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Olympic Gold (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4rhnote , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Notes (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4rhrock , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Rocks (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4rhwhl , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Red Hot Wheels (Mazooma - Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4rdeal , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Reel Deal (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4shoknr , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Shock 'n' Roll (Mazooma - Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4shkwav , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Shockwave (Mazooma - Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbdn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbd2 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe 2 (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbd3 , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe 3 (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbdd , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad Deluxe [Wall Mount] (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbdj , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Jackpot Link] (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbdl , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Jackpot Link] [Wall Mount] (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sinbdw , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Sinbad [Wall Mount] (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4spotln , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Spotlight (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4sdquid , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Sundance Quid (Qps) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4tornad , 0 , mod4oki , mpu4 , m4default , 0, "Qps", "Tornado (Qps - Mazooma) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4vivan , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Viva Las Vegas (Nova) (MPU4)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME( 199?, m4ftladn , 0 , mod4oki , mpu4 , m4default , 0, "Nova", "Find the Lady (Nova)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) // these don't contain a valid vector in the first bank? -GAME(199?, m4abra ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Bwb","Abracadabra (Bwb) (MPU4?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME(199?, m4wcnov ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","World Cup (Nova) (MPU4?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME(199?, m4excaln ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","Excalibur (Nova) (MPU4?)", GAME_SUPPORTS_SAVE|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME(199?, m4abra ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Bwb","Abracadabra (Bwb) (MPU4?)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME(199?, m4wcnov ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","World Cup (Nova) (MPU4?)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) +GAME(199?, m4excaln ,0 ,bwboki ,mpu4 ,m_blsbys ,ROT0, "Nova","Excalibur (Nova) (MPU4?)", GAME_FLAGS|GAME_MECHANICAL|GAME_SUPPORTS_SAVE) // I'm not sure Bdd is the company (more likely to be Avantime), but they were all in a folder marked Bdd, they appear to be games which were taken / modified for export around eastern europe / russia -GAME( 19??, m4robo , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Robotica / Dream Machine (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4trg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Turbo Reel Gambler (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4mbel , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Millennium Bells (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4abeaut , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "American Beauty (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4cmont , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Casino Monte Carlo (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4blkmgc , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Black Magic (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4amalad , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "American Aladdin (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4bben , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Big Ben (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4bbox , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Brain Box (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4frnudg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Fruit & Nudge (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4frmtx , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Fruit Matrix (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4jok2k , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Joker 2000 (Avantime?) (Latvia) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4mjp , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Mega Jackpot (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4milrou , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Millennium Roulette (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, m4kingg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "King George (Avantime?) (MPU4)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) +GAME( 19??, m4robo , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Robotica / Dream Machine (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4trg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Turbo Reel Gambler (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4mbel , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Millennium Bells (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4abeaut , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "American Beauty (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4cmont , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Casino Monte Carlo (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4blkmgc , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Black Magic (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4amalad , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "American Aladdin (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4bben , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Big Ben (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4bbox , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Brain Box (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4frnudg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Fruit & Nudge (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4frmtx , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Fruit Matrix (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4jok2k , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Joker 2000 (Avantime?) (Latvia) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4mjp , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Mega Jackpot (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4milrou , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "Millennium Roulette (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) +GAME( 19??, m4kingg , 0 , mod4oki , mpu4 , m4default , ROT0, "Bdd", "King George (Avantime?) (MPU4)" , GAME_FLAGS|GAME_MECHANICAL|GAME_NO_SOUND) diff -Nru mame-0.144/src/mame/drivers/mpu4vid.c mame-0.145/src/mame/drivers/mpu4vid.c --- mame-0.144/src/mame/drivers/mpu4vid.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpu4vid.c 2012-02-06 21:30:42.000000000 +0000 @@ -447,12 +447,12 @@ -static SCREEN_UPDATE(mpu4_vid) +static SCREEN_UPDATE_RGB32(mpu4_vid) { - mpu4_state *state = screen->machine().driver_data(); + mpu4_state *state = screen.machine().driver_data(); int x, y/*, count = 0*/; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); /* this is in main ram.. i think it must transfer it out of here??? */ /* count = 0x0018b6/2; - crmaze count = 0x004950/2; - turnover */ @@ -482,7 +482,7 @@ attr = tiledat >>12; if (attr) - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[gfxregion],tiledat,0,0,0,(x*8),(y*8)); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[gfxregion],tiledat,0,0,0,(x*8),(y*8)); } if (dbl_size&2) @@ -2148,9 +2148,9 @@ } -static SCREEN_UPDATE(dealem) +static SCREEN_UPDATE_IND16(dealem) { - mpu4_state *state = screen->machine().driver_data(); + mpu4_state *state = screen.machine().driver_data(); int x,y; int count = 0; @@ -2160,7 +2160,7 @@ { int tile = state->m_dealem_videoram[count + 0x1000] | (state->m_dealem_videoram[count] << 8); count++; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,0,0,0,x * 8,y * 8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,0,0,0,x * 8,y * 8); } } @@ -2340,12 +2340,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE((63*8)+(17*8), (37*8)+17) // note this directly affects the scanline counters used below, and thus the timing of everything MCFG_SCREEN_VISIBLE_AREA(0, (63*8)+(0)-1, 0, (37*8)+0-1) MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_UPDATE(mpu4_vid) + MCFG_SCREEN_UPDATE_STATIC(mpu4_vid) MCFG_CPU_ADD("video", M68000, VIDEO_MASTER_CLOCK ) MCFG_CPU_PROGRAM_MAP(mpu4_68k_map) @@ -2421,11 +2420,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((54+1)*8, (32+1)*8) /* Taken from 6845 init, registers 00 & 04. Normally programmed with (value-1) */ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 31*8-1) /* Taken from 6845 init, registers 01 & 06 */ MCFG_SCREEN_REFRESH_RATE(56) /* Measured accurately from the flip-flop, but 6845 handles this */ - MCFG_SCREEN_UPDATE(dealem) + MCFG_SCREEN_UPDATE_STATIC(dealem) MCFG_GFXDECODE(dealem) @@ -4753,106 +4751,108 @@ GAME( 199?,v4bios, 0, mod2, mpu4, 0, ROT0, "Barcrest","MPU4 Video Firmware",GAME_IS_BIOS_ROOT ) -GAMEL( 1993,v4cmaze, v4bios, crmaze, crmaze, crmaze, ROT0, "Barcrest","The Crystal Maze (v1.3) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.9 -GAMEL( 1993,v4cmazedat, v4cmaze, crmaze, crmaze, crmaze, ROT0, "Barcrest","The Crystal Maze (v1.3, Datapak) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.9D -GAMEL( 1993,v4cmazea, v4cmaze, crmaze, crmaze, crmazea, ROT0, "Barcrest","The Crystal Maze (v0.1, AMLD) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.9 (actually newer than the 1.1 set then??) -GAMEL( 1993,v4cmazeb, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.2) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.9 -GAMEL( 1993,v4cmazec, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.3 alt) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.9 -GAMEL( 1993,v4cmazed, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.1) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze2p )//SWP 0.6 - -GAMEL( 1993,v4cmaze2, v4bios, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.2) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 1.0 -GAMEL( 1993,v4cmaze2d, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.2, Datapak) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 1.0D -GAMEL( 1993,v4cmaze2a, v4cmaze2, crmaze, crmaze, crmaze2a, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v0.1, AMLD) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 1.0 /* unprotected? proto? */ -GAMEL( 1993,v4cmaze2b, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.0) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 1.0 -GAMEL( 1993,v4cmaze2c, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v?.?) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )// bad rom? - -GAMEL( 1994,v4cmaze3, v4bios, crmaze, crmaze, crmaze3, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.9) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 0.7 -GAMEL( 1994,v4cmaze3d, v4cmaze3, crmaze, crmaze, crmaze3, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.9, Datapak) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 0.7D -GAMEL( 1994,v4cmaze3a, v4cmaze3, crmaze, crmaze, crmaze3a, ROT0, "Barcrest","The Crystal Maze Team Challenge (v1.2, AMLD) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 0.7 -GAMEL( 1994,v4cmaze3b, v4cmaze3, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.8) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )//SWP 0.7 -GAMEL( 1994,v4cmaze3c, v4cmaze3, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze Team Challenge (v?.?) (MPU4 Video)",GAME_NOT_WORKING,layout_crmaze4p )// missing one program rom - -GAME( 199?,v4turnov, v4bios, mpu4_vid, turnover, turnover, ROT0, "Barcrest","Turnover (v2.3) (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 1990,v4skltrk, v4bios, mpu4_vid, skiltrek, skiltrek, ROT0, "Barcrest","Skill Trek (v1.1) (MPU4 Video, set 1)",GAME_NOT_WORKING ) // 10 pound max -GAME( 1990,v4skltrka, v4skltrk, mpu4_vid, skiltrek, skiltrek, ROT0, "Barcrest","Skill Trek (v1.1) (MPU4 Video, set 2)",GAME_NOT_WORKING ) // 12 pound max -GAME( 1990,v4sklcsh, v4bios, mpu4_vid, skiltrek, v4barqst, ROT0, "Barcrest","Skill Cash (v1.1) (MPU4 Video)",GAME_NOT_WORKING ) +#define GAME_FLAGS GAME_NOT_WORKING -GAME( 1989,v4addlad, v4bios, mpu4_vid, adders, adders, ROT0, "Barcrest","Adders and Ladders (v2.1) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 1989,v4addlad20, v4addlad, mpu4_vid, adders, adders, ROT0, "Barcrest","Adders and Ladders (v2.0) (MPU4 Video)",GAME_NOT_WORKING ) +GAMEL( 1993,v4cmaze, v4bios, crmaze, crmaze, crmaze, ROT0, "Barcrest","The Crystal Maze (v1.3) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.9 +GAMEL( 1993,v4cmazedat, v4cmaze, crmaze, crmaze, crmaze, ROT0, "Barcrest","The Crystal Maze (v1.3, Datapak) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.9D +GAMEL( 1993,v4cmazea, v4cmaze, crmaze, crmaze, crmazea, ROT0, "Barcrest","The Crystal Maze (v0.1, AMLD) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.9 (actually newer than the 1.1 set then??) +GAMEL( 1993,v4cmazeb, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.2) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.9 +GAMEL( 1993,v4cmazec, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.3 alt) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.9 +GAMEL( 1993,v4cmazed, v4cmaze, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze (v1.1) (MPU4 Video)",GAME_FLAGS,layout_crmaze2p )//SWP 0.6 + +GAMEL( 1993,v4cmaze2, v4bios, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.2) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 1.0 +GAMEL( 1993,v4cmaze2d, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.2, Datapak) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 1.0D +GAMEL( 1993,v4cmaze2a, v4cmaze2, crmaze, crmaze, crmaze2a, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v0.1, AMLD) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 1.0 /* unprotected? proto? */ +GAMEL( 1993,v4cmaze2b, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v2.0) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 1.0 +GAMEL( 1993,v4cmaze2c, v4cmaze2, crmaze, crmaze, crmaze2, ROT0, "Barcrest","The New Crystal Maze Featuring Ocean Zone (v?.?) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )// bad rom? + +GAMEL( 1994,v4cmaze3, v4bios, crmaze, crmaze, crmaze3, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.9) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 0.7 +GAMEL( 1994,v4cmaze3d, v4cmaze3, crmaze, crmaze, crmaze3, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.9, Datapak) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 0.7D +GAMEL( 1994,v4cmaze3a, v4cmaze3, crmaze, crmaze, crmaze3a, ROT0, "Barcrest","The Crystal Maze Team Challenge (v1.2, AMLD) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 0.7 +GAMEL( 1994,v4cmaze3b, v4cmaze3, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze Team Challenge (v0.8) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )//SWP 0.7 +GAMEL( 1994,v4cmaze3c, v4cmaze3, crmaze, crmaze, v4cmazeb, ROT0, "Barcrest","The Crystal Maze Team Challenge (v?.?) (MPU4 Video)",GAME_FLAGS,layout_crmaze4p )// missing one program rom + +GAME( 199?,v4turnov, v4bios, mpu4_vid, turnover, turnover, ROT0, "Barcrest","Turnover (v2.3) (MPU4 Video)",GAME_FLAGS ) + +GAME( 1990,v4skltrk, v4bios, mpu4_vid, skiltrek, skiltrek, ROT0, "Barcrest","Skill Trek (v1.1) (MPU4 Video, set 1)",GAME_FLAGS ) // 10 pound max +GAME( 1990,v4skltrka, v4skltrk, mpu4_vid, skiltrek, skiltrek, ROT0, "Barcrest","Skill Trek (v1.1) (MPU4 Video, set 2)",GAME_FLAGS ) // 12 pound max +GAME( 1990,v4sklcsh, v4bios, mpu4_vid, skiltrek, v4barqst, ROT0, "Barcrest","Skill Cash (v1.1) (MPU4 Video)",GAME_FLAGS ) -GAME( 1989,v4time, v4bios, mpu4_vid, skiltrek, timemchn, ROT0, "Barcrest","Time Machine (v2.0) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 1989,v4addlad, v4bios, mpu4_vid, adders, adders, ROT0, "Barcrest","Adders and Ladders (v2.1) (MPU4 Video)",GAME_FLAGS ) +GAME( 1989,v4addlad20, v4addlad, mpu4_vid, adders, adders, ROT0, "Barcrest","Adders and Ladders (v2.0) (MPU4 Video)",GAME_FLAGS ) + +GAME( 1989,v4time, v4bios, mpu4_vid, skiltrek, timemchn, ROT0, "Barcrest","Time Machine (v2.0) (MPU4 Video)",GAME_FLAGS ) //Year is a guess, based on the use of the 'Coin Man' logo -GAME( 1996?,v4mate, v4bios, mating, mating, mating, ROT0, "Barcrest","The Mating Game (v0.4) (MPU4 Video)",GAME_NOT_WORKING )//SWP 0.2 /* Using crmaze controls for now, cabinet has trackball */ -GAME( 1996?,v4mated, v4mate, mating, mating, mating, ROT0, "Barcrest","The Mating Game (v0.4, Datapak) (MPU4 Video)",GAME_NOT_WORKING )//SWP 0.2D +GAME( 1996?,v4mate, v4bios, mating, mating, mating, ROT0, "Barcrest","The Mating Game (v0.4) (MPU4 Video)",GAME_FLAGS )//SWP 0.2 /* Using crmaze controls for now, cabinet has trackball */ +GAME( 1996?,v4mated, v4mate, mating, mating, mating, ROT0, "Barcrest","The Mating Game (v0.4, Datapak) (MPU4 Video)",GAME_FLAGS )//SWP 0.2D /* Games below are missing question ROMs */ -GAME( 199?,v4strike, v4bios, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4striked, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4strike2, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4strike2d, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 199?,v4eyedwn, v4bios, mpu4_vid, mpu4, eyesdown, ROT0, "Barcrest","Eyes Down (v1.3) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4eyedwnd, v4eyedwn, mpu4_vid, mpu4, eyesdown, ROT0, "Barcrest","Eyes Down (v1.3, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 199?,v4quidgr, v4bios, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v1.2) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4quidgrd, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v1.2, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4quidgr2, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v2.4) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4quidgr2d, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v2.4, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 199?,v4strike, v4bios, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4striked, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.5, Datapak) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4strike2, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4strike2d, v4strike, mpu4_vid, mpu4, strikeit, ROT0, "Barcrest","Strike it Lucky (v0.53, Datapak) (MPU4 Video)",GAME_FLAGS ) + +GAME( 199?,v4eyedwn, v4bios, mpu4_vid, mpu4, eyesdown, ROT0, "Barcrest","Eyes Down (v1.3) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4eyedwnd, v4eyedwn, mpu4_vid, mpu4, eyesdown, ROT0, "Barcrest","Eyes Down (v1.3, Datapak) (MPU4 Video)",GAME_FLAGS ) + +GAME( 199?,v4quidgr, v4bios, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v1.2) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4quidgrd, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v1.2, Datapak) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4quidgr2, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v2.4) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4quidgr2d, v4quidgr, mpu4_vid, mpu4, quidgrid, ROT0, "Barcrest","Ten Quid Grid (v2.4, Datapak) (MPU4 Video)",GAME_FLAGS ) -GAME( 199?,v4barqst, v4bios, mpu4_vid, mpu4, v4barqst, ROT0, "Barcrest","Barquest (v2.6d) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4barqs2, v4bios, mpu4_vid, mpu4, v4barqst2, ROT0, "Barcrest","Barquest 2 (v0.3) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 199?,v4barqst, v4bios, mpu4_vid, mpu4, v4barqst, ROT0, "Barcrest","Barquest (v2.6d) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4barqs2, v4bios, mpu4_vid, mpu4, v4barqst2, ROT0, "Barcrest","Barquest 2 (v0.3) (MPU4 Video)",GAME_FLAGS ) -GAME( 199?,v4wize, v4bios, mpu4_vid, mpu4, v4wize, ROT0, "Barcrest","Wize Move (v1.3d) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4wizea, v4bios, mpu4_vid, mpu4, v4wize, ROT0, "Barcrest","Wize Move (v1.2) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 199?,v4wize, v4bios, mpu4_vid, mpu4, v4wize, ROT0, "Barcrest","Wize Move (v1.3d) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4wizea, v4bios, mpu4_vid, mpu4, v4wize, ROT0, "Barcrest","Wize Move (v1.2) (MPU4 Video)",GAME_FLAGS ) -GAME( 1991,v4opt3, v4bios, mpu4_vid, mpu4, v4opt3, ROT0, "Barcrest","Option 3 (v1.0) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 1991,v4opt3d, v4opt3, mpu4_vid, mpu4, v4opt3, ROT0, "Barcrest","Option 3 (v1.0) (Datapak) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 1991,v4opt3, v4bios, mpu4_vid, mpu4, v4opt3, ROT0, "Barcrest","Option 3 (v1.0) (MPU4 Video)",GAME_FLAGS ) +GAME( 1991,v4opt3d, v4opt3, mpu4_vid, mpu4, v4opt3, ROT0, "Barcrest","Option 3 (v1.0) (Datapak) (MPU4 Video)",GAME_FLAGS ) /* Games below are newer BwB games and use their own BIOS ROMs and hardware setups*/ -GAME( 199?,v4vgpok, 0, bwbvid, mpu4, 0, ROT0, "BwB","Vegas Poker (prototype, release 2) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4psi, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v1.1) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4psia, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v1.2) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4psib, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v2.0?) (MPU4 Video)",GAME_NOT_WORKING ) // bad dump -GAME( 199?,v4blox, 0, bwbvid, mpu4, 0, ROT0, "BwB","Blox (v2.0) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4bloxd, v4blox, bwbvid, mpu4, 0, ROT0, "BwB","Blox (v2.0, Datapak) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 1996,v4reno, 0, bwbvid5, mpu4, prizeinv, ROT0, "BwB","Reno Reels (20p/10GBP Cash, release A) (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 199?,v4bigfrt, 0, bwbvid, mpu4, 0, ROT0, "BwB","Big Fruits (v2.0?) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4bubbnk, 0, bwbvid, mpu4, 0, ROT0, "BwB","Bubbly Bonk (v4.0?) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4mazbel, 0, bwbvid, mpu4, 0, ROT0, "BwB","Mazooma Belle (v2.5) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4mazbla, 0, bwbvid, mpu4, 0, ROT0, "BwB","Mazooma Belle (v1.5) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4shpwnd, 0, bwbvid, mpu4, 0, ROT0, "BwB","Shop Window (v2.0) (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 199?,v4redhtp, 0, bwbvid, mpu4, 0, ROT0, "BwB","Red Hot Poker (20p/10GBP Cash, release 3) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4tetrs, 0, bwbvid, mpu4, 0, ROT0, "BwB","BwB Tetris v 2.2 (MPU4 Video)",GAME_NOT_WORKING ) - -GAME( 199?,v4big40, 0, bwbvid, mpu4, 0, ROT0, "BwB","Big 40 Poker (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4bulblx, 0, bwbvid, mpu4, 0, ROT0, "BwB","Bullion Blox (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) // is this the same game as v4blox? -GAME( 199?,v4cshinf, 0, bwbvid, mpu4, 0, ROT0, "BwB","Cash Inferno (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4dbltak, 0, bwbvid, mpu4, 0, ROT0, "BwB","Double Take (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4gldrsh, 0, bwbvid, mpu4, 0, ROT0, "BwB","Gold Rush (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4mdice, 0, bwbvid, mpu4, 0, ROT0, "BwB","Miami Dice (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) // is this the same as the Nova game below? -GAME( 199?,v4monte, 0, bwbvid, mpu4, 0, ROT0, "BwB","Monte Carlo Or Bust (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4ovrmn3, 0, bwbvid, mpu4, 0, ROT0, "BwB","Over Moon Pt3 (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4pztet, 0, bwbvid, mpu4, 0, ROT0, "BwB","Prize Tetris (Bwb) (MPU4 Video, set 1)",GAME_NOT_WORKING ) // is this the same as v4tetrs? -GAME( 199?,v4pzteta, v4pztet, bwbvid, mpu4, 0, ROT0, "BwB","Prize Tetris (Bwb) (MPU4 Video, set 2)",GAME_NOT_WORKING ) -GAME( 199?,v4rhmaz, 0, bwbvid, mpu4, 0, ROT0, "BwB","Red Hot Mazooma Belle (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4sunbst, 0, bwbvid, mpu4, 0, ROT0, "BwB","Sunburst (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4timebn, 0, bwbvid, mpu4, 0, ROT0, "BwB","Time Bandit (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4sixx, 0, bwbvid, mpu4, 0, ROT0, "BwB","6-X (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4megbuk, 0, bwbvid, mpu4, 0, ROT0, "BwB","Megabucks Poker (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) // no video roms! -GAME( 199?,v4rencas, 0, bwbvid, mpu4, 0, ROT0, "BwB","Reno Casino (Bwb) (MPU4 Video)",GAME_NOT_WORKING ) // no video roms! +GAME( 199?,v4vgpok, 0, bwbvid, mpu4, 0, ROT0, "BwB","Vegas Poker (prototype, release 2) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4psi, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v1.1) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4psia, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v1.2) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4psib, 0, bwbvid, mpu4, prizeinv, ROT0, "BwB","Prize Space Invaders (v2.0?) (MPU4 Video)",GAME_FLAGS ) // bad dump +GAME( 199?,v4blox, 0, bwbvid, mpu4, 0, ROT0, "BwB","Blox (v2.0) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4bloxd, v4blox, bwbvid, mpu4, 0, ROT0, "BwB","Blox (v2.0, Datapak) (MPU4 Video)",GAME_FLAGS ) +GAME( 1996,v4reno, 0, bwbvid5, mpu4, prizeinv, ROT0, "BwB","Reno Reels (20p/10GBP Cash, release A) (MPU4 Video)",GAME_FLAGS ) + +GAME( 199?,v4bigfrt, 0, bwbvid, mpu4, 0, ROT0, "BwB","Big Fruits (v2.0?) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4bubbnk, 0, bwbvid, mpu4, 0, ROT0, "BwB","Bubbly Bonk (v4.0?) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4mazbel, 0, bwbvid, mpu4, 0, ROT0, "BwB","Mazooma Belle (v2.5) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4mazbla, 0, bwbvid, mpu4, 0, ROT0, "BwB","Mazooma Belle (v1.5) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4shpwnd, 0, bwbvid, mpu4, 0, ROT0, "BwB","Shop Window (v2.0) (MPU4 Video)",GAME_FLAGS ) + +GAME( 199?,v4redhtp, 0, bwbvid, mpu4, 0, ROT0, "BwB","Red Hot Poker (20p/10GBP Cash, release 3) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4tetrs, 0, bwbvid, mpu4, 0, ROT0, "BwB","BwB Tetris v 2.2 (MPU4 Video)",GAME_FLAGS ) + +GAME( 199?,v4big40, 0, bwbvid, mpu4, 0, ROT0, "BwB","Big 40 Poker (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4bulblx, 0, bwbvid, mpu4, 0, ROT0, "BwB","Bullion Blox (Bwb) (MPU4 Video)",GAME_FLAGS ) // is this the same game as v4blox? +GAME( 199?,v4cshinf, 0, bwbvid, mpu4, 0, ROT0, "BwB","Cash Inferno (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4dbltak, 0, bwbvid, mpu4, 0, ROT0, "BwB","Double Take (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4gldrsh, 0, bwbvid, mpu4, 0, ROT0, "BwB","Gold Rush (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4mdice, 0, bwbvid, mpu4, 0, ROT0, "BwB","Miami Dice (Bwb) (MPU4 Video)",GAME_FLAGS ) // is this the same as the Nova game below? +GAME( 199?,v4monte, 0, bwbvid, mpu4, 0, ROT0, "BwB","Monte Carlo Or Bust (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4ovrmn3, 0, bwbvid, mpu4, 0, ROT0, "BwB","Over Moon Pt3 (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4pztet, 0, bwbvid, mpu4, 0, ROT0, "BwB","Prize Tetris (Bwb) (MPU4 Video, set 1)",GAME_FLAGS ) // is this the same as v4tetrs? +GAME( 199?,v4pzteta, v4pztet, bwbvid, mpu4, 0, ROT0, "BwB","Prize Tetris (Bwb) (MPU4 Video, set 2)",GAME_FLAGS ) +GAME( 199?,v4rhmaz, 0, bwbvid, mpu4, 0, ROT0, "BwB","Red Hot Mazooma Belle (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4sunbst, 0, bwbvid, mpu4, 0, ROT0, "BwB","Sunburst (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4timebn, 0, bwbvid, mpu4, 0, ROT0, "BwB","Time Bandit (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4sixx, 0, bwbvid, mpu4, 0, ROT0, "BwB","6-X (Bwb) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4megbuk, 0, bwbvid, mpu4, 0, ROT0, "BwB","Megabucks Poker (Bwb) (MPU4 Video)",GAME_FLAGS ) // no video roms! +GAME( 199?,v4rencas, 0, bwbvid, mpu4, 0, ROT0, "BwB","Reno Casino (Bwb) (MPU4 Video)",GAME_FLAGS ) // no video roms! /* Uncertain BIOS */ -GAME( 199?,v4frfact, v4bios, crmaze, crmaze, crmaze, ROT0, "Bwb","Fruit Factory (Bwb) (MPU4 Video)", GAME_NOT_WORKING ) +GAME( 199?,v4frfact, v4bios, crmaze, crmaze, crmaze, ROT0, "Bwb","Fruit Factory (Bwb) (MPU4 Video)", GAME_FLAGS ) /*Deal 'Em was a conversion kit designed to make early MPU4 machines into video games by replacing the top glass and reel assembly with this kit and a supplied monitor. This explains why the cabinet switch alters lamp data and buttons. @@ -4863,9 +4863,9 @@ /* Nova - is this the same video board? One of the games displays 'Resetting' but the others do nothing interesting and access strange addresses */ /* All contain BwB video in the BIOS rom tho */ -GAME( 199?,v4cybcas, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Cyber Casino (Nova) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4miami, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Miami Dice (Nova) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4missis, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Mississippi Lady (Nova) (MPU4 Video)",GAME_NOT_WORKING ) -GAME( 199?,v4picdil, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Piccadilly Nights (Nova) (MPU4 Video)",GAME_NOT_WORKING ) +GAME( 199?,v4cybcas, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Cyber Casino (Nova) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4miami, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Miami Dice (Nova) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4missis, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Mississippi Lady (Nova) (MPU4 Video)",GAME_FLAGS ) +GAME( 199?,v4picdil, 0, bwbvid5, mpu4, 0, ROT0, "Nova","Piccadilly Nights (Nova) (MPU4 Video)",GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/mpu5.c mame-0.145/src/mame/drivers/mpu5.c --- mame-0.144/src/mame/drivers/mpu5.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mpu5.c 2012-02-06 21:30:39.000000000 +0000 @@ -33,6 +33,8 @@ 15/07/11 - rom loading for most games added, still some missing tho and clones still need sorting out properly. */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -41,12 +43,18 @@ { public: mpu5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( mpu5_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( mpu5_map, AS_PROGRAM, 32, mpu5_state ) AM_RANGE(0x000000, 0x2fffff) AM_ROM ADDRESS_MAP_END @@ -5654,359 +5662,356 @@ /* Barcrest */ -GAME( 199?, m5clr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","MPU 5 Ram & Meter Clear (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tst ,0, mpu5, mpu5, 0, ROT0, "Barcrest","MPU 5 Test Rom (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5clr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","MPU 5 Ram & Meter Clear (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tst ,0, mpu5, mpu5, 0, ROT0, "Barcrest","MPU 5 Test Rom (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) -GAME( 199?, m5addams ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Addams Family (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5addlad ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5addlada ,m5addlad, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5addladb ,m5addlad, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fire ,0, mpu5, mpu5, 0, ROT0, "Barcrest","All Fired Up (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5arab ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Arabian Nights (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5austin ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Austin Powers (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bankrl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Bank Roll (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5barkng ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Barking Mad (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5barmy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Barmy Army (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5baxe ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Battle Axe (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bbro ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Big Brother (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bbrocl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Big Brother Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bigchs ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Big Cheese (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5biggam ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Big Game (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5blkwht ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Black & White (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bwaves ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Brain Waves (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5blind ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Bling King Crazy (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cbw ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ca$h Bang Wallop (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cpcash ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Captain Cash (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5carclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Caribbean Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cashar ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Arena (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cashat ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Attack (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cashln ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Lines (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cashrn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Run (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5codft ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Codfather (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cos ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash Casino (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cosclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5crzkni ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Crazy Crazy Knights (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5doshpk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Do$h & Pecks (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5draclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Dracula Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ewn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Each Way Nudge (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5elim ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Eliminator (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5egr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Rush (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5egra ,m5egr, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Rush (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5egss ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Super Streak (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5egssa ,m5egss, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Super Streak (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5evgrhr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Red Hot Roll (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5evgrhra ,m5evgrhr, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Red Hot Roll (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5xchn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5firebl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fireball (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5flipcr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Flippin Crazy (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fortby ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fort Boyard (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5frnzy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Frenzy (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5beans ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Full Of Beans (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5funsun ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fun In The Sun (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gimmie ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gimmie Gimmie Gimmie (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5grush ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5grush5 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Five Liner (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gruss ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Sit Down (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5grusst ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Stampede (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gstrik ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Strike (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gsstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Super Streak (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gdrag ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Dragon (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gdrgcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Dragon Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gkeys ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Keys (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hellrz ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hellraiser (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hlsumo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hi Lo Sumo (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hifly ,0, mpu5, mpu5, 0, ROT0, "Barcrest","High Flyer (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5holy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Holy Grail (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hotslt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Slot (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hotstf ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Stuff (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hypvip ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jackpt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jackpoteers (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jackp2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jackpoteers 2 (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jlyjwl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jolly Jewels (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jlyrog ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jolly Roger (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kkebab ,0, mpu5, mpu5, 0, ROT0, "Barcrest","King Kebab (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kingko ,0, mpu5, mpu5, 0, ROT0, "Barcrest","King KO (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5lotta ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Lotta Luck (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mega ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Mega Zone (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5martns ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Money Mad Martians (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mmak ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Money Maker (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5monjok ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monedin Joker (Spanish) (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5monjoka ,m5monjok, mpu5, mpu5, 0, ROT0, "Barcrest","Monedin Joker (Spanish) (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5monty ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mprio ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python Rio (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mpfc ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python's Flying Circus (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mpfccl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python's Flying Circus Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5neptun ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Neptunes Treasure (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5nnww ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Nudge Nudge Wink Wink (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5nnwwgl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Nudge Nudge Wink Wink Gold (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fiddle ,0, mpu5, mpu5, 0, ROT0, "Barcrest","On The Fiddle (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5oohaah ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ooh Aah Dracula (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5oohrio ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ooh Ahh Dracula Rio (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5openbx ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Open The Box (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5overld ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Overload (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ptyani ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Party Animal (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5peepsh ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Peep Show (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5psycho ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5psyccl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5psy2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast 2 (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5qshot ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Quack Shot (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5roof ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Raise The Roof (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5roofa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Raise The Roof (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5razdz ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Razzle Dazzle Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5redrck ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ready To Rock (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rhkni ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Knights (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rhrg ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Roll Gold (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rhrgt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Roll Triple (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rwb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red White & Blue (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5revo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Revolution (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rgclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rio Grande Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rcx ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rcxa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rub ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rubies & Diamonds (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ritj ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rumble In The Jungle (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rfymc ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Run For Your Money Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5seven ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Seven Deadly Spins (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sheik ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Sheik Yer Money (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5showtm ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Showtime (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5silver ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Silver Screen (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sondr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Son Of Dracula (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sondra ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Son Of Dracula (Barcrest) (MPU5) (15GBP Jackpot)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5spicer ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Spice Is Right (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5spiker ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Spiker The Biker (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5spins ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Spinsation (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5squids ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Squids In (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5stax ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Stax Of Cash (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5scharg ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Charged (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5supstr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Star (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Streak (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5supnov ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Supernova (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tempt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tempt2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure 2 (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tempcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tbird ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Thunderbird (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5topdog ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Top Dog (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5trail ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Trailblazer Club (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ultimo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ultimo (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5upover ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Up & Over (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5vampup ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Vamp It Up (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5wking ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Wild King (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5costa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ttwo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Take Two (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5horn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Whitbread","Horn Of Plenty (Barcrest / Whitbread) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hotrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Rocks (Barcrest) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5addams ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Addams Family (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5addlad ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5addlada ,m5addlad, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5addladb ,m5addlad, mpu5, mpu5, 0, ROT0, "Barcrest","Adders & Ladders (Barcrest) (MPU5, set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fire ,0, mpu5, mpu5, 0, ROT0, "Barcrest","All Fired Up (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5arab ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Arabian Nights (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5austin ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Austin Powers (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bankrl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Bank Roll (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5barkng ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Barking Mad (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5barmy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Barmy Army (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5baxe ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Battle Axe (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bbro ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Big Brother (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bbrocl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Big Brother Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bigchs ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Big Cheese (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5biggam ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Big Game (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5blkwht ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Black & White (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bwaves ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Brain Waves (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5blind ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Bling King Crazy (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cbw ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ca$h Bang Wallop (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cpcash ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Captain Cash (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5carclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Caribbean Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cashar ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Arena (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cashat ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Attack (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cashln ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Lines (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cashrn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Cash Run (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5codft ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Codfather (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cos ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash Casino (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cosclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5crzkni ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Crazy Crazy Knights (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5doshpk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Do$h & Pecks (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5draclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ooh Aah Dracula Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ewn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Each Way Nudge (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5elim ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Eliminator (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5egr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Rush (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5egra ,m5egr, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Rush (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5egss ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Super Streak (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5egssa ,m5egss, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Super Streak (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5evgrhr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Red Hot Roll (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5evgrhra ,m5evgrhr, mpu5, mpu5, 0, ROT0, "Barcrest","Elvis Gold Red Hot Roll (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5xchn ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5firebl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fireball (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5flipcr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Flippin Crazy (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fortby ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fort Boyard (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5frnzy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Frenzy (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5beans ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Full Of Beans (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5funsun ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Fun In The Sun (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gimmie ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gimmie Gimmie Gimmie (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5grush ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5grush5 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Five Liner (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gruss ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Sit Down (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5grusst ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Rush Stampede (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gstrik ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Strike (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gsstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Gold Super Streak (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gdrag ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Dragon (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gdrgcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Dragon Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gkeys ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Golden Keys (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hellrz ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hellraiser (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hlsumo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hi Lo Sumo (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hifly ,0, mpu5, mpu5, 0, ROT0, "Barcrest","High Flyer (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5holy ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Holy Grail (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hotslt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Slot (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hotstf ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Stuff (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hypvip ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jackpt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jackpoteers (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jackp2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jackpoteers 2 (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jlyjwl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jolly Jewels (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jlyrog ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Jolly Roger (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kkebab ,0, mpu5, mpu5, 0, ROT0, "Barcrest","King Kebab (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kingko ,0, mpu5, mpu5, 0, ROT0, "Barcrest","King KO (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5lotta ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Lotta Luck (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mega ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Mega Zone (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5martns ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Money Mad Martians (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mmak ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Money Maker (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5monjok ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monedin Joker (Spanish) (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5monjoka ,m5monjok, mpu5, mpu5, 0, ROT0, "Barcrest","Monedin Joker (Spanish) (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5monty ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mprio ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python Rio (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mpfc ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python's Flying Circus (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mpfccl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Monty Python's Flying Circus Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5neptun ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Neptunes Treasure (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5nnww ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Nudge Nudge Wink Wink (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5nnwwgl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Nudge Nudge Wink Wink Gold (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fiddle ,0, mpu5, mpu5, 0, ROT0, "Barcrest","On The Fiddle (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5oohaah ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ooh Aah Dracula (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5oohrio ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ooh Ahh Dracula Rio (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5openbx ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Open The Box (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5overld ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Overload (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ptyani ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Party Animal (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5peepsh ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Peep Show (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5psycho ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5psyccl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5psy2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Psycho Cash Beast 2 (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5qshot ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Quack Shot (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5roof ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Raise The Roof (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5roofa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Raise The Roof (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5razdz ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Razzle Dazzle Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5redrck ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ready To Rock (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rhkni ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Knights (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rhrg ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Roll Gold (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rhrgt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red Hot Roll Triple (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rwb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Red White & Blue (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5revo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Revolution (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rgclb ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rio Grande Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rcx ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rcxa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rub ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rubies & Diamonds (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ritj ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Rumble In The Jungle (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rfymc ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Run For Your Money Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5seven ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Seven Deadly Spins (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sheik ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Sheik Yer Money (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5showtm ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Showtime (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5silver ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Silver Screen (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sondr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Son Of Dracula (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sondra ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Son Of Dracula (Barcrest) (MPU5) (15GBP Jackpot)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5spicer ,0, mpu5, mpu5, 0, ROT0, "Barcrest","The Spice Is Right (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5spiker ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Spiker The Biker (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5spins ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Spinsation (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5squids ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Squids In (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5stax ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Stax Of Cash (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5scharg ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Charged (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5supstr ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Star (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Super Streak (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5supnov ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Supernova (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tempt ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tempt2 ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure 2 (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tempcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Temple Of Treasure Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tbird ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Thunderbird (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5topdog ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Top Dog (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5trail ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Trailblazer Club (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ultimo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Ultimo (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5upover ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Up & Over (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5vampup ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Vamp It Up (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5wking ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Wild King (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5costa ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Costa Del Cash (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ttwo ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Take Two (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5horn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Whitbread","Horn Of Plenty (Barcrest / Whitbread) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hotrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest","Hot Rocks (Barcrest) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Barcrest / Red Gaming */ -GAME( 199?, m5ashock ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Aftershock (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bigsht ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Big Shot (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bnkrs ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Bonkers (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bbank ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Break The Bank (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5casfev ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Casino Fever (Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dmnstr ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Demon Streak (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dmnstra ,m5dmnstr, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Demon Streak (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dbubl ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Double Bubble (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dragnd ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Dragon Drop (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dragnda ,m5dragnd, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Dragon Drop (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fnfair ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Funfair (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fnfaird ,m5fnfair, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Funfair (Barcrest - Red Gaming) (MPU5) (Datapak)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fusir ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Fruits U Sir (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fusira ,m5fusir, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Fruits U Sir (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hypalx ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Hypalinx (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5invad ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Invaders (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jcptgn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Jackpot Genie (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jlstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Jewel Strike (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5lock ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5locka ,m5lock, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5lockcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load Club (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5lockcla ,m5lockcl, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load Club (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5nitro ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Nitro (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5paint ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Paint The Town Red (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5quake ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Quake (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rainrn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rainbow Runner (Barcrest - Red Gaming) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rainrna ,m5rainrn, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rainbow Runner (Barcrest - Red Gaming) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rampg ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rampage (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rdwarf ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Red Dwarf (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5redx ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Red X (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5thtsmg ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","That's Magic (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5topdol ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Top Dollar (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5zigzag ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Zig Zag (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cmass ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Critical Mass (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sblz ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Snail Blazer (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5slide ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Slider (Barcrest - Red Gaming) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5ashock ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Aftershock (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bigsht ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Big Shot (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bnkrs ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Bonkers (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bbank ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Break The Bank (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5casfev ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Casino Fever (Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dmnstr ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Demon Streak (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dmnstra ,m5dmnstr, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Demon Streak (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dbubl ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Double Bubble (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dragnd ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Dragon Drop (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dragnda ,m5dragnd, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Dragon Drop (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fnfair ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Funfair (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fnfaird ,m5fnfair, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Funfair (Barcrest - Red Gaming) (MPU5) (Datapak)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fusir ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Fruits U Sir (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fusira ,m5fusir, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Fruits U Sir (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hypalx ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Hypalinx (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5invad ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Invaders (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jcptgn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Jackpot Genie (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jlstrk ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Jewel Strike (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5lock ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5locka ,m5lock, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5lockcl ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load Club (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5lockcla ,m5lockcl, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Lock 'n' Load Club (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5nitro ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Nitro (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5paint ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Paint The Town Red (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5quake ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Quake (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rainrn ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rainbow Runner (Barcrest - Red Gaming) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rainrna ,m5rainrn, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rainbow Runner (Barcrest - Red Gaming) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rampg ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Rampage (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rdwarf ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Red Dwarf (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5redx ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Red X (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5thtsmg ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","That's Magic (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5topdol ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Top Dollar (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5zigzag ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Zig Zag (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cmass ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Critical Mass (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sblz ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Snail Blazer (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5slide ,0, mpu5, mpu5, 0, ROT0, "Barcrest / Red Gaming","Slider (Barcrest - Red Gaming) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Vivid */ -GAME( 199?, m5sixsht ,0, mpu5, mpu5, 0, ROT0, "Vivid","6 Shooter (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sixshta ,m5sixsht, mpu5, mpu5, 0, ROT0, "Vivid","Six Shooter (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5all41 ,0, mpu5, mpu5, 0, ROT0, "Vivid","All 4 One (Vivid) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5all41v ,m5all41, mpu5, mpu5, 0, ROT0, "Vivid","All 4 One (Vivid) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5atlan ,0, mpu5, mpu5, 0, ROT0, "Vivid","Atlantic (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bttf ,0, mpu5, mpu5, 0, ROT0, "Vivid","Back To The Features (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5btlbnk ,0, mpu5, mpu5, 0, ROT0, "Vivid","Bottle Bank (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5caesc ,0, mpu5, mpu5, 0, ROT0, "Vivid","Caesar's Cash (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5card ,0, mpu5, mpu5, 0, ROT0, "Vivid","Card Shark (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cshkcb ,0, mpu5, mpu5, 0, ROT0, "Vivid","Card Shark Club (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5clifhn ,0, mpu5, mpu5, 0, ROT0, "Vivid","Cliffhanger (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cnct4 ,0, mpu5, mpu5, 0, ROT0, "Vivid","Connect 4 (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5devil ,0, mpu5, mpu5, 0, ROT0, "Vivid","Devil Of A Deal (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5elband ,0, mpu5, mpu5, 0, ROT0, "Vivid","El Bandido Club (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fair ,0, mpu5, mpu5, 0, ROT0, "Vivid","Fairground Attraction (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ggems ,0, mpu5, mpu5, 0, ROT0, "Vivid","Giant Gems (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5groll ,0, mpu5, mpu5, 0, ROT0, "Vivid","Golden Roll (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hilok ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hi Lo Karate (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hiclau ,0, mpu5, mpu5, 0, ROT0, "Vivid","High Claudius (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5honmon ,0, mpu5, mpu5, 0, ROT0, "Vivid","Honey Money (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hopidl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hop Idol (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hypno ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hypnotic (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jmpjok ,0, mpu5, mpu5, 0, ROT0, "Vivid","Jumpin Jokers (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5loony ,0, mpu5, mpu5, 0, ROT0, "Vivid","Loony Juice (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5loot ,0, mpu5, mpu5, 0, ROT0, "Vivid","Loot 'n' Khamun (Vivid) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // aka 3-in-1 ? -GAME( 199?, m5loota ,m5loot, mpu5, mpu5, 0, ROT0, "Vivid","Loot 'n' Khamun (Vivid) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // aka 3-in-1 ? -GAME( 199?, m5mag7s ,0, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mag7sa ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mag7sb ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mag7sc ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 4)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mag7sd ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5mag7se ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 6)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5msf ,0, mpu5, mpu5, 0, ROT0, "Vivid","Manic Streak Features (Vivid) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5msfa ,m5msf, mpu5, mpu5, 0, ROT0, "Vivid","Manic Streak Features (Vivid) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5piefac ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5piefc2 ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory 2 (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5piefcr ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory Rio (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5qdraw ,0, mpu5, mpu5, 0, ROT0, "Vivid","Quick On The Draw (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5redbal ,0, mpu5, mpu5, 0, ROT0, "Vivid","Random Red Ball (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ratpk ,0, mpu5, mpu5, 0, ROT0, "Vivid","Rat Pack (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rawin ,0, mpu5, mpu5, 0, ROT0, "Vivid / Whitbread","Reel A Win (Vivid / Whitbread) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rollup ,0, mpu5, mpu5, 0, ROT0, "Vivid","Roll Up Roll Up (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5shark ,0, mpu5, mpu5, 0, ROT0, "Vivid","Shark Raving Mad (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5speccl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Spectrum Club (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5spddmn ,0, mpu5, mpu5, 0, ROT0, "Vivid","Speed Demon (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5stars ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5starcl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes Club (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5startr ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes Triple (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5supro ,0, mpu5, mpu5, 0, ROT0, "Vivid","Super Roulette (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tempp ,0, mpu5, mpu5, 0, ROT0, "Vivid","Temple Of Pleasure (Vivid) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tictac ,0, mpu5, mpu5, 0, ROT0, "Vivid","Tic Tac Tut (Vivid) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tictaca ,m5tictac, mpu5, mpu5, 0, ROT0, "Vivid","Tic Tac Tut (Vivid) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5whdres ,0, mpu5, mpu5, 0, ROT0, "Vivid","Who Dares Spins (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5winway ,0, mpu5, mpu5, 0, ROT0, "Vivid","Winning Ways (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5sixsht ,0, mpu5, mpu5, 0, ROT0, "Vivid","6 Shooter (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sixshta ,m5sixsht, mpu5, mpu5, 0, ROT0, "Vivid","Six Shooter (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5all41 ,0, mpu5, mpu5, 0, ROT0, "Vivid","All 4 One (Vivid) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5all41v ,m5all41, mpu5, mpu5, 0, ROT0, "Vivid","All 4 One (Vivid) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5atlan ,0, mpu5, mpu5, 0, ROT0, "Vivid","Atlantic (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bttf ,0, mpu5, mpu5, 0, ROT0, "Vivid","Back To The Features (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5btlbnk ,0, mpu5, mpu5, 0, ROT0, "Vivid","Bottle Bank (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5caesc ,0, mpu5, mpu5, 0, ROT0, "Vivid","Caesar's Cash (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5card ,0, mpu5, mpu5, 0, ROT0, "Vivid","Card Shark (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cshkcb ,0, mpu5, mpu5, 0, ROT0, "Vivid","Card Shark Club (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5clifhn ,0, mpu5, mpu5, 0, ROT0, "Vivid","Cliffhanger (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cnct4 ,0, mpu5, mpu5, 0, ROT0, "Vivid","Connect 4 (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5devil ,0, mpu5, mpu5, 0, ROT0, "Vivid","Devil Of A Deal (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5elband ,0, mpu5, mpu5, 0, ROT0, "Vivid","El Bandido Club (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fair ,0, mpu5, mpu5, 0, ROT0, "Vivid","Fairground Attraction (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ggems ,0, mpu5, mpu5, 0, ROT0, "Vivid","Giant Gems (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5groll ,0, mpu5, mpu5, 0, ROT0, "Vivid","Golden Roll (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hilok ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hi Lo Karate (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hiclau ,0, mpu5, mpu5, 0, ROT0, "Vivid","High Claudius (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5honmon ,0, mpu5, mpu5, 0, ROT0, "Vivid","Honey Money (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hopidl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hop Idol (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hypno ,0, mpu5, mpu5, 0, ROT0, "Vivid","Hypnotic (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jmpjok ,0, mpu5, mpu5, 0, ROT0, "Vivid","Jumpin Jokers (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5loony ,0, mpu5, mpu5, 0, ROT0, "Vivid","Loony Juice (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5loot ,0, mpu5, mpu5, 0, ROT0, "Vivid","Loot 'n' Khamun (Vivid) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) // aka 3-in-1 ? +GAME( 199?, m5loota ,m5loot, mpu5, mpu5, 0, ROT0, "Vivid","Loot 'n' Khamun (Vivid) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) // aka 3-in-1 ? +GAME( 199?, m5mag7s ,0, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mag7sa ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mag7sb ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mag7sc ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 4)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mag7sd ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5mag7se ,m5mag7s, mpu5, mpu5, 0, ROT0, "Vivid","Magnificent 7s (Vivid) (MPU5, set 6)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5msf ,0, mpu5, mpu5, 0, ROT0, "Vivid","Manic Streak Features (Vivid) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5msfa ,m5msf, mpu5, mpu5, 0, ROT0, "Vivid","Manic Streak Features (Vivid) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5piefac ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5piefc2 ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory 2 (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5piefcr ,0, mpu5, mpu5, 0, ROT0, "Vivid","Pie Factory Rio (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5qdraw ,0, mpu5, mpu5, 0, ROT0, "Vivid","Quick On The Draw (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5redbal ,0, mpu5, mpu5, 0, ROT0, "Vivid","Random Red Ball (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ratpk ,0, mpu5, mpu5, 0, ROT0, "Vivid","Rat Pack (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rawin ,0, mpu5, mpu5, 0, ROT0, "Vivid / Whitbread","Reel A Win (Vivid / Whitbread) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rollup ,0, mpu5, mpu5, 0, ROT0, "Vivid","Roll Up Roll Up (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5shark ,0, mpu5, mpu5, 0, ROT0, "Vivid","Shark Raving Mad (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5speccl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Spectrum Club (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5spddmn ,0, mpu5, mpu5, 0, ROT0, "Vivid","Speed Demon (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5stars ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5starcl ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes Club (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5startr ,0, mpu5, mpu5, 0, ROT0, "Vivid","Stars & Stripes Triple (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5supro ,0, mpu5, mpu5, 0, ROT0, "Vivid","Super Roulette (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tempp ,0, mpu5, mpu5, 0, ROT0, "Vivid","Temple Of Pleasure (Vivid) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tictac ,0, mpu5, mpu5, 0, ROT0, "Vivid","Tic Tac Tut (Vivid) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tictaca ,m5tictac, mpu5, mpu5, 0, ROT0, "Vivid","Tic Tac Tut (Vivid) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5whdres ,0, mpu5, mpu5, 0, ROT0, "Vivid","Who Dares Spins (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5winway ,0, mpu5, mpu5, 0, ROT0, "Vivid","Winning Ways (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Empire */ -GAME( 199?, m5fewmor ,0, mpu5, mpu5, 0, ROT0, "Empire","A Few Dollars More (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5wonga ,0, mpu5, mpu5, 0, ROT0, "Empire","A Fish Called Wonga (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5aceclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5aceclba ,m5aceclb, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5aceclbb ,m5aceclb, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5barxdx ,0, mpu5, mpu5, 0, ROT0, "Empire","Bar X Deluxe (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bnzclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Bonanza Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5bukroo ,0, mpu5, mpu5, 0, ROT0, "Empire","Buckaroo (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cbrun ,0, mpu5, mpu5, 0, ROT0, "Empire","Cannonball Run (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5carou ,0, mpu5, mpu5, 0, ROT0, "Empire","Carousel (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5casroc ,0, mpu5, mpu5, 0, ROT0, "Empire","Casino Royale Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5centcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Centurion Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cworan ,0, mpu5, mpu5, 0, ROT0, "Empire","Clockwork Oranges (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5clbtro ,0, mpu5, mpu5, 0, ROT0, "Empire","Club Tropicana (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cockdd ,0, mpu5, mpu5, 0, ROT0, "Empire","Cock A Doodle Dough (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5coloss ,0, mpu5, mpu5, 0, ROT0, "Empire","Colossus Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5crocrk ,0, mpu5, mpu5, 0, ROT0, "Empire","Crocodile Rock (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5croclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Crocodile Rock Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5crsfir ,0, mpu5, mpu5, 0, ROT0, "Empire","Crossfire (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dmnf ,0, mpu5, mpu5, 0, ROT0, "Empire","Diamonds Are Forever (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dmnfcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Diamonds Are Forever Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5extrm ,0, mpu5, mpu5, 0, ROT0, "Empire","Extreme (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5extrmm ,0, mpu5, mpu5, 0, ROT0, "Empire","Extreme Madness (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fatcat ,0, mpu5, mpu5, 0, ROT0, "Empire","Fat Cat (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fishdl ,0, mpu5, mpu5, 0, ROT0, "Empire","Fish Full Of Dollars (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fishcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Fish Full Of Dollars Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fmonty ,0, mpu5, mpu5, 0, ROT0, "Empire","Full Monty (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5fmount ,0, mpu5, mpu5, 0, ROT0, "Empire","Full Mountie (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gophr ,0, mpu5, mpu5, 0, ROT0, "Empire","Gopher Gold (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gophcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Gopher Gold Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hisprt ,0, mpu5, mpu5, 0, ROT0, "Empire","High Spirits (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hocus ,0, mpu5, mpu5, 0, ROT0, "Empire","Hocus Pocus (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hocscl ,0, mpu5, mpu5, 0, ROT0, "Empire","Hocus Pocus Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hotsht ,0, mpu5, mpu5, 0, ROT0, "Empire","Hot Shots (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hula ,0, mpu5, mpu5, 0, ROT0, "Empire","Hula Moolah (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hulacl ,0, mpu5, mpu5, 0, ROT0, "Empire","Hula Moolah Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jackbx ,0, mpu5, mpu5, 0, ROT0, "Empire","Jack In The Box (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jcy ,0, mpu5, mpu5, 0, ROT0, "Empire","Juicy Fruits (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jmpgem ,0, mpu5, mpu5, 0, ROT0, "Empire","Jumping Gems (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jmpgmc ,0, mpu5, mpu5, 0, ROT0, "Empire","Jumping Gems Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kaleid ,0, mpu5, mpu5, 0, ROT0, "Empire","Kaleidoscope Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kcclb ,0, mpu5, mpu5, 0, ROT0, "Empire","King Cobra Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kingqc ,0, mpu5, mpu5, 0, ROT0, "Empire","Kings & Queens Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5korma ,0, mpu5, mpu5, 0, ROT0, "Empire","Korma Chameleon (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5kormcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Korma Chameleon Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5monmst ,0, mpu5, mpu5, 0, ROT0, "Empire","Money Monster (Empire) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5monmsta ,m5monmst, mpu5, mpu5, 0, ROT0, "Empire","Money Monster (Empire) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ramrd ,0, mpu5, mpu5, 0, ROT0, "Empire","Ram Raid (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ramrcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Ram Raid Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ronr ,0, mpu5, mpu5, 0, ROT0, "Empire","Reel Or No Reel (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5resfrg ,0, mpu5, mpu5, 0, ROT0, "Empire","Reservoir Frogs (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rthh ,0, mpu5, mpu5, 0, ROT0, "Empire","Return To The Haunted House (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rollx ,0, mpu5, mpu5, 0, ROT0, "Empire","Roll X (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5skulcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Skullduggery Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tball ,0, mpu5, mpu5, 0, ROT0, "Empire","Thunderball (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tomb ,0, mpu5, mpu5, 0, ROT0, "Empire","Tomb Raiders (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5trclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Tomb Raiders Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ttop ,0, mpu5, mpu5, 0, ROT0, "Empire","Treble Top (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5ttopcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Treble Top Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tsar ,0, mpu5, mpu5, 0, ROT0, "Empire","Tsar Wars (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5vertgo ,0, mpu5, mpu5, 0, ROT0, "Empire","Vertigo (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5vertcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Vertigo Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5wthing ,0, mpu5, mpu5, 0, ROT0, "Empire","Wild Thing Club (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5xfact ,0, mpu5, mpu5, 0, ROT0, "Empire","X Factor (Empire) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5fewmor ,0, mpu5, mpu5, 0, ROT0, "Empire","A Few Dollars More (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5wonga ,0, mpu5, mpu5, 0, ROT0, "Empire","A Fish Called Wonga (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5aceclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5aceclba ,m5aceclb, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5aceclbb ,m5aceclb, mpu5, mpu5, 0, ROT0, "Empire","Ace Of Clubs (Empire) (MPU5, set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5barxdx ,0, mpu5, mpu5, 0, ROT0, "Empire","Bar X Deluxe (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bnzclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Bonanza Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5bukroo ,0, mpu5, mpu5, 0, ROT0, "Empire","Buckaroo (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cbrun ,0, mpu5, mpu5, 0, ROT0, "Empire","Cannonball Run (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5carou ,0, mpu5, mpu5, 0, ROT0, "Empire","Carousel (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5casroc ,0, mpu5, mpu5, 0, ROT0, "Empire","Casino Royale Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5centcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Centurion Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cworan ,0, mpu5, mpu5, 0, ROT0, "Empire","Clockwork Oranges (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5clbtro ,0, mpu5, mpu5, 0, ROT0, "Empire","Club Tropicana (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cockdd ,0, mpu5, mpu5, 0, ROT0, "Empire","Cock A Doodle Dough (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5coloss ,0, mpu5, mpu5, 0, ROT0, "Empire","Colossus Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5crocrk ,0, mpu5, mpu5, 0, ROT0, "Empire","Crocodile Rock (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5croclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Crocodile Rock Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5crsfir ,0, mpu5, mpu5, 0, ROT0, "Empire","Crossfire (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dmnf ,0, mpu5, mpu5, 0, ROT0, "Empire","Diamonds Are Forever (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dmnfcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Diamonds Are Forever Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5extrm ,0, mpu5, mpu5, 0, ROT0, "Empire","Extreme (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5extrmm ,0, mpu5, mpu5, 0, ROT0, "Empire","Extreme Madness (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fatcat ,0, mpu5, mpu5, 0, ROT0, "Empire","Fat Cat (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fishdl ,0, mpu5, mpu5, 0, ROT0, "Empire","Fish Full Of Dollars (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fishcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Fish Full Of Dollars Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fmonty ,0, mpu5, mpu5, 0, ROT0, "Empire","Full Monty (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5fmount ,0, mpu5, mpu5, 0, ROT0, "Empire","Full Mountie (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gophr ,0, mpu5, mpu5, 0, ROT0, "Empire","Gopher Gold (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gophcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Gopher Gold Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hisprt ,0, mpu5, mpu5, 0, ROT0, "Empire","High Spirits (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hocus ,0, mpu5, mpu5, 0, ROT0, "Empire","Hocus Pocus (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hocscl ,0, mpu5, mpu5, 0, ROT0, "Empire","Hocus Pocus Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hotsht ,0, mpu5, mpu5, 0, ROT0, "Empire","Hot Shots (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hula ,0, mpu5, mpu5, 0, ROT0, "Empire","Hula Moolah (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hulacl ,0, mpu5, mpu5, 0, ROT0, "Empire","Hula Moolah Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jackbx ,0, mpu5, mpu5, 0, ROT0, "Empire","Jack In The Box (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jcy ,0, mpu5, mpu5, 0, ROT0, "Empire","Juicy Fruits (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jmpgem ,0, mpu5, mpu5, 0, ROT0, "Empire","Jumping Gems (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jmpgmc ,0, mpu5, mpu5, 0, ROT0, "Empire","Jumping Gems Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kaleid ,0, mpu5, mpu5, 0, ROT0, "Empire","Kaleidoscope Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kcclb ,0, mpu5, mpu5, 0, ROT0, "Empire","King Cobra Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kingqc ,0, mpu5, mpu5, 0, ROT0, "Empire","Kings & Queens Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5korma ,0, mpu5, mpu5, 0, ROT0, "Empire","Korma Chameleon (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5kormcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Korma Chameleon Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5monmst ,0, mpu5, mpu5, 0, ROT0, "Empire","Money Monster (Empire) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5monmsta ,m5monmst, mpu5, mpu5, 0, ROT0, "Empire","Money Monster (Empire) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ramrd ,0, mpu5, mpu5, 0, ROT0, "Empire","Ram Raid (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ramrcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Ram Raid Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ronr ,0, mpu5, mpu5, 0, ROT0, "Empire","Reel Or No Reel (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5resfrg ,0, mpu5, mpu5, 0, ROT0, "Empire","Reservoir Frogs (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rthh ,0, mpu5, mpu5, 0, ROT0, "Empire","Return To The Haunted House (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rollx ,0, mpu5, mpu5, 0, ROT0, "Empire","Roll X (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5skulcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Skullduggery Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tball ,0, mpu5, mpu5, 0, ROT0, "Empire","Thunderball (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tomb ,0, mpu5, mpu5, 0, ROT0, "Empire","Tomb Raiders (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5trclb ,0, mpu5, mpu5, 0, ROT0, "Empire","Tomb Raiders Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ttop ,0, mpu5, mpu5, 0, ROT0, "Empire","Treble Top (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5ttopcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Treble Top Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tsar ,0, mpu5, mpu5, 0, ROT0, "Empire","Tsar Wars (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5vertgo ,0, mpu5, mpu5, 0, ROT0, "Empire","Vertigo (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5vertcl ,0, mpu5, mpu5, 0, ROT0, "Empire","Vertigo Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5wthing ,0, mpu5, mpu5, 0, ROT0, "Empire","Wild Thing Club (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5xfact ,0, mpu5, mpu5, 0, ROT0, "Empire","X Factor (Empire) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Bwb */ -GAME( 199?, m5carwsh ,0, mpu5, mpu5, 0, ROT0, "Bwb","Car Wash (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5cshstx ,0, mpu5, mpu5, 0, ROT0, "Bwb","Cash Stax (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5circus ,0, mpu5, mpu5, 0, ROT0, "Bwb","Circus (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5circlb ,0, mpu5, mpu5, 0, ROT0, "Bwb","Circus Club (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5clown ,0, mpu5, mpu5, 0, ROT0, "Bwb","Clown In Around (Bwb) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5clowna ,m5clown, mpu5, mpu5, 0, ROT0, "Bwb","Clown In Around (Bwb) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5clubsn ,0, mpu5, mpu5, 0, ROT0, "Bwb","Club Sandwich (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dick ,0, mpu5, mpu5, 0, ROT0, "Bwb","Dick Turnip (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5donna ,0, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5donnad ,0, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 1, Datapak)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5donnaa ,m5donna, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 3)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dblqts ,0, mpu5, mpu5, 0, ROT0, "Bwb","Double Or Quits (Bwb) (MPU5, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dblqtsa ,m5dblqts, mpu5, mpu5, 0, ROT0, "Bwb","Double Or Quits (Bwb) (MPU5, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5eggold ,0, mpu5, mpu5, 0, ROT0, "Bwb","Egyptian Gold (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m55050 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Fifty Fifty (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5gpclub ,0, mpu5, mpu5, 0, ROT0, "Bwb","Get Plastered Club (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5goape ,0, mpu5, mpu5, 0, ROT0, "Bwb","Going Ape (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5hgl ,0, mpu5, mpu5, 0, ROT0, "Bwb","Happy Go Lucky (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jokpak ,0, mpu5, mpu5, 0, ROT0, "Bwb","Joker In The Pack (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5lvwire ,0, mpu5, mpu5, 0, ROT0, "Bwb","Live Wire (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5carpet ,0, mpu5, mpu5, 0, ROT0, "Bwb","Magic Carpet (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5minesw ,0, mpu5, mpu5, 0, ROT0, "Bwb","Minesweeper (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5psychoa ,m5psycho, mpu5, mpu5, 0, ROT0, "Bwb","Psycho Cash Beast (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5psyccla ,m5psyccl, mpu5, mpu5, 0, ROT0, "Bwb","Psycho Cash Beast Club (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rwbbwb ,m5rwb, mpu5, mpu5, 0, ROT0, "Bwb","Red White & Blue (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5reelwn ,0, mpu5, mpu5, 0, ROT0, "Bwb","Reel A Win (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5reelth ,0, mpu5, mpu5, 0, ROT0, "Bwb","Reel Thunder (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5rlup ,0, mpu5, mpu5, 0, ROT0, "Bwb","Roll Up (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5round ,0, mpu5, mpu5, 0, ROT0, "Bwb","Round & Round (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sec7 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Secret 7s (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5sil7 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Silver 7s (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5smobik ,0, mpu5, mpu5, 0, ROT0, "Bwb","Smokey Bikin (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5tictacbwb ,m5tictac, mpu5, mpu5, 0, ROT0, "Bwb","Tic Tac Tut (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5xena ,0, mpu5, mpu5, 0, ROT0, "Bwb","Xena Warrior Princess (Bwb) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5carwsh ,0, mpu5, mpu5, 0, ROT0, "Bwb","Car Wash (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5cshstx ,0, mpu5, mpu5, 0, ROT0, "Bwb","Cash Stax (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5circus ,0, mpu5, mpu5, 0, ROT0, "Bwb","Circus (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5circlb ,0, mpu5, mpu5, 0, ROT0, "Bwb","Circus Club (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5clown ,0, mpu5, mpu5, 0, ROT0, "Bwb","Clown In Around (Bwb) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5clowna ,m5clown, mpu5, mpu5, 0, ROT0, "Bwb","Clown In Around (Bwb) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5clubsn ,0, mpu5, mpu5, 0, ROT0, "Bwb","Club Sandwich (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dick ,0, mpu5, mpu5, 0, ROT0, "Bwb","Dick Turnip (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5donna ,0, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5donnad ,0, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 1, Datapak)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5donnaa ,m5donna, mpu5, mpu5, 0, ROT0, "Bwb","Donna Kebab (Bwb) (MPU5, set 3)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dblqts ,0, mpu5, mpu5, 0, ROT0, "Bwb","Double Or Quits (Bwb) (MPU5, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dblqtsa ,m5dblqts, mpu5, mpu5, 0, ROT0, "Bwb","Double Or Quits (Bwb) (MPU5, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5eggold ,0, mpu5, mpu5, 0, ROT0, "Bwb","Egyptian Gold (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m55050 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Fifty Fifty (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5gpclub ,0, mpu5, mpu5, 0, ROT0, "Bwb","Get Plastered Club (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5goape ,0, mpu5, mpu5, 0, ROT0, "Bwb","Going Ape (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5hgl ,0, mpu5, mpu5, 0, ROT0, "Bwb","Happy Go Lucky (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jokpak ,0, mpu5, mpu5, 0, ROT0, "Bwb","Joker In The Pack (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5lvwire ,0, mpu5, mpu5, 0, ROT0, "Bwb","Live Wire (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5carpet ,0, mpu5, mpu5, 0, ROT0, "Bwb","Magic Carpet (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5minesw ,0, mpu5, mpu5, 0, ROT0, "Bwb","Minesweeper (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5psychoa ,m5psycho, mpu5, mpu5, 0, ROT0, "Bwb","Psycho Cash Beast (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5psyccla ,m5psyccl, mpu5, mpu5, 0, ROT0, "Bwb","Psycho Cash Beast Club (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rwbbwb ,m5rwb, mpu5, mpu5, 0, ROT0, "Bwb","Red White & Blue (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5reelwn ,0, mpu5, mpu5, 0, ROT0, "Bwb","Reel A Win (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5reelth ,0, mpu5, mpu5, 0, ROT0, "Bwb","Reel Thunder (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5rlup ,0, mpu5, mpu5, 0, ROT0, "Bwb","Roll Up (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5round ,0, mpu5, mpu5, 0, ROT0, "Bwb","Round & Round (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sec7 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Secret 7s (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5sil7 ,0, mpu5, mpu5, 0, ROT0, "Bwb","Silver 7s (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5smobik ,0, mpu5, mpu5, 0, ROT0, "Bwb","Smokey Bikin (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5tictacbwb ,m5tictac, mpu5, mpu5, 0, ROT0, "Bwb","Tic Tac Tut (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5xena ,0, mpu5, mpu5, 0, ROT0, "Bwb","Xena Warrior Princess (Bwb) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Lowen */ -GAME( 199?, m5all41l ,m5all41, mpu5, mpu5, 0, ROT0, "Lowen","All 4 One (Lowen) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5dblfun ,0, mpu5, mpu5, 0, ROT0, "Lowen","Double Fun (Lowen) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5jakjok ,0, mpu5, mpu5, 0, ROT0, "Lowen","Jackpot Jokers (Lowen) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5roundl ,m5round, mpu5, mpu5, 0, ROT0, "Lowen","Round & Round (Lowen) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, m5scfinl ,0, mpu5, mpu5, 0, ROT0, "Lowen","Super Cup Final (Lowen) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, m5all41l ,m5all41, mpu5, mpu5, 0, ROT0, "Lowen","All 4 One (Lowen) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5dblfun ,0, mpu5, mpu5, 0, ROT0, "Lowen","Double Fun (Lowen) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5jakjok ,0, mpu5, mpu5, 0, ROT0, "Lowen","Jackpot Jokers (Lowen) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5roundl ,m5round, mpu5, mpu5, 0, ROT0, "Lowen","Round & Round (Lowen) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, m5scfinl ,0, mpu5, mpu5, 0, ROT0, "Lowen","Super Cup Final (Lowen) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) /* Others / Uncertain */ -GAME( 199?, m5ppussy ,0, mpu5, mpu5, 0, ROT0, "Mdm","Pink Pussy (Mdm) (MPU5)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) - - - +GAME( 199?, m5ppussy ,0, mpu5, mpu5, 0, ROT0, "Mdm","Pink Pussy (Mdm) (MPU5)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/mquake.c mame-0.145/src/mame/drivers/mquake.c --- mame-0.144/src/mame/drivers/mquake.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mquake.c 2012-02-06 21:30:41.000000000 +0000 @@ -354,10 +354,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.997) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512*2, 262) MCFG_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) - MCFG_SCREEN_UPDATE(amiga) + MCFG_SCREEN_UPDATE_STATIC(amiga) MCFG_PALETTE_LENGTH(4096) MCFG_PALETTE_INIT(amiga) diff -Nru mame-0.144/src/mame/drivers/mrdo.c mame-0.145/src/mame/drivers/mrdo.c --- mame-0.144/src/mame/drivers/mrdo.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mrdo.c 2012-02-06 21:30:39.000000000 +0000 @@ -174,9 +174,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/4, 312, 8, 248, 262, 32, 224) - MCFG_SCREEN_UPDATE(mrdo) + MCFG_SCREEN_UPDATE_STATIC(mrdo) MCFG_GFXDECODE(mrdo) MCFG_PALETTE_LENGTH(64*4+16*4) @@ -187,10 +186,10 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("sn1", SN76489, MAIN_CLOCK/2) /* Verified */ + MCFG_SOUND_ADD("sn1", U8106, MAIN_CLOCK/2) /* sn76489-equivalent?, Verified */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - MCFG_SOUND_ADD("sn2", SN76489, MAIN_CLOCK/2) /* Verified */ + MCFG_SOUND_ADD("sn2", U8106, MAIN_CLOCK/2) /* sn76489-equivalent?, Verified */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/mrflea.c mame-0.145/src/mame/drivers/mrflea.c --- mame-0.144/src/mame/drivers/mrflea.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mrflea.c 2012-02-06 21:30:41.000000000 +0000 @@ -3,6 +3,9 @@ Mr F Lea Pacific Novelty 1982 +TODO: +- fix slave cpu irq generation + 4 way joystick and jump button I/O Board @@ -61,7 +64,6 @@ ******************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "includes/mrflea.h" @@ -120,11 +122,13 @@ return state->m_status ^ 0x01; } -static INTERRUPT_GEN( mrflea_slave_interrupt ) +static TIMER_DEVICE_CALLBACK( mrflea_slave_interrupt ) { - mrflea_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) == 0 || (state->m_status & 0x08)) - device_set_input_line(device, 0, HOLD_LINE); + mrflea_state *state = timer.machine().driver_data(); + int scanline = param; + + if ((scanline == 248) || (scanline == 248/2 && (state->m_status & 0x08))) + device_set_input_line(state->m_subcpu, 0, HOLD_LINE); } static READ8_HANDLER( mrflea_interrupt_type_r ) @@ -368,7 +372,7 @@ MCFG_CPU_ADD("sub", Z80, 6000000) MCFG_CPU_PROGRAM_MAP(mrflea_slave_map) MCFG_CPU_IO_MAP(mrflea_slave_io_map) - MCFG_CPU_VBLANK_INT_HACK(mrflea_slave_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", mrflea_slave_interrupt, "screen", 0, 1) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) @@ -379,10 +383,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 31*8-1) - MCFG_SCREEN_UPDATE(mrflea) + MCFG_SCREEN_UPDATE_STATIC(mrflea) MCFG_GFXDECODE(mrflea) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/mrgame.c mame-0.145/src/mame/drivers/mrgame.c --- mame-0.144/src/mame/drivers/mrgame.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/mrgame.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,6 +1,9 @@ /* Mr. Game 1B11188/0 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -8,18 +11,28 @@ { public: mrgame_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( mrgame_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( mrgame_map, AS_PROGRAM, 16, mrgame_state ) AM_RANGE(0x0000, 0xffffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( mrgame ) INPUT_PORTS_END -static MACHINE_RESET( mrgame ) +void mrgame_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 6000000) MCFG_CPU_PROGRAM_MAP(mrgame_map) - - MCFG_MACHINE_RESET( mrgame ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -156,8 +167,9 @@ ROM_LOAD("snd_ic44.rom", 0x00000, 0x8000, CRC(00946570) SHA1(83e7dd89844679571ab2a803295c8ca8941a4ac7)) ROM_END -GAME(1988, dakar, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Dakar", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, motrshow, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Motor Show", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, motrshowa, motrshow, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Motor Show (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, macattck, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Mac Attack", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, wcup90, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "World Cup 90", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1988, dakar, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Dakar", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, motrshow, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Motor Show", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, motrshowa, motrshow, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Motor Show (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, macattck, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "Mac Attack", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, wcup90, 0, mrgame, mrgame, mrgame, ROT0, "Mr Game", "World Cup 90", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/mrjong.c mame-0.145/src/mame/drivers/mrjong.c --- mame-0.144/src/mame/drivers/mrjong.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mrjong.c 2012-02-06 21:30:41.000000000 +0000 @@ -190,10 +190,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 30*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(mrjong) + MCFG_SCREEN_UPDATE_STATIC(mrjong) MCFG_GFXDECODE(mrjong) MCFG_PALETTE_LENGTH(4*32) diff -Nru mame-0.144/src/mame/drivers/ms32.c mame-0.145/src/mame/drivers/ms32.c --- mame-0.144/src/mame/drivers/ms32.c 2012-01-13 15:34:44.000000000 +0000 +++ mame-0.145/src/mame/drivers/ms32.c 2012-02-06 21:30:39.000000000 +0000 @@ -169,7 +169,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/v60/v60.h" -#include "deprecat.h" #include "sound/ymf271.h" #include "machine/jalcrpt.h" #include "includes/ms32.h" @@ -291,7 +290,7 @@ { ms32_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_rozram_16[offset]); - tilemap_mark_tile_dirty(state->m_roz_tilemap,offset/2); + state->m_roz_tilemap->mark_tile_dirty(offset/2); } static READ16_HANDLER( ms32_lineram_r16 ) @@ -328,7 +327,7 @@ { ms32_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txram_16[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset/2); + state->m_tx_tilemap->mark_tile_dirty(offset/2); } static READ16_HANDLER( ms32_bgram_r16 ) @@ -341,8 +340,8 @@ { ms32_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgram_16[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); - tilemap_mark_tile_dirty(state->m_bg_tilemap_alt,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); + state->m_bg_tilemap_alt->mark_tile_dirty(offset/2); } static WRITE32_HANDLER( pip_w ) @@ -403,7 +402,7 @@ { ms32_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_f1superb_extraram_16[offset]); - tilemap_mark_tile_dirty(state->m_extra_tilemap,offset/2); + state->m_extra_tilemap->mark_tile_dirty(offset/2); } static READ16_HANDLER( ms32_extra_r16 ) { @@ -1266,11 +1265,11 @@ /********** GFX DECODE **********/ /* sprites are contained in 256x256 "tiles" */ -static GFXLAYOUT_RAW( spritelayout, 8, 256, 256, 256*8, 256*256*8 ) -static GFXLAYOUT_RAW( bglayout, 8, 16, 16, 16*8, 16*16*8 ) -static GFXLAYOUT_RAW( txlayout, 8, 8, 8, 8*8, 8*8*8 ) +static GFXLAYOUT_RAW( spritelayout, 256, 256, 256*8, 256*256*8 ) +static GFXLAYOUT_RAW( bglayout, 16, 16, 16*8, 16*16*8 ) +static GFXLAYOUT_RAW( txlayout, 8, 8, 8*8, 8*8*8 ) -static GFXLAYOUT_RAW( f1layout, 8, 2048, 1, 2048*8, 2048*8 ) +static GFXLAYOUT_RAW( f1layout, 2048, 1, 2048*8, 2048*8 ) static GFXDECODE_START( ms32 ) @@ -1325,11 +1324,13 @@ cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); } -static INTERRUPT_GEN(ms32_interrupt) +/* TODO: fix this arrangement (derived from old deprecat lib) */ +static TIMER_DEVICE_CALLBACK(ms32_interrupt) { - if( cpu_getiloops(device) == 0 ) irq_raise(device->machine(), 10); - if( cpu_getiloops(device) == 1 ) irq_raise(device->machine(), 9); - /* hayaosi2 needs at least 12 IRQ 0 per frame to work (see code at FFE02289) + int scanline = param; + if( scanline == 0) irq_raise(timer.machine(), 10); + if( scanline == 8) irq_raise(timer.machine(), 9); + /* hayaosi1 needs at least 12 IRQ 0 per frame to work (see code at FFE02289) kirarast needs it too, at least 8 per frame, but waits for a variable amount 47pi2 needs ?? per frame (otherwise it hangs when you lose) in different points. Could this be a raster interrupt? @@ -1337,9 +1338,10 @@ desertwr p47aces */ - if( cpu_getiloops(device) >= 3 && cpu_getiloops(device) <= 32 ) irq_raise(device->machine(), 0); + if( (scanline % 8) == 0 && scanline <= 224 ) irq_raise(timer.machine(), 0); } + /********** SOUND **********/ /* @@ -1414,7 +1416,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", V70, 20000000) // 20MHz MCFG_CPU_PROGRAM_MAP(ms32_map) - MCFG_CPU_VBLANK_INT_HACK(ms32_interrupt,32) + MCFG_TIMER_ADD_SCANLINE("scantimer", ms32_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(ms32_sound_map) @@ -1427,10 +1429,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(ms32) + MCFG_SCREEN_UPDATE_STATIC(ms32) MCFG_GFXDECODE(ms32) MCFG_PALETTE_LENGTH(0x10000) @@ -1466,7 +1467,7 @@ ROM_LOAD32_BYTE( "bbbx29.bin", 0x000001, 0x80000, CRC(85bbbe79) SHA1(bc5ebb96491762e6a0d202ddf7faeb57c66211b4) ) ROM_LOAD32_BYTE( "bbbx31.bin", 0x000000, 0x80000, CRC(e0c865ed) SHA1(f21e8dc174c50d7afdd3f82c1c66dfcc002bdd07) ) - ROM_REGION( 0x1100000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1100000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "bbbx1.bin", 0x0000002, 0x200000, CRC(c1c10c3b) SHA1(e1f739f38e148c4d7aff6b81b3e42131c5c6c3dd) ) ROM_LOAD32_WORD( "bbbx13.bin", 0x0000000, 0x200000, CRC(4b8c1574) SHA1(c389c70b532d54528a175f460ca3f329b34cf67c) ) ROM_LOAD32_WORD( "bbbx2.bin", 0x0400002, 0x200000, CRC(03b77c1e) SHA1(f156ae6a4f2a8ae99815eb5a7b28425d273c1c3e) ) @@ -1478,13 +1479,13 @@ ROM_LOAD32_WORD( "bbbx5.bin", 0x1000002, 0x080000, CRC(64989edf) SHA1(033eab0e8a53607b2bb420f6356804b2cfa1544c) ) ROM_LOAD32_WORD( "bbbx17.bin", 0x1000000, 0x080000, CRC(1d7ebaf0) SHA1(5aac7cb01013ce3be206318678aced5812bff9a9) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "bbbx9.bin", 0x000000, 0x200000, CRC(a41cb650) SHA1(1c55a4afe55c1250806f2d93c25842dc3fb7f987) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "bbbx11.bin", 0x000000, 0x200000, CRC(85238ca9) SHA1(1ce32d585fe66764d621c11882ef9d2abaea6256) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "bbbx32-2.bin",0x000000, 0x080000, CRC(3ffdae75) SHA1(2b837d28f7ecdd49e8525bd5c249e83021d5fe9f) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1506,7 +1507,7 @@ ROM_LOAD32_BYTE( "93166-28.v11", 0x000001, 0x80000, CRC(aa49eec2) SHA1(173afc596caa1c464fc3247cb64d36c1d97a1520) ) ROM_LOAD32_BYTE( "93166-29.v11", 0x000000, 0x80000, CRC(92763e41) SHA1(eb593bbb586661c4c4e8728d845b146974d0bdf8) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "94019-02.1", 0x000002, 0x200000, CRC(f9d692f2) SHA1(666df55d26e00be39073173fa3616ac9dafbe615) ) ROM_LOAD32_WORD( "94019-01.13", 0x000000, 0x200000, CRC(1ddfe825) SHA1(27fbf492fdb4f0b4b8db18330e840c130213e15e) ) ROM_LOAD32_WORD( "94019-04.2", 0x400002, 0x200000, CRC(24ca77ec) SHA1(a5c575224ab276cbed5785f40fc0d35dd2748e74) ) @@ -1516,13 +1517,13 @@ ROM_LOAD32_WORD( "94019-08.4", 0xc00002, 0x200000, CRC(4b07edc9) SHA1(22aaa923a94a7bec997d2adabc8ec2c7696c33a5) ) ROM_LOAD32_WORD( "94019-07.16", 0xc00000, 0x200000, CRC(34f471a8) SHA1(4c9c358a9bfdb436a211caa14d085e631609681d) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "94019-09.11", 0x000000, 0x200000, CRC(cde7bb6f) SHA1(47454dac4ce67ce8d7e0c5ef3a732477ac8170a7) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "94019-12.10", 0x000000, 0x100000, CRC(15ae05d9) SHA1(ac00d3766c42ccba4585b9acfacc81bcb940ac26) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "93166-30.bin", 0x000000, 0x080000, CRC(0c738883) SHA1(e552c1842d759e5e617eb9c6cc178620a461b4dd) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1544,7 +1545,7 @@ ROM_LOAD32_BYTE( "93166-28.v10", 0x000001, 0x80000, CRC(b1261d51) SHA1(3f393aeb7a076c4d2d2cc7f22ead05f405186d80) ) ROM_LOAD32_BYTE( "93166-29.v10", 0x000000, 0x80000, CRC(9211c82a) SHA1(0aa3f93293b81e0f66b985046eb5e91708693959) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "94019-02.1", 0x000002, 0x200000, CRC(f9d692f2) SHA1(666df55d26e00be39073173fa3616ac9dafbe615) ) ROM_LOAD32_WORD( "94019-01.13", 0x000000, 0x200000, CRC(1ddfe825) SHA1(27fbf492fdb4f0b4b8db18330e840c130213e15e) ) ROM_LOAD32_WORD( "94019-04.2", 0x400002, 0x200000, CRC(24ca77ec) SHA1(a5c575224ab276cbed5785f40fc0d35dd2748e74) ) @@ -1554,13 +1555,13 @@ ROM_LOAD32_WORD( "94019-08.4", 0xc00002, 0x200000, CRC(4b07edc9) SHA1(22aaa923a94a7bec997d2adabc8ec2c7696c33a5) ) ROM_LOAD32_WORD( "94019-07.16", 0xc00000, 0x200000, CRC(34f471a8) SHA1(4c9c358a9bfdb436a211caa14d085e631609681d) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "94019-09.11", 0x000000, 0x200000, CRC(cde7bb6f) SHA1(47454dac4ce67ce8d7e0c5ef3a732477ac8170a7) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "94019-12.10", 0x000000, 0x100000, CRC(15ae05d9) SHA1(ac00d3766c42ccba4585b9acfacc81bcb940ac26) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "93166-30.bin", 0x000000, 0x080000, CRC(0c738883) SHA1(e552c1842d759e5e617eb9c6cc178620a461b4dd) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1582,7 +1583,7 @@ ROM_LOAD32_BYTE( "93166-28.39", 0x000001, 0x80000, CRC(0de40efb) SHA1(c49c3b27939e428dec1f642b7fdb9a1ff760289a) ) ROM_LOAD32_BYTE( "93166-29.40", 0x000000, 0x80000, CRC(fc25eae2) SHA1(a4d47fcb4d4c3285cf67d77d8a21478f344b98ca) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "94038-01.20", 0x000000, 0x200000, CRC(f11f83e2) SHA1(e3c99e6583003210483163c79182cb14aa334702) ) ROM_LOAD32_WORD( "94038-02.3", 0x000002, 0x200000, CRC(3d1fa710) SHA1(5fae3e8c714cca88e22e432dd7275c6898c631a8) ) ROM_LOAD32_WORD( "94038-03.21", 0x400000, 0x200000, CRC(84fd5790) SHA1(6187ff32a63f3b4105ea875f52237f0d4314f8b6) ) @@ -1592,15 +1593,15 @@ ROM_LOAD32_WORD( "94038-07.23", 0xc00000, 0x200000, CRC(426f4193) SHA1(98a16a70c225d7cd061fcd6e88992d393e6ef9fd) ) ROM_LOAD32_WORD( "94038-08.6", 0xc00002, 0x200000, CRC(f4088399) SHA1(9d53880996f85776815840bca1f8c3958de4c275) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "94038-11.13", 0x000000, 0x200000, CRC(bf2ec3a3) SHA1(904cd5ab2e855bdb94bc70efa6db42af672337d7) ) ROM_LOAD( "94038-12.14", 0x200000, 0x200000, CRC(d0e113da) SHA1(57f27cbd58421a0afe724fec5628c4a29aad8868) ) - ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "94038-09.12", 0x000000, 0x200000, CRC(72ec1ce7) SHA1(88bd9ca3aa7a6410e8fcf6fd70304f12724653bb) ) ROM_LOAD( "94038-10.11", 0x200000, 0x200000, CRC(1e17f2a9) SHA1(19e6be1daa157593fbab84149f1f739dd39c9226) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "93166-30.41", 0x000000, 0x080000, CRC(980ab89c) SHA1(8468fc13a5988e25750e8d99ff464f46e86ab412) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1640,16 +1641,16 @@ ROM_LOAD32_WORD( "f1sb8.bin", 0x1c00002, 0x200000, CRC(ba3f1533) SHA1(3ff1c4cca8358fc8daf0d2c381672569085ac9ae) ) ROM_LOAD32_WORD( "f1sb20.bin", 0x1c00000, 0x200000, CRC(fa349897) SHA1(31e08aa2821e409057e3094333b9ecbe04a6a38a) ) - ROM_REGION( 0x800000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x800000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "f1sb9.bin", 0x000000, 0x200000, CRC(66b12e1f) SHA1(4dc3f162a5116403cc0c491af335208672c8e9af) ) ROM_LOAD( "f1sb10.bin", 0x200000, 0x200000, CRC(893d7f4b) SHA1(b2734f20f703a0dcf8b1fdaebf2b6198b2fb0f51) ) ROM_LOAD( "f1sb11.bin", 0x400000, 0x200000, CRC(0b848bb5) SHA1(e4c0e434add151112352d6068e5de1a7098e6346) ) ROM_LOAD( "f1sb12.bin", 0x600000, 0x200000, CRC(edecd5f4) SHA1(9b86802d08e5c8ec1a6dcea75dc8f050d3e96970) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "f1sb31.bin", 0x000000, 0x200000, CRC(1d0d2efd) SHA1(e6446ef9c71be9316c286157f71e0043347c6a5c) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "f1sb32.bin", 0x000000, 0x080000, CRC(1b31fcce) SHA1(354cc6f43cd3bf3ba921ac8c5631ab993bedf563) ) ROM_REGION( 0x800000, "gfx5", 0 ) /* extra data? doesn't seem to be tiles */ @@ -1677,7 +1678,7 @@ ROM_LOAD32_BYTE( "94019.028", 0x000001, 0x80000, CRC(e0762e89) SHA1(a567c347e7f73f1ef1c753d14ac4f58311380fac) ) ROM_LOAD32_BYTE( "94019.029", 0x000000, 0x80000, CRC(8059800b) SHA1(7548d01b6ea15e962353b3585db6515e5819e5ce) ) - ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "94019.01", 0x000000, 0x200000, CRC(92d8ae9b) SHA1(02b36e6e14b28a9830e07fd328772dbb20b76889) ) ROM_LOAD32_WORD( "94019.02", 0x000002, 0x200000, CRC(f7bd9cc4) SHA1(5658bfb4081439ab06c6ade2531581aa60d1c6be) ) ROM_LOAD32_WORD( "94019.03", 0x400000, 0x200000, CRC(62a69590) SHA1(d95cc1e1ec85161ee6cd1ae77b405cf8ef81217a) ) @@ -1685,14 +1686,14 @@ ROM_LOAD32_WORD( "94019.05", 0x800000, 0x200000, CRC(a16994df) SHA1(9170b1fd9252d7a9601c3b2e6b1ba86686730b86) ) ROM_LOAD32_WORD( "94019.06", 0x800002, 0x200000, CRC(01d52ef1) SHA1(1585c7eb3729bab78467f627b7b671d619451a74) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "94019.08", 0x000000, 0x200000, CRC(abd124e0) SHA1(2da1d818c909e4abbb79ed03f3dbf15d744439ce) ) ROM_LOAD( "94019.09", 0x200000, 0x200000, CRC(711ab08b) SHA1(185b80b965ac3aba4857b4f83637008c2c1cc6ff) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "94019_2.07", 0x000000, 0x200000, CRC(043f969b) SHA1(ad10339e561c1a65451a2e9a8e79ceda3787674a) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "94019_2.030",0x000000, 0x080000, CRC(f9543fcf) SHA1(8466c7893bc6c43e2a80b8f91a776fd0a345ea6c) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1714,7 +1715,7 @@ ROM_LOAD32_BYTE( "94019.028", 0x000001, 0x80000, CRC(e0762e89) SHA1(a567c347e7f73f1ef1c753d14ac4f58311380fac) ) ROM_LOAD32_BYTE( "94019.029", 0x000000, 0x80000, CRC(8059800b) SHA1(7548d01b6ea15e962353b3585db6515e5819e5ce) ) - ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "94019.01", 0x000000, 0x200000, CRC(92d8ae9b) SHA1(02b36e6e14b28a9830e07fd328772dbb20b76889) ) ROM_LOAD32_WORD( "94019.02", 0x000002, 0x200000, CRC(f7bd9cc4) SHA1(5658bfb4081439ab06c6ade2531581aa60d1c6be) ) ROM_LOAD32_WORD( "94019.03", 0x400000, 0x200000, CRC(62a69590) SHA1(d95cc1e1ec85161ee6cd1ae77b405cf8ef81217a) ) @@ -1722,14 +1723,14 @@ ROM_LOAD32_WORD( "94019.05", 0x800000, 0x200000, CRC(a16994df) SHA1(9170b1fd9252d7a9601c3b2e6b1ba86686730b86) ) ROM_LOAD32_WORD( "94019.06", 0x800002, 0x200000, CRC(01d52ef1) SHA1(1585c7eb3729bab78467f627b7b671d619451a74) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "94019.08", 0x000000, 0x200000, CRC(abd124e0) SHA1(2da1d818c909e4abbb79ed03f3dbf15d744439ce) ) ROM_LOAD( "94019.09", 0x200000, 0x200000, CRC(711ab08b) SHA1(185b80b965ac3aba4857b4f83637008c2c1cc6ff) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "94019.07", 0x000000, 0x200000, BAD_DUMP CRC(acb75824) SHA1(3b43e00a2d240761565042c8feead25a83ef0eb1) ) // FIXED BITS (xxxxxxxx11111111) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "94019.030",0x000000, 0x080000, CRC(026b5379) SHA1(b9237477f1bf8ae83174e8231492fe667e6d6a13) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1751,7 +1752,7 @@ ROM_LOAD32_BYTE( "mr94041.28", 0x000001, 0x80000, CRC(b3738934) SHA1(cd07572e55e83807e76179cfc6b97e0410067911) ) ROM_LOAD32_BYTE( "mr94041.29", 0x000000, 0x80000, CRC(45154a45) SHA1(4c7c2c6738fdfe54ebe41a0ac6222cbfce5d7757) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94041.01", 0x0000000, 0x200000, CRC(3f99adf7) SHA1(cbb8d2fc253b0c58e7eb9286c66e6b36daf9d4af) ) ROM_LOAD32_WORD( "mr94041.02", 0x0000002, 0x200000, CRC(c3c5ae69) SHA1(5ed7f57a7139f87c680c68e44ea4022b917a9381) ) ROM_LOAD32_WORD( "mr94041.03", 0x0400000, 0x200000, CRC(d858b6de) SHA1(a06cf529c9508c8c8508894e2e004373edd9debf) ) @@ -1761,15 +1762,15 @@ ROM_LOAD32_WORD( "mr94041.07", 0x0c00000, 0x200000, CRC(a6966af5) SHA1(3a65824f3f325af39d8e9932357ce9f8878f0321) ) ROM_LOAD32_WORD( "mr94041.08", 0x0c00002, 0x200000, CRC(d7d2f73a) SHA1(0eb28f4cdea73aa8fed0b62cbac6cd7d7694c2ee) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr94041.11", 0x000000, 0x200000, CRC(00dcdbc3) SHA1(f7e34bc9f714ea81fc9855d90db792dd1e99bae8) ) ROM_LOAD( "mr94041.12", 0x200000, 0x200000, CRC(0ce48329) SHA1(9c198cef998eb3b9c33123bd8cc02210498f82d9) ) - ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr94041.09", 0x000000, 0x200000, CRC(a33e6051) SHA1(d6e34b022eb36dcfa8cfe6d6d1254f994b3b3dca) ) ROM_LOAD( "mr94041.10", 0x200000, 0x200000, CRC(b3497147) SHA1(df7d8ea7ec3e3df5e0c6658f14995df5479181bf) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "mr94041.30", 0x000000, 0x080000, CRC(c0f27b7f) SHA1(874fe80aa4b46520f844ef6efa61f28eabccbc4f) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1791,7 +1792,7 @@ ROM_LOAD32_BYTE( "mb93138a.29", 0x000001, 0x80000, CRC(e6fe3d0d) SHA1(9a0caab82b160991b4f2ac993e7e4b4c5d3bb15e) ) ROM_LOAD32_BYTE( "mb93138a.31", 0x000000, 0x80000, CRC(d944bf8c) SHA1(ce93b5d2ebe886b38dc42b1e554b17dc951a51b4) ) - ROM_REGION( 0x900000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x900000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr93038.04", 0x000000, 0x200000, CRC(ab5edb11) SHA1(b7742aefbce9efc512c3526714b6f20a6c03af60) ) ROM_LOAD32_WORD( "mr93038.05", 0x000002, 0x200000, CRC(274522f1) SHA1(717435d6bf1b2a2220a2f0a53b070bb81cc2ed2b) ) ROM_LOAD32_WORD( "mr93038.06", 0x400000, 0x200000, CRC(f9961ebf) SHA1(e91b160cb5a76e3f6044cc71681dadf2fbff7e8b) ) @@ -1799,13 +1800,13 @@ ROM_LOAD32_WORD( "mb93138a.15", 0x800000, 0x080000, CRC(a5f64d87) SHA1(11bf017f700faba57a5a2edced7a5d81a581bc50) ) ROM_LOAD32_WORD( "mb93138a.3", 0x800002, 0x080000, CRC(a2ae2b21) SHA1(65cee4e5e0a9b8dcac578e34210e1af7d7b2e6f7) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr93038.03", 0x000000, 0x200000, CRC(6999dec9) SHA1(eb4c6ba200cd08b41509314c659feb3af12117ee) ) - ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x100000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr93038.08", 0x000000, 0x100000, CRC(21282cb0) SHA1(52ea94a6457f7684674783c362052bcc40086dd0) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "mb93138a.32", 0x000000, 0x080000, CRC(f563a144) SHA1(14d86e4992329811857e1faf282cd9ec530a364c) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1894,7 +1895,7 @@ ROM_LOAD32_BYTE( "mb93138.29", 0x000001, 0x80000, CRC(da891976) SHA1(27e8c395e92ca01b47bffdf766bc95a6c2150815) ) ROM_LOAD32_BYTE( "mb93138.31", 0x000000, 0x80000, CRC(2d17bb06) SHA1(623b603c4002734427c882424a1e0dc889cf7e02) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94027.01", 0x000000, 0x200000, CRC(c72e5c6e) SHA1(b98cd656c48c775953d00b5d8bafd4ffde76d8df) ) ROM_LOAD32_WORD( "mr94027.02", 0x000002, 0x200000, CRC(59976568) SHA1(a280c352d612913834c76b8e23d86c937fd21281) ) ROM_LOAD32_WORD( "mr94027.03", 0x400000, 0x200000, CRC(3ff68f4f) SHA1(1e367b92560c32c87e27fc0e99be3bdb5eb0510b) ) @@ -1904,13 +1905,13 @@ ROM_LOAD32_WORD( "mr94027.07", 0xc00000, 0x200000, CRC(c66099c4) SHA1(5a6edffa39a98f38cc3cffbad9191fb2e794a812) ) ROM_LOAD32_WORD( "mr94027.08", 0xc00002, 0x200000, CRC(753b05e0) SHA1(0424e92b32a73c27ecb549e6e9449446ea938e40) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr94027.09", 0x000000, 0x200000, CRC(32ead437) SHA1(b94175cf186b4ebcc180a4c092d2ffcdd9ff3b1d) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr94027.11", 0x000000, 0x200000, CRC(b65d5096) SHA1(2c4e1e3e9f96be8369cb2de142a82f94506f85c0) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "mb93138.32", 0x000000, 0x080000, CRC(df5d00b4) SHA1(2bbbcd546d5b5170d81bf33b37b46b70b417c9c7) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1932,7 +1933,7 @@ ROM_LOAD32_BYTE( "mr95025.28", 0x000001, 0x80000, CRC(6df8c384) SHA1(3ad01d3d51cfc1f48029c16ee1cc74fc59d7603c) ) ROM_LOAD32_BYTE( "mr95025.29", 0x000000, 0x80000, CRC(3b6e681b) SHA1(148fa10631db53a4ad1dcdfb60b4f0654e077396) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95025.01", 0x000000, 0x200000, CRC(02279069) SHA1(fb3ce00701271d0163f72e4f2e56faa9f16d8fd0) ) ROM_LOAD32_WORD( "mr95025.02", 0x000002, 0x200000, CRC(885161d4) SHA1(1bc82de0b2759758d437db3ef9f0f7805f759b59) ) ROM_LOAD32_WORD( "mr95025.03", 0x400000, 0x200000, CRC(1ae06df9) SHA1(e1493a386fd8c54c88afab43d13d73869ae467ee) ) @@ -1942,14 +1943,14 @@ ROM_LOAD32_WORD( "mr95025.07", 0xc00000, 0x200000, CRC(0263a010) SHA1(b9c85647b406c89f0e839eac93eaf5d2e6963f7d) ) ROM_LOAD32_WORD( "mr95025.08", 0xc00002, 0x200000, CRC(8efc00d6) SHA1(f750e0e21310ceceeae3ad80eb2fe2920f5a0076) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr95025.10", 0x000000, 0x200000, CRC(ba7ad413) SHA1(b1f1c218dea3217f21d5e2f44db3786055ed879a) ) ROM_LOAD( "mr95025.11", 0x200000, 0x200000, CRC(11557299) SHA1(6efa56f897ab026f965376a0d4032f7a0d20cafe) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr95025.09", 0x000000, 0x200000, CRC(ca6cbd17) SHA1(9d16ef187b062590315066218e89bdf33cfd9865) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "mr95025.30", 0x000000, 0x080000, CRC(aee6e0c2) SHA1(dee985f7a9773ba7a4d31a3833a7775d778bbe5a) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -1971,7 +1972,7 @@ ROM_LOAD32_BYTE( "93166.28", 0x000001, 0x80000, CRC(20565478) SHA1(d532ab55be287f45d8d81317bb844c675eb1292c) ) ROM_LOAD32_BYTE( "93166.29", 0x000000, 0x80000, CRC(ff454f0d) SHA1(db81aaaf4160eb62badbe08fc01543463470ac97) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "95008-01.13", 0x000000, 0x200000, CRC(1be66420) SHA1(9fc85e6108f230418e012ad05586010235139039)) ROM_LOAD32_WORD( "95008-02.1", 0x000002, 0x200000, CRC(1cc4808e) SHA1(70a19d66b4f187320c67760bc453b6afb7d66f9a) ) ROM_LOAD32_WORD( "95008-03.14", 0x400000, 0x200000, CRC(4045f0dc) SHA1(5ba9786618ecad9410dbdf3664f9dda848a754f7) ) @@ -1981,13 +1982,13 @@ ROM_LOAD32_WORD( "95008-07.16", 0xc00000, 0x200000, CRC(bf47747e) SHA1(b97121953f41039182e25ea023802df4524cf9bd) ) ROM_LOAD32_WORD( "95008-08.4", 0xc00002, 0x200000, CRC(34829a09) SHA1(7229c56fee53a9d4d29cf0c9dec471b6cc4dc30b) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "95008-10.11", 0x000000, 0x200000, CRC(52da2e9e) SHA1(d7a29bdd1c6801aa8d36bc098e75091c63ba0766) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "95008-09.10", 0x000000, 0x200000,CRC(7236f6a0) SHA1(98dbb55f08d669ef3bf69394bb9739d0e6137fcb) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "93166.30", 0x000000, 0x080000, CRC(1807c1ea) SHA1(94696b8319c4982cb5d33423f56e2348f210cdb5) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -2009,7 +2010,7 @@ ROM_LOAD32_BYTE( "p47-28.bin", 0x000001, 0x80000, CRC(4742a5f7) SHA1(cd297aa150082c545647c9a755cf2cdbdc98c988) ) ROM_LOAD32_BYTE( "p47-29.bin", 0x000000, 0x80000, CRC(86e17d8b) SHA1(73004f243c6dfb86ce4cc61475dc7caaf452750e) ) - ROM_REGION( 0xe00000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0xe00000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "p47-01.bin", 0x000002, 0x200000, CRC(28732d3c) SHA1(15b2687bcad31793fc7d6a9dc3eccb7ad9b5f659) ) ROM_LOAD32_WORD( "p47-13.bin", 0x000000, 0x200000, CRC(a6ccf999) SHA1(5d32fb6f6987ede6c125bec9581da4695ad64dff) ) ROM_LOAD32_WORD( "p47-02.bin", 0x400002, 0x200000, CRC(128db576) SHA1(f6561f54f6b95842a5f14d29682449bf0d837a85) ) @@ -2019,15 +2020,15 @@ ROM_LOAD32_WORD( "p47-04.bin", 0xc00002, 0x100000, CRC(4b3372be) SHA1(cdc7d7615b6b5d45ca071b2967980dc6c6294ac0) ) ROM_LOAD32_WORD( "p47-16.bin", 0xc00000, 0x100000, CRC(c23c5467) SHA1(5ff51ecb86ccbae2af160599890e13a7cc70072d) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "p47-11.bin", 0x000000, 0x200000, CRC(c1fe16b3) SHA1(8b9d2483ba06ab8072676e73d949c696535b3d26) ) ROM_LOAD( "p47-12.bin", 0x200000, 0x200000, CRC(75871325) SHA1(9191263a52ec6ac325cf6130b35be7cdd1ec2f50) ) - ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "p47-10.bin", 0x000000, 0x200000, CRC(a44e9e06) SHA1(ff51796e160d996e931b92049e6214982f270caa) ) ROM_LOAD( "p47-09.bin", 0x200000, 0x200000, CRC(226014a6) SHA1(090bdc1f6d2b9d33b431dbb49a457a4bb36cd3ad) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "p47-30.bin", 0x000000, 0x080000, CRC(7ba90fad) SHA1(c0a3d4458816f00b8f5eb4b6d4531d1abeaccbe5) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -2049,17 +2050,17 @@ ROM_LOAD32_BYTE( "mr95024.28", 0x000001, 0x80000, CRC(87522e16) SHA1(4f0d8abec046884d89c559e3a4a5ac9e0e47a0dc) ) ROM_LOAD32_BYTE( "mr95024.29", 0x000000, 0x80000, CRC(43a61941) SHA1(a097c88c45d8486eb6ffdd13904b6eb2a3fa45b9) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95024.01", 0x000002, 0x200000, CRC(cb0e92b9) SHA1(179cc9e2d819d7f6238e924184e8a383d172aa72) ) ROM_LOAD32_WORD( "mr95024.13", 0x000000, 0x200000, CRC(4a825990) SHA1(f99ba9f88f5582259ba0e50480451d4e9d1d03b7) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr95024.11", 0x000000, 0x200000, CRC(c0d5246f) SHA1(413285f6b40001281c4fcec1ce73400c3ae610ed) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr95024.10", 0x000000, 0x200000, CRC(a03e4a8d) SHA1(d52c78d5e9d874dce514ffb035f2424409d8fb7a) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "mr95024.30", 0x000000, 0x080000, CRC(cea7002d) SHA1(5462edaeb9339790b95ed15a4bfaab8fae655b12) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -2081,17 +2082,17 @@ ROM_LOAD32_BYTE( "tp2m3228.28", 0x000001, 0x80000, CRC(041aac23) SHA1(3f7863ffa897978493e98445fe020dccbe521752) ) ROM_LOAD32_BYTE( "tp2m3229.29", 0x000000, 0x80000, CRC(4e83b2ca) SHA1(2766793f050a6952f4f53a763686f95bd7544f3f) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x800000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "96019-01.9", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "96019-02.8", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "tp2m3204.11", 0x000000, 0x200000, CRC(b5a03129) SHA1(a50d8b70615c49216f647534d1658c1a6d58a783) ) - ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "tp2m3203.10", 0x000000, 0x400000, CRC(94af8057) SHA1(e3bc6e02fe4c503ae51284770a76abbeff989147) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "tp2m3230.30", 0x000000, 0x080000, CRC(6845e476) SHA1(61c33714db2e2b5ccdcef0e0d3efdc391fe6aba2) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -2114,7 +2115,7 @@ ROM_LOAD32_BYTE( "vsjanshi28.39", 0x000001, 0x80000, CRC(d075cfb6) SHA1(f70741e9f536d5c7604126d36c7aa8ed8f25c329) ) ROM_LOAD32_BYTE( "vsjanshi29.40", 0x000000, 0x80000, CRC(bc395b50) SHA1(84d7cc492a11a5a9402e929f0bd138ad63e3d079) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr96004-01.13", 0x000000, 0x200000, CRC(3366d104) SHA1(2de0cabe2ead777b5b02cade7f2003ef7f90b75b) ) ROM_LOAD32_WORD( "mr96004-02.1", 0x000002, 0x200000, CRC(ad556664) SHA1(4b36f8d8d9efa37cf515af41d14433e7eafa27a2) ) ROM_LOAD32_WORD( "mr96004-03.14", 0x400000, 0x200000, CRC(b399e2b1) SHA1(9b6a00a219db8d66dcf592160b7b5f7a86b8f0c9) ) @@ -2124,13 +2125,13 @@ ROM_LOAD32_WORD( "mr96004-07.16", 0xc00000, 0x200000, CRC(177e32fa) SHA1(3ca1f397dc28f1fa3a4136705b92c63e4e438f05) ) ROM_LOAD32_WORD( "mr96004-08.4", 0xc00002, 0x200000, CRC(f6df27b2) SHA1(60590976020d86bdccd4eaf57b349ea31bec6830) ) - ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x400000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr96004-09.11", 0x000000, 0x400000, CRC(7f8ea9f0) SHA1(f1fe682dcb884f1aa4a5536e17ab94157a99f519) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr96004-11.10", 0x000000, 0x200000, CRC(e6da552c) SHA1(69a5af3015883793c7d1343243ccae23db9ef77c) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "vsjanshi30.41", 0x000000, 0x080000, CRC(fdbbac21) SHA1(c77d852e53126cc8ebfe1e79d1134e42b54d1aab) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ @@ -2189,7 +2190,7 @@ ROM_LOAD32_BYTE( "29", 0x000001, 0x80000, CRC(22acd835) SHA1(0fa96a6dfde737d541842f85dc257776044e15b5) ) ROM_LOAD32_BYTE( "31", 0x000000, 0x80000, CRC(f25e50f5) SHA1(b58722f11a8b94ef053caf531ac94a959350288a) ) - ROM_REGION( 0xc00000, "gfx1", 0 ) /* sprites, don't dispose since we use GFX_RAW */ + ROM_REGION( 0xc00000, "gfx1", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95033-01.13", 0x000000, 0x200000, CRC(1f76ed57) SHA1(af9076b4b4c26b362825d892f46d2c04b4bb9d07) ) ROM_LOAD32_WORD( "mr95033-02.1", 0x000002, 0x200000, CRC(5b119910) SHA1(aff44e355227dd159e388ab85a5b6d48644ff421) ) ROM_LOAD32_WORD( "mr95033-03.14", 0x400000, 0x200000, CRC(8b6099ed) SHA1(c514cec1491aed00a5714c0b8d17c96e87ba50aa) ) @@ -2197,13 +2198,13 @@ ROM_LOAD32_WORD( "mr95033-05.15", 0x800000, 0x200000, CRC(cc5b8d0b) SHA1(70a5b9db600fc168d13ad54653cf1c8d2a45d991) ) ROM_LOAD32_WORD( "mr95033-06.3", 0x800002, 0x200000, CRC(2f79942f) SHA1(73417d10f37bcd539b8081312226cf142a5a0d3d) ) - ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx2", 0 ) /* roz tiles */ ROM_LOAD( "mr95033-07.9", 0x000000, 0x200000, CRC(76cd2e0b) SHA1(41aa18dfb4e06547d1f6d7ce49e5225027d16bbb) ) - ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x200000, "gfx3", 0 ) /* bg tiles */ ROM_LOAD( "mr95033-09.11", 0x000000, 0x200000, CRC(8a6dae81) SHA1(e235f2865a9a003330bff1e4d0a017e5d10efd2a) ) - ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles, don't dispose since we use GFX_RAW */ + ROM_REGION( 0x080000, "gfx4", 0 ) /* tx tiles */ ROM_LOAD( "32", 0x000000, 0x080000, CRC(becc25c2) SHA1(4ae7665cd45ebd9586068e99327145194ba216fc) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* z80 program */ diff -Nru mame-0.144/src/mame/drivers/msisaac.c mame-0.145/src/mame/drivers/msisaac.c --- mame-0.144/src/mame/drivers/msisaac.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/msisaac.c 2012-02-06 21:30:41.000000000 +0000 @@ -504,10 +504,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(msisaac) + MCFG_SCREEN_UPDATE_STATIC(msisaac) MCFG_GFXDECODE(msisaac) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/mugsmash.c mame-0.145/src/mame/drivers/mugsmash.c --- mame-0.144/src/mame/drivers/mugsmash.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mugsmash.c 2012-02-06 21:30:35.000000000 +0000 @@ -422,10 +422,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(mugsmash) + MCFG_SCREEN_UPDATE_STATIC(mugsmash) MCFG_GFXDECODE(mugsmash) MCFG_PALETTE_LENGTH(0x300) diff -Nru mame-0.144/src/mame/drivers/multfish.c mame-0.145/src/mame/drivers/multfish.c --- mame-0.144/src/mame/drivers/multfish.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/multfish.c 2012-02-06 21:30:35.000000000 +0000 @@ -94,7 +94,7 @@ Revision information comes from Igrosoft's website, not all of them can be tested because some program rom revisions don't seem to be dumped. - For sets where the program rom hasn't been verified, the MD5 hash is given + For sets where the program rom hasn't been verified, the SHA1 hash is given but not the CRC32 hash. Banking addresses are likely controlled via a GAL/PAL and was added at some @@ -205,7 +205,7 @@ int code = state->m_vid[tile_index*2+0x0000] | (state->m_vid[tile_index*2+0x0001] << 8); int attr = state->m_vid[tile_index*2+0x1000] | (state->m_vid[tile_index*2+0x1001] << 8); - tileinfo->category = (attr&0x100)>>8; + tileinfo.category = (attr&0x100)>>8; SET_TILE_INFO( 0, @@ -234,35 +234,35 @@ state->save_item(NAME(state->m_vid)); state->m_tilemap = tilemap_create(machine,get_multfish_tile_info,tilemap_scan_rows,16,16, 64, 32); - tilemap_set_transparent_pen(state->m_tilemap,255); + state->m_tilemap->set_transparent_pen(255); state->m_reel_tilemap = tilemap_create(machine,get_multfish_reel_tile_info,tilemap_scan_rows,16,16, 64, 64); - tilemap_set_transparent_pen(state->m_reel_tilemap,255); - tilemap_set_scroll_cols(state->m_reel_tilemap, 64); + state->m_reel_tilemap->set_transparent_pen(255); + state->m_reel_tilemap->set_scroll_cols(64); } -static SCREEN_UPDATE(multfish) +static SCREEN_UPDATE_IND16(multfish) { - multfish_state *state = screen->machine().driver_data(); + multfish_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_disp_enable) return 0; /* Draw lower part of static tilemap (low pri tiles) */ - tilemap_draw(bitmap,cliprect,state->m_tilemap,TILEMAP_DRAW_CATEGORY(1),0); + state->m_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1),0); /* Setup the column scroll and draw the reels */ for (i=0;i<64;i++) { int colscroll = (state->m_vid[i*2] | state->m_vid[i*2+1] << 8); - tilemap_set_scrolly(state->m_reel_tilemap, i, colscroll ); + state->m_reel_tilemap->set_scrolly(i, colscroll ); } - tilemap_draw(bitmap,cliprect,state->m_reel_tilemap,0,0); + state->m_reel_tilemap->draw(bitmap, cliprect, 0,0); /* Draw upper part of static tilemap (high pri tiles) */ - tilemap_draw(bitmap,cliprect,state->m_tilemap,TILEMAP_DRAW_CATEGORY(0),0); + state->m_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0),0); return 0; } @@ -276,13 +276,13 @@ // 0x0000 - 0x1fff is normal tilemap if (offset < 0x2000) { - tilemap_mark_tile_dirty(state->m_tilemap,(offset&0xfff)/2); + state->m_tilemap->mark_tile_dirty((offset&0xfff)/2); } // 0x2000 - 0x2fff is for the reels else if (offset < 0x4000) { - tilemap_mark_tile_dirty(state->m_reel_tilemap,(offset&0x1fff)/2); + state->m_reel_tilemap->mark_tile_dirty((offset&0x1fff)/2); } else if (offset < 0x6000) { @@ -1034,10 +1034,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(17*16, 1024-16*7-1, 1*16, 32*16-1*16-1) - MCFG_SCREEN_UPDATE(multfish) + MCFG_SCREEN_UPDATE_STATIC(multfish) MCFG_GFXDECODE(multfish) MCFG_PALETTE_LENGTH(0x1000) @@ -1452,6 +1451,35 @@ ROM_LOAD( "crazymonkey_m.008", 0x380000, 0x80000, CRC(6fdb6fd5) SHA1(f40916112365de258956ec033aff79aae1f58690) ) ROM_END +ROM_START( crzmon_10 ) // 081027 lottery + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "cm_l_081027.rom", 0x00000, 0x40000, SHA1(11a1523bc0ce5cf43534b34201f59784283693f0) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "crazymonkey_loto.001", 0x000000, 0x80000, SHA1(bf953dc53ec85f4841fe7ada7e480520b3bce1d7) ) + ROM_LOAD( "crazymonkey_loto.002", 0x100000, 0x80000, SHA1(57db2212b690a8a92034ba4993526c34cbf48c09) ) + ROM_LOAD( "crazymonkey_loto.003", 0x200000, 0x80000, SHA1(4551494b883f8076931bb22fd0541b193039dfdc) ) + ROM_LOAD( "crazymonkey_loto.004", 0x300000, 0x80000, SHA1(b33d5007b649661a3d811139c2b40d036863343d) ) + ROM_LOAD( "crazymonkey_m.005", 0x080000, 0x80000, CRC(9d4d2a94) SHA1(c714e110de628b343dfc7fff23befaa1276056a9) ) + ROM_LOAD( "crazymonkey_m.006", 0x180000, 0x80000, CRC(a15f0fee) SHA1(3f06d5a1a41e1335bcc7586a5ea95b9b734155c0) ) + ROM_LOAD( "crazymonkey_m.007", 0x280000, 0x80000, CRC(715a2528) SHA1(6c4c72592568ecbaa9518fb7271d2714dd22dbbb) ) + ROM_LOAD( "crazymonkey_m.008", 0x380000, 0x80000, CRC(6fdb6fd5) SHA1(f40916112365de258956ec033aff79aae1f58690) ) +ROM_END + +ROM_START( crzmon_11 ) // 081113 lottery + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "cm_l_081113.rom", 0x00000, 0x40000, SHA1(7196c301691b47a572cefc090888db550f10998c) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "crazymonkey_loto.001", 0x000000, 0x80000, SHA1(bf953dc53ec85f4841fe7ada7e480520b3bce1d7) ) + ROM_LOAD( "crazymonkey_loto.002", 0x100000, 0x80000, SHA1(57db2212b690a8a92034ba4993526c34cbf48c09) ) + ROM_LOAD( "crazymonkey_loto.003", 0x200000, 0x80000, SHA1(4551494b883f8076931bb22fd0541b193039dfdc) ) + ROM_LOAD( "crazymonkey_loto.004", 0x300000, 0x80000, SHA1(b33d5007b649661a3d811139c2b40d036863343d) ) + ROM_LOAD( "crazymonkey_m.005", 0x080000, 0x80000, CRC(9d4d2a94) SHA1(c714e110de628b343dfc7fff23befaa1276056a9) ) + ROM_LOAD( "crazymonkey_m.006", 0x180000, 0x80000, CRC(a15f0fee) SHA1(3f06d5a1a41e1335bcc7586a5ea95b9b734155c0) ) + ROM_LOAD( "crazymonkey_m.007", 0x280000, 0x80000, CRC(715a2528) SHA1(6c4c72592568ecbaa9518fb7271d2714dd22dbbb) ) + ROM_LOAD( "crazymonkey_m.008", 0x380000, 0x80000, CRC(6fdb6fd5) SHA1(f40916112365de258956ec033aff79aae1f58690) ) +ROM_END /********************************************************* Fruit Cocktail @@ -1641,6 +1669,20 @@ ROM_LOAD( "fruitcocktail.008", 0x380000, 0x80000, CRC(8384e4d4) SHA1(83d0bbbd7cca7328a66a69cf802632fd8d22d5b8) ) ROM_END +ROM_START( fcockt_13 ) // 081124 lottery + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "fc_l_081124.rom", 0x00000, 0x40000, SHA1(896252194f32842f784463668e6416cbfe9687a0) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail_loto.001", 0x000000, 0x80000, SHA1(bb2b518dc166836f7cedd4ec443b50687e8927e1) ) /* Only this set is listed as official hashes */ + ROM_LOAD( "fruitcocktail_loto.002", 0x100000, 0x80000, SHA1(2621e2644ebec3959c49905c54eb20a83d5a7bd6) ) + ROM_LOAD( "fruitcocktail_loto.003", 0x200000, 0x80000, SHA1(ffe11deef6b3b86b4b78e2e4d96c30f820e77971) ) + ROM_LOAD( "fruitcocktail_loto.004", 0x300000, 0x80000, SHA1(fa88d113721ce7c0b3418614cd6bb974c20df644) ) + ROM_LOAD( "fruitcocktail_m.005", 0x080000, 0x80000, CRC(f0176b60) SHA1(f764aea00ed306a28cacc62f8d2db9cc42895db8) ) + ROM_LOAD( "fruitcocktail_m.006", 0x180000, 0x80000, CRC(ef24f255) SHA1(6ff924627c179868a25f180f79cd57182b72d9d4) ) + ROM_LOAD( "fruitcocktail_m.007", 0x280000, 0x80000, CRC(20f87a15) SHA1(cb60866a3543668f3592c270b445dee881d78128) ) + ROM_LOAD( "fruitcocktail_m.008", 0x380000, 0x80000, CRC(d282e42e) SHA1(eac9c3eaef39b1805f863ade5da47d6274d20a55) ) +ROM_END /********************************************************* Lucky Haunter @@ -1770,6 +1812,20 @@ ROM_LOAD( "luckyhaunter_m.008", 0x380000, 0x80000, CRC(1bdf6252) SHA1(7b5ae82a95a744b236e109024d47b526dccf9c14) ) ROM_END +ROM_START( lhaunt_9 ) // 081208 lottery + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "lh_l_081208.rom", 0x00000, 0x40000, SHA1(4962bfc9c3aadd45fdb30bb159aaaed463e4d06b) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "luckyhaunter_loto.001", 0x000000, 0x80000, SHA1(961f832654f2cdb844e36a1a9034b87b5e3750f5) ) + ROM_LOAD( "luckyhaunter_loto.002", 0x100000, 0x80000, SHA1(20ac980f4f8b502773845d2e1350b960ea707d83) ) + ROM_LOAD( "luckyhaunter_loto.003", 0x200000, 0x80000, SHA1(e4cf08104e7717d9706105ad52ade6bf9a782d76) ) + ROM_LOAD( "luckyhaunter_loto.004", 0x300000, 0x80000, SHA1(ceb4a5e9912f5d98483cb75e871c925dffbb8e72) ) + ROM_LOAD( "luckyhaunter_m.005", 0x080000, 0x80000, CRC(b50c90a3) SHA1(74749f4ffb5b0630631b511fc3230c6e7b50dc3b) ) + ROM_LOAD( "luckyhaunter_m.006", 0x180000, 0x80000, CRC(4eaaab64) SHA1(9fed16f8e0308200fd16c4b1e511e1bf6c22ae66) ) + ROM_LOAD( "luckyhaunter_m.007", 0x280000, 0x80000, CRC(64d16ba9) SHA1(3b897183d6e0f1256be7657441f234fc72077682) ) + ROM_LOAD( "luckyhaunter_m.008", 0x380000, 0x80000, CRC(1bdf6252) SHA1(7b5ae82a95a744b236e109024d47b526dccf9c14) ) +ROM_END /********************************************************* Garage @@ -1884,7 +1940,20 @@ ROM_LOAD( "garage_m.008", 0x380000, 0x80000, CRC(90c5416b) SHA1(583bfb517bc2e30d7b7903aa19fc3b4b5188d7d2) ) ROM_END +ROM_START( garage_8 ) // 081229 lottery + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "gg_l_081229.rom", 0x00000, 0x40000, SHA1(6bc22aeb6d8d5ffbc556d9056a25e6506bb8f118) ) + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "garage_loto.001", 0x000000, 0x80000, SHA1(50de46c4ae28f70c96da03391446cca0cb91f43b) ) + ROM_LOAD( "garage_loto.002", 0x100000, 0x80000, SHA1(df5c1684f1a29f77a3fa79b35a9a0b9371c1b8a3) ) + ROM_LOAD( "garage_loto.003", 0x200000, 0x80000, SHA1(47e81aa034c1ac717b1715c521cbaa8ff4d336c5) ) + ROM_LOAD( "garage_loto.004", 0x300000, 0x80000, SHA1(71dbcd71ee5bddeda77a012c243981e0960e0c9e) ) + ROM_LOAD( "garage_m.005", 0x080000, 0x80000, CRC(5bf85bc5) SHA1(ff9d2b9cbcd2af6f5fda972e387820d830c196a9) ) + ROM_LOAD( "garage_m.006", 0x180000, 0x80000, CRC(e5082b26) SHA1(6547409d39dd51498ce8e3f82ff813a8ac3c6522) ) + ROM_LOAD( "garage_m.007", 0x280000, 0x80000, CRC(dfa2ceb1) SHA1(ec7de8a8f6e7785a563df973841cc1f1603f79fc) ) + ROM_LOAD( "garage_m.008", 0x380000, 0x80000, CRC(90c5416b) SHA1(583bfb517bc2e30d7b7903aa19fc3b4b5188d7d2) ) +ROM_END /********************************************************* Rock Climber @@ -2500,6 +2569,65 @@ ROM_LOAD( "fruitcocktail2_old.008", 0x380000, 0x80000, CRC(a27c49a2) SHA1(7c9ee0e01f76ca3ab6716579f5dde7036050970b) ) ROM_END +ROM_START( fcockt2_2 ) // 080904 + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "fc2_080904.rom", 0x00000, 0x40000, SHA1(d8f1034753274aed874ee552ab78e660ddaba939) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2_old.005", 0x080000, 0x80000, CRC(6b9e6b43) SHA1(c7fb17e91ec62b22da42f110d68b4f37e39de3ce) ) + ROM_LOAD( "fruitcocktail2_old.006", 0x180000, 0x80000, CRC(2c9f712e) SHA1(c3118154eafca74b66b3325a2e07c85f86f3544d) ) + ROM_LOAD( "fruitcocktail2_old.007", 0x280000, 0x80000, CRC(85ba9a86) SHA1(aa9b6170135e9e420509e8f7c1702c9896bc5d8e) ) + ROM_LOAD( "fruitcocktail2_old.008", 0x380000, 0x80000, CRC(a27c49a2) SHA1(7c9ee0e01f76ca3ab6716579f5dde7036050970b) ) +ROM_END + +ROM_START( fcockt2_3 ) // 080909 + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "fc2_m_080909.rom", 0x00000, 0x40000, CRC(6de0353c) SHA1(7a827a172cdd593f8b37a7737304a5a2e145d52d) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2_old.005", 0x080000, 0x80000, CRC(6b9e6b43) SHA1(c7fb17e91ec62b22da42f110d68b4f37e39de3ce) ) + ROM_LOAD( "fruitcocktail2_old.006", 0x180000, 0x80000, CRC(2c9f712e) SHA1(c3118154eafca74b66b3325a2e07c85f86f3544d) ) + ROM_LOAD( "fruitcocktail2_old.007", 0x280000, 0x80000, CRC(85ba9a86) SHA1(aa9b6170135e9e420509e8f7c1702c9896bc5d8e) ) + ROM_LOAD( "fruitcocktail2_old.008", 0x380000, 0x80000, CRC(a27c49a2) SHA1(7c9ee0e01f76ca3ab6716579f5dde7036050970b) ) +ROM_END + +ROM_START( fcockt2_4 ) // 081105 + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "fc2_m_081105.rom", 0x00000, 0x40000, CRC(2cc5313d) SHA1(b5e55acbb5936f49130758947ae22d1847800333) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2.005", 0x080000, 0x80000, CRC(3fc13d72) SHA1(ba0727138ef03d576d190cbce04b9eb0bba88a9a) ) + ROM_LOAD( "fruitcocktail2.006", 0x180000, 0x80000, CRC(8fc75fd7) SHA1(3b7cd8a3e04ca9d4494b37c801e21d1293f094e8) ) + ROM_LOAD( "fruitcocktail2.007", 0x280000, 0x80000, CRC(d37fcc0f) SHA1(57c2ea5dc747f16e2233305f2c73cb4b632aae2c) ) + ROM_LOAD( "fruitcocktail2.008", 0x380000, 0x80000, CRC(e3a9442c) SHA1(cbaba182e858b0f158756118e5da873e3ddfc0b9) ) +ROM_END + +ROM_START( fcockt2_5 ) // 081106 + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "fc2_081106.rom", 0x00000, 0x40000, CRC(d23347b3) SHA1(2d7d00af182c61fa166a8f3fd6fd830cf5eb78c6) ) + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2.005", 0x080000, 0x80000, CRC(3fc13d72) SHA1(ba0727138ef03d576d190cbce04b9eb0bba88a9a) ) + ROM_LOAD( "fruitcocktail2.006", 0x180000, 0x80000, CRC(8fc75fd7) SHA1(3b7cd8a3e04ca9d4494b37c801e21d1293f094e8) ) + ROM_LOAD( "fruitcocktail2.007", 0x280000, 0x80000, CRC(d37fcc0f) SHA1(57c2ea5dc747f16e2233305f2c73cb4b632aae2c) ) + ROM_LOAD( "fruitcocktail2.008", 0x380000, 0x80000, CRC(e3a9442c) SHA1(cbaba182e858b0f158756118e5da873e3ddfc0b9) ) +ROM_END /********************************************************* Crazy Monkey 2 @@ -2562,11 +2690,11 @@ */ -#define mfish_parent mfish_3 +#define mfish_parent mfish_13 GAME( 2002, goldfish, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Gold Fish (020903, prototype)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2002, mfish, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021120)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2002, mfish_2, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021121)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2002, mfish_3, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021124)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2002, mfish_3, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021124)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2002, mfish_4, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021219)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2002, mfish_5, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (021227)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2002, mfish_6, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (030124)", GAME_SUPPORTS_SAVE ) /* World */ @@ -2576,65 +2704,70 @@ //GAME( 2002, mfish_10, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (031117)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2002, mfish_11, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (031124)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2002, mfish_12, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (040308)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2002, mfish_13, mfish_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (040316)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2002, mfish_13, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Multi Fish (040316)", GAME_SUPPORTS_SAVE ) /* World */ -#define crzmon_parent crzmon_5 +#define crzmon_parent crzmon_8 //GAME( 2003, crzmon, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030217 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, crzmon_2, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030225 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, crzmon_3, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030227 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, crzmon_4, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030404 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, crzmon_5, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030421 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, crzmon_5, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (030421 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, crzmon_6, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (031016 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, crzmon_7, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (031110 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, crzmon_8, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (050120 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, crzmon_8, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (050120 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, crzmon_9, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (070315 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +//GAME( 2003, crzmon_10, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (081027 Lottery)", GAME_SUPPORTS_SAVE ) /* Lottery */ +//GAME( 2003, crzmon_11, crzmon_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Crazy Monkey (081113 Lottery)", GAME_SUPPORTS_SAVE ) /* Lottery */ -#define fcockt_parent fcockt_3 +#define fcockt_parent fcockt_8 //GAME( 2003, fcockt, fcockt_parent multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (030505 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, fcockt_2, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (030512 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, fcockt_3, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (030623 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, fcockt_3, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (030623 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, fcockt_4, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (031028 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, fcockt_5, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (031111 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, fcockt_6, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (040216 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, fcockt_7, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (050118 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, fcockt_8, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (060111 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, fcockt_8, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (060111 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, fcockt_9, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (070305 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2003, fcockt_10, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (070517 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2003, fcockt_11, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (070822 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2003, fcockt_12, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (070911 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +//GAME( 2003, fcockt_13, fcockt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail (081124 Lottery)", GAME_SUPPORTS_SAVE ) /* Lottery */ -#define lhaunt_parent lhaunt_2 +#define lhaunt_parent lhaunt_6 //GAME( 2003, lhaunt, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (030707 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, lhaunt_2, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (030804 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, lhaunt_2, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (030804 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2003, lhaunt_3, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (031027 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, lhaunt_4, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (031111 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, lhaunt_5, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (040216 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, lhaunt_6, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (040825 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, lhaunt_6, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (040825 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, lhaunt_7, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (070402 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2003, lhaunt_8, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (070604 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +//GAME( 2003, lhaunt_9, lhaunt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Lucky Haunter (081208 Lottery)", GAME_SUPPORTS_SAVE ) /* Lottery */ -#define rollfr_parent rollfr_2 +#define rollfr_parent rollfr_4 //GAME( 2003, rollfr, rollfr_parent, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (030821)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, rollfr_2, 0, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (040318)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, rollfr_2, rollfr_parent, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (040318)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2003, rollfr_3, rollfr_parent, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (080327)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2003, rollfr_4, rollfr_parent, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (080331)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2003, rollfr_4, 0, rollfr, rollfr, 0, ROT0, "Igrosoft", "Roll Fruit (080331)", GAME_SUPPORTS_SAVE ) /* World */ -#define garage_parent garage_4 +#define garage_parent garage_5 //GAME( 2004, garage, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (040122 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2004, garage_2, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (040123 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2004, garage_3, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (040216 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2004, garage_4, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (040219 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2004, garage_5, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (050311 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2004, garage_4, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (040219 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2004, garage_5, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (050311 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2004, garage_6, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (070213 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2004, garage_7, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (070329 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +//GAME( 2004, garage_8, garage_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Garage (081229 Lottery)", GAME_SUPPORTS_SAVE ) /* Lottery */ -#define rclimb_parent rclimb - GAME( 2004, rclimb, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (040815 World)", GAME_SUPPORTS_SAVE ) /* World */ +#define rclimb_parent rclimb_3 + GAME( 2004, rclimb, rclimb_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (040815 World)", GAME_SUPPORTS_SAVE ) /* World */ //GAME( 2004, rclimb_2, rclimb_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (040823 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2004, rclimb_3, rclimb_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (040827 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2004, rclimb_3, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (040827 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2004, rclimb_4, rclimb_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (070322 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2004, rclimb_5, rclimb_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Rock Climber (070621 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ @@ -2643,9 +2776,9 @@ GAME( 2004, sweetl, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Sweet Life (041220 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2004, sweetl_2, sweetl_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Sweet Life (070412 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ -#define resdnt_parent resdnt - GAME( 2004, resdnt, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Resident (040415 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2004, resdnt_2, resdnt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Resident (040513 World)", GAME_SUPPORTS_SAVE ) /* World */ +#define resdnt_parent resdnt_2 + GAME( 2004, resdnt, resdnt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Resident (040415 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2004, resdnt_2, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Resident (040513 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2004, resdnt_3, resdnt_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Resident (070222 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ @@ -2653,10 +2786,10 @@ GAME( 2005, island, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Island (050713 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2005, island_2, island_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Island (070409 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ -#define pirate_parent pirate_2 +#define pirate_parent pirate_3 //GAME( 2005, pirate, pirate_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (051229 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2005, pirate_2, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (060210 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2005, pirate_3, pirate_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (060803 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2005, pirate_2, pirate_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (060210 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2005, pirate_3, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (060803 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2005, pirate_4, pirate_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate (070412 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ #define island2_parent island2 @@ -2671,16 +2804,16 @@ GAME( 2006, pirate2_2, pirate2_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Pirate 2 (070126 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ -#define keks_parent keks - GAME( 2006, keks, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Keks (060328 World)", GAME_SUPPORTS_SAVE ) /* World */ - GAME( 2006, keks_2, keks_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Keks (060403 World)", GAME_SUPPORTS_SAVE ) /* World */ +#define keks_parent keks_2 + GAME( 2006, keks, keks_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Keks (060328 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2006, keks_2, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Keks (060403 World)", GAME_SUPPORTS_SAVE ) /* World */ GAME( 2006, keks_3, keks_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Keks (070119 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ -#define gnome_parent gnome - GAME( 2007, gnome, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Gnome (070906 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +#define gnome_parent gnome_3 + GAME( 2007, gnome, gnome_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Gnome (070906 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ GAME( 2007, gnome_2, gnome_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Gnome (071115 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ - GAME( 2007, gnome_3, gnome_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Gnome (080303 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2007, gnome_3, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Gnome (080303 World)", GAME_SUPPORTS_SAVE ) /* World */ #define sweetl2_parent sweetl2 @@ -2689,6 +2822,10 @@ #define fcockt2_parent fcockt2 GAME( 2008, fcockt2, 0, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail 2 (080707 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ +//GAME( 2008, fcockt2_2, fcockt2_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail 2 (080904 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ + GAME( 2008, fcockt2_3, fcockt2_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail 2 (080909 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2008, fcockt2_4, fcockt2_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail 2 (081105 World)", GAME_SUPPORTS_SAVE ) /* World */ + GAME( 2008, fcockt2_5, fcockt2_parent, multfish, multfish, 0, ROT0, "Igrosoft", "Fruit Cocktail 2 (081106 Russia)", GAME_SUPPORTS_SAVE ) /* Russia */ @@ -4234,6 +4371,96 @@ ROM_LOAD( "fruitcocktail2_old.008", 0x380000, 0x80000, CRC(a27c49a2) SHA1(7c9ee0e01f76ca3ab6716579f5dde7036050970b) ) ROM_END +ROM_START( fcockt2_4a ) // 081105 bank F9 + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105a.rom", 0x00000, 0x40000, CRC(411ad706) SHA1(4d29a6b1927241efdcdb3224b9ebe0eb6af92533) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2.005", 0x080000, 0x80000, CRC(3fc13d72) SHA1(ba0727138ef03d576d190cbce04b9eb0bba88a9a) ) + ROM_LOAD( "fruitcocktail2.006", 0x180000, 0x80000, CRC(8fc75fd7) SHA1(3b7cd8a3e04ca9d4494b37c801e21d1293f094e8) ) + ROM_LOAD( "fruitcocktail2.007", 0x280000, 0x80000, CRC(d37fcc0f) SHA1(57c2ea5dc747f16e2233305f2c73cb4b632aae2c) ) + ROM_LOAD( "fruitcocktail2.008", 0x380000, 0x80000, CRC(e3a9442c) SHA1(cbaba182e858b0f158756118e5da873e3ddfc0b9) ) +ROM_END + +ROM_START( fcockt2_4b ) // 081105 bank F9, no credit limit, "MaxVin" signature + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105_cm.rom", 0x00000, 0x40000, CRC(f0c702b9) SHA1(89121ddd325aac567ebd443eb443c4db0549236c) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2.005", 0x080000, 0x80000, CRC(3fc13d72) SHA1(ba0727138ef03d576d190cbce04b9eb0bba88a9a) ) + ROM_LOAD( "fruitcocktail2.006", 0x180000, 0x80000, CRC(8fc75fd7) SHA1(3b7cd8a3e04ca9d4494b37c801e21d1293f094e8) ) + ROM_LOAD( "fruitcocktail2.007", 0x280000, 0x80000, CRC(d37fcc0f) SHA1(57c2ea5dc747f16e2233305f2c73cb4b632aae2c) ) + ROM_LOAD( "fruitcocktail2.008", 0x380000, 0x80000, CRC(e3a9442c) SHA1(cbaba182e858b0f158756118e5da873e3ddfc0b9) ) +ROM_END + +ROM_START( fcockt2_4c ) // 081105 custom alteras, modified graphics, bank F9, many texts changed, changed version text to "VIDEO GAME-1 FR02" + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105b.rom", 0x00000, 0x40000, CRC(b627f7d6) SHA1(0bcdb1cd808055d0a9e965f2c6ff522ac3fe6949) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "bootleg_1b", 0x000000, 0x80000, CRC(68b62355) SHA1(387da330fddaa685cb7aca32bf861e44d5cdbe58) ) + ROM_LOAD( "bootleg_2b", 0x100000, 0x80000, CRC(d36e8704) SHA1(80a84a24b3a43a0110a00ed3b01c7156218ccbf3) ) + ROM_LOAD( "bootleg_3b", 0x200000, 0x80000, CRC(57d87c5b) SHA1(6bc28e5c34a7e76d0e601b970ab922e5ad28ae85) ) + ROM_LOAD( "bootleg_4b", 0x300000, 0x80000, CRC(3de30bab) SHA1(c4c4c549ad980f562238054cd0e3ef6b0977f7b7) ) + ROM_LOAD( "bootleg_5b", 0x080000, 0x80000, CRC(b47d65aa) SHA1(71c642ea7887ea35c6d7d985502082d2424c035a) ) + ROM_LOAD( "bootleg_6b", 0x180000, 0x80000, CRC(aa982f4e) SHA1(edf75d4ddd60532ac0ca2e17e3fd9004aa768973) ) + ROM_LOAD( "bootleg_7b", 0x280000, 0x80000, CRC(b9b1ead7) SHA1(111e505fce8fe75043ff7cc5dc68e81ce4f98d06) ) + ROM_LOAD( "bootleg_8b", 0x380000, 0x80000, CRC(8e49d1c1) SHA1(4735503335cf499895d1b2d9a405be50f21a2d68) ) +ROM_END + +ROM_START( fcockt2_4d ) // 081105 bank F9, no credit limit, "MaxVin" signature, payout percentage 70% + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105c.rom", 0x00000, 0x40000, CRC(b6d88fcc) SHA1(337a59accfbc229be05aff84ba70fc135fde09de) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "fruitcocktail2.001", 0x000000, 0x80000, CRC(d1b9416d) SHA1(4d3cb0a6dbcf02bbd20d5c43df358882b2ad794d) ) + ROM_LOAD( "fruitcocktail2.002", 0x100000, 0x80000, CRC(69236be1) SHA1(9a2e6c8f279714f79a606c0b118b6bf1d8442cda) ) + ROM_LOAD( "fruitcocktail2.003", 0x200000, 0x80000, CRC(29aade8c) SHA1(bef42f8a25c90e3a1cccd13872a10eb8b2b2e276) ) + ROM_LOAD( "fruitcocktail2.004", 0x300000, 0x80000, CRC(4b9646e7) SHA1(26548a018401f4e07383eb145f8f0847677f3272) ) + ROM_LOAD( "fruitcocktail2.005", 0x080000, 0x80000, CRC(3fc13d72) SHA1(ba0727138ef03d576d190cbce04b9eb0bba88a9a) ) + ROM_LOAD( "fruitcocktail2.006", 0x180000, 0x80000, CRC(8fc75fd7) SHA1(3b7cd8a3e04ca9d4494b37c801e21d1293f094e8) ) + ROM_LOAD( "fruitcocktail2.007", 0x280000, 0x80000, CRC(d37fcc0f) SHA1(57c2ea5dc747f16e2233305f2c73cb4b632aae2c) ) + ROM_LOAD( "fruitcocktail2.008", 0x380000, 0x80000, CRC(e3a9442c) SHA1(cbaba182e858b0f158756118e5da873e3ddfc0b9) ) +ROM_END + +ROM_START( fcockt2_4e ) // 081105 bank F9, modified graphics, changed version text to "MDS_is_the_best_ LOTTOGAME (I)" + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105d.rom", 0x00000, 0x40000, CRC(37b1a159) SHA1(52c8e825ebb85a59803a6d14c766892e56a72c9e) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "bootleg_1c", 0x000000, 0x80000, CRC(9fe02e19) SHA1(dec48a0990d2341ae86a3a4acd5972844b93fccb) ) + ROM_LOAD( "bootleg_2c", 0x100000, 0x80000, CRC(734bd656) SHA1(e44124fd60675cfc8319bca5bbd90f99d73f4896) ) + ROM_LOAD( "bootleg_3c", 0x200000, 0x80000, CRC(36ff74dc) SHA1(7df93e4fa1c240adf33ef910efb8397abfa1a106) ) + ROM_LOAD( "bootleg_4c", 0x300000, 0x80000, CRC(b88356c9) SHA1(fbdcfc0d30f2a9b1364863d7a06b32f94113e865) ) + ROM_LOAD( "bootleg_5c", 0x080000, 0x80000, CRC(14053302) SHA1(adf0a1493074d16797e8d19dc98f2d5d2cb26e43) ) + ROM_LOAD( "bootleg_6c", 0x180000, 0x80000, CRC(21a91970) SHA1(6f4832c743469171cd0efe4554f243c4bed21e88) ) + ROM_LOAD( "bootleg_7c", 0x280000, 0x80000, CRC(3a8a7340) SHA1(9408791686926dd13216352ffcb04ad9f8954b3e) ) + ROM_LOAD( "bootleg_8c", 0x380000, 0x80000, CRC(fbf48ebd) SHA1(04917e613d9a3f0caeab71c78b9f77c4b5b84988) ) +ROM_END + +ROM_START( fcockt2_4f ) // 081105 custom alteras, modified graphics, bank F9, many texts changed, changed version text to "LOTOS FR02" + ROM_REGION( 0x40000, "maincpu", 0 ) // z80 code, banked + ROM_LOAD( "bootleg_fc2_m_081105f.rom", 0x00000, 0x40000, CRC(b4fa0663) SHA1(aee3cb980fc7d9fbba1a4e9fe80e6be8df58bb3b) ) /* Not officially listed on Igrosoft's web site hash page */ + + ROM_REGION( 0x400000, "gfx", 0 ) + ROM_LOAD( "bootleg_1e", 0x000000, 0x80000, CRC(3c72a5e2) SHA1(15e07d64a0d633ccdadea9eb55556e6aa239c0e5) ) + ROM_LOAD( "bootleg_2e", 0x100000, 0x80000, CRC(017a61f7) SHA1(023cec2be1cfe885c562415d18fc32edf3c61346) ) + ROM_LOAD( "bootleg_3e", 0x200000, 0x80000, CRC(8ea5532f) SHA1(498991cfb7a92c3a6342e824a310c7edc5577cff) ) + ROM_LOAD( "bootleg_4e", 0x300000, 0x80000, CRC(c879025f) SHA1(93f77787ded2a4353320dcb9d4d1b1f5dd7a3b13) ) + ROM_LOAD( "bootleg_5b", 0x080000, 0x80000, CRC(b47d65aa) SHA1(71c642ea7887ea35c6d7d985502082d2424c035a) ) + ROM_LOAD( "bootleg_6b", 0x180000, 0x80000, CRC(aa982f4e) SHA1(edf75d4ddd60532ac0ca2e17e3fd9004aa768973) ) + ROM_LOAD( "bootleg_7b", 0x280000, 0x80000, CRC(b9b1ead7) SHA1(111e505fce8fe75043ff7cc5dc68e81ce4f98d06) ) + ROM_LOAD( "bootleg_8b", 0x380000, 0x80000, CRC(8e49d1c1) SHA1(4735503335cf499895d1b2d9a405be50f21a2d68) ) +ROM_END + GAME( 2002, mfish_3a, mfish_parent, multfish, multfish, 0, ROT0, "bootleg", "Multi Fish (bootleg, 021124, banking address hack)", GAME_SUPPORTS_SAVE ) // bank F9 GAME( 2002, mfish_12a, mfish_parent, multfish, multfish, 0, ROT0, "bootleg", "Multi Fish (bootleg, 040308, banking address hack)", GAME_SUPPORTS_SAVE ) // bank F9 @@ -4349,6 +4576,12 @@ GAME( 2007, sweetl2_2d, sweetl2_parent, multfish, multfish, 0, ROT0, "bootleg", "Sweet Life 2 (bootleg, 080320, LOTTOGAME (I))", GAME_SUPPORTS_SAVE ) // bank F9, modified graphics, changed version text to "MDS_is_the_best_ LOTTOGAME (I)" GAME( 2008, fcockt2a, fcockt2_parent, multfish, multfish, 0, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 080707, banking address hack)", GAME_SUPPORTS_SAVE ) // bank F9 +GAME( 2008, fcockt2_4a, fcockt2_parent, multfish, multfish, 0, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, banking address hack)", GAME_SUPPORTS_SAVE ) // bank F9 +GAME( 2008, fcockt2_4b, fcockt2_parent, multfish, multfish, 0, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, banking address hack, no credit limit)", GAME_SUPPORTS_SAVE ) // bank F9, no credit limit, "MaxVin" signature +GAME( 2008, fcockt2_4c, fcockt2_parent, multfish, multfish, customl, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, VIDEO GAME-1 FR02)", GAME_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, many texts changed, changed version text to "VIDEO GAME-1 FR02" +GAME( 2008, fcockt2_4d, fcockt2_parent, multfish, multfish, 0, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, banking address hack, payout percentage 70)", GAME_SUPPORTS_SAVE ) // bank F9, no credit limit, "MaxVin" signature, payout percentage 70% +GAME( 2008, fcockt2_4e, fcockt2_parent, multfish, multfish, 0, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, LOTTOGAME (I))", GAME_SUPPORTS_SAVE ) // bank F9, modified graphics, changed version text to "MDS_is_the_best_ LOTTOGAME (I)" +GAME( 2008, fcockt2_4f, fcockt2_parent, multfish, multfish, customl, ROT0, "bootleg", "Fruit Cocktail 2 (bootleg, 081105, LOTOS FR02)", GAME_SUPPORTS_SAVE ) // custom alteras, modified graphics, bank F9, many texts changed, changed version text to "LOTOS FR02" /* 0x000000 - 0x03ffff Crazy Monkey V03-1110 diff -Nru mame-0.144/src/mame/drivers/multigam.c mame-0.145/src/mame/drivers/multigam.c --- mame-0.144/src/mame/drivers/multigam.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/multigam.c 2012-02-06 21:30:36.000000000 +0000 @@ -205,7 +205,8 @@ static WRITE8_HANDLER( sprite_dma_w ) { int source = (data & 7); - ppu2c0x_spriteram_dma(space, space->machine().device("ppu"), source); + ppu2c0x_device *ppu = space->machine().device("ppu"); + ppu->spriteram_dma(space, source); } static READ8_DEVICE_HANDLER( psg_4015_r ) @@ -328,7 +329,7 @@ static ADDRESS_MAP_START( multigam_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM /* NES RAM */ AM_RANGE(0x0800, 0x0fff) AM_RAM /* additional RAM */ - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -348,7 +349,7 @@ AM_RANGE(0x0800, 0x0fff) AM_RAM /* additional RAM */ AM_RANGE(0x3000, 0x3000) AM_WRITE(multigam_switch_prg_rom) AM_RANGE(0x3fff, 0x3fff) AM_WRITE(multigam_switch_gfx_rom) - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -384,7 +385,7 @@ static WRITE8_HANDLER( multigam3_mmc3_rom_switch_w ) { multigam_state *state = space->machine().driver_data(); - device_t *ppu = space->machine().device("ppu"); + ppu2c0x_device *ppu = space->machine().device("ppu"); /* basically, a MMC3 mapper from the nes */ int bankmask = state->m_multigam3_mmc3_prg_size == 0x40000 ? 0x1f : 0x0f; @@ -521,11 +522,11 @@ break; case 0x6000: /* disable irqs */ - ppu2c0x_set_scanline_callback(ppu, 0); + ppu->set_scanline_callback(0); break; case 0x6001: /* enable irqs */ - ppu2c0x_set_scanline_callback(ppu, multigam3_mmc3_scanline_cb); + ppu->set_scanline_callback(multigam3_mmc3_scanline_cb); break; } } @@ -617,7 +618,7 @@ static ADDRESS_MAP_START( multigm3_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM /* NES RAM */ AM_RANGE(0x0800, 0x0fff) AM_RAM /* additional RAM */ - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -651,14 +652,14 @@ static void multigam_init_mapper02(running_machine &machine, UINT8* prg_base, int prg_size) { multigam_state *state = machine.driver_data(); + ppu2c0x_device *ppu = machine.device("ppu"); UINT8* mem = machine.region("maincpu")->base(); memcpy(mem + 0x8000, prg_base + prg_size - 0x8000, 0x8000); machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x8000, 0xffff, FUNC(multigam3_mapper02_rom_switch_w) ); state->m_mapper02_prg_base = prg_base; state->m_mapper02_prg_size = prg_size; - - ppu2c0x_set_scanline_callback(machine.device("ppu"), 0); + ppu->set_scanline_callback(0); } /****************************************************** @@ -807,6 +808,7 @@ { multigam_state *state = machine.driver_data(); UINT8* dst = machine.region("maincpu")->base(); + ppu2c0x_device *ppu = machine.device("ppu"); memcpy(&dst[0x8000], prg_base + (prg_size - 0x8000), 0x8000); @@ -818,8 +820,7 @@ state->m_mmc1_prg_size = prg_size; state->m_mmc1_chr_bank_base = chr_bank_base; - ppu2c0x_set_scanline_callback(machine.device("ppu"), 0); - + ppu->set_scanline_callback(0); }; @@ -848,7 +849,7 @@ static void supergm3_set_bank(running_machine &machine) { multigam_state *state = machine.driver_data(); - device_t *ppu = machine.device("ppu"); + ppu2c0x_device *ppu = machine.device("ppu"); UINT8* mem = machine.region("maincpu")->base(); // video bank @@ -884,7 +885,7 @@ // title screen memcpy(mem + 0x8000, mem + 0x18000, 0x8000); memory_set_bankptr(machine, "bank10", mem + 0x6000); - ppu2c0x_set_scanline_callback(ppu, 0); + ppu->set_scanline_callback(0); } else if ((state->m_supergm3_prg_bank & 0x40) == 0) { @@ -933,7 +934,7 @@ static ADDRESS_MAP_START( supergm3_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM /* NES RAM */ AM_RANGE(0x0800, 0x0fff) AM_RAM /* additional RAM */ - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) /* PSG primary registers */ AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) AM_RANGE(0x4015, 0x4015) AM_DEVREADWRITE("nes", psg_4015_r, psg_4015_w) /* PSG status / first control register */ @@ -1069,7 +1070,8 @@ static PALETTE_INIT( multigam ) { - ppu2c0x_init_palette(machine, 0); + ppu2c0x_device *ppu = machine.device("ppu"); + ppu->init_palette(machine, 0); } static void ppu_irq( device_t *device, int *ppu_regs ) @@ -1080,6 +1082,8 @@ /* our ppu interface */ static const ppu2c0x_interface ppu_interface = { + "maincpu", + "screen", 0, /* gfxlayout num */ 0, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -1090,10 +1094,11 @@ { } -static SCREEN_UPDATE( multigam ) +static SCREEN_UPDATE_IND16( multigam ) { /* render the ppu */ - ppu2c0x_render(screen->machine().device("ppu"), bitmap, 0, 0, 0, 0); + ppu2c0x_device *ppu = screen.machine().device("ppu"); + ppu->render(bitmap, 0, 0, 0, 0); return 0; } @@ -1181,10 +1186,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(multigam) + MCFG_SCREEN_UPDATE_STATIC(multigam) MCFG_GFXDECODE(multigam) MCFG_PALETTE_LENGTH(8*4*16) diff -Nru mame-0.144/src/mame/drivers/munchmo.c mame-0.145/src/mame/drivers/munchmo.c --- mame-0.144/src/mame/drivers/munchmo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/munchmo.c 2012-02-06 21:30:38.000000000 +0000 @@ -9,7 +9,6 @@ Known Issues: - it's unclear if mirroring the videoram chunks is correct behavior - several unmapped registers - - sustained sounds (when there should be silence) Stephh's notes (based on the game Z80 code and some tests) : @@ -25,7 +24,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "includes/munchmo.h" @@ -43,39 +41,32 @@ state->m_nmi_enable = data; } -static INTERRUPT_GEN( mnchmobl_interrupt ) +/* trusted thru schematics, NMI and IRQ triggers at vblank, at the same time (!) */ +static INTERRUPT_GEN( mnchmobl_vblank_irq ) { munchmo_state *state = device->machine().driver_data(); - state->m_which = !state->m_which; - if (state->m_which) - device_set_input_line(device, 0, HOLD_LINE); - else if (state->m_nmi_enable) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + if (state->m_nmi_enable) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); + + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } static INTERRUPT_GEN( mnchmobl_sound_irq ) { - munchmo_state *state = device->machine().driver_data(); + //munchmo_state *state = device->machine().driver_data(); - if (!(state->m_sound_nmi_enable)) - device_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); + device_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); } static WRITE8_HANDLER( mnchmobl_soundlatch_w ) { munchmo_state *state = space->machine().driver_data(); - soundlatch_w(space, offset, data); + soundlatch_w(space, 0, data); device_set_input_line(state->m_audiocpu, 0, HOLD_LINE ); } -static WRITE8_HANDLER( sound_nmi_enable_w ) -{ - munchmo_state *state = space->machine().driver_data(); - state->m_sound_nmi_enable = data & 1; -} - static WRITE8_HANDLER( sound_nmi_ack_w ) { @@ -83,6 +74,11 @@ device_set_input_line(state->m_audiocpu, INPUT_LINE_NMI, CLEAR_LINE); } +static READ8_DEVICE_HANDLER( munchmo_ayreset_r ) +{ + ay8910_reset_w(device,0,0); + return 0; +} /************************************* * @@ -114,17 +110,18 @@ AM_RANGE(0xbf03, 0xbf03) AM_READ_PORT("P2") ADDRESS_MAP_END +/* memory map provided thru schematics */ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM - AM_RANGE(0x2000, 0x2000) AM_READ(soundlatch_r) - AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("ay1", ay8910_data_w) - AM_RANGE(0x5000, 0x5000) AM_DEVWRITE("ay1", ay8910_address_w) - AM_RANGE(0x6000, 0x6000) AM_DEVWRITE("ay2", ay8910_data_w) - AM_RANGE(0x7000, 0x7000) AM_DEVWRITE("ay2", ay8910_address_w) - AM_RANGE(0x8000, 0x8000) AM_WRITENOP /* ? */ - AM_RANGE(0xa000, 0xa000) AM_WRITE(sound_nmi_enable_w) - AM_RANGE(0xc000, 0xc000) AM_WRITE(sound_nmi_ack_w) - AM_RANGE(0xe000, 0xe7ff) AM_RAM + AM_RANGE(0x2000, 0x3fff) AM_READ(soundlatch_r) + AM_RANGE(0x4000, 0x4fff) AM_DEVWRITE("ay1", ay8910_data_w) + AM_RANGE(0x5000, 0x5fff) AM_DEVWRITE("ay1", ay8910_address_w) + AM_RANGE(0x6000, 0x6fff) AM_DEVWRITE("ay2", ay8910_data_w) + AM_RANGE(0x7000, 0x7fff) AM_DEVWRITE("ay2", ay8910_address_w) + AM_RANGE(0x8000, 0x9fff) AM_DEVREADWRITE("ay1", munchmo_ayreset_r, ay8910_reset_w) + AM_RANGE(0xa000, 0xbfff) AM_DEVREADWRITE("ay2", munchmo_ayreset_r, ay8910_reset_w) + AM_RANGE(0xc000, 0xdfff) AM_WRITE(sound_nmi_ack_w) + AM_RANGE(0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_RAM // is mirror ok? ADDRESS_MAP_END @@ -315,7 +312,6 @@ state->save_item(NAME(state->m_palette_bank)); state->save_item(NAME(state->m_flipscreen)); state->save_item(NAME(state->m_nmi_enable)); - state->save_item(NAME(state->m_which)); } static MACHINE_RESET( munchmo ) @@ -325,7 +321,6 @@ state->m_palette_bank = 0; state->m_flipscreen = 0; state->m_nmi_enable = 0; - state->m_which = 0; } static MACHINE_CONFIG_START( mnchmobl, munchmo_state ) @@ -333,7 +328,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_15MHz/4) /* ? */ MCFG_CPU_PROGRAM_MAP(mnchmobl_map) - MCFG_CPU_VBLANK_INT_HACK(mnchmobl_interrupt,2) + MCFG_CPU_VBLANK_INT("screen", mnchmobl_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_15MHz/4) /* ? */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -346,10 +341,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256+32+32, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255+32+32,0, 255-16) - MCFG_SCREEN_UPDATE(mnchmobl) + MCFG_SCREEN_UPDATE_STATIC(mnchmobl) MCFG_GFXDECODE(mnchmobl) MCFG_PALETTE_LENGTH(256) @@ -438,5 +432,5 @@ * *************************************/ -GAME( 1983, joyfulr, 0, mnchmobl, mnchmobl, 0, ROT270, "SNK", "Joyful Road (Japan)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) -GAME( 1983, mnchmobl, joyfulr, mnchmobl, mnchmobl, 0, ROT270, "SNK (Centuri license)", "Munch Mobile (US)", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1983, joyfulr, 0, mnchmobl, mnchmobl, 0, ROT270, "SNK", "Joyful Road (Japan)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) +GAME( 1983, mnchmobl, joyfulr, mnchmobl, mnchmobl, 0, ROT270, "SNK (Centuri license)", "Munch Mobile (US)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/murogem.c mame-0.145/src/mame/drivers/murogem.c --- mame-0.144/src/mame/drivers/murogem.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/murogem.c 2012-02-06 21:30:36.000000000 +0000 @@ -199,13 +199,13 @@ static PALETTE_INIT(murogem) {} -static SCREEN_UPDATE(murogem) +static SCREEN_UPDATE_IND16(murogem) { - murogem_state *state = screen->machine().driver_data(); + murogem_state *state = screen.machine().driver_data(); int xx,yy,count; count = 0x000; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (yy=0;yy<32;yy++) { @@ -214,7 +214,7 @@ int tileno = state->m_videoram[count]&0x3f; int attr = state->m_videoram[count+0x400]&0x0f; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0],tileno,attr,0,0,xx*8,yy*8,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0],tileno,attr,0,0,xx*8,yy*8,0); count++; @@ -250,10 +250,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((39+1)*8, (38+1)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(murogem) + MCFG_SCREEN_UPDATE_STATIC(murogem) MCFG_GFXDECODE(murogem) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/murogmbl.c mame-0.145/src/mame/drivers/murogmbl.c --- mame-0.144/src/mame/drivers/murogmbl.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/murogmbl.c 2012-02-06 21:30:35.000000000 +0000 @@ -90,10 +90,10 @@ } -static SCREEN_UPDATE(murogmbl) +static SCREEN_UPDATE_IND16(murogmbl) { - murogmbl_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + murogmbl_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0; int y, x; @@ -187,12 +187,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(murogmbl) + MCFG_SCREEN_UPDATE_STATIC(murogmbl) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/mustache.c mame-0.145/src/mame/drivers/mustache.c --- mame-0.144/src/mame/drivers/mustache.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mustache.c 2012-02-06 21:30:37.000000000 +0000 @@ -201,10 +201,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56.747) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0, 31*8-1) - MCFG_SCREEN_UPDATE(mustache) + MCFG_SCREEN_UPDATE_STATIC(mustache) MCFG_GFXDECODE(mustache) MCFG_PALETTE_LENGTH(8*16+16*8) diff -Nru mame-0.144/src/mame/drivers/mw8080bw.c mame-0.145/src/mame/drivers/mw8080bw.c --- mame-0.144/src/mame/drivers/mw8080bw.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/mw8080bw.c 2012-02-06 21:30:37.000000000 +0000 @@ -232,9 +232,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MW8080BW_PIXEL_CLOCK, MW8080BW_HTOTAL, MW8080BW_HBEND, MW8080BW_HPIXCOUNT, MW8080BW_VTOTAL, MW8080BW_VBEND, MW8080BW_VBSTART) - MCFG_SCREEN_UPDATE(mw8080bw) + MCFG_SCREEN_UPDATE_STATIC(mw8080bw) MACHINE_CONFIG_END @@ -2286,7 +2285,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(spcenctr) + MCFG_SCREEN_UPDATE_STATIC(spcenctr) /* audio hardware */ MCFG_FRAGMENT_ADD(spcenctr_audio) @@ -2374,8 +2373,8 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(phantom2) - MCFG_SCREEN_EOF(phantom2) + MCFG_SCREEN_UPDATE_STATIC(phantom2) + MCFG_SCREEN_VBLANK_STATIC(phantom2) /* add shifter */ MCFG_MB14241_ADD("mb14241") @@ -2730,7 +2729,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(invaders) + MCFG_SCREEN_UPDATE_STATIC(invaders) /* add shifter */ MCFG_MB14241_ADD("mb14241") diff -Nru mame-0.144/src/mame/drivers/mwarr.c mame-0.145/src/mame/drivers/mwarr.c --- mame-0.144/src/mame/drivers/mwarr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/mwarr.c 2012-02-06 21:30:39.000000000 +0000 @@ -89,7 +89,7 @@ mwarr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( mlow_videoram_w ) @@ -97,7 +97,7 @@ mwarr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mlow_videoram[offset]); - tilemap_mark_tile_dirty(state->m_mlow_tilemap,offset); + state->m_mlow_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( mhigh_videoram_w ) @@ -105,7 +105,7 @@ mwarr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mhigh_videoram[offset]); - tilemap_mark_tile_dirty(state->m_mhigh_tilemap,offset); + state->m_mhigh_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( tx_videoram_w ) @@ -113,7 +113,7 @@ mwarr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } static WRITE16_DEVICE_HANDLER( oki1_bank_w ) @@ -384,18 +384,18 @@ state->m_mhigh_tilemap = tilemap_create(machine, get_mhigh_tile_info, tilemap_scan_cols, 16, 16, 64, 16); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_mlow_tilemap, 0); - tilemap_set_transparent_pen(state->m_mhigh_tilemap, 0); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - - tilemap_set_scroll_rows(state->m_bg_tilemap, 256); - tilemap_set_scroll_rows(state->m_mlow_tilemap, 256); - tilemap_set_scroll_rows(state->m_mhigh_tilemap, 256); + state->m_mlow_tilemap->set_transparent_pen(0); + state->m_mhigh_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->set_scroll_rows(256); + state->m_mlow_tilemap->set_scroll_rows(256); + state->m_mhigh_tilemap->set_scroll_rows(256); state->save_item(NAME(state->m_sprites_buffer)); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mwarr_state *state = machine.driver_data(); const UINT16 *source = state->m_sprites_buffer + 0x800 - 4; @@ -466,58 +466,58 @@ } } -static SCREEN_UPDATE( mwarr ) +static SCREEN_UPDATE_IND16( mwarr ) { - mwarr_state *state = screen->machine().driver_data(); + mwarr_state *state = screen.machine().driver_data(); int i; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (BIT(state->m_vidattrram[6], 0)) { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_bg_scrollram[i] + 20); + state->m_bg_tilemap->set_scrollx(i, state->m_bg_scrollram[i] + 20); } else { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_bg_scrollram[0] + 19); + state->m_bg_tilemap->set_scrollx(i, state->m_bg_scrollram[0] + 19); } if (BIT(state->m_vidattrram[6], 2)) { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_mlow_tilemap, i, state->m_mlow_scrollram[i] + 19); + state->m_mlow_tilemap->set_scrollx(i, state->m_mlow_scrollram[i] + 19); } else { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_mlow_tilemap, i, state->m_mlow_scrollram[0] + 19); + state->m_mlow_tilemap->set_scrollx(i, state->m_mlow_scrollram[0] + 19); } if (BIT(state->m_vidattrram[6], 4)) { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_mhigh_tilemap, i, state->m_mhigh_scrollram[i] + 19); + state->m_mhigh_tilemap->set_scrollx(i, state->m_mhigh_scrollram[i] + 19); } else { for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_mhigh_tilemap, i, state->m_mhigh_scrollram[0] + 19); + state->m_mhigh_tilemap->set_scrollx(i, state->m_mhigh_scrollram[0] + 19); } - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_vidattrram[1] + 1); - tilemap_set_scrolly(state->m_mlow_tilemap, 0, state->m_vidattrram[2] + 1); - tilemap_set_scrolly(state->m_mhigh_tilemap, 0, state->m_vidattrram[3] + 1); - - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_vidattrram[0] + 16); - tilemap_set_scrolly(state->m_tx_tilemap, 0, state->m_vidattrram[4] + 1); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0x01); - tilemap_draw(bitmap, cliprect, state->m_mlow_tilemap, 0, 0x02); - tilemap_draw(bitmap, cliprect, state->m_mhigh_tilemap, 0, 0x04); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0x10); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->set_scrolly(0, state->m_vidattrram[1] + 1); + state->m_mlow_tilemap->set_scrolly(0, state->m_vidattrram[2] + 1); + state->m_mhigh_tilemap->set_scrolly(0, state->m_vidattrram[3] + 1); + + state->m_tx_tilemap->set_scrollx(0, state->m_vidattrram[0] + 16); + state->m_tx_tilemap->set_scrolly(0, state->m_vidattrram[4] + 1); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0x01); + state->m_mlow_tilemap->draw(bitmap, cliprect, 0, 0x02); + state->m_mhigh_tilemap->draw(bitmap, cliprect, 0, 0x04); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0x10); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -555,10 +555,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8+1, 48*8-1-8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(mwarr) + MCFG_SCREEN_UPDATE_STATIC(mwarr) MCFG_GFXDECODE(mwarr) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/mystwarr.c mame-0.145/src/mame/drivers/mystwarr.c --- mame-0.144/src/mame/drivers/mystwarr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/mystwarr.c 2012-02-06 21:30:42.000000000 +0000 @@ -22,8 +22,6 @@ */ #include "emu.h" -#include "deprecat.h" - #include "video/konamiic.h" #include "video/k053250.h" #include "machine/k053252.h" @@ -106,60 +104,52 @@ /**********************************************************************************/ /* IRQ controllers */ -static INTERRUPT_GEN(mystwarr_interrupt) +static TIMER_DEVICE_CALLBACK(mystwarr_interrupt) { - mystwarr_state *state = device->machine().driver_data(); + mystwarr_state *state = timer.machine().driver_data(); + int scanline = param; + if (!(state->m_mw_irq_control & 0x01)) return; - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line(device, M68K_IRQ_2, HOLD_LINE); - break; - - case 1: - device_set_input_line(device, M68K_IRQ_4, HOLD_LINE); - break; - - case 2: - device_set_input_line(device, M68K_IRQ_6, HOLD_LINE); - break; - } + if(scanline == 240) + device_set_input_line(state->m_maincpu, M68K_IRQ_2, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, M68K_IRQ_4, HOLD_LINE); + + /* writes to LSB of 0x410000 port and clears a work RAM flag, almost likely not really necessary. */ +// device_set_input_line(state->m_maincpu, M68K_IRQ_6, HOLD_LINE); } -static INTERRUPT_GEN(metamrph_interrupt) +static TIMER_DEVICE_CALLBACK(metamrph_interrupt) { - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line(device, M68K_IRQ_4, HOLD_LINE); - break; - - case 15: - device_set_input_line(device, M68K_IRQ_6, HOLD_LINE); - break; - - case 39: - if (K053246_is_IRQ_enabled()) device_set_input_line(device, M68K_IRQ_5, HOLD_LINE); - break; - } + mystwarr_state *state = timer.machine().driver_data(); + int scanline = param; + + /* irq 4 has an irq routine in metamrph, but it's not really called */ +// device_set_input_line(state->m_maincpu, M68K_IRQ_4, HOLD_LINE); + + if(scanline == 24) + device_set_input_line(state->m_maincpu, M68K_IRQ_6, HOLD_LINE); + + if(scanline == 248) + if (K053246_is_IRQ_enabled()) device_set_input_line(state->m_maincpu, M68K_IRQ_5, HOLD_LINE); } -static INTERRUPT_GEN(mchamp_interrupt) +static TIMER_DEVICE_CALLBACK(mchamp_interrupt) { - mystwarr_state *state = device->machine().driver_data(); + mystwarr_state *state = timer.machine().driver_data(); + int scanline = param; + if (!(state->m_mw_irq_control & 0x02)) return; - switch (cpu_getiloops(device)) + if(scanline == 247) { - case 0: - if (K053246_is_IRQ_enabled()) device_set_input_line(device, M68K_IRQ_6, HOLD_LINE); - break; - - case 1: - device_set_input_line(device, M68K_IRQ_2, HOLD_LINE); - break; + if (K053246_is_IRQ_enabled()) device_set_input_line(state->m_maincpu, M68K_IRQ_6, HOLD_LINE); } + + if(scanline == 23) + device_set_input_line(state->m_maincpu, M68K_IRQ_2, HOLD_LINE); } static INTERRUPT_GEN(ddd_interrupt) @@ -1005,7 +995,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz (confirmed) */ MCFG_CPU_PROGRAM_MAP(mystwarr_map) - MCFG_CPU_VBLANK_INT_HACK(mystwarr_interrupt, 3) + MCFG_TIMER_ADD_SCANLINE("scantimer", mystwarr_interrupt, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 8000000) MCFG_CPU_PROGRAM_MAP(mystwarr_sound_map) @@ -1026,10 +1016,9 @@ // MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_RAW_PARAMS(6000000, 288+16+32+48, 0, 287, 224+16+8+16, 0, 223) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(24, 24+288-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(mystwarr) + MCFG_SCREEN_UPDATE_STATIC(mystwarr) MCFG_PALETTE_LENGTH(2048) @@ -1059,12 +1048,13 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(viostorm_map) - MCFG_CPU_VBLANK_INT_HACK(metamrph_interrupt, 40) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(metamrph_interrupt) /* video hardware */ MCFG_VIDEO_START(viostorm) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(metamrph) + MCFG_SCREEN_UPDATE_STATIC(metamrph) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(900)) @@ -1079,7 +1069,8 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(metamrph_map) - MCFG_CPU_VBLANK_INT_HACK(metamrph_interrupt, 40) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(metamrph_interrupt) MCFG_DEVICE_REMOVE("k053252") MCFG_K053252_ADD("k053252", 6000000, metamrph_k053252_intf) // 6 MHz? @@ -1088,7 +1079,7 @@ /* video hardware */ MCFG_VIDEO_START(metamrph) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(metamrph) + MCFG_SCREEN_UPDATE_STATIC(metamrph) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(900)) @@ -1104,6 +1095,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(dadandrn_map) MCFG_CPU_VBLANK_INT("screen", ddd_interrupt) + MCFG_DEVICE_REMOVE("scantimer") MCFG_DEVICE_REMOVE("k053252") MCFG_K053252_ADD("k053252", 6000000, dadandrm_k053252_intf) // 6 MHz? @@ -1113,7 +1105,7 @@ /* video hardware */ MCFG_VIDEO_START(dadandrn) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(dadandrn) + MCFG_SCREEN_UPDATE_STATIC(dadandrn) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(600)) @@ -1129,6 +1121,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(gaiapols_map) MCFG_CPU_VBLANK_INT("screen", ddd_interrupt) + MCFG_DEVICE_REMOVE("scantimer") MCFG_DEVICE_REMOVE("k053252") MCFG_K053252_ADD("k053252", 6000000, gaiapols_k053252_intf) // 6 MHz? @@ -1141,7 +1134,7 @@ /* video hardware */ MCFG_VIDEO_START(gaiapols) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(dadandrn) + MCFG_SCREEN_UPDATE_STATIC(dadandrn) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_RAW_PARAMS(8000000, 384+24+64+40, 0, 383, 224+16+8+16, 0, 223) @@ -1157,7 +1150,8 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(martchmp_map) - MCFG_CPU_VBLANK_INT_HACK(mchamp_interrupt, 2) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(mchamp_interrupt) MCFG_DEVICE_REMOVE("k053252") MCFG_K053252_ADD("k053252", 16000000/2, martchmp_k053252_intf) @@ -1165,11 +1159,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS | VIDEO_UPDATE_BEFORE_VBLANK) MCFG_VIDEO_START(martchmp) - MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(martchmp) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_STATIC(martchmp) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(32, 32+384-1, 16, 16+224-1) diff -Nru mame-0.144/src/mame/drivers/n8080.c mame-0.145/src/mame/drivers/n8080.c --- mame-0.144/src/mame/drivers/n8080.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/n8080.c 2012-02-06 21:30:41.000000000 +0000 @@ -5,7 +5,7 @@ - Space Fever - Space Fever High Splitter - Space Launcher - - Sheriff / Bandido + - Sheriff / Bandido / Western Gun 2 - Helifire ***************************************************************************/ @@ -315,6 +315,46 @@ INPUT_PORTS_END +static INPUT_PORTS_START( westgun2 ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_COCKTAIL + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Lives )) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x10, "4" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Cabinet )) + PORT_DIPSETTING( 0x20, DEF_STR( Upright )) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* enables diagnostic ROM at $2400 */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) + + PORT_START("IN3") + +INPUT_PORTS_END + + static INPUT_PORTS_START( helifire ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) @@ -426,8 +466,8 @@ static I8085_CONFIG( n8080_cpu_config ) { - DEVCB_HANDLER(n8080_status_callback), /* STATUS changed callback */ - DEVCB_LINE(n8080_inte_callback), /* INTE changed callback */ + DEVCB_DEVICE_HANDLER("maincpu",n8080_status_callback), /* STATUS changed callback */ + DEVCB_DEVICE_LINE("maincpu",n8080_inte_callback), /* INTE changed callback */ DEVCB_NULL, /* SID changed callback (8085A only) */ DEVCB_NULL /* SOD changed callback (8085A only) */ }; @@ -520,10 +560,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - MCFG_SCREEN_UPDATE(spacefev) + MCFG_SCREEN_UPDATE_STATIC(spacefev) MCFG_PALETTE_LENGTH(8) MCFG_PALETTE_INIT(n8080) @@ -551,10 +590,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - MCFG_SCREEN_UPDATE(sheriff) + MCFG_SCREEN_UPDATE_STATIC(sheriff) MCFG_PALETTE_LENGTH(8) MCFG_PALETTE_INIT(n8080) @@ -568,6 +606,17 @@ MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( westgun2, sheriff ) + + /* basic machine hardware */ + MCFG_CPU_REPLACE("maincpu", I8080, XTAL_19_968MHz / 10) + MCFG_CPU_CONFIG(n8080_cpu_config) + MCFG_CPU_PROGRAM_MAP(main_cpu_map) + MCFG_CPU_IO_MAP(main_io_map) + +MACHINE_CONFIG_END + + static MACHINE_CONFIG_START( helifire, n8080_state ) /* basic machine hardware */ @@ -582,11 +631,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 16, 239) - MCFG_SCREEN_UPDATE(helifire) - MCFG_SCREEN_EOF(helifire) + MCFG_SCREEN_UPDATE_STATIC(helifire) + MCFG_SCREEN_VBLANK_STATIC(helifire) MCFG_PALETTE_LENGTH(8 + 0x400) MCFG_PALETTE_INIT(helifire) @@ -876,6 +924,21 @@ ROM_LOAD( "82s137.3l", 0x0000, 0x0400, CRC(820f8cdd) SHA1(197eeb008c140558e7c1ab2b2bd0f6a27096877c) ) ROM_END +ROM_START( westgun2 ) + ROM_REGION( 0x8000, "maincpu", 0 ) + ROM_LOAD( "rf01.ic36", 0x0000, 0x0800, CRC(7eabc538) SHA1(8f0540a5cb391b83aafc0365b44686628eae5c77) ) + ROM_LOAD( "rf02.ic35", 0x0800, 0x0800, CRC(3344d6a5) SHA1(ea2a8413401b53c9d1b9c653ac3a98855a35cce6) ) + ROM_LOAD( "rf03.ic34", 0x1000, 0x0800, CRC(d4bb08fd) SHA1(92c0821f259037b193658997289b6b41c6f67215) ) + ROM_LOAD( "rf04.ic33", 0x1800, 0x0800, CRC(60b71f0d) SHA1(10650426972afb0ccb964548a52879ed3f0b316a) ) + ROM_LOAD( "rf05.ic32", 0x2000, 0x0800, CRC(81e650fb) SHA1(e600567125294d1411fcad3a015edb98cee36ff8) ) + + ROM_REGION( 0x0800, "audiocpu", 0 ) + ROM_LOAD( "rf06.ic35", 0x0000, 0x0800, CRC(4eafe957) SHA1(78e03402219c0ad814f63ae507eadc636d95f755) ) + + ROM_REGION( 0x0400, "proms", 0 ) + ROM_LOAD( "82s137.3l", 0x0000, 0x0400, CRC(820f8cdd) SHA1(197eeb008c140558e7c1ab2b2bd0f6a27096877c) ) // rf07 not dumped, taken from parent +ROM_END + ROM_START( helifire ) ROM_REGION( 0x8000, "maincpu", 0 ) ROM_LOAD( "hf.f1", 0x0000, 0x0400, CRC(032f89ca) SHA1(63b0310875ed78a6385e44eea781ddcc4a63557c) ) @@ -920,5 +983,6 @@ GAME( 1979, spacelnc, 0, spacefev, spacelnc, 0, ROT270, "Nintendo", "Space Launcher", GAME_SUPPORTS_SAVE ) GAME( 1979, sheriff, 0, sheriff, sheriff, 0, ROT270, "Nintendo", "Sheriff", GAME_SUPPORTS_SAVE ) GAME( 1980, bandido, sheriff, sheriff, bandido, 0, ROT270, "Nintendo (Exidy license)", "Bandido", GAME_SUPPORTS_SAVE ) +GAME( 1980, westgun2, sheriff, westgun2, westgun2, 0, ROT270, "Nintendo (Taito Corporation license)", "Western Gun Part II", GAME_SUPPORTS_SAVE ) // official Taito PCBs, but title/copyright not shown GAME( 1980, helifire, 0, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 1)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1980, helifirea, helifire, helifire, helifire, 0, ROT270, "Nintendo", "HeliFire (set 2)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/namcofl.c mame-0.145/src/mame/drivers/namcofl.c --- mame-0.144/src/mame/drivers/namcofl.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcofl.c 2012-02-06 21:30:42.000000000 +0000 @@ -156,7 +156,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "includes/namcos2.h" #include "includes/namcoic.h" #include "cpu/i960/i960.h" @@ -554,22 +553,28 @@ state->m_raster_interrupt_timer->adjust(machine.primary_screen->frame_period()); } -static INTERRUPT_GEN( mcu_interrupt ) +static TIMER_DEVICE_CALLBACK( mcu_irq0_cb ) { - if (cpu_getiloops(device) == 0) - { - device_set_input_line(device, M37710_LINE_IRQ0, HOLD_LINE); - } - else if (cpu_getiloops(device) == 1) - { - device_set_input_line(device, M37710_LINE_IRQ2, HOLD_LINE); - } - else - { - device_set_input_line(device, M37710_LINE_ADC, HOLD_LINE); - } + namcofl_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_IRQ0, HOLD_LINE); +} + +static TIMER_DEVICE_CALLBACK( mcu_irq2_cb ) +{ + namcofl_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_IRQ2, HOLD_LINE); +} + +static TIMER_DEVICE_CALLBACK( mcu_adc_cb ) +{ + namcofl_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_ADC, HOLD_LINE); } + static MACHINE_START( namcofl ) { namcofl_state *state = machine.driver_data(); @@ -597,7 +602,10 @@ MCFG_CPU_ADD("mcu", M37702, 48384000/3) MCFG_CPU_PROGRAM_MAP(namcoc75_am) MCFG_CPU_IO_MAP(namcoc75_io) - MCFG_CPU_VBLANK_INT_HACK(mcu_interrupt, 3) + /* TODO: irq generation for these */ + MCFG_TIMER_ADD_PERIODIC("mcu_irq0", mcu_irq0_cb, attotime::from_hz(60)) + MCFG_TIMER_ADD_PERIODIC("mcu_irq2", mcu_irq2_cb, attotime::from_hz(60)) + MCFG_TIMER_ADD_PERIODIC("mcu_adc", mcu_adc_cb, attotime::from_hz(60)) MCFG_MACHINE_START(namcofl) MCFG_MACHINE_RESET(namcofl) @@ -605,10 +613,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCOFL_HTOTAL, NAMCOFL_VTOTAL) MCFG_SCREEN_VISIBLE_AREA(0, NAMCOFL_HBSTART-1, 0, NAMCOFL_VBSTART-1) - MCFG_SCREEN_UPDATE(namcofl) + MCFG_SCREEN_UPDATE_STATIC(namcofl) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/namcoic.c mame-0.145/src/mame/drivers/namcoic.c --- mame-0.144/src/mame/drivers/namcoic.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcoic.c 2012-02-06 21:30:42.000000000 +0000 @@ -32,15 +32,15 @@ int i; for( i=0; i<6; i++ ) { - tilemap_mark_all_tiles_dirty( mTilemapInfo.tmap[i] ); + mTilemapInfo.tmap[i]->mark_all_dirty(); } } /* namco_tilemap_invalidate */ -INLINE void get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,UINT16 *vram) +INLINE void get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,UINT16 *vram) { int tile, mask; mTilemapInfo.cb( machine, vram[tile_index], &tile, &mask ); - tileinfo->mask_data = mTilemapInfo.maskBaseAddr+mask*8; + tileinfo.mask_data = mTilemapInfo.maskBaseAddr+mask*8; SET_TILE_INFO(mTilemapInfo.gfxbank,tile,0,0); } /* get_tile_info */ @@ -76,20 +76,20 @@ { static const int adj[4] = { 4,2,1,0 }; int dx = 44+adj[i]; - tilemap_set_scrolldx( mTilemapInfo.tmap[i], -dx, -(-384-dx) ); - tilemap_set_scrolldy( mTilemapInfo.tmap[i], -24, 288 ); + mTilemapInfo.tmap[i]->set_scrolldx( -dx, -(-384-dx) ); + mTilemapInfo.tmap[i]->set_scrolldy( -24, 288 ); } - tilemap_set_scrolldx( mTilemapInfo.tmap[4], 0, 96 ); - tilemap_set_scrolldy( mTilemapInfo.tmap[4], 0, 40 ); + mTilemapInfo.tmap[4]->set_scrolldx( 0, 96 ); + mTilemapInfo.tmap[4]->set_scrolldy( 0, 40 ); - tilemap_set_scrolldx( mTilemapInfo.tmap[5], 0, 96 ); - tilemap_set_scrolldy( mTilemapInfo.tmap[5], 0, 40 ); + mTilemapInfo.tmap[5]->set_scrolldx( 0, 96 ); + mTilemapInfo.tmap[5]->set_scrolldy( 0, 40 ); } /* namco_tilemap_init */ void -namco_tilemap_draw( bitmap_t *bitmap, const rectangle *cliprect, int pri ) +namco_tilemap_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { int i; for( i=0; i<6; i++ ) @@ -98,8 +98,8 @@ if( (mTilemapInfo.control[0x20/2+i]&0xf) == pri ) { int color = mTilemapInfo.control[0x30/2+i] & 0x07; - tilemap_set_palette_offset( mTilemapInfo.tmap[i], color*256 ); - tilemap_draw(bitmap,cliprect,mTilemapInfo.tmap[i],0,0); + mTilemapInfo.tmap[i]->set_palette_offset( color*256 ); + mTilemapInfo.tmap[i]->draw(bitmap,cliprect,0,0); } } } /* namco_tilemap_draw */ @@ -110,17 +110,17 @@ mTilemapInfo.videoram[offset] = newword; if( offset<0x4000 ) { - tilemap_mark_tile_dirty(mTilemapInfo.tmap[offset>>12],offset&0xfff); + mTilemapInfo.tmap[offset>>12]->mark_tile_dirty(offset&0xfff); } else if( offset>=0x8010/2 && offset<0x87f0/2 ) { /* fixed plane#1 */ offset-=0x8010/2; - tilemap_mark_tile_dirty( mTilemapInfo.tmap[4], offset ); + mTilemapInfo.tmap[4]->mark_tile_dirty( offset ); } else if( offset>=0x8810/2 && offset<0x8ff0/2 ) { /* fixed plane#2 */ offset-=0x8810/2; - tilemap_mark_tile_dirty( mTilemapInfo.tmap[5], offset ); + mTilemapInfo.tmap[5]->mark_tile_dirty( offset ); } } /* SetTilemapVideoram */ @@ -149,7 +149,7 @@ int i; for( i=0; i<=5; i++ ) { - tilemap_set_flip(mTilemapInfo.tmap[i],attrs); + mTilemapInfo.tmap[i]->set_flip(attrs); } } } @@ -161,28 +161,28 @@ switch( offset ) { case 0x02/2: - tilemap_set_scrollx( mTilemapInfo.tmap[0], 0, newword ); + mTilemapInfo.tmap[0]->set_scrollx( 0, newword ); break; case 0x06/2: - tilemap_set_scrolly( mTilemapInfo.tmap[0], 0, newword ); + mTilemapInfo.tmap[0]->set_scrolly( 0, newword ); break; case 0x0a/2: - tilemap_set_scrollx( mTilemapInfo.tmap[1], 0, newword ); + mTilemapInfo.tmap[1]->set_scrollx( 0, newword ); break; case 0x0e/2: - tilemap_set_scrolly( mTilemapInfo.tmap[1], 0, newword ); + mTilemapInfo.tmap[1]->set_scrolly( 0, newword ); break; case 0x12/2: - tilemap_set_scrollx( mTilemapInfo.tmap[2], 0, newword ); + mTilemapInfo.tmap[2]->set_scrollx( 0, newword ); break; case 0x16/2: - tilemap_set_scrolly( mTilemapInfo.tmap[2], 0, newword ); + mTilemapInfo.tmap[2]->set_scrolly( 0, newword ); break; case 0x1a/2: - tilemap_set_scrollx( mTilemapInfo.tmap[3], 0, newword ); + mTilemapInfo.tmap[3]->set_scrollx( 0, newword ); break; case 0x1e/2: - tilemap_set_scrolly( mTilemapInfo.tmap[3], 0, newword ); + mTilemapInfo.tmap[3]->set_scrolly( 0, newword ); break; } } /* SetTilemapControl */ @@ -266,12 +266,12 @@ /**************************************************************************************/ static void zdrawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int scalex, int scaley, int zpos ) { if (!scalex || !scaley) return; - if (dest_bmp->bpp == 16) + if (dest_bmp.bpp() == 16) { if( gfx ) { @@ -312,43 +312,40 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) { /* skip if inner loop doesn't draw anything */ int y; - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; - if( priority_bitmap ) + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; + if( priority_bitmap.valid() ) { for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); int x, x_index = x_index_base; if( mPalXOR ) { @@ -410,14 +407,22 @@ } } /* zdrawgfxzoom */ +static void zdrawgfxzoom( + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, + int scalex, int scaley, int zpos ) +{ + /* nop */ +} + void -namcos2_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int control ) +namcos2_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ) { int offset = (control & 0x000f) * (128*4); int loop; if( pri==0 ) { - bitmap_fill( machine.priority_bitmap, cliprect , 0); + machine.priority_bitmap.fill(0, cliprect ); } for( loop=0; loop < 128; loop++ ) { @@ -491,7 +496,7 @@ } /* namcos2_draw_sprites */ void -namcos2_draw_sprites_metalhawk(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +namcos2_draw_sprites_metalhawk(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { /** * word#0 @@ -528,7 +533,7 @@ int loop; if( pri==0 ) { - bitmap_fill( machine.priority_bitmap, cliprect , 0); + machine.priority_bitmap.fill(0, cliprect ); } for( loop=0; loop < 128; loop++ ) { @@ -579,15 +584,8 @@ } /* Set the clipping rect to mask off the other portion of the sprite */ - rect.min_x=sx; - rect.max_x=sx+(sizex-1); - rect.min_y=sy; - rect.max_y=sy+(sizey-1); - - if (cliprect->min_x > rect.min_x) rect.min_x = cliprect->min_x; - if (cliprect->max_x < rect.max_x) rect.max_x = cliprect->max_x; - if (cliprect->min_y > rect.min_y) rect.min_y = cliprect->min_y; - if (cliprect->max_y < rect.max_y) rect.max_y = cliprect->max_y; + rect.set(sx, sx+(sizex-1), sy, sy+(sizey-1)); + rect &= cliprect; if( !bBigSprite ) { @@ -599,10 +597,7 @@ sx -= (tile&1)?16:0; sy -= (tile&2)?16:0; - rect.min_x=sx; - rect.max_x=sx+(sizex-1); - rect.min_y=sy; - rect.max_y=sy+(sizey-1); + rect.set(sx, sx+(sizex-1), sy, sy+(sizey-1)); rect.min_x += (tile&1)?16:0; rect.max_x += (tile&1)?16:0; rect.min_y += (tile&2)?16:0; @@ -610,7 +605,7 @@ } zdrawgfxzoom( bitmap, - &rect, + rect, machine.gfx[0], sprn, color, flipx,flipy, @@ -716,8 +711,9 @@ * 0x10000 sprite attr (page1) * 0x14000 sprite list (page1) */ +template static void -draw_spriteC355(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT16 *pSource, int pri, int zpos ) +draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle &cliprect, const UINT16 *pSource, int pri, int zpos ) { UINT16 *spriteram16 = machine.generic.spriteram.u16; unsigned screen_height_remaining, screen_width_remaining; @@ -773,7 +769,7 @@ xscroll &= 0x1ff; if( xscroll & 0x100 ) xscroll |= ~0x1ff; yscroll &= 0x1ff; if( yscroll & 0x100 ) yscroll |= ~0x1ff; - if( bitmap->width > 384 ) + if( bitmap.width() > 384 ) { /* Medium Resolution: System21 adjust */ xscroll = (INT16)mSpritePos[1]; xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff; @@ -798,14 +794,8 @@ hpos -= xscroll; vpos -= yscroll; pWinAttr = &spriteram16[0x2400/2+((palette>>8)&0xf)*4]; - clip.min_x = pWinAttr[0] - xscroll; - clip.max_x = pWinAttr[1] - xscroll; - clip.min_y = pWinAttr[2] - yscroll; - clip.max_y = pWinAttr[3] - yscroll; - if( clip.min_x < cliprect->min_x ){ clip.min_x = cliprect->min_x; } - if( clip.min_y < cliprect->min_y ){ clip.min_y = cliprect->min_y; } - if( clip.max_x > cliprect->max_x ){ clip.max_x = cliprect->max_x; } - if( clip.max_y > cliprect->max_y ){ clip.max_y = cliprect->max_y; } + clip.set(pWinAttr[0] - xscroll, pWinAttr[1] - xscroll, pWinAttr[2] - yscroll, pWinAttr[3] - yscroll); + clip &= cliprect; hpos&=0x7ff; if( hpos&0x400 ) hpos |= ~0x7ff; /* sign extend */ vpos&=0x7ff; if( vpos&0x400 ) vpos |= ~0x7ff; /* sign extend */ @@ -875,7 +865,7 @@ { zdrawgfxzoom( bitmap, - &clip, + clip, machine.gfx[mGfxC355], mpCodeToTile(machine, tile) + offset, color, @@ -923,10 +913,11 @@ memset( mSpritePos,0x00,sizeof(mSpritePos) ); } /* namcosC355_init */ +template static void DrawObjectList(running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + _BitmapClass &bitmap, + const rectangle &cliprect, int pri, const UINT16 *pSpriteList16, const UINT16 *pSpriteTable ) @@ -942,12 +933,30 @@ } /* DrawObjectList */ void -namco_obj_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +namco_obj_draw(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) +{ +// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ + if( pri==0 ) + { + machine.priority_bitmap.fill(0, cliprect ); + } +// if( offs==0 ) + { /* boot */ + DrawObjectList(machine, bitmap,cliprect,pri,&machine.generic.spriteram.u16[0x02000/2], &machine.generic.spriteram.u16[0x00000/2] ); + } +// else + { + DrawObjectList(machine, bitmap,cliprect,pri,&machine.generic.spriteram.u16[0x14000/2], &machine.generic.spriteram.u16[0x10000/2] ); + } +} /* namco_obj_draw */ + +void +namco_obj_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri ) { // int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */ if( pri==0 ) { - bitmap_fill( machine.priority_bitmap, cliprect , 0); + machine.priority_bitmap.fill(0, cliprect ); } // if( offs==0 ) { /* boot */ @@ -1030,7 +1039,7 @@ * Graphics ROM addressing varies across games. */ static void -roz_get_info( running_machine &machine, tile_data *tileinfo, int tile_index, int which) +roz_get_info( running_machine &machine, tile_data &tileinfo, int tile_index, int which) { UINT16 tile = rozvideoram16[tile_index]; int bank, mangle; @@ -1091,7 +1100,7 @@ break; } SET_TILE_INFO( mRozGfxBank,mangle,0/*color*/,0/*flag*/ ); - tileinfo->mask_data = 32*tile + (UINT8 *)machine.region( mRozMaskRegion )->base(); + tileinfo.mask_data = 32*tile + (UINT8 *)machine.region( mRozMaskRegion )->base(); } /* roz_get_info */ static @@ -1213,36 +1222,36 @@ static void DrawRozHelper( - bitmap_t *bitmap, + bitmap_ind16 &bitmap, tilemap_t *tmap, - const rectangle *clip, + const rectangle &clip, const struct RozParam *rozInfo ) { - if( (bitmap->bpp == 16) && + if( (bitmap.bpp() == 16) && (namcos2_gametype != NAMCOFL_SPEED_RACER) && (namcos2_gametype != NAMCOFL_FINAL_LAP_R)) { UINT32 size_mask = rozInfo->size-1; - bitmap_t *srcbitmap = tilemap_get_pixmap( tmap ); - bitmap_t *flagsbitmap = tilemap_get_flagsmap( tmap ); - UINT32 startx = rozInfo->startx + clip->min_x * rozInfo->incxx + clip->min_y * rozInfo->incyx; - UINT32 starty = rozInfo->starty + clip->min_x * rozInfo->incxy + clip->min_y * rozInfo->incyy; - int sx = clip->min_x; - int sy = clip->min_y; - while( sy <= clip->max_y ) + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &flagsbitmap = tmap->flagsmap(); + UINT32 startx = rozInfo->startx + clip.min_x * rozInfo->incxx + clip.min_y * rozInfo->incyx; + UINT32 starty = rozInfo->starty + clip.min_x * rozInfo->incxy + clip.min_y * rozInfo->incyy; + int sx = clip.min_x; + int sy = clip.min_y; + while( sy <= clip.max_y ) { int x = sx; UINT32 cx = startx; UINT32 cy = starty; - UINT16 *dest = BITMAP_ADDR16(bitmap, sy, sx); - while( x <= clip->max_x ) + UINT16 *dest = &bitmap.pix16(sy, sx); + while( x <= clip.max_x ) { UINT32 xpos = (((cx>>16)&size_mask) + rozInfo->left)&0xfff; UINT32 ypos = (((cy>>16)&size_mask) + rozInfo->top)&0xfff; - if( *BITMAP_ADDR8(flagsbitmap, ypos, xpos)&TILEMAP_PIXEL_LAYER0 ) + if( flagsbitmap.pix8(ypos, xpos)&TILEMAP_PIXEL_LAYER0 ) { - *dest = *BITMAP_ADDR16(srcbitmap,ypos,xpos)+rozInfo->color; + *dest = srcbitmap.pix16(ypos, xpos)+rozInfo->color; } cx += rozInfo->incxx; cy += rozInfo->incxy; @@ -1257,12 +1266,11 @@ else { - tilemap_set_palette_offset( tmap, rozInfo->color ); + tmap->set_palette_offset( rozInfo->color ); - tilemap_draw_roz( + tmap->draw_roz( bitmap, clip, - tmap, rozInfo->startx, rozInfo->starty, rozInfo->incxx, rozInfo->incxy, rozInfo->incyx, rozInfo->incyy, @@ -1271,9 +1279,9 @@ } /* DrawRozHelper */ static void -DrawRozScanline( bitmap_t *bitmap, int line, int which, int pri, const rectangle *cliprect ) +DrawRozScanline( bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect ) { - if( line>=cliprect->min_y && line<=cliprect->max_y ) + if( line>=cliprect.min_y && line<=cliprect.max_y ) { struct RozParam rozInfo; rectangle clip; @@ -1285,23 +1293,17 @@ UnpackRozParam( pSource, &rozInfo ); if( pri == rozInfo.priority ) { - clip.min_x = 0; - clip.max_x = bitmap->width-1; - clip.min_y = clip.max_y = line; - - if( clip.min_x < cliprect->min_x ){ clip.min_x = cliprect->min_x; } - if( clip.min_y < cliprect->min_y ){ clip.min_y = cliprect->min_y; } - if( clip.max_x > cliprect->max_x ){ clip.max_x = cliprect->max_x; } - if( clip.max_y > cliprect->max_y ){ clip.max_y = cliprect->max_y; } + clip.set(0, bitmap.width()-1, line, line); + clip &= cliprect; - DrawRozHelper( bitmap, mRozTilemap[which], &clip, &rozInfo ); + DrawRozHelper( bitmap, mRozTilemap[which], clip, &rozInfo ); } /* priority */ } /* enabled */ } } /* DrawRozScanline */ void -namco_roz_draw( bitmap_t *bitmap, const rectangle *cliprect, int pri ) +namco_roz_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { int mode = rozcontrol16[0]; /* 0x8000 or 0x1000 */ int which, special = 1; @@ -1363,7 +1365,7 @@ int i; for( i=0; imark_all_dirty(); } } } /* namco_rozbank16_w */ @@ -1376,7 +1378,7 @@ rozvideoram16[offset] = data; for( i=0; imark_tile_dirty( offset ); } } /* writerozvideo */ @@ -1561,7 +1563,7 @@ COMBINE_DATA( &mpRoadRAM[offset] ); if( offset<0x10000/2 ) { - tilemap_mark_tile_dirty( mpRoadTilemap, offset ); + mpRoadTilemap->mark_tile_dirty( offset ); } else { @@ -1599,17 +1601,16 @@ } void -namco_road_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +namco_road_draw(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { const UINT8 *clut = (const UINT8 *)machine.region("user3")->base(); - bitmap_t *pSourceBitmap; unsigned yscroll; int i; - pSourceBitmap = tilemap_get_pixmap(mpRoadTilemap); + bitmap_ind16 &SourceBitmap = mpRoadTilemap->pixmap(); yscroll = mpRoadRAM[0x1fdfe/2]; - for( i=cliprect->min_y; i<=cliprect->max_y; i++ ) + for( i=cliprect.min_y; i<=cliprect.max_y; i++ ) { int screenx = mpRoadRAM[0x1fa00/2+i+15]; if( pri == ((screenx&0xf000)>>12) ) @@ -1618,11 +1619,11 @@ if( zoomx ) { unsigned sourcey = mpRoadRAM[0x1fc00/2+i+15]+yscroll; - const UINT16 *pSourceGfx = BITMAP_ADDR16(pSourceBitmap, sourcey&(ROAD_TILEMAP_HEIGHT-1), 0); + const UINT16 *pSourceGfx = &SourceBitmap.pix16(sourcey&(ROAD_TILEMAP_HEIGHT-1)); unsigned dsourcex = (ROAD_TILEMAP_WIDTH<<16)/zoomx; if( dsourcex ) { - UINT16 *pDest = BITMAP_ADDR16(bitmap, i, 0); + UINT16 *pDest = &bitmap.pix16(i); unsigned sourcex = 0; int numpixels = (44*ROAD_TILE_SIZE<<16)/dsourcex; int clipPixels; @@ -1637,15 +1638,15 @@ /* adjust the horizontal placement */ screenx -= 64; /*needs adjustment to left*/ - clipPixels = cliprect->min_x - screenx; + clipPixels = cliprect.min_x - screenx; if( clipPixels>0 ) { /* crop left */ numpixels -= clipPixels; sourcex += dsourcex*clipPixels; - screenx = cliprect->min_x; + screenx = cliprect.min_x; } - clipPixels = (screenx+numpixels) - (cliprect->max_x+1); + clipPixels = (screenx+numpixels) - (cliprect.max_x+1); if( clipPixels>0 ) { /* crop right */ numpixels -= clipPixels; diff -Nru mame-0.144/src/mame/drivers/namcona1.c mame-0.145/src/mame/drivers/namcona1.c --- mame-0.144/src/mame/drivers/namcona1.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcona1.c 2012-02-06 21:30:35.000000000 +0000 @@ -160,7 +160,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "includes/namcona1.h" #include "sound/c140.h" #include "cpu/m37710/m37710.h" @@ -974,28 +973,28 @@ ADDRESS_MAP_END -static INTERRUPT_GEN( namcona1_interrupt ) +static TIMER_DEVICE_CALLBACK( namcona1_interrupt ) { - namcona1_state *state = device->machine().driver_data(); - int level = cpu_getiloops(device); /* 0,1,2,3,4 */ - if( level==0 ) + namcona1_state *state = timer.machine().driver_data(); + int scanline = param; + int enabled = state->m_mEnableInterrupts ? ~state->m_vreg[0x1a/2] : 0; + + // vblank + if (scanline == 224) { - simulate_mcu( device->machine() ); + simulate_mcu( timer.machine() ); + if (enabled & 8) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } - if( state->m_mEnableInterrupts ) + + // posirq, used with dolphin in Emeraldia's "how to play" attract mode + int posirq_scanline = state->m_vreg[0x8a/2] & 0xff; + if (scanline == posirq_scanline && enabled & 4) { - if( (state->m_vreg[0x1a/2]&(1<m_vreg[0x8a/2]&0xff; - if( scanline ) - { - device->machine().primary_screen->update_partial(scanline ); - } - } - device_set_input_line(device, level+1, HOLD_LINE); - } + if (posirq_scanline) + timer.machine().primary_screen->update_partial(posirq_scanline); + + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); } } @@ -1003,16 +1002,18 @@ // IRQ 1 => // IRQ 2 => -static INTERRUPT_GEN( mcu_interrupt ) +static TIMER_DEVICE_CALLBACK( mcu_interrupt ) { - if (cpu_getiloops(device) == 0) - { - device_set_input_line(device, M37710_LINE_IRQ1, HOLD_LINE); - } - else if (cpu_getiloops(device) == 1) - { - device_set_input_line(device, M37710_LINE_ADC, HOLD_LINE); - } + namcona1_state *state = timer.machine().driver_data(); + int scanline = param; + + // vblank + if (scanline == 224) + device_set_input_line(state->m_mcu, M37710_LINE_IRQ1, HOLD_LINE); + + // adc (timing guessed, when does this trigger?) + if (scanline == 0) + device_set_input_line(state->m_mcu, M37710_LINE_ADC, HOLD_LINE); } static const c140_interface C140_interface_typeA = @@ -1025,12 +1026,12 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 50113000/4) MCFG_CPU_PROGRAM_MAP(namcona1_main_map) - MCFG_CPU_VBLANK_INT_HACK(namcona1_interrupt,5) + MCFG_TIMER_ADD_SCANLINE("scan_main", namcona1_interrupt, "screen", 0, 1) MCFG_CPU_ADD("mcu", M37702, 50113000/4) MCFG_CPU_PROGRAM_MAP(namcona1_mcu_map) MCFG_CPU_IO_MAP( namcona1_mcu_io_map) - MCFG_CPU_VBLANK_INT_HACK(mcu_interrupt, 2) + MCFG_TIMER_ADD_SCANLINE("scan_mcu", mcu_interrupt, "screen", 0, 1) MCFG_NVRAM_HANDLER(namcosna1) MCFG_MACHINE_START(namcona1) @@ -1043,10 +1044,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(38*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(namcona1) + MCFG_SCREEN_UPDATE_STATIC(namcona1) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/namconb1.c mame-0.145/src/mame/drivers/namconb1.c --- mame-0.144/src/mame/drivers/namconb1.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namconb1.c 2012-02-06 21:30:35.000000000 +0000 @@ -5,6 +5,7 @@ - tilemap system is identical to Namco System2 ToDo: +- improve interrupts - gunbulet force feedback - music tempo is too fast in Nebulas Ray, JLS V-Shoot and the Great Sluggers games @@ -270,7 +271,6 @@ */ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "includes/namconb1.h" #include "includes/namcos2.h" #include "includes/namcoic.h" @@ -283,6 +283,20 @@ /****************************************************************************/ +static TIMER_DEVICE_CALLBACK( mcu_interrupt ) +{ + int scanline = param; + + /* TODO: real sources of these */ + if (scanline == 224) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_IRQ0, HOLD_LINE); + else if (scanline == 0) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_IRQ2, HOLD_LINE); + else if (scanline == 128) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_ADC, HOLD_LINE); +} + + static TIMER_CALLBACK( namconb1_TriggerPOSIRQ ) { namconb1_state *state = machine.driver_data(); @@ -348,21 +362,6 @@ } } /* namconb1_interrupt */ -static INTERRUPT_GEN( mcu_interrupt ) -{ - if (cpu_getiloops(device) == 0) - { - device_set_input_line(device, M37710_LINE_IRQ0, HOLD_LINE); - } - else if (cpu_getiloops(device) == 1) - { - device_set_input_line(device, M37710_LINE_IRQ2, HOLD_LINE); - } - else - { - device_set_input_line(device, M37710_LINE_ADC, HOLD_LINE); - } -} static TIMER_CALLBACK( namconb2_TriggerPOSIRQ ) { @@ -1027,7 +1026,7 @@ MCFG_CPU_ADD("mcu", M37702, MASTER_CLOCK_HZ/3) MCFG_CPU_PROGRAM_MAP(namcoc75_am) MCFG_CPU_IO_MAP(namcoc75_io) - MCFG_CPU_VBLANK_INT_HACK(mcu_interrupt, 3) + MCFG_TIMER_ADD_SCANLINE("mcu_st", mcu_interrupt, "screen", 0, 1) MCFG_NVRAM_HANDLER(namconb1) MCFG_MACHINE_START(namconb) @@ -1035,10 +1034,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.7) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCONB1_HTOTAL, NAMCONB1_VTOTAL) MCFG_SCREEN_VISIBLE_AREA(0, NAMCONB1_HBSTART-1, 0, NAMCONB1_VBSTART-1) - MCFG_SCREEN_UPDATE(namconb1) + MCFG_SCREEN_UPDATE_STATIC(namconb1) MCFG_GFXDECODE(namconb1) MCFG_PALETTE_LENGTH(0x2000) @@ -1060,7 +1058,7 @@ MCFG_CPU_ADD("mcu", M37702, MASTER_CLOCK_HZ/3) MCFG_CPU_PROGRAM_MAP(namcoc75_am) MCFG_CPU_IO_MAP(namcoc75_io) - MCFG_CPU_VBLANK_INT_HACK(mcu_interrupt, 3) + MCFG_TIMER_ADD_SCANLINE("mcu_st", mcu_interrupt, "screen", 0, 1) MCFG_NVRAM_HANDLER(namconb1) MCFG_MACHINE_START(namconb) @@ -1068,10 +1066,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.7) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCONB1_HTOTAL, NAMCONB1_VTOTAL) MCFG_SCREEN_VISIBLE_AREA(0, NAMCONB1_HBSTART-1, 0, NAMCONB1_VBSTART-1) - MCFG_SCREEN_UPDATE(namconb2) + MCFG_SCREEN_UPDATE_STATIC(namconb2) MCFG_GFXDECODE(2) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/namcond1.c mame-0.145/src/mame/drivers/namcond1.c --- mame-0.144/src/mame/drivers/namcond1.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcond1.c 2012-02-06 21:30:35.000000000 +0000 @@ -312,10 +312,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.0) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(288, 224) // maximum display resolution (512x512 in theory) MCFG_SCREEN_VISIBLE_AREA(0, 287, 0, 223) // default visible area - MCFG_SCREEN_UPDATE(ygv608) + MCFG_SCREEN_UPDATE_STATIC(ygv608) MCFG_GFXDECODE(namcond1) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/namcops2.c mame-0.145/src/mame/drivers/namcops2.c --- mame-0.144/src/mame/drivers/namcops2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcops2.c 2012-02-06 21:30:36.000000000 +0000 @@ -20,6 +20,8 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mips/mips3.h" #include "cpu/mips/r3000.h" @@ -29,21 +31,32 @@ { public: namcops2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; -static VIDEO_START(system246) +void namcops2_state::video_start() { } -static SCREEN_UPDATE(system246) +UINT32 namcops2_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; } -static ADDRESS_MAP_START(ps2_map, AS_PROGRAM, 32) +static ADDRESS_MAP_START(ps2_map, AS_PROGRAM, 32, namcops2_state) AM_RANGE(0x00000000, 0x01ffffff) AM_RAM // 32 MB RAM in consumer PS2s, do these have more? AM_RANGE(0x1fc00000, 0x1fdfffff) AM_ROM AM_REGION("bios", 0) ADDRESS_MAP_END @@ -65,14 +78,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_UPDATE_DRIVER(namcops2_state, screen_update) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(system246) MCFG_PALETTE_LENGTH(65536) - - MCFG_VIDEO_START(system246) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( system256, system246 ) @@ -349,28 +359,27 @@ DISK_IMAGE_READONLY( "scp1cd0", 0, SHA1(19fa70ba22787704c40f0a8f27bc841218bbc99b) ) ROM_END -GAME(2001, sys246, 0, system246, system246, 0, ROT0, "Namco", "System 246 BIOS", GAME_NO_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT) -GAME(2001, rrvac, sys246, system246, system246, 0, ROT0, "Namco", "Ridge Racer V Arcade Battle (RRV3 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, dragchrn, sys246, system246, system246, 0, ROT0, "Namco", "Dragon Chronicles (DC001 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, netchu02, sys246, system246, system246, 0, ROT0, "Namco", "Netchuu Pro Yakyuu 2002 (NPY1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, scptour, sys246, system246, system246, 0, ROT0, "Namco", "Smash Court Pro Tournament (SCP1)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, soulclb2, sys246, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC23 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, soulcl2a, soulclb2, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC22 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, soulcl2b, soulclb2, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC21 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, tekken4, sys246, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF3 Ver. C)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, tekken4a, tekken4, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF2 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2002, tekken4b, tekken4, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2003, timecrs3, sys246, system246, system246, 0, ROT0, "Namco", "Time Crisis 3 (TST1)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2003, zgundm, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Mobile Suit Z-Gundam: A.E.U.G. vs Titans (ZGA1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2004, fghtjam, sys246, system246, system246, 0, ROT0, "Capcom / Namco", "Capcom Fighting Jam (JAM1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2004, sukuinuf, sys246, system246, system246, 0, ROT0, "Namco", "Quiz and Variety Suku Suku Inufuku 2 (IN2 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2004, zgundmdx, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Mobile Suit Z-Gundam: A.E.U.G. vs Titans DX (ZDX1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2005, gundzaft, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Gundam Seed: Federation vs. Z.A.F.T. (SED1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2005, soulclb3, sys246, system246, system246, 0, ROT0, "Namco", "Soul Calibur III (SC31001-NA-A)", GAME_NO_SOUND|GAME_NOT_WORKING) - -GAME(2004, sys256, 0, system256, system246, 0, ROT0, "Namco", "System 256 BIOS", GAME_NO_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT) -GAME(2005, tekken51, sys256, system256, system246, 0, ROT0, "Namco", "Tekken 5.1 (TE51 Ver. B)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2006, kinniku, sys256, system256, system246, 0, ROT0, "Namco", "Kinnikuman Muscle Grand Prix (KN1 Ver. A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2006, taiko9, sys256, system256, system246, 0, ROT0, "Namco", "Taiko No Tatsujin 9 (TK91001-NA-A)", GAME_NO_SOUND|GAME_NOT_WORKING) -GAME(2007, taiko10, sys256, system256, system246, 0, ROT0, "Namco", "Taiko No Tatsujin 10 (T101001-NA-A)", GAME_NO_SOUND|GAME_NOT_WORKING) - +GAME(2001, sys246, 0, system246, system246, 0, ROT0, "Namco", "System 246 BIOS", GAME_IS_SKELETON|GAME_IS_BIOS_ROOT) +GAME(2001, rrvac, sys246, system246, system246, 0, ROT0, "Namco", "Ridge Racer V Arcade Battle (RRV3 Ver. A)", GAME_IS_SKELETON) +GAME(2002, dragchrn, sys246, system246, system246, 0, ROT0, "Namco", "Dragon Chronicles (DC001 Ver. A)", GAME_IS_SKELETON) +GAME(2002, netchu02, sys246, system246, system246, 0, ROT0, "Namco", "Netchuu Pro Yakyuu 2002 (NPY1 Ver. A)", GAME_IS_SKELETON) +GAME(2002, scptour, sys246, system246, system246, 0, ROT0, "Namco", "Smash Court Pro Tournament (SCP1)", GAME_IS_SKELETON) +GAME(2002, soulclb2, sys246, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC23 Ver. A)", GAME_IS_SKELETON) +GAME(2002, soulcl2a, soulclb2, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC22 Ver. A)", GAME_IS_SKELETON) +GAME(2002, soulcl2b, soulclb2, system246, system246, 0, ROT0, "Namco", "Soul Calibur II (SC21 Ver. A)", GAME_IS_SKELETON) +GAME(2002, tekken4, sys246, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF3 Ver. C)", GAME_IS_SKELETON) +GAME(2002, tekken4a, tekken4, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF2 Ver. A)", GAME_IS_SKELETON) +GAME(2002, tekken4b, tekken4, system246, system246, 0, ROT0, "Namco", "Tekken 4 (TEF1 Ver. A)", GAME_IS_SKELETON) +GAME(2003, timecrs3, sys246, system246, system246, 0, ROT0, "Namco", "Time Crisis 3 (TST1)", GAME_IS_SKELETON) +GAME(2003, zgundm, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Mobile Suit Z-Gundam: A.E.U.G. vs Titans (ZGA1 Ver. A)", GAME_IS_SKELETON) +GAME(2004, fghtjam, sys246, system246, system246, 0, ROT0, "Capcom / Namco", "Capcom Fighting Jam (JAM1 Ver. A)", GAME_IS_SKELETON) +GAME(2004, sukuinuf, sys246, system246, system246, 0, ROT0, "Namco", "Quiz and Variety Suku Suku Inufuku 2 (IN2 Ver. A)", GAME_IS_SKELETON) +GAME(2004, zgundmdx, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Mobile Suit Z-Gundam: A.E.U.G. vs Titans DX (ZDX1 Ver. A)", GAME_IS_SKELETON) +GAME(2005, gundzaft, sys246, system246, system246, 0, ROT0, "Capcom / Banpresto", "Gundam Seed: Federation vs. Z.A.F.T. (SED1 Ver. A)", GAME_IS_SKELETON) +GAME(2005, soulclb3, sys246, system246, system246, 0, ROT0, "Namco", "Soul Calibur III (SC31001-NA-A)", GAME_IS_SKELETON) + +GAME(2004, sys256, 0, system256, system246, 0, ROT0, "Namco", "System 256 BIOS", GAME_IS_SKELETON|GAME_IS_BIOS_ROOT) +GAME(2005, tekken51, sys256, system256, system246, 0, ROT0, "Namco", "Tekken 5.1 (TE51 Ver. B)", GAME_IS_SKELETON) +GAME(2006, kinniku, sys256, system256, system246, 0, ROT0, "Namco", "Kinnikuman Muscle Grand Prix (KN1 Ver. A)", GAME_IS_SKELETON) +GAME(2006, taiko9, sys256, system256, system246, 0, ROT0, "Namco", "Taiko No Tatsujin 9 (TK91001-NA-A)", GAME_IS_SKELETON) +GAME(2007, taiko10, sys256, system256, system246, 0, ROT0, "Namco", "Taiko No Tatsujin 10 (T101001-NA-A)", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/namcos11.c mame-0.145/src/mame/drivers/namcos11.c --- mame-0.144/src/mame/drivers/namcos11.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos11.c 2012-02-06 21:30:36.000000000 +0000 @@ -269,7 +269,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/psx/psx.h" #include "cpu/m37710/m37710.h" #include "video/psx.h" @@ -284,7 +283,10 @@ { public: namcos11_state(const machine_config &mconfig, device_type type, const char *tag) - : psx_state(mconfig, type, tag) { } + : psx_state(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_mcu(*this,"c76") + { } UINT32 *m_sharedram; UINT32 *m_keycus; @@ -292,6 +294,9 @@ UINT8 m_su_83; UINT32 m_n_bankoffset; + + required_device m_maincpu; + required_device m_mcu; }; INLINE void ATTR_PRINTF(3,4) verboselog( running_machine &machine, int n_level, const char *s_fmt, ... ) @@ -814,24 +819,6 @@ AM_RANGE(M37710_ADC0_H, M37710_ADC7_H) AM_READNOP ADDRESS_MAP_END -static INTERRUPT_GEN( c76_interrupt ) -{ - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line(device, M37710_LINE_IRQ0, HOLD_LINE); - break; - - case 1: - device_set_input_line(device, M37710_LINE_IRQ2, HOLD_LINE); - break; - - case 2: - device_set_input_line(device, M37710_LINE_ADC, HOLD_LINE); - break; - } -} - static READ16_HANDLER( c76_speedup_r ) { namcos11_state *state = space->machine().driver_data(); @@ -981,6 +968,28 @@ memset( state->m_keycus, 0, state->m_keycus_size ); } + +static TIMER_DEVICE_CALLBACK( mcu_irq0_cb ) +{ + namcos11_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_IRQ0, HOLD_LINE); +} + +static TIMER_DEVICE_CALLBACK( mcu_irq2_cb ) +{ + namcos11_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_IRQ2, HOLD_LINE); +} + +static TIMER_DEVICE_CALLBACK( mcu_adc_cb ) +{ + namcos11_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_mcu, M37710_LINE_ADC, HOLD_LINE); +} + static MACHINE_CONFIG_START( coh100, namcos11_state ) /* basic machine hardware */ MCFG_CPU_ADD( "maincpu", CXD8530AQ, XTAL_67_7376MHz ) @@ -989,7 +998,10 @@ MCFG_CPU_ADD("c76", M37702, 16934400) MCFG_CPU_PROGRAM_MAP(c76_map) MCFG_CPU_IO_MAP(c76_io_map) - MCFG_CPU_VBLANK_INT_HACK(c76_interrupt, 3) + /* TODO: irq generation for these */ + MCFG_TIMER_ADD_PERIODIC("mcu_irq0", mcu_irq0_cb, attotime::from_hz(60)) + MCFG_TIMER_ADD_PERIODIC("mcu_irq2", mcu_irq2_cb, attotime::from_hz(60)) + MCFG_TIMER_ADD_PERIODIC("mcu_adc", mcu_adc_cb, attotime::from_hz(60)) MCFG_MACHINE_RESET( namcos11 ) diff -Nru mame-0.144/src/mame/drivers/namcos12.c mame-0.145/src/mame/drivers/namcos12.c --- mame-0.144/src/mame/drivers/namcos12.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos12.c 2012-02-06 21:30:36.000000000 +0000 @@ -1374,6 +1374,7 @@ if( strcmp( machine.system().name, "tektagt" ) == 0 || strcmp( machine.system().name, "tektagtac" ) == 0 || + strcmp( machine.system().name, "tektagtac1" ) == 0 || strcmp( machine.system().name, "tektagtub" ) == 0 || strcmp( machine.system().name, "tektagtjb" ) == 0 || strcmp( machine.system().name, "tektagtja" ) == 0 ) @@ -1386,6 +1387,7 @@ if( strcmp( machine.system().name, "tektagt" ) == 0 || strcmp( machine.system().name, "tektagtac" ) == 0 || + strcmp( machine.system().name, "tektagtac1" ) == 0 || strcmp( machine.system().name, "tektagtub" ) == 0 || strcmp( machine.system().name, "tektagtjb" ) == 0 || strcmp( machine.system().name, "tektagtja" ) == 0 || @@ -2545,24 +2547,24 @@ ROM_LOAD16_BYTE( "teg3verc.2p", 0x0000001, 0x200000, CRC(7caef9b2) SHA1(5c56d69ba2f723d0a4fbe4902196efc6ba9d5094) ) ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ - ROM_LOAD32_WORD( "teg3rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) - ROM_LOAD32_WORD( "teg3rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) - ROM_LOAD32_WORD( "teg3rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) - ROM_LOAD32_WORD( "teg3rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) - ROM_LOAD32_WORD( "teg3rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) - ROM_LOAD32_WORD( "teg3rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) + ROM_LOAD32_WORD( "teg1rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) + ROM_LOAD32_WORD( "teg1rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) + ROM_LOAD32_WORD( "teg1rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) + ROM_LOAD32_WORD( "teg1rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) + ROM_LOAD32_WORD( "teg1rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) + ROM_LOAD32_WORD( "teg1rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) - ROM_LOAD32_BYTE( "teg3flel.4", 0x3000000, 0x200000, CRC(88b3823c) SHA1(6f31acb642c57daccbfdb87b790037e261c8c73c) ) - ROM_LOAD32_BYTE( "teg3fleu.5", 0x3000001, 0x200000, CRC(36df0867) SHA1(6bec8560ad4c122dc909daa83aa9089ba5b281f7) ) - ROM_LOAD32_BYTE( "teg3flol.6", 0x3000002, 0x200000, CRC(03a76765) SHA1(ae35ae28375f2a3e52d72b77ec09750c326cc269) ) - ROM_LOAD32_BYTE( "teg3flou.7", 0x3000003, 0x200000, CRC(6d6947d1) SHA1(2f307bc4070fadb510c0473bc91d917b2d845ca5) ) + ROM_LOAD32_BYTE( "teg_flel.4", 0x3000000, 0x200000, CRC(88b3823c) SHA1(6f31acb642c57daccbfdb87b790037e261c8c73c) ) /* Flash roms with no labels */ + ROM_LOAD32_BYTE( "teg_fleu.5", 0x3000001, 0x200000, CRC(36df0867) SHA1(6bec8560ad4c122dc909daa83aa9089ba5b281f7) ) + ROM_LOAD32_BYTE( "teg_flol.6", 0x3000002, 0x200000, CRC(03a76765) SHA1(ae35ae28375f2a3e52d72b77ec09750c326cc269) ) + ROM_LOAD32_BYTE( "teg_flou.7", 0x3000003, 0x200000, CRC(6d6947d1) SHA1(2f307bc4070fadb510c0473bc91d917b2d845ca5) ) ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ - ROM_LOAD16_WORD_SWAP( "teg3verb.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ - ROM_LOAD( "teg3wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) - ROM_LOAD( "teg3wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) + ROM_LOAD( "teg1wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) + ROM_LOAD( "teg1wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) ROM_END ROM_START( tektagtub ) @@ -2571,24 +2573,24 @@ ROM_LOAD16_BYTE( "teg3verb.2p", 0x0000001, 0x200000, CRC(1dbe7591) SHA1(af464caa03fdd12024ad482e9c853a36510bfba7) ) ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ - ROM_LOAD32_WORD( "teg3rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) - ROM_LOAD32_WORD( "teg3rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) - ROM_LOAD32_WORD( "teg3rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) - ROM_LOAD32_WORD( "teg3rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) - ROM_LOAD32_WORD( "teg3rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) - ROM_LOAD32_WORD( "teg3rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) + ROM_LOAD32_WORD( "teg1rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) + ROM_LOAD32_WORD( "teg1rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) + ROM_LOAD32_WORD( "teg1rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) + ROM_LOAD32_WORD( "teg1rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) + ROM_LOAD32_WORD( "teg1rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) + ROM_LOAD32_WORD( "teg1rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) - ROM_LOAD32_BYTE( "teg3flel.4", 0x3000000, 0x200000, CRC(88b3823c) SHA1(6f31acb642c57daccbfdb87b790037e261c8c73c) ) - ROM_LOAD32_BYTE( "teg3fleu.5", 0x3000001, 0x200000, CRC(36df0867) SHA1(6bec8560ad4c122dc909daa83aa9089ba5b281f7) ) - ROM_LOAD32_BYTE( "teg3flol.6", 0x3000002, 0x200000, CRC(03a76765) SHA1(ae35ae28375f2a3e52d72b77ec09750c326cc269) ) - ROM_LOAD32_BYTE( "teg3flou.7", 0x3000003, 0x200000, CRC(6d6947d1) SHA1(2f307bc4070fadb510c0473bc91d917b2d845ca5) ) + ROM_LOAD32_BYTE( "teg_flel.4", 0x3000000, 0x200000, CRC(88b3823c) SHA1(6f31acb642c57daccbfdb87b790037e261c8c73c) ) /* Flash roms with no labels */ + ROM_LOAD32_BYTE( "teg_fleu.5", 0x3000001, 0x200000, CRC(36df0867) SHA1(6bec8560ad4c122dc909daa83aa9089ba5b281f7) ) + ROM_LOAD32_BYTE( "teg_flol.6", 0x3000002, 0x200000, CRC(03a76765) SHA1(ae35ae28375f2a3e52d72b77ec09750c326cc269) ) + ROM_LOAD32_BYTE( "teg_flou.7", 0x3000003, 0x200000, CRC(6d6947d1) SHA1(2f307bc4070fadb510c0473bc91d917b2d845ca5) ) ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ - ROM_LOAD16_WORD_SWAP( "teg3verb.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ - ROM_LOAD( "teg3wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) - ROM_LOAD( "teg3wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) + ROM_LOAD( "teg1wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) + ROM_LOAD( "teg1wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) ROM_END ROM_START( tektagtjb ) @@ -2597,24 +2599,24 @@ ROM_LOAD16_BYTE( "teg1verb.2j", 0x0000001, 0x200000, CRC(5413e2ed) SHA1(d453f7932654d8258c67eb7fe3639d71db7e414c) ) ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ - ROM_LOAD32_WORD( "teg3rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) - ROM_LOAD32_WORD( "teg3rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) - ROM_LOAD32_WORD( "teg3rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) - ROM_LOAD32_WORD( "teg3rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) - ROM_LOAD32_WORD( "teg3rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) - ROM_LOAD32_WORD( "teg3rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) + ROM_LOAD32_WORD( "teg1rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) + ROM_LOAD32_WORD( "teg1rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) + ROM_LOAD32_WORD( "teg1rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) + ROM_LOAD32_WORD( "teg1rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) + ROM_LOAD32_WORD( "teg1rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) + ROM_LOAD32_WORD( "teg1rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) - ROM_LOAD32_BYTE( "teg1flel.4", 0x3000000, 0x200000, NO_DUMP ) + ROM_LOAD32_BYTE( "teg1flel.4", 0x3000000, 0x200000, NO_DUMP ) /* Requires different data or other issue ? */ ROM_LOAD32_BYTE( "teg1fleu.5", 0x3000001, 0x200000, NO_DUMP ) ROM_LOAD32_BYTE( "teg1flol.6", 0x3000002, 0x200000, NO_DUMP ) ROM_LOAD32_BYTE( "teg1flou.7", 0x3000003, 0x200000, NO_DUMP ) ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ - ROM_LOAD16_WORD_SWAP( "teg3verb.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ - ROM_LOAD( "teg3wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) - ROM_LOAD( "teg3wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) + ROM_LOAD( "teg1wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) + ROM_LOAD( "teg1wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) ROM_END ROM_START( tektagtja ) @@ -2623,30 +2625,56 @@ ROM_LOAD16_BYTE( "teg1vera.2j", 0x0000001, 0x200000, CRC(97cd9524) SHA1(8031cb465db378a6d9db9b132cf1169b94cba7dc) ) ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ - ROM_LOAD32_WORD( "teg3rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) - ROM_LOAD32_WORD( "teg3rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) - ROM_LOAD32_WORD( "teg3rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) - ROM_LOAD32_WORD( "teg3rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) - ROM_LOAD32_WORD( "teg3rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) - ROM_LOAD32_WORD( "teg3rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) + ROM_LOAD32_WORD( "teg1rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) + ROM_LOAD32_WORD( "teg1rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) + ROM_LOAD32_WORD( "teg1rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) + ROM_LOAD32_WORD( "teg1rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) + ROM_LOAD32_WORD( "teg1rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) + ROM_LOAD32_WORD( "teg1rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) - ROM_LOAD32_BYTE( "teg1flel.4", 0x3000000, 0x200000, NO_DUMP ) + ROM_LOAD32_BYTE( "teg1flel.4", 0x3000000, 0x200000, NO_DUMP ) /* Requires different data or other issue ? */ ROM_LOAD32_BYTE( "teg1fleu.5", 0x3000001, 0x200000, NO_DUMP ) ROM_LOAD32_BYTE( "teg1flol.6", 0x3000002, 0x200000, NO_DUMP ) ROM_LOAD32_BYTE( "teg1flou.7", 0x3000003, 0x200000, NO_DUMP ) ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ - ROM_LOAD16_WORD_SWAP( "teg3verb.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ - ROM_LOAD( "teg3wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) - ROM_LOAD( "teg3wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) + ROM_LOAD( "teg1wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) + ROM_LOAD( "teg1wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) ROM_END ROM_START( tektagtac ) ROM_REGION32_LE( 0x00400000, "user1", 0 ) /* main prg */ - ROM_LOAD16_BYTE( "teg2verc1.2e", 0x0000000, 0x200000, CRC(c0800960) SHA1(80fc8910ebb2399b3be3c9ea87cc1d9283b42676) ) - ROM_LOAD16_BYTE( "teg2verc1.2j", 0x0000001, 0x200000, CRC(c0476713) SHA1(e51e4f3cd20ad6838fb05aaede0ab288e145e7a2) ) + ROM_LOAD16_BYTE( "teg2verc1.2e", 0x0000000, 0x200000, CRC(c6da0717) SHA1(9e01ae64710d85eb9899d6fa6fd0a2152aee8c11) ) /* Modified to work with alt romboard? */ + ROM_LOAD16_BYTE( "teg2verc1.2j", 0x0000001, 0x200000, CRC(25a1d2ff) SHA1(529a11a1bbb8655534d7ec371f1c09e9e387ed11) ) + + ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ + ROM_LOAD32_WORD( "teg1rom0e.9", 0x0000000, 0x800000, CRC(c962a373) SHA1(d662dbd89ef62c5ac3150a018fc2d35ef2ee94ac) ) + ROM_LOAD32_WORD( "teg1rom0o.13", 0x0000002, 0x800000, CRC(badb7dcf) SHA1(8c0bf7f6351c5a2a0996df371a901cf90c68cd8c) ) + ROM_LOAD32_WORD( "teg1rom1e.10", 0x1000000, 0x800000, CRC(b3d56124) SHA1(4df20c74ba63f7362caf15e9b8949fab655704fb) ) + ROM_LOAD32_WORD( "teg1rom1o.14", 0x1000002, 0x800000, CRC(2434ceb6) SHA1(f19f1599acbd6fd48793a2ee5a500ca817d9df56) ) + ROM_LOAD32_WORD( "teg1rom2e.11", 0x2000000, 0x800000, CRC(6e5c3428) SHA1(e3cdb60a4445406877b2e273385f34bfb0974220) ) + ROM_LOAD32_WORD( "teg1rom2o.15", 0x2000002, 0x800000, CRC(21ce9dfa) SHA1(f27e8210ee236c327aa3e1ce4dd408abc6580a1b) ) + + ROM_LOAD32_BYTE( "teg_flel.4", 0x3000000, 0x200000, CRC(88b3823c) SHA1(6f31acb642c57daccbfdb87b790037e261c8c73c) ) /* Flash roms with no labels */ + ROM_LOAD32_BYTE( "teg_fleu.5", 0x3000001, 0x200000, CRC(36df0867) SHA1(6bec8560ad4c122dc909daa83aa9089ba5b281f7) ) + ROM_LOAD32_BYTE( "teg_flol.6", 0x3000002, 0x200000, CRC(03a76765) SHA1(ae35ae28375f2a3e52d72b77ec09750c326cc269) ) + ROM_LOAD32_BYTE( "teg_flou.7", 0x3000003, 0x200000, CRC(6d6947d1) SHA1(2f307bc4070fadb510c0473bc91d917b2d845ca5) ) + + ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ + + ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ + ROM_LOAD( "teg1wave0.1", 0x0000000, 0x800000, CRC(4bd99104) SHA1(f76b0576cc28fe49d3c1c402988b933933e52e15) ) + ROM_LOAD( "teg1wave1.12", 0x0800000, 0x800000, CRC(dbc74fff) SHA1(601b7e7361ea744b34e3fa1fc39d88641de7f4c6) ) +ROM_END + +ROM_START( tektagtac1 ) + ROM_REGION32_LE( 0x00400000, "user1", 0 ) /* main prg */ + ROM_LOAD16_BYTE( "teg2ver_c1.2e", 0x0000000, 0x200000, CRC(c0800960) SHA1(80fc8910ebb2399b3be3c9ea87cc1d9283b42676) ) + ROM_LOAD16_BYTE( "teg2ver_c1.2j", 0x0000001, 0x200000, CRC(c0476713) SHA1(e51e4f3cd20ad6838fb05aaede0ab288e145e7a2) ) ROM_REGION32_LE( 0x3800000, "user2", 0 ) /* main data */ ROM_LOAD32_WORD( "teg2roml0", 0x0000000, 0x400000, CRC(cf984e85) SHA1(4d8296998b5f225b3f20bfdcb092a64b6e1fa76e) ) @@ -2661,11 +2689,11 @@ ROM_LOAD32_WORD( "teg2romh2", 0x2800000, 0x400000, CRC(8c03b301) SHA1(f395a4685e2deb8f7e9afc18ce15fa0d392b0cfa) ) ROM_LOAD32_WORD( "teg2roml20.ic15", 0x2000002, 0x400000, CRC(ed5ec7f7) SHA1(c91085a64ced95ee6618303987de61893e069742) ) /* located on the opposite side of the ROM PCB */ ROM_LOAD32_WORD( "teg2romh20", 0x2800002, 0x400000, CRC(c873c362) SHA1(d95451a7477b716c0d75ba04e1d8df3d8a4e10dd) ) - ROM_LOAD32_WORD( "teg2rf4", 0x3000000, 0x400000, CRC(612f6a37) SHA1(bd9597ef802e3c46f891f0ef523a3e0b0fe22672) ) - ROM_LOAD32_WORD( "teg2rf6", 0x3000002, 0x400000, CRC(0c9292ce) SHA1(664c6ccf18042ed8ebc29b1781ae7454acb05ba1) ) + ROM_LOAD32_WORD( "teg2rf4", 0x3000000, 0x400000, CRC(612f6a37) SHA1(bd9597ef802e3c46f891f0ef523a3e0b0fe22672) ) /* Different data?? Second half blank, all 0x00? */ + ROM_LOAD32_WORD( "teg2rf6", 0x3000002, 0x400000, CRC(0c9292ce) SHA1(664c6ccf18042ed8ebc29b1781ae7454acb05ba1) ) /* Different data?? Second half blank, all 0x00? */ ROM_REGION( 0x0080000, "sub", 0 ) /* sound prg */ - ROM_LOAD16_WORD_SWAP( "teg3verb.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) + ROM_LOAD16_WORD_SWAP( "teg1.11s", 0x0000000, 0x080000, CRC(67d0c469) SHA1(da164702fc21b9f46a9e32c89e7b1d36070ddf79) ) /* No label for this one */ ROM_REGION( 0x1000000, "c352", 0 ) /* samples */ ROM_LOAD( "teg2wavel0.ic12", 0x0000000, 0x400000, CRC(1865336f) SHA1(deda6d129daf709b0316f6260e67613fbf849e57) ) /* located on the opposite side of the ROM PCB */ @@ -2795,7 +2823,8 @@ GAME( 1999, gunbarl, ptblank2, coh700, ptblank2, ptblank2, ROT0, "Namco", "Gunbarl (Japan, GNB4/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC042 */ GAME( 1999, sws99, 0, coh700, namcos12, namcos12, ROT0, "Namco", "Super World Stadium '99 (Japan, SS91/VER.A3)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC043 */ GAME( 1999, tektagt, 0, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (US, TEG3/VER.C1)", GAME_IMPERFECT_SOUND ) /* KC044 */ -GAME( 1999, tektagtac, tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (Asia, TEG2/VER.C1)", GAME_IMPERFECT_SOUND ) /* KC044 */ +GAME( 1999, tektagtac, tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (Asia, TEG2/VER.C1, set 1)", GAME_IMPERFECT_SOUND ) /* KC044 */ +GAME( 1999, tektagtac1,tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (Asia, TEG2/VER.C1, set 2)", GAME_IMPERFECT_SOUND ) /* KC044 */ GAME( 1999, tektagtub, tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (US, TEG3/VER.B)", GAME_IMPERFECT_SOUND ) /* KC044 */ GAME( 1999, tektagtjb, tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (Japan, TEG1/VER.B)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC044 */ GAME( 1999, tektagtja, tektagt, coh700, namcos12, namcos12, ROT0, "Namco", "Tekken Tag Tournament (Japan, TEG1/VER.A3)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC044 */ diff -Nru mame-0.144/src/mame/drivers/namcos1.c mame-0.145/src/mame/drivers/namcos1.c --- mame-0.144/src/mame/drivers/namcos1.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos1.c 2012-02-06 21:30:42.000000000 +0000 @@ -1113,11 +1113,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(9 + 8*8, 9 + 44*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(namcos1) - MCFG_SCREEN_EOF(namcos1) + MCFG_SCREEN_UPDATE_STATIC(namcos1) + MCFG_SCREEN_VBLANK_STATIC(namcos1) MCFG_GFXDECODE(namcos1) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/namcos21.c mame-0.145/src/mame/drivers/namcos21.c --- mame-0.144/src/mame/drivers/namcos21.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos21.c 2012-02-06 21:30:36.000000000 +0000 @@ -1561,10 +1561,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCOS21_POLY_FRAME_WIDTH,NAMCOS21_POLY_FRAME_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(0,495,0,479) - MCFG_SCREEN_UPDATE(namcos21) + MCFG_SCREEN_UPDATE_STATIC(namcos21) MCFG_GFXDECODE(namcos21) MCFG_PALETTE_LENGTH(NAMCOS21_NUM_COLORS) @@ -1633,10 +1632,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCOS21_POLY_FRAME_WIDTH,NAMCOS21_POLY_FRAME_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(0,495,0,479) - MCFG_SCREEN_UPDATE(namcos21) + MCFG_SCREEN_UPDATE_STATIC(namcos21) MCFG_GFXDECODE(namcos21) MCFG_PALETTE_LENGTH(NAMCOS21_NUM_COLORS) @@ -1692,10 +1690,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(NAMCOS21_POLY_FRAME_WIDTH,NAMCOS21_POLY_FRAME_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(0,495,0,479) - MCFG_SCREEN_UPDATE(namcos21) + MCFG_SCREEN_UPDATE_STATIC(namcos21) MCFG_PALETTE_LENGTH(NAMCOS21_NUM_COLORS) diff -Nru mame-0.144/src/mame/drivers/namcos22.c mame-0.145/src/mame/drivers/namcos22.c --- mame-0.144/src/mame/drivers/namcos22.c 2012-01-13 15:34:45.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos22.c 2012-02-06 21:30:36.000000000 +0000 @@ -1136,7 +1136,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "includes/namcos22.h" #include "cpu/tms32025/tms32025.h" #include "cpu/m37710/m37710.h" @@ -1144,8 +1143,20 @@ #define SS22_MASTER_CLOCK (XTAL_49_152MHz) /* info from Guru */ +#define PIXEL_CLOCK ((SS22_MASTER_CLOCK*2)/4) // x 2 is due of the interlaced screen ... + +// VSync - 59.9042 Hz +// HSync - 15.7248 kHz +#define HTOTAL (781) +#define HBEND (0) +#define HBSTART (640) + +#define VTOTAL (262*2+1) +#define VBEND (0) +#define VBSTART (240*2) + + #define MCU_SPEEDUP 1 /* mcu idle skipping */ -#define DSP_SERIAL_SPEEDUP 1 /* lower DSP serial I/O period */ /** * helper function used to read a byte from a chunk of 32 bit memory @@ -1673,12 +1684,6 @@ COMBINE_DATA( &state->m_mpMasterExternalRAM[offset] ); } -#if DSP_SERIAL_SPEEDUP -#define SERIAL_IO_PERIOD 256 -#else -#define SERIAL_IO_PERIOD 1 -#endif - static WRITE16_HANDLER( slave_serial_io_w ) { namcos22_state *state = space->machine().driver_data(); @@ -1694,21 +1699,37 @@ return state->m_mSerialDataSlaveToMasterCurrent; } -static INTERRUPT_GEN( dsp_serial_pulse1 ) +static TIMER_DEVICE_CALLBACK( dsp_master_serial_irq ) { - namcos22_state *state = device->machine().driver_data(); + namcos22_state *state = timer.machine().driver_data(); + int scanline = param; + if( state->m_mbEnableDspIrqs ) { state->m_mSerialDataSlaveToMasterCurrent = state->m_mSerialDataSlaveToMasterNext; - if( cpu_getiloops(device) == 0 ) + if(scanline == 480) + cputag_set_input_line(timer.machine(), "master", TMS32025_INT0, HOLD_LINE); + else if((scanline % 2) == 0) { - cputag_set_input_line(device->machine(), "master", TMS32025_INT0, HOLD_LINE); + cputag_set_input_line(timer.machine(), "master", TMS32025_RINT, HOLD_LINE); + cputag_set_input_line(timer.machine(), "master", TMS32025_XINT, HOLD_LINE); + } + } +} + +static TIMER_DEVICE_CALLBACK( dsp_slave_serial_irq ) +{ + namcos22_state *state = timer.machine().driver_data(); + int scanline = param; + + if( state->m_mbEnableDspIrqs ) + { + if((scanline % 2) == 0) + { + cputag_set_input_line(timer.machine(), "slave", TMS32025_RINT, HOLD_LINE); + cputag_set_input_line(timer.machine(), "slave", TMS32025_XINT, HOLD_LINE); } - cputag_set_input_line(device->machine(), "master", TMS32025_RINT, HOLD_LINE); - cputag_set_input_line(device->machine(), "master", TMS32025_XINT, HOLD_LINE); - cputag_set_input_line(device->machine(), "slave", TMS32025_RINT, HOLD_LINE); - cputag_set_input_line(device->machine(), "slave", TMS32025_XINT, HOLD_LINE); } } @@ -2184,8 +2205,6 @@ { namcos22_state *state = device->machine().driver_data(); - state->m_mFrameCount++; - if (nthbyte(state->m_system_controller, 0x00) & 7) { // vblank irq @@ -2943,20 +2962,18 @@ AM_RANGE(M37710_PORT4, M37710_PORT4) AM_READ( mcu_port4_s22_r ) ADDRESS_MAP_END -static INTERRUPT_GEN( mcu_interrupt ) +static TIMER_DEVICE_CALLBACK( mcu_irq ) { - if (cpu_getiloops(device) == 0) - { - device_set_input_line(device, M37710_LINE_IRQ0, HOLD_LINE); - } - else if (cpu_getiloops(device) == 1) - { - device_set_input_line(device, M37710_LINE_IRQ2, HOLD_LINE); - } - else - { - device_set_input_line(device, M37710_LINE_ADC, HOLD_LINE); - } + //namcos22_state *state = timer.machine().driver_data(); + int scanline = param; + + /* TODO: real sources of these */ + if(scanline == 480) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_IRQ0, HOLD_LINE); + else if(scanline == 500) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_ADC, HOLD_LINE); + else if(scanline == 0) + cputag_set_input_line(timer.machine(), "mcu", M37710_LINE_IRQ2, HOLD_LINE); } static MACHINE_RESET(namcos22) @@ -2973,17 +2990,18 @@ MCFG_CPU_PROGRAM_MAP(master_dsp_program) MCFG_CPU_DATA_MAP(master_dsp_data) MCFG_CPU_IO_MAP(master_dsp_io) - MCFG_CPU_VBLANK_INT_HACK(dsp_serial_pulse1,SERIAL_IO_PERIOD) + MCFG_TIMER_ADD_SCANLINE("master_st", dsp_master_serial_irq, "screen", 0, 1) MCFG_CPU_ADD("slave", TMS32025,SS22_MASTER_CLOCK) MCFG_CPU_PROGRAM_MAP(slave_dsp_program) MCFG_CPU_DATA_MAP(slave_dsp_data) MCFG_CPU_IO_MAP(slave_dsp_io) + MCFG_TIMER_ADD_SCANLINE("slave_st", dsp_slave_serial_irq, "screen", 0, 1) MCFG_CPU_ADD("mcu", M37710, SS22_MASTER_CLOCK/3) MCFG_CPU_PROGRAM_MAP(mcu_program) MCFG_CPU_IO_MAP( mcu_io) - MCFG_CPU_VBLANK_INT_HACK(mcu_interrupt, 3) + MCFG_TIMER_ADD_SCANLINE("mcu_st", mcu_irq, "screen", 0, 1) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // MCFG_QUANTUM_PERFECT_CPU("maincpu") @@ -2991,12 +3009,8 @@ MCFG_NVRAM_HANDLER(namcos22) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(640,480) - MCFG_SCREEN_VISIBLE_AREA(0,640-1,0,480-1) - MCFG_SCREEN_UPDATE(namcos22s) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(namcos22s) MCFG_PALETTE_LENGTH(NAMCOS22_PALETTE_SIZE) MCFG_GFXDECODE(super) @@ -3228,12 +3242,13 @@ MCFG_CPU_PROGRAM_MAP(master_dsp_program) MCFG_CPU_DATA_MAP(master_dsp_data) MCFG_CPU_IO_MAP(master_dsp_io) - MCFG_CPU_VBLANK_INT_HACK(dsp_serial_pulse1,SERIAL_IO_PERIOD) + MCFG_TIMER_ADD_SCANLINE("master_st", dsp_master_serial_irq, "screen", 0, 1) MCFG_CPU_ADD("slave", TMS32025,SS22_MASTER_CLOCK) /* ? */ MCFG_CPU_PROGRAM_MAP(slave_dsp_program) MCFG_CPU_DATA_MAP(slave_dsp_data) MCFG_CPU_IO_MAP(slave_dsp_io) + MCFG_TIMER_ADD_SCANLINE("slave_st", dsp_slave_serial_irq, "screen", 0, 1) MCFG_CPU_ADD("mcu", M37702, SS22_MASTER_CLOCK/3) // C74 on the CPU board has no periodic interrupts, it runs entirely off Timer A0 MCFG_CPU_PROGRAM_MAP( mcu_s22_program) @@ -3243,12 +3258,8 @@ MCFG_NVRAM_HANDLER(namcos22) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(640,480) - MCFG_SCREEN_VISIBLE_AREA(0,640-1,0,480-1) - MCFG_SCREEN_UPDATE(namcos22) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(namcos22) MCFG_PALETTE_LENGTH(NAMCOS22_PALETTE_SIZE) MCFG_GFXDECODE(namcos22) diff -Nru mame-0.144/src/mame/drivers/namcos23.c mame-0.145/src/mame/drivers/namcos23.c --- mame-0.144/src/mame/drivers/namcos23.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos23.c 2012-02-06 21:30:36.000000000 +0000 @@ -1154,8 +1154,8 @@ { namcos23_state *state = space->machine().driver_data(); COMBINE_DATA( &state->m_textram[offset] ); - tilemap_mark_tile_dirty(state->m_bgtilemap, offset*2); - tilemap_mark_tile_dirty(state->m_bgtilemap, (offset*2)+1); + state->m_bgtilemap->mark_tile_dirty(offset*2); + state->m_bgtilemap->mark_tile_dirty((offset*2)+1); } static WRITE32_HANDLER( s23_txtchar_w ) @@ -1470,11 +1470,11 @@ switch(offset) { case 0: - tilemap_set_scrollx(state->m_bgtilemap, 0, data&0xfff); + state->m_bgtilemap->set_scrollx(0, data&0xfff); break; case 1: - tilemap_set_scrolly(state->m_bgtilemap, 0, data&0xfff); + state->m_bgtilemap->set_scrolly(0, data&0xfff); break; case 4: // interrupt control @@ -1654,8 +1654,8 @@ float du = extent->param[1].dpdx; float dv = extent->param[2].dpdx; float dl = extent->param[3].dpdx; - bitmap_t *bitmap = (bitmap_t *)dest; - UINT32 *img = BITMAP_ADDR32(bitmap, scanline, extent->startx); + bitmap_rgb32 *bitmap = (bitmap_rgb32 *)dest; + UINT32 *img = &bitmap->pix32(scanline, extent->startx); for(int x = extent->startx; x < extent->stopx; x++) { float z = w ? 1/w : 0; @@ -2064,7 +2064,7 @@ return p1->zkey < p2->zkey ? 1 : p1->zkey > p2->zkey ? -1 : 0; } -static void render_flush(running_machine &machine, bitmap_t *bitmap) +static void render_flush(running_machine &machine, bitmap_rgb32 &bitmap) { namcos23_state *state = machine.driver_data(); render_t &render = state->m_render; @@ -2077,18 +2077,18 @@ qsort(render.poly_order, render.poly_count, sizeof(namcos23_poly_entry *), render_poly_compare); - const static rectangle scissor = { 0, 639, 0, 479 }; + const static rectangle scissor(0, 639, 0, 479); for(int i=0; ird; - poly_render_triangle_fan(render.polymgr, bitmap, &scissor, render_scanline, 4, p->vertex_count, p->pv); + poly_render_triangle_fan(render.polymgr, &bitmap, scissor, render_scanline, 4, p->vertex_count, p->pv); } render.poly_count = 0; } -static void render_run(running_machine &machine, bitmap_t *bitmap) +static void render_run(running_machine &machine, bitmap_rgb32 &bitmap) { namcos23_state *state = machine.driver_data(); render_t &render = state->m_render; @@ -2117,33 +2117,33 @@ namcos23_state *state = machine.driver_data(); gfx_element_set_source(machine.gfx[0], (UINT8 *)state->m_charram); state->m_bgtilemap = tilemap_create(machine, TextTilemapGetInfo, tilemap_scan_rows, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_bgtilemap, 0xf); + state->m_bgtilemap->set_transparent_pen(0xf); // Gorgon's tilemap offset is 0, S23/SS23's is 860 if ((!strcmp(machine.system().name, "rapidrvr")) || (!strcmp(machine.system().name, "rapidrvr2")) || (!strcmp(machine.system().name, "finlflng"))) { - tilemap_set_scrolldx(state->m_bgtilemap, 0, 0); + state->m_bgtilemap->set_scrolldx(0, 0); } else { - tilemap_set_scrolldx(state->m_bgtilemap, 860, 860); + state->m_bgtilemap->set_scrolldx(860, 860); } state->m_render.polymgr = poly_alloc(machine, 10000, sizeof(namcos23_render_data), POLYFLAG_NO_WORK_QUEUE); } -static SCREEN_UPDATE( ss23 ) +static SCREEN_UPDATE_RGB32( ss23 ) { - namcos23_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + namcos23_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - render_run( screen->machine(), bitmap ); + render_run( screen.machine(), bitmap ); - gfx_element *gfx = screen->machine().gfx[0]; + gfx_element *gfx = screen.machine().gfx[0]; memset(gfx->dirty, 1, gfx->total_elements); - tilemap_draw( bitmap, cliprect, state->m_bgtilemap, 0/*flags*/, 0/*priority*/ ); /* opaque */ + state->m_bgtilemap->draw(bitmap, cliprect, 0/*flags*/, 0/*priority*/ ); /* opaque */ return 0; } @@ -2897,10 +2897,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(S23_VSYNC1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // Not in any way accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(ss23) + MCFG_SCREEN_UPDATE_STATIC(ss23) MCFG_PALETTE_LENGTH(0x8000) @@ -2943,10 +2942,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(S23_VSYNC1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // Not in any way accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(ss23) + MCFG_SCREEN_UPDATE_STATIC(ss23) MCFG_PALETTE_LENGTH(0x8000) @@ -2985,10 +2983,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(S23_VSYNC1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // Not in any way accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(ss23) + MCFG_SCREEN_UPDATE_STATIC(ss23) MCFG_PALETTE_LENGTH(0x8000) diff -Nru mame-0.144/src/mame/drivers/namcos2.c mame-0.145/src/mame/drivers/namcos2.c --- mame-0.144/src/mame/drivers/namcos2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos2.c 2012-02-06 21:30:42.000000000 +0000 @@ -1633,10 +1633,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(namcos2_default) + MCFG_SCREEN_UPDATE_STATIC(namcos2_default) MCFG_GFXDECODE(namcos2) MCFG_PALETTE_LENGTH(0x2000) @@ -1710,10 +1709,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(namcos2_default) + MCFG_SCREEN_UPDATE_STATIC(namcos2_default) MCFG_GFXDECODE(namcos2) MCFG_PALETTE_LENGTH(0x2000) @@ -1760,10 +1758,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(finallap) + MCFG_SCREEN_UPDATE_STATIC(finallap) MCFG_GFXDECODE(finallap) MCFG_PALETTE_LENGTH(0x2000) @@ -1810,10 +1807,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(sgunner) + MCFG_SCREEN_UPDATE_STATIC(sgunner) MCFG_GFXDECODE(sgunner) MCFG_PALETTE_LENGTH(0x2000) @@ -1860,10 +1856,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(luckywld) + MCFG_SCREEN_UPDATE_STATIC(luckywld) MCFG_GFXDECODE(luckywld) MCFG_PALETTE_LENGTH(0x2000) @@ -1910,10 +1905,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(metlhawk) + MCFG_SCREEN_UPDATE_STATIC(metlhawk) MCFG_GFXDECODE(metlhawk) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/namcos86.c mame-0.145/src/mame/drivers/namcos86.c --- mame-0.144/src/mame/drivers/namcos86.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/namcos86.c 2012-02-06 21:30:36.000000000 +0000 @@ -1013,11 +1013,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(3 + 8*8, 3 + 44*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(namcos86) - MCFG_SCREEN_EOF(namcos86) + MCFG_SCREEN_UPDATE_STATIC(namcos86) + MCFG_SCREEN_VBLANK_STATIC(namcos86) MCFG_GFXDECODE(namcos86) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/naomi.c mame-0.145/src/mame/drivers/naomi.c --- mame-0.144/src/mame/drivers/naomi.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/naomi.c 2012-02-06 21:30:37.000000000 +0000 @@ -284,7 +284,8 @@ Sticker EPROM MASKROMs X76F100 XC9536 315-5581 Game on cart IC22# # of SOP44 IC37# IC41# IC42# Notes ------------------------------------------------------------------------------------------------------------------------- -18 Wheeler Deluxe (Rev A) 840-0023C 22285A 20 (64Mb) ? 315-6213 317-0273-COM +18 Wheeler (Rev A) 840-0037C 23298? 20 (64Mb) ? 315-6213 317-0273-COM +18 Wheeler Deluxe (Rev A) 840-0023C 22185A 20 (64Mb) ? 315-6213 317-0273-COM Airline Pilots (Rev A) 840-0005C 21739A 11 (64Mb) ? 315-6213 317-0251-COM Airline Pilots Deluxe (Rev B) ? 21787B 11 (64Mb) present 315-6213 317-0251-COM 2 know BIOS 21801 (USA), 21802 (EXP) Cosmic Smash 840-0044C 23428 8 (64Mb) ? 315-6213 317-0289-COM joystick + 2 buttons @@ -419,7 +420,8 @@ Sticker EPROM MASKROMs EPM7032 315-6213 315-5581 Game on cart IC22# # of SOP44 IC27# IC41# IC42# Notes ---------------------------------------------------------------------------------------------------------------------------- -Alien Front 840-0048C 23586A 5 (128Mb) 315-6319A present 317-0293-COM +Alien Front (Rev A) 840-0048C 23586A 5 (128Mb) 315-6319A present 317-0293-COM +Alien Front (Rev T) 840-0048C 23586T 5 (128Mb) 315-6319A present 317-0293-COM Capcom Vs. SNK Millennium Fight 2000 (Rev A) 841-0011C 23511A 7 (128Mb) 315-6219 present 317-5059-COM (000804) Capcom Vs. SNK Millennium Fight 2000 (Rev C) 841-0011C 23511C 7 (128Mb) 315-6319 present 317-5059-COM (000904) Club Kart: European Session (Rev D) 840-0062C 21473D 11 (128Mb) 315-6319A present 317-0313-COM @@ -485,6 +487,7 @@ Melty Blood Actress Again (Rev A) 841-0061C 24455 6 (512Mb) present 317-5133-JPN present IC2# is labeled "REV.A" - IC4# is marked "5A" Mushiking - The King Of Beetles II ENG 840-0164C 24357 2 (512Mb) present 317-0437-COM present IC4# is marked "18" Poka Suka Ghost / Manic Panic Ghost 840-0170C not present 5 (512Mb) present 317-0461-COM present +Radirgy Noa 841-0062C not present 4 (512Mb) present 317-5138-JPN present IC2# is labeled "VER.2" - IC4# is marked "8A" Shooting Love 2007 841-0057C not present 4 (512Mb) present 317-5129-JPN present IC2# is labeled "VER.2" Touch De Zunou (Rev A) 840-0166C not present 2 (512Mb) present 317-0435-JPN present IC4# is marked "18" @@ -1404,7 +1407,6 @@ #include "machine/jvs13551.h" #define CPU_CLOCK (200000000) -static UINT32 *dc_sound_ram; static macronix_29l001mc_device *awflash; /* MD2 MD1 MD0 MD6 MD4 MD3 MD5 MD7 MD8 */ @@ -1412,12 +1414,16 @@ static READ64_HANDLER( naomi_arm_r ) { - return *((UINT64 *)dc_sound_ram+offset); + dc_state *state = space->machine().driver_data(); + + return *((UINT64 *)state->dc_sound_ram+offset); } static WRITE64_HANDLER( naomi_arm_w ) { - COMBINE_DATA((UINT64 *)dc_sound_ram + offset); + dc_state *state = space->machine().driver_data(); + + COMBINE_DATA((UINT64 *)state->dc_sound_ram + offset); } static READ64_HANDLER( naomi_unknown1_r ) @@ -1509,30 +1515,34 @@ // SB_LMMODE0 static WRITE64_HANDLER( ta_texture_directpath0_w ) { - int mode = pvrctrl_regs[SB_LMMODE0]&1; + dc_state *state = space->machine().driver_data(); + + int mode = state->pvrctrl_regs[SB_LMMODE0]&1; if (mode&1) { printf("ta_texture_directpath0_w 32-bit access!\n"); - COMBINE_DATA(&dc_framebuffer_ram[offset]); + COMBINE_DATA(&state->dc_framebuffer_ram[offset]); } else { - COMBINE_DATA(&dc_texture_ram[offset]); + COMBINE_DATA(&state->dc_texture_ram[offset]); } } // SB_LMMODE1 static WRITE64_HANDLER( ta_texture_directpath1_w ) { - int mode = pvrctrl_regs[SB_LMMODE1]&1; + dc_state *state = space->machine().driver_data(); + + int mode = state->pvrctrl_regs[SB_LMMODE1]&1; if (mode&1) { - printf("ta_texture_directpath0_w 32-bit access!\n"); - COMBINE_DATA(&dc_framebuffer_ram[offset]); + printf("ta_texture_directpath1_w 32-bit access!\n"); + COMBINE_DATA(&state->dc_framebuffer_ram[offset]); } else { - COMBINE_DATA(&dc_texture_ram[offset]); + COMBINE_DATA(&state->dc_texture_ram[offset]); } } @@ -1563,8 +1573,8 @@ AM_RANGE(0x0103ff00, 0x0103ffff) AM_MIRROR(0x02000000) AM_READWRITE( naomi_unknown1_r, naomi_unknown1_w ) // bios uses it, actual start and end addresses not known /* Area 1 */ - AM_RANGE(0x04000000, 0x04ffffff) AM_MIRROR(0x02000000) AM_RAM AM_BASE( &dc_texture_ram ) // texture memory 64 bit access - AM_RANGE(0x05000000, 0x05ffffff) AM_MIRROR(0x02000000) AM_RAM AM_BASE( &dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now + AM_RANGE(0x04000000, 0x04ffffff) AM_MIRROR(0x02000000) AM_RAM AM_BASE_MEMBER( dc_state,dc_texture_ram ) // texture memory 64 bit access + AM_RANGE(0x05000000, 0x05ffffff) AM_MIRROR(0x02000000) AM_RAM AM_BASE_MEMBER( dc_state,dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now /* Area 2*/ AM_RANGE(0x08000000, 0x09ffffff) AM_MIRROR(0x02000000) AM_NOP // 'Unassigned' @@ -1619,17 +1629,17 @@ AM_RANGE(0x025f8000, 0x025f9fff) AM_READWRITE( pvr2_ta_r, pvr2_ta_w ) /* Area 1 */ - AM_RANGE(0x04000000, 0x04ffffff) AM_RAM AM_BASE( &dc_texture_ram ) // texture memory 64 bit access - AM_RANGE(0x05000000, 0x05ffffff) AM_RAM AM_BASE( &dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now - AM_RANGE(0x06000000, 0x06ffffff) AM_RAM AM_BASE( &pvr2_texture_ram ) // 32 bit access 2nd PVR RAM - AM_RANGE(0x07000000, 0x07ffffff) AM_RAM AM_BASE( &pvr2_framebuffer_ram )// 64 bit access 2nd PVR RAM + AM_RANGE(0x04000000, 0x04ffffff) AM_RAM AM_BASE_MEMBER( dc_state, dc_texture_ram ) // texture memory 64 bit access + AM_RANGE(0x05000000, 0x05ffffff) AM_RAM AM_BASE_MEMBER( dc_state, dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now + AM_RANGE(0x06000000, 0x06ffffff) AM_RAM AM_BASE_MEMBER( dc_state, pvr2_texture_ram ) // 64 bit access 2nd PVR RAM + AM_RANGE(0x07000000, 0x07ffffff) AM_RAM AM_BASE_MEMBER( dc_state, pvr2_framebuffer_ram )// 32 bit access 2nd PVR RAM /* Area 2*/ AM_RANGE(0x085f6800, 0x085f69ff) AM_WRITE( dc_sysctrl_w ) // writes to BOTH PVRs AM_RANGE(0x085f8000, 0x085f9fff) AM_WRITE( pvrs_ta_w ) // writes to BOTH PVRs AM_RANGE(0x08800000, 0x088000ff) AM_READWRITE32( elan_regs_r, elan_regs_w, U64(0xffffffffffffffff) ) // T&L chip registers // AM_RANGE(0x09000000, 0x09??????) T&L command processing - AM_RANGE(0x0a000000, 0x0bffffff) AM_RAM AM_BASE( &elan_ram ) // T&L chip RAM + AM_RANGE(0x0a000000, 0x0bffffff) AM_RAM AM_BASE_MEMBER( dc_state, elan_ram ) // T&L chip RAM /* Area 3 */ AM_RANGE(0x0c000000, 0x0dffffff) AM_MIRROR(0xa2000000) AM_RAM AM_BASE(&naomi_ram64) @@ -1767,8 +1777,8 @@ AM_RANGE(0x0103ff00, 0x0103ffff) AM_READWRITE( naomi_unknown1_r, naomi_unknown1_w ) // bios uses it, actual start and end addresses not known /* Area 1 - half the texture memory, like dreamcast, not naomi */ - AM_RANGE(0x04000000, 0x047fffff) AM_RAM AM_MIRROR(0x00800000) AM_BASE( &dc_texture_ram ) // texture memory 64 bit access - AM_RANGE(0x05000000, 0x057fffff) AM_RAM AM_MIRROR(0x00800000) AM_BASE( &dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now + AM_RANGE(0x04000000, 0x047fffff) AM_RAM AM_MIRROR(0x00800000) AM_BASE_MEMBER( dc_state, dc_texture_ram ) // texture memory 64 bit access + AM_RANGE(0x05000000, 0x057fffff) AM_RAM AM_MIRROR(0x00800000) AM_BASE_MEMBER( dc_state, dc_framebuffer_ram ) // apparently this actually accesses the same memory as the 64-bit texture memory access, but in a different format, keep it apart for now /* Area 2*/ AM_RANGE(0x08000000, 0x0bffffff) AM_NOP // 'Unassigned' @@ -1819,7 +1829,7 @@ static ADDRESS_MAP_START( dc_audio_map, AS_PROGRAM, 32 ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000000, 0x007fffff) AM_RAM AM_BASE( &dc_sound_ram ) /* shared with SH-4 */ + AM_RANGE(0x00000000, 0x007fffff) AM_RAM AM_BASE_MEMBER( dc_state, dc_sound_ram ) /* shared with SH-4 */ AM_RANGE(0x00800000, 0x00807fff) AM_DEVREADWRITE("aica", dc_arm_aica_r, dc_arm_aica_w) ADDRESS_MAP_END @@ -2482,15 +2492,17 @@ static MACHINE_RESET( naomi ) { + dc_state *state = machine.driver_data(); + MACHINE_RESET_CALL(dc); - aica_set_ram_base(machine.device("aica"), dc_sound_ram, 8*1024*1024); + aica_set_ram_base(machine.device("aica"), state->dc_sound_ram, 8*1024*1024); } /* * Common for Naomi 1, Naomi GD-Rom, Naomi 2, Atomiswave ... */ -static MACHINE_CONFIG_START( naomi_aw_base, driver_device ) +static MACHINE_CONFIG_START( naomi_aw_base, dc_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SH4LE, CPU_CLOCK) // SH4!!! MCFG_CPU_CONFIG(sh4cpu_config) @@ -2512,10 +2524,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE(dc) + MCFG_SCREEN_UPDATE_STATIC(dc) MCFG_PALETTE_LENGTH(0x1000) @@ -2549,7 +2560,7 @@ */ static MACHINE_CONFIG_DERIVED( naomigd, naomi_base ) - MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", "gdrom", "pic", "naomibd_eeprom", "maincpu", naomi_g1_irq) + MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "pic", "naomibd_eeprom", "maincpu", naomi_g1_irq) MACHINE_CONFIG_END /* @@ -3921,6 +3932,40 @@ ROM_LOAD( "gram2000-key.bin", 0, 4, CRC(179314d9) SHA1(3dbbc04e9ff62800d08c4a239af3a83252a28dc0) ) ROM_END +ROM_START( tduno2 ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0x4000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-23071.ic11", 0x0000000, 0x0200000, CRC(1b58f24a) SHA1(90f91af31beff9399c8d72ae0087bf4d3122cac2) ) + ROM_LOAD32_WORD( "mpr-23063.ic17s", 0x1000000, 0x0800000, CRC(9678a759) SHA1(6f2602c6eef8db0d4a145d832aec3ea0e0491c0c) ) + ROM_LOAD32_WORD( "mpr-23064.ic18", 0x1000002, 0x0800000, CRC(e159c44d) SHA1(fd0dcd74f7e214c7c9214bb04167f7c3acea30cf) ) + ROM_LOAD32_WORD( "mpr-23065.ic19s", 0x2000000, 0x0800000, CRC(10eff527) SHA1(c208529b0825ba45dc474c6aaa4b4c5557335c10) ) + ROM_LOAD32_WORD( "mpr-23066.ic20", 0x2000002, 0x0800000, CRC(4f9c1710) SHA1(7834bab5933a156656756f837c217e7820f2ae63) ) + ROM_LOAD32_WORD( "mpr-23067.ic21s", 0x3000000, 0x0800000, CRC(32724cd9) SHA1(7bfdd58dd5e69529125a720f51c53ebe526ef2e9) ) + ROM_LOAD32_WORD( "mpr-23068.ic22", 0x3000002, 0x0800000, CRC(2ce3e0ea) SHA1(805ec80273856ec6e5ee04fdca5fd1407c404f8e) ) + + ROM_REGION( 4, "rom_key", 0 ) + ROM_LOAD( "tduno2.key", 0x000000, 0x000004, CRC(8e0f0f3b) SHA1(914d3db8746c806d559539cc0851169161d32c04) ) +ROM_END + +ROM_START( mtkob2 ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0x4000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "epr-24217.ic11", 0x0000000, 0x0400000, CRC(5ecf807b) SHA1(f91d03a68a44d02970e360789b746bec9289275f) ) + ROM_LOAD32_WORD( "mpr-24218.ic17s", 0x1000000, 0x0800000, CRC(e8c51e1d) SHA1(e81f0580e144aa7a7e8c9399ffa09227b6e93675) ) + ROM_LOAD32_WORD( "mpr-24219.ic18", 0x1000002, 0x0800000, CRC(b0a5709f) SHA1(993f7a99d59a924641c37a549208723342007e5a) ) + ROM_LOAD32_WORD( "mpr-24220.ic19s", 0x2000000, 0x0800000, CRC(9f6cefe2) SHA1(499e17d2c284b340db6b124b63a23c7fa5045d0f) ) + ROM_LOAD32_WORD( "mpr-24221.ic20", 0x2000002, 0x0800000, CRC(73bf9cc6) SHA1(ab187cc0babd1435f5e8636331818d81de23636f) ) + ROM_LOAD32_WORD( "mpr-24222.ic21s", 0x3000000, 0x0800000, CRC(7098e728) SHA1(82f4f57efcee3063467c24758cefd406dccb1ea4) ) + ROM_LOAD32_WORD( "mpr-24223.ic22", 0x3000002, 0x0800000, CRC(eca13c90) SHA1(26a66906bf4ebda8697140d89eb5e493e941e8b2) ) + + ROM_REGION( 4, "rom_key", 0 ) + ROM_LOAD( "mtkob2-key.bin", 0x000000, 0x000004, CRC(db088208) SHA1(14d65ad2555183a445abcd93907c85df4032b41d) ) +ROM_END + ROM_START( crackndj ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -5085,6 +5130,35 @@ ROM_LOAD( "virnbao-key.bin", 0, 4, CRC(980e3be8) SHA1(234a2f8ee408144d2c51e8083d0a033eea6026e0) ) ROM_END +ROM_START( virnbap ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD("vnbaearly.ic22",0x0000000, 0x0400000, CRC(5bbf7a45) SHA1(ad71ae8e9e08d7e0a9a60d1ba51bc5dcfeb0f50c) ) + ROM_LOAD("mpr-22928.ic1", 0x0800000, 0x0800000, CRC(63245c98) SHA1(a5a542244f07c6c8b66961a231fb56c89d2cf20c) ) + ROM_LOAD("mpr-22929.ic2", 0x1000000, 0x0800000, CRC(eea89d21) SHA1(5fe184267e637f155d767f8d931462d9593eff5a) ) + ROM_LOAD("mpr-22930.ic3", 0x1800000, 0x0800000, CRC(2fbefa9a) SHA1(a6df46cb8742022e436cdc6a9a50490c7a551421) ) + ROM_LOAD("mpr-22931.ic4", 0x2000000, 0x0800000, CRC(7332e559) SHA1(9147b69f84713f8e6c2c84b71ccd48bae879c655) ) + ROM_LOAD("mpr-22932.ic5", 0x2800000, 0x0800000, CRC(ef80e18c) SHA1(51406b82c66dc1822657948c62e1c4b8e628a739) ) + ROM_LOAD("mpr-22933.ic6", 0x3000000, 0x0800000, CRC(6a374076) SHA1(3b7c1ce5e3ae027e578c60a885724deeadc07448) ) + ROM_LOAD("mpr-22934.ic7", 0x3800000, 0x0800000, CRC(72f3ee15) SHA1(cf81e47c311769c9dc38fdbbef1a5e3f6b8a0be1) ) + ROM_LOAD("mpr-22935.ic8", 0x4000000, 0x0800000, CRC(35fda6e9) SHA1(857b3c0f576d69d3637503fa53608bc6484eb331) ) + ROM_LOAD("mpr-22936.ic9", 0x4800000, 0x0800000, CRC(b26df107) SHA1(900f1d06fdc9b6951de1b7e61a27ac846b2061db) ) + ROM_LOAD("mpr-22937.ic10",0x5000000, 0x0800000, CRC(477a374b) SHA1(309b723f7d2840d6a2f24ad2f877928cc8138a12) ) + ROM_LOAD("mpr-22938.ic11",0x5800000, 0x0800000, CRC(d59431a4) SHA1(6e3cd8cbde18a6a8672aa302cb119e486c0417e0) ) + ROM_LOAD("mpr-22939.ic12",0x6000000, 0x0800000, CRC(b31d3e6d) SHA1(d55e56a66dc678b973c3d60d3cffb59032bc3c46) ) + ROM_LOAD("mpr-22940.ic13",0x6800000, 0x0800000, CRC(90a81fbf) SHA1(5066b5eda80e881f6f399722f010161c0a452922) ) + ROM_LOAD("mpr-22941.ic14",0x7000000, 0x0800000, CRC(8a72a77d) SHA1(5ce73a76c7915d5a19b05f57b1dfdcd1fe3c53a1) ) + ROM_LOAD("mpr-22942.ic15",0x7800000, 0x0800000, CRC(710f709f) SHA1(2483f0b1106bc82710457a148772e50e83a439d8) ) + ROM_LOAD("mpr-22943.ic16",0x8000000, 0x0800000, CRC(c544f593) SHA1(553af7b6c63d6d6221c4286b8a13840a86e55d5f) ) + ROM_LOAD("mpr-22944.ic17",0x8800000, 0x0800000, CRC(cb096baa) SHA1(cbc267953a749dd24a03d87b65bc19b19bebf205) ) + ROM_LOAD("mpr-22945.ic18",0x9000000, 0x0800000, CRC(f2f914e8) SHA1(ec600abde40bfb5004ec8200ee0eef9410ebca6a) ) + ROM_LOAD("mpr-22946.ic19",0x9800000, 0x0800000, CRC(c79696c5) SHA1(4a9ac8b4ae1ce5d196e6c74fecc241b74aebc4ab) ) + ROM_LOAD("mpr-22947.ic20",0xa000000, 0x0800000, CRC(5e5eb595) SHA1(401d4a11d436988d716bb014b36233f171dc576d) ) + ROM_LOAD("mpr-22948.ic21",0xa800000, 0x0800000, CRC(1b0de917) SHA1(fd1742ea9bb2f1ce871ee3266171f26634e1c8e7) ) +ROM_END + /* SYSTEMID: NAOMI @@ -5417,6 +5491,33 @@ ROM_LOAD( "wldkicks-key.bin", 0, 4, CRC(c1e3000b) SHA1(36c2546833effe9452e2b3f7d31335fc5e349f49) ) ROM_END +ROM_START( toukon4 ) + NAOMI_BIOS + NAOMI_DEFAULT_EEPROM + + ROM_REGION( 0x10000000, "rom_board", ROMREGION_ERASEFF) + ROM_LOAD( "trf1_fl0.2f", 0x0000000, 0x0800000, CRC(862e673d) SHA1(f2c90932ba4abe31d02e86f80ef3e2689342c384) ) + ROM_LOAD( "trf1_fl1.2d", 0x0800000, 0x0800000, CRC(59a935c9) SHA1(7298d83a27eac74bad18d716a791ab2016fe028f) ) + ROM_LOAD( "trf1_ma1.4n", 0x1000000, 0x1000000, CRC(b1b3ab96) SHA1(3dc4bcf796583a0fb51359a86a46d7883df54fad) ) + ROM_LOAD( "trf1_ma2.4m", 0x2000000, 0x1000000, CRC(a27d3dda) SHA1(b9ec4be5845cbe91fd7bc537669e96716513a5f0) ) + ROM_LOAD( "trf1_ma3.4l", 0x3000000, 0x1000000, CRC(345ec434) SHA1(986d9930e7de46b88936c898ba8b05d950262a1f) ) + ROM_LOAD( "trf1_ma4.4k", 0x4000000, 0x1000000, CRC(fc47a104) SHA1(07ced58c1b17719ac36db1589771e67ce16d912e) ) + ROM_LOAD( "trf1_ma5.4j", 0x5000000, 0x1000000, CRC(e1bb077d) SHA1(6b70d8103bf067319e9022742fc1dd843d7e5076) ) + ROM_LOAD( "trf1_ma6.4h", 0x6000000, 0x1000000, CRC(abae4d06) SHA1(56da2ca3551287942afabf37e7fd1b884bd3cac8) ) + ROM_LOAD( "trf1_ma7.4f", 0x7000000, 0x1000000, CRC(19d0092a) SHA1(2ae2dbf2f3958da9f69b3a8636c6837e4243bb67) ) + ROM_LOAD( "trf1_ma8.4e", 0x8000000, 0x1000000, CRC(6fbf34ab) SHA1(f4747d1a1c02e22502e68d72a4f0c152fa69d778) ) + ROM_LOAD( "trf1_ma9.4d", 0x9000000, 0x1000000, CRC(2fa36c5d) SHA1(6478687c91484141521ae79a997cecbcfbb7beae) ) + ROM_LOAD( "trf1_ma10.4c", 0xa000000, 0x1000000, CRC(bc866a37) SHA1(d4d12f285a3bc9136cf3fc2a59dba5ad557cc7d7) ) + ROM_LOAD( "trf1_ma11.4b", 0xb000000, 0x1000000, CRC(68d11482) SHA1(fe991ba5664d6ccf0aac5167f05c5a780f851ae9) ) + ROM_LOAD( "trf1_ma12.6p", 0xc000000, 0x1000000, CRC(a7c3bd3c) SHA1(ed5a24e4c47f686120577dae4550fb9378209cf8) ) + ROM_LOAD( "trf1_ma13.6n", 0xd000000, 0x1000000, CRC(e52d41fe) SHA1(e1769d42d6048f9621ca289af3ddeca7c14cee00) ) + ROM_LOAD( "trf1_ma14.6m", 0xe000000, 0x1000000, CRC(87cb31a0) SHA1(27aef9ac571a0b5e3a76e4ee22f5bc5d0ae962f2) ) + ROM_LOAD( "trf1_ma15.6l", 0xf000000, 0x1000000, CRC(42d318c5) SHA1(f9fe82ffbfc51fcb52333f94c55a7092e7124fb4) ) + + ROM_REGION( 4, "rom_key", 0 ) + ROM_LOAD( "tr4ae-key.bin", 0x000000, 0x000004, CRC(986a7cee) SHA1(70c3ff80f86de6a0655251658c66a156fb644995) ) +ROM_END + ROM_START( vtenis2c ) NAOMI_BIOS NAOMI_DEFAULT_EEPROM @@ -7296,7 +7397,7 @@ ROM_START( anmlbskt ) AW_BIOS - ROM_REGION( 0x8000000, "user1", ROMREGION_ERASE) + ROM_REGION( 0x8000000, "rom_board", ROMREGION_ERASE) ROM_LOAD( "vm2001f01.u3", 0x0000000, 0x800000, CRC(4fb33380) SHA1(9070990515544e6e9a1d24b1e0597cdea926a4c9) ) ROM_LOAD( "vm2001f01.u1", 0x1000000, 0x800000, CRC(3de23e27) SHA1(d3aae2a7e5c78fc3bf8e296392d8f893961d946f) ) ROM_LOAD( "vm2001f01.u2", 0x2000000, 0x800000, CRC(386070a1) SHA1(bf46980ea822b4cfe67c622f0104bf793031f4ad) ) @@ -7624,192 +7725,195 @@ */ +#define GAME_FLAGS (GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING) + /* Main board and game specific BIOS */ -/* Naomi */ GAME( 1998, naomi, 0, naomi, naomi, naomi, ROT0, "Sega", "Naomi Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -/* game */ GAME( 1998, hod2bios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi House of the Dead 2 Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -/* game */ GAME( 1999, f355bios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi Ferrari F355 Challenge Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -/* game */ GAME( 1999, airlbios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi Airline Pilots Deluxe Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -/* Naomi2*/ GAME( 2001, naomi2, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi 2 Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -/* GDROM */ GAME( 2001, naomigd, 0, naomi, naomi, naomi, ROT0, "Sega", "Naomi GD-ROM Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) +/* Naomi */ GAME( 1998, naomi, 0, naomi, naomi, naomi, ROT0, "Sega", "Naomi Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) +/* game */ GAME( 1998, hod2bios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi House of the Dead 2 Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) +/* game */ GAME( 1999, f355bios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi Ferrari F355 Challenge Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) +/* game */ GAME( 1999, airlbios, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi Airline Pilots Deluxe Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) +/* Naomi2*/ GAME( 2001, naomi2, 0, naomi, naomi, 0, ROT0, "Sega", "Naomi 2 Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) +/* GDROM */ GAME( 2001, naomigd, 0, naomi, naomi, naomi, ROT0, "Sega", "Naomi GD-ROM Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) /* 834-xxxxx (Sega Naomi cart with game specific BIOS sets) */ -/* 13636 */ GAME( 1998, hotd2, hod2bios, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "hod2bios" needed */ -/* 13636 */ GAME( 1998, hotd2o, hotd2, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2 (original)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "hod2bios" needed */ -/* 13636 */ GAME( 1998, hotd2p, hotd2, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2 (prototype)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "hod2bios" needed */ -/* 13842 */ GAME( 1999, f355, f355bios, naomi, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "f355bios" needed */ -/* 13950 */ GAME( 1999, f355twin, f355bios, naomim2, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge (Twin)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "f355bios" needed */ -/* ????? */ GAME( 2001, f355twn2, f355bios, naomim2, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge 2 (Twin)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "f355bios" needed */ -/* ????? */ GAME( 1999, alpiltdx, airlbios, naomim2, naomi, 0, ROT0, "Sega", "Airline Pilots Deluxe (Rev B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "airlbios" needed */ +/* 13636 */ GAME( 1998, hotd2, hod2bios, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ +/* 13636 */ GAME( 1998, hotd2o, hotd2, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2 (original)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ +/* 13636 */ GAME( 1998, hotd2p, hotd2, naomi, hotd2, hotd2, ROT0, "Sega", "House of the Dead 2 (prototype)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */ +/* 13842 */ GAME( 1999, f355, f355bios, naomi, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge", GAME_FLAGS ) /* specific BIOS "f355bios" needed */ +/* 13950 */ GAME( 1999, f355twin, f355bios, naomim2, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge (Twin)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */ +/* ????? */ GAME( 2001, f355twn2, f355bios, naomim2, naomi, 0, ROT0, "Sega", "Ferrari F355 Challenge 2 (Twin)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */ +/* ????? */ GAME( 1999, alpiltdx, airlbios, naomim2, naomi, 0, ROT0, "Sega", "Airline Pilots Deluxe (Rev B)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */ /* 840-xxxxx (Sega Naomi cart games)*/ -/* 0001 */ GAME( 1998, dybbnao, naomi, naomi, dybbnao, naomi, ROT0, "Sega", "Dynamite Baseball NAOMI (JPN)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0002 */ GAME( 1999, crzytaxi, naomi, naomim2, crzytaxi, naomi, ROT0, "Sega", "Crazy Taxi (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0003 */ GAME( 1999, zombrvn, naomi, naomim2, zombrvn, naomi, ROT0, "Sega", "Zombie Revenge (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0005 */ GAME( 1999, alpilota, naomi, naomim2, alpilota, naomi, ROT0, "Sega", "Airline Pilots (Rev A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) /* specific BIOS "airlbios" needed */ -/* 0007 */ GAME( 1999, ggram2, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Giant Gram: All Japan Pro Wrestling 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0010 */ GAME( 1999, vs2_2k, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000 (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0011 */ GAME( 1999, toyfight, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Toy Fighter", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0012 */ GAME( 1999, smlg99, naomi, naomim2, dybbnao, naomi, ROT0, "Sega", "Super Major League '99", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0013 */ GAME( 1999, jambo, naomi, naomim2, jambo, naomi, ROT0, "Sega", "Jambo! Safari (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0015 */ GAME( 1999, vtennis, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtua Tennis (USA, EXP, KOR, AUS) / Power Smash (JPN)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0016 */ GAME( 1999, derbyoc, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Derby Owners Club (JPN, USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0017 */ GAME( 1999, otrigger, naomi, naomim2, naomi, naomi, ROT0, "Sega", "OutTrigger (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0018 */ GAME( 1999, sgtetris, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Sega Tetris", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0019 */ GAME( 1999, dybb99, naomi, naomim2, dybbnao, naomi, ROT0, "Sega", "Dynamite Baseball '99 (JPN) / World Series '99 (USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0020 */ GAME( 1999, samba, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Samba De Amigo (JPN) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi, ROT0, "Sega", "Virtua NBA (JPN, USA, EXP, KOR, AUS) (original)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0021-01 */ GAME( 2000,virnba, naomi, naomi, naomi, naomi, ROT0, "Sega", "Virtua NBA (JPN, USA, EXP, KOR, AUS)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -// 0022 Touch de Uno! 2 -/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr, naomi, ROT0, "Sega", "18 Wheeler Deluxe (Rev A) (JPN)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0023 */ GAME( 2000, 18wheels, 18wheelr, naomim2, 18wheelr, naomi, ROT0, "Sega", "18 Wheeler (Rev A) (JPN)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0001 */ GAME( 1998, dybbnao, naomi, naomi, dybbnao, naomi, ROT0, "Sega", "Dynamite Baseball NAOMI (JPN)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0002 */ GAME( 1999, crzytaxi, naomi, naomim2, crzytaxi, naomi, ROT0, "Sega", "Crazy Taxi (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0003 */ GAME( 1999, zombrvn, naomi, naomim2, zombrvn, naomi, ROT0, "Sega", "Zombie Revenge (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0005 */ GAME( 1999, alpilota, naomi, naomim2, alpilota, naomi, ROT0, "Sega", "Airline Pilots (Rev A)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */ +/* 0007 */ GAME( 1999, ggram2, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Giant Gram: All Japan Pro Wrestling 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0010 */ GAME( 1999, vs2_2k, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000 (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0011 */ GAME( 1999, toyfight, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Toy Fighter", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0012 */ GAME( 1999, smlg99, naomi, naomim2, dybbnao, naomi, ROT0, "Sega", "Super Major League '99", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0013 */ GAME( 1999, jambo, naomi, naomim2, jambo, naomi, ROT0, "Sega", "Jambo! Safari (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0015 */ GAME( 1999, vtennis, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtua Tennis (USA, EXP, KOR, AUS) / Power Smash (JPN)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0016 */ GAME( 1999, derbyoc, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Derby Owners Club (JPN, USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0017 */ GAME( 1999, otrigger, naomi, naomim2, naomi, naomi, ROT0, "Sega", "OutTrigger (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0018 */ GAME( 1999, sgtetris, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Sega Tetris", GAME_FLAGS ) +/* 0019 */ GAME( 1999, dybb99, naomi, naomim2, dybbnao, naomi, ROT0, "Sega", "Dynamite Baseball '99 (JPN) / World Series '99 (USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0020 */ GAME( 1999, samba, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Samba De Amigo (JPN) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0021 */ GAME( 2000, virnbap, virnba, naomi, naomi, naomi, ROT0, "Sega", "Virtua NBA (prototype)", GAME_FLAGS ) +/* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi, ROT0, "Sega", "Virtua NBA (JPN, USA, EXP, KOR, AUS) (original)", GAME_FLAGS ) +/* 0021-01 */ GAME( 2000,virnba, naomi, naomi, naomi, naomi, ROT0, "Sega", "Virtua NBA (JPN, USA, EXP, KOR, AUS)", GAME_FLAGS ) +/* 0022 */ GAME( 2000, tduno2, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Touch de Uno! 2", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr, naomi, ROT0, "Sega", "18 Wheeler Deluxe (Rev A) (JPN)", GAME_FLAGS ) +/* 0023 */ GAME( 2000, 18wheels, 18wheelr, naomim2, 18wheelr, naomi, ROT0, "Sega", "18 Wheeler (Rev A) (JPN)", GAME_FLAGS ) // 0025 Mars TV -/* 0026 */ GAME( 2000, totd, naomi, naomi, naomi, naomi, ROT0, "Sega", "The Typing of the Dead (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0027 */ GAME( 2000, smarinef, naomi, naomi, naomi, naomi, ROT0, "Sega", "Sega Marine Fishing", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0028 */ GAME( 2000, vonot, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtual On Oratorio Tangram M.S.B.S. ver5.66 2000 Edition", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0030 */ GAME( 2000, qmegamis, naomi, naomim1, naomi, qmegamis, ROT0, "Sega", "Quiz Ah Megamisama (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0035 */ GAME( 2000, sstrkfgt, naomi, naomim2, sstrkfgt, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0026 */ GAME( 2000, totd, naomi, naomi, naomi, naomi, ROT0, "Sega", "The Typing of the Dead (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_FLAGS ) +/* 0027 */ GAME( 2000, smarinef, naomi, naomi, naomi, naomi, ROT0, "Sega", "Sega Marine Fishing", GAME_FLAGS ) +/* 0028 */ GAME( 2000, vonot, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Virtual On Oratorio Tangram M.S.B.S. ver5.66 2000 Edition", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0030 */ GAME( 2000, qmegamis, naomi, naomim1, naomi, qmegamis, ROT0, "Sega", "Quiz Ah Megamisama (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0035 */ GAME( 2000, sstrkfgt, naomi, naomim2, sstrkfgt, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A)", GAME_FLAGS ) // 0037 18 Wheeler - American Pro Trucker -/* 0039 */ GAME( 2000, gram2000, naomi, naomim1, naomi, gram2000, ROT0, "Sega", "Giant Gram 2000 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0040 */ GAME( 2000, wwfroyal, naomi, naomim2, naomi, naomi, ROT0, "Sega", "WWF Royal Rumble (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0041 */ GAME( 2000, slasho, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Slashout (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0043 */ GAME( 2000, crackndj, naomi, naomim2, crackndj, naomi, ROT0, "Sega", "Crackin' DJ", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0044 */ GAME( 2000, csmasho, csmash, naomim2, naomi, naomi, ROT0, "Sega", "Cosmic Smash (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0044 */ GAME( 2000, csmash, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Cosmic Smash (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0047 */ GAME( 2000, samba2k, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Samba de Amigo ver. 2000", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0048 */ GAME( 2001, alienfnt, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Alien Front (Rev T)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0048 */ GAME( 2001, alienfnta, alienfnt,naomim2, naomi, naomi, ROT0, "Sega", "Alien Front (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0052 */ GAME( 2000, derbyo2k, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club 2000 (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0064 */ GAME( 2001, wrungp, naomi, naomi, naomi, naomi, ROT0, "Sega", "Wave Runner GP", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0073 */ GAME( 2001, inunoos, naomi, naomi, naomi, naomi, ROT0, "Sega", "Inu No Osanpo / Dog Walking (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0083 */ GAME( 2001, derbyoc2, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club II (JPN, USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (JPN) (USA, EXP, KOR, AUS) (Cart, Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0088 */ GAME( 2001, derbyocw, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club World Edition (JPN, USA, EXP, KOR, AUS) (Rev D)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0088 */ GAME( 2001, drbyocwc, derbyocw, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club World Edition (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0098 */ GAME( 2002, shootopl, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0126 */ GAME( 2003, oinori, naomi, naomi, naomi, naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0128 */ GAME( 2002, shootpl, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool (JPN, USA, KOR, AUS) / Shootout Pool Prize (EXP)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1, naomi, kick4csh, ROT0, "Sega", "Kick '4' Cash", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -// 0150 MushiKing The King Of Beetle 2K3 2ND +/* 0039 */ GAME( 2000, gram2000, naomi, naomim1, naomi, gram2000, ROT0, "Sega", "Giant Gram 2000 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0040 */ GAME( 2000, wwfroyal, naomi, naomim2, naomi, naomi, ROT0, "Sega", "WWF Royal Rumble (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0041 */ GAME( 2000, slasho, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Slashout (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0043 */ GAME( 2000, crackndj, naomi, naomim2, crackndj, naomi, ROT0, "Sega", "Crackin' DJ", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0044 */ GAME( 2000, csmasho, csmash, naomim2, naomi, naomi, ROT0, "Sega", "Cosmic Smash (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0044 */ GAME( 2000, csmash, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Cosmic Smash (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0047 */ GAME( 2000, samba2k, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Samba de Amigo ver. 2000", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0048 */ GAME( 2001, alienfnt, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Alien Front (Rev T)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0048 */ GAME( 2001, alienfnta, alienfnt,naomim2, naomi, naomi, ROT0, "Sega", "Alien Front (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0052 */ GAME( 2000, derbyo2k, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club 2000 (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0064 */ GAME( 2001, wrungp, naomi, naomi, naomi, naomi, ROT0, "Sega", "Wave Runner GP", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0073 */ GAME( 2001, inunoos, naomi, naomi, naomi, naomi, ROT0, "Sega", "Inu No Osanpo / Dog Walking (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0083 */ GAME( 2001, derbyoc2, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club II (JPN, USA, EXP, KOR, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (JPN) (USA, EXP, KOR, AUS) (Cart, Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0088 */ GAME( 2001, derbyocw, naomi, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club World Edition (JPN, USA, EXP, KOR, AUS) (Rev D)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0088 */ GAME( 2001, drbyocwc, derbyocw, naomi, naomi, naomi, ROT0, "Sega", "Derby Owners Club World Edition (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0098 */ GAME( 2002, shootopl, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0126 */ GAME( 2003, oinori, naomi, naomi, naomi, naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0128 */ GAME( 2002, shootpl, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool (JPN, USA, KOR, AUS) / Shootout Pool Prize (EXP)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1, naomi, kick4csh, ROT0, "Sega", "Kick '4' Cash", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0150 */ GAME( 2003, mtkob2, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Mushiking The King Of Beetle 2K3 2nd", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 0164 MushiKing The King Of Beetle II ENG // 0166 Touch De Zunou (Japan) // 0166 Touch De Zunou (Japan) (Rev A) -/* 0170 */ GAME( 2007, pokasuka, naomi, naomim4, naomi, naomi, ROT0, "Sega", "Pokasuka Ghost", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi, ROT0, "Sega", "Asian Dynamite", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 00?? */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Ring Out 4x4", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0??? */ GAME( 2001, shootplm, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool Medal", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0170 */ GAME( 2007, pokasuka, naomi, naomim4, naomi, naomi, ROT0, "Sega", "Pokasuka Ghost", GAME_FLAGS ) +/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi, ROT0, "Sega", "Asian Dynamite", GAME_FLAGS ) +/* 00?? */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi, ROT0, "Sega", "Ring Out 4x4", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0??? */ GAME( 2001, shootplm, naomi, naomim1, naomi, naomi, ROT0, "Sega", "Shootout Pool Medal", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 00?? Crackin' DJ Part 2 // 00?? Touch de Uno! /* 840-xxxxx (Sega Naomi 2 cart games) */ -/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Wild Riders (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev C)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0061 */ GAME( 2001, vstrik3cb,vstrik3c, naomi2, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0062 */ GAME( 2002, clubkrte, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Cartridge)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "King of Route 66 (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Wild Riders (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev C)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0061 */ GAME( 2001, vstrik3cb,vstrik3c, naomi2, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (USA, EXP, KOR, AUS) (Cart, Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0062 */ GAME( 2002, clubkrte, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Cartridge)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2, naomi, naomi2, ROT0, "Sega", "King of Route 66 (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 0095 Soul Surfer -/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, vf4evoct, ROT0, "Sega", "Virtua Fighter 4 Evolution (Cartridge)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, vf4evoct, ROT0, "Sega", "Virtua Fighter 4 Evolution (Cartridge)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 0129 Club Kart Prize /* 841-xxxxx ("Licensed by Sega" Naomi cart games)*/ -/* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Power Stone (JPN, USA, EUR, ASI, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0002 */ GAME( 1999, suchie3, naomi, naomim2, naomi_mp, naomi_mp, ROT0, "Jaleco", "Idol Janshi Suchie-Pai 3 (JPN)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0003 */ GAME( 1999, doa2, naomi, naomim2, naomi, naomi, ROT0, "Tecmo", "Dead or Alive 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0003 */ GAME( 2000, doa2m, doa2, naomim2, naomi, naomi, ROT0, "Tecmo", "Dead or Alive 2 Millennium (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0004 */ GAME( 1999, shangril, naomi, naomi, naomi_mp, naomi_mp, ROT0, "Marvelous Ent.", "Dengen Tenshi Taisen Janshi Shangri-la (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0005 */ GAME( 1999, spawn, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Spawn In the Demon's Hand (JPN, USA, EUR, ASI, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0006 */ GAME( 1999, puyoda, naomi, naomim2, naomi, naomi, ROT0, "Compile", "Puyo Puyo Da!", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0007-02 */ GAME( 2000,mvsc2, naomi, naomim1, naomi, mvsc2, ROT0, "Capcom", "Marvel Vs. Capcom 2 New Age of Heroes (JPN, USA, EUR, ASI, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0008 */ GAME( 2000, pstone2, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Power Stone 2 (JPN, USA, EUR, ASI, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0011 */ GAME( 2000, capsnk, naomi, naomim2, naomi, naomi, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0011 */ GAME( 2000, capsnka, capsnk, naomim2, naomi, naomi, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0012 */ GAME( 2000, cspike, naomi, naomim2, naomi, naomi, ROT0, "Psikyo / Capcom", "Gun Spike (JPN) / Cannon Spike (USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0013 */ GAME( 2000, ggx, naomi, naomim2, naomi, naomi, ROT0, "Arc System Works","Guilty Gear X (JPN)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0014 */ GAME( 2000, gwing2, naomi, naomim2, naomi, naomi, ROT0, "Takumi / Capcom", "Giga Wing 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0015 */ GAME( 2000, pjustic, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Moero Justice Gakuen (JPN) / Project Justice (USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0016 */ GAME( 2000, deathcox, naomi, naomim2, naomi, naomi, ROT0, "Ecole Software", "Death Crimson OX (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0017 */ GAME( 2001, gundmct, naomi, naomi, naomi, naomi, ROT0, "Banpresto", "Mobile Suit Gundam: Federation Vs. Zeon (2001-02-08)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0020 */ GAME( 2001, zerogu2, naomi, naomim2, naomi, naomi, ROT0, "Psikyo", "Zero Gunner 2", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0057 */ GAME( 2007, sl2007, naomi, naomim4, naomi, naomi, ROT270, "Triangle Service", "Shooting Love 2007", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0058 */ GAME( 2008, ausfache, naomi, naomim4, naomi, naomi, ROT0, "Subtle Style", "Akatsuki Blitzkampf Ausf Achse", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0059 */ GAME( 2008, illvelo, naomi, naomim4, naomi, naomi, ROT270, "Milestone", "Illvelo (Illmatic Envelope)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Power Stone (JPN, USA, EUR, ASI, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0002 */ GAME( 1999, suchie3, naomi, naomim2, naomi_mp, naomi_mp, ROT0, "Jaleco", "Idol Janshi Suchie-Pai 3 (JPN)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0003 */ GAME( 1999, doa2, naomi, naomim2, naomi, naomi, ROT0, "Tecmo", "Dead or Alive 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0003 */ GAME( 2000, doa2m, doa2, naomim2, naomi, naomi, ROT0, "Tecmo", "Dead or Alive 2 Millennium (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0004 */ GAME( 1999, shangril, naomi, naomi, naomi_mp, naomi_mp, ROT0, "Marvelous Ent.", "Dengen Tenshi Taisen Janshi Shangri-la (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0005 */ GAME( 1999, spawn, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Spawn In the Demon's Hand (JPN, USA, EUR, ASI, AUS) (Rev B)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0006 */ GAME( 1999, puyoda, naomi, naomim2, naomi, naomi, ROT0, "Compile", "Puyo Puyo Da!", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0007-02 */ GAME( 2000,mvsc2, naomi, naomim1, naomi, mvsc2, ROT0, "Capcom", "Marvel Vs. Capcom 2 New Age of Heroes (JPN, USA, EUR, ASI, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0008 */ GAME( 2000, pstone2, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Power Stone 2 (JPN, USA, EUR, ASI, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0011 */ GAME( 2000, capsnk, naomi, naomim2, naomi, naomi, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 (JPN, USA, EXP, KOR, AUS) (Rev C)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0011 */ GAME( 2000, capsnka, capsnk, naomim2, naomi, naomi, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 (JPN, USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0012 */ GAME( 2000, cspike, naomi, naomim2, naomi, naomi, ROT0, "Psikyo / Capcom", "Gun Spike (JPN) / Cannon Spike (USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0013 */ GAME( 2000, ggx, naomi, naomim2, naomi, naomi, ROT0, "Arc System Works","Guilty Gear X (JPN)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0014 */ GAME( 2000, gwing2, naomi, naomim2, naomi, naomi, ROT0, "Takumi / Capcom", "Giga Wing 2 (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0015 */ GAME( 2000, pjustic, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Moero Justice Gakuen (JPN) / Project Justice (USA, EXP, KOR, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0016 */ GAME( 2000, deathcox, naomi, naomim2, naomi, naomi, ROT0, "Ecole Software", "Death Crimson OX (JPN, USA, EXP, KOR, AUS)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0017 */ GAME( 2001, gundmct, naomi, naomi, naomi, naomi, ROT0, "Banpresto", "Mobile Suit Gundam: Federation Vs. Zeon (2001-02-08)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0020 */ GAME( 2001, zerogu2, naomi, naomim2, naomi, naomi, ROT0, "Psikyo", "Zero Gunner 2", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 0057 */ GAME( 2007, sl2007, naomi, naomim4, naomi, naomi, ROT270, "Triangle Service", "Shooting Love 2007", GAME_FLAGS ) +/* 0058 */ GAME( 2008, ausfache, naomi, naomim4, naomi, naomi, ROT0, "Subtle Style", "Akatsuki Blitzkampf Ausf Achse", GAME_FLAGS ) +/* 0059 */ GAME( 2008, illvelo, naomi, naomim4, naomi, naomi, ROT270, "Milestone", "Illvelo (Illmatic Envelope)", GAME_FLAGS ) // 0060 Mamoru-kun wa Norowarete Shimatta! -/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi, ROT0, "Type-Moon/Ecole","Melty Blood Actress Again", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0061 */ GAME( 2008, mbaa, naomi, naomim4, naomi, naomi, ROT0, "Type-Moon/Ecole","Melty Blood Actress Again", GAME_FLAGS ) // 0061 Melty Blood Actress Again (Rev A - original is rev 0) -// 0062 Radilgy Noar -/* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (JPN, USA, EUR, ASI, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +// 0062 Radirgy Noa +/* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (JPN, USA, EUR, ASI, AUS) (Rev A)", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) /* Cart games on Namco custom ROM board */ -/* 25209801 */ GAME( 2000, wldkicks, naomi, naomim2, naomi, naomi, ROT0, "Capcom / Namco", "World Kicks", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -// 25349801 Shin Nihon Prowrestling Toukon Retsuden 4 Arcade Edition +/* 25209801 */ GAME( 2000, wldkicks, naomi, naomim2, naomi, naomi, ROT0, "Capcom / Namco", "World Kicks", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) +/* 25349801 */ GAME( 2000, toukon4, naomi, naomim2, naomi, naomi, ROT0, "Capcom / Namco", "Shin Nihon Pro Wrestling Toukon Retsuden 4 Arcade Edition", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 25469801 Ninja Assault -/* 25709801 */ GAME( 2001, gunsur2, naomi, naomi, naomi, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica", GAME_UNEMULATED_PROTECTION|GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 25709801 */ GAME( 2001, gunsur2, naomi, naomi, naomi, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica", GAME_UNEMULATED_PROTECTION|GAME_FLAGS ) // 25869812 Mazan : Flash of the Blade /* GDS-xxxx (Sega GD-ROM games) */ -/* 0001 */ GAME( 2000, confmiss, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "Confidential Mission (GDS-0001)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0001 */ GAME( 2000, confmiss, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "Confidential Mission (GDS-0001)", GAME_FLAGS ) // 0002 Shakatto Tambourine -/* 0003 */ GAME( 2000, sprtjam, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Sports Jam (GDS-0003)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0004 */ GAME( 2000, slashout, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Slashout (GDS-0004)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0005 */ GAME( 2001, spkrbtl, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Spikers Battle (GDS-0005)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0006 */ GAME( 2001, vstrik3, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (GDS-0006)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0003 */ GAME( 2000, sprtjam, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Sports Jam (GDS-0003)", GAME_FLAGS ) +/* 0004 */ GAME( 2000, slashout, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Slashout (GDS-0004)", GAME_FLAGS ) +/* 0005 */ GAME( 2001, spkrbtl, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Spikers Battle (GDS-0005)", GAME_FLAGS ) +/* 0006 */ GAME( 2001, vstrik3, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Striker 3 (GDS-0006)", GAME_FLAGS ) // 0007 Shakatto Tambourine Motto Norinori Shinkyoku Tsuika -/* 0008 */ GAME( 2001, monkeyba, naomigd, naomigd, monkeyba, naomigd, ROT0, "Sega", "Monkey Ball (GDS-0008)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0008 */ GAME( 2001, monkeyba, naomigd, naomigd, monkeyba, naomigd, ROT0, "Sega", "Monkey Ball (GDS-0008)", GAME_FLAGS ) // 0009 Dynamic Golf / Virtua Golf -/* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Dynamic Golf / Virtua Golf (Rev A) (GDS-0009A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomigd, ROT0, "Sega", "Super Major League / World Series Baseball (GDS-0010)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0012 */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Dynamic Golf / Virtua Golf (Rev A) (GDS-0009A)", GAME_FLAGS ) +/* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomigd, ROT0, "Sega", "Super Major League / World Series Baseball (GDS-0010)", GAME_FLAGS ) +/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS ) +/* 0012 */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS ) // 0012A Virtua Fighter 4 (Rev A) -/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0012C */ GAME( 2001, vf4c, vf4, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev C) (GDS-0012C)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -// 0013 -/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS ) +/* 0012C */ GAME( 2001, vf4c, vf4, naomi2gd, naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev C) (GDS-0012C)", GAME_FLAGS ) +// 0013 Shakatto Tambourine 2K1 SPR (PIC: 253-5508-0315) +/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS ) // 0015 Virtua Tennis 2 / Power Smash 2 -/* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (GDS-0016)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0017 */ GAME( 2001, keyboard, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "La Keyboard (GDS-0017)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0018 */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "Lupin The Third - The Shooting (GDS-0018)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_FLAGS ) +/* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (GDS-0016)", GAME_FLAGS ) +/* 0017 */ GAME( 2001, keyboard, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "La Keyboard (GDS-0017)", GAME_FLAGS ) +/* 0018 */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "Lupin The Third - The Shooting (GDS-0018)", GAME_FLAGS ) // 0018A Lupin The Third - The Shooting (Rev A) -/* 0019 */ GAME( 2002, vathlete, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0019 */ GAME( 2002, vathlete, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_FLAGS ) // 0020 Initial D Arcade Stage // 0020A Initial D Arcade Stage (Rev A) -/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS ) // 0021 Lupin The Third - The Typing -/* 0021A */ GAME( 2002, luptype, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0021A */ GAME( 2002, luptype, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_FLAGS ) +/* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_FLAGS ) // 0023 Naomi DIMM Firmware Updater -/* 0023A */ GAME( 2001, ngdup23a, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Naomi DIMM Firmware Updater (Rev A) (GDS-0023A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0023A */ GAME( 2001, ngdup23a, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Naomi DIMM Firmware Updater (Rev A) (GDS-0023A)", GAME_FLAGS ) // 0023B Naomi DIMM Firmware Updater (Rev B) -/* 0023C */ GAME( 2001, ngdup23c, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Naomi DIMM Firmware Updater (Rev C) (GDS-0023C)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0023C */ GAME( 2001, ngdup23c, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Naomi DIMM Firmware Updater (Rev C) (GDS-0023C)", GAME_FLAGS ) // 0023D Naomi DIMM Firmware Updater (Rev D) // 0023E Naomi DIMM Firmware Updater (Rev E) // 0024 Virtua Fighter 4 Evolution -/* 0024A */ GAME( 2002, vf4evoa, vf4evo, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Rev A) (GDS-0024A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0024B */ GAME( 2002, vf4evo, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Rev B) (GDS-0024B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0025 */ GAME( 2002, initdexp, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0026 */ GAME( 2002, initdv2jo, initdv2j, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0024A */ GAME( 2002, vf4evoa, vf4evo, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Rev A) (GDS-0024A)", GAME_FLAGS ) +/* 0024B */ GAME( 2002, vf4evo, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Rev B) (GDS-0024B)", GAME_FLAGS ) +/* 0025 */ GAME( 2002, initdexp, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS ) +/* 0026 */ GAME( 2002, initdv2jo, initdv2j, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS ) // 0026A Initial D Arcade Stage Ver. 2 (Japan) (Rev A) -/* 0026B */ GAME( 2002, initdv2j, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev. B) (GDS-0026B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0027 */ GAME( 2002, initdv2e, initdv2j, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0026B */ GAME( 2002, initdv2j, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev. B) (GDS-0026B)", GAME_FLAGS ) +/* 0027 */ GAME( 2002, initdv2e, initdv2j, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS ) // 0028 // 0029 Club Kart Cycraft Edition // 0030 -/* 0031 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Puyo Puyo Fever (GDS-0031)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0031 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomigd, ROT0, "Sega", "Puyo Puyo Fever (GDS-0031)", GAME_FLAGS ) // 0032 Initial D Arcade Stage Ver. 3 (Japan) // 0032A Initial D Arcade Stage Ver. 3 (Japan) (Rev A) -/* 0032B */ GAME( 2004, initdv3jb, initdv3j, naomigd, naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev. B) (GDS-0032B)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev. C) (GDS-0032C)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0032B */ GAME( 2004, initdv3jb, initdv3j, naomigd, naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev. B) (GDS-0032B)", GAME_FLAGS ) +/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev. C) (GDS-0032C)", GAME_FLAGS ) // 0033 Initial D Arcade Stage Ver. 3 (Export) // 0034 // 0035 // 0036 Virtua Fighter 4 Final Tuned -/* 0036A */ GAME( 2004, vf4tuneda, vf4tuned, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev A) (GDS-0036A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0036A */ GAME( 2004, vf4tuneda, vf4tuned, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev A) (GDS-0036A)", GAME_FLAGS ) /* 0036B */ /* 0036C */ -/* 0036D */ GAME( 2004, vf4tunedd, vf4tuned, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev D) (GDS-0036D)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0036D */ GAME( 2004, vf4tunedd, vf4tuned, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev D) (GDS-0036D)", GAME_FLAGS ) /* 0036E */ -/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev F) (GDS-0036F)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd,naomi, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Rev F) (GDS-0036F)", GAME_FLAGS ) // 0037? Puyo Puyo Fever (Export) // 0038 // 0039 Initial D: Arcade Stage Ver. 3 Cycraft Edition @@ -7827,86 +7931,86 @@ // 00?? World Club Champion Football Serie A 2001-2002 /* GDL-xxxx ("licensed by Sega" GD-ROM games) */ -/* 0001 */ GAME( 2001, gundmgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / Banpresto", "Mobile Suit Gundam: Federation Vs. Zeon (GDL-0001)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0002 */ GAME( 2001, sfz3ugd, naomigd, naomigd, naomi, sfz3ugd, ROT0, "Capcom", "Street Fighter Zero 3 Upper (GDL-0002)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0001 */ GAME( 2001, gundmgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / Banpresto", "Mobile Suit Gundam: Federation Vs. Zeon (GDL-0001)", GAME_FLAGS ) +/* 0002 */ GAME( 2001, sfz3ugd, naomigd, naomigd, naomi, sfz3ugd, ROT0, "Capcom", "Street Fighter Zero 3 Upper (GDL-0002)", GAME_FLAGS ) // 0003 -/* 0004 */ GAME( 2001, cvsgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 Pro (GDL-0004)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0004 */ GAME( 2001, cvsgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK Millennium Fight 2000 Pro (GDL-0004)", GAME_FLAGS ) /* 0005 */ GAME( 2001, starseek, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Doki Doki Idol Star Seeker (GDL-0005)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -/* 0006 */ GAME( 2001, gundmxgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom", "Mobile Suit Gundam: Federation Vs. Zeon DX (GDL-0006)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0006 */ GAME( 2001, gundmxgd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom", "Mobile Suit Gundam: Federation Vs. Zeon DX (GDL-0006)", GAME_FLAGS ) // 0007 Capcom Vs. SNK 2 -/* 0007A */ GAME( 2001, cvs2gd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Rev A) (GDL-0007A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0007A */ GAME( 2001, cvs2gd, naomigd, naomigd, naomi, naomigd, ROT0, "Capcom / SNK", "Capcom Vs. SNK 2 Millionaire Fighting 2001 (Rev A) (GDL-0007A)", GAME_FLAGS ) // 0008 Capcom Vs. SNK 2 Mark Of The Millennium 2001 (Export) // 0009 -/* 0010 */ GAME( 2001, ikaruga, naomigd, naomigd, naomi, naomigd, ROT270, "Treasure", "Ikaruga (GDL-0010)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0011 */ GAME( 2002, ggxx, naomigd, naomigd, naomi, ggxx, ROT0,"Arc System Works","Guilty Gear XX (GDL-0011)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomigd, ROT0, "Altron", "Cleopatra Fortune Plus (GDL-0012)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0013 */ GAME( 2002, moeru, naomigd, naomigd, naomi, naomigd, ROT0, "Altron", "Moeru Casinyo (GDL-0013)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0010 */ GAME( 2001, ikaruga, naomigd, naomigd, naomi, naomigd, ROT270, "Treasure", "Ikaruga (GDL-0010)", GAME_FLAGS ) +/* 0011 */ GAME( 2002, ggxx, naomigd, naomigd, naomi, ggxx, ROT0,"Arc System Works","Guilty Gear XX (GDL-0011)", GAME_FLAGS ) +/* 0012 */ GAME( 2002, cleoftp, naomigd, naomigd, naomi, naomigd, ROT0, "Altron", "Cleopatra Fortune Plus (GDL-0012)", GAME_FLAGS ) +/* 0013 */ GAME( 2002, moeru, naomigd, naomigd, naomi, naomigd, ROT0, "Altron", "Moeru Casinyo (GDL-0013)", GAME_FLAGS ) // 0014 Musapey's Choco Marker -/* 0014A */ GAME( 2002, chocomk, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Musapey's Choco Marker (Rev A) (GDL-0014A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0014A */ GAME( 2002, chocomk, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Musapey's Choco Marker (Rev A) (GDL-0014A)", GAME_FLAGS ) // 0015 // 0016 Yonin Uchi Mahjong MJ -/* 0017 */ GAME( 2002, quizqgd, naomigd, naomigd, naomi, naomigd, ROT270, "Amedio (Taito license)", "Quiz Keitai Q mode (GDL-0017)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0018 */ GAME( 2002, azumanga, naomigd, naomigd, naomi, naomigd, ROT0, "Moss (Taito license)", "Azumanga Daioh Puzzle Bobble (GDL-0018)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0017 */ GAME( 2002, quizqgd, naomigd, naomigd, naomi, naomigd, ROT270, "Amedio (Taito license)", "Quiz Keitai Q mode (GDL-0017)", GAME_FLAGS ) +/* 0018 */ GAME( 2002, azumanga, naomigd, naomigd, naomi, naomigd, ROT0, "Moss (Taito license)", "Azumanga Daioh Puzzle Bobble (GDL-0018)", GAME_FLAGS ) // 0019 Guilty Gear XX #Reload -/* 0019A */ GAME( 2003, ggxxrl, naomigd, naomigd, naomi, ggxxrl, ROT0,"Arc System Works","Guilty Gear XX #Reload (Rev A) (GDL-0019A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0020 */ GAME( 2004, tetkiwam, naomigd, naomigd, naomi, naomigd, ROT0, "Success", "Tetris Kiwamemichi (GDL-0020)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0021 */ GAME( 2003, shikgam2, naomigd, naomigd, naomi, naomigd, ROT270, "Alfa System", "Shikigami No Shiro II / The Castle of Shikigami II (GDL-0021)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0022 */ GAME( 2003, usagiym, naomigd, naomigd, naomi_mp, naomigd_mp,ROT0, "Warashi / Mahjong Kobo / Taito", "Usagi - Yamashiro Mahjong Hen (GDL-0022)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0019A */ GAME( 2003, ggxxrl, naomigd, naomigd, naomi, ggxxrl, ROT0,"Arc System Works","Guilty Gear XX #Reload (Rev A) (GDL-0019A)", GAME_FLAGS ) +/* 0020 */ GAME( 2004, tetkiwam, naomigd, naomigd, naomi, naomigd, ROT0, "Success", "Tetris Kiwamemichi (GDL-0020)", GAME_FLAGS ) +/* 0021 */ GAME( 2003, shikgam2, naomigd, naomigd, naomi, naomigd, ROT270, "Alfa System", "Shikigami No Shiro II / The Castle of Shikigami II (GDL-0021)", GAME_FLAGS ) +/* 0022 */ GAME( 2003, usagiym, naomigd, naomigd, naomi_mp, naomigd_mp,ROT0, "Warashi / Mahjong Kobo / Taito", "Usagi - Yamashiro Mahjong Hen (GDL-0022)", GAME_FLAGS ) // 0023 Border Down -/* 0023A */ GAME( 2003, bdrdown, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Border Down (Rev A) (GDL-0023A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0024 */ GAME( 2003, psyvar2, naomigd, naomigd, naomi, naomigd, ROT270, "Success", "Psyvariar 2 - The Will To Fabricate (GDL-0024)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0025 */ GAME( 2004, cfield, naomigd, naomigd, naomi, naomigd, ROT0, "Able", "Chaos Field (GDL-0025)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0026 */ GAME( 2004, trizeal, naomigd, naomigd, naomi, naomigd, ROT270, "Taito", "Trizeal (GDL-0026)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0023A */ GAME( 2003, bdrdown, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Border Down (Rev A) (GDL-0023A)", GAME_FLAGS ) +/* 0024 */ GAME( 2003, psyvar2, naomigd, naomigd, naomi, naomigd, ROT270, "Success", "Psyvariar 2 - The Will To Fabricate (GDL-0024)", GAME_FLAGS ) +/* 0025 */ GAME( 2004, cfield, naomigd, naomigd, naomi, naomigd, ROT0, "Able", "Chaos Field (GDL-0025)", GAME_FLAGS ) +/* 0026 */ GAME( 2004, trizeal, naomigd, naomigd, naomi, naomigd, ROT270, "Taito", "Trizeal (GDL-0026)", GAME_FLAGS ) // 0027 Melty Blood Act Cadenza? // 0028 Melty Blood Act Cadenza // 0028A Melty Blood Act Cadenza (Rev A) // 0028B Melty Blood Act Cadenza (Rev B) -/* 0028C */ GAME( 2005, meltybld, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza (Rev C) (GDL-0028C)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0028C */ GAME( 2005, meltybld, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza (Rev C) (GDL-0028C)", GAME_FLAGS ) // 0029 -/* 0030 */ GAME( 2005, senkoo, senko, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde (GDL-0030)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0030A */ GAME( 2005, senko, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde (Rev A) (GDL-0030A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0031 */ GAME( 2005, ss2005, naomigd, naomigd, naomi, naomigd, ROT0, "Starfish", "Super Shanghai 2005 (GDL-0031)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0031A */ GAME( 2005, ss2005a, ss2005, naomigd, naomi, naomigd, ROT0, "Starfish", "Super Shanghai 2005 (Rev A) (GDL-0031A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0032 */ GAME( 2005, radirgy, naomigd, naomigd, naomi, naomigd, ROT270, "Milestone", "Radirgy (GDL-0032)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0030 */ GAME( 2005, senkoo, senko, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde (GDL-0030)", GAME_FLAGS ) +/* 0030A */ GAME( 2005, senko, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde (Rev A) (GDL-0030A)", GAME_FLAGS ) +/* 0031 */ GAME( 2005, ss2005, naomigd, naomigd, naomi, naomigd, ROT0, "Starfish", "Super Shanghai 2005 (GDL-0031)", GAME_FLAGS ) +/* 0031A */ GAME( 2005, ss2005a, ss2005, naomigd, naomi, naomigd, ROT0, "Starfish", "Super Shanghai 2005 (Rev A) (GDL-0031A)", GAME_FLAGS ) +/* 0032 */ GAME( 2005, radirgy, naomigd, naomigd, naomi, naomigd, ROT270, "Milestone", "Radirgy (GDL-0032)", GAME_FLAGS ) // 0032A Radirgy (Rev A) // 0033 Guilty Gear XX Slash -/* 0033A */ GAME( 2005, ggxxsla, naomigd, naomigd, naomi, ggxxsla, ROT0,"Arc System Works","Guilty Gear XX Slash (Rev A) (GDL-0033A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0034 */ GAME( 2006, kurucham, naomigd, naomigd, naomi, naomigd, ROT0, "Able", "Kurukuru Chameleon (GDL-0034)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0035 */ GAME( 2005, undefeat, naomigd, naomigd, naomi, naomigd, ROT270, "G-Rev", "Under Defeat (GDL-0035)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0033A */ GAME( 2005, ggxxsla, naomigd, naomigd, naomi, ggxxsla, ROT0,"Arc System Works","Guilty Gear XX Slash (Rev A) (GDL-0033A)", GAME_FLAGS ) +/* 0034 */ GAME( 2006, kurucham, naomigd, naomigd, naomi, naomigd, ROT0, "Able", "Kurukuru Chameleon (GDL-0034)", GAME_FLAGS ) +/* 0035 */ GAME( 2005, undefeat, naomigd, naomigd, naomi, naomigd, ROT270, "G-Rev", "Under Defeat (GDL-0035)", GAME_FLAGS ) // 0036 Trigger Heart Exelica -/* 0036A */ GAME( 2006, trgheart, naomigd, naomigd, naomi, naomigd, ROT270, "Warashi", "Trigger Heart Exelica (Rev A) (GDL-0036A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0037 */ GAME( 2006, jingystm, naomigd, naomigd, naomi, naomigd, ROT0, "Atrativa Japan", "Jingi Storm - The Arcade (GDL-0037)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0038 */ GAME( 2006, senkosp, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde Special (GDL-0038)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0039 */ GAME( 2006, meltyb, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza Ver B (GDL-0039)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0039A */ GAME( 2006, meltyba, meltyb, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza Ver B (Rev A) (GDL-0039A)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0040 */ GAME( 2006, karous, naomigd, naomigd, naomi, naomigd, ROT270, "Milestone", "Karous (GDL-0040)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0041 */ GAME( 2006, ggxxac, naomigd, naomigd, naomi, naomigd, ROT0,"Arc System Works","Guilty Gear XX Accent Core (GDL-0041)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -/* 0042 */ GAME( 2006, takoron, naomigd, naomigd, naomi, naomigd, ROT0, "Compile", "Noukone Puzzle Takoron (GDL-0042)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +/* 0036A */ GAME( 2006, trgheart, naomigd, naomigd, naomi, naomigd, ROT270, "Warashi", "Trigger Heart Exelica (Rev A) (GDL-0036A)", GAME_FLAGS ) +/* 0037 */ GAME( 2006, jingystm, naomigd, naomigd, naomi, naomigd, ROT0, "Atrativa Japan", "Jingi Storm - The Arcade (GDL-0037)", GAME_FLAGS ) +/* 0038 */ GAME( 2006, senkosp, naomigd, naomigd, naomi, naomigd, ROT0, "G-Rev", "Senko No Ronde Special (GDL-0038)", GAME_FLAGS ) +/* 0039 */ GAME( 2006, meltyb, naomigd, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza Ver B (GDL-0039)", GAME_FLAGS ) +/* 0039A */ GAME( 2006, meltyba, meltyb, naomigd, naomi, naomigd, ROT0, "Ecole Software", "Melty Blood Act Cadenza Ver B (Rev A) (GDL-0039A)", GAME_FLAGS ) +/* 0040 */ GAME( 2006, karous, naomigd, naomigd, naomi, naomigd, ROT270, "Milestone", "Karous (GDL-0040)", GAME_FLAGS ) +/* 0041 */ GAME( 2006, ggxxac, naomigd, naomigd, naomi, naomigd, ROT0,"Arc System Works","Guilty Gear XX Accent Core (GDL-0041)", GAME_FLAGS ) +/* 0042 */ GAME( 2006, takoron, naomigd, naomigd, naomi, naomigd, ROT0, "Compile", "Noukone Puzzle Takoron (GDL-0042)", GAME_FLAGS ) /* Atomiswave */ -GAME( 2001, awbios, 0, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Atomiswave Bios", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) +GAME( 2001, awbios, 0, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Atomiswave Bios", GAME_FLAGS|GAME_IS_BIOS_ROOT ) -GAME( 2002, maxspeed, awbios, aw1c, aw1w, atomiswave, ROT0, "Sammy", "Maximum Speed", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2002, sprtshot, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy USA", "Sports Shooting USA", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2003, ggx15, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Arc System Works", "Guilty Gear X ver. 1.5", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2003, demofist, awbios, aw2c, aw2c, atomiswave, ROT0, "Polygon Magic / Dimps", "Demolish Fist", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2003, dolphin, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Dolphin Blue", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2003, ggisuka, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Arc System Works", "Guilty Gear Isuka", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2004, dirtypig, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Dirty Pigskin Football", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2004, rumblef, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2004, rangrmsn, awbios, aw2c, aw1w, atomiswave, ROT0, "Sammy", "Ranger Mission", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2004, salmankt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Salary Man Kintarou", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2004, ftspeed, awbios, aw1c, aw1w, atomiswave, ROT0, "Sammy", "Faster Than Speed", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2004, kov7sprt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / IGS", "Knights of Valour - The Seven Spirits", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2005, vfurlong, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Net Select Keiba Victory Furlong", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2004, rumblef2, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, anmlbskt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Moss", "Animal Basket", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, ngbc, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "Neo-Geo Battle Coliseum", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, samsptk, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "Samurai Spirits Tenkaichi Kenkakuden", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, kofxi, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters XI", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, fotns, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega / Arc System Works", "Fist Of The North Star", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, kofnw, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, kofnwj, kofnw, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave (Japan)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2005, xtrmhunt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Extreme Hunting", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) -GAME( 2006, mslug6, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega / SNK Playmore", "Metal Slug 6", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) -GAME( 2006, xtrmhnt2, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega", "Extreme Hunting 2", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2002, maxspeed, awbios, aw1c, aw1w, atomiswave, ROT0, "Sammy", "Maximum Speed", GAME_FLAGS ) +GAME( 2002, sprtshot, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy USA", "Sports Shooting USA", GAME_FLAGS ) +GAME( 2003, ggx15, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Arc System Works", "Guilty Gear X ver. 1.5", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2003, demofist, awbios, aw2c, aw2c, atomiswave, ROT0, "Polygon Magic / Dimps", "Demolish Fist", GAME_FLAGS ) +GAME( 2003, dolphin, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Dolphin Blue", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2003, ggisuka, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Arc System Works", "Guilty Gear Isuka", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2004, dirtypig, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Dirty Pigskin Football", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2004, rumblef, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2004, rangrmsn, awbios, aw2c, aw1w, atomiswave, ROT0, "Sammy", "Ranger Mission", GAME_FLAGS ) +GAME( 2004, salmankt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Salary Man Kintarou", GAME_FLAGS ) +GAME( 2004, ftspeed, awbios, aw1c, aw1w, atomiswave, ROT0, "Sammy", "Faster Than Speed", GAME_FLAGS ) +GAME( 2004, kov7sprt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / IGS", "Knights of Valour - The Seven Spirits", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2005, vfurlong, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Net Select Keiba Victory Furlong", GAME_FLAGS ) +GAME( 2004, rumblef2, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2", GAME_FLAGS ) +GAME( 2005, anmlbskt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / Moss", "Animal Basket", GAME_FLAGS ) +GAME( 2005, ngbc, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "Neo-Geo Battle Coliseum", GAME_FLAGS ) +GAME( 2005, samsptk, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "Samurai Spirits Tenkaichi Kenkakuden", GAME_FLAGS ) +GAME( 2005, kofxi, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters XI", GAME_FLAGS ) +GAME( 2005, fotns, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega / Arc System Works", "Fist Of The North Star", GAME_FLAGS ) +GAME( 2005, kofnw, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave", GAME_FLAGS ) +GAME( 2005, kofnwj, kofnw, aw2c, aw2c, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave (Japan)", GAME_FLAGS ) +GAME( 2005, xtrmhunt, awbios, aw2c, aw2c, atomiswave, ROT0, "Sammy", "Extreme Hunting", GAME_FLAGS ) +GAME( 2006, mslug6, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega / SNK Playmore", "Metal Slug 6", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING ) +GAME( 2006, xtrmhnt2, awbios, aw2c, aw2c, atomiswave, ROT0, "Sega", "Extreme Hunting 2", GAME_FLAGS ) diff -Nru mame-0.144/src/mame/drivers/naughtyb.c mame-0.145/src/mame/drivers/naughtyb.c --- mame-0.144/src/mame/drivers/naughtyb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/naughtyb.c 2012-02-06 21:30:39.000000000 +0000 @@ -432,10 +432,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(naughtyb) + MCFG_SCREEN_UPDATE_STATIC(naughtyb) MCFG_GFXDECODE(naughtyb) MCFG_PALETTE_LENGTH(256) @@ -467,10 +466,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(naughtyb) + MCFG_SCREEN_UPDATE_STATIC(naughtyb) MCFG_GFXDECODE(naughtyb) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/nbmj8688.c mame-0.145/src/mame/drivers/nbmj8688.c --- mame-0.144/src/mame/drivers/nbmj8688.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/nbmj8688.c 2012-02-06 21:30:33.000000000 +0000 @@ -2929,10 +2929,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1) - MCFG_SCREEN_UPDATE(mbmj8688) + MCFG_SCREEN_UPDATE_STATIC(mbmj8688) MCFG_PALETTE_LENGTH(4096) @@ -2969,7 +2968,6 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_PALETTE_LENGTH(65536) MCFG_PALETTE_INIT(mbmj8688_16bit) @@ -3051,28 +3049,25 @@ MCFG_DEFAULT_LAYOUT(layout_nbmj8688) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 16, 240-1) - MCFG_SCREEN_UPDATE(mbmj8688) + MCFG_SCREEN_UPDATE_STATIC(mbmj8688) MCFG_SCREEN_ADD("lcd0", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(480, 64) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 64-1) - MCFG_SCREEN_UPDATE(mbmj8688_lcd0) + MCFG_SCREEN_UPDATE_STATIC(mbmj8688_lcd0) MCFG_SCREEN_ADD("lcd1", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(480, 64) MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 64-1) - MCFG_SCREEN_UPDATE(mbmj8688_lcd1) + MCFG_SCREEN_UPDATE_STATIC(mbmj8688_lcd1) MCFG_VIDEO_START(mbmj8688_pure_16bit_LCD) diff -Nru mame-0.144/src/mame/drivers/nbmj8891.c mame-0.145/src/mame/drivers/nbmj8891.c --- mame-0.144/src/mame/drivers/nbmj8891.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/nbmj8891.c 2012-02-06 21:30:33.000000000 +0000 @@ -2620,10 +2620,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 8, 248-1) - MCFG_SCREEN_UPDATE(nbmj8891) + MCFG_SCREEN_UPDATE_STATIC(nbmj8891) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/nbmj8900.c mame-0.145/src/mame/drivers/nbmj8900.c --- mame-0.144/src/mame/drivers/nbmj8900.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/nbmj8900.c 2012-02-06 21:30:33.000000000 +0000 @@ -330,10 +330,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 8, 248-1) - MCFG_SCREEN_UPDATE(nbmj8900) + MCFG_SCREEN_UPDATE_STATIC(nbmj8900) MCFG_PALETTE_LENGTH(256) MCFG_VIDEO_START(nbmj8900_2layer) diff -Nru mame-0.144/src/mame/drivers/nbmj8991.c mame-0.145/src/mame/drivers/nbmj8991.c --- mame-0.144/src/mame/drivers/nbmj8991.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/nbmj8991.c 2012-02-06 21:30:33.000000000 +0000 @@ -1489,10 +1489,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024, 512) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1) - MCFG_SCREEN_UPDATE(nbmj8991_type1) + MCFG_SCREEN_UPDATE_STATIC(nbmj8991_type1) MCFG_PALETTE_LENGTH(256) @@ -1527,10 +1526,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024, 512) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1) - MCFG_SCREEN_UPDATE(nbmj8991_type2) + MCFG_SCREEN_UPDATE_STATIC(nbmj8991_type2) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/nbmj9195.c mame-0.145/src/mame/drivers/nbmj9195.c --- mame-0.144/src/mame/drivers/nbmj9195.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/nbmj9195.c 2012-02-06 21:30:34.000000000 +0000 @@ -3108,10 +3108,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024, 512) /* no way this is correct */ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1) - MCFG_SCREEN_UPDATE(nbmj9195) + MCFG_SCREEN_UPDATE_STATIC(nbmj9195) MCFG_PALETTE_LENGTH(256) @@ -3149,7 +3148,7 @@ MCFG_VIDEO_START(nbmj9195_nb22090) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(nbmj9195) + MCFG_SCREEN_UPDATE_STATIC(nbmj9195) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/nemesis.c mame-0.145/src/mame/drivers/nemesis.c --- mame-0.144/src/mame/drivers/nemesis.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/nemesis.c 2012-02-06 21:30:36.000000000 +0000 @@ -40,7 +40,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "sound/2151intf.h" @@ -61,42 +60,44 @@ device_set_input_line(device, 1, HOLD_LINE); } -static INTERRUPT_GEN( konamigt_interrupt ) +static TIMER_DEVICE_CALLBACK( konamigt_interrupt ) { - nemesis_state *state = device->machine().driver_data(); + nemesis_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) == 0) + if(scanline == 240) { - if ((state->m_irq_on) && (state->m_gx400_irq1_cnt++ & 1)) - device_set_input_line(device, 1, HOLD_LINE); + if ((state->m_irq_on) && ((timer.machine().primary_screen->frame_number() & 1) == 0)) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); } - else + else if(scanline == 0) { if (state->m_irq2_on) - device_set_input_line(device, 2, HOLD_LINE); + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } } -static INTERRUPT_GEN( gx400_interrupt ) +static TIMER_DEVICE_CALLBACK( gx400_interrupt ) { - nemesis_state *state = device->machine().driver_data(); + nemesis_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + { + if ((state->m_irq_on) && ((timer.machine().primary_screen->frame_number() & 1) == 0)) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + } - switch (cpu_getiloops(device)) + if(scanline == 0) { - case 0: - if (state->m_irq2_on) - device_set_input_line(device, 2, HOLD_LINE); - break; - - case 1: - if ((state->m_irq1_on) && (state->m_gx400_irq1_cnt++ & 1)) - device_set_input_line(device, 1, HOLD_LINE); - break; - - case 2: - if (state->m_irq4_on) - device_set_input_line(device, 4, HOLD_LINE); - break; + if (state->m_irq2_on) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + } + + if(scanline == 120) + { + if (state->m_irq4_on) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } } @@ -676,46 +677,42 @@ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Version ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "Vs" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SW1) /* "None" = coin slot B disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "50k and every 100k" ) PORT_DIPSETTING( 0x10, "30k" ) PORT_DIPSETTING( 0x08, "50k" ) PORT_DIPSETTING( 0x00, "100k" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -723,12 +720,12 @@ PORT_INCLUDE( nemesis ) PORT_MODIFY("DSW1") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20k and every 70k" ) PORT_DIPSETTING( 0x10, "30k and every 80k" ) PORT_DIPSETTING( 0x08, "20k" ) @@ -760,49 +757,28 @@ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW1") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6") + PORT_BIT( 0x4f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x20, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xfa, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("PADDLE") PORT_BIT( 0x7f, 0x40, IPT_PADDLE ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) INPUT_PORTS_END @@ -832,49 +808,29 @@ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW1") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6") + PORT_BIT( 0x4f, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x20, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xfa, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("PADDLE") PORT_BIT( 0x7f, 0x40, IPT_PADDLE ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) INPUT_PORTS_END @@ -892,46 +848,40 @@ KONAMI8_B321(2) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Version ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "Vs" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30k 100k 200k 400k" ) PORT_DIPSETTING( 0x10, "40k 120k 240k 480k" ) PORT_DIPSETTING( 0x08, "50k 150k 300k 600k" ) PORT_DIPSETTING( 0x00, "100k 200k 400k 800k" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -945,46 +895,40 @@ PORT_START("IN2") KONAMI8_B12_UNK(2) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Version ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "Vs" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20k 100k" ) PORT_DIPSETTING( 0x10, "30k 120k" ) PORT_DIPSETTING( 0x08, "40k 140k" ) PORT_DIPSETTING( 0x00, "50k 160k" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -993,53 +937,49 @@ KONAMI8_SYSTEM_UNK PORT_START("IN1") - KONAMI8_B132(1) // button1 = power-up, button3 = shoot, button2 = missile + KONAMI8_B132(1) // button1 = power-up, button3 = shoot, button2 = missile PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("IN2") KONAMI8_B132(2) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Version ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "Vs" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SW1) /* "None" = coin slot B disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20k and every 70k" ) PORT_DIPSETTING( 0x10, "30k and every 80k" ) PORT_DIPSETTING( 0x08, "20k only" ) PORT_DIPSETTING( 0x00, "30k only" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") + PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -1050,13 +990,11 @@ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWT:3" ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) @@ -1066,7 +1004,7 @@ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWT:4") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) @@ -1081,7 +1019,7 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("DSW0") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW0:1,2,3,4") + PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2,3,4") PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) @@ -1098,39 +1036,28 @@ PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x00, "Disabled" ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW0:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW0:6") - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW0:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW0:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, "Coin Slot(s)" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x00, "Coin Slot(s)" ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x04, "1" ) PORT_DIPSETTING( 0x00, "2" ) - PORT_DIPNAME( 0x18, 0x00, "Max Credit(s)" ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x00, "Max Credit(s)" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "1" ) PORT_DIPSETTING( 0x10, "3" ) PORT_DIPSETTING( 0x08, "5" ) PORT_DIPSETTING( 0x00, "9" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -1143,13 +1070,11 @@ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWT:3" ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) @@ -1159,7 +1084,7 @@ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // power-up PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // shoot PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // missile - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWT:3") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) @@ -1174,29 +1099,29 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("DSW0") - KONAMI_COINAGE_LOC("Invalid", "Invalid", SW0) + KONAMI_COINAGE_LOC("Invalid", "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x04, 0x00, "Coin Slot(s)" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x00, "Coin Slot(s)" ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x04, "1" ) PORT_DIPSETTING( 0x00, "2" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "70k and every 200k" ) PORT_DIPSETTING( 0x10, "100k and every 300k" ) PORT_DIPSETTING( 0x08, "70k only" ) PORT_DIPSETTING( 0x00, "100k only" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -1208,10 +1133,10 @@ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0x80, "Continue" ) PORT_DIPLOCATION("SWT:2,3") + PORT_DIPNAME( 0xc0, 0x80, "Continue" ) PORT_DIPLOCATION("SW3:2,3") PORT_DIPSETTING( 0xc0, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, "2 Areas" ) PORT_DIPSETTING( 0x40, "3 Areas" ) @@ -1225,7 +1150,7 @@ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWT:3" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:4" ) PORT_START("IN2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) @@ -1238,29 +1163,29 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SW0) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( None ), SW1) /* "None" = coin slot B disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "50k 100k" ) PORT_DIPSETTING( 0x10, "20k 50k" ) PORT_DIPSETTING( 0x08, "30k 70k" ) PORT_DIPSETTING( 0x00, "80k 150k" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -1268,17 +1193,17 @@ static INPUT_PORTS_START( citybomb ) PORT_START("IN0") KONAMI8_SYSTEM_10 - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Upright Control" ) PORT_DIPLOCATION("SWT:2") + PORT_DIPNAME( 0x40, 0x40, "Upright Control" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x40, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWT:3" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("IN1") KONAMI8_B123(1) - PORT_DIPNAME( 0x80, 0x80, "Device Type" ) PORT_DIPLOCATION("SWT:4") + PORT_DIPNAME( 0x80, 0x80, "Device Type" ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x00, "Handle" ) PORT_DIPSETTING( 0x80, DEF_STR( Joystick ) ) @@ -1286,24 +1211,26 @@ KONAMI8_B123_UNK(2) PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW0) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" ) + PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW2:2" ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x10, "Qualify" ) PORT_DIPLOCATION("SW1:2,3") + PORT_DIPNAME( 0x18, 0x10, "Qualify" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "Long" ) PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x08, "Short" ) PORT_DIPSETTING( 0x00, "Very Short" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:4,5") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -1318,11 +1245,11 @@ static INPUT_PORTS_START( nyanpani ) PORT_START("IN0") KONAMI8_SYSTEM_10 - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWT:2" ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("IN1") KONAMI8_B123_UNK(1) @@ -1331,21 +1258,21 @@ KONAMI8_B123_UNK(2) PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW0) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:3,4") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:5") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -1366,7 +1293,7 @@ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CONDITION("DSW1", 0x03, PORTCOND_EQUALS, 0x02) // only in WEC Le Mans 24 cabinets - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x03, PORTCOND_NOTEQUALS, 0x02) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_CONDITION("DSW1", 0x03, PORTCOND_NOTEQUALS, 0x02) // player 2? PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) // must be 0 otherwise game freezes when using WEC Le Mans 24 cabinet PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) @@ -1375,58 +1302,39 @@ PORT_START("IN2") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_START("TEST") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SWT:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Quantity of Initials" ) PORT_DIPLOCATION("SWT:2") - PORT_DIPSETTING( 0x00, "3" ) - PORT_DIPSETTING( 0x02, "7" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SWT:3" ) - PORT_DIPNAME( 0x08, 0x08, "Speed Unit" ) PORT_DIPLOCATION("SWT:4") - PORT_DIPSETTING( 0x08, "km/h" ) - PORT_DIPSETTING( 0x00, "M.P.H." ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:6") - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SWT:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("DSW0") - KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SWA) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:1,2") + PORT_DIPNAME( 0x03, 0x01, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "Konami GT without brake" ) PORT_DIPSETTING( 0x02, "WEC Le Mans 24 Upright" ) PORT_DIPSETTING( 0x01, "Konami GT with brake" ) // 0x00 WEC Le Mans 24 Upright again - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:6,7") + PORT_BIT( 0x1c, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("TEST") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "Quantity of Initials" ) PORT_DIPLOCATION("SW3:2") + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x02, "7" ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x08, 0x08, "Speed Unit" ) PORT_DIPLOCATION("SW3:4") + PORT_DIPSETTING( 0x08, "km/h" ) + PORT_DIPSETTING( 0x00, "M.P.H." ) + PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + /* Konami GT specific control */ PORT_START("PADDLE") PORT_BIT( 0x7f, 0x40, IPT_PADDLE ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) @@ -1701,10 +1609,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* ??? */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1735,7 +1642,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,18432000/2) /* 9.216MHz */ MCFG_CPU_PROGRAM_MAP(gx400_map) - MCFG_CPU_VBLANK_INT_HACK(gx400_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", gx400_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(gx400_sound_map) @@ -1748,10 +1655,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1782,7 +1688,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,18432000/2) /* 9.216 MHz? */ MCFG_CPU_PROGRAM_MAP(konamigt_map) - MCFG_CPU_VBLANK_INT_HACK(konamigt_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", konamigt_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -1794,10 +1700,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1825,7 +1730,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,18432000/2) /* 9.216MHz */ MCFG_CPU_PROGRAM_MAP(rf2_gx400_map) - MCFG_CPU_VBLANK_INT_HACK(gx400_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", gx400_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(gx400_sound_map) @@ -1838,10 +1743,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1886,10 +1790,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC((264-256)*125/2)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1900,20 +1803,20 @@ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("vlm", VLM5030, 3579545) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 2.50) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 2.50) MCFG_SOUND_ADD("k007232", K007232, 3579545) MCFG_SOUND_CONFIG(k007232_config) - MCFG_SOUND_ROUTE(0, "lspeaker", 0.10) - MCFG_SOUND_ROUTE(0, "rspeaker", 0.10) - MCFG_SOUND_ROUTE(1, "lspeaker", 0.10) - MCFG_SOUND_ROUTE(1, "rspeaker", 0.10) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.08) + MCFG_SOUND_ROUTE(0, "rspeaker", 0.08) + MCFG_SOUND_ROUTE(1, "lspeaker", 0.08) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.08) MCFG_SOUND_ADD("ymsnd", YM2151, 3579545) MCFG_SOUND_CONFIG(ym2151_config) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + MCFG_SOUND_ROUTE(0, "rspeaker", 1.2) // reversed according to MT #4565 + MCFG_SOUND_ROUTE(1, "lspeaker", 1.2) MACHINE_CONFIG_END @@ -1936,10 +1839,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -1982,10 +1884,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -2032,10 +1933,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -2068,7 +1968,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,18432000/3) /* 6.144MHz */ MCFG_CPU_PROGRAM_MAP(hcrash_map) - MCFG_CPU_VBLANK_INT_HACK(konamigt_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", konamigt_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ MCFG_CPU_PROGRAM_MAP(sal_sound_map) @@ -2080,10 +1980,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) @@ -2817,7 +2716,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,18432000/2) /* 9.216MHz */ MCFG_CPU_PROGRAM_MAP(gx400_map) - MCFG_CPU_VBLANK_INT_HACK(gx400_interrupt,3) +// MCFG_TIMER_ADD_SCANLINE("scantimer", gx400_interrupt, "screen", 0, 1) MCFG_DEVICE_DISABLE() MCFG_CPU_ADD("audiocpu", Z80,14318180/4) /* 3.579545 MHz */ @@ -2831,10 +2730,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((18432000.0/4)/(288*264)) /* 60.606060 Hz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nemesis) + MCFG_SCREEN_UPDATE_STATIC(nemesis) MCFG_GFXDECODE(nemesis) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/neodrvr.c mame-0.145/src/mame/drivers/neodrvr.c --- mame-0.144/src/mame/drivers/neodrvr.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/neodrvr.c 2012-02-06 21:30:39.000000000 +0000 @@ -811,6 +811,7 @@ /* About supported sets: + ===================== MVS carts (arcade) were released before the AES carts (home) The actual codepath taken depends entirely on the BIOS rom, not the roms in the cartridge, which (with @@ -834,6 +835,7 @@ M1 (sound driver) rom information: + ================================== . Many 'M1' roms contain mirrored data (64k mirrored or 128k mirrored). . Found on several early sets (ID 0001 ~ 0045) and on the last sets (ID 0267 ~ 0272). . This caused some confusion and incorrect rom sizes. @@ -842,11 +844,13 @@ S1 (text layer) rom information: + ================================ . All 'S1' roms found on prom are 1mbit. . The remainig 64k 'S1' are marked BAD_DUMP. MULTI PLAY MODE: + ================ The NeoGeo has three games which support MULTI PLAY MODE (Riding Hero / League Bowling / Trash Rally). This allows you to 'link' 4 games (MVS) / 2 games (AES) using in game 'Multi-Play' option. To establish a link between the carts you have to connect the carts to each other by a communicator cable. The communicatior @@ -866,6 +870,42 @@ CABINET 3: ON OFF ON CABINET 4: ON ON ON + + SPHERO SYMPHONY: + ================ + Several early games have a 'feature' called "sphero symphony". None of the games featuring "sphero symphony" + uses special hardware. It is something sound based, but what exactly it is (specially arragend samples, + FM synthesis etc.) is unknown. The AES and MVS releases share the same sound data and driver. + + The AES game-inserts and manuals have an eye-shaped logo with the following text (not to be found on MVS sets): + sphero + symphony + STEREOPHONIC SOUND + + Experience this "LIVE" 3 dimensional sound coming from all around you. + + Games featuring "sphero symphony": + ID-0006 - Riding Hero + ID-0007 - Alpha Mission II / ASO II - Last Guardian + ID-0009 - Ninja Combat + ID-0010 - Cyber-Lip + ID-0011 - The Super Spy + ID-0014 - Mutation Nation + ID-0017 - Sengoku / Sengoku Denshou + ID-0018 - Burning Fight + ID-0020 - Ghost Pilots + ID-0024 - Last Resort + ID-0031 - Soccer Brawl + ID-0033 - Fatal Fury - King of Fighters / Garou Densetsu - shukumei no tatakai + ID-0034 - Football Frenzy + ID-0037 - Crossed Swords + ID-0038 - Thrash Rally + ID-0039 - King of the Monsters 2 - The Next Thing + ID-0041 - Baseball Stars 2 + ID-0044 - Art of Fighting / Ryuuko no Ken + ID-0047 - Fatal Fury 2 / Garou Densetsu 2 - arata-naru tatakai + ID-0049 - Andro Dunos + */ @@ -1214,34 +1254,33 @@ ROM_START( alpham2p ) /* early prototype - all roms were hand labeled with CRCs, dumps verified against them */ ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "proto_007-p1.bin", 0x000001, 0x080000, CRC(c763e52a) SHA1(b24acbac255c5ee1a2e92e77cdde6620a24081cf) ) - ROM_LOAD16_BYTE( "proto_007-p2.bin", 0x000000, 0x080000, CRC(7a0b435c) SHA1(40e6f42a92001d9f4e51898dd7489da143b6b74b) ) + ROM_LOAD16_BYTE( "proto_007-p1.p1", 0x000001, 0x080000, CRC(c763e52a) SHA1(b24acbac255c5ee1a2e92e77cdde6620a24081cf) ) + ROM_LOAD16_BYTE( "proto_007-p2.p2", 0x000000, 0x080000, CRC(7a0b435c) SHA1(40e6f42a92001d9f4e51898dd7489da143b6b74b) ) - NEO_SFIX_128K( "proto_007-s1.bin", CRC(efc9ae2e) SHA1(a594826b0082fe5a13191673e8d9aa42517230f5) ) + NEO_SFIX_128K( "proto_007-s1.s1", CRC(efc9ae2e) SHA1(a594826b0082fe5a13191673e8d9aa42517230f5) ) - NEO_BIOS_AUDIO_128K( "proto_007-m1.bin", CRC(5976b464) SHA1(ec824567ecc3579f6d86c9d9385710cbaeef16a3) ) + NEO_BIOS_AUDIO_128K( "proto_007-m1.m1", CRC(5976b464) SHA1(ec824567ecc3579f6d86c9d9385710cbaeef16a3) ) ROM_REGION( 0x200000, "ymsnd", 0 ) - ROM_LOAD( "proto_007-v11.bin", 0x000000, 0x080000, CRC(18eaa9e1) SHA1(85c94d8660f8a32e4ca8e015f0bd704208482d68) ) - ROM_LOAD( "proto_007-v12.bin", 0x080000, 0x080000, CRC(2487d495) SHA1(49af3c4dc6a38c5158d3641fd8f9a40041b42aa6) ) - ROM_LOAD( "proto_007-v13.bin", 0x100000, 0x080000, CRC(25e60f25) SHA1(d06b0df872372de38fcf90187195070ac5f8c651) ) - ROM_LOAD( "proto_007-v21.bin", 0x180000, 0x080000, CRC(ac44b75a) SHA1(7399a05cd4e2c7ecde4a7323d3e189255afe5fc2) ) + ROM_LOAD( "proto_007-v11.v11", 0x000000, 0x080000, CRC(18eaa9e1) SHA1(85c94d8660f8a32e4ca8e015f0bd704208482d68) ) + ROM_LOAD( "proto_007-v12.v12", 0x080000, 0x080000, CRC(2487d495) SHA1(49af3c4dc6a38c5158d3641fd8f9a40041b42aa6) ) + ROM_LOAD( "proto_007-v13.v13", 0x100000, 0x080000, CRC(25e60f25) SHA1(d06b0df872372de38fcf90187195070ac5f8c651) ) + ROM_LOAD( "proto_007-v21.v21", 0x180000, 0x080000, CRC(ac44b75a) SHA1(7399a05cd4e2c7ecde4a7323d3e189255afe5fc2) ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) ROM_COPY( "ymsnd", 0x180000, 0x00000, 0x80000 ) ROM_REGION( 0x400000, "sprites", 0 ) // note, ROM_LOAD32_BYTE - ROM_LOAD32_BYTE( "proto_007-c1.bin", 0x000000, 0x80000, CRC(24841639) SHA1(fcc2a349121dad86ffefc44b9f0e8ba616ce0d30) ) - ROM_LOAD32_BYTE( "proto_007-c2.bin", 0x000002, 0x80000, CRC(912763ab) SHA1(cedf26d7d85ad140399ee62813c71f35e65498d6) ) - ROM_LOAD32_BYTE( "proto_007-c3.bin", 0x000001, 0x80000, CRC(0743bde2) SHA1(0d13ad6333909ad3cf10f9ac360f9abf191318de) ) - ROM_LOAD32_BYTE( "proto_007-c4.bin", 0x000003, 0x80000, CRC(61240212) SHA1(dee36f6604adaeb96e0d761a7256241c066b1cd2) ) - ROM_LOAD32_BYTE( "proto_007-c5.bin", 0x200000, 0x80000, CRC(cf9f4c53) SHA1(f979c85f83d9f76e554c2617f85f6d4efca6799c) ) - ROM_LOAD32_BYTE( "proto_007-c6.bin", 0x200002, 0x80000, CRC(3d903b19) SHA1(001a8c762336b855fe1df69fe2e605d30a3f00a1) ) - ROM_LOAD32_BYTE( "proto_007-c7.bin", 0x200001, 0x80000, CRC(e41e3875) SHA1(730aceb8a66cb33d0194b096568f053ad7dc000a) ) - ROM_LOAD32_BYTE( "proto_007-c8.bin", 0x200003, 0x80000, CRC(4483e2cf) SHA1(47c3364f5c36ae9dc3a49fe37ca60bcee0e73314) ) + ROM_LOAD32_BYTE( "proto_007-c1.c1", 0x000000, 0x80000, CRC(24841639) SHA1(fcc2a349121dad86ffefc44b9f0e8ba616ce0d30) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_007-c2.c2", 0x000002, 0x80000, CRC(912763ab) SHA1(cedf26d7d85ad140399ee62813c71f35e65498d6) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_007-c3.c3", 0x000001, 0x80000, CRC(0743bde2) SHA1(0d13ad6333909ad3cf10f9ac360f9abf191318de) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_007-c4.c4", 0x000003, 0x80000, CRC(61240212) SHA1(dee36f6604adaeb96e0d761a7256241c066b1cd2) ) /* Plane 3 */ + ROM_LOAD32_BYTE( "proto_007-c5.c5", 0x200000, 0x80000, CRC(cf9f4c53) SHA1(f979c85f83d9f76e554c2617f85f6d4efca6799c) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_007-c6.c6", 0x200002, 0x80000, CRC(3d903b19) SHA1(001a8c762336b855fe1df69fe2e605d30a3f00a1) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_007-c7.c7", 0x200001, 0x80000, CRC(e41e3875) SHA1(730aceb8a66cb33d0194b096568f053ad7dc000a) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_007-c8.c8", 0x200003, 0x80000, CRC(4483e2cf) SHA1(47c3364f5c36ae9dc3a49fe37ca60bcee0e73314) ) /* Plane 3 */ ROM_END - /**************************************** ID-0008 Sunshine (prototype) 1990 SNK @@ -1573,30 +1612,30 @@ ROM_START( burningfp ) /* early prototype - all roms were hand labeled with CRCs, dumps verified against them */ ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "proto_018.p1", 0x000001, 0x080000, CRC(5b4032e7) SHA1(55df91dad6f484d3d49c28ab5972700bf71a8662) ) - ROM_LOAD16_BYTE( "proto_018.p2", 0x000000, 0x080000, CRC(78762f68) SHA1(12170fc6efe75cb5d32624033d3d341032c97548) ) + ROM_LOAD16_BYTE( "proto_018-p1.p1", 0x000001, 0x080000, CRC(5b4032e7) SHA1(55df91dad6f484d3d49c28ab5972700bf71a8662) ) + ROM_LOAD16_BYTE( "proto_018-p2.p2", 0x000000, 0x080000, CRC(78762f68) SHA1(12170fc6efe75cb5d32624033d3d341032c97548) ) - NEO_SFIX_128K( "proto_018.s1", CRC(f3d130e8) SHA1(2fdeb93f4bb2a60d391cac2822be41661b1e1795) ) + NEO_SFIX_128K( "proto_018-s1.s1", CRC(f3d130e8) SHA1(2fdeb93f4bb2a60d391cac2822be41661b1e1795) ) - NEO_BIOS_AUDIO_128K( "proto_018.m1", CRC(470dd5d4) SHA1(4291811b4aefe45261a1ae3631b6999fcd74fb3f) ) + NEO_BIOS_AUDIO_128K( "proto_018-m1.m1", CRC(470dd5d4) SHA1(4291811b4aefe45261a1ae3631b6999fcd74fb3f) ) ROM_REGION( 0x200000, "ymsnd", 0 ) - ROM_LOAD( "proto_018.v11", 0x000000, 0x080000, CRC(dc07ea3c) SHA1(c3e71aaec44ead7ddc581565d16b90030e6db5fd) ) - ROM_LOAD( "proto_018.v12", 0x080000, 0x080000, CRC(f1ae637c) SHA1(02a4c7d4a544350a314ab7b26d8c9d3baa8f5778) ) - ROM_LOAD( "proto_018.v21", 0x100000, 0x080000, CRC(9f3b4eda) SHA1(7f516923d04daa483b4b99c9babba66505931a34) ) + ROM_LOAD( "proto_018-v11.v11", 0x000000, 0x080000, CRC(dc07ea3c) SHA1(c3e71aaec44ead7ddc581565d16b90030e6db5fd) ) + ROM_LOAD( "proto_018-v12.v12", 0x080000, 0x080000, CRC(f1ae637c) SHA1(02a4c7d4a544350a314ab7b26d8c9d3baa8f5778) ) + ROM_LOAD( "proto_018-v21.v21", 0x100000, 0x080000, CRC(9f3b4eda) SHA1(7f516923d04daa483b4b99c9babba66505931a34) ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) ROM_COPY( "ymsnd", 0x100000, 0x00000, 0x80000 ) ROM_REGION( 0x400000, "sprites", 0 ) // note, ROM_LOAD32_BYTE - ROM_LOAD32_BYTE( "proto_018.c1", 0x000000, 0x80000, CRC(6569018b) SHA1(25040e0a9c2b72900100a22a2a41de5f6c339d8a) ) - ROM_LOAD32_BYTE( "proto_018.c2", 0x000002, 0x80000, CRC(6949b501) SHA1(d8ee48837faff6cc849046ee8757b2b94d440303) ) - ROM_LOAD32_BYTE( "proto_018.c3", 0x000001, 0x80000, CRC(410f653b) SHA1(ce94667721baa7b2c318fc268e3bb9209671c9f5) ) - ROM_LOAD32_BYTE( "proto_018.c4", 0x000003, 0x80000, CRC(d43bf2a5) SHA1(c27985d8973611d02570f469a0d8cb4f5b63b614) ) - ROM_LOAD32_BYTE( "proto_018.c5", 0x200000, 0x80000, CRC(837d09d3) SHA1(d3b06931fca6123604549599544b04529ef34c53) ) - ROM_LOAD32_BYTE( "proto_018.c6", 0x200002, 0x80000, CRC(5fee51e7) SHA1(835c632fa12a1d5b4104cd80b8f686ac80b314a1) ) - ROM_LOAD32_BYTE( "proto_018.c7", 0x200001, 0x80000, CRC(0f3f0823) SHA1(ec1d681c1795de43d20f30f85956e2473ec39c95) ) - ROM_LOAD32_BYTE( "proto_018.c8", 0x200003, 0x80000, CRC(67cc9e34) SHA1(dc72a464c1456a4d2f7b992b416a984fb7885e99) ) + ROM_LOAD32_BYTE( "proto_018-c1.c1", 0x000000, 0x80000, CRC(6569018b) SHA1(25040e0a9c2b72900100a22a2a41de5f6c339d8a) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_018-c2.c2", 0x000002, 0x80000, CRC(6949b501) SHA1(d8ee48837faff6cc849046ee8757b2b94d440303) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_018-c3.c3", 0x000001, 0x80000, CRC(410f653b) SHA1(ce94667721baa7b2c318fc268e3bb9209671c9f5) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_018-c4.c4", 0x000003, 0x80000, CRC(d43bf2a5) SHA1(c27985d8973611d02570f469a0d8cb4f5b63b614) ) /* Plane 3 */ + ROM_LOAD32_BYTE( "proto_018-c5.c5", 0x200000, 0x80000, CRC(837d09d3) SHA1(d3b06931fca6123604549599544b04529ef34c53) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_018-c6.c6", 0x200002, 0x80000, CRC(5fee51e7) SHA1(835c632fa12a1d5b4104cd80b8f686ac80b314a1) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_018-c7.c7", 0x200001, 0x80000, CRC(0f3f0823) SHA1(ec1d681c1795de43d20f30f85956e2473ec39c95) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_018-c8.c8", 0x200003, 0x80000, CRC(67cc9e34) SHA1(dc72a464c1456a4d2f7b992b416a984fb7885e99) ) /* Plane 3 */ ROM_END @@ -2271,41 +2310,38 @@ ROM_LOAD16_BYTE( "039-c4.c4", 0x200001, 0x080000, CRC(81c9c250) SHA1(e3a34ff69081a8681b5ca895915892dcdccfa7aa) ) /* Plane 2,3 */ /* TC534200 */ ROM_END -// fairly late prototype release, only the code differs from the main set -ROM_START( kotm2p ) +ROM_START( kotm2p ) /* fairly late prototype release, only the code differs from the main set */ ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD16_BYTE( "p1.bin", 0x000001, 0x080000, CRC(3c1d17e7) SHA1(aeaff465fafa46ded903ed4e8cb8cd05de8dc096) ) - ROM_LOAD16_BYTE( "p2.bin", 0x000000, 0x080000, CRC(bc9691f0) SHA1(3854659b952d4f8c2edd5d59858a61ce6d518604) ) + ROM_LOAD16_BYTE( "proto_039-p1.p1", 0x000001, 0x080000, CRC(3c1d17e7) SHA1(aeaff465fafa46ded903ed4e8cb8cd05de8dc096) ) + ROM_LOAD16_BYTE( "proto_039-p2.p2", 0x000000, 0x080000, CRC(bc9691f0) SHA1(3854659b952d4f8c2edd5d59858a61ce6d518604) ) - NEO_SFIX_128K( "s1.bin", CRC(63ee053a) SHA1(7d4b92bd022708975b1470e8f24d1f5a712e1b94) ) + NEO_SFIX_128K( "039-s1.s1", CRC(63ee053a) SHA1(7d4b92bd022708975b1470e8f24d1f5a712e1b94) ) /* TC531000 */ - NEO_BIOS_AUDIO_128K( "m1.bin", CRC(0c5b2ad5) SHA1(15eb5ea10fecdbdbcfd06225ae6d88bb239592e7) ) + NEO_BIOS_AUDIO_128K( "039-m1.m1", CRC(0c5b2ad5) SHA1(15eb5ea10fecdbdbcfd06225ae6d88bb239592e7) ) /* TC531001 */ // same data as main set, but prototype board layout ROM_REGION( 0x300000, "ymsnd", 0 ) - ROM_LOAD( "v1.bin", 0x000000, 0x080000, CRC(dd3566f1) SHA1(f7c2a3747aaab2bc57cdfa33d8bb9fab057b5214) ) - ROM_LOAD( "v2.bin", 0x080000, 0x080000, CRC(57f60274) SHA1(7e17740aa05cf7ad4f9084e147600a8eb82c7284) ) - ROM_LOAD( "v3.bin", 0x100000, 0x080000, CRC(0f008a07) SHA1(ed243a0449232bbea409308c3fec7e057fcd8501) ) - ROM_LOAD( "v4.bin", 0x180000, 0x080000, CRC(1943d0fe) SHA1(47fb716c76ea6b5fe64204ff6d72b7feea10bda9) ) - ROM_LOAD( "v5.bin", 0x200000, 0x080000, CRC(13be045b) SHA1(0e3713ae6b164ebae434c0f18c466365b26b9a77) ) - ROM_LOAD( "v6.bin", 0x280000, 0x080000, CRC(d1dd3fd6) SHA1(052b92168a76cf3a97c8cacebcc3ebab228726df) ) + ROM_LOAD( "proto_039-v1.v1", 0x000000, 0x080000, CRC(dd3566f1) SHA1(f7c2a3747aaab2bc57cdfa33d8bb9fab057b5214) ) + ROM_LOAD( "proto_039-v2.v2", 0x080000, 0x080000, CRC(57f60274) SHA1(7e17740aa05cf7ad4f9084e147600a8eb82c7284) ) + ROM_LOAD( "proto_039-v3.v3", 0x100000, 0x080000, CRC(0f008a07) SHA1(ed243a0449232bbea409308c3fec7e057fcd8501) ) + ROM_LOAD( "proto_039-v4.v4", 0x180000, 0x080000, CRC(1943d0fe) SHA1(47fb716c76ea6b5fe64204ff6d72b7feea10bda9) ) + ROM_LOAD( "proto_039-v5.v5", 0x200000, 0x080000, CRC(13be045b) SHA1(0e3713ae6b164ebae434c0f18c466365b26b9a77) ) + ROM_LOAD( "proto_039-v6.v6", 0x280000, 0x080000, CRC(d1dd3fd6) SHA1(052b92168a76cf3a97c8cacebcc3ebab228726df) ) NO_DELTAT_REGION // same data as main set, but prototype board layout ROM_REGION( 0x600000, "sprites", 0 ) // note, ROM_LOAD32_BYTE - ROM_LOAD32_BYTE( "c1.bin", 0x000000, 0x100000, CRC(7192a787) SHA1(7bef6ce79c618103485480aee3c6f856968eb51f) ) - ROM_LOAD32_BYTE( "c2.bin", 0x000002, 0x100000, CRC(7157eca1) SHA1(65f36c6a3834775b04076d2c38a6047bffe9a8cf) ) - ROM_LOAD32_BYTE( "c3.bin", 0x000001, 0x100000, CRC(11d75727) SHA1(5a4c7b5ca3f1195e7853b45c5e71c13fe74d16e9) ) - ROM_LOAD32_BYTE( "c4.bin", 0x000003, 0x100000, CRC(7ad48b28) SHA1(27e65d948f08c231107cb1a810e2b06731091fc3) ) - ROM_LOAD32_BYTE( "c5.bin", 0x400000, 0x080000, CRC(5bdaf9ca) SHA1(60620d42ac6cd0e5da019fede2814a2f4171ff3f) ) - ROM_LOAD32_BYTE( "c6.bin", 0x400002, 0x080000, CRC(21d4be8c) SHA1(f1b19d37d52d21584f304b7d37d5c096b58219d6) ) - ROM_LOAD32_BYTE( "c7.bin", 0x400001, 0x080000, CRC(da55fd00) SHA1(52804f955597591fdd1d7478dc340b36d3c08c4a) ) - ROM_LOAD32_BYTE( "c8.bin", 0x400003, 0x080000, CRC(592e9267) SHA1(0d27de59970ccbcaa1d47909ea3d741ffb0d9e07) ) + ROM_LOAD32_BYTE( "proto_039-c1.c1", 0x000000, 0x100000, CRC(7192a787) SHA1(7bef6ce79c618103485480aee3c6f856968eb51f) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_039-c2.c2", 0x000002, 0x100000, CRC(7157eca1) SHA1(65f36c6a3834775b04076d2c38a6047bffe9a8cf) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_039-c3.c3", 0x000001, 0x100000, CRC(11d75727) SHA1(5a4c7b5ca3f1195e7853b45c5e71c13fe74d16e9) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_039-c4.c4", 0x000003, 0x100000, CRC(7ad48b28) SHA1(27e65d948f08c231107cb1a810e2b06731091fc3) ) /* Plane 3 */ + ROM_LOAD32_BYTE( "proto_039-c5.c5", 0x400000, 0x080000, CRC(5bdaf9ca) SHA1(60620d42ac6cd0e5da019fede2814a2f4171ff3f) ) /* Plane 0 */ + ROM_LOAD32_BYTE( "proto_039-c6.c6", 0x400002, 0x080000, CRC(21d4be8c) SHA1(f1b19d37d52d21584f304b7d37d5c096b58219d6) ) /* Plane 2 */ + ROM_LOAD32_BYTE( "proto_039-c7.c7", 0x400001, 0x080000, CRC(da55fd00) SHA1(52804f955597591fdd1d7478dc340b36d3c08c4a) ) /* Plane 1 */ + ROM_LOAD32_BYTE( "proto_039-c8.c8", 0x400003, 0x080000, CRC(592e9267) SHA1(0d27de59970ccbcaa1d47909ea3d741ffb0d9e07) ) /* Plane 3 */ ROM_END - - /**************************************** ID-0040 . NGM-040 @@ -2696,28 +2732,30 @@ /**************************************** ID-0051 - . ??M-051 - . ??H-051 + . AIM-051 + NEO-MVS PROG-G2 / NEO-MVS CHA42G-1 + . AIH-051 ****************************************/ ROM_START( viewpoin ) ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "051-p1.p1", 0x000000, 0x100000, CRC(17aa899d) SHA1(674cd8ace7acdf4f407de741e3d0071bcb49c902) ) + ROM_LOAD16_WORD_SWAP( "051-p1.p1", 0x000000, 0x100000, CRC(17aa899d) SHA1(674cd8ace7acdf4f407de741e3d0071bcb49c902) ) /* CXK388002 */ - NEO_SFIX_128K( "051-s1.s1", CRC(9fea5758) SHA1(5c6f01da89f2639cf741ee7c39e27023b8083052) ) + NEO_SFIX_128K( "051-s1.s1", CRC(9fea5758) SHA1(5c6f01da89f2639cf741ee7c39e27023b8083052) ) /* CXK381000 */ - NEO_BIOS_AUDIO_128K( "051-m1.m1", CRC(8e69f29a) SHA1(7a25f4997996434ea1b7d0d1ca9e7aaf966cbd03) ) + NEO_BIOS_AUDIO_128K( "051-m1.m1", CRC(8e69f29a) SHA1(7a25f4997996434ea1b7d0d1ca9e7aaf966cbd03) ) /* CXK381003 */ ROM_REGION( 0x400000, "ymsnd", 0 ) - ROM_LOAD( "051-v2.v2", 0x000000, 0x200000, CRC(019978b6) SHA1(7896a551115fc6ed38b5944e0c8dcb2b2c1c077d) ) - ROM_LOAD( "051-v4.v4", 0x200000, 0x200000, CRC(5758f38c) SHA1(da10f4b7d22d9139bbf068bd940be82168a74ca1) ) + /* What board was originally used (labels 051-V2 and 051-V4)? MVS is twice confirmed on NEO-MVS PROG-G2 */ + ROM_LOAD( "051-v2.v1", 0x000000, 0x200000, CRC(019978b6) SHA1(7896a551115fc6ed38b5944e0c8dcb2b2c1c077d) ) /* CXK381600 */ + ROM_LOAD( "051-v4.v2", 0x200000, 0x200000, CRC(5758f38c) SHA1(da10f4b7d22d9139bbf068bd940be82168a74ca1) ) /* CXK381600 */ NO_DELTAT_REGION ROM_REGION( 0x600000, "sprites", 0 ) - ROM_LOAD16_BYTE( "051-c1.c1", 0x000000, 0x100000, CRC(d624c132) SHA1(49c7e9f020cba45d7083b45252bcc03397f8c286) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "051-c1.c1", 0x000000, 0x100000, CRC(d624c132) SHA1(49c7e9f020cba45d7083b45252bcc03397f8c286) ) /* Plane 0,1 */ /* CXK381600 */ ROM_CONTINUE( 0x400000, 0x100000 ) - ROM_LOAD16_BYTE( "051-c2.c2", 0x000001, 0x100000, CRC(40d69f1e) SHA1(ec4a13582772594957f927622d50f54b0dfcd8d8) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "051-c2.c2", 0x000001, 0x100000, CRC(40d69f1e) SHA1(ec4a13582772594957f927622d50f54b0dfcd8d8) ) /* Plane 2,3 */ /* CXK381600 */ ROM_CONTINUE( 0x400001, 0x100000 ) ROM_END @@ -3029,9 +3067,9 @@ /**************************************** ID-0059 - . ??M-059 + . NGM-059 NEO-MVS PROGTOP / NEO-MVS CHA256 - . ??H-059 + . NGH-059 ****************************************/ ROM_START( savagere ) @@ -3665,7 +3703,7 @@ NEO-AEG PROGTOP2 / NEO-AEG CHA256 B ****************************************/ -ROM_START( quizkof ) +ROM_START( quizkof ) /* MVS AND AES VERSION */ ROM_REGION( 0x100000, "maincpu", 0 ) ROM_LOAD16_WORD_SWAP( "080-p1.p1", 0x000000, 0x100000, CRC(4440315e) SHA1(f4adba8e341d64a1f6280dfd98ebf6918c00608d) ) /* mask rom TC538200 */ @@ -4873,23 +4911,23 @@ ROM_START( pgoal ) /* MVS ONLY RELEASE */ ROM_REGION( 0x200000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "219-p1.p1", 0x100000, 0x100000, CRC(6af0e574) SHA1(c3f0fed0d942e48c99c80b1713f271c033ce0f4f) ) + ROM_LOAD16_WORD_SWAP( "219-p1.p1", 0x100000, 0x100000, CRC(6af0e574) SHA1(c3f0fed0d942e48c99c80b1713f271c033ce0f4f) ) /* TC5316200 */ ROM_CONTINUE( 0x000000, 0x100000 ) - NEO_SFIX_128K( "219-s1.s1", CRC(002f3c88) SHA1(a8a5bbc5397c8ae9858e38997ebdc713b7b4f50a) ) + NEO_SFIX_128K( "219-s1.s1", CRC(002f3c88) SHA1(a8a5bbc5397c8ae9858e38997ebdc713b7b4f50a) ) /* TC531000 */ - NEO_BIOS_AUDIO_128K( "219-m1.m1", CRC(958efdc8) SHA1(aacc6056b1ff48cde8f241a11a27473cfb4b4aa3) ) + NEO_BIOS_AUDIO_128K( "219-m1.m1", CRC(958efdc8) SHA1(aacc6056b1ff48cde8f241a11a27473cfb4b4aa3) ) /* TC531001 */ ROM_REGION( 0x400000, "ymsnd", 0 ) - ROM_LOAD( "219-v1.v1", 0x000000, 0x400000, CRC(d0ae33d9) SHA1(cb21a91184d9d84ff25ca86c00dcadfc210272a8) ) + ROM_LOAD( "219-v1.v1", 0x000000, 0x400000, CRC(d0ae33d9) SHA1(cb21a91184d9d84ff25ca86c00dcadfc210272a8) ) /* TC5332204 */ NO_DELTAT_REGION ROM_REGION( 0xc00000, "sprites", 0 ) - ROM_LOAD16_BYTE( "219-c1.c1", 0x0000000, 0x400000, CRC(67fec4dc) SHA1(b99767972a2a4fce2b704df8d08e6b092665a696) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "219-c2.c2", 0x0000001, 0x400000, CRC(86ed01f2) SHA1(9d7d1493946e8fbbd572503d2362b0156c023b76) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "219-c3.c3", 0x0800000, 0x200000, CRC(5fdad0a5) SHA1(56f6d2a7224aa4e82a1858079f918e85cadbd6c2) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "219-c4.c4", 0x0800001, 0x200000, CRC(f57b4a1c) SHA1(875ca69afbc5304ec23f4bc9186abe92f477f6c8) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "219-c1.c1", 0x0000000, 0x400000, CRC(67fec4dc) SHA1(b99767972a2a4fce2b704df8d08e6b092665a696) ) /* Plane 0,1 */ /* TC5332205 */ + ROM_LOAD16_BYTE( "219-c2.c2", 0x0000001, 0x400000, CRC(86ed01f2) SHA1(9d7d1493946e8fbbd572503d2362b0156c023b76) ) /* Plane 2,3 */ /* TC5332205 */ + ROM_LOAD16_BYTE( "219-c3.c3", 0x0800000, 0x200000, CRC(5fdad0a5) SHA1(56f6d2a7224aa4e82a1858079f918e85cadbd6c2) ) /* Plane 0,1 */ /* TC5316200 */ + ROM_LOAD16_BYTE( "219-c4.c4", 0x0800001, 0x200000, CRC(f57b4a1c) SHA1(875ca69afbc5304ec23f4bc9186abe92f477f6c8) ) /* Plane 2,3 */ /* TC5316200 */ ROM_END /**************************************** @@ -4899,44 +4937,44 @@ ROM_START( ironclad ) /* Prototype - crcs should match the ones of the unreleased dump. */ ROM_REGION( 0x200000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "220-p1p.p1", 0x100000, 0x100000, CRC(62a942c6) SHA1(12aaa7d9bd84328d1bf4610e056b5c57d0252537) ) + ROM_LOAD16_WORD_SWAP( "proto_220-p1.p1", 0x100000, 0x100000, CRC(62a942c6) SHA1(12aaa7d9bd84328d1bf4610e056b5c57d0252537) ) ROM_CONTINUE( 0x000000, 0x100000 ) - NEO_SFIX_128K( "220-s1p.s1", CRC(372fe217) SHA1(493433e682f519bf647e1481c8bdd3a980830ffb) ) + NEO_SFIX_128K( "proto_220-s1.s1", CRC(372fe217) SHA1(493433e682f519bf647e1481c8bdd3a980830ffb) ) - NEO_BIOS_AUDIO_128K( "220-m1p.m1", CRC(3a08bb63) SHA1(d8fbbf42a006ccafc3cd99808d28c82dbaac4590) ) + NEO_BIOS_AUDIO_128K( "proto_220-m1.m1", CRC(3a08bb63) SHA1(d8fbbf42a006ccafc3cd99808d28c82dbaac4590) ) ROM_REGION( 0x400000, "ymsnd", 0 ) - ROM_LOAD( "220-v1p.v1", 0x000000, 0x400000, CRC(8f30a215) SHA1(0ee866a468c4c3608d55df2b5cb9243c8016d77c) ) + ROM_LOAD( "proto_220-v1.v1", 0x000000, 0x400000, CRC(8f30a215) SHA1(0ee866a468c4c3608d55df2b5cb9243c8016d77c) ) NO_DELTAT_REGION ROM_REGION( 0x1000000, "sprites", 0 ) - ROM_LOAD16_BYTE( "220-c1p.c1", 0x000000, 0x400000, CRC(9aa2b7dc) SHA1(6b3dff292c86f949890b1f8201bc5278f38c2668) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "220-c2p.c2", 0x000001, 0x400000, CRC(8a2ad708) SHA1(9568ac4cc0552e7fd3e50d3cd8d9f0f4fe7df1d4) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "220-c3p.c3", 0x800000, 0x400000, CRC(d67fb15a) SHA1(842971aeaf3c92e70f7c653bbf29058bc60f5b71) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "220-c4p.c4", 0x800001, 0x400000, CRC(e73ea38b) SHA1(27138d588e61e86c292f12d16e36c3681075c607) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_220-c1.c1", 0x000000, 0x400000, CRC(9aa2b7dc) SHA1(6b3dff292c86f949890b1f8201bc5278f38c2668) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_220-c2.c2", 0x000001, 0x400000, CRC(8a2ad708) SHA1(9568ac4cc0552e7fd3e50d3cd8d9f0f4fe7df1d4) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_220-c3.c3", 0x800000, 0x400000, CRC(d67fb15a) SHA1(842971aeaf3c92e70f7c653bbf29058bc60f5b71) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_220-c4.c4", 0x800001, 0x400000, CRC(e73ea38b) SHA1(27138d588e61e86c292f12d16e36c3681075c607) ) /* Plane 2,3 */ ROM_END ROM_START( ironclado ) /* Prototype - bootleg/hack based on later release. */ ROM_REGION( 0x200000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "220-p1po.p1", 0x100000, 0x100000, CRC(ce37e3a0) SHA1(488f95fa15f56eea6666dda13d96ec29dba18e19) ) + ROM_LOAD16_WORD_SWAP( "proto_220-p1o.p1", 0x100000, 0x100000, CRC(ce37e3a0) SHA1(488f95fa15f56eea6666dda13d96ec29dba18e19) ) ROM_CONTINUE( 0x000000, 0x100000 ) - NEO_SFIX_128K( "220-s1p.s1", CRC(372fe217) SHA1(493433e682f519bf647e1481c8bdd3a980830ffb) ) + NEO_SFIX_128K( "proto_220-s1.s1", CRC(372fe217) SHA1(493433e682f519bf647e1481c8bdd3a980830ffb) ) - NEO_BIOS_AUDIO_128K( "220-m1p.m1", CRC(3a08bb63) SHA1(d8fbbf42a006ccafc3cd99808d28c82dbaac4590) ) + NEO_BIOS_AUDIO_128K( "proto_220-m1.m1", CRC(3a08bb63) SHA1(d8fbbf42a006ccafc3cd99808d28c82dbaac4590) ) ROM_REGION( 0x400000, "ymsnd", 0 ) - ROM_LOAD( "220-v1p.v1", 0x000000, 0x400000, CRC(8f30a215) SHA1(0ee866a468c4c3608d55df2b5cb9243c8016d77c) ) + ROM_LOAD( "proto_220-v1.v1", 0x000000, 0x400000, CRC(8f30a215) SHA1(0ee866a468c4c3608d55df2b5cb9243c8016d77c) ) NO_DELTAT_REGION ROM_REGION( 0x1000000, "sprites", 0 ) - ROM_LOAD16_BYTE( "220-c1p.c1", 0x000000, 0x400000, CRC(9aa2b7dc) SHA1(6b3dff292c86f949890b1f8201bc5278f38c2668) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "220-c2p.c2", 0x000001, 0x400000, CRC(8a2ad708) SHA1(9568ac4cc0552e7fd3e50d3cd8d9f0f4fe7df1d4) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "220-c3p.c3", 0x800000, 0x400000, CRC(d67fb15a) SHA1(842971aeaf3c92e70f7c653bbf29058bc60f5b71) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "220-c4p.c4", 0x800001, 0x400000, CRC(e73ea38b) SHA1(27138d588e61e86c292f12d16e36c3681075c607) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_220-c1.c1", 0x000000, 0x400000, CRC(9aa2b7dc) SHA1(6b3dff292c86f949890b1f8201bc5278f38c2668) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_220-c2.c2", 0x000001, 0x400000, CRC(8a2ad708) SHA1(9568ac4cc0552e7fd3e50d3cd8d9f0f4fe7df1d4) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_220-c3.c3", 0x800000, 0x400000, CRC(d67fb15a) SHA1(842971aeaf3c92e70f7c653bbf29058bc60f5b71) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_220-c4.c4", 0x800001, 0x400000, CRC(e73ea38b) SHA1(27138d588e61e86c292f12d16e36c3681075c607) ) /* Plane 2,3 */ ROM_END /**************************************** @@ -5189,20 +5227,20 @@ ROM_START( ghostlop ) /* Prototype */ ROM_REGION( 0x100000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "228-p1p.p1", 0x000000, 0x100000, CRC(6033172e) SHA1(f57fb706aa8dd9e5f9e992a5d35c1799578b59f8) ) + ROM_LOAD16_WORD_SWAP( "proto_228-p1.p1", 0x000000, 0x100000, CRC(6033172e) SHA1(f57fb706aa8dd9e5f9e992a5d35c1799578b59f8) ) - NEO_SFIX_128K( "228-s1p.s1", CRC(83c24e81) SHA1(585ef209d8bfc23bdccc1f37d8b764eeedfedc1c) ) + NEO_SFIX_128K( "proto_228-s1.s1", CRC(83c24e81) SHA1(585ef209d8bfc23bdccc1f37d8b764eeedfedc1c) ) - NEO_BIOS_AUDIO_128K( "228-m1p.m1", CRC(fd833b33) SHA1(ab6c218c42cba821654cbdae154efecb69f844f6) ) + NEO_BIOS_AUDIO_128K( "proto_228-m1.m1", CRC(fd833b33) SHA1(ab6c218c42cba821654cbdae154efecb69f844f6) ) ROM_REGION( 0x200000, "ymsnd", 0 ) - ROM_LOAD( "228-v1p.v1", 0x000000, 0x200000, CRC(c603fce6) SHA1(5a866471d35895b2ae13cbd5d1cb41bf2e72e1b8) ) + ROM_LOAD( "proto_228-v1.v1", 0x000000, 0x200000, CRC(c603fce6) SHA1(5a866471d35895b2ae13cbd5d1cb41bf2e72e1b8) ) NO_DELTAT_REGION ROM_REGION( 0x800000, "sprites", 0 ) - ROM_LOAD16_BYTE( "228-c1p.c1", 0x000000, 0x400000, CRC(bfc99efe) SHA1(5cd2545310142080b8286e787cf5b859f627b3db) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "228-c2p.c2", 0x000001, 0x400000, CRC(69788082) SHA1(c3ecb42ddcbd9e16d0018a0c3adb56a911d813ca) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_228-c1.c1", 0x000000, 0x400000, CRC(bfc99efe) SHA1(5cd2545310142080b8286e787cf5b859f627b3db) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_228-c2.c2", 0x000001, 0x400000, CRC(69788082) SHA1(c3ecb42ddcbd9e16d0018a0c3adb56a911d813ca) ) /* Plane 2,3 */ ROM_END /**************************************** @@ -5609,9 +5647,9 @@ /**************************************** ID-0239 - . ??M-2390 + . NGM-2390 NEO-MVS PROGBK1 / NEO-MVS CHA512Y - . ??H-2390 + . NGH-2390 ****************************************/ ROM_START( blazstar ) @@ -6271,11 +6309,11 @@ ROM_START( kof99p ) /* Prototype Version - Possibly Hacked */ ROM_REGION( 0x500000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "251-p1p.p1", 0x000000, 0x100000, CRC(f37929c4) SHA1(226e7e3d629568399b88275e5bcd4e5b3839be95) ) - ROM_LOAD16_WORD_SWAP( "251-p2p.p2", 0x100000, 0x400000, CRC(739742ad) SHA1(31acaf05a9bf186305888d3db7e4e8a83f7bb0a4) ) + ROM_LOAD16_WORD_SWAP( "proto_251-p1.p1", 0x000000, 0x100000, CRC(f37929c4) SHA1(226e7e3d629568399b88275e5bcd4e5b3839be95) ) + ROM_LOAD16_WORD_SWAP( "proto_251-p2.p2", 0x100000, 0x400000, CRC(739742ad) SHA1(31acaf05a9bf186305888d3db7e4e8a83f7bb0a4) ) /* This is the S1 from the prototype, the final is different */ - NEO_SFIX_128K( "251-s1p.s1", CRC(fb1498ed) SHA1(d40060b31b6f217a4abdf3b336439fcd7bd7aaef) ) + NEO_SFIX_128K( "proto_251-s1.s1", CRC(fb1498ed) SHA1(d40060b31b6f217a4abdf3b336439fcd7bd7aaef) ) /* Did the Prototype really use the same sound program / voice roms, sound isn't great .. */ NEO_BIOS_AUDIO_128K( "251-m1.m1", CRC(5e74539c) SHA1(6f49a9343cbd026b2c6720ff3fa2e5b1f85e80da) ) /* TC531001 */ @@ -6290,14 +6328,14 @@ ROM_REGION( 0x4000000, "sprites", 0 ) /* these are probably decrypted versions of the roms found in the final */ - ROM_LOAD16_BYTE( "251-c1p.c1", 0x0000000, 0x800000, CRC(e5d8ffa4) SHA1(65f15f9f02424a7a9dd35916166594f283e8d424) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "251-c2p.c2", 0x0000001, 0x800000, CRC(d822778f) SHA1(b590055e9bf1549bd6e1ecdabd65702202615712) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "251-c3p.c3", 0x1000000, 0x800000, CRC(f20959e8) SHA1(38293043fa77ac51c5e3191118874c58f1ae4d30) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "251-c4p.c4", 0x1000001, 0x800000, CRC(54ffbe9f) SHA1(8e62442923551f07a552621951b1accab2830e3b) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "251-c5p.c5", 0x2000000, 0x800000, CRC(d87a3bbc) SHA1(430f6812088712e0eb5714dcc664d8bba75e921a) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "251-c6p.c6", 0x2000001, 0x800000, CRC(4d40a691) SHA1(2b580d0678a5e6033ef16130671e860364d35e56) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "251-c7p.c7", 0x3000000, 0x800000, CRC(a4479a58) SHA1(d50e6cc9ccfe1ddbc6d90d46b8ca2cb0304edd8c) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "251-c8p.c8", 0x3000001, 0x800000, CRC(ead513ce) SHA1(e9b07a0b01fdeb3004755a479df059c81b4d0ed6) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_251-c1.c1", 0x0000000, 0x800000, CRC(e5d8ffa4) SHA1(65f15f9f02424a7a9dd35916166594f283e8d424) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_251-c2.c2", 0x0000001, 0x800000, CRC(d822778f) SHA1(b590055e9bf1549bd6e1ecdabd65702202615712) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_251-c3.c3", 0x1000000, 0x800000, CRC(f20959e8) SHA1(38293043fa77ac51c5e3191118874c58f1ae4d30) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_251-c4.c4", 0x1000001, 0x800000, CRC(54ffbe9f) SHA1(8e62442923551f07a552621951b1accab2830e3b) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_251-c5.c5", 0x2000000, 0x800000, CRC(d87a3bbc) SHA1(430f6812088712e0eb5714dcc664d8bba75e921a) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_251-c6.c6", 0x2000001, 0x800000, CRC(4d40a691) SHA1(2b580d0678a5e6033ef16130671e860364d35e56) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_251-c7.c7", 0x3000000, 0x800000, CRC(a4479a58) SHA1(d50e6cc9ccfe1ddbc6d90d46b8ca2cb0304edd8c) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_251-c8.c8", 0x3000001, 0x800000, CRC(ead513ce) SHA1(e9b07a0b01fdeb3004755a479df059c81b4d0ed6) ) /* Plane 2,3 */ ROM_END /**************************************** @@ -6415,30 +6453,30 @@ ROM_START( garoup ) /* Prototype Version, seems genuine */ ROM_REGION( 0x500000, "maincpu", 0 ) - ROM_LOAD16_WORD_SWAP( "253-p1p.p1", 0x000000, 0x100000, CRC(c72f0c16) SHA1(1ff6bb651682f93bef9ff02622c3cf63fe594986) ) - ROM_LOAD16_WORD_SWAP( "253-p2p.p2", 0x100000, 0x400000, CRC(bf8de565) SHA1(0e24574168cd38138bed0aa4dca49849f6901ca2) ) + ROM_LOAD16_WORD_SWAP( "proto_253-p1.p1", 0x000000, 0x100000, CRC(c72f0c16) SHA1(1ff6bb651682f93bef9ff02622c3cf63fe594986) ) + ROM_LOAD16_WORD_SWAP( "proto_253-p2.p2", 0x100000, 0x400000, CRC(bf8de565) SHA1(0e24574168cd38138bed0aa4dca49849f6901ca2) ) - NEO_SFIX_128K( "253-s1p.s1", CRC(779989de) SHA1(8bd550857b60f8a907f6d39a4225ceffdd330307) ) + NEO_SFIX_128K( "proto_253-s1.s1", CRC(779989de) SHA1(8bd550857b60f8a907f6d39a4225ceffdd330307) ) - NEO_BIOS_AUDIO_256K( "253-m1p.m1", CRC(bbe464f7) SHA1(f5f8f3e48f5d453f45107085d6f4023bcd24c053) ) + NEO_BIOS_AUDIO_256K( "proto_253-m1.m1", CRC(bbe464f7) SHA1(f5f8f3e48f5d453f45107085d6f4023bcd24c053) ) ROM_REGION( 0x1000000, "ymsnd", 0 ) - ROM_LOAD( "253-v1p.v1", 0x000000, 0x400000, CRC(274f3923) SHA1(4c7a8ad1cd0e3afc1f78de3c2929120ed434f104) ) - ROM_LOAD( "253-v2p.v2", 0x400000, 0x400000, CRC(8f86dabe) SHA1(b3d2d9f5c1d97a6e7aee2c674fb6627f41bbb240) ) - ROM_LOAD( "253-v3p.v3", 0x800000, 0x400000, CRC(05fd06cd) SHA1(6cd699719614bb87547632ea3d61d92d81fdf563) ) - ROM_LOAD( "253-v4p.v4", 0xc00000, 0x400000, CRC(14984063) SHA1(170d5638327ec0eb3590b80dc11590897367250c) ) + ROM_LOAD( "proto_253-v1.v1", 0x000000, 0x400000, CRC(274f3923) SHA1(4c7a8ad1cd0e3afc1f78de3c2929120ed434f104) ) + ROM_LOAD( "proto_253-v2.v2", 0x400000, 0x400000, CRC(8f86dabe) SHA1(b3d2d9f5c1d97a6e7aee2c674fb6627f41bbb240) ) + ROM_LOAD( "proto_253-v3.v3", 0x800000, 0x400000, CRC(05fd06cd) SHA1(6cd699719614bb87547632ea3d61d92d81fdf563) ) + ROM_LOAD( "proto_253-v4.v4", 0xc00000, 0x400000, CRC(14984063) SHA1(170d5638327ec0eb3590b80dc11590897367250c) ) NO_DELTAT_REGION ROM_REGION( 0x4000000, "sprites", 0 ) - ROM_LOAD16_BYTE( "253-c1p.c1", 0x0000000, 0x800000, CRC(5bb5d137) SHA1(d648febd8e6a0bdd9bdbb6ce1f1f8b08567ec05a) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "253-c2p.c2", 0x0000001, 0x800000, CRC(5c8d2960) SHA1(f7503502be0332adf408ee0ea5ee5161c8939fd8) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "253-c3p.c3", 0x1000000, 0x800000, CRC(234d16fc) SHA1(7b9221f7ecc438150c8a10be72390329854ed21b) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "253-c4p.c4", 0x1000001, 0x800000, CRC(b9b5b993) SHA1(6059793eaf6e58c172235fe64aa9d25a40c38ed6) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "253-c5p.c5", 0x2000000, 0x800000, CRC(722615d2) SHA1(798832c535869f0e247c3db0d8253779b103e213) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "253-c6p.c6", 0x2000001, 0x800000, CRC(0a6fab38) SHA1(eaee6f2f18af91f7959d84d4b991b3fc182d07c4) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "253-c7p.c7", 0x3000000, 0x800000, CRC(d68e806f) SHA1(92bfd9839115bd590972ae4ecc45ad35dce22387) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "253-c8p.c8", 0x3000001, 0x800000, CRC(f778fe99) SHA1(c963f6ba90a36d02991728b44ffcf174ca18268a) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_253-c1.c1", 0x0000000, 0x800000, CRC(5bb5d137) SHA1(d648febd8e6a0bdd9bdbb6ce1f1f8b08567ec05a) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_253-c2.c2", 0x0000001, 0x800000, CRC(5c8d2960) SHA1(f7503502be0332adf408ee0ea5ee5161c8939fd8) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_253-c3.c3", 0x1000000, 0x800000, CRC(234d16fc) SHA1(7b9221f7ecc438150c8a10be72390329854ed21b) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_253-c4.c4", 0x1000001, 0x800000, CRC(b9b5b993) SHA1(6059793eaf6e58c172235fe64aa9d25a40c38ed6) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_253-c5.c5", 0x2000000, 0x800000, CRC(722615d2) SHA1(798832c535869f0e247c3db0d8253779b103e213) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_253-c6.c6", 0x2000001, 0x800000, CRC(0a6fab38) SHA1(eaee6f2f18af91f7959d84d4b991b3fc182d07c4) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_253-c7.c7", 0x3000000, 0x800000, CRC(d68e806f) SHA1(92bfd9839115bd590972ae4ecc45ad35dce22387) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_253-c8.c8", 0x3000001, 0x800000, CRC(f778fe99) SHA1(c963f6ba90a36d02991728b44ffcf174ca18268a) ) /* Plane 2,3 */ ROM_END /**************************************** @@ -6728,22 +6766,22 @@ ROM_LOAD16_WORD_SWAP( "259-p1.p1", 0x100000, 0x100000, CRC(88a37f8b) SHA1(566db84850fad5e8fe822e8bba910a33e083b550) ) ROM_CONTINUE( 0x000000, 0x100000 ) - NEO_SFIX_128K( "259-s1p.s1", CRC(bb50fb2d) SHA1(7372939f328fb5e7d09c16985e09ae8c34702b0c) ) + NEO_SFIX_128K( "proto_259-s1.s1", CRC(bb50fb2d) SHA1(7372939f328fb5e7d09c16985e09ae8c34702b0c) ) NEO_BIOS_AUDIO_128K( "259-m1.m1", CRC(85668ee9) SHA1(7d3f51710cf90c097cd3faaeeef10ceb85cbb3e8) ) ROM_REGION( 0x500000, "ymsnd", 0 ) - ROM_LOAD( "259-v1p.v1", 0x000000, 0x200000, CRC(e97b9385) SHA1(d213cae6cf5732b8ab1f8a8cf04afee5dfd9a260) ) - ROM_LOAD( "259-v2p.v2", 0x200000, 0x200000, CRC(b0cbd70a) SHA1(fc7c8183f8ff9800e8aae7c8d44d962300058cfb) ) - ROM_LOAD( "259-v3p.v3", 0x400000, 0x100000, CRC(97528fe9) SHA1(8f5eddbb3a9a225492479d1a44801f3916c8e791) ) + ROM_LOAD( "proto_259-v1.v1", 0x000000, 0x200000, CRC(e97b9385) SHA1(d213cae6cf5732b8ab1f8a8cf04afee5dfd9a260) ) + ROM_LOAD( "proto_259-v2.v2", 0x200000, 0x200000, CRC(b0cbd70a) SHA1(fc7c8183f8ff9800e8aae7c8d44d962300058cfb) ) + ROM_LOAD( "proto_259-v3.v3", 0x400000, 0x100000, CRC(97528fe9) SHA1(8f5eddbb3a9a225492479d1a44801f3916c8e791) ) NO_DELTAT_REGION ROM_REGION( 0x600000, "sprites", 0 ) - ROM_LOAD16_BYTE( "259-c1p.c1", 0x000000, 0x200000, CRC(e3919e44) SHA1(54c722414b5a7ad311dc8ddf6fdda88535e829d1) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "259-c2p.c2", 0x000001, 0x200000, CRC(baf5a320) SHA1(ead3d81d9b4aeb45af4f9cb5c38157f2236b506c) ) /* Plane 2,3 */ - ROM_LOAD16_BYTE( "259-c3p.c3", 0x400000, 0x100000, CRC(c8e52157) SHA1(f10f58e905c4cbaf182b20e63abe5364462133c5) ) /* Plane 0,1 */ - ROM_LOAD16_BYTE( "259-c4p.c4", 0x400001, 0x100000, CRC(69fa8e60) SHA1(29c1fbdb79dedf1470683202e2cb3435732d9275) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_259-c1.c1", 0x000000, 0x200000, CRC(e3919e44) SHA1(54c722414b5a7ad311dc8ddf6fdda88535e829d1) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_259-c2.c2", 0x000001, 0x200000, CRC(baf5a320) SHA1(ead3d81d9b4aeb45af4f9cb5c38157f2236b506c) ) /* Plane 2,3 */ + ROM_LOAD16_BYTE( "proto_259-c3.c3", 0x400000, 0x100000, CRC(c8e52157) SHA1(f10f58e905c4cbaf182b20e63abe5364462133c5) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "proto_259-c4.c4", 0x400001, 0x100000, CRC(69fa8e60) SHA1(29c1fbdb79dedf1470683202e2cb3435732d9275) ) /* Plane 2,3 */ ROM_END #endif @@ -8831,6 +8869,33 @@ ROM_LOAD16_BYTE( "dig-c2.bin", 0x000001, 0x080000, CRC(3e632161) SHA1(83711c4286fb1d9f3f91414ac6e5fed36618033e) ) /* Plane 2,3 */ ROM_END +// this doesn't boot, protection like kof98? +// you can force it to boot with a simple debugger trick, but then it resets when starting a game +ROM_START( sbp ) /* Unlicensed, no official game ID # */ + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP( "2a.bin", 0x000000, 0x080000, CRC(d054d264) SHA1(d1b4bc626d000e0679def0545940fa75035921ab) ) + + ROM_REGION( 0x20000, "fixed", 0 ) + ROM_LOAD( "2b.bin", 0x000000, 0x20000, CRC(2fd04b2a) SHA1(1acb446704ab56d0a33df7c48855aa8d00fd5a3c) ) + ROM_IGNORE(0x20000) + ROM_IGNORE(0x20000) + ROM_IGNORE(0x20000) + + ROM_REGION( 0x20000, "fixedbios", 0 ) + ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) ) + ROM_Y_ZOOM + + NEO_BIOS_AUDIO_512K( "1b.bin", CRC(7b1f86f7) SHA1(15b6af7f9fbd0f1f6a1ecd912200ca8d0af2da2a) ) + + ROM_REGION( 0x200000, "ymsnd", 0 ) + ROM_LOAD( "sbp.snd", 0x000000, 0x080000, NO_DUMP ) + + NO_DELTAT_REGION + + ROM_REGION( 0x400000, "sprites", 0 ) + ROM_LOAD16_BYTE( "3b.bin", 0x000000, 0x200000, CRC(44791317) SHA1(9e773eb9aae5ee767213bd17348ff8a312e9cb16) ) /* Plane 0,1 */ + ROM_LOAD16_BYTE( "4b.bin", 0x000001, 0x200000, CRC(a3a1c0df) SHA1(3b1e5be673f7cbb04199a805b0e0de93dad8cb8c) ) /* Plane 2,3 */ +ROM_END /****************************************************************************/ @@ -9750,6 +9815,64 @@ DRIVER_INIT_CALL(neogeo); } +static READ16_HANDLER( sbp_lowerrom_r ) +{ + UINT16* rom = (UINT16*)space->machine().region("maincpu")->base(); + UINT16 origdata = rom[(offset+(0x200/2))]; + UINT16 data = BITSWAP16(origdata, 11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4); + int realoffset = 0x200+(offset*2); + logerror("sbp_lowerrom_r offset %08x data %04x\n", realoffset, data ); + + // there is actually data in the rom here already, maybe we should just return it 'as is' + if (realoffset==0xd5e) return origdata; + + return data; +} + +static WRITE16_HANDLER( sbp_lowerrom_w ) +{ + int realoffset = 0x200+(offset*2); + + // the actual data written is just pulled from the end of the rom, and unused space + // maybe this is just some kind of watchdog for the protection device and it doesn't + // matter? + if (realoffset == 0x1080) + { + if (data==0x4e75) + { + return; + } + else if (data==0xffff) + { + return; + } + } + + printf("sbp_lowerrom_w offset %08x data %04x\n", realoffset, data ); +} + +static DRIVER_INIT(sbp ) +{ + // there seems to be a protection device living around here.. + // if you nibble swap the data in the rom the game will boot + // there are also writes to 0x1080.. + // + // other stuff going on as well tho, the main overlay is still missing, and p1 inputs don't work + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x00200, 0x001fff, FUNC(sbp_lowerrom_r)); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x00200, 0x001fff, FUNC(sbp_lowerrom_w)); + + /* the game code clears the text overlay used ingame immediately after writing it.. why? protection? sloppy code that the hw ignores? imperfect emulation? */ + { + UINT16* rom = (UINT16*)machine.region("maincpu")->base(); + + rom[0x2a6f8/2] = 0x4e71; + rom[0x2a6fa/2] = 0x4e71; + rom[0x2a6fc/2] = 0x4e71; + } + + +} + // handle protected carts void mvs_install_protection(device_image_interface& image) @@ -10128,6 +10251,8 @@ GAME( 2002, matrim, neogeo, neogeo, neogeo, matrim, ROT0, "Noise Factory / Atlus", "Matrimelee / Shin Gouketsuji Ichizoku Toukon (NGM-2660) (NGH-2660)", GAME_SUPPORTS_SAVE ) GAME( 2002, matrimbl, matrim, neogeo, neogeo, matrimbl, ROT0, "bootleg", "Matrimelee / Shin Gouketsuji Ichizoku Toukon (bootleg)", GAME_SUPPORTS_SAVE ) +/***** Unlicensed commercial releases *****/ + /* BrezzaSoft */ GAME( 2001, jockeygp, neogeo, neogeo, jockeygp, jockeygp, ROT0, "Sun Amusement / BrezzaSoft", "Jockey Grand Prix (set 1)", GAME_SUPPORTS_SAVE ) GAME( 2001, jockeygpa, jockeygp, neogeo, jockeygp, jockeygp, ROT0, "Sun Amusement / BrezzaSoft", "Jockey Grand Prix (set 2)", GAME_SUPPORTS_SAVE ) @@ -10136,3 +10261,13 @@ /* Kyle Hodgetts */ GAME( 2000, diggerma, neogeo, neogeo, neogeo, neogeo, ROT0, "Kyle Hodgetts", "Digger Man (prototype)", GAME_SUPPORTS_SAVE ) + +/* Vektorlogic */ +GAME( 2004, sbp, neogeo, neogeo, neogeo, sbp, ROT0, "Vektorlogic", "Super Bubble Pop", GAME_NOT_WORKING ) + +/* NG.DEV.TEAM */ +// Last Hope (c)2006 - AES / NEOCD (has no MVS mode) +// Last Hope Pink Bullets (c)2008 - MVS / AES +// Fast Striker (c)2010 - MVS/AES +// Fast Striker 1.5 (c)2010 - MVS/AES +// GunLord (c)2012 - MVS/AES diff -Nru mame-0.144/src/mame/drivers/neogeo.c mame-0.145/src/mame/drivers/neogeo.c --- mame-0.144/src/mame/drivers/neogeo.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/neogeo.c 2012-02-06 21:30:39.000000000 +0000 @@ -1285,8 +1285,8 @@ { // create memory regions size = image.get_software_region_length("maincpu"); - image.device().machine().region_free("maincpu"); - image.device().machine().region_alloc("maincpu",size, 2, ENDIANNESS_BIG); + image.device().machine().region_free(":maincpu"); + image.device().machine().region_alloc(":maincpu",size, 2, ENDIANNESS_BIG); memcpy(image.device().machine().region("maincpu")->base(),image.get_software_region("maincpu"),size); // for whatever reason (intentional, or design flaw) software loaded via software lists is swapped in endianess vs. the standard ROM loading, regardless of the above. Swap it to keep consistency @@ -1297,46 +1297,46 @@ } size = image.get_software_region_length("fixed"); - image.device().machine().region_free("fixed"); - image.device().machine().region_alloc("fixed",size,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":fixed"); + image.device().machine().region_alloc(":fixed",size,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("fixed")->base(),image.get_software_region("fixed"),size); if(image.get_software_region("audiocpu") != NULL) { size = image.get_software_region_length("audiocpu"); - image.device().machine().region_free("audiocpu"); - image.device().machine().region_alloc("audiocpu",size+0x10000,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":audiocpu"); + image.device().machine().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("audiocpu")->base(),image.get_software_region("audiocpu"),size); memcpy(image.device().machine().region("audiocpu")->base()+0x10000,image.get_software_region("audiocpu"),size); // avoid reloading in XML, should just improve banking instead tho? } size = image.get_software_region_length("ymsnd"); - image.device().machine().region_free("ymsnd"); - image.device().machine().region_alloc("ymsnd",size,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":ymsnd"); + image.device().machine().region_alloc(":ymsnd",size,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("ymsnd")->base(),image.get_software_region("ymsnd"),size); if(image.get_software_region("ymsnd.deltat") != NULL) { size = image.get_software_region_length("ymsnd.deltat"); - image.device().machine().region_free("ymsnd.deltat"); - image.device().machine().region_alloc("ymsnd.deltat",size,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":ymsnd.deltat"); + image.device().machine().region_alloc(":ymsnd.deltat",size,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("ymsnd.deltat")->base(),image.get_software_region("ymsnd.deltat"),size); } else - image.device().machine().region_free("ymsnd.deltat"); // removing the region will fix sound glitches in non-Delta-T games + image.device().machine().region_free(":ymsnd.deltat"); // removing the region will fix sound glitches in non-Delta-T games ym->reset(); size = image.get_software_region_length("sprites"); - image.device().machine().region_free("sprites"); - image.device().machine().region_alloc("sprites",size,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":sprites"); + image.device().machine().region_alloc(":sprites",size,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("sprites")->base(),image.get_software_region("sprites"),size); if(image.get_software_region("audiocrypt") != NULL) // encrypted Z80 code { size = image.get_software_region_length("audiocrypt"); - image.device().machine().region_alloc("audiocrypt",size,1, ENDIANNESS_LITTLE); + image.device().machine().region_alloc(":audiocrypt",size,1, ENDIANNESS_LITTLE); memcpy(image.device().machine().region("audiocrypt")->base(),image.get_software_region("audiocrypt"),size); // allocate the audiocpu region to decrypt data into - image.device().machine().region_free("audiocpu"); - image.device().machine().region_alloc("audiocpu",size+0x10000,1, ENDIANNESS_LITTLE); + image.device().machine().region_free(":audiocpu"); + image.device().machine().region_alloc(":audiocpu",size+0x10000,1, ENDIANNESS_LITTLE); } // setup cartridge ROM area @@ -1381,9 +1381,8 @@ MCFG_DEFAULT_LAYOUT(layout_neogeo) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(NEOGEO_PIXEL_CLOCK, NEOGEO_HTOTAL, NEOGEO_HBEND, NEOGEO_HBSTART, NEOGEO_VTOTAL, NEOGEO_VBEND, NEOGEO_VBSTART) - MCFG_SCREEN_UPDATE(neogeo) + MCFG_SCREEN_UPDATE_STATIC(neogeo) /* audio hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -1406,7 +1405,6 @@ MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_LOAD(neo_cartridge) MCFG_CARTSLOT_INTERFACE("neo_cart") - MCFG_CARTSLOT_MANDATORY MCFG_SOFTWARE_LIST_ADD("cart_list","neogeo") MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/neoprint.c mame-0.145/src/mame/drivers/neoprint.c --- mame-0.144/src/mame/drivers/neoprint.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/neoprint.c 2012-02-06 21:30:40.000000000 +0000 @@ -53,7 +53,7 @@ ---- ---- --?? ??xx [6] map register */ -static void draw_layer(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int layer,int data_shift) +static void draw_layer(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int layer,int data_shift) { neoprint_state *state = machine.driver_data(); int i, y, x; @@ -91,23 +91,23 @@ } } -SCREEN_UPDATE(neoprint) +SCREEN_UPDATE_IND16(neoprint) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - draw_layer(screen->machine(),bitmap,cliprect,1,2); - draw_layer(screen->machine(),bitmap,cliprect,0,2); + draw_layer(screen.machine(),bitmap,cliprect,1,2); + draw_layer(screen.machine(),bitmap,cliprect,0,2); return 0; } -SCREEN_UPDATE(nprsp) +SCREEN_UPDATE_IND16(nprsp) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - draw_layer(screen->machine(),bitmap,cliprect,1,0); - draw_layer(screen->machine(),bitmap,cliprect,2,0); - draw_layer(screen->machine(),bitmap,cliprect,0,0); + draw_layer(screen.machine(),bitmap,cliprect,1,0); + draw_layer(screen.machine(),bitmap,cliprect,2,0); + draw_layer(screen.machine(),bitmap,cliprect,0,0); return 0; } @@ -464,10 +464,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(neoprint) + MCFG_SCREEN_UPDATE_STATIC(neoprint) MCFG_PALETTE_LENGTH(0x10000) @@ -507,10 +506,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(nprsp) + MCFG_SCREEN_UPDATE_STATIC(nprsp) MCFG_MACHINE_RESET(nprsp) diff -Nru mame-0.144/src/mame/drivers/neptunp2.c mame-0.145/src/mame/drivers/neptunp2.c --- mame-0.144/src/mame/drivers/neptunp2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/neptunp2.c 2012-02-06 21:30:42.000000000 +0000 @@ -6,6 +6,8 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i86/i86.h" @@ -14,27 +16,40 @@ { public: neptunp2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + DECLARE_READ8_MEMBER(test_r); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; -static VIDEO_START( neptunp2 ) +void neptunp2_state::video_start() { } -static SCREEN_UPDATE( neptunp2 ) +UINT32 neptunp2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } -static READ8_HANDLER( test_r ) +READ8_MEMBER( neptunp2_state::test_r ) { - return space->machine().rand(); + return machine().rand(); } -static ADDRESS_MAP_START( neptunp2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( neptunp2_map, AS_PROGRAM, 8, neptunp2_state ) AM_RANGE(0x00000, 0xbffff) AM_ROM AM_RANGE(0xe0000, 0xeffff) AM_RAM @@ -51,12 +66,11 @@ AM_RANGE(0xffff0, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( neptunp2_io, AS_IO, 8 ) +static ADDRESS_MAP_START( neptunp2_io, AS_IO, 8, neptunp2_state ) ADDRESS_MAP_END static INPUT_PORTS_START( neptunp2 ) - INPUT_PORTS_END #if 0 @@ -88,15 +102,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(neptunp2_state, screen_update) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(neptunp2) MCFG_GFXDECODE(neptunp2) MCFG_PALETTE_LENGTH(512) - MCFG_VIDEO_START(neptunp2) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -123,4 +134,5 @@ ROM_LOAD( "flash_roms", 0x00000, 0x10000, NO_DUMP ) ROM_END + GAME( 199?, neptunp2, 0, neptunp2, neptunp2, 0, ROT0, "Unidesa?", "Neptune's Pearls 2", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/news.c mame-0.145/src/mame/drivers/news.c --- mame-0.144/src/mame/drivers/news.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/news.c 2012-02-06 21:30:39.000000000 +0000 @@ -141,10 +141,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(news) + MCFG_SCREEN_UPDATE_STATIC(news) MCFG_GFXDECODE(news) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/nexus3d.c mame-0.145/src/mame/drivers/nexus3d.c --- mame-0.144/src/mame/drivers/nexus3d.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/nexus3d.c 2012-02-06 21:30:35.000000000 +0000 @@ -125,25 +125,25 @@ return space->machine().rand() ^ (space->machine().rand() << 16); } -static READ32_HANDLER( nexus3d_unk2_r ) -{ - return 0x00000000;//space->machine().rand() ^ (space->machine().rand() << 16); -} - -static READ32_HANDLER( nexus3d_unk3_r ) -{ - return 0x00000000;//space->machine().rand() ^ (space->machine().rand() << 16); -} - -static WRITE32_HANDLER( nexus3d_unk2_w ) -{ - -} - -static WRITE32_HANDLER( nexus3d_unk3_w ) -{ - -} +//static READ32_HANDLER( nexus3d_unk2_r ) +//{ +// return 0x00000000;//space->machine().rand() ^ (space->machine().rand() << 16); +//} +// +//static READ32_HANDLER( nexus3d_unk3_r ) +//{ +// return 0x00000000;//space->machine().rand() ^ (space->machine().rand() << 16); +//} +// +//static WRITE32_HANDLER( nexus3d_unk2_w ) +//{ +// +//} +// +//static WRITE32_HANDLER( nexus3d_unk3_w ) +//{ +// +//} static ADDRESS_MAP_START( nexus3d_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x003fffff) AM_RAM AM_BASE_MEMBER(nexus3d_state, m_mainram) @@ -156,8 +156,8 @@ AM_RANGE(0x9C000018, 0x9C00001b) AM_WRITE8( n3d_flash_addr_w, 0xffffffff) // lots of accesses in this range - AM_RANGE(0xC0000F44, 0xC0000F47) AM_READWRITE( nexus3d_unk2_r, nexus3d_unk2_w ) // often - AM_RANGE(0xC0000F4C, 0xC0000F4f) AM_READWRITE( nexus3d_unk3_r, nexus3d_unk3_w ) // often +// AM_RANGE(0xC0000F44, 0xC0000F47) AM_READWRITE( nexus3d_unk2_r, nexus3d_unk2_w ) // often +// AM_RANGE(0xC0000F4C, 0xC0000F4f) AM_READWRITE( nexus3d_unk3_r, nexus3d_unk3_w ) // often AM_RANGE(0xE0000014, 0xE0000017) AM_READ( nexus3d_unk_r ) // sits waiting for this @@ -174,7 +174,7 @@ } -SCREEN_UPDATE(nexus3d) +SCREEN_UPDATE_RGB32(nexus3d) { return 0; } @@ -193,10 +193,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-1) - MCFG_SCREEN_UPDATE(nexus3d) + MCFG_SCREEN_UPDATE_STATIC(nexus3d) MCFG_PALETTE_LENGTH(256) @@ -206,7 +205,7 @@ MACHINE_CONFIG_END -// The u1 flash on this is clearly recycled from a Happy Fish or Blue Elf multigame. +// The u1 flash on achertf is clearly recycled from a Happy Fish or Blue Elf multigame. // Around 75% of the rom is NeoGeo, CPS2, Semicom etc. MAME romsets used by said multigame bootlegs // which explains why the 1Gb flash rom hardly compresses, it's already compressed data. // @@ -216,9 +215,32 @@ // // It's possible this set should be marked as a bootleg due to this although I imagine the actual valid // part of the data will match a clean dump. +// +// also the types of flash used on both these should probably be double the size they are, I believe this +// to be a software bug with the tools used to read them, hence the weird 0x898 bytes appended to +// the end.. this was at least the case with the actual Happy Fish roms. In this case it shouldn't +// matter because all the data needed by the game is in the first part of the ROM. + + +ROM_START( acheart ) + ROM_REGION( 0x42000898, "user1", 0 ) /* ARM 32 bit code */ + ROM_LOAD( "arcanaheart.u1", 0x000000, 0x42000898, BAD_DUMP CRC(53b7b482) SHA1(28799f8e332966f81fa501ead678d21e3e1c9e2c) ) + + ROM_REGION( 0x200000, "user2", 0 ) // QDSP stuff + ROM_LOAD( "u38.bin", 0x000000, 0x200000, CRC(29ecfba3) SHA1(ab02c7a579a3c05a19b79e42342fd5ed84c7b046) ) + ROM_LOAD( "u39.bin", 0x000000, 0x200000, CRC(eef0b1ee) SHA1(5508e6b2f0ae1555662793313a05e94a87599890) ) + ROM_LOAD( "u44.bin", 0x000000, 0x200000, CRC(b9723bdf) SHA1(769090ada7375ecb3d0bc10e89fe74a8e89129f2) ) + ROM_LOAD( "u45.bin", 0x000000, 0x200000, CRC(1c6a3169) SHA1(34a2ca00a403dc1e3909ed1c55320cf2bbd9d49e) ) + ROM_LOAD( "u46.bin", 0x000000, 0x200000, CRC(1e8a7e73) SHA1(3270bc359b266e57debf8fd4283a46e08d679ae2) ) + + ROM_REGION( 0x080000, "wavetable", ROMREGION_ERASEFF ) /* QDSP wavetable rom */ +// ROM_LOAD( "qs1001a", 0x000000, 0x80000, CRC(d13c6407) SHA1(57b14f97c7d4f9b5d9745d3571a0b7115fbe3176) ) // missing from this set, but should be the same +ROM_END + + ROM_START( acheartf ) ROM_REGION( 0x42000898, "user1", 0 ) /* ARM 32 bit code */ - ROM_LOAD( "arcana_heart_full.u1", 0x000000, 0x42000898, CRC(1a171ca3) SHA1(774f3b8d5fb366901d819b5dc15ca49b0cd177b9) ) + ROM_LOAD( "arcana_heart_full.u1", 0x000000, 0x42000898, BAD_DUMP CRC(1a171ca3) SHA1(774f3b8d5fb366901d819b5dc15ca49b0cd177b9) ) ROM_REGION( 0x200000, "user2", 0 ) // QDSP stuff ROM_LOAD( "u38.bin", 0x000000, 0x200000, CRC(29ecfba3) SHA1(ab02c7a579a3c05a19b79e42342fd5ed84c7b046) ) @@ -239,4 +261,5 @@ state->m_flash_region = machine.region("user1")->base(); } -GAME( 2006, acheartf, 0, nexus3d, nexus3d, nexus3d, ROT0, "Examu", "Arcana Heart Full", GAME_NO_SOUND|GAME_NOT_WORKING ) +GAME( 2005, acheart, 0, nexus3d, nexus3d, nexus3d, ROT0, "Examu", "Arcana Heart",GAME_IS_SKELETON ) +GAME( 2006, acheartf, 0, nexus3d, nexus3d, nexus3d, ROT0, "Examu", "Arcana Heart Full",GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/nightgal.c mame-0.145/src/mame/drivers/nightgal.c --- mame-0.144/src/mame/drivers/nightgal.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/nightgal.c 2012-02-06 21:30:33.000000000 +0000 @@ -68,21 +68,21 @@ state->save_item(NAME(state->m_blit_buffer)); } -static SCREEN_UPDATE( nightgal ) +static SCREEN_UPDATE_IND16( nightgal ) { - nightgal_state *state = screen->machine().driver_data(); + nightgal_state *state = screen.machine().driver_data(); int x, y; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { - UINT8 *src = &state->m_blit_buffer[y * 512 / 2 + cliprect->min_x]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, cliprect->min_x); + UINT8 *src = &state->m_blit_buffer[y * 512 / 2 + cliprect.min_x]; + UINT16 *dst = &bitmap.pix16(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { UINT32 srcpix = *src++; - *dst++ = screen->machine().pens[srcpix & 0xf]; - *dst++ = screen->machine().pens[(srcpix >> 4) & 0xf]; + *dst++ = screen.machine().pens[srcpix & 0xf]; + *dst++ = screen.machine().pens[(srcpix >> 4) & 0xf]; } } @@ -877,10 +877,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(nightgal) + MCFG_SCREEN_UPDATE_STATIC(nightgal) MCFG_PALETTE_INIT(nightgal) MCFG_PALETTE_LENGTH(0x10) diff -Nru mame-0.144/src/mame/drivers/ninjakd2.c mame-0.145/src/mame/drivers/ninjakd2.c --- mame-0.144/src/mame/drivers/ninjakd2.c 2012-01-13 15:34:46.000000000 +0000 +++ mame-0.145/src/mame/drivers/ninjakd2.c 2012-02-06 21:30:35.000000000 +0000 @@ -953,11 +953,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.61) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(ninjakd2) - MCFG_SCREEN_EOF(ninjakd2) + MCFG_SCREEN_UPDATE_STATIC(ninjakd2) + MCFG_SCREEN_VBLANK_STATIC(ninjakd2) MCFG_GFXDECODE(ninjakd2) MCFG_PALETTE_LENGTH(0x300) @@ -1028,7 +1027,7 @@ MCFG_VIDEO_START(robokid) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(robokid) + MCFG_SCREEN_UPDATE_STATIC(robokid) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( omegaf, robokid ) @@ -1043,7 +1042,7 @@ /* video hardware */ MCFG_VIDEO_START(omegaf) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(omegaf) + MCFG_SCREEN_UPDATE_STATIC(omegaf) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/ninjaw.c mame-0.145/src/mame/drivers/ninjaw.c --- mame-0.144/src/mame/drivers/ninjaw.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/ninjaw.c 2012-02-06 21:30:35.000000000 +0000 @@ -245,7 +245,8 @@ - Region stored at 0x01fffe.w - Sets : - * 'ninjaw' : region = 0x0003 + * 'ninjaw' : region = 0x0003 + * 'ninjawu' : region = 0x0004 * 'ninjawj' : region = 0x0000 - Coinage relies on the region (code at 0x0013bc) : * 0x0000 (Japan), 0x0001 (?) and 0x0002 (US) use TAITO_COINAGE_JAPAN_OLD @@ -825,28 +826,25 @@ MCFG_DEFAULT_LAYOUT(layout_darius) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_left) MCFG_SCREEN_ADD("mscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_middle) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_right) MCFG_VIDEO_START(ninjaw) @@ -911,28 +909,25 @@ MCFG_DEFAULT_LAYOUT(layout_darius) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_left) MCFG_SCREEN_ADD("mscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_middle) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(ninjaw) + MCFG_SCREEN_UPDATE_STATIC(ninjaw_right) MCFG_VIDEO_START(ninjaw) @@ -976,8 +971,64 @@ ROM_START( ninjaw ) ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */ - ROM_LOAD16_BYTE( "b31-45", 0x00000, 0x10000, CRC(107902c3) SHA1(026f71a918059e3374ae262304a2ee1270f5c5bd) ) - ROM_LOAD16_BYTE( "b31-47", 0x00001, 0x10000, CRC(bd536b1e) SHA1(39c86cbb3a33fc77a0141b5648a1aca862e0a5fd) ) + ROM_LOAD16_BYTE( "b31_45.35", 0x00000, 0x10000, CRC(107902c3) SHA1(026f71a918059e3374ae262304a2ee1270f5c5bd) ) + ROM_LOAD16_BYTE( "b31_47.32", 0x00001, 0x10000, CRC(bd536b1e) SHA1(39c86cbb3a33fc77a0141b5648a1aca862e0a5fd) ) + ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) ) + ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) ) + + ROM_LOAD16_BYTE( "b31_41.5", 0x40000, 0x20000, CRC(0daef28a) SHA1(7c7e16b0eebc589ab99f62ddb98b372596ff5ae6) ) /* data roms ? */ + ROM_LOAD16_BYTE( "b31_39.2", 0x40001, 0x20000, CRC(e9197c3c) SHA1(a7f0ef2b3c4258c09edf05284fec45832a8fb147) ) + ROM_LOAD16_BYTE( "b31_40.6", 0x80000, 0x20000, CRC(2ce0f24e) SHA1(39632397ac7e8457607c32c31fccf1c08d4b2621) ) + ROM_LOAD16_BYTE( "b31_38.3", 0x80001, 0x20000, CRC(bc68cd99) SHA1(bb31ea589339c9f9b61e312e1024b5c8410cdb43) ) + + ROM_REGION( 0x60000, "sub", 0 ) /* 384K for 68000 CPUB code */ + ROM_LOAD16_BYTE( "b31_33.87", 0x00000, 0x10000, CRC(6ce9af44) SHA1(486e332af238c211c3f64f7ead114282661687c4) ) + ROM_LOAD16_BYTE( "b31_36.97", 0x00001, 0x10000, CRC(ba20b0d4) SHA1(fb3dcb7681a95087afac9aa9393765d786243486) ) + ROM_LOAD16_BYTE( "b31_32.86", 0x20000, 0x10000, CRC(e6025fec) SHA1(071f83a9ddebe67bd6c6c2505318e177895163ee) ) + ROM_LOAD16_BYTE( "b31_35.96", 0x20001, 0x10000, CRC(70d9a89f) SHA1(20f846beb052fd8cddcf00c3e42e3304e102a87b) ) + ROM_LOAD16_BYTE( "b31_31.85", 0x40000, 0x10000, CRC(837f47e2) SHA1(88d596f01566456ba18a01afd0a6a7c121d3ca88) ) + ROM_LOAD16_BYTE( "b31_34.95", 0x40001, 0x10000, CRC(d6b5fb2a) SHA1(e3ae0d7ec62740465a90e4939b10341d3866d860) ) + + ROM_REGION( 0x2c000, "audiocpu", 0 ) /* sound cpu */ + ROM_LOAD( "b31_37.11", 0x00000, 0x04000, CRC(0ca5799d) SHA1(6485dde076d15b69b9ee65880dda57ad4f8d129c) ) + ROM_CONTINUE( 0x10000, 0x1c000 ) /* banked stuff */ + + ROM_REGION( 0x100000, "gfx1", 0 ) + ROM_LOAD( "b31-01.23", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 1) */ + ROM_LOAD( "b31-02.24", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) ) + + ROM_REGION( 0x200000, "gfx2", 0 ) + ROM_LOAD( "b31-07.176", 0x000000, 0x80000, CRC(33568cdb) SHA1(87abf56bbbd3659a1bd3e6ce9e43176be7950b41) ) /* OBJ */ + ROM_LOAD( "b31-06.175", 0x080000, 0x80000, CRC(0d59439e) SHA1(54d844492888e7fe2c3bc61afe64f8d47fdee8dc) ) + ROM_LOAD( "b31-05.174", 0x100000, 0x80000, CRC(0a1fc9fb) SHA1(a5d6975fd4f7e689c8cafd7c9cd3787797955779) ) + ROM_LOAD( "b31-04.173", 0x180000, 0x80000, CRC(2e1e4cb5) SHA1(4733cfc015a68e021108a9e1e8ea807b0e7eac7a) ) + + ROM_REGION( 0x100000, "gfx3", 0 ) + ROM_COPY( "gfx1", 0x000000, 0x000000, 0x100000 ) /* SCR (screens 2+) */ + +/* The actual board duplicates the SCR gfx roms for 2nd/3rd TC0100SCN */ +// ROM_LOAD( "b31-01.26", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 2) */ +// ROM_LOAD( "b31-02.27", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) ) +// ROM_LOAD( "b31-01.28", 0x00000, 0x80000, CRC(8e8237a7) SHA1(3e181a153d9b4b7f6a620614ea9022285583a5b5) ) /* SCR (screen 3) */ +// ROM_LOAD( "b31-02.29", 0x80000, 0x80000, CRC(4c3b4e33) SHA1(f99b379be1af085bf102d4d7cf35803e002fe80b) ) + + ROM_REGION( 0x180000, "ymsnd", 0 ) /* ADPCM samples */ + ROM_LOAD( "b31-09.18", 0x000000, 0x80000, CRC(60a73382) SHA1(0ddeb86fcd4d19a58e62bf8564f996d17e36e5c5) ) + ROM_LOAD( "b31-10.17", 0x080000, 0x80000, CRC(c6434aef) SHA1(3348ce87882e3f668aa85bbb517975ec1fc9b6fd) ) + ROM_LOAD( "b31-11.16", 0x100000, 0x80000, CRC(8da531d4) SHA1(525dfab0a0729e9fb6f0e4c8187bf4ce16321b20) ) + + ROM_REGION( 0x80000, "ymsnd.deltat", 0 ) /* Delta-T samples */ + ROM_LOAD( "b31-08.19", 0x000000, 0x80000, CRC(a0a1f87d) SHA1(6b0f8094f3a3ef1ced76984e333e22a17c51af29) ) + + ROM_REGION( 0x01000, "user1", 0 ) /* unknown roms */ + ROM_LOAD( "b31-25.38", 0x00000, 0x200, CRC(a0b4ba48) SHA1(dc9a46366a0cbf63a609f177c3d3ba9675416662) ) + ROM_LOAD( "b31-26.58", 0x00000, 0x200, CRC(13e5fe15) SHA1(c973c7965954a2a0b427908f099592ed89cf0ff0) ) +ROM_END + +ROM_START( ninjawu ) + ROM_REGION( 0xc0000, "maincpu", 0 ) /* 256K for 68000 CPUA code */ + ROM_LOAD16_BYTE( "b31_49.35", 0x00000, 0x10000, CRC(d38b6391) SHA1(4711e059531566b779e95619c47621fdbfba2e56) ) + ROM_LOAD16_BYTE( "b31_48.32", 0x00001, 0x10000, CRC(4b5bb3d8) SHA1(b0e2059e0fe682ef8152690d93392bdd4fda8149) ) ROM_LOAD16_BYTE( "b31_29.34", 0x20000, 0x10000, CRC(f2941a37) SHA1(cf1f231d9caddc903116a8b654f49181ca459697) ) ROM_LOAD16_BYTE( "b31_27.31", 0x20001, 0x10000, CRC(2f3ff642) SHA1(7d6775b51d96b459b163d8fde2385b0e3f5242ca) ) @@ -1133,6 +1184,7 @@ /* Working Games */ // YEAR, NAME, PARENT, MACHINE, INPUT, INIT,MONITOR,COMPANY,FULLNAME,FLAGS -GAME( 1987, ninjaw, 0, ninjaw, ninjaw, 0, ROT0, "Taito Corporation Japan", "The Ninja Warriors (World)", 0 ) -GAME( 1987, ninjawj, ninjaw, ninjaw, ninjawj, 0, ROT0, "Taito Corporation", "The Ninja Warriors (Japan)", 0 ) -GAME( 1989, darius2, 0, darius2, darius2, 0, ROT0, "Taito Corporation", "Darius II (triple screen) (Japan)", 0 ) +GAME( 1987, ninjaw, 0, ninjaw, ninjaw, 0, ROT0, "Taito Corporation Japan", "The Ninja Warriors (World)", 0 ) +GAME( 1987, ninjawj, ninjaw, ninjaw, ninjawj, 0, ROT0, "Taito Corporation", "The Ninja Warriors (Japan)", 0 ) +GAME( 1987, ninjawu, ninjaw, ninjaw, ninjaw, 0, ROT0, "Taito Corporation America (licensed to Romstar)", "The Ninja Warriors (US)", 0 ) /* Uses same coinage as World, see notes */ +GAME( 1989, darius2, 0, darius2, darius2, 0, ROT0, "Taito Corporation", "Darius II (triple screen) (Japan)", 0 ) diff -Nru mame-0.144/src/mame/drivers/nitedrvr.c mame-0.145/src/mame/drivers/nitedrvr.c --- mame-0.144/src/mame/drivers/nitedrvr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/nitedrvr.c 2012-02-06 21:30:35.000000000 +0000 @@ -151,10 +151,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) // how is this derived? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(nitedrvr) + MCFG_SCREEN_UPDATE_STATIC(nitedrvr) MCFG_GFXDECODE(nitedrvr) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/niyanpai.c mame-0.145/src/mame/drivers/niyanpai.c --- mame-0.144/src/mame/drivers/niyanpai.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/niyanpai.c 2012-02-06 21:30:41.000000000 +0000 @@ -885,10 +885,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024, 512) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 240-1) - MCFG_SCREEN_UPDATE(niyanpai) + MCFG_SCREEN_UPDATE_STATIC(niyanpai) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/nmg5.c mame-0.145/src/mame/drivers/nmg5.c --- mame-0.144/src/mame/drivers/nmg5.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nmg5.c 2012-02-06 21:30:39.000000000 +0000 @@ -224,7 +224,7 @@ #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "sound/3812intf.h" - +#include "video/decospr.h" class nmg5_state : public driver_device { @@ -262,14 +262,14 @@ { nmg5_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( bg_videoram_w ) { nmg5_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( nmg5_soundlatch_w ) @@ -302,7 +302,7 @@ if (state->m_gfx_bank != (data & 3)) { state->m_gfx_bank = data & 3; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -827,7 +827,7 @@ INPUT_PORTS_END -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, UINT16 *vram, int color ) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, UINT16 *vram, int color ) { nmg5_state *state = machine.driver_data(); SET_TILE_INFO(0, vram[tile_index] | (state->m_gfx_bank << 16), color, 0); @@ -842,46 +842,12 @@ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - nmg5_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int offs; - - for (offs = 0; offs < state->m_spriteram_size / 2; offs += 4) - { - int sx, sy, code, color, flipx, flipy, height, y; - - sx = spriteram[offs + 2]; - sy = spriteram[offs + 0]; - code = spriteram[offs + 1]; - color = (spriteram[offs + 2] >> 9) & 0xf; - height = 1 << ((spriteram[offs + 0] & 0x0600) >> 9); - flipx = spriteram[offs + 0] & 0x2000; - flipy = spriteram[offs + 0] & 0x4000; - for (y = 0; y < height; y++) - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - code + (flipy ? height-1 - y : y), - color, - flipx,flipy, - sx & 0x1ff,248 - ((sy + 0x10 * (height - y)) & 0x1ff),0); - - /* wrap around */ - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - code + (flipy ? height-1 - y : y), - color, - flipx,flipy, - (sx & 0x1ff) - 512,248 - ((sy + 0x10 * (height - y)) & 0x1ff),0); - } - } -} -static void draw_bitmap( running_machine &machine, bitmap_t *bitmap ) +static void draw_bitmap( running_machine &machine, bitmap_ind16 &bitmap ) { nmg5_state *state = machine.driver_data(); int yyy = 256; @@ -897,13 +863,13 @@ for (x = 0; x < xxx; x++) { pix = (state->m_bitmap[count] & 0xf000) >> 12; - if (pix) *BITMAP_ADDR16(bitmap, y + yoff, x * 4 + 0 + xoff) = pix + 0x300; + if (pix) bitmap.pix16(y + yoff, x * 4 + 0 + xoff) = pix + 0x300; pix = (state->m_bitmap[count] & 0x0f00) >> 8; - if (pix) *BITMAP_ADDR16(bitmap, y + yoff, x * 4 + 1 + xoff) = pix + 0x300; + if (pix) bitmap.pix16(y + yoff, x * 4 + 1 + xoff) = pix + 0x300; pix = (state->m_bitmap[count] & 0x00f0) >> 4; - if (pix) *BITMAP_ADDR16(bitmap, y + yoff, x * 4 + 2 + xoff) = pix + 0x300; + if (pix) bitmap.pix16(y + yoff, x * 4 + 2 + xoff) = pix + 0x300; pix = (state->m_bitmap[count] & 0x000f) >> 0; - if (pix) *BITMAP_ADDR16(bitmap, y + yoff, x * 4 + 3 + xoff) = pix + 0x300; + if (pix) bitmap.pix16(y + yoff, x * 4 + 3 + xoff) = pix + 0x300; count++; } @@ -911,46 +877,46 @@ } -static SCREEN_UPDATE( nmg5 ) +static SCREEN_UPDATE_IND16( nmg5 ) { - nmg5_state *state = screen->machine().driver_data(); + nmg5_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_ram[3] + 9); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_ram[2] + 3); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll_ram[1] + 9); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll_ram[0] - 1); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_ram[3] + 9); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_ram[2] + 3); + state->m_fg_tilemap->set_scrolly(0, state->m_scroll_ram[1] + 9); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll_ram[0] - 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_priority_reg == 0) { - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_bitmap(screen->machine(), bitmap); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_bitmap(screen.machine(), bitmap); } else if (state->m_priority_reg == 1) { - draw_bitmap(screen->machine(), bitmap); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_bitmap(screen.machine(), bitmap); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } else if (state->m_priority_reg == 2) { - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bitmap(screen->machine(), bitmap); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); + draw_bitmap(screen.machine(), bitmap); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } else if (state->m_priority_reg == 3) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bitmap(screen->machine(), bitmap); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); + draw_bitmap(screen.machine(), bitmap); } else if (state->m_priority_reg == 7) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_bitmap(screen->machine(), bitmap); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_bitmap(screen.machine(), bitmap); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); } return 0; } @@ -984,7 +950,7 @@ RGN_FRAC(1,5), 5, { RGN_FRAC(2,5),RGN_FRAC(3,5),RGN_FRAC(1,5),RGN_FRAC(4,5),RGN_FRAC(0,5) }, - { 7,6,5,4,3,2,1,0,135,134,133,132,131,130,129,128 }, + { 128,129,130,131,132,133,134,135, 0,1,2,3,4,5,6,7, }, { 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 }, 32*8 }; @@ -1052,16 +1018,22 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(nmg5) + MCFG_SCREEN_UPDATE_STATIC(nmg5) MCFG_GFXDECODE(nmg5) MCFG_PALETTE_LENGTH(0x400) MCFG_VIDEO_START(nmg5) + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 1); + decospr_device::set_is_bootleg(*device, true); + decospr_device::set_flipallx(*device, 1); + decospr_device::set_offsets(*device, 0,8); + + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/nmk16.c mame-0.145/src/mame/drivers/nmk16.c --- mame-0.144/src/mame/drivers/nmk16.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nmk16.c 2012-02-06 21:30:39.000000000 +0000 @@ -3525,7 +3525,7 @@ cputag_set_input_line(timer.machine(), "maincpu", 4, HOLD_LINE); /* This is either vblank-in or sprite dma irq complete, Vandyke definitely relies that irq fires at scanline ~0 instead of 112 (as per previous - cpu_getiloops() implementation), mostly noticeable with sword collisions and related attract mode behaviour. */ + cpu_getiloops function implementation), mostly noticeable with sword collisions and related attract mode behaviour. */ if(scanline == 0) cputag_set_input_line(timer.machine(), "maincpu", 2, HOLD_LINE); } @@ -3567,11 +3567,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tharrier) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(tharrier) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(tharrier) MCFG_PALETTE_LENGTH(512) @@ -3611,11 +3610,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(manybloc) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(manybloc) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(tharrier) MCFG_PALETTE_LENGTH(512) @@ -3653,11 +3651,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3697,11 +3694,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3730,11 +3726,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bioship) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(bioship) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(bioship) MCFG_PALETTE_LENGTH(1024) @@ -3772,11 +3767,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3817,11 +3811,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3849,11 +3842,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3895,11 +3887,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3925,11 +3916,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tdragon) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(tdragon) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -3969,11 +3959,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -4002,11 +3991,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(strahl) - MCFG_SCREEN_EOF(strahl) + MCFG_SCREEN_UPDATE_STATIC(strahl) + MCFG_SCREEN_VBLANK_STATIC(strahl) MCFG_GFXDECODE(strahl) MCFG_PALETTE_LENGTH(1024) @@ -4044,11 +4032,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hachamf) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(hachamf) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -4087,11 +4074,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -4129,11 +4115,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56.18) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -4171,11 +4156,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gunnail) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(gunnail) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) @@ -4215,11 +4199,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gunnail) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(gunnail) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross2) MCFG_PALETTE_LENGTH(1024) @@ -4258,11 +4241,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gunnail) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(gunnail) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross2) MCFG_PALETTE_LENGTH(1024) @@ -4300,11 +4282,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) // measured MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(gunnail) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(gunnail) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross2) MCFG_PALETTE_LENGTH(1024) @@ -4339,11 +4320,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bjtwin) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(bjtwin) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(bjtwin) MCFG_PALETTE_LENGTH(1024) @@ -4851,11 +4831,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(afega) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(afega) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(stagger1) MCFG_PALETTE_LENGTH(768) @@ -4880,7 +4859,7 @@ /* basic machine hardware */ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(redhawki) + MCFG_SCREEN_UPDATE_STATIC(redhawki) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( redhawkb, stagger1 ) @@ -4889,7 +4868,7 @@ /* video hardware */ MCFG_GFXDECODE(redhawkb) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(redhawkb) + MCFG_SCREEN_UPDATE_STATIC(redhawkb) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( grdnstrm, stagger1 ) @@ -4900,7 +4879,7 @@ MCFG_GFXDECODE(grdnstrm) MCFG_VIDEO_START(firehawk) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(firehawk) + MCFG_SCREEN_UPDATE_STATIC(firehawk) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( grdnstrmk, stagger1 ) @@ -4919,7 +4898,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(bubl2000) + MCFG_SCREEN_UPDATE_STATIC(bubl2000) MACHINE_CONFIG_END static MACHINE_CONFIG_START( firehawk, nmk16_state ) @@ -4936,11 +4915,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(firehawk) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(firehawk) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(grdnstrm) MCFG_PALETTE_LENGTH(768) @@ -4972,11 +4950,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(macross) - MCFG_SCREEN_EOF(nmk) + MCFG_SCREEN_UPDATE_STATIC(macross) + MCFG_SCREEN_VBLANK_STATIC(nmk) MCFG_GFXDECODE(macross) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/norautp.c mame-0.145/src/mame/drivers/norautp.c --- mame-0.144/src/mame/drivers/norautp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/norautp.c 2012-02-06 21:30:33.000000000 +0000 @@ -564,14 +564,14 @@ } -static SCREEN_UPDATE( norautp ) +static SCREEN_UPDATE_IND16( norautp ) { - norautp_state *state = screen->machine().driver_data(); + norautp_state *state = screen.machine().driver_data(); int x, y, count; count = 0; - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); //black pen + bitmap.fill(screen.machine().pens[0], cliprect); //black pen for(y = 0; y < 8; y++) { @@ -583,7 +583,7 @@ int tile = state->m_np_vram[count] & 0x3f; int colour = (state->m_np_vram[count] & 0xc0) >> 6; - drawgfx_opaque(bitmap,cliprect, screen->machine().gfx[1], tile, colour, 0, 0, (x * 32) + 8, y * 32); + drawgfx_opaque(bitmap,cliprect, screen.machine().gfx[1], tile, colour, 0, 0, (x * 32) + 8, y * 32); count+=2; } @@ -595,7 +595,7 @@ int tile = state->m_np_vram[count] & 0x3f; int colour = (state->m_np_vram[count] & 0xc0) >> 6; - drawgfx_opaque(bitmap,cliprect, screen->machine().gfx[0], tile, colour, 0, 0, x * 16, y * 32); + drawgfx_opaque(bitmap,cliprect, screen.machine().gfx[0], tile, colour, 0, 0, x * 16, y * 32); count++; } @@ -1267,10 +1267,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(2*16, 31*16-1, (0*16) + 8, 16*16-1) /* the hardware clips the top 8 pixels */ - MCFG_SCREEN_UPDATE(norautp) + MCFG_SCREEN_UPDATE_STATIC(norautp) MCFG_GFXDECODE(norautp) diff -Nru mame-0.144/src/mame/drivers/nova2001.c mame-0.145/src/mame/drivers/nova2001.c --- mame-0.144/src/mame/drivers/nova2001.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nova2001.c 2012-02-06 21:30:38.000000000 +0000 @@ -692,10 +692,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(nova2001) + MCFG_SCREEN_UPDATE_STATIC(nova2001) MCFG_GFXDECODE(nova2001) MCFG_PALETTE_LENGTH(0x200) @@ -734,10 +733,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1 ) - MCFG_SCREEN_UPDATE(ninjakun) + MCFG_SCREEN_UPDATE_STATIC(ninjakun) MCFG_GFXDECODE(ninjakun) MCFG_PALETTE_LENGTH(0x300) @@ -767,10 +765,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(pkunwar) + MCFG_SCREEN_UPDATE_STATIC(pkunwar) MCFG_GFXDECODE(pkunwar) MCFG_PALETTE_LENGTH(0x200) @@ -807,10 +804,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(raiders5) + MCFG_SCREEN_UPDATE_STATIC(raiders5) MCFG_GFXDECODE(raiders5) MCFG_PALETTE_LENGTH(0x300) diff -Nru mame-0.144/src/mame/drivers/nsm.c mame-0.145/src/mame/drivers/nsm.c --- mame-0.144/src/mame/drivers/nsm.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nsm.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/tms9900/tms9900.h" @@ -5,18 +7,28 @@ { public: nsm_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( nsm_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( nsm_map, AS_PROGRAM, 8, nsm_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( nsm ) INPUT_PORTS_END -static MACHINE_RESET( nsm ) +void nsm_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", TMS9995, 11052000) MCFG_CPU_PROGRAM_MAP(nsm_map) - - MCFG_MACHINE_RESET( nsm ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -54,4 +64,4 @@ / The Games (1985) /-------------------------------------------------------------------*/ -GAME(1985, firebird, 0, nsm, nsm, nsm, ROT0, "NSM", "Hot Fire Birds", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1985, firebird, 0, nsm, nsm, nsm, ROT0, "NSM", "Hot Fire Birds", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/nsmpoker.c mame-0.145/src/mame/drivers/nsmpoker.c --- mame-0.144/src/mame/drivers/nsmpoker.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nsmpoker.c 2012-02-06 21:30:38.000000000 +0000 @@ -85,7 +85,7 @@ { nsmpoker_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -93,7 +93,7 @@ { nsmpoker_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -122,10 +122,10 @@ } -static SCREEN_UPDATE( nsmpoker ) +static SCREEN_UPDATE_IND16( nsmpoker ) { - nsmpoker_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + nsmpoker_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -399,10 +399,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(nsmpoker) + MCFG_SCREEN_UPDATE_STATIC(nsmpoker) MCFG_GFXDECODE(nsmpoker) diff -Nru mame-0.144/src/mame/drivers/nss.c mame-0.145/src/mame/drivers/nss.c --- mame-0.144/src/mame/drivers/nss.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/nss.c 2012-02-06 21:30:35.000000000 +0000 @@ -673,9 +673,8 @@ MCFG_VIDEO_START( snes ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC) - MCFG_SCREEN_UPDATE( snes ) + MCFG_SCREEN_UPDATE_STATIC( snes ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/nwk-tr.c mame-0.145/src/mame/drivers/nwk-tr.c --- mame-0.144/src/mame/drivers/nwk-tr.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/nwk-tr.c 2012-02-06 21:30:34.000000000 +0000 @@ -259,13 +259,13 @@ } -static SCREEN_UPDATE( nwktr ) +static SCREEN_UPDATE_RGB32( nwktr ) { - nwktr_state *state = screen->machine().driver_data(); - device_t *voodoo = screen->machine().device("voodoo"); - device_t *k001604 = screen->machine().device("k001604"); + nwktr_state *state = screen.machine().driver_data(); + device_t *voodoo = screen.machine().device("voodoo"); + device_t *k001604 = screen.machine().device("k001604"); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); voodoo_update(voodoo, bitmap, cliprect); @@ -701,10 +701,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 384) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383) - MCFG_SCREEN_UPDATE(nwktr) + MCFG_SCREEN_UPDATE_STATIC(nwktr) MCFG_PALETTE_LENGTH(65536) diff -Nru mame-0.144/src/mame/drivers/nycaptor.c mame-0.145/src/mame/drivers/nycaptor.c --- mame-0.144/src/mame/drivers/nycaptor.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/nycaptor.c 2012-02-06 21:30:41.000000000 +0000 @@ -868,10 +868,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nycaptor) + MCFG_SCREEN_UPDATE_STATIC(nycaptor) MCFG_GFXDECODE(nycaptor) MCFG_PALETTE_LENGTH(512) @@ -930,10 +929,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nycaptor) + MCFG_SCREEN_UPDATE_STATIC(nycaptor) MCFG_GFXDECODE(nycaptor) MCFG_PALETTE_LENGTH(512) @@ -988,10 +986,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(nycaptor) + MCFG_SCREEN_UPDATE_STATIC(nycaptor) MCFG_GFXDECODE(nycaptor) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/nyny.c mame-0.145/src/mame/drivers/nyny.c --- mame-0.144/src/mame/drivers/nyny.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/nyny.c 2012-02-06 21:30:39.000000000 +0000 @@ -350,7 +350,7 @@ else color = bit2 ? color2 : 0; - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; x += 1; } @@ -377,15 +377,15 @@ pen_t *pens = (pen_t *)param; UINT16 delay_counter = state->m_star_delay_counter; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { /* check if the star status */ if (state->m_star_enable && - (*BITMAP_ADDR32(bitmap, y, x) == pens[0]) && + (bitmap.pix32(y, x) == pens[0]) && ((state->m_star_shift_reg & 0x80ff) == 0x00ff) && (((y & 0x01) ^ state->m_flipscreen) ^ (((x & 0x08) >> 3) ^ state->m_flipscreen))) { @@ -393,7 +393,7 @@ ((state->m_star_shift_reg & 0x0400) >> 9) | /* G */ ((state->m_star_shift_reg & 0x1000) >> 10); /* B */ - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; } if (delay_counter == 0) @@ -427,16 +427,6 @@ }; -static SCREEN_UPDATE( nyny ) -{ - nyny_state *state = screen->machine().driver_data(); - - state->m_mc6845->update(bitmap, cliprect); - - return 0; -} - - /************************************* * @@ -732,9 +722,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(nyny) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/offtwall.c mame-0.145/src/mame/drivers/offtwall.c --- mame-0.144/src/mame/drivers/offtwall.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/offtwall.c 2012-02-06 21:30:40.000000000 +0000 @@ -420,11 +420,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a VAD chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(offtwall) + MCFG_SCREEN_UPDATE_STATIC(offtwall) MCFG_VIDEO_START(offtwall) diff -Nru mame-0.144/src/mame/drivers/ohmygod.c mame-0.145/src/mame/drivers/ohmygod.c --- mame-0.144/src/mame/drivers/ohmygod.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ohmygod.c 2012-02-06 21:30:42.000000000 +0000 @@ -333,10 +333,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 0*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(ohmygod) + MCFG_SCREEN_UPDATE_STATIC(ohmygod) MCFG_GFXDECODE(ohmygod) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/ojankohs.c mame-0.145/src/mame/drivers/ojankohs.c --- mame-0.144/src/mame/drivers/ojankohs.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ojankohs.c 2012-02-06 21:30:33.000000000 +0000 @@ -873,10 +873,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1) - MCFG_SCREEN_UPDATE(ojankohs) + MCFG_SCREEN_UPDATE_STATIC(ojankohs) MCFG_GFXDECODE(ojankohs) MCFG_PALETTE_LENGTH(1024) @@ -911,10 +910,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1) - MCFG_SCREEN_UPDATE(ojankohs) + MCFG_SCREEN_UPDATE_STATIC(ojankohs) MCFG_GFXDECODE(ojankohs) MCFG_PALETTE_LENGTH(1024) @@ -950,10 +948,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 288-1, 0, 224-1) - MCFG_SCREEN_UPDATE(ojankohs) + MCFG_SCREEN_UPDATE_STATIC(ojankohs) MCFG_GFXDECODE(ojankohs) MCFG_PALETTE_LENGTH(1024) @@ -988,10 +985,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 8, 248-1) - MCFG_SCREEN_UPDATE(ojankoc) + MCFG_SCREEN_UPDATE_STATIC(ojankoc) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/olibochu.c mame-0.145/src/mame/drivers/olibochu.c --- mame-0.144/src/mame/drivers/olibochu.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/olibochu.c 2012-02-06 21:30:35.000000000 +0000 @@ -120,14 +120,14 @@ { olibochu_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( olibochu_colorram_w ) { olibochu_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( olibochu_flipscreen_w ) @@ -135,7 +135,7 @@ if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* other bits are used, but unknown */ @@ -158,7 +158,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { olibochu_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -218,11 +218,11 @@ } } -static SCREEN_UPDATE( olibochu ) +static SCREEN_UPDATE_IND16( olibochu ) { - olibochu_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + olibochu_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -458,10 +458,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(olibochu) + MCFG_SCREEN_UPDATE_STATIC(olibochu) MCFG_GFXDECODE(olibochu) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/omegrace.c mame-0.145/src/mame/drivers/omegrace.c --- mame-0.144/src/mame/drivers/omegrace.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/omegrace.c 2012-02-06 21:30:35.000000000 +0000 @@ -504,7 +504,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(522, 1566, 522, 1566) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(dvg) diff -Nru mame-0.144/src/mame/drivers/oneshot.c mame-0.145/src/mame/drivers/oneshot.c --- mame-0.144/src/mame/drivers/oneshot.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/oneshot.c 2012-02-06 21:30:36.000000000 +0000 @@ -390,10 +390,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 20*16-1, 0*16, 15*16-1) - MCFG_SCREEN_UPDATE(oneshot) + MCFG_SCREEN_UPDATE_STATIC(oneshot) MCFG_GFXDECODE(oneshot) MCFG_PALETTE_LENGTH(0x400) @@ -416,7 +415,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(maddonna) // no crosshair + MCFG_SCREEN_UPDATE_STATIC(maddonna) // no crosshair MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/onetwo.c mame-0.145/src/mame/drivers/onetwo.c --- mame-0.144/src/mame/drivers/onetwo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/onetwo.c 2012-02-06 21:30:37.000000000 +0000 @@ -90,10 +90,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); } -static SCREEN_UPDATE( onetwo ) +static SCREEN_UPDATE_IND16( onetwo ) { - onetwo_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + onetwo_state *state = screen.machine().driver_data(); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -107,7 +107,7 @@ { onetwo_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } static WRITE8_HANDLER( onetwo_cpubank_w ) @@ -369,10 +369,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(16)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(onetwo) + MCFG_SCREEN_UPDATE_STATIC(onetwo) MCFG_GFXDECODE(onetwo) MCFG_PALETTE_LENGTH(0x80) diff -Nru mame-0.144/src/mame/drivers/opwolf.c mame-0.145/src/mame/drivers/opwolf.c --- mame-0.144/src/mame/drivers/opwolf.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/opwolf.c 2012-02-06 21:30:42.000000000 +0000 @@ -754,10 +754,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(opwolf) + MCFG_SCREEN_UPDATE_STATIC(opwolf) MCFG_GFXDECODE(opwolf) MCFG_PALETTE_LENGTH(8192) @@ -809,10 +808,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(opwolf) + MCFG_SCREEN_UPDATE_STATIC(opwolf) MCFG_GFXDECODE(opwolfb) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/orbit.c mame-0.145/src/mame/drivers/orbit.c --- mame-0.144/src/mame/drivers/orbit.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/orbit.c 2012-02-06 21:30:41.000000000 +0000 @@ -312,9 +312,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2, 384*2, 0, 256*2, 261*2, 0, 240*2) - MCFG_SCREEN_UPDATE(orbit) + MCFG_SCREEN_UPDATE_STATIC(orbit) MCFG_GFXDECODE(orbit) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/othello.c mame-0.145/src/mame/drivers/othello.c --- mame-0.144/src/mame/drivers/othello.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/othello.c 2012-02-06 21:30:35.000000000 +0000 @@ -79,6 +79,7 @@ static MC6845_UPDATE_ROW( update_row ) { othello_state *state = device->machine().driver_data(); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); int cx, x; UINT32 data_address; UINT32 tmp; @@ -92,7 +93,7 @@ for(x = 0; x < TILE_WIDTH; ++x) { - *BITMAP_ADDR16(bitmap, y, (cx * TILE_WIDTH + x) ^ 1) = tmp & 0x0f; + bitmap.pix32(y, (cx * TILE_WIDTH + x) ^ 1) = palette[tmp & 0x0f]; tmp >>= 4; } } @@ -116,14 +117,6 @@ palette_set_color(machine, 0x0f, MAKE_RGB(0xff, 0xff, 0xff)); } -static SCREEN_UPDATE( othello ) -{ - othello_state *state = screen->machine().driver_data(); - - state->m_mc6845->update(bitmap, cliprect); - return 0; -} - static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x8000, 0x97ff) AM_NOP /* not populated */ @@ -432,10 +425,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*6, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*6-1, 0*8, 64*8-1) - MCFG_SCREEN_UPDATE(othello) + MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update) MCFG_PALETTE_LENGTH(0x10) MCFG_PALETTE_INIT(othello) diff -Nru mame-0.144/src/mame/drivers/othldrby.c mame-0.145/src/mame/drivers/othldrby.c --- mame-0.144/src/mame/drivers/othldrby.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/othldrby.c 2012-02-06 21:30:39.000000000 +0000 @@ -251,11 +251,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, (64-12)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(othldrby) - MCFG_SCREEN_EOF(othldrby) + MCFG_SCREEN_UPDATE_STATIC(othldrby) + MCFG_SCREEN_VBLANK_STATIC(othldrby) MCFG_GFXDECODE(othldrby) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/othunder.c mame-0.145/src/mame/drivers/othunder.c --- mame-0.144/src/mame/drivers/othunder.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/othunder.c 2012-02-06 21:30:33.000000000 +0000 @@ -735,10 +735,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(othunder) + MCFG_SCREEN_UPDATE_STATIC(othunder) MCFG_GFXDECODE(othunder) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/overdriv.c mame-0.145/src/mame/drivers/overdriv.c --- mame-0.144/src/mame/drivers/overdriv.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/overdriv.c 2012-02-06 21:30:41.000000000 +0000 @@ -79,7 +79,7 @@ int scanline = param; /* TODO: irqs routines are TOO slow right now, it ends up firing spurious irqs for whatever reason (shared ram fighting?) */ - /* this is a temporary solution to get rid of deprecat.h and the crashes, but also makes the game timer to be too slow */ + /* this is a temporary solution to get rid of deprecat lib and the crashes, but also makes the game timer to be too slow */ if(scanline == 256 && timer.machine().primary_screen->frame_number() & 1) // vblank-out irq cputag_set_input_line(timer.machine(), "maincpu", 4, HOLD_LINE); else if((scanline % 128) == 0) // timer irq @@ -356,10 +356,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 40*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 0*8, 32*8-1 ) - MCFG_SCREEN_UPDATE(overdriv) + MCFG_SCREEN_UPDATE_STATIC(overdriv) // MCFG_GFXDECODE(overdriv) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/pachifev.c mame-0.145/src/mame/drivers/pachifev.c --- mame-0.144/src/mame/drivers/pachifev.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/pachifev.c 2012-02-06 21:30:38.000000000 +0000 @@ -337,14 +337,6 @@ DEVCB_NULL }; -static SCREEN_UPDATE( pachifev ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - static MACHINE_START( pachifev) { pachifev_state *state = machine.driver_data(); @@ -376,7 +368,7 @@ /* video hardware */ MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, pachifev_tms9928a_interface ) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( pachifev ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -385,9 +377,9 @@ MCFG_SOUND_CONFIG(msm5205_config) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) #endif - MCFG_SOUND_ADD("sn76_1", SN76489A, XTAL_10_738635MHz/3) /* guess */ + MCFG_SOUND_ADD("sn76_1", Y2404, XTAL_10_738635MHz/3) /* guess */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) - MCFG_SOUND_ADD("sn76_2", SN76489A, XTAL_10_738635MHz/3) /* guess */ + MCFG_SOUND_ADD("sn76_2", Y2404, XTAL_10_738635MHz/3) /* guess */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/pacland.c mame-0.145/src/mame/drivers/pacland.c --- mame-0.144/src/mame/drivers/pacland.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/pacland.c 2012-02-06 21:30:41.000000000 +0000 @@ -189,7 +189,7 @@ int bit = !BIT(offset,11); /* can't use flip_screen_set(space->machine(), ) because the visible area is asymmetrical */ flip_screen_set_no_update(space->machine(), bit); - tilemap_set_flip_all(space->machine(),flip_screen_get(space->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(flip_screen_get(space->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } @@ -219,16 +219,18 @@ static WRITE8_HANDLER( pacland_irq_1_ctrl_w ) { + pacland_state *state = space->machine().driver_data(); int bit = !BIT(offset, 11); - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } static WRITE8_HANDLER( pacland_irq_2_ctrl_w ) { + pacland_state *state = space->machine().driver_data(); int bit = !BIT(offset, 13); - cpu_interrupt_enable(space->machine().device("mcu"), bit); + state->m_mcu_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "mcu", 0, CLEAR_LINE); } @@ -279,49 +281,49 @@ static INPUT_PORTS_START( pacland ) - PORT_START("DSWA") /* DSWA */ - PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Lives ) ) + PORT_START("DSWA") + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SWA:1" ) + PORT_DIPNAME( 0x60, 0x60, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWA:3,2") PORT_DIPSETTING( 0x40, "2" ) PORT_DIPSETTING( 0x60, "3" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:5,4") PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x18, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7") PORT_DIPSETTING( 0x00, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) - PORT_START("DSWB") /* DSWB */ - PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0xe0, "30K 80K 130K 300K 500K 1M" ) - PORT_DIPSETTING( 0x80, "30K 80K every 100K" ) - PORT_DIPSETTING( 0x40, "30K 80K 150K" ) - PORT_DIPSETTING( 0xc0, "30K 100K 200K 400K 600K 1M" ) - PORT_DIPSETTING( 0xa0, "40K 100K 180K 300K 500K 1M" ) - PORT_DIPSETTING( 0x20, "40K 100K 200K" ) - PORT_DIPSETTING( 0x00, "40K" ) - PORT_DIPSETTING( 0x60, "50K 150K every 200K" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) + PORT_START("DSWB") + PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SWB:3,2,1") + PORT_DIPSETTING( 0xe0, "30K 80K 130K 300K 500K 1M" ) // "A" + PORT_DIPSETTING( 0x80, "30K 80K every 100K" ) // "D" + PORT_DIPSETTING( 0x40, "30K 80K 150K" ) // "F" + PORT_DIPSETTING( 0xc0, "30K 100K 200K 400K 600K 1M" ) // "B" + PORT_DIPSETTING( 0xa0, "40K 100K 180K 300K 500K 1M" ) // "C" + PORT_DIPSETTING( 0x20, "40K 100K 200K" ) // "G" + PORT_DIPSETTING( 0x00, "40K" ) // "H" + PORT_DIPSETTING( 0x60, "50K 150K every 200K" ) // "E" + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SWB:5,4") PORT_DIPSETTING( 0x10, "B (Easy)" ) PORT_DIPSETTING( 0x18, "A (Average)" ) PORT_DIPSETTING( 0x08, "C (Hard)" ) PORT_DIPSETTING( 0x00, "D (Very Hard)" ) - PORT_DIPNAME( 0x04, 0x04, "Round Select" ) + PORT_DIPNAME( 0x04, 0x04, "Round Select" ) PORT_DIPLOCATION("SWB:6") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Freeze" ) + PORT_DIPNAME( 0x02, 0x02, "Freeze" ) PORT_DIPLOCATION("SWB:7") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x01, 0x01, "Trip Select" ) + PORT_DIPNAME( 0x01, 0x01, "Trip Select" ) PORT_DIPLOCATION("SWB:8") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -396,19 +398,33 @@ 0 /* stereo */ }; +static INTERRUPT_GEN( main_vblank_irq ) +{ + pacland_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + cputag_set_input_line(device->machine(), "maincpu", 0, ASSERT_LINE); +} +static INTERRUPT_GEN( mcu_vblank_irq ) +{ + pacland_state *state = device->machine().driver_data(); + + if(state->m_mcu_irq_mask) + cputag_set_input_line(device->machine(), "mcu", 0, ASSERT_LINE); +} static MACHINE_CONFIG_START( pacland, pacland_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 49152000/32) /* 1.536 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("mcu", HD63701, 49152000/8) /* 1.536 MHz? */ MCFG_CPU_PROGRAM_MAP(mcu_map) MCFG_CPU_IO_MAP(mcu_port_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", mcu_vblank_irq) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* we need heavy synching between the MCU and the CPU */ @@ -416,10 +432,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(3*8, 39*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pacland) + MCFG_SCREEN_UPDATE_STATIC(pacland) MCFG_GFXDECODE(pacland) MCFG_PALETTE_LENGTH(256*4+256*4+64*16) diff -Nru mame-0.144/src/mame/drivers/pacman.c mame-0.145/src/mame/drivers/pacman.c --- mame-0.144/src/mame/drivers/pacman.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/pacman.c 2012-02-06 21:30:35.000000000 +0000 @@ -399,7 +399,7 @@ /* - The piranha board has a sync bus controler card similar to Midway's pacman. It + The piranha board has a sync bus controller card similar to Midway's pacman. It stores the LSB of the interrupt vector using port 00 but it alters the byte to prevent it from running on normal pacman hardware and vice versa. I wrote a program to print out the even numbers and the vectors they convert to. Thanks to Dave France for @@ -875,6 +875,13 @@ * *************************************/ +static WRITE8_HANDLER( irq_mask_w ) +{ + pacman_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} + static ADDRESS_MAP_START( pacman_map, AS_PROGRAM, 8 ) //A lot of games don't have an a15 at the cpu. Generally only games with a cpu daughter board can access the full 32k of romspace. AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM @@ -883,7 +890,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -903,6 +910,30 @@ // The Pacman code uses $5004 and $5005 for LED's and $5007 for coin lockout. This hardware does not // exist on any Pacman or Puckman board I have seen. DW +static ADDRESS_MAP_START( birdiy_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_MIRROR(0x8000) AM_ROM + AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, m_videoram) + AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, m_colorram) +// AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP + AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM + AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) + AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) +// AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) +// AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP + AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) +// AM_RANGE(0x5004, 0x5005) AM_MIRROR(0xaf38) AM_WRITENOP // AM_WRITE(pacman_leds_w) +// AM_RANGE(0x5006, 0x5006) AM_MIRROR(0xaf38) AM_WRITENOP // AM_WRITE(pacman_coin_lockout_global_w) + AM_RANGE(0x5007, 0x5007) AM_MIRROR(0xaf38) AM_WRITE(pacman_coin_counter_w) + AM_RANGE(0x5080, 0x509f) AM_MIRROR(0xaf00) AM_DEVWRITE("namco", pacman_sound_w) + AM_RANGE(0x50a0, 0x50af) AM_MIRROR(0xaf00) AM_WRITEONLY AM_BASE_GENERIC(spriteram2) +// AM_RANGE(0x5070, 0x507f) AM_MIRROR(0xaf00) AM_WRITENOP +// AM_RANGE(0x5080, 0x5080) AM_MIRROR(0xaf3f) AM_WRITENOP + AM_RANGE(0x50c0, 0x50c0) AM_MIRROR(0xaf3f) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf3f) AM_READ_PORT("IN0") /* IN0 */ + AM_RANGE(0x5040, 0x5040) AM_MIRROR(0xaf3f) AM_READ_PORT("IN1") /* IN1 */ + AM_RANGE(0x5080, 0x5080) AM_MIRROR(0xaf3f) AM_READ_PORT("DSW1") /* DSW1 */ + AM_RANGE(0x50c0, 0x50c0) AM_MIRROR(0xaf3f) AM_READ_PORT("DSW2") /* DSW2 */ +ADDRESS_MAP_END static ADDRESS_MAP_START( mspacman_map, AS_PROGRAM, 8 ) AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, m_videoram) @@ -910,7 +941,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -950,7 +981,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -988,7 +1019,7 @@ AM_RANGE(0x5080, 0x5080) AM_MIRROR(0xaf3f) AM_WRITENOP AM_RANGE(0x50c0, 0x50c0) AM_MIRROR(0xaf00) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x50c1, 0x50c1) AM_MIRROR(0xaf00) AM_WRITE(pacman_flipscreen_w) - AM_RANGE(0x50c2, 0x50c2) AM_MIRROR(0xaf00) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x50c2, 0x50c2) AM_MIRROR(0xaf00) AM_WRITE(irq_mask_w) AM_RANGE(0x50c3, 0x50ff) AM_MIRROR(0xaf00) AM_WRITENOP AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf3f) AM_READ_PORT("IN0") /* IN0 */ AM_RANGE(0x5040, 0x5040) AM_MIRROR(0xaf3f) AM_READ_PORT("IN1") /* IN1 */ @@ -1008,7 +1039,7 @@ AM_RANGE(0x4400, 0x47ff) AM_MIRROR(0xa000) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, m_colorram) AM_RANGE(0x4800, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) // AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP /* unknown */ AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -1039,7 +1070,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -1093,7 +1124,7 @@ AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, m_videoram) AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, m_colorram) AM_RANGE(0x4c00, 0x4fff) AM_RAM - AM_RANGE(0x5000, 0x5000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5003, 0x5003) AM_WRITE(pacman_flipscreen_w) AM_RANGE(0x5007, 0x5007) AM_WRITE(pacman_coin_counter_w) @@ -1120,7 +1151,7 @@ AM_RANGE(0x4000, 0x43ff) AM_RAM_WRITE(pacman_videoram_w) AM_BASE_MEMBER(pacman_state, m_videoram) AM_RANGE(0x4400, 0x47ff) AM_RAM_WRITE(pacman_colorram_w) AM_BASE_MEMBER(pacman_state, m_colorram) AM_RANGE(0x4c00, 0x4fff) AM_RAM - AM_RANGE(0x5000, 0x5000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5003, 0x5003) AM_WRITE(pacman_flipscreen_w) AM_RANGE(0x5007, 0x5007) AM_WRITENOP /*?*/ @@ -1143,7 +1174,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -1170,7 +1201,7 @@ AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0xa000) AM_READ(pacman_read_nop) AM_WRITENOP AM_RANGE(0x4c00, 0x4fef) AM_MIRROR(0xa000) AM_RAM AM_RANGE(0x4ff0, 0x4fff) AM_MIRROR(0xa000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) - AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x5000, 0x5000) AM_MIRROR(0xaf38) AM_WRITE(irq_mask_w) AM_RANGE(0x5001, 0x5001) AM_MIRROR(0xaf38) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x5002, 0x5002) AM_MIRROR(0xaf38) AM_WRITENOP AM_RANGE(0x5003, 0x5003) AM_MIRROR(0xaf38) AM_WRITE(pacman_flipscreen_w) @@ -1305,27 +1336,27 @@ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x03, 0x01, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW:1,2") PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW:3,4") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x04, "2" ) PORT_DIPSETTING( 0x08, "3" ) PORT_DIPSETTING( 0x0c, "5" ) - PORT_DIPNAME( 0x30, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW:5,6") PORT_DIPSETTING( 0x00, "10000" ) PORT_DIPSETTING( 0x10, "15000" ) PORT_DIPSETTING( 0x20, "20000" ) PORT_DIPSETTING( 0x30, DEF_STR( None ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW:7") PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) PORT_DIPNAME( 0x80, 0x80, "Ghost Names" ) PORT_DIPSETTING( 0x80, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Alternate ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Alternate ) ) PORT_DIPLOCATION("SW:8") PORT_START("DSW2") PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -3106,13 +3137,29 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + pacman_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + +static INTERRUPT_GEN( vblank_nmi ) +{ + pacman_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( pacman, pacman_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(pacman_map) MCFG_CPU_IO_MAP(writeport) - MCFG_CPU_VBLANK_INT("screen",irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen",vblank_irq) MCFG_WATCHDOG_VBLANK_INIT(16) /* video hardware */ @@ -3120,9 +3167,8 @@ MCFG_PALETTE_LENGTH(128*4) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(pacman) + MCFG_SCREEN_UPDATE_STATIC(pacman) MCFG_PALETTE_INIT(pacman) MCFG_VIDEO_START(pacman) @@ -3135,6 +3181,18 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( birdiy, pacman ) + + /* basic machine hardware */ + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(birdiy_map) + MCFG_CPU_IO_MAP(0) + + MCFG_VIDEO_START(birdiy) +MACHINE_CONFIG_END + + + static MACHINE_CONFIG_DERIVED( piranha, pacman ) @@ -3173,7 +3231,6 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(alibaba_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) MACHINE_CONFIG_END @@ -3183,7 +3240,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(dremshpr_map) MCFG_CPU_IO_MAP(dremshpr_portmap) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_nmi) /* sound hardware */ MCFG_SOUND_REPLACE("namco", AY8910, 14318000/8) @@ -3221,7 +3278,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(dremshpr_map) MCFG_CPU_IO_MAP(vanvan_portmap) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_nmi) /* video hardware */ MCFG_SCREEN_MODIFY("screen") @@ -3241,7 +3298,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(bigbucks_map) MCFG_CPU_IO_MAP(bigbucks_portmap) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,20*60) + MCFG_CPU_PERIODIC_INT(vblank_irq,20*60) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) @@ -3262,7 +3319,7 @@ MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(s2650games) + MCFG_SCREEN_UPDATE_STATIC(s2650games) MCFG_VIDEO_START(s2650games) @@ -3314,7 +3371,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(mschamp_map) MCFG_CPU_IO_MAP(mschamp_portmap) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_RESET(mschamp) MACHINE_CONFIG_END @@ -3602,6 +3659,32 @@ ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */ ROM_END +ROM_START( crockman ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "p1.6e", 0x0000, 0x0800, CRC(2c0fa0ab) SHA1(37680e4502771ae69d51d07ce43f65b9b2dd2a49) ) + ROM_LOAD( "p5.6k", 0x0800, 0x0800, CRC(afeca2f1) SHA1(1e6d6c75eeb3a354ce2dc88da62caf9e7d53d0cb) ) + ROM_LOAD( "p2.6f", 0x1000, 0x0800, CRC(7d177853) SHA1(9b5ddaaa8b564654f97af193dbcc29f81f230a25) ) + ROM_LOAD( "p6.6m", 0x1800, 0x0800, CRC(d3e8914c) SHA1(c2f00e1773c6864435f29c8b7f44f2ef85d227d3) ) + ROM_LOAD( "p3.6h", 0x2000, 0x0800, CRC(9045a44c) SHA1(a97d7016effbd2ace9a7d92ceb04a6ce18fb42f9) ) + ROM_LOAD( "p7.6n", 0x2800, 0x0800, CRC(93f344c5) SHA1(987c7fa18a774a47c045fa1dc7dff37457cb8983) ) + ROM_LOAD( "p4.6j", 0x3000, 0x0800, CRC(bed4a077) SHA1(39ac1d4d2acf4752ff7f9839f8f0d1974e023fab) ) + ROM_LOAD( "p8.6p", 0x3800, 0x0800, CRC(800be41e) SHA1(6f40e741d95c2cfe1b217f1061da3497b4c2a153) ) + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "p9.5e", 0x0000, 0x0800, CRC(a10218c4) SHA1(fa48f780ddbef37d0ef58f301c8783668843eab6) ) + ROM_LOAD( "p11.5h", 0x0800, 0x0800, CRC(3591b89d) SHA1(79bb456be6c39c1ccd7d077fbe181523131fb300) ) + ROM_LOAD( "p10.5f", 0x1000, 0x0800, CRC(9e39323a) SHA1(be933e691df4dbe7d12123913c3b7b7b585b7a35) ) + ROM_LOAD( "p12.5j", 0x1800, 0x0800, CRC(1b1d9096) SHA1(53771c573051db43e7185b1d188533056290a620) ) + + ROM_REGION( 0x0120, "proms", 0 ) + ROM_LOAD( "82s123.7f", 0x0000, 0x0020, CRC(2fc650bd) SHA1(8d0268dee78e47c712202b0ec4f1f51109b1f2a5) ) + ROM_LOAD( "82s126.4a", 0x0020, 0x0100, CRC(3eb3a8e4) SHA1(19097b5f60d1030f8b82d9f1d3a241f93e5c75d6) ) + + ROM_REGION( 0x0200, "namco", 0 ) /* sound PROMs */ + ROM_LOAD( "82s126.1m", 0x0000, 0x0100, CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) ) + ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */ +ROM_END + ROM_START( puckmanh ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "pm01.6e", 0x0000, 0x1000, CRC(5fe8610a) SHA1(d63eaebd85e10aa6c27bb7f47642dd403eeb6934) ) @@ -4452,7 +4535,7 @@ ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD( "g38205.5d", 0x0000, 0x1000, CRC(03b1b4c7) SHA1(a90b2fbaee2888ee4f0bcdf80a069c8594ef5ea1) ) /* this one has a (c) sign */ - ROM_LOAD( "e5", 0x1000, 0x1000, CRC(a42b5201) SHA1(2e5cede3b6039c7bd5230de27d02aaa3f35a7b64) ) + ROM_LOAD( "g38206.5e", 0x1000, 0x1000, CRC(a42b5201) SHA1(2e5cede3b6039c7bd5230de27d02aaa3f35a7b64) ) ROM_REGION( 0x0120, "proms", 0 ) ROM_LOAD( "82s123.7f", 0x0000, 0x0020, CRC(2fc650bd) SHA1(8d0268dee78e47c712202b0ec4f1f51109b1f2a5) ) @@ -4463,13 +4546,31 @@ ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */ ROM_END -/* It's just a decrypted version of Eyes with the copyright changes... - roms marked with a comment were in the set but we're not using them - This is only supported because it's by Zaccaria, a known manufacturer of original games - */ ROM_START( eyeszac ) ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.7d", 0x0000, 0x1000, BAD_DUMP CRC(568851aa) SHA1(a97963556a6d77400afaafd73bcc32cb7f3a54d2) ) // 2532 vs 2732 problem, (near)identical halves + ROM_LOAD( "2.7f", 0x1000, 0x1000, BAD_DUMP CRC(9a0dba3b) SHA1(9f66f814bc2d483488df8918d872c7d6ce1bea3d) ) // 2532 vs 2732 problem, 1st half empty + ROM_LOAD( "3.7h", 0x2000, 0x1000, BAD_DUMP CRC(5a12aa81) SHA1(1adb1b033066cabbd62a5d33012ed1c66b955943) ) // 2532 vs 2732 problem, (near)identical halves + ROM_LOAD( "4.7j", 0x3000, 0x1000, BAD_DUMP CRC(b11958a1) SHA1(fa66fec80594f313f605e2b904dfe34693a1aa7d) ) // 2532 vs 2732 problem, (near)identical halves + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "5.5d", 0x0000, 0x1000, BAD_DUMP CRC(7b2c4d53) SHA1(82e1a70c5cb76519dca252cfcea2a69c3601e36f) ) // 2532 vs 2732 problem, (near)identical halves + ROM_LOAD( "6.5f", 0x1000, 0x1000, BAD_DUMP CRC(bccb4f1a) SHA1(0abf73b78a95b7e911480d41e0136dbc635b4a34) ) // 2532 vs 2732 problem, (near)identical halves + + ROM_REGION( 0x0120, "proms", 0 ) + ROM_LOAD( "82s123.7f", 0x0000, 0x0020, CRC(2fc650bd) SHA1(8d0268dee78e47c712202b0ec4f1f51109b1f2a5) ) // taken from parent + ROM_LOAD( "82s129.4a", 0x0020, 0x0100, CRC(d8d78829) SHA1(19820d1651423210083a087fb70ebea73ad34951) ) // taken from parent + + ROM_REGION( 0x0200, "namco", 0 ) /* sound PROMs */ + ROM_LOAD( "82s126.1m", 0x0000, 0x0100, CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) ) // taken from parent + ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) // taken from parent +ROM_END + +/* It's just a decrypted version of Eyes with the copyright changes... + roms marked with a comment were in the set but we're not using them */ +ROM_START( eyeszacb ) + ROM_REGION( 0x10000, "maincpu", 0 ) /**/ROM_LOAD( "11.bin", 0x0000, 0x0800, CRC(69c1602a) SHA1(47b0935406b7ee2f414de58da1d4e81c6277a0c2) ) // "no diagnostics, bad custom??" (unused) ROM_LOAD( "1.bin", 0x0000, 0x0800, CRC(a4a9d7a0) SHA1(f0b807d2fa347e50df52971aa7539a88f342bad6) ) ROM_LOAD( "5.bin", 0x0800, 0x0800, CRC(c32b3f73) SHA1(80d2e987f0318b984e5c7c4d0b5faa262eebeca4) ) @@ -4496,6 +4597,52 @@ ROM_LOAD( "82s126.3m", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */ ROM_END + + +/* +Birdyi by Mama Top + +Pcb marked Mama.Top MDK-13V-0 FCC Made in japan + +1x 18.432mhz OSC +1x Z80 LH0080 by Sharp running at 3.069mhz (18.432mhz/6) +6x dynamic rams HN472114P-3 near the CPU +1x dipswitch +6x HN462732 eproms +4x 82s129N proms +1x DIL 18 pin chip with markings scratched out in position 7M +1x HA1386 amplifier +No sound chip, probably made of discrete logic? + +Note: the marking MDK-xxV-x is sometimes found on Nanao manufactured pcbs for Irem, so it very +likely that the board was manufactured by Nanao +(example: Major Title and Gussun Oyoyo are marked MDK-311V-0, M92 and M107 pcbs are marked MDK-321-V0) + +Board supplied by Alberto Grego +Dumped by Corrado Tomaselli +*/ + +ROM_START( birdiy ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "a6.6a", 0x0000, 0x001000, CRC(3a58f8ad) SHA1(39e990ad4ee1fdec248665149bdb1072c8c01a9a) ) + ROM_LOAD( "c6.6c", 0x1000, 0x001000, CRC(fec61ea2) SHA1(f7ff528d2bcede2434d0a33ee0193b50113ef720) ) + ROM_LOAD( "a4.4a", 0x2000, 0x001000, CRC(3392783b) SHA1(e477f4284fd5b6c9f3619bd35cee6dbe8a2456b8) ) + ROM_LOAD( "c4.4c", 0x3000, 0x001000, CRC(2391d83d) SHA1(6933f1e11a7a84c26a3a45b240e55157a2400e9c) ) + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "c1.1c", 0x0000, 0x001000, CRC(8f6bf54f) SHA1(6e09a9c2b143908766837529b174f97dd5058b53) ) + ROM_LOAD( "c3.3c", 0x1000, 0x001000, CRC(10b55440) SHA1(4f3cf5d8954725cf791146abf8918c43138602e1) ) + + ROM_REGION( 0x0120, "proms", 0 ) + ROM_LOAD( "n82s123n.10n", 0x0000, 0x0020, CRC(ff344446) SHA1(45eb37533da8912645a089b014f3b3384702114a) ) + ROM_LOAD( "n82s129n.9m", 0x0020, 0x0100, CRC(63efb927) SHA1(5c144a613fc4960a1dfd7ead89e7fee258a63171) ) + + ROM_REGION( 0x0200, "namco", 0 ) /* sound PROMs */ + ROM_LOAD( "n82s129n.4k", 0x0000, 0x0100, CRC(a9cc86bf) SHA1(bbcec0570aeceb582ff8238a4bc8546a23430081) ) + ROM_LOAD( "n82s129n.6l", 0x0100, 0x0100, CRC(77245b66) SHA1(0c4d0bee858b97632411c440bea6948a74759746) ) /* timing - not used */ +ROM_END + + ROM_START( mrtnt ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "tnt.1", 0x0000, 0x1000, CRC(0e836586) SHA1(5037b7c618f05bc3d6a33694729ae575b9aa7dbb) ) @@ -5732,6 +5879,7 @@ GAME( 1981, hangly2, puckman, pacman, pacman, 0, ROT90, "hack", "Hangly-Man (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1981, hangly3, puckman, pacman, pacman, 0, ROT90, "hack", "Hangly-Man (set 3)", GAME_SUPPORTS_SAVE ) GAME( 1981, popeyeman,puckman, pacman, pacman, 0, ROT90, "hack", "Popeye-Man", GAME_SUPPORTS_SAVE ) +GAME( 1980, crockman, puckman, pacman, pacman, 0, ROT90, "bootleg (Rene Pierre)", "Crock-Man", GAME_SUPPORTS_SAVE ) GAME( 1981, piranhah, puckman, pacman, mspacman, 0, ROT90, "hack", "Piranha (hack)", GAME_SUPPORTS_SAVE ) GAME( 1981, crush, 0, pacman, maketrax, maketrax, ROT90, "Kural Samno Electric", "Crush Roller (Kural Samno)", GAME_SUPPORTS_SAVE ) GAME( 1981, crushbl, crush, pacman, maketrax, 0, ROT90, "bootleg", "Crush Roller (bootleg)", GAME_SUPPORTS_SAVE ) @@ -5748,9 +5896,11 @@ GAME( 1982, pacplus, 0, pacman, pacman, pacplus, ROT90, "Namco (Midway license)", "Pac-Man Plus", GAME_SUPPORTS_SAVE ) GAME( 1982, joyman, puckman, pacman, pacman, 0, ROT90, "hack", "Joyman", GAME_SUPPORTS_SAVE ) GAME( 1982, ctrpllrp, puckman, pacman, pacman, 0, ROT90, "hack", "Caterpillar Pacman Hack", GAME_SUPPORTS_SAVE ) -GAME( 1982, eyes, 0, pacman, eyes, eyes, ROT90, "Digitrex Techstar (Rock-Ola license)", "Eyes (Digitrex Techstar)", GAME_SUPPORTS_SAVE ) -GAME( 1982, eyes2, eyes, pacman, eyes, eyes, ROT90, "Techstar (Rock-Ola license)", "Eyes (Techstar)", GAME_SUPPORTS_SAVE ) -GAME( 1982, eyeszac, eyes, pacman, eyes, 0, ROT90, "bootleg (Zaccaria)", "Eyes (Zaccaria)", GAME_SUPPORTS_SAVE ) +GAME( 1982, eyes, 0, pacman, eyes, eyes, ROT90, "Digitrex Techstar (Rock-Ola license)", "Eyes (US set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1982, eyes2, eyes, pacman, eyes, eyes, ROT90, "Techstar (Rock-Ola license)", "Eyes (US set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1982, eyeszac, eyes, pacman, eyes, eyes, ROT90, "Techstar (Zaccaria license)", "Eyes (Italy)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) // bad dump +GAME( 1982, eyeszacb, eyes, pacman, eyes, 0, ROT90, "bootleg", "Eyes (bootleg)", GAME_SUPPORTS_SAVE ) // based on Zaccaria version +GAME( 1983, birdiy, 0, birdiy, pacman, 0, ROT270, "Mama Top", "Birdiy", GAME_SUPPORTS_SAVE ) GAME( 1983, mrtnt, 0, pacman, mrtnt, eyes, ROT90, "Techstar (Telko license)", "Mr. TNT", GAME_SUPPORTS_SAVE ) GAME( 1983, gorkans, mrtnt, pacman, mrtnt, 0, ROT90, "Techstar", "Gorkans", GAME_SUPPORTS_SAVE ) GAME( 1983, eggor, 0, pacman, mrtnt, eyes, ROT90, "Telko", "Eggor", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/pandoras.c mame-0.145/src/mame/drivers/pandoras.c --- mame-0.144/src/mame/drivers/pandoras.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pandoras.c 2012-02-06 21:30:39.000000000 +0000 @@ -376,10 +376,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pandoras) + MCFG_SCREEN_UPDATE_STATIC(pandoras) MCFG_GFXDECODE(pandoras) MCFG_PALETTE_LENGTH(16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/pangofun.c mame-0.145/src/mame/drivers/pangofun.c --- mame-0.144/src/mame/drivers/pangofun.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/pangofun.c 2012-02-06 21:30:33.000000000 +0000 @@ -113,7 +113,8 @@ AM_RANGE(0x000a0000, 0x000bffff) AM_RAM AM_RANGE(0x000c0000, 0x000c7fff) AM_ROM AM_REGION("video_bios", 0) AM_RANGE(0x000f0000, 0x000fffff) AM_ROM AM_REGION("bios", 0 ) - AM_RANGE(0x00100000, 0x001fffff) AM_RAM + AM_RANGE(0x00100000, 0x00ffffff) AM_NOP + AM_RANGE(0x01000000, 0xfffeffff) AM_NOP AM_RANGE(0xffff0000, 0xffffffff) AM_ROM AM_REGION("bios", 0 ) ADDRESS_MAP_END @@ -161,13 +162,7 @@ pic8259_ir1_w(machine.device("pic8259_1"), state); } -static const struct pc_vga_interface vga_interface ={ - NULL, - NULL, - NULL, - AS_IO, - 0x0000 -}; +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static void set_gate_a20(running_machine &machine, int a20) { @@ -186,7 +181,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, pcat_dyn_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, pcat_dyn_get_out2 }; static MACHINE_START( pangofun ) @@ -199,7 +194,7 @@ static MACHINE_CONFIG_START( pangofun, pangofun_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I486, 40000000 ) /* I486 ?? Mhz */ + MCFG_CPU_ADD("maincpu", I486, 25000000 ) /* I486 ?? Mhz (25 according to POST) */ MCFG_CPU_PROGRAM_MAP(pcat_map) MCFG_CPU_IO_MAP(pcat_io) @@ -219,8 +214,6 @@ ROM_REGION32_LE(0x20000, "bios", 0) /* motherboard bios */ ROM_LOAD("bios.bin", 0x000000, 0x10000, CRC(e70168ff) SHA1(4a0d985c218209b7db2b2d33f606068aae539020) ) -// ROM_REGION32_LE(0x20000, "video_bios", 0) /* gfx card bios */ -// ROM_LOAD("vgabios.bin", 0x000000, 0x20000, NO_DUMP ) // 1x maskrom (28pin) ROM_REGION(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) ROM_CONTINUE( 0x00001, 0x04000 ) @@ -249,7 +242,8 @@ static DRIVER_INIT(pangofun) { - pc_vga_init(machine, &vga_interface, NULL); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); } GAME( 1995, pangofun, 0, pangofun, pangofun, pangofun, ROT0, "InfoCube", "Pango Fun (Italy)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/panicr.c mame-0.145/src/mame/drivers/panicr.c --- mame-0.144/src/mame/drivers/panicr.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/panicr.c 2012-02-06 21:30:36.000000000 +0000 @@ -162,7 +162,7 @@ int attr=videoram[tile_index*4+2]; int color = attr & 0x07; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO( 0, @@ -215,7 +215,7 @@ colortable_configure_tilemap_groups(machine.colortable, state->m_txttilemap, machine.gfx[0], 0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { panicr_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -239,15 +239,15 @@ } } -static SCREEN_UPDATE( panicr) +static SCREEN_UPDATE_IND16( panicr) { - panicr_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - tilemap_mark_all_tiles_dirty( state->m_txttilemap ); - tilemap_set_scrollx( state->m_bgtilemap,0, ((state->m_scrollram[0x02]&0x0f)<<12)+((state->m_scrollram[0x02]&0xf0)<<4)+((state->m_scrollram[0x04]&0x7f)<<1)+((state->m_scrollram[0x04]&0x80)>>7) ); - tilemap_draw(bitmap,cliprect,state->m_bgtilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_txttilemap,0,0); + panicr_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_txttilemap ->mark_all_dirty(); + state->m_bgtilemap->set_scrollx(0, ((state->m_scrollram[0x02]&0x0f)<<12)+((state->m_scrollram[0x02]&0xf0)<<4)+((state->m_scrollram[0x04]&0x7f)<<1)+((state->m_scrollram[0x04]&0x80)>>7) ); + state->m_bgtilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_txttilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -392,10 +392,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(panicr) + MCFG_SCREEN_UPDATE_STATIC(panicr) MCFG_GFXDECODE(panicr) MCFG_PALETTE_LENGTH(256*3) diff -Nru mame-0.144/src/mame/drivers/paradise.c mame-0.145/src/mame/drivers/paradise.c --- mame-0.144/src/mame/drivers/paradise.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/paradise.c 2012-02-06 21:30:38.000000000 +0000 @@ -675,10 +675,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) /* 54 verified */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* we're using IPT_VBLANK */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-1-16) - MCFG_SCREEN_UPDATE(paradise) + MCFG_SCREEN_UPDATE_STATIC(paradise) MCFG_GFXDECODE(paradise) MCFG_PALETTE_LENGTH(0x800 + 16) @@ -711,7 +710,7 @@ MCFG_GFXDECODE(torus) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(torus) + MCFG_SCREEN_UPDATE_STATIC(torus) MCFG_DEVICE_REMOVE("oki2") MACHINE_CONFIG_END @@ -726,7 +725,7 @@ MCFG_GFXDECODE(madball) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(madball) + MCFG_SCREEN_UPDATE_STATIC(madball) MCFG_DEVICE_REMOVE("oki2") MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/paranoia.c mame-0.145/src/mame/drivers/paranoia.c --- mame-0.144/src/mame/drivers/paranoia.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/paranoia.c 2012-02-06 21:30:39.000000000 +0000 @@ -36,7 +36,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/i8085/i8085.h" -#include "deprecat.h" #include "machine/pcecommn.h" #include "video/vdc.h" #include "cpu/h6280/h6280.h" @@ -150,7 +149,7 @@ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) MCFG_CPU_PROGRAM_MAP(pce_mem) MCFG_CPU_IO_MAP(pce_io) - MCFG_CPU_VBLANK_INT_HACK(pce_interrupt, VDC_LPF) + MCFG_TIMER_ADD_SCANLINE("scantimer", pce_interrupt, "screen", 0, 1) MCFG_QUANTUM_TIME(attotime::from_hz(60)) @@ -165,9 +164,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, VDC_WPF, 70, 70 + 512 + 32, VDC_LPF, 14, 14+242) - MCFG_SCREEN_UPDATE( pce ) + MCFG_SCREEN_UPDATE_STATIC( pce ) /* MCFG_GFXDECODE( pce_gfxdecodeinfo ) */ MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/parodius.c mame-0.145/src/mame/drivers/parodius.c --- mame-0.144/src/mame/drivers/parodius.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/parodius.c 2012-02-06 21:30:38.000000000 +0000 @@ -187,29 +187,29 @@ KONAMI8_ALT_B123(2) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "20000 80000" ) PORT_DIPSETTING( 0x10, "30000 100000" ) PORT_DIPSETTING( 0x08, "20000" ) PORT_DIPSETTING( 0x00, "70000" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -218,16 +218,14 @@ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Upright Controls" ) + PORT_DIPNAME( 0x20, 0x20, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x20, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:4" ) INPUT_PORTS_END @@ -316,10 +314,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(parodius) + MCFG_SCREEN_UPDATE_STATIC(parodius) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/pasha2.c mame-0.145/src/mame/drivers/pasha2.c --- mame-0.144/src/mame/drivers/pasha2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/pasha2.c 2012-02-06 21:30:37.000000000 +0000 @@ -332,26 +332,26 @@ state->save_item(NAME(state->m_bitmap1)); } -static SCREEN_UPDATE( pasha2 ) +static SCREEN_UPDATE_IND16( pasha2 ) { - pasha2_state *state = screen->machine().driver_data(); + pasha2_state *state = screen.machine().driver_data(); int x, y, count; int color; /* 2 512x256 bitmaps */ count = 0; - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { for (x = 0; x < 512 / 2; x++) { - if (x * 2 < cliprect->max_x) + if (x * 2 < cliprect.max_x) { color = (state->m_bitmap0[count + (state->m_vbuffer ^ 1) * 0x20000 / 2] & 0xff00) >> 8; - *BITMAP_ADDR16(bitmap, y, x * 2 + 0) = color + 0x100; + bitmap.pix16(y, x * 2 + 0) = color + 0x100; color = state->m_bitmap0[count + (state->m_vbuffer ^ 1) * 0x20000 / 2] & 0xff; - *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = color + 0x100; + bitmap.pix16(y, x * 2 + 1) = color + 0x100; } count++; @@ -359,19 +359,19 @@ } count = 0; - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { for (x = 0; x < 512 / 2; x++) { - if (x * 2 < cliprect->max_x) + if (x * 2 < cliprect.max_x) { color = state->m_bitmap1[count + (state->m_vbuffer ^ 1) * 0x20000 / 2] & 0xff; if (color != 0) - *BITMAP_ADDR16(bitmap, y, x * 2 + 1) = color; + bitmap.pix16(y, x * 2 + 1) = color; color = (state->m_bitmap1[count + (state->m_vbuffer ^ 1) * 0x20000 / 2] & 0xff00) >> 8; if (color != 0) - *BITMAP_ADDR16(bitmap, y, x * 2 + 0) = color; + bitmap.pix16(y, x * 2 + 0) = color; } count++; @@ -413,10 +413,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 383, 0, 239) - MCFG_SCREEN_UPDATE(pasha2) + MCFG_SCREEN_UPDATE_STATIC(pasha2) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/pass.c mame-0.145/src/mame/drivers/pass.c --- mame-0.144/src/mame/drivers/pass.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pass.c 2012-02-06 21:30:39.000000000 +0000 @@ -247,10 +247,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pass) + MCFG_SCREEN_UPDATE_STATIC(pass) MCFG_PALETTE_LENGTH(0x200) MCFG_GFXDECODE(pass) diff -Nru mame-0.144/src/mame/drivers/pastelg.c mame-0.145/src/mame/drivers/pastelg.c --- mame-0.144/src/mame/drivers/pastelg.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pastelg.c 2012-02-06 21:30:35.000000000 +0000 @@ -413,8 +413,7 @@ MCFG_CPU_ADD("maincpu", Z80, 19968000/4) /* unknown divider, galds definitely relies on this for correct voice pitch */ MCFG_CPU_PROGRAM_MAP(pastelg_map) MCFG_CPU_IO_MAP(pastelg_io_map) -// MCFG_CPU_VBLANK_INT_HACK(nb1413m3_interrupt,96) // nmiclock not written, chip is 1411M1 instead of 1413M3 - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) // nmiclock not written, chip is 1411M1 instead of 1413M3 MCFG_MACHINE_RESET(nb1413m3) MCFG_NVRAM_ADD_0FILL("nvram") @@ -423,10 +422,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(pastelg) + MCFG_SCREEN_UPDATE_STATIC(pastelg) MCFG_PALETTE_LENGTH(32) @@ -482,10 +480,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 240-1) - MCFG_SCREEN_UPDATE(pastelg) + MCFG_SCREEN_UPDATE_STATIC(pastelg) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/pbaction.c mame-0.145/src/mame/drivers/pbaction.c --- mame-0.144/src/mame/drivers/pbaction.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/pbaction.c 2012-02-06 21:30:36.000000000 +0000 @@ -65,7 +65,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "sound/ay8910.h" #include "machine/segacrpt.h" #include "includes/pbaction.h" @@ -78,6 +77,12 @@ device_set_input_line_and_vector(state->m_audiocpu, 0, HOLD_LINE, 0x00); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + pbaction_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} static ADDRESS_MAP_START( pbaction_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM @@ -89,7 +94,7 @@ AM_RANGE(0xdc00, 0xdfff) AM_RAM_WRITE(pbaction_colorram_w) AM_BASE_MEMBER(pbaction_state, m_colorram) AM_RANGE(0xe000, 0xe07f) AM_RAM AM_BASE_SIZE_MEMBER(pbaction_state, m_spriteram, m_spriteram_size) AM_RANGE(0xe400, 0xe5ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xe600, 0xe600) AM_READ_PORT("P1") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xe600, 0xe600) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w) AM_RANGE(0xe601, 0xe601) AM_READ_PORT("P2") AM_RANGE(0xe602, 0xe602) AM_READ_PORT("SYSTEM") AM_RANGE(0xe604, 0xe604) AM_READ_PORT("DSW1") AM_WRITE(pbaction_flipscreen_w) @@ -269,17 +274,25 @@ state->m_scroll = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + pbaction_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( pbaction, pbaction_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz? */ MCFG_CPU_PROGRAM_MAP(pbaction_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, 3072000) MCFG_CPU_PROGRAM_MAP(pbaction_sound_map) MCFG_CPU_IO_MAP(pbaction_sound_io_map) - MCFG_CPU_VBLANK_INT_HACK(pbaction_interrupt,2) /* ??? */ + MCFG_CPU_PERIODIC_INT(pbaction_interrupt,2*60) /* ??? */ /* IRQs are caused by the main CPU */ MCFG_MACHINE_START(pbaction) @@ -289,10 +302,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pbaction) + MCFG_SCREEN_UPDATE_STATIC(pbaction) MCFG_GFXDECODE(pbaction) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/pcat_dyn.c mame-0.145/src/mame/drivers/pcat_dyn.c --- mame-0.144/src/mame/drivers/pcat_dyn.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pcat_dyn.c 2012-02-06 21:30:34.000000000 +0000 @@ -12,7 +12,18 @@ TODO: - Returns CMOS checksum error, can't enter into BIOS setup screens to set that up ... it's certainly a MESS-to-MAME - conversion bug or a keyboard device issue, since it works fine in MESS. + conversion bug or a keyboard device issue, since it works fine in MESS. (Update: it's the keyboard device) + +keyboard trick; +- Set 0x41c to zero then set the scancode accordingly: +- bp f1699 ah = 0x3b +- bp f53b9 al = scancode +- bp f08d9 ah = scancode + +0x48 is up 0x4d is down 0x50 is right 0x4b is left +0x3c/0x3d is pageup/pagedown +0x01 is esc +0x0d is enter ********************************************************************************************************************/ @@ -96,14 +107,7 @@ pic8259_ir1_w(machine.device("pic8259_1"), state); } -static const struct pc_vga_interface vga_interface = -{ - NULL, - NULL, - NULL, - AS_IO, - 0x0000 -}; +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static void set_gate_a20(running_machine &machine, int a20) { @@ -122,7 +126,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, pcat_dyn_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, pcat_dyn_get_out2 }; static MACHINE_START( pcat_dyn ) @@ -191,7 +195,8 @@ static DRIVER_INIT(pcat_dyn) { - pc_vga_init(machine, &vga_interface, NULL); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); } GAME( 1995, toursol, 0, pcat_dyn, pcat_dyn, pcat_dyn, ROT0, "Dynamo", "Tournament Solitaire (V1.06, 08/03/95)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/pcat_nit.c mame-0.145/src/mame/drivers/pcat_nit.c --- mame-0.144/src/mame/drivers/pcat_nit.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pcat_nit.c 2012-02-06 21:30:34.000000000 +0000 @@ -89,6 +89,7 @@ #include "machine/ins8250.h" #include "machine/microtch.h" #include "video/pc_vga.h" +#include "machine/nvram.h" class pcat_nit_state : public driver_device @@ -166,7 +167,7 @@ static ADDRESS_MAP_START( pcat_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM AM_RANGE(0x000a0000, 0x000bffff) AM_RAM - AM_RANGE(0x000c0000, 0x000c7fff) AM_ROM AM_REGION("video_bios", 0) + AM_RANGE(0x000c0000, 0x000c7fff) AM_ROM AM_REGION("video_bios", 0) AM_WRITENOP AM_RANGE(0x000d0000, 0x000d3fff) AM_RAM AM_REGION("disk_bios", 0) AM_RANGE(0x000d7000, 0x000d7003) AM_WRITE8(pcat_nit_rombank_w, 0xff) AM_RANGE(0x000d8000, 0x000dffff) AM_ROMBANK("rombank") @@ -192,6 +193,7 @@ static ADDRESS_MAP_START( pcat_nit_io, AS_IO, 32 ) AM_IMPORT_FROM(pcat32_io_common) AM_RANGE(0x0278, 0x027f) AM_READ8(pcat_nit_io_r, 0xffffffff) AM_WRITENOP + AM_RANGE(0x0280, 0x0283) AM_READNOP AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ns16450_0", ins8250_r, ins8250_w, 0xffffffff) ADDRESS_MAP_END @@ -211,14 +213,7 @@ pic8259_ir1_w(machine.device("pic8259_1"), state); } -static const struct pc_vga_interface vga_interface = -{ - NULL, - NULL, - NULL, - AS_IO, - 0x0000 -}; +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static MACHINE_START( streetg2 ) { @@ -252,6 +247,8 @@ MCFG_FRAGMENT_ADD( pcat_common ) MCFG_NS16450_ADD( "ns16450_0", pcat_nit_com0_interface ) + MCFG_NVRAM_ADD_0FILL("nvram") + MACHINE_CONFIG_END /*************************************** @@ -269,9 +266,12 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0003-04.u11", 0x000000,0x80000, CRC(1471a728) SHA1(5e12a9230f8130282a1be9a10118a3556bafbc37) ) - ROM_LOAD("10-0003-04.u12", 0x080000,0x80000, CRC(5a50f519) SHA1(c07a583b4220d4d5506824def91774fede760e65) ) - ROM_LOAD("10-0003-04.u13", 0x100000,0x80000, CRC(8a609145) SHA1(18fcb58b461aa9149a163b85dd8267dec90da3cd) ) + ROM_LOAD("10-0003-04.u11", 0x000000,0x40000, CRC(1471a728) SHA1(5e12a9230f8130282a1be9a10118a3556bafbc37) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0003-04.u12", 0x040000,0x40000, CRC(5a50f519) SHA1(c07a583b4220d4d5506824def91774fede760e65) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0003-04.u13", 0x080000,0x40000, CRC(8a609145) SHA1(18fcb58b461aa9149a163b85dd8267dec90da3cd) ) + ROM_CONTINUE(0x280000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) @@ -289,9 +289,12 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-00003-03.u11", 0x000000,0x80000, CRC(2fbcb12b) SHA1(f6413565fc1289ba32b411de877cdf6526f1fa9d) ) - ROM_LOAD("10-00003-03.u12", 0x080000,0x80000, CRC(b37c7dff) SHA1(cf6318bfeca0bd272734f45c7589a0224863b0f1) ) - ROM_LOAD("10-00003-03.u13", 0x100000,0x80000, CRC(6a9d0771) SHA1(6cd9a56a2413416d0928e5cf9340c94bc0c87c46) ) + ROM_LOAD("10-00003-03.u11", 0x000000,0x40000, CRC(2fbcb12b) SHA1(f6413565fc1289ba32b411de877cdf6526f1fa9d) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-00003-03.u12", 0x040000,0x40000, CRC(b37c7dff) SHA1(cf6318bfeca0bd272734f45c7589a0224863b0f1) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-00003-03.u13", 0x080000,0x40000, CRC(6a9d0771) SHA1(6cd9a56a2413416d0928e5cf9340c94bc0c87c46) ) + ROM_CONTINUE(0x280000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) @@ -309,12 +312,18 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0018-03-090894.u11", 0x000000,0x80000, CRC(32b6c8bc) SHA1(7f4097990dca268915842d4253d4257654de2cfc) ) - ROM_LOAD("10-0018-03-090894.u12", 0x080000,0x80000, CRC(d7cb191d) SHA1(2047f3668b0e41ad5347107f4e3446c0374c5bb7) ) - ROM_LOAD("10-0018-03-090894.u13", 0x100000,0x80000, CRC(1d3ddeaa) SHA1(8e73fe535882f6d634668733e550281e727fbdbc) ) - ROM_LOAD("10-0018-03-090894.u15", 0x200000,0x80000, CRC(b9b3f442) SHA1(6ea5ce3eb007b95ad3350fdb634625b151ae7bdb) ) - ROM_LOAD("10-0018-03-090894.u16", 0x280000,0x80000, CRC(5b0dd6f5) SHA1(8172118185179ecb7d3f958480186bf9c906785f) ) - ROM_LOAD("10-0018-03-090894.u17", 0x300000,0x80000, CRC(b637eb58) SHA1(7c4615f58118d9b82575d816ef916fccbb1be0f9) ) + ROM_LOAD("10-0018-03-090894.u11", 0x000000,0x40000, CRC(32b6c8bc) SHA1(7f4097990dca268915842d4253d4257654de2cfc) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0018-03-090894.u12", 0x040000,0x40000, CRC(d7cb191d) SHA1(2047f3668b0e41ad5347107f4e3446c0374c5bb7) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0018-03-090894.u13", 0x080000,0x40000, CRC(1d3ddeaa) SHA1(8e73fe535882f6d634668733e550281e727fbdbc) ) + ROM_CONTINUE(0x280000, 0x40000) + ROM_LOAD("10-0018-03-090894.u15", 0x100000,0x40000, CRC(b9b3f442) SHA1(6ea5ce3eb007b95ad3350fdb634625b151ae7bdb) ) + ROM_CONTINUE(0x300000, 0x40000) + ROM_LOAD("10-0018-03-090894.u16", 0x140000,0x40000, CRC(5b0dd6f5) SHA1(8172118185179ecb7d3f958480186bf9c906785f) ) + ROM_CONTINUE(0x340000, 0x40000) + ROM_LOAD("10-0018-03-090894.u17", 0x180000,0x40000, CRC(b637eb58) SHA1(7c4615f58118d9b82575d816ef916fccbb1be0f9) ) + ROM_CONTINUE(0x380000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) @@ -332,12 +341,18 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0018-02-081794.u11", 0x000000,0x80000, CRC(f87fa935) SHA1(b06144496406231aa63149ae12a048ffab8f77d0) ) - ROM_LOAD("10-0018-02-081794.u12", 0x080000,0x80000, CRC(bd892e3e) SHA1(1b9174fe2a6eaa7687b543798099b86b9039c049) ) - ROM_LOAD("10-0018-02-081794.u13", 0x100000,0x80000, CRC(626d999e) SHA1(5c27e3b064b0235c0d6e0be8d8f78538a11647a2) ) - ROM_LOAD("10-0018-02-081794.u15", 0x200000,0x80000, CRC(3b28f582) SHA1(3da61fbd92e6cc60e00eaa21d8fb04aa78cce663) ) - ROM_LOAD("10-0018-02-081794.u16", 0x280000,0x80000, CRC(fe29ad76) SHA1(64aaae639f024c50c09fe920bc92e6d45ced5648) ) - ROM_LOAD("10-0018-02-081794.u17", 0x300000,0x80000, CRC(066108fe) SHA1(ef837422a2a81f5ac3375b6ed68f20143ac6caec) ) + ROM_LOAD("10-0018-02-081794.u11", 0x000000,0x40000, CRC(f87fa935) SHA1(b06144496406231aa63149ae12a048ffab8f77d0) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0018-02-081794.u12", 0x040000,0x40000, CRC(bd892e3e) SHA1(1b9174fe2a6eaa7687b543798099b86b9039c049) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0018-02-081794.u13", 0x080000,0x40000, CRC(626d999e) SHA1(5c27e3b064b0235c0d6e0be8d8f78538a11647a2) ) + ROM_CONTINUE(0x280000, 0x40000) + ROM_LOAD("10-0018-02-081794.u15", 0x100000,0x40000, CRC(3b28f582) SHA1(3da61fbd92e6cc60e00eaa21d8fb04aa78cce663) ) + ROM_CONTINUE(0x300000, 0x40000) + ROM_LOAD("10-0018-02-081794.u16", 0x140000,0x40000, CRC(fe29ad76) SHA1(64aaae639f024c50c09fe920bc92e6d45ced5648) ) + ROM_CONTINUE(0x340000, 0x40000) + ROM_LOAD("10-0018-02-081794.u17", 0x180000,0x40000, CRC(066108fe) SHA1(ef837422a2a81f5ac3375b6ed68f20143ac6caec) ) + ROM_CONTINUE(0x380000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) @@ -355,14 +370,17 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0007-07c_083194_rom4.u11", 0x000000,0x80000, CRC(244c2bfa) SHA1(4f2f0fb6923b4e3f1ab4e607e29a27fb15b39fac) ) - ROM_LOAD("10-0007-07c_083194_rom5.u12", 0x080000,0x80000, CRC(c89d5dca) SHA1(212bcbf7a39243f4524b4a855fbedabd387d17f2) ) - ROM_LOAD("10-0007-07c_083194_rom6.u13", 0x100000,0x80000, CRC(6264f65f) SHA1(919a8e5d9861dc642ac0f0885faed544bbafa321) ) + ROM_LOAD("10-0007-07c_083194_rom4.u11", 0x000000,0x40000, CRC(244c2bfa) SHA1(4f2f0fb6923b4e3f1ab4e607e29a27fb15b39fac) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0007-07c_083194_rom5.u12", 0x040000,0x40000, CRC(c89d5dca) SHA1(212bcbf7a39243f4524b4a855fbedabd387d17f2) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0007-07c_083194_rom6.u13", 0x080000,0x40000, CRC(6264f65f) SHA1(919a8e5d9861dc642ac0f0885faed544bbafa321) ) + ROM_CONTINUE(0x280000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) - ROM_REGION(0x08000, "nvram_data", 0) + ROM_REGION(0x02000, "nvram", 0) ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) ROM_END @@ -375,9 +393,12 @@ ROM_CONTINUE( 0x00001, 0x04000 ) ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-00007-05-032194.u15", 0x000000,0x80000, CRC(cefa230f) SHA1(91fd30a3def381974fae0edb4d42d452acda19bb) ) - ROM_LOAD("10-00007-05-032194.u16", 0x080000,0x80000, CRC(0be5dd19) SHA1(d0474ff5156e1fa8b4edb502c49b7e1a2b3f6169) ) - ROM_LOAD("10-00007-05-032194.u17", 0x100000,0x80000, CRC(f6c996b9) SHA1(871a8d093b856511a0e2b03334ef5c66a2482622) ) + ROM_LOAD("10-00007-05-032194.u15", 0x000000,0x40000, CRC(cefa230f) SHA1(91fd30a3def381974fae0edb4d42d452acda19bb) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-00007-05-032194.u16", 0x040000,0x40000, CRC(0be5dd19) SHA1(d0474ff5156e1fa8b4edb502c49b7e1a2b3f6169) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-00007-05-032194.u17", 0x080000,0x40000, CRC(f6c996b9) SHA1(871a8d093b856511a0e2b03334ef5c66a2482622) ) + ROM_CONTINUE(0x280000, 0x40000) ROM_REGION(0x08000, "disk_bios", 0) ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) @@ -390,13 +411,15 @@ { pcat_nit_state *state = machine.driver_data(); state->m_banked_nvram = auto_alloc_array(machine, UINT8, 0x2000); + machine.device("nvram")->set_base(state->m_banked_nvram, 0x2000); - pc_vga_init(machine, &vga_interface, NULL); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); } GAME( 1993, bonanza, 0, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Bonanza (Revision 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) GAME( 1993, bonanzar2, bonanza, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Bonanza (Revision 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) GAME( 1993, streetg, 0, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 4)", GAME_NOT_WORKING|GAME_NO_SOUND ) GAME( 1993, streetgr3, streetg, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1993, streetg2, 0, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 7C)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1993, streetg2r5, streetg2, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 5)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1993, streetg2, 0, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 7C)", GAME_NO_SOUND ) +GAME( 1993, streetg2r5, streetg2, pcat_nit, pcat_nit, pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 5)", GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/pcktgal.c mame-0.145/src/mame/drivers/pcktgal.c --- mame-0.144/src/mame/drivers/pcktgal.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/pcktgal.c 2012-02-06 21:30:36.000000000 +0000 @@ -233,10 +233,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pcktgal) + MCFG_SCREEN_UPDATE_STATIC(pcktgal) MCFG_GFXDECODE(pcktgal) MCFG_PALETTE_LENGTH(512) @@ -264,7 +263,7 @@ static MACHINE_CONFIG_DERIVED( bootleg, pcktgal ) MCFG_GFXDECODE(bootleg) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(pcktgalb) + MCFG_SCREEN_UPDATE_STATIC(pcktgalb) MACHINE_CONFIG_END /***************************************************************************/ diff -Nru mame-0.144/src/mame/drivers/pcxt.c mame-0.145/src/mame/drivers/pcxt.c --- mame-0.144/src/mame/drivers/pcxt.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/pcxt.c 2012-02-06 21:30:39.000000000 +0000 @@ -14,15 +14,9 @@ TODO: - 02851: tetriskr: Corrupt game graphics after some time of gameplay, caused by a wrong reading of the i/o $3c8 bit 1. -- EGA/CGA/VGA emulation uses the bare minimum for these games,there are still a lot of - features that needs to be added; -- Filetto: Add a proper FDC device,if you enable it will give a boot error,probably because it - expects that in the floppy drive shouldn't be anything,there's currently a kludge that - does the trick; -- Filetto: Add sound,"buzzer" PC sound plus the UM5100 sound chip ,might be connected to the - prototyping card; -- Korean Tetris: Add the aforementioned "buzzer" plus identify if there's any kind of sound - chip on it; +- Add a proper FDC device. +- Filetto: Add UM5100 sound chip ,might be connected to the prototyping card; +- buzzer sound has issues in both games ******************************************************************************************** Filetto HW notes: @@ -68,7 +62,8 @@ #include "machine/pic8259.h" #include "machine/mc146818.h" #include "sound/hc55516.h" -#include "sound/beep.h" +#include "sound/speaker.h" +#include "video/pc_cga.h" class pcxt_state : public driver_device @@ -77,25 +72,19 @@ pcxt_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - UINT8 *m_vga_vram; - UINT8 *m_work_ram; - UINT8 m_video_regs[0x19]; - UINT8 *m_vga_mode; - UINT8 m_hv_blank; - UINT8 *m_vga_bg_bank; + UINT8 m_bg_bank; int m_bank; int m_lastvalue; - UINT8 m_video_index; UINT8 m_disk_data[2]; UINT8 m_port_b_data; UINT8 m_wss1_data; UINT8 m_wss2_data; UINT8 m_status; UINT8 m_clr_status; - UINT8 m_drive_data; int m_dma_channel; UINT8 m_dma_offset[2][4]; UINT8 m_at_pages[0x10]; + UINT8 m_pc_spkrdata, m_pc_input; device_t *m_pit8253; device_t *m_pic8259_1; @@ -104,253 +93,44 @@ device_t *m_dma8237_2; }; - -#define SET_VISIBLE_AREA(_x_,_y_) \ - { \ - rectangle visarea; \ - visarea.min_x = 0; \ - visarea.max_x = _x_-1; \ - visarea.min_y = 0; \ - visarea.max_y = _y_-1; \ - machine.primary_screen->configure(_x_, _y_, visarea, machine.primary_screen->frame_period().attoseconds ); \ - } \ - - -/*Add here Video regs defines...*/ - - -#define RES_320x200 0 -#define RES_640x200 1 - -static void cga_alphanumeric_tilemap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,UINT16 size,UINT32 map_offs,UINT8 gfx_num); - -static VIDEO_START( filetto ) -{ -} - -static VIDEO_START( tetriskr ) -{ -} - -static READ8_HANDLER( vga_hvretrace_r ) -{ - /* - Read-Only lower 8 bits,TRUSTED - ---- x--- Vertical Retrace - ---- ---x Horizontal Retrace - */ - UINT8 res; - int h,w; - res = 0; - h = space->machine().primary_screen->height(); - w = space->machine().primary_screen->width(); - -// popmessage("%d %d",h,w); - - if (space->machine().primary_screen->hpos() > h) - res|= 1; - - if (space->machine().primary_screen->vpos() > w) - res|= 8; - - return res; -} - -/*Basic Graphic mode */ -/*TODO: non-black colours should use the bright versions*/ -static void cga_graphic_bitmap(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect,UINT16 size,UINT32 map_offs) -{ - pcxt_state *state = machine.driver_data(); - UINT16 x,y; - UINT32 offs; - - SET_VISIBLE_AREA(320,200); - offs = map_offs; - for(y=0;y<200;y+=2) - for(x=0;x<320;x+=4) - { - *BITMAP_ADDR16(bitmap, y, x+0) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0xc0)>>6)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+1) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x30)>>4)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+2) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x0c)>>2)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+3) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x03)>>0)<<1)]; - offs++; - } - - offs = 0x2000+map_offs; - for(y=1;y<200;y+=2) - for(x=0;x<320;x+=4) - { - *BITMAP_ADDR16(bitmap, y, x+0) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0xc0)>>6)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+1) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x30)>>4)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+2) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x0c)>>2)<<1)]; - *BITMAP_ADDR16(bitmap, y, x+3) = machine.pens[0x200+(((state->m_vga_vram[offs] & 0x03)>>0)<<1)]; - offs++; - } - -} - - - -static void cga_alphanumeric_tilemap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,UINT16 size,UINT32 map_offs,UINT8 gfx_num) +static SCREEN_UPDATE_RGB32( tetriskr ) { - pcxt_state *state = machine.driver_data(); - UINT32 offs,x,y,max_x,max_y; + pcxt_state *state = screen.machine().driver_data(); + int x,y; + int yi; + const UINT8 *bg_rom = screen.machine().region("gfx2")->base(); - /*define the visible area*/ - switch(size) - { - case RES_320x200: - SET_VISIBLE_AREA(320,200); - max_x = 40; - max_y = 25; - break; - case RES_640x200: - SET_VISIBLE_AREA(640,200); - max_x = 80; - max_y = 25; - break; - default: - fatalerror("Unknown size"); - } + //popmessage("%04x",m_start_offs); - offs = map_offs; - - for(y=0;ym_vga_vram[offs] & 0xff; - int color = state->m_vga_vram[offs+1] & 0xff; + bitmap.fill(RGB_BLACK, cliprect); - drawgfx_transpen(bitmap,cliprect,machine.gfx[gfx_num], - tile, - color, - 0,0, - x*8,y*8, - ((color & 0xf0) != 0) ? -1 : 0); - - offs+=2; - } -} - - -static SCREEN_UPDATE( filetto ) -{ - pcxt_state *state = screen->machine().driver_data(); -/* xx1x xxxx Attribute bit 7. 0=blink, 1=Intesity - xxx1 xxxx 640x200 mode - xxxx 1xxx Enable video signal - xxxx x1xx Select B/W mode - xxxx xx1x Select graphics - xxxx xxx1 80x25 text - */ - bitmap_fill(bitmap, cliprect, 0); - - if(state->m_vga_mode[0] & 8) + for(y=0;y<200/8;y++) { - if(state->m_vga_mode[0] & 2) - cga_graphic_bitmap(screen->machine(),bitmap,cliprect,0,0x18000); - else + for(yi=0;yi<8;yi++) { - switch(state->m_vga_mode[0] & 1) + for(x=0;x<320/8;x++) { - case 0x00: - cga_alphanumeric_tilemap(screen->machine(),bitmap,cliprect,RES_320x200,0x18000,2); - break; - case 0x01: - cga_alphanumeric_tilemap(screen->machine(),bitmap,cliprect,RES_640x200,0x18000,2); - break; - } - } - } - - return 0; -} - -static void vga_bitmap_layer(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) -{ - pcxt_state *state = machine.driver_data(); - int x,y,z; - UINT8 *region = machine.region("user1")->base(); - UINT32 cur_bank; + UINT8 color; + int xi,pen_i; - /*TODO: might be a different descramble algorithm plus plain bg bank*/ - cur_bank = (((8-state->m_vga_bg_bank[0]) & 0x1f)*0x10000); - - for(y=0;y<200;y+=8) - { - for(z=0;z<8;z++) - for(x=0;x<320;x++) - { - *BITMAP_ADDR16(bitmap, y+z, x) = 0x200+(region[(y*320/8)+x+z*0x2000+cur_bank+8] & 0xf); - } - } -} - -/*S3 Video card,VGA*/ -static SCREEN_UPDATE( tetriskr ) -{ - pcxt_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); - - if(state->m_vga_mode[0] & 8) - { - if(state->m_vga_mode[0] & 2) - cga_graphic_bitmap(screen->machine(),bitmap,cliprect,0,0x18000); - else - { - vga_bitmap_layer(screen->machine(),bitmap,cliprect); + for(xi=0;xi<8;xi++) + { + color = 0; + /* TODO: first byte seems bogus? */ + for(pen_i = 0;pen_i<4;pen_i++) + color |= ((bg_rom[y*320/8+x+(pen_i*0x20000)+yi*0x400+state->m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i; - switch(state->m_vga_mode[0] & 1) - { - case 0x00: - cga_alphanumeric_tilemap(screen->machine(),bitmap,cliprect,RES_320x200,0x18000,0); - break; - case 0x01: - cga_alphanumeric_tilemap(screen->machine(),bitmap,cliprect,RES_640x200,0x18000,0); - break; + if(cliprect.contains(x*8+xi, y*8+yi)) + bitmap.pix32(y*8+yi, x*8+xi) = screen.machine().pens[color]; + } } } } + SCREEN_UPDATE32_CALL(mc6845_cga); return 0; } -static READ8_HANDLER( vga_regs_r ) -{ - logerror("(PC=%05x) Warning: VGA reg port read\n",cpu_get_pc(&space->device())); - return 0xff; -} - -static WRITE8_HANDLER( vga_regs_w ) -{ - pcxt_state *state = space->machine().driver_data(); - - if(offset == 0) - { - state->m_video_index = data; - } - if(offset == 1) - { - if(state->m_video_index <= 0x18) - { - state->m_video_regs[state->m_video_index] = data; - //logerror("write %02x to video register [%02x]",data,state->m_video_index); - } - else - logerror("(PC=%05x) Warning: Undefined VGA reg port write (I=%02x D=%02x)\n",cpu_get_pc(&space->device()),state->m_video_index,data); - } -} - -static WRITE8_HANDLER( vga_vram_w ) -{ - pcxt_state *state = space->machine().driver_data(); - state->m_vga_vram[offset] = data; -} - -/*end of Video HW file*/ - - - static READ8_HANDLER( disk_iobank_r ) { @@ -410,7 +190,7 @@ if (newbank != state->m_bank) { state->m_bank = newbank; - memory_set_bankptr(space->machine(), "bank1",space->machine().region("user1")->base() + 0x10000 * state->m_bank ); + memory_set_bankptr(space->machine(), "bank1",space->machine().region("game_prg")->base() + 0x10000 * state->m_bank ); } state->m_lastvalue = data; @@ -422,21 +202,51 @@ Pit8253 *********************************/ +// pc_speaker_get_spk, pc_speaker_set_spkrdata, and pc_speaker_set_input already exists in MESS, can the implementations be merged? +UINT8 pcxt_speaker_get_spk(running_machine &machine) +{ + pcxt_state *state = machine.driver_data(); + return state->m_pc_spkrdata & state->m_pc_input; +} + +void pcxt_speaker_set_spkrdata(running_machine &machine, UINT8 data) +{ + device_t *speaker = machine.device("speaker"); + pcxt_state *state = machine.driver_data(); + state->m_pc_spkrdata = data ? 1 : 0; + speaker_level_w( speaker, pcxt_speaker_get_spk(machine) ); +} + +void pcxt_speaker_set_input(running_machine &machine, UINT8 data) +{ + device_t *speaker = machine.device("speaker"); + pcxt_state *state = machine.driver_data(); + state->m_pc_input = data ? 1 : 0; + speaker_level_w( speaker, pcxt_speaker_get_spk(machine) ); +} + + +static WRITE_LINE_DEVICE_HANDLER( ibm5150_pit8253_out2_changed ) +{ + pcxt_speaker_set_input( device->machine(), state ); +} + + static const struct pit8253_config pc_pit8253_config = { { { - 4772720/4, /* heartbeat IRQ */ + XTAL_14_31818MHz/12, /* heartbeat IRQ */ DEVCB_NULL, DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) }, { - 4772720/4, /* dram refresh */ + XTAL_14_31818MHz/12, /* dram refresh */ DEVCB_NULL, DEVCB_NULL }, { - 4772720/4, /* pio port c pin 4, and speaker polling enough */ + XTAL_14_31818MHz/12, /* pio port c pin 4, and speaker polling enough */ DEVCB_NULL, - DEVCB_NULL + DEVCB_LINE(ibm5150_pit8253_out2_changed) } } }; @@ -474,7 +284,14 @@ static READ8_DEVICE_HANDLER( port_c_r ) { pcxt_state *state = device->machine().driver_data(); - return state->m_wss2_data;//??? + int timer2_output = pit8253_get_output( state->m_pit8253, 2 ); + if ( state->m_port_b_data & 0x01 ) + { + state->m_wss2_data = ( state->m_wss2_data & ~0x10 ) | ( timer2_output ? 0x10 : 0x00 ); + } + state->m_wss2_data = ( state->m_wss2_data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 ); + + return state->m_wss2_data;//TODO } /*'buzzer' sound routes here*/ @@ -483,6 +300,10 @@ static WRITE8_DEVICE_HANDLER( port_b_w ) { pcxt_state *state = device->machine().driver_data(); + + /* PPI controller port B*/ + pit8253_gate2_w(state->m_pit8253, BIT(data, 0)); + pcxt_speaker_set_spkrdata( device->machine(), data & 0x02 ); state->m_port_b_data = data; // device_t *beep = device->machine().device("beep"); // device_t *cvsd = device->machine().device("cvsd"); @@ -569,10 +390,10 @@ static WRITE8_HANDLER( drive_selection_w ) { - pcxt_state *state = space->machine().driver_data(); - state->m_drive_data = data; - /*write to this area then expects that location [43e] has the bit 7 activated*/ - state->m_work_ram[0x3e] = 0x80; +// pcxt_state *state = space->machine().driver_data(); + + /* TODO: properly hook-up upd765 FDC there */ + pic8259_ir6_w(space->machine().device("pic8259_1"), 1); } /****************** @@ -713,15 +534,14 @@ } static ADDRESS_MAP_START( filetto_map, AS_PROGRAM, 8 ) - AM_RANGE(0x00000, 0x003ff) AM_RAM //irq vectors - AM_RANGE(0x00400, 0x007ff) AM_RAM AM_BASE_MEMBER(pcxt_state, m_work_ram) - AM_RANGE(0x00800, 0x9ffff) AM_RAM //work RAM 640KB - AM_RANGE(0xa0000, 0xbffff) AM_RAM_WRITE(vga_vram_w) AM_BASE_MEMBER(pcxt_state, m_vga_vram)//VGA RAM + AM_RANGE(0x00000, 0x9ffff) AM_RAM //work RAM 640KB + AM_RANGE(0xa0000, 0xbffff) AM_RAM //CGA VRAM AM_RANGE(0xc0000, 0xcffff) AM_ROMBANK("bank1") + AM_RANGE(0xd0000, 0xeffff) AM_NOP AM_RANGE(0xf0000, 0xfffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( filetto_io, AS_IO, 8 ) +static ADDRESS_MAP_START( pcxt_io_common, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x3ff) AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237_1", i8237_r, i8237_w ) //8237 DMA Controller AM_RANGE(0x0020, 0x002f) AM_DEVREADWRITE("pic8259_1", pic8259_r, pic8259_w ) //8259 Interrupt control @@ -731,56 +551,40 @@ AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE_MODERN("rtc", mc146818_device, read, write) AM_RANGE(0x0080, 0x0087) AM_READWRITE(dma_page_select_r,dma_page_select_w) AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE("pic8259_2", pic8259_r, pic8259_w ) -// AM_RANGE(0x0200, 0x020f) AM_RAM //game port - AM_RANGE(0x0201, 0x0201) AM_READ_PORT("COIN") //game port AM_RANGE(0x0278, 0x027f) AM_RAM //printer (parallel) port latch AM_RANGE(0x02f8, 0x02ff) AM_RAM //Modem port - AM_RANGE(0x0310, 0x0311) AM_READWRITE(disk_iobank_r,disk_iobank_w) //Prototyping card - AM_RANGE(0x0312, 0x0312) AM_READ_PORT("IN0") //Prototyping card,read only AM_RANGE(0x0378, 0x037f) AM_RAM //printer (parallel) port AM_RANGE(0x03bc, 0x03bf) AM_RAM //printer port - AM_RANGE(0x03b4, 0x03b5) AM_READWRITE(vga_regs_r,vga_regs_w) //various VGA/CGA/EGA regs - AM_RANGE(0x03d4, 0x03d5) AM_READWRITE(vga_regs_r,vga_regs_w) //mirror of above - AM_RANGE(0x03d8, 0x03d9) AM_RAM AM_BASE_MEMBER(pcxt_state, m_vga_mode) - AM_RANGE(0x03ba, 0x03bb) AM_READ(vga_hvretrace_r)//Controls H-Blank/V-Blank - AM_RANGE(0x03da, 0x03db) AM_READ(vga_hvretrace_r)//mirror of above AM_RANGE(0x03f2, 0x03f2) AM_WRITE(drive_selection_w) AM_RANGE(0x03f4, 0x03f4) AM_READ(fdc765_status_r) //765 Floppy Disk Controller (FDC) Status AM_RANGE(0x03f5, 0x03f5) AM_READWRITE(fdc765_data_r,fdc765_data_w)//FDC Data AM_RANGE(0x03f8, 0x03ff) AM_RAM //rs232c (serial) port ADDRESS_MAP_END +static ADDRESS_MAP_START( filetto_io, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0x3ff) + AM_IMPORT_FROM( pcxt_io_common ) +// AM_RANGE(0x0200, 0x020f) AM_RAM //game port + AM_RANGE(0x0201, 0x0201) AM_READ_PORT("COIN") //game port + AM_RANGE(0x0310, 0x0311) AM_READWRITE(disk_iobank_r,disk_iobank_w) //Prototyping card + AM_RANGE(0x0312, 0x0312) AM_READ_PORT("IN0") //Prototyping card,read only +ADDRESS_MAP_END + +static WRITE8_HANDLER( tetriskr_bg_bank_w ) +{ + pcxt_state *state = space->machine().driver_data(); + + state->m_bg_bank = (data & 0x0f) ^ 8; +} + static ADDRESS_MAP_START( tetriskr_io, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0x3ff) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237_1", i8237_r, i8237_w ) //8237 DMA Controller - AM_RANGE(0x0020, 0x002f) AM_DEVREADWRITE("pic8259_1", pic8259_r, pic8259_w ) //8259 Interrupt control - AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE("pit8253", pit8253_r, pit8253_w) //8253 PIT - AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) //PPI 8255 - AM_RANGE(0x0064, 0x0066) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) //PPI 8255 - AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE_MODERN("rtc", mc146818_device, read, write) - AM_RANGE(0x0080, 0x0087) AM_READWRITE(dma_page_select_r,dma_page_select_w) - AM_RANGE(0x00a0, 0x00af) AM_DEVREADWRITE("pic8259_2", pic8259_r, pic8259_w ) + AM_IMPORT_FROM( pcxt_io_common ) AM_RANGE(0x0200, 0x020f) AM_RAM //game port -// AM_RANGE(0x0201, 0x0201) AM_READ_PORT("IN1") //game port - AM_RANGE(0x0278, 0x027f) AM_RAM //printer (parallel) port latch - AM_RANGE(0x02f8, 0x02ff) AM_RAM //Modem port -// AM_RANGE(0x0310, 0x0311) AM_READWRITE(disk_iobank_r,disk_iobank_w) //Prototyping card -// AM_RANGE(0x0312, 0x0312) AM_READ_PORT("IN0") //Prototyping card,read only - AM_RANGE(0x0378, 0x037f) AM_RAM //printer (parallel) port - AM_RANGE(0x03c0, 0x03c0) AM_RAM AM_BASE_MEMBER(pcxt_state, m_vga_bg_bank) + AM_RANGE(0x03c0, 0x03c0) AM_WRITE(tetriskr_bg_bank_w) AM_RANGE(0x03c8, 0x03c8) AM_READ_PORT("IN0") AM_RANGE(0x03c9, 0x03c9) AM_READ_PORT("IN1") -// AM_RANGE(0x03ce, 0x03ce) AM_READ_PORT("IN1") - AM_RANGE(0x03bc, 0x03bf) AM_RAM //printer port - AM_RANGE(0x03b4, 0x03b5) AM_READWRITE(vga_regs_r,vga_regs_w) //various VGA/CGA/EGA regs - AM_RANGE(0x03d4, 0x03d5) AM_READWRITE(vga_regs_r,vga_regs_w) //mirror of above - AM_RANGE(0x03d8, 0x03d9) AM_RAM AM_BASE_MEMBER(pcxt_state, m_vga_mode) - AM_RANGE(0x03ba, 0x03bb) AM_READ(vga_hvretrace_r)//Controls H-Blank/V-Blank - AM_RANGE(0x03da, 0x03db) AM_READ(vga_hvretrace_r)//mirror of above - AM_RANGE(0x03f2, 0x03f2) AM_WRITE(drive_selection_w) - AM_RANGE(0x03f4, 0x03f4) AM_READ(fdc765_status_r) //765 Floppy Disk Controller (FDC) Status - AM_RANGE(0x03f5, 0x03f5) AM_READWRITE(fdc765_data_r,fdc765_data_w)//FDC Data - AM_RANGE(0x03f8, 0x03ff) AM_RAM //rs232c (serial) port +// AM_RANGE(0x03ce, 0x03ce) AM_READ_PORT("IN1") //read then discarded? ADDRESS_MAP_END static INPUT_PORTS_START( filetto ) @@ -815,11 +619,14 @@ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START( "pcvideo_cga_config" ) + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END static INPUT_PORTS_START( tetriskr ) PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) //probably unused PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -829,16 +636,15 @@ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) - PORT_START("IN1") //dip-switches? - PORT_DIPNAME( 0x01, 0x01, "IN1" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("IN1") //dip-switches + PORT_DIPNAME( 0x03, 0x03, "Starting Level" ) + PORT_DIPSETTING( 0x03, "0" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "4" ) + PORT_DIPSETTING( 0x00, "6" ) + PORT_DIPNAME( 0x04, 0x04, "Starting Bomb" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -848,122 +654,72 @@ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) +// PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) duplicate + PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) + + PORT_START( "pcvideo_cga_config" ) + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END -static const gfx_layout dos_chars = + +/* F4 Character Displayer */ +static const gfx_layout pc_16_charlayout = { - 8,16, - 256, - 1, - { 0 }, + 8, 16, /* 8 x 16 characters */ + 256, /* 256 characters */ + 1, /* 1 bits per pixel */ + { 0 }, /* no bitplanes */ + /* x offsets */ { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - (0x4000)+(0*8),(0x4000)+(1*8),(0x4000)+(2*8),(0x4000)+(3*8),(0x4000)+(4*8),(0x4000)+(5*8),(0x4000)+(6*8),(0x4000)+(7*8) }, - 8*8 + /* y offsets */ + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 2048*8, 2049*8, 2050*8, 2051*8, 2052*8, 2053*8, 2054*8, 2055*8 }, + 8*8 /* every char takes 2 x 8 bytes */ }; -static const gfx_layout dos_chars2 = +static const gfx_layout pc_8_charlayout = { - 8,8, - 256, - 1, - { 0 }, + 8, 8, /* 8 x 8 characters */ + 512, /* 512 characters */ + 1, /* 1 bits per pixel */ + { 0 }, /* no bitplanes */ + /* x offsets */ { 0, 1, 2, 3, 4, 5, 6, 7 }, + /* y offsets */ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 8*8 + 8*8 /* every char takes 8 bytes */ }; -static GFXDECODE_START( filetto ) - GFXDECODE_ENTRY( "gfx1", 0x0000, dos_chars, 0, 0x100 ) - GFXDECODE_ENTRY( "gfx1", 0x1000, dos_chars2, 0, 0x100 ) - GFXDECODE_ENTRY( "gfx1", 0x1800, dos_chars2, 0, 0x100 ) +static GFXDECODE_START( pcxt ) + GFXDECODE_ENTRY( "gfx1", 0x0000, pc_16_charlayout, 3, 1 ) + GFXDECODE_ENTRY( "gfx1", 0x1000, pc_8_charlayout, 3, 1 ) GFXDECODE_END -static GFXDECODE_START( tetriskr ) - GFXDECODE_ENTRY( "gfx1", 0x0000, dos_chars2, 0, 0x100 ) -GFXDECODE_END - - -/* -BLACK = 0 -BLUE = 1 -GREEN = 2 -CYAN = 3 -RED = 4 -MAGENTA = 5 -BROWN = 6 -LIGHT GRAY = 7 -*/ - -static const rgb_t defcolors[]= -{ - MAKE_RGB(0x00,0x00,0x00), - MAKE_RGB(0x00,0x00,0xaa), - MAKE_RGB(0x00,0xaa,0x00), - MAKE_RGB(0x00,0xaa,0xaa), - MAKE_RGB(0xaa,0x00,0x00), - MAKE_RGB(0xaa,0x00,0xaa), - MAKE_RGB(0xaa,0xaa,0x00), - MAKE_RGB(0xaa,0xaa,0xaa), - MAKE_RGB(0x55,0x55,0x55), - MAKE_RGB(0x55,0x55,0xff), - MAKE_RGB(0x55,0xff,0x55), - MAKE_RGB(0x55,0xff,0xff), - MAKE_RGB(0xff,0x55,0x55), - MAKE_RGB(0xff,0x55,0xff), - MAKE_RGB(0xff,0xff,0x55), - MAKE_RGB(0xff,0xff,0xff) -}; - -static PALETTE_INIT(filetto) -{ - /*Note:palette colors are 6bpp... - xxxx xx-- - */ - int ix,iy; - - for(ix=0;ix<0x300;ix++) - palette_set_color(machine, ix,MAKE_RGB(0x00,0x00,0x00)); - - //regular colors - for(iy=0;iy<0x10;iy++) - { - for(ix=0;ix<0x10;ix++) - { - palette_set_color(machine,(ix*2)+1+(iy*0x20),defcolors[ix]); - palette_set_color(machine,(ix*2)+0+(iy*0x20),defcolors[iy]); - } - } - - //bitmap mode - for(ix=0;ix<0x10;ix++) - palette_set_color(machine, 0x200+ix,defcolors[ix]); - //todo: 256 colors -} static MACHINE_RESET( filetto ) { pcxt_state *state = machine.driver_data(); + device_t *speaker = machine.device("speaker"); state->m_bank = -1; state->m_lastvalue = -1; - state->m_hv_blank = 0; device_set_irq_callback(machine.device("maincpu"), irq_callback); state->m_pit8253 = machine.device( "pit8253" ); state->m_pic8259_1 = machine.device( "pic8259_1" ); state->m_pic8259_2 = machine.device( "pic8259_2" ); state->m_dma8237_1 = machine.device( "dma8237_1" ); state->m_dma8237_2 = machine.device( "dma8237_2" ); + + state->m_pc_spkrdata = 0; + state->m_pc_input = 0; + + speaker_level_w( speaker, 0 ); } static MACHINE_CONFIG_START( filetto, pcxt_state ) - MCFG_CPU_ADD("maincpu", I8088, 8000000) //or regular PC-XT 14318180/3 clock? + MCFG_CPU_ADD("maincpu", I8088, XTAL_14_31818MHz/3) MCFG_CPU_PROGRAM_MAP(filetto_map) MCFG_CPU_IO_MAP(filetto_io) @@ -982,21 +738,8 @@ MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) - MCFG_GFXDECODE(filetto) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0*8, 640-1, 0*8, 480-1) - MCFG_SCREEN_UPDATE(filetto) - - MCFG_PALETTE_LENGTH(0x300) - - MCFG_PALETTE_INIT(filetto) - - MCFG_VIDEO_START(filetto) + MCFG_FRAGMENT_ADD( pcvideo_cga ) + MCFG_GFXDECODE(pcxt) /*Sound Hardware*/ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1005,52 +748,19 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) // PC "buzzer" sound - MCFG_SOUND_ADD("beep", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MACHINE_CONFIG_END -static MACHINE_CONFIG_START( tetriskr, pcxt_state ) - MCFG_CPU_ADD("maincpu", I8088, 14318180/3) - MCFG_CPU_PROGRAM_MAP(filetto_map) +static MACHINE_CONFIG_DERIVED( tetriskr, filetto ) + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(tetriskr_io) - MCFG_MACHINE_RESET( filetto ) - - MCFG_PIT8253_ADD( "pit8253", pc_pit8253_config ) - - MCFG_PPI8255_ADD( "ppi8255_0", filetto_ppi8255_intf[0] ) - MCFG_PPI8255_ADD( "ppi8255_1", filetto_ppi8255_intf[1] ) - - MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_DEVICE_MODIFY("screen") + MCFG_VIDEO_START(pc_cga_superimpose) + MCFG_SCREEN_UPDATE_STATIC(tetriskr) - MCFG_PIC8259_ADD( "pic8259_1", pic8259_1_config ) - - MCFG_PIC8259_ADD( "pic8259_2", pic8259_2_config ) - - MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) - - MCFG_GFXDECODE(tetriskr) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0*8, 640-1, 0*8, 480-1) - MCFG_SCREEN_UPDATE(tetriskr) - - MCFG_PALETTE_LENGTH(0x300) - - MCFG_PALETTE_INIT(filetto) - - MCFG_VIDEO_START(tetriskr) - - /*Sound Hardware*/ - MCFG_SPEAKER_STANDARD_MONO("mono") - -// PC "buzzer" sound - MCFG_SOUND_ADD("beep", BEEP, 0) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) + MCFG_DEVICE_REMOVE("voice") MACHINE_CONFIG_END ROM_START( filetto ) @@ -1064,7 +774,7 @@ ROM_RELOAD( 0xf6000, 0x2000 ) ROM_RELOAD( 0xf2000, 0x2000 ) - ROM_REGION( 0x40000, "user1", 0 ) // program data + ROM_REGION( 0x40000, "game_prg", 0 ) // program data ROM_LOAD( "m0.u1", 0x00000, 0x10000, CRC(2408289d) SHA1(eafc144a557a79b58bcb48545cb9c9778e61fcd3) ) ROM_LOAD( "m1.u2", 0x10000, 0x10000, CRC(5b623114) SHA1(0d9a14e6b7f57ce4fa09762343b610a973910f58) ) ROM_LOAD( "m2.u3", 0x20000, 0x10000, CRC(abc64869) SHA1(564fc9d90d241a7b7776160b3fd036fb08037355) ) @@ -1073,7 +783,7 @@ ROM_REGION( 0x2000, "gfx1", 0 ) ROM_LOAD("u67.bin", 0x0000, 0x2000, CRC(09710122) SHA1(de84bdd9245df287bbd3bb808f0c3531d13a3545) ) - ROM_REGION( 0x40000, "user2", 0 ) // UM5100 sample roms? + ROM_REGION( 0x40000, "samples", 0 ) // UM5100 sample roms? ROM_LOAD16_BYTE("v1.u15", 0x00000, 0x20000, CRC(613ddd07) SHA1(ebda3d559315879819cb7034b5696f8e7861fe42) ) ROM_LOAD16_BYTE("v2.u14", 0x00001, 0x20000, CRC(427e012e) SHA1(50514a6307e63078fe7444a96e39d834684db7df) ) ROM_END @@ -1082,10 +792,11 @@ ROM_REGION( 0x100000, "maincpu", 0 ) /* code */ ROM_LOAD( "b-10.u10", 0xf0000, 0x10000, CRC(efc2a0f6) SHA1(5f0f1e90237bee9b78184035a32055b059a91eb3) ) - ROM_REGION( 0x10000, "gfx1",0 ) /* gfx - 1bpp font*/ - ROM_LOAD( "b-3.u36", 0x00000, 0x2000, CRC(1a636f9a) SHA1(a356cc57914d0c9b9127670b55d1f340e64b1ac9) ) + ROM_REGION( 0x2000, "gfx1",ROMREGION_ERASE00 ) /* gfx - 1bpp font*/ + ROM_LOAD( "b-3.u36", 0x1800, 0x0800, CRC(1a636f9a) SHA1(a356cc57914d0c9b9127670b55d1f340e64b1ac9) ) + ROM_IGNORE( 0x1800 ) - ROM_REGION( 0x80000, "gfx2",ROMREGION_INVERT ) + ROM_REGION( 0x80000+1, "gfx2",ROMREGION_INVERT | ROMREGION_ERASEFF ) ROM_LOAD( "b-1.u59", 0x00000, 0x10000, CRC(4719d986) SHA1(6e0499944b968d96fbbfa3ead6237d69c769d634)) ROM_LOAD( "b-2.u58", 0x10000, 0x10000, CRC(599e1154) SHA1(14d99f90b4fedeab0ac24ffa9b1fd9ad0f0ba699)) ROM_LOAD( "b-4.u54", 0x20000, 0x10000, CRC(e112c450) SHA1(dfdecfc6bd617ec520b7563b7caf44b79d498bd3)) @@ -1094,9 +805,6 @@ ROM_LOAD( "b-7.u48", 0x50000, 0x10000, CRC(79336b6c) SHA1(7a95875f3071bdc3ee25c0e6a5a3c00ef02dc977)) ROM_LOAD( "b-8.u44", 0x60000, 0x10000, CRC(1f82121a) SHA1(106da0f39f1260d0761217ed0a24c1611bfd7f05)) ROM_LOAD( "b-9.u43", 0x70000, 0x10000, CRC(4ea22349) SHA1(14dfd3dbd51f8bd6f3290293b8ea1c165e8cf7fd)) - - ROM_REGION( 0x180000, "user1", ROMREGION_ERASEFF ) - // copy for the gfx2,to be made with the DRIVER_INIT ROM_END static DRIVER_INIT( filetto ) @@ -1104,32 +812,10 @@ //... } -/*Descramble the background gfx data.*/ static DRIVER_INIT( tetriskr ) { - int i,j,k; - int index=0; - UINT8 *region = machine.region("user1")->base(); - UINT8 *gfx = machine.region("gfx2")->base(); - - for(i=0;i<0x20000;i++) - { - //8 pixels/byte - for(j=0;j<8;j++) - { - int mask=(1<<(7-j)); - int pixel=0; - for(k=0;k<4;k++) - { - if(gfx[k*0x20000+i]&mask) - { - pixel|=(1<machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - static MACHINE_CONFIG_START( pengadvb, pengadvb_state ) @@ -286,7 +278,7 @@ /* video hardware */ MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, pengadvb_tms9928a_interface ) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( pengadvb ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/pengo.c mame-0.145/src/mame/drivers/pengo.c --- mame-0.144/src/mame/drivers/pengo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/pengo.c 2012-02-06 21:30:41.000000000 +0000 @@ -110,6 +110,12 @@ coin_counter_w(space->machine(), offset, data & 1); } +static WRITE8_HANDLER( irq_mask_w ) +{ + pengo_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( pengo_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM @@ -121,7 +127,7 @@ AM_RANGE(0x9020, 0x902f) AM_WRITEONLY AM_BASE_GENERIC(spriteram2) AM_RANGE(0x9000, 0x903f) AM_READ_PORT("DSW1") AM_RANGE(0x9040, 0x907f) AM_READ_PORT("DSW0") - AM_RANGE(0x9040, 0x9040) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x9040, 0x9040) AM_WRITE(irq_mask_w) AM_RANGE(0x9041, 0x9041) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x9042, 0x9042) AM_WRITE(pengo_palettebank_w) AM_RANGE(0x9043, 0x9043) AM_WRITE(pacman_flipscreen_w) @@ -143,7 +149,7 @@ AM_RANGE(0x9020, 0x902f) AM_WRITEONLY AM_BASE_GENERIC(spriteram2) AM_RANGE(0x9030, 0x9030) AM_WRITE(jrpacman_scroll_w) AM_RANGE(0x9040, 0x904f) AM_READ_PORT("DSW") - AM_RANGE(0x9040, 0x9040) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x9040, 0x9040) AM_WRITE(irq_mask_w) AM_RANGE(0x9041, 0x9041) AM_DEVWRITE("namco", pacman_sound_enable_w) AM_RANGE(0x9042, 0x9042) AM_WRITE(pengo_palettebank_w) AM_RANGE(0x9043, 0x9043) AM_WRITE(pacman_flipscreen_w) @@ -359,21 +365,29 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + pengo_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( pengo, pengo_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(pengo_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_GFXDECODE(pengo) MCFG_PALETTE_LENGTH(128*4) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(pacman) + MCFG_SCREEN_UPDATE_STATIC(pacman) MCFG_PALETTE_INIT(pacman) MCFG_VIDEO_START(pengo) diff -Nru mame-0.144/src/mame/drivers/peplus.c mame-0.145/src/mame/drivers/peplus.c --- mame-0.144/src/mame/drivers/peplus.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/peplus.c 2012-02-06 21:30:42.000000000 +0000 @@ -321,8 +321,8 @@ const rectangle &vis_area = device->machine().primary_screen->visible_area(); int xt, yt; - xt = x_val * (vis_area.max_x - vis_area.min_x) / 1024 + vis_area.min_x; - yt = y_val * (vis_area.max_y - vis_area.min_y) / 1024 + vis_area.min_y; + xt = x_val * vis_area.width() / 1024 + vis_area.min_x; + yt = y_val * vis_area.height() / 1024 + vis_area.min_y; device->machine().scheduler().timer_set(device->machine().primary_screen->time_until_pos(yt, xt), FUNC(assert_lp_cb), 0, device); } @@ -341,7 +341,7 @@ state->m_palette_ram[state->m_vid_address] = state->m_io_port[1]; state->m_palette_ram2[state->m_vid_address] = state->m_io_port[3]; - tilemap_mark_tile_dirty(state->m_bg_tilemap, state->m_vid_address); + state->m_bg_tilemap->mark_tile_dirty(state->m_vid_address); /* An access here triggers a device read !*/ space->machine().device("crtc")->register_r(*space, 0); @@ -672,10 +672,10 @@ memset(state->m_palette_ram2, 0, 0x3000); } -static SCREEN_UPDATE( peplus ) +static SCREEN_UPDATE_IND16( peplus ) { - peplus_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + peplus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1037,10 +1037,9 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((52+1)*8, (31+1)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 25*8-1) - MCFG_SCREEN_UPDATE(peplus) + MCFG_SCREEN_UPDATE_STATIC(peplus) MCFG_GFXDECODE(peplus) MCFG_PALETTE_LENGTH(16*16*2) diff -Nru mame-0.144/src/mame/drivers/peyper.c mame-0.145/src/mame/drivers/peyper.c --- mame-0.144/src/mame/drivers/peyper.c 2012-01-13 15:34:47.000000000 +0000 +++ mame-0.145/src/mame/drivers/peyper.c 2012-02-06 21:30:33.000000000 +0000 @@ -617,10 +617,10 @@ ROM_END -GAME( 1985, odin_dlx, 0, peyper, odin_dlx, peyper, ROT0, "Sonic", "Odin De Luxe", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1986, solarwap, 0, peyper, solarwap, peyper, ROT0, "Sonic", "Solar Wars (Sonic)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, poleposn, 0, peyper, poleposn, peyper, ROT0, "Sonic", "Pole Position (Sonic)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, sonstwar, 0, peyper, sonstwar, peyper, ROT0, "Sonic", "Star Wars (Sonic)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME( 1985, odin_dlx, 0, peyper, odin_dlx, peyper, ROT0, "Sonic", "Odin De Luxe", GAME_IS_SKELETON_MECHANICAL) +GAME( 1986, solarwap, 0, peyper, solarwap, peyper, ROT0, "Sonic", "Solar Wars (Sonic)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, poleposn, 0, peyper, poleposn, peyper, ROT0, "Sonic", "Pole Position (Sonic)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, sonstwar, 0, peyper, sonstwar, peyper, ROT0, "Sonic", "Star Wars (Sonic)", GAME_IS_SKELETON_MECHANICAL) -GAME( 1987, wolfman, 0, peyper, wolfman, peyper, ROT0, "Peyper", "Wolf Man", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1987, odisea, 0, peyper, odisea, peyper, ROT0, "Peyper", "Odisea Paris-Dakar", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME( 1987, wolfman, 0, peyper, wolfman, peyper, ROT0, "Peyper", "Wolf Man", GAME_IS_SKELETON_MECHANICAL) +GAME( 1987, odisea, 0, peyper, odisea, peyper, ROT0, "Peyper", "Odisea Paris-Dakar", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/pgm2.c mame-0.145/src/mame/drivers/pgm2.c --- mame-0.144/src/mame/drivers/pgm2.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/pgm2.c 2012-02-06 21:30:39.000000000 +0000 @@ -0,0 +1,309 @@ + + +/* PGM 2 hardware. + + Motherboard is bare bones stuff, probably only contains the video processor, no ROMs. + + Makes use of internal ROM ASICS, newer than those found on the best protected PGM games. Games actually boot to a warning screen even if you remove all program roms! + + Encrypted. + + I'm guessing it's ARM based, but not sure. + +*/ + +#include "emu.h" +#include "cpu/arm7/arm7.h" +#include "cpu/arm7/arm7core.h" +#include "sound/ymz770.h" + +class pgm2_state : public driver_device +{ +public: + pgm2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + { } + +}; + +static ADDRESS_MAP_START( pgm2_map, AS_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x00003fff) AM_ROM +ADDRESS_MAP_END + +static INPUT_PORTS_START( pgm2 ) +INPUT_PORTS_END + +static SCREEN_UPDATE_IND16(pgm2) +{ + return 0; +} + +static SCREEN_VBLANK(pgm2) +{ + +} + +static VIDEO_START(pgm2) +{ + +} + +static MACHINE_START( pgm2 ) +{ + +} + +static MACHINE_RESET( pgm2 ) +{ + +} + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 0, 1, 2, 3 }, + { 4, 0, 12, 8, 20, 16, 28, 24 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 +}; + +/* slightly odd decode, and ends up with multiple letters in a single 32x32 tile, can probably specify corners, or needs an address line swap before decode */ +/* actually 7bpp? roms report fixed bits, but should be good dumps */ +static const gfx_layout tiles32x32x8_layout = +{ + 32,32, + RGN_FRAC(1,1), + 8, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 2*8, 1*8, 3*8, 4*8, 6*8, 5*8, 7*8, 8*8, 10*8, 9*8, 11*8, 12*8, 14*8, 13*8, 15*8, + 16*8, 18*8, 17*8, 19*8, 20*8, 22*8, 21*8, 23*8, 24*8, 26*8, 25*8, 27*8, 28*8, 30*8, 29*8, 31*8 }, + { 0*256, 1*256, 2*256, 3*256, 4*256, 5*256, 6*256, 7*256, 8*256, 9*256, 10*256, 11*256, 12*256, 13*256, 14*256, 15*256, + 16*256, 17*256, 18*256, 19*256, 20*256, 21*256, 22*256, 23*256, 24*256, 25*256, 26*256, 27*256, 28*256, 29*256, 30*256, 31*256 + }, + 256*32 +}; + +/* sprites aren't tile based, this is variable width 1bpp data, colour data is almost certainly in sprites b */ +/* there don't seem to be any indexes into the colour data, probably provided by the program, or the colour data references the bitmaps (reverse of PGM) */ +static const gfx_layout tiles32x8x1_layout = +{ + 32,8, + RGN_FRAC(1,1), + 1, + { 0 }, + { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }, + { 0*32,1*32,2*32,3*32,4*32,5*32,6*32,7*32 }, + 8*32 +}; + + + + +static GFXDECODE_START( pgm2 ) + GFXDECODE_ENTRY( "tiles", 0, tiles8x8_layout, 0, 16 ) + GFXDECODE_ENTRY( "bgtile", 0, tiles32x32x8_layout, 0, 16 ) + // not tile based + GFXDECODE_ENTRY( "spritesa", 0, tiles32x8x1_layout, 0, 16 ) + GFXDECODE_ENTRY( "spritesb", 0, tiles32x8x1_layout, 0, 16 ) +GFXDECODE_END + + + +static MACHINE_CONFIG_START( pgm2, pgm2_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", ARM7, 20000000) // ?? unknown CPU, has internal ROM. + MCFG_CPU_PROGRAM_MAP(pgm2_map) +// MCFG_DEVICE_DISABLE() + + MCFG_MACHINE_START( pgm2 ) + MCFG_MACHINE_RESET( pgm2 ) + + MCFG_GFXDECODE(pgm2) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(64*8, 64*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 56*8-1, 0*8, 28*8-1) + MCFG_SCREEN_UPDATE_STATIC(pgm2) + MCFG_SCREEN_VBLANK_STATIC(pgm2) + + MCFG_PALETTE_LENGTH(0x1000) + + MCFG_VIDEO_START(pgm2) + + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_YMZ770_ADD("ymz770", 16384000) + MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) +MACHINE_CONFIG_END + +ROM_START( orleg2 ) + ROM_REGION( 0x800000, "maincpu", 0 ) /* External Code (Internal is missing) */ + ROM_LOAD16_WORD_SWAP( "xyj2_v104cn.u7", 0x000000, 0x800000, CRC(7c24a4f5) SHA1(3cd9f9264ef2aad0869afdf096e88eb8d74b2570) ) + + ROM_REGION( 0x0200000, "tiles", ROMREGION_ERASEFF ) + ROM_LOAD( "ig-a.u4", 0x000000, 0x0200000, CRC(fa444c32) SHA1(31e5e3efa92d52bf9ab97a0ece51e3b77f52ce8a) ) + + ROM_REGION( 0x1000000, "bgtile", 0 ) + ROM_LOAD16_BYTE( "ig-a.u35", 0x000000, 0x0800000, CRC(083a8315) SHA1(0dba25e132fbb12faa59ced648c27b881dc73478) ) + ROM_LOAD16_BYTE( "ig-a.u36", 0x000001, 0x0800000, CRC(e197221d) SHA1(5574b1e3da4b202db725be906dd868edc2fd4634) ) + + ROM_REGION( 0x2000000, "spritesa", 0 ) // 1bpp sprite mask data + ROM_LOAD32_WORD( "ig-a.u12", 0x000000, 0x1000000, CRC(113a331c) SHA1(ee6b31bb2b052cc8799573de0d2f0a83f0ab4f6a) ) + ROM_LOAD32_WORD( "ig-a.u16", 0x000002, 0x1000000, CRC(fbf411c8) SHA1(5089b5cc9bbf6496ef1367c6255e63e9ab895117) ) + + ROM_REGION( 0x4000000, "spritesb", 0 ) // sprite colour data? + ROM_LOAD16_BYTE( "ig-a.u18", 0x000000, 0x2000000, CRC(43501fa6) SHA1(58ccce6d393964b771fec3f5c583e3ede57482a3) ) + ROM_LOAD16_BYTE( "ig-a.u26", 0x000001, 0x2000000, CRC(7051d020) SHA1(3d9b24c6fda4c9699bb9f00742e0888059b623e1) ) + + ROM_REGION( 0x1000000, "ymz770", ROMREGION_ERASEFF ) /* ymz770? */ + ROM_LOAD16_WORD_SWAP( "ig-a.u2", 0x000000, 0x1000000, CRC(8250688c) SHA1(d2488477afc528aeee96826065deba2bce4f0a7d) ) +ROM_END + +ROM_START( orleg2o ) + ROM_REGION( 0x800000, "maincpu", 0 ) /* External Code (Internal is missing) */ + ROM_LOAD16_WORD_SWAP( "xyj2_v103cn.u7", 0x000000, 0x800000, CRC(21c1fae8) SHA1(36eeb7a5e8dc8ee7c834f3ff1173c28cf6c2f1a3) ) + + ROM_REGION( 0x0200000, "tiles", ROMREGION_ERASEFF ) + ROM_LOAD( "ig-a.u4", 0x000000, 0x0200000, CRC(fa444c32) SHA1(31e5e3efa92d52bf9ab97a0ece51e3b77f52ce8a) ) + + ROM_REGION( 0x1000000, "bgtile", 0 ) + ROM_LOAD16_BYTE( "ig-a.u35", 0x000000, 0x0800000, CRC(083a8315) SHA1(0dba25e132fbb12faa59ced648c27b881dc73478) ) + ROM_LOAD16_BYTE( "ig-a.u36", 0x000001, 0x0800000, CRC(e197221d) SHA1(5574b1e3da4b202db725be906dd868edc2fd4634) ) + + ROM_REGION( 0x2000000, "spritesa", 0 ) // 1bpp sprite mask data + ROM_LOAD32_WORD( "ig-a.u12", 0x000000, 0x1000000, CRC(113a331c) SHA1(ee6b31bb2b052cc8799573de0d2f0a83f0ab4f6a) ) + ROM_LOAD32_WORD( "ig-a.u16", 0x000002, 0x1000000, CRC(fbf411c8) SHA1(5089b5cc9bbf6496ef1367c6255e63e9ab895117) ) + + ROM_REGION( 0x4000000, "spritesb", 0 ) // sprite colour data? + ROM_LOAD16_BYTE( "ig-a.u18", 0x000000, 0x2000000, CRC(43501fa6) SHA1(58ccce6d393964b771fec3f5c583e3ede57482a3) ) + ROM_LOAD16_BYTE( "ig-a.u26", 0x000001, 0x2000000, CRC(7051d020) SHA1(3d9b24c6fda4c9699bb9f00742e0888059b623e1) ) + + ROM_REGION( 0x1000000, "ymz770", ROMREGION_ERASEFF ) /* ymz770? */ + ROM_LOAD16_WORD_SWAP( "ig-a.u2", 0x000000, 0x1000000, CRC(8250688c) SHA1(d2488477afc528aeee96826065deba2bce4f0a7d) ) +ROM_END + +ROM_START( kov2nl ) + ROM_REGION( 0x800000, "maincpu", 0 ) /* External Code (Internal is missing) */ + ROM_LOAD16_WORD_SWAP( "gsyx_v302cn.u7", 0x000000, 0x800000, CRC(b19cf540) SHA1(25da5804bbfd7ef2cdf5cc5aabaa803d18b98929) ) + + ROM_REGION( 0x0200000, "tiles", ROMREGION_ERASEFF ) + ROM_LOAD( "ig-a3.u4", 0x000000, 0x0200000, CRC(214530ff) SHA1(4231a02054b0345392a077042b95779fd45d6c22) ) + + ROM_REGION( 0x1000000, "bgtile", 0 ) + ROM_LOAD16_BYTE( "ig-a3.u35", 0x000000, 0x0800000, CRC(2d46b1f6) SHA1(ea8c805eda6292e86a642e9633d8fee7054d10b1) ) + ROM_LOAD16_BYTE( "ig-a3.u36", 0x000001, 0x0800000, CRC(df710c36) SHA1(f826c3f496c4f17b46d18af1d8e02cac7b7027ac) ) + + ROM_REGION( 0x2000000, "spritesa", 0 ) // 1bpp sprite mask data + ROM_LOAD32_WORD( "ig-a3.u12", 0x000000, 0x1000000, CRC(0bf63836) SHA1(b8e4f1951f8074b475b795bd7840c5a375b6f5ef) ) + ROM_LOAD32_WORD( "ig-a3.u16", 0x000002, 0x1000000, CRC(4a378542) SHA1(5d06a8a8796285a786ebb690c34610f923ef5570) ) + + ROM_REGION( 0x4000000, "spritesb", 0 ) // sprite colour data? + ROM_LOAD16_BYTE( "ig-a3.u18", 0x000000, 0x2000000, CRC(8d923e1f) SHA1(14371cf385dd8857017d3111cd4710f4291b1ae2) ) + ROM_LOAD16_BYTE( "ig-a3.u26", 0x000001, 0x2000000, CRC(5b6fbf3f) SHA1(d1f52e230b91ee6cde939d7c2b74da7fd6527e73) ) + + ROM_REGION( 0x2000000, "ymz770", ROMREGION_ERASEFF ) /* ymz770? */ + ROM_LOAD16_WORD_SWAP( "ig-a3.u37", 0x000000, 0x2000000, CRC(45cdf422) SHA1(8005d284bcee73cff37a147fcd1c3e9f039a7203) ) +ROM_END + +ROM_START( kov2nlo ) + ROM_REGION( 0x800000, "maincpu", 0 ) /* External Code (Internal is missing) */ + ROM_LOAD16_WORD_SWAP( "gsyx_v301cn.u7", 0x000000, 0x800000, CRC(c4595c2c) SHA1(09e379556ef76f81a63664f46d3f1415b315f384) ) + + ROM_REGION( 0x0200000, "tiles", ROMREGION_ERASEFF ) + ROM_LOAD( "ig-a3.u4", 0x000000, 0x0200000, CRC(214530ff) SHA1(4231a02054b0345392a077042b95779fd45d6c22) ) + + ROM_REGION( 0x1000000, "bgtile", 0 ) + ROM_LOAD16_BYTE( "ig-a3.u35", 0x000000, 0x0800000, CRC(2d46b1f6) SHA1(ea8c805eda6292e86a642e9633d8fee7054d10b1) ) + ROM_LOAD16_BYTE( "ig-a3.u36", 0x000001, 0x0800000, CRC(df710c36) SHA1(f826c3f496c4f17b46d18af1d8e02cac7b7027ac) ) + + ROM_REGION( 0x2000000, "spritesa", 0 ) // 1bpp sprite mask data + ROM_LOAD32_WORD( "ig-a3.u12", 0x000000, 0x1000000, CRC(0bf63836) SHA1(b8e4f1951f8074b475b795bd7840c5a375b6f5ef) ) + ROM_LOAD32_WORD( "ig-a3.u16", 0x000002, 0x1000000, CRC(4a378542) SHA1(5d06a8a8796285a786ebb690c34610f923ef5570) ) + + ROM_REGION( 0x4000000, "spritesb", 0 ) // sprite colour data? + ROM_LOAD16_BYTE( "ig-a3.u18", 0x000000, 0x2000000, CRC(8d923e1f) SHA1(14371cf385dd8857017d3111cd4710f4291b1ae2) ) + ROM_LOAD16_BYTE( "ig-a3.u26", 0x000001, 0x2000000, CRC(5b6fbf3f) SHA1(d1f52e230b91ee6cde939d7c2b74da7fd6527e73) ) + + ROM_REGION( 0x2000000, "ymz770", ROMREGION_ERASEFF ) /* ymz770? */ + ROM_LOAD16_WORD_SWAP( "ig-a3.u37", 0x000000, 0x2000000, CRC(45cdf422) SHA1(8005d284bcee73cff37a147fcd1c3e9f039a7203) ) +ROM_END + +static void iga_u16_decode(UINT16 *rom, int len, int ixor) +{ + int i; + + for (i = 1; i < len / 2; i+=2) + { + UINT16 x = ixor; + + if ( (i>>1) & 0x000001) x ^= 0x0010; + if ( (i>>1) & 0x000002) x ^= 0x2004; + if ( (i>>1) & 0x000004) x ^= 0x0801; + if ( (i>>1) & 0x000008) x ^= 0x0300; + if ( (i>>1) & 0x000010) x ^= 0x0080; + if ( (i>>1) & 0x000020) x ^= 0x0020; + if ( (i>>1) & 0x000040) x ^= 0x4008; + if ( (i>>1) & 0x000080) x ^= 0x1002; + if ( (i>>1) & 0x000100) x ^= 0x0400; + if ( (i>>1) & 0x000200) x ^= 0x0040; + if ( (i>>1) & 0x000400) x ^= 0x8000; + + rom[i] ^= x; + rom[i] = BITSWAP16(rom[i], 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7); + } +} + +static void iga_u12_decode(UINT16* rom, int len, int ixor) +{ + int i; + + for (i = 0; i < len / 2; i+=2) + { + UINT16 x = ixor; + + if ( (i>>1) & 0x000001) x ^= 0x9004; + if ( (i>>1) & 0x000002) x ^= 0x0028; + if ( (i>>1) & 0x000004) x ^= 0x0182; + if ( (i>>1) & 0x000008) x ^= 0x0010; + if ( (i>>1) & 0x000010) x ^= 0x2040; + if ( (i>>1) & 0x000020) x ^= 0x0801; + if ( (i>>1) & 0x000040) x ^= 0x0000; + if ( (i>>1) & 0x000080) x ^= 0x0000; + if ( (i>>1) & 0x000100) x ^= 0x4000; + if ( (i>>1) & 0x000200) x ^= 0x0600; + if ( (i>>1) & 0x000400) x ^= 0x0000; + + rom[i] ^= x; + rom[i] = BITSWAP16(rom[i], 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7); + } +} + +static DRIVER_INIT( orleg2 ) +{ + UINT16 *src = (UINT16 *)machine.region("spritesa")->base(); + + iga_u12_decode(src, 0x2000000, 0x4761); + iga_u16_decode(src, 0x2000000, 0xc79f); +} + +static DRIVER_INIT( kov2nl ) +{ + UINT16 *src = (UINT16 *)machine.region("spritesa")->base(); + + iga_u12_decode(src, 0x2000000, 0xa193); + iga_u16_decode(src, 0x2000000, 0xb780); +} + + +/* PGM2 */ +GAME( 2007, orleg2, 0, pgm2, pgm2, orleg2, ROT0, "IGS", "Oriental Legend 2 (V104, China)", GAME_IS_SKELETON ) +GAME( 2007, orleg2o, orleg2, pgm2, pgm2, orleg2, ROT0, "IGS", "Oriental Legend 2 (V103, China)", GAME_IS_SKELETON ) + +GAME( 2008, kov2nl, 0, pgm2, pgm2, kov2nl, ROT0, "IGS", "Knights of Valour 2 New Legend (V302, China)", GAME_IS_SKELETON ) +GAME( 2008, kov2nlo, kov2nl, pgm2, pgm2, kov2nl, ROT0, "IGS", "Knights of Valour 2 New Legend (V301, China)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/pgm.c mame-0.145/src/mame/drivers/pgm.c --- mame-0.144/src/mame/drivers/pgm.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pgm.c 2012-02-06 21:30:35.000000000 +0000 @@ -46,89 +46,11 @@ 0450x - 2002 - Demon Front (also known to be produced / sold in a single PCB version) ---- +(add more) -unknown codes: -Dragon World 2001 -Photo Y2k2 -The Gladiator +ToDo: ---- - - -Oriental Legend -Oriental Legend Super -Sengoku Senki / Knights of Valour Series -- -Sangoku Senki (c)1999 IGS -Sangoku Senki Super Heroes (c)1999 IGS -Sangoku Senki 2 Knights of Valour (c)2000 IGS -Sangoku Senki Busyou Souha (c)2001 IGS -- -DoDonPachi II (Bee Storm) -Photo Y2K -Photo Y2K II -Martial Masters -The Killing Blade -Dragon World 2 -Dragon World 3 -Dragon World 2001 -Demon Front -The Gladiator -Puzzli II - -There is also a single board version of the PGM system used by - -Demon Front -Some Later (2002/2003) Cave shooters (Uses a Custom CAVE BIOS) - -To Do / Notes: (Revised December 2005) - -Missing Sprite Features - Zooming (table is uploaded to Video Ram) - It is possible sprites should be transfered out of RAM with a DMA device. - Priority? - -Protection in Mnny Games - It is possible to read the Internal Rom of the ASIC27A games with external data - rom, but not the ones with no External Rom. - Some of the other protection devices aren't understood at all yet, for example - the ones on Dragon World 3, Oriental Legend Super and The Killing Blade. - an ARM core with thumbs support is required to emulate the ASIC27A based games - even with the internal rom. At the current time the MAME core does not support - this, Nebula does. - -fix sound comms, several games fail prior to their protection checks due to the -current sound implementation. - -Fix IRQs, maybe the protection device generates one of them on DW2 as I believe -it's the only game that needs IRQ4 and Puzzli2 explicitly doesn't want IRQ4 to be -active. - -Some dumps are suspicious (orlegend super clones are missing roms, drgw3 sets -might not have the right protection rom) In many cases the external protection -data roms change with each revision of the game. - - -General Notes: --------------- - -Tit makes more sense to name them kov since the roms are probably the same on the various -boards. The current sets were taken from taiwan boards incase somebody finds -it not to be the case however due to the previous note. - -As we can't dump the internal rom of rhte protection devices (which contain the region -information the only way we can support multiple regions is with a fake dipswitch, this -isn't idea as it gives the false impression that the board contain a region dipswitch) - -Dragon World 2 still has strange protection issues, we have to patch the code for now, what -should really happen, it jumps to invalid code, should the protection device cause the 68k -to see valid code there or something? The English version of Dragon World 2 still appears -to have some problems which the current patching doesn't cover. - -kov superheroes uses a different protection chip / different protection commands and doesn't -work, some of the gfx also need redumping to check they're the same as kov, its using invalid -codes for the ones we have (could just be protection tho) + IRQ4 generation - Puzzli 2 doens't like this, many other games require it for coins / inputs to work. Protection Devices / Co-processors @@ -193,6 +115,8 @@ The Killing Blade Plus Spectral VS Generation + The 55857G variant appears to be protected against reading even from native code. + there are probably more... PCB Layout @@ -295,11 +219,11 @@ #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "cpu/arm7/arm7.h" -#include "deprecat.h" #include "sound/ics2115.h" #include "cpu/arm7/arm7core.h" #include "machine/nvram.h" #include "includes/pgm.h" +#include "machine/v3021.h" UINT16 *pgm_mainram; static void IGS022_reset(running_machine& machine); @@ -494,257 +418,7 @@ sound_irq };*/ - -/* Calendar Emulation */ - -static UINT8 bcd( UINT8 data ) -{ - return ((data / 10) << 4) | (data % 10); -} - -static READ16_HANDLER( pgm_calendar_r ) -{ - pgm_state *state = space->machine().driver_data(); - UINT8 calr = (state->m_cal_val & state->m_cal_mask) ? 1 : 0; - - state->m_cal_mask <<= 1; - return calr; -} - -static WRITE16_HANDLER( pgm_calendar_w ) -{ - pgm_state *state = space->machine().driver_data(); - - space->machine().base_datetime(state->m_systime); - - state->m_cal_com <<= 1; - state->m_cal_com |= data & 1; - ++state->m_cal_cnt; - - if (state->m_cal_cnt == 4) - { - state->m_cal_mask = 1; - state->m_cal_val = 1; - state->m_cal_cnt = 0; - - switch (state->m_cal_com & 0xf) - { - case 1: case 3: case 5: case 7: case 9: case 0xb: case 0xd: - state->m_cal_val++; - break; - - case 0: - state->m_cal_val = bcd(state->m_systime.local_time.weekday); //?? - break; - - case 2: //Hours - state->m_cal_val = bcd(state->m_systime.local_time.hour); - break; - - case 4: //Seconds - state->m_cal_val = bcd(state->m_systime.local_time.second); - break; - - case 6: //Month - state->m_cal_val = bcd(state->m_systime.local_time.month + 1); //?? not bcd in MVS - break; - - case 8: - state->m_cal_val = 0; //Controls blinking speed, maybe milliseconds - break; - - case 0xa: //Day - state->m_cal_val = bcd(state->m_systime.local_time.mday); - break; - - case 0xc: //Minute - state->m_cal_val = bcd(state->m_systime.local_time.minute); - break; - - case 0xe: //Year - state->m_cal_val = bcd(state->m_systime.local_time.year % 100); - break; - - case 0xf: //Load Date - space->machine().base_datetime(state->m_systime); - break; - } - } -} - -/*** Memory Maps *************************************************************/ - -static ADDRESS_MAP_START( pgm_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x5fffff) AM_ROMBANK("bank1") /* Game ROM */ - - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( killbld_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x2fffff) AM_ROMBANK("bank1") /* Game ROM */ - AM_RANGE(0x300000, 0x303fff) AM_RAM AM_BASE_MEMBER(pgm_state, m_sharedprotram) // Shared with protection device - - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( olds_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x3fffff) AM_ROMBANK("bank1") /* Game ROM */ - AM_RANGE(0x400000, 0x403fff) AM_RAM AM_BASE_MEMBER(pgm_state, m_sharedprotram) // Shared with protection device - - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( kov2_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x5fffff) AM_ROMBANK("bank1") /* Game ROM */ - - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ - AM_RANGE(0xd00000, 0xd0ffff) AM_READWRITE(arm7_ram_r, arm7_ram_w) /* ARM7 Shared RAM */ - AM_RANGE(0xd10000, 0xd10001) AM_READWRITE(arm7_latch_68k_r, arm7_latch_68k_w) /* ARM7 Latch */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( cavepgm_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x3fffff) AM_ROM - - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( z80_mem, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0xffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_z80_mainram) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( z80_io, AS_IO, 8 ) - AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("ics", ics2115_device::read, ics2115_device::write) - AM_RANGE(0x8100, 0x81ff) AM_READWRITE(soundlatch3_r, z80_l3_w) - AM_RANGE(0x8200, 0x82ff) AM_READWRITE(soundlatch_r, soundlatch_w) - AM_RANGE(0x8400, 0x84ff) AM_READWRITE(soundlatch2_r, soundlatch2_w) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( arm7_map, AS_PROGRAM, 32 ) - AM_RANGE(0x00000000, 0x00003fff) AM_ROM - AM_RANGE(0x08000000, 0x083fffff) AM_ROM AM_REGION("user1", 0) - AM_RANGE(0x10000000, 0x100003ff) AM_RAM - AM_RANGE(0x18000000, 0x1800ffff) AM_RAM - AM_RANGE(0x38000000, 0x38000003) AM_READWRITE(arm7_latch_arm_r, arm7_latch_arm_w) /* 68k Latch */ - AM_RANGE(0x48000000, 0x4800ffff) AM_READWRITE(arm7_shareram_r, arm7_shareram_w) AM_BASE_MEMBER(pgm_state, m_arm7_shareram) - AM_RANGE(0x50000000, 0x500003ff) AM_RAM -ADDRESS_MAP_END +/*** Misc Protection Handlers *************************************************************/ /* Kov Superheroes */ @@ -827,37 +501,7 @@ COMBINE_DATA(&share16[BYTE_XOR_LE(offset << 1)]); } -static ADDRESS_MAP_START( kovsh_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x4effff) AM_ROMBANK("bank1") /* Game ROM */ - AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? - - AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ - -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) - AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ - AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) - AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ - - AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) - AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) - AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) - AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) - AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) - - AM_RANGE(0xc08000, 0xc08001) AM_READ_PORT("P1P2") - AM_RANGE(0xc08002, 0xc08003) AM_READ_PORT("P3P4") - AM_RANGE(0xc08004, 0xc08005) AM_READ_PORT("Service") - AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") - - AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ - AM_RANGE(0x4f0000, 0x4f003f) AM_READWRITE(kovsh_arm7_ram_r, kovsh_arm7_ram_w) /* ARM7 Shared RAM */ - AM_RANGE(0x500000, 0x500005) AM_READWRITE(kovsh_68k_protlatch_r, kovsh_68k_protlatch_w) /* ARM7 Latch */ -ADDRESS_MAP_END static READ32_HANDLER( kovsh_arm7_unk_r ) @@ -871,17 +515,6 @@ return 0x00000000; } -static ADDRESS_MAP_START( kovsh_arm7_map, AS_PROGRAM, 32 ) - AM_RANGE(0x00000000, 0x00003fff) AM_ROM - AM_RANGE(0x08100000, 0x083fffff) AM_READ(kovsh_exrom_r) // unpopulated, returns 0 to keep checksum happy - AM_RANGE(0x10000000, 0x100003ff) AM_RAM // internal ram for asic - AM_RANGE(0x40000000, 0x40000003) AM_READWRITE(kovsh_arm7_protlatch_r, kovsh_arm7_protlatch_w) - AM_RANGE(0x40000008, 0x4000000b) AM_WRITENOP // ? - AM_RANGE(0x4000000c, 0x4000000f) AM_READ(kovsh_arm7_unk_r) - AM_RANGE(0x50800000, 0x5080003f) AM_READWRITE(arm7_shareram_r, arm7_shareram_w) AM_BASE_MEMBER(pgm_state, m_arm7_shareram) - AM_RANGE(0x50000000, 0x500003ff) AM_RAM // uploads xor table to decrypt 68k rom here -ADDRESS_MAP_END - //55857G @@ -942,24 +575,35 @@ COMBINE_DATA(&state->m_kov2_latchdata_68k_w); } -static ADDRESS_MAP_START( svg_68k_mem, AS_PROGRAM, 16) - AM_RANGE(0x000000, 0x07ffff) AM_ROM /* BIOS ROM */ - AM_RANGE(0x100000, 0x1fffff) AM_ROMBANK("bank1") /* Game ROM */ +/*** Memory Maps *************************************************************/ + +/*** Z80 (sound CPU)**********************************************************/ + +static ADDRESS_MAP_START( z80_mem, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_z80_mainram) +ADDRESS_MAP_END +static ADDRESS_MAP_START( z80_io, AS_IO, 8 ) + AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("ics", ics2115_device::read, ics2115_device::write) + AM_RANGE(0x8100, 0x81ff) AM_READWRITE(soundlatch3_r, z80_l3_w) + AM_RANGE(0x8200, 0x82ff) AM_READWRITE(soundlatch_r, soundlatch_w) + AM_RANGE(0x8400, 0x84ff) AM_READWRITE(soundlatch2_r, soundlatch2_w) +ADDRESS_MAP_END + +/*** 68000 (main CPU) + variants for protection devices **********************/ + +static ADDRESS_MAP_START( pgm_base_mem, AS_PROGRAM, 16) AM_RANGE(0x700006, 0x700007) AM_WRITENOP // Watchdog? AM_RANGE(0x800000, 0x81ffff) AM_RAM AM_MIRROR(0x0e0000) AM_BASE(&pgm_mainram) AM_SHARE("sram") /* Main Ram */ -// AM_RANGE(0x900000, 0x903fff) AM_RAM_WRITE(pgm_bg_videoram_w) AM_BASE_MEMBER(pgm_state, m_bg_videoram) /* Backgrounds */ -// AM_RANGE(0x904000, 0x905fff) AM_RAM_WRITE(pgm_tx_videoram_w) AM_BASE_MEMBER(pgm_state, m_tx_videoram) /* Text Layer */ -// AM_RANGE(0x907000, 0x9077ff) AM_RAM AM_BASE_MEMBER(pgm_state, m_rowscrollram) AM_RANGE(0x900000, 0x907fff) AM_MIRROR(0x0f8000) AM_READWRITE(pgm_videoram_r, pgm_videoram_w) AM_BASE_MEMBER(pgm_state, m_videoram) /* IGS023 VIDEO CHIP */ AM_RANGE(0xa00000, 0xa011ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_BASE_MEMBER(pgm_state, m_videoregs) /* Video Regs inc. Zoom Table */ AM_RANGE(0xc00002, 0xc00003) AM_READWRITE(soundlatch_word_r, m68k_l1_w) AM_RANGE(0xc00004, 0xc00005) AM_READWRITE(soundlatch2_word_r, soundlatch2_word_w) - AM_RANGE(0xc00006, 0xc00007) AM_READWRITE(pgm_calendar_r, pgm_calendar_w) + AM_RANGE(0xc00006, 0xc00007) AM_DEVREADWRITE8_MODERN("rtc", v3021_device, read, write, 0x00ff) AM_RANGE(0xc00008, 0xc00009) AM_WRITE(z80_reset_w) AM_RANGE(0xc0000a, 0xc0000b) AM_WRITE(z80_ctrl_w) AM_RANGE(0xc0000c, 0xc0000d) AM_READWRITE(soundlatch3_word_r, soundlatch3_word_w) @@ -970,12 +614,94 @@ AM_RANGE(0xc08006, 0xc08007) AM_READ_PORT("DSW") AM_RANGE(0xc10000, 0xc1ffff) AM_READWRITE(z80_ram_r, z80_ram_w) /* Z80 Program */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pgm_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_base_mem) + AM_RANGE(0x000000, 0x01ffff) AM_ROM /* BIOS ROM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pgm_basic_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x3fffff) AM_ROMBANK("bank1") /* Game ROM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( killbld_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x2fffff) AM_ROMBANK("bank1") /* Game ROM */ + AM_RANGE(0x300000, 0x303fff) AM_RAM AM_BASE_MEMBER(pgm_state, m_sharedprotram) // Shared with protection device +ADDRESS_MAP_END + +static ADDRESS_MAP_START( olds_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x3fffff) AM_ROMBANK("bank1") /* Game ROM */ + AM_RANGE(0x400000, 0x403fff) AM_RAM AM_BASE_MEMBER(pgm_state, m_sharedprotram) // Shared with protection device +ADDRESS_MAP_END + +/* 55857E? */ +/* Knights of Valor, Photo Y2k */ +/* no execute only space? */ +static ADDRESS_MAP_START( kov_map, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x4effff) AM_ROMBANK("bank1") /* Game ROM */ + AM_RANGE(0x4f0000, 0x4f003f) AM_READWRITE(kovsh_arm7_ram_r, kovsh_arm7_ram_w) /* ARM7 Shared RAM */ + AM_RANGE(0x500000, 0x500005) AM_READWRITE(kovsh_68k_protlatch_r, kovsh_68k_protlatch_w) /* ARM7 Latch */ +ADDRESS_MAP_END + +/* 55857F? */ +/* Knights of Valor 2, Martial Masters, DoDonpachi 2 */ +/* no execute only space? */ +static ADDRESS_MAP_START( kov2_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x5fffff) AM_ROMBANK("bank1") /* Game ROM */ + AM_RANGE(0xd00000, 0xd0ffff) AM_READWRITE(arm7_ram_r, arm7_ram_w) /* ARM7 Shared RAM */ + AM_RANGE(0xd10000, 0xd10001) AM_READWRITE(arm7_latch_68k_r, arm7_latch_68k_w) /* ARM7 Latch */ +ADDRESS_MAP_END + +/* 55857G? */ +/* Demon Front, The Gladiator, Happy 6-in-1, Spectral Vs. Generation, Killing Blade EX */ +/* the ones with an EXECUTE ONLY region of ARM space? */ +static ADDRESS_MAP_START( svg_68k_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_mem) + AM_RANGE(0x100000, 0x1fffff) AM_ROMBANK("bank1") /* Game ROM */ + AM_RANGE(0x500000, 0x51ffff) AM_READWRITE(svg_m68k_ram_r, svg_m68k_ram_w) /* ARM7 Shared RAM */ AM_RANGE(0x5c0000, 0x5c0001) AM_READWRITE(svg_68k_nmi_r, svg_68k_nmi_w) /* ARM7 FIQ */ AM_RANGE(0x5c0300, 0x5c0301) AM_READWRITE(arm7_latch_68k_r, svg_latch_68k_w) /* ARM7 Latch */ ADDRESS_MAP_END -static ADDRESS_MAP_START( svg_arm7_map, AS_PROGRAM, 32 ) + +static ADDRESS_MAP_START( cavepgm_mem, AS_PROGRAM, 16) + AM_IMPORT_FROM(pgm_base_mem) + AM_RANGE(0x000000, 0x3fffff) AM_ROM + /* protection devices installed (simulated) later */ +ADDRESS_MAP_END + +/*** ARM7 (protection CPUs) **************************************************/ + +static ADDRESS_MAP_START( 55857E_arm7_map, AS_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x00003fff) AM_ROM + AM_RANGE(0x08100000, 0x083fffff) AM_READ(kovsh_exrom_r) // unpopulated, returns 0 to keep checksum happy + AM_RANGE(0x10000000, 0x100003ff) AM_RAM // internal ram for asic + AM_RANGE(0x40000000, 0x40000003) AM_READWRITE(kovsh_arm7_protlatch_r, kovsh_arm7_protlatch_w) + AM_RANGE(0x40000008, 0x4000000b) AM_WRITENOP // ? + AM_RANGE(0x4000000c, 0x4000000f) AM_READ(kovsh_arm7_unk_r) + AM_RANGE(0x50800000, 0x5080003f) AM_READWRITE(arm7_shareram_r, arm7_shareram_w) AM_BASE_MEMBER(pgm_state, m_arm7_shareram) + AM_RANGE(0x50000000, 0x500003ff) AM_RAM // uploads xor table to decrypt 68k rom here +ADDRESS_MAP_END + +static ADDRESS_MAP_START( 55857F_arm7_map, AS_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x00003fff) AM_ROM + AM_RANGE(0x08000000, 0x083fffff) AM_ROM AM_REGION("user1", 0) + AM_RANGE(0x10000000, 0x100003ff) AM_RAM + AM_RANGE(0x18000000, 0x1800ffff) AM_RAM + AM_RANGE(0x38000000, 0x38000003) AM_READWRITE(arm7_latch_arm_r, arm7_latch_arm_w) /* 68k Latch */ + AM_RANGE(0x48000000, 0x4800ffff) AM_READWRITE(arm7_shareram_r, arm7_shareram_w) AM_BASE_MEMBER(pgm_state, m_arm7_shareram) + AM_RANGE(0x50000000, 0x500003ff) AM_RAM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( 55857G_arm7_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x00003fff) AM_ROM AM_RANGE(0x08000000, 0x087fffff) AM_ROM AM_REGION("user1", 0) AM_RANGE(0x10000000, 0x100003ff) AM_RAM @@ -986,6 +712,7 @@ AM_RANGE(0x50000000, 0x500003ff) AM_RAM ADDRESS_MAP_END + /*** Input Ports *************************************************************/ /* enough for 4 players, the basic dips mapped are listed in the test mode */ @@ -1108,6 +835,19 @@ PORT_CONFSETTING( 0x0005, DEF_STR( World ) ) INPUT_PORTS_END +static INPUT_PORTS_START( sango_ch ) + PORT_INCLUDE ( pgm ) + + PORT_MODIFY("Region") /* Region - supplied by protection device */ + PORT_CONFNAME( 0x000f, 0x0000, DEF_STR( Region ) ) + PORT_CONFSETTING( 0x0000, DEF_STR( China ) ) + PORT_CONFSETTING( 0x0001, DEF_STR( Taiwan ) ) + PORT_CONFSETTING( 0x0002, "Japan (Alta license)" ) + PORT_CONFSETTING( 0x0003, DEF_STR( Korea ) ) + PORT_CONFSETTING( 0x0004, DEF_STR( Hong_Kong ) ) + PORT_CONFSETTING( 0x0005, DEF_STR( World ) ) +INPUT_PORTS_END + static INPUT_PORTS_START( dw3 ) PORT_INCLUDE ( pgm ) @@ -1344,51 +1084,58 @@ /* only dragon world 2 NEEDs irq4, Puzzli 2 explicitly doesn't want it, what is the source? maybe the protection device? */ -static INTERRUPT_GEN( drgw_interrupt ) +static TIMER_DEVICE_CALLBACK( drgw_interrupt ) { - if (cpu_getiloops(device) == 0) - { - //printf("vbl\n"); - device_set_input_line(device, 6, HOLD_LINE); - } - else - device_set_input_line(device, 4, HOLD_LINE); + pgm_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 224) + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); + + if(scanline == 0) + if (!state->m_irq4_disabled) device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } static MACHINE_START( pgm ) { pgm_state *state = machine.driver_data(); - machine.base_datetime(state->m_systime); +// machine.base_datetime(state->m_systime); + state->m_maincpu = machine.device("maincpu"); state->m_soundcpu = machine.device("soundcpu"); state->m_prot = machine.device("prot"); state->m_ics = machine.device("ics"); - state->save_item(NAME(state->m_cal_val)); - state->save_item(NAME(state->m_cal_mask)); - state->save_item(NAME(state->m_cal_com)); - state->save_item(NAME(state->m_cal_cnt)); +// state->save_item(NAME(state->m_cal_val)); +// state->save_item(NAME(state->m_cal_mask)); +// state->save_item(NAME(state->m_cal_com)); +// state->save_item(NAME(state->m_cal_cnt)); } static MACHINE_RESET( pgm ) { - pgm_state *state = machine.driver_data(); +// pgm_state *state = machine.driver_data(); cputag_set_input_line(machine, "soundcpu", INPUT_LINE_HALT, ASSERT_LINE); - state->m_cal_val = 0; - state->m_cal_mask = 0; - state->m_cal_com = 0; - state->m_cal_cnt = 0; +// state->m_cal_val = 0; +// state->m_cal_mask = 0; +// state->m_cal_com = 0; +// state->m_cal_cnt = 0; } +static MACHINE_RESET( killbld ); +static MACHINE_RESET( dw3 ); +static MACHINE_RESET( olds ); +extern MACHINE_RESET( kov ); MACHINE_CONFIG_FRAGMENT( pgmbase ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 20000000) /* 20 mhz! verified on real board */ - MCFG_CPU_PROGRAM_MAP(pgm_mem) + MCFG_CPU_PROGRAM_MAP(pgm_basic_mem) MCFG_CPU_VBLANK_INT("screen", irq6_line_hold) + MCFG_TIMER_ADD_SCANLINE("scantimer", drgw_interrupt, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 33868800/4) MCFG_CPU_PROGRAM_MAP(z80_mem) @@ -1398,15 +1145,16 @@ MCFG_MACHINE_RESET( pgm ) MCFG_NVRAM_ADD_0FILL("sram") + MCFG_V3021_ADD("rtc") + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // killing blade won't boot (just displays 'error') if this is lower than 59.9 or higher than 60.1 .. are actual PGM boards different to the Cave one? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 56*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(pgm) - MCFG_SCREEN_EOF(pgm) + MCFG_SCREEN_UPDATE_STATIC(pgm) + MCFG_SCREEN_VBLANK_STATIC(pgm) MCFG_GFXDECODE(pgm) MCFG_PALETTE_LENGTH(0x1200/2) @@ -1424,100 +1172,100 @@ MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( drgw2, pgm ) - - MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) // needs an extra IRQ, puzzli2 doesn't want this irq! -MACHINE_CONFIG_END -static MACHINE_RESET( killbld ); static MACHINE_CONFIG_DERIVED( killbld, pgm ) - MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(killbld_mem) MCFG_MACHINE_RESET(killbld) - MACHINE_CONFIG_END -static MACHINE_RESET( dw3 ); static MACHINE_CONFIG_DERIVED( dw3, pgm ) - MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(killbld_mem) - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) // needs an extra IRQ, puzzli2 doesn't want this irq! MCFG_MACHINE_RESET(dw3) - MACHINE_CONFIG_END -static MACHINE_RESET( olds ); static MACHINE_CONFIG_DERIVED( olds, pgm ) - MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(olds_mem) MCFG_MACHINE_RESET(olds) - MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( kov, pgm ) +/******* ARM 55857E *******/ +static MACHINE_CONFIG_DERIVED( kov, pgm ) MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(kovsh_mem) + MCFG_CPU_PROGRAM_MAP(kov_map) /* protection CPU */ - MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857E/F/G - MCFG_CPU_PROGRAM_MAP(kovsh_arm7_map) + MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857E? + MCFG_CPU_PROGRAM_MAP(55857E_arm7_map) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( kov_disabled_arm, pgm ) - +static MACHINE_CONFIG_DERIVED( kov_disabled_arm, pgm ) // for simulated cases MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(kovsh_mem) - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) // needs an extra IRQ, puzzli2 doesn't want this irq! + MCFG_CPU_PROGRAM_MAP(pgm_basic_mem) /* protection CPU */ - MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857E/F/G - MCFG_CPU_PROGRAM_MAP(kovsh_arm7_map) + MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857E? + MCFG_CPU_PROGRAM_MAP(55857E_arm7_map) MCFG_DEVICE_DISABLE() MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( kov_simulated_arm, kov_disabled_arm ) // for simulated cases + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(kov_map) -static MACHINE_CONFIG_DERIVED( kov2, pgm ) + MCFG_MACHINE_RESET(kov) +MACHINE_CONFIG_END + +/******* ARM 55857F *******/ +static MACHINE_CONFIG_DERIVED( kov2, pgm ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(kov2_mem) /* protection CPU */ MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857F - MCFG_CPU_PROGRAM_MAP(arm7_map) + MCFG_CPU_PROGRAM_MAP(55857F_arm7_map) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( svg, pgm ) +static MACHINE_CONFIG_DERIVED( kov2_disabled_arm, pgm ) // for simulated cases + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(pgm_basic_mem) + + /* protection CPU */ + MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857F + MCFG_CPU_PROGRAM_MAP(55857F_arm7_map) + MCFG_DEVICE_DISABLE() +MACHINE_CONFIG_END +/******* ARM 55857G *******/ + +static MACHINE_CONFIG_DERIVED( svg, pgm ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(svg_68k_mem) - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) // needs an extra IRQ, puzzli2 doesn't want this irq! /* protection CPU */ MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857G - MCFG_CPU_PROGRAM_MAP(svg_arm7_map) + MCFG_CPU_PROGRAM_MAP(55857G_arm7_map) MACHINE_CONFIG_END -static MACHINE_CONFIG_START( oldsplus, oldsplus_state ) - MCFG_FRAGMENT_ADD(pgmbase) - +static MACHINE_CONFIG_DERIVED( svg_disabled_arm, pgm ) // for simulated cases MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) // needs an extra IRQ, puzzli2 doesn't want this irq! + MCFG_CPU_PROGRAM_MAP(pgm_basic_mem) -// Simulated for now -// MCFG_CPU_ADD("prot", ARM7, 20000000) -// MCFG_CPU_PROGRAM_MAP(svg_arm7_map) + /* protection CPU */ + MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857G + MCFG_CPU_PROGRAM_MAP(55857G_arm7_map) + MCFG_DEVICE_DISABLE() MACHINE_CONFIG_END class cavepgm_state : public pgm_state @@ -1557,9 +1305,8 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 20000000) - MCFG_CPU_PROGRAM_MAP(cavepgm_mem) - MCFG_CPU_VBLANK_INT_HACK(drgw_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", drgw_interrupt, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 33868800/4) MCFG_CPU_PROGRAM_MAP(z80_mem) @@ -1569,15 +1316,16 @@ MCFG_MACHINE_RESET( pgm ) MCFG_NVRAM_ADD_0FILL("sram") + MCFG_V3021_ADD("rtc") + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) // verified on pcb MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 56*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(pgm) - MCFG_SCREEN_EOF(pgm) + MCFG_SCREEN_UPDATE_STATIC(pgm) + MCFG_SCREEN_VBLANK_STATIC(pgm) MCFG_GFXDECODE(pgm) MCFG_PALETTE_LENGTH(0x1200/2) @@ -1590,6 +1338,18 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 5.0) MACHINE_CONFIG_END +// for now we're using a protection sim close ot the CavePgm one, so use that state. +static MACHINE_CONFIG_DERIVED( puzzli2_disabled_arm, cavepgm ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(pgm_basic_mem) + + /* protection CPU */ + MCFG_CPU_ADD("prot", ARM7, 20000000) // 55857F? + MCFG_CPU_PROGRAM_MAP(55857F_arm7_map) + MCFG_DEVICE_DISABLE() +MACHINE_CONFIG_END + + /*** Rom Loading *************************************************************/ /* take note of "gfx2" needed for expanding the 32x32x5bpp data and @@ -2318,6 +2078,7 @@ ROM_LOAD( "m0600.rom", 0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) ) ROM_END + /* Sangoku Senki Plus / Knights of Valour Plus (Alt 119 Ver.) @@ -2380,6 +2141,91 @@ ROM_LOAD( "m0600.rom", 0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) ) ROM_END + +ROM_START( kovsgqyz ) + ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */ + PGM_68K_BIOS + ROM_LOAD16_WORD_SWAP( "pgm_sgqyz.rom", 0x100000, 0x400000, CRC(18e1eed9) SHA1(db18d9121bb533140957e9c58dbc38211d164b01) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "kovsgqyz_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) // bootleg is probably a different device + + ROM_REGION( 0xc00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */ + PGM_VIDEO_BIOS + ROM_LOAD( "t0600.rom", 0x180000, 0x800000, CRC(4acc1ad6) SHA1(0668dbd5e856c2406910c6b7382548b37c631780) ) + + ROM_REGION( 0x2000000, "sprcol", 0 ) /* Sprite Colour Data */ + ROM_LOAD( "a0600.rom", 0x0000000, 0x0800000, CRC(d8167834) SHA1(fa55a99629d03b2ea253392352f70d2c8639a991) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0601.rom", 0x0800000, 0x0800000, CRC(ff7a4373) SHA1(7def9fca7513ad5a117da230bebd2e3c78679041) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0602.rom", 0x1000000, 0x0800000, CRC(e7a32959) SHA1(3d0ed684dc5b269238890836b2ce7ef46aa5265b) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "qyza0603.rom", 0x1800000, 0x0800000, CRC(c8b92220) SHA1(4f9c43970d92ac8a8f1563021022797ae8e32012) ) + + ROM_REGION( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */ + ROM_LOAD( "b0600.rom", 0x0000000, 0x0800000, CRC(7d3cd059) SHA1(00cf994b63337e0e4ebe96453daf45f24192af1c) ) + ROM_LOAD( "qyzb0601.rom", 0x0800000, 0x0800000, CRC(64f55882) SHA1(ab9ac1396587c3d78d06f6ec83cab61d6a9faacd) ) + + ROM_REGION( 0x800000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */ + PGM_AUDIO_BIOS + ROM_LOAD( "m0600.rom", 0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) ) +ROM_END + +ROM_START( kovsgqyza ) + ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */ + PGM_68K_BIOS + ROM_LOAD16_WORD_SWAP( "pgm_sgqyza.rom", 0x100000, 0x400000, CRC(5a30dcb7) SHA1(64f34faf99a19c0a54899990695129c512d5a3c8) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "kovsgqyza_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) // bootleg is probably a different device + + ROM_REGION( 0xc00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */ + PGM_VIDEO_BIOS + ROM_LOAD( "t0600.rom", 0x180000, 0x800000, CRC(4acc1ad6) SHA1(0668dbd5e856c2406910c6b7382548b37c631780) ) + + ROM_REGION( 0x2000000, "sprcol", 0 ) /* Sprite Colour Data */ + ROM_LOAD( "a0600.rom", 0x0000000, 0x0800000, CRC(d8167834) SHA1(fa55a99629d03b2ea253392352f70d2c8639a991) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0601.rom", 0x0800000, 0x0800000, CRC(ff7a4373) SHA1(7def9fca7513ad5a117da230bebd2e3c78679041) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0602.rom", 0x1000000, 0x0800000, CRC(e7a32959) SHA1(3d0ed684dc5b269238890836b2ce7ef46aa5265b) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "qyza0603.rom", 0x1800000, 0x0800000, CRC(c8b92220) SHA1(4f9c43970d92ac8a8f1563021022797ae8e32012) ) + + ROM_REGION( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */ + ROM_LOAD( "b0600.rom", 0x0000000, 0x0800000, CRC(7d3cd059) SHA1(00cf994b63337e0e4ebe96453daf45f24192af1c) ) + ROM_LOAD( "qyzb0601.rom", 0x0800000, 0x0800000, CRC(64f55882) SHA1(ab9ac1396587c3d78d06f6ec83cab61d6a9faacd) ) + + ROM_REGION( 0x800000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */ + PGM_AUDIO_BIOS + ROM_LOAD( "m0600.rom", 0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) ) +ROM_END + +ROM_START( kovsgqyzb ) + ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */ + PGM_68K_BIOS + ROM_LOAD16_WORD_SWAP( "pgm_sgqyzb.rom", 0x100000, 0x400000, CRC(18b8b9c0) SHA1(f4937aa21cd11af16fb50e7a75c8d4c4ed27c5cf) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "kovsgqyzb_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) // bootleg is probably a different device + + ROM_REGION( 0xc00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */ + PGM_VIDEO_BIOS + ROM_LOAD( "t0600.rom", 0x180000, 0x800000, CRC(4acc1ad6) SHA1(0668dbd5e856c2406910c6b7382548b37c631780) ) + + ROM_REGION( 0x2000000, "sprcol", 0 ) /* Sprite Colour Data */ + ROM_LOAD( "a0600.rom", 0x0000000, 0x0800000, CRC(d8167834) SHA1(fa55a99629d03b2ea253392352f70d2c8639a991) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0601.rom", 0x0800000, 0x0800000, CRC(ff7a4373) SHA1(7def9fca7513ad5a117da230bebd2e3c78679041) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "a0602.rom", 0x1000000, 0x0800000, CRC(e7a32959) SHA1(3d0ed684dc5b269238890836b2ce7ef46aa5265b) ) // FIXED BITS (xxxxxxxx1xxxxxxx) + ROM_LOAD( "qyza0603.rom", 0x1800000, 0x0800000, CRC(c8b92220) SHA1(4f9c43970d92ac8a8f1563021022797ae8e32012) ) + + ROM_REGION( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */ + ROM_LOAD( "b0600.rom", 0x0000000, 0x0800000, CRC(7d3cd059) SHA1(00cf994b63337e0e4ebe96453daf45f24192af1c) ) + ROM_LOAD( "qyzb0601.rom", 0x0800000, 0x0800000, CRC(64f55882) SHA1(ab9ac1396587c3d78d06f6ec83cab61d6a9faacd) ) + + ROM_REGION( 0x800000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */ + PGM_AUDIO_BIOS + ROM_LOAD( "m0600.rom", 0x400000, 0x400000, CRC(3ada4fd6) SHA1(4c87adb25d31cbd41f04fbffe31f7bc37173da76) ) +ROM_END + + + + ROM_START( kovsh ) ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */ PGM_68K_BIOS @@ -2559,6 +2405,36 @@ ROM_IGNORE( 0x400000 ) // c00000-ffffff empty ROM_END + +ROM_START( kovlsqh ) + ROM_REGION( 0x600000, "maincpu", 0 ) /* 68000 Code */ + PGM_68K_BIOS + ROM_LOAD16_WORD_SWAP( "lsqh_v200cn.rom", 0x100000, 0x400000, CRC(9935a27a) SHA1(3075935293172466c4bd997dcb67f864ae26493e) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "qhsg_prot.c51", 0x000000, 0x04000, BAD_DUMP CRC(0f09a5c1) SHA1(621b38c05f33277608d58b49822aebc930ae4870) ) + + ROM_REGION( 0xc00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */ + PGM_VIDEO_BIOS + ROM_LOAD( "lsqh2_t01.rom",0x180000, 0x800000, CRC(d498d97f) SHA1(97a7b6d2ed1170449e7c2899448af7cbbca4c94f) ) + ROM_IGNORE( 0x800000 ) // second half identical + + ROM_REGION( 0x3000000, "sprcol", 0 ) /* Sprite Colour Data */ + ROM_LOAD( "lsqh2_a01.rom", 0x0000000, 0x1000000, CRC(25ae3efd) SHA1(083d977602ddb5ad54fbdcba000cd4287de8d463) ) + ROM_LOAD( "lsqh2_a23.rom", 0x1000000, 0x1000000, CRC(7a779112) SHA1(0a7d36b3715063d8eac629b95a9bb3ecd8e54fca) ) + ROM_LOAD( "lsqh2_a45.rom", 0x2000000, 0x1000000, CRC(5d7de052) SHA1(7663b6cf09f65c4644661005a38f9aba84a32913) ) + + ROM_REGION( 0x1000000, "sprmask", 0 ) /* Sprite Masks + Colour Indexes */ + ROM_LOAD( "lsqh2_b01.rom", 0x0000000, 0x1000000, CRC(df7ca696) SHA1(7af3d27957a39de7e4873867c9972c05af7e7964) ) + + ROM_REGION( 0xc00000, "ics", 0 ) /* Samples - (8 bit mono 11025Hz) - */ + PGM_AUDIO_BIOS + ROM_LOAD( "lsqh2_m01.rom",0x400000, 0x400000, CRC(01af1b65) SHA1(6cf523fa8f1e03f974771611bb9a4e08a4d4443f) ) + ROM_IGNORE( 0x400000 ) // 400000-7fffff empty + ROM_CONTINUE( 0x800000, 0x400000 ) + ROM_IGNORE( 0x400000 ) // c00000-ffffff empty +ROM_END + /* p0701_v105.u2 @@ -3342,7 +3218,7 @@ ROM_LOAD16_WORD_SWAP( "v204-32m.rom", 0x100000, 0x400000, CRC(583e0650) SHA1(2e5656dd9c6cba9f84af9baa3f5f70cdccf9db47) ) ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ - ROM_LOAD( "kov2p_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) + ROM_LOAD( "kov2p_igs027a.bin", 0x000000, 0x04000, BAD_DUMP CRC(e0d7679f) SHA1(e1c2d127eba4ddbeb8ad173c55b90ac1467e1ca8) ) // NOT for this version, works with a hack ROM_REGION32_LE( 0x400000, "user1", 0 ) /* Protection Data (encrypted external ARM data) */ ROM_LOAD( "v200-16.rom", 0x000000, 0x200000, CRC(16a0c11f) SHA1(ce449cef76ebd5657d49b57951e2eb0f132e203e) ) @@ -3373,7 +3249,7 @@ ROM_LOAD16_WORD_SWAP( "u8-27322.rom", 0x100000, 0x400000, CRC(3a2cc0de) SHA1(d7511478b34bfb03b2fb5b8268b60502d05b9414) ) ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ - ROM_LOAD( "kov2p_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) + ROM_LOAD( "kov2p_igs027a.bin", 0x000000, 0x04000, BAD_DUMP CRC(e0d7679f) SHA1(e1c2d127eba4ddbeb8ad173c55b90ac1467e1ca8) ) // NOT for this version, works with a hack ROM_REGION32_LE( 0x400000, "user1", 0 ) /* Protection Data (encrypted external ARM data) */ ROM_LOAD( "v200-16.rom", 0x000000, 0x200000, CRC(16a0c11f) SHA1(ce449cef76ebd5657d49b57951e2eb0f132e203e) ) @@ -3958,6 +3834,8 @@ ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ ROM_LOAD( "oldsplus_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) + ROM_REGION( 0x800000, "user1", ROMREGION_ERASE00 ) + ROM_REGION( 0xc00000, "tiles", 0 ) /* 8x8 Text Tiles + 32x32 BG Tiles */ PGM_VIDEO_BIOS ROM_LOAD( "t05301.rom", 0x180000, 0x800000, CRC(8257bbb0) SHA1(b48067b7e7081a15fddf21739b641d677c2df3d9) ) @@ -4337,32 +4215,6 @@ ROM_LOAD( "ddp3blk_defaults.nv", 0x0000000, 0x020000, CRC(a1651904) SHA1(5b80d3c4c764895c40953a66161d4dd84f742604) ) ROM_END -/* this is on PGM2, the main board contains 2 custom ASICs, no roms or other kind of bios, I don't know how compatible the - hardware is otherwise, but I imagine it's well protected - - they appear to have the main program inside a custom ASIC (probably ARM again) as the carts will boot to 'PROGRAM ERROR' - even if you strip them of program roms. - - */ -ROM_START( orleg2 ) - ROM_REGION( 0x800000, "maincpu", 0 ) /* 68000 Code */ - ROM_LOAD16_WORD_SWAP( "xyj2_v104cn.u7", 0x000000, 0x800000, CRC(7c24a4f5) SHA1(3cd9f9264ef2aad0869afdf096e88eb8d74b2570) ) - - ROM_REGION( 0xc00000, "tiles", ROMREGION_ERASEFF ) /* 8x8 Text Tiles + 32x32 BG Tiles */ - ROM_REGION( 0x1c00000, "sprcol", ROMREGION_ERASEFF ) /* Sprite Colour Data */ - ROM_REGION( 0x1000000, "sprmask", ROMREGION_ERASEFF ) /* Sprite Masks + Colour Indexes */ - ROM_REGION( 0x1000000, "ics", ROMREGION_ERASEFF ) /* Samples - (8 bit mono 11025Hz) - */ - - ROM_REGION( 0x2000000, "others", 0 ) - ROM_LOAD16_WORD_SWAP( "ig-a.u26", 0x000000, 0x2000000, CRC(7051d020) SHA1(3d9b24c6fda4c9699bb9f00742e0888059b623e1) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u35", 0x000000, 0x0800000, CRC(083a8315) SHA1(0dba25e132fbb12faa59ced648c27b881dc73478) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u36", 0x000000, 0x0800000, CRC(e197221d) SHA1(5574b1e3da4b202db725be906dd868edc2fd4634) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u2", 0x000000, 0x1000000, CRC(8250688c) SHA1(d2488477afc528aeee96826065deba2bce4f0a7d) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u4", 0x000000, 0x0200000, CRC(fa444c32) SHA1(31e5e3efa92d52bf9ab97a0ece51e3b77f52ce8a) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u12", 0x000000, 0x1000000, CRC(113a331c) SHA1(ee6b31bb2b052cc8799573de0d2f0a83f0ab4f6a) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u16", 0x000000, 0x1000000, CRC(fbf411c8) SHA1(5089b5cc9bbf6496ef1367c6255e63e9ab895117) ) - ROM_LOAD16_WORD_SWAP( "ig-a.u18", 0x000000, 0x2000000, CRC(43501fa6) SHA1(58ccce6d393964b771fec3f5c583e3ede57482a3) ) -ROM_END /*** Init Stuff **************************************************************/ @@ -4439,10 +4291,16 @@ } -static void pgm_basic_init_nobank( running_machine &machine ) + + + +static void pgm_basic_init( running_machine &machine, bool set_bank = true ) { pgm_state *state = machine.driver_data(); + UINT8 *ROM = machine.region("maincpu")->base(); + if (set_bank) memory_set_bankptr(machine, "bank1", &ROM[0x100000]); + expand_32x32x5bpp(machine); expand_colourdata(machine); @@ -4451,16 +4309,6 @@ state->m_rowscrollram = &state->m_videoram[0x7000/2]; } - -static void pgm_basic_init( running_machine &machine ) -{ - UINT8 *ROM = machine.region("maincpu")->base(); - memory_set_bankptr(machine, "bank1", &ROM[0x100000]); - - pgm_basic_init_nobank(machine); - -} - static DRIVER_INIT( pgm ) { pgm_basic_init(machine); @@ -4578,6 +4426,15 @@ pgm_basic_init(machine); pgm_kov_decrypt(machine); kovsh_latch_init(machine); + install_protection_asic_sim_kov(machine); +} + +static DRIVER_INIT( kovboot ) +{ + pgm_basic_init(machine); +// pgm_kov_decrypt(machine); + kovsh_latch_init(machine); + install_protection_asic_sim_kov(machine); } static DRIVER_INIT( pstar ) @@ -4659,12 +4516,6 @@ kov2_latch_init(machine); } -static DRIVER_INIT( kov2p ) -{ - pgm_basic_init(machine); - pgm_kov2p_decrypt(machine); - kov2_latch_init(machine); -} static DRIVER_INIT( martmast ) { @@ -5307,56 +5158,105 @@ pgm_dw3_decrypt(machine); } -static DRIVER_INIT( puzzli2 ) +static INT32 puzzli_54_trigger = 0; + +// Preliminary +static WRITE16_HANDLER( puzzli2_asic_w ) { - /* this protection emulation is wrong - it uses an arm with no external rom - an acts in a similar way to kov etc. */ + cavepgm_state *state = space->machine().driver_data(); - pgm_state *state = machine.driver_data(); - UINT16 *mem16 = (UINT16 *)machine.region("maincpu")->base(); + switch (offset & 0x03) + { + case 0: state->m_value0 = data; return; - pgm_basic_init(machine); - kovsh_latch_init(machine); + case 1: + { + if ((data >> 8) == 0xff) state->m_valuekey = 0xffff; - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x500000, 0x500003, FUNC(asic28_r), FUNC(asic28_w)); + state->m_value0 ^= state->m_valuekey; - /* 0x4f0000 - ? is actually ram shared with the protection device, - the protection device provides the region code */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x4f0000, 0x4fffff, FUNC(sango_protram_r)); + switch ((data ^ state->m_valuekey) & 0xff) + { + case 0x13: // ASIC status? + state->m_valueresponse = 0x74<<16; // 2d or 74! (based on?) + break; - pgm_puzzli2_decrypt(machine); + case 0x31: + { + // how is this selected? command 54? + + // just a wild guess + if (puzzli_54_trigger) { + // pc == 1387de + state->m_valueresponse = 0x63<<16; // ? + } else { + // pc == 14cf58 + state->m_valueresponse = 0xd2<<16; + } + + puzzli_54_trigger = 0; + } + break; + + case 0x38: // Reset + state->m_valueresponse = 0x78<<16; + state->m_valuekey = 0; + puzzli_54_trigger = 0; + break; + + case 0x41: // ASIC status? + state->m_valueresponse = 0x74<<16; + break; + + case 0x47: // ASIC status? + state->m_valueresponse = 0x74<<16; + break; + + case 0x52: // ASIC status? + { + // how is this selected? + + //if (state->m_value0 == 6) { + state->m_valueresponse = (0x74<<16)|1; // |1? + //} else { + // state->m_valueresponse = 0x74<<16; + //} + } + break; + + case 0x54: // ?? + puzzli_54_trigger = 1; + state->m_valueresponse = 0x36<<16; + break; + + case 0x61: // ?? + state->m_valueresponse = 0x36<<16; + break; - /* protection related? */ - mem16[0x1548ec / 2] = 0x4e71; - mem16[0x1548fc / 2] = 0x4e71; - mem16[0x1549fa / 2] = 0x4e71; - mem16[0x154a0a / 2] = 0x4e71; - mem16[0x15496a / 2] = 0x4e71; - mem16[0x14cee0 / 2] = 0x4e71; - mem16[0x1268c0 / 2] = 0x4e71; - mem16[0x1268c2 / 2] = 0x4e71; - mem16[0x1268c4 / 2] = 0x4e71; - mem16[0x154948 / 2] = 0x4e71; - mem16[0x13877a / 2] = 0x662c; - - /* patch irq4 vector (irq4 should be disabled on this game? how?) */ -// mem16[0x100070 / 2] = 0x0012; -// mem16[0x100072 / 2] = 0x5d78; - - state->m_asic28_key = 0; - state->m_asic28_rcnt = 0; - memset(state->m_asic28_regs, 0, 10); - memset(state->m_asic_params, 0, 256); - memset(state->m_eoregs, 0, 16); - - state->save_item(NAME(state->m_asic28_key)); - state->save_item(NAME(state->m_asic28_rcnt)); - state->save_item(NAME(state->m_asic28_regs)); - state->save_item(NAME(state->m_asic_params)); - state->save_item(NAME(state->m_eoregs)); + case 0x63: // probably read from a data table? + state->m_valueresponse = 0; // wrong... + break; + + case 0x67: // probably read from a data table? + state->m_valueresponse = 0; // wrong... + break; + + default: + state->m_valueresponse = 0x74<<16; + break; + } + + state->m_valuekey = (state->m_valuekey + 0x0100) & 0xff00; + if (state->m_valuekey == 0xff00) state->m_valuekey = 0x0100; + state->m_valuekey |= state->m_valuekey >> 8; + } + return; + + case 2: return; + } } + static DRIVER_INIT( dw2001 ) { //pgm_state *state = machine.driver_data(); @@ -5576,7 +5476,7 @@ static void pgm_decode_kovlsqh2_tiles( running_machine &machine ) { int i, j; - UINT16 *src = (UINT16 *)(machine.region("tiles")->base() + 0x400000); + UINT16 *src = (UINT16 *)(machine.region("tiles")->base() + 0x180000); UINT16 *dst = auto_alloc_array(machine, UINT16, 0x800000); for (i = 0; i < 0x800000 / 2; i++) @@ -5833,33 +5733,45 @@ machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x400000, 0x400005, FUNC(ddp3_asic_r), FUNC(ddp3_asic_w)); } - - static DRIVER_INIT( ddp3 ) { - pgm_basic_init_nobank(machine); + pgm_basic_init(machine, false); pgm_py2k2_decrypt(machine); // yes, it's the same as photo y2k2 install_asic27a_ddp3(machine); } static DRIVER_INIT( ket ) { - pgm_basic_init_nobank(machine); + pgm_basic_init(machine, false); pgm_ket_decrypt(machine); install_asic27a_ket(machine); } static DRIVER_INIT( espgal ) { - pgm_basic_init_nobank(machine); + pgm_basic_init(machine, false); pgm_espgal_decrypt(machine); install_asic27a_espgal(machine); } +static DRIVER_INIT( puzzli2 ) +{ + cavepgm_state *state = machine.driver_data(); + + pgm_basic_init(machine); + + pgm_puzzli2_decrypt(machine); + + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x500000, 0x500005, FUNC(ddp3_asic_r), FUNC(puzzli2_asic_w)); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x4f0000, 0x4fffff, FUNC(sango_protram_r)); + + // doesn't like this irq?? + state->m_irq4_disabled = 1; +} static void oldsplus_latch_init( running_machine &machine ) { - oldsplus_state *state = machine.driver_data(); + pgm_state *state = machine.driver_data(); state->m_oldsplus_key = 0; state->m_oldsplus_int[0] = 0; @@ -5894,6 +5806,35 @@ machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x4f0000, 0x4fffff, FUNC(oldsplus_protram_r)); } +static DRIVER_INIT( kov2p ) +{ + // this hacks the identification of the kov2 rom to return the string required for kov2p + // this isn't guaranteed to work properly (and definitely wouldn't on real hardware due to the internal + // ROM uploading the encryption table) The internal ROM should be dumped properly. + UINT8 *mem8 = (UINT8 *)machine.region("user1")->base(); + pgm_basic_init(machine); + pgm_kov2p_decrypt(machine); + kov2_latch_init(machine); + mem8[0xDE] = 0xC0; + mem8[0xDF] = 0x46; + mem8[0x4ED8] = 0xA8;// B0 + mem8[0x4EDC] = 0x9C;// A4 + mem8[0x4EE0] = 0x5C;// 64 + mem8[0x4EE4] = 0x94;// 9C + mem8[0x4EE8] = 0xE8;// F0 + mem8[0x4EEC] = 0x6C;// 74 + mem8[0x4EF0] = 0xD4;// DC + mem8[0x4EF4] = 0x50;// 58 + mem8[0x4EF8] = 0x80;// 88 + mem8[0x4EFC] = 0x9C;// A4 + mem8[0x4F00] = 0x28;// 30 + mem8[0x4F04] = 0x30;// 38 + mem8[0x4F08] = 0x34;// 3C + mem8[0x4F0C] = 0x1C;// 24 + mem8[0x1FFFFC] = 0x33; + mem8[0x1FFFFD] = 0x99; +} + /*** GAME ********************************************************************/ GAME( 1997, pgm, 0, pgm, pgm, pgm, ROT0, "IGS", "PGM (Polygame Master) System BIOS", GAME_IS_BIOS_ROOT ) @@ -5910,10 +5851,10 @@ GAME( 1997, orlegend111c, orlegend, pgm, orlegend, orlegend, ROT0, "IGS", "Oriental Legend / Xi You Shi E Zhuan (ver. 111, Chinese Board)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // V0001 no date! - runs as HongKong, China, China GAME( 1997, orlegend105k, orlegend, pgm, orld105k, orlegend, ROT0, "IGS", "Oriental Legend / Xi You Shi E Zhuan (ver. 105, Korean Board)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // V0000 no date! - runs as Korea -GAME( 1997, drgw2, pgm, drgw2, pgm, drgw2, ROT0, "IGS", "Dragon World II (ver. 110X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! -GAME( 1997, dw2v100x, drgw2, drgw2, pgm, dw2v100x, ROT0, "IGS", "Dragon World II (ver. 100X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! -GAME( 1997, drgw2j, drgw2, drgw2, pgm, drgw2j, ROT0, "IGS", "Chuugokuryuu II (ver. 100J, Japan)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! -GAME( 1997, drgw2c, drgw2, drgw2, pgm, drgw2c, ROT0, "IGS", "Zhong Guo Long II (ver. 100C, China)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1997, drgw2, pgm, pgm, pgm, drgw2, ROT0, "IGS", "Dragon World II (ver. 110X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! +GAME( 1997, dw2v100x, drgw2, pgm, pgm, dw2v100x, ROT0, "IGS", "Dragon World II (ver. 100X, Export)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! +GAME( 1997, drgw2j, drgw2, pgm, pgm, drgw2j, ROT0, "IGS", "Chuugokuryuu II (ver. 100J, Japan)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // This set still has protection issues! +GAME( 1997, drgw2c, drgw2, pgm, pgm, drgw2c, ROT0, "IGS", "Zhong Guo Long II (ver. 100C, China)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1999, photoy2k, pgm, kov, photoy2k, photoy2k, ROT0, "IGS", "Photo Y2K (ver. 105)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* region provided by protection device */ GAME( 1999, photoy2k104, photoy2k, kov, photoy2k, photoy2k, ROT0, "IGS", "Photo Y2K (ver. 104)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) /* region provided by protection device */ @@ -5931,6 +5872,9 @@ GAME( 2000, kov2101, kov2, kov2, sango, kov2, ROT0, "IGS", "Knights of Valour 2 / Sangoku Senki 2 (ver. 101, 101, 100HK)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 11/29/00 11:03:08 V100 (Ext. Arm V100, Int. Arm V100HK) GAME( 2000, kov2100, kov2, kov2, sango, kov2, ROT0, "IGS", "Knights of Valour 2 / Sangoku Senki 2 (ver. 100, 100, 100HK)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 11/29/00 11:03:08 V100 (Ext. Arm V100, Int. Arm V100HK) +GAME( 2001, kov2p, pgm, kov2, sango, kov2p, ROT0, "IGS", "Knights of Valour 2 Plus - Nine Dragons / Sangoku Senki 2 Plus - Nine Dragons (ver. M204XX)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2001, kov2p205, kov2p, kov2, sango, kov2p, ROT0, "IGS", "Knights of Valour 2 Plus - Nine Dragons / Sangoku Senki 2 Plus - Nine Dragons (ver. M205XX)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ + GAME( 2001, martmast, pgm, kov2, sango, martmast, ROT0, "IGS", "Martial Masters (ver. 104, 102, 102US)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 68k V104, Ext Arm 102, Int Arm 102US GAME( 2001, martmastc, martmast, kov2, sango, martmast, ROT0, "IGS", "Martial Masters (ver. 104, 102, 101CN)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 68k V104, Ext Arm 102, Int Arm 101CN GAME( 2001, martmastc102, martmast, kov2, sango, martmast, ROT0, "IGS", "Martial Masters (ver. 102, 101, 101CN)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // 68k V102, Ext Arm 101, Int Arm 101CN @@ -5947,6 +5891,21 @@ GAME( 1998, olds100, olds, olds, olds, olds, ROT0, "IGS", "Oriental Legend Special / Xi You Shi E Zhuan Super (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 1998, olds100a, olds, olds, olds, olds, ROT0, "IGS", "Oriental Legend Special / Xi You Shi E Zhuan Super (alt ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // crashes on some bosses, high score table etc. +GAME( 1999, kov, pgm, kov_simulated_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 117)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0008 04/27/99 10:33:33 +GAME( 1999, kov115, kov, kov_simulated_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 115)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0006 02/22/99 11:53:18 +GAME( 1999, kov100, kov, kov_simulated_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 100, Japanese Board)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0002 01/31/99 01:54:16 + +GAME( 1999, kovplus, pgm, kov_simulated_arm, sango, kov, ROT0, "IGS", "Knights of Valour Plus / Sangoku Senki Plus (ver. 119)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovplusa, kovplus, kov_simulated_arm, sango, kov, ROT0, "IGS", "Knights of Valour Plus / Sangoku Senki Plus (alt ver. 119)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ + +// modified title screen is only visible for china region, so use that by default. Character select portraits don't seem quite right (different protection?) +GAME( 1999, kovsgqyz, kovplus, kov_simulated_arm, sango_ch, kovboot, ROT0, "bootleg", "Knights of Valour: SanGuo QunYingZhuan / Sangoku Senki: SanGuo QunYingZhuan (bootleg, set 1)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovsgqyza, kovplus, kov_simulated_arm, sango_ch, kovboot, ROT0, "bootleg", "Knights of Valour: SanGuo QunYingZhuan / Sangoku Senki: SanGuo QunYingZhuan (bootleg, set 2)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 1999, kovsgqyzb, kovplus, kov_simulated_arm, sango_ch, kovboot, ROT0, "bootleg", "Knights of Valour: SanGuo QunYingZhuan / Sangoku Senki: SanGuo QunYingZhuan (bootleg, set 3)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ + + + + /* ----------------------------------------------------------------------------------------------------------------------- NOT Working (mostly due to needing internal protection roms dumped) -----------------------------------------------------------------------------------------------------------------------*/ @@ -5958,29 +5917,17 @@ GAME( 1998, dwex, pgm, dw3, dw3, drgw3, ROT0, "IGS", "Dragon World 3 EX (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) - -GAME( 1999, kov, pgm, kov_disabled_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 117)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0008 04/27/99 10:33:33 -GAME( 1999, kov115, kov, kov_disabled_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 115)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0006 02/22/99 11:53:18 -GAME( 1999, kov100, kov, kov_disabled_arm, sango, kov, ROT0, "IGS", "Knights of Valour / Sangoku Senki (ver. 100, Japanese Board)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // V0002 01/31/99 01:54:16 - -GAME( 1999, kovplus, pgm, kov_disabled_arm, sango, kov, ROT0, "IGS", "Knights of Valour Plus / Sangoku Senki Plus (ver. 119)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 1999, kovplusa, kovplus, kov_disabled_arm, sango, kov, ROT0, "IGS", "Knights of Valour Plus / Sangoku Senki Plus (alt ver. 119)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ - GAME( 1999, puzlstar, pgm, kov_disabled_arm, sango, pstar, ROT0, "IGS", "Puzzle Star (ver. 100MG)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2001, py2k2, pgm, kov_disabled_arm, photoy2k, py2k2, ROT0, "IGS", "Photo Y2K 2", GAME_NOT_WORKING ) /* need internal rom of IGS027A */ +GAME( 2001, ddp2, pgm, kov2_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 102)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2001, ddp2101, ddp2, kov2_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 101)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2001, ddp2100, ddp2, kov2_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2001, kov2p, pgm, kov2, sango, kov2p, ROT0, "IGS", "Knights of Valour 2 Plus - Nine Dragons / Sangoku Senki 2 Plus - Nine Dragons (ver. M204XX)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2001, kov2p205, kov2p, kov2, sango, kov2p, ROT0, "IGS", "Knights of Valour 2 Plus - Nine Dragons / Sangoku Senki 2 Plus - Nine Dragons (ver. M205XX)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ - -GAME( 2001, ddp2, pgm, kov_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 102)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2001, ddp2101, ddp2, kov_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 101)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2001, ddp2100, ddp2, kov_disabled_arm, ddp2, ddp2, ROT270, "IGS", "Bee Storm - DoDonPachi II (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ - -GAME( 2001, dw2001, pgm, kov_disabled_arm, sango, dw2001, ROT0, "IGS", "Dragon World 2001", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // V0000 02/21/01 16:05:16 +GAME( 2001, dw2001, pgm, kov2_disabled_arm, sango, dw2001, ROT0, "IGS", "Dragon World 2001", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // V0000 02/21/01 16:05:16 -GAME( 2001, puzzli2, pgm, kov_disabled_arm, sango, puzzli2, ROT0, "IGS", "Puzzli 2 Super (ver. 200)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) +GAME( 2001, puzzli2, pgm, puzzli2_disabled_arm, sango, puzzli2, ROT0, "IGS", "Puzzli 2 Super (ver. 200)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) GAME( 2002, dmnfrnt, pgm, svg, sango, dmnfrnt, ROT0, "IGS", "Demon Front (ver. 102)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2002, dmnfrnta, dmnfrnt, svg, sango, dmnfrnt, ROT0, "IGS", "Demon Front (ver. 105)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ @@ -5990,10 +5937,11 @@ GAME( 2003, theglad, pgm, svg, sango, theglad, ROT0, "IGS", "The Gladiator (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2003, theglada, theglad, svg, sango, theglad, ROT0, "IGS", "The Gladiator (ver. 101)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ -GAME( 2004, oldsplus, pgm, oldsplus, oldsplus, oldsplus, ROT0, "IGS", "Oriental Legend Special Plus / Xi You Shi E Zhuan Super Plus", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ +GAME( 2004, oldsplus, pgm, svg_disabled_arm, oldsplus, oldsplus, ROT0, "IGS", "Oriental Legend Special Plus / Xi You Shi E Zhuan Super Plus", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2004, kovshp, pgm, kov, sango, kovshp, ROT0, "IGS", "Knights of Valour Super Heroes Plus / Sangoku Senki Super Heroes Plus (ver. 100)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ // these bootlegs are clones of this instead +GAME( 2004, kovlsqh, kovshp, kov, sango, kovlsqh2, ROT0, "bootleg", "Knights of Valour: Luan Shi Quan Huang / Sangoku Senki: Luan Shi Quan Huang (ver. 200CN)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2004, kovlsqh2, kovshp, kov, sango, kovlsqh2, ROT0, "bootleg", "Knights of Valour: Luan Shi Quan Huang 2 / Sangoku Senki: Luan Shi Quan Huang 2 (ver. 200CN)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2004, kovlsjb, kovshp, kov, sango, kovlsqh2, ROT0, "bootleg", "Knights of Valour: Luan Shi Jie Ba / Sangoku Senki: Luan Shi Jie Ba (ver. 200CN)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ GAME( 2004, kovlsjba, kovshp, kov, sango, kovlsqh2, ROT0, "bootleg", "Knights of Valour: Luan Shi Jie Ba / Sangoku Senki: Luan Shi Jie Ba (alt ver. 200CN)", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) /* need internal rom of IGS027A */ @@ -6018,5 +5966,3 @@ GAME( 2003, espgal, 0, cavepgm, pgm, espgal, ROT270, "Cave", "Espgaluda (2003/10/15 Master Ver)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -/* PGM2 */ -GAME( 2007, orleg2, 0, pgm, pgm, 0, ROT0, "IGS", "Oriental Legend 2", GAME_IMPERFECT_SOUND | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/phoenix.c mame-0.145/src/mame/drivers/phoenix.c --- mame-0.144/src/mame/drivers/phoenix.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/phoenix.c 2012-02-06 21:30:40.000000000 +0000 @@ -460,9 +460,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(phoenix) + MCFG_SCREEN_UPDATE_STATIC(phoenix) MCFG_GFXDECODE(phoenix) MCFG_PALETTE_LENGTH(256) @@ -534,9 +533,8 @@ * page is missing */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(phoenix) + MCFG_SCREEN_UPDATE_STATIC(phoenix) MCFG_GFXDECODE(phoenix) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/photon2.c mame-0.145/src/mame/drivers/photon2.c --- mame-0.144/src/mame/drivers/photon2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/photon2.c 2012-02-06 21:30:41.000000000 +0000 @@ -9,7 +9,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/speaker.h" @@ -18,13 +17,17 @@ { public: photon2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_spectrum_video_ram; int m_spectrum_frame_number; int m_spectrum_flash_invert; UINT8 m_spectrum_port_fe; UINT8 m_nmi_enable; + + required_device m_maincpu; }; @@ -97,25 +100,29 @@ /* Code to change the FLASH status every 25 frames. Note this must be independent of frame skip etc. */ -static SCREEN_EOF( spectrum ) +static SCREEN_VBLANK( spectrum ) { - photon2_state *state = machine.driver_data(); - state->m_spectrum_frame_number++; - if (state->m_spectrum_frame_number >= 25) - { - state->m_spectrum_frame_number = 0; - state->m_spectrum_flash_invert = !state->m_spectrum_flash_invert; - } + // rising edge + if (vblank_on) + { + photon2_state *state = screen.machine().driver_data(); + state->m_spectrum_frame_number++; + if (state->m_spectrum_frame_number >= 25) + { + state->m_spectrum_frame_number = 0; + state->m_spectrum_flash_invert = !state->m_spectrum_flash_invert; + } + } } -INLINE void spectrum_plot_pixel(bitmap_t *bitmap, int x, int y, UINT32 color) +INLINE void spectrum_plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color) { - *BITMAP_ADDR16(bitmap, y, x) = (UINT16)color; + bitmap.pix16(y, x) = (UINT16)color; } -static SCREEN_UPDATE( spectrum ) +static SCREEN_UPDATE_IND16( spectrum ) { - photon2_state *state = screen->machine().driver_data(); + photon2_state *state = screen.machine().driver_data(); /* for now do a full-refresh */ int x, y, b, scrx, scry; unsigned short ink, pap; @@ -124,7 +131,7 @@ scr=state->m_spectrum_video_ram; - bitmap_fill(bitmap, cliprect, state->m_spectrum_port_fe & 0x07); + bitmap.fill(state->m_spectrum_port_fe & 0x07, cliprect); for (y=0; y<192; y++) { @@ -283,18 +290,20 @@ * *************************************/ -static INTERRUPT_GEN( spec_interrupt_hack ) +static TIMER_DEVICE_CALLBACK( spec_interrupt_hack ) { - photon2_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) == 1) + photon2_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == SPEC_SCREEN_HEIGHT/2) { - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } - else + else if(scanline == 0) { if ( state->m_nmi_enable ) { - cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } } } @@ -309,7 +318,7 @@ MCFG_CPU_ADD("maincpu", Z80, 3500000) /* 3.5 MHz */ MCFG_CPU_PROGRAM_MAP(spectrum_mem) MCFG_CPU_IO_MAP(spectrum_io) - MCFG_CPU_VBLANK_INT_HACK(spec_interrupt_hack, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", spec_interrupt_hack, "screen", 0, 1) MCFG_MACHINE_RESET( photon2 ) @@ -317,11 +326,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50.08) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(SPEC_SCREEN_WIDTH, SPEC_SCREEN_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(0, SPEC_SCREEN_WIDTH-1, 0, SPEC_SCREEN_HEIGHT-1) - MCFG_SCREEN_UPDATE( spectrum ) - MCFG_SCREEN_EOF( spectrum ) + MCFG_SCREEN_UPDATE_STATIC( spectrum ) + MCFG_SCREEN_VBLANK_STATIC( spectrum ) MCFG_PALETTE_LENGTH(16) MCFG_PALETTE_INIT( spectrum ) diff -Nru mame-0.144/src/mame/drivers/photon.c mame-0.145/src/mame/drivers/photon.c --- mame-0.144/src/mame/drivers/photon.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/photon.c 2012-02-06 21:30:36.000000000 +0000 @@ -197,9 +197,9 @@ { } -static SCREEN_UPDATE( photon ) +static SCREEN_UPDATE_IND16( photon ) { - return pk8000_video_update(screen, bitmap, cliprect, screen->machine().region("maincpu")->base()); + return pk8000_video_update(screen, bitmap, cliprect, screen.machine().region("maincpu")->base()); } static MACHINE_CONFIG_START( photon, photon_state ) @@ -216,10 +216,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256+32, 192+32) MCFG_SCREEN_VISIBLE_AREA(0, 256+32-1, 0, 192+32-1) - MCFG_SCREEN_UPDATE(photon) + MCFG_SCREEN_UPDATE_STATIC(photon) MCFG_PALETTE_LENGTH(16) MCFG_PALETTE_INIT(pk8000) diff -Nru mame-0.144/src/mame/drivers/photoply.c mame-0.145/src/mame/drivers/photoply.c --- mame-0.144/src/mame/drivers/photoply.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/photoply.c 2012-02-06 21:30:38.000000000 +0000 @@ -5,9 +5,6 @@ Preliminary driver by Angelo Salese TODO: -- asserts with "i386: Invalid REP/opcode 2E combination", but it puts something if you disable that - assert (i386\i386ops.c, line:1083), what is the cause? -- Puts "BIOS ROM checksum error" on POST just like California Chase, maybe a CPU bug or missing MMU? - Puts a FDC error, needs a DASM investigation / work-around. *******************************************************************************************************/ @@ -25,7 +22,7 @@ #include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" - +#include "video/pc_vga.h" class photoply_state : public driver_device { @@ -33,13 +30,10 @@ photoply_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - UINT32 *m_vga_vram; - UINT8 m_vga_regs[0x19]; int m_dma_channel; UINT8 m_dma_offset[2][4]; UINT8 m_at_pages[0x10]; UINT8 m_vga_address; - struct { int r,g,b,offs,offs_internal; } m_pal; device_t *m_pit8253; device_t *m_pic8259_1; @@ -49,81 +43,6 @@ }; -#define SET_VISIBLE_AREA(_x_,_y_) \ - { \ - rectangle visarea; \ - visarea.min_x = 0; \ - visarea.max_x = _x_-1; \ - visarea.min_y = 0; \ - visarea.max_y = _y_-1; \ - machine.primary_screen->configure(_x_, _y_, visarea, machine.primary_screen->frame_period().attoseconds ); \ - } \ - -#define RES_320x200 0 -#define RES_640x200 1 - -static VIDEO_START(photoply) -{ -} - -static void cga_alphanumeric_tilemap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,UINT16 size,UINT32 map_offs,UINT8 gfx_num) -{ - photoply_state *state = machine.driver_data(); - UINT32 offs,x,y,max_x,max_y; - int tile,color; - - /*define the visible area*/ - switch(size) - { - case RES_320x200: - SET_VISIBLE_AREA(320,200); - max_x = 40; - max_y = 25; - break; - case RES_640x200: - SET_VISIBLE_AREA(640,200); - max_x = 80; - max_y = 25; - break; - default: - fatalerror("Unknown size"); - } - - offs = map_offs; - - for(y=0;ym_vga_vram[offs] & 0x00ff0000)>>16; - color = (state->m_vga_vram[offs] & 0xff000000)>>24; - - drawgfx_opaque(bitmap,cliprect,machine.gfx[gfx_num], - tile, - color, - 0,0, - (x+1)*8,y*8); - - - tile = (state->m_vga_vram[offs] & 0x000000ff); - color = (state->m_vga_vram[offs] & 0x0000ff00)>>8; - - drawgfx_opaque(bitmap,cliprect,machine.gfx[gfx_num], - tile, - color, - 0,0, - (x+0)*8,y*8); - - offs++; - } -} - - -static SCREEN_UPDATE(photoply) -{ - cga_alphanumeric_tilemap(screen->machine(),bitmap,cliprect,RES_640x200,0x18000/4,0); - - return 0; -} /****************** DMA8237 Controller @@ -313,7 +232,7 @@ static ADDRESS_MAP_START( photoply_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0x000a0000, 0x000bffff) AM_RAM AM_BASE_MEMBER(photoply_state, m_vga_vram) + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM // VGA RAM AM_RANGE(0x000c0000, 0x000c7fff) AM_RAM AM_REGION("video_bios", 0) //??? AM_RANGE(0x000c8000, 0x000cffff) AM_RAM AM_REGION("video_bios", 0) AM_RANGE(0x000d0000, 0x000dffff) AM_RAM AM_REGION("ex_bios", 0) @@ -321,61 +240,7 @@ AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) ADDRESS_MAP_END -static READ32_HANDLER( kludge_r ) -{ - return space->machine().rand(); -} - -/* 3c8-3c9 -> ramdac*/ -static WRITE32_HANDLER( vga_ramdac_w ) -{ - photoply_state *state = space->machine().driver_data(); - if (ACCESSING_BITS_0_7) - { - //printf("%02x X\n",data); - state->m_pal.offs = state->m_pal.offs_internal = data; - } - if (ACCESSING_BITS_8_15) - { - //printf("%02x\n",data); - data>>=8; - switch(state->m_pal.offs_internal) - { - case 0: - state->m_pal.r = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 1: - state->m_pal.g = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 2: - state->m_pal.b = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - palette_set_color(space->machine(), 0x200+state->m_pal.offs, MAKE_RGB(state->m_pal.r, state->m_pal.g, state->m_pal.b)); - state->m_pal.offs_internal = 0; - state->m_pal.offs++; - break; - } - } -} - -static WRITE32_HANDLER( vga_regs_w ) -{ - photoply_state *state = space->machine().driver_data(); - if (ACCESSING_BITS_0_7) - state->m_vga_address = data; - if (ACCESSING_BITS_8_15) - { - if(state->m_vga_address < 0x19) - { - state->m_vga_regs[state->m_vga_address] = data>>8; - logerror("VGA reg %02x with data %02x\n",state->m_vga_address,state->m_vga_regs[state->m_vga_address]); - } - else - logerror("Warning: used undefined VGA reg %02x with data %02x\n",state->m_vga_address,data>>8); - } -} static ADDRESS_MAP_START( photoply_io, AS_IO, 32 ) AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", i8237_r, i8237_w, 0xffffffff) @@ -386,19 +251,11 @@ AM_RANGE(0x0080, 0x009f) AM_READWRITE8(dma_page_select_r,dma_page_select_w, 0xffffffff)//TODO AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE8("dma8237_2", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x00e8, 0x00eb) AM_NOP AM_RANGE(0x0278, 0x027f) AM_RAM //parallel port 2 AM_RANGE(0x0378, 0x037f) AM_RAM //parallel port - AM_RANGE(0x03c0, 0x03c3) AM_RAM - AM_RANGE(0x03cc, 0x03cf) AM_RAM - AM_RANGE(0x03b4, 0x03b7) AM_WRITE(vga_regs_w) - AM_RANGE(0x03c4, 0x03c7) AM_RAM //vga regs - AM_RANGE(0x03c8, 0x03cb) AM_WRITE(vga_ramdac_w) - AM_RANGE(0x03b8, 0x03bb) AM_READ(kludge_r) //hv_retrace - AM_RANGE(0x03c8, 0x03cb) AM_READ(kludge_r) //hv_retrace - AM_RANGE(0x03d4, 0x03d7) AM_WRITE(vga_regs_w) - AM_RANGE(0x03d8, 0x03db) AM_RAM AM_RANGE(0x03bc, 0x03bf) AM_RAM //parallel port 3 - AM_RANGE(0x03f4, 0x03f7) AM_READ(kludge_r) // fdc +// AM_RANGE(0x03f4, 0x03f7) AM_READ(kludge_r) // fdc ADDRESS_MAP_END #define AT_KEYB_HELPER(bit, text, key1) \ @@ -435,51 +292,6 @@ PORT_START("pc_keyboard_7") INPUT_PORTS_END -static const rgb_t defcolors[]= -{ - MAKE_RGB(0x00,0x00,0x00), - MAKE_RGB(0x00,0x00,0xaa), - MAKE_RGB(0x00,0xaa,0x00), - MAKE_RGB(0x00,0xaa,0xaa), - MAKE_RGB(0xaa,0x00,0x00), - MAKE_RGB(0xaa,0x00,0xaa), - MAKE_RGB(0xaa,0xaa,0x00), - MAKE_RGB(0xaa,0xaa,0xaa), - MAKE_RGB(0x55,0x55,0x55), - MAKE_RGB(0x55,0x55,0xff), - MAKE_RGB(0x55,0xff,0x55), - MAKE_RGB(0x55,0xff,0xff), - MAKE_RGB(0xff,0x55,0x55), - MAKE_RGB(0xff,0x55,0xff), - MAKE_RGB(0xff,0xff,0x55), - MAKE_RGB(0xff,0xff,0xff) -}; - -static PALETTE_INIT(pcat_286) -{ - /*Note:palette colors are 6bpp... - xxxx xx-- - */ - int ix,iy; - - for(ix=0;ix<0x300;ix++) - palette_set_color(machine, ix,MAKE_RGB(0x00,0x00,0x00)); - - //regular colors - for(iy=0;iy<0x10;iy++) - { - for(ix=0;ix<0x10;ix++) - { - palette_set_color(machine,(ix*2)+1+(iy*0x20),defcolors[ix]); - palette_set_color(machine,(ix*2)+0+(iy*0x20),defcolors[iy]); - } - } - - //bitmap mode - for(ix=0;ix<0x10;ix++) - palette_set_color(machine, 0x200+ix,defcolors[ix]); - //todo: 256 colors -} static void photoply_set_keyb_int(running_machine &machine, int state) { @@ -491,9 +303,6 @@ static MACHINE_START( photoply ) { photoply_state *state = machine.driver_data(); -// bank = -1; -// lastvalue = -1; -// hv_blank = 0; device_set_irq_callback(machine.device("maincpu"), irq_callback); state->m_pit8253 = machine.device( "pit8254" ); state->m_pic8259_1 = machine.device( "pic8259_1" ); @@ -520,6 +329,7 @@ //there's also a 8x16 entry (just after the 8x8) GFXDECODE_END +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static MACHINE_CONFIG_START( photoply, photoply_state ) /* basic machine hardware */ @@ -527,15 +337,6 @@ MCFG_CPU_PROGRAM_MAP(photoply_map) MCFG_CPU_IO_MAP(photoply_io) - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(photoply) - MCFG_GFXDECODE( photoply ) MCFG_MACHINE_START(photoply) @@ -548,11 +349,7 @@ MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) MCFG_PIT8254_ADD( "pit8254", at_pit8254_config ) - MCFG_PALETTE_INIT(pcat_286) - - MCFG_PALETTE_LENGTH(0x300) - - MCFG_VIDEO_START(photoply) + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END @@ -570,8 +367,13 @@ ROM_LOAD("vga.bin", 0x000000, 0x8000, CRC(7a859659) SHA1(ff667218261969c48082ec12aa91088a01b0cb2a) ) DISK_REGION( "ide" ) - DISK_IMAGE( "photoply", 0,NO_DUMP ) + DISK_IMAGE( "pp201", 0, SHA1(23e1940d485d19401e7d0ad912ddad2cf2ea10b4) ) ROM_END +static DRIVER_INIT( photoply ) +{ + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} -GAME( 199?, photoply, 0, photoply, photoply, 0, ROT0, "Funworld", "PhotoPlay", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, photoply, 0, photoply, photoply, photoply, ROT0, "Funworld", "Photo Play 2000 (v2.01)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/pingpong.c mame-0.145/src/mame/drivers/pingpong.c --- mame-0.144/src/mame/drivers/pingpong.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pingpong.c 2012-02-06 21:30:39.000000000 +0000 @@ -6,7 +6,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "sound/sn76496.h" #include "machine/nvram.h" #include "includes/pingpong.h" @@ -18,32 +17,15 @@ pingpong_state *state = space->machine().driver_data(); if( data != 0xff ) { - switch( ~data & 0xff ) + int i; + + for(i=0;i<8;i++) { - case 0x01: - state->m_question_addr_high = 0; - break; - case 0x02: - state->m_question_addr_high = 0x8000; - break; - case 0x04: - state->m_question_addr_high = 0x10000; - break; - case 0x08: - state->m_question_addr_high = 0x18000; - break; - case 0x10: - state->m_question_addr_high = 0x20000; - break; - case 0x20: - state->m_question_addr_high = 0x28000; - break; - case 0x40: - state->m_question_addr_high = 0x30000; - break; - case 0x80: - state->m_question_addr_high = 0x38000; - break; + if((~data & 0xff) == 1 << i) + { + state->m_question_addr_high = i*0x8000; + return; + } } } } @@ -76,16 +58,33 @@ /* other bits unknown */ } -static INTERRUPT_GEN( pingpong_interrupt ) +static TIMER_DEVICE_CALLBACK( pingpong_interrupt ) +{ + pingpong_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 240) + { + if (state->m_intenable & 0x04) device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + } + else if ((scanline % 32) == 0) + { + if (state->m_intenable & 0x08) device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); + } +} + +static TIMER_DEVICE_CALLBACK( merlinmm_interrupt ) { - pingpong_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) == 0) + pingpong_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 240) { - if (state->m_intenable & 0x04) device_set_input_line(device, 0, HOLD_LINE); + if (state->m_intenable & 0x04) device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } - else if (cpu_getiloops(device) % 2) + else if (scanline == 0) { - if (state->m_intenable & 0x08) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + if (state->m_intenable & 0x08) device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } } @@ -151,7 +150,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_START("DSW1") - PORT_DIPNAME( 0x0F, 0x0F, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0x0F, 0x0F, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:8,7,6,5") PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x0A, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) ) @@ -168,7 +167,7 @@ PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0xF0, 0xF0, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0xF0, 0xF0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:4,3,2,1") PORT_DIPSETTING( 0x40, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0xA0, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) @@ -187,19 +186,15 @@ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x06, 0x06, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x06, 0x02, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:7,6") PORT_DIPSETTING( 0x06, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x04, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END static INPUT_PORTS_START( merlinmm ) @@ -456,16 +451,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu",Z80,18432000/6) /* 3.072 MHz (probably) */ MCFG_CPU_PROGRAM_MAP(pingpong_map) - MCFG_CPU_VBLANK_INT_HACK(pingpong_interrupt,16) /* 1 IRQ + 8 NMI */ + MCFG_TIMER_ADD_SCANLINE("scantimer", pingpong_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(456, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pingpong) + MCFG_SCREEN_UPDATE_STATIC(pingpong) MCFG_GFXDECODE(pingpong) MCFG_PALETTE_LENGTH(64*4+64*4) @@ -484,7 +478,8 @@ static MACHINE_CONFIG_DERIVED( merlinmm, pingpong ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(merlinmm_map) - MCFG_CPU_VBLANK_INT_HACK(pingpong_interrupt,2) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(merlinmm_interrupt) MCFG_NVRAM_ADD_0FILL("nvram") MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/pinkiri8.c mame-0.145/src/mame/drivers/pinkiri8.c --- mame-0.144/src/mame/drivers/pinkiri8.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/pinkiri8.c 2012-02-06 21:30:34.000000000 +0000 @@ -86,7 +86,7 @@ janshi_vdp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); protected: virtual void device_config_complete(); - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; @@ -109,10 +109,8 @@ // m_space_config = address_space_config("janshi_vdp", ENDIANNESS_BIG, 8, address_bits, 0, *ADDRESS_MAP_NAME(janshi_vdp_map8)); } -bool janshi_vdp_device::device_validity_check(emu_options &options, const game_driver &driver) const +void janshi_vdp_device::device_validity_check(validity_checker &valid) const { - bool error = false; - return error; } void janshi_vdp_device::device_start() @@ -173,17 +171,17 @@ */ -static SCREEN_UPDATE( pinkiri8 ) +static SCREEN_UPDATE_IND16( pinkiri8 ) { - pinkiri8_state *state = screen->machine().driver_data(); + pinkiri8_state *state = screen.machine().driver_data(); int col_bank; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; int game_type_hack = 0; - if (!strcmp(screen->machine().system().name,"janshi")) game_type_hack = 1; + if (!strcmp(screen.machine().system().name,"janshi")) game_type_hack = 1; - if ( screen->machine().input().code_pressed_once(KEYCODE_W) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_W) ) { int i; int count2; @@ -213,7 +211,7 @@ //popmessage("%02x",state->m_janshi_crtc_regs[0x0a]); col_bank = (state->m_janshi_crtc_regs[0x0a] & 0x40) >> 6; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* FIXME: color is a bit of a mystery */ { @@ -287,7 +285,7 @@ if (bit) { - //col = screen->machine().rand(); + //col = screen.machine().rand(); width = 2; } else @@ -1103,10 +1101,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 64*8-1) - MCFG_SCREEN_UPDATE(pinkiri8) + MCFG_SCREEN_UPDATE_STATIC(pinkiri8) MCFG_GFXDECODE(pinkiri8) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/pipedrm.c mame-0.145/src/mame/drivers/pipedrm.c --- mame-0.144/src/mame/drivers/pipedrm.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pipedrm.c 2012-02-06 21:30:37.000000000 +0000 @@ -652,10 +652,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(44*8, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(pipedrm) + MCFG_SCREEN_UPDATE_STATIC(pipedrm) MCFG_GFXDECODE(pipedrm) MCFG_PALETTE_LENGTH(2048) @@ -692,10 +691,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(44*8, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 44*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(fromance) + MCFG_SCREEN_UPDATE_STATIC(fromance) MCFG_GFXDECODE(hatris) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/pipeline.c mame-0.145/src/mame/drivers/pipeline.c --- mame-0.144/src/mame/drivers/pipeline.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/pipeline.c 2012-02-06 21:30:38.000000000 +0000 @@ -121,14 +121,14 @@ state->m_palram=auto_alloc_array(machine, UINT8, 0x1000); state->m_tilemap1 = tilemap_create( machine, get_tile_info,tilemap_scan_rows,8,8,64,32 ); state->m_tilemap2 = tilemap_create( machine, get_tile_info2,tilemap_scan_rows,8,8,64,32 ); - tilemap_set_transparent_pen(state->m_tilemap2,0); + state->m_tilemap2->set_transparent_pen(0); } -static SCREEN_UPDATE( pipeline ) +static SCREEN_UPDATE_IND16( pipeline ) { - pipeline_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap1, 0,0); - tilemap_draw(bitmap,cliprect,state->m_tilemap2, 0,0); + pipeline_state *state = screen.machine().driver_data(); + state->m_tilemap1->draw(bitmap, cliprect, 0,0); + state->m_tilemap2->draw(bitmap, cliprect, 0,0); return 0; } @@ -144,7 +144,7 @@ pipeline_state *state = space->machine().driver_data(); if(!(state->m_vidctrl&1)) { - tilemap_mark_tile_dirty(state->m_tilemap1,offset&0x7ff); + state->m_tilemap1->mark_tile_dirty(offset&0x7ff); state->m_vram2[offset]=data; } else @@ -161,7 +161,7 @@ static WRITE8_HANDLER(vram1_w) { pipeline_state *state = space->machine().driver_data(); - tilemap_mark_tile_dirty(state->m_tilemap2,offset&0x7ff); + state->m_tilemap2->mark_tile_dirty(offset&0x7ff); state->m_vram1[offset]=data; } @@ -406,10 +406,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 319, 16, 239) - MCFG_SCREEN_UPDATE(pipeline) + MCFG_SCREEN_UPDATE_STATIC(pipeline) MCFG_GFXDECODE(pipeline) diff -Nru mame-0.144/src/mame/drivers/pirates.c mame-0.145/src/mame/drivers/pirates.c --- mame-0.144/src/mame/drivers/pirates.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pirates.c 2012-02-06 21:30:40.000000000 +0000 @@ -273,10 +273,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pirates) + MCFG_SCREEN_UPDATE_STATIC(pirates) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/pitnrun.c mame-0.145/src/mame/drivers/pitnrun.c --- mame-0.144/src/mame/drivers/pitnrun.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/pitnrun.c 2012-02-06 21:30:34.000000000 +0000 @@ -250,10 +250,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pitnrun) + MCFG_SCREEN_UPDATE_STATIC(pitnrun) MCFG_GFXDECODE(pitnrun) MCFG_PALETTE_LENGTH(32*3) diff -Nru mame-0.144/src/mame/drivers/pkscram.c mame-0.145/src/mame/drivers/pkscram.c --- mame-0.144/src/mame/drivers/pkscram.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pkscram.c 2012-02-06 21:30:33.000000000 +0000 @@ -41,21 +41,21 @@ { pkscram_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pkscramble_fgtilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( pkscramble_mdtilemap_w ) { pkscram_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pkscramble_mdtilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_md_tilemap, offset >> 1); + state->m_md_tilemap->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( pkscramble_bgtilemap_w ) { pkscram_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pkscramble_bgtilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } // input bit 0x20 in port1 should stay low until bit 0x20 is written here, then @@ -234,16 +234,16 @@ state->m_md_tilemap = tilemap_create(machine, get_md_tile_info, tilemap_scan_rows, 8, 8,32,32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_md_tilemap,15); - tilemap_set_transparent_pen(state->m_fg_tilemap,15); + state->m_md_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_transparent_pen(15); } -static SCREEN_UPDATE( pkscramble ) +static SCREEN_UPDATE_IND16( pkscramble ) { - pkscram_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_md_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + pkscram_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_md_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -313,10 +313,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1) - MCFG_SCREEN_UPDATE(pkscramble) + MCFG_SCREEN_UPDATE_STATIC(pkscramble) MCFG_PALETTE_LENGTH(0x800) MCFG_GFXDECODE(pkscram) diff -Nru mame-0.144/src/mame/drivers/pktgaldx.c mame-0.145/src/mame/drivers/pktgaldx.c --- mame-0.144/src/mame/drivers/pktgaldx.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pktgaldx.c 2012-02-06 21:30:35.000000000 +0000 @@ -334,10 +334,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(pktgaldx) + MCFG_SCREEN_UPDATE_STATIC(pktgaldx) MCFG_PALETTE_LENGTH(4096) MCFG_GFXDECODE(pktgaldx) @@ -375,10 +374,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(pktgaldb) + MCFG_SCREEN_UPDATE_STATIC(pktgaldb) MCFG_PALETTE_LENGTH(4096) MCFG_GFXDECODE(bootleg) diff -Nru mame-0.144/src/mame/drivers/play_1.c mame-0.145/src/mame/drivers/play_1.c --- mame-0.144/src/mame/drivers/play_1.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/play_1.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,6 +1,9 @@ /* Playmatic MPU 1 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/cosmac/cosmac.h" @@ -8,17 +11,27 @@ { public: play_1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( play_1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( play_1_map, AS_PROGRAM, 8, play_1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( play_1 ) INPUT_PORTS_END -static MACHINE_RESET( play_1 ) +void play_1_state::machine_reset() { } @@ -47,8 +60,6 @@ MCFG_CPU_ADD("maincpu", COSMAC, 400000) MCFG_CPU_PROGRAM_MAP(play_1_map) MCFG_CPU_CONFIG(cdp1802_config) - - MCFG_MACHINE_RESET( play_1 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -97,8 +108,8 @@ ROM_LOAD("party_b.bin", 0x0400, 0x0400, CRC(5e2ba9c0) SHA1(abd285aa5702c7fb84257b4341f64ff83c1fc0ce)) ROM_END -GAME(1978, bigtown, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Big Town", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, chance, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Chance", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, lastlap, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Last Lap", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, spcgambl, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Space Gambler", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, party, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Party", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1978, bigtown, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Big Town", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, chance, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Chance", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, lastlap, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Last Lap", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, spcgambl, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Space Gambler", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, party, 0, play_1, play_1, play_1, ROT0, "Playmatic", "Party", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/play_2.c mame-0.145/src/mame/drivers/play_2.c --- mame-0.144/src/mame/drivers/play_2.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/play_2.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,6 +1,9 @@ /* Playmatic MPU 2 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/cosmac/cosmac.h" @@ -8,17 +11,27 @@ { public: play_2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( play_2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( play_2_map, AS_PROGRAM, 8, play_2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( play_2 ) INPUT_PORTS_END -static MACHINE_RESET( play_2 ) +void play_2_state::machine_reset() { } @@ -47,8 +60,6 @@ MCFG_CPU_ADD("maincpu", COSMAC, 2950000) MCFG_CPU_PROGRAM_MAP(play_2_map) MCFG_CPU_CONFIG(cdp1802_config) - - MCFG_MACHINE_RESET( play_2 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -232,11 +243,10 @@ // ??/87 Skill Flight -GAME(1979, antar, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Antar", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, antar2, antar, play_2, play_2, play_2, ROT0, "Playmatic", "Antar (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, evlfight, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Evil Fight", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, attack, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Attack", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, blkfever, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Black Fever", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, cerberup, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Cerberus (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, madrace, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Mad Race", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1979, antar, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Antar", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, antar2, antar, play_2, play_2, play_2, ROT0, "Playmatic", "Antar (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, evlfight, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Evil Fight", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, attack, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Attack", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, blkfever, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Black Fever", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, cerberup, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Cerberus (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, madrace, 0, play_2, play_2, play_2, ROT0, "Playmatic", "Mad Race", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/play_3.c mame-0.145/src/mame/drivers/play_3.c --- mame-0.144/src/mame/drivers/play_3.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/play_3.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,6 +1,9 @@ /* Playmatic MPU 3 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/cosmac/cosmac.h" @@ -8,18 +11,28 @@ { public: play_3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( play_3_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( play_3_map, AS_PROGRAM, 8, play_3_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( play_3 ) INPUT_PORTS_END -static MACHINE_RESET( play_3 ) +void play_3_state::machine_reset() { } @@ -48,8 +61,6 @@ MCFG_CPU_ADD("maincpu", COSMAC, 2950000) MCFG_CPU_PROGRAM_MAP(play_3_map) MCFG_CPU_CONFIG(cdp1802_config) - - MCFG_MACHINE_RESET( play_3 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -61,6 +72,7 @@ ROM_RELOAD(0x4000, 0x2000) ROM_RELOAD(0x8000, 0x2000) ROM_RELOAD(0xc000, 0x2000) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("smogot.bin", 0x0000, 0x2000, CRC(92fa0742) SHA1(ef3100a53323fd67e23b47fc3e72fdb4671e9b0a)) ROM_RELOAD(0x4000, 0x2000) @@ -72,4 +84,4 @@ ROM_RELOAD(0xe000, 0x1000) ROM_END -GAME(1983, megaaton, 0, play_3, play_3, play_3, ROT0, "Playmatic", "Meg Aaton", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1983, megaaton, 0, play_3, play_3, play_3, ROT0, "Playmatic", "Meg Aaton", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/play_5.c mame-0.145/src/mame/drivers/play_5.c --- mame-0.144/src/mame/drivers/play_5.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/play_5.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,6 +1,9 @@ /* Playmatic MPU 5 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/cosmac/cosmac.h" @@ -8,18 +11,28 @@ { public: play_5_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( play_5_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( play_5_map, AS_PROGRAM, 8, play_5_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( play_5 ) INPUT_PORTS_END -static MACHINE_RESET( play_5 ) +void play_5_state::machine_reset() { } @@ -48,8 +61,6 @@ MCFG_CPU_ADD("maincpu", COSMAC, 2950000) MCFG_CPU_PROGRAM_MAP(play_5_map) MCFG_CPU_CONFIG(cdp1802_config) - - MCFG_MACHINE_RESET( play_5 ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -174,9 +185,9 @@ ROM_RELOAD(0xe000, 0x0800) ROM_END -GAME(1982, spain82, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Spain '82", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, ufo_x, 0, play_5, play_5, play_5, ROT0, "Playmatic", "UFO-X", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, kz26, 0, play_5, play_5, play_5, ROT0, "Playmatic", "KZ-26", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, rock2500, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Rock 2500", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, starfirp, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Star Fire", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, trailer, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Trailer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1982, spain82, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Spain '82", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, ufo_x, 0, play_5, play_5, play_5, ROT0, "Playmatic", "UFO-X", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, kz26, 0, play_5, play_5, play_5, ROT0, "Playmatic", "KZ-26", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, rock2500, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Rock 2500", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, starfirp, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Star Fire", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, trailer, 0, play_5, play_5, play_5, ROT0, "Playmatic", "Trailer", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/playch10.c mame-0.145/src/mame/drivers/playch10.c --- mame-0.144/src/mame/drivers/playch10.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/playch10.c 2012-02-06 21:30:42.000000000 +0000 @@ -334,7 +334,8 @@ static WRITE8_HANDLER( sprite_dma_w ) { int source = ( data & 7 ); - ppu2c0x_spriteram_dma( space, space->machine().device("ppu"), source ); + ppu2c0x_device *ppu = space->machine().device("ppu"); + ppu->spriteram_dma(space, source); } /* Only used in single monitor bios */ @@ -396,7 +397,7 @@ static ADDRESS_MAP_START( cart_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_MIRROR(0x1800) AM_BASE_MEMBER(playch10_state, m_work_ram) - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu", ppu2c0x_device, read, write) AM_RANGE(0x4011, 0x4011) AM_DEVWRITE("dac", dac_w) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes", nes_psg_r, nes_psg_w) AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) @@ -693,18 +694,16 @@ MCFG_DEFAULT_LAYOUT(layout_dualhuov) MCFG_SCREEN_ADD("top", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(playch10) + MCFG_SCREEN_UPDATE_STATIC(playch10_top) MCFG_SCREEN_ADD("bottom", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(playch10) + MCFG_SCREEN_UPDATE_STATIC(playch10_bottom) MCFG_PALETTE_INIT(playch10) MCFG_VIDEO_START(playch10) @@ -730,9 +729,6 @@ static MACHINE_CONFIG_DERIVED( playch10_hboard, playch10 ) MCFG_VIDEO_START(playch10_hboard) MCFG_MACHINE_START(playch10_hboard) - - MCFG_DEVICE_REMOVE("ppu") - MCFG_PPU2C03B_ADD("ppu", playch10_ppu_interface) MACHINE_CONFIG_END /*************************************************************************** diff -Nru mame-0.144/src/mame/drivers/playmark.c mame-0.145/src/mame/drivers/playmark.c --- mame-0.144/src/mame/drivers/playmark.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/playmark.c 2012-02-06 21:30:34.000000000 +0000 @@ -1091,10 +1091,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(bigtwin) + MCFG_SCREEN_UPDATE_STATIC(bigtwin) MCFG_GFXDECODE(playmark) MCFG_PALETTE_LENGTH(1024) @@ -1126,10 +1125,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(bigtwinb) + MCFG_SCREEN_UPDATE_STATIC(bigtwinb) MCFG_GFXDECODE(bigtwinb) MCFG_PALETTE_LENGTH(1024) @@ -1164,10 +1162,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(wbeachvl) + MCFG_SCREEN_UPDATE_STATIC(wbeachvl) MCFG_GFXDECODE(wbeachvl) MCFG_PALETTE_LENGTH(2048) @@ -1199,10 +1196,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(excelsr) + MCFG_SCREEN_UPDATE_STATIC(excelsr) MCFG_GFXDECODE(excelsr) MCFG_PALETTE_LENGTH(1024) @@ -1237,10 +1233,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hrdtimes) + MCFG_SCREEN_UPDATE_STATIC(hrdtimes) MCFG_GFXDECODE(hrdtimes) MCFG_PALETTE_LENGTH(1024) @@ -1272,10 +1267,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(hrdtimes) + MCFG_SCREEN_UPDATE_STATIC(hrdtimes) MCFG_GFXDECODE(hrdtimes) MCFG_PALETTE_LENGTH(1024) @@ -1446,6 +1440,54 @@ ROM_COPY( "user2", 0x0e0000, 0x1a0000, 0x020000) ROM_END + +ROM_START( wbeachvl3 ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ + ROM_LOAD16_BYTE( "2.u16", 0x000000, 0x40000, CRC(f0f4c282) SHA1(94850b45368c3d09629852adc8ca08164b7a7a94) ) + ROM_LOAD16_BYTE( "3.u15", 0x000001, 0x40000, CRC(99775c21) SHA1(fa80a81c59142abcf751352d7a7f9e0d3b5172c9) ) + + ROM_REGION( 0x1000, "audiocpu", ROMREGION_ERASE00 ) /* sound (missing) */ + ROM_LOAD( "pic16c57", 0x0000, 0x1000, NO_DUMP ) + + ROM_REGION( 0x600000, "gfx1", 0 ) + ROM_LOAD( "wbv_10.bin", 0x000000, 0x80000, CRC(50680f0b) SHA1(ed76ef6ced70ba7e9558162aa94bbe9f19bbabe6) ) + ROM_LOAD( "wbv_04.bin", 0x080000, 0x80000, CRC(df9cbff1) SHA1(7197939d9c4e8666d37266b6326134cfb4c761da) ) + ROM_LOAD( "wbv_11.bin", 0x100000, 0x80000, CRC(e59ad0d1) SHA1(70dfc1ea45246fc8e24c96550563ab7a983f3824) ) + ROM_LOAD( "wbv_05.bin", 0x180000, 0x80000, CRC(51245c3c) SHA1(5ac27d6fc22555766b4cdd532210199f4d7bd8bb) ) + ROM_LOAD( "wbv_12.bin", 0x200000, 0x80000, CRC(36b87d0b) SHA1(702b8139d150c7cc9399dfa38536567aab40dcef) ) + ROM_LOAD( "wbv_06.bin", 0x280000, 0x80000, CRC(9eb808ef) SHA1(0e46557665f1acef0606f22f043a391d1086cfce) ) + ROM_LOAD( "wbv_13.bin", 0x300000, 0x80000, CRC(7021107b) SHA1(088fe3060dbb196e8000a3b4db1cfa3cb0c4b677) ) + ROM_LOAD( "wbv_07.bin", 0x380000, 0x80000, CRC(4fff9fe8) SHA1(e29d3b4895692fd8559c9018432f32170aecdcc3) ) + ROM_LOAD( "wbv_14.bin", 0x400000, 0x80000, CRC(0595e675) SHA1(82aebaedc919fa51b71f5519ee765ce9953d613a) ) + ROM_LOAD( "wbv_08.bin", 0x480000, 0x80000, CRC(07e4b416) SHA1(a780ef0bd11897ab437359985f6e4852030ddbbf) ) + ROM_LOAD( "wbv_15.bin", 0x500000, 0x80000, CRC(4e1a82d2) SHA1(9e66b52ba8e8144f772183396fc1a2fbb37ed2bc) ) + ROM_LOAD( "wbv_09.bin", 0x580000, 0x20000, CRC(894ce354) SHA1(331aeabbe10cd645776da2dc0829acc2275e72dc) ) + /* 5a0000-5fffff is empty */ + + ROM_REGION( 0x100000, "user2", 0 ) /* OKIM6295 samples */ + ROM_LOAD( "wbv_01.bin", 0x00000, 0x100000, CRC(ac33f25f) SHA1(5d9ed16650aeb297d565376a99b31c88ab611668) ) + + /* $00000-$20000 stays the same in all sound banks, */ + /* the second half of the bank is what gets switched */ + ROM_REGION( 0x1c0000, "oki", 0 ) /* Samples */ + ROM_COPY( "user2", 0x000000, 0x000000, 0x020000) + ROM_COPY( "user2", 0x020000, 0x020000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x040000, 0x020000) + ROM_COPY( "user2", 0x040000, 0x060000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x080000, 0x020000) + ROM_COPY( "user2", 0x060000, 0x0a0000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x0c0000, 0x020000) + ROM_COPY( "user2", 0x080000, 0x0e0000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x100000, 0x020000) + ROM_COPY( "user2", 0x0a0000, 0x120000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x140000, 0x020000) + ROM_COPY( "user2", 0x0c0000, 0x160000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x180000, 0x020000) + ROM_COPY( "user2", 0x0e0000, 0x1a0000, 0x020000) +ROM_END + + + ROM_START( excelsr ) ROM_REGION( 0x300000, "maincpu", 0 ) /* 68000 code */ ROM_LOAD16_BYTE( "22.u301", 0x000001, 0x80000, CRC(f0aa1c1b) SHA1(5ed68181defe6cde6f4979508f0cfce9e9743912) ) @@ -1710,6 +1752,7 @@ GAME( 1995, bigtwinb, bigtwin, bigtwinb, bigtwinb, bigtwin, ROT0, "Playmark", "Big Twin (No Girls Conversion)", GAME_NO_COCKTAIL | GAME_SUPPORTS_SAVE ) GAME( 1995, wbeachvl, 0, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 1)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1995, wbeachvl2, wbeachvl, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 2)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1995, wbeachvl3, wbeachvl, wbeachvl, wbeachvl, 0, ROT0, "Playmark", "World Beach Volley (set 3)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1996, excelsr, 0, excelsr, excelsr, bigtwin, ROT0, "Playmark", "Excelsior", GAME_SUPPORTS_SAVE ) GAME( 1995, hotmind, 0, hotmind, hotmind, bigtwin, ROT0, "Playmark", "Hot Mind", GAME_SUPPORTS_SAVE ) GAME( 1994, hrdtimes, 0, hrdtimes, hrdtimes, 0, ROT0, "Playmark", "Hard Times (set 1)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/pluto5.c mame-0.145/src/mame/drivers/pluto5.c --- mame-0.144/src/mame/drivers/pluto5.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pluto5.c 2012-02-06 21:30:33.000000000 +0000 @@ -25,6 +25,152 @@ they have the sound integrated, and the sound hw is just DAC style + --------------------------------------------------------------------- + + Pluto 5 Technical Notes.... + + + * Clocks... + + - Main Clock, EXTAL for MC68340 Processor @32.768kHz. + - MC68340 Serial Module @3.6864MHz. + - OKI MSM6585 devices, U8/39 @640KHz. + + + * EPROMs... + + The 2 EPROM positions, U1 and U2, are configured such that 4 possible configurations + of programme memory are possible (assuming no external memory expansion via P15): + + Possible EPROM Configurations... + + U1 | U2 | Mode | Configuration | Total Size | Addresses Scrambled + --------+--------+--------+---------------+------------+--------------------- + 27C040 | omit | 8 bit | 512k*8 | 512Kbyte | no + --------+--------+--------+---------------+------------+--------------------- + 27C040 | 27C040 | 16 bit | 512K*16 | 1Mbyte | yes + --------+--------+--------+---------------+------------+--------------------- + 27C801 | omit | 8 bit | 1024k*8 | 1Mbyte | no + --------+--------+--------+---------------+------------+--------------------- + 27C801 | 27C801 | 16 bit | 1024k*16 | 2Mbyte | yes + --------+--------+--------+---------------+------------+--------------------- + + + EPROM Address Line Scrambling in 16 Bit Mode + 2*27C040 EPROMs + + In 16 bit mode, running with 2 * 27C040 EPROMs, the scrambling of the address lines cause the + following effect on the memory mapping in the EPROMs. Note that this table applies to the re- + mapping that occurs to the EPROM contents, rather than the actual address lines. + + + Re-Mapping of Address Lines in 2*27C040 Mode: + + 68340 Address Bus | EPROM Address + ------------------+--------------------------- + A0 | (not used in 16 bit mode) + ------------------+--------------------------- + A1-A18 | A2-A19 + ------------------+--------------------------- + A19 | A1 + ------------------+--------------------------- + + + Re-Mapping of EPROM Contents in 2*27C040 Mode: + + 68340 Access Address | Will Read From This Location in EPROM + ---------------------+--------------------------------------- + 0000 0000 | 0000 0000 + ---------------------+--------------------------------------- + 0000 0002 | 0000 0004 + ---------------------+--------------------------------------- + 0000 0004 | 0000 0008 + ---------------------+--------------------------------------- + 0000 0006 | 0000 000C + ---------------------+--------------------------------------- + 0000 0008 | 0000 0010 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 0007 FFFC | 000F FFF8 + ---------------------+--------------------------------------- + 0007 FFFE | 000F FFFC + ---------------------+--------------------------------------- + 0008 0000 | 0000 0002 + ---------------------+--------------------------------------- + 0008 0002 | 0000 0006 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 000F FFFC | 000F FFFA + ---------------------+--------------------------------------- + 000F FFFE | 000F FFFE + ---------------------+--------------------------------------- + + + 2*27C801 EPROMs + + In 16 bit mode, running with 2 * 27C801 EPROMs, the scrambling of the address lines cause the + following effect on the memory mapping in the EPROMs. Note that this table applies to the re- + mapping that occurs to the EPROM contents, rather than the actual address lines. + + Re-Mapping of Address Lines in 2*27C801 Mode: + + 68340 Address Bus | EPROM Address + ------------------+--------------------------- + A0 | (not used in 16 bit mode) + ------------------+--------------------------- + A1-A18 | A2-A19 + ------------------+--------------------------- + A19 | A1 + ------------------+--------------------------- + A20 | A20 + ------------------+--------------------------- + + + Re-Mapping of EPROM Contents in 2*27C801 Mode: + + 68340 Access Address | Will Read From This Location in EPROM + ---------------------+--------------------------------------- + 0000 0000 | 0000 0000 + ---------------------+--------------------------------------- + 0000 0002 | 0000 0004 + ---------------------+--------------------------------------- + 0000 0004 | 0000 0008 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 0007 FFFC | 000F FFF8 + ---------------------+--------------------------------------- + 0007 FFFE | 000F FFFC + ---------------------+--------------------------------------- + 0008 0000 | 0000 0002 + ---------------------+--------------------------------------- + 0008 0002 | 0000 0006 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 000F FFFC | 000F FFFA + ---------------------+--------------------------------------- + 000F FFFE | 000F FFFA + ---------------------+--------------------------------------- + 0010 0000 | 0010 0000 + ---------------------+--------------------------------------- + 0010 0002 | 0010 0004 + ---------------------+--------------------------------------- + 0010 0004 | 0010 0008 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 0017 FFFC | 001F FFF8 + ---------------------+--------------------------------------- + 0017 FFFE | 001F FFFC + ---------------------+--------------------------------------- + 0018 0000 | 0010 0002 + ---------------------+--------------------------------------- + 0018 0002 | 0010 0006 + ---------------------+--------------------------------------- + ---------------------+--------------------------------------- + 001F FFFC | 001F FFFA + ---------------------+--------------------------------------- + 001F FFFE | 001F FFFA + ---------------------+--------------------------------------- + */ #include "emu.h" @@ -372,23 +518,23 @@ } -GAME( 200?, hb_cr ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Raker (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_bar7 ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Bar Seven (Fairgames)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_bigx ,0, pluto5, pluto5, hb, ROT0, "Jpm","Big X (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_ccow ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Cow (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_cashc ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Crusade (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_cashx ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Cash X (Fairgames)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_cwf ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Cherry Win Falls (Fairgames)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_dac ,0, pluto5, pluto5, hb, ROT0, "Qps","Dough & Arrow Club (Qps, set 1)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_daca ,hb_dac, pluto5, pluto5, hb, ROT0, "Qps","Dough & Arrow Club (Qps, set 2)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_frtcl ,0, pluto5, pluto5, hb, ROT0, "Qps","Fruitopia Club (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_gpal ,0, pluto5, pluto5, hb, ROT0, "Qps","Golden Palace (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_gldpl ,0, pluto5, pluto5, hb, ROT0, "Qps / Mazooma","Golden Palace (Qps / Mazooma)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) // rebuild? -GAME( 200?, hb_gldwn ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Golden Winner (Fairgames)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_jailb ,0, pluto5, pluto5, hb, ROT0, "Qps","Jail Break (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_jkrwl ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Jokers Wild (Fairgames)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_mrmon ,0, pluto5, pluto5, hb, ROT0, "Qps","Mr Money (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_rhv ,0, pluto5, pluto5, hb, ROT0, "Qps","Red Hot Voucher (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_ringb ,0, pluto5, pluto5, hb, ROT0, "Jpm","Ring A Bell (Jpm)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_rckrl ,0, pluto5, pluto5, hb, ROT0, "Qps","Rock 'n' Roll (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 200?, hb_ydd ,0, pluto5, pluto5, hb, ROT0, "Qps","Yabba Dabba Dough (Qps)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 200?, hb_cr ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Raker (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_bar7 ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Bar Seven (Fairgames)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_bigx ,0, pluto5, pluto5, hb, ROT0, "Jpm","Big X (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_ccow ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Cow (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_cashc ,0, pluto5, pluto5, hb, ROT0, "Qps","Cash Crusade (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_cashx ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Cash X (Fairgames)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_cwf ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Cherry Win Falls (Fairgames)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_dac ,0, pluto5, pluto5, hb, ROT0, "Qps","Dough & Arrow Club (Qps, set 1)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_daca ,hb_dac, pluto5, pluto5, hb, ROT0, "Qps","Dough & Arrow Club (Qps, set 2)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_frtcl ,0, pluto5, pluto5, hb, ROT0, "Qps","Fruitopia Club (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_gpal ,0, pluto5, pluto5, hb, ROT0, "Qps","Golden Palace (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_gldpl ,0, pluto5, pluto5, hb, ROT0, "Qps / Mazooma","Golden Palace (Qps / Mazooma)", GAME_IS_SKELETON_MECHANICAL ) // rebuild? +GAME( 200?, hb_gldwn ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Golden Winner (Fairgames)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_jailb ,0, pluto5, pluto5, hb, ROT0, "Qps","Jail Break (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_jkrwl ,0, pluto5, pluto5, hb, ROT0, "Fairgames","Jokers Wild (Fairgames)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_mrmon ,0, pluto5, pluto5, hb, ROT0, "Qps","Mr Money (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_rhv ,0, pluto5, pluto5, hb, ROT0, "Qps","Red Hot Voucher (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_ringb ,0, pluto5, pluto5, hb, ROT0, "Jpm","Ring A Bell (Jpm)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_rckrl ,0, pluto5, pluto5, hb, ROT0, "Qps","Rock 'n' Roll (Qps)", GAME_IS_SKELETON_MECHANICAL ) +GAME( 200?, hb_ydd ,0, pluto5, pluto5, hb, ROT0, "Qps","Yabba Dabba Dough (Qps)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/plygonet.c mame-0.145/src/mame/drivers/plygonet.c --- mame-0.144/src/mame/drivers/plygonet.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/plygonet.c 2012-02-06 21:30:42.000000000 +0000 @@ -658,10 +658,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(64, 64+368-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(polygonet) + MCFG_SCREEN_UPDATE_STATIC(polygonet) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/pntnpuzl.c mame-0.145/src/mame/drivers/pntnpuzl.c --- mame-0.144/src/mame/drivers/pntnpuzl.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pntnpuzl.c 2012-02-06 21:30:34.000000000 +0000 @@ -123,25 +123,25 @@ #include "emu.h" #include "cpu/m68000/m68000.h" #include "machine/eeprom.h" +#include "video/pc_vga.h" class pntnpuzl_state : public driver_device { public: pntnpuzl_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 m_eeprom; - UINT16* m_3a0000ram; - UINT16* m_bank; - int m_indx; - int m_sub; - int m_rgb[3]; UINT16 m_pntpzl_200000; UINT16 m_serial; UINT16 m_serial_out; UINT16 m_read_count; int m_touchscr[5]; + + required_device m_maincpu; }; @@ -182,131 +182,6 @@ - -/* vid */ -static VIDEO_START( pntnpuzl ) -{ - pntnpuzl_state *state = machine.driver_data(); - state->m_3a0000ram=auto_alloc_array(machine, UINT16, 0x100000/2); -} - -static SCREEN_UPDATE( pntnpuzl ) -{ - pntnpuzl_state *state = screen->machine().driver_data(); - int x,y; - int count; -#if 0 - static int xxx=0x18f; - static int yyy=512; - static int sss=0xa8; - - if ( screen->machine().input().code_pressed_once(KEYCODE_Q) ) - { - xxx--; - mame_printf_debug("xxx %04x\n",xxx); - } - - if ( screen->machine().input().code_pressed_once(KEYCODE_W) ) - { - xxx++; - mame_printf_debug("xxx %04x\n",xxx); - } - - if ( screen->machine().input().code_pressed_once(KEYCODE_A) ) - { - yyy--; - mame_printf_debug("yyy %04x\n",yyy); - } - - if ( screen->machine().input().code_pressed_once(KEYCODE_S) ) - { - yyy++; - mame_printf_debug("yyy %04x\n",yyy); - } - - if ( screen->machine().input().code_pressed_once(KEYCODE_Z) ) - { - sss--; - mame_printf_debug("sss %04x\n",sss); - } - - if ( screen->machine().input().code_pressed_once(KEYCODE_X) ) - { - sss++; - mame_printf_debug("sss %04x\n",sss); - } -#else - const int xxx=0x18f; - const int yyy=512; - const int sss=0xa8; -#endif - - - count=sss; - - for(y=0;ym_3a0000ram[count]&0x1f00)>>8; - *BITMAP_ADDR16(bitmap, y, x+1) = (state->m_3a0000ram[count]&0x001f)>>0; - count++; - } - } - return 0; -} - -static WRITE16_HANDLER( pntnpuzl_palette_w ) -{ - pntnpuzl_state *state = space->machine().driver_data(); - - if (ACCESSING_BITS_8_15) - { - state->m_indx = data >> 8; - state->m_sub = 0; - } - if (ACCESSING_BITS_0_7) - { - state->m_rgb[state->m_sub++] = data & 0xff; - if (state->m_sub == 3) - { - palette_set_color_rgb(space->machine(),state->m_indx++,pal6bit(state->m_rgb[0]),pal6bit(state->m_rgb[1]),pal6bit(state->m_rgb[2])); - state->m_sub = 0; - if (state->m_indx == 256) state->m_indx = 0; - } - } -} - - - -#ifdef UNUSED_FUNCTION -READ16_HANDLER ( pntnpuzl_random_r ) -{ - return space->machine().rand(); -} -#endif - -static READ16_HANDLER( pntnpuzl_vid_r ) -{ - pntnpuzl_state *state = space->machine().driver_data(); -// logerror("read_videoram: pc = %06x : offset %04x reg %04x\n",cpu_get_pc(&space->device()),offset*2, state->m_bank[0]); - return state->m_3a0000ram[offset+ (state->m_bank[0]&0x0001)*0x8000 ]; -} - -static WRITE16_HANDLER( pntnpuzl_vid_w ) -{ - pntnpuzl_state *state = space->machine().driver_data(); -// logerror("write_to_videoram: pc = %06x : offset %04x data %04x reg %04x\n",cpu_get_pc(&space->device()),offset*2, data, state->m_bank[0]); - COMBINE_DATA(&state->m_3a0000ram[offset+ (state->m_bank[0]&0x0001)*0x8000 ]); -} - -static READ16_HANDLER( pntnpuzl_vblank_r ) -{ - return (input_port_read(space->machine(), "IN0") & 1) << 11; -} - - - /* reading works this way: 280016 = 00 @@ -389,13 +264,33 @@ return 0x4c00; } +static READ16_HANDLER( irq1_ack_r ) +{ +// pntnpuzl_state *state = space->machine().driver_data(); +// device_set_input_line(state->m_maincpu, 1, CLEAR_LINE); + return 0; +} + +static READ16_HANDLER( irq2_ack_r ) +{ +// pntnpuzl_state *state = space->machine().driver_data(); +// device_set_input_line(state->m_maincpu, 2, CLEAR_LINE); + return 0; +} + +static READ16_HANDLER( irq4_ack_r ) +{ +// pntnpuzl_state *state = space->machine().driver_data(); +// device_set_input_line(state->m_maincpu, 4, CLEAR_LINE); + return 0; +} static ADDRESS_MAP_START( pntnpuzl_map, AS_PROGRAM, 16 ) AM_RANGE(0x000000, 0x07ffff) AM_ROM - AM_RANGE(0x080000, 0x080001) AM_READNOP //| - AM_RANGE(0x100000, 0x100001) AM_READNOP //| irq lines clear - AM_RANGE(0x180000, 0x180001) AM_READNOP //| + AM_RANGE(0x080000, 0x080001) AM_READ(irq1_ack_r) + AM_RANGE(0x100000, 0x100001) AM_READ(irq2_ack_r) + AM_RANGE(0x180000, 0x180001) AM_READ(irq4_ack_r) AM_RANGE(0x200000, 0x200001) AM_WRITE(pntnpuzl_200000_w) AM_RANGE(0x280000, 0x280001) AM_DEVREAD("eeprom", pntnpuzl_eeprom_r) AM_RANGE(0x280002, 0x280003) AM_READ_PORT("IN2") @@ -411,31 +306,28 @@ AM_RANGE(0x28001a, 0x28001b) AM_WRITENOP /* standard VGA */ - AM_RANGE(0x3a0000, 0x3affff) AM_READWRITE(pntnpuzl_vid_r, pntnpuzl_vid_w) - AM_RANGE(0x3c03c4, 0x3c03c5) AM_RAM AM_BASE_MEMBER(pntnpuzl_state, m_bank)//?? - AM_RANGE(0x3c03c8, 0x3c03c9) AM_WRITE(pntnpuzl_palette_w) - AM_RANGE(0x3c03da, 0x3c03db) AM_READ(pntnpuzl_vblank_r) + AM_RANGE(0x3a0000, 0x3bffff) AM_RAM // RAM +// AM_RANGE(0x3c0000, 0x3c0fff) AM_RAM // regs AM_RANGE(0x400000, 0x407fff) AM_RAM ADDRESS_MAP_END -static INTERRUPT_GEN( pntnpuzl_irq ) +static INPUT_CHANGED( coin_inserted ) { - if (input_port_read(device->machine(), "IN0") & 0x02) /* coin */ - generic_pulse_irq_line(device, 1); - else if (input_port_read(device->machine(), "IN0") & 0x04) /* service */ - generic_pulse_irq_line(device, 2); - else if (input_port_read(device->machine(), "IN0") & 0x08) /* coin */ - generic_pulse_irq_line(device, 4); + pntnpuzl_state *state = field.machine().driver_data(); + + /* TODO: change this! */ + if(newval) + generic_pulse_irq_line(state->m_maincpu, (UINT8)(FPTR)param); } static INPUT_PORTS_START( pntnpuzl ) PORT_START("IN0") /* fake inputs */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_HIGH ) PORT_IMPULSE(1) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_CHANGED(coin_inserted, 1) PORT_IMPULSE(1) + PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_HIGH )PORT_CHANGED(coin_inserted, 2) PORT_IMPULSE(1) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_CHANGED(coin_inserted, 4) PORT_IMPULSE(1) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) /* game uses a touch screen */ @@ -460,33 +352,26 @@ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) INPUT_PORTS_END - +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color static MACHINE_CONFIG_START( pntnpuzl, pntnpuzl_state ) MCFG_CPU_ADD("maincpu", M68000, 12000000)//?? MCFG_CPU_PROGRAM_MAP(pntnpuzl_map) - MCFG_CPU_VBLANK_INT("screen", pntnpuzl_irq) // irq1 = coin irq2 = service irq4 = coin MCFG_EEPROM_ADD("eeprom", eeprom_intf) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(64*8, 64*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 50*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(pntnpuzl) - - MCFG_PALETTE_LENGTH(256) - - MCFG_VIDEO_START(pntnpuzl) + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END ROM_START( pntnpuzl ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "pntnpuzl.u2", 0x00001, 0x40000, CRC(dfda3f73) SHA1(cca8ccdd501a26cba07365b1238d7b434559bbc6) ) ROM_LOAD16_BYTE( "pntnpuzl.u3", 0x00000, 0x40000, CRC(4173f250) SHA1(516fe6f91b925f71c36b97532608b82e63bda436) ) + + /* for reference, probably not used in any way by the game */ + ROM_REGION( 0x10000, "video_bios", 0 ) + ROM_LOAD( "trident_quadtel_tvga9000_isa16.bin", 0x0000, 0x10000, BAD_DUMP CRC(ad0e7351) SHA1(eb525460a80e1c1baa34642b93d54caf2607920d) ) ROM_END @@ -495,6 +380,9 @@ // UINT16 *rom = (UINT16 *)machine.region("maincpu")->base(); // rom[0x2696/2] = 0x4e71; // rom[0x26a0/2] = 0x4e71; + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0x3a0000, machine.device("maincpu")->memory().space(AS_PROGRAM), 0x3c0000); + } GAME( 199?, pntnpuzl, 0, pntnpuzl, pntnpuzl, pip, ROT90, "Century?", "Paint & Puzzle",GAME_NO_SOUND|GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/pokechmp.c mame-0.145/src/mame/drivers/pokechmp.c --- mame-0.144/src/mame/drivers/pokechmp.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/pokechmp.c 2012-02-06 21:30:40.000000000 +0000 @@ -237,10 +237,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pokechmp) + MCFG_SCREEN_UPDATE_STATIC(pokechmp) MCFG_GFXDECODE(pokechmp) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/poker72.c mame-0.145/src/mame/drivers/poker72.c --- mame-0.144/src/mame/drivers/poker72.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/poker72.c 2012-02-06 21:30:35.000000000 +0000 @@ -31,9 +31,9 @@ { } -static SCREEN_UPDATE(poker72) +static SCREEN_UPDATE_IND16(poker72) { - poker72_state *state = screen->machine().driver_data(); + poker72_state *state = screen.machine().driver_data(); int x,y,count; count = 0; @@ -49,7 +49,7 @@ tile|= state->m_tile_bank << 12; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,color,fx,fy,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,color,fx,fy,x*8,y*8); count+=2; } @@ -355,10 +355,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(poker72) + MCFG_SCREEN_UPDATE_STATIC(poker72) MCFG_GFXDECODE(poker72) MCFG_PALETTE_LENGTH(0xe00) diff -Nru mame-0.144/src/mame/drivers/polepos.c mame-0.145/src/mame/drivers/polepos.c --- mame-0.144/src/mame/drivers/polepos.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/polepos.c 2012-02-06 21:30:37.000000000 +0000 @@ -219,7 +219,6 @@ #include "cpu/z80/z80.h" #include "cpu/z8000/z8000.h" #include "cpu/mb88xx/mb88xx.h" -#include "deprecat.h" #include "machine/namco06.h" #include "machine/namco51.h" #include "machine/namco53.h" @@ -294,13 +293,13 @@ switch (offset) { case 0x00: /* IRQON */ - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; case 0x01: /* IOSEL */ -//polepos_mcu_enable_w(offset,data); +// polepos_mcu_enable_w(offset,data); break; case 0x02: /* CLSON */ @@ -336,9 +335,10 @@ static WRITE16_HANDLER( polepos_z8002_nvi_enable_w ) { + polepos_state *state = space->machine().driver_data(); data &= 1; - cpu_interrupt_enable(&space->device(),data); + state->m_sub_irq_mask = data; if (!data) device_set_input_line(&space->device(), 0, CLEAR_LINE); } @@ -454,19 +454,16 @@ static TIMER_DEVICE_CALLBACK( polepos_scanline ) { + polepos_state *state = timer.machine().driver_data(); int scanline = param; - running_machine &machine = timer.machine(); - - // irq0_line_assert() checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line() - if ((scanline == 64) || (scanline == 192)) // 64V - irq0_line_assert(machine.device("maincpu")); + if (((scanline == 64) || (scanline == 192)) && state->m_main_irq_mask) // 64V + cputag_set_input_line(timer.machine(), "maincpu", 0, ASSERT_LINE); - if (scanline == 240) // VBLANK + if (scanline == 240 && state->m_sub_irq_mask) // VBLANK { - irq0_line_assert(machine.device("sub")); - irq0_line_assert(machine.device("sub2")); + cputag_set_input_line(timer.machine(), "sub", 0, ASSERT_LINE); + cputag_set_input_line(timer.machine(), "sub2", 0, ASSERT_LINE); } } @@ -908,9 +905,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 384, 0, 256, 264, 16, 224+16) - MCFG_SCREEN_UPDATE(polepos) + MCFG_SCREEN_UPDATE_STATIC(polepos) MCFG_GFXDECODE(polepos) MCFG_PALETTE_LENGTH(0x0f00) @@ -984,9 +980,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 384, 0, 256, 264, 16, 224+16) - MCFG_SCREEN_UPDATE(polepos) + MCFG_SCREEN_UPDATE_STATIC(polepos) MCFG_GFXDECODE(polepos) MCFG_PALETTE_LENGTH(0x0f00) diff -Nru mame-0.144/src/mame/drivers/policetr.c mame-0.145/src/mame/drivers/policetr.c --- mame-0.144/src/mame/drivers/policetr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/policetr.c 2012-02-06 21:30:42.000000000 +0000 @@ -429,10 +429,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(400, 262) /* needs to be verified */ MCFG_SCREEN_VISIBLE_AREA(0, 393, 0, 239) - MCFG_SCREEN_UPDATE(policetr) + MCFG_SCREEN_UPDATE_STATIC(policetr) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/polyplay.c mame-0.145/src/mame/drivers/polyplay.c --- mame-0.144/src/mame/drivers/polyplay.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/polyplay.c 2012-02-06 21:30:37.000000000 +0000 @@ -287,10 +287,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(polyplay) + MCFG_SCREEN_UPDATE_STATIC(polyplay) MCFG_GFXDECODE(polyplay) MCFG_PALETTE_LENGTH(10) diff -Nru mame-0.144/src/mame/drivers/poo.c mame-0.145/src/mame/drivers/poo.c --- mame-0.144/src/mame/drivers/poo.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/poo.c 2012-02-06 21:30:35.000000000 +0000 @@ -63,12 +63,12 @@ { } -static SCREEN_UPDATE(unclepoo) +static SCREEN_UPDATE_IND16(unclepoo) { - poo_state *state = screen->machine().driver_data(); + poo_state *state = screen.machine().driver_data(); int y,x; int count; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; count = 0; @@ -339,10 +339,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-1) - MCFG_SCREEN_UPDATE(unclepoo) + MCFG_SCREEN_UPDATE_STATIC(unclepoo) MCFG_GFXDECODE(unclepoo) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/poolshrk.c mame-0.145/src/mame/drivers/poolshrk.c --- mame-0.144/src/mame/drivers/poolshrk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/poolshrk.c 2012-02-06 21:30:36.000000000 +0000 @@ -223,10 +223,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(1, 255, 24, 255) - MCFG_SCREEN_UPDATE(poolshrk) + MCFG_SCREEN_UPDATE_STATIC(poolshrk) MCFG_GFXDECODE(poolshrk) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/pooyan.c mame-0.145/src/mame/drivers/pooyan.c --- mame-0.144/src/mame/drivers/pooyan.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pooyan.c 2012-02-06 21:30:37.000000000 +0000 @@ -101,22 +101,22 @@ PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW0") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid" ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* Invalid = both coin slots disabled */ PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) - PORT_DIPSETTING( 0x00, "256" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, "255 (Cheat)" ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "50K 80K+" ) PORT_DIPSETTING( 0x00, "30K 70K+" ) - PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") PORT_DIPSETTING( 0x70, "1 (Easy)" ) PORT_DIPSETTING( 0x60, "2" ) PORT_DIPSETTING( 0x50, "3" ) @@ -125,7 +125,7 @@ PORT_DIPSETTING( 0x20, "6" ) PORT_DIPSETTING( 0x10, "7" ) PORT_DIPSETTING( 0x00, "8 (Hard)" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -204,10 +204,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pooyan) + MCFG_SCREEN_UPDATE_STATIC(pooyan) MCFG_GFXDECODE(pooyan) MCFG_PALETTE_LENGTH(16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/popeye.c mame-0.145/src/mame/drivers/popeye.c --- mame-0.144/src/mame/drivers/popeye.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/popeye.c 2012-02-06 21:30:37.000000000 +0000 @@ -438,10 +438,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 2*16, 30*16-1) - MCFG_SCREEN_UPDATE(popeye) + MCFG_SCREEN_UPDATE_STATIC(popeye) MCFG_GFXDECODE(popeye) MCFG_PALETTE_LENGTH(16+16*2+64*4) diff -Nru mame-0.144/src/mame/drivers/popobear.c mame-0.145/src/mame/drivers/popobear.c --- mame-0.144/src/mame/drivers/popobear.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/popobear.c 2012-02-06 21:30:35.000000000 +0000 @@ -0,0 +1,365 @@ +/* Popo Bear - BMC-A00211 +(c) 2000 - Bao Ma Technology Co., LTD + +|-----------------------------------------| +| DIP2 DIP4 UM3567(YM2413) |J +| DIP1 DIP3 |A +| TA-A-901 |M +| EN-A-701 EN-A-801 U6295(OKI) |M +| EN-A-501 EN-A-601 |A +| EN-A-301 EN-A-401 | +| |C +| AIA90610 |O +| BMC-68pin AIA90423 |N +| plcc (68k) BMC-160pin |N +| |E +| OSC |C +| 42.000 |T +|-----------------------------------------| + +1 - BMC AIA90423 - 160-Pin ASIC, FGPA, Video? +1 - BMC AIA90610 - 68 Pin CPU (Likely 16 MHz, 68-lead plastic LCC 68000) +1 - UM3567 (YM2413) Sound +1 - U6295 (OKI6295) Sound +1 - 42.000MHz XTAL +4 - 8 Position DIP switches + +JAMMA CONNECTOR +Component Side A B Solder Side + GND 1 1 GND + GND 2 2 GND + +5v 3 3 +5v + +5v 4 4 +5v + 5 5 + +12v 6 6 +12v + 7 7 + Coin Meter 8 8 + 9 9 + Speaker 10 10 GND + 11 11 + Red 12 12 Green + Blue 13 13 Syn + GND 14 14 + Test 15 15 + Coin1 16 16 Coin2 + 1P Start 17 17 2P Start + 1P Up 18 18 2P Up + 1P Down 19 19 2P Down + 1P Left 20 20 2P Left + 1P Right 21 21 2P Right + 1P A 22 22 2P A + 1P B 23 23 2P B + 1P C 24 24 2P C + 25 25 + 26 26 + GND 27 27 GND + GND 28 28 GND +*/ + +// looks like some kind of blitter +// IGS-like? + +#include "emu.h" +#include "cpu/m68000/m68000.h" +#include "sound/okim6295.h" +#include "sound/2413intf.h" + +class popobear_state : public driver_device +{ +public: + popobear_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } + + + UINT16 *popobear_vram; + required_device m_maincpu; +}; + +/* stub read handlers */ + +static READ16_HANDLER( popo_480001_r ) { static int i = 0x00;i ^=0xff;return i;} +static READ16_HANDLER( popo_48001c_r ) { static int i = 0x00;i ^=0xff;return i;} +static READ16_HANDLER( popo_480020_r ) { static int i = 0x00;i ^=0xff;return i;} +static READ16_HANDLER( popo_48003a_r ) { static int i = 0x00;i ^=0xff;return i;} + +static READ16_HANDLER( popo_500000_r ) { static int i = 0x00;i ^=0xff;return i;} +static READ16_HANDLER( popo_520000_r ) { static int i = 0x00;i ^=0xff;return i;} + +static READ16_HANDLER( popo_620000_r ) { static int i = 0x00;i ^=0xff;return i;} + +/* stub write handlers */ + +static WRITE16_HANDLER( popo_480001_w ) { } +static WRITE16_HANDLER( popo_480018_w ) { } +static WRITE16_HANDLER( popo_48001a_w ) { } +static WRITE16_HANDLER( popo_48001c_w ) { } +static WRITE16_HANDLER( popo_480020_w ) { } +static WRITE16_HANDLER( popo_480028_w ) { } +static WRITE16_HANDLER( popo_48002c_w ) { } +static WRITE16_HANDLER( popo_480030_w ) { } +static WRITE16_HANDLER( popo_48003a_w ) { } + +static WRITE16_HANDLER( popo_550000_w ) { } +static WRITE16_HANDLER( popo_550002_w ) { } + +static WRITE16_HANDLER( popo_600000_w ) { } +static WRITE16_HANDLER( popo_620000_w ) { } + + +static ADDRESS_MAP_START( popobear_mem, AS_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x03ffff) AM_ROM + AM_RANGE(0x210000, 0x21ffff) AM_RAM + AM_RANGE(0x3E0000, 0x3EFFFF) AM_RAM AM_BASE_MEMBER(popobear_state, popobear_vram) + + /* Blitter stuff? */ + AM_RANGE(0x480000, 0x480001) AM_READ(popo_480001_r) AM_WRITE(popo_480001_w) + AM_RANGE(0x480018, 0x480019) AM_WRITE(popo_480018_w) + AM_RANGE(0x48001a, 0x48001b) AM_WRITE(popo_48001a_w) + AM_RANGE(0x48001c, 0x48001d) AM_READ(popo_48001c_r) AM_WRITE(popo_48001c_w) + AM_RANGE(0x480020, 0x480021) AM_READ(popo_480020_r) AM_WRITE(popo_480020_w) + AM_RANGE(0x480028, 0x480029) AM_WRITE(popo_480028_w) + AM_RANGE(0x48002c, 0x48002d) AM_WRITE(popo_48002c_w) + AM_RANGE(0x480030, 0x480031) AM_WRITE(popo_480030_w) + AM_RANGE(0x48003a, 0x48003b) AM_READ(popo_48003a_r) AM_WRITE(popo_48003a_w) + + AM_RANGE(0x480400, 0x48041f) AM_RAM AM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) // looks palette like at least + + /* I/O maybe? */ + AM_RANGE(0x500000, 0x500001) AM_READ(popo_500000_r) + AM_RANGE(0x520000, 0x520001) AM_READ(popo_520000_r) + AM_RANGE(0x550000, 0x550001) AM_WRITE(popo_550000_w) + AM_RANGE(0x550002, 0x550003) AM_WRITE(popo_550002_w) + + /* these could be where the OKI hooks up? */ + AM_RANGE(0x600000, 0x600001) AM_WRITE(popo_600000_w) + AM_RANGE(0x620000, 0x620001) AM_READ(popo_620000_r) AM_WRITE(popo_620000_w) +ADDRESS_MAP_END + +static INPUT_PORTS_START( popobear ) + + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x0e, 0x00, "Coin_A" ) + PORT_DIPSETTING( 0x0c, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x0e, "Freeplay" ) + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x10, "2" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x20, "4" ) + PORT_DIPSETTING( 0x30, "5" ) + PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Very_Easy ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( Hard ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x00, "Arrow" ) + PORT_DIPSETTING( 0x01, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW2:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW2:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW2:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW2:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW2:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW2:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW2:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW3") + PORT_DIPNAME( 0x01, 0x00, "DSW3:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW3:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW3:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW3:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW3:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW3:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW3:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW3:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW4") + PORT_DIPNAME( 0x01, 0x00, "DSW4:1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, "DSW4:2" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "DSW4:3" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "DSW4:4" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "DSW4:5" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, "DSW4:6" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, "DSW4:7" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, "DSW4:8" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + +INPUT_PORTS_END + + +static const gfx_layout tilelayout = +{ + 4,8, + RGN_FRAC(1,1), + 8, + { 0,1,2,3,4,5,6,7 }, + { 24, 16, 8, 0 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 8*32 +}; + +// gfx don't seem to be tiles.. +static GFXDECODE_START( popobear ) + GFXDECODE_ENTRY( "gfx1", 0, tilelayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 1 ) +GFXDECODE_END + + +SCREEN_UPDATE_IND16( popobear ) +{ + popobear_state *state = screen.machine().driver_data(); + bitmap.fill(0, cliprect); + + UINT16* popobear_vram = state->popobear_vram; + int count = 0; + for (int y=0;y<256;y++) + { + for (int x=0;x<128;x++) + { + UINT8 dat; + dat = (popobear_vram[count]&0xf000)>>12; + bitmap.pix16(y, (x*4)+0) =dat; + + dat = (popobear_vram[count]&0x0f00)>>8; + bitmap.pix16(y, (x*4)+1) =dat; + + dat = (popobear_vram[count]&0x00f0)>>4; + bitmap.pix16(y, (x*4)+2) =dat; + + dat = (popobear_vram[count]&0x000f)>>0; + bitmap.pix16(y, (x*4)+3) =dat; + + count++; + } + } + + return 0; +} + +VIDEO_START(popobear) +{ + +} + +static TIMER_DEVICE_CALLBACK( popobear_irq ) +{ + popobear_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + + if(scanline == 128) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + + if(scanline == 32) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); +} + +static MACHINE_CONFIG_START( popobear, popobear_state ) + MCFG_CPU_ADD("maincpu", M68000, XTAL_42MHz/4) // XTAL CORRECT, DIVISOR GUESSED + MCFG_CPU_PROGRAM_MAP(popobear_mem) + // levels 2,3,5 look interesting + //MCFG_CPU_VBLANK_INT("screen",irq3_line_hold) + MCFG_TIMER_ADD_SCANLINE("scantimer", popobear_irq, "screen", 0, 1) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_UPDATE_STATIC(popobear) + + MCFG_GFXDECODE(popobear) + + MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) + MCFG_PALETTE_LENGTH(256) + + MCFG_VIDEO_START(popobear) + + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + + MCFG_SOUND_ADD("ym2413", YM2413, XTAL_42MHz/10) // XTAL CORRECT, DIVISOR GUESSED + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00) + + MCFG_OKIM6295_ADD("oki", XTAL_42MHz/10/4, OKIM6295_PIN7_LOW) // XTAL CORRECT, DIVISOR GUESSED + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50) +MACHINE_CONFIG_END + + +ROM_START( popobear ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "popobear_en-a-301_1.6.u3", 0x000001, 0x20000, CRC(b934adf6) SHA1(93431c7a19af812b549aad35cc1176a81805ffab) ) + ROM_LOAD16_BYTE( "popobear_en-a-401_1.6.u4", 0x000000, 0x20000, CRC(0568af9c) SHA1(920531dbc4bbde2d1db062bd5c48b97dd50b7185) ) + + ROM_REGION( 0x200000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "popobear_en-a-501.u5", 0x000000, 0x100000, CRC(185901a9) SHA1(7ff82b5751645df53435eaa66edce589684cc5c7) ) + ROM_LOAD16_BYTE( "popobear_en-a-601.u6", 0x000001, 0x100000, CRC(84fa9f3f) SHA1(34dd7873f88b0dae5fb81fe84e82d2b6b49f7332) ) + + ROM_REGION( 0x200000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "popobear_en-a-701.u7", 0x000000, 0x100000, CRC(45eba6d0) SHA1(0278602ed57ac45040619d590e6cc85e2cfeed31) ) + ROM_LOAD16_BYTE( "popobear_en-a-801.u8", 0x000001, 0x100000, CRC(2760f2e6) SHA1(58af59f486c9df930f7c124f89154f8f389a5bd7) ) + + ROM_REGION( 0x040000, "oki", 0 ) /* Samples */ + ROM_LOAD( "popobear_ta-a-901.u9", 0x00000, 0x40000, CRC(f1e94926) SHA1(f4d6f5b5811d90d0069f6efbb44d725ff0d07e1c) ) +ROM_END + +GAME( 2000, popobear, 0, popobear, popobear, 0, ROT0, "BMC", "PoPo Bear", GAME_NOT_WORKING | GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/popper.c mame-0.145/src/mame/drivers/popper.c --- mame-0.144/src/mame/drivers/popper.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/popper.c 2012-02-06 21:30:37.000000000 +0000 @@ -145,6 +145,14 @@ return 0; } +static WRITE8_HANDLER( nmi_mask_w ) +{ + popper_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + + /************************************* * * Memory maps @@ -163,7 +171,7 @@ AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_BASE_SIZE_MEMBER(popper_state, m_spriteram, m_spriteram_size) AM_RANGE(0xd800, 0xdfff) AM_RAM AM_SHARE("share1") AM_RANGE(0xe000, 0xe007) AM_READ(popper_input_ports_r) - AM_RANGE(0xe000, 0xe000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xe000, 0xe000) AM_WRITE(nmi_mask_w) AM_RANGE(0xe001, 0xe001) AM_WRITE(popper_flipscreen_w) AM_RANGE(0xe002, 0xe002) AM_WRITE(popper_e002_w) //?? seems to be graphic related AM_RANGE(0xe003, 0xe003) AM_WRITE(popper_gfx_bank_w) @@ -324,12 +332,21 @@ state->m_gfx_bank = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + popper_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + static MACHINE_CONFIG_START( popper, popper_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,18432000/6) MCFG_CPU_PROGRAM_MAP(popper_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,18432000/12) MCFG_CPU_PROGRAM_MAP(popper_sound_map) @@ -344,10 +361,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(33*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 33*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(popper) + MCFG_SCREEN_UPDATE_STATIC(popper) MCFG_GFXDECODE(popper) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/portrait.c mame-0.145/src/mame/drivers/portrait.c --- mame-0.144/src/mame/drivers/portrait.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/portrait.c 2012-02-06 21:30:37.000000000 +0000 @@ -256,10 +256,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 54*8-1, 0*8, 40*8-1) - MCFG_SCREEN_UPDATE(portrait) + MCFG_SCREEN_UPDATE_STATIC(portrait) MCFG_GFXDECODE(portrait) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/powerbal.c mame-0.145/src/mame/drivers/powerbal.c --- mame-0.144/src/mame/drivers/powerbal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/powerbal.c 2012-02-06 21:30:35.000000000 +0000 @@ -50,7 +50,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( tile_banking_w ) @@ -60,7 +60,7 @@ if (((data >> 12) & 0x0f) != state->m_tilebank) { state->m_tilebank = (data >> 12) & 0x0f; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -388,7 +388,7 @@ SET_TILE_INFO(1, code, colr >> 12, 0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { playmark_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -425,15 +425,15 @@ state->m_xoffset = -20; - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_yoffset); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_yoffset); } -static SCREEN_UPDATE( powerbal ) +static SCREEN_UPDATE_IND16( powerbal ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -498,10 +498,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(61) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(128*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(powerbal) + MCFG_SCREEN_UPDATE_STATIC(powerbal) MCFG_GFXDECODE(powerbal) MCFG_PALETTE_LENGTH(512) @@ -532,10 +531,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(61) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(128*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(powerbal) + MCFG_SCREEN_UPDATE_STATIC(powerbal) MCFG_GFXDECODE(powerbal) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/powerins.c mame-0.145/src/mame/drivers/powerins.c --- mame-0.144/src/mame/drivers/powerins.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/powerins.c 2012-02-06 21:30:35.000000000 +0000 @@ -357,10 +357,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(powerins) + MCFG_SCREEN_UPDATE_STATIC(powerins) MCFG_GFXDECODE(powerins) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/ppmast93.c mame-0.145/src/mame/drivers/ppmast93.c --- mame-0.144/src/mame/drivers/ppmast93.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ppmast93.c 2012-02-06 21:30:35.000000000 +0000 @@ -155,14 +155,14 @@ { ppmast93_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } static WRITE8_HANDLER( ppmast93_bgram_w ) { ppmast93_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); } static WRITE8_HANDLER( ppmast93_port4_w ) @@ -346,14 +346,14 @@ state->m_bg_tilemap = tilemap_create(machine, get_ppmast93_bg_tile_info,tilemap_scan_rows,8,8,32, 32); state->m_fg_tilemap = tilemap_create(machine, get_ppmast93_fg_tile_info,tilemap_scan_rows,8,8,32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( ppmast93 ) +static SCREEN_UPDATE_IND16( ppmast93 ) { - ppmast93_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + ppmast93_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -373,10 +373,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(ppmast93) + MCFG_SCREEN_UPDATE_STATIC(ppmast93) MCFG_GFXDECODE(ppmast93) diff -Nru mame-0.144/src/mame/drivers/prehisle.c mame-0.145/src/mame/drivers/prehisle.c --- mame-0.144/src/mame/drivers/prehisle.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/prehisle.c 2012-02-06 21:30:38.000000000 +0000 @@ -218,10 +218,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(prehisle) + MCFG_SCREEN_UPDATE_STATIC(prehisle) MCFG_GFXDECODE(prehisle) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/proconn.c mame-0.145/src/mame/drivers/proconn.c --- mame-0.144/src/mame/drivers/proconn.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/proconn.c 2012-02-06 21:30:40.000000000 +0000 @@ -5,6 +5,8 @@ some sets might be misidentified. */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -12,18 +14,25 @@ { public: proconn_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( proconn_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( proconn_map, AS_PROGRAM, 8, proconn_state ) AM_RANGE(0x0000, 0xefff) AM_ROM AM_RANGE(0xf000, 0xffff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( proconn_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( proconn_portmap, AS_IO, 8, proconn_state ) ADDRESS_MAP_END @@ -32,17 +41,14 @@ static MACHINE_CONFIG_START( proconn, proconn_state ) - MCFG_CPU_ADD("maincpu", Z80, 4000000) /* ?? Mhz */ MCFG_CPU_PROGRAM_MAP(proconn_map) MCFG_CPU_IO_MAP(proconn_portmap) - MACHINE_CONFIG_END - ROM_START( pr_bears ) ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD( "bs8pv26.rom", 0x0000, 0x008000, CRC(d6f7c02c) SHA1(d6549a5d47d644366c1c21ca2455ece3f282f5a5) ) @@ -649,72 +655,69 @@ - - DRIVER_INIT( proconn ) { - } -GAME( 199?, pr_lday ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "'L' Of A Day (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_5xcsh ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "5x Cash (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_7hvn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "777 Heaven (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_alwy9 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"PCP" , "Always Nine (Pcp) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_barbl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bars & Bells (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_batls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Battleships (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_btwar ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Beat The Warden (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_bigdp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Big Dipper (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_bulls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bullseye (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_bulbn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bully's Big Night (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_buljp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bully's Jackpot (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_cashb ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Cash Back (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_cas7 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Casino Jackpot 7s (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_chico ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Chico the Bandit (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_coolm ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Cool Million (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_crz77 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy 777s (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_crzbr ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy Bars / Super Bars (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_coyot ,0 ,proconn ,proconn ,proconn ,ROT0 ,"PCP" , "Crazy Coyote (Pcp) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_crzpy ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy Pays (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_dblup ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Double Up (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_fire ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fircecracker (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_flshc ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Flash The Cash (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_ftwhl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fortune Wheel (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_funrn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fun On The Run (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_gogld ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Go For Gold (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_gldnl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Golden Nile (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_gldng ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Golden Nugget (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_gdft ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Good Fortune (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_happy ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Happy Days (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_heato ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "The Heat Is On (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_hiclm ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hi Climber (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_hit6 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hit The Six (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_hotcs ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hot Cash (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_hotsp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hot Spots (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_jkpt7 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jackpot 7's (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_jkrwd ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jokers Wild (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_jumpj ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jumping Jacks (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_medl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Medalist (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_megmn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Mega Money (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_nudxs ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Nudge XS (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_rags ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Rags To Riches (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_reflx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Reflex (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_roadr ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Road Riot (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_roll ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "The Roll (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_sevab ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Seven's Above (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_sevml ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Sevens & Melons (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_theme ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Theme Park (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_ttrai ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Treasure Trail (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_trpx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Triple X (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_walls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wall Street (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_whlft ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wheel Of Fortune (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_wldkn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wild Kings (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_nifty ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Nifty Fifty (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_upnun ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Up & Under (Project) (PROCONN)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, pr_lday ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "'L' Of A Day (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_5xcsh ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "5x Cash (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_7hvn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "777 Heaven (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_alwy9 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"PCP" , "Always Nine (Pcp) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_barbl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bars & Bells (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_batls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Battleships (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_btwar ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Beat The Warden (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_bigdp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Big Dipper (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_bulls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bullseye (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_bulbn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bully's Big Night (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_buljp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Bully's Jackpot (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_cashb ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Cash Back (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_cas7 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Casino Jackpot 7s (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_chico ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Chico the Bandit (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_coolm ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Cool Million (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_crz77 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy 777s (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_crzbr ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy Bars / Super Bars (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_coyot ,0 ,proconn ,proconn ,proconn ,ROT0 ,"PCP" , "Crazy Coyote (Pcp) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_crzpy ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Crazy Pays (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_dblup ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Double Up (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_fire ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fircecracker (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_flshc ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Flash The Cash (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_ftwhl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fortune Wheel (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_funrn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Fun On The Run (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_gogld ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Go For Gold (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_gldnl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Golden Nile (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_gldng ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Golden Nugget (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_gdft ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Good Fortune (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_happy ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Happy Days (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_heato ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "The Heat Is On (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_hiclm ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hi Climber (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_hit6 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hit The Six (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_hotcs ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hot Cash (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_hotsp ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Hot Spots (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_jkpt7 ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jackpot 7's (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_jkrwd ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jokers Wild (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_jumpj ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Jumping Jacks (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_medl ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Medalist (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_megmn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Mega Money (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_nudxs ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Nudge XS (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_rags ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Rags To Riches (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_reflx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Reflex (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_roadr ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Road Riot (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_roll ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "The Roll (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_sevab ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Seven's Above (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_sevml ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Sevens & Melons (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_theme ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Theme Park (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_ttrai ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Treasure Trail (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_trpx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Triple X (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_walls ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wall Street (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_whlft ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wheel Of Fortune (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_wldkn ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Wild Kings (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_nifty ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Nifty Fifty (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_upnun ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Project", "Up & Under (Project) (PROCONN)",GAME_IS_SKELETON_MECHANICAL ) // Some of these are PC98 hardware.. I don't know how / if that differs -GAME( 199?, pr_bears ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Bear Streak (Coinworld)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_bearx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Bear X (Coinworld)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_fspot ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Fun Spot (Coinworld)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_gnuc ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Golden Nugget (Coinworld)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_magln ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Magic Lines (Coinworld)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) -GAME( 199?, pr_swop ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Ace", "Swop It (Ace)",GAME_NOT_WORKING|GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL ) +GAME( 199?, pr_bears ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Bear Streak (Coinworld)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_bearx ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Bear X (Coinworld)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_fspot ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Fun Spot (Coinworld)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_gnuc ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Golden Nugget (Coinworld)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_magln ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Coinworld", "Magic Lines (Coinworld)",GAME_IS_SKELETON_MECHANICAL ) +GAME( 199?, pr_swop ,0 ,proconn ,proconn ,proconn ,ROT0 ,"Ace", "Swop It (Ace)",GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/progolf.c mame-0.145/src/mame/drivers/progolf.c --- mame-0.144/src/mame/drivers/progolf.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/progolf.c 2012-02-06 21:30:41.000000000 +0000 @@ -87,9 +87,9 @@ } -static SCREEN_UPDATE( progolf ) +static SCREEN_UPDATE_IND16( progolf ) { - progolf_state *state = screen->machine().driver_data(); + progolf_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int count,color,x,y,xi,yi; @@ -104,9 +104,9 @@ { int tile = videoram[count]; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,1,0,0,(256-x*8)+scroll,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,1,0,0,(256-x*8)+scroll,y*8); /* wrap-around */ - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],tile,1,0,0,(256-x*8)+scroll-1024,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],tile,1,0,0,(256-x*8)+scroll-1024,y*8); count++; } @@ -127,8 +127,8 @@ { color = state->m_fg_fb[(xi+yi*8)+count*0x40]; - if((x+yi) <= cliprect->max_x && (256-y+xi) <= cliprect->max_y && color != 0) - *BITMAP_ADDR16(bitmap, x+yi, 256-y+xi) = screen->machine().pens[(color & 0x7)]; + if(color != 0 && cliprect.contains(x+yi, 256-y+xi)) + bitmap.pix16(x+yi, 256-y+xi) = screen.machine().pens[(color & 0x7)]; } } @@ -465,10 +465,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(progolf) + MCFG_SCREEN_UPDATE_STATIC(progolf) MCFG_GFXDECODE(progolf) MCFG_PALETTE_LENGTH(32*3) diff -Nru mame-0.144/src/mame/drivers/psattack.c mame-0.145/src/mame/drivers/psattack.c --- mame-0.144/src/mame/drivers/psattack.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/psattack.c 2012-02-06 21:30:38.000000000 +0000 @@ -119,12 +119,12 @@ } -static SCREEN_UPDATE(psattack) +static SCREEN_UPDATE_IND16(psattack) { return 0; } -static SCREEN_EOF(psattack) +static SCREEN_VBLANK(psattack) { } @@ -181,11 +181,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(psattack) - MCFG_SCREEN_EOF(psattack) + MCFG_SCREEN_UPDATE_STATIC(psattack) + MCFG_SCREEN_VBLANK_STATIC(psattack) MCFG_VIDEO_START(psattack) @@ -220,5 +219,5 @@ } -GAME( 2004, psattack, 0, psattack, psattack, psattack, ROT0, "Uniana", "P's Attack", GAME_NOT_WORKING ) +GAME( 2004, psattack, 0, psattack, psattack, psattack, ROT0, "Uniana", "P's Attack", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/psikyo4.c mame-0.145/src/mame/drivers/psikyo4.c --- mame-0.144/src/mame/drivers/psikyo4.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/psikyo4.c 2012-02-06 21:30:38.000000000 +0000 @@ -704,20 +704,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(psikyo4) + MCFG_SCREEN_UPDATE_STATIC(psikyo4_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(psikyo4) + MCFG_SCREEN_UPDATE_STATIC(psikyo4_right) MCFG_VIDEO_START(psikyo4) diff -Nru mame-0.144/src/mame/drivers/psikyo.c mame-0.145/src/mame/drivers/psikyo.c --- mame-0.144/src/mame/drivers/psikyo.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/psikyo.c 2012-02-06 21:30:41.000000000 +0000 @@ -1078,11 +1078,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.3) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(psikyo) - MCFG_SCREEN_EOF(psikyo) + MCFG_SCREEN_UPDATE_STATIC(psikyo) + MCFG_SCREEN_VBLANK_STATIC(psikyo) MCFG_GFXDECODE(psikyo) MCFG_PALETTE_LENGTH(0x1000) @@ -1130,11 +1129,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.3) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(psikyo) - MCFG_SCREEN_EOF(psikyo) + MCFG_SCREEN_UPDATE_STATIC(psikyo) + MCFG_SCREEN_VBLANK_STATIC(psikyo) MCFG_GFXDECODE(psikyo) MCFG_PALETTE_LENGTH(0x1000) @@ -1166,11 +1164,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.3) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(psikyo_bootleg) - MCFG_SCREEN_EOF(psikyo) + MCFG_SCREEN_UPDATE_STATIC(psikyo_bootleg) + MCFG_SCREEN_VBLANK_STATIC(psikyo) MCFG_GFXDECODE(psikyo) MCFG_PALETTE_LENGTH(0x1000) @@ -1223,11 +1220,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.90) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 256-32-1) - MCFG_SCREEN_UPDATE(psikyo) - MCFG_SCREEN_EOF(psikyo) + MCFG_SCREEN_UPDATE_STATIC(psikyo) + MCFG_SCREEN_VBLANK_STATIC(psikyo) MCFG_GFXDECODE(psikyo) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/psikyosh.c mame-0.145/src/mame/drivers/psikyosh.c --- mame-0.144/src/mame/drivers/psikyosh.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/psikyosh.c 2012-02-06 21:30:34.000000000 +0000 @@ -824,11 +824,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 0, 28*8-1) - MCFG_SCREEN_UPDATE(psikyosh) - MCFG_SCREEN_EOF(psikyosh) + MCFG_SCREEN_UPDATE_STATIC(psikyosh) + MCFG_SCREEN_VBLANK_STATIC(psikyosh) MCFG_GFXDECODE(psikyosh) MCFG_PALETTE_LENGTH(0x5000/4) diff -Nru mame-0.144/src/mame/drivers/psychic5.c mame-0.145/src/mame/drivers/psychic5.c --- mame-0.144/src/mame/drivers/psychic5.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/psychic5.c 2012-02-06 21:30:36.000000000 +0000 @@ -681,10 +681,9 @@ MCFG_SCREEN_REFRESH_RATE(53.8) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) /* frames per second hand tuned to match game and music speed */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(psychic5) + MCFG_SCREEN_UPDATE_STATIC(psychic5) MCFG_GFXDECODE(psychic5) MCFG_PALETTE_LENGTH(768) @@ -727,10 +726,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) /* Guru says : VSync - 54Hz . HSync - 15.25kHz */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(bombsa) + MCFG_SCREEN_UPDATE_STATIC(bombsa) MCFG_GFXDECODE(bombsa) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/pturn.c mame-0.145/src/mame/drivers/pturn.c --- mame-0.144/src/mame/drivers/pturn.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/pturn.c 2012-02-06 21:30:33.000000000 +0000 @@ -141,21 +141,21 @@ { pturn_state *state = machine.driver_data(); state->m_fgmap = tilemap_create(machine, get_pturn_tile_info,tilemap_scan_rows,8, 8,32,32); - tilemap_set_transparent_pen(state->m_fgmap,0); + state->m_fgmap->set_transparent_pen(0); state->m_bgmap = tilemap_create(machine, get_pturn_bg_tile_info,tilemap_scan_rows,8, 8,32,32*8); - tilemap_set_transparent_pen(state->m_bgmap,0); + state->m_bgmap->set_transparent_pen(0); } -static SCREEN_UPDATE(pturn) +static SCREEN_UPDATE_IND16(pturn) { - pturn_state *state = screen->machine().driver_data(); + pturn_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; int sx, sy; int flipx, flipy; - bitmap_fill(bitmap, cliprect, state->m_bgcolor); - tilemap_draw(bitmap,cliprect,state->m_bgmap,0,0); + bitmap.fill(state->m_bgcolor, cliprect); + state->m_bgmap->draw(bitmap, cliprect, 0,0); for ( offs = 0x80-4 ; offs >=0 ; offs -= 4) { sy=256-spriteram[offs]-16 ; @@ -165,13 +165,13 @@ flipy=spriteram[offs+1]&0x80; - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) { sx = 224 - sx; flipx ^= 0x40; } - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) { flipy ^= 0x80; sy = 224 - sy; @@ -179,14 +179,14 @@ if(sx|sy) { - drawgfx_transpen(bitmap, cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap, cliprect,screen.machine().gfx[2], spriteram[offs+1] & 0x3f , (spriteram[offs+2] & 0x1f), flipx, flipy, sx,sy,0); } } - tilemap_draw(bitmap,cliprect,state->m_fgmap,0,0); + state->m_fgmap->draw(bitmap, cliprect, 0,0); return 0; } @@ -207,7 +207,7 @@ pturn_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset]=data; - tilemap_mark_tile_dirty(state->m_fgmap,offset); + state->m_fgmap->mark_tile_dirty(offset); } @@ -238,36 +238,36 @@ static WRITE8_HANDLER(bg_scrollx_w) { pturn_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bgmap, 0, (data>>5)*32*8); + state->m_bgmap->set_scrolly(0, (data>>5)*32*8); state->m_bgpalette=data&0x1f; - tilemap_mark_all_tiles_dirty(state->m_bgmap); + state->m_bgmap->mark_all_dirty(); } static WRITE8_HANDLER(fgpalette_w) { pturn_state *state = space->machine().driver_data(); state->m_fgpalette=data&0x1f; - tilemap_mark_all_tiles_dirty(state->m_fgmap); + state->m_fgmap->mark_all_dirty(); } static WRITE8_HANDLER(bg_scrolly_w) { pturn_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bgmap, 0, data); + state->m_bgmap->set_scrollx(0, data); } static WRITE8_HANDLER(fgbank_w) { pturn_state *state = space->machine().driver_data(); state->m_fgbank=data&1; - tilemap_mark_all_tiles_dirty(state->m_fgmap); + state->m_fgmap->mark_all_dirty(); } static WRITE8_HANDLER(bgbank_w) { pturn_state *state = space->machine().driver_data(); state->m_bgbank=data&1; - tilemap_mark_all_tiles_dirty(state->m_bgmap); + state->m_bgmap->mark_all_dirty(); } static WRITE8_HANDLER(flip_w) @@ -489,10 +489,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pturn) + MCFG_SCREEN_UPDATE_STATIC(pturn) MCFG_PALETTE_LENGTH(0x100) MCFG_PALETTE_INIT(RRRR_GGGG_BBBB) diff -Nru mame-0.144/src/mame/drivers/punchout.c mame-0.145/src/mame/drivers/punchout.c --- mame-0.144/src/mame/drivers/punchout.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/punchout.c 2012-02-06 21:30:41.000000000 +0000 @@ -341,6 +341,12 @@ AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(punchout_bg_top_videoram_w) AM_BASE_MEMBER(punchout_state, m_bg_top_videoram) ADDRESS_MAP_END +static WRITE8_HANDLER( nmi_mask_w ) +{ + punchout_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} static ADDRESS_MAP_START( punchout_io_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) @@ -352,7 +358,7 @@ AM_RANGE(0x04, 0x04) AM_DEVWRITE("vlm", vlm5030_data_w) /* VLM5030 */ // AM_RANGE(0x05, 0x05) AM_WRITENOP /* unused */ // AM_RANGE(0x06, 0x06) AM_WRITENOP - AM_RANGE(0x08, 0x08) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x08, 0x08) AM_WRITE(nmi_mask_w) AM_RANGE(0x09, 0x09) AM_WRITENOP /* watchdog reset, seldom used because 08 clears the watchdog as well */ AM_RANGE(0x0a, 0x0a) AM_WRITENOP /* ?? */ AM_RANGE(0x0b, 0x0b) AM_WRITE(punchout_2a03_reset_w) @@ -923,6 +929,15 @@ memset(state->m_rp5c01_mem, 0, sizeof(state->m_rp5c01_mem)); } +static INTERRUPT_GEN( vblank_irq ) +{ + punchout_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + static MACHINE_CONFIG_START( punchout, punchout_state ) @@ -930,7 +945,7 @@ MCFG_CPU_ADD("maincpu", Z80, 8000000/2) /* 4 MHz */ MCFG_CPU_PROGRAM_MAP(punchout_map) MCFG_CPU_IO_MAP(punchout_io_map) - MCFG_CPU_VBLANK_INT("top", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("top", vblank_irq) MCFG_CPU_ADD("audiocpu", N2A03, N2A03_DEFAULTCLOCK) MCFG_CPU_PROGRAM_MAP(punchout_sound_map) @@ -945,20 +960,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhovu) MCFG_SCREEN_ADD("top", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(punchout) + MCFG_SCREEN_UPDATE_STATIC(punchout_top) MCFG_SCREEN_ADD("bottom", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(punchout) + MCFG_SCREEN_UPDATE_STATIC(punchout_bottom) MCFG_VIDEO_START(punchout) @@ -986,9 +999,9 @@ MCFG_VIDEO_START(armwrest) MCFG_SCREEN_MODIFY("top") - MCFG_SCREEN_UPDATE(armwrest) + MCFG_SCREEN_UPDATE_STATIC(armwrest_top) MCFG_SCREEN_MODIFY("bottom") - MCFG_SCREEN_UPDATE(armwrest) + MCFG_SCREEN_UPDATE_STATIC(armwrest_bottom) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/pushman.c mame-0.145/src/mame/drivers/pushman.c --- mame-0.144/src/mame/drivers/pushman.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pushman.c 2012-02-06 21:30:35.000000000 +0000 @@ -456,10 +456,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pushman) + MCFG_SCREEN_UPDATE_STATIC(pushman) MCFG_GFXDECODE(pushman) MCFG_PALETTE_LENGTH(1024) @@ -506,10 +505,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pushman) + MCFG_SCREEN_UPDATE_STATIC(pushman) MCFG_GFXDECODE(pushman) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/pzletime.c mame-0.145/src/mame/drivers/pzletime.c --- mame-0.144/src/mame/drivers/pzletime.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/pzletime.c 2012-02-06 21:30:42.000000000 +0000 @@ -61,7 +61,7 @@ SET_TILE_INFO(0, tileno, colour, 0); - tileinfo->category = BIT(colour, 3); + tileinfo.category = BIT(colour, 3); } static VIDEO_START( pzletime ) @@ -71,23 +71,23 @@ state->m_mid_tilemap = tilemap_create(machine, get_mid_tile_info, tilemap_scan_cols, 16, 16, 64, 16); state->m_txt_tilemap = tilemap_create(machine, get_txt_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_mid_tilemap, 0); - tilemap_set_transparent_pen(state->m_txt_tilemap, 0); + state->m_mid_tilemap->set_transparent_pen(0); + state->m_txt_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( pzletime ) +static SCREEN_UPDATE_IND16( pzletime ) { - pzletime_state *state = screen->machine().driver_data(); + pzletime_state *state = screen.machine().driver_data(); int count; int y, x; - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); //bg pen + bitmap.fill(screen.machine().pens[0], cliprect); //bg pen - tilemap_set_scrolly(state->m_txt_tilemap, 0, state->m_tilemap_regs[0] - 3); - tilemap_set_scrollx(state->m_txt_tilemap, 0, state->m_tilemap_regs[1]); + state->m_txt_tilemap->set_scrolly(0, state->m_tilemap_regs[0] - 3); + state->m_txt_tilemap->set_scrollx(0, state->m_tilemap_regs[1]); - tilemap_set_scrolly(state->m_mid_tilemap, 0, state->m_tilemap_regs[2] - 3); - tilemap_set_scrollx(state->m_mid_tilemap, 0, state->m_tilemap_regs[3] - 7); + state->m_mid_tilemap->set_scrolly(0, state->m_tilemap_regs[2] - 3); + state->m_mid_tilemap->set_scrollx(0, state->m_tilemap_regs[3] - 7); if (state->m_video_regs[2] & 1) { @@ -98,14 +98,14 @@ for (x = 0; x < 512; x++) { if (state->m_bg_videoram[count] & 0x8000) - *BITMAP_ADDR16(bitmap, (y - 18) & 0xff, (x - 32) & 0x1ff) = 0x300 + (state->m_bg_videoram[count] & 0x7fff); + bitmap.pix16((y - 18) & 0xff, (x - 32) & 0x1ff) = 0x300 + (state->m_bg_videoram[count] & 0x7fff); count++; } } } - tilemap_draw(bitmap, cliprect, state->m_mid_tilemap, 0, 0); + state->m_mid_tilemap->draw(bitmap, cliprect, 0, 0); { UINT16 *spriteram = state->m_spriteram; @@ -123,13 +123,13 @@ // is spriteram[offs + 0] & 0x200 flipy? it's always set - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], spr_offs, colour, 0, 1, sx, sy, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], spr_offs, colour, 0, 1, sx, sy, 0); } } - tilemap_draw(bitmap, cliprect, state->m_txt_tilemap, 0, 0); - if ((screen->frame_number() % 16) != 0) - tilemap_draw(bitmap, cliprect, state->m_txt_tilemap, 1, 0); + state->m_txt_tilemap->draw(bitmap, cliprect, 0, 0); + if ((screen.frame_number() % 16) != 0) + state->m_txt_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } @@ -138,14 +138,14 @@ { pzletime_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid_videoram[offset]); - tilemap_mark_tile_dirty(state->m_mid_tilemap, offset); + state->m_mid_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( txt_videoram_w ) { pzletime_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txt_videoram[offset]); - tilemap_mark_tile_dirty(state->m_txt_tilemap, offset); + state->m_txt_tilemap->mark_tile_dirty(offset); } static WRITE16_DEVICE_HANDLER( eeprom_w ) @@ -322,10 +322,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(pzletime) + MCFG_SCREEN_UPDATE_STATIC(pzletime) MCFG_GFXDECODE(pzletime) MCFG_PALETTE_LENGTH(0x300 + 32768) MCFG_EEPROM_93C46_ADD("eeprom") diff -Nru mame-0.144/src/mame/drivers/qdrmfgp.c mame-0.145/src/mame/drivers/qdrmfgp.c --- mame-0.144/src/mame/drivers/qdrmfgp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/qdrmfgp.c 2012-02-06 21:30:37.000000000 +0000 @@ -9,6 +9,8 @@ Other(GQ460):Konami 053252,054156,056832,054539 Other(GE557):Konami 056832,058141,058143 +TODO: +- enabling irq acks breaks both games, why? -- driver by Eisuke Watanabe @@ -20,7 +22,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "machine/idectrl.h" #include "sound/k054539.h" @@ -268,22 +269,19 @@ * *************************************/ -static INTERRUPT_GEN(qdrmfgp_interrupt) +static TIMER_DEVICE_CALLBACK(qdrmfgp_interrupt) { - qdrmfgp_state *state = device->machine().driver_data(); - switch (cpu_getiloops(device)) - { - case 0: - if (state->m_control & 0x0001) - device_set_input_line(device, 1, HOLD_LINE); - break; - - case 1: - /* trigger V-blank interrupt */ - if (state->m_control & 0x0004) - device_set_input_line(device, 3, ASSERT_LINE); - break; - } + qdrmfgp_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 0) + if (state->m_control & 0x0001) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + /* trigger V-blank interrupt */ + if(scanline == 240) + if (state->m_control & 0x0004) + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); } static void ide_interrupt(device_t *device, int state) @@ -304,7 +302,7 @@ { qdrmfgp_state *state = machine.driver_data(); if (state->m_control & 0x0004) - cputag_set_input_line(machine, "maincpu", 3, ASSERT_LINE); + cputag_set_input_line(machine, "maincpu", 3, HOLD_LINE); } static INTERRUPT_GEN(qdrmfgp2_interrupt) @@ -312,7 +310,7 @@ qdrmfgp_state *state = device->machine().driver_data(); /* trigger V-blank interrupt */ if (state->m_control & 0x0008) - device_set_input_line(device, 4, ASSERT_LINE); + device_set_input_line(device, 4, HOLD_LINE); } static void gp2_ide_interrupt(device_t *device, int state) @@ -614,12 +612,12 @@ static WRITE_LINE_DEVICE_HANDLER( qdrmfgp_irq3_ack_w ) { - cputag_set_input_line(device->machine(), "maincpu", M68K_IRQ_3, CLEAR_LINE); +// cputag_set_input_line(device->machine(), "maincpu", M68K_IRQ_3, CLEAR_LINE); } static WRITE_LINE_DEVICE_HANDLER( qdrmfgp_irq4_ack_w ) { - cputag_set_input_line(device->machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE); +// cputag_set_input_line(device->machine(), "maincpu", M68K_IRQ_4, CLEAR_LINE); } static const k053252_interface qdrmfgp_k053252_intf = @@ -680,7 +678,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 32000000/2) /* 16.000 MHz */ MCFG_CPU_PROGRAM_MAP(qdrmfgp_map) - MCFG_CPU_VBLANK_INT_HACK(qdrmfgp_interrupt, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", qdrmfgp_interrupt, "screen", 0, 1) MCFG_MACHINE_START(qdrmfgp) MCFG_MACHINE_RESET(qdrmfgp) @@ -692,10 +690,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(qdrmfgp) + MCFG_SCREEN_UPDATE_STATIC(qdrmfgp) MCFG_PALETTE_LENGTH(2048) @@ -730,10 +727,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 16, 16+224-1) - MCFG_SCREEN_UPDATE(qdrmfgp) + MCFG_SCREEN_UPDATE_STATIC(qdrmfgp) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/quakeat.c mame-0.145/src/mame/drivers/quakeat.c --- mame-0.144/src/mame/drivers/quakeat.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/quakeat.c 2012-02-06 21:30:34.000000000 +0000 @@ -6,7 +6,8 @@ I've also seen CDs of this for sale, so maybe there should be a CD too, for the music? - +TODO: +can't be emulated without proper mb bios -- set info @@ -78,7 +79,7 @@ { } -static SCREEN_UPDATE(quake) +static SCREEN_UPDATE_IND16(quake) { return 0; } @@ -176,12 +177,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(quake) + MCFG_SCREEN_UPDATE_STATIC(quake) MCFG_PALETTE_LENGTH(0x100) @@ -198,4 +198,4 @@ ROM_END -GAME( 1998, quake, 0, quake, quake, 0, ROT0, "Lazer-Tron / iD Software", "Quake Arcade Tournament (Release Beta 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1998, quake, 0, quake, quake, 0, ROT0, "Lazer-Tron / iD Software", "Quake Arcade Tournament (Release Beta 2)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/quantum.c mame-0.145/src/mame/drivers/quantum.c --- mame-0.144/src/mame/drivers/quantum.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/quantum.c 2012-02-06 21:30:35.000000000 +0000 @@ -250,7 +250,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 900, 0, 600) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_quantum) diff -Nru mame-0.144/src/mame/drivers/quasar.c mame-0.145/src/mame/drivers/quasar.c --- mame-0.144/src/mame/drivers/quasar.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/quasar.c 2012-02-06 21:30:40.000000000 +0000 @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) /* From dot clock */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(1*8+1, 29*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(quasar) + MCFG_SCREEN_UPDATE_STATIC(quasar) MCFG_GFXDECODE(quasar) MCFG_PALETTE_LENGTH((64+1)*8+(4*256)) diff -Nru mame-0.144/src/mame/drivers/queen.c mame-0.145/src/mame/drivers/queen.c --- mame-0.144/src/mame/drivers/queen.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/queen.c 2012-02-06 21:30:35.000000000 +0000 @@ -2,6 +2,18 @@ /* +TODO: +- goes to la-la-land almost immediately: +000F4023: sbb [42F9h],ah +000F4027: loop 0F4003h +000F4003: ror word ptr [si+48B2h],1 +000F4007: cmp ax,44B2h +000F400A: retf +000903D3: add [bx+si],al +000903D5: add [bx+si],al +(Reads stack from BIOS ROM?) + + Produttore STG N.revisione CPU main PCB is a standard EPIA @@ -19,84 +31,680 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" +#include "memconv.h" +#include "devconv.h" +#include "machine/8237dma.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/mc146818.h" +#include "machine/pcshare.h" +#include "machine/pci.h" +#include "machine/8042kbdc.h" +#include "machine/pckeybrd.h" +#include "machine/idectrl.h" +#include "video/pc_vga.h" class queen_state : public driver_device { public: queen_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pit8254(*this, "pit8254"), + m_dma8237_1(*this, "dma8237_1"), + m_dma8237_2(*this, "dma8237_2"), + m_pic8259_1(*this, "pic8259_1"), + m_pic8259_2(*this, "pic8259_2") + { } + + UINT32 *m_bios_ram; + UINT32 *m_bios_ext1_ram; + UINT32 *m_bios_ext2_ram; + UINT32 *m_bios_ext3_ram; + UINT32 *m_bios_ext4_ram; + UINT32 *m_isa_ram1; + UINT32 *m_isa_ram2; + int m_dma_channel; + UINT8 m_dma_offset[2][4]; + UINT8 m_at_pages[0x10]; + UINT8 m_mxtc_config_reg[256]; + UINT8 m_piix4_config_reg[4][256]; + + // devices + required_device m_maincpu; + required_device m_pit8254; + required_device m_dma8237_1; + required_device m_dma8237_2; + required_device m_pic8259_1; + required_device m_pic8259_2; + + DECLARE_READ8_MEMBER( get_slave_ack ); + + DECLARE_WRITE32_MEMBER( isa_ram1_w ); + DECLARE_WRITE32_MEMBER( isa_ram2_w ); + + DECLARE_WRITE32_MEMBER( bios_ext1_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext2_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext3_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext4_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ram_w ); }; -static VIDEO_START(queen) +// Intel 82439TX System Controller (MXTC) + +static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + queen_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("MXTC: read %d, %02X\n", function, reg); + + return state->m_mxtc_config_reg[reg]; +} + +static void mxtc_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + queen_state *state = busdevice->machine().driver_data(); + printf("MXTC: write %d, %02X, %02X\n", function, reg, data); + + /* + memory banking with North Bridge: + 0x59 (PAM0) xxxx ---- BIOS area 0xf0000-0xfffff + ---- xxxx Reserved + 0x5a (PAM1) xxxx ---- ISA add-on BIOS 0xc4000 - 0xc7fff + ---- xxxx ISA add-on BIOS 0xc0000 - 0xc3fff + 0x5b (PAM2) xxxx ---- ISA add-on BIOS 0xcc000 - 0xcffff + ---- xxxx ISA add-on BIOS 0xc8000 - 0xcbfff + 0x5c (PAM3) xxxx ---- ISA add-on BIOS 0xd4000 - 0xd7fff + ---- xxxx ISA add-on BIOS 0xd0000 - 0xd3fff + 0x5d (PAM4) xxxx ---- ISA add-on BIOS 0xdc000 - 0xdffff + ---- xxxx ISA add-on BIOS 0xd8000 - 0xdbfff + 0x5e (PAM5) xxxx ---- BIOS extension 0xe4000 - 0xe7fff + ---- xxxx BIOS extension 0xe0000 - 0xe3fff + 0x5f (PAM6) xxxx ---- BIOS extension 0xec000 - 0xeffff + ---- xxxx BIOS extension 0xe8000 - 0xebfff + + 3210 -> 3 = reserved, 2 = Cache Enable, 1 = Write Enable, 0 = Read Enable + */ + + switch(reg) + { + case 0x59: // PAM0 + { + if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + memory_set_bankptr(busdevice->machine(), "bios_bank", state->m_bios_ram); + else // disable RAM access (reads go to BIOS ROM) + memory_set_bankptr(busdevice->machine(), "bios_bank", busdevice->machine().region("bios")->base() + 0x10000); + break; + } + case 0x5a: // PAM1 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "video_bank1", state->m_isa_ram1); + else + memory_set_bankptr(busdevice->machine(), "video_bank1", busdevice->machine().region("video_bios")->base() + 0); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "video_bank2", state->m_isa_ram2); + else + memory_set_bankptr(busdevice->machine(), "video_bank2", busdevice->machine().region("video_bios")->base() + 0x4000); + + break; + } + case 0x5e: // PAM5 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext1", state->m_bios_ext1_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext1", busdevice->machine().region("bios")->base() + 0); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext2", state->m_bios_ext2_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext2", busdevice->machine().region("bios")->base() + 0x4000); + + break; + } + case 0x5f: // PAM6 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext3", state->m_bios_ext3_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext3", busdevice->machine().region("bios")->base() + 0x8000); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext4", state->m_bios_ext4_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext4", busdevice->machine().region("bios")->base() + 0xc000); + + break; + } + } + + state->m_mxtc_config_reg[reg] = data; +} + +static void intel82439tx_init(running_machine &machine) +{ + queen_state *state = machine.driver_data(); + state->m_mxtc_config_reg[0x60] = 0x02; + state->m_mxtc_config_reg[0x61] = 0x02; + state->m_mxtc_config_reg[0x62] = 0x02; + state->m_mxtc_config_reg[0x63] = 0x02; + state->m_mxtc_config_reg[0x64] = 0x02; + state->m_mxtc_config_reg[0x65] = 0x02; +} + +static UINT32 intel82439tx_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= mxtc_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mxtc_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mxtc_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mxtc_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82439tx_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mxtc_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mxtc_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mxtc_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mxtc_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) + +static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + queen_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("PIIX4: read %d, %02X\n", function, reg); + return state->m_piix4_config_reg[function][reg]; +} + +static void piix4_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + queen_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine.describe_context(), function, reg, data); + state->m_piix4_config_reg[function][reg] = data; +} + +static UINT32 intel82371ab_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82371ab_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + + +WRITE32_MEMBER(queen_state::isa_ram1_w) { + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram1 + offset); + } +} +WRITE32_MEMBER(queen_state::isa_ram2_w) +{ + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram2 + offset); + } } -static SCREEN_UPDATE(queen) +WRITE32_MEMBER(queen_state::bios_ext1_ram_w) { - return 0; + if (m_mxtc_config_reg[0x5e] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext1_ram + offset); + } } -static ADDRESS_MAP_START( queen_map, AS_PROGRAM, 32 ) + +WRITE32_MEMBER(queen_state::bios_ext2_ram_w) +{ + if (m_mxtc_config_reg[0x5e] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext2_ram + offset); + } +} + + +WRITE32_MEMBER(queen_state::bios_ext3_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext3_ram + offset); + } +} + + +WRITE32_MEMBER(queen_state::bios_ext4_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext4_ram + offset); + } +} + + +WRITE32_MEMBER(queen_state::bios_ram_w) +{ + if (m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram + offset); + } +} + +static READ32_DEVICE_HANDLER( ide_r ) +{ + return ide_controller32_r(device, 0x1f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( ide_w ) +{ + ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); +} + +static READ32_DEVICE_HANDLER( fdc_r ) +{ + return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( fdc_w ) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); +} + +static READ8_HANDLER(at_page8_r) +{ + queen_state *state = space->machine().driver_data(); + UINT8 data = state->m_at_pages[offset % 0x10]; + + switch(offset % 8) { + case 1: + data = state->m_dma_offset[(offset / 8) & 1][2]; + break; + case 2: + data = state->m_dma_offset[(offset / 8) & 1][3]; + break; + case 3: + data = state->m_dma_offset[(offset / 8) & 1][1]; + break; + case 7: + data = state->m_dma_offset[(offset / 8) & 1][0]; + break; + } + return data; +} + + +static WRITE8_HANDLER(at_page8_w) +{ + queen_state *state = space->machine().driver_data(); + state->m_at_pages[offset % 0x10] = data; + + switch(offset % 8) { + case 1: + state->m_dma_offset[(offset / 8) & 1][2] = data; + break; + case 2: + state->m_dma_offset[(offset / 8) & 1][3] = data; + break; + case 3: + state->m_dma_offset[(offset / 8) & 1][1] = data; + break; + case 7: + state->m_dma_offset[(offset / 8) & 1][0] = data; + break; + } +} + +static READ32_HANDLER(at_page32_r) +{ + return read32le_with_read8_handler(at_page8_r, space, offset, mem_mask); +} + + +static WRITE32_HANDLER(at_page32_w) +{ + write32le_with_write8_handler(at_page8_w, space, offset, data, mem_mask); +} + +static READ8_DEVICE_HANDLER(at_dma8237_2_r) +{ + return i8237_r(device, offset / 2); +} + +static WRITE8_DEVICE_HANDLER(at_dma8237_2_w) +{ + i8237_w(device, offset / 2, data); +} + +static READ32_DEVICE_HANDLER(at32_dma8237_2_r) +{ + return read32le_with_read8_device_handler(at_dma8237_2_r, device, offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER(at32_dma8237_2_w) +{ + write32le_with_write8_device_handler(at_dma8237_2_w, device, offset, data, mem_mask); +} + + + + +static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed ) +{ + cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + /* Assert HLDA */ + i8237_hlda_w( device, state ); +} + + +static READ8_HANDLER( pc_dma_read_byte ) +{ + queen_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + return space->read_byte(page_offset + offset); +} + + +static WRITE8_HANDLER( pc_dma_write_byte ) +{ + queen_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + space->write_byte(page_offset + offset, data); +} + +static void set_dma_channel(device_t *device, int channel, int state) +{ + queen_state *drvstate = device->machine().driver_data(); + if (!state) drvstate->m_dma_channel = channel; +} + +static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); } + +static I8237_INTERFACE( dma8237_1_config ) +{ + DEVCB_LINE(pc_dma_hrq_changed), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte), + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte), + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) } +}; + +static I8237_INTERFACE( dma8237_2_config ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } +}; + +static ADDRESS_MAP_START( queen_map, AS_PROGRAM, 32, queen_state ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM AM_RANGE(0x000a0000, 0x000bffff) AM_RAM - AM_RANGE(0x000c0000, 0x000fffff) AM_ROM AM_REGION("bios", 0) AM_WRITENOP + AM_RANGE(0x000c0000, 0x000c3fff) AM_ROMBANK("video_bank1") AM_WRITE(isa_ram1_w) + AM_RANGE(0x000c4000, 0x000c7fff) AM_ROMBANK("video_bank2") AM_WRITE(isa_ram2_w) + AM_RANGE(0x000e0000, 0x000e3fff) AM_ROMBANK("bios_ext1") AM_WRITE(bios_ext1_ram_w) + AM_RANGE(0x000e4000, 0x000e7fff) AM_ROMBANK("bios_ext2") AM_WRITE(bios_ext2_ram_w) + AM_RANGE(0x000e8000, 0x000ebfff) AM_ROMBANK("bios_ext3") AM_WRITE(bios_ext3_ram_w) + AM_RANGE(0x000ec000, 0x000effff) AM_ROMBANK("bios_ext4") AM_WRITE(bios_ext4_ram_w) + AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bios_bank") AM_WRITE(bios_ram_w) AM_RANGE(0x00100000, 0x01ffffff) AM_RAM - AM_RANGE(0x10000000, 0x100001ff) AM_RAM - AM_RANGE(0x20000000, 0x200001ff) AM_RAM - AM_RANGE(0x30000000, 0x300001ff) AM_RAM - AM_RANGE(0x40000000, 0x400001ff) AM_RAM - AM_RANGE(0x50000000, 0x500001ff) AM_RAM AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END -static ADDRESS_MAP_START(queen_io, AS_IO, 32) - AM_RANGE(0x0000, 0x001f) AM_RAM//AM_DEVREADWRITE8("dma8237_1", dma8237_r, dma8237_w, 0xffffffff) - AM_RANGE(0x0020, 0x003f) AM_RAM//AM_DEVREADWRITE8("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) - AM_RANGE(0x0040, 0x005f) AM_RAM//AM_DEVREADWRITE8("pit8254", pit8253_r, pit8253_w, 0xffffffff) - AM_RANGE(0x0060, 0x006f) AM_RAM//AM_READWRITE(kbdc8042_32le_r, kbdc8042_32le_w) - AM_RANGE(0x0070, 0x007f) AM_RAM//AM_DEVREADWRITE8_MODERN("rtc", mc146818_device, read, write, 0xffffffff) - AM_RANGE(0x0080, 0x009f) AM_RAM//AM_READWRITE(at_page32_r, at_page32_w) - AM_RANGE(0x00a0, 0x00bf) AM_RAM//AM_DEVREADWRITE8("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) - AM_RANGE(0x00c0, 0x00df) AM_RAM//AM_DEVREADWRITE("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) - AM_RANGE(0x00e8, 0x00eb) AM_NOP - AM_RANGE(0x01f0, 0x01f7) AM_RAM//AM_DEVREADWRITE("ide", ide_r, ide_w) - AM_RANGE(0x0300, 0x03af) AM_NOP - AM_RANGE(0x03b0, 0x03df) AM_NOP - AM_RANGE(0x0278, 0x027b) AM_WRITENOP//AM_WRITE(pnp_config_w) - AM_RANGE(0x03f0, 0x03ff) AM_RAM//AM_DEVREADWRITE("ide", fdc_r, fdc_w) - AM_RANGE(0x0a78, 0x0a7b) AM_WRITENOP//AM_WRITE(pnp_data_w) - AM_RANGE(0x0cf8, 0x0cff) AM_RAM//AM_DEVREADWRITE("pcibus", pci_32le_r, pci_32le_w) - AM_RANGE(0x4004, 0x4007) AM_RAM // - todo: identify these two. - AM_RANGE(0x5000, 0x5007) AM_RAM // / +static ADDRESS_MAP_START( queen_io, AS_IO, 32, queen_state ) + AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, 0xffffffff) + AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8_LEGACY("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) + AM_RANGE(0x0060, 0x006f) AM_READWRITE_LEGACY(kbdc8042_32le_r, kbdc8042_32le_w) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ + AM_RANGE(0x0080, 0x009f) AM_READWRITE_LEGACY(at_page32_r, at_page32_w) + AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE_LEGACY("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) + AM_RANGE(0x00e8, 0x00ef) AM_NOP + + AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE_LEGACY("ide", ide_r, ide_w) + AM_RANGE(0x03f0, 0x03f7) AM_DEVREADWRITE_LEGACY("ide", fdc_r, fdc_w) + + AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE_LEGACY("pcibus", pci_32le_r, pci_32le_w) ADDRESS_MAP_END +static const struct pit8253_config queen_pit8254_config = +{ + { + { + 4772720/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +static WRITE_LINE_DEVICE_HANDLER( queen_pic8259_1_set_int_line ) +{ + queen_state *drvstate = device->machine().driver_data(); + device_set_input_line(drvstate->m_maincpu, 0, state ? HOLD_LINE : CLEAR_LINE); +} + +READ8_MEMBER( queen_state::get_slave_ack ) +{ + if (offset==2) { // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface queen_pic8259_1_config = +{ + DEVCB_LINE(queen_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_MEMBER(queen_state,get_slave_ack) +}; + +static const struct pic8259_interface queen_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + +static void set_gate_a20(running_machine &machine, int a20) +{ + queen_state *state = machine.driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + queen_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static int queen_get_out2(running_machine &machine) +{ + queen_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2 ); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, queen_get_out2 +}; + +static void queen_set_keyb_int(running_machine &machine, int state) +{ + queen_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static IRQ_CALLBACK(irq_callback) +{ + queen_state *state = device->machine().driver_data(); + return pic8259_acknowledge( state->m_pic8259_1); +} + +static void ide_interrupt(device_t *device, int state) +{ + queen_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} + +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color + +static MACHINE_START( queen ) +{ + queen_state *state = machine.driver_data(); + + state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x10000/4); + state->m_bios_ext1_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext2_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext3_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext4_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram1 = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram2 = auto_alloc_array(machine, UINT32, 0x4000/4); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, queen_set_keyb_int); + + device_set_irq_callback(state->m_maincpu, irq_callback); + intel82439tx_init(machine); + + kbdc8042_init(machine, &at8042); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} + +static MACHINE_RESET( queen ) +{ + memory_set_bankptr(machine, "bios_bank", machine.region("bios")->base() + 0x30000); + memory_set_bankptr(machine, "bios_ext1", machine.region("bios")->base() + 0x20000); + memory_set_bankptr(machine, "bios_ext2", machine.region("bios")->base() + 0x24000); + memory_set_bankptr(machine, "bios_ext3", machine.region("bios")->base() + 0x28000); + memory_set_bankptr(machine, "bios_ext4", machine.region("bios")->base() + 0x2c000); + memory_set_bankptr(machine, "video_bank1", machine.region("video_bios")->base() + 0); + memory_set_bankptr(machine, "video_bank2", machine.region("video_bios")->base() + 0x4000); +} + + -static INPUT_PORTS_START( queen ) -INPUT_PORTS_END static MACHINE_CONFIG_START( queen, queen_state ) - MCFG_CPU_ADD("maincpu", PENTIUM, 533000000) // Celeron or Pentium 3, 533 Mhz + MCFG_CPU_ADD("maincpu", PENTIUM, 533000000/16) // Celeron or Pentium 3, 533 Mhz MCFG_CPU_PROGRAM_MAP(queen_map) MCFG_CPU_IO_MAP(queen_io) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(queen) + MCFG_MACHINE_START(queen) + MCFG_MACHINE_RESET(queen) + + MCFG_PIT8254_ADD( "pit8254", queen_pit8254_config ) + MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) + MCFG_PIC8259_ADD( "pic8259_1", queen_pic8259_1_config ) + MCFG_PIC8259_ADD( "pic8259_2", queen_pic8259_2_config ) + + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) - MCFG_PALETTE_LENGTH(0x200) + MCFG_PCI_BUS_ADD("pcibus", 0) + MCFG_PCI_BUS_DEVICE(0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) + MCFG_PCI_BUS_DEVICE(7, NULL, intel82371ab_pci_r, intel82371ab_pci_w) - MCFG_VIDEO_START(queen) + MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END @@ -106,9 +714,13 @@ ROM_REGION( 0x40000, "bios", 0 ) ROM_LOAD( "bios-original.bin", 0x00000, 0x40000, CRC(feb542d4) SHA1(3cc5d8aeb0e3b7d9ed33248a4f3dc507d29debd9) ) + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) + DISK_REGION( "ide" ) DISK_IMAGE( "pqiidediskonmodule", 0,SHA1(a56efcc711b1c5a2e63160b3088001a8c4fb56c2) ) ROM_END -GAME( 2002?, queen, 0, queen, queen, 0, ROT0, "STG", "Queen?", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002?, queen, 0, queen, at_keyboard, 0, ROT0, "STG", "Queen?", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/quizdna.c mame-0.145/src/mame/drivers/quizdna.c --- mame-0.144/src/mame/drivers/quizdna.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/quizdna.c 2012-02-06 21:30:38.000000000 +0000 @@ -453,10 +453,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(quizdna) + MCFG_SCREEN_UPDATE_STATIC(quizdna) MCFG_GFXDECODE(quizdna) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/quizo.c mame-0.145/src/mame/drivers/quizo.c --- mame-0.144/src/mame/drivers/quizo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/quizo.c 2012-02-06 21:30:35.000000000 +0000 @@ -73,9 +73,9 @@ } } -static SCREEN_UPDATE( quizo ) +static SCREEN_UPDATE_IND16( quizo ) { - quizo_state *state = screen->machine().driver_data(); + quizo_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int x,y; for(y=0;y<200;y++) @@ -87,19 +87,19 @@ int pix; pix=(data&1)|(((data>>4)&1)<<1)|((data1&1)<<2)|(((data1>>4)&1)<<3); - *BITMAP_ADDR16(bitmap, y, x*4+3) = pix; + bitmap.pix16(y, x*4+3) = pix; data>>=1; data1>>=1; pix=(data&1)|(((data>>4)&1)<<1)|((data1&1)<<2)|(((data1>>4)&1)<<3); - *BITMAP_ADDR16(bitmap, y, x*4+2) = pix; + bitmap.pix16(y, x*4+2) = pix; data>>=1; data1>>=1; pix=(data&1)|(((data>>4)&1)<<1)|((data1&1)<<2)|(((data1>>4)&1)<<3); - *BITMAP_ADDR16(bitmap, y, x*4+1) = pix; + bitmap.pix16(y, x*4+1) = pix; data>>=1; data1>>=1; pix=(data&1)|(((data>>4)&1)<<1)|((data1&1)<<2)|(((data1>>4)&1)<<3); - *BITMAP_ADDR16(bitmap, y, x*4+0) = pix; + bitmap.pix16(y, x*4+0) = pix; } } return 0; @@ -211,10 +211,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 200) MCFG_SCREEN_VISIBLE_AREA(0*8, 320-1, 0*8, 200-1) - MCFG_SCREEN_UPDATE(quizo) + MCFG_SCREEN_UPDATE_STATIC(quizo) MCFG_PALETTE_LENGTH(16) MCFG_PALETTE_INIT(quizo) diff -Nru mame-0.144/src/mame/drivers/quizpani.c mame-0.145/src/mame/drivers/quizpani.c --- mame-0.144/src/mame/drivers/quizpani.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/quizpani.c 2012-02-06 21:30:38.000000000 +0000 @@ -206,10 +206,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(quizpani) + MCFG_SCREEN_UPDATE_STATIC(quizpani) MCFG_VIDEO_START(quizpani) diff -Nru mame-0.144/src/mame/drivers/quizpun2.c mame-0.145/src/mame/drivers/quizpun2.c --- mame-0.144/src/mame/drivers/quizpun2.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/quizpun2.c 2012-02-06 21:30:38.000000000 +0000 @@ -127,14 +127,14 @@ { quizpun2_state *state = space->machine().driver_data(); state->m_bg_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tmap, offset/2); + state->m_bg_tmap->mark_tile_dirty(offset/2); } static WRITE8_HANDLER( fg_ram_w ) { quizpun2_state *state = space->machine().driver_data(); state->m_fg_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tmap, offset/4); + state->m_fg_tmap->mark_tile_dirty(offset/4); } static VIDEO_START(quizpun2) @@ -143,30 +143,30 @@ state->m_bg_tmap = tilemap_create( machine, get_bg_tile_info, tilemap_scan_rows, 8,16, 0x20,0x20 ); state->m_fg_tmap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8,16, 0x20,0x20 ); - tilemap_set_transparent_pen(state->m_bg_tmap, 0); - tilemap_set_transparent_pen(state->m_fg_tmap, 0); + state->m_bg_tmap->set_transparent_pen(0); + state->m_fg_tmap->set_transparent_pen(0); } -static SCREEN_UPDATE(quizpun2) +static SCREEN_UPDATE_IND16(quizpun2) { - quizpun2_state *state = screen->machine().driver_data(); + quizpun2_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; if (msk != 0) layers_ctrl &= msk; } #endif - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, state->m_bg_tmap, TILEMAP_DRAW_OPAQUE, 0); - else bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + if (layers_ctrl & 1) state->m_bg_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + else bitmap.fill(get_black_pen(screen.machine()), cliprect); -bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, state->m_fg_tmap, 0, 0); +bitmap.fill(get_black_pen(screen.machine()), cliprect); + if (layers_ctrl & 2) state->m_fg_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -497,10 +497,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(quizpun2) + MCFG_SCREEN_UPDATE_STATIC(quizpun2) MCFG_GFXDECODE(quizpun2) MCFG_PALETTE_LENGTH(0x200) @@ -530,6 +529,9 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "u22", 0x00000, 0x10000, CRC(f40768b5) SHA1(4410f71850357ec1d10a3a114bb540966e72781b) ) + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "mcu.bin", 0x0000, 0x1000, NO_DUMP ) // could be a state machine instead + ROM_REGION( 0x40000, "gfx1", 0 ) // 8x16x8 ROM_LOAD( "u21", 0x00000, 0x10000, CRC(8ac86759) SHA1(2eac9ceee4462ce905aa08ff4f5a6215e0b6672f) ) ROM_LOAD( "u20", 0x10000, 0x10000, CRC(67640a46) SHA1(5b33850afbb89db9ce9044a578423bfe3a55420d) ) @@ -566,6 +568,9 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) ROM_LOAD( "05.u22", 0x00000, 0x10000, CRC(515f337e) SHA1(21b2cca95b5da934fd8139892c2ee2c623d51a4e) ) + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "mcu.bin", 0x0000, 0x1000, NO_DUMP ) // could be a state machine instead + ROM_REGION( 0x40000, "gfx1", 0 ) // 8x16x8 ROM_LOAD( "04.u21", 0x00000, 0x10000, CRC(fa8d64f4) SHA1(71badabf8f34f246dec83323a1cddbe74deb91bd) ) ROM_LOAD( "03.u20", 0x10000, 0x10000, CRC(8dda8167) SHA1(42838cf6866fb1d59c5bb3b477053aac448e7760) ) diff -Nru mame-0.144/src/mame/drivers/r2dtank.c mame-0.145/src/mame/drivers/r2dtank.c --- mame-0.144/src/mame/drivers/r2dtank.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/r2dtank.c 2012-02-06 21:30:41.000000000 +0000 @@ -366,7 +366,7 @@ } color = bit ? fore_color : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; x = x + 1; } @@ -397,15 +397,6 @@ }; -static SCREEN_UPDATE( r2dtank ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - - return 0; -} - - /************************************* * @@ -543,9 +534,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(r2dtank) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/r2dx_v33.c mame-0.145/src/mame/drivers/r2dx_v33.c --- mame-0.144/src/mame/drivers/r2dx_v33.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/r2dx_v33.c 2012-02-06 21:30:41.000000000 +0000 @@ -80,7 +80,7 @@ } /* copied from Legionnaire */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int pri) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int pri) { r2dx_v33_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -173,42 +173,42 @@ fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,16,16,32,32); tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows,8, 8, 64,32); - tilemap_set_transparent_pen(bg_tilemap, 15); - tilemap_set_transparent_pen(md_tilemap, 15); - tilemap_set_transparent_pen(fg_tilemap, 15); - tilemap_set_transparent_pen(tx_tilemap, 15); + bg_tilemap->set_transparent_pen(15); + md_tilemap->set_transparent_pen(15); + fg_tilemap->set_transparent_pen(15); + tx_tilemap->set_transparent_pen(15); } -static SCREEN_UPDATE( rdx_v33 ) +static SCREEN_UPDATE_IND16( rdx_v33 ) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, md_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); + bg_tilemap->draw(bitmap, cliprect, 0, 0); + md_tilemap->draw(bitmap, cliprect, 0, 0); + fg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(),bitmap,cliprect,0); + draw_sprites(screen.machine(),bitmap,cliprect,0); - tilemap_draw(bitmap, cliprect, tx_tilemap, 0, 0); + tx_tilemap->draw(bitmap, cliprect, 0, 0); /* debug DMA processing */ if(0) { static UINT32 src_addr = 0x100000; static int frame; - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - //if(screen->machine().input().code_pressed_once(KEYCODE_A)) + //if(screen.machine().input().code_pressed_once(KEYCODE_A)) // src_addr+=0x800; - //if(screen->machine().input().code_pressed_once(KEYCODE_S)) + //if(screen.machine().input().code_pressed_once(KEYCODE_S)) // src_addr-=0x800; frame++; popmessage("%08x 0",src_addr); - //if(screen->machine().input().code_pressed_once(KEYCODE_Z)) + //if(screen.machine().input().code_pressed_once(KEYCODE_Z)) if(frame == 5) { int i,data; @@ -223,7 +223,7 @@ } popmessage("%08x 1",src_addr); - tilemap_mark_all_tiles_dirty(bg_tilemap); + bg_tilemap->mark_all_dirty(); frame = 0; src_addr+=0x800; } @@ -288,25 +288,25 @@ static WRITE16_HANDLER( rdx_bg_vram_w ) { COMBINE_DATA(&bg_vram[offset]); - tilemap_mark_tile_dirty(bg_tilemap, offset); + bg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( rdx_md_vram_w ) { COMBINE_DATA(&md_vram[offset]); - tilemap_mark_tile_dirty(md_tilemap, offset); + md_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( rdx_fg_vram_w ) { COMBINE_DATA(&fg_vram[offset]); - tilemap_mark_tile_dirty(fg_tilemap, offset); + fg_tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( rdx_tx_vram_w ) { COMBINE_DATA(&tx_vram[offset]); - tilemap_mark_tile_dirty(tx_tilemap, offset); + tx_tilemap->mark_tile_dirty(offset); } static READ16_HANDLER( rdx_v33_unknown_r ) @@ -667,10 +667,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(rdx_v33) + MCFG_SCREEN_UPDATE_STATIC(rdx_v33) MCFG_GFXDECODE(rdx_v33) MCFG_PALETTE_LENGTH(2048) @@ -702,10 +701,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55.47) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate *//2) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(rdx_v33) + MCFG_SCREEN_UPDATE_STATIC(rdx_v33) MCFG_GFXDECODE(rdx_v33) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/rabbit.c mame-0.145/src/mame/drivers/rabbit.c --- mame-0.144/src/mame/drivers/rabbit.c 2012-01-13 15:34:48.000000000 +0000 +++ mame-0.145/src/mame/drivers/rabbit.c 2012-02-06 21:30:36.000000000 +0000 @@ -103,7 +103,7 @@ UINT32 *m_tilemap_regs[4]; UINT32 *m_spriteregs; UINT32 *m_blitterregs; - bitmap_t *m_sprite_bitmap; + bitmap_ind16 *m_sprite_bitmap; rectangle m_sprite_clip; int m_vblirqlevel; int m_bltirqlevel; @@ -115,7 +115,7 @@ /* call with tilesize = 0 for 8x8 or 1 for 16x16 */ -INLINE void get_rabbit_tilemap_info(running_machine &machine, tile_data *tileinfo, int tile_index, int whichtilemap, int tilesize) +INLINE void get_rabbit_tilemap_info(running_machine &machine, tile_data &tileinfo, int tile_index, int whichtilemap, int tilesize) { rabbit_state *state = machine.driver_data(); int tileno,colour,flipxy, depth; @@ -147,7 +147,7 @@ tileno >>=(1+tilesize*2); colour&=0x0f; colour+=0x20; - tileinfo->group = 1; + tileinfo.group = 1; SET_TILE_INFO(6+tilesize,tileno,colour,TILE_FLIPXY(flipxy)); } else @@ -155,7 +155,7 @@ tileno >>=(0+tilesize*2); //colour&=0x3f; // fixes status bar.. but breaks other stuff colour+=0x200; - tileinfo->group = 0; + tileinfo.group = 0; SET_TILE_INFO(4+tilesize,tileno,colour,TILE_FLIPXY(flipxy)); } } @@ -186,21 +186,21 @@ { rabbit_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemap_ram[0][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[0],offset); + state->m_tilemap[0]->mark_tile_dirty(offset); } static WRITE32_HANDLER( rabbit_tilemap1_w ) { rabbit_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemap_ram[1][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[1],offset); + state->m_tilemap[1]->mark_tile_dirty(offset); } static WRITE32_HANDLER( rabbit_tilemap2_w ) { rabbit_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemap_ram[2][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[2],offset); + state->m_tilemap[2]->mark_tile_dirty(offset); } @@ -208,7 +208,7 @@ { rabbit_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemap_ram[3][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[3],offset); + state->m_tilemap[3]->mark_tile_dirty(offset); } /* @@ -230,7 +230,7 @@ */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { rabbit_state *state = machine.driver_data(); int xpos,ypos,tileno,xflip,yflip, colr; @@ -240,7 +240,7 @@ UINT32 *source = (state->m_spriteram+ (todraw*2))-2; UINT32 *finish = state->m_spriteram; -// bitmap_fill(state->m_sprite_bitmap, &state->m_sprite_clip, 0x0); // sloooow +// state->m_sprite_bitmap->fill(0x0, state->m_sprite_clip); // sloooow while( source>=finish ) { @@ -258,7 +258,7 @@ if(xpos&0x800)xpos-=0x1000; - drawgfx_transpen(state->m_sprite_bitmap,&state->m_sprite_clip,gfx,tileno,colr,!xflip/*wrongdecode?*/,yflip,xpos+0x20-8/*-(state->m_spriteregs[0]&0x00000fff)*/,ypos-24/*-((state->m_spriteregs[1]&0x0fff0000)>>16)*/,15); + drawgfx_transpen(*state->m_sprite_bitmap,state->m_sprite_clip,gfx,tileno,colr,!xflip/*wrongdecode?*/,yflip,xpos+0x20-8/*-(state->m_spriteregs[0]&0x00000fff)*/,ypos-24/*-((state->m_spriteregs[1]&0x0fff0000)>>16)*/,15); // drawgfx_transpen(bitmap,cliprect,gfx,tileno,colr,!xflip/*wrongdecode?*/,yflip,xpos+0xa0-8/*-(state->m_spriteregs[0]&0x00000fff)*/,ypos-24+0x80/*-((state->m_spriteregs[1]&0x0fff0000)>>16)*/,0); @@ -269,7 +269,7 @@ } /* the sprite bitmap can probably be handled better than this ... */ -static void rabbit_clearspritebitmap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void rabbit_clearspritebitmap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { rabbit_state *state = machine.driver_data(); int startx, starty; @@ -291,13 +291,13 @@ for (y=0; ym_sprite_bitmap, (starty+y)&0xfff, 0); + dstline = &state->m_sprite_bitmap->pix16((starty+y)&0xfff); memset(dstline+startx,0x00,amountx*2); } } /* todo: fix zoom, its inaccurate and this code is ugly */ -static void draw_sprite_bitmap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprite_bitmap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { rabbit_state *state = machine.driver_data(); @@ -330,10 +330,10 @@ ydrawpos = ((y>>7)*ystep); ydrawpos >>=16; - if ((ydrawpos >= cliprect->min_y) && (ydrawpos <= cliprect->max_y)) + if ((ydrawpos >= cliprect.min_y) && (ydrawpos <= cliprect.max_y)) { - srcline = BITMAP_ADDR16(state->m_sprite_bitmap, (starty+(y>>7))&0xfff, 0); - dstline = BITMAP_ADDR16(bitmap, ydrawpos, 0); + srcline = &state->m_sprite_bitmap->pix16((starty+(y>>7))&0xfff); + dstline = &bitmap.pix16(ydrawpos); for (x=0;x>7))&0xfff]; if (pixdata) - if ((xdrawpos >= cliprect->min_x) && (xdrawpos <= cliprect->max_x)) + if ((xdrawpos >= cliprect.min_x) && (xdrawpos <= cliprect.max_x)) dstline[xdrawpos] = pixdata; } } @@ -367,20 +367,17 @@ state->m_tilemap[3] = tilemap_create(machine, get_rabbit_tilemap3_tile_info,tilemap_scan_rows, 8, 8, 128,32); /* the tilemaps mix 4bpp and 8bbp tiles, we split these into 2 groups, and set a different transpen for each group */ - tilemap_map_pen_to_layer(state->m_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[3], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_tilemap[3], 1, 255, TILEMAP_PIXEL_TRANSPARENT); - - state->m_sprite_bitmap = auto_bitmap_alloc(machine,0x1000,0x1000,machine.primary_screen->format()); - state->m_sprite_clip.min_x = 0; - state->m_sprite_clip.max_x = 0x1000-1; - state->m_sprite_clip.min_y = 0; - state->m_sprite_clip.max_y = 0x1000-1; + state->m_tilemap[0]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[0]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[1]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[1]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[2]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[2]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[3]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_tilemap[3]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); + + state->m_sprite_bitmap = auto_bitmap_ind16_alloc(machine,0x1000,0x1000); + state->m_sprite_clip.set(0, 0x1000-1, 0, 0x1000-1); } /* @@ -405,7 +402,7 @@ */ -static void rabbit_drawtilemap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int whichtilemap ) +static void rabbit_drawtilemap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int whichtilemap ) { rabbit_state *state = machine.driver_data(); INT32 startx, starty, incxx, incxy, incyx, incyy, tran; @@ -423,18 +420,18 @@ startx/starty are also 16.16 scrolling */ - tilemap_draw_roz(bitmap,cliprect,state->m_tilemap[whichtilemap],startx << 12,starty << 12, + state->m_tilemap[whichtilemap]->draw_roz(bitmap, cliprect, startx << 12,starty << 12, incxx << 5,incxy << 8,incyx << 8,incyy << 5, 1, /* wraparound */ tran ? 0 : TILEMAP_DRAW_OPAQUE,0); } -static SCREEN_UPDATE(rabbit) +static SCREEN_UPDATE_IND16(rabbit) { - rabbit_state *state = screen->machine().driver_data(); + rabbit_state *state = screen.machine().driver_data(); int prilevel; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // popmessage("%08x %08x", state->m_viewregs0[0], state->m_viewregs0[1]); // popmessage("%08x %08x %08x %08x %08x %08x", state->m_tilemap_regs[0][0],state->m_tilemap_regs[0][1],state->m_tilemap_regs[0][2],state->m_tilemap_regs[0][3],state->m_tilemap_regs[0][4],state->m_tilemap_regs[0][5]); @@ -452,16 +449,16 @@ /* prio isnt certain but seems to work.. */ for (prilevel = 0xf; prilevel >0; prilevel--) { - if (prilevel == ((state->m_tilemap_regs[3][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen->machine(),bitmap,cliprect, 3); - if (prilevel == ((state->m_tilemap_regs[2][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen->machine(),bitmap,cliprect, 2); - if (prilevel == ((state->m_tilemap_regs[1][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen->machine(),bitmap,cliprect, 1); - if (prilevel == ((state->m_tilemap_regs[0][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen->machine(),bitmap,cliprect, 0); + if (prilevel == ((state->m_tilemap_regs[3][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen.machine(),bitmap,cliprect, 3); + if (prilevel == ((state->m_tilemap_regs[2][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen.machine(),bitmap,cliprect, 2); + if (prilevel == ((state->m_tilemap_regs[1][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen.machine(),bitmap,cliprect, 1); + if (prilevel == ((state->m_tilemap_regs[0][0]&0x0f000000)>>24)) rabbit_drawtilemap(screen.machine(),bitmap,cliprect, 0); if (prilevel == 0x09) // should it be selectable? { - rabbit_clearspritebitmap(screen->machine(),bitmap,cliprect); - draw_sprites(screen->machine(),bitmap,cliprect); // render to bitmap - draw_sprite_bitmap(screen->machine(),bitmap,cliprect); // copy bitmap to screen + rabbit_clearspritebitmap(screen.machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); // render to bitmap + draw_sprite_bitmap(screen.machine(),bitmap,cliprect); // copy bitmap to screen } } return 0; @@ -666,7 +663,7 @@ blt_source+=2; writeoffs=blt_oddflg+blt_column; state->m_tilemap_ram[blt_tilemp][writeoffs]=(state->m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<m_tilemap[blt_tilemp],writeoffs); + state->m_tilemap[blt_tilemp]->mark_tile_dirty(writeoffs); blt_column++; blt_column&=0x7f; @@ -683,7 +680,7 @@ { writeoffs=blt_oddflg+blt_column; state->m_tilemap_ram[blt_tilemp][writeoffs]=(state->m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<m_tilemap[blt_tilemp],writeoffs); + state->m_tilemap[blt_tilemp]->mark_tile_dirty(writeoffs); blt_column++; blt_column&=0x7f; } @@ -964,12 +961,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) // MCFG_SCREEN_VISIBLE_AREA(0*8, 64*16-1, 0*16, 64*16-1) // MCFG_SCREEN_VISIBLE_AREA(0*8, 20*16-1, 32*16, 48*16-1) - MCFG_SCREEN_UPDATE(rabbit) + MCFG_SCREEN_UPDATE_STATIC(rabbit) MCFG_PALETTE_LENGTH(0x4000) MCFG_PALETTE_INIT( all_black ) // the status bar palette doesn't get transfered (or our colour select is wrong).. more obvious when it's black than in 'MAME default' colours diff -Nru mame-0.144/src/mame/drivers/raiden2.c mame-0.145/src/mame/drivers/raiden2.c --- mame-0.144/src/mame/drivers/raiden2.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/raiden2.c 2012-02-06 21:30:40.000000000 +0000 @@ -629,7 +629,7 @@ /* SPRITE DRAWING (move to video file) */ -void raiden2_state::draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ,int pri_mask ) +void raiden2_state::draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ,int pri_mask ) { UINT16 *source = sprites + sprites_cur_start/2 - 4; @@ -724,25 +724,25 @@ WRITE16_MEMBER(raiden2_state::raiden2_background_w) { COMBINE_DATA(&back_data[offset]); - tilemap_mark_tile_dirty(background_layer, offset); + background_layer->mark_tile_dirty(offset); } WRITE16_MEMBER(raiden2_state::raiden2_midground_w) { COMBINE_DATA(&mid_data[offset]); - tilemap_mark_tile_dirty(midground_layer,offset); + midground_layer->mark_tile_dirty(offset); } WRITE16_MEMBER(raiden2_state::raiden2_foreground_w) { COMBINE_DATA(&fore_data[offset]); - tilemap_mark_tile_dirty(foreground_layer,offset); + foreground_layer->mark_tile_dirty(offset); } WRITE16_MEMBER(raiden2_state::raiden2_text_w) { COMBINE_DATA(&text_data[offset]); - tilemap_mark_tile_dirty(text_layer, offset); + text_layer->mark_tile_dirty(offset); } WRITE16_MEMBER(raiden2_state::tilemap_enable_w) @@ -762,9 +762,9 @@ case 2: tm = foreground_layer; break; } if(offset & 1) - tilemap_set_scrolly(tm, 0, data); + tm->set_scrolly(0, data); else - tilemap_set_scrollx(tm, 0, data); + tm->set_scrollx(0, data); } WRITE16_MEMBER(raiden2_state::tile_bank_01_w) @@ -774,13 +774,13 @@ new_bank = 0 | ((data & 1)<<1); if(new_bank != bg_bank) { bg_bank = new_bank; - tilemap_mark_all_tiles_dirty(background_layer); + background_layer->mark_all_dirty(); } new_bank = 1 | (data & 2); if(new_bank != mid_bank) { mid_bank = new_bank; - tilemap_mark_all_tiles_dirty(midground_layer); + midground_layer->mark_all_dirty(); } } } @@ -798,7 +798,7 @@ int new_bank = 4 | (data >> 14); if(new_bank != fg_bank) { fg_bank = new_bank; - tilemap_mark_all_tiles_dirty(foreground_layer); + foreground_layer->mark_all_dirty(); } } } @@ -811,7 +811,7 @@ int new_bank = 4 | ((cop_bank >> 10) & 3); if(new_bank != fg_bank) { fg_bank = new_bank; - tilemap_mark_all_tiles_dirty(foreground_layer); + foreground_layer->mark_all_dirty(); } /* probably bit 3 is from 6c9 */ @@ -879,46 +879,46 @@ state->midground_layer = tilemap_create(machine, get_mid_tile_info, tilemap_scan_rows, 16,16, 32,32 ); state->foreground_layer = tilemap_create(machine, get_fore_tile_info, tilemap_scan_rows, 16,16, 32,32 ); - tilemap_set_transparent_pen(state->midground_layer, 15); - tilemap_set_transparent_pen(state->foreground_layer, 15); - tilemap_set_transparent_pen(state->text_layer, 15); + state->midground_layer->set_transparent_pen(15); + state->foreground_layer->set_transparent_pen(15); + state->text_layer->set_transparent_pen(15); } -/* SCREEN_UPDATE (move to video file) */ +/* SCREEN_UPDATE_IND16 (move to video file) */ -static SCREEN_UPDATE( raiden2 ) +static SCREEN_UPDATE_IND16( raiden2 ) { - raiden2_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + raiden2_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - //if (!screen->machine().input().code_pressed(KEYCODE_Q)) + //if (!screen.machine().input().code_pressed(KEYCODE_Q)) { if (!(state->raiden2_tilemap_enable & 1)) - tilemap_draw(bitmap, cliprect, state->background_layer, 0, 0); + state->background_layer->draw(bitmap, cliprect, 0, 0); } - //if (!screen->machine().input().code_pressed(KEYCODE_W)) + //if (!screen.machine().input().code_pressed(KEYCODE_W)) { if (!(state->raiden2_tilemap_enable & 2)) - tilemap_draw(bitmap, cliprect, state->midground_layer, 0, 0); + state->midground_layer->draw(bitmap, cliprect, 0, 0); } - //if (!screen->machine().input().code_pressed(KEYCODE_E)) + //if (!screen.machine().input().code_pressed(KEYCODE_E)) { if (!(state->raiden2_tilemap_enable & 4)) - tilemap_draw(bitmap, cliprect, state->foreground_layer, 0, 0); + state->foreground_layer->draw(bitmap, cliprect, 0, 0); } - //if (!screen->machine().input().code_pressed(KEYCODE_S)) + //if (!screen.machine().input().code_pressed(KEYCODE_S)) { //if (!(raiden2_tilemap_enable & 0x10)) - state->draw_sprites(screen->machine(), bitmap, cliprect, 0); + state->draw_sprites(screen.machine(), bitmap, cliprect, 0); } - //if (!screen->machine().input().code_pressed(KEYCODE_A)) + //if (!screen.machine().input().code_pressed(KEYCODE_A)) { if (!(state->raiden2_tilemap_enable & 8)) - tilemap_draw(bitmap, cliprect, state->text_layer, 0, 0); + state->text_layer->draw(bitmap, cliprect, 0, 0); } return 0; @@ -1665,10 +1665,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55.47) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate *//2) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(raiden2) + MCFG_SCREEN_UPDATE_STATIC(raiden2) MCFG_GFXDECODE(raiden2) MCFG_PALETTE_LENGTH(2048) @@ -1676,6 +1675,7 @@ /* sound hardware */ SEIBU_SOUND_SYSTEM_YM2151_RAIDEN2_INTERFACE(XTAL_28_63636MHz/8,XTAL_28_63636MHz/28,1,2) + // the sound z80 has /NMI, /BUSREQ and /WAIT tied high/unused /* Sound hardware infos: Z80 and YM2151 are clocked at XTAL_28_63636MHz/8 */ @@ -1721,10 +1721,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55.47) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate *//2) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0, 32*8-1) - MCFG_SCREEN_UPDATE(raiden2) + MCFG_SCREEN_UPDATE_STATIC(raiden2) MCFG_GFXDECODE(raiden2) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/raiden.c mame-0.145/src/mame/drivers/raiden.c --- mame-0.144/src/mame/drivers/raiden.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/raiden.c 2012-02-06 21:30:37.000000000 +0000 @@ -242,10 +242,14 @@ device_set_input_line_and_vector(device, 0, HOLD_LINE, 0xc8/4); /* VBL */ } -static SCREEN_EOF( raiden ) +static SCREEN_VBLANK( raiden ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space,0,0,0xffff); /* Could be a memory location instead */ + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram16_w(space,0,0,0xffff); /* Could be a memory location instead */ + } } static MACHINE_CONFIG_START( raiden, raiden_state ) @@ -271,11 +275,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.60) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(raiden) - MCFG_SCREEN_EOF(raiden) + MCFG_SCREEN_UPDATE_STATIC(raiden) + MCFG_SCREEN_VBLANK_STATIC(raiden) MCFG_GFXDECODE(raiden) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/rainbow.c mame-0.145/src/mame/drivers/rainbow.c --- mame-0.144/src/mame/drivers/rainbow.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/rainbow.c 2012-02-06 21:30:41.000000000 +0000 @@ -100,7 +100,7 @@ The first code segment is entered at the start of a secret room. - rainbowo rainbow + rbislando rbisland $55EE lea $C01308,a0 $55EE lea $C00B08,a0 move.w #$13,d0 bsr $561C $55F8 move.w #$15fa,2(a0) lea $C00D08,a0 @@ -118,7 +118,7 @@ point bonus. If you have entered all 10 secret rooms, you receive a 50,000,000 point bonus. (BUG THAT'S NOT A BUG - the games says 1,000,000 and 5,000,000, but the code gives you 10mil and 50mil) - The counter is in $10D05C.b, the (rainbowo) romset never increments this counter, making + The counter is in $10D05C.b, the (rbislando) romset never increments this counter, making it impossible to achieve. $56A2 cmpi.w #$31,$11c6(a5) $56CA addi.b #1,$105C(a5) ;increment the secret room count @@ -126,9 +126,9 @@ bne The final change fixes a Secret room bug that was noted by Stefan Jokisch. - In (rainbowo) it is possible to scroll the screen inside a secret room. + In (rbislando) it is possible to scroll the screen inside a secret room. You can walk right off the top of the screen, and scroll the 'next' secret - room into view. This is fixed in (rainbow) with the following code; + room into view. This is fixed in (rbisland) with the following code; $5F06 move.b #1,d0 $5F34 tst.b $11c4(a5) ; in secret room? jsr $1736 bne $600A ; exit this routine, which is getting @@ -137,7 +137,7 @@ ... $600A rts - The (jumping) bootleg is based on the (rainbowo) roms. + The (jumping) bootleg is based on the (rbislando) roms. Notes on Rainbow Islands Extra by Robert Gallagher -------------------------------------------------- @@ -283,13 +283,13 @@ Stephh's notes (based on the game M68000 code and some tests) : -1) 'rainbow*' +1) 'rbisland*' - Region stored at 0x02fffe.w - Sets : - * 'rainbow' : region = 0x0000 - * 'rainbowo' : region = 0x0000 - * 'rainbowe' : region = 0x0000 + * 'rbisland' : region = 0x0000 + * 'rbislando' : region = 0x0000 + * 'rbislande' : region = 0x0000 - Possible regions : * 0x0000 : Japan * 0x0001 : US @@ -331,7 +331,7 @@ static WRITE16_HANDLER( jumping_sound_w ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); if (ACCESSING_BITS_0_7) { @@ -345,20 +345,20 @@ MEMORY STRUCTURES ***************************************************************************/ -static ADDRESS_MAP_START( rainbow_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( rbisland_map, AS_PROGRAM, 16 ) AM_RANGE(0x000000, 0x07ffff) AM_ROM AM_RANGE(0x10c000, 0x10ffff) AM_RAM /* main RAM */ AM_RANGE(0x200000, 0x200fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x201000, 0x203fff) AM_RAM /* r/w in initial checks */ AM_RANGE(0x390000, 0x390003) AM_READ_PORT("DSWA") - AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE(rainbow_spritectrl_w) + AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE(rbisland_spritectrl_w) AM_RANGE(0x3b0000, 0x3b0003) AM_READ_PORT("DSWB") AM_RANGE(0x3c0000, 0x3c0003) AM_WRITENOP /* written very often, watchdog? */ AM_RANGE(0x3e0000, 0x3e0001) AM_READNOP AM_DEVWRITE8("tc0140syt", tc0140syt_port_w, 0x00ff) AM_RANGE(0x3e0002, 0x3e0003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_comm_r,tc0140syt_comm_w, 0x00ff) - AM_RANGE(0x800000, 0x8007ff) AM_READWRITE(rainbow_cchip_ram_r,rainbow_cchip_ram_w) - AM_RANGE(0x800802, 0x800803) AM_READWRITE(rainbow_cchip_ctrl_r,rainbow_cchip_ctrl_w) - AM_RANGE(0x800c00, 0x800c01) AM_WRITE(rainbow_cchip_bank_w) + AM_RANGE(0x800000, 0x8007ff) AM_READWRITE(rbisland_cchip_ram_r,rbisland_cchip_ram_w) + AM_RANGE(0x800802, 0x800803) AM_READWRITE(rbisland_cchip_ctrl_r,rbisland_cchip_ctrl_w) + AM_RANGE(0x800c00, 0x800c01) AM_WRITE(rbisland_cchip_bank_w) AM_RANGE(0xc00000, 0xc0ffff) AM_DEVREADWRITE("pc080sn", pc080sn_word_r, pc080sn_word_w) AM_RANGE(0xc20000, 0xc20003) AM_DEVWRITE("pc080sn", pc080sn_yscroll_word_w) AM_RANGE(0xc40000, 0xc40003) AM_DEVWRITE("pc080sn", pc080sn_xscroll_word_w) @@ -380,10 +380,10 @@ AM_RANGE(0x400006, 0x400007) AM_WRITE(jumping_sound_w) AM_RANGE(0x420000, 0x420001) AM_READNOP /* read, but result not used */ AM_RANGE(0x430000, 0x430003) AM_DEVWRITE("pc080sn", pc080sn_yscroll_word_w) - AM_RANGE(0x440000, 0x4407ff) AM_RAM AM_BASE_SIZE_MEMBER(rainbow_state, m_spriteram, m_spriteram_size) + AM_RANGE(0x440000, 0x4407ff) AM_RAM AM_BASE_SIZE_MEMBER(rbisland_state, m_spriteram, m_spriteram_size) AM_RANGE(0x800000, 0x80ffff) AM_WRITENOP /* original c-chip location (not used) */ AM_RANGE(0xc00000, 0xc0ffff) AM_DEVREADWRITE("pc080sn", pc080sn_word_r, pc080sn_word_w) - AM_RANGE(0xc20000, 0xc20003) AM_WRITENOP /* seems it is a leftover from rainbow: scroll y written here too */ + AM_RANGE(0xc20000, 0xc20003) AM_WRITENOP /* seems it is a leftover from rbisland: scroll y written here too */ AM_RANGE(0xc40000, 0xc40003) AM_DEVWRITE("pc080sn", pc080sn_xscroll_word_w) AM_RANGE(0xd00000, 0xd01fff) AM_RAM /* original spriteram location, needed for Attract Mode */ ADDRESS_MAP_END @@ -403,12 +403,12 @@ static READ8_HANDLER( jumping_latch_r ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); return state->m_jumping_latch; } -static ADDRESS_MAP_START( rainbow_sound_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( rbisland_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0x8fff) AM_RAM @@ -433,7 +433,7 @@ INPUT PORTS, DIPs ***********************************************************/ -static INPUT_PORTS_START( rainbow_generic ) +static INPUT_PORTS_START( rbisland_generic ) PORT_START("DSWA") TAITO_MACHINE_COCKTAIL PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) @@ -476,8 +476,8 @@ PORT_DIPSETTING( 0x00, "Mode B (World)" ) /* Mode B is TAITO_COINAGE_WORLD */ INPUT_PORTS_END -static INPUT_PORTS_START( rainbow ) - PORT_INCLUDE(rainbow_generic) +static INPUT_PORTS_START( rbisland ) + PORT_INCLUDE(rbisland_generic) /* 0x390000 -> 0x10cfc2 ($fc2,A5) : DSWA */ @@ -524,7 +524,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( jumping ) - PORT_INCLUDE(rainbow_generic) + PORT_INCLUDE(rbisland_generic) /* 0x400000 -> 0x10cfc2 ($fc2,A5) */ PORT_MODIFY("DSWA") @@ -585,7 +585,7 @@ 128*8 /* every sprite takes 128 consecutive bytes */ }; -static GFXDECODE_START( rainbow ) +static GFXDECODE_START( rbisland ) GFXDECODE_ENTRY( "gfx2", 0x000000, spritelayout, 0, 0x80 ) /* OBJ 16x16 */ GFXDECODE_ENTRY( "gfx1", 0x000000, tilelayout, 0, 0x80 ) /* SCR 8x8 */ GFXDECODE_END @@ -627,7 +627,7 @@ static void irqhandler( device_t *device, int irq ) { - rainbow_state *state = device->machine().driver_data(); + rbisland_state *state = device->machine().driver_data(); device_set_input_line(state->m_audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE); } @@ -642,7 +642,7 @@ MACHINE DRIVERS ***********************************************************/ -static const pc080sn_interface rainbow_pc080sn_intf = +static const pc080sn_interface rbisland_pc080sn_intf = { 1, /* gfxnum */ 0, 0, 0, 0 /* x_offset, y_offset, y_invert, dblwidth */ @@ -654,19 +654,19 @@ 0, 0, 1, 0 /* x_offset, y_offset, y_invert, dblwidth */ }; -static const pc090oj_interface rainbow_pc090oj_intf = +static const pc090oj_interface rbisland_pc090oj_intf = { 0, 0, 0, 0 }; -static const tc0140syt_interface rainbow_tc0140syt_intf = +static const tc0140syt_interface rbisland_tc0140syt_intf = { "maincpu", "audiocpu" }; -static MACHINE_START( rainbow ) +static MACHINE_START( rbisland ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); state->m_maincpu = machine.device("maincpu"); state->m_audiocpu = machine.device("audiocpu"); @@ -674,34 +674,33 @@ state->m_pc090oj = machine.device("pc090oj"); } -static MACHINE_CONFIG_START( rainbow, rainbow_state ) +static MACHINE_CONFIG_START( rbisland, rbisland_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz/2) /* verified on pcb */ - MCFG_CPU_PROGRAM_MAP(rainbow_map) + MCFG_CPU_PROGRAM_MAP(rbisland_map) MCFG_CPU_VBLANK_INT("screen", irq4_line_hold) MCFG_CPU_ADD("audiocpu", Z80, XTAL_16MHz/4) /* verified on pcb */ - MCFG_CPU_PROGRAM_MAP(rainbow_sound_map) + MCFG_CPU_PROGRAM_MAP(rbisland_sound_map) MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ - MCFG_MACHINE_START(rainbow) + MCFG_MACHINE_START(rbisland) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rainbow) + MCFG_SCREEN_UPDATE_STATIC(rainbow) - MCFG_GFXDECODE(rainbow) + MCFG_GFXDECODE(rbisland) MCFG_PALETTE_LENGTH(8192) - MCFG_PC080SN_ADD("pc080sn", rainbow_pc080sn_intf) - MCFG_PC090OJ_ADD("pc090oj", rainbow_pc090oj_intf) + MCFG_PC080SN_ADD("pc080sn", rbisland_pc080sn_intf) + MCFG_PC090OJ_ADD("pc090oj", rbisland_pc090oj_intf) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -711,12 +710,12 @@ MCFG_SOUND_ROUTE(0, "mono", 0.50) MCFG_SOUND_ROUTE(1, "mono", 0.50) - MCFG_TC0140SYT_ADD("tc0140syt", rainbow_tc0140syt_intf) + MCFG_TC0140SYT_ADD("tc0140syt", rbisland_tc0140syt_intf) MACHINE_CONFIG_END /* Jumping: The PCB has 2 Xtals, 24MHz and 18,432MHz */ -static MACHINE_CONFIG_START( jumping, rainbow_state ) +static MACHINE_CONFIG_START( jumping, rbisland_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/3) /* not verified but matches original */ @@ -728,16 +727,15 @@ MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough ? */ - MCFG_MACHINE_START(rainbow) + MCFG_MACHINE_START(rbisland) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jumping) + MCFG_SCREEN_UPDATE_STATIC(jumping) MCFG_GFXDECODE(jumping) MCFG_PALETTE_LENGTH(8192) @@ -761,7 +759,7 @@ DRIVERS ***************************************************************************/ -ROM_START( rainbow ) +ROM_START( rbisland ) ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD16_BYTE( "b22-10-1.19", 0x00000, 0x10000, CRC(e34a50ca) SHA1(17a92cd7182db1e18000b1ae689758fcfd70fe16) ) ROM_LOAD16_BYTE( "b22-11-1.20", 0x00001, 0x10000, CRC(6a31a093) SHA1(1e99ae47811c0d3774d138dab02ac50bc1b92173) ) @@ -770,6 +768,9 @@ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) ) ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) ) + ROM_REGION( 0x10000, "cchip", 0 ) + ROM_LOAD( "cchip_b22-15.53", 0x00000, 0x10000, NO_DUMP ) + ROM_REGION( 0x1c000, "audiocpu", 0 ) ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) ) ROM_CONTINUE( 0x10000, 0xc000 ) @@ -783,7 +784,7 @@ ROM_LOAD16_BYTE( "b22-13.6", 0x80001, 0x10000, CRC(2fda099f) SHA1(a1e27a4497f6733608be924d69d965b19f725b99) ) ROM_END -ROM_START( rainbowo ) +ROM_START( rbislando ) ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD16_BYTE( "b22-10.19", 0x00000, 0x10000, CRC(3b013495) SHA1(fc89f401a80b9bde174df8a257bb7fad4937c838) ) ROM_LOAD16_BYTE( "b22-11.20", 0x00001, 0x10000, CRC(80041a3d) SHA1(619d71a2bef5fd898a15d37d8016850f832428c3) ) @@ -792,6 +793,9 @@ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) ) ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) ) + ROM_REGION( 0x10000, "cchip", 0 ) + ROM_LOAD( "cchip_b22-15.53", 0x00000, 0x10000, NO_DUMP ) + ROM_REGION( 0x1c000, "audiocpu", 0 ) ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) ) ROM_CONTINUE( 0x10000, 0xc000 ) @@ -805,7 +809,7 @@ ROM_LOAD16_BYTE( "b22-13.6", 0x80001, 0x10000, CRC(2fda099f) SHA1(a1e27a4497f6733608be924d69d965b19f725b99) ) ROM_END -ROM_START( rainbowe ) +ROM_START( rbislande ) ROM_REGION( 0x80000, "maincpu", 0 ) ROM_LOAD16_BYTE( "b39-01.19", 0x00000, 0x10000, CRC(50690880) SHA1(88cd8739eaa6e4e5988be225c31d2a6605173d39) ) ROM_LOAD16_BYTE( "b39-02.20", 0x00001, 0x10000, CRC(4dead71f) SHA1(03e9df33fc8fc64d6eeb1c3a763acac00b10c071) ) @@ -814,6 +818,9 @@ ROM_LOAD16_BYTE( "b22-03.23", 0x40000, 0x20000, CRC(3ebb0fb8) SHA1(1b41b305623d121255eb70cb992e4d9da13abd82) ) ROM_LOAD16_BYTE( "b22-04.24", 0x40001, 0x20000, CRC(91625e7f) SHA1(765afd973d9b82bb496b04beca284bf2769d6e6f) ) + ROM_REGION( 0x10000, "cchip", 0 ) + ROM_LOAD( "cchip_b39-05.53", 0x00000, 0x10000, NO_DUMP ) + ROM_REGION( 0x1c000, "audiocpu", 0 ) ROM_LOAD( "b22-14.43", 0x00000, 0x4000, CRC(113c1a5b) SHA1(effa2adf54a6be78b2d4baf3a47529342fb0d895) ) ROM_CONTINUE( 0x10000, 0xc000 ) @@ -852,7 +859,7 @@ ROM_LOAD( "jb2_ic14", 0x60000, 0x10000, CRC(9fdc6c8e) SHA1(ff4e1a98dc982bce2f9d235cac62c7166f477f64) ) ROM_LOAD( "jb2_ic13", 0x70000, 0x10000, CRC(06226492) SHA1(834280ec49e61a0c9c6b6fe2033e1b20bd1bffbf) ) - ROM_REGION( 0xa0000, "gfx2", 0 ) + ROM_REGION( 0xa0000, "gfx2", ROMREGION_INVERT ) ROM_LOAD( "jb2_ic62", 0x00000, 0x10000, CRC(8548db6c) SHA1(675cd301259d5ed16098a38ac58b27b5ccd91264) ) /* sprites */ ROM_LOAD( "jb2_ic61", 0x10000, 0x10000, CRC(37c5923b) SHA1(c83ef45564c56ef62d7019aecbd79dccc671deee) ) ROM_LOAD( "jb2_ic60", 0x20000, 0x08000, CRC(662a2f1e) SHA1(1c5e8b1f0623e64faf9cd60f9653fc5957191a9b) ) @@ -868,42 +875,33 @@ ROM_END -static DRIVER_INIT( rainbow ) +static DRIVER_INIT( rbisland ) { UINT8 *ROM = machine.region("audiocpu")->base(); memory_configure_bank(machine, "bank1", 0, 4, &ROM[0xc000], 0x4000); - rainbow_cchip_init(machine, 0); + rbisland_cchip_init(machine, 0); } -static DRIVER_INIT( rainbowe ) +static DRIVER_INIT( rbislande ) { UINT8 *ROM = machine.region("audiocpu")->base(); memory_configure_bank(machine, "bank1", 0, 4, &ROM[0xc000], 0x4000); - rainbow_cchip_init(machine, 1); + rbisland_cchip_init(machine, 1); } static DRIVER_INIT( jumping ) { - rainbow_state *state = machine.driver_data(); - int i, len = machine.region("gfx2")->bytes(); - UINT8 *rom = machine.region("gfx2")->base(); - - /* Sprite colour map is reversed - switch to normal */ - - for (i = 0; i < len; i++) - rom[i] ^= 0xff; - + rbisland_state *state = machine.driver_data(); state->m_jumping_latch = 0; - state->save_item(NAME(state->m_jumping_latch)); } -GAME( 1987, rainbow, 0, rainbow, rainbow, rainbow, ROT0, "Taito Corporation", "Rainbow Islands (new version)", GAME_SUPPORTS_SAVE ) -GAME( 1987, rainbowo, rainbow, rainbow, rainbow, rainbow, ROT0, "Taito Corporation", "Rainbow Islands (old version)", GAME_SUPPORTS_SAVE ) -GAME( 1988, rainbowe, rainbow, rainbow, rainbow, rainbowe, ROT0, "Taito Corporation", "Rainbow Islands (Extra)", GAME_SUPPORTS_SAVE ) -GAME( 1989, jumping, rainbow, jumping, jumping, jumping, ROT0, "bootleg", "Jumping", GAME_SUPPORTS_SAVE ) +GAME( 1987, rbisland, 0, rbisland, rbisland, rbisland, ROT0, "Taito Corporation", "Rainbow Islands (new version)", GAME_SUPPORTS_SAVE ) +GAME( 1987, rbislando, rbisland, rbisland, rbisland, rbisland, ROT0, "Taito Corporation", "Rainbow Islands (old version)", GAME_SUPPORTS_SAVE ) +GAME( 1988, rbislande, rbisland, rbisland, rbisland, rbislande, ROT0, "Taito Corporation", "Rainbow Islands (Extra)", GAME_SUPPORTS_SAVE ) +GAME( 1989, jumping, rbisland, jumping, jumping, jumping, ROT0, "bootleg", "Jumping", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/rallyx.c mame-0.145/src/mame/drivers/rallyx.c --- mame-0.144/src/mame/drivers/rallyx.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/rallyx.c 2012-02-06 21:30:38.000000000 +0000 @@ -235,7 +235,7 @@ break; case 0x01: /* INT ON */ - cpu_interrupt_enable(state->m_maincpu, bit); + state->m_main_irq_mask = bit; if (!bit) device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); break; @@ -247,7 +247,7 @@ case 0x03: /* FLIP */ flip_screen_set_no_update(space->machine(), bit); - tilemap_set_flip_all(space->machine(), bit * (TILEMAP_FLIPX | TILEMAP_FLIPY)); + space->machine().tilemap().set_flip_all(bit * (TILEMAP_FLIPX | TILEMAP_FLIPY)); break; case 0x04: @@ -281,7 +281,7 @@ break; case 0x01: /* INTST */ - cpu_interrupt_enable(state->m_maincpu, bit); + state->m_main_irq_mask = bit; break; case 0x02: /* MUT */ @@ -290,7 +290,7 @@ case 0x03: /* FLIP */ flip_screen_set_no_update(space->machine(), bit); - tilemap_set_flip_all(space->machine(), bit * (TILEMAP_FLIPX | TILEMAP_FLIPY)); + space->machine().tilemap().set_flip_all(bit * (TILEMAP_FLIPX | TILEMAP_FLIPY)); break; case 0x04: /* OUT1 */ @@ -857,7 +857,7 @@ static const char *const rallyx_sample_names[] = { "*rallyx", - "bang.wav", + "bang", 0 /* end of array */ }; @@ -894,13 +894,29 @@ state->m_stars_enable = 0; } +static INTERRUPT_GEN( rallyx_vblank_irq ) +{ + rallyx_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} + +static INTERRUPT_GEN( jungler_vblank_irq ) +{ + rallyx_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( rallyx, rallyx_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(rallyx_map) MCFG_CPU_IO_MAP(io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", rallyx_vblank_irq) MCFG_MACHINE_START(rallyx) MCFG_MACHINE_RESET(rallyx) @@ -911,10 +927,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rallyx) + MCFG_SCREEN_UPDATE_STATIC(rallyx) MCFG_GFXDECODE(rallyx) MCFG_PALETTE_LENGTH(64*4+4) @@ -940,7 +955,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(jungler_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", jungler_vblank_irq) MCFG_MACHINE_START(rallyx) MCFG_MACHINE_RESET(rallyx) @@ -951,10 +966,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(jungler) + MCFG_SCREEN_UPDATE_STATIC(jungler) MCFG_GFXDECODE(jungler) MCFG_PALETTE_LENGTH(64*4+4+64) @@ -974,7 +988,7 @@ /* video hardware */ MCFG_VIDEO_START(locomotn) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(locomotn) + MCFG_SCREEN_UPDATE_STATIC(locomotn) MACHINE_CONFIG_END @@ -985,7 +999,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(locomotn) + MCFG_SCREEN_UPDATE_STATIC(locomotn) MCFG_VIDEO_START(locomotn) MACHINE_CONFIG_END @@ -997,7 +1011,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(locomotn) + MCFG_SCREEN_UPDATE_STATIC(locomotn) MCFG_VIDEO_START(commsega) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/rampart.c mame-0.145/src/mame/drivers/rampart.c --- mame-0.144/src/mame/drivers/rampart.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rampart.c 2012-02-06 21:30:38.000000000 +0000 @@ -360,11 +360,10 @@ MCFG_PALETTE_LENGTH(512) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 456, 0+12, 336+12, 262, 0, 240) - MCFG_SCREEN_UPDATE(rampart) + MCFG_SCREEN_UPDATE_STATIC(rampart) MCFG_VIDEO_START(rampart) diff -Nru mame-0.144/src/mame/drivers/rastan.c mame-0.145/src/mame/drivers/rastan.c --- mame-0.144/src/mame/drivers/rastan.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/rastan.c 2012-02-06 21:30:39.000000000 +0000 @@ -428,10 +428,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(rastan) + MCFG_SCREEN_UPDATE_STATIC(rastan) MCFG_GFXDECODE(rastan) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/rbmk.c mame-0.145/src/mame/drivers/rbmk.c --- mame-0.144/src/mame/drivers/rbmk.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/rbmk.c 2012-02-06 21:30:39.000000000 +0000 @@ -491,9 +491,9 @@ { } -static SCREEN_UPDATE(rbmk) +static SCREEN_UPDATE_IND16(rbmk) { - rbmk_state *state = screen->machine().driver_data(); + rbmk_state *state = screen.machine().driver_data(); int x,y; int count = 0; @@ -502,7 +502,7 @@ for (x=0;x<64;x++) { int tile = state->m_gms_vidram2[count+0x600]; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0],(tile&0xfff)+((state->m_tilebank&0x10)>>4)*0x1000,tile>>12,0,0,x*8,y*32); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0],(tile&0xfff)+((state->m_tilebank&0x10)>>4)*0x1000,tile>>12,0,0,x*8,y*32); count++; } } @@ -514,7 +514,7 @@ for (x=0;x<64;x++) { int tile = state->m_gms_vidram[count]; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1],(tile&0xfff)+((state->m_tilebank>>1)&3)*0x1000,tile>>12,0,0,x*8,y*8,0); + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1],(tile&0xfff)+((state->m_tilebank>>1)&3)*0x1000,tile>>12,0,0,x*8,y*8,0); count++; } } @@ -542,10 +542,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(rbmk) + MCFG_SCREEN_UPDATE_STATIC(rbmk) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/rcorsair.c mame-0.145/src/mame/drivers/rcorsair.c --- mame-0.144/src/mame/drivers/rcorsair.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/rcorsair.c 2012-02-06 21:30:42.000000000 +0000 @@ -46,6 +46,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i8085/i8085.h" @@ -54,12 +56,23 @@ { public: rcorsair_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; -static ADDRESS_MAP_START( rcorsair_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( rcorsair_map, AS_PROGRAM, 8, rcorsair_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM ADDRESS_MAP_END @@ -106,11 +119,11 @@ GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 16 ) GFXDECODE_END -static VIDEO_START( rcorsair ) +void rcorsair_state::video_start() { } -static SCREEN_UPDATE( rcorsair ) +UINT32 rcorsair_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; @@ -128,15 +141,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(rcorsair_state, screen_update) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(rcorsair) MCFG_GFXDECODE(rcorsair) MCFG_PALETTE_LENGTH(0x100) - - MCFG_VIDEO_START(rcorsair) MACHINE_CONFIG_END ROM_START( rcorsair ) @@ -159,4 +169,5 @@ ROM_LOAD( "prom_3c.bin", 0x00000, 0x100, CRC(edca1d4a) SHA1(a5ff659cffcd09cc161960da8f5cdd234e0db92c) ) // ? ROM_END -GAME( 1984, rcorsair, 0, rcorsair, inports, 0, ROT90, "Nakasawa", "Red Corsair", GAME_NOT_WORKING | GAME_NO_SOUND ) + +GAME( 1984, rcorsair, 0, rcorsair, inports, 0, ROT90, "Nakasawa", "Red Corsair", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/re900.c mame-0.145/src/mame/drivers/re900.c --- mame-0.144/src/mame/drivers/re900.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/re900.c 2012-02-06 21:30:33.000000000 +0000 @@ -370,14 +370,6 @@ DEVCB_LINE(vdp_interrupt) }; -static SCREEN_UPDATE( re900 ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9128" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - /************************* * AY8910 Interfase * @@ -417,7 +409,7 @@ /* video hardware */ MCFG_TMS9928A_ADD( "tms9128", TMS9128, re900_tms9928a_interface ) /* TMS9128NL on pcb */ MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( re900 ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9128", tms9128_device, screen_update ) MCFG_NVRAM_ADD_0FILL("nvram") diff -Nru mame-0.144/src/mame/drivers/realbrk.c mame-0.145/src/mame/drivers/realbrk.c --- mame-0.144/src/mame/drivers/realbrk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/realbrk.c 2012-02-06 21:30:34.000000000 +0000 @@ -43,7 +43,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "machine/tmp68301.h" #include "includes/realbrk.h" #include "sound/2413intf.h" @@ -667,13 +666,8 @@ static INTERRUPT_GEN( realbrk_interrupt ) { - switch ( cpu_getiloops(device) ) - { - case 0: - /* VBlank is connected to INT1 (external interrupts pin 1) */ - tmp68301_external_interrupt_1(device->machine()); - break; - } + /* VBlank is connected to INT1 (external interrupts pin 1) */ + tmp68301_external_interrupt_1(device->machine()); } static MACHINE_CONFIG_START( realbrk, realbrk_state ) @@ -690,10 +684,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(realbrk) + MCFG_SCREEN_UPDATE_STATIC(realbrk) MCFG_GFXDECODE(realbrk) MCFG_PALETTE_LENGTH(0x8000) @@ -728,7 +721,7 @@ MCFG_GFXDECODE(dai2kaku) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(dai2kaku) + MCFG_SCREEN_UPDATE_STATIC(dai2kaku) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/redalert.c mame-0.145/src/mame/drivers/redalert.c --- mame-0.144/src/mame/drivers/redalert.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/redalert.c 2012-02-06 21:30:42.000000000 +0000 @@ -1,6 +1,6 @@ /*************************************************************************** - Irem Red Alert hardware + redalert.c, Irem M27 hardware If you have any questions about how this driver works, don't hesitate to ask. - Mike Balfour (mab22@po.cwru.edu) @@ -536,7 +536,7 @@ * *************************************/ -GAME( 1981, panther, 0, panther, panther, 0, ROT270, "Irem", "Panther", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1981, redalert, 0, redalert, redalert, 0, ROT270, "Irem / GDI", "Red Alert", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1981, ww3, 0, ww3, redalert, 0, ROT270, "Irem", "WW III", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) -GAME( 1981, demoneye, 0, demoneye, demoneye, 0, ROT270, "Irem", "Demoneye-X", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1981, panther, 0, panther, panther, 0, ROT270, "Irem", "Panther", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1981, redalert, 0, redalert, redalert, 0, ROT270, "Irem (GDI license)", "Red Alert", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1981, ww3, redalert, ww3, redalert, 0, ROT270, "Irem", "WW III", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) +GAME( 1981, demoneye, 0, demoneye, demoneye, 0, ROT270, "Irem", "Demoneye-X", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/redclash.c mame-0.145/src/mame/drivers/redclash.c --- mame-0.144/src/mame/drivers/redclash.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/redclash.c 2012-02-06 21:30:35.000000000 +0000 @@ -367,11 +367,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(redclash) - MCFG_SCREEN_EOF(redclash) + MCFG_SCREEN_UPDATE_STATIC(redclash) + MCFG_SCREEN_VBLANK_STATIC(redclash) MCFG_GFXDECODE(redclash) MCFG_PALETTE_LENGTH(4*8+4*16+32) @@ -396,11 +395,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(redclash) - MCFG_SCREEN_EOF(redclash) + MCFG_SCREEN_UPDATE_STATIC(redclash) + MCFG_SCREEN_VBLANK_STATIC(redclash) MCFG_GFXDECODE(redclash) MCFG_PALETTE_LENGTH(4*8+4*16+32) diff -Nru mame-0.144/src/mame/drivers/relief.c mame-0.145/src/mame/drivers/relief.c --- mame-0.144/src/mame/drivers/relief.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/relief.c 2012-02-06 21:30:34.000000000 +0000 @@ -310,11 +310,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a VAD chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(relief) + MCFG_SCREEN_UPDATE_STATIC(relief) MCFG_VIDEO_START(relief) diff -Nru mame-0.144/src/mame/drivers/renegade.c mame-0.145/src/mame/drivers/renegade.c --- mame-0.144/src/mame/drivers/renegade.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/renegade.c 2012-02-06 21:30:37.000000000 +0000 @@ -101,7 +101,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "cpu/m6809/m6809.h" #include "cpu/m6805/m6805.h" @@ -638,25 +637,15 @@ } } -static INTERRUPT_GEN( renegade_interrupt ) +static TIMER_DEVICE_CALLBACK( renegade_interrupt ) { -#if 0 - int port = input_port_read(machine, "IN1") & 0xc0; - if (port != 0xc0) - { - if (state->m_coin == 0) - { - state->m_coin = 1; - return irq0_line_hold(); - } - } - else state->m_coin = 0; -#endif + renegade_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device)) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - else - device_set_input_line(device, 0, HOLD_LINE); + if (scanline == 112) // ??? + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); + else if(scanline == 240) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } static WRITE8_HANDLER( renegade_coin_counter_w ) @@ -927,7 +916,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, 12000000/8) /* 1.5 MHz (measured) */ MCFG_CPU_PROGRAM_MAP(renegade_map) - MCFG_CPU_VBLANK_INT_HACK(renegade_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", renegade_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", M6809, 12000000/8) MCFG_CPU_PROGRAM_MAP(renegade_sound_map) /* IRQs are caused by the main CPU */ @@ -942,10 +931,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)*2) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0, 30*8-1) - MCFG_SCREEN_UPDATE(renegade) + MCFG_SCREEN_UPDATE_STATIC(renegade) MCFG_GFXDECODE(renegade) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/retofinv.c mame-0.145/src/mame/drivers/retofinv.c --- mame-0.144/src/mame/drivers/retofinv.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/retofinv.c 2012-02-06 21:30:38.000000000 +0000 @@ -73,19 +73,17 @@ static WRITE8_HANDLER( irq0_ack_w ) { - int bit = data & 1; - - cpu_interrupt_enable(space->machine().device("maincpu"), bit); - if (!bit) + retofinv_state *state = space->machine().driver_data(); + state->m_main_irq_mask = data & 1; + if (!state->m_main_irq_mask) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } static WRITE8_HANDLER( irq1_ack_w ) { - int bit = data & 1; - - cpu_interrupt_enable(space->machine().device("sub"), bit); - if (!bit) + retofinv_state *state = space->machine().driver_data(); + state->m_sub_irq_mask = data & 1; + if (!state->m_sub_irq_mask) cputag_set_input_line(space->machine(), "sub", 0, CLEAR_LINE); } @@ -334,18 +332,32 @@ GFXDECODE_ENTRY( "gfx3", 0, bglayout, 64*16+256*2, 64 ) GFXDECODE_END +static INTERRUPT_GEN( main_vblank_irq ) +{ + retofinv_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} + +static INTERRUPT_GEN( sub_vblank_irq ) +{ + retofinv_state *state = device->machine().driver_data(); + if(state->m_sub_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} static MACHINE_CONFIG_START( retofinv, retofinv_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz? */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("sub", Z80, 18432000/6) /* 3.072 MHz? */ MCFG_CPU_PROGRAM_MAP(sub_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, 18432000/6) /* 3.072 MHz? */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -360,10 +372,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(retofinv) + MCFG_SCREEN_UPDATE_STATIC(retofinv) MCFG_GFXDECODE(retofinv) MCFG_PALETTE_LENGTH(256*2+64*16+64*16) diff -Nru mame-0.144/src/mame/drivers/rgum.c mame-0.145/src/mame/drivers/rgum.c --- mame-0.144/src/mame/drivers/rgum.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/rgum.c 2012-02-06 21:30:39.000000000 +0000 @@ -35,11 +35,11 @@ { } -static SCREEN_UPDATE(royalgum) +static SCREEN_UPDATE_IND16(royalgum) { - rgum_state *state = screen->machine().driver_data(); + rgum_state *state = screen.machine().driver_data(); int x,y,count; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; count = 0; @@ -270,10 +270,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(royalgum) + MCFG_SCREEN_UPDATE_STATIC(royalgum) MCFG_MC6845_ADD("crtc", MC6845, 24000000/16, mc6845_intf) /* unknown clock & type, hand tuned to get ~50 fps (?) */ diff -Nru mame-0.144/src/mame/drivers/rltennis.c mame-0.145/src/mame/drivers/rltennis.c --- mame-0.144/src/mame/drivers/rltennis.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/rltennis.c 2012-02-06 21:30:35.000000000 +0000 @@ -63,6 +63,7 @@ #include "cpu/m68000/m68000.h" #include "machine/nvram.h" #include "sound/dac.h" +#include "video/ramdac.h" #define RLT_REFRESH_RATE 60 #define RLT_TIMER_FREQ (RLT_REFRESH_RATE*256) @@ -92,9 +93,9 @@ AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_RANGE(0x700000, 0x70000f) AM_WRITE(rlt_blitter_w) - AM_RANGE(0x720000, 0x720001) AM_WRITE(rlt_ramdac_address_wm_w) - AM_RANGE(0x720002, 0x720003) AM_READWRITE(rlt_ramdac_data_r, rlt_ramdac_data_w) - AM_RANGE(0x720006, 0x720007) AM_WRITE(rlt_ramdac_address_rm_w) + AM_RANGE(0x720000, 0x720001) AM_DEVWRITE8_MODERN("ramdac",ramdac_device,index_w,0x00ff) + AM_RANGE(0x720002, 0x720003) AM_DEVREADWRITE8_MODERN("ramdac",ramdac_device,pal_r,pal_w,0x00ff) + AM_RANGE(0x720006, 0x720007) AM_DEVWRITE8_MODERN("ramdac",ramdac_device,index_r_w,0x00ff) AM_RANGE(0x740000, 0x740001) AM_WRITE(rlt_snd1_w) AM_RANGE(0x760000, 0x760001) AM_WRITE(rlt_snd2_w) AM_RANGE(0x780000, 0x780001) AM_WRITENOP /* sound control, unknown, usually = 0x0044 */ @@ -162,7 +163,6 @@ rltennis_state *state = machine.driver_data(); state->m_maincpu = machine.device( "maincpu"); state->m_screen = machine.device( "screen"); - state->m_palette = auto_alloc_array(machine, UINT8, 256*3 ); state->m_dac_1 = machine.device("dac1"); state->m_dac_2 = machine.device("dac2"); state->m_samples_1 = machine.region("samples1")->base(); @@ -177,6 +177,15 @@ state->m_timer->adjust(attotime::from_hz(RLT_TIMER_FREQ)); } +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE_MODERN("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb888_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 1 +}; + static MACHINE_CONFIG_START( rltennis, rltennis_state ) MCFG_CPU_ADD("maincpu", M68000, RLT_XTAL/2) /* 68000P8 ??? */ @@ -185,11 +194,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( RLT_REFRESH_RATE ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0,319, 0, 239) - MCFG_SCREEN_UPDATE(rltennis) + MCFG_SCREEN_UPDATE_STATIC(rltennis) MCFG_PALETTE_LENGTH(256) MCFG_MACHINE_START( rltennis ) @@ -197,6 +205,7 @@ MCFG_NVRAM_ADD_0FILL("nvram") MCFG_VIDEO_START( rltennis ) + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/rmhaihai.c mame-0.145/src/mame/drivers/rmhaihai.c --- mame-0.144/src/mame/drivers/rmhaihai.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rmhaihai.c 2012-02-06 21:30:41.000000000 +0000 @@ -53,14 +53,14 @@ { rmhaihai_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( rmhaihai_colorram_w ) { rmhaihai_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -80,10 +80,10 @@ 8, 8, 64, 32); } -static SCREEN_UPDATE( rmhaihai ) +static SCREEN_UPDATE_IND16( rmhaihai ) { - rmhaihai_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + rmhaihai_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -467,10 +467,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 60*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rmhaihai) + MCFG_SCREEN_UPDATE_STATIC(rmhaihai) MCFG_GFXDECODE(rmhaihai) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/rockrage.c mame-0.145/src/mame/drivers/rockrage.c --- mame-0.144/src/mame/drivers/rockrage.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/rockrage.c 2012-02-06 21:30:38.000000000 +0000 @@ -133,30 +133,28 @@ static INPUT_PORTS_START( rockrage ) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid" ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* Invalid = both coin slots disabled */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x08, "30k and every 70k" ) - PORT_DIPSETTING( 0x00, "40k and every 80k" ) - PORT_DIPNAME( 0x10, 0x10, "Freeze Screen" ) + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, "30k & Every 70k" ) + PORT_DIPSETTING( 0x00, "40k & Every 80k" ) + PORT_DIPNAME( 0x10, 0x10, "Freeze Screen" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Medium ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -166,13 +164,11 @@ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:3" ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) @@ -280,10 +276,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rockrage) + MCFG_SCREEN_UPDATE_STATIC(rockrage) MCFG_K007342_ADD("k007342", rockrage_k007342_intf) MCFG_K007420_ADD("k007420", rockrage_k007420_intf) @@ -294,14 +289,15 @@ MCFG_PALETTE_INIT(rockrage) /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("ymsnd", YM2151, 3579545) - MCFG_SOUND_ROUTE(0, "mono", 0.60) - MCFG_SOUND_ROUTE(1, "mono", 0.60) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.60) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.60) MCFG_SOUND_ADD("vlm", VLM5030, 3579545) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.60) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.60) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/rocnrope.c mame-0.145/src/mame/drivers/rocnrope.c --- mame-0.144/src/mame/drivers/rocnrope.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rocnrope.c 2012-02-06 21:30:42.000000000 +0000 @@ -30,6 +30,12 @@ RAM[0xfff2 + offset] = data; } +static WRITE8_HANDLER( irq_mask_w ) +{ + rocnrope_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} /************************************* * @@ -56,7 +62,7 @@ AM_RANGE(0x8082, 0x8082) AM_WRITENOP /* interrupt acknowledge??? */ AM_RANGE(0x8083, 0x8083) AM_WRITENOP /* Coin counter 1 */ AM_RANGE(0x8084, 0x8084) AM_WRITENOP /* Coin counter 2 */ - AM_RANGE(0x8087, 0x8087) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x8087, 0x8087) AM_WRITE(irq_mask_w) AM_RANGE(0x8100, 0x8100) AM_WRITE(soundlatch_w) AM_RANGE(0x8182, 0x818d) AM_WRITE(rocnrope_interrupt_vector_w) AM_RANGE(0x6000, 0xffff) AM_ROM @@ -80,63 +86,60 @@ KONAMI8_COCKTAIL_4WAY_B12_UNK PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW2:1,2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "255 (Cheat)") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x78, 0x58, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("DSW2:4,5,6,7") - PORT_DIPSETTING( 0x78, "Easy 1" ) - PORT_DIPSETTING( 0x70, "Easy 2" ) - PORT_DIPSETTING( 0x68, "Easy 3" ) - PORT_DIPSETTING( 0x60, "Easy 4" ) - PORT_DIPSETTING( 0x58, "Normal 1" ) - PORT_DIPSETTING( 0x50, "Normal 2" ) - PORT_DIPSETTING( 0x48, "Normal 3" ) - PORT_DIPSETTING( 0x40, "Normal 4" ) - PORT_DIPSETTING( 0x38, "Normal 5" ) - PORT_DIPSETTING( 0x30, "Normal 6" ) - PORT_DIPSETTING( 0x28, "Normal 7" ) - PORT_DIPSETTING( 0x20, "Normal 8" ) - PORT_DIPSETTING( 0x18, "Difficult 1" ) - PORT_DIPSETTING( 0x10, "Difficult 2" ) - PORT_DIPSETTING( 0x08, "Difficult 3" ) - PORT_DIPSETTING( 0x00, "Difficult 4" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPNAME( 0x78, 0x58, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:4,5,6,7") + PORT_DIPSETTING( 0x78, "1 (Easy)" ) + PORT_DIPSETTING( 0x70, "2" ) + PORT_DIPSETTING( 0x68, "3" ) + PORT_DIPSETTING( 0x60, "4" ) + PORT_DIPSETTING( 0x58, "5" ) + PORT_DIPSETTING( 0x50, "6" ) + PORT_DIPSETTING( 0x48, "7" ) + PORT_DIPSETTING( 0x40, "8" ) + PORT_DIPSETTING( 0x38, "9" ) + PORT_DIPSETTING( 0x30, "10" ) + PORT_DIPSETTING( 0x28, "11" ) + PORT_DIPSETTING( 0x20, "12" ) + PORT_DIPSETTING( 0x18, "13" ) + PORT_DIPSETTING( 0x10, "14" ) + PORT_DIPSETTING( 0x08, "15" ) + PORT_DIPSETTING( 0x00, "16 (Difficult)" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x07, 0x07, "First Bonus" ) PORT_DIPLOCATION("DSW3:1,2,3") - PORT_DIPSETTING( 0x07, "20000" ) + PORT_DIPNAME( 0x07, 0x06, "First Bonus" ) PORT_DIPLOCATION("SW3:1,2,3") +// PORT_DIPSETTING( 0x07, "20000" ) // unused + PORT_DIPSETTING( 0x06, "20000" ) PORT_DIPSETTING( 0x05, "30000" ) PORT_DIPSETTING( 0x04, "40000" ) PORT_DIPSETTING( 0x03, "50000" ) PORT_DIPSETTING( 0x02, "60000" ) PORT_DIPSETTING( 0x01, "70000" ) PORT_DIPSETTING( 0x00, "80000" ) - /* 0x06 gives 20000 */ - PORT_DIPNAME( 0x38, 0x10, "Repeated Bonus" ) PORT_DIPLOCATION("DSW3:4,5,6") - PORT_DIPSETTING( 0x38, "40000" ) + PORT_DIPNAME( 0x38, 0x10, "Repeated Bonus" ) PORT_DIPLOCATION("SW3:4,5,6") + /* 0x28, 0x30 and 0x38 (unused) all gives 40000 */ + PORT_DIPSETTING( 0x20, "40000" ) PORT_DIPSETTING( 0x18, "50000" ) PORT_DIPSETTING( 0x10, "60000" ) PORT_DIPSETTING( 0x08, "70000" ) PORT_DIPSETTING( 0x00, "80000" ) - /* 0x20, 0x28 and 0x30 all gives 40000 */ - PORT_DIPNAME( 0x40, 0x00, "Grant Repeated Bonus" ) PORT_DIPLOCATION("DSW3:7") + PORT_DIPNAME( 0x40, 0x00, "Grant Repeated Bonus" ) PORT_DIPLOCATION("SW3:7") PORT_DIPSETTING( 0x40, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "DSW3:8" ) -// PORT_DIPNAME( 0x80, 0x00, "Unknown DSW 8" ) -// PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) -// PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:8" ) INPUT_PORTS_END @@ -184,21 +187,29 @@ * *************************************/ +static INTERRUPT_GEN( vblank_irq ) +{ + rocnrope_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( rocnrope, rocnrope_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK / 3 / 4) /* Verified in schematics */ MCFG_CPU_PROGRAM_MAP(rocnrope_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rocnrope) + MCFG_SCREEN_UPDATE_STATIC(rocnrope) MCFG_GFXDECODE(rocnrope) MCFG_PALETTE_LENGTH(16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/rohga.c mame-0.145/src/mame/drivers/rohga.c --- mame-0.144/src/mame/drivers/rohga.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rohga.c 2012-02-06 21:30:35.000000000 +0000 @@ -113,6 +113,7 @@ #include "sound/2151intf.h" #include "sound/okim6295.h" #include "video/decocomn.h" +#include "video/decospr.h" static READ16_HANDLER( rohga_irq_ack_r ) { @@ -663,10 +664,9 @@ 4096*8, 6, { 0x400000*8+8, 0x400000*8, 0x200000*8+8, 0x200000*8, 8, 0 }, - { 7,6,5,4,3,2,1,0, - 32*8+7, 32*8+6, 32*8+5, 32*8+4, 32*8+3, 32*8+2, 32*8+1, 32*8+0 }, - { 15*16, 14*16, 13*16, 12*16, 11*16, 10*16, 9*16, 8*16, - 7*16, 6*16, 5*16, 4*16, 3*16, 2*16, 1*16, 0*16 }, + { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7, 0,1,2,3,4,5,6,7 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, + 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 }, 64*8 }; @@ -676,10 +676,9 @@ 4096*8, 4, { 0x200000*8+8, 0x200000*8, 8, 0 }, - { 7,6,5,4,3,2,1,0, - 32*8+7, 32*8+6, 32*8+5, 32*8+4, 32*8+3, 32*8+2, 32*8+1, 32*8+0 }, - { 15*16, 14*16, 13*16, 12*16, 11*16, 10*16, 9*16, 8*16, - 7*16, 6*16, 5*16, 4*16, 3*16, 2*16, 1*16, 0*16 }, + { 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7, 0,1,2,3,4,5,6,7 }, + { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16, + 8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 }, 64*8 }; @@ -707,8 +706,8 @@ GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 32 ) /* Gfx chip 1 as 8x8 */ GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 32 ) /* Gfx chip 1 as 16x16 */ GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 512, 32 ) /* Gfx chip 2 as 16x16 */ - GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 1024, 32 ) /* Sprites 16x16 */ - GFXDECODE_ENTRY( "gfx5", 0, spritelayout, 1536, 32 ) + GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 0, 32 ) /* Sprites 16x16 */ + GFXDECODE_ENTRY( "gfx5", 0, spritelayout, 0, 32 ) GFXDECODE_END static GFXDECODE_START( schmeisr ) @@ -815,10 +814,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(rohga) + MCFG_SCREEN_UPDATE_STATIC(rohga) MCFG_GFXDECODE(rohga) MCFG_PALETTE_LENGTH(2048) @@ -830,6 +828,9 @@ MCFG_DECO16IC_ADD("tilegen1", rohga_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", rohga_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -863,10 +864,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(wizdfire) + MCFG_SCREEN_UPDATE_STATIC(wizdfire) MCFG_GFXDECODE(wizdfire) MCFG_PALETTE_LENGTH(2048) @@ -876,6 +876,14 @@ MCFG_DECO16IC_ADD("tilegen1", rohga_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", rohga_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + + MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 4); + + MCFG_VIDEO_START(wizdfire) + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -909,10 +917,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(nitrobal) + MCFG_SCREEN_UPDATE_STATIC(nitrobal) MCFG_GFXDECODE(wizdfire) MCFG_PALETTE_LENGTH(2048) @@ -922,6 +929,14 @@ MCFG_DECO16IC_ADD("tilegen1", nitrobal_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", nitrobal_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + + MCFG_DEVICE_ADD("spritegen2", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 4); + + MCFG_VIDEO_START(wizdfire) + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -955,21 +970,24 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(schmeisr) + MCFG_SCREEN_UPDATE_STATIC(rohga) MCFG_GFXDECODE(schmeisr) MCFG_PALETTE_LENGTH(2048) - MCFG_VIDEO_START(rohga) + MCFG_VIDEO_START(schmeisr) MCFG_DECOCOMN_ADD("deco_common", rohga_decocomn_intf) MCFG_DECO16IC_ADD("tilegen1", rohga_deco16ic_tilegen1_intf) MCFG_DECO16IC_ADD("tilegen2", rohga_deco16ic_tilegen2_intf) + MCFG_DEVICE_ADD("spritegen1", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + + /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/rollerg.c mame-0.145/src/mame/drivers/rollerg.c --- mame-0.144/src/mame/drivers/rollerg.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rollerg.c 2012-02-06 21:30:39.000000000 +0000 @@ -296,10 +296,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(rollerg) + MCFG_SCREEN_UPDATE_STATIC(rollerg) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/rollrace.c mame-0.145/src/mame/drivers/rollrace.c --- mame-0.144/src/mame/drivers/rollrace.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/rollrace.c 2012-02-06 21:30:33.000000000 +0000 @@ -22,6 +22,21 @@ /* logerror("d900: %02X\n",data);*/ } +static WRITE8_HANDLER( nmi_mask_w ) +{ + rollrace_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + +static WRITE8_HANDLER( sound_nmi_mask_w ) +{ + rollrace_state *state = space->machine().driver_data(); + + state->m_sound_nmi_mask = data & 1; +} + + static ADDRESS_MAP_START( rollrace_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x9fff) AM_ROM /* only rollace2 */ @@ -41,7 +56,7 @@ AM_RANGE(0xf804, 0xf804) AM_READ_PORT("DSW1") AM_RANGE(0xf805, 0xf805) AM_READ_PORT("DSW2") AM_RANGE(0xfc00, 0xfc00) AM_WRITE(rollrace_flipx_w) - AM_RANGE(0xfc01, 0xfc01) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xfc01, 0xfc01) AM_WRITE(nmi_mask_w) AM_RANGE(0xfc02, 0xfc03) AM_WRITENOP /* coin counters */ AM_RANGE(0xfc04, 0xfc05) AM_WRITE(rollrace_charbank_w) AM_RANGE(0xfc06, 0xfc06) AM_WRITE(rollrace_spritebank_w) @@ -51,7 +66,7 @@ static ADDRESS_MAP_START( rollrace_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0fff) AM_ROM AM_RANGE(0x2000, 0x2fff) AM_RAM - AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,interrupt_enable_w) /* TODO: check me ... */ + AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,sound_nmi_mask_w) AM_RANGE(0x4000, 0x4001) AM_DEVWRITE("ay1", ay8910_address_data_w) AM_RANGE(0x5000, 0x5001) AM_DEVWRITE("ay2", ay8910_address_data_w) AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("ay3", ay8910_address_data_w) @@ -195,25 +210,40 @@ GFXDECODE_ENTRY( "gfx5", 0x0000, spritelayout, 0, 32 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + rollrace_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + +static INTERRUPT_GEN( sound_timer_irq ) +{ + rollrace_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( rollrace, rollrace_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,XTAL_24MHz/8) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(rollrace_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,XTAL_24MHz/16) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(rollrace_sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,4*60) + MCFG_CPU_PERIODIC_INT(sound_timer_irq,4*60) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(16,255,16, 255-16) - MCFG_SCREEN_UPDATE(rollrace) + MCFG_SCREEN_UPDATE_STATIC(rollrace) MCFG_GFXDECODE(rollrace) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/rotaryf.c mame-0.145/src/mame/drivers/rotaryf.c --- mame-0.144/src/mame/drivers/rotaryf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/rotaryf.c 2012-02-06 21:30:40.000000000 +0000 @@ -13,7 +13,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/i8085/i8085.h" @@ -21,10 +20,14 @@ { public: rotaryf_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_videoram; size_t m_videoram_size; + + required_device m_maincpu; }; @@ -38,14 +41,17 @@ * *************************************/ -static INTERRUPT_GEN( rotaryf_interrupt ) +static TIMER_DEVICE_CALLBACK( rotaryf_interrupt ) { - if (device->machine().primary_screen->vblank()) - device_set_input_line(device, I8085_RST55_LINE, HOLD_LINE); - else + rotaryf_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 256) + device_set_input_line(state->m_maincpu, I8085_RST55_LINE, HOLD_LINE); + else if((scanline % 64) == 0) { - device_set_input_line(device, I8085_RST75_LINE, ASSERT_LINE); - device_set_input_line(device, I8085_RST75_LINE, CLEAR_LINE); + device_set_input_line(state->m_maincpu, I8085_RST75_LINE, ASSERT_LINE); + device_set_input_line(state->m_maincpu, I8085_RST75_LINE, CLEAR_LINE); } } @@ -57,9 +63,9 @@ * *************************************/ -static SCREEN_UPDATE( rotaryf ) +static SCREEN_UPDATE_RGB32( rotaryf ) { - rotaryf_state *state = screen->machine().driver_data(); + rotaryf_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -73,7 +79,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data >> 1; x = x + 1; @@ -167,15 +173,14 @@ MCFG_CPU_ADD("maincpu",I8085A,4000000) /* ?? MHz */ MCFG_CPU_PROGRAM_MAP(rotaryf_map) MCFG_CPU_IO_MAP(rotaryf_io_map) - MCFG_CPU_VBLANK_INT_HACK(rotaryf_interrupt,5) + MCFG_TIMER_ADD_SCANLINE("scantimer", rotaryf_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 262) /* vert size is a guess, taken from mw8080bw */ MCFG_SCREEN_VISIBLE_AREA(1*8, 30*8-1, 0*8, 32*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(rotaryf) + MCFG_SCREEN_UPDATE_STATIC(rotaryf) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/roul.c mame-0.145/src/mame/drivers/roul.c --- mame-0.144/src/mame/drivers/roul.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/roul.c 2012-02-06 21:30:40.000000000 +0000 @@ -210,13 +210,13 @@ state->m_videobuf = auto_alloc_array_clear(machine, UINT8, VIDEOBUF_SIZE); } -static SCREEN_UPDATE(roul) +static SCREEN_UPDATE_IND16(roul) { - roul_state *state = screen->machine().driver_data(); + roul_state *state = screen.machine().driver_data(); int i,j; for (i = 0; i < 256; i++) for (j = 0; j < 256; j++) - *BITMAP_ADDR16(bitmap, j, i) = state->m_videobuf[j * 256 + 255 - i]; + bitmap.pix16(j, i) = state->m_videobuf[j * 256 + 255 - i]; return 0; } @@ -287,12 +287,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(roul) + MCFG_SCREEN_UPDATE_STATIC(roul) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/route16.c mame-0.145/src/mame/drivers/route16.c --- mame-0.144/src/mame/drivers/route16.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/route16.c 2012-02-06 21:30:33.000000000 +0000 @@ -69,7 +69,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "sound/dac.h" #include "sound/sn76477.h" #include "sound/ay8910.h" @@ -615,12 +614,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) /* frames per second, vblank duration */ - MCFG_SCREEN_UPDATE(route16) + MCFG_SCREEN_UPDATE_STATIC(route16) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -648,7 +646,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(stratvox) + MCFG_SCREEN_UPDATE_STATIC(stratvox) /* sound hardware */ MCFG_SOUND_MODIFY("ay8910") @@ -687,7 +685,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ttmahjng) + MCFG_SCREEN_UPDATE_STATIC(ttmahjng) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/rowamet.c mame-0.145/src/mame/drivers/rowamet.c --- mame-0.144/src/mame/drivers/rowamet.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/rowamet.c 2012-02-06 21:30:34.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -5,18 +7,28 @@ { public: rowamet_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( rowamet_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( rowamet_map, AS_PROGRAM, 8, rowamet_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( rowamet ) INPUT_PORTS_END -static MACHINE_RESET( rowamet ) +void rowamet_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 1888888) MCFG_CPU_PROGRAM_MAP(rowamet_map) - - MCFG_MACHINE_RESET( rowamet ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -43,6 +53,7 @@ ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("hvymtl_c.bin", 0x0000, 0x1000, CRC(8f36d3da) SHA1(beec79c5d794ede96d95105bad7466b67762606d)) ROM_LOAD("hvymtl_b.bin", 0x1000, 0x1000, CRC(357f1252) SHA1(ddc55ded0dc1c8632c31d809bfadfb45ae248cfd)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("hvymtl_s.bin", 0x0000, 0x1000, CRC(c525e6cb) SHA1(144e06fbbdd1f3e45ccca8bace6b04f876b1312c)) ROM_END @@ -51,5 +62,5 @@ / Vulcan IV (1982) /-------------------------------------------------------------------*/ -GAME(198?, heavymtl, 0, rowamet, rowamet, rowamet, ROT0, "Rowamet", "Heavy Metal", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(198?, heavymtl, 0, rowamet, rowamet, rowamet, ROT0, "Rowamet", "Heavy Metal", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/royalmah.c mame-0.145/src/mame/drivers/royalmah.c --- mame-0.144/src/mame/drivers/royalmah.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/royalmah.c 2012-02-06 21:30:35.000000000 +0000 @@ -91,7 +91,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/tlcs90/tlcs90.h" #include "machine/msm6242.h" #include "sound/ay8910.h" @@ -103,7 +102,9 @@ { public: royalmah_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_videoram; UINT8 m_input_port_select; @@ -120,6 +121,8 @@ UINT8 m_gfxdata1; UINT8 m_jansou_colortable[16]; UINT8 m_mjifb_rom_enable; + + required_device m_maincpu; }; @@ -209,9 +212,9 @@ } -static SCREEN_UPDATE( royalmah ) +static SCREEN_UPDATE_IND16( royalmah ) { - royalmah_state *state = screen->machine().driver_data(); + royalmah_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; offs_t offs; @@ -230,7 +233,7 @@ { UINT8 pen = ((data2 >> 1) & 0x08) | ((data2 << 2) & 0x04) | ((data1 >> 3) & 0x02) | ((data1 >> 0) & 0x01); - *BITMAP_ADDR16(bitmap, y, x) = (state->m_palette_base << 4) | pen; + bitmap.pix16(y, x) = (state->m_palette_base << 4) | pen; x = x - 1; data1 = data1 >> 1; @@ -603,7 +606,7 @@ ADDRESS_MAP_END -static ADDRESS_MAP_START( janho_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( janoh_map, AS_PROGRAM, 8 ) AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_WRITE( royalmah_rom_w ) AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram") AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_BASE_MEMBER(royalmah_state, m_videoram) @@ -752,7 +755,7 @@ ****************************************************************************/ static ADDRESS_MAP_START( janptr96_map, AS_PROGRAM, 8 ) - AM_RANGE( 0x0000, 0x5fff) AM_ROM + AM_RANGE( 0x0000, 0x5fff ) AM_ROM AM_RANGE( 0x6000, 0x6fff ) AM_RAMBANK("bank3") AM_SHARE("nvram") // nvram AM_RANGE( 0x7000, 0x7fff ) AM_RAMBANK("bank2") // banked nvram AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK("bank1") @@ -816,7 +819,7 @@ AM_RANGE( 0x1c, 0x1c ) AM_READ( janptr96_dsw_r ) AM_RANGE( 0x20, 0x20 ) AM_READWRITE( janptr96_unknown_r, janptr96_rambank_w ) AM_RANGE( 0x50, 0x50 ) AM_WRITE( mjderngr_palbank_w ) - AM_RANGE( 0x60, 0x6f ) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) + AM_RANGE( 0x60, 0x6f ) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE( 0x81, 0x81 ) AM_DEVREAD( "aysnd", ay8910_r ) AM_RANGE( 0x82, 0x83 ) AM_DEVWRITE( "aysnd", ay8910_data_address_w ) AM_RANGE( 0x93, 0x93 ) AM_WRITE( input_port_select_w ) @@ -1039,7 +1042,7 @@ AM_RANGE( 0x6fc2, 0x6fc3 ) AM_DEVWRITE( "aysnd", ay8910_data_address_w ) AM_RANGE( 0x6fd0, 0x6fd0 ) AM_WRITE( janptr96_coin_counter_w ) AM_RANGE( 0x6fd1, 0x6fd1 ) AM_READ_PORT("SYSTEM") AM_WRITE( input_port_select_w ) - AM_RANGE( 0x6fe0, 0x6fef ) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) + AM_RANGE( 0x6fe0, 0x6fef ) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE( 0x6ff0, 0x6ff0 ) AM_READWRITE( janptr96_dsw_r, janptr96_dswsel_w ) AM_RANGE( 0x6ff1, 0x6ff1 ) AM_WRITE( mjderngr_palbank_w ) AM_RANGE( 0x6ff3, 0x6ff3 ) AM_WRITE( mjtensin_6ff3_w ) @@ -1118,7 +1121,7 @@ AM_RANGE( 0x7fe2, 0x7fe2 ) AM_WRITE( mjderngr_palbank_w ) AM_RANGE( 0x7fe3, 0x7fe3 ) AM_WRITE( cafetime_7fe3_w ) AM_RANGE( 0x7fe4, 0x7fe4 ) AM_READ( cafetime_7fe4_r ) - AM_RANGE( 0x7ff0, 0x7fff ) AM_DEVREADWRITE("rtc", msm6242_r, msm6242_w) + AM_RANGE( 0x7ff0, 0x7fff ) AM_DEVREADWRITE_MODERN("rtc", msm6242_device, read, write) AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "bank1" ) AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_BASE_MEMBER(royalmah_state, m_videoram) ADDRESS_MAP_END @@ -1158,29 +1161,13 @@ offset += 0x8000; - switch(offset) + if((offset & 0xfff0) == 0x8000) { - case 0x8000: - case 0x8001: - case 0x8002: - case 0x8003: - case 0x8004: - case 0x8005: - case 0x8006: - case 0x8007: - case 0x8008: - case 0x8009: - case 0x800a: - case 0x800b: - case 0x800c: - case 0x800d: - case 0x800e: - case 0x800f: - { - device_t *rtc = space->machine().device("rtc"); - return msm6242_r(rtc, offset-0x8000); - } + msm6242_device *rtc = space->machine().device("rtc"); + + return rtc->read(*space, offset & 0xf); } + logerror("%04X: unmapped IO read at %04X\n", cpu_get_pc(&space->device()), offset); return 0xff; } @@ -1197,30 +1184,14 @@ offset += 0x8000; - switch(offset) + if((offset & 0xfff0) == 0x8000) { - case 0x8000: - case 0x8001: - case 0x8002: - case 0x8003: - case 0x8004: - case 0x8005: - case 0x8006: - case 0x8007: - case 0x8008: - case 0x8009: - case 0x800a: - case 0x800b: - case 0x800c: - case 0x800d: - case 0x800e: - case 0x800f: - { - device_t *rtc = space->machine().device("rtc"); - msm6242_w(rtc, offset-0x8000, data); - return; - } + msm6242_device *rtc = space->machine().device("rtc"); + + rtc->write(*space, offset & 0xf,data); + return; } + logerror("%04X: unmapped IO write at %04X = %02X\n", cpu_get_pc(&space->device()), offset,data); } @@ -3182,12 +3153,11 @@ MCFG_PALETTE_INIT(royalmah) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 247) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(royalmah) + MCFG_SCREEN_UPDATE_STATIC(royalmah) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -3201,7 +3171,7 @@ static MACHINE_CONFIG_DERIVED( janoh, royalmah ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_CLOCK(8000000/2) /* 4 MHz ? */ - MCFG_CPU_PROGRAM_MAP(janho_map) + MCFG_CPU_PROGRAM_MAP(janoh_map) MCFG_CPU_ADD("sub", Z80, 4000000) /* 4 MHz ? */ MCFG_CPU_PROGRAM_MAP(janoh_sub_map) @@ -3296,27 +3266,43 @@ MACHINE_CONFIG_END /* It runs in IM 2, thus needs a vector on the data bus */ -static INTERRUPT_GEN( janptr96_interrupt ) +static TIMER_DEVICE_CALLBACK( janptr96_interrupt ) { - switch(cpu_getiloops(device)) - { - case 0: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x80); break; // vblank - case 1: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x82); break; // rtc - default: device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x84); // demo - } + royalmah_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 248) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x80); // vblank + + if(scanline == 0) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0x84); // demo +} + +static WRITE_LINE_DEVICE_HANDLER(janptr96_rtc_irq) +{ + royalmah_state *drvstate = device->machine().driver_data(); + + device_set_input_line_and_vector(drvstate->m_maincpu, 0, HOLD_LINE, 0x82); // rtc } +static MSM6242_INTERFACE( janptr96_rtc_intf ) +{ + DEVCB_LINE(janptr96_rtc_irq) +}; + static MACHINE_CONFIG_DERIVED( janptr96, mjderngr ) - MCFG_CPU_REPLACE("maincpu",Z80,XTAL_16MHz/2) /* 8 MHz? */ + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu",Z80,XTAL_16MHz/2) /* 8 MHz? */ MCFG_CPU_PROGRAM_MAP(janptr96_map) MCFG_CPU_IO_MAP(janptr96_iomap) - MCFG_CPU_VBLANK_INT_HACK(janptr96_interrupt,3) /* IM 2 needs a vector on the data bus */ + MCFG_TIMER_ADD_SCANLINE("scantimer", janptr96_interrupt, "screen", 0, 1) /* IM 2 needs a vector on the data bus */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0, 255, 9, 255-8) + MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", janptr96_rtc_intf) MACHINE_CONFIG_END @@ -3344,50 +3330,62 @@ static INTERRUPT_GEN( mjtensin_interrupt ) { - switch(cpu_getiloops(device)) - { - case 0: device_set_input_line(device, INPUT_LINE_IRQ0, HOLD_LINE); break; // vblank - case 1: device_set_input_line(device, INPUT_LINE_IRQ1, HOLD_LINE); break; // rtc - } + royalmah_state *state = device->machine().driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_IRQ0, HOLD_LINE); // vblank +} + +static WRITE_LINE_DEVICE_HANDLER(mjtensin_rtc_irq) +{ + royalmah_state *drvstate = device->machine().driver_data(); + + device_set_input_line(drvstate->m_maincpu, INPUT_LINE_IRQ1, HOLD_LINE); // rtc } + +static MSM6242_INTERFACE( mjtensin_rtc_intf ) +{ + DEVCB_LINE(mjtensin_rtc_irq) +}; + + static MACHINE_CONFIG_DERIVED( mjtensin, mjderngr ) MCFG_CPU_REPLACE("maincpu",TMP90841, 12000000) /* ? */ MCFG_CPU_PROGRAM_MAP(mjtensin_map) MCFG_CPU_IO_MAP(mjtensin_iomap) - MCFG_CPU_VBLANK_INT_HACK( mjtensin_interrupt,2 ) + MCFG_CPU_VBLANK_INT("screen", mjtensin_interrupt) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", mjtensin_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( cafetime, mjderngr ) MCFG_CPU_REPLACE("maincpu",TMP90841, 12000000) /* ? */ MCFG_CPU_PROGRAM_MAP(cafetime_map) MCFG_CPU_IO_MAP(cafetime_iomap) - MCFG_CPU_VBLANK_INT_HACK(mjtensin_interrupt,2) + MCFG_CPU_VBLANK_INT("screen", mjtensin_interrupt) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", mjtensin_rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( mjvegasa, mjderngr ) MCFG_CPU_REPLACE("maincpu",TMP90841, XTAL_8MHz) /* ? */ MCFG_CPU_PROGRAM_MAP(mjvegasa_map) MCFG_CPU_IO_MAP(mjvegasa_iomap) - MCFG_CPU_VBLANK_INT_HACK(mjtensin_interrupt,2) + MCFG_CPU_VBLANK_INT("screen", mjtensin_interrupt) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", mjtensin_rtc_intf) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/rpunch.c mame-0.145/src/mame/drivers/rpunch.c --- mame-0.144/src/mame/drivers/rpunch.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/rpunch.c 2012-02-06 21:30:41.000000000 +0000 @@ -476,10 +476,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(304, 224) MCFG_SCREEN_VISIBLE_AREA(8, 303-8, 0, 223-8) - MCFG_SCREEN_UPDATE(rpunch) + MCFG_SCREEN_UPDATE_STATIC(rpunch) MCFG_GFXDECODE(rpunch) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/runaway.c mame-0.145/src/mame/drivers/runaway.c --- mame-0.144/src/mame/drivers/runaway.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/runaway.c 2012-02-06 21:30:38.000000000 +0000 @@ -86,8 +86,8 @@ AM_RANGE(0x0400, 0x07bf) AM_RAM_WRITE(runaway_video_ram_w) AM_BASE_MEMBER(runaway_state, m_video_ram) AM_RANGE(0x07c0, 0x07ff) AM_RAM AM_BASE_MEMBER(runaway_state, m_sprite_ram) AM_RANGE(0x1000, 0x1000) AM_WRITE(runaway_irq_ack_w) - AM_RANGE(0x1400, 0x143f) AM_DEVWRITE("earom", atari_vg_earom_w) - AM_RANGE(0x1800, 0x1800) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) + AM_RANGE(0x1400, 0x143f) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) + AM_RANGE(0x1800, 0x1800) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) AM_RANGE(0x1c00, 0x1c0f) AM_WRITE(runaway_paletteram_w) AM_RANGE(0x2000, 0x2000) AM_WRITENOP /* coin counter? */ AM_RANGE(0x2001, 0x2001) AM_WRITENOP /* coin counter? */ @@ -96,7 +96,7 @@ AM_RANGE(0x3000, 0x3007) AM_READ(runaway_input_r) AM_RANGE(0x4000, 0x4000) AM_READ_PORT("4000") - AM_RANGE(0x5000, 0x5000) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x5000, 0x5000) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x6000, 0x600f) AM_DEVREADWRITE("pokey1", pokey_r,pokey_w) AM_RANGE(0x7000, 0x700f) AM_DEVREADWRITE("pokey2", pokey_r,pokey_w) AM_RANGE(0x8000, 0xcfff) AM_ROM @@ -361,10 +361,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 263) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(runaway) + MCFG_SCREEN_UPDATE_STATIC(runaway) MCFG_GFXDECODE(runaway) MCFG_PALETTE_LENGTH(16) @@ -393,7 +392,7 @@ MCFG_VIDEO_START(qwak) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(qwak) + MCFG_SCREEN_UPDATE_STATIC(qwak) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/rungun.c mame-0.145/src/mame/drivers/rungun.c --- mame-0.144/src/mame/drivers/rungun.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/rungun.c 2012-02-06 21:30:37.000000000 +0000 @@ -429,10 +429,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(88, 88+384-1, 24, 24+224-1) - MCFG_SCREEN_UPDATE(rng) + MCFG_SCREEN_UPDATE_STATIC(rng) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/s11a.c mame-0.145/src/mame/drivers/s11a.c --- mame-0.144/src/mame/drivers/s11a.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s11a.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 11a */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s11a_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s11a_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s11a_map, AS_PROGRAM, 8, williams_s11a_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s11a ) INPUT_PORTS_END -static MACHINE_RESET( williams_s11a ) +void williams_s11a_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s11a_map) - - MCFG_MACHINE_RESET( williams_s11a ) MACHINE_CONFIG_END /*-------------------- @@ -178,11 +189,11 @@ ROM_RELOAD(0x10000+0x8000, 0x8000) ROM_END -GAME(1987, f14_l1, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, f14_p3, f14_l1, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (P-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, f14_p4, f14_l1, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (P-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, fire_l3, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Fire! (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, milln_l3, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Millionaire (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, pb_l5, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pinbot (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, pb_l2, pb_l5, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pinbot (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, pb_l3, pb_l5, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pinbot (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1987, f14_l1, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, f14_p3, f14_l1, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (P-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, f14_p4, f14_l1, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "F14 Tomcat (P-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, fire_l3, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Fire! (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, milln_l3, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Millionaire (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, pb_l5, 0, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pin-Bot (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, pb_l2, pb_l5, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pin-Bot (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, pb_l3, pb_l5, williams_s11a, williams_s11a, williams_s11a, ROT0, "Williams", "Pin-Bot (L-3)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s11b.c mame-0.145/src/mame/drivers/s11b.c --- mame-0.144/src/mame/drivers/s11b.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s11b.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 11b */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s11b_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s11b_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s11b_map, AS_PROGRAM, 8, williams_s11b_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s11b ) INPUT_PORTS_END -static MACHINE_RESET( williams_s11b ) +void williams_s11b_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s11b_map) - - MCFG_MACHINE_RESET( williams_s11b ) MACHINE_CONFIG_END /*----------------------- @@ -865,50 +876,50 @@ ROM_RELOAD(0x20000+0x8000, 0x8000) ROM_END -GAME(1989, bcats_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Bad Cats (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bcats_l2, bcats_l5, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Bad Cats (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, bnzai_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, bnzai_g3, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-3) Germany", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, bnzai_l1, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, bnzai_pa, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (P-A)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, bguns_l8, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, bguns_l7, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, bguns_la, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-A)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, bguns_p1, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (P-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bk2k_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bk2k_lg1, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (LG-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bk2k_lg3, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (LG-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, bk2k_pu1, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (PU-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, cycln_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Cyclone (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, cycln_l4, cycln_l5, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Cyclone (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, esha_la3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (LA-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, esha_ma3, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Metallica) (LA-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, esha_pr4, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Family version) (PR-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, esha_lg1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (German) (LG-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, esha_lg2, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (German) (LG-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, esha_la1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (LA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, esha_pa1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Prototype) (PA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_l1, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_l2, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_4g, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LG-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_4u, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LU-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, eatpm_p7, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (PA-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, jokrz_l6, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Jokerz! (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, jokrz_l3, jokrz_l6, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Jokerz! (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, mousn_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LA-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, mousn_l1, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, mousn_lu, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LU-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, mousn_lx, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LX-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, polic_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, polic_l3, polic_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, polic_l2, polic_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, spstn_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Space Station (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, swrds_l2, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Swords of Fury (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, taxi_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Lola) (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, taxi_l3, taxi_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Marilyn) (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1988, taxi_lg1, taxi_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Marilyn) (L-1) Germany", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, tsptr_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Transporter the Rescue (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, whirl_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, whirl_l2, whirl_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, whirl_lg3, whirl_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (LG-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1989, bcats_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Bad Cats (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bcats_l2, bcats_l5, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Bad Cats (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, bnzai_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, bnzai_g3, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-3) Germany", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, bnzai_l1, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, bnzai_pa, bnzai_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Banzai Run (P-A)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, bguns_l8, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-8)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, bguns_l7, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, bguns_la, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (L-A)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, bguns_p1, bguns_l8, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Big Guns (P-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bk2k_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bk2k_lg1, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (LG-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bk2k_lg3, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (LG-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, bk2k_pu1, bk2k_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Black Knight 2000 (PU-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, cycln_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Cyclone (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, cycln_l4, cycln_l5, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Cyclone (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, esha_la3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (LA-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, esha_ma3, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Metallica) (LA-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, esha_pr4, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Family version) (PR-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, esha_lg1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (German) (LG-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, esha_lg2, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (German) (LG-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, esha_la1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (LA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, esha_pa1, esha_la3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Earthshaker (Prototype) (PA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_l1, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_l2, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_4g, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LG-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_4u, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (LU-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, eatpm_p7, eatpm_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Elvira and the Party Monsters (PA-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, jokrz_l6, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Jokerz! (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, jokrz_l3, jokrz_l6, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Jokerz! (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, mousn_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LA-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, mousn_l1, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, mousn_lu, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LU-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, mousn_lx, mousn_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Mousin' Around! (LX-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, polic_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, polic_l3, polic_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, polic_l2, polic_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Police Force (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, spstn_l5, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Space Station (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, swrds_l2, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Swords of Fury (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, taxi_l4, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Lola) (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, taxi_l3, taxi_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Marilyn) (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1988, taxi_lg1, taxi_l4, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Taxi (Marilyn) (L-1) Germany", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, tsptr_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Bally", "Transporter the Rescue (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, whirl_l3, 0, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, whirl_l2, whirl_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, whirl_lg3, whirl_l3, williams_s11b, williams_s11b, williams_s11b, ROT0, "Williams", "Whirlwind (LG-3)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s11.c mame-0.145/src/mame/drivers/s11.c --- mame-0.144/src/mame/drivers/s11.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s11.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 11 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s11_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s11_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s11_map, AS_PROGRAM, 8, williams_s11_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s11 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s11 ) +void williams_s11_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s11_map) - - MCFG_MACHINE_RESET( williams_s11 ) MACHINE_CONFIG_END /*-------------------- @@ -208,16 +219,15 @@ ROM_LOAD("tts_u22.256", 0x8000, 0x8000, NO_DUMP) ROM_END -GAME(1987, gmine_l2, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Gold Mine (Shuffle) (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, grand_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Grand Lizard (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, hs_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "High Speed (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, hs_l3, hs_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "High Speed (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, rdkng_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, rdkng_l1, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, rdkng_l2, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, rdkng_l3, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, tdawg_l1, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Top Dawg (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, shfin_l1, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Shuffle Inn (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, tts_l2, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Tic-Tac-Strike (Shuffle) (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, tts_l1, tts_l2, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Tic-Tac-Strike (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1987, gmine_l2, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Gold Mine (Shuffle) (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, grand_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Grand Lizard (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, hs_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "High Speed (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, hs_l3, hs_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "High Speed (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, rdkng_l4, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, rdkng_l1, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, rdkng_l2, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, rdkng_l3, rdkng_l4, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Road Kings (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, tdawg_l1, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Top Dawg (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, shfin_l1, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Shuffle Inn (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, tts_l2, 0, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Tic-Tac-Strike (Shuffle) (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, tts_l1, tts_l2, williams_s11, williams_s11, williams_s11, ROT0, "Williams", "Tic-Tac-Strike (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s11c.c mame-0.145/src/mame/drivers/s11c.c --- mame-0.144/src/mame/drivers/s11c.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s11c.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 11c */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s11c_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s11c_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s11c_map, AS_PROGRAM, 8, williams_s11c_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s11c ) INPUT_PORTS_END -static MACHINE_RESET( williams_s11c ) +void williams_s11c_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s11c_map) - - MCFG_MACHINE_RESET( williams_s11c ) MACHINE_CONFIG_END /*-------------------- @@ -333,27 +344,28 @@ ROM_RELOAD(0x10000+0x8000, 0x8000) ROM_END -GAME(1990, bbnny_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, bbnny_lu, bbnny_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (LU-2) European", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, diner_l4, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, diner_l3, diner_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, diner_l1, diner_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-1) Europe", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, dd_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Dr. Dude (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, dd_p6, dd_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Dr. Dude (PA-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, pool_l7, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LA-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, pool_l6, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LA-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, pool_le2, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LE-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1989, pool_p7, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (PA-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, radcl_l1, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, radcl_g1, radcl_l1, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical (G-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, radcl_p3, radcl_l1, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical (P-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, rvrbt_l3, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Riverboat Gambler (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, rollr_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, rollr_ex, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (EXPERIMENTAL)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, rollr_e1, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (PU-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, rollr_p2, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (PA-2 / PA-1 Sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, rollr_l3, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (LU-3) Europe", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, rollr_g3, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (LG-3) Germany", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, gs_l3, gs_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "The Bally Game Show (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, gs_l4, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "The Bally Game Show (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, strax_p7, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Star Trax (domestic prototype)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1990, bbnny_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, bbnny_lu, bbnny_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Bugs Bunny Birthday Ball (LU-2) European", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l4, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l3, diner_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, diner_l1, diner_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Diner (L-1) Europe", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, dd_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Dr. Dude (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, dd_p6, dd_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Dr. Dude (PA-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, pool_l7, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LA-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, pool_l6, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LA-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, pool_le2, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (LE-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1989, pool_p7, pool_l7, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Pool Sharks (PA-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, radcl_l1, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical! (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, radcl_g1, radcl_l1, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical! (G-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, radcl_p3, radcl_l1, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "Radical! (P-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, rvrbt_l3, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Riverboat Gambler (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, rollr_l2, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, rollr_ex, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (EXPERIMENTAL)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, rollr_e1, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (PU-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, rollr_p2, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (PA-2 / PA-1 Sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, rollr_l3, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (LU-3) Europe", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, rollr_g3, rollr_l2, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Rollergames (LG-3) Germany", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, gs_l3, gs_l4, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "The Bally Game Show (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, gs_l4, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Bally", "The Bally Game Show (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, strax_p7, 0, williams_s11c, williams_s11c, williams_s11c, ROT0, "Williams", "Star Trax (domestic prototype)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s3.c mame-0.145/src/mame/drivers/s3.c --- mame-0.144/src/mame/drivers/s3.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s3.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 3 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,10 +11,20 @@ { public: williams_s3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s3_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s3_map, AS_PROGRAM, 8, williams_s3_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x6000, 0x67ff) AM_ROM @@ -22,7 +35,7 @@ static INPUT_PORTS_START( williams_s3 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s3 ) +void williams_s3_state::machine_reset() { } @@ -33,8 +46,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 3580000 / 4) MCFG_CPU_PROGRAM_MAP(williams_s3_map) - - MCFG_MACHINE_RESET( williams_s3 ) MACHINE_CONFIG_END /*------------------------------------- @@ -111,8 +122,9 @@ ROM_RELOAD( 0xf800, 0x0800) ROM_END -GAME( 1977, httip_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Hot Tip (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1977, lucky_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Lucky Seven (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, wldcp_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "World Cup Soccer (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, cntct_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Contact (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME( 1978, disco_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Disco Fever (L-1", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME( 1977, httip_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Hot Tip (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1977, lucky_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Lucky Seven (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, wldcp_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "World Cup Soccer (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, cntct_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Contact (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME( 1978, disco_l1, 0, williams_s3, williams_s3, williams_s3, ROT0, "Williams", "Disco Fever (L-1", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s4.c mame-0.145/src/mame/drivers/s4.c --- mame-0.144/src/mame/drivers/s4.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s4.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 4 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,17 +11,27 @@ { public: williams_s4_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s4_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s4_map, AS_PROGRAM, 8, williams_s4_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s4 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s4 ) +void williams_s4_state::machine_reset() { } @@ -30,8 +43,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s4_map) - - MCFG_MACHINE_RESET( williams_s4 ) MACHINE_CONFIG_END /*-------------------------------- @@ -233,16 +244,17 @@ ROM_RELOAD( 0xf000, 0x0800) ROM_END -GAME(1979, flash_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Flash (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, flash_t1, flash_l1, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Flash (T-1) Ted Estes", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, phnix_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Phoenix (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, pkrno_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Pokerino (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, stlwr_l2, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Stellar Wars (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, pomp_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Pompeii (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, arist_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Aristocrat (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, topaz_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Topaz (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, taurs_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Taurus (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, kingt_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "King Tut (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, omni_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Omni (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, bstrk_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Big Strike (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, tstrk_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Triple Strike (Shuffle) (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1979, flash_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Flash (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, flash_t1, flash_l1, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Flash (T-1) Ted Estes", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, phnix_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Phoenix (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, pkrno_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Pokerino (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, stlwr_l2, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Stellar Wars (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, pomp_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Pompeii (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, arist_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Aristocrat (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, topaz_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Topaz (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, taurs_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Taurus (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, kingt_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "King Tut (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, omni_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Omni (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, bstrk_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Big Strike (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, tstrk_l1, 0, williams_s4, williams_s4, williams_s4, ROT0, "Williams", "Triple Strike (Shuffle) (L-1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s6a.c mame-0.145/src/mame/drivers/s6a.c --- mame-0.144/src/mame/drivers/s6a.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s6a.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 6a */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s6a_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s6a_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s6a_map, AS_PROGRAM, 8, williams_s6a_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s6a ) INPUT_PORTS_END -static MACHINE_RESET( williams_s6a ) +void williams_s6a_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s6a_map) - - MCFG_MACHINE_RESET( williams_s6a ) MACHINE_CONFIG_END /*-------------------------- @@ -114,7 +125,7 @@ ROM_END -GAME(1980, algar_l1, 0, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Algar (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, alpok_l6, 0, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, alpok_l2, alpok_l6, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, alpok_f6, alpok_l6, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-6 French speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1980, algar_l1, 0, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Algar (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, alpok_l6, 0, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, alpok_l2, alpok_l6, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, alpok_f6, alpok_l6, williams_s6a, williams_s6a, williams_s6a, ROT0, "Williams", "Alien Poker (L-6 French speech)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s6.c mame-0.145/src/mame/drivers/s6.c --- mame-0.144/src/mame/drivers/s6.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s6.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 6 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s6_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s6_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s6_map, AS_PROGRAM, 8, williams_s6_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s6 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s6 ) +void williams_s6_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s6_map) - - MCFG_MACHINE_RESET( williams_s6 ) MACHINE_CONFIG_END /*---------------------------- @@ -332,20 +343,20 @@ ROM_RELOAD( 0xf800, 0x0800) ROM_END -GAME(1979, blkou_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, blkou_t1, blkou_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (T-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, blkou_f1, blkou_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (L-1, French Speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, frpwr_l6, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, frpwr_t6, frpwr_l6, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (T-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, frpwr_l2, frpwr_l6, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, grgar_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Gorgar (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, grgar_t1, grgar_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Gorgar (T-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, lzbal_l2, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Laser Ball (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, lzbal_t2, lzbal_l2, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Laser Ball (T-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, tmwrp_l2, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Time Warp (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, tmwrp_t2, tmwrp_l2, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Time Warp (T-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, scrpn_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Scorpion (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, scrpn_t1, scrpn_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Scorpion (T-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, trizn_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Tri Zone (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, trizn_t1, trizn_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Tri Zone (T-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1979, blkou_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, blkou_t1, blkou_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (T-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, blkou_f1, blkou_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Blackout (L-1, French Speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, frpwr_l6, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, frpwr_t6, frpwr_l6, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (T-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, frpwr_l2, frpwr_l6, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Firepower (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, grgar_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Gorgar (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, grgar_t1, grgar_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Gorgar (T-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, lzbal_l2, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Laser Ball (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, lzbal_t2, lzbal_l2, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Laser Ball (T-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, tmwrp_l2, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Time Warp (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, tmwrp_t2, tmwrp_l2, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Time Warp (T-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, scrpn_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Scorpion (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, scrpn_t1, scrpn_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Scorpion (T-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, trizn_l1, 0, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Tri Zone (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, trizn_t1, trizn_l1, williams_s6, williams_s6, williams_s6, ROT0, "Williams", "Tri Zone (T-1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s7.c mame-0.145/src/mame/drivers/s7.c --- mame-0.144/src/mame/drivers/s7.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s7.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 7 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s7_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s7_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s7_map, AS_PROGRAM, 8, williams_s7_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s7 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s7 ) +void williams_s7_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s7_map) - - MCFG_MACHINE_RESET( williams_s7 ) MACHINE_CONFIG_END /*---------------------------- @@ -413,22 +424,22 @@ ROM_END -GAME(1982, vrkon_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Varkon (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, barra_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Barracora (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, bk_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, bk_f4, bk_l4, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, bk_l3, bk_l4, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, csmic_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, dfndr_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Defender (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, fpwr2_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Firepower II (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, hypbl_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "HyperBall (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, jst_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Joust (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, jngld_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Jungle Lord (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, lsrcu_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Laser Cue (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, pharo_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Pharaoh (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, solar_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Solar Fire (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, strlt_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Star Light (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, tmfnt_l5, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Time Fantasy (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, wrlok_l3, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Warlok (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, thund_p1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Thunderball (P-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, ratrc_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Rat Race (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1982, vrkon_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Varkon (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, barra_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Barracora (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, bk_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, bk_f4, bk_l4, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, bk_l3, bk_l4, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Black Knight (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, csmic_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, dfndr_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Defender (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, fpwr2_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Firepower II (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, hypbl_l4, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "HyperBall (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, jst_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Joust (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, jngld_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Jungle Lord (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, lsrcu_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Laser Cue (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, pharo_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Pharaoh (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, solar_l2, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Solar Fire (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, strlt_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Star Light (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, tmfnt_l5, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Time Fantasy (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, wrlok_l3, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Warlok (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, thund_p1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Thunderball (P-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, ratrc_l1, 0, williams_s7, williams_s7, williams_s7, ROT0, "Williams", "Rat Race (L-1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s8.c mame-0.145/src/mame/drivers/s8.c --- mame-0.144/src/mame/drivers/s8.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s8.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 8 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s8_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s8_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s8_map, AS_PROGRAM, 8, williams_s8_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s8 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s8 ) +void williams_s8_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s8_map) - - MCFG_MACHINE_RESET( williams_s8 ) MACHINE_CONFIG_END /*-------------------- @@ -60,5 +71,5 @@ ROM_RELOAD(0x8000, 0x4000) ROM_END -GAME(1984, pfevr_l2, 0, williams_s8, williams_s8, williams_s8, ROT0, "Williams", "Pennant Fever Baseball (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, pfevr_p3, pfevr_l2, williams_s8, williams_s8, williams_s8, ROT0, "Williams", "Pennant Fever Baseball (P-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1984, pfevr_l2, 0, williams_s8, williams_s8, williams_s8, ROT0, "Williams", "Pennant Fever (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, pfevr_p3, pfevr_l2, williams_s8, williams_s8, williams_s8, ROT0, "Williams", "Pennant Fever (P-3)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/s9.c mame-0.145/src/mame/drivers/s9.c --- mame-0.144/src/mame/drivers/s9.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/s9.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams System 9 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -8,18 +11,28 @@ { public: williams_s9_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( williams_s9_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( williams_s9_map, AS_PROGRAM, 8, williams_s9_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( williams_s9 ) INPUT_PORTS_END -static MACHINE_RESET( williams_s9 ) +void williams_s9_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(williams_s9_map) - - MCFG_MACHINE_RESET( williams_s9 ) MACHINE_CONFIG_END /*-------------------- @@ -147,11 +158,11 @@ ROM_LOAD("acs_u22.bin", 0x8000, 0x8000, CRC(56c1011a) SHA1(c817a3410c643617f3643897b8f529ae78546b0d)) ROM_END -GAME(1985, comet_l4, comet_l5, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Comet (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, comet_l5, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Comet (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, sorcr_l1, sorcr_l2, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Sorcerer (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, sorcr_l2, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Sorcerer (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, sshtl_l7, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Space Shuttle (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, alcat_l7, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, szone_l5, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, szone_l2, szone_l5, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1985, comet_l4, comet_l5, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Comet (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, comet_l5, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Comet (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, sorcr_l1, sorcr_l2, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Sorcerer (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, sorcr_l2, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Sorcerer (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, sshtl_l7, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Space Shuttle (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, alcat_l7, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, szone_l5, 0, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, szone_l2, szone_l5, williams_s9, williams_s9, williams_s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/safarir.c mame-0.145/src/mame/drivers/safarir.c --- mame-0.144/src/mame/drivers/safarir.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/safarir.c 2012-02-06 21:30:41.000000000 +0000 @@ -85,7 +85,7 @@ else state->m_ram_1[offset] = data; - tilemap_mark_tile_dirty((offset & 0x0400) ? state->m_bg_tilemap : state->m_fg_tilemap, offset & 0x03ff); + ((offset & 0x0400) ? state->m_bg_tilemap : state->m_fg_tilemap)->mark_tile_dirty(offset & 0x03ff); } @@ -103,7 +103,7 @@ state->m_ram_bank = data & 0x01; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } @@ -190,18 +190,18 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE( safarir ) +static SCREEN_UPDATE_IND16( safarir ) { - safarir_state *state = screen->machine().driver_data(); + safarir_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, *state->m_bg_scroll); + state->m_bg_tilemap->set_scrollx(0, *state->m_bg_scroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -274,17 +274,17 @@ static const char *const safarir_sample_names[] = { "*safarir", - "sound1-1.wav", - "sound1-2.wav", - "sound2.wav", - "sound3.wav", - "sound4-1.wav", - "sound4-2.wav", - "sound5-1.wav", - "sound5-2.wav", - "sound6.wav", - "sound7.wav", - "sound8.wav", + "sound1-1", + "sound1-2", + "sound2", + "sound3", + "sound4-1", + "sound4-2", + "sound5-1", + "sound5-2", + "sound6", + "sound7", + "sound8", 0 }; @@ -412,11 +412,10 @@ MCFG_GFXDECODE(safarir) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 26*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(safarir) + MCFG_SCREEN_UPDATE_STATIC(safarir) /* audio hardware */ MCFG_FRAGMENT_ADD(safarir_audio) diff -Nru mame-0.144/src/mame/drivers/sandscrp.c mame-0.145/src/mame/drivers/sandscrp.c --- mame-0.144/src/mame/drivers/sandscrp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sandscrp.c 2012-02-06 21:30:37.000000000 +0000 @@ -134,13 +134,17 @@ } -static SCREEN_EOF( sandscrp ) +static SCREEN_VBLANK( sandscrp ) { - sandscrp_state *state = machine.driver_data(); - device_t *pandora = machine.device("pandora"); - state->m_sprite_irq = 1; - update_irq_state(machine); - pandora_eof(pandora); + // rising edge + if (vblank_on) + { + sandscrp_state *state = screen.machine().driver_data(); + device_t *pandora = screen.machine().device("pandora"); + state->m_sprite_irq = 1; + update_irq_state(screen.machine()); + pandora_eof(pandora); + } } /* Reads the cause of the interrupt */ @@ -480,11 +484,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME( ATTOSECONDS_IN_USEC(2500) /* not accurate */ ) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(sandscrp) - MCFG_SCREEN_EOF(sandscrp) + MCFG_SCREEN_UPDATE_STATIC(sandscrp) + MCFG_SCREEN_VBLANK_STATIC(sandscrp) MCFG_GFXDECODE(sandscrp) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/sangho.c mame-0.145/src/mame/drivers/sangho.c --- mame-0.144/src/mame/drivers/sangho.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/sangho.c 2012-02-06 21:30:34.000000000 +0000 @@ -37,7 +37,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "video/v9938.h" #include "sound/2413intf.h" @@ -47,12 +46,14 @@ { public: sangho_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") { } UINT8* m_ram; UINT8 m_sexyboom_bank[8]; UINT8 m_pzlestar_mem_bank; UINT8 m_pzlestar_rom_bank; + required_device m_v9938; }; @@ -236,10 +237,7 @@ ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE( 0x7c, 0x7d) AM_DEVWRITE( "ymsnd", ym2413_w ) AM_RANGE( 0x91, 0x91) AM_WRITE( pzlestar_bank_w ) - AM_RANGE( 0x98, 0x98) AM_READWRITE( v9938_0_vram_r, v9938_0_vram_w ) - AM_RANGE( 0x99, 0x99) AM_READWRITE( v9938_0_status_r, v9938_0_command_w ) - AM_RANGE( 0x9a, 0x9a) AM_WRITE( v9938_0_palette_w ) - AM_RANGE( 0x9b, 0x9b) AM_WRITE( v9938_0_register_w ) + AM_RANGE( 0x98, 0x9b) AM_DEVREADWRITE_MODERN("v9938", v9938_device, read, write ) AM_RANGE( 0xa0, 0xa0) AM_READ_PORT("P1") AM_RANGE( 0xa1, 0xa1) AM_READ_PORT("P2") AM_RANGE( 0xa8, 0xa8) AM_READWRITE( pzlestar_mem_bank_r, pzlestar_mem_bank_w ) @@ -253,10 +251,7 @@ AM_RANGE( 0x7c, 0x7d) AM_DEVWRITE( "ymsnd", ym2413_w ) AM_RANGE( 0xa0, 0xa0) AM_READ_PORT("P1") AM_RANGE( 0xa1, 0xa1) AM_READ_PORT("P2") - AM_RANGE( 0xf0, 0xf0) AM_READWRITE( v9938_0_vram_r,v9938_0_vram_w ) - AM_RANGE( 0xf1, 0xf1) AM_READWRITE( v9938_0_status_r,v9938_0_command_w ) - AM_RANGE( 0xf2, 0xf2) AM_WRITE( v9938_0_palette_w ) - AM_RANGE( 0xf3, 0xf3) AM_WRITE( v9938_0_register_w ) + AM_RANGE( 0xf0, 0xf3) AM_DEVREADWRITE_MODERN("v9938", v9938_device, read, write ) AM_RANGE( 0xf7, 0xf7) AM_READ_PORT("DSW") AM_RANGE( 0xf8, 0xff) AM_WRITE( sexyboom_bank_w ) ADDRESS_MAP_END @@ -326,8 +321,6 @@ sangho_state *state = machine.driver_data(); state->m_pzlestar_mem_bank = 2; pzlestar_map_banks(machine); - - v9938_reset(0); } static MACHINE_RESET(sexyboom) @@ -345,45 +338,45 @@ sexyboom_map_bank(machine, 1); sexyboom_map_bank(machine, 2); sexyboom_map_bank(machine, 3); - - v9938_reset(0); } -static void msx_vdp_interrupt(running_machine &machine, int i) +static void msx_vdp_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line (machine, "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); + cputag_set_input_line (device.machine(), "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); } -static INTERRUPT_GEN( sangho_interrupt ) +static TIMER_DEVICE_CALLBACK( sangho_interrupt ) { - v9938_set_sprite_limit(0, 0); - v9938_set_resolution(0, RENDER_HIGH); - v9938_interrupt(device->machine(), 0); -} - + sangho_state *state = timer.machine().driver_data(); + int scanline = param; -static VIDEO_START( sangho ) -{ - VIDEO_START_CALL(generic_bitmapped); - v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, 0x20000, msx_vdp_interrupt); + if((scanline % 2) == 0) + { + state->m_v9938->set_sprite_limit(0); + state->m_v9938->set_resolution(RENDER_HIGH); + state->m_v9938->interrupt(); + } } + static MACHINE_CONFIG_START( pzlestar, sangho_state ) MCFG_CPU_ADD("maincpu", Z80,8000000) // ? MCFG_CPU_PROGRAM_MAP(sangho_map) MCFG_CPU_IO_MAP(pzlestar_io_map) - MCFG_CPU_VBLANK_INT_HACK(sangho_interrupt,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", sangho_interrupt, "screen", 0, 1) MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) + MCFG_V9938_ADD("v9938", "screen", 0x20000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(msx_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2) MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1) - MCFG_SCREEN_UPDATE( generic_bitmapped ) MCFG_PALETTE_LENGTH(512) @@ -391,9 +384,6 @@ MCFG_PALETTE_INIT( v9938 ) - MCFG_VIDEO_START( sangho ) - - MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ymsnd", YM2413, 3580000) @@ -406,17 +396,19 @@ MCFG_CPU_ADD("maincpu", Z80,8000000) // ? MCFG_CPU_PROGRAM_MAP(sangho_map) MCFG_CPU_IO_MAP(sexyboom_io_map) - MCFG_CPU_VBLANK_INT_HACK(sangho_interrupt,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", sangho_interrupt, "screen", 0, 1) MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) + MCFG_V9938_ADD("v9938", "screen", 0x20000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(msx_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2) MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1) - MCFG_SCREEN_UPDATE( generic_bitmapped ) MCFG_PALETTE_LENGTH(512) @@ -424,8 +416,6 @@ MCFG_PALETTE_INIT( v9938 ) - MCFG_VIDEO_START( sangho ) - MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ymsnd", YM2413, 3580000) diff -Nru mame-0.144/src/mame/drivers/saturn.c mame-0.145/src/mame/drivers/saturn.c --- mame-0.144/src/mame/drivers/saturn.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/saturn.c 2012-02-06 21:30:35.000000000 +0000 @@ -1370,7 +1370,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_START("P1_KEY1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1380,7 +1380,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_START("P1_KEY2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1421,7 +1421,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_PLAYER(2) PORT_START("P2_KEY1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(2) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1431,7 +1431,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_PLAYER(2) PORT_START("P2_KEY2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(2) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2149,10 +2149,44 @@ struct cdrom_interface saturn_cdrom = { - NULL, + "sat_cdrom", NULL }; + + + +static DEVICE_IMAGE_LOAD( sat_cart ) +{ + UINT8 *ROM = image.device().machine().region("maincpu")->base()+0x080000; + UINT32 length; + + if (image.software_entry() != NULL) + { + length = image.get_software_region_length("cart"); + UINT8* imagex = image.get_software_region("cart"); + + memcpy(ROM, imagex, length); + } + else + { + length = image.fread( ROM, 0x400000); + } + + // fix endianness.... + for (int i=0;i m_maincpu; + required_device m_pit8254; + required_device m_dma8237_1; + required_device m_dma8237_2; + required_device m_pic8259_1; + required_device m_pic8259_2; + + DECLARE_READ8_MEMBER( get_slave_ack ); + DECLARE_WRITE32_MEMBER( bios_ram_w ); + +protected: + + // driver_device overrides +// virtual void video_start(); }; +// Intel 82439TX System Controller (MXTC) + +static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + savquest_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("MXTC: read %d, %02X\n", function, reg); + + return state->m_mxtc_config_reg[reg]; +} + +static void mxtc_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + savquest_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("%s:MXTC: write %d, %02X, %02X\n", machine.describe_context(), function, reg, data); + + #if 1 + switch(reg) + { + case 0x59: // PAM0 + { + if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + { + memory_set_bankptr(busdevice->machine(), "bank1", state->m_bios_ram); + } + else // disable RAM access (reads go to BIOS ROM) + { + memory_set_bankptr(busdevice->machine(), "bank1", busdevice->machine().region("bios")->base() + 0x20000); + } + break; + } + } + #endif + + state->m_mxtc_config_reg[reg] = data; +} + +static void intel82439tx_init(running_machine &machine) +{ + savquest_state *state = machine.driver_data(); + state->m_mxtc_config_reg[0x60] = 0x02; + state->m_mxtc_config_reg[0x61] = 0x02; + state->m_mxtc_config_reg[0x62] = 0x02; + state->m_mxtc_config_reg[0x63] = 0x02; + state->m_mxtc_config_reg[0x64] = 0x02; + state->m_mxtc_config_reg[0x65] = 0x02; +} + +static UINT32 intel82439tx_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= mxtc_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mxtc_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mxtc_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mxtc_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82439tx_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mxtc_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mxtc_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mxtc_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mxtc_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) + +static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + savquest_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("PIIX4: read %d, %02X\n", function, reg); + return state->m_piix4_config_reg[function][reg]; +} + +static void piix4_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + savquest_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine.describe_context(), function, reg, data); + state->m_piix4_config_reg[function][reg] = data; +} + +static UINT32 intel82371ab_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82371ab_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + +WRITE32_MEMBER(savquest_state::bios_ram_w) +{ + //if (m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + #if 1 + if (m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram + offset); + } + #endif +} -static VIDEO_START(savquest) +static READ32_DEVICE_HANDLER( ide_r ) { + return ide_controller32_r(device, 0x1f0/4 + offset, mem_mask); } -static SCREEN_UPDATE(savquest) +static WRITE32_DEVICE_HANDLER( ide_w ) { - return 0; + ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); } -static ADDRESS_MAP_START(savquest_map, AS_PROGRAM, 32) +static READ32_DEVICE_HANDLER( fdc_r ) +{ + return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( fdc_w ) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); +} + +static READ8_HANDLER(at_page8_r) +{ + savquest_state *state = space->machine().driver_data(); + UINT8 data = state->m_at_pages[offset % 0x10]; + + switch(offset % 8) { + case 1: + data = state->m_dma_offset[(offset / 8) & 1][2]; + break; + case 2: + data = state->m_dma_offset[(offset / 8) & 1][3]; + break; + case 3: + data = state->m_dma_offset[(offset / 8) & 1][1]; + break; + case 7: + data = state->m_dma_offset[(offset / 8) & 1][0]; + break; + } + return data; +} + + +static WRITE8_HANDLER(at_page8_w) +{ + savquest_state *state = space->machine().driver_data(); + state->m_at_pages[offset % 0x10] = data; + + switch(offset % 8) { + case 1: + state->m_dma_offset[(offset / 8) & 1][2] = data; + break; + case 2: + state->m_dma_offset[(offset / 8) & 1][3] = data; + break; + case 3: + state->m_dma_offset[(offset / 8) & 1][1] = data; + break; + case 7: + state->m_dma_offset[(offset / 8) & 1][0] = data; + break; + } +} + +static READ32_HANDLER(at_page32_r) +{ + return read32le_with_read8_handler(at_page8_r, space, offset, mem_mask); +} + + +static WRITE32_HANDLER(at_page32_w) +{ + write32le_with_write8_handler(at_page8_w, space, offset, data, mem_mask); +} + +static READ8_DEVICE_HANDLER(at_dma8237_2_r) +{ + return i8237_r(device, offset / 2); +} + +static WRITE8_DEVICE_HANDLER(at_dma8237_2_w) +{ + i8237_w(device, offset / 2, data); +} + +static READ32_DEVICE_HANDLER(at32_dma8237_2_r) +{ + return read32le_with_read8_device_handler(at_dma8237_2_r, device, offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER(at32_dma8237_2_w) +{ + write32le_with_write8_device_handler(at_dma8237_2_w, device, offset, data, mem_mask); +} + + + + +static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed ) +{ + cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + /* Assert HLDA */ + i8237_hlda_w( device, state ); +} + + +static READ8_HANDLER( pc_dma_read_byte ) +{ + savquest_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + return space->read_byte(page_offset + offset); +} + + +static WRITE8_HANDLER( pc_dma_write_byte ) +{ + savquest_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + space->write_byte(page_offset + offset, data); +} + +static void set_dma_channel(device_t *device, int channel, int state) +{ + savquest_state *drvstate = device->machine().driver_data(); + if (!state) drvstate->m_dma_channel = channel; +} + +static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); } + +static I8237_INTERFACE( dma8237_1_config ) +{ + DEVCB_LINE(pc_dma_hrq_changed), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte), + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte), + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) } +}; + +static I8237_INTERFACE( dma8237_2_config ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } +}; + + +static ADDRESS_MAP_START(savquest_map, AS_PROGRAM, 32, savquest_state) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("user1", 0) /* System BIOS */ + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM + AM_RANGE(0x000c0000, 0x000c7fff) AM_ROM AM_REGION("video_bios", 0) + AM_RANGE(0x000e0000, 0x000fffff) AM_ROMBANK("bank1") + AM_RANGE(0x000e0000, 0x000fffff) AM_WRITE(bios_ram_w) + AM_RANGE(0x00100000, 0x01ffffff) AM_RAM +// AM_RANGE(0x02000000, 0x02000003) // protection dongle lies there? + AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END -static ADDRESS_MAP_START(savquest_io, AS_IO, 32) +static ADDRESS_MAP_START(savquest_io, AS_IO, 32, savquest_state) + AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, 0xffffffff) + AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8_LEGACY("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) + AM_RANGE(0x0060, 0x006f) AM_READWRITE_LEGACY(kbdc8042_32le_r, kbdc8042_32le_w) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ + AM_RANGE(0x0080, 0x009f) AM_READWRITE_LEGACY(at_page32_r, at_page32_w) + AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE_LEGACY("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) + AM_RANGE(0x00e8, 0x00ef) AM_NOP + + AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE_LEGACY("ide", ide_r, ide_w) + AM_RANGE(0x03f0, 0x03f7) AM_DEVREADWRITE_LEGACY("ide", fdc_r, fdc_w) + + AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE_LEGACY("pcibus", pci_32le_r, pci_32le_w) + +// AM_RANGE(0x5000, 0x5007) // routes to port $eb ADDRESS_MAP_END static INPUT_PORTS_START( savquest ) INPUT_PORTS_END +static const struct pit8253_config savquest_pit8254_config = +{ + { + { + 4772720/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +static WRITE_LINE_DEVICE_HANDLER( savquest_pic8259_1_set_int_line ) +{ + savquest_state *drvstate = device->machine().driver_data(); + device_set_input_line(drvstate->m_maincpu, 0, state ? HOLD_LINE : CLEAR_LINE); +} + +READ8_MEMBER( savquest_state::get_slave_ack ) +{ + if (offset==2) { // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface savquest_pic8259_1_config = +{ + DEVCB_LINE(savquest_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_MEMBER(savquest_state,get_slave_ack) +}; + +static const struct pic8259_interface savquest_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + +static void set_gate_a20(running_machine &machine, int a20) +{ + savquest_state *state = machine.driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + savquest_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static int savquest_get_out2(running_machine &machine) +{ + savquest_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2 ); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, savquest_get_out2 +}; + +static void savquest_set_keyb_int(running_machine &machine, int state) +{ + savquest_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static IRQ_CALLBACK(irq_callback) +{ + savquest_state *state = device->machine().driver_data(); + return pic8259_acknowledge( state->m_pic8259_1); +} + +static void ide_interrupt(device_t *device, int state) +{ + savquest_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} + +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color + +static MACHINE_START( savquest ) +{ + savquest_state *state = machine.driver_data(); + state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x20000/4); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, savquest_set_keyb_int); + + device_set_irq_callback(state->m_maincpu, irq_callback); + intel82439tx_init(machine); + + kbdc8042_init(machine, &at8042); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} + +static MACHINE_RESET( savquest ) +{ + memory_set_bankptr(machine, "bank1", machine.region("bios")->base() + 0x20000); +} + + static MACHINE_CONFIG_START( savquest, savquest_state ) MCFG_CPU_ADD("maincpu", PENTIUM, 450000000) // actually Pentium II 450 MCFG_CPU_PROGRAM_MAP(savquest_map) MCFG_CPU_IO_MAP(savquest_io) - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(savquest) - MCFG_PALETTE_LENGTH(16) + MCFG_MACHINE_START(savquest) + MCFG_MACHINE_RESET(savquest) - MCFG_VIDEO_START(savquest) + MCFG_PIT8254_ADD( "pit8254", savquest_pit8254_config ) + MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) + MCFG_PIC8259_ADD( "pic8259_1", savquest_pic8259_1_config ) + MCFG_PIC8259_ADD( "pic8259_2", savquest_pic8259_2_config ) + + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + + MCFG_PCI_BUS_ADD("pcibus", 0) + MCFG_PCI_BUS_DEVICE(0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) + MCFG_PCI_BUS_DEVICE(7, NULL, intel82371ab_pci_r, intel82371ab_pci_w) + + MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END ROM_START( savquest ) - ROM_REGION32_LE(0x40000, "user1", 0) - ROM_LOAD( "sq-aflash.bin", 0x000000, 0x040000, CRC(0b4f406f) SHA1(4003b0e6d46dcb47012acc118837f0f7cf529faf) ) + ROM_REGION32_LE(0x40000, "bios", 0) + ROM_LOAD( "sq-aflash.bin", 0x00000, 0x040000, CRC(0b4f406f) SHA1(4003b0e6d46dcb47012acc118837f0f7cf529faf) ) // first half is 1-filled + + ROM_REGION( 0x8000, "video_bios", 0 ) // TODO: needs proper video BIOS dumped + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) DISK_REGION( "disk" ) DISK_IMAGE( "savquest", 0, SHA1(b20cacf45e093b533c538bf4fc08f05f9475d640) ) ROM_END -GAME(1999, savquest, 0, savquest, savquest, 0, ROT0, "Interactive Light", "Savage Quest", GAME_NO_SOUND|GAME_NOT_WORKING) +GAME(1999, savquest, 0, savquest, savquest, 0, ROT0, "Interactive Light", "Savage Quest", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/sbasketb.c mame-0.145/src/mame/drivers/sbasketb.c --- mame-0.144/src/mame/drivers/sbasketb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sbasketb.c 2012-02-06 21:30:35.000000000 +0000 @@ -60,6 +60,12 @@ coin_counter_w(space->machine(), offset, data); } +static WRITE8_HANDLER( irq_mask_w ) +{ + sbasketb_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( sbasketb_map, AS_PROGRAM, 8 ) AM_RANGE(0x2000, 0x2fff) AM_RAM @@ -71,7 +77,7 @@ AM_RANGE(0x3c10, 0x3c10) AM_READNOP /* ???? */ AM_RANGE(0x3c20, 0x3c20) AM_WRITEONLY AM_BASE_MEMBER(sbasketb_state, m_palettebank) AM_RANGE(0x3c80, 0x3c80) AM_WRITE(sbasketb_flipscreen_w) - AM_RANGE(0x3c81, 0x3c81) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x3c81, 0x3c81) AM_WRITE(irq_mask_w) AM_RANGE(0x3c83, 0x3c84) AM_WRITE(sbasketb_coin_counter_w) AM_RANGE(0x3c85, 0x3c85) AM_WRITEONLY AM_BASE_MEMBER(sbasketb_state, m_spriteram_select) AM_RANGE(0x3d00, 0x3d00) AM_WRITE(soundlatch_w) @@ -171,13 +177,20 @@ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 16*16, 16*16 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + sbasketb_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} static MACHINE_CONFIG_START( sbasketb, sbasketb_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1400000) /* 1.400 MHz ??? */ MCFG_CPU_PROGRAM_MAP(sbasketb_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_14_31818MHz / 4) /* 3.5795 MHz */ MCFG_CPU_PROGRAM_MAP(sbasketb_sound_map) @@ -186,10 +199,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(sbasketb) + MCFG_SCREEN_UPDATE_STATIC(sbasketb) MCFG_GFXDECODE(sbasketb) MCFG_PALETTE_LENGTH(16*16+16*16*16) diff -Nru mame-0.144/src/mame/drivers/sbowling.c mame-0.145/src/mame/drivers/sbowling.c --- mame-0.144/src/mame/drivers/sbowling.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sbowling.c 2012-02-06 21:30:35.000000000 +0000 @@ -39,7 +39,6 @@ #include "emu.h" #include "cpu/i8085/i8085.h" -#include "deprecat.h" #include "cpu/mcs48/mcs48.h" #include "video/resnet.h" #include "sound/ay8910.h" @@ -49,17 +48,21 @@ { public: sbowling_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } int m_bgmap; UINT8 *m_videoram; int m_sbw_system; tilemap_t *m_sb_tilemap; - bitmap_t *m_tmpbitmap; + bitmap_ind16 *m_tmpbitmap; UINT32 m_color_prom_address; UINT8 m_pix_sh; UINT8 m_pix[2]; + + required_device m_maincpu; }; static TILE_GET_INFO( get_sb_tile_info ) @@ -71,14 +74,14 @@ SET_TILE_INFO(0, tileno, 0, 0); } -static void plot_pixel_sbw(bitmap_t *tmpbitmap, int x, int y, int col, int flip) +static void plot_pixel_sbw(bitmap_ind16 *tmpbitmap, int x, int y, int col, int flip) { if (flip) { y = 255-y; x = 247-x; } - *BITMAP_ADDR16(tmpbitmap, y, x) = col; + tmpbitmap->pix16(y, x) = col; } static WRITE8_HANDLER( sbw_videoram_w ) @@ -105,13 +108,13 @@ } } -static SCREEN_UPDATE(sbowling) +static SCREEN_UPDATE_IND16(sbowling) { - sbowling_state *state = screen->machine().driver_data(); + sbowling_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x18); - tilemap_draw(bitmap, cliprect,state->m_sb_tilemap, 0, 0); - copybitmap_trans(bitmap, state->m_tmpbitmap, 0, 0, 0, 0, cliprect, state->m_color_prom_address); + bitmap.fill(0x18, cliprect); + state->m_sb_tilemap->draw(bitmap, cliprect, 0, 0); + copybitmap_trans(bitmap, *state->m_tmpbitmap, 0, 0, 0, 0, cliprect, state->m_color_prom_address); return 0; } @@ -119,7 +122,7 @@ { sbowling_state *state = machine.driver_data(); - state->m_tmpbitmap = auto_bitmap_alloc(machine,32*8,32*8,machine.primary_screen->format()); + state->m_tmpbitmap = auto_bitmap_ind16_alloc(machine,32*8,32*8); state->m_sb_tilemap = tilemap_create(machine, get_sb_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } @@ -153,11 +156,17 @@ -static INTERRUPT_GEN( sbw_interrupt ) +static TIMER_DEVICE_CALLBACK( sbw_interrupt ) { - int vector = device->machine().primary_screen->vblank() ? 0xcf : 0xd7; /* RST 08h/10h */ + sbowling_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 256) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xcf); /* RST 08h */ + + if(scanline == 128) + device_set_input_line_and_vector(state->m_maincpu, 0, HOLD_LINE, 0xd7); /* RST 10h */ - device_set_input_line_and_vector(device, 0, HOLD_LINE, vector); } static WRITE8_HANDLER (system_w) @@ -197,7 +206,7 @@ state->m_color_prom_address = ((data&0x07)<<7) | ((data&0xc0)>>3); state->m_bgmap = ((data>>4)^3) & 0x3; - tilemap_mark_all_tiles_dirty(state->m_sb_tilemap); + state->m_sb_tilemap->mark_all_dirty(); } static READ8_HANDLER (controls_r) @@ -316,9 +325,9 @@ static const gfx_layout charlayout = { 8,8, - 256, + RGN_FRAC(1,3), 3, - { 0x800*0*8, 0x800*1*8, 0x800*2*8 }, + { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, { 7, 6, 5, 4, 3, 2, 1, 0 }, { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 @@ -369,20 +378,19 @@ } static MACHINE_CONFIG_START( sbowling, sbowling_state ) - MCFG_CPU_ADD("maincpu", I8080, XTAL_19_968MHz/10) /* ? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(port_map) - MCFG_CPU_VBLANK_INT_HACK(sbw_interrupt, 2) - MCFG_GFXDECODE(sbowling) + MCFG_TIMER_ADD_SCANLINE("scantimer", sbw_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) /* vert size taken from mw8080bw */ MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 32*8-1) - MCFG_SCREEN_UPDATE(sbowling) + MCFG_SCREEN_UPDATE_STATIC(sbowling) + + MCFG_GFXDECODE(sbowling) MCFG_PALETTE_LENGTH(0x400) MCFG_PALETTE_INIT(sbowling) diff -Nru mame-0.144/src/mame/drivers/sbrkout.c mame-0.145/src/mame/drivers/sbrkout.c --- mame-0.144/src/mame/drivers/sbrkout.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sbrkout.c 2012-02-06 21:30:36.000000000 +0000 @@ -310,7 +310,7 @@ sbrkout_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -321,13 +321,13 @@ * *************************************/ -static SCREEN_UPDATE( sbrkout ) +static SCREEN_UPDATE_IND16( sbrkout ) { - sbrkout_state *state = screen->machine().driver_data(); + sbrkout_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int ball; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); for (ball = 2; ball >= 0; ball--) { @@ -335,7 +335,7 @@ int sx = 31 * 8 - videoram[0x380 + 0x10 + ball * 2]; int sy = 30 * 8 - videoram[0x380 + 0x18 + ball * 2]; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], code, 0, 0, 0, sx, sy, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, 0, 0, 0, sx, sy, 0); } return 0; } @@ -510,8 +510,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK/2, 384, 0, 256, 262, 0, 224) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(sbrkout) + MCFG_SCREEN_UPDATE_STATIC(sbrkout) MCFG_PALETTE_INIT(black_and_white) MCFG_VIDEO_START(sbrkout) diff -Nru mame-0.144/src/mame/drivers/sbugger.c mame-0.145/src/mame/drivers/sbugger.c --- mame-0.144/src/mame/drivers/sbugger.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/sbugger.c 2012-02-06 21:30:40.000000000 +0000 @@ -224,10 +224,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(sbugger) + MCFG_SCREEN_UPDATE_STATIC(sbugger) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/scobra.c mame-0.145/src/mame/drivers/scobra.c --- mame-0.144/src/mame/drivers/scobra.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/scobra.c 2012-02-06 21:30:37.000000000 +0000 @@ -677,10 +677,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_GFXDECODE(scobra) MCFG_PALETTE_LENGTH(32+64+2+1) /* 32 for characters, 64 for stars, 2 for bullets, 1 for background */ @@ -708,7 +707,6 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_PALETTE_LENGTH(32+64+2+128) /* 32 for characters, 64 for stars, 2 for bullets, 128 for background */ MCFG_PALETTE_INIT(rescue) @@ -722,7 +720,6 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_PALETTE_LENGTH(32+64+2+256) /* 32 for characters, 64 for stars, 2 for bullets, 256 for background */ MCFG_PALETTE_INIT(minefld) @@ -803,10 +800,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_GFXDECODE(scobra) MCFG_PALETTE_LENGTH(32+64+2) /* 32 for characters, 64 for stars, 2 for bullets */ diff -Nru mame-0.144/src/mame/drivers/scotrsht.c mame-0.145/src/mame/drivers/scotrsht.c --- mame-0.144/src/mame/drivers/scotrsht.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/scotrsht.c 2012-02-06 21:30:37.000000000 +0000 @@ -115,40 +115,40 @@ KONAMI8_B1_UNK(2) PORT_START("DSW1") /* $3303 -> $196e */ - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW2") /* $3100 -> $196f */ - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x04, 0x04, "Dip MUST be OFF !" ) /* see notes */ + PORT_DIPNAME( 0x04, 0x04, "Dip MUST be OFF !" ) PORT_DIPLOCATION("SW2:3") /* see notes */ PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) /* code at 0x40f4 */ + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") /* code at 0x40f4 */ PORT_DIPSETTING( 0x08, "30k 110k 80k+" ) PORT_DIPSETTING( 0x00, "40k 120k 90k+" ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") /* $3200 -> $1970 */ - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Dip MUST be OFF !" ) /* see notes */ + PORT_DIPNAME( 0x02, 0x02, "Dip MUST be OFF !" ) PORT_DIPLOCATION("SW3:2") /* see notes */ PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPUNUSED( 0x04, IP_ACTIVE_LOW ) - PORT_DIPUNUSED( 0x08, IP_ACTIVE_LOW ) + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) INPUT_PORTS_END @@ -196,10 +196,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(scotrsht) + MCFG_SCREEN_UPDATE_STATIC(scotrsht) MCFG_GFXDECODE(scotrsht) MCFG_PALETTE_LENGTH(16*8*16+16*8*16) diff -Nru mame-0.144/src/mame/drivers/scramble.c mame-0.145/src/mame/drivers/scramble.c --- mame-0.144/src/mame/drivers/scramble.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/scramble.c 2012-02-06 21:30:38.000000000 +0000 @@ -1260,10 +1260,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_GFXDECODE(scramble) MCFG_PALETTE_LENGTH(32+64+2+1) /* 32 for characters, 64 for stars, 2 for bullets, 0/1 for background */ @@ -1481,10 +1480,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(16000.0/132/2) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(galaxold) + MCFG_SCREEN_UPDATE_STATIC(galaxold) MCFG_GFXDECODE(ad2083) MCFG_PALETTE_LENGTH(32+64+2+8) /* 32 for characters, 64 for stars, 2 for bullets, 8 for background */ diff -Nru mame-0.144/src/mame/drivers/scregg.c mame-0.145/src/mame/drivers/scregg.c --- mame-0.144/src/mame/drivers/scregg.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/scregg.c 2012-02-06 21:30:37.000000000 +0000 @@ -55,12 +55,25 @@ #include "includes/btime.h" +static TIMER_DEVICE_CALLBACK( scregg_interrupt ) +{ + btime_state *state = timer.machine().driver_data(); + device_set_input_line(state->m_maincpu, 0, (param & 8) ? ASSERT_LINE : CLEAR_LINE); +} + +static WRITE8_HANDLER( scregg_irqack_w ) +{ + btime_state *state = space->machine().driver_data(); + device_set_input_line(state->m_maincpu, 0, CLEAR_LINE); +} + + static ADDRESS_MAP_START( dommy_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x2000, 0x23ff) AM_RAM AM_BASE_SIZE_MEMBER(btime_state, m_videoram, m_videoram_size) AM_RANGE(0x2400, 0x27ff) AM_RAM AM_BASE_MEMBER(btime_state, m_colorram) AM_RANGE(0x2800, 0x2bff) AM_READWRITE(btime_mirrorvideoram_r, btime_mirrorvideoram_w) - AM_RANGE(0x4000, 0x4000) AM_READ_PORT("DSW1") AM_WRITENOP + AM_RANGE(0x4000, 0x4000) AM_READ_PORT("DSW1") AM_WRITE(scregg_irqack_w) AM_RANGE(0x4001, 0x4001) AM_READ_PORT("DSW2") AM_WRITE(btime_video_control_w) /* AM_RANGE(0x4004, 0x4004) */ /* this is read */ AM_RANGE(0x4002, 0x4002) AM_READ_PORT("P1") @@ -78,7 +91,7 @@ AM_RANGE(0x1800, 0x1bff) AM_READWRITE(btime_mirrorvideoram_r,btime_mirrorvideoram_w) AM_RANGE(0x1c00, 0x1fff) AM_READWRITE(btime_mirrorcolorram_r,btime_mirrorcolorram_w) AM_RANGE(0x2000, 0x2000) AM_READ_PORT("DSW1") AM_WRITE(btime_video_control_w) - AM_RANGE(0x2001, 0x2001) AM_READ_PORT("DSW2") AM_WRITENOP + AM_RANGE(0x2001, 0x2001) AM_READ_PORT("DSW2") AM_WRITE(scregg_irqack_w) AM_RANGE(0x2002, 0x2002) AM_READ_PORT("P1") AM_RANGE(0x2003, 0x2003) AM_READ_PORT("P2") AM_RANGE(0x2004, 0x2005) AM_DEVWRITE("ay1", ay8910_address_data_w) @@ -229,21 +242,17 @@ static MACHINE_CONFIG_START( dommy, btime_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6502, 1500000) + MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/8) MCFG_CPU_PROGRAM_MAP(dommy_map) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,16*60) //??? + MCFG_TIMER_ADD_SCANLINE("irq", scregg_interrupt, "screen", 0, 8) MCFG_MACHINE_START(scregg) MCFG_MACHINE_RESET(scregg) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072) /* frames per second, vblank duration taken from Burger Time */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(eggs) + MCFG_SCREEN_RAW_PARAMS(XTAL_12MHz/2, 384, 8, 248, 272, 8, 248) + MCFG_SCREEN_UPDATE_STATIC(eggs) MCFG_GFXDECODE(scregg) MCFG_PALETTE_LENGTH(8) @@ -254,10 +263,10 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ay1", AY8910, 1500000) + MCFG_SOUND_ADD("ay1", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) - MCFG_SOUND_ADD("ay2", AY8910, 1500000) + MCFG_SOUND_ADD("ay2", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) MACHINE_CONFIG_END @@ -265,21 +274,17 @@ static MACHINE_CONFIG_START( scregg, btime_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6502, 1500000) + MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/8) MCFG_CPU_PROGRAM_MAP(eggs_map) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,16*60) //??? + MCFG_TIMER_ADD_SCANLINE("irq", scregg_interrupt, "screen", 0, 8) MCFG_MACHINE_START(scregg) MCFG_MACHINE_RESET(scregg) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072) /* frames per second, vblank duration taken from Burger Time */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(eggs) + MCFG_SCREEN_RAW_PARAMS(XTAL_12MHz/2, 384, 8, 248, 272, 8, 248) + MCFG_SCREEN_UPDATE_STATIC(eggs) MCFG_GFXDECODE(scregg) MCFG_PALETTE_LENGTH(8) @@ -290,10 +295,10 @@ /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ay1", AY8910, 1500000) + MCFG_SOUND_ADD("ay1", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) - MCFG_SOUND_ADD("ay2", AY8910, 1500000) + MCFG_SOUND_ADD("ay2", AY8910, XTAL_12MHz/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/sderby.c mame-0.145/src/mame/drivers/sderby.c --- mame-0.144/src/mame/drivers/sderby.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/sderby.c 2012-02-06 21:30:37.000000000 +0000 @@ -465,10 +465,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1) - MCFG_SCREEN_UPDATE(sderby) + MCFG_SCREEN_UPDATE_STATIC(sderby) MCFG_GFXDECODE(sderby) MCFG_PALETTE_LENGTH(0x1000) @@ -490,10 +489,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1) - MCFG_SCREEN_UPDATE(pmroulet) + MCFG_SCREEN_UPDATE_STATIC(pmroulet) MCFG_GFXDECODE(sderby) MCFG_PALETTE_LENGTH(0x1000) @@ -515,10 +513,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 44*8-1, 3*8, 33*8-1) - MCFG_SCREEN_UPDATE(pmroulet) + MCFG_SCREEN_UPDATE_STATIC(pmroulet) MCFG_GFXDECODE(sderby) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/seattle.c mame-0.145/src/mame/drivers/seattle.c --- mame-0.144/src/mame/drivers/seattle.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/seattle.c 2012-02-06 21:30:40.000000000 +0000 @@ -477,9 +477,9 @@ * *************************************/ -static SCREEN_UPDATE( seattle ) +static SCREEN_UPDATE_RGB32( seattle ) { - seattle_state *state = screen->machine().driver_data(); + seattle_state *state = screen.machine().driver_data(); return voodoo_update(state->m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -2517,10 +2517,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(seattle) + MCFG_SCREEN_UPDATE_STATIC(seattle) /* sound hardware */ MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/segac2.c mame-0.145/src/mame/drivers/segac2.c --- mame-0.144/src/mame/drivers/segac2.c 2012-01-13 15:34:49.000000000 +0000 +++ mame-0.145/src/mame/drivers/segac2.c 2012-02-06 21:30:39.000000000 +0000 @@ -1262,16 +1262,16 @@ megadrive_vdp_palette_lookup_highlight = auto_alloc_array(machine, UINT16, 0x1000/2); } -static SCREEN_UPDATE(segac2_new) +static SCREEN_UPDATE_RGB32(segac2_new) { - segac2_state *state = screen->machine().driver_data(); + segac2_state *state = screen.machine().driver_data(); if (!state->m_segac2_enable_display) { - bitmap_fill(bitmap, NULL, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); return 0; } - SCREEN_UPDATE_CALL(megadriv); + SCREEN_UPDATE32_CALL(megadriv); return 0; } @@ -1292,13 +1292,12 @@ //MCFG_VIDEO_ATTRIBUTES(VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS) MCFG_SCREEN_ADD("megadriv", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) - MCFG_SCREEN_UPDATE(segac2_new) - MCFG_SCREEN_EOF( megadriv ) + MCFG_SCREEN_UPDATE_STATIC(segac2_new) + MCFG_SCREEN_VBLANK_STATIC( megadriv ) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/segae.c mame-0.145/src/mame/drivers/segae.c --- mame-0.144/src/mame/drivers/segae.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segae.c 2012-02-06 21:30:35.000000000 +0000 @@ -298,14 +298,59 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" #include "sound/sn76496.h" #include "machine/mc8123.h" #include "machine/segacrp2.h" -#include "includes/segamsys.h" +#include "video/315_5124.h" #include "includes/segaipt.h" + +class systeme_state : public driver_device +{ +protected: + virtual void driver_start(); + virtual void machine_start(); + +public: + systeme_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_vdp1(*this, "vdp1") + , m_vdp2(*this, "vdp2") + { } + + DECLARE_WRITE8_MEMBER( videoram_write ); + DECLARE_WRITE8_MEMBER( bank_write ); + DECLARE_WRITE_LINE_MEMBER( int_callback ); + + DECLARE_READ8_MEMBER( ridleofp_port_f8_read ); + DECLARE_WRITE8_MEMBER( ridleofp_port_fa_write ); + DECLARE_READ8_MEMBER( hangonjr_port_f8_read ); + DECLARE_WRITE8_MEMBER( hangonjr_port_fa_write ); + + // Devices + required_device m_maincpu; + required_device m_vdp1; + required_device m_vdp2; + + // Video RAM + memory_region *m_vdp1_vram; + memory_region *m_vdp2_vram; + + UINT8 m_f7_bank_value; + UINT8 m_port_fa_last; + int m_port_to_read; + int m_last1; + int m_last2; + int m_diff1; + int m_diff2; +}; + + /**************************************************************************************** Memory Maps @@ -314,104 +359,182 @@ ****************************************************************************************/ -static UINT8 f7_bank_value; - /* we have to fill in the ROM addresses for systeme due to the encrypted games */ -static ADDRESS_MAP_START( systeme_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x7fff) AM_ROM /* Fixed ROM */ - AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") /* Banked ROM */ +static ADDRESS_MAP_START( systeme_map, AS_PROGRAM, 8, systeme_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM /* Fixed ROM */ + AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_WRITE( videoram_write ) /* Banked ROM */ + AM_RANGE(0xc000, 0xffff) AM_RAM +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( io_map, AS_IO, 8, systeme_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + + AM_RANGE(0x7b, 0x7b) AM_DEVWRITE_LEGACY( "sn1", sn76496_w ) + AM_RANGE(0x7e, 0x7f) AM_DEVWRITE_LEGACY( "sn2", sn76496_w ) + AM_RANGE(0x7e, 0x7e) AM_DEVREAD( "vdp1", sega315_5124_device, vcount_read ) + AM_RANGE(0xba, 0xba) AM_DEVREADWRITE( "vdp1", sega315_5124_device, vram_read, vram_write ) + AM_RANGE(0xbb, 0xbb) AM_DEVREADWRITE( "vdp1", sega315_5124_device, register_read, register_write ) + AM_RANGE(0xbe, 0xbe) AM_DEVREADWRITE( "vdp2", sega315_5124_device, vram_read, vram_write ) + AM_RANGE(0xbf, 0xbf) AM_DEVREADWRITE( "vdp2", sega315_5124_device, register_read, register_write ) + AM_RANGE(0xe0, 0xe0) AM_READ_PORT( "e0" ) + AM_RANGE(0xe1, 0xe1) AM_READ_PORT( "e1" ) + AM_RANGE(0xe2, 0xe2) AM_READ_PORT( "e2" ) + AM_RANGE(0xf2, 0xf2) AM_READ_PORT( "f2" ) + AM_RANGE(0xf3, 0xf3) AM_READ_PORT( "f3" ) + AM_RANGE(0xf7, 0xf7) AM_WRITE( bank_write ) +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( vdp1_map, AS_0, 8, systeme_state ) + AM_RANGE( 0x0000, 0x3fff ) AM_RAMBANK("vdp1_bank") +ADDRESS_MAP_END + + +static ADDRESS_MAP_START( vdp2_map, AS_0, 8, systeme_state ) + AM_RANGE( 0x0000, 0x3fff ) AM_RAMBANK("vdp2_bank") ADDRESS_MAP_END -static WRITE8_HANDLER( segasyse_videoram_w ) +WRITE8_MEMBER( systeme_state::videoram_write ) { - if (f7_bank_value & 0x20) + if (m_f7_bank_value & 0x20) { // to vdp1 vram - if (f7_bank_value & 0x80) + if (m_f7_bank_value & 0x80) { - vdp1_vram_bank0[offset] = data; + m_vdp1_vram->base()[offset] = data; } else { - vdp1_vram_bank1[offset] = data; + m_vdp1_vram->base()[0x4000 + offset] = data; } } else { // to vdp2 vram - if (f7_bank_value & 0x40) + if (m_f7_bank_value & 0x40) { - vdp2_vram_bank0[offset] = data; + m_vdp2_vram->base()[offset] = data; } else { - vdp2_vram_bank1[offset] = data; + m_vdp2_vram->base()[0x4000 + offset] = data; } } } -static WRITE8_HANDLER( systeme_bank_w ) + +WRITE8_MEMBER( systeme_state::bank_write ) { - int rombank; - f7_bank_value = data; + m_f7_bank_value = data; + + memory_set_bankptr(machine(), "vdp1_bank", m_vdp1_vram->base() + ( ( data & 0x80 ) ? 0x4000 : 0 ) ); + memory_set_bankptr(machine(), "vdp2_bank", m_vdp2_vram->base() + ( ( data & 0x40 ) ? 0x4000 : 0 ) ); - rombank = data & 0x0f; + memory_set_bank(machine(), "bank1", data & 0x0f); +} - segae_set_vram_banks(data); - //memcpy(sms_rom+0x8000, space->machine().region("user1")->base()+0x10000+rombank*0x4000, 0x4000); - memory_set_bank(space->machine(), "bank1", rombank); +void systeme_state::driver_start() +{ + /* Allocate video RAM */ + m_vdp1_vram = machine().region_alloc("vdp1_vram", 2 * 0x4000, 1, ENDIANNESS_LITTLE); + m_vdp2_vram = machine().region_alloc("vdp2_vram", 2 * 0x4000, 1, ENDIANNESS_LITTLE); + + memory_configure_bank(machine(), "bank1", 0, 16, machine().region("maincpu")->base() + 0x10000, 0x4000); + if ( !strcmp( m_system->name, "ridleofp" ) ) + { + m_maincpu->memory().space(AS_IO)->install_read_handler(0xf8, 0xf8, read8_delegate(FUNC(systeme_state::ridleofp_port_f8_read), this)); + m_maincpu->memory().space(AS_IO)->install_write_handler(0xfa, 0xfa, write8_delegate(FUNC(systeme_state::ridleofp_port_fa_write), this)); + } + else if ( !strcmp( m_system->name, "hangonjr" ) ) + { + m_maincpu->memory().space(AS_IO)->install_read_handler(0xf8, 0xf8, read8_delegate(FUNC(systeme_state::hangonjr_port_f8_read), this)); + m_maincpu->memory().space(AS_IO)->install_write_handler(0xfa, 0xfa, write8_delegate(FUNC(systeme_state::hangonjr_port_fa_write), this)); + } + else if ( !strcmp( m_system->name, "opaopa" ) ) + { + mc8123_decrypt_rom(machine(), "maincpu", "user1", "bank1", 8); + } + else if ( !strcmp( m_system->name, "fantzn2" ) ) + { + mc8123_decrypt_rom(machine(), "maincpu", "user1", NULL, 0); + } + else if ( !strcmp( m_system->name, "astrofl" ) ) + { + sega_315_5177_decode(machine(), "maincpu"); + } } -static void init_ports_systeme(running_machine &machine) +void systeme_state::machine_start() { - /* INIT THE PORTS *********************************************************************************************/ + save_item(NAME(m_f7_bank_value)); + save_item(NAME(m_port_fa_last)); + save_item(NAME(m_port_to_read)); + save_item(NAME(m_last1)); + save_item(NAME(m_last2)); + save_item(NAME(m_diff1)); + save_item(NAME(m_diff2)); +} - address_space *io = machine.device("maincpu")->memory().space(AS_IO); - device_t *sn1 = machine.device("sn1"); - device_t *sn2 = machine.device("sn2"); - io->install_legacy_write_handler(*sn2, 0x7b, 0x7b, FUNC(sn76496_w)); - io->install_legacy_write_handler(*sn1, 0x7e, 0x7f, FUNC(sn76496_w)); - io->install_legacy_read_handler (0x7e, 0x7e, FUNC(sms_vcounter_r)); +/*- Hang On Jr. Specific -*/ +READ8_MEMBER( systeme_state::hangonjr_port_f8_read ) +{ + UINT8 temp; - io->install_legacy_readwrite_handler(0xba, 0xba, FUNC(sms_vdp_data_r), FUNC(sms_vdp_data_w)); - io->install_legacy_readwrite_handler(0xbb, 0xbb, FUNC(sms_vdp_ctrl_r), FUNC(sms_vdp_ctrl_w)); + temp = 0; - io->install_legacy_readwrite_handler(0xbe, 0xbe, FUNC(sms_vdp_2_data_r), FUNC(sms_vdp_2_data_w)); - io->install_legacy_readwrite_handler(0xbf, 0xbf, FUNC(sms_vdp_2_ctrl_r), FUNC(sms_vdp_2_ctrl_w)); + if (m_port_fa_last == 0x08) /* 0000 1000 */ /* Angle */ + temp = input_port_read(machine(), "IN2"); - io->install_read_port (0xe0, 0xe0, "e0"); - io->install_read_port (0xe1, 0xe1, "e1"); - io->install_read_port (0xe2, 0xe2, "e2"); - io->install_read_port (0xf2, 0xf2, "f2"); - io->install_read_port (0xf3, 0xf3, "f3"); + if (m_port_fa_last == 0x09) /* 0000 1001 */ /* Accel */ + temp = input_port_read(machine(), "IN3"); - io->install_legacy_write_handler (0xf7, 0xf7, FUNC(systeme_bank_w) ); + return temp; } - - -static void init_systeme_map(running_machine &machine) +WRITE8_MEMBER( systeme_state::hangonjr_port_fa_write) { - memory_configure_bank(machine, "bank1", 0, 16, machine.region("maincpu")->base() + 0x10000, 0x4000); - - /* alternate way of accessing video ram */ - machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x8000, 0xbfff, FUNC(segasyse_videoram_w)); + /* Seems to write the same pattern again and again bits ---- xx-x used */ + m_port_fa_last = data; +} - /* main ram area */ - sms_mainram = (UINT8 *)machine.device("maincpu")->memory().space(AS_PROGRAM)->install_ram(0xc000, 0xffff); - memset(sms_mainram,0x00,0x4000); +/*- Riddle of Pythagoras Specific -*/ - init_ports_systeme(machine); +READ8_MEMBER( systeme_state::ridleofp_port_f8_read ) +{ + switch (m_port_to_read) + { + default: + case 0: return m_diff1 & 0xff; + case 1: return m_diff1 >> 8; + case 2: return m_diff2 & 0xff; + case 3: return m_diff2 >> 8; + } } -static DRIVER_INIT( segasyse ) +WRITE8_MEMBER( systeme_state::ridleofp_port_fa_write ) { - init_systeme_map(machine); - DRIVER_INIT_CALL(hazemd_segasyse); + /* 0x10 is written before reading the dial (hold counters?) */ + /* 0x03 is written after reading the dial (reset counters?) */ + + m_port_to_read = (data & 0x0c) >> 2; + + if (data & 1) + { + int curr = input_port_read(machine(), "IN2"); + m_diff1 = ((curr - m_last1) & 0x0fff) | (curr & 0xf000); + m_last1 = curr; + } + if (data & 2) + { + int curr = input_port_read(machine(), "IN3") & 0x0fff; + m_diff2 = ((curr - m_last2) & 0x0fff) | (curr & 0xf000); + m_last2 = curr; + } } @@ -853,149 +976,93 @@ ROM_LOAD( "317-0042.key", 0x0000, 0x2000, CRC(d6312538) SHA1(494ac7f080775c21dc7d369e6ea78f3299e6975a) ) ROM_END -static ADDRESS_MAP_START( io_map, AS_IO, 8 ) - ADDRESS_MAP_GLOBAL_MASK(0xff) -ADDRESS_MAP_END - -static MACHINE_CONFIG_START( systeme, driver_device ) - MCFG_CPU_ADD("maincpu", Z80, XTAL_10_738635MHz/2) /* Z80B @ 5.3693Mhz */ - MCFG_CPU_PROGRAM_MAP(systeme_map) - MCFG_CPU_IO_MAP(io_map) - - /* IRQ handled via the timers */ - MCFG_MACHINE_RESET(systeme) - - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) - MCFG_SCREEN_SIZE(256, 256) -// MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223) - MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191) - MCFG_SCREEN_UPDATE(systeme) /* Copies a bitmap */ - MCFG_SCREEN_EOF(systeme) /* Used to Sync the timing */ - - MCFG_PALETTE_LENGTH(0x200) - - MCFG_VIDEO_START(sms) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("sn1", SEGAPSG, XTAL_10_738635MHz/3) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - - MCFG_SOUND_ADD("sn2", SEGAPSG, XTAL_10_738635MHz/3) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) -MACHINE_CONFIG_END - - -/*- Hang On Jr. Specific -*/ -static UINT8 port_fa_last; /* Last thing written to port 0xfa (control related) */ - -static READ8_HANDLER (segae_hangonjr_port_f8_r) +WRITE_LINE_MEMBER( systeme_state::int_callback ) { - UINT8 temp; - - temp = 0; - - if (port_fa_last == 0x08) /* 0000 1000 */ /* Angle */ - temp = input_port_read(space->machine(), "IN2"); - - if (port_fa_last == 0x09) /* 0000 1001 */ /* Accel */ - temp = input_port_read(space->machine(), "IN3"); - - return temp; + m_maincpu->set_input_line(0, state); } -static WRITE8_HANDLER (segae_hangonjr_port_fa_w) -{ - /* Seems to write the same pattern again and again bits ---- xx-x used */ - port_fa_last = data; -} -/*- Riddle of Pythagoras Specific -*/ +static const sega315_5124_interface _315_5124_1_intf = +{ + false, + "screen", + DEVCB_NULL, + DEVCB_NULL, +}; -static int port_to_read,last1,last2,diff1,diff2; -static READ8_HANDLER (segae_ridleofp_port_f8_r) +static const sega315_5124_interface _315_5124_2_intf = { - switch (port_to_read) - { - default: - case 0: return diff1 & 0xff; - case 1: return diff1 >> 8; - case 2: return diff2 & 0xff; - case 3: return diff2 >> 8; - } -} + false, + "screen", + DEVCB_DRIVER_LINE_MEMBER(systeme_state, int_callback), + DEVCB_NULL, +}; -static WRITE8_HANDLER (segae_ridleofp_port_fa_w) -{ - /* 0x10 is written before reading the dial (hold counters?) */ - /* 0x03 is written after reading the dial (reset counters?) */ - port_to_read = (data & 0x0c) >> 2; +static SCREEN_UPDATE_RGB32( systeme ) +{ + systeme_state *state = screen.machine().driver_data(); + bitmap_rgb32 &vdp1_bitmap = state->m_vdp1->get_bitmap(); + bitmap_rgb32 &vdp2_bitmap = state->m_vdp2->get_bitmap(); + bitmap_ind8 &vdp2_y1 = state->m_vdp2->get_y1_bitmap(); - if (data & 1) + for( int y = cliprect.min_y; y <= cliprect.max_y; y++ ) { - int curr = input_port_read(space->machine(), "IN2"); - diff1 = ((curr - last1) & 0x0fff) | (curr & 0xf000); - last1 = curr; - } - if (data & 2) - { - int curr = input_port_read(space->machine(), "IN3") & 0x0fff; - diff2 = ((curr - last2) & 0x0fff) | (curr & 0xf000); - last2 = curr; - } -} + UINT32 *dest_ptr = &bitmap.pix32(y); + UINT32 *vdp1_ptr = &vdp1_bitmap.pix32(y); + UINT32 *vdp2_ptr = &vdp2_bitmap.pix32(y); + UINT8 *y1_ptr = &vdp2_y1.pix8(y); -static DRIVER_INIT( ridleofp ) -{ - DRIVER_INIT_CALL(segasyse); + for ( int x = cliprect.min_x; x <= cliprect.max_x; x++ ) + { + dest_ptr[x] = ( y1_ptr[x] ) ? vdp1_ptr[x] : vdp2_ptr[x]; +//dest_ptr[x] = y1_ptr[x] ? 0xFF0000 : 0x00FF00; + } + } - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_read_handler(0xf8, 0xf8, FUNC(segae_ridleofp_port_f8_r)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xfa, 0xfa, FUNC(segae_ridleofp_port_fa_w)); + return 0; } -static DRIVER_INIT( hangonjr ) -{ - DRIVER_INIT_CALL(segasyse); +static MACHINE_CONFIG_START( systeme, systeme_state ) + MCFG_CPU_ADD("maincpu", Z80, XTAL_10_738635MHz/2) /* Z80B @ 5.3693Mhz */ + MCFG_CPU_PROGRAM_MAP(systeme_map) + MCFG_CPU_IO_MAP(io_map) - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_read_handler(0xf8, 0xf8, FUNC(segae_hangonjr_port_f8_r)); - machine.device("maincpu")->memory().space(AS_IO)->install_legacy_write_handler(0xfa, 0xfa, FUNC(segae_hangonjr_port_fa_w)); -} + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \ + SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256, \ + SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_192_TBORDER_HEIGHT + 192) + MCFG_SCREEN_UPDATE_STATIC( systeme ) /* Combines and copies a bitmap */ -static DRIVER_INIT( opaopa ) -{ - DRIVER_INIT_CALL(segasyse); + MCFG_PALETTE_LENGTH(SEGA315_5124_PALETTE_SIZE) + MCFG_PALETTE_INIT(sega315_5124) - mc8123_decrypt_rom(machine, "maincpu", "user1", "bank1", 8); -} + MCFG_SEGA315_5124_ADD("vdp1", _315_5124_1_intf) + MCFG_DEVICE_ADDRESS_MAP(AS_0, vdp1_map) -static DRIVER_INIT( fantzn2 ) -{ - DRIVER_INIT_CALL(segasyse); + MCFG_SEGA315_5124_ADD("vdp2", _315_5124_2_intf) + MCFG_DEVICE_ADDRESS_MAP(AS_0, vdp2_map) - mc8123_decrypt_rom(machine, "maincpu", "user1", NULL, 0); -} + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") -static DRIVER_INIT( astrofl ) -{ - DRIVER_INIT_CALL(segasyse); + MCFG_SOUND_ADD("sn1", SEGAPSG, XTAL_10_738635MHz/3) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + MCFG_SOUND_ADD("sn2", SEGAPSG, XTAL_10_738635MHz/3) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_CONFIG_END - sega_315_5177_decode(machine, "maincpu"); -} -// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS -GAME( 1985, hangonjr, 0, systeme, hangonjr, hangonjr, ROT0, "Sega", "Hang-On Jr.", 0 ) -GAME( 1986, transfrm, 0, systeme, transfrm, segasyse, ROT0, "Sega", "Transformer", 0 ) -GAME( 1986, astrofl, transfrm, systeme, transfrm, astrofl, ROT0, "Sega", "Astro Flash (Japan)", 0 ) -GAME( 1986, ridleofp, 0, systeme, ridleofp, ridleofp, ROT90, "Sega / Nasco", "Riddle of Pythagoras (Japan)", 0 ) -GAME( 1987, opaopa, 0, systeme, opaopa, opaopa, ROT0, "Sega", "Opa Opa (MC-8123, 317-0042)", 0 ) -GAME( 1988, fantzn2, 0, systeme, fantzn2, fantzn2, ROT0, "Sega", "Fantasy Zone 2 (MC-8123, 317-0057)", 0 ) -GAME( 1988, tetrisse, 0, systeme, tetrisse, segasyse, ROT0, "Sega", "Tetris (Japan, System E)", 0 ) +// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS +GAME( 1985, hangonjr, 0, systeme, hangonjr, 0, ROT0, "Sega", "Hang-On Jr.", 0 ) +GAME( 1986, transfrm, 0, systeme, transfrm, 0, ROT0, "Sega", "Transformer", 0 ) +GAME( 1986, astrofl, transfrm, systeme, transfrm, 0, ROT0, "Sega", "Astro Flash (Japan)", 0 ) +GAME( 1986, ridleofp, 0, systeme, ridleofp, 0, ROT90, "Sega / Nasco", "Riddle of Pythagoras (Japan)", 0 ) +GAME( 1987, opaopa, 0, systeme, opaopa, 0, ROT0, "Sega", "Opa Opa (MC-8123, 317-0042)", 0 ) +GAME( 1988, fantzn2, 0, systeme, fantzn2, 0, ROT0, "Sega", "Fantasy Zone 2 (MC-8123, 317-0057)", 0 ) +GAME( 1988, tetrisse, 0, systeme, tetrisse, 0, ROT0, "Sega", "Tetris (Japan, System E)", 0 ) diff -Nru mame-0.144/src/mame/drivers/segag80r.c mame-0.145/src/mame/drivers/segag80r.c --- mame-0.144/src/mame/drivers/segag80r.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segag80r.c 2012-02-06 21:30:41.000000000 +0000 @@ -835,9 +835,8 @@ MCFG_PALETTE_LENGTH(64) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(segag80r) + MCFG_SCREEN_UPDATE_STATIC(segag80r) MCFG_VIDEO_START(segag80r) @@ -875,7 +874,6 @@ /* background board changes */ MCFG_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_GFXDECODE(spaceod) MCFG_PALETTE_LENGTH(64+64) diff -Nru mame-0.144/src/mame/drivers/segag80v.c mame-0.145/src/mame/drivers/segag80v.c --- mame-0.144/src/mame/drivers/segag80v.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segag80v.c 2012-02-06 21:30:41.000000000 +0000 @@ -808,18 +808,18 @@ static const char *const elim_sample_names[] = { "*elim2", - "elim1.wav", - "elim2.wav", - "elim3.wav", - "elim4.wav", - "elim5.wav", - "elim6.wav", - "elim7.wav", - "elim8.wav", - "elim9.wav", - "elim10.wav", - "elim11.wav", - "elim12.wav", + "elim1", + "elim2", + "elim3", + "elim4", + "elim5", + "elim6", + "elim7", + "elim8", + "elim9", + "elim10", + "elim11", + "elim12", 0 /* end of array */ }; @@ -841,16 +841,16 @@ { "*spacfury", /* Sound samples */ - "sfury1.wav", - "sfury2.wav", - "sfury3.wav", - "sfury4.wav", - "sfury5.wav", - "sfury6.wav", - "sfury7.wav", - "sfury8.wav", - "sfury9.wav", - "sfury10.wav", + "sfury1", + "sfury2", + "sfury3", + "sfury4", + "sfury5", + "sfury6", + "sfury7", + "sfury8", + "sfury9", + "sfury10", 0 /* end of array */ }; @@ -871,17 +871,17 @@ static const char *const zektor_sample_names[] = { "*zektor", - "elim1.wav", /* 0 fireball */ - "elim2.wav", /* 1 bounce */ - "elim3.wav", /* 2 Skitter */ - "elim4.wav", /* 3 Eliminator */ - "elim5.wav", /* 4 Electron */ - "elim6.wav", /* 5 fire */ - "elim7.wav", /* 6 thrust */ - "elim8.wav", /* 7 Electron */ - "elim9.wav", /* 8 small explosion */ - "elim10.wav", /* 9 med explosion */ - "elim11.wav", /* 10 big explosion */ + "elim1", /* 0 fireball */ + "elim2", /* 1 bounce */ + "elim3", /* 2 Skitter */ + "elim4", /* 3 Eliminator */ + "elim5", /* 4 Electron */ + "elim6", /* 5 fire */ + "elim7", /* 6 thrust */ + "elim8", /* 7 Electron */ + "elim9", /* 8 small explosion */ + "elim10", /* 9 med explosion */ + "elim11", /* 10 big explosion */ 0 }; @@ -915,7 +915,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(512, 1536, 640-32, 1408+32) - MCFG_SCREEN_UPDATE(segag80v) + MCFG_SCREEN_UPDATE_STATIC(segag80v) MCFG_VIDEO_START(segag80v) diff -Nru mame-0.144/src/mame/drivers/segahang.c mame-0.145/src/mame/drivers/segahang.c --- mame-0.144/src/mame/drivers/segahang.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segahang.c 2012-02-06 21:30:41.000000000 +0000 @@ -16,7 +16,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/mcs51/mcs51.h" -#include "deprecat.h" #include "includes/segas16.h" #include "machine/segaic16.h" #include "machine/fd1089.h" @@ -141,13 +140,17 @@ } #if 0 -static INTERRUPT_GEN( hangon_irq ) +static TIMER_DEVICE_CALLBACK( hangon_irq ) { + segas1x_state *state = timer.machine().driver_data(); + int scanline = param; + /* according to the schematics, IRQ2 is generated every 16 scanlines */ - if (cpu_getiloops(device) != 0) - device_set_input_line(device, 2, HOLD_LINE); - else - device_set_input_line(device, 4, HOLD_LINE); + if((scanline % 16) == 0) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } #endif @@ -837,9 +840,8 @@ MCFG_PALETTE_LENGTH(2048*3) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224) - MCFG_SCREEN_UPDATE(hangon) + MCFG_SCREEN_UPDATE_STATIC(hangon) MCFG_VIDEO_START(hangon) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/segajw.c mame-0.145/src/mame/drivers/segajw.c --- mame-0.144/src/mame/drivers/segajw.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segajw.c 2012-02-06 21:30:39.000000000 +0000 @@ -18,6 +18,8 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" @@ -27,26 +29,40 @@ { public: segajw_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); + virtual void video_start(); }; -static VIDEO_START( segajw ) + +void segajw_state::video_start() { } -static SCREEN_UPDATE( segajw ) +UINT32 segajw_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } -static ADDRESS_MAP_START( segajw_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( segajw_map, AS_PROGRAM, 16, segajw_state ) AM_RANGE(0x000000, 0x03ffff) AM_ROM -// AM_RANGE(0x080000, 0x080001) AM_DEVREADWRITE("hd63484", hd63484_status_r, hd63484_address_w) -// AM_RANGE(0x080002, 0x080003) AM_DEVREADWRITE("hd63484", hd63484_data_r, hd63484_data_w) +// AM_RANGE(0x080000, 0x080001) AM_DEVREADWRITE_LEGACY("hd63484", hd63484_status_r, hd63484_address_w) +// AM_RANGE(0x080002, 0x080003) AM_DEVREADWRITE_LEGACY("hd63484", hd63484_data_r, hd63484_data_w) AM_RANGE(0x1a000e, 0x1a000f) AM_NOP AM_RANGE(0xff0000, 0xffffff) AM_RAM @@ -57,13 +73,12 @@ INPUT_PORTS_END -static MACHINE_START( segajw ) +void segajw_state::machine_start() { - } -static MACHINE_RESET( segajw ) +void segajw_state::machine_reset() { } @@ -78,23 +93,17 @@ MCFG_CPU_PROGRAM_MAP(segajw_map) MCFG_CPU_VBLANK_INT("screen",irq4_line_hold) - MCFG_MACHINE_START(segajw) - MCFG_MACHINE_RESET(segajw) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(segajw_state, screen_update) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(segajw) MCFG_PALETTE_INIT(segajw) MCFG_PALETTE_LENGTH(16) - MCFG_VIDEO_START(segajw) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") // MCFG_SOUND_ADD("aysnd", AY8910, MAIN_CLOCK/4) /* guess */ @@ -119,4 +128,5 @@ ROM_LOAD( "14586.epr", 0x00000, 0x80000, CRC(daeb0616) SHA1(17a8bb7137ad46a7c3ac07d22cbc4430e76e2f71) ) ROM_END + GAME( 198?, segajw, 0, segajw, segajw, 0, ROT0, "Sega", "Golden Poker Series \"Joker's Wild\" (Rev. B)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) // TODO: correct title diff -Nru mame-0.144/src/mame/drivers/segald.c mame-0.145/src/mame/drivers/segald.c --- mame-0.144/src/mame/drivers/segald.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segald.c 2012-02-06 21:30:39.000000000 +0000 @@ -20,7 +20,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "render.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" #define SCHEMATIC_CLOCK (20000000) @@ -28,7 +28,8 @@ { public: segald_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } UINT8 m_nmi_enable; @@ -37,14 +38,14 @@ UINT8* m_fix_RAM; UINT8* m_out_RAM; - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 m_ldv1000_input_latch; UINT8 m_ldv1000_output_latch; }; /* VIDEO GOODS */ -static void astron_draw_characters(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void astron_draw_characters(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { segald_state *state = machine.driver_data(); UINT8 characterX, characterY; @@ -60,7 +61,7 @@ } } -static void astron_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void astron_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* Heisted from Daphne */ const UINT8 SPR_Y_TOP = 0; @@ -89,12 +90,12 @@ } -static SCREEN_UPDATE( astron ) +static SCREEN_UPDATE_IND16( astron ) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - astron_draw_characters(screen->machine(), bitmap, cliprect); - astron_draw_sprites(screen->machine(), bitmap, cliprect); + astron_draw_characters(screen.machine(), bitmap, cliprect); + astron_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -108,7 +109,7 @@ segald_state *state = space->machine().driver_data(); if (state->m_nmi_enable) - state->m_ldv1000_input_latch = laserdisc_data_r(state->m_laserdisc); + state->m_ldv1000_input_latch = state->m_laserdisc->status_r(); logerror("DISC read (0x%04x) @ 0x%04x [0x%x]\n", state->m_ldv1000_input_latch, offset, cpu_get_pc(&space->device())); @@ -150,7 +151,7 @@ state->m_ldv1000_output_latch = data; if (state->m_nmi_enable) - laserdisc_data_w(state->m_laserdisc, state->m_ldv1000_output_latch); + state->m_laserdisc->data_w(state->m_ldv1000_output_latch); } static WRITE8_HANDLER( astron_OUT_write ) @@ -354,9 +355,6 @@ static MACHINE_START( astron ) { - segald_state *state = machine.driver_data(); - - state->m_laserdisc = machine.device("laserdisc"); } @@ -371,11 +369,11 @@ MCFG_MACHINE_START(astron) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(astron, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, astron) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_GFXDECODE(segald) MCFG_PALETTE_LENGTH(256) @@ -383,7 +381,7 @@ /* sound hardare */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/segaorun.c mame-0.145/src/mame/drivers/segaorun.c --- mame-0.144/src/mame/drivers/segaorun.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segaorun.c 2012-02-06 21:30:42.000000000 +0000 @@ -1089,9 +1089,8 @@ MCFG_PALETTE_LENGTH(4096*3) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224) - MCFG_SCREEN_UPDATE(outrun) + MCFG_SCREEN_UPDATE_STATIC(outrun) MCFG_VIDEO_START(outrun) @@ -1124,7 +1123,7 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_25MHz/4, 400, 0, 321, 262, 0, 224) - MCFG_SCREEN_UPDATE(shangon) + MCFG_SCREEN_UPDATE_STATIC(shangon) MCFG_VIDEO_START(shangon) @@ -1597,8 +1596,8 @@ /************************************************************************************************************************** Turbo Outrun (Upright version?? According to service mode dipswitch screen it's a Cockpit) - CPU: FD1094 (317-????) - GAME BD 834-6919 + CPU: FD1094 (317-0107) + GAME BD 834-6919-02 CPU BD 837-6905 VIDEO BD 837-6906 @@ -1615,7 +1614,7 @@ ROM_LOAD16_BYTE( "epr-12292.116", 0x040001, 0x10000, CRC(51d98af0) SHA1(6e7115706bfafb687faa23d55d4a8c8e498a4df2) ) ROM_REGION( 0x2000, "user1", 0 ) /* decryption key */ - ROM_LOAD( "317-unknown.key", 0x0000, 0x2000, CRC(33e632ae) SHA1(9fd8bd11d0a87ec4dfc4dc386012ab7992cb2bd7) ) + ROM_LOAD( "317-0107.key", 0x0000, 0x2000, CRC(33e632ae) SHA1(9fd8bd11d0a87ec4dfc4dc386012ab7992cb2bd7) ) ROM_REGION( 0x60000, "sub", 0 ) /* second 68000 CPU */ ROM_LOAD16_BYTE( "opr-12295.76", 0x000000, 0x10000, CRC(d43a3a84) SHA1(362c98f62c205b6b40b7e8a4ba107745b547b984) ) @@ -1682,7 +1681,7 @@ ROM_LOAD16_BYTE( "epr-12292.116", 0x040001, 0x10000, CRC(51d98af0) SHA1(6e7115706bfafb687faa23d55d4a8c8e498a4df2) ) ROM_REGION( 0x2000, "user1", 0 ) /* decryption key */ - ROM_LOAD( "317-unknown-toutrun1.key", 0x0000, 0x2000, NO_DUMP ) /* FD1094 number unknown and not dumped */ + ROM_LOAD( "317-unknown-toutrun2.key", 0x0000, 0x2000, NO_DUMP ) /* FD1094 number unknown and not dumped */ ROM_REGION( 0x60000, "sub", 0 ) /* second 68000 CPU */ ROM_LOAD16_BYTE( "opr-12295.76", 0x000000, 0x10000, CRC(d43a3a84) SHA1(362c98f62c205b6b40b7e8a4ba107745b547b984) ) @@ -1796,6 +1795,7 @@ ************************************************************************************************************************** Super Hangon CPU: 68000 (317-????) + GAME BD SUPER HANG-ON 834-6277-07 CPU BD SUPER HANG-ON 837-6278-01 (or 837-6278-03) VIDEO BD SUPER HANG-ON 837-6279-01 */ @@ -1849,8 +1849,15 @@ /************************************************************************************************************************** Super Hangon CPU: FD1089B (317-0034) + GAME BD SUPER HANG-ON 834-6277-02 CPU BD SUPER HANG-ON 837-6278-01 (or 837-6278-03) VIDEO BD SUPER HANG-ON 837-6279 (or 837-6279-02, roms would be "OPR") + +Manual states for this set: + 834-6277-01 (Object data (sprits) EPR type AKA EP-ROM type) + 834-6277-03 (Object data (sprits) MPR type AKA Mask-ROM type) + 834-6277-05 (Object data (sprits) OPR type AKA One Time ROM type) + */ ROM_START( shangon3 ) ROM_REGION( 0x60000, "maincpu", 0 ) /* 68000 code - protected */ @@ -2189,6 +2196,6 @@ GAME( 1987, shangon1, shangon, shangon, shangon, shangon3, ROT0, "Sega", "Super Hang-On (mini ride-on?, FD1089B 317-0034)", GAME_NOT_WORKING ) /* bad program rom */ GAME( 1991, shangonle,shangon, shangon, shangon, shangon, ROT0, "Sega", "Limited Edition Hang-On", 0 ) GAMEL(1989, toutrun, 0, outrun, toutrun, outrun, ROT0, "Sega", "Turbo Out Run (Out Run upgrade, FD1094 317-0118)", 0, layout_outrun ) /* Cabinet determined by dipswitch settings */ -GAMEL(1989, toutrun3, toutrun, outrun, toutrunc, outrun, ROT0, "Sega", "Turbo Out Run (upright, FD1094 317-unknown)", 0, layout_outrun ) +GAMEL(1989, toutrun3, toutrun, outrun, toutrunc, outrun, ROT0, "Sega", "Turbo Out Run (upright, FD1094 317-0107)", 0, layout_outrun ) GAMEL(1989, toutrun2, toutrun, outrun, toutrun, outrun, ROT0, "Sega", "Turbo Out Run (cockpit, FD1094 317-unknown)", GAME_NOT_WORKING, layout_outrun ) /* FD1094 CPU not decrypted */ GAMEL(1989, toutrun1, toutrun, outrun, toutrunm, outrun, ROT0, "Sega", "Turbo Out Run (deluxe cockpit, FD1094 317-0109)", 0, layout_outrun ) diff -Nru mame-0.144/src/mame/drivers/segas16a.c mame-0.145/src/mame/drivers/segas16a.c --- mame-0.144/src/mame/drivers/segas16a.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segas16a.c 2012-02-06 21:30:42.000000000 +0000 @@ -1997,10 +1997,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(342,262) /* to be verified */ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system16a) + MCFG_SCREEN_UPDATE_STATIC(system16a) MCFG_SEGA16SP_ADD_16A("segaspr1") diff -Nru mame-0.144/src/mame/drivers/segas16b.c mame-0.145/src/mame/drivers/segas16b.c --- mame-0.144/src/mame/drivers/segas16b.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segas16b.c 2012-02-06 21:30:42.000000000 +0000 @@ -3379,9 +3379,8 @@ MCFG_PALETTE_LENGTH(2048*3) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK_25MHz/4, 400, 0, 320, 262, 0, 224) - MCFG_SCREEN_UPDATE(system16b) + MCFG_SCREEN_UPDATE_STATIC(system16b) MCFG_VIDEO_START(system16b) diff -Nru mame-0.144/src/mame/drivers/segas18.c mame-0.145/src/mame/drivers/segas18.c --- mame-0.144/src/mame/drivers/segas18.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segas18.c 2012-02-06 21:30:36.000000000 +0000 @@ -31,7 +31,6 @@ #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "cpu/mcs51/mcs51.h" -#include "deprecat.h" #include "machine/segaic16.h" #include "machine/nvram.h" #include "includes/segas16.h" @@ -1242,10 +1241,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.23) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(342,262) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system18) + MCFG_SCREEN_UPDATE_STATIC(system18) MCFG_GFXDECODE(segas18) MCFG_PALETTE_LENGTH(2048*3+2048) @@ -1270,7 +1268,7 @@ static MACHINE_CONFIG_DERIVED( system18_8751, system18 ) MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_VBLANK_INT_HACK(NULL,0) /* TODO: ??? */ + MCFG_CPU_VBLANK_INT(NULL, NULL) MCFG_CPU_ADD("mcu", I8751, 8000000) MCFG_CPU_IO_MAP(mcu_io_map) diff -Nru mame-0.144/src/mame/drivers/segas24.c mame-0.145/src/mame/drivers/segas24.c --- mame-0.144/src/mame/drivers/segas24.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segas24.c 2012-02-06 21:30:36.000000000 +0000 @@ -335,7 +335,6 @@ #define ADDRESS_MAP_MODERN #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "sound/ym2151.h" #include "sound/dac.h" @@ -987,30 +986,29 @@ return irq_tval & 0xfff; } -static INTERRUPT_GEN(irq_vbl) +static TIMER_DEVICE_CALLBACK(irq_vbl) { - segas24_state *state = device->machine().driver_data(); + segas24_state *state = timer.machine().driver_data(); int irq, mask; + int scanline = param; - if(cpu_getiloops(device)) { - irq = IRQ_SPRITE; - state->irq_sprite = 1; - } else { - irq = IRQ_VBLANK; - state->irq_vblank = 1; - } + /* TODO: perhaps vblank irq happens at 400, sprite IRQ certainly don't at 0! */ + if(scanline == 0) { irq = IRQ_SPRITE; state->irq_sprite = 1; } + else if(scanline == 384) { irq = IRQ_VBLANK; state->irq_vblank = 1; } + else + return; state->irq_timer_clear->adjust(attotime::from_hz(HSYNC_CLOCK)); mask = 1 << irq; if(state->irq_allow0 & mask) - cputag_set_input_line(device->machine(), "maincpu", 1+irq, ASSERT_LINE); + cputag_set_input_line(timer.machine(), "maincpu", 1+irq, ASSERT_LINE); if(state->irq_allow1 & mask) - cputag_set_input_line(device->machine(), "sub", 1+irq, ASSERT_LINE); + cputag_set_input_line(timer.machine(), "sub", 1+irq, ASSERT_LINE); - if(!cpu_getiloops(device)) { + if(scanline == 384) { // Ensure one index pulse every 20 frames // The is some code in bnzabros at 0x852 that makes it crash // if the pulse train is too fast @@ -1020,7 +1018,7 @@ } state->irq_timer_sync(); - state->irq_vsynctime = device->machine().time(); + state->irq_vsynctime = timer.machine().time(); } static void irq_ym(device_t *device, int irq) @@ -1951,7 +1949,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, MASTER_CLOCK/2) MCFG_CPU_PROGRAM_MAP(system24_cpu1_map) - MCFG_CPU_VBLANK_INT_HACK(irq_vbl, 2) + MCFG_TIMER_ADD_SCANLINE("scantimer", irq_vbl, "screen", 0, 1) MCFG_CPU_ADD("sub", M68000, MASTER_CLOCK/2) MCFG_CPU_PROGRAM_MAP(system24_cpu2_map) @@ -1974,8 +1972,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 656, 0/*+69*/, 496/*+69*/, 424, 0/*+25*/, 384/*+25*/) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(system24) + MCFG_SCREEN_UPDATE_STATIC(system24) MCFG_PALETTE_LENGTH(8192*2) diff -Nru mame-0.144/src/mame/drivers/segas32.c mame-0.145/src/mame/drivers/segas32.c --- mame-0.144/src/mame/drivers/segas32.c 2012-01-13 15:34:50.000000000 +0000 +++ mame-0.145/src/mame/drivers/segas32.c 2012-02-06 21:30:37.000000000 +0000 @@ -2192,11 +2192,10 @@ MCFG_PALETTE_LENGTH(0x4000) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(52*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 52*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system32) + MCFG_SCREEN_UPDATE_STATIC(system32) MCFG_VIDEO_START(system32) @@ -2253,18 +2252,16 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(52*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 52*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(multi32) + MCFG_SCREEN_UPDATE_STATIC(multi32_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(52*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 52*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(multi32) + MCFG_SCREEN_UPDATE_STATIC(multi32_right) MCFG_VIDEO_START(multi32) @@ -2774,30 +2771,30 @@ */ ROM_START( f1lap ) ROM_REGION( 0x200000, "maincpu", 0 ) /* v60 code + data */ - ROM_LOAD_x4( "15598", 0x000000, 0x020000, CRC(9feab7cd) SHA1(2a14c0df39e7bdae12a34679fabc6abb7618e27d) ) - ROM_LOAD_x4( "15599", 0x080000, 0x020000, CRC(5c5ac112) SHA1(2c071946e33f0700a832c7aad36f639acd35f555) ) - ROM_LOAD16_BYTE_x2( "15596", 0x100000, 0x040000, CRC(20e92909) SHA1(b974c79e11bfbd1cee61f9041cf79971fd96db3a) ) - ROM_LOAD16_BYTE_x2( "15597", 0x100001, 0x040000, CRC(cd1ccddb) SHA1(ff0371a8010141d1ab81b5eba555ae7c64e5da37) ) - - ROM_REGION( 0x500000, "soundcpu", 0 ) /* sound CPU */ - ROM_LOAD_x8( "15592", 0x100000, 0x020000, CRC(7c055cc8) SHA1(169beb83dfae86dd408aa92b3c214b8f607825fc) ) - ROM_LOAD( "15593", 0x200000, 0x100000, CRC(e7300441) SHA1(33c264f0e6326689ba75026932c0932868e83b25) ) - ROM_LOAD( "15594", 0x300000, 0x100000, CRC(7f4ca3bb) SHA1(dc53a1857d619e574acb4c0587a6ba844df2d283) ) - ROM_LOAD( "15595", 0x400000, 0x100000, CRC(3fbdad9a) SHA1(573ea2242f79c7d3b6bf0e6745f6b07a621834ac) ) - - ROM_REGION( 0x400000, "gfx1", 0 ) /* tiles */ - ROM_LOAD16_BYTE( "15608", 0x000000, 0x200000, CRC(64462c69) SHA1(9501e83c52e3e16f73b94cef975b5a31b2ee5476) ) - ROM_LOAD16_BYTE( "15609", 0x000001, 0x200000, CRC(d586e455) SHA1(aea190d31c590216eb19766ba749b1e9b710bdce) ) - - ROM_REGION32_BE( 0x1000000, "gfx2", 0 ) /* sprites */ - ROMX_LOAD( "15600", 0x000000, 0x200000, CRC(d2698d23) SHA1(996fbcc1d0814e6f14fa7e4870ece077ecda54e6) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15602", 0x000002, 0x200000, CRC(1674764d) SHA1(bc39757a5d25df1a088f874ca2442854eb551e48) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15604", 0x000004, 0x200000, CRC(1552bbb9) SHA1(77edd3f9d8dec87fa0445d264309e6164eba9313) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15606", 0x000006, 0x200000, CRC(2b4f5265) SHA1(48b4ccdedb52fbf80661ff380e5a273201fc0a12) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15601", 0x800000, 0x200000, CRC(31a8f40a) SHA1(62798346750dea87e43c8a8b01c33bf886bb50f4) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15603", 0x800002, 0x200000, CRC(3805ecbc) SHA1(54d29250441160f282c70adfd515adb21d2cda33) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15605", 0x800004, 0x200000, CRC(cbdbf35e) SHA1(a1c0900ac3210e72f5848561a6c4a77c804782c6) , ROM_SKIP(6)|ROM_GROUPWORD ) - ROMX_LOAD( "15607", 0x800006, 0x200000, CRC(6c8817c9) SHA1(f5d493ed4237caf5042e95373bf9abd1fd16f873) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROM_LOAD_x4( "epr-15598.ic17", 0x000000, 0x020000, CRC(9feab7cd) SHA1(2a14c0df39e7bdae12a34679fabc6abb7618e27d) ) + ROM_LOAD_x4( "epr-15599.ic8", 0x080000, 0x020000, CRC(5c5ac112) SHA1(2c071946e33f0700a832c7aad36f639acd35f555) ) + ROM_LOAD16_BYTE_x2( "epr-15596.ic18", 0x100000, 0x040000, CRC(20e92909) SHA1(b974c79e11bfbd1cee61f9041cf79971fd96db3a) ) + ROM_LOAD16_BYTE_x2( "epr-15597.ic9", 0x100001, 0x040000, CRC(cd1ccddb) SHA1(ff0371a8010141d1ab81b5eba555ae7c64e5da37) ) + + ROM_REGION( 0x500000, "soundcpu", 0 ) /* sound CPU */ + ROM_LOAD_x8( "epr-15592.ic36", 0x100000, 0x020000, CRC(7c055cc8) SHA1(169beb83dfae86dd408aa92b3c214b8f607825fc) ) + ROM_LOAD( "mpr-15593.ic35", 0x200000, 0x100000, CRC(e7300441) SHA1(33c264f0e6326689ba75026932c0932868e83b25) ) + ROM_LOAD( "mpr-15594.ic34", 0x300000, 0x100000, CRC(7f4ca3bb) SHA1(dc53a1857d619e574acb4c0587a6ba844df2d283) ) + ROM_LOAD( "mpr-15595.ic24", 0x400000, 0x100000, CRC(3fbdad9a) SHA1(573ea2242f79c7d3b6bf0e6745f6b07a621834ac) ) + + ROM_REGION( 0x400000, "gfx1", 0 ) /* tiles */ + ROM_LOAD16_BYTE( "mpr-15608.ic14", 0x000000, 0x200000, CRC(64462c69) SHA1(9501e83c52e3e16f73b94cef975b5a31b2ee5476) ) + ROM_LOAD16_BYTE( "mpr-15609.ic5", 0x000001, 0x200000, CRC(d586e455) SHA1(aea190d31c590216eb19766ba749b1e9b710bdce) ) + + ROM_REGION32_BE( 0x1000000, "gfx2", 0 ) /* sprites */ + ROMX_LOAD( "mpr-15600.ic32", 0x000000, 0x200000, CRC(d2698d23) SHA1(996fbcc1d0814e6f14fa7e4870ece077ecda54e6) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15602.ic30", 0x000002, 0x200000, CRC(1674764d) SHA1(bc39757a5d25df1a088f874ca2442854eb551e48) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15604.ic28", 0x000004, 0x200000, CRC(1552bbb9) SHA1(77edd3f9d8dec87fa0445d264309e6164eba9313) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15606.ic26", 0x000006, 0x200000, CRC(2b4f5265) SHA1(48b4ccdedb52fbf80661ff380e5a273201fc0a12) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15601.ic31", 0x800000, 0x200000, CRC(31a8f40a) SHA1(62798346750dea87e43c8a8b01c33bf886bb50f4) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15603.ic29", 0x800002, 0x200000, CRC(3805ecbc) SHA1(54d29250441160f282c70adfd515adb21d2cda33) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15605.ic27", 0x800004, 0x200000, CRC(cbdbf35e) SHA1(a1c0900ac3210e72f5848561a6c4a77c804782c6) , ROM_SKIP(6)|ROM_GROUPWORD ) + ROMX_LOAD( "mpr-15607.ic25", 0x800006, 0x200000, CRC(6c8817c9) SHA1(f5d493ed4237caf5042e95373bf9abd1fd16f873) , ROM_SKIP(6)|ROM_GROUPWORD ) ROM_REGION( 0x20000, "user2", 0 ) /* comms board */ ROM_LOAD( "15612", 0x00000, 0x20000, CRC(9d204617) SHA1(8db57121065f5d1ac52fcfb88459bdbdc30e645b) ) diff -Nru mame-0.144/src/mame/drivers/segaxbd.c mame-0.145/src/mame/drivers/segaxbd.c --- mame-0.144/src/mame/drivers/segaxbd.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/segaxbd.c 2012-02-06 21:30:37.000000000 +0000 @@ -1319,9 +1319,8 @@ MCFG_PALETTE_LENGTH(8192*3) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/8, 400, 0, 320, 262, 0, 224) - MCFG_SCREEN_UPDATE(xboard) + MCFG_SCREEN_UPDATE_STATIC(xboard) MCFG_VIDEO_START(xboard) diff -Nru mame-0.144/src/mame/drivers/segaybd.c mame-0.145/src/mame/drivers/segaybd.c --- mame-0.144/src/mame/drivers/segaybd.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/segaybd.c 2012-02-06 21:30:37.000000000 +0000 @@ -967,10 +967,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(342,262) /* to be verified */ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(yboard) + MCFG_SCREEN_UPDATE_STATIC(yboard) MCFG_SEGA16SP_ADD_YBOARD_16B("segaspr1") MCFG_SEGA16SP_ADD_YBOARD("segaspr2") diff -Nru mame-0.144/src/mame/drivers/seibuspi.c mame-0.145/src/mame/drivers/seibuspi.c --- mame-0.144/src/mame/drivers/seibuspi.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/seibuspi.c 2012-02-06 21:30:37.000000000 +0000 @@ -1880,10 +1880,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(spi) + MCFG_SCREEN_UPDATE_STATIC(spi) MCFG_GFXDECODE(spi) MCFG_PALETTE_LENGTH(6144) @@ -2227,7 +2226,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(54) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) @@ -2235,7 +2233,7 @@ MCFG_PALETTE_LENGTH(6144) MCFG_VIDEO_START(spi) - MCFG_SCREEN_UPDATE(spi) + MCFG_SCREEN_UPDATE_STATIC(spi) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -2283,7 +2281,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.59) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) @@ -2291,7 +2288,7 @@ MCFG_PALETTE_LENGTH(8192) MCFG_VIDEO_START(sys386f2) - MCFG_SCREEN_UPDATE(sys386f2) + MCFG_SCREEN_UPDATE_STATIC(sys386f2) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") @@ -2420,6 +2417,34 @@ ROM_LOAD("fb_7.216", 0x200000, 0x080000, CRC(874d7b59) SHA1(0236753636c9a818780b23f5f506697b9f6d93c7) ) ROM_END +ROM_START( batlballe ) /* Early version, PCB serial number of 19, hand written labels dated 10/16 (Oct 16, 1995) */ + ROM_REGION32_LE(0x200000, "user1", 0) /* i386 program */ + ROM_LOAD32_BYTE("1_10-16", 0x100000, 0x40000, CRC(6b1baa07) SHA1(29b8f4016e9bffdcdb6ec405cd443ca0a80de5d5) ) + ROM_LOAD32_BYTE("2_10-16", 0x100001, 0x40000, CRC(3c890639) SHA1(968c4a5efc5ebbe4e4cc81f834c286c02596c24e) ) + ROM_LOAD32_BYTE("3_10-16", 0x100002, 0x40000, CRC(8c30180e) SHA1(47b99b04e2e74f1ee5095aed3f45aba66cd3da3f) ) + ROM_LOAD32_BYTE("4_10-16", 0x100003, 0x40000, CRC(048c7aaa) SHA1(5eca2cdf4e6f077988509c3c42c86408b21ffbf1) ) + + ROM_REGION( 0x30000, "gfx1", 0) + ROM_LOAD24_WORD("fb_6.413", 0x000000, 0x20000, CRC(b57115c9) SHA1(eb95f416f522032ca949bfb6348f1ff824101f2d) ) + ROM_LOAD24_BYTE("fb_5.48", 0x000002, 0x10000, CRC(440a9ae3) SHA1(3f57e6da91f0dac2d816c873759f1e1d3259caf1) ) + + ROM_REGION( 0x300000, "gfx2", 0) /* background layer roms */ + ROM_LOAD24_WORD("fb_bg-1d.415", 0x000000, 0x200000, CRC(eae7a1fc) SHA1(26d8a9f4e554848977ec1f6a8aad8751b558a8d4) ) + ROM_LOAD24_BYTE("fb_bg-1p.410", 0x000002, 0x100000, CRC(b46e774e) SHA1(00b6c1d0b0ea37f4354acab543b270c0bf45896d) ) + + ROM_REGION( 0xc00000, "gfx3", 0) /* sprites */ + ROM_LOAD("fb_obj-1.322", 0x000000, 0x400000, CRC(29f86f68) SHA1(1afe809ce00a25f8b27543e4188edc3e3e604951) ) + ROM_LOAD("fb_obj-2.324", 0x400000, 0x400000, CRC(c9e3130b) SHA1(12b5d5363142e8efb3b7fc44289c0afffa5011c6) ) + ROM_LOAD("fb_obj-3.323", 0x800000, 0x400000, CRC(f6c3bc49) SHA1(d0eb9c6aa3954d94e3a442a48e0fe6cc279f5513) ) + + ROM_REGION(0x200000, "ymf", ROMREGION_ERASE00) + + ROM_REGION(0x280000, "user2", ROMREGION_ERASE00) /* sound roms */ + ROM_LOAD("fb_pcm-1.215", 0x000000, 0x080000, CRC(1d83891c) SHA1(09502437562275c14c0f3a0e62b19e91bedb4693) ) + ROM_CONTINUE(0x100000,0x080000) + ROM_LOAD("fb_7.216", 0x200000, 0x080000, CRC(874d7b59) SHA1(0236753636c9a818780b23f5f506697b9f6d93c7) ) +ROM_END + ROM_START( batlballu ) ROM_REGION32_LE(0x200000, "user1", 0) /* i386 program */ ROM_LOAD32_BYTE("sen1.bin", 0x100000, 0x40000, CRC(13849bf0) SHA1(ffa829a8b8a05a8fbaf883a30759f2ad8071a85b) ) @@ -3602,6 +3627,7 @@ GAME( 1995, senkyua, senkyu, spi, spi_3button, senkyua, ROT0, "Seibu Kaihatsu", "Senkyu (Japan, set 2)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) GAME( 1995, batlball, senkyu, spi, spi_3button, batlball, ROT0, "Seibu Kaihatsu (Tuning license)", "Battle Balls (Germany)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) GAME( 1995, batlballa, senkyu, spi, spi_3button, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) +GAME( 1995, batlballe, senkyu, spi, spi_3button, batlball, ROT0, "Seibu Kaihatsu (Metrotainment license)", "Battle Balls (Asia, earlier)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) GAME( 1995, batlballu, senkyu, spi, spi_3button, batlball, ROT0, "Seibu Kaihatsu (Fabtek license)", "Battle Balls (US)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) GAME( 1995, viprp1, 0, spi, spi_3button, viprp1, ROT270, "Seibu Kaihatsu", "Viper Phase 1 (World, New Version)", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/seicross.c mame-0.145/src/mame/drivers/seicross.c --- mame-0.144/src/mame/drivers/seicross.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/seicross.c 2012-02-06 21:30:38.000000000 +0000 @@ -94,7 +94,7 @@ //logerror("PC %04x: 8910 port B = %02x\n", cpu_get_pc(&space->device()), data); /* bit 0 is IRQ enable */ - cpu_interrupt_enable(device->machine().device("maincpu"), data & 1); + state->m_irq_mask = data & 1; /* bit 1 flips screen */ @@ -390,6 +390,15 @@ DEVCB_HANDLER(friskyt_portB_w) }; +static INTERRUPT_GEN( vblank_irq ) +{ + seicross_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); + +} + static MACHINE_CONFIG_START( nvram, seicross_state ) @@ -397,7 +406,7 @@ MCFG_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_portmap) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("mcu", NSC8105, 6000000) /* ??? */ MCFG_CPU_PROGRAM_MAP(mcu_nvram_map) @@ -411,10 +420,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seicross) + MCFG_SCREEN_UPDATE_STATIC(seicross) MCFG_GFXDECODE(seicross) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/sengokmj.c mame-0.145/src/mame/drivers/sengokmj.c --- mame-0.144/src/mame/drivers/sengokmj.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sengokmj.c 2012-02-06 21:30:33.000000000 +0000 @@ -307,10 +307,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) //TODO: dynamic resolution - MCFG_SCREEN_UPDATE(seibu_crtc) + MCFG_SCREEN_UPDATE_STATIC(seibu_crtc) MCFG_GFXDECODE(sengokmj) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/senjyo.c mame-0.145/src/mame/drivers/senjyo.c --- mame-0.144/src/mame/drivers/senjyo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/senjyo.c 2012-02-06 21:30:40.000000000 +0000 @@ -565,10 +565,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(senjyo) + MCFG_SCREEN_UPDATE_STATIC(senjyo) MCFG_GFXDECODE(senjyo) MCFG_PALETTE_LENGTH(512+2) /* 512 real palette + 2 for the radar */ diff -Nru mame-0.144/src/mame/drivers/seta2.c mame-0.145/src/mame/drivers/seta2.c --- mame-0.144/src/mame/drivers/seta2.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/seta2.c 2012-02-06 21:30:35.000000000 +0000 @@ -100,7 +100,6 @@ #include "emu.h" #include "memconv.h" -#include "deprecat.h" #include "includes/seta2.h" #include "cpu/m68000/m68000.h" #include "machine/tmp68301.h" @@ -2004,26 +2003,13 @@ static INTERRUPT_GEN( seta2_interrupt ) { - switch ( cpu_getiloops(device) ) - { - case 0: - /* VBlank is connected to INT0 (external interrupts pin 0) */ - tmp68301_external_interrupt_0(device->machine()); - break; - } + /* VBlank is connected to INT0 (external interrupts pin 0) */ + tmp68301_external_interrupt_0(device->machine()); } static INTERRUPT_GEN( samshoot_interrupt ) { - switch ( cpu_getiloops(device) ) - { - case 0: - tmp68301_external_interrupt_0(device->machine()); // vblank - break; - case 1: - tmp68301_external_interrupt_2(device->machine()); // to do: hook up x1-10 interrupts - break; - } + tmp68301_external_interrupt_2(device->machine()); // to do: hook up x1-10 interrupts } static const x1_010_interface x1_010_sound_intf = @@ -2043,11 +2029,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE(seta2) - MCFG_SCREEN_EOF(seta2) + MCFG_SCREEN_UPDATE_STATIC(seta2) + MCFG_SCREEN_VBLANK_STATIC(seta2) MCFG_GFXDECODE(seta2) MCFG_PALETTE_LENGTH(0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity @@ -2158,7 +2143,7 @@ static MACHINE_CONFIG_DERIVED( samshoot, seta2 ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(samshoot_map) - MCFG_CPU_VBLANK_INT_HACK(samshoot_interrupt,2) + MCFG_CPU_PERIODIC_INT(samshoot_interrupt,60) MCFG_NVRAM_ADD_0FILL("nvram") @@ -2172,13 +2157,16 @@ Funcube ***************************************************************************/ -static INTERRUPT_GEN( funcube_interrupt ) +static TIMER_DEVICE_CALLBACK( funcube_interrupt ) { - switch ( cpu_getiloops(device) ) - { - case 1: device_set_input_line(device, 2, HOLD_LINE); break; - case 0: device_set_input_line(device, 1, HOLD_LINE); break; - } + seta2_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 368) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } static INTERRUPT_GEN( funcube_sub_timer_irq ) @@ -2222,7 +2210,7 @@ MCFG_CPU_ADD("maincpu", MCF5206E, XTAL_25_447MHz) MCFG_CPU_PROGRAM_MAP(funcube_map) - MCFG_CPU_VBLANK_INT_HACK(funcube_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", funcube_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", H83007, FUNCUBE_SUB_CPU_CLOCK) MCFG_CPU_PROGRAM_MAP(funcube_sub_map) @@ -2237,11 +2225,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x0, 0x140-1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE(seta2) - MCFG_SCREEN_EOF(seta2) + MCFG_SCREEN_UPDATE_STATIC(seta2) + MCFG_SCREEN_VBLANK_STATIC(seta2) MCFG_GFXDECODE(funcube) MCFG_PALETTE_LENGTH(0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity @@ -2274,11 +2261,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0x40, 0x1c0-1, 0x80, 0x170-1) - MCFG_SCREEN_UPDATE(seta2) - MCFG_SCREEN_EOF(seta2) + MCFG_SCREEN_UPDATE_STATIC(seta2) + MCFG_SCREEN_VBLANK_STATIC(seta2) MCFG_GFXDECODE(funcube) MCFG_PALETTE_LENGTH(0x8000+0xf0) // extra 0xf0 because we might draw 256-color object with 16-color granularity diff -Nru mame-0.144/src/mame/drivers/seta.c mame-0.145/src/mame/drivers/seta.c --- mame-0.144/src/mame/drivers/seta.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/seta.c 2012-02-06 21:30:40.000000000 +0000 @@ -1304,7 +1304,6 @@ #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "cpu/m6502/m6502.h" -#include "deprecat.h" #include "includes/seta.h" #include "machine/6821pia.h" #include "machine/6850acia.h" @@ -1546,10 +1545,14 @@ Sprites Buffering */ -static SCREEN_EOF( seta_buffer_sprites ) +static SCREEN_VBLANK( seta_buffer_sprites ) { - //seta_state *state = machine.driver_data(); - machine.device("spritegen")->setac_eof(); + // rising edge + if (vblank_on) + { + //seta_state *state = machine.driver_data(); + screen.machine().device("spritegen")->setac_eof(); + } } @@ -1737,7 +1740,7 @@ state->m_usclssic_port_select = (data & 0x40) >> 6; if (tiles_offset != state->m_tiles_offset) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_tiles_offset = tiles_offset; seta_coin_lockout_w(space->machine(), data); @@ -2901,7 +2904,7 @@ AM_RANGE(0x700000, 0x700101) AM_RAM_READ(inttoote_700000_r) AM_BASE_MEMBER(seta_state, m_inttoote_700000) - AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write, 0x00ff) AM_RANGE(0x900000, 0x903fff) AM_DEVREADWRITE( "x1snd", seta_sound_word_r, seta_sound_word_w ) // Sound @@ -2967,7 +2970,7 @@ AM_RANGE(0x500000, 0x500003) AM_READ(inttoote_dsw_r) // DSW x 3 AM_RANGE(0x600000, 0x600003) AM_READ(unk_r) - AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE8("rtc", msm6242_r, msm6242_w, 0x00ff) // 6242RTC + AM_RANGE(0x800000, 0x80001f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write, 0x00ff) AM_RANGE(0x900000, 0x903fff) AM_DEVREADWRITE( "x1snd", seta_sound_word_r, seta_sound_word_w) // Sound @@ -7260,36 +7263,41 @@ ***************************************************************************/ -#define SETA_INTERRUPTS_NUM 2 - -static INTERRUPT_GEN( seta_interrupt_1_and_2 ) +static TIMER_DEVICE_CALLBACK( seta_interrupt_1_and_2 ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 1, HOLD_LINE); break; - case 1: device_set_input_line(device, 2, HOLD_LINE); break; - } + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 112) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } -static INTERRUPT_GEN( seta_interrupt_2_and_4 ) +static TIMER_DEVICE_CALLBACK( seta_interrupt_2_and_4 ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 2, HOLD_LINE); break; - case 1: device_set_input_line(device, 4, HOLD_LINE); break; - } -} + seta_state *state = timer.machine().driver_data(); + int scanline = param; + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); -#define SETA_SUB_INTERRUPTS_NUM 2 + if(scanline == 112) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); +} -static INTERRUPT_GEN( seta_sub_interrupt ) + +static TIMER_DEVICE_CALLBACK( seta_sub_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); break; - case 1: device_set_input_line(device, 0, HOLD_LINE); break; - } + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_subcpu, INPUT_LINE_NMI, PULSE_LINE); + + if(scanline == 112) + device_set_input_line(state->m_subcpu, 0, HOLD_LINE); } @@ -7311,13 +7319,16 @@ }; -#define TNDRCADE_SUB_INTERRUPTS_NUM 32 /* 16 IRQ, 1 NMI */ -static INTERRUPT_GEN( tndrcade_sub_interrupt ) +static TIMER_DEVICE_CALLBACK( tndrcade_sub_interrupt ) { - if (cpu_getiloops(device) & 1) - device_set_input_line(device, 0, HOLD_LINE); - else if (cpu_getiloops(device) == 0) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_subcpu, INPUT_LINE_NMI, PULSE_LINE); + + if((scanline % 16) == 0) + device_set_input_line(state->m_subcpu, 0, HOLD_LINE); } static MACHINE_CONFIG_START( tndrcade, seta_state ) @@ -7329,7 +7340,7 @@ MCFG_CPU_ADD("sub", M65C02, 16000000/8) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(tndrcade_sub_map) - MCFG_CPU_VBLANK_INT_HACK(tndrcade_sub_interrupt,TNDRCADE_SUB_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", tndrcade_sub_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7337,10 +7348,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -7380,7 +7390,7 @@ MCFG_CPU_ADD("sub", M65C02, 16000000/8) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(twineagl_sub_map) - MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("s_scantimer", seta_sub_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7388,10 +7398,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(downtown) MCFG_PALETTE_LENGTH(512) @@ -7419,11 +7428,11 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(downtown_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("m_scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_CPU_ADD("sub", M65C02, XTAL_16MHz/8) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(downtown_sub_map) - MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("s_scantimer", seta_sub_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7431,10 +7440,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(downtown) MCFG_PALETTE_LENGTH(512) @@ -7459,17 +7467,16 @@ 5 ints per frame */ -#define calibr50_INTERRUPTS_NUM (4+1) -static INTERRUPT_GEN( calibr50_interrupt ) +static TIMER_DEVICE_CALLBACK( calibr50_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: - case 1: - case 2: - case 3: device_set_input_line(device, 4, HOLD_LINE); break; - case 4: device_set_input_line(device, 2, HOLD_LINE); break; - } + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 64) == 0) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + + if(scanline == 248) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } @@ -7478,7 +7485,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000/2) /* 8 MHz */ MCFG_CPU_PROGRAM_MAP(usclssic_map) - MCFG_CPU_VBLANK_INT_HACK(calibr50_interrupt,calibr50_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", calibr50_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", M65C02, 16000000/8) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(calibr50_sub_map) @@ -7492,10 +7499,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(64*8, 32*8) + MCFG_SCREEN_SIZE(64*8, 33*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(usclssic) + MCFG_SCREEN_UPDATE_STATIC(usclssic) MCFG_GFXDECODE(usclssic) MCFG_PALETTE_LENGTH(16*32 + 64*32*2) /* sprites, layer */ @@ -7527,7 +7533,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(calibr50_map) - MCFG_CPU_VBLANK_INT_HACK(calibr50_interrupt,calibr50_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", calibr50_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", M65C02, XTAL_16MHz/8) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(calibr50_sub_map) @@ -7542,10 +7548,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.42) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(downtown) MCFG_PALETTE_LENGTH(512) @@ -7575,7 +7580,7 @@ MCFG_CPU_ADD("sub", M65C02, 16000000/8) /* 2 MHz */ MCFG_CPU_PROGRAM_MAP(metafox_sub_map) - MCFG_CPU_VBLANK_INT_HACK(seta_sub_interrupt,SETA_SUB_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("s_scantimer", seta_sub_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7583,10 +7588,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(downtown) MCFG_PALETTE_LENGTH(512) @@ -7612,7 +7616,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(atehate_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7620,10 +7624,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -7655,7 +7658,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(blandia_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_2_and_4, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7663,11 +7666,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) - MCFG_SCREEN_EOF(seta_buffer_sprites) /* Blandia uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(seta) + MCFG_SCREEN_VBLANK_STATIC(seta_buffer_sprites) /* Blandia uses sprite buffering */ MCFG_GFXDECODE(blandia) MCFG_PALETTE_LENGTH((16*32+64*32*4)*2) /* sprites, layer1, layer2, palette effect */ @@ -7689,7 +7691,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(blandiap_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_2_and_4, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7697,11 +7699,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) - MCFG_SCREEN_EOF(seta_buffer_sprites) /* Blandia uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(seta) + MCFG_SCREEN_VBLANK_STATIC(seta_buffer_sprites) /* Blandia uses sprite buffering */ MCFG_GFXDECODE(blandia) MCFG_PALETTE_LENGTH((16*32+64*32*4)*2) /* sprites, layer1, layer2, palette effect */ @@ -7736,10 +7737,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -7765,7 +7765,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(daioh_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7773,10 +7773,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer1, layer2 */ @@ -7807,7 +7806,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000/2) /* 8 MHz */ MCFG_CPU_PROGRAM_MAP(drgnunit_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7815,11 +7814,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) - MCFG_SCREEN_EOF(seta_buffer_sprites) /* qzkklogy uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(seta) + MCFG_SCREEN_VBLANK_STATIC(seta_buffer_sprites) /* qzkklogy uses sprite buffering */ MCFG_GFXDECODE(downtown) MCFG_PALETTE_LENGTH(512) @@ -7843,7 +7841,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(drgnunit_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7851,11 +7849,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) - MCFG_SCREEN_EOF(seta_buffer_sprites) /* qzkklogy uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(seta) + MCFG_SCREEN_VBLANK_STATIC(seta_buffer_sprites) /* qzkklogy uses sprite buffering */ MCFG_GFXDECODE(qzkklgy2) MCFG_PALETTE_LENGTH(512) @@ -7875,14 +7872,16 @@ Seta Roulette ***************************************************************************/ -#define SETAROUL_INTERRUPTS_NUM (2) -static INTERRUPT_GEN( setaroul_interrupt ) +static TIMER_DEVICE_CALLBACK( setaroul_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 4, HOLD_LINE); break; - case 1: device_set_input_line(device, 2, HOLD_LINE); break; - } + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 248) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + + if(scanline == 112) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); } @@ -7891,7 +7890,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000/2) /* 8 MHz */ MCFG_CPU_PROGRAM_MAP(setaroul_map) - MCFG_CPU_VBLANK_INT_HACK(setaroul_interrupt,SETAROUL_INTERRUPTS_NUM) // and 6? + MCFG_TIMER_ADD_SCANLINE("scantimer", setaroul_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7901,11 +7900,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(setaroul) - MCFG_SCREEN_EOF(setaroul) /* qzkklogy uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(setaroul) + MCFG_SCREEN_VBLANK_STATIC(setaroul) /* qzkklogy uses sprite buffering */ MCFG_GFXDECODE(setaroul) MCFG_PALETTE_LENGTH(512) @@ -7932,7 +7930,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(wrofaero_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7940,10 +7938,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer1, layer2 */ @@ -7974,7 +7971,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(extdwnhl_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -7982,10 +7979,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(zingzip) MCFG_PALETTE_LENGTH(16*32+16*32+64*32*2) /* sprites, layer2, layer1 */ @@ -8029,10 +8025,9 @@ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(wrofaero_map) #if __uPD71054_TIMER -// MCFG_CPU_VBLANK_INT("screen", wrofaero_interrupt) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) #else - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_2_and_4, "screen", 0, 1) #endif // __uPD71054_TIMER #if __uPD71054_TIMER @@ -8045,10 +8040,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(jjsquawk) MCFG_PALETTE_LENGTH(16*32+64*32*4) /* sprites, layer2, layer1 */ @@ -8079,7 +8073,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(wrofaero_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8087,10 +8081,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(jjsquawk) MCFG_PALETTE_LENGTH(16*32+64*32*4) /* sprites, layer2, layer1 */ @@ -8112,7 +8105,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(jjsquawb_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8120,10 +8113,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(jjsquawk) MCFG_PALETTE_LENGTH(16*32+64*32*4) /* sprites, layer2, layer1 */ @@ -8162,10 +8154,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer2, layer1 */ @@ -8192,7 +8183,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 14318180/2) /* 7.143 MHz */ MCFG_CPU_PROGRAM_MAP(orbs_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8200,10 +8191,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(orbs) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8229,7 +8219,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 14318180/2) /* 7.143 MHz */ MCFG_CPU_PROGRAM_MAP(keroppi_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_MACHINE_START(keroppi) @@ -8239,10 +8229,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(orbs) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8268,7 +8257,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(krzybowl_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8276,10 +8265,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8318,10 +8306,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(jjsquawk) MCFG_PALETTE_LENGTH(16*32+64*32*4) /* sprites, layer2, layer1 */ @@ -8353,7 +8340,7 @@ #if __uPD71054_TIMER MCFG_CPU_VBLANK_INT("screen", wrofaero_interrupt) #else - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_2_and_4, "screen", 0, 1) #endif // __uPD71054_TIMER #if __uPD71054_TIMER @@ -8366,11 +8353,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(56.66) /* between 56 and 57 to match a real PCB's game speed */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) - MCFG_SCREEN_EOF(seta_buffer_sprites) /* msgundam uses sprite buffering */ + MCFG_SCREEN_UPDATE_STATIC(seta) + MCFG_SCREEN_VBLANK_STATIC(seta_buffer_sprites) /* msgundam uses sprite buffering */ MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer2, layer1 */ @@ -8397,7 +8383,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(oisipuzl_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8405,10 +8391,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer2, layer1 */ @@ -8443,10 +8428,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer2, layer1 */ @@ -8479,10 +8463,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 56*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8511,7 +8494,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(wrofaero_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8519,10 +8502,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer1, layer2 */ @@ -8559,10 +8541,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8631,10 +8612,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(wiggie) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8666,10 +8646,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -8703,10 +8682,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(512) @@ -8732,7 +8710,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(utoukond_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 16000000/4) /* 4 MHz */ MCFG_CPU_PROGRAM_MAP(utoukond_sound_map) @@ -8744,10 +8722,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer2, layer1 */ @@ -8781,7 +8758,7 @@ #if __uPD71054_TIMER MCFG_CPU_VBLANK_INT("screen", wrofaero_interrupt) #else - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_2_and_4,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_2_and_4, "screen", 0, 1) #endif // __uPD71054_TIMER #if __uPD71054_TIMER @@ -8794,10 +8771,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(msgundam) MCFG_PALETTE_LENGTH(512 * 3) /* sprites, layer1, layer2 */ @@ -8838,10 +8814,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(zingzip) MCFG_PALETTE_LENGTH(16*32+16*32+64*32*2) /* sprites, layer2, layer1 */ @@ -8862,9 +8837,11 @@ static MACHINE_CONFIG_DERIVED( zingzipbl, zingzip ) MCFG_GFXDECODE(zingzipbl) - MCFG_CPU_MODIFY("maincpu") + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(zingzipbl_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) // irq3 isn't valid on the bootleg + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) // irq3 isn't valid on the bootleg MCFG_DEVICE_REMOVE("x1snd") @@ -8882,7 +8859,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000/2) /* 8 MHz */ MCFG_CPU_PROGRAM_MAP(pairlove_map) - MCFG_CPU_VBLANK_INT_HACK(seta_interrupt_1_and_2,SETA_INTERRUPTS_NUM) + MCFG_TIMER_ADD_SCANLINE("scantimer", seta_interrupt_1_and_2, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8890,10 +8867,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) /* just draw the sprites */ MCFG_GFXDECODE(tndrcade) MCFG_PALETTE_LENGTH(2048) /* sprites only */ @@ -8914,13 +8890,16 @@ Crazy Fight ***************************************************************************/ -static INTERRUPT_GEN( crazyfgt_interrupt ) +static TIMER_DEVICE_CALLBACK( crazyfgt_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 1, HOLD_LINE); break; - default: device_set_input_line(device, 2, HOLD_LINE); break; // should this be triggered by the 3812? - } + seta_state *state = timer.machine().driver_data(); + int scanline = param; + + if((scanline % 48) == 0) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); // should this be triggered by the 3812? + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); } static MACHINE_CONFIG_START( crazyfgt, seta_state ) @@ -8928,7 +8907,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz */ MCFG_CPU_PROGRAM_MAP(crazyfgt_map) - MCFG_CPU_VBLANK_INT_HACK(crazyfgt_interrupt,1+5) + MCFG_TIMER_ADD_SCANLINE("scantimer", crazyfgt_interrupt, "screen", 0, 1) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) @@ -8936,10 +8915,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8-4, 30*8-1-4) - MCFG_SCREEN_UPDATE(seta) + MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) + MCFG_SCREEN_UPDATE_STATIC(seta) MCFG_GFXDECODE(crazyfgt) MCFG_PALETTE_LENGTH(16*32+64*32*4) /* sprites, layer1, layer2 */ @@ -8961,26 +8939,24 @@ International Toote ***************************************************************************/ -// Test mode shows a 16ms and 2ms counters -static INTERRUPT_GEN( inttoote_interrupt ) +// Test mode shows a 16ms and 2ms counters, then there's vblank and presumably ACIA irqs ... +static TIMER_DEVICE_CALLBACK( inttoote_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: device_set_input_line(device, 6, HOLD_LINE); break; + seta_state *state = timer.machine().driver_data(); + int scanline = param; - case 8: device_set_input_line(device, 2, HOLD_LINE); break; + /* ACIA irq */ + if(scanline == 15) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); - case 9: device_set_input_line(device, 1, HOLD_LINE); break; + if(scanline == 38) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); - case 10: device_set_input_line(device, 4, HOLD_LINE); break; - } + if(scanline == 61) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + + if(scanline >= 85 && (scanline % 23) == 0) + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); } static const pia6821_interface inttoote_pia0_intf = @@ -9015,12 +8991,17 @@ DEVCB_NULL /* IRQB */ }; +static MSM6242_INTERFACE( rtc_intf ) +{ + DEVCB_NULL +}; + static MACHINE_CONFIG_START( inttoote, seta_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_PROGRAM_MAP(inttoote_map) - MCFG_CPU_VBLANK_INT_HACK(inttoote_interrupt,8+1+1+1) + MCFG_TIMER_ADD_SCANLINE("scantimer", inttoote_interrupt, "screen", 0, 1) MCFG_PIA6821_ADD("pia0", inttoote_pia0_intf) MCFG_PIA6821_ADD("pia1", inttoote_pia1_intf) @@ -9031,10 +9012,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(inttoote) + MCFG_SCREEN_UPDATE_STATIC(inttoote) MCFG_GFXDECODE(inttoote) MCFG_PALETTE_LENGTH(512 * 1) @@ -9051,7 +9031,7 @@ MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) /* devices */ - MCFG_MSM6242_ADD("rtc") + MCFG_MSM6242_ADD("rtc", rtc_intf) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( jockeyc, inttoote ) @@ -9983,11 +9963,33 @@ ROM_COPY( "gfxtemp", 0x100000, 0x000000, 0x100000 ) ROM_COPY( "gfxtemp", 0x300000, 0x100000, 0x100000 ) - ROM_REGION( 0x100000, "x1snd", 0 ) /* Samples */ ROM_LOAD( "1", 0x000000, 0x100000, CRC(181a55b8) SHA1(6fa404f85bad93cc15e80feb61d19bed84602b82) ) /* jj-rom5.040 + jj-rom6.040 from jjsquawk */ ROM_END +ROM_START( jjsquawkb2 ) /* PCB was P0-078A, which was a Blandia board converted to JJ Squawkers. No labels on any of the ROMs */ + ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 Code */ + ROM_LOAD16_BYTE( "u3.3a", 0x000000, 0x040000, CRC(f94c913b) SHA1(de6e422c514c787897f8f41d7cd98acb0135c763) ) // 99.999619% + ROM_CONTINUE ( 0x100000, 0x040000 ) + ROM_LOAD16_BYTE( "u4.4a", 0x000001, 0x040000, CRC(0227a2be) SHA1(8ee0c39f84110865778564f803b4db11bfdfbad7) ) // 99.999809% + ROM_CONTINUE ( 0x100001, 0x040000 ) + + ROM_REGION( 0x200000, "gfx1", 0 ) /* Sprites */ + ROM_LOAD( "u64.3l", 0x000000, 0x100000, CRC(11d8713a) SHA1(8e3359f605913625191ac0a09222ec465b5fea71) ) /* jj-rom9 + jj-rom10 from jjsquawk */ + ROM_LOAD( "u63.2l", 0x100000, 0x100000, CRC(7a385ef0) SHA1(d38e2242532074b58707783608a6ddce42c55a77) ) /* jj-rom7 + jj-rom8 from jjsquawk */ + + ROM_REGION( 0x200000, "gfx2", 0 ) /* Layer 1 */ + ROM_LOAD ( "u66.5l", 0x000000, 0x100000, CRC(bbaf40c5) SHA1(aecd48176adbe79e76c8febca1d9bb95ff0d6912) ) /* jj-rom11 + jj-rom12 from jjsquawk */ + ROM_LOAD16_BYTE( "u65.4l", 0x100000, 0x080000, CRC(a5a35caf) SHA1(da4bdb7f0b319f8ff972a552d0134a73e5ac1b87) ) /* jj-rom3.040 from jjsquawk */ + + ROM_REGION( 0x200000, "gfx3", 0 ) /* Layer 2 */ + ROM_LOAD ( "u68.7l", 0x000000, 0x100000, CRC(ae9ae01f) SHA1(1a828d5b8848c5b5d8e5f279f1fde26b972a6332) ) /* jj-rom14 + jj-rom13 from jjsquawk */ + ROM_LOAD16_BYTE( "u67.6l", 0x100000, 0x080000, CRC(a235488e) SHA1(a45d02a4451defbef7fbdab15671955fab8ed76b) ) /* jj-rom4.040 from jjsquawk */ + + ROM_REGION( 0x100000, "x1snd", 0 ) /* Samples */ + ROM_LOAD( "u70.10l", 0x000000, 0x100000, CRC(181a55b8) SHA1(6fa404f85bad93cc15e80feb61d19bed84602b82) ) /* jj-rom5.040 + jj-rom6.040 from jjsquawk */ +ROM_END + ROM_START( kamenrid ) ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_WORD_SWAP( "fj001003.25", 0x000000, 0x080000, CRC(9b65d1b9) SHA1(a9183f817dbd1721cbb1a9049ca2bfc6acdf9f4a) ) @@ -10760,6 +10762,7 @@ GAME( 1993, daioh, 0, daioh, daioh, 0, ROT270, "Athena", "Daioh", 0 ) GAME( 1993, jjsquawk, 0, jjsquawk, jjsquawk, 0, ROT0, "Athena / Able", "J. J. Squawkers", GAME_IMPERFECT_SOUND ) GAME( 1993, jjsquawkb,jjsquawk, jjsquawb, jjsquawk, 0, ROT0, "bootleg", "J. J. Squawkers (bootleg)", GAME_IMPERFECT_SOUND ) +GAME( 1993, jjsquawkb2,jjsquawk,jjsquawk, jjsquawk, 0, ROT0, "bootleg", "J. J. Squawkers (bootleg, Blandia Conversion)", GAME_IMPERFECT_SOUND ) GAME( 1993, kamenrid, 0, kamenrid, kamenrid, 0, ROT0, "Banpresto / Toei", "Masked Riders Club Battle Race", 0 ) GAME( 1993, madshark, 0, madshark, madshark, 0, ROT270, "Allumer", "Mad Shark", 0 ) GAME( 1993, msgundam, 0, msgundam, msgundam, 0, ROT0, "Banpresto", "Mobile Suit Gundam", 0 ) diff -Nru mame-0.144/src/mame/drivers/sfbonus.c mame-0.145/src/mame/drivers/sfbonus.c --- mame-0.144/src/mame/drivers/sfbonus.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/sfbonus.c 2012-02-06 21:30:37.000000000 +0000 @@ -84,7 +84,7 @@ Sound: OKI M6295 Other: XILINX XC9536XL (used for programable protection, connected to H2) -HM86171-120 - HMC 28 pin DIP Color Pallete RAMDAC +HM86171-120 - HMC 28 pin DIP Color Palette RAMDAC FM1608-120 - RAMTRON 64Kb bytewide Ferroelectric Nonvolatile RAM ULN2003A - 16 pin DIP Seven Darlington Arrays 386D - JRC 386D low voltage AMP @@ -140,7 +140,7 @@ Sound: OKI M6295 Other: XILINX XC9536XL (socketted) -HM86171-120 - HMC 28 pin DIP Color Pallete RAMDAC +HM86171-120 - HMC 28 pin DIP Color Palette RAMDAC ULN2003A - 16 pin DIP Seven Darlington Arrays 51864 - V62C51864L-35P 64Kb SRAM 75176 - SN75176BP Differential BUS Transceiver (Bidirectional data communication on multipoint bus transmission line) @@ -234,7 +234,7 @@ Sound: OKI M6295 Other: XILINX XC9536XL (used for programable protection, connected to H2) -HM86171-120 - HMC 28 pin DIP Color Pallete RAMDAC +HM86171-120 - HMC 28 pin DIP Color Palette RAMDAC FM1608-120 - RAMTRON 64Kb bytewide Ferroelectric Nonvolatile RAM ULN2003A - 16 pin DIP Seven Darlington Arrays 75176 - SN75176BP Differential BUS Transceiver (Bidirectional data communication on multipoint bus transmission line) @@ -252,7 +252,7 @@ -------------------------------------------------------------------- -MH86171 Color Pallete RAMDAC +MH86171 Color Palette RAMDAC Hardware & software compatible with VGA, MCGA & 8514/A graphics Compatible with the RS170 video stadard Single monolithic, high performance CMOS @@ -270,6 +270,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "sound/okim6295.h" +#include "video/ramdac.h" #include "pirpok2.lh" @@ -280,7 +281,7 @@ sfbonus_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - bitmap_t *m_temp_reel_bitmap; + bitmap_ind16 *m_temp_reel_bitmap; tilemap_t *m_tilemap; tilemap_t *m_reel_tilemap; tilemap_t *m_reel2_tilemap; @@ -300,7 +301,6 @@ UINT8* m_3000_regs; UINT8* m_2801_regs; UINT8* m_2c01_regs; - struct { int r,g,b,offs,offs_internal; } m_pal; }; @@ -708,35 +708,35 @@ if (offset<0x4000) /* 0x0000 - 0x3fff */ { state->m_tilemap_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset/2); + state->m_tilemap->mark_tile_dirty(offset/2); } else if (offset<0x4800) /* 0x4000 - 0x47ff */ { offset-=0x4000; state->m_reel_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_tilemap,offset/2); + state->m_reel_tilemap->mark_tile_dirty(offset/2); } else if (offset<0x5000) /* 0x4800 - 0x4fff */ { offset-=0x4800; state->m_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset/2); + state->m_reel2_tilemap->mark_tile_dirty(offset/2); } else if (offset<0x5800) /* 0x5000 - 0x57ff */ { offset-=0x5000; state->m_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset/2); + state->m_reel3_tilemap->mark_tile_dirty(offset/2); } else if (offset<0x6000) /* 0x5800 - 0x5fff */ { offset-=0x5800; state->m_reel4_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel4_tilemap,offset/2); + state->m_reel4_tilemap->mark_tile_dirty(offset/2); } else if (offset<0x8000) { @@ -757,7 +757,7 @@ static VIDEO_START(sfbonus) { sfbonus_state *state = machine.driver_data(); - state->m_temp_reel_bitmap = auto_bitmap_alloc(machine,1024,512,BITMAP_FORMAT_INDEXED16); + state->m_temp_reel_bitmap = auto_bitmap_ind16_alloc(machine,1024,512); state->m_tilemap = tilemap_create(machine,get_sfbonus_tile_info,tilemap_scan_rows,8,8, 128, 64); state->m_reel_tilemap = tilemap_create(machine,get_sfbonus_reel_tile_info,tilemap_scan_rows,8,32, 64, 16); @@ -765,29 +765,29 @@ state->m_reel3_tilemap = tilemap_create(machine,get_sfbonus_reel3_tile_info,tilemap_scan_rows,8,32, 64, 16); state->m_reel4_tilemap = tilemap_create(machine,get_sfbonus_reel4_tile_info,tilemap_scan_rows,8,32, 64, 16); - tilemap_set_transparent_pen(state->m_tilemap,0); - tilemap_set_transparent_pen(state->m_reel_tilemap,255); - tilemap_set_transparent_pen(state->m_reel2_tilemap,255); - tilemap_set_transparent_pen(state->m_reel3_tilemap,255); - tilemap_set_transparent_pen(state->m_reel4_tilemap,255); - - tilemap_set_scroll_rows(state->m_tilemap,64); - - tilemap_set_scroll_cols(state->m_reel_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel4_tilemap, 64); + state->m_tilemap->set_transparent_pen(0); + state->m_reel_tilemap->set_transparent_pen(255); + state->m_reel2_tilemap->set_transparent_pen(255); + state->m_reel3_tilemap->set_transparent_pen(255); + state->m_reel4_tilemap->set_transparent_pen(255); + + state->m_tilemap->set_scroll_rows(64); + + state->m_reel_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); + state->m_reel4_tilemap->set_scroll_cols(64); } -static void sfbonus_draw_reel_layer(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect, int catagory) +static void sfbonus_draw_reel_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int catagory) { - sfbonus_state *state = screen->machine().driver_data(); + sfbonus_state *state = screen.machine().driver_data(); int zz; int i; int startclipmin; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); UINT8* selectbase = &state->m_videoram[0x600]; UINT8* bg_scroll = &state->m_videoram[0x000]; UINT8* reels_rowscroll = &state->m_videoram[0x400]; @@ -802,16 +802,16 @@ { int scroll; scroll = bg_scroll[(i*2)+0x000] | (bg_scroll[(i*2)+0x001]<<8); - tilemap_set_scrolly(state->m_reel_tilemap, i, scroll + globalyscrollreels ); + state->m_reel_tilemap->set_scrolly(i, scroll + globalyscrollreels ); scroll = bg_scroll[(i*2)+0x080] | (bg_scroll[(i*2)+0x081]<<8); - tilemap_set_scrolly(state->m_reel2_tilemap, i, scroll + globalyscrollreels); + state->m_reel2_tilemap->set_scrolly(i, scroll + globalyscrollreels); scroll = bg_scroll[(i*2)+0x100] | (bg_scroll[(i*2)+0x101]<<8); - tilemap_set_scrolly(state->m_reel3_tilemap, i, scroll + globalyscrollreels); + state->m_reel3_tilemap->set_scrolly(i, scroll + globalyscrollreels); scroll = bg_scroll[(i*2)+0x180] | (bg_scroll[(i*2)+0x181]<<8); - tilemap_set_scrolly(state->m_reel4_tilemap, i, scroll + globalyscrollreels); + state->m_reel4_tilemap->set_scrolly(i, scroll + globalyscrollreels); } // printf("------------\n"); @@ -830,10 +830,7 @@ //printf("%04x %04x %d\n",zz, xxxscroll, line/8); /* draw top of screen */ - clip.min_x = visarea.min_x; - clip.max_x = 511; - clip.min_y = startclipmin; - clip.max_y = startclipmin; + clip.set(visarea.min_x, 511, startclipmin, startclipmin); @@ -842,73 +839,73 @@ { rowscroll = reels_rowscroll[((line/8)*2)+0x000] | (reels_rowscroll[((line/8)*2)+0x001]<<8); xxxscroll = globalxscrollreels + rowscroll; - tilemap_set_scrollx(state->m_reel_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel2_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel3_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel4_tilemap, 0, xxxscroll ); + state->m_reel_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel2_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel3_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel4_tilemap->set_scrollx(0, xxxscroll ); } else if (rowenable==0x1) { rowscroll = reels_rowscroll[((line/8)*2)+0x080] | (reels_rowscroll[((line/8)*2)+0x081]<<8); xxxscroll = globalxscrollreels + rowscroll; - tilemap_set_scrollx(state->m_reel_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel2_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel3_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel4_tilemap, 0, xxxscroll ); + state->m_reel_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel2_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel3_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel4_tilemap->set_scrollx(0, xxxscroll ); } else if (rowenable==0x2) { rowscroll = reels_rowscroll[((line/8)*2)+0x100] | (reels_rowscroll[((line/8)*2)+0x101]<<8); xxxscroll = globalxscrollreels + rowscroll; - tilemap_set_scrollx(state->m_reel_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel2_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel3_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel4_tilemap, 0, xxxscroll ); + state->m_reel_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel2_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel3_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel4_tilemap->set_scrollx(0, xxxscroll ); } else if (rowenable==0x3) { rowscroll = reels_rowscroll[((line/8)*2)+0x180] | (reels_rowscroll[((line/8)*2)+0x181]<<8); xxxscroll = globalxscrollreels + rowscroll; - tilemap_set_scrollx(state->m_reel_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel2_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel3_tilemap, 0, xxxscroll ); - tilemap_set_scrollx(state->m_reel4_tilemap, 0, xxxscroll ); + state->m_reel_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel2_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel3_tilemap->set_scrollx(0, xxxscroll ); + state->m_reel4_tilemap->set_scrollx(0, xxxscroll ); } if (rowenable2==0) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel_tilemap,TILEMAP_DRAW_CATEGORY(catagory),3); + state->m_reel_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),3); } if (rowenable==0) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel_tilemap,TILEMAP_DRAW_CATEGORY(catagory),3); + state->m_reel_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),3); } if (rowenable2==0x1) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel2_tilemap,TILEMAP_DRAW_CATEGORY(catagory),2); + state->m_reel2_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),2); } if (rowenable==0x1) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel2_tilemap,TILEMAP_DRAW_CATEGORY(catagory),2); + state->m_reel2_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),2); } if (rowenable2==0x2) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel3_tilemap,TILEMAP_DRAW_CATEGORY(catagory),1); + state->m_reel3_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),1); } if (rowenable==0x2) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel3_tilemap,TILEMAP_DRAW_CATEGORY(catagory),1); + state->m_reel3_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),1); } if (rowenable2==0x3) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel4_tilemap,TILEMAP_DRAW_CATEGORY(catagory),4); + state->m_reel4_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),4); } if (rowenable==0x3) { - tilemap_draw(state->m_temp_reel_bitmap,&clip,state->m_reel4_tilemap,TILEMAP_DRAW_CATEGORY(catagory),4); + state->m_reel4_tilemap->draw(*state->m_temp_reel_bitmap, clip, TILEMAP_DRAW_CATEGORY(catagory),4); } @@ -920,9 +917,9 @@ } -static SCREEN_UPDATE(sfbonus) +static SCREEN_UPDATE_IND16(sfbonus) { - sfbonus_state *state = screen->machine().driver_data(); + sfbonus_state *state = screen.machine().driver_data(); int globalyscroll = (state->m_vregs[2] | state->m_vregs[3]<<8); int globalxscroll = (state->m_vregs[0] | state->m_vregs[1]<<8); @@ -934,11 +931,11 @@ globalyscroll += 8; globalxscroll += 8; - bitmap_fill(bitmap,cliprect,screen->machine().pens[0]); - bitmap_fill(state->m_temp_reel_bitmap,cliprect,screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); + state->m_temp_reel_bitmap->fill(screen.machine().pens[0], cliprect); /* render reels to bitmap */ - sfbonus_draw_reel_layer(screen,state->m_temp_reel_bitmap,cliprect,0); + sfbonus_draw_reel_layer(screen,*state->m_temp_reel_bitmap,cliprect,0); { int y,x; @@ -947,8 +944,8 @@ { for (x=0;x<512;x++) { - UINT16* src = BITMAP_ADDR16(state->m_temp_reel_bitmap, y, x); - UINT16* dst = BITMAP_ADDR16(bitmap, y, x); + UINT16* src = &state->m_temp_reel_bitmap->pix16(y, x); + UINT16* dst = &bitmap.pix16(y, x); if ((src[0]&0x100)==0x000) dst[0] = src[0]; @@ -957,14 +954,14 @@ } /* Normal Tilemap */ - tilemap_set_scrolly(state->m_tilemap, 0, globalyscroll ); + state->m_tilemap->set_scrolly(0, globalyscroll ); for (i=0;i<64;i++) { int scroll; scroll = front_rowscroll[(i*2)+0x000] | (front_rowscroll[(i*2)+0x001]<<8); - tilemap_set_scrollx(state->m_tilemap, i, scroll+globalxscroll ); + state->m_tilemap->set_scrollx(i, scroll+globalxscroll ); } - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); { int y,x; @@ -973,8 +970,8 @@ { for (x=0;x<512;x++) { - UINT16* src = BITMAP_ADDR16(state->m_temp_reel_bitmap, y, x); - UINT16* dst = BITMAP_ADDR16(bitmap, y, x); + UINT16* src = &state->m_temp_reel_bitmap->pix16(y, x); + UINT16* dst = &bitmap.pix16(y, x); if ((src[0]&0x100)==0x100) dst[0] = src[0]-0x100; @@ -1031,7 +1028,7 @@ state->m_1800_regs[7]); #endif - ipt = screen->machine().system().ipt; + ipt = screen.machine().system().ipt; if ((ipt == INPUT_PORTS_NAME(amcoe2_reels3)) || (ipt == INPUT_PORTS_NAME(amcoe2_reels4)) || (ipt == INPUT_PORTS_NAME(amcoe2_poker))) { @@ -1058,41 +1055,6 @@ } -static WRITE8_HANDLER( paletteram_io_w ) -{ - sfbonus_state *state = space->machine().driver_data(); - switch(offset) - { - case 0: - state->m_pal.offs = data; - break; - case 2: - state->m_pal.offs_internal = 0; - break; - case 1: - switch(state->m_pal.offs_internal) - { - case 0: - state->m_pal.r = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 1: - state->m_pal.g = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - state->m_pal.offs_internal++; - break; - case 2: - state->m_pal.b = ((data & 0x3f) << 2) | ((data & 0x30) >> 4); - palette_set_color(space->machine(), state->m_pal.offs, MAKE_RGB(state->m_pal.r, state->m_pal.g, state->m_pal.b)); - state->m_pal.offs_internal = 0; - state->m_pal.offs++; - break; - } - - break; - } -} - - static ADDRESS_MAP_START( sfbonus_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xefff) AM_ROMBANK("bank1") AM_WRITE(sfbonus_videoram_w) @@ -1182,7 +1144,9 @@ AM_RANGE(0x0800, 0x0800) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) - AM_RANGE(0x0c00, 0x0c03) AM_WRITE( paletteram_io_w ) + AM_RANGE(0x0c00, 0x0c00) AM_DEVWRITE_MODERN("ramdac", ramdac_device, index_w) + AM_RANGE(0x0c01, 0x0c01) AM_DEVWRITE_MODERN("ramdac", ramdac_device, pal_w) + AM_RANGE(0x0c02, 0x0c02) AM_DEVWRITE_MODERN("ramdac", ramdac_device, mask_w) AM_RANGE(0x1800, 0x1807) AM_WRITE(sfbonus_1800_w) AM_BASE_MEMBER(sfbonus_state, m_1800_regs) // lamps and coin counters @@ -1267,6 +1231,15 @@ } } +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE_MODERN("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) +{ + 0 +}; + static MACHINE_CONFIG_START( sfbonus, sfbonus_state ) MCFG_CPU_ADD("maincpu", Z80, 6000000) // custom packaged z80 CPU ?? Mhz @@ -1279,19 +1252,19 @@ MCFG_NVRAM_HANDLER(sfbonus) - MCFG_GFXDECODE(sfbonus) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(128*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 288-1) - MCFG_SCREEN_UPDATE(sfbonus) + MCFG_SCREEN_UPDATE_STATIC(sfbonus) MCFG_PALETTE_LENGTH(0x100*2) // *2 for priority workaraound / custom drawing + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) + MCFG_VIDEO_START(sfbonus) /* Parrot 3 seems fine at 1 Mhz, but Double Challenge isn't? */ @@ -5385,6 +5358,62 @@ ROM_LOAD_OPTIONAL( "aw13re.id", 0x00, 0x1000, CRC(0f9991fb) SHA1(5ea9e49c6b8b00c2c3638cc39e479d6e5e112b7a) ) ROM_END +/* Fruit Bonus Deluxe */ +/* + +Version 1.0.3 program rom need dumping. Board was reflashed (updated) to v1.0.9 + + ROM SUM16 on label Flash ROM type + ----------------------------------------- + ROM1 E4E6 <-- V1.0.3 AMIC A29040B + ROM2 5802 EON EN29F002ANT + ROM3 2C2C EON EN29F002ANT + ROM4 844D EON EN29F002ANT + ROM5 3E9E EON EN29F040A + ROM6 9EC8 EON EN29F040A + +All ROMs dumped via manufacturer's ROM types and matched the SUM16 printed on the labels + +*/ + +ROM_START( fbdeluxe ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "fbd109r.bin", 0x00000, 0x80000, CRC(e5e83752) SHA1(7fb53de0ea24ce402298fba59eb14208cf266f3e) ) + + ROM_REGION( 0x040000, "oki", ROMREGION_ERASE00 ) /* Samples */ + ROM_LOAD( "fbrom2.bin", 0x00000, 0x40000, CRC(8ae6273f) SHA1(23b242a05cf50ceb8d044def69f8671527feca59) ) + + ROM_REGION( 0x100000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "fbrom3.bin", 0x00000, 0x40000, CRC(14e60e0e) SHA1(66871107d1abf274c794b443d0251672e4ad420a) ) /* 2Mbit rom is correct */ + ROM_LOAD16_BYTE( "fbrom4.bin", 0x00001, 0x40000, CRC(83daa849) SHA1(4be8ea3f0f2d036c750f3602b9a79360c58a6da7) ) /* 2Mbit rom is correct */ + + ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "fbrom5.bin", 0x00000, 0x80000, CRC(b27393bf) SHA1(e3798327c7ba1cec694cd4bd21215d3d8f620bcc) ) + ROM_LOAD16_BYTE( "fbrom6.bin", 0x00001, 0x80000, CRC(ec47c758) SHA1(f8cb7f8cadc6d6b0b98bb71e78adcd9239ec734f) ) + + ROM_REGION( 0x1000, "defaults", 0 ) /* default settings */ + ROM_LOAD_OPTIONAL( "fbdeluxe.id", 0x00, 0x1000, CRC(4a4ab8f6) SHA1(12710cb4e5f94449a4899daac0ab9687dabd82cd) ) +ROM_END + +ROM_START( fbdeluxeo ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */ + ROM_LOAD( "fbd107r.bin", 0x00000, 0x80000, CRC(b29be47d) SHA1(bd3098fa6b914b2f9dcbe36e2cf36f90c67c1424) ) + + ROM_REGION( 0x040000, "oki", ROMREGION_ERASE00 ) /* Samples */ + ROM_LOAD( "fbrom2.bin", 0x00000, 0x40000, CRC(8ae6273f) SHA1(23b242a05cf50ceb8d044def69f8671527feca59) ) + + ROM_REGION( 0x100000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "fbrom3.bin", 0x00000, 0x40000, CRC(14e60e0e) SHA1(66871107d1abf274c794b443d0251672e4ad420a) ) /* 2Mbit rom is correct */ + ROM_LOAD16_BYTE( "fbrom4.bin", 0x00001, 0x40000, CRC(83daa849) SHA1(4be8ea3f0f2d036c750f3602b9a79360c58a6da7) ) /* 2Mbit rom is correct */ + + ROM_REGION( 0x100000, "gfx2", 0 ) + ROM_LOAD16_BYTE( "fbrom5.bin", 0x00000, 0x80000, CRC(b27393bf) SHA1(e3798327c7ba1cec694cd4bd21215d3d8f620bcc) ) + ROM_LOAD16_BYTE( "fbrom6.bin", 0x00001, 0x80000, CRC(ec47c758) SHA1(f8cb7f8cadc6d6b0b98bb71e78adcd9239ec734f) ) + + ROM_REGION( 0x1000, "defaults", 0 ) /* default settings */ + ROM_LOAD_OPTIONAL( "fbdeluxe.id", 0x00, 0x1000, CRC(4a4ab8f6) SHA1(12710cb4e5f94449a4899daac0ab9687dabd82cd) ) +ROM_END + /* Fruit Bonus 3G */ /* @@ -5609,38 +5638,6 @@ ROM_LOAD16_BYTE( "snrom6.bin", 0x00001, 0x80000, NO_DUMP ) ROM_END -ROM_START( fbdeluxe ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "fbd109r.bin", 0x00000, 0x80000, CRC(e5e83752) SHA1(7fb53de0ea24ce402298fba59eb14208cf266f3e) ) - - ROM_REGION( 0x040000, "oki", ROMREGION_ERASE00 ) /* Samples */ - ROM_LOAD( "fbrom2.bin", 0x00000, 0x40000, NO_DUMP ) - - ROM_REGION( 0x100000, "gfx1", 0 ) - ROM_LOAD16_BYTE( "fbrom3.bin", 0x00000, 0x80000, NO_DUMP ) - ROM_LOAD16_BYTE( "fbrom4.bin", 0x00001, 0x80000, NO_DUMP ) - - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD16_BYTE( "fbrom5.bin", 0x00000, 0x80000, NO_DUMP ) - ROM_LOAD16_BYTE( "fbrom6.bin", 0x00001, 0x80000, NO_DUMP ) -ROM_END - -ROM_START( fbdeluxeo ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */ - ROM_LOAD( "fbd107r.bin", 0x00000, 0x80000, CRC(b29be47d) SHA1(bd3098fa6b914b2f9dcbe36e2cf36f90c67c1424) ) - - ROM_REGION( 0x040000, "oki", ROMREGION_ERASE00 ) /* Samples */ - ROM_LOAD( "fbrom2.bin", 0x00000, 0x40000, NO_DUMP ) - - ROM_REGION( 0x100000, "gfx1", 0 ) - ROM_LOAD16_BYTE( "fbrom3.bin", 0x00000, 0x80000, NO_DUMP ) - ROM_LOAD16_BYTE( "fbrom4.bin", 0x00001, 0x80000, NO_DUMP ) - - ROM_REGION( 0x100000, "gfx2", 0 ) - ROM_LOAD16_BYTE( "fbrom5.bin", 0x00000, 0x80000, NO_DUMP ) - ROM_LOAD16_BYTE( "fbrom6.bin", 0x00001, 0x80000, NO_DUMP ) -ROM_END - ROM_START( getrich ) ROM_REGION( 0x80000, "maincpu", 0 ) /* Z80 Code */ ROM_LOAD( "grd101r.bin", 0x00000, 0x80000, CRC(4cc1142c) SHA1(321aacea819c43ef0ad38b11286e6d388fb6a179) ) @@ -6149,6 +6146,9 @@ GAME( 2007, atworlde1, atworld, sfbonus, amcoe1_reels3, atworld, ROT0, "Amcoe", "Around The World (Version 1.3E CGA)", 0) /* Year according to Amcoe web site */ GAME( 2007, atworldd1, atworld, sfbonus, amcoe1_reels3, atworldd, ROT0, "Amcoe", "Around The World (Version 1.3R CGA)", 0) /* Year according to Amcoe web site */ +GAME( 200?, fbdeluxe, 0, sfbonus, amcoe1_reels3, fbdeluxe, ROT0, "Amcoe", "Fruit Bonus Deluxe (Version 1.0.9)", 0) /* After Around The World */ +GAME( 200?, fbdeluxeo, fbdeluxe, sfbonus, amcoe1_reels3, fbdeluxe, ROT0, "Amcoe", "Fruit Bonus Deluxe (Version 1.0.7)", 0) /* After Around The World */ + GAME( 200?, fb3g, 0, sfbonus, amcoe1_reels3, fb3g, ROT0, "Amcoe", "Fruit Bonus 3G (Version 1.0.3)", 0) /* After Around The World */ // no graphic / sound roms dumped for these sets, but functional program roms & descramble are in place @@ -6165,9 +6165,6 @@ GAME( 200?, spooky, 0, sfbonus, amcoe1_reels3, spooky, ROT0, "Amcoe", "Spooky Night (2nd edition) (Version 2.0.4)", GAME_NOT_WORKING) /* After Around The World */ -GAME( 200?, fbdeluxe, 0, sfbonus, amcoe1_reels3, fbdeluxe, ROT0, "Amcoe", "Fruit Bonus Deluxe (Version 1.0.9)", GAME_NOT_WORKING) /* After Around The World */ -GAME( 200?, fbdeluxeo, fbdeluxe, sfbonus, amcoe1_reels3, fbdeluxe, ROT0, "Amcoe", "Fruit Bonus Deluxe (Version 1.0.7)", GAME_NOT_WORKING) /* After Around The World */ - GAME( 200?, getrich, 0, sfbonus, amcoe1_reels3, getrich, ROT0, "Amcoe", "Get Rich (Version 1.0.1)", GAME_NOT_WORKING) /* After Around The World */ diff -Nru mame-0.144/src/mame/drivers/sf.c mame-0.145/src/mame/drivers/sf.c --- mame-0.144/src/mame/drivers/sf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/sf.c 2012-02-06 21:30:33.000000000 +0000 @@ -849,10 +849,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(sf) + MCFG_SCREEN_UPDATE_STATIC(sf) MCFG_GFXDECODE(sf) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/sfcbox.c mame-0.145/src/mame/drivers/sfcbox.c --- mame-0.144/src/mame/drivers/sfcbox.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/sfcbox.c 2012-02-06 21:30:40.000000000 +0000 @@ -224,9 +224,8 @@ MCFG_VIDEO_START( snes ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC) - MCFG_SCREEN_UPDATE( snes ) + MCFG_SCREEN_UPDATE_STATIC( snes ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/sfkick.c mame-0.145/src/mame/drivers/sfkick.c --- mame-0.144/src/mame/drivers/sfkick.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/sfkick.c 2012-02-06 21:30:41.000000000 +0000 @@ -56,19 +56,20 @@ #include "video/v9938.h" #include "machine/8255ppi.h" #include "sound/2203intf.h" -#include "deprecat.h" class sfkick_state : public driver_device { public: sfkick_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") { } UINT8 *m_main_mem; int m_bank_cfg; int m_bank[8]; int m_input_mux; + required_device m_v9938; }; @@ -332,10 +333,7 @@ ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE( 0xa0, 0xa7) AM_WRITE( soundlatch_w ) - AM_RANGE( 0x98, 0x98) AM_READWRITE( v9938_0_vram_r , v9938_0_vram_w) - AM_RANGE( 0x99, 0x99) AM_READWRITE( v9938_0_status_r, v9938_0_command_w ) - AM_RANGE( 0x9a, 0x9a) AM_WRITE( v9938_0_palette_w ) - AM_RANGE( 0x9b, 0x9b) AM_WRITE( v9938_0_register_w ) + AM_RANGE( 0x98, 0x9b) AM_DEVREADWRITE_MODERN( "v9938", v9938_device, read, write) AM_RANGE( 0xa8, 0xab) AM_DEVREADWRITE("ppi8255", ppi8255_r, ppi8255_w) AM_RANGE( 0xb4, 0xb5) AM_RAM /* loopback ? req by sfkicka (MSX Bios leftover)*/ ADDRESS_MAP_END @@ -430,22 +428,14 @@ PORT_DIPSETTING( 0x08, DEF_STR( 1C_5C ) ) INPUT_PORTS_END -static void sfkick_vdp_interrupt(running_machine &machine, int i) +static void sfkick_vdp_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line (machine, "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); -} - -static VIDEO_START( sfkick ) -{ - VIDEO_START_CALL(generic_bitmapped); - v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, 0x80000, sfkick_vdp_interrupt); - v9938_reset(0); + cputag_set_input_line (device.machine(), "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); } static MACHINE_RESET(sfkick) { sfkick_state *state = machine.driver_data(); - v9938_reset(0); state->m_bank_cfg=0; state->m_bank[0]=0; state->m_bank[1]=0; @@ -458,10 +448,12 @@ sfkick_remap_banks(machine); } -static INTERRUPT_GEN( sfkick_interrupt ) +static TIMER_DEVICE_CALLBACK( sfkick_interrupt ) { - v9938_interrupt(device->machine(), 0); + sfkick_state *state = timer.machine().driver_data(); + state->m_v9938->interrupt(); } + static void irqhandler(device_t *device, int irq) { cputag_set_input_line_and_vector(device->machine(), "soundcpu", 0, irq ? ASSERT_LINE : CLEAR_LINE, 0xff); @@ -482,7 +474,7 @@ MCFG_CPU_ADD("maincpu",Z80,MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(sfkick_map) MCFG_CPU_IO_MAP(sfkick_io_map) - MCFG_CPU_VBLANK_INT_HACK(sfkick_interrupt,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", sfkick_interrupt, "screen", 0, 1) MCFG_QUANTUM_TIME(attotime::from_hz(60000)) @@ -490,13 +482,15 @@ MCFG_CPU_PROGRAM_MAP(sfkick_sound_map) MCFG_CPU_IO_MAP(sfkick_sound_io_map) + MCFG_V9938_ADD("v9938", "screen", 0x80000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(sfkick_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) - MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(512) @@ -506,8 +500,6 @@ MCFG_PALETTE_INIT( v9938 ) - MCFG_VIDEO_START(sfkick) - MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym1", YM2203, MASTER_CLOCK/6) MCFG_SOUND_CONFIG(ym2203_config) diff -Nru mame-0.144/src/mame/drivers/sg1000a.c mame-0.145/src/mame/drivers/sg1000a.c --- mame-0.144/src/mame/drivers/sg1000a.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/sg1000a.c 2012-02-06 21:30:42.000000000 +0000 @@ -137,7 +137,7 @@ static ADDRESS_MAP_START( program_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM // separate region needed for decrypting AM_RANGE(0x8000, 0xbfff) AM_ROM - AM_RANGE(0xc000, 0xc3ff) AM_RAM + AM_RANGE(0xc000, 0xc3ff) AM_RAM AM_MIRROR(0x400) ADDRESS_MAP_END static ADDRESS_MAP_START( io_map, AS_IO, 8 ) @@ -261,14 +261,6 @@ DEVCB_HANDLER(sg1000a_coin_counter_w) }; -static SCREEN_UPDATE( sg1000a ) -{ - tms9928a_device *tms9928a = screen->machine().device( "tms9928a" ); - - tms9928a->update( bitmap, cliprect ); - return 0; -} - /************************************* * * Machine drivers @@ -286,7 +278,7 @@ /* video hardware */ MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, sg1000a_tms9928a_interface ) MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) - MCFG_SCREEN_UPDATE( sg1000a ) + MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/shadfrce.c mame-0.145/src/mame/drivers/shadfrce.c --- mame-0.144/src/mame/drivers/shadfrce.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/shadfrce.c 2012-02-06 21:30:37.000000000 +0000 @@ -566,10 +566,9 @@ MCFG_CPU_PROGRAM_MAP(shadfrce_sound_map) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 432, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */ - MCFG_SCREEN_UPDATE(shadfrce) - MCFG_SCREEN_EOF(shadfrce) + MCFG_SCREEN_UPDATE_STATIC(shadfrce) + MCFG_SCREEN_VBLANK_STATIC(shadfrce) MCFG_GFXDECODE(shadfrce) MCFG_PALETTE_LENGTH(0x4000) diff -Nru mame-0.144/src/mame/drivers/shangha3.c mame-0.145/src/mame/drivers/shangha3.c --- mame-0.144/src/mame/drivers/shangha3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/shangha3.c 2012-02-06 21:30:41.000000000 +0000 @@ -480,10 +480,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(24*16, 16*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 1*16, 15*16-1) - MCFG_SCREEN_UPDATE(shangha3) + MCFG_SCREEN_UPDATE_STATIC(shangha3) MCFG_GFXDECODE(shangha3) MCFG_PALETTE_LENGTH(2048) @@ -519,10 +518,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(24*16, 16*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 1*16, 15*16-1) - MCFG_SCREEN_UPDATE(shangha3) + MCFG_SCREEN_UPDATE_STATIC(shangha3) MCFG_GFXDECODE(shangha3) MCFG_PALETTE_LENGTH(2048) @@ -559,10 +557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(24*16, 16*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 24*16-1, 1*16, 15*16-1) - MCFG_SCREEN_UPDATE(shangha3) + MCFG_SCREEN_UPDATE_STATIC(shangha3) MCFG_GFXDECODE(shangha3) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/shanghai.c mame-0.145/src/mame/drivers/shanghai.c --- mame-0.144/src/mame/drivers/shanghai.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/shanghai.c 2012-02-06 21:30:41.000000000 +0000 @@ -71,9 +71,9 @@ { } -static SCREEN_UPDATE( shanghai ) +static SCREEN_UPDATE_IND16( shanghai ) { - device_t *hd63484 = screen->machine().device("hd63484"); + device_t *hd63484 = screen.machine().device("hd63484"); int x, y, b, src; b = ((hd63484_regs_r(hd63484, 0xcc/2, 0xffff) & 0x000f) << 16) + hd63484_regs_r(hd63484, 0xce/2, 0xffff); @@ -83,8 +83,8 @@ { b &= (HD63484_RAM_SIZE - 1); src = hd63484_ram_r(hd63484, b, 0xffff); - *BITMAP_ADDR16(bitmap, y, x) = src & 0x00ff; - *BITMAP_ADDR16(bitmap, y, x + 1) = (src & 0xff00) >> 8; + bitmap.pix16(y, x) = src & 0x00ff; + bitmap.pix16(y, x + 1) = (src & 0xff00) >> 8; b++; } } @@ -107,8 +107,8 @@ src = hd63484_ram_r(hd63484, b, 0xffff); if (x <= w && x + sx >= 0 && x + sx < (hd63484_regs_r(hd63484, 0xca/2, 0xffff) & 0x0fff) * 2) { - *BITMAP_ADDR16(bitmap, y, x + sx) = src & 0x00ff; - *BITMAP_ADDR16(bitmap, y, x + sx + 1) = (src & 0xff00) >> 8; + bitmap.pix16(y, x + sx) = src & 0x00ff; + bitmap.pix16(y, x + sx + 1) = (src & 0xff00) >> 8; } b++; } @@ -445,10 +445,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 280) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1) // Base Screen is 384 pixel - MCFG_SCREEN_UPDATE(shanghai) + MCFG_SCREEN_UPDATE_STATIC(shanghai) MCFG_PALETTE_LENGTH(256) @@ -480,10 +479,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 280) MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 280-1) // Base Screen is 384 pixel - MCFG_SCREEN_UPDATE(shanghai) + MCFG_SCREEN_UPDATE_STATIC(shanghai) MCFG_PALETTE_LENGTH(256) @@ -519,10 +517,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(384, 280) MCFG_SCREEN_VISIBLE_AREA(8, 384-1, 0, 250-1) // Base Screen is 376 pixel - MCFG_SCREEN_UPDATE(shanghai) + MCFG_SCREEN_UPDATE_STATIC(shanghai) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/shangkid.c mame-0.145/src/mame/drivers/shangkid.c --- mame-0.144/src/mame/drivers/shangkid.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/shangkid.c 2012-02-06 21:30:41.000000000 +0000 @@ -389,10 +389,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(16, 319-16, 0, 223) - MCFG_SCREEN_UPDATE(shangkid) + MCFG_SCREEN_UPDATE_STATIC(shangkid) MCFG_GFXDECODE(chinhero) MCFG_PALETTE_LENGTH(256) @@ -469,10 +468,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256+32, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255+32, 16, 255-16) - MCFG_SCREEN_UPDATE(dynamski) + MCFG_SCREEN_UPDATE_STATIC(dynamski) MCFG_GFXDECODE(dynamski) MCFG_PALETTE_LENGTH(16*4+16*4) diff -Nru mame-0.144/src/mame/drivers/shaolins.c mame-0.145/src/mame/drivers/shaolins.c --- mame-0.144/src/mame/drivers/shaolins.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/shaolins.c 2012-02-06 21:30:34.000000000 +0000 @@ -8,21 +8,20 @@ #include "emu.h" #include "cpu/m6809/m6809.h" -#include "deprecat.h" #include "sound/sn76496.h" #include "includes/shaolins.h" #define MASTER_CLOCK XTAL_18_432MHz -static INTERRUPT_GEN( shaolins_interrupt ) +static TIMER_DEVICE_CALLBACK( shaolins_interrupt ) { - shaolins_state *state = device->machine().driver_data(); + shaolins_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) == 0) device_set_input_line(device, 0, HOLD_LINE); - else if (cpu_getiloops(device) % 2) - { - if (state->m_nmi_enable & 0x02) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } + if(scanline == 240) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + else if((scanline % 32) == 0) + if (state->m_nmi_enable & 0x02) device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } @@ -193,16 +192,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(shaolins_map) - MCFG_CPU_VBLANK_INT_HACK(shaolins_interrupt,16) /* 1 IRQ + 8 NMI */ + MCFG_TIMER_ADD_SCANLINE("scantimer", shaolins_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(shaolins) + MCFG_SCREEN_UPDATE_STATIC(shaolins) MCFG_GFXDECODE(shaolins) MCFG_PALETTE_LENGTH(16*8*16+16*8*16) diff -Nru mame-0.144/src/mame/drivers/shisen.c mame-0.145/src/mame/drivers/shisen.c --- mame-0.144/src/mame/drivers/shisen.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/shisen.c 2012-02-06 21:30:34.000000000 +0000 @@ -226,10 +226,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(sichuan2) + MCFG_SCREEN_UPDATE_STATIC(sichuan2) MCFG_GFXDECODE(shisen) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/shootout.c mame-0.145/src/mame/drivers/shootout.c --- mame-0.144/src/mame/drivers/shootout.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/shootout.c 2012-02-06 21:30:38.000000000 +0000 @@ -95,12 +95,13 @@ /*******************************************************************************/ +/* same as Tryout */ static ADDRESS_MAP_START( shootout_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x4000, 0x4001) AM_DEVREADWRITE("ymsnd", ym2203_r,ym2203_w) AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r) AM_RANGE(0xc000, 0xffff) AM_ROM - AM_RANGE(0xd000, 0xd000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xd000, 0xd000) AM_WRITENOP // unknown, NOT irq/nmi mask ADDRESS_MAP_END /*******************************************************************************/ @@ -273,10 +274,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(shootout) + MCFG_SCREEN_UPDATE_STATIC(shootout) MCFG_GFXDECODE(shootout) MCFG_PALETTE_LENGTH(256) @@ -303,10 +303,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(shootouj) + MCFG_SCREEN_UPDATE_STATIC(shootouj) MCFG_GFXDECODE(shootout) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/shougi.c mame-0.145/src/mame/drivers/shougi.c --- mame-0.144/src/mame/drivers/shougi.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/shougi.c 2012-02-06 21:30:35.000000000 +0000 @@ -160,9 +160,9 @@ -static SCREEN_UPDATE( shougi ) +static SCREEN_UPDATE_IND16( shougi ) { - shougi_state *state = screen->machine().driver_data(); + shougi_state *state = screen.machine().driver_data(); int offs; for (offs = 0;offs <0x4000; offs++) @@ -182,7 +182,7 @@ color= ((data1>>x) & 1) | (((data1>>(4+x)) & 1)<<1); data = ((data2>>x) & 1) | (((data2>>(4+x)) & 1)<<1); - *BITMAP_ADDR16(bitmap, 255-sy, 255-(sx*4 + x)) = color*4 + data; + bitmap.pix16(255-sy, 255-(sx*4 + x)) = color*4 + data; } } @@ -412,10 +412,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 255) - MCFG_SCREEN_UPDATE(shougi) + MCFG_SCREEN_UPDATE_STATIC(shougi) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/shtzone.c mame-0.145/src/mame/drivers/shtzone.c --- mame-0.144/src/mame/drivers/shtzone.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/shtzone.c 2012-02-06 21:30:37.000000000 +0000 @@ -0,0 +1,123 @@ +/* + +"Sega Shooting Zone" aka "Sega Sharp Shooter" + +This is an SMS with a timer system, official Sega product. Cabinet has a lightgun, it runs the SMS light gun games. + +It has 2 IO controllers, and 1 VDP, so I'm guessing the BIOS just displays to some kind of Segment LED display. + +--------------------------------- + +Shooting Zone by SEGA 1987 + +834-6294 + +CPU(s) : D780C (x2) + +Xtal : 10.7380 Mhz + +RAMS(s) : D4168C (x3) + : MB8464-12L + +Eprom : Epr10894A.20 + +PAL : 315-5287 + +Customs IC's : 315-5216 (x2) + + 315-5124 + +GAMES for this system : + +Black Belt (mpr10150.ic1) + +Shooting Gallery + +Gangster Town + +Marksman Shooting / Trap Shooting / Safari Hunt (315-5028.ic1 + Mpr10157.ic2) + +Fantasy Zone(1) + +--------------------------------- + +Notes: +(1) apparently.... seems a bit odd, because it's not a gun game + + +*/ + +#include "emu.h" +#include "cpu/z80/z80.h" + +class shtzone_state : public driver_device +{ +public: + shtzone_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } +}; + +static ADDRESS_MAP_START( shtzone_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x5fff) AM_RAM +ADDRESS_MAP_END + + +static INPUT_PORTS_START( shtzone ) +INPUT_PORTS_END + + +static MACHINE_START( shtzone ) +{ + +} + +static MACHINE_RESET( shtzone ) +{ + +} + +VIDEO_START( shtzone ) +{ + +} + + +SCREEN_UPDATE_IND16( shtzone ) +{ + + return 0; +} + + +static MACHINE_CONFIG_START( shtzone, shtzone_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("timercpu", Z80,10738000/4) + MCFG_CPU_PROGRAM_MAP(shtzone_map) + + /* + SMS CPU */ + + MCFG_MACHINE_START(shtzone) + MCFG_MACHINE_RESET(shtzone) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(256, 256) + MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) + MCFG_SCREEN_UPDATE_STATIC(shtzone) + + MCFG_PALETTE_LENGTH(0x100) + + MCFG_VIDEO_START(shtzone) +MACHINE_CONFIG_END + + +ROM_START( shtzone ) + ROM_REGION( 0x4000, "timercpu", 0 ) + ROM_LOAD( "epr10894a.20", 0x00000, 0x04000, CRC(ea8901d9) SHA1(43fd8bfc395e3b2e3fbe9645d692a5eb04783d9c) ) +ROM_END + +GAME( 1987, shtzone, 0, shtzone, shtzone, 0, ROT0, "Sega", "Shooting Zone System BIOS", GAME_IS_SKELETON | GAME_NO_SOUND | GAME_NOT_WORKING | GAME_IS_BIOS_ROOT ) diff -Nru mame-0.144/src/mame/drivers/shuuz.c mame-0.145/src/mame/drivers/shuuz.c --- mame-0.144/src/mame/drivers/shuuz.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/shuuz.c 2012-02-06 21:30:36.000000000 +0000 @@ -275,11 +275,10 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a VAD chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(shuuz) + MCFG_SCREEN_UPDATE_STATIC(shuuz) MCFG_VIDEO_START(shuuz) diff -Nru mame-0.144/src/mame/drivers/sidearms.c mame-0.145/src/mame/drivers/sidearms.c --- mame-0.144/src/mame/drivers/sidearms.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/sidearms.c 2012-02-06 21:30:41.000000000 +0000 @@ -668,11 +668,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(sidearms) - MCFG_SCREEN_EOF(sidearms) + MCFG_SCREEN_UPDATE_STATIC(sidearms) + MCFG_SCREEN_VBLANK_STATIC(sidearms) MCFG_GFXDECODE(sidearms) MCFG_PALETTE_LENGTH(1024) @@ -713,11 +712,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_EOF(sidearms) - MCFG_SCREEN_UPDATE(sidearms) + MCFG_SCREEN_VBLANK_STATIC(sidearms) + MCFG_SCREEN_UPDATE_STATIC(sidearms) MCFG_GFXDECODE(turtship) MCFG_PALETTE_LENGTH(1024) @@ -761,11 +759,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(sidearms) - MCFG_SCREEN_EOF(sidearms) + MCFG_SCREEN_UPDATE_STATIC(sidearms) + MCFG_SCREEN_VBLANK_STATIC(sidearms) MCFG_GFXDECODE(turtship) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/sidepckt.c mame-0.145/src/mame/drivers/sidepckt.c --- mame-0.144/src/mame/drivers/sidepckt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/sidepckt.c 2012-02-06 21:30:33.000000000 +0000 @@ -274,10 +274,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* VERIFY: May be 55 or 56 */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(sidepckt) + MCFG_SCREEN_UPDATE_STATIC(sidepckt) MCFG_GFXDECODE(sidepckt) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/sigmab52.c mame-0.145/src/mame/drivers/sigmab52.c --- mame-0.144/src/mame/drivers/sigmab52.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sigmab52.c 2012-02-06 21:30:41.000000000 +0000 @@ -156,9 +156,9 @@ } -static SCREEN_UPDATE( jwildb52 ) +static SCREEN_UPDATE_IND16( jwildb52 ) { - device_t *hd63484 = screen->machine().device("hd63484"); + device_t *hd63484 = screen.machine().device("hd63484"); int x, y, b, src; @@ -166,7 +166,7 @@ //save vram to file #if 0 - if (screen->machine().input().code_pressed_once(KEYCODE_Q)) + if (screen.machine().input().code_pressed_once(KEYCODE_Q)) { FILE *p = fopen("vram.bin", "wb"); fwrite(&HD63484_ram[0], 1, 0x40000 * 4, p); @@ -182,15 +182,15 @@ src = hd63484_ram_r(hd63484, b & (HD63484_RAM_SIZE - 1), 0xffff); - *BITMAP_ADDR16(bitmap, y, x ) = ((src & 0x000f) >> 0) << 0; - *BITMAP_ADDR16(bitmap, y, x + 1) = ((src & 0x00f0) >> 4) << 0; - *BITMAP_ADDR16(bitmap, y, x + 2) = ((src & 0x0f00) >> 8) << 0; - *BITMAP_ADDR16(bitmap, y, x + 3) = ((src & 0xf000) >> 12) << 0; + bitmap.pix16(y, x ) = ((src & 0x000f) >> 0) << 0; + bitmap.pix16(y, x + 1) = ((src & 0x00f0) >> 4) << 0; + bitmap.pix16(y, x + 2) = ((src & 0x0f00) >> 8) << 0; + bitmap.pix16(y, x + 3) = ((src & 0xf000) >> 12) << 0; b++; } } -if (!screen->machine().input().code_pressed(KEYCODE_O)) +if (!screen.machine().input().code_pressed(KEYCODE_O)) if ((hd63484_regs_r(hd63484, 0x06/2, 0xffff) & 0x0300) == 0x0300) { int sy = (hd63484_regs_r(hd63484, 0x94/2, 0xffff) & 0x0fff) - (hd63484_regs_r(hd63484, 0x88/2, 0xffff) >> 8); @@ -210,10 +210,10 @@ if (x <= w && x + sx >= 0 && x + sx < (hd63484_regs_r(hd63484, 0xca/2, 0xffff) & 0x0fff) * 4) { - *BITMAP_ADDR16(bitmap, y, x + sx ) = ((src & 0x000f) >> 0) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 1) = ((src & 0x00f0) >> 4) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 2) = ((src & 0x0f00) >> 8) << 0; - *BITMAP_ADDR16(bitmap, y, x + sx + 3) = ((src & 0xf000) >> 12) << 0; + bitmap.pix16(y, x + sx ) = ((src & 0x000f) >> 0) << 0; + bitmap.pix16(y, x + sx + 1) = ((src & 0x00f0) >> 4) << 0; + bitmap.pix16(y, x + sx + 2) = ((src & 0x0f00) >> 8) << 0; + bitmap.pix16(y, x + sx + 3) = ((src & 0xf000) >> 12) << 0; } b++; } @@ -594,10 +594,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024, 1024) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 384-1) - MCFG_SCREEN_UPDATE(jwildb52) + MCFG_SCREEN_UPDATE_STATIC(jwildb52) MCFG_HD63484_ADD("hd63484", jwildb52_hd63484_intf) diff -Nru mame-0.144/src/mame/drivers/sigmab98.c mame-0.145/src/mame/drivers/sigmab98.c --- mame-0.144/src/mame/drivers/sigmab98.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/sigmab98.c 2012-02-06 21:30:41.000000000 +0000 @@ -88,7 +88,6 @@ *************************************************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/okim9810.h" #include "sound/ymz280b.h" @@ -101,7 +100,9 @@ { public: sigmab98_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_spriteram; size_t m_spriteram_size; @@ -116,6 +117,11 @@ UINT8 m_vblank; UINT8 m_out[3]; UINT8 *m_nvram; + + required_device m_maincpu; + UINT8 m_vblank_vector; + UINT8 m_timer0_vector; + UINT8 m_timer1_vector; }; @@ -161,7 +167,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri_mask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri_mask) { sigmab98_state *state = machine.driver_data(); UINT8 *end = state->m_spriteram - 0x10; @@ -243,29 +249,29 @@ } } -static SCREEN_UPDATE(sigmab98) +static SCREEN_UPDATE_IND16(sigmab98) { int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_R)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_R)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // Draw from priority 3 (bottom, converted to a bitmask) to priority 0 (top) - draw_sprites(screen->machine(), bitmap, cliprect, layers_ctrl & 8); - draw_sprites(screen->machine(), bitmap, cliprect, layers_ctrl & 4); - draw_sprites(screen->machine(), bitmap, cliprect, layers_ctrl & 2); - draw_sprites(screen->machine(), bitmap, cliprect, layers_ctrl & 1); + draw_sprites(screen.machine(), bitmap, cliprect, layers_ctrl & 8); + draw_sprites(screen.machine(), bitmap, cliprect, layers_ctrl & 4); + draw_sprites(screen.machine(), bitmap, cliprect, layers_ctrl & 2); + draw_sprites(screen.machine(), bitmap, cliprect, layers_ctrl & 1); return 0; } @@ -632,10 +638,14 @@ state->m_vblank = (state->m_vblank & ~0x03) | (data & 0x03); } -static SCREEN_EOF( sammymdl ) +static SCREEN_VBLANK( sammymdl ) { - sigmab98_state *state = machine.driver_data(); - state->m_vblank &= ~0x01; + // rising edge + if (vblank_on) + { + sigmab98_state *state = screen.machine().driver_data(); + state->m_vblank &= ~0x01; + } } static void show_3_outputs(sigmab98_state *state) @@ -1678,10 +1688,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) // ? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x200, 0x200) MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0,0xf0-1) - MCFG_SCREEN_UPDATE(sigmab98) + MCFG_SCREEN_UPDATE_STATIC(sigmab98) MCFG_GFXDECODE(sigmab98) MCFG_PALETTE_LENGTH(0x100) @@ -1733,11 +1742,10 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xf0-1) - MCFG_SCREEN_UPDATE(sigmab98) - MCFG_SCREEN_EOF(sammymdl) + MCFG_SCREEN_UPDATE_STATIC(sigmab98) + MCFG_SCREEN_VBLANK_STATIC(sammymdl) MCFG_GFXDECODE(sigmab98) MCFG_PALETTE_LENGTH(0x100) @@ -1755,87 +1763,48 @@ Animal Catch ***************************************************************************/ -static INTERRUPT_GEN( animalc ) +static TIMER_DEVICE_CALLBACK( sammymd1_irq ) { - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x00); // increment counter - break; + sigmab98_state *state = timer.machine().driver_data(); + int scanline = param; - case 1: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1c); // read hopper state - break; + if(scanline == 240) + device_set_input_line_and_vector(state->m_maincpu,0,HOLD_LINE, state->m_vblank_vector); - case 2: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1e); // drive hopper motor - break; - } + if(scanline == 128) + device_set_input_line_and_vector(state->m_maincpu,0,HOLD_LINE, state->m_timer0_vector); + + if(scanline == 32) + device_set_input_line_and_vector(state->m_maincpu,0,HOLD_LINE, state->m_timer1_vector); } static MACHINE_CONFIG_DERIVED( animalc, sammymdl ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( animalc_map ) MCFG_CPU_IO_MAP( animalc_io ) - MCFG_CPU_VBLANK_INT_HACK(animalc, 3) // IM 2 needs a vector on the data bus + MCFG_TIMER_ADD_SCANLINE("scantimer", sammymd1_irq, "screen", 0, 1) MACHINE_CONFIG_END /*************************************************************************** Hae Hae Ka Ka Ka ***************************************************************************/ -static INTERRUPT_GEN( haekaka ) -{ - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x04); - break; - - case 1: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1a); - break; - - case 2: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x1c); - break; - } -} - static MACHINE_CONFIG_DERIVED( haekaka, sammymdl ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( haekaka_map ) MCFG_CPU_IO_MAP( haekaka_io ) - MCFG_CPU_VBLANK_INT_HACK(haekaka, 3) // IM 2 needs a vector on the data bus + MCFG_TIMER_ADD_SCANLINE("scantimer", sammymd1_irq, "screen", 0, 1) MACHINE_CONFIG_END /*************************************************************************** Itazura Monkey ***************************************************************************/ -static INTERRUPT_GEN( itazuram ) -{ - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x00); // sprites - break; - - case 1: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x02); // copy palette - break; - - case 2: - device_set_input_line_and_vector(device, 0, HOLD_LINE, 0x16); // hopper, i/o - break; - } -} - static MACHINE_CONFIG_DERIVED( itazuram, sammymdl ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( itazuram_map ) MCFG_CPU_IO_MAP( itazuram_io ) - MCFG_CPU_VBLANK_INT_HACK(itazuram, 3) // IM 2 needs a vector on the data bus + MCFG_TIMER_ADD_SCANLINE("scantimer", sammymd1_irq, "screen", 0, 1) MACHINE_CONFIG_END /*************************************************************************** @@ -1846,7 +1815,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( haekaka_map ) MCFG_CPU_IO_MAP( pyenaget_io ) - MCFG_CPU_VBLANK_INT_HACK(haekaka, 3) // IM 2 needs a vector on the data bus + MCFG_TIMER_ADD_SCANLINE("scantimer", sammymd1_irq, "screen", 0, 1) MACHINE_CONFIG_END /*************************************************************************** @@ -1857,7 +1826,7 @@ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP( tdoboon_map ) MCFG_CPU_IO_MAP( tdoboon_io ) - MCFG_CPU_VBLANK_INT_HACK(haekaka, 3) // IM 2 needs a vector on the data bus + MCFG_TIMER_ADD_SCANLINE("scantimer", sammymd1_irq, "screen", 0, 1) MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0,0x140-1, 0+4,0xf0+4-1) @@ -2142,6 +2111,10 @@ state->m_spriteram_size = 0x1000; memory_configure_bank(machine, "sprbank", 0, 5, state->m_spriteram, 0x1000); memory_set_bank(machine, "sprbank", 0); + + state->m_vblank_vector = 0x00; // increment counter + state->m_timer0_vector = 0x1c; // read hopper state + state->m_timer1_vector = 0x1e; // drive hopper motor } /*************************************************************************** @@ -2186,6 +2159,10 @@ state->m_spriteram_size = 0x1000; memory_set_bankptr(machine, "sprbank0", state->m_spriteram + 0x1000*4); // scratch memory_set_bankptr(machine, "sprbank1", state->m_spriteram + 0x1000*4); // scratch + + state->m_vblank_vector = 0x00; + state->m_timer0_vector = 0x02; + state->m_timer1_vector = 0x16; } /*************************************************************************** @@ -2295,6 +2272,10 @@ state->m_rombank = 0x65; state->m_rambank = 0x53; + + state->m_vblank_vector = 0x04; + state->m_timer0_vector = 0x1a; + state->m_timer1_vector = 0x1c; } diff -Nru mame-0.144/src/mame/drivers/silkroad.c mame-0.145/src/mame/drivers/silkroad.c --- mame-0.144/src/mame/drivers/silkroad.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/silkroad.c 2012-02-06 21:30:40.000000000 +0000 @@ -289,10 +289,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(6*8+2, 64*8-1-(10*8)-2, 2*8, 32*8-1-(2*8)) - MCFG_SCREEN_UPDATE(silkroad) + MCFG_SCREEN_UPDATE_STATIC(silkroad) MCFG_GFXDECODE(silkroad) MCFG_PALETTE_LENGTH(0x2000) diff -Nru mame-0.144/src/mame/drivers/simpl156.c mame-0.145/src/mame/drivers/simpl156.c --- mame-0.144/src/mame/drivers/simpl156.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/simpl156.c 2012-02-06 21:30:42.000000000 +0000 @@ -443,10 +443,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(800)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(simpl156) + MCFG_SCREEN_UPDATE_STATIC(simpl156) MCFG_PALETTE_LENGTH(4096) MCFG_GFXDECODE(simpl156) diff -Nru mame-0.144/src/mame/drivers/simpsons.c mame-0.145/src/mame/drivers/simpsons.c --- mame-0.144/src/mame/drivers/simpsons.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/simpsons.c 2012-02-06 21:30:34.000000000 +0000 @@ -327,10 +327,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1856) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(simpsons) + MCFG_SCREEN_UPDATE_STATIC(simpsons) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/skeetsht.c mame-0.145/src/mame/drivers/skeetsht.c --- mame-0.144/src/mame/drivers/skeetsht.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/skeetsht.c 2012-02-06 21:30:41.000000000 +0000 @@ -58,12 +58,12 @@ { } -static void skeetsht_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void skeetsht_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { skeetsht_state *state = screen.machine().driver_data(); const rgb_t *const pens = tlc34076_get_pens(screen.machine().device("tlc34076")); UINT16 *vram = &state->m_tms_vram[(params->rowaddr << 8) & 0x3ff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); int coladdr = params->coladdr; int x; @@ -232,7 +232,8 @@ "screen", /* the screen operated on */ 48000000 / 8, /* pixel clock */ 1, /* pixels per clock */ - skeetsht_scanline_update, /* scanline updater */ + NULL, /* scanline updater (indexed16) */ + skeetsht_scanline_update, /* scanline updater (rgb32) */ skeetsht_tms_irq, /* generate interrupt */ NULL, /* write to shiftreg function */ NULL /* read from shiftreg function */ @@ -262,9 +263,8 @@ MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(48000000 / 8, 156*4, 0, 100*4, 328, 0, 300) // FIXME - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) MCFG_VIDEO_START(skeetsht) diff -Nru mame-0.144/src/mame/drivers/skimaxx.c mame-0.145/src/mame/drivers/skimaxx.c --- mame-0.144/src/mame/drivers/skimaxx.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/skimaxx.c 2012-02-06 21:30:37.000000000 +0000 @@ -137,11 +137,11 @@ memory_configure_bank(machine, "bank1", 1, 1, state->m_bg_buffer_front, 0); } -static SCREEN_UPDATE( skimaxx ) +static SCREEN_UPDATE_IND16( skimaxx ) { -// popmessage("%02x %02x", input_port_read(screen->machine(), "X"), input_port_read(screen->machine(), "Y") ); +// popmessage("%02x %02x", input_port_read(screen.machine(), "X"), input_port_read(screen.machine(), "Y") ); - SCREEN_UPDATE_CALL(tms340x0); + SCREEN_UPDATE16_CALL(tms340x0_ind16); return 0; } @@ -172,7 +172,7 @@ * *************************************/ -static void skimaxx_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void skimaxx_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { skimaxx_state *state = screen.machine().driver_data(); // TODO: This isn't correct. I just hacked it together quickly so I could see something! @@ -182,7 +182,7 @@ UINT32 rowaddr = (params->rowaddr - 0x220); UINT16 *fg = &state->m_fg_buffer[rowaddr << 8]; UINT32 *bg = &state->m_bg_buffer_front[rowaddr/2 * 1024/2]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); //int coladdr = params->coladdr; int x; //coladdr = 0; @@ -486,7 +486,8 @@ "screen", /* the screen operated on */ 50000000/8, /* pixel clock */ 2, /* pixels per clock */ - skimaxx_scanline_update, /* scanline updater */ + skimaxx_scanline_update, /* scanline updater (indexed16) */ + NULL, /* scanline updater (rgb32) */ skimaxx_tms_irq, /* generate interrupt */ skimaxx_to_shiftreg, /* write to shiftreg function */ skimaxx_from_shiftreg /* read from shiftreg function */ @@ -526,14 +527,13 @@ MCFG_CPU_PROGRAM_MAP(tms_program_map) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) // MCFG_SCREEN_RAW_PARAMS(40000000/4, 156*4, 0, 100*4, 328, 0, 300) // TODO - Wrong but TMS overrides it anyway MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) MCFG_SCREEN_SIZE(0x400, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x280-1, 0, 0xf0-1) -// MCFG_SCREEN_UPDATE(tms340x0) - MCFG_SCREEN_UPDATE(skimaxx) +// MCFG_SCREEN_UPDATE_STATIC(tms340x0_ind16) + MCFG_SCREEN_UPDATE_STATIC(skimaxx) MCFG_VIDEO_START(skimaxx) diff -Nru mame-0.144/src/mame/drivers/skullxbo.c mame-0.145/src/mame/drivers/skullxbo.c --- mame-0.144/src/mame/drivers/skullxbo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/skullxbo.c 2012-02-06 21:30:37.000000000 +0000 @@ -271,11 +271,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses an SOS-2 chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz, 456*2, 0, 336*2, 262, 0, 240) - MCFG_SCREEN_UPDATE(skullxbo) + MCFG_SCREEN_UPDATE_STATIC(skullxbo) MCFG_VIDEO_START(skullxbo) diff -Nru mame-0.144/src/mame/drivers/skyarmy.c mame-0.145/src/mame/drivers/skyarmy.c --- mame-0.144/src/mame/drivers/skyarmy.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/skyarmy.c 2012-02-06 21:30:38.000000000 +0000 @@ -67,7 +67,7 @@ skyarmy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( skyarmy_colorram_w ) @@ -75,7 +75,7 @@ skyarmy_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } static PALETTE_INIT( skyarmy ) @@ -111,21 +111,21 @@ skyarmy_state *state = machine.driver_data(); state->m_tilemap = tilemap_create(machine, get_skyarmy_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_tilemap,32); + state->m_tilemap->set_scroll_cols(32); } -static SCREEN_UPDATE( skyarmy ) +static SCREEN_UPDATE_IND16( skyarmy ) { - skyarmy_state *state = screen->machine().driver_data(); + skyarmy_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int sx, sy, flipx, flipy, offs,pal; int i; for(i=0;i<0x20;i++) - tilemap_set_scrolly( state->m_tilemap,i,state->m_scrollram[i]); + state->m_tilemap->set_scrolly(i,state->m_scrollram[i]); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); for (offs = 0 ; offs < 0x40; offs+=4) { @@ -136,7 +136,7 @@ flipy = (spriteram[offs+1]&0x80)>>7; flipx = (spriteram[offs+1]&0x40)>>6; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], spriteram[offs+1]&0x3f, pal, flipx,flipy, @@ -283,10 +283,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8,32*8) MCFG_SCREEN_VISIBLE_AREA(0*8,32*8-1,1*8,31*8-1) - MCFG_SCREEN_UPDATE(skyarmy) + MCFG_SCREEN_UPDATE_STATIC(skyarmy) MCFG_GFXDECODE(skyarmy) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/skydiver.c mame-0.145/src/mame/drivers/skydiver.c --- mame-0.144/src/mame/drivers/skydiver.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/skydiver.c 2012-02-06 21:30:39.000000000 +0000 @@ -88,7 +88,6 @@ #include "emu.h" #include "cpu/m6800/m6800.h" -#include "deprecat.h" #include "includes/skydiver.h" #include "sound/discrete.h" @@ -377,7 +376,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800,MASTER_CLOCK/16) /* ???? */ MCFG_CPU_PROGRAM_MAP(skydiver_map) - MCFG_CPU_VBLANK_INT_HACK(skydiver_interrupt, 5) + MCFG_CPU_PERIODIC_INT(skydiver_interrupt, 5*60) MCFG_WATCHDOG_VBLANK_INIT(8) // 128V clocks the same as VBLANK MCFG_MACHINE_RESET(skydiver) @@ -386,10 +385,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(skydiver) + MCFG_SCREEN_UPDATE_STATIC(skydiver) MCFG_GFXDECODE(skydiver) MCFG_PALETTE_LENGTH(sizeof(colortable_source) / sizeof(colortable_source[0])) diff -Nru mame-0.144/src/mame/drivers/skyfox.c mame-0.145/src/mame/drivers/skyfox.c --- mame-0.144/src/mame/drivers/skyfox.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/skyfox.c 2012-02-06 21:30:40.000000000 +0000 @@ -255,10 +255,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(62.65) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0+0x60, 320-1+0x60, 0+16, 256-1-16) // from $30*2 to $CC*2+8 - MCFG_SCREEN_UPDATE(skyfox) + MCFG_SCREEN_UPDATE_STATIC(skyfox) MCFG_GFXDECODE(skyfox) MCFG_PALETTE_LENGTH(256+256) /* 256 static colors (+256 for the background??) */ diff -Nru mame-0.144/src/mame/drivers/skykid.c mame-0.145/src/mame/drivers/skykid.c --- mame-0.144/src/mame/drivers/skykid.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/skykid.c 2012-02-06 21:30:40.000000000 +0000 @@ -76,16 +76,18 @@ static WRITE8_HANDLER( skykid_irq_1_ctrl_w ) { + skykid_state *state = space->machine().driver_data(); int bit = !BIT(offset,11); - cpu_interrupt_enable(space->machine().device("maincpu"), bit); + state->m_main_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } static WRITE8_HANDLER( skykid_irq_2_ctrl_w ) { + skykid_state *state = space->machine().driver_data(); int bit = !BIT(offset,13); - cpu_interrupt_enable(space->machine().device("mcu"), bit); + state->m_mcu_irq_mask = bit; if (!bit) cputag_set_input_line(space->machine(), "mcu", 0, CLEAR_LINE); } @@ -425,6 +427,22 @@ 0 /* stereo */ }; +static INTERRUPT_GEN( main_vblank_irq ) +{ + skykid_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} + + +static INTERRUPT_GEN( mcu_vblank_irq ) +{ + skykid_state *state = device->machine().driver_data(); + + if(state->m_mcu_irq_mask) + device_set_input_line(device, 0, ASSERT_LINE); +} static MACHINE_CONFIG_START( skykid, skykid_state ) @@ -432,12 +450,12 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809,49152000/32) MCFG_CPU_PROGRAM_MAP(skykid_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", main_vblank_irq) MCFG_CPU_ADD("mcu", HD63701,49152000/8) /* or compatible 6808 with extra instructions */ MCFG_CPU_PROGRAM_MAP(mcu_map) MCFG_CPU_IO_MAP(mcu_port_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", mcu_vblank_irq) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* we need heavy synch */ @@ -447,10 +465,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(skykid) + MCFG_SCREEN_UPDATE_STATIC(skykid) MCFG_GFXDECODE(skykid) MCFG_PALETTE_LENGTH(64*4+128*4+64*8) diff -Nru mame-0.144/src/mame/drivers/skylncr.c mame-0.145/src/mame/drivers/skylncr.c --- mame-0.144/src/mame/drivers/skylncr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/skylncr.c 2012-02-06 21:30:40.000000000 +0000 @@ -78,14 +78,14 @@ { skylncr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); } static WRITE8_HANDLER( skylncr_colorram_w ) { skylncr_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); } @@ -136,45 +136,45 @@ state->m_reel_3_tilemap = tilemap_create(machine, get_reel_3_tile_info, tilemap_scan_rows, 8, 32, 64, 8 ); state->m_reel_4_tilemap = tilemap_create(machine, get_reel_4_tile_info, tilemap_scan_rows, 8, 32, 64, 8 ); - tilemap_set_scroll_cols(state->m_reel_2_tilemap, 0x40); - tilemap_set_scroll_cols(state->m_reel_3_tilemap, 0x40); - tilemap_set_scroll_cols(state->m_reel_4_tilemap, 0x40); + state->m_reel_2_tilemap->set_scroll_cols(0x40); + state->m_reel_3_tilemap->set_scroll_cols(0x40); + state->m_reel_4_tilemap->set_scroll_cols(0x40); - tilemap_set_transparent_pen(state->m_reel_2_tilemap, 0); - tilemap_set_transparent_pen(state->m_reel_3_tilemap, 0); - tilemap_set_transparent_pen(state->m_reel_4_tilemap, 0); + state->m_reel_2_tilemap->set_transparent_pen(0); + state->m_reel_3_tilemap->set_transparent_pen(0); + state->m_reel_4_tilemap->set_transparent_pen(0); - tilemap_set_transparent_pen(state->m_tmap, 0); + state->m_tmap->set_transparent_pen(0); } -// are these hardcoded, or registers? -static const rectangle visible1 = { 0*8, (20+48)*8-1, 4*8, (4+7)*8-1 }; -static const rectangle visible2 = { 0*8, (20+48)*8-1, 12*8, (12+7)*8-1 }; -static const rectangle visible3 = { 0*8, (20+48)*8-1, 20*8, (20+7)*8-1 }; - -static SCREEN_UPDATE( skylncr ) +static SCREEN_UPDATE_IND16( skylncr ) { - skylncr_state *state = screen->machine().driver_data(); + skylncr_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect, state->m_reel_1_tilemap, 0, 0); + bitmap.fill(0, cliprect); + state->m_reel_1_tilemap->draw(bitmap, cliprect, 0, 0); + + // are these hardcoded, or registers? + const rectangle visible1(0*8, (20+48)*8-1, 4*8, (4+7)*8-1); + const rectangle visible2(0*8, (20+48)*8-1, 12*8, (12+7)*8-1); + const rectangle visible3(0*8, (20+48)*8-1, 20*8, (20+7)*8-1); for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel_2_tilemap, i, state->m_reelscroll2[i]); - tilemap_set_scrolly(state->m_reel_3_tilemap, i, state->m_reelscroll3[i]); - tilemap_set_scrolly(state->m_reel_4_tilemap, i, state->m_reelscroll4[i]); + state->m_reel_2_tilemap->set_scrolly(i, state->m_reelscroll2[i]); + state->m_reel_3_tilemap->set_scrolly(i, state->m_reelscroll3[i]); + state->m_reel_4_tilemap->set_scrolly(i, state->m_reelscroll4[i]); } - tilemap_draw(bitmap,&visible1,state->m_reel_2_tilemap, 0, 0); - tilemap_draw(bitmap,&visible2,state->m_reel_3_tilemap, 0, 0); - tilemap_draw(bitmap,&visible3,state->m_reel_4_tilemap, 0, 0); + state->m_reel_2_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel_3_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel_4_tilemap->draw(bitmap, visible3, 0, 0); - tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -182,56 +182,56 @@ { skylncr_state *state = space->machine().driver_data(); state->m_reeltiles_1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_1_tilemap, offset); + state->m_reel_1_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltiles_2_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltiles_2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_2_tilemap, offset); + state->m_reel_2_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltiles_3_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltiles_3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_3_tilemap, offset); + state->m_reel_3_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltiles_4_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltiles_4_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_4_tilemap, offset); + state->m_reel_4_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltileshigh_1_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltileshigh_1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_1_tilemap, offset); + state->m_reel_1_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltileshigh_2_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltileshigh_2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_2_tilemap, offset); + state->m_reel_2_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltileshigh_3_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltileshigh_3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_3_tilemap, offset); + state->m_reel_3_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( reeltileshigh_4_w ) { skylncr_state *state = space->machine().driver_data(); state->m_reeltileshigh_4_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel_4_tilemap, offset); + state->m_reel_4_tilemap->mark_tile_dirty(offset); } @@ -706,10 +706,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) - MCFG_SCREEN_UPDATE(skylncr) + MCFG_SCREEN_UPDATE_STATIC(skylncr) MCFG_GFXDECODE(skylncr) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/skyraid.c mame-0.145/src/mame/drivers/skyraid.c --- mame-0.144/src/mame/drivers/skyraid.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/skyraid.c 2012-02-06 21:30:41.000000000 +0000 @@ -231,10 +231,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(22 * 1000000 / 15750)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 240) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 239) - MCFG_SCREEN_UPDATE(skyraid) + MCFG_SCREEN_UPDATE_STATIC(skyraid) MCFG_GFXDECODE(skyraid) diff -Nru mame-0.144/src/mame/drivers/slapfght.c mame-0.145/src/mame/drivers/slapfght.c --- mame-0.144/src/mame/drivers/slapfght.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/slapfght.c 2012-02-06 21:30:37.000000000 +0000 @@ -264,7 +264,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/m6805/m6805.h" #include "sound/ay8910.h" #include "includes/slapfght.h" @@ -735,23 +734,36 @@ DEVCB_NULL }; -static SCREEN_EOF( perfrman ) +static SCREEN_VBLANK( perfrman ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram_w(space, 0, 0); + } } +static INTERRUPT_GEN( vblank_irq ) +{ + slapfght_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + + static MACHINE_CONFIG_START( perfrman, slapfght_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,16000000/4) /* 4MHz ???, 16MHz Oscillator */ MCFG_CPU_PROGRAM_MAP(perfrman_map) MCFG_CPU_IO_MAP(slapfght_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,16000000/8) /* 2MHz ???, 16MHz Oscillator */ MCFG_CPU_PROGRAM_MAP(perfrman_sound_map) - MCFG_CPU_VBLANK_INT_HACK(getstar_interrupt,4) /* music speed, verified */ + MCFG_CPU_PERIODIC_INT(getstar_interrupt,4*60) /* music speed, verified */ MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ @@ -763,11 +775,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 34*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(perfrman) - MCFG_SCREEN_EOF(perfrman) + MCFG_SCREEN_UPDATE_STATIC(perfrman) + MCFG_SCREEN_VBLANK_STATIC(perfrman) MCFG_GFXDECODE(perfrman) MCFG_PALETTE_LENGTH(256) @@ -794,7 +805,7 @@ MCFG_CPU_ADD("maincpu", Z80, 6000000) MCFG_CPU_PROGRAM_MAP(tigerh_map) MCFG_CPU_IO_MAP(tigerhb_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, 6000000) MCFG_CPU_PROGRAM_MAP(slapfght_sound_map) @@ -810,11 +821,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 36*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(slapfight) - MCFG_SCREEN_EOF(perfrman) + MCFG_SCREEN_UPDATE_STATIC(slapfight) + MCFG_SCREEN_VBLANK_STATIC(perfrman) MCFG_GFXDECODE(slapfght) MCFG_PALETTE_LENGTH(256) @@ -840,7 +850,7 @@ MCFG_CPU_ADD("maincpu", Z80, XTAL_36MHz/6) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(tigerh_map) MCFG_CPU_IO_MAP(tigerh_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_36MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(slapfght_sound_map) @@ -859,11 +869,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 36*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(slapfight) - MCFG_SCREEN_EOF(perfrman) + MCFG_SCREEN_UPDATE_STATIC(slapfight) + MCFG_SCREEN_VBLANK_STATIC(perfrman) MCFG_GFXDECODE(slapfght) MCFG_PALETTE_LENGTH(256) @@ -890,11 +899,11 @@ MCFG_CPU_ADD("maincpu",Z80, XTAL_36MHz/6) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(slapfght_map) MCFG_CPU_IO_MAP(slapfght_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_36MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(slapfght_sound_map) - MCFG_CPU_VBLANK_INT_HACK(getstar_interrupt, 3) + MCFG_CPU_PERIODIC_INT(getstar_interrupt, 3*60) MCFG_CPU_ADD("mcu", M68705, XTAL_36MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(slapfight_m68705_map) @@ -909,11 +918,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 36*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(slapfight) - MCFG_SCREEN_EOF(perfrman) + MCFG_SCREEN_UPDATE_STATIC(slapfight) + MCFG_SCREEN_VBLANK_STATIC(perfrman) MCFG_GFXDECODE(slapfght) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/slapshot.c mame-0.145/src/mame/drivers/slapshot.c --- mame-0.144/src/mame/drivers/slapshot.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/slapshot.c 2012-02-06 21:30:39.000000000 +0000 @@ -566,11 +566,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(slapshot) - MCFG_SCREEN_EOF(taito_no_buffer) + MCFG_SCREEN_UPDATE_STATIC(slapshot) + MCFG_SCREEN_VBLANK_STATIC(taito_no_buffer) MCFG_GFXDECODE(slapshot) MCFG_PALETTE_LENGTH(8192) @@ -615,11 +614,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(slapshot) - MCFG_SCREEN_EOF(taito_no_buffer) + MCFG_SCREEN_UPDATE_STATIC(slapshot) + MCFG_SCREEN_VBLANK_STATIC(taito_no_buffer) MCFG_GFXDECODE(slapshot) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/sleic.c mame-0.145/src/mame/drivers/sleic.c --- mame-0.144/src/mame/drivers/sleic.c 2012-01-13 15:34:51.000000000 +0000 +++ mame-0.145/src/mame/drivers/sleic.c 2012-02-06 21:30:36.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i86/i86.h" @@ -5,11 +7,21 @@ { public: sleic_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( sleic_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( sleic_map, AS_PROGRAM, 8, sleic_state ) AM_RANGE(0x0000, 0xffff) AM_NOP AM_RANGE(0x00000, 0x1ffff) AM_RAM AM_RANGE(0xe0000, 0xfffff) AM_ROM @@ -18,7 +30,7 @@ static INPUT_PORTS_START( sleic ) INPUT_PORTS_END -static MACHINE_RESET( sleic ) +void sleic_state::machine_reset() { } @@ -30,8 +42,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8088, 8000000) MCFG_CPU_PROGRAM_MAP(sleic_map) - - MCFG_MACHINE_RESET( sleic ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -52,14 +62,15 @@ ROM_START(sleicpin) ROM_REGION(0x100000, "maincpu", 0) ROM_LOAD("sp03-1_1.rom", 0xe0000, 0x20000, CRC(261b0ae4) SHA1(e7d9d1c2cab7776afb732701b0b8697b62a8d990)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sp01-1_1.rom", 0x0000, 0x2000, CRC(240015bb) SHA1(0e647718173ad59dafbf3b5bc84bef3c33886e23)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("sp04-1_1.rom", 0x0000, 0x8000, CRC(84514cfa) SHA1(6aa87b86892afa534cf963821f08286c126b4245)) + ROM_REGION(0x100000, "user1", 0) ROM_LOAD("sp02-1_1.rom", 0x00000, 0x80000, CRC(0e4851a0) SHA1(0692ee2df0b560e2013db9c03fd27c6eb12e618d)) ROM_END -GAME(1993, sleicpin, 0, sleic, sleic, sleic, ROT0, "Sleic", "Sleic Pin Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - - +GAME(1993, sleicpin, 0, sleic, sleic, sleic, ROT0, "Sleic", "Sleic Pin Ball", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/sliver.c mame-0.145/src/mame/drivers/sliver.c --- mame-0.144/src/mame/drivers/sliver.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sliver.c 2012-02-06 21:30:39.000000000 +0000 @@ -6,12 +6,10 @@ The background images on this hardware are in JPEG format, the Zoran chips are hardware JPEG decompression chips. -Driver (temporary) uses fake rom with decompressed images (gfx.bin) TODO: - verify OKI rom banking (bank num inverted or not) - DIPS -- add jpeg decompression - fix transparency problems in some stages @@ -66,189 +64,70 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/okim6295.h" #include "cpu/mcs51/mcs51.h" +#include "video/ramdac.h" +#include "../../lib/libjpeg/jpeglib.h" + #define FIFO_SIZE 1024 #define IO_SIZE 0x100 #define COMMAND_SIZE 8 #define x_offset 0x45 -#define y_offset 0x0d +#define y_offset 0xe class sliver_state : public driver_device { public: sliver_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } UINT16 m_io_offset; UINT16 m_io_reg[IO_SIZE]; UINT16 m_fifo[FIFO_SIZE]; UINT16 m_fptr; - int m_jpeg_addr; UINT16 m_jpeg1; UINT16 m_jpeg2; - int m_jpeg_h; - int m_jpeg_w; int m_jpeg_x; int m_jpeg_y; int m_tmp_counter; int m_clr_offset; UINT8 *m_colorram; - bitmap_t *m_bitmap_fg; - bitmap_t *m_bitmap_bg; + bitmap_rgb32 m_bitmap_fg; + bitmap_rgb32 m_bitmap_bg; UINT16 m_tempbuf[8]; -}; -static const int gfxlookup[][4]= -{ - { 0x0000000, 0x0000000, 512, 256 }, - { 0x0060000, 0x0007fa5, 512, 256 }, - { 0x00c0000, 0x0008c04, 512, 512 }, - { 0x0180000, 0x001642b, 512, 512 }, - { 0x0240000, 0x00240fb, 512, 512 }, - { 0x0300000, 0x0033494, 512, 256 }, - { 0x0360000, 0x003ad9a, 512, 256 }, - { 0x03c0000, 0x003cab3, 512, 256 }, - { 0x0420000, 0x003e50c, 512, 256 }, - { 0x0480000, 0x003fd94, 512, 256 }, - { 0x04e0000, 0x004166e, 512, 256 }, - { 0x0540000, 0x004306a, 512, 256 }, - { 0x05a0000, 0x0044c65, 512, 256 }, - { 0x0600000, 0x0046aeb, 512, 256 }, - { 0x0660000, 0x0048a86, 512, 512 }, - { 0x0720000, 0x00527c7, 512, 512 }, - { 0x07e0000, 0x005a789, 512, 256 }, - { 0x0840000, 0x005f9b0, 512, 256 }, - { 0x08a0000, 0x0065621, 512, 512 }, - { 0x0960000, 0x006fbd6, 512, 512 }, - { 0x0a20000, 0x0077b98, 512, 512 }, - { 0x0ae0000, 0x007fa6e, 512, 512 }, - { 0x0ba0000, 0x0087a42, 512, 512 }, - { 0x0c60000, 0x008f996, 512, 256 }, - { 0x0cc0000, 0x0094b82, 512, 512 }, - { 0x0d80000, 0x009e27a, 512, 512 }, - { 0x0e40000, 0x00a6157, 512, 256 }, - { 0x0ea0000, 0x00ab417, 512, 512 }, - { 0x0f60000, 0x00b33c1, 512, 512 }, - { 0x1020000, 0x00bd7f1, 512, 256 }, - { 0x1080000, 0x00c1679, 512, 512 }, - { 0x1140000, 0x00cbc8a, 512, 256 }, - { 0x11a0000, 0x00d0ee2, 512, 256 }, - { 0x1200000, 0x00d4d76, 512, 256 }, - { 0x1260000, 0x00d8a4f, 512, 256 }, - { 0x12c0000, 0x00dc980, 512, 256 }, - { 0x1320000, 0x00e07ba, 512, 256 }, - { 0x1380000, 0x00e45a2, 512, 256 }, - { 0x13e0000, 0x00e842e, 512, 256 }, - { 0x1440000, 0x00ec0db, 512, 256 }, - { 0x14a0000, 0x00efdae, 512, 256 }, - { 0x1500000, 0x00f3c99, 512, 256 }, - { 0x1560000, 0x00f794f, 512, 256 }, - { 0x15c0000, 0x00fb5db, 512, 256 }, - { 0x1620000, 0x00ff2e6, 512, 256 }, - { 0x1680000, 0x0103156, 512, 256 }, - { 0x16e0000, 0x0106fcf, 512, 256 }, - { 0x1740000, 0x010ae0c, 512, 256 }, - { 0x17a0000, 0x010edaf, 512, 256 }, - { 0x1800000, 0x0112bac, 512, 256 }, - { 0x1860000, 0x01169c1, 128, 128 }, - { 0x186c000, 0x0119b95, 128, 128 }, - { 0x1878000, 0x011d0dc, 128, 128 }, - { 0x1884000, 0x01205ca, 128, 128 }, - { 0x1890000, 0x01236b2, 128, 128 }, - { 0x189c000, 0x01268ff, 128, 128 }, - { 0x18a8000, 0x0129bef, 128, 128 }, - { 0x18b4000, 0x012cf51, 128, 128 }, - { 0x18c0000, 0x0130331, 128, 128 }, - { 0x18cc000, 0x013370d, 128, 128 }, - { 0x18d8000, 0x0136a80, 128, 128 }, - { 0x18e4000, 0x0139d2a, 128, 128 }, - { 0x18f0000, 0x013ce39, 128, 128 }, - { 0x18fc000, 0x0140236, 128, 128 }, - { 0x1908000, 0x0143701, 128, 128 }, - { 0x1914000, 0x0146cb3, 128, 128 }, - { 0x1920000, 0x014a40d, 128, 128 }, - { 0x192c000, 0x014da18, 128, 128 }, - { 0x1938000, 0x0150ea4, 512, 256 }, - { 0x1998000, 0x0154e17, 512, 256 }, - { 0x19f8000, 0x0158ddf, 512, 256 }, - { 0x1a58000, 0x015cd80, 512, 256 }, - { 0x1ab8000, 0x0160d5b, 512, 256 }, - { 0x1b18000, 0x0164d2f, 512, 256 }, - { 0x1b78000, 0x017b5db, 512, 256 }, - { 0x1bd8000, 0x017f2e6, 512, 256 }, - { -1,-1,-1,-1} + required_device m_maincpu; }; -static WRITE16_HANDLER( sliver_RAMDAC_offset_w ) -{ - sliver_state *state = space->machine().driver_data(); - - state->m_clr_offset=data*3; -} - -static WRITE16_HANDLER( sliver_RAMDAC_color_w ) -{ - sliver_state *state = space->machine().driver_data(); - - state->m_colorram[state->m_clr_offset]=data; - state->m_clr_offset=(state->m_clr_offset+1)%768; -} - static void plot_pixel_rgb(sliver_state *state, int x, int y, UINT32 r, UINT32 g, UINT32 b) { - UINT16 color; +// printf("plot %d %d %d\n", r,g,b); if (y < 0 || x < 0 || x > 383 || y > 255) return; - if (state->m_bitmap_bg->bpp == 32) - { - *BITMAP_ADDR32(state->m_bitmap_bg, y, x) = r | (g<<8) | (b<<16); - } - else - { - r>>=3; - g>>=3; - b>>=3; - color = r|(g<<5)|(b<<10); - *BITMAP_ADDR16(state->m_bitmap_bg, y, x) = color; - } + state->m_bitmap_bg.pix32(y, x) = r | (g<<8) | (b<<16); } static void plot_pixel_pal(running_machine &machine, int x, int y, int addr) { sliver_state *state = machine.driver_data(); UINT32 r,g,b; - UINT16 color; if (y < 0 || x < 0 || x > 383 || y > 255) return; - addr*=3; - - b=state->m_colorram[addr] << 2; - g=state->m_colorram[addr+1] << 2; - r=state->m_colorram[addr+2] << 2; + b=(state->m_colorram[addr] << 2) | (state->m_colorram[addr] & 0x3); + g=(state->m_colorram[addr+0x100] << 2) | (state->m_colorram[addr+0x100] & 3); + r=(state->m_colorram[addr+0x200] << 2) | (state->m_colorram[addr+0x200] & 3); - if (state->m_bitmap_fg->bpp == 32) - { - - *BITMAP_ADDR32(state->m_bitmap_fg, y, x) = r | (g<<8) | (b<<16); - } - else - { - r>>=3; - g>>=3; - b>>=3; - color = r|(g<<5)|(b<<10); - *BITMAP_ADDR16(state->m_bitmap_fg, y, x) = color; - } + state->m_bitmap_fg.pix32(y, x) = r | (g<<8) | (b<<16); } static WRITE16_HANDLER( fifo_data_w ) @@ -312,7 +191,7 @@ { sliver_state *state = space->machine().driver_data(); - bitmap_fill(state->m_bitmap_fg, 0,0); + state->m_bitmap_fg.fill(0); state->m_fptr=0; state->m_tmp_counter=0; } @@ -333,60 +212,68 @@ static void render_jpeg(running_machine &machine) { sliver_state *state = machine.driver_data(); - int x, y; - int addr = state->m_jpeg_addr; - UINT8 *rom; + int x; + int addr = (int)state->m_jpeg2 + (((int)state->m_jpeg1) << 16); - bitmap_fill(state->m_bitmap_bg, 0, 0); + state->m_bitmap_bg.fill(0); if (addr < 0) { return; } - rom = machine.region("user3")->base(); - for (y = 0; y < state->m_jpeg_h; y++) - { - for (x = 0; x < state->m_jpeg_w; x++) - { - plot_pixel_rgb(state, x - x_offset + state->m_jpeg_x, state->m_jpeg_h - y - y_offset - state->m_jpeg_y, rom[addr], rom[addr + 1], rom[addr + 2]); - addr+=3; - } - } -} + //printf("access address %04x\n", addr); -static int find_data(int offset) -{ - int idx = 0; - while (gfxlookup[idx][0] >= 0) + /* Access libJPEG */ { - if (offset == gfxlookup[idx][1]) + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + JSAMPARRAY buffer; + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + + jpeg_mem_src(&cinfo, machine.region("user2")->base()+addr, machine.region("user2")->bytes()-addr); + + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + + int row_stride = cinfo.output_width * cinfo.output_components; + + buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + while (cinfo.output_scanline < cinfo.output_height) { - return idx; + jpeg_read_scanlines(&cinfo, buffer, 1); + int y = cinfo.output_scanline; + + for (x = 0; x < row_stride/3; x++) + { + UINT8 b = buffer[0][(x*3)]; + UINT8 g = buffer[0][(x*3)+1]; + UINT8 r = buffer[0][(x*3)+2]; + plot_pixel_rgb(state, x - x_offset + state->m_jpeg_x, y - y_offset - state->m_jpeg_y, r, g, b); + + } + } - ++idx; + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + + } - return -1; + } static WRITE16_HANDLER( jpeg2_w ) { sliver_state *state = space->machine().driver_data(); - int idx; COMBINE_DATA(&state->m_jpeg2); - idx = find_data((int)state->m_jpeg2 + (((int)state->m_jpeg1) << 16)); - if (idx >= 0) - { - state->m_jpeg_addr = gfxlookup[idx][0]; - state->m_jpeg_w = gfxlookup[idx][2]; - state->m_jpeg_h = gfxlookup[idx][3]; - render_jpeg(space->machine()); - } - else - { - state->m_jpeg_addr = -1; - } + render_jpeg(space->machine()); + } static WRITE16_HANDLER(io_offset_w) @@ -430,9 +317,9 @@ static ADDRESS_MAP_START( sliver_map, AS_PROGRAM, 16 ) AM_RANGE(0x000000, 0x0fffff) AM_ROM - AM_RANGE(0x100000, 0x100001) AM_WRITE(sliver_RAMDAC_offset_w) - AM_RANGE(0x100002, 0x100003) AM_WRITE(sliver_RAMDAC_color_w) - AM_RANGE(0x100004, 0x100005) AM_WRITENOP//RAMDAC + AM_RANGE(0x100000, 0x100001) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, index_w, 0x00ff) + AM_RANGE(0x100002, 0x100003) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, pal_w, 0x00ff) + AM_RANGE(0x100004, 0x100005) AM_DEVWRITE8_MODERN("ramdac", ramdac_device, mask_w, 0x00ff) AM_RANGE(0x300002, 0x300003) AM_NOP // bit 0 tested, writes 0xe0 and 0xc0 - both r and w at the end of interrupt code @@ -479,13 +366,13 @@ { sliver_state *state = machine.driver_data(); - state->m_bitmap_bg = machine.primary_screen->alloc_compatible_bitmap(); - state->m_bitmap_fg = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_bitmap_fg); } -static SCREEN_UPDATE(sliver) +static SCREEN_UPDATE_RGB32(sliver) { - sliver_state *state = screen->machine().driver_data(); + sliver_state *state = screen.machine().driver_data(); copybitmap (bitmap, state->m_bitmap_bg, 0, 0, 0, 0, cliprect); copybitmap_trans(bitmap, state->m_bitmap_fg, 0, 0, 0, 0, cliprect, 0); @@ -562,30 +449,41 @@ PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END -static INTERRUPT_GEN( sliver_int ) +static ADDRESS_MAP_START( ramdac_map, AS_0, 8 ) + AM_RANGE(0x000, 0x3ff) AM_RAM AM_BASE_MEMBER(sliver_state,m_colorram) +ADDRESS_MAP_END + +static RAMDAC_INTERFACE( ramdac_intf ) { - //valid interrupts are 2,3,4 - device_set_input_line(device, 2+cpu_getiloops(device), HOLD_LINE); + 0 +}; + +static TIMER_DEVICE_CALLBACK ( obj_irq_cb ) +{ + sliver_state *state = timer.machine().driver_data(); + + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); } static MACHINE_CONFIG_START( sliver, sliver_state ) - MCFG_CPU_ADD("maincpu", M68000, 12000000) MCFG_CPU_PROGRAM_MAP(sliver_map) - MCFG_CPU_VBLANK_INT_HACK(sliver_int,3) + MCFG_CPU_VBLANK_INT("screen",irq4_line_hold) + MCFG_TIMER_ADD_PERIODIC("obj_actel", obj_irq_cb, attotime::from_hz(60)) /* unknown clock, causes "obj actel ready error" without this */ + // irq 2 valid but not used? MCFG_CPU_ADD("audiocpu", I8051, 8000000) MCFG_CPU_PROGRAM_MAP(soundmem_prg) MCFG_CPU_IO_MAP(soundmem_io) - MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 384-1-16, 0*8, 240-1) - MCFG_SCREEN_UPDATE(sliver) + MCFG_SCREEN_UPDATE_STATIC(sliver) + + MCFG_RAMDAC_ADD("ramdac", ramdac_intf, ramdac_map) MCFG_VIDEO_START(sliver) @@ -618,17 +516,6 @@ ROM_LOAD( "ka-10.bin", 0x000000, 0x80000, CRC(a6824271) SHA1(2eefa4e61491f7b72ccde744fa6f88a1a3c60c92) ) ROM_LOAD( "ka-11.bin", 0x080000, 0x80000, CRC(4ae121ff) SHA1(ece7cc07483801a0d436def977d72dc7b1a07c8f) ) ROM_LOAD( "ka-12.bin", 0x100000, 0x80000, CRC(0901e142) SHA1(68ebd38beeedf53414a831c01813881feee33446) ) - - ROM_REGION( 0x2000000, "user3", 0 ) /* decompressed GFX - temporary!*/ - ROM_LOAD( "gfx.bin", 0x000000, 0x2000000, BAD_DUMP CRC(706f264e) SHA1(dbcc8dbf30bd65d86bcde7d6db1b08af4242a253) ) ROM_END -static DRIVER_INIT(sliver) -{ - sliver_state *state = machine.driver_data(); - - state->m_jpeg_addr = -1; - state->m_colorram=auto_alloc_array(machine, UINT8, 256*3); -} - -GAME( 1996, sliver, 0, sliver, sliver, sliver, ROT0, "Hollow Corp", "Sliver", GAME_IMPERFECT_GRAPHICS ) +GAME( 1996, sliver, 0, sliver, sliver, 0, ROT0, "Hollow Corp", "Sliver", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/slotcarn.c mame-0.145/src/mame/drivers/slotcarn.c --- mame-0.144/src/mame/drivers/slotcarn.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/slotcarn.c 2012-02-06 21:30:36.000000000 +0000 @@ -140,7 +140,7 @@ col |= 0x03; col = state->m_ram_palette[col & 0x3ff]; - *BITMAP_ADDR32(bitmap, y, x) = pens[col ? col : (lscnblk ? 8 : 0)]; + bitmap.pix32(y, x) = pens[col ? col : (lscnblk ? 8 : 0)]; x++; } @@ -535,15 +535,6 @@ -static SCREEN_UPDATE( slotcarn ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - - return 0; -} - - static MACHINE_START(merit) { slotcarn_state *state = machine.driver_data(); @@ -620,9 +611,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(slotcarn) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/sms.c mame-0.145/src/mame/drivers/sms.c --- mame-0.144/src/mame/drivers/sms.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sms.c 2012-02-06 21:30:35.000000000 +0000 @@ -228,7 +228,7 @@ UINT8 m_communication_port[4]; UINT8 m_communication_port_status; - bitmap_t *m_bitmap; + bitmap_ind16 m_bitmap; UINT8 m_vid_regs[7]; }; @@ -456,7 +456,7 @@ for ( x = xstart; x < xstart + width; x++ ) { if ( y < 256 ) - *BITMAP_ADDR16(state->m_bitmap, y, x) = color; + state->m_bitmap.pix16(y, x) = color; } } } @@ -465,15 +465,15 @@ static VIDEO_START( sms ) { sms_state *state = machine.driver_data(); - state->m_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap); state_save_register_global_array(machine, state->m_vid_regs); - state_save_register_global_bitmap(machine, state->m_bitmap); + state_save_register_global_bitmap(machine, &state->m_bitmap); } -static SCREEN_UPDATE( sms ) +static SCREEN_UPDATE_IND16( sms ) { - sms_state *state = screen->machine().driver_data(); + sms_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_bitmap, 0, 0, 0, 0, cliprect); return 0; } @@ -572,10 +572,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x1b0, 0x100) MCFG_SCREEN_VISIBLE_AREA(0, 0x1af, 0, 0xff) - MCFG_SCREEN_UPDATE(sms) + MCFG_SCREEN_UPDATE_STATIC(sms) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/snesb.c mame-0.145/src/mame/drivers/snesb.c --- mame-0.144/src/mame/drivers/snesb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/snesb.c 2012-02-06 21:30:36.000000000 +0000 @@ -531,9 +531,8 @@ MCFG_VIDEO_START( snes ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(DOTCLK_NTSC, SNES_HTOTAL, 0, SNES_SCR_WIDTH, SNES_VTOTAL_NTSC, 0, SNES_SCR_HEIGHT_NTSC) - MCFG_SCREEN_UPDATE( snes ) + MCFG_SCREEN_UPDATE_STATIC( snes ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") diff -Nru mame-0.144/src/mame/drivers/snk6502.c mame-0.145/src/mame/drivers/snk6502.c --- mame-0.144/src/mame/drivers/snk6502.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/snk6502.c 2012-02-06 21:30:40.000000000 +0000 @@ -281,7 +281,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "video/mc6845.h" #include "sound/sn76477.h" @@ -446,6 +445,11 @@ * *************************************/ +static INPUT_CHANGED( coin_inserted ) +{ + cputag_set_input_line(field.machine(), "maincpu", INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE); +} + static INPUT_PORTS_START( snk6502_generic_joy8way ) PORT_START("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) @@ -468,8 +472,8 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL PORT_START("IN2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) @@ -519,7 +523,7 @@ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(snk6502_music0_r, NULL) /* music0 playing */ PORT_START("IN2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) PORT_CHANGED(coin_inserted, 0) PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* NC */ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(sasuke_count_r, NULL) /* connected to a binary counter */ @@ -741,35 +745,15 @@ static INTERRUPT_GEN( satansat_interrupt ) { - if (cpu_getiloops(device) != 0) - { - UINT8 val = input_port_read(device->machine(), "IN2"); /* TODO: use CUSTOM_INPUT */ - - coin_counter_w(device->machine(), 0, val & 1); - - /* user asks to insert coin: generate a NMI interrupt. */ - if (val & 0x01) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - else + snk6502_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) device_set_input_line(device, M6502_IRQ_LINE, HOLD_LINE); /* one IRQ per frame */ } static INTERRUPT_GEN( snk6502_interrupt ) { - if (cpu_getiloops(device) != 0) - { - UINT8 val = input_port_read(device->machine(), "IN2"); /* TODO: use CUSTOM_INPUT */ - - coin_counter_w(device->machine(), 0, val & 1); - coin_counter_w(device->machine(), 1, val & 2); - - /* user asks to insert coin: generate a NMI interrupt. */ - if (val & 0x03) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - else - device_set_input_line(device, M6502_IRQ_LINE, HOLD_LINE); /* one IRQ per frame */ + device_set_input_line(device, M6502_IRQ_LINE, HOLD_LINE); /* one IRQ per frame */ } @@ -843,7 +827,7 @@ // basic machine hardware MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK / 16) // 700 kHz MCFG_CPU_PROGRAM_MAP(sasuke_map) - MCFG_CPU_VBLANK_INT_HACK(satansat_interrupt, 2) + MCFG_CPU_VBLANK_INT("screen",satansat_interrupt) MCFG_MACHINE_RESET(sasuke) @@ -852,10 +836,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((MASTER_CLOCK / 16) / (45 * 32 * 8)) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(snk6502) + MCFG_SCREEN_UPDATE_STATIC(snk6502) MCFG_GFXDECODE(sasuke) MCFG_PALETTE_LENGTH(32) @@ -919,7 +902,7 @@ //MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK / 8) // 1.4 MHz MCFG_CPU_ADD("maincpu", M6502, 930000) // adjusted MCFG_CPU_PROGRAM_MAP(vanguard_map) - MCFG_CPU_VBLANK_INT_HACK(snk6502_interrupt, 2) + MCFG_CPU_VBLANK_INT("screen",snk6502_interrupt) MCFG_MACHINE_RESET(vanguard) @@ -928,10 +911,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE((MASTER_CLOCK / 16) / (45 * 32 * 8)) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(snk6502) + MCFG_SCREEN_UPDATE_STATIC(snk6502) MCFG_GFXDECODE(vanguard) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/snk68.c mame-0.145/src/mame/drivers/snk68.c --- mame-0.144/src/mame/drivers/snk68.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/snk68.c 2012-02-06 21:30:36.000000000 +0000 @@ -603,12 +603,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) // the screen parameters are guessed but should be accurate. They // give a theoretical refresh rate of 59.1856Hz while the measured // rate on a SAR board is 59.16Hz. MCFG_SCREEN_RAW_PARAMS(XTAL_24MHz/4, 384, 0, 256, 264, 16, 240) - MCFG_SCREEN_UPDATE(pow) + MCFG_SCREEN_UPDATE_STATIC(pow) MCFG_GFXDECODE(pow) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/snk.c mame-0.145/src/mame/drivers/snk.c --- mame-0.144/src/mame/drivers/snk.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/snk.c 2012-02-06 21:30:35.000000000 +0000 @@ -3660,10 +3660,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1) - MCFG_SCREEN_UPDATE(marvins) + MCFG_SCREEN_UPDATE_STATIC(marvins) MCFG_GFXDECODE(marvins) MCFG_PALETTE_LENGTH(0x400) @@ -3730,10 +3729,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1) - MCFG_SCREEN_UPDATE(tnk3) + MCFG_SCREEN_UPDATE_STATIC(tnk3) MCFG_GFXDECODE(tnk3) MCFG_PALETTE_LENGTH(0x400) @@ -3809,10 +3807,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1) - MCFG_SCREEN_UPDATE(tnk3) + MCFG_SCREEN_UPDATE_STATIC(tnk3) MCFG_GFXDECODE(tnk3) MCFG_PALETTE_LENGTH(0x400) @@ -3894,10 +3891,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 1*8, 28*8-1) - MCFG_SCREEN_UPDATE(ikari) + MCFG_SCREEN_UPDATE_STATIC(ikari) MCFG_GFXDECODE(ikari) MCFG_PALETTE_LENGTH(0x400) @@ -3950,11 +3946,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) // this visible area matches the psychos pcb MCFG_SCREEN_SIZE(50*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 50*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(gwar) + MCFG_SCREEN_UPDATE_STATIC(gwar) MCFG_GFXDECODE(gwar) MCFG_PALETTE_LENGTH(0x400) @@ -4056,10 +4051,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(50*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 50*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(tdfever) + MCFG_SCREEN_UPDATE_STATIC(tdfever) MCFG_GFXDECODE(tdfever) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/snookr10.c mame-0.145/src/mame/drivers/snookr10.c --- mame-0.144/src/mame/drivers/snookr10.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/snookr10.c 2012-02-06 21:30:41.000000000 +0000 @@ -701,10 +701,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(96*4, 30*8) MCFG_SCREEN_VISIBLE_AREA(0*4, 96*4-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(snookr10) + MCFG_SCREEN_UPDATE_STATIC(snookr10) MCFG_GFXDECODE(snookr10) diff -Nru mame-0.144/src/mame/drivers/snowbros.c mame-0.145/src/mame/drivers/snowbros.c --- mame-0.144/src/mame/drivers/snowbros.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/snowbros.c 2012-02-06 21:30:42.000000000 +0000 @@ -63,7 +63,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "includes/snowbros.h" #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" @@ -82,21 +81,25 @@ } -static SCREEN_UPDATE( snowbros ) +static SCREEN_UPDATE_IND16( snowbros ) { - device_t *pandora = screen->machine().device("pandora"); + device_t *pandora = screen.machine().device("pandora"); /* This clears & redraws the entire screen each pass */ - bitmap_fill(bitmap,cliprect,0xf0); + bitmap.fill(0xf0, cliprect); pandora_update(pandora, bitmap, cliprect); return 0; } -static SCREEN_EOF( snowbros ) +static SCREEN_VBLANK( snowbros ) { - device_t *pandora = machine.device("pandora"); - pandora_eof(pandora); + // rising edge + if (vblank_on) + { + device_t *pandora = screen.machine().device("pandora"); + pandora_eof(pandora); + } } @@ -116,18 +119,36 @@ cputag_set_input_line(space->machine(), "maincpu", 2, CLEAR_LINE); } -static INTERRUPT_GEN( snowbros_interrupt ) +static TIMER_DEVICE_CALLBACK( snowbros_irq ) { - device_set_input_line(device, cpu_getiloops(device) + 2, ASSERT_LINE); /* IRQs 4, 3, and 2 */ + snowbros_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, ASSERT_LINE); + + if(scanline == 128) + device_set_input_line(state->m_maincpu, 3, ASSERT_LINE); + + if(scanline == 32) + device_set_input_line(state->m_maincpu, 4, ASSERT_LINE); } -static INTERRUPT_GEN( snowbro3_interrupt ) +static TIMER_DEVICE_CALLBACK( snowbros3_irq ) { - snowbros_state *state = device->machine().driver_data(); - okim6295_device *adpcm = device->machine().device("oki"); + snowbros_state *state = timer.machine().driver_data(); + okim6295_device *adpcm = timer.machine().device("oki"); int status = adpcm->read_status(); + int scanline = param; - device_set_input_line(device, cpu_getiloops(device) + 2, ASSERT_LINE); /* IRQs 4, 3, and 2 */ + if(scanline == 240) + device_set_input_line(state->m_maincpu, 2, ASSERT_LINE); + + if(scanline == 128) + device_set_input_line(state->m_maincpu, 3, ASSERT_LINE); + + if(scanline == 32) + device_set_input_line(state->m_maincpu, 4, ASSERT_LINE); if (state->m_sb3_music_is_playing) { @@ -1430,7 +1451,7 @@ int i; for (i = 0;i < 0x200/2;i++) - state->m_hyperpac_ram[0xf000/2 + i] = PROTDATA[i]; + state->m_hyperpac_ram[0xf000/2 + i] = PROTDATA[i]; } static MACHINE_RESET (finalttr) @@ -1440,7 +1461,7 @@ int i; for (i = 0;i < 0x200/2;i++) - state->m_hyperpac_ram[0x2000/2 + i] = PROTDATA[i]; + state->m_hyperpac_ram[0x2000/2 + i] = PROTDATA[i]; } static const kaneko_pandora_interface snowbros_pandora_config = @@ -1455,7 +1476,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) /* 8 Mhz - confirmed */ MCFG_CPU_PROGRAM_MAP(snowbros_map) - MCFG_CPU_VBLANK_INT_HACK(snowbros_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", snowbros_irq, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 6000000) /* 6 MHz - confirmed */ MCFG_CPU_PROGRAM_MAP(sound_map) @@ -1465,11 +1486,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) /* ~57.5 - confirmed */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(snowbros) - MCFG_SCREEN_EOF(snowbros) + MCFG_SCREEN_UPDATE_STATIC(snowbros) + MCFG_SCREEN_VBLANK_STATIC(snowbros) MCFG_GFXDECODE(snowbros) MCFG_PALETTE_LENGTH(256) @@ -1497,8 +1517,8 @@ /* video hardware */ MCFG_GFXDECODE(wb) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(wintbob) - MCFG_SCREEN_EOF(0) + MCFG_SCREEN_UPDATE_STATIC(wintbob) + MCFG_SCREEN_VBLANK_NONE() MACHINE_CONFIG_END @@ -1566,7 +1586,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_PROGRAM_MAP(honeydol_map) - MCFG_CPU_VBLANK_INT_HACK(snowbros_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", snowbros_irq, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(honeydol_sound_map) @@ -1576,10 +1596,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(honeydol) + MCFG_SCREEN_UPDATE_STATIC(honeydol) MCFG_GFXDECODE(honeydol) MCFG_PALETTE_LENGTH(0x800/2) @@ -1603,7 +1622,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) // or 12 MCFG_CPU_PROGRAM_MAP(twinadv_map) - MCFG_CPU_VBLANK_INT_HACK(snowbros_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", snowbros_irq, "screen", 0, 1) MCFG_CPU_ADD("soundcpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -1614,10 +1633,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.5) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(twinadv) + MCFG_SCREEN_UPDATE_STATIC(twinadv) MCFG_GFXDECODE(twinadv) MCFG_PALETTE_LENGTH(0x100) @@ -1681,16 +1699,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16mhz or 12mhz ? */ MCFG_CPU_PROGRAM_MAP(snowbros3_map) - MCFG_CPU_VBLANK_INT_HACK(snowbro3_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", snowbros3_irq, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(snowbro3) + MCFG_SCREEN_UPDATE_STATIC(snowbro3) MCFG_GFXDECODE(sb3) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/solomon.c mame-0.145/src/mame/drivers/solomon.c --- mame-0.144/src/mame/drivers/solomon.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/solomon.c 2012-02-06 21:30:35.000000000 +0000 @@ -38,6 +38,12 @@ } } +static WRITE8_HANDLER( nmi_mask_w ) +{ + solomon_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0xbfff) AM_ROM @@ -55,7 +61,7 @@ AM_RANGE(0xe604, 0xe604) AM_READ_PORT("DSW1") AM_RANGE(0xe605, 0xe605) AM_READ_PORT("DSW2") AM_RANGE(0xe606, 0xe606) AM_READNOP /* watchdog? */ - AM_RANGE(0xe600, 0xe600) AM_WRITE(interrupt_enable_w) + AM_RANGE(0xe600, 0xe600) AM_WRITE(nmi_mask_w) AM_RANGE(0xe604, 0xe604) AM_WRITE(solomon_flipscreen_w) AM_RANGE(0xe800, 0xe800) AM_WRITE(solomon_sh_command_w) AM_RANGE(0xf000, 0xffff) AM_ROM @@ -188,12 +194,22 @@ GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0, 8 ) /* colors 0-127 */ GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + solomon_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + + static MACHINE_CONFIG_START( solomon, solomon_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) /* 4.0 MHz (?????) */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, 3072000) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -205,10 +221,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(solomon) + MCFG_SCREEN_UPDATE_STATIC(solomon) MCFG_GFXDECODE(solomon) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/sonson.c mame-0.145/src/mame/drivers/sonson.c --- mame-0.144/src/mame/drivers/sonson.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/sonson.c 2012-02-06 21:30:35.000000000 +0000 @@ -259,10 +259,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(sonson) + MCFG_SCREEN_UPDATE_STATIC(sonson) MCFG_GFXDECODE(sonson) MCFG_PALETTE_LENGTH(64*4+32*8) diff -Nru mame-0.144/src/mame/drivers/sothello.c mame-0.145/src/mame/drivers/sothello.c --- mame-0.144/src/mame/drivers/sothello.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sothello.c 2012-02-06 21:30:37.000000000 +0000 @@ -40,18 +40,19 @@ #include "sound/2203intf.h" #include "sound/msm5205.h" #include "video/v9938.h" -#include "deprecat.h" class sothello_state : public driver_device { public: sothello_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") { } int m_subcpu_status; int m_soundcpu_busy; int m_msm_data; + required_device m_v9938; }; @@ -140,10 +141,7 @@ AM_RANGE( 0x50, 0x50) AM_WRITE(bank_w) AM_RANGE( 0x60, 0x61) AM_MIRROR(0x02) AM_DEVREADWRITE("ymsnd", ym2203_r, ym2203_w) /* not sure, but the A1 line is ignored, code @ $8b8 */ - AM_RANGE( 0x70, 0x70) AM_WRITE( v9938_0_vram_w ) AM_READ( v9938_0_vram_r ) - AM_RANGE( 0x71, 0x71) AM_WRITE( v9938_0_command_w ) AM_READ( v9938_0_status_r ) - AM_RANGE( 0x72, 0x72) AM_WRITE( v9938_0_palette_w ) - AM_RANGE( 0x73, 0x73) AM_WRITE( v9938_0_register_w ) + AM_RANGE( 0x70, 0x73) AM_DEVREADWRITE_MODERN( "v9938", v9938_device, read, write ) ADDRESS_MAP_END /* sound Z80 */ @@ -312,14 +310,15 @@ cputag_set_input_line(device->machine(), "sub", 0, irq ? ASSERT_LINE : CLEAR_LINE); } -static void sothello_vdp_interrupt(running_machine &machine, int i) +static void sothello_vdp_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line(machine, "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); + cputag_set_input_line(device.machine(), "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); } -static INTERRUPT_GEN( sothello_interrupt ) +static TIMER_DEVICE_CALLBACK( sothello_interrupt ) { - v9938_interrupt(device->machine(), 0); + sothello_state *state = timer.machine().driver_data(); + state->m_v9938->interrupt(); } static void adpcm_int(device_t *device) @@ -337,16 +336,8 @@ MSM5205_S48_4B /* changed on the fly */ }; -static VIDEO_START( sothello ) -{ - VIDEO_START_CALL(generic_bitmapped); - v9938_init (machine, 0, *machine.primary_screen, machine.generic.tmpbitmap, MODEL_V9938, VDP_MEM, sothello_vdp_interrupt); - v9938_reset(0); -} - static MACHINE_RESET(sothello) { - v9938_reset(0); } static const ym2203_interface ym2203_config = @@ -369,7 +360,7 @@ MCFG_CPU_ADD("maincpu",Z80, MAINCPU_CLOCK) MCFG_CPU_PROGRAM_MAP(maincpu_mem_map) MCFG_CPU_IO_MAP(maincpu_io_map) - MCFG_CPU_VBLANK_INT_HACK(sothello_interrupt,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", sothello_interrupt, "screen", 0, 1) MCFG_CPU_ADD("soundcpu",Z80, SOUNDCPU_CLOCK) MCFG_CPU_PROGRAM_MAP(soundcpu_mem_map) @@ -382,17 +373,18 @@ MCFG_MACHINE_RESET(sothello) + MCFG_V9938_ADD("v9938", "screen", VDP_MEM) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(sothello_vdp_interrupt) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_SCREEN_SIZE(512 + 32, (212 + 28) * 2) MCFG_SCREEN_VISIBLE_AREA(0, 512 + 32 - 1, 0, (212 + 28) * 2 - 1) - MCFG_SCREEN_UPDATE(generic_bitmapped) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT( v9938 ) - MCFG_VIDEO_START(sothello) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/spacefb.c mame-0.145/src/mame/drivers/spacefb.c --- mame-0.144/src/mame/drivers/spacefb.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/spacefb.c 2012-02-06 21:30:35.000000000 +0000 @@ -354,9 +354,8 @@ MCFG_VIDEO_START(spacefb) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(SPACEFB_PIXEL_CLOCK, SPACEFB_HTOTAL, SPACEFB_HBEND, SPACEFB_HBSTART, SPACEFB_VTOTAL, SPACEFB_VBEND, SPACEFB_VBSTART) - MCFG_SCREEN_UPDATE(spacefb) + MCFG_SCREEN_UPDATE_STATIC(spacefb) /* audio hardware */ MCFG_FRAGMENT_ADD(spacefb_audio) diff -Nru mame-0.144/src/mame/drivers/spaceg.c mame-0.145/src/mame/drivers/spaceg.c --- mame-0.144/src/mame/drivers/spaceg.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/spaceg.c 2012-02-06 21:30:34.000000000 +0000 @@ -292,9 +292,9 @@ } -static SCREEN_UPDATE( spaceg ) +static SCREEN_UPDATE_IND16( spaceg ) { - spaceg_state *state = screen->machine().driver_data(); + spaceg_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 0x2000; offs++) @@ -306,7 +306,7 @@ for (i = 0; i < 8; i++) { - *BITMAP_ADDR16(bitmap, y, x) = (data & 0x80) ? state->m_colorram[offs] : 0; + bitmap.pix16(y, x) = (data & 0x80) ? state->m_colorram[offs] : 0; x++; data <<= 1; @@ -412,10 +412,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 32, 255) - MCFG_SCREEN_UPDATE( spaceg ) + MCFG_SCREEN_UPDATE_STATIC( spaceg ) MCFG_PALETTE_LENGTH(16+128-16) MCFG_PALETTE_INIT( spaceg ) diff -Nru mame-0.144/src/mame/drivers/spbactn.c mame-0.145/src/mame/drivers/spbactn.c --- mame-0.144/src/mame/drivers/spbactn.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/spbactn.c 2012-02-06 21:30:36.000000000 +0000 @@ -347,10 +347,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(spbactn) + MCFG_SCREEN_UPDATE_STATIC(spbactn) MCFG_GFXDECODE(spbactn) MCFG_PALETTE_LENGTH(0x2800/2) diff -Nru mame-0.144/src/mame/drivers/spcforce.c mame-0.145/src/mame/drivers/spcforce.c --- mame-0.144/src/mame/drivers/spcforce.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/spcforce.c 2012-02-06 21:30:40.000000000 +0000 @@ -28,6 +28,8 @@ a000-a3ff R/W X/Y scroll position of each character (can be scrolled up to 7 pixels in each direction) +TODO: +- fix cliprect for sprites that goes out of screen if possible ***************************************************************************/ @@ -79,6 +81,12 @@ cputag_set_input_line(space->machine(), "audiocpu", 0, (~data & 0x08) ? ASSERT_LINE : CLEAR_LINE); } +static WRITE8_HANDLER( irq_mask_w ) +{ + spcforce_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; +} static ADDRESS_MAP_START( spcforce_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM @@ -87,7 +95,7 @@ AM_RANGE(0x7001, 0x7001) AM_READ_PORT("P1") AM_WRITE(spcforce_soundtrigger_w) AM_RANGE(0x7002, 0x7002) AM_READ_PORT("P2") AM_RANGE(0x700b, 0x700b) AM_WRITE(spcforce_flip_screen_w) - AM_RANGE(0x700e, 0x700e) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x700e, 0x700e) AM_WRITE(irq_mask_w) AM_RANGE(0x700f, 0x700f) AM_WRITENOP AM_RANGE(0x8000, 0x83ff) AM_RAM AM_BASE_MEMBER(spcforce_state, m_videoram) AM_RANGE(0x9000, 0x93ff) AM_RAM AM_BASE_MEMBER(spcforce_state, m_colorram) @@ -237,6 +245,13 @@ } } +static INTERRUPT_GEN( vblank_irq ) +{ + spcforce_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 3, HOLD_LINE); +} static MACHINE_CONFIG_START( spcforce, spcforce_state ) @@ -244,7 +259,7 @@ /* FIXME: The 8085A had a max clock of 6MHz, internally divided by 2! */ MCFG_CPU_ADD("maincpu", I8085A, 8000000 * 2) /* 4.00 MHz??? */ MCFG_CPU_PROGRAM_MAP(spcforce_map) - MCFG_CPU_VBLANK_INT("screen", irq3_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", I8035, 6144000) /* divisor ??? */ MCFG_CPU_PROGRAM_MAP(spcforce_sound_map) @@ -254,10 +269,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(spcforce) + MCFG_SCREEN_UPDATE_STATIC(spcforce) MCFG_GFXDECODE(spcforce) MCFG_PALETTE_LENGTH(sizeof(colortable_source) / sizeof(colortable_source[0])) diff -Nru mame-0.144/src/mame/drivers/spdodgeb.c mame-0.145/src/mame/drivers/spdodgeb.c --- mame-0.144/src/mame/drivers/spdodgeb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/spdodgeb.c 2012-02-06 21:30:37.000000000 +0000 @@ -6,7 +6,7 @@ TODO: - sprite lag (the real game has quite a bit of lag too) -- double-tap tolerance (find a way to dump + emulate MCU?) +- double-tap tolerance (find a way to emulate MCU?) Notes: - there's probably a 63701 on the board, used for protection. It is checked @@ -23,7 +23,6 @@ #include "emu.h" #include "cpu/m6502/m6502.h" -#include "deprecat.h" #include "cpu/m6809/m6809.h" #include "sound/3812intf.h" #include "sound/msm5205.h" @@ -419,19 +418,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502,12000000/6) /* 2MHz ? */ MCFG_CPU_PROGRAM_MAP(spdodgeb_map) - MCFG_CPU_VBLANK_INT_HACK(spdodgeb_interrupt,33) /* 1 IRQ every 8 visible scanlines, plus NMI for vblank */ + MCFG_TIMER_ADD_SCANLINE("scantimer", spdodgeb_interrupt, "screen", 0, 1) /* 1 IRQ every 8 visible scanlines, plus NMI for vblank */ MCFG_CPU_ADD("audiocpu", M6809,12000000/6) /* 2MHz ? */ MCFG_CPU_PROGRAM_MAP(spdodgeb_sound_map) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(spdodgeb) + MCFG_SCREEN_RAW_PARAMS(12000000/2, 384, 0, 256, 272, 0, 240) + MCFG_SCREEN_UPDATE_STATIC(spdodgeb) MCFG_GFXDECODE(spdodgeb) MCFG_PALETTE_LENGTH(1024) @@ -470,8 +465,9 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio cpu */ ROM_LOAD( "22j5-0.33", 0x08000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) ) - ROM_REGION( 0x10000, "cpu2", 0 ) /* I/O mcu */ - ROM_LOAD( "63701.bin", 0xc000, 0x4000, NO_DUMP ) /* missing */ + ROM_REGION( 0x10000, "mcu", 0 ) /* I/O mcu */ + /* Not hooked up yet, we need to add HD63701Y0 support to the hd63701 core (with extra io ports, serial ports, and timers). */ + ROM_LOAD( "22ja-0.162", 0x0c000, 0x04000, CRC(7162a97b) SHA1(d6d4ee025e73a340428345f08711cd32f9169a8c) ) ROM_REGION( 0x40000, "gfx1", 0 ) /* text */ ROM_LOAD( "22a-4.121", 0x00000, 0x20000, CRC(acc26051) SHA1(445224238cce420990894824d95447e3f63a9ef0) ) @@ -529,7 +525,7 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio cpu */ ROM_LOAD( "22j5-0.33", 0x08000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) ) - ROM_REGION( 0x10000, "cpu2", 0 ) /* I/O mcu */ + ROM_REGION( 0x10000, "mcu", 0 ) /* I/O mcu */ ROM_LOAD( "63701.bin", 0xc000, 0x4000, NO_DUMP ) /* missing */ ROM_REGION( 0x40000, "gfx1", 0 ) /* text */ @@ -559,7 +555,7 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio cpu */ ROM_LOAD( "22j5-0.33", 0x08000, 0x08000, CRC(c31e264e) SHA1(0828a2094122e3934b784ec9ad7c2b89d91a83bb) ) - ROM_REGION( 0x10000, "cpu2", 0 ) /* I/O mcu */ + ROM_REGION( 0x10000, "mcu", 0 ) /* I/O mcu */ ROM_LOAD( "63701.bin", 0xc000, 0x4000, NO_DUMP ) /* missing */ ROM_REGION( 0x40000, "gfx1", 0 ) /* text */ diff -Nru mame-0.144/src/mame/drivers/spectra.c mame-0.145/src/mame/drivers/spectra.c --- mame-0.144/src/mame/drivers/spectra.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/spectra.c 2012-02-06 21:30:41.000000000 +0000 @@ -4,6 +4,8 @@ Rotating game, like Midway's "Rotation VIII". *******************************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6502/m6502.h" @@ -11,18 +13,28 @@ { public: spectra_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( spectra_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( spectra_map, AS_PROGRAM, 8, spectra_state ) ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_END static INPUT_PORTS_START( spectra ) INPUT_PORTS_END -static MACHINE_RESET( spectra ) +void spectra_state::machine_reset() { } @@ -34,8 +46,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, 3579545/4) MCFG_CPU_PROGRAM_MAP(spectra_map) - - MCFG_MACHINE_RESET( spectra ) MACHINE_CONFIG_END /*-------------------------------- @@ -50,4 +60,4 @@ ROM_END -GAME(1979, spectra, 0, spectra, spectra, spectra, ROT0, "Valley", "Spectra IV", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1979, spectra, 0, spectra, spectra, spectra, ROT0, "Valley", "Spectra IV", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/speedatk.c mame-0.145/src/mame/drivers/speedatk.c --- mame-0.144/src/mame/drivers/speedatk.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/speedatk.c 2012-02-06 21:30:38.000000000 +0000 @@ -338,10 +338,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(speedatk) + MCFG_SCREEN_UPDATE_STATIC(speedatk) MCFG_MC6845_ADD("crtc", H46505, MASTER_CLOCK/16, mc6845_intf) /* hand tuned to get ~60 fps */ diff -Nru mame-0.144/src/mame/drivers/speedbal.c mame-0.145/src/mame/drivers/speedbal.c --- mame-0.144/src/mame/drivers/speedbal.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/speedbal.c 2012-02-06 21:30:38.000000000 +0000 @@ -236,10 +236,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(speedbal) + MCFG_SCREEN_UPDATE_STATIC(speedbal) MCFG_GFXDECODE(speedbal) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/speedspn.c mame-0.145/src/mame/drivers/speedspn.c --- mame-0.144/src/mame/drivers/speedspn.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/speedspn.c 2012-02-06 21:30:39.000000000 +0000 @@ -281,10 +281,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 56*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(speedspn) + MCFG_SCREEN_UPDATE_STATIC(speedspn) MCFG_GFXDECODE(speedspn) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/speglsht.c mame-0.145/src/mame/drivers/speglsht.c --- mame-0.144/src/mame/drivers/speglsht.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/speglsht.c 2012-02-06 21:30:42.000000000 +0000 @@ -119,7 +119,7 @@ UINT8 *m_shared; UINT32 *m_framebuffer; UINT32 m_videoreg; - bitmap_t *m_bitmap; + bitmap_ind16 *m_bitmap; UINT32 *m_cop_ram; }; @@ -334,18 +334,18 @@ static VIDEO_START(speglsht) { speglsht_state *state = machine.driver_data(); - state->m_bitmap = auto_bitmap_alloc(machine, 512, 5122, BITMAP_FORMAT_INDEXED16 ); + state->m_bitmap = auto_bitmap_ind16_alloc(machine, 512, 5122 ); VIDEO_START_CALL(st0016); } #define PLOT_PIXEL_RGB(x,y,r,g,b) if(y>=0 && x>=0 && x<512 && y<512) \ { \ - *BITMAP_ADDR32(bitmap, y, x) = (b) | ((g)<<8) | ((r)<<16); \ + bitmap.pix32(y, x) = (b) | ((g)<<8) | ((r)<<16); \ } -static SCREEN_UPDATE(speglsht) +static SCREEN_UPDATE_RGB32(speglsht) { - speglsht_state *state = screen->machine().driver_data(); + speglsht_state *state = screen.machine().driver_data(); int x,y,dy; dy=(state->m_videoreg&0x20)?(256*512):0; //visible frame @@ -360,18 +360,18 @@ } //draw st0016 gfx to temporary bitmap (indexed 16) - bitmap_fill(state->m_bitmap,NULL,0); - st0016_draw_screen(screen, state->m_bitmap, cliprect); + state->m_bitmap->fill(0); + st0016_draw_screen(screen, *state->m_bitmap, cliprect); //copy temporary bitmap to rgb 32 bit bitmap - for(y=cliprect->min_y; ymax_y;y++) + for(y=cliprect.min_y; ym_bitmap, y, 0); - for(x=cliprect->min_x; xmax_x;x++) + UINT16 *srcline = &state->m_bitmap->pix16(y); + for(x=cliprect.min_x; xmachine(), srcline[x]); + rgb_t color=palette_get_color(screen.machine(), srcline[x]); PLOT_PIXEL_RGB(x,y,RGB_RED(color),RGB_GREEN(color),RGB_BLUE(color)); } } @@ -400,10 +400,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 239-8) - MCFG_SCREEN_UPDATE(speglsht) + MCFG_SCREEN_UPDATE_STATIC(speglsht) MCFG_GFXDECODE(speglsht) MCFG_PALETTE_LENGTH(16*16*4+1) diff -Nru mame-0.144/src/mame/drivers/spiders.c mame-0.145/src/mame/drivers/spiders.c --- mame-0.144/src/mame/drivers/spiders.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/spiders.c 2012-02-06 21:30:36.000000000 +0000 @@ -490,7 +490,7 @@ data3 = data3 >> 1; } - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; x = x + 1; } @@ -521,15 +521,6 @@ }; -static SCREEN_UPDATE( spiders ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - - return 0; -} - - /************************************* * @@ -715,9 +706,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(spiders) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) diff -Nru mame-0.144/src/mame/drivers/spinb.c mame-0.145/src/mame/drivers/spinb.c --- mame-0.144/src/mame/drivers/spinb.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/spinb.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mcs51/mcs51.h" @@ -5,18 +7,28 @@ { public: spinb_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( spinb_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( spinb_map, AS_PROGRAM, 8, spinb_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( spinb ) INPUT_PORTS_END -static MACHINE_RESET( spinb ) +void spinb_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8051, 16000000) MCFG_CPU_PROGRAM_MAP(spinb_map) - - MCFG_MACHINE_RESET( spinb ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -118,8 +128,7 @@ / Verne's World (1996) /-------------------------------------------------------------------*/ -GAME(1993, bushido, 0, spinb, spinb, spinb, ROT0, "Inder/Spinball", "Bushido", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, bushidoa, bushido,spinb, spinb, spinb, ROT0, "Inder/Spinball", "Bushido (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, jolypark, 0, spinb, spinb, spinb, ROT0, "Spinball", "Jolly Park", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, mach2, 0, spinb, spinb, spinb, ROT0, "Spinball", "Mach 2", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1993, bushido, 0, spinb, spinb, spinb, ROT0, "Inder/Spinball", "Bushido", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, bushidoa, bushido, spinb, spinb, spinb, ROT0, "Inder/Spinball", "Bushido (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, jolypark, 0, spinb, spinb, spinb, ROT0, "Spinball", "Jolly Park", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, mach2, 0, spinb, spinb, spinb, ROT0, "Spinball", "Mach 2", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/splash.c mame-0.145/src/mame/drivers/splash.c --- mame-0.144/src/mame/drivers/splash.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/splash.c 2012-02-06 21:30:35.000000000 +0000 @@ -518,10 +518,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 48*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(splash) + MCFG_SCREEN_UPDATE_STATIC(splash) MCFG_GFXDECODE(splash) MCFG_PALETTE_LENGTH(2048) @@ -576,11 +575,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 48*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(splash) + MCFG_SCREEN_UPDATE_STATIC(splash) MCFG_GFXDECODE(splash) MCFG_PALETTE_LENGTH(2048) @@ -659,10 +657,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(funystrp) + MCFG_SCREEN_UPDATE_STATIC(funystrp) MCFG_GFXDECODE(splash) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/splus.c mame-0.145/src/mame/drivers/splus.c --- mame-0.144/src/mame/drivers/splus.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/splus.c 2012-02-06 21:30:37.000000000 +0000 @@ -48,6 +48,11 @@ m_p1_unknown = 0x00; } + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) + { + return 0; + } + // Pointers to External RAM required_shared_ptr m_cmosl_ram; required_shared_ptr m_cmosh_ram; @@ -682,7 +687,7 @@ MCFG_SCREEN_ADD("scrn", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(splus_state, screen_update) MCFG_SCREEN_SIZE((52+1)*8, (31+1)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 25*8-1) diff -Nru mame-0.144/src/mame/drivers/spoker.c mame-0.145/src/mame/drivers/spoker.c --- mame-0.144/src/mame/drivers/spoker.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/spoker.c 2012-02-06 21:30:36.000000000 +0000 @@ -47,7 +47,7 @@ spoker_state *state = space->machine().driver_data(); state->m_bg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -69,7 +69,7 @@ spoker_state *state = space->machine().driver_data(); state->m_fg_tile_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( fg_color_w ) @@ -77,7 +77,7 @@ spoker_state *state = space->machine().driver_data(); state->m_fg_color_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static VIDEO_START(spoker) @@ -86,16 +86,16 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 32, 128, 8); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 128, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static SCREEN_UPDATE(spoker) +static SCREEN_UPDATE_IND16(spoker) { - spoker_state *state = screen->machine().driver_data(); + spoker_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -539,10 +539,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-16-1) - MCFG_SCREEN_UPDATE(spoker) + MCFG_SCREEN_UPDATE_STATIC(spoker) MCFG_GFXDECODE(spoker) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/spool99.c mame-0.145/src/mame/drivers/spool99.c --- mame-0.144/src/mame/drivers/spool99.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/spool99.c 2012-02-06 21:30:37.000000000 +0000 @@ -126,11 +126,11 @@ state->m_sc0_tilemap = tilemap_create(machine, get_spool99_tile_info, tilemap_scan_rows, 8, 8, 64, 32); } -static SCREEN_UPDATE(spool99) +static SCREEN_UPDATE_IND16(spool99) { - spool99_state *state = screen->machine().driver_data(); + spool99_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_sc0_tilemap,0,0); + state->m_sc0_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -139,7 +139,7 @@ spool99_state *state = space->machine().driver_data(); state->m_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset/2); + state->m_sc0_tilemap->mark_tile_dirty(offset/2); } static WRITE8_HANDLER( spool99_cram_w ) @@ -147,7 +147,7 @@ spool99_state *state = space->machine().driver_data(); state->m_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_sc0_tilemap,offset/2); + state->m_sc0_tilemap->mark_tile_dirty(offset/2); } @@ -347,10 +347,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(7*8, 55*8-1, 1*8, 31*8-1) //384x240,raw guess - MCFG_SCREEN_UPDATE(spool99) + MCFG_SCREEN_UPDATE_STATIC(spool99) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/sprcros2.c mame-0.145/src/mame/drivers/sprcros2.c --- mame-0.144/src/mame/drivers/sprcros2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sprcros2.c 2012-02-06 21:30:36.000000000 +0000 @@ -56,7 +56,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "sound/sn76496.h" #include "includes/sprcros2.h" @@ -80,7 +79,7 @@ if((state->m_port7^data)&0x40) memory_set_bankptr(space->machine(), "bank1",&RAM[0x10000+((data&0x40)<<7)]); - tilemap_set_flip_all( space->machine(),data&0x02?(TILEMAP_FLIPX|TILEMAP_FLIPY):0 ); + space->machine().tilemap().set_flip_all(data&0x02?(TILEMAP_FLIPX|TILEMAP_FLIPY):0 ); state->m_port7 = data; } @@ -231,19 +230,20 @@ GFXDECODE_ENTRY( "gfx3", 0, sprcros2_fglayout, 512, 64 ) GFXDECODE_END -static INTERRUPT_GEN( sprcros2_m_interrupt ) +static TIMER_DEVICE_CALLBACK( sprcros2_m_interrupt ) { - sprcros2_state *state = device->machine().driver_data(); + sprcros2_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device) == 0) + if (scanline == 240) { if(state->m_port7&0x01) - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); + device_set_input_line(state->m_master, INPUT_LINE_NMI, PULSE_LINE); } - else + else if(scanline == 0) { if(state->m_port7&0x08) - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_master, 0, HOLD_LINE); } } @@ -269,12 +269,12 @@ MCFG_CPU_ADD("master", Z80,10000000/2) MCFG_CPU_PROGRAM_MAP(sprcros2_master_map) MCFG_CPU_IO_MAP(sprcros2_master_io_map) - MCFG_CPU_VBLANK_INT_HACK(sprcros2_m_interrupt,2) //1 nmi + 1 irq + MCFG_TIMER_ADD_SCANLINE("scantimer", sprcros2_m_interrupt, "screen", 0, 1) MCFG_CPU_ADD("slave", Z80,10000000/2) MCFG_CPU_PROGRAM_MAP(sprcros2_slave_map) MCFG_CPU_IO_MAP(sprcros2_slave_io_map) - MCFG_CPU_VBLANK_INT_HACK(sprcros2_s_interrupt,2) //2 nmis + MCFG_CPU_PERIODIC_INT(sprcros2_s_interrupt,2*60) //2 nmis MCFG_MACHINE_START(sprcros2) @@ -282,10 +282,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(sprcros2) + MCFG_SCREEN_UPDATE_STATIC(sprcros2) MCFG_GFXDECODE(sprcros2) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/sprint2.c mame-0.145/src/mame/drivers/sprint2.c --- mame-0.144/src/mame/drivers/sprint2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/sprint2.c 2012-02-06 21:30:40.000000000 +0000 @@ -513,11 +513,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 262) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 223) - MCFG_SCREEN_UPDATE(sprint2) - MCFG_SCREEN_EOF(sprint2) + MCFG_SCREEN_UPDATE_STATIC(sprint2) + MCFG_SCREEN_VBLANK_STATIC(sprint2) MCFG_GFXDECODE(sprint2) MCFG_PALETTE_LENGTH(12) diff -Nru mame-0.144/src/mame/drivers/sprint4.c mame-0.145/src/mame/drivers/sprint4.c --- mame-0.144/src/mame/drivers/sprint4.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sprint4.c 2012-02-06 21:30:40.000000000 +0000 @@ -406,10 +406,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224) - MCFG_SCREEN_UPDATE(sprint4) - MCFG_SCREEN_EOF(sprint4) + MCFG_SCREEN_UPDATE_STATIC(sprint4) + MCFG_SCREEN_VBLANK_STATIC(sprint4) MCFG_GFXDECODE(sprint4) MCFG_PALETTE_LENGTH(10) diff -Nru mame-0.144/src/mame/drivers/sprint8.c mame-0.145/src/mame/drivers/sprint8.c --- mame-0.144/src/mame/drivers/sprint8.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sprint8.c 2012-02-06 21:30:40.000000000 +0000 @@ -466,11 +466,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 261) MCFG_SCREEN_VISIBLE_AREA(0, 495, 0, 231) - MCFG_SCREEN_UPDATE(sprint8) - MCFG_SCREEN_EOF(sprint8) + MCFG_SCREEN_UPDATE_STATIC(sprint8) + MCFG_SCREEN_VBLANK_STATIC(sprint8) MCFG_GFXDECODE(sprint8) MCFG_PALETTE_LENGTH(36) diff -Nru mame-0.144/src/mame/drivers/spy.c mame-0.145/src/mame/drivers/spy.c --- mame-0.144/src/mame/drivers/spy.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/spy.c 2012-02-06 21:30:35.000000000 +0000 @@ -421,29 +421,27 @@ KONAMI8_ALT_B21(2) /* button 3 unused */ PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) + PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) + PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "10k and every 20k" ) PORT_DIPSETTING( 0x10, "20k and every 30k" ) PORT_DIPSETTING( 0x08, "20k only" ) PORT_DIPSETTING( 0x00, "30k only" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -451,17 +449,15 @@ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SPECIAL ) /* PMCFIRQ signal from the PMC */ - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SPECIAL ) /* PMCFIRQ signal from the PMC */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Continues ) ) - PORT_DIPSETTING( 0x80, "Unlimited" ) + PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x00, "5 Times" ) + PORT_DIPSETTING( 0x80, "Unlimited" ) INPUT_PORTS_END @@ -561,10 +557,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(spy) + MCFG_SCREEN_UPDATE_STATIC(spy) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/srmp2.c mame-0.145/src/mame/drivers/srmp2.c --- mame-0.144/src/mame/drivers/srmp2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/srmp2.c 2012-02-06 21:30:37.000000000 +0000 @@ -1188,10 +1188,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(464, 256-16) MCFG_SCREEN_VISIBLE_AREA(16, 464-1, 8, 256-1-24) - MCFG_SCREEN_UPDATE(srmp2) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(srmp2) /* just draw the sprites */ MCFG_GFXDECODE(srmp2) MCFG_PALETTE_LENGTH(1024) /* sprites only */ @@ -1230,10 +1229,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(400, 256-16) MCFG_SCREEN_VISIBLE_AREA(16, 400-1, 8, 256-1-24) - MCFG_SCREEN_UPDATE(srmp3) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(srmp3) /* just draw the sprites */ MCFG_GFXDECODE(srmp3) MCFG_PALETTE_LENGTH(512) /* sprites only */ @@ -1281,10 +1279,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(400, 256-16) MCFG_SCREEN_VISIBLE_AREA(16, 400-1, 0, 256-1-16) - MCFG_SCREEN_UPDATE(mjyuugi) /* just draw the sprites */ + MCFG_SCREEN_UPDATE_STATIC(mjyuugi) /* just draw the sprites */ MCFG_GFXDECODE(srmp3) MCFG_PALETTE_LENGTH(512) /* sprites only */ diff -Nru mame-0.144/src/mame/drivers/srmp5.c mame-0.145/src/mame/drivers/srmp5.c --- mame-0.144/src/mame/drivers/srmp5.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/srmp5.c 2012-02-06 21:30:37.000000000 +0000 @@ -85,14 +85,13 @@ }; -static SCREEN_UPDATE( srmp5 ) +static SCREEN_UPDATE_RGB32( srmp5 ) { - srmp5_state *state = screen->machine().driver_data(); + srmp5_state *state = screen.machine().driver_data(); int x,y,address,xs,xs2,ys,ys2,height,width,xw,yw,xb,yb,sizex,sizey; UINT16 *sprite_list=state->m_sprram; UINT16 *sprite_list_end=&state->m_sprram[0x4000]; //guess UINT8 *pixels=(UINT8 *)state->m_tileram; - const rectangle &visarea = screen->visible_area(); //Table surface seems to be tiles, but display corrupts when switching the scene if always ON. //Currently the tiles are OFF. @@ -119,7 +118,7 @@ if(pen) { UINT16 pixdata=state->m_palram[pen]; - *BITMAP_ADDR32(bitmap, yw * 16 + y, xw * 16 + x) = ((pixdata&0x7c00)>>7) | ((pixdata&0x3e0)<<6) | ((pixdata&0x1f)<<19); + bitmap.pix32(yw * 16 + y, xw * 16 + x) = ((pixdata&0x7c00)>>7) | ((pixdata&0x3e0)<<6) | ((pixdata&0x1f)<<19); } address++; } @@ -129,7 +128,7 @@ } else #endif - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); while((sprite_list[SUBLIST_OFFSET]&SPRITE_LIST_END_MARKER)==0 && sprite_list=visarea.min_x && yb+ys2<=visarea.max_y && yb+ys2>=visarea.min_y ) + if(cliprect.contains(xb+xs2, yb+ys2)) { UINT16 pixdata=state->m_palram[pen+((sprite_sublist[SPRITE_PALETTE]&0xff)<<8)]; - *BITMAP_ADDR32(bitmap, yb+ys2, xb+xs2) = ((pixdata&0x7c00)>>7) | ((pixdata&0x3e0)<<6) | ((pixdata&0x1f)<<19); + bitmap.pix32(yb+ys2, xb+xs2) = ((pixdata&0x7c00)>>7) | ((pixdata&0x3e0)<<6) | ((pixdata&0x1f)<<19); } } ++address; @@ -193,7 +192,7 @@ { if (state->m_tileduty[i] == 1) { - gfx_element_decode(screen->machine().gfx[0], i); + gfx_element_decode(screen.machine().gfx[0], i); state->m_tileduty[i] = 0; } } @@ -570,10 +569,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(96*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(srmp5) + MCFG_SCREEN_UPDATE_STATIC(srmp5) MCFG_PALETTE_LENGTH(0x1800) #ifdef DEBUG_CHAR diff -Nru mame-0.144/src/mame/drivers/srmp6.c mame-0.145/src/mame/drivers/srmp6.c --- mame-0.144/src/mame/drivers/srmp6.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/srmp6.c 2012-02-06 21:30:37.000000000 +0000 @@ -158,9 +158,9 @@ static int xixi=0; #endif -static SCREEN_UPDATE(srmp6) +static SCREEN_UPDATE_RGB32(srmp6) { - srmp6_state *state = screen->machine().driver_data(); + srmp6_state *state = screen.machine().driver_data(); int alpha; int x,y,tileno,height,width,xw,yw,sprite,xb,yb; UINT16 *sprite_list = state->m_sprram_old; @@ -172,17 +172,17 @@ UINT16 b; } temp; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); #if 0 /* debug */ - if(screen->machine().input().code_pressed_once(KEYCODE_Q)) + if(screen.machine().input().code_pressed_once(KEYCODE_Q)) { ++xixi; printf("%x\n",xixi); } - if(screen->machine().input().code_pressed_once(KEYCODE_W)) + if(screen.machine().input().code_pressed_once(KEYCODE_W)) { --xixi; printf("%x\n",xixi); @@ -259,7 +259,7 @@ else yb=y+(height-yw-1)*8+global_y; - drawgfx_alpha(bitmap,cliprect,screen->machine().gfx[0],tileno,global_pal,flip_x,flip_y,xb,yb,0,alpha); + drawgfx_alpha(bitmap,cliprect,screen.machine().gfx[0],tileno,global_pal,flip_x,flip_y,xb,yb,0,alpha); tileno++; } } @@ -273,7 +273,7 @@ memcpy(state->m_sprram_old, state->m_sprram, 0x80000); - if(screen->machine().input().code_pressed_once(KEYCODE_Q)) + if(screen.machine().input().code_pressed_once(KEYCODE_Q)) { FILE *p=fopen("tileram.bin","wb"); fwrite(state->m_tileram, 1, 0x100000*16, p); @@ -673,10 +673,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 42*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(srmp6) + MCFG_SCREEN_UPDATE_STATIC(srmp6) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/srumbler.c mame-0.145/src/mame/drivers/srumbler.c --- mame-0.144/src/mame/drivers/srumbler.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/srumbler.c 2012-02-06 21:30:38.000000000 +0000 @@ -12,7 +12,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/m6809/m6809.h" #include "sound/2203intf.h" #include "includes/srumbler.h" @@ -44,19 +43,23 @@ } } -static MACHINE_RESET( srumbler ) +static MACHINE_START( srumbler ) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); /* initialize banked ROM pointers */ srumbler_bankswitch_w(space,0,0); } -static INTERRUPT_GEN( srumbler_interrupt ) +static TIMER_DEVICE_CALLBACK( srumbler_interrupt ) { - if (cpu_getiloops(device)==0) - device_set_input_line(device,0,HOLD_LINE); - else - device_set_input_line(device,M6809_FIRQ_LINE,HOLD_LINE); + srumbler_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 248) + device_set_input_line(state->m_maincpu,0,HOLD_LINE); + + if (scanline == 0) + device_set_input_line(state->m_maincpu,M6809_FIRQ_LINE,HOLD_LINE); } /* @@ -236,13 +239,13 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1500000) /* 1.5 MHz (?) */ MCFG_CPU_PROGRAM_MAP(srumbler_map) - MCFG_CPU_VBLANK_INT_HACK(srumbler_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", srumbler_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 3000000) /* 3 MHz ??? */ MCFG_CPU_PROGRAM_MAP(srumbler_sound_map) MCFG_CPU_PERIODIC_INT(irq0_line_hold,4*60) - MCFG_MACHINE_RESET(srumbler) + MCFG_MACHINE_START(srumbler) /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) @@ -250,11 +253,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(10*8, (64-10)*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE(srumbler) - MCFG_SCREEN_EOF(srumbler) + MCFG_SCREEN_UPDATE_STATIC(srumbler) + MCFG_SCREEN_VBLANK_STATIC(srumbler) MCFG_GFXDECODE(srumbler) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/ssfindo.c mame-0.145/src/mame/drivers/ssfindo.c --- mame-0.144/src/mame/drivers/ssfindo.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/ssfindo.c 2012-02-06 21:30:41.000000000 +0000 @@ -236,9 +236,9 @@ static void PS7500_startTimer1(running_machine &machine); -static SCREEN_UPDATE(ssfindo) +static SCREEN_UPDATE_IND16(ssfindo) { - ssfindo_state *state = screen->machine().driver_data(); + ssfindo_state *state = screen.machine().driver_data(); int s,x,y; if( state->m_PS7500_IO[VIDCR]&0x20) //video DMA enabled @@ -250,10 +250,10 @@ for(y=0;y<256;y++) for(x=0;x<320;x+=4) { - *BITMAP_ADDR16(bitmap, y, x+0) = state->m_vram[s]&0xff; - *BITMAP_ADDR16(bitmap, y, x+1) = (state->m_vram[s]>>8)&0xff; - *BITMAP_ADDR16(bitmap, y, x+2) = (state->m_vram[s]>>16)&0xff; - *BITMAP_ADDR16(bitmap, y, x+3) = (state->m_vram[s]>>24)&0xff; + bitmap.pix16(y, x+0) = state->m_vram[s]&0xff; + bitmap.pix16(y, x+1) = (state->m_vram[s]>>8)&0xff; + bitmap.pix16(y, x+2) = (state->m_vram[s]>>16)&0xff; + bitmap.pix16(y, x+3) = (state->m_vram[s]>>24)&0xff; s++; } } @@ -752,10 +752,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(ssfindo) + MCFG_SCREEN_UPDATE_STATIC(ssfindo) MCFG_PALETTE_LENGTH(256) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/sshangha.c mame-0.145/src/mame/drivers/sshangha.c --- mame-0.144/src/mame/drivers/sshangha.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sshangha.c 2012-02-06 21:30:39.000000000 +0000 @@ -416,10 +416,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(sshangha) + MCFG_SCREEN_UPDATE_STATIC(sshangha) MCFG_GFXDECODE(sshangha) MCFG_PALETTE_LENGTH(0x4000) diff -Nru mame-0.144/src/mame/drivers/sshot.c mame-0.145/src/mame/drivers/sshot.c --- mame-0.144/src/mame/drivers/sshot.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sshot.c 2012-02-06 21:30:37.000000000 +0000 @@ -189,10 +189,10 @@ state->m_tilemap = tilemap_create(machine, get_supershot_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( supershot ) +static SCREEN_UPDATE_IND16( supershot ) { - supershot_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + supershot_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -201,7 +201,7 @@ supershot_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } /************************************* @@ -333,12 +333,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((32)*8, (32)*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) MCFG_VIDEO_START(supershot) - MCFG_SCREEN_UPDATE(supershot) + MCFG_SCREEN_UPDATE_STATIC(supershot) MCFG_GFXDECODE(supershot) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/ssingles.c mame-0.145/src/mame/drivers/ssingles.c --- mame-0.144/src/mame/drivers/ssingles.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ssingles.c 2012-02-06 21:30:33.000000000 +0000 @@ -9,6 +9,7 @@ Upper half of 7.bin = upper half of 8.bin = intentional or bad dump ? TODO: + - atamanot: needs a trojan, in order to understand how the protection really works. - colors (missing prom(s) ?) - samples (at least two of unused roms contains samples (unkn. format , adpcm ?) - dips (one is tested in game (difficulty related?), another 2 are tested at start) @@ -160,6 +161,8 @@ UINT8 m_colorram[VMEM_SIZE]; UINT8 m_prot_data; pen_t m_pens[NUM_PENS]; + + UINT8 m_atamanot_prot_state; }; //fake palette @@ -175,7 +178,7 @@ 0x00,0x00,0x00, 0xff,0x00,0xff, 0x80,0x00,0x80, 0x40,0x00,0x40 }; -static MC6845_UPDATE_ROW( update_row ) +static MC6845_UPDATE_ROW( ssingles_update_row ) { ssingles_state *state = device->machine().driver_data(); int cx,x; @@ -206,19 +209,71 @@ for(x=7;x>=0;--x) { - *BITMAP_ADDR32(bitmap, y, (cx<<3)|(x)) = state->m_pens[palette+((b1&1)|((b0&1)<<1))]; + bitmap.pix32(y, (cx<<3)|(x)) = state->m_pens[palette+((b1&1)|((b0&1)<<1))]; b0>>=1; b1>>=1; } } } -static const mc6845_interface mc6845_intf = +static MC6845_UPDATE_ROW( atamanot_update_row ) +{ + ssingles_state *state = device->machine().driver_data(); + int cx,x; + UINT32 tile_address; + UINT16 cell,palette; + UINT8 b0,b1; + const UINT8 *gfx = device->machine().region("gfx1")->base(); + + for(cx=0;cx>1)+(cx>>1))&0xff; + + cell=state->m_videoram[address]+(state->m_colorram[address]<<8); + + tile_address=((cell&0x1ff)<<4)+ra; + palette=(cell>>10)&0x1c; + + if(cx&1) + { + b0=gfx[tile_address+0x0000]; /* 9.bin */ + b1=gfx[tile_address+0x4000]; /* 11.bin */ + } + else + { + b0=gfx[tile_address+0x2000]; /* 10.bin */ + b1=gfx[tile_address+0x6000]; /* 12.bin */ + } + + for(x=7;x>=0;--x) + { + bitmap.pix32(y, (cx<<3)|(x)) = state->m_pens[palette+((b1&1)|((b0&1)<<1))]; + b0>>=1; + b1>>=1; + } + } +} + +static const mc6845_interface ssingles_mc6845_intf = +{ + "screen", + 8, + NULL, /* before pixel update callback */ + ssingles_update_row, /* row update callback */ + NULL, /* after pixel update callback */ + DEVCB_NULL, /* callback for display state changes */ + DEVCB_NULL, /* callback for cursor state changes */ + DEVCB_NULL, /* HSYNC callback */ + DEVCB_NULL, /* VSYNC callback */ + NULL /* update address callback */ +}; + +static const mc6845_interface atamanot_mc6845_intf = { "screen", 8, NULL, /* before pixel update callback */ - update_row, /* row update callback */ + atamanot_update_row, /* row update callback */ NULL, /* after pixel update callback */ DEVCB_NULL, /* callback for display state changes */ DEVCB_NULL, /* callback for cursor state changes */ @@ -227,15 +282,20 @@ NULL /* update address callback */ }; + static WRITE8_HANDLER(ssingles_videoram_w) { ssingles_state *state = space->machine().driver_data(); + UINT8 *vram = space->machine().region("vram")->base(); + vram[offset] = data; state->m_videoram[offset]=data; } static WRITE8_HANDLER(ssingles_colorram_w) { ssingles_state *state = space->machine().driver_data(); + UINT8 *cram = space->machine().region("cram")->base(); + cram[offset] = data; state->m_colorram[offset]=data; } @@ -254,15 +314,6 @@ } -static SCREEN_UPDATE( ssingles ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - - return 0; -} - - static READ8_HANDLER(c000_r) { ssingles_state *state = space->machine().driver_data(); @@ -312,16 +363,48 @@ AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END + +static READ8_HANDLER( atamanot_prot_r ) +{ + ssingles_state *state = space->machine().driver_data(); + static const char prot_id[] = { "PROGRAM BY KOYAMA" }; + + logerror("%04x %02x\n",offset,state->m_atamanot_prot_state); + + switch(state->m_atamanot_prot_state) + { + case 0x20: + case 0x21: + case 0x22: + case 0x23: + return prot_id[offset % 0x11]; + + case 0xc0: + return 2; // 1 goes to service mode? + } + + return 0; +} + +static WRITE8_HANDLER( atamanot_prot_w ) +{ + ssingles_state *state = space->machine().driver_data(); + + state->m_atamanot_prot_state = data; +} + + static ADDRESS_MAP_START( atamanot_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x00ff) AM_WRITE(ssingles_videoram_w) AM_RANGE(0x0800, 0x08ff) AM_WRITE(ssingles_colorram_w) - AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x4000, 0x47ff) AM_RAM -// AM_RANGE(0x6000, 0x60ff) AM_RAM //kanji tilemap? - AM_RANGE(0x6000, 0x7fff) AM_ROM AM_REGION("question",0) - AM_RANGE(0x8000, 0x9fff) AM_ROM - AM_RANGE(0xc000, 0xc000) AM_READ( c000_r ) - AM_RANGE(0xc001, 0xc001) AM_READWRITE( c001_r, c001_w ) + AM_RANGE(0x6000, 0x60ff) AM_RAM //kanji tilemap? +// AM_RANGE(0x6000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x83ff) AM_READ(atamanot_prot_r) +// AM_RANGE(0x8000, 0x9fff) AM_ROM AM_REGION("question",0x10000) +// AM_RANGE(0xc000, 0xc000) AM_READ( c000_r ) +// AM_RANGE(0xc001, 0xc001) AM_READWRITE( c001_r, c001_w ) ADDRESS_MAP_END static ADDRESS_MAP_START( ssingles_io_map, AS_IO, 8 ) @@ -334,10 +417,24 @@ AM_RANGE(0x16, 0x16) AM_READ_PORT("DSW0") AM_RANGE(0x18, 0x18) AM_READ_PORT("DSW1") AM_RANGE(0x1c, 0x1c) AM_READ_PORT("INPUTS") - AM_RANGE(0x1a, 0x1a) AM_WRITENOP //video/crt related +// AM_RANGE(0x1a, 0x1a) AM_WRITENOP //video/crt related AM_RANGE(0xfe, 0xfe) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) AM_RANGE(0xff, 0xff) AM_DEVWRITE_MODERN("crtc", mc6845_device, register_w) +ADDRESS_MAP_END +static ADDRESS_MAP_START( atamanot_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_DEVWRITE("ay1", ay8910_address_w) + AM_RANGE(0x04, 0x04) AM_DEVWRITE("ay1", ay8910_data_w) + AM_RANGE(0x06, 0x06) AM_DEVWRITE("ay2", ay8910_address_w) + AM_RANGE(0x08, 0x08) AM_READNOP + AM_RANGE(0x0a, 0x0a) AM_DEVWRITE("ay2", ay8910_data_w) + AM_RANGE(0x16, 0x16) AM_READ_PORT("DSW0") + AM_RANGE(0x18, 0x18) AM_READ_PORT("DSW1") AM_WRITE(atamanot_prot_w) + AM_RANGE(0x1c, 0x1c) AM_READ_PORT("INPUTS") +// AM_RANGE(0x1a, 0x1a) AM_WRITENOP //video/crt related + AM_RANGE(0xfe, 0xfe) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) + AM_RANGE(0xff, 0xff) AM_DEVWRITE_MODERN("crtc", mc6845_device, register_w) ADDRESS_MAP_END static INPUT_PORTS_START( ssingles ) @@ -409,6 +506,61 @@ PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) INPUT_PORTS_END +/* +atamanot kanji gfx decoding: + +It looks "stolen" from an unknown Japanese computer? +*/ + +static const gfx_layout layout_8x8 = +{ + 8,8, + RGN_FRAC(1,2), + 2, + { RGN_FRAC(0,2), RGN_FRAC(1,2) }, + { STEP8(0,1) }, + { STEP8(0,8) }, + 8*8 +}; + + +static const gfx_layout layout_16x16 = +{ + 16,16, + RGN_FRAC(1,4), + 1, + { 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, + RGN_FRAC(1,4)+0, RGN_FRAC(1,4)+1, RGN_FRAC(1,4)+2, RGN_FRAC(1,4)+3, RGN_FRAC(1,4)+4, RGN_FRAC(1,4)+5, RGN_FRAC(1,4)+6, RGN_FRAC(1,4)+7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, + RGN_FRAC(2,4)+0*8, RGN_FRAC(2,4)+1*8, RGN_FRAC(2,4)+2*8, RGN_FRAC(2,4)+3*8, RGN_FRAC(2,4)+4*8, RGN_FRAC(2,4)+5*8, RGN_FRAC(2,4)+6*8, RGN_FRAC(2,4)+7*8 }, + 8*8 +}; + + +static const gfx_layout layout_8x16 = +{ + 8,16, + RGN_FRAC(1,2), + 1, + { 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, + RGN_FRAC(2,4)+0*8, RGN_FRAC(2,4)+1*8, RGN_FRAC(2,4)+2*8, RGN_FRAC(2,4)+3*8, RGN_FRAC(2,4)+4*8, RGN_FRAC(2,4)+5*8, RGN_FRAC(2,4)+6*8, RGN_FRAC(2,4)+7*8 }, + 8*8 +}; + +static GFXDECODE_START( ssingles ) + GFXDECODE_ENTRY( "gfx1", 0, layout_8x8, 0, 8 ) +GFXDECODE_END + +static GFXDECODE_START( atamanot ) + GFXDECODE_ENTRY( "gfx1", 0, layout_8x8, 0, 8 ) + GFXDECODE_ENTRY( "kanji", 0, layout_16x16, 0, 8 ) + GFXDECODE_ENTRY( "kanji_uc", 0, layout_8x16, 0, 8 ) + GFXDECODE_ENTRY( "kanji_lc", 0, layout_8x16, 0, 8 ) +GFXDECODE_END + static MACHINE_CONFIG_START( ssingles, ssingles_state ) MCFG_CPU_ADD("maincpu", Z80,4000000) /* ? MHz */ @@ -417,15 +569,16 @@ MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(4000000, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(ssingles) + MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) MCFG_PALETTE_LENGTH(4) //guess + MCFG_GFXDECODE(ssingles) + MCFG_VIDEO_START(ssingles) - MCFG_MC6845_ADD("crtc", MC6845, 1000000 /* ? MHz */, mc6845_intf) + MCFG_MC6845_ADD("crtc", MC6845, 1000000 /* ? MHz */, ssingles_mc6845_intf) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -438,9 +591,22 @@ MACHINE_CONFIG_END +static INTERRUPT_GEN( atamanot_irq ) +{ + // ... +} + static MACHINE_CONFIG_DERIVED( atamanot, ssingles ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(atamanot_map) + MCFG_CPU_IO_MAP(atamanot_io_map) + MCFG_CPU_VBLANK_INT("screen", atamanot_irq) + + MCFG_DEVICE_REMOVE("crtc") + + MCFG_MC6845_ADD("crtc", MC6845, 1000000 /* ? MHz */, atamanot_mc6845_intf) + + MCFG_GFXDECODE(atamanot) MACHINE_CONFIG_END ROM_START( ssingles ) @@ -450,6 +616,9 @@ ROM_LOAD( "3.bin", 0x08000, 0x2000, CRC(14fdcb65) SHA1(70f7fcb46e74937de0e4037c9fe79349a30d0d07) ) ROM_LOAD( "4.bin", 0x0a000, 0x2000, CRC(acb44685) SHA1(d68aab8b7e68d842a350d3fb76985ac857b1d972) ) + ROM_REGION( 0x100, "vram", ROMREGION_ERASE00 ) + ROM_REGION( 0x100, "cram", ROMREGION_ERASE00 ) + ROM_REGION( 0x10000, "gfx1", 0 ) ROM_LOAD( "9.bin", 0x0000, 0x4000, CRC(57fac6f9) SHA1(12f6695c9831399e599a95008ebf9db943725437) ) ROM_LOAD( "10.bin", 0x4000, 0x4000, CRC(cd3ba260) SHA1(2499ad9982cc6356e2eb3a0f10d77886872a0c9f) ) @@ -464,46 +633,14 @@ ROM_END -/* -atamanot kanji gfx decoding: - -static const gfx_layout layout_16x16 = -{ - 16,16, - RGN_FRAC(1,4), - 1, - { 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7, - RGN_FRAC(1,4)+0, RGN_FRAC(1,4)+1, RGN_FRAC(1,4)+2, RGN_FRAC(1,4)+3, RGN_FRAC(1,4)+4, RGN_FRAC(1,4)+5, RGN_FRAC(1,4)+6, RGN_FRAC(1,4)+7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - RGN_FRAC(2,4)+0*8, RGN_FRAC(2,4)+1*8, RGN_FRAC(2,4)+2*8, RGN_FRAC(2,4)+3*8, RGN_FRAC(2,4)+4*8, RGN_FRAC(2,4)+5*8, RGN_FRAC(2,4)+6*8, RGN_FRAC(2,4)+7*8 }, - 8*8 -}; - - -static const gfx_layout layout_8x16 = -{ - 8,16, - RGN_FRAC(1,2), - 1, - { 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - RGN_FRAC(2,4)+0*8, RGN_FRAC(2,4)+1*8, RGN_FRAC(2,4)+2*8, RGN_FRAC(2,4)+3*8, RGN_FRAC(2,4)+4*8, RGN_FRAC(2,4)+5*8, RGN_FRAC(2,4)+6*8, RGN_FRAC(2,4)+7*8 }, - 8*8 -}; - - GFXDECODE_ENTRY( "kanji", 0, layout_16x16, 0, 8 ) - GFXDECODE_ENTRY( "kanji_uc", 0, layout_8x16, 0, 8 ) - GFXDECODE_ENTRY( "kanji_lc", 0, layout_8x16, 0, 8 ) - -It looks "stolen" from an unknown Japanese computer? -*/ ROM_START( atamanot ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "tt1.2", 0x0000, 0x2000, CRC(da9e270d) SHA1(b7408be913dad8abf022c6153f2493204dd74952) ) - ROM_LOAD( "tt2.3", 0x8000, 0x2000, CRC(7595ade8) SHA1(71f9d6d987407f88cdd3b28bd1e35e00ac17e1f5) ) + ROM_LOAD( "tt2.3", 0x2000, 0x2000, CRC(7595ade8) SHA1(71f9d6d987407f88cdd3b28bd1e35e00ac17e1f5) ) + + ROM_REGION( 0x100, "vram", ROMREGION_ERASE00 ) + ROM_REGION( 0x100, "cram", ROMREGION_ERASE00 ) ROM_REGION( 0x18000, "question", 0 ) //question roms? ROM_LOAD( "ta.bin", 0x00000, 0x2000, CRC(5c61edaf) SHA1(ea56df6b320aa7e52828aaccbb5838cd0c756f24) ) @@ -521,8 +658,8 @@ ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "ca.49", 0x0000, 0x2000, CRC(28d20b52) SHA1(a104ef1cd103f31803b88bd2d4804eab5a26e7fa) ) - ROM_LOAD( "cb.47", 0x2000, 0x2000, CRC(8bc85c0c) SHA1(64701bc910c28666d15ee22f59f32888cc2302ae) ) - ROM_LOAD( "cc.48", 0x4000, 0x2000, CRC(209cab0d) SHA1(9a89af1f7186e4845e43f9cdafd273e69d280bfb) ) + ROM_LOAD( "cc.48", 0x2000, 0x2000, CRC(209cab0d) SHA1(9a89af1f7186e4845e43f9cdafd273e69d280bfb) ) + ROM_LOAD( "cb.47", 0x4000, 0x2000, CRC(8bc85c0c) SHA1(64701bc910c28666d15ee22f59f32888cc2302ae) ) ROM_LOAD( "cd.46", 0x6000, 0x2000, CRC(22e8d103) SHA1(f0146f7e192eef8d03404a9c5b8a9f9c9577d936) ) ROM_REGION( 0x20000, "kanji", 0 ) @@ -554,5 +691,5 @@ } GAME( 1983, ssingles, 0, ssingles, ssingles, ssingles, ROT90, "Ent. Ent. Ltd", "Swinging Singles", GAME_SUPPORTS_SAVE | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1983, atamanot, 0, atamanot, ssingles, ssingles, ROT90, "Yachiyo Denki / Uni Enterprize", "Computer Quiz Atama no Taisou (Japan)", GAME_NOT_WORKING ) +GAME( 1983, atamanot, 0, atamanot, ssingles, ssingles, ROT90, "Yachiyo Denki / Uni Enterprize", "Computer Quiz Atama no Taisou (Japan)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) diff -Nru mame-0.144/src/mame/drivers/sslam.c mame-0.145/src/mame/drivers/sslam.c --- mame-0.144/src/mame/drivers/sslam.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sslam.c 2012-02-06 21:30:37.000000000 +0000 @@ -724,10 +724,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(sslam) + MCFG_SCREEN_UPDATE_STATIC(sslam) MCFG_GFXDECODE(sslam) MCFG_PALETTE_LENGTH(0x800) @@ -755,10 +754,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(powerbls) + MCFG_SCREEN_UPDATE_STATIC(powerbls) MCFG_GFXDECODE(powerbls) MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/drivers/ssozumo.c mame-0.145/src/mame/drivers/ssozumo.c --- mame-0.144/src/mame/drivers/ssozumo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ssozumo.c 2012-02-06 21:30:36.000000000 +0000 @@ -39,12 +39,21 @@ AM_RANGE(0x6000, 0xffff) AM_ROM ADDRESS_MAP_END + +static WRITE8_HANDLER( sound_nmi_mask_w ) +{ + ssozumo_state *state = space->machine().driver_data(); + + state->m_sound_nmi_mask = data & 1; +} + +/* Same as Tag Team */ static ADDRESS_MAP_START( ssozumo_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x01ff) AM_RAM AM_RANGE(0x2000, 0x2001) AM_DEVWRITE("ay1", ay8910_data_address_w) AM_RANGE(0x2002, 0x2003) AM_DEVWRITE("ay2", ay8910_data_address_w) AM_RANGE(0x2004, 0x2004) AM_DEVWRITE("dac", dac_signed_w) - AM_RANGE(0x2005, 0x2005) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x2005, 0x2005) AM_WRITE(sound_nmi_mask_w) AM_RANGE(0x2007, 0x2007) AM_READ(soundlatch_r) AM_RANGE(0x4000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -172,6 +181,13 @@ GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 8*8, 2 ) GFXDECODE_END +static INTERRUPT_GEN( sound_timer_irq ) +{ + ssozumo_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( ssozumo, ssozumo_state ) @@ -182,16 +198,15 @@ MCFG_CPU_ADD("audiocpu", M6502, 975000) /* 975 kHz ?? */ MCFG_CPU_PROGRAM_MAP(ssozumo_sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,60*16) /* not accurate */ + MCFG_CPU_PERIODIC_INT(sound_timer_irq,272/16*57) // guess, assume to be the same as tagteam /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8 - 1, 1*8, 31*8 - 1) - MCFG_SCREEN_UPDATE(ssozumo) + MCFG_SCREEN_UPDATE_STATIC(ssozumo) MCFG_GFXDECODE(ssozumo) MCFG_PALETTE_LENGTH(64 + 16) diff -Nru mame-0.144/src/mame/drivers/sspeedr.c mame-0.145/src/mame/drivers/sspeedr.c --- mame-0.144/src/mame/drivers/sspeedr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/sspeedr.c 2012-02-06 21:30:35.000000000 +0000 @@ -198,11 +198,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.39) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(16 * 1000000 / 15680)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(376, 256) MCFG_SCREEN_VISIBLE_AREA(0, 375, 0, 247) - MCFG_SCREEN_UPDATE(sspeedr) - MCFG_SCREEN_EOF(sspeedr) + MCFG_SCREEN_UPDATE_STATIC(sspeedr) + MCFG_SCREEN_VBLANK_STATIC(sspeedr) MCFG_GFXDECODE(sspeedr) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/ssrj.c mame-0.145/src/mame/drivers/ssrj.c --- mame-0.144/src/mame/drivers/ssrj.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ssrj.c 2012-02-06 21:30:40.000000000 +0000 @@ -6,8 +6,8 @@ TODO: - colors (missing proms?) - dips - - proper video hw emulation - controls (is there START button ?) + - when a car sprite goes outside of the screen it gets stuck for a split frame on top of screen HW info : @@ -121,8 +121,8 @@ RGN_FRAC(1,3), /* 1024 characters */ 3, /* 3 bits per pixel */ { 0, RGN_FRAC(2,3), RGN_FRAC(1,3) }, /* the bitplanes are separated */ - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, 8*8 /* every char takes 8 consecutive bytes */ }; @@ -152,17 +152,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(2*8, 30*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(ssrj) + MCFG_SCREEN_SIZE(40*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 1*8, 31*8-1) // unknown res + MCFG_SCREEN_UPDATE_STATIC(ssrj) + MCFG_SCREEN_VBLANK_STATIC(ssrj) MCFG_GFXDECODE(ssrj) MCFG_PALETTE_LENGTH(128) MCFG_PALETTE_INIT(ssrj) MCFG_VIDEO_START(ssrj) -// MCFG_ASPECT_RATIO(3,4) MCFG_MACHINE_RESET(ssrj) @@ -195,4 +194,4 @@ ROM_END -GAME( 1985, ssrj, 0, ssrj, ssrj, 0, ORIENTATION_FLIP_X, "Taito Corporation", "Super Speed Race Junior (Japan)",GAME_WRONG_COLORS|GAME_IMPERFECT_GRAPHICS ) +GAME( 1985, ssrj, 0, ssrj, ssrj, 0, ROT90, "Taito Corporation", "Super Speed Race Junior (Japan)",GAME_WRONG_COLORS|GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/sstrangr.c mame-0.145/src/mame/drivers/sstrangr.c --- mame-0.144/src/mame/drivers/sstrangr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/sstrangr.c 2012-02-06 21:30:35.000000000 +0000 @@ -32,9 +32,9 @@ * *************************************/ -static SCREEN_UPDATE( sstrangr ) +static SCREEN_UPDATE_RGB32( sstrangr ) { - sstrangr_state *state = screen->machine().driver_data(); + sstrangr_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 0x2000; offs++) @@ -60,7 +60,7 @@ data = data >> 1; } - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; } @@ -81,16 +81,16 @@ } -static SCREEN_UPDATE( sstrngr2 ) +static SCREEN_UPDATE_RGB32( sstrngr2 ) { - sstrangr_state *state = screen->machine().driver_data(); + sstrangr_state *state = screen.machine().driver_data(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *color_map_base; get_pens(pens); - color_map_base = &screen->machine().region("proms")->base()[state->m_flip_screen ? 0x0000 : 0x0200]; + color_map_base = &screen.machine().region("proms")->base()[state->m_flip_screen ? 0x0000 : 0x0200]; for (offs = 0; offs < 0x2000; offs++) { @@ -119,7 +119,7 @@ data = data >> 1; } - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; x = x + 1; } @@ -200,11 +200,10 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 262) /* vert size is a guess, taken from mw8080bw */ MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(sstrangr) + MCFG_SCREEN_UPDATE_STATIC(sstrangr) /* sound hardware */ @@ -267,7 +266,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(sstrngr2) + MCFG_SCREEN_UPDATE_STATIC(sstrngr2) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/ssv.c mame-0.145/src/mame/drivers/ssv.c --- mame-0.144/src/mame/drivers/ssv.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/ssv.c 2012-02-06 21:30:35.000000000 +0000 @@ -162,7 +162,6 @@ #include "emu.h" #include "cpu/v810/v810.h" #include "cpu/v60/v60.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "machine/nvram.h" #include "sound/es5506.h" @@ -235,38 +234,40 @@ COMBINE_DATA(&state->m_irq_enable); } -static INTERRUPT_GEN( ssv_interrupt ) +static TIMER_DEVICE_CALLBACK( ssv_interrupt ) { - ssv_state *state = device->machine().driver_data(); + ssv_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device)) + if (scanline == 0) { if (state->m_interrupt_ultrax) { state->m_requested_int |= 1 << 1; // needed by ultrax to coin up, breaks cairblad - update_irq_state(device->machine()); + update_irq_state(timer.machine()); } } - else + else if(scanline == 240) { state->m_requested_int |= 1 << 3; // vblank - update_irq_state(device->machine()); + update_irq_state(timer.machine()); } } -static INTERRUPT_GEN( gdfs_interrupt ) +static TIMER_DEVICE_CALLBACK( gdfs_interrupt ) { - ssv_state *state = device->machine().driver_data(); + ssv_state *state = timer.machine().driver_data(); + int scanline = param; - if (cpu_getiloops(device)) + if ((scanline % 64) == 0) { state->m_requested_int |= 1 << 6; // reads lightgun (4 times for 4 axis) - update_irq_state(device->machine()); + update_irq_state(timer.machine()); } - else + else if(scanline == 240) { state->m_requested_int |= 1 << 3; // vblank - update_irq_state(device->machine()); + update_irq_state(timer.machine()); } } @@ -2721,17 +2722,16 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", V60, 16000000) /* Based on STA-0001 & STA-0001B System boards */ - MCFG_CPU_VBLANK_INT_HACK(ssv_interrupt,2) /* Vblank */ + MCFG_TIMER_ADD_SCANLINE("scantimer", ssv_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(ssv) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x1c6, 0x106) MCFG_SCREEN_VISIBLE_AREA(0, 0x150-1, 0, 0xf0-1) - MCFG_SCREEN_UPDATE(ssv) + MCFG_SCREEN_UPDATE_STATIC(ssv) MCFG_GFXDECODE(ssv) MCFG_PALETTE_LENGTH(0x8000) @@ -2772,14 +2772,15 @@ /* basic machine hardware */ MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(gdfs_map) - MCFG_CPU_VBLANK_INT_HACK(gdfs_interrupt,1+4) + MCFG_TIMER_MODIFY("scantimer") + MCFG_TIMER_CALLBACK(gdfs_interrupt) MCFG_EEPROM_93C46_ADD("eeprom") /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, (0xd5-0x2c)*2-1, 0, (0x102-0x12)-1) - MCFG_SCREEN_UPDATE(gdfs) + MCFG_SCREEN_UPDATE_STATIC(gdfs) MCFG_GFXDECODE(gdfs) MCFG_VIDEO_START(gdfs) @@ -2957,7 +2958,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VISIBLE_AREA(0, (0xca - 0x2a)*2-1, 0, (0xf6 - 0x16)-1) - MCFG_SCREEN_UPDATE(eaglshot) + MCFG_SCREEN_UPDATE_STATIC(eaglshot) MCFG_GFXDECODE(eaglshot) MCFG_VIDEO_START(eaglshot) diff -Nru mame-0.144/src/mame/drivers/st0016.c mame-0.145/src/mame/drivers/st0016.c --- mame-0.144/src/mame/drivers/st0016.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/st0016.c 2012-02-06 21:30:42.000000000 +0000 @@ -11,14 +11,12 @@ #include "emu.h" #include "cpu/v810/v810.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/st0016.h" #include "includes/st0016.h" -static int mux_port; UINT32 st0016_rom_bank; /************************************* @@ -47,8 +45,10 @@ xxxx - input port #2 xxxx - dip switches (2x8 bits) (multiplexed) */ + st0016_state *state = space->machine().driver_data(); int retval = input_port_read(space->machine(), "SYSTEM") & 0x0f; - switch(mux_port & 0x30) + + switch(state->mux_port & 0x30) { case 0x00: retval |= ((input_port_read(space->machine(), "DSW1") & 1) << 4) | ((input_port_read(space->machine(), "DSW1") & 0x10) << 1) | ((input_port_read(space->machine(), "DSW2") & 1) << 6) | ((input_port_read(space->machine(), "DSW2") & 0x10) <<3); break; @@ -59,12 +59,15 @@ case 0x30: retval |= ((input_port_read(space->machine(), "DSW1") & 8) << 1) | ((input_port_read(space->machine(), "DSW1") & 0x80) >> 2) | ((input_port_read(space->machine(), "DSW2") & 8) << 3) | ((input_port_read(space->machine(), "DSW2") & 0x80) ); break; } + return retval; } static WRITE8_HANDLER(mux_select_w) { - mux_port=data; + st0016_state *state = space->machine().driver_data(); + + state->mux_port=data; } WRITE8_HANDLER(st0016_rom_bank_w) @@ -410,13 +413,16 @@ // GFXDECODE_ENTRY( NULL, 0, charlayout, 0, 16*4 ) GFXDECODE_END -static INTERRUPT_GEN(st0016_int) +static TIMER_DEVICE_CALLBACK(st0016_int) { - if(!cpu_getiloops(device)) - device_set_input_line(device,0,HOLD_LINE); - else - if(cpu_get_reg(device, Z80_IFF1)) /* dirty hack ... */ - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE ); + st0016_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu,0,HOLD_LINE); + else if((scanline % 64) == 0) + if(cpu_get_reg(state->m_maincpu, Z80_IFF1)) /* dirty hack ... */ + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE ); } static const st0016_interface st0016_config = @@ -430,22 +436,20 @@ * *************************************/ -static MACHINE_CONFIG_START( st0016, driver_device ) +static MACHINE_CONFIG_START( st0016, st0016_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",Z80,8000000) /* 8 MHz ? */ MCFG_CPU_PROGRAM_MAP(st0016_mem) MCFG_CPU_IO_MAP(st0016_io) - - MCFG_CPU_VBLANK_INT_HACK(st0016_int,5) /* 4*nmi + int0 */ + MCFG_TIMER_ADD_SCANLINE("scantimer", st0016_int, "screen", 0, 1) /* 4*nmi + int0 */ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(48*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(st0016) + MCFG_SCREEN_UPDATE_STATIC(st0016) MCFG_GFXDECODE(st0016) MCFG_PALETTE_LENGTH(16*16*4+1) diff -Nru mame-0.144/src/mame/drivers/stadhero.c mame-0.145/src/mame/drivers/stadhero.c --- mame-0.144/src/mame/drivers/stadhero.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/stadhero.c 2012-02-06 21:30:36.000000000 +0000 @@ -226,10 +226,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(stadhero) + MCFG_SCREEN_UPDATE_STATIC(stadhero) MCFG_GFXDECODE(stadhero) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/starcrus.c mame-0.145/src/mame/drivers/starcrus.c --- mame-0.144/src/mame/drivers/starcrus.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/starcrus.c 2012-02-06 21:30:36.000000000 +0000 @@ -120,10 +120,10 @@ static const char *const starcrus_sample_names[] = { "*starcrus", - "engine.wav", /* engine sound, channel 0 */ - "explos1.wav", /* explosion sound, first part, channel 1 */ - "explos2.wav", /* explosion sound, second part, channel 1 */ - "launch.wav", /* launch sound, channels 2 and 3 */ + "engine", /* engine sound, channel 0 */ + "explos1", /* explosion sound, first part, channel 1 */ + "explos2", /* explosion sound, second part, channel 1 */ + "launch", /* launch sound, channels 2 and 3 */ 0 }; @@ -146,10 +146,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(starcrus) + MCFG_SCREEN_UPDATE_STATIC(starcrus) MCFG_GFXDECODE(starcrus) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/starfire.c mame-0.145/src/mame/drivers/starfire.c --- mame-0.144/src/mame/drivers/starfire.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/starfire.c 2012-02-06 21:30:37.000000000 +0000 @@ -270,9 +270,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(STARFIRE_PIXEL_CLOCK, STARFIRE_HTOTAL, STARFIRE_HBEND, STARFIRE_HBSTART, STARFIRE_VTOTAL, STARFIRE_VBEND, STARFIRE_VBSTART) - MCFG_SCREEN_UPDATE(starfire) + MCFG_SCREEN_UPDATE_STATIC(starfire) MCFG_VIDEO_START(starfire) diff -Nru mame-0.144/src/mame/drivers/starshp1.c mame-0.145/src/mame/drivers/starshp1.c --- mame-0.144/src/mame/drivers/starshp1.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/starshp1.c 2012-02-06 21:30:38.000000000 +0000 @@ -310,10 +310,9 @@ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(STARSHP1_PIXEL_CLOCK, STARSHP1_HTOTAL, STARSHP1_HBEND, STARSHP1_HBSTART, STARSHP1_VTOTAL, STARSHP1_VBEND, STARSHP1_VBSTART) - MCFG_SCREEN_UPDATE(starshp1) - MCFG_SCREEN_EOF(starshp1) + MCFG_SCREEN_UPDATE_STATIC(starshp1) + MCFG_SCREEN_VBLANK_STATIC(starshp1) MCFG_GFXDECODE(starshp1) MCFG_PALETTE_LENGTH(19) diff -Nru mame-0.144/src/mame/drivers/starwars.c mame-0.145/src/mame/drivers/starwars.c --- mame-0.144/src/mame/drivers/starwars.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/starwars.c 2012-02-06 21:30:39.000000000 +0000 @@ -338,7 +338,7 @@ MCFG_SCREEN_REFRESH_RATE(40) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 250, 0, 280) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_starwars) diff -Nru mame-0.144/src/mame/drivers/statriv2.c mame-0.145/src/mame/drivers/statriv2.c --- mame-0.144/src/mame/drivers/statriv2.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/statriv2.c 2012-02-06 21:30:41.000000000 +0000 @@ -166,7 +166,7 @@ statriv2_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset & 0x3ff); + state->m_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -177,13 +177,13 @@ * *************************************/ -static SCREEN_UPDATE( statriv2 ) +static SCREEN_UPDATE_IND16( statriv2 ) { - statriv2_state *state = screen->machine().driver_data(); - if (tms9927_screen_reset(screen->machine().device("tms"))) - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + statriv2_state *state = screen.machine().driver_data(); + if (tms9927_screen_reset(screen.machine().device("tms"))) + bitmap.fill(get_black_pen(screen.machine()), cliprect); else - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -602,9 +602,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 384, 0, 320, 270, 0, 240) - MCFG_SCREEN_UPDATE(statriv2) + MCFG_SCREEN_UPDATE_STATIC(statriv2) MCFG_TMS9927_ADD("tms", MASTER_CLOCK/2, tms9927_intf) diff -Nru mame-0.144/src/mame/drivers/stellafr.c mame-0.145/src/mame/drivers/stellafr.c --- mame-0.144/src/mame/drivers/stellafr.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/stellafr.c 2012-02-06 21:30:42.000000000 +0000 @@ -8,6 +8,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -15,35 +17,35 @@ { public: stellafr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( stellafr_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( stellafr_map, AS_PROGRAM, 16, stellafr_state ) AM_RANGE(0x000000, 0x01ffff) AM_ROM AM_RANGE(0xff0000, 0xffffff) AM_RAM - - - ADDRESS_MAP_END static INPUT_PORTS_START( stellafr ) - INPUT_PORTS_END static MACHINE_CONFIG_START( stellafr, stellafr_state ) - MCFG_CPU_ADD("maincpu", M68000, 10000000 ) //? MCFG_CPU_PROGRAM_MAP(stellafr_map) - MACHINE_CONFIG_END - ROM_START( st_ohla ) ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */ ROM_LOAD16_BYTE( "oh_la_la_f1_1.bin", 0x00000, 0x010000, CRC(94583885) SHA1(5083d65da0347a37ffbb537f94d3b247241f1e8c) ) @@ -57,5 +59,5 @@ ROM_END -GAME( 199?, st_ohla, 0, stellafr, stellafr, 0, ROT0, "Stella", "Oh La La (Stella)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, st_vulkn, 0, stellafr, stellafr, 0, ROT0, "Stella", "Vulkan (Stella)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(199?, st_ohla, 0, stellafr, stellafr, 0, ROT0, "Stella", "Oh La La (Stella)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, st_vulkn, 0, stellafr, stellafr, 0, ROT0, "Stella", "Vulkan (Stella)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/stepstag.c mame-0.145/src/mame/drivers/stepstag.c --- mame-0.144/src/mame/drivers/stepstag.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/stepstag.c 2012-02-06 21:30:39.000000000 +0000 @@ -215,7 +215,7 @@ }; /* sprites are contained in 256x256 "tiles" */ -static GFXLAYOUT_RAW( spritelayout, 8, 256, 256, 256*8, 256*256*8 ) +static GFXLAYOUT_RAW( spritelayout, 256, 256, 256*8, 256*256*8 ) static GFXDECODE_START( stepstag ) @@ -229,7 +229,7 @@ GFXDECODE_ENTRY( "gfx8", 0, layout_8x8x8, 0x6000, 0x10 ) // [3] Foreground GFXDECODE_END -static SCREEN_UPDATE( stepstag ) +static SCREEN_UPDATE_IND16( stepstag ) { return 0; } @@ -250,26 +250,23 @@ MCFG_SCREEN_ADD("lscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(stepstag) + MCFG_SCREEN_UPDATE_STATIC(stepstag) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(tetrisp2) + MCFG_SCREEN_UPDATE_STATIC(tetrisp2) MCFG_SCREEN_ADD("rscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(stepstag) + MCFG_SCREEN_UPDATE_STATIC(stepstag) MCFG_PALETTE_LENGTH(0x8000) diff -Nru mame-0.144/src/mame/drivers/stfight.c mame-0.145/src/mame/drivers/stfight.c --- mame-0.144/src/mame/drivers/stfight.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/stfight.c 2012-02-06 21:30:37.000000000 +0000 @@ -450,10 +450,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(stfight) + MCFG_SCREEN_UPDATE_STATIC(stfight) MCFG_GFXDECODE(stfight) MCFG_PALETTE_LENGTH(16*4+16*16+16*16+16*16) diff -Nru mame-0.144/src/mame/drivers/stlforce.c mame-0.145/src/mame/drivers/stlforce.c --- mame-0.144/src/mame/drivers/stlforce.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/stlforce.c 2012-02-06 21:30:36.000000000 +0000 @@ -197,10 +197,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 47*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(stlforce) + MCFG_SCREEN_UPDATE_STATIC(stlforce) MCFG_GFXDECODE(stlforce) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/st_mp100.c mame-0.145/src/mame/drivers/st_mp100.c --- mame-0.144/src/mame/drivers/st_mp100.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/st_mp100.c 2012-02-06 21:30:37.000000000 +0000 @@ -2,6 +2,9 @@ Stern MP-100 MPU (almost identical to Bally MPU-17) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -9,18 +12,28 @@ { public: st_mp100_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( st_mp100_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( st_mp100_map, AS_PROGRAM, 8, st_mp100_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( st_mp100 ) INPUT_PORTS_END -static MACHINE_RESET( st_mp100 ) +void st_mp100_state::machine_reset() { } @@ -32,8 +45,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(st_mp100_map) - - MCFG_MACHINE_RESET( st_mp100 ) MACHINE_CONFIG_END /*------------------------------------- @@ -156,15 +167,15 @@ ROM_RELOAD( 0xf800, 0x0800) ROM_END -GAME(1979, princess, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Cosmic Princess", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, dracula, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Dracula", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, hothand, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Hot Hand", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, lectrono, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Lectronamo", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, magic, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Magic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, memlane, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Memory Lane", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, nugent, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Nugent", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1977, pinball, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Pinball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, stars, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Stars", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1977, stingray, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Stingray", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, trident, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Trident", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, wildfyre, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Wildfyre", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1979, princess, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Cosmic Princess", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, dracula, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Dracula", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, hothand, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Hot Hand", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, lectrono, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Lectronamo", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, magic, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Magic", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, memlane, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Memory Lane", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, nugent, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Nugent", GAME_IS_SKELETON_MECHANICAL) +GAME(1977, pinball, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Pinball", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, stars, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Stars", GAME_IS_SKELETON_MECHANICAL) +GAME(1977, stingray, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Stingray", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, trident, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Trident", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, wildfyre, 0, st_mp100, st_mp100, st_mp100, ROT0, "Stern", "Wildfyre", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/st_mp200.c mame-0.145/src/mame/drivers/st_mp200.c --- mame-0.144/src/mame/drivers/st_mp200.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/st_mp200.c 2012-02-06 21:30:37.000000000 +0000 @@ -2,6 +2,9 @@ Stern MP-200 MPU (almost identical to Bally MPU-35) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6800/m6800.h" @@ -9,18 +12,28 @@ { public: st_mp200_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( st_mp200_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( st_mp200_map, AS_PROGRAM, 8, st_mp200_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( st_mp200 ) INPUT_PORTS_END -static MACHINE_RESET( st_mp200 ) +void st_mp200_state::machine_reset() { } @@ -32,8 +45,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6800, 1000000) MCFG_CPU_PROGRAM_MAP(st_mp200_map) - - MCFG_MACHINE_RESET( st_mp200 ) MACHINE_CONFIG_END /*-------------------------------- @@ -60,6 +71,7 @@ ROM_LOAD( "cpu_u6.716", 0x5800, 0x0800, CRC(801e9a66) SHA1(8634d6bd4af3e5ec3b736679393462961b76ede1)) ROM_RELOAD( 0xf800, 0x0800) ROM_END + /*-------------------------------- / Catacomb /-------------------------------*/ @@ -334,26 +346,26 @@ ROM_END -//GAME(1982, cue, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Cue", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, ali, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Ali", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, biggame, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Big Game", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, catacomp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Catacomb (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, cheetah, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Cheetah", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, dragfist, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Dragonfist", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, flight2k, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Flight 2000", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, freefall, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Freefall", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, galaxypi, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Galaxy", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, ironmaid, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Iron Maiden", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, lazrlord, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Lazer Lord", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, lightnin, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Lightning", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, meteorp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Meteor (Stern)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, nineball, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Nine Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, orbitor1, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Orbitor 1", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, quicksil, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Quicksilver", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, seawitch, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Seawitch", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, splitsec, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Split Second", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, stargzr, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Stargazer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, viperp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Viper (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, gamatron, flight2k, st_mp200, st_mp200, st_mp200, ROT0, "Pinstar", "Gamatron", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, blkshpsq, 0, st_mp200, st_mp200, st_mp200, ROT0, "Astro", "Black Sheep Squadron", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, st_game, 0, st_mp200, st_mp200, st_mp200, ROT0, "", "unknown pinball game", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +//GAME(1982, cue, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Cue", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, ali, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Ali", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, biggame, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Big Game", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, catacomp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Catacomb (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, cheetah, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Cheetah", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, dragfist, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Dragonfist", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, flight2k, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Flight 2000", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, freefall, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Freefall", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, galaxypi, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Galaxy", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, ironmaid, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Iron Maiden", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, lazrlord, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Lazer Lord", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, lightnin, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Lightning", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, meteorp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Meteor (Stern)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, nineball, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Nine Ball", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, orbitor1, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Orbitor 1", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, quicksil, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Quicksilver", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, seawitch, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Seawitch", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, splitsec, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Split Second", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, stargzr, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Stargazer", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, viperp, 0, st_mp200, st_mp200, st_mp200, ROT0, "Stern", "Viper (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, gamatron, flight2k, st_mp200, st_mp200, st_mp200, ROT0, "Pinstar", "Gamatron", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, blkshpsq, 0, st_mp200, st_mp200, st_mp200, ROT0, "Astro", "Black Sheep Squadron", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, st_game, 0, st_mp200, st_mp200, st_mp200, ROT0, "", "unknown pinball game", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/strnskil.c mame-0.145/src/mame/drivers/strnskil.c --- mame-0.144/src/mame/drivers/strnskil.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/strnskil.c 2012-02-06 21:30:35.000000000 +0000 @@ -19,7 +19,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/mb88xx/mb88xx.h" -#include "deprecat.h" #include "sound/sn76496.h" #include "includes/strnskil.h" @@ -27,10 +26,11 @@ static READ8_HANDLER( strnskil_d800_r ) { - /* bit0: interrupt type?, bit1: CPU2 busack? */ - if (cpu_getiloops(&space->device()) == 0) - return 0; - return 1; + strnskil_state *state = space->machine().driver_data(); + +/* bit0: interrupt type?, bit1: CPU2 busack? */ + + return (state->m_irq_source); } /****************************************************************************/ @@ -318,27 +318,41 @@ GFXDECODE_END +static TIMER_DEVICE_CALLBACK( strnskil_irq ) +{ + strnskil_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240 || scanline == 96) + { + device_set_input_line(state->m_maincpu,0,HOLD_LINE); + + state->m_irq_source = (scanline != 240); + } +} + + static MACHINE_CONFIG_START( strnskil, strnskil_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,8000000/2) /* 4.000MHz */ MCFG_CPU_PROGRAM_MAP(strnskil_map1) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", strnskil_irq, "screen", 0, 1) MCFG_CPU_ADD("sub", Z80,8000000/2) /* 4.000MHz */ MCFG_CPU_PROGRAM_MAP(strnskil_map2) - MCFG_CPU_VBLANK_INT_HACK(irq0_line_hold,2) + MCFG_CPU_PERIODIC_INT(irq0_line_hold,2*60) +// MCFG_QUANTUM_PERFECT_CPU("maincpu") MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_SIZE(32*8+3*8, 32*8+3*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(strnskil) + MCFG_SCREEN_UPDATE_STATIC(strnskil) MCFG_GFXDECODE(strnskil) MCFG_PALETTE_LENGTH(1024) @@ -524,5 +538,5 @@ GAME( 1984, strnskil, 0, strnskil, strnskil, 0, ROT0, "Sun Electronics", "Strength & Skill", 0 ) GAME( 1984, guiness, strnskil, strnskil, strnskil, 0, ROT0, "Sun Electronics", "The Guiness (Japan)", 0 ) -GAME( 1984, banbam, 0, banbam, banbam, banbam, ROT0, "Sun Electronics", "BanBam", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) -GAME( 1984, pettanp, banbam, strnskil, banbam, pettanp, ROT0, "Sun Electronics", "Pettan Pyuu (Japan)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) +GAME( 1984, banbam, 0, banbam, banbam, banbam, ROT0, "Sun Electronics", "BanBam", GAME_UNEMULATED_PROTECTION ) +GAME( 1984, pettanp, banbam, strnskil, banbam, pettanp, ROT0, "Sun Electronics", "Pettan Pyuu (Japan)", GAME_UNEMULATED_PROTECTION ) diff -Nru mame-0.144/src/mame/drivers/stv.c mame-0.145/src/mame/drivers/stv.c --- mame-0.144/src/mame/drivers/stv.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/stv.c 2012-02-06 21:30:35.000000000 +0000 @@ -2130,27 +2130,116 @@ ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ - ROM_LOAD16_WORD_SWAP( "ic22", 0x0200000, 0x0200000, CRC(d2ceade7) SHA1(a4300322e582f403d9207290f3900e1a72fcb9b9) ) // OK - ROM_LOAD16_WORD_SWAP( "ic24", 0x0400000, 0x0200000, CRC(0e968c2d) SHA1(fbcc7533fcb6b87cd8255fc2d307ae618301ea64) ) // OK - ROM_LOAD16_WORD_SWAP( "ic26", 0x0600000, 0x0200000, CRC(ab51da70) SHA1(85214aa805ffc9de59900dc0cd4e19e5ab756bf7) ) // OK - ROM_LOAD16_WORD_SWAP( "ic28", 0x0800000, 0x0200000, CRC(3a654b2a) SHA1(7398e25836bfbdeab6350759f25c420c3b496172) ) // OK - ROM_LOAD16_WORD_SWAP( "ic30", 0x0a00000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2_ic22", 0x0200000, 0x0200000, CRC(d2ceade7) SHA1(a4300322e582f403d9207290f3900e1a72fcb9b9) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2_ic24", 0x0400000, 0x0200000, CRC(0e968c2d) SHA1(fbcc7533fcb6b87cd8255fc2d307ae618301ea64) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2_ic26", 0x0600000, 0x0200000, CRC(ab51da70) SHA1(85214aa805ffc9de59900dc0cd4e19e5ab756bf7) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2_ic28", 0x0800000, 0x0200000, CRC(3a654b2a) SHA1(7398e25836bfbdeab6350759f25c420c3b496172) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2_ic30", 0x0a00000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player ROM_LOAD( "pclub2.nv", 0x0000, 0x0080, CRC(00d0f04e) SHA1(8b5a3e1c52e34443f83fd4a8948a00cacb5071d0) ) ROM_END +ROM_START( pclub2fc ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclub2fc_ic22", 0x0200000, 0x0200000, CRC(109c61a5) SHA1(bfb3e014e49064443ef290bc068ffcd459ae132d) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2fc_ic24", 0x0400000, 0x0200000, CRC(0ccc5538) SHA1(15133fc9c85f0a384d49841d874a0fe9a76057ce) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2fc_ic26", 0x0600000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2fc_ic28", 0x0800000, 0x0200000, CRC(ff9643ca) SHA1(3309f970f87324b06cc48add386019f769abcd89) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2fc_ic30", 0x0a00000, 0x0200000, CRC(03b9eacf) SHA1(d69c10f7613d9f52042dd6cce64e74e2b1ecc2d8) ) // OK + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "pclub2fc.nv", 0x0000, 0x0080, CRC(c8082326) SHA1(d24ad66eb01a58d3a117a49606003522b6f1feba) ) +ROM_END + +ROM_START( pclub298 ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclub298_ic22", 0x0200000, 0x0200000, CRC(cb0ec98a) SHA1(efef536cb3bc71207936b26b87f04641baded10b) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic24", 0x0400000, 0x0200000, CRC(645e7e24) SHA1(7362b0c4b500639c20ec27002f543a0b4390eaa8) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic26", 0x0600000, 0x0200000, CRC(9d3ad85d) SHA1(71fe330594ab58be331aa5311472855be07cb44c) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic28", 0x0800000, 0x0200000, CRC(877e73cc) SHA1(dd9928a3fe0ed759611e1b7be8ea10b45084e392) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic30", 0x0a00000, 0x0200000, CRC(03b9eacf) SHA1(d69c10f7613d9f52042dd6cce64e74e2b1ecc2d8) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic32", 0x0c00000, 0x0200000, CRC(62c10626) SHA1(58cb0ca0330fa7a62b277ab0ff84bff65b81bb23) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic34", 0x0e00000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub298_ic36", 0x1000000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "pclub298.nv", 0x0000, 0x0080, CRC(a23dd0f2) SHA1(457282b5d40a17477b95330bba91e05c603f951e) ) +ROM_END + +ROM_START( pclb298a ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclb298a_ic22", 0x0200000, 0x0200000, CRC(21a995ce) SHA1(6ee1250becd76bef3aa8044a42e10c3830a609bd) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic24", 0x0400000, 0x0200000, CRC(94540f39) SHA1(cee9fff48d177e7502802d366339ed922c212871) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic26", 0x0600000, 0x0200000, CRC(8b22c41f) SHA1(371f8b35ed45f695f5ec0c8db2c4b62007bf4782) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic28", 0x0800000, 0x0200000, CRC(bf68cec0) SHA1(550138f5110661d69eaff44c0596914a2621c3df) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic30", 0x0a00000, 0x0200000, CRC(ae276c06) SHA1(98358860ae9bf7c405ba4f763c7a4bf309ce85e3) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic32", 0x0c00000, 0x0200000, CRC(a3fb81f5) SHA1(6c78c97635dd486d2a7c09bc0511267eae6082c4) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic34", 0x0e00000, 0x0200000, CRC(04200dc9) SHA1(e40b01d12ccf71e50da7fd0f3000158626e5a98d) ) // OK + ROM_LOAD16_WORD_SWAP( "pclb298a_ic36", 0x1000000, 0x0200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) // (blank! - not tested) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "pclub298a.nv", 0x0000, 0x0080, CRC(b4440ff0) SHA1(bd3c83221ede11c68163df4b52a85856c83f865f) ) +ROM_END + + +ROM_START( pclubor ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclubor_ic22", 0x0200000, 0x0200000, CRC(b25072f7) SHA1(baa674e3d277bee152773b3b0e522677bfedd65c) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic24", 0x0400000, 0x0200000, CRC(a4863a0e) SHA1(b092b638b6a8d06776f88aac7e47fff06b4e8221) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic26", 0x0600000, 0x0200000, CRC(7f55baf7) SHA1(344f08590484a5ece3a64fe3e2e84a7d386fb8c1) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic28", 0x0800000, 0x0200000, CRC(cafd2a7d) SHA1(ff5f6ac7f5745d21db4a9c80eaec6f23d6084f23) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic30", 0x0a00000, 0x0200000, CRC(ccf6f885) SHA1(a01279a06cbc0c724c5c03b985f979458a2a2e65) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic32", 0x0c00000, 0x0200000, CRC(62e6d1e1) SHA1(5ea2ed73c5c02efbc85cd047983a02947ae829ff) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic34", 0x0e00000, 0x0200000, CRC(19cdd167) SHA1(a474134f58101dbbff3a47001ca26a69b03ce830) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubor_ic36", 0x1000000, 0x0200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) // (blank! - not tested) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "pclubor.nv", 0x0000, 0x0080, CRC(3ad918c0) SHA1(70b63d78948e2fc26fd95f98b93ed86c6130ed8e) ) +ROM_END + +ROM_START( pclubol ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclubol_ic22", 0x0200000, 0x0200000, CRC(668b1049) SHA1(a88ab4fbab73f85eb4da8d4792e98fbbefeba5f8) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic24", 0x0400000, 0x0200000, CRC(35721f04) SHA1(9658c9526a3d1dde89e1b6fd986b3469011813ca) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic26", 0x0600000, 0x0200000, CRC(17b3cc4b) SHA1(226eba06dd7db14fd3d10a1ca687293f2c93db9d) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic28", 0x0800000, 0x0200000, CRC(7cfaa530) SHA1(c04742acb692a028021188deea4617c9955db38c) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic30", 0x0a00000, 0x0200000, CRC(e1dd7854) SHA1(190b85f4e25d5b98ea893033004a6ee698ade8c4) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic32", 0x0c00000, 0x0200000, CRC(f0a3ded7) SHA1(574417b9fb234ea75893dd22c65d2a3c4e3e4aa1) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic34", 0x0e00000, 0x0200000, CRC(53aa9821) SHA1(b866e0255297d48fbcab93bc044e198bdff8c6d3) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubol_ic36", 0x1000000, 0x0200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) // (blank! - not tested) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "eeprom", 0x0000, 0x0080, CRC(a744ca03) SHA1(f82ca58469356fad8c0fc53d54e7a4714ba43dd3) ) +ROM_END + + ROM_START( pclub2v3 ) // set to 1p / runs with the USA bios STV_BIOS ROM_DEFAULT_BIOS( "us" ) ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ - ROM_LOAD16_WORD_SWAP( "ic22", 0x0200000, 0x0200000, BAD_DUMP CRC(f88347aa) SHA1(3e9ca105edbd6ce11ea4194eb1733785e87f92b2) ) // BAD - ROM_LOAD16_WORD_SWAP( "ic24", 0x0400000, 0x0200000, CRC(b5871198) SHA1(10d187eebcca5d70c5ae10d1a144685a96491126) ) // OK - ROM_LOAD16_WORD_SWAP( "ic26", 0x0600000, 0x0200000, CRC(d97034ed) SHA1(a7a0f659eefd539b2a1fd70ef394eed30ea54c0c) ) // OK - ROM_LOAD16_WORD_SWAP( "ic28", 0x0800000, 0x0200000, CRC(f1421506) SHA1(c384b695338144e5f051134bda73b059b678a7df) ) // OK - ROM_LOAD16_WORD_SWAP( "ic30", 0x0a00000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK (rom is blank?!) + ROM_LOAD16_WORD_SWAP( "pclub2v3_ic22", 0x0200000, 0x0200000, BAD_DUMP CRC(f88347aa) SHA1(3e9ca105edbd6ce11ea4194eb1733785e87f92b2) ) // BAD + ROM_LOAD16_WORD_SWAP( "pclub2v3_ic24", 0x0400000, 0x0200000, CRC(b5871198) SHA1(10d187eebcca5d70c5ae10d1a144685a96491126) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2v3_ic26", 0x0600000, 0x0200000, CRC(d97034ed) SHA1(a7a0f659eefd539b2a1fd70ef394eed30ea54c0c) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2v3_ic28", 0x0800000, 0x0200000, CRC(f1421506) SHA1(c384b695338144e5f051134bda73b059b678a7df) ) // OK + ROM_LOAD16_WORD_SWAP( "pclub2v3_ic30", 0x0a00000, 0x0200000, CRC(8d89877e) SHA1(7d76d48d64d7ac5411d714a4bb83f37e3e5b8df6) ) // OK (rom is blank?!) ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player ROM_LOAD( "pclub2v3.nv", 0x0000, 0x0080, CRC(a8a2d30c) SHA1(bdde3d62ff21190a23698058ff66e476a75a09aa) ) @@ -2162,16 +2251,33 @@ ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ - ROM_LOAD16_WORD_SWAP( "ic22", 0x0200000, 0x0200000, CRC(48ab8371) SHA1(1c2124afad6bc1f4de2619e6b915f78e91addf05) ) // OK - ROM_LOAD16_WORD_SWAP( "ic24", 0x0400000, 0x0200000, CRC(9915faea) SHA1(b96f64a8cbb1b9496bb566d0469975fddb4fbe98) ) // OK - ROM_LOAD16_WORD_SWAP( "ic26", 0x0600000, 0x0200000, CRC(054ad120) SHA1(987e812af099bb0aa5d43a4c10ae8345370a2606) ) // OK - ROM_LOAD16_WORD_SWAP( "ic28", 0x0800000, 0x0200000, CRC(3a654b2a) SHA1(7398e25836bfbdeab6350759f25c420c3b496172) ) // OK - ROM_LOAD16_WORD_SWAP( "ic30", 0x0a00000, 0x0200000, CRC(98747bef) SHA1(8d452507a9842a48cd1a7db8fde11a070a6f068b) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubpok_ic22", 0x0200000, 0x0200000, CRC(48ab8371) SHA1(1c2124afad6bc1f4de2619e6b915f78e91addf05) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubpok_ic24", 0x0400000, 0x0200000, CRC(9915faea) SHA1(b96f64a8cbb1b9496bb566d0469975fddb4fbe98) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubpok_ic26", 0x0600000, 0x0200000, CRC(054ad120) SHA1(987e812af099bb0aa5d43a4c10ae8345370a2606) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubpok_ic28", 0x0800000, 0x0200000, CRC(3a654b2a) SHA1(7398e25836bfbdeab6350759f25c420c3b496172) ) // OK + ROM_LOAD16_WORD_SWAP( "pclubpok_ic30", 0x0a00000, 0x0200000, CRC(98747bef) SHA1(8d452507a9842a48cd1a7db8fde11a070a6f068b) ) // OK ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player ROM_LOAD( "pclubpok.nv", 0x0000, 0x0080, CRC(4ba3f21a) SHA1(898a393fb2fc1961b68b7d4f383d5447e6c010e8) ) ROM_END +ROM_START( pclub2kc ) // set to 1p + STV_BIOS + + ROM_REGION32_BE( 0x3000000, "game0", ROMREGION_ERASE00 ) /* SH2 code */ + + ROM_LOAD16_WORD_SWAP( "pclub2kc_ic22", 0x0200000, 0x0200000, CRC(9eb4cfd7) SHA1(d74b00541419b5cde75409315fdc620a7cb3ac6b) ) // OK (tested as IC7) + ROM_LOAD16_WORD_SWAP( "pclub2kc_ic24", 0x0400000, 0x0200000, CRC(cf3b4080) SHA1(1963a45d391f8d591d3995231b26eba56c7896c6) ) // OK (tested as IC2) + ROM_LOAD16_WORD_SWAP( "pclub2kc_ic26", 0x0600000, 0x0200000, CRC(dbdcb1d7) SHA1(33bd8c9e351864cdd5f5be2aba62efda1c4a0f4f) ) // OK (tested as IC2) + ROM_LOAD16_WORD_SWAP( "pclub2kc_ic28", 0x0800000, 0x0200000, CRC(3c330c9b) SHA1(92f8e8d4f43db7c4ce431d17501492a7f8d8a867) ) // OK (tested as IC3) + ROM_LOAD16_WORD_SWAP( "pclub2kc_ic30", 0x0a00000, 0x0200000, CRC(00a0c702) SHA1(f2c4a7a51559f0ade96b8e6337cd1a1d61472de7) ) // OK (tested as IC3) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player + ROM_LOAD( "pclub2kc.nv", 0x0000, 0x0080, CRC(064366fe) SHA1(b85489ae19ddc0fbd67b441a6967f10a6cd22d45) ) +ROM_END + + + GAME( 1996, stvbios, 0, stv_slot, stv, stv, ROT0, "Sega", "ST-V Bios", GAME_IS_BIOS_ROOT ) @@ -2226,12 +2332,21 @@ GAME( 1998, twcup98, stvbios, stv, stv, twcup98, ROT0, "Tecmo", "Tecmo World Cup '98 (JUET 980410 V1.000)", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // player movement GAME( 1998, elandore, stvbios, stv, stv6b, elandore, ROT0, "Sai-Mate", "Touryuu Densetsu Elan-Doree / Elan Doree - Legend of Dragoon (JUET 980922 V1.006)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -/* Unemulated printer device */ +/* Unemulated printer / camera devices */ GAME( 1998, stress, stvbios, stv, stv, stv, ROT0, "Sega", "Stress Busters (J 981020 V1.000)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, nclubv3, stvbios, stv, stv, nameclv3, ROT0, "Sega", "Name Club Ver.3 (J 970723 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAME( 1997, pclub2, stvbios, stv, stv, stv, ROT0, "Atlus", "Print Club 2 (U 970921 V1.000)", GAME_NOT_WORKING ) +GAME( 1999, pclub2fc, pclub2, stv, stv, stv, ROT0, "Atlus", "Print Club 2 Felix The Cat (Rev. A) (J 970415 V1.100)", GAME_NOT_WORKING ) +GAME( 1997, pclub298, pclub2, stv, stv, stv, ROT0, "Atlus", "Print Club 2 '98 Spring Ver (J 971017 V1.100)", GAME_NOT_WORKING ) +GAME( 1998, pclb298a, pclub2, stv, stv, stv, ROT0, "Atlus", "Print Club 2 '98 Autumn Ver (J 980827 V1.000)", GAME_NOT_WORKING ) +GAME( 1999, pclubor, stvbios, stv, stv, stv, ROT0, "Atlus", "Print Club Goukakenran (J 991104 V1.000)", GAME_NOT_WORKING ) +GAME( 1999, pclubol, stvbios, stv, stv, stv, ROT0, "Atlus", "Print Club Olive (J 980717 V1.000)", GAME_NOT_WORKING ) GAME( 1999, pclub2v3, pclub2, stv, stv, stv, ROT0, "Atlus", "Print Club 2 Vol. 3 (U 990310 V1.000)", GAME_NOT_WORKING ) GAME( 1999, pclubpok, stvbios, stv, stv, stv, ROT0, "Atlus", "Print Club Pokemon B (U 991126 V1.000)", GAME_NOT_WORKING ) +GAME( 1997, pclub2kc, stvbios, stv, stv, stv, ROT0, "Atlus", "Print Club Kome Kome Club (J 970203 V1.000)", GAME_NOT_WORKING ) + + + /* Doing something.. but not enough yet */ GAME( 1995, vfremix, stvbios, stv, stv, vfremix, ROT0, "Sega", "Virtua Fighter Remix (JUETBKAL 950428 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/su2000.c mame-0.145/src/mame/drivers/su2000.c --- mame-0.144/src/mame/drivers/su2000.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/su2000.c 2012-02-06 21:30:35.000000000 +0000 @@ -0,0 +1,449 @@ +/*************************************************************************** + + Virtuality SU2000 hardware + + preliminary driver by Phil Bennett + + Known games: + * Dactyl Nightmare SP + * Virtual Boxing + * Buggy Ball + * Missile Command + * Zone Hunter + + + Hardware Info: + See: http://arianchen.de/su2000/status.html + + + TODO: + * Get system booting + * Add game software + * Fix i386 core issues (e.g. protected mode) + * Write MC88110 CPU core + * Emulate HDD and CD drive + * Emulate PIX 1000 card + * Emulate VID 1000 card + * Emulate tracker card + * Emulate format card + +***************************************************************************/ + + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "cpu/tms32031/tms32031.h" +#include "machine/8237dma.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/mc146818.h" +#include "machine/pcshare.h" +#include "machine/8042kbdc.h" +#include "machine/pckeybrd.h" +#include "machine/idectrl.h" +#include "video/pc_vga.h" + + +/************************************* + * + * Defines + * + *************************************/ + +#define I486_CLOCK 33000000 +#define MC68000_CLOCK XTAL_10MHz +#define TMS320C1_CLOCK XTAL_33_833MHz +#define MC88110_CLOCK XTAL_40MHz + +#define PC_RAM_SIZE (4096 * 1024) + + +/************************************* + * + * State + * + *************************************/ + +class su2000_state : public driver_device +{ +public: + su2000_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + device_t *m_pit8254; + device_t *m_pic8259_1; + device_t *m_pic8259_2; + device_t *m_dma8237_1; + device_t *m_dma8237_2; + + UINT32 *m_pc_ram; +}; + + +/************************************* + * + * Main CPU Memory Map + * + *************************************/ + +static ADDRESS_MAP_START( pcat_map, AS_PROGRAM, 32 ) + AM_RANGE(0x00000000, 0x0009ffff) AM_RAMBANK("mem_bank") + AM_RANGE(0x000c0000, 0x000c7fff) AM_ROM + AM_RANGE(0x000f0000, 0x000fffff) AM_ROM + AM_RANGE(0xffff0000, 0xffffffff) AM_ROM AM_REGION("maincpu", 0x0f0000) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pcat_io, AS_IO, 32 ) + AM_IMPORT_FROM(pcat32_io_common) +ADDRESS_MAP_END + + +/************************************* + * + * Inputs + * + *************************************/ + + +/************************************************************* + * + * Keyboard + * + *************************************************************/ + +static void su2000_set_keyb_int(running_machine &machine, int state) +{ + su2000_state *drv_state = machine.driver_data(); + pic8259_ir1_w(drv_state->m_pic8259_1, state); +} + +static void set_gate_a20(running_machine &machine, int a20) +{ + cputag_set_input_line(machine, "maincpu", INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + su2000_state *drv_state = machine.driver_data(); + pic8259_ir1_w(drv_state->m_pic8259_1, state); +} + +static int pcat_get_out2(running_machine &machine) +{ + su2000_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, + set_gate_a20, + keyboard_interrupt, + NULL, + pcat_get_out2, +}; + + +/************************************************************* + * + * IDE + * + *************************************************************/ + +#if 0 +static void ide_interrupt(device_t *device, int state) +{ + su2000_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} +#endif + + +/************************************************************* + * + * VGA + * + *************************************************************/ + +static READ8_HANDLER( vga_setting ) +{ + /* TODO */ + return 0xff; +} + +/************************************************************* + * + * PIC8259 Configuration + * + *************************************************************/ + +static WRITE_LINE_DEVICE_HANDLER( su2000_pic8259_1_set_int_line ) +{ + cputag_set_input_line(device->machine(), "maincpu", 0, state ? HOLD_LINE : CLEAR_LINE); +} + +static READ8_DEVICE_HANDLER( get_slave_ack ) +{ + su2000_state *state = device->machine().driver_data(); + + if (offset == 2) + { + // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(state->m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface su2000_pic8259_1_config = +{ + DEVCB_LINE(su2000_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_HANDLER(get_slave_ack) +}; + +static const struct pic8259_interface su2000_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + + +/************************************************************* + * + * PIT8254 Configuration + * + *************************************************************/ + +static const struct pit8253_config su2000_pit8254_config = +{ + { + { + 4772720/4, /* Heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* DRAM refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* PIO port C pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + + +/************************************* + * + * Interrupt Generation + * + *************************************/ + +static IRQ_CALLBACK( pc_irq_callback ) +{ + su2000_state *state = device->machine().driver_data(); + return pic8259_acknowledge(state->m_pic8259_1); +} + + +/************************************* + * + * Initialization + * + *************************************/ + +static MACHINE_START( su2000 ) +{ + su2000_state *state = machine.driver_data(); + address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + + state->m_pit8254 = machine.device("pit8254"); + state->m_pic8259_1 = machine.device("pic8259_1"); + state->m_pic8259_2 = machine.device("pic8259_2"); + state->m_dma8237_1 = machine.device("dma8237_1"); + state->m_dma8237_2 = machine.device("dma8237_2"); + + /* Configure RAM */ + state->m_pc_ram = auto_alloc_array_clear(machine, UINT32, PC_RAM_SIZE); + + /* Conventional memory */ + memory_set_bankptr(machine, "mem_bank", state->m_pc_ram); + + /* HMA */ + offs_t ram_limit = 0x100000 + PC_RAM_SIZE - 0x0a0000; + space->install_read_bank(0x100000, ram_limit - 1, "hma_bank"); + space->install_write_bank(0x100000, ram_limit - 1, "hma_bank"); + memory_set_bankptr(machine, "hma_bank", state->m_pc_ram + 0xa0000); + + device_set_irq_callback(machine.device("maincpu"), pc_irq_callback); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, su2000_set_keyb_int); + + kbdc8042_init(machine, &at8042); + + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} + +static MACHINE_RESET( su2000 ) +{ + +} + + +/************************************* + * + * Machine Configuration + * + *************************************/ + +static MACHINE_CONFIG_START( su2000, su2000_state ) + /* Basic machine hardware */ + MCFG_CPU_ADD("maincpu", I486, I486_CLOCK) + MCFG_CPU_PROGRAM_MAP(pcat_map) + MCFG_CPU_IO_MAP(pcat_io) + +#if 0 + MCFG_CPU_ADD("tracker", TMS32031, TMS320C1_CLOCK) + MCFG_CPU_PROGRAM_MAP(tracker_map) + + MCFG_CPU_ADD("pix_cpu1", MC88110, MC88110_CLOCK) + MCFG_CPU_PROGRAM_MAP(pix_cpu_a) + + MCFG_CPU_ADD("pix_cpu2", MC88110, MC88110_CLOCK) + MCFG_CPU_PROGRAM_MAP(pix_cpu_b) + + MCFG_CPU_ADD("format_c", M68000, XTAL_10MHz) + MCFG_CPU_PROGRAM_MAP(formatc_map) +#endif + + /* Video hardware */ + MCFG_FRAGMENT_ADD(pcvideo_vga) + MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // TODO + + MCFG_MACHINE_START(su2000) + MCFG_MACHINE_RESET(su2000) + MCFG_FRAGMENT_ADD(pcat_common) +MACHINE_CONFIG_END + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( su2000 ) + ROM_REGION(0x100000, "maincpu", 0) + ROM_LOAD("hmc86304_bios_v208.u7", 0xc0000, 0x08000, CRC(c6c32f1a) SHA1(a07ade7f0567e1978cd8cee73c6a5d7b5e5f947f) ) + ROM_LOAD("amibios_486dx_isa_bios.u32", 0xf0000, 0x10000, CRC(811d3639) SHA1(a64d6026c16ac8c79f22b2c241f149402449fafb) ) + + + ROM_REGION32_LE(0x1000000, "tracker", 0) + ROM_LOAD32_WORD("ver_151_03_u16.u16", 0x00000, 0x20000, CRC(8354d059) SHA1(a88df7cc259c1c39316cc3bff9e08aa4e8d3d2c0) ) + ROM_LOAD32_WORD("ver_151_03_u17.u17", 0x00002, 0x20000, CRC(ace4081d) SHA1(f57287ded53f8d127bcdc9e34b8adb356fe55e5e) ) + + ROM_REGION(0x8000, "format", 0) + ROM_LOAD("wfc062_212.u62", 0x00000, 0x08000, CRC(9a6b553a) SHA1(7045f733446866ee3171e175e1b22d9384fda1b5) ) + + + ROM_REGION(0x8000, "pals", 0) + /**********/ + /* Format */ + /**********/ + + /* GAL20V8A */ + ROM_LOAD("wfc065a.u65", 0x00000, 0x00100, NO_DUMP ) + + /* PALCE20V8H */ + ROM_LOAD("wfc066a.u66", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wfc067b.u67", 0x00000, 0x00100, NO_DUMP ) + + /* GAL16V8B */ + ROM_LOAD("wfc071a.u71", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wfc014a.u14", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wfc072a.u72", 0x00000, 0x00100, NO_DUMP ) + + /***********/ + /* PIX1000 */ + /***********/ + + /* PALCE16V8H */ + ROM_LOAD("wi01p006.u6", 0x00000, 0x00892, CRC(528142eb) SHA1(2c152c6540f3d38cb881296decba957f8b5c7c58) ) + ROM_LOAD("wi01p026.u26", 0x00000, 0x00892, CRC(528142eb) SHA1(2c152c6540f3d38cb881296decba957f8b5c7c58) ) + ROM_LOAD("wi01p044.u44", 0x00000, 0x00892, CRC(a2ad9cf8) SHA1(67d44807f7346baf87c15d35c27458b0a7d5de89) ) + ROM_LOAD("wi01p045.u45", 0x00000, 0x00892, CRC(e2a13df7) SHA1(eaa5ee3a92d11f0722934cb6d3443ead903dc78f) ) + ROM_LOAD("wi01p046.u46", 0x00000, 0x00892, CRC(4c22fba5) SHA1(6fabc7a0790f8b883b83fa6fe5f1ee1302d284e2) ) + ROM_LOAD("wi01p050.u50", 0x00000, 0x00892, CRC(7cb0931f) SHA1(394c100b33e5b8d1b2f4979399ad0791af39da28) ) + ROM_LOAD("wi01p053.u53", 0x00000, 0x00892, CRC(d2eb2493) SHA1(a66b4733da0f4f0869839630063c52a733f5ea8c) ) + ROM_LOAD("wi01p054.u54", 0x00000, 0x00892, CRC(96d3506e) SHA1(682ba8a7a17176ff41047cd9a9cfefdc2dc0fd64) ) + ROM_LOAD("wi01p056.u56", 0x00000, 0x00892, CRC(8bf57db4) SHA1(1a5315397b1903c36d7450e873603584db8a00e8) ) + ROM_LOAD("wi01p058.u58", 0x00000, 0x00892, CRC(882f6405) SHA1(e3b7c278f4ee9e0e11741d9ed7c5b32978a3d185) ) + ROM_LOAD("wi01p067.u67", 0x00000, 0x00892, CRC(a97cff8e) SHA1(78451a4bffecd4e1655e7a89971e28b47f5c8829) ) + ROM_LOAD("wi01p075.u75", 0x00000, 0x00892, CRC(3d1adb17) SHA1(b1af8c069de3df3c757e211b372f535b513c6326) ) + ROM_LOAD("wi01p079.u79", 0x00000, 0x00892, CRC(3d3ad152) SHA1(a769bc80514873c2f238e6c8842c5b23596b4a42) ) + ROM_LOAD("wi01p080.u80", 0x00000, 0x00892, CRC(657a4495) SHA1(c5bbd5e5f065a99f9f3d7ce89ca833779c338da5) ) + + /* PALCE20V8H */ + ROM_LOAD("wi01p048.u48", 0x00000, 0x00a92, CRC(b9958131) SHA1(058203eefb1645a446ff3ff4a170a673ad65076c) ) + ROM_LOAD("wi01p049.u49", 0x00000, 0x00a92, CRC(820d245a) SHA1(8690e6eb46617c3dc78e1b233970a9318101101c) ) + ROM_LOAD("wi01p070.u70", 0x00000, 0x00a92, CRC(4322291e) SHA1(e8751b585a4fb3f371e67616abf48c9d23847b77) ) + ROM_LOAD("wi01p072.u72", 0x00000, 0x00a92, CRC(fe77b66b) SHA1(aa13619346a566613f0fa9e3723419f65ffd3ea8) ) + ROM_LOAD("wi01p073.u73", 0x00000, 0x00a92, CRC(e02fe7c1) SHA1(ca22b30391453daae943007a0c04b5a28a958c18) ) + ROM_LOAD("wi01p074.u74", 0x00000, 0x00a92, CRC(fca2823c) SHA1(6628f1ba3827a3d333ed88c5f20ca94a1439c75e) ) + ROM_LOAD("wi01p083.u83", 0x00000, 0x00a92, CRC(902731aa) SHA1(862c2e6fb75fbd712aeaf9eb3b8a84210332fa66) ) + ROM_LOAD("wi01p092.u92", 0x00000, 0x00a92, CRC(f996657e) SHA1(01c2c774a9d5f4bcb78742cd606864eff512bfce) ) + + /* PALCE22V10 */ + ROM_LOAD("wi01p047.u47", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wi01p077.u77", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wi01p087.u87", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("wi01p025.u25", 0x00000, 0x00100, NO_DUMP ) + + /***********/ + /* Tracker */ + /***********/ + + /* TIBPAL16L8 */ + ROM_LOAD("u37 335d.u37", 0x00000, 0x00100, NO_DUMP ) + ROM_LOAD("u40 4116.u40", 0x00000, 0x00100, NO_DUMP ) + + /***********/ + /* VID1000 */ + /***********/ + + /* PALCE20V8H */ + ROM_LOAD("wi02p000.u23", 0x00000, 0x00a92, CRC(bab34c4b) SHA1(a3f4f17a122cc0d063cb700b3d183b894d857cb4) ) + ROM_LOAD("wi02p001.u32", 0x00000, 0x00a92, CRC(b438ce94) SHA1(f36c681b3d09835393a8be5079263915d3480b88) ) + ROM_LOAD("wi02p002.u22", 0x00000, 0x00a92, CRC(bab34c4b) SHA1(a3f4f17a122cc0d063cb700b3d183b894d857cb4) ) + ROM_LOAD("wi02p003.u31", 0x00000, 0x00a92, CRC(b438ce94) SHA1(f36c681b3d09835393a8be5079263915d3480b88) ) + ROM_LOAD("wi02p004.u6", 0x00000, 0x00a92, CRC(bab34c4b) SHA1(a3f4f17a122cc0d063cb700b3d183b894d857cb4) ) + ROM_LOAD("wi02p005.u14", 0x00000, 0x00a92, CRC(b438ce94) SHA1(f36c681b3d09835393a8be5079263915d3480b88) ) + ROM_LOAD("wi02p006.u5", 0x00000, 0x00a92, CRC(bab34c4b) SHA1(a3f4f17a122cc0d063cb700b3d183b894d857cb4) ) + ROM_LOAD("wi02p007.u13", 0x00000, 0x00a92, CRC(b438ce94) SHA1(f36c681b3d09835393a8be5079263915d3480b88) ) + + /* PALCE16V8H */ + ROM_LOAD("wi02p008.u51", 0x00000, 0x00892, CRC(7c421890) SHA1(49d0ab674a8cb4e18ae5ba570132111ed3ccd546) ) + ROM_LOAD("wi02p009.u49", 0x00000, 0x00892, CRC(ff63d60c) SHA1(8ee8629cc24cd18b944ffab3830ed474a1189179) ) + ROM_LOAD("wi02p010.u72", 0x00000, 0x00892, CRC(68f48053) SHA1(17ae9f5caa4b2f4ff700ce44294d3d2881bd4e62) ) + ROM_LOAD("wi02p011.u88", 0x00000, 0x00892, CRC(78701d0f) SHA1(089d5df945638cb811caa963430f5d6658c68947) ) + ROM_LOAD("wi02p012.u85", 0x00000, 0x00892, CRC(1c489ff9) SHA1(a0e1c00c9a5dd870b84f869070961d25724cea92) ) + ROM_LOAD("wi02p013.u86", 0x00000, 0x00892, CRC(19de958f) SHA1(a160f6b0e2a7e42457b470dbcf9415feaad880aa) ) + ROM_LOAD("wi02p014.u82", 0x00000, 0x00892, CRC(845e4d48) SHA1(6aaeabad0e86fe480773b4b51ca4f7c1c8935993) ) + ROM_LOAD("wi02p015.u74", 0x00000, 0x00892, CRC(a10d1876) SHA1(4091fa0a3abb2baeabcc6b250342cf29829af21a) ) + ROM_LOAD("wi02p016.u52", 0x00000, 0x00892, CRC(d84b58c2) SHA1(087b5a56ddb6bef6b1bc93b9a8e0d23de27aa399) ) + ROM_END + + +/************************************* + * + * Game driver(s) + * + *************************************/ + +GAME( 1993, su2000, 0, su2000, pc_keyboard, 0, ROT0, "Virtuality", "SU2000", GAME_IS_BIOS_ROOT | GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/drivers/sub.c mame-0.145/src/mame/drivers/sub.c --- mame-0.144/src/mame/drivers/sub.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sub.c 2012-02-06 21:30:35.000000000 +0000 @@ -130,11 +130,11 @@ { } -static SCREEN_UPDATE(sub) +static SCREEN_UPDATE_IND16(sub) { - sub_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; - const gfx_element *gfx_1 = screen->machine().gfx[1]; + sub_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; + const gfx_element *gfx_1 = screen.machine().gfx[1]; int y,x; int count = 0; @@ -435,10 +435,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(sub) + MCFG_SCREEN_UPDATE_STATIC(sub) MCFG_GFXDECODE(sub) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/subs.c mame-0.145/src/mame/drivers/subs.c --- mame-0.144/src/mame/drivers/subs.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/subs.c 2012-02-06 21:30:40.000000000 +0000 @@ -189,20 +189,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(subs) + MCFG_SCREEN_UPDATE_STATIC(subs_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(57) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(subs) + MCFG_SCREEN_UPDATE_STATIC(subs_right) MCFG_PALETTE_INIT(subs) diff -Nru mame-0.144/src/mame/drivers/subsino2.c mame-0.145/src/mame/drivers/subsino2.c --- mame-0.144/src/mame/drivers/subsino2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/subsino2.c 2012-02-06 21:30:40.000000000 +0000 @@ -85,7 +85,7 @@ UINT8 m_ss9601_byte_lo; UINT8 m_ss9601_byte_lo2; UINT8 *m_ss9601_reelrams[2]; - const rectangle *m_ss9601_reelrects; + rectangle m_ss9601_reelrects[3]; UINT8 m_ss9601_scrollctrl; UINT8 m_ss9601_tilesize; UINT8 m_ss9601_disable; @@ -104,7 +104,7 @@ Tilemaps Access ***************************************************************************/ -INLINE void ss9601_get_tile_info(layer_t *l, running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param) +INLINE void ss9601_get_tile_info(layer_t *l, running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, void *param) { int addr; UINT16 offs; @@ -153,20 +153,20 @@ { default: case TILE_8x8: - tilemap_mark_tile_dirty(l->tmap, offset); + l->tmap->mark_tile_dirty(offset); break; case TILE_8x32: offset &= ~0x180; for (int y = 0; y < 0x80*4; y += 0x80) - tilemap_mark_tile_dirty(l->tmap, offset + y); + l->tmap->mark_tile_dirty(offset + y); break; case TILE_64x32: offset &= ~0x187; for (int x = 0; x < 8; x++) for (int y = 0; y < 0x80*4; y += 0x80) - tilemap_mark_tile_dirty(l->tmap, offset + y + x); + l->tmap->mark_tile_dirty(offset + y + x); break; } } @@ -419,7 +419,7 @@ if (l->tilesize != sizes[i]) { l->tilesize = sizes[i]; - tilemap_mark_all_tiles_dirty(l->tmap); + l->tmap->mark_all_dirty(); } } } @@ -528,14 +528,6 @@ Video Update ***************************************************************************/ -static const rectangle mtrain_reelrects[3] = { { 0, 0, 0x00*8, 0x09*8-1 }, - { 0, 0, 0x09*8, 0x10*8-1 }, - { 0, 0, 0x10*8, 256-16-1 } }; - -static const rectangle xtrain_reelrects[3] = { { 0, 0, 0x00*8, 0x08*8-1 }, - { 0, 0, 0x08*8, 0x18*8-1 }, - { 0, 0, 0x18*8, 256-16-1 } }; - static VIDEO_START( subsino2 ) { subsino2_state *state = machine.driver_data(); @@ -555,10 +547,10 @@ l->tmap = tilemap_create(machine, i ? ss9601_get_tile_info_1 : ss9601_get_tile_info_0, tilemap_scan_rows, 8,8, 0x80,0x40); - tilemap_set_transparent_pen(l->tmap, 0); + l->tmap->set_transparent_pen(0); // line scroll - tilemap_set_scroll_rows(l->tmap, 0x200); + l->tmap->set_scroll_rows(0x200); l->videorams[VRAM_HI] = auto_alloc_array(machine, UINT8, 0x80 * 0x40); l->videorams[VRAM_LO] = auto_alloc_array(machine, UINT8, 0x80 * 0x40); @@ -575,7 +567,9 @@ state->m_ss9601_reelrams[VRAM_LO] = auto_alloc_array(machine, UINT8, 0x2000); memset(state->m_ss9601_reelrams[VRAM_HI], 0, 0x2000); memset(state->m_ss9601_reelrams[VRAM_LO], 0, 0x2000); - state->m_ss9601_reelrects = mtrain_reelrects; + state->m_ss9601_reelrects[0].set(0, 0, 0x00*8, 0x09*8-1); + state->m_ss9601_reelrects[1].set(0, 0, 0x09*8, 0x10*8-1); + state->m_ss9601_reelrects[2].set(0, 0, 0x10*8, 256-16-1); /* state_save_register_global_pointer(machine, state->m_ss9601_reelrams[VRAM_HI], 0x2000); @@ -591,30 +585,30 @@ static VIDEO_START( mtrain ) { - subsino2_state *state = machine.driver_data(); VIDEO_START_CALL( subsino2 ); - state->m_ss9601_reelrects = mtrain_reelrects; } static VIDEO_START( xtrain ) { subsino2_state *state = machine.driver_data(); VIDEO_START_CALL( subsino2 ); - state->m_ss9601_reelrects = xtrain_reelrects; + state->m_ss9601_reelrects[0].set(0, 0, 0x00*8, 0x08*8-1); + state->m_ss9601_reelrects[1].set(0, 0, 0x08*8, 0x18*8-1); + state->m_ss9601_reelrects[2].set(0, 0, 0x18*8, 256-16-1); } -static SCREEN_UPDATE( subsino2 ) +static SCREEN_UPDATE_IND16( subsino2 ) { - subsino2_state *state = screen->machine().driver_data(); + subsino2_state *state = screen.machine().driver_data(); int layers_ctrl = ~state->m_ss9601_disable; int y; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; if (msk != 0) layers_ctrl &= msk; } #endif @@ -643,9 +637,9 @@ { layer_t *l = &state->m_layers[i]; - tilemap_set_scroll_cols(l->tmap, 1); - tilemap_set_scroll_rows(l->tmap, 0x200); - tilemap_set_scrolly(l->tmap, 0, l->scroll_y + 1); + l->tmap->set_scroll_cols(1); + l->tmap->set_scroll_rows(0x200); + l->tmap->set_scrolly(0, l->scroll_y + 1); // line scroll @@ -655,11 +649,11 @@ if (mask_y[i]) scroll_dx = (l->scrollrams[VRAM_HI][y & mask_y[i]] << 8) + l->scrollrams[VRAM_LO][y & mask_y[i]]; - tilemap_set_scrollx(l->tmap, y, l->scroll_x + scroll_dx); + l->tmap->set_scrollx(y, l->scroll_x + scroll_dx); } } - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (layers_ctrl & 1) { @@ -667,8 +661,8 @@ if (l0_reel) { - tilemap_set_scroll_rows(l->tmap, 1); - tilemap_set_scroll_cols(l->tmap, 1); + l->tmap->set_scroll_rows(1); + l->tmap->set_scroll_cols(1); for (int r = 0; r < 3; r++) { @@ -682,7 +676,7 @@ int reeladdr = (visible.min_y / 0x10) * 0x80 + x; UINT16 reelscroll = (state->m_ss9601_reelrams[VRAM_HI][reeladdr] << 8) + state->m_ss9601_reelrams[VRAM_LO][reeladdr]; - tilemap_set_scrollx(l->tmap, 0, (reelscroll >> 9) * 8 + l->scroll_x - visible.min_x); + l->tmap->set_scrollx(0, (reelscroll >> 9) * 8 + l->scroll_x - visible.min_x); // wrap around at half tilemap (0x100) int reelscroll_y = (reelscroll & 0x100) + ((reelscroll + l->scroll_y - visible.min_y/0x10*0x10 + 1) & 0xff); @@ -695,8 +689,8 @@ { if ( reelwrap_y-1 <= visible.max_y ) tmp.max_y = reelwrap_y-1; - tilemap_set_scrolly(l->tmap, 0, reelscroll_y); - tilemap_draw(bitmap, &tmp, l->tmap, 0, 0); + l->tmap->set_scrolly(0, reelscroll_y); + l->tmap->draw(bitmap, tmp, 0, 0); tmp.max_y = visible.max_y; } @@ -705,8 +699,8 @@ { if ( reelwrap_y >= visible.min_y ) tmp.min_y = reelwrap_y; - tilemap_set_scrolly(l->tmap, 0, -((reelwrap_y &0xff) | (reelscroll_y & 0x100))); - tilemap_draw(bitmap, &tmp, l->tmap, 0, 0); + l->tmap->set_scrolly(0, -((reelwrap_y &0xff) | (reelscroll_y & 0x100))); + l->tmap->draw(bitmap, tmp, 0, 0); tmp.min_y = visible.min_y; } } @@ -714,11 +708,11 @@ } else { - tilemap_draw(bitmap,cliprect, l->tmap, 0, 0); + l->tmap->draw(bitmap, cliprect, 0, 0); } } - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, state->m_layers[1].tmap, 0, 0); + if (layers_ctrl & 2) state->m_layers[1].tmap->draw(bitmap, cliprect, 0, 0); // popmessage("scrl: %03x,%03x - %03x,%03x dis: %02x siz: %02x ctrl: %02x", state->m_layers[0].scroll_x,state->m_layers[0].scroll_y, state->m_layers[1].scroll_x,state->m_layers[1].scroll_y, state->m_ss9601_disable, state->m_ss9601_tilesize, state->m_ss9601_scrollctrl); @@ -1107,7 +1101,7 @@ if (l->tilesize != sizes[i]) { l->tilesize = sizes[i]; - tilemap_mark_all_tiles_dirty(l->tmap); + l->tmap->mark_all_dirty(); } } } @@ -2168,11 +2162,10 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 512, 256 ) MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 ) MCFG_SCREEN_REFRESH_RATE( 60 ) - MCFG_SCREEN_UPDATE( subsino2 ) + MCFG_SCREEN_UPDATE_STATIC( subsino2 ) MCFG_GFXDECODE( ss9601 ) MCFG_PALETTE_LENGTH( 256 ) @@ -2196,12 +2189,11 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 512, 256 ) MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-32-1 ) MCFG_SCREEN_REFRESH_RATE( 58.7270 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state - MCFG_SCREEN_UPDATE( subsino2 ) + MCFG_SCREEN_UPDATE_STATIC( subsino2 ) MCFG_GFXDECODE( ss9601 ) MCFG_PALETTE_LENGTH( 256 ) @@ -2230,12 +2222,11 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 512, 256 ) MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 ) MCFG_SCREEN_REFRESH_RATE( 58.7270 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state - MCFG_SCREEN_UPDATE( subsino2 ) + MCFG_SCREEN_UPDATE_STATIC( subsino2 ) MCFG_GFXDECODE( ss9601 ) MCFG_PALETTE_LENGTH( 256 ) @@ -2268,12 +2259,11 @@ // video hardware MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE( 512, 256 ) MCFG_SCREEN_VISIBLE_AREA( 0, 512-1, 0, 256-16-1 ) MCFG_SCREEN_REFRESH_RATE( 58.7270 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // game reads vblank state - MCFG_SCREEN_UPDATE( subsino2 ) + MCFG_SCREEN_UPDATE_STATIC( subsino2 ) MCFG_GFXDECODE( ss9601 ) MCFG_PALETTE_LENGTH( 256 ) diff -Nru mame-0.144/src/mame/drivers/subsino.c mame-0.145/src/mame/drivers/subsino.c --- mame-0.144/src/mame/drivers/subsino.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/subsino.c 2012-02-06 21:30:38.000000000 +0000 @@ -270,7 +270,7 @@ { subsino_state *state = space->machine().driver_data(); state->m_tiles_offset = (data & 1) ? 0x1000: 0; - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); // popmessage("gfx %02x",data); } @@ -278,14 +278,14 @@ { subsino_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); } static WRITE8_HANDLER( subsino_colorram_w ) { subsino_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tmap, offset); + state->m_tmap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_tile_info ) @@ -311,7 +311,7 @@ { subsino_state *state = machine.driver_data(); state->m_tmap = tilemap_create( machine, get_tile_info, tilemap_scan_rows, 8,8, 0x40,0x20 ); - tilemap_set_transparent_pen( state->m_tmap, 0 ); + state->m_tmap->set_transparent_pen(0 ); state->m_tiles_offset = 0; } @@ -321,7 +321,7 @@ { subsino_state *state = space->machine().driver_data(); state->m_reel1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_subsino_reel1_tile_info ) @@ -355,7 +355,7 @@ { subsino_state *state = space->machine().driver_data(); state->m_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_subsino_reel2_tile_info ) @@ -388,7 +388,7 @@ { subsino_state *state = space->machine().driver_data(); state->m_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_subsino_reel3_tile_info ) @@ -427,9 +427,9 @@ state->m_reel2_tilemap = tilemap_create(machine,get_subsino_reel2_tile_info,tilemap_scan_rows, 8, 32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_subsino_reel3_tile_info,tilemap_scan_rows, 8, 32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); } @@ -437,91 +437,91 @@ { subsino_state *state = machine.driver_data(); state->m_tmap = tilemap_create( machine, get_stisub_tile_info, tilemap_scan_rows, 8,8, 0x40,0x20 ); - tilemap_set_transparent_pen( state->m_tmap, 0 ); + state->m_tmap->set_transparent_pen(0 ); state->m_reel1_tilemap = tilemap_create(machine,get_stisub_reel1_tile_info,tilemap_scan_rows, 8, 32, 64, 8); state->m_reel2_tilemap = tilemap_create(machine,get_stisub_reel2_tile_info,tilemap_scan_rows, 8, 32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_stisub_reel3_tile_info,tilemap_scan_rows, 8, 32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); state->m_out_c = 0x08; } -static SCREEN_UPDATE( subsino ) +static SCREEN_UPDATE_IND16( subsino ) { - subsino_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + subsino_state *state = screen.machine().driver_data(); + bitmap.fill(0, cliprect); + state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } -// are these hardcoded, or registers? -static const rectangle visible1 = { 0*8, (14+48)*8-1, 4*8, (4+7)*8-1 }; -static const rectangle visible2 = { 0*8, (14+48)*8-1, 10*8, (10+7)*8-1 }; -static const rectangle visible3 = { 0*8, (14+48)*8-1, 18*8, (18+7)*8-1 }; - -static SCREEN_UPDATE( subsino_reels ) +static SCREEN_UPDATE_IND16( subsino_reels ) { - subsino_state *state = screen->machine().driver_data(); + subsino_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); } if (state->m_out_c&0x08) { - tilemap_draw(bitmap, &visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &visible3, state->m_reel3_tilemap, 0, 0); + // are these hardcoded, or registers? + const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 10*8, (10+7)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 18*8, (18+7)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } - tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } -// areas based on d-up game in attract mode -static const rectangle stisub_visible1 = { 0, 511, 0, 87 }; -static const rectangle stisub_visible2 = { 0, 511, 88, 143 }; -static const rectangle stisub_visible3 = { 0, 511, 144, 223 }; - -static SCREEN_UPDATE( stisub_reels ) +static SCREEN_UPDATE_IND16( stisub_reels ) { - subsino_state *state = screen->machine().driver_data(); + subsino_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); if (state->m_reel1_attr) { - tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap); + state->m_reel1_tilemap->mark_all_dirty(); + state->m_reel2_tilemap->mark_all_dirty(); + state->m_reel3_tilemap->mark_all_dirty(); } for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); } if (state->m_out_c&0x08) { - tilemap_draw(bitmap, &stisub_visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &stisub_visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &stisub_visible3, state->m_reel3_tilemap, 0, 0); + // areas based on d-up game in attract mode + const rectangle visible1(0, 511, 0, 87); + const rectangle visible2(0, 511, 88, 143); + const rectangle visible3(0, 511, 144, 223); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } - tilemap_draw(bitmap,cliprect, state->m_tmap, 0, 0); + state->m_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -977,9 +977,9 @@ // c = reel colour bank? state->m_out_c = data; - tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap); + state->m_reel1_tilemap->mark_all_dirty(); + state->m_reel2_tilemap->mark_all_dirty(); + state->m_reel3_tilemap->mark_all_dirty(); // popmessage("data %02x\n",data); } @@ -2629,10 +2629,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(subsino) + MCFG_SCREEN_UPDATE_STATIC(subsino) MCFG_GFXDECODE(subsino_depth3) @@ -2670,10 +2669,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(subsino) + MCFG_SCREEN_UPDATE_STATIC(subsino) MCFG_GFXDECODE(subsino_depth4) @@ -2700,10 +2698,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(subsino) + MCFG_SCREEN_UPDATE_STATIC(subsino) MCFG_GFXDECODE(subsino_depth4) @@ -2740,10 +2737,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(subsino_reels) + MCFG_SCREEN_UPDATE_STATIC(subsino_reels) MCFG_GFXDECODE(subsino_depth4_reels) @@ -2769,10 +2765,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(stisub_reels) + MCFG_SCREEN_UPDATE_STATIC(stisub_reels) MCFG_GFXDECODE(subsino_stisub) diff -Nru mame-0.144/src/mame/drivers/summit.c mame-0.145/src/mame/drivers/summit.c --- mame-0.144/src/mame/drivers/summit.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/summit.c 2012-02-06 21:30:33.000000000 +0000 @@ -34,10 +34,10 @@ { } -static SCREEN_UPDATE(summit) +static SCREEN_UPDATE_IND16(summit) { - summit_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + summit_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x0000; int y,x; @@ -61,6 +61,7 @@ } + static ADDRESS_MAP_START( mainmap, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x17ff) AM_ROM @@ -68,10 +69,10 @@ AM_RANGE(0x2800, 0x2bff) AM_RAM AM_BASE_MEMBER(summit_state, m_vram) AM_RANGE(0x3800, 0x3800) AM_READ_PORT("IN0") - AM_RANGE(0x3880, 0x3880) AM_WRITE(out_w) - AM_RANGE(0x3900, 0x3900) AM_READ_PORT("IN1") AM_WRITE(out_w) - AM_RANGE(0x3980, 0x3980) AM_WRITE(out_w) - AM_RANGE(0x3a00, 0x3a00) AM_READ_PORT("IN2") AM_WRITE(out_w) +// AM_RANGE(0x3880, 0x3880) AM_WRITE(out_w) + AM_RANGE(0x3900, 0x3900) AM_READ_PORT("IN1") AM_WRITE(out_w) // lamps +// AM_RANGE(0x3980, 0x3980) AM_WRITE(out_w) + AM_RANGE(0x3a00, 0x3a00) AM_READ_PORT("IN2") //AM_WRITE(out_w) AM_RANGE(0x3b00, 0x3b00) AM_READ_PORT("IN3") AM_RANGE(0x7000, 0x71ff) AM_RAM @@ -301,10 +302,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1) - MCFG_SCREEN_UPDATE(summit) + MCFG_SCREEN_UPDATE_STATIC(summit) MCFG_GFXDECODE(summit) @@ -335,4 +335,4 @@ ROM_END -GAME( 1981, pushover, 0, summit, summit, 0, ROT270, "Summit Coin", "Push Over (Summit Coin)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1981, pushover, 0, summit, summit, 0, ROT270, "Summit Coin", "Push Over (Summit Coin)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_WRONG_COLORS ) diff -Nru mame-0.144/src/mame/drivers/sumt8035.c mame-0.145/src/mame/drivers/sumt8035.c --- mame-0.144/src/mame/drivers/sumt8035.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/sumt8035.c 2012-02-06 21:30:40.000000000 +0000 @@ -9,6 +9,8 @@ hardware. We don't have the ROMs for that though. */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mcs48/mcs48.h" @@ -17,23 +19,27 @@ { public: sumt8035_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } -}; +protected: + // devices + required_device m_maincpu; +}; -static ADDRESS_MAP_START( sumt_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( sumt_map, AS_PROGRAM, 8, sumt8035_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM//poss wrong ADDRESS_MAP_END -static ADDRESS_MAP_START( sumt_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( sumt_portmap, AS_IO, 8, sumt8035_state ) ADDRESS_MAP_END - static INPUT_PORTS_START( summit ) PORT_START("IN0") PORT_DIPNAME( 0x01, 0x01, "IN0" ) @@ -248,5 +254,6 @@ ROM_LOAD( "ultnudge.p2", 0x0800, 0x000803, CRC(2e9fbd57) SHA1(3a6a695b6d8e9de5635186301dd857e5f1080078) ) ROM_END -GAME( 1981, sm_ngacc, 0, summit, summit, 0, ROT270, "Summit Coin", "Nudge Accumulator (Summit Coin)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1981, sm_ultng, 0, summit, summit, 0, ROT270, "Summit Coin", "Ultimate Nudge (Summit Coin)", GAME_NOT_WORKING|GAME_NO_SOUND ) + +GAME( 1981, sm_ngacc, 0, summit, summit, 0, ROT270, "Summit Coin", "Nudge Accumulator (Summit Coin)", GAME_IS_SKELETON ) +GAME( 1981, sm_ultng, 0, summit, summit, 0, ROT270, "Summit Coin", "Ultimate Nudge (Summit Coin)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/suna16.c mame-0.145/src/mame/drivers/suna16.c --- mame-0.144/src/mame/drivers/suna16.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/suna16.c 2012-02-06 21:30:42.000000000 +0000 @@ -24,7 +24,6 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/dac.h" #include "sound/2151intf.h" #include "sound/ay8910.h" @@ -740,13 +739,16 @@ Back Street Soccer ***************************************************************************/ -static INTERRUPT_GEN( bssoccer_interrupt ) +static TIMER_DEVICE_CALLBACK( bssoccer_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 1, HOLD_LINE); break; - case 1: device_set_input_line(device, 2, HOLD_LINE); break; - } + suna16_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); // does RAM to sprite buffer copy here } static MACHINE_CONFIG_START( bssoccer, suna16_state ) @@ -754,7 +756,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) /* ? */ MCFG_CPU_PROGRAM_MAP(bssoccer_map) - MCFG_CPU_VBLANK_INT_HACK(bssoccer_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", bssoccer_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 3579545) /* Z80B */ MCFG_CPU_PROGRAM_MAP(bssoccer_sound_map) @@ -773,10 +775,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna16) + MCFG_SCREEN_UPDATE_STATIC(suna16) MCFG_GFXDECODE(suna16) MCFG_PALETTE_LENGTH(512) @@ -833,10 +834,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna16) + MCFG_SCREEN_UPDATE_STATIC(suna16) MCFG_GFXDECODE(suna16) MCFG_PALETTE_LENGTH(512) @@ -883,10 +883,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna16) + MCFG_SCREEN_UPDATE_STATIC(suna16) MCFG_GFXDECODE(suna16) MCFG_PALETTE_LENGTH(512) @@ -939,7 +938,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 24000000/4) MCFG_CPU_PROGRAM_MAP(bestbest_map) - MCFG_CPU_VBLANK_INT_HACK(bssoccer_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", bssoccer_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, 24000000/4) MCFG_CPU_PROGRAM_MAP(bestbest_sound_map) @@ -956,10 +955,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.1734) // measured on pcb (15.6218kHz HSync) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(bestbest) + MCFG_SCREEN_UPDATE_STATIC(bestbest) MCFG_GFXDECODE(bestbest) MCFG_PALETTE_LENGTH(256*8) diff -Nru mame-0.144/src/mame/drivers/suna8.c mame-0.145/src/mame/drivers/suna8.c --- mame-0.144/src/mame/drivers/suna8.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/suna8.c 2012-02-06 21:30:37.000000000 +0000 @@ -36,7 +36,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "sound/2203intf.h" @@ -1511,10 +1510,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.10) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna8) + MCFG_SCREEN_UPDATE_STATIC(suna8) MCFG_GFXDECODE(suna8) MCFG_PALETTE_LENGTH(256) @@ -1576,10 +1574,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna8) + MCFG_SCREEN_UPDATE_STATIC(suna8) MCFG_GFXDECODE(suna8) MCFG_PALETTE_LENGTH(256) @@ -1616,18 +1613,25 @@ soundirq /* IRQ Line */ }; -static INTERRUPT_GEN( brickzn_interrupt ) +static TIMER_DEVICE_CALLBACK( brickzn_interrupt ) { - if (cpu_getiloops(device)) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - else device_set_input_line(device, 0, HOLD_LINE); + suna8_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + if(scanline == 112) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); + + // TODO: NMI enable } + static MACHINE_CONFIG_START( brickzn, suna8_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* SUNA PROTECTION BLOCK */ MCFG_CPU_PROGRAM_MAP(brickzn_map) -// MCFG_CPU_VBLANK_INT_HACK(brickzn_interrupt, 2) MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) // nmi breaks ramtest but is needed! MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* Z0840006PSC */ @@ -1641,10 +1645,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) // we're using IPT_VBLANK - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna8) + MCFG_SCREEN_UPDATE_STATIC(suna8) MCFG_GFXDECODE(suna8) MCFG_PALETTE_LENGTH(512) @@ -1683,14 +1686,15 @@ /* 1 x 24 MHz crystal */ -static INTERRUPT_GEN( hardhea2_interrupt ) +static TIMER_DEVICE_CALLBACK( hardhea2_interrupt ) { - if (cpu_getiloops(device)) - { - suna8_state *state = device->machine().driver_data(); - if (state->m_nmi_enable) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - else device_set_input_line(device, 0, HOLD_LINE); + suna8_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + if(scanline == 112) + if (state->m_nmi_enable) device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } static MACHINE_RESET( hardhea2 ) @@ -1700,9 +1704,11 @@ } static MACHINE_CONFIG_DERIVED( hardhea2, brickzn ) - MCFG_CPU_MODIFY("maincpu") /* SUNA T568009 */ + MCFG_DEVICE_REMOVE("maincpu") + + MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* SUNA T568009 */ MCFG_CPU_PROGRAM_MAP(hardhea2_map) - MCFG_CPU_VBLANK_INT_HACK(hardhea2_interrupt,2) /* IRQ & NMI */ + MCFG_TIMER_ADD_SCANLINE("scantimer", hardhea2_interrupt, "screen", 0, 1) MCFG_MACHINE_RESET(hardhea2) MCFG_PALETTE_LENGTH(256) @@ -1728,7 +1734,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(starfigh_map) - MCFG_CPU_VBLANK_INT_HACK(brickzn_interrupt,2) /* IRQ & NMI */ + MCFG_TIMER_ADD_SCANLINE("scantimer", brickzn_interrupt, "screen", 0, 1) /* The sound section is identical to that of hardhead */ MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ @@ -1740,10 +1746,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna8) + MCFG_SCREEN_UPDATE_STATIC(suna8) MCFG_GFXDECODE(suna8) MCFG_PALETTE_LENGTH(256) @@ -1773,22 +1778,12 @@ Spark Man ***************************************************************************/ -static INTERRUPT_GEN( sparkman_interrupt ) -{ - if (cpu_getiloops(device)) - { - suna8_state *state = device->machine().driver_data(); - if (state->m_nmi_enable) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - else device_set_input_line(device, 0, HOLD_LINE); -} - static MACHINE_CONFIG_START( sparkman, suna8_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(sparkman_map) - MCFG_CPU_VBLANK_INT_HACK(sparkman_interrupt,2) /* IRQ & NMI */ + MCFG_TIMER_ADD_SCANLINE("scantimer", hardhea2_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* ? */ MCFG_CPU_PROGRAM_MAP(hardhead_sound_map) @@ -1799,10 +1794,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0+16, 256-16-1) - MCFG_SCREEN_UPDATE(suna8) + MCFG_SCREEN_UPDATE_STATIC(suna8) MCFG_GFXDECODE(suna8) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/supbtime.c mame-0.145/src/mame/drivers/supbtime.c --- mame-0.144/src/mame/drivers/supbtime.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/supbtime.c 2012-02-06 21:30:41.000000000 +0000 @@ -358,10 +358,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(supbtime) + MCFG_SCREEN_UPDATE_STATIC(supbtime) MCFG_GFXDECODE(supbtime) MCFG_PALETTE_LENGTH(1024) @@ -401,10 +400,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(supbtime) + MCFG_SCREEN_UPDATE_STATIC(supbtime) MCFG_GFXDECODE(supbtime) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/supdrapo.c mame-0.145/src/mame/drivers/supdrapo.c --- mame-0.144/src/mame/drivers/supdrapo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/supdrapo.c 2012-02-06 21:30:34.000000000 +0000 @@ -87,9 +87,9 @@ } -static SCREEN_UPDATE( supdrapo ) +static SCREEN_UPDATE_IND16( supdrapo ) { - supdrapo_state *state = screen->machine().driver_data(); + supdrapo_state *state = screen.machine().driver_data(); int x, y; int count; int color; @@ -104,7 +104,7 @@ /* Global Column Coloring, GUESS! */ color = state->m_col_line[(x*2) + 1] ? (state->m_col_line[(x*2) + 1] - 1) & 7 : 0; - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[0], tile,color, 0, 0, x*8, y*8); + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], tile,color, 0, 0, x*8, y*8); count++; } @@ -256,8 +256,8 @@ AM_RANGE(0x8002, 0x8002) AM_READ_PORT("IN1") AM_WRITE(payout_w) AM_RANGE(0x8003, 0x8003) AM_READ_PORT("IN2") AM_WRITE(coinin_w) AM_RANGE(0x8004, 0x8004) AM_READ_PORT("IN3") AM_WRITE(debug8004_w) - AM_RANGE(0x8005, 0x8005) AM_READ_PORT("SW2") - AM_RANGE(0x8006, 0x8006) AM_READ_PORT("SW1") + AM_RANGE(0x8005, 0x8005) AM_READ_PORT("SW1") + AM_RANGE(0x8006, 0x8006) AM_READ_PORT("SW2") AM_RANGE(0x9000, 0x90ff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x9400, 0x9400) AM_READ(sdpoker_rng_r) AM_RANGE(0x9800, 0x9801) AM_DEVWRITE("aysnd", ay8910_data_address_w) @@ -294,10 +294,10 @@ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Cancel") PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Deal") PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Bet/Play") PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin : 10") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin : 5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin : 2") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin : 1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 4: 10") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 3: 5") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 2: 2") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Coin 1: 1") PORT_START("IN3") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Hold 5") PORT_PLAYER(2) @@ -312,71 +312,67 @@ PORT_START("IN4") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Flip") PORT_PLAYER(1) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Flip") PORT_PLAYER(2) - PORT_DIPNAME( 0x04, 0x00, "4-3" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "4-4" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, "4-5" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_W) PORT_SERVICE_NO_TOGGLE( 0x40, IP_ACTIVE_HIGH ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, "1 Player" ) PORT_DIPSETTING( 0x80, "2 Players" ) - PORT_START("SW1") - PORT_DIPNAME( 0x01, 0x01, "Auto Bet" ) + PORT_START("SW1") // Bank 1 @ 8A + PORT_DIPNAME( 0x0f, 0x02, "Payout Percentage" ) PORT_DIPLOCATION("SW1:1,2,3,4") + PORT_DIPSETTING( 0x00, "25%" ) + PORT_DIPSETTING( 0x01, "30%" ) + PORT_DIPSETTING( 0x02, "35%" ) + PORT_DIPSETTING( 0x03, "40%" ) + PORT_DIPSETTING( 0x04, "45%" ) + PORT_DIPSETTING( 0x05, "50%" ) + PORT_DIPSETTING( 0x06, "55%" ) + PORT_DIPSETTING( 0x07, "60%" ) + PORT_DIPSETTING( 0x08, "65%" ) + PORT_DIPSETTING( 0x09, "70%" ) + PORT_DIPSETTING( 0x0a, "75%" ) + PORT_DIPSETTING( 0x0b, "80%" ) + PORT_DIPSETTING( 0x0c, "85%" ) + PORT_DIPSETTING( 0x0d, "90%" ) + PORT_DIPSETTING( 0x0e, "95%" ) + PORT_DIPSETTING( 0x0f, "100%" ) + PORT_DIPNAME( 0x30, 0x10, "Maximum Payout Points" ) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPSETTING( 0x00, "0" ) + PORT_DIPSETTING( 0x10, "200" ) + PORT_DIPSETTING( 0x20, "500" ) + PORT_DIPSETTING( 0x30, "1000" ) + PORT_DIPNAME( 0xc0, 0xc0, "Maximum Bet Points" ) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPSETTING( 0x40, "10" ) + PORT_DIPSETTING( 0x80, "15" ) + PORT_DIPSETTING( 0xc0, "30" ) + + PORT_START("SW2") // Bank 2 @ 9A + PORT_DIPNAME( 0x01, 0x01, "Deal Play Last Amount" ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x02, 0x02, "Allow Raise" ) + PORT_DIPNAME( 0x02, 0x02, "Allow Raise" ) PORT_DIPLOCATION("SW2:2") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x04, "Double-Up" ) + PORT_DIPNAME( 0x04, 0x04, "Red/Black Double-Up" ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x08, "Minimal Winner Hand" ) + PORT_DIPNAME( 0x08, 0x08, "Minimum Winning Hand" ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "Jacks or Better" ) - PORT_DIPSETTING( 0x00, "Two Pair" ) - PORT_DIPNAME( 0x10, 0x00, "Deal Speed" ) + PORT_DIPSETTING( 0x00, "Two Pair or Better" ) + PORT_DIPNAME( 0x10, 0x10, "Deal Speed" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x00, "Slow" ) PORT_DIPSETTING( 0x10, "Fast" ) - PORT_DIPNAME( 0x20, 0x00, "Aces Type" ) - PORT_DIPSETTING( 0x00, "Normal Aces" ) - PORT_DIPSETTING( 0x20, "Number 1" ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Language ) ) + PORT_DIPNAME( 0x20, 0x20, "Flash Buttons" ) PORT_DIPLOCATION("SW2:6") + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x00, DEF_STR( English ) ) PORT_DIPSETTING( 0x40, DEF_STR( French ) ) - PORT_DIPNAME( 0x80, 0x00, "Cards Deck Type" ) + PORT_DIPNAME( 0x80, 0x00, "Cards Deck Type" ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x00, "English Cards" ) PORT_DIPSETTING( 0x80, "French Cards" ) - - PORT_START("SW2") - PORT_DIPNAME( 0x01, 0x00, "6-1" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "6-2" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, "6-3" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "6-4" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, "6-5" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, "6-6" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0xc0, "Max Bet" ) - PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPSETTING( 0x40, "10" ) - PORT_DIPSETTING( 0x80, "15" ) - PORT_DIPSETTING( 0xc0, "30" ) INPUT_PORTS_END @@ -445,10 +441,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(supdrapo) + MCFG_SCREEN_UPDATE_STATIC(supdrapo) MCFG_GFXDECODE(supdrapo) MCFG_PALETTE_LENGTH(0x100) diff -Nru mame-0.144/src/mame/drivers/superchs.c mame-0.145/src/mame/drivers/superchs.c --- mame-0.144/src/mame/drivers/superchs.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/superchs.c 2012-02-06 21:30:35.000000000 +0000 @@ -386,10 +386,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(superchs) + MCFG_SCREEN_UPDATE_STATIC(superchs) MCFG_GFXDECODE(superchs) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/superdq.c mame-0.145/src/mame/drivers/superdq.c --- mame-0.144/src/mame/drivers/superdq.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/superdq.c 2012-02-06 21:30:37.000000000 +0000 @@ -24,16 +24,17 @@ #include "cpu/z80/z80.h" #include "render.h" #include "sound/sn76496.h" -#include "machine/laserdsc.h" +#include "machine/ldv1000.h" #include "video/resnet.h" class superdq_state : public driver_device { public: superdq_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } - device_t *m_laserdisc; + required_device m_laserdisc; UINT8 m_ld_in_latch; UINT8 m_ld_out_latch; @@ -57,11 +58,11 @@ state->m_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( superdq ) +static SCREEN_UPDATE_IND16( superdq ) { - superdq_state *state = screen->machine().driver_data(); + superdq_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -129,12 +130,12 @@ /* status is read when the STATUS line from the laserdisc toggles (600usec after the vblank). We could set up a timer to do that, but this works as well */ - state->m_ld_in_latch = laserdisc_data_r(state->m_laserdisc); + state->m_ld_in_latch = state->m_laserdisc->status_r(); /* command is written when the COMMAND line from the laserdisc toggles (680usec after the vblank). We could set up a timer to do that, but this works as well */ - laserdisc_data_w(state->m_laserdisc, state->m_ld_out_latch); + state->m_laserdisc->data_w(state->m_ld_out_latch); device_set_input_line(device, 0, ASSERT_LINE); } @@ -143,7 +144,7 @@ superdq_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( superdq_io_w ) @@ -316,9 +317,6 @@ static MACHINE_START( superdq ) { - superdq_state *state = machine.driver_data(); - - state->m_laserdisc = machine.device("laserdisc"); } @@ -333,11 +331,11 @@ MCFG_MACHINE_START(superdq) MCFG_MACHINE_RESET(superdq) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_LDV1000, "screen", "ldsound") - MCFG_LASERDISC_OVERLAY(superdq, 256, 256, BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_LDV1000_ADD("laserdisc") + MCFG_LASERDISC_OVERLAY_STATIC(256, 256, superdq) /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_INDEXED16) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_GFXDECODE(superdq) MCFG_PALETTE_LENGTH(32) @@ -351,7 +349,7 @@ MCFG_SOUND_ADD("snsnd", SN76496, MASTER_CLOCK/8) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.8) - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/superqix.c mame-0.145/src/mame/drivers/superqix.c --- mame-0.144/src/mame/drivers/superqix.c 2012-01-13 15:34:52.000000000 +0000 +++ mame-0.145/src/mame/drivers/superqix.c 2012-02-06 21:30:36.000000000 +0000 @@ -101,7 +101,6 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "deprecat.h" #include "cpu/m6805/m6805.h" #include "cpu/mcs51/mcs51.h" #include "sound/ay8910.h" @@ -1014,20 +1013,32 @@ DEVCB_NULL }; +static INTERRUPT_GEN( vblank_irq ) +{ + superqix_state *state = device->machine().driver_data(); + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} -static INTERRUPT_GEN( sqix_interrupt ) +static TIMER_DEVICE_CALLBACK( sqix_timer_irq ) { + superqix_state *state = timer.machine().driver_data(); + int scanline = param; + /* highly suspicious... */ - if (cpu_getiloops(device) <= 3) - nmi_line_assert(device); + if (((scanline % 64) == 0) && state->m_nmi_mask) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, ASSERT_LINE); } -static INTERRUPT_GEN( bootleg_interrupt ) +static TIMER_DEVICE_CALLBACK( sqixbl_timer_irq ) { + superqix_state *state = timer.machine().driver_data(); + int scanline = param; + /* highly suspicious... */ - if (cpu_getiloops(device) <= 3) - nmi_line_pulse(device); + if (((scanline % 64) == 0) && state->m_nmi_mask) + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); } @@ -1036,7 +1047,7 @@ MCFG_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(pbillian_port_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_MACHINE_START(pbillian) @@ -1044,10 +1055,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pbillian) + MCFG_SCREEN_UPDATE_STATIC(pbillian) MCFG_GFXDECODE(pbillian) MCFG_PALETTE_LENGTH(512) @@ -1069,7 +1079,7 @@ MCFG_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(hotsmash_port_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("mcu", M68705, 4000000) /* ???? */ MCFG_CPU_PROGRAM_MAP(m68705_map) @@ -1080,10 +1090,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(pbillian) + MCFG_SCREEN_UPDATE_STATIC(pbillian) MCFG_GFXDECODE(pbillian) MCFG_PALETTE_LENGTH(512) @@ -1107,7 +1116,7 @@ MCFG_CPU_ADD("maincpu", Z80, 12000000/2) /* 6 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(sqix_port_map) - MCFG_CPU_VBLANK_INT_HACK(sqix_interrupt,6) /* ??? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", sqix_timer_irq, "screen", 0, 1) /* ??? */ MCFG_CPU_ADD("mcu", I8751, 12000000/3) /* ??? */ MCFG_CPU_IO_MAP(bootleg_mcu_io_map) @@ -1120,10 +1129,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(superqix) + MCFG_SCREEN_UPDATE_STATIC(superqix) MCFG_GFXDECODE(sqix) MCFG_PALETTE_LENGTH(256) @@ -1156,7 +1164,7 @@ MCFG_CPU_ADD("maincpu", Z80, 12000000/2) /* 6 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(bootleg_port_map) - MCFG_CPU_VBLANK_INT_HACK(bootleg_interrupt,6) /* ??? */ + MCFG_TIMER_ADD_SCANLINE("scantimer", sqixbl_timer_irq, "screen", 0, 1) /* ??? */ MCFG_MACHINE_START(superqix) @@ -1164,10 +1172,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(superqix) + MCFG_SCREEN_UPDATE_STATIC(superqix) MCFG_GFXDECODE(sqix) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/supertnk.c mame-0.145/src/mame/drivers/supertnk.c --- mame-0.144/src/mame/drivers/supertnk.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/supertnk.c 2012-02-06 21:30:36.000000000 +0000 @@ -242,9 +242,9 @@ } -static SCREEN_UPDATE( supertnk ) +static SCREEN_UPDATE_RGB32( supertnk ) { - supertnk_state *state = screen->machine().driver_data(); + supertnk_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 0x2000; offs++) @@ -261,7 +261,7 @@ for (i = 0; i < 8; i++) { UINT8 color = ((data0 & 0x80) >> 5) | ((data1 & 0x80) >> 6) | ((data2 & 0x80) >> 7); - *BITMAP_ADDR32(bitmap, y, x) = state->m_pens[color]; + bitmap.pix32(y, x) = state->m_pens[color]; data0 = data0 << 1; data1 = data1 << 1; @@ -434,12 +434,11 @@ MCFG_VIDEO_START(supertnk) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_UPDATE(supertnk) + MCFG_SCREEN_UPDATE_STATIC(supertnk) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/superwng.c mame-0.145/src/mame/drivers/superwng.c --- mame-0.144/src/mame/drivers/superwng.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/superwng.c 2012-02-06 21:30:36.000000000 +0000 @@ -99,26 +99,26 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 64); + state->m_bg_tilemap->set_scrollx(0, 64); } -static SCREEN_UPDATE( superwng ) +static SCREEN_UPDATE_IND16( superwng ) { - superwng_state *state = screen->machine().driver_data(); - int flip=flip_screen_get(screen->machine()); + superwng_state *state = screen.machine().driver_data(); + int flip=flip_screen_get(screen.machine()); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - rectangle tmp=*cliprect; + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + rectangle tmp=cliprect; if(flip) { tmp.min_x+=32; - tilemap_draw(bitmap, &tmp, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, tmp, 0, 0); } else { tmp.max_x-=32; - tilemap_draw(bitmap, &tmp, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, tmp, 0, 0); } { @@ -140,7 +140,7 @@ if(state->m_videoram_bg[i+1] | state->m_colorram_bg[i]) { - drawgfx_transpen(bitmap, cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect,screen.machine().gfx[1], code, attr, flip, flip, @@ -234,44 +234,44 @@ { superwng_state *state = space->machine().driver_data(); state->m_videoram_bg[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER(superwng_bg_cram_w) { superwng_state *state = space->machine().driver_data(); state->m_colorram_bg[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER(superwng_fg_vram_w) { superwng_state *state = space->machine().driver_data(); state->m_videoram_fg[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER(superwng_fg_cram_w) { superwng_state *state = space->machine().driver_data(); state->m_colorram_fg[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER(superwng_tilebank_w) { superwng_state *state = space->machine().driver_data(); state->m_tile_bank = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); + state->m_fg_tilemap->mark_all_dirty(); } static WRITE8_HANDLER( superwng_flip_screen_w ) { superwng_state *state = space->machine().driver_data(); flip_screen_set(space->machine(), ~data & 0x01); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); + state->m_fg_tilemap->mark_all_dirty(); } static WRITE8_HANDLER(superwng_cointcnt1_w) @@ -476,7 +476,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) @@ -485,7 +484,7 @@ MCFG_PALETTE_LENGTH(0x40) MCFG_PALETTE_INIT(superwng) MCFG_VIDEO_START( superwng ) - MCFG_SCREEN_UPDATE(superwng) + MCFG_SCREEN_UPDATE_STATIC(superwng) MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/suprgolf.c mame-0.145/src/mame/drivers/suprgolf.c --- mame-0.144/src/mame/drivers/suprgolf.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/suprgolf.c 2012-02-06 21:30:33.000000000 +0000 @@ -72,14 +72,14 @@ state->m_bg_fb = auto_alloc_array(machine, UINT16, 0x2000*0x20); state->m_fg_fb = auto_alloc_array(machine, UINT16, 0x2000*0x20); - tilemap_set_transparent_pen(state->m_tilemap,15); + state->m_tilemap->set_transparent_pen(15); } -static SCREEN_UPDATE( suprgolf ) +static SCREEN_UPDATE_IND16( suprgolf ) { - suprgolf_state *state = screen->machine().driver_data(); + suprgolf_state *state = screen.machine().driver_data(); int x,y,count,color; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); { count = 0; @@ -90,8 +90,8 @@ { color = state->m_bg_fb[count]; - if(x <= cliprect->max_x && y <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, y, x) = screen->machine().pens[(color & 0x7ff)]; + if(x <= cliprect.max_x && y <= cliprect.max_y) + bitmap.pix16(y, x) = screen.machine().pens[(color & 0x7ff)]; count++; } @@ -107,15 +107,15 @@ { color = state->m_fg_fb[count]; - if(((state->m_fg_fb[count] & 0x0f) != 0x0f) && (x <= cliprect->max_x && y <= cliprect->max_y)) - *BITMAP_ADDR16(bitmap, y, x) = screen->machine().pens[(color & 0x7ff)]; + if(((state->m_fg_fb[count] & 0x0f) != 0x0f) && (x <= cliprect.max_x && y <= cliprect.max_y)) + bitmap.pix16(y, x) = screen.machine().pens[(color & 0x7ff)]; count++; } } } - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -150,7 +150,7 @@ else { state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, (offset & 0x7fe) >> 1); + state->m_tilemap->mark_tile_dirty((offset & 0x7fe) >> 1); } } @@ -520,10 +520,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191) - MCFG_SCREEN_UPDATE(suprgolf) + MCFG_SCREEN_UPDATE_STATIC(suprgolf) MCFG_GFXDECODE(suprgolf) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/suprloco.c mame-0.145/src/mame/drivers/suprloco.c --- mame-0.144/src/mame/drivers/suprloco.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/suprloco.c 2012-02-06 21:30:34.000000000 +0000 @@ -166,10 +166,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(5000)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(suprloco) + MCFG_SCREEN_UPDATE_STATIC(suprloco) MCFG_GFXDECODE(suprloco) MCFG_PALETTE_LENGTH(512+256) diff -Nru mame-0.144/src/mame/drivers/suprnova.c mame-0.145/src/mame/drivers/suprnova.c --- mame-0.144/src/mame/drivers/suprnova.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/suprnova.c 2012-02-06 21:30:34.000000000 +0000 @@ -145,12 +145,12 @@ */ #include "emu.h" -#include "deprecat.h" #include "sound/ymz280b.h" #include "cpu/sh2/sh2.h" #include "machine/nvram.h" #include "video/sknsspr.h" #include "includes/suprnova.h" +#include "machine/msm6242.h" static void hit_calc_orig(UINT16 p, UINT16 s, UINT16 org, UINT16 *l, UINT16 *r) { @@ -317,7 +317,7 @@ case 'A': if (data < 2) hit.disconnect= 0; break; - // unknow country id, unlock per default + // unknown country id, unlock per default default: hit.disconnect= 0; break; @@ -438,19 +438,15 @@ } -static INTERRUPT_GEN(skns_interrupt) +static TIMER_DEVICE_CALLBACK(skns_irq) { - UINT8 interrupt = 5; - switch(cpu_getiloops(device)) - { - case 0: - interrupt = 5; // VBLANK - break; - case 1: - interrupt = 1; // SPC - break; - } - device_set_input_line(device,interrupt,HOLD_LINE); + skns_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + device_set_input_line(state->m_maincpu,5,HOLD_LINE); //vblank + else if(scanline == 0) + device_set_input_line(state->m_maincpu,1,HOLD_LINE); // spc } /********************************************************************************** @@ -607,18 +603,6 @@ -static WRITE32_HANDLER( skns_msm6242_w ) -{ - skns_state *state = space->machine().driver_data(); - COMBINE_DATA(&state->m_timer_0_temp[offset]); - - if(offset>=4) - { - mame_printf_debug("Timer 0 outbound\n"); - return; - } -} - static WRITE32_HANDLER( skns_io_w ) { switch(offset) { @@ -680,46 +664,6 @@ } } - -static READ32_HANDLER( skns_msm6242_r ) -{ - system_time systime; - long value; - - space->machine().base_datetime(systime); - // The clock is not y2k-compatible, wrap back 10 years, screw the leap years - // tm->tm_year -= 10; - - switch(offset) { - case 0: - value = (systime.local_time.second % 10)<<24; - value |= (systime.local_time.second / 10)<<16; - value |= (systime.local_time.minute % 10)<<8; - value |= (systime.local_time.minute / 10); - break; - case 1: - value = (systime.local_time.hour % 10)<<24; - value |= ((systime.local_time.hour / 10) /*| (tm->tm_hour >= 12 ? 4 : 0)*/)<<16; - value |= (systime.local_time.mday % 10)<<8; - value |= (systime.local_time.mday / 10); - break; - case 2: - value = ((systime.local_time.month + 1) % 10)<<24; - value |= ((systime.local_time.month + 1) / 10)<<16; - value |= (systime.local_time.year % 10)<<8; - value |= ((systime.local_time.year / 10) % 10); - break; - case 3: - default: - value = (systime.local_time.weekday)<<24; - value |= (1)<<16; - value |= (6)<<8; - value |= (4); - break; - } - return value; -} - /* end old driver code */ static WRITE32_HANDLER( skns_v3t_w ) @@ -749,7 +693,7 @@ AM_RANGE(0x0040000c, 0x0040000f) AM_READ_PORT("40000c") AM_RANGE(0x00800000, 0x00801fff) AM_RAM AM_SHARE("nvram") /* 'backup' RAM */ AM_RANGE(0x00c00000, 0x00c00003) AM_DEVREADWRITE8("ymz", ymz280b_r, ymz280b_w, 0xffff0000) /* ymz280_w (sound) */ - AM_RANGE(0x01000000, 0x0100000f) AM_READWRITE(skns_msm6242_r, skns_msm6242_w) + AM_RANGE(0x01000000, 0x0100000f) AM_DEVREADWRITE8_MODERN("rtc", msm6242_device, read, write, 0xffffffff) AM_RANGE(0x01800000, 0x01800003) AM_WRITE(skns_hit2_w) AM_RANGE(0x02000000, 0x02003fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */ AM_RANGE(0x02100000, 0x0210003f) AM_RAM AM_BASE_MEMBER(skns_state, m_spc_regs) /* sprite registers */ @@ -810,12 +754,17 @@ }; - +static MSM6242_INTERFACE( rtc_intf ) +{ + DEVCB_NULL +}; static MACHINE_CONFIG_START( skns, skns_state ) MCFG_CPU_ADD("maincpu", SH2,28638000) MCFG_CPU_PROGRAM_MAP(skns_map) - MCFG_CPU_VBLANK_INT_HACK(skns_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", skns_irq, "screen", 0, 1) + + MCFG_MSM6242_ADD("rtc", rtc_intf) MCFG_MACHINE_RESET(skns) MCFG_NVRAM_ADD_1FILL("nvram") @@ -832,11 +781,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.5971) // measured by Guru MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_SIZE(320,240) + MCFG_SCREEN_SIZE(340,262) MCFG_SCREEN_VISIBLE_AREA(0,319,0,239) - MCFG_SCREEN_UPDATE(skns) - MCFG_SCREEN_EOF(skns) + MCFG_SCREEN_UPDATE_STATIC(skns) + MCFG_SCREEN_VBLANK_STATIC(skns) MCFG_PALETTE_LENGTH(32768) MCFG_GFXDECODE(skns_bg) @@ -1193,11 +1141,36 @@ ROM_START( galpanis ) ROM_REGION( 0x080000, "maincpu", 0 ) /* SH-2 Code */ + ROM_LOAD ( "sknse1.u10", 0x000000, 0x080000, CRC(e2b9d7d1) SHA1(b530a3bb9dedc8cfafcba9f1f10277590be04a15) ) /* Europe BIOS */ + + ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */ + ROM_LOAD16_BYTE( "gps-000-e1.u10", 0x000000, 0x100000, CRC(b9ea3c44) SHA1(c1913545cd71ee75e60ade744a2a1054f770b981) ) + ROM_LOAD16_BYTE( "gps-001-e1.u8", 0x000001, 0x100000, CRC(ded57bd0) SHA1(4c0122f0521829d4d83b6b1c403f7e6470f14951) ) + + ROM_REGION( 0x1000000, "gfx1", 0 ) + ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) ) + ROM_LOAD( "gps10100.u20", 0x400000, 0x400000, CRC(49f764b6) SHA1(9f4289858c3dac625ef623cc381a47b45aa5d8e2) ) + ROM_LOAD( "gps10200.u17", 0x800000, 0x400000, CRC(51980272) SHA1(6c0706d913b33995579aaf0688c4bf26d6d35a78) ) + + ROM_REGION( 0x800000, "gfx2", 0 ) + ROM_LOAD( "gps20000.u16", 0x000000, 0x400000, CRC(c146a09e) SHA1(5af5a7b9d9a55ec7aba3fd85a3a0211b92b1b84f) ) + ROM_LOAD( "gps20100.u13", 0x400000, 0x400000, CRC(9dfa2dc6) SHA1(a058c42fd76c23c0e5c8c11f5617fd29e056be7d) ) + + ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */ + /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */ + /* 0x040000 - 0x3fffff empty? */ + + ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */ + ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) ) +ROM_END + +ROM_START( galpanisj ) + ROM_REGION( 0x080000, "maincpu", 0 ) /* SH-2 Code */ ROM_LOAD ( "sknsj1.u10", 0x000000, 0x080000, CRC(7e2b836c) SHA1(92c5a7a2472496028bff0e5980d41dd294f42144) ) /* Japan BIOS */ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */ - ROM_LOAD16_BYTE( "gps-e.u10", 0x000000, 0x100000, CRC(c6938c3f) SHA1(05853ee6a44a55702788a75580b04a4be45e9bcb) ) - ROM_LOAD16_BYTE( "gps-o.u8", 0x000001, 0x100000, CRC(e764177a) SHA1(3a1333eb1022ed1a275b9c3d44b5f4ab81618fb6) ) + ROM_LOAD16_BYTE( "gps-000-j1.u10", 0x000000, 0x100000, CRC(c6938c3f) SHA1(05853ee6a44a55702788a75580b04a4be45e9bcb) ) + ROM_LOAD16_BYTE( "gps-001-j1.u8", 0x000001, 0x100000, CRC(e764177a) SHA1(3a1333eb1022ed1a275b9c3d44b5f4ab81618fb6) ) ROM_REGION( 0x1000000, "gfx1", 0 ) ROM_LOAD( "gps10000.u24", 0x000000, 0x400000, CRC(a1a7acf2) SHA1(52c86ae907f0c0236808c19f652955b09e90ec5a) ) @@ -1777,7 +1750,8 @@ GAME( 1996, galpani4, skns, sknsj, cyvern, galpani4, ROT0, "Kaneko", "Gals Panic 4 (Japan)", GAME_IMPERFECT_GRAPHICS ) GAME( 1996, galpani4k, galpani4, sknsk, cyvern, galpani4, ROT0, "Kaneko", "Gals Panic 4 (Korea)", GAME_IMPERFECT_GRAPHICS ) GAME( 1996, jjparads, skns, sknsj, skns_1p, jjparads, ROT0, "Electro Design", "Jan Jan Paradise", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, galpanis, skns, sknsj, galpanis, galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Japan)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, galpanis, skns, sknse, galpanis, galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Europe)", GAME_IMPERFECT_GRAPHICS ) +GAME( 1997, galpanisj, galpanis, sknsj, galpanis, galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Japan)", GAME_IMPERFECT_GRAPHICS ) GAME( 1997, galpanisk, galpanis, sknsk, galpanis, galpanis, ROT0, "Kaneko", "Gals Panic S - Extra Edition (Korea)", GAME_IMPERFECT_GRAPHICS ) GAME( 1997, jjparad2, skns, sknsj, skns_1p, jjparad2, ROT0, "Electro Design", "Jan Jan Paradise 2", GAME_IMPERFECT_GRAPHICS ) GAME( 1997, sengekis, skns, sknsa, skns, sengekis, ROT90, "Kaneko / Warashi", "Sengeki Striker (Asia)", GAME_IMPERFECT_GRAPHICS ) diff -Nru mame-0.144/src/mame/drivers/suprridr.c mame-0.145/src/mame/drivers/suprridr.c --- mame-0.144/src/mame/drivers/suprridr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/suprridr.c 2012-02-06 21:30:35.000000000 +0000 @@ -17,6 +17,8 @@ * what are the writes to $08DB and $08E8 for? (guess: a discrete sound effect) + ** driver should probably be merged with timelimt.c + **************************************************************************** PCB Layout @@ -370,10 +372,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(suprridr) + MCFG_SCREEN_UPDATE_STATIC(suprridr) MCFG_GFXDECODE(suprridr) MCFG_PALETTE_LENGTH(96) @@ -444,4 +445,4 @@ * *************************************/ -GAME( 1983, suprridr, 0, suprridr, suprridr, 0, ROT90, "Venture Line (Taito Corporation license)", "Super Rider", GAME_IMPERFECT_SOUND ) +GAME( 1983, suprridr, 0, suprridr, suprridr, 0, ROT90, "Taito Corporation (Venture Line license)", "Super Rider", GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/suprslam.c mame-0.145/src/mame/drivers/suprslam.c --- mame-0.144/src/mame/drivers/suprslam.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/suprslam.c 2012-02-06 21:30:35.000000000 +0000 @@ -337,10 +337,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2300) /* hand-tuned */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(suprslam) + MCFG_SCREEN_UPDATE_STATIC(suprslam) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/surpratk.c mame-0.145/src/mame/drivers/surpratk.c --- mame-0.144/src/mame/drivers/surpratk.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/surpratk.c 2012-02-06 21:30:34.000000000 +0000 @@ -123,29 +123,25 @@ KONAMI8_ALT_B12(2) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), DEF_STR( Free_Play )) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( Free_Play ), SW1) PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW2:4" ) + PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -154,16 +150,14 @@ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Upright Controls" ) + PORT_DIPNAME( 0x20, 0x20, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x20, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW3:4" ) INPUT_PORTS_END @@ -254,10 +248,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(surpratk) + MCFG_SCREEN_UPDATE_STATIC(surpratk) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/system16.c mame-0.145/src/mame/drivers/system16.c --- mame-0.144/src/mame/drivers/system16.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/system16.c 2012-02-06 21:30:36.000000000 +0000 @@ -2060,10 +2060,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system16) + MCFG_SCREEN_UPDATE_STATIC(system16) MCFG_GFXDECODE(sys16) MCFG_PALETTE_LENGTH(2048*SHADOW_COLORS_MULTIPLIER) @@ -2153,7 +2152,7 @@ MCFG_VIDEO_START( s16a_bootleg_shinobi ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( s16a_bootleg ) + MCFG_SCREEN_UPDATE_STATIC( s16a_bootleg ) MACHINE_CONFIG_END static const sega16sp_interface passshtb_sega16sp_intf = @@ -2176,7 +2175,7 @@ MCFG_VIDEO_START( s16a_bootleg_passsht ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( s16a_bootleg ) + MCFG_SCREEN_UPDATE_STATIC( s16a_bootleg ) MACHINE_CONFIG_END @@ -2191,7 +2190,7 @@ MCFG_VIDEO_START( s16a_bootleg_passsht ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( s16a_bootleg_passht4b ) + MCFG_SCREEN_UPDATE_STATIC( s16a_bootleg_passht4b ) MACHINE_CONFIG_END static const sega16sp_interface wb3bbl_sega16sp_intf = @@ -2214,7 +2213,7 @@ MCFG_VIDEO_START( s16a_bootleg_wb3bl ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( s16a_bootleg ) + MCFG_SCREEN_UPDATE_STATIC( s16a_bootleg ) MACHINE_CONFIG_END @@ -2240,10 +2239,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system16) + MCFG_SCREEN_UPDATE_STATIC(system16) MCFG_GFXDECODE(sys16) MCFG_PALETTE_LENGTH(2048*SHADOW_COLORS_MULTIPLIER) @@ -2396,10 +2394,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(system18old) + MCFG_SCREEN_UPDATE_STATIC(system18old) MCFG_GFXDECODE(sys16) MCFG_PALETTE_LENGTH((2048+2048)*SHADOW_COLORS_MULTIPLIER) // 64 extra colours for vdp (but we use 2048 so shadow mask works) diff -Nru mame-0.144/src/mame/drivers/system1.c mame-0.145/src/mame/drivers/system1.c --- mame-0.144/src/mame/drivers/system1.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/system1.c 2012-02-06 21:30:37.000000000 +0000 @@ -250,7 +250,7 @@ 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 4*5+1*2, 7*5+1*2, 4*5+1*2, - 5*5+1*2,10*5+1*2,10*5+3*2,10*5+3*2,10*5+3*2,11*5+1*2, 7*5+2*2,11*5+1*2, 5*5+1*2,10*5+1*2,10*5+3*2, 0*5+1*2,10*5+3*2,17*5+3*2, 7*5+2*2,11*5+1*2, + 5*5+1*2,10*5+1*2,10*5+3*2,10*5+3*2,10*5+3*2,11*5+1*2, 7*5+2*2,11*5+1*2, 5*5+1*2,10*5+1*2,10*5+3*2, 0*5 ,10*5+3*2,17*5+3*2, 7*5+2*2,11*5+1*2, 5*5+1*2,10*5+1*2,10*5+3*2,11*5+2*2,10*5+3*2,11*5+1*2, 7*5+2*2,11*5+1*2, 5*5+1*2, 4*5+1*2,10*5+3*2,11*5+2*2,10*5+3*2, 0*5 , 7*5+2*2,11*5+1*2, 5*5+1*2,10*5+1*2,10*5+3*2,19*5+1*2,10*5+3*2,11*5+1*2, 7*5+2*2,11*5+1*2, 5*5+1*2, 4*5+1*2,10*5+3*2, 4*5+1*2,10*5+3*2, 0*5 , 7*5+2*2,11*5+1*2, 5*5+1*2,10*5+1*2,10*5+3*2, 4*5+1*2,10*5+3*2,11*5+1*2, 7*5+2*2,11*5+1*2, 5*5+1*2, 6*5+1*2,10*5+3*2, 4*5+1*2,10*5+3*2, 0*5 , 7*5+2*2,11*5+1*2 @@ -297,7 +297,7 @@ static const UINT8 cc_xy[0x100] = { 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2,15*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2,15*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, - 4*5+2*2,14*5+4*2,20*5+4*2,10*5+2*2, 9*5+2*2, 9*5+2*2, 9*5+3*2, 4*5+2*2, 4*5+2*2,15*5+2*2,20*5+4*2,10*5+2*2, 9*5+2*2, 9*5+2*2, 9*5+3*2, 4*5+2*2, + 4*5+2*2,14*5+4*2,20*5+4*2,10*5+2*2, 9*5+2*2, 9*5+2*2,11*5+3*2, 4*5+2*2, 4*5+2*2,15*5+2*2,20*5+4*2,10*5+2*2, 9*5+2*2, 9*5+2*2,11*5+3*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2,23*5+3*2,23*5+3*2,19*5+4*2, 4*5+2*2, 4*5+2*2,15*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 9*5+2*2, 9*5+2*2,19*5+3*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 9*5+2*2, 9*5+2*2,19*5+3*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 9*5+2*2, 9*5+2*2,19*5+3*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 4*5+2*2, 9*5+2*2, 9*5+2*2,19*5+3*2, 4*5+2*2, @@ -615,9 +615,11 @@ static TIMER_DEVICE_CALLBACK( mcu_t0_callback ) { - /* the T0 line is clocked by something; if it is not clocked fast + /* The T0 line is clocked by something; if it is not clocked fast enough, the MCU will fail; on shtngmst this happens after 3 - VBLANKs without a tick */ + VBLANKs without a tick. + choplift is even more picky about it, affecting scroll speed + */ device_t *mcu = timer.machine().device("mcu"); device_set_input_line(mcu, MCS51_T0_LINE, ASSERT_LINE); @@ -2153,6 +2155,8 @@ MCFG_CPU_PROGRAM_MAP(sound_map) MCFG_TIMER_ADD_SCANLINE("soundirq", soundirq_gen, "screen", 32, 64) + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + MCFG_MACHINE_START(system1) MCFG_MACHINE_RESET(system1) @@ -2162,9 +2166,8 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_ALWAYS_UPDATE) /* needed for proper hardware collisions */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 320, 0, 256, 260, 0, 224) - MCFG_SCREEN_UPDATE(system1) + MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 640, 0, 512, 260, 0, 224) + MCFG_SCREEN_UPDATE_STATIC(system1) MCFG_GFXDECODE(system1) MCFG_PALETTE_LENGTH(2048) @@ -2186,7 +2189,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0*8+8, 32*8-1-8, 0*8, 28*8-1) + MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1) MACHINE_CONFIG_END @@ -2206,7 +2209,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_VISIBLE_AREA(0*8+8, 32*8-1-8, 0*8, 28*8-1) + MCFG_SCREEN_VISIBLE_AREA(2*(0*8+8), 2*(32*8-1-8), 0*8, 28*8-1) MACHINE_CONFIG_END @@ -2222,7 +2225,7 @@ MCFG_CPU_IO_MAP(mcu_io_map) MCFG_CPU_VBLANK_INT("screen", mcu_irq_assert) - MCFG_TIMER_ADD_PERIODIC("mcu_t0", mcu_t0_callback, attotime::from_msec(20)) /* ??? actual clock unknown */ + MCFG_TIMER_ADD_PERIODIC("mcu_t0", mcu_t0_callback, attotime::from_usec(2500)) /* ??? actual clock unknown */ MACHINE_CONFIG_END @@ -2252,7 +2255,7 @@ /* video hardware */ MCFG_VIDEO_START(system2) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(system2) + MCFG_SCREEN_UPDATE_STATIC(system2) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sys2m, sys2 ) @@ -2264,7 +2267,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(system2_rowscroll) + MCFG_SCREEN_UPDATE_STATIC(system2_rowscroll) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sys2rowm, sys2row ) @@ -4757,9 +4760,9 @@ GAME( 1984, bullfgt, 0, sys1ppi, bullfgt, bullfgtj, ROT0, "Coreland / Sega", "Bullfight (315-5065)", GAME_SUPPORTS_SAVE ) GAME( 1985, nprinces, seganinj, sys1ppi, seganinj, flicky, ROT0, "bootleg?", "Ninja Princess (315-5051, 64k Ver. bootleg?)", GAME_SUPPORTS_SAVE ) GAME( 1985, nprincesu, seganinj, sys1ppi, seganinj, bank00, ROT0, "Sega", "Ninja Princess (64k Ver. not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy2, wboy, sys1ppi, wboy, wboy2, ROT0, "Sega (Escape license)", "Wonder Boy (set 2, 315-5178)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy2u, wboy, sys1ppi, wboy, bank00, ROT0, "Sega (Escape license)", "Wonder Boy (set 2, not encrypted)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, bank00, ROT0, "Sega (Escape license)", "Wonder Boy Deluxe", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy2, wboy, sys1ppi, wboy, wboy2, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, 315-5178)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy2u, wboy, sys1ppi, wboy, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (set 2, not encrypted)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wbdeluxe, wboy, sys1ppi, wbdeluxe, bank00, ROT0, "Escape (Sega license)", "Wonder Boy Deluxe", GAME_SUPPORTS_SAVE ) GAME( 1986, nob, 0, nobm, nob, nob, ROT270, "Coreland / Data East Corporation", "Noboranka (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1986, nobb, nob, nob, nob, nobb, ROT270, "bootleg (Game Electronics)", "Noboranka (Japan, bootleg)", GAME_SUPPORTS_SAVE ) @@ -4786,11 +4789,11 @@ GAME( 1985, myherok, myhero, sys1pio, myhero, myherok, ROT0, "Coreland / Sega", "My Hero (Korea)", GAME_SUPPORTS_SAVE ) GAME( 1985, 4dwarrio, 0, sys1pio, 4dwarrio, 4dwarrio, ROT0, "Coreland / Sega", "4-D Warriors (315-5162)", GAME_SUPPORTS_SAVE ) GAME( 1986, raflesia, 0, sys1pio, raflesia, 4dwarrio, ROT270, "Coreland / Sega", "Rafflesia (315-5162)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy, 0, sys1pio, wboy, wboy, ROT0, "Sega (Escape license)", "Wonder Boy (set 1, 315-5177)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboyo, wboy, sys1pio, wboy, wboyo, ROT0, "Sega (Escape license)", "Wonder Boy (set 1, 315-5135)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy3, wboy, sys1pio, wboy3, wboyo, ROT0, "Sega (Escape license)", "Wonder Boy (set 3, 315-5135)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboy4, wboy, sys1pio, wboy, 4dwarrio, ROT0, "Sega (Escape license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", GAME_SUPPORTS_SAVE ) -GAME( 1986, wboyu, wboy, sys1pio, wboyu, bank00, ROT0, "Sega (Escape license)", "Wonder Boy (prototype?)", GAME_SUPPORTS_SAVE ) // appears to be a very early / unfinished version. +GAME( 1986, wboy, 0, sys1pio, wboy, wboy, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5177)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboyo, wboy, sys1pio, wboy, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 1, 315-5135)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy3, wboy, sys1pio, wboy3, wboyo, ROT0, "Escape (Sega license)", "Wonder Boy (set 3, 315-5135)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboy4, wboy, sys1pio, wboy, 4dwarrio, ROT0, "Escape (Sega license)", "Wonder Boy (315-5162, 4-D Warriors Conversion)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboyu, wboy, sys1pio, wboyu, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", GAME_SUPPORTS_SAVE ) // appears to be a very early / unfinished version. GAME( 1987, blockgal, 0, sys1pio, blockgal, blockgal, ROT90, "Sega / Vic Tokai", "Block Gal (MC-8123B, 317-0029)", GAME_SUPPORTS_SAVE) /* PIO-based System 1 with ROM banking */ @@ -4805,7 +4808,7 @@ GAME( 1985, shtngmst, 0, sys2m, shtngmst, shtngmst, ROT0, "Sega", "Shooting Master (8751 315-5159)", GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) GAME( 1985, shtngmste, shtngmst, sys2m, shtngmst, shtngmst, ROT0, "Sega / EVG", "Shooting Master (EVG, 8751 315-5159a)", GAME_SUPPORTS_SAVE ) GAME( 1986, gardiab, gardia, sys2, gardia, gardiab, ROT270, "bootleg", "Gardia (317-0007?, bootleg)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) -GAME( 1986, wboysys2, wboy, sys2, wboysys2, wboysys2, ROT0, "Sega (Escape license)", "Wonder Boy (system 2)", GAME_SUPPORTS_SAVE ) +GAME( 1986, wboysys2, wboy, sys2, wboysys2, wboysys2, ROT0, "Escape (Sega license)", "Wonder Boy (system 2)", GAME_SUPPORTS_SAVE ) GAME( 1987, tokisens, 0, sys2, tokisens, bank0c, ROT90, "Sega", "Toki no Senshi - Chrono Soldier", GAME_SUPPORTS_SAVE ) GAME( 1987, wbml, 0, sys2, wbml, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan New Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) GAME( 1987, wbmljo, wbml, sys2, wbml, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan Old Ver., MC-8123, 317-0043)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/tagteam.c mame-0.145/src/mame/drivers/tagteam.c --- mame-0.144/src/mame/drivers/tagteam.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/tagteam.c 2012-02-06 21:30:41.000000000 +0000 @@ -25,7 +25,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "sound/ay8910.h" #include "sound/dac.h" @@ -56,12 +55,20 @@ AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END +static WRITE8_HANDLER( sound_nmi_mask_w ) +{ + tagteam_state *state = space->machine().driver_data(); + + state->m_sound_nmi_mask = data & 1; +} + +/* Same as Syusse Oozumou */ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x03ff) AM_RAM AM_RANGE(0x2000, 0x2001) AM_DEVWRITE("ay1", ay8910_data_address_w) AM_RANGE(0x2002, 0x2003) AM_DEVWRITE("ay2", ay8910_data_address_w) AM_RANGE(0x2004, 0x2004) AM_DEVWRITE("dac", dac_w) - AM_RANGE(0x2005, 0x2005) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x2005, 0x2005) AM_WRITE(sound_nmi_mask_w) AM_RANGE(0x2007, 0x2007) AM_READ(soundlatch_r) AM_RANGE(0x4000, 0xffff) AM_ROM ADDRESS_MAP_END @@ -189,26 +196,33 @@ GFXDECODE_END +static INTERRUPT_GEN( sound_timer_irq ) +{ + tagteam_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( tagteam, tagteam_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/8) MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,272/16*57) // connected to bit 3 of vcount (basically once every 16 scanlines) + MCFG_CPU_PERIODIC_INT(irq0_line_assert,272/16*57) // connected to bit 4 of vcount (basically once every 16 scanlines) MCFG_CPU_ADD("audiocpu", M6502, XTAL_12MHz/2/6) // daughterboard gets 12mhz/2 from mainboard, but how it's divided further is a guess MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,272/16*57) // same source as maincpu irq + MCFG_CPU_PERIODIC_INT(sound_timer_irq,272/16*57) // same source as maincpu irq /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) // measured? MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(tagteam) + MCFG_SCREEN_UPDATE_STATIC(tagteam) MCFG_GFXDECODE(tagteam) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/tail2nos.c mame-0.145/src/mame/drivers/tail2nos.c --- mame-0.144/src/mame/drivers/tail2nos.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tail2nos.c 2012-02-06 21:30:42.000000000 +0000 @@ -254,10 +254,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(tail2nos) + MCFG_SCREEN_UPDATE_STATIC(tail2nos) MCFG_GFXDECODE(tail2nos) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/taitoair.c mame-0.145/src/mame/drivers/taitoair.c --- mame-0.144/src/mame/drivers/taitoair.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitoair.c 2012-02-06 21:30:42.000000000 +0000 @@ -741,10 +741,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 3*16, 28*16-1) - MCFG_SCREEN_UPDATE(taitoair) + MCFG_SCREEN_UPDATE_STATIC(taitoair) MCFG_VIDEO_START(taitoair); MCFG_GFXDECODE(airsys) diff -Nru mame-0.144/src/mame/drivers/taito_b.c mame-0.145/src/mame/drivers/taito_b.c --- mame-0.144/src/mame/drivers/taito_b.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_b.c 2012-02-06 21:30:34.000000000 +0000 @@ -2066,11 +2066,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2113,11 +2112,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2160,11 +2158,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2207,11 +2204,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2253,11 +2249,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2300,11 +2295,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2352,11 +2346,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(rambo3) MCFG_PALETTE_LENGTH(4096) @@ -2399,11 +2392,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2449,11 +2441,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2500,11 +2491,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2547,11 +2537,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2598,11 +2587,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2645,11 +2633,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2695,11 +2682,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2743,11 +2729,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2790,11 +2775,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2846,11 +2830,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2900,11 +2883,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) @@ -2952,17 +2934,16 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitob) - MCFG_SCREEN_EOF(taitob) + MCFG_SCREEN_UPDATE_STATIC(taitob) + MCFG_SCREEN_VBLANK_STATIC(taitob) MCFG_GFXDECODE(taito_b) MCFG_PALETTE_LENGTH(4096) MCFG_VIDEO_START(realpunc) - MCFG_SCREEN_UPDATE(realpunc) + MCFG_SCREEN_UPDATE_STATIC(realpunc) MCFG_HD63484_ADD("hd63484", realpunc_hd63484_intf) diff -Nru mame-0.144/src/mame/drivers/taito.c mame-0.145/src/mame/drivers/taito.c --- mame-0.144/src/mame/drivers/taito.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito.c 2012-02-06 21:30:36.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i8085/i8085.h" @@ -5,18 +7,28 @@ { public: taito_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( taito_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( taito_map, AS_PROGRAM, 8, taito_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( taito ) INPUT_PORTS_END -static MACHINE_RESET( taito ) +void taito_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8080, 19000000/9) MCFG_CPU_PROGRAM_MAP(taito_map) - - MCFG_MACHINE_RESET( taito ) MACHINE_CONFIG_END /*-------------------------------- @@ -594,41 +604,40 @@ ROM_RELOAD( 0xf000, 0x1000) ROM_END -GAME(198?, taitest, 0, taito, taito, taito, ROT0, "Taito", "Taito Test Fixture", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, cavnegro, 0, taito, taito, taito, ROT0, "Taito", "Cavaleiro Negro", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, cavnegro1, cavnegro, taito, taito, taito, ROT0, "Taito", "Cavaleiro Negro (alternate set 1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, cavnegro2, cavnegro, taito, taito, taito, ROT0, "Taito", "Cavaleiro Negro (alternate set 2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, cosmic, 0, taito, taito, taito, ROT0, "Taito", "Cosmic", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, drakor, 0, taito, taito, taito, ROT0, "Taito", "Drakor", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, fireact, 0, taito, taito, taito, ROT0, "Taito", "Fire Action", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, fireactd, 0, taito, taito, taito, ROT0, "Taito", "Fire Action Deluxe", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, gemini2k, 0, taito, taito, taito, ROT0, "Taito", "Gemini 2000", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, gemini2k1, gemini2k, taito, taito, taito, ROT0, "Taito", "Gemini 2000 (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, gork, 0, taito, taito, taito, ROT0, "Taito", "Gork", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, hawkman, 0, taito, taito, taito, ROT0, "Taito", "Hawkman", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, hawkman1, hawkman, taito, taito, taito, ROT0, "Taito", "Hawkman (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, ladylukt, 0, taito, taito, taito, ROT0, "Taito", "Lady Luck (Taito)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, lunelle, 0, taito, taito, taito, ROT0, "Taito", "Lunelle", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, meteort, 0, taito, taito, taito, ROT0, "Taito", "Meteor (Taito)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, mrblack, 0, taito, taito, taito, ROT0, "Taito", "Mr. Black", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, mrblack1, mrblack, taito, taito, taito, ROT0, "Taito", "Mr. Black (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, obaoba, 0, taito, taito, taito, ROT0, "Taito", "Oba-Oba", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, obaoba1, obaoba, taito, taito, taito, ROT0, "Taito", "Oba-Oba (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, polar, 0, taito, taito, taito, ROT0, "Taito", "Polar Explorer", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, rally, 0, taito, taito, taito, ROT0, "Taito", "Rally", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, sharkt, 0, taito, taito, taito, ROT0, "Taito", "Shark (Taito)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, shock, 0, taito, taito, taito, ROT0, "Taito", "Shock", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, snake, 0, taito, taito, taito, ROT0, "Taito", "Snake Machine", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, sshuttle, 0, taito, taito, taito, ROT0, "Taito", "Space Shuttle (Taito)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, sshuttle1, sshuttle, taito, taito, taito, ROT0, "Taito", "Space Shuttle (Taito) (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, stest, 0, taito, taito, taito, ROT0, "Taito", "Speed Test", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, sureshop, 0, taito, taito, taito, ROT0, "Taito", "Sure Shot (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, titan, 0, taito, taito, taito, ROT0, "Taito", "Titan", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, titan1, titan, taito, taito, taito, ROT0, "Taito", "Titan (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, vegast, ladylukt, taito, taito, taito, ROT0, "Taito", "Vegas (Taito)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, voleybal, 0, taito, taito, taito, ROT0, "Taito", "Voley Ball", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, vortexp, 0, taito, taito, taito, ROT0, "Taito", "Vortex (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, zarza, 0, taito, taito, taito, ROT0, "Taito", "Zarza", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, zarza1, zarza, taito, taito, taito, ROT0, "Taito", "Zarza (alternate set)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(198?, mrblkz80, mrblack, taito, taito, taito, ROT0, "Taito", "Mr. Black (Z-80 CPU)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(198?, taitest, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Taito Test Fixture", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, cavnegro, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Cavaleiro Negro", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, cavnegro1, cavnegro, taito, taito, taito, ROT0, "Taito do Brasil", "Cavaleiro Negro (alternate set 1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, cavnegro2, cavnegro, taito, taito, taito, ROT0, "Taito do Brasil", "Cavaleiro Negro (alternate set 2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, cosmic, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Cosmic", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, drakor, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Drakor", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, fireact, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Fire Action", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, fireactd, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Fire Action Deluxe", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, gemini2k, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Gemini 2000", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, gemini2k1, gemini2k, taito, taito, taito, ROT0, "Taito do Brasil", "Gemini 2000 (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, gork, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Gork", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, hawkman, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Hawkman", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, hawkman1, hawkman, taito, taito, taito, ROT0, "Taito do Brasil", "Hawkman (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, ladylukt, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Lady Luck (Taito)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, lunelle, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Lunelle", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, meteort, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Meteor (Taito)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, mrblack, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Mr. Black", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, mrblack1, mrblack, taito, taito, taito, ROT0, "Taito do Brasil", "Mr. Black (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, obaoba, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Oba-Oba", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, obaoba1, obaoba, taito, taito, taito, ROT0, "Taito do Brasil", "Oba-Oba (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, polar, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Polar Explorer", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, rally, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Rally", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, sharkt, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Shark (Taito)", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, shock, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Shock", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, snake, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Snake Machine", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, sshuttle, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Space Shuttle (Taito)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, sshuttle1, sshuttle, taito, taito, taito, ROT0, "Taito do Brasil", "Space Shuttle (Taito) (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, stest, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Speed Test", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, sureshop, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Sure Shot (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, titan, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Titan", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, titan1, titan, taito, taito, taito, ROT0, "Taito do Brasil", "Titan (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, vegast, ladylukt, taito, taito, taito, ROT0, "Taito do Brasil", "Vegas (Taito)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, voleybal, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Voley Ball", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, vortexp, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Vortex (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, zarza, 0, taito, taito, taito, ROT0, "Taito do Brasil", "Zarza", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, zarza1, zarza, taito, taito, taito, ROT0, "Taito do Brasil", "Zarza (alternate set)", GAME_IS_SKELETON_MECHANICAL) +GAME(198?, mrblkz80, mrblack, taito, taito, taito, ROT0, "Taito do Brasil", "Mr. Black (Z-80 CPU)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/taito_f2.c mame-0.145/src/mame/drivers/taito_f2.c --- mame-0.144/src/mame/drivers/taito_f2.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_f2.c 2012-02-06 21:30:42.000000000 +0000 @@ -3039,11 +3039,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitof2) - MCFG_SCREEN_EOF(taitof2_no_buffer) + MCFG_SCREEN_UPDATE_STATIC(taitof2) + MCFG_SCREEN_VBLANK_STATIC(taitof2_no_buffer) MCFG_GFXDECODE(taitof2) MCFG_PALETTE_LENGTH(4096) @@ -3088,7 +3087,7 @@ MCFG_GFXDECODE(finalb) MCFG_VIDEO_START(taitof2_finalb) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", finalb_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", taitof2_tc0110pcr_intf) @@ -3105,8 +3104,8 @@ MCFG_GFXDECODE(pivot) MCFG_VIDEO_START(taitof2_dondokod) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) - MCFG_SCREEN_UPDATE(taitof2_pri_roz) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) MCFG_TC0100SCN_ADD("tc0100scn", dondokod_tc0100scn_intf) MCFG_TC0430GRW_ADD("tc0280grd", taitof2_tc0280grd_intf) @@ -3123,7 +3122,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_megab) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3140,8 +3139,8 @@ MCFG_GFXDECODE(thundfox) MCFG_VIDEO_START(taitof2_thundfox) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_thundfox) - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed_thundfox) + MCFG_SCREEN_UPDATE_STATIC(taitof2_thundfox) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed_thundfox) MCFG_TC0100SCN_ADD("tc0100scn_1", thundfox_tc0100scn_intf_1) MCFG_TC0100SCN_ADD("tc0100scn_2", thundfox_tc0100scn_intf_2) @@ -3159,7 +3158,7 @@ MCFG_GFXDECODE(pivot) MCFG_VIDEO_START(taitof2_dondokod) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri_roz) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) MCFG_TC0100SCN_ADD("tc0100scn", dondokod_tc0100scn_intf) MCFG_TC0430GRW_ADD("tc0280grd", taitof2_tc0280grd_intf) @@ -3176,7 +3175,7 @@ /* video hardware */ MCFG_GFXDECODE(yuyugogo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", taitof2_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", taitof2_tc0110pcr_intf) @@ -3192,8 +3191,8 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_megab) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3209,7 +3208,7 @@ /* video hardware */ MCFG_GFXDECODE(yuyugogo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", taitof2_tc0100scn_intf) MCFG_TC0110PCR_ADD("tc0110pcr", taitof2_tc0110pcr_intf) @@ -3225,8 +3224,8 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_ssi) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_ssi) - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed_thundfox) // buffer_delayed_thundfox instead of buffer_delayed fixes the butterfly powerup + MCFG_SCREEN_UPDATE_STATIC(taitof2_ssi) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed_thundfox) // buffer_delayed_thundfox instead of buffer_delayed fixes the butterfly powerup MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MACHINE_CONFIG_END @@ -3241,8 +3240,8 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_gunfront) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3258,7 +3257,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_growl) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3289,8 +3288,8 @@ MCFG_GFXDECODE(deadconx) MCFG_VIDEO_START(taitof2_footchmp) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_deadconx) - MCFG_SCREEN_EOF(taitof2_full_buffer_delayed) + MCFG_SCREEN_UPDATE_STATIC(taitof2_deadconx) + MCFG_SCREEN_VBLANK_STATIC(taitof2_full_buffer_delayed) MCFG_TC0480SCP_ADD("tc0480scp", footchmp_tc0480scp_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3313,8 +3312,8 @@ MCFG_GFXDECODE(deadconx) MCFG_VIDEO_START(taitof2_hthero) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_deadconx) - MCFG_SCREEN_EOF(taitof2_full_buffer_delayed) + MCFG_SCREEN_UPDATE_STATIC(taitof2_deadconx) + MCFG_SCREEN_VBLANK_STATIC(taitof2_full_buffer_delayed) MCFG_TC0360PRI_ADD("tc0360pri") MCFG_TC0480SCP_ADD("tc0480scp", hthero_tc0480scp_intf) @@ -3330,7 +3329,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_koshien) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", koshien_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3347,7 +3346,7 @@ MCFG_GFXDECODE(yuyugogo) MCFG_VIDEO_START(taitof2_yuyugogo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_yesnoj) + MCFG_SCREEN_UPDATE_STATIC(taitof2_yesnoj) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MACHINE_CONFIG_END @@ -3362,7 +3361,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_ninjak) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", finalb_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3378,7 +3377,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_solfigtr) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", solfigtr_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3393,7 +3392,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed) MCFG_TC0100SCN_ADD("tc0100scn", taitof2_tc0100scn_intf) MACHINE_CONFIG_END @@ -3409,7 +3408,7 @@ MCFG_GFXDECODE(pivot) MCFG_VIDEO_START(taitof2_pulirula) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri_roz) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) MCFG_TC0100SCN_ADD("tc0100scn", dondokod_tc0100scn_intf) MCFG_TC0430GRW_ADD("tc0430grw", taitof2_tc0430grw_intf) @@ -3428,7 +3427,7 @@ MCFG_PALETTE_LENGTH(8192) MCFG_VIDEO_START(taitof2_metalb) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_metalb) + MCFG_SCREEN_UPDATE_STATIC(taitof2_metalb) MCFG_TC0480SCP_ADD("tc0480scp", metalb_tc0480scp_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3444,7 +3443,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_qzchikyu) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_EOF(taitof2_partial_buffer_delayed_qzchikyu) + MCFG_SCREEN_VBLANK_STATIC(taitof2_partial_buffer_delayed_qzchikyu) MCFG_TC0100SCN_ADD("tc0100scn", qzchikyu_tc0100scn_intf) MACHINE_CONFIG_END @@ -3460,7 +3459,7 @@ MCFG_GFXDECODE(yuyugogo) MCFG_VIDEO_START(taitof2_yesnoj) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_yesnoj) + MCFG_SCREEN_UPDATE_STATIC(taitof2_yesnoj) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MACHINE_CONFIG_END @@ -3476,7 +3475,7 @@ MCFG_GFXDECODE(deadconx) MCFG_VIDEO_START(taitof2_deadconx) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_deadconx) + MCFG_SCREEN_UPDATE_STATIC(taitof2_deadconx) MCFG_TC0480SCP_ADD("tc0480scp", deadconx_tc0480scp_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3493,7 +3492,7 @@ MCFG_GFXDECODE(deadconx) MCFG_VIDEO_START(taitof2_deadconxj) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_deadconx) + MCFG_SCREEN_UPDATE_STATIC(taitof2_deadconx) MCFG_TC0480SCP_ADD("tc0480scp", deadconxj_tc0480scp_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3509,7 +3508,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_dinorex) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3525,7 +3524,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_quiz) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3541,7 +3540,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_quiz) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3557,7 +3556,7 @@ /* video hardware */ MCFG_VIDEO_START(taitof2_quiz) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri) MCFG_TC0100SCN_ADD("tc0100scn", liquidk_tc0100scn_intf) MCFG_TC0360PRI_ADD("tc0360pri") @@ -3574,7 +3573,7 @@ MCFG_GFXDECODE(pivot) MCFG_VIDEO_START(taitof2_driftout) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(taitof2_pri_roz) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) MCFG_TC0100SCN_ADD("tc0100scn", dondokod_tc0100scn_intf) MCFG_TC0430GRW_ADD("tc0430grw", taitof2_tc0430grw_intf) @@ -3600,11 +3599,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitof2_pri_roz) - MCFG_SCREEN_EOF(taitof2_no_buffer) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) + MCFG_SCREEN_VBLANK_STATIC(taitof2_no_buffer) MCFG_GFXDECODE(pivot) MCFG_PALETTE_LENGTH(4096) @@ -3650,11 +3648,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitof2_pri_roz) - MCFG_SCREEN_EOF(taitof2_no_buffer) + MCFG_SCREEN_UPDATE_STATIC(taitof2_pri_roz) + MCFG_SCREEN_VBLANK_STATIC(taitof2_no_buffer) MCFG_GFXDECODE(pivot) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/taito_f3.c mame-0.145/src/mame/drivers/taito_f3.c --- mame-0.144/src/mame/drivers/taito_f3.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_f3.c 2012-02-06 21:30:42.000000000 +0000 @@ -443,11 +443,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58.97) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(624) /* 58.97 Hz, 624us vblank time */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8+48*2, 32*8) MCFG_SCREEN_VISIBLE_AREA(46, 40*8-1 + 46, 24, 24+232-1) - MCFG_SCREEN_UPDATE(f3) - MCFG_SCREEN_EOF(f3) + MCFG_SCREEN_UPDATE_STATIC(f3) + MCFG_SCREEN_VBLANK_STATIC(f3) MCFG_GFXDECODE(taito_f3) MCFG_PALETTE_LENGTH(0x2000) @@ -538,11 +537,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58.97) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(624) /* 58.97 Hz, 624us vblank time */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8+48*2, 32*8) MCFG_SCREEN_VISIBLE_AREA(46, 40*8-1 + 46, 31, 31+224-1) - MCFG_SCREEN_UPDATE(f3) - MCFG_SCREEN_EOF(f3) + MCFG_SCREEN_UPDATE_STATIC(f3) + MCFG_SCREEN_VBLANK_STATIC(f3) MCFG_GFXDECODE(bubsympb) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/taitogn.c mame-0.145/src/mame/drivers/taitogn.c --- mame-0.144/src/mame/drivers/taitogn.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitogn.c 2012-02-06 21:30:34.000000000 +0000 @@ -373,9 +373,9 @@ // Check for card reset if (!(data & 0x40)) { - devtag_reset(machine, "card"); + devtag_reset(machine, ":card"); state->m_locked = 0x1ff; - ide_set_gnet_readlock (machine.device("card"), 1); + ide_set_gnet_readlock (machine.device(":card"), 1); } break; @@ -395,7 +395,7 @@ taitogn_state *state = space->machine().driver_data(); if(offset < 2) { - ide_controller32_pcmcia_w(space->machine().device("card"), offset, data, mem_mask); + ide_controller32_pcmcia_w(space->machine().device(":card"), offset, data, mem_mask); return; } @@ -412,7 +412,7 @@ taitogn_state *state = space->machine().driver_data(); if(offset < 2) - return ide_controller32_pcmcia_r(space->machine().device("card"), offset, mem_mask); + return ide_controller32_pcmcia_r(space->machine().device(":card"), offset, mem_mask); offset *= 4; @@ -459,14 +459,14 @@ pos++; } else v = data; - chd_get_metadata(get_disk_handle(space->machine(), "card"), HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); + chd_get_metadata(get_disk_handle(space->machine(), ":card"), HARD_DISK_KEY_METADATA_TAG, 0, key, 5, 0, 0, 0); k = pos < 5 ? key[pos] : 0; if(v == k) state->m_locked &= ~(1 << pos); else state->m_locked |= 1 << pos; if (!state->m_locked) { - ide_set_gnet_readlock (space->machine().device("card"), 0); + ide_set_gnet_readlock (space->machine().device(":card"), 0); } } } @@ -890,8 +890,8 @@ state->m_dip_timer = machine.scheduler().timer_alloc( FUNC(dip_timer_fired), NULL ); memset(state->m_cis, 0xff, 512); - if (get_disk_handle(machine, "card") != NULL) - chd_get_metadata(get_disk_handle(machine, "card"), PCMCIA_CIS_METADATA_TAG, 0, state->m_cis, 512, 0, 0, 0); + if (get_disk_handle(machine, ":card") != NULL) + chd_get_metadata(get_disk_handle(machine, ":card"), PCMCIA_CIS_METADATA_TAG, 0, state->m_cis, 512, 0, 0, 0); } static DRIVER_INIT( coh3002t_mp ) @@ -908,8 +908,8 @@ state->m_locked = 0x1ff; install_handlers(machine, 0); state->m_control = 0; - devtag_reset(machine, "card"); - ide_set_gnet_readlock(machine.device("card"), 1); + devtag_reset(machine, ":card"); + ide_set_gnet_readlock(machine.device(":card"), 1); // halt sound CPU since it has no valid program at start cputag_set_input_line(machine, "mn10200",INPUT_LINE_RESET,ASSERT_LINE); /* MCU */ diff -Nru mame-0.144/src/mame/drivers/taito_h.c mame-0.145/src/mame/drivers/taito_h.c --- mame-0.144/src/mame/drivers/taito_h.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_h.c 2012-02-06 21:30:34.000000000 +0000 @@ -579,10 +579,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 3*16, 28*16-1) - MCFG_SCREEN_UPDATE(syvalion) + MCFG_SCREEN_UPDATE_STATIC(syvalion) MCFG_GFXDECODE(syvalion) MCFG_PALETTE_LENGTH(33*16) @@ -623,10 +622,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(1*16, 21*16-1, 2*16, 17*16-1) - MCFG_SCREEN_UPDATE(recordbr) + MCFG_SCREEN_UPDATE_STATIC(recordbr) MCFG_GFXDECODE(recordbr) MCFG_PALETTE_LENGTH(32*16) @@ -667,10 +665,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(1*16, 21*16-1, 2*16, 17*16-1) - MCFG_SCREEN_UPDATE(dleague) + MCFG_SCREEN_UPDATE_STATIC(dleague) MCFG_GFXDECODE(dleague) MCFG_PALETTE_LENGTH(33*16) diff -Nru mame-0.144/src/mame/drivers/taitojc.c mame-0.145/src/mame/drivers/taitojc.c --- mame-0.144/src/mame/drivers/taitojc.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitojc.c 2012-02-06 21:30:34.000000000 +0000 @@ -1431,10 +1431,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 400) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 399) - MCFG_SCREEN_UPDATE(taitojc) + MCFG_SCREEN_UPDATE_STATIC(taitojc) MCFG_PALETTE_LENGTH(32768) diff -Nru mame-0.144/src/mame/drivers/taito_l.c mame-0.145/src/mame/drivers/taito_l.c --- mame-0.144/src/mame/drivers/taito_l.c 2012-01-13 15:34:53.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_l.c 2012-02-06 21:30:34.000000000 +0000 @@ -53,7 +53,6 @@ */ #include "emu.h" -#include "deprecat.h" #include "includes/taitoipt.h" #include "cpu/z80/z80.h" #include "audio/taitosnd.h" @@ -309,31 +308,32 @@ return state->m_irq_adr_table[state->m_last_irq_level]; } -static INTERRUPT_GEN( vbl_interrupt ) +static TIMER_DEVICE_CALLBACK( vbl_interrupt ) { - taitol_state *state = device->machine().driver_data(); - device_set_irq_callback(device, irq_callback); + taitol_state *state = timer.machine().driver_data(); + int scanline = param; + device_set_irq_callback(state->m_maincpu, irq_callback); /* kludge to make plgirls boot */ - if (cpu_get_reg(device, Z80_IM) != 2) + if (cpu_get_reg(state->m_maincpu, Z80_IM) != 2) return; // What is really generating interrupts 0 and 1 is still to be found - if (cpu_getiloops(device) == 1 && (state->m_irq_enable & 1)) + if (scanline == 120 && (state->m_irq_enable & 1)) { state->m_last_irq_level = 0; - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } - else if (cpu_getiloops(device) == 2 && (state->m_irq_enable & 2)) + else if (scanline == 0 && (state->m_irq_enable & 2)) { state->m_last_irq_level = 1; - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } - else if (cpu_getiloops(device) == 0 && (state->m_irq_enable & 4)) + else if (scanline == 240 && (state->m_irq_enable & 4)) { state->m_last_irq_level = 2; - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } } @@ -1879,7 +1879,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_13_33056MHz/2) /* verified freq on pin122 of TC0090LVC cpu */ MCFG_CPU_PROGRAM_MAP(fhawk_map) - MCFG_CPU_VBLANK_INT_HACK(vbl_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", vbl_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz/3) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(fhawk_3_map) @@ -1897,11 +1897,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitol) - MCFG_SCREEN_EOF(taitol) + MCFG_SCREEN_UPDATE_STATIC(taitol) + MCFG_SCREEN_VBLANK_STATIC(taitol) MCFG_GFXDECODE(2) MCFG_PALETTE_LENGTH(256) @@ -1979,7 +1978,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_13_33056MHz/2) /* verified freq on pin122 of TC0090LVC cpu */ MCFG_CPU_PROGRAM_MAP(kurikint_map) - MCFG_CPU_VBLANK_INT_HACK(vbl_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", vbl_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz/3) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(kurikint_2_map) @@ -1994,11 +1993,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitol) - MCFG_SCREEN_EOF(taitol) + MCFG_SCREEN_UPDATE_STATIC(taitol) + MCFG_SCREEN_VBLANK_STATIC(taitol) MCFG_GFXDECODE(2) MCFG_PALETTE_LENGTH(256) @@ -2032,7 +2030,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_13_33056MHz/2) /* verified freq on pin122 of TC0090LVC cpu */ MCFG_CPU_PROGRAM_MAP(plotting_map) - MCFG_CPU_VBLANK_INT_HACK(vbl_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", vbl_interrupt, "screen", 0, 1) MCFG_MACHINE_START(taito_l) MCFG_MACHINE_RESET(plotting) @@ -2041,11 +2039,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitol) - MCFG_SCREEN_EOF(taitol) + MCFG_SCREEN_UPDATE_STATIC(taitol) + MCFG_SCREEN_VBLANK_STATIC(taitol) MCFG_GFXDECODE(1) MCFG_PALETTE_LENGTH(256) @@ -2119,7 +2116,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_13_33056MHz/2) /* not verified */ MCFG_CPU_PROGRAM_MAP(evilston_map) - MCFG_CPU_VBLANK_INT_HACK(vbl_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", vbl_interrupt, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, XTAL_12MHz/3) /* not verified */ MCFG_CPU_PROGRAM_MAP(evilston_2_map) @@ -2135,11 +2132,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitol) - MCFG_SCREEN_EOF(taitol) + MCFG_SCREEN_UPDATE_STATIC(taitol) + MCFG_SCREEN_VBLANK_STATIC(taitol) MCFG_GFXDECODE(2) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/taito_o.c mame-0.145/src/mame/drivers/taito_o.c --- mame-0.144/src/mame/drivers/taito_o.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_o.c 2012-02-06 21:30:34.000000000 +0000 @@ -29,7 +29,6 @@ *****************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "video/taitoic.h" @@ -101,9 +100,7 @@ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_Y) PORT_NAME("Opto 2L") PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_I) PORT_NAME("All Clear") - PORT_DIPNAME(0x0010, 0x10, "Test Mode") /* sometimes */ - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x000, DEF_STR( On ) ) + PORT_SERVICE_NO_TOGGLE(0x0010, IP_ACTIVE_LOW ) PORT_DIPNAME(0x0020, 0x20, "IN1 5") PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -214,10 +211,17 @@ GFXDECODE_ENTRY( "gfx1", 0, parentj_layout, 0x0, 0x400/16 ) GFXDECODE_END - -static INTERRUPT_GEN( parentj_interrupt ) +/* unknown sources ... */ +static TIMER_DEVICE_CALLBACK( parentj_interrupt ) { - device_set_input_line(device, cpu_getiloops(device) ? 4 : 5, HOLD_LINE); + taitoo_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 448) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + + if(scanline == 0) + device_set_input_line(state->m_maincpu, 5, HOLD_LINE); } static const ym2203_interface ym2203_config = @@ -250,17 +254,16 @@ MCFG_CPU_ADD("maincpu", M68000,12000000 ) /*?? MHz */ MCFG_CPU_PROGRAM_MAP(parentj_map) - MCFG_CPU_VBLANK_INT_HACK(parentj_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", parentj_interrupt, "screen", 0, 1) MCFG_MACHINE_START(taitoo) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*16, 32*16-1, 3*16, 31*16-1) - MCFG_SCREEN_UPDATE(parentj) + MCFG_SCREEN_UPDATE_STATIC(parentj) MCFG_GFXDECODE(parentj) MCFG_PALETTE_LENGTH(33*16) diff -Nru mame-0.144/src/mame/drivers/taitopjc.c mame-0.145/src/mame/drivers/taitopjc.c --- mame-0.144/src/mame/drivers/taitopjc.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitopjc.c 2012-02-06 21:30:42.000000000 +0000 @@ -71,7 +71,7 @@ } -static SCREEN_UPDATE( taitopjc ) +static SCREEN_UPDATE_RGB32( taitopjc ) { { UINT8 *s = (UINT8*)jc_char_ram; @@ -95,7 +95,7 @@ for (y=0; y < 16; y++) { - UINT32 *fb = BITMAP_ADDR32(bitmap, y+(u*16), 0); + UINT32 *fb = &bitmap.pix32(y+(u*16)); for (x=0; x < 16; x++) { UINT8 p = s[((tile*256) + ((y*16)+x)) ^3]; @@ -407,12 +407,11 @@ MCFG_QUANTUM_TIME(attotime::from_hz(6000)) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(640, 768) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 767) - MCFG_SCREEN_UPDATE(taitopjc) + MCFG_SCREEN_UPDATE_STATIC(taitopjc) MCFG_VIDEO_START(taitopjc) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/taitosj.c mame-0.145/src/mame/drivers/taitosj.c --- mame-0.144/src/mame/drivers/taitosj.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitosj.c 2012-02-06 21:30:34.000000000 +0000 @@ -1813,10 +1813,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(taitosj) + MCFG_SCREEN_UPDATE_STATIC(taitosj) MCFG_GFXDECODE(taitosj) MCFG_PALETTE_LENGTH(64) @@ -1868,7 +1867,7 @@ MCFG_CPU_PROGRAM_MAP(kikstart_main_map) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(kikstart) + MCFG_SCREEN_UPDATE_STATIC(kikstart) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/taitotz.c mame-0.145/src/mame/drivers/taitotz.c --- mame-0.144/src/mame/drivers/taitotz.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitotz.c 2012-02-06 21:30:34.000000000 +0000 @@ -98,7 +98,7 @@ UINT32 *video_ram; UINT32 video_ram_ptr; - bitmap_t *framebuffer; + bitmap_rgb32 framebuffer; }; @@ -107,10 +107,10 @@ { taitotz_state *state = machine.driver_data(); - state->framebuffer = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->framebuffer); } -static SCREEN_UPDATE( taitotz ) +static SCREEN_UPDATE_RGB32( taitotz ) { /* { @@ -126,7 +126,7 @@ for (y=0; y < FONT_HEIGHT; y++) { - UINT32 *fb = BITMAP_ADDR32(bitmap, y+(u*FONT_WIDTH), 0); + UINT32 *fb = &bitmap.pix32(y+(u*FONT_WIDTH)); for (x=0; x < FONT_WIDTH; x++) { UINT32 p = s[((tile*(FONT_WIDTH*FONT_HEIGHT*2)) + ((y*FONT_WIDTH)+x)) ^ 1]; @@ -145,7 +145,7 @@ int t,u; for (u=0; u < 256; u++) { - UINT32 *fb = BITMAP_ADDR32(bitmap, u, 0); + UINT32 *fb = &bitmap.pix32(u); for (t=0; t < 512; t++) { UINT32 p = s[((u*512)+t) ^ 1]; @@ -156,9 +156,9 @@ } */ - taitotz_state *state = screen->machine().driver_data(); + taitotz_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); copybitmap_trans(bitmap, state->framebuffer, 0, 0, 0, 0, cliprect, 0); return 0; @@ -182,7 +182,7 @@ { int u = tileu; - UINT32 *fb = BITMAP_ADDR32(state->framebuffer, j, 0); + UINT32 *fb = &state->framebuffer.pix32(j); for (int i=tilex; i < (tilex+16); i++) { @@ -426,12 +426,11 @@ MCFG_MACHINE_RESET( taitotz ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(640, 512) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 511) - MCFG_SCREEN_UPDATE(taitotz) + MCFG_SCREEN_UPDATE_STATIC(taitotz) MCFG_VIDEO_START(taitotz) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/taitowlf.c mame-0.145/src/mame/drivers/taitowlf.c --- mame-0.144/src/mame/drivers/taitowlf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/taitowlf.c 2012-02-06 21:30:42.000000000 +0000 @@ -1,8 +1,30 @@ /* Taito Wolf System Driver by Ville Linde + +AMD M4-128N/64 stamped 'E58-01' +AMD MACH231 stamped 'E58-02' +AMD MACH211 stamped 'E58-03' +Zoom ZFX2 +Zoom ZSG-2 +Taito TC0510NIO +Panasonic MN1020019 +1x RAM NEC 42S4260 +1x RAM GM71C4400 +12x RAM Alliance AS4C256K16E0-35 (256k x 16) +Mitsubishi M66220 +Fujitsu MB87078 +Atmel 93C66 EEPROM (4kb probably for high scores, test mode settings etc) +ICS GENDAC ICS5342-3 +3DFX 500-0003-03 F805281.1 FBI +3DFX 500-0004-02 F804701.1 TMU +some logic +clocks 50MHz (near 3DFX) and 14.31818MHz (near RAMDAC) + */ +#define ENABLE_VGA 0 + #include "emu.h" #include "cpu/i386/i386.h" #include "memconv.h" @@ -16,7 +38,9 @@ #include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" - +#if ENABLE_VGA +#include "video/pc_vga.h" +#endif class taitowlf_state : public driver_device { @@ -24,7 +48,6 @@ taitowlf_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - UINT32 *m_cga_ram; UINT32 *m_bios_ram; UINT8 m_mxtc_config_reg[256]; UINT8 m_piix4_config_reg[4][256]; @@ -39,74 +62,37 @@ device_t *m_dma8237_2; }; - -static void ide_interrupt(device_t *device, int state); - - -static const rgb_t cga_palette[16] = +#if !ENABLE_VGA +static SCREEN_UPDATE_RGB32( taitowlf ) { - MAKE_RGB( 0x00, 0x00, 0x00 ), MAKE_RGB( 0x00, 0x00, 0xaa ), MAKE_RGB( 0x00, 0xaa, 0x00 ), MAKE_RGB( 0x00, 0xaa, 0xaa ), - MAKE_RGB( 0xaa, 0x00, 0x00 ), MAKE_RGB( 0xaa, 0x00, 0xaa ), MAKE_RGB( 0xaa, 0x55, 0x00 ), MAKE_RGB( 0xaa, 0xaa, 0xaa ), - MAKE_RGB( 0x55, 0x55, 0x55 ), MAKE_RGB( 0x55, 0x55, 0xff ), MAKE_RGB( 0x55, 0xff, 0x55 ), MAKE_RGB( 0x55, 0xff, 0xff ), - MAKE_RGB( 0xff, 0x55, 0x55 ), MAKE_RGB( 0xff, 0x55, 0xff ), MAKE_RGB( 0xff, 0xff, 0x55 ), MAKE_RGB( 0xff, 0xff, 0xff ), -}; + int x,y,count; + const UINT8 *blit_ram = screen.machine().region("user5")->base(); -static VIDEO_START(taitowlf) -{ - int i; - for (i=0; i < 16; i++) - { - palette_set_color(machine, i, cga_palette[i]); - } -} + bitmap.fill(get_black_pen(screen.machine()), cliprect); -static void draw_char(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int ch, int att, int x, int y) -{ - int i,j; - const UINT8 *dp; - int index = 0; - dp = gfx_element_get_data(gfx, ch); + count = (0); - for (j=y; j < y+8; j++) + for(y=0;y<256;y++) { - UINT16 *p = BITMAP_ADDR16(bitmap, j, 0); - for (i=x; i < x+8; i++) + for(x=0;x<512;x++) { - UINT8 pen = dp[index++]; - if (pen) - p[i] = gfx->color_base + (att & 0xf); - else - p[i] = gfx->color_base + ((att >> 4) & 0x7); - } - } -} + UINT32 color; -static SCREEN_UPDATE(taitowlf) -{ - taitowlf_state *state = screen->machine().driver_data(); - int i, j; - const gfx_element *gfx = screen->machine().gfx[0]; - UINT32 *cga = state->m_cga_ram; - int index = 0; + color = (blit_ram[count] & 0xff); - bitmap_fill(bitmap, cliprect, 0); + if(cliprect.contains(x+0, y)) + bitmap.pix32(y, x+0) = screen.machine().pens[color]; - for (j=0; j < 25; j++) - { - for (i=0; i < 80; i+=2) - { - int att0 = (cga[index] >> 8) & 0xff; - int ch0 = (cga[index] >> 0) & 0xff; - int att1 = (cga[index] >> 24) & 0xff; - int ch1 = (cga[index] >> 16) & 0xff; - - draw_char(bitmap, cliprect, gfx, ch0, att0, i*8, j*8); - draw_char(bitmap, cliprect, gfx, ch1, att1, (i*8)+8, j*8); - index++; + count++; } } + return 0; } +#endif + +static void ide_interrupt(device_t *device, int state); + static READ8_DEVICE_HANDLER(at_dma8237_2_r) { @@ -473,8 +459,12 @@ static ADDRESS_MAP_START( taitowlf_map, AS_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0x000a0000, 0x000affff) AM_RAM - AM_RANGE(0x000b0000, 0x000b7fff) AM_RAM AM_BASE_MEMBER(taitowlf_state, m_cga_ram) + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM + #if ENABLE_VGA + AM_RANGE(0x000c0000, 0x000c7fff) AM_RAM AM_REGION("video_bios", 0) + #else + AM_RANGE(0x000c0000, 0x000c7fff) AM_NOP + #endif AM_RANGE(0x000e0000, 0x000effff) AM_RAM AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bank1") AM_RANGE(0x000f0000, 0x000fffff) AM_WRITE(bios_ram_w) @@ -503,28 +493,7 @@ /*****************************************************************************/ -static const gfx_layout CGA_charlayout = -{ - 8,8, /* 8 x 16 characters */ - 256, /* 256 characters */ - 1, /* 1 bits per pixel */ - { 0 }, /* no bitplanes; 1 bit per pixel */ - /* x offsets */ - { 0,1,2,3,4,5,6,7 }, - /* y offsets */ - { 0*8,1*8,2*8,3*8, - 4*8,5*8,6*8,7*8 }, - 8*8 /* every char takes 8 bytes */ -}; - -static GFXDECODE_START( CGA ) -/* Support up to four CGA fonts */ - GFXDECODE_ENTRY( "gfx1", 0x0000, CGA_charlayout, 0, 256 ) /* Font 0 */ - GFXDECODE_ENTRY( "gfx1", 0x0800, CGA_charlayout, 0, 256 ) /* Font 1 */ - GFXDECODE_ENTRY( "gfx1", 0x1000, CGA_charlayout, 0, 256 ) /* Font 2 */ - GFXDECODE_ENTRY( "gfx1", 0x1800, CGA_charlayout, 0, 256 ) /* Font 3*/ -GFXDECODE_END - +#if 0 #define AT_KEYB_HELPER(bit, text, key1) \ PORT_BIT( bit, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME(text) PORT_CODE(key1) @@ -558,6 +527,7 @@ PORT_START("pc_keyboard_7") INPUT_PORTS_END +#endif static IRQ_CALLBACK(irq_callback) { @@ -643,6 +613,18 @@ } }; +#if !ENABLE_VGA +/* debug purpose*/ +static PALETTE_INIT( taitowlf ) +{ + palette_set_color(machine,0x70,MAKE_RGB(0xff,0xff,0xff)); + palette_set_color(machine,0x71,MAKE_RGB(0xff,0xff,0xff)); + palette_set_color(machine,0x01,MAKE_RGB(0x55,0x00,0x00)); + palette_set_color(machine,0x10,MAKE_RGB(0xaa,0x00,0x00)); + palette_set_color(machine,0x00,MAKE_RGB(0x00,0x00,0x00)); +} +#endif + static MACHINE_CONFIG_START( taitowlf, taitowlf_state ) /* basic machine hardware */ @@ -666,18 +648,19 @@ MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) /* video hardware */ + #if ENABLE_VGA + MCFG_FRAGMENT_ADD( pcvideo_vga ) + #else + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(taitowlf) - - MCFG_GFXDECODE(CGA) - MCFG_PALETTE_LENGTH(16) - - MCFG_VIDEO_START(taitowlf) + MCFG_SCREEN_SIZE(512, 256) + MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1) + MCFG_PALETTE_LENGTH(256) + MCFG_SCREEN_UPDATE_STATIC(taitowlf) + MCFG_PALETTE_INIT(taitowlf) + #endif MACHINE_CONFIG_END static void set_gate_a20(running_machine &machine, int a20) @@ -705,7 +688,7 @@ static const struct kbdc8042_interface at8042 = { - KBDC8042_AT386, set_gate_a20, keyboard_interrupt, taitowlf_get_out2 + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, taitowlf_get_out2 }; static void taitowlf_set_keyb_int(running_machine &machine, int state) @@ -714,6 +697,10 @@ pic8259_ir1_w(drvstate->m_pic8259_1, state); } +#if ENABLE_VGA +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color +#endif + static DRIVER_INIT( taitowlf ) { taitowlf_state *state = machine.driver_data(); @@ -724,6 +711,10 @@ intel82439tx_init(machine); kbdc8042_init(machine, &at8042); + #if ENABLE_VGA + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); + #endif } /*****************************************************************************/ @@ -732,8 +723,11 @@ ROM_REGION32_LE(0x40000, "user1", 0) ROM_LOAD("p5tx-la.bin", 0x00000, 0x40000, CRC(072e6d51) SHA1(70414349b37e478fc28ecbaba47ad1033ae583b7)) - ROM_REGION(0x08100, "gfx1", 0) - ROM_LOAD("cga.chr", 0x00000, 0x01000, CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) + #if ENABLE_VGA + ROM_REGION( 0x8000, "video_bios", 0 ) // debug + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) + #endif ROM_REGION32_LE(0x400000, "user3", 0) // Program ROM disk ROM_LOAD("u1.bin", 0x000000, 0x200000, CRC(8f4c09cb) SHA1(0969a92fec819868881683c580f9e01cbedf4ad2)) @@ -766,4 +760,4 @@ /*****************************************************************************/ -GAME(1997, pf2012, 0, taitowlf, taitowlf, taitowlf, ROT0, "Taito", "Psychic Force 2012", GAME_NOT_WORKING | GAME_NO_SOUND) +GAME(1997, pf2012, 0, taitowlf, pc_keyboard, taitowlf, ROT0, "Taito", "Psychic Force 2012", GAME_NOT_WORKING | GAME_NO_SOUND) diff -Nru mame-0.144/src/mame/drivers/taito_x.c mame-0.145/src/mame/drivers/taito_x.c --- mame-0.144/src/mame/drivers/taito_x.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_x.c 2012-02-06 21:30:34.000000000 +0000 @@ -831,10 +831,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.43) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(52*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) MCFG_GFXDECODE(superman) MCFG_PALETTE_LENGTH(2048) @@ -874,10 +873,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(52*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) MCFG_GFXDECODE(superman) MCFG_PALETTE_LENGTH(2048) @@ -915,10 +913,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(52*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) MCFG_GFXDECODE(superman) MCFG_PALETTE_LENGTH(2048) @@ -958,10 +955,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(52*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(seta_no_layers) + MCFG_SCREEN_UPDATE_STATIC(seta_no_layers) MCFG_GFXDECODE(ballbros) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/taito_z.c mame-0.145/src/mame/drivers/taito_z.c --- mame-0.144/src/mame/drivers/taito_z.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taito_z.c 2012-02-06 21:30:34.000000000 +0000 @@ -196,7 +196,7 @@ including video output. For example, if the harness is connected backwards, this chip blows and kills the PCB. Even manually resetting the 68000's cannot restart the PCB, and it just shows a wavey pattern on screen. - TC0110PCR - Pallete Generator + TC0110PCR - Palette Generator TC0100SCN - Tilemap Generator TC0150ROD - Road Generator TC0050VDZ - \ Motion Object Generator Combo? @@ -2723,6 +2723,20 @@ PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(25) PORT_KEYDELTA(13) PORT_CENTERDELTA(0) PORT_PLAYER(2) INPUT_PORTS_END +static INPUT_PORTS_START( spacegnj ) + PORT_INCLUDE( spacegun ) + + PORT_MODIFY("DSWA") + TAITO_COINAGE_JAPAN_OLD_LOC(SW A) +INPUT_PORTS_END + +static INPUT_PORTS_START( spacegnu ) + PORT_INCLUDE( spacegun ) + + PORT_MODIFY("DSWA") + TAITO_COINAGE_US_LOC(SW A) +INPUT_PORTS_END + static INPUT_PORTS_START( dblaxle ) PORT_START("DSWA") PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW A:1" ) @@ -3103,10 +3117,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 3*8, 31*8-1) - MCFG_SCREEN_UPDATE(contcirc) + MCFG_SCREEN_UPDATE_STATIC(contcirc) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3168,10 +3181,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(chasehq) + MCFG_SCREEN_UPDATE_STATIC(chasehq) MCFG_GFXDECODE(chasehq) MCFG_PALETTE_LENGTH(4096) @@ -3233,10 +3245,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 31*8-1) - MCFG_SCREEN_UPDATE(contcirc) + MCFG_SCREEN_UPDATE_STATIC(contcirc) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3296,10 +3307,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(bshark) + MCFG_SCREEN_UPDATE_STATIC(bshark) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3368,10 +3378,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(sci) + MCFG_SCREEN_UPDATE_STATIC(sci) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3431,10 +3440,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(chasehq) + MCFG_SCREEN_UPDATE_STATIC(chasehq) MCFG_GFXDECODE(chasehq) MCFG_PALETTE_LENGTH(4096) @@ -3496,10 +3504,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(aquajack) + MCFG_SCREEN_UPDATE_STATIC(aquajack) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3558,10 +3565,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(spacegun) + MCFG_SCREEN_UPDATE_STATIC(spacegun) MCFG_GFXDECODE(taitoz) MCFG_PALETTE_LENGTH(4096) @@ -3620,10 +3626,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(dblaxle) + MCFG_SCREEN_UPDATE_STATIC(dblaxle) MCFG_GFXDECODE(dblaxle) MCFG_PALETTE_LENGTH(4096) @@ -3683,10 +3688,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(dblaxle) + MCFG_SCREEN_UPDATE_STATIC(dblaxle) MCFG_GFXDECODE(dblaxle) MCFG_PALETTE_LENGTH(4096) @@ -4895,8 +4899,84 @@ ROM_LOAD16_BYTE( "c57-22.73", 0x40001, 0x20000, CRC(5855fde3) SHA1(fcd6d7ed16b61b9023596f0efb7f6971060a2e0b) ) ROM_REGION( 0x40000, "sub", 0 ) /* 256K for 68000 code (CPU B) */ - ROM_LOAD16_BYTE( "c57-15.27", 0x00000, 0x20000, CRC(b36eb8f1) SHA1(e6e9fb844fd9acc6ee8a515a964d5df8de088a8c) ) - ROM_LOAD16_BYTE( "c57-16.29", 0x00001, 0x20000, CRC(bfb5d1e7) SHA1(cbf22e9043aac54e08c5da74d973da27844170ef) ) + ROM_LOAD16_BYTE( "c57-15+.27", 0x00000, 0x20000, CRC(b36eb8f1) SHA1(e6e9fb844fd9acc6ee8a515a964d5df8de088a8c) ) /* Actual label is "C57 15*" */ + ROM_LOAD16_BYTE( "c57-16+.29", 0x00001, 0x20000, CRC(bfb5d1e7) SHA1(cbf22e9043aac54e08c5da74d973da27844170ef) ) /* Actual label is "C57 16*" */ + + ROM_REGION( 0x80000, "gfx1", 0 ) + ROM_LOAD( "c57-06.52", 0x00000, 0x80000, CRC(4ebadd5b) SHA1(d32a52b4d7dd19b0fa2551f93ce3d5cbcf2bc158) ) /* SCR 8x8 */ + + ROM_REGION( 0x400000, "gfx2", 0 ) + ROM_LOAD32_BYTE( "c57-01.25", 0x000000, 0x100000, CRC(f901b04e) SHA1(24bac1c3a0c585966a7cbeeebd9b2dd3acf45a67) ) /* OBJ 16x8 */ + ROM_LOAD32_BYTE( "c57-02.24", 0x000001, 0x100000, CRC(21ee4633) SHA1(ddb948b165127c8fb1a988b5a0f17f92117f1b66) ) + ROM_LOAD32_BYTE( "c57-03.12", 0x000002, 0x100000, CRC(fafca86f) SHA1(dc6ea78f0deafef632d8bd3677ec74e797dc69a2) ) + ROM_LOAD32_BYTE( "c57-04.11", 0x000003, 0x100000, CRC(a9787090) SHA1(8c05c4c0d14a9f60defb37225da37aadf946c563) ) + + ROM_REGION16_LE( 0x80000, "user1", 0 ) + ROM_LOAD16_WORD( "c57-05.36", 0x00000, 0x80000, CRC(6a70eb2e) SHA1(307dd876af65204e86e094b4015ffb4a655824f8) ) /* STY spritemap */ + + ROM_REGION( 0x80000, "ymsnd", 0 ) /* ADPCM samples */ + ROM_LOAD( "c57-07.76", 0x00000, 0x80000, CRC(ad653dc1) SHA1(2ec440f793b0a686233fbe61c9462f8365c42b65) ) + + ROM_REGION( 0x80000, "ymsnd.deltat", 0 ) /* Delta-T samples */ + ROM_LOAD( "c57-08.75", 0x00000, 0x80000, CRC(22593550) SHA1(e802e947e6947d146e1b57dbff7ac021e19e7b2b) ) + + ROM_REGION( 0x0c00, "plds", 0 ) + ROM_LOAD( "pal16l8-c57-09.9", 0x0000, 0x0104, CRC(ea93161e) SHA1(c83c6ce3696b2754abb861d41a8d587a8e82aa1e) ) + ROM_LOAD( "pal20l8-c57-10.47", 0x0200, 0x0144, CRC(3ee56888) SHA1(030efb0903d919686748b1ff86a327990832d0fa) ) + ROM_LOAD( "pal16l8-c57-11.48", 0x0400, 0x0104, CRC(6bb4372e) SHA1(513bf6f032a9043303b8660c106753ae214d28ff) ) + ROM_LOAD( "pal20l8-c57-12.61", 0x0600, 0x0144, CRC(debddb13) SHA1(47be25b3bb157d37b9813737544a56a2090f85ba) ) + ROM_LOAD( "pal16l8-c57-13.72", 0x0800, 0x0104, CRC(1369f23e) SHA1(bbc960cfc3edd07e89134e1b876aa7a6c0cba5ac) ) + ROM_LOAD( "pal16r4-c57-14.96", 0x0a00, 0x0104, CRC(75e1bf61) SHA1(e8358329a78ec0ab87641b2ecaec0b2b67c6ca30) ) +ROM_END + +ROM_START( spacegunu ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c57-18.62", 0x00000, 0x20000, CRC(19d7d52e) SHA1(4361929a43f911864ece4dcd06995ea6b6156c59) ) + ROM_LOAD16_BYTE( "c57-20.74", 0x00001, 0x20000, CRC(2e58253f) SHA1(36fb52ce1c6cf9f537cf500ba330b167871969b9) ) + ROM_LOAD16_BYTE( "c57-17.59", 0x40000, 0x20000, CRC(e197edb8) SHA1(2ffd000aac1825ecd564c273f0cc055710ba4050) ) + ROM_LOAD16_BYTE( "c57-21.73", 0x40001, 0x20000, CRC(2f52cd75) SHA1(7dfd1f57925a0993608055247d565af810753189) ) + + ROM_REGION( 0x40000, "sub", 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c57-15+.27", 0x00000, 0x20000, CRC(b36eb8f1) SHA1(e6e9fb844fd9acc6ee8a515a964d5df8de088a8c) ) /* Actual label is "C57 15*" */ + ROM_LOAD16_BYTE( "c57-16+.29", 0x00001, 0x20000, CRC(bfb5d1e7) SHA1(cbf22e9043aac54e08c5da74d973da27844170ef) ) /* Actual label is "C57 16*" */ + + ROM_REGION( 0x80000, "gfx1", 0 ) + ROM_LOAD( "c57-06.52", 0x00000, 0x80000, CRC(4ebadd5b) SHA1(d32a52b4d7dd19b0fa2551f93ce3d5cbcf2bc158) ) /* SCR 8x8 */ + + ROM_REGION( 0x400000, "gfx2", 0 ) + ROM_LOAD32_BYTE( "c57-01.25", 0x000000, 0x100000, CRC(f901b04e) SHA1(24bac1c3a0c585966a7cbeeebd9b2dd3acf45a67) ) /* OBJ 16x8 */ + ROM_LOAD32_BYTE( "c57-02.24", 0x000001, 0x100000, CRC(21ee4633) SHA1(ddb948b165127c8fb1a988b5a0f17f92117f1b66) ) + ROM_LOAD32_BYTE( "c57-03.12", 0x000002, 0x100000, CRC(fafca86f) SHA1(dc6ea78f0deafef632d8bd3677ec74e797dc69a2) ) + ROM_LOAD32_BYTE( "c57-04.11", 0x000003, 0x100000, CRC(a9787090) SHA1(8c05c4c0d14a9f60defb37225da37aadf946c563) ) + + ROM_REGION16_LE( 0x80000, "user1", 0 ) + ROM_LOAD16_WORD( "c57-05.36", 0x00000, 0x80000, CRC(6a70eb2e) SHA1(307dd876af65204e86e094b4015ffb4a655824f8) ) /* STY spritemap */ + + ROM_REGION( 0x80000, "ymsnd", 0 ) /* ADPCM samples */ + ROM_LOAD( "c57-07.76", 0x00000, 0x80000, CRC(ad653dc1) SHA1(2ec440f793b0a686233fbe61c9462f8365c42b65) ) + + ROM_REGION( 0x80000, "ymsnd.deltat", 0 ) /* Delta-T samples */ + ROM_LOAD( "c57-08.75", 0x00000, 0x80000, CRC(22593550) SHA1(e802e947e6947d146e1b57dbff7ac021e19e7b2b) ) + + ROM_REGION( 0x0c00, "plds", 0 ) + ROM_LOAD( "pal16l8-c57-09.9", 0x0000, 0x0104, CRC(ea93161e) SHA1(c83c6ce3696b2754abb861d41a8d587a8e82aa1e) ) + ROM_LOAD( "pal20l8-c57-10.47", 0x0200, 0x0144, CRC(3ee56888) SHA1(030efb0903d919686748b1ff86a327990832d0fa) ) + ROM_LOAD( "pal16l8-c57-11.48", 0x0400, 0x0104, CRC(6bb4372e) SHA1(513bf6f032a9043303b8660c106753ae214d28ff) ) + ROM_LOAD( "pal20l8-c57-12.61", 0x0600, 0x0144, CRC(debddb13) SHA1(47be25b3bb157d37b9813737544a56a2090f85ba) ) + ROM_LOAD( "pal16l8-c57-13.72", 0x0800, 0x0104, CRC(1369f23e) SHA1(bbc960cfc3edd07e89134e1b876aa7a6c0cba5ac) ) + ROM_LOAD( "pal16r4-c57-14.96", 0x0a00, 0x0104, CRC(75e1bf61) SHA1(e8358329a78ec0ab87641b2ecaec0b2b67c6ca30) ) +ROM_END + +ROM_START( spacegunj ) + ROM_REGION( 0x80000, "maincpu", 0 ) /* 512K for 68000 code (CPU A) */ + ROM_LOAD16_BYTE( "c57-18+.62", 0x00000, 0x20000, CRC(c648c093) SHA1(136baf474036a64c6c19e1c3ced36f796ca47f0e) ) /* Actual label is "C57 18*" */ + ROM_LOAD16_BYTE( "c57-20+.74", 0x00001, 0x20000, CRC(4de524f6) SHA1(ae4557cb17ad434939174a8092f117da90178320) ) /* Actual label is "C57 20*" */ + ROM_LOAD16_BYTE( "c57-17.59", 0x40000, 0x20000, CRC(e197edb8) SHA1(2ffd000aac1825ecd564c273f0cc055710ba4050) ) + ROM_LOAD16_BYTE( "c57-19.73", 0x40001, 0x20000, CRC(c15cac59) SHA1(62d7ce8f15032d215c6ca3d65605195958758ea6) ) + + ROM_REGION( 0x40000, "sub", 0 ) /* 256K for 68000 code (CPU B) */ + ROM_LOAD16_BYTE( "c57-15+.27", 0x00000, 0x20000, CRC(b36eb8f1) SHA1(e6e9fb844fd9acc6ee8a515a964d5df8de088a8c) ) /* Actual label is "C57 15*" */ + ROM_LOAD16_BYTE( "c57-16+.29", 0x00001, 0x20000, CRC(bfb5d1e7) SHA1(cbf22e9043aac54e08c5da74d973da27844170ef) ) /* Actual label is "C57 16*" */ ROM_REGION( 0x80000, "gfx1", 0 ) ROM_LOAD( "c57-06.52", 0x00000, 0x80000, CRC(4ebadd5b) SHA1(d32a52b4d7dd19b0fa2551f93ce3d5cbcf2bc158) ) /* SCR 8x8 */ @@ -5123,6 +5203,8 @@ GAME( 1990, aquajacku, aquajack, aquajack, aquajack, taitoz, ROT0, "Taito America Corporation", "Aqua Jack (US)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) GAME( 1990, aquajackj, aquajack, aquajack, aquajckj, taitoz, ROT0, "Taito Corporation", "Aqua Jack (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) GAME( 1990, spacegun, 0, spacegun, spacegun, bshark, ORIENTATION_FLIP_X, "Taito Corporation Japan", "Space Gun (World)", GAME_SUPPORTS_SAVE ) +GAME( 1990, spacegunj, spacegun, spacegun, spacegnj, bshark, ORIENTATION_FLIP_X, "Taito Corporation", "Space Gun (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1990, spacegunu, spacegun, spacegun, spacegnu, bshark, ORIENTATION_FLIP_X, "Taito America Corporation", "Space Gun (US)", GAME_SUPPORTS_SAVE ) GAMEL(1991, dblaxle, 0, dblaxle, dblaxle, dblaxle, ROT0, "Taito America Corporation", "Double Axle (US)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE, layout_dblaxle ) GAME( 1991, pwheelsj, dblaxle, dblaxle, pwheelsj, dblaxle, ROT0, "Taito Corporation", "Power Wheels (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) GAME( 1991, racingb, 0, racingb, dblaxle, dblaxle, ROT0, "Taito Corporation Japan", "Racing Beat (World)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/tank8.c mame-0.145/src/mame/drivers/tank8.c --- mame-0.144/src/mame/drivers/tank8.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tank8.c 2012-02-06 21:30:36.000000000 +0000 @@ -341,11 +341,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(30 * 1000000 / 15681)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 524) MCFG_SCREEN_VISIBLE_AREA(16, 495, 0, 463) - MCFG_SCREEN_UPDATE(tank8) - MCFG_SCREEN_EOF(tank8) + MCFG_SCREEN_UPDATE_STATIC(tank8) + MCFG_SCREEN_VBLANK_STATIC(tank8) MCFG_GFXDECODE(tank8) MCFG_PALETTE_LENGTH(20) diff -Nru mame-0.144/src/mame/drivers/tankbatt.c mame-0.145/src/mame/drivers/tankbatt.c --- mame-0.144/src/mame/drivers/tankbatt.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tankbatt.c 2012-02-06 21:30:37.000000000 +0000 @@ -99,14 +99,12 @@ /* hack - turn off the engine noise if the normal game nmi's are disabled */ if (data) sample_stop (space->machine().device("samples"), 2); -// interrupt_enable_w (offset, !data); } static WRITE8_HANDLER( tankbatt_demo_interrupt_enable_w ) { tankbatt_state *state = space->machine().driver_data(); state->m_nmi_enable = data; -// interrupt_enable_w (offset, data); } static WRITE8_HANDLER( tankbatt_sh_expl_w ) @@ -274,10 +272,10 @@ static const char *const tankbatt_sample_names[] = { "*tankbatt", - "fire.wav", - "engine1.wav", - "engine2.wav", - "explode1.wav", + "fire", + "engine1", + "engine2", + "explode1", 0 /* end of array */ }; @@ -300,10 +298,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tankbatt) + MCFG_SCREEN_UPDATE_STATIC(tankbatt) MCFG_GFXDECODE(tankbatt) MCFG_PALETTE_LENGTH(256*2) diff -Nru mame-0.144/src/mame/drivers/tankbust.c mame-0.145/src/mame/drivers/tankbust.c --- mame-0.144/src/mame/drivers/tankbust.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tankbust.c 2012-02-06 21:30:37.000000000 +0000 @@ -78,16 +78,16 @@ switch (offset) { case 0: /* 0xe000 interrupt enable */ - interrupt_enable_w(space, 0, data); - break; + state->m_irq_mask = data & 1; + break; case 1: /* 0xe001 (value 0 then 1) written right after the soundlatch_w */ space->machine().scheduler().synchronize(FUNC(soundirqline_callback), data); - break; + break; case 2: /* 0xe002 coin counter */ coin_counter_w(space->machine(), 0, data&1); - break; + break; case 6: /* 0xe006 screen disable ?? or disable screen update */ /* program sets this to 0, @@ -95,14 +95,14 @@ and sets this to 1 */ /* ???? */ - break; + break; case 7: /* 0xe007 bankswitch */ /* bank 1 at 0x6000-9fff = from 0x10000 when bit0=0 else from 0x14000 */ /* bank 2 at 0xa000-bfff = from 0x18000 when bit0=0 else from 0x1a000 */ memory_set_bankptr(space->machine(), "bank1", space->machine().region("maincpu")->base() + 0x10000 + ((data&1) * 0x4000) ); memory_set_bankptr(space->machine(), "bank2", space->machine().region("maincpu")->base() + 0x18000 + ((data&1) * 0x2000) ); /* verified (the game will reset after the "game over" otherwise) */ - break; + break; } } @@ -142,7 +142,6 @@ //rr g g g r b b - bad but still close -#if 1 //close one /* blue component */ bit0 = (color_prom[i] >> 0) & 0x01; bit1 = (color_prom[i] >> 1) & 0x01; @@ -159,7 +158,6 @@ bit0 = (color_prom[i] >> 6) & 0x01; bit1 = (color_prom[i] >> 7) & 0x01; r = 0x55 * bit0 + 0xaa * bit1; -#endif palette_set_color(machine,i,MAKE_RGB(r,g,b)); } @@ -324,17 +322,23 @@ state->m_variable_data = 0x11; } +static INTERRUPT_GEN( vblank_irq ) +{ + tankbust_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} static MACHINE_CONFIG_START( tankbust, tankbust_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_14_31818MHz/2) /* Verified on PCB */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("sub", Z80, XTAL_14_31818MHz/4) /* Verified on PCB */ // MCFG_CPU_ADD("sub", Z80, XTAL_14_31818MHz/3) /* Accurate to audio recording, but apparently incorrect clock */ - MCFG_CPU_PROGRAM_MAP(map_cpu2) MCFG_CPU_IO_MAP(port_map_cpu2) @@ -346,11 +350,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE ( 64*8, 32*8 ) MCFG_SCREEN_VISIBLE_AREA ( 16*8, 56*8-1, 1*8, 31*8-1 ) // MCFG_SCREEN_VISIBLE_AREA ( 0*8, 64*8-1, 1*8, 31*8-1 ) - MCFG_SCREEN_UPDATE ( tankbust ) + MCFG_SCREEN_UPDATE_STATIC ( tankbust ) MCFG_GFXDECODE( tankbust ) diff -Nru mame-0.144/src/mame/drivers/taotaido.c mame-0.145/src/mame/drivers/taotaido.c --- mame-0.144/src/mame/drivers/taotaido.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/taotaido.c 2012-02-06 21:30:36.000000000 +0000 @@ -347,11 +347,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(taotaido) - MCFG_SCREEN_EOF( taotaido ) + MCFG_SCREEN_UPDATE_STATIC(taotaido) + MCFG_SCREEN_VBLANK_STATIC( taotaido ) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/tapatune.c mame-0.145/src/mame/drivers/tapatune.c --- mame-0.144/src/mame/drivers/tapatune.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tapatune.c 2012-02-06 21:30:38.000000000 +0000 @@ -330,7 +330,7 @@ static MC6845_UPDATE_ROW( update_row ) { tapatune_state *state = device->machine().driver_data(); - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); UINT16 x; pen_t *pens = (pen_t *)param; @@ -349,13 +349,6 @@ { } -static SCREEN_UPDATE( tapatune ) -{ - mc6845_device *mc6845 = screen->machine().device("crtc"); - mc6845->update(bitmap, cliprect); - return 0; -} - static WRITE_LINE_DEVICE_HANDLER(crtc_vsync) { cputag_set_input_line(device->machine(), "maincpu", 2, state ? ASSERT_LINE : CLEAR_LINE); @@ -390,10 +383,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tapatune) + MCFG_SCREEN_UPDATE_DEVICE("crtc", h46505_device, screen_update) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/targeth.c mame-0.145/src/mame/drivers/targeth.c --- mame-0.144/src/mame/drivers/targeth.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/targeth.c 2012-02-06 21:30:35.000000000 +0000 @@ -9,7 +9,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "includes/targeth.h" @@ -30,18 +29,23 @@ GFXDECODE_END -static INTERRUPT_GEN(targeth_interrupt ) +static TIMER_DEVICE_CALLBACK(targeth_interrupt ) { - switch(cpu_getiloops(device)){ - case 0: /* IRQ 2: drives the game */ - device_set_input_line(device, 2, HOLD_LINE); - break; - case 1: /* IRQ 4: Read 1P Gun */ - device_set_input_line(device, 4, HOLD_LINE); - break; - case 2: /* IRQ 6: Read 2P Gun */ - device_set_input_line(device, 6, HOLD_LINE); - break; + targeth_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 240) + { + /* IRQ 2: drives the game */ + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); + } + + if(scanline == 0) + { + /* IRQ 4: Read 1P Gun */ + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); + /* IRQ 6: Read 2P Gun */ + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); } } @@ -172,16 +176,15 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000,24000000/2) /* 12 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT_HACK(targeth_interrupt,3) + MCFG_TIMER_ADD_SCANLINE("scantimer", targeth_interrupt, "screen", 0, 1) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) /* 1024x512 */ MCFG_SCREEN_VISIBLE_AREA(0, 24*16-1, 16, 16*16-1) /* 400x240 */ - MCFG_SCREEN_UPDATE(targeth) + MCFG_SCREEN_UPDATE_STATIC(targeth) MCFG_GFXDECODE(0x080000) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/tatsumi.c mame-0.145/src/mame/drivers/tatsumi.c --- mame-0.144/src/mame/drivers/tatsumi.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tatsumi.c 2012-02-06 21:30:40.000000000 +0000 @@ -898,9 +898,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(CLOCK_2 / 8, 400, 0, 320, 280, 0, 240) // TODO: Hook up CRTC - MCFG_SCREEN_UPDATE(apache3) + MCFG_SCREEN_UPDATE_STATIC(apache3) MCFG_GFXDECODE(apache3) MCFG_PALETTE_LENGTH(1024 + 4096) /* 1024 real colours, and 4096 arranged as series of cluts */ @@ -939,10 +938,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(roundup5) + MCFG_SCREEN_UPDATE_STATIC(roundup5) MCFG_GFXDECODE(roundup5) MCFG_PALETTE_LENGTH(1024 + 4096) /* 1024 real colours, and 4096 arranged as series of cluts */ @@ -982,10 +980,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(cyclwarr) + MCFG_SCREEN_UPDATE_STATIC(cyclwarr) MCFG_GFXDECODE(cyclwarr) MCFG_PALETTE_LENGTH(8192 + 8192) @@ -1025,10 +1022,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(bigfight) + MCFG_SCREEN_UPDATE_STATIC(bigfight) MCFG_GFXDECODE(cyclwarr) MCFG_PALETTE_LENGTH(8192 + 8192) diff -Nru mame-0.144/src/mame/drivers/tattack.c mame-0.145/src/mame/drivers/tattack.c --- mame-0.144/src/mame/drivers/tattack.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tattack.c 2012-02-06 21:30:40.000000000 +0000 @@ -53,11 +53,11 @@ 0); } -static SCREEN_UPDATE( tattack ) +static SCREEN_UPDATE_IND16( tattack ) { - tattack_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty(state->m_tmap); - tilemap_draw(bitmap,cliprect,state->m_tmap, 0,0); + tattack_state *state = screen.machine().driver_data(); + state->m_tmap->mark_all_dirty(); + state->m_tmap->draw(bitmap, cliprect, 0,0); return 0; } @@ -203,10 +203,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(tattack) + MCFG_SCREEN_UPDATE_STATIC(tattack) MCFG_GFXDECODE(tattack) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/taxidriv.c mame-0.145/src/mame/drivers/taxidriv.c --- mame-0.144/src/mame/drivers/taxidriv.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/taxidriv.c 2012-02-06 21:30:35.000000000 +0000 @@ -0,0 +1,467 @@ +/*************************************************************************** + +Taxi Driver (c) 1984 Graphic Techno + +XTAL: 10MHz, 8MHz +CPU: 3 * NEC D780C (clocks unknown) +SOUND: 2 * AY-3-8910 (clocks unknown) +OTHER: 5 * M5L8255AP + +***************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/8255ppi.h" +#include "includes/taxidriv.h" +#include "sound/ay8910.h" + + + +static WRITE8_DEVICE_HANDLER( p2a_w ) { taxidriv_spritectrl_w(device,0,data); } +static WRITE8_DEVICE_HANDLER( p2b_w ) { taxidriv_spritectrl_w(device,1,data); } +static WRITE8_DEVICE_HANDLER( p2c_w ) { taxidriv_spritectrl_w(device,2,data); } +static WRITE8_DEVICE_HANDLER( p3a_w ) { taxidriv_spritectrl_w(device,3,data); } +static WRITE8_DEVICE_HANDLER( p3b_w ) { taxidriv_spritectrl_w(device,4,data); } +static WRITE8_DEVICE_HANDLER( p3c_w ) { taxidriv_spritectrl_w(device,5,data); } +static WRITE8_DEVICE_HANDLER( p4a_w ) { taxidriv_spritectrl_w(device,6,data); } +static WRITE8_DEVICE_HANDLER( p4b_w ) { taxidriv_spritectrl_w(device,7,data); } +static WRITE8_DEVICE_HANDLER( p4c_w ) { taxidriv_spritectrl_w(device,8,data); } + + +static READ8_DEVICE_HANDLER( p0a_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return state->m_latchA; +} + +static READ8_DEVICE_HANDLER( p0c_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return (state->m_s1 << 7); +} + +static WRITE8_DEVICE_HANDLER( p0b_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_latchB = data; +} + +static WRITE8_DEVICE_HANDLER( p0c_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_s2 = data & 1; + + state->m_bghide = data & 2; + + /* bit 2 toggles during gameplay */ + + flip_screen_set(device->machine(), data & 8); + +// popmessage("%02x",data&0x0f); +} + +static READ8_DEVICE_HANDLER( p1b_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return state->m_latchB; +} + +static READ8_DEVICE_HANDLER( p1c_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return (state->m_s2 << 7) | (state->m_s4 << 6) | ((input_port_read(device->machine(), "SERVCOIN") & 1) << 4); +} + +static WRITE8_DEVICE_HANDLER( p1a_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_latchA = data; +} + +static WRITE8_DEVICE_HANDLER( p1c_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_s1 = data & 1; + state->m_s3 = (data & 2) >> 1; +} + +static READ8_DEVICE_HANDLER( p8910_0a_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return state->m_latchA; +} + +static READ8_DEVICE_HANDLER( p8910_1a_r ) +{ + taxidriv_state *state = device->machine().driver_data(); + return state->m_s3; +} + +/* note that a lot of writes happen with port B set as input. I think this is a bug in the + original, since it works anyway even if the communication is flawed. */ +static WRITE8_DEVICE_HANDLER( p8910_0b_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_s4 = data & 1; +} + + +static const ppi8255_interface ppi8255_intf[5] = +{ + { + DEVCB_HANDLER(p0a_r), /* Port A read */ + DEVCB_NULL, /* Port B read */ + DEVCB_HANDLER(p0c_r), /* Port C read */ + DEVCB_NULL, /* Port A write */ + DEVCB_HANDLER(p0b_w), /* Port B write */ + DEVCB_HANDLER(p0c_w) /* Port C write */ + }, + { + DEVCB_NULL, /* Port A read */ + DEVCB_HANDLER(p1b_r), /* Port B read */ + DEVCB_HANDLER(p1c_r), /* Port C read */ + DEVCB_HANDLER(p1a_w), /* Port A write */ + DEVCB_NULL, /* Port B write */ + DEVCB_HANDLER(p1c_w) /* Port C write */ + }, + { + DEVCB_NULL, /* Port A read */ + DEVCB_NULL, /* Port B read */ + DEVCB_NULL, /* Port C read */ + DEVCB_HANDLER(p2a_w), /* Port A write */ + DEVCB_HANDLER(p2b_w), /* Port B write */ + DEVCB_HANDLER(p2c_w) /* Port C write */ + }, + { + DEVCB_NULL, /* Port A read */ + DEVCB_NULL, /* Port B read */ + DEVCB_NULL, /* Port C read */ + DEVCB_HANDLER(p3a_w), /* Port A write */ + DEVCB_HANDLER(p3b_w), /* Port B write */ + DEVCB_HANDLER(p3c_w) /* Port C write */ + }, + { + DEVCB_NULL, /* Port A read */ + DEVCB_NULL, /* Port B read */ + DEVCB_NULL, /* Port C read */ + DEVCB_HANDLER(p4a_w), /* Port A write */ + DEVCB_HANDLER(p4b_w), /* Port B write */ + DEVCB_HANDLER(p4c_w) /* Port C write */ + } +}; + + +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x8fff) AM_RAM /* ??? */ + AM_RANGE(0x9000, 0x9fff) AM_RAM /* ??? */ + AM_RANGE(0xa000, 0xafff) AM_RAM /* ??? */ + AM_RANGE(0xb000, 0xbfff) AM_RAM /* ??? */ + AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_BASE_MEMBER(taxidriv_state, m_vram4) /* radar bitmap */ + AM_RANGE(0xc800, 0xcfff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram5) /* "sprite1" bitmap */ + AM_RANGE(0xd000, 0xd7ff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram6) /* "sprite2" bitmap */ + AM_RANGE(0xd800, 0xdfff) AM_RAM AM_BASE_MEMBER(taxidriv_state, m_vram7) /* "sprite3" bitmap */ + AM_RANGE(0xe000, 0xf3ff) AM_READONLY + AM_RANGE(0xe000, 0xe3ff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram1) /* car tilemap */ + AM_RANGE(0xe400, 0xebff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram2) /* bg1 tilemap */ + AM_RANGE(0xec00, 0xefff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram0) /* fg tilemap */ + AM_RANGE(0xf000, 0xf3ff) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_vram3) /* bg2 tilemap */ + AM_RANGE(0xf400, 0xf403) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) + AM_RANGE(0xf480, 0xf483) AM_DEVREADWRITE("ppi8255_2", ppi8255_r, ppi8255_w) /* "sprite1" placement */ + AM_RANGE(0xf500, 0xf503) AM_DEVREADWRITE("ppi8255_3", ppi8255_r, ppi8255_w) /* "sprite2" placement */ + AM_RANGE(0xf580, 0xf583) AM_DEVREADWRITE("ppi8255_4", ppi8255_r, ppi8255_w) /* "sprite3" placement */ + //AM_RANGE(0xf780, 0xf781) AM_WRITEONLY /* more scroll registers? */ + AM_RANGE(0xf782, 0xf787) AM_WRITEONLY AM_BASE_MEMBER(taxidriv_state, m_scroll) /* bg scroll (three copies always identical) */ + AM_RANGE(0xf800, 0xffff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x6000, 0x67ff) AM_RAM + AM_RANGE(0x8000, 0x87ff) AM_RAM + AM_RANGE(0xa000, 0xa003) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) + AM_RANGE(0xe000, 0xe000) AM_READ_PORT("DSW0") + AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW1") + AM_RANGE(0xe002, 0xe002) AM_READ_PORT("DSW2") + AM_RANGE(0xe003, 0xe003) AM_READ_PORT("P1") + AM_RANGE(0xe004, 0xe004) AM_READ_PORT("P2") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cpu3_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x2000, 0x2000) AM_READNOP /* irq ack? */ + AM_RANGE(0xfc00, 0xffff) AM_RAM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( cpu3_port_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_address_data_w) + AM_RANGE(0x01, 0x01) AM_DEVREAD("ay1", ay8910_r) + AM_RANGE(0x02, 0x03) AM_DEVWRITE("ay2", ay8910_address_data_w) + AM_RANGE(0x03, 0x03) AM_DEVREAD("ay2", ay8910_r) +ADDRESS_MAP_END + + +static INPUT_PORTS_START( taxidriv ) + PORT_START("DSW0") + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x0d, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 4C_2C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0b, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0c, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x09, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x0f, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0xd0, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0xa0, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0xe0, DEF_STR( 4C_2C ) ) + PORT_DIPSETTING( 0x70, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0xb0, DEF_STR( 3C_2C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 3C_4C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x90, DEF_STR( 2C_5C ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0xf0, DEF_STR( Free_Play ) ) + + PORT_START("DSW1") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x01, "4" ) + PORT_DIPSETTING( 0x02, "5" ) + PORT_DIPSETTING( 0x03, "255 (Cheat)") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x08, "2" ) + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPSETTING( 0x18, "4" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPSETTING( 0x28, "6" ) + PORT_DIPSETTING( 0x30, "7" ) + PORT_DIPSETTING( 0x38, "8" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, "0" ) + PORT_DIPSETTING( 0x40, "1" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x07, 0x00, "Fuel Consumption" ) + PORT_DIPSETTING( 0x00, "Slowest" ) + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPSETTING( 0x02, "3" ) + PORT_DIPSETTING( 0x03, "4" ) + PORT_DIPSETTING( 0x04, "5" ) + PORT_DIPSETTING( 0x05, "6" ) + PORT_DIPSETTING( 0x06, "7" ) + PORT_DIPSETTING( 0x07, "Fastest" ) + PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x08, "2" ) + PORT_DIPSETTING( 0x10, "3" ) + PORT_DIPSETTING( 0x18, "4" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPSETTING( 0x28, "6" ) + PORT_DIPSETTING( 0x30, "7" ) + PORT_DIPSETTING( 0x38, "8" ) + PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, "40/30" ) + PORT_DIPSETTING( 0x40, "30/20" ) + PORT_DIPSETTING( 0x80, "20/15" ) + PORT_DIPSETTING( 0xc0, "10/10" ) + + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY + + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL + + PORT_START("SERVCOIN") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* handled by p1c_r() */ +INPUT_PORTS_END + + + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,1), + 4, + { 3, 2, 1, 0 }, + { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, + 32*8 +}; + +static const gfx_layout charlayout2 = +{ + 4,4, + RGN_FRAC(1,1), + 4, + { 3, 2, 1, 0 }, + { 1*4, 0*4, 3*4, 2*4 }, + { 0*16, 1*16, 2*16, 3*16 }, + 16*4 +}; + + +static GFXDECODE_START( taxidriv ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx3", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx4", 0, charlayout, 0, 1 ) + GFXDECODE_ENTRY( "gfx5", 0, charlayout2, 0, 1 ) +GFXDECODE_END + + + +static const ay8910_interface ay8910_interface_1 = +{ + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_HANDLER(p8910_0a_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_HANDLER(p8910_0b_w) +}; + +static const ay8910_interface ay8910_interface_2 = +{ + AY8910_LEGACY_OUTPUT, + AY8910_DEFAULT_LOADS, + DEVCB_HANDLER(p8910_1a_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + + + +static MACHINE_CONFIG_START( taxidriv, taxidriv_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", Z80,4000000) /* 4 MHz ??? */ + MCFG_CPU_PROGRAM_MAP(main_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + + MCFG_CPU_ADD("sub", Z80,4000000) /* 4 MHz ??? */ + MCFG_CPU_PROGRAM_MAP(cpu2_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* ??? */ + + MCFG_CPU_ADD("audiocpu", Z80,4000000) /* 4 MHz ??? */ + MCFG_CPU_PROGRAM_MAP(cpu3_map) + MCFG_CPU_IO_MAP(cpu3_port_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* ??? */ + + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ + /* synchronization of the CPUs */ + + MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] ) + MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) + MCFG_PPI8255_ADD( "ppi8255_2", ppi8255_intf[2] ) + MCFG_PPI8255_ADD( "ppi8255_3", ppi8255_intf[3] ) + MCFG_PPI8255_ADD( "ppi8255_4", ppi8255_intf[4] ) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 27*8-1) + MCFG_SCREEN_UPDATE_STATIC(taxidriv) + + MCFG_GFXDECODE(taxidriv) + MCFG_PALETTE_LENGTH(16) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("ay1", AY8910, 1250000) + MCFG_SOUND_CONFIG(ay8910_interface_1) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + + MCFG_SOUND_ADD("ay2", AY8910, 1250000) + MCFG_SOUND_CONFIG(ay8910_interface_2) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_CONFIG_END + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( taxidriv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "1.ic87", 0x0000, 0x2000, CRC(6b2424e9) SHA1(a65bb01da8f3b0649d945981cc4f1324b7fac5c7) ) + ROM_LOAD( "2.ic86", 0x2000, 0x2000, CRC(15111229) SHA1(0350918f9504b0e470684ebc94a823bb2513a54d) ) + ROM_LOAD( "3.ic85", 0x4000, 0x2000, CRC(a7782eee) SHA1(0f10b7876420f4237937b1b922aa410de3f79af1) ) + ROM_LOAD( "4.ic84", 0x6000, 0x2000, CRC(8eb0b16b) SHA1(a0015744373ee91bc505f077a04ab3546f8bb6fb) ) + + ROM_REGION( 0x10000, "sub", 0 ) + ROM_LOAD( "8.ic4", 0x0000, 0x2000, CRC(9f9a3865) SHA1(908cf4f2cc68c088649241997276ea25c27d9718) ) +// ROM_LOAD( "8.ic4", 0x0000, 0x2000, CRC(9835d517) SHA1(845f3efc54b64837c22dd06683c2950f2b8b03cb) ) // 0x1b5f = 0x04 instead of 0x03 from another set + ROM_LOAD( "9.ic5", 0x2000, 0x2000, CRC(b28b766c) SHA1(21e08ef1e2671c8540380e3fa0858e8a4d821945) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "7.ic14", 0x0000, 0x2000, CRC(2b4cbfe6) SHA1(a2a900831116554d5aea1a81c93245d3bb424d48) ) + + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD( "5.m.ic68", 0x0000, 0x2000, CRC(a3aa5f2f) SHA1(7e046e2a5d230c62d93a83f5a773e6e4d6e85961) ) + + ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_LOAD( "6.1.ic35", 0x0000, 0x2000, CRC(bfddd550) SHA1(f528c2701c635bc61eda14fbe2cfe9b44cb75c20) ) + + ROM_REGION( 0x6000, "gfx3", 0 ) + ROM_LOAD( "11.30.ic87", 0x0000, 0x2000, CRC(7485eaea) SHA1(8d69c61145470003cfeb33b11b81345c5e5e6503) ) + ROM_LOAD( "14.31.ic110", 0x2000, 0x2000, CRC(0d99a33e) SHA1(0df29464ea43aecd866ae322f4f7ca9152422023) ) + ROM_LOAD( "15.32.ic111", 0x4000, 0x2000, CRC(410fdf7c) SHA1(0957f335b84c4fbde983271786e7bf199fc22682) ) + + ROM_REGION( 0x2000, "gfx4", 0 ) + ROM_LOAD( "10.40.ic99", 0x0000, 0x2000, CRC(c370b177) SHA1(4b3f73f764ff95cc7777fe01333558201658cead) ) + + ROM_REGION( 0x4000, "gfx5", 0 ) /* not used?? */ + ROM_LOAD( "12.21.ic88", 0x0000, 0x2000, CRC(684b7bb0) SHA1(d83c45ff3adf94c649340227794020482231399f) ) + ROM_LOAD( "13.20.ic89", 0x2000, 0x2000, CRC(d1ef110e) SHA1(e34b6b4b70c783a8cf1296a05d3cec6af5820d0c) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "prom.ic2", 0x0000, 0x0100, NO_DUMP ) // color prom located at edge of pcb +ROM_END + + +GAME( 1984, taxidriv, 0, taxidriv, taxidriv, 0, ROT90, "Graphic Techno", "Taxi Driver", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) diff -Nru mame-0.144/src/mame/drivers/taxidrvr.c mame-0.145/src/mame/drivers/taxidrvr.c --- mame-0.144/src/mame/drivers/taxidrvr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/taxidrvr.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,460 +0,0 @@ -/*************************************************************************** - -Taxi Driver (c) 1984 Graphic Techno - -***************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "machine/8255ppi.h" -#include "includes/taxidrvr.h" -#include "sound/ay8910.h" - - - -static WRITE8_DEVICE_HANDLER( p2a_w ) { taxidrvr_spritectrl_w(device,0,data); } -static WRITE8_DEVICE_HANDLER( p2b_w ) { taxidrvr_spritectrl_w(device,1,data); } -static WRITE8_DEVICE_HANDLER( p2c_w ) { taxidrvr_spritectrl_w(device,2,data); } -static WRITE8_DEVICE_HANDLER( p3a_w ) { taxidrvr_spritectrl_w(device,3,data); } -static WRITE8_DEVICE_HANDLER( p3b_w ) { taxidrvr_spritectrl_w(device,4,data); } -static WRITE8_DEVICE_HANDLER( p3c_w ) { taxidrvr_spritectrl_w(device,5,data); } -static WRITE8_DEVICE_HANDLER( p4a_w ) { taxidrvr_spritectrl_w(device,6,data); } -static WRITE8_DEVICE_HANDLER( p4b_w ) { taxidrvr_spritectrl_w(device,7,data); } -static WRITE8_DEVICE_HANDLER( p4c_w ) { taxidrvr_spritectrl_w(device,8,data); } - - -static READ8_DEVICE_HANDLER( p0a_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return state->m_latchA; -} - -static READ8_DEVICE_HANDLER( p0c_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return (state->m_s1 << 7); -} - -static WRITE8_DEVICE_HANDLER( p0b_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_latchB = data; -} - -static WRITE8_DEVICE_HANDLER( p0c_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_s2 = data & 1; - - state->m_bghide = data & 2; - - /* bit 2 toggles during gameplay */ - - flip_screen_set(device->machine(), data & 8); - -// popmessage("%02x",data&0x0f); -} - -static READ8_DEVICE_HANDLER( p1b_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return state->m_latchB; -} - -static READ8_DEVICE_HANDLER( p1c_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return (state->m_s2 << 7) | (state->m_s4 << 6) | ((input_port_read(device->machine(), "SERVCOIN") & 1) << 4); -} - -static WRITE8_DEVICE_HANDLER( p1a_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_latchA = data; -} - -static WRITE8_DEVICE_HANDLER( p1c_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_s1 = data & 1; - state->m_s3 = (data & 2) >> 1; -} - -static READ8_DEVICE_HANDLER( p8910_0a_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return state->m_latchA; -} - -static READ8_DEVICE_HANDLER( p8910_1a_r ) -{ - taxidrvr_state *state = device->machine().driver_data(); - return state->m_s3; -} - -/* note that a lot of writes happen with port B set as input. I think this is a bug in the - original, since it works anyway even if the communication is flawed. */ -static WRITE8_DEVICE_HANDLER( p8910_0b_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_s4 = data & 1; -} - - -static const ppi8255_interface ppi8255_intf[5] = -{ - { - DEVCB_HANDLER(p0a_r), /* Port A read */ - DEVCB_NULL, /* Port B read */ - DEVCB_HANDLER(p0c_r), /* Port C read */ - DEVCB_NULL, /* Port A write */ - DEVCB_HANDLER(p0b_w), /* Port B write */ - DEVCB_HANDLER(p0c_w) /* Port C write */ - }, - { - DEVCB_NULL, /* Port A read */ - DEVCB_HANDLER(p1b_r), /* Port B read */ - DEVCB_HANDLER(p1c_r), /* Port C read */ - DEVCB_HANDLER(p1a_w), /* Port A write */ - DEVCB_NULL, /* Port B write */ - DEVCB_HANDLER(p1c_w) /* Port C write */ - }, - { - DEVCB_NULL, /* Port A read */ - DEVCB_NULL, /* Port B read */ - DEVCB_NULL, /* Port C read */ - DEVCB_HANDLER(p2a_w), /* Port A write */ - DEVCB_HANDLER(p2b_w), /* Port B write */ - DEVCB_HANDLER(p2c_w) /* Port C write */ - }, - { - DEVCB_NULL, /* Port A read */ - DEVCB_NULL, /* Port B read */ - DEVCB_NULL, /* Port C read */ - DEVCB_HANDLER(p3a_w), /* Port A write */ - DEVCB_HANDLER(p3b_w), /* Port B write */ - DEVCB_HANDLER(p3c_w) /* Port C write */ - }, - { - DEVCB_NULL, /* Port A read */ - DEVCB_NULL, /* Port B read */ - DEVCB_NULL, /* Port C read */ - DEVCB_HANDLER(p4a_w), /* Port A write */ - DEVCB_HANDLER(p4b_w), /* Port B write */ - DEVCB_HANDLER(p4c_w) /* Port C write */ - } -}; - - -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0x8fff) AM_RAM /* ??? */ - AM_RANGE(0x9000, 0x9fff) AM_RAM /* ??? */ - AM_RANGE(0xa000, 0xafff) AM_RAM /* ??? */ - AM_RANGE(0xb000, 0xbfff) AM_RAM /* ??? */ - AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_BASE_MEMBER(taxidrvr_state, m_vram4) /* radar bitmap */ - AM_RANGE(0xc800, 0xcfff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram5) /* "sprite1" bitmap */ - AM_RANGE(0xd000, 0xd7ff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram6) /* "sprite2" bitmap */ - AM_RANGE(0xd800, 0xdfff) AM_RAM AM_BASE_MEMBER(taxidrvr_state, m_vram7) /* "sprite3" bitmap */ - AM_RANGE(0xe000, 0xf3ff) AM_READONLY - AM_RANGE(0xe000, 0xe3ff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram1) /* car tilemap */ - AM_RANGE(0xe400, 0xebff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram2) /* bg1 tilemap */ - AM_RANGE(0xec00, 0xefff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram0) /* fg tilemap */ - AM_RANGE(0xf000, 0xf3ff) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_vram3) /* bg2 tilemap */ - AM_RANGE(0xf400, 0xf403) AM_DEVREADWRITE("ppi8255_0", ppi8255_r, ppi8255_w) - AM_RANGE(0xf480, 0xf483) AM_DEVREADWRITE("ppi8255_2", ppi8255_r, ppi8255_w) /* "sprite1" placement */ - AM_RANGE(0xf500, 0xf503) AM_DEVREADWRITE("ppi8255_3", ppi8255_r, ppi8255_w) /* "sprite2" placement */ - AM_RANGE(0xf580, 0xf583) AM_DEVREADWRITE("ppi8255_4", ppi8255_r, ppi8255_w) /* "sprite3" placement */ - //AM_RANGE(0xf780, 0xf781) AM_WRITEONLY /* more scroll registers? */ - AM_RANGE(0xf782, 0xf787) AM_WRITEONLY AM_BASE_MEMBER(taxidrvr_state, m_scroll) /* bg scroll (three copies always identical) */ - AM_RANGE(0xf800, 0xffff) AM_RAM -ADDRESS_MAP_END - -static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_ROM - AM_RANGE(0x6000, 0x67ff) AM_RAM - AM_RANGE(0x8000, 0x87ff) AM_RAM - AM_RANGE(0xa000, 0xa003) AM_DEVREADWRITE("ppi8255_1", ppi8255_r, ppi8255_w) - AM_RANGE(0xe000, 0xe000) AM_READ_PORT("DSW0") - AM_RANGE(0xe001, 0xe001) AM_READ_PORT("DSW1") - AM_RANGE(0xe002, 0xe002) AM_READ_PORT("DSW2") - AM_RANGE(0xe003, 0xe003) AM_READ_PORT("P1") - AM_RANGE(0xe004, 0xe004) AM_READ_PORT("P2") -ADDRESS_MAP_END - -static ADDRESS_MAP_START( cpu3_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x1fff) AM_ROM - AM_RANGE(0x2000, 0x2000) AM_READNOP /* irq ack? */ - AM_RANGE(0xfc00, 0xffff) AM_RAM -ADDRESS_MAP_END - -static ADDRESS_MAP_START( cpu3_port_map, AS_IO, 8 ) - ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_address_data_w) - AM_RANGE(0x01, 0x01) AM_DEVREAD("ay1", ay8910_r) - AM_RANGE(0x02, 0x03) AM_DEVWRITE("ay2", ay8910_address_data_w) - AM_RANGE(0x03, 0x03) AM_DEVREAD("ay2", ay8910_r) -ADDRESS_MAP_END - - -static INPUT_PORTS_START( taxidrvr ) - PORT_START("DSW0") - PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) - PORT_DIPSETTING( 0x0d, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x0a, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x0e, DEF_STR( 4C_2C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x0b, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x09, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0x0f, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) - PORT_DIPSETTING( 0xd0, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0xa0, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0xe0, DEF_STR( 4C_2C ) ) - PORT_DIPSETTING( 0x70, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0xb0, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0xc0, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x80, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x90, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0xf0, DEF_STR( Free_Play ) ) - - PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x00, "3" ) - PORT_DIPSETTING( 0x01, "4" ) - PORT_DIPSETTING( 0x02, "5" ) - PORT_DIPSETTING( 0x03, "255 (Cheat)") - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x08, "2" ) - PORT_DIPSETTING( 0x10, "3" ) - PORT_DIPSETTING( 0x18, "4" ) - PORT_DIPSETTING( 0x20, "5" ) - PORT_DIPSETTING( 0x28, "6" ) - PORT_DIPSETTING( 0x30, "7" ) - PORT_DIPSETTING( 0x38, "8" ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, "0" ) - PORT_DIPSETTING( 0x40, "1" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x07, 0x00, "Fuel Consumption" ) - PORT_DIPSETTING( 0x00, "Slowest" ) - PORT_DIPSETTING( 0x01, "2" ) - PORT_DIPSETTING( 0x02, "3" ) - PORT_DIPSETTING( 0x03, "4" ) - PORT_DIPSETTING( 0x04, "5" ) - PORT_DIPSETTING( 0x05, "6" ) - PORT_DIPSETTING( 0x06, "7" ) - PORT_DIPSETTING( 0x07, "Fastest" ) - PORT_DIPNAME( 0x38, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x08, "2" ) - PORT_DIPSETTING( 0x10, "3" ) - PORT_DIPSETTING( 0x18, "4" ) - PORT_DIPSETTING( 0x20, "5" ) - PORT_DIPSETTING( 0x28, "6" ) - PORT_DIPSETTING( 0x30, "7" ) - PORT_DIPSETTING( 0x38, "8" ) - PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, "40/30" ) - PORT_DIPSETTING( 0x40, "30/20" ) - PORT_DIPSETTING( 0x80, "20/15" ) - PORT_DIPSETTING( 0xc0, "10/10" ) - - PORT_START("P1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY - - PORT_START("P2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL - - PORT_START("SERVCOIN") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* handled by p1c_r() */ -INPUT_PORTS_END - - - -static const gfx_layout charlayout = -{ - 8,8, - RGN_FRAC(1,1), - 4, - { 3, 2, 1, 0 }, - { 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 }, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 }, - 32*8 -}; - -static const gfx_layout charlayout2 = -{ - 4,4, - RGN_FRAC(1,1), - 4, - { 3, 2, 1, 0 }, - { 1*4, 0*4, 3*4, 2*4 }, - { 0*16, 1*16, 2*16, 3*16 }, - 16*4 -}; - - -static GFXDECODE_START( taxidrvr ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) - GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 1 ) - GFXDECODE_ENTRY( "gfx3", 0, charlayout, 0, 1 ) - GFXDECODE_ENTRY( "gfx4", 0, charlayout, 0, 1 ) - GFXDECODE_ENTRY( "gfx5", 0, charlayout2, 0, 1 ) -GFXDECODE_END - - - -static const ay8910_interface ay8910_interface_1 = -{ - AY8910_LEGACY_OUTPUT, - AY8910_DEFAULT_LOADS, - DEVCB_HANDLER(p8910_0a_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_HANDLER(p8910_0b_w) -}; - -static const ay8910_interface ay8910_interface_2 = -{ - AY8910_LEGACY_OUTPUT, - AY8910_DEFAULT_LOADS, - DEVCB_HANDLER(p8910_1a_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL -}; - - - -static MACHINE_CONFIG_START( taxidrvr, taxidrvr_state ) - - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80,4000000) /* 4 MHz ??? */ - MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) - - MCFG_CPU_ADD("sub", Z80,4000000) /* 4 MHz ??? */ - MCFG_CPU_PROGRAM_MAP(cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* ??? */ - - MCFG_CPU_ADD("audiocpu", Z80,4000000) /* 4 MHz ??? */ - MCFG_CPU_PROGRAM_MAP(cpu3_map) - MCFG_CPU_IO_MAP(cpu3_port_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) /* ??? */ - - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */ - /* synchronization of the CPUs */ - - MCFG_PPI8255_ADD( "ppi8255_0", ppi8255_intf[0] ) - MCFG_PPI8255_ADD( "ppi8255_1", ppi8255_intf[1] ) - MCFG_PPI8255_ADD( "ppi8255_2", ppi8255_intf[2] ) - MCFG_PPI8255_ADD( "ppi8255_3", ppi8255_intf[3] ) - MCFG_PPI8255_ADD( "ppi8255_4", ppi8255_intf[4] ) - - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 27*8-1) - MCFG_SCREEN_UPDATE(taxidrvr) - - MCFG_GFXDECODE(taxidrvr) - MCFG_PALETTE_LENGTH(16) - - /* sound hardware */ - MCFG_SPEAKER_STANDARD_MONO("mono") - - MCFG_SOUND_ADD("ay1", AY8910, 1250000) - MCFG_SOUND_CONFIG(ay8910_interface_1) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) - - MCFG_SOUND_ADD("ay2", AY8910, 1250000) - MCFG_SOUND_CONFIG(ay8910_interface_2) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) -MACHINE_CONFIG_END - - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( taxidrvr ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "1", 0x0000, 0x2000, CRC(6b2424e9) SHA1(a65bb01da8f3b0649d945981cc4f1324b7fac5c7) ) - ROM_LOAD( "2", 0x2000, 0x2000, CRC(15111229) SHA1(0350918f9504b0e470684ebc94a823bb2513a54d) ) - ROM_LOAD( "3", 0x4000, 0x2000, CRC(a7782eee) SHA1(0f10b7876420f4237937b1b922aa410de3f79af1) ) - ROM_LOAD( "4", 0x6000, 0x2000, CRC(8eb0b16b) SHA1(a0015744373ee91bc505f077a04ab3546f8bb6fb) ) - - ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "8", 0x0000, 0x2000, CRC(9f9a3865) SHA1(908cf4f2cc68c088649241997276ea25c27d9718) ) - ROM_LOAD( "9", 0x2000, 0x2000, CRC(b28b766c) SHA1(21e08ef1e2671c8540380e3fa0858e8a4d821945) ) - - ROM_REGION( 0x10000, "audiocpu", 0 ) - ROM_LOAD( "7", 0x0000, 0x2000, CRC(2b4cbfe6) SHA1(a2a900831116554d5aea1a81c93245d3bb424d48) ) - - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD( "5", 0x0000, 0x2000, CRC(a3aa5f2f) SHA1(7e046e2a5d230c62d93a83f5a773e6e4d6e85961) ) - - ROM_REGION( 0x2000, "gfx2", 0 ) - ROM_LOAD( "6", 0x0000, 0x2000, CRC(bfddd550) SHA1(f528c2701c635bc61eda14fbe2cfe9b44cb75c20) ) - - ROM_REGION( 0x6000, "gfx3", 0 ) - ROM_LOAD( "11", 0x0000, 0x2000, CRC(7485eaea) SHA1(8d69c61145470003cfeb33b11b81345c5e5e6503) ) - ROM_LOAD( "14", 0x2000, 0x2000, CRC(0d99a33e) SHA1(0df29464ea43aecd866ae322f4f7ca9152422023) ) - ROM_LOAD( "15", 0x4000, 0x2000, CRC(410fdf7c) SHA1(0957f335b84c4fbde983271786e7bf199fc22682) ) - - ROM_REGION( 0x2000, "gfx4", 0 ) - ROM_LOAD( "10", 0x0000, 0x2000, CRC(c370b177) SHA1(4b3f73f764ff95cc7777fe01333558201658cead) ) - - ROM_REGION( 0x4000, "gfx5", 0 ) /* not used?? */ - ROM_LOAD( "12", 0x0000, 0x2000, CRC(684b7bb0) SHA1(d83c45ff3adf94c649340227794020482231399f) ) - ROM_LOAD( "13", 0x2000, 0x2000, CRC(d1ef110e) SHA1(e34b6b4b70c783a8cf1296a05d3cec6af5820d0c) ) -ROM_END - - - -GAME( 1984, taxidrvr, 0, taxidrvr, taxidrvr, 0, ROT90, "Graphic Techno", "Taxi Driver", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) diff -Nru mame-0.144/src/mame/drivers/tbowl.c mame-0.145/src/mame/drivers/tbowl.c --- mame-0.144/src/mame/drivers/tbowl.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tbowl.c 2012-02-06 21:30:36.000000000 +0000 @@ -483,20 +483,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tbowl) + MCFG_SCREEN_UPDATE_STATIC(tbowl_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tbowl) + MCFG_SCREEN_UPDATE_STATIC(tbowl_right) MCFG_VIDEO_START(tbowl) diff -Nru mame-0.144/src/mame/drivers/tceptor.c mame-0.145/src/mame/drivers/tceptor.c --- mame-0.144/src/mame/drivers/tceptor.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tceptor.c 2012-02-06 21:30:39.000000000 +0000 @@ -402,29 +402,26 @@ MCFG_DEFAULT_LAYOUT(layout_horizont) MCFG_SCREEN_ADD("2dscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(38*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 34*8-1 + 2*8, 0*8, 28*8-1 + 0) - MCFG_SCREEN_UPDATE(tceptor) + MCFG_SCREEN_UPDATE_STATIC(tceptor_2d) MCFG_SCREEN_ADD("3dleft", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(38*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 34*8-1 + 2*8, 0*8, 28*8-1 + 0) - MCFG_SCREEN_UPDATE(tceptor) + MCFG_SCREEN_UPDATE_STATIC(tceptor_3d_left) MCFG_SCREEN_ADD("3dright", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(38*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(2*8, 34*8-1 + 2*8, 0*8, 28*8-1 + 0) - MCFG_SCREEN_UPDATE(tceptor) - MCFG_SCREEN_EOF(tceptor) + MCFG_SCREEN_UPDATE_STATIC(tceptor_3d_right) + MCFG_SCREEN_VBLANK_STATIC(tceptor) MCFG_PALETTE_INIT(tceptor) diff -Nru mame-0.144/src/mame/drivers/tcl.c mame-0.145/src/mame/drivers/tcl.c --- mame-0.144/src/mame/drivers/tcl.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/tcl.c 2012-02-06 21:30:35.000000000 +0000 @@ -58,7 +58,7 @@ static VIDEO_START( tcl ) { } -static SCREEN_UPDATE( tcl ) +static SCREEN_UPDATE_IND16( tcl ) { return 0; } @@ -131,10 +131,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tcl) + MCFG_SCREEN_UPDATE_STATIC(tcl) MCFG_GFXDECODE(tcl) MCFG_PALETTE_LENGTH(16*16) diff -Nru mame-0.144/src/mame/drivers/techno.c mame-0.145/src/mame/drivers/techno.c --- mame-0.144/src/mame/drivers/techno.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/techno.c 2012-02-06 21:30:34.000000000 +0000 @@ -1,6 +1,9 @@ /* Technoplay "2-2C 8008 LS" (68000 CPU) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m68000/m68000.h" @@ -8,18 +11,28 @@ { public: techno_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( techno_map, AS_PROGRAM, 16 ) +static ADDRESS_MAP_START( techno_map, AS_PROGRAM, 16, techno_state ) AM_RANGE(0x0000, 0xffffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( techno ) INPUT_PORTS_END -static MACHINE_RESET( techno ) +void techno_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) MCFG_CPU_PROGRAM_MAP(techno_map) - - MCFG_MACHINE_RESET( techno ) MACHINE_CONFIG_END ROM_START(xforce) @@ -41,4 +52,4 @@ ROM_LOAD16_BYTE("ic17", 0x000000, 0x8000, CRC(122ef649) SHA1(0b425f81869bc359841377a91c39f44395502bff)) ROM_END -GAME(1987, xforce, 0, techno, techno, techno, ROT0, "Tecnoplay", "X Force", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1987, xforce, 0, techno, techno, techno, ROT0, "Tecnoplay", "X Force", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/tecmo16.c mame-0.145/src/mame/drivers/tecmo16.c --- mame-0.144/src/mame/drivers/tecmo16.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tecmo16.c 2012-02-06 21:30:38.000000000 +0000 @@ -389,10 +389,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tecmo16) + MCFG_SCREEN_UPDATE_STATIC(tecmo16) MCFG_GFXDECODE(tecmo16) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/tecmo.c mame-0.145/src/mame/drivers/tecmo.c --- mame-0.144/src/mame/drivers/tecmo.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tecmo.c 2012-02-06 21:30:37.000000000 +0000 @@ -632,10 +632,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tecmo) + MCFG_SCREEN_UPDATE_STATIC(tecmo) MCFG_GFXDECODE(tecmo) MCFG_PALETTE_LENGTH(1024) @@ -692,10 +691,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tecmo) + MCFG_SCREEN_UPDATE_STATIC(tecmo) MCFG_GFXDECODE(tecmo) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/tecmosys.c mame-0.145/src/mame/drivers/tecmosys.c --- mame-0.144/src/mame/drivers/tecmosys.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tecmosys.c 2012-02-06 21:30:39.000000000 +0000 @@ -4,6 +4,7 @@ ToDo: - Dump / Decap MCUs to allow for proper protection emulation. + - tkdenshoa pcb shows some garbage sprites at the top during y-scroll T.Slanina 20040530 : @@ -473,10 +474,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57.4458) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3000)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(tecmosys) + MCFG_SCREEN_UPDATE_STATIC(tecmosys) MCFG_PALETTE_LENGTH(0x4000+0x800) diff -Nru mame-0.144/src/mame/drivers/tehkanwc.c mame-0.145/src/mame/drivers/tehkanwc.c --- mame-0.144/src/mame/drivers/tehkanwc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tehkanwc.c 2012-02-06 21:30:34.000000000 +0000 @@ -666,10 +666,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tehkanwc) + MCFG_SCREEN_UPDATE_STATIC(tehkanwc) MCFG_GFXDECODE(tehkanwc) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/tempest.c mame-0.145/src/mame/drivers/tempest.c --- mame-0.144/src/mame/drivers/tempest.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tempest.c 2012-02-06 21:30:42.000000000 +0000 @@ -406,9 +406,9 @@ AM_RANGE(0x4800, 0x4800) AM_WRITE(avgdvg_go_w) AM_RANGE(0x5000, 0x5000) AM_WRITE(wdclr_w) AM_RANGE(0x5800, 0x5800) AM_WRITE(avgdvg_reset_w) - AM_RANGE(0x6000, 0x603f) AM_DEVWRITE("earom", atari_vg_earom_w) - AM_RANGE(0x6040, 0x6040) AM_DEVREAD("mathbox", mathbox_status_r) AM_DEVWRITE("earom", atari_vg_earom_ctrl_w) - AM_RANGE(0x6050, 0x6050) AM_DEVREAD("earom", atari_vg_earom_r) + AM_RANGE(0x6000, 0x603f) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, write) + AM_RANGE(0x6040, 0x6040) AM_DEVREAD("mathbox", mathbox_status_r) AM_DEVWRITE_MODERN("earom", atari_vg_earom_device, ctrl_w) + AM_RANGE(0x6050, 0x6050) AM_DEVREAD_MODERN("earom", atari_vg_earom_device, read) AM_RANGE(0x6060, 0x6060) AM_DEVREAD("mathbox", mathbox_lo_r) AM_RANGE(0x6070, 0x6070) AM_DEVREAD("mathbox", mathbox_hi_r) AM_RANGE(0x6080, 0x609f) AM_DEVWRITE("mathbox", mathbox_go_w) @@ -597,7 +597,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 580, 0, 570) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_tempest) diff -Nru mame-0.144/src/mame/drivers/terracre.c mame-0.145/src/mame/drivers/terracre.c --- mame-0.144/src/mame/drivers/terracre.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/terracre.c 2012-02-06 21:30:35.000000000 +0000 @@ -82,7 +82,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "sound/dac.h" #include "sound/2203intf.h" @@ -544,10 +543,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( 60 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(amazon) + MCFG_SCREEN_UPDATE_STATIC(amazon) MCFG_GFXDECODE(terracre) MCFG_PALETTE_LENGTH(1*16+16*16+16*256) @@ -580,10 +578,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( 60 ) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(amazon) + MCFG_SCREEN_UPDATE_STATIC(amazon) MCFG_GFXDECODE(terracre) MCFG_PALETTE_LENGTH(1*16+16*16+16*256) @@ -616,10 +613,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(amazon) + MCFG_SCREEN_UPDATE_STATIC(amazon) MCFG_GFXDECODE(terracre) MCFG_PALETTE_LENGTH(1*16+16*16+16*256) diff -Nru mame-0.144/src/mame/drivers/tetrisp2.c mame-0.145/src/mame/drivers/tetrisp2.c --- mame-0.144/src/mame/drivers/tetrisp2.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tetrisp2.c 2012-02-06 21:30:38.000000000 +0000 @@ -995,7 +995,7 @@ /* sprites are contained in 256x256 "tiles" */ -static GFXLAYOUT_RAW( spritelayout, 8, 256, 256, 256*8, 256*256*8 ) +static GFXLAYOUT_RAW( spritelayout, 256, 256, 256*8, 256*256*8 ) static GFXDECODE_START( tetrisp2 ) @@ -1114,10 +1114,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(tetrisp2) + MCFG_SCREEN_UPDATE_STATIC(tetrisp2) MCFG_GFXDECODE(tetrisp2) MCFG_PALETTE_LENGTH(0x8000) @@ -1146,10 +1145,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xf0) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0xf0-1) - MCFG_SCREEN_UPDATE(tetrisp2) + MCFG_SCREEN_UPDATE_STATIC(tetrisp2) MCFG_GFXDECODE(tetrisp2) MCFG_PALETTE_LENGTH(0x8000) @@ -1177,10 +1175,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(rockntread) + MCFG_SCREEN_UPDATE_STATIC(rockntread) MCFG_GFXDECODE(tetrisp2) MCFG_PALETTE_LENGTH(0x8000) @@ -1209,10 +1206,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(rockntread) + MCFG_SCREEN_UPDATE_STATIC(rockntread) MCFG_GFXDECODE(tetrisp2) MCFG_PALETTE_LENGTH(0x8000) @@ -1248,20 +1244,18 @@ MCFG_DEFAULT_LAYOUT(layout_rocknms) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(rocknms) + MCFG_SCREEN_UPDATE_STATIC(rocknms_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(0x140, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x140-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(rocknms) + MCFG_SCREEN_UPDATE_STATIC(rocknms_right) MCFG_VIDEO_START(rocknms) diff -Nru mame-0.144/src/mame/drivers/tgtpanic.c mame-0.145/src/mame/drivers/tgtpanic.c --- mame-0.144/src/mame/drivers/tgtpanic.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tgtpanic.c 2012-02-06 21:30:35.000000000 +0000 @@ -30,9 +30,9 @@ * *************************************/ -static SCREEN_UPDATE( tgtpanic ) +static SCREEN_UPDATE_RGB32( tgtpanic ) { - tgtpanic_state *state = screen->machine().driver_data(); + tgtpanic_state *state = screen.machine().driver_data(); UINT32 colors[4]; UINT32 offs; UINT32 x, y; @@ -50,17 +50,17 @@ x = (offs >> 7) << 2; /* I'm guessing the hardware doubles lines */ - *BITMAP_ADDR32(bitmap, y + 0, x + 0) = colors[val & 3]; - *BITMAP_ADDR32(bitmap, y + 1, x + 0) = colors[val & 3]; + bitmap.pix32(y + 0, x + 0) = colors[val & 3]; + bitmap.pix32(y + 1, x + 0) = colors[val & 3]; val >>= 2; - *BITMAP_ADDR32(bitmap, y + 0, x + 1) = colors[val & 3]; - *BITMAP_ADDR32(bitmap, y + 1, x + 1) = colors[val & 3]; + bitmap.pix32(y + 0, x + 1) = colors[val & 3]; + bitmap.pix32(y + 1, x + 1) = colors[val & 3]; val >>= 2; - *BITMAP_ADDR32(bitmap, y + 0, x + 2) = colors[val & 3]; - *BITMAP_ADDR32(bitmap, y + 1, x + 2) = colors[val & 3]; + bitmap.pix32(y + 0, x + 2) = colors[val & 3]; + bitmap.pix32(y + 1, x + 2) = colors[val & 3]; val >>= 2; - *BITMAP_ADDR32(bitmap, y + 0, x + 3) = colors[val & 3]; - *BITMAP_ADDR32(bitmap, y + 1, x + 3) = colors[val & 3]; + bitmap.pix32(y + 0, x + 3) = colors[val & 3]; + bitmap.pix32(y + 1, x + 3) = colors[val & 3]; } return 0; @@ -139,10 +139,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) /* Unverified */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* Unverified */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 192 - 1, 0, 192 - 1) - MCFG_SCREEN_UPDATE(tgtpanic) + MCFG_SCREEN_UPDATE_STATIC(tgtpanic) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/thayers.c mame-0.145/src/mame/drivers/thayers.c --- mame-0.144/src/mame/drivers/thayers.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/thayers.c 2012-02-06 21:30:35.000000000 +0000 @@ -13,7 +13,8 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "render.h" -#include "machine/laserdsc.h" +#include "machine/ldstub.h" +#include "machine/ldv1000.h" #include "cpu/cop400/cop400.h" //#include "dlair.lh" @@ -35,9 +36,12 @@ { public: thayers_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_pr7820(*this, "laserdisc"), + m_ldv1000(*this, "ldv1000") { } - device_t *m_laserdisc; + optional_device m_pr7820; + optional_device m_ldv1000; UINT8 m_laserdisc_data; int m_rx_bit; int m_keylatch; @@ -350,7 +354,9 @@ static READ8_HANDLER( laserdsc_data_r ) { thayers_state *state = space->machine().driver_data(); - return laserdisc_data_r(state->m_laserdisc); + if (state->m_ldv1000 != NULL) return state->m_ldv1000->status_r(); + if (state->m_pr7820 != NULL) return state->m_pr7820->data_r(); + return 0; } static WRITE8_HANDLER( laserdsc_data_w ) @@ -381,22 +387,18 @@ if (BIT(data, 5)) { - laserdisc_data_w(state->m_laserdisc, state->m_laserdisc_data); - } - - switch (laserdisc_get_type(state->m_laserdisc)) - { - case LASERDISC_TYPE_PIONEER_PR7820: + if (state->m_ldv1000 != NULL) + { + state->m_ldv1000->data_w(state->m_laserdisc_data); + state->m_ldv1000->enter_w(BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); + } + if (state->m_pr7820 != NULL) + { + state->m_pr7820->data_w(state->m_laserdisc_data); state->m_pr7820_enter = BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE; - - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_ENTER, state->m_pr7820_enter); - + state->m_pr7820->enter_w(state->m_pr7820_enter); // BIT(data, 7) is INT/_EXT, but there is no such input line in laserdsc.h - break; - - case LASERDISC_TYPE_PIONEER_LDV1000: - laserdisc_line_w(state->m_laserdisc, LASERDISC_LINE_ENTER, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); - break; + } } } @@ -615,30 +617,16 @@ static CUSTOM_INPUT( laserdisc_enter_r ) { thayers_state *state = field.machine().driver_data(); - switch (laserdisc_get_type(state->m_laserdisc)) - { - case LASERDISC_TYPE_PIONEER_PR7820: - return state->m_pr7820_enter; - - case LASERDISC_TYPE_PIONEER_LDV1000: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_STATUS) == ASSERT_LINE) ? 0 : 1; - } - + if (state->m_pr7820 != NULL) return state->m_pr7820_enter; + if (state->m_ldv1000 != NULL) return (state->m_ldv1000->status_strobe_r() == ASSERT_LINE) ? 0 : 1; return 0; } static CUSTOM_INPUT( laserdisc_ready_r ) { thayers_state *state = field.machine().driver_data(); - switch (laserdisc_get_type(state->m_laserdisc)) - { - case LASERDISC_TYPE_PIONEER_PR7820: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_READY) == ASSERT_LINE) ? 0 : 1; - - case LASERDISC_TYPE_PIONEER_LDV1000: - return (laserdisc_line_r(state->m_laserdisc, LASERDISC_LINE_COMMAND) == ASSERT_LINE) ? 0 : 1; - } - + if (state->m_pr7820 != NULL) return (state->m_pr7820->ready_r() == ASSERT_LINE) ? 0 : 1; + if (state->m_ldv1000 != NULL) return (state->m_ldv1000->command_strobe_r() == ASSERT_LINE) ? 0 : 1; return 0; } @@ -748,14 +736,12 @@ static MACHINE_START( thayers ) { thayers_state *state = machine.driver_data(); - state->m_laserdisc = machine.device("laserdisc"); memset(&state->m_ssi263, 0, sizeof(state->m_ssi263)); } static MACHINE_RESET( thayers ) { thayers_state *state = machine.driver_data(); - int newtype; state->m_laserdisc_data = 0; @@ -774,8 +760,8 @@ state->m_cart_present = 0; state->m_pr7820_enter = 0; - newtype = (input_port_read(machine, "DSWB") & 0x18) ? LASERDISC_TYPE_PIONEER_LDV1000 : LASERDISC_TYPE_PIONEER_PR7820; - laserdisc_set_type(state->m_laserdisc, newtype); +// newtype = (input_port_read(machine, "DSWB") & 0x18) ? LASERDISC_TYPE_PIONEER_LDV1000 : LASERDISC_TYPE_PIONEER_PR7820; +// laserdisc_set_type(state->m_laserdisc, newtype); } /* COP400 Interface */ @@ -802,10 +788,10 @@ MCFG_MACHINE_START(thayers) MCFG_MACHINE_RESET(thayers) - MCFG_LASERDISC_ADD("laserdisc", PIONEER_PR7820, "screen", "ldsound") + MCFG_LASERDISC_PR7820_ADD("laserdisc") /* video hardware */ - MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", BITMAP_FORMAT_RGB32) + MCFG_LASERDISC_SCREEN_ADD_NTSC("screen", "laserdisc") MCFG_PALETTE_LENGTH(256) @@ -813,7 +799,7 @@ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") // SSI 263 @ 2MHz - MCFG_SOUND_ADD("ldsound", LASERDISC_SOUND, 0) + MCFG_SOUND_MODIFY("laserdisc") MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/thedeep.c mame-0.145/src/mame/drivers/thedeep.c --- mame-0.144/src/mame/drivers/thedeep.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/thedeep.c 2012-02-06 21:30:37.000000000 +0000 @@ -27,7 +27,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "cpu/m6502/m6502.h" -#include "deprecat.h" +#include "cpu/mcs51/mcs51.h" #include "includes/thedeep.h" #include "sound/2203intf.h" @@ -118,7 +118,7 @@ // d166-d174: hl = (hl + 2*a) // d175-d181: hl *= e (e must be non zero) // d182-d19a: hl /= de - state->m_protection_data = space->machine().region("cpu3")->base()[0x185+state->m_protection_index++]; + state->m_protection_data = space->machine().region("mcu")->base()[0x185+state->m_protection_index++]; else state->m_protection_data = 0xc9; @@ -155,18 +155,18 @@ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") // ROM (banked) AM_RANGE(0xc000, 0xcfff) AM_RAM AM_RANGE(0xd000, 0xdfff) AM_RAM // RAM (MCU data copied here) - AM_RANGE(0xe000, 0xe000) AM_READWRITE(thedeep_protection_r, thedeep_protection_w ) // To MCU - AM_RANGE(0xe004, 0xe004) AM_READWRITE(thedeep_e004_r, thedeep_nmi_w ) // + AM_RANGE(0xe000, 0xe000) AM_READWRITE(thedeep_protection_r, thedeep_protection_w) // To MCU + AM_RANGE(0xe004, 0xe004) AM_READWRITE(thedeep_e004_r, thedeep_nmi_w) // AM_RANGE(0xe008, 0xe008) AM_READ_PORT("e008") // P1 (Inputs) AM_RANGE(0xe009, 0xe009) AM_READ_PORT("e009") // P2 AM_RANGE(0xe00a, 0xe00a) AM_READ_PORT("e00a") // DSW1 AM_RANGE(0xe00b, 0xe00b) AM_READ_PORT("e00b") // DSW2 - AM_RANGE(0xe00c, 0xe00c) AM_WRITE(thedeep_sound_w ) // To Sound CPU - AM_RANGE(0xe100, 0xe100) AM_WRITE(thedeep_e100_w ) // ? - AM_RANGE(0xe210, 0xe213) AM_WRITEONLY AM_BASE_MEMBER(thedeep_state, m_scroll ) // Scroll + AM_RANGE(0xe00c, 0xe00c) AM_WRITE(thedeep_sound_w) // To Sound CPU + AM_RANGE(0xe100, 0xe100) AM_WRITE(thedeep_e100_w) // ? + AM_RANGE(0xe210, 0xe213) AM_WRITEONLY AM_BASE_MEMBER(thedeep_state, m_scroll) // Scroll AM_RANGE(0xe400, 0xe7ff) AM_RAM AM_BASE_SIZE_MEMBER(thedeep_state, m_spriteram, m_spriteram_size) // Sprites - AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(thedeep_vram_1_w) AM_BASE_MEMBER(thedeep_state, m_vram_1 ) // Text Layer - AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(thedeep_vram_0_w) AM_BASE_MEMBER(thedeep_state, m_vram_0 ) // Background Layer + AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(thedeep_vram_1_w) AM_BASE_MEMBER(thedeep_state, m_vram_1) // Text Layer + AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(thedeep_vram_0_w) AM_BASE_MEMBER(thedeep_state, m_vram_0) // Background Layer AM_RANGE(0xf800, 0xf83f) AM_RAM AM_BASE_MEMBER(thedeep_state, m_scroll2 ) // Column Scroll AM_RANGE(0xf840, 0xffff) AM_RAM ADDRESS_MAP_END @@ -180,14 +180,97 @@ static ADDRESS_MAP_START( audio_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM - AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ymsnd", ym2203_w ) // - AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_r ) // From Main CPU + AM_RANGE(0x0800, 0x0801) AM_DEVWRITE("ymsnd", ym2203_w) // + AM_RANGE(0x3000, 0x3000) AM_READ(soundlatch_r) // From Main CPU AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END /*************************************************************************** + MCU + +***************************************************************************/ + +static void thedeep_maincpu_bankswitch(running_machine &machine,UINT8 bank_trig) +{ + thedeep_state *state = machine.driver_data(); + UINT8 *rom; + int new_rombank = bank_trig & 3; + + if (state->m_rombank == new_rombank) + return; + state->m_rombank = new_rombank; + rom = machine.region("maincpu")->base(); + memory_set_bankptr(machine, "bank1", rom + 0x10000 + state->m_rombank * 0x4000); + /* there's code which falls through from the fixed ROM to bank #1, I have to */ + /* copy it there otherwise the CPU bank switching support will not catch it. */ + memcpy(rom + 0x08000, rom + 0x10000 + state->m_rombank * 0x4000, 0x4000); + +} + +static WRITE8_HANDLER( thedeep_p1_w ) +{ + flip_screen_set(space->machine(), (data & 1) ^ 1); + thedeep_maincpu_bankswitch(space->machine(),(data & 6) >> 1); + logerror("P1 %02x\n",data); +} + +static READ8_HANDLER( thedeep_from_main_r ) +{ + static UINT8 res; + + res = 0x11; + + logerror("From Main read = %02x\n",res); + return 0x20; +} + +static WRITE8_HANDLER( thedeep_to_main_w ) +{ + // ... +} + +static WRITE8_HANDLER( thedeep_p3_w ) +{ + thedeep_state *state = space->machine().driver_data(); + + /* bit 0 0->1 transition IRQ0 to main */ + if((!(state->m_mcu_p3_reg & 0x01)) && data & 0x01) + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); + + /* bit 6 0->1 transition INT1 IRQ ACK */ + if((!(state->m_mcu_p3_reg & 0x40)) && data & 0x40) + device_set_input_line(state->m_mcu, MCS51_INT1_LINE, CLEAR_LINE); + + /* bit 7 0->1 transition INT0 IRQ ACK */ + if((!(state->m_mcu_p3_reg & 0x80)) && data & 0x80) + device_set_input_line(state->m_mcu, MCS51_INT0_LINE, CLEAR_LINE); + + state->m_mcu_p3_reg = data; + logerror("P3 %02x\n",data); +} + +static READ8_HANDLER( thedeep_p0_r ) +{ + UINT8 coin_mux; + + coin_mux = ((input_port_read(space->machine(),"COINS") & 0x0e) == 0x0e); // bit 0 is hard-wired to ALL three coin latches + + return (input_port_read(space->machine(),"COINS") & 0xfe) | (coin_mux & 1); +} + +static ADDRESS_MAP_START( mcu_io_map, AS_IO, 8 ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(MCS51_PORT_P0,MCS51_PORT_P0) AM_READ(thedeep_p0_r) + AM_RANGE(MCS51_PORT_P1,MCS51_PORT_P1) AM_WRITE(thedeep_p1_w) + AM_RANGE(MCS51_PORT_P2,MCS51_PORT_P2) AM_READWRITE(thedeep_from_main_r,thedeep_to_main_w) + AM_RANGE(MCS51_PORT_P3,MCS51_PORT_P3) AM_WRITE(thedeep_p3_w) +ADDRESS_MAP_END + + +/*************************************************************************** + Input Ports ***************************************************************************/ @@ -262,6 +345,13 @@ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_IMPULSE(1) + + PORT_START("COINS") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) // mux of bits 1-2-3 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -322,14 +412,16 @@ irqhandler }; -static INTERRUPT_GEN( thedeep_interrupt ) +static TIMER_DEVICE_CALLBACK( thedeep_interrupt ) { - thedeep_state *state = device->machine().driver_data(); - if (cpu_getiloops(device)) + thedeep_state *state = timer.machine().driver_data(); + int scanline = param; + + if (scanline == 124) // TODO: clean this { if (state->m_protection_command != 0x59) { - int coins = input_port_read(device->machine(), "MCU"); + int coins = input_port_read(timer.machine(), "MCU"); if (coins & 1) state->m_protection_data = 1; else if (coins & 2) state->m_protection_data = 2; else if (coins & 4) state->m_protection_data = 3; @@ -339,30 +431,41 @@ state->m_protection_irq = 1; } if (state->m_protection_irq) - device_set_input_line(device, 0, HOLD_LINE); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); } - else + else if(scanline == 0) { if (state->m_nmi_enable) { - device_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); - device_set_input_line(device, INPUT_LINE_NMI, CLEAR_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, ASSERT_LINE); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, CLEAR_LINE); } } } +static INTERRUPT_GEN( thedeep_mcu_irq ) +{ + thedeep_state *state = device->machine().driver_data(); + + device_set_input_line(state->m_mcu, MCS51_INT1_LINE, ASSERT_LINE); +} + static MACHINE_CONFIG_START( thedeep, thedeep_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT_HACK(thedeep_interrupt,2) /* IRQ by MCU, NMI by vblank (maskable) */ + MCFG_TIMER_ADD_SCANLINE("scantimer", thedeep_interrupt, "screen", 0, 1) /* IRQ by MCU, NMI by vblank (maskable) */ MCFG_CPU_ADD("audiocpu", M65C02, XTAL_12MHz/8) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(audio_map) /* IRQ by YM2203, NMI by when sound latch written by main cpu */ - /* CPU3 is a i8751 running at 8Mhz (8mhz xtal)*/ + /* MCU is a i8751 running at 8Mhz (8mhz xtal)*/ + MCFG_CPU_ADD("mcu", I8751, XTAL_8MHz) + MCFG_CPU_IO_MAP(mcu_io_map) + MCFG_CPU_VBLANK_INT("screen",thedeep_mcu_irq ) // unknown source, but presumably vblank + MCFG_DEVICE_DISABLE() MCFG_MACHINE_RESET(thedeep) @@ -370,10 +473,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x100, 0xf8) MCFG_SCREEN_VISIBLE_AREA(0, 0x100-1, 0, 0xf8-1) - MCFG_SCREEN_UPDATE(thedeep) + MCFG_SCREEN_UPDATE_STATIC(thedeep) MCFG_GFXDECODE(thedeep) MCFG_PALETTE_LENGTH(512) @@ -424,7 +526,7 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 65C02 Code */ ROM_LOAD( "dp-12.rom", 0x8000, 0x8000, CRC(c4e848c4) SHA1(d2dec5c8d7d59703f5485cab9124bf4f835fe728) ) - ROM_REGION( 0x1000, "cpu3", 0 ) /* i8751 Code */ + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 Code */ ROM_LOAD( "dp-14", 0x0000, 0x1000, CRC(0b886dad) SHA1(487192764342f8b0a320d20a378bf94f84592da9) ) // 1xxxxxxxxxxx = 0xFF ROM_REGION( 0x40000, "sprites", 0 ) /* Sprites */ @@ -456,7 +558,7 @@ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 65C02 Code */ ROM_LOAD( "dp-12.rom", 0x8000, 0x8000, CRC(c4e848c4) SHA1(d2dec5c8d7d59703f5485cab9124bf4f835fe728) ) - ROM_REGION( 0x1000, "cpu3", 0 ) /* i8751 Code */ + ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 Code */ ROM_LOAD( "dp-14", 0x0000, 0x1000, CRC(0b886dad) SHA1(487192764342f8b0a320d20a378bf94f84592da9) ) // 1xxxxxxxxxxx = 0xFF ROM_REGION( 0x40000, "sprites", 0 ) /* Sprites */ diff -Nru mame-0.144/src/mame/drivers/thepit.c mame-0.145/src/mame/drivers/thepit.c --- mame-0.144/src/mame/drivers/thepit.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/thepit.c 2012-02-06 21:30:39.000000000 +0000 @@ -146,6 +146,13 @@ space->machine().sound().system_enable(data); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + thepit_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} + static ADDRESS_MAP_START( thepit_main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x4fff) AM_ROM @@ -157,7 +164,7 @@ AM_RANGE(0x9860, 0x98ff) AM_RAM AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r) AM_WRITENOP // Not hooked up according to the schematics AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1") - AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(nmi_mask_w) AM_RANGE(0xb001, 0xb001) AM_WRITENOP // Unused, but initialized AM_RANGE(0xb002, 0xb002) AM_WRITENOP // coin_lockout_w AM_RANGE(0xb003, 0xb003) AM_WRITE(thepit_sound_enable_w) @@ -178,7 +185,7 @@ AM_RANGE(0x9860, 0x98ff) AM_RAM AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r) AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1") - AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(interrupt_enable_w) + AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_WRITE(nmi_mask_w) AM_RANGE(0xb001, 0xb001) AM_WRITENOP // Unused, but initialized AM_RANGE(0xb002, 0xb002) AM_WRITENOP // coin_lockout_w AM_RANGE(0xb003, 0xb003) AM_WRITE(thepit_sound_enable_w) @@ -630,13 +637,20 @@ DEVCB_NULL }; +static INTERRUPT_GEN( vblank_irq ) +{ + thepit_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( thepit, thepit_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, PIXEL_CLOCK/2) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(thepit_main_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, SOUND_CLOCK/4) /* 2.5 MHz */ MCFG_CPU_PROGRAM_MAP(audio_map) @@ -648,9 +662,8 @@ MCFG_PALETTE_LENGTH(32+8) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(thepit) + MCFG_SCREEN_UPDATE_STATIC(thepit) MCFG_PALETTE_INIT(thepit) MCFG_VIDEO_START(thepit) diff -Nru mame-0.144/src/mame/drivers/thief.c mame-0.145/src/mame/drivers/thief.c --- mame-0.144/src/mame/drivers/thief.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/thief.c 2012-02-06 21:30:37.000000000 +0000 @@ -384,8 +384,8 @@ static const char *const sharkatt_sample_names[] = { "*sharkatt", - "talk.wav", - "crash.wav", + "talk", + "crash", 0 /* end of array */ }; @@ -400,8 +400,8 @@ static const char *const thief_sample_names[] = { "*thief", - "talk.wav", - "crash.wav", + "talk", + "crash", 0 /* end of array */ }; @@ -416,8 +416,8 @@ static const char *const natodef_sample_names[] = { "*natodef", - "talk.wav", - "crash.wav", + "talk", + "crash", 0 /* end of array */ }; @@ -444,12 +444,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 24*8-1) - MCFG_SCREEN_UPDATE(thief) + MCFG_SCREEN_UPDATE_STATIC(thief) MCFG_TMS9927_ADD("tms", MASTER_CLOCK/4, tms9927_intf) @@ -484,10 +483,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(thief) + MCFG_SCREEN_UPDATE_STATIC(thief) MCFG_TMS9927_ADD("tms", MASTER_CLOCK/4, tms9927_intf) @@ -522,10 +520,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(thief) + MCFG_SCREEN_UPDATE_STATIC(thief) MCFG_TMS9927_ADD("tms", MASTER_CLOCK/4, tms9927_intf) diff -Nru mame-0.144/src/mame/drivers/thoop2.c mame-0.145/src/mame/drivers/thoop2.c --- mame-0.144/src/mame/drivers/thoop2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/thoop2.c 2012-02-06 21:30:40.000000000 +0000 @@ -197,10 +197,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 16, 256-1) - MCFG_SCREEN_UPDATE(thoop2) + MCFG_SCREEN_UPDATE_STATIC(thoop2) MCFG_GFXDECODE(thoop2) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/thunderj.c mame-0.145/src/mame/drivers/thunderj.c --- mame-0.144/src/mame/drivers/thunderj.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/thunderj.c 2012-02-06 21:30:34.000000000 +0000 @@ -98,7 +98,7 @@ if (state->m_alpha_tile_bank != ((data >> 2) & 7)) { space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); - tilemap_mark_all_tiles_dirty(state->m_alpha_tilemap); + state->m_alpha_tilemap->mark_all_dirty(); state->m_alpha_tile_bank = (data >> 2) & 7; } } @@ -306,11 +306,10 @@ MCFG_PALETTE_LENGTH(2048) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a VAD chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(thunderj) + MCFG_SCREEN_UPDATE_STATIC(thunderj) MCFG_VIDEO_START(thunderj) diff -Nru mame-0.144/src/mame/drivers/thunderx.c mame-0.145/src/mame/drivers/thunderx.c --- mame-0.144/src/mame/drivers/thunderx.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/thunderx.c 2012-02-06 21:30:34.000000000 +0000 @@ -479,40 +479,39 @@ KONAMI8_B12_UNK(2) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // factory default + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW2:3" ) // test mode calls it cabinet type, but this is a 2 players game - // US manual default = "ON : Upright" / Japanese manual default = "OFF : Table" , but not work? + PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW2:3" ) // test mode calls it cabinet type, but this is a 2 players game PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "30000 200000" ) // factory default. Japanese manual has typo "30000 300000" - PORT_DIPSETTING( 0x10, "50000 300000" ) // "50000 200000" + PORT_DIPSETTING( 0x18, "30000 200000" ) + PORT_DIPSETTING( 0x10, "50000 300000" ) PORT_DIPSETTING( 0x08, "30000" ) PORT_DIPSETTING( 0x00, "50000" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // factory default + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // factory default + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) // factory default + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW3:2" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) // TYPO on US manual "OFF : Game mode / ON : Game mode" + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) PORT_DIPNAME( 0x08, 0x00, "Continue Limit (1Player/2Players)" ) PORT_DIPLOCATION("SW3:4") PORT_DIPSETTING( 0x08, "3times / Twice altogether" ) - PORT_DIPSETTING( 0x00, "5times / 4times altogether" ) // factory default + PORT_DIPSETTING( 0x00, "5times / 4times altogether" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -530,17 +529,17 @@ KONAMI8_B12_UNK(2) PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "No Coin B") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // factory default + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPNAME( 0x04, 0x00, "Award Bonus Life" ) PORT_DIPLOCATION("SW2:3") - PORT_DIPSETTING( 0x04, DEF_STR( No ) ) // factory default + PORT_DIPSETTING( 0x04, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "30000 200000" ) // Japanese default @@ -549,20 +548,20 @@ PORT_DIPSETTING( 0x00, "50000" ) PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // factory default + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // factory default + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) // factory default + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW3:2" ) - PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) - PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW3:4" ) + PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW3:2" ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -570,25 +569,14 @@ PORT_INCLUDE( thunderx ) PORT_MODIFY("DSW2") - PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW2:3" ) // manual says "OFF=Table On=Upright", but not work? + PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW2:3" ) // manual says "OFF=Table On=Upright", but not work? PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "30000 200000" ) // Japanese MS - PORT_DIPSETTING( 0x10, "50000 300000" ) // US MS + PORT_DIPSETTING( 0x18, "30000 200000" ) // Japanese default + PORT_DIPSETTING( 0x10, "50000 300000" ) // US default PORT_DIPSETTING( 0x08, "30000" ) PORT_DIPSETTING( 0x00, "50000" ) INPUT_PORTS_END -/* -static INPUT_PORTS_START( thndrxja ) // for Japanese later revision (not dumped yet) - PORT_INCLUDE( thnderxj ) - - PORT_MODIFY("DSW3") - PORT_DIPNAME( 0x08, 0x08, "All Stage Clear Loop" ) PORT_DIPLOCATION("SW3:4") - PORT_DIPSETTING( 0x08, "Game ends after 3 loops" ) // factory default - PORT_DIPSETTING( 0x00, "Endless" ) -INPUT_PORTS_END -*/ - /*************************************************************************** @@ -698,10 +686,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(scontra) + MCFG_SCREEN_UPDATE_STATIC(scontra) MCFG_PALETTE_LENGTH(1024) @@ -743,10 +730,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(scontra) + MCFG_SCREEN_UPDATE_STATIC(scontra) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/tiamc1.c mame-0.145/src/mame/drivers/tiamc1.c --- mame-0.144/src/mame/drivers/tiamc1.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tiamc1.c 2012-02-06 21:30:40.000000000 +0000 @@ -232,10 +232,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1600)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 256-1) - MCFG_SCREEN_UPDATE(tiamc1) + MCFG_SCREEN_UPDATE_STATIC(tiamc1) MCFG_GFXDECODE(tiamc1) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/tickee.c mame-0.145/src/mame/drivers/tickee.c --- mame-0.144/src/mame/drivers/tickee.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tickee.c 2012-02-06 21:30:40.000000000 +0000 @@ -60,8 +60,8 @@ { const rectangle &visarea = machine.primary_screen->visible_area(); - *x = (((input_port_read(machine, player ? "GUNX2" : "GUNX1") & 0xff) * (visarea.max_x - visarea.min_x)) >> 8) + visarea.min_x; - *y = (((input_port_read(machine, player ? "GUNY2" : "GUNY1") & 0xff) * (visarea.max_y - visarea.min_y)) >> 8) + visarea.min_y; + *x = (((input_port_read(machine, player ? "GUNX2" : "GUNX1") & 0xff) * visarea.width()) >> 8) + visarea.min_x; + *y = (((input_port_read(machine, player ? "GUNY2" : "GUNY1") & 0xff) * visarea.height()) >> 8) + visarea.min_y; } @@ -141,11 +141,11 @@ * *************************************/ -static void scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { tickee_state *state = screen.machine().driver_data(); UINT16 *src = &state->m_vram[(params->rowaddr << 8) & 0x3ff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); int coladdr = params->coladdr << 1; int x; @@ -167,11 +167,11 @@ } -static void rapidfir_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void rapidfir_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { tickee_state *state = screen.machine().driver_data(); UINT16 *src = &state->m_vram[(params->rowaddr << 8) & 0x3ff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); int coladdr = params->coladdr << 1; int x; @@ -725,7 +725,8 @@ "screen", /* the screen operated on */ VIDEO_CLOCK/2, /* pixel clock */ 1, /* pixels per clock */ - scanline_update, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + scanline_update, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ NULL, /* write to shiftreg function */ NULL /* read from shiftreg function */ @@ -738,7 +739,8 @@ "screen", /* the screen operated on */ VIDEO_CLOCK/2, /* pixel clock */ 1, /* pixels per clock */ - rapidfir_scanline_update, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + rapidfir_scanline_update, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ rapidfir_to_shiftreg, /* write to shiftreg function */ rapidfir_from_shiftreg /* read from shiftreg function */ @@ -771,9 +773,8 @@ MCFG_VIDEO_START(tickee) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -812,9 +813,8 @@ MCFG_VIDEO_START(tickee) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -841,9 +841,8 @@ MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK/2, 444, 0, 320, 233, 0, 200) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1070,10 +1069,10 @@ ROM_REGION16_LE( 0x400000, "user1", 0 ) /* 34010 code */ ROM_LOAD16_BYTE( "rf11.u8", 0x000000, 0x80000, CRC(f7d8df33) SHA1(0abd54bbccfa90d830cbbdbcf2058197af980981) ) ROM_LOAD16_BYTE( "rf11.u9", 0x000001, 0x80000, CRC(a72af935) SHA1(ed0deb6f51681f70e07ad7c05a92f6a0f2063f7a) ) - ROM_LOAD16_BYTE( "rf10.u6", 0x100000, 0x80000, CRC(e8d2e5d2) SHA1(db93014598f7b76785e0fd5c0ac8808a3be06435) ) - ROM_LOAD16_BYTE( "rf10.u7", 0x100001, 0x80000, CRC(0e33f2ed) SHA1(9b2533e001b94ccc97b95e31762186f59d5a3b9c) ) - ROM_LOAD16_BYTE( "rf10.u4", 0x200000, 0x80000, CRC(8a088468) SHA1(f94dc78158e5656657d3b26c5b0ca88f39eb5ff4) ) - ROM_LOAD16_BYTE( "rf10.u5", 0x200001, 0x80000, CRC(593b3df2) SHA1(301fa06031eff54fb2d9e08f80fc3c26e5c51da9) ) + ROM_LOAD16_BYTE( "rf10.u6", 0x100000, 0x80000, CRC(e8d2e5d2) SHA1(db93014598f7b76785e0fd5c0ac8808a3be06435) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u7", 0x100001, 0x80000, CRC(0e33f2ed) SHA1(9b2533e001b94ccc97b95e31762186f59d5a3b9c) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u4", 0x200000, 0x80000, CRC(8a088468) SHA1(f94dc78158e5656657d3b26c5b0ca88f39eb5ff4) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u5", 0x200001, 0x80000, CRC(593b3df2) SHA1(301fa06031eff54fb2d9e08f80fc3c26e5c51da9) ) /* Can be labeled V1.0 or V1.1 */ ROM_LOAD16_BYTE( "rf11.u2", 0x300000, 0x80000, CRC(ffa0c695) SHA1(bccdefe7cee15999c416fdcb16a65b1bc6e12d13) ) ROM_LOAD16_BYTE( "rf11.u3", 0x300001, 0x80000, CRC(ac63b863) SHA1(c9160aec6179d1f550279b80fd4c2a14ce94fdab) ) @@ -1082,6 +1081,22 @@ ROM_LOAD( "rf11.u510", 0x080000, 0x80000, CRC(6209c8fe) SHA1(bfbd63445b4ac2d4253c4b5354e1058070290084) ) ROM_END +ROM_START( rapidfira ) /* Version 1.1, test menu shows "Build 238" */ + ROM_REGION16_LE( 0x400000, "user1", 0 ) /* 34010 code */ + ROM_LOAD16_BYTE( "rf11.u8", 0x000000, 0x80000, CRC(f7d8df33) SHA1(0abd54bbccfa90d830cbbdbcf2058197af980981) ) + ROM_LOAD16_BYTE( "rf11.u9", 0x000001, 0x80000, CRC(a72af935) SHA1(ed0deb6f51681f70e07ad7c05a92f6a0f2063f7a) ) + ROM_LOAD16_BYTE( "rf10.u6", 0x100000, 0x80000, CRC(e8d2e5d2) SHA1(db93014598f7b76785e0fd5c0ac8808a3be06435) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u7", 0x100001, 0x80000, CRC(0e33f2ed) SHA1(9b2533e001b94ccc97b95e31762186f59d5a3b9c) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u4", 0x200000, 0x80000, CRC(8a088468) SHA1(f94dc78158e5656657d3b26c5b0ca88f39eb5ff4) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf10.u5", 0x200001, 0x80000, CRC(593b3df2) SHA1(301fa06031eff54fb2d9e08f80fc3c26e5c51da9) ) /* Can be labeled V1.0 or V1.1 */ + ROM_LOAD16_BYTE( "rf11-u2", 0x300000, 0x80000, CRC(bcb7195a) SHA1(04b14facfe84973737f94b5278fb59668af0a47c) ) /* Only U2 & U3 differ from Build 239, labeled the same */ + ROM_LOAD16_BYTE( "rf11-u3", 0x300001, 0x80000, CRC(e455a0b5) SHA1(5568f55ccfd6cba373f4b4f3e61f0a4f391b01c0) ) /* Only U2 & U3 differ from Build 239, labeled the same */ + + ROM_REGION( 0x100000, "oki", 0 ) + ROM_LOAD( "rf11.u507", 0x000000, 0x80000, CRC(899d1e15) SHA1(ca22b4ad714a5212bc9347eb3a5b660c02bad7e5) ) + ROM_LOAD( "rf11.u510", 0x080000, 0x80000, CRC(6209c8fe) SHA1(bfbd63445b4ac2d4253c4b5354e1058070290084) ) +ROM_END + ROM_START( rapidfire ) /* Version 1.0, test menu shows "Build 236" */ ROM_REGION16_LE( 0x400000, "user1", 0 ) /* 34010 code */ @@ -1136,7 +1151,8 @@ GAME( 1996, ghoshunt, 0, ghoshunt, ghoshunt, 0, ROT0, "Hanaho Games", "Ghost Hunter", 0 ) GAME( 1996, tutstomb, 0, ghoshunt, ghoshunt, 0, ROT0, "Island Design", "Tut's Tomb", 0 ) GAME( 1996, mouseatk, 0, mouseatk, mouseatk, 0, ROT0, "ICE", "Mouse Attack", 0 ) -GAME( 1998, rapidfir, 0, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Rapid Fire v1.1", 0 ) -GAME( 1998, rapidfire, rapidfir, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Rapid Fire v1.0", 0 ) +GAME( 1998, rapidfir, 0, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Rapid Fire v1.1 (Build 239)", 0 ) +GAME( 1998, rapidfira, rapidfir, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Rapid Fire v1.1 (Build 238)", 0 ) +GAME( 1998, rapidfire, rapidfir, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Rapid Fire v1.0 (Build 236)", 0 ) GAME( 1999, maletmad, 0, rapidfir, rapidfir, 0, ROT0, "Hanaho Games", "Mallet Madness v2.1", 0 ) diff -Nru mame-0.144/src/mame/drivers/tigeroad.c mame-0.145/src/mame/drivers/tigeroad.c --- mame-0.144/src/mame/drivers/tigeroad.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tigeroad.c 2012-02-06 21:30:34.000000000 +0000 @@ -534,11 +534,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.08) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tigeroad) - MCFG_SCREEN_EOF(tigeroad) + MCFG_SCREEN_UPDATE_STATIC(tigeroad) + MCFG_SCREEN_VBLANK_STATIC(tigeroad) MCFG_GFXDECODE(tigeroad) MCFG_PALETTE_LENGTH(576) diff -Nru mame-0.144/src/mame/drivers/timelimt.c mame-0.145/src/mame/drivers/timelimt.c --- mame-0.144/src/mame/drivers/timelimt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/timelimt.c 2012-02-06 21:30:39.000000000 +0000 @@ -7,6 +7,7 @@ Notes: - Sprite colors are wrong (missing colortable?) +- driver should probably be merged with suprridr.c ***************************************************************************/ @@ -201,12 +202,6 @@ static GFXDECODE_START( timelimt ) GFXDECODE_ENTRY( "tiles_1", 0, charlayout, 32, 1 ) /* seems correct */ GFXDECODE_ENTRY( "tiles_2", 0, charlayout, 0, 1 ) /* seems correct */ - GFXDECODE_ENTRY( "sprites", 0, spritelayout, 0, 8 ) /* ?? */ -GFXDECODE_END - -static GFXDECODE_START( progress ) - GFXDECODE_ENTRY( "tiles_1", 0, charlayout, 32, 1 ) /* seems correct */ - GFXDECODE_ENTRY( "tiles_2", 0, charlayout, 0, 1 ) /* seems correct */ GFXDECODE_ENTRY( "sprites", 0, spritelayout, 64, 4 ) /* seems correct */ GFXDECODE_END @@ -253,13 +248,12 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(timelimt) + MCFG_SCREEN_UPDATE_STATIC(timelimt) MCFG_GFXDECODE(timelimt) - MCFG_PALETTE_LENGTH(64) + MCFG_PALETTE_LENGTH(64+32) MCFG_PALETTE_INIT(timelimt) MCFG_VIDEO_START(timelimt) @@ -275,15 +269,6 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( progress, timelimt ) - - /* basic machine hardware */ - - MCFG_GFXDECODE(progress) - MCFG_PALETTE_LENGTH(96) - -MACHINE_CONFIG_END - /*************************************************************************** Game ROM(s) @@ -314,10 +299,10 @@ ROM_LOAD( "tl2", 0x2000, 0x2000, CRC(4693b849) SHA1(fbebedde53599fb1eaedc648bd704b321ab096b5) ) ROM_LOAD( "tl1", 0x4000, 0x2000, CRC(c4007caf) SHA1(ae05af3319545d5ca98a046bfc100138a5a3ed96) ) - ROM_REGION( 0x0040, "proms", 0 ) + ROM_REGION( 0x0060, "proms", 0 ) ROM_LOAD( "clr.35", 0x0000, 0x0020, CRC(9c9e6073) SHA1(98496175bf19a8cdb0018705bc1a2193b8a782e1) ) - ROM_LOAD( "clr.48", 0x0020, 0x0020, BAD_DUMP CRC(a0bcac59) SHA1(e5832831b21981363509b79d89766757bd9273b0) ) /* FIXED BITS (xxxxxx1x) */ - /* missing a prom? */ + ROM_LOAD( "clr.48", 0x0020, 0x0020, BAD_DUMP CRC(a0bcac59) SHA1(e5832831b21981363509b79d89766757bd9273b0) ) /* FIXED BITS (xxxxxx1x) */ + ROM_LOAD( "clr.57", 0x0040, 0x0020, NO_DUMP ) /* missing sprite color prom? */ ROM_END ROM_START( progress ) @@ -350,4 +335,4 @@ ROM_END GAME( 1983, timelimt, 0, timelimt, timelimt, 0, ROT90, "Chuo Co. Ltd", "Time Limit", GAME_IMPERFECT_COLORS ) -GAME( 1984, progress, 0, progress, progress, 0, ROT90, "Chuo Co. Ltd", "Progress", 0 ) +GAME( 1984, progress, 0, timelimt, progress, 0, ROT90, "Chuo Co. Ltd", "Progress", 0 ) diff -Nru mame-0.144/src/mame/drivers/timeplt.c mame-0.145/src/mame/drivers/timeplt.c --- mame-0.144/src/mame/drivers/timeplt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/timeplt.c 2012-02-06 21:30:35.000000000 +0000 @@ -199,30 +199,30 @@ KONAMI8_COCKTAIL_B1_UNK PORT_START("DSW0") - KONAMI_COINAGE(DEF_STR( Free_Play ), DEF_STR( Free_Play )) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), DEF_STR( Free_Play ), SW1) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "255 (Cheat)") - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, "Bonus" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "10000 50000" ) PORT_DIPSETTING( 0x00, "20000 60000" ) - PORT_DIPNAME( 0x70, 0x70, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x70, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6,7") PORT_DIPSETTING( 0x70, "1 (Easiest)" ) PORT_DIPSETTING( 0x60, "2" ) PORT_DIPSETTING( 0x50, "3" ) PORT_DIPSETTING( 0x40, "4" ) - PORT_DIPSETTING( 0x30, "5 (Average)" ) + PORT_DIPSETTING( 0x30, "5" ) PORT_DIPSETTING( 0x20, "6" ) PORT_DIPSETTING( 0x10, "7" ) - PORT_DIPSETTING( 0x00, "8 (Hardest)" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, "8 (Difficult)" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -392,10 +392,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(timeplt) + MCFG_SCREEN_UPDATE_STATIC(timeplt) MCFG_GFXDECODE(timeplt) MCFG_PALETTE_LENGTH(32*4+64*4) diff -Nru mame-0.144/src/mame/drivers/timetrv.c mame-0.145/src/mame/drivers/timetrv.c --- mame-0.144/src/mame/drivers/timetrv.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/timetrv.c 2012-02-06 21:30:35.000000000 +0000 @@ -44,9 +44,9 @@ } -static SCREEN_UPDATE( timetrv ) +static SCREEN_UPDATE_IND16( timetrv ) { - timetrv_state *state = screen->machine().driver_data(); + timetrv_state *state = screen.machine().driver_data(); popmessage("%s%s",state->m_led_vram_lo,state->m_led_vram_hi); return 0; } @@ -150,10 +150,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 512-1) - MCFG_SCREEN_UPDATE(timetrv) + MCFG_SCREEN_UPDATE_STATIC(timetrv) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/tmaster.c mame-0.145/src/mame/drivers/tmaster.c --- mame-0.144/src/mame/drivers/tmaster.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tmaster.c 2012-02-06 21:30:34.000000000 +0000 @@ -81,7 +81,7 @@ Video: XC3042A (Sigma Xilinx FPGA gate array) Sound: OKI M6295 OSC: 32MHz, 24MHz & 8.664MHz - Other: SCN68681C1N40 (Serial controler chip) + Other: SCN68681C1N40 (Serial controller chip) DALLAS DS1225AB-85 Nonvolatile SRAM DALLAS DS1204V (used for security) DALLAS DS1232 (MicroMonitor Chip) @@ -103,7 +103,6 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" #include "sound/okim6295.h" #include "machine/eeprom.h" #include "machine/microtch.h" @@ -121,11 +120,13 @@ { public: tmaster_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_okibank; UINT8 m_rtc_ram[8]; - bitmap_t *m_bitmap[2][2]; + bitmap_ind16 m_bitmap[2][2]; UINT16 *m_regs; UINT16 m_color; UINT16 m_addr; @@ -138,6 +139,8 @@ UINT8 m_palette_index; UINT8 m_palette_data[3]; device_t *m_duart68681; + + required_device m_maincpu; }; @@ -296,8 +299,8 @@ { for (buffer = 0; buffer < 2; buffer++) { - state->m_bitmap[layer][buffer] = machine.primary_screen->alloc_compatible_bitmap(); - bitmap_fill(state->m_bitmap[layer][buffer], NULL, 0xff); + machine.primary_screen->register_screen_bitmap(state->m_bitmap[layer][buffer]); + state->m_bitmap[layer][buffer].fill(0xff); } } @@ -311,23 +314,23 @@ state->m_compute_addr = galgames_compute_addr; } -static SCREEN_UPDATE( tmaster ) +static SCREEN_UPDATE_IND16( tmaster ) { - tmaster_state *state = screen->machine().driver_data(); + tmaster_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; if (mask != 0) layers_ctrl &= mask; } #endif - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (layers_ctrl & 1) copybitmap_trans(bitmap, state->m_bitmap[0][(state->m_regs[0x02/2]>>8)&1], 0,0,0,0, cliprect, 0xff); if (layers_ctrl & 2) copybitmap_trans(bitmap, state->m_bitmap[1][(state->m_regs[0x02/2]>>9)&1], 0,0,0,0, cliprect, 0xff); @@ -356,8 +359,6 @@ UINT16 pen; - bitmap_t *bitmap; - buffer = (state->m_regs[0x02/2] >> 8) & 3; // 1 bit per layer, selects the currently displayed buffer sw = state->m_regs[0x04/2]; sx = state->m_regs[0x06/2]; @@ -370,7 +371,7 @@ layer = (mode >> 7) & 1; // layer to draw to buffer = ((mode >> 6) & 1) ^ ((buffer >> layer) & 1); // bit 6 selects whether to use the opposite buffer to that displayed - bitmap = state->m_bitmap[layer][buffer]; + bitmap_ind16 &bitmap = state->m_bitmap[layer][buffer]; addr <<= 1; @@ -422,7 +423,7 @@ pen = dst_pen; if ((pen != 0xff) && (sx + x >= 0) && (sx + x < 400) && (sy + y >= 0) && (sy + y < 256)) - *BITMAP_ADDR16(bitmap, sy + y, sx + x) = pen + color; + bitmap.pix16(sy + y, sx + x) = pen + color; } } } @@ -437,7 +438,7 @@ pen = gfxdata[addr++]; if ((pen != 0xff) && (sx + x >= 0) && (sx + x < 400) && (sy + y >= 0) && (sy + y < 256)) - *BITMAP_ADDR16(bitmap, sy + y, sx + x) = pen + color; + bitmap.pix16(sy + y, sx + x) = pen + color; } } } @@ -454,7 +455,7 @@ for (x = x0; x != x1; x += dx) { if ((sx + x >= 0) && (sx + x < 400) && (sy + y >= 0) && (sy + y < 256)) - *BITMAP_ADDR16(bitmap, sy + y, sx + x) = pen; + bitmap.pix16(sy + y, sx + x) = pen; } } break; @@ -876,14 +877,17 @@ state->m_duart68681 = machine.device( "duart68681" ); } -static INTERRUPT_GEN( tm3k_interrupt ) +static TIMER_DEVICE_CALLBACK( tm3k_interrupt ) { - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 2, HOLD_LINE); break; - case 1: device_set_input_line(device, 3, HOLD_LINE); break; - default: device_set_input_line(device, 1, HOLD_LINE); break; - } + tmaster_state *state = timer.machine().driver_data(); + int scanline = param; + + if(scanline == 0) // vblank, FIXME + device_set_input_line(state->m_maincpu, 3, HOLD_LINE); + else if((scanline % 16) == 0) + device_set_input_line(state->m_maincpu, 1, HOLD_LINE); + + // lev 2 triggered at the end of the blit } static const duart68681_config tmaster_duart68681_config = @@ -898,7 +902,7 @@ static MACHINE_CONFIG_START( tm3k, tmaster_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz / 2) /* 12MHz */ MCFG_CPU_PROGRAM_MAP(tmaster_map) - MCFG_CPU_VBLANK_INT_HACK(tm3k_interrupt,2+20) // ?? + MCFG_TIMER_ADD_SCANLINE("scantimer", tm3k_interrupt, "screen", 0, 1) MCFG_MACHINE_START(tmaster) MCFG_MACHINE_RESET(tmaster) @@ -910,10 +914,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(400, 256) MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 256-1) - MCFG_SCREEN_UPDATE(tmaster) + MCFG_SCREEN_UPDATE_STATIC(tmaster) MCFG_PALETTE_LENGTH(0x1000) @@ -932,17 +935,6 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_CONFIG_END - -static INTERRUPT_GEN( galgames_interrupt ) -{ - switch (cpu_getiloops(device)) - { - case 0: device_set_input_line(device, 3, HOLD_LINE); break; - // lev 2 triggered at the end of a blit - default: device_set_input_line(device, 1, HOLD_LINE); break; - } -} - static MACHINE_RESET( galgames ) { tmaster_state *state = machine.driver_data(); @@ -965,7 +957,7 @@ static MACHINE_CONFIG_START( galgames, tmaster_state ) MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz / 2) MCFG_CPU_PROGRAM_MAP(galgames_map) - MCFG_CPU_VBLANK_INT_HACK(galgames_interrupt, 1+20) // ?? + MCFG_TIMER_ADD_SCANLINE("scantimer", tm3k_interrupt, "screen", 0, 1) // 5 EEPROMs on the motherboard (for BIOS + 4 Carts) MCFG_EEPROM_ADD(GALGAMES_EEPROM_BIOS, galgames_eeprom_interface) @@ -978,12 +970,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(400, 256) MCFG_SCREEN_VISIBLE_AREA(0, 400-1, 0, 256-1) - MCFG_SCREEN_UPDATE(tmaster) + MCFG_SCREEN_UPDATE_STATIC(tmaster) MCFG_PALETTE_LENGTH(0x1000) // only 0x100 used diff -Nru mame-0.144/src/mame/drivers/tmmjprd.c mame-0.145/src/mame/drivers/tmmjprd.c --- mame-0.144/src/mame/drivers/tmmjprd.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tmmjprd.c 2012-02-06 21:30:40.000000000 +0000 @@ -78,7 +78,7 @@ COMBINE_DATA(&state->m_tilemap_ram[3][offset]); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int screen) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int screen) { tmmjprd_state *state = machine.driver_data(); int xpos,ypos,tileno,xflip,yflip, colr; @@ -155,7 +155,7 @@ } } -static void ttmjprd_draw_tile(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int x,int y,int sizex,int sizey, UINT32 tiledata, UINT8* rom) +static void ttmjprd_draw_tile(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int x,int y,int sizex,int sizey, UINT32 tiledata, UINT8* rom) { /* note, it's tile address _NOT_ tile number, 'sub-tile' access is possible, hence using the custom rendering */ int tileaddr = (tiledata&0x000fffff)>>0; @@ -167,19 +167,19 @@ int count; // entirely off right - if (x > cliprect->max_x) + if (x > cliprect.max_x) return; // entirely off left - if ((x+sizex) < cliprect->min_x) + if ((x+sizex) < cliprect.min_x) return; // entirely off bottom - if (y > cliprect->max_y) + if (y > cliprect.max_y) return; // entirely off bottom - if ((y+sizey) < cliprect->min_y) + if ((y+sizey) < cliprect.min_y) return; count = 0; @@ -192,24 +192,24 @@ if (!depth) { - if ((drawx < cliprect->max_x) && (drawx > cliprect->min_x) && (drawy < cliprect->max_y) && (drawy > cliprect->min_y)) + if (cliprect.contains(drawx, drawy)) { dat = (rom[(tileaddr*32)+count] & 0xf0)>>4; if (dat!=15) { //dat += (colour<<8); - dst = BITMAP_ADDR16(bitmap, drawy, drawx); + dst = &bitmap.pix16(drawy, drawx); dst[0] = dat; } } drawx++; - if ((drawx < cliprect->max_x) && (drawx > cliprect->min_x) && (drawy < cliprect->max_y) && (drawy > cliprect->min_y)) + if (cliprect.contains(drawx, drawy)) { dat = (rom[(tileaddr*32)+count] & 0x0f); if (dat!=15) { //dat += (colour<<8); - dst = BITMAP_ADDR16(bitmap, drawy, drawx); + dst = &bitmap.pix16(drawy, drawx); dst[0] = dat; } } @@ -218,13 +218,13 @@ } else { - if ((drawx < cliprect->max_x) && (drawx > cliprect->min_x) && (drawy < cliprect->max_y) && (drawy > cliprect->min_y)) + if (cliprect.contains(drawx, drawy)) { dat = (rom[(tileaddr*32)+count] & 0xff); if (dat!=255) { dat += (colour<<8) & 0xf00; - dst = BITMAP_ADDR16(bitmap, drawy, drawx); + dst = &bitmap.pix16(drawy, drawx); dst[0] = dat; } } @@ -234,7 +234,7 @@ } } -static void ttmjprd_draw_tilemap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32*tileram, UINT32*tileregs, UINT8*rom ) +static void ttmjprd_draw_tilemap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32*tileram, UINT32*tileregs, UINT8*rom ) { int y,x; int count; @@ -275,27 +275,16 @@ } -static SCREEN_UPDATE( tmmjprd ) +static SCREEN_UPDATE_IND16( tmmjprd_left ) { - tmmjprd_state *state = screen->machine().driver_data(); - UINT8* gfxroms = screen->machine().region("gfx2")->base(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + tmmjprd_state *state = screen.machine().driver_data(); + UINT8* gfxroms = screen.machine().region("gfx2")->base(); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - if (screen == left_screen) - { - ttmjprd_draw_tilemap( screen->machine(), bitmap, cliprect, state->m_tilemap_ram[3], state->m_tilemap_regs[3], gfxroms ); - draw_sprites(screen->machine(),bitmap,cliprect, 1); - ttmjprd_draw_tilemap( screen->machine(), bitmap, cliprect, state->m_tilemap_ram[2], state->m_tilemap_regs[2], gfxroms ); - } - if (screen == right_screen) - { - ttmjprd_draw_tilemap( screen->machine(), bitmap, cliprect, state->m_tilemap_ram[1], state->m_tilemap_regs[1], gfxroms ); - draw_sprites(screen->machine(),bitmap,cliprect, 0); - ttmjprd_draw_tilemap( screen->machine(), bitmap, cliprect, state->m_tilemap_ram[0], state->m_tilemap_regs[0], gfxroms ); - } + ttmjprd_draw_tilemap( screen.machine(), bitmap, cliprect, state->m_tilemap_ram[3], state->m_tilemap_regs[3], gfxroms ); + draw_sprites(screen.machine(),bitmap,cliprect, 1); + ttmjprd_draw_tilemap( screen.machine(), bitmap, cliprect, state->m_tilemap_ram[2], state->m_tilemap_regs[2], gfxroms ); /* popmessage("%08x %08x %08x %08x %08x %08x", @@ -321,6 +310,20 @@ return 0; } +static SCREEN_UPDATE_IND16( tmmjprd_right ) +{ + tmmjprd_state *state = screen.machine().driver_data(); + UINT8* gfxroms = screen.machine().region("gfx2")->base(); + + bitmap.fill(get_black_pen(screen.machine()), cliprect); + + ttmjprd_draw_tilemap( screen.machine(), bitmap, cliprect, state->m_tilemap_ram[1], state->m_tilemap_regs[1], gfxroms ); + draw_sprites(screen.machine(),bitmap,cliprect, 0); + ttmjprd_draw_tilemap( screen.machine(), bitmap, cliprect, state->m_tilemap_ram[0], state->m_tilemap_regs[0], gfxroms ); + + return 0; +} + static VIDEO_START(tmmjprd) { tmmjprd_state *state = machine.driver_data(); @@ -427,7 +430,7 @@ blt_source+=2; writeoffs=blt_oddflg+blt_column; state->m_tilemap_ram[blt_tilemp][writeoffs]=(state->m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<mark_tile_dirty(writeoffs); blt_column++; blt_column&=0x7f; @@ -444,7 +447,7 @@ { writeoffs=blt_oddflg+blt_column; state->m_tilemap_ram[blt_tilemp][writeoffs]=(state->m_tilemap_ram[blt_tilemp][writeoffs]&mask)|(blt_value<mark_tile_dirty(writeoffs); blt_column++; blt_column&=0x7f; } @@ -749,7 +752,7 @@ // MCFG_SCREEN_ADD("screen", RASTER) // MCFG_SCREEN_REFRESH_RATE(60) // MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) -// MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) +// MCFG_SCREEN_UPDATE_DRIVER(tmmjprd_state, screen_update) // MCFG_SCREEN_SIZE(64*16, 64*16) // MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) MCFG_PALETTE_LENGTH(0x1000) @@ -758,22 +761,20 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) //MCFG_SCREEN_VISIBLE_AREA(0*8, 64*16-1, 0*8, 64*16-1) - MCFG_SCREEN_UPDATE(tmmjprd) + MCFG_SCREEN_UPDATE_STATIC(tmmjprd_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*16, 64*16) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 28*8-1) //MCFG_SCREEN_VISIBLE_AREA(0*8, 64*16-1, 0*8, 64*16-1) - MCFG_SCREEN_UPDATE(tmmjprd) + MCFG_SCREEN_UPDATE_STATIC(tmmjprd_right) MCFG_VIDEO_START(tmmjprd) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/tmnt.c mame-0.145/src/mame/drivers/tmnt.c --- mame-0.144/src/mame/drivers/tmnt.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tmnt.c 2012-02-06 21:30:40.000000000 +0000 @@ -65,7 +65,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "video/konicdev.h" #include "machine/eeprom.h" #include "cpu/m68000/m68000.h" @@ -176,18 +175,8 @@ { tmnt_state *state = device->machine().driver_data(); - // cheap IRQ multiplexing to avoid losing sound IRQs - switch (cpu_getiloops(device)) - { - case 0: - device_set_input_line(device, M68K_IRQ_5, HOLD_LINE); - break; - - default: - if (state->m_cuebrick_snd_irqlatch) - device_set_input_line(device, M68K_IRQ_6, HOLD_LINE); - break; - } + if (state->m_irq5_mask) + device_set_input_line(device, M68K_IRQ_5, HOLD_LINE); } static INTERRUPT_GEN( punkshot_interrupt ) @@ -1247,11 +1236,11 @@ PORT_DIPNAME( 0x18, 0x08, "Machine Name" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, DEF_STR( None ) ) PORT_DIPSETTING( 0x10, "Lewis" ) - PORT_DIPSETTING( 0x08, "Johnson" ) // Japan factory default = "Johnson" + PORT_DIPSETTING( 0x08, "Johnson" ) PORT_DIPSETTING( 0x00, "George" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -1293,19 +1282,19 @@ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // US and Japan factory default = "3" + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) PORT_DIPNAME( 0x18, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "30K, Every 80K" ) // Japan factory default = "30K, Every 80K" + PORT_DIPSETTING( 0x18, "30K, Every 80K" ) // Japan factory default PORT_DIPSETTING( 0x10, "50K, Every 100K" ) - PORT_DIPSETTING( 0x08, "50K Only" ) // US factory default = "50K Only" (struck off "50K, Every 100K") + PORT_DIPSETTING( 0x08, "50K Only" ) // US factory default PORT_DIPSETTING( 0x00, "100K Only" ) PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" - PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) // US factory default = "Difficult" (struck off "Normal") + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default + PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) // US factory default PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) @@ -1315,9 +1304,9 @@ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "VRAM Character Check" ) PORT_DIPLOCATION("SW3:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) // US manual says "VRAM Character Check" - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) // Japanese manual says "not used" + PORT_DIPNAME( 0x02, 0x02, "VRAM Character Check" ) PORT_DIPLOCATION("SW3:2") // JP manual says "not used" + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) INPUT_PORTS_END @@ -1434,7 +1423,7 @@ PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) // ditto PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // US and Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -1458,13 +1447,13 @@ PORT_DIPUNUSED_DIPLOC( 0x0200, IP_ACTIVE_LOW, "SW2:2" ) // manual says "not used", but doesn't "should be kept OFF" PORT_DIPNAME( 0x0c00, 0x0800, "Period Length" ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x0c00, "1 Minutes" ) - PORT_DIPSETTING( 0x0800, "2 Minutes" ) // Japan factory default = "2 Minutes" + PORT_DIPSETTING( 0x0800, "2 Minutes" ) PORT_DIPSETTING( 0x0400, "3 Minutes" ) PORT_DIPSETTING( 0x0000, "4 Minutes" ) PORT_DIPUNUSED_DIPLOC( 0x1000, IP_ACTIVE_LOW, "SW2:5" ) // manual says "not used", but doesn't "should be kept OFF" PORT_DIPNAME( 0x6000, 0x4000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x2000, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -1555,73 +1544,22 @@ PORT_MODIFY("DSW1/DSW2") PORT_DIPNAME( 0x0300, 0x0300, "Energy" ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x0300, "30" ) // US set1 factory default = "30" + PORT_DIPSETTING( 0x0300, "30" ) PORT_DIPSETTING( 0x0200, "40" ) PORT_DIPSETTING( 0x0100, "50" ) PORT_DIPSETTING( 0x0000, "60" ) PORT_DIPNAME( 0x0c00, 0x0800, "Period Length" ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x0c00, "2 Minutes" ) - PORT_DIPSETTING( 0x0800, "3 Minutes" ) // US set1 factory default = "3 Minutes" + PORT_DIPSETTING( 0x0800, "3 Minutes" ) PORT_DIPSETTING( 0x0400, "4 Minutes" ) PORT_DIPSETTING( 0x0000, "5 Minutes" ) PORT_DIPNAME( 0x6000, 0x6000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") - PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) // US factory default = "Easy" + PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x2000, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Very_Difficult ) ) INPUT_PORTS_END -/* -static INPUT_PORTS_START( punkshot2o ) // US 2 Players set1 - PORT_INCLUDE( punkshtj ) - PORT_INCLUDE( punksht_us_coinage ) - - PORT_MODIFY("DSW1/DSW2") - PORT_DIPNAME( 0x0300, 0x0300, "Energy" ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x0300, "30" ) // US set1 factory default = "30" - PORT_DIPSETTING( 0x0200, "40" ) - PORT_DIPSETTING( 0x0100, "50" ) - PORT_DIPSETTING( 0x0000, "60" ) - PORT_DIPNAME( 0x0c00, 0x0800, "Period Length" ) PORT_DIPLOCATION("SW2:3,4") - PORT_DIPSETTING( 0x0c00, "2 Minutes" ) - PORT_DIPSETTING( 0x0800, "3 Minutes" ) // US set1 factory default = "3 Minutes" - PORT_DIPSETTING( 0x0400, "4 Minutes" ) - PORT_DIPSETTING( 0x0000, "5 Minutes" ) - PORT_DIPNAME( 0x6000, 0x6000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") - PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) // US set1 factory default = "Easy" - PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Difficult ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Very_Difficult ) ) -INPUT_PORTS_END -*/ - -/* -static INPUT_PORTS_START( punksht4n ) // US 4 Players set2 - PORT_INCLUDE( punkshtj4 ) - PORT_INCLUDE( punksht_us_coinage ) - - PORT_MODIFY("DSW1/DSW2") - PORT_DIPNAME( 0x0300, 0x0300, "Energy" ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x0300, "40" ) - PORT_DIPSETTING( 0x0200, "50" ) - PORT_DIPSETTING( 0x0100, "60" ) - PORT_DIPSETTING( 0x0000, "70" ) - PORT_DIPNAME( 0x0c00, 0x0c00, "Period Length" ) PORT_DIPLOCATION("SW2:3,4") - PORT_DIPSETTING( 0x0c00, "3 Minutes" ) - PORT_DIPSETTING( 0x0800, "4 Minutes" ) - PORT_DIPSETTING( 0x0400, "5 Minutes" ) - PORT_DIPSETTING( 0x0000, "6 Minutes" ) - PORT_DIPNAME( 0x6000, 0x6000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") - PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Difficult ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Very_Difficult ) ) - PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) -INPUT_PORTS_END -*/ - static INPUT_PORTS_START( punksht2 ) // US 2 Players set2 PORT_INCLUDE( punkshtj ) PORT_INCLUDE( punksht_us_coinage ) @@ -1671,18 +1609,18 @@ PORT_START("DSW1") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // US and Japan factory default = "3" + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) // manual says "not used" PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "100K, 400K" ) // US factory default = "100K, 400K" - PORT_DIPSETTING( 0x10, "150K, 500K" ) // Japan factory default = "150K, 500K" + PORT_DIPSETTING( 0x18, "100K, 400K" ) + PORT_DIPSETTING( 0x10, "150K, 500K" ) PORT_DIPSETTING( 0x08, "200K Only" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // US and Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -1706,8 +1644,8 @@ PORT_MODIFY("DSW1") PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "100K, 400K" ) // US factory default = "100K, 400K" - PORT_DIPSETTING( 0x10, "150K, 500K" ) // Japan factory default = "150K, 500K" + PORT_DIPSETTING( 0x18, "100K, 400K" ) // US factory default + PORT_DIPSETTING( 0x10, "150K, 500K" ) // JP factory default PORT_DIPSETTING( 0x08, "200K Only" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) INPUT_PORTS_END @@ -1759,7 +1697,7 @@ PORT_DIPSETTING( 0x0000, "3/5" ) PORT_DIPNAME( 0x6000, 0x4000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x6000, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x4000, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x2000, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -1808,7 +1746,7 @@ PORT_DIPSETTING( 0x0000, "4/4" ) // Cocktail (P1&P2 <-> P3&P4) PORT_DIPNAME( 0x1800, 0x1000, "Initial/Maximum Credit" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x1800, "2/2" ) - PORT_DIPSETTING( 0x1000, "2/3" ) // Japan factory default = "Maximum 3" + PORT_DIPSETTING( 0x1000, "2/3" ) PORT_DIPSETTING( 0x0800, "2/4" ) PORT_DIPSETTING( 0x0000, "2/5" ) @@ -2119,7 +2057,8 @@ static void cuebrick_irq_handler( device_t *device, int state ) { tmnt_state *tmnt = device->machine().driver_data(); - tmnt->m_cuebrick_snd_irqlatch = state; + + device_set_input_line(tmnt->m_maincpu, M68K_IRQ_6, (state) ? ASSERT_LINE : CLEAR_LINE); } static const ym2151_interface ym2151_interface_cbj = @@ -2326,13 +2265,22 @@ state->m_cuebrick_nvram_bank = 0; } +/* cuebrick, mia and tmnt */ +static INTERRUPT_GEN( tmnt_vblank_irq ) +{ + tmnt_state *state = device->machine().driver_data(); + + if(state->m_irq5_mask) + device_set_input_line(device, 5, HOLD_LINE); +} + static MACHINE_CONFIG_START( cuebrick, tmnt_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 8000000) /* 8 MHz */ MCFG_CPU_PROGRAM_MAP(cuebrick_main_map) - MCFG_CPU_VBLANK_INT_HACK(cuebrick_interrupt,10) + MCFG_CPU_VBLANK_INT("screen",cuebrick_interrupt) MCFG_MACHINE_START(common) MCFG_MACHINE_RESET(common) @@ -2343,10 +2291,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(mia) + MCFG_SCREEN_UPDATE_STATIC(mia) MCFG_PALETTE_LENGTH(1024) MCFG_NVRAM_ADD_0FILL("nvram") @@ -2371,7 +2318,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/3) MCFG_CPU_PROGRAM_MAP(mia_main_map) - MCFG_CPU_VBLANK_INT("screen", irq5_line_hold) + MCFG_CPU_VBLANK_INT("screen", tmnt_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) MCFG_CPU_PROGRAM_MAP(mia_audio_map) @@ -2385,10 +2332,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(mia) + MCFG_SCREEN_UPDATE_STATIC(mia) MCFG_PALETTE_LENGTH(1024) @@ -2425,7 +2371,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL_24MHz/3) MCFG_CPU_PROGRAM_MAP(tmnt_main_map) - MCFG_CPU_VBLANK_INT("screen", irq5_line_hold) + MCFG_CPU_VBLANK_INT("screen", tmnt_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) MCFG_CPU_PROGRAM_MAP(tmnt_audio_map) @@ -2439,11 +2385,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) //MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) MCFG_SCREEN_VISIBLE_AREA(13*8-8, (64-13)*8-1+8, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(tmnt) + MCFG_SCREEN_UPDATE_STATIC(tmnt) // We see something strange in the left 8 pixels and the right 8 pixels, but it is same as real PCB. MCFG_PALETTE_LENGTH(1024) @@ -2494,10 +2439,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(punkshot) + MCFG_SCREEN_UPDATE_STATIC(punkshot) MCFG_PALETTE_LENGTH(2048) @@ -2536,10 +2480,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(lgtnfght) + MCFG_SCREEN_UPDATE_STATIC(lgtnfght) MCFG_PALETTE_LENGTH(2048) @@ -2584,11 +2527,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-15)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(lgtnfght) - MCFG_SCREEN_EOF( blswhstl ) + MCFG_SCREEN_UPDATE_STATIC(lgtnfght) + MCFG_SCREEN_VBLANK_STATIC( blswhstl ) MCFG_PALETTE_LENGTH(2048) @@ -2649,10 +2591,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(glfgreat) + MCFG_SCREEN_UPDATE_STATIC(glfgreat) MCFG_GFXDECODE(glfgreat) MCFG_PALETTE_LENGTH(2048) @@ -2715,10 +2656,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(glfgreat) + MCFG_SCREEN_UPDATE_STATIC(glfgreat) MCFG_GFXDECODE(glfgreat) MCFG_PALETTE_LENGTH(2048) @@ -2766,10 +2706,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(tmnt2) + MCFG_SCREEN_UPDATE_STATIC(tmnt2) MCFG_PALETTE_LENGTH(2048) @@ -2814,10 +2753,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(tmnt2) + MCFG_SCREEN_UPDATE_STATIC(tmnt2) MCFG_PALETTE_LENGTH(2048) @@ -2858,10 +2796,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(tmnt2) + MCFG_SCREEN_UPDATE_STATIC(tmnt2) MCFG_PALETTE_LENGTH(2048) @@ -2899,10 +2836,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(thndrx2) + MCFG_SCREEN_UPDATE_STATIC(thndrx2) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/tmspoker.c mame-0.145/src/mame/drivers/tmspoker.c --- mame-0.144/src/mame/drivers/tmspoker.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tmspoker.c 2012-02-06 21:30:35.000000000 +0000 @@ -233,7 +233,7 @@ { tmspoker_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -257,10 +257,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( tmspoker ) +static SCREEN_UPDATE_IND16( tmspoker ) { - tmspoker_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + tmspoker_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -571,7 +571,6 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) @@ -581,7 +580,7 @@ MCFG_PALETTE_LENGTH(256) MCFG_VIDEO_START(tmspoker) - MCFG_SCREEN_UPDATE(tmspoker) + MCFG_SCREEN_UPDATE_STATIC(tmspoker) MCFG_MC6845_ADD("crtc", MC6845, MASTER_CLOCK/4, mc6845_intf) /* guess */ diff -Nru mame-0.144/src/mame/drivers/tnzs.c mame-0.145/src/mame/drivers/tnzs.c --- mame-0.144/src/mame/drivers/tnzs.c 2012-01-13 15:34:54.000000000 +0000 +++ mame-0.145/src/mame/drivers/tnzs.c 2012-02-06 21:30:40.000000000 +0000 @@ -1636,11 +1636,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(512) @@ -1678,11 +1677,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(512) @@ -1723,11 +1721,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.15) /* it should be the same as the newer pcb vsync */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(512) @@ -1764,11 +1761,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(insectx) MCFG_PALETTE_LENGTH(512) @@ -1804,11 +1800,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(512) @@ -1855,11 +1850,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.15) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(512) @@ -1919,11 +1913,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tnzs) - MCFG_SCREEN_EOF(tnzs) + MCFG_SCREEN_UPDATE_STATIC(tnzs) + MCFG_SCREEN_VBLANK_STATIC(tnzs) MCFG_GFXDECODE(tnzs) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/toaplan1.c mame-0.145/src/mame/drivers/toaplan1.c --- mame-0.144/src/mame/drivers/toaplan1.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/toaplan1.c 2012-02-06 21:30:38.000000000 +0000 @@ -345,6 +345,26 @@ #include "includes/toaplan1.h" #include "sound/3812intf.h" +#define PIXEL_CLOCK (XTAL_28MHz/4) + +/* freq V Hz H kHz +Fire Shark 57.6132 14.82 --> 472.33 * 257.23 +Vimana 57.6125 14.78 --> 473.61 * 256.54 + +** earlier measurements from another pcb owner, why are some of these off by 2Hz??? +Hellfire 57.59 ? +Truxton 57.59 ? +Rally Bike 55.14 ? +Vimana 55.14 ? + +*/ +#define HTOTAL (473) +#define HBEND (0) +#define HBSTART (320) + +#define VTOTAL (257) +#define VBEND (0) +#define VBSTART (240) /***************************** 68000 Memory Map *****************************/ @@ -1526,12 +1546,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(55.14) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x288 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(rallybik) - MCFG_SCREEN_EOF(rallybik) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(rallybik) + MCFG_SCREEN_VBLANK_STATIC(rallybik) MCFG_GFXDECODE(rallybik) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1566,12 +1583,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(57.59) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x320 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(toaplan1) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1606,12 +1620,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x240 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 16, 255) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND+16, VBSTART+16) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(toaplan1) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1646,12 +1657,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE( (XTAL_28MHz / 4) / (450 * 282) ) /* fixed by SUZ */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x240 mostly active, 512x512 actually used */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 16, 255) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND+16, VBSTART+16) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(toaplan1) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1690,12 +1698,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(55.14) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x240 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 16, 255) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND+16, VBSTART+16) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(toaplan1) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1728,12 +1733,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(57.59) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x320 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(samesame) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(samesame) MCFG_GFXDECODE(toaplan1) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1768,12 +1770,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x256 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(outzone) MCFG_PALETTE_LENGTH((64*16)+(64*16)) @@ -1806,12 +1805,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(57.59) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) /* 512x256 active */ - MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan1) - MCFG_SCREEN_EOF(toaplan1) + MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + MCFG_SCREEN_UPDATE_STATIC(toaplan1) + MCFG_SCREEN_VBLANK_STATIC(toaplan1) MCFG_GFXDECODE(vm) MCFG_PALETTE_LENGTH((64*16)+(64*16)) diff -Nru mame-0.144/src/mame/drivers/toaplan2.c mame-0.145/src/mame/drivers/toaplan2.c --- mame-0.144/src/mame/drivers/toaplan2.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/toaplan2.c 2012-02-06 21:30:38.000000000 +0000 @@ -3044,11 +3044,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3086,11 +3085,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3177,11 +3175,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (double)(XTAL_27MHz / 4) / (432 * 263) ) /* 27MHz Oscillator */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(dogyuun) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(dogyuun) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(t2dualvdp) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3222,11 +3219,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3260,11 +3256,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3298,11 +3293,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (double)(XTAL_27MHz / 4) / (432 * 263) ) /* 27MHz Oscillator */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(truxton2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3354,11 +3348,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3396,11 +3389,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3478,11 +3470,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (double)(XTAL_27MHz / 4) / (432 * 263) ) /* 27MHz Oscillator */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(truxton2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3516,11 +3507,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(fixeightbl) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3557,11 +3547,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (double)(XTAL_27MHz / 4) / (432 * 263) ) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3596,11 +3585,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(batsugun) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(batsugun) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(t2dualvdp) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3635,11 +3623,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(toaplan2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(toaplan2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(toaplan2) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3679,11 +3666,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(raizing) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3723,11 +3709,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(raizing) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3778,11 +3763,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(truxton2) - MCFG_SCREEN_EOF(toaplan2) + MCFG_SCREEN_UPDATE_STATIC(truxton2) + MCFG_SCREEN_VBLANK_STATIC(toaplan2) MCFG_GFXDECODE(raizing) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3825,10 +3809,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(batrider) + MCFG_SCREEN_UPDATE_STATIC(batrider) MCFG_GFXDECODE(batrider) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) @@ -3877,10 +3860,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(432, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(batrider) + MCFG_SCREEN_UPDATE_STATIC(batrider) MCFG_GFXDECODE(batrider) MCFG_PALETTE_LENGTH(T2PALETTE_LENGTH) diff -Nru mame-0.144/src/mame/drivers/toki.c mame-0.145/src/mame/drivers/toki.c --- mame-0.144/src/mame/drivers/toki.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/toki.c 2012-02-06 21:30:40.000000000 +0000 @@ -429,11 +429,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.61) /* verified on pcb */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* verified */ - MCFG_SCREEN_UPDATE(toki) - MCFG_SCREEN_EOF(toki) + MCFG_SCREEN_UPDATE_STATIC(toki) + MCFG_SCREEN_VBLANK_STATIC(toki) MCFG_GFXDECODE(toki) MCFG_PALETTE_LENGTH(1024) @@ -460,11 +459,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* verified */ - MCFG_SCREEN_UPDATE(tokib) - MCFG_SCREEN_EOF(tokib) + MCFG_SCREEN_UPDATE_STATIC(tokib) + MCFG_SCREEN_VBLANK_STATIC(tokib) MCFG_GFXDECODE(tokib) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/tokyocop.c mame-0.145/src/mame/drivers/tokyocop.c --- mame-0.144/src/mame/drivers/tokyocop.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tokyocop.c 2012-02-06 21:30:41.000000000 +0000 @@ -1,5 +1,8 @@ /* Tokyo Cop +TODO: +can't be emulated without proper mb bios + Italian Version PC based hardware @@ -16,6 +19,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" @@ -24,21 +29,32 @@ { public: tokyocop_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; -static VIDEO_START(tokyocop) +void tokyocop_state::video_start() { } -static SCREEN_UPDATE(tokyocop) +UINT32 tokyocop_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } -static ADDRESS_MAP_START( tokyocop_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( tokyocop_map, AS_PROGRAM, 32, tokyocop_state ) AM_RANGE(0x00000000, 0x0001ffff) AM_ROM ADDRESS_MAP_END @@ -53,16 +69,13 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(tokyocop_state, screen_update) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(tokyocop) MCFG_PALETTE_LENGTH(0x100) - - MCFG_VIDEO_START(tokyocop) MACHINE_CONFIG_END @@ -75,4 +88,4 @@ ROM_END -GAME( 2003, tokyocop, 0, tokyocop, tokyocop, 0, ROT0, "Gaelco", "Tokyo Cop (Italy)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2003, tokyocop, 0, tokyocop, tokyocop, 0, ROT0, "Gaelco", "Tokyo Cop (Italy)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/tomcat.c mame-0.145/src/mame/drivers/tomcat.c --- mame-0.144/src/mame/drivers/tomcat.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/tomcat.c 2012-02-06 21:30:40.000000000 +0000 @@ -404,7 +404,7 @@ //MCFG_SCREEN_REFRESH_RATE((double)XTAL_12MHz / 16 / 16 / 16 / 12 / 5 ) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 280, 0, 250) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(avg_tomcat) diff -Nru mame-0.144/src/mame/drivers/tonton.c mame-0.145/src/mame/drivers/tonton.c --- mame-0.144/src/mame/drivers/tonton.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/tonton.c 2012-02-06 21:30:40.000000000 +0000 @@ -29,15 +29,15 @@ #include "sound/ay8910.h" #include "video/v9938.h" #include "machine/nvram.h" -#include "deprecat.h" class tonton_state : public driver_device { public: tonton_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_v9938(*this, "v9938") { } - bitmap_t *m_vdp0_bitmap; + required_device m_v9938; }; #define MAIN_CLOCK XTAL_21_4772MHz @@ -56,27 +56,9 @@ * Video Hardware * *************************************************/ -static void tonton_vdp0_interrupt(running_machine &machine, int i) +static void tonton_vdp0_interrupt(device_t *, v99x8_device &device, int i) { - cputag_set_input_line (machine, "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); -} - -static VIDEO_START( tonton ) -{ - tonton_state *state = machine.driver_data(); - state->m_vdp0_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - v9938_init (machine, 0, *machine.primary_screen, state->m_vdp0_bitmap, MODEL_V9938, 0x40000, tonton_vdp0_interrupt); - v9938_reset(0); -} - -static SCREEN_UPDATE( tonton ) -{ - tonton_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - - copybitmap(bitmap, state->m_vdp0_bitmap, 0, 0, 0, 0, cliprect); - - return 0; + cputag_set_input_line (device.machine(), "maincpu", 0, (i ? HOLD_LINE : CLEAR_LINE)); } @@ -113,10 +95,7 @@ AM_RANGE(0x00, 0x01) AM_WRITE(tonton_outport_w) AM_RANGE(0x02, 0x02) AM_READ_PORT("DSW1") AM_RANGE(0x03, 0x03) AM_READ_PORT("DSW2") - AM_RANGE(0x88, 0x88) AM_READWRITE( v9938_0_vram_r, v9938_0_vram_w ) - AM_RANGE(0x89, 0x89) AM_READWRITE( v9938_0_status_r, v9938_0_command_w ) - AM_RANGE(0x8a, 0x8a) AM_WRITE( v9938_0_palette_w ) - AM_RANGE(0x8b, 0x8b) AM_WRITE( v9938_0_register_w ) + AM_RANGE(0x88, 0x8b) AM_DEVREADWRITE_MODERN( "v9938", v9938_device, read, write ) AM_RANGE(0xa0, 0xa1) AM_DEVWRITE("aysnd", ay8910_address_data_w) AM_RANGE(0xa2, 0xa2) AM_DEVREAD("aysnd", ay8910_r) ADDRESS_MAP_END @@ -211,7 +190,6 @@ static MACHINE_RESET( tonton ) { - v9938_reset(0); } @@ -219,11 +197,12 @@ * R/W Handlers and Interrupt Routines * *************************************************/ -INTERRUPT_GEN( tonton_interrupt ) +static TIMER_DEVICE_CALLBACK( tonton_interrupt ) { - v9938_set_sprite_limit(0, 0); - v9938_set_resolution(0, 0); - v9938_interrupt(device->machine(), 0); + tonton_state *state = timer.machine().driver_data(); + state->m_v9938->set_sprite_limit(0); + state->m_v9938->set_resolution(0); + state->m_v9938->interrupt(); } @@ -271,7 +250,7 @@ MCFG_CPU_ADD("maincpu",Z80,MAIN_CLOCK/6) /* Guess. According to other MSX2 based gambling games */ MCFG_CPU_PROGRAM_MAP(tonton_map) MCFG_CPU_IO_MAP(tonton_io) - MCFG_CPU_VBLANK_INT_HACK(tonton_interrupt, 262) + MCFG_TIMER_ADD_SCANLINE("scantimer", tonton_interrupt, "screen", 0, 1) MCFG_NVRAM_ADD_0FILL("nvram") @@ -281,20 +260,20 @@ /* video hardware */ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) + MCFG_V9938_ADD("v9938", "screen", 0x40000) + MCFG_V99X8_INTERRUPT_CALLBACK_STATIC(tonton_vdp0_interrupt) + MCFG_SCREEN_ADD("screen",RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(MSX2_TOTAL_XRES_PIXELS, MSX2_TOTAL_YRES_PIXELS) MCFG_SCREEN_VISIBLE_AREA(MSX2_XBORDER_PIXELS - MSX2_VISIBLE_XBORDER_PIXELS, MSX2_TOTAL_XRES_PIXELS - MSX2_XBORDER_PIXELS + MSX2_VISIBLE_XBORDER_PIXELS - 1, MSX2_YBORDER_PIXELS - MSX2_VISIBLE_YBORDER_PIXELS, MSX2_TOTAL_YRES_PIXELS - MSX2_YBORDER_PIXELS + MSX2_VISIBLE_YBORDER_PIXELS - 1) - MCFG_SCREEN_UPDATE(tonton) + MCFG_SCREEN_UPDATE_DEVICE("v9938", v9938_device, screen_update) MCFG_PALETTE_LENGTH(512) MCFG_PALETTE_INIT( v9938 ) - MCFG_VIDEO_START(tonton) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("aysnd", YM2149, MAIN_CLOCK/12) /* Guess. According to other MSX2 based gambling games */ diff -Nru mame-0.144/src/mame/drivers/toobin.c mame-0.145/src/mame/drivers/toobin.c --- mame-0.144/src/mame/drivers/toobin.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/toobin.c 2012-02-06 21:30:40.000000000 +0000 @@ -240,8 +240,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/2, 640, 0, 512, 416, 0, 384) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) - MCFG_SCREEN_UPDATE(toobin) + MCFG_SCREEN_UPDATE_STATIC(toobin) MCFG_GFXDECODE(toobin) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/topspeed.c mame-0.145/src/mame/drivers/topspeed.c --- mame-0.144/src/mame/drivers/topspeed.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/topspeed.c 2012-02-06 21:30:33.000000000 +0000 @@ -716,10 +716,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(topspeed) + MCFG_SCREEN_UPDATE_STATIC(topspeed) MCFG_GFXDECODE(topspeed) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/toratora.c mame-0.145/src/mame/drivers/toratora.c --- mame-0.144/src/mame/drivers/toratora.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/toratora.c 2012-02-06 21:30:39.000000000 +0000 @@ -65,9 +65,9 @@ * *************************************/ -static SCREEN_UPDATE( toratora ) +static SCREEN_UPDATE_RGB32( toratora ) { - toratora_state *state = screen->machine().driver_data(); + toratora_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < state->m_videoram_size; offs++) @@ -81,7 +81,7 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; data = data << 1; x = x + 1; @@ -411,12 +411,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0,256-1,8,248-1) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_UPDATE(toratora) + MCFG_SCREEN_UPDATE_STATIC(toratora) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/tourtabl.c mame-0.145/src/mame/drivers/tourtabl.c --- mame-0.144/src/mame/drivers/tourtabl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/tourtabl.c 2012-02-06 21:30:42.000000000 +0000 @@ -186,9 +186,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS( MASTER_CLOCK, 228, 34, 34 + 160, 262, 46, 46 + 200 ) - MCFG_SCREEN_UPDATE(tia) + MCFG_SCREEN_UPDATE_STATIC(tia) MCFG_PALETTE_LENGTH(TIA_PALETTE_LENGTH) MCFG_PALETTE_INIT(tia_NTSC) diff -Nru mame-0.144/src/mame/drivers/tourvis.c mame-0.145/src/mame/drivers/tourvis.c --- mame-0.144/src/mame/drivers/tourvis.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/drivers/tourvis.c 2012-02-06 21:30:35.000000000 +0000 @@ -0,0 +1,505 @@ +/**************************************************************************** + + TourVision + Driver by Mariusz Wojcieszek and Stephh + + Bootleg PC-Engine based arcade board from the Spanish company TourVision. + Two known hardware revisions, one with a sub-board with the PC-Engine chipset + and the other as an integrated PCB. + + Todo: complete jamma interface emulation. + + By now, three known BIOS versions, U4-52 (dumped from a board with-subboard PCB), + U4-55 (dumped from an integrated PCB) and U4-60 (dumped from a board with-subboard PCB). + + Known games: + + Special Criminal Investigation + Power League IV + Final Match Tennis + Formation Soccer + Super Volleay Ball + Rastan Saga II + Dungeon Explorer + Legendary Axe + Thunder Blade + USA Pro Basketball + Out Run + After Burner + Final Lap + Columns + Power Sports + Saigo no Nindou + Son Son II + + _______________________________________________________________________________________________________________________________________________ +| | +| ____________ ____________ ____________ ____________ | +| |T74LS125AB1| ____ |T74LS125AB1| ____ |T74LS125AB1| ____ |T74LS125AB1| ____ | +| ------------- | | ------------- | | ------------- | | ------------- | | | +| ____________ | | ____________ | | ____________ | | ____________ | | | +| | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | +| ------------- | | ------------- | | ------------- | | ------------- | | | +| ____________ | | ____________ | | ____________ | | ____________ | | | +| ___________ ____________ | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | +| |4116R-001 | |X74LS32B1 | ------------- | | ------------- | | ------------- | | ------------- | | | +| ------------- ------------- |JP| |JP| |JP| |JP| | +| ___________ | 4| | 3| | 2| | 1| | +|__ ___________ ____________ | | ____________ | | ____________ | | ____________ | | | + | ____________ ____________ | 74LS244N | | | | 74LS244N | | | | 74LS244N | | | | 74LS244N | | | | + __| |SN74LS257SN| |4116R-001 | ------------- | | ------------- | | ------------- | | ------------- | | | +|__ ------------- ------------- ____________ | | ____________ | | ____________ | | ____________ | | | +|__ ____________ ____________ | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | SN74F245N | | | | +|__ | 74LS157N | | 74LS157N | ------------- | | ------------- | | ------------- | | ------------- | | | +|__ ------------- ------------- ____________ | | ____________ | | ____________ | | ____________ | | | +|__ ____________ ____________ | 74LS244N | ---- | 74LS244N | ---- | 74LS244N | ---- | 74LS244N | ---- | +|__ | SN74LS08N | | SN74LS08N | ------------- ------------- ------------- ------------- | +|__ ------------- ------------- | +|__ ____________ ____________ ____________ | +|__ | SN74LS08N | | SN74LS08N | |HSRM2264LM10 | +|__ ------------- ------------- |__________| | +|__ ____________ ____________ | +|__ | 74LS138N | | 74LS138N | | +|__ ------------- ------------- | +|__ ____________ ____________ ____________ ____________ ____________ ____________ ____________ | +|__ | 74LS244N | | 74LS244N | |T74LS32B1 | |MC14017BCP| | T74LS14B1 | | GD74LS393 | |T74LS125AB1| | +|__ ------------- ------------- ------------ ------------ ------------- ------------ ------------- | +|__ ......... ......... ____________ | +|__ ......... ......... | 74LS138N | _________ | +|__ ___________ ___________ ------------ | | ______ | +|__ |4116R-001 | |4116R-001 | _________________ | | | HU | HSRM20256LM12 | +|__ ------------- ------------- | | | BT1 | |C6270| ___ | +|__ __________ ____________ | NEC D4465C | | | | | | | | +|__ | TC4011BP| |SN74LS373N | |________________| |_______| |_____| | | | +|__ ----------- ------------- _________________ |__| | +|__ ..... ___________ ____ | TOURVISION BIOS| | +|__ | 74LS138N | |XT1| | | ______ ______ ___ | + | ------------ |___| |________________| ____ | HU | | HU | | | | + __| IC_ _____________ ________ | | |C6280A |C6260A | | | +| |36| | 74LS244N | _________________________ | PT | | | | | |__| | +| ---- ------------- | | |____| |_____| |_____| | +| ________ _____________ | NEC D8085AHC | ___________ ___________ _______ HSRM20256LM12| +| | DIP 2 | | 74LS244N | |________________________| | T74LS14B1| |MC14001BCP| |LM393N| ________ | +| --------- -------------- _________________________ ------------ ------------ -------- |D74HCU04C | +| ________ _____________ | | ___________ --------- | +| ________ | 74LS244N | | NEC D8155HC | | 7407N | ____ | +| | DIP 1 | -------------- |________________________| ------------ |XT2| | +| --------- ____ _____________ _____________ |___| | +| JP107 | JP 106 | | JP 105 | | +| ---- -------------- -------------- | +|_______________________________________________________________________________________________________________________________________________| + +IC36 = ST NE 555N 99201 +XT1 = 6144 KSS1H +JP107 = 2-pin connector +JP106 = 14-pin connector to 2-digit 7 segments display +JP105 = 16-pin connector (unknown functionality) +PT = Push-type switch +BT1 = 3.6 V battery +XT2 = 21.32825 MHz UNI 90-H +JP1-4 = Carts slots + +Games are dumped directly from the cartridge edge connector using the following adapter: + + ---------------------------------------------------------------------------- + Cartridge pinout + ---------------------------------------------------------------------------- + + +----------+ + (N.C.) |01 01| +5V + +5V |02 02| +5V + A18 |03 03| +5V + A14 |04 04| A17 + A8 |05 05| A13 + A11 |06 06| A9 + A10 |07 07| OE# + D7 |08 08| CE# +(front of D5 |09 09| D6 (rear of + cartridge) D3 |10 10| D4 cartridge) + D2 |11 11| GND + D0 |12 12| D1 + A1 |13 13| A0 + A3 |14 14| A2 + A5 |15 15| A4 + A7 |16 16| A6 + A15 |17 17| A12 + A19 |18 18| A16 + GND |19 19| (N.C.) + GND |20 20| (N.C.) + (KEY) |21------21| (KEY) + (N.C.) |22 22| (N.C.) + (N.C.) |23 23| (N.C.) + (N.C.) |24 24| (N.C.) + (N.C.) |25 25| (N.C.) + +----------+ + + ---------------------------------------------------------------------------- + 27C080 pinout + ---------------------------------------------------------------------------- + +----v----+ + A19 | 1 32| +5V + A16 | 2 31| A18 + A15 | 3 30| A17 + A12 | 4 29| A14 + A7 | 5 28| A13 + A6 | 6 27| A8 + A5 | 7 26| A9 + A4 | 8 25| A11 + A3 | 9 24| OE# + A2 |10 23| A10 + A1 |11 22| CE# + A0 |12 21| D7 + D0 |13 20| D6 + D1 |14 19| D5 + D2 |15 18| D4 + GND |16 17| D3 + +---------+ + + +Stephh notes for 8085 code: +0xe01d : game slot number (range 0-3) - sometimes inc'ed/dec'ed/zeroed, but also filled based on games slot status (code at 0x01e8) : +0x8009 and 0x800a : main timer (BCD, LSB first) + +0xe054 to 0xe057 : display timer (main, LSdigit first, stored in 4 lower bits) +0xe058 to 0xe05b : display timer (game slot 1, LSdigit first, stored in 4 upper bits) +0xe05c to 0xe05f : display timer (game slot 2, LSdigit first, stored in 4 lower bits) +0xe060 to 0xe063 : display timer (game slot 3, LSdigit first, stored in 4 upper bits) +0xe064 to 0xe067 : display timer (game slot 4, LSdigit first, stored in 4 lower bits) + +display timer (main) "filled" with code at 0x054e +display timer (game slot n) "filled" with code at 0x04e3 + +coin insertion routine at 0x0273 +coin 1 triggers code at 0x02d7 +coin 2 triggers code at 0x028f + +in each coin insertion routine, you need to insert n coins (based on DSW settings) then you are awarded u units of time (also based on DSW settings) +I can't tell ATM if units are seconds (even if values in tables seem very related to them) + +****************************************************************************/ + +#include "emu.h" +#include "cpu/i8085/i8085.h" +#include "machine/pcecommn.h" +#include "video/vdc.h" +#include "cpu/h6280/h6280.h" +#include "sound/c6280.h" +#include "machine/i8155.h" + + +class tourvision_state : public driver_device +{ +public: + tourvision_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + +}; + + +static INPUT_PORTS_START( tourvision ) + PORT_START( "JOY" ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) /* button I */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) /* button II */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) /* select */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) /* run */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + + PORT_START( "DSW1" ) + PORT_DIPNAME( 0x07, 0x07, "Coins needed 1" ) + PORT_DIPSETTING( 0x07, "1" ) + PORT_DIPSETTING( 0x06, "2" ) + PORT_DIPSETTING( 0x05, "3" ) + PORT_DIPSETTING( 0x04, "4" ) + PORT_DIPSETTING( 0x03, "5" ) + PORT_DIPSETTING( 0x02, "6" ) + PORT_DIPSETTING( 0x01, "7" ) + PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPNAME( 0x78, 0x78, "Time units 1" ) + PORT_DIPSETTING( 0x78, "900" ) + PORT_DIPSETTING( 0x70, "720" ) + PORT_DIPSETTING( 0x68, "600" ) + PORT_DIPSETTING( 0x60, "540" ) + PORT_DIPSETTING( 0x58, "480" ) + PORT_DIPSETTING( 0x50, "420" ) + PORT_DIPSETTING( 0x48, "360" ) + PORT_DIPSETTING( 0x40, "300" ) + PORT_DIPSETTING( 0x38, "270" ) + PORT_DIPSETTING( 0x30, "240" ) + PORT_DIPSETTING( 0x28, "210" ) + PORT_DIPSETTING( 0x20, "180" ) + PORT_DIPSETTING( 0x18, "150" ) + PORT_DIPSETTING( 0x10, "120" ) + PORT_DIPSETTING( 0x08, "90" ) + PORT_DIPSETTING( 0x00, "60" ) + PORT_DIPUNKNOWN( 0x80, 0x00 ) +// I can't tell what DSW1 bit 7 is really supposed to do, but it has an effect only when no "Free Play" and [0x8005] = [0x8006] = 0 (code at 0x0a58) : +// Since these conditions seem to be true only in "attract mode" when there is no time left, this bit could enable/disable sounds. + + PORT_START( "DSW2" ) + PORT_DIPNAME( 0x03, 0x03, "Coins needed 2" ) + PORT_DIPSETTING( 0x03, "1" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "4" ) + PORT_DIPNAME( 0x78, 0x78, "Time units 2" ) + PORT_DIPSETTING( 0x78, "1500" ) + PORT_DIPSETTING( 0x70, "1200" ) + PORT_DIPSETTING( 0x68, "1080" ) + PORT_DIPSETTING( 0x60, "960" ) + PORT_DIPSETTING( 0x58, "900" ) + PORT_DIPSETTING( 0x50, "840" ) + PORT_DIPSETTING( 0x48, "780" ) + PORT_DIPSETTING( 0x40, "720" ) + PORT_DIPSETTING( 0x38, "660" ) + PORT_DIPSETTING( 0x30, "600" ) + PORT_DIPSETTING( 0x28, "540" ) + PORT_DIPSETTING( 0x20, "480" ) + PORT_DIPSETTING( 0x18, "420" ) + PORT_DIPSETTING( 0x10, "360" ) + PORT_DIPSETTING( 0x08, "300" ) + PORT_DIPSETTING( 0x00, "240" ) + PORT_DIPUNKNOWN( 0x80, 0x00 ) +// SW2 bit 7 might be "free play" HIGH and when "Coins needed 2" is set to "1" (multiple comparisons with 0x83) in BIOS0 and BIOS1. +// In BIOS2, "Coins needed 2" can be set to anything (multiple comparisons with 0x80) instead. +// Of course, it can also be sort of "Test mode" or "Debug mode" ... + + PORT_START("SYSTEM") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) + PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_SPECIAL ) // games slot status in bits 3 to 7 +INPUT_PORTS_END + +static ADDRESS_MAP_START( pce_mem , AS_PROGRAM, 8) + AM_RANGE( 0x000000, 0x0FFFFF) AM_ROM + AM_RANGE( 0x1F0000, 0x1F1FFF) AM_RAM AM_MIRROR(0x6000) AM_BASE( &pce_user_ram ) + AM_RANGE( 0x1FE000, 0x1FE3FF) AM_READWRITE( vdc_0_r, vdc_0_w ) + AM_RANGE( 0x1FE400, 0x1FE7FF) AM_READWRITE( vce_r, vce_w ) + AM_RANGE( 0x1FE800, 0x1FEBFF) AM_DEVREADWRITE( "c6280", c6280_r, c6280_w ) + AM_RANGE( 0x1FEC00, 0x1FEFFF) AM_READWRITE( h6280_timer_r, h6280_timer_w ) + AM_RANGE( 0x1FF000, 0x1FF3FF) AM_READWRITE( pce_joystick_r, pce_joystick_w ) + AM_RANGE( 0x1FF400, 0x1FF7FF) AM_READWRITE( h6280_irq_status_r, h6280_irq_status_w ) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( pce_io , AS_IO, 8) + AM_RANGE( 0x00, 0x03) AM_READWRITE( vdc_0_r, vdc_0_w ) +ADDRESS_MAP_END + +static WRITE8_HANDLER( tourvision_8085_d000_w ) +{ + //logerror( "D000 (8085) write %02x\n", data ); +} + +static ADDRESS_MAP_START(tourvision_8085_map, AS_PROGRAM, 8) + AM_RANGE(0x0000, 0x7fff) AM_ROM + AM_RANGE(0x8000, 0x80ff) AM_DEVREADWRITE_MODERN("i8155", i8155_device, memory_r, memory_w) + AM_RANGE(0x8100, 0x8107) AM_DEVREADWRITE_MODERN("i8155", i8155_device, io_r, io_w) + AM_RANGE(0x9000, 0x9000) AM_READ_PORT("DSW1") + AM_RANGE(0xa000, 0xa000) AM_READ_PORT("DSW2") + AM_RANGE(0xb000, 0xb000) AM_READNOP // unknown (must NOT be == 0x03 ? code at 0x1154) + AM_RANGE(0xc000, 0xc000) AM_READ_PORT("SYSTEM") + AM_RANGE(0xd000, 0xd000) AM_WRITE( tourvision_8085_d000_w ) + AM_RANGE(0xe000, 0xe1ff) AM_RAM + AM_RANGE(0xf000, 0xf000) AM_READNOP // protection or internal counter ? there is sometimes some data in BIOS0 which is replaced by 0xff in BIOS1 +ADDRESS_MAP_END + +static WRITE8_DEVICE_HANDLER(tourvision_i8155_a_w) +{ + //logerror("i8155 Port A: %02X\n", data); +} + +static WRITE8_DEVICE_HANDLER(tourvision_i8155_b_w) +{ + // Selects game slot in bits 0 - 1 + //logerror("i8155 Port B: %02X\n", data); +} + +static WRITE8_DEVICE_HANDLER(tourvision_i8155_c_w) +{ + //logerror("i8155 Port C: %02X\n", data); +} + +static WRITE_LINE_DEVICE_HANDLER(tourvision_timer_out) +{ + cputag_set_input_line(device->machine(), "subcpu", I8085_RST55_LINE, state ? CLEAR_LINE : ASSERT_LINE ); + //logerror("Timer out %d\n", state); +} + +static I8155_INTERFACE(i8155_intf) +{ + DEVCB_NULL, + DEVCB_HANDLER(tourvision_i8155_a_w), + DEVCB_NULL, + DEVCB_HANDLER(tourvision_i8155_b_w), + DEVCB_NULL, + DEVCB_HANDLER(tourvision_i8155_c_w), + DEVCB_LINE(tourvision_timer_out) +}; + +static const c6280_interface c6280_config = +{ + "maincpu" +}; + +static MACHINE_CONFIG_START( tourvision, tourvision_state ) + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) + MCFG_CPU_PROGRAM_MAP(pce_mem) + MCFG_CPU_IO_MAP(pce_io) + MCFG_TIMER_ADD_SCANLINE("scantimer", pce_interrupt, "screen", 0, 1) + + MCFG_QUANTUM_TIME(attotime::from_hz(60)) + + MCFG_CPU_ADD("subcpu", I8085A, 18000000/3 /*?*/) + MCFG_CPU_PROGRAM_MAP(tourvision_8085_map) + + /* video hardware */ + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, VDC_WPF, 70, 70 + 512 + 32, VDC_LPF, 14, 14+242) + MCFG_SCREEN_UPDATE_STATIC( pce ) + + /* MCFG_GFXDECODE( pce_gfxdecodeinfo ) */ + MCFG_PALETTE_LENGTH(1024) + MCFG_PALETTE_INIT( vce ) + + MCFG_VIDEO_START( pce ) + + MCFG_I8155_ADD("i8155", 1000000 /*?*/, i8155_intf) + + MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker") + MCFG_SOUND_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) + MCFG_SOUND_CONFIG(c6280_config) + MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) + MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) + +MACHINE_CONFIG_END + +#define TOURVISION_BIOS \ + ROM_REGION( 0x8000, "subcpu", 0 ) \ + ROM_SYSTEM_BIOS( 0, "60", "U4-60" ) \ + ROMX_LOAD( "u4-60_am27c256.ic29", 0x0000, 0x8000, CRC(1fd27e22) SHA1(b103d365eac3fa447c2e9addddf6974b4403ed41), ROM_BIOS(1) ) \ + ROM_SYSTEM_BIOS( 1, "55", "U4-55" ) \ + ROMX_LOAD( "u4-55_am27c256.ic29", 0x0000, 0x8000, CRC(87cf66c1) SHA1(d6b42137be7a07a0e299c2d922328a6a9a2b7b8f), ROM_BIOS(2) ) \ + ROM_SYSTEM_BIOS( 2, "52", "U4-52" ) \ + ROMX_LOAD( "bios.29", 0x0000, 0x8000, CRC(ffd7b0fe) SHA1(d1804865c91e925a01b05cf441e8458a3db23f50), ROM_BIOS(3) ) + + +ROM_START(tourvis) + ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 ) + + TOURVISION_BIOS +ROM_END + + +/* +Aicom USA Pro Basketball Tourvision cart. + +Notes: + -4 identical 256KB parts, left unsplit for reference. + -Cart's A19 and A18 lines seems not connected to anything. + -CRC of split ROM ("1CAD4B7F") matches the common PC Engine Hu-Card ROM dump. +*/ + + +ROM_START(tvusapb) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_usaprobasketball.bin", 0x00000, 0x100000, CRC(f9a86270) SHA1(45f33fd80a0fa16a9271d258d8e827c3d5e8c98d) ) + + TOURVISION_BIOS +ROM_END + +/* +Hudson / Atlus Dungeon Explorer TourVision cart. + +Notes: + -Cart's A18 line (pin 32) seems not connected to anything. +*/ + +ROM_START(tvdunexp) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_dungeonexplorer.bin", 0x00000, 0x100000, CRC(6ecc87f4) SHA1(02eb3ae0b336dbcda12166b10c9f19486fb177e0) ) + + TOURVISION_BIOS +ROM_END + +/* +Sega Thunder Blade Tourvision cart. + +Notes: + -1st and 2nd halfs are identical, left unsplit for reference. + -Cart's A19 line seems not connected to anything. + -CRC of split ROM ("DDC3E809") matches the common PC Engine Hu-Card ROM dump. +*/ + +ROM_START(tvthbld) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_thunderblade.bin", 0x00000, 0x100000, CRC(0b93b85b) SHA1(b7d9fc2f46f95d305aa24326eded13abbe93738c) ) + + TOURVISION_BIOS +ROM_END + +/* +Taito Rastan Saga II Tourvision cart. + +Notes: + -Cart's A18 line seems not connected to anything. + +*/ + +ROM_START(tvrs2) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_rastansagaii.bin", 0x00000, 0x100000, CRC(cfe4c2f1) SHA1(1e39276b7d4bdb49421cc1102ad2fbba946127da) ) + + TOURVISION_BIOS +ROM_END + + +/* +Hudson Power League IV Tourvision cart. + +Notes: + -1st and 2nd halfs are identical, left unsplit for reference. + -Cart's A19 line seems not connected to anything. + -CRC of split ROM ("30cc3563") matches the common PC Engine Hu-Card ROM dump. +*/ + +ROM_START(tvpwlg4) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_powerleague4.bin", 0x00000, 0x100000, CRC(0a6e65f8) SHA1(88adf3f5b9a6d139f216bdb73abf8606bb8e5b16) ) + + TOURVISION_BIOS +ROM_END + + +/* +Taito Scene Crime Investigation (SCI) Tourvision cart. + +Notes: + -1st and 2nd halfs are identical, left unsplit for reference. + -Cart's A19 line seems not connected to anything. + -CRC of split ROM ("09a0bfcc") matches the common English language PC Engine Hu-Card ROM dump. + +*/ + +ROM_START(tvsci) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD( "tourv_sci.bin", 0x00000, 0x100000, CRC(4baac6d8) SHA1(4c2431d9553e2bd952cf816e78fc1e3387376ef4) ) + + TOURVISION_BIOS +ROM_END + +static DRIVER_INIT(tourvision) +{ + DRIVER_INIT_CALL(pce); +} + +GAME( 19??, tourvis, 0, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision)", "Tourvision PCE bootleg", GAME_IS_BIOS_ROOT | GAME_NOT_WORKING ) +GAME( 1989, tvusapb, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Aicom", "USA Pro Basketball (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1989, tvdunexp, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Hudson / Atlus", "Dungeon Explorer (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1990, tvthbld, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Sega / NEC Avenue", "Thunder Blade (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1990, tvrs2, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Taito", "Rastan Saga II (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1991, tvpwlg4, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Hudson", "Power League IV (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1991, tvsci, tourvis, tourvision, tourvision, tourvision, ROT0, "bootleg (Tourvision) / Taito", "Special Criminal Investigation (Tourvision PCE bootleg)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/toypop.c mame-0.145/src/mame/drivers/toypop.c --- mame-0.144/src/mame/drivers/toypop.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/toypop.c 2012-02-06 21:30:41.000000000 +0000 @@ -54,30 +54,36 @@ static READ8_HANDLER( toypop_main_interrupt_enable_r ) { - cpu_interrupt_enable(space->machine().device("maincpu"), 1); + toypop_state *state = space->machine().driver_data(); + + state->m_main_irq_mask = 1; return 0; } static WRITE8_HANDLER( toypop_main_interrupt_enable_w ) { - cpu_interrupt_enable(space->machine().device("maincpu"), 1); - cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); + toypop_state *state = space->machine().driver_data(); + state->m_main_irq_mask = 1; } static WRITE8_HANDLER( toypop_main_interrupt_disable_w ) { - cpu_interrupt_enable(space->machine().device("maincpu"), 0); + toypop_state *state = space->machine().driver_data(); + state->m_main_irq_mask = 0; +// cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); } static WRITE8_HANDLER( toypop_sound_interrupt_enable_acknowledge_w ) { - cpu_interrupt_enable(space->machine().device("audiocpu"), 1); - cputag_set_input_line(space->machine(), "audiocpu", 0, CLEAR_LINE); + toypop_state *state = space->machine().driver_data(); + state->m_sound_irq_mask = 1; +// cputag_set_input_line(space->machine(), "audiocpu", 0, CLEAR_LINE); } static WRITE8_HANDLER( toypop_sound_interrupt_disable_w ) { - cpu_interrupt_enable(space->machine().device("audiocpu"), 0); + toypop_state *state = space->machine().driver_data(); + state->m_sound_irq_mask = 0; } static TIMER_CALLBACK( namcoio_run ) @@ -100,14 +106,15 @@ } } -static INTERRUPT_GEN( toypop_main_interrupt ) +static INTERRUPT_GEN( toypop_main_vblank_irq ) { + toypop_state *state = device->machine().driver_data(); device_t *namcoio_0 = device->machine().device("58xx"); device_t *namcoio_1 = device->machine().device("56xx_1"); device_t *namcoio_2 = device->machine().device("56xx_2"); - irq0_line_assert(device); // this also checks if irq is enabled - IMPORTANT! - // so don't replace with cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); + if(state->m_main_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); if (!namcoio_read_reset_line(namcoio_0)) /* give the cpu a tiny bit of time to write the command before processing it */ device->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(namcoio_run)); @@ -120,6 +127,14 @@ } +static INTERRUPT_GEN( toypop_sound_timer_irq ) +{ + toypop_state *state = device->machine().driver_data(); + + if(state->m_sound_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static WRITE8_HANDLER( toypop_sound_clear_w ) { cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_RESET, CLEAR_LINE); @@ -140,21 +155,17 @@ cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, ASSERT_LINE); } -static TIMER_CALLBACK( disable_interrupts ) +static MACHINE_RESET( toypop ) { toypop_state *state = machine.driver_data(); - cpu_interrupt_enable(machine.device("maincpu"), 0); + + state->m_main_irq_mask = 0; cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); - cpu_interrupt_enable(machine.device("audiocpu"), 0); + + state->m_sound_irq_mask = 0; cputag_set_input_line(machine, "audiocpu", 0, CLEAR_LINE); - state->m_interrupt_enable_68k = 0; -} -static MACHINE_RESET( toypop ) -{ - /* we must do this on a timer in order to have it take effect */ - /* otherwise, the reset process will override our changes */ - machine.scheduler().synchronize(FUNC(disable_interrupts)); + state->m_interrupt_enable_68k = 0; } static INTERRUPT_GEN( toypop_m68000_interrupt ) @@ -548,11 +559,11 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 1536000) /* 1.536 MHz (measured on Libble Rabble board) */ MCFG_CPU_PROGRAM_MAP(liblrabl_map) - MCFG_CPU_VBLANK_INT("screen", toypop_main_interrupt) + MCFG_CPU_VBLANK_INT("screen", toypop_main_vblank_irq) MCFG_CPU_ADD("audiocpu", M6809, 1536000) MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", toypop_sound_timer_irq) MCFG_CPU_ADD("sub", M68000, 6144000) /* 6.144 MHz (measured on Libble Rabble board) */ MCFG_CPU_PROGRAM_MAP(m68k_map) @@ -570,10 +581,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.606060) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(toypop) + MCFG_SCREEN_UPDATE_STATIC(toypop) MCFG_GFXDECODE(toypop) MCFG_PALETTE_LENGTH(128*4+64*4+16*2) diff -Nru mame-0.144/src/mame/drivers/tp84.c mame-0.145/src/mame/drivers/tp84.c --- mame-0.144/src/mame/drivers/tp84.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tp84.c 2012-02-06 21:30:40.000000000 +0000 @@ -169,10 +169,18 @@ ADDRESS_MAP_END +static WRITE8_HANDLER( sub_irq_mask_w ) +{ + tp84_state *state = space->machine().driver_data(); + + state->m_sub_irq_mask = data & 1; +} + + static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8 ) // AM_RANGE(0x0000, 0x0000) AM_RAM /* Watch dog ?*/ AM_RANGE(0x2000, 0x2000) AM_READ(tp84_scanline_r) /* beam position */ - AM_RANGE(0x4000, 0x4000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x4000, 0x4000) AM_WRITE(sub_irq_mask_w) AM_RANGE(0x6000, 0x679f) AM_RAM AM_RANGE(0x67a0, 0x67ff) AM_RAM_WRITE(tp84_spriteram_w) AM_BASE_MEMBER(tp84_state, m_spriteram) AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("share1") @@ -205,29 +213,29 @@ KONAMI8_COCKTAIL_B12_UNK PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) /* "Invalid" = both coin slots disabled */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, "10000 and every 50000" ) PORT_DIPSETTING( 0x10, "20000 and every 60000" ) PORT_DIPSETTING( 0x08, "30000 and every 70000" ) PORT_DIPSETTING( 0x00, "40000 and every 80000" ) - PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // JP default + PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) // US default PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -236,7 +244,7 @@ PORT_INCLUDE( tp84 ) PORT_MODIFY("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) @@ -273,6 +281,13 @@ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 64*4*8, 16*8 ) GFXDECODE_END +static INTERRUPT_GEN( sub_vblank_irq ) +{ + tp84_state *state = device->machine().driver_data(); + + if(state->m_sub_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} static MACHINE_CONFIG_START( tp84, tp84_state ) @@ -284,7 +299,7 @@ MCFG_CPU_ADD("sub", M6809, XTAL_18_432MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(cpu2_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", sub_vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,XTAL_14_31818MHz/4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(audio_map) @@ -298,10 +313,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tp84) + MCFG_SCREEN_UPDATE_STATIC(tp84) MCFG_GFXDECODE(tp84) MCFG_PALETTE_LENGTH(4096) @@ -312,13 +326,13 @@ /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("sn1", SN76489A, XTAL_14_31818MHz/8) /* verified on pcb */ + MCFG_SOUND_ADD("sn1", Y2404, XTAL_14_31818MHz/8) /* verified on pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter1", 0.75) - MCFG_SOUND_ADD("sn2", SN76489A, XTAL_14_31818MHz/8) /* verified on pcb */ + MCFG_SOUND_ADD("sn2", Y2404, XTAL_14_31818MHz/8) /* verified on pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter2", 0.75) - MCFG_SOUND_ADD("sn3", SN76489A, XTAL_14_31818MHz/8) /* verified on pcb */ + MCFG_SOUND_ADD("sn3", Y2404, XTAL_14_31818MHz/8) /* verified on pcb */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "filter3", 0.75) MCFG_SOUND_ADD("filter1", FILTER_RC, 0) diff -Nru mame-0.144/src/mame/drivers/trackfld.c mame-0.145/src/mame/drivers/trackfld.c --- mame-0.144/src/mame/drivers/trackfld.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/trackfld.c 2012-02-06 21:30:37.000000000 +0000 @@ -191,6 +191,7 @@ #include "includes/trackfld.h" #include "includes/konamipt.h" #include "machine/nvram.h" +#include "includes/yiear.h" #define MASTER_CLOCK XTAL_18_432MHz #define SOUND_CLOCK XTAL_14_31818MHz @@ -204,22 +205,23 @@ static WRITE8_HANDLER( questions_bank_w ) { - if (!(data & 0x01)) - memory_set_bank(space->machine(), "bank1", 0); - else if (!(data & 0x02)) - memory_set_bank(space->machine(), "bank1", 1); - else if (!(data & 0x04)) - memory_set_bank(space->machine(), "bank1", 2); - else if (!(data & 0x08)) - memory_set_bank(space->machine(), "bank1", 3); - else if (!(data & 0x10)) - memory_set_bank(space->machine(), "bank1", 4); - else if (!(data & 0x20)) - memory_set_bank(space->machine(), "bank1", 5); - else if (!(data & 0x40)) - memory_set_bank(space->machine(), "bank1", 6); - else if (!(data & 0x80)) - memory_set_bank(space->machine(), "bank1", 7); + int i; + + for(i=0;i<8;i++) + { + if((data & 1 << i) == 0) // check first bit active low, change ROM bank according to the correlated bit + { + memory_set_bank(space->machine(), "bank1", i); + return; + } + } +} + +static WRITE8_HANDLER( irq_mask_w ) +{ + trackfld_state *state = space->machine().driver_data(); + + state->m_irq_mask = data & 1; } static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) @@ -230,7 +232,7 @@ AM_RANGE(0x1083, 0x1084) AM_MIRROR(0x0078) AM_WRITE(coin_w) /* 24, 23 */ AM_RANGE(0x1085, 0x1085) AM_MIRROR(0x0078) AM_WRITENOP /* CN3.2 */ AM_RANGE(0x1086, 0x1086) AM_MIRROR(0x0078) AM_WRITENOP /* CN3.4 */ - AM_RANGE(0x1087, 0x1087) AM_MIRROR(0x0078) AM_WRITE(interrupt_enable_w) /* INT */ + AM_RANGE(0x1087, 0x1087) AM_MIRROR(0x0078) AM_WRITE(irq_mask_w) /* INT */ AM_RANGE(0x1100, 0x1100) AM_MIRROR(0x007f) AM_WRITE(soundlatch_w) /* 32 */ AM_RANGE(0x1200, 0x1200) AM_MIRROR(0x007f) AM_READ_PORT("DSW2") AM_RANGE(0x1280, 0x1280) AM_MIRROR(0x007c) AM_READ_PORT("SYSTEM") @@ -250,16 +252,27 @@ AM_RANGE(0x6000, 0xffff) AM_ROM ADDRESS_MAP_END +static WRITE8_HANDLER( yieartf_nmi_mask_w ) +{ + trackfld_state *state = space->machine().driver_data(); + + state->m_yieartf_nmi_mask = data & 1; +} + static ADDRESS_MAP_START( yieartf_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x0000) AM_DEVREAD("vlm", yiear_speech_r) AM_WRITE(konami_SN76496_latch_w) + AM_RANGE(0x0001, 0x0001) AM_DEVWRITE("snsnd", konami_SN76496_w) + AM_RANGE(0x0002, 0x0002) AM_DEVWRITE("vlm", yiear_VLM5030_control_w) + AM_RANGE(0x0003, 0x0003) AM_DEVWRITE("vlm", vlm5030_data_w) AM_RANGE(0x1000, 0x1000) AM_MIRROR(0x007f) AM_WRITE(watchdog_reset_w) /* AFE */ AM_RANGE(0x1080, 0x1080) AM_MIRROR(0x0078) AM_WRITE(trackfld_flipscreen_w) /* FLIP */ AM_RANGE(0x1081, 0x1081) AM_MIRROR(0x0078) AM_WRITE(konami_sh_irqtrigger_w) /* 26 */ /* cause interrupt on audio CPU */ - AM_RANGE(0x1082, 0x1082) AM_MIRROR(0x0078) AM_WRITENOP /* 25 */ + AM_RANGE(0x1082, 0x1082) AM_MIRROR(0x0078) AM_WRITE(yieartf_nmi_mask_w) /* 25 */ AM_RANGE(0x1083, 0x1084) AM_MIRROR(0x0078) AM_WRITE(coin_w) /* 24, 23 */ AM_RANGE(0x1085, 0x1085) AM_MIRROR(0x0078) AM_WRITENOP /* CN3.2 */ AM_RANGE(0x1086, 0x1086) AM_MIRROR(0x0078) AM_WRITENOP /* CN3.4 */ - AM_RANGE(0x1087, 0x1087) AM_MIRROR(0x0078) AM_WRITE(interrupt_enable_w) /* INT */ + AM_RANGE(0x1087, 0x1087) AM_MIRROR(0x0078) AM_WRITE(irq_mask_w) /* INT */ // AM_RANGE(0x1100, 0x1100) AM_MIRROR(0x007f) AM_WRITE(soundlatch_w) /* 32 */ AM_RANGE(0x1200, 0x1200) AM_MIRROR(0x007f) AM_READ_PORT("DSW2") AM_RANGE(0x1280, 0x1280) AM_MIRROR(0x007c) AM_READ_PORT("SYSTEM") @@ -286,7 +299,7 @@ AM_RANGE(0x9080, 0x9080) AM_WRITE(trackfld_flipscreen_w) AM_RANGE(0x9081, 0x9081) AM_WRITE(konami_sh_irqtrigger_w) /* cause interrupt on audio CPU */ AM_RANGE(0x9083, 0x9084) AM_WRITE(coin_w) - AM_RANGE(0x9087, 0x9087) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x9087, 0x9087) AM_WRITE(irq_mask_w) AM_RANGE(0x9100, 0x9100) AM_WRITE(soundlatch_w) AM_RANGE(0x9200, 0x9200) AM_READ_PORT("DSW2") AM_RANGE(0x9280, 0x9280) AM_READ_PORT("SYSTEM") @@ -317,9 +330,9 @@ static ADDRESS_MAP_START( mastkin_map, AS_PROGRAM, 8 ) AM_RANGE(0x1000, 0x1000) AM_WRITE(watchdog_reset_w) AM_RANGE(0x10b0, 0x10b0) AM_WRITE(trackfld_flipscreen_w) - AM_RANGE(0x10b1, 0x10b1) AM_WRITE(konami_sh_irqtrigger_w) - AM_RANGE(0x1083, 0x1084) AM_WRITE(coin_w) - AM_RANGE(0x1087, 0x1087) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x10b1, 0x10b1) AM_READNOP AM_WRITE(konami_sh_irqtrigger_w) + AM_RANGE(0x10b3, 0x10b4) AM_WRITE(coin_w) // actually not used + AM_RANGE(0x10b7, 0x10b7) AM_READNOP AM_WRITE(irq_mask_w) AM_RANGE(0x1100, 0x1100) AM_WRITE(soundlatch_w) AM_RANGE(0x1200, 0x1200) AM_READ_PORT("DSW2") AM_RANGE(0x1280, 0x1280) AM_READ_PORT("SYSTEM") @@ -332,6 +345,7 @@ AM_RANGE(0x1c00, 0x1c3f) AM_RAM AM_BASE_SIZE_MEMBER(trackfld_state, m_spriteram, m_spriteram_size) AM_RANGE(0x1c40, 0x1c5f) AM_RAM AM_BASE_MEMBER(trackfld_state, m_scroll2) AM_RANGE(0x1c60, 0x1fff) AM_RAM + AM_RANGE(0x2000, 0x27ff) AM_RAM // initialized at POST AM_RANGE(0x2800, 0x2bff) AM_RAM AM_RANGE(0x2c00, 0x2fff) AM_RAM AM_SHARE("nvram") AM_RANGE(0x3000, 0x37ff) AM_RAM_WRITE(trackfld_videoram_w) AM_BASE_MEMBER(trackfld_state, m_videoram) @@ -345,7 +359,7 @@ AM_RANGE(0x1080, 0x1080) AM_WRITE(trackfld_flipscreen_w) AM_RANGE(0x1081, 0x1081) AM_WRITE(konami_sh_irqtrigger_w) /* cause interrupt on audio CPU */ AM_RANGE(0x1083, 0x1084) AM_WRITE(coin_w) - AM_RANGE(0x1087, 0x1087) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x1087, 0x1087) AM_WRITE(irq_mask_w) AM_RANGE(0x1100, 0x1100) AM_WRITE(soundlatch_w) AM_RANGE(0x1200, 0x1200) AM_READ_PORT("DSW2") AM_RANGE(0x1280, 0x1280) AM_READ_PORT("SYSTEM") @@ -367,13 +381,20 @@ AM_RANGE(0xe000, 0xffff) AM_ROM ADDRESS_MAP_END + +READ8_DEVICE_HANDLER( trackfld_SN76496_r ) +{ + konami_SN76496_w(device, 0, 0); + return 0xff; // ? +} + static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x1c00) AM_RAM AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x1fff) AM_READ(soundlatch_r) AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x1fff) AM_READ(trackfld_sh_timer_r) AM_RANGE(0xa000, 0xa000) AM_MIRROR(0x1fff) AM_WRITE(konami_SN76496_latch_w) - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_DEVWRITE("snsnd", konami_SN76496_w) + AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_DEVREADWRITE("snsnd", trackfld_SN76496_r, konami_SN76496_w) AM_RANGE(0xe000, 0xe000) AM_MIRROR(0x1ff8) AM_DEVWRITE("dac", dac_w) AM_RANGE(0xe001, 0xe001) AM_MIRROR(0x1ff8) AM_NOP /* watch dog ?; reaktor reads here */ AM_RANGE(0xe002, 0xe002) AM_MIRROR(0x1ff8) AM_DEVREAD("vlm", trackfld_speech_r) @@ -387,7 +408,7 @@ AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x1fff) AM_READ(soundlatch_r) AM_RANGE(0x8000, 0x8000) AM_MIRROR(0x1fff) AM_READ(trackfld_sh_timer_r) AM_RANGE(0xa000, 0xa000) AM_MIRROR(0x1fff) AM_WRITE(konami_SN76496_latch_w) - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_DEVWRITE("snsnd", konami_SN76496_w) + AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_DEVREADWRITE("snsnd", trackfld_SN76496_r, konami_SN76496_w) AM_RANGE(0xe000, 0xe000) AM_MIRROR(0x1ff8) AM_DEVWRITE("dac", dac_w) AM_RANGE(0xe001, 0xe001) AM_MIRROR(0x1ff8) AM_NOP /* watch dog ?; reaktor reads here */ AM_RANGE(0xe002, 0xe002) AM_MIRROR(0x1ff8) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_busy_r) @@ -427,64 +448,31 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("DSW1") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 4C_3C ) ) - PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x09, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) ) - PORT_DIPSETTING( 0x20, DEF_STR( 4C_1C ) ) - PORT_DIPSETTING( 0x50, DEF_STR( 3C_1C ) ) - PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x40, DEF_STR( 3C_2C ) ) - PORT_DIPSETTING( 0x10, DEF_STR( 4C_3C ) ) - PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x30, DEF_STR( 3C_4C ) ) - PORT_DIPSETTING( 0x70, DEF_STR( 2C_3C ) ) - PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x60, DEF_STR( 2C_5C ) ) - PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0xc0, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0xb0, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0xa0, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x90, DEF_STR( 1C_7C ) ) - PORT_DIPSETTING( 0x00, "No Coin B" ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) /* "No Coin B" = coins produce sound, but no effect on coin counter */ PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x01, "1" ) PORT_DIPSETTING( 0x00, "2" ) - PORT_DIPNAME( 0x02, 0x00, "After Last Event" ) + PORT_DIPNAME( 0x02, 0x00, "After Last Event" ) PORT_DIPLOCATION("SW2:2") PORT_DIPSETTING( 0x02, "Game Over" ) PORT_DIPSETTING( 0x00, "Game Continues" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, DEF_STR( None ) ) PORT_DIPSETTING( 0x00, "100000" ) - PORT_DIPNAME( 0x10, 0x10, "World Records" ) + PORT_DIPNAME( 0x10, 0x10, "World Records" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x10, "Don't Erase" ) PORT_DIPSETTING( 0x00, "Erase on Reset" ) - PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Difficult ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -513,10 +501,10 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_MODIFY("DSW2") - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Allow_Continue ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:2") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Language ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( English ) ) PORT_DIPSETTING( 0x04, DEF_STR( Italian ) ) INPUT_PORTS_END @@ -550,18 +538,18 @@ PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x00, "Fast" ) PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Difficulty ) ) // "Damage" - PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) ) // 0x03 - PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) // 0x07 - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // 0x0b - PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) // 0x0f + PORT_DIPSETTING( 0x0c, DEF_STR( Easy ) ) // 0x03 + PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) // 0x07 + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // 0x0b + PORT_DIPSETTING( 0x00, DEF_STR( Very_Hard ) ) // 0x0f PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x10, "4" ) PORT_DIPSETTING( 0x00, "5" ) PORT_DIPNAME( 0x20, 0x00, "Internal speed" ) // Check code at 0x8576 - PORT_DIPSETTING( 0x20, "Slow" ) // 0x0c00 - PORT_DIPSETTING( 0x00, "Fast" ) // 0x0a00 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // Stored at 0x284e but not read back - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) // Cocktail Mode, not used + PORT_DIPSETTING( 0x20, "Slow" ) // 0x0c00 + PORT_DIPSETTING( 0x00, "Fast" ) // 0x0a00 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // Stored at 0x284e but not read back + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) // Cocktail Mode, not used PORT_START("DSW2") PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_B ) ) @@ -792,41 +780,42 @@ PORT_START("IN1") KONAMI8_COCKTAIL_B12_UNK + PORT_START("DSW1") + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) + /* "Invalid" = both coin slots disabled */ + PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "30000 80000" ) PORT_DIPSETTING( 0x00, "40000 90000" ) - PORT_DIPNAME( 0x30, 0x10, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x30, 0x10, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("DSW1") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid") - /* "Invalid" = both coin slots disabled */ + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -882,12 +871,29 @@ state->m_old_gfx_bank = 0; } +static INTERRUPT_GEN( vblank_irq ) +{ + trackfld_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + +static INTERRUPT_GEN( vblank_nmi ) +{ + trackfld_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + static MACHINE_CONFIG_START( trackfld, trackfld_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/6/2) /* a guess for now */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80, SOUND_CLOCK/4) MCFG_CPU_PROGRAM_MAP(sound_map) @@ -900,10 +906,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(trackfld) + MCFG_SCREEN_UPDATE_STATIC(trackfld) MCFG_GFXDECODE(trackfld) MCFG_PALETTE_LENGTH(16*16+16*16) @@ -927,12 +932,21 @@ MACHINE_CONFIG_END +static INTERRUPT_GEN( yieartf_timer_irq ) +{ + trackfld_state *state = device->machine().driver_data(); + + if (state->m_yieartf_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + static MACHINE_CONFIG_START( yieartf, trackfld_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, MASTER_CLOCK/6/2) /* a guess for now */ MCFG_CPU_PROGRAM_MAP(yieartf_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) + MCFG_CPU_PERIODIC_INT(yieartf_timer_irq,480) // z80 isn't used // MCFG_CPU_ADD("audiocpu", Z80, SOUND_CLOCK/4) @@ -946,10 +960,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(trackfld) + MCFG_SCREEN_UPDATE_STATIC(trackfld) MCFG_GFXDECODE(trackfld) MCFG_PALETTE_LENGTH(16*16+16*16) @@ -965,7 +978,7 @@ MCFG_SOUND_ADD("dac", DAC, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) - MCFG_SOUND_ADD("snsnd", SN76496, SOUND_CLOCK/8) + MCFG_SOUND_ADD("snsnd", SN76496, MASTER_CLOCK/6/2) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_SOUND_ADD("vlm", VLM5030, VLM_CLOCK) @@ -1006,7 +1019,7 @@ // right cpu? MCFG_CPU_REPLACE("maincpu",M6800,2048000) /* 1.400 MHz ??? */ MCFG_CPU_PROGRAM_MAP(wizzquiz_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_nmi) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( reaktor, trackfld ) @@ -1015,7 +1028,7 @@ MCFG_CPU_REPLACE("maincpu",Z80,MASTER_CLOCK/6) MCFG_CPU_PROGRAM_MAP(reaktor_map) MCFG_CPU_IO_MAP(reaktor_io_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MACHINE_CONFIG_END @@ -1485,9 +1498,9 @@ GAME( 1983, hyprolym, trackfld, trackfld, trackfld, trackfld, ROT0, "Konami", "Hyper Olympic", GAME_SUPPORTS_SAVE ) GAME( 1983, hyprolymb, trackfld, hyprolyb, trackfld, trackfld, ROT0, "bootleg", "Hyper Olympic (bootleg)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) GAME( 1996, atlantol, trackfld, atlantol, atlantol, atlantol, ROT0, "bootleg", "Atlant Olimpic", GAME_SUPPORTS_SAVE ) -GAME( 1988, mastkin, 0, mastkin, mastkin, mastkin, ROT0, "Du Tech", "The Masters of Kin", GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) GAME( 1982, trackfldnz,trackfld, trackfld, trackfld, trackfld, ROT0, "bootleg? (Goldberg Enterprizes Inc.)", "Track & Field (NZ bootleg?)", GAME_NOT_WORKING) +GAME( 1988, mastkin, 0, mastkin, mastkin, mastkin, ROT0, "Du Tech", "The Masters of Kin", GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE ) GAME( 1985, wizzquiz, 0, wizzquiz, wizzquiz, wizzquiz, ROT0, "Zilec-Zenitone (Konami license)", "Wizz Quiz (Konami version)", GAME_SUPPORTS_SAVE ) GAME( 1985, wizzquiza, wizzquiz, wizzquiz, wizzquiz, wizzquiz, ROT0, "Zilec-Zenitone", "Wizz Quiz (version 4)", GAME_SUPPORTS_SAVE ) GAME( 1987, reaktor, 0, reaktor, reaktor, 0, ROT90, "Zilec", "Reaktor (Track & Field conversion)", GAME_SUPPORTS_SAVE ) -GAME( 1985, yieartf, yiear, yieartf, yieartf, 0, ROT0, "Konami", "Yie Ar Kung-Fu (GX361 conversion)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) // the conversion looks of bootleg quality, but the code is clearly a very different revision to either original hardware set... +GAME( 1985, yieartf, yiear, yieartf, yieartf, 0, ROT0, "Konami", "Yie Ar Kung-Fu (GX361 conversion)", GAME_SUPPORTS_SAVE ) // the conversion looks of bootleg quality, but the code is clearly a very different revision to either original hardware set... diff -Nru mame-0.144/src/mame/drivers/travrusa.c mame-0.145/src/mame/drivers/travrusa.c --- mame-0.144/src/mame/drivers/travrusa.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/travrusa.c 2012-02-06 21:30:35.000000000 +0000 @@ -312,10 +312,9 @@ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1790) /* accurate frequency, measured on a Moon Patrol board, is 56.75Hz. */) /* the Lode Runner manual (similar but different hardware) */ /* talks about 55Hz and 1790ms vblank duration. */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(travrusa) + MCFG_SCREEN_UPDATE_STATIC(travrusa) MCFG_GFXDECODE(travrusa) diff -Nru mame-0.144/src/mame/drivers/triforce.c mame-0.145/src/mame/drivers/triforce.c --- mame-0.144/src/mame/drivers/triforce.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/triforce.c 2012-02-06 21:30:39.000000000 +0000 @@ -418,7 +418,7 @@ } -static SCREEN_UPDATE(triforce) +static SCREEN_UPDATE_RGB32(triforce) { return 0; } @@ -437,10 +437,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(triforce) + MCFG_SCREEN_UPDATE_STATIC(triforce) MCFG_PALETTE_LENGTH(65536) @@ -448,7 +447,7 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( triforcegd, triforce_base ) - MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", "gdrom", "picreturn", NULL, "maincpu", NULL) + MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "picreturn", NULL, "maincpu", NULL) MACHINE_CONFIG_END #define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \ @@ -671,14 +670,14 @@ -GAME( 2002, triforce, 0, triforcegd, triforce, 0, ROT0, "Sega", "Triforce Bios", GAME_NO_SOUND|GAME_NOT_WORKING|GAME_IS_BIOS_ROOT ) -GAME( 2002, vs2002j, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 2002 (GDT-0001)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2002, vs2002ex, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 2002 (GDT-0002)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2003, avalons, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon - The Wizard Master - Server (GDT-0005C) (V4.001)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2003, gekpurya, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C) (GDT-0008C)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2004, avalon13, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon 1.3 - Chaotic Sabbat - Client (GDT-0010C) (V4.000)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2004, tfupdate, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Triforce DIMM Updater (GDT-0011)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2004, vs4j, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 (Japan) (GDT-0013E)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2004, vs4, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 (Export) (GDT-0015)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2004, avalon20, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon 2.0 - Eutaxy and Commandment - Client (GDT-0017B) (V3.001)", GAME_NO_SOUND|GAME_NOT_WORKING ) -GAME( 2006, vs42006, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev D) (GDT-0020D)", GAME_NO_SOUND|GAME_NOT_WORKING ) +GAME( 2002, triforce, 0, triforcegd, triforce, 0, ROT0, "Sega", "Triforce Bios", GAME_IS_SKELETON|GAME_IS_BIOS_ROOT ) +GAME( 2002, vs2002j, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 2002 (GDT-0001)", GAME_IS_SKELETON ) +GAME( 2002, vs2002ex, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 2002 (GDT-0002)", GAME_IS_SKELETON ) +GAME( 2003, avalons, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon - The Wizard Master - Server (GDT-0005C) (V4.001)", GAME_IS_SKELETON ) +GAME( 2003, gekpurya, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Gekitou Pro Yakyuu Mizushima Shinji All Stars vs. Pro Yakyuu (Rev C) (GDT-0008C)", GAME_IS_SKELETON ) +GAME( 2004, avalon13, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon 1.3 - Chaotic Sabbat - Client (GDT-0010C) (V4.000)", GAME_IS_SKELETON ) +GAME( 2004, tfupdate, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Triforce DIMM Updater (GDT-0011)", GAME_IS_SKELETON ) +GAME( 2004, vs4j, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 (Japan) (GDT-0013E)", GAME_IS_SKELETON ) +GAME( 2004, vs4, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 (Export) (GDT-0015)", GAME_IS_SKELETON ) +GAME( 2004, avalon20, triforce, triforcegd, triforce, 0, ROT0, "Sega", "The Key Of Avalon 2.0 - Eutaxy and Commandment - Client (GDT-0017B) (V3.001)", GAME_IS_SKELETON ) +GAME( 2006, vs42006, triforce, triforcegd, triforce, 0, ROT0, "Sega", "Virtua Striker 4 Ver.2006 (Japan) (Rev D) (GDT-0020D)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/triplhnt.c mame-0.145/src/mame/drivers/triplhnt.c --- mame-0.144/src/mame/drivers/triplhnt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/triplhnt.c 2012-02-06 21:30:33.000000000 +0000 @@ -322,10 +322,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 262) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 239) - MCFG_SCREEN_UPDATE(triplhnt) + MCFG_SCREEN_UPDATE_STATIC(triplhnt) MCFG_GFXDECODE(triplhnt) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/truco.c mame-0.145/src/mame/drivers/truco.c --- mame-0.144/src/mame/drivers/truco.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/truco.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,10 +1,13 @@ -/* +/****************************************************************************************************** - Truco-Tron - (c) 198? Playtronic SRL, Argentina + Truco-Tron - (c) 198? Playtronic SRL, Argentina. Written by Ernesto Corvi + Additional work by Roberto Fresca. + Notes: + - The board uses a battery backed ram for protection, mapped at $7c00-$7fff. - If the battery backup data is corrupt, it comes up with some sort of code entry screen. As far as I can tell, you can't do anything with it. @@ -13,40 +16,308 @@ - System clock is 12 Mhz. The CPU clock is unknown. - The Alternate Gfx mode is funky. Not only it has different bitmaps, but also the strings with the game options are truncated. Title is also truncated. -*/ + + +******************************************************************************************************* + + Mini-board (6"x 7") silkscreened 8901 REV.C + JAMMA connector. + + 1x Xtal 12 MHz. + 1x 3.6V. Lithium Battery (QTC85). + + 2 rows of 6 holes for jumpers (JP1, JP2). + No DIP switches banks. + + All IC's are scratched to avoid the identification. + + + PCB layout: + .--------------------------------------------------. + |S T .---. .---. .---. .-. .-. .---. .-. | + |E R | | | U | | U | |U| |U| | U | |U| | + |R U | | | 2 | | 3 | |1| |5| | 1 | |1| | + |I C | U | | | | | |5| | | | 0 | |4| | + |E O | 1 | | | | | '-' '-' | | '-' | + | | | '---' '---' .-. '---' .-. | + |0 T | | |U| .-------. |U| | + |0 R | | |1| |BATTERY| |1| | + |0 O | | |2| | - + | |9| | + |0 N '---' '-' '-------' '-' | + | .-. .-, .---. .-. .---. .-. .-. .-. | + | |U| |U| | | |U| | | |U| |U| |U| | + | |1| |1| | | |1| | | |6| |7| |1| | + | |7| |8| | U | |6| | U | | | | | |3| P| + | '-' '-' | 4 | '-' | 9 | '-' '-' | | L| + | .----. | | | | .-. .-. '-' A| + | |Xtal| | | | | |U| |U| Y| + | '----' | | | | |1| |8| T| + | .-. | | | | |1| | | R| + | |U| '---' '---' '-' '-' O| + | |2|.---. N| + | |0||pot| I| + | '-''---' JAMMA C| + '----+++++++++++++++++++++++++++++-----------------' + ||||||||||||||||||||||||||||| + '---------------------------' + + + IC's Reverse Engineering.... + + MARKED PINS ID TYPE DETAILS + + - U1 : 40-pin IC YES CPU MOTOROLA M6809 + - U2 : 28-pin IC YES ROM U2 M27128A + - U3 : 28-pin IC YES ROM U3 M27128A + - U4 : 40-pin IC YES PIA ST EF6821P + - U5 : 16-pin IC NO + - U6 : 16-pin IC NO + - U7 : 16-pin IC NO + - U8 : 16-pin IC NO + - U9 : 40-pin IC YES CRTC HD6845 / UM6845 + - U10: 28-pin IC YES RAM ???? (Battery NVR) + - U11: 14-pin IC NO + - U12: 14-pin IC NO + - U13: 20-pin IC NO + - U14: 20-pin IC NO + - U15: 20-pin IC NO + - U16: 20-pin IC NO + - U17: 14-pin IC NO + - U18: 14-pin IC NO + - U19: 16-pin IC YES WATCHDOG MAXIM MAX691 + - U20: 16-pin IC YES DARLINGTON ULN2003 + + + M6809 + +---\/---+ + GND 1| |40 !HALT <-- + --> !NMI 2| |39 ETAL <-- + PIA /IRQA & B --> !IRQ 3| |38 EXTAL <-- + --> !FIRQ 4| |37 !RES <-- PIA /RES & U19(15) MAX691 + <-- BS 5| |36 MRDY <-- + <-- BA 6| |35 Q <-- + Vcc 7| U1 |34 E <-- PIA E (25) + PIA /RS0 (36) <-- A0 8| |33 !DMA <-- + PIA /RS1 (35) <-- A1 9|Motorola|32 R/!W --> PIA R/W (21) + <-- A2 10| 6809 |31 D0 <-> PIA D0 (33) + <-- A3 11| |30 D1 <-> PIA D1 (32) + <-- A4 12| |29 D2 <-> PIA D2 (31) + <-- A5 13| |28 D3 <-> PIA D3 (30) + <-- A6 14| |27 D4 <-> PIA D4 (29) + <-- A7 15| |26 D5 <-> PIA D5 (28) + <-- A8 16| |25 D6 <-> PIA D6 (27) + <-- A9 17| |24 D7 <-> PIA D7 (26) + <-- A10 18| |23 A15 --> + <-- A11 19| |22 A14 --> + <-- A12 20| |21 A13 --> + +--------+ + + PIA 6821 + +----\/----+ + VSS |01 40| CA1 --- PIA CB1 (*) + JAMMA S17 (2P_ST) - PA0 |02 39| CA2 --- U19(11). Watchdog/RESET + JAMMA S14 (SRVSW) - PA1 |03 38| /IRQA - CPU M6809 !IRQ (03) + JAMMA C26 (2P_SL) - PA2 |04 37| /IRQB - CPU M6809 !IRQ (03) + JAMMA S16 (COIN2) - PA3 |05 U4 36| /RS0 -- CPU M6809 A0 (08) + JAMMA S15 (TLTSW) - PA4 |06 35| /RS1 -- CPU M6809 A1 (09) + JAMMA C22 (P1_B1) - PA5 |07 34| /RES -- CPU M6809 !RES (37) & U19(15) MAX691 + JAMMA C18/21(U-R) - PA6 |08 33| D0 ---- CPU M6809 D0 (31) + JAMMA C19/20(D-L) - PA7 |09 32| D1 ---- CPU M6809 D1 (30) + JP2(4) - PB0 |10 31| D2 ---- CPU M6809 D2 (29) + JP2(2) - PB1 |11 30| D3 ---- CPU M6809 D3 (28) + U20(04) - PB2 |12 29| D4 ---- CPU M6809 D4 (27) + U20(05) - PB3 |13 28| D5 ---- CPU M6809 D5 (26) + JP1(6) - PB4 |14 27| D6 ---- CPU M6809 D6 (25) + JP1(4) - PB5 |15 26| D7 ---- CPU M6809 D7 (24) + JP1(2) - PB6 |16 25| E ----- CPU M6809 E (34) + U20(07) - PB7 |17 24| CS1 + PIA CA1 (*) - CB1 |18 23| /CS2 + U20(06) - CB2 |19 22| CS0 + VCC |20 21| R/W + +----------+ + + (*) Lines CA1 and CB1 are tied together, being both IN. + They are connected to JAMMA C16 (COIN1). + + + U19: *** MAX691 *** Maxim MAX691 Microprocessor Supervisory Circuit. + (for battery backup power switching and watchdog). + leg 01 [VBATT] ----> + leg 02 [VOUT] -----> + leg 03 [VCC] ------> VCC + leg 04 [GND] ------> GND + leg 05 [BATT ON] --> + leg 06 [/LOWLINE] -> + leg 07 [OSC IN] ---> N/C \ Set 1.6 seconds as WD timeout. + leg 08 [OSC SEL] --> N/C / + leg 09 [PFI] ------> + leg 10 [/PFO] -----> + leg 11 [WDI] ------> PIA CA2 + leg 12 [/CE OUT] --> + leg 13 [/CE IN] ---> GND + leg 14 [/WDO] -----> + leg 15 [/RESET] ---> CPU /RES (37) + leg 16 [RESET] ----> + + + U20: *** ULN2003 *** + + leg 01 --> N/C + leg 02 --> N/C + leg 03 --> N/C + leg 04 --> PIA PB2 (12) + leg 05 --> PIA PB3 (13) + leg 06 --> PIA CB2 (19) + leg 07 --> PIA PB7 (17) + leg 08 --> GND + leg 09 --> VCC + leg 10 --> CAP --> JAMMA(S10) +Speaker + leg 11 --> JAMMA(S26) + leg 12 --> JAMMA(C08) Coin Counter 1 + leg 13 --> JAMMA(S08) Coin Counter 2 + leg 14 --> N/C + leg 15 --> N/C + leg 16 --> N/C + + + JP1: + 01 --> GND + 02 --> PIA PB6 (16) & R5(1K) --> VCC + 03 --> GND + 04 --> PIA PB5 (15) & R7(1K) --> VCC + 05 --> GND + 06 --> PIA PB4 (14) & R8(1K) --> VCC + + JP2: + 01 --> GND + 02 --> PIA PB1 (11) & R9(1K) --> VCC + 03 --> GND + 04 --> PIA PB0 (10) & R10(1K) -> VCC + 05 --> GND + 06 --> Seems N/C + + +*******************************************************************************************************/ + + +#define MASTER_CLOCK XTAL_12MHz /* confirmed */ +#define CPU_CLOCK (MASTER_CLOCK/16) /* guess */ +#define CRTC_CLOCK (MASTER_CLOCK/8) /* guess */ #include "emu.h" #include "cpu/m6809/m6809.h" +#include "video/mc6845.h" +#include "machine/6821pia.h" #include "sound/dac.h" #include "includes/truco.h" -/***************************************************************************/ +/******************************************* +* Read/Write Handlers * +*******************************************/ + +static WRITE8_DEVICE_HANDLER( porta_w ) +{ + logerror("Port A writes: %2x\n", data); +} +static WRITE8_DEVICE_HANDLER( pia_ca2_w ) +{ +/* PIA CA2 line is connected to IC U19, leg 11. + The IC was successfully identified as MAX691. + The leg 11 is WDI... + + The code toggles 0's & 1's on this line. + Legs 07 [OSC IN] and 08 [OSC SEL] aren't connected, + setting 1.6 seconds as WD timeout. +*/ + watchdog_reset(device->machine()); +} + +static WRITE8_DEVICE_HANDLER( portb_w ) +{ + if ((data & 0x80) | (data == 0)) + { + dac_data_w(device->machine().device("dac"), data & 0x80); /* Isolated the bit for Delta-Sigma DAC */ + } + else + logerror("Port B writes: %2x\n", data); +} + +static WRITE8_DEVICE_HANDLER( pia_irqa_w ) +{ + logerror("PIA irq A: %2x\n", data); +} + +static WRITE8_DEVICE_HANDLER( pia_irqb_w ) +{ + logerror("PIA irq B: %2x\n", data); +} + + +/******************************************* +* Memory Map * +*******************************************/ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x17ff) AM_RAM /* general purpose ram */ - AM_RANGE(0x1800, 0x7bff) AM_RAM AM_BASE_MEMBER(truco_state, m_videoram) /* video ram */ - AM_RANGE(0x7c00, 0x7fff) AM_RAM AM_BASE_MEMBER(truco_state, m_battery_ram) /* battery backed ram */ - AM_RANGE(0x8000, 0x8000) AM_READ_PORT("P1") AM_WRITENOP /* controls (and irq ack?) */ - AM_RANGE(0x8001, 0x8001) AM_NOP /* unknown */ - AM_RANGE(0x8002, 0x8002) AM_READ_PORT("DSW") AM_DEVWRITE("dac", dac_w) /* dipswitches */ - AM_RANGE(0x8003, 0x8007) AM_NOP /* unknown */ + AM_RANGE(0x0000, 0x17ff) AM_RAM /* General purpose RAM */ + AM_RANGE(0x1800, 0x7bff) AM_RAM AM_BASE_MEMBER(truco_state, m_videoram) /* Video RAM */ + AM_RANGE(0x7c00, 0x7fff) AM_RAM AM_BASE_MEMBER(truco_state, m_battery_ram) /* Battery backed RAM */ + AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE_MODERN("pia0", pia6821_device, read, write) + AM_RANGE(0x8004, 0x8004) AM_DEVWRITE_MODERN("crtc", mc6845_device, address_w) + AM_RANGE(0x8005, 0x8005) AM_DEVREADWRITE_MODERN("crtc", mc6845_device, register_r, register_w) AM_RANGE(0x8008, 0xffff) AM_ROM ADDRESS_MAP_END +/* +CRTC: + +00: 5f +01: 40 +02: 4d +03: 06 +04: 0f +05: 04 +06: 0c +07: 0e +08: 00 +09: 0f +0a: 00 +0b: 00 +0c: 00 +0d: c0 +*/ + +/******************************************* +* Input Ports Definition * +*******************************************/ static INPUT_PORTS_START( truco ) PORT_START("P1") /* IN0 */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_DIPNAME( 0x01, 0x01, "IN0-1 (P2 START)" ) + PORT_DIPSETTING ( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, "IN0-2 (SERVICE SW)" ) + PORT_DIPSETTING ( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "IN0-3 (P2 SELECT)" ) + PORT_DIPSETTING ( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "IN0-4 (COIN2)" ) + PORT_DIPSETTING ( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "IN0-5 (TILT SW)" ) + PORT_DIPSETTING ( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) +// PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Connected to JAMMA S17 (P2 START) */ +// PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Connected to JAMMA S14 (SERVICE SW) */ +// PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Connected to JAMMA C26 (P2 SELECT) */ +// PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Connected to JAMMA S16 (COIN2) */ +// PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Connected to JAMMA S15 (TILT SW) */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) /* Connected to JAMMA C22 (P1 BUTTON1) */ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) /* Connected to JAMMA C18/21 (JOY UP & JOY RIGHT) */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) /* Connected to JAMMA C19/20 (JOY DOWN & JOY LEFT) */ - PORT_START("DSW") /* DSW1 */ + PORT_START("JMPRS") /* JP1-2 */ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPSETTING ( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING ( 0x00, DEF_STR( On ) ) @@ -83,6 +354,11 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END + +/******************************************* +* Machine Reset & Interrupts * +*******************************************/ + static MACHINE_RESET( truco ) { truco_state *state = machine.driver_data(); @@ -131,13 +407,61 @@ } +/******************************************* +* PIA Interfaces * +*******************************************/ +/* + +*/ +static const pia6821_interface pia0_intf = +{ + DEVCB_INPUT_PORT("P1"), /* port A in */ + DEVCB_INPUT_PORT("JMPRS"), /* port B in */ + DEVCB_NULL, /* line CA1 in ??? */ + DEVCB_NULL, /* line CB1 in ??? */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_HANDLER(porta_w), /* port A out */ + DEVCB_HANDLER(portb_w), /* port B out */ + DEVCB_HANDLER(pia_ca2_w), /* line CA2 out */ + DEVCB_NULL, /* port CB2 out */ + DEVCB_HANDLER(pia_irqa_w), /* IRQA */ + DEVCB_HANDLER(pia_irqb_w) /* IRQB */ +}; + + +/******************************************* +* CRTC Interface * +*******************************************/ + +static const mc6845_interface mc6845_intf = +{ + "screen", /* screen we are acting on */ + 4, /* number of pixels per video memory address */ + NULL, /* before pixel update callback */ + NULL, /* row update callback */ + NULL, /* after pixel update callback */ + DEVCB_NULL, /* callback for display state changes */ + DEVCB_NULL, /* callback for cursor state changes */ + DEVCB_NULL, /* HSYNC callback */ + DEVCB_NULL, /* VSYNC callback */ + NULL /* update address callback */ +}; + + +/******************************************* +* Machine Driver * +*******************************************/ + static MACHINE_CONFIG_START( truco, truco_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6809, 750000) /* ?? guess */ + MCFG_CPU_ADD("maincpu", M6809, CPU_CLOCK) MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", truco_interrupt) + MCFG_WATCHDOG_TIME_INIT(attotime::from_seconds(1.6)) /* 1.6 seconds */ + + MCFG_PIA6821_ADD("pia0", pia0_intf) MCFG_MACHINE_RESET(truco) @@ -145,14 +469,15 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 192) MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 0, 192-1) - MCFG_SCREEN_UPDATE(truco) + MCFG_SCREEN_UPDATE_STATIC(truco) MCFG_PALETTE_LENGTH(16) MCFG_PALETTE_INIT(truco) + MCFG_MC6845_ADD("crtc", MC6845, CRTC_CLOCK, mc6845_intf) /* Identified as UM6845 */ + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -173,4 +498,5 @@ ROM_LOAD( "truco.u2", 0x0c000, 0x4000, CRC(ff355750) SHA1(1538f20b1919928ffca439e4046a104ddfbc756c) ) ROM_END -GAME( 198?, truco, 0, truco, truco, 0, ROT0, "Playtronic SRL", "Truco-Tron", GAME_IMPERFECT_SOUND ) +/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */ +GAME( 198?, truco, 0, truco, truco, 0, ROT0, "Playtronic SRL", "Truco-Tron", 0 ) diff -Nru mame-0.144/src/mame/drivers/trucocl.c mame-0.145/src/mame/drivers/trucocl.c --- mame-0.144/src/mame/drivers/trucocl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/trucocl.c 2012-02-06 21:30:41.000000000 +0000 @@ -5,8 +5,8 @@ driver by Ernesto Corvi Notes: -- Audio is almost there. - After one game you can't play anymore. +- Audio is almost there. - I think this runs on a heavily modified PacMan type of board. ---------------------------------- @@ -39,7 +39,9 @@ static WRITE8_HANDLER( irq_enable_w ) { - interrupt_enable_w( space, 0, (~data) & 1 ); + trucocl_state *state = space->machine().driver_data(); + + state->m_irq_mask = (data & 1) ^ 1; } @@ -123,7 +125,11 @@ static INTERRUPT_GEN( trucocl_interrupt ) { - irq0_line_hold(device); + trucocl_state *state = device->machine().driver_data(); + + if(state->m_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); + } static MACHINE_CONFIG_START( trucocl, trucocl_state ) @@ -136,10 +142,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(trucocl) + MCFG_SCREEN_UPDATE_STATIC(trucocl) MCFG_GFXDECODE(trucocl) MCFG_PALETTE_LENGTH(32) @@ -191,4 +196,4 @@ /******************************************************************************/ /* YEAR NAME PARENT MACHINE INPUT INIT MONITOR */ -GAME( 1991, trucocl, 0, trucocl, trucocl, trucocl, ROT0, "Miky SRL", "Truco Clemente", GAME_IMPERFECT_SOUND ) +GAME( 1991, trucocl, 0, trucocl, trucocl, trucocl, ROT0, "Miky SRL", "Truco Clemente", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) diff -Nru mame-0.144/src/mame/drivers/trvmadns.c mame-0.145/src/mame/drivers/trvmadns.c --- mame-0.144/src/mame/drivers/trvmadns.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/trvmadns.c 2012-02-06 21:30:36.000000000 +0000 @@ -204,7 +204,7 @@ } state->m_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } @@ -272,7 +272,7 @@ SET_TILE_INFO(0,tile,color,flag); - tileinfo->category = (attr & 0x20)>>5; + tileinfo.category = (attr & 0x20)>>5; } static VIDEO_START( trvmadns ) @@ -280,18 +280,18 @@ trvmadns_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); -// tilemap_set_transparent_pen(fg_tilemap,1); +// fg_tilemap->set_transparent_pen(1); gfx_element_set_source(machine.gfx[0], state->m_gfxram); } -static SCREEN_UPDATE( trvmadns ) +static SCREEN_UPDATE_IND16( trvmadns ) { - trvmadns_state *state = screen->machine().driver_data(); + trvmadns_state *state = screen.machine().driver_data(); int x,y,count; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; - bitmap_fill(bitmap,cliprect,0xd); + bitmap.fill(0xd, cliprect); count = 0; @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(trvmadns) + MCFG_SCREEN_UPDATE_STATIC(trvmadns) MCFG_GFXDECODE(trvmadns) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/tryout.c mame-0.145/src/mame/drivers/tryout.c --- mame-0.144/src/mame/drivers/tryout.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tryout.c 2012-02-06 21:30:36.000000000 +0000 @@ -198,10 +198,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(tryout) + MCFG_SCREEN_UPDATE_STATIC(tryout) MCFG_GFXDECODE(tryout) MCFG_PALETTE_LENGTH(0x20) diff -Nru mame-0.144/src/mame/drivers/tsamurai.c mame-0.145/src/mame/drivers/tsamurai.c --- mame-0.144/src/mame/drivers/tsamurai.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/tsamurai.c 2012-02-06 21:30:38.000000000 +0000 @@ -658,10 +658,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) - MCFG_SCREEN_UPDATE(tsamurai) + MCFG_SCREEN_UPDATE_STATIC(tsamurai) MCFG_GFXDECODE(tsamurai) MCFG_PALETTE_LENGTH(256) @@ -706,10 +705,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) - MCFG_SCREEN_UPDATE(tsamurai) + MCFG_SCREEN_UPDATE_STATIC(tsamurai) MCFG_GFXDECODE(tsamurai) MCFG_PALETTE_LENGTH(256) @@ -747,10 +745,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 255-8) - MCFG_SCREEN_UPDATE(vsgongf) + MCFG_SCREEN_UPDATE_STATIC(vsgongf) MCFG_GFXDECODE(tsamurai) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/ttchamp.c mame-0.145/src/mame/drivers/ttchamp.c --- mame-0.144/src/mame/drivers/ttchamp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/ttchamp.c 2012-02-06 21:30:38.000000000 +0000 @@ -60,14 +60,14 @@ { } -static SCREEN_UPDATE(ttchamp) +static SCREEN_UPDATE_IND16(ttchamp) { - ttchamp_state *state = screen->machine().driver_data(); + ttchamp_state *state = screen.machine().driver_data(); int y,x,count; // int i; static const int xxx=320,yyy=204; - bitmap_fill(bitmap, 0, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); // for (i=0;i<256;i++) // { @@ -85,7 +85,7 @@ { for(x=0;xm_peno_vram)[BYTE_XOR_LE(count)]+0x300; + /*if(hotblock_port0&0x40)*/bitmap.pix16(y, x) = ((UINT8 *)state->m_peno_vram)[BYTE_XOR_LE(count)]+0x300; count++; } } @@ -244,10 +244,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(1024,1024) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE(ttchamp) + MCFG_SCREEN_UPDATE_STATIC(ttchamp) MCFG_PALETTE_LENGTH(0x8000) diff -Nru mame-0.144/src/mame/drivers/tubep.c mame-0.145/src/mame/drivers/tubep.c --- mame-0.144/src/mame/drivers/tubep.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tubep.c 2012-02-06 21:30:39.000000000 +0000 @@ -920,10 +920,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(tubep) + MCFG_SCREEN_UPDATE_STATIC(tubep) MCFG_PALETTE_LENGTH(32 + 256*64) @@ -981,10 +980,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 264) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(rjammer) + MCFG_SCREEN_UPDATE_STATIC(rjammer) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/tugboat.c mame-0.145/src/mame/drivers/tugboat.c --- mame-0.144/src/mame/drivers/tugboat.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/tugboat.c 2012-02-06 21:30:39.000000000 +0000 @@ -90,7 +90,7 @@ if (offset<0x8 ) state->m_ram[0x291d + 32*offset + 32*9] = data ^ 0x0f; } -static void draw_tilemap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, +static void draw_tilemap(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect, int addr,int gfx0,int gfx1,int transparency) { tugboat_state *state = machine.driver_data(); @@ -125,15 +125,15 @@ } } -static SCREEN_UPDATE( tugboat ) +static SCREEN_UPDATE_IND16( tugboat ) { - tugboat_state *state = screen->machine().driver_data(); + tugboat_state *state = screen.machine().driver_data(); int startaddr0 = state->m_hd46505_0_reg[0x0c]*256 + state->m_hd46505_0_reg[0x0d]; int startaddr1 = state->m_hd46505_1_reg[0x0c]*256 + state->m_hd46505_1_reg[0x0d]; - draw_tilemap(screen->machine(), bitmap,cliprect,startaddr0,0,1,FALSE); - draw_tilemap(screen->machine(), bitmap,cliprect,startaddr1,2,3,TRUE); + draw_tilemap(screen.machine(), bitmap,cliprect,startaddr0,0,1,FALSE); + draw_tilemap(screen.machine(), bitmap,cliprect,startaddr1,2,3,TRUE); return 0; } @@ -338,10 +338,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8,32*8) MCFG_SCREEN_VISIBLE_AREA(1*8,31*8-1,2*8,30*8-1) - MCFG_SCREEN_UPDATE(tugboat) + MCFG_SCREEN_UPDATE_STATIC(tugboat) MCFG_GFXDECODE(tugboat) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/tumbleb.c mame-0.145/src/mame/drivers/tumbleb.c --- mame-0.144/src/mame/drivers/tumbleb.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/tumbleb.c 2012-02-06 21:30:38.000000000 +0000 @@ -318,6 +318,7 @@ #include "sound/3812intf.h" #include "sound/okim6295.h" #include "includes/tumbleb.h" +#include "video/decospr.h" #define TUMBLEP_HACK 0 #define FNCYWLD_HACK 0 @@ -347,15 +348,6 @@ return ~0; } -#ifdef UNUSED_FUNCTION -static WRITE16_HANDLER( tumblepb_sound_w ) -{ - tumbleb_state *state = space->machine().driver_data(); - soundlatch_w(space, 0, data & 0xff); - device_set_input_line(state->m_audiocpu, 0, HOLD_LINE); -} -#endif - static WRITE16_HANDLER( jumppop_sound_w ) { tumbleb_state *state = space->machine().driver_data(); @@ -2087,10 +2079,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(tumblepb) + MCFG_SCREEN_UPDATE_STATIC(tumblepb) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(tumbleb) MCFG_PALETTE_LENGTH(1024) @@ -2119,10 +2114,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(tumblepb) + MCFG_SCREEN_UPDATE_STATIC(tumblepb) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(tumbleb) MCFG_PALETTE_LENGTH(1024) @@ -2154,10 +2152,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(jumpkids) + MCFG_SCREEN_UPDATE_STATIC(jumpkids) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(tumbleb) MCFG_PALETTE_LENGTH(1024) @@ -2185,10 +2186,14 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(fncywld) + MCFG_SCREEN_UPDATE_STATIC(fncywld) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); + decospr_device::set_transpen(*device, 15); MCFG_GFXDECODE(fncywld) MCFG_PALETTE_LENGTH(0x800) @@ -2252,10 +2257,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2400)) // ?? cookbib needs it above ~2400 or the Joystick on the How to Play screen is the wrong colour?! - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(semicom) + MCFG_SCREEN_UPDATE_STATIC(semicom) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(tumbleb) MCFG_PALETTE_LENGTH(1024) @@ -2277,7 +2285,7 @@ static MACHINE_CONFIG_DERIVED( cookbib, htchctch ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( semicom_altoffsets ) + MCFG_SCREEN_UPDATE_STATIC( semicom_altoffsets ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( cookbib_mcu, htchctch ) @@ -2289,12 +2297,12 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE( semicom_altoffsets ) + MCFG_SCREEN_UPDATE_STATIC( semicom_altoffsets ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( bcstory, htchctch ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(bcstory) + MCFG_SCREEN_UPDATE_STATIC(bcstory) MCFG_SOUND_REPLACE("ymsnd", YM2151, 3427190) MCFG_SOUND_CONFIG(semicom_ym2151_interface) @@ -2304,13 +2312,13 @@ static MACHINE_CONFIG_DERIVED( semibase, bcstory ) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(semibase ) + MCFG_SCREEN_UPDATE_STATIC(semibase ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sdfight, bcstory ) MCFG_VIDEO_START(sdfight) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(sdfight) + MCFG_SCREEN_UPDATE_STATIC(sdfight) MACHINE_CONFIG_END @@ -2341,10 +2349,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(jumppop) + MCFG_SCREEN_UPDATE_STATIC(jumppop) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(jumppop) MCFG_PALETTE_LENGTH(1024) @@ -2379,10 +2390,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8-1, 31*8-2) - MCFG_SCREEN_UPDATE(suprtrio) + MCFG_SCREEN_UPDATE_STATIC(suprtrio) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(suprtrio) MCFG_PALETTE_LENGTH(1024) @@ -2411,10 +2425,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(pangpang) + MCFG_SCREEN_UPDATE_STATIC(pangpang) + + MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0) + decospr_device::set_gfx_region(*device, 3); + decospr_device::set_is_bootleg(*device, true); MCFG_GFXDECODE(tumbleb) MCFG_PALETTE_LENGTH(1024) @@ -3778,16 +3795,17 @@ GAME( 1994, metlsavr, 0, metlsavr, metlsavr, chokchok, ROT0, "First Amusement", "Metal Saver", GAME_SUPPORTS_SAVE ) GAME( 1994, pangpang, 0, pangpang, tumblepb, tumbleb2, ROT0, "Dong Gue La Mi Ltd.", "Pang Pang", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE ) // PIC is protected, sound simulation not 100% GAME( 1994, suprtrio, 0, suprtrio, suprtrio, suprtrio, ROT0, "Gameace", "Super Trio", GAME_SUPPORTS_SAVE ) +GAME( 1996, fncywld, 0, fncywld, fncywld, fncywld, ROT0, "Unico", "Fancy World - Earth of Crisis" , GAME_SUPPORTS_SAVE ) // game says 1996, testmode 1995? +GAME( 2001, jumppop, 0, jumppop, jumppop, 0, ORIENTATION_FLIP_X, "ESD", "Jumping Pop", GAME_SUPPORTS_SAVE ) + // Should also be 'Magicball Fighting' (c)1994 +GAME( 1995, wlstar, 0, cookbib_mcu, wlstar, wlstar, ROT0, "Mijin", "Wonder League Star - Sok-Magicball Fighting (Korea)", GAME_SUPPORTS_SAVE ) // translates to 'Wonder League Star - Return of Magicball Fighting' GAME( 1995, htchctch, 0, htchctch, htchctch, htchctch, ROT0, "SemiCom", "Hatch Catch" , GAME_SUPPORTS_SAVE ) // not 100% sure about gfx offsets GAME( 1995, cookbib, 0, cookbib, cookbib, htchctch, ROT0, "SemiCom", "Cookie & Bibi" , GAME_SUPPORTS_SAVE ) // not 100% sure about gfx offsets GAME( 1995, chokchok, 0, cookbib, chokchok, chokchok, ROT0, "SemiCom", "Choky! Choky!", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // corruption during attract mode (tmap disable?) -GAME( 1995, wlstar, 0, cookbib_mcu, wlstar, wlstar, ROT0, "Mijin", "Wonder League Star - Sok-Magicball Fighting (Korea)", GAME_SUPPORTS_SAVE ) // translates to 'Wonder League Star - Return of Magicball Fighting' GAME( 1996, wondl96, 0, cookbib_mcu, wondl96, wondl96, ROT0, "SemiCom", "Wonder League '96 (Korea)", GAME_SUPPORTS_SAVE ) -GAME( 1996, fncywld, 0, fncywld, fncywld, fncywld, ROT0, "Unico", "Fancy World - Earth of Crisis" , GAME_SUPPORTS_SAVE ) // game says 1996, testmode 1995? GAME( 1996, sdfight, 0, sdfight, sdfight, bcstory, ROT0, "SemiCom", "SD Fighters (Korea)", GAME_SUPPORTS_SAVE ) GAME( 1997, bcstry, 0, bcstory, bcstory, bcstory, ROT0, "SemiCom", "B.C. Story (set 1)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // gfx offsets? GAME( 1997, bcstrya, bcstry, bcstory, bcstory, bcstory, ROT0, "SemiCom", "B.C. Story (set 2)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // gfx offsets? GAME( 1997, semibase, 0, semibase, semibase, bcstory, ROT0, "SemiCom", "MuHanSeungBu (SemiCom Baseball) (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )// sprite offsets.. GAME( 1998, dquizgo, 0, cookbib, dquizgo, dquizgo, ROT0, "SemiCom", "Date Quiz Go Go (Korea)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) // check layer offsets -GAME( 2001, jumppop, 0, jumppop, jumppop, 0, ORIENTATION_FLIP_X, "ESD", "Jumping Pop", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/tumblep.c mame-0.145/src/mame/drivers/tumblep.c --- mame-0.144/src/mame/drivers/tumblep.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tumblep.c 2012-02-06 21:30:38.000000000 +0000 @@ -321,10 +321,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-2, 1*8, 31*8-1) // hmm - MCFG_SCREEN_UPDATE(tumblep) + MCFG_SCREEN_UPDATE_STATIC(tumblep) MCFG_GFXDECODE(tumblep) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/tunhunt.c mame-0.145/src/mame/drivers/tunhunt.c --- mame-0.144/src/mame/drivers/tunhunt.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/tunhunt.c 2012-02-06 21:30:40.000000000 +0000 @@ -311,10 +311,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256-16) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 255-16) - MCFG_SCREEN_UPDATE(tunhunt) + MCFG_SCREEN_UPDATE_STATIC(tunhunt) MCFG_GFXDECODE(tunhunt) MCFG_PALETTE_LENGTH(0x1a) diff -Nru mame-0.144/src/mame/drivers/turbo.c mame-0.145/src/mame/drivers/turbo.c --- mame-0.144/src/mame/drivers/turbo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/turbo.c 2012-02-06 21:30:39.000000000 +0000 @@ -1092,9 +1092,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(turbo) + MCFG_SCREEN_UPDATE_STATIC(turbo) MCFG_PALETTE_INIT(turbo) MCFG_VIDEO_START(turbo) @@ -1120,9 +1119,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(subroc3d) + MCFG_SCREEN_UPDATE_STATIC(subroc3d) MCFG_PALETTE_INIT(subroc3d) MCFG_VIDEO_START(turbo) @@ -1155,9 +1153,8 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(buckrog) + MCFG_SCREEN_UPDATE_STATIC(buckrog) MCFG_PALETTE_INIT(buckrog) MCFG_VIDEO_START(buckrog) diff -Nru mame-0.144/src/mame/drivers/turrett.c mame-0.145/src/mame/drivers/turrett.c --- mame-0.144/src/mame/drivers/turrett.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/turrett.c 2012-02-06 21:30:37.000000000 +0000 @@ -57,6 +57,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mips/r3000.h" @@ -65,26 +67,36 @@ { public: turrett_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void video_start(); }; #define R3041_CLOCK 25000000 -static VIDEO_START(turrett) +void turrett_state::video_start() { - } -static SCREEN_UPDATE(turrett) +UINT32 turrett_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } -static ADDRESS_MAP_START( cpu_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( cpu_map, AS_PROGRAM, 32, turrett_state ) AM_RANGE(0x00000000, 0x0007ffff) AM_RAM AM_RANGE(0x1fc00000, 0x1fdfffff) AM_ROM AM_REGION("maincpu", 0) AM_RANGE(0x02000010, 0x02000013) AM_RAM @@ -122,14 +134,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(turrett_state, screen_update) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(turrett) MCFG_PALETTE_LENGTH(0x2000) - - MCFG_VIDEO_START(turrett) MACHINE_CONFIG_END @@ -145,4 +154,4 @@ ROM_END -GAME( 2001, turrett, 0, turrett, turrett, 0, ROT0, "Dell Electronics (Namco license)", "Turret Tower", GAME_NOT_WORKING | GAME_NO_SOUND ) +GAME( 2001, turrett, 0, turrett, turrett, 0, ROT0, "Dell Electronics (Namco license)", "Turret Tower", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/tutankhm.c mame-0.145/src/mame/drivers/tutankhm.c --- mame-0.144/src/mame/drivers/tutankhm.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/tutankhm.c 2012-02-06 21:30:36.000000000 +0000 @@ -155,14 +155,14 @@ PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x02, "5" ) - PORT_DIPSETTING( 0x00, "256 (Cheat)") + PORT_DIPSETTING( 0x00, "255 (Cheat)") PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "30000" ) PORT_DIPSETTING( 0x00, "40000" ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPNAME( 0x30, 0x20, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x20, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) @@ -233,10 +233,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) /* not sure about the visible area */ - MCFG_SCREEN_UPDATE(tutankhm) + MCFG_SCREEN_UPDATE_STATIC(tutankhm) /* sound hardware */ MCFG_FRAGMENT_ADD(timeplt_sound) diff -Nru mame-0.144/src/mame/drivers/twin16.c mame-0.145/src/mame/drivers/twin16.c --- mame-0.144/src/mame/drivers/twin16.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/twin16.c 2012-02-06 21:30:41.000000000 +0000 @@ -311,7 +311,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123_UNK(1) // button1 = start/powerup, button2 = attack, button3 = jump + KONAMI8_B123_UNK(1) // button1 = start/powerup, button2 = attack, button3 = jump PORT_START("P2") /* 0xa0005 */ KONAMI8_B123_UNK(2) @@ -326,7 +326,7 @@ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // Japan factory default = "3" + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) @@ -334,7 +334,7 @@ PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -363,7 +363,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123(1) // button1 = start/jump, button2 = attack, button3 = dynamite + KONAMI8_B123(1) // button1 = start/jump, button2 = attack, button3 = dynamite PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_START("P2") /* 0xa0005 */ @@ -435,7 +435,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123_UNK(1) // button1 = powerup, button2 = shoot, button3 = missile + KONAMI8_B123_UNK(1) // button1 = powerup, button2 = shoot, button3 = missile PORT_START("P2") /* 0xa0005 */ KONAMI8_B123_UNK(2) @@ -450,20 +450,20 @@ PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // Japan factory default = "3" + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "20K, Every 70K" ) // Japan factory default = "20K, Every 70K" + PORT_DIPSETTING( 0x18, "20K, Every 70K" ) PORT_DIPSETTING( 0x10, "30K, Every 80K" ) PORT_DIPSETTING( 0x08, "20K Only" ) PORT_DIPSETTING( 0x00, "70K Only" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -488,7 +488,7 @@ PORT_MODIFY("DSW2") PORT_DIPNAME( 0x18, 0x18, DEF_STR (Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "20K, Every 150K" ) // Japan factory default = "20K, Every 150K" + PORT_DIPSETTING( 0x18, "20K, Every 150K" ) PORT_DIPSETTING( 0x10, "30K, Every 200K" ) PORT_DIPSETTING( 0x08, "20K Only" ) PORT_DIPSETTING( 0x00, "70K Only" ) @@ -506,7 +506,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123_UNK(1) // button1 = face punch, button2 = body punch, button3 = defend + KONAMI8_B123_UNK(1) // button1 = face punch, button2 = body punch, button3 = defend PORT_START("P2") /* 0xa0005 */ KONAMI8_B123_UNK(2) @@ -529,7 +529,7 @@ PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" ) // ditto PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // US and Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -558,7 +558,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123_UNK(1) // button1 = knife, button2 = weapon, button3 = choice + KONAMI8_B123_UNK(1) // button1 = knife, button2 = weapon, button3 = choice PORT_START("P2") /* 0xa0005 */ KONAMI8_B123_UNK(2) @@ -571,21 +571,21 @@ /* "Invalid" = both coin slots disabled */ PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x02, "3" ) // US and Japan factory default = "3" + PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "7" ) PORT_DIPUNUSED_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW2:3" ) - PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") - PORT_DIPSETTING( 0x18, "30K, Every 80K" ) // Japan factory default = "30K, Every 80K" + PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") + PORT_DIPSETTING( 0x18, "30K, Every 80K" ) // JP default PORT_DIPSETTING( 0x10, "50K, Every 100K" ) - PORT_DIPSETTING( 0x08, "50K Only" ) // US factory default = "50K Only" (struck off "50K, Every 100K") + PORT_DIPSETTING( 0x08, "50K Only" ) // US default PORT_DIPSETTING( 0x00, "100K Only" ) - PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") + PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" - PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) // US factory default = "Difficult" (struck off "Normal") + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // JP default + PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) // US default PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) @@ -613,7 +613,7 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("P1") /* 0xa0003 */ - KONAMI8_B123_UNK(1) // button1 = move, button2 = warp, button3 = stop + KONAMI8_B123_UNK(1) // button1 = move, button2 = warp, button3 = stop PORT_START("P2") /* 0xa0005 */ KONAMI8_B123_UNK(2) @@ -634,11 +634,11 @@ PORT_DIPNAME( 0x18, 0x08, "Machine Name" ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x18, DEF_STR( None ) ) PORT_DIPSETTING( 0x10, "Lewis" ) - PORT_DIPSETTING( 0x08, "Johnson" ) // Japan factory default = "Johnson" + PORT_DIPSETTING( 0x08, "Johnson" ) PORT_DIPSETTING( 0x00, "George" ) PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) // Japan factory default = "Normal" + PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") @@ -654,7 +654,7 @@ PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) PORT_DIPNAME( 0x08, 0x08, "Stop Time" ) PORT_DIPLOCATION("SW3:4") - PORT_DIPSETTING( 0x08, "200" ) // Japan factory default = "200" + PORT_DIPSETTING( 0x08, "200" ) PORT_DIPSETTING( 0x00, "150" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -751,11 +751,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(((double)XTAL_18_432MHz / 2) / (576 * 264)) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2062)) // 32 lines - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(twin16) - MCFG_SCREEN_EOF(twin16) + MCFG_SCREEN_UPDATE_STATIC(twin16) + MCFG_SCREEN_VBLANK_STATIC(twin16) MCFG_GFXDECODE(twin16) MCFG_PALETTE_LENGTH(0x400) @@ -805,11 +804,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(twin16) - MCFG_SCREEN_EOF(twin16) + MCFG_SCREEN_UPDATE_STATIC(twin16) + MCFG_SCREEN_VBLANK_STATIC(twin16) MCFG_GFXDECODE(twin16) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/drivers/twincobr.c mame-0.145/src/mame/drivers/twincobr.c --- mame-0.144/src/mame/drivers/twincobr.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/twincobr.c 2012-02-06 21:30:38.000000000 +0000 @@ -6,6 +6,9 @@ Flying Shark details: Carl-Henrik Skarstedt & Magnus Danielsson Flying Shark bootleg info: Ruben Panossian + Both bootlegs, while sharing a lot of code with the original sets + are probably based off undumped versions. + Supported games: @@ -583,9 +586,8 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_28MHz/4, 446, 0, 320, 286, 0, 240) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(toaplan0) - MCFG_SCREEN_EOF(toaplan0) + MCFG_SCREEN_UPDATE_STATIC(toaplan0) + MCFG_SCREEN_VBLANK_STATIC(toaplan0) MCFG_GFXDECODE(twincobr) MCFG_PALETTE_LENGTH(1792) @@ -957,6 +959,75 @@ ROM_LOAD( "clr3.bpr", 0x200, 0x100, CRC(016fe2f7) SHA1(909f815a61e759fdf998674ee383512ecd8fee65) ) /* ?? */ ROM_END +ROM_START( fsharkbla ) // based on a different version of the game code? (only a ~70% match on the program roms compared to any other set) + ROM_REGION( 0x30000, "maincpu", 0 ) /* Main 68K code */ + ROM_LOAD16_BYTE( "18.bin", 0x00000, 0x10000, CRC(ea4bcb43) SHA1(4b5fda235908a9081fdd4cca98294e9e9a34bbf2) ) + ROM_LOAD16_BYTE( "17.bin", 0x00001, 0x10000, CRC(d1f39ed2) SHA1(2a46a542c29a07b31a6bfa72a2f4d4d26699c13d) ) + +// fshark +// 18.bin b02_18-1.m8 69.615173% +// 17.bin b02_17-1.p8 66.320801% + +// skyshark +// 18.bin b02_18-2.m8 72.662354% +// 17.bin b02_17-2.p8 70.210266% + +// fsharkbt +// 18.bin r18 72.132874% +// 17.bin r17 69.287109% + +// hishouza +// 18.bin b02_18.m8 70.761108% +// 17.bin b02_17.p8 68.331909% + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Z80 code */ + ROM_LOAD( "16.bin", 0x0000, 0x8000, CRC(cdd1a153) SHA1(de9827a959039cf753ecac6756fb1925c37466d8) ) + + // ugly bootleg logo (and corrupt 0 text) + ROM_REGION( 0x0c000, "gfx1", 0 ) /* chars */ + ROM_LOAD( "5.bin", 0x08000, 0x04000, CRC(ca8badd2) SHA1(e81863ac03c9219a8de01b03dbac522022212b14) ) + ROM_CONTINUE(0x08000,0x04000) + ROM_LOAD( "6.bin", 0x04000, 0x04000, CRC(b7f717fb) SHA1(3f3cd092d13566792f0816d5b705011c89b8f662) ) + ROM_CONTINUE(0x04000,0x04000) + ROM_LOAD( "7.bin", 0x00000, 0x04000, CRC(d2b05463) SHA1(25131b64e63cd3791bc84d525b7e4b2a398be6ca) ) + ROM_CONTINUE(0x00000,0x04000) + + ROM_REGION( 0x20000, "gfx2", 0 ) /* fg tiles */ + ROM_LOAD( "12.bin", 0x00000, 0x08000, CRC(733b9997) SHA1(75e874a1d148fcc8fa09bb724ce8346565ace4e5) ) + ROM_LOAD( "15.bin", 0x08000, 0x08000, CRC(8b70ef32) SHA1(e1f988d650dce17e3bfbea12e5fddbb671df18d4) ) + ROM_LOAD( "14.bin", 0x10000, 0x08000, CRC(f711ba7d) SHA1(49644a264c09fc2d743e4f801b8b82e980f2def9) ) + ROM_LOAD( "13.bin", 0x18000, 0x08000, CRC(62532cd3) SHA1(df483db7604c0135130f92b08bad3fbffb4f5c47) ) + + ROM_REGION( 0x20000, "gfx3", 0 ) /* bg tiles */ + ROM_LOAD( "8.bin", 0x00000, 0x08000, CRC(ef0cf49c) SHA1(6fd5727462cd6c5dab4c5d780bd7504e48583894) ) + ROM_LOAD( "11.bin", 0x08000, 0x08000, CRC(f5799422) SHA1(3f79dd849db787695a587f0db19a6782153b5955) ) + ROM_LOAD( "10.bin", 0x10000, 0x08000, CRC(4bd099ff) SHA1(9326075f83549b0a9656f69bd4436fb1be2ac805) ) + ROM_LOAD( "9.bin", 0x18000, 0x08000, CRC(230f1582) SHA1(0fd4156a46ed64cb6e5c59b8836382dd86c229cf) ) + + ROM_REGION( 0x40000, "gfx4", 0 ) /* sprites */ + ROM_LOAD( "1.bin", 0x00000, 0x10000, CRC(2234b424) SHA1(bd6242b9dcdb0f582565df588106cd1ce2aad53b) ) + ROM_LOAD( "2.bin", 0x10000, 0x10000, CRC(30d4c9a8) SHA1(96ce4f41207c5487e801a8444030ec4dc7b58b23) ) + ROM_LOAD( "3.bin", 0x20000, 0x10000, CRC(64f3d88f) SHA1(d0155cfb0a8885d58e34141f9696b9aa208440ca) ) + ROM_LOAD( "4.bin", 0x30000, 0x10000, CRC(3b23a9fc) SHA1(2ac34445618e17371b5eed7eb6f43da4dbb99e28) ) + + /* PROMs were not dumped in this set, assuming the same layout / configuration as the other bootleg */ + + ROM_REGION( 0x2000, "dsp", 0 ) /* Co-Processor TMS320C10 MCU code */ + ROMX_LOAD( "mcu-1.bpr", 0x0000, 0x0400, CRC(45d4d1b1) SHA1(e776a056f0f72cbeb309c5a23f803330cb8b3763), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-2.bpr", 0x0000, 0x0400, CRC(651336d1) SHA1(3c968d5cb58abe35794b7c88520a22fc0b45a449), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-3.bpr", 0x0001, 0x0400, CRC(df88e79b) SHA1(661b057fa2eef37b9d794151381d7d74a7bfa93a), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-4.bpr", 0x0001, 0x0400, CRC(a2094a7f) SHA1(0f1c173643046c76aa89eab66fba6ea51c3f2223), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-5.bpr", 0x0800, 0x0400, CRC(f97a58da) SHA1(77a659943d95d5b859fab50f827f11222c3dbf1f), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-6.bpr", 0x0800, 0x0400, CRC(ffcc422d) SHA1(9b4331e8bb5fe37bb8efcccc500a1d7cd026bf93), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-7.bpr", 0x0801, 0x0400, CRC(0cd30d49) SHA1(65d65a199bfb740b94af19843640e625a5e67f46), ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI | ROM_SKIP(1) ) + ROMX_LOAD( "mcu-8.bpr", 0x0801, 0x0400, CRC(3379bbff) SHA1(2f577b8de6d523087b472691cdde2eb525877878), ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO | ROM_SKIP(1) ) + + ROM_REGION( 0x300, "proms", 0 ) /* nibble bproms, lo/hi order to be determined */ + ROM_LOAD( "clr2.bpr", 0x000, 0x100, CRC(24e7d62f) SHA1(1c06a1ef1b6a722794ca1d5ee2c476ecaa5178a3) ) /* sprite priority control ?? */ + ROM_LOAD( "clr1.bpr", 0x100, 0x100, CRC(a50cef09) SHA1(55cafb5b2551b80ae708e9b966cf37c70a16d310) ) /* sprite priority control ?? */ + ROM_LOAD( "clr3.bpr", 0x200, 0x100, CRC(016fe2f7) SHA1(909f815a61e759fdf998674ee383512ecd8fee65) ) /* ?? */ +ROM_END + ROM_START( gulfwar2 ) ROM_REGION( 0x40000, "maincpu", 0 ) /* Main 68K code */ ROM_LOAD16_BYTE( "08-u119.bin", 0x00000, 0x20000, CRC(41ebf9c0) SHA1(85207dda76abded727ed95717024a2ea2bd85dac) ) @@ -1018,7 +1089,8 @@ GAME( 1987, fshark, 0, twincobr, fshark, twincobr, ROT270, "Toaplan / Taito Corporation", "Flying Shark (World)", 0 ) GAME( 1987, skyshark, fshark, twincobr, skyshark, twincobr, ROT270, "Toaplan / Taito America Corporation (Romstar license)", "Sky Shark (US)", 0 ) GAME( 1987, hishouza, fshark, twincobr, hishouza, twincobr, ROT270, "Toaplan / Taito Corporation", "Hishou Zame (Japan)", 0 ) -GAME( 1987, fsharkbt, fshark, fsharkbt, skyshark, twincobr, ROT270, "bootleg", "Flying Shark (bootleg)", 0 ) +GAME( 1987, fsharkbt, fshark, fsharkbt, skyshark, twincobr, ROT270, "bootleg", "Flying Shark (bootleg, set 1)", 0 ) +GAME( 1987, fsharkbla, fshark, twincobr, skyshark, twincobr, ROT270, "bootleg", "Flying Shark (bootleg, set 2)", 0 ) GAME( 1987, twincobr, 0, twincobr, twincobr, twincobr, ROT270, "Toaplan / Taito Corporation", "Twin Cobra (World)", 0 ) GAME( 1987, twincobru, twincobr, twincobr, twincobru, twincobr, ROT270, "Toaplan / Taito America Corporation (Romstar license)", "Twin Cobra (US)", 0 ) GAME( 1987, ktiger, twincobr, twincobr, ktiger, twincobr, ROT270, "Toaplan / Taito Corporation", "Kyukyoku Tiger (Japan)", 0 ) diff -Nru mame-0.144/src/mame/drivers/twinkle.c mame-0.145/src/mame/drivers/twinkle.c --- mame-0.144/src/mame/drivers/twinkle.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/twinkle.c 2012-02-06 21:30:35.000000000 +0000 @@ -27,10 +27,12 @@ beatmania IIDX Club Version 2 - Konami 1999 GE984 A01(BM) ? 984 A02 ? + GE984 A01(DDR) beatmania IIDX 2nd Style - Konami 1999 GC985 A01 GC985 A04 ? ? -beatmania IIDX 3rd Style - Konami 2000 GC992-JA A01 ? ? ? +beatmania IIDX 3rd Style - Konami 2000 GC992-JA A01 GC992-JA A04 ? ? +beatmania IIDX 3rd Style(newer)- Konami 2000 GC992-JA C01 GC992-JA A04 ? ? beatmania IIDX 4th Style - Konami 2000 A03 JA A01 A03 JA A02 A03 A03 JA A03 -beatmania IIDX 5th Style - Konami 2001 ? ? ? ? +beatmania IIDX 5th Style - Konami 2001 A17 JA A01 A17 JA A02 ? ? beatmania IIDX 6th Style - Konami 2001 B4U JA A01 B4U JA A02 ? B4U JA A03 +beatmania IIDX 6th Style(newer)- Konami 2001 B4U JA B01 B4U JA A02 ? B4U JA A03 beatmania IIDX 7th Style - Konami 2002 B44 JA A01 B44 JA A02 ? ? beatmania IIDX 8th Style - Konami 2002 C44 JA A01 ? C44 ? @@ -622,8 +624,8 @@ AM_RANGE(0x1f260000, 0x1f260003) AM_WRITE(serial_w) AM_RANGE(0x1f270000, 0x1f270003) AM_WRITE_PORT("OUTSEC") AM_RANGE(0x1f280000, 0x1f280003) AM_READ_PORT("INSEC") - AM_RANGE(0x1f290000, 0x1f29007f) AM_DEVREADWRITE8("rtc", rtc65271_rtc_r, rtc65271_rtc_w, 0x00ff00ff) - AM_RANGE(0x1f2a0000, 0x1f2a007f) AM_DEVREADWRITE8("rtc", rtc65271_xram_r, rtc65271_xram_w, 0x00ff00ff) + AM_RANGE(0x1f290000, 0x1f29007f) AM_DEVREADWRITE8_MODERN("rtc", rtc65271_device, rtc_r, rtc_w, 0x00ff00ff) + AM_RANGE(0x1f2a0000, 0x1f2a007f) AM_DEVREADWRITE8_MODERN("rtc", rtc65271_device, xram_r, xram_w, 0x00ff00ff) AM_RANGE(0x1f2b0000, 0x1f2b00ff) AM_WRITE(twinkle_output_w) AM_RANGE(0x1fc00000, 0x1fc7ffff) AM_ROM AM_SHARE("share2") AM_REGION("user1", 0) /* bios */ AM_RANGE(0x80000000, 0x803fffff) AM_RAM AM_SHARE("share1") /* ram mirror */ @@ -874,6 +876,11 @@ I2CMEM_SLAVE_ADDRESS, 0, 0x100 }; +static const rtc65271_interface twinkle_rtc = +{ + DEVCB_NULL +}; + static MACHINE_CONFIG_START( twinkle, twinkle_state ) /* basic machine hardware */ MCFG_CPU_ADD( "maincpu", CXD8530CQ, XTAL_67_7376MHz ) @@ -891,7 +898,7 @@ MCFG_I2CMEM_ADD("security",i2cmem_interface) MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) - MCFG_RTC65271_ADD("rtc", NULL) + MCFG_RTC65271_ADD("rtc", twinkle_rtc) /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x200000, XTAL_53_693175MHz ) diff -Nru mame-0.144/src/mame/drivers/twins.c mame-0.145/src/mame/drivers/twins.c --- mame-0.144/src/mame/drivers/twins.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/twins.c 2012-02-06 21:30:39.000000000 +0000 @@ -110,14 +110,14 @@ state->m_pal = auto_alloc_array(machine, UINT16, 0x100); } -static SCREEN_UPDATE(twins) +static SCREEN_UPDATE_IND16(twins) { - twins_state *state = screen->machine().driver_data(); + twins_state *state = screen.machine().driver_data(); int y,x,count; int i; static const int xxx=320,yyy=204; - bitmap_fill(bitmap, 0, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); for (i=0;i<0x100;i++) { @@ -133,7 +133,7 @@ b = (dat>>10) & 0x1f; b = BITSWAP8(b,7,6,5,0,1,2,3,4); - palette_set_color_rgb(screen->machine(),i, pal5bit(r),pal5bit(g),pal5bit(b)); + palette_set_color_rgb(screen.machine(),i, pal5bit(r),pal5bit(g),pal5bit(b)); } count=0; @@ -141,7 +141,7 @@ { for(x=0;xm_videoram)[BYTE_XOR_LE(count)]; + bitmap.pix16(y, x) = ((UINT8 *)state->m_videoram)[BYTE_XOR_LE(count)]; count++; } } @@ -191,10 +191,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320,256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE(twins) + MCFG_SCREEN_UPDATE_STATIC(twins) MCFG_PALETTE_LENGTH(0x100) @@ -217,14 +216,14 @@ state->m_pal = auto_alloc_array(machine, UINT16, 0x1000); } -static SCREEN_UPDATE(twinsa) +static SCREEN_UPDATE_IND16(twinsa) { - twins_state *state = screen->machine().driver_data(); + twins_state *state = screen.machine().driver_data(); int y,x,count; int i; static const int xxx=320,yyy=204; - bitmap_fill(bitmap, 0, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); for (i=0;i<0x1000-3;i+=3) { @@ -233,7 +232,7 @@ g = state->m_pal[i+1]; b = state->m_pal[i+2]; - palette_set_color_rgb(screen->machine(),i/3, pal6bit(r), pal6bit(g), pal6bit(b)); + palette_set_color_rgb(screen.machine(),i/3, pal6bit(r), pal6bit(g), pal6bit(b)); } count=0; @@ -241,7 +240,7 @@ { for(x=0;xm_videoram)[BYTE_XOR_LE(count)]; + bitmap.pix16(y, x) = ((UINT8 *)state->m_videoram)[BYTE_XOR_LE(count)]; count++; } } @@ -282,10 +281,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320,256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) - MCFG_SCREEN_UPDATE(twinsa) + MCFG_SCREEN_UPDATE_STATIC(twinsa) MCFG_PALETTE_LENGTH(0x1000) diff -Nru mame-0.144/src/mame/drivers/tx1.c mame-0.145/src/mame/drivers/tx1.c --- mame-0.144/src/mame/drivers/tx1.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/tx1.c 2012-02-06 21:30:35.000000000 +0000 @@ -718,20 +718,17 @@ MCFG_DEFAULT_LAYOUT(layout_triphsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART) - MCFG_SCREEN_UPDATE(tx1) + MCFG_SCREEN_UPDATE_STATIC(tx1_left) MCFG_SCREEN_ADD("cscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART) - MCFG_SCREEN_UPDATE(tx1) + MCFG_SCREEN_UPDATE_STATIC(tx1_middle) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(TX1_PIXEL_CLOCK, TX1_HTOTAL, TX1_HBEND, TX1_HBSTART, TX1_VTOTAL, TX1_VBEND, TX1_VBSTART) - MCFG_SCREEN_UPDATE(tx1) - MCFG_SCREEN_EOF(tx1) + MCFG_SCREEN_UPDATE_STATIC(tx1_right) + MCFG_SCREEN_VBLANK_STATIC(tx1) MCFG_VIDEO_START(tx1) @@ -770,20 +767,17 @@ MCFG_DEFAULT_LAYOUT(layout_triphsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART) - MCFG_SCREEN_UPDATE(buggyboy) + MCFG_SCREEN_UPDATE_STATIC(buggyboy_left) MCFG_SCREEN_ADD("cscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART) - MCFG_SCREEN_UPDATE(buggyboy) + MCFG_SCREEN_UPDATE_STATIC(buggyboy_middle) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART) - MCFG_SCREEN_UPDATE(buggyboy) - MCFG_SCREEN_EOF(buggyboy) + MCFG_SCREEN_UPDATE_STATIC(buggyboy_right) + MCFG_SCREEN_VBLANK_STATIC(buggyboy) MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(buggyboy) @@ -823,10 +817,9 @@ MCFG_NVRAM_ADD_0FILL("nvram") MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(BB_PIXEL_CLOCK, BB_HTOTAL, BB_HBEND, BB_HBSTART, BB_VTOTAL, BB_VBEND, BB_VBSTART) - MCFG_SCREEN_UPDATE(buggybjr) - MCFG_SCREEN_EOF(buggyboy) + MCFG_SCREEN_UPDATE_STATIC(buggybjr) + MCFG_SCREEN_VBLANK_STATIC(buggyboy) MCFG_PALETTE_LENGTH(256) MCFG_PALETTE_INIT(buggyboy) diff -Nru mame-0.144/src/mame/drivers/uapce.c mame-0.145/src/mame/drivers/uapce.c --- mame-0.144/src/mame/drivers/uapce.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/uapce.c 2012-02-06 21:30:38.000000000 +0000 @@ -21,15 +21,82 @@ - game time is controlled using software loop - with current clock it takes lots of time until credit expires. Should Z80 clock be raised? - tone played by jamma if board is not emulated + + A kit owned by collector has following contents: + -x1 NOS boxed NEC arcade unit with all connectors + -x1 NOS boxed Keith Courage (custom/prototype PCB) with NOS marquee + -x1 Pacland standard Hucard WITH arcade cabinet marquee (this proves that while this is a standard card, it was sold by United Amusements with the intention of being used in the arcade unit) + -x1 Alien Crush standard Hucard with arcade "how to play" placard. Same as above.... proof this was sold for the arcade unit and not as a home card + -x1 Ninja Warriors standard Hucard + -x1 Victory Run standardd Hucard + -x1 Plexiglass control panel overlay (used) + +In the February 1990 issue of Video Games & Computer Entertainment magazine, there was a list of +all of the available UA produced Hu-Cards (at the current time of the article was published). +The article mentions that the UA Hu-Cards were not compatible with the TG-16 gaming console. +- Keith Courage in the Alpha Zones +- World Class Baseball +- Blazing Lazers +- Alien Crush +- China Warrior + +Blazing Lazers dump notes: +---------------------------------------------------------------------------- +Game software +---------------------------------------------------------------------------- + +An EPROM-based HuCard manufactured by NEC (PCB ID: PWD-703) is used to +store the game program. It supports four uPD27C2001 (256Kx8) EPROMs as +well as 27C010s for total ROM capacity of 1MB down to 128K in various +configurations. + +Jumper settings: + +J1 +Pos. 1 : Map IC1 to 000000-03FFFF (256K) +Pos. 2 : Map IC1 to 000000-01FFFF (128K) + +J2 +Pos. 1 : Map IC2 to 040000-07FFFF (256K) +Pos. 2 : Map IC2 to 080000-09FFFF (128K) +Pos. 3 : Map IC2 to 020000-03FFFF (128K) + +J3 +Pos. 1 : Map IC3 to 080000-0BFFFF (256K) +Pos. 2 : Map IC3 to 080000-09FFFF (128K) +Pos. 3 : Map IC3 to 040000-05FFFF (128K) + +J4 +Pos. 1 : Map IC4 to 0C0000-0FFFFF (256K) +Pos. 2 : Map IC4 to 0A0000-0BFFFF (128K) +Pos. 3 : Map IC4 to 060000-07FFFF (128K) + +The board came with three EPROMs in the following configuration: + +IC1 is a 27C010 mapped to 000000-01FFFF +IC2 is a 27C010 mapped to 020000-03FFFF +IC3 is a 27C010 mapped to 080000-09FFFF +IC4 is unpopulated + +The software was a modified version of "Blazing Lazers", identical to the +USA retail version with the region check (offsets 0 through $18) patched +with NOP to remove it. The interface board is connected to a PC-Engine +console rather than a TurboGrafx-16, which would cause the region check to +fail. + + +Keith Courage In Alpha Zones: dump was made from PC-Engine game dump of US version, + with region check nop'ed out. +Alien Crush & Pac_Land: dumps made from PC-Engine dumps of JP versions */ #include "emu.h" -#include "deprecat.h" #include "cpu/z80/z80.h" #include "cpu/h6280/h6280.h" #include "sound/c6280.h" #include "machine/pcecommn.h" #include "video/vdc.h" +#include "sound/discrete.h" class uapce_state : public driver_device @@ -41,6 +108,14 @@ UINT8 m_jamma_if_control_latch; }; +#define UAPCE_SOUND_EN NODE_10 +#define UAPCE_TONE_752 NODE_11 + +static DISCRETE_SOUND_START(uapce) + DISCRETE_INPUT_LOGIC(UAPCE_SOUND_EN) + DISCRETE_SQUAREWFIX(UAPCE_TONE_752, UAPCE_SOUND_EN, 752, DEFAULT_TTL_V_LOGIC_1, 50, DEFAULT_TTL_V_LOGIC_1, 0) // 752Hz + DISCRETE_OUTPUT(UAPCE_TONE_752, 100) +DISCRETE_SOUND_END static WRITE8_HANDLER( jamma_if_control_latch_w ) @@ -49,16 +124,42 @@ UINT8 diff = data ^ state->m_jamma_if_control_latch; state->m_jamma_if_control_latch = data; +/* D7 : Controls relay which connects the PCE R-AUDIO output to the common audio path. + (1= Relay closed, 0= Relay open) */ space->machine().sound().system_enable( (data >> 7) & 1 ); +/* D6 : Output to JAMMA connector KEY pin. Connected to /RESET on the PCE backplane connector. + (1= /RESET not asserted, 0= /RESET asserted) */ + if ( diff & 0x40 ) { cputag_set_input_line(space->machine(), "maincpu", INPUT_LINE_RESET, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); } - // bit 3 - enable 752 Hz (D-3) square wave output +/* D5 : Connected to a TIP31 which may control the coin meter: + B = Latched D5 + C = JAMMA pin 'z' + E = Ground + + Pin 'z' is a normally ground connection, but on this board it is isolated from ground. + The wiring harness also has the corresponding wire separate from the others. */ + coin_counter_w(space->machine(), 0, BIT(data,5)); + +/* D4 : Connects the START1 switch input from the JAMMA connector to the + "RUN" key input of the control pad multiplexer. + (1= "RUN" input connected to START1 switch, 0= "RUN" input always '1') */ + +/* D3 : Controls the RESET input of timer B of a 556 IC, enabling a + 752 Hz (D-3) square wave to be output on the common audio path. + (1= Tone output ON, 0= Tone output OFF) */ + + discrete_sound_w(space->machine().device("discrete"), UAPCE_SOUND_EN, BIT(data,3)); + +/* D2 : Not latched, though software writes to this bit like it is. */ - logerror( "Writing control latch with %02X\n", data ); +/* D1 : Not latched. */ + +/* D0 : Not latched. */ } static READ8_HANDLER( jamma_if_control_latch_r ) @@ -160,15 +261,18 @@ PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0x38, 0x00, "Game timer (?)" ) - PORT_DIPSETTING( 0x00, "Game timer setting 1" ) - PORT_DIPSETTING( 0x08, "Game timer setting 2" ) - PORT_DIPSETTING( 0x10, "Game timer setting 3" ) - PORT_DIPSETTING( 0x18, "Game timer setting 4" ) - PORT_DIPSETTING( 0x20, "Game timer setting 5" ) - PORT_DIPSETTING( 0x28, "Game timer setting 6" ) - PORT_DIPSETTING( 0x30, "Game timer setting 7" ) - PORT_DIPSETTING( 0x38, "Game timer setting 8" ) + PORT_DIPNAME( 0x38, 0x10, "Time" ) + PORT_DIPSETTING( 0x00, "Untimed Play" ) + PORT_DIPSETTING( 0x08, "1 minute Timed Play" ) + PORT_DIPSETTING( 0x10, "3 minute Timed Play" ) + PORT_DIPSETTING( 0x18, "5 minute Timed Play" ) + PORT_DIPSETTING( 0x20, "7 minute Timed Play" ) + PORT_DIPSETTING( 0x28, "10 minute Timed Play" ) + PORT_DIPSETTING( 0x30, "12 minute Timed Play" ) + PORT_DIPSETTING( 0x38, "20 minute Timed Play" ) + PORT_DIPNAME( 0x40, 0x40, "Buy-In Feature" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -202,7 +306,7 @@ MCFG_CPU_ADD("maincpu", H6280, PCE_MAIN_CLOCK/3) MCFG_CPU_PROGRAM_MAP(pce_mem) MCFG_CPU_IO_MAP(pce_io) - MCFG_CPU_VBLANK_INT_HACK(pce_interrupt, VDC_LPF) + MCFG_TIMER_ADD_SCANLINE("scantimer", pce_interrupt, "screen", 0, 1) MCFG_CPU_ADD("sub", Z80, 1400000) MCFG_CPU_PROGRAM_MAP(z80_map) @@ -214,9 +318,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, VDC_WPF, 70, 70 + 512 + 32, VDC_LPF, 14, 14+242) - MCFG_SCREEN_UPDATE( pce ) + MCFG_SCREEN_UPDATE_STATIC( pce ) /* MCFG_GFXDECODE( pce_gfxdecodeinfo ) */ MCFG_PALETTE_LENGTH(1024) @@ -227,9 +330,12 @@ MCFG_SPEAKER_STANDARD_STEREO("lspeaker","rspeaker") MCFG_SOUND_ADD("c6280", C6280, PCE_MAIN_CLOCK/6) MCFG_SOUND_CONFIG(c6280_config) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.00) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.5) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.5) + MCFG_SOUND_ADD("discrete", DISCRETE, 0) + MCFG_SOUND_CONFIG_DISCRETE(uapce) + MCFG_SOUND_ROUTE(0, "rspeaker", 1.00) MACHINE_CONFIG_END ROM_START(blazlaz) @@ -242,9 +348,37 @@ ROM_LOAD( "u1.bin", 0x0000, 0x800, CRC(f5e538a9) SHA1(19ac9525c9ad6bea1789cc9e63cdb7fe949867d9) ) ROM_END +ROM_START(keith) + ROM_REGION( 0x0a0000, "maincpu", 0 ) + ROM_LOAD( "keith.ic1", 0x000000, 0x020000, BAD_DUMP CRC(d49d4e0d) SHA1(4ff8e7025dd1023e54a0f5bac52d7cecb7cb1430) ) + ROM_LOAD( "keith.ic2", 0x020000, 0x020000, BAD_DUMP CRC(133e5c8b) SHA1(8ebacd7b3887d10b28d8c672396c8850e8c0cdaf) ) + + ROM_REGION( 0x800, "sub", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x800, CRC(f5e538a9) SHA1(19ac9525c9ad6bea1789cc9e63cdb7fe949867d9) ) +ROM_END + +ROM_START(aliencr) + ROM_REGION( 0x0a0000, "maincpu", 0 ) + ROM_LOAD( "aliencr.bin", 0x000000, 0x040000, CRC(60edf4e1) SHA1(a1e6ad82b66a82c25e0a9e25fb8be370f49c8c2d) ) + + ROM_REGION( 0x800, "sub", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x800, CRC(f5e538a9) SHA1(19ac9525c9ad6bea1789cc9e63cdb7fe949867d9) ) +ROM_END + +ROM_START(paclandp) + ROM_REGION( 0x0a0000, "maincpu", 0 ) + ROM_LOAD( "paclandp.bin", 0x000000, 0x040000, CRC(14fad3ba) SHA1(fc0166da82ed3cf4a4e06fc6c73fd3184ba8bb3b) ) + + ROM_REGION( 0x800, "sub", 0 ) + ROM_LOAD( "u1.bin", 0x0000, 0x800, CRC(f5e538a9) SHA1(19ac9525c9ad6bea1789cc9e63cdb7fe949867d9) ) +ROM_END + static DRIVER_INIT(uapce) { DRIVER_INIT_CALL(pce); } GAME( 1989, blazlaz, 0, uapce, uapce, uapce, ROT0, "Hudson Soft", "Blazing Lazers", GAME_IMPERFECT_SOUND ) +GAME( 1989, keith, 0, uapce, uapce, uapce, ROT0, "Hudson Soft", "Keith Courage In Alpha Zones", GAME_IMPERFECT_SOUND ) +GAME( 1989, aliencr, 0, uapce, uapce, uapce, ROT0, "Hudson Soft", "Alien Crush", GAME_IMPERFECT_SOUND ) +GAME( 1989, paclandp,0, uapce, uapce, uapce, ROT0, "Namco", "Pac-Land (United Amusements PC Engine)", GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/ultraman.c mame-0.145/src/mame/drivers/ultraman.c --- mame-0.144/src/mame/drivers/ultraman.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ultraman.c 2012-02-06 21:30:39.000000000 +0000 @@ -238,10 +238,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(ultraman) + MCFG_SCREEN_UPDATE_STATIC(ultraman) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/ultratnk.c mame-0.145/src/mame/drivers/ultratnk.c --- mame-0.144/src/mame/drivers/ultratnk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/ultratnk.c 2012-02-06 21:30:39.000000000 +0000 @@ -303,10 +303,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, 0, 256, VTOTAL, 0, 224) - MCFG_SCREEN_UPDATE(ultratnk) - MCFG_SCREEN_EOF(ultratnk) + MCFG_SCREEN_UPDATE_STATIC(ultratnk) + MCFG_SCREEN_VBLANK_STATIC(ultratnk) MCFG_GFXDECODE(ultratnk) MCFG_PALETTE_LENGTH(10) diff -Nru mame-0.144/src/mame/drivers/ultrsprt.c mame-0.145/src/mame/drivers/ultrsprt.c --- mame-0.144/src/mame/drivers/ultrsprt.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/ultrsprt.c 2012-02-06 21:30:41.000000000 +0000 @@ -30,16 +30,16 @@ -static SCREEN_UPDATE( ultrsprt ) +static SCREEN_UPDATE_IND16( ultrsprt ) { - ultrsprt_state *state = screen->machine().driver_data(); + ultrsprt_state *state = screen.machine().driver_data(); int i, j; UINT8 *ram = (UINT8 *)state->m_vram; for (j=0; j < 400; j++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *dest = &bitmap.pix16(j); int fb_index = j * 1024; for (i=0; i < 512; i++) @@ -232,10 +232,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 400) MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 399) - MCFG_SCREEN_UPDATE(ultrsprt) + MCFG_SCREEN_UPDATE_STATIC(ultrsprt) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/umipoker.c mame-0.145/src/mame/drivers/umipoker.c --- mame-0.144/src/mame/drivers/umipoker.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/umipoker.c 2012-02-06 21:30:37.000000000 +0000 @@ -101,28 +101,28 @@ state->m_tilemap_2 = tilemap_create(machine, get_tile_info_2,tilemap_scan_rows,8,8,64,32); state->m_tilemap_3 = tilemap_create(machine, get_tile_info_3,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_tilemap_0,0); - tilemap_set_transparent_pen(state->m_tilemap_1,0); - tilemap_set_transparent_pen(state->m_tilemap_2,0); - tilemap_set_transparent_pen(state->m_tilemap_3,0); + state->m_tilemap_0->set_transparent_pen(0); + state->m_tilemap_1->set_transparent_pen(0); + state->m_tilemap_2->set_transparent_pen(0); + state->m_tilemap_3->set_transparent_pen(0); } -static SCREEN_UPDATE( umipoker ) +static SCREEN_UPDATE_IND16( umipoker ) { - umipoker_state *state = screen->machine().driver_data(); + umipoker_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_umipoker_scrolly[0]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_umipoker_scrolly[1]); - tilemap_set_scrolly(state->m_tilemap_2, 0, state->m_umipoker_scrolly[2]); - tilemap_set_scrolly(state->m_tilemap_3, 0, state->m_umipoker_scrolly[3]); + state->m_tilemap_0->set_scrolly(0, state->m_umipoker_scrolly[0]); + state->m_tilemap_1->set_scrolly(0, state->m_umipoker_scrolly[1]); + state->m_tilemap_2->set_scrolly(0, state->m_umipoker_scrolly[2]); + state->m_tilemap_3->set_scrolly(0, state->m_umipoker_scrolly[3]); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap,cliprect,state->m_tilemap_0,0,0); - tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); - tilemap_draw(bitmap,cliprect,state->m_tilemap_2,0,0); - tilemap_draw(bitmap,cliprect,state->m_tilemap_3,0,0); + state->m_tilemap_0->draw(bitmap, cliprect, 0,0); + state->m_tilemap_1->draw(bitmap, cliprect, 0,0); + state->m_tilemap_2->draw(bitmap, cliprect, 0,0); + state->m_tilemap_3->draw(bitmap, cliprect, 0,0); return 0; } @@ -171,7 +171,7 @@ umipoker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0,offset >> 1); + state->m_tilemap_0->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( umipoker_vram_1_w ) @@ -179,7 +179,7 @@ umipoker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1,offset >> 1); + state->m_tilemap_1->mark_tile_dirty(offset >> 1); } @@ -188,7 +188,7 @@ umipoker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_2[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_2,offset >> 1); + state->m_tilemap_2->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( umipoker_vram_3_w ) @@ -196,7 +196,7 @@ umipoker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_3[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_3,offset >> 1); + state->m_tilemap_3->mark_tile_dirty(offset >> 1); } static WRITE16_HANDLER( lamps_w ) @@ -662,10 +662,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, 48*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(umipoker) + MCFG_SCREEN_UPDATE_STATIC(umipoker) MCFG_GFXDECODE(umipoker) diff -Nru mame-0.144/src/mame/drivers/undrfire.c mame-0.145/src/mame/drivers/undrfire.c --- mame-0.144/src/mame/drivers/undrfire.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/undrfire.c 2012-02-06 21:30:35.000000000 +0000 @@ -728,10 +728,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(undrfire) + MCFG_SCREEN_UPDATE_STATIC(undrfire) MCFG_GFXDECODE(undrfire) MCFG_PALETTE_LENGTH(16384) @@ -765,10 +764,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(cbombers) + MCFG_SCREEN_UPDATE_STATIC(cbombers) MCFG_GFXDECODE(cbombers) MCFG_PALETTE_LENGTH(16384) diff -Nru mame-0.144/src/mame/drivers/unico.c mame-0.145/src/mame/drivers/unico.c --- mame-0.144/src/mame/drivers/unico.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/unico.c 2012-02-06 21:30:39.000000000 +0000 @@ -599,10 +599,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(unico) + MCFG_SCREEN_UPDATE_STATIC(unico) MCFG_GFXDECODE(unico) MCFG_PALETTE_LENGTH(8192) @@ -645,10 +644,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(unico) + MCFG_SCREEN_UPDATE_STATIC(unico) MCFG_GFXDECODE(unico) MCFG_PALETTE_LENGTH(8192) @@ -688,10 +686,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(zeropnt2) + MCFG_SCREEN_UPDATE_STATIC(zeropnt2) MCFG_GFXDECODE(unico) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/unkfr.c mame-0.145/src/mame/drivers/unkfr.c --- mame-0.144/src/mame/drivers/unkfr.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/unkfr.c 2012-02-06 21:30:39.000000000 +0000 @@ -13,13 +13,15 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" class unkfr_state : public driver_device { public: unkfr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag) { } }; static INPUT_PORTS_START( unkfr ) @@ -737,9 +739,5 @@ ROM_END - - -GAME( 19??, unkfr , 0 , unkfr, unkfr, 0, ROT0, "unknown", "Unknown Fruit Machine ROMs (set 1)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) -GAME( 19??, unkfra , 0 , unkfr, unkfr, 0, ROT0, "unknown", "Unknown Fruit Machine ROMs (set 2)" , GAME_NO_SOUND|GAME_REQUIRES_ARTWORK|GAME_NOT_WORKING|GAME_MECHANICAL) - - +GAME(19??, unkfr, 0, unkfr, unkfr, 0, ROT0, "", "Unknown Fruit Machine ROMs (set 1)", GAME_IS_SKELETON_MECHANICAL) +GAME(19??, unkfra, 0, unkfr, unkfr, 0, ROT0, "", "Unknown Fruit Machine ROMs (set 2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/unkpcp.c mame-0.145/src/mame/drivers/unkpcp.c --- mame-0.144/src/mame/drivers/unkpcp.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/unkpcp.c 2012-02-06 21:30:35.000000000 +0000 @@ -3,6 +3,8 @@ Z80 based */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -10,18 +12,25 @@ { public: unkpcp_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( unkpcp_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( unkpcp_map, AS_PROGRAM, 8, unkpcp_state ) AM_RANGE(0x0000, 0xefff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( unkpcp_portmap, AS_IO, 8 ) +static ADDRESS_MAP_START( unkpcp_portmap, AS_IO, 8, unkpcp_state ) ADDRESS_MAP_END @@ -30,16 +39,12 @@ static MACHINE_CONFIG_START( unkpcp, unkpcp_state ) - MCFG_CPU_ADD("maincpu", Z80, 4000000) /* ?? Mhz */ MCFG_CPU_PROGRAM_MAP(unkpcp_map) MCFG_CPU_IO_MAP(unkpcp_portmap) - MACHINE_CONFIG_END - - ROM_START( up_bluec ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "bchip.p1", 0x0000, 0x002000, CRC(fe41206d) SHA1(41c9ecc26a26def5cf63209274f6b08e00de7889) ) @@ -64,9 +69,6 @@ ROM_END - - - ROM_START( up_dbldx ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "double deluxe 14.2.90 p1.bin", 0x0000, 0x002000, CRC(d04288e1) SHA1(0101aa58b327322b192bef20ca698c0d3a9a02d0) ) @@ -103,7 +105,6 @@ ROM_END - ROM_START( up_sstrk ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "starstruck 4.80 cash p1.bin", 0x0000, 0x002000, CRC(4b504e9b) SHA1(0d4de867b5373c944b9819479cb0aeb9786ceac9) ) @@ -123,8 +124,6 @@ ROM_END - - ROM_START( up_xpres ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "xpressp1.bin", 0x0000, 0x002000, CRC(f5acbde7) SHA1(c88f5768c488663c23fd4b6a62ffeb7d07dbb317) ) @@ -154,18 +153,13 @@ ROM_END - - - - DRIVER_INIT( unkpcp ) { - } -GAME( 199?, up_dbldx ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Double Deluxe (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, up_nudbk ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Nudge Break (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, up_sstrk ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Starstruck (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, up_xpres ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Xpress (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, up_roll ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Roll Up (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) -GAME( 199?, up_bluec ,0 ,unkpcp,unkpcp,unkpcp,ROT0, "Pcp","Blue Chip (Pcp)", GAME_NOT_WORKING|GAME_REQUIRES_ARTWORK|GAME_MECHANICAL|GAME_NO_SOUND ) +GAME(199?, up_dbldx, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Double Deluxe (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, up_nudbk, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Nudge Break (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, up_sstrk, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Starstruck (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, up_xpres, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Xpress (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, up_roll, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Roll Up (Pcp)", GAME_IS_SKELETON_MECHANICAL ) +GAME(199?, up_bluec, 0, unkpcp, unkpcp, unkpcp, ROT0, "Pcp", "Blue Chip (Pcp)", GAME_IS_SKELETON_MECHANICAL ) diff -Nru mame-0.144/src/mame/drivers/upscope.c mame-0.145/src/mame/drivers/upscope.c --- mame-0.144/src/mame/drivers/upscope.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/upscope.c 2012-02-06 21:30:42.000000000 +0000 @@ -322,10 +322,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.997) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512*2, 262) MCFG_SCREEN_VISIBLE_AREA((129-8)*2, (449+8-1)*2, 44-8, 244+8-1) - MCFG_SCREEN_UPDATE(amiga) + MCFG_SCREEN_UPDATE_STATIC(amiga) MCFG_PALETTE_LENGTH(4096) MCFG_PALETTE_INIT(amiga) diff -Nru mame-0.144/src/mame/drivers/usgames.c mame-0.145/src/mame/drivers/usgames.c --- mame-0.144/src/mame/drivers/usgames.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/usgames.c 2012-02-06 21:30:42.000000000 +0000 @@ -242,10 +242,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(7*8, 57*8-1, 0*8, 31*8-1) - MCFG_SCREEN_UPDATE(usgames) + MCFG_SCREEN_UPDATE_STATIC(usgames) MCFG_GFXDECODE(usgames) MCFG_PALETTE_LENGTH(2*256) diff -Nru mame-0.144/src/mame/drivers/vamphalf.c mame-0.145/src/mame/drivers/vamphalf.c --- mame-0.144/src/mame/drivers/vamphalf.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/vamphalf.c 2012-02-06 21:30:34.000000000 +0000 @@ -8,40 +8,48 @@ Games Supported: - Minigame Cool Collection (c) 1999 SemiCom - Jumping Break (c) 1999 F2 System - Lup Lup Puzzle (c) 1999 Omega System (version 3.0 and 2.9) - Puzzle Bang Bang (c) 1999 Omega System (version 2.8) - Super Lup Lup Puzzle (c) 1999 Omega System (version 4.0) - Vamf 1/2 (c) 1999 Danbi & F2 System (Europe version) - Vamp 1/2 (c) 1999 Danbi & F2 System (Korea version) - Date Quiz Go Go Episode 2 (c) 2000 SemiCom - Mission Craft (c) 2000 Sun (version 2.4) - Mr. Dig (c) 2000 Sun - Final Godori (c) 2001 SemiCom (version 2.20.5915) - Wyvern Wings (c) 2001 SemiCom - Mr. Kicker (c) 2001 SemiCom [1] - Age Of Heroes - Silkroad 2 (c) 2001 Unico (v0.63 - 2001/02/07) + Minigame Cool Collection (c) 1999 SemiCom + Jumping Break (c) 1999 F2 System + Lup Lup Puzzle (c) 1999 Omega System (version 3.0 and 2.9) + Puzzle Bang Bang (c) 1999 Omega System (version 2.8) + Super Lup Lup Puzzle (c) 1999 Omega System (version 4.0) + Vamf 1/2 (c) 1999 Danbi & F2 System (Europe version) + Vamp 1/2 (c) 1999 Danbi & F2 System (Korea version) + Date Quiz Go Go Episode 2 (c) 2000 SemiCom + Mission Craft (c) 2000 Sun (version 2.4) + Mr. Dig (c) 2000 Sun + Final Godori (c) 2001 SemiCom (version 2.20.5915) + Wyvern Wings (c) 2001 SemiCom + Mr. Kicker (c) 2001 SemiCom [1] + Toy Land Adventure (c) 2001 SemiCom + Age Of Heroes - Silkroad 2 (c) 2001 Unico (v0.63 - 2001/02/07) + Boong-Ga Boong-Ga (Spank 'em) (c) 2001 Taff System Real games bugs: - dquizgo2: bugged video test Notes: - [1] Mr. Kicker game code crashes if the eeprom values are empty, because it replaces the SP register with a bogus value at PC = $18D0 before crashing. - It could be an original game bug or a hyperstone core bug + [1] Mr. Kicker game code crashes if the eeprom values are empty, because it replaces + the SP register with a bogus value at PC = $18D0 before crashing. It could be an + original game bug or a hyperstone core bug. Also happens with High Score update. - Mr Kicker is also known to exist (not dumped) on the F-E1-16-010 PCB - that Semicom also used for Date Quiz Go Go Episode 2 game. + Mr Kicker is also known to exist (not dumped) on the F-E1-16-010 PCB that + Semicom also used for Toy Land Adventure & SemiComDate Quiz Go Go Episode 2 game. + + Boong-Ga Boong-Ga: the test mode is usable with a standard input configuration like the "common" one Undumped Semicom games on similar hardware: Wivern Wings - Semicom's orginal release with alt spelling of title Red Wyvern - A semi-sequel or update? - Toy Land Adventure (c) 2001 - PCB photo shows Hyperstone based hardware Same time era, but unknown hardware: Gaia The last Choice of the Earth (c) 1998 (might be Byron Future Assault type hardware) Diet Family (c) 2001 Choice III: Joker's Dream (c) 2001 +TODO: +- boonggab: simulate photo sensors with a "stroke strength" +- boonggab: what are sensors bit used for? are they used in the japanese version? + *********************************************************************/ #include "emu.h" @@ -57,7 +65,10 @@ { public: vamphalf_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag) + { + m_has_extra_gfx = 0; + } UINT16 *m_tiles; UINT16 *m_wram; @@ -71,9 +82,9 @@ UINT16 m_semicom_prot_data[2]; UINT16 m_finalgdr_backupram_bank; UINT8 *m_finalgdr_backupram; + int m_has_extra_gfx; }; - static READ16_DEVICE_HANDLER( eeprom_r ) { if(offset) @@ -122,9 +133,9 @@ static WRITE16_HANDLER( flipscreen_w ) { - vamphalf_state *state = space->machine().driver_data(); if(offset) { + vamphalf_state *state = space->machine().driver_data(); state->m_flipscreen = data & state->m_flip_bit; } } @@ -239,6 +250,49 @@ downcast(device)->set_bank_base(0x40000 * (data & 0x3)); } +static WRITE16_DEVICE_HANDLER( boonggab_oki_bank_w ) +{ + if(offset) + downcast(device)->set_bank_base(0x40000 * (data & 0x7)); +} + +static WRITE16_HANDLER( boonggab_prize_w ) +{ + if(offset) + { + // data & 0x01 == motor 1 on + // data & 0x02 == motor 2 on + // data & 0x04 == motor 3 on + // data & 0x08 == prize power 1 on + // data & 0x10 == prize lamp 1 off + // data & 0x20 == prize lamp 2 off + // data & 0x40 == prize lamp 3 off + } +} + +static WRITE16_HANDLER( boonggab_lamps_w ) +{ + if(offset == 1) + { + // data & 0x0001 == lamp 7 on (why is data & 0x8000 set too?) + // data & 0x0002 == lamp 8 on + // data & 0x0004 == lamp 9 on + // data & 0x0008 == lamp 10 on + // data & 0x0010 == lamp 11 on + // data & 0x0020 == lamp 12 on + // data & 0x0040 == lamp 13 on + } + else if(offset == 3) + { + // data & 0x0100 == lamp 0 on + // data & 0x0200 == lamp 1 on + // data & 0x0400 == lamp 2 on + // data & 0x0800 == lamp 3 on + // data & 0x1000 == lamp 4 on + // data & 0x2000 == lamp 5 on + // data & 0x4000 == lamp 6 on + } +} static ADDRESS_MAP_START( common_map, AS_PROGRAM, 16 ) AM_RANGE(0x00000000, 0x001fffff) AM_RAM AM_BASE_MEMBER(vamphalf_state, m_wram) @@ -282,7 +336,7 @@ AM_RANGE(0x4c0, 0x4c1) AM_NOP // return 0, when oki chip is read / written AM_RANGE(0x4c2, 0x4c3) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) AM_RANGE(0x540, 0x543) AM_DEVWRITE8("ymsnd", ym2151_register_port_w, 0x00ff) - AM_RANGE(0x546, 0x547) AM_DEVREADWRITE8("ymsnd", ym2151_status_port_r, ym2151_data_port_w, 0x00ff) + AM_RANGE(0x544, 0x547) AM_DEVREADWRITE8("ymsnd", ym2151_status_port_r, ym2151_data_port_w, 0x00ff) AM_RANGE(0x7c0, 0x7c3) AM_DEVREAD("eeprom", eeprom_r) ADDRESS_MAP_END @@ -338,7 +392,6 @@ AM_RANGE(0x7c00, 0x7c03) AM_READ_PORT("SYSTEM") ADDRESS_MAP_END - static ADDRESS_MAP_START( jmpbreak_io, AS_IO, 16 ) AM_RANGE(0x0c0, 0x0c3) AM_NOP // ? AM_RANGE(0x100, 0x103) AM_WRITENOP // ? @@ -380,6 +433,22 @@ AM_RANGE(0x0680, 0x0683) AM_DEVWRITE("oki_2", aoh_oki_bank_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( boonggab_io, AS_IO, 16 ) + AM_RANGE(0x0c0, 0x0c3) AM_DEVREAD("eeprom", eeprom_r) + AM_RANGE(0x200, 0x203) AM_NOP // seems unused + AM_RANGE(0x300, 0x303) AM_WRITE(flipscreen_w) + AM_RANGE(0x400, 0x403) AM_READ_PORT("SYSTEM") + AM_RANGE(0x404, 0x407) AM_READ_PORT("P1_P2") + AM_RANGE(0x408, 0x40b) AM_DEVWRITE("eeprom", eeprom_w) + AM_RANGE(0x410, 0x413) AM_WRITE(boonggab_prize_w) + AM_RANGE(0x414, 0x41b) AM_WRITE(boonggab_lamps_w) + AM_RANGE(0x600, 0x603) AM_DEVWRITE("oki", boonggab_oki_bank_w) + AM_RANGE(0x700, 0x701) AM_NOP // return 0, when oki chip is read / written + AM_RANGE(0x702, 0x703) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) + AM_RANGE(0x740, 0x743) AM_DEVWRITE8("ymsnd", ym2151_register_port_w, 0x00ff) + AM_RANGE(0x744, 0x747) AM_DEVREADWRITE8("ymsnd", ym2151_status_port_r, ym2151_data_port_w, 0x00ff) +ADDRESS_MAP_END + /* Sprite list: @@ -400,17 +469,17 @@ Offset+3 -------x xxxxxxxx X offs */ -static void draw_sprites(screen_device *screen, bitmap_t *bitmap) +static void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap) { - vamphalf_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + vamphalf_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; UINT32 cnt; int block, offs; int code,color,x,y,fx,fy; rectangle clip; - clip.min_x = screen->visible_area().min_x; - clip.max_x = screen->visible_area().max_x; + clip.min_x = screen.visible_area().min_x; + clip.max_x = screen.visible_area().max_x; for (block=0; block<0x8000; block+=0x800) { @@ -437,6 +506,12 @@ code = state->m_tiles[offs+1]; color = (state->m_tiles[offs+2] >> state->m_palshift) & 0x7f; + // boonggab + if(state->m_has_extra_gfx) + { + code |= ((state->m_tiles[offs+2] & 0x100) << 8); + } + x = state->m_tiles[offs+3] & 0x01ff; y = 256 - (state->m_tiles[offs] & 0x00ff); @@ -469,22 +544,22 @@ y = 256 - y; } - drawgfx_transpen(bitmap,&clip,gfx,code,color,fx,fy,x,y,0); + drawgfx_transpen(bitmap,clip,gfx,code,color,fx,fy,x,y,0); } } } -static void draw_sprites_aoh(screen_device *screen, bitmap_t *bitmap) +static void draw_sprites_aoh(screen_device &screen, bitmap_ind16 &bitmap) { - vamphalf_state *state = screen->machine().driver_data(); - const gfx_element *gfx = screen->machine().gfx[0]; + vamphalf_state *state = screen.machine().driver_data(); + const gfx_element *gfx = screen.machine().gfx[0]; UINT32 cnt; int block, offs; int code,color,x,y,fx,fy; rectangle clip; - clip.min_x = screen->visible_area().min_x; - clip.max_x = screen->visible_area().max_x; + clip.min_x = screen.visible_area().min_x; + clip.max_x = screen.visible_area().max_x; for (block=0; block<0x8000; block+=0x800) { @@ -523,26 +598,58 @@ y = 256 - y; } - drawgfx_transpen(bitmap,&clip,gfx,code,color,fx,fy,x,y,0); + drawgfx_transpen(bitmap,clip,gfx,code,color,fx,fy,x,y,0); } } } -static SCREEN_UPDATE( common ) +static SCREEN_UPDATE_IND16( common ) { - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); draw_sprites(screen, bitmap); return 0; } -static SCREEN_UPDATE( aoh ) +static SCREEN_UPDATE_IND16( aoh ) { - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); draw_sprites_aoh(screen, bitmap); return 0; } +static CUSTOM_INPUT( boonggab_photo_sensors_r ) +{ + static const UINT16 photo_sensors_table[8] = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; + UINT8 res = input_port_read(field.machine(), "PHOTO_SENSORS"); + + switch(res) + { + case 0x01: + return photo_sensors_table[1]; // 5 - 7 points + + case 0x02: + return photo_sensors_table[2]; // 8 - 10 points + + case 0x04: + return photo_sensors_table[3]; // 11 - 13 points + + case 0x08: + return photo_sensors_table[4]; // 14 - 16 points + + case 0x10: + return photo_sensors_table[5]; // 17 - 19 points + + case 0x20: + return photo_sensors_table[6]; // 20 - 22 points + + case 0x40: + return photo_sensors_table[7]; // 23 - 25 points + } + + return photo_sensors_table[0]; +} + static INPUT_PORTS_START( common ) PORT_START("P1_P2") @@ -647,6 +754,44 @@ PORT_BIT( 0xff000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +static INPUT_PORTS_START( boonggab ) + PORT_START("P1_P2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor 1 + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor 2 + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_SPECIAL ) // sensor 3 + PORT_BIT( 0x3800, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(boonggab_photo_sensors_r, NULL) // photo sensors 1, 2 and 3 + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("SYSTEM") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE ) + PORT_SERVICE_NO_TOGGLE( 0x0010, IP_ACTIVE_LOW ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("PHOTO_SENSORS") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(1) +INPUT_PORTS_END + static const gfx_layout sprites_layout = { 16,16, @@ -682,10 +827,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(31, 350, 16, 255) - MCFG_SCREEN_UPDATE(common) + MCFG_SCREEN_UPDATE_STATIC(common) MCFG_PALETTE_LENGTH(0x8000) MCFG_GFXDECODE(vamphalf) @@ -812,10 +956,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.185) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 512) MCFG_SCREEN_VISIBLE_AREA(64, 511-64, 16, 255-16) - MCFG_SCREEN_UPDATE(aoh) + MCFG_SCREEN_UPDATE_STATIC(aoh) MCFG_PALETTE_LENGTH(0x8000) MCFG_GFXDECODE(vamphalf) @@ -836,6 +979,13 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( boonggab, common ) + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_IO_MAP(boonggab_io) + + MCFG_FRAGMENT_ADD(sound_ym_oki) +MACHINE_CONFIG_END + /* Vamp 1/2 (Semi Vamp) @@ -1201,12 +1351,57 @@ ROM_LOAD( "cm-vrom1.020", 0x00000, 0x40000, CRC(fcc28081) SHA1(44031df0ee28ca49df12bcb73c83299fac205e21) ) ROM_END + /* Date Quiz Go Go Episode 2 SemiCom, 2000 +PCB Layout +---------- + F-E1-16-010 ++-----------------------------------------------+ +| VR1 YM3012 VROM1 | +| YM2151 M6295 ROML03 ROMU03| +| CRAM2 ROML02 ROMU02| +| CRAM1 ROML01 ROMU01| +| MEM1L ROML00 ROMU00| +|J MEM1U | +|A MEM2 +----------++----------+ | +|M | || | | +|M MEM3 |Quicklogic||Quicklogic| 2| +|A | QL2003- || QL2003- | 8| +| MEM6 | XPL84C || XPL84C | M| +| | || | H| +| MEM7 +----------++----------+ z| +| GAL | +| 93C46 ROM1 | +|P1 P2 50MHz E1-16T DRAM1 ROM2 | ++-----------------------------------------------+ + +Notes: +CPU - Hyperstone E1-16T @ 50.000MHz + +DRAM1 - LG Semi GM71C18163 1M x16 EDO DRAM (SOJ44) +CRAMx - W24M257AK-15 32K x8 SRAM (SOJ28) +MEMx - UM61256FK-15 32K x8 SRAM (SOJ28) + +Oki M6295 rebaged as AD-65 +YM3012/YM2151 rebaged as BS902/KA51 + + P1 - Reset push button + P2 - Setup push button +VR1 - Volume adjust pot + +ROMs: + ROML00 & ROMH00 - Macronix MX29F1610MC-12 SOP44 16MBit FlashROM + ROML01 & ROMH01 - Macronix MX29F1610MC-12 SOP44 16MBit FlashROM + ROML02 & ROMH02 - Macronix MX29F1610MC-12 SOP44 16MBit FlashROM + ROML03 & ROMH03 - Unpopulated space for MX29F1610MC-12 SOP44 16MBit FlashROM + VROM1 - 27C020 2MBit DIP32 EPROM + ROM1 - 27C040 4MBit DIP32 EPROM + ROM2 - 27C040 4MBit DIP32 EPROM */ @@ -1231,6 +1426,82 @@ /* +Toy Land Adventure +SemiCom, 2001 + +PCB Layout +---------- + +F-E1-16-010 ++-----------------------------------------------+ +| VR1 YM3012 VROM1 | +| YM2151 M6295 ROML03 ROMU03| +| CRAM2 ROML02 ROMU02| +| CRAM1 ROML01 ROMU01| +| MEM1L ROML00 ROMU00| +|J MEM1U | +|A MEM2 +----------++----------+ | +|M | || | | +|M MEM3 |Quicklogic||Quicklogic| 2| +|A | QL2003- || QL2003- | 8| +| MEM6 | XPL84C || XPL84C | M| +| | || | H| +| MEM7 +----------++----------+ z| +| GAL | +| 93C46 ROM1* | +|P1 P2 50MHz E1-16T DRAM1 ROM2 | ++-----------------------------------------------+ + +Notes: +CPU - Hyperstone E1-16T @ 50.000MHz + +DRAM1 - LG Semi GM71C18163 1M x16 EDO DRAM (SOJ44) +CRAMx - W24M257AK-15 32K x8 SRAM (SOJ28) +MEMx - UM61256FK-15 32K x8 SRAM (SOJ28) + +Oki M6295 rebaged as AD-65 +YM3012/YM2151 rebaged as BS902/KA51 + + P1 - Reset push button + P2 - Setup push button +VR1 - Volume adjust pot + +ROMs: + ROML00 & ROMH00 - Macronix MX29F1610MC-12 SOP44 16MBit FlashROM + ROML01 & ROMH01 - Macronix MX29F1610MC-12 SOP44 16MBit FlashROM + ROML02 & ROMH02 - Unpopulated space for MX29F1610MC-12 SOP44 16MBit FlashROM + ROML03 & ROMH03 - Unpopulated space for MX29F1610MC-12 SOP44 16MBit FlashROM + VROM1 - MX 27C2000 2MBit DIP32 EPROM + * ROM1 - Unpopulated space for DIP32 EPROM (up to 4MBit) + ROM2 - TMS 27C040 4MBit DIP32 EPROM + +*/ + +ROM_START( toyland ) + ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* Hyperstone CPU Code */ + /* ROM1 empty */ + ROM_LOAD( "rom2.bin", 0x80000, 0x080000, CRC(e3455002) SHA1(5ad7884f82fb125d70829accec02f238e7d9593c) ) + + ROM_REGION( 0xc00000, "gfx1", 0 ) /* 16x16x8 Sprites */ + ROM_LOAD32_WORD( "roml00.bin", 0x000000, 0x200000, CRC(06f5673d) SHA1(23769015fc9a37d36b0fe4924964650aeca77573) ) + ROM_LOAD32_WORD( "romu00.bin", 0x000002, 0x200000, CRC(8c3db0e4) SHA1(6101ec550ae165338333fb04e0762edee65ca253) ) + ROM_LOAD32_WORD( "roml01.bin", 0x400000, 0x200000, CRC(076a84e1) SHA1(f58cb4cd874e1f3f266a5ccbf8ffb5e0111034d3) ) + ROM_LOAD32_WORD( "romu01.bin", 0x400002, 0x200000, CRC(1bc33d01) SHA1(a2a3e6b473cefe463dbd60bda98cb5a4df2bc81b) ) + /* roml02 empty */ + /* romu02 empty */ + /* roml03 empty */ + /* romu03 empty */ + + ROM_REGION( 0x40000, "oki", 0 ) /* Oki Samples */ + ROM_LOAD( "vrom1.bin", 0x00000, 0x40000, CRC(d7e6fc5d) SHA1(ab5bca4035299214d98b222320276fbcaedb0898) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) /* Default EEPROM */ + ROM_LOAD( "epr1.ic3", 0x0000, 0x0080, CRC(812f3d87) SHA1(744919ff4b44eaa3c4dcc75a1cc2f231ccbb4a3e) ) + +ROM_END + +/* + Wyvern Wings (c) 2001 SemiCom, Game Vision License CPU: Hyperstone E1-32T @@ -1613,6 +1884,67 @@ ROM_COPY( "user2", 0x060000, 0x0e0000, 0x020000) ROM_END +/* + +Boong-Ga Boong-Ga (Spank'em!) +Taff System, 2001 + +*/ + +ROM_START( boonggab ) + ROM_REGION16_BE( 0x100000, "user1", ROMREGION_ERASE00 ) /* Hyperstone CPU Code */ + /* rom2 empty */ + /* rom3 empty */ + ROM_LOAD( "2.rom0", 0x80000, 0x80000, CRC(3395541b) SHA1(4e822a52d6070bde232285e7ad8fbe74594bbf28) ) + ROM_LOAD( "1.rom1", 0x00000, 0x80000, CRC(50522da1) SHA1(28f92fc818513d7a4934b9f8e5d39243d720cc80) ) + + ROM_REGION( 0x2000000, "gfx1", ROMREGION_ERASE00 ) /* 16x16x8 Sprites */ + ROM_LOAD32_WORD( "boong-ga.roml00", 0x0000000, 0x200000, CRC(18be5f92) SHA1(abccc578e5e9652a7829165b485776671938b9d9) ) + ROM_LOAD32_WORD( "boong-ga.romu00", 0x0000002, 0x200000, CRC(0158ba9e) SHA1(b6cb699f0779b26d578043c42a0ce14a59fd8ac5) ) + ROM_LOAD32_WORD( "boong-ga.roml05", 0x0400000, 0x200000, CRC(76d60553) SHA1(13a47aed2e7213be98e55a938887a3c2fb314fbe) ) + ROM_LOAD32_WORD( "boong-ga.romu05", 0x0400002, 0x200000, CRC(35ee8fb5) SHA1(79bd1775087bfaf7624978cec4e912553ca1f027) ) + ROM_LOAD32_WORD( "boong-ga.roml01", 0x0800000, 0x200000, CRC(636e9d5d) SHA1(d478ec905d6e56e4c46889430d8c32de98e9dc14) ) + ROM_LOAD32_WORD( "boong-ga.romu01", 0x0800002, 0x200000, CRC(b8dcf6b7) SHA1(8ea590f92832e6b6a4c27fb1f2aa18bb000f41e0) ) + ROM_LOAD32_WORD( "boong-ga.roml06", 0x0c00000, 0x200000, CRC(8dc521b7) SHA1(37021bb05a582b80a4883bddf677c1d41e6777d2) ) + ROM_LOAD32_WORD( "boong-ga.romu06", 0x0c00002, 0x200000, CRC(f6b83270) SHA1(7971fdb99987ac701c76958a626b0cb75ba31451) ) + ROM_LOAD32_WORD( "boong-ga.roml02", 0x1000000, 0x200000, CRC(d0661c69) SHA1(94f95df19b448565642db8c5aafb2532c0febc37) ) + ROM_LOAD32_WORD( "boong-ga.romu02", 0x1000002, 0x200000, CRC(eac01eb8) SHA1(c730078d8422d566378d6a4b0deb42d2814f0dab) ) + ROM_LOAD32_WORD( "boong-ga.roml07", 0x1400000, 0x200000, CRC(3301813a) SHA1(61997f07ca516eb77c9d9478b42950fd6fc42ac5) ) + ROM_LOAD32_WORD( "boong-ga.romu07", 0x1400002, 0x200000, CRC(3f1c3682) SHA1(969491b0d3be054ddc199db2ced38c76c8f561ee) ) + ROM_LOAD32_WORD( "boong-ga.roml03", 0x1800000, 0x200000, CRC(4d4260b3) SHA1(11a5d0b472b783094d44a5c931ee1cbe816b2a05) ) + ROM_LOAD32_WORD( "boong-ga.romu03", 0x1800002, 0x200000, CRC(4ba00032) SHA1(de9e0640e80204f4906576b20eeaa17f03694b3f) ) + /* roml08 empty */ + /* romu08 empty */ + /* roml04 empty */ + /* romu04 empty */ + /* roml09 empty */ + /* romu09 empty */ + + ROM_REGION( 0x100000, "user2", 0 ) /* Oki Samples */ + ROM_LOAD( "3.vrom1", 0x00000, 0x80000, CRC(0696bfcb) SHA1(bba61f3cae23271215bbbf8214ce3b73459d5da5) ) + ROM_LOAD( "4.vrom2", 0x80000, 0x80000, CRC(305c2b16) SHA1(fa199c4cd4ebb952d934e3863fca8740eeba9294) ) + + /* $00000-$20000 stays the same in all sound banks, */ + /* the second half of the bank is what gets switched */ + ROM_REGION( 0x200000, "oki", 0 ) /* Samples */ + ROM_COPY( "user2", 0x000000, 0x000000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x020000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x040000, 0x020000) + ROM_COPY( "user2", 0x020000, 0x060000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x080000, 0x020000) + ROM_COPY( "user2", 0x040000, 0x0a0000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x0c0000, 0x020000) + ROM_COPY( "user2", 0x060000, 0x0e0000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x100000, 0x020000) + ROM_COPY( "user2", 0x080000, 0x120000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x140000, 0x020000) + ROM_COPY( "user2", 0x0a0000, 0x160000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x180000, 0x020000) + ROM_COPY( "user2", 0x0c0000, 0x1a0000, 0x020000) + ROM_COPY( "user2", 0x000000, 0x1c0000, 0x020000) + ROM_COPY( "user2", 0x0e0000, 0x1e0000, 0x020000) +ROM_END + static int irq_active(address_space *space) { UINT32 FCR = cpu_get_reg(&space->device(), 27); @@ -1836,6 +2168,29 @@ return state->m_wram[(0x00a99c / 2)+offset]; } +static READ16_HANDLER( toyland_speedup_r ) +{ + vamphalf_state *state = space->machine().driver_data(); + + if (cpu_get_pc(&space->device()) == 0x130c2) + device_spin_until_interrupt(&space->device()); + + return state->m_wram[0x780d8 / 2]; + +} + +static READ16_HANDLER( boonggab_speedup_r ) +{ + vamphalf_state *state = space->machine().driver_data(); + if(cpu_get_pc(&space->device()) == 0x13198) + { + if(irq_active(space)) + device_spin_until_interrupt(&space->device()); + } + + return state->m_wram[(0xf1b7c / 2)+offset]; +} + static DRIVER_INIT( vamphalf ) { vamphalf_state *state = machine.driver_data(); @@ -1963,6 +2318,15 @@ state->m_flip_bit = 1; } +static DRIVER_INIT( toyland ) +{ + vamphalf_state *state = machine.driver_data(); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x780d8, 0x780d9, FUNC(toyland_speedup_r) ); + + state->m_palshift = 0; + state->m_flip_bit = 1; +} + static DRIVER_INIT( aoh ) { vamphalf_state *state = machine.driver_data(); @@ -1990,6 +2354,17 @@ state->m_palshift = 0; } + +static DRIVER_INIT( boonggab ) +{ + vamphalf_state *state = machine.driver_data(); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x000f1b7c, 0x000f1b7f, FUNC(boonggab_speedup_r) ); + + state->m_palshift = 0; + state->m_has_extra_gfx = 1; + state->m_flip_bit = 1; +} + GAME( 1999, coolmini, 0, coolmini, common, coolmini, ROT0, "SemiCom", "Cool Minigame Collection", 0 ) GAME( 1999, jmpbreak, 0, jmpbreak, common, jmpbreak, ROT0, "F2 System", "Jumping Break" , 0 ) GAME( 1999, suplup, 0, suplup, common, suplup, ROT0, "Omega System", "Super Lup Lup Puzzle / Zhuan Zhuan Puzzle (version 4.0 / 990518)" , 0 ) @@ -2002,6 +2377,8 @@ GAME( 2000, misncrft, 0, misncrft, common, misncrft, ROT90, "Sun", "Mission Craft (version 2.4)", GAME_NO_SOUND ) GAME( 2000, mrdig, 0, mrdig, common, mrdig, ROT0, "Sun", "Mr. Dig", 0 ) GAME( 2001, finalgdr, 0, finalgdr, finalgdr, finalgdr, ROT0, "SemiCom", "Final Godori (Korea, version 2.20.5915)", 0 ) -GAME( 2001, mrkicker, 0, mrkicker, finalgdr, mrkicker, ROT0, "SemiCom", "Mr. Kicker", 0 ) +GAME( 2001, mrkicker, 0, mrkicker, finalgdr, mrkicker, ROT0, "SemiCom", "Mr. Kicker", GAME_NOT_WORKING ) // game stops booting / working properly after you get a high score, or if you don't have a default eeprom with 'valid data. It's never worked properly, CPU core issue? +GAME( 2001, toyland, 0, coolmini, common, toyland, ROT0, "SemiCom", "Toy Land Adventure", 0 ) GAME( 2001, wyvernwg, 0, wyvernwg, common, wyvernwg, ROT270, "SemiCom (Game Vision license)", "Wyvern Wings", GAME_NO_SOUND ) GAME( 2001, aoh, 0, aoh, aoh, aoh, ROT0, "Unico", "Age Of Heroes - Silkroad 2 (v0.63 - 2001/02/07)", 0 ) +GAME( 2001, boonggab, 0, boonggab, boonggab, boonggab, ROT270, "Taff System", "Boong-Ga Boong-Ga (Spank'em!)", 0 ) diff -Nru mame-0.144/src/mame/drivers/vaportra.c mame-0.145/src/mame/drivers/vaportra.c --- mame-0.144/src/mame/drivers/vaportra.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vaportra.c 2012-02-06 21:30:33.000000000 +0000 @@ -282,10 +282,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(58) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(vaportra) + MCFG_SCREEN_UPDATE_STATIC(vaportra) MCFG_GFXDECODE(vaportra) MCFG_PALETTE_LENGTH(1280) diff -Nru mame-0.144/src/mame/drivers/vastar.c mame-0.145/src/mame/drivers/vastar.c --- mame-0.144/src/mame/drivers/vastar.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/vastar.c 2012-02-06 21:30:42.000000000 +0000 @@ -75,10 +75,7 @@ static WRITE8_HANDLER( vastar_hold_cpu2_w ) { /* I'm not sure that this works exactly like this */ - if (data & 1) - cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, CLEAR_LINE); - else - cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, ASSERT_LINE); + cputag_set_input_line(space->machine(), "sub", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); } static READ8_HANDLER( vastar_sharedram_r ) @@ -100,6 +97,12 @@ flip_screen_set(space->machine(), data); } +static WRITE8_HANDLER( nmi_mask_w ) +{ + vastar_state *state = space->machine().driver_data(); + + state->m_nmi_mask = data & 1; +} static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) @@ -124,7 +127,7 @@ static ADDRESS_MAP_START( main_port_map, AS_IO, 8 ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x00) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x00, 0x00) AM_WRITE(nmi_mask_w) AM_RANGE(0x01, 0x01) AM_WRITE(flip_screen_w) AM_RANGE(0x02, 0x02) AM_WRITE(vastar_hold_cpu2_w) ADDRESS_MAP_END @@ -289,7 +292,13 @@ DEVCB_NULL }; +static INTERRUPT_GEN( vblank_irq ) +{ + vastar_state *state = device->machine().driver_data(); + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( vastar, vastar_state ) @@ -297,7 +306,7 @@ MCFG_CPU_ADD("maincpu", Z80, 3072000) /* 3.072 MHz ???? */ MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_IO_MAP(main_port_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("sub", Z80, 3072000) /* 3.072 MHz ???? */ MCFG_CPU_PROGRAM_MAP(cpu2_map) @@ -312,10 +321,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(vastar) + MCFG_SCREEN_UPDATE_STATIC(vastar) MCFG_GFXDECODE(vastar) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/vball.c mame-0.145/src/mame/drivers/vball.c --- mame-0.144/src/mame/drivers/vball.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/vball.c 2012-02-06 21:30:39.000000000 +0000 @@ -4,7 +4,7 @@ TODO: Needs to be tilemapped. The background layer and sprite layer are identical to spdodgeb, except for the - back-switched graphics roms and the size of the pallete banks. + back-switched graphics roms and the size of the palette banks. 03/28/03 - Additions by Steve Ellenoff --------------------------------------- @@ -420,10 +420,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248) /* based on ddragon driver */ - MCFG_SCREEN_UPDATE(vb) + MCFG_SCREEN_UPDATE_STATIC(vb) MCFG_GFXDECODE(vb) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/vcombat.c mame-0.145/src/mame/drivers/vcombat.c --- mame-0.144/src/mame/drivers/vcombat.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/vcombat.c 2012-02-06 21:30:35.000000000 +0000 @@ -72,7 +72,7 @@ Might this be a HW blank bit so things look clean when the i860's do their updates? The two other times I see it read are just before - and after one of the pallette setups is done. + and after one of the palette setups is done. 0x600018: ? No info yet. 0x704000: (VC only) Likely analog axis for VR headset 0x703000: (VC only) Likely analog axis for VR headset @@ -104,31 +104,29 @@ int m_crtc_select; }; - -static SCREEN_UPDATE( vcombat ) +static UINT32 update_screen(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int index) { - vcombat_state *state = screen->machine().driver_data(); + vcombat_state *state = screen.machine().driver_data(); int y; - const rgb_t *const pens = tlc34076_get_pens(screen->machine().device("tlc34076")); - device_t *aux = screen->machine().device("aux"); + const rgb_t *const pens = tlc34076_get_pens(screen.machine().device("tlc34076")); UINT16 *m68k_buf = state->m_m68k_framebuffer[(*state->m_framebuffer_ctrl & 0x20) ? 1 : 0]; - UINT16 *i860_buf = state->m_i860_framebuffer[(screen == aux) ? 1 : 0][0]; + UINT16 *i860_buf = state->m_i860_framebuffer[index][0]; /* TODO: It looks like the leftmost chunk of the ground should really be on the right side? */ /* But the i860 draws the background correctly, so it may be an original game issue. */ /* There's also some garbage in the upper-left corner. Might be related to this 'wraparound'. */ /* Or maybe it's related to the 68k's alpha? It might come from the 68k side of the house. */ - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { int x; int src_addr = 256/2 * y; const UINT16 *m68k_src = &m68k_buf[src_addr]; const UINT16 *i860_src = &i860_buf[src_addr]; - UINT32 *dst = BITMAP_ADDR32(bitmap, y, cliprect->min_x); + UINT32 *dst = &bitmap.pix32(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { int i; UINT16 m68k_pix = *m68k_src++; @@ -155,6 +153,9 @@ return 0; } +static SCREEN_UPDATE_RGB32( vcombat_main ) { return update_screen(screen, bitmap, cliprect, 0); } +static SCREEN_UPDATE_RGB32( vcombat_aux ) { return update_screen(screen, bitmap, cliprect, 1); } + static WRITE16_HANDLER( main_video_write ) { @@ -597,14 +598,12 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_12MHz / 2, 400, 0, 256, 291, 0, 208) - MCFG_SCREEN_UPDATE(vcombat) + MCFG_SCREEN_UPDATE_STATIC(vcombat_main) MCFG_SCREEN_ADD("aux", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_12MHz / 2, 400, 0, 256, 291, 0, 208) - MCFG_SCREEN_UPDATE(vcombat) + MCFG_SCREEN_UPDATE_STATIC(vcombat_aux) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -634,9 +633,8 @@ MCFG_MC6845_ADD("crtc", MC6845, XTAL_20MHz / 4 / 16, mc6845_intf) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(XTAL_20MHz / 4, 320, 0, 256, 277, 0, 224) - MCFG_SCREEN_UPDATE(vcombat) + MCFG_SCREEN_UPDATE_STATIC(vcombat_main) MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/vd.c mame-0.145/src/mame/drivers/vd.c --- mame-0.144/src/mame/drivers/vd.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/vd.c 2012-02-06 21:30:33.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" @@ -5,18 +7,28 @@ { public: vd_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( vd_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( vd_map, AS_PROGRAM, 8, vd_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( vd ) INPUT_PORTS_END -static MACHINE_RESET( vd ) +void vd_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(vd_map) - - MCFG_MACHINE_RESET( vd ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -47,5 +57,4 @@ /-------------------------------------------------------------------*/ -GAME(1986, break86, 0, vd, vd, vd, ROT0, "Videodens", "Break '86", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1986, break86, 0, vd, vd, vd, ROT0, "Videodens", "Break '86", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/vectrex.c mame-0.145/src/mame/drivers/vectrex.c --- mame-0.144/src/mame/drivers/vectrex.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/vectrex.c 2012-02-06 21:30:40.000000000 +0000 @@ -104,10 +104,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", VECTOR) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 299) - MCFG_SCREEN_UPDATE(vectrex) + MCFG_SCREEN_UPDATE_STATIC(vectrex) MCFG_VIDEO_START(vectrex) diff -Nru mame-0.144/src/mame/drivers/vega.c mame-0.145/src/mame/drivers/vega.c --- mame-0.144/src/mame/drivers/vega.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/vega.c 2012-02-06 21:30:40.000000000 +0000 @@ -40,7 +40,7 @@ } -static SCREEN_UPDATE(vega) +static SCREEN_UPDATE_IND16(vega) { return 0; } @@ -53,10 +53,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(vega) + MCFG_SCREEN_UPDATE_STATIC(vega) MCFG_PALETTE_LENGTH(0x100) @@ -146,4 +145,4 @@ } #endif -GAME( 19??, vega, 0, vega, vega, 0, ROT270, "Olympia?", "Vega", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 19??, vega, 0, vega, vega, 0, ROT270, "Olympia?", "Vega", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/vegaeo.c mame-0.145/src/mame/drivers/vegaeo.c --- mame-0.144/src/mame/drivers/vegaeo.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vegaeo.c 2012-02-06 21:30:37.000000000 +0000 @@ -14,7 +14,6 @@ #include "emu.h" #include "cpu/e132xs/e132xs.h" -#include "deprecat.h" #include "machine/at28c16.h" #include "includes/eolithsp.h" @@ -147,9 +146,9 @@ state->m_vega_vram = auto_alloc_array(machine, UINT32, 0x14000*2/4); } -static SCREEN_UPDATE( vega ) +static SCREEN_UPDATE_IND16( vega ) { - vegaeo_state *state = screen->machine().driver_data(); + vegaeo_state *state = screen.machine().driver_data(); int x,y,count; int color; @@ -159,16 +158,16 @@ for (x=0;x < 320/4;x++) { color = state->m_vega_vram[count + (0x14000/4) * (state->m_vega_vbuffer ^ 1)] & 0xff; - *BITMAP_ADDR16(bitmap, y, x*4 + 3) = color; + bitmap.pix16(y, x*4 + 3) = color; color = (state->m_vega_vram[count + (0x14000/4) * (state->m_vega_vbuffer ^ 1)] & 0xff00) >> 8; - *BITMAP_ADDR16(bitmap, y, x*4 + 2) = color; + bitmap.pix16(y, x*4 + 2) = color; color = (state->m_vega_vram[count + (0x14000/4) * (state->m_vega_vbuffer ^ 1)] & 0xff0000) >> 16; - *BITMAP_ADDR16(bitmap, y, x*4 + 1) = color; + bitmap.pix16(y, x*4 + 1) = color; color = (state->m_vega_vram[count + (0x14000/4) * (state->m_vega_vbuffer ^ 1)] & 0xff000000) >> 24; - *BITMAP_ADDR16(bitmap, y, x*4 + 0) = color; + bitmap.pix16(y, x*4 + 0) = color; count++; } @@ -180,7 +179,7 @@ static MACHINE_CONFIG_START( vega, vegaeo_state ) MCFG_CPU_ADD("maincpu", GMS30C2132, 55000000) /* 55 MHz */ MCFG_CPU_PROGRAM_MAP(vega_map) - MCFG_CPU_VBLANK_INT_HACK(eolith_speedup,262) + MCFG_TIMER_ADD_SCANLINE("scantimer", eolith_speedup, "screen", 0, 1) /* sound cpu */ @@ -188,10 +187,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(512, 512) + MCFG_SCREEN_SIZE(512, 262) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(vega) + MCFG_SCREEN_UPDATE_STATIC(vega) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/vegas.c mame-0.145/src/mame/drivers/vegas.c --- mame-0.144/src/mame/drivers/vegas.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vegas.c 2012-02-06 21:30:40.000000000 +0000 @@ -508,9 +508,9 @@ * *************************************/ -static SCREEN_UPDATE( vegas ) +static SCREEN_UPDATE_RGB32( vegas ) { - vegas_state *state = screen->machine().driver_data(); + vegas_state *state = screen.machine().driver_data(); return voodoo_update(state->m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -2234,10 +2234,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(57) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(640, 480) MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 479) - MCFG_SCREEN_UPDATE(vegas) + MCFG_SCREEN_UPDATE_STATIC(vegas) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/vendetta.c mame-0.145/src/mame/drivers/vendetta.c --- mame-0.144/src/mame/drivers/vendetta.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/vendetta.c 2012-02-06 21:30:35.000000000 +0000 @@ -531,10 +531,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) - MCFG_SCREEN_UPDATE(vendetta) + MCFG_SCREEN_UPDATE_STATIC(vendetta) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/vertigo.c mame-0.145/src/mame/drivers/vertigo.c --- mame-0.144/src/mame/drivers/vertigo.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/vertigo.c 2012-02-06 21:30:42.000000000 +0000 @@ -132,7 +132,7 @@ MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(400, 300) MCFG_SCREEN_VISIBLE_AREA(0, 510, 0, 400) - MCFG_SCREEN_UPDATE(vector) + MCFG_SCREEN_UPDATE_STATIC(vector) MCFG_VIDEO_START(vector) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/vicdual.c mame-0.145/src/mame/drivers/vicdual.c --- mame-0.144/src/mame/drivers/vicdual.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/vicdual.c 2012-02-06 21:30:42.000000000 +0000 @@ -220,7 +220,6 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(VICDUAL_PIXEL_CLOCK, VICDUAL_HTOTAL, VICDUAL_HBEND, VICDUAL_HBSTART, VICDUAL_VTOTAL, VICDUAL_VBEND, VICDUAL_VBSTART) MACHINE_CONFIG_END @@ -299,7 +298,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -387,7 +386,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw) MACHINE_CONFIG_END @@ -490,7 +489,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -678,7 +677,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw_or_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw_or_color) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -690,7 +689,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw) // no colour prom on PCB, must be bw? + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw) // no colour prom on PCB, must be bw? MACHINE_CONFIG_END @@ -704,7 +703,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw_or_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw_or_color) MACHINE_CONFIG_END @@ -898,7 +897,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -911,7 +910,7 @@ /* basic machine hardware */ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_bw) + MCFG_SCREEN_UPDATE_STATIC(vicdual_bw) MACHINE_CONFIG_END @@ -924,7 +923,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) MACHINE_CONFIG_END @@ -1908,7 +1907,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) MACHINE_CONFIG_END @@ -2157,7 +2156,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) MACHINE_CONFIG_END @@ -2252,7 +2251,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) MACHINE_CONFIG_END @@ -2351,7 +2350,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(vicdual_color) + MCFG_SCREEN_UPDATE_STATIC(vicdual_color) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/victory.c mame-0.145/src/mame/drivers/victory.c --- mame-0.144/src/mame/drivers/victory.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/victory.c 2012-02-06 21:30:34.000000000 +0000 @@ -222,10 +222,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK | VIDEO_ALWAYS_UPDATE) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* using the standard Exidy video parameters for now, needs to be confirmed */ MCFG_SCREEN_RAW_PARAMS(VICTORY_PIXEL_CLOCK, VICTORY_HTOTAL, VICTORY_HBEND, VICTORY_HBSTART, VICTORY_VTOTAL, VICTORY_VBEND, VICTORY_VBSTART) - MCFG_SCREEN_UPDATE(victory) + MCFG_SCREEN_UPDATE_STATIC(victory) MCFG_PALETTE_LENGTH(64) diff -Nru mame-0.144/src/mame/drivers/videopin.c mame-0.145/src/mame/drivers/videopin.c --- mame-0.144/src/mame/drivers/videopin.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/videopin.c 2012-02-06 21:30:41.000000000 +0000 @@ -331,10 +331,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(304, 263) MCFG_SCREEN_VISIBLE_AREA(0, 303, 0, 255) - MCFG_SCREEN_UPDATE(videopin) + MCFG_SCREEN_UPDATE_STATIC(videopin) MCFG_GFXDECODE(videopin) MCFG_PALETTE_LENGTH(2) diff -Nru mame-0.144/src/mame/drivers/videopkr.c mame-0.145/src/mame/drivers/videopkr.c --- mame-0.144/src/mame/drivers/videopkr.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/videopkr.c 2012-02-06 21:30:41.000000000 +0000 @@ -493,11 +493,11 @@ } -static SCREEN_UPDATE( videopkr ) +static SCREEN_UPDATE_IND16( videopkr ) { - videopkr_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + videopkr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->mark_all_dirty(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -600,7 +600,7 @@ state->m_n_offs = ((state->m_p1 & 0xc0) << 2 ) + offset; state->m_color_ram[state->m_n_offs] = data & 0x0f; state->m_video_ram[state->m_n_offs] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, state->m_n_offs); + state->m_bg_tilemap->mark_tile_dirty(state->m_n_offs); break; } @@ -617,7 +617,7 @@ { state->m_n_offs = ((state->m_p1 & 0xc0) << 2 ) + offset; state->m_color_ram[state->m_n_offs] = data & 0x0f; - tilemap_mark_tile_dirty(state->m_bg_tilemap, state->m_n_offs); + state->m_bg_tilemap->mark_tile_dirty(state->m_n_offs); break; } @@ -628,7 +628,7 @@ { state->m_n_offs = ((state->m_p1 & 0xc0) << 2 ) + offset; state->m_video_ram[state->m_n_offs] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, state->m_n_offs); + state->m_bg_tilemap->mark_tile_dirty(state->m_n_offs); break; } @@ -1240,14 +1240,13 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(5*8, 31*8-1, 3*8, 29*8-1) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(2080) - MCFG_SCREEN_UPDATE(videopkr) + MCFG_SCREEN_UPDATE_STATIC(videopkr) MCFG_GFXDECODE(videopkr) MCFG_PALETTE_INIT(videopkr) diff -Nru mame-0.144/src/mame/drivers/vigilant.c mame-0.145/src/mame/drivers/vigilant.c --- mame-0.144/src/mame/drivers/vigilant.c 2012-01-13 15:34:55.000000000 +0000 +++ mame-0.145/src/mame/drivers/vigilant.c 2012-02-06 21:30:34.000000000 +0000 @@ -252,9 +252,9 @@ PORT_DIPNAME( 0x04, 0x04, "Coin Mode" ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x04, "Mode 1" ) PORT_DIPSETTING( 0x00, "Mode 2" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:4") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, "Invulnerability (Cheat)") PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -494,10 +494,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(16*8, (64-16)*8-1, 0*8, 32*8-1 ) - MCFG_SCREEN_UPDATE(vigilant) + MCFG_SCREEN_UPDATE_STATIC(vigilant) MCFG_GFXDECODE(vigilant) MCFG_PALETTE_LENGTH(512+32) /* 512 real palette, 32 virtual palette */ @@ -537,10 +536,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(16*8, (64-16)*8-1, 0*8, 32*8-1 ) - MCFG_SCREEN_UPDATE(vigilant) + MCFG_SCREEN_UPDATE_STATIC(vigilant) MCFG_GFXDECODE(buccanrs) MCFG_PALETTE_LENGTH(512+32) /* 512 real palette, 32 virtual palette */ @@ -596,10 +594,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 0*8, 32*8-1 ) - MCFG_SCREEN_UPDATE(kikcubic) + MCFG_SCREEN_UPDATE_STATIC(kikcubic) MCFG_GFXDECODE(kikcubic) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/vindictr.c mame-0.145/src/mame/drivers/vindictr.c --- mame-0.144/src/mame/drivers/vindictr.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vindictr.c 2012-02-06 21:30:38.000000000 +0000 @@ -210,11 +210,10 @@ MCFG_PALETTE_LENGTH(2048*8) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(vindictr) + MCFG_SCREEN_UPDATE_STATIC(vindictr) MCFG_VIDEO_START(vindictr) diff -Nru mame-0.144/src/mame/drivers/viper.c mame-0.145/src/mame/drivers/viper.c --- mame-0.144/src/mame/drivers/viper.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/viper.c 2012-02-06 21:30:40.000000000 +0000 @@ -371,9 +371,9 @@ static timer_device *ds2430_bit_timer; -static SCREEN_UPDATE(viper) +static SCREEN_UPDATE_RGB32(viper) { - device_t *device = screen->machine().device("voodoo"); + device_t *device = screen.machine().device("voodoo"); return voodoo_update(device, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -2012,13 +2012,12 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(1024, 768) MCFG_SCREEN_VISIBLE_AREA(0, 1023, 0, 383) MCFG_PALETTE_LENGTH(65536) - MCFG_SCREEN_UPDATE(viper) + MCFG_SCREEN_UPDATE_STATIC(viper) MCFG_TIMER_ADD("ds2430_timer2", NULL) diff -Nru mame-0.144/src/mame/drivers/vmetal.c mame-0.145/src/mame/drivers/vmetal.c --- mame-0.144/src/mame/drivers/vmetal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/vmetal.c 2012-02-06 21:30:38.000000000 +0000 @@ -129,21 +129,21 @@ { vmetal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_texttileram[offset]); - tilemap_mark_tile_dirty(state->m_texttilemap, offset); + state->m_texttilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( vmetal_mid1tileram_w ) { vmetal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid1tileram[offset]); - tilemap_mark_tile_dirty(state->m_mid1tilemap, offset); + state->m_mid1tilemap->mark_tile_dirty(offset); } static WRITE16_HANDLER( vmetal_mid2tileram_w ) { vmetal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid2tileram[offset]); - tilemap_mark_tile_dirty(state->m_mid2tilemap, offset); + state->m_mid2tilemap->mark_tile_dirty(offset); } @@ -411,30 +411,30 @@ state->m_mid1tilemap = tilemap_create(machine, get_vmetal_mid1tilemap_tile_info, tilemap_scan_rows, 16, 16, 256, 256); state->m_mid2tilemap = tilemap_create(machine, get_vmetal_mid2tilemap_tile_info, tilemap_scan_rows, 16, 16, 256, 256); - tilemap_set_transparent_pen(state->m_texttilemap, 15); - tilemap_set_transparent_pen(state->m_mid1tilemap, 15); - tilemap_set_transparent_pen(state->m_mid2tilemap, 15); + state->m_texttilemap->set_transparent_pen(15); + state->m_mid1tilemap->set_transparent_pen(15); + state->m_mid2tilemap->set_transparent_pen(15); } -static SCREEN_UPDATE(varia) +static SCREEN_UPDATE_IND16(varia) { - vmetal_state *state = screen->machine().driver_data(); + vmetal_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_set_scrollx(state->m_mid2tilemap, 0, state->m_vmetal_videoregs[0x06a/2]-64 /*+ state->m_vmetal_videoregs[0x066/2]*/); - tilemap_set_scrollx(state->m_mid1tilemap, 0, state->m_vmetal_videoregs[0x07a/2]-64 /*+ state->m_vmetal_videoregs[0x076/2]*/); - tilemap_set_scrollx(state->m_texttilemap, 0, -64 /*+ state->m_vmetal_videoregs[0x076/2]*/); + state->m_mid2tilemap->set_scrollx(0, state->m_vmetal_videoregs[0x06a/2]-64 /*+ state->m_vmetal_videoregs[0x066/2]*/); + state->m_mid1tilemap->set_scrollx(0, state->m_vmetal_videoregs[0x07a/2]-64 /*+ state->m_vmetal_videoregs[0x076/2]*/); + state->m_texttilemap->set_scrollx(0, -64 /*+ state->m_vmetal_videoregs[0x076/2]*/); - tilemap_set_scrolly(state->m_mid2tilemap, 0, -64); - tilemap_set_scrolly(state->m_mid1tilemap, 0, -64); - tilemap_set_scrolly(state->m_texttilemap, 0, -64); + state->m_mid2tilemap->set_scrolly(0, -64); + state->m_mid1tilemap->set_scrolly(0, -64); + state->m_texttilemap->set_scrolly(0, -64); - tilemap_draw(bitmap, cliprect, state->m_mid1tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_mid2tilemap, 0, 0); - metro_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_texttilemap, 0, 0); + state->m_mid1tilemap->draw(bitmap, cliprect, 0, 0); + state->m_mid2tilemap->draw(bitmap, cliprect, 0, 0); + metro_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_texttilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -450,10 +450,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(2048, 2048) MCFG_SCREEN_VISIBLE_AREA(0+64, 319+64, 0+64, 223+64) - MCFG_SCREEN_UPDATE(varia) + MCFG_SCREEN_UPDATE_STATIC(varia) MCFG_GFXDECODE(vmetal) MCFG_PALETTE_LENGTH(0x4000) diff -Nru mame-0.144/src/mame/drivers/volfied.c mame-0.145/src/mame/drivers/volfied.c --- mame-0.144/src/mame/drivers/volfied.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/volfied.c 2012-02-06 21:30:41.000000000 +0000 @@ -276,10 +276,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320, 256) MCFG_SCREEN_VISIBLE_AREA(0, 319, 8, 247) - MCFG_SCREEN_UPDATE(volfied) + MCFG_SCREEN_UPDATE_STATIC(volfied) MCFG_GFXDECODE(volfied) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/vp101.c mame-0.145/src/mame/drivers/vp101.c --- mame-0.144/src/mame/drivers/vp101.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/vp101.c 2012-02-06 21:30:40.000000000 +0000 @@ -12,6 +12,8 @@ ****************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/mips/mips3.h" #include "machine/idectrl.h" @@ -21,33 +23,47 @@ { public: vp10x_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + DECLARE_READ32_MEMBER(tty_ready_r); + DECLARE_WRITE32_MEMBER(tty_w); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + + // devices + required_device m_maincpu; + // driver_device overrides + virtual void video_start(); }; -static SCREEN_UPDATE( vp101 ) +void vp10x_state::video_start() { - return 0; } -static VIDEO_START( vp101 ) +UINT32 vp10x_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + return 0; } -static READ32_HANDLER(tty_ready_r) +READ32_MEMBER(vp10x_state::tty_ready_r) { return 0x60; // must return &0x20 for output at tty_w to continue } -static WRITE32_HANDLER(tty_w) // set breakpoint at bfc01430 to catch when it's printing things +WRITE32_MEMBER(vp10x_state::tty_w) // set breakpoint at bfc01430 to catch when it's printing things { // uncomment to see startup messages - it says "RAM OK" and "EPI RSS Ver 4.5.1" followed by "" and then lots of dots // Special Forces also says " = 00000032" // printf("%c", data); } -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32 ) +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 32, vp10x_state ) AM_RANGE(0x00000000, 0x07ffffff) AM_RAM // this is a sufficient amount to get "RAM OK" AM_RANGE(0x1c000000, 0x1c000003) AM_WRITE(tty_w) // RSS OS code uses this one AM_RANGE(0x1c000014, 0x1c000017) AM_READ(tty_ready_r) @@ -74,15 +90,13 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(vp10x_state, screen_update) MCFG_SCREEN_SIZE(320, 240) MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239) - MCFG_SCREEN_UPDATE(vp101) MCFG_PALETTE_LENGTH(32768) - - MCFG_VIDEO_START(vp101) MACHINE_CONFIG_END + ROM_START(jnero) ROM_REGION(0x100000, "maincpu", 0) /* Boot ROM */ ROM_LOAD( "d710.05523.bin", 0x000000, 0x100000, CRC(6054a066) SHA1(58e68b7d86e6f24c79b99c8406e86e3c14387726) ) @@ -102,6 +116,6 @@ DISK_IMAGE_READONLY("sf010101", 0, SHA1(59b5e3d8e1d5537204233598830be2066aad0556) ) ROM_END -GAME( 2002, specfrce, 0, vp101, vp101, 0, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 2004, jnero, 0, vp101, vp101, 0, ROT0, "ICE/Play Mechanix", "Johnny Nero Action Hero", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 2002, specfrce, 0, vp101, vp101, 0, ROT0, "ICE/Play Mechanix", "Special Forces Elite Training", GAME_IS_SKELETON ) +GAME( 2004, jnero, 0, vp101, vp101, 0, ROT0, "ICE/Play Mechanix", "Johnny Nero Action Hero", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/vpoker.c mame-0.145/src/mame/drivers/vpoker.c --- mame-0.144/src/mame/drivers/vpoker.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/vpoker.c 2012-02-06 21:30:34.000000000 +0000 @@ -129,11 +129,11 @@ state->m_videoram = auto_alloc_array(machine, UINT8, 0x200); } -static SCREEN_UPDATE( vpoker ) +static SCREEN_UPDATE_IND16( vpoker ) { - vpoker_state *state = screen->machine().driver_data(); + vpoker_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; int count = 0x0000; int y,x; @@ -659,11 +659,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 480-1, 0*8, 240-1) // MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0*8, 256-1) - MCFG_SCREEN_UPDATE(vpoker) + MCFG_SCREEN_UPDATE_STATIC(vpoker) MCFG_GFXDECODE(vpoker) MCFG_PALETTE_LENGTH(8) diff -Nru mame-0.144/src/mame/drivers/vroulet.c mame-0.145/src/mame/drivers/vroulet.c --- mame-0.144/src/mame/drivers/vroulet.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vroulet.c 2012-02-06 21:30:36.000000000 +0000 @@ -81,14 +81,14 @@ { vroulet_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( vroulet_colorram_w ) { vroulet_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -108,11 +108,11 @@ 8, 8, 32, 32); } -static SCREEN_UPDATE(vroulet) +static SCREEN_UPDATE_IND16(vroulet) { - vroulet_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], 0x320, 1, 0, 0, + vroulet_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], 0x320, 1, 0, 0, state->m_ball[1], state->m_ball[0] - 12, 0); return 0; } @@ -292,10 +292,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(vroulet) + MCFG_SCREEN_UPDATE_STATIC(vroulet) MCFG_GFXDECODE(vroulet) MCFG_PALETTE_LENGTH(128*4) diff -Nru mame-0.144/src/mame/drivers/vsnes.c mame-0.145/src/mame/drivers/vsnes.c --- mame-0.144/src/mame/drivers/vsnes.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/vsnes.c 2012-02-06 21:30:41.000000000 +0000 @@ -44,7 +44,7 @@ - Goonies - Soccer - T.K.O. Boxing * - (Manual states this is an RP2C04-0004 - though the pallete doesn't agree) + (Manual states this is an RP2C04-0004 - though the palette doesn't agree) RP2C04-0004: - Clu Clu Land @@ -152,13 +152,15 @@ static WRITE8_HANDLER( sprite_dma_0_w ) { int source = ( data & 7 ); - ppu2c0x_spriteram_dma( space, space->machine().device("ppu1"), source ); + ppu2c0x_device *ppu = space->machine().device("ppu1"); + ppu->spriteram_dma( space, source ); } static WRITE8_HANDLER( sprite_dma_1_w ) { int source = ( data & 7 ); - ppu2c0x_spriteram_dma( space, space->machine().device("ppu2"), source ); + ppu2c0x_device *ppu = space->machine().device("ppu2"); + ppu->spriteram_dma( space, source ); } static WRITE8_HANDLER( vsnes_coin_counter_w ) @@ -210,7 +212,7 @@ static ADDRESS_MAP_START( vsnes_cpu1_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM AM_BASE_MEMBER(vsnes_state, m_work_ram) - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu1", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu1", ppu2c0x_device, read, write) AM_RANGE(0x4011, 0x4011) AM_DEVWRITE("dac1", dac_w) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes1", nes_psg_r, nes_psg_w) AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_0_w) @@ -224,7 +226,7 @@ static ADDRESS_MAP_START( vsnes_cpu2_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM AM_BASE_MEMBER(vsnes_state, m_work_ram_1) - AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE("ppu2", ppu2c0x_r, ppu2c0x_w) + AM_RANGE(0x2000, 0x3fff) AM_DEVREADWRITE_MODERN("ppu2", ppu2c0x_device, read, write) AM_RANGE(0x4011, 0x4011) AM_DEVWRITE("dac2", dac_w) AM_RANGE(0x4000, 0x4013) AM_DEVREADWRITE("nes2", nes_psg_r, nes_psg_w) AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_1_w) @@ -1650,12 +1652,11 @@ MCFG_MACHINE_START(vsnes) /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_ADD("screen1", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(vsnes) + MCFG_SCREEN_UPDATE_STATIC(vsnes) MCFG_PALETTE_LENGTH(8*4*16) @@ -1715,19 +1716,17 @@ MCFG_PALETTE_LENGTH(2*8*4*16) MCFG_DEFAULT_LAYOUT(layout_dualhsxs) - MCFG_SCREEN_ADD("top", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_ADD("screen1", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(vsnes) + MCFG_SCREEN_UPDATE_STATIC(vsnes) - MCFG_SCREEN_ADD("bottom", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_ADD("screen2", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(32*8, 262) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(vsnes_bottom) + MCFG_SCREEN_UPDATE_STATIC(vsnes_bottom) MCFG_PALETTE_INIT(vsdual) MCFG_VIDEO_START(vsdual) diff -Nru mame-0.144/src/mame/drivers/vulgus.c mame-0.145/src/mame/drivers/vulgus.c --- mame-0.144/src/mame/drivers/vulgus.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/vulgus.c 2012-02-06 21:30:41.000000000 +0000 @@ -221,10 +221,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(vulgus) + MCFG_SCREEN_UPDATE_STATIC(vulgus) MCFG_GFXDECODE(vulgus) MCFG_PALETTE_LENGTH(64*4+16*16+4*32*8) diff -Nru mame-0.144/src/mame/drivers/wallc.c mame-0.145/src/mame/drivers/wallc.c --- mame-0.144/src/mame/drivers/wallc.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wallc.c 2012-02-06 21:30:41.000000000 +0000 @@ -131,7 +131,7 @@ wallc_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -147,10 +147,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols_flip_y, 8, 8, 32, 32); } -static SCREEN_UPDATE( wallc ) +static SCREEN_UPDATE_IND16( wallc ) { - wallc_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + wallc_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -302,10 +302,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(wallc) + MCFG_SCREEN_UPDATE_STATIC(wallc) MCFG_GFXDECODE(wallc) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/wardner.c mame-0.145/src/mame/drivers/wardner.c --- mame-0.144/src/mame/drivers/wardner.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wardner.c 2012-02-06 21:30:41.000000000 +0000 @@ -431,9 +431,8 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_14MHz/2, 446, 0, 320, 286, 0, 240) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(toaplan0) - MCFG_SCREEN_EOF(toaplan0) + MCFG_SCREEN_UPDATE_STATIC(toaplan0) + MCFG_SCREEN_VBLANK_STATIC(toaplan0) MCFG_GFXDECODE(wardner) MCFG_PALETTE_LENGTH(1792) diff -Nru mame-0.144/src/mame/drivers/warpsped.c mame-0.145/src/mame/drivers/warpsped.c --- mame-0.144/src/mame/drivers/warpsped.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/warpsped.c 2012-02-06 21:30:39.000000000 +0000 @@ -128,38 +128,38 @@ warpspeed_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_text_tilemap, offset); + state->m_text_tilemap->mark_tile_dirty(offset); } static VIDEO_START( warpspeed ) { warpspeed_state *state = machine.driver_data(); state->m_text_tilemap = tilemap_create(machine, get_warpspeed_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); + state->m_text_tilemap->set_transparent_pen(0); state->m_starfield_tilemap = tilemap_create(machine, get_warpspeed_starfield_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_mark_all_tiles_dirty(state->m_starfield_tilemap); + state->m_starfield_tilemap->mark_all_dirty(); } -static void draw_circle_line(bitmap_t *bitmap, int x, int y, int l, int color) +static void draw_circle_line(bitmap_ind16 &bitmap, int x, int y, int l, int color) { - if (y >= 0 && y <= bitmap->height - 1) + if (y >= 0 && y <= bitmap.height() - 1) { - UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); + UINT16* pLine = &bitmap.pix16(y); int h1 = x - l; int h2 = x + l; if (h1 < 0) h1 = 0; - if (h2 > bitmap->width - 1) - h2 = bitmap->width - 1; + if (h2 > bitmap.width() - 1) + h2 = bitmap.width() - 1; for (x = h1; x <= h2; x++) pLine[x] = color; } } -static void warpspeed_draw_circle(bitmap_t *bitmap, INT16 cx, INT16 cy, UINT16 radius, UINT8 color ) +static void warpspeed_draw_circle(bitmap_ind16 &bitmap, INT16 cx, INT16 cy, UINT16 radius, UINT8 color ) { /* Bresenham's circle algorithm */ @@ -184,7 +184,7 @@ } } -static void warpspeed_draw_circles(bitmap_t *bitmap, warpspeed_state *state) +static void warpspeed_draw_circles(bitmap_ind16 &bitmap, warpspeed_state *state) { for (int i = 0; i < 4; i++) { @@ -203,13 +203,13 @@ } } -static SCREEN_UPDATE( warpspeed ) +static SCREEN_UPDATE_IND16( warpspeed ) { - warpspeed_state *state = screen->machine().driver_data(); + warpspeed_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_starfield_tilemap, 0, 0); + state->m_starfield_tilemap->draw(bitmap, cliprect, 0, 0); warpspeed_draw_circles(bitmap, state); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -310,12 +310,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE((32)*8, (32)*8) MCFG_SCREEN_VISIBLE_AREA(4*8, 32*8-1, 8*8, 32*8-1) MCFG_VIDEO_START(warpspeed) - MCFG_SCREEN_UPDATE(warpspeed) + MCFG_SCREEN_UPDATE_STATIC(warpspeed) MCFG_GFXDECODE(warpspeed) MCFG_PALETTE_LENGTH(2+8) diff -Nru mame-0.144/src/mame/drivers/warpwarp.c mame-0.145/src/mame/drivers/warpwarp.c --- mame-0.144/src/mame/drivers/warpwarp.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/warpwarp.c 2012-02-06 21:30:39.000000000 +0000 @@ -138,6 +138,17 @@ #define MASTER_CLOCK XTAL_18_432MHz +/* Interrupt Gen */ +static INTERRUPT_GEN( vblank_irq ) +{ + warpwarp_state *state = device->machine().driver_data(); + + if(state->m_ball_on) + device_set_input_line(device, 0, ASSERT_LINE); +} + + +/* B&W Games I/O */ static READ8_HANDLER( geebee_in_r ) { warpwarp_state *state = space->machine().driver_data(); @@ -203,11 +214,13 @@ break; case 5: if( state->m_geebee_bgw != (data & 1) ) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_geebee_bgw = data & 1; break; case 6: state->m_ball_on = data & 1; + if (~data & 1) + cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; case 7: flip_screen_set(space->machine(), data & 1); @@ -216,6 +229,8 @@ } +/* Color Games I/O */ + /* Read Switch Inputs */ static READ8_HANDLER( warpwarp_sw_r ) { @@ -291,7 +306,6 @@ break; case 6: state->m_ball_on = data & 1; - cpu_interrupt_enable(space->machine().device("maincpu"), data & 1); if (~data & 1) cputag_set_input_line(space->machine(), "maincpu", 0, CLEAR_LINE); break; @@ -343,6 +357,7 @@ ADDRESS_MAP_END + static INPUT_PORTS_START( geebee ) PORT_START("SW0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -723,13 +738,12 @@ MCFG_CPU_ADD("maincpu", I8080, MASTER_CLOCK/9) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(geebee_map) MCFG_CPU_IO_MAP(geebee_port_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224) - MCFG_SCREEN_UPDATE(geebee) + MCFG_SCREEN_UPDATE_STATIC(geebee) MCFG_GFXDECODE(1k) MCFG_PALETTE_LENGTH(4*2) @@ -759,13 +773,12 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", I8080, MASTER_CLOCK/9) /* 18.432 MHz / 9 */ MCFG_CPU_PROGRAM_MAP(bombbee_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_assert) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK/3, 384, 0, 272, 264, 0, 224) - MCFG_SCREEN_UPDATE(geebee) + MCFG_SCREEN_UPDATE_STATIC(geebee) MCFG_GFXDECODE(color) MCFG_PALETTE_LENGTH(2*256+1) diff -Nru mame-0.144/src/mame/drivers/warriorb.c mame-0.145/src/mame/drivers/warriorb.c --- mame-0.144/src/mame/drivers/warriorb.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/warriorb.c 2012-02-06 21:30:41.000000000 +0000 @@ -599,20 +599,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(warriorb) + MCFG_SCREEN_UPDATE_STATIC(warriorb_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 3*8, 32*8-1) - MCFG_SCREEN_UPDATE(warriorb) + MCFG_SCREEN_UPDATE_STATIC(warriorb_right) MCFG_VIDEO_START(warriorb) @@ -667,20 +665,18 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(warriorb) + MCFG_SCREEN_UPDATE_STATIC(warriorb_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(warriorb) + MCFG_SCREEN_UPDATE_STATIC(warriorb_right) MCFG_VIDEO_START(warriorb) diff -Nru mame-0.144/src/mame/drivers/wc90b.c mame-0.145/src/mame/drivers/wc90b.c --- mame-0.144/src/mame/drivers/wc90b.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/wc90b.c 2012-02-06 21:30:40.000000000 +0000 @@ -379,10 +379,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(wc90b) + MCFG_SCREEN_UPDATE_STATIC(wc90b) MCFG_GFXDECODE(wc90b) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/wc90.c mame-0.145/src/mame/drivers/wc90.c --- mame-0.144/src/mame/drivers/wc90.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/wc90.c 2012-02-06 21:30:40.000000000 +0000 @@ -325,10 +325,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(wc90) + MCFG_SCREEN_UPDATE_STATIC(wc90) MCFG_GFXDECODE(wc90) MCFG_PALETTE_LENGTH(1024) diff -Nru mame-0.144/src/mame/drivers/wecleman.c mame-0.145/src/mame/drivers/wecleman.c --- mame-0.144/src/mame/drivers/wecleman.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/wecleman.c 2012-02-06 21:30:34.000000000 +0000 @@ -7,6 +7,23 @@ - Note: press F2 to enter service mode - +--------------------------------------------------------------------------- + TODO list +--------------------------------------------------------------------------- +WEC Le Mans 24: +- The parallactic scrolling is sometimes wrong +Hot Chase: +- gameplay speed is VERY erratic +- Samples pitch is too low +- No zoom and rotation of the layers +Common Issues: +- One ROM unused (32K in hotchase, 16K in wecleman) +- Incomplete DSWs +- Sprite ram is not cleared by the game and no sprite list end-marker + is written. We cope with that with an hack in the Blitter but there + must be a register to do the trick + + ---------------------------------------------------------------------- Hardware Main Sub Sound Sound Chips @@ -200,35 +217,6 @@ 61fc print test strings 18cbe print "game over" - ---------------------------------------------------------------------------- - Issues - [WEC Le Mans 24] ---------------------------------------------------------------------------- - -- The parallactic scrolling is sometimes wrong - - ---------------------------------------------------------------------------- - Issues - [Hot Chase] ---------------------------------------------------------------------------- - -- gameplay speed -- Samples pitch is too low -- No zoom and rotation of the layers - ---------------------------------------------------------------------------- - Common Issues ---------------------------------------------------------------------------- - -- One ROM unused (32K in hotchase, 16K in wecleman) -- Incomplete DSWs -- Sprite ram is not cleared by the game and no sprite list end-marker - is written. We cope with that with an hack in the Blitter but there - must be a register to do the trick - - Revisions: 05-05-2002 David Haywood(Haze) @@ -556,7 +544,6 @@ AM_RANGE(0x110000, 0x111fff) AM_RAM_WRITE(hotchase_paletteram16_SBGRBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x120000, 0x123fff) AM_RAM AM_SHARE("share1") // Shared with sub CPU AM_RANGE(0x130000, 0x130fff) AM_RAM AM_BASE_MEMBER(wecleman_state, m_spriteram) // Sprites - // Input Ports: AM_RANGE(0x140000, 0x140001) AM_WRITE(hotchase_soundlatch_w) // To sound CPU AM_RANGE(0x140002, 0x140003) AM_WRITE(selected_ip_w) // Selects accelerator / wheel / AM_RANGE(0x140004, 0x140005) AM_WRITE(irqctrl_w) // Main CPU controls the other CPUs @@ -1068,10 +1055,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(320 +16, 256) MCFG_SCREEN_VISIBLE_AREA(0 +8, 320-1 +8, 0 +8, 224-1 +8) - MCFG_SCREEN_UPDATE(wecleman) + MCFG_SCREEN_UPDATE_STATIC(wecleman) MCFG_GFXDECODE(wecleman) @@ -1117,6 +1103,20 @@ hotchase_zoom_callback_1 }; +static MACHINE_RESET( hotchase ) +{ + int i; + + /* TODO: PCB reference clearly shows that the POST has random/filled data on the paletteram. + For now let's fill everything with white colors until we have better info about it */ + for(i=0;i<0x2000/2;i++) + { + machine.generic.paletteram.u16[i] = 0xffff; + palette_set_color_rgb(machine,i,0xff,0xff,0xff); + } +} + + static MACHINE_CONFIG_START( hotchase, wecleman_state ) /* basic machine hardware */ @@ -1133,14 +1133,15 @@ MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + MCFG_MACHINE_RESET(hotchase) + /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(320 +16, 256) MCFG_SCREEN_VISIBLE_AREA(0, 320-1, 0, 224-1) - MCFG_SCREEN_UPDATE(hotchase) + MCFG_SCREEN_UPDATE_STATIC(hotchase) MCFG_GFXDECODE(hotchase) MCFG_PALETTE_LENGTH(2048*2) diff -Nru mame-0.144/src/mame/drivers/welltris.c mame-0.145/src/mame/drivers/welltris.c --- mame-0.144/src/mame/drivers/welltris.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/welltris.c 2012-02-06 21:30:39.000000000 +0000 @@ -720,10 +720,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(15, 367-1, 8, 248-1) - MCFG_SCREEN_UPDATE(welltris) + MCFG_SCREEN_UPDATE_STATIC(welltris) MCFG_GFXDECODE(welltris) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/wgp.c mame-0.145/src/mame/drivers/wgp.c --- mame-0.144/src/mame/drivers/wgp.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/wgp.c 2012-02-06 21:30:35.000000000 +0000 @@ -1023,10 +1023,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) - MCFG_SCREEN_UPDATE(wgp) + MCFG_SCREEN_UPDATE_STATIC(wgp) MCFG_GFXDECODE(wgp) MCFG_PALETTE_LENGTH(4096) diff -Nru mame-0.144/src/mame/drivers/wheelfir.c mame-0.145/src/mame/drivers/wheelfir.c --- mame-0.144/src/mame/drivers/wheelfir.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/wheelfir.c 2012-02-06 21:30:33.000000000 +0000 @@ -257,7 +257,7 @@ INT16 m_scanline_cnt; - bitmap_t *m_tmp_bitmap[2]; + bitmap_ind16 *m_tmp_bitmap[2]; INT32 get_scale(INT32 index) { @@ -321,7 +321,7 @@ if(x<512 && y <512) { - *BITMAP_ADDR16(state->m_tmp_bitmap[LAYER_BG], y, x) = sixdat; + state->m_tmp_bitmap[LAYER_BG]->pix16(y, x) = sixdat; } } @@ -539,7 +539,7 @@ //hack for clear if(screen_x >0 && screen_y >0 && screen_x < width && screen_y m_tmp_bitmap[vpage], screen_y , screen_x ) =0; + // state->m_tmp_bitmap[vpage]->pix16(screen_y , screen_x ) =0; } } else @@ -548,7 +548,7 @@ if(pix && screen_x >0 && screen_y >0 && screen_x < width && screen_y m_tmp_bitmap[vpage], screen_y , screen_x ) = pix; + state->m_tmp_bitmap[vpage]->pix16(screen_y , screen_x ) = pix; } } } @@ -560,20 +560,20 @@ static VIDEO_START(wheelfir) { wheelfir_state *state = machine.driver_data(); - state->m_tmp_bitmap[0] = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); - state->m_tmp_bitmap[1] = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); + state->m_tmp_bitmap[0] = auto_bitmap_ind16_alloc(machine, 512, 512); + state->m_tmp_bitmap[1] = auto_bitmap_ind16_alloc(machine, 512, 512); } -static SCREEN_UPDATE(wheelfir) +static SCREEN_UPDATE_IND16(wheelfir) { - wheelfir_state *state = screen->machine().driver_data(); + wheelfir_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect,0); + bitmap.fill(0, cliprect); for(int y=0;ym_tmp_bitmap[LAYER_BG],( (state->m_scanlines[y].y)&511), 0); - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *source = &state->m_tmp_bitmap[LAYER_BG]->pix16(( (state->m_scanlines[y].y)&511)); + UINT16 *dest = &bitmap.pix16(y); for (int x=0;x<336;x++) { @@ -583,11 +583,11 @@ } } - copybitmap_trans(bitmap, state->m_tmp_bitmap[LAYER_FG], 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *state->m_tmp_bitmap[LAYER_FG], 0, 0, 0, 0, cliprect, 0); /* { - bitmap_fill(state->m_tmp_bitmap[LAYER_BG], &screen->visible_area(),0); + state->m_tmp_bitmap[LAYER_BG]->fill(0, screen.visible_area()); } */ @@ -595,10 +595,14 @@ return 0; } -static SCREEN_EOF( wheelfir ) +static SCREEN_VBLANK( wheelfir ) { - wheelfir_state *state = machine.driver_data(); - bitmap_fill(state->m_tmp_bitmap[LAYER_FG], &machine.primary_screen->visible_area(),0); + // rising edge + if (vblank_on) + { + wheelfir_state *state = screen.machine().driver_data(); + state->m_tmp_bitmap[LAYER_FG]->fill(0, screen.visible_area()); + } } @@ -818,11 +822,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(336, NUM_SCANLINES+NUM_VBLANK_LINES) MCFG_SCREEN_VISIBLE_AREA(0,335, 0, NUM_SCANLINES-1) - MCFG_SCREEN_UPDATE(wheelfir) - MCFG_SCREEN_EOF(wheelfir) + MCFG_SCREEN_UPDATE_STATIC(wheelfir) + MCFG_SCREEN_VBLANK_STATIC(wheelfir) MCFG_PALETTE_LENGTH(NUM_COLORS) diff -Nru mame-0.144/src/mame/drivers/white_mod.c mame-0.145/src/mame/drivers/white_mod.c --- mame-0.144/src/mame/drivers/white_mod.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/white_mod.c 2012-02-06 21:30:37.000000000 +0000 @@ -1,6 +1,9 @@ /* Stern Whitestar (modified) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -8,18 +11,28 @@ { public: whitestar_mod_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( whitestar_mod_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( whitestar_mod_map, AS_PROGRAM, 8, whitestar_mod_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( whitestar_mod ) INPUT_PORTS_END -static MACHINE_RESET( whitestar_mod ) +void whitestar_mod_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(whitestar_mod_map) - - MCFG_MACHINE_RESET( whitestar_mod ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -60,6 +71,7 @@ ROM_LOAD("elvis.u36", 0x200000, 0x100000, CRC(e98f0dc9) SHA1(6dbab09435e993fef97d6a80a73675723bea7c1d)) ROM_LOAD("elvis.u37", 0x300000, 0x100000, CRC(88ba0966) SHA1(43ea198c9fcdc1c396d4180308042c6c08311829)) ROM_END + ROM_START(elvisp4) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpua.400", 0x0000, 0x20000, CRC(385be9ed) SHA1(c25b54a9b52bece17de9c394c019a4d2649bcf47)) @@ -82,6 +94,7 @@ ROM_LOAD("elvis.u36", 0x200000, 0x100000, CRC(e98f0dc9) SHA1(6dbab09435e993fef97d6a80a73675723bea7c1d)) ROM_LOAD("elvis.u37", 0x300000, 0x100000, CRC(88ba0966) SHA1(43ea198c9fcdc1c396d4180308042c6c08311829)) ROM_END + ROM_START(elvisp303) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpua.303", 0x0000, 0x20000, CRC(a0dd77d8) SHA1(2882eed805c2eb3cabadcfe51997a534ddac9050)) @@ -104,6 +117,7 @@ ROM_LOAD("elvis.u36", 0x200000, 0x100000, CRC(e98f0dc9) SHA1(6dbab09435e993fef97d6a80a73675723bea7c1d)) ROM_LOAD("elvis.u37", 0x300000, 0x100000, CRC(88ba0966) SHA1(43ea198c9fcdc1c396d4180308042c6c08311829)) ROM_END + ROM_START(elvisp302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpua.302", 0x0000, 0x20000, CRC(52fd7068) SHA1(548568aeb30a17541b07489dfecde9d4d63bf82b)) @@ -149,6 +163,7 @@ ROM_LOAD("elvisl.u36", 0x200000, 0x100000, CRC(01ebbdbe) SHA1(286fa471b20b6ffcb0114d66239ab6aebe9bca9d)) ROM_LOAD("elvisl.u37", 0x300000, 0x100000, CRC(bed26746) SHA1(385cb77ec7599b12a4b021c53b42b8e9b9fb08a8)) ROM_END + ROM_START(elvisl4) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpul.400", 0x0000, 0x20000, CRC(536d4e3c) SHA1(3470ffdc32dbce9142dab82c25915d617e1429e6)) @@ -171,6 +186,7 @@ ROM_LOAD("elvisl.u36", 0x200000, 0x100000, CRC(01ebbdbe) SHA1(286fa471b20b6ffcb0114d66239ab6aebe9bca9d)) ROM_LOAD("elvisl.u37", 0x300000, 0x100000, CRC(bed26746) SHA1(385cb77ec7599b12a4b021c53b42b8e9b9fb08a8)) ROM_END + ROM_START(elvisl303) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpul.303", 0x0000, 0x20000, CRC(691b9882) SHA1(fd8ceef9dbae6c788964d417ad1c61a4bb8e0d9b)) @@ -193,6 +209,7 @@ ROM_LOAD("elvisl.u36", 0x200000, 0x100000, CRC(01ebbdbe) SHA1(286fa471b20b6ffcb0114d66239ab6aebe9bca9d)) ROM_LOAD("elvisl.u37", 0x300000, 0x100000, CRC(bed26746) SHA1(385cb77ec7599b12a4b021c53b42b8e9b9fb08a8)) ROM_END + ROM_START(elvisl302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpul.302", 0x0000, 0x20000, CRC(0c6f1897) SHA1(ac71f833d4227c2d2d665a169eb0d12c73aeab04)) @@ -238,6 +255,7 @@ ROM_LOAD("elvisg.u36", 0x200000, 0x100000, CRC(25ba1ad4) SHA1(1e1a846af4ff43bb47f081b0cc179cd732c0bbea)) ROM_LOAD("elvisg.u37", 0x300000, 0x100000, CRC(f6d7a2a0) SHA1(54c160a298c7ead1fe0404bce51bc16211da82cf)) ROM_END + ROM_START(elvisg4) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpug.400", 0x0000, 0x20000, CRC(c5992b96) SHA1(0e8c285b76374daad17017994cd9d8e68a98ba42)) @@ -260,6 +278,7 @@ ROM_LOAD("elvisg.u36", 0x200000, 0x100000, CRC(25ba1ad4) SHA1(1e1a846af4ff43bb47f081b0cc179cd732c0bbea)) ROM_LOAD("elvisg.u37", 0x300000, 0x100000, CRC(f6d7a2a0) SHA1(54c160a298c7ead1fe0404bce51bc16211da82cf)) ROM_END + ROM_START(elvisg303) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpug.303", 0x0000, 0x20000, CRC(66b50538) SHA1(2612c0618c1d438632ff56b3b779214cf6534ff8)) @@ -282,6 +301,7 @@ ROM_LOAD("elvisg.u36", 0x200000, 0x100000, CRC(25ba1ad4) SHA1(1e1a846af4ff43bb47f081b0cc179cd732c0bbea)) ROM_LOAD("elvisg.u37", 0x300000, 0x100000, CRC(f6d7a2a0) SHA1(54c160a298c7ead1fe0404bce51bc16211da82cf)) ROM_END + ROM_START(elvisg302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpug.302", 0x0000, 0x20000, CRC(9d907782) SHA1(3bad8d0429029b0055d09e50af16bca4da724e0f)) @@ -327,6 +347,7 @@ ROM_LOAD("elvisf.u36", 0x200000, 0x100000, CRC(03ee0c04) SHA1(45a994589e3d9e6fe971db8722848b5f7432b675)) ROM_LOAD("elvisf.u37", 0x300000, 0x100000, CRC(aa265440) SHA1(36b13ef0be4203936d9816e521098e72d6b4e4c1)) ROM_END + ROM_START(elvisf4) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpuf.400", 0x0000, 0x20000, CRC(9ae4f3c4) SHA1(5ec1590ca54f36565953467226a85491a96d2d3c)) @@ -349,6 +370,7 @@ ROM_LOAD("elvisf.u36", 0x200000, 0x100000, CRC(03ee0c04) SHA1(45a994589e3d9e6fe971db8722848b5f7432b675)) ROM_LOAD("elvisf.u37", 0x300000, 0x100000, CRC(aa265440) SHA1(36b13ef0be4203936d9816e521098e72d6b4e4c1)) ROM_END + ROM_START(elvisf303) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpuf.303", 0x0000, 0x20000, CRC(bc5cc2b9) SHA1(f434164384153a3cca358af55ed82c7757e74fd9)) @@ -371,6 +393,7 @@ ROM_LOAD("elvisf.u36", 0x200000, 0x100000, CRC(03ee0c04) SHA1(45a994589e3d9e6fe971db8722848b5f7432b675)) ROM_LOAD("elvisf.u37", 0x300000, 0x100000, CRC(aa265440) SHA1(36b13ef0be4203936d9816e521098e72d6b4e4c1)) ROM_END + ROM_START(elvisf302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpuf.302", 0x0000, 0x20000, CRC(893a5ac6) SHA1(4be45cf036cdd643f10ecbb4d0b1778d25cf778a)) @@ -416,6 +439,7 @@ ROM_LOAD("elvisi.u36", 0x200000, 0x100000, CRC(df6772d7) SHA1(96e98ff4e93fc0c6fb2d9924da99b97f0c436c44)) ROM_LOAD("elvisi.u37", 0x300000, 0x100000, CRC(990fd624) SHA1(d5e104485dc8dd7386d8f3e7d99dc6cf7bf91568)) ROM_END + ROM_START(elvisi4) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpui.400", 0x0000, 0x20000, CRC(dd2876fc) SHA1(3b860ad176e3fda58be1f165fc2f9965f36259ef)) @@ -438,6 +462,7 @@ ROM_LOAD("elvisi.u36", 0x200000, 0x100000, CRC(df6772d7) SHA1(96e98ff4e93fc0c6fb2d9924da99b97f0c436c44)) ROM_LOAD("elvisi.u37", 0x300000, 0x100000, CRC(990fd624) SHA1(d5e104485dc8dd7386d8f3e7d99dc6cf7bf91568)) ROM_END + ROM_START(elvisi303) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpui.303", 0x0000, 0x20000, CRC(11f47b7a) SHA1(4fbe64ed49719408b77ebf6871bb2211e03de394)) @@ -460,6 +485,7 @@ ROM_LOAD("elvisi.u36", 0x200000, 0x100000, CRC(df6772d7) SHA1(96e98ff4e93fc0c6fb2d9924da99b97f0c436c44)) ROM_LOAD("elvisi.u37", 0x300000, 0x100000, CRC(990fd624) SHA1(d5e104485dc8dd7386d8f3e7d99dc6cf7bf91568)) ROM_END + ROM_START(elvisi302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "elvscpui.302", 0x0000, 0x20000, CRC(a2c15460) SHA1(dcd4d4b61745ab2ccba662f9d72f56774a830ea0)) @@ -531,6 +557,7 @@ ROM_LOAD("gpsnda.u36", 0x200000, 0x100000, CRC(6e414e19) SHA1(5b7c9da9c340ec3b55163f5674d72ab30ffbb866)) ROM_LOAD("gpsnda.u37", 0x300000, 0x100000, CRC(caf4c3f3) SHA1(ebdbaccf951ef6525f0fafa7e23d8140ef6b84e5)) ROM_END + ROM_START(gprix_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpua.352", 0x0000, 0x20000, CRC(da46b437) SHA1(07cf288d47e1447c015e5bb1fd85df654bde71ef)) @@ -553,6 +580,7 @@ ROM_LOAD("gpsnda.u36", 0x200000, 0x100000, CRC(6e414e19) SHA1(5b7c9da9c340ec3b55163f5674d72ab30ffbb866)) ROM_LOAD("gpsnda.u37", 0x300000, 0x100000, CRC(caf4c3f3) SHA1(ebdbaccf951ef6525f0fafa7e23d8140ef6b84e5)) ROM_END + ROM_START(gprix_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpua.350", 0x0000, 0x20000, CRC(bd47be96) SHA1(31b7adc5cec10d18dd551fdba94fbdb8c6eac01b)) @@ -575,6 +603,7 @@ ROM_LOAD("gpsnda.u36", 0x200000, 0x100000, CRC(6e414e19) SHA1(5b7c9da9c340ec3b55163f5674d72ab30ffbb866)) ROM_LOAD("gpsnda.u37", 0x300000, 0x100000, CRC(caf4c3f3) SHA1(ebdbaccf951ef6525f0fafa7e23d8140ef6b84e5)) ROM_END + ROM_START(gprix_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpua.340", 0x0000, 0x20000, CRC(798f2ab3) SHA1(046cbbd0115511b2cbd7f132b0755d03edce1e7b)) @@ -597,6 +626,7 @@ ROM_LOAD("gpsnda.u36", 0x200000, 0x100000, CRC(6e414e19) SHA1(5b7c9da9c340ec3b55163f5674d72ab30ffbb866)) ROM_LOAD("gpsnda.u37", 0x300000, 0x100000, CRC(caf4c3f3) SHA1(ebdbaccf951ef6525f0fafa7e23d8140ef6b84e5)) ROM_END + ROM_START(gprix_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpua.301", 0x0000, 0x20000, CRC(07cdb3eb) SHA1(2246d253dca93ce8c5f6775352611a3145ab8776)) @@ -642,6 +672,7 @@ ROM_LOAD("gpsndg.u36", 0x200000, 0x100000, CRC(415baa1b) SHA1(cca21e0e5ef0cbe34c9514d72a06fc129990787a)) ROM_LOAD("gpsndg.u37", 0x300000, 0x100000, CRC(e4a6ae7f) SHA1(4a4cd973f90c13ced07459c8f457314c8280dd6a)) ROM_END + ROM_START(gprixg_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpug.400", 0x0000, 0x20000, CRC(98d69588) SHA1(9d248b00a1aa966e69816cd7aaf869737e7a1ca7)) @@ -664,6 +695,7 @@ ROM_LOAD("gpsndg.u36", 0x200000, 0x100000, CRC(415baa1b) SHA1(cca21e0e5ef0cbe34c9514d72a06fc129990787a)) ROM_LOAD("gpsndg.u37", 0x300000, 0x100000, CRC(e4a6ae7f) SHA1(4a4cd973f90c13ced07459c8f457314c8280dd6a)) ROM_END + ROM_START(gprixg_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpug.352", 0x0000, 0x20000, CRC(b6c15f62) SHA1(b8757e7ef7064d200c7965902b624c8ef947f23d)) @@ -686,6 +718,7 @@ ROM_LOAD("gpsndg.u36", 0x200000, 0x100000, CRC(415baa1b) SHA1(cca21e0e5ef0cbe34c9514d72a06fc129990787a)) ROM_LOAD("gpsndg.u37", 0x300000, 0x100000, CRC(e4a6ae7f) SHA1(4a4cd973f90c13ced07459c8f457314c8280dd6a)) ROM_END + ROM_START(gprixg_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpug.350", 0x0000, 0x20000, CRC(8e77c953) SHA1(07d23ce2f0b0a2dc6284b71d1a4a8d1bb5dab6d0)) @@ -708,6 +741,7 @@ ROM_LOAD("gpsndg.u36", 0x200000, 0x100000, CRC(415baa1b) SHA1(cca21e0e5ef0cbe34c9514d72a06fc129990787a)) ROM_LOAD("gpsndg.u37", 0x300000, 0x100000, CRC(e4a6ae7f) SHA1(4a4cd973f90c13ced07459c8f457314c8280dd6a)) ROM_END + ROM_START(gprixg_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpug.340", 0x0000, 0x20000, CRC(34afe4e4) SHA1(0655be39f309f32dffca22d7ab780263da5e8cb2)) @@ -730,6 +764,7 @@ ROM_LOAD("gpsndg.u36", 0x200000, 0x100000, CRC(415baa1b) SHA1(cca21e0e5ef0cbe34c9514d72a06fc129990787a)) ROM_LOAD("gpsndg.u37", 0x300000, 0x100000, CRC(e4a6ae7f) SHA1(4a4cd973f90c13ced07459c8f457314c8280dd6a)) ROM_END + ROM_START(gprixg_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpug.301", 0x0000, 0x20000, CRC(23ac882e) SHA1(5194c3ea18a08f844f4ee293c9de44b62a956ee6)) @@ -775,6 +810,7 @@ ROM_LOAD("gpsndl.u36", 0x200000, 0x100000, CRC(863de01a) SHA1(3f1fd157c2abacdab072146499b64b9e0853fb3e)) ROM_LOAD("gpsndl.u37", 0x300000, 0x100000, CRC(db16b68a) SHA1(815fdcd4ae01c6264133389ce3194da572e1c232)) ROM_END + ROM_START(gprixl_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpul.400", 0x0000, 0x20000, CRC(90f506f0) SHA1(4642fa8bf15955a32b6ae8c6b859d94dcd40c542)) @@ -797,6 +833,7 @@ ROM_LOAD("gpsndl.u36", 0x200000, 0x100000, CRC(863de01a) SHA1(3f1fd157c2abacdab072146499b64b9e0853fb3e)) ROM_LOAD("gpsndl.u37", 0x300000, 0x100000, CRC(db16b68a) SHA1(815fdcd4ae01c6264133389ce3194da572e1c232)) ROM_END + ROM_START(gprixl_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpul.352", 0x0000, 0x20000, CRC(cd296661) SHA1(e706525b07e1e1278ab65a896616e63be52e8e73)) @@ -819,6 +856,7 @@ ROM_LOAD("gpsndl.u36", 0x200000, 0x100000, CRC(863de01a) SHA1(3f1fd157c2abacdab072146499b64b9e0853fb3e)) ROM_LOAD("gpsndl.u37", 0x300000, 0x100000, CRC(db16b68a) SHA1(815fdcd4ae01c6264133389ce3194da572e1c232)) ROM_END + ROM_START(gprixl_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpul.350", 0x0000, 0x20000, CRC(714f0641) SHA1(c09aa248fe04fc3c569c6786c0db8d396cbd2403)) @@ -841,6 +879,7 @@ ROM_LOAD("gpsndl.u36", 0x200000, 0x100000, CRC(863de01a) SHA1(3f1fd157c2abacdab072146499b64b9e0853fb3e)) ROM_LOAD("gpsndl.u37", 0x300000, 0x100000, CRC(db16b68a) SHA1(815fdcd4ae01c6264133389ce3194da572e1c232)) ROM_END + ROM_START(gprixl_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpul.340", 0x0000, 0x20000, CRC(2cd2f25f) SHA1(ee21a680cf56b6b415b2b9f5d89125062b24f8ae)) @@ -863,6 +902,7 @@ ROM_LOAD("gpsndl.u36", 0x200000, 0x100000, CRC(863de01a) SHA1(3f1fd157c2abacdab072146499b64b9e0853fb3e)) ROM_LOAD("gpsndl.u37", 0x300000, 0x100000, CRC(db16b68a) SHA1(815fdcd4ae01c6264133389ce3194da572e1c232)) ROM_END + ROM_START(gprixl_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpul.301", 0x0000, 0x20000, CRC(ad739825) SHA1(c2fbc25985b83bacd4285b6608366de485f16982)) @@ -908,6 +948,7 @@ ROM_LOAD("gpsndf.u36", 0x200000, 0x100000, CRC(4e41f0bb) SHA1(4a25b472a9435c77712559d7ded1649dffbc885c)) ROM_LOAD("gpsndf.u37", 0x300000, 0x100000, CRC(e6d96767) SHA1(a471d51796edad71eb21aadc4a26bb1529a0b9cc)) ROM_END + ROM_START(gprixf_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpuf.400", 0x0000, 0x20000, CRC(0e7f8776) SHA1(0731c3a5350445f70dd8bdac68b2554942f12c8d)) @@ -930,6 +971,7 @@ ROM_LOAD("gpsndf.u36", 0x200000, 0x100000, CRC(4e41f0bb) SHA1(4a25b472a9435c77712559d7ded1649dffbc885c)) ROM_LOAD("gpsndf.u37", 0x300000, 0x100000, CRC(e6d96767) SHA1(a471d51796edad71eb21aadc4a26bb1529a0b9cc)) ROM_END + ROM_START(gprixf_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpuf.352", 0x0000, 0x20000, CRC(78140cd3) SHA1(9c7257dede5c3bf78d9a9bbdf89bd01f12180c4f)) @@ -952,6 +994,7 @@ ROM_LOAD("gpsndf.u36", 0x200000, 0x100000, CRC(4e41f0bb) SHA1(4a25b472a9435c77712559d7ded1649dffbc885c)) ROM_LOAD("gpsndf.u37", 0x300000, 0x100000, CRC(e6d96767) SHA1(a471d51796edad71eb21aadc4a26bb1529a0b9cc)) ROM_END + ROM_START(gprixf_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpuf.350", 0x0000, 0x20000, CRC(ad4224e9) SHA1(781a76ef14e7abb2b57ae49cd8712ddace8a4fca)) @@ -974,6 +1017,7 @@ ROM_LOAD("gpsndf.u36", 0x200000, 0x100000, CRC(4e41f0bb) SHA1(4a25b472a9435c77712559d7ded1649dffbc885c)) ROM_LOAD("gpsndf.u37", 0x300000, 0x100000, CRC(e6d96767) SHA1(a471d51796edad71eb21aadc4a26bb1529a0b9cc)) ROM_END + ROM_START(gprixf_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpuf.340", 0x0000, 0x20000, CRC(cefc30e4) SHA1(2ffdfd09ed8ba00a36a6bf12b79200c562b7dc0d)) @@ -996,6 +1040,7 @@ ROM_LOAD("gpsndf.u36", 0x200000, 0x100000, CRC(4e41f0bb) SHA1(4a25b472a9435c77712559d7ded1649dffbc885c)) ROM_LOAD("gpsndf.u37", 0x300000, 0x100000, CRC(e6d96767) SHA1(a471d51796edad71eb21aadc4a26bb1529a0b9cc)) ROM_END + ROM_START(gprixf_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpuf.301", 0x0000, 0x20000, CRC(6f9d34ee) SHA1(a8b60300cc1e07d3beb8d607e24285dbbd871e83)) @@ -1041,6 +1086,7 @@ ROM_LOAD("gpsndi.u36", 0x200000, 0x100000, CRC(f8558b24) SHA1(ceb3880b026fb7fcc69eb8d94e33e30c56c24de8)) ROM_LOAD("gpsndi.u37", 0x300000, 0x100000, CRC(a76c6682) SHA1(6d319a8f07c10fe392fc0b8e177cc6abbce0b536)) ROM_END + ROM_START(gprixi_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpui.400", 0x0000, 0x20000, CRC(49e161b7) SHA1(855e35ddedf35055de384bade4b237810bc5ffec)) @@ -1063,6 +1109,7 @@ ROM_LOAD("gpsndi.u36", 0x200000, 0x100000, CRC(f8558b24) SHA1(ceb3880b026fb7fcc69eb8d94e33e30c56c24de8)) ROM_LOAD("gpsndi.u37", 0x300000, 0x100000, CRC(a76c6682) SHA1(6d319a8f07c10fe392fc0b8e177cc6abbce0b536)) ROM_END + ROM_START(gprixi_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpui.352", 0x0000, 0x20000, CRC(941bd2a9) SHA1(11402004c5b57de5ec28ea2f4128b1852c205dac)) @@ -1085,6 +1132,7 @@ ROM_LOAD("gpsndi.u36", 0x200000, 0x100000, CRC(f8558b24) SHA1(ceb3880b026fb7fcc69eb8d94e33e30c56c24de8)) ROM_LOAD("gpsndi.u37", 0x300000, 0x100000, CRC(a76c6682) SHA1(6d319a8f07c10fe392fc0b8e177cc6abbce0b536)) ROM_END + ROM_START(gprixi_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpui.350", 0x0000, 0x20000, CRC(64bc5f6b) SHA1(fb079323d3548f1915de93d724d3fb76b2e02f27)) @@ -1107,6 +1155,7 @@ ROM_LOAD("gpsndi.u36", 0x200000, 0x100000, CRC(f8558b24) SHA1(ceb3880b026fb7fcc69eb8d94e33e30c56c24de8)) ROM_LOAD("gpsndi.u37", 0x300000, 0x100000, CRC(a76c6682) SHA1(6d319a8f07c10fe392fc0b8e177cc6abbce0b536)) ROM_END + ROM_START(gprixi_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpui.340", 0x0000, 0x20000, CRC(35f4a870) SHA1(24293fafcec6180ab62ef3298e4b53910e05a937)) @@ -1129,6 +1178,7 @@ ROM_LOAD("gpsndi.u36", 0x200000, 0x100000, CRC(f8558b24) SHA1(ceb3880b026fb7fcc69eb8d94e33e30c56c24de8)) ROM_LOAD("gpsndi.u37", 0x300000, 0x100000, CRC(a76c6682) SHA1(6d319a8f07c10fe392fc0b8e177cc6abbce0b536)) ROM_END + ROM_START(gprixi_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "gpcpui.301", 0x0000, 0x20000, CRC(d9be9fd7) SHA1(3dfc997d8d17d153ee42df0adb7993293bfff7e8)) @@ -1177,6 +1227,7 @@ ROM_LOAD("nassnd.u36", 0x200000, 0x100000, CRC(2385ada2) SHA1(d3b59beffe6817cc3ea1140698095886ec2f2324)) ROM_LOAD("nassnd.u37", 0x300000, 0x100000, CRC(458ba148) SHA1(594fd9b48aa48ab7b3df921e689b1acba2b09d79)) ROM_END + ROM_START(nascar_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpua.400", 0x0000, 0x20000, CRC(24a72071) SHA1(5bfe473e85e12b30963b15dfc8732f2ef9c299c3)) @@ -1199,6 +1250,7 @@ ROM_LOAD("nassnd.u36", 0x200000, 0x100000, CRC(2385ada2) SHA1(d3b59beffe6817cc3ea1140698095886ec2f2324)) ROM_LOAD("nassnd.u37", 0x300000, 0x100000, CRC(458ba148) SHA1(594fd9b48aa48ab7b3df921e689b1acba2b09d79)) ROM_END + ROM_START(nascar_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpua.352", 0x0000, 0x20000, CRC(65b8132e) SHA1(b42dca3e68d3eff158bae830f6c8cca00e0ed3e2)) @@ -1221,6 +1273,7 @@ ROM_LOAD("nassnd.u36", 0x200000, 0x100000, CRC(2385ada2) SHA1(d3b59beffe6817cc3ea1140698095886ec2f2324)) ROM_LOAD("nassnd.u37", 0x300000, 0x100000, CRC(458ba148) SHA1(594fd9b48aa48ab7b3df921e689b1acba2b09d79)) ROM_END + ROM_START(nascar_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpua.350", 0x0000, 0x20000, CRC(e5b4ed49) SHA1(0d38c0e08862a0a5a200225634c5bf0d0afe5afe)) @@ -1243,6 +1296,7 @@ ROM_LOAD("nassnd.u36", 0x200000, 0x100000, CRC(2385ada2) SHA1(d3b59beffe6817cc3ea1140698095886ec2f2324)) ROM_LOAD("nassnd.u37", 0x300000, 0x100000, CRC(458ba148) SHA1(594fd9b48aa48ab7b3df921e689b1acba2b09d79)) ROM_END + ROM_START(nascar_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpua.340", 0x0000, 0x20000, CRC(120dc65a) SHA1(151c1604dacb1c1cf74449291d81629a05fb1b09)) @@ -1265,6 +1319,7 @@ ROM_LOAD("nassnd.u36", 0x200000, 0x100000, CRC(2385ada2) SHA1(d3b59beffe6817cc3ea1140698095886ec2f2324)) ROM_LOAD("nassnd.u37", 0x300000, 0x100000, CRC(458ba148) SHA1(594fd9b48aa48ab7b3df921e689b1acba2b09d79)) ROM_END + ROM_START(nascar_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpua.301", 0x0000, 0x20000, CRC(8ede60c2) SHA1(aa49da40f2ed858c5fa260ce5e7dd096b4217544)) @@ -1310,6 +1365,7 @@ ROM_LOAD("nassndl.u36", 0x200000, 0x100000, CRC(9e2658b1) SHA1(0d93a381a65f11022a1a6da5e5b0e4a0e779f336)) ROM_LOAD("nassndl.u37", 0x300000, 0x100000, CRC(63f084ab) SHA1(519807bf6e868df6f756ad30af2f6636804f167c)) ROM_END + ROM_START(nascarl_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpul.400", 0x0000, 0x20000, CRC(23ca7b4a) SHA1(9ea7afb283157a8e65106dc027cfd45eecc3f86a)) @@ -1332,6 +1388,7 @@ ROM_LOAD("nassndl.u36", 0x200000, 0x100000, CRC(9e2658b1) SHA1(0d93a381a65f11022a1a6da5e5b0e4a0e779f336)) ROM_LOAD("nassndl.u37", 0x300000, 0x100000, CRC(63f084ab) SHA1(519807bf6e868df6f756ad30af2f6636804f167c)) ROM_END + ROM_START(nascarl_352) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpul.352", 0x0000, 0x20000, CRC(c78549d8) SHA1(9796c0d413fd2ea7f616ad238b67311c8c29286d)) @@ -1354,6 +1411,7 @@ ROM_LOAD("nassndl.u36", 0x200000, 0x100000, CRC(9e2658b1) SHA1(0d93a381a65f11022a1a6da5e5b0e4a0e779f336)) ROM_LOAD("nassndl.u37", 0x300000, 0x100000, CRC(63f084ab) SHA1(519807bf6e868df6f756ad30af2f6636804f167c)) ROM_END + ROM_START(nascarl_350) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpul.350", 0x0000, 0x20000, CRC(ab749309) SHA1(95d35126bda75c68037010f001c28a860b6a6e0c)) @@ -1376,6 +1434,7 @@ ROM_LOAD("nassndl.u36", 0x200000, 0x100000, CRC(9e2658b1) SHA1(0d93a381a65f11022a1a6da5e5b0e4a0e779f336)) ROM_LOAD("nassndl.u37", 0x300000, 0x100000, CRC(63f084ab) SHA1(519807bf6e868df6f756ad30af2f6636804f167c)) ROM_END + ROM_START(nascarl_340) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpul.340", 0x0000, 0x20000, CRC(d5827082) SHA1(660216472a1faa445701eb3735771568cdba7b24)) @@ -1398,6 +1457,7 @@ ROM_LOAD("nassndl.u36", 0x200000, 0x100000, CRC(9e2658b1) SHA1(0d93a381a65f11022a1a6da5e5b0e4a0e779f336)) ROM_LOAD("nassndl.u37", 0x300000, 0x100000, CRC(63f084ab) SHA1(519807bf6e868df6f756ad30af2f6636804f167c)) ROM_END + ROM_START(nascarl_301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "nascpul.301", 0x0000, 0x20000, CRC(6c8fc295) SHA1(2852afb38807a96907bc7357c08235de643dfb29)) @@ -1492,6 +1552,7 @@ ROM_LOAD("ripsnd.u36", 0x200000, 0x100000, CRC(b697b5cb) SHA1(b5cb426201287a6d1c40db8c81a58e2c656d1d81)) ROM_LOAD("ripsnd.u37", 0x300000, 0x100000, CRC(01b9f20e) SHA1(cffb6a0136d7d17ab4450b3bfd97632d8b669d39)) ROM_END + ROM_START(rip301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.301", 0x0000, 0x20000, CRC(a867d1b4) SHA1(dca4ba5c981397d26cac016d8438704f7adea0f3)) @@ -1514,6 +1575,7 @@ ROM_LOAD("ripsnd.u36", 0x200000, 0x100000, CRC(b697b5cb) SHA1(b5cb426201287a6d1c40db8c81a58e2c656d1d81)) ROM_LOAD("ripsnd.u37", 0x300000, 0x100000, CRC(01b9f20e) SHA1(cffb6a0136d7d17ab4450b3bfd97632d8b669d39)) ROM_END + ROM_START(rip300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.300", 0x0000, 0x20000, CRC(8c4bf2a9) SHA1(260dd5a99a36de541b5f852047ae4166afc621cc)) @@ -1536,6 +1598,7 @@ ROM_LOAD("ripsnd.u36", 0x200000, 0x100000, CRC(b697b5cb) SHA1(b5cb426201287a6d1c40db8c81a58e2c656d1d81)) ROM_LOAD("ripsnd.u37", 0x300000, 0x100000, CRC(01b9f20e) SHA1(cffb6a0136d7d17ab4450b3bfd97632d8b669d39)) ROM_END + ROM_START(ripleysf) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("ripcpu.320", 0x00000, 0x20000, CRC(aa997826) SHA1(2f9701370e64dd55a9bafe0c65e7eb4b9c5dbdd2)) @@ -1558,6 +1621,7 @@ ROM_LOAD("ripsndf.u36", 0x200000, 0x100000, CRC(0a57f2fd) SHA1(9dd057888294ee8abeb582e8f6650fd6e32cc9ff)) ROM_LOAD("ripsndf.u37", 0x300000, 0x100000, CRC(5c858958) SHA1(f4a9833b8aee033ed381e3bdf9f801b935d6186a)) ROM_END + ROM_START(ripf310) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.310", 0x0000, 0x20000, CRC(669f87cc) SHA1(0e07bbcf337bf7c289a9093d3db805da617cbfef)) @@ -1580,6 +1644,7 @@ ROM_LOAD("ripsndf.u36", 0x200000, 0x100000, CRC(0a57f2fd) SHA1(9dd057888294ee8abeb582e8f6650fd6e32cc9ff)) ROM_LOAD("ripsndf.u37", 0x300000, 0x100000, CRC(5c858958) SHA1(f4a9833b8aee033ed381e3bdf9f801b935d6186a)) ROM_END + ROM_START(ripf302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.302", 0x0000, 0x20000, CRC(ee79d9eb) SHA1(79b45ceac00ebd414a9fb1d97c05252d9f953872)) @@ -1602,6 +1667,7 @@ ROM_LOAD("ripsndf.u36", 0x200000, 0x100000, CRC(0a57f2fd) SHA1(9dd057888294ee8abeb582e8f6650fd6e32cc9ff)) ROM_LOAD("ripsndf.u37", 0x300000, 0x100000, CRC(5c858958) SHA1(f4a9833b8aee033ed381e3bdf9f801b935d6186a)) ROM_END + ROM_START(ripf301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.301", 0x0000, 0x20000, CRC(a867d1b4) SHA1(dca4ba5c981397d26cac016d8438704f7adea0f3)) @@ -1624,6 +1690,7 @@ ROM_LOAD("ripsndf.u36", 0x200000, 0x100000, CRC(0a57f2fd) SHA1(9dd057888294ee8abeb582e8f6650fd6e32cc9ff)) ROM_LOAD("ripsndf.u37", 0x300000, 0x100000, CRC(5c858958) SHA1(f4a9833b8aee033ed381e3bdf9f801b935d6186a)) ROM_END + ROM_START(ripf300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.300", 0x0000, 0x20000, CRC(8c4bf2a9) SHA1(260dd5a99a36de541b5f852047ae4166afc621cc)) @@ -1715,6 +1782,7 @@ ROM_LOAD("ripsndg.u36", 0x200000, 0x100000, CRC(3143f9d3) SHA1(bd4ce64b245b5fcb9b9694bd8f71a9cd98303cae)) ROM_LOAD("ripsndg.u37", 0x300000, 0x100000, CRC(2167617b) SHA1(62b55a39e2677eec9d56b10e8cc3e5d7c0d3bea5)) ROM_END + ROM_START(ripg301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.301", 0x0000, 0x20000, CRC(a867d1b4) SHA1(dca4ba5c981397d26cac016d8438704f7adea0f3)) @@ -1737,6 +1805,7 @@ ROM_LOAD("ripsndg.u36", 0x200000, 0x100000, CRC(3143f9d3) SHA1(bd4ce64b245b5fcb9b9694bd8f71a9cd98303cae)) ROM_LOAD("ripsndg.u37", 0x300000, 0x100000, CRC(2167617b) SHA1(62b55a39e2677eec9d56b10e8cc3e5d7c0d3bea5)) ROM_END + ROM_START(ripg300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.300", 0x0000, 0x20000, CRC(8c4bf2a9) SHA1(260dd5a99a36de541b5f852047ae4166afc621cc)) @@ -1782,6 +1851,7 @@ ROM_LOAD("ripsndi.u36", 0x200000, 0x100000, CRC(6a124fa6) SHA1(752c3d227b9a98dd859e4778ddd527edaa3cf512)) ROM_LOAD("ripsndi.u37", 0x300000, 0x100000, CRC(7933c102) SHA1(f736ee86d7c67dab82c634d125d73a2453249706)) ROM_END + ROM_START(ripi310) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.310", 0x0000, 0x20000, CRC(669f87cc) SHA1(0e07bbcf337bf7c289a9093d3db805da617cbfef)) @@ -1804,6 +1874,7 @@ ROM_LOAD("ripsndi.u36", 0x200000, 0x100000, CRC(6a124fa6) SHA1(752c3d227b9a98dd859e4778ddd527edaa3cf512)) ROM_LOAD("ripsndi.u37", 0x300000, 0x100000, CRC(7933c102) SHA1(f736ee86d7c67dab82c634d125d73a2453249706)) ROM_END + ROM_START(ripi302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.302", 0x0000, 0x20000, CRC(ee79d9eb) SHA1(79b45ceac00ebd414a9fb1d97c05252d9f953872)) @@ -1826,6 +1897,7 @@ ROM_LOAD("ripsndi.u36", 0x200000, 0x100000, CRC(6a124fa6) SHA1(752c3d227b9a98dd859e4778ddd527edaa3cf512)) ROM_LOAD("ripsndi.u37", 0x300000, 0x100000, CRC(7933c102) SHA1(f736ee86d7c67dab82c634d125d73a2453249706)) ROM_END + ROM_START(ripi301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.301", 0x0000, 0x20000, CRC(a867d1b4) SHA1(dca4ba5c981397d26cac016d8438704f7adea0f3)) @@ -1848,6 +1920,7 @@ ROM_LOAD("ripsndi.u36", 0x200000, 0x100000, CRC(6a124fa6) SHA1(752c3d227b9a98dd859e4778ddd527edaa3cf512)) ROM_LOAD("ripsndi.u37", 0x300000, 0x100000, CRC(7933c102) SHA1(f736ee86d7c67dab82c634d125d73a2453249706)) ROM_END + ROM_START(ripi300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.300", 0x0000, 0x20000, CRC(8c4bf2a9) SHA1(260dd5a99a36de541b5f852047ae4166afc621cc)) @@ -1893,6 +1966,7 @@ ROM_LOAD("ripsndl.u36", 0x200000, 0x100000, CRC(c5461b63) SHA1(fc574d44ad88ce1db590ea371225092c03fc6f80)) ROM_LOAD("ripsndl.u37", 0x300000, 0x100000, CRC(2a58f491) SHA1(1c33f419420b3165ef18598560007ef612b24814)) ROM_END + ROM_START(ripl310) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.310", 0x0000, 0x20000, CRC(669f87cc) SHA1(0e07bbcf337bf7c289a9093d3db805da617cbfef)) @@ -1915,6 +1989,7 @@ ROM_LOAD("ripsndl.u36", 0x200000, 0x100000, CRC(c5461b63) SHA1(fc574d44ad88ce1db590ea371225092c03fc6f80)) ROM_LOAD("ripsndl.u37", 0x300000, 0x100000, CRC(2a58f491) SHA1(1c33f419420b3165ef18598560007ef612b24814)) ROM_END + ROM_START(ripl302) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.302", 0x0000, 0x20000, CRC(ee79d9eb) SHA1(79b45ceac00ebd414a9fb1d97c05252d9f953872)) @@ -1937,6 +2012,7 @@ ROM_LOAD("ripsndl.u36", 0x200000, 0x100000, CRC(c5461b63) SHA1(fc574d44ad88ce1db590ea371225092c03fc6f80)) ROM_LOAD("ripsndl.u37", 0x300000, 0x100000, CRC(2a58f491) SHA1(1c33f419420b3165ef18598560007ef612b24814)) ROM_END + ROM_START(ripl301) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.301", 0x0000, 0x20000, CRC(a867d1b4) SHA1(dca4ba5c981397d26cac016d8438704f7adea0f3)) @@ -1959,6 +2035,7 @@ ROM_LOAD("ripsndl.u36", 0x200000, 0x100000, CRC(c5461b63) SHA1(fc574d44ad88ce1db590ea371225092c03fc6f80)) ROM_LOAD("ripsndl.u37", 0x300000, 0x100000, CRC(2a58f491) SHA1(1c33f419420b3165ef18598560007ef612b24814)) ROM_END + ROM_START(ripl300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "ripcpu.300", 0x0000, 0x20000, CRC(8c4bf2a9) SHA1(260dd5a99a36de541b5f852047ae4166afc621cc)) @@ -2008,6 +2085,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr9) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.900", 0x0000, 0x20000, CRC(eff1ab83) SHA1(cd9cfa3fa150224e44078602db7d8bbfe223b926)) @@ -2030,6 +2108,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr8) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.800", 0x0000, 0x20000, CRC(655e5b3c) SHA1(bd6fd25e17cee40d6bb842367b1ce922bbd46003)) @@ -2052,6 +2131,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr7) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.700", 0x0000, 0x20000, CRC(208a4653) SHA1(570f3070c6b0f128d451f3dea01e41a9944081f2)) @@ -2074,6 +2154,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr6) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.600", 0x0000, 0x20000, CRC(02786892) SHA1(6810d5a5eb80f520e611a46921dbd2906fbebf2f)) @@ -2096,6 +2177,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr501) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.501", 0x0000, 0x20000, CRC(df9fd692) SHA1(2d06c1a763330b1b9429961f3e13574e0eefe7a7)) @@ -2118,6 +2200,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr5) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.500", 0x0000, 0x20000, CRC(4b45a543) SHA1(e0be3a4244025abc2c109f58b0d637262711b9db)) @@ -2140,6 +2223,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr410) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.410", 0x0000, 0x20000, CRC(458af09a) SHA1(2680f16d7f33ffc70b64bfb7d35cccf6989c70e2)) @@ -2162,6 +2246,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr401) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.401", 0x0000, 0x20000, CRC(b69cdecc) SHA1(40f7c2d25a1028255be8fe25e3aa6d11976edd25)) @@ -2207,6 +2292,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp9) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.900", 0x0000, 0x20000, CRC(155b5d5b) SHA1(c032e3828ed256240a5155ec4c7820d615a2cbe1)) @@ -2252,6 +2338,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp7) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.700", 0x0000, 0x20000, CRC(58d8611b) SHA1(ff1e1668993c7c31f04efc22f04ae53112219a1d)) @@ -2274,6 +2361,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp6) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.600", 0x0000, 0x20000, CRC(af06c560) SHA1(0dec564e8e50ca8e05c462517db38ae48e512e79)) @@ -2296,6 +2384,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp501) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.501", 0x0000, 0x20000, CRC(4c0c7360) SHA1(f057931eb719a7a6691187fa7ca86cd6e4541d90)) @@ -2318,6 +2407,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp5) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.500", 0x0000, 0x20000, CRC(298d10bd) SHA1(133990aed459d5fcd191a08462a231bbd3449387)) @@ -2340,6 +2430,7 @@ ROM_LOAD("lotrlu36.100", 0x200000, 0x100000, CRC(502c3d93) SHA1(4ee42d70bccb9253fe1f8f441de6b5018257f107)) ROM_LOAD("lotrlu37.100", 0x300000, 0x100000, CRC(61f21c6d) SHA1(3e9781b4981bd18cdb8c59c55b9942de6ae286db)) ROM_END + ROM_START(lotr_sp401) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpul.401", 0x0000, 0x20000, CRC(a9571728) SHA1(f21dd77003f42fafd9293fab3a077c5abf6d572a)) @@ -2386,6 +2477,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr9) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.900", 0x0000, 0x20000, CRC(eff1ab83) SHA1(cd9cfa3fa150224e44078602db7d8bbfe223b926)) @@ -2408,6 +2500,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr8) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.800", 0x0000, 0x20000, CRC(655e5b3c) SHA1(bd6fd25e17cee40d6bb842367b1ce922bbd46003)) @@ -2430,6 +2523,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr7) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.700", 0x0000, 0x20000, CRC(208a4653) SHA1(570f3070c6b0f128d451f3dea01e41a9944081f2)) @@ -2452,6 +2546,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr6) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.600", 0x0000, 0x20000, CRC(02786892) SHA1(6810d5a5eb80f520e611a46921dbd2906fbebf2f)) @@ -2474,6 +2569,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr501) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.501", 0x0000, 0x20000, CRC(df9fd692) SHA1(2d06c1a763330b1b9429961f3e13574e0eefe7a7)) @@ -2496,6 +2592,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr5) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.500", 0x0000, 0x20000, CRC(4b45a543) SHA1(e0be3a4244025abc2c109f58b0d637262711b9db)) @@ -2518,6 +2615,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr410) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.410", 0x0000, 0x20000, CRC(458af09a) SHA1(2680f16d7f33ffc70b64bfb7d35cccf6989c70e2)) @@ -2540,6 +2638,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_gr401) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.401", 0x0000, 0x20000, CRC(b69cdecc) SHA1(40f7c2d25a1028255be8fe25e3aa6d11976edd25)) @@ -2585,6 +2684,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr9) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.900", 0x0000, 0x20000, CRC(eff1ab83) SHA1(cd9cfa3fa150224e44078602db7d8bbfe223b926)) @@ -2607,6 +2707,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr8) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.800", 0x0000, 0x20000, CRC(655e5b3c) SHA1(bd6fd25e17cee40d6bb842367b1ce922bbd46003)) @@ -2629,6 +2730,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr7) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.700", 0x0000, 0x20000, CRC(208a4653) SHA1(570f3070c6b0f128d451f3dea01e41a9944081f2)) @@ -2651,6 +2753,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr6) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.600", 0x0000, 0x20000, CRC(02786892) SHA1(6810d5a5eb80f520e611a46921dbd2906fbebf2f)) @@ -2673,6 +2776,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr501) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.501", 0x0000, 0x20000, CRC(df9fd692) SHA1(2d06c1a763330b1b9429961f3e13574e0eefe7a7)) @@ -2695,6 +2799,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr5) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.500", 0x0000, 0x20000, CRC(4b45a543) SHA1(e0be3a4244025abc2c109f58b0d637262711b9db)) @@ -2717,6 +2822,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr410) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.410", 0x0000, 0x20000, CRC(458af09a) SHA1(2680f16d7f33ffc70b64bfb7d35cccf6989c70e2)) @@ -2739,6 +2845,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_fr401) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.401", 0x0000, 0x20000, CRC(b69cdecc) SHA1(40f7c2d25a1028255be8fe25e3aa6d11976edd25)) @@ -2784,6 +2891,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it9) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.900", 0x0000, 0x20000, CRC(eff1ab83) SHA1(cd9cfa3fa150224e44078602db7d8bbfe223b926)) @@ -2806,6 +2914,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it8) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.800", 0x0000, 0x20000, CRC(655e5b3c) SHA1(bd6fd25e17cee40d6bb842367b1ce922bbd46003)) @@ -2828,6 +2937,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it7) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.700", 0x0000, 0x20000, CRC(208a4653) SHA1(570f3070c6b0f128d451f3dea01e41a9944081f2)) @@ -2850,6 +2960,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it6) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.600", 0x0000, 0x20000, CRC(02786892) SHA1(6810d5a5eb80f520e611a46921dbd2906fbebf2f)) @@ -2872,6 +2983,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it501) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.501", 0x0000, 0x20000, CRC(df9fd692) SHA1(2d06c1a763330b1b9429961f3e13574e0eefe7a7)) @@ -2894,6 +3006,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it5) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.500", 0x0000, 0x20000, CRC(4b45a543) SHA1(e0be3a4244025abc2c109f58b0d637262711b9db)) @@ -2916,6 +3029,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it410) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "lotrcpu.410", 0x0000, 0x20000, CRC(458af09a) SHA1(2680f16d7f33ffc70b64bfb7d35cccf6989c70e2)) @@ -2938,6 +3052,7 @@ ROM_LOAD("lotr-u36.100", 0x200000, 0x100000, CRC(9575981e) SHA1(38083fd923c4a168a94d998ec3c4db42c1e2a2da)) ROM_LOAD("lotr-u37.100", 0x300000, 0x100000, CRC(8e637a6f) SHA1(8087744ce36fc143381d49a312c98cf38b2f9854)) ROM_END + ROM_START(lotr_it401) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("lotrcpu.401", 0x0000, 0x20000, CRC(b69cdecc) SHA1(40f7c2d25a1028255be8fe25e3aa6d11976edd25)) @@ -3009,6 +3124,7 @@ ROM_LOAD("sopsnda.u36", 0x200000, 0x100000, CRC(f3535025) SHA1(3fc22af5db0a8b744c0513e24a6331c9cf82e3ed)) ROM_LOAD("sopsnda.u37", 0x300000, 0x100000, CRC(4b67fe8a) SHA1(b980b9705b4a41a0524b3b0095d6398bdbed609f)) ROM_END + ROM_START(sopranos_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("sopcpua.400", 0x00000, 0x20000, CRC(68efcf24) SHA1(9ef30808260f96fb19067ee473add0c43dd6180e)) @@ -3031,6 +3147,7 @@ ROM_LOAD("sopsnda.u36", 0x200000, 0x100000, CRC(db33b45c) SHA1(d3285008a3c770371389be470c1ec5ca49c1e568)) ROM_LOAD("sopsnda.u37", 0x300000, 0x100000, CRC(06a2a6e1) SHA1(fdbe622223724ac2b4c5183c43d3e635654864bf)) ROM_END + ROM_START(sopranos_300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD("sopcpua.300", 0x00000, 0x20000, CRC(cca0e551) SHA1(ef109b871605879b55abb966d6736d7deeca404f)) @@ -3053,6 +3170,7 @@ ROM_LOAD("sopsnda.u36", 0x200000, 0x100000, CRC(db33b45c) SHA1(d3285008a3c770371389be470c1ec5ca49c1e568)) ROM_LOAD("sopsnda.u37", 0x300000, 0x100000, CRC(06a2a6e1) SHA1(fdbe622223724ac2b4c5183c43d3e635654864bf)) ROM_END + ROM_START(sopranos_204) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpua.204", 0x0000, 0x20000, CRC(95251d1e) SHA1(c22754647afd07f42bb6b2d0944f696922e68feb)) @@ -3098,6 +3216,7 @@ ROM_LOAD("sopsndg.u36", 0x200000, 0x100000, CRC(08d715b5) SHA1(ddccd311ba2b608ab0845afb3ef63b8d3425d530)) ROM_LOAD("sopsndg.u37", 0x300000, 0x100000, CRC(2405df73) SHA1(b8074610d9d87d3f1c0244ef0f450c766aac8a20)) ROM_END + ROM_START(sopranog_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpug.400", 0x0000, 0x20000, CRC(44bd5b83) SHA1(edd11ee10a3bba9055363919f317421dee84cd85)) @@ -3120,6 +3239,7 @@ ROM_LOAD("sopsndg.u36", 0x200000, 0x100000, CRC(08d715b5) SHA1(ddccd311ba2b608ab0845afb3ef63b8d3425d530)) ROM_LOAD("sopsndg.u37", 0x300000, 0x100000, CRC(2405df73) SHA1(b8074610d9d87d3f1c0244ef0f450c766aac8a20)) ROM_END + ROM_START(sopranog_300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpug.300", 0x0000, 0x20000, CRC(acfa9c83) SHA1(8a31b1008097ff86930b2c946c2777511efc8f9a)) @@ -3142,6 +3262,7 @@ ROM_LOAD("sopsndg.u36", 0x200000, 0x100000, CRC(08d715b5) SHA1(ddccd311ba2b608ab0845afb3ef63b8d3425d530)) ROM_LOAD("sopsndg.u37", 0x300000, 0x100000, CRC(2405df73) SHA1(b8074610d9d87d3f1c0244ef0f450c766aac8a20)) ROM_END + ROM_START(sopranog_107) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpug.107", 0x0000, 0x20000, CRC(e9c83725) SHA1(958155919cbb347b72784c7da112b188e06c908f)) @@ -3188,6 +3309,7 @@ ROM_LOAD("sopsndf.u36", 0x200000, 0x100000, CRC(99549d4a) SHA1(15e3d35b9cefbc8825a7dee5309adc2526de3dec)) ROM_LOAD("sopsndf.u37", 0x300000, 0x100000, CRC(2b4a9130) SHA1(eed9c84c932bb86954226b0d51461c5094ebe02e)) ROM_END + ROM_START(sopranof_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpuf.400", 0x0000, 0x20000, CRC(d6f770cd) SHA1(35f35bb91c1444ba42e29542213745b7e90c9b27)) @@ -3210,6 +3332,7 @@ ROM_LOAD("sopsndf.u36", 0x200000, 0x100000, CRC(99549d4a) SHA1(15e3d35b9cefbc8825a7dee5309adc2526de3dec)) ROM_LOAD("sopsndf.u37", 0x300000, 0x100000, CRC(2b4a9130) SHA1(eed9c84c932bb86954226b0d51461c5094ebe02e)) ROM_END + ROM_START(sopranof_300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpuf.300", 0x0000, 0x20000, CRC(0bd0f8c4) SHA1(df32dcf1db996203fc8b50c78e973b784ae58dbd)) @@ -3232,6 +3355,7 @@ ROM_LOAD("sopsndf.u36", 0x200000, 0x100000, CRC(99549d4a) SHA1(15e3d35b9cefbc8825a7dee5309adc2526de3dec)) ROM_LOAD("sopsndf.u37", 0x300000, 0x100000, CRC(2b4a9130) SHA1(eed9c84c932bb86954226b0d51461c5094ebe02e)) ROM_END + ROM_START(sopranof_107) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpuf.107", 0x0000, 0x20000, CRC(1cc86040) SHA1(0b4322eca8a5be7ea92356adf65b6c6c6f4205ca)) @@ -3277,6 +3401,7 @@ ROM_LOAD("sopsndl.u36", 0x200000, 0x100000, CRC(147c4216) SHA1(ded2917188bea51cb03db72fe53fcd76a3e66ab9)) ROM_LOAD("sopsndl.u37", 0x300000, 0x100000, CRC(cfe814fb) SHA1(51b6b10dda4640f8569e610b41c77e3657eabff2)) ROM_END + ROM_START(sopranol_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpul.400", 0x0000, 0x20000, CRC(7fe54359) SHA1(cb00318484ad1e30ab86c3a239fd2ea322aa945e)) @@ -3299,6 +3424,7 @@ ROM_LOAD("sopsndl.u36", 0x200000, 0x100000, CRC(147c4216) SHA1(ded2917188bea51cb03db72fe53fcd76a3e66ab9)) ROM_LOAD("sopsndl.u37", 0x300000, 0x100000, CRC(cfe814fb) SHA1(51b6b10dda4640f8569e610b41c77e3657eabff2)) ROM_END + ROM_START(sopranol_300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpul.300", 0x0000, 0x20000, CRC(2efd7a45) SHA1(d179605c385c3e3b269bb81295f79a52e0f3f627)) @@ -3321,6 +3447,7 @@ ROM_LOAD("sopsndl.u36", 0x200000, 0x100000, CRC(147c4216) SHA1(ded2917188bea51cb03db72fe53fcd76a3e66ab9)) ROM_LOAD("sopsndl.u37", 0x300000, 0x100000, CRC(cfe814fb) SHA1(51b6b10dda4640f8569e610b41c77e3657eabff2)) ROM_END + ROM_START(sopranol_107) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpul.107", 0x0000, 0x20000, CRC(a08311fe) SHA1(93e3ecc3e2c69f30d0fbb72c7426f3c2ba4b27b4)) @@ -3367,6 +3494,7 @@ ROM_LOAD("sopsndi.u36", 0x200000, 0x100000, CRC(71568348) SHA1(516d5ea35f8323e247c25000cb223f3539796ea1)) ROM_LOAD("sopsndi.u37", 0x300000, 0x100000, CRC(b34c0a5f) SHA1(b84979d6eef7d23e6dd5410993d83fba2121bc6a)) ROM_END + ROM_START(sopranoi_400) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpui.400", 0x0000, 0x20000, CRC(9bd48a86) SHA1(16aa55892a295a1486ede60df104520362005155)) @@ -3389,6 +3517,7 @@ ROM_LOAD("sopsndi.u36", 0x200000, 0x100000, CRC(71568348) SHA1(516d5ea35f8323e247c25000cb223f3539796ea1)) ROM_LOAD("sopsndi.u37", 0x300000, 0x100000, CRC(b34c0a5f) SHA1(b84979d6eef7d23e6dd5410993d83fba2121bc6a)) ROM_END + ROM_START(sopranoi_300) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpui.300", 0x0000, 0x20000, CRC(1a2846e6) SHA1(10dd57d5f65f397d67105f7e1d0e8d920753893c)) @@ -3411,6 +3540,7 @@ ROM_LOAD("sopsndi.u36", 0x200000, 0x100000, CRC(71568348) SHA1(516d5ea35f8323e247c25000cb223f3539796ea1)) ROM_LOAD("sopsndi.u37", 0x300000, 0x100000, CRC(b34c0a5f) SHA1(b84979d6eef7d23e6dd5410993d83fba2121bc6a)) ROM_END + ROM_START(sopranoi_107) ROM_REGION(0x80000, "user1", 0) ROM_LOAD( "sopcpui.107", 0x0000, 0x20000, CRC(d5cd6b07) SHA1(830de4af7f54c85feeae6fb7f630f84e48fdb98b)) @@ -3434,156 +3564,155 @@ ROM_LOAD("sopsndi.u37", 0x300000, 0x100000, CRC(b34c0a5f) SHA1(b84979d6eef7d23e6dd5410993d83fba2121bc6a)) ROM_END -GAME(2004, elvisp, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisp4, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisp303, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisp302, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisl4, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisl303, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisl302, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisg4, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisg303, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisg302, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisf4, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisf303, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisf302, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisi4, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisi303, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, elvisi302, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix_400, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix_352, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix_350, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix_340, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprix_301, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg_400, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg_352, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg_350, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg_340, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixg_301, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl_400, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl_352, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl_350, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl_340, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixl_301, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf_400, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf_352, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf_350, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf_340, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixf_301, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi_400, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi_352, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi_350, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi_340, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, gprixi_301, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.50)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar_400, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar_352, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.52)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar_350, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.50)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar_340, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.40)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascar_301, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.50 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl_400,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl_352,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.52 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl_350,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.50 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl_340,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.40 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, nascarl_301,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripleys, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, rip310, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, rip302, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, rip301, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, rip300, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripleysf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripf310, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripf302, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripf301, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripf300, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripleysg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripg310, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripg302, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripg301, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripg300, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Germany)",GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripleysi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripi310, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripi302, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripi301, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripi300, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripleysl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripl310, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripl302, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripl301, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, ripl300, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_le, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.02 Limited Edition)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr9, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr8, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr7, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr6, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr501, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr5, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr410, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr401, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp9, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp8, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp7, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp6, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp501, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp5, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_sp401, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr9, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr8, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr7, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr6, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr501, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr5, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr410, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_gr401, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr9, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr8, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr7, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr6, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr501, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr5, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr410, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_fr401, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it9, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it8, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it7, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it6, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it501, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it5, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it410, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, lotr_it401, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranos, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranos_400,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranos_300,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranos_204,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (2.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranog, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranog_400,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranog_300,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranog_107,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranof, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranof_400,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranof_300,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranof_107,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranol, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranol_400,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranol_300,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranol_107,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranoi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranoi_400,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranoi_300,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, sopranoi_107,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(2004, elvisp, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisp4, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisp303, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisp302, elvisp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisl4, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisl303, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisl302, elvisl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisg4, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisg303, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisg302, elvisg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisf4, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisf303, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisf302, elvisf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (5.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisi4, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (4.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisi303, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.03 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, elvisi302, elvisi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Elvis (3.02 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix_400, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix_352, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix_350, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix_340, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprix_301, gprix, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg_400, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg_352, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg_350, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg_340, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixg_301, gprixg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl_400, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl_352, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl_350, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl_340, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixl_301, gprixl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf_400, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf_352, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf_350, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf_340, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixf_301, gprixf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.50 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi_400, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (4.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi_352, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.52 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi_350, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.50 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi_340, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.40 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, gprixi_301, gprixi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Grand Prix (3.01 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.50)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar_400, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar_352, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.52)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar_350, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.50)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar_340, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.40)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascar_301, nascar, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.50 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl_400,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (4.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl_352,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.52 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl_350,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.50 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl_340,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.40 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, nascarl_301,nascarl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Nascar (3.01 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripleys, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, rip310, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, rip302, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, rip301, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, rip300, ripleys, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripleysf, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripf310, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripf302, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripf301, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripf300, ripleysf, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripleysg, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripg310, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripg302, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripg301, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripg300, ripleysg, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Germany)",GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripleysi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripi310, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripi302, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripi301, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripi300, ripleysi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripleysl, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.20 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripl310, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.10 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripl302, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.02 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripl301, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.01 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2004, ripl300, ripleysl, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Ripley's Believe It or Not! (3.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_le, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.02 Limited Edition)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr9, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr8, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr7, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr6, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr501, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr5, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr410, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr401, lotr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp9, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp8, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp7, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp6, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp501, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp5, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_sp401, lotr_sp, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr9, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr8, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr7, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr6, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr501, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr5, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr410, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_gr401, lotr_gr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr9, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr8, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr7, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr6, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr501, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr5, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr410, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_fr401, lotr_fr, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (10.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it9, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (9.0 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it8, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (8.0 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it7, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (7.0 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it6, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (6.0 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it501, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.01 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it5, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (5.0 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it410, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.10 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2003, lotr_it401, lotr_it, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Lord Of The Rings, The (4.01 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranos, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranos_400,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranos_300,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranos_204,sopranos, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (2.04)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranog, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranog_400,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranog_300,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranog_107,sopranog, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranof, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranof_400,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranof_300,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranof_107,sopranof, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 France)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranol, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranol_400,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranol_300,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranol_107,sopranol, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Spain)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranoi, 0, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (5.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranoi_400,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (4.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranoi_300,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (3.00 Italy)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, sopranoi_107,sopranoi, whitestar_mod, whitestar_mod, whitestar_mod, ROT0, "Stern", "Sopranos, The (1.07 Italy)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/whitestar.c mame-0.145/src/mame/drivers/whitestar.c --- mame-0.144/src/mame/drivers/whitestar.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/whitestar.c 2012-02-06 21:30:40.000000000 +0000 @@ -46,8 +46,6 @@ DECLARE_READ8_MEMBER(switch_r); DECLARE_WRITE8_MEMBER(switch_w); DECLARE_READ8_MEMBER(dedicated_switch_r); - - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); }; static INPUT_PORTS_START( whitestar ) @@ -192,13 +190,13 @@ MCFG_SCREEN_TYPE(LCD) \ MCFG_SCREEN_REFRESH_RATE(60) \ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) \ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) \ + MCFG_SCREEN_UPDATE_DEVICE("mc6845", mc6845_device, screen_update) \ MCFG_SCREEN_SIZE( _width * DMD_CHUNK_SIZE, _height *DMD_CHUNK_SIZE) \ MCFG_SCREEN_VISIBLE_AREA( 0, _width * DMD_CHUNK_SIZE-1, 0, _height*DMD_CHUNK_SIZE-1 ) \ MCFG_DEFAULT_LAYOUT( layout_lcd ) -void dmd_put_pixel(bitmap_t *bitmap, int x, int y, int color) +void dmd_put_pixel(bitmap_rgb32 &bitmap, int x, int y, rgb_t color) { int midx = x * DMD_CHUNK_SIZE + DMD_CHUNK_SIZE/2; int midy = y * DMD_CHUNK_SIZE + DMD_CHUNK_SIZE/2; @@ -210,8 +208,8 @@ // iterate over y for (UINT32 y = 0; y <= width; y++) { - UINT16 *d0 = BITMAP_ADDR16(bitmap, midy - y, 0); - UINT16 *d1 = BITMAP_ADDR16(bitmap, midy + y, 0); + UINT32 *d0 = &bitmap.pix32(midy - y); + UINT32 *d1 = &bitmap.pix32(midy + y); float xval = width * sqrt(1.0f - (float)(y * y) * ooradius2); INT32 left, right; @@ -221,13 +219,14 @@ // draw this scanline for (UINT32 x = left; x < right; x++) - d0[x] = d1[x] = color + 1; + d0[x] = d1[x] = color; } } MC6845_UPDATE_ROW( whitestar_update_row ) { whitestar_state *state = device->machine().driver_data(); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); UINT8 *vram = state->m_vram + ((ma & 0x100)<<2) + (ra << 4); int xi; @@ -237,7 +236,7 @@ val = BITSWAP16(val,15,7,14,6,13,5,12,4,11,3,10,2,9,1,8,0); for(xi=0;xi<8;xi++) - dmd_put_pixel(bitmap, (x*8 + xi), ra, (val>>(14-xi*2)) & 0x03); + dmd_put_pixel(bitmap, (x*8 + xi), ra, palette[((val>>(14-xi*2)) & 0x03) + 1]); } } @@ -265,12 +264,6 @@ palette_set_color(machine, 4, MAKE_RGB(255, 224, 32)); } -bool whitestar_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) -{ - m_mc6845->update(&bitmap, &cliprect); - return 0; -} - static MACHINE_CONFIG_START( whitestar, whitestar_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) @@ -3039,166 +3032,168 @@ ROM_LOAD_SND_8M("monopred.u17", 0x000000, CRC(467dca62) SHA1(c727748b6b0b39ead19ce98bddd89fd05fb62d00)) ROM_END -GAME(1995, apollo13, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Apollo 13", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, austin, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, aust301, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, aust300, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, aust201, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (2.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, austnew, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, austinf, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, austing, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, austini, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, godzillp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Godzilla (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, gldneye, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Goldeneye", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, goldcue, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Golden Cue", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_a13, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_a10, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Display rev. 1.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_f13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_g13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_i13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, harl_l13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_a40, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_f40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_g40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_i40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_l40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_a30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_f30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_g30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_i30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2004, harl_l30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, harl_a18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, harl_f18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, harl_g18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, harl_i18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, harl_l18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirolcas, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hironew, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirolcat, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00) TEST", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirolcas_210,hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (2.10)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirol_fr, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirol_gr, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirol_gr_210,hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (2.10 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, hirol_it, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, id4, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Independence Day", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, lostspc, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost in Space", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, monopolp, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.20)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monop303, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monop301, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monop251, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (2.51)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monop233, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (2.33)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monopolf, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monopolg, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monopoli, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monopoll, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, mononew, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, nfl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "NFL", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboys, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboys_401,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboys_303,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboys_300,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboys_203,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playnew, playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyf_401,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyf_303,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyf_300,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyf_203,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyg, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyg_401,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyg_303,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyg_300,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyg_203,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyi, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyi_401,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyi_303,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyi_300,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyi_203,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyl_401,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyl_303,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyl_300,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, playboyl_203,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycn, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycn_701, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycn_600, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycn_400, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctnew, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycng, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycng_701,rctycng, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycng_400,rctycng, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnf_701,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnf_600,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnf_400,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycni, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycni_701,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycni_600,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycni_400,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnl_701,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnl_600,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, rctycnl_400,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2000, shrkysht, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2000, shrky_207, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrknew, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkygr, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkygr_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkyfr, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkyfr_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkyit, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2001, shrkyit_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, sprk_103, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (1.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, sprk_096, sprk_103, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (0.96)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, sprk_090, sprk_103, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (0.90)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, spacejam, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, spacejmg, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, spacejmf, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, spacejmi, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, swtril43, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Star Wars Trilogy (4.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, swtril41, swtril43, whitestar, whitestar, whitestar, ROT0, "Sega", "Star Wars Trilogy (4.01)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, startrp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Starship Troopers", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strikext, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (1.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strknew, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strxt_uk, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (UK)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strxt_gr, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strxt_fr, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strxt_it, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, strxt_sp, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, t3new, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3g, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3l, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3l_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3f, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3f_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3i, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, term3i_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, jplstw22, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost World: Jurassic Park, The (2.02)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, jplstw20, jplstw22, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost World: Jurassic Park, The (2.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprty, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprty_400,simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprty_204,simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpnew, simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (ARM7 Sound Board)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtg, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtg_400,simpprtg, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtl_400,simpprtl, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtl_204,simpprtl, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 Spain)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtf_400,simpprtf, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprtf_204,simpprtf, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 France)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprti, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprti_400,simpprti, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2003, simpprti_204,simpprti, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 Italy)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, xfilesp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "X-Files (3.03)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, xfiles2, xfilesp, whitestar, whitestar, whitestar, ROT0, "Sega", "X-Files (2.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, twst_405, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (4.05)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, twst_404, twst_405, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (4.04)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, twst_300, twst_405, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (3.00)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, viprsega, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Viper Night Drivin'", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, ctchzdlx, ctcheese, whitestar, whitestar, whitestar, ROT0, "Sega", "Cut The Cheese Deluxe (Redemption)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, titanic, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Titanic (Coin dropper)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2002, monopred, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Coin dropper)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, wackadoo, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Wack-A-Doodle-Doo (Redemption)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +#define GAME_IS_PINBALL GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL + +GAME(1995, apollo13, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Apollo 13", GAME_IS_PINBALL) +GAME(2001, austin, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.02)", GAME_IS_PINBALL) +GAME(2001, aust301, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.01)", GAME_IS_PINBALL) +GAME(2001, aust300, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (3.00)", GAME_IS_PINBALL) +GAME(2001, aust201, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (2.01)", GAME_IS_PINBALL) +GAME(2001, austnew, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2001, austinf, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (France)", GAME_IS_PINBALL) +GAME(2001, austing, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (Germany)", GAME_IS_PINBALL) +GAME(2001, austini, austin, whitestar, whitestar, whitestar, ROT0, "Stern", "Austin Powers (Italy)", GAME_IS_PINBALL) +GAME(1998, godzillp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Godzilla (Pinball)", GAME_IS_PINBALL) +GAME(1996, gldneye, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Goldeneye", GAME_IS_PINBALL) +GAME(1998, goldcue, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Golden Cue", GAME_IS_PINBALL) +GAME(1999, harl_a13, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03)", GAME_IS_PINBALL) +GAME(1999, harl_a10, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Display rev. 1.00)", GAME_IS_PINBALL) +GAME(1999, harl_f13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 France)", GAME_IS_PINBALL) +GAME(1999, harl_g13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Germany)", GAME_IS_PINBALL) +GAME(1999, harl_i13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Italy)", GAME_IS_PINBALL) +GAME(1999, harl_l13, harl_a13, whitestar, whitestar, whitestar, ROT0, "Sega", "Harley Davidson (1.03 Spain)", GAME_IS_PINBALL) +GAME(2004, harl_a40, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00)", GAME_IS_PINBALL) +GAME(2004, harl_f40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 France)", GAME_IS_PINBALL) +GAME(2004, harl_g40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Germany)", GAME_IS_PINBALL) +GAME(2004, harl_i40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Italy)", GAME_IS_PINBALL) +GAME(2004, harl_l40, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (4.00 Spain)", GAME_IS_PINBALL) +GAME(2004, harl_a30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00)", GAME_IS_PINBALL) +GAME(2004, harl_f30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 France)", GAME_IS_PINBALL) +GAME(2004, harl_g30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Germany)", GAME_IS_PINBALL) +GAME(2004, harl_i30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Italy)", GAME_IS_PINBALL) +GAME(2004, harl_l30, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (3.00 Spain)", GAME_IS_PINBALL) +GAME(2003, harl_a18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08)", GAME_IS_PINBALL) +GAME(2003, harl_f18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 France)", GAME_IS_PINBALL) +GAME(2003, harl_g18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Germany)", GAME_IS_PINBALL) +GAME(2003, harl_i18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Italy)", GAME_IS_PINBALL) +GAME(2003, harl_l18, harl_a40, whitestar, whitestar, whitestar, ROT0, "Stern", "Harley Davidson (1.08 Spain)", GAME_IS_PINBALL) +GAME(2001, hirolcas, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00)", GAME_IS_PINBALL) +GAME(2001, hironew, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2001, hirolcat, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00) TEST", GAME_IS_PINBALL) +GAME(2001, hirolcas_210,hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (2.10)", GAME_IS_PINBALL) +GAME(2001, hirol_fr, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 France)", GAME_IS_PINBALL) +GAME(2001, hirol_gr, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 Germany)", GAME_IS_PINBALL) +GAME(2001, hirol_gr_210,hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (2.10 Germany)", GAME_IS_PINBALL) +GAME(2001, hirol_it, hirolcas, whitestar, whitestar, whitestar, ROT0, "Stern", "High Roller Casino (3.00 Italy)", GAME_IS_PINBALL) +GAME(1996, id4, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Independence Day", GAME_IS_PINBALL) +GAME(1998, lostspc, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost in Space", GAME_IS_PINBALL) +GAME(2001, monopolp, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.20)", GAME_IS_PINBALL) +GAME(2002, monop303, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.03)", GAME_IS_PINBALL) +GAME(2002, monop301, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (3.01)", GAME_IS_PINBALL) +GAME(2002, monop251, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (2.51)", GAME_IS_PINBALL) +GAME(2002, monop233, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (2.33)", GAME_IS_PINBALL) +GAME(2002, monopolf, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (France)", GAME_IS_PINBALL) +GAME(2002, monopolg, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Germany)", GAME_IS_PINBALL) +GAME(2002, monopoli, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Italy)", GAME_IS_PINBALL) +GAME(2002, monopoll, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Spain)", GAME_IS_PINBALL) +GAME(2002, mononew, monopolp, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2001, nfl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "NFL", GAME_IS_PINBALL) +GAME(2002, playboys, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00)", GAME_IS_PINBALL) +GAME(2002, playboys_401,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01)", GAME_IS_PINBALL) +GAME(2002, playboys_303,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03)", GAME_IS_PINBALL) +GAME(2002, playboys_300,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00)", GAME_IS_PINBALL) +GAME(2002, playboys_203,playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03)", GAME_IS_PINBALL) +GAME(2002, playnew, playboys, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2002, playboyf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 France)", GAME_IS_PINBALL) +GAME(2002, playboyf_401,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 France)", GAME_IS_PINBALL) +GAME(2002, playboyf_303,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 France)", GAME_IS_PINBALL) +GAME(2002, playboyf_300,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 France)", GAME_IS_PINBALL) +GAME(2002, playboyf_203,playboyf, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 France)", GAME_IS_PINBALL) +GAME(2002, playboyg, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Germany)", GAME_IS_PINBALL) +GAME(2002, playboyg_401,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Germany)", GAME_IS_PINBALL) +GAME(2002, playboyg_303,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Germany)", GAME_IS_PINBALL) +GAME(2002, playboyg_300,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Germany)", GAME_IS_PINBALL) +GAME(2002, playboyg_203,playboyg, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Germany)", GAME_IS_PINBALL) +GAME(2002, playboyi, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Italy)", GAME_IS_PINBALL) +GAME(2002, playboyi_401,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Italy)", GAME_IS_PINBALL) +GAME(2002, playboyi_303,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Italy)", GAME_IS_PINBALL) +GAME(2002, playboyi_300,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Italy)", GAME_IS_PINBALL) +GAME(2002, playboyi_203,playboyi, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Italy)", GAME_IS_PINBALL) +GAME(2002, playboyl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (5.00 Spain)", GAME_IS_PINBALL) +GAME(2002, playboyl_401,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (4.01 Spain)", GAME_IS_PINBALL) +GAME(2002, playboyl_303,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.03 Spain)", GAME_IS_PINBALL) +GAME(2002, playboyl_300,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (3.00 Spain)", GAME_IS_PINBALL) +GAME(2002, playboyl_203,playboyl, whitestar, whitestar, whitestar, ROT0, "Stern", "Playboy (2.03 Spain)", GAME_IS_PINBALL) +GAME(2002, rctycn, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02)", GAME_IS_PINBALL) +GAME(2002, rctycn_701, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01)", GAME_IS_PINBALL) +GAME(2002, rctycn_600, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00)", GAME_IS_PINBALL) +GAME(2002, rctycn_400, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00)", GAME_IS_PINBALL) +GAME(2002, rctnew, rctycn, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2002, rctycng, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Germany)", GAME_IS_PINBALL) +GAME(2002, rctycng_701,rctycng, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Germany)", GAME_IS_PINBALL) +GAME(2002, rctycng_400,rctycng, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Germany)", GAME_IS_PINBALL) +GAME(2002, rctycnf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 France)", GAME_IS_PINBALL) +GAME(2002, rctycnf_701,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 France)", GAME_IS_PINBALL) +GAME(2002, rctycnf_600,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 France)", GAME_IS_PINBALL) +GAME(2002, rctycnf_400,rctycnf, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 France)", GAME_IS_PINBALL) +GAME(2002, rctycni, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Italy)", GAME_IS_PINBALL) +GAME(2002, rctycni_701,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Italy)", GAME_IS_PINBALL) +GAME(2002, rctycni_600,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 Italy)", GAME_IS_PINBALL) +GAME(2002, rctycni_400,rctycni, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Italy)", GAME_IS_PINBALL) +GAME(2002, rctycnl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.02 Spain)", GAME_IS_PINBALL) +GAME(2002, rctycnl_701,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (7.01 Spain)", GAME_IS_PINBALL) +GAME(2002, rctycnl_600,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (6.00 Spain)", GAME_IS_PINBALL) +GAME(2002, rctycnl_400,rctycnl, whitestar, whitestar, whitestar, ROT0, "Stern", "Roller Coaster Tycoon (4.00 Spain)", GAME_IS_PINBALL) +GAME(2000, shrkysht, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11)", GAME_IS_PINBALL) +GAME(2000, shrky_207, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07)", GAME_IS_PINBALL) +GAME(2001, shrknew, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2001, shrkygr, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 Germany)", GAME_IS_PINBALL) +GAME(2001, shrkygr_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 Germany)", GAME_IS_PINBALL) +GAME(2001, shrkyfr, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 France)", GAME_IS_PINBALL) +GAME(2001, shrkyfr_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 France)", GAME_IS_PINBALL) +GAME(2001, shrkyit, shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.11 Italy)", GAME_IS_PINBALL) +GAME(2001, shrkyit_207,shrkysht, whitestar, whitestar, whitestar, ROT0, "Stern", "Sharkey's Shootout (2.07 Italy)", GAME_IS_PINBALL) +GAME(1999, sprk_103, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (1.03)", GAME_IS_PINBALL) +GAME(1999, sprk_096, sprk_103, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (0.96)", GAME_IS_PINBALL) +GAME(1999, sprk_090, sprk_103, whitestar, whitestar, whitestar, ROT0, "Sega", "South Park (0.90)", GAME_IS_PINBALL) +GAME(1997, spacejam, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam", GAME_IS_PINBALL) +GAME(1997, spacejmg, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (Germany)", GAME_IS_PINBALL) +GAME(1997, spacejmf, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (France)", GAME_IS_PINBALL) +GAME(1997, spacejmi, spacejam, whitestar, whitestar, whitestar, ROT0, "Sega", "Space Jam (Italy)", GAME_IS_PINBALL) +GAME(1997, swtril43, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Star Wars Trilogy (4.03)", GAME_IS_PINBALL) +GAME(1997, swtril41, swtril43, whitestar, whitestar, whitestar, ROT0, "Sega", "Star Wars Trilogy (4.01)", GAME_IS_PINBALL) +GAME(1997, startrp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Starship Troopers", GAME_IS_PINBALL) +GAME(1999, strikext, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (1.02)", GAME_IS_PINBALL) +GAME(1999, strknew, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(1999, strxt_uk, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (UK)", GAME_IS_PINBALL) +GAME(1999, strxt_gr, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Germany)", GAME_IS_PINBALL) +GAME(1999, strxt_fr, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (France)", GAME_IS_PINBALL) +GAME(1999, strxt_it, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Italy)", GAME_IS_PINBALL) +GAME(1999, strxt_sp, strikext, whitestar, whitestar, whitestar, ROT0, "Stern", "Striker Xtreme (Spain)", GAME_IS_PINBALL) +GAME(2003, term3, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00)", GAME_IS_PINBALL) +GAME(2003, term3_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05)", GAME_IS_PINBALL) +GAME(2003, t3new, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2003, term3g, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Germany)", GAME_IS_PINBALL) +GAME(2003, term3l, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Spain)", GAME_IS_PINBALL) +GAME(2003, term3l_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 Spain)", GAME_IS_PINBALL) +GAME(2003, term3f, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 France)", GAME_IS_PINBALL) +GAME(2003, term3f_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 France)", GAME_IS_PINBALL) +GAME(2003, term3i, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (4.00 Italy)", GAME_IS_PINBALL) +GAME(2003, term3i_205, term3, whitestar, whitestar, whitestar, ROT0, "Stern", "Terminator 3: Rise of the Machines (2.05 Italy)", GAME_IS_PINBALL) +GAME(1997, jplstw22, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost World: Jurassic Park, The (2.02)", GAME_IS_PINBALL) +GAME(1997, jplstw20, jplstw22, whitestar, whitestar, whitestar, ROT0, "Sega", "Lost World: Jurassic Park, The (2.00)", GAME_IS_PINBALL) +GAME(2003, simpprty, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00)", GAME_IS_PINBALL) +GAME(2003, simpprty_400,simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00)", GAME_IS_PINBALL) +GAME(2003, simpprty_204,simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04)", GAME_IS_PINBALL) +GAME(2003, simpnew, simpprty, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (ARM7 Sound Board)", GAME_IS_PINBALL) +GAME(2003, simpprtg, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Germany)", GAME_IS_PINBALL) +GAME(2003, simpprtg_400,simpprtg, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Germany)", GAME_IS_PINBALL) +GAME(2003, simpprtl, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Spain)", GAME_IS_PINBALL) +GAME(2003, simpprtl_400,simpprtl, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Spain)", GAME_IS_PINBALL) +GAME(2003, simpprtl_204,simpprtl, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 Spain)", GAME_IS_PINBALL) +GAME(2003, simpprtf, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 France)", GAME_IS_PINBALL) +GAME(2003, simpprtf_400,simpprtf, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 France)", GAME_IS_PINBALL) +GAME(2003, simpprtf_204,simpprtf, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 France)", GAME_IS_PINBALL) +GAME(2003, simpprti, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (5.00 Italy)", GAME_IS_PINBALL) +GAME(2003, simpprti_400,simpprti, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (4.00 Italy)", GAME_IS_PINBALL) +GAME(2003, simpprti_204,simpprti, whitestar, whitestar, whitestar, ROT0, "Stern", "Simpsons Pinball Party, The (2.04 Italy)", GAME_IS_PINBALL) +GAME(1997, xfilesp, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "X-Files (3.03)", GAME_IS_PINBALL) +GAME(1997, xfiles2, xfilesp, whitestar, whitestar, whitestar, ROT0, "Sega", "X-Files (2.04)", GAME_IS_PINBALL) +GAME(1996, twst_405, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (4.05)", GAME_IS_PINBALL) +GAME(1996, twst_404, twst_405, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (4.04)", GAME_IS_PINBALL) +GAME(1996, twst_300, twst_405, whitestar, whitestar, whitestar, ROT0, "Sega", "Twister (3.00)", GAME_IS_PINBALL) +GAME(1998, viprsega, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Viper Night Drivin'", GAME_IS_PINBALL) +GAME(1998, ctchzdlx, ctcheese, whitestar, whitestar, whitestar, ROT0, "Sega", "Cut The Cheese Deluxe (Redemption)", GAME_IS_PINBALL) +GAME(1998, titanic, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Titanic (Coin dropper)", GAME_IS_PINBALL) +GAME(2002, monopred, 0, whitestar, whitestar, whitestar, ROT0, "Stern", "Monopoly (Coin dropper)", GAME_IS_PINBALL) +GAME(1998, wackadoo, 0, whitestar, whitestar, whitestar, ROT0, "Sega", "Wack-A-Doodle-Doo (Redemption)", GAME_IS_PINBALL) diff -Nru mame-0.144/src/mame/drivers/wico.c mame-0.145/src/mame/drivers/wico.c --- mame-0.144/src/mame/drivers/wico.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wico.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wico_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wico_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wico_map, AS_PROGRAM, 8, wico_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wico ) INPUT_PORTS_END -static MACHINE_RESET( wico ) +void wico_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 10000000 / 8) MCFG_CPU_PROGRAM_MAP(wico_map) - - MCFG_MACHINE_RESET( wico ) MACHINE_CONFIG_END /*------------------------------------------------------------------- @@ -38,6 +48,7 @@ ROM_START(aftor) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("u25.bin", 0xf000, 0x1000, CRC(d66e95ff) SHA1(f7e8c51f1b37e7ef560406f1968c12a2043646c5)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("u52.bin", 0x8000, 0x2000, CRC(8035b446) SHA1(3ec59015e259c315bf09f4e2046f9d98e2d7a732)) ROM_LOAD("u48.bin", 0xe000, 0x2000, CRC(b4406563) SHA1(6d1a9086eb1f6f947eae3a92ccf7a9b7375d85d3)) @@ -47,4 +58,4 @@ / Big Top (1977) /-------------------------------------------------------------------*/ -GAME(1984, aftor, 0, wico, wico, wico, ROT0, "Wico", "Af-Tor", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1984, aftor, 0, wico, wico, wico, ROT0, "Wico", "Af-Tor", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/williams.c mame-0.145/src/mame/drivers/williams.c --- mame-0.144/src/mame/drivers/williams.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/williams.c 2012-02-06 21:30:40.000000000 +0000 @@ -1450,9 +1450,8 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE | VIDEO_ALWAYS_UPDATE) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 10, 304, 260, 7, 245) - MCFG_SCREEN_UPDATE(williams) + MCFG_SCREEN_UPDATE_STATIC(williams) MCFG_VIDEO_START(williams) @@ -1591,7 +1590,7 @@ /* video hardware */ MCFG_VIDEO_START(blaster) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(blaster) + MCFG_SCREEN_UPDATE_STATIC(blaster) /* pia */ MCFG_PIA6821_MODIFY("pia_0", williams_49way_muxed_pia_0_intf) @@ -1643,9 +1642,8 @@ MCFG_GFXDECODE(williams2) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 8, 284, 260, 8, 248) - MCFG_SCREEN_UPDATE(williams2) + MCFG_SCREEN_UPDATE_STATIC(williams2) MCFG_VIDEO_START(williams2) diff -Nru mame-0.144/src/mame/drivers/wink.c mame-0.145/src/mame/drivers/wink.c --- mame-0.144/src/mame/drivers/wink.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/wink.c 2012-02-06 21:30:40.000000000 +0000 @@ -52,10 +52,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static SCREEN_UPDATE( wink ) +static SCREEN_UPDATE_IND16( wink ) { - wink_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + wink_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -64,7 +64,7 @@ wink_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( player_mux_w ) @@ -77,7 +77,7 @@ { wink_state *state = space->machine().driver_data(); state->m_tile_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } static WRITE8_HANDLER( wink_coin_counter_w ) @@ -350,10 +350,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) - MCFG_SCREEN_UPDATE(wink) + MCFG_SCREEN_UPDATE_STATIC(wink) MCFG_GFXDECODE(wink) MCFG_PALETTE_LENGTH(16) diff -Nru mame-0.144/src/mame/drivers/wiping.c mame-0.145/src/mame/drivers/wiping.c --- mame-0.144/src/mame/drivers/wiping.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/wiping.c 2012-02-06 21:30:40.000000000 +0000 @@ -39,31 +39,6 @@ #include "includes/wiping.h" -static READ8_HANDLER( shared1_r ) -{ - wiping_state *state = space->machine().driver_data(); - return state->m_sharedram1[offset]; -} - -static READ8_HANDLER( shared2_r ) -{ - wiping_state *state = space->machine().driver_data(); - return state->m_sharedram2[offset]; -} - -static WRITE8_HANDLER( shared1_w ) -{ - wiping_state *state = space->machine().driver_data(); - state->m_sharedram1[offset] = data; -} - -static WRITE8_HANDLER( shared2_w ) -{ - wiping_state *state = space->machine().driver_data(); - state->m_sharedram2[offset] = data; -} - - /* input ports are rotated 90 degrees */ static READ8_HANDLER( ports_r ) { @@ -79,12 +54,22 @@ static WRITE8_HANDLER( subcpu_reset_w ) { - if (data & 1) - cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_RESET, CLEAR_LINE); - else - cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_RESET, ASSERT_LINE); + cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); } +static WRITE8_HANDLER( main_irq_mask_w ) +{ + wiping_state *state = space->machine().driver_data(); + + state->m_main_irq_mask = data & 1; +} + +static WRITE8_HANDLER( sound_irq_mask_w ) +{ + wiping_state *state = space->machine().driver_data(); + + state->m_sound_irq_mask = data & 1; +} static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_ROM @@ -92,9 +77,9 @@ AM_RANGE(0x8400, 0x87ff) AM_BASE_MEMBER(wiping_state, m_colorram) AM_RANGE(0x8800, 0x88ff) AM_BASE_SIZE_MEMBER(wiping_state, m_spriteram, m_spriteram_size) AM_RANGE(0x8000, 0x8bff) AM_RAM - AM_RANGE(0x9000, 0x93ff) AM_READWRITE(shared1_r,shared1_w) AM_BASE_MEMBER(wiping_state, m_sharedram1) - AM_RANGE(0x9800, 0x9bff) AM_READWRITE(shared2_r,shared2_w) AM_BASE_MEMBER(wiping_state, m_sharedram2) - AM_RANGE(0xa000, 0xa000) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x9000, 0x93ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x9800, 0x9bff) AM_RAM AM_SHARE("share2") + AM_RANGE(0xa000, 0xa000) AM_WRITE(main_irq_mask_w) AM_RANGE(0xa002, 0xa002) AM_WRITE(wiping_flipscreen_w) AM_RANGE(0xa003, 0xa003) AM_WRITE(subcpu_reset_w) AM_RANGE(0xa800, 0xa807) AM_READ(ports_r) @@ -105,9 +90,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x4000, 0x7fff) AM_DEVWRITE("wiping", wiping_sound_w) - AM_RANGE(0x9000, 0x93ff) AM_READWRITE(shared1_r,shared1_w) - AM_RANGE(0x9800, 0x9bff) AM_READWRITE(shared2_r,shared2_w) - AM_RANGE(0xa001, 0xa001) AM_WRITE(interrupt_enable_w) + AM_RANGE(0x9000, 0x93ff) AM_RAM AM_SHARE("share1") + AM_RANGE(0x9800, 0x9bff) AM_RAM AM_SHARE("share2") + AM_RANGE(0xa001, 0xa001) AM_WRITE(sound_irq_mask_w) ADDRESS_MAP_END @@ -279,6 +264,22 @@ GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 64*4, 64 ) GFXDECODE_END +static INTERRUPT_GEN( vblank_irq ) +{ + wiping_state *state = device->machine().driver_data(); + + if(state->m_main_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + +static INTERRUPT_GEN( sound_timer_irq ) +{ + wiping_state *state = device->machine().driver_data(); + + if(state->m_sound_irq_mask) + device_set_input_line(device, 0, HOLD_LINE); +} + static MACHINE_CONFIG_START( wiping, wiping_state ) @@ -286,20 +287,19 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,18432000/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_CPU_ADD("audiocpu", Z80,18432000/6) /* 3.072 MHz */ MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_CPU_PERIODIC_INT(irq0_line_hold,120) /* periodic interrupt, don't know about the frequency */ + MCFG_CPU_PERIODIC_INT(sound_timer_irq,120) /* periodic interrupt, don't know about the frequency */ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(36*8, 28*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 0*8, 28*8-1) - MCFG_SCREEN_UPDATE(wiping) + MCFG_SCREEN_UPDATE_STATIC(wiping) MCFG_GFXDECODE(wiping) MCFG_PALETTE_LENGTH(64*4+64*4) diff -Nru mame-0.144/src/mame/drivers/witch.c mame-0.145/src/mame/drivers/witch.c --- mame-0.144/src/mame/drivers/witch.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/witch.c 2012-02-06 21:30:41.000000000 +0000 @@ -277,16 +277,16 @@ { witch_state *state = space->machine().driver_data(); state->m_gfx0_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_gfx0a_tilemap,offset); - tilemap_mark_tile_dirty(state->m_gfx0b_tilemap,offset); + state->m_gfx0a_tilemap->mark_tile_dirty(offset); + state->m_gfx0b_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( gfx0_cram_w ) { witch_state *state = space->machine().driver_data(); state->m_gfx0_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_gfx0a_tilemap,offset); - tilemap_mark_tile_dirty(state->m_gfx0b_tilemap,offset); + state->m_gfx0a_tilemap->mark_tile_dirty(offset); + state->m_gfx0b_tilemap->mark_tile_dirty(offset); } static READ8_HANDLER( gfx0_vram_r ) { @@ -308,7 +308,7 @@ witch_state *state = space->machine().driver_data(); FIX_OFFSET(); state->m_gfx1_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_gfx1_tilemap,offset); + state->m_gfx1_tilemap->mark_tile_dirty(offset); } static WRITE8_HANDLER( gfx1_cram_w ) @@ -316,7 +316,7 @@ witch_state *state = space->machine().driver_data(); FIX_OFFSET(); state->m_gfx1_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_gfx1_tilemap,offset); + state->m_gfx1_tilemap->mark_tile_dirty(offset); } static READ8_HANDLER( gfx1_vram_r ) { @@ -701,14 +701,14 @@ state->m_gfx0b_tilemap = tilemap_create(machine, get_gfx0b_tile_info,tilemap_scan_rows,8,8,32,32); state->m_gfx1_tilemap = tilemap_create(machine, get_gfx1_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_gfx0a_tilemap,0); - tilemap_set_transparent_pen(state->m_gfx0b_tilemap,0); - tilemap_set_palette_offset(state->m_gfx0a_tilemap,0x100); - tilemap_set_palette_offset(state->m_gfx0b_tilemap,0x100); - tilemap_set_palette_offset(state->m_gfx1_tilemap,0x200); + state->m_gfx0a_tilemap->set_transparent_pen(0); + state->m_gfx0b_tilemap->set_transparent_pen(0); + state->m_gfx0a_tilemap->set_palette_offset(0x100); + state->m_gfx0b_tilemap->set_palette_offset(0x100); + state->m_gfx1_tilemap->set_palette_offset(0x200); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { witch_state *state = machine.driver_data(); int i,sx,sy,tileno,flags,color; @@ -756,18 +756,18 @@ } -static SCREEN_UPDATE(witch) +static SCREEN_UPDATE_IND16(witch) { - witch_state *state = screen->machine().driver_data(); - tilemap_set_scrollx( state->m_gfx1_tilemap, 0, state->m_scrollx-7 ); //offset to have it aligned with the sprites - tilemap_set_scrolly( state->m_gfx1_tilemap, 0, state->m_scrolly+8 ); + witch_state *state = screen.machine().driver_data(); + state->m_gfx1_tilemap->set_scrollx(0, state->m_scrollx-7 ); //offset to have it aligned with the sprites + state->m_gfx1_tilemap->set_scrolly(0, state->m_scrolly+8 ); - tilemap_draw(bitmap,cliprect,state->m_gfx1_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_gfx0a_tilemap,0,0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap,cliprect,state->m_gfx0b_tilemap,0,0); + state->m_gfx1_tilemap->draw(bitmap, cliprect, 0,0); + state->m_gfx0a_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_gfx0b_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -798,10 +798,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(8, 256-1-8, 8*4, 256-8*4-1) - MCFG_SCREEN_UPDATE(witch) + MCFG_SCREEN_UPDATE_STATIC(witch) MCFG_GFXDECODE(witch) MCFG_PALETTE_LENGTH(0x800) diff -Nru mame-0.144/src/mame/drivers/wiz.c mame-0.145/src/mame/drivers/wiz.c --- mame-0.144/src/mame/drivers/wiz.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wiz.c 2012-02-06 21:30:35.000000000 +0000 @@ -80,7 +80,6 @@ Wiz: - Possible sprite/char priority issues. -- There is unknown device (Sony CXK5808-55) on the board. - And the supplier of the screenshot says there still may be some wrong colors. Just before the break on Level 2 there is a cresent moon, the background should probably be black. @@ -217,11 +216,11 @@ coin_counter_w(space->machine(), offset,data); } -static WRITE8_HANDLER( wiz_nmi_mask_w ) +static WRITE8_HANDLER( wiz_main_nmi_mask_w ) { wiz_state *state = space->machine().driver_data(); - state->m_nmi_mask = data & 1; + state->m_main_nmi_mask = data & 1; } static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) @@ -240,7 +239,7 @@ AM_RANGE(0xe000, 0xe85f) AM_RAM AM_RANGE(0xf000, 0xf000) AM_READ_PORT("DSW0") AM_RANGE(0xf000, 0xf000) AM_RAM AM_BASE_MEMBER(wiz_state, m_sprite_bank) - AM_RANGE(0xf001, 0xf001) AM_WRITE(wiz_nmi_mask_w) + AM_RANGE(0xf001, 0xf001) AM_WRITE(wiz_main_nmi_mask_w) AM_RANGE(0xf002, 0xf003) AM_WRITE(wiz_palettebank_w) AM_RANGE(0xf004, 0xf005) AM_WRITE(wiz_char_bank_select_w) AM_RANGE(0xf006, 0xf006) AM_WRITE(wiz_flipx_w) @@ -254,23 +253,32 @@ AM_RANGE(0xf818, 0xf818) AM_WRITE(wiz_bgcolor_w) ADDRESS_MAP_END +static WRITE8_HANDLER( wiz_sound_nmi_mask_w ) +{ + wiz_state *state = space->machine().driver_data(); + + state->m_sound_nmi_mask = data & 1; +} + + +/* TODO: clean this up! */ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,interrupt_enable_w) /* Stinger/Scion */ + AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,wiz_sound_nmi_mask_w) /* Stinger/Scion */ AM_RANGE(0x4000, 0x4001) AM_DEVWRITE("8910.3", ay8910_address_data_w) AM_RANGE(0x5000, 0x5001) AM_DEVWRITE("8910.1", ay8910_address_data_w) - AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("8910.2", ay8910_address_data_w) /* Wiz only */ - AM_RANGE(0x7000, 0x7000) AM_READWRITE(soundlatch_r,interrupt_enable_w) /* Wiz */ + AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("8910.2", ay8910_address_data_w) /* Wiz only */ + AM_RANGE(0x7000, 0x7000) AM_READWRITE(soundlatch_r,wiz_sound_nmi_mask_w) /* Wiz */ ADDRESS_MAP_END static ADDRESS_MAP_START( stinger_sound_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,interrupt_enable_w) /* Stinger/Scion */ + AM_RANGE(0x3000, 0x3000) AM_READWRITE(soundlatch_r,wiz_sound_nmi_mask_w) /* Stinger/Scion */ AM_RANGE(0x5000, 0x5001) AM_DEVWRITE("8910.1", ay8910_address_data_w) - AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("8910.2", ay8910_address_data_w) /* Wiz only */ - AM_RANGE(0x7000, 0x7000) AM_READWRITE(soundlatch_r,interrupt_enable_w) /* Wiz */ + AM_RANGE(0x6000, 0x6001) AM_DEVWRITE("8910.2", ay8910_address_data_w) /* Wiz only */ + AM_RANGE(0x7000, 0x7000) AM_READWRITE(soundlatch_r,wiz_sound_nmi_mask_w) /* Wiz */ ADDRESS_MAP_END @@ -697,24 +705,33 @@ state->m_dsc0 = state->m_dsc1 = 1; } -static INTERRUPT_GEN( wiz_vblank_irq ) +static INTERRUPT_GEN( wiz_vblank_interrupt ) { wiz_state *state = device->machine().driver_data(); - if(state->m_nmi_mask & 1) - device_set_input_line(device,INPUT_LINE_NMI,PULSE_LINE); + if(state->m_main_nmi_mask & 1) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); } +static INTERRUPT_GEN( wiz_sound_interrupt ) +{ + wiz_state *state = device->machine().driver_data(); + + if(state->m_sound_nmi_mask & 1) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} + + static MACHINE_CONFIG_START( wiz, wiz_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, 18432000/6) /* 3.072 MHz ??? */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", wiz_vblank_irq) + MCFG_CPU_VBLANK_INT("screen", wiz_vblank_interrupt) MCFG_CPU_ADD("audiocpu", Z80, 14318000/8) /* ? */ MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_CPU_PERIODIC_INT(nmi_line_pulse,4*60) /* ??? */ + MCFG_CPU_PERIODIC_INT(wiz_sound_interrupt,4*60) /* ??? */ MCFG_MACHINE_RESET( wiz ) @@ -722,10 +739,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(wiz) + MCFG_SCREEN_UPDATE_STATIC(wiz) MCFG_GFXDECODE(wiz) MCFG_PALETTE_LENGTH(256) @@ -757,7 +773,7 @@ /* video hardware */ MCFG_GFXDECODE(stinger) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(stinger) + MCFG_SCREEN_UPDATE_STATIC(stinger) /* sound hardware */ MCFG_SOUND_MODIFY("8910.1") @@ -792,7 +808,7 @@ /* video hardware */ MCFG_GFXDECODE(stinger) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(kungfut) + MCFG_SCREEN_UPDATE_STATIC(kungfut) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/wldarrow.c mame-0.145/src/mame/drivers/wldarrow.c --- mame-0.144/src/mame/drivers/wldarrow.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/wldarrow.c 2012-02-06 21:30:35.000000000 +0000 @@ -58,9 +58,9 @@ } -static SCREEN_UPDATE( wldarrow ) +static SCREEN_UPDATE_RGB32( wldarrow ) { - wldarrow_state *state = screen->machine().driver_data(); + wldarrow_state *state = screen.machine().driver_data(); pen_t pens[NUM_PENS]; offs_t offs; @@ -89,7 +89,7 @@ ((data_g >> 6) & 0x02) | ((data_b >> 7) & 0x01); - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; data_r = data_r << 1; data_g = data_g << 1; @@ -362,12 +362,11 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(wldarrow) + MCFG_SCREEN_UPDATE_STATIC(wldarrow) /* audio hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/wms.c mame-0.145/src/mame/drivers/wms.c --- mame-0.144/src/mame/drivers/wms.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wms.c 2012-02-06 21:30:35.000000000 +0000 @@ -6,6 +6,8 @@ */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" @@ -13,17 +15,24 @@ { public: wms_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + // devices + required_device m_maincpu; }; -static ADDRESS_MAP_START( wms_map, AS_PROGRAM, 32 ) + +static ADDRESS_MAP_START( wms_map, AS_PROGRAM, 32, wms_state ) AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("maincpu", 0 ) AM_RANGE(0xfff00000, 0xffffffff) AM_ROM AM_REGION("maincpu", 0 ) ADDRESS_MAP_END -static ADDRESS_MAP_START( wms_io, AS_IO, 32 ) +static ADDRESS_MAP_START( wms_io, AS_IO, 32, wms_state ) ADDRESS_MAP_END @@ -367,29 +376,29 @@ } -GAME( 200?, wms, 0, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 1)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wmsa, wms, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 2)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wmsb, wms, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) - -GAME( 200?, btippers, 0, wms, wms, wms, ROT0, "WMS", "Big Tippers (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wmsboom, 0, wms, wms, wms, ROT0, "WMS", "Boom (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, cashcrop, 0, wms, wms, wms, ROT0, "WMS", "Cash Crop (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, filthyr, 0, wms, wms, wms, ROT0, "WMS", "Filthy Rich (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, hottop, 0, wms, wms, wms, ROT0, "WMS", "Hot Toppings (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, inwinner, 0, wms, wms, wms, ROT0, "WMS", "Instant Winner (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, jptparty, 0, wms, wms, wms, ROT0, "WMS", "Jackpot Party (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, leprgld, 0, wms, wms, wms, ROT0, "WMS", "Leprechaun's Gold (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, lol, 0, wms, wms, wms, ROT0, "WMS", "Life of Luxury (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, lovewin, 0, wms, wms, wms, ROT0, "WMS", "Love To Win (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, mtburn, 0, wms, wms, wms, ROT0, "WMS", "Money To Burn (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, otchart, 0, wms, wms, wms, ROT0, "WMS", "Off The Charts (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, perfect, 0, wms, wms, wms, ROT0, "WMS", "Perfect Game (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, reelemin, 0, wms, wms, wms, ROT0, "WMS", "Reel 'Em In (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, sonoth, 0, wms, wms, wms, ROT0, "WMS", "Something For Nothing (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, swingin, 0, wms, wms, wms, ROT0, "WMS", "Swingin In The Green (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wmstopb, 0, wms, wms, wms, ROT0, "WMS", "Top Banana (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wdun, 0, wms, wms, wms, ROT0, "WMS", "Who Dunnit (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, winbid, 0, wms, wms, wms, ROT0, "WMS", "Winning Bid (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, wldstrek, 0, wms, wms, wms, ROT0, "WMS", "Wild Streak (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 200?, yukongld, 0, wms, wms, wms, ROT0, "WMS", "Yukon Gold (Russia)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 200?, wms, 0, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 1)", GAME_IS_SKELETON ) +GAME( 200?, wmsa, wms, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 2)", GAME_IS_SKELETON ) +GAME( 200?, wmsb, wms, wms, wms, wms, ROT0, "WMS", "WMS SetUp/Clear Chips (set 3)", GAME_IS_SKELETON ) + +GAME( 200?, btippers, 0, wms, wms, wms, ROT0, "WMS", "Big Tippers (Russia)", GAME_IS_SKELETON ) +GAME( 200?, wmsboom, 0, wms, wms, wms, ROT0, "WMS", "Boom (Russia)", GAME_IS_SKELETON ) +GAME( 200?, cashcrop, 0, wms, wms, wms, ROT0, "WMS", "Cash Crop (Russia)", GAME_IS_SKELETON ) +GAME( 200?, filthyr, 0, wms, wms, wms, ROT0, "WMS", "Filthy Rich (Russia)", GAME_IS_SKELETON ) +GAME( 200?, hottop, 0, wms, wms, wms, ROT0, "WMS", "Hot Toppings (Russia)", GAME_IS_SKELETON ) +GAME( 200?, inwinner, 0, wms, wms, wms, ROT0, "WMS", "Instant Winner (Russia)", GAME_IS_SKELETON ) +GAME( 200?, jptparty, 0, wms, wms, wms, ROT0, "WMS", "Jackpot Party (Russia)", GAME_IS_SKELETON ) +GAME( 200?, leprgld, 0, wms, wms, wms, ROT0, "WMS", "Leprechaun's Gold (Russia)", GAME_IS_SKELETON ) +GAME( 200?, lol, 0, wms, wms, wms, ROT0, "WMS", "Life of Luxury (Russia)", GAME_IS_SKELETON ) +GAME( 200?, lovewin, 0, wms, wms, wms, ROT0, "WMS", "Love To Win (Russia)", GAME_IS_SKELETON ) +GAME( 200?, mtburn, 0, wms, wms, wms, ROT0, "WMS", "Money To Burn (Russia)", GAME_IS_SKELETON ) +GAME( 200?, otchart, 0, wms, wms, wms, ROT0, "WMS", "Off The Charts (Russia)", GAME_IS_SKELETON ) +GAME( 200?, perfect, 0, wms, wms, wms, ROT0, "WMS", "Perfect Game (Russia)", GAME_IS_SKELETON ) +GAME( 200?, reelemin, 0, wms, wms, wms, ROT0, "WMS", "Reel 'Em In (Russia)", GAME_IS_SKELETON ) +GAME( 200?, sonoth, 0, wms, wms, wms, ROT0, "WMS", "Something For Nothing (Russia)", GAME_IS_SKELETON ) +GAME( 200?, swingin, 0, wms, wms, wms, ROT0, "WMS", "Swingin In The Green (Russia)", GAME_IS_SKELETON ) +GAME( 200?, wmstopb, 0, wms, wms, wms, ROT0, "WMS", "Top Banana (Russia)", GAME_IS_SKELETON ) +GAME( 200?, wdun, 0, wms, wms, wms, ROT0, "WMS", "Who Dunnit (Russia)", GAME_IS_SKELETON ) +GAME( 200?, winbid, 0, wms, wms, wms, ROT0, "WMS", "Winning Bid (Russia)", GAME_IS_SKELETON ) +GAME( 200?, wldstrek, 0, wms, wms, wms, ROT0, "WMS", "Wild Streak (Russia)", GAME_IS_SKELETON ) +GAME( 200?, yukongld, 0, wms, wms, wms, ROT0, "WMS", "Yukon Gold (Russia)", GAME_IS_SKELETON ) diff -Nru mame-0.144/src/mame/drivers/wolfpack.c mame-0.145/src/mame/drivers/wolfpack.c --- mame-0.144/src/mame/drivers/wolfpack.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/wolfpack.c 2012-02-06 21:30:37.000000000 +0000 @@ -299,11 +299,10 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 262) MCFG_SCREEN_VISIBLE_AREA(0, 511, 16, 239) - MCFG_SCREEN_UPDATE(wolfpack) - MCFG_SCREEN_EOF(wolfpack) + MCFG_SCREEN_UPDATE_STATIC(wolfpack) + MCFG_SCREEN_VBLANK_STATIC(wolfpack) MCFG_GFXDECODE(wolfpack) MCFG_PALETTE_LENGTH(12) diff -Nru mame-0.144/src/mame/drivers/wpc_95.c mame-0.145/src/mame/drivers/wpc_95.c --- mame-0.144/src/mame/drivers/wpc_95.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_95.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_95_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_95_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_95_map, AS_PROGRAM, 8, wpc_95_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_95 ) INPUT_PORTS_END -static MACHINE_RESET( wpc_95 ) +void wpc_95_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_95_map) - - MCFG_MACHINE_RESET( wpc_95 ) MACHINE_CONFIG_END /*----------------- @@ -47,6 +57,7 @@ ROM_LOAD("afm_s3.l1", 0x100000, 0x100000, CRC(1cbce9b1) SHA1(7f258bfe1904a879a2cb007419483f4fee91e072)) ROM_LOAD("afm_s4.l1", 0x200000, 0x100000, CRC(5ff7fbb7) SHA1(ebaf825d3b90b6acee1920e6703801a4bcddfc5b)) ROM_END + ROM_START(afm_10) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -59,6 +70,7 @@ ROM_LOAD("afm_s3.l1", 0x100000, 0x100000, CRC(1cbce9b1) SHA1(7f258bfe1904a879a2cb007419483f4fee91e072)) ROM_LOAD("afm_s4.l1", 0x200000, 0x100000, CRC(5ff7fbb7) SHA1(ebaf825d3b90b6acee1920e6703801a4bcddfc5b)) ROM_END + ROM_START(afm_113) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -71,6 +83,7 @@ ROM_LOAD("afm_s3.l1", 0x100000, 0x100000, CRC(1cbce9b1) SHA1(7f258bfe1904a879a2cb007419483f4fee91e072)) ROM_LOAD("afm_s4.l1", 0x200000, 0x100000, CRC(5ff7fbb7) SHA1(ebaf825d3b90b6acee1920e6703801a4bcddfc5b)) ROM_END + ROM_START(afm_113b) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -114,6 +127,7 @@ ROM_LOAD("sav6_8.rom", 0x400000, 0x100000, CRC(2cccf10e) SHA1(3b9b9c87ab3c0d74eaacde416d18f3357f8302bd)) ROM_LOAD("sav7_8.rom", 0x500000, 0x100000, CRC(90fb1277) SHA1(502c920e1d54d285a4d4af401e574f785149da47)) ROM_END + ROM_START(cc_13) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -148,6 +162,7 @@ ROM_LOAD("s5v0_4.rom", 0x300000, 0x100000, CRC(7e07a2fc) SHA1(f908363c968c15c0dc62e32695e5e2d0ca869391)) ROM_LOAD("s6v0_4.rom", 0x400000, 0x100000, CRC(36ca43d3) SHA1(b599f88649c220143aa44cd5213e725e62afb0bc)) ROM_END + ROM_START(cv_20h) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -163,6 +178,7 @@ ROM_LOAD("s5v0_4.rom", 0x300000, 0x100000, CRC(7e07a2fc) SHA1(f908363c968c15c0dc62e32695e5e2d0ca869391)) ROM_LOAD("s6v0_4.rom", 0x400000, 0x100000, CRC(36ca43d3) SHA1(b599f88649c220143aa44cd5213e725e62afb0bc)) ROM_END + ROM_START(cv_10) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -178,6 +194,7 @@ ROM_LOAD("s5v0_4.rom", 0x300000, 0x100000, CRC(7e07a2fc) SHA1(f908363c968c15c0dc62e32695e5e2d0ca869391)) ROM_LOAD("s6v0_4.rom", 0x400000, 0x100000, CRC(36ca43d3) SHA1(b599f88649c220143aa44cd5213e725e62afb0bc)) ROM_END + ROM_START(cv_11) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -193,6 +210,7 @@ ROM_LOAD("s5v0_4.rom", 0x300000, 0x100000, CRC(7e07a2fc) SHA1(f908363c968c15c0dc62e32695e5e2d0ca869391)) ROM_LOAD("s6v0_4.rom", 0x400000, 0x100000, CRC(36ca43d3) SHA1(b599f88649c220143aa44cd5213e725e62afb0bc)) ROM_END + ROM_START(cv_13) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -224,6 +242,7 @@ ROM_LOAD("cgs3v1_0.rom", 0x100000, 0x100000, CRC(6cfd9fe0) SHA1(a76267f865c645648c8cb27aec2d05062a4a20b5)) ROM_LOAD("cgs4v1_0.rom", 0x200000, 0x100000, CRC(2a1980e7) SHA1(0badf27c2b8bc7b0074dc5e606d64490470bc108)) ROM_END + ROM_START(congo_20) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -236,6 +255,7 @@ ROM_LOAD("cgs3v1_0.rom", 0x100000, 0x100000, CRC(6cfd9fe0) SHA1(a76267f865c645648c8cb27aec2d05062a4a20b5)) ROM_LOAD("cgs4v1_0.rom", 0x200000, 0x100000, CRC(2a1980e7) SHA1(0badf27c2b8bc7b0074dc5e606d64490470bc108)) ROM_END + ROM_START(congo_13) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -266,6 +286,7 @@ ROM_LOAD("jy_s4.rom", 0x200000, 0x100000, CRC(0aebcd77) SHA1(62aee2685c0ae4bc1df8e4a4515ca34a078c72ad)) ROM_LOAD("jy_s5.rom", 0x300000, 0x100000, CRC(f18ad10b) SHA1(1d02a388b43d3863030e01bf567f30337d37b2e8)) ROM_END + ROM_START(jy_11) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -280,6 +301,7 @@ ROM_LOAD("jy_s4.rom", 0x200000, 0x100000, CRC(0aebcd77) SHA1(62aee2685c0ae4bc1df8e4a4515ca34a078c72ad)) ROM_LOAD("jy_s5.rom", 0x300000, 0x100000, CRC(f18ad10b) SHA1(1d02a388b43d3863030e01bf567f30337d37b2e8)) ROM_END + ROM_START(jy_03) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -312,6 +334,7 @@ ROM_LOAD("mm_sav5.rom", 0x300000, 0x100000, CRC(45089e30) SHA1(e83492109c59e8a2f1ba9e1f793788b97d150a9b)) ROM_LOAD("mm_sav6.rom", 0x400000, 0x100000, CRC(439d55f2) SHA1(d80e7268223157d864674261d140322634fb3bc2)) ROM_END + ROM_START(mm_109b) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -327,6 +350,7 @@ ROM_LOAD("mm_sav5.rom", 0x300000, 0x100000, CRC(45089e30) SHA1(e83492109c59e8a2f1ba9e1f793788b97d150a9b)) ROM_LOAD("mm_sav6.rom", 0x400000, 0x100000, CRC(439d55f2) SHA1(d80e7268223157d864674261d140322634fb3bc2)) ROM_END + ROM_START(mm_109c) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -342,6 +366,7 @@ ROM_LOAD("mm_sav5.rom", 0x300000, 0x100000, CRC(45089e30) SHA1(e83492109c59e8a2f1ba9e1f793788b97d150a9b)) ROM_LOAD("mm_sav6.rom", 0x400000, 0x100000, CRC(439d55f2) SHA1(d80e7268223157d864674261d140322634fb3bc2)) ROM_END + ROM_START(mm_10) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -357,6 +382,7 @@ ROM_LOAD("mm_sav5.rom", 0x300000, 0x100000, CRC(45089e30) SHA1(e83492109c59e8a2f1ba9e1f793788b97d150a9b)) ROM_LOAD("mm_sav6.rom", 0x400000, 0x100000, CRC(439d55f2) SHA1(d80e7268223157d864674261d140322634fb3bc2)) ROM_END + ROM_START(mm_10u) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -372,6 +398,7 @@ ROM_LOAD("mm_sav5.rom", 0x300000, 0x100000, CRC(45089e30) SHA1(e83492109c59e8a2f1ba9e1f793788b97d150a9b)) ROM_LOAD("mm_sav6.rom", 0x400000, 0x100000, CRC(439d55f2) SHA1(d80e7268223157d864674261d140322634fb3bc2)) ROM_END + ROM_START(mm_05) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -407,6 +434,7 @@ ROM_LOAD("mb_s6.rom", 0x400000, 0x100000, CRC(3975d5da) SHA1(6dbb34a827c0956e6aef1401c12cba88ae370e1f)) ROM_LOAD("mb_s7.rom", 0x500000, 0x100000, CRC(c242fb78) SHA1(c5a2a37ff3414d1e946cddb69b5e8f067b50bcc6)) ROM_END + ROM_START(mb_106b) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -423,6 +451,7 @@ ROM_LOAD("mb_s6.rom", 0x400000, 0x100000, CRC(3975d5da) SHA1(6dbb34a827c0956e6aef1401c12cba88ae370e1f)) ROM_LOAD("mb_s7.rom", 0x500000, 0x100000, CRC(c242fb78) SHA1(c5a2a37ff3414d1e946cddb69b5e8f067b50bcc6)) ROM_END + ROM_START(mb_10) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -457,6 +486,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_31a) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -472,6 +502,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_11) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -487,6 +518,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_11a) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -501,6 +533,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_11s) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -516,6 +549,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_115) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -531,6 +565,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_21) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -546,6 +581,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_22) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -561,6 +597,7 @@ ROM_LOAD("fb-s5.1_0", 0x300000, 0x100000, CRC(db50b79a) SHA1(9753d599cd822b55ed64bcf64955f625dc51997d)) ROM_LOAD("fb-s6.1_0", 0x400000, 0x100000, CRC(f1633371) SHA1(a707748d3298ffb6d10d8308f4dae7982b540fa0)) ROM_END + ROM_START(nbaf_23) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -595,6 +632,7 @@ ROM_LOAD("nggsndl1.s5", 0x300000, 0x100000, CRC(ea2062f0) SHA1(f8e45c1fcc6b8677a0745a5d83ca93b77fbde752)) ROM_LOAD("nggsndl1.s6", 0x400000, 0x100000, CRC(b1b8b514) SHA1(e16651bcb2eae747987dc3c13a5dc20a33c0a1f8)) ROM_END + ROM_START(ngg_10) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -610,6 +648,7 @@ ROM_LOAD("nggsndl1.s5", 0x300000, 0x100000, CRC(ea2062f0) SHA1(f8e45c1fcc6b8677a0745a5d83ca93b77fbde752)) ROM_LOAD("nggsndl1.s6", 0x400000, 0x100000, CRC(b1b8b514) SHA1(e16651bcb2eae747987dc3c13a5dc20a33c0a1f8)) ROM_END + ROM_START(ngg_p06) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -641,6 +680,7 @@ ROM_LOAD("safsnds3.rom", 0x100000, 0x100000, CRC(99e318e7) SHA1(918f9013da82b29a559cb474bce93fb4ce88b731)) ROM_LOAD("safsnds4.rom", 0x200000, 0x100000, CRC(9c8a23eb) SHA1(a0ee1174c8af0f262f9bec950da588cc9eb8747d)) ROM_END + ROM_START(sc_18n) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -653,6 +693,7 @@ ROM_LOAD("safsnds3.rom", 0x100000, 0x100000, CRC(99e318e7) SHA1(918f9013da82b29a559cb474bce93fb4ce88b731)) ROM_LOAD("safsnds4.rom", 0x200000, 0x100000, CRC(9c8a23eb) SHA1(a0ee1174c8af0f262f9bec950da588cc9eb8747d)) ROM_END + ROM_START(sc_18s2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -665,6 +706,7 @@ ROM_LOAD("safsnds3.rom", 0x100000, 0x100000, CRC(99e318e7) SHA1(918f9013da82b29a559cb474bce93fb4ce88b731)) ROM_LOAD("safsnds4.rom", 0x200000, 0x100000, CRC(9c8a23eb) SHA1(a0ee1174c8af0f262f9bec950da588cc9eb8747d)) ROM_END + ROM_START(sc_17) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -677,6 +719,7 @@ ROM_LOAD("safsnds3.rom", 0x100000, 0x100000, CRC(99e318e7) SHA1(918f9013da82b29a559cb474bce93fb4ce88b731)) ROM_LOAD("safsnds4.rom", 0x200000, 0x100000, CRC(9c8a23eb) SHA1(a0ee1174c8af0f262f9bec950da588cc9eb8747d)) ROM_END + ROM_START(sc_17n) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -689,6 +732,7 @@ ROM_LOAD("safsnds3.rom", 0x100000, 0x100000, CRC(99e318e7) SHA1(918f9013da82b29a559cb474bce93fb4ce88b731)) ROM_LOAD("safsnds4.rom", 0x200000, 0x100000, CRC(9c8a23eb) SHA1(a0ee1174c8af0f262f9bec950da588cc9eb8747d)) ROM_END + ROM_START(sc_14) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -716,6 +760,7 @@ ROM_LOAD("sssnd_11.s3", 0x100000, 0x100000, CRC(c4f2e08a) SHA1(e20ff622a3f475db11f1f44d36a6669e160437a3)) ROM_LOAD("sssnd_11.s4", 0x200000, 0x100000, CRC(258b0a27) SHA1(83763b98907cf38e6f7b9fe4f26ce93a54ba3568)) ROM_END + ROM_START(ss_14) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -728,6 +773,7 @@ ROM_LOAD("sssnd_11.s3", 0x100000, 0x100000, CRC(c4f2e08a) SHA1(e20ff622a3f475db11f1f44d36a6669e160437a3)) ROM_LOAD("sssnd_11.s4", 0x200000, 0x100000, CRC(258b0a27) SHA1(83763b98907cf38e6f7b9fe4f26ce93a54ba3568)) ROM_END + ROM_START(ss_12) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -740,6 +786,7 @@ ROM_LOAD("sssnd_11.s3", 0x100000, 0x100000, CRC(c4f2e08a) SHA1(e20ff622a3f475db11f1f44d36a6669e160437a3)) ROM_LOAD("sssnd_11.s4", 0x200000, 0x100000, CRC(258b0a27) SHA1(83763b98907cf38e6f7b9fe4f26ce93a54ba3568)) ROM_END + ROM_START(ss_03) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -752,6 +799,7 @@ ROM_LOAD("sssnd_s3.21", 0x100000, 0x100000, CRC(c4f2e08a) SHA1(e20ff622a3f475db11f1f44d36a6669e160437a3)) ROM_LOAD("sssnd_s4.21", 0x200000, 0x100000, CRC(258b0a27) SHA1(83763b98907cf38e6f7b9fe4f26ce93a54ba3568)) ROM_END + ROM_START(ss_01) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -782,6 +830,7 @@ ROM_LOAD("ans5v1_0.rom", 0x300000, 0x080000, CRC(32ca1602) SHA1(e4c7235b5d387bdde16ebef4d3aeeb7276c69d6d)) ROM_RELOAD(0x300000+0x080000, 0x080000) ROM_END + ROM_START(totan_13) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -796,6 +845,7 @@ ROM_LOAD("ans5v1_0.rom", 0x300000, 0x080000, CRC(32ca1602) SHA1(e4c7235b5d387bdde16ebef4d3aeeb7276c69d6d)) ROM_RELOAD(0x300000+0x080000, 0x080000) ROM_END + ROM_START(totan_12) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -810,6 +860,7 @@ ROM_LOAD("ans5v1_0.rom", 0x300000, 0x080000, CRC(32ca1602) SHA1(e4c7235b5d387bdde16ebef4d3aeeb7276c69d6d)) ROM_RELOAD(0x300000+0x080000, 0x080000) ROM_END + ROM_START(totan_04) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -844,6 +895,7 @@ ROM_LOAD("cp_s6.bin", 0x400000, 0x100000, CRC(76ca4fed) SHA1(8995e518c8dafbdd8bf994533b71f42172057b27)) ROM_LOAD("cp_s7.bin", 0x500000, 0x100000, CRC(be619157) SHA1(b18acde4f683b5f8b2248b46bb3dc7c3e0ab1c26)) ROM_END + ROM_START(cp_15) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -890,64 +942,61 @@ ROM_LOAD("s2_10.rom", 0x000000, 0x100000, CRC(ceff7fe4) SHA1(ff2574f65e09d446b9e446abd58159a7d100059b)) ROM_END -GAME(1996, tf95_12, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "WPC 95 Test Fixture (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, afm_113, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.13)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, afm_113b, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.13b)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, afm_11, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, afm_11u, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.1 Ultrapin)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, afm_10, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, cc_13, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cactus Canyon (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, cc_12, cc_13, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cactus Canyon (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, cv_14, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, cv_20h, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (2.0H)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, cv_10, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, cv_11, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, cv_13, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, congo_21, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (2.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, congo_20, congo_21, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (2.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, congo_13, congo_21, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, jy_12, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, jy_11, jy_12, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, jy_03, jy_12, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (0.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, mm_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, mm_10u, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.0 Ultrapin)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, mm_109, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, mm_109b, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09B)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1999, mm_109c, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09C Profanity)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, mm_05, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (0.50)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, mb_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, mb_106, mb_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.06)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, mb_106b, mb_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.06b)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_31, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (3.1 - S3.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_31a, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (3.1 - S1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_11s, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1 - S0.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_11, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_11a, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1 - S2.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_115, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.15)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_21, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_22, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, nbaf_23, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, ngg_13, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, ngg_p06, ngg_13, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (p0.6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1997, ngg_10, ngg_13, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, sc_18, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, sc_18n, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8N)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, sc_18s2, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8 alternate sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, sc_17, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, sc_17n, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.7N)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, sc_14, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ss_15, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ss_14, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ss_12, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ss_03, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (0.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ss_01, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (D0.1R with sound rev.25)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, totan_14, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, totan_13, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, totan_12, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, totan_04, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (0.4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, cp_16, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "The Champion Pub (1.6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, cp_15, cp_16, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "The Champion Pub (1.5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, ttt_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Ticket Tac Toe (1.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - - - +GAME(1996, tf95_12, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "WPC 95 Test Fixture (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, afm_113, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.13)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, afm_113b, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.13b)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, afm_11, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, afm_11u, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.1 Ultrapin)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, afm_10, afm_113, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Attack From Mars (1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, cc_13, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cactus Canyon (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, cc_12, cc_13, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cactus Canyon (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, cv_14, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, cv_20h, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (2.0H)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, cv_10, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, cv_11, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, cv_13, cv_14, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Cirqus Voltaire (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, congo_21, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (2.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, congo_20, congo_21, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (2.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, congo_13, congo_21, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Congo (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, jy_12, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, jy_11, jy_12, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (1.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, jy_03, jy_12, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Junk Yard (0.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1999, mm_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1999, mm_10u, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.0 Ultrapin)", GAME_IS_SKELETON_MECHANICAL) +GAME(1999, mm_109, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09)", GAME_IS_SKELETON_MECHANICAL) +GAME(1999, mm_109b, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09B)", GAME_IS_SKELETON_MECHANICAL) +GAME(1999, mm_109c, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (1.09C Profanity)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, mm_05, mm_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Medieval Madness (0.50)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, mb_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, mb_106, mb_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.06)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, mb_106b, mb_10, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Monster Bash (1.06b)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_31, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (3.1 - S3.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_31a, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (3.1 - S1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_11s, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1 - S0.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_11, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_11a, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.1 - S2.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_115, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (1.15)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_21, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_22, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, nbaf_23, nbaf_31, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "NBA Fastbreak (2.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, ngg_13, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, ngg_p06, ngg_13, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (p0.6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1997, ngg_10, ngg_13, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "No Good Gofers (1.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, sc_18, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, sc_18n, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8N)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, sc_18s2, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.8 alternate sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, sc_17, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, sc_17n, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.7N)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, sc_14, sc_18, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Safe Cracker (1.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ss_15, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ss_14, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ss_12, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ss_03, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (0.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ss_01, ss_15, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "Scared Stiff (D0.1R with sound rev.25)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, totan_14, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, totan_13, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, totan_12, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, totan_04, totan_14, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Tales Of The Arabian Nights (0.4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, cp_16, 0, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "The Champion Pub (1.6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, cp_15, cp_16, wpc_95, wpc_95, wpc_95, ROT0, "Bally", "The Champion Pub (1.5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, ttt_10, 0, wpc_95, wpc_95, wpc_95, ROT0, "Williams", "Ticket Tac Toe (1.0)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_an.c mame-0.145/src/mame/drivers/wpc_an.c --- mame-0.144/src/mame/drivers/wpc_an.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_an.c 2012-02-06 21:30:38.000000000 +0000 @@ -1,6 +1,9 @@ /* Williams WPC (Alpha Numeric) */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -8,18 +11,28 @@ { public: wpc_an_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_an_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_an_map, AS_PROGRAM, 8, wpc_an_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_an ) INPUT_PORTS_END -static MACHINE_RESET( wpc_an ) +void wpc_an_state::machine_reset() { } @@ -31,8 +44,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_an_map) - - MCFG_MACHINE_RESET( wpc_an ) MACHINE_CONFIG_END @@ -50,6 +61,7 @@ ROM_LOAD("dude_u19.l1", 0x10000, 0x10000, CRC(dc7b985b) SHA1(f672d1f1fe1d1d887113ea6ccd745a78f7760526)) ROM_LOAD("dude_u20.l1", 0x20000, 0x10000, CRC(a83d53dd) SHA1(92a81069c42c7760888201fb0787fa7ddfbf1658)) ROM_END + ROM_START(dd_p06) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -127,6 +139,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(fh_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -148,6 +161,7 @@ ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(fh_l5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -210,6 +224,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x20000) ROM_RELOAD( 0x080000 + 0x60000, 0x20000) ROM_END + ROM_START(hd_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -250,6 +265,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(bop_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -270,6 +286,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(bop_l5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -290,6 +307,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(bop_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -310,6 +328,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(bop_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -330,6 +349,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(bop_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -361,20 +381,20 @@ ROM_LOAD("u6_l3.rom", 0x00000, 0x020000, CRC(bf4a37b5) SHA1(91b8bba6182e818a34252a4b2a0b86a2a44d9c42)) ROM_END -GAME(1990, tfa_13, 0, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "WPC Test Fixture: Alphanumeric (1.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, dd_p7, dd_l2, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Dr. Dude (PA-7 WPC)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, dd_p06, dd_l2, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Dr. Dude (PA-6 WPC)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, fh_l9, 0, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-9 (SL-2m)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, fh_l9b, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-9 (SL-2m) Bootleg Improved German translation", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, fh_905h, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse 9.05H", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, fh_l3, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-3", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, fh_l4, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-4", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1990, fh_l5, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-5", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, hd_l3, 0, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Harley Davidson (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, hd_l1, hd_l3, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Harley Davidson (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, bop_l7, 0, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, bop_l6, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, bop_l5, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, bop_l4, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, bop_l3, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, bop_l2, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1990, tfa_13, 0, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "WPC Test Fixture: Alphanumeric (1.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, dd_p7, dd_l2, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Dr. Dude (PA-7 WPC)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, dd_p06, dd_l2, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Dr. Dude (PA-6 WPC)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, fh_l9, 0, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-9 (SL-2m)", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, fh_l9b, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-9 (SL-2m) Bootleg Improved German translation", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, fh_905h, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse 9.05H", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, fh_l3, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-3", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, fh_l4, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-4", GAME_IS_SKELETON_MECHANICAL) +GAME(1990, fh_l5, fh_l9, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "Funhouse L-5", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, hd_l3, 0, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Harley Davidson (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, hd_l1, hd_l3, wpc_an, wpc_an, wpc_an, ROT0, "Bally", "Harley Davidson (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, bop_l7, 0, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, bop_l6, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, bop_l5, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, bop_l4, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, bop_l3, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, bop_l2, bop_l7, wpc_an, wpc_an, wpc_an, ROT0, "Williams", "The Machine: Bride of Pinbot (L-2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_dcs.c mame-0.145/src/mame/drivers/wpc_dcs.c --- mame-0.144/src/mame/drivers/wpc_dcs.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_dcs.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_dcs_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_dcs_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_dcs_map, AS_PROGRAM, 8, wpc_dcs_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_dcs ) INPUT_PORTS_END -static MACHINE_RESET( wpc_dcs ) +void wpc_dcs_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_dcs_map) - - MCFG_MACHINE_RESET( wpc_dcs ) MACHINE_CONFIG_END /*------------- @@ -56,6 +66,7 @@ ROM_LOAD("dmsndp4.u7", 0x500000, 0x080000, CRC(8760ed90) SHA1(cf8808f7cd347c47fa12e73a6bb5a54303fb7c49)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(dm_px5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -77,6 +88,7 @@ ROM_LOAD("dmsndp4.u7", 0x500000, 0x080000, CRC(8760ed90) SHA1(cf8808f7cd347c47fa12e73a6bb5a54303fb7c49)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(dm_la1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -98,6 +110,7 @@ ROM_LOAD("dm_u7_s.l2", 0x500000, 0x080000, CRC(75066af1) SHA1(4d70bce8a96343afcf02c89240b11faf19e11f02)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(dm_lx3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -119,6 +132,7 @@ ROM_LOAD("dm_u7_s.l2", 0x500000, 0x080000, CRC(75066af1) SHA1(4d70bce8a96343afcf02c89240b11faf19e11f02)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(dm_lx4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -140,6 +154,7 @@ ROM_LOAD("dm_u7_s.l2", 0x500000, 0x080000, CRC(75066af1) SHA1(4d70bce8a96343afcf02c89240b11faf19e11f02)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(dm_h5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -165,6 +180,7 @@ ROM_LOAD("dm.9", 0x700000, 0x080000, CRC(4c1a34e8) SHA1(3eacc3c63b2d9db57fc86447f1408635b987ef69)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(dm_h6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -217,6 +233,7 @@ ROM_LOAD("ijsnd_l3.u8", 0x600000, 0x080000, CRC(45e35bd7) SHA1(782b406be341d55d22a96acb8c2459f3058940df)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(ij_lg7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -240,6 +257,7 @@ ROM_LOAD("ijsnd_l3.u8", 0x600000, 0x080000, CRC(45e35bd7) SHA1(782b406be341d55d22a96acb8c2459f3058940df)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(ij_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -263,6 +281,7 @@ ROM_LOAD("ijsnd_l3.u8", 0x600000, 0x080000, CRC(45e35bd7) SHA1(782b406be341d55d22a96acb8c2459f3058940df)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(ij_l5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -286,6 +305,7 @@ ROM_LOAD("ijsnd_l3.u8", 0x600000, 0x080000, CRC(45e35bd7) SHA1(782b406be341d55d22a96acb8c2459f3058940df)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(ij_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -309,6 +329,7 @@ ROM_LOAD("ijsnd_l3.u8", 0x600000, 0x080000, CRC(45e35bd7) SHA1(782b406be341d55d22a96acb8c2459f3058940df)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(ij_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -361,6 +382,7 @@ ROM_LOAD("jdsnd_u9.bin", 0x700000, 0x080000, CRC(885b7c70) SHA1(be3bb42aeda3020a72c527f52c5330d0bafa9966)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(jd_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -386,6 +408,7 @@ ROM_LOAD("jdsnd_u9.bin", 0x700000, 0x080000, CRC(885b7c70) SHA1(be3bb42aeda3020a72c527f52c5330d0bafa9966)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(jd_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -484,6 +507,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_x7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -507,6 +531,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_s7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -530,6 +555,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_p5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -553,6 +579,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_g7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -576,6 +603,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -599,6 +627,7 @@ ROM_LOAD("ng_u8_s.l1", 0x600000, 0x080000, CRC(c9fb065e) SHA1(c148178ee0ea787acc88078db01d17073e75fdc7)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(sttng_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -638,30 +667,29 @@ ROM_RELOAD(0x000000+0x080000, 0x080000) ROM_END -GAME(1994, dm_lx4, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LX-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, dm_pa2, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (PA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, dm_px5, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (PX-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, dm_la1, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, dm_lx3, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LX-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, dm_h5, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (H-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, dm_h6, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (H-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_lg7, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (LG-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_l6, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_l5, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_l4, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ij_l3, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jd_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jd_l1, jd_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, jd_l6, jd_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, pop_lx5, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Popeye Saves The Earth (LX-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, pop_pa3, pop_lx5, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Popeye Saves The Earth (PA-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, sttng_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, sttng_x7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7 Special)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sttng_p5, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (P-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, sttng_s7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7) SP1", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, sttng_g7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LG-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sttng_l1, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, sttng_l2, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, afv_l4, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Addams Family Values (Coin Dropper L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1994, dm_lx4, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LX-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, dm_pa2, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (PA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, dm_px5, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (PX-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, dm_la1, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, dm_lx3, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (LX-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, dm_h5, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (H-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, dm_h6, dm_lx4, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Demolition Man (H-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_lg7, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (LG-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_l6, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_l5, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_l4, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ij_l3, ij_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Indiana Jones (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jd_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jd_l1, jd_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, jd_l6, jd_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Judge Dredd (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, pop_lx5, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Popeye Saves The Earth (LX-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, pop_pa3, pop_lx5, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Bally", "Popeye Saves The Earth (PA-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, sttng_l7, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, sttng_x7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7 Special)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sttng_p5, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (P-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, sttng_s7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-7) SP1", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, sttng_g7, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LG-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sttng_l1, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, sttng_l2, sttng_l7, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Star Trek: The Next Generation (LX-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, afv_l4, 0, wpc_dcs, wpc_dcs, wpc_dcs, ROT0, "Williams", "Addams Family Values (Coin Dropper L-4)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_dot.c mame-0.145/src/mame/drivers/wpc_dot.c --- mame-0.144/src/mame/drivers/wpc_dot.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_dot.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_dot_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_dot_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_dot_map, AS_PROGRAM, 8, wpc_dot_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_dot ) INPUT_PORTS_END -static MACHINE_RESET( wpc_dot ) +void wpc_dot_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_dot_map) - - MCFG_MACHINE_RESET( wpc_dot ) MACHINE_CONFIG_END /*----------------- @@ -55,6 +65,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(gi_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -75,6 +86,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(gi_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -95,6 +107,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(gi_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -178,6 +191,7 @@ ROM_LOAD("pz_u14.l1", 0x100000, 0x40000, CRC(4d8897ce) SHA1(7a4ac9e849dae93078ddd60adbd34f3930e4cd46)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(pz_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -196,6 +210,7 @@ ROM_LOAD("pz_u14.l1", 0x100000, 0x40000, CRC(4d8897ce) SHA1(7a4ac9e849dae93078ddd60adbd34f3930e4cd46)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(pz_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -214,6 +229,7 @@ ROM_LOAD("pz_u14.l1", 0x100000, 0x40000, CRC(4d8897ce) SHA1(7a4ac9e849dae93078ddd60adbd34f3930e4cd46)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(pz_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -280,6 +296,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(t2_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -300,6 +317,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(t2_p2f) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -320,6 +338,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(t2_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -340,6 +359,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(t2_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -360,6 +380,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(t2_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -392,21 +413,21 @@ ROM_END -GAME(1991, tfdmd_l3, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "WPC Test Fixture: DMD (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, gi_l9, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-9)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, gi_l3, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, gi_l4, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, gi_l6, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, hshot_p8, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Midway", "Hot Shot Basketball (P-8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, hurr_l2, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Hurricane (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, pz_f4, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Party Zone (F-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, pz_l1, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Party Zone (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, pz_l2, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Party Zone (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, pz_l3, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Party Zone (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, sf_l1, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Slugfest (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_l8, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_l6, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_p2f, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (P-2F) Profanity", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_l4, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_l3, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1991, t2_l2, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1991, tfdmd_l3, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "WPC Test Fixture: DMD (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, gi_l9, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-9)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, gi_l3, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, gi_l4, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, gi_l6, gi_l9, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "Gilligan's Island (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, hshot_p8, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Midway", "Hot Shot Basketball (P-8)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, hurr_l2, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Hurricane (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, pz_f4, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "The Party Zone (F-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, pz_l1, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "The Party Zone (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, pz_l2, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "The Party Zone (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, pz_l3, pz_f4, wpc_dot, wpc_dot, wpc_dot, ROT0, "Bally", "The Party Zone (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, sf_l1, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Slugfest (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_l8, 0, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-8)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_l6, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_p2f, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (P-2F) Profanity", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_l4, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_l3, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1991, t2_l2, t2_l8, wpc_dot, wpc_dot, wpc_dot, ROT0, "Williams", "Terminator 2: Judgment Day (L-2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_flip1.c mame-0.145/src/mame/drivers/wpc_flip1.c --- mame-0.144/src/mame/drivers/wpc_flip1.c 2012-01-13 15:34:56.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_flip1.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_flip1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_flip1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_flip1_map, AS_PROGRAM, 8, wpc_flip1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_flip1 ) INPUT_PORTS_END -static MACHINE_RESET( wpc_flip1 ) +void wpc_flip1_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_flip1_map) - - MCFG_MACHINE_RESET( wpc_flip1 ) MACHINE_CONFIG_END /*----------------- @@ -44,6 +54,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("afsnd_p2.rom", 0x000000, 0x80000, CRC(73d19698) SHA1(d14a6ea36a93db185a599a7810dfbef2deb0adc0)) ROM_END + ROM_START(taf_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -53,6 +64,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -62,6 +74,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -71,6 +84,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -80,6 +94,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -89,6 +104,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -98,6 +114,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_l6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -107,6 +124,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("tafu18l1.rom", 0x000000, 0x80000, CRC(131ae471) SHA1(5ed03b521dfef56cbb99814539d4c74da4216f67)) ROM_END + ROM_START(taf_h4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -120,13 +138,12 @@ /*-------------- / Game drivers /---------------*/ -GAME(1992, taf_l5, 0, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_p2, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (Prototype) (P-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l1, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l2, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l3, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l4, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l7, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (Prototype L-5) (L-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_l6, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, taf_h4, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (H-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1992, taf_l5, 0, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_p2, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (Prototype) (P-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l1, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l2, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l3, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l4, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l7, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (Prototype L-5) (L-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_l6, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, taf_h4, taf_l5, wpc_flip1, wpc_flip1, wpc_flip1, ROT0, "Bally", "The Addams Family (H-4)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_flip2.c mame-0.145/src/mame/drivers/wpc_flip2.c --- mame-0.144/src/mame/drivers/wpc_flip2.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_flip2.c 2012-02-06 21:30:40.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_flip2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_flip2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_flip2_map, AS_PROGRAM, 8, wpc_flip2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_flip2 ) INPUT_PORTS_END -static MACHINE_RESET( wpc_flip2 ) +void wpc_flip2_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_flip2_map) - - MCFG_MACHINE_RESET( wpc_flip2 ) MACHINE_CONFIG_END /*----------------- @@ -53,6 +63,7 @@ ROM_LOAD("br_u14.l1", 0x100000, 0x40000, CRC(490bb87f) SHA1(2e4c0bf776b82e2b5fb60c651edd34ab65d6c5aa)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(br_p17) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -71,6 +82,7 @@ ROM_LOAD("br_u14.l1", 0x100000, 0x40000, CRC(490bb87f) SHA1(2e4c0bf776b82e2b5fb60c651edd34ab65d6c5aa)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(br_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -89,6 +101,7 @@ ROM_LOAD("br_u14.l1", 0x100000, 0x40000, CRC(490bb87f) SHA1(2e4c0bf776b82e2b5fb60c651edd34ab65d6c5aa)) ROM_RELOAD( 0x100000 + 0x40000, 0x40000) ROM_END + ROM_START(br_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -122,6 +135,7 @@ ROM_LOAD("dracsnd.u15", 0x080000, 0x80000, CRC(77b5abe2) SHA1(e5622ae9ae0c1a0be886a1e5dc25b5a42c00c2ae)) ROM_LOAD("dracsnd.u14", 0x100000, 0x80000, CRC(5137aaf5) SHA1(e6ee924e7e4718db0f7f315f2a6843e6f90afb41)) ROM_END + ROM_START(drac_p11) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -151,6 +165,7 @@ ROM_LOAD("bl_u15.l1", 0x080000, 0x80000, CRC(15477d6f) SHA1(3ed7942828630bc9111d2e602fee931ef67db2ce)) ROM_LOAD("bl_u14.l1", 0x100000, 0x80000, CRC(6b02bee4) SHA1(4f852b897dbf0ec2d5b17eed2ff70d9360b12213)) ROM_END + ROM_START(cftbl_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -183,6 +198,7 @@ ROM_LOAD("dw_u15.l1", 0x080000, 0x80000, CRC(9b87ff26) SHA1(483206ca0abdad4557843f83f245a1c20234af64)) ROM_LOAD("dw_u14.l1", 0x100000, 0x80000, CRC(71f7d55b) SHA1(c3a22cfce2d10fe94a9749af7018e17e5e3bf4b3)) ROM_END + ROM_START(dw_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -197,6 +213,7 @@ ROM_LOAD("dw_u15.l1", 0x080000, 0x80000, CRC(9b87ff26) SHA1(483206ca0abdad4557843f83f245a1c20234af64)) ROM_LOAD("dw_u14.l1", 0x100000, 0x80000, CRC(71f7d55b) SHA1(c3a22cfce2d10fe94a9749af7018e17e5e3bf4b3)) ROM_END + ROM_START(dw_p5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -224,6 +241,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("ft_u18.l1", 0x000000, 0x80000, CRC(48d2760a) SHA1(701b0bbb68f99332493ee1276e5a1cef5c85d499)) ROM_END + ROM_START(ft_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -233,6 +251,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("ft_u18.l1", 0x000000, 0x80000, CRC(48d2760a) SHA1(701b0bbb68f99332493ee1276e5a1cef5c85d499)) ROM_END + ROM_START(ft_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -242,6 +261,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("ft_u18.l1", 0x000000, 0x80000, CRC(48d2760a) SHA1(701b0bbb68f99332493ee1276e5a1cef5c85d499)) ROM_END + ROM_START(ft_p4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -266,6 +286,7 @@ ROM_LOAD("ag_u15_s.l1", 0x080000, 0x40000, CRC(b8c88c75) SHA1(b2b88e5192eb817ae60ab1f306e932d8bae3fbba)) ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_END + ROM_START(tafg_h3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -277,6 +298,7 @@ ROM_LOAD("ag_u15_s.l1", 0x080000, 0x40000, CRC(b8c88c75) SHA1(b2b88e5192eb817ae60ab1f306e932d8bae3fbba)) ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_END + ROM_START(tafg_la2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -288,6 +310,7 @@ ROM_LOAD("ag_u15_s.l1", 0x080000, 0x40000, CRC(b8c88c75) SHA1(b2b88e5192eb817ae60ab1f306e932d8bae3fbba)) ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_END + ROM_START(tafg_la3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -311,6 +334,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("u18snd", 0x000000, 0x80000, CRC(37bbe485) SHA1(e6b7ccef250db0c801e3dd8ebf93522b466ca1ec)) ROM_END + ROM_START(gw_pc) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -320,6 +344,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("u18-sp1.rom", 0x000000, 0x80000, CRC(fc5a5ff6) SHA1(bbe810135e05f81d1399ee0cb490ee93d6f9bb03)) ROM_END + ROM_START(gw_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -329,6 +354,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("u18snd", 0x000000, 0x80000, CRC(37bbe485) SHA1(e6b7ccef250db0c801e3dd8ebf93522b466ca1ec)) ROM_END + ROM_START(gw_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -338,6 +364,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("u18snd", 0x000000, 0x80000, CRC(37bbe485) SHA1(e6b7ccef250db0c801e3dd8ebf93522b466ca1ec)) ROM_END + ROM_START(gw_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -347,6 +374,7 @@ ROM_REGION(0x180000, "sound1", 0) ROM_LOAD("u18snd", 0x000000, 0x80000, CRC(37bbe485) SHA1(e6b7ccef250db0c801e3dd8ebf93522b466ca1ec)) ROM_END + ROM_START(gw_p7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -373,6 +401,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_94h) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -387,6 +416,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_94ch) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -401,6 +431,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -415,6 +446,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -429,6 +461,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -443,6 +476,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_ifpa) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -457,6 +491,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_h7) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -471,6 +506,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_h8) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -485,6 +521,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_l1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -499,6 +536,7 @@ ROM_RELOAD( 0x100000 + 0x40000, 0x20000) ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END + ROM_START(tz_pa1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -510,6 +548,7 @@ ROM_LOAD("u15-sp1.040", 0x080000, 0x80000, CRC(0f17c9e9) SHA1(fcaa6f87ebd03222e3a40be08eb5aa6a5e002a8b)) ROM_LOAD("u14-sp1.040", 0x100000, 0x80000, CRC(ad7cb98b) SHA1(a84bf157cb535acaf811e93ad22a505e1dd08dad)) ROM_END + ROM_START(tz_p3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -521,6 +560,7 @@ ROM_LOAD("u15-sp1.040", 0x080000, 0x80000, CRC(0f17c9e9) SHA1(fcaa6f87ebd03222e3a40be08eb5aa6a5e002a8b)) ROM_LOAD("u14-sp1.040", 0x100000, 0x80000, CRC(ad7cb98b) SHA1(a84bf157cb535acaf811e93ad22a505e1dd08dad)) ROM_END + ROM_START(tz_p4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -551,6 +591,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_lh5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -566,6 +607,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_lh6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -581,6 +623,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_l4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -596,6 +639,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_l3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -611,6 +655,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_l2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -626,6 +671,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_p8) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -641,6 +687,7 @@ ROM_RELOAD( 0x080000 + 0x40000, 0x40000) ROM_LOAD("ww_u14.l1", 0x100000, 0x80000, CRC(f3faa427) SHA1(fb0a266b80571b4717caa69f078b7e73e2866b6b)) ROM_END + ROM_START(ww_p1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -705,51 +752,52 @@ ROM_RELOAD( 0x100000 + 0x60000, 0x20000) ROM_END -GAME(1993, br_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, br_p17, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (SP-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, br_l1, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, br_l3, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, drac_l1, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Bram Stoker's Dracula (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, drac_p11, drac_l1, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Bram Stoker's Dracula (P-11)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, cftbl_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Creature from the Black Lagoon (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, cftbl_l3, cftbl_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Creature from the Black Lagoon (L-3,SP-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, dw_l2, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, dw_l1, dw_l2, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, dw_p5, dw_l2, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (P-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ft_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ft_l3, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ft_l4, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ft_p4, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (P-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tafg_lx3, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition Gold (LX-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tafg_h3, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (H-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tafg_la2, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tafg_la3, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (LA-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_pc, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (P-C)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_l1, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_l2, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_l3, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, gw_p7, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (P-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, tz_92, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, tz_94h, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.4H)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1998, tz_94ch, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.4CH)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_pa1, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (PA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_p3, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (P-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_p4, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (P-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_l1, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_l2, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_ifpa, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (IFPA rules)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_l3, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, tz_l4, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tz_h7, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (H-7)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tz_h8, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (H-8)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2000, ww_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2000, ww_lh6, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (LH-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2000, ww_lh5, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (LH-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ww_l4, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1993, ww_l3, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ww_l2, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ww_p8, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (P-8 P-2 sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, ww_p1, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (P-8 P-1 sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1992, strik_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Strike Master (L-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1996, lc_11, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "League Champ (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1993, br_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, br_p17, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (SP-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, br_l1, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, br_l3, br_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Black Rose (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, drac_l1, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Bram Stoker's Dracula (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, drac_p11, drac_l1, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Bram Stoker's Dracula (P-11)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, cftbl_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Creature from the Black Lagoon (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, cftbl_l3, cftbl_l4, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Creature from the Black Lagoon (L-3,SP-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, dw_l2, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, dw_l1, dw_l2, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, dw_p5, dw_l2, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Doctor Who (P-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ft_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ft_l3, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ft_l4, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ft_p4, ft_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Fish Tales (P-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tafg_lx3, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition Gold (LX-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tafg_h3, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (H-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tafg_la2, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tafg_la3, tafg_lx3, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "The Addams Family Special Collectors Edition (LA-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_pc, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (P-C)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_l1, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_l2, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_l3, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, gw_p7, gw_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "The Getaway: High Speed II (P-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, tz_92, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, tz_94h, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.4H)", GAME_IS_SKELETON_MECHANICAL) +GAME(1998, tz_94ch, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (9.4CH)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_pa1, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (PA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_p3, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (P-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_p4, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (P-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_l1, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_l2, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_ifpa, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (IFPA rules)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_l3, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, tz_l4, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tz_h7, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (H-7)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tz_h8, tz_92, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "Twilight Zone (H-8)", GAME_IS_SKELETON_MECHANICAL) +GAME(2000, ww_l5, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(2000, ww_lh6, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (LH-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(2000, ww_lh5, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (LH-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ww_l4, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1993, ww_l3, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ww_l2, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ww_p8, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (P-8 P-2 sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, ww_p1, ww_l5, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "White Water (P-8 P-1 sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1992, strik_l4, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Williams", "Strike Master (L-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1996, lc_11, 0, wpc_flip2, wpc_flip2, wpc_flip2, ROT0, "Bally", "League Champ (1.1)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wpc_s.c mame-0.145/src/mame/drivers/wpc_s.c --- mame-0.144/src/mame/drivers/wpc_s.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/wpc_s.c 2012-02-06 21:30:42.000000000 +0000 @@ -1,3 +1,5 @@ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/m6809/m6809.h" @@ -5,18 +7,28 @@ { public: wpc_s_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( wpc_s_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( wpc_s_map, AS_PROGRAM, 8, wpc_s_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( wpc_s ) INPUT_PORTS_END -static MACHINE_RESET( wpc_s ) +void wpc_s_state::machine_reset() { } @@ -28,8 +40,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809, 2000000) MCFG_CPU_PROGRAM_MAP(wpc_s_map) - - MCFG_MACHINE_RESET( wpc_s ) MACHINE_CONFIG_END /*----------------- @@ -56,6 +66,7 @@ ROM_LOAD("corvsnd7", 0x500000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(corv_lx1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -77,6 +88,7 @@ ROM_LOAD("corvsnd7", 0x500000, 0x080000, CRC(1417b547) SHA1(851acf77159a1ef99fc2934353eb887065568004)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(corv_px4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -146,6 +158,7 @@ ROM_LOAD("su7", 0x500000, 0x080000, CRC(94eea5a4) SHA1(afb00e799dbc01c67ed2c4aa399e8a7365ca3dd3)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(i500_11b) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -190,6 +203,7 @@ ROM_LOAD("jbsnd_u6.rom", 0x400000, 0x080000, CRC(7a1e2c3d) SHA1(0c6ccb937328509cb0a87e4c557a64c13bbed2db)) ROM_RELOAD(0x400000+0x080000, 0x080000) ROM_END + ROM_START(jb_10b) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -399,6 +413,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_la5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -422,6 +437,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_lx5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -445,6 +461,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_la4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -468,6 +485,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_lx4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -491,6 +509,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_lx3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -514,6 +533,7 @@ ROM_LOAD("rs_u8_s.l1", 0x600000, 0x080000, CRC(c70f2210) SHA1(9be9f271d81d15a4eb123f1377b0c077eef97774)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(rs_lx2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -566,6 +586,7 @@ ROM_LOAD("fs_u9_s.l1", 0x700000, 0x080000, CRC(0a6664fb) SHA1(751a726e3ea6a808bb137f3563d54acd1580836d)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(fs_lx2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -591,6 +612,7 @@ ROM_LOAD("fs_u9_s.l1", 0x700000, 0x080000, CRC(0a6664fb) SHA1(751a726e3ea6a808bb137f3563d54acd1580836d)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(fs_sp2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -616,6 +638,7 @@ ROM_LOAD("fs_u9_s.l1", 0x700000, 0x080000, CRC(0a6664fb) SHA1(751a726e3ea6a808bb137f3563d54acd1580836d)) ROM_RELOAD(0x700000+0x080000, 0x080000) ROM_END + ROM_START(fs_lx4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -670,6 +693,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_la2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -691,6 +715,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_la4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -712,6 +737,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_lx4) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -733,6 +759,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_lx5) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -754,6 +781,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_pa1) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -775,6 +803,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(ts_lf6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -796,6 +825,7 @@ ROM_LOAD("ts_u7_s.l1", 0x500000, 0x080000, CRC(62b5db14) SHA1(13832c8573623f9d541de8b814aa10cfb527be99)) ROM_RELOAD(0x500000 +0x080000, 0x080000) ROM_END + ROM_START(ts_lm6) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -842,6 +872,7 @@ ROM_LOAD("tm_u7_s.l2", 0x500000, 0x080000, CRC(f98e9e38) SHA1(bf8c204cfbbf5f9d59b7ad03d1784d37c638712c)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(tom_13) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -863,6 +894,7 @@ ROM_LOAD("tm_u7_s.l2", 0x500000, 0x080000, CRC(f98e9e38) SHA1(bf8c204cfbbf5f9d59b7ad03d1784d37c638712c)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(tom_12) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -884,6 +916,7 @@ ROM_LOAD("tm_u7_s.l2", 0x500000, 0x080000, CRC(f98e9e38) SHA1(bf8c204cfbbf5f9d59b7ad03d1784d37c638712c)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(tom_10f) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -905,6 +938,7 @@ ROM_LOAD("tm_u7_s.l2", 0x500000, 0x080000, CRC(f98e9e38) SHA1(bf8c204cfbbf5f9d59b7ad03d1784d37c638712c)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(tom_06) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -951,6 +985,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_12g) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -972,6 +1007,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_10r) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -993,6 +1029,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_11) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1014,6 +1051,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_10f) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1035,6 +1073,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_10g) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1056,6 +1095,7 @@ ROM_LOAD("wdu7_10.rom", 0x500000, 0x080000, CRC(36285ca2) SHA1(d42f04aa62b9859ce2452fa05da2049fe39e9411)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_03r) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1077,6 +1117,7 @@ ROM_LOAD("u7-s031.rom", 0x500000, 0x080000, CRC(d252f599) SHA1(bdce67187c027b713b6ef88f6cd4f025de469929)) ROM_RELOAD(0x500000+0x080000, 0x080000) ROM_END + ROM_START(wd_048r) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1125,6 +1166,7 @@ ROM_LOAD("wcup_u8.rom", 0x600000, 0x080000, CRC(670cd382) SHA1(89548420c3b6b8a3d7621b10c538ee1dc6a7be62)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(wcs_p3) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1148,6 +1190,7 @@ ROM_LOAD("wcup_u8.rom", 0x600000, 0x080000, CRC(670cd382) SHA1(89548420c3b6b8a3d7621b10c538ee1dc6a7be62)) ROM_RELOAD(0x600000+0x080000, 0x080000) ROM_END + ROM_START(wcs_p2) ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) ROM_REGION(0x2000, "user1", ROMREGION_ERASEFF) @@ -1187,54 +1230,55 @@ ROM_RELOAD(0x000000+0x080000, 0x080000) ROM_END -GAME(1994, corv_21, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (2.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, corv_px4, corv_21, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (PX4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, corv_lx1, corv_21, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (LX1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, dh_lx2, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Dirty Harry (LX-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, i500_11r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Indianapolis 500 (1.1R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, i500_11b, i500_11r, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Indianapolis 500 (1.1 Belgium)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, jb_10r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Jack*Bot (1.0R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, jb_10b, jb_10r, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Jack*Bot (1.0B) (Belgium/Canada)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, jm_12r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Johnny Mnemonic (1.2R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, jm_12b, jm_12r, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Johnny Mnemonic (1.2B) Belgium", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, nf_23x, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3X)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, nf_23, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, nf_23f, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3F)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, nf_22, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, nf_20, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.0)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_l6, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (L-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_la5, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (La-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_lx5, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_la4, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (La-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_lx4, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_lx3, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, rs_lx2, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, fs_lx5, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, fs_lx2, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, fs_sp2, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (SP-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, fs_lx4, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, ts_lx5, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LX-5)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, ts_lh6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LH-6)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, ts_lx4, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LX-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, ts_la4, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LA-4)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, ts_la2, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LA-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, ts_pa1, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (PA-1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, ts_lf6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LF-6) French", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, ts_lm6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LM-6) Mild", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, tom_13, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.3X)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(2005, tom_14h, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.4H)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, tom_12, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.2X)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, tom_10f, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.0 French)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, tom_06, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (0.6a)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_12, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_12g, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.2 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_11, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.1)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_10r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_10g, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 Germany)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_10f, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 French)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_03r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (0.3 R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1995, wd_048r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (0.48 R)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wcs_l2, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Lx-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wcs_p2, wcs_l2, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Pa-2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, wcs_p3, wcs_l2, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Px-3)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1994, tfs_12, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "WPC Test Fixture: Security (1.2)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) + +GAME(1994, corv_21, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (2.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, corv_px4, corv_21, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (PX4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, corv_lx1, corv_21, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Corvette (LX1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, dh_lx2, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Dirty Harry (LX-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, i500_11r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Indianapolis 500 (1.1R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, i500_11b, i500_11r, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Indianapolis 500 (1.1 Belgium)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, jb_10r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Jack*Bot (1.0R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, jb_10b, jb_10r, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Jack*Bot (1.0B) (Belgium/Canada)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, jm_12r, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Johnny Mnemonic (1.2R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, jm_12b, jm_12r, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Johnny Mnemonic (1.2B) Belgium", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, nf_23x, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3X)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, nf_23, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, nf_23f, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.3F)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, nf_22, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, nf_20, nf_23x, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "No Fear: Dangerous Sports (2.0)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_l6, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (L-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_la5, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (La-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_lx5, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_la4, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (La-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_lx4, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_lx3, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, rs_lx2, rs_l6, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "Red and Ted's Road Show (Lx-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, fs_lx5, 0, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, fs_lx2, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, fs_sp2, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (SP-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, fs_lx4, fs_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Williams", "The Flintstones (LX-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, ts_lx5, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LX-5)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, ts_lh6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LH-6)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, ts_lx4, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LX-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, ts_la4, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LA-4)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, ts_la2, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LA-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, ts_pa1, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (PA-1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, ts_lf6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LF-6) French", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, ts_lm6, ts_lx5, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "The Shadow (LM-6) Mild", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, tom_13, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.3X)", GAME_IS_SKELETON_MECHANICAL) +GAME(2005, tom_14h, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.4H)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, tom_12, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.2X)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, tom_10f, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (1.0 French)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, tom_06, tom_13, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Theatre Of Magic (0.6a)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_12, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_12g, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.2 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_11, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.1)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_10r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_10g, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 Germany)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_10f, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (1.0 French)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_03r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (0.3 R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1995, wd_048r, wd_12, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "Who Dunnit (0.48 R)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wcs_l2, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Lx-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wcs_p2, wcs_l2, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Pa-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, wcs_p3, wcs_l2, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "World Cup Soccer (Px-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1994, tfs_12, 0, wpc_s, wpc_s, wpc_s, ROT0, "Bally", "WPC Test Fixture: Security (1.2)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/wrally.c mame-0.145/src/mame/drivers/wrally.c --- mame-0.144/src/mame/drivers/wrally.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/wrally.c 2012-02-06 21:30:41.000000000 +0000 @@ -263,10 +263,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*16, 32*16) MCFG_SCREEN_VISIBLE_AREA(8, 24*16-8-1, 16, 16*16-8-1) - MCFG_SCREEN_UPDATE(wrally) + MCFG_SCREEN_UPDATE_STATIC(wrally) MCFG_GFXDECODE(wrally) MCFG_PALETTE_LENGTH(1024*8) diff -Nru mame-0.144/src/mame/drivers/wwfsstar.c mame-0.145/src/mame/drivers/wwfsstar.c --- mame-0.144/src/mame/drivers/wwfsstar.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/wwfsstar.c 2012-02-06 21:30:37.000000000 +0000 @@ -435,9 +435,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 320, 0, 256, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */ - MCFG_SCREEN_UPDATE(wwfsstar) + MCFG_SCREEN_UPDATE_STATIC(wwfsstar) MCFG_GFXDECODE(wwfsstar) MCFG_PALETTE_LENGTH(384) diff -Nru mame-0.144/src/mame/drivers/wwfwfest.c mame-0.145/src/mame/drivers/wwfwfest.c --- mame-0.144/src/mame/drivers/wwfwfest.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/wwfwfest.c 2012-02-06 21:30:41.000000000 +0000 @@ -381,11 +381,15 @@ dd3_ymirq_handler }; -static SCREEN_EOF( wwfwfest ) +static SCREEN_VBLANK( wwfwfest ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space,0,0,0xffff); + buffer_spriteram16_w(space,0,0,0xffff); + } } /******************************************************************************* @@ -406,10 +410,9 @@ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 320, 272, 8, 248) /* HTOTAL and VTOTAL are guessed */ - MCFG_SCREEN_UPDATE(wwfwfest) - MCFG_SCREEN_EOF(wwfwfest) + MCFG_SCREEN_UPDATE_STATIC(wwfwfest) + MCFG_SCREEN_VBLANK_STATIC(wwfwfest) MCFG_GFXDECODE(wwfwfest) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/xain.c mame-0.145/src/mame/drivers/xain.c --- mame-0.144/src/mame/drivers/xain.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/xain.c 2012-02-06 21:30:40.000000000 +0000 @@ -611,9 +611,8 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 384, 0, 256, 272, 8, 248) /* based on ddragon driver */ - MCFG_SCREEN_UPDATE(xain) + MCFG_SCREEN_UPDATE_STATIC(xain) MCFG_GFXDECODE(xain) MCFG_PALETTE_LENGTH(512) diff -Nru mame-0.144/src/mame/drivers/xexex.c mame-0.145/src/mame/drivers/xexex.c --- mame-0.144/src/mame/drivers/xexex.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/xexex.c 2012-02-06 21:30:42.000000000 +0000 @@ -59,14 +59,13 @@ #include "emu.h" #include "cpu/m68000/m68000.h" -#include "deprecat.h" -#include "video/konicdev.h" -#include "machine/k053252.h" #include "cpu/z80/z80.h" #include "machine/eeprom.h" +#include "machine/k053252.h" #include "sound/k054539.h" #include "sound/2151intf.h" #include "sound/flt_vol.h" +#include "video/konicdev.h" #include "includes/xexex.h" #include "includes/konamipt.h" @@ -285,39 +284,40 @@ } } -static INTERRUPT_GEN( xexex_interrupt ) +static TIMER_DEVICE_CALLBACK( xexex_interrupt ) { - xexex_state *state = device->machine().driver_data(); + xexex_state *state = timer.machine().driver_data(); + int scanline = param; if (state->m_suspension_active) { state->m_suspension_active = 0; - device->machine().scheduler().trigger(state->m_resume_trigger); + timer.machine().scheduler().trigger(state->m_resume_trigger); } - switch (cpu_getiloops(device)) + if(scanline == 0) { - case 0: - // IRQ 6 is for test mode only + // IRQ 6 is for test mode only if (state->m_cur_control2 & 0x0020) - device_set_input_line(device, 6, HOLD_LINE); - break; + device_set_input_line(state->m_maincpu, 6, HOLD_LINE); + } + + /* TODO: vblank is at 256! (enable CCU then have fun in fixing offsetted layers) */ + if(scanline == 128) + { + if (k053246_is_irq_enabled(state->m_k053246)) + { + // OBJDMA starts at the beginning of V-blank + xexex_objdma(timer.machine(), 0); + + // schedule DMA end interrupt + state->m_dmadelay_timer->adjust(XE_DMADELAY); + } - case 1: - if (k053246_is_irq_enabled(state->m_k053246)) - { - // OBJDMA starts at the beginning of V-blank - xexex_objdma(device->machine(), 0); - - // schedule DMA end interrupt - state->m_dmadelay_timer->adjust(XE_DMADELAY); - } - - // IRQ 4 is the V-blank interrupt. It controls color, sound and - // vital game logics that shouldn't be interfered by frame-drop. - if (state->m_cur_control2 & 0x0800) - device_set_input_line(device, 4, HOLD_LINE); - break; + // IRQ 4 is the V-blank interrupt. It controls color, sound and + // vital game logics that shouldn't be interfered by frame-drop. + if (state->m_cur_control2 & 0x0800) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } } @@ -526,7 +526,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, 32000000/2) // 16MHz (32MHz xtal) MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT_HACK(xexex_interrupt,2) + MCFG_TIMER_ADD_SCANLINE("scantimer", xexex_interrupt, "screen", 0, 1) // 8MHz (PCB shows one 32MHz/18.432MHz xtal, reference: www.system16.com) // more likely 32MHz since 18.432MHz yields 4.608MHz(too slow) or 9.216MHz(too fast) with integer divisors @@ -547,10 +547,9 @@ // MCFG_SCREEN_REFRESH_RATE(8000000/512/288) MCFG_SCREEN_RAW_PARAMS(8000000, 384+33+40+55, 0, 383, 256+12+6+14, 0, 255) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(40, 40+384-1, 0, 0+256-1) - MCFG_SCREEN_UPDATE(xexex) + MCFG_SCREEN_UPDATE_STATIC(xexex) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/xmen.c mame-0.145/src/mame/drivers/xmen.c --- mame-0.144/src/mame/drivers/xmen.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/xmen.c 2012-02-06 21:30:40.000000000 +0000 @@ -391,10 +391,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(59.17) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) /* correct, same issue of TMNT2 */ - MCFG_SCREEN_UPDATE(xmen) + MCFG_SCREEN_UPDATE_STATIC(xmen) MCFG_PALETTE_LENGTH(2048) MCFG_K052109_ADD("k052109", xmen_k052109_intf) @@ -444,21 +443,19 @@ MCFG_DEFAULT_LAYOUT(layout_dualhsxs) MCFG_SCREEN_ADD("lscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(12*8, 48*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(xmen6p) + MCFG_SCREEN_UPDATE_STATIC(xmen6p_left) MCFG_SCREEN_ADD("rscreen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(16*8, 52*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(xmen6p) - MCFG_SCREEN_EOF(xmen6p) + MCFG_SCREEN_UPDATE_STATIC(xmen6p_right) + MCFG_SCREEN_VBLANK_STATIC(xmen6p) MCFG_VIDEO_START(xmen6p) @@ -619,6 +616,35 @@ ROM_LOAD( "xmen_eba.nv", 0x0000, 0x0080, CRC(37f8e77a) SHA1(0b92caba33486c6fd104806aa96f735743bb2221) ) ROM_END + +ROM_START( xmena ) + ROM_REGION( 0x100000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "065-ada.10d", 0x00000, 0x20000, CRC(b8276624) SHA1(5b601393faa4bf578d84b590eb2360ad400368a5) ) /* Asia 4 Player version */ + ROM_LOAD16_BYTE( "065-ada.10f", 0x00001, 0x20000, CRC(c68582ad) SHA1(d2ca23cc0ad08e7f3d5c533f6fe43d4c215c114e) ) + ROM_LOAD16_BYTE( "065-a02.9d", 0x80000, 0x40000, CRC(b31dc44c) SHA1(4bdac05826b4d6d4fe46686ede5190e2f73eefc5) ) + ROM_LOAD16_BYTE( "065-a03.9f", 0x80001, 0x40000, CRC(13842fe6) SHA1(b61f094eb94336edb8708d3437ead9b853b2d6e6) ) + + ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k+128k for sound cpu */ + ROM_LOAD( "065-a01.6f", 0x00000, 0x20000, CRC(147d3a4d) SHA1(a14409fe991e803b9e7812303e3a9ebd857d8b01) ) + ROM_RELOAD( 0x10000, 0x20000 ) + + ROM_REGION( 0x200000, "gfx1", 0 ) /* graphics (addressable by the main CPU) */ + ROM_LOAD( "065-a08.15l", 0x000000, 0x100000, CRC(6b649aca) SHA1(2595f314517738e8614facf578cc951a6c36a180) ) /* tiles */ + ROM_LOAD( "065-a07.16l", 0x100000, 0x100000, CRC(c5dc8fc4) SHA1(9887cb002c8b72be7ce933cb397f00cdc5506c8c) ) + + ROM_REGION( 0x400000, "gfx2", 0 ) /* graphics (addressable by the main CPU) */ + ROM_LOAD( "065-a09.2h", 0x000000, 0x100000, CRC(ea05d52f) SHA1(7f2c14f907355856fb94e3a67b73aa1919776835) ) /* sprites */ + ROM_LOAD( "065-a10.2l", 0x100000, 0x100000, CRC(96b91802) SHA1(641943557b59b91f0edd49ec8a73cef7d9268b32) ) + ROM_LOAD( "065-a12.1h", 0x200000, 0x100000, CRC(321ed07a) SHA1(5b00ed676daeea974bdce6701667cfe573099dad) ) + ROM_LOAD( "065-a11.1l", 0x300000, 0x100000, CRC(46da948e) SHA1(168ac9178ee5bad5931557fb549e1237971d7839) ) + + ROM_REGION( 0x200000, "k054539", 0 ) /* samples for the 054539 */ + ROM_LOAD( "065-a06.1f", 0x000000, 0x200000, CRC(5adbcee0) SHA1(435feda697193bc51db80eba46be474cbbc1de4b) ) + + ROM_REGION16_BE( 0x80, "eeprom", 0 ) + ROM_LOAD( "xmen_ada.nv", 0x0000, 0x0080, CRC(a77a3891) SHA1(84ec257790d5c1859ffcbc9371a72ea99d7f8928) ) +ROM_END + ROM_START( xmen2pe ) ROM_REGION( 0x100000, "maincpu", 0 ) ROM_LOAD16_BYTE( "065-eaa04.10d", 0x00000, 0x20000, CRC(502861e7) SHA1(f96aab2d2006703065de5bd7e341f929d04f5f60) ) /* Europe 2 Player version */ @@ -814,9 +840,10 @@ ROM_LOAD( "xmen_ucb.nv", 0x0000, 0x0080, CRC(f3d0f682) SHA1(b0d4655c651238ae028ffb59a704acba798f93f8) ) ROM_END -GAME( 1992, xmen, 0, xmen, xmen, 0, ROT0, "Konami", "X-Men (4 Players ver UBB)", GAME_SUPPORTS_SAVE ) /* Second "version" letter denotes players, A=2 players, B=4 players, C=6 players ??? */ +GAME( 1992, xmen, 0, xmen, xmen, 0, ROT0, "Konami", "X-Men (4 Players ver UBB)", GAME_SUPPORTS_SAVE ) /* Second "version" letter denotes players, A=2 players, D/B=4 players, C=6 players ??? */ GAME( 1992, xmenj, xmen, xmen, xmen, 0, ROT0, "Konami", "X-Men (4 Players ver JBA)", GAME_SUPPORTS_SAVE ) GAME( 1992, xmene, xmen, xmen, xmen, 0, ROT0, "Konami", "X-Men (4 Players ver EBA)", GAME_SUPPORTS_SAVE ) +GAME( 1992, xmena, xmen, xmen, xmen, 0, ROT0, "Konami", "X-Men (4 Players ver ADA)", GAME_SUPPORTS_SAVE ) GAME( 1992, xmen2pe, xmen, xmen, xmen2p, 0, ROT0, "Konami", "X-Men (2 Players ver EAA)", GAME_SUPPORTS_SAVE ) GAME( 1992, xmen2pa, xmen, xmen, xmen2p, 0, ROT0, "Konami", "X-Men (2 Players ver AAA)", GAME_SUPPORTS_SAVE ) GAME( 1992, xmen2pj, xmen, xmen, xmen2p, 0, ROT0, "Konami", "X-Men (2 Players ver JAA)", GAME_SUPPORTS_SAVE ) diff -Nru mame-0.144/src/mame/drivers/xorworld.c mame-0.145/src/mame/drivers/xorworld.c --- mame-0.144/src/mame/drivers/xorworld.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/xorworld.c 2012-02-06 21:30:41.000000000 +0000 @@ -183,10 +183,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(xorworld) + MCFG_SCREEN_UPDATE_STATIC(xorworld) MCFG_GFXDECODE(xorworld) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/xtheball.c mame-0.145/src/mame/drivers/xtheball.c --- mame-0.144/src/mame/drivers/xtheball.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/xtheball.c 2012-02-06 21:30:41.000000000 +0000 @@ -34,11 +34,11 @@ * *************************************/ -static void xtheball_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +static void xtheball_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { xtheball_state *state = screen.machine().driver_data(); UINT16 *srcbg = &state->m_vram_bg[(params->rowaddr << 8) & 0xff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); int coladdr = params->coladdr; int x; @@ -314,7 +314,8 @@ "screen", /* the screen operated on */ 10000000, /* pixel clock */ 1, /* pixels per clock */ - xtheball_scanline_update, /* scanline callback */ + NULL, /* scanline callback (indexed16) */ + xtheball_scanline_update, /* scanline callback (rgb32) */ NULL, /* generate interrupt */ xtheball_to_shiftreg, /* write to shiftreg function */ xtheball_from_shiftreg /* read from shiftreg function */ @@ -343,9 +344,8 @@ MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(10000000, 640, 114, 626, 257, 24, 248) - MCFG_SCREEN_UPDATE(tms340x0) + MCFG_SCREEN_UPDATE_STATIC(tms340x0_rgb32) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/xtom3d.c mame-0.145/src/mame/drivers/xtom3d.c --- mame-0.144/src/mame/drivers/xtom3d.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/xtom3d.c 2012-02-06 21:30:41.000000000 +0000 @@ -2,6 +2,11 @@ X Tom 3D +TODO: +- clears a work RAM snippet then jumps to that snippet ... it doesn't do + that if you soft reset emulation. +- understand how to load game ROMs + This game runs on PC-based hardware. Major components are.... @@ -32,6 +37,8 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/i386/i386.h" #include "memconv.h" @@ -45,59 +52,676 @@ #include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" +#include "video/pc_vga.h" class xtom3d_state : public driver_device { public: xtom3d_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pit8254(*this, "pit8254"), + m_dma8237_1(*this, "dma8237_1"), + m_dma8237_2(*this, "dma8237_2"), + m_pic8259_1(*this, "pic8259_1"), + m_pic8259_2(*this, "pic8259_2") + { } + + UINT32 *m_bios_ram; + UINT32 *m_bios_ext1_ram; + UINT32 *m_bios_ext2_ram; + UINT32 *m_bios_ext3_ram; + UINT32 *m_bios_ext4_ram; + UINT32 *m_isa_ram1; + UINT32 *m_isa_ram2; + int m_dma_channel; + UINT8 m_dma_offset[2][4]; + UINT8 m_at_pages[0x10]; + UINT8 m_mxtc_config_reg[256]; + UINT8 m_piix4_config_reg[4][256]; + + // devices + required_device m_maincpu; + required_device m_pit8254; + required_device m_dma8237_1; + required_device m_dma8237_2; + required_device m_pic8259_1; + required_device m_pic8259_2; + + DECLARE_READ8_MEMBER( get_slave_ack ); + + DECLARE_WRITE32_MEMBER( isa_ram1_w ); + DECLARE_WRITE32_MEMBER( isa_ram2_w ); + + DECLARE_WRITE32_MEMBER( bios_ext1_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext2_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext3_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ext4_ram_w ); + DECLARE_WRITE32_MEMBER( bios_ram_w ); }; +// Intel 82439TX System Controller (MXTC) + +static UINT8 mxtc_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + xtom3d_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("MXTC: read %d, %02X\n", function, reg); + + return state->m_mxtc_config_reg[reg]; +} + +static void mxtc_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + xtom3d_state *state = busdevice->machine().driver_data(); + printf("MXTC: write %d, %02X, %02X\n", function, reg, data); + + /* + memory banking with North Bridge: + 0x59 (PAM0) xxxx ---- BIOS area 0xf0000-0xfffff + ---- xxxx Reserved + 0x5a (PAM1) xxxx ---- ISA add-on BIOS 0xc4000 - 0xc7fff + ---- xxxx ISA add-on BIOS 0xc0000 - 0xc3fff + 0x5b (PAM2) xxxx ---- ISA add-on BIOS 0xcc000 - 0xcffff + ---- xxxx ISA add-on BIOS 0xc8000 - 0xcbfff + 0x5c (PAM3) xxxx ---- ISA add-on BIOS 0xd4000 - 0xd7fff + ---- xxxx ISA add-on BIOS 0xd0000 - 0xd3fff + 0x5d (PAM4) xxxx ---- ISA add-on BIOS 0xdc000 - 0xdffff + ---- xxxx ISA add-on BIOS 0xd8000 - 0xdbfff + 0x5e (PAM5) xxxx ---- BIOS extension 0xe4000 - 0xe7fff + ---- xxxx BIOS extension 0xe0000 - 0xe3fff + 0x5f (PAM6) xxxx ---- BIOS extension 0xec000 - 0xeffff + ---- xxxx BIOS extension 0xe8000 - 0xebfff + + 3210 -> 3 = reserved, 2 = Cache Enable, 1 = Write Enable, 0 = Read Enable + */ + + switch(reg) + { + case 0x59: // PAM0 + { + if (data & 0x10) // enable RAM access to region 0xf0000 - 0xfffff + memory_set_bankptr(busdevice->machine(), "bios_bank", state->m_bios_ram); + else // disable RAM access (reads go to BIOS ROM) + memory_set_bankptr(busdevice->machine(), "bios_bank", busdevice->machine().region("bios")->base() + 0x10000); + break; + } + case 0x5a: // PAM1 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "video_bank1", state->m_isa_ram1); + else + memory_set_bankptr(busdevice->machine(), "video_bank1", busdevice->machine().region("video_bios")->base() + 0); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "video_bank2", state->m_isa_ram2); + else + memory_set_bankptr(busdevice->machine(), "video_bank2", busdevice->machine().region("video_bios")->base() + 0x4000); + + break; + } + case 0x5e: // PAM5 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext1", state->m_bios_ext1_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext1", busdevice->machine().region("bios")->base() + 0); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext2", state->m_bios_ext2_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext2", busdevice->machine().region("bios")->base() + 0x4000); + + break; + } + case 0x5f: // PAM6 + { + if (data & 0x1) + memory_set_bankptr(busdevice->machine(), "bios_ext3", state->m_bios_ext3_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext3", busdevice->machine().region("bios")->base() + 0x8000); + + if (data & 0x10) + memory_set_bankptr(busdevice->machine(), "bios_ext4", state->m_bios_ext4_ram); + else + memory_set_bankptr(busdevice->machine(), "bios_ext4", busdevice->machine().region("bios")->base() + 0xc000); + + break; + } + } + + state->m_mxtc_config_reg[reg] = data; +} + +static void intel82439tx_init(running_machine &machine) +{ + xtom3d_state *state = machine.driver_data(); + state->m_mxtc_config_reg[0x60] = 0x02; + state->m_mxtc_config_reg[0x61] = 0x02; + state->m_mxtc_config_reg[0x62] = 0x02; + state->m_mxtc_config_reg[0x63] = 0x02; + state->m_mxtc_config_reg[0x64] = 0x02; + state->m_mxtc_config_reg[0x65] = 0x02; +} + +static UINT32 intel82439tx_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= mxtc_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mxtc_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mxtc_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mxtc_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82439tx_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mxtc_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mxtc_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mxtc_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mxtc_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) + +static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) +{ + xtom3d_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("PIIX4: read %d, %02X\n", function, reg); + return state->m_piix4_config_reg[function][reg]; +} + +static void piix4_config_w(device_t *busdevice, device_t *device, int function, int reg, UINT8 data) +{ + xtom3d_state *state = busdevice->machine().driver_data(); +// mame_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine.describe_context(), function, reg, data); + state->m_piix4_config_reg[function][reg] = data; +} + +static UINT32 intel82371ab_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) +{ + UINT32 r = 0; + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(busdevice, device, function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(busdevice, device, function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(busdevice, device, function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(busdevice, device, function, reg + 0) << 0; + } + return r; +} + +static void intel82371ab_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(busdevice, device, function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(busdevice, device, function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(busdevice, device, function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(busdevice, device, function, reg + 0, (data >> 0) & 0xff); + } +} + + +WRITE32_MEMBER(xtom3d_state::isa_ram1_w) +{ + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram1 + offset); + } +} + +WRITE32_MEMBER(xtom3d_state::isa_ram2_w) +{ + if (m_mxtc_config_reg[0x5a] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_isa_ram2 + offset); + } +} + +WRITE32_MEMBER(xtom3d_state::bios_ext1_ram_w) +{ + if (m_mxtc_config_reg[0x5e] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext1_ram + offset); + } +} + + +WRITE32_MEMBER(xtom3d_state::bios_ext2_ram_w) +{ + if (m_mxtc_config_reg[0x5e] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext2_ram + offset); + } +} + + +WRITE32_MEMBER(xtom3d_state::bios_ext3_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x2) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext3_ram + offset); + } +} + + +WRITE32_MEMBER(xtom3d_state::bios_ext4_ram_w) +{ + if (m_mxtc_config_reg[0x5f] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext4_ram + offset); + } +} + + +WRITE32_MEMBER(xtom3d_state::bios_ram_w) +{ + if (m_mxtc_config_reg[0x59] & 0x20) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram + offset); + } +} + +static READ32_DEVICE_HANDLER( ide_r ) +{ + return -1; // crashes otherwise + + return ide_controller32_r(device, 0x1f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( ide_w ) +{ + if(0) // crashes otherwise + ide_controller32_w(device, 0x1f0/4 + offset, data, mem_mask); +} + +static READ32_DEVICE_HANDLER( fdc_r ) +{ + return ide_controller32_r(device, 0x3f0/4 + offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER( fdc_w ) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(device, 0x3f0/4 + offset, data, mem_mask); +} + +static READ8_HANDLER(at_page8_r) +{ + xtom3d_state *state = space->machine().driver_data(); + UINT8 data = state->m_at_pages[offset % 0x10]; + + switch(offset % 8) { + case 1: + data = state->m_dma_offset[(offset / 8) & 1][2]; + break; + case 2: + data = state->m_dma_offset[(offset / 8) & 1][3]; + break; + case 3: + data = state->m_dma_offset[(offset / 8) & 1][1]; + break; + case 7: + data = state->m_dma_offset[(offset / 8) & 1][0]; + break; + } + return data; +} + + +static WRITE8_HANDLER(at_page8_w) +{ + xtom3d_state *state = space->machine().driver_data(); + state->m_at_pages[offset % 0x10] = data; + + switch(offset % 8) { + case 1: + state->m_dma_offset[(offset / 8) & 1][2] = data; + break; + case 2: + state->m_dma_offset[(offset / 8) & 1][3] = data; + break; + case 3: + state->m_dma_offset[(offset / 8) & 1][1] = data; + break; + case 7: + state->m_dma_offset[(offset / 8) & 1][0] = data; + break; + } +} + +static READ32_HANDLER(at_page32_r) +{ + return read32le_with_read8_handler(at_page8_r, space, offset, mem_mask); +} + + +static WRITE32_HANDLER(at_page32_w) +{ + write32le_with_write8_handler(at_page8_w, space, offset, data, mem_mask); +} + +static READ8_DEVICE_HANDLER(at_dma8237_2_r) +{ + return i8237_r(device, offset / 2); +} + +static WRITE8_DEVICE_HANDLER(at_dma8237_2_w) +{ + i8237_w(device, offset / 2, data); +} + +static READ32_DEVICE_HANDLER(at32_dma8237_2_r) +{ + return read32le_with_read8_device_handler(at_dma8237_2_r, device, offset, mem_mask); +} + +static WRITE32_DEVICE_HANDLER(at32_dma8237_2_w) +{ + write32le_with_write8_device_handler(at_dma8237_2_w, device, offset, data, mem_mask); +} + + + + +static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed ) +{ + cputag_set_input_line(device->machine(), "maincpu", INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + /* Assert HLDA */ + i8237_hlda_w( device, state ); +} + + +static READ8_HANDLER( pc_dma_read_byte ) +{ + xtom3d_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + return space->read_byte(page_offset + offset); +} + -static VIDEO_START(xtom3d) +static WRITE8_HANDLER( pc_dma_write_byte ) { + xtom3d_state *state = space->machine().driver_data(); + offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) + & 0xFF0000; + + space->write_byte(page_offset + offset, data); } -static SCREEN_UPDATE(xtom3d) +static void set_dma_channel(device_t *device, int channel, int state) { - return 0; + xtom3d_state *drvstate = device->machine().driver_data(); + if (!state) drvstate->m_dma_channel = channel; } -static ADDRESS_MAP_START(xtom3d_map, AS_PROGRAM, 32) +static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); } +static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); } + +static I8237_INTERFACE( dma8237_1_config ) +{ + DEVCB_LINE(pc_dma_hrq_changed), + DEVCB_NULL, + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte), + DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte), + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) } +}; + +static I8237_INTERFACE( dma8237_2_config ) +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, + { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } +}; + +static ADDRESS_MAP_START(xtom3d_map, AS_PROGRAM, 32, xtom3d_state) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM - AM_RANGE(0xfffc0000, 0xffffffff) AM_ROM AM_REGION("user1", 0) /* System BIOS */ + AM_RANGE(0x000a0000, 0x000bffff) AM_RAM + AM_RANGE(0x000c0000, 0x000c3fff) AM_ROMBANK("video_bank1") AM_WRITE(isa_ram1_w) + AM_RANGE(0x000c4000, 0x000c7fff) AM_ROMBANK("video_bank2") AM_WRITE(isa_ram2_w) + AM_RANGE(0x000e0000, 0x000e3fff) AM_ROMBANK("bios_ext1") AM_WRITE(bios_ext1_ram_w) + AM_RANGE(0x000e4000, 0x000e7fff) AM_ROMBANK("bios_ext2") AM_WRITE(bios_ext2_ram_w) + AM_RANGE(0x000e8000, 0x000ebfff) AM_ROMBANK("bios_ext3") AM_WRITE(bios_ext3_ram_w) + AM_RANGE(0x000ec000, 0x000effff) AM_ROMBANK("bios_ext4") AM_WRITE(bios_ext4_ram_w) + AM_RANGE(0x000f0000, 0x000fffff) AM_ROMBANK("bios_bank") AM_WRITE(bios_ram_w) + AM_RANGE(0x00100000, 0x01ffffff) AM_RAM + AM_RANGE(0xfffe0000, 0xffffffff) AM_ROM AM_REGION("bios", 0) /* System BIOS */ ADDRESS_MAP_END -static ADDRESS_MAP_START(xtom3d_io, AS_IO, 32) +static ADDRESS_MAP_START(xtom3d_io, AS_IO, 32, xtom3d_state) + AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, 0xffffffff) + AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8_LEGACY("pic8259_1", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) + AM_RANGE(0x0060, 0x006f) AM_READWRITE_LEGACY(kbdc8042_32le_r, kbdc8042_32le_w) + AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ + AM_RANGE(0x0080, 0x009f) AM_READWRITE_LEGACY(at_page32_r, at_page32_w) + AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff) + AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE_LEGACY("dma8237_2", at32_dma8237_2_r, at32_dma8237_2_w) + AM_RANGE(0x00e8, 0x00ef) AM_NOP + + AM_RANGE(0x01f0, 0x01f7) AM_DEVREADWRITE_LEGACY("ide", ide_r, ide_w) + AM_RANGE(0x03f0, 0x03f7) AM_DEVREADWRITE_LEGACY("ide", fdc_r, fdc_w) + + AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE_LEGACY("pcibus", pci_32le_r, pci_32le_w) ADDRESS_MAP_END -static INPUT_PORTS_START( xtom3d ) -INPUT_PORTS_END + +static const struct pit8253_config xtom3d_pit8254_config = +{ + { + { + 4772720/4, /* heartbeat IRQ */ + DEVCB_NULL, + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir0_w) + }, { + 4772720/4, /* dram refresh */ + DEVCB_NULL, + DEVCB_NULL + }, { + 4772720/4, /* pio port c pin 4, and speaker polling enough */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +static WRITE_LINE_DEVICE_HANDLER( xtom3d_pic8259_1_set_int_line ) +{ + xtom3d_state *drvstate = device->machine().driver_data(); + device_set_input_line(drvstate->m_maincpu, 0, state ? HOLD_LINE : CLEAR_LINE); +} + +READ8_MEMBER( xtom3d_state::get_slave_ack ) +{ + if (offset==2) { // IRQ = 2 + logerror("pic8259_slave_ACK!\n"); + return pic8259_acknowledge(m_pic8259_2); + } + return 0x00; +} + +static const struct pic8259_interface xtom3d_pic8259_1_config = +{ + DEVCB_LINE(xtom3d_pic8259_1_set_int_line), + DEVCB_LINE_VCC, + DEVCB_MEMBER(xtom3d_state,get_slave_ack) +}; + +static const struct pic8259_interface xtom3d_pic8259_2_config = +{ + DEVCB_DEVICE_LINE("pic8259_1", pic8259_ir2_w), + DEVCB_LINE_GND, + DEVCB_NULL +}; + +static void set_gate_a20(running_machine &machine, int a20) +{ + xtom3d_state *state = machine.driver_data(); + + device_set_input_line(state->m_maincpu, INPUT_LINE_A20, a20); +} + +static void keyboard_interrupt(running_machine &machine, int state) +{ + xtom3d_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static int xtom3d_get_out2(running_machine &machine) +{ + xtom3d_state *state = machine.driver_data(); + return pit8253_get_output(state->m_pit8254, 2 ); +} + +static const struct kbdc8042_interface at8042 = +{ + KBDC8042_AT386, set_gate_a20, keyboard_interrupt, NULL, xtom3d_get_out2 +}; + +static void xtom3d_set_keyb_int(running_machine &machine, int state) +{ + xtom3d_state *drvstate = machine.driver_data(); + pic8259_ir1_w(drvstate->m_pic8259_1, state); +} + +static IRQ_CALLBACK(irq_callback) +{ + xtom3d_state *state = device->machine().driver_data(); + return pic8259_acknowledge( state->m_pic8259_1); +} + +static void ide_interrupt(device_t *device, int state) +{ + xtom3d_state *drvstate = device->machine().driver_data(); + pic8259_ir6_w(drvstate->m_pic8259_2, state); +} + +static READ8_HANDLER( vga_setting ) { return 0xff; } // hard-code to color + +static MACHINE_START( xtom3d ) +{ + xtom3d_state *state = machine.driver_data(); + + state->m_bios_ram = auto_alloc_array(machine, UINT32, 0x10000/4); + state->m_bios_ext1_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext2_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext3_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_bios_ext4_ram = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram1 = auto_alloc_array(machine, UINT32, 0x4000/4); + state->m_isa_ram2 = auto_alloc_array(machine, UINT32, 0x4000/4); + + init_pc_common(machine, PCCOMMON_KEYBOARD_AT, xtom3d_set_keyb_int); + + device_set_irq_callback(state->m_maincpu, irq_callback); + intel82439tx_init(machine); + + kbdc8042_init(machine, &at8042); + pc_vga_init(machine, vga_setting, NULL); + pc_vga_io_init(machine, machine.device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine.device("maincpu")->memory().space(AS_IO), 0x0000); +} + +static MACHINE_RESET( xtom3d ) +{ + memory_set_bankptr(machine, "bios_bank", machine.region("bios")->base() + 0x10000); + memory_set_bankptr(machine, "bios_ext1", machine.region("bios")->base() + 0); + memory_set_bankptr(machine, "bios_ext2", machine.region("bios")->base() + 0x4000); + memory_set_bankptr(machine, "bios_ext3", machine.region("bios")->base() + 0x8000); + memory_set_bankptr(machine, "bios_ext4", machine.region("bios")->base() + 0xc000); + memory_set_bankptr(machine, "video_bank1", machine.region("video_bios")->base() + 0); + memory_set_bankptr(machine, "video_bank2", machine.region("video_bios")->base() + 0x4000); +} + static MACHINE_CONFIG_START( xtom3d, xtom3d_state ) - MCFG_CPU_ADD("maincpu", PENTIUM, 450000000) // actually Pentium II 450 + MCFG_CPU_ADD("maincpu", PENTIUM, 450000000/16) // actually Pentium II 450 MCFG_CPU_PROGRAM_MAP(xtom3d_map) MCFG_CPU_IO_MAP(xtom3d_io) - /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 199) - MCFG_SCREEN_UPDATE(xtom3d) - MCFG_PALETTE_LENGTH(16) + MCFG_MACHINE_START(xtom3d) + MCFG_MACHINE_RESET(xtom3d) + + MCFG_PIT8254_ADD( "pit8254", xtom3d_pit8254_config ) + MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) + MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) + MCFG_PIC8259_ADD( "pic8259_1", xtom3d_pic8259_1_config ) + MCFG_PIC8259_ADD( "pic8259_2", xtom3d_pic8259_2_config ) + + MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) + + MCFG_PCI_BUS_ADD("pcibus", 0) + MCFG_PCI_BUS_DEVICE(0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) + MCFG_PCI_BUS_DEVICE(7, NULL, intel82371ab_pci_r, intel82371ab_pci_w) - MCFG_VIDEO_START(xtom3d) + MCFG_IDE_CONTROLLER_ADD("ide", ide_interrupt) + + /* video hardware */ + MCFG_FRAGMENT_ADD( pcvideo_vga ) MACHINE_CONFIG_END + ROM_START( xtom3d ) - ROM_REGION32_LE(0x40000, "user1", 0) + ROM_REGION32_LE(0x20000, "bios", 0) ROM_LOAD( "bios.u22", 0x000000, 0x020000, CRC(f7c58044) SHA1(fd967d009e0d3c8ed9dd7be852946f2b9dee7671) ) + ROM_REGION( 0x8000, "video_bios", 0 ) // TODO: no VGA card is hooked up, to be removed + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) + ROM_REGION(0xe00000, "user2", 0) ROM_LOAD( "u3", 0x000000, 0x200000, CRC(f332e030) SHA1(f04fc7fc97e6ada8122ea7d111455043d7cc42df) ) ROM_LOAD( "u4", 0x200000, 0x200000, CRC(ac40ea0b) SHA1(6fcb86f493885d62d20df6bddaa1a1b19d478c65) ) @@ -108,4 +732,5 @@ ROM_LOAD( "u20", 0xc00000, 0x200000, CRC(452131d9) SHA1(f62a0f1a7da9025ac1f7d5de4df90166871ac1e5) ) ROM_END -GAME(1999, xtom3d, 0, xtom3d, xtom3d, 0, ROT0, "Jamie System Development", "X Tom 3D", GAME_NO_SOUND|GAME_NOT_WORKING) + +GAME(1999, xtom3d, 0, xtom3d, at_keyboard, 0, ROT0, "Jamie System Development", "X Tom 3D", GAME_IS_SKELETON) diff -Nru mame-0.144/src/mame/drivers/xxmissio.c mame-0.145/src/mame/drivers/xxmissio.c --- mame-0.144/src/mame/drivers/xxmissio.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/xxmissio.c 2012-02-06 21:30:42.000000000 +0000 @@ -303,10 +303,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 4*8, 28*8-1) - MCFG_SCREEN_UPDATE(xxmissio) + MCFG_SCREEN_UPDATE_STATIC(xxmissio) MCFG_GFXDECODE(xxmissio) MCFG_PALETTE_LENGTH(768) diff -Nru mame-0.144/src/mame/drivers/xybots.c mame-0.145/src/mame/drivers/xybots.c --- mame-0.144/src/mame/drivers/xybots.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/xybots.c 2012-02-06 21:30:37.000000000 +0000 @@ -209,11 +209,10 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) /* note: these parameters are from published specs, not derived */ /* the board uses a SYNGEN chip to generate video signals */ MCFG_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240) - MCFG_SCREEN_UPDATE(xybots) + MCFG_SCREEN_UPDATE_STATIC(xybots) MCFG_VIDEO_START(xybots) diff -Nru mame-0.144/src/mame/drivers/xyonix.c mame-0.145/src/mame/drivers/xyonix.c --- mame-0.144/src/mame/drivers/xyonix.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/drivers/xyonix.c 2012-02-06 21:30:39.000000000 +0000 @@ -227,10 +227,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(80*4, 32*8) MCFG_SCREEN_VISIBLE_AREA(0, 80*4-1, 0, 28*8-1) - MCFG_SCREEN_UPDATE(xyonix) + MCFG_SCREEN_UPDATE_STATIC(xyonix) MCFG_GFXDECODE(xyonix) MCFG_PALETTE_LENGTH(256) diff -Nru mame-0.144/src/mame/drivers/yiear.c mame-0.145/src/mame/drivers/yiear.c --- mame-0.144/src/mame/drivers/yiear.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/yiear.c 2012-02-06 21:30:35.000000000 +0000 @@ -94,7 +94,7 @@ #include "includes/yiear.h" -static READ8_DEVICE_HANDLER( yiear_speech_r ) +READ8_DEVICE_HANDLER( yiear_speech_r ) { if (vlm5030_bsy(device)) return 1; @@ -102,18 +102,26 @@ return 0; } -static WRITE8_DEVICE_HANDLER( yiear_VLM5030_control_w ) +WRITE8_DEVICE_HANDLER( yiear_VLM5030_control_w ) { /* bit 0 is latch direction */ vlm5030_st(device, (data >> 1) & 1); vlm5030_rst(device, (data >> 2) & 1); } +static INTERRUPT_GEN( yiear_vblank_interrupt ) +{ + yiear_state *state = device->machine().driver_data(); + + if (state->m_yiear_irq_enable) + device_set_input_line(device, 0, HOLD_LINE); +} + + static INTERRUPT_GEN( yiear_nmi_interrupt ) { yiear_state *state = device->machine().driver_data(); - /* can't use nmi_line_pulse() because interrupt_enable_w() effects it */ if (state->m_yiear_nmi_enable) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); } @@ -126,12 +134,12 @@ AM_RANGE(0x4900, 0x4900) AM_DEVWRITE("snsnd", konami_SN76496_w) AM_RANGE(0x4a00, 0x4a00) AM_DEVWRITE("vlm", yiear_VLM5030_control_w) AM_RANGE(0x4b00, 0x4b00) AM_DEVWRITE("vlm", vlm5030_data_w) - AM_RANGE(0x4c00, 0x4c00) AM_READ_PORT("DSW1") - AM_RANGE(0x4d00, 0x4d00) AM_READ_PORT("DSW2") + AM_RANGE(0x4c00, 0x4c00) AM_READ_PORT("DSW2") + AM_RANGE(0x4d00, 0x4d00) AM_READ_PORT("DSW3") AM_RANGE(0x4e00, 0x4e00) AM_READ_PORT("SYSTEM") AM_RANGE(0x4e01, 0x4e01) AM_READ_PORT("P1") AM_RANGE(0x4e02, 0x4e02) AM_READ_PORT("P2") - AM_RANGE(0x4e03, 0x4e03) AM_READ_PORT("DSW3") + AM_RANGE(0x4e03, 0x4e03) AM_READ_PORT("DSW1") AM_RANGE(0x4f00, 0x4f00) AM_WRITE(watchdog_reset_w) AM_RANGE(0x5000, 0x502f) AM_RAM AM_BASE_SIZE_MEMBER(yiear_state, m_spriteram, m_spriteram_size) AM_RANGE(0x5400, 0x542f) AM_RAM AM_BASE_MEMBER(yiear_state, m_spriteram2) @@ -173,40 +181,41 @@ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x01, DEF_STR( Lives ) ) + KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1) + /* "Invalid" = both coin slots disabled */ + + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x03, "1" ) PORT_DIPSETTING( 0x02, "2" ) PORT_DIPSETTING( 0x01, "3" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, "30000 80000" ) PORT_DIPSETTING( 0x00, "40000 90000" ) - PORT_DIPNAME( 0x30, 0x10, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x30, 0x10, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_START("DSW3") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) + PORT_DIPNAME( 0x02, 0x02, "Upright Controls" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("DSW3") - KONAMI_COINAGE(DEF_STR( Free_Play ), "Invalid") - /* "Invalid" = both coin slots disabled */ + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW3:4" ) + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -261,7 +270,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6809,XTAL_18_432MHz/12) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + MCFG_CPU_VBLANK_INT("screen", yiear_vblank_interrupt) MCFG_CPU_PERIODIC_INT(yiear_nmi_interrupt,480) /* music tempo (correct frequency unknown) */ MCFG_MACHINE_START(yiear) @@ -271,10 +280,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.58) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(yiear) + MCFG_SCREEN_UPDATE_STATIC(yiear) MCFG_GFXDECODE(yiear) MCFG_PALETTE_LENGTH(32) diff -Nru mame-0.144/src/mame/drivers/yunsun16.c mame-0.145/src/mame/drivers/yunsun16.c --- mame-0.144/src/mame/drivers/yunsun16.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/yunsun16.c 2012-02-06 21:30:38.000000000 +0000 @@ -606,10 +606,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0+0x20, 0x180-1-0x20, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(yunsun16) + MCFG_SCREEN_UPDATE_STATIC(yunsun16) MCFG_GFXDECODE(yunsun16) MCFG_PALETTE_LENGTH(8192) @@ -648,10 +647,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(0x180, 0xe0) MCFG_SCREEN_VISIBLE_AREA(0, 0x180-1-4, 0, 0xe0-1) - MCFG_SCREEN_UPDATE(yunsun16) + MCFG_SCREEN_UPDATE_STATIC(yunsun16) MCFG_GFXDECODE(yunsun16) MCFG_PALETTE_LENGTH(8192) diff -Nru mame-0.144/src/mame/drivers/yunsung8.c mame-0.145/src/mame/drivers/yunsung8.c --- mame-0.144/src/mame/drivers/yunsung8.c 2011-08-04 02:16:27.000000000 +0000 +++ mame-0.145/src/mame/drivers/yunsung8.c 2012-02-06 21:30:38.000000000 +0000 @@ -518,10 +518,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(512, 256) MCFG_SCREEN_VISIBLE_AREA(0+64, 512-64-1, 0+8, 256-8-1) - MCFG_SCREEN_UPDATE(yunsung8) + MCFG_SCREEN_UPDATE_STATIC(yunsung8) MCFG_GFXDECODE(yunsung8) MCFG_PALETTE_LENGTH(2048) diff -Nru mame-0.144/src/mame/drivers/zac_1.c mame-0.145/src/mame/drivers/zac_1.c --- mame-0.144/src/mame/drivers/zac_1.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zac_1.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,6 +1,9 @@ /* Zaccaria Generation 1 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/s2650/s2650.h" @@ -8,18 +11,28 @@ { public: zac_1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( zac_1_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( zac_1_map, AS_PROGRAM, 8, zac_1_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( zac_1 ) INPUT_PORTS_END -static MACHINE_RESET( zac_1 ) +void zac_1_state::machine_reset() { } @@ -31,10 +44,9 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", S2650, 6000000/2) MCFG_CPU_PROGRAM_MAP(zac_1_map) - - MCFG_MACHINE_RESET( zac_1 ) MACHINE_CONFIG_END + /*-------------------------------- / Earth Wind Fire (04/81) /-------------------------------*/ @@ -45,6 +57,7 @@ ROM_LOAD ( "ewf_3.lgc", 0x0800, 0x0400, CRC(b21bf015) SHA1(ecddfe1d6797c39e094a7f86efabf0abea0fa4af)) ROM_LOAD ( "ewf_4.lgc", 0x0c00, 0x0400, CRC(d110da3f) SHA1(88e27347d209fab5be924f95b0a001476ea92c1f)) ROM_LOAD ( "ewf_5.lgc", 0x1000, 0x0400, CRC(f695dab6) SHA1(48ca60718cea40baa5052f690c8d69eb7ab32b0e)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("ewf.snd", 0x0000, 0x0800, CRC(5079e493) SHA1(51d366cdd09ad00b8b016b0ea1c85ac95ef94d71)) ROM_END @@ -113,6 +126,7 @@ ROM_CONTINUE(0x1400, 0x0400) ROM_LOAD ( "loc-4.fil", 0x0c00, 0x0400, CRC(177c89b6) SHA1(23de8208dbbf141952a974514fc752ed2eb6b202)) ROM_LOAD ( "loc-5.fil", 0x1000, 0x0400, CRC(cad4122a) SHA1(df29914adeb9675abbd9f43dbef23adf2fe96c81)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("loc-snd.fil", 0x0000, 0x0800, CRC(51ea9d2a) SHA1(9a68687af2c1cad2a261f61a67a625d906c502e1)) ROM_END @@ -139,6 +153,7 @@ ROM_LOAD ( "spcshtl3.lgc", 0x0800, 0x0400, CRC(a302e5a9) SHA1(1585f4000d105a7a2be5638ade9ab8668e6c8a5e)) ROM_LOAD ( "spcshtl4.lgc", 0x0c00, 0x0400, CRC(a02ee0b5) SHA1(50532bdc347ecfdbd4cc43403ff2cb1dcb1fe1ac)) ROM_LOAD ( "spcshtl5.lgc", 0x1000, 0x0400, CRC(d1dabd9b) SHA1(0d28336764f43fa4d1b23d849b6ec0f60b2b4ecf)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("spcshtl.snd", 0x0000, 0x0800, CRC(9a61781c) SHA1(0293640653d8cc9532debd31bbb70f025b4e6d03)) ROM_END @@ -162,6 +177,7 @@ ROM_LOAD ( "stargod3.lgc", 0x0800, 0x0400, CRC(95492ac0) SHA1(992ad53efc5b53020e3939dfca5431fd50b6571c)) ROM_LOAD ( "stargod4.lgc", 0x0c00, 0x0400, CRC(09e5682a) SHA1(c9fcad4f55ee005e204a49fa65e7d77ecfde9680)) ROM_LOAD ( "stargod5.lgc", 0x1000, 0x0400, CRC(43ba2462) SHA1(6749bdceca4a1dc2bc90d7ee3b671f52219e1af4)) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("stargod.snd", 0x7800, 0x0800, CRC(c9103a68) SHA1(cc77af54fdb192f0b334d9d1028210618c3f1d95)) ROM_RELOAD( 0xf800, 0x0800) @@ -179,14 +195,14 @@ ROM_LOAD ( "ws5.bin", 0x1000, 0x0400, CRC(5ef51ced) SHA1(390579d0482ceabf87924f7718ef33e336726d92)) ROM_END -GAME(1981, ewf, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Earth Wind Fire", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, firemntn, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Fire Mountain", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, futurwld, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Future World", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, hotwheel, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Hot Wheels", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, hod, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "House of Diamonds", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1981, locomotp, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Locomotion", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, strapids, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Shooting the Rapids", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, sshtlzac, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Space Shuttle (Zaccaria)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, stargod, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Star God", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1980, stargoda, stargod, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Star God (alternate sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, wsports, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Winter Sports", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) +GAME(1981, ewf, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Earth Wind Fire", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, firemntn, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Fire Mountain", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, futurwld, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Future World", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, hotwheel, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Hot Wheels", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, hod, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "House of Diamonds", GAME_IS_SKELETON_MECHANICAL) +GAME(1981, locomotp, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Locomotion", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, strapids, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Shooting the Rapids", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, sshtlzac, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Space Shuttle (Zaccaria)", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, stargod, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Star God", GAME_IS_SKELETON_MECHANICAL) +GAME(1980, stargoda, stargod, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Star God (alternate sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, wsports, 0, zac_1, zac_1, zac_1, ROT0, "Zaccaria", "Winter Sports", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/zac2650.c mame-0.145/src/mame/drivers/zac2650.c --- mame-0.144/src/mame/drivers/zac2650.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/zac2650.c 2012-02-06 21:30:40.000000000 +0000 @@ -242,10 +242,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(55) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(1041)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(30*24, 32*24) MCFG_SCREEN_VISIBLE_AREA(0, 719, 0, 767) - MCFG_SCREEN_UPDATE(tinvader) + MCFG_SCREEN_UPDATE_STATIC(tinvader) MCFG_GFXDECODE(tinvader) MCFG_PALETTE_LENGTH(4) diff -Nru mame-0.144/src/mame/drivers/zac_2.c mame-0.145/src/mame/drivers/zac_2.c --- mame-0.144/src/mame/drivers/zac_2.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zac_2.c 2012-02-06 21:30:35.000000000 +0000 @@ -1,25 +1,39 @@ /* Zaccaria Generation 2 */ + +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/s2650/s2650.h" class zac_2_state : public driver_device { public: - zac_2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + zac_2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); + }; -static ADDRESS_MAP_START( zac_2_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( zac_2_map, AS_PROGRAM, 8, zac_2_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( zac_2 ) INPUT_PORTS_END -static MACHINE_RESET( zac_2 ) +void zac_2_state::machine_reset() { } @@ -31,8 +45,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", S2650, 6000000/2) MCFG_CPU_PROGRAM_MAP(zac_2_map) - - MCFG_MACHINE_RESET( zac_2 ) MACHINE_CONFIG_END /*-------------------------------- @@ -52,6 +64,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("bbz-e.snd", 0xa000, 0x2000, CRC(1fe045d2) SHA1(d17d7dbcafe9f8644cbe393a56ff6b45d9d40155)) ROM_LOAD("bbz-f.snd", 0xc000, 0x4000, CRC(9f58f369) SHA1(32472d93284c0f1fc2875714b40428406dcf6325)) @@ -74,6 +87,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("clown_e.snd", 0xc000, 0x2000, CRC(04a34cc1) SHA1(56fcc07ccab3cac27928f5c5411868bde1769603)) ROM_LOAD("clown_f.snd", 0xe000, 0x2000, CRC(e35a4f72) SHA1(0037c1072f58798ba61af85a1b4b374b85c883ae)) @@ -96,6 +110,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("gb01snd1.1d", 0xe000, 0x2000, CRC(5d48462c) SHA1(755bc259e992a9b375bd1e338775da14c15932bd)) ROM_LOAD("gb01snd2.1e", 0xc000, 0x2000, CRC(1127be59) SHA1(be074fe3efecd0c1e10599c8981bf7c5debb4d37)) @@ -116,6 +131,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("dride_it.1d", 0xe000, 0x2000, CRC(cc33b947) SHA1(1b240ed6b38a78e21c5009342c4abab8bfd9ff7e)) ROM_LOAD("dride_it.1e", 0xc000, 0x2000, CRC(b3764fd7) SHA1(27b5332af1aaedfc36d942f78146baa85617dbbe)) @@ -136,6 +152,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("g_snd_1.bin", 0xe000, 0x2000, CRC(77d042dc) SHA1(78e056468887a315e29c913803e3c36f9c7f694e)) ROM_LOAD("g_snd_2.bin", 0xc000, 0x2000, CRC(31e35fd4) SHA1(2eeefbd831159d975fe9cac99db99dfdca04b0dc)) @@ -159,6 +176,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("rom1.snd", 0xe000, 0x2000, CRC(aca09674) SHA1(8e1edc25c7fe2189215f73da8f1bec4b670bd8e6)) ROM_LOAD("rom2.snd", 0xc000, 0x1000, CRC(76da384d) SHA1(0e4616bf2fb2c21270aecfc04ad9e68ce9390bfb)) @@ -180,6 +198,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("farsnd1.bin", 0xe000, 0x2000, CRC(fd80040d) SHA1(122c99627d944b253e091b56d32336367df615c1)) ROM_LOAD("rom2.snd", 0xc000, 0x1000, CRC(76da384d) SHA1(0e4616bf2fb2c21270aecfc04ad9e68ce9390bfb)) @@ -201,6 +220,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("farf_de.1d", 0xe000, 0x2000, CRC(5f64df81) SHA1(d8bd6d1fb3eec704fe31ccc1feeb5a9529c70d07)) ROM_LOAD("rom2.snd", 0xc000, 0x1000, CRC(76da384d) SHA1(0e4616bf2fb2c21270aecfc04ad9e68ce9390bfb)) @@ -225,7 +245,8 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) - ROM_REGION(0x10000, "cpu2", 0) + +ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("gb01snd1.1d", 0xe000, 0x2000, CRC(cd6a4a07) SHA1(47359747f79feca9d85d8f7657325874eda0f915)) ROM_LOAD("gb01snd2.1e", 0xc000, 0x2000, CRC(d289952d) SHA1(94052cbee4cd499fb55d59b047828c21d71ab288)) ROM_LOAD("gb01snd3.1g", 0xa000, 0x2000, CRC(8b4342eb) SHA1(a8534cb2ebaff4d5d4101eb710c068f3b91e9e0c)) @@ -245,6 +266,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("mgic_it.1d", 0xe000, 0x2000, CRC(16911674) SHA1(8fc5b0ec48c76eac21bcab44cf2fe9635e55ef49)) ROM_LOAD("mgic_it.1e", 0xc000, 0x2000, CRC(646f9673) SHA1(cf78029f63c8264db2d0012143981d36b5410499)) @@ -265,6 +287,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("magic1d.snd", 0xe000, 0x2000, CRC(1f1a1140) SHA1(fed351c78e4c46c05e910f1844351492faa9edcf)) ROM_LOAD("magic1e.snd", 0xc000, 0x2000, CRC(a8787011) SHA1(16da0b40e24346f4e90d553c7c3e68daa4d4a656)) @@ -285,6 +308,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("mgic_fr.1d", 0xe000, 0x2000, CRC(7d3faa3b) SHA1(4f9ab1a868f7b9900bbbde02c2e654e7f778ed9d)) ROM_LOAD("mgic_fr.1e", 0xc000, 0x2000, CRC(0077241c) SHA1(113d9039ad14f3887533f5e655a7912ddd441e77)) @@ -308,6 +332,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("mex86_e.snd", 0xa000, 0x2000, CRC(a985e8db) SHA1(11f91179fa1d46c1c83cdd4fbcf8ebdfd2a41f3f)) ROM_LOAD("mex86_f.snd", 0xc000, 0x4000, CRC(301c2b63) SHA1(df4a4cb48d28d53c3728066d3e3fa9eac17c78c5)) @@ -330,12 +355,15 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("snd_ic24.bin", 0x0000, 0x8000, CRC(158d6f83) SHA1(281e1b13be43025be1b33dcd366cec0b36f29e5c)) ROM_LOAD("snd_ic25.bin", 0x8000, 0x8000, CRC(b1c9238e) SHA1(88c9df1fca94d32a0fa5d75312dabff257e867dd)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("snd_ic05.bin", 0x0000, 0x8000, CRC(74cc4902) SHA1(e2f46bcf5446f98d098c49f8c2416292401265b9)) ROM_LOAD("snd_ic06.bin", 0x8000, 0x8000, CRC(a0400411) SHA1(da9de6105639c4f6174f5bc92f44e02c339a2bc3)) + ROM_REGION(0x10000, "cpu4", 0) ROM_LOAD("snd_ic40.bin", 0x0000, 0x8000, CRC(974ceb9c) SHA1(3665af9170a2afbe26f68e8f3cedb0d177f476c4)) ROM_END @@ -357,6 +385,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_gb.1c", 0xf000, 0x1000, CRC(f739fcba) SHA1(7460f1da99c474601e8cec64683cbd61837a82e8)) ROM_LOAD("pchmp_gb.1e", 0xe000, 0x1000, CRC(24d83e74) SHA1(f78e151c9885b965cd5209777580414522362ebf)) @@ -378,6 +407,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_de.1c", 0xf000, 0x1000, CRC(6e2defe5) SHA1(fcb62da1aed23d9fb9a222862b4b772aad9792a1)) ROM_LOAD("pchmp_de.1e", 0xe000, 0x1000, CRC(703b3cae) SHA1(c7bd021e936fb0fd4bc16d48c3ef1df69d1fe01a)) @@ -399,6 +429,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_it.1c", 0xf000, 0x1000, CRC(a0033b90) SHA1(bca8fe29fdfcbc22fd0e8bafbd7946db5c2c4041)) ROM_LOAD("pchmp_gb.1e", 0xe000, 0x1000, CRC(24d83e74) SHA1(f78e151c9885b965cd5209777580414522362ebf)) @@ -420,6 +451,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_gb.1c", 0xf000, 0x1000, CRC(f739fcba) SHA1(7460f1da99c474601e8cec64683cbd61837a82e8)) ROM_LOAD("pchmp_gb.1e", 0xe000, 0x1000, CRC(24d83e74) SHA1(f78e151c9885b965cd5209777580414522362ebf)) @@ -441,6 +473,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_de.1c", 0xf000, 0x1000, CRC(6e2defe5) SHA1(fcb62da1aed23d9fb9a222862b4b772aad9792a1)) ROM_LOAD("pchmp_de.1e", 0xe000, 0x1000, CRC(703b3cae) SHA1(c7bd021e936fb0fd4bc16d48c3ef1df69d1fe01a)) @@ -462,6 +495,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("pchmp_it.1c", 0xf000, 0x1000, CRC(a0033b90) SHA1(bca8fe29fdfcbc22fd0e8bafbd7946db5c2c4041)) ROM_LOAD("pchmp_gb.1e", 0xe000, 0x1000, CRC(24d83e74) SHA1(f78e151c9885b965cd5209777580414522362ebf)) @@ -488,6 +522,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("poolcham.1f", 0xc000, 0x4000, CRC(efe33926) SHA1(30444a2ee7f453f46c74fff8365d80fc4f0a277f)) ROM_END @@ -506,6 +541,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("poolc_it.1f", 0xc000, 0x2000, CRC(1dc8308c) SHA1(a69f1e5fe9db5ff9fbcd08504e79ab39009efb85)) ROM_LOAD("poolc_it.1e", 0xe000, 0x2000, CRC(28a3e5ee) SHA1(c090c81c78d3296e91ce12e1170ee2c71ba07177)) @@ -525,6 +561,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sound1.f", 0xc000, 0x4000, CRC(b4b4e31e) SHA1(bcd1c4c7f6f079655a9c37d0b978d997f95b93ad)) ROM_END @@ -546,6 +583,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("robot_d.snd", 0xe000, 0x2000, CRC(ab5e5524) SHA1(9aae2560bccf64daeab0514c8934c55f77fe240d)) ROM_LOAD("robot_e.snd", 0xc000, 0x2000, CRC(2f314e33) SHA1(1f92aff3d99c2e86820720a3290285b9f36cb15b)) @@ -566,6 +604,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("robot_it.1d", 0xe000, 0x2000, CRC(a4a20ed7) SHA1(459519e10bad59ba27cd5d5d31c5f276726c9bd0)) ROM_LOAD("robot_it.1e", 0xc000, 0x2000, CRC(2f314e33) SHA1(1f92aff3d99c2e86820720a3290285b9f36cb15b)) @@ -586,6 +625,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("robot_dg.snd", 0xe000, 0x2000, CRC(88685b1e) SHA1(7d49a1d42f3e07948390a00a562aeba9dd4ddeeb)) ROM_LOAD("robot_eg.snd", 0xc000, 0x2000, CRC(e326a851) SHA1(c2bb5e329803922fa1c1ca30be6e3ae3d292135a)) @@ -606,6 +646,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("robot_fr.1d", 0xe000, 0x2000, CRC(94957954) SHA1(22f729a1ca48399aa222f5037071d0482b9d59aa)) ROM_LOAD("robot_fr.1e", 0xc000, 0x2000, CRC(fdcfff02) SHA1(1ef02ad646dfea1b9727a0a99e93db724cd38cce)) @@ -629,8 +670,10 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("scram_1.snd", 0xe000, 0x2000, CRC(ee5f868b) SHA1(23ef4112b94109ad4d4a6b9bb5215acec20e5e55)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("scram_2.snd", 0xe000, 0x2000, CRC(a04bf7d0) SHA1(5be5d445b199e7dc9d42e7ee5e9b31c18dec3881)) ROM_REGION(0x20000, "cpu4", 0) @@ -656,6 +699,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sound1.c", 0xf000, 0x1000, CRC(3aa95018) SHA1(5347c3aefb642fc5cabd9d5e61fe6515a2dcb2aa)) ROM_LOAD("sound2.e", 0xe000, 0x1000, CRC(f9b57fd6) SHA1(50e42ed349680211eedf55ae639dbae899f3c6da)) @@ -677,6 +721,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sking_it.1c", 0xf000, 0x1000, CRC(2965643f) SHA1(06de48e7afe1004ad27b805ab4b5111ef5db4380)) ROM_LOAD("sking_it.1e", 0xe000, 0x1000, CRC(f70ae48f) SHA1(c7aec7b54ae298d833f79f041dd9b08ec3e0ccb4)) @@ -698,6 +743,7 @@ ROM_CONTINUE(0x3000, 0x0800) ROM_RELOAD (0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sk-de1.c", 0xf000, 0x1000, CRC(702e3e67) SHA1(ad4c02ef480d3923eebaedb12851018146740558)) ROM_LOAD("sk-de2.e", 0xe000, 0x1000, CRC(b60eddb5) SHA1(7e335315d0b91fc67888cda644dabafdef1afa19)) @@ -723,9 +769,11 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("spook_e.snd", 0xa000, 0x2000, CRC(3d632c93) SHA1(3cc127956a6df1a4fd551826068810724b32ad0e)) ROM_LOAD("spook_f.snd", 0xc000, 0x4000, CRC(cc04a448) SHA1(e837a7d7640aa1d2c2880616bd377b64dc8fac9d)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("spook_4.snd", 0x0000, 0x8000, CRC(3ab517a4) SHA1(4a9dd9d571f958c270b437a1665e6d3dd3eef598)) ROM_LOAD("spook_6.snd", 0x8000, 0x8000, CRC(d4320bc7) SHA1(30b959f5df44d097baffc2de70b12fc767f5663b)) @@ -745,9 +793,11 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("spook_it.1e", 0xa000, 0x2000, CRC(cdbe248e) SHA1(2337836e01622b3fc3f31272faaebf30a608a138)) ROM_LOAD("spook_f.snd", 0xc000, 0x4000, CRC(cc04a448) SHA1(e837a7d7640aa1d2c2880616bd377b64dc8fac9d)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("spook_4.snd", 0x0000, 0x8000, CRC(3ab517a4) SHA1(4a9dd9d571f958c270b437a1665e6d3dd3eef598)) ROM_LOAD("spook_6.snd", 0x8000, 0x8000, CRC(d4320bc7) SHA1(30b959f5df44d097baffc2de70b12fc767f5663b)) @@ -770,12 +820,15 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("snd_ic24.bin", 0x0000, 0x8000, CRC(158d6f83) SHA1(281e1b13be43025be1b33dcd366cec0b36f29e5c)) ROM_LOAD("snd_ic25.bin", 0x8000, 0x8000, CRC(b1c9238e) SHA1(88c9df1fca94d32a0fa5d75312dabff257e867dd)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("snd_ic05.bin", 0x0000, 0x8000, CRC(74cc4902) SHA1(e2f46bcf5446f98d098c49f8c2416292401265b9)) ROM_LOAD("snd_ic06.bin", 0x8000, 0x8000, CRC(a0400411) SHA1(da9de6105639c4f6174f5bc92f44e02c339a2bc3)) + ROM_REGION(0x10000, "cpu4", 0) ROM_LOAD("snd_ic40.bin", 0x0000, 0x8000, CRC(974ceb9c) SHA1(3665af9170a2afbe26f68e8f3cedb0d177f476c4)) ROM_END @@ -797,6 +850,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("sound1.d", 0xe000, 0x2000, CRC(efc1d724) SHA1(f553767c053e4854fe7839f8c8f4a7f5aefe2692)) ROM_LOAD("sound2.e", 0xc000, 0x1000, CRC(41881a1d) SHA1(42f8dd13c38e11c0dd3cf59c64751baaacb00ac1)) @@ -818,6 +872,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("tmach_de.1d", 0xe000, 0x2000, CRC(8e8c27a4) SHA1(2e418e509bc241c193564e926583b09582944233)) ROM_LOAD("sound2.e", 0xc000, 0x1000, CRC(41881a1d) SHA1(42f8dd13c38e11c0dd3cf59c64751baaacb00ac1)) @@ -839,6 +894,7 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("tmach_fr.1d", 0xe000, 0x2000, CRC(831203a4) SHA1(fc60086c2b9b83a47f30b028e7512090658c5700)) ROM_LOAD("sound2.e", 0xc000, 0x1000, CRC(41881a1d) SHA1(42f8dd13c38e11c0dd3cf59c64751baaacb00ac1)) @@ -864,51 +920,52 @@ ROM_CONTINUE(0x6800, 0x0800) ROM_CONTINUE(0x5000, 0x0800) ROM_CONTINUE(0x7000, 0x0800) + ROM_REGION(0x10000, "cpu2", 0) ROM_LOAD("1en.64", 0xa000, 0x2000, CRC(abc930cc) SHA1(6c658aae3f26db21df7b74a616cf37307dba63e3)) ROM_LOAD("zan_1f.128", 0xc000, 0x4000, CRC(74fcadc9) SHA1(efd6fc99d7a3ed8e59fbbafbee161af6fb527028)) + ROM_REGION(0x10000, "cpu3", 0) ROM_LOAD("zan_ic4.128", 0x0000, 0x4000, CRC(f34a2aaa) SHA1(5e415874f68586aa30dba9fff0dc8990c636cecd)) ROM_LOAD("zan_ic5.128", 0x4000, 0x4000, CRC(bf61aab0) SHA1(939266696d0562f255f0fa5068280fe6a4cf8267)) ROM_LOAD("zan_ic6.128", 0x8000, 0x4000, CRC(13a5b8d4) SHA1(d8c976b3f5e9c7cded0922feefa1531c59432515)) ROM_END -GAME(1986, bbeltzac, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Black Belt (Zaccaria)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, clown, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Clown", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, dvlrider, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, dvlrideri, dvlrider, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, dvlriderg, dvlrider, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, farfalla, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, farfallai, farfalla, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, farfallag, farfalla, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, mcastle, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, mcastlei, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, mcastleg, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1984, mcastlef, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (French speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, mexico, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Mexico 86 (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, nstrphnx, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "New Star's Phoenix (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchamp, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchampg, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchampi, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchamp7, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchamp7g, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, pinchamp7i, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, poolcham, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, poolchami, poolcham, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, poolchama, poolcham, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion (alternate sound)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, robot, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, roboti, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, robotg, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1985, robotf, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (French speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, scram_tp, 0, zac_2, zac_2, zac_2, ROT0, "Tecnoplay", "Scramble (Pinball)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, socrking, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, socrkingi, socrking, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1982, socrkingg, socrking, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings (German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, spookyp, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Spooky", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, spookyi, spookyp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Spooky (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1987, strsphnx, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Star's Phoenix (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, tmachzac, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, tmachzacg, tmachzac, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria German speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1983, tmachzacf, tmachzac, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria French speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1986, zankor, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Zankor (Italian speech)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1986, bbeltzac, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Black Belt (Zaccaria)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, clown, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Clown", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, dvlrider, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, dvlrideri, dvlrider, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, dvlriderg, dvlrider, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Devil Riders (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, farfalla, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, farfallai, farfalla, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, farfallag, farfalla, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Farfalla (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, mcastle, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, mcastlei, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, mcastleg, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984, mcastlef, mcastle, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Magic Castle (French speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, mexico, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Mexico 86 (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, nstrphnx, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "New Star's Phoenix (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchamp, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchampg, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchampi, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchamp7, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchamp7g, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, pinchamp7i, pinchamp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pinball Champ (7 digits Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, poolcham, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, poolchami, poolcham, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, poolchama, poolcham, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Pool Champion (alternate sound)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, robot, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, roboti, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, robotg, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1985, robotf, robot, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Robot (French speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, scram_tp, 0, zac_2, zac_2, zac_2, ROT0, "Tecnoplay", "Scramble (Pinball)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, socrking, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, socrkingi, socrking, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1982, socrkingg, socrking, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Soccer Kings (German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, spookyp, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Spooky", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, spookyi, spookyp, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Spooky (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1987, strsphnx, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Star's Phoenix (Italian speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, tmachzac, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, tmachzacg, tmachzac, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria German speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1983, tmachzacf, tmachzac, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Time Machine (Zaccaria French speech)", GAME_IS_SKELETON_MECHANICAL) +GAME(1986, zankor, 0, zac_2, zac_2, zac_2, ROT0, "Zaccaria", "Zankor (Italian speech)", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/zaccaria.c mame-0.145/src/mame/drivers/zaccaria.c --- mame-0.144/src/mame/drivers/zaccaria.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/zaccaria.c 2012-02-06 21:30:35.000000000 +0000 @@ -251,12 +251,12 @@ coin_counter_w(space->machine(), 0,data & 1); } -static WRITE8_HANDLER( nmienable_w ) +static WRITE8_HANDLER( nmi_mask_w ) { - interrupt_enable_w(space,0,data & 1); -} - + zaccaria_state *state = space->machine().driver_data(); + state->m_nmi_mask = data & 1; +} static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_ROM @@ -270,7 +270,7 @@ AM_RANGE(0x6c01, 0x6c01) AM_WRITE(zaccaria_flip_screen_y_w) AM_RANGE(0x6c02, 0x6c02) AM_WRITENOP /* sound reset */ AM_RANGE(0x6c06, 0x6c06) AM_WRITE(coin_w) - AM_RANGE(0x6c07, 0x6c07) AM_WRITE(nmienable_w) + AM_RANGE(0x6c07, 0x6c07) AM_WRITE(nmi_mask_w) AM_RANGE(0x6c00, 0x6c07) AM_READ(zaccaria_prot2_r) AM_RANGE(0x6e00, 0x6e00) AM_READWRITE(zaccaria_dsw_r, sound_command_w) AM_RANGE(0x7000, 0x77ff) AM_RAM @@ -577,6 +577,13 @@ DEVCB_DEVICE_LINE_MEMBER("pia1", pia6821_device, ca2_w) /* READYQ handler */ }; +static INTERRUPT_GEN( vblank_irq ) +{ + zaccaria_state *state = device->machine().driver_data(); + + if(state->m_nmi_mask) + device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); +} static MACHINE_CONFIG_START( zaccaria, zaccaria_state ) @@ -584,7 +591,7 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80,XTAL_18_432MHz/6) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT("screen", nmi_line_pulse) + MCFG_CPU_VBLANK_INT("screen", vblank_irq) MCFG_QUANTUM_TIME(attotime::from_hz(1000000)) MCFG_CPU_ADD("audiocpu", M6802,XTAL_3_579545MHz) /* verified on pcb */ @@ -604,10 +611,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60.57) /* verified on pcb */ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(zaccaria) + MCFG_SCREEN_UPDATE_STATIC(zaccaria) MCFG_GFXDECODE(zaccaria) MCFG_PALETTE_LENGTH(32*8+32*8) diff -Nru mame-0.144/src/mame/drivers/zac_proto.c mame-0.145/src/mame/drivers/zac_proto.c --- mame-0.144/src/mame/drivers/zac_proto.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zac_proto.c 2012-02-06 21:30:39.000000000 +0000 @@ -1,6 +1,8 @@ /* Zaccaria Prototype */ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/scmp/scmp.h" @@ -8,18 +10,28 @@ { public: zac_proto_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + +protected: + + // devices + required_device m_maincpu; + + // driver_device overrides + virtual void machine_reset(); }; -static ADDRESS_MAP_START( zac_proto_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( zac_proto_map, AS_PROGRAM, 8, zac_proto_state ) AM_RANGE(0x0000, 0xffff) AM_NOP ADDRESS_MAP_END static INPUT_PORTS_START( zac_proto ) INPUT_PORTS_END -static MACHINE_RESET( zac_proto ) +void zac_proto_state::machine_reset() { } @@ -31,8 +43,6 @@ /* basic machine hardware */ MCFG_CPU_ADD("maincpu", SCMP, 1000000) MCFG_CPU_PROGRAM_MAP(zac_proto_map) - - MCFG_MACHINE_RESET( zac_proto ) MACHINE_CONFIG_END /*-------------------------------- @@ -68,7 +78,6 @@ ROM_LOAD("zsc4.dat", 0x1400, 0x0400, CRC(69e0bb95) SHA1(d9a1d0159bf49445b0ece0f9d7806ed80657c2b2)) ROM_END -GAME(1978, skijump, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Ski Jump", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1979, spacecty, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Space City", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) -GAME(1978, strike, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Strike", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_MECHANICAL) - +GAME(1978, skijump, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Ski Jump", GAME_IS_SKELETON_MECHANICAL) +GAME(1979, spacecty, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Space City", GAME_IS_SKELETON_MECHANICAL) +GAME(1978, strike, 0, zac_proto, zac_proto, zac_proto, ROT0, "Zaccaria", "Strike", GAME_IS_SKELETON_MECHANICAL) diff -Nru mame-0.144/src/mame/drivers/zaxxon.c mame-0.145/src/mame/drivers/zaxxon.c --- mame-0.144/src/mame/drivers/zaxxon.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zaxxon.c 2012-02-06 21:30:37.000000000 +0000 @@ -943,9 +943,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(zaxxon) + MCFG_SCREEN_UPDATE_STATIC(zaxxon) MCFG_PALETTE_INIT(zaxxon) MCFG_VIDEO_START(zaxxon) @@ -964,7 +963,7 @@ /* video hardware */ MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(futspy) + MCFG_SCREEN_UPDATE_STATIC(futspy) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -977,7 +976,7 @@ /* video hardware */ MCFG_VIDEO_START(razmataz) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(razmataz) + MCFG_SCREEN_UPDATE_STATIC(razmataz) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -1000,7 +999,7 @@ MCFG_PALETTE_LENGTH(512) MCFG_VIDEO_START(congo) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(congo) + MCFG_SCREEN_UPDATE_STATIC(congo) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/zerozone.c mame-0.145/src/mame/drivers/zerozone.c --- mame-0.144/src/mame/drivers/zerozone.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/zerozone.c 2012-02-06 21:30:39.000000000 +0000 @@ -27,58 +27,44 @@ *********************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "includes/zerozone.h" #include "cpu/z80/z80.h" #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" -static READ16_HANDLER( zerozone_input_r ) -{ - switch (offset) - { - case 0x00: - return input_port_read(space->machine(), "SYSTEM"); - case 0x01: - return input_port_read(space->machine(), "INPUTS"); - case 0x04: - return input_port_read(space->machine(), "DSWB"); - case 0x05: - return input_port_read(space->machine(), "DSWA"); - } - - logerror("CPU #0 PC %06x: warning - read unmapped memory address %06x\n", cpu_get_pc(&space->device()), 0x800000 + offset); - return 0x00; -} - -static WRITE16_HANDLER( zerozone_sound_w ) +WRITE16_MEMBER( zerozone_state::sound_w ) { - zerozone_state *state = space->machine().driver_data(); - if (ACCESSING_BITS_8_15) { soundlatch_w(space, offset, data >> 8); - device_set_input_line_and_vector(state->m_audiocpu, 0, HOLD_LINE, 0xff); + device_set_input_line_and_vector(m_audiocpu, 0, HOLD_LINE, 0xff); } } -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16 ) + +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, zerozone_state ) AM_RANGE(0x000000, 0x01ffff) AM_ROM - AM_RANGE(0x080000, 0x08000f) AM_READ(zerozone_input_r) - AM_RANGE(0x084000, 0x084001) AM_WRITE(zerozone_sound_w) - AM_RANGE(0x088000, 0x0881ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_BASE_GENERIC(paletteram) + AM_RANGE(0x080000, 0x080001) AM_READ_PORT("SYSTEM") + AM_RANGE(0x080002, 0x080003) AM_READ_PORT("INPUTS") + AM_RANGE(0x080008, 0x080009) AM_READ_PORT("DSWB") + AM_RANGE(0x08000a, 0x08000b) AM_READ_PORT("DSWA") + AM_RANGE(0x084000, 0x084001) AM_WRITE(sound_w) + AM_RANGE(0x088000, 0x0881ff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBRGBx_word_w) AM_SHARE("paletteram") AM_RANGE(0x098000, 0x098001) AM_RAM /* Watchdog? */ - AM_RANGE(0x09ce00, 0x09ffff) AM_RAM_WRITE(zerozone_tilemap_w) AM_BASE_SIZE_MEMBER(zerozone_state, m_videoram, m_videoram_size) - AM_RANGE(0x0b4000, 0x0b4001) AM_WRITE(zerozone_tilebank_w) + AM_RANGE(0x09ce00, 0x09ffff) AM_RAM_WRITE(tilemap_w) AM_SHARE("videoram") + AM_RANGE(0x0b4000, 0x0b4001) AM_WRITE(tilebank_w) AM_RANGE(0x0c0000, 0x0cffff) AM_RAM AM_RANGE(0x0f8000, 0x0f87ff) AM_RAM /* Never read from */ ADDRESS_MAP_END -static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, zerozone_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM - AM_RANGE(0x9800, 0x9800) AM_DEVREADWRITE_MODERN("oki", okim6295_device, read, write) + AM_RANGE(0x9800, 0x9800) AM_DEVREADWRITE("oki", okim6295_device, read, write) AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_r) ADDRESS_MAP_END @@ -169,19 +155,14 @@ GFXDECODE_END -static MACHINE_START( zerozone ) +void zerozone_state::machine_start() { - zerozone_state *state = machine.driver_data(); - - state->m_audiocpu = machine.device("audiocpu"); - - state->save_item(NAME(state->m_tilebank)); + save_item(NAME(m_tilebank)); } -static MACHINE_RESET( zerozone ) +void zerozone_state::machine_reset() { - zerozone_state *state = machine.driver_data(); - state->m_tilebank = 0; + m_tilebank = 0; } static MACHINE_CONFIG_START( zerozone, zerozone_state ) @@ -196,23 +177,17 @@ MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_MACHINE_START(zerozone) - MCFG_MACHINE_RESET(zerozone) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(zerozone_state, screen_update) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(1*8, 47*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(zerozone) MCFG_GFXDECODE(zerozone) MCFG_PALETTE_LENGTH(256) - MCFG_VIDEO_START(zerozone) - /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/drivers/zn.c mame-0.145/src/mame/drivers/zn.c --- mame-0.144/src/mame/drivers/zn.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zn.c 2012-02-06 21:30:33.000000000 +0000 @@ -144,6 +144,7 @@ { "primrag2", tw01, tw02 }, /* locks up when starting a game */ { "hvnsgate", at01, at02 }, /* OK */ { "ts2", cp01, cp02 }, /* OK */ + { "ts2a", cp01, cp02 }, /* OK */ { "ts2j", cp01, cp02 }, /* OK */ { "starglad", cp01, cp03 }, /* OK */ { "stargladj",cp01, cp03 }, /* OK */ @@ -156,6 +157,7 @@ { "sfexpj", cp01, cp04 }, /* OK */ { "glpracr", cp01, cp05 }, /* OK */ { "rvschool", cp10, cp06 }, /* OK */ + { "rvschoolu",cp10, cp06 }, /* OK */ { "rvschoola",cp10, cp06 }, /* OK */ { "jgakuen", cp10, cp06 }, /* OK */ { "plsmaswd", cp10, cp07 }, /* OK */ @@ -2799,275 +2801,305 @@ ROM_REGION( 0x50000, "audiocpu", ROMREGION_ERASE00 ) ROM_END -ROM_START( glpracr ) +/* 95681-2 */ +ROM_START( ts2 ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "graj-04.2j", 0x0000000, 0x080000, CRC(53bf551c) SHA1(320632b5010630cee4c5ccb1578d5ee6d2754632) ) + ROM_LOAD( "ts2u_04.2h", 0x0000000, 0x080000, CRC(ddb52e7c) SHA1(e77891abae7681d911ef6eba2e0920d81433ebe6) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "gra-05m.3j", 0x0000000, 0x400000, CRC(78053700) SHA1(38727c8cc34bb57b7b7e73041e382fb0361f184e) ) - ROM_LOAD( "gra-06m.4j", 0x0400000, 0x400000, CRC(d73b392b) SHA1(241ddf474cea035e81a2abc580d3c0395ee925bb) ) - ROM_LOAD( "gra-07m.5j", 0x0800000, 0x400000, CRC(acaefe3a) SHA1(32d596b0f975e1558fa7929c3166d8dad40a1c80) ) + ROM_LOAD( "ts2-05m.3h", 0x0000000, 0x400000, CRC(7f4228e2) SHA1(3690a76d19d97e55bc7b05a8456328697cfd7a77) ) + ROM_LOAD( "ts2-06m", 0x0400000, 0x400000, CRC(cd7e0a27) SHA1(325b5f2e653cdea07cddc9d20d12b5ab50dca949) ) + ROM_LOAD( "ts2-08m", 0x0800000, 0x400000, CRC(b1f7f115) SHA1(3f416d2aac07aa73a99593b5a21b047da60cea6a) ) + ROM_LOAD( "ts2-10m.4k", 0x0c00000, 0x200000, CRC(ad90679a) SHA1(19dd30764f892ee7f89c78ccbccdaf4d6b0e6e09) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_FILL( 0, 0x50000, 0x76 ) -/* there are no QSound program roms - ROM_LOAD( "gra-02", 0x00000, 0x08000, NO_DUMP ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "gra-03", 0x28000, 0x20000, NO_DUMP ) -*/ - ROM_REGION( 0x400000, "qsound", ROMREGION_ERASE00 ) /* Q Sound Samples */ -/* or QSound sample roms either - ROM_LOAD( "gra-01m", 0x0000000, 0x400000, NO_DUMP ) -*/ + ROM_LOAD( "ts2_02.2e", 0x00000, 0x08000, CRC(2f45c461) SHA1(513b6b9b5a2f7c567c30c958e0e13834cd9bd266) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + + ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ + ROM_LOAD16_WORD_SWAP( "ts2-01m.3b", 0x0000000, 0x400000, CRC(d7a505e0) SHA1(f1b0cdea712101f695bd326eccd753eb79a07490) ) ROM_END -ROM_START( sfex ) +/* 95681-2 */ +ROM_START( ts2a ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfee-04a.2h", 0x0000000, 0x080000, CRC(092cfa2e) SHA1(8af38a3f4f89f661233995a672faf486e71b79bc) ) + ROM_LOAD( "ts2u_04.2h", 0x0000000, 0x080000, CRC(ddb52e7c) SHA1(e77891abae7681d911ef6eba2e0920d81433ebe6) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfe-05m", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) - ROM_LOAD( "sfe-06m", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) - ROM_LOAD( "sfe-07m", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) - ROM_LOAD( "sfe-08m", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) - ROM_LOAD( "sfe-09m", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) - ROM_LOAD( "sfe-10m", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) + ROM_LOAD( "ts2-05m.3h", 0x0000000, 0x400000, CRC(7f4228e2) SHA1(3690a76d19d97e55bc7b05a8456328697cfd7a77) ) + ROM_LOAD( "ts2-06m.4h", 0x0400000, 0x200000, CRC(67be6797) SHA1(521f69439ba7666f54d1008a291f3391f3a16499) ) + ROM_LOAD( "ts2-07m.5h", 0x0600000, 0x200000, CRC(db73e2b8) SHA1(239243f44c41df765789c14cc4036bb02e2ab373) ) + ROM_LOAD( "ts2-08m.2k", 0x0800000, 0x200000, CRC(01a48431) SHA1(6e395af726da91909e07dac25bb9b70b3ccebd4e) ) + ROM_LOAD( "ts2-09m.3k", 0x0a00000, 0x200000, CRC(83f408de) SHA1(415787c4dca604dd5611e16936a0ffa981dedf78) ) + ROM_LOAD( "ts2-10m.4k", 0x0c00000, 0x200000, CRC(ad90679a) SHA1(19dd30764f892ee7f89c78ccbccdaf4d6b0e6e09) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "ts2_02.2e", 0x00000, 0x08000, CRC(2f45c461) SHA1(513b6b9b5a2f7c567c30c958e0e13834cd9bd266) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "ts2-01m.3b", 0x0000000, 0x400000, CRC(d7a505e0) SHA1(f1b0cdea712101f695bd326eccd753eb79a07490) ) ROM_END -ROM_START( sfexa ) +/* 95681-2 */ +ROM_START( ts2j ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfea-04", 0x0000000, 0x080000, CRC(08247bd4) SHA1(07f356ef2827b3fbd0bfaf2010915315d9d60ef1) ) + ROM_LOAD( "ts2j_04.2h", 0x0000000, 0x080000, CRC(4aba8c5e) SHA1(a56001bf50bfc1b03036e88ae1febd1aac8c63c0) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfe-05m", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) - ROM_LOAD( "sfe-06m", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) - ROM_LOAD( "sfe-07m", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) - ROM_LOAD( "sfe-08m", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) - ROM_LOAD( "sfe-09m", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) - ROM_LOAD( "sfe-10m", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) + ROM_LOAD( "ts2-05m.3h", 0x0000000, 0x400000, CRC(7f4228e2) SHA1(3690a76d19d97e55bc7b05a8456328697cfd7a77) ) + ROM_LOAD( "ts2-06m", 0x0400000, 0x400000, CRC(cd7e0a27) SHA1(325b5f2e653cdea07cddc9d20d12b5ab50dca949) ) + ROM_LOAD( "ts2-08m", 0x0800000, 0x400000, CRC(b1f7f115) SHA1(3f416d2aac07aa73a99593b5a21b047da60cea6a) ) + ROM_LOAD( "ts2-10m.4k", 0x0c00000, 0x200000, CRC(ad90679a) SHA1(19dd30764f892ee7f89c78ccbccdaf4d6b0e6e09) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "ts2_02.2e", 0x00000, 0x08000, CRC(2f45c461) SHA1(513b6b9b5a2f7c567c30c958e0e13834cd9bd266) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "ts2-01m.3b", 0x0000000, 0x400000, CRC(d7a505e0) SHA1(f1b0cdea712101f695bd326eccd753eb79a07490) ) ROM_END -ROM_START( sfexj ) +/* 95681-2 */ +ROM_START( starglad ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfej-04", 0x0000000, 0x080000, CRC(ea100607) SHA1(27ef8c619804999d32d14fcc5ec783c057b4dc73) ) + ROM_LOAD( "ps1u_04.2h", 0x0000000, 0x080000, CRC(121fb234) SHA1(697d18d37afd95f302b40a5a6a78d8c92a41ea73) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfe-05m", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) - ROM_LOAD( "sfe-06m", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) - ROM_LOAD( "sfe-07m", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) - ROM_LOAD( "sfe-08m", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) - ROM_LOAD( "sfe-09m", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) - ROM_LOAD( "sfe-10m", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) + ROM_LOAD( "ps1-05m.3h", 0x0000000, 0x400000, CRC(8ad72c4f) SHA1(c848c37eb5365000b4d4720b5c08d89ddd8e2c33) ) + ROM_LOAD( "ps1-06m.4h", 0x0400000, 0x400000, CRC(95d8ed61) SHA1(e9f259d589dc38a8321a6fea1f5dac741cadc0ff) ) + ROM_LOAD( "ps1-07m.5h", 0x0800000, 0x400000, CRC(c06752db) SHA1(0884b308e9cd9dde8660b422bc8fec9a362bcb52) ) + ROM_LOAD( "ps1-08m.2k", 0x0c00000, 0x400000, CRC(381f9ded) SHA1(b7878a90740f5b3c5881ac7d46e2b84b18727337) ) + ROM_LOAD( "ps1-09m.3k", 0x1000000, 0x400000, CRC(bd894812) SHA1(9f0c3365e685a53ae793f4a256a6c177a843a424) ) + ROM_LOAD( "ps1-10m.4k", 0x1400000, 0x400000, CRC(ff80c18a) SHA1(8d01717eed6ec1f508fe7c445da941fb84ef7d22) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "ps1_02a.2e", 0x00000, 0x08000, CRC(b854df92) SHA1(ea71a613b5b19ec7e9c6e342e7743d320582a6bb) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "ps1_03a.3e", 0x28000, 0x20000, CRC(a2562fbb) SHA1(3de02a4aa7ea620961ca2a5c331f38134033db79) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "ps1-01m.3b", 0x0000000, 0x400000, CRC(0bfb17aa) SHA1(cf4482785a2a33ad814c8b1461c5bc8e8e027895) ) ROM_END -ROM_START( sfexu ) +/* 95681-2 */ +ROM_START( stargladj ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfeu-04b", 0x0000000, 0x080000, CRC(de02bd29) SHA1(62a88a30f73db661f5b98fc7e2d34d51acb965cc) ) + ROM_LOAD( "ps1j_04.2h", 0x0000000, 0x080000, CRC(f865006d) SHA1(6abb476777a4309b1a60f12e6313c051db195808) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfe-05m", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) - ROM_LOAD( "sfe-06m", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) - ROM_LOAD( "sfe-07m", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) - ROM_LOAD( "sfe-08m", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) - ROM_LOAD( "sfe-09m", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) - ROM_LOAD( "sfe-10m", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) + ROM_LOAD( "ps1-05m.3h", 0x0000000, 0x400000, CRC(8ad72c4f) SHA1(c848c37eb5365000b4d4720b5c08d89ddd8e2c33) ) + ROM_LOAD( "ps1-06m.4h", 0x0400000, 0x400000, CRC(95d8ed61) SHA1(e9f259d589dc38a8321a6fea1f5dac741cadc0ff) ) + ROM_LOAD( "ps1-07m.5h", 0x0800000, 0x400000, CRC(c06752db) SHA1(0884b308e9cd9dde8660b422bc8fec9a362bcb52) ) + ROM_LOAD( "ps1-08m.2k", 0x0c00000, 0x400000, CRC(381f9ded) SHA1(b7878a90740f5b3c5881ac7d46e2b84b18727337) ) + ROM_LOAD( "ps1-09m.3k", 0x1000000, 0x400000, CRC(bd894812) SHA1(9f0c3365e685a53ae793f4a256a6c177a843a424) ) + ROM_LOAD( "ps1-10m.4k", 0x1400000, 0x400000, CRC(ff80c18a) SHA1(8d01717eed6ec1f508fe7c445da941fb84ef7d22) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "ps1_02a.2e", 0x00000, 0x08000, CRC(b854df92) SHA1(ea71a613b5b19ec7e9c6e342e7743d320582a6bb) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "ps1_03a.3e", 0x28000, 0x20000, CRC(a2562fbb) SHA1(3de02a4aa7ea620961ca2a5c331f38134033db79) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "ps1-01m.3b", 0x0000000, 0x400000, CRC(0bfb17aa) SHA1(cf4482785a2a33ad814c8b1461c5bc8e8e027895) ) ROM_END -ROM_START( sfexp ) +/* 95681-2 */ +ROM_START( glpracr ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfexp_u-04a", 0x0000000, 0x080000, CRC(4617adc2) SHA1(200307904349ad7e5d7d76d8c904b6b10424c7ef) ) + ROM_LOAD( "gpaj_04.2h", 0x0000000, 0x080000, CRC(53bf551c) SHA1(320632b5010630cee4c5ccb1578d5ee6d2754632) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfp-05", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) - ROM_LOAD( "sfp-06", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) - ROM_LOAD( "sfp-07", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) - ROM_LOAD( "sfp-08", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) - ROM_LOAD( "sfp-09", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) - ROM_LOAD( "sfp-10", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) + ROM_LOAD( "gra-05m.3h", 0x0000000, 0x400000, CRC(78053700) SHA1(38727c8cc34bb57b7b7e73041e382fb0361f184e) ) + ROM_LOAD( "gra-06m.4h", 0x0400000, 0x400000, CRC(d73b392b) SHA1(241ddf474cea035e81a2abc580d3c0395ee925bb) ) + ROM_LOAD( "gra-07m.5h", 0x0800000, 0x400000, CRC(acaefe3a) SHA1(32d596b0f975e1558fa7929c3166d8dad40a1c80) ) + /* Sockets 2.2E, 3.3E are not populated, pcb verified */ ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_FILL( 0, 0x50000, 0x76 ) + + /* Socket 1.3B is not populated, pcb verified */ + ROM_REGION( 0x400000, "qsound", ROMREGION_ERASE00 ) /* Q Sound Samples */ +ROM_END + +/* 95681-2 */ +ROM_START( sfex ) + CPZN1_BIOS + + ROM_REGION32_LE( 0x80000, "user3", 0 ) + ROM_LOAD( "sfee_04a.2h", 0x0000000, 0x080000, CRC(092cfa2e) SHA1(8af38a3f4f89f661233995a672faf486e71b79bc) ) + + ROM_REGION32_LE( 0x2400000, "user2", 0 ) + ROM_LOAD( "sfe-05m.3h", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) + ROM_LOAD( "sfe-06m.4h", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) + ROM_LOAD( "sfe-07m.5h", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) + ROM_LOAD( "sfe-08m.2k", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) + ROM_LOAD( "sfe-09m.3k", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) + ROM_LOAD( "sfe-10m.4k", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) + + ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( sfexpu1 ) +/* 95681-2 */ +ROM_START( sfexu ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfpu-04", 0x0000000, 0x080000, CRC(305e4ec0) SHA1(0df9572d7fc1bbc7131483960771d016fa5487a5) ) + ROM_LOAD( "sfeu_04b.2h", 0x0000000, 0x080000, CRC(de02bd29) SHA1(62a88a30f73db661f5b98fc7e2d34d51acb965cc) ) // same code / revision as sfee_04a, sfea_04a, should be sfeu_04a ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfp-05", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) - ROM_LOAD( "sfp-06", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) - ROM_LOAD( "sfp-07", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) - ROM_LOAD( "sfp-08", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) - ROM_LOAD( "sfp-09", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) - ROM_LOAD( "sfp-10", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) + ROM_LOAD( "sfe-05m.3h", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) + ROM_LOAD( "sfe-06m.4h", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) + ROM_LOAD( "sfe-07m.5h", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) + ROM_LOAD( "sfe-08m.2k", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) + ROM_LOAD( "sfe-09m.3k", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) + ROM_LOAD( "sfe-10m.4k", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( sfexpj ) +/* 95681-2 */ +ROM_START( sfexa ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sfpj-04", 0x0000000, 0x080000, CRC(18d043f5) SHA1(9e6e24a722d13888fbfd391ddb1a5045b162488c) ) + ROM_LOAD( "sfea_04a.2h", 0x0000000, 0x080000, CRC(08247bd4) SHA1(07f356ef2827b3fbd0bfaf2010915315d9d60ef1) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "sfp-05", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) - ROM_LOAD( "sfp-06", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) - ROM_LOAD( "sfp-07", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) - ROM_LOAD( "sfp-08", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) - ROM_LOAD( "sfp-09", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) - ROM_LOAD( "sfp-10", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) + ROM_LOAD( "sfe-05m.3h", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) + ROM_LOAD( "sfe-06m.4h", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) + ROM_LOAD( "sfe-07m.5h", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) + ROM_LOAD( "sfe-08m.2k", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) + ROM_LOAD( "sfe-09m.3k", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) + ROM_LOAD( "sfe-10m.4k", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sfe-02", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sfe-03", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sfe-01m", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( starglad ) +/* 95681-2 */ +ROM_START( sfexj ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ps1u-04.2h", 0x000000, 0x080000, CRC(121fb234) SHA1(697d18d37afd95f302b40a5a6a78d8c92a41ea73) ) + ROM_LOAD( "sfej_04.2h", 0x0000000, 0x080000, CRC(ea100607) SHA1(27ef8c619804999d32d14fcc5ec783c057b4dc73) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "ps1-05m.3h", 0x0000000, 0x400000, CRC(8ad72c4f) SHA1(c848c37eb5365000b4d4720b5c08d89ddd8e2c33) ) - ROM_LOAD( "ps1-06m.4h", 0x0400000, 0x400000, CRC(95d8ed61) SHA1(e9f259d589dc38a8321a6fea1f5dac741cadc0ff) ) - ROM_LOAD( "ps1-07m.5h", 0x0800000, 0x400000, CRC(c06752db) SHA1(0884b308e9cd9dde8660b422bc8fec9a362bcb52) ) - ROM_LOAD( "ps1-08m.2k", 0x0c00000, 0x400000, CRC(381f9ded) SHA1(b7878a90740f5b3c5881ac7d46e2b84b18727337) ) - ROM_LOAD( "ps1-09m.3k", 0x1000000, 0x400000, CRC(bd894812) SHA1(9f0c3365e685a53ae793f4a256a6c177a843a424) ) - ROM_LOAD( "ps1-10m.4k", 0x1400000, 0x400000, CRC(ff80c18a) SHA1(8d01717eed6ec1f508fe7c445da941fb84ef7d22) ) + ROM_LOAD( "sfe-05m.3h", 0x0000000, 0x400000, CRC(eab781fe) SHA1(205476cb72c8dac915e140fb32243dfc5d209ba4) ) + ROM_LOAD( "sfe-06m.4h", 0x0400000, 0x400000, CRC(999de60c) SHA1(092882698c411fc5c3bcb43105bf1886f94b8e40) ) + ROM_LOAD( "sfe-07m.5h", 0x0800000, 0x400000, CRC(76117b0a) SHA1(027233199170fa6e5b32f28da2031638c6d3d14a) ) + ROM_LOAD( "sfe-08m.2k", 0x0c00000, 0x400000, CRC(a36bbec5) SHA1(fa22ea50d4d8bed2ded97a346f61b2f5f68769b9) ) + ROM_LOAD( "sfe-09m.3k", 0x1000000, 0x400000, CRC(62c424cc) SHA1(ea19c49b486473b150dbf8541286e225655496db) ) + ROM_LOAD( "sfe-10m.4k", 0x1400000, 0x400000, CRC(83791a8b) SHA1(534969797640834ca692c11d0ce7c3a060fc7e4b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ps1-02a.2e", 0x000000, 0x008000, CRC(b854df92) SHA1(ea71a613b5b19ec7e9c6e342e7743d320582a6bb) ) - ROM_CONTINUE( 0x010000, 0x018000 ) - ROM_LOAD( "ps1-03a.3e", 0x028000, 0x020000, CRC(a2562fbb) SHA1(3de02a4aa7ea620961ca2a5c331f38134033db79) ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ps1-01m.3b", 0x000000, 0x400000, CRC(0bfb17aa) SHA1(cf4482785a2a33ad814c8b1461c5bc8e8e027895) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( stargladj ) +/* 95681-2 */ +ROM_START( sfexp ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ps1j-04.2h", 0x000000, 0x080000, CRC(f865006d) SHA1(6abb476777a4309b1a60f12e6313c051db195808) ) + ROM_LOAD( "sfpu_04a.2h", 0x0000000, 0x080000, CRC(4617adc2) SHA1(200307904349ad7e5d7d76d8c904b6b10424c7ef) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "ps1-05m.3h", 0x0000000, 0x400000, CRC(8ad72c4f) SHA1(c848c37eb5365000b4d4720b5c08d89ddd8e2c33) ) - ROM_LOAD( "ps1-06m.4h", 0x0400000, 0x400000, CRC(95d8ed61) SHA1(e9f259d589dc38a8321a6fea1f5dac741cadc0ff) ) - ROM_LOAD( "ps1-07m.5h", 0x0800000, 0x400000, CRC(c06752db) SHA1(0884b308e9cd9dde8660b422bc8fec9a362bcb52) ) - ROM_LOAD( "ps1-08m.2k", 0x0c00000, 0x400000, CRC(381f9ded) SHA1(b7878a90740f5b3c5881ac7d46e2b84b18727337) ) - ROM_LOAD( "ps1-09m.3k", 0x1000000, 0x400000, CRC(bd894812) SHA1(9f0c3365e685a53ae793f4a256a6c177a843a424) ) - ROM_LOAD( "ps1-10m.4k", 0x1400000, 0x400000, CRC(ff80c18a) SHA1(8d01717eed6ec1f508fe7c445da941fb84ef7d22) ) + ROM_LOAD( "sfp-05m.3h", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) + ROM_LOAD( "sfp-06m.4h", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) + ROM_LOAD( "sfp-07m.5h", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) + ROM_LOAD( "sfp-08m.2k", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) + ROM_LOAD( "sfp-09m.3k", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) + ROM_LOAD( "sfp-10m.4k", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ps1-02a.2e", 0x000000, 0x008000, CRC(b854df92) SHA1(ea71a613b5b19ec7e9c6e342e7743d320582a6bb) ) - ROM_CONTINUE( 0x010000, 0x018000 ) - ROM_LOAD( "ps1-03a.3e", 0x028000, 0x020000, CRC(a2562fbb) SHA1(3de02a4aa7ea620961ca2a5c331f38134033db79) ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ps1-01m.3b", 0x000000, 0x400000, CRC(0bfb17aa) SHA1(cf4482785a2a33ad814c8b1461c5bc8e8e027895) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( ts2 ) +/* 95681-2 */ +ROM_START( sfexpu1 ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ts2u-04", 0x0000000, 0x080000, CRC(ddb52e7c) SHA1(e77891abae7681d911ef6eba2e0920d81433ebe6) ) + ROM_LOAD( "sfpu_04.2h", 0x0000000, 0x080000, CRC(305e4ec0) SHA1(0df9572d7fc1bbc7131483960771d016fa5487a5) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "ts2-05", 0x0000000, 0x400000, CRC(7f4228e2) SHA1(3690a76d19d97e55bc7b05a8456328697cfd7a77) ) - ROM_LOAD( "ts2-06m", 0x0400000, 0x400000, CRC(cd7e0a27) SHA1(325b5f2e653cdea07cddc9d20d12b5ab50dca949) ) - ROM_LOAD( "ts2-08m", 0x0800000, 0x400000, CRC(b1f7f115) SHA1(3f416d2aac07aa73a99593b5a21b047da60cea6a) ) - ROM_LOAD( "ts2-10", 0x0c00000, 0x200000, CRC(ad90679a) SHA1(19dd30764f892ee7f89c78ccbccdaf4d6b0e6e09) ) + ROM_LOAD( "sfp-05m.3h", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) + ROM_LOAD( "sfp-06m.4h", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) + ROM_LOAD( "sfp-07m.5h", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) + ROM_LOAD( "sfp-08m.2k", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) + ROM_LOAD( "sfp-09m.3k", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) + ROM_LOAD( "sfp-10m.4k", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ts2-02", 0x00000, 0x08000, CRC(2f45c461) SHA1(513b6b9b5a2f7c567c30c958e0e13834cd9bd266) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ts2-01", 0x0000000, 0x400000, CRC(d7a505e0) SHA1(f1b0cdea712101f695bd326eccd753eb79a07490) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END -ROM_START( ts2j ) +/* 95681-2 */ +ROM_START( sfexpj ) CPZN1_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ts2j-04", 0x0000000, 0x080000, CRC(4aba8c5e) SHA1(a56001bf50bfc1b03036e88ae1febd1aac8c63c0) ) + ROM_LOAD( "sfpj_04.2h", 0x0000000, 0x080000, CRC(18d043f5) SHA1(9e6e24a722d13888fbfd391ddb1a5045b162488c) ) ROM_REGION32_LE( 0x2400000, "user2", 0 ) - ROM_LOAD( "ts2-05", 0x0000000, 0x400000, CRC(7f4228e2) SHA1(3690a76d19d97e55bc7b05a8456328697cfd7a77) ) - ROM_LOAD( "ts2-06m", 0x0400000, 0x400000, CRC(cd7e0a27) SHA1(325b5f2e653cdea07cddc9d20d12b5ab50dca949) ) - ROM_LOAD( "ts2-08m", 0x0800000, 0x400000, CRC(b1f7f115) SHA1(3f416d2aac07aa73a99593b5a21b047da60cea6a) ) - ROM_LOAD( "ts2-10", 0x0c00000, 0x200000, CRC(ad90679a) SHA1(19dd30764f892ee7f89c78ccbccdaf4d6b0e6e09) ) + ROM_LOAD( "sfp-05m.3h", 0x0000000, 0x400000, CRC(ac7dcc5e) SHA1(216de2de691a9bd7982d5d6b5b1e3e35ff381a2f) ) + ROM_LOAD( "sfp-06m.4h", 0x0400000, 0x400000, CRC(1d504758) SHA1(bd56141aba35dbb5b318445ba5db12eff7442221) ) + ROM_LOAD( "sfp-07m.5h", 0x0800000, 0x400000, CRC(0f585f30) SHA1(24ffdbc360f8eddb702905c99d315614327861a7) ) + ROM_LOAD( "sfp-08m.2k", 0x0c00000, 0x400000, CRC(65eabc61) SHA1(bbeb3bcd8dd8f7f88ed82412a81134a3d6f6ffd9) ) + ROM_LOAD( "sfp-09m.3k", 0x1000000, 0x400000, CRC(15f8b71e) SHA1(efb28fbe750f443550ee9718385355aae7e858c9) ) + ROM_LOAD( "sfp-10m.4k", 0x1400000, 0x400000, CRC(c1ecf652) SHA1(616e14ff63d38272730c810b933a6b3412e2da17) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ts2-02", 0x00000, 0x08000, CRC(2f45c461) SHA1(513b6b9b5a2f7c567c30c958e0e13834cd9bd266) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_02.2e", 0x00000, 0x08000, CRC(1908475c) SHA1(99f68cff2d92f5697eec0846201f6fb317d5dc08) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sfe_03.3e", 0x28000, 0x20000, CRC(95c1e2e0) SHA1(383bbe9613798a3ac6944d18768280a840994e40) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ts2-01", 0x0000000, 0x400000, CRC(d7a505e0) SHA1(f1b0cdea712101f695bd326eccd753eb79a07490) ) + ROM_LOAD16_WORD_SWAP( "sfe-01m.3b", 0x0000000, 0x400000, CRC(f5afff0d) SHA1(7f9ac32ba0a3d9c6fef367e36a92d47c9ac1feb3) ) ROM_END /* Capcom ZN2 */ @@ -3083,458 +3115,507 @@ ROM_REGION( 0x50000, "audiocpu", ROMREGION_ERASE00 ) ROM_END +/* 95681-2 */ ROM_START( rvschool ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "jstu-04", 0x0000000, 0x080000, CRC(d83724ae) SHA1(0890c0164116606acc600f646e82972d0d4f79b4) ) + ROM_LOAD( "jste_04.2h", 0x0000000, 0x080000, CRC(1567555a) SHA1(3b93235076ab3c06914c83becf0da8e810b8917a) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "jst-05m", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) - ROM_LOAD( "jst-06m", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) - ROM_LOAD( "jst-07m", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) - ROM_LOAD( "jst-08m", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) - ROM_LOAD( "jst-09m", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) - ROM_LOAD( "jst-10m", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) - ROM_LOAD( "jst-11m", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) - ROM_LOAD( "jst-12m", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) - ROM_LOAD( "jst-13m", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) + ROM_LOAD( "jst-05m.3h", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) + ROM_LOAD( "jst-06m.4h", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) + ROM_LOAD( "jst-07m.5h", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) + ROM_LOAD( "jst-08m.2k", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) + ROM_LOAD( "jst-09m.3k", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) + ROM_LOAD( "jst-10m.4k", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) + ROM_LOAD( "jst-11m.5k", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) + ROM_LOAD( "jst-12m.6k", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) + ROM_LOAD( "jst-13m.7k", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "jst-02", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "jst-03", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) + ROM_LOAD( "jst_02.2e", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "jst_03.3e", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "jst-01m", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) + ROM_LOAD16_WORD_SWAP( "jst-01m.3b", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) ROM_END -ROM_START( rvschoola ) +/* 95681-2 */ +ROM_START( rvschoolu ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "jsta-04", 0x0000000, 0x080000, CRC(034b1011) SHA1(6773246be242ee336503d21d7d44a3884832eb1e) ) + ROM_LOAD( "jstu_04.2h", 0x0000000, 0x080000, CRC(d83724ae) SHA1(0890c0164116606acc600f646e82972d0d4f79b4) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "jst-05m", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) - ROM_LOAD( "jst-06m", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) - ROM_LOAD( "jst-07m", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) - ROM_LOAD( "jst-08m", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) - ROM_LOAD( "jst-09m", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) - ROM_LOAD( "jst-10m", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) - ROM_LOAD( "jst-11m", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) - ROM_LOAD( "jst-12m", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) - ROM_LOAD( "jst-13m", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) + ROM_LOAD( "jst-05m.3h", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) + ROM_LOAD( "jst-06m.4h", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) + ROM_LOAD( "jst-07m.5h", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) + ROM_LOAD( "jst-08m.2k", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) + ROM_LOAD( "jst-09m.3k", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) + ROM_LOAD( "jst-10m.4k", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) + ROM_LOAD( "jst-11m.5k", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) + ROM_LOAD( "jst-12m.6k", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) + ROM_LOAD( "jst-13m.7k", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "jst-02", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "jst-03", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) + ROM_LOAD( "jst_02.2e", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "jst_03.3e", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "jst-01m", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) + ROM_LOAD16_WORD_SWAP( "jst-01m.3b", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) ROM_END -ROM_START( jgakuen ) +/* 95681-2 */ +ROM_START( rvschoola ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "jstj-04", 0x0000000, 0x080000, CRC(28b8000a) SHA1(9ebf74b453d775cadca9c2d7d8e2c7eb57bb9a38) ) + ROM_LOAD( "jsta_04.2h", 0x0000000, 0x080000, CRC(034b1011) SHA1(6773246be242ee336503d21d7d44a3884832eb1e) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "jst-05m", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) - ROM_LOAD( "jst-06m", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) - ROM_LOAD( "jst-07m", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) - ROM_LOAD( "jst-08m", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) - ROM_LOAD( "jst-09m", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) - ROM_LOAD( "jst-10m", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) - ROM_LOAD( "jst-11m", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) - ROM_LOAD( "jst-12m", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) - ROM_LOAD( "jst-13m", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) + ROM_LOAD( "jst-05m.3h", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) + ROM_LOAD( "jst-06m.4h", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) + ROM_LOAD( "jst-07m.5h", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) + ROM_LOAD( "jst-08m.2k", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) + ROM_LOAD( "jst-09m.3k", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) + ROM_LOAD( "jst-10m.4k", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) + ROM_LOAD( "jst-11m.5k", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) + ROM_LOAD( "jst-12m.6k", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) + ROM_LOAD( "jst-13m.7k", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "jst-02", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "jst-03", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) + ROM_LOAD( "jst_02.2e", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "jst_03.3e", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "jst-01m", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) + ROM_LOAD16_WORD_SWAP( "jst-01m.3b", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) ROM_END -ROM_START( techromn ) +/* 95681-2 */ +ROM_START( jgakuen ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "kioe-04", 0x0000000, 0x080000, CRC(ebd33b09) SHA1(3f0226d275efc7b97c8d3431211f948aa1271d34) ) + ROM_LOAD( "jstj_04.2h", 0x0000000, 0x080000, CRC(28b8000a) SHA1(9ebf74b453d775cadca9c2d7d8e2c7eb57bb9a38) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "kio-05m.bin", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) - ROM_LOAD( "kio-06m.bin", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) - ROM_LOAD( "kio-07m.bin", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) - ROM_LOAD( "kio-08m.bin", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) - ROM_LOAD( "kio-09m.bin", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) - ROM_LOAD( "kio-10m.bin", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) + ROM_LOAD( "jst-05m.3h", 0x0000000, 0x400000, CRC(723372b8) SHA1(2a7c95d1f9a3f58c469dfc28ead1fd192eaaebd1) ) + ROM_LOAD( "jst-06m.4h", 0x0400000, 0x400000, CRC(4248988e) SHA1(4bdf7cac17d70ea85aa2002fc6b21a64d05e6e5a) ) + ROM_LOAD( "jst-07m.5h", 0x0800000, 0x400000, CRC(c84c5a16) SHA1(5c0ca7454189c766f1ca7305504ff1867007c8e6) ) + ROM_LOAD( "jst-08m.2k", 0x0c00000, 0x400000, CRC(791b57f3) SHA1(4ea12a0f7a7110d7dcbc55b3f02aa9a92dea4b12) ) + ROM_LOAD( "jst-09m.3k", 0x1000000, 0x400000, CRC(6df42048) SHA1(9e2b4a424de3918e5e54bc87fd9dcceff8d162be) ) + ROM_LOAD( "jst-10m.4k", 0x1400000, 0x400000, CRC(d7e22769) SHA1(733f96dce2586fc0a8af3cec18153085750c9a4d) ) + ROM_LOAD( "jst-11m.5k", 0x1800000, 0x400000, CRC(0a033ac5) SHA1(218b33cb51db99d3e9ee180da6a74460f4444fc6) ) + ROM_LOAD( "jst-12m.6k", 0x1c00000, 0x400000, CRC(43bd2ddd) SHA1(7f2976e394362cb648f620e430b3bf11b71485a6) ) + ROM_LOAD( "jst-13m.7k", 0x2000000, 0x400000, CRC(6b443235) SHA1(c764d8b742aa1c46bc8d37f36e864ef50a1ff4e4) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "kio-02.bin", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "kio-03.bin", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) + ROM_LOAD( "jst_02.2e", 0x00000, 0x08000, CRC(7809e2c3) SHA1(0216a665f7978bc8db3f7fdab038e1c7aa120844) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "jst_03.3e", 0x28000, 0x20000, CRC(860ff24d) SHA1(eea72fa5eaf407a112a5b3daf60f7ac8ad191cc7) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "kio-01m.bin", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) + ROM_LOAD16_WORD_SWAP( "jst-01m.3b", 0x0000000, 0x400000, CRC(9a7c98f9) SHA1(764c6c4f41047e1f36d2dceac4aa9b943a9d529a) ) ROM_END -ROM_START( techromnu ) +/* Hereafter Capcom games will use only the new game board 97695-1. */ + +/* 97695-1 */ +/* An undumped japanese pcb of Shiritsu Justice Gakuen: Legion of Heroes running on the new game board 97695-1 and + mounting the EPROM JSTJ_04A located @ 2H is proved to exist. */ + +/* 97695-1 */ +ROM_START( sfex2 ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "kiou-04", 0x0000000, 0x080000, CRC(08aca34a) SHA1(768a37f719af5d96993db5592b6505b013e0d6f4) ) + ROM_LOAD( "ex2u_04a.2h", 0x0000000, 0x080000, CRC(8dc5317f) SHA1(c35224caf70662a0e45a74cbead294a51f9b9e16) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "kio-05m.bin", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) - ROM_LOAD( "kio-06m.bin", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) - ROM_LOAD( "kio-07m.bin", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) - ROM_LOAD( "kio-08m.bin", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) - ROM_LOAD( "kio-09m.bin", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) - ROM_LOAD( "kio-10m.bin", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) + ROM_LOAD( "ex2-05m.3h", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) + ROM_LOAD( "ex2-06m.4h", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) + ROM_LOAD( "ex2-07m.5h", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) + ROM_LOAD( "ex2-08m.2k", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) + ROM_LOAD( "ex2-09m.3k", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "kio-02.bin", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "kio-03.bin", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) + ROM_LOAD( "ex2_02.2e", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "kio-01m.bin", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) + ROM_LOAD16_WORD_SWAP( "ex2-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END -ROM_START( kikaioh ) +/* 97695-1 */ +ROM_START( sfex2a ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "kioj-04", 0x0000000, 0x080000, CRC(3a2a3bc8) SHA1(3c4ae3cfe00a7f60ab2196ae042dab4a8eb6f597) ) + ROM_LOAD( "ex2a_04.2h", 0x0000000, 0x080000, CRC(ac9a872d) SHA1(4e237f5e2e5de58e587e9abc5767509b8d750004) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "kio-05m.bin", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) - ROM_LOAD( "kio-06m.bin", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) - ROM_LOAD( "kio-07m.bin", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) - ROM_LOAD( "kio-08m.bin", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) - ROM_LOAD( "kio-09m.bin", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) - ROM_LOAD( "kio-10m.bin", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) + ROM_LOAD( "ex2-05m.3h", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) + ROM_LOAD( "ex2-06m.4h", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) + ROM_LOAD( "ex2-07m.5h", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) + ROM_LOAD( "ex2-08m.2k", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) + ROM_LOAD( "ex2-09m.3k", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "kio-02.bin", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "kio-03.bin", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) + ROM_LOAD( "ex2_02.2e", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "kio-01m.bin", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) + ROM_LOAD16_WORD_SWAP( "ex2-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END -ROM_START( sfex2 ) +/* 97695-1 */ +ROM_START( sfex2h ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ex2u-04a.2h", 0x0000000, 0x080000, CRC(8dc5317f) SHA1(c35224caf70662a0e45a74cbead294a51f9b9e16) ) + ROM_LOAD( "ex2h_04.2h", 0x0000000, 0x080000, CRC(68f2ef80) SHA1(212bb3c0d935c64f5e3b20e427e06d97404709d8) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "ex2-05m", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) - ROM_LOAD( "ex2-06m", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) - ROM_LOAD( "ex2-07m", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) - ROM_LOAD( "ex2-08m", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) - ROM_LOAD( "ex2-09m", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) + ROM_LOAD( "ex2-05m.3h", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) + ROM_LOAD( "ex2-06m.4h", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) + ROM_LOAD( "ex2-07m.5h", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) + ROM_LOAD( "ex2-08m.2k", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) + ROM_LOAD( "ex2-09m.3k", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ex2-02", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "ex2_02.2e", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ex2-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "ex2-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END +/* 97695-1 */ ROM_START( sfex2j ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ex2j-04.2h", 0x0000000, 0x080000, CRC(5d603586) SHA1(ff546d3bd011d6441e9672b88bab763d3cd89be2) ) + ROM_LOAD( "ex2j_04.2h", 0x0000000, 0x080000, CRC(5d603586) SHA1(ff546d3bd011d6441e9672b88bab763d3cd89be2) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "ex2-05m", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) - ROM_LOAD( "ex2-06m", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) - ROM_LOAD( "ex2-07m", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) - ROM_LOAD( "ex2-08m", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) - ROM_LOAD( "ex2-09m", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) + ROM_LOAD( "ex2-05m.3h", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) + ROM_LOAD( "ex2-06m.4h", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) + ROM_LOAD( "ex2-07m.5h", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) + ROM_LOAD( "ex2-08m.2k", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) + ROM_LOAD( "ex2-09m.3k", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ex2-02", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "ex2_02.2e", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ex2-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "ex2-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END -ROM_START( sfex2a ) +/* 97695-1 */ +ROM_START( plsmaswd ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ex2a-04.2h", 0x0000000, 0x080000, CRC(ac9a872d) SHA1(4e237f5e2e5de58e587e9abc5767509b8d750004) ) + ROM_LOAD( "sg2u_04.2h", 0x0000000, 0x080000, CRC(154187c0) SHA1(58cc0e9d32786b1c1d64ecee4667190456b36ef6) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "ex2-05m", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) - ROM_LOAD( "ex2-06m", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) - ROM_LOAD( "ex2-07m", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) - ROM_LOAD( "ex2-08m", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) - ROM_LOAD( "ex2-09m", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) + ROM_LOAD( "sg2-05m.3h", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) + ROM_LOAD( "sg2-06m.4h", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) + ROM_LOAD( "sg2-07m.5h", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) + ROM_LOAD( "sg2-08m.2k", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) + ROM_LOAD( "sg2-09m.3k", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ex2-02", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sg2_02.2e", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sg2_03.3e", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ex2-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "sg2-01m.3a", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) ROM_END -ROM_START( sfex2h ) +/* 97695-1 */ +ROM_START( plsmaswda ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "ex2h-04.2h", 0x0000000, 0x080000, CRC(68f2ef80) SHA1(212bb3c0d935c64f5e3b20e427e06d97404709d8) ) + ROM_LOAD( "sg2a_04.2h", 0x0000000, 0x080000, CRC(66e5dada) SHA1(f2e50ee963b8a6aadf25a17b3ff6dcb428b8bdb2) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "ex2-05m", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) ) - ROM_LOAD( "ex2-06m", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) ) - ROM_LOAD( "ex2-07m", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) ) - ROM_LOAD( "ex2-08m", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) ) - ROM_LOAD( "ex2-09m", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) ) + ROM_LOAD( "sg2-05m.3h", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) + ROM_LOAD( "sg2-06m.4h", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) + ROM_LOAD( "sg2-07m.5h", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) + ROM_LOAD( "sg2-08m.2k", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) + ROM_LOAD( "sg2-09m.3k", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ex2-02", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sg2_02.2e", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sg2_03.3e", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ex2-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "sg2-01m.3a", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) ROM_END -ROM_START( sfex2p ) +/* 97695-1 */ +ROM_START( stargld2 ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "extp-04u", 0x0000000, 0x080000, CRC(2938118c) SHA1(4bdeeb9aa3dd54ef44aa3fc73d78d65297b1ed25) ) + ROM_LOAD( "sg2j_04.2h", 0x0000000, 0x080000, CRC(cf4ce6ac) SHA1(52b6f61d79671c9c108b3dfbd3c2ac333285412c) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "x2p-05m", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) - ROM_LOAD( "x2p-06m", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) - ROM_LOAD( "x2p-07m", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) - ROM_LOAD( "x2p-08m", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) - ROM_LOAD( "x2p-09m", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) - ROM_LOAD( "x2p-10m", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) + ROM_LOAD( "sg2-05m.3h", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) + ROM_LOAD( "sg2-06m.4h", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) + ROM_LOAD( "sg2-07m.5h", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) + ROM_LOAD( "sg2-08m.2k", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) + ROM_LOAD( "sg2-09m.3k", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "extp-02", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "extp-03", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) + ROM_LOAD( "sg2_02.2e", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "sg2_03.3e", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "x2p-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "sg2-01m.3a", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) ROM_END -ROM_START( sfex2pa ) +/* 97695-1 */ +ROM_START( tgmj ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "extp-04a", 0x0000000, 0x080000, CRC(c437d602) SHA1(150f0dfd9f2e4f9adc11f8960da1e6be250456b1) ) + ROM_LOAD( "atej_04.2h", 0x0000000, 0x080000, CRC(bb4bbb96) SHA1(808f4b29493e74efd661d561d11cbec2f4afd1c8) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "x2p-05m", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) - ROM_LOAD( "x2p-06m", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) - ROM_LOAD( "x2p-07m", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) - ROM_LOAD( "x2p-08m", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) - ROM_LOAD( "x2p-09m", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) - ROM_LOAD( "x2p-10m", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) + ROM_LOAD( "ate-05m.3h", 0x0000000, 0x400000, CRC(50977f5a) SHA1(78c2b1965957ff1756c25b76e549f11fc0001153) ) + ROM_LOAD( "ate-06m.4h", 0x0400000, 0x400000, CRC(05973f16) SHA1(c9262e8de14c4a9489f7050316012913c1caf0ff) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "extp-02", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "extp-03", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) + ROM_LOAD( "ate_02.2e", 0x00000, 0x08000, CRC(f4f6e82f) SHA1(ad6c49197a60f456367c9f78353741fb847819a1) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "x2p-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "ate-01m.3a", 0x0000000, 0x400000, CRC(a21c6521) SHA1(560e4855f6e00def5277bdd12064b49e55c3b46b) ) ROM_END -ROM_START( sfex2pj ) +/* 97695-1 */ +ROM_START( techromn ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "extp-04j", 0x0000000, 0x080000, CRC(c6d0aea3) SHA1(f48ee889dd743109f830063da3eb0f687db2d86c) ) + ROM_LOAD( "kioe_04.2h", 0x0000000, 0x080000, CRC(ebd33b09) SHA1(3f0226d275efc7b97c8d3431211f948aa1271d34) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "x2p-05m", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) - ROM_LOAD( "x2p-06m", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) - ROM_LOAD( "x2p-07m", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) - ROM_LOAD( "x2p-08m", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) - ROM_LOAD( "x2p-09m", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) - ROM_LOAD( "x2p-10m", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) + ROM_LOAD( "kio-05m.3h", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) + ROM_LOAD( "kio-06m.4h", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) + ROM_LOAD( "kio-07m.5h", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) + ROM_LOAD( "kio-08m.2k", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) + ROM_LOAD( "kio-09m.3k", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) + ROM_LOAD( "kio-10m.4k", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "extp-02", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "extp-03", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) + ROM_LOAD( "kio_02.2e", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "kio_03.3e", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "x2p-01m", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) + ROM_LOAD16_WORD_SWAP( "kio-01m.3a", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) ROM_END -ROM_START( plsmaswd ) +/* 97695-1 */ +ROM_START( techromnu ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sg2u-04", 0x0000000, 0x080000, CRC(154187c0) SHA1(58cc0e9d32786b1c1d64ecee4667190456b36ef6) ) + ROM_LOAD( "kiou_04.2h", 0x0000000, 0x080000, CRC(08aca34a) SHA1(768a37f719af5d96993db5592b6505b013e0d6f4) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "sg2-05m", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) - ROM_LOAD( "sg2-06m", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) - ROM_LOAD( "sg2-07m", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) - ROM_LOAD( "sg2-08m", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) - ROM_LOAD( "sg2-09m", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) + ROM_LOAD( "kio-05m.3h", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) + ROM_LOAD( "kio-06m.4h", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) + ROM_LOAD( "kio-07m.5h", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) + ROM_LOAD( "kio-08m.2k", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) + ROM_LOAD( "kio-09m.3k", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) + ROM_LOAD( "kio-10m.4k", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sg2-02", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sg2-03", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) + ROM_LOAD( "kio_02.2e", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "kio_03.3e", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sg2-01m", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) + ROM_LOAD16_WORD_SWAP( "kio-01m.3a", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) ROM_END -ROM_START( stargld2 ) +/* 97695-1 */ +ROM_START( kikaioh ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sg2j-04", 0x0000000, 0x080000, CRC(cf4ce6ac) SHA1(52b6f61d79671c9c108b3dfbd3c2ac333285412c) ) + ROM_LOAD( "kioj_04.2h", 0x0000000, 0x080000, CRC(3a2a3bc8) SHA1(3c4ae3cfe00a7f60ab2196ae042dab4a8eb6f597) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "sg2-05m", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) - ROM_LOAD( "sg2-06m", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) - ROM_LOAD( "sg2-07m", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) - ROM_LOAD( "sg2-08m", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) - ROM_LOAD( "sg2-09m", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) + ROM_LOAD( "kio-05m.3h", 0x0000000, 0x800000, CRC(98e9eb24) SHA1(144773296c213ab09d626c915f90bb74e24487f0) ) + ROM_LOAD( "kio-06m.4h", 0x0800000, 0x800000, CRC(be8d7d73) SHA1(bcbbbd0b83503f2ed32527444e0da3afd774d3f7) ) + ROM_LOAD( "kio-07m.5h", 0x1000000, 0x800000, CRC(ffd81f18) SHA1(f8387a9d45e79f97ccdffabe755638a60f80ccf5) ) + ROM_LOAD( "kio-08m.2k", 0x1800000, 0x800000, CRC(17302226) SHA1(976ba7f48c9a52d24388cd63d02be08627cf2e30) ) + ROM_LOAD( "kio-09m.3k", 0x2000000, 0x800000, CRC(a34f2119) SHA1(50fa992eba5324a173fcc0923227c13cad4f97e5) ) + ROM_LOAD( "kio-10m.4k", 0x2800000, 0x800000, CRC(7400037a) SHA1(d58641e1d6bf1c6ca04f6c98d6809edaa7df75d3) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sg2-02", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sg2-03", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) + ROM_LOAD( "kio_02.2e", 0x00000, 0x08000, CRC(174309b3) SHA1(b35b9c3905d2fabaa8410f70f7b382e916c89733) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "kio_03.3e", 0x28000, 0x20000, CRC(0b313ae5) SHA1(0ea39305ca30f376930e39b134fd1a52200624fa) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sg2-01m", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) + ROM_LOAD16_WORD_SWAP( "kio-01m.3a", 0x0000000, 0x400000, CRC(6dc5bd07) SHA1(e1755a48465f741691ea0fa1166cb2dc09210ed9) ) ROM_END -ROM_START( plsmaswda ) +/* 97695-1 */ +ROM_START( sfex2p ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "sg2a-04", 0x0000000, 0x080000, CRC(66e5dada) SHA1(f2e50ee963b8a6aadf25a17b3ff6dcb428b8bdb2) ) + ROM_LOAD( "x2pu_04.2h", 0x0000000, 0x080000, CRC(2938118c) SHA1(4bdeeb9aa3dd54ef44aa3fc73d78d65297b1ed25) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "sg2-05m", 0x0000000, 0x800000, CRC(f1759236) SHA1(fbe3a820a8c571dfb186eae68346e6461168ed48) ) - ROM_LOAD( "sg2-06m", 0x0800000, 0x800000, CRC(33de4f72) SHA1(ab32af76b5682e3d9f67dadbaed35abc043912b4) ) - ROM_LOAD( "sg2-07m", 0x1000000, 0x800000, CRC(72f724ba) SHA1(e6658b495d308d1de6710f87b5b9d346008b0c5a) ) - ROM_LOAD( "sg2-08m", 0x1800000, 0x800000, CRC(9e169eee) SHA1(6141b1a7863fdfb200ca35d2893979a34dcc3f6c) ) - ROM_LOAD( "sg2-09m", 0x2000000, 0x400000, CRC(33f73d4c) SHA1(954695a43e77b58585409678bd87c76adac1d855) ) + ROM_LOAD( "x2p-05m.3h", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) + ROM_LOAD( "x2p-06m.4h", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) + ROM_LOAD( "x2p-07m.5h", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) + ROM_LOAD( "x2p-08m.2k", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) + ROM_LOAD( "x2p-09m.3k", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) + ROM_LOAD( "x2p-10m.4k", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "sg2-02", 0x00000, 0x08000, CRC(415ee138) SHA1(626083c8705f012552691c450f95401ddc88065b) ) - ROM_CONTINUE( 0x10000, 0x18000 ) - ROM_LOAD( "sg2-03", 0x28000, 0x20000, CRC(43806735) SHA1(88d389bcc79cbd4fa1f4b62008e171a897e77652) ) + ROM_LOAD( "x2p_02.2e", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "x2p_03.3e", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "sg2-01m", 0x0000000, 0x400000, CRC(643ea27b) SHA1(40747432d5cfebac54d3824b6a6f26b5e7742fc1) ) + ROM_LOAD16_WORD_SWAP( "x2p-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END +/* 97695-1 */ +ROM_START( sfex2pa ) + CPZN2_BIOS -ROM_START( strider2 ) + ROM_REGION32_LE( 0x80000, "user3", 0 ) + ROM_LOAD( "x2pa_04.2h", 0x0000000, 0x080000, CRC(c437d602) SHA1(150f0dfd9f2e4f9adc11f8960da1e6be250456b1) ) + + ROM_REGION32_LE( 0x3000000, "user2", 0 ) + ROM_LOAD( "x2p-05m.3h", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) + ROM_LOAD( "x2p-06m.4h", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) + ROM_LOAD( "x2p-07m.5h", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) + ROM_LOAD( "x2p-08m.2k", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) + ROM_LOAD( "x2p-09m.3k", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) + ROM_LOAD( "x2p-10m.4k", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) + + ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ + ROM_LOAD( "x2p_02.2e", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "x2p_03.3e", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) + + ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ + ROM_LOAD16_WORD_SWAP( "x2p-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) +ROM_END + +/* 97695-1 */ +ROM_START( sfex2pj ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "hr2u-04", 0x000000, 0x080000, CRC(b28b01c6) SHA1(ad40f550ce14f09cf34d51b9b0b7154c31c8936e) ) + ROM_LOAD( "x2pj_04.2h", 0x0000000, 0x080000, CRC(c6d0aea3) SHA1(f48ee889dd743109f830063da3eb0f687db2d86c) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "hr2-05m.bin", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) - ROM_LOAD( "hr2-06m.bin", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) - ROM_LOAD( "hr2-07m.bin", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) - ROM_LOAD( "hr2-08m.bin", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) - ROM_LOAD( "hr2-09m.bin", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) - ROM_LOAD( "hr2-10m.bin", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) + ROM_LOAD( "x2p-05m.3h", 0x0000000, 0x800000, CRC(4ee3110f) SHA1(704f8dca7d0b698659af9e3271ea5072dfd42b8b) ) + ROM_LOAD( "x2p-06m.4h", 0x0800000, 0x800000, CRC(4cd53a45) SHA1(39499ea6c9aa51c71f4fe44cc02f93d5a39e14ec) ) + ROM_LOAD( "x2p-07m.5h", 0x1000000, 0x800000, CRC(11207c2a) SHA1(0182652819f1c3a36e7b42e34ef86d2455a2dd90) ) + ROM_LOAD( "x2p-08m.2k", 0x1800000, 0x800000, CRC(3560c2cc) SHA1(8b0ce22d954387f7bb032b5220d1014ef68741e8) ) + ROM_LOAD( "x2p-09m.3k", 0x2000000, 0x800000, CRC(344aa227) SHA1(69dc6f511939bf7fa25c2531ecf307a7565fe7a8) ) + ROM_LOAD( "x2p-10m.4k", 0x2800000, 0x800000, CRC(2eef5931) SHA1(e5227529fb68eeb1b2f25813694173a75d906b52) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "hr2-02.bin", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "x2p_02.2e", 0x00000, 0x08000, CRC(3705de5e) SHA1(847007ca271da64bf13ffbf496d4291429eee27a) ) + ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "x2p_03.3e", 0x28000, 0x20000, CRC(6ae828f6) SHA1(41c54165e87b846a845da581f408b96979288158) ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "hr2-01m.bin", 0x0000000, 0x200000, CRC(510a16d1) SHA1(05f10c2921a4d3b1fab4d0a4ea06351809bdbb07) ) - ROM_RELOAD( 0x0200000, 0x200000 ) + ROM_LOAD16_WORD_SWAP( "x2p-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) ) ROM_END -ROM_START( strider2a ) +/* 97695-1 */ +ROM_START( strider2 ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "hr2a-04", 0x000000, 0x080000, CRC(56ff9394) SHA1(fe8417965d945210ac098c6678c02f1c678bd13b) ) + ROM_LOAD( "hr2u_04.2h", 0x0000000, 0x080000, CRC(b28b01c6) SHA1(ad40f550ce14f09cf34d51b9b0b7154c31c8936e) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "hr2-05m.bin", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) - ROM_LOAD( "hr2-06m.bin", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) - ROM_LOAD( "hr2-07m.bin", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) - ROM_LOAD( "hr2-08m.bin", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) - ROM_LOAD( "hr2-09m.bin", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) - ROM_LOAD( "hr2-10m.bin", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) + ROM_LOAD( "hr2-05m.3h", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) + ROM_LOAD( "hr2-06m.4h", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) + ROM_LOAD( "hr2-07m.5h", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) + ROM_LOAD( "hr2-08m.2k", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) + ROM_LOAD( "hr2-09m.3k", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) + ROM_LOAD( "hr2-10m.4k", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "hr2-02.bin", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "hr2_02.2e", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "hr2-01m.bin", 0x0000000, 0x200000, CRC(510a16d1) SHA1(05f10c2921a4d3b1fab4d0a4ea06351809bdbb07) ) - ROM_RELOAD( 0x0200000, 0x200000 ) + ROM_LOAD16_WORD_SWAP( "hr2-01m.3a", 0x0000000, 0x400000, CRC(6a499efa) SHA1(f722efbdd154a223869112a9493cf7ae21359709) ) ROM_END -ROM_START( shiryu2 ) +/* 97695-1 */ +ROM_START( strider2a ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "hr2j-04", 0x0000000, 0x080000, CRC(0824ee5f) SHA1(a296ffe03f0d947deb9803d05de3c240a26b52bb) ) + ROM_LOAD( "hr2a_04.2h", 0x0000000, 0x080000, CRC(56ff9394) SHA1(fe8417965d945210ac098c6678c02f1c678bd13b) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "hr2-05m.bin", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) - ROM_LOAD( "hr2-06m.bin", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) - ROM_LOAD( "hr2-07m.bin", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) - ROM_LOAD( "hr2-08m.bin", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) - ROM_LOAD( "hr2-09m.bin", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) - ROM_LOAD( "hr2-10m.bin", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) + ROM_LOAD( "hr2-05m.3h", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) + ROM_LOAD( "hr2-06m.4h", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) + ROM_LOAD( "hr2-07m.5h", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) + ROM_LOAD( "hr2-08m.2k", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) + ROM_LOAD( "hr2-09m.3k", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) + ROM_LOAD( "hr2-10m.4k", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "hr2-02.bin", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "hr2_02.2e", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "hr2-01m.bin", 0x0000000, 0x200000, CRC(510a16d1) SHA1(05f10c2921a4d3b1fab4d0a4ea06351809bdbb07) ) - ROM_RELOAD( 0x0200000, 0x200000 ) + ROM_LOAD16_WORD_SWAP( "hr2-01m.3a", 0x0000000, 0x400000, CRC(6a499efa) SHA1(f722efbdd154a223869112a9493cf7ae21359709) ) ROM_END -ROM_START( tgmj ) +/* 97695-1 */ +ROM_START( shiryu2 ) CPZN2_BIOS ROM_REGION32_LE( 0x80000, "user3", 0 ) - ROM_LOAD( "atej-04", 0x0000000, 0x080000, CRC(bb4bbb96) SHA1(808f4b29493e74efd661d561d11cbec2f4afd1c8) ) + ROM_LOAD( "hr2j_04.2h", 0x0000000, 0x080000, CRC(0824ee5f) SHA1(a296ffe03f0d947deb9803d05de3c240a26b52bb) ) ROM_REGION32_LE( 0x3000000, "user2", 0 ) - ROM_LOAD( "ate-05", 0x0000000, 0x400000, CRC(50977f5a) SHA1(78c2b1965957ff1756c25b76e549f11fc0001153) ) - ROM_LOAD( "ate-06", 0x0400000, 0x400000, CRC(05973f16) SHA1(c9262e8de14c4a9489f7050316012913c1caf0ff) ) + ROM_LOAD( "hr2-05m.3h", 0x0000000, 0x800000, CRC(18716fe8) SHA1(bb923f18120086054cd6fd91f77d27a190c1eed4) ) + ROM_LOAD( "hr2-06m.4h", 0x0800000, 0x800000, CRC(6f13b69c) SHA1(9a14ecc72631bc44053af71fe7e3934bedf1a71e) ) + ROM_LOAD( "hr2-07m.5h", 0x1000000, 0x800000, CRC(3925701b) SHA1(d93218d2b97cc0fc6c30221bd6b5e955520fbc46) ) + ROM_LOAD( "hr2-08m.2k", 0x1800000, 0x800000, CRC(d844c0dc) SHA1(6010cfbf4dc42fda182884d78e12dcb63df00249) ) + ROM_LOAD( "hr2-09m.3k", 0x2000000, 0x800000, CRC(cdd43e6b) SHA1(346a83deadecd56428276acefc2ce95249a49921) ) + ROM_LOAD( "hr2-10m.4k", 0x2800000, 0x400000, CRC(d95b3f37) SHA1(b6566c1184718f6c0986d13060894c0fb400c201) ) ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */ - ROM_LOAD( "ate-02", 0x00000, 0x08000, CRC(f4f6e82f) SHA1(ad6c49197a60f456367c9f78353741fb847819a1) ) - ROM_CONTINUE( 0x10000, 0x18000 ) + ROM_LOAD( "hr2_02.2e", 0x00000, 0x08000, CRC(acd8d385) SHA1(5edb61c3d66d2d09a28a71db52eee3a9f7db8c9d) ) + ROM_CONTINUE( 0x10000, 0x18000 ) ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */ - ROM_LOAD16_WORD_SWAP( "ate-01", 0x0000000, 0x400000, CRC(a21c6521) SHA1(560e4855f6e00def5277bdd12064b49e55c3b46b) ) + ROM_LOAD16_WORD_SWAP( "hr2-01m.3a", 0x0000000, 0x400000, CRC(6a499efa) SHA1(f722efbdd154a223869112a9493cf7ae21359709) ) ROM_END /* Tecmo */ @@ -4528,14 +4609,15 @@ GAME( 1995, cpzn1, 0, coh1000c, zn, coh1000c, ROT0, "Sony / Capcom", "ZN1", GAME_IS_BIOS_ROOT ) GAME( 1995, ts2, cpzn1, coh1000c, zn6b, coh1000c, ROT0, "Capcom / Takara", "Battle Arena Toshinden 2 (USA 951124)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1995, ts2a, ts2, coh1000c, zn6b, coh1000c, ROT0, "Capcom / Takara", "Battle Arena Toshinden 2 (USA 951124) Older", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1995, ts2j, ts2, coh1000c, zn6b, coh1000c, ROT0, "Capcom / Takara", "Battle Arena Toshinden 2 (Japan 951124)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1996, starglad, cpzn1, coh1000c, zn6b, coh1000c, ROT0, "Capcom", "Star Gladiator (USA 960627)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1996, stargladj, starglad, coh1000c, zn6b, coh1000c, ROT0, "Capcom", "Star Gladiator (Japan 960627)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1996, starglad, cpzn1, coh1000c, zn6b, coh1000c, ROT0, "Capcom", "Star Gladiator Episode I: Final Crusade (USA 960627)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1996, stargladj, starglad, coh1000c, zn6b, coh1000c, ROT0, "Capcom", "Star Gladiator Episode I: Final Crusade (Japan 960627)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1996, glpracr, cpzn1, coh1000c, zn, coh1000c, ROT0, "Tecmo", "Gallop Racer (Japan Ver 9.01.12)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, sfex, cpzn1, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX (Euro 961219)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, sfexu, sfex, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX (USA 961219)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, sfexa, sfex, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX (Asia 961219)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, sfexj, sfex, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX (Japan 961130)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1996, glpracr, cpzn1, coh1000c, zn, coh1000c, ROT0, "Tecmo", "Gallop Racer (Japan Ver 9.01.12)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, sfexp, cpzn1, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX Plus (USA 970407)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, sfexpu1, sfexp, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX Plus (USA 970311)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, sfexpj, sfexp, coh1002c, zn6b, coh1000c, ROT0, "Capcom / Arika", "Street Fighter EX Plus (Japan 970311)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) @@ -4547,23 +4629,24 @@ /* it in every zip file */ GAME( 1997, cpzn2, 0, coh3002c, zn, coh3002c, ROT0, "Sony / Capcom", "ZN2", GAME_IS_BIOS_ROOT ) -GAME( 1997, rvschool, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Rival Schools (USA 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1997, rvschoola, rvschool, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Rival Schools (Asia 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1997, jgakuen, rvschool, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Justice Gakuen (Japan 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, sfex2, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 (USA 980526)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, sfex2j, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 (Japan 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, sfex2a, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 (Asia 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, sfex2h, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 (Hispanic 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, plsmaswd, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Plasma Sword (USA 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, stargld2, plsmaswd, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Star Gladiator 2 (Japan 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, plsmaswda, plsmaswd, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Plasma Sword (Asia 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1997, rvschool, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Rival Schools: United By Fate (Euro 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1997, rvschoolu, rvschool, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Rival Schools: United By Fate (USA 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1997, rvschoola, rvschool, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Rival Schools: United By Fate (Asia 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1997, jgakuen, rvschool, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Shiritsu Justice Gakuen: Legion of Heroes (Japan 971117)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, sfex2, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 (USA 980526)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, sfex2a, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 (Asia 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, sfex2h, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 (Hispanic 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, sfex2j, sfex2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 (Japan 980312)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, plsmaswd, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Plasma Sword: Nightmare of Bilstein (USA 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, plsmaswda, plsmaswd, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Plasma Sword: Nightmare of Bilstein (Asia 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, stargld2, plsmaswd, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Star Gladiator 2: Nightmare of Bilstein (Japan 980316)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, tgmj, cpzn2, coh3002c, zn4w, coh3002c, ROT0, "Arika / Capcom", "Tetris The Grand Master (Japan 980710)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, techromn, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Tech Romancer (Euro 980914)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, techromnu, techromn, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Tech Romancer (USA 980914)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1998, kikaioh, techromn, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Kikaioh (Japan 980914)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1999, sfex2p, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 Plus (USA 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1999, sfex2pa, sfex2p, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 Plus (Asia 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1999, sfex2pj, sfex2p, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX 2 Plus (Japan 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1998, kikaioh, techromn, coh3002c, zn6b, coh3002c, ROT0, "Capcom", "Choukou Senki Kikaioh (Japan 980914)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1999, sfex2p, cpzn2, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 Plus (USA 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1999, sfex2pa, sfex2p, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 Plus (Asia 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1999, sfex2pj, sfex2p, coh3002c, zn6b, coh3002c, ROT0, "Capcom / Arika", "Street Fighter EX2 Plus (Japan 990611)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, strider2, cpzn2, coh3002c, zn, coh3002c, ROT0, "Capcom", "Strider 2 (USA 991213)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, strider2a, strider2, coh3002c, zn, coh3002c, ROT0, "Capcom", "Strider 2 (Asia 991213)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, shiryu2, strider2, coh3002c, zn, coh3002c, ROT0, "Capcom", "Strider Hiryu 2 (Japan 991213)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) diff -Nru mame-0.144/src/mame/drivers/zodiack.c mame-0.145/src/mame/drivers/zodiack.c --- mame-0.144/src/mame/drivers/zodiack.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/drivers/zodiack.c 2012-02-06 21:30:42.000000000 +0000 @@ -85,23 +85,22 @@ ***************************************************************************/ +#define ADDRESS_MAP_MODERN + #include "emu.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "includes/zodiack.h" -static WRITE8_HANDLER( zodiack_nmi_mask_w ) +WRITE8_MEMBER( zodiack_state::nmi_mask_w ) { - zodiack_state *state = space->machine().driver_data(); - - state->m_nmi_enable = (data & 1) ^ 1; + m_nmi_enable = (data & 1) ^ 1; } -static WRITE8_HANDLER( zodiack_sound_nmi_enable_w ) +WRITE8_MEMBER( zodiack_state::sound_nmi_enable_w ) { - zodiack_state *state = space->machine().driver_data(); - state->m_sound_nmi_enabled = data & 1; + m_sound_nmi_enabled = data & 1; } @@ -126,81 +125,51 @@ } -static WRITE8_HANDLER( zodiack_master_soundlatch_w ) +WRITE8_MEMBER( zodiack_state::master_soundlatch_w ) { - zodiack_state *state = space->machine().driver_data(); soundlatch_w(space, offset, data); - device_set_input_line(state->m_audiocpu, 0, HOLD_LINE); -} - -static MACHINE_START( zodiack ) -{ - zodiack_state *state = machine.driver_data(); - - state->m_percuss_hardware = 0; - state->m_maincpu = machine.device("maincpu"); - state->m_audiocpu = machine.device("audiocpu"); - - state->save_item(NAME(state->m_sound_nmi_enabled)); -} - -static MACHINE_RESET( zodiack ) -{ - zodiack_state *state = machine.driver_data(); - - state->m_sound_nmi_enabled = FALSE; -} - -static MACHINE_START( percuss ) -{ - zodiack_state *state = machine.driver_data(); - - MACHINE_START_CALL( zodiack ); - - state->m_percuss_hardware = 1; + device_set_input_line(m_audiocpu, 0, HOLD_LINE); } - -static WRITE8_HANDLER( zodiack_control_w ) +WRITE8_MEMBER( zodiack_state::control_w ) { /* Bit 0-1 - coin counters */ - coin_counter_w(space->machine(), 0, data & 0x02); - coin_counter_w(space->machine(), 1, data & 0x01); - + coin_counter_w(machine(), 0, data & 0x02); + coin_counter_w(machine(), 1, data & 0x01); /* Bit 2 - ???? */ } -static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, zodiack_state ) AM_RANGE(0x0000, 0x4fff) AM_ROM AM_RANGE(0x5800, 0x5fff) AM_RAM - AM_RANGE(0x6081, 0x6081) AM_READ_PORT("DSW0") AM_WRITE(zodiack_control_w) + AM_RANGE(0x6081, 0x6081) AM_READ_PORT("DSW0") AM_WRITE(control_w) AM_RANGE(0x6082, 0x6082) AM_READ_PORT("DSW1") AM_RANGE(0x6083, 0x6083) AM_READ_PORT("IN0") AM_RANGE(0x6084, 0x6084) AM_READ_PORT("IN1") - AM_RANGE(0x6090, 0x6090) AM_READWRITE(soundlatch_r, zodiack_master_soundlatch_w) + AM_RANGE(0x6090, 0x6090) AM_READWRITE(soundlatch_r, master_soundlatch_w) AM_RANGE(0x7000, 0x7000) AM_READNOP AM_WRITE(watchdog_reset_w) /* NOP??? */ - AM_RANGE(0x7100, 0x7100) AM_WRITE(zodiack_nmi_mask_w) - AM_RANGE(0x7200, 0x7200) AM_WRITE(zodiack_flipscreen_w) - AM_RANGE(0x9000, 0x903f) AM_RAM_WRITE(zodiack_attributes_w) AM_BASE_MEMBER(zodiack_state, m_attributeram) - AM_RANGE(0x9040, 0x905f) AM_RAM AM_BASE_SIZE_MEMBER(zodiack_state, m_spriteram, m_spriteram_size) - AM_RANGE(0x9060, 0x907f) AM_RAM AM_BASE_SIZE_MEMBER(zodiack_state, m_bulletsram, m_bulletsram_size) + AM_RANGE(0x7100, 0x7100) AM_WRITE(nmi_mask_w) + AM_RANGE(0x7200, 0x7200) AM_WRITE(flipscreen_w) + AM_RANGE(0x9000, 0x903f) AM_RAM_WRITE(attributes_w) AM_SHARE("attributeram") + AM_RANGE(0x9040, 0x905f) AM_RAM AM_SHARE("spriteram") + AM_RANGE(0x9060, 0x907f) AM_RAM AM_SHARE("bulletsram") AM_RANGE(0x9080, 0x93ff) AM_RAM - AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(zodiack_videoram_w) AM_BASE_SIZE_MEMBER(zodiack_state, m_videoram, m_videoram_size) - AM_RANGE(0xb000, 0xb3ff) AM_RAM_WRITE(zodiack_videoram2_w) AM_BASE_MEMBER(zodiack_state, m_videoram_2) + AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") + AM_RANGE(0xb000, 0xb3ff) AM_RAM_WRITE(videoram2_w) AM_SHARE("videoram_2") AM_RANGE(0xc000, 0xcfff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8 ) +static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, zodiack_state ) AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x2000, 0x23ff) AM_RAM - AM_RANGE(0x4000, 0x4000) AM_WRITE(zodiack_sound_nmi_enable_w) + AM_RANGE(0x4000, 0x4000) AM_WRITE(sound_nmi_enable_w) AM_RANGE(0x6000, 0x6000) AM_READWRITE(soundlatch_r, soundlatch_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( io_map, AS_IO, 8 ) +static ADDRESS_MAP_START( io_map, AS_IO, 8, zodiack_state ) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x00, 0x01) AM_DEVWRITE("aysnd", ay8910_address_data_w) + AM_RANGE(0x00, 0x01) AM_DEVWRITE_LEGACY("aysnd", ay8910_address_data_w) ADDRESS_MAP_END @@ -574,6 +543,19 @@ GFXDECODE_END +void zodiack_state::machine_start() +{ + save_item(NAME(m_sound_nmi_enabled)); + save_item(NAME(m_nmi_enable)); +} + +void zodiack_state::machine_reset() +{ + m_sound_nmi_enabled = FALSE; + m_nmi_enable = 0; +} + + static MACHINE_CONFIG_START( zodiack, zodiack_state ) /* basic machine hardware */ @@ -586,23 +568,18 @@ MCFG_CPU_IO_MAP(io_map) MCFG_CPU_PERIODIC_INT(zodiack_sound_nmi_gen,8*60) /* IRQs are triggered by the main CPU */ - MCFG_MACHINE_RESET(zodiack) - MCFG_MACHINE_START(zodiack) - /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */ /* frames per second, vblank duration */) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_UPDATE_DRIVER(zodiack_state, screen_update) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE(zodiack) MCFG_GFXDECODE(zodiack) MCFG_PALETTE_LENGTH(4*8+2*8+2*1) MCFG_PALETTE_INIT(zodiack) - MCFG_VIDEO_START(zodiack) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -611,8 +588,7 @@ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( percuss, zodiack ) - MCFG_MACHINE_START(percuss) +static MACHINE_CONFIG_DERIVED_CLASS( percuss, zodiack, percuss_state ) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/drivers/zr107.c mame-0.145/src/mame/drivers/zr107.c --- mame-0.144/src/mame/drivers/zr107.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/drivers/zr107.c 2012-02-06 21:30:36.000000000 +0000 @@ -202,12 +202,12 @@ } -static SCREEN_UPDATE( jetwave ) +static SCREEN_UPDATE_RGB32( jetwave ) { - zr107_state *state = screen->machine().driver_data(); - device_t *k001604 = screen->machine().device("k001604"); + zr107_state *state = screen.machine().driver_data(); + device_t *k001604 = screen.machine().device("k001604"); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); K001005_draw(bitmap, cliprect); @@ -216,7 +216,7 @@ draw_7segment_led(bitmap, 3, 3, state->m_led_reg0); draw_7segment_led(bitmap, 9, 3, state->m_led_reg1); - sharc_set_flag_input(screen->machine().device("dsp"), 1, ASSERT_LINE); + sharc_set_flag_input(screen.machine().device("dsp"), 1, ASSERT_LINE); return 0; } @@ -255,11 +255,11 @@ K001005_init(machine); } -static SCREEN_UPDATE( zr107 ) +static SCREEN_UPDATE_RGB32( zr107 ) { - zr107_state *state = screen->machine().driver_data(); - device_t *k056832 = screen->machine().device("k056832"); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + zr107_state *state = screen.machine().driver_data(); + device_t *k056832 = screen.machine().device("k056832"); + bitmap.fill(screen.machine().pens[0], cliprect); k056832_tilemap_draw(k056832, bitmap, cliprect, 1, 0, 0); K001005_draw(bitmap, cliprect); @@ -268,7 +268,7 @@ draw_7segment_led(bitmap, 3, 3, state->m_led_reg0); draw_7segment_led(bitmap, 9, 3, state->m_led_reg1); - sharc_set_flag_input(screen->machine().device("dsp"), 1, ASSERT_LINE); + sharc_set_flag_input(screen.machine().device("dsp"), 1, ASSERT_LINE); return 0; } @@ -760,10 +760,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(zr107) + MCFG_SCREEN_UPDATE_STATIC(zr107) MCFG_PALETTE_LENGTH(65536) @@ -821,10 +820,9 @@ /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(64*8, 48*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1) - MCFG_SCREEN_UPDATE(jetwave) + MCFG_SCREEN_UPDATE_STATIC(jetwave) MCFG_PALETTE_LENGTH(65536) diff -Nru mame-0.144/src/mame/etc/jrcrypt.c mame-0.145/src/mame/etc/jrcrypt.c --- mame-0.144/src/mame/etc/jrcrypt.c 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/etc/jrcrypt.c 2012-02-06 21:30:30.000000000 +0000 @@ -16,7 +16,7 @@ #include "emu.h" #include -static int interrupt_enable; +static int irq_mask; typedef UINT16 word; typedef UINT8 byte; @@ -398,9 +398,9 @@ } #endif -WRITE8_HANDLER( jrpacman_interrupt_enable_w ) +WRITE8_HANDLER( jrpacman_interrupt_mask_w ) { - interrupt_enable = data; + irq_mask = data; } diff -Nru mame-0.144/src/mame/etc/template_device.c mame-0.145/src/mame/etc/template_device.c --- mame-0.144/src/mame/etc/template_device.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/etc/template_device.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,75 @@ +/*************************************************************************** + +Template for skeleton device + +***************************************************************************/ + +#include "emu.h" +#include "machine/xxx.h" + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type xxx = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// xxx_device - constructor +//------------------------------------------------- + +xxx_device::xxx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, xxx, "xxx", tag, owner, clock) +{ + +} + + +//------------------------------------------------- +// device_validity_check - perform validity checks +// on this device +//------------------------------------------------- + +void xxx_device::device_validity_check(validity_checker &valid) const +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void xxx_device::device_start() +{ + +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void xxx_device::device_reset() +{ +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +READ8_MEMBER( xxx_device::read ) +{ + return 0; +} + +WRITE8_MEMBER( xxx_device::write ) +{ +} diff -Nru mame-0.144/src/mame/etc/template_device.h mame-0.145/src/mame/etc/template_device.h --- mame-0.144/src/mame/etc/template_device.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/etc/template_device.h 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,57 @@ +/*************************************************************************** + +Template for skeleton device + +***************************************************************************/ + +#pragma once + +#ifndef __xxxDEV_H__ +#define __xxxDEV_H__ + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_XXX_ADD(_tag,_freq) \ + MCFG_DEVICE_ADD(_tag, xxx, _freq) \ + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> xxx_device + +class xxx_device : public device_t +{ +public: + // construction/destruction + xxx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // I/O operations + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( read ); + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start(); + virtual void device_reset(); +}; + + +// device type definition +extern const device_type xxx; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif diff -Nru mame-0.144/src/mame/etc/template_driver.c mame-0.145/src/mame/etc/template_driver.c --- mame-0.144/src/mame/etc/template_driver.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/etc/template_driver.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,178 @@ +/*************************************************************************** + +Template for skeleton drivers + +***************************************************************************/ + +#define ADDRESS_MAP_MODERN + +#include "emu.h" +#include "cpu/z80/z80.h" +//#include "sound/ay8910.h" + +#define MAIN_CLOCK XTAL_8MHz + +class xxx_state : public driver_device +{ +public: + xxx_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + // devices + required_device m_maincpu; + + // screen updates + bool screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); + + virtual void video_start(); +}; + +void xxx_state::video_start() +{ + +} + +bool xxx_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) +{ + return 0; +} + +static ADDRESS_MAP_START( xxx_map, AS_PROGRAM, 8, xxx_state ) + AM_RANGE(0x0000, 0x7fff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( xxx_io, AS_IO, 8, xxx_state ) +// ADDRESS_MAP_GLOBAL_MASK(0xff) +ADDRESS_MAP_END + +static INPUT_PORTS_START( xxx ) + /* dummy active high structure */ + PORT_START("SYSA") + PORT_DIPNAME( 0x01, 0x00, "SYSA" ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + /* dummy active low structure */ + PORT_START("DSWA") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static const gfx_layout charlayout = +{ + 8,8, + RGN_FRAC(1,1), + 1, + { RGN_FRAC(0,1) }, + { 0, 1, 2, 3, 4, 5, 6, 7 }, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, + 8*8 +}; + +static GFXDECODE_START( xxx ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 ) +GFXDECODE_END + + +void xxx_state::machine_start() +{ +} + +void xxx_state::machine_reset() +{ +} + + +static PALETTE_INIT( xxx ) +{ +} + +static MACHINE_CONFIG_START( xxx, xxx_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu",Z80,MAIN_CLOCK/2) + MCFG_CPU_PROGRAM_MAP(xxx_map) + MCFG_CPU_IO_MAP(xxx_io) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_UPDATE_DRIVER(xxx_state, screen_update) + MCFG_SCREEN_SIZE(32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + + MCFG_GFXDECODE(xxx) + + MCFG_PALETTE_INIT(xxx) + MCFG_PALETTE_LENGTH(8) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") +// MCFG_SOUND_ADD("aysnd", AY8910, MAIN_CLOCK/4) +// MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30) +MACHINE_CONFIG_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( xxx ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_REGION( 0x10000, "gfx1", ROMREGION_ERASE00 ) +ROM_END + +GAME( 198?, xxx, 0, xxx, xxx, 0, ROT0, "", "", GAME_NOT_WORKING | GAME_NO_SOUND ) diff -Nru mame-0.144/src/mame/includes/1942.h mame-0.145/src/mame/includes/1942.h --- mame-0.144/src/mame/includes/1942.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/1942.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ extern PALETTE_INIT( 1942 ); extern VIDEO_START( 1942 ); -extern SCREEN_UPDATE( 1942 ); +extern SCREEN_UPDATE_IND16( 1942 ); diff -Nru mame-0.144/src/mame/includes/1943.h mame-0.145/src/mame/includes/1943.h --- mame-0.144/src/mame/includes/1943.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/1943.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ extern PALETTE_INIT( 1943 ); extern VIDEO_START( 1943 ); -extern SCREEN_UPDATE( 1943 ); +extern SCREEN_UPDATE_IND16( 1943 ); diff -Nru mame-0.144/src/mame/includes/20pacgal.h mame-0.145/src/mame/includes/20pacgal.h --- mame-0.144/src/mame/includes/20pacgal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/20pacgal.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,6 +35,8 @@ /* 25pacman and 20pacgal store the sprite palette at a different address, this is a hardware difference and confirmed NOT to be a register */ UINT8 m_sprite_pal_base; + + UINT8 m_irq_mask; }; diff -Nru mame-0.144/src/mame/includes/3do.h mame-0.145/src/mame/includes/3do.h --- mame-0.144/src/mame/includes/3do.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/3do.h 2012-02-06 21:30:44.000000000 +0000 @@ -197,6 +197,6 @@ VIDEO_START( _3do ); -SCREEN_UPDATE( _3do ); +SCREEN_UPDATE_RGB32( _3do ); #endif /* _3DO_H_ */ diff -Nru mame-0.144/src/mame/includes/40love.h mame-0.145/src/mame/includes/40love.h --- mame-0.144/src/mame/includes/40love.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/40love.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,16 +14,16 @@ size_t m_spriteram2_size; /* video-related */ - bitmap_t *m_tmp_bitmap1; - bitmap_t *m_tmp_bitmap2; + bitmap_ind16 *m_tmp_bitmap1; + bitmap_ind16 *m_tmp_bitmap2; tilemap_t *m_bg_tilemap; UINT8 m_flipscreen; UINT8 m_pix_redraw; UINT8 m_xoffset; UINT8 *m_pixram1; UINT8 *m_pixram2; - bitmap_t *m_pixel_bitmap1; - bitmap_t *m_pixel_bitmap2; + bitmap_ind16 *m_pixel_bitmap1; + bitmap_ind16 *m_pixel_bitmap2; int m_pixram_sel; /* sound-related */ @@ -67,5 +67,5 @@ WRITE8_HANDLER( fortyl_pixram_w ); VIDEO_START( fortyl ); -SCREEN_UPDATE( fortyl ); +SCREEN_UPDATE_IND16( fortyl ); PALETTE_INIT( fortyl ); diff -Nru mame-0.144/src/mame/includes/4enraya.h mame-0.145/src/mame/includes/4enraya.h --- mame-0.144/src/mame/includes/4enraya.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/4enraya.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,7 +8,7 @@ { public: _4enraya_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), m_snd_latch_bit(4) { } /* memory pointers */ UINT8 m_videoram[0x1000]; @@ -20,6 +20,9 @@ /* sound-related */ int m_soundlatch; int m_last_snd_ctrl; + int m_videoram_size; + + int m_snd_latch_bit; }; @@ -28,4 +31,4 @@ WRITE8_HANDLER( fenraya_videoram_w ); VIDEO_START( 4enraya ); -SCREEN_UPDATE( 4enraya ); +SCREEN_UPDATE_IND16( 4enraya ); diff -Nru mame-0.144/src/mame/includes/8080bw.h mame-0.145/src/mame/includes/8080bw.h --- mame-0.144/src/mame/includes/8080bw.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/8080bw.h 2012-02-06 21:30:44.000000000 +0000 @@ -91,15 +91,15 @@ MACHINE_START( extra_8080bw_vh ); -SCREEN_UPDATE( invadpt2 ); -SCREEN_UPDATE( ballbomb ); -SCREEN_UPDATE( schaser ); -SCREEN_UPDATE( schasercv ); -SCREEN_UPDATE( rollingc ); -SCREEN_UPDATE( polaris ); -SCREEN_UPDATE( lupin3 ); -SCREEN_UPDATE( cosmo ); -SCREEN_UPDATE( indianbt ); -SCREEN_UPDATE( shuttlei ); -SCREEN_UPDATE( sflush ); +SCREEN_UPDATE_RGB32( invadpt2 ); +SCREEN_UPDATE_RGB32( ballbomb ); +SCREEN_UPDATE_RGB32( schaser ); +SCREEN_UPDATE_RGB32( schasercv ); +SCREEN_UPDATE_RGB32( rollingc ); +SCREEN_UPDATE_RGB32( polaris ); +SCREEN_UPDATE_RGB32( lupin3 ); +SCREEN_UPDATE_RGB32( cosmo ); +SCREEN_UPDATE_RGB32( indianbt ); +SCREEN_UPDATE_RGB32( shuttlei ); +SCREEN_UPDATE_RGB32( sflush ); diff -Nru mame-0.144/src/mame/includes/88games.h mame-0.145/src/mame/includes/88games.h --- mame-0.144/src/mame/includes/88games.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/88games.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ void _88games_tile_callback(running_machine &machine, int layer, int bank, int *code, int *color, int *flags, int *priority); void _88games_zoom_callback(running_machine &machine, int *code, int *color, int *flags); -SCREEN_UPDATE( 88games ); +SCREEN_UPDATE_IND16( 88games ); diff -Nru mame-0.144/src/mame/includes/actfancr.h mame-0.145/src/mame/includes/actfancr.h --- mame-0.144/src/mame/includes/actfancr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/actfancr.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,5 +38,5 @@ WRITE8_HANDLER( actfancr_pf2_control_w ); VIDEO_START( actfancr ); -SCREEN_UPDATE( actfancr ); +SCREEN_UPDATE_IND16( actfancr ); diff -Nru mame-0.144/src/mame/includes/aeroboto.h mame-0.145/src/mame/includes/aeroboto.h --- mame-0.144/src/mame/includes/aeroboto.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/aeroboto.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,7 +44,7 @@ /*----------- defined in video/aeroboto.c -----------*/ VIDEO_START( aeroboto ); -SCREEN_UPDATE( aeroboto ); +SCREEN_UPDATE_IND16( aeroboto ); READ8_HANDLER( aeroboto_in0_r ); WRITE8_HANDLER( aeroboto_3000_w ); diff -Nru mame-0.144/src/mame/includes/aerofgt.h mame-0.145/src/mame/includes/aerofgt.h --- mame-0.144/src/mame/includes/aerofgt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/aerofgt.h 2012-02-06 21:30:44.000000000 +0000 @@ -66,13 +66,13 @@ VIDEO_START( spinlbrk ); VIDEO_START( turbofrc ); VIDEO_START( wbbc97 ); -SCREEN_UPDATE( pspikes ); -SCREEN_UPDATE( pspikesb ); -SCREEN_UPDATE( spikes91 ); -SCREEN_UPDATE( karatblz ); -SCREEN_UPDATE( spinlbrk ); -SCREEN_UPDATE( turbofrc ); -SCREEN_UPDATE( aerofgt ); -SCREEN_UPDATE( aerfboot ); -SCREEN_UPDATE( aerfboo2 ); -SCREEN_UPDATE( wbbc97 ); +SCREEN_UPDATE_IND16( pspikes ); +SCREEN_UPDATE_IND16( pspikesb ); +SCREEN_UPDATE_IND16( spikes91 ); +SCREEN_UPDATE_IND16( karatblz ); +SCREEN_UPDATE_IND16( spinlbrk ); +SCREEN_UPDATE_IND16( turbofrc ); +SCREEN_UPDATE_IND16( aerofgt ); +SCREEN_UPDATE_IND16( aerfboot ); +SCREEN_UPDATE_IND16( aerfboo2 ); +SCREEN_UPDATE_RGB32( wbbc97 ); diff -Nru mame-0.144/src/mame/includes/airbustr.h mame-0.145/src/mame/includes/airbustr.h --- mame-0.144/src/mame/includes/airbustr.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/airbustr.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,7 +21,7 @@ /* video-related */ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; - bitmap_t *m_sprites_bitmap; + bitmap_ind16 m_sprites_bitmap; int m_bg_scrollx; int m_bg_scrolly; int m_fg_scrollx; @@ -49,5 +49,5 @@ WRITE8_HANDLER( airbustr_scrollregs_w ); VIDEO_START( airbustr ); -SCREEN_UPDATE( airbustr ); -SCREEN_EOF( airbustr ); +SCREEN_UPDATE_IND16( airbustr ); +SCREEN_VBLANK( airbustr ); diff -Nru mame-0.144/src/mame/includes/ajax.h mame-0.145/src/mame/includes/ajax.h --- mame-0.144/src/mame/includes/ajax.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ajax.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,7 +41,7 @@ /*----------- defined in video/ajax.c -----------*/ VIDEO_START( ajax ); -SCREEN_UPDATE( ajax ); +SCREEN_UPDATE_IND16( ajax ); extern void ajax_tile_callback(running_machine &machine, int layer,int bank,int *code,int *color,int *flags,int *priority); extern void ajax_sprite_callback(running_machine &machine, int *code,int *color,int *priority,int *shadow); diff -Nru mame-0.144/src/mame/includes/aliens.h mame-0.145/src/mame/includes/aliens.h --- mame-0.144/src/mame/includes/aliens.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/aliens.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ extern void aliens_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask,int *shadow); VIDEO_START( aliens ); -SCREEN_UPDATE( aliens ); +SCREEN_UPDATE_IND16( aliens ); diff -Nru mame-0.144/src/mame/includes/alpha68k.h mame-0.145/src/mame/includes/alpha68k.h --- mame-0.144/src/mame/includes/alpha68k.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/alpha68k.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,6 +40,8 @@ /* devices */ device_t *m_audiocpu; + UINT8 m_sound_nmi_mask; + UINT8 m_sound_pa_latch; }; /* game_id - used to deal with a few game specific situations */ @@ -58,12 +60,12 @@ VIDEO_START( alpha68k ); -SCREEN_UPDATE( kyros ); -SCREEN_UPDATE( sstingry ); -SCREEN_UPDATE( alpha68k_I ); -SCREEN_UPDATE( alpha68k_II ); -SCREEN_UPDATE( alpha68k_V ); -SCREEN_UPDATE( alpha68k_V_sb ); +SCREEN_UPDATE_IND16( kyros ); +SCREEN_UPDATE_IND16( sstingry ); +SCREEN_UPDATE_IND16( alpha68k_I ); +SCREEN_UPDATE_IND16( alpha68k_II ); +SCREEN_UPDATE_IND16( alpha68k_V ); +SCREEN_UPDATE_IND16( alpha68k_V_sb ); void alpha68k_V_video_bank_w(running_machine &machine, int bank); void alpha68k_flipscreen_w(running_machine &machine, int flip); diff -Nru mame-0.144/src/mame/includes/ambush.h mame-0.145/src/mame/includes/ambush.h --- mame-0.144/src/mame/includes/ambush.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ambush.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,4 +25,4 @@ /*----------- defined in video/ambush.c -----------*/ PALETTE_INIT( ambush ); -SCREEN_UPDATE( ambush ); +SCREEN_UPDATE_IND16( ambush ); diff -Nru mame-0.144/src/mame/includes/amiga.h mame-0.145/src/mame/includes/amiga.h --- mame-0.144/src/mame/includes/amiga.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/amiga.h 2012-02-06 21:30:44.000000000 +0000 @@ -474,23 +474,23 @@ PALETTE_INIT( amiga ); VIDEO_START( amiga ); -SCREEN_UPDATE( amiga ); +SCREEN_UPDATE_IND16( amiga ); void amiga_copper_setpc(running_machine &machine, UINT32 pc); int amiga_copper_execute_next(running_machine &machine, int xpos); UINT32 amiga_gethvpos(screen_device &screen); void amiga_set_genlock_color(running_machine &machine, UINT16 color); -void amiga_render_scanline(running_machine &machine, bitmap_t *bitmap, int scanline); +void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int scanline); void amiga_sprite_dma_reset(running_machine &machine, int which); void amiga_sprite_enable_comparitor(running_machine &machine, int which, int enable); /*----------- defined in video/amigaaga.c -----------*/ VIDEO_START( amiga_aga ); -SCREEN_UPDATE( amiga_aga ); +SCREEN_UPDATE_RGB32( amiga_aga ); -void amiga_aga_render_scanline(running_machine &machine, bitmap_t *bitmap, int scanline); +void amiga_aga_render_scanline(running_machine &machine, bitmap_rgb32 &bitmap, int scanline); void amiga_aga_palette_write(running_machine &machine, int color_reg, UINT16 data); void amiga_aga_diwhigh_written(running_machine &machine, int written); diff -Nru mame-0.144/src/mame/includes/ampoker2.h mame-0.145/src/mame/includes/ampoker2.h --- mame-0.144/src/mame/includes/ampoker2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ampoker2.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,4 +15,4 @@ PALETTE_INIT( ampoker2 ); VIDEO_START( ampoker2 ); VIDEO_START( sigma2k ); -SCREEN_UPDATE( ampoker2 ); +SCREEN_UPDATE_IND16( ampoker2 ); diff -Nru mame-0.144/src/mame/includes/amspdwy.h mame-0.145/src/mame/includes/amspdwy.h --- mame-0.144/src/mame/includes/amspdwy.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/amspdwy.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE8_HANDLER( amspdwy_flipscreen_w ); VIDEO_START( amspdwy ); -SCREEN_UPDATE( amspdwy ); +SCREEN_UPDATE_IND16( amspdwy ); diff -Nru mame-0.144/src/mame/includes/angelkds.h mame-0.145/src/mame/includes/angelkds.h --- mame-0.144/src/mame/includes/angelkds.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/angelkds.h 2012-02-06 21:30:44.000000000 +0000 @@ -49,4 +49,4 @@ WRITE8_HANDLER( angelkds_layer_ctrl_write ); VIDEO_START( angelkds ); -SCREEN_UPDATE( angelkds ); +SCREEN_UPDATE_IND16( angelkds ); diff -Nru mame-0.144/src/mame/includes/appoooh.h mame-0.145/src/mame/includes/appoooh.h --- mame-0.144/src/mame/includes/appoooh.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/appoooh.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,8 @@ /* devices */ device_t *m_adpcm; + + UINT8 m_nmi_mask; }; #define CHR1_OFST 0x00 /* palette page of char set #1 */ @@ -43,5 +45,5 @@ WRITE8_HANDLER( appoooh_scroll_w ); WRITE8_HANDLER( appoooh_out_w ); VIDEO_START( appoooh ); -SCREEN_UPDATE( appoooh ); -SCREEN_UPDATE( robowres ); +SCREEN_UPDATE_IND16( appoooh ); +SCREEN_UPDATE_IND16( robowres ); diff -Nru mame-0.144/src/mame/includes/aquarium.h mame-0.145/src/mame/includes/aquarium.h --- mame-0.144/src/mame/includes/aquarium.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/aquarium.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ WRITE16_HANDLER( aquarium_bak_videoram_w ); VIDEO_START(aquarium); -SCREEN_UPDATE(aquarium); +SCREEN_UPDATE_IND16(aquarium); diff -Nru mame-0.144/src/mame/includes/arabian.h mame-0.145/src/mame/includes/arabian.h --- mame-0.144/src/mame/includes/arabian.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/arabian.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( arabian ); VIDEO_START( arabian ); -SCREEN_UPDATE( arabian ); +SCREEN_UPDATE_IND16( arabian ); diff -Nru mame-0.144/src/mame/includes/arcadecl.h mame-0.145/src/mame/includes/arcadecl.h --- mame-0.144/src/mame/includes/arcadecl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/arcadecl.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,4 +20,4 @@ /*----------- defined in video/arcadecl.c -----------*/ VIDEO_START( arcadecl ); -SCREEN_UPDATE( arcadecl ); +SCREEN_UPDATE_IND16( arcadecl ); diff -Nru mame-0.144/src/mame/includes/archimds.h mame-0.145/src/mame/includes/archimds.h --- mame-0.144/src/mame/includes/archimds.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/archimds.h 2012-02-06 21:30:44.000000000 +0000 @@ -107,7 +107,7 @@ /*----------- defined in video/archimds.c -----------*/ extern VIDEO_START( archimds_vidc ); -extern SCREEN_UPDATE( archimds_vidc ); +extern SCREEN_UPDATE_RGB32( archimds_vidc ); #define VIDC_HCR 0x80 #define VIDC_HSWR 0x84 diff -Nru mame-0.144/src/mame/includes/argus.h mame-0.145/src/mame/includes/argus.h --- mame-0.144/src/mame/includes/argus.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/argus.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,7 +29,7 @@ int m_lowbitscroll; int m_prvscrollx; UINT8 m_valtric_mosaic; - bitmap_t *m_mosaicbitmap; + bitmap_rgb32 m_mosaicbitmap; UINT8 m_valtric_unknown; UINT8 m_butasan_unknown; int m_mosaic; @@ -46,9 +46,9 @@ VIDEO_RESET( argus ); VIDEO_RESET( valtric ); VIDEO_RESET( butasan ); -SCREEN_UPDATE( argus ); -SCREEN_UPDATE( valtric ); -SCREEN_UPDATE( butasan ); +SCREEN_UPDATE_RGB32( argus ); +SCREEN_UPDATE_RGB32( valtric ); +SCREEN_UPDATE_RGB32( butasan ); READ8_HANDLER( argus_txram_r ); READ8_HANDLER( argus_bg1ram_r ); diff -Nru mame-0.144/src/mame/includes/arkanoid.h mame-0.145/src/mame/includes/arkanoid.h --- mame-0.144/src/mame/includes/arkanoid.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/arkanoid.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,8 +58,8 @@ extern WRITE8_HANDLER( hexa_d008_w ); extern VIDEO_START( arkanoid ); -extern SCREEN_UPDATE( arkanoid ); -extern SCREEN_UPDATE( hexa ); +extern SCREEN_UPDATE_IND16( arkanoid ); +extern SCREEN_UPDATE_IND16( hexa ); /*----------- defined in machine/arkanoid.c -----------*/ diff -Nru mame-0.144/src/mame/includes/armedf.h mame-0.145/src/mame/includes/armedf.h --- mame-0.144/src/mame/includes/armedf.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/armedf.h 2012-02-06 21:30:44.000000000 +0000 @@ -46,8 +46,8 @@ /*----------- defined in video/armedf.c -----------*/ -SCREEN_UPDATE( armedf ); -SCREEN_EOF( armedf ); +SCREEN_UPDATE_IND16( armedf ); +SCREEN_VBLANK( armedf ); VIDEO_START( armedf ); VIDEO_START( terraf ); diff -Nru mame-0.144/src/mame/includes/artmagic.h mame-0.145/src/mame/includes/artmagic.h --- mame-0.144/src/mame/includes/artmagic.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/artmagic.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,4 +43,4 @@ READ16_HANDLER( artmagic_blitter_r ); WRITE16_HANDLER( artmagic_blitter_w ); -void artmagic_scanline(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void artmagic_scanline(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); diff -Nru mame-0.144/src/mame/includes/ashnojoe.h mame-0.145/src/mame/includes/ashnojoe.h --- mame-0.144/src/mame/includes/ashnojoe.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ashnojoe.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,4 +54,4 @@ WRITE16_HANDLER( joe_tilemaps_yscroll_w ); VIDEO_START( ashnojoe ); -SCREEN_UPDATE( ashnojoe ); +SCREEN_UPDATE_IND16( ashnojoe ); diff -Nru mame-0.144/src/mame/includes/asterix.h mame-0.145/src/mame/includes/asterix.h --- mame-0.144/src/mame/includes/asterix.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/asterix.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,7 +38,7 @@ /*----------- defined in video/asterix.c -----------*/ -SCREEN_UPDATE( asterix ); +SCREEN_UPDATE_IND16( asterix ); WRITE16_HANDLER( asterix_spritebank_w ); extern void asterix_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); diff -Nru mame-0.144/src/mame/includes/astrocde.h mame-0.145/src/mame/includes/astrocde.h --- mame-0.144/src/mame/includes/astrocde.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/astrocde.h 2012-02-06 21:30:44.000000000 +0000 @@ -78,8 +78,8 @@ VIDEO_START( astrocde ); VIDEO_START( profpac ); -SCREEN_UPDATE( astrocde ); -SCREEN_UPDATE( profpac ); +SCREEN_UPDATE_IND16( astrocde ); +SCREEN_UPDATE_IND16( profpac ); WRITE8_HANDLER( astrocade_pattern_board_w ); READ8_HANDLER( astrocade_data_chip_register_r ); diff -Nru mame-0.144/src/mame/includes/asuka.h mame-0.145/src/mame/includes/asuka.h --- mame-0.144/src/mame/includes/asuka.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/asuka.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,5 +51,5 @@ WRITE16_HANDLER( asuka_spritectrl_w ); -SCREEN_UPDATE( asuka ); -SCREEN_UPDATE( bonzeadv ); +SCREEN_UPDATE_IND16( asuka ); +SCREEN_UPDATE_IND16( bonzeadv ); diff -Nru mame-0.144/src/mame/includes/atarifb.h mame-0.145/src/mame/includes/atarifb.h --- mame-0.144/src/mame/includes/atarifb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarifb.h 2012-02-06 21:30:44.000000000 +0000 @@ -84,9 +84,9 @@ /*----------- defined in video/atarifb.c -----------*/ VIDEO_START( atarifb ); -SCREEN_UPDATE( atarifb ); -SCREEN_UPDATE( abaseb ); -SCREEN_UPDATE( soccer ); +SCREEN_UPDATE_IND16( atarifb ); +SCREEN_UPDATE_IND16( abaseb ); +SCREEN_UPDATE_IND16( soccer ); WRITE8_HANDLER( atarifb_alpha1_videoram_w ); WRITE8_HANDLER( atarifb_alpha2_videoram_w ); diff -Nru mame-0.144/src/mame/includes/atarig1.h mame-0.145/src/mame/includes/atarig1.h --- mame-0.144/src/mame/includes/atarig1.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/atarig1.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,7 +37,7 @@ WRITE16_HANDLER( atarig1_mo_control_w ); VIDEO_START( atarig1 ); -SCREEN_EOF( atarig1 ); -SCREEN_UPDATE( atarig1 ); +SCREEN_VBLANK( atarig1 ); +SCREEN_UPDATE_IND16( atarig1 ); void atarig1_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/atarig42.h mame-0.145/src/mame/includes/atarig42.h --- mame-0.144/src/mame/includes/atarig42.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarig42.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,8 +37,8 @@ /*----------- defined in video/atarig42.c -----------*/ VIDEO_START( atarig42 ); -SCREEN_EOF( atarig42 ); -SCREEN_UPDATE( atarig42 ); +SCREEN_VBLANK( atarig42 ); +SCREEN_UPDATE_IND16( atarig42 ); WRITE16_HANDLER( atarig42_mo_control_w ); diff -Nru mame-0.144/src/mame/includes/atarigt.h mame-0.145/src/mame/includes/atarigt.h --- mame-0.144/src/mame/includes/atarigt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarigt.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,8 +22,8 @@ UINT8 m_is_primrage; UINT16 * m_colorram; - bitmap_t * m_pf_bitmap; - bitmap_t * m_an_bitmap; + bitmap_ind16 * m_pf_bitmap; + bitmap_ind16 * m_an_bitmap; UINT8 m_playfield_tile_bank; UINT8 m_playfield_color_bank; @@ -55,7 +55,7 @@ UINT16 atarigt_colorram_r(atarigt_state *state, offs_t address); VIDEO_START( atarigt ); -SCREEN_EOF( atarigt ); -SCREEN_UPDATE( atarigt ); +SCREEN_VBLANK( atarigt ); +SCREEN_UPDATE_RGB32( atarigt ); void atarigt_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/atarigx2.h mame-0.145/src/mame/includes/atarigx2.h --- mame-0.144/src/mame/includes/atarigx2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarigx2.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,8 +33,8 @@ /*----------- defined in video/atarigx2.c -----------*/ VIDEO_START( atarigx2 ); -SCREEN_EOF( atarigx2 ); -SCREEN_UPDATE( atarigx2 ); +SCREEN_VBLANK( atarigx2 ); +SCREEN_UPDATE_IND16( atarigx2 ); WRITE16_HANDLER( atarigx2_mo_control_w ); diff -Nru mame-0.144/src/mame/includes/atari.h mame-0.145/src/mame/includes/atari.h --- mame-0.144/src/mame/includes/atari.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atari.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,6 +22,8 @@ READ8_DEVICE_HANDLER(atari_pia_pa_r); READ8_DEVICE_HANDLER(atari_pia_pb_r); WRITE8_DEVICE_HANDLER(a600xl_pia_pb_w); +WRITE_LINE_DEVICE_HANDLER(atari_pia_cb2_w); + /* This is needed in MESS as well for Atari 8bit drivers */ void atari_machine_start(running_machine &machine); @@ -257,6 +259,7 @@ UINT8 *uc_g1; /* used colors for gfx GTIA 1 */ UINT8 *uc_g2; /* used colors for gfx GTIA 2 */ UINT8 *uc_g3; /* used colors for gfx GTIA 3 */ + bitmap_ind16 *bitmap; } ANTIC; #define RDANTIC(space) space->read_byte(antic.dpage+antic.doffs) @@ -586,18 +589,14 @@ extern int atari_frame_counter; extern VIDEO_START( atari ); -extern SCREEN_UPDATE( atari ); +extern SCREEN_UPDATE_IND16( atari ); -INTERRUPT_GEN( a400_interrupt ); -INTERRUPT_GEN( a800_interrupt ); -INTERRUPT_GEN( a800xl_interrupt ); -INTERRUPT_GEN( a5200_interrupt ); +TIMER_DEVICE_CALLBACK( a400_interrupt ); +TIMER_DEVICE_CALLBACK( a800_interrupt ); +TIMER_DEVICE_CALLBACK( a800xl_interrupt ); +TIMER_DEVICE_CALLBACK( a5200_interrupt ); extern PALETTE_INIT( atari ); -/*----------- defined in drivers/maxaflex.c -----------*/ - -int atari_input_disabled(running_machine &machine); - #endif /* ATARI_H */ diff -Nru mame-0.144/src/mame/includes/atarisy1.h mame-0.145/src/mame/includes/atarisy1.h --- mame-0.144/src/mame/includes/atarisy1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarisy1.h 2012-02-06 21:30:44.000000000 +0000 @@ -60,4 +60,4 @@ WRITE16_HANDLER( atarisy1_priority_w ); VIDEO_START( atarisy1 ); -SCREEN_UPDATE( atarisy1 ); +SCREEN_UPDATE_IND16( atarisy1 ); diff -Nru mame-0.144/src/mame/includes/atarisy2.h mame-0.145/src/mame/includes/atarisy2.h --- mame-0.144/src/mame/includes/atarisy2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atarisy2.h 2012-02-06 21:30:44.000000000 +0000 @@ -60,4 +60,4 @@ WRITE16_HANDLER( atarisy2_paletteram_w ); VIDEO_START( atarisy2 ); -SCREEN_UPDATE( atarisy2 ); +SCREEN_UPDATE_IND16( atarisy2 ); diff -Nru mame-0.144/src/mame/includes/atetris.h mame-0.145/src/mame/includes/atetris.h --- mame-0.144/src/mame/includes/atetris.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/atetris.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,6 +24,6 @@ /*----------- defined in video/atetris.c -----------*/ VIDEO_START( atetris ); -SCREEN_UPDATE( atetris ); +SCREEN_UPDATE_IND16( atetris ); WRITE8_HANDLER( atetris_videoram_w ); diff -Nru mame-0.144/src/mame/includes/badlands.h mame-0.145/src/mame/includes/badlands.h --- mame-0.144/src/mame/includes/badlands.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/badlands.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ WRITE16_HANDLER( badlands_pf_bank_w ); VIDEO_START( badlands ); -SCREEN_UPDATE( badlands ); +SCREEN_UPDATE_IND16( badlands ); diff -Nru mame-0.144/src/mame/includes/bagman.h mame-0.145/src/mame/includes/bagman.h --- mame-0.144/src/mame/includes/bagman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bagman.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,8 @@ tilemap_t *m_bg_tilemap; UINT8 *m_spriteram; size_t m_spriteram_size; + + UINT8 m_irq_mask; }; @@ -64,4 +66,4 @@ PALETTE_INIT( bagman ); VIDEO_START( bagman ); -SCREEN_UPDATE( bagman ); +SCREEN_UPDATE_IND16( bagman ); diff -Nru mame-0.144/src/mame/includes/balsente.h mame-0.145/src/mame/includes/balsente.h --- mame-0.144/src/mame/includes/balsente.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/balsente.h 2012-02-06 21:30:44.000000000 +0000 @@ -182,7 +182,7 @@ /*----------- defined in video/balsente.c -----------*/ VIDEO_START( balsente ); -SCREEN_UPDATE( balsente ); +SCREEN_UPDATE_IND16( balsente ); WRITE8_HANDLER( balsente_videoram_w ); WRITE8_HANDLER( balsente_paletteram_w ); diff -Nru mame-0.144/src/mame/includes/bankp.h mame-0.145/src/mame/includes/bankp.h --- mame-0.144/src/mame/includes/bankp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bankp.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,8 @@ tilemap_t *m_fg_tilemap; int m_scroll_x; int m_priority; + + UINT8 m_nmi_mask; }; @@ -40,6 +42,6 @@ PALETTE_INIT( bankp ); VIDEO_START( bankp ); -SCREEN_UPDATE( bankp ); +SCREEN_UPDATE_IND16( bankp ); diff -Nru mame-0.144/src/mame/includes/baraduke.h mame-0.145/src/mame/includes/baraduke.h --- mame-0.144/src/mame/includes/baraduke.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/baraduke.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,8 +20,8 @@ /*----------- defined in video/baraduke.c -----------*/ VIDEO_START( baraduke ); -SCREEN_UPDATE( baraduke ); -SCREEN_EOF( baraduke ); +SCREEN_UPDATE_IND16( baraduke ); +SCREEN_VBLANK( baraduke ); READ8_HANDLER( baraduke_videoram_r ); WRITE8_HANDLER( baraduke_videoram_w ); READ8_HANDLER( baraduke_textram_r ); diff -Nru mame-0.144/src/mame/includes/batman.h mame-0.145/src/mame/includes/batman.h --- mame-0.144/src/mame/includes/batman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/batman.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,6 +21,6 @@ /*----------- defined in video/batman.c -----------*/ VIDEO_START( batman ); -SCREEN_UPDATE( batman ); +SCREEN_UPDATE_IND16( batman ); void batman_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/battlane.h mame-0.145/src/mame/includes/battlane.h --- mame-0.144/src/mame/includes/battlane.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/battlane.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,7 +16,7 @@ /* video-related */ tilemap_t *m_bg_tilemap; - bitmap_t *m_screen_bitmap; + bitmap_ind8 m_screen_bitmap; int m_video_ctrl; int m_cpu_control; /* CPU interrupt control register */ @@ -37,4 +37,4 @@ WRITE8_HANDLER( battlane_video_ctrl_w ); VIDEO_START( battlane ); -SCREEN_UPDATE( battlane ); +SCREEN_UPDATE_IND16( battlane ); diff -Nru mame-0.144/src/mame/includes/battlera.h mame-0.145/src/mame/includes/battlera.h --- mame-0.144/src/mame/includes/battlera.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/battlera.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: battlera_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } int m_control_port_select; int m_msm5205next; @@ -12,8 +14,8 @@ int m_vram_ptr; UINT8 *m_HuC6270_vram; UINT8 *m_vram_dirty; - bitmap_t *m_tile_bitmap; - bitmap_t *m_front_bitmap; + bitmap_ind16 *m_tile_bitmap; + bitmap_ind16 *m_front_bitmap; UINT32 m_tile_dirtyseq; int m_current_scanline; int m_inc_value; @@ -23,14 +25,16 @@ int m_bb_enable; int m_bldwolf_vblank; UINT8 m_blank_tile[32]; + + required_device m_maincpu; }; /*----------- defined in video/battlera.c -----------*/ -SCREEN_UPDATE( battlera ); +SCREEN_UPDATE_IND16( battlera ); VIDEO_START( battlera ); -INTERRUPT_GEN( battlera_interrupt ); +TIMER_DEVICE_CALLBACK( battlera_irq ); READ8_HANDLER( HuC6270_register_r ); WRITE8_HANDLER( HuC6270_register_w ); diff -Nru mame-0.144/src/mame/includes/battlex.h mame-0.145/src/mame/includes/battlex.h --- mame-0.144/src/mame/includes/battlex.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/battlex.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ extern WRITE8_HANDLER( battlex_flipscreen_w ); extern VIDEO_START( battlex ); -extern SCREEN_UPDATE( battlex ); +extern SCREEN_UPDATE_IND16( battlex ); diff -Nru mame-0.144/src/mame/includes/battlnts.h mame-0.145/src/mame/includes/battlnts.h --- mame-0.144/src/mame/includes/battlnts.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/battlnts.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ WRITE8_HANDLER( battlnts_spritebank_w ); -SCREEN_UPDATE( battlnts ); +SCREEN_UPDATE_IND16( battlnts ); void battlnts_tile_callback(running_machine &machine, int layer, int bank, int *code, int *color, int *flags); void battlnts_sprite_callback(running_machine &machine, int *code, int *color); diff -Nru mame-0.144/src/mame/includes/bbusters.h mame-0.145/src/mame/includes/bbusters.h --- mame-0.144/src/mame/includes/bbusters.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bbusters.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,8 +28,8 @@ VIDEO_START( bbuster ); VIDEO_START( mechatt ); -SCREEN_UPDATE( bbuster ); -SCREEN_UPDATE( mechatt ); +SCREEN_UPDATE_IND16( bbuster ); +SCREEN_UPDATE_IND16( mechatt ); WRITE16_HANDLER( bbusters_pf1_w ); WRITE16_HANDLER( bbusters_pf2_w ); diff -Nru mame-0.144/src/mame/includes/beathead.h mame-0.145/src/mame/includes/beathead.h --- mame-0.144/src/mame/includes/beathead.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/beathead.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,7 +20,8 @@ virtual void machine_reset(); virtual void video_start(); - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); required_device m_maincpu; diff -Nru mame-0.144/src/mame/includes/beezer.h mame-0.145/src/mame/includes/beezer.h --- mame-0.144/src/mame/includes/beezer.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/beezer.h 2012-02-06 21:30:44.000000000 +0000 @@ -9,7 +9,8 @@ UINT8 *m_videoram; int m_pbus; int m_banklatch; - int m_scanline; + + device_t *m_maincpu; }; @@ -33,7 +34,7 @@ /*----------- defined in video/beezer.c -----------*/ -INTERRUPT_GEN( beezer_interrupt ); -SCREEN_UPDATE( beezer ); +TIMER_DEVICE_CALLBACK( beezer_interrupt ); +SCREEN_UPDATE_IND16( beezer ); WRITE8_HANDLER( beezer_map_w ); READ8_HANDLER( beezer_line_r ); diff -Nru mame-0.144/src/mame/includes/bfm_sc45.h mame-0.145/src/mame/includes/bfm_sc45.h --- mame-0.144/src/mame/includes/bfm_sc45.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/includes/bfm_sc45.h 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,2854 @@ +/* Scorpion 4 + 5 driver releated includes */ +/* mainly used for stuff which is currently shared between sc4 / 5 sets to avoid duplication */ + +#define sc_ivply_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004313.snd", 0x0000, 0x080000, CRC(28faed9e) SHA1(624d6cfcc97dd1950b5d908cde2e4d2eb6ea1dc6) ) \ + +#define sc_plays_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891106.bin", 0x0000, 0x5000, CRC(1f616820) SHA1(c0b19d4243f250c3159564c65e9a2247e61e315f) ) \ + ROM_LOAD( "95891107.bin", 0x0000, 0x5000, CRC(6af72c14) SHA1(4666e338fc629a32178f617c8536e7f11d703b14) ) \ + ROM_LOAD( "95891108.bin", 0x0000, 0x5000, CRC(f44de048) SHA1(783ae2b12e8e548a90f626a2050968e3f38b6042) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009013.bin", 0x0000, 0x0f3ee2, CRC(f324a590) SHA1(0533af3304100c99af5fdeba2773d92384101f43) ) \ + +#define sc_a40_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890123.bin", 0x0000, 0x5000, CRC(e3f5466e) SHA1(ae2f45f79d0113e651b8cf5f655a9ceb32a3ddaa) ) \ + ROM_LOAD( "95890124.bin", 0x0000, 0x5000, CRC(9663025a) SHA1(097246412fd4084c1185d8dfd91e884abc5a3f8a) ) \ + ROM_LOAD( "95890125.bin", 0x0000, 0x5000, CRC(08d9ce06) SHA1(9087170d6c6edad735ab5a2abbc0a2191aabfd03) ) \ + ROM_REGION( 0x1000000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008511.bin", 0x0000, 0x0ff5c3, CRC(6fac2014) SHA1(5b364406f7b5d8f4c54561e3977571e4a47273a0) ) \ + +#define sc_acesh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008292.bin", 0x0000, 0x100000, CRC(1c238098) SHA1(e2e2cb52ea84a7dc5e557b61b3ee21bd5a063833) ) \ + +#define sc_adjb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008699.bin", 0x0000, 0x100000, CRC(6d49b54a) SHA1(d64caa1dae40c3bf536f8739d6995b589c7184b7) ) \ + ROM_LOAD( "95008700.bin", 0x0000, 0x100000, CRC(49c37b2a) SHA1(5a59a540becb8c83288ae3a15cfac069fd792e74) ) \ + +#define sc_adga_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_adgtc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_adren_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_alad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008075.bin", 0x0000, 0x080000, CRC(c9306583) SHA1(8bccb9529e7d24be7b4f3ffda0d35780a170be43) ) \ + +#define sc_adsnt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008478.bin", 0x0000, 0x100000, CRC(d8aa3daf) SHA1(dafeb014f04179882921622df9b5c9917279bd02) ) \ + ROM_LOAD( "95008479.bin", 0x0000, 0x100000, CRC(f1ec9928) SHA1(cd2eb8115217c205f248564c9340353c84db2ac5) ) \ + +#define sc_a40cl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008527.bin", 0x0000, 0x0ff5c3, CRC(6fac2014) SHA1(5b364406f7b5d8f4c54561e3977571e4a47273a0) ) \ + +#define sc_adwta_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_aztec_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004286.snd", 0x0000, 0x080000, CRC(20de4ebe) SHA1(0ea12d0c46f90efd8b040c2374d749fb7b15698e) ) \ + +#define sc_bjob_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009126.bin", 0x0000, 0x100000, CRC(55940c44) SHA1(e4f2f36ccf28446011e43f5c8a72fa9d15f72df0) ) \ + ROM_LOAD( "95009127.bin", 0x0000, 0x100000, CRC(0d3ee6d9) SHA1(a40bffaf631010d53ce9228758bbf5dba8423f6e) ) \ + +#define sc_bkngx_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890139.bin", 0x0000, 0x5000, CRC(03d69c54) SHA1(9e1e79378874092a19eb31af8d8b5b2422364086) ) \ + ROM_LOAD( "95890140.bin", 0x0000, 0x5000, CRC(1f006ce8) SHA1(4ce346e7b72546d5d6d9137a5fa6c449c6da292d) ) \ + ROM_LOAD( "95890141.bin", 0x0000, 0x5000, CRC(dc5a4e78) SHA1(31aefb5dcf67eafdd9fc83e086fc00e678f0093a) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bucc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008806.bin", 0x0000, 0x100000, CRC(16ee0143) SHA1(0890da3b2108ec67db1cc8ed2dc40f2eac2a5fbc) ) \ + ROM_LOAD( "95008807.bin", 0x0000, 0x100000, CRC(7141737f) SHA1(74607352f32df2a27f0724f243532c98ca315910) ) \ + +#define sc_bunny_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008907.bin", 0x0000, 0x08b8c3, CRC(2b4911fd) SHA1(7ccdb5e5accb548c10ef288fd901825505559866) ) \ + +#define sc_bantm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008962.bin", 0x0000, 0x100000, CRC(3c10480f) SHA1(67c86228b6199e336beaa21b2982ce3cf5867ed1) ) \ + ROM_LOAD( "95008963.bin", 0x0000, 0x100000, CRC(8ceb0bf8) SHA1(b5712f145ff515c10b0a3b131d0c215a31adbb42) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890434.bin", 0x0000, 0x5000, CRC(37740955) SHA1(c7a9839a4f7f01c916b696a8baedf33d0c146fa3) ) \ + ROM_LOAD( "95890435.bin", 0x0000, 0x5000, CRC(42e24d61) SHA1(dd915ccf979d61cdb0ff7598d35cdceb43d6d8e9) ) \ + ROM_LOAD( "95890436.bin", 0x0000, 0x5000, CRC(dc58813d) SHA1(9bad2c6cdacaa016f5239e578600f1ff03f1ed63) ) \ + +#define sc_bar7_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008409.bin", 0x0000, 0x080000, CRC(ec29c758) SHA1(ceb99fb6edcab5c5e1b0ec46d622ee0f2cdb20be) ) \ + ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) \ + ROM_LOAD( "95008502.bin", 0x0000, 0x080000, CRC(d9bc2c75) SHA1(b9e637d47287a844a6ff1f0b1d1a34b48a806aad) ) \ + ROM_REGION( 0x400000, "other", ROMREGION_ERASE00 ) /* shouldn't be here? - sc1/2 */ \ + ROM_LOAD( "95751960.p1", 0x0000, 0x010000, CRC(9f944d0c) SHA1(feb8fe4ce0a8f5c4a034aafec0f5aae29a834e8d) ) \ + +#define sc_batl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008541.bin", 0x0000, 0x100000, CRC(a739cba8) SHA1(b968cfa18c671aaf027909961a843fc01101d68a) ) \ + ROM_LOAD( "95008542.bin", 0x0000, 0x100000, CRC(686bb7cc) SHA1(4e809f2d1401030127d7afa853189c4fca9742e5) ) \ + +#define sc_bedcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008397.bin", 0x0000, 0x0fe1b3, CRC(d59cd40d) SHA1(585e42b66e691ab9a3df5bb7dae4368226861b04) ) \ + +#define sc_bblas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008302", 0x0000, 0x0fea01, CRC(ef880aee) SHA1(00177f6a0bfe2006d8545834ea4fb22427be97c4) ) \ + +#define sc_bbust_others \ + ROM_REGION( 0x100000, "ymz", 0 ) \ + ROM_LOAD( "95008050.bin", 0x0000, 0x0fc8a1, CRC(8f1a49b5) SHA1(9d75e7118c628b3665a31376a3e35797b7058f6b) ) \ + +#define sc_bigdl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bingb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_blast_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_blue_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bob_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890312.bin", 0x0000, 0x5000, CRC(9dfc2404) SHA1(c35f4197c0e0cd45b35f70cce166497de385b212) ) \ + ROM_LOAD( "95890313.bin", 0x0000, 0x5000, CRC(e86a6030) SHA1(c7fd1ae68aa60c448a31eb9d4103aa0a8c1892d0) ) \ + ROM_LOAD( "95890314.bin", 0x0000, 0x5000, CRC(76d0ac6c) SHA1(83d150737f942abf19a480b06dc09e1063bb0e64) ) \ + +#define sc_bobcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008967.bin", 0x0000, 0x0f64c6, CRC(cf1e1c59) SHA1(f7ccbc6ed20aed329c2a199a489686bb8e87edfb) ) \ + +#define sc_bonbx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_brksp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008210.bin", 0x0000, 0x1aea2f, CRC(da15a50e) SHA1(2f068526992358789e5f2c347a5adf56a1bfde52) ) \ + +#define sc_brix_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bugs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bpfpb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008771.bin", 0x0000, 0x100000, CRC(121b6db2) SHA1(634f435635fcb08013729629fc8f56a4180c2034) ) \ + ROM_LOAD( "95008772.bin", 0x0000, 0x100000, CRC(c8813870) SHA1(5c4571a3ca9a06c49e80c5e10e9fd288de560324) ) \ + +#define sc_btiab_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_btrip_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bpb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008553.bin", 0x0000, 0x100000, CRC(f8019fb2) SHA1(aa5baed73538ebc6e39c6e35437b77a5cc22135e) ) \ + ROM_LOAD( "95008554.bin", 0x0000, 0x100000, CRC(8e00a011) SHA1(821686d96ee6fb45ab0b771934ce25ab7a230c0c) ) \ + +#define sc_bull_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008520.bin", 0x0000, 0x100000, CRC(ab418ce0) SHA1(39afbd449a21a31016acaffcfb4f6d684db300e7) ) /* PR1702 BULLSEYE */ \ + ROM_LOAD( "95008521.bin", 0x0000, 0x100000, CRC(7fd0f70c) SHA1(e6bf85b9e2528dac5811277ee89599e58e6358b0) ) \ + ROM_LOAD( "95008544.bin", 0x0000, 0x100000, CRC(19777f20) SHA1(da0cc08b00f9ab565a0e559761adbf7bcd7c327b) ) /* PR1743 CASINO BULLSEYE */ \ + ROM_LOAD( "95008575.bin", 0x0000, 0x100000, CRC(715901d2) SHA1(a7d3d0c7b9fc3eefb0df372cdf0cae7abe8bd959) ) /* PR1758 BULLSEYE TRIPLE */ \ + ROM_LOAD( "95009116.bin", 0x0000, 0x100000, CRC(5a01e206) SHA1(38ee3706d9edb68d17c90bb627aa17b4f908d721) ) /* PR3318 BULLSEYE */ \ + ROM_LOAD( "95009117.bin", 0x0000, 0x100000, CRC(c3623829) SHA1(92b0cf89678023bb02394699e2e214389317ec6c) ) \ + +#define sc_butch_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008604.bin", 0x0000, 0x100000, CRC(dede59e0) SHA1(de56b80d0a53fbb18acce2b907f48801e8fced12) ) \ + ROM_LOAD( "95008605.bin", 0x0000, 0x100000, CRC(3db1a818) SHA1(2c20d39dc0d7eb3996209a0b34afae3cd2eebbdc) ) \ + +#define sc_cbrun_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cfact_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008508.bin", 0x0000, 0x100000, CRC(97d26d77) SHA1(828e3797184b39e1b8fd788253071f323f2d890e) ) \ + ROM_LOAD( "95008509.bin", 0x0000, 0x100000, CRC(8d1e1f36) SHA1(8976a74c050158fc63fbcbfbadd3f41fca187a24) ) \ + +#define sc_ctit_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008762.bin", 0x0000, 0x100000, CRC(cf7fc030) SHA1(0c34d9b35eb6229ae48b27f2f88ff682b4601816) ) \ + ROM_LOAD( "95008763.bin", 0x0000, 0x100000, CRC(767b94d9) SHA1(5cac6831e54af03eea065143c04bda54f44fec7d) ) \ + +#define sc_craid_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890715.bin", 0x0000, 0x5000, CRC(60af654b) SHA1(ec714992a41b154f534aac0a515e1ef490dad0db) ) \ + ROM_LOAD( "95890716.bin", 0x0000, 0x5000, CRC(1539217f) SHA1(bc766636048c720ac5df55bbf643e2801536e58f) ) \ + ROM_LOAD( "95890717.bin", 0x0000, 0x5000, CRC(8b83ed23) SHA1(43d56d728fbbb81c9e660e537746cd2aa01aadd1) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008851.bin", 0x0000, 0x0fa2fc, CRC(ec82c860) SHA1(7806065db24c13208c77009c64de91a3fb0f4311) ) \ + +#define sc_cvega_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008477.bin", 0x0000, 0x100000, CRC(74607f2f) SHA1(8ce25e6af2fa8b2b4acd794dd78511983d10f7f5) ) \ + +#define sc_chopc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008908.bin", 0x0000, 0x0fa18a, CRC(78e8e1cf) SHA1(0211fffcaab36d88610525c85efb5ea7835fb641) ) \ + +#define sc_cbar7_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891086.bin", 0x0000, 0x5000, CRC(64066892) SHA1(acdf17a6fec87c3094b4b363d5f5a21d58e6260a) ) \ + ROM_LOAD( "95891087.bin", 0x0000, 0x5000, CRC(11902ca6) SHA1(2c7fbf5ec8f22cf1d29d7eb437b8e0403ebbfb13) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009002.bin", 0x0000, 0x05dab2, CRC(7763eeea) SHA1(946ec95a75e3ffdba98c67d58162f7d2e456480e) ) \ + +#define sc_clu70_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891124.bin", 0x0000, 0x5000, CRC(efb25e7e) SHA1(f1da25d6f6c2fe9953c0f95e889b845e65a1fe27) ) \ + ROM_LOAD( "95891125.bin", 0x0000, 0x5000, CRC(9a241a4a) SHA1(3383c31a1de5f4a0ced5e3346de7b7e1f7fdbe04) ) \ + ROM_LOAD( "95891126.bin", 0x0000, 0x5000, CRC(049ed616) SHA1(2c29271dfebff92b3f537dd3cc89aea53decf978) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009017.bin", 0x0000, 0x100000, CRC(4df62a63) SHA1(1d3b7927683d45bf81c038527b57881a58657e21) ) \ + ROM_LOAD( "95009018.bin", 0x0000, 0x030022, CRC(90c95f34) SHA1(a63d52b7ec202f6757ed24251e542be2409ba2a9) ) \ + +#define sc_clcas_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890486.bin", 0x0000, 0x5000, CRC(52bab0b5) SHA1(2144c1c9b980f6dbc1948e94c34fc2213fc5aa70) ) \ + ROM_LOAD( "95890487.bin", 0x0000, 0x5000, CRC(4e6c4009) SHA1(44ae2ce42ff9b91174e214213ccf52c281827434) ) \ + ROM_LOAD( "95890488.bin", 0x0000, 0x5000, CRC(8d366299) SHA1(1d0cd59dfb39ca3a78ae2398992a992d34b2e61a) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008985.bin", 0x0000, 0x0b57f9, CRC(63366697) SHA1(cdab5d0aa1bf738e4e326ed31f78f2a797bd8bd6) ) \ + +#define sc_clnot_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009135.bin", 0x0000, 0x100000, CRC(af699e46) SHA1(e8f685847f4eb83a67074cae92ed59e96f37653b) ) \ + ROM_LOAD( "95009136.bin", 0x0000, 0x100000, CRC(cd1ea94c) SHA1(8010ba1490c656f870230611d15255db175a5a49) ) \ + +#define sc_clus_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890495.bin", 0x0000, 0x5000, CRC(a475b60f) SHA1(4f02f0e0c19be7378736d6d4707f7b4a3068be9b) ) \ + ROM_LOAD( "95890496.bin", 0x0000, 0x5000, CRC(d1e3f23b) SHA1(6f9032c000bcc0cd61180193d85d0a4623026d14) ) \ + ROM_LOAD( "95890497.bin", 0x0000, 0x5000, CRC(4f593e67) SHA1(3a4591ae8ca140dff54d5e74143359fbecc14bfc) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008988.bin", 0x0000, 0x0d23ea, CRC(b33581a0) SHA1(667bf4e499b50fd072313bad671ffcbd299fd97b) ) \ + +#define sc_cmony_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009031.bin", 0x0000, 0x100000, CRC(58ded502) SHA1(27c05614b03b51fe4a168b8c64535ec3ca9e85c1) ) \ + ROM_LOAD( "95009032.bin", 0x0000, 0x100000, CRC(e1eb711a) SHA1(f6c0c10992f2aacd6f9fadc4e15d8ad5ba5b4ed8) ) \ + ROM_LOAD( "95009124.bin", 0x0000, 0x100000, CRC(798d8d5a) SHA1(931bfca5d204c62fc834959d9babcd9488fc7f07) ) \ + ROM_LOAD( "95009125.bin", 0x0000, 0x100000, CRC(d6090812) SHA1(16ca4868725eff0cc4bd056d751dc7861c1e53a1) ) \ + +#define sc_cfnc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009178.bin", 0x0000, 0x100000, CRC(eb938e0a) SHA1(978fa5554462d5d2cbf6a696c6c754318e950223) ) \ + ROM_LOAD( "95009179.bin", 0x0000, 0x100000, CRC(baf8b8b7) SHA1(43b967f3909270b99b563dab4bd1035079a5cb78) ) \ + +#define sc_cfcp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009035.bin", 0x0000, 0x100000, CRC(8138c442) SHA1(ceaeb84a27d0e3eba8d3a9a7c76e86b4214178c9) ) \ + ROM_LOAD( "95009036.bin", 0x0000, 0x100000, CRC(757f44b9) SHA1(61fe15024f7c7f97f865b1b666a5f837a57446a5) ) \ + +#define sc_cfpt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008348.bin", 0x0000, 0x100000, CRC(9c6db3d1) SHA1(f2f613326d0a8c0a1c2e1eea1e91ed34cd344f41) ) \ + ROM_LOAD( "95008349.bin", 0x0000, 0x100000, CRC(6f7716a0) SHA1(75f8fbee605b96e36e8596068dd4570928a5a02d) ) \ + ROM_LOAD( "95008363.bin", 0x0000, 0x100000, CRC(6d211d7b) SHA1(59dbb6201aa355a585253d17302e4f8ceed9a220) ) \ + +#define sc_cknig_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009193.bin", 0x0000, 0x100000, CRC(6c3cb54b) SHA1(a140209d19f9cbd18ede08924b94718264ba4118) ) \ + ROM_LOAD( "95009194.bin", 0x0000, 0x100000, CRC(44229686) SHA1(eda0481282614e6bd82985486ef4eea0eb0ddccd) ) \ + +#define sc_cpays_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008528.bin", 0x0000, 0x100000, CRC(eccde2dc) SHA1(83fc283269fea98ea1b2c0b846bb790bf84d3053) ) \ + +#define sc_canca \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004270.bin", 0x0000, 0x0d4379, CRC(c0db303d) SHA1(8929e4901d517e6063dc75ff40cbcd478bb0be8a) ) \ + +#define sc_carry_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008240.bin", 0x0000, 0x100000, CRC(7c693111) SHA1(6807d78d32e817babd4e1ed2c0b7313d7cc8ebc2) ) \ + +#define sc_cmous_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008439.bin", 0x0000, 0x0e94e0, CRC(9bcded46) SHA1(9f1b431ac010f2ab9a8d393b167ff81baf7f86a5) ) \ + ROM_LOAD( "95008947.bin", 0x0000, 0x0fc44b, CRC(457a86c3) SHA1(e36ba57a981bb0f8b581c4b8e1ddd6e55c24bf00) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890395.bin", 0x0000, 0x5000, CRC(31480d43) SHA1(9ac6254b539d57f79fbb2483948db393ca4823eb) ) \ + ROM_LOAD( "95890396.bin", 0x0000, 0x5000, CRC(2d9efdff) SHA1(0b6642bb202092eb1ef8791a3a1f2b79ad1b5fff) ) \ + ROM_LOAD( "95890397.bin", 0x0000, 0x5000, CRC(eec4df6f) SHA1(b4fd028f28fa43d54c6aaf6062ba79a37f232025) ) \ + +#define sc_cnfr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004130.lo", 0x000000, 0x080000, CRC(223e2bd4) SHA1(f8e187cc74e524496c9e5b35260ac56b93e6e83b) ) \ + ROM_LOAD( "95004131.hi", 0x080000, 0x080000, CRC(3840ffd6) SHA1(d72901b08c11d1f5b16fdb1a8fe57625cc25bd44) ) \ + +#define sc_cad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008396.bin", 0x0000, 0x0ff641, CRC(f24c5ef6) SHA1(83395f64b79efbd4f3153e5d0a2d2b0d0183f857) ) \ + +#define sc_cadcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008486.bin", 0x0000, 0x0ff641, CRC(05e8cba2) SHA1(7a99ab3f45588cff0e54a94ffd75df337cff7351) ) \ + +#define sc_cconx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_ccrus_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cerup_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cexpl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_chand_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_clash_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008374.bin", 0x0000, 0x0feb46, CRC(47ea13e2) SHA1(f9b6e23b3857da5f1f364469c8d4deb4f8d836a6) ) \ + +#define sc_cr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008245.bin", 0x0000, 0x0ffadf, CRC(6528bb5c) SHA1(d54e1f0a18dbbc91316d57be25e0cf5236e856e6) ) \ + +#define sc_crcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008338.bin", 0x0000, 0x0ffadf, CRC(b26edbfe) SHA1(9f5c7a8e6781bad6448f767d19474bbad8024df5) ) \ + +#define sc_cckey_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008425.bin", 0x0000, 0x100000, CRC(99bf2289) SHA1(596fe427dd7abf2779e12e3f20a5ba2eda553f2e) ) \ + +#define sc_chub_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004109", 0x0000, 0x080000, CRC(2e3e2f6e) SHA1(217197bdbcd27271afce7809de7c49cca4ef3656) ) \ + ROM_LOAD( "95004110", 0x0000, 0x080000, CRC(29f3caef) SHA1(dddf38b3da4b9756103b32de4d5d12d612223298) ) \ + +#define sc_cla7_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004334.bin", 0x0000, 0x080000, CRC(bd8a3d25) SHA1(9dd5d124ce467293417575bf316dc1b371bc3169) ) \ + +#define sc_clclo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008889.bin", 0x0000, 0x0edfec, CRC(fb894b4f) SHA1(60b3f28efda4ecb9f7804540291c8c3b8bead27a) ) \ + +#define sc_clucl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_colos_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004235.sn1", 0x0000, 0x080000, CRC(e543f4ab) SHA1(7d72f1392fbd43afe390d4f3059b06cd789528d4) ) \ + ROM_LOAD( "95004236.sn2", 0x0000, 0x080000, CRC(0f26a957) SHA1(b0949534d44dd22b6f676203f52fad978b36d04b) ) \ + +#define sc_cyc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008249.bin", 0x0000, 0x100000, CRC(e8eac90a) SHA1(f79dc6912a8fbeb12c577c402d84ef4780bf4333) ) \ + +#define sc_cyccl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008310.bin", 0x0000, 0x100000, CRC(4dddf82d) SHA1(4bab8cdc5f6bf59c3686dfd01f2f96858f776df3) ) \ + +#define sc_crzcs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* start is empty?? */ \ + ROM_LOAD( "95008005.lo", 0x00000, 0x100000, CRC(0b10db9f) SHA1(e0ea7b4f2dd98ef23ab42ffe7a7892e5327f646e) ) \ + ROM_LOAD( "95008006.hi", 0x100000, 0x100000, CRC(be2cdfd5) SHA1(87e25d6e26052dca8d79fbda705b2df1c06e2c67) ) \ + +#define sc_crzwl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cccsh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004173", 0x0000, 0x080000, CRC(67970fed) SHA1(938414921a0956841ce4447471b7663f5c2c2d4f) ) \ + ROM_LOAD( "95004174", 0x0000, 0x080000, CRC(1f1dd01f) SHA1(6ed312c1e50056bf3cae156e595b26374d7d4816) ) \ + +#define sc_ckx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008995.bin", 0x0000, 0x0931b3, CRC(e874bd15) SHA1(8adb32532dd053ca2c4e0987352013310ce197a0) ) \ + +#define sc_chick_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008291.bin", 0x0000, 0x0b2877, CRC(8e9f53d4) SHA1(7c91e64d7214e1c08b0976f901713228bb64ee49) ) \ + +#define sc_cabin_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008902.bin", 0x0000, 0x0e7fd3, CRC(c7b0f675) SHA1(e19d4e65d73329a58b9cbc6828c7e0c287f2906a) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890306.bin", 0x0000, 0x5000, CRC(eff2e8d8) SHA1(0749d543bf760b2037330ade671c7ce7ed64b275) ) \ + ROM_LOAD( "95890307.bin", 0x0000, 0x5000, CRC(9a64acec) SHA1(51c49e8d415d99e61fda99ade43bb925d99f3825) ) \ + ROM_LOAD( "95890308.bin", 0x0000, 0x5000, CRC(04de60b0) SHA1(cee280d9528f9e167be1c373e7a99f1f2f1bc1c0) ) \ + +#define sc_cari_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "97000070.bin", 0x0000, 0x0f8526, CRC(27ba6768) SHA1(708e836f3fc35fabd0a5c8dc9cd8e9327d7bcdc7) ) \ + ROM_LOAD( "95008981.bin", 0x0000, 0x0ff245, CRC(3a888f98) SHA1(b113c17acda287200fdcd734a1b384879a5e7101) ) \ + ROM_LOAD( "caribbeancashsnd1.bin", 0x0000, 0x080000, CRC(89da9fc4) SHA1(d56364e2e71d03d7d8888966b64ff1fab4bfc3e9) ) \ + ROM_LOAD( "caribbeancashsnd2.bin", 0x0000, 0x080000, CRC(99d33f61) SHA1(7caf3b9540372900e90a7141f14383fe06936a2e) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890474.bin", 0x0000, 0x5000, CRC(bcb54114) SHA1(0236171b34f3e47db9aa253f9605ff6bd21b1460) ) \ + ROM_LOAD( "95890475.bin", 0x0000, 0x5000, CRC(c9230520) SHA1(5cf9c3d130f114dac633d696e0bf1bda94afb9ee) ) \ + ROM_LOAD( "95890476.bin", 0x0000, 0x5000, CRC(5799c97c) SHA1(5dab858e61815c04f874f231848c376d8fce1c3d) ) \ + +#define sc_cblas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008539.bin", 0x0000, 0x0e0033, CRC(068349f4) SHA1(b27cba3217122397eb7aea0d9a382fda9ee6a43b) ) \ + + +#define sc_casxt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008854.bin", 0x0000, 0x08cba2, CRC(f7b3ad12) SHA1(08108745f7e048e9aa27777bdc6edeb5d5836a6d) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890718.bin", 0x0000, 0x5000, CRC(dd65993f) SHA1(db2af897e36d7b55ed1d1d2efe350f4802449945) ) \ + ROM_LOAD( "95890719.bin", 0x0000, 0x5000, CRC(c1b36983) SHA1(2b74336915c7156723e2554f152ed34f6c88a16a) ) \ + ROM_LOAD( "95890720.bin", 0x0000, 0x5000, CRC(02e94b13) SHA1(2d8fffc631e1a590774131bdea1f0b5ec8c6e8f3) ) \ + +#define sc_clue_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890356.bin", 0x0000, 0x5000, CRC(fd78e03f) SHA1(029e2fd7e9cff3793d905d192c889873ad2a0d26) ) \ + ROM_LOAD( "95890357.bin", 0x0000, 0x5000, CRC(88eea40b) SHA1(5a730add3f9941dfcbfa5cd8f6a6142d19065482) ) \ + ROM_LOAD( "95890358.bin", 0x0000, 0x5000, CRC(16546857) SHA1(d8b81b3df5e041c83c4f359c487165a6a2d5c513) ) \ + +#define sc_cmani_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008295.bin", 0x0000, 0x100000, CRC(a5646d3b) SHA1(9aca69f103f959a85026fd0d0ffb3bd65eebae34) ) \ + +#define sc_cj_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008427.bin", 0x0000, 0x100000, CRC(a6093378) SHA1(30a64e8857da269cbc0b3febf30a62f5647d10b9) ) \ + +#define sc_ctl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008225.bin", 0x0000, 0x100000, CRC(b185224e) SHA1(a4b4c618903c4c207de8dae74b55fd2c85a5e4ff) ) \ + +#define sc_crsc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008681.bin", 0x0000, 0x100000, CRC(7a459110) SHA1(51f0a51af485a0f4e447ee0c22f488a924e45117) ) \ + +#define sc_cfqps_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004101.bin", 0x0000, 0x080000, CRC(31e5785a) SHA1(8da2bd3571640b0ae23e9fdcc2235dcf9d2de122) ) \ + ROM_LOAD( "95004102.bin", 0x0000, 0x080000, CRC(bf059b21) SHA1(89a96c593e5385e9b40f694768986691eed4b5c5) ) \ + ROM_LOAD( "95008339.bin", 0x0000, 0x100000, CRC(bae07fa8) SHA1(a86a5d9ff6ac802bd15275f46894374317627e23) ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95420324.bin", 0x0000, 0x100000, CRC(41729e8f) SHA1(adb15067f61eb2e4adf537137dd24876749da8a2) ) \ + +#define sc_czfr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* 3 different sets of sound! */ \ + ROM_LOAD( "crazy sound 1.bin", 0x0000, 0x080000, CRC(31e5785a) SHA1(8da2bd3571640b0ae23e9fdcc2235dcf9d2de122) ) \ + ROM_LOAD( "crazy sound 2.bin", 0x0000, 0x080000, CRC(bf059b21) SHA1(89a96c593e5385e9b40f694768986691eed4b5c5) ) \ + \ + ROM_LOAD( "95004150.bin", 0x0000, 0x080000, CRC(7707ea0d) SHA1(efe187a4c64a3a5f8d10e21c269afbb603186ae7) ) \ + ROM_LOAD( "95004151.bin", 0x0000, 0x080000, CRC(54845756) SHA1(e53dfa8f836044232ee1a8006051ef586ac24d8c) ) \ + \ + ROM_LOAD( "95004280.sn1", 0x0000, 0x080000, CRC(44d1b0d9) SHA1(2e361a1b65955acecbc26ba47000e4ef6316a22d) ) \ + ROM_LOAD( "95004281.sn2", 0x0000, 0x080000, CRC(31f057f3) SHA1(a6415eee8499ada43225901dee2d12c93d494658) ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + ROM_LOAD( "ccfsnd.bin", 0x0000, 0x02196a, CRC(15e542c2) SHA1(9bd9218b7392c882f68e330619bea7996afd001e) ) /* oki sound rom, doubt it belongs here */ \ + +#define sc_crnjw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008469.bin", 0x0000, 0x100000, CRC(07df5a41) SHA1(56dacba05e26258e50085f78dfe965196917addf) ) /* PR1608 CROWN JEWELS SOUNDS11 */ \ + \ + ROM_LOAD( "95009176.bin", 0x0000, 0x100000, CRC(d1db2564) SHA1(641f94108df9dffde599012018d944e3848f50ed) ) /* PR000055 CJEWELS */ \ + ROM_LOAD( "95009177.bin", 0x0000, 0x100000, CRC(e574cc1c) SHA1(760284d60d336571495da921ff666ac5725d7c19) ) \ + +#define sc_cclim_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008243.bin", 0x0000, 0x100000, CRC(b21e073b) SHA1(dfe309490c5c69052041c2121258c17b974f88ed) ) \ + +#define sc_chavi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008563.bin", 0x0000, 0x100000, CRC(e4d30521) SHA1(70a2d88842ee40c77011a2ed8ca45f71316d2579) ) \ + +#define sc_chavy_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008964.bin", 0x0000, 0x0fc821, CRC(597bc1c8) SHA1(f28d3fe1dd5ccf4d5ff6e1088a392b4713e6d1b5) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890437.bin", 0x0000, 0x5000, CRC(e4c29dae) SHA1(5e81acde46a489b8a9056167e33efec3d2d1b95a) ) \ + ROM_LOAD( "95890438.bin", 0x0000, 0x5000, CRC(9154d99a) SHA1(61ef137e6db5f8394b948c589c0cee506a48f9ed) ) \ + ROM_LOAD( "95890439.bin", 0x0000, 0x5000, CRC(0fee15c6) SHA1(3d24e9861c2c7a67a3d4d156b9281e857de30a55) ) \ + +#define sc_cinv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_crotr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009049.bin", 0x0000, 0x100000, CRC(10c94788) SHA1(8fb5113036a0122a4dbc9af15b600ffe99e51094) ) \ + ROM_LOAD( "95009050.bin", 0x0000, 0x100000, CRC(5e47e86c) SHA1(9aaca1390852f9079cd355c48b889fb5962c5c09) ) \ + +#define sc_crsgc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_crsgr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009139.bin", 0x0000, 0x100000, CRC(f2e4fa3c) SHA1(1909de32f232e5bfb3ee3c624f29c585cca254c2) ) \ + ROM_LOAD( "95009140.bin", 0x0000, 0x100000, CRC(81bdf47f) SHA1(49c02fb87a4ffc1be4c748c469f5518c314b1391) ) \ + +#define sc_copsr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "cops_rob_snd.bin", 0x0000, 0x080000, CRC(e25bddb7) SHA1(96d6be2407bf876ad685bdc13d96585782ad4a50) ) \ + ROM_LOAD( "95008393.bin", 0x0000, 0x100000, CRC(693cd9be) SHA1(e965b2dcd6d6619815c919b7d2c372c726abfea3) ) \ + ROM_LOAD( "95008787.bin", 0x0000, 0x100000, CRC(82713d8b) SHA1(317cb1c482bd13e1cad2e5739c99f6e3ca163684) ) \ + ROM_LOAD( "95008846.bin", 0x0000, 0x080000, CRC(44f9eaab) SHA1(394bd36121c33aba97bc957b3d46d2944c1daeed) ) \ + ROM_LOAD( "95009130.bin", 0x0000, 0x100000, CRC(f6813371) SHA1(bd9e5d009c7870d50149d9de396f363fb19b183c) ) \ + +#define sc_crcpt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_corst_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009037.bin", 0x0000, 0x100000, CRC(c2d3b6ee) SHA1(36e7e9c956ab91fd1b2e52800b4482ce3a3597f5) ) \ + ROM_LOAD( "95009038.bin", 0x0000, 0x100000, CRC(45dc4df3) SHA1(7710a0ba9bbe7ae6f590b61bbc1395cd408926d2) ) \ + +#define sc_coro_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008939.bin", 0x0000, 0x100000, CRC(02c9a21d) SHA1(7f27a8d706a7d66feafc5faab23ee28ebfa02b53) ) \ + ROM_LOAD( "95008940.bin", 0x0000, 0x05fdb4, CRC(09c8a19a) SHA1(21a58f8183c29d61c0132c2fc7339e459521a16e) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890365.bin", 0x0000, 0x5000, CRC(12f90bc7) SHA1(09cdfddfa7fb430eccd87d677673f203120bef51) ) \ + ROM_LOAD( "95890366.bin", 0x0000, 0x5000, CRC(676f4ff3) SHA1(c6a3c2b01b79e9abaa249b548fb59584c63fc682) ) \ + ROM_LOAD( "95890367.bin", 0x0000, 0x5000, CRC(f9d583af) SHA1(f22e3ed7c4d954a98cec9dc077113761fdcef858) ) \ + ROM_LOAD( "95890377.bin", 0x0000, 0x5000, CRC(edbf2523) SHA1(8165c2c2f12fd85f706aed31bc3cbd51648440de) ) \ + ROM_LOAD( "95890378.bin", 0x0000, 0x5000, CRC(f169d59f) SHA1(fa8116f43c25de7af05f1cf8a379a24cce489f21) ) \ + ROM_LOAD( "95890379.bin", 0x0000, 0x5000, CRC(3233f70f) SHA1(df485c4df31872921c3d97973a7b3e7d4a58446d) ) \ + +#define sc_count_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008615.bin", 0x0000, 0x100000, CRC(97c602c0) SHA1(cd71c062df3ac700ab72fc992542e08651270ec8) ) \ + ROM_LOAD( "95008616.bin", 0x0000, 0x100000, CRC(2b80b1a5) SHA1(a94b4402ba738a6369f58c73a5b9d66e0476eeb1) ) \ + +#define sc_corcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008867.bin", 0x0000, 0x100000, CRC(b11779d2) SHA1(720d30445232baa18e613259bded1a6827777de6) ) \ + ROM_LOAD( "95008868.bin", 0x0000, 0x05fdb4, CRC(424b08e5) SHA1(fc0fe01516c0c6bb20adcf2bf8b1263ff59657e8) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890770.bin", 0x0000, 0x5000, CRC(551ab279) SHA1(39e4c16f3cc708d84762ba5b80c720cbbc123f0d) ) /* why is this in an sc4 set? */ \ + + +#define sc_devil_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890464.bin", 0x0000, 0x5000, CRC(35e24491) SHA1(e762854ac074df67db843fed4c6c7cfe1d8f754b) ) \ + ROM_LOAD( "95890465.bin", 0x0000, 0x5000, CRC(407400a5) SHA1(dba6f4204a27f26056ffc3d9b512c0f4a8f17562) ) \ + ROM_LOAD( "95890466.bin", 0x0000, 0x5000, CRC(dececcf9) SHA1(6ebaec58330b7ce8bb166d2aefd203147c4823fa) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008978.bin", 0x0000, 0x0ff462, CRC(b0dac89b) SHA1(afdc4fec96849b81e52aa03d9df821e336001c74) ) \ + +#define sc_dracp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_db_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_daylt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "daylsnd1.bin", 0x0000, 0x080000, CRC(4510d156) SHA1(b001bdf3bfad6124647f640065b411c07c8cf555) ) \ + ROM_LOAD( "daylsnd2.bin", 0x0000, 0x080000, CRC(71a1428f) SHA1(029ae979f192bcd7704ae78aba14815acdabe60f) ) \ + +#define sc_derby_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008129.bin", 0x0000, 0x100000, CRC(4892cf07) SHA1(9ce745f4b3aee623a7855e2fee4cc35de20646a3) ) \ + ROM_LOAD( "95008130.bin", 0x0000, 0x100000, CRC(b9bfde2a) SHA1(25329d5b93318586095715111fbbb854bba394b9) ) \ + +#define sc_deepi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008329.bin", 0x0000, 0x100000, CRC(427dad17) SHA1(f8834dfbe6608abb08d6214cd87ec809df963805) ) \ + +#define sc_ddosh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008299.bin", 0x0000, 0x100000, CRC(fee81425) SHA1(188cb7275963193a39571d3e4da3b9f6693a79d0) ) \ + +#define sc_dhh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008586.bin", 0x0000, 0x100000, CRC(43fde3ad) SHA1(662402449b025bbf75a10c3b1ac746d9359b0b0d) ) \ + ROM_LOAD( "95008587.bin", 0x0000, 0x100000, CRC(6f7a607f) SHA1(da3c8aaa69b30f10f122a9bde49d987dd0950474) ) \ + +#define sc_dmine_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008293.bin", 0x0000, 0x100000, CRC(acbed8e1) SHA1(607dafa2215632d02c34e65b79bf1341b981f63b) ) \ + +#define sc_dnd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* Regular */ \ + ROM_LOAD( "95008606.bin", 0x0000, 0x100000, CRC(c63c8663) SHA1(4718baf87340fe93ccfe642a1a0cdb9d9dcac57f) ) /* 0 (1907) DOND SOUNDS 11 */ \ + ROM_LOAD( "95008607.bin", 0x0000, 0x100000, CRC(a615514f) SHA1(d4ff7d4fe6f1dd1d7b00cc504f90b2921aa5e8fb) ) /* 1 */ \ + \ + /* Casino */ \ + ROM_LOAD( "95008631.bin", 0x0000, 0x100000, CRC(7208854a) SHA1(a02de60cfcbafe5da4f67596ab65237f5b5f41b7) ) /* 0 (1954) DOND SOUNDS 11 */ \ + \ + ROM_LOAD( "95008632.bin", 0x0000, 0x100000, CRC(fd81a317) SHA1(1e597fd58aab5a7a8321dc4daf138ee07b42c094) ) /* 0 (1945) DOND SOUNDS 11 */ \ + ROM_LOAD( "95008633.bin", 0x0000, 0x100000, CRC(a7a445d4) SHA1(dbb1938c33ce654c2d4aa3b6af8c210f5aad2ae3) ) /* 1 */ \ + \ + /* Casino */ \ + ROM_LOAD( "95008661.bin", 0x0000, 0x100000, CRC(2d9ebcd5) SHA1(d824a227420cbe616aca6e2fd279af691ddfd87a) ) /* 0 (1945) DOND SOUNDS 12 */ \ + \ + ROM_LOAD( "95008680.bin", 0x0000, 0x100000, CRC(9bd439d1) SHA1(5e71d04e5697e92998bae28f7352ea7742cafe07) ) /* 0 (1964) DOND SOUNDS 11 */ \ + \ + ROM_LOAD( "95008698.bin", 0x0000, 0x100000, CRC(8eea7754) SHA1(7612c128d6c062bba3477d55aee3089e1255f61e) ) /* 0 (1964) DOND SOUNDS 12 */ \ + + +#define sc_dndbb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008788.bin", 0x0000, 0x100000, CRC(51384d64) SHA1(3af87bcc7fb4881ae671d9cbb484fb6a2a534cce) ) \ + ROM_LOAD( "95008789.bin", 0x0000, 0x100000, CRC(4f2d72c3) SHA1(f167ad8d7178682833e7e9efcc393b5826108d70) ) \ + +#define sc_dndbo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009158.bin", 0x0000, 0x100000, CRC(27f11b81) SHA1(f2690c2828ad09d73cb14c5c1cb53c2ad1fc7b53) ) \ + ROM_LOAD( "95009159.bin", 0x0000, 0x100000, CRC(95e278c8) SHA1(7d85b6dbe3ccacd6c5a5b4eb475598a3d5548ce0) ) \ + +#define sc_dndbl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_dndbq_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891057.bin", 0x0000, 0x5000, CRC(75c0cf91) SHA1(20e7fb3a279cc127cec08a78b6633852b0a950f7) ) \ + ROM_LOAD( "95891058.bin", 0x0000, 0x5000, CRC(69163f2d) SHA1(66b6b593126c452f01b36c03e82d003860340025) ) \ + ROM_LOAD( "95891059.bin", 0x0000, 0x5000, CRC(aa4c1dbd) SHA1(4ebd1b132a4125bdcf58d5867cffb821e3e7b1a3) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008887.bin", 0x0000, 0x100000, CRC(53cb9dc5) SHA1(66cdf8624736ea5a4e239bdb81fc96366ec4623e) ) \ + +#define sc_dndcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* club dond */ \ + ROM_LOAD( "95008629.bin", 0x0000, 0x100000, CRC(6f7cf500) SHA1(bf3db728872251116b32aa2c44f72a87d29b13d2) ) \ + ROM_LOAD( "95008630.bin", 0x0000, 0x100000, CRC(5dfda41e) SHA1(6d61d0eedc6a1599777f47d3880689f954f326c9) ) \ + /* beat the banker */ \ + ROM_LOAD( "95008713.bin", 0x0000, 0x100000, CRC(7311db5e) SHA1(24a4b3f44fa6dbbe756b0acac2b513c6e92cdf26) ) /* R3068? */ \ + ROM_LOAD( "95008714.bin", 0x0000, 0x100000, CRC(c6ebc845) SHA1(6a135f42940b8c44422736650e369fa12b51e0df) ) \ + +#define sc_dndcr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009033.bin", 0x0000, 0x100000, CRC(4e167844) SHA1(d0e7101fe033bc9fc0e279c3d457a7da8e8aab00) ) \ + ROM_LOAD( "95009034.bin", 0x0000, 0x100000, CRC(a3e7b40a) SHA1(09f1fde693750f15e78da91c796e8593d06d19e9) ) \ + +#define sc_dnddd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* dond double */ \ + ROM_LOAD( "95008804.bin", 0x0000, 0x100000, CRC(19fd19fa) SHA1(db68a40d8bb3de130c6d5777217fb3c3a4c13d17) ) \ + ROM_LOAD( "95008805.bin", 0x0000, 0x100000, CRC(f497337d) SHA1(9e827116f8b1d882cfcd0b56aaede9de14b2e943) ) \ + +#define sc_dndde_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009053.bin", 0x0000, 0x100000, CRC(f06acb47) SHA1(043756eda04d193f7365f2fd0fafc36c3b6b0bd9) ) \ + ROM_LOAD( "95009054.bin", 0x0000, 0x100000, CRC(595baae8) SHA1(9aa03b265294eaed0051b0a25cc9a0e1481b4390) ) \ + +#define sc_dnddi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009191.bin", 0x0000, 0x100000, CRC(2f3cda1a) SHA1(017533caadf86d0d70e1b57b697621e0b4a8fef2) ) \ + ROM_LOAD( "95009192.bin", 0x0000, 0x100000, CRC(eb9b6b0b) SHA1(127bb283b32a997c04a1b29c18f4093f4d969151) ) \ + +#define sc_dnddt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009106.bin", 0x0000, 0x100000, CRC(afa266cf) SHA1(adc80bc677a7524bec4bbd102a4a5ff293571abc) ) \ + ROM_LOAD( "95009107.bin", 0x0000, 0x100000, CRC(493981a8) SHA1(77308e453848d092d63330e10e3b1e88caeb4fb5) ) \ + +#define sc_dnddo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009120.bin", 0x0000, 0x100000, CRC(327c01a0) SHA1(9b7fa28ff6ecc83c2e9ee73aac0af98be170b28f) ) \ + ROM_LOAD( "95009121.bin", 0x0000, 0x100000, CRC(d7991c7e) SHA1(4f4e4043f272ff2325b0fa64c66b34cb1aefb97c) ) \ + +#define sc_dndfl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008847.bin", 0x0000, 0x100000, CRC(7f3eae56) SHA1(f5d25c87caf76fc1961c8fb5c389bb73cefbcb28) ) \ + ROM_LOAD( "95008848.bin", 0x0000, 0x100000, CRC(ba00c16d) SHA1(f2e55441857e5f036e19d2ee29dfad97b99134b8) ) \ + +#define sc_dndgo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009197.bin", 0x0000, 0x100000, CRC(bdf253cb) SHA1(6f046f1c27bae1141919874b27a8d87295b39261) ) \ + ROM_LOAD( "95009198.bin", 0x0000, 0x100000, CRC(420105d4) SHA1(23e4eac4146a3985c3a7dc5f80f1b5900a116303) ) \ + +#define sc_dndgl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009102.bin", 0x0000, 0x100000, CRC(9d03cd95) SHA1(e062c816a19af0dc86bfa5a66f69342e69fffcfa) ) \ + ROM_LOAD( "95009103.bin", 0x0000, 0x100000, CRC(51ae4095) SHA1(b397984d3b0beb4ca95050ff595648a80e5ea87a) ) \ + +#define sc_dndld_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009184.bin", 0x0000, 0x100000, CRC(25a36077) SHA1(92c05f410456414b825b09338a474c52f7c1bd9b) ) \ + ROM_LOAD( "95009185.bin", 0x0000, 0x100000, CRC(eacdfc26) SHA1(8ab462e7f49ca9374b9245d9d97cf909ea979ae3) ) \ + +#define sc_dndmb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009156.bin", 0x0000, 0x100000, CRC(7c68c70c) SHA1(eb4006e185f3cd4e7d66999b3ff064a7903f5bc8) ) \ + ROM_LOAD( "95009157.bin", 0x0000, 0x100000, CRC(a0541504) SHA1(689ba32fd1b1a9592a9cd7039424655a652b1bcd) ) \ + +#define sc_dndmd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009170.bin", 0x0000, 0x100000, CRC(6ab363a5) SHA1(1a98566161aec187074cbbdb7372ed8484202639) ) \ + ROM_LOAD( "95009171.bin", 0x0000, 0x100000, CRC(bc5d3113) SHA1(836eff78265f6d0371be18467c5edc6d32aba6d5) ) \ + +#define sc_dndpa_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009150.bin", 0x0000, 0x100000, CRC(54d9f01a) SHA1(6d62ca07443c42e16243a843dee6a11c7a1383fc) ) \ + ROM_LOAD( "95009151.bin", 0x0000, 0x100000, CRC(89bb7543) SHA1(e8bea8a00798329af590be5e2ccbfcc54f70f98d) ) \ + +#define sc_ddptg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009041.bin", 0x0000, 0x100000, CRC(143d05fb) SHA1(f3d2735dc5b1bdc4e3f4205521f1b614d4b4c4b0) ) \ + ROM_LOAD( "95009042.bin", 0x0000, 0x100000, CRC(65efd8fd) SHA1(c7f2d1f6b31767a56269f53e9327de3abe64218f) ) \ + +#define sc_ddply_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008830.bin", 0x0000, 0x100000, CRC(bb66ae0c) SHA1(4a7df180dd67aa96059a83986cb98721a81963d8) ) \ + ROM_LOAD( "95008831.bin", 0x0000, 0x100000, CRC(8a632940) SHA1(e955b05a82312ab356117f348903292d6f26a5a5) ) \ + +#define sc_dndrr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009188.bin", 0x0000, 0x100000, CRC(a2dceadd) SHA1(af1696bf32f37005c6a01bb209f38b90daab4e29) ) \ + ROM_LOAD( "95009189.bin", 0x0000, 0x100000, CRC(02b0d336) SHA1(7713212ebf59fa2464110b0238a870e81d43be05) ) \ + +#define sc_dndsi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008838.bin", 0x0000, 0x100000, CRC(34e9d2eb) SHA1(140f9ccf287e24e3917b1a6bb8d8118bf20f232c) ) \ + ROM_LOAD( "95008839.bin", 0x0000, 0x100000, CRC(4475bb6b) SHA1(864575f9b35495bfe0d8f7563e2d4b5e35b6a396) ) \ + +#define sc_dndrt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009141.bin", 0x0000, 0x100000, CRC(e53f8ba3) SHA1(10eea3246352bf65e1ca7b4cd6e1a873d6a2f7fe) ) \ + ROM_LOAD( "95009142.bin", 0x0000, 0x100000, CRC(54b47cbd) SHA1(71e8f49b0d031fcc8c5450279dc26d39b90af678) ) \ + +#define sc_dndpd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009172.bin", 0x0000, 0x100000, CRC(f124785f) SHA1(2291dca731bb6037d655dc8bbdfa7f35f6a4d4d1) ) \ + ROM_LOAD( "95009173.bin", 0x0000, 0x100000, CRC(aae9318c) SHA1(4b53bec7284950fbca4650117e727ab9a01b5509) ) \ + +#define sc_dndpc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_dndtb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009186.bin", 0x0000, 0x100000, CRC(1da5489b) SHA1(b282e523b52e34a625502ec99ca42f059e701448) ) \ + ROM_LOAD( "95009187.bin", 0x0000, 0x100000, CRC(2c3ea82c) SHA1(50ade918503e224288407abf60b3d53e5334aadb) ) \ + +#define sc_dndhf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008705.bin", 0x0000, 0x100000, CRC(09e02843) SHA1(a6ac658c857eca2aca0bacda423dd012434e93bc) ) \ + ROM_LOAD( "95008706.bin", 0x0000, 0x100000, CRC(805e7eb8) SHA1(107c6ba26e37d8f2eec81b62c3edf3efb7e44ca2) ) \ + +#define sc_dndys_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008779.bin", 0x0000, 0x100000, CRC(cf04d115) SHA1(3255b58cd4fba7d231ca35c00d1cb70da1f6cfbd) ) \ + ROM_LOAD( "95008780.bin", 0x0000, 0x100000, CRC(ec270dbe) SHA1(f649ffd4530feed491dc050f40aa0205f4bfdd89) ) \ + +#define sc_dndww_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008730.bin", 0x0000, 0x100000, CRC(e2aebdb0) SHA1(d22fee7ff3d5912ea9a7440ec82de52a7d016090) ) /* casino wow */ \ + +#define sc_dndtr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008832.bin", 0x0000, 0x100000, CRC(1d2aa204) SHA1(52ad7a6ea369198b48d593de508f317ed11e84de) ) \ + ROM_LOAD( "95008833.bin", 0x0000, 0x100000, CRC(92f462f6) SHA1(c0782639d4cd2653a3d14e1b422c2d6117dac029) ) \ + +#define sc_dndwb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008651.bin", 0x0000, 0x100000, CRC(c3738d54) SHA1(bf3c62e196a2cea144868729f136000a7b924c3d) ) /* wiyb */ \ + ROM_LOAD( "95008652.bin", 0x0000, 0x100000, CRC(ba8f5b62) SHA1(2683623e8b90d5e9586295d720aa1d985b416117) ) \ + ROM_LOAD( "95008715.bin", 0x0000, 0x100000, CRC(1796b604) SHA1(9045f9424e6447d696a6fdd7f5bdcbfda4b57c90) ) /* wiyb */ \ + ROM_LOAD( "95008766.bin", 0x0000, 0x100000, CRC(62accb81) SHA1(ed0456cefed2fbf9a1cfd911f871262e892a4ce8) ) /* wiyb */ \ + ROM_LOAD( "95008767.bin", 0x0000, 0x100000, CRC(0aa49d8a) SHA1(a2baffc495656f0b5426b720cac298a78774b7fa) ) /* super slam?? */ \ + +#define sc_dndpg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008822.bin", 0x0000, 0x100000, CRC(16411f05) SHA1(11f2d17b6647b9d9e713e38bab6604e4feb51432) ) \ + ROM_LOAD( "95008823.bin", 0x0000, 0x100000, CRC(4f7bab89) SHA1(bbb203cff3212571c313e8f22f9083980baf2566) ) \ + +#define sc_dndtp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008673.bin", 0x0000, 0x100000, CRC(4b8d1e0b) SHA1(8cba9632abb2800f8e9a45d1bf0abbc9abe8cb8c) ) \ + ROM_LOAD( "95008674.bin", 0x0000, 0x100000, CRC(66236e20) SHA1(222fefdeddb22eb290302528a8f937468ccd5698) ) \ + + +#define sc_dndbe_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008624.bin", 0x0000, 0x100000, CRC(bf9620ea) SHA1(63f5a209da3d0117fcb579364a53b23d2b02cfe5) ) \ + ROM_LOAD( "95008625.bin", 0x0000, 0x100000, CRC(2e1a1db0) SHA1(41ebad0615d0ad3fea6f2c00e2bb170d5e417e4a) ) \ + +#define sc_dndbc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009100.bin", 0x0000, 0x100000, CRC(b06110c0) SHA1(84289721a8c71124cc4df79fc90d0ded8d43fd07) ) \ + ROM_LOAD( "95009101.bin", 0x0000, 0x100000, CRC(53b38d0a) SHA1(1da40cbee8a18713864e3a578ac49c2108585e44) ) \ + +#define sc_dndlp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008792.bin", 0x0000, 0x100000, CRC(2e7e1a5a) SHA1(000cb48c67b7f23d00318d37206c2df426c79281) ) \ + ROM_LOAD( "95008793.bin", 0x0000, 0x100000, CRC(4b91b638) SHA1(b97cb1d22f91a791fc4d47bbae8965882898a317) ) \ + +#define sc_dndra_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008752.bin", 0x0000, 0x100000, CRC(82bfd510) SHA1(857f294d46d64275b15c56187bbbc19e2aa0f5bc) ) \ + ROM_LOAD( "95008753.bin", 0x0000, 0x100000, CRC(ee0b5da9) SHA1(f6cb6037f525df504c1ba8106f19990ecf8d1bd2) ) \ + +#define sc_dndbd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008790.bin", 0x0000, 0x100000, CRC(3c56a8b6) SHA1(8c06aa725233f4feb7c2e703f203cf9b0c6669a1) ) \ + ROM_LOAD( "95008791.bin", 0x0000, 0x100000, CRC(7378a4a8) SHA1(af9dd1fcbd8b77fab4afc85a325c0eb011f35e3a) ) \ + +#define sc_dndbr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008723.bin", 0x0000, 0x100000, CRC(6e1d9bd5) SHA1(92b2fd0b75a195af6ddfbdee3316f8af4bc4eb1a) ) \ + ROM_LOAD( "95008724.bin", 0x0000, 0x100000, CRC(309c1bf1) SHA1(82811b503a06e30a915eebdbdbcd63b567f241c1) ) \ + +#define sc_dndcc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008746.bin", 0x0000, 0x100000, CRC(ef3c39b9) SHA1(21b9788080de68acd436608d7d46fd9663d1589b) ) /* crazy chair */ \ + ROM_LOAD( "95008747.bin", 0x0000, 0x100000, CRC(9f9b638f) SHA1(5eae49f8a9571f8fade9acf0fc80ea3d70cc9e18) ) \ + \ + ROM_LOAD( "95008840.bin", 0x0000, 0x100000, CRC(2aa17d67) SHA1(43bdee1b3d0a0bf28f672620867fa3dc95727fbc) ) /* crazy chair */ \ + ROM_LOAD( "95008841.bin", 0x0000, 0x100000, CRC(594a9cd7) SHA1(667fa3106327ce4ff23877f2d48d3e3e360848d0) ) \ + \ + ROM_LOAD( "95009131.bin", 0x0000, 0x100000, CRC(59a9e50a) SHA1(15d79b177a1e926cd5aee0f969f5ef8b30fac203) ) /* crazy chair */ \ + ROM_LOAD( "95009132.bin", 0x0000, 0x100000, CRC(5e8a7ca6) SHA1(419ecc6ac15004bdd83bcd5b3e00d9dcd0d24936) ) \ + +#define sc_dnddw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008754.bin", 0x0000, 0x100000, CRC(d2c3e3e5) SHA1(3d21c812456618471a331d596760ea8746afc036) ) \ + ROM_LOAD( "95008755.bin", 0x0000, 0x100000, CRC(e6906180) SHA1(81215fd3dfe315123d5b028047a93e30baa52b5d) ) \ + +#define sc_dnddf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008738.bin", 0x0000, 0x100000, CRC(2a06f488) SHA1(666bd9c8091edda4b003fa586e5ae270831c119f) ) \ + ROM_LOAD( "95008739.bin", 0x0000, 0x100000, CRC(33d677b0) SHA1(5283d23671e340e3fda4eb4c6795d1d56b073206) ) \ + +#define sc_disco_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004220", 0x0000, 0x080000, CRC(530be6ac) SHA1(eede25d9d8a429dace91c1dc37ce4da7152b1836) ) \ + ROM_LOAD( "95004221", 0x0000, 0x080000, CRC(0b2020c9) SHA1(75c7af9312ea1b84df66a640fac903aedac5a0eb) ) \ + +#define sc_dbldm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008540.bin", 0x0000, 0x0ff77d, CRC(752628b0) SHA1(42b07736549b0e5e9d15cccd4922fac1e4135687) ) \ + +#define sc_dblfr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004307.bin", 0x0000, 0x080000, CRC(69b55ce9) SHA1(c635add8001dc7c5c81ffcae05b2b83bb37e9e72) ) \ + +#define sc_dough_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008505.bin", 0x0000, 0x100000, CRC(e18549be) SHA1(7062f05b6245c4188ed68a51dc7fbc8b138698f4) ) \ + +#define sc_ducks_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890347.bin", 0x0000, 0x5000, CRC(9faa9c11) SHA1(5e2add80ad17a27dd7b5b0a298ea6753b6adca11) ) \ + ROM_LOAD( "95890348.bin", 0x0000, 0x5000, CRC(ea3cd825) SHA1(0ecef82b32b0166ef5f8deecd7a85fd52fc66bf8) ) \ + ROM_LOAD( "95890349.bin", 0x0000, 0x5000, CRC(74861479) SHA1(7ba29931336985b96995688afdfe2b83a7602a84) ) \ + +#define sc_emmer_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008973.bin", 0x0000, 0x0fc2ce, CRC(a6ef4f4c) SHA1(4749e008e8cd0a7f92da85fcbf1a9dfd9fd5e721) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890452.bin", 0x0000, 0x5000, CRC(193927ce) SHA1(fe02d1d1519139199fbb743ce0e67b810261e9a2) ) \ + ROM_LOAD( "95890453.bin", 0x0000, 0x5000, CRC(6caf63fa) SHA1(86657e0e14eac91f91bd4da4c04b88c8ee28de45) ) \ + ROM_LOAD( "95890454.bin", 0x0000, 0x5000, CRC(f215afa6) SHA1(0e28affa6557474856087dbeeb0a3127616b7fe6) ) \ + +#define sc_evol_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "evolsnd.p1", 0x0000, 0x100000, CRC(13e18cc3) SHA1(114301af1abf86cdd9c2f01b316d257bb1ca086d) ) \ + ROM_LOAD( "evolsnd.p2", 0x0000, 0x08399a, CRC(345f3f11) SHA1(dd4d4f0f32650304cc6010b8f059c23dd5535919) ) \ + +#define sc_fgbh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009118.bin", 0x0000, 0x100000, CRC(f6ce47b9) SHA1(bb3917a3eed718e23dc37b1ffe93f2e349990d3c) ) \ + ROM_LOAD( "95009119.bin", 0x0000, 0x100000, CRC(9d96e3fd) SHA1(5d2d3939a2f1f765c2272f7747a0eea7d0cf1bf8) ) \ + +#define sc_fggp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008824.bin", 0x0000, 0x100000, CRC(58119c7f) SHA1(40f6376b5e1caf0c3231a9b870f584e9b2362676) ) \ + ROM_LOAD( "95008825.bin", 0x0000, 0x100000, CRC(7fdae5e2) SHA1(57bcb01b66bdd7ad68dc601f67bc13229ad604f8) ) \ + +#define sc_fast_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008453.bin", 0x0000, 0x0a5c12, CRC(bc1d0d4b) SHA1(1a6de68ead3287b32741dd596ca23b64e2a47925) ) \ + +#define sc_fnclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008670.bin", 0x0000, 0x100000, CRC(345c0993) SHA1(9fdc586c415c5f4586b8395d4a8d93d87792d43e) ) \ + ROM_LOAD( "95008671.bin", 0x0000, 0x100000, CRC(11dd3c77) SHA1(f125c510a10819dac3391a582277f99b53c131fa) ) \ + +#define sc_fdice_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_fires_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008442.bin", 0x0000, 0x100000, CRC(8b815735) SHA1(8374c706a5378bb8923fd331b96dd07f0204b2e7) ) \ + +#define sc_ftcas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008894.bin", 0x0000, 0x0ff163, CRC(9a25809f) SHA1(8be16ac75056be025b4881d50493650c8e290183) ) \ + +#define sc_floop_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890455.bin", 0x0000, 0x5000, CRC(e69028e8) SHA1(4b2f2daf0f0cda3fb9c48fe04eaedce3a1bb1bcd) ) \ + ROM_LOAD( "95890456.bin", 0x0000, 0x5000, CRC(93066cdc) SHA1(6bae40c87d083d11ec3b920637c10427ab30d0e2) ) \ + ROM_LOAD( "95890457.bin", 0x0000, 0x5000, CRC(0dbca080) SHA1(3855987a78f1110741ed8580999c3eceb9126378) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008974.bin", 0x0000, 0x0fdd10, CRC(22b0f002) SHA1(df0e66b693ea5587b6cb54847adafc4720dddaa6) ) \ + +#define sc_fbspn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008526.bin", 0x0000, 0x100000, CRC(81890751) SHA1(1e9cedc07c9028eb65620371d9fcf73ae84ad274) ) \ + +#define sc_fire_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008307.bin", 0x0000, 0x100000, CRC(e1b9b37c) SHA1(96bc9cb530f94b77c3243b2d9d743aeed209d64d) ) \ + +#define sc_fguy_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008813.bin", 0x0000, 0x100000, CRC(e5548d68) SHA1(ac20af71cedd0c6d61d6a28afa8d700c1446e442) ) \ + ROM_LOAD( "95008814.bin", 0x0000, 0x100000, CRC(06f3165c) SHA1(936a8c1d31bca93a5b985e89c48a1faaef602ae0) ) \ + +#define sc_fmj_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008982.bin", 0x0000, 0x0fe74c, CRC(c5ce4a41) SHA1(abbecddba4dd4691240df112138fa95f1e125a85) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890477.bin", 0x0000, 0x5000, CRC(a7dd60c5) SHA1(dfa3a89939cec2225d975984caf4703d83708b85) ) \ + ROM_LOAD( "95890478.bin", 0x0000, 0x5000, CRC(d24b24f1) SHA1(0c3a9c9579bb1066ea3e82e58b65d3bcac7fe900) ) \ + ROM_LOAD( "95890479.bin", 0x0000, 0x5000, CRC(4cf1e8ad) SHA1(924b454aa9c7340374b98201fbbaf922b836d779) ) \ + +#define sc_fwp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "5wayssnd.bin", 0x0000, 0x0f0833, CRC(0f165ccb) SHA1(709c91845cbe6b17c888e143eb121d649a221418) ) \ + +#define sc_fwpcs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_grq_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008357.bin", 0x0000, 0x100000, CRC(c5d8c1ba) SHA1(b017c0b616b5ad2e54f111571b16067269a0e69f) ) \ + +#define sc_gldfv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008347.bin", 0x0000, 0x100000, CRC(1d24f3ed) SHA1(01c7a8d2c8811cccee3748305681df75361f2254) ) \ + +#define sc_gldgo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009166.bin", 0x0000, 0x100000, CRC(06ae879f) SHA1(b4357306f4361bd26532e3db399f105f09fdf5be) ) \ + ROM_LOAD( "95009167.bin", 0x0000, 0x100000, CRC(5e34266d) SHA1(35fa153ccb7fd9001cd23dc0c9e683291615e9e0) ) \ + +#define sc_gldsp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008543.bin", 0x0000, 0x0d877c, CRC(eabb0fd5) SHA1(260807cf2ce23e02bfaa7d880823e606f8240bee) ) \ + +#define sc_gmclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009112.bin", 0x0000, 0x100000, CRC(80be159b) SHA1(2e6d19f97613152fcb17d027efc886815102fd56) ) \ + ROM_LOAD( "95009113.bin", 0x0000, 0x100000, CRC(edd3d30e) SHA1(94a56fda349d998b8571c271041d11cc79afaec2) ) \ + +#define sc_gamcs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004285.snd", 0x0000, 0x080000, CRC(034a84a6) SHA1(f5b815d943fe9f7eaff4358657426be5260753bf) ) \ + +#define sc_game_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004285.snd", 0x0000, 0x080000, CRC(034a84a6) SHA1(f5b815d943fe9f7eaff4358657426be5260753bf) ) \ + +#define sc_ziggy_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008472.bin", 0x0000, 0x0ece7a, CRC(12a9ec95) SHA1(1c3634b27718b1ce496c02c7dd6ef29800d1d2ee) ) \ + +#define sc_gldcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008968.bin", 0x0000, 0x0f4e4e, CRC(23e718a6) SHA1(1c781380d6b4fb307af6cb81be830159ce610352) ) \ + +#define sc_ghost_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008594.bin", 0x0000, 0x0b2ad7, CRC(3f7767d0) SHA1(b7ca39a42b59d1ac2088412fbb5f987b68f0189a) ) \ + +#define sc_ggrid_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008346.bin", 0x0000, 0x0e486b, CRC(1ec79154) SHA1(d6aff554e882e6f689caed383db79c752c9e672b) ) \ + +#define sc4ggcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008400.bin", 0x0000, 0x0e486b, CRC(78704d20) SHA1(c5f62434785b10d2bff5bcf415c2236b4f1ee551) ) \ + +#define sc4goldo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004165.bin", 0x0000, 0x080000, CRC(c52f4218) SHA1(2648f3ef35d68bdd14a0a773151157dae0271067) ) \ + ROM_LOAD( "95004166.bin", 0x0000, 0x080000, CRC(a77f1337) SHA1(e292c87fa8e643846cc0ddd7b9a585429b7efdd6) ) \ + +#define sc_gocas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_gshot_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008904.bin", 0x0000, 0x0b32a1, CRC(6e11054e) SHA1(45ff06ce84cf1675747976b11e144a43d96977ac) ) \ + +#define sc_goldw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008356.bin", 0x0000, 0x080000, CRC(c8f1ca20) SHA1(13136df35c09fea102c5176e249436f9e64616a5) ) /* golden winner */ \ + ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) /* triple casino */ \ + ROM_REGION( 0x400000, "sc1", ROMREGION_ERASE00 ) /* looks like a sc1/sc2 game, move */ \ + ROM_LOAD16_BYTE( "958402.11 10p no enrich.bin", 0x0000, 0x008000, CRC(00ed0ab4) SHA1(60e6a4abcf74ed705007cda699cdf8f52160a683) ) \ + ROM_LOAD16_BYTE( "958402.12 10p no enrich.bin", 0x0000, 0x008000, CRC(51af0108) SHA1(e6333e2879f7b2b3b558b6909e177f3101f503e6) ) \ + +#define sc_gx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004185", 0x0000, 0x080000, CRC(86756ea2) SHA1(86180e038a9bb3a3a700af1ddc571794e6948165) ) \ + +#define sc_gxcas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004185", 0x0000, 0x080000, CRC(86756ea2) SHA1(86180e038a9bb3a3a700af1ddc571794e6948165) ) \ + +#define sc_gx3_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_gd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008187.bin", 0x0000, 0x100000, CRC(1fbbc7cc) SHA1(6e19b582a3654bbbcf65b8f42bd556029f43e8cb) ) \ + ROM_LOAD( "95008188.bin", 0x0000, 0x100000, CRC(a74b23a7) SHA1(f7948edfb5524eaf80039c07ca7a9f76883f5a6f) ) \ + ROM_LOAD( "95009061.bin", 0x0000, 0x100000, CRC(c4cad720) SHA1(ce67af8d9e0b2f4f79d38b7a01dfc5ff7323e162) ) \ + ROM_LOAD( "95009062.bin", 0x0000, 0x100000, CRC(509761d3) SHA1(6a133cc33bac6a1696de98a4961572a86cefc1c8) ) \ + +#define sc_gdmz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008980.bin", 0x0000, 0x0fe431, CRC(c09277a0) SHA1(227609194f7d7e8b00cbd5cb94f8679f8fff71c6) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890471.bin", 0x0000, 0x5000, CRC(98fce599) SHA1(559534c3b33c6390a06b2e97e4c595055c8c4fea) ) \ + ROM_LOAD( "95890472.bin", 0x0000, 0x5000, CRC(ed6aa1ad) SHA1(83b69606398a30cb9c2ebc2f7406ef3215afab9e) ) \ + ROM_LOAD( "95890473.bin", 0x0000, 0x5000, CRC(73d06df1) SHA1(6959ee1b1c05398bc95430fea3590e5a86dd4312) ) \ + +#define sc_gdclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008248.bin", 0x0000, 0x100000, CRC(abfba7ee) SHA1(95b61b34080196d745cc00ae32a333edb111da89) ) \ + +#define sc_glad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_gunp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008744.bin", 0x0000, 0x100000, CRC(be8313a2) SHA1(247ec0b2140d261bf5e7ab21cedb4ad2fd708ca7) ) \ + ROM_LOAD( "95008745.bin", 0x0000, 0x100000, CRC(355caf88) SHA1(82951c00efd27533ccbc78b46cd5b69be5c3e26d) ) \ + +#define sc_gag_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004132.1_1", 0x0000, 0x080000, CRC(17320a32) SHA1(113ab1db5227fe17053969dd98f94f0b3b7555f5) ) \ + ROM_LOAD( "95004132.1_2", 0x0000, 0x080000, CRC(03593875) SHA1(a5f6730664b1bbfdb7b98b41379e9b240f43c53c) ) \ + +#define sc_goud_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004288.sn1", 0x0000, 0x080000, CRC(ae6d0680) SHA1(467d0127e2a63ca031ebf2816dde99273b513913) ) \ + ROM_LOAD( "95004289.sn2", 0x0000, 0x080000, CRC(9c88f3c8) SHA1(1152077f59cc28726f1428a9fdaf2c92ddef6c73) ) \ + +#define sc_hirol_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890458.bin", 0x0000, 0x5000, CRC(237fc19f) SHA1(41c0dad102e8345c568f6178b13a17acedcbe1b3) ) \ + ROM_LOAD( "95890459.bin", 0x0000, 0x5000, CRC(56e985ab) SHA1(48c425f85a8feba6775f2b34be8c91c78c233d66) ) \ + ROM_LOAD( "95890460.bin", 0x0000, 0x5000, CRC(c85349f7) SHA1(7be87d120dc5d5972663ede3df6c9221deddff9b) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008977.bin", 0x0000, 0x0d9fcb, CRC(99173f54) SHA1(86d6432a37453865f6ee3b80bf8e1c1c84c6e3f9) ) \ + +#define sc_hulk_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008367.bin", 0x0000, 0x100000, CRC(37eea219) SHA1(e612b2c0bca83d742b35fbaf487b6805cfac024d) ) \ + ROM_LOAD( "95008368.bin", 0x0000, 0x100000, CRC(06549054) SHA1(923a320f9689361802dc82db467b294f7bc85147) ) \ + +#define sc_hapnt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008290.bin", 0x0000, 0x100000, CRC(427fc43d) SHA1(c63154c7f2bb3e7ec78e31268a8040d0eb131f2f) ) \ + ROM_LOAD( "95008312.bin", 0x0000, 0x100000, CRC(cf33e14d) SHA1(33382be257a145784d9de7050b5c90f725241de4) ) \ + +#define sc_hfcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004272.bin", 0x0000, 0x080000, CRC(843cea31) SHA1(1d3a524600c8a0b7d6e3a32cad71f7f53c8190a1) ) \ + ROM_LOAD( "95004273.bin", 0x0000, 0x080000, CRC(c0782f35) SHA1(d763f7f8377c97129485522b201413e35c9c5760) ) \ + +#define sc_hill_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008494.bin", 0x0000, 0x100000, CRC(b2a2d2ca) SHA1(f9cd50c043dd58e4c92f94e4255c2fcb47963d39) ) \ + +#define sc_himi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008268.bin", 0x0000, 0x0ff264, CRC(6d5e7041) SHA1(bcc7b5c000aa8c25818aa063cd74f998484224a2) ) \ + + +#define sc_hiss_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008910.bin", 0x0000, 0x0fff2c, CRC(e5079d76) SHA1(0c44060d695e44720e7c34a9a142bdccd86ee943) ) \ + +#define sc_hotdg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_hotrd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008571.bin", 0x0000, 0x100000, CRC(50331772) SHA1(84aa448320210bfa8ea656f59cc4a320a0a46a32) ) \ + +#define sc_hotsh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008382.bin", 0x0000, 0x100000, CRC(cbf27ec8) SHA1(5be29fb836688e63d90e5a5108c6bdec09dd12a5) ) \ + +#define sc_hotwd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008309.bin", 0x0000, 0x100000, CRC(8cd75778) SHA1(5d75c10b32477faa24c73ad03de75914385787f6) ) \ + ROM_LOAD( "95008334.bin", 0x0000, 0x100000, CRC(0c334241) SHA1(3e5bde03330a5684a2a40fa94b33345039cd3755) ) \ + +#define sc_celeb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008440.bin", 0x0000, 0x100000, CRC(72a98e5d) SHA1(5f3e441d6c3fa2373284cee704630028cf7800ad) ) \ + ROM_LOAD( "95008441.bin", 0x0000, 0x100000, CRC(d7382975) SHA1(f5a4d92f243ec745f91d008d623b43dfa024635c) ) \ + +#define sc_iab_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890446.bin", 0x0000, 0x5000, CRC(8fbf0046) SHA1(5e121f73fcf1777041995c9891465e17c37c8163) ) \ + ROM_LOAD( "95890447.bin", 0x0000, 0x5000, CRC(fa294472) SHA1(71fa4cfaf8ba81f446d9f3504123e3c0c9a9af90) ) \ + ROM_LOAD( "95890448.bin", 0x0000, 0x5000, CRC(6493882e) SHA1(c69401b35ef710d0df51541e615818dbd259c7f7) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008969.bin", 0x0000, 0x0fe101, CRC(798c9559) SHA1(4afb21a78be73353741b5903099d3c48e44fcebb) ) \ + +#define sc_ijbdo_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891076.bin", 0x0000, 0x5000, CRC(d535ed90) SHA1(0e349023bec422b356d7b9cf7f892a10fabbdedd) ) \ + ROM_LOAD( "95891077.bin", 0x0000, 0x5000, CRC(a0a3a9a4) SHA1(e74ec6d2729bbef737300a014e83409ef034f605) ) \ + ROM_LOAD( "95891078.bin", 0x0000, 0x5000, CRC(3e1965f8) SHA1(b37c73edf7f4b17fe3554fa394846929ad2031c0) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008896.bin", 0x0000, 0x0eeaef, CRC(d581cb00) SHA1(16b44ba6cf4008109792a016d7aef12e6d6329d7) ) \ + +#define sc_inspn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008909.bin", 0x0000, 0x0face9, CRC(e79bdfa0) SHA1(b31362a2d14c17b1367b45ea8734e408a2899fc2) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890327.bin", 0x0000, 0x5000, CRC(f63a2e4f) SHA1(2982130035f122a3d9a4f4a277bc272c9613562b) ) \ + ROM_LOAD( "95890328.bin", 0x0000, 0x5000, CRC(83ac6a7b) SHA1(e4aae883b1070278314c6d388a132d362a059c5b) ) \ + ROM_LOAD( "95890329.bin", 0x0000, 0x5000, CRC(1d16a627) SHA1(985d526178de176869fdad3c4264f47de14d4d7f) ) \ + +#define sc_ijob_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008764.bin", 0x0000, 0x100000, CRC(995c0c63) SHA1(7459e92ad80d4eb61008a011bf5ae3a1d5cb8f9d) ) \ + ROM_LOAD( "95008765.bin", 0x0000, 0x0fb251, CRC(3c2feab2) SHA1(797ef43d2166c0522f6da5dd17bf4443f08891a5) ) \ + +#define sc_jjok_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_kingx_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890374.bin", 0x0000, 0x5000, CRC(87f2ca06) SHA1(480be8b0a42c9be55cb9e4c264438667734eb644) ) \ + ROM_LOAD( "95890375.bin", 0x0000, 0x5000, CRC(9b243aba) SHA1(537783dff8f155921a378224f2a8fe754c4947a5) ) \ + ROM_LOAD( "95890376.bin", 0x0000, 0x5000, CRC(587e182a) SHA1(23de9e8b4d2631e53917346d4902813d474e64a0) ) \ + ROM_LOAD( "95890700.bin", 0x0000, 0x5000, CRC(fab9a6f1) SHA1(a7901e76e96f083ca65ffbd847b36e1140c6caaf) ) \ + ROM_LOAD( "95890701.bin", 0x0000, 0x5000, CRC(e66f564d) SHA1(7267fd9d4ad1b1886870eb89c940f59a8f84c014) ) \ + ROM_LOAD( "95890702.bin", 0x0000, 0x5000, CRC(253574dd) SHA1(15b9aac5e9a176f792eefcbd7de2ad8df38ff67b) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008995.bin", 0x0000, 0x0931b3, CRC(e874bd15) SHA1(8adb32532dd053ca2c4e0987352013310ce197a0) ) /* = 95008995.bin sc4ckx Casino King X (Mazooma) (Scorpion 4) */ \ + +#define sc_ldvl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008866.bin", 0x0000, 0x0ff4f6, CRC(de0f7488) SHA1(dc9d546efa940f0cc69afb296bda0f07f82a4258) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890764.bin", 0x0000, 0x5000, CRC(15baa871) SHA1(9d3f021cfde738bc68d99f072160aee3eeaf8798) ) \ + ROM_LOAD( "95890765.bin", 0x0000, 0x5000, CRC(602cec45) SHA1(94f97824a90c4771e8c1fbab2cb41723b786f7be) ) \ + ROM_LOAD( "95890766.bin", 0x0000, 0x5000, CRC(fe962019) SHA1(e7283db78ac104bb47a37e5e81d50cd81db477f5) ) \ + +#define sc_lotrf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008251.bin", 0x0000, 0x100000, CRC(2af25e80) SHA1(fb606e434ac99eee6e114d6639f28f0fa1e7ffb3) ) \ + ROM_LOAD( "95008252.bin", 0x0000, 0x100000, CRC(fbca1cfb) SHA1(27c610af14b10d1d72774186fd3afc12d5db925e) ) \ + +#define sc_lotr2_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008320.bin", 0x0000, 0x100000, CRC(8ba801e3) SHA1(4d6a009c2f4f4478276f1227af6315b4be90fc87) ) \ + ROM_LOAD( "95008321.bin", 0x0000, 0x100000, CRC(42482ddc) SHA1(304961f267b85bc599dd64c97c14f34b2913dd59) ) \ + +#define sc_ltr2c_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008342.bin", 0x0000, 0x100000, CRC(44f48bf6) SHA1(2b36fb9ca6eb9cb35cf67e580d736c711d96ea25) ) \ + ROM_LOAD( "95008343.bin", 0x0000, 0x100000, CRC(f35a7927) SHA1(f2a93c8ff4699c7e6572a7a43b6b2bc50683594c) ) \ + +#define sc_lotrt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008517.bin", 0x0000, 0x100000, CRC(8092eaeb) SHA1(fea226ea7fb97226c79132aa67b89078f67cd920) ) \ + ROM_LOAD( "95008518.bin", 0x0000, 0x100000, CRC(6ac28d4e) SHA1(cdf50c856324130156115259efbfb7553480c749) ) \ + +#define sc_lotrr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008413.bin", 0x0000, 0x100000, CRC(66d6fd58) SHA1(dff5cc3f09fb4082fde4d5d4a9ecfe00cbce7242) ) \ + ROM_LOAD( "95008414.bin", 0x0000, 0x100000, CRC(8ec846ac) SHA1(3f66cbe5bc7190406425488beccb3e1d15356b1a) ) \ + +#define sc_luck7_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "lucky7s.bin", 0x0000, 0x200000, CRC(93002e7d) SHA1(50edf9064fb3bc9fd13efc65be6b12a4329fdb41) ) \ + +#define sc_monky_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890706.bin", 0x0000, 0x5000, CRC(4b2c5ee0) SHA1(e5bdcc4f076cc5550e51f3f4d4de5d8c59a4f545) ) \ + ROM_LOAD( "95890707.bin", 0x0000, 0x5000, CRC(3eba1ad4) SHA1(c780a4813c6b507a7e21ef2d7a401f3d764fd0f7) ) \ + ROM_LOAD( "95890708.bin", 0x0000, 0x5000, CRC(a000d688) SHA1(bcc197af2596b9c81cc56926fefc5854d7a94a27) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008998.bin", 0x0000, 0x0f0a3e, CRC(cc0dd8f2) SHA1(c99c54ce1289604f57ce2345ec5cb69be91b69d6) ) \ + +#define sc_mobob_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008842.bin", 0x0000, 0x100000, CRC(3205f4c9) SHA1(a8b92e1558911e02281b1c38c64c5e04836794b0) ) \ + ROM_LOAD( "95008843.bin", 0x0000, 0x100000, CRC(95057e16) SHA1(6c26451dd336f908ce0fcea0c56176b589111868) ) \ + +#define sc_momil_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009110.bin", 0x0000, 0x100000, CRC(8ec67890) SHA1(ba7f8cd4315a4ca8d2adeedc40c50e9e9a9b38f6) ) \ + ROM_LOAD( "95009111.bin", 0x0000, 0x100000, CRC(de68000c) SHA1(be69779ccb213a95698c2eafafe1f4a339febc4f) ) \ + +#define sc_mombc_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890597.bin", 0x0000, 0x5000, CRC(0d24f414) SHA1(85912d9e07995ffd6682d1ef65e4d71090b6584f) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_moms_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891135.bin", 0x0000, 0x5000, CRC(3fdecc78) SHA1(271699c347bcd2b40282d22f9e1a4e36713845e1) ) \ + ROM_LOAD( "95891136.bin", 0x0000, 0x5000, CRC(4a48884c) SHA1(d641295cdcc0226c64797d24799d8508ef13f204) ) \ + ROM_LOAD( "95891137.bin", 0x0000, 0x5000, CRC(d4f24410) SHA1(a35803e69aa8a45d46409baebbcbc20a35c1ac5d) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009023.bin", 0x0000, 0x0ffbf6, CRC(a10e8614) SHA1(85fc093f176cb81660717eb84301e9204402e83e) ) \ + +#define sc_mopl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mor2r_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891090.bin", 0x0000, 0x5000, CRC(a5009c47) SHA1(38b08c39ded1f1baef8a01373f19694b49d032b7) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009004.bin", 0x0000, 0x0ffe87, CRC(2403a082) SHA1(cd69739b2249724e3a88ea1c0b61151aeae0ea01) ) \ + +#define sc_monwa_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891094.bin", 0x0000, 0x5000, CRC(a241259b) SHA1(94dfcc7371593d983c8b62dba085b3ec51a33ed1) ) \ + ROM_LOAD( "95891095.bin", 0x0000, 0x5000, CRC(d7d761af) SHA1(a7adda6fe7bcec0f40587273a9a1d16a220f400a) ) \ + ROM_LOAD( "95891096.bin", 0x0000, 0x5000, CRC(496dadf3) SHA1(997f91c4c96b8971cc3ccfcaaaa42af6aac42ddd) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008010.bin", 0x0000, 0x0d5d57, CRC(1a75f403) SHA1(3bb5ca732d27aa4b8a2c96945be7e32c2abfe1c4) ) \ + +#define sc_cmcob_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891127.bin", 0x0000, 0x5000, CRC(7e7d858c) SHA1(8fe2b07275ad36ae80149e091582f729c8a1d240) ) \ + ROM_LOAD( "95891128.bin", 0x0000, 0x5000, CRC(acfcec9c) SHA1(270b9ae893016d6272f599fa29402d911650b85f) ) \ + ROM_LOAD( "95891129.bin", 0x0000, 0x5000, CRC(c7299792) SHA1(f6279d507091d257a74b2419ec883c363b3c548f) ) \ + ROM_LOAD( "95891130.bin", 0x0000, 0x5000, CRC(15a8fe82) SHA1(7fb448b5559d8248a302b7b0cfaa7dfa07dc16dd) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009021.bin", 0x0000, 0x0ff73b, CRC(068c715c) SHA1(25f80da3b548b9b0b6331d402d732a312985993b) ) \ + +#define sc_mogta_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009039.bin", 0x0000, 0x100000, CRC(0756b1b7) SHA1(82a8f9bf4c70a492ae2d4f478ecc73cccf9aecdd) ) \ + ROM_LOAD( "95009040.bin", 0x0000, 0x100000, CRC(9a928ef4) SHA1(5b19f70d067540aef3dc140115c12601d2b8176e) ) \ + +#define sc_monsp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004291.snd", 0x0000, 0x080000, CRC(0ea304f7) SHA1(3d524e108cd12e83956fec3997316a92a9e0898d) ) \ + ROM_LOAD( "95008183.bin", 0x0000, 0x080000, CRC(ab29f841) SHA1(908603184c3f7ead278dabd224d60e5362cdafbe) ) \ + ROM_LOAD( "95008184.bin", 0x0000, 0x080000, CRC(45ef95ea) SHA1(1e1126b542621e723eaf6e38918162fe701247e0) ) \ + +#define sc_monop_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008391.bin", 0x0000, 0x0ec7b3, CRC(fad36ca8) SHA1(67918353945429183befba56ab891a1d138f2e8b) ) \ + ROM_LOAD( "95008514.bin", 0x0000, 0x0ed840, CRC(2608cbde) SHA1(4831570fbc825592781e6473173d6ec911a0054d) ) \ + +#define sc_mmm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008944.bin", 0x0000, 0x0c76af, CRC(d2683fa2) SHA1(ebccd3da695cc69826493ac9e745b8dc2ce2ab8c) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890425.bin", 0x0000, 0x5000, CRC(fde2f6d4) SHA1(e62c28175138ed7d92c1e00c0a07a8e1f4a41ad2) ) \ + ROM_LOAD( "95890426.bin", 0x0000, 0x5000, CRC(8874b2e0) SHA1(0ba474cd47a65a5120df20b0f1ffcfe0aa51b0c5) ) \ + ROM_LOAD( "95890427.bin", 0x0000, 0x5000, CRC(16ce7ebc) SHA1(8561cf7808f09a92af8715999000684c1bef11bb) ) \ + +#define sc_mmad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008519.bin", 0x0000, 0x0fe4d6, CRC(e16efe22) SHA1(144e93e01967f343607ee8cee6add3d8ac8f5f28) ) \ + +#define sc_mdm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mhn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008857.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) /* r2r sounds */ \ + +#define sc_mhp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008707.bin", 0x0000, 0x100000, CRC(88ffdb28) SHA1(724a2fe6703d4e5aab7d3989be9d3ae4dc8ab057) ) \ + ROM_LOAD( "95008708.bin", 0x0000, 0x100000, CRC(fa8aa99e) SHA1(bd4dd726b0af371d9b8589de461316990c3232dc) ) \ + +#define sc_mmb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008612.bin", 0x0000, 0x100000, CRC(5f76152c) SHA1(c9f0ac000ec0b11ac3ba5eb5ff7e3dc2084f6744) ) \ + ROM_LOAD( "95008613.bin", 0x0000, 0x100000, CRC(df266121) SHA1(ece6b5a42ec3d18d97cffe3e6c98c6e6cd34682b) ) \ + ROM_LOAD( "95009168.bin", 0x0000, 0x100000, CRC(1ad311a5) SHA1(bd7728423cd855ea58fe21097d3d3db5a7e08339) ) \ + ROM_LOAD( "95009169.bin", 0x0000, 0x100000, CRC(23a8705f) SHA1(a36e71706cee64b56958fe4aefba8b85d2369e38) ) \ + +#define sc_mrh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008852.bin", 0x0000, 0x0c845b, CRC(265db01b) SHA1(6b9b62eded887ec528bb53b255d539122124eccc) ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890721.bin", 0x0000, 0x5000, CRC(766aaa4d) SHA1(bd1bfd7209e4d54e1fc798b720b749dd7ce8f9e6) ) \ + ROM_LOAD( "95890722.bin", 0x0000, 0x5000, CRC(6abc5af1) SHA1(61ef7254ab948899df9de693227e0eff2ad22e74) ) \ + ROM_LOAD( "95890723.bin", 0x0000, 0x5000, CRC(a9e67861) SHA1(2ce81fb21e709438c63d5eb74d107e6dc1905dd2) ) \ + +#define sc_mr2r_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008893.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) \ +/* ROM_LOAD( "95008983.bin", 0x0000, 0x0f2fe8, CRC(a7f64802) SHA1(8a667ebf29feaffb2676ebd770b570c1015f3c2a) ) */ \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890480.bin", 0x0000, 0x5000, CRC(3618777f) SHA1(97ab5be3bcdbe1c94e638c4dceac69bbfe359a0e) ) \ + ROM_LOAD( "95890481.bin", 0x0000, 0x5000, CRC(438e334b) SHA1(69b132ea3cbe31d31fd6fa6b915ddc2f4e66f068) ) \ + ROM_LOAD( "95890482.bin", 0x0000, 0x5000, CRC(dd34ff17) SHA1(b057c4a70066e8e8f9657e16adc4e0bfb6f00494) ) \ + +#define sc_mcas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008436.bin", 0x0000, 0x0e6369, CRC(32e8df77) SHA1(fa044287970d4e54af53ff492eabc50afa9a7a92) ) \ + ROM_LOAD( "95008991.bin", 0x0000, 0x0ec7b3, CRC(fad36ca8) SHA1(67918353945429183befba56ab891a1d138f2e8b) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890727.bin", 0x0000, 0x5000, CRC(10ec3f00) SHA1(986bfce992e113bab26eea8d1981905a54367b94) ) \ + ROM_LOAD( "95890728.bin", 0x0000, 0x5000, CRC(0c3acfbc) SHA1(ff39c8236d5bd44c7d238edd1827af5aebc46e5c) ) \ + ROM_LOAD( "95890729.bin", 0x0000, 0x5000, CRC(cf60ed2c) SHA1(df015b71567d6762b4c8ea6ad6d719cefdfdc60f) ) \ + +#define sc_mowow_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890712.bin", 0x0000, 0x5000, CRC(ec6db00b) SHA1(d16a1527caa3c115e3326c897ce0fa66e3a0420d) ) \ + ROM_LOAD( "95890713.bin", 0x0000, 0x5000, CRC(f0bb40b7) SHA1(33c19dab3086cdeae4f503fbf3f3cc5f0dad98c4) ) \ + ROM_LOAD( "95890714.bin", 0x0000, 0x5000, CRC(33e16227) SHA1(87efc1a046ef6af0b72cc76a6ee393a4d1ddbce3) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008550.bin", 0x0000, 0x100000, CRC(db6343bf) SHA1(e4d702020af67aa5be0560027706c1cbf34296fa) ) \ + ROM_LOAD( "95008551.bin", 0x0000, 0x100000, CRC(2d89a52a) SHA1(244101df7f6beae545f9b823750f908f532ac1e4) ) \ + ROM_LOAD( "95008850.bin", 0x0000, 0x0af41f, CRC(8ca16e09) SHA1(9b494ad6946c2c7bbfad6591e62fa699fd53b6dc) ) \ + ROM_LOAD( "95008869.bin", 0x0000, 0x0b9d9d, CRC(f3ef3bbb) SHA1(92f9835e96c4fc444a451e97b2b8a7b66e5794b7) ) \ + +#define sc_nmare_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008664.bin", 0x0000, 0x100000, CRC(54d245d7) SHA1(503db10681bc1d6cf1cffb2a6f818c5d912a7f56) ) \ + ROM_LOAD( "95008665.bin", 0x0000, 0x100000, CRC(79a00527) SHA1(b8207d3a81e97b2233fea1df883a4128388570e4) ) \ + ROM_LOAD( "95008703.bin", 0x0000, 0x100000, CRC(5c095089) SHA1(ffba71efccf4679c2b29ab620e67f3fa45ff19d4) ) \ + ROM_LOAD( "95008704.bin", 0x0000, 0x100000, CRC(61e5d6f4) SHA1(6d221e0b3dce7507253bb7f07d99d03025d813cb) ) \ + +#define sc_nunsb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_nunsm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008522.bin", 0x0000, 0x0f9907, CRC(df612d06) SHA1(cbca56230c4ad4c6411aa5c2e2ca2ae8152b5297) ) \ + +#define sc_rainb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009122.bin", 0x0000, 0x100000, CRC(7197027f) SHA1(216e43135c00452556ad5e7647891f14641840ed) ) \ + ROM_LOAD( "95009123.bin", 0x0000, 0x100000, CRC(3454f17d) SHA1(fc45d2653a0f260702a94663939b0d0176fc1c87) ) \ + +#define sc_parot_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008736.bin", 0x0000, 0x100000, CRC(148a7600) SHA1(d57f4a667151e78715d617b3d1e963d29d83b538) ) \ + ROM_LOAD( "95008737.bin", 0x0000, 0x100000, CRC(4e61167f) SHA1(6faa7a395bd2d9067b88a9c9c365198ea26ebb39) ) \ + +#define sc_pilep_others \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891066.bin", 0x0000, 0x5000, CRC(c058097e) SHA1(f6940ac1fe02498d13d62bd4318fd7445880c9a9) ) \ + ROM_LOAD( "95891067.bin", 0x0000, 0x5000, CRC(b5ce4d4a) SHA1(918009698696ce6bd9d0d68b4dc3e4234ff552bb) ) \ + ROM_LOAD( "95891068.bin", 0x0000, 0x5000, CRC(2b748116) SHA1(f6100c3ce79b4456d2f7fcda8e48734aad48141c) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008892.bin", 0x0000, 0x0fe398, CRC(e59abfb2) SHA1(fbe9ec614774a46f93ffb3ef9b8d4ee430d0aeed) ) \ + +#define sc_potsm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008966.bin", 0x0000, 0x0ff8c9, CRC(1cc159e9) SHA1(f7f5a027806c561825656c5741166e0893a30b10) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890443.bin", 0x0000, 0x5000, CRC(d6ee4a71) SHA1(f638c1e150ae089533ea43ca66010cb7190eb646) ) \ + ROM_LOAD( "95890444.bin", 0x0000, 0x5000, CRC(a3780e45) SHA1(4babae846051a0199f0e0baa6de0c7b16c73a185) ) \ + ROM_LOAD( "95890445.bin", 0x0000, 0x5000, CRC(3dc2c219) SHA1(acad92fd6d5112a5366b609761fbd2907bbce91a) ) \ + +#define sc_cpen1_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009057.bin", 0x0000, 0x100000, CRC(7b83611b) SHA1(6163ab8e848f019190af446710b31e3516386c57) ) \ + ROM_LOAD( "95009058.bin", 0x0000, 0x100000, CRC(43858a26) SHA1(fdb831e6a2ba161e72883100c22e2e9eee335fe6) ) \ + +#define sc_potp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008483.bin", 0x0000, 0x100000, CRC(d208755d) SHA1(f87b9b7dc077f4a1bf141ae8ca1e985796c4bada) ) \ + +#define sc_pp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008942.bin", 0x0000, 0x0ebc96, CRC(42765fbc) SHA1(ab5b9240a8e71695897fd55a1385b64f63ce52c8) ) \ + ROM_LOAD( "95008948.bin", 0x0000, 0x08b98b, CRC(35e995c5) SHA1(9d12a3002423e9434bcd76fe13f9fc0891354e40) ) \ + ROM_LOAD( "95008953.bin", 0x0000, 0x0fabc8, CRC(12d96e7a) SHA1(4f5179b5817e471b891f377f0bec81dcb4a2077c) ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890380.bin", 0x0000, 0x5000, CRC(1ba73039) SHA1(6f07fa6f412e92c5a55be15f8cce7aa6f5e8dca0) ) \ + ROM_LOAD( "95890381.bin", 0x0000, 0x5000, CRC(0771c085) SHA1(5eb89b14c03cac0f56d057dc2c0c7210cc9443ea) ) \ + ROM_LOAD( "95890382.bin", 0x0000, 0x5000, CRC(c42be215) SHA1(4da4820ee08a102a2a49ce64a49f66c9548b8ab1) ) \ + ROM_LOAD( "95890398.bin", 0x0000, 0x5000, CRC(007c15b3) SHA1(8330f7e8d2dc062118016d8f003df48930a5aeb8) ) \ + ROM_LOAD( "95890399.bin", 0x0000, 0x5000, CRC(1caae50f) SHA1(1e978f7f4851384cd800ebecd9beeff1a5df8156) ) \ + ROM_LOAD( "95890400.bin", 0x0000, 0x5000, CRC(dff0c79f) SHA1(aae28c245a672417962cd19388e4d5c401708911) ) \ + +#define sc_ppcr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008950.bin", 0x0000, 0x0fabc8, CRC(291b1b0d) SHA1(9d4149d2eb1303742dcba6e0e6d1b914f8a4019e) ) \ + +#define sc_ppctc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008785.bin", 0x000000, 0x100000, CRC(4f2284e6) SHA1(4a85bce29d9ae7181aef8874d46928e397ba915a) ) \ + ROM_LOAD( "95008786.bin", 0x100000, 0x100000, CRC(2c96e78e) SHA1(feab56483b6075ffcf8f60f8c573198ee91e7d64) ) \ + +#define sc_ppdym_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008984.bin", 0x0000, 0x0e6770, CRC(8257c559) SHA1(9088fd4d28ad9701767a2a255164e7201410c33a) ) \ + ROM_LOAD( "95008989.bin", 0x0000, 0x0e6770, CRC(fb60e407) SHA1(50f7ed9d2106db2f1e746081d7ca768177e7680c) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890483.bin", 0x0000, 0x5000, CRC(0ee68077) SHA1(163a46b16da238123cd542a62119dbaa726fca1b) ) \ + ROM_LOAD( "95890484.bin", 0x0000, 0x5000, CRC(123070cb) SHA1(4f3b313c3f7bd43120dd390fd9a187523838f559) ) \ + ROM_LOAD( "95890485.bin", 0x0000, 0x5000, CRC(d16a525b) SHA1(7358a180b1db0e2c5f4442481e9483a1170974a1) ) \ + +#define sc_ppsag_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008975.bin", 0x0000, 0x100000, CRC(0203bef7) SHA1(01b1f3225eb97303a3ddc678ad51aef90d2bb84a) ) \ + +#define sc_pony_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008408.bin", 0x0000, 0x100000, CRC(a28ef50e) SHA1(c5080418585a37ea63372b427c7e67b8c010f40c) ) \ + +#define sc_popey_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008798.bin", 0x0000, 0x100000, CRC(916cb144) SHA1(c75fa7a27be4e8dbd85fa074f6228877b5c86fc9) ) \ + ROM_LOAD( "95008799.bin", 0x0000, 0x100000, CRC(2f4c8eb6) SHA1(ca02b32705352735c4217aa20e9bc82eac8c3645) ) \ + +#define sc_pwrpl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_pwrbl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008496.bin", 0x0000, 0x100000, CRC(66b32a17) SHA1(3adaa7067f91c071ca70e4c8b1c3d07f0402e1bb) ) \ + +#define sc_qual_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008354.bin", 0x0000, 0x100000, CRC(1fb18180) SHA1(c21456253b670ce140efeaff6a590f8a50112bd4) ) \ + +#define sc_quidv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008993.bin", 0x0000, 0x0fab1c, CRC(e99defa5) SHA1(43954ec9acfedc86794d577d1e3058320264471e) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890703.bin", 0x0000, 0x5000, CRC(c87e0232) SHA1(c8de2c6b4f327ffd5b6bdb1248df1ba5573b21f0) ) \ + ROM_LOAD( "95890704.bin", 0x0000, 0x5000, CRC(bde84606) SHA1(0fe8285d862b97fee2a5a43082294a061b01bb16) ) \ + ROM_LOAD( "95890705.bin", 0x0000, 0x5000, CRC(23528a5a) SHA1(ac5b5a16a1e96a600be3760bd82cae2903459c24) ) \ + +#define sc_rssh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_rhog_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008783.bin", 0x0000, 0x100000, CRC(50d2c89b) SHA1(f3e592f009765118009f97bd7d0951b72ffc2898) ) \ + ROM_LOAD( "95008784.bin", 0x0000, 0x100000, CRC(88185c65) SHA1(b3a6d06aca91dc04d9efbc1e4ff89b37bcf87a57) ) \ + +#define sc_rhclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008802.bin", 0x0000, 0x100000, CRC(36647f4a) SHA1(ffa0cdf4f2b8ccc9afda67160a50e603b2a41ae6) ) \ + ROM_LOAD( "95008803.bin", 0x0000, 0x100000, CRC(2d26ff8a) SHA1(b9c797dfb2b06b3558e9a02d197e046244f4f2fc) ) \ + +#define sc_rdrag_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008485.bin", 0x0000, 0x0e7e1d, CRC(037269cd) SHA1(7b528427740c9f1b28e00d9b45ebeb5e77ca9ead) ) /* red dragon */ \ + ROM_LOAD( "95008525.bin", 0x0000, 0x0e7e1d, CRC(0c7aa11d) SHA1(3d028d2d5558056e84626ba66f7c22286be34bd9) ) /* club red dragon */ \ + +#define sc_rdrcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008525.bin", 0x0000, 0x0e7e1d, CRC(0c7aa11d) SHA1(3d028d2d5558056e84626ba66f7c22286be34bd9) ) \ + +#define sc_rhr \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_rhx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008331.bin", 0x000000, 0x100000, CRC(b41748dd) SHA1(458409a4d2f6444af564ebe28d80e110fdb845b6) ) \ + ROM_LOAD( "95008927.bin", 0x100000, 0x0f1c08, CRC(38fccc48) SHA1(9ef11b3fbe3bbd3c5b74cee2c35581f3e41cb372) ) \ + +#define sc_rhxcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008313.bin", 0x0000, 0x0c8958, CRC(4850fb2b) SHA1(9dde245c5b4afd6dbfd33372dff35fcbeefc2fe4) ) \ + +#define sc_r2r_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_relcz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008185.bin", 0x000000, 0x100000, CRC(d41a9b86) SHA1(9269000ec8d81b24e04a98b63e3294d56439820d) ) \ + ROM_LOAD( "95008186.bin", 0x100000, 0x100000, CRC(8f5bfdaf) SHA1(ecba8cacc83224d75b8076c6fd5fe46863a0689e) ) \ + +#define sc_rotc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "rotcsnd.bin", 0x0000, 0x100000, CRC(301147a2) SHA1(49a31e1e3c8af19e524f4f4b68533e4b2cc5e03d) ) \ + +#define sc_revo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008871.bin", 0x0000, 0x0fd182, CRC(e4f3b731) SHA1(ef829105e1b45c307546127ba85f5e0e5403ab98) ) \ + +#define sc_rttt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008306.bin", 0x0000, 0x100000, CRC(9c61f2ff) SHA1(5f000dcb2ec694fa8578f32fa485e61ad065e3d5) ) \ + +#define sc_roksc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008405.bin", 0x0000, 0x0fec18, CRC(847c5cbb) SHA1(cd304c31bd1f87e6b2444b50450ab9dd42ca79eb) ) \ + +#define sc_rollo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_r66_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_rhxcs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008853.bin", 0x0000, 0x0d11f1, CRC(c055b73c) SHA1(0c668e1733a089f95c61d1fe50fde2d4217e0e5f) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890724.bin", 0x0000, 0x5000, CRC(118e80ca) SHA1(9cd3dc111710224a8916f7b0f24e8997a9d98a8c) ) \ + ROM_LOAD( "95890725.bin", 0x0000, 0x5000, CRC(0d587076) SHA1(b470b3f1c1c82526c9dd08ae7dedbdc38bfb334d) ) \ + ROM_LOAD( "95890726.bin", 0x0000, 0x5000, CRC(ce0252e6) SHA1(9d6f69de70647e12d8352bc73922393006602797) ) \ + +#define sc_redsq_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008920.bin", 0x0000, 0x0f8d12, CRC(ac69f283) SHA1(4b62d2759f82effea988310df5ca92dd9f417a6d) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890350.bin", 0x0000, 0x5000, CRC(3e015e16) SHA1(c3a180d3611f46c9d7e93309d751b2422ec672cc) ) \ + ROM_LOAD( "95890351.bin", 0x0000, 0x5000, CRC(4b971a22) SHA1(205feec301bb69bf461fc4377704f675b5664944) ) \ + ROM_LOAD( "95890352.bin", 0x0000, 0x5000, CRC(d52dd67e) SHA1(8e5623d1fe4e096b1a19a153b0d2184424642469) ) \ + +#define sc_rich_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008084.lo", 0x000000, 0x100000, CRC(2231c842) SHA1(2180109949281b053313c8a8de33496d31d4279e) ) \ + ROM_LOAD( "95008085.hi", 0x100000, 0x100000, CRC(eb748aa3) SHA1(b81acfbceb5ff9df8bb30d3da82deea70bfce2fe) ) \ + + +#define sc_rosts_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008820.bin", 0x000000, 0x100000, CRC(31c0d215) SHA1(7d0172de75e54a7c00b7c28e21d738e64597f4f5) ) \ + ROM_LOAD( "95008821.bin", 0x100000, 0x100000, CRC(9c934f26) SHA1(2598870f724a2b070c5f791a2d30e582f87c06da) ) \ + +#define sc_rovrt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008961.bin", 0x0000, 0x0feba0, CRC(174f22f8) SHA1(e96c7019a48f1499c4b766e1fb700b2d4db59d5e) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890431.bin", 0x0000, 0x5000, CRC(a3d4624e) SHA1(4d66727af8cd1f10708635655777d80fe99e02af) ) \ + ROM_LOAD( "95890432.bin", 0x0000, 0x5000, CRC(d642267a) SHA1(9f2d0cd87e6acfebd855a7669c862dc20f1a52e3) ) \ + ROM_LOAD( "95890433.bin", 0x0000, 0x5000, CRC(48f8ea26) SHA1(156a83c1980483b12577fdb680d85a3f0f7bfdbd) ) \ + +#define sc_sharp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008561.bin", 0x0000, 0x100000, CRC(98d21491) SHA1(e06156dbe83fc26968da1a2432d697d68e6b88ee) ) \ + ROM_LOAD( "95008562.bin", 0x0000, 0x100000, CRC(fb3a25e7) SHA1(e8a60e4e870438fd4a330453ce1bdf8ad836fbc0) ) \ + +#define sc_sfts_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_srrqp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891091.bin", 0x0000, 0x5000, CRC(e8a89f86) SHA1(0260292e43320b4d7a7cd93c9c058be6250a1441) ) \ + ROM_LOAD( "95891092.bin", 0x0000, 0x5000, CRC(9d3edbb2) SHA1(6a1f3030dc6438da5e83f1d9144bd7f4fab98c97) ) \ + ROM_LOAD( "95891093.bin", 0x0000, 0x5000, CRC(038417ee) SHA1(5e4234bf9b7d698b0f82af702209789948456e32) ) \ + +#define sc_witwi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008756.bin", 0x0000, 0x100000, CRC(bde21cff) SHA1(fc8945e66416447d690515161acf9260620d7768) ) \ + ROM_LOAD( "95008757.bin", 0x0000, 0x100000, CRC(7c33cf90) SHA1(f3ad90c5623d97e3bf013927945383115042b84b) ) \ + +#define sc_spnrn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008538.bin", 0x0000, 0x0de67f, CRC(5f689b5c) SHA1(a0469987b93fdd0c661ef622403e03c6edbc561a) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890178.bin", 0x0000, 0x5000, CRC(bb0186be) SHA1(575f212b555035a6a30fea7f49836f4ad72868d2) ) \ + ROM_LOAD( "95890179.bin", 0x0000, 0x5000, CRC(ea390914) SHA1(ac34e41f6e277115e5fc2ea2bb1675c1d7df0dfe) ) \ + ROM_LOAD( "95890180.bin", 0x0000, 0x5000, CRC(7483c548) SHA1(06675caa6e0e4f136995d542210bddbb2e9e2ba4) ) \ + +#define sc_srace_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_sleut_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008870.bin", 0x0000, 0x0fa9dd, CRC(9b219ee5) SHA1(a488919d305bc8a2f8d92ea73054ea9e467dbb4e) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890777.bin", 0x0000, 0x5000, CRC(12e0a0db) SHA1(f7360b7f7086111dd951c9742f4b0402dfdd988c) ) \ + ROM_LOAD( "95890778.bin", 0x0000, 0x5000, CRC(6776e4ef) SHA1(a39e7aefb57521e4782dd0a8b37c904b7b76ff29) ) \ + ROM_LOAD( "95890779.bin", 0x0000, 0x5000, CRC(f9cc28b3) SHA1(031df3658b5aec9f318f42f04e8041fd9ae1b761) ) \ + + + +#define sc_showt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008656.bin", 0x0000, 0x100000, CRC(632a4cbb) SHA1(455e6242f5c5c1a0d84aadfdda33873e8e7b2418) ) \ + ROM_LOAD( "95008657.bin", 0x0000, 0x100000, CRC(aa68db50) SHA1(52ee314549fac989dd9ee494144ee3bbb99ee283) ) \ + ROM_LOAD( "95008734.bin", 0x0000, 0x100000, CRC(8b469657) SHA1(514b3f4cbbafb3cee618b9ce0bae572f1a4fcf7b) ) \ + ROM_LOAD( "95008735.bin", 0x0000, 0x100000, CRC(fa614cc1) SHA1(e5ecce4936a8db267b08b938ab5bc7500cf98f99) ) \ + ROM_LOAD( "95008777.bin", 0x0000, 0x100000, CRC(1ff19229) SHA1(6db08982ee923ef4568caf76e05088574f99fc36) ) \ + ROM_LOAD( "95008778.bin", 0x0000, 0x100000, CRC(2f2f3ee1) SHA1(cade826fec6c07a1fffa548c96404da83db14dd7) ) \ + +#define sc_slad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008375.bin", 0x0000, 0x100000, CRC(967e41ec) SHA1(4ca9eb1db89b6f918b416f1c68805c4306850c7a) ) \ + +#define sc_srrmz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008155.bin", 0x000000, 0x100000, CRC(2c12d323) SHA1(78199130f15b90f2c8f932f40d7e1e0e0646ce57) ) \ + ROM_LOAD( "95008156.bin", 0x100000, 0x100000, CRC(775dd1cd) SHA1(2b0ffa326ae53b60dbda6eb1f066b2ea29e6dd26) ) \ + +#define sc_srrca_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_s2k_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_splgb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_spred_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_stag_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008017.lo", 0x000000, 0x100000, CRC(dab74220) SHA1(321f765e1908b65ec9d3e64bb33533d78c9cc58a) ) /* start of rom is blank?! */ \ + ROM_LOAD( "95008018.hi", 0x100000, 0x100000, CRC(ba328f08) SHA1(99880f22c2cac61b32c3e2a574b9b30daefefb3e) ) \ + +#define sc_sahed_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008353.bin", 0x0000, 0x0fbc01, CRC(593626e0) SHA1(f348d6ea347efa706b1587235241231562c447d3) ) \ + +#define sc_sirpz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "sound_1", 0x000000, 0x080000, CRC(e5e1b0d5) SHA1(bfdc90e09534b97d9a6b6804284c80800db1aff7) ) \ + ROM_LOAD( "sound_2", 0x080000, 0x080000, CRC(3f8c71ed) SHA1(3bab20e8f6af2cfb8c7bba04b29f5aec4c692c1b) ) \ + +#define sc_smk7_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004163.lo", 0x000000, 0x080000, CRC(fd8fd1a9) SHA1(a6c1bfefc7200f9ad429bf166d0deeb6092e9e4d) ) \ + ROM_LOAD( "95004164.hi", 0x080000, 0x080000, CRC(9d8d69d3) SHA1(345ea1b517828cd4b140ec91e7014176cd45f6ad) ) \ + +#define sc_smtm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95416744.bin", 0x0000, 0x100000, CRC(3aa90fed) SHA1(d399f67bbe1d6f58d4c0a9e322156055cf3dccdc) ) \ + +#define sc_spice_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008585.bin", 0x0000, 0x100000, CRC(2f15c4a4) SHA1(df543cd6ebecbbd3922bb8550e4bf349fd8eb45c) ) \ + +#define sc_swywm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_sus_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008960.bin", 0x0000, 0x0f4505, CRC(a3279a7d) SHA1(da3cc1f3c0b9301e9b4d9f5253cafa3a9385be56) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890413.bin", 0x0000, 0x5000, CRC(5cdcd7cc) SHA1(7eaf28a20ca68c7edda1ee0cb5efefd00831c024) ) \ + ROM_LOAD( "95890414.bin", 0x0000, 0x5000, CRC(294a93f8) SHA1(f81f4cdb1b7e9107835f54702772c4e5f18d9731) ) \ + ROM_LOAD( "95890415.bin", 0x0000, 0x5000, CRC(b7f05fa4) SHA1(4cfbb0c7752edc6a0df8f9b6ab77f3fb9cd8db8e) ) \ + +#define sc_srr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008213.bin", 0x0000, 0x100000, CRC(e8f82b1d) SHA1(9357f587d638289b2cd5029e5895f69097d69089) ) \ + +#define sc_sslam_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008731.bin", 0x0000, 0x100000, CRC(b6f92b76) SHA1(69be21d12940dc415816dd3c77f4eb2c1bd1a555) ) \ + +#define sc_swbak_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008929.bin", 0x0000, 0x0f973a, CRC(016f4cc0) SHA1(763c6bf389e0c1e83d903d7aec23ac1a53261e7c) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890368.bin", 0x0000, 0x5000, CRC(01900e28) SHA1(c3e86b917b48249bdf0f1072f0cf5fa4b749d834) ) \ + ROM_LOAD( "95890369.bin", 0x0000, 0x5000, CRC(74064a1c) SHA1(0c254916fd56026dfd0df2abb4dc1c0b2dff1a7d) ) \ + ROM_LOAD( "95890370.bin", 0x0000, 0x5000, CRC(eabc8640) SHA1(41a5f5530289672563210d3ef71eb896cf6b3d5d) ) \ + +#define sc_tsmp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + + +#define sc_tempt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008654.bin", 0x0000, 0x100000, CRC(9963724c) SHA1(90d22b11934e95fd2bfda026dcde51dcd74f93cc) ) \ + ROM_LOAD( "95008655.bin", 0x0000, 0x100000, CRC(12735319) SHA1(166fbcc5828fd26ace63eed127427cbd0c81570d) ) \ + +#define sc_tpsht_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_tbox_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_typ_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008662.bin", 0x0000, 0x100000, CRC(51959c94) SHA1(8a4b68460da4223071e33158747ae0ea18b83a52) ) \ + ROM_LOAD( "95008663.bin", 0x0000, 0x100000, CRC(839687b2) SHA1(a9fd3645eb903cb52b348dd8313f0d953d5a5ec0) ) \ + + +#define sc5pompa_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_vamp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008890.bin", 0x0000, 0x0ffd25, CRC(bdf5491b) SHA1(231264d83a84fcc54bf45a43a37464fc5c604d9b) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891062.bin", 0x0000, 0x5000, CRC(3816210d) SHA1(890eed46cf9d7285887d0fe422ff6c8d8bf35820) ) \ + ROM_LOAD( "95891063.bin", 0x0000, 0x5000, CRC(4d806539) SHA1(73958733c49fa020f6425aef511489965df13907) ) \ + +#define sc_viper_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* 95008474.bin = 95008910.bin sc4hiss Hissing Quid (Qps) (Scorpion 4) */ \ + +#define sc_viz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008859.bin", 0x0000, 0x100000, CRC(86e4b4a1) SHA1(21344c9e5757d8d9ad7f1cd5ce5deb9f93d18fcc) ) \ + ROM_LOAD( "95008860.bin", 0x0000, 0x0ae3ea, CRC(0e49df2c) SHA1(629b90f91e8840560ea6eaf0e94d6b2fb6aba71c) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890742.bin", 0x0000, 0x5000, CRC(247f75ec) SHA1(92d63123aabf6932b283bbbd581c1bbe526318ce) ) \ + ROM_LOAD( "95890743.bin", 0x0000, 0x5000, CRC(51e931d8) SHA1(91ceb930eac97e090de5471c8a789ddd31c65a10) ) \ + ROM_LOAD( "95890744.bin", 0x0000, 0x5000, CRC(cf53fd84) SHA1(0de52e4ce83f41f2928866fc914ed36023415a4f) ) \ + +#define sc_wacky_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008834.bin", 0x0000, 0x100000, CRC(def73602) SHA1(681aafa4c035fdbb0f03e92fa56d31c13e27ca59) ) \ + ROM_LOAD( "95008835.bin", 0x0000, 0x100000, CRC(9a10ff4f) SHA1(903e43d9db726dc5ee92abaf23b61454611064b1) ) \ + ROM_LOAD( "95009128.bin", 0x0000, 0x100000, CRC(d9883f0c) SHA1(3cfeb470248a9d5d6b653175c16f88c54d51fceb) ) \ + ROM_LOAD( "95009129.bin", 0x0000, 0x100000, CRC(969f418a) SHA1(ca65dfa23f9e6a516bc65baa8ddd80faa530af1f) ) \ + +#define sc_wotw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008925.bin", 0x0000, 0x0eea8c, CRC(9cb8a972) SHA1(9b99eea5264fa0764f4598330f442335a8024cdb) ) \ + +#define sc_wild_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890339.bin", 0x0000, 0x5000, CRC(e3fbc85c) SHA1(8fc235f53b9359d378f86819e04377e7c102428c) ) \ + ROM_LOAD( "95890340.bin", 0x0000, 0x5000, CRC(ff2d38e0) SHA1(3b62d6c6448312f999502c244d483df8a60be77a) ) \ + ROM_LOAD( "95890341.bin", 0x0000, 0x5000, CRC(3c771a70) SHA1(bf47ecdea05757d9636526308f4aeabe3748d307) ) \ + +#define sc_wca_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008524.bin", 0x0000, 0x0ec9a6, CRC(a585c613) SHA1(dbe4f3b8584b92012e84d48c232b31a0fba6e20c) ) \ + +#define sc_wok_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008811.bin", 0x0000, 0x100000, CRC(0aae3aea) SHA1(a13ca57b4ff95022392b6bf06065593c3271637a) ) \ + ROM_LOAD( "95008812.bin", 0x0000, 0x100000, CRC(4a48eabd) SHA1(30dc0cccc636c1472b7577353c1db8e88242bba4) ) \ + +#define sc_srrcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_pircl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95009200.bin", 0x0000, 0x100000, CRC(45392f4b) SHA1(9a71834e52480f87ab303c22efe15157b8f25b5c) ) \ + ROM_LOAD( "95009201.bin", 0x0000, 0x100000, CRC(3aece97c) SHA1(fc469870fef892da0a4aa49077c7746315933d40) ) \ + +#define sc_mrrcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_gball_pthers \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008161.bin", 0x0000, 0x080000, CRC(ecd13fd9) SHA1(51d11b9133d4e840ce9afd7cf716520ea0fc0343) ) \ + ROM_LOAD( "95008162.bin", 0x0000, 0x080000, CRC(b4b4a5c5) SHA1(d0748decfaee7da52d2f6a4bc0877be4243ed6fb) ) \ + ROM_LOAD( "95008465.bin", 0x0000, 0x100000, CRC(5d1fa2c9) SHA1(c12de2b89f0bcb8f1b35630fffd205fd9d5b9777) ) \ + ROM_LOAD( "95008466.bin", 0x0000, 0x100000, CRC(418068ab) SHA1(342939e9bcc1d213bc2f52666cc3765442e18635) ) \ + +#define sc_gfev_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95416146.bin", 0x0000, 0x100000, CRC(17e92fa0) SHA1(7dea5166f3f70e5d249da56f01bbe2267ce43d6a) ) \ + +#define sc_ggame_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008515.bin", 0x0000, 0x0ab5c3, CRC(70cd8480) SHA1(2da34a0c1d9d84471005f5d6491499e707c0b0d4) ) /* KGXDX */ \ + ROM_LOAD( "95008958.bin", 0x0000, 0x0435d3, CRC(31ffdb64) SHA1(e48cfa2e5b158555b4ba204fc1175810b81cbbed) ) /* MULTIGG */ \ + ROM_LOAD( "95008992.bin", 0x0000, 0x0aa536, CRC(aad10089) SHA1(d8a32f66432ee901be05435e8930d3897f4b4e33) ) /* BARX */ \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890410.bin", 0x0000, 0x5000, CRC(9588ae1d) SHA1(ae45d9e0272b2b048b99e337def1acfb2524597e) ) \ + ROM_LOAD( "95890411.bin", 0x0000, 0x5000, CRC(895e5ea1) SHA1(070df49baca709f69fa1e522b21e42b716af0ba5) ) \ + ROM_LOAD( "95890412.bin", 0x0000, 0x5000, CRC(4a047c31) SHA1(aeb969801c89b60a644b4ffc2e1bbb73f6d61643) ) \ + +#define sc_ggg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008992.bin", 0x0000, 0x0aa536, CRC(aad10089) SHA1(d8a32f66432ee901be05435e8930d3897f4b4e33) ) \ + ROM_LOAD( "95009015.bin", 0x0000, 0x0b7821, CRC(8b6ca362) SHA1(4c50935b6d1038738ce631fbdc359416197b8c03) ) \ + ROM_REGION( 0x400000, "pivs", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95890730.bin", 0x0000, 0x5000, CRC(9673d1ce) SHA1(fee90139fc8de5e7b6dfe741b4852a363c17eb93) ) \ + ROM_LOAD( "95890731.bin", 0x0000, 0x5000, CRC(8aa52172) SHA1(441a649e3da00556a8ea966a88ee9b58b4943d3b) ) \ + ROM_LOAD( "95890732.bin", 0x0000, 0x5000, CRC(49ff03e2) SHA1(f8b77c97f2b1bb5de06f4c9835275ae9b83d0988) ) \ + +#define sc_ggcas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_gnc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_hellb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004211.bin", 0x0000, 0x080000, CRC(2e729642) SHA1(c8dcdce52f930b3fa894c46907691a28a5499a16) ) \ + ROM_LOAD( "95008341.bin", 0x0000, 0x100000, CRC(486e5395) SHA1(0ad68f271f4839d50a790b7f4427e1f1f1933bd4) ) \ + +#define sc_leg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008093.bin", 0x0000, 0x100000, CRC(86e27465) SHA1(1d27358fe795286676a8031382387ff4225f7118) ) \ + ROM_LOAD( "95008094.bin", 0x0000, 0x100000, CRC(08909b00) SHA1(3e5b3da186036d7fe67ed2739de6fba79d4a978a) ) \ + +#define sc_legcb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008197.bin", 0x0000, 0x100000, CRC(234ff677) SHA1(571c2fa2b5a24d07e90e43061d9947f64874e482) ) \ + ROM_LOAD( "95008198.bin", 0x0000, 0x100000, CRC(4b03df47) SHA1(13c24cc90a618ebc7c150ab3694a1b787fb049d6) ) \ + +#define sc_luckb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008161.bin", 0x0000, 0x080000, CRC(ecd13fd9) SHA1(51d11b9133d4e840ce9afd7cf716520ea0fc0343) ) /* golden balls */ \ + ROM_LOAD( "95008162.bin", 0x0000, 0x080000, CRC(b4b4a5c5) SHA1(d0748decfaee7da52d2f6a4bc0877be4243ed6fb) ) \ + ROM_LOAD( "95008167.bin", 0x0000, 0x080000, CRC(13aaf063) SHA1(70ab005c867c0c8f63b16722f4fc3ba0c935a96f) ) /* lucky balls */ \ + ROM_LOAD( "95008168.bin", 0x0000, 0x080000, CRC(71aebb68) SHA1(479b3915552be029d459d3f05ccf668c21f05554) ) \ + +#define sc_mww_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008593.bin", 0x0000, 0x06a118, CRC(e4aee21b) SHA1(bda104a05bd2c0d4506f389c54e8842dc20d84b0) ) \ + \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890162.bin", 0x0000, 0x5000, CRC(acf9118a) SHA1(b2c9073f0496de62d66edbc1da5546b9239ac1ba) ) \ + ROM_LOAD( "95890163.bin", 0x0000, 0x5000, CRC(b02fe136) SHA1(ac52b411f8117564a8dae25b19c9395e9030bfa0) ) \ + ROM_LOAD( "95890164.bin", 0x0000, 0x5000, CRC(7375c3a6) SHA1(8e5340e201261ccd8b47334f5d23e8adb33d031f) ) \ + ROM_LOAD( "95890387.bin", 0x0000, 0x5000, CRC(7e8703c6) SHA1(139dab5081ce9bdfade8c2a188562d98a15f8bb2) ) \ + ROM_LOAD( "95890388.bin", 0x0000, 0x5000, CRC(6251f37a) SHA1(3c8beafa021b6f4d32bd46f3fd755a7f877414ea) ) \ + ROM_LOAD( "95890389.bin", 0x0000, 0x5000, CRC(a10bd1ea) SHA1(e575a7cd0d40a7282aee2b7cd9f4801408ff846d) ) \ + +#define sc_manic_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008684.bin", 0x0000, 0x100000, CRC(52b7d26e) SHA1(ba6629dbad8d00c132c0ddf6a8a41ddc99231c75) ) \ + ROM_LOAD( "95008685.bin", 0x0000, 0x100000, CRC(dc9717c0) SHA1(27234bb7c7e7bd1f395972ce2958d55e84005313) ) \ + +#define sc_pacmn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004183", 0x000000, 0x080000, CRC(4b28f610) SHA1(fff01c890a8c109bb4b522ee2391c15abdc2758c) ) \ + ROM_LOAD( "95004184", 0x080000, 0x080000, CRC(bee11fdd) SHA1(b5ce97108812e296c92a000444c1fb7a11286de4) ) \ + ROM_LOAD( "95004199.lo", 0x000000, 0x080000, CRC(3a9605c8) SHA1(ce1c94fe26eac9e145e94539f62f2bde740e5b9a) ) \ + ROM_LOAD( "95004199.hi", 0x080000, 0x080000, CRC(0ecfc531) SHA1(15e20eedf4b7d9102c40834612d111559b4dcbca) ) \ + ROM_LOAD( "97000000.evn", 0x000000, 0x080000, CRC(5b13fe7b) SHA1(1bd32e577914ab4e3bc3282261f8c3cdf015b85d) ) /* pacp */ \ + ROM_LOAD( "97000000.odd", 0x080000, 0x080000, CRC(8bab1c78) SHA1(ddc915a8c56473ba4d67d8c62c66105dd622b593) ) \ + +#define sc_paccs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_paccl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008145.bin", 0x0000, 0x100000, CRC(e2ec54f8) SHA1(bb1c40b13151ed1e3c7ba603506701457392bb8b) ) \ + ROM_LOAD( "pacmancsnd.bin", 0x0000, 0x0bbb33, CRC(c505aa18) SHA1(a99bd1c4101269e2eb2b6becf210d9991fee1da1) ) \ + +#define sc_pacpl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008049", 0x0000, 0x0ff7f5, CRC(efb3c1aa) SHA1(345ad862a329eedf7c016ddd809c8b60185d9962) ) \ + +#define sc_pmani_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008201.bin", 0x0000, 0x100000, CRC(4e0358c5) SHA1(b9d8b78c77f87eebb9408a4ea1b9fd3a64ae724d) ) \ + +#define sc_polem_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "pole_p.sn1", 0x000000, 0x080000, CRC(cbb7b019) SHA1(1404ff5fe2c3e54370a79ea141617e58e56217e9) ) \ + ROM_LOAD( "pole_p.sn2", 0x080000, 0x080000, CRC(95d9939b) SHA1(29d03f2f2d33a807df002271e14b614bae3d10e4) ) \ + +#define sc_polen_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "polesnd1.bin", 0x0000, 0x080000, CRC(09f720e3) SHA1(1a5c581b16b974e949679c3d71696984755f3c7c) ) \ + ROM_LOAD( "polesnd2.bin", 0x0000, 0x080000, CRC(80c2702b) SHA1(6c7b1d535d8f1eeb25a1a84ccf9e97b3e453af6d) ) \ + +#define sc_pog_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008750.bin", 0x0000, 0x100000, CRC(25a94ab7) SHA1(9ee3a1acb2734a5663d925fa050c15d154f79678) ) \ + ROM_LOAD( "95008751.bin", 0x0000, 0x100000, CRC(53c97577) SHA1(5ec3868967073b4ed429fed943fbcd568a85b4f3) ) \ + +#define sc_rt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008203_1.bin", 0x000000, 0x100000, CRC(778a18e5) SHA1(2ad4d0259f08786f50928064a4d345ffa6bb52e2) ) \ + ROM_LOAD( "95008204_2.bin", 0x100000, 0x100000, CRC(ef036383) SHA1(cb26a334fe043c6aba312dc6d3fe91bd93e0cb2f) ) \ + + +#define sc_rtclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_sace_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008270.bin", 0x0000, 0x0fde91, CRC(5c87d4ce) SHA1(6fce212a89334a9595411aa2d20bde5e3fae4710) ) \ + +#define sc_sf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_starp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "star prize snd1.bin", 0x0000, 0x080000, CRC(9f7f7442) SHA1(576e5e92455455ad18ae596a9dae500a17912faa) ) \ + ROM_LOAD( "star prize snd2.bin", 0x0000, 0x080000, CRC(0ae992b5) SHA1(b3a8ba472aa3a6785678a554a7fe789f9f3dc6c0) ) \ + ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "sprizesn.1", 0x0000, 0x080000, CRC(5a9a9903) SHA1(ac79fedeaa1b37661d0ec28bf6c5b141c7fcc328) ) \ + +#define sc_tetri_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008097_1.bin", 0x0000, 0x100000, CRC(01a251eb) SHA1(0cb63736065b97956f02710867ac11609b1f282c) ) \ + ROM_LOAD( "95008098_2.bin", 0x0000, 0x100000, CRC(5ebcfd20) SHA1(be415d965732b3fde47684dacdfe93711182faf4) ) \ + +#define sc_trail_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "trailblazer.bin", 0x0000, 0x0f6a6c, CRC(c27b5f9d) SHA1(24ac4ae0bec9a898690dfa2a78f765026d58255b) ) \ + +#define sc_ttpie_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008579.bin", 0x0000, 0x100000, CRC(b3741823) SHA1(77890bf89b848fa2222e885aeb51f05f033143ba) ) \ + +#define sc_vivam_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004246.bin", 0x0000, 0x080000, CRC(4e5a0143) SHA1(a9e668aceb21671a78b584fd55c21d5501ea1f8a) ) \ + ROM_LOAD( "95004247.bin", 0x0000, 0x080000, CRC(4a35b6a1) SHA1(24e4ed93149b7f6caf785ecaa5a4685585a36f5b) ) \ + ROM_LOAD( "95008719.bin", 0x0000, 0x100000, CRC(f99eafef) SHA1(7a7dedf5bf8292b94ac6da78478441335bfcb66f) ) \ + ROM_LOAD( "95008720.bin", 0x0000, 0x100000, CRC(6419033f) SHA1(3d222696dd9f4f201596fd444a031690cc8c1b0d) ) \ + ROM_LOAD( "viva_mex.sn1", 0x0000, 0x080000, CRC(ed357575) SHA1(610047e83062fd4a6d23d9b9281a3a6c04d63f7d) ) \ + ROM_LOAD( "viva_mex.sn2", 0x0000, 0x080000, CRC(aab9421d) SHA1(db2941e013597be3fe05a2b002aebdfb0f7a2b41) ) \ + +#define sc_vmclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008101.bin", 0x0000, 0x100000, CRC(751a433f) SHA1(36aaf1b2425c58bd49671fc6bd61addc33a082f1) ) \ + ROM_LOAD( "95008102.bin", 0x0000, 0x100000, CRC(155ec8ab) SHA1(5f38fb49facab94d041f315178a3d2adf9d95853) ) \ + +#define sc_vmnv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_vrgcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008143.bin", 0x0000, 0x100000, CRC(8bf35d69) SHA1(0a5017d02ba839f2f21402df99e7684ce559d931) ) \ + ROM_LOAD( "95008144.bin", 0x0000, 0x100000, CRC(1ce7f671) SHA1(ccca34515217e72ef1879a3cbad77c7adea3a665) ) \ + +#define sc_wldjk_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008999.bin", 0x0000, 0x0b4dd9, CRC(0fa36a2e) SHA1(0168a326fd50c15e8f48293dff45e1411e5044f8) ) \ + ROM_REGION( 0x400000, "pics", 0 ) \ + ROM_LOAD( "95890709.bin", 0x0000, 0x5000, CRC(4b3ba87a) SHA1(6ec85bc6d14825ea0a497e6ee6e38d17c0c7b79f) ) \ + ROM_LOAD( "95890710.bin", 0x0000, 0x5000, CRC(3eadec4e) SHA1(bbb80a6325fd561ca762a0261b68b550285bb8f6) ) \ + ROM_LOAD( "95890711.bin", 0x0000, 0x5000, CRC(a0172012) SHA1(07ceb089ec88801700ea12f52e4cc49e8c1d5d36) ) \ + +#define sc_bsp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008725.bin", 0x0000, 0x100000, CRC(e0a46426) SHA1(f6bc41c48ec1c4f113968a6ccc7a7dc81a7674b2) ) \ + ROM_LOAD( "95008726.bin", 0x0000, 0x100000, CRC(f01062bb) SHA1(a75937e85010ff4da01277336ad37bcbb8d0ba9f) ) \ + +#define sc_chain_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008318.bin", 0x0000, 0x100000, CRC(d4fb4702) SHA1(b6cdeb8e34d081a403d5918ec95e2eb387102538) ) \ + +#define sc_clown_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008552.bin", 0x0000, 0x100000, CRC(89173513) SHA1(7c332b6c14725897b0ae1ed33d38a384eae9cfdd) ) \ + +#define sc_abra_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008350.bin", 0x0000, 0x0e3be3, CRC(b19e617c) SHA1(46eb761ac44fef0ff0f1731b098b067ce6843461) ) \ + +#define sc_bbclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008383.bin", 0x0000, 0x0f350f, CRC(a93300db) SHA1(4f2864cc71b3fe7ac1b323dfd226c18be83d301f) ) \ + +#define sc_botn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008484.bin", 0x0000, 0x0f8e5a, CRC(83e34402) SHA1(e90c3ef784dfce7df2d60b06bc84ec9a21ff9a12) ) \ + +#define sc_brkfs_others \ + ROM_REGION( 0x200000, "ymz", 0 ) \ + ROM_LOAD( "95008013.lo", 0x00001, 0x100000, CRC(286e59da) SHA1(e43901f4ad9fc7f083cbb7ef5cd7e4ad6289833b) ) \ + ROM_LOAD( "95008014.hi", 0x00000, 0x100000, CRC(1b9936ad) SHA1(0c98618d1ca30fa4f9913a5214a5f431e520917c) ) \ + +#define sc_broll_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bulcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008547.bin", 0x0000, 0x100000, CRC(33d997ba) SHA1(22c28360757bad350907b145e18a8e438d68f2b1) ) \ + ROM_LOAD( "95008548.bin", 0x0000, 0x100000, CRC(896bae80) SHA1(264127b6d22c048a0a54e7a63433c3aed6f053e2) ) \ + +#define sc_bankb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008350.bin", 0x0000, 0x0e3be3, CRC(b19e617c) SHA1(46eb761ac44fef0ff0f1731b098b067ce6843461) ) \ + +#define sc_bed_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008315.bin", 0x0000, 0x100000, CRC(5098077e) SHA1(8ecba67e3585dc7851f8bacb7c5235959f883143) ) \ + +#define sc_captn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008139.bin", 0x0000, 0x0c076f, CRC(8c87abf8) SHA1(2dfdf9202378723db267ed9d8f2abd076b5214d6) ) \ + +#define sc_cashn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004292.sn1", 0x0000, 0x080000, CRC(e7efab30) SHA1(b2587c14e427fdb51cb5c96e5e017c69f5c134e8) ) \ + ROM_LOAD( "95004293.sn2", 0x0000, 0x080000, CRC(89584d87) SHA1(935b6e873342aefd1c39bb474c6b780799a0e049) ) \ + +#define sc_cashm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008123_1.bin", 0x0000, 0x100000, CRC(9f1fc98b) SHA1(9233ef6a82f8b23066f959957a7561fb33120d46) ) \ + ROM_LOAD( "95008124_2.bin", 0x0000, 0x100000, CRC(4795c128) SHA1(7b55b39f335b81f6a895ed9beb123464e10a48ee) ) \ + +#define sc_casry_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cbaz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008317.bin", 0x0000, 0x100000, CRC(05ef55b5) SHA1(5130b9243647b9724998600b5f2ef2bbe7b5b1e5) ) \ + +#define sc_cburn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "97000034.p1", 0x0000, 0x100000, CRC(f06cb0f1) SHA1(856bdd31a35e93e6f52f88f2ac738cc3fab09c11) ) \ + ROM_LOAD( "97000034.p2", 0x0000, 0x100000, CRC(cce5a2a7) SHA1(4884e8abe2dde81f70ddc13a3a68d690fc097dae) ) \ + +#define sc_ccc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004282.snd", 0x0000, 0x080000, CRC(e17fb009) SHA1(27fa336c8576bd4a2414f4d71857e9113102cb3d) ) \ + +#define sc_ccogs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_cclas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004250.bin", 0x0000, 0x080000, CRC(5250f18b) SHA1(bbdc556df845753f9ce15dd7dfb2347539dfa00f) ) \ + ROM_LOAD( "95004251.bin", 0x0000, 0x080000, CRC(7a0a7876) SHA1(f172c8a1fbe214f201e6bf671c2f0534b6d9d395) ) \ + +#define sc_cjcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008435.bin", 0x0000, 0x100000, CRC(f0b58825) SHA1(124132a510e7473ade3d03fb63f24f120d3a08e4) ) \ + +#define sc_ctlcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008181.bin", 0x0000, 0x100000, CRC(9eb3e51e) SHA1(95e90e9574cba0526e495a8b17150a5081c13df8) ) \ + ROM_LOAD( "95008182.bin", 0x0000, 0x100000, CRC(5d31955a) SHA1(49dbb4f3efc7e03d1763abb3c6db21c81e961735) ) \ + +#define sc_cfcla_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "ccfsnd1.bin", 0x000000, 0x080000, CRC(d389aeb3) SHA1(855f3d4bba4922026b1fa963e60c5e58556739c3) ) \ + ROM_LOAD( "ccfsnd2.bin", 0x080000, 0x080000, CRC(6fbda954) SHA1(812c2c96a9e750daf5ac4a878c63847bfd5a2593) ) \ + +#define sc_cfclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004144.lo", 0x000000, 0x080000, CRC(9d861825) SHA1(4b8776a014e31f5041f7e172ae69cb172f42fae5) ) \ + ROM_LOAD( "95004145.hi", 0x080000, 0x080000, CRC(9570fbbc) SHA1(34bdca9ef125e5304b238dd8f1421a888c9ba33e) ) \ + +#define sc_cfdu_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008184.bin", 0x0000, 0x100000, CRC(dc98ec1b) SHA1(6b600d7790bb0a90c5309d7e7684e4cca26c5a50) ) \ + +#define sc_cfgcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008577.bin", 0x0000, 0x100000, CRC(f18f1116) SHA1(ba47360e7b489c1bcded786dd1efe518b62b039e) ) \ + +#define sc_crcp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008743.bin", 0x0000, 0x100000, CRC(d44e91bf) SHA1(f42a8c8b0ee5f233cddb4b6084a37e45e2490dd9) ) \ + +#define sc_crcc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD16_BYTE( "95004120.lo", 0x000000, 0x080000, CRC(770a9c0f) SHA1(2d06e32b1d07bc9dc51f39f9ba22c9fe8a678ef3) ) \ + ROM_LOAD16_BYTE( "95004121.hi", 0x080000, 0x080000, CRC(239f389c) SHA1(75d6f9f500aab5f114f8b86c4ca1f8dce6ea2ca4) ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95000611.mtx", 0x0000, 0x007231, CRC(440c355b) SHA1(884eb0fdc5f6c7c4fac4157d1e5f6bddcb70e148) ) /* unzip this */ \ + +#define sc_crgc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008323.bin", 0x0000, 0x100000, CRC(461dd238) SHA1(cab717b285fb217bf47ebe07bd6e7737cf0517c9) ) \ + +#define sc_crzky_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008242.bin", 0x0000, 0x100000, CRC(7d5c1356) SHA1(efab297024650c95a0abb1296b2ebabd09b299a8) ) \ + +#define sc_crzgn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004248.lo", 0x000000, 0x080000, CRC(4fff74c5) SHA1(2704a15e3afd73848c8f3963920f606310b86963) ) \ + ROM_LOAD( "95004249.hi", 0x080000, 0x080000, CRC(2c8cdeb1) SHA1(771bcc907be91be2d178b87a76b72bd3cc07fe30) ) \ + +#define sc_cvani_others \ + ROM_REGION( 0x400000, "ymz", 0 ) \ + ROM_LOAD( "95008237.bin", 0x0000, 0x0fdb37, CRC(ce0a3555) SHA1(7ba0c53709236d41f9e73b3a5151174ca2bf3fae) ) \ + +#define sc_cvclb_others \ + ROM_REGION( 0x400000, "ymz", 0 ) \ + ROM_LOAD( "95008345.bin", 0x0000, 0x0fdb37, CRC(1e01057c) SHA1(f54cd2b59b1b4901b972b8b33c85defc975b0fac) ) \ + +#define sc_druby_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008423.bin", 0x0000, 0x100000, CRC(4cab20ee) SHA1(e27221a94e54db340eaf7fc30e722b354c85686d) ) /* triple casino */ \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + /* not sc4/sc5?, scorpion 1/2? */ \ + ROM_LOAD( "95730028.bin", 0x0000, 0x008000, CRC(015f3760) SHA1(74dfd188f4a7ad057fda45a349e684be37a3f6bc) ) \ + ROM_LOAD( "95730068.bin", 0x0000, 0x008000, CRC(2bcbcf0d) SHA1(30dbb5ec3be34520ad89aedead42e1eda7841b63) ) \ + +#define sc_darw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008214.bin", 0x0000, 0x0e7add, CRC(423575e6) SHA1(52d9a22824b0ee828095f99dcc5209787f5a2c32) ) \ + +#define sc_duckq_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008337.bin", 0x0000, 0x0fd2ce, CRC(d452995e) SHA1(3a8196f44078a4730ec18f16ce3a68b647205a29) ) \ + +#define sc_dyna_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008209.bin", 0x0000, 0x100000, CRC(7845c5e7) SHA1(14cd505e11149b6bdfa0e8a92236f3229f7a2a0e) ) \ + +#define sc_easy_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008195.bin", 0x0000, 0x100000, CRC(e032e67a) SHA1(062f48bd2c38b51ffba8cda7860bb37abad40c71) ) \ + ROM_LOAD( "95008196.bin", 0x0000, 0x100000, CRC(4a23e184) SHA1(2d1c1d92c9cdccd95ca4f466a2d7765def7d990b) ) \ + ROM_LOAD( "95008288.bin", 0x0000, 0x100000, CRC(da74e2d3) SHA1(a16b3d6c0590b0ccc7b2488a2f23383a332c332a) ) /* casino */ \ + +#define sc_fastf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008272.bin", 0x0000, 0x0fafac, CRC(a9bdc1e2) SHA1(60ff02ff4906d8b0f6392cccb96976b912c61e2d) ) \ + +#define sc_fbcrz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + /* DMD? */ \ + ROM_LOAD( "95751937.hex", 0x0000, 0x025f91, CRC(8f412e97) SHA1(a5ff924fbc327114e59d75de644ed0d5cd7fa6b3) ) \ + ROM_LOAD( "95751937.bin", 0x0000, 0x010000, CRC(4a99ee11) SHA1(335398ebc64bbfe86e2652ac080a5943dd413928) ) /* contains PC-like references and 'Rasterspeed' stuff - the only other reference I find to this is on unmamed regarding 'Zool' */ \ + +#define sc_fd7th_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "frankie snd1.bin", 0x0000, 0x080000, CRC(5d74001e) SHA1(f157706c0970af9b396c2973774c828ed1c0d275) ) \ + ROM_LOAD( "frankie snd2.bin", 0x0000, 0x080000, CRC(8863c8e6) SHA1(0e852155cb2d50d8f0b892c055b37e9955fd8da4) ) \ + \ + ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "frdesnd1", 0x0000, 0x080000, CRC(deb93ffa) SHA1(5a549b6bde6f92561952584e3184c1985903464f) ) \ + +#define sc_frboo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_frenz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008052.bin", 0x0000, 0x100000, CRC(36b422b2) SHA1(1ee085393922b46588a604c5e88ad454357711bb) ) \ + +#define sc_ftopi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "frtsnd.bin", 0x0000, 0x0a6326, CRC(f718f2f0) SHA1(eccedf4eda8eda34633b917165e063d2fbb03abf) ) \ + +#define sc_ffru_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "ff_snd.bin", 0x0000, 0x0e54bf, CRC(9d1b711d) SHA1(29386915460b8be92fc5f79177efaf05b7f613cd) ) \ + ROM_LOAD( "ff_snd1.bin", 0x0000, 0x080000, CRC(3f0cb386) SHA1(a400177b1e3b986ba5ddfa5f549180b006ced5a2) ) \ + ROM_LOAD( "ff_snd2.bin", 0x0000, 0x080000, CRC(88d7cc1a) SHA1(7cb45ccc41f0c4a842595598f6f30b78e6c42480) ) \ + +#define sc_fever_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004239.sn1", 0x0000, 0x080000, CRC(12c4d8eb) SHA1(a404bce7eb1a1148cba4a4d8326ea36e31e881b4) ) \ + ROM_LOAD( "95004240.sn2", 0x0000, 0x080000, CRC(a990a2c4) SHA1(2630dc0408359f32d05ecfd5bcc81789854e5229) ) \ + ROM_LOAD( "95008137.bin", 0x0000, 0x100000, CRC(f74f3916) SHA1(659b160db41e46a53149688f8677e73a78f22e63) ) \ + ROM_LOAD( "95008138.bin", 0x0000, 0x100000, CRC(68563cdd) SHA1(df92dadecf9242bfa147e3134039266e9016faea) ) \ + +#define sc_fevnx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004318.sn1", 0x0000, 0x080000, CRC(bb5d74bd) SHA1(104dd8b2faedce3382533c755ca05d03ec2bc50a) ) \ + ROM_LOAD( "95004319.sn2", 0x0000, 0x080000, CRC(73dc297e) SHA1(a826e7d0b88b9e01ceab21a2a92f69f15b402acb) ) \ + +#define sc_fpitc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008091.bin", 0x0000, 0x100000, CRC(81a28437) SHA1(99b9e5c04c2ab7e9aba0b9b8a0bacee424a079de) ) \ + ROM_LOAD( "95008092.bin", 0x0000, 0x100000, CRC(0987737f) SHA1(bab6bf1ffd3df5465c87996795b1c25f5e863beb) ) \ + +#define sc_fcc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004103.lo", 0x000000, 0x080000, CRC(9926f103) SHA1(f29a0d25eebd0a0990cd165116b425b795ed62e0) ) \ + ROM_LOAD( "95004104.hi", 0x080000, 0x080000, CRC(bec75a23) SHA1(cdf895081ebf3afb52d5bfaab29f713800c85fc9) ) \ + \ + ROM_REGION( 0x400000, "other", ROMREGION_ERASE00 ) \ + ROM_LOAD( "club-firecracker_mtx_ass.bin", 0x0000, 0x010000, CRC(c23ffee9) SHA1(b4f2542e8ed0b282a439e523baa6cd43c5b2cb50) ) /* DMD01 */ \ + +#define sc_frsu_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004229.bin", 0x0000, 0x080000, CRC(fe94f724) SHA1(6cebd17d277f1fa88982158d5ac9422f6f16bc3b) ) \ + ROM_LOAD( "95004230.bin", 0x0000, 0x080000, CRC(4b0a6a18) SHA1(6df706b4431cc97318df612c9533c34085cd341d) ) \ + +#define sc_fullt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008449.bin", 0x0000, 0x0fde7d, CRC(9e3ce927) SHA1(00ce43a0ca94e81ac90f53c647e40ac6cb454937) ) \ + +#define sc_gcb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_greed_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008325.bin", 0x0000, 0x100000, CRC(82356c95) SHA1(bbf9dc2e4ca20a35a8bc581e322956e17f220022) ) \ + +#define sc_gslam_others \ + ROM_REGION( 0x200000, "ymz", 0 ) \ + ROM_LOAD( "95004169.bin", 0x000000, 0x080000, CRC(d2293b2f) SHA1(e3eed38a15885c5a6d63fc79d95f77c5225e9168) ) \ + ROM_LOAD( "95004170.bin", 0x080000, 0x080000, CRC(1da0db8f) SHA1(b3c37b5e02efe7267556d8603c362298ed55bb88) ) \ + +#define sc_heatw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004287.snd", 0x0000, 0x080000, CRC(7a86c853) SHA1(60a5582f43cda30e9c48a1207ee1a4cafdce0276) ) \ + +#define sc_helrd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004326.snd", 0x0000, 0x080000, CRC(193851ca) SHA1(de71622b6d50d039bd625189303191d316bdc671) ) \ + +#define sc_helrs_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004326.snd", 0x0000, 0x080000, CRC(193851ca) SHA1(de71622b6d50d039bd625189303191d316bdc671) ) \ + +#define sc_hdd_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_hi5_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008107.bin", 0x0000, 0x100000, CRC(f2b5a284) SHA1(c2b427aa59a233eedefff55d3afdc120f486af83) ) \ + ROM_LOAD( "95008108.bin", 0x0000, 0x100000, CRC(c8bd435d) SHA1(cc78030ae92424db3ba572f355d12db7f9291bd7) ) \ + +#define sc_sprng_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008276.bin", 0x0000, 0x0f7b99, CRC(e13380bd) SHA1(f4ec3f2d4d8f20e82324fda89e5383a9689bf02a) ) \ + +#define sc_hilo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008177.bin", 0x0000, 0x100000, CRC(4dad5ea3) SHA1(efa226af2bae5bab25deb3507a635412b0f031e8) ) \ + ROM_LOAD( "95008178.bin", 0x0000, 0x100000, CRC(3a59e427) SHA1(7d530426a57dd9651aef51730b0b8a5324f81024) ) \ + +#define sc_hitsh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008239.bin", 0x0000, 0x100000, CRC(cc12346b) SHA1(dd3656a3024c3d26348482c3aa04e0f6638053f7) ) \ + +#define sc_holyw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008071.bin", 0x0000, 0x100000, CRC(005c5847) SHA1(9d8a801e70f5b1c07d46a4f6e9fab22adf5a9415) ) \ + ROM_LOAD( "95008072.bin", 0x0000, 0x100000, CRC(78756706) SHA1(56b744ec5cb431b30c13bc748d323ebe14727546) ) \ + +#define sc_h6cl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008576.bin", 0x0000, 0x100000, CRC(15d77734) SHA1(db314df1dc558ce66d3c4d62895ab699d36bdf46) ) \ + +#define sc_hyde_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_hyper_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_hf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008163.bin", 0x0000, 0x100000, CRC(0d8abe3c) SHA1(e3dc45ca8aea3113c5884ae3af9216f627ce71ba) ) \ + +#define sc_hotpr_others \ + ROM_REGION( 0x800000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "hotpropertysnd1.bin", 0x0000, 0x100000, CRC(f06cb0f1) SHA1(856bdd31a35e93e6f52f88f2ac738cc3fab09c11) ) \ + ROM_LOAD( "hotpropertysnd2.bin", 0x0000, 0x100000, CRC(cce5a2a7) SHA1(4884e8abe2dde81f70ddc13a3a68d690fc097dae) ) \ + /* bad dumps of snd1? */ \ + ROM_LOAD( "95008015.lo", 0x00000, 0x800000, CRC(6553f5b9) SHA1(17ab5162f4fd3fa5a56641f0b1cbc31c0fe1a52c) ) \ + ROM_LOAD( "95008016.lo", 0x00000, 0x800000, CRC(6553f5b9) SHA1(17ab5162f4fd3fa5a56641f0b1cbc31c0fe1a52c) ) \ + /* more alternates, or are these Monopoly Hot Property? */ \ + ROM_LOAD( "hot_p.sn1", 0x0000, 0x080000, CRC(c918da0e) SHA1(7eebd41c70be65b1455bafd4087246f41a8b3622) ) \ + ROM_LOAD( "hot_p.sn2", 0x0000, 0x080000, CRC(31fa3827) SHA1(aa099bfda63d3627cab2b5f12fe0ec7d8600f90e) ) \ + +#define sc_ijclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008888.bin", 0x0000, 0x0fc30c, CRC(71ad9f31) SHA1(40d42bbe7e3d38cab48006a4f0d4d25d2b56a647) ) \ + ROM_REGION( 0x5000, "pics", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95891060.bin", 0x0000, 0x5000, CRC(791ebcf2) SHA1(88298c6d1eec718b84e51aae447ffd74493a27f4) ) \ + +#define sc_jack_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008289.bin", 0x0000, 0x0ffb45, CRC(76d2af0f) SHA1(0460ecc4f80cceb6861b8b0ebf59f0e87bf2b38c) ) \ + ROM_LOAD( "jack the kipper sound 1 maz fc64.bin", 0x0000, 0x100000, CRC(f31090f9) SHA1(4e9edfdf6472b4229d4393cb3033134f6b27920b) ) \ + +#define sc_jjunc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008284.bin", 0x0000, 0x100000, CRC(f90feeb8) SHA1(672abc79a88b2237fa584d12b9123a2baeec83b8) ) \ + +#define sc_jjucl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008395.bin", 0x0000, 0x100000, CRC(619865d6) SHA1(9e76267140709ae2ca09ea0866fc0b27b94d26af) ) \ + +#define sc_jiggn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004179", 0x0000, 0x080000, CRC(fd2521e8) SHA1(58027efa8110004fc4d823dc19d4de115a925711) ) \ + ROM_LOAD( "95004180", 0x0000, 0x080000, CRC(7750b004) SHA1(4c6cb7a5c4b69ca1d65b57271798ac17cd06ce61) ) \ + +#define sc_jiggr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_jive_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_jolly_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008254.bin", 0x0000, 0x0f9355, CRC(4742beac) SHA1(2f060a5f54719fdf5aea1077d8d5de6534b41f0c) ) \ + +#define sc_juicy_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008216.bin", 0x0000, 0x100000, CRC(1fcf52e3) SHA1(0e585678cb928e107343ebc64f77434ac6a62555) ) \ + ROM_LOAD( "95008217.bin", 0x0000, 0x100000, CRC(995f77f6) SHA1(ac964bc58490448cd3b5a1ed0c7636c2354c8c7d) ) \ + +#define sc_jbuck_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_jjc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_jjf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004085.lo", 0x000000, 0x080000, CRC(1b1f3455) SHA1(8733193640b907cf0aae3bc474dd4f1766c6e74c) ) \ + ROM_LOAD( "95004086.hi", 0x080000, 0x080000, CRC(5b678da4) SHA1(05c3760b35e77ea70401e47762dcbf0cc779ea3c) ) \ + +#define sc_kalei_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008444.bin", 0x0000, 0x0f8d34, CRC(a6a6c950) SHA1(97b9859a8795a5890156ce68f71b3f67707efdd2) ) \ + +#define sc_kkong_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_knok_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_lasv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004261.snd", 0x0000, 0x080000, CRC(a2fbd1f1) SHA1(7ae7108235f4b9758282506558054b056d92abed) ) \ + +#define sc_lined_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004241.bin", 0x0000, 0x080000, CRC(e524fd19) SHA1(af0bcf9cf75592beb928f78a915875f3e3ecedac) ) \ + ROM_LOAD( "95004242.bin", 0x0000, 0x080000, CRC(6d86611e) SHA1(2ec6a6745446502a77c10c487b75b59be1fc266e) ) \ + + +#define sc_ldcas_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_ldvcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008897.bin", 0x0000, 0x0ff4f6, CRC(3b459b50) SHA1(ba4aa9bcf42cd95f366fbe51c343680cd3fbcd47) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95891079.bin", 0x0000, 0x5000, CRC(378bb888) SHA1(054cdcad83a3909c8c17852f3848c7a7c4daae31) ) \ + +#define sc4lockb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008223.bin", 0x0000, 0x100000, CRC(1b938782) SHA1(501567017e5097c616b90623b16e503b5ab941fd) ) \ + +#define sc_lkbcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008285.bin", 0x0000, 0x100000, CRC(c6a5033b) SHA1(9c7abea9052f606dd501e359a4fc4b69860c5269) ) \ + +#define sc_lir_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008103.bin", 0x0000, 0x100000, CRC(74ec1e6c) SHA1(1636192a63afcb060ee9453d24d7deb3a6776f51) ) \ + ROM_LOAD( "95008104.bin", 0x0000, 0x100000, CRC(b11bd959) SHA1(1739035495a14fedcbc67b724e7595693425d15f) ) \ + +#define sc_miljo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004305.sn1", 0x0000, 0x080000, CRC(1fffefe8) SHA1(e4dd8ee3ac82c598b50fe49afeddf11bcca96581) ) \ + ROM_LOAD( "95004306.sn2", 0x0000, 0x080000, CRC(afc501d4) SHA1(9a28381a7c1c047d6e7bb70736d2c8308c8911a3) ) \ + +#define sc_milja_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004305.sn1", 0x0000, 0x080000, CRC(1fffefe8) SHA1(e4dd8ee3ac82c598b50fe49afeddf11bcca96581) ) \ + ROM_LOAD( "95004306.sn2", 0x0000, 0x080000, CRC(afc501d4) SHA1(9a28381a7c1c047d6e7bb70736d2c8308c8911a3) ) \ + +#define sc_mbags_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mgr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008212.bin", 0x0000, 0x100000, CRC(1d0fffb3) SHA1(da7e10479b1ba9e67af94feaa20702bae687168f) ) \ + ROM_LOAD( "snd_mgo.p1", 0x0000, 0x100000, CRC(b2f8dd11) SHA1(2db747a0c422d7dd18972f80ba94570c69564c9b) ) \ + +#define sc_mspid_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008278.bin", 0x0000, 0x100000, CRC(8fc20733) SHA1(6ede5578fa11cb3322291958d6e1ef8f6cd99da0) ) \ + +#define sc_msclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008191.bin", 0x0000, 0x100000, CRC(4d392e0c) SHA1(798ba07fdb0bebe5367f58b1e13226827153e0e8) ) \ + +#define sc_mtb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "mtb_snd1.bin", 0x0000, 0x080000, CRC(4abca575) SHA1(8f0e3fd169cbf0876368dac335bf81ab0601c923) ) \ + ROM_LOAD( "mtb_snd2.bin", 0x0000, 0x080000, CRC(034a49dc) SHA1(aac70d867856f13f5948e81ed3ca7f2746edf134) ) \ + +#define sc_mtbcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008009.lo", 0x00001, 0x100000, CRC(b9334137) SHA1(e7481688e18b56bddee4a2eff219f83ac5180082) ) \ + ROM_LOAD( "95008010.hi", 0x00000, 0x100000, CRC(cb197b7e) SHA1(56fb416a98bc2875df11024518babf4a07418a79) ) \ + +#define sc_m2m_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_magci_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008480.bin", 0x0000, 0x0c4846, CRC(025a1417) SHA1(6f522e71b4707829c98f77551f7cd4f2910f15b5) ) \ + +#define sc_magic_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008340.bin", 0x0000, 0x0ff5d7, CRC(1371b0d9) SHA1(aa8c23a86cbd5e8274bb035c1132da11d71fd2f8) ) \ + +#define sc_maxim_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008151.bin", 0x0000, 0x184af2, CRC(775d8471) SHA1(d784e25f52e6df18da9eabf93e6b50de5217c374) ) \ + +#define sc_maxcc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_monob_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008359.bin", 0x0000, 0x0e89fa, CRC(763e4367) SHA1(c44b70f8336c2d6c00cd0dde9b6ca014667c59a6) ) \ + ROM_LOAD( "monopoly95008359_sound1.bin", 0x0000, 0x100000, CRC(93f005f2) SHA1(d2351982d6352d9793efac617ac9fb9569f229c6) ) \ + +#define sc_monod_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mou_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008364.bin", 0x0000, 0x0e98ac, CRC(47aae23d) SHA1(0964a4f68c3688ebd65daf317b17e1341fcd3ceb) ) \ + +#define sc_nmtj_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008472.bin", 0x0000, 0x0fe798, CRC(a522157a) SHA1(f1fea963579cb8caddd5fcbfa36e33dc35c6e2a0) ) \ + +#define sc_mclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mdlx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008514.bin", 0x0000, 0x0ed840, CRC(2608cbde) SHA1(4831570fbc825592781e6473173d6ec911a0054d) ) \ + +#define sc_mwwcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_mont_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004314.bin", 0x0000, 0x0ccf04, CRC(0faba601) SHA1(1f21e39c2a9a18dd74292e68456c725ec2631aac) ) /* lotech sounds? */ \ + +#define sc_motor_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_nudit_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95404303.bin", 0x000000, 0x080000, CRC(adb71c93) SHA1(e91165b0280da9f79415b1cd7bb2ff8c1ea974fe) ) \ + ROM_LOAD( "95404304.bin", 0x080000, 0x080000, CRC(96190422) SHA1(0e3192d959f1ea4296474684f04847c50a983400) ) \ + +#define sc_pen1_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "pub-en.s1", 0x0000, 0x080000, CRC(7e3f4295) SHA1(b7a2c538d79663a3d21f89311195619158fa7197) ) /* need testing */ \ + ROM_LOAD( "pub-en.s2", 0x0000, 0x080000, CRC(637d3c0f) SHA1(193964efc28e56b05f39099a696dd3e9119b80dd) ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + ROM_LOAD( "pbemydot", 0x0000, 0x010000, CRC(b056d3d4) SHA1(6c1dbc6fcb4761c25f9cc8123e9f0fe791488c19) ) /* DMD rom? Possibly SC2 DM01 */ \ + +#define sc_oyf_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008301.bin", 0x0000, 0x100000, CRC(0e042883) SHA1(2e73e5a49bcc525edfddf56e0d4ef5137116eec2) ) \ + +#define sc_opses_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008211.bin", 0x0000, 0x100000, CRC(535fbad0) SHA1(25804a47e20dcfe364f49195da0ab057bce31266) ) \ + +#define sc_outlw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_party_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008113.bin", 0x0000, 0x100000, CRC(7e54f87c) SHA1(b64e4da7c088ba2f328d6adcfd0a3824d98a5f31) ) \ + ROM_LOAD( "95008114.bin", 0x0000, 0x100000, CRC(594fef43) SHA1(8549d372ffb0194823afc11992d8a16f6caed2ff) ) \ + +#define sc_paytm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004224.sn1", 0x0000, 0x080000, CRC(74382d29) SHA1(bd0323b7208e9b03e2d8468f7d4603fb4a3fe394) ) \ + ROM_LOAD( "95004225.sn2", 0x0000, 0x080000, CRC(23efa88d) SHA1(af52ec3dcb45a2ea26eaa273c783134402105168) ) \ + +#define sc_pgold_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004316.snd", 0x0000, 0x080000, CRC(94a9ec9c) SHA1(bab1a431e2857b9db9fa3f3ef28f150e19c4ae50) ) /* casino */ \ + ROM_LOAD( "95008141.bin", 0x0000, 0x100000, CRC(e1b214dc) SHA1(811f6ec42961496f8cd9fb3434ab6a07457ca61a) ) \ + ROM_LOAD( "95008142.bin", 0x0000, 0x100000, CRC(faa84d52) SHA1(f5139df5e9ff95fab3c01ac2b1aa44b1d939bf7a) ) \ + +#define sc_polic_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008327.bin", 0x0000, 0x0d24fe, CRC(767251af) SHA1(9cc9f4f2c6f6762a1929b845521549256e9b9f4f) ) \ + +#define sc_potsh_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008431.bin", 0x0000, 0x0ffeaf, CRC(400843fd) SHA1(35a0195b120e61c40e8f5e193b44f9fcb5b7d99d) ) \ + +#define sc_pogbl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008750.bin", 0x0000, 0x100000, CRC(25a94ab7) SHA1(9ee3a1acb2734a5663d925fa050c15d154f79678) ) \ + ROM_LOAD( "95008751.bin", 0x0000, 0x100000, CRC(53c97577) SHA1(5ec3868967073b4ed429fed943fbcd568a85b4f3) ) \ + +#define sc_pwrsg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008257.bin", 0x0000, 0x0dc608, CRC(ac648ab0) SHA1(58c919be129388ca9c34cad177520175ef08cfaa) ) \ + +#define sc_pwrbq_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_pir_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008264.bin", 0x0000, 0x100000, CRC(c3301cf1) SHA1(59e3c5c8ab7be1901800d493fe98e72dd24c181c) ) \ + +#define sc_ppclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008934.bin", 0x0000, 0x100000, CRC(87290522) SHA1(27deddd66b0ac9a0f4fe526f0eda7f6b2e73a8b6) ) \ + ROM_LOAD( "95008935.bin", 0x0000, 0x100000, CRC(7517053c) SHA1(d83019c52b8c78539359e9277864717c76fae0ce) ) \ + +#define sc_pipe_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "pipingsnd.bin", 0x0000, 0x0c50d9, CRC(ff240faa) SHA1(f0961b3207c0c8779479c773d1453ac4ff376bd2) ) \ + +#define sc_plumb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008430.bin", 0x0000, 0x0c690f, CRC(29059625) SHA1(4e46f794726b778e03f67ab3ec3cd4cb71be0b64) ) \ + +#define sc_pwcrz_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + + +#define sc_ibiza_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) + +#define sc_qmodo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "97000080.bin", 0x0000, 0x0ea2e7, CRC(060bf37a) SHA1(732fa84ed0145f931557e3fef66276370dde6884) ) \ + +#define sc_quidr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008269.bin", 0x0000, 0x0e5ee2, CRC(b61e664a) SHA1(9ee423015b5532cc4c06ddb76846800fa325074c) ) \ + +#define sc_quart_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_redad_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004266.snd", 0x0000, 0x080000, CRC(457fffbf) SHA1(ede2adc836ba4904cdf3d1ed825f9128c27b2b58) ) \ + +#define sc_redal_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004266.snd", 0x0000, 0x080000, CRC(457fffbf) SHA1(ede2adc836ba4904cdf3d1ed825f9128c27b2b58) ) \ + +#define sc_rio_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004309.snd", 0x0000, 0x080000, CRC(60eb25fc) SHA1(66f3ac8bc1be99eda07c71f63ebc818014ef7800) ) \ + +#define sc_rvlnx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004320.snd", 0x0000, 0x080000, CRC(b20c0557) SHA1(f61df4a80751571caf4d44add753b5477c13b7f0) ) \ + +#define sc_rvl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004259.sn1", 0x0000, 0x080000, CRC(c26ed994) SHA1(da336ab76c1c148906c734d7239b2b83a05ec083) ) \ + ROM_LOAD( "95004260.sn2", 0x0000, 0x080000, CRC(1a32d1bd) SHA1(e88ba7b8b353ea168a689e1d2be8c753a56f8f1d) ) \ + +#define sc_rogds_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008256.bin", 0x0000, 0x0fafa4, CRC(6d70436f) SHA1(adf7d18d9fcbb216ee461183951c1ab2972b8ef7) ) \ + +#define sc_rmo_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_royle_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008207.bin", 0x000000, 0x100000, CRC(269f845f) SHA1(eaddeaebdafd3f237b6af5c3539da407a6782210) ) \ + ROM_LOAD( "95008208.bin", 0x100000, 0x100000, CRC(07d4d9fa) SHA1(841fead29de19da0436f937614de50e1f07ebc8b) ) \ + +#define sc_rbank_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008233.bin", 0x000000, 0x100000, CRC(ebdb6017) SHA1(ca723483f6a7ae6512fa4abc4437c1f8eb606784) ) \ + ROM_LOAD( "95008234.bin", 0x100000, 0x100000, CRC(4b7ac02a) SHA1(29c51906e5ca1e0c9c70db86e3a24f08be06b7e0) ) \ + +#define sc_pstat_others \ + ROM_REGION( 0x100000, "ymz", 0 ) \ + ROM_LOAD( "95008294.bin", 0x0000, 0x0e410e, CRC(89e20874) SHA1(d6539d3051938d01c980360046e33c04e35a7929) ) \ + ROM_LOAD( "paystation_sound", 0x0000, 0x100000, CRC(0d87f9af) SHA1(7b00cbe3ba69f646fd692bfd6f002bd37801325e) ) \ + +#define sc_po8_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008416.bin", 0x0000, 0x0fe66d, CRC(9ae69b6a) SHA1(7bb94d7c941c64c1ea53e391b3f66a6e1b483417) ) \ + +#define sc_sidsp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008369.bin", 0x0000, 0x100000, CRC(76ea0074) SHA1(6cc4f320d8e331477569dfc7e961afd30a4ce7b2) ) \ + +#define sc_stl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "sk_t_lim.sn1", 0x0000, 0x080000, CRC(1b88bf7d) SHA1(76a8453fd2f8375030f69a3a569b45daceb3e4f7) ) /*Need testing*/ \ + ROM_LOAD( "sk_t_lim.sn2", 0x0000, 0x080000, CRC(b3ecf658) SHA1(bf4ce85a3662df6dacfa42e3b4f9dfd6bba43b24) ) \ + +#define sc_sbust_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008255.bin", 0x0000, 0x0d55db, CRC(feef5ac9) SHA1(83b7de3bd3a1fa3f5ae17f102cc54467d564740f) ) \ + +#define sc_strbr_others \ + ROM_REGION( 0x400000, "unk", ROMREGION_ERASE00 ) \ + /* this looks encrypted, or like samples.. I don't think it belongs here, check */ \ + ROM_LOAD16_BYTE( "sbar713.bin", 0x0000, 0x010000, CRC(c7e26d6e) SHA1(1e270d4f5de92083f54cc3fe246b2bc1d2f441b3) ) \ + ROM_LOAD16_BYTE( "sbar714.bin", 0x0000, 0x010000, CRC(57dbca5f) SHA1(22a6fcf1e11dd9ba2b3f73cd7520e2b4a740a893) ) \ + ROM_LOAD16_BYTE( "sbar715.bin", 0x0000, 0x010000, CRC(e9192085) SHA1(a030e81f54338bcb8667c59bad9a6b35a41bbd9f) ) \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004290.snd", 0x0000, 0x080000, CRC(488972c2) SHA1(4cd9bbb6df0fbaf9b8dd93294046c71c82bf4b5b) ) \ + +#define sc_strx_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008247.bin", 0x0000, 0x100000, CRC(0817596f) SHA1(250db171d1f7893883ffbcfdd3fd3f6e62524bdc) ) \ + +#define sc_s6c_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004095.p1", 0x000000, 0x080000, CRC(d9d7b876) SHA1(fdd9b5f07665b7b7edd198e00d3b005b32d1609c) ) \ + ROM_LOAD( "95004096.p1", 0x080000, 0x080000, CRC(fb8e103f) SHA1(fd8e2c8ae1e459f7426aa6b5de20f91dfae7bec9) ) \ + +#define sc_sdr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_slc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008412.bin", 0x0000, 0x100000, CRC(197edb63) SHA1(f1851029f6870d41d6aaf2df0a49fc54f5c79e4c) ) \ + +#define sc_sstep_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "97000120.bin", 0x0000, 0x080000, CRC(d887ca0a) SHA1(b1fd4633ca47fe1d99c9938af48768cd0cf451c6) ) \ + +#define sc_supst_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_solgl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008159.bin", 0x000000, 0x100000, CRC(e6ad55e4) SHA1(4bea205a9e6e2832cd06d0d5c96599f2a83f8fec) ) \ + ROM_LOAD( "95008160.bin", 0x100000, 0x100000, CRC(d52329ca) SHA1(e0feebe0d0ec13cd15cf4af1023246a1a3a9adc7) ) \ + +#define sc_slih_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "s_l_i_ho.snd", 0x0000, 0x080000, CRC(13abf434) SHA1(99d7a323c03448827d16bcfb4358c09ab691b500) ) \ + +#define sc_spark_others \ + ROM_REGION( 0x200000, "ymz", 0 ) \ + ROM_LOAD( "95008031.bin", 0x000000, 0x100000, CRC(445d3cf7) SHA1(ded74e46b4fb4ef405eb74027a63d301efce1f45) ) \ + ROM_LOAD( "95008032.bin", 0x100000, 0x0fd082, CRC(88781139) SHA1(e8e972032664c314f5263d7acb5a3f0769c7fb2a) ) \ + +#define sc_stirc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008117.bin", 0x0000, 0x197791, CRC(9d555ddf) SHA1(753b838fa7f64317b64fe0ae0ee7e6484f2a5af3) ) \ + +#define sc_suscl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008865.bin", 0x0000, 0x0f4505, CRC(8e375291) SHA1(d7563adf330023f4fe47c11eb9ef77d593c3eaab) ) \ + ROM_REGION( 0x5000, "pics", 0 ) \ + ROM_LOAD( "95890751.bin", 0x0000, 0x5000, CRC(57c944b0) SHA1(5f9aadffda6e83780e89c64315c8289a7d364ef6) ) /* does this belong with an sc5 set? */ \ + +#define sc_strk_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008492.bin", 0x0000, 0x0fa055, CRC(4f37c766) SHA1(352dc95bb1f0fe31db233ac731618acb3046681e) ) \ + +#define sc_taekw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008283.bin", 0x0000, 0x0fd772, CRC(59a3924c) SHA1(ceba9236db0b26eb79feabc9564eb6dec10c4ab9) ) \ + +#define sc_taknt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008273.bin", 0x0000, 0x100000, CRC(c8695859) SHA1(5998d1f3467e522d4fa5ad6cf75b86ae1760fdd6) ) \ + +#define sc_takcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008314.bin", 0x0000, 0x100000, CRC(64d2a26a) SHA1(f01944363e77bf33b44a06224e44828b065fdee4) ) \ + +#define sc_tbana_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008229.bin", 0x0000, 0x100000, CRC(003f9c3d) SHA1(38ea111096e84e77e727fb784992b525767f5b0c) ) \ + +#define sc_ticlb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004082.p1", 0x0000, 0x080000, CRC(b7caba0f) SHA1(777afdb6a2f78edad5f4df506eb4cd571f9f357b) ) \ + ROM_LOAD( "95004083.p2", 0x0000, 0x080000, CRC(c0cc21b7) SHA1(d0b22db4c1faeef34b794ac4c31bc9fd386493ea) ) \ + \ + ROM_REGION( 0x400000, "others", 0 ) \ + ROM_LOAD( "club-treasure-island_mtx_ass.bin", 0x0000, 0x010000, CRC(74f97b29) SHA1(9334bf1e4b4e2bcbbfaa5ae32201ceaab0641d83) ) /* DMD */ \ + +#define sc_tri7_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008308.bin", 0x0000, 0x100000, CRC(87a25bc3) SHA1(bf3d6b86f8f217131c33b681787f4a6fe84b8b8d) ) \ + +#define sc_tfclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008043.bin", 0x0000, 0x100000, CRC(b168cec4) SHA1(42b891ba918c7063420688c99dc72609801a1987) ) \ + ROM_LOAD( "95008044.bin", 0x0000, 0x100000, CRC(6074fa77) SHA1(1d4fa88a7ba2b020042ef3681e0f8eb732705d55) ) \ + +#define sc_ttp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004148.bin", 0x0000, 0x080000, CRC(6b352d5b) SHA1(b32f08828aad1c8cf0281faa387c9a1536fbd382) ) \ + +#define sc_lions_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004142.bin", 0x0000, 0x080000, CRC(aee399f7) SHA1(54c9683f2f3159122ef35855fe19380f1a2771ca) ) \ + +#define sc_tic2_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004231_1.bin", 0x0000, 0x080000, CRC(af1512be) SHA1(4196820fa06b5e09f7108894ca89fc43e4ac3da5) ) \ + ROM_LOAD( "95004232_2.bin", 0x0000, 0x080000, CRC(bddddec8) SHA1(3dd7dab9ad3e4475cd10c675bbc5a5fd28cf953e) ) \ + +#define sc_tgear_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008063.1", 0x0000, 0x100000, CRC(f87314dc) SHA1(00528243bd58e50ab24dde879f352feec2721019) ) \ + ROM_LOAD( "95008063.2", 0x0000, 0x100000, CRC(5d25d9e8) SHA1(a7f1abcf4bdb5ced2b414d43a13568d13ac334de) ) \ + +#define sc_tload_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008362.bin", 0x0000, 0x100000, CRC(fb14b937) SHA1(c8cbdda6184cc3d5b837a3cda105a39cf745bd4d) ) \ + +#define sc_trist_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008499.bin", 0x0000, 0x0efbd7, CRC(90710d1f) SHA1(923f6396941b713d3f55bb002c36b0e42063ae4d) ) \ + +#define sc_ttomb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008287.bin", 0x0000, 0x100000, CRC(9a3f47f9) SHA1(5844f3be0fe4febe04d924afc00f2f55273c15f1) ) \ + +#define sc_tridn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008335.bin", 0x0000, 0x0fd5ab, CRC(f0fed8d5) SHA1(dd974c70adfb9a5fb37a069eb736d5ef23b43ddf) ) \ + +#define sc_tub_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008164.bin", 0x0000, 0x100000, CRC(37fb6004) SHA1(d171223dd4a4162bfb1e63e4af26ea012a2de5ea) ) \ + +#define sc_twilt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004299.snd", 0x0000, 0x080000, CRC(f4837e10) SHA1(78c4455b1585ca60ed15734dac517f5f1ef4d237) ) \ + +#define sc_ufg_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004167.bin", 0x0000, 0x080000, CRC(9dcd31cc) SHA1(2ce9e167debbc2315b4be964116fdc35e19b6046) ) \ + +#define sc_ufi_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + + +#define sc_valnv_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "sound1.bin", 0x0000, 0x080000, CRC(cedee498) SHA1(311ab99746cff8f72ec8ffb9ac386a713fc300dd) ) \ + ROM_LOAD( "sound2.bin", 0x0000, 0x080000, CRC(0994b7bb) SHA1(ad79998467fee8fd95c944ea6a33450fcf6d3d56) ) \ + +#define sc_valqp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004296.sn1", 0x0000, 0x080000, CRC(aecc8138) SHA1(64fd18666c2c753899bff971227b9358c2bf22f1) ) \ + ROM_LOAD( "95004297.sn2", 0x0000, 0x080000, CRC(2c8b698b) SHA1(7b8dd1f2215579b5ad69a2a1f11bfcd04e3d07f9) ) \ + +#define sc_wadzl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wernr_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "gw_snd_1.8mb", 0x0000, 0x100000, CRC(990a3471) SHA1(356120558681440cac8252223c31fb9eca2572db) ) \ + ROM_LOAD( "gw_snd_2.8mb", 0x0000, 0x100000, CRC(468431e6) SHA1(90e8dd52b1ce752672b0a02d3cb7715cfa3fb49d) ) \ + +#define sc_wrnlt_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_waw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004292.bin", 0x0000, 0x17ba49, CRC(a5a03ead) SHA1(f1319d0e254b980262e3d404410e6ddbf18057b6) ) \ + \ + ROM_REGION( 0x400000, "altymz", ROMREGION_ERASE00 )/*no alarm sound, is this right */ \ + ROM_LOAD( "wetsnd1", 0x0000, 0x080000, CRC(5fb985b3) SHA1(19f85535b5082546a6098a751a2e2244ed4373ec) ) \ + +#define sc_wdw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_winsp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008504.bin", 0x0000, 0x0bd369, CRC(c27f88ca) SHA1(bfc34cc433b68dc6377af7ee464cbdb74a6e0e8d) ) \ + +#define sc_wag_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wldbn_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wthng_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wthnm_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wtc_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_wspin_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008516.bin", 0x0000, 0x0c35e4, CRC(b8deeea9) SHA1(5bc5f96e5f1b994448d90f05eea2e1c01e17ab66) ) \ + +#define sc_wwys_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008277.bin", 0x0000, 0x100000, CRC(19051eb6) SHA1(accc9b452dd80e6ca40e79dcc7d4fc6d4f234243) ) \ + +#define sc_winxp_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004265.snd", 0x0000, 0x080000, CRC(1e3e761d) SHA1(81c1e1af72836b25a053cf62c52341a0f8837e3e) ) \ + +#define sc_wondw_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008330.bin", 0x0000, 0x100000, CRC(15e80096) SHA1(da02a8afc83400fdf1ead9dad8a461eb9e911586) ) \ + +#define sc_xmark_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008263.bin", 0x0000, 0x100000, CRC(43507f43) SHA1(a5eb9e142847a338bf18f4b26da7fe5a2807a027) ) \ + +#define sc_xcash_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95004321.snd", 0x0000, 0x080000, CRC(97682381) SHA1(b1ef910e7b2e3574576fb6583a088c3de61e6019) ) \ + +#define sc4s16_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_bgold_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_blokq_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + +#define sc_clbtm_others \ + ROM_REGION( 0x800000, "ymz", ROMREGION_ERASE00 ) \ + /* very large sound roms! */ \ + ROM_LOAD( "95008055.p1", 0x0000, 0x800000, CRC(ef474fd3) SHA1(e7427184683603b57a3a8b37452fa6ec7a41e34c) ) \ + ROM_LOAD( "95008056.p2", 0x0000, 0x800000, CRC(39b1b566) SHA1(937ec27964124b92b75d4b37d09a35585baa68c6) ) \ + \ + ROM_LOAD( "95008055.bin", 0x0000, 0x100000, CRC(df9ae6e3) SHA1(5766cb1749aa92c34a76270a641f7a9302cc44d7) ) \ + \ + ROM_REGION( 0x400000, "others", ROMREGION_ERASE00 ) \ + /* dot matrix roms? */ \ + ROM_LOAD( "club-temptation_mtx_(ihex)ss.hex", 0x0000, 0x01d0da, CRC(08ebee96) SHA1(2e87d734c966abab1d4a59c9481ebea161f77286) ) \ + ROM_LOAD( "clubtempdot.bin", 0x0000, 0x010000, CRC(283d2d9c) SHA1(5b76a13ad674f8a40c270e5dbc61dac04d411d02) ) /* DM01 */ \ + ROM_LOAD( "95717692a.bin", 0x0000, 0x008000, CRC(f9fe7b9a) SHA1(0e3fe5da9fc837726d08f02a2c6ed782f016c982) ) /* is this something else? sc1/2? */ \ + +#define sc_dcrls_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008482.bin", 0x0000, 0x04c048, CRC(e0b13788) SHA1(e364ccedd31e1fe0560312a28ad6d5cfaac5bfaa) ) \ + +#define sc_gcclb_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + /* this is intel hex format - convert */ \ + ROM_LOAD( "95004252.bin", 0x0000, 0x134084, CRC(b05844f8) SHA1(e2a2f3ad69cc9a66ca703e9e07ac008300d4139d) ) \ + ROM_LOAD( "95004253.bin", 0x0000, 0x134084, CRC(a546da40) SHA1(fead6e4f8dab919f65c48cf04100a7742432b1f4) ) \ + +#define sc_onup_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008298.bin", 0x0000, 0x100000, CRC(6dcdcbfa) SHA1(1742f54ddd74d7513e8efb8cecfff574263c65df) ) \ + +#define sc_phgcl_others \ + ROM_REGION( 0x400000, "ymz", ROMREGION_ERASE00 ) \ + ROM_LOAD( "95008475.bin", 0x0000, 0x100000, CRC(30f77b7e) SHA1(bbb16020f33c8440344670beec8b13dd554be858) ) \ + + + + + + diff -Nru mame-0.144/src/mame/includes/bigevglf.h mame-0.145/src/mame/includes/bigevglf.h --- mame-0.144/src/mame/includes/bigevglf.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bigevglf.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,7 +11,7 @@ UINT8 * m_spriteram2; /* video-related */ - bitmap_t *m_tmp_bitmap[4]; + bitmap_ind16 m_tmp_bitmap[4]; UINT8 *m_vidram; UINT32 m_vidram_bank; UINT32 m_plane_selected; @@ -70,7 +70,7 @@ /*----------- defined in video/bigevglf.c -----------*/ VIDEO_START( bigevglf ); -SCREEN_UPDATE( bigevglf ); +SCREEN_UPDATE_IND16( bigevglf ); READ8_HANDLER( bigevglf_vidram_r ); WRITE8_HANDLER( bigevglf_vidram_w ); diff -Nru mame-0.144/src/mame/includes/bigstrkb.h mame-0.145/src/mame/includes/bigstrkb.h --- mame-0.144/src/mame/includes/bigstrkb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bigstrkb.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ WRITE16_HANDLER( bsb_videoram2_w ); WRITE16_HANDLER( bsb_videoram3_w ); VIDEO_START(bigstrkb); -SCREEN_UPDATE(bigstrkb); +SCREEN_UPDATE_IND16(bigstrkb); diff -Nru mame-0.144/src/mame/includes/bionicc.h mame-0.145/src/mame/includes/bionicc.h --- mame-0.144/src/mame/includes/bionicc.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bionicc.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,5 +38,5 @@ WRITE16_HANDLER( bionicc_gfxctrl_w ); VIDEO_START( bionicc ); -SCREEN_UPDATE( bionicc ); -SCREEN_EOF( bionicc ); +SCREEN_UPDATE_IND16( bionicc ); +SCREEN_VBLANK( bionicc ); diff -Nru mame-0.144/src/mame/includes/bishi.h mame-0.145/src/mame/includes/bishi.h --- mame-0.144/src/mame/includes/bishi.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bishi.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ extern void bishi_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); VIDEO_START(bishi); -SCREEN_UPDATE(bishi); +SCREEN_UPDATE_RGB32(bishi); diff -Nru mame-0.144/src/mame/includes/bking.h mame-0.145/src/mame/includes/bking.h --- mame-0.144/src/mame/includes/bking.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/bking.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,8 +8,8 @@ UINT8 * m_playfield_ram; /* video-related */ - bitmap_t *m_tmp_bitmap1; - bitmap_t *m_tmp_bitmap2; + bitmap_ind16 m_tmp_bitmap1; + bitmap_ind16 m_tmp_bitmap2; tilemap_t *m_bg_tilemap; int m_pc3259_output[4]; int m_pc3259_mask; @@ -71,5 +71,5 @@ PALETTE_INIT( bking ); VIDEO_START( bking ); -SCREEN_UPDATE( bking ); -SCREEN_EOF( bking ); +SCREEN_UPDATE_IND16( bking ); +SCREEN_VBLANK( bking ); diff -Nru mame-0.144/src/mame/includes/bladestl.h mame-0.145/src/mame/includes/bladestl.h --- mame-0.144/src/mame/includes/bladestl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bladestl.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,7 +32,7 @@ PALETTE_INIT( bladestl ); -SCREEN_UPDATE( bladestl ); +SCREEN_UPDATE_IND16( bladestl ); void bladestl_tile_callback(running_machine &machine, int layer, int bank, int *code, int *color, int *flags); void bladestl_sprite_callback(running_machine &machine, int *code, int *color); diff -Nru mame-0.144/src/mame/includes/blktiger.h mame-0.145/src/mame/includes/blktiger.h --- mame-0.144/src/mame/includes/blktiger.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/blktiger.h 2012-02-06 21:30:44.000000000 +0000 @@ -53,5 +53,5 @@ WRITE8_HANDLER( blktiger_scrolly_w ); VIDEO_START( blktiger ); -SCREEN_UPDATE( blktiger ); -SCREEN_EOF( blktiger ); +SCREEN_UPDATE_IND16( blktiger ); +SCREEN_VBLANK( blktiger ); diff -Nru mame-0.144/src/mame/includes/blmbycar.h mame-0.145/src/mame/includes/blmbycar.h --- mame-0.144/src/mame/includes/blmbycar.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/blmbycar.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE16_HANDLER( blmbycar_vram_1_w ); VIDEO_START( blmbycar ); -SCREEN_UPDATE( blmbycar ); +SCREEN_UPDATE_IND16( blmbycar ); diff -Nru mame-0.144/src/mame/includes/blockade.h mame-0.145/src/mame/includes/blockade.h --- mame-0.144/src/mame/includes/blockade.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/blockade.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,7 +23,7 @@ WRITE8_HANDLER( blockade_videoram_w ); VIDEO_START( blockade ); -SCREEN_UPDATE( blockade ); +SCREEN_UPDATE_IND16( blockade ); /*----------- defined in audio/blockade.c -----------*/ diff -Nru mame-0.144/src/mame/includes/blockhl.h mame-0.145/src/mame/includes/blockhl.h --- mame-0.144/src/mame/includes/blockhl.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/blockhl.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ extern void blockhl_sprite_callback(running_machine &machine, int *code,int *color,int *priority,int *shadow); VIDEO_START( blockhl ); -SCREEN_UPDATE( blockhl ); +SCREEN_UPDATE_IND16( blockhl ); diff -Nru mame-0.144/src/mame/includes/blockout.h mame-0.145/src/mame/includes/blockout.h --- mame-0.144/src/mame/includes/blockout.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/blockout.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,7 +16,7 @@ UINT16 * m_paletteram; /* video-related */ - bitmap_t *m_tmpbitmap; + bitmap_ind16 m_tmpbitmap; UINT16 m_color; /* devices */ @@ -32,4 +32,4 @@ WRITE16_HANDLER( blockout_frontcolor_w ); VIDEO_START( blockout ); -SCREEN_UPDATE( blockout ); +SCREEN_UPDATE_IND16( blockout ); diff -Nru mame-0.144/src/mame/includes/bloodbro.h mame-0.145/src/mame/includes/bloodbro.h --- mame-0.144/src/mame/includes/bloodbro.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bloodbro.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ WRITE16_HANDLER( bloodbro_fgvideoram_w ); WRITE16_HANDLER( bloodbro_txvideoram_w ); -SCREEN_UPDATE( bloodbro ); -SCREEN_UPDATE( weststry ); -SCREEN_UPDATE( skysmash ); +SCREEN_UPDATE_IND16( bloodbro ); +SCREEN_UPDATE_IND16( weststry ); +SCREEN_UPDATE_IND16( skysmash ); VIDEO_START( bloodbro ); diff -Nru mame-0.144/src/mame/includes/blstroid.h mame-0.145/src/mame/includes/blstroid.h --- mame-0.144/src/mame/includes/blstroid.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/blstroid.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,6 +19,6 @@ /*----------- defined in video/blstroid.c -----------*/ VIDEO_START( blstroid ); -SCREEN_UPDATE( blstroid ); +SCREEN_UPDATE_IND16( blstroid ); void blstroid_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/blueprnt.h mame-0.145/src/mame/includes/blueprnt.h --- mame-0.144/src/mame/includes/blueprnt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/blueprnt.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( blueprnt ); VIDEO_START( blueprnt ); -SCREEN_UPDATE( blueprnt ); +SCREEN_UPDATE_IND16( blueprnt ); diff -Nru mame-0.144/src/mame/includes/bogeyman.h mame-0.145/src/mame/includes/bogeyman.h --- mame-0.144/src/mame/includes/bogeyman.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/bogeyman.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ PALETTE_INIT( bogeyman ); VIDEO_START( bogeyman ); -SCREEN_UPDATE( bogeyman ); +SCREEN_UPDATE_IND16( bogeyman ); diff -Nru mame-0.144/src/mame/includes/bombjack.h mame-0.145/src/mame/includes/bombjack.h --- mame-0.144/src/mame/includes/bombjack.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bombjack.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,19 +11,21 @@ : driver_device(mconfig, type, tag) { } /* memory pointers */ - UINT8 * m_videoram; - UINT8 * m_colorram; - UINT8 * m_spriteram; -// UINT8 * m_paletteram; // currently this uses generic palette handling - size_t m_spriteram_size; + UINT8 * m_videoram; + UINT8 * m_colorram; + UINT8 * m_spriteram; +// UINT8 * m_paletteram; // currently this uses generic palette handling + size_t m_spriteram_size; /* video-related */ - tilemap_t *m_fg_tilemap; - tilemap_t *m_bg_tilemap; - UINT8 m_background_image; + tilemap_t *m_fg_tilemap; + tilemap_t *m_bg_tilemap; + UINT8 m_background_image; /* sound-related */ - UINT8 m_latch; + UINT8 m_latch; + + UINT8 m_nmi_mask; }; @@ -35,4 +37,4 @@ WRITE8_HANDLER( bombjack_flipscreen_w ); VIDEO_START( bombjack ); -SCREEN_UPDATE( bombjack ); +SCREEN_UPDATE_IND16( bombjack ); diff -Nru mame-0.144/src/mame/includes/boogwing.h mame-0.145/src/mame/includes/boogwing.h --- mame-0.144/src/mame/includes/boogwing.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/boogwing.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,5 +40,6 @@ /*----------- defined in video/boogwing.c -----------*/ -SCREEN_UPDATE( boogwing ); +VIDEO_START( boogwing ); +SCREEN_UPDATE_RGB32( boogwing ); diff -Nru mame-0.144/src/mame/includes/bottom9.h mame-0.145/src/mame/includes/bottom9.h --- mame-0.144/src/mame/includes/bottom9.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bottom9.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ extern void bottom9_zoom_callback(running_machine &machine, int *code,int *color,int *flags); VIDEO_START( bottom9 ); -SCREEN_UPDATE( bottom9 ); +SCREEN_UPDATE_IND16( bottom9 ); diff -Nru mame-0.144/src/mame/includes/brkthru.h mame-0.145/src/mame/includes/brkthru.h --- mame-0.144/src/mame/includes/brkthru.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/brkthru.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,6 +29,8 @@ /* devices */ device_t *m_maincpu; device_t *m_audiocpu; + + UINT8 m_nmi_mask; }; @@ -39,4 +41,4 @@ WRITE8_HANDLER( brkthru_fgram_w ); VIDEO_START( brkthru ); PALETTE_INIT( brkthru ); -SCREEN_UPDATE( brkthru ); +SCREEN_UPDATE_IND16( brkthru ); diff -Nru mame-0.144/src/mame/includes/bsktball.h mame-0.145/src/mame/includes/bsktball.h --- mame-0.144/src/mame/includes/bsktball.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bsktball.h 2012-02-06 21:30:44.000000000 +0000 @@ -67,6 +67,6 @@ /*----------- defined in video/bsktball.c -----------*/ VIDEO_START( bsktball ); -SCREEN_UPDATE( bsktball ); +SCREEN_UPDATE_IND16( bsktball ); WRITE8_HANDLER( bsktball_videoram_w ); diff -Nru mame-0.144/src/mame/includes/btime.h mame-0.145/src/mame/includes/btime.h --- mame-0.144/src/mame/includes/btime.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/btime.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ size_t m_bnj_backgroundram_size; /* video-related */ - bitmap_t *m_background_bitmap; + bitmap_ind16 *m_background_bitmap; UINT8 m_btime_palette; UINT8 m_bnj_scroll1; UINT8 m_bnj_scroll2; @@ -59,13 +59,13 @@ VIDEO_START( btime ); VIDEO_START( bnj ); -SCREEN_UPDATE( btime ); -SCREEN_UPDATE( cookrace ); -SCREEN_UPDATE( bnj ); -SCREEN_UPDATE( lnc ); -SCREEN_UPDATE( zoar ); -SCREEN_UPDATE( disco ); -SCREEN_UPDATE( eggs ); +SCREEN_UPDATE_IND16( btime ); +SCREEN_UPDATE_IND16( cookrace ); +SCREEN_UPDATE_IND16( bnj ); +SCREEN_UPDATE_IND16( lnc ); +SCREEN_UPDATE_IND16( zoar ); +SCREEN_UPDATE_IND16( disco ); +SCREEN_UPDATE_IND16( eggs ); WRITE8_HANDLER( btime_paletteram_w ); WRITE8_HANDLER( bnj_background_w ); diff -Nru mame-0.144/src/mame/includes/btoads.h mame-0.145/src/mame/includes/btoads.h --- mame-0.144/src/mame/includes/btoads.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/btoads.h 2012-02-06 21:30:44.000000000 +0000 @@ -61,8 +61,8 @@ static void static_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg) { space->machine().driver_data()->to_shiftreg(space, address, shiftreg); } void from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); static void static_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg) { space->machine().driver_data()->from_shiftreg(space, address, shiftreg); } - void scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); - static void static_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) { screen.machine().driver_data()->scanline_update(screen, bitmap, scanline, params); } + void scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); + static void static_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { screen.machine().driver_data()->scanline_update(screen, bitmap, scanline, params); } protected: // device overrides diff -Nru mame-0.144/src/mame/includes/bublbobl.h mame-0.145/src/mame/includes/bublbobl.h --- mame-0.144/src/mame/includes/bublbobl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bublbobl.h 2012-02-06 21:30:44.000000000 +0000 @@ -107,4 +107,4 @@ /*----------- defined in video/bublbobl.c -----------*/ -SCREEN_UPDATE( bublbobl ); +SCREEN_UPDATE_IND16( bublbobl ); diff -Nru mame-0.144/src/mame/includes/buggychl.h mame-0.145/src/mame/includes/buggychl.h --- mame-0.144/src/mame/includes/buggychl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/buggychl.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,8 +18,8 @@ size_t m_spriteram_size; /* video-related */ - bitmap_t *m_tmp_bitmap1; - bitmap_t *m_tmp_bitmap2; + bitmap_ind16 m_tmp_bitmap1; + bitmap_ind16 m_tmp_bitmap2; tilemap_t *m_bg_tilemap; int m_sl_bank; int m_bg_on; @@ -47,4 +47,4 @@ PALETTE_INIT( buggychl ); VIDEO_START( buggychl ); -SCREEN_UPDATE( buggychl ); +SCREEN_UPDATE_IND16( buggychl ); diff -Nru mame-0.144/src/mame/includes/bwing.h mame-0.145/src/mame/includes/bwing.h --- mame-0.144/src/mame/includes/bwing.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/bwing.h 2012-02-06 21:30:44.000000000 +0000 @@ -61,4 +61,4 @@ READ8_HANDLER( bwing_scrollram_r ); VIDEO_START( bwing ); -SCREEN_UPDATE( bwing ); +SCREEN_UPDATE_IND16( bwing ); diff -Nru mame-0.144/src/mame/includes/cabal.h mame-0.145/src/mame/includes/cabal.h --- mame-0.144/src/mame/includes/cabal.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cabal.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,7 +19,7 @@ /*----------- defined in video/cabal.c -----------*/ extern VIDEO_START( cabal ); -extern SCREEN_UPDATE( cabal ); +extern SCREEN_UPDATE_IND16( cabal ); WRITE16_HANDLER( cabal_flipscreen_w ); WRITE16_HANDLER( cabal_background_videoram16_w ); WRITE16_HANDLER( cabal_text_videoram16_w ); diff -Nru mame-0.144/src/mame/includes/calomega.h mame-0.145/src/mame/includes/calomega.h --- mame-0.144/src/mame/includes/calomega.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/calomega.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,4 +20,4 @@ WRITE8_HANDLER( calomega_colorram_w ); PALETTE_INIT( calomega ); VIDEO_START( calomega ); -SCREEN_UPDATE( calomega ); +SCREEN_UPDATE_IND16( calomega ); diff -Nru mame-0.144/src/mame/includes/canyon.h mame-0.145/src/mame/includes/canyon.h --- mame-0.144/src/mame/includes/canyon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/canyon.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,6 +44,6 @@ /*----------- defined in video/canyon.c -----------*/ VIDEO_START( canyon ); -SCREEN_UPDATE( canyon ); +SCREEN_UPDATE_IND16( canyon ); WRITE8_HANDLER( canyon_videoram_w ); diff -Nru mame-0.144/src/mame/includes/capbowl.h mame-0.145/src/mame/includes/capbowl.h --- mame-0.144/src/mame/includes/capbowl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/capbowl.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,7 +31,7 @@ /*----------- defined in video/capbowl.c -----------*/ VIDEO_START( capbowl ); -SCREEN_UPDATE( capbowl ); +SCREEN_UPDATE_RGB32( capbowl ); WRITE8_HANDLER( bowlrama_blitter_w ); READ8_HANDLER( bowlrama_blitter_r ); diff -Nru mame-0.144/src/mame/includes/carjmbre.h mame-0.145/src/mame/includes/carjmbre.h --- mame-0.144/src/mame/includes/carjmbre.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/carjmbre.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,6 +19,8 @@ tilemap_t *m_cj_tilemap; UINT8 m_flipscreen; UINT16 m_bgcolor; + + UINT8 m_nmi_mask; }; @@ -32,6 +34,6 @@ PALETTE_INIT( carjmbre ); VIDEO_START( carjmbre ); -SCREEN_UPDATE( carjmbre ); +SCREEN_UPDATE_IND16( carjmbre ); diff -Nru mame-0.144/src/mame/includes/carpolo.h mame-0.145/src/mame/includes/carpolo.h --- mame-0.144/src/mame/includes/carpolo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/carpolo.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,11 +40,11 @@ ttl7474_device *m_ttl7474_1c_2; ttl7474_device *m_ttl7474_1a_1; ttl7474_device *m_ttl7474_1a_2; - bitmap_t *m_sprite_sprite_collision_bitmap1; - bitmap_t *m_sprite_sprite_collision_bitmap2; - bitmap_t *m_sprite_goal_collision_bitmap1; - bitmap_t *m_sprite_goal_collision_bitmap2; - bitmap_t *m_sprite_border_collision_bitmap; + bitmap_ind16 *m_sprite_sprite_collision_bitmap1; + bitmap_ind16 *m_sprite_sprite_collision_bitmap2; + bitmap_ind16 *m_sprite_goal_collision_bitmap1; + bitmap_ind16 *m_sprite_goal_collision_bitmap2; + bitmap_ind16 *m_sprite_border_collision_bitmap; }; @@ -93,5 +93,5 @@ PALETTE_INIT( carpolo ); VIDEO_START( carpolo ); -SCREEN_UPDATE( carpolo ); -SCREEN_EOF( carpolo ); +SCREEN_UPDATE_IND16( carpolo ); +SCREEN_VBLANK( carpolo ); diff -Nru mame-0.144/src/mame/includes/cave.h mame-0.145/src/mame/includes/cave.h --- mame-0.144/src/mame/includes/cave.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cave.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,7 +58,7 @@ int m_tiledim[4]; int m_old_tiledim[4]; - bitmap_t *m_sprite_zbuf; + bitmap_ind16 m_sprite_zbuf; UINT16 m_sprite_zbuf_baseval; int m_num_sprites; @@ -138,7 +138,7 @@ VIDEO_START( sailormn_3_layers ); -SCREEN_UPDATE( cave ); +SCREEN_UPDATE_IND16( cave ); void cave_get_sprite_info(running_machine &machine); void sailormn_tilebank_w(running_machine &machine, int bank); diff -Nru mame-0.144/src/mame/includes/cbasebal.h mame-0.145/src/mame/includes/cbasebal.h --- mame-0.144/src/mame/includes/cbasebal.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cbasebal.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,4 +44,4 @@ WRITE8_HANDLER( cbasebal_scrolly_w ); VIDEO_START( cbasebal ); -SCREEN_UPDATE( cbasebal ); +SCREEN_UPDATE_IND16( cbasebal ); diff -Nru mame-0.144/src/mame/includes/cbuster.h mame-0.145/src/mame/includes/cbuster.h --- mame-0.144/src/mame/includes/cbuster.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cbuster.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE16_HANDLER( twocrude_palette_24bit_b_w ); VIDEO_START( twocrude ); -SCREEN_UPDATE( twocrude ); +SCREEN_UPDATE_RGB32( twocrude ); diff -Nru mame-0.144/src/mame/includes/ccastles.h mame-0.145/src/mame/includes/ccastles.h --- mame-0.144/src/mame/includes/ccastles.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ccastles.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,7 +24,7 @@ const UINT8 *m_syncprom; const UINT8 *m_wpprom; const UINT8 *m_priprom; - bitmap_t *m_spritebitmap; + bitmap_ind16 m_spritebitmap; double m_rweights[3]; double m_gweights[3]; double m_bweights[3]; @@ -51,7 +51,7 @@ VIDEO_START( ccastles ); -SCREEN_UPDATE( ccastles ); +SCREEN_UPDATE_IND16( ccastles ); WRITE8_HANDLER( ccastles_hscroll_w ); WRITE8_HANDLER( ccastles_vscroll_w ); diff -Nru mame-0.144/src/mame/includes/cclimber.h mame-0.145/src/mame/includes/cclimber.h --- mame-0.144/src/mame/includes/cclimber.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cclimber.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,6 +19,7 @@ UINT8 m_yamato_p0; UINT8 m_yamato_p1; UINT8 m_toprollr_rombank; + UINT8 m_nmi_mask; tilemap_t *m_pf_tilemap; tilemap_t *m_bs_tilemap; tilemap_t *m_toproller_bg_tilemap; @@ -40,15 +41,15 @@ PALETTE_INIT( cclimber ); VIDEO_START( cclimber ); -SCREEN_UPDATE( cclimber ); +SCREEN_UPDATE_IND16( cclimber ); PALETTE_INIT( swimmer ); VIDEO_START( swimmer ); -SCREEN_UPDATE( swimmer ); +SCREEN_UPDATE_IND16( swimmer ); PALETTE_INIT( yamato ); -SCREEN_UPDATE( yamato ); +SCREEN_UPDATE_IND16( yamato ); PALETTE_INIT( toprollr ); VIDEO_START( toprollr ); -SCREEN_UPDATE( toprollr ); +SCREEN_UPDATE_IND16( toprollr ); diff -Nru mame-0.144/src/mame/includes/cdi.h mame-0.145/src/mame/includes/cdi.h --- mame-0.144/src/mame/includes/cdi.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cdi.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ UINT8 m_timer_set; emu_timer *m_test_timer; - bitmap_t* m_lcdbitmap; + bitmap_rgb32 m_lcdbitmap; scc68070_regs_t m_scc68070_regs; mcd212_regs_t m_mcd212_regs; mcd212_ab_t m_mcd212_ab; diff -Nru mame-0.144/src/mame/includes/centiped.h mame-0.145/src/mame/includes/centiped.h --- mame-0.144/src/mame/includes/centiped.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/centiped.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,10 +34,10 @@ VIDEO_START( warlords ); VIDEO_START( bullsdrt ); -SCREEN_UPDATE( centiped ); -SCREEN_UPDATE( milliped ); -SCREEN_UPDATE( warlords ); -SCREEN_UPDATE( bullsdrt ); +SCREEN_UPDATE_IND16( centiped ); +SCREEN_UPDATE_IND16( milliped ); +SCREEN_UPDATE_IND16( warlords ); +SCREEN_UPDATE_IND16( bullsdrt ); WRITE8_HANDLER( centiped_paletteram_w ); WRITE8_HANDLER( milliped_paletteram_w ); diff -Nru mame-0.144/src/mame/includes/chaknpop.h mame-0.145/src/mame/includes/chaknpop.h --- mame-0.144/src/mame/includes/chaknpop.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/chaknpop.h 2012-02-06 21:30:44.000000000 +0000 @@ -49,7 +49,7 @@ PALETTE_INIT( chaknpop ); VIDEO_START( chaknpop ); -SCREEN_UPDATE( chaknpop ); +SCREEN_UPDATE_IND16( chaknpop ); READ8_HANDLER( chaknpop_gfxmode_r ); WRITE8_HANDLER( chaknpop_gfxmode_w ); diff -Nru mame-0.144/src/mame/includes/champbas.h mame-0.145/src/mame/includes/champbas.h --- mame-0.144/src/mame/includes/champbas.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/champbas.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,6 +32,8 @@ device_t *m_maincpu; device_t *m_audiocpu; device_t *m_mcu; + + UINT8 m_irq_mask; }; @@ -46,7 +48,7 @@ PALETTE_INIT( exctsccr ); VIDEO_START( champbas ); VIDEO_START( exctsccr ); -SCREEN_UPDATE( champbas ); -SCREEN_UPDATE( exctsccr ); +SCREEN_UPDATE_IND16( champbas ); +SCREEN_UPDATE_IND16( exctsccr ); diff -Nru mame-0.144/src/mame/includes/changela.h mame-0.145/src/mame/includes/changela.h --- mame-0.144/src/mame/includes/changela.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/changela.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,10 +12,10 @@ UINT8 * m_spriteram; /* video-related */ - bitmap_t *m_obj0_bitmap; - bitmap_t *m_river_bitmap; - bitmap_t *m_tree0_bitmap; - bitmap_t *m_tree1_bitmap; + bitmap_ind16 m_obj0_bitmap; + bitmap_ind16 m_river_bitmap; + bitmap_ind16 m_tree0_bitmap; + bitmap_ind16 m_tree1_bitmap; UINT8* m_tree_ram; UINT8* m_memory_devices; UINT32 m_mem_dev_selected; /* an offset within memory_devices area */ @@ -60,7 +60,7 @@ /*----------- defined in video/changela.c -----------*/ VIDEO_START( changela ); -SCREEN_UPDATE( changela ); +SCREEN_UPDATE_IND16( changela ); WRITE8_HANDLER( changela_colors_w ); WRITE8_HANDLER( changela_mem_device_select_w ); diff -Nru mame-0.144/src/mame/includes/cheekyms.h mame-0.145/src/mame/includes/cheekyms.h --- mame-0.144/src/mame/includes/cheekyms.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cheekyms.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,11 +18,13 @@ /* video-related */ tilemap_t *m_cm_tilemap; - bitmap_t *m_bitmap_buffer; + bitmap_ind16 *m_bitmap_buffer; /* devices */ device_t *m_maincpu; device_t *m_dac; + + UINT8 m_irq_mask; }; @@ -30,6 +32,6 @@ PALETTE_INIT( cheekyms ); VIDEO_START( cheekyms ); -SCREEN_UPDATE( cheekyms ); +SCREEN_UPDATE_IND16( cheekyms ); WRITE8_HANDLER( cheekyms_port_40_w ); WRITE8_HANDLER( cheekyms_port_80_w ); diff -Nru mame-0.144/src/mame/includes/chqflag.h mame-0.145/src/mame/includes/chqflag.h --- mame-0.144/src/mame/includes/chqflag.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/chqflag.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ extern void chqflag_zoom_callback_1(running_machine &machine, int *code,int *color,int *flags); VIDEO_START( chqflag ); -SCREEN_UPDATE( chqflag ); +SCREEN_UPDATE_IND16( chqflag ); diff -Nru mame-0.144/src/mame/includes/cidelsa.h mame-0.145/src/mame/includes/cidelsa.h --- mame-0.144/src/mame/includes/cidelsa.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cidelsa.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,7 +51,6 @@ virtual void machine_reset(); virtual void video_start(); - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) { m_vis->update_screen(&bitmap, &cliprect); return false; } DECLARE_WRITE8_MEMBER( cdp1869_w ); DECLARE_WRITE8_MEMBER( destryer_out1_w ); diff -Nru mame-0.144/src/mame/includes/cinemat.h mame-0.145/src/mame/includes/cinemat.h --- mame-0.144/src/mame/includes/cinemat.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cinemat.h 2012-02-06 21:30:44.000000000 +0000 @@ -76,6 +76,6 @@ VIDEO_START( cinemat_64level ); VIDEO_START( cinemat_color ); VIDEO_START( cinemat_qb3color ); -SCREEN_UPDATE( cinemat ); +SCREEN_UPDATE_RGB32( cinemat ); -SCREEN_UPDATE( spacewar ); +SCREEN_UPDATE_RGB32( spacewar ); diff -Nru mame-0.144/src/mame/includes/circusc.h mame-0.145/src/mame/includes/circusc.h --- mame-0.144/src/mame/includes/circusc.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/circusc.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,6 +31,8 @@ device_t *m_sn2; device_t *m_dac; device_t *m_discrete; + + UINT8 m_irq_mask; }; @@ -42,4 +44,4 @@ VIDEO_START( circusc ); WRITE8_HANDLER( circusc_flipscreen_w ); PALETTE_INIT( circusc ); -SCREEN_UPDATE( circusc ); +SCREEN_UPDATE_IND16( circusc ); diff -Nru mame-0.144/src/mame/includes/circus.h mame-0.145/src/mame/includes/circus.h --- mame-0.144/src/mame/includes/circus.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/circus.h 2012-02-06 21:30:44.000000000 +0000 @@ -46,7 +46,7 @@ extern WRITE8_HANDLER( circus_videoram_w ); extern VIDEO_START( circus ); -extern SCREEN_UPDATE( crash ); -extern SCREEN_UPDATE( circus ); -extern SCREEN_UPDATE( robotbwl ); -extern SCREEN_UPDATE( ripcord ); +extern SCREEN_UPDATE_IND16( crash ); +extern SCREEN_UPDATE_IND16( circus ); +extern SCREEN_UPDATE_IND16( robotbwl ); +extern SCREEN_UPDATE_IND16( ripcord ); diff -Nru mame-0.144/src/mame/includes/cischeat.h mame-0.145/src/mame/includes/cischeat.h --- mame-0.144/src/mame/includes/cischeat.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cischeat.h 2012-02-06 21:30:44.000000000 +0000 @@ -60,7 +60,7 @@ VIDEO_START( cischeat ); VIDEO_START( f1gpstar ); -SCREEN_UPDATE( bigrun ); -SCREEN_UPDATE( cischeat ); -SCREEN_UPDATE( f1gpstar ); -SCREEN_UPDATE( scudhamm ); +SCREEN_UPDATE_IND16( bigrun ); +SCREEN_UPDATE_IND16( cischeat ); +SCREEN_UPDATE_IND16( f1gpstar ); +SCREEN_UPDATE_IND16( scudhamm ); diff -Nru mame-0.144/src/mame/includes/citycon.h mame-0.145/src/mame/includes/citycon.h --- mame-0.144/src/mame/includes/citycon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/citycon.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,5 +34,5 @@ WRITE8_HANDLER( citycon_linecolor_w ); WRITE8_HANDLER( citycon_background_w ); -SCREEN_UPDATE( citycon ); +SCREEN_UPDATE_IND16( citycon ); VIDEO_START( citycon ); diff -Nru mame-0.144/src/mame/includes/cloak.h mame-0.145/src/mame/includes/cloak.h --- mame-0.144/src/mame/includes/cloak.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cloak.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ WRITE8_HANDLER( cloak_clearbmp_w ); VIDEO_START( cloak ); -SCREEN_UPDATE( cloak ); +SCREEN_UPDATE_IND16( cloak ); diff -Nru mame-0.144/src/mame/includes/cloud9.h mame-0.145/src/mame/includes/cloud9.h --- mame-0.144/src/mame/includes/cloud9.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cloud9.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,7 +24,7 @@ const UINT8 *m_syncprom; const UINT8 *m_wpprom; const UINT8 *m_priprom; - bitmap_t *m_spritebitmap; + bitmap_ind16 m_spritebitmap; double m_rweights[3]; double m_gweights[3]; double m_bweights[3]; @@ -46,7 +46,7 @@ /*----------- defined in video/cloud9.c -----------*/ VIDEO_START( cloud9 ); -SCREEN_UPDATE( cloud9 ); +SCREEN_UPDATE_IND16( cloud9 ); WRITE8_HANDLER( cloud9_video_control_w ); diff -Nru mame-0.144/src/mame/includes/clshroad.h mame-0.145/src/mame/includes/clshroad.h --- mame-0.144/src/mame/includes/clshroad.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/clshroad.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,4 +25,4 @@ PALETTE_INIT( clshroad ); VIDEO_START( firebatl ); VIDEO_START( clshroad ); -SCREEN_UPDATE( clshroad ); +SCREEN_UPDATE_IND16( clshroad ); diff -Nru mame-0.144/src/mame/includes/cninja.h mame-0.145/src/mame/includes/cninja.h --- mame-0.144/src/mame/includes/cninja.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cninja.h 2012-02-06 21:30:44.000000000 +0000 @@ -47,8 +47,8 @@ VIDEO_START( stoneage ); VIDEO_START( mutantf ); -SCREEN_UPDATE( cninja ); -SCREEN_UPDATE( cninjabl ); -SCREEN_UPDATE( edrandy ); -SCREEN_UPDATE( robocop2 ); -SCREEN_UPDATE( mutantf ); +SCREEN_UPDATE_IND16( cninja ); +SCREEN_UPDATE_IND16( cninjabl ); +SCREEN_UPDATE_IND16( edrandy ); +SCREEN_UPDATE_IND16( robocop2 ); +SCREEN_UPDATE_RGB32( mutantf ); diff -Nru mame-0.144/src/mame/includes/combatsc.h mame-0.145/src/mame/includes/combatsc.h --- mame-0.144/src/mame/includes/combatsc.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/combatsc.h 2012-02-06 21:30:44.000000000 +0000 @@ -57,5 +57,5 @@ PALETTE_INIT( combatscb ); VIDEO_START( combatsc ); VIDEO_START( combatscb ); -SCREEN_UPDATE( combatscb ); -SCREEN_UPDATE( combatsc ); +SCREEN_UPDATE_IND16( combatscb ); +SCREEN_UPDATE_IND16( combatsc ); diff -Nru mame-0.144/src/mame/includes/commando.h mame-0.145/src/mame/includes/commando.h --- mame-0.144/src/mame/includes/commando.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/commando.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,5 +40,5 @@ WRITE8_HANDLER( commando_c804_w ); VIDEO_START( commando ); -SCREEN_UPDATE( commando ); -SCREEN_EOF( commando ); +SCREEN_UPDATE_IND16( commando ); +SCREEN_VBLANK( commando ); diff -Nru mame-0.144/src/mame/includes/compgolf.h mame-0.145/src/mame/includes/compgolf.h --- mame-0.144/src/mame/includes/compgolf.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/compgolf.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ WRITE8_HANDLER( compgolf_back_w ); PALETTE_INIT ( compgolf ); VIDEO_START ( compgolf ); -SCREEN_UPDATE( compgolf ); +SCREEN_UPDATE_IND16( compgolf ); diff -Nru mame-0.144/src/mame/includes/contra.h mame-0.145/src/mame/includes/contra.h --- mame-0.144/src/mame/includes/contra.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/contra.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,5 +52,5 @@ WRITE8_HANDLER( contra_K007121_ctrl_0_w ); WRITE8_HANDLER( contra_K007121_ctrl_1_w ); -SCREEN_UPDATE( contra ); +SCREEN_UPDATE_IND16( contra ); VIDEO_START( contra ); diff -Nru mame-0.144/src/mame/includes/cop01.h mame-0.145/src/mame/includes/cop01.h --- mame-0.144/src/mame/includes/cop01.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cop01.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,7 +37,7 @@ PALETTE_INIT( cop01 ); VIDEO_START( cop01 ); -SCREEN_UPDATE( cop01 ); +SCREEN_UPDATE_IND16( cop01 ); WRITE8_HANDLER( cop01_background_w ); WRITE8_HANDLER( cop01_foreground_w ); diff -Nru mame-0.144/src/mame/includes/copsnrob.h mame-0.145/src/mame/includes/copsnrob.h --- mame-0.144/src/mame/includes/copsnrob.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/copsnrob.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,7 +35,7 @@ /*----------- defined in video/copsnrob.c -----------*/ -SCREEN_UPDATE( copsnrob ); +SCREEN_UPDATE_IND16( copsnrob ); /*----------- defined in audio/copsnrob.c -----------*/ diff -Nru mame-0.144/src/mame/includes/cosmic.h mame-0.145/src/mame/includes/cosmic.h --- mame-0.144/src/mame/includes/cosmic.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/cosmic.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,9 +52,9 @@ PALETTE_INIT( magspot ); PALETTE_INIT( nomnlnd ); -SCREEN_UPDATE( panic ); -SCREEN_UPDATE( magspot ); -SCREEN_UPDATE( devzone ); -SCREEN_UPDATE( cosmica ); -SCREEN_UPDATE( cosmicg ); -SCREEN_UPDATE( nomnlnd ); +SCREEN_UPDATE_IND16( panic ); +SCREEN_UPDATE_IND16( magspot ); +SCREEN_UPDATE_IND16( devzone ); +SCREEN_UPDATE_IND16( cosmica ); +SCREEN_UPDATE_IND16( cosmicg ); +SCREEN_UPDATE_IND16( nomnlnd ); diff -Nru mame-0.144/src/mame/includes/cps1.h mame-0.145/src/mame/includes/cps1.h --- mame-0.144/src/mame/includes/cps1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cps1.h 2012-02-06 21:30:44.000000000 +0000 @@ -93,7 +93,6 @@ int m_scanline1; int m_scanline2; int m_scancalls; - int m_scancount; int m_scroll1x; int m_scroll1y; @@ -132,8 +131,7 @@ int m_palette_align; int m_palette_size; int m_stars_rom_size; - UINT8 m_empty_tile8x8[8*8]; - UINT8 m_empty_tile[32*32/2]; + UINT8 m_empty_tile[32*32]; int m_cps_version; /* devices */ @@ -175,8 +173,8 @@ VIDEO_START( cps1 ); VIDEO_START( cps2 ); -SCREEN_UPDATE( cps1 ); -SCREEN_EOF( cps1 ); +SCREEN_UPDATE_IND16( cps1 ); +SCREEN_VBLANK( cps1 ); void cps1_get_video_base(running_machine &machine); void cps2_set_sprite_priorities(running_machine &machine); diff -Nru mame-0.144/src/mame/includes/cps3.h mame-0.145/src/mame/includes/cps3.h --- mame-0.144/src/mame/includes/cps3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cps3.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,7 +34,7 @@ UINT32 m_ss_bank_base; UINT32 m_screenwidth; UINT32* m_mame_colours; - bitmap_t *m_renderbuffer_bitmap; + bitmap_rgb32 m_renderbuffer_bitmap; rectangle m_renderbuffer_clip; UINT8* m_user4region; UINT32 m_key1; diff -Nru mame-0.144/src/mame/includes/crbaloon.h mame-0.145/src/mame/includes/crbaloon.h --- mame-0.144/src/mame/includes/crbaloon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/crbaloon.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,6 +21,7 @@ UINT16 m_collision_address; UINT8 m_collision_address_clear; tilemap_t *m_bg_tilemap; + UINT8 m_irq_mask; }; @@ -40,7 +41,7 @@ PALETTE_INIT( crbaloon ); VIDEO_START( crbaloon ); -SCREEN_UPDATE( crbaloon ); +SCREEN_UPDATE_IND16( crbaloon ); WRITE8_HANDLER( crbaloon_videoram_w ); WRITE8_HANDLER( crbaloon_colorram_w ); diff -Nru mame-0.144/src/mame/includes/crimfght.h mame-0.145/src/mame/includes/crimfght.h --- mame-0.144/src/mame/includes/crimfght.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/crimfght.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,4 +31,4 @@ extern void crimfght_sprite_callback(running_machine &machine, int *code,int *color,int *priority,int *shadow); VIDEO_START( crimfght ); -SCREEN_UPDATE( crimfght ); +SCREEN_UPDATE_IND16( crimfght ); diff -Nru mame-0.144/src/mame/includes/crospang.h mame-0.145/src/mame/includes/crospang.h --- mame-0.144/src/mame/includes/crospang.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/crospang.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,8 +20,6 @@ /* video-related */ tilemap_t *m_bg_layer; tilemap_t *m_fg_layer; - int m_xsproff; - int m_ysproff; int m_bestri_tilebank; /* devices */ @@ -32,7 +30,7 @@ /*----------- defined in video/crospang.c -----------*/ VIDEO_START( crospang ); -SCREEN_UPDATE( crospang ); +SCREEN_UPDATE_IND16( crospang ); WRITE16_HANDLER ( crospang_fg_scrolly_w ); WRITE16_HANDLER ( crospang_bg_scrolly_w ); diff -Nru mame-0.144/src/mame/includes/crshrace.h mame-0.145/src/mame/includes/crshrace.h --- mame-0.144/src/mame/includes/crshrace.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/crshrace.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,5 +35,5 @@ WRITE16_HANDLER( crshrace_gfxctrl_w ); VIDEO_START( crshrace ); -SCREEN_EOF( crshrace ); -SCREEN_UPDATE( crshrace ); +SCREEN_VBLANK( crshrace ); +SCREEN_UPDATE_IND16( crshrace ); diff -Nru mame-0.144/src/mame/includes/cvs.h mame-0.145/src/mame/includes/cvs.h --- mame-0.144/src/mame/includes/cvs.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cvs.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,9 +32,9 @@ /* video-related */ struct cvs_star m_stars[CVS_MAX_STARS]; - bitmap_t *m_collision_background; - bitmap_t *m_background_bitmap; - bitmap_t *m_scrolled_collision_background; + bitmap_ind16 m_collision_background; + bitmap_ind16 m_background_bitmap; + bitmap_ind16 m_scrolled_collision_background; int m_collision_register; int m_total_stars; int m_stars_on; @@ -109,11 +109,11 @@ void cvs_scroll_stars(running_machine &machine); PALETTE_INIT( cvs ); -SCREEN_UPDATE( cvs ); +SCREEN_UPDATE_IND16( cvs ); VIDEO_START( cvs ); /*----------- defined in video/quasar.c -----------*/ PALETTE_INIT( quasar ); -SCREEN_UPDATE( quasar ); +SCREEN_UPDATE_IND16( quasar ); VIDEO_START( quasar ); diff -Nru mame-0.144/src/mame/includes/cyberbal.h mame-0.145/src/mame/includes/cyberbal.h --- mame-0.144/src/mame/includes/cyberbal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/cyberbal.h 2012-02-06 21:30:44.000000000 +0000 @@ -57,6 +57,8 @@ VIDEO_START( cyberbal ); VIDEO_START( cyberbal2p ); -SCREEN_UPDATE( cyberbal ); +SCREEN_UPDATE_IND16( cyberbal_left ); +SCREEN_UPDATE_IND16( cyberbal_right ); +SCREEN_UPDATE_IND16( cyberbal2p ); void cyberbal_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/darius.h mame-0.145/src/mame/includes/darius.h --- mame-0.144/src/mame/includes/darius.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/darius.h 2012-02-06 21:30:44.000000000 +0000 @@ -69,4 +69,6 @@ WRITE16_HANDLER( darius_fg_layer_w ); VIDEO_START( darius ); -SCREEN_UPDATE( darius ); +SCREEN_UPDATE_IND16( darius_left ); +SCREEN_UPDATE_IND16( darius_middle ); +SCREEN_UPDATE_IND16( darius_right ); diff -Nru mame-0.144/src/mame/includes/darkmist.h mame-0.145/src/mame/includes/darkmist.h --- mame-0.144/src/mame/includes/darkmist.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/darkmist.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,6 +20,6 @@ /*----------- defined in video/darkmist.c -----------*/ VIDEO_START( darkmist ); -SCREEN_UPDATE( darkmist ); +SCREEN_UPDATE_IND16( darkmist ); PALETTE_INIT( darkmist ); diff -Nru mame-0.144/src/mame/includes/darkseal.h mame-0.145/src/mame/includes/darkseal.h --- mame-0.144/src/mame/includes/darkseal.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/darkseal.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,7 +24,7 @@ /*----------- defined in video/darkseal.c -----------*/ VIDEO_START( darkseal ); -SCREEN_UPDATE( darkseal ); +SCREEN_UPDATE_IND16( darkseal ); WRITE16_HANDLER( darkseal_palette_24bit_rg_w ); WRITE16_HANDLER( darkseal_palette_24bit_b_w ); diff -Nru mame-0.144/src/mame/includes/dassault.h mame-0.145/src/mame/includes/dassault.h --- mame-0.144/src/mame/includes/dassault.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dassault.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,5 @@ /*----------- defined in video/dassault.c -----------*/ -SCREEN_UPDATE( dassault ); +VIDEO_START(dassault); +SCREEN_UPDATE_RGB32( dassault ); diff -Nru mame-0.144/src/mame/includes/dbz.h mame-0.145/src/mame/includes/dbz.h --- mame-0.144/src/mame/includes/dbz.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dbz.h 2012-02-06 21:30:44.000000000 +0000 @@ -45,4 +45,4 @@ WRITE16_HANDLER(dbz_bg2_videoram_w); VIDEO_START(dbz); -SCREEN_UPDATE(dbz); +SCREEN_UPDATE_IND16(dbz); diff -Nru mame-0.144/src/mame/includes/dc.h mame-0.145/src/mame/includes/dc.h --- mame-0.144/src/mame/includes/dc.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/dc.h 2012-02-06 21:30:44.000000000 +0000 @@ -7,6 +7,66 @@ #ifndef __DC_H__ #define __DC_H__ +class dc_state : public driver_device +{ + public: + dc_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + UINT64 *dc_framebuffer_ram; // '32-bit access area' + UINT64 *dc_texture_ram; // '64-bit access area' + + UINT32 *dc_sound_ram; + + /* machine related */ + UINT32 dc_rtcregister[4]; + UINT32 dc_sysctrl_regs[0x200/4]; + UINT32 g1bus_regs[0x100/4]; // DC-only + UINT32 g2bus_regs[0x100/4]; + + emu_timer *dc_rtc_timer; + + struct { + UINT32 aica_addr; + UINT32 root_addr; + UINT32 size; + UINT8 dir; + UINT8 flag; + UINT8 indirect; + UINT8 start; + UINT8 sel; + }m_wave_dma; + + struct { + UINT32 pvr_addr; + UINT32 sys_addr; + UINT32 size; + UINT8 sel; + UINT8 dir; + UINT8 flag; + UINT8 start; + }m_pvr_dma; + + /* video related */ + UINT32 pvrta_regs[0x2000/4]; + UINT32 pvrctrl_regs[0x100/4]; + UINT32 debug_dip_status; + emu_timer *vbout_timer; + emu_timer *vbin_timer; + emu_timer *hbin_timer; + emu_timer *endofrender_timer_isp; + emu_timer *endofrender_timer_tsp; + emu_timer *endofrender_timer_video; + UINT32 tafifo_buff[32]; + int scanline; + int next_y; + + /* Naomi 2 specific (To be moved) */ + UINT64 *pvr2_texture_ram; + UINT64 *pvr2_framebuffer_ram; + UINT64 *elan_ram; +}; + /*----------- defined in machine/dc.c -----------*/ READ64_HANDLER( pvr_ctrl_r ); @@ -36,9 +96,6 @@ int dc_compute_interrupt_level(running_machine &machine); void dc_update_interrupt_status(running_machine &machine); -extern UINT32 dc_sysctrl_regs[0x200/4]; -extern UINT32 g1bus_regs[0x100/4]; - /*--------- Ch2-DMA Control Registers ----------*/ #define SB_C2DSTAT ((0x005f6800-0x005f6800)/4) #define SB_C2DLEN ((0x005f6804-0x005f6800)/4) @@ -219,7 +276,7 @@ WRITE64_HANDLER( ta_fifo_poly_w ); WRITE64_HANDLER( ta_fifo_yuv_w ); VIDEO_START(dc); -SCREEN_UPDATE(dc); +SCREEN_UPDATE_RGB32(dc); /*--------------- CORE registers --------------*/ #define PVRID ((0x005f8000-0x005f8000)/4) diff -Nru mame-0.144/src/mame/includes/dcheese.h mame-0.145/src/mame/includes/dcheese.h --- mame-0.144/src/mame/includes/dcheese.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dcheese.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ UINT16 m_blitter_yparam[16]; UINT16 m_blitter_vidparam[32]; - bitmap_t *m_dstbitmap; + bitmap_ind16 *m_dstbitmap; emu_timer *m_blitter_timer; /* misc */ @@ -42,7 +42,7 @@ PALETTE_INIT( dcheese ); VIDEO_START( dcheese ); -SCREEN_UPDATE( dcheese ); +SCREEN_UPDATE_IND16( dcheese ); WRITE16_HANDLER( madmax_blitter_color_w ); WRITE16_HANDLER( madmax_blitter_xparam_w ); diff -Nru mame-0.144/src/mame/includes/dcon.h mame-0.145/src/mame/includes/dcon.h --- mame-0.144/src/mame/includes/dcon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dcon.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,5 +32,5 @@ READ16_HANDLER( dcon_control_r ); VIDEO_START( dcon ); -SCREEN_UPDATE( dcon ); -SCREEN_UPDATE( sdgndmps ); +SCREEN_UPDATE_IND16( dcon ); +SCREEN_UPDATE_IND16( sdgndmps ); diff -Nru mame-0.144/src/mame/includes/dday.h mame-0.145/src/mame/includes/dday.h --- mame-0.144/src/mame/includes/dday.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/dday.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_text_tilemap; tilemap_t *m_sl_tilemap; - bitmap_t *m_main_bitmap; + bitmap_ind16 m_main_bitmap; int m_control; int m_sl_image; int m_sl_enable; @@ -37,7 +37,7 @@ PALETTE_INIT( dday ); VIDEO_START( dday ); -SCREEN_UPDATE( dday ); +SCREEN_UPDATE_IND16( dday ); WRITE8_HANDLER( dday_bgvideoram_w ); WRITE8_HANDLER( dday_fgvideoram_w ); diff -Nru mame-0.144/src/mame/includes/ddragon3.h mame-0.145/src/mame/includes/ddragon3.h --- mame-0.144/src/mame/includes/ddragon3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ddragon3.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,5 +44,5 @@ extern READ16_HANDLER( ddragon3_scroll_r ); extern VIDEO_START( ddragon3 ); -extern SCREEN_UPDATE( ddragon3 ); -extern SCREEN_UPDATE( ctribe ); +extern SCREEN_UPDATE_IND16( ddragon3 ); +extern SCREEN_UPDATE_IND16( ctribe ); diff -Nru mame-0.144/src/mame/includes/ddragon.h mame-0.145/src/mame/includes/ddragon.h --- mame-0.144/src/mame/includes/ddragon.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ddragon.h 2012-02-06 21:30:44.000000000 +0000 @@ -68,5 +68,5 @@ VIDEO_START( chinagat ); VIDEO_START( ddragon ); -SCREEN_UPDATE( ddragon ); +SCREEN_UPDATE_IND16( ddragon ); diff -Nru mame-0.144/src/mame/includes/ddribble.h mame-0.145/src/mame/includes/ddribble.h --- mame-0.144/src/mame/includes/ddribble.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ddribble.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,4 +44,4 @@ PALETTE_INIT( ddribble ); VIDEO_START( ddribble ); -SCREEN_UPDATE( ddribble ); +SCREEN_UPDATE_IND16( ddribble ); diff -Nru mame-0.144/src/mame/includes/deadang.h mame-0.145/src/mame/includes/deadang.h --- mame-0.144/src/mame/includes/deadang.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/deadang.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ WRITE16_HANDLER( deadang_bank_w ); VIDEO_START( deadang ); -SCREEN_UPDATE( deadang ); +SCREEN_UPDATE_IND16( deadang ); diff -Nru mame-0.144/src/mame/includes/dec0.h mame-0.145/src/mame/includes/dec0.h --- mame-0.144/src/mame/includes/dec0.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dec0.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,13 +29,13 @@ /* Video emulation definitions */ VIDEO_START( dec0 ); VIDEO_START( dec0_nodma ); -SCREEN_UPDATE( hbarrel ); -SCREEN_UPDATE( baddudes ); -SCREEN_UPDATE( birdtry ); -SCREEN_UPDATE( robocop ); -SCREEN_UPDATE( hippodrm ); -SCREEN_UPDATE( slyspy ); -SCREEN_UPDATE( midres ); +SCREEN_UPDATE_IND16( hbarrel ); +SCREEN_UPDATE_IND16( baddudes ); +SCREEN_UPDATE_IND16( birdtry ); +SCREEN_UPDATE_IND16( robocop ); +SCREEN_UPDATE_IND16( hippodrm ); +SCREEN_UPDATE_IND16( slyspy ); +SCREEN_UPDATE_IND16( midres ); WRITE16_HANDLER( dec0_priority_w ); WRITE16_HANDLER( dec0_update_sprites_w ); diff -Nru mame-0.144/src/mame/includes/dec8.h mame-0.145/src/mame/includes/dec8.h --- mame-0.144/src/mame/includes/dec8.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/dec8.h 2012-02-06 21:30:44.000000000 +0000 @@ -50,14 +50,14 @@ PALETTE_INIT( ghostb ); -SCREEN_UPDATE( cobracom ); -SCREEN_UPDATE( ghostb ); -SCREEN_UPDATE( srdarwin ); -SCREEN_UPDATE( gondo ); -SCREEN_UPDATE( garyoret ); -SCREEN_UPDATE( lastmisn ); -SCREEN_UPDATE( shackled ); -SCREEN_UPDATE( oscar ); +SCREEN_UPDATE_IND16( cobracom ); +SCREEN_UPDATE_IND16( ghostb ); +SCREEN_UPDATE_IND16( srdarwin ); +SCREEN_UPDATE_IND16( gondo ); +SCREEN_UPDATE_IND16( garyoret ); +SCREEN_UPDATE_IND16( lastmisn ); +SCREEN_UPDATE_IND16( shackled ); +SCREEN_UPDATE_IND16( oscar ); VIDEO_START( cobracom ); VIDEO_START( oscar ); VIDEO_START( ghostb ); diff -Nru mame-0.144/src/mame/includes/deco32.h mame-0.145/src/mame/includes/deco32.h --- mame-0.144/src/mame/includes/deco32.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/deco32.h 2012-02-06 21:30:44.000000000 +0000 @@ -5,9 +5,11 @@ public: deco32_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), m_decobsmt(*this, "decobsmt") { } + required_device m_maincpu; optional_device m_decobsmt; UINT32 *m_ram; @@ -30,7 +32,7 @@ UINT8 *m_dirty_palette; int m_pri; - bitmap_t *m_tilemap_alpha_bitmap; + bitmap_ind16 *m_tilemap_alpha_bitmap; UINT16 m_spriteram16[0x1000]; @@ -49,6 +51,7 @@ device_t *m_deco_tilegen1; device_t *m_deco_tilegen2; + UINT8 m_irq_source; }; class dragngun_state : public deco32_state @@ -75,13 +78,13 @@ VIDEO_START( lockload ); VIDEO_START( nslasher ); -SCREEN_EOF( captaven ); -SCREEN_EOF( dragngun ); +SCREEN_VBLANK( captaven ); +SCREEN_VBLANK( dragngun ); -SCREEN_UPDATE( captaven ); -SCREEN_UPDATE( fghthist ); -SCREEN_UPDATE( dragngun ); -SCREEN_UPDATE( nslasher ); +SCREEN_UPDATE_IND16( captaven ); +SCREEN_UPDATE_RGB32( fghthist ); +SCREEN_UPDATE_RGB32( dragngun ); +SCREEN_UPDATE_RGB32( nslasher ); WRITE32_HANDLER( deco32_pf1_data_w ); diff -Nru mame-0.144/src/mame/includes/deco_mlc.h mame-0.145/src/mame/includes/deco_mlc.h --- mame-0.144/src/mame/includes/deco_mlc.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/deco_mlc.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,5 +23,5 @@ /*----------- defined in video/deco_mlc.c -----------*/ VIDEO_START( mlc ); -SCREEN_UPDATE( mlc ); -SCREEN_EOF( mlc ); +SCREEN_UPDATE_RGB32( mlc ); +SCREEN_VBLANK( mlc ); diff -Nru mame-0.144/src/mame/includes/deniam.h mame-0.145/src/mame/includes/deniam.h --- mame-0.144/src/mame/includes/deniam.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/deniam.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,7 +51,7 @@ WRITE16_HANDLER( deniam_coinctrl_w ); VIDEO_START( deniam ); -SCREEN_UPDATE( deniam ); +SCREEN_UPDATE_IND16( deniam ); DRIVER_INIT( logicpro ); DRIVER_INIT( karianx ); diff -Nru mame-0.144/src/mame/includes/dietgo.h mame-0.145/src/mame/includes/dietgo.h --- mame-0.144/src/mame/includes/dietgo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dietgo.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ /*----------- defined in video/dietgo.c -----------*/ -SCREEN_UPDATE( dietgo ); +SCREEN_UPDATE_IND16( dietgo ); diff -Nru mame-0.144/src/mame/includes/djboy.h mame-0.145/src/mame/includes/djboy.h --- mame-0.144/src/mame/includes/djboy.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/djboy.h 2012-02-06 21:30:44.000000000 +0000 @@ -53,5 +53,5 @@ WRITE8_HANDLER( djboy_paletteram_w ); VIDEO_START( djboy ); -SCREEN_UPDATE( djboy ); -SCREEN_EOF( djboy ); +SCREEN_UPDATE_IND16( djboy ); +SCREEN_VBLANK( djboy ); diff -Nru mame-0.144/src/mame/includes/djmain.h mame-0.145/src/mame/includes/djmain.h --- mame-0.144/src/mame/includes/djmain.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/djmain.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,7 +20,7 @@ /*----------- defined in video/djmain.c -----------*/ -SCREEN_UPDATE( djmain ); +SCREEN_UPDATE_RGB32( djmain ); VIDEO_START( djmain ); void djmain_tile_callback(running_machine& machine, int layer, int *code, int *color, int *flags); diff -Nru mame-0.144/src/mame/includes/dkong.h mame-0.145/src/mame/includes/dkong.h --- mame-0.144/src/mame/includes/dkong.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dkong.h 2012-02-06 21:30:44.000000000 +0000 @@ -96,7 +96,7 @@ /* video state */ tilemap_t *m_bg_tilemap; - bitmap_t * m_bg_bits; + bitmap_ind16 m_bg_bits; const UINT8 * m_color_codes; emu_timer * m_scanline_timer; INT8 m_vidhw; /* Selected video hardware RS Conversion / TKG04 */ @@ -138,6 +138,7 @@ #endif /* machine states */ UINT8 m_hardware_type; + UINT8 m_nmi_mask; /* sound state */ const UINT8 *m_snd_rom; @@ -145,7 +146,7 @@ /* video state */ tilemap_t *m_bg_tilemap; - bitmap_t *m_bg_bits; + bitmap_ind16 m_bg_bits; const UINT8 * m_color_codes; emu_timer * m_scanline_timer; INT8 m_vidhw; /* Selected video hardware RS Conversion / TKG04 */ @@ -217,9 +218,9 @@ PALETTE_INIT( dkong3 ); VIDEO_START( dkong ); -SCREEN_UPDATE( dkong ); -SCREEN_UPDATE( pestplce ); -SCREEN_UPDATE( spclforc ); +SCREEN_UPDATE_IND16( dkong ); +SCREEN_UPDATE_IND16( pestplce ); +SCREEN_UPDATE_IND16( spclforc ); /*----------- defined in audio/dkong.c -----------*/ diff -Nru mame-0.144/src/mame/includes/docastle.h mame-0.145/src/mame/includes/docastle.h --- mame-0.144/src/mame/includes/docastle.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/docastle.h 2012-02-06 21:30:44.000000000 +0000 @@ -49,5 +49,5 @@ PALETTE_INIT( docastle ); VIDEO_START( docastle ); VIDEO_START( dorunrun ); -SCREEN_UPDATE( docastle ); +SCREEN_UPDATE_IND16( docastle ); diff -Nru mame-0.144/src/mame/includes/dogfgt.h mame-0.145/src/mame/includes/dogfgt.h --- mame-0.144/src/mame/includes/dogfgt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dogfgt.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ size_t m_spriteram_size; /* video-related */ - bitmap_t *m_pixbitmap; + bitmap_ind16 m_pixbitmap; tilemap_t *m_bg_tilemap; UINT8 *m_bitmapram; int m_bm_plane; @@ -46,4 +46,4 @@ PALETTE_INIT( dogfgt ); VIDEO_START( dogfgt ); -SCREEN_UPDATE( dogfgt ); +SCREEN_UPDATE_IND16( dogfgt ); diff -Nru mame-0.144/src/mame/includes/dooyong.h mame-0.145/src/mame/includes/dooyong.h --- mame-0.144/src/mame/includes/dooyong.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dooyong.h 2012-02-06 21:30:44.000000000 +0000 @@ -59,14 +59,14 @@ WRITE8_HANDLER( flytiger_ctrl_w ); WRITE16_HANDLER( rshark_ctrl_w ); -SCREEN_UPDATE( lastday ); -SCREEN_UPDATE( gulfstrm ); -SCREEN_UPDATE( pollux ); -SCREEN_UPDATE( bluehawk ); -SCREEN_UPDATE( flytiger ); -SCREEN_UPDATE( primella ); -SCREEN_UPDATE( rshark ); -SCREEN_UPDATE( popbingo ); +SCREEN_UPDATE_IND16( lastday ); +SCREEN_UPDATE_IND16( gulfstrm ); +SCREEN_UPDATE_IND16( pollux ); +SCREEN_UPDATE_IND16( bluehawk ); +SCREEN_UPDATE_IND16( flytiger ); +SCREEN_UPDATE_IND16( primella ); +SCREEN_UPDATE_IND16( rshark ); +SCREEN_UPDATE_IND16( popbingo ); VIDEO_START( lastday ); VIDEO_START( gulfstrm ); @@ -77,5 +77,5 @@ VIDEO_START( rshark ); VIDEO_START( popbingo ); -SCREEN_EOF( dooyong ); -SCREEN_EOF( rshark ); +SCREEN_VBLANK( dooyong ); +SCREEN_VBLANK( rshark ); diff -Nru mame-0.144/src/mame/includes/dragrace.h mame-0.145/src/mame/includes/dragrace.h --- mame-0.144/src/mame/includes/dragrace.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dragrace.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,4 +51,4 @@ /*----------- defined in video/dragrace.c -----------*/ VIDEO_START( dragrace ); -SCREEN_UPDATE( dragrace ); +SCREEN_UPDATE_IND16( dragrace ); diff -Nru mame-0.144/src/mame/includes/drgnmst.h mame-0.145/src/mame/includes/drgnmst.h --- mame-0.144/src/mame/includes/drgnmst.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/drgnmst.h 2012-02-06 21:30:44.000000000 +0000 @@ -47,4 +47,4 @@ WRITE16_HANDLER( drgnmst_md_videoram_w ); VIDEO_START(drgnmst); -SCREEN_UPDATE(drgnmst); +SCREEN_UPDATE_IND16(drgnmst); diff -Nru mame-0.144/src/mame/includes/dribling.h mame-0.145/src/mame/includes/dribling.h --- mame-0.144/src/mame/includes/dribling.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dribling.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ PALETTE_INIT( dribling ); WRITE8_HANDLER( dribling_colorram_w ); -SCREEN_UPDATE( dribling ); +SCREEN_UPDATE_IND16( dribling ); diff -Nru mame-0.144/src/mame/includes/drmicro.h mame-0.145/src/mame/includes/drmicro.h --- mame-0.144/src/mame/includes/drmicro.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/drmicro.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,6 +32,6 @@ PALETTE_INIT( drmicro ); VIDEO_START( drmicro ); -SCREEN_UPDATE( drmicro ); +SCREEN_UPDATE_IND16( drmicro ); WRITE8_HANDLER( drmicro_videoram_w ); diff -Nru mame-0.144/src/mame/includes/dynax.h mame-0.145/src/mame/includes/dynax.h --- mame-0.144/src/mame/includes/dynax.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/dynax.h 2012-02-06 21:30:44.000000000 +0000 @@ -10,7 +10,8 @@ { public: dynax_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag) + { } // up to 8 layers, 2 images per layer (interleaved on screen) UINT8 * m_pixmap[8][2]; @@ -216,12 +217,13 @@ VIDEO_START( neruton ); VIDEO_START( htengoku ); -SCREEN_UPDATE( hanamai ); -SCREEN_UPDATE( hnoridur ); -SCREEN_UPDATE( sprtmtch ); -SCREEN_UPDATE( mjdialq2 ); -SCREEN_UPDATE( jantouki ); -SCREEN_UPDATE( htengoku ); +SCREEN_UPDATE_IND16( hanamai ); +SCREEN_UPDATE_IND16( hnoridur ); +SCREEN_UPDATE_IND16( sprtmtch ); +SCREEN_UPDATE_IND16( mjdialq2 ); +SCREEN_UPDATE_IND16( jantouki_top ); +SCREEN_UPDATE_IND16( jantouki_bottom ); +SCREEN_UPDATE_IND16( htengoku ); PALETTE_INIT( sprtmtch ); @@ -237,4 +239,4 @@ WRITE8_HANDLER( ddenlovr_transparency_mask_w ); VIDEO_START(ddenlovr); -SCREEN_UPDATE(ddenlovr); +SCREEN_UPDATE_IND16(ddenlovr); diff -Nru mame-0.144/src/mame/includes/dynduke.h mame-0.145/src/mame/includes/dynduke.h --- mame-0.144/src/mame/includes/dynduke.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/dynduke.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,5 +31,5 @@ WRITE16_HANDLER( dynduke_control_w ); WRITE16_HANDLER( dynduke_paletteram_w ); VIDEO_START( dynduke ); -SCREEN_UPDATE( dynduke ); -SCREEN_EOF( dynduke ); +SCREEN_UPDATE_IND16( dynduke ); +SCREEN_VBLANK( dynduke ); diff -Nru mame-0.144/src/mame/includes/eolith.h mame-0.145/src/mame/includes/eolith.h --- mame-0.144/src/mame/includes/eolith.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/eolith.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,11 +2,15 @@ { public: eolith_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_coin_counter_bit; int m_buffer; UINT32 *m_vram; + + required_device m_maincpu; }; @@ -15,4 +19,4 @@ READ32_HANDLER( eolith_vram_r ); WRITE32_HANDLER( eolith_vram_w ); VIDEO_START( eolith ); -SCREEN_UPDATE( eolith ); +SCREEN_UPDATE_IND16( eolith ); diff -Nru mame-0.144/src/mame/includes/eolithsp.h mame-0.145/src/mame/includes/eolithsp.h --- mame-0.144/src/mame/includes/eolithsp.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/eolithsp.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,5 +2,7 @@ void eolith_speedup_read(address_space *space); void init_eolith_speedup(running_machine &machine); -INTERRUPT_GEN( eolith_speedup ); +TIMER_DEVICE_CALLBACK( eolith_speedup ); CUSTOM_INPUT( eolith_speedup_getvblank ); +CUSTOM_INPUT( stealsee_speedup_getvblank ); + diff -Nru mame-0.144/src/mame/includes/epos.h mame-0.145/src/mame/includes/epos.h --- mame-0.144/src/mame/includes/epos.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/epos.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,4 +25,4 @@ /*----------- defined in video/epos.c -----------*/ WRITE8_HANDLER( epos_port_1_w ); -SCREEN_UPDATE( epos ); +SCREEN_UPDATE_RGB32( epos ); diff -Nru mame-0.144/src/mame/includes/eprom.h mame-0.145/src/mame/includes/eprom.h --- mame-0.144/src/mame/includes/eprom.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/eprom.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,9 +22,9 @@ /*----------- defined in video/eprom.c -----------*/ VIDEO_START( eprom ); -SCREEN_UPDATE( eprom ); +SCREEN_UPDATE_IND16( eprom ); VIDEO_START( guts ); -SCREEN_UPDATE( guts ); +SCREEN_UPDATE_IND16( guts ); void eprom_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/equites.h mame-0.145/src/mame/includes/equites.h --- mame-0.144/src/mame/includes/equites.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/equites.h 2012-02-06 21:30:44.000000000 +0000 @@ -74,7 +74,7 @@ extern PALETTE_INIT( equites ); extern VIDEO_START( equites ); -extern SCREEN_UPDATE( equites ); +extern SCREEN_UPDATE_IND16( equites ); extern PALETTE_INIT( splndrbt ); extern VIDEO_START( splndrbt ); -extern SCREEN_UPDATE( splndrbt ); +extern SCREEN_UPDATE_IND16( splndrbt ); diff -Nru mame-0.144/src/mame/includes/esd16.h mame-0.145/src/mame/includes/esd16.h --- mame-0.144/src/mame/includes/esd16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/esd16.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,6 +44,4 @@ WRITE16_HANDLER( esd16_tilemap0_color_w ); VIDEO_START( esd16 ); -SCREEN_UPDATE( esd16 ); -SCREEN_UPDATE( hedpanic ); -SCREEN_UPDATE( hedpanio ); +SCREEN_UPDATE_IND16( hedpanic ); diff -Nru mame-0.144/src/mame/includes/espial.h mame-0.145/src/mame/includes/espial.h --- mame-0.144/src/mame/includes/espial.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/espial.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ WRITE8_HANDLER( espial_attributeram_w ); WRITE8_HANDLER( espial_scrollram_w ); WRITE8_HANDLER( espial_flipscreen_w ); -SCREEN_UPDATE( espial ); +SCREEN_UPDATE_IND16( espial ); diff -Nru mame-0.144/src/mame/includes/esripsys.h mame-0.145/src/mame/includes/esripsys.h --- mame-0.144/src/mame/includes/esripsys.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/esripsys.h 2012-02-06 21:30:44.000000000 +0000 @@ -70,7 +70,7 @@ /*----------- defined in video/esripsys.c -----------*/ VIDEO_START( esripsys ); -SCREEN_UPDATE( esripsys ); +SCREEN_UPDATE_RGB32( esripsys ); WRITE8_HANDLER( esripsys_bg_intensity_w ); INTERRUPT_GEN( esripsys_vblank_irq ); diff -Nru mame-0.144/src/mame/includes/exedexes.h mame-0.145/src/mame/includes/exedexes.h --- mame-0.144/src/mame/includes/exedexes.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/exedexes.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,5 +40,5 @@ extern PALETTE_INIT( exedexes ); extern VIDEO_START( exedexes ); -extern SCREEN_UPDATE( exedexes ); -extern SCREEN_EOF( exedexes ); +extern SCREEN_UPDATE_IND16( exedexes ); +extern SCREEN_VBLANK( exedexes ); diff -Nru mame-0.144/src/mame/includes/exerion.h mame-0.145/src/mame/includes/exerion.h --- mame-0.144/src/mame/includes/exerion.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/exerion.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,7 +54,7 @@ PALETTE_INIT( exerion ); VIDEO_START( exerion ); -SCREEN_UPDATE( exerion ); +SCREEN_UPDATE_IND16( exerion ); WRITE8_HANDLER( exerion_videoreg_w ); WRITE8_HANDLER( exerion_video_latch_w ); diff -Nru mame-0.144/src/mame/includes/exidy.h mame-0.145/src/mame/includes/exidy.h --- mame-0.144/src/mame/includes/exidy.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/exidy.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,10 +39,10 @@ UINT8 m_collision_invert; int m_is_2bpp; UINT8 m_int_condition; - bitmap_t *m_background_bitmap; - bitmap_t *m_motion_object_1_vid; - bitmap_t *m_motion_object_2_vid; - bitmap_t *m_motion_object_2_clip; + bitmap_ind16 m_background_bitmap; + bitmap_ind16 m_motion_object_1_vid; + bitmap_ind16 m_motion_object_2_vid; + bitmap_ind16 m_motion_object_2_clip; }; @@ -50,7 +50,7 @@ void exidy_video_config(running_machine &machine, UINT8 _collision_mask, UINT8 _collision_invert, int _is_2bpp); VIDEO_START( exidy ); -SCREEN_UPDATE( exidy ); +SCREEN_UPDATE_IND16( exidy ); INTERRUPT_GEN( exidy_vblank_interrupt ); diff -Nru mame-0.144/src/mame/includes/exprraid.h mame-0.145/src/mame/includes/exprraid.h --- mame-0.144/src/mame/includes/exprraid.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/exprraid.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ extern WRITE8_HANDLER( exprraid_scrolly_w ); extern VIDEO_START( exprraid ); -extern SCREEN_UPDATE( exprraid ); +extern SCREEN_UPDATE_IND16( exprraid ); diff -Nru mame-0.144/src/mame/includes/exterm.h mame-0.145/src/mame/includes/exterm.h --- mame-0.144/src/mame/includes/exterm.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/exterm.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ /*----------- defined in video/exterm.c -----------*/ PALETTE_INIT( exterm ); -void exterm_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void exterm_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); void exterm_to_shiftreg_master(address_space *space, UINT32 address, UINT16* shiftreg); void exterm_from_shiftreg_master(address_space *space, UINT32 address, UINT16* shiftreg); diff -Nru mame-0.144/src/mame/includes/exzisus.h mame-0.145/src/mame/includes/exzisus.h --- mame-0.144/src/mame/includes/exzisus.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/exzisus.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,6 +28,6 @@ WRITE8_HANDLER( exzisus_objectram_0_w ); WRITE8_HANDLER( exzisus_objectram_1_w ); -SCREEN_UPDATE( exzisus ); +SCREEN_UPDATE_IND16( exzisus ); diff -Nru mame-0.144/src/mame/includes/f1gp.h mame-0.145/src/mame/includes/f1gp.h --- mame-0.144/src/mame/includes/f1gp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/f1gp.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,6 +54,6 @@ VIDEO_START( f1gp ); VIDEO_START( f1gpb ); VIDEO_START( f1gp2 ); -SCREEN_UPDATE( f1gp ); -SCREEN_UPDATE( f1gpb ); -SCREEN_UPDATE( f1gp2 ); +SCREEN_UPDATE_IND16( f1gp ); +SCREEN_UPDATE_IND16( f1gpb ); +SCREEN_UPDATE_IND16( f1gp2 ); diff -Nru mame-0.144/src/mame/includes/fantland.h mame-0.145/src/mame/includes/fantland.h --- mame-0.144/src/mame/includes/fantland.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fantland.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ /*----------- defined in video/fantland.c -----------*/ -SCREEN_UPDATE( fantland ); +SCREEN_UPDATE_IND16( fantland ); diff -Nru mame-0.144/src/mame/includes/fastfred.h mame-0.145/src/mame/includes/fastfred.h --- mame-0.144/src/mame/includes/fastfred.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fastfred.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,6 +28,9 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; tilemap_t *m_web_tilemap; + + UINT8 m_nmi_mask; + UINT8 m_sound_nmi_mask; }; @@ -43,9 +46,9 @@ WRITE8_HANDLER( fastfred_colorbank2_w ); WRITE8_HANDLER( fastfred_flip_screen_x_w ); WRITE8_HANDLER( fastfred_flip_screen_y_w ); -SCREEN_UPDATE( fastfred ); +SCREEN_UPDATE_IND16( fastfred ); VIDEO_START( imago ); -SCREEN_UPDATE( imago ); +SCREEN_UPDATE_IND16( imago ); WRITE8_HANDLER( imago_fg_videoram_w ); WRITE8_HANDLER( imago_charbank_w ); diff -Nru mame-0.144/src/mame/includes/fastlane.h mame-0.145/src/mame/includes/fastlane.h --- mame-0.144/src/mame/includes/fastlane.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/fastlane.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,7 +8,9 @@ { public: fastlane_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* memory pointers */ UINT8 * m_videoram1; @@ -26,6 +28,8 @@ /* devices */ device_t *m_konami2; device_t *m_k007121; + + required_device m_maincpu; }; @@ -38,4 +42,4 @@ PALETTE_INIT( fastlane ); VIDEO_START( fastlane ); -SCREEN_UPDATE( fastlane ); +SCREEN_UPDATE_IND16( fastlane ); diff -Nru mame-0.144/src/mame/includes/fcombat.h mame-0.145/src/mame/includes/fcombat.h --- mame-0.144/src/mame/includes/fcombat.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fcombat.h 2012-02-06 21:30:44.000000000 +0000 @@ -57,6 +57,6 @@ PALETTE_INIT( fcombat ); VIDEO_START( fcombat ); -SCREEN_UPDATE( fcombat ); +SCREEN_UPDATE_IND16( fcombat ); WRITE8_HANDLER( fcombat_videoreg_w ); diff -Nru mame-0.144/src/mame/includes/fgoal.h mame-0.145/src/mame/includes/fgoal.h --- mame-0.144/src/mame/includes/fgoal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fgoal.h 2012-02-06 21:30:44.000000000 +0000 @@ -10,8 +10,8 @@ UINT8 * m_video_ram; /* video-related */ - bitmap_t *m_bgbitmap; - bitmap_t *m_fgbitmap; + bitmap_ind16 m_bgbitmap; + bitmap_ind16 m_fgbitmap; UINT8 m_xpos; UINT8 m_ypos; int m_current_color; @@ -31,7 +31,7 @@ /*----------- defined in video/fgoal.c -----------*/ VIDEO_START( fgoal ); -SCREEN_UPDATE( fgoal ); +SCREEN_UPDATE_IND16( fgoal ); WRITE8_HANDLER( fgoal_color_w ); WRITE8_HANDLER( fgoal_xpos_w ); diff -Nru mame-0.144/src/mame/includes/finalizr.h mame-0.145/src/mame/includes/finalizr.h --- mame-0.144/src/mame/includes/finalizr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/finalizr.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,4 +43,4 @@ PALETTE_INIT( finalizr ); VIDEO_START( finalizr ); -SCREEN_UPDATE( finalizr ); +SCREEN_UPDATE_IND16( finalizr ); diff -Nru mame-0.144/src/mame/includes/firetrap.h mame-0.145/src/mame/includes/firetrap.h --- mame-0.144/src/mame/includes/firetrap.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/firetrap.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,14 +27,13 @@ UINT8 m_scroll2_y[2]; /* misc */ - int m_irq_enable; + int m_sound_irq_enable; int m_nmi_enable; int m_i8751_return; int m_i8751_current_command; int m_i8751_init_ptr; int m_msm5205next; int m_adpcm_toggle; - int m_int_latch; int m_coin_command_pending; /* devices */ @@ -56,4 +55,4 @@ PALETTE_INIT( firetrap ); VIDEO_START( firetrap ); -SCREEN_UPDATE( firetrap ); +SCREEN_UPDATE_IND16( firetrap ); diff -Nru mame-0.144/src/mame/includes/firetrk.h mame-0.145/src/mame/includes/firetrk.h --- mame-0.144/src/mame/includes/firetrk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/firetrk.h 2012-02-06 21:30:44.000000000 +0000 @@ -53,8 +53,8 @@ UINT8 m_flash; UINT8 m_crash[2]; UINT8 m_skid[2]; - bitmap_t *m_helper1; - bitmap_t *m_helper2; + bitmap_ind16 m_helper1; + bitmap_ind16 m_helper2; UINT32 m_color1_mask; UINT32 m_color2_mask; tilemap_t *m_tilemap1; @@ -84,8 +84,8 @@ VIDEO_START( firetrk ); VIDEO_START( superbug ); VIDEO_START( montecar ); -SCREEN_UPDATE( firetrk ); -SCREEN_UPDATE( superbug ); -SCREEN_UPDATE( montecar ); +SCREEN_UPDATE_IND16( firetrk ); +SCREEN_UPDATE_IND16( superbug ); +SCREEN_UPDATE_IND16( montecar ); diff -Nru mame-0.144/src/mame/includes/fitfight.h mame-0.145/src/mame/includes/fitfight.h --- mame-0.144/src/mame/includes/fitfight.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fitfight.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ WRITE16_HANDLER( fof_txt_tileram_w ); VIDEO_START(fitfight); -SCREEN_UPDATE(fitfight); +SCREEN_UPDATE_IND16(fitfight); diff -Nru mame-0.144/src/mame/includes/flkatck.h mame-0.145/src/mame/includes/flkatck.h --- mame-0.144/src/mame/includes/flkatck.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/flkatck.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ WRITE8_HANDLER( flkatck_k007121_regs_w ); VIDEO_START( flkatck ); -SCREEN_UPDATE( flkatck ); +SCREEN_UPDATE_IND16( flkatck ); diff -Nru mame-0.144/src/mame/includes/flower.h mame-0.145/src/mame/includes/flower.h --- mame-0.144/src/mame/includes/flower.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/flower.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,6 +35,6 @@ WRITE8_HANDLER( flower_bg1ram_w ); WRITE8_HANDLER( flower_flipscreen_w ); -SCREEN_UPDATE( flower ); +SCREEN_UPDATE_IND16( flower ); VIDEO_START( flower ); PALETTE_INIT( flower ); diff -Nru mame-0.144/src/mame/includes/flstory.h mame-0.145/src/mame/includes/flstory.h --- mame-0.144/src/mame/includes/flstory.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/flstory.h 2012-02-06 21:30:44.000000000 +0000 @@ -92,11 +92,11 @@ /*----------- defined in video/flstory.c -----------*/ VIDEO_START( flstory ); -SCREEN_UPDATE( flstory ); +SCREEN_UPDATE_IND16( flstory ); VIDEO_START( victnine ); -SCREEN_UPDATE( victnine ); +SCREEN_UPDATE_IND16( victnine ); VIDEO_START( rumba ); -SCREEN_UPDATE( rumba ); +SCREEN_UPDATE_IND16( rumba ); WRITE8_HANDLER( flstory_videoram_w ); READ8_HANDLER( flstory_palette_r ); diff -Nru mame-0.144/src/mame/includes/foodf.h mame-0.145/src/mame/includes/foodf.h --- mame-0.144/src/mame/includes/foodf.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/foodf.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,4 +32,4 @@ void foodf_set_flip(foodf_state *state, int flip); VIDEO_START( foodf ); -SCREEN_UPDATE( foodf ); +SCREEN_UPDATE_IND16( foodf ); diff -Nru mame-0.144/src/mame/includes/freekick.h mame-0.145/src/mame/includes/freekick.h --- mame-0.144/src/mame/includes/freekick.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/freekick.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ /*----------- defined in video/freekick.c -----------*/ VIDEO_START(freekick); -SCREEN_UPDATE(gigas); -SCREEN_UPDATE(pbillrd); -SCREEN_UPDATE(freekick); +SCREEN_UPDATE_IND16(gigas); +SCREEN_UPDATE_IND16(pbillrd); +SCREEN_UPDATE_IND16(freekick); WRITE8_HANDLER( freek_videoram_w ); diff -Nru mame-0.144/src/mame/includes/fromanc2.h mame-0.145/src/mame/includes/fromanc2.h --- mame-0.144/src/mame/includes/fromanc2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fromanc2.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,7 +37,8 @@ /*----------- defined in video/fromanc2.c -----------*/ -SCREEN_UPDATE( fromanc2 ); +SCREEN_UPDATE_IND16( fromanc2_left ); +SCREEN_UPDATE_IND16( fromanc2_right ); VIDEO_START( fromanc2 ); VIDEO_START( fromancr ); VIDEO_START( fromanc4 ); diff -Nru mame-0.144/src/mame/includes/fromance.h mame-0.145/src/mame/includes/fromance.h --- mame-0.144/src/mame/includes/fromance.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/fromance.h 2012-02-06 21:30:44.000000000 +0000 @@ -60,8 +60,8 @@ VIDEO_START( nekkyoku ); VIDEO_START( pipedrm ); VIDEO_START( hatris ); -SCREEN_UPDATE( fromance ); -SCREEN_UPDATE( pipedrm ); +SCREEN_UPDATE_IND16( fromance ); +SCREEN_UPDATE_IND16( pipedrm ); WRITE8_HANDLER( fromance_crtc_data_w ); WRITE8_HANDLER( fromance_crtc_register_w ); diff -Nru mame-0.144/src/mame/includes/funkybee.h mame-0.145/src/mame/includes/funkybee.h --- mame-0.144/src/mame/includes/funkybee.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/funkybee.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ PALETTE_INIT( funkybee ); VIDEO_START( funkybee ); -SCREEN_UPDATE( funkybee ); +SCREEN_UPDATE_IND16( funkybee ); diff -Nru mame-0.144/src/mame/includes/funkyjet.h mame-0.145/src/mame/includes/funkyjet.h --- mame-0.144/src/mame/includes/funkyjet.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/funkyjet.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ /*----------- defined in video/funkyjet.c -----------*/ -SCREEN_UPDATE( funkyjet ); +SCREEN_UPDATE_IND16( funkyjet ); diff -Nru mame-0.144/src/mame/includes/funworld.h mame-0.145/src/mame/includes/funworld.h --- mame-0.144/src/mame/includes/funworld.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/funworld.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,4 +17,4 @@ PALETTE_INIT( funworld ); VIDEO_START( funworld ); VIDEO_START( magicrd2 ); -SCREEN_UPDATE( funworld ); +SCREEN_UPDATE_IND16( funworld ); diff -Nru mame-0.144/src/mame/includes/funybubl.h mame-0.145/src/mame/includes/funybubl.h --- mame-0.144/src/mame/includes/funybubl.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/funybubl.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,4 +23,4 @@ WRITE8_HANDLER ( funybubl_paldatawrite ); VIDEO_START(funybubl); -SCREEN_UPDATE(funybubl); +SCREEN_UPDATE_IND16(funybubl); diff -Nru mame-0.144/src/mame/includes/fuukifg2.h mame-0.145/src/mame/includes/fuukifg2.h --- mame-0.144/src/mame/includes/fuukifg2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/fuukifg2.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ WRITE16_HANDLER( fuuki16_vram_3_w ); VIDEO_START( fuuki16 ); -SCREEN_UPDATE( fuuki16 ); +SCREEN_UPDATE_IND16( fuuki16 ); diff -Nru mame-0.144/src/mame/includes/fuukifg3.h mame-0.145/src/mame/includes/fuukifg3.h --- mame-0.144/src/mame/includes/fuukifg3.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/fuukifg3.h 2012-02-06 21:30:44.000000000 +0000 @@ -48,5 +48,5 @@ WRITE32_HANDLER( fuuki32_vram_3_w ); VIDEO_START( fuuki32 ); -SCREEN_UPDATE( fuuki32 ); -SCREEN_EOF( fuuki32 ); +SCREEN_UPDATE_IND16( fuuki32 ); +SCREEN_VBLANK( fuuki32 ); diff -Nru mame-0.144/src/mame/includes/gaelco2.h mame-0.145/src/mame/includes/gaelco2.h --- mame-0.144/src/mame/includes/gaelco2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gaelco2.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: gaelco2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_snowboar_protection; UINT16 *m_vregs; @@ -11,6 +13,8 @@ UINT16 *m_videoram; tilemap_t *m_pant[2]; int m_dual_monitor; + + required_device m_maincpu; }; @@ -25,7 +29,7 @@ WRITE16_HANDLER( wrally2_coin_w ); WRITE16_HANDLER( touchgo_coin_w ); WRITE16_HANDLER( bang_clr_gun_int_w ); -INTERRUPT_GEN( bang_interrupt ); +TIMER_DEVICE_CALLBACK( bang_irq ); CUSTOM_INPUT( wrally2_analog_bit_r ); WRITE16_HANDLER( wrally2_adc_clk ); WRITE16_HANDLER( wrally2_adc_cs ); @@ -39,8 +43,9 @@ WRITE16_HANDLER( gaelco2_vram_w ); WRITE16_HANDLER( gaelco2_palette_w ); -SCREEN_UPDATE( gaelco2 ); -SCREEN_EOF( gaelco2 ); +SCREEN_UPDATE_IND16( gaelco2 ); +SCREEN_VBLANK( gaelco2 ); VIDEO_START( gaelco2 ); -SCREEN_UPDATE( gaelco2_dual ); +SCREEN_UPDATE_IND16( gaelco2_left ); +SCREEN_UPDATE_IND16( gaelco2_right ); VIDEO_START( gaelco2_dual ); diff -Nru mame-0.144/src/mame/includes/gaelco3d.h mame-0.145/src/mame/includes/gaelco3d.h --- mame-0.144/src/mame/includes/gaelco3d.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gaelco3d.h 2012-02-06 21:30:44.000000000 +0000 @@ -7,10 +7,46 @@ **************************************************************************/ #include "sound/dmadac.h" -#include "video/poly.h" +#include "video/polynew.h" #define SOUND_CHANNELS 4 +struct gaelco3d_object_data +{ + UINT32 tex, color; + float ooz_dx, ooz_dy, ooz_base; + float uoz_dx, uoz_dy, uoz_base; + float voz_dx, voz_dy, voz_base; + float z0; +}; + +class gaelco3d_state; + +class gaelco3d_renderer : public poly_manager +{ +public: + gaelco3d_renderer(gaelco3d_state &state); + + bitmap_ind16 &screenbits() { return m_screenbits; } + UINT32 polygons() { UINT32 result = m_polygons; m_polygons = 0; return result; } + + void render_poly(screen_device &screen, UINT32 *polydata); + +private: + gaelco3d_state &m_state; + bitmap_ind16 m_screenbits; + bitmap_ind16 m_zbuffer; + UINT32 m_polygons; + offs_t m_texture_size; + offs_t m_texmask_size; + UINT8 *m_texture; + UINT8 *m_texmask; + + void render_noz_noperspective(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &extra, int threadid); + void render_normal(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &extra, int threadid); + void render_alphablend(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &extra, int threadid); +}; + class gaelco3d_state : public driver_device { public: @@ -33,19 +69,12 @@ offs_t m_adsp_incs; offs_t m_adsp_size; dmadac_sound_device *m_dmadac[SOUND_CHANNELS]; - UINT8 *m_texture; - UINT8 *m_texmask; - offs_t m_texture_size; - offs_t m_texmask_size; - bitmap_t *m_screenbits; - bitmap_t *m_zbuffer; rgb_t *m_palette; UINT32 *m_polydata_buffer; UINT32 m_polydata_count; - int m_polygons; int m_lastscan; int m_video_changed; - poly_manager *m_poly; + gaelco3d_renderer *m_poly; }; @@ -58,4 +87,4 @@ WRITE32_HANDLER( gaelco3d_paletteram_020_w ); VIDEO_START( gaelco3d ); -SCREEN_UPDATE( gaelco3d ); +SCREEN_UPDATE_IND16( gaelco3d ); diff -Nru mame-0.144/src/mame/includes/gaelco.h mame-0.145/src/mame/includes/gaelco.h --- mame-0.144/src/mame/includes/gaelco.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gaelco.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,5 +33,5 @@ VIDEO_START( bigkarnk ); VIDEO_START( maniacsq ); -SCREEN_UPDATE( bigkarnk ); -SCREEN_UPDATE( maniacsq ); +SCREEN_UPDATE_IND16( bigkarnk ); +SCREEN_UPDATE_IND16( maniacsq ); diff -Nru mame-0.144/src/mame/includes/gaiden.h mame-0.145/src/mame/includes/gaiden.h --- mame-0.144/src/mame/includes/gaiden.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gaiden.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,9 +21,9 @@ tilemap_t *m_text_layer; tilemap_t *m_foreground; tilemap_t *m_background; - bitmap_t *m_sprite_bitmap; - bitmap_t *m_tile_bitmap_bg; - bitmap_t *m_tile_bitmap_fg; + bitmap_ind16 m_sprite_bitmap; + bitmap_ind16 m_tile_bitmap_bg; + bitmap_ind16 m_tile_bitmap_fg; UINT16 m_tx_scroll_x; UINT16 m_tx_scroll_y; UINT16 m_bg_scroll_x; @@ -53,9 +53,9 @@ VIDEO_START( drgnbowl ); VIDEO_START( mastninj ); -SCREEN_UPDATE( gaiden ); -SCREEN_UPDATE( raiga ); -SCREEN_UPDATE( drgnbowl ); +SCREEN_UPDATE_RGB32( gaiden ); +SCREEN_UPDATE_RGB32( raiga ); +SCREEN_UPDATE_IND16( drgnbowl ); WRITE16_HANDLER( gaiden_videoram_w ); WRITE16_HANDLER( gaiden_videoram2_w ); diff -Nru mame-0.144/src/mame/includes/galaga.h mame-0.145/src/mame/includes/galaga.h --- mame-0.144/src/mame/includes/galaga.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galaga.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,6 +28,10 @@ UINT8 *m_videoram; tilemap_t *m_fg_tilemap; tilemap_t *m_bg_tilemap; + + UINT8 m_main_irq_mask; + UINT8 m_sub_irq_mask; + UINT8 m_sub2_nmi_mask; }; class xevious_state : public galaga_state @@ -88,9 +92,9 @@ WRITE8_HANDLER( bosco_scrolly_w ); WRITE8_HANDLER( bosco_starclr_w ); VIDEO_START( bosco ); -SCREEN_UPDATE( bosco ); +SCREEN_UPDATE_IND16( bosco ); PALETTE_INIT( bosco ); -SCREEN_EOF( bosco ); /* update starfield */ +SCREEN_VBLANK( bosco ); /* update starfield */ /*----------- defined in audio/galaga.c -----------*/ @@ -112,8 +116,8 @@ WRITE8_HANDLER( galaga_videoram_w ); WRITE8_HANDLER( gatsbee_bank_w ); VIDEO_START( galaga ); -SCREEN_UPDATE( galaga ); -SCREEN_EOF( galaga ); /* update starfield */ +SCREEN_UPDATE_IND16( galaga ); +SCREEN_VBLANK( galaga ); /* update starfield */ /*----------- defined in video/xevious.c -----------*/ @@ -126,7 +130,7 @@ READ8_HANDLER( xevious_bb_r ); VIDEO_START( xevious ); PALETTE_INIT( xevious ); -SCREEN_UPDATE( xevious ); +SCREEN_UPDATE_IND16( xevious ); PALETTE_INIT( battles ); @@ -155,5 +159,5 @@ WRITE8_HANDLER( digdug_videoram_w ); WRITE8_HANDLER( digdug_PORT_w ); VIDEO_START( digdug ); -SCREEN_UPDATE( digdug ); +SCREEN_UPDATE_IND16( digdug ); PALETTE_INIT( digdug ); diff -Nru mame-0.144/src/mame/includes/galastrm.h mame-0.145/src/mame/includes/galastrm.h --- mame-0.144/src/mame/includes/galastrm.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/galastrm.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,8 +26,8 @@ INT16 m_tc0610_ctrl_reg[2][8]; struct tempsprite *m_spritelist; struct tempsprite *m_sprite_ptr_pre; - bitmap_t *m_tmpbitmaps; - bitmap_t *m_polybitmap; + bitmap_ind16 m_tmpbitmaps; + bitmap_ind16 m_polybitmap; poly_manager *m_poly; int m_rsxb; int m_rsyb; @@ -41,4 +41,4 @@ /*----------- defined in video/galastrm.c -----------*/ VIDEO_START( galastrm ); -SCREEN_UPDATE( galastrm ); +SCREEN_UPDATE_IND16( galastrm ); diff -Nru mame-0.144/src/mame/includes/galaxian.h mame-0.145/src/mame/includes/galaxian.h --- mame-0.144/src/mame/includes/galaxian.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galaxian.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,8 +28,8 @@ /* video extension callbacks */ typedef void (*galaxian_extend_tile_info_func)(running_machine &machine, UINT16 *code, UINT8 *color, UINT8 attrib, UINT8 x); typedef void (*galaxian_extend_sprite_info_func)(running_machine &machine, const UINT8 *base, UINT8 *sx, UINT8 *sy, UINT8 *flipx, UINT8 *flipy, UINT16 *code, UINT8 *color); -typedef void (*galaxian_draw_bullet_func)(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -typedef void (*galaxian_draw_background_func)(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +typedef void (*galaxian_draw_bullet_func)(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y); +typedef void (*galaxian_draw_background_func)(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); class galaxian_state : public driver_device @@ -84,8 +84,8 @@ PALETTE_INIT( moonwar ); VIDEO_START( galaxian ); -SCREEN_UPDATE( galaxian ); -SCREEN_UPDATE( zigzag ); +SCREEN_UPDATE_RGB32( galaxian ); +SCREEN_UPDATE_RGB32( zigzag ); WRITE8_HANDLER( galaxian_videoram_w ); WRITE8_HANDLER( galaxian_objram_w ); @@ -105,19 +105,19 @@ TIMER_DEVICE_CALLBACK( galaxian_stars_blink_timer ); /* special purpose background rendering */ -void galaxian_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -void frogger_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -//void amidar_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -void turtles_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -void scramble_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -void anteater_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -void jumpbug_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +void galaxian_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +void frogger_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +//void amidar_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +void turtles_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +void scramble_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +void anteater_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); +void jumpbug_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); /* special purpose bullet rendering */ -void galaxian_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -void mshuttle_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -void scramble_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -void theend_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); +void galaxian_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y); +void mshuttle_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y); +void scramble_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y); +void theend_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y); /* generic extensions */ void upper_extend_tile_info(running_machine &machine, UINT16 *code, UINT8 *color, UINT8 attrib, UINT8 x); diff -Nru mame-0.144/src/mame/includes/galaxold.h mame-0.145/src/mame/includes/galaxold.h --- mame-0.144/src/mame/includes/galaxold.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galaxold.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,17 +52,16 @@ void (*m_modify_spritecode)(running_machine &machine, UINT8 *spriteram, int*, int*, int*, int); /* function to call to do sprite banking */ void (*m_modify_color)(UINT8 *color); /* function to call to do modify how the color codes map to the PROM */ void (*m_modify_ypos)(UINT8*); /* function to call to do modify how vertical positioning bits are connected */ - void (*m_tilemap_set_scroll)( tilemap_t *, int col, int value ); UINT8 m_timer_adjusted; UINT8 m_darkplnt_bullet_color; - void (*m_draw_bullets)(running_machine &,bitmap_t *,const rectangle *, int, int, int); /* function to call to draw a bullet */ + void (*m_draw_bullets)(running_machine &,bitmap_ind16 &,const rectangle &, int, int, int); /* function to call to draw a bullet */ UINT8 m_background_enable; UINT8 m_background_red; UINT8 m_background_green; UINT8 m_background_blue; - void (*m_draw_background)(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); /* function to call to draw the background */ + void (*m_draw_background)(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); /* function to call to draw the background */ UINT16 m_rockclim_v; UINT16 m_rockclim_h; int m_dambustr_bg_split_line; @@ -70,9 +69,9 @@ int m_dambustr_bg_color_2; int m_dambustr_bg_priority; int m_dambustr_char_bank; - bitmap_t *m_dambustr_tmpbitmap; + bitmap_ind16 *m_dambustr_tmpbitmap; - void (*m_draw_stars)(running_machine &machine, bitmap_t *, const rectangle *); /* function to call to draw the star layer */ + void (*m_draw_stars)(running_machine &machine, bitmap_ind16 &, const rectangle &); /* function to call to draw the star layer */ int m_stars_colors_start; INT32 m_stars_scrollpos; UINT8 m_stars_on; @@ -80,6 +79,8 @@ emu_timer *m_stars_blink_timer; emu_timer *m_stars_scroll_timer; struct star m_stars[STAR_COUNT]; + + UINT8 m_nmi_mask; /* Harem per-game specific */ }; @@ -140,10 +141,10 @@ VIDEO_START( ad2083 ); void galaxold_init_stars(running_machine &machine, int colors_offset); -void galaxold_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +void galaxold_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); -SCREEN_UPDATE( galaxold ); -SCREEN_UPDATE( dambustr ); +SCREEN_UPDATE_IND16( galaxold ); +SCREEN_UPDATE_IND16( dambustr ); WRITE8_HANDLER( galaxold_gfxbank_w ); WRITE8_HANDLER( galaxold_flip_screen_x_w ); diff -Nru mame-0.144/src/mame/includes/galivan.h mame-0.145/src/mame/includes/galivan.h --- mame-0.144/src/mame/includes/galivan.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galivan.h 2012-02-06 21:30:44.000000000 +0000 @@ -48,5 +48,5 @@ VIDEO_START( galivan ); VIDEO_START( ninjemak ); -SCREEN_UPDATE( galivan ); -SCREEN_UPDATE( ninjemak ); +SCREEN_UPDATE_IND16( galivan ); +SCREEN_UPDATE_IND16( ninjemak ); diff -Nru mame-0.144/src/mame/includes/galpani2.h mame-0.145/src/mame/includes/galpani2.h --- mame-0.144/src/mame/includes/galpani2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galpani2.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,7 +4,10 @@ { public: galpani2_state(const machine_config &mconfig, device_type type, const char *tag) - : kaneko16_state(mconfig, type, tag) { } + : kaneko16_state(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_subcpu(*this,"sub") + { } UINT16 *m_bg8[2]; UINT16 *m_palette[2]; @@ -17,8 +20,11 @@ UINT16 m_old_mcu_nmi1; UINT16 m_old_mcu_nmi2; UINT16 *m_rombank; - bitmap_t *m_bg8_bitmap[2]; - bitmap_t *m_bg15_bitmap; + bitmap_ind16 *m_bg8_bitmap[2]; + bitmap_ind16 *m_bg15_bitmap; + + required_device m_maincpu; + required_device m_subcpu; }; @@ -26,7 +32,7 @@ PALETTE_INIT( galpani2 ); VIDEO_START( galpani2 ); -SCREEN_UPDATE( galpani2 ); +SCREEN_UPDATE_IND16( galpani2 ); WRITE16_HANDLER( galpani2_palette_0_w ); WRITE16_HANDLER( galpani2_palette_1_w ); diff -Nru mame-0.144/src/mame/includes/galpanic.h mame-0.145/src/mame/includes/galpanic.h --- mame-0.144/src/mame/includes/galpanic.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/galpanic.h 2012-02-06 21:30:44.000000000 +0000 @@ -9,7 +9,8 @@ UINT16 *m_bgvideoram; UINT16 *m_fgvideoram; size_t m_fgvideoram_size; - bitmap_t *m_sprites_bitmap; + bitmap_ind16 m_bitmap; + bitmap_ind16 m_sprites_bitmap; UINT16 *m_spriteram; size_t m_spriteram_size; }; @@ -21,7 +22,7 @@ WRITE16_HANDLER( galpanic_bgvideoram_w ); WRITE16_HANDLER( galpanic_paletteram_w ); VIDEO_START( galpanic ); -SCREEN_UPDATE( galpanic ); -SCREEN_UPDATE( comad ); +SCREEN_UPDATE_IND16( galpanic ); +SCREEN_UPDATE_IND16( comad ); diff -Nru mame-0.144/src/mame/includes/galspnbl.h mame-0.145/src/mame/includes/galspnbl.h --- mame-0.144/src/mame/includes/galspnbl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/galspnbl.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ PALETTE_INIT( galspnbl ); -SCREEN_UPDATE( galspnbl ); +SCREEN_UPDATE_IND16( galspnbl ); diff -Nru mame-0.144/src/mame/includes/gaplus.h mame-0.145/src/mame/includes/gaplus.h --- mame-0.144/src/mame/includes/gaplus.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gaplus.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,6 +19,9 @@ UINT8 m_starfield_control[4]; int m_total_stars; struct star m_stars[MAX_STARS]; + UINT8 m_main_irq_mask; + UINT8 m_sub_irq_mask; + UINT8 m_sub2_irq_mask; }; @@ -35,5 +38,5 @@ WRITE8_HANDLER( gaplus_starfield_control_w ); VIDEO_START( gaplus ); PALETTE_INIT( gaplus ); -SCREEN_UPDATE( gaplus ); -SCREEN_EOF( gaplus ); /* update starfields */ +SCREEN_UPDATE_IND16( gaplus ); +SCREEN_VBLANK( gaplus ); /* update starfields */ diff -Nru mame-0.144/src/mame/includes/gatron.h mame-0.145/src/mame/includes/gatron.h --- mame-0.144/src/mame/includes/gatron.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gatron.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,5 +14,5 @@ WRITE8_HANDLER( gat_videoram_w ); PALETTE_INIT( gat ); VIDEO_START( gat ); -SCREEN_UPDATE( gat ); +SCREEN_UPDATE_IND16( gat ); diff -Nru mame-0.144/src/mame/includes/gauntlet.h mame-0.145/src/mame/includes/gauntlet.h --- mame-0.144/src/mame/includes/gauntlet.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gauntlet.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,4 +25,4 @@ WRITE16_HANDLER( gauntlet_yscroll_w ); VIDEO_START( gauntlet ); -SCREEN_UPDATE( gauntlet ); +SCREEN_UPDATE_IND16( gauntlet ); diff -Nru mame-0.144/src/mame/includes/gberet.h mame-0.145/src/mame/includes/gberet.h --- mame-0.144/src/mame/includes/gberet.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gberet.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,12 +19,13 @@ size_t m_spriteram_size; /* video-related */ - tilemap_t *m_bg_tilemap; + tilemap_t * m_bg_tilemap; UINT8 m_spritebank; /* misc */ - UINT8 m_nmi_enable; - UINT8 m_irq_enable; + UINT8 * m_soundlatch; + UINT8 m_interrupt_mask; + UINT8 m_interrupt_ticks; }; @@ -38,5 +39,5 @@ PALETTE_INIT( gberet ); VIDEO_START( gberet ); -SCREEN_UPDATE( gberet ); -SCREEN_UPDATE( gberetb ); +SCREEN_UPDATE_IND16( gberet ); +SCREEN_UPDATE_IND16( gberetb ); diff -Nru mame-0.144/src/mame/includes/gbusters.h mame-0.145/src/mame/includes/gbusters.h --- mame-0.144/src/mame/includes/gbusters.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gbusters.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ extern void gbusters_sprite_callback(running_machine &machine, int *code,int *color,int *priority,int *shadow); VIDEO_START( gbusters ); -SCREEN_UPDATE( gbusters ); +SCREEN_UPDATE_IND16( gbusters ); diff -Nru mame-0.144/src/mame/includes/gcpinbal.h mame-0.145/src/mame/includes/gcpinbal.h --- mame-0.144/src/mame/includes/gcpinbal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gcpinbal.h 2012-02-06 21:30:44.000000000 +0000 @@ -48,7 +48,7 @@ /*----------- defined in video/gcpinbal.c -----------*/ VIDEO_START( gcpinbal ); -SCREEN_UPDATE( gcpinbal ); +SCREEN_UPDATE_IND16( gcpinbal ); READ16_HANDLER ( gcpinbal_tilemaps_word_r ); WRITE16_HANDLER( gcpinbal_tilemaps_word_w ); diff -Nru mame-0.144/src/mame/includes/genesis.h mame-0.145/src/mame/includes/genesis.h --- mame-0.144/src/mame/includes/genesis.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/genesis.h 2012-02-06 21:30:44.000000000 +0000 @@ -7,7 +7,7 @@ extern UINT8 genesis_vdp_regs[32]; void system18_vdp_start(running_machine &machine); -void system18_vdp_update(bitmap_t *bitmap, const rectangle *cliprect); +void system18_vdp_update(bitmap_ind16 &bitmap, const rectangle &cliprect); READ16_HANDLER ( genesis_vdp_r ); WRITE16_HANDLER( genesis_vdp_w ); diff -Nru mame-0.144/src/mame/includes/gijoe.h mame-0.145/src/mame/includes/gijoe.h --- mame-0.144/src/mame/includes/gijoe.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gijoe.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ extern void gijoe_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); VIDEO_START( gijoe ); -SCREEN_UPDATE( gijoe ); +SCREEN_UPDATE_IND16( gijoe ); diff -Nru mame-0.144/src/mame/includes/ginganin.h mame-0.145/src/mame/includes/ginganin.h --- mame-0.144/src/mame/includes/ginganin.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ginganin.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ WRITE16_HANDLER( ginganin_vregs16_w ); VIDEO_START( ginganin ); -SCREEN_UPDATE( ginganin ); +SCREEN_UPDATE_IND16( ginganin ); diff -Nru mame-0.144/src/mame/includes/gladiatr.h mame-0.145/src/mame/includes/gladiatr.h --- mame-0.144/src/mame/includes/gladiatr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gladiatr.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,6 +38,6 @@ WRITE8_HANDLER( gladiatr_spritebuffer_w ); WRITE8_HANDLER( gladiatr_spritebank_w ); VIDEO_START( ppking ); -SCREEN_UPDATE( ppking ); +SCREEN_UPDATE_IND16( ppking ); VIDEO_START( gladiatr ); -SCREEN_UPDATE( gladiatr ); +SCREEN_UPDATE_IND16( gladiatr ); diff -Nru mame-0.144/src/mame/includes/glass.h mame-0.145/src/mame/includes/glass.h --- mame-0.144/src/mame/includes/glass.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/glass.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,7 +18,7 @@ /* video-related */ tilemap_t *m_pant[2]; - bitmap_t *m_screen_bitmap; + bitmap_ind16 *m_screen_bitmap; /* misc */ int m_current_bit; @@ -34,4 +34,4 @@ WRITE16_HANDLER( glass_blitter_w ); VIDEO_START( glass ); -SCREEN_UPDATE( glass ); +SCREEN_UPDATE_IND16( glass ); diff -Nru mame-0.144/src/mame/includes/gng.h mame-0.145/src/mame/includes/gng.h --- mame-0.144/src/mame/includes/gng.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gng.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,5 +34,5 @@ WRITE8_HANDLER( gng_flipscreen_w ); VIDEO_START( gng ); -SCREEN_UPDATE( gng ); -SCREEN_EOF( gng ); +SCREEN_UPDATE_IND16( gng ); +SCREEN_VBLANK( gng ); diff -Nru mame-0.144/src/mame/includes/goal92.h mame-0.145/src/mame/includes/goal92.h --- mame-0.144/src/mame/includes/goal92.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/goal92.h 2012-02-06 21:30:44.000000000 +0000 @@ -46,5 +46,5 @@ READ16_HANDLER( goal92_fg_bank_r ); VIDEO_START( goal92 ); -SCREEN_UPDATE( goal92 ); -SCREEN_EOF( goal92 ); +SCREEN_UPDATE_IND16( goal92 ); +SCREEN_VBLANK( goal92 ); diff -Nru mame-0.144/src/mame/includes/goindol.h mame-0.145/src/mame/includes/goindol.h --- mame-0.144/src/mame/includes/goindol.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/goindol.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,4 +39,4 @@ WRITE8_HANDLER( goindol_bg_videoram_w ); VIDEO_START( goindol ); -SCREEN_UPDATE( goindol ); +SCREEN_UPDATE_IND16( goindol ); diff -Nru mame-0.144/src/mame/includes/goldstar.h mame-0.145/src/mame/includes/goldstar.h --- mame-0.144/src/mame/includes/goldstar.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/goldstar.h 2012-02-06 21:30:44.000000000 +0000 @@ -62,9 +62,9 @@ VIDEO_START( cherrym ); VIDEO_START( unkch ); VIDEO_START( magical ); -SCREEN_UPDATE( goldstar ); -SCREEN_UPDATE( bingowng ); -SCREEN_UPDATE( cmast91 ); -SCREEN_UPDATE( amcoe1a ); -SCREEN_UPDATE( unkch ); -SCREEN_UPDATE( magical ); +SCREEN_UPDATE_IND16( goldstar ); +SCREEN_UPDATE_IND16( bingowng ); +SCREEN_UPDATE_IND16( cmast91 ); +SCREEN_UPDATE_IND16( amcoe1a ); +SCREEN_UPDATE_IND16( unkch ); +SCREEN_UPDATE_IND16( magical ); diff -Nru mame-0.144/src/mame/includes/gomoku.h mame-0.145/src/mame/includes/gomoku.h --- mame-0.144/src/mame/includes/gomoku.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gomoku.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,7 +12,7 @@ int m_flipscreen; int m_bg_dispsw; tilemap_t *m_fg_tilemap; - bitmap_t *m_bg_bitmap; + bitmap_ind16 m_bg_bitmap; }; @@ -28,7 +28,7 @@ PALETTE_INIT( gomoku ); VIDEO_START( gomoku ); -SCREEN_UPDATE( gomoku ); +SCREEN_UPDATE_IND16( gomoku ); WRITE8_HANDLER( gomoku_videoram_w ); WRITE8_HANDLER( gomoku_colorram_w ); diff -Nru mame-0.144/src/mame/includes/gotcha.h mame-0.145/src/mame/includes/gotcha.h --- mame-0.144/src/mame/includes/gotcha.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gotcha.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,7 +33,7 @@ VIDEO_START( gotcha ); -SCREEN_UPDATE( gotcha ); +SCREEN_UPDATE_IND16( gotcha ); WRITE16_HANDLER( gotcha_fgvideoram_w ); WRITE16_HANDLER( gotcha_bgvideoram_w ); diff -Nru mame-0.144/src/mame/includes/gottlieb.h mame-0.145/src/mame/includes/gottlieb.h --- mame-0.144/src/mame/includes/gottlieb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gottlieb.h 2012-02-06 21:30:44.000000000 +0000 @@ -5,6 +5,7 @@ ***************************************************************************/ #include "machine/6532riot.h" +#include "machine/ldpr8210.h" #define GOTTLIEB_VIDEO_HCOUNT 318 @@ -17,7 +18,8 @@ { public: gottlieb_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_laserdisc(*this, "laserdisc") { } UINT8 *m_videoram; UINT8 m_votrax_queue[100]; @@ -29,13 +31,14 @@ UINT8 m_last_command; UINT8 *m_dac_data; UINT8 *m_psg_latch; + UINT8 m_psg_data_latch; UINT8 *m_sp0250_latch; int m_score_sample; int m_random_offset; int m_last; UINT8 m_joystick_select; UINT8 m_track[2]; - device_t *m_laserdisc; + optional_device m_laserdisc; emu_timer *m_laserdisc_bit_timer; emu_timer *m_laserdisc_philips_timer; UINT8 m_laserdisc_select; @@ -67,6 +70,7 @@ MACHINE_CONFIG_EXTERN( gottlieb_soundrev1 ); MACHINE_CONFIG_EXTERN( gottlieb_soundrev2 ); +MACHINE_CONFIG_EXTERN( gottlieb_cobram3_soundrev2 ); INPUT_PORTS_EXTERN( gottlieb1_sound ); INPUT_PORTS_EXTERN( gottlieb2_sound ); @@ -82,4 +86,4 @@ VIDEO_START( gottlieb ); VIDEO_START( screwloo ); -SCREEN_UPDATE( gottlieb ); +SCREEN_UPDATE_RGB32( gottlieb ); diff -Nru mame-0.144/src/mame/includes/gotya.h mame-0.145/src/mame/includes/gotya.h --- mame-0.144/src/mame/includes/gotya.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gotya.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( gotya ); VIDEO_START( gotya ); -SCREEN_UPDATE( gotya ); +SCREEN_UPDATE_IND16( gotya ); diff -Nru mame-0.144/src/mame/includes/gradius3.h mame-0.145/src/mame/includes/gradius3.h --- mame-0.144/src/mame/includes/gradius3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gradius3.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ WRITE16_HANDLER( gradius3_gfxram_w ); VIDEO_START( gradius3 ); -SCREEN_UPDATE( gradius3 ); +SCREEN_UPDATE_IND16( gradius3 ); diff -Nru mame-0.144/src/mame/includes/grchamp.h mame-0.145/src/mame/includes/grchamp.h --- mame-0.144/src/mame/includes/grchamp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/grchamp.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,7 +32,7 @@ UINT8 * m_rightram; UINT8 * m_spriteram; - bitmap_t * m_work_bitmap; + bitmap_ind16 m_work_bitmap; tilemap_t * m_text_tilemap; tilemap_t * m_left_tilemap; tilemap_t * m_center_tilemap; @@ -60,7 +60,7 @@ PALETTE_INIT( grchamp ); VIDEO_START( grchamp ); -SCREEN_UPDATE( grchamp ); +SCREEN_UPDATE_RGB32( grchamp ); WRITE8_HANDLER( grchamp_left_w ); WRITE8_HANDLER( grchamp_center_w ); WRITE8_HANDLER( grchamp_right_w ); diff -Nru mame-0.144/src/mame/includes/gridlee.h mame-0.145/src/mame/includes/gridlee.h --- mame-0.144/src/mame/includes/gridlee.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gridlee.h 2012-02-06 21:30:44.000000000 +0000 @@ -56,7 +56,7 @@ PALETTE_INIT( gridlee ); VIDEO_START( gridlee ); -SCREEN_UPDATE( gridlee ); +SCREEN_UPDATE_IND16( gridlee ); WRITE8_HANDLER( gridlee_cocktail_flip_w ); WRITE8_HANDLER( gridlee_videoram_w ); diff -Nru mame-0.144/src/mame/includes/groundfx.h mame-0.145/src/mame/includes/groundfx.h --- mame-0.144/src/mame/includes/groundfx.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/groundfx.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ /*----------- defined in video/groundfx.c -----------*/ VIDEO_START( groundfx ); -SCREEN_UPDATE( groundfx ); +SCREEN_UPDATE_IND16( groundfx ); diff -Nru mame-0.144/src/mame/includes/gstriker.h mame-0.145/src/mame/includes/gstriker.h --- mame-0.144/src/mame/includes/gstriker.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gstriker.h 2012-02-06 21:30:44.000000000 +0000 @@ -73,7 +73,7 @@ WRITE16_HANDLER( MB60553_0_vram_w ); WRITE16_HANDLER( MB60553_1_vram_w ); -SCREEN_UPDATE( gstriker ); +SCREEN_UPDATE_IND16( gstriker ); VIDEO_START( gstriker ); VIDEO_START( twrldc94 ); VIDEO_START( vgoalsoc ); diff -Nru mame-0.144/src/mame/includes/gsword.h mame-0.145/src/mame/includes/gsword.h --- mame-0.144/src/mame/includes/gsword.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gsword.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,4 +32,4 @@ PALETTE_INIT( josvolly ); PALETTE_INIT( gsword ); VIDEO_START( gsword ); -SCREEN_UPDATE( gsword ); +SCREEN_UPDATE_IND16( gsword ); diff -Nru mame-0.144/src/mame/includes/gumbo.h mame-0.145/src/mame/includes/gumbo.h --- mame-0.144/src/mame/includes/gumbo.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gumbo.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ WRITE16_HANDLER( gumbo_fg_videoram_w ); VIDEO_START( gumbo ); -SCREEN_UPDATE( gumbo ); +SCREEN_UPDATE_IND16( gumbo ); diff -Nru mame-0.144/src/mame/includes/gunbustr.h mame-0.145/src/mame/includes/gunbustr.h --- mame-0.144/src/mame/includes/gunbustr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/gunbustr.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ /*----------- defined in video/gunbustr.c -----------*/ VIDEO_START( gunbustr ); -SCREEN_UPDATE( gunbustr ); +SCREEN_UPDATE_IND16( gunbustr ); diff -Nru mame-0.144/src/mame/includes/gundealr.h mame-0.145/src/mame/includes/gundealr.h --- mame-0.144/src/mame/includes/gundealr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gundealr.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,5 +37,5 @@ WRITE8_HANDLER( yamyam_fg_scroll_w ); WRITE8_HANDLER( gundealr_flipscreen_w ); -SCREEN_UPDATE( gundealr ); +SCREEN_UPDATE_IND16( gundealr ); VIDEO_START( gundealr ); diff -Nru mame-0.144/src/mame/includes/gunsmoke.h mame-0.145/src/mame/includes/gunsmoke.h --- mame-0.144/src/mame/includes/gunsmoke.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gunsmoke.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,5 +37,5 @@ PALETTE_INIT( gunsmoke ); VIDEO_START( gunsmoke ); -SCREEN_UPDATE( gunsmoke ); +SCREEN_UPDATE_IND16( gunsmoke ); diff -Nru mame-0.144/src/mame/includes/gyruss.h mame-0.145/src/mame/includes/gyruss.h --- mame-0.144/src/mame/includes/gyruss.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/gyruss.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,6 +22,9 @@ /* devices */ cpu_device *m_audiocpu; cpu_device *m_audiocpu_2; + + UINT8 m_master_nmi_mask; + UINT8 m_slave_irq_mask; }; @@ -32,4 +35,4 @@ PALETTE_INIT( gyruss ); VIDEO_START( gyruss ); -SCREEN_UPDATE( gyruss ); +SCREEN_UPDATE_IND16( gyruss ); diff -Nru mame-0.144/src/mame/includes/hanaawas.h mame-0.145/src/mame/includes/hanaawas.h --- mame-0.144/src/mame/includes/hanaawas.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hanaawas.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,4 +30,4 @@ PALETTE_INIT( hanaawas ); VIDEO_START( hanaawas ); -SCREEN_UPDATE( hanaawas ); +SCREEN_UPDATE_IND16( hanaawas ); diff -Nru mame-0.144/src/mame/includes/harddriv.h mame-0.145/src/mame/includes/harddriv.h --- mame-0.144/src/mame/includes/harddriv.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/harddriv.h 2012-02-06 21:30:44.000000000 +0000 @@ -357,5 +357,5 @@ READ16_HANDLER( hdgsp_paletteram_hi_r ); WRITE16_HANDLER( hdgsp_paletteram_hi_w ); -void harddriv_scanline_driver(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); -void harddriv_scanline_multisync(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void harddriv_scanline_driver(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); +void harddriv_scanline_multisync(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); diff -Nru mame-0.144/src/mame/includes/hcastle.h mame-0.145/src/mame/includes/hcastle.h --- mame-0.144/src/mame/includes/hcastle.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hcastle.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,5 +43,5 @@ WRITE8_HANDLER( hcastle_pf2_control_w ); PALETTE_INIT( hcastle ); -SCREEN_UPDATE( hcastle ); +SCREEN_UPDATE_IND16( hcastle ); VIDEO_START( hcastle ); diff -Nru mame-0.144/src/mame/includes/hexion.h mame-0.145/src/mame/includes/hexion.h --- mame-0.144/src/mame/includes/hexion.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hexion.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ /*----------- defined in video/hexion.c -----------*/ VIDEO_START( hexion ); -SCREEN_UPDATE( hexion ); +SCREEN_UPDATE_IND16( hexion ); WRITE8_HANDLER( hexion_bankswitch_w ); READ8_HANDLER( hexion_bankedram_r ); diff -Nru mame-0.144/src/mame/includes/higemaru.h mame-0.145/src/mame/includes/higemaru.h --- mame-0.144/src/mame/includes/higemaru.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/higemaru.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ PALETTE_INIT( higemaru ); VIDEO_START( higemaru ); -SCREEN_UPDATE( higemaru ); +SCREEN_UPDATE_IND16( higemaru ); diff -Nru mame-0.144/src/mame/includes/himesiki.h mame-0.145/src/mame/includes/himesiki.h --- mame-0.144/src/mame/includes/himesiki.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/himesiki.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ /*----------- defined in video/himesiki.c -----------*/ VIDEO_START( himesiki ); -SCREEN_UPDATE( himesiki ); +SCREEN_UPDATE_IND16( himesiki ); WRITE8_HANDLER( himesiki_bg_ram_w ); WRITE8_HANDLER( himesiki_scrollx_w ); diff -Nru mame-0.144/src/mame/includes/hnayayoi.h mame-0.145/src/mame/includes/hnayayoi.h --- mame-0.144/src/mame/includes/hnayayoi.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hnayayoi.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,7 +27,7 @@ VIDEO_START( hnayayoi ); VIDEO_START( untoucha ); -SCREEN_UPDATE( hnayayoi ); +SCREEN_UPDATE_IND16( hnayayoi ); WRITE8_HANDLER( dynax_blitter_rev1_param_w ); WRITE8_HANDLER( dynax_blitter_rev1_start_w ); diff -Nru mame-0.144/src/mame/includes/hng64.h mame-0.145/src/mame/includes/hng64.h --- mame-0.144/src/mame/includes/hng64.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/hng64.h 2012-02-06 21:30:44.000000000 +0000 @@ -7,7 +7,9 @@ { public: hng64_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } int m_mcu_type; UINT32 *m_mainram; @@ -94,6 +96,8 @@ float m_lightStrength; float m_lightVector[3]; + required_device m_maincpu; + }; @@ -103,4 +107,5 @@ void hng64_command3d(running_machine& machine, const UINT16* packet); VIDEO_START( hng64 ); -SCREEN_UPDATE( hng64 ); +SCREEN_UPDATE_RGB32( hng64 ); +SCREEN_VBLANK( hng64 ); diff -Nru mame-0.144/src/mame/includes/holeland.h mame-0.145/src/mame/includes/holeland.h --- mame-0.144/src/mame/includes/holeland.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/holeland.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,8 +28,8 @@ VIDEO_START( holeland ); VIDEO_START( crzrally ); -SCREEN_UPDATE( holeland ); -SCREEN_UPDATE( crzrally ); +SCREEN_UPDATE_IND16( holeland ); +SCREEN_UPDATE_IND16( crzrally ); WRITE8_HANDLER( holeland_videoram_w ); WRITE8_HANDLER( holeland_colorram_w ); diff -Nru mame-0.144/src/mame/includes/homedata.h mame-0.145/src/mame/includes/homedata.h --- mame-0.144/src/mame/includes/homedata.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/homedata.h 2012-02-06 21:30:44.000000000 +0000 @@ -66,8 +66,8 @@ VIDEO_START( pteacher ); VIDEO_START( lemnangl ); VIDEO_START( mirderby ); -SCREEN_UPDATE( mrokumei ); -SCREEN_UPDATE( reikaids ); -SCREEN_UPDATE( pteacher ); -SCREEN_UPDATE( mirderby ); -SCREEN_EOF( homedata ); +SCREEN_UPDATE_IND16( mrokumei ); +SCREEN_UPDATE_IND16( reikaids ); +SCREEN_UPDATE_IND16( pteacher ); +SCREEN_UPDATE_IND16( mirderby ); +SCREEN_VBLANK( homedata ); diff -Nru mame-0.144/src/mame/includes/homerun.h mame-0.145/src/mame/includes/homerun.h --- mame-0.144/src/mame/includes/homerun.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/homerun.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ WRITE8_DEVICE_HANDLER( homerun_banking_w ); VIDEO_START(homerun); -SCREEN_UPDATE(homerun); +SCREEN_UPDATE_IND16(homerun); diff -Nru mame-0.144/src/mame/includes/hyhoo.h mame-0.145/src/mame/includes/hyhoo.h --- mame-0.144/src/mame/includes/hyhoo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hyhoo.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,13 +16,13 @@ int m_dispflag; int m_highcolorflag; int m_flipscreen; - bitmap_t *m_tmpbitmap; + bitmap_rgb32 m_tmpbitmap; }; /*----------- defined in video/hyhoo.c -----------*/ -SCREEN_UPDATE( hyhoo ); +SCREEN_UPDATE_RGB32( hyhoo ); VIDEO_START( hyhoo ); WRITE8_HANDLER( hyhoo_blitter_w ); diff -Nru mame-0.144/src/mame/includes/hyperspt.h mame-0.145/src/mame/includes/hyperspt.h --- mame-0.144/src/mame/includes/hyperspt.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/hyperspt.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,6 +16,8 @@ /* video-related */ tilemap_t *m_bg_tilemap; int m_sprites_gfx_banked; + + UINT8 m_irq_mask; }; /*----------- defined in video/hyperspt.c -----------*/ @@ -26,6 +28,6 @@ PALETTE_INIT( hyperspt ); VIDEO_START( hyperspt ); -SCREEN_UPDATE( hyperspt ); +SCREEN_UPDATE_IND16( hyperspt ); VIDEO_START( roadf ); diff -Nru mame-0.144/src/mame/includes/hyprduel.h mame-0.145/src/mame/includes/hyprduel.h --- mame-0.144/src/mame/includes/hyprduel.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/hyprduel.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,6 +35,7 @@ int m_sprite_xoffs; int m_sprite_yoffs; int m_sprite_yoffs_sub; + UINT8 * m_expanded_gfx1; /* misc */ emu_timer *m_magerror_irq_timer; @@ -64,4 +65,4 @@ VIDEO_START( hyprduel_14220 ); VIDEO_START( magerror_14220 ); -SCREEN_UPDATE( hyprduel ); +SCREEN_UPDATE_IND16( hyprduel ); diff -Nru mame-0.144/src/mame/includes/ikki.h mame-0.145/src/mame/includes/ikki.h --- mame-0.144/src/mame/includes/ikki.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ikki.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,7 +8,10 @@ { public: ikki_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_subcpu(*this, "sub") + { } /* memory pointers */ UINT8 * m_videoram; @@ -18,9 +21,13 @@ size_t m_spriteram_size; /* video-related */ - bitmap_t *m_sprite_bitmap; + bitmap_ind16 m_sprite_bitmap; UINT8 m_flipscreen; int m_punch_through_pen; + UINT8 m_irq_source; + + required_device m_maincpu; + required_device m_subcpu; }; @@ -30,4 +37,4 @@ PALETTE_INIT( ikki ); VIDEO_START( ikki ); -SCREEN_UPDATE( ikki ); +SCREEN_UPDATE_IND16( ikki ); diff -Nru mame-0.144/src/mame/includes/inufuku.h mame-0.145/src/mame/includes/inufuku.h --- mame-0.144/src/mame/includes/inufuku.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/inufuku.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,5 +42,5 @@ WRITE16_HANDLER( inufuku_palettereg_w ); WRITE16_HANDLER( inufuku_scrollreg_w ); -SCREEN_UPDATE( inufuku ); +SCREEN_UPDATE_IND16( inufuku ); VIDEO_START( inufuku ); diff -Nru mame-0.144/src/mame/includes/iqblock.h mame-0.145/src/mame/includes/iqblock.h --- mame-0.144/src/mame/includes/iqblock.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/iqblock.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: iqblock_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_rambase; UINT8 *m_bgvideoram; @@ -11,6 +13,8 @@ int m_video_type; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; + + required_device m_maincpu; }; @@ -22,4 +26,4 @@ WRITE8_HANDLER( iqblock_fgscroll_w ); VIDEO_START( iqblock ); -SCREEN_UPDATE( iqblock ); +SCREEN_UPDATE_IND16( iqblock ); diff -Nru mame-0.144/src/mame/includes/irobot.h mame-0.145/src/mame/includes/irobot.h --- mame-0.144/src/mame/includes/irobot.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/irobot.h 2012-02-06 21:30:44.000000000 +0000 @@ -84,7 +84,7 @@ PALETTE_INIT( irobot ); VIDEO_START( irobot ); -SCREEN_UPDATE( irobot ); +SCREEN_UPDATE_IND16( irobot ); WRITE8_HANDLER( irobot_paletteram_w ); diff -Nru mame-0.144/src/mame/includes/ironhors.h mame-0.145/src/mame/includes/ironhors.h --- mame-0.144/src/mame/includes/ironhors.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ironhors.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,7 @@ int m_spriterambank; /* devices */ + device_t *m_maincpu; device_t *m_soundcpu; }; @@ -40,6 +41,6 @@ PALETTE_INIT( ironhors ); VIDEO_START( ironhors ); -SCREEN_UPDATE( ironhors ); +SCREEN_UPDATE_IND16( ironhors ); VIDEO_START( farwest ); -SCREEN_UPDATE( farwest ); +SCREEN_UPDATE_IND16( farwest ); diff -Nru mame-0.144/src/mame/includes/itech32.h mame-0.145/src/mame/includes/itech32.h --- mame-0.144/src/mame/includes/itech32.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/itech32.h 2012-02-06 21:30:44.000000000 +0000 @@ -109,4 +109,4 @@ READ32_HANDLER( itech020_video_r ); WRITE32_HANDLER( drivedge_zbuf_control_w ); -SCREEN_UPDATE( itech32 ); +SCREEN_UPDATE_IND16( itech32 ); diff -Nru mame-0.144/src/mame/includes/itech8.h mame-0.145/src/mame/includes/itech8.h --- mame-0.144/src/mame/includes/itech8.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/itech8.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,7 +13,8 @@ { public: itech8_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_visarea(0, 0, 0, 0) { } UINT8 *m_grom_bank; UINT8 m_blitter_int; @@ -22,7 +23,7 @@ UINT8 m_sound_data; UINT8 m_pia_porta_data; UINT8 m_pia_portb_data; - const rectangle *m_visarea; + rectangle m_visarea; UINT8 m_z80_ctrl; UINT8 m_z80_port_val; UINT8 m_z80_clear_to_send; @@ -70,7 +71,7 @@ WRITE8_HANDLER( slikshot_z80_control_w ); VIDEO_START( slikshot ); -SCREEN_UPDATE( slikshot ); +SCREEN_UPDATE_RGB32( slikshot ); /*----------- defined in video/itech8.c -----------*/ @@ -91,7 +92,7 @@ WRITE8_HANDLER( grmatch_xscroll_w ); TIMER_DEVICE_CALLBACK( grmatch_palette_update ); -SCREEN_UPDATE( itech8_2layer ); -SCREEN_UPDATE( itech8_grmatch ); -SCREEN_UPDATE( itech8_2page ); -SCREEN_UPDATE( itech8_2page_large ); +SCREEN_UPDATE_RGB32( itech8_2layer ); +SCREEN_UPDATE_RGB32( itech8_grmatch ); +SCREEN_UPDATE_RGB32( itech8_2page ); +SCREEN_UPDATE_RGB32( itech8_2page_large ); diff -Nru mame-0.144/src/mame/includes/jackal.h mame-0.145/src/mame/includes/jackal.h --- mame-0.144/src/mame/includes/jackal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/jackal.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ PALETTE_INIT( jackal ); VIDEO_START( jackal ); -SCREEN_UPDATE( jackal ); +SCREEN_UPDATE_IND16( jackal ); diff -Nru mame-0.144/src/mame/includes/jack.h mame-0.145/src/mame/includes/jack.h --- mame-0.144/src/mame/includes/jack.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/jack.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,8 +42,8 @@ WRITE8_HANDLER( jack_flipscreen_w ); VIDEO_START( jack ); -SCREEN_UPDATE( jack ); +SCREEN_UPDATE_IND16( jack ); PALETTE_INIT( joinem ); VIDEO_START( joinem ); -SCREEN_UPDATE( joinem ); +SCREEN_UPDATE_IND16( joinem ); diff -Nru mame-0.144/src/mame/includes/jaguar.h mame-0.145/src/mame/includes/jaguar.h --- mame-0.144/src/mame/includes/jaguar.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/jaguar.h 2012-02-06 21:30:44.000000000 +0000 @@ -5,11 +5,7 @@ *************************************************************************/ #ifndef ENABLE_SPEEDUP_HACKS -#ifndef MESS #define ENABLE_SPEEDUP_HACKS 1 -#else -#define ENABLE_SPEEDUP_HACKS 0 -#endif /* MESS */ #endif /* CoJag and Jaguar have completely different XTALs, pixel clock in Jaguar is the same as the GPU one */ @@ -26,6 +22,7 @@ extern UINT32 *jaguar_gpu_clut; extern UINT32 *jaguar_dsp_ram; extern UINT32 *jaguar_wave_rom; +extern bool jaguar_hacks_enabled; /*----------- defined in audio/jaguar.c -----------*/ @@ -69,4 +66,4 @@ VIDEO_START( cojag ); VIDEO_START( jaguar ); -SCREEN_UPDATE( cojag ); +SCREEN_UPDATE_RGB32( cojag ); diff -Nru mame-0.144/src/mame/includes/jailbrek.h mame-0.145/src/mame/includes/jailbrek.h --- mame-0.144/src/mame/includes/jailbrek.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/jailbrek.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( jailbrek ); VIDEO_START( jailbrek ); -SCREEN_UPDATE( jailbrek ); +SCREEN_UPDATE_IND16( jailbrek ); diff -Nru mame-0.144/src/mame/includes/jpmimpct.h mame-0.145/src/mame/includes/jpmimpct.h --- mame-0.144/src/mame/includes/jpmimpct.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/jpmimpct.h 2012-02-06 21:30:44.000000000 +0000 @@ -82,6 +82,6 @@ void jpmimpct_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); void jpmimpct_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); -void jpmimpct_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void jpmimpct_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); VIDEO_START( jpmimpct ); diff -Nru mame-0.144/src/mame/includes/kaneko16.h mame-0.145/src/mame/includes/kaneko16.h --- mame-0.144/src/mame/includes/kaneko16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kaneko16.h 2012-02-06 21:30:44.000000000 +0000 @@ -72,7 +72,9 @@ { public: kaneko16_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_mcu_ram; UINT8 m_nvram_save[128]; @@ -102,8 +104,10 @@ UINT16 m_disp_enable; tilemap_t *m_tmap[4]; int m_keep_sprites; - bitmap_t *m_bg15_bitmap; - bitmap_t *m_sprites_bitmap; + bitmap_ind16 m_bg15_bitmap; + bitmap_ind16 m_sprites_bitmap; + + required_device m_maincpu; }; @@ -161,7 +165,7 @@ READ16_HANDLER ( kaneko16_sprites_regs_r ); WRITE16_HANDLER( kaneko16_sprites_regs_w ); -void kaneko16_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +void kaneko16_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); READ16_HANDLER ( kaneko16_bg15_select_r ); WRITE16_HANDLER( kaneko16_bg15_select_w ); @@ -179,12 +183,12 @@ VIDEO_START( sandscrp_1xVIEW2 ); -SCREEN_UPDATE( kaneko16 ); -SCREEN_UPDATE( sandscrp ); -SCREEN_UPDATE( berlwall ); -SCREEN_UPDATE( jchan_view2 ); +SCREEN_UPDATE_IND16( kaneko16 ); +SCREEN_UPDATE_IND16( sandscrp ); +SCREEN_UPDATE_IND16( berlwall ); +SCREEN_UPDATE_IND16( jchan_view2 ); VIDEO_START( galsnew ); -SCREEN_UPDATE( galsnew ); +SCREEN_UPDATE_IND16( galsnew ); #endif diff -Nru mame-0.144/src/mame/includes/kangaroo.h mame-0.145/src/mame/includes/kangaroo.h --- mame-0.144/src/mame/includes/kangaroo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kangaroo.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ /*----------- defined in video/kangaroo.c -----------*/ VIDEO_START( kangaroo ); -SCREEN_UPDATE( kangaroo ); +SCREEN_UPDATE_RGB32( kangaroo ); WRITE8_HANDLER( kangaroo_videoram_w ); WRITE8_HANDLER( kangaroo_video_control_w ); diff -Nru mame-0.144/src/mame/includes/karnov.h mame-0.145/src/mame/includes/karnov.h --- mame-0.144/src/mame/includes/karnov.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/karnov.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ // UINT16 * m_spriteram; // currently this uses generic buffered spriteram /* video-related */ - bitmap_t *m_bitmap_f; + bitmap_ind16 *m_bitmap_f; tilemap_t *m_fix_tilemap; int m_flipscreen; UINT16 m_scroll[2]; @@ -57,4 +57,4 @@ PALETTE_INIT( karnov ); VIDEO_START( karnov ); VIDEO_START( wndrplnt ); -SCREEN_UPDATE( karnov ); +SCREEN_UPDATE_IND16( karnov ); diff -Nru mame-0.144/src/mame/includes/kchamp.h mame-0.145/src/mame/includes/kchamp.h --- mame-0.144/src/mame/includes/kchamp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kchamp.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,5 +39,5 @@ PALETTE_INIT( kchamp ); VIDEO_START( kchamp ); -SCREEN_UPDATE( kchamp ); -SCREEN_UPDATE( kchampvs ); +SCREEN_UPDATE_IND16( kchamp ); +SCREEN_UPDATE_IND16( kchampvs ); diff -Nru mame-0.144/src/mame/includes/kickgoal.h mame-0.145/src/mame/includes/kickgoal.h --- mame-0.144/src/mame/includes/kickgoal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kickgoal.h 2012-02-06 21:30:44.000000000 +0000 @@ -50,7 +50,7 @@ WRITE16_HANDLER( kickgoal_bg2ram_w ); VIDEO_START( kickgoal ); -SCREEN_UPDATE( kickgoal ); +SCREEN_UPDATE_IND16( kickgoal ); VIDEO_START( actionhw ); -SCREEN_UPDATE( actionhw ); +SCREEN_UPDATE_IND16( actionhw ); diff -Nru mame-0.144/src/mame/includes/kingobox.h mame-0.145/src/mame/includes/kingobox.h --- mame-0.144/src/mame/includes/kingobox.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kingobox.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,8 +44,8 @@ PALETTE_INIT( kingofb ); VIDEO_START( kingofb ); -SCREEN_UPDATE( kingofb ); +SCREEN_UPDATE_IND16( kingofb ); PALETTE_INIT( ringking ); VIDEO_START( ringking ); -SCREEN_UPDATE( ringking ); +SCREEN_UPDATE_IND16( ringking ); diff -Nru mame-0.144/src/mame/includes/klax.h mame-0.145/src/mame/includes/klax.h --- mame-0.144/src/mame/includes/klax.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/klax.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ WRITE16_HANDLER( klax_latch_w ); VIDEO_START( klax ); -SCREEN_UPDATE( klax ); +SCREEN_UPDATE_IND16( klax ); diff -Nru mame-0.144/src/mame/includes/kncljoe.h mame-0.145/src/mame/includes/kncljoe.h --- mame-0.144/src/mame/includes/kncljoe.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/kncljoe.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ PALETTE_INIT( kncljoe ); VIDEO_START( kncljoe ); -SCREEN_UPDATE( kncljoe ); +SCREEN_UPDATE_IND16( kncljoe ); diff -Nru mame-0.144/src/mame/includes/konamigx.h mame-0.145/src/mame/includes/konamigx.h --- mame-0.144/src/mame/includes/konamigx.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/konamigx.h 2012-02-06 21:30:44.000000000 +0000 @@ -1,3 +1,15 @@ +class konamigx_state : public driver_device +{ +public: + konamigx_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } + + required_device m_maincpu; +}; + + /*----------- defined in drivers/konamigx.c -----------*/ extern UINT32 *gx_psacram, *gx_subpaletteram32; @@ -61,10 +73,10 @@ #define GXSUB_5BPP 0x05 // 32 colors #define GXSUB_8BPP 0x08 // 256 colors -void konamigx_mixer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +void konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *sub1, int sub1flags, tilemap_t *sub2, int sub2flags, - int mixerflags, bitmap_t* extra_bitmap, int rushingheroes_hack); + int mixerflags, bitmap_ind16* extra_bitmap, int rushingheroes_hack); void konamigx_mixer_init(running_machine &machine, int objdma); void konamigx_mixer_primode(int mode); @@ -85,7 +97,9 @@ VIDEO_START(winspike); VIDEO_START(opengolf); VIDEO_START(racinfrc); -SCREEN_UPDATE(konamigx); +SCREEN_UPDATE_RGB32(konamigx); +SCREEN_UPDATE_RGB32(konamigx_left); +SCREEN_UPDATE_RGB32(konamigx_right); WRITE32_HANDLER( konamigx_palette_w ); #ifdef UNUSED_FUNCTION diff -Nru mame-0.144/src/mame/includes/kopunch.h mame-0.145/src/mame/includes/kopunch.h --- mame-0.144/src/mame/includes/kopunch.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kopunch.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ PALETTE_INIT( kopunch ); VIDEO_START( kopunch ); -SCREEN_UPDATE( kopunch ); +SCREEN_UPDATE_IND16( kopunch ); diff -Nru mame-0.144/src/mame/includes/ksayakyu.h mame-0.145/src/mame/includes/ksayakyu.h --- mame-0.144/src/mame/includes/ksayakyu.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ksayakyu.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,4 +32,4 @@ WRITE8_HANDLER( ksayakyu_videoctrl_w ); PALETTE_INIT( ksayakyu ); VIDEO_START( ksayakyu ); -SCREEN_UPDATE( ksayakyu ); +SCREEN_UPDATE_IND16( ksayakyu ); diff -Nru mame-0.144/src/mame/includes/kyugo.h mame-0.145/src/mame/includes/kyugo.h --- mame-0.144/src/mame/includes/kyugo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/kyugo.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,6 +32,8 @@ /* devices */ device_t *m_maincpu; device_t *m_subcpu; + + UINT8 m_nmi_mask; }; @@ -48,4 +50,4 @@ WRITE8_HANDLER( kyugo_flipscreen_w ); VIDEO_START( kyugo ); -SCREEN_UPDATE( kyugo ); +SCREEN_UPDATE_IND16( kyugo ); diff -Nru mame-0.144/src/mame/includes/labyrunr.h mame-0.145/src/mame/includes/labyrunr.h --- mame-0.144/src/mame/includes/labyrunr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/labyrunr.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,7 +8,9 @@ { public: labyrunr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* memory pointers */ UINT8 * m_videoram1; @@ -25,6 +27,8 @@ /* devices */ device_t *m_k007121; + + required_device m_maincpu; }; @@ -36,4 +40,4 @@ PALETTE_INIT( labyrunr ); VIDEO_START( labyrunr ); -SCREEN_UPDATE( labyrunr ); +SCREEN_UPDATE_IND16( labyrunr ); diff -Nru mame-0.144/src/mame/includes/ladybug.h mame-0.145/src/mame/includes/ladybug.h --- mame-0.144/src/mame/includes/ladybug.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ladybug.h 2012-02-06 21:30:44.000000000 +0000 @@ -53,12 +53,12 @@ PALETTE_INIT( ladybug ); VIDEO_START( ladybug ); -SCREEN_UPDATE( ladybug ); +SCREEN_UPDATE_IND16( ladybug ); PALETTE_INIT( sraider ); VIDEO_START( sraider ); -SCREEN_UPDATE( sraider ); -SCREEN_EOF( sraider ); +SCREEN_UPDATE_IND16( sraider ); +SCREEN_VBLANK( sraider ); /*----------- defined in video/redclash.c -----------*/ @@ -73,11 +73,11 @@ PALETTE_INIT( redclash ); VIDEO_START( redclash ); -SCREEN_UPDATE( redclash ); -SCREEN_EOF( redclash ); +SCREEN_UPDATE_IND16( redclash ); +SCREEN_VBLANK( redclash ); /* sraider uses the zerohour star generator board */ void redclash_set_stars_enable(running_machine &machine, UINT8 on); void redclash_update_stars_state(running_machine &machine); void redclash_set_stars_speed(running_machine &machine, UINT8 speed); -void redclash_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 palette_offset, UINT8 sraider, UINT8 firstx, UINT8 lastx); +void redclash_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 palette_offset, UINT8 sraider, UINT8 firstx, UINT8 lastx); diff -Nru mame-0.144/src/mame/includes/ladyfrog.h mame-0.145/src/mame/includes/ladyfrog.h --- mame-0.144/src/mame/includes/ladyfrog.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ladyfrog.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,4 +51,4 @@ VIDEO_START( ladyfrog ); VIDEO_START( toucheme ); -SCREEN_UPDATE( ladyfrog ); +SCREEN_UPDATE_IND16( ladyfrog ); diff -Nru mame-0.144/src/mame/includes/lasso.h mame-0.145/src/mame/includes/lasso.h --- mame-0.144/src/mame/includes/lasso.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lasso.h 2012-02-06 21:30:44.000000000 +0000 @@ -50,7 +50,6 @@ VIDEO_START( wwjgtin ); VIDEO_START( pinbo ); -SCREEN_UPDATE( lasso ); -SCREEN_UPDATE( chameleo ); -SCREEN_UPDATE( wwjgtin ); -SCREEN_UPDATE( pinbo ); +SCREEN_UPDATE_IND16( lasso ); +SCREEN_UPDATE_IND16( chameleo ); +SCREEN_UPDATE_IND16( wwjgtin ); diff -Nru mame-0.144/src/mame/includes/lastduel.h mame-0.145/src/mame/includes/lastduel.h --- mame-0.144/src/mame/includes/lastduel.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lastduel.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,7 +8,10 @@ { public: lastduel_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu") + { } /* memory pointers */ UINT16 * m_vram; @@ -27,7 +30,8 @@ int m_tilemap_priority; /* devices */ - device_t *m_audiocpu; + required_device m_maincpu; + required_device m_audiocpu; }; /*----------- defined in video/lastduel.c -----------*/ @@ -43,6 +47,6 @@ VIDEO_START( lastduel ); VIDEO_START( madgear ); -SCREEN_UPDATE( lastduel ); -SCREEN_UPDATE( madgear ); -SCREEN_EOF( lastduel ); +SCREEN_UPDATE_IND16( lastduel ); +SCREEN_UPDATE_IND16( madgear ); +SCREEN_VBLANK( lastduel ); diff -Nru mame-0.144/src/mame/includes/lazercmd.h mame-0.145/src/mame/includes/lazercmd.h --- mame-0.144/src/mame/includes/lazercmd.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lazercmd.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,7 +21,9 @@ { public: lazercmd_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } /* memory pointers */ UINT8 * m_videoram; @@ -37,10 +39,11 @@ int m_dac_data; /* device */ + required_device m_maincpu; device_t *m_dac; }; /*----------- defined in video/lazercmd.c -----------*/ -SCREEN_UPDATE( lazercmd ); +SCREEN_UPDATE_IND16( lazercmd ); diff -Nru mame-0.144/src/mame/includes/legionna.h mame-0.145/src/mame/includes/legionna.h --- mame-0.144/src/mame/includes/legionna.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/legionna.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,6 +38,6 @@ VIDEO_START( denjinmk ); VIDEO_START( grainbow ); VIDEO_START( godzilla ); -SCREEN_UPDATE( legionna ); -SCREEN_UPDATE( godzilla ); -SCREEN_UPDATE( grainbow ); +SCREEN_UPDATE_IND16( legionna ); +SCREEN_UPDATE_IND16( godzilla ); +SCREEN_UPDATE_IND16( grainbow ); diff -Nru mame-0.144/src/mame/includes/lemmings.h mame-0.145/src/mame/includes/lemmings.h --- mame-0.144/src/mame/includes/lemmings.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lemmings.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ // UINT16 * m_spriteram2; // this currently uses generic buffered spriteram /* video-related */ - bitmap_t *m_bitmap0; + bitmap_ind16 *m_bitmap0; tilemap_t *m_vram_tilemap; UINT16 *m_sprite_triple_buffer_0; UINT16 *m_sprite_triple_buffer_1; @@ -33,5 +33,6 @@ WRITE16_HANDLER( lemmings_vram_w ); VIDEO_START( lemmings ); -SCREEN_EOF( lemmings ); -SCREEN_UPDATE( lemmings ); +SCREEN_VBLANK( lemmings ); +SCREEN_UPDATE_RGB32( lemmings ); + diff -Nru mame-0.144/src/mame/includes/lethal.h mame-0.145/src/mame/includes/lethal.h --- mame-0.144/src/mame/includes/lethal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lethal.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ WRITE8_HANDLER(lethalen_palette_control); VIDEO_START(lethalen); -SCREEN_UPDATE(lethalen); +SCREEN_UPDATE_IND16(lethalen); diff -Nru mame-0.144/src/mame/includes/lethalj.h mame-0.145/src/mame/includes/lethalj.h --- mame-0.144/src/mame/includes/lethalj.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lethalj.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ WRITE16_HANDLER( lethalj_blitter_w ); -void lethalj_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void lethalj_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); diff -Nru mame-0.144/src/mame/includes/liberate.h mame-0.145/src/mame/includes/liberate.h --- mame-0.144/src/mame/includes/liberate.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/liberate.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,10 +31,10 @@ /*----------- defined in video/liberate.c -----------*/ PALETTE_INIT( liberate ); -SCREEN_UPDATE( prosoccr ); -SCREEN_UPDATE( prosport ); -SCREEN_UPDATE( liberate ); -SCREEN_UPDATE( boomrang ); +SCREEN_UPDATE_IND16( prosoccr ); +SCREEN_UPDATE_IND16( prosport ); +SCREEN_UPDATE_IND16( liberate ); +SCREEN_UPDATE_IND16( boomrang ); VIDEO_START( prosoccr ); VIDEO_START( prosport ); VIDEO_START( boomrang ); diff -Nru mame-0.144/src/mame/includes/liberatr.h mame-0.145/src/mame/includes/liberatr.h --- mame-0.144/src/mame/includes/liberatr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/liberatr.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,18 +31,19 @@ DECLARE_READ8_MEMBER( bitmap_xy_r ); DECLARE_WRITE8_MEMBER( bitmap_xy_w ); + UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + protected: struct planet; virtual void machine_start(); virtual void video_start(); - virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect); void init_planet(planet &liberatr_planet, UINT8 *planet_rom); void get_pens(pen_t *pens); - void draw_planet(bitmap_t &bitmap, pen_t *pens); - void draw_bitmap(bitmap_t &bitmap, pen_t *pens); + void draw_planet(bitmap_rgb32 &bitmap, pen_t *pens); + void draw_bitmap(bitmap_rgb32 &bitmap, pen_t *pens); required_shared_ptr m_base_ram; required_shared_ptr m_planet_frame; diff -Nru mame-0.144/src/mame/includes/lkage.h mame-0.145/src/mame/includes/lkage.h --- mame-0.144/src/mame/includes/lkage.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lkage.h 2012-02-06 21:30:44.000000000 +0000 @@ -70,5 +70,5 @@ WRITE8_HANDLER( lkage_videoram_w ); VIDEO_START( lkage ); -SCREEN_UPDATE( lkage ); +SCREEN_UPDATE_IND16( lkage ); diff -Nru mame-0.144/src/mame/includes/lockon.h mame-0.145/src/mame/includes/lockon.h --- mame-0.144/src/mame/includes/lockon.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lockon.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,8 +37,8 @@ UINT8 m_ground_ctrl; UINT16 m_scroll_h; UINT16 m_scroll_v; - bitmap_t *m_front_buffer; - bitmap_t *m_back_buffer; + bitmap_ind16 *m_front_buffer; + bitmap_ind16 *m_back_buffer; emu_timer *m_bufend_timer; emu_timer *m_cursor_timer; @@ -80,8 +80,8 @@ PALETTE_INIT( lockon ); VIDEO_START( lockon ); -SCREEN_UPDATE( lockon ); -SCREEN_EOF( lockon ); +SCREEN_UPDATE_IND16( lockon ); +SCREEN_VBLANK( lockon ); READ16_HANDLER( lockon_crtc_r ); WRITE16_HANDLER( lockon_crtc_w ); WRITE16_HANDLER( lockon_rotate_w ); diff -Nru mame-0.144/src/mame/includes/lordgun.h mame-0.145/src/mame/includes/lordgun.h --- mame-0.144/src/mame/includes/lordgun.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lordgun.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ int m_whitescreen; lordgun_gun_data m_gun[2]; tilemap_t *m_tilemap[4]; - bitmap_t *m_bitmaps[5]; + bitmap_ind16 *m_bitmaps[5]; UINT16 *m_spriteram; size_t m_spriteram_size; }; @@ -46,4 +46,4 @@ void lordgun_update_gun(running_machine &machine, int i); VIDEO_START( lordgun ); -SCREEN_UPDATE( lordgun ); +SCREEN_UPDATE_IND16( lordgun ); diff -Nru mame-0.144/src/mame/includes/lsasquad.h mame-0.145/src/mame/includes/lsasquad.h --- mame-0.144/src/mame/includes/lsasquad.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lsasquad.h 2012-02-06 21:30:44.000000000 +0000 @@ -64,5 +64,5 @@ /*----------- defined in video/lsasquad.c -----------*/ -SCREEN_UPDATE( lsasquad ); -SCREEN_UPDATE( daikaiju ); +SCREEN_UPDATE_IND16( lsasquad ); +SCREEN_UPDATE_IND16( daikaiju ); diff -Nru mame-0.144/src/mame/includes/lucky74.h mame-0.145/src/mame/includes/lucky74.h --- mame-0.144/src/mame/includes/lucky74.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/lucky74.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ WRITE8_HANDLER( lucky74_bg_colorram_w ); PALETTE_INIT( lucky74 ); VIDEO_START( lucky74 ); -SCREEN_UPDATE( lucky74 ); +SCREEN_UPDATE_IND16( lucky74 ); diff -Nru mame-0.144/src/mame/includes/lvcards.h mame-0.145/src/mame/includes/lvcards.h --- mame-0.144/src/mame/includes/lvcards.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lvcards.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,4 +21,4 @@ PALETTE_INIT( lvcards ); PALETTE_INIT( ponttehk ); VIDEO_START( lvcards ); -SCREEN_UPDATE( lvcards ); +SCREEN_UPDATE_IND16( lvcards ); diff -Nru mame-0.144/src/mame/includes/lwings.h mame-0.145/src/mame/includes/lwings.h --- mame-0.144/src/mame/includes/lwings.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/lwings.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,6 +27,7 @@ int m_palette_pen; UINT8 m_soundstate; UINT8 m_adpcm; + UINT8 m_nmi_mask; }; @@ -42,6 +43,6 @@ VIDEO_START( lwings ); VIDEO_START( trojan ); VIDEO_START( avengers ); -SCREEN_UPDATE( lwings ); -SCREEN_UPDATE( trojan ); -SCREEN_EOF( lwings ); +SCREEN_UPDATE_IND16( lwings ); +SCREEN_UPDATE_IND16( trojan ); +SCREEN_VBLANK( lwings ); diff -Nru mame-0.144/src/mame/includes/m107.h mame-0.145/src/mame/includes/m107.h --- mame-0.144/src/mame/includes/m107.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m107.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,7 +35,7 @@ /*----------- defined in video/m107.c -----------*/ WRITE16_HANDLER( m107_spritebuffer_w ); -SCREEN_UPDATE( m107 ); +SCREEN_UPDATE_IND16( m107 ); VIDEO_START( m107 ); WRITE16_HANDLER( m107_control_w ); WRITE16_HANDLER( m107_vram_w ); diff -Nru mame-0.144/src/mame/includes/m10.h mame-0.145/src/mame/includes/m10.h --- mame-0.144/src/mame/includes/m10.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m10.h 2012-02-06 21:30:44.000000000 +0000 @@ -70,8 +70,8 @@ WRITE8_HANDLER( m10_chargen_w ); WRITE8_HANDLER( m15_chargen_w ); -SCREEN_UPDATE( m10 ); -SCREEN_UPDATE( m15 ); +SCREEN_UPDATE_IND16( m10 ); +SCREEN_UPDATE_IND16( m15 ); VIDEO_START( m10 ); VIDEO_START( m15 ); diff -Nru mame-0.144/src/mame/includes/m52.h mame-0.145/src/mame/includes/m52.h --- mame-0.144/src/mame/includes/m52.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m52.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ PALETTE_INIT( m52 ); VIDEO_START( m52 ); -SCREEN_UPDATE( m52 ); +SCREEN_UPDATE_IND16( m52 ); diff -Nru mame-0.144/src/mame/includes/m57.h mame-0.145/src/mame/includes/m57.h --- mame-0.144/src/mame/includes/m57.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m57.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,4 +23,4 @@ PALETTE_INIT( m57 ); VIDEO_START( m57 ); -SCREEN_UPDATE( m57 ); +SCREEN_UPDATE_IND16( m57 ); diff -Nru mame-0.144/src/mame/includes/m58.h mame-0.145/src/mame/includes/m58.h --- mame-0.144/src/mame/includes/m58.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m58.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,7 +16,7 @@ UINT8 *m_yard_scroll_x_high; UINT8 *m_yard_scroll_y_low; UINT8 *m_yard_score_panel_disabled; - bitmap_t *m_scroll_panel_bitmap; + bitmap_ind16 *m_scroll_panel_bitmap; }; /*----------- defined in video/m58.c -----------*/ @@ -27,4 +27,4 @@ PALETTE_INIT( yard ); VIDEO_START( yard ); -SCREEN_UPDATE( yard ); +SCREEN_UPDATE_IND16( yard ); diff -Nru mame-0.144/src/mame/includes/m62.h mame-0.145/src/mame/includes/m62.h --- mame-0.144/src/mame/includes/m62.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m62.h 2012-02-06 21:30:44.000000000 +0000 @@ -67,14 +67,14 @@ VIDEO_START( spelunk2 ); VIDEO_START( youjyudn ); -SCREEN_UPDATE( battroad ); -SCREEN_UPDATE( horizon ); -SCREEN_UPDATE( kidniki ); -SCREEN_UPDATE( kungfum ); -SCREEN_UPDATE( ldrun ); -SCREEN_UPDATE( ldrun3 ); -SCREEN_UPDATE( ldrun4 ); -SCREEN_UPDATE( lotlot ); -SCREEN_UPDATE( spelunkr ); -SCREEN_UPDATE( spelunk2 ); -SCREEN_UPDATE( youjyudn ); +SCREEN_UPDATE_IND16( battroad ); +SCREEN_UPDATE_IND16( horizon ); +SCREEN_UPDATE_IND16( kidniki ); +SCREEN_UPDATE_IND16( kungfum ); +SCREEN_UPDATE_IND16( ldrun ); +SCREEN_UPDATE_IND16( ldrun3 ); +SCREEN_UPDATE_IND16( ldrun4 ); +SCREEN_UPDATE_IND16( lotlot ); +SCREEN_UPDATE_IND16( spelunkr ); +SCREEN_UPDATE_IND16( spelunk2 ); +SCREEN_UPDATE_IND16( youjyudn ); diff -Nru mame-0.144/src/mame/includes/m72.h mame-0.145/src/mame/includes/m72.h --- mame-0.144/src/mame/includes/m72.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/m72.h 2012-02-06 21:30:44.000000000 +0000 @@ -67,5 +67,5 @@ WRITE16_HANDLER( rtype2_port02_w ); WRITE16_HANDLER( majtitle_gfx_ctrl_w ); -SCREEN_UPDATE( m72 ); -SCREEN_UPDATE( majtitle ); +SCREEN_UPDATE_IND16( m72 ); +SCREEN_UPDATE_IND16( majtitle ); diff -Nru mame-0.144/src/mame/includes/m90.h mame-0.145/src/mame/includes/m90.h --- mame-0.144/src/mame/includes/m90.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/m90.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,8 +23,8 @@ VIDEO_START( m90 ); VIDEO_START( dynablsb ); VIDEO_START( bomblord ); -SCREEN_UPDATE( m90 ); -SCREEN_UPDATE( dynablsb ); -SCREEN_UPDATE( bomblord ); +SCREEN_UPDATE_IND16( m90 ); +SCREEN_UPDATE_IND16( dynablsb ); +SCREEN_UPDATE_IND16( bomblord ); WRITE16_HANDLER( m90_video_w ); WRITE16_HANDLER( m90_video_control_w ); diff -Nru mame-0.144/src/mame/includes/m92.h mame-0.145/src/mame/includes/m92.h --- mame-0.144/src/mame/includes/m92.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/m92.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,6 +52,6 @@ WRITE16_HANDLER( m92_master_control_w ); VIDEO_START( m92 ); -SCREEN_UPDATE( m92 ); +SCREEN_UPDATE_IND16( m92 ); VIDEO_START( ppan ); -SCREEN_UPDATE( ppan ); +SCREEN_UPDATE_IND16( ppan ); diff -Nru mame-0.144/src/mame/includes/macrossp.h mame-0.145/src/mame/includes/macrossp.h --- mame-0.144/src/mame/includes/macrossp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/macrossp.h 2012-02-06 21:30:44.000000000 +0000 @@ -51,5 +51,5 @@ WRITE32_HANDLER( macrossp_text_videoram_w ); VIDEO_START(macrossp); -SCREEN_UPDATE(macrossp); -SCREEN_EOF(macrossp); +SCREEN_UPDATE_RGB32(macrossp); +SCREEN_VBLANK(macrossp); diff -Nru mame-0.144/src/mame/includes/madalien.h mame-0.145/src/mame/includes/madalien.h --- mame-0.144/src/mame/includes/madalien.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/madalien.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,7 +31,7 @@ tilemap_t *m_tilemap_fg; tilemap_t *m_tilemap_edge1[4]; tilemap_t *m_tilemap_edge2[4]; - bitmap_t *m_headlight_bitmap; + bitmap_ind16 *m_headlight_bitmap; }; diff -Nru mame-0.144/src/mame/includes/madmotor.h mame-0.145/src/mame/includes/madmotor.h --- mame-0.144/src/mame/includes/madmotor.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/madmotor.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ /*----------- defined in video/madmotor.c -----------*/ VIDEO_START( madmotor ); -SCREEN_UPDATE( madmotor ); +SCREEN_UPDATE_IND16( madmotor ); diff -Nru mame-0.144/src/mame/includes/magmax.h mame-0.145/src/mame/includes/magmax.h --- mame-0.144/src/mame/includes/magmax.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/magmax.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,11 +17,12 @@ UINT32 *m_prom_tab; UINT16 *m_spriteram; size_t m_spriteram_size; + bitmap_ind16 m_bitmap; }; /*----------- defined in video/magmax.c -----------*/ PALETTE_INIT( magmax ); -SCREEN_UPDATE( magmax ); +SCREEN_UPDATE_IND16( magmax ); VIDEO_START( magmax ); diff -Nru mame-0.144/src/mame/includes/mainevt.h mame-0.145/src/mame/includes/mainevt.h --- mame-0.144/src/mame/includes/mainevt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mainevt.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,6 +19,7 @@ /* misc */ int m_nmi_enable; + UINT8 m_sound_irq_mask; /* devices */ device_t *m_maincpu; @@ -39,5 +40,5 @@ VIDEO_START( mainevt ); VIDEO_START( dv ); -SCREEN_UPDATE( mainevt ); -SCREEN_UPDATE( dv ); +SCREEN_UPDATE_IND16( mainevt ); +SCREEN_UPDATE_IND16( dv ); diff -Nru mame-0.144/src/mame/includes/mainsnk.h mame-0.145/src/mame/includes/mainsnk.h --- mame-0.144/src/mame/includes/mainsnk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mainsnk.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,4 +22,4 @@ WRITE8_HANDLER(mainsnk_fgram_w); WRITE8_HANDLER(mainsnk_bgram_w); VIDEO_START(mainsnk); -SCREEN_UPDATE(mainsnk); +SCREEN_UPDATE_IND16(mainsnk); diff -Nru mame-0.144/src/mame/includes/malzak.h mame-0.145/src/mame/includes/malzak.h --- mame-0.144/src/mame/includes/malzak.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/malzak.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,4 +30,4 @@ WRITE8_HANDLER( malzak_playfield_w ); -SCREEN_UPDATE( malzak ); +SCREEN_UPDATE_IND16( malzak ); diff -Nru mame-0.144/src/mame/includes/mappy.h mame-0.145/src/mame/includes/mappy.h --- mame-0.144/src/mame/includes/mappy.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mappy.h 2012-02-06 21:30:44.000000000 +0000 @@ -7,10 +7,14 @@ UINT8 *m_videoram; UINT8 *m_spriteram; tilemap_t *m_bg_tilemap; - bitmap_t *m_sprite_bitmap; + bitmap_ind16 m_sprite_bitmap; UINT8 m_scroll; int m_mux; + + UINT8 m_main_irq_mask; + UINT8 m_sub_irq_mask; + UINT8 m_sub2_irq_mask; }; @@ -18,14 +22,14 @@ VIDEO_START( phozon ); PALETTE_INIT( phozon ); -SCREEN_UPDATE( phozon ); +SCREEN_UPDATE_IND16( phozon ); PALETTE_INIT( superpac ); PALETTE_INIT( mappy ); VIDEO_START( superpac ); VIDEO_START( mappy ); -SCREEN_UPDATE( superpac ); -SCREEN_UPDATE( mappy ); +SCREEN_UPDATE_IND16( superpac ); +SCREEN_UPDATE_IND16( mappy ); WRITE8_HANDLER( superpac_videoram_w ); WRITE8_HANDLER( mappy_videoram_w ); WRITE8_HANDLER( mappy_scroll_w ); diff -Nru mame-0.144/src/mame/includes/marineb.h mame-0.145/src/mame/includes/marineb.h --- mame-0.144/src/mame/includes/marineb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/marineb.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,6 +20,8 @@ /* devices */ device_t *m_maincpu; device_t *m_audiocpu; + + UINT8 m_irq_mask; }; @@ -35,8 +37,8 @@ PALETTE_INIT( marineb ); VIDEO_START( marineb ); -SCREEN_UPDATE( marineb ); -SCREEN_UPDATE( changes ); -SCREEN_UPDATE( springer ); -SCREEN_UPDATE( hoccer ); -SCREEN_UPDATE( hopprobo ); +SCREEN_UPDATE_IND16( marineb ); +SCREEN_UPDATE_IND16( changes ); +SCREEN_UPDATE_IND16( springer ); +SCREEN_UPDATE_IND16( hoccer ); +SCREEN_UPDATE_IND16( hopprobo ); diff -Nru mame-0.144/src/mame/includes/mario.h mame-0.145/src/mame/includes/mario.h --- mame-0.144/src/mame/includes/mario.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mario.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,6 +58,8 @@ size_t m_spriteram_size; tilemap_t *m_bg_tilemap; int m_monitor; + + UINT8 m_nmi_mask; }; /*----------- defined in video/mario.c -----------*/ @@ -70,7 +72,7 @@ PALETTE_INIT( mario ); VIDEO_START( mario ); -SCREEN_UPDATE( mario ); +SCREEN_UPDATE_IND16( mario ); /*----------- defined in audio/mario.c -----------*/ diff -Nru mame-0.144/src/mame/includes/markham.h mame-0.145/src/mame/includes/markham.h --- mame-0.144/src/mame/includes/markham.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/markham.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,4 +28,4 @@ PALETTE_INIT( markham ); VIDEO_START( markham ); -SCREEN_UPDATE( markham ); +SCREEN_UPDATE_IND16( markham ); diff -Nru mame-0.144/src/mame/includes/matmania.h mame-0.145/src/mame/includes/matmania.h --- mame-0.144/src/mame/includes/matmania.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/matmania.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,8 +22,8 @@ size_t m_spriteram_size; /* video-related */ - bitmap_t *m_tmpbitmap; - bitmap_t *m_tmpbitmap2; + bitmap_ind16 *m_tmpbitmap; + bitmap_ind16 *m_tmpbitmap2; /* mcu */ /* maniach 68705 protection */ @@ -67,6 +67,6 @@ WRITE8_HANDLER( matmania_paletteram_w ); PALETTE_INIT( matmania ); -SCREEN_UPDATE( maniach ); +SCREEN_UPDATE_IND16( maniach ); VIDEO_START( matmania ); -SCREEN_UPDATE( matmania ); +SCREEN_UPDATE_IND16( matmania ); diff -Nru mame-0.144/src/mame/includes/mcatadv.h mame-0.145/src/mame/includes/mcatadv.h --- mame-0.144/src/mame/includes/mcatadv.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mcatadv.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,9 +30,9 @@ /*----------- defined in video/mcatadv.c -----------*/ -SCREEN_UPDATE( mcatadv ); +SCREEN_UPDATE_IND16( mcatadv ); VIDEO_START( mcatadv ); -SCREEN_EOF( mcatadv ); +SCREEN_VBLANK( mcatadv ); WRITE16_HANDLER( mcatadv_videoram1_w ); WRITE16_HANDLER( mcatadv_videoram2_w ); diff -Nru mame-0.144/src/mame/includes/mcr3.h mame-0.145/src/mame/includes/mcr3.h --- mame-0.144/src/mame/includes/mcr3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mcr3.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,5 +38,5 @@ PALETTE_INIT( spyhunt ); -SCREEN_UPDATE( mcr3 ); -SCREEN_UPDATE( spyhunt ); +SCREEN_UPDATE_IND16( mcr3 ); +SCREEN_UPDATE_IND16( spyhunt ); diff -Nru mame-0.144/src/mame/includes/mcr68.h mame-0.145/src/mame/includes/mcr68.h --- mame-0.144/src/mame/includes/mcr68.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mcr68.h 2012-02-06 21:30:44.000000000 +0000 @@ -74,11 +74,11 @@ WRITE16_HANDLER( mcr68_videoram_w ); VIDEO_START( mcr68 ); -SCREEN_UPDATE( mcr68 ); +SCREEN_UPDATE_IND16( mcr68 ); WRITE16_HANDLER( zwackery_paletteram_w ); WRITE16_HANDLER( zwackery_videoram_w ); WRITE16_HANDLER( zwackery_spriteram_w ); VIDEO_START( zwackery ); -SCREEN_UPDATE( zwackery ); +SCREEN_UPDATE_IND16( zwackery ); diff -Nru mame-0.144/src/mame/includes/mcr.h mame-0.145/src/mame/includes/mcr.h --- mame-0.144/src/mame/includes/mcr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mcr.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,9 +17,13 @@ { public: mcr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_videoram; + + required_device m_maincpu; }; @@ -48,8 +52,8 @@ MACHINE_RESET( mcr ); MACHINE_START( nflfoot ); -INTERRUPT_GEN( mcr_interrupt ); -INTERRUPT_GEN( mcr_ipu_interrupt ); +TIMER_DEVICE_CALLBACK( mcr_interrupt ); +TIMER_DEVICE_CALLBACK( mcr_ipu_interrupt ); WRITE8_HANDLER( mcr_control_port_w ); @@ -73,4 +77,4 @@ WRITE8_HANDLER( twotiger_videoram_w ); WRITE8_HANDLER( mcr_91490_videoram_w ); -SCREEN_UPDATE( mcr ); +SCREEN_UPDATE_IND16( mcr ); diff -Nru mame-0.144/src/mame/includes/meadows.h mame-0.145/src/mame/includes/meadows.h --- mame-0.144/src/mame/includes/meadows.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/meadows.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,7 +42,7 @@ /*----------- defined in video/meadows.c -----------*/ VIDEO_START( meadows ); -SCREEN_UPDATE( meadows ); +SCREEN_UPDATE_IND16( meadows ); WRITE8_HANDLER( meadows_videoram_w ); WRITE8_HANDLER( meadows_spriteram_w ); diff -Nru mame-0.144/src/mame/includes/megadriv.h mame-0.145/src/mame/includes/megadriv.h --- mame-0.144/src/mame/includes/megadriv.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/megadriv.h 2012-02-06 21:30:44.000000000 +0000 @@ -66,8 +66,8 @@ MACHINE_START( megadriv ); MACHINE_RESET( megadriv ); VIDEO_START( megadriv ); -SCREEN_UPDATE( megadriv ); -SCREEN_EOF( megadriv ); +SCREEN_UPDATE_RGB32( megadriv ); +SCREEN_VBLANK( megadriv ); extern UINT16* megadrive_vdp_palette_lookup; diff -Nru mame-0.144/src/mame/includes/megasys1.h mame-0.145/src/mame/includes/megasys1.h --- mame-0.144/src/mame/includes/megasys1.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/megasys1.h 2012-02-06 21:30:44.000000000 +0000 @@ -57,8 +57,8 @@ /*----------- defined in video/megasys1.c -----------*/ VIDEO_START( megasys1 ); -SCREEN_UPDATE( megasys1 ); -SCREEN_EOF( megasys1 ); +SCREEN_UPDATE_IND16( megasys1 ); +SCREEN_VBLANK( megasys1 ); PALETTE_INIT( megasys1 ); diff -Nru mame-0.144/src/mame/includes/megazone.h mame-0.145/src/mame/includes/megazone.h --- mame-0.144/src/mame/includes/megazone.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/megazone.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,7 +23,7 @@ size_t m_videoram2_size; /* video-related */ - bitmap_t *m_tmpbitmap; + bitmap_ind16 *m_tmpbitmap; int m_flipscreen; /* misc */ @@ -33,6 +33,8 @@ cpu_device *m_maincpu; cpu_device *m_audiocpu; cpu_device *m_daccpu; + + UINT8 m_irq_mask; }; @@ -43,4 +45,4 @@ PALETTE_INIT( megazone ); VIDEO_START( megazone ); -SCREEN_UPDATE( megazone ); +SCREEN_UPDATE_IND16( megazone ); diff -Nru mame-0.144/src/mame/includes/mermaid.h mame-0.145/src/mame/includes/mermaid.h --- mame-0.144/src/mame/includes/mermaid.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mermaid.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,8 +23,8 @@ /* video-related */ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; - bitmap_t* m_helper; - bitmap_t* m_helper2; + bitmap_ind16 m_helper; + bitmap_ind16 m_helper2; int m_coll_bit0; int m_coll_bit1; int m_coll_bit2; @@ -46,6 +46,8 @@ device_t *m_maincpu; device_t *m_ay1; device_t *m_ay2; + + UINT8 m_nmi_mask; }; @@ -66,5 +68,5 @@ PALETTE_INIT( mermaid ); PALETTE_INIT( rougien ); VIDEO_START( mermaid ); -SCREEN_UPDATE( mermaid ); -SCREEN_EOF( mermaid ); +SCREEN_UPDATE_IND16( mermaid ); +SCREEN_VBLANK( mermaid ); diff -Nru mame-0.144/src/mame/includes/metlclsh.h mame-0.145/src/mame/includes/metlclsh.h --- mame-0.144/src/mame/includes/metlclsh.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/metlclsh.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ WRITE8_HANDLER( metlclsh_rambank_w ); VIDEO_START( metlclsh ); -SCREEN_UPDATE( metlclsh ); +SCREEN_UPDATE_IND16( metlclsh ); diff -Nru mame-0.144/src/mame/includes/metro.h mame-0.145/src/mame/includes/metro.h --- mame-0.144/src/mame/includes/metro.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/metro.h 2012-02-06 21:30:44.000000000 +0000 @@ -55,6 +55,8 @@ int m_sprite_xoffs; int m_sprite_yoffs; + UINT8 * m_expanded_gfx1; + /* blitter */ int m_blitter_bit; @@ -96,6 +98,6 @@ VIDEO_START( blzntrnd ); VIDEO_START( gstrik2 ); -SCREEN_UPDATE( metro ); +SCREEN_UPDATE_IND16( metro ); -void metro_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +void metro_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); diff -Nru mame-0.144/src/mame/includes/mexico86.h mame-0.145/src/mame/includes/mexico86.h --- mame-0.144/src/mame/includes/mexico86.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mexico86.h 2012-02-06 21:30:44.000000000 +0000 @@ -59,5 +59,5 @@ WRITE8_HANDLER( mexico86_bankswitch_w ); -SCREEN_UPDATE( mexico86 ); -SCREEN_UPDATE( kikikai ); +SCREEN_UPDATE_IND16( mexico86 ); +SCREEN_UPDATE_IND16( kikikai ); diff -Nru mame-0.144/src/mame/includes/micro3d.h mame-0.145/src/mame/includes/micro3d.h --- mame-0.144/src/mame/includes/micro3d.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/micro3d.h 2012-02-06 21:30:44.000000000 +0000 @@ -143,7 +143,7 @@ VIDEO_RESET( micro3d ); void micro3d_tms_interrupt(device_t *device, int state); -void micro3d_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void micro3d_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); WRITE16_HANDLER( micro3d_clut_w ); WRITE16_HANDLER( micro3d_creg_w ); diff -Nru mame-0.144/src/mame/includes/midtunit.h mame-0.145/src/mame/includes/midtunit.h --- mame-0.144/src/mame/includes/midtunit.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/midtunit.h 2012-02-06 21:30:44.000000000 +0000 @@ -71,5 +71,5 @@ READ16_HANDLER( midtunit_dma_r ); WRITE16_HANDLER( midtunit_dma_w ); -void midtunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); -void midxunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void midtunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); +void midxunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); diff -Nru mame-0.144/src/mame/includes/midvunit.h mame-0.145/src/mame/includes/midvunit.h --- mame-0.144/src/mame/includes/midvunit.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/midvunit.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,10 +4,36 @@ **************************************************************************/ -#include "video/poly.h" +#include "video/polynew.h" #define MIDVUNIT_VIDEO_CLOCK 33000000 +struct midvunit_object_data +{ + UINT16 * destbase; + UINT8 * texbase; + UINT16 pixdata; + UINT8 dither; +}; + +class midvunit_state; + +class midvunit_renderer : public poly_manager +{ +public: + midvunit_renderer(midvunit_state &state); + void process_dma_queue(); + void make_vertices_inclusive(vertex_t *vert); + +private: + midvunit_state &m_state; + + void render_flat(INT32 scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); + void render_tex(INT32 scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); + void render_textrans(INT32 scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); + void render_textransmask(INT32 scanline, const extent_t &extent, const midvunit_object_data &extradata, int threadid); +}; + class midvunit_state : public driver_device { public: @@ -39,7 +65,7 @@ UINT16 m_page_control; UINT8 m_video_changed; emu_timer *m_scanline_timer; - poly_manager *m_poly; + midvunit_renderer *m_poly; }; @@ -65,4 +91,4 @@ READ32_HANDLER( midvunit_textureram_r ); VIDEO_START( midvunit ); -SCREEN_UPDATE( midvunit ); +SCREEN_UPDATE_IND16( midvunit ); diff -Nru mame-0.144/src/mame/includes/midyunit.h mame-0.145/src/mame/includes/midyunit.h --- mame-0.144/src/mame/includes/midyunit.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/midyunit.h 2012-02-06 21:30:44.000000000 +0000 @@ -108,4 +108,4 @@ READ16_HANDLER( midyunit_dma_r ); WRITE16_HANDLER( midyunit_dma_w ); -void midyunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params); +void midyunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); diff -Nru mame-0.144/src/mame/includes/midzeus.h mame-0.145/src/mame/includes/midzeus.h --- mame-0.144/src/mame/includes/midzeus.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/midzeus.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ extern UINT32 *zeusbase; VIDEO_START( midzeus ); -SCREEN_UPDATE( midzeus ); +SCREEN_UPDATE_IND16( midzeus ); READ32_HANDLER( zeus_r ); WRITE32_HANDLER( zeus_w ); @@ -30,7 +30,7 @@ /*----------- defined in video/midzeus2.c -----------*/ VIDEO_START( midzeus2 ); -SCREEN_UPDATE( midzeus2 ); +SCREEN_UPDATE_RGB32( midzeus2 ); READ32_HANDLER( zeus2_r ); WRITE32_HANDLER( zeus2_w ); diff -Nru mame-0.144/src/mame/includes/mikie.h mame-0.145/src/mame/includes/mikie.h --- mame-0.144/src/mame/includes/mikie.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mikie.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,8 @@ /* devices */ cpu_device *m_maincpu; cpu_device *m_audiocpu; + + UINT8 m_irq_mask; }; @@ -38,4 +40,4 @@ PALETTE_INIT( mikie ); VIDEO_START( mikie ); -SCREEN_UPDATE( mikie ); +SCREEN_UPDATE_IND16( mikie ); diff -Nru mame-0.144/src/mame/includes/mitchell.h mame-0.145/src/mame/includes/mitchell.h --- mame-0.144/src/mame/includes/mitchell.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mitchell.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,6 +11,7 @@ public: mitchell_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_oki(*this, "oki") { } @@ -38,10 +39,12 @@ int m_keymatrix; /* devices */ + required_device m_maincpu; optional_device m_audiocpu; optional_device m_oki; UINT8 *m_nvram; size_t m_nvram_size; + UINT8 m_irq_source; }; @@ -68,4 +71,4 @@ WRITE8_HANDLER( mstworld_video_bank_w ); VIDEO_START( pang ); -SCREEN_UPDATE( pang ); +SCREEN_UPDATE_IND16( pang ); diff -Nru mame-0.144/src/mame/includes/mjkjidai.h mame-0.145/src/mame/includes/mjkjidai.h --- mame-0.144/src/mame/includes/mjkjidai.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mjkjidai.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,13 +15,15 @@ size_t m_nvram_size; int m_display_enable; tilemap_t *m_bg_tilemap; + + UINT8 m_nmi_mask; }; /*----------- defined in video/mjkjidai.c -----------*/ VIDEO_START( mjkjidai ); -SCREEN_UPDATE( mjkjidai ); +SCREEN_UPDATE_IND16( mjkjidai ); WRITE8_HANDLER( mjkjidai_videoram_w ); WRITE8_HANDLER( mjkjidai_ctrl_w ); diff -Nru mame-0.144/src/mame/includes/model1.h mame-0.145/src/mame/includes/model1.h --- mame-0.144/src/mame/includes/model1.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/model1.h 2012-02-06 21:30:44.000000000 +0000 @@ -1,3 +1,5 @@ +#include "audio/dsbz80.h" + typedef void (*tgp_func)(running_machine &machine); enum {FIFO_SIZE = 256}; @@ -7,7 +9,15 @@ { public: model1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "maincpu"), + m_dsbz80(*this, DSBZ80_TAG) + { } + + required_device m_maincpu; // V60 + required_device m_audiocpu; // sound 68000 + optional_device m_dsbz80; // Digital Sound Board struct view *m_view; struct point *m_pointdb; @@ -112,8 +122,8 @@ /*----------- defined in video/model1.c -----------*/ VIDEO_START(model1); -SCREEN_UPDATE(model1); -SCREEN_EOF(model1); +SCREEN_UPDATE_RGB32(model1); +SCREEN_VBLANK(model1); READ16_HANDLER( model1_listctl_r ); WRITE16_HANDLER( model1_listctl_w ); diff -Nru mame-0.144/src/mame/includes/model2.h mame-0.145/src/mame/includes/model2.h --- mame-0.144/src/mame/includes/model2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/model2.h 2012-02-06 21:30:44.000000000 +0000 @@ -9,7 +9,9 @@ { public: model2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT32 *m_workram; UINT32 m_intreq; @@ -64,13 +66,15 @@ poly_manager *m_poly; raster_state *m_raster; geo_state *m_geo; - bitmap_t *m_sys24_bitmap; + bitmap_rgb32 m_sys24_bitmap; + + required_device m_maincpu; }; /*----------- defined in video/model2.c -----------*/ VIDEO_START(model2); -SCREEN_UPDATE(model2); +SCREEN_UPDATE_RGB32(model2); void model2_3d_set_zclip( running_machine &machine, UINT8 clip ); diff -Nru mame-0.144/src/mame/includes/model3.h mame-0.145/src/mame/includes/model3.h --- mame-0.144/src/mame/includes/model3.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/model3.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,7 +14,9 @@ { public: model3_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_sound_irq_enable; emu_timer *m_sound_timer; @@ -50,7 +52,6 @@ UINT64 *m_network_ram; int m_prot_data_ptr; int m_scsp_last_line; - int m_vblank; UINT32 *m_vrom; int m_step; UINT64 *m_paletteram64; @@ -77,8 +78,8 @@ UINT32 *m_polygon_ram; UINT16 *m_pal_lookup; int m_real3d_display_list; - bitmap_t *m_bitmap3d; - bitmap_t *m_zbuffer; + bitmap_ind16 m_bitmap3d; + bitmap_ind32 m_zbuffer; rectangle m_clip3d; rectangle *m_screen_clip; VECTOR3 m_parallel_light; @@ -100,6 +101,8 @@ PLANE m_clip_plane[5]; UINT32 m_matrix_base_address; cached_texture *m_texcache[2][1024/32][2048/32]; + + required_device m_maincpu; }; @@ -130,7 +133,7 @@ WRITE64_HANDLER(model3_palette_w); VIDEO_START(model3); -SCREEN_UPDATE(model3); +SCREEN_UPDATE_IND16(model3); WRITE64_HANDLER(real3d_cmd_w); WRITE64_HANDLER(real3d_display_list_w); diff -Nru mame-0.144/src/mame/includes/momoko.h mame-0.145/src/mame/includes/momoko.h --- mame-0.144/src/mame/includes/momoko.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/momoko.h 2012-02-06 21:30:44.000000000 +0000 @@ -46,4 +46,4 @@ WRITE8_HANDLER( momoko_bg_select_w); WRITE8_HANDLER( momoko_bg_priority_w); -SCREEN_UPDATE( momoko ); +SCREEN_UPDATE_IND16( momoko ); diff -Nru mame-0.144/src/mame/includes/moo.h mame-0.145/src/mame/includes/moo.h --- mame-0.144/src/mame/includes/moo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/moo.h 2012-02-06 21:30:44.000000000 +0000 @@ -46,4 +46,4 @@ extern void moo_sprite_callback(running_machine &machine, int *code, int *color, int *priority_mask); VIDEO_START(moo); -SCREEN_UPDATE(moo); +SCREEN_UPDATE_RGB32(moo); diff -Nru mame-0.144/src/mame/includes/mosaic.h mame-0.145/src/mame/includes/mosaic.h --- mame-0.144/src/mame/includes/mosaic.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mosaic.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,4 +30,4 @@ WRITE8_HANDLER( mosaic_bgvideoram_w ); VIDEO_START( mosaic ); -SCREEN_UPDATE( mosaic ); +SCREEN_UPDATE_IND16( mosaic ); diff -Nru mame-0.144/src/mame/includes/mouser.h mame-0.145/src/mame/includes/mouser.h --- mame-0.144/src/mame/includes/mouser.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mouser.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,4 +31,4 @@ WRITE8_HANDLER( mouser_flip_screen_y_w ); PALETTE_INIT( mouser ); -SCREEN_UPDATE( mouser ); +SCREEN_UPDATE_IND16( mouser ); diff -Nru mame-0.144/src/mame/includes/mpu4.h mame-0.145/src/mame/includes/mpu4.h --- mame-0.144/src/mame/includes/mpu4.h 2012-01-13 15:34:57.000000000 +0000 +++ mame-0.145/src/mame/includes/mpu4.h 2012-02-06 21:30:44.000000000 +0000 @@ -98,6 +98,11 @@ mpu4_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) + { + return 0; + } + int m_mod_number; int m_mmtr_data; int m_alpha_data_line; diff -Nru mame-0.144/src/mame/includes/mrdo.h mame-0.145/src/mame/includes/mrdo.h --- mame-0.144/src/mame/includes/mrdo.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mrdo.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,4 +33,4 @@ PALETTE_INIT( mrdo ); VIDEO_START( mrdo ); -SCREEN_UPDATE( mrdo ); +SCREEN_UPDATE_IND16( mrdo ); diff -Nru mame-0.144/src/mame/includes/mrflea.h mame-0.145/src/mame/includes/mrflea.h --- mame-0.144/src/mame/includes/mrflea.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mrflea.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ WRITE8_HANDLER( mrflea_videoram_w ); WRITE8_HANDLER( mrflea_spriteram_w ); -SCREEN_UPDATE( mrflea ); +SCREEN_UPDATE_IND16( mrflea ); diff -Nru mame-0.144/src/mame/includes/mrjong.h mame-0.145/src/mame/includes/mrjong.h --- mame-0.144/src/mame/includes/mrjong.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mrjong.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ PALETTE_INIT( mrjong ); VIDEO_START( mrjong ); -SCREEN_UPDATE( mrjong ); +SCREEN_UPDATE_IND16( mrjong ); diff -Nru mame-0.144/src/mame/includes/ms32.h mame-0.145/src/mame/includes/ms32.h --- mame-0.144/src/mame/includes/ms32.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ms32.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,9 +26,9 @@ UINT32 *m_tx_scroll; UINT32 *m_bg_scroll; UINT32 *m_mainram; - bitmap_t* m_temp_bitmap_tilemaps; - bitmap_t* m_temp_bitmap_sprites; - bitmap_t* m_temp_bitmap_sprites_pri; + bitmap_ind16 m_temp_bitmap_tilemaps; + bitmap_ind16 m_temp_bitmap_sprites; + bitmap_ind8 m_temp_bitmap_sprites_pri; int m_reverse_sprite_order; int m_flipscreen; UINT32 m_brt[4]; @@ -48,4 +48,4 @@ WRITE32_HANDLER( ms32_gfxctrl_w ); VIDEO_START( ms32 ); VIDEO_START( f1superb ); -SCREEN_UPDATE( ms32 ); +SCREEN_UPDATE_RGB32( ms32 ); diff -Nru mame-0.144/src/mame/includes/msisaac.h mame-0.145/src/mame/includes/msisaac.h --- mame-0.144/src/mame/includes/msisaac.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/msisaac.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,8 +17,8 @@ size_t m_spriteram2_size; /* video-related */ - bitmap_t *m_tmp_bitmap1; - bitmap_t *m_tmp_bitmap2; + bitmap_ind16 *m_tmp_bitmap1; + bitmap_ind16 *m_tmp_bitmap2; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; tilemap_t *m_bg2_tilemap; @@ -59,5 +59,5 @@ WRITE8_HANDLER( msisaac_bg2_videoram_w ); WRITE8_HANDLER( msisaac_fg_videoram_w ); -SCREEN_UPDATE( msisaac ); +SCREEN_UPDATE_IND16( msisaac ); VIDEO_START( msisaac ); diff -Nru mame-0.144/src/mame/includes/mugsmash.h mame-0.145/src/mame/includes/mugsmash.h --- mame-0.144/src/mame/includes/mugsmash.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/mugsmash.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ /*----------- defined in video/mugsmash.c -----------*/ VIDEO_START( mugsmash ); -SCREEN_UPDATE( mugsmash ); +SCREEN_UPDATE_IND16( mugsmash ); WRITE16_HANDLER( mugsmash_reg_w ); WRITE16_HANDLER( mugsmash_videoram2_w ); diff -Nru mame-0.144/src/mame/includes/munchmo.h mame-0.145/src/mame/includes/munchmo.h --- mame-0.144/src/mame/includes/munchmo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/munchmo.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,14 +19,12 @@ UINT8 * m_videoram; /* video-related */ - bitmap_t *m_tmpbitmap; + bitmap_ind16 *m_tmpbitmap; int m_palette_bank; int m_flipscreen; /* misc */ int m_nmi_enable; - int m_which; - UINT8 m_sound_nmi_enable; /* devices */ device_t *m_maincpu; @@ -41,4 +39,4 @@ PALETTE_INIT( mnchmobl ); VIDEO_START( mnchmobl ); -SCREEN_UPDATE( mnchmobl ); +SCREEN_UPDATE_IND16( mnchmobl ); diff -Nru mame-0.144/src/mame/includes/mustache.h mame-0.145/src/mame/includes/mustache.h --- mame-0.144/src/mame/includes/mustache.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mustache.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,5 +19,5 @@ WRITE8_HANDLER( mustache_scroll_w ); WRITE8_HANDLER( mustache_video_control_w ); VIDEO_START( mustache ); -SCREEN_UPDATE( mustache ); +SCREEN_UPDATE_IND16( mustache ); PALETTE_INIT( mustache ); diff -Nru mame-0.144/src/mame/includes/mw8080bw.h mame-0.145/src/mame/includes/mw8080bw.h --- mame-0.144/src/mame/includes/mw8080bw.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/mw8080bw.h 2012-02-06 21:30:44.000000000 +0000 @@ -225,11 +225,11 @@ /*----------- defined in video/mw8080bw.c -----------*/ -SCREEN_UPDATE( mw8080bw ); +SCREEN_UPDATE_RGB32( mw8080bw ); -SCREEN_UPDATE( spcenctr ); +SCREEN_UPDATE_RGB32( spcenctr ); -SCREEN_UPDATE( phantom2 ); -SCREEN_EOF( phantom2 ); +SCREEN_UPDATE_RGB32( phantom2 ); +SCREEN_VBLANK( phantom2 ); -SCREEN_UPDATE( invaders ); +SCREEN_UPDATE_RGB32( invaders ); diff -Nru mame-0.144/src/mame/includes/mystwarr.h mame-0.145/src/mame/includes/mystwarr.h --- mame-0.144/src/mame/includes/mystwarr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/mystwarr.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: mystwarr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_gx_workram; UINT8 m_mw_irq_control; @@ -19,6 +21,8 @@ tilemap_t *m_ult_936_tilemap; UINT16 m_clip; UINT16 *m_spriteram; + + required_device m_maincpu; }; @@ -30,10 +34,10 @@ VIDEO_START( metamrph ); VIDEO_START( martchmp ); VIDEO_START( mystwarr ); -SCREEN_UPDATE( dadandrn ); -SCREEN_UPDATE( mystwarr ); -SCREEN_UPDATE( metamrph ); -SCREEN_UPDATE( martchmp ); +SCREEN_UPDATE_RGB32( dadandrn ); +SCREEN_UPDATE_RGB32( mystwarr ); +SCREEN_UPDATE_RGB32( metamrph ); +SCREEN_UPDATE_RGB32( martchmp ); WRITE16_HANDLER( ddd_053936_enable_w ); WRITE16_HANDLER( ddd_053936_clip_w ); diff -Nru mame-0.144/src/mame/includes/n64.h mame-0.145/src/mame/includes/n64.h --- mame-0.144/src/mame/includes/n64.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/n64.h 2012-02-06 21:30:44.000000000 +0000 @@ -3,6 +3,10 @@ #include "cpu/rsp/rsp.h" #include "video/n64.h" +#include "sound/dmadac.h" +#include "includes/n64.h" + +/*----------- forward decls -----------*/ /*----------- driver state -----------*/ @@ -16,15 +20,181 @@ N64::RDP::Processor m_rdp; }; +/*----------- devices -----------*/ + +#define MCFG_N64_PERIPHS_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, N64PERIPH, 0) + +#define AUDIO_DMA_DEPTH 2 + +class n64_periphs : public device_t +{ +private: + typedef struct + { + UINT32 address; + UINT32 length; + } AUDIO_DMA; + +public: + // construction/destruction + n64_periphs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ32_MEMBER( is64_r ); + DECLARE_WRITE32_MEMBER( is64_w ); + DECLARE_READ32_MEMBER( open_r ); + DECLARE_WRITE32_MEMBER( open_w ); + DECLARE_READ32_MEMBER( rdram_reg_r ); + DECLARE_WRITE32_MEMBER( rdram_reg_w ); + DECLARE_READ32_MEMBER( mi_reg_r ); + DECLARE_WRITE32_MEMBER( mi_reg_w ); + DECLARE_READ32_MEMBER( vi_reg_r ); + DECLARE_WRITE32_MEMBER( vi_reg_w ); + DECLARE_READ32_MEMBER( ai_reg_r ); + DECLARE_WRITE32_MEMBER( ai_reg_w ); + DECLARE_READ32_MEMBER( pi_reg_r ); + DECLARE_WRITE32_MEMBER( pi_reg_w ); + DECLARE_READ32_MEMBER( ri_reg_r ); + DECLARE_WRITE32_MEMBER( ri_reg_w ); + DECLARE_READ32_MEMBER( si_reg_r ); + DECLARE_WRITE32_MEMBER( si_reg_w ); + DECLARE_READ32_MEMBER( pif_ram_r ); + DECLARE_WRITE32_MEMBER( pif_ram_w ); + + UINT32 sp_reg_r(UINT32 offset); + void sp_reg_w(UINT32 offset, UINT32 data, UINT32 mem_mask); + + void sp_set_status(UINT32 status); + void signal_rcp_interrupt(int interrupt); + + void ai_timer_tick(); + void pi_dma_tick(); + + // Video Interface (VI) registers + UINT32 vi_width; + UINT32 vi_origin; + UINT32 vi_control; + UINT32 vi_blank; + UINT32 vi_hstart; + UINT32 vi_vstart; + UINT32 vi_xscale; + UINT32 vi_yscale; + UINT32 vi_burst; + UINT32 vi_vsync; + UINT32 vi_hsync; + UINT32 vi_leap; + UINT32 vi_intr; + UINT32 vi_vburst; + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + address_space *mem_map; + device_t *maincpu; + device_t *rspcpu; + + void clear_rcp_interrupt(int interrupt); + + UINT8 is64_buffer[0x10000]; + + // Audio Interface (AI) registers and functions + void ai_dma(); + AUDIO_DMA *ai_fifo_get_top(); + void ai_fifo_push(UINT32 address, UINT32 length); + void ai_fifo_pop(); + + dmadac_sound_device *ai_dac[2]; + UINT32 ai_dram_addr; + UINT32 ai_len; + UINT32 ai_control; + int ai_dacrate; + int ai_bitrate; + UINT32 ai_status; + + emu_timer *ai_timer; + + AUDIO_DMA ai_fifo[AUDIO_DMA_DEPTH]; + int ai_fifo_wpos; + int ai_fifo_rpos; + int ai_fifo_num; + + // Memory Interface (MI) registers + UINT32 mi_version; + UINT32 mi_interrupt; + UINT32 mi_intr_mask; + UINT32 mi_mode; + + // RDRAM Interface (RI) registers + UINT32 rdram_regs[10]; + UINT32 ri_regs[8]; + + // RSP Interface (SP) registers + void sp_dma(int direction); + + UINT32 sp_mem_addr; + UINT32 sp_dram_addr; + int sp_dma_length; + int sp_dma_count; + int sp_dma_skip; + UINT32 sp_semaphore; + UINT32 dp_clock; + + // Peripheral Interface (PI) registers and functions + void pi_dma(); + emu_timer *pi_dma_timer; + UINT32 pi_dram_addr; + UINT32 pi_cart_addr; + UINT32 pi_first_dma; + UINT32 pi_rd_len; + UINT32 pi_wr_len; + UINT32 pi_status; + UINT32 pi_bsd_dom1_lat; + UINT32 pi_bsd_dom1_pwd; + UINT32 pi_bsd_dom1_pgs; + UINT32 pi_bsd_dom1_rls; + UINT32 pi_bsd_dom2_lat; + UINT32 pi_bsd_dom2_pwd; + UINT32 pi_bsd_dom2_pgs; + UINT32 pi_bsd_dom2_rls; + UINT32 pi_dma_dir; + + // Serial Interface (SI) registers and functions + void pif_dma(int direction); + void handle_pif(); + int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, int rlength, UINT8 *rdata); + UINT8 calc_mempack_crc(UINT8 *buffer, int length); + UINT8 pif_ram[0x40]; + UINT8 pif_cmd[0x40]; + UINT32 si_dram_addr; + UINT32 si_pif_addr; + UINT32 si_pif_addr_rd64b; + UINT32 si_pif_addr_wr64b; + UINT32 si_status; + UINT8 eeprom[512]; + UINT8 mempack[0x8000]; + UINT32 cic_status; + + // Video Interface (VI) functions + void vi_recalculate_resolution(); +}; + +// device type definition +extern const device_type N64PERIPH; + /*----------- defined in video/n64.c -----------*/ extern VIDEO_START( n64 ); -extern SCREEN_UPDATE( n64 ); +extern SCREEN_UPDATE_RGB32( n64 ); #define DACRATE_NTSC (48681812) #define DACRATE_PAL (49656530) #define DACRATE_MPAL (48628316) +/*----------- defined in machine/n64.c -----------*/ + #define SP_INTERRUPT 0x1 #define SI_INTERRUPT 0x2 #define AI_INTERRUPT 0x4 @@ -52,53 +222,19 @@ #define DP_STATUS_FREEZE 0x02 #define DP_STATUS_FLUSH 0x04 -/*----------- defined in machine/n64.c -----------*/ - extern const rsp_config n64_rsp_config; extern UINT32 *rdram; extern UINT32 *rsp_imem; extern UINT32 *rsp_dmem; -extern UINT32 n64_vi_width; -extern UINT32 n64_vi_origin; -extern UINT32 n64_vi_control; -extern UINT32 n64_vi_blank; -extern UINT32 n64_vi_hstart; -extern UINT32 n64_vi_vstart; -extern UINT32 n64_vi_xscale; -extern UINT32 n64_vi_yscale; - extern void dp_full_sync(running_machine &machine); extern void signal_rcp_interrupt(running_machine &machine, int interrupt); -extern void clear_rcp_interrupt(running_machine &machine, int interrupt); - -/* read/write handlers for the N64 subsystems */ -extern READ32_HANDLER( n64_is64_r ); -extern WRITE32_HANDLER( n64_is64_w ); -extern READ32_HANDLER( n64_open_r ); -extern WRITE32_HANDLER( n64_open_w ); -extern READ32_HANDLER( n64_rdram_reg_r ); -extern WRITE32_HANDLER( n64_rdram_reg_w ); -extern READ32_HANDLER( n64_mi_reg_r ); -extern WRITE32_HANDLER( n64_mi_reg_w ); extern READ32_DEVICE_HANDLER( n64_sp_reg_r ); extern WRITE32_DEVICE_HANDLER( n64_sp_reg_w ); extern READ32_DEVICE_HANDLER( n64_dp_reg_r ); extern WRITE32_DEVICE_HANDLER( n64_dp_reg_w ); -extern READ32_HANDLER( n64_vi_reg_r ); -extern WRITE32_HANDLER( n64_vi_reg_w ); -extern READ32_HANDLER( n64_ai_reg_r ); -extern WRITE32_HANDLER( n64_ai_reg_w ); -extern READ32_HANDLER( n64_pi_reg_r ); -extern WRITE32_HANDLER( n64_pi_reg_w ); -extern READ32_HANDLER( n64_ri_reg_r ); -extern WRITE32_HANDLER( n64_ri_reg_w ); -extern READ32_HANDLER( n64_si_reg_r ); -extern WRITE32_HANDLER( n64_si_reg_w ); -extern READ32_HANDLER( n64_pif_ram_r ); -extern WRITE32_HANDLER( n64_pif_ram_w ); MACHINE_START( n64 ); MACHINE_RESET( n64 ); diff -Nru mame-0.144/src/mame/includes/n8080.h mame-0.145/src/mame/includes/n8080.h --- mame-0.144/src/mame/includes/n8080.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/n8080.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,10 +52,10 @@ VIDEO_START( spacefev ); VIDEO_START( sheriff ); VIDEO_START( helifire ); -SCREEN_UPDATE( spacefev ); -SCREEN_UPDATE( sheriff ); -SCREEN_UPDATE( helifire ); -SCREEN_EOF( helifire ); +SCREEN_UPDATE_IND16( spacefev ); +SCREEN_UPDATE_IND16( sheriff ); +SCREEN_UPDATE_IND16( helifire ); +SCREEN_VBLANK( helifire ); void spacefev_start_red_cannon(running_machine &machine); diff -Nru mame-0.144/src/mame/includes/namcofl.h mame-0.145/src/mame/includes/namcofl.h --- mame-0.144/src/mame/includes/namcofl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namcofl.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,19 +17,25 @@ { public: namcofl_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_mcu(*this,"mcu") + { } emu_timer *m_raster_interrupt_timer; UINT32 *m_workram; UINT16 *m_shareram; UINT8 m_mcu_port6; UINT32 m_sprbank; + + required_device m_maincpu; + required_device m_mcu; }; /*----------- defined in video/namcofl.c -----------*/ VIDEO_START( namcofl ); -SCREEN_UPDATE( namcofl ); +SCREEN_UPDATE_IND16( namcofl ); WRITE32_HANDLER( namcofl_spritebank_w ); diff -Nru mame-0.144/src/mame/includes/namcoic.h mame-0.145/src/mame/includes/namcoic.h --- mame-0.144/src/mame/includes/namcoic.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namcoic.h 2012-02-06 21:30:44.000000000 +0000 @@ -93,7 +93,7 @@ void namco_tilemap_init( running_machine &machine, int gfxbank, void *pMaskROM, void (*cb)( running_machine &machine, UINT16 code, int *gfx, int *mask) ); -void namco_tilemap_draw( bitmap_t *bitmap, const rectangle *cliprect, int pri ); +void namco_tilemap_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); void namco_tilemap_invalidate( void ); WRITE16_HANDLER( namco_tilemapvideoram16_w ); READ16_HANDLER( namco_tilemapvideoram16_r ); @@ -113,16 +113,17 @@ /***********************************************************************************/ /* Namco System II Sprite Rendering */ -void namcos2_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int control ); +void namcos2_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int control ); -void namcos2_draw_sprites_metalhawk( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ); +void namcos2_draw_sprites_metalhawk( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); /***********************************************************************************/ /* C355 Motion Object Emulation */ /* for palXOR, supply either 0x0 (normal) or 0xf (palette mapping reversed) */ void namco_obj_init( running_machine &machine, int gfxbank, int palXOR, int (*code2tile)( running_machine &machine, int code ) ); -void namco_obj_draw( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ); +void namco_obj_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); +void namco_obj_draw( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri ); WRITE16_HANDLER( namco_obj16_w ); READ16_HANDLER( namco_obj16_r ); @@ -142,7 +143,7 @@ /* C169 ROZ Layer Emulation */ void namco_roz_init( running_machine &machine, int gfxbank, const char *maskregion ); -void namco_roz_draw( bitmap_t *bitmap, const rectangle *cliprect, int pri ); +void namco_roz_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); READ16_HANDLER( namco_rozcontrol16_r ); WRITE16_HANDLER( namco_rozcontrol16_w ); @@ -165,7 +166,7 @@ void namco_road_init( running_machine &machine, int gfxbank ); void namco_road_set_transparent_color(pen_t pen); -void namco_road_draw( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ); +void namco_road_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ); READ16_HANDLER( namco_road16_r ); WRITE16_HANDLER( namco_road16_w ); diff -Nru mame-0.144/src/mame/includes/namcona1.h mame-0.145/src/mame/includes/namcona1.h --- mame-0.144/src/mame/includes/namcona1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namcona1.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,7 +20,10 @@ { public: namcona1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_mcu(*this,"mcu") + { } UINT16 *m_videoram; UINT16 *m_spriteram; @@ -48,6 +51,9 @@ int m_palette_is_dirty; UINT8 m_mask_data[8]; UINT8 m_conv_data[9]; + + required_device m_maincpu; + required_device m_mcu; }; @@ -63,5 +69,5 @@ extern READ16_HANDLER( namcona1_paletteram_r ); extern WRITE16_HANDLER( namcona1_paletteram_w ); -extern SCREEN_UPDATE( namcona1 ); +extern SCREEN_UPDATE_IND16( namcona1 ); extern VIDEO_START( namcona1 ); diff -Nru mame-0.144/src/mame/includes/namconb1.h mame-0.145/src/mame/includes/namconb1.h --- mame-0.144/src/mame/includes/namconb1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namconb1.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,10 @@ { public: namconb1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_mcu(*this,"mcu") + { } UINT32 *m_nvmem32; UINT16 *m_namconb_shareram; @@ -29,13 +32,16 @@ UINT32 *m_spritebank32; UINT32 *m_tilebank32; UINT32 m_tilemap_tile_bank[4]; + + required_device m_maincpu; + required_device m_mcu; }; /*----------- defined in video/namconb1.c -----------*/ -SCREEN_UPDATE( namconb1 ); +SCREEN_UPDATE_IND16( namconb1 ); VIDEO_START( namconb1 ); -SCREEN_UPDATE( namconb2 ); +SCREEN_UPDATE_IND16( namconb2 ); VIDEO_START( namconb2 ); diff -Nru mame-0.144/src/mame/includes/namcos1.h mame-0.145/src/mame/includes/namcos1.h --- mame-0.144/src/mame/includes/namcos1.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/namcos1.h 2012-02-06 21:30:44.000000000 +0000 @@ -102,5 +102,5 @@ WRITE8_HANDLER( namcos1_spriteram_w ); VIDEO_START( namcos1 ); -SCREEN_UPDATE( namcos1 ); -SCREEN_EOF( namcos1 ); +SCREEN_UPDATE_IND16( namcos1 ); +SCREEN_VBLANK( namcos1 ); diff -Nru mame-0.144/src/mame/includes/namcos21.h mame-0.145/src/mame/includes/namcos21.h --- mame-0.144/src/mame/includes/namcos21.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/namcos21.h 2012-02-06 21:30:44.000000000 +0000 @@ -79,4 +79,4 @@ extern WRITE16_HANDLER(winrun_gpu_register_w); extern VIDEO_START( namcos21 ) ; -extern SCREEN_UPDATE( namcos21 ); +extern SCREEN_UPDATE_IND16( namcos21 ); diff -Nru mame-0.144/src/mame/includes/namcos22.h mame-0.145/src/mame/includes/namcos22.h --- mame-0.144/src/mame/includes/namcos22.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/namcos22.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,7 +54,6 @@ int m_mRenderBufSize; UINT16 m_mRenderBufData[MAX_RENDER_CMD_SEQ]; UINT32 m_mSys22PortBits; - int m_mFrameCount; int m_irq_state; int m_mDspUploadState; int m_mUploadDestIdx; @@ -105,7 +104,7 @@ const UINT8 *m_mpPolyM; const UINT8 *m_mpPolyL; UINT8 *m_dirtypal; - bitmap_t *m_mix_bitmap; + bitmap_ind16 *m_mix_bitmap; tilemap_t *m_bgtilemap; }; @@ -145,10 +144,10 @@ VIDEO_START( namcos22 ); -SCREEN_UPDATE( namcos22 ); +SCREEN_UPDATE_RGB32( namcos22 ); VIDEO_START( namcos22s ); -SCREEN_UPDATE( namcos22s ); +SCREEN_UPDATE_RGB32( namcos22s ); void namcos22_draw_direct_poly( running_machine &machine, const UINT16 *pSource ); UINT32 namcos22_point_rom_r( running_machine &machine, offs_t offs ); diff -Nru mame-0.144/src/mame/includes/namcos2.h mame-0.145/src/mame/includes/namcos2.h --- mame-0.144/src/mame/includes/namcos2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namcos2.h 2012-02-06 21:30:44.000000000 +0000 @@ -90,19 +90,19 @@ #define NAMCOS21_NUM_COLORS 0x8000 VIDEO_START( namcos2 ); -SCREEN_UPDATE( namcos2_default ); +SCREEN_UPDATE_IND16( namcos2_default ); VIDEO_START( finallap ); -SCREEN_UPDATE( finallap ); +SCREEN_UPDATE_IND16( finallap ); VIDEO_START( luckywld ); -SCREEN_UPDATE( luckywld ); +SCREEN_UPDATE_IND16( luckywld ); VIDEO_START( metlhawk ); -SCREEN_UPDATE( metlhawk ); +SCREEN_UPDATE_IND16( metlhawk ); VIDEO_START( sgunner ); -SCREEN_UPDATE( sgunner ); +SCREEN_UPDATE_IND16( sgunner ); extern UINT16 *namcos2_sprite_ram; WRITE16_HANDLER( namcos2_sprite_ram_w ); diff -Nru mame-0.144/src/mame/includes/namcos86.h mame-0.145/src/mame/includes/namcos86.h --- mame-0.144/src/mame/includes/namcos86.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/namcos86.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,8 +23,8 @@ PALETTE_INIT( namcos86 ); VIDEO_START( namcos86 ); -SCREEN_UPDATE( namcos86 ); -SCREEN_EOF( namcos86 ); +SCREEN_UPDATE_IND16( namcos86 ); +SCREEN_VBLANK( namcos86 ); READ8_HANDLER( rthunder_videoram1_r ); WRITE8_HANDLER( rthunder_videoram1_w ); diff -Nru mame-0.144/src/mame/includes/naughtyb.h mame-0.145/src/mame/includes/naughtyb.h --- mame-0.144/src/mame/includes/naughtyb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/naughtyb.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,6 +14,7 @@ int m_cocktail; UINT8 m_palreg; int m_bankreg; + bitmap_ind16 m_tmpbitmap; }; @@ -24,4 +25,4 @@ VIDEO_START( naughtyb ); PALETTE_INIT( naughtyb ); -SCREEN_UPDATE( naughtyb ); +SCREEN_UPDATE_IND16( naughtyb ); diff -Nru mame-0.144/src/mame/includes/nbmj8688.h mame-0.145/src/mame/includes/nbmj8688.h --- mame-0.144/src/mame/includes/nbmj8688.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nbmj8688.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,7 +19,7 @@ int m_mjsikaku_flipscreen; int m_mjsikaku_screen_refresh; int m_mjsikaku_gfxmode; - bitmap_t *m_mjsikaku_tmpbitmap; + bitmap_ind16 *m_mjsikaku_tmpbitmap; UINT16 *m_mjsikaku_videoram; UINT8 *m_clut; UINT8 *m_HD61830B_ram[2]; @@ -34,9 +34,9 @@ PALETTE_INIT( mbmj8688_8bit ); PALETTE_INIT( mbmj8688_12bit ); PALETTE_INIT( mbmj8688_16bit ); -SCREEN_UPDATE( mbmj8688 ); -SCREEN_UPDATE( mbmj8688_lcd0 ); -SCREEN_UPDATE( mbmj8688_lcd1 ); +SCREEN_UPDATE_IND16( mbmj8688 ); +SCREEN_UPDATE_IND16( mbmj8688_lcd0 ); +SCREEN_UPDATE_IND16( mbmj8688_lcd1 ); VIDEO_START( mbmj8688_8bit ); VIDEO_START( mbmj8688_hybrid_12bit ); VIDEO_START( mbmj8688_pure_12bit ); diff -Nru mame-0.144/src/mame/includes/nbmj8891.h mame-0.145/src/mame/includes/nbmj8891.h --- mame-0.144/src/mame/includes/nbmj8891.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nbmj8891.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,8 +19,8 @@ int m_clutsel; int m_screen_refresh; int m_gfxdraw_mode; - bitmap_t *m_tmpbitmap0; - bitmap_t *m_tmpbitmap1; + bitmap_ind16 m_tmpbitmap0; + bitmap_ind16 m_tmpbitmap1; UINT8 *m_videoram0; UINT8 *m_videoram1; UINT8 *m_palette; @@ -33,7 +33,7 @@ /*----------- defined in video/nbmj8891.c -----------*/ -SCREEN_UPDATE( nbmj8891 ); +SCREEN_UPDATE_IND16( nbmj8891 ); VIDEO_START( nbmj8891_1layer ); VIDEO_START( nbmj8891_2layer ); diff -Nru mame-0.144/src/mame/includes/nbmj8900.h mame-0.145/src/mame/includes/nbmj8900.h --- mame-0.144/src/mame/includes/nbmj8900.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nbmj8900.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,8 +21,8 @@ int m_gfxdraw_mode; int m_screen_height; int m_screen_width; - bitmap_t *m_tmpbitmap0; - bitmap_t *m_tmpbitmap1; + bitmap_ind16 m_tmpbitmap0; + bitmap_ind16 m_tmpbitmap1; UINT8 *m_videoram0; UINT8 *m_videoram1; UINT8 *m_palette; @@ -33,7 +33,7 @@ /*----------- defined in video/nbmj8900.c -----------*/ -SCREEN_UPDATE( nbmj8900 ); +SCREEN_UPDATE_IND16( nbmj8900 ); VIDEO_START( nbmj8900_2layer ); READ8_HANDLER( nbmj8900_palette_type1_r ); diff -Nru mame-0.144/src/mame/includes/nbmj8991.h mame-0.145/src/mame/includes/nbmj8991.h --- mame-0.144/src/mame/includes/nbmj8991.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nbmj8991.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,7 +18,7 @@ int m_flipscreen; int m_clutsel; int m_screen_refresh; - bitmap_t *m_tmpbitmap; + bitmap_ind16 m_tmpbitmap; UINT8 *m_videoram; UINT8 *m_clut; int m_flipscreen_old; @@ -27,8 +27,8 @@ /*----------- defined in video/nbmj8991.c -----------*/ -SCREEN_UPDATE( nbmj8991_type1 ); -SCREEN_UPDATE( nbmj8991_type2 ); +SCREEN_UPDATE_IND16( nbmj8991_type1 ); +SCREEN_UPDATE_IND16( nbmj8991_type2 ); VIDEO_START( nbmj8991 ); WRITE8_HANDLER( nbmj8991_palette_type1_w ); diff -Nru mame-0.144/src/mame/includes/nbmj9195.h mame-0.145/src/mame/includes/nbmj9195.h --- mame-0.144/src/mame/includes/nbmj9195.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nbmj9195.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,7 +39,7 @@ int m_gfxdraw_mode; int m_nb19010_busyctr; int m_nb19010_busyflag; - bitmap_t *m_tmpbitmap[VRAM_MAX]; + bitmap_ind16 m_tmpbitmap[VRAM_MAX]; UINT16 *m_videoram[VRAM_MAX]; UINT16 *m_videoworkram[VRAM_MAX]; UINT8 *m_palette; @@ -51,7 +51,7 @@ /*----------- defined in video/nbmj9195.c -----------*/ -SCREEN_UPDATE( nbmj9195 ); +SCREEN_UPDATE_IND16( nbmj9195 ); VIDEO_START( nbmj9195_1layer ); VIDEO_START( nbmj9195_2layer ); VIDEO_START( nbmj9195_nb22090 ); diff -Nru mame-0.144/src/mame/includes/nemesis.h mame-0.145/src/mame/includes/nemesis.h --- mame-0.144/src/mame/includes/nemesis.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/nemesis.h 2012-02-06 21:30:44.000000000 +0000 @@ -61,4 +61,4 @@ WRITE16_HANDLER( nemesis_charram_word_w ); VIDEO_START( nemesis ); -SCREEN_UPDATE( nemesis ); +SCREEN_UPDATE_IND16( nemesis ); diff -Nru mame-0.144/src/mame/includes/neogeo.h mame-0.145/src/mame/includes/neogeo.h --- mame-0.144/src/mame/includes/neogeo.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/neogeo.h 2012-02-06 21:30:44.000000000 +0000 @@ -212,7 +212,7 @@ VIDEO_START( neogeo ); VIDEO_RESET( neogeo ); -SCREEN_UPDATE( neogeo ); +SCREEN_UPDATE_RGB32( neogeo ); READ16_HANDLER( neogeo_video_register_r ); WRITE16_HANDLER( neogeo_video_register_w ); diff -Nru mame-0.144/src/mame/includes/news.h mame-0.145/src/mame/includes/news.h --- mame-0.144/src/mame/includes/news.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/news.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ WRITE8_HANDLER( news_bgpic_w ); VIDEO_START( news ); -SCREEN_UPDATE( news ); +SCREEN_UPDATE_IND16( news ); diff -Nru mame-0.144/src/mame/includes/ninjakd2.h mame-0.145/src/mame/includes/ninjakd2.h --- mame-0.144/src/mame/includes/ninjakd2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ninjakd2.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,7 +13,7 @@ int m_next_sprite_overdraw_enabled; int (*m_stencil_compare_function) (UINT16 pal); int m_sprites_updated; - bitmap_t *m_sp_bitmap; + bitmap_ind16 m_sp_bitmap; int m_robokid_sprites; tilemap_t* m_fg_tilemap; tilemap_t* m_bg_tilemap; @@ -56,8 +56,8 @@ extern VIDEO_START( arkarea ); extern VIDEO_START( robokid ); extern VIDEO_START( omegaf ); -extern SCREEN_UPDATE( ninjakd2 ); -extern SCREEN_UPDATE( robokid ); -extern SCREEN_UPDATE( omegaf ); -extern SCREEN_EOF( ninjakd2 ); +extern SCREEN_UPDATE_IND16( ninjakd2 ); +extern SCREEN_UPDATE_IND16( robokid ); +extern SCREEN_UPDATE_IND16( omegaf ); +extern SCREEN_VBLANK( ninjakd2 ); diff -Nru mame-0.144/src/mame/includes/ninjaw.h mame-0.145/src/mame/includes/ninjaw.h --- mame-0.144/src/mame/includes/ninjaw.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ninjaw.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,6 @@ /*----------- defined in video/ninjaw.c -----------*/ VIDEO_START( ninjaw ); -SCREEN_UPDATE( ninjaw ); +SCREEN_UPDATE_IND16( ninjaw_left ); +SCREEN_UPDATE_IND16( ninjaw_middle ); +SCREEN_UPDATE_IND16( ninjaw_right ); diff -Nru mame-0.144/src/mame/includes/nitedrvr.h mame-0.145/src/mame/includes/nitedrvr.h --- mame-0.144/src/mame/includes/nitedrvr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nitedrvr.h 2012-02-06 21:30:44.000000000 +0000 @@ -71,4 +71,4 @@ WRITE8_HANDLER( nitedrvr_videoram_w ); VIDEO_START( nitedrvr ); -SCREEN_UPDATE( nitedrvr ); +SCREEN_UPDATE_IND16( nitedrvr ); diff -Nru mame-0.144/src/mame/includes/niyanpai.h mame-0.145/src/mame/includes/niyanpai.h --- mame-0.144/src/mame/includes/niyanpai.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/niyanpai.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,7 +27,7 @@ int m_screen_refresh; int m_nb19010_busyctr; int m_nb19010_busyflag; - bitmap_t *m_tmpbitmap[VRAM_MAX]; + bitmap_ind16 m_tmpbitmap[VRAM_MAX]; UINT16 *m_videoram[VRAM_MAX]; UINT16 *m_videoworkram[VRAM_MAX]; UINT16 *m_palette; @@ -38,7 +38,7 @@ /*----------- defined in video/niyanpai.c -----------*/ -SCREEN_UPDATE( niyanpai ); +SCREEN_UPDATE_IND16( niyanpai ); VIDEO_START( niyanpai ); READ16_HANDLER( niyanpai_palette_r ); diff -Nru mame-0.144/src/mame/includes/nmk16.h mame-0.145/src/mame/includes/nmk16.h --- mame-0.144/src/mame/includes/nmk16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nmk16.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,7 +30,7 @@ tilemap_t *m_bg_tilemap3; tilemap_t *m_tx_tilemap; tilemap_t *m_fg_tilemap; - bitmap_t *m_background_bitmap; + bitmap_ind16 *m_background_bitmap; int m_mustang_bg_xscroll; UINT8 m_scroll[4]; UINT8 m_scroll_2[4]; @@ -67,29 +67,29 @@ WRITE16_HANDLER( manybloc_scroll_w ); VIDEO_START( macross ); -SCREEN_UPDATE( manybloc ); +SCREEN_UPDATE_IND16( manybloc ); VIDEO_START( gunnail ); VIDEO_START( macross2 ); VIDEO_START( raphero ); VIDEO_START( bjtwin ); VIDEO_START( bioship ); VIDEO_START( strahl ); -SCREEN_UPDATE( bioship ); -SCREEN_UPDATE( strahl ); -SCREEN_UPDATE( macross ); -SCREEN_UPDATE( gunnail ); -SCREEN_UPDATE( bjtwin ); -SCREEN_UPDATE( tharrier ); -SCREEN_UPDATE( hachamf ); -SCREEN_UPDATE( tdragon ); -SCREEN_EOF( nmk ); -SCREEN_EOF( strahl ); +SCREEN_UPDATE_IND16( bioship ); +SCREEN_UPDATE_IND16( strahl ); +SCREEN_UPDATE_IND16( macross ); +SCREEN_UPDATE_IND16( gunnail ); +SCREEN_UPDATE_IND16( bjtwin ); +SCREEN_UPDATE_IND16( tharrier ); +SCREEN_UPDATE_IND16( hachamf ); +SCREEN_UPDATE_IND16( tdragon ); +SCREEN_VBLANK( nmk ); +SCREEN_VBLANK( strahl ); VIDEO_START( afega ); VIDEO_START( grdnstrm ); VIDEO_START( firehawk ); -SCREEN_UPDATE( afega ); -SCREEN_UPDATE( redhawkb ); -SCREEN_UPDATE(redhawki ); -SCREEN_UPDATE( bubl2000 ); -SCREEN_UPDATE( firehawk ); +SCREEN_UPDATE_IND16( afega ); +SCREEN_UPDATE_IND16( redhawkb ); +SCREEN_UPDATE_IND16(redhawki ); +SCREEN_UPDATE_IND16( bubl2000 ); +SCREEN_UPDATE_IND16( firehawk ); diff -Nru mame-0.144/src/mame/includes/nova2001.h mame-0.145/src/mame/includes/nova2001.h --- mame-0.144/src/mame/includes/nova2001.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/nova2001.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,10 +27,10 @@ extern PALETTE_INIT( nova2001 ); extern VIDEO_START( nova2001 ); -extern SCREEN_UPDATE( nova2001 ); +extern SCREEN_UPDATE_IND16( nova2001 ); extern VIDEO_START( ninjakun ); -extern SCREEN_UPDATE( ninjakun ); +extern SCREEN_UPDATE_IND16( ninjakun ); extern VIDEO_START( pkunwar ); -extern SCREEN_UPDATE( pkunwar ); +extern SCREEN_UPDATE_IND16( pkunwar ); extern VIDEO_START( raiders5 ); -extern SCREEN_UPDATE( raiders5 ); +extern SCREEN_UPDATE_IND16( raiders5 ); diff -Nru mame-0.144/src/mame/includes/nycaptor.h mame-0.145/src/mame/includes/nycaptor.h --- mame-0.144/src/mame/includes/nycaptor.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/nycaptor.h 2012-02-06 21:30:44.000000000 +0000 @@ -83,4 +83,4 @@ WRITE8_HANDLER( nycaptor_scrlram_w ); VIDEO_START( nycaptor ); -SCREEN_UPDATE( nycaptor ); +SCREEN_UPDATE_IND16( nycaptor ); diff -Nru mame-0.144/src/mame/includes/offtwall.h mame-0.145/src/mame/includes/offtwall.h --- mame-0.144/src/mame/includes/offtwall.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/offtwall.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ /*----------- defined in video/offtwall.c -----------*/ VIDEO_START( offtwall ); -SCREEN_UPDATE( offtwall ); +SCREEN_UPDATE_IND16( offtwall ); diff -Nru mame-0.144/src/mame/includes/ohmygod.h mame-0.145/src/mame/includes/ohmygod.h --- mame-0.144/src/mame/includes/ohmygod.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ohmygod.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,4 @@ WRITE16_HANDLER( ohmygod_scrolly_w ); VIDEO_START( ohmygod ); -SCREEN_UPDATE( ohmygod ); +SCREEN_UPDATE_IND16( ohmygod ); diff -Nru mame-0.144/src/mame/includes/ojankohs.h mame-0.145/src/mame/includes/ojankohs.h --- mame-0.144/src/mame/includes/ojankohs.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ojankohs.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ /* video-related */ tilemap_t *m_tilemap; - bitmap_t *m_tmpbitmap; + bitmap_ind16 m_tmpbitmap; int m_gfxreg; int m_flipscreen; int m_flipscreen_old; @@ -54,8 +54,8 @@ VIDEO_START( ojankoy ); VIDEO_START( ojankoc ); -SCREEN_UPDATE( ojankohs ); -SCREEN_UPDATE( ojankoc ); +SCREEN_UPDATE_IND16( ojankohs ); +SCREEN_UPDATE_IND16( ojankoc ); void ojankoc_flipscreen(address_space *space, int data); diff -Nru mame-0.144/src/mame/includes/oneshot.h mame-0.145/src/mame/includes/oneshot.h --- mame-0.144/src/mame/includes/oneshot.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/oneshot.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,5 +38,5 @@ WRITE16_HANDLER( oneshot_fg_videoram_w ); VIDEO_START( oneshot ); -SCREEN_UPDATE( oneshot ); -SCREEN_UPDATE( maddonna ); +SCREEN_UPDATE_IND16( oneshot ); +SCREEN_UPDATE_IND16( maddonna ); diff -Nru mame-0.144/src/mame/includes/opwolf.h mame-0.145/src/mame/includes/opwolf.h --- mame-0.144/src/mame/includes/opwolf.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/opwolf.h 2012-02-06 21:30:44.000000000 +0000 @@ -67,4 +67,4 @@ WRITE16_HANDLER( opwolf_spritectrl_w ); -SCREEN_UPDATE( opwolf ); +SCREEN_UPDATE_IND16( opwolf ); diff -Nru mame-0.144/src/mame/includes/orbit.h mame-0.145/src/mame/includes/orbit.h --- mame-0.144/src/mame/includes/orbit.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/orbit.h 2012-02-06 21:30:44.000000000 +0000 @@ -50,6 +50,6 @@ /*----------- defined in video/orbit.c -----------*/ VIDEO_START( orbit ); -SCREEN_UPDATE( orbit ); +SCREEN_UPDATE_IND16( orbit ); WRITE8_HANDLER( orbit_playfield_w ); diff -Nru mame-0.144/src/mame/includes/othldrby.h mame-0.145/src/mame/includes/othldrby.h --- mame-0.144/src/mame/includes/othldrby.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/othldrby.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,5 +37,5 @@ WRITE16_HANDLER( othldrby_vreg_w ); VIDEO_START( othldrby ); -SCREEN_EOF( othldrby ); -SCREEN_UPDATE( othldrby ); +SCREEN_VBLANK( othldrby ); +SCREEN_UPDATE_IND16( othldrby ); diff -Nru mame-0.144/src/mame/includes/othunder.h mame-0.145/src/mame/includes/othunder.h --- mame-0.144/src/mame/includes/othunder.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/othunder.h 2012-02-06 21:30:44.000000000 +0000 @@ -56,4 +56,4 @@ /*----------- defined in video/othunder.c -----------*/ VIDEO_START( othunder ); -SCREEN_UPDATE( othunder ); +SCREEN_UPDATE_IND16( othunder ); diff -Nru mame-0.144/src/mame/includes/overdriv.h mame-0.145/src/mame/includes/overdriv.h --- mame-0.144/src/mame/includes/overdriv.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/overdriv.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,4 +39,4 @@ extern void overdriv_zoom_callback_0(running_machine &machine, int *code,int *color,int *flags); extern void overdriv_zoom_callback_1(running_machine &machine, int *code,int *color,int *flags); -SCREEN_UPDATE( overdriv ); +SCREEN_UPDATE_IND16( overdriv ); diff -Nru mame-0.144/src/mame/includes/pacland.h mame-0.145/src/mame/includes/pacland.h --- mame-0.144/src/mame/includes/pacland.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/pacland.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,10 +11,12 @@ const UINT8 *m_color_prom; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; - bitmap_t *m_fg_bitmap; + bitmap_ind16 m_fg_bitmap; UINT32 *m_transmask[3]; UINT16 m_scroll0; UINT16 m_scroll1; + UINT8 m_main_irq_mask; + UINT8 m_mcu_irq_mask; }; @@ -28,4 +30,4 @@ PALETTE_INIT( pacland ); VIDEO_START( pacland ); -SCREEN_UPDATE( pacland ); +SCREEN_UPDATE_IND16( pacland ); diff -Nru mame-0.144/src/mame/includes/pacman.h mame-0.145/src/mame/includes/pacman.h --- mame-0.144/src/mame/includes/pacman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pacman.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,6 +28,8 @@ UINT8 m_flipscreen; UINT8 m_bgpriority; int m_xoffsethack; + UINT8 m_inv_spr; + UINT8 m_irq_mask; }; @@ -35,7 +37,7 @@ PALETTE_INIT( pacman ); VIDEO_START( pacman ); -SCREEN_UPDATE( pacman ); +SCREEN_UPDATE_IND16( pacman ); WRITE8_HANDLER( pacman_videoram_w ); WRITE8_HANDLER( pacman_colorram_w ); @@ -50,7 +52,7 @@ VIDEO_START( s2650games ); -SCREEN_UPDATE( s2650games ); +SCREEN_UPDATE_IND16( s2650games ); WRITE8_HANDLER( s2650games_videoram_w ); @@ -67,6 +69,8 @@ WRITE8_HANDLER( jrpacman_scroll_w ); WRITE8_HANDLER( jrpacman_bgpriority_w ); +VIDEO_START( birdiy ); + /*----------- defined in machine/pacplus.c -----------*/ diff -Nru mame-0.144/src/mame/includes/pandoras.h mame-0.145/src/mame/includes/pandoras.h --- mame-0.144/src/mame/includes/pandoras.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pandoras.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,5 +43,5 @@ WRITE8_HANDLER( pandoras_scrolly_w ); VIDEO_START( pandoras ); -SCREEN_UPDATE( pandoras ); +SCREEN_UPDATE_IND16( pandoras ); diff -Nru mame-0.144/src/mame/includes/paradise.h mame-0.145/src/mame/includes/paradise.h --- mame-0.144/src/mame/includes/paradise.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/paradise.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,7 +18,7 @@ tilemap_t *m_tilemap_0; tilemap_t *m_tilemap_1; tilemap_t *m_tilemap_2; - bitmap_t *m_tmpbitmap; + bitmap_ind16 m_tmpbitmap; UINT8 m_palbank; UINT8 m_priority; UINT8 m_pixbank; @@ -43,6 +43,6 @@ VIDEO_START( paradise ); -SCREEN_UPDATE( paradise ); -SCREEN_UPDATE( torus ); -SCREEN_UPDATE( madball ); +SCREEN_UPDATE_IND16( paradise ); +SCREEN_UPDATE_IND16( torus ); +SCREEN_UPDATE_IND16( madball ); diff -Nru mame-0.144/src/mame/includes/parodius.h mame-0.145/src/mame/includes/parodius.h --- mame-0.144/src/mame/includes/parodius.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/parodius.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ extern void parodius_tile_callback(running_machine &machine, int layer,int bank,int *code,int *color,int *flags,int *priority); extern void parodius_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask); -SCREEN_UPDATE( parodius ); +SCREEN_UPDATE_IND16( parodius ); diff -Nru mame-0.144/src/mame/includes/pass.h mame-0.145/src/mame/includes/pass.h --- mame-0.144/src/mame/includes/pass.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pass.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,4 +18,4 @@ WRITE16_HANDLER( pass_bg_videoram_w ); VIDEO_START( pass ); -SCREEN_UPDATE( pass ); +SCREEN_UPDATE_IND16( pass ); diff -Nru mame-0.144/src/mame/includes/pastelg.h mame-0.145/src/mame/includes/pastelg.h --- mame-0.144/src/mame/includes/pastelg.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pastelg.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ /*----------- defined in video/pastelg.c -----------*/ PALETTE_INIT( pastelg ); -SCREEN_UPDATE( pastelg ); +SCREEN_UPDATE_IND16( pastelg ); VIDEO_START( pastelg ); WRITE8_HANDLER( pastelg_clut_w ); diff -Nru mame-0.144/src/mame/includes/pbaction.h mame-0.145/src/mame/includes/pbaction.h --- mame-0.144/src/mame/includes/pbaction.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pbaction.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,6 +28,8 @@ /* devices */ device_t *m_maincpu; device_t *m_audiocpu; + + UINT8 m_nmi_mask; }; @@ -41,4 +43,4 @@ extern WRITE8_HANDLER( pbaction_scroll_w ); extern VIDEO_START( pbaction ); -extern SCREEN_UPDATE( pbaction ); +extern SCREEN_UPDATE_IND16( pbaction ); diff -Nru mame-0.144/src/mame/includes/pcktgal.h mame-0.145/src/mame/includes/pcktgal.h --- mame-0.144/src/mame/includes/pcktgal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pcktgal.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,5 +15,5 @@ PALETTE_INIT( pcktgal ); -SCREEN_UPDATE( pcktgal ); -SCREEN_UPDATE( pcktgalb ); +SCREEN_UPDATE_IND16( pcktgal ); +SCREEN_UPDATE_IND16( pcktgalb ); diff -Nru mame-0.144/src/mame/includes/pgm.h mame-0.145/src/mame/includes/pgm.h --- mame-0.144/src/mame/includes/pgm.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/pgm.h 2012-02-06 21:30:44.000000000 +0000 @@ -3,7 +3,10 @@ { public: pgm_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag) + { + m_irq4_disabled = 0; + } /* memory pointers */ // UINT16 * m_mainram; // currently this is also used by nvram handler @@ -25,9 +28,31 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_tx_tilemap; UINT16 *m_sprite_temp_render; - bitmap_t *m_tmppgmbitmap; + bitmap_rgb32 m_tmppgmbitmap; - /* misc */ + /* devices */ + cpu_device *m_maincpu; + cpu_device *m_soundcpu; + cpu_device *m_prot; + device_t *m_ics; + + /* used by rendering */ + UINT8 *m_bdata; + size_t m_bdatasize; + int m_aoffset; + int m_boffset; + + /* hack */ + int m_irq4_disabled; + + /* calendar */ + UINT8 m_cal_val; + UINT8 m_cal_mask; + UINT8 m_cal_com; + UINT8 m_cal_cnt; + system_time m_systime; + + /* protection handling */ // kov2 UINT32 m_kov2_latchdata_68k_w; UINT32 m_kov2_latchdata_arm_w; @@ -71,37 +96,20 @@ UINT16 m_asic_params[256]; UINT16 m_asic28_rcnt; UINT32 m_eoregs[16]; - - /* calendar */ - UINT8 m_cal_val; - UINT8 m_cal_mask; - UINT8 m_cal_com; - UINT8 m_cal_cnt; - system_time m_systime; - - /* devices */ - cpu_device *m_soundcpu; - cpu_device *m_prot; - device_t *m_ics; -}; - -class oldsplus_state : public pgm_state -{ -public: - oldsplus_state(const machine_config &mconfig, device_type type, const char *tag) - : pgm_state(mconfig, type, tag) { } - -public: + // Oldsplus simulation UINT16 m_oldsplus_key; UINT16 m_oldsplus_int[2]; UINT32 m_oldsplus_val; UINT16 m_oldsplus_ram[0x100]; UINT32 m_oldsplus_regs[0x100]; + + }; + extern UINT16 *pgm_mainram; // used by nvram handler, we cannot move it to driver data struct /*----------- defined in machine/pgmcrypt.c -----------*/ @@ -149,6 +157,8 @@ READ16_HANDLER( oldsplus_r ); WRITE16_HANDLER( oldsplus_w ); +MACHINE_RESET( kov ); +void install_protection_asic_sim_kov(running_machine &machine); /*----------- defined in video/pgm.c -----------*/ @@ -156,5 +166,5 @@ WRITE16_HANDLER( pgm_bg_videoram_w ); VIDEO_START( pgm ); -SCREEN_EOF( pgm ); -SCREEN_UPDATE( pgm ); +SCREEN_VBLANK( pgm ); +SCREEN_UPDATE_IND16( pgm ); diff -Nru mame-0.144/src/mame/includes/phoenix.h mame-0.145/src/mame/includes/phoenix.h --- mame-0.144/src/mame/includes/phoenix.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/phoenix.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,7 +52,7 @@ PALETTE_INIT( survival ); PALETTE_INIT( pleiads ); VIDEO_START( phoenix ); -SCREEN_UPDATE( phoenix ); +SCREEN_UPDATE_IND16( phoenix ); WRITE8_HANDLER( phoenix_videoram_w ); WRITE8_HANDLER( phoenix_videoreg_w ); diff -Nru mame-0.144/src/mame/includes/pingpong.h mame-0.145/src/mame/includes/pingpong.h --- mame-0.144/src/mame/includes/pingpong.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pingpong.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: pingpong_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_intenable; int m_question_addr_high; @@ -11,6 +13,8 @@ tilemap_t *m_bg_tilemap; UINT8 *m_spriteram; size_t m_spriteram_size; + + required_device m_maincpu; }; @@ -21,4 +25,4 @@ PALETTE_INIT( pingpong ); VIDEO_START( pingpong ); -SCREEN_UPDATE( pingpong ); +SCREEN_UPDATE_IND16( pingpong ); diff -Nru mame-0.144/src/mame/includes/pirates.h mame-0.145/src/mame/includes/pirates.h --- mame-0.144/src/mame/includes/pirates.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pirates.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,4 +22,4 @@ WRITE16_HANDLER( pirates_bg_tileram_w ); VIDEO_START( pirates ); -SCREEN_UPDATE( pirates ); +SCREEN_UPDATE_IND16( pirates ); diff -Nru mame-0.144/src/mame/includes/pitnrun.h mame-0.145/src/mame/includes/pitnrun.h --- mame-0.144/src/mame/includes/pitnrun.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/pitnrun.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,7 +20,7 @@ int m_scroll; int m_char_bank; int m_color_select; - bitmap_t *m_tmp_bitmap[4]; + bitmap_ind16 *m_tmp_bitmap[4]; tilemap_t *m_bg; tilemap_t *m_fg; UINT8 *m_spriteram; @@ -57,4 +57,4 @@ PALETTE_INIT(pitnrun); VIDEO_START(pitnrun); -SCREEN_UPDATE(pitnrun); +SCREEN_UPDATE_IND16(pitnrun); diff -Nru mame-0.144/src/mame/includes/pk8000.h mame-0.145/src/mame/includes/pk8000.h --- mame-0.144/src/mame/includes/pk8000.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pk8000.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,4 +18,4 @@ PALETTE_INIT( pk8000 ); -UINT32 pk8000_video_update(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *videomem); +UINT32 pk8000_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *videomem); diff -Nru mame-0.144/src/mame/includes/pktgaldx.h mame-0.145/src/mame/includes/pktgaldx.h --- mame-0.144/src/mame/includes/pktgaldx.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/pktgaldx.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,5 +29,5 @@ /*----------- defined in video/pktgaldx.c -----------*/ -SCREEN_UPDATE( pktgaldx ); -SCREEN_UPDATE( pktgaldb ); +SCREEN_UPDATE_IND16( pktgaldx ); +SCREEN_UPDATE_IND16( pktgaldb ); diff -Nru mame-0.144/src/mame/includes/playch10.h mame-0.145/src/mame/includes/playch10.h --- mame-0.144/src/mame/includes/playch10.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/playch10.h 2012-02-06 21:30:44.000000000 +0000 @@ -98,4 +98,5 @@ PALETTE_INIT( playch10 ); VIDEO_START( playch10 ); VIDEO_START( playch10_hboard ); -SCREEN_UPDATE( playch10 ); +SCREEN_UPDATE_IND16( playch10_top ); +SCREEN_UPDATE_IND16( playch10_bottom ); diff -Nru mame-0.144/src/mame/includes/playmark.h mame-0.145/src/mame/includes/playmark.h --- mame-0.144/src/mame/includes/playmark.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/playmark.h 2012-02-06 21:30:44.000000000 +0000 @@ -71,8 +71,8 @@ VIDEO_START( hotmind ); VIDEO_START( hrdtimes ); -SCREEN_UPDATE( bigtwin ); -SCREEN_UPDATE( bigtwinb ); -SCREEN_UPDATE( wbeachvl ); -SCREEN_UPDATE( excelsr ); -SCREEN_UPDATE( hrdtimes ); +SCREEN_UPDATE_IND16( bigtwin ); +SCREEN_UPDATE_IND16( bigtwinb ); +SCREEN_UPDATE_IND16( wbeachvl ); +SCREEN_UPDATE_IND16( excelsr ); +SCREEN_UPDATE_IND16( hrdtimes ); diff -Nru mame-0.144/src/mame/includes/plygonet.h mame-0.145/src/mame/includes/plygonet.h --- mame-0.144/src/mame/includes/plygonet.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/plygonet.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,7 +37,7 @@ /*----------- defined in video/plygonet.c -----------*/ VIDEO_START( polygonet ); -SCREEN_UPDATE( polygonet ); +SCREEN_UPDATE_IND16( polygonet ); READ32_HANDLER( polygonet_ttl_ram_r ); WRITE32_HANDLER( polygonet_ttl_ram_w ); diff -Nru mame-0.144/src/mame/includes/pokechmp.h mame-0.145/src/mame/includes/pokechmp.h --- mame-0.144/src/mame/includes/pokechmp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pokechmp.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,4 +17,4 @@ WRITE8_HANDLER( pokechmp_flipscreen_w ); VIDEO_START( pokechmp ); -SCREEN_UPDATE( pokechmp ); +SCREEN_UPDATE_IND16( pokechmp ); diff -Nru mame-0.144/src/mame/includes/polepos.h mame-0.145/src/mame/includes/polepos.h --- mame-0.144/src/mame/includes/polepos.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/polepos.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,6 +32,8 @@ tilemap_t *m_tx_tilemap; int m_chacl; UINT16 m_scroll; + UINT8 m_main_irq_mask; + UINT8 m_sub_irq_mask; }; @@ -49,7 +51,7 @@ VIDEO_START( polepos ); PALETTE_INIT( polepos ); -SCREEN_UPDATE( polepos ); +SCREEN_UPDATE_IND16( polepos ); WRITE16_HANDLER( polepos_view16_w ); WRITE16_HANDLER( polepos_road16_w ); diff -Nru mame-0.144/src/mame/includes/policetr.h mame-0.145/src/mame/includes/policetr.h --- mame-0.144/src/mame/includes/policetr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/policetr.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,4 +42,4 @@ WRITE32_HANDLER( policetr_palette_data_w ); VIDEO_START( policetr ); -SCREEN_UPDATE( policetr ); +SCREEN_UPDATE_IND16( policetr ); diff -Nru mame-0.144/src/mame/includes/polyplay.h mame-0.145/src/mame/includes/polyplay.h --- mame-0.144/src/mame/includes/polyplay.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/polyplay.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,5 +39,5 @@ PALETTE_INIT( polyplay ); VIDEO_START( polyplay ); -SCREEN_UPDATE( polyplay ); +SCREEN_UPDATE_IND16( polyplay ); WRITE8_HANDLER( polyplay_characterram_w ); diff -Nru mame-0.144/src/mame/includes/poolshrk.h mame-0.145/src/mame/includes/poolshrk.h --- mame-0.144/src/mame/includes/poolshrk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/poolshrk.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,5 +35,5 @@ /*----------- defined in video/poolshrk.c -----------*/ VIDEO_START( poolshrk ); -SCREEN_UPDATE( poolshrk ); +SCREEN_UPDATE_IND16( poolshrk ); diff -Nru mame-0.144/src/mame/includes/pooyan.h mame-0.145/src/mame/includes/pooyan.h --- mame-0.144/src/mame/includes/pooyan.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pooyan.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,4 +30,4 @@ PALETTE_INIT( pooyan ); VIDEO_START( pooyan ); -SCREEN_UPDATE( pooyan ); +SCREEN_UPDATE_IND16( pooyan ); diff -Nru mame-0.144/src/mame/includes/popeye.h mame-0.145/src/mame/includes/popeye.h --- mame-0.144/src/mame/includes/popeye.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/popeye.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,7 +13,7 @@ UINT8 *m_background_pos; UINT8 *m_palettebank; UINT8 *m_bitmapram; - bitmap_t *m_tmpbitmap2; + bitmap_ind16 *m_tmpbitmap2; UINT8 m_invertmask; UINT8 m_bitmap_type; tilemap_t *m_fg_tilemap; @@ -34,4 +34,4 @@ PALETTE_INIT( popeyebl ); VIDEO_START( skyskipr ); VIDEO_START( popeye ); -SCREEN_UPDATE( popeye ); +SCREEN_UPDATE_IND16( popeye ); diff -Nru mame-0.144/src/mame/includes/popper.h mame-0.145/src/mame/includes/popper.h --- mame-0.144/src/mame/includes/popper.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/popper.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,6 +30,8 @@ /* devices */ device_t *m_audiocpu; + + UINT8 m_nmi_mask; }; @@ -45,5 +47,5 @@ PALETTE_INIT( popper ); VIDEO_START( popper ); -SCREEN_UPDATE( popper ); +SCREEN_UPDATE_IND16( popper ); diff -Nru mame-0.144/src/mame/includes/portrait.h mame-0.145/src/mame/includes/portrait.h --- mame-0.144/src/mame/includes/portrait.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/portrait.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,6 +18,6 @@ PALETTE_INIT( portrait ); VIDEO_START( portrait ); -SCREEN_UPDATE( portrait ); +SCREEN_UPDATE_IND16( portrait ); WRITE8_HANDLER( portrait_bgvideo_write ); WRITE8_HANDLER( portrait_fgvideo_write ); diff -Nru mame-0.144/src/mame/includes/powerins.h mame-0.145/src/mame/includes/powerins.h --- mame-0.144/src/mame/includes/powerins.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/powerins.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ WRITE16_HANDLER( powerins_vram_1_w ); VIDEO_START( powerins ); -SCREEN_UPDATE( powerins ); +SCREEN_UPDATE_IND16( powerins ); diff -Nru mame-0.144/src/mame/includes/prehisle.h mame-0.145/src/mame/includes/prehisle.h --- mame-0.144/src/mame/includes/prehisle.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/prehisle.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ READ16_HANDLER( prehisle_control16_r ); VIDEO_START( prehisle ); -SCREEN_UPDATE( prehisle ); +SCREEN_UPDATE_IND16( prehisle ); diff -Nru mame-0.144/src/mame/includes/psikyo4.h mame-0.145/src/mame/includes/psikyo4.h --- mame-0.144/src/mame/includes/psikyo4.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/psikyo4.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,5 @@ /*----------- defined in video/psikyo4.c -----------*/ VIDEO_START( psikyo4 ); -SCREEN_UPDATE( psikyo4 ); +SCREEN_UPDATE_IND16( psikyo4_left ); +SCREEN_UPDATE_IND16( psikyo4_right ); diff -Nru mame-0.144/src/mame/includes/psikyo.h mame-0.145/src/mame/includes/psikyo.h --- mame-0.144/src/mame/includes/psikyo.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/psikyo.h 2012-02-06 21:30:44.000000000 +0000 @@ -68,6 +68,6 @@ VIDEO_START( sngkace ); VIDEO_START( psikyo ); -SCREEN_UPDATE( psikyo ); -SCREEN_UPDATE( psikyo_bootleg ); -SCREEN_EOF( psikyo ); +SCREEN_UPDATE_IND16( psikyo ); +SCREEN_UPDATE_IND16( psikyo_bootleg ); +SCREEN_VBLANK( psikyo ); diff -Nru mame-0.144/src/mame/includes/psikyosh.h mame-0.145/src/mame/includes/psikyosh.h --- mame-0.144/src/mame/includes/psikyosh.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/psikyosh.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,9 +32,9 @@ // size_t m_spriteram_size; /* video-related */ - bitmap_t *m_zoom_bitmap; - bitmap_t *m_z_bitmap; - bitmap_t *m_bg_bitmap; + bitmap_ind8 m_zoom_bitmap; + bitmap_ind16 m_z_bitmap; + bitmap_rgb32 m_bg_bitmap; UINT16 *m_bg_zoom; UINT8 m_alphatable[256]; @@ -45,5 +45,5 @@ /*----------- defined in video/psikyosh.c -----------*/ VIDEO_START( psikyosh ); -SCREEN_UPDATE( psikyosh ); -SCREEN_EOF( psikyosh ); +SCREEN_UPDATE_RGB32( psikyosh ); +SCREEN_VBLANK( psikyosh ); diff -Nru mame-0.144/src/mame/includes/psx.h mame-0.145/src/mame/includes/psx.h --- mame-0.144/src/mame/includes/psx.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/psx.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,7 +37,7 @@ // emu/video/psx.c PALETTE_INIT( psx ); -SCREEN_UPDATE( psx ); +SCREEN_UPDATE_IND16( psx ); INTERRUPT_GEN( psx_vblank ); #define PSX_H ( 1 ) diff -Nru mame-0.144/src/mame/includes/psychic5.h mame-0.145/src/mame/includes/psychic5.h --- mame-0.144/src/mame/includes/psychic5.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/psychic5.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,11 +40,11 @@ VIDEO_START( psychic5 ); VIDEO_RESET( psychic5 ); -SCREEN_UPDATE( psychic5 ); +SCREEN_UPDATE_RGB32( psychic5 ); WRITE8_HANDLER( bombsa_paged_ram_w ); WRITE8_HANDLER( bombsa_unknown_w ); VIDEO_START( bombsa ); VIDEO_RESET( bombsa ); -SCREEN_UPDATE( bombsa ); +SCREEN_UPDATE_RGB32( bombsa ); diff -Nru mame-0.144/src/mame/includes/punchout.h mame-0.145/src/mame/includes/punchout.h --- mame-0.144/src/mame/includes/punchout.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/punchout.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,6 +22,8 @@ tilemap_t *m_spr2_tilemap; int m_palette_reverse_top; int m_palette_reverse_bot; + + UINT8 m_nmi_mask; }; @@ -35,8 +37,10 @@ VIDEO_START( punchout ); VIDEO_START( armwrest ); -SCREEN_UPDATE( punchout ); -SCREEN_UPDATE( armwrest ); +SCREEN_UPDATE_IND16( punchout_top ); +SCREEN_UPDATE_IND16( punchout_bottom ); +SCREEN_UPDATE_IND16( armwrest_top ); +SCREEN_UPDATE_IND16( armwrest_bottom ); DRIVER_INIT( punchout ); DRIVER_INIT( spnchout ); diff -Nru mame-0.144/src/mame/includes/pushman.h mame-0.145/src/mame/includes/pushman.h --- mame-0.144/src/mame/includes/pushman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/pushman.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,4 +39,4 @@ VIDEO_START( pushman ); -SCREEN_UPDATE( pushman ); +SCREEN_UPDATE_IND16( pushman ); diff -Nru mame-0.144/src/mame/includes/qdrmfgp.h mame-0.145/src/mame/includes/qdrmfgp.h --- mame-0.144/src/mame/includes/qdrmfgp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/qdrmfgp.h 2012-02-06 21:30:44.000000000 +0000 @@ -3,8 +3,11 @@ public: qdrmfgp_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_nvram(*this, "nvram") { } + m_maincpu(*this, "maincpu"), + m_nvram(*this, "nvram") + { } + required_device m_maincpu; required_shared_ptr m_nvram; UINT8 *m_sndram; UINT16 *m_workram; @@ -17,7 +20,7 @@ VIDEO_START( qdrmfgp ); VIDEO_START( qdrmfgp2 ); -SCREEN_UPDATE( qdrmfgp ); +SCREEN_UPDATE_IND16( qdrmfgp ); void qdrmfgp_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); void qdrmfgp2_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); diff -Nru mame-0.144/src/mame/includes/quizdna.h mame-0.145/src/mame/includes/quizdna.h --- mame-0.144/src/mame/includes/quizdna.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/quizdna.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,7 +19,7 @@ /*----------- defined in video/quizdna.c -----------*/ VIDEO_START( quizdna ); -SCREEN_UPDATE( quizdna ); +SCREEN_UPDATE_IND16( quizdna ); WRITE8_HANDLER( quizdna_fg_ram_w ); WRITE8_HANDLER( quizdna_bg_ram_w ); diff -Nru mame-0.144/src/mame/includes/quizpani.h mame-0.145/src/mame/includes/quizpani.h --- mame-0.144/src/mame/includes/quizpani.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/quizpani.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,4 +21,4 @@ WRITE16_HANDLER( quizpani_tilesbank_w ); VIDEO_START( quizpani ); -SCREEN_UPDATE( quizpani ); +SCREEN_UPDATE_IND16( quizpani ); diff -Nru mame-0.144/src/mame/includes/raiden2.h mame-0.145/src/mame/includes/raiden2.h --- mame-0.144/src/mame/includes/raiden2.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/raiden2.h 2012-02-06 21:30:44.000000000 +0000 @@ -109,7 +109,7 @@ UINT16 cop_hit_status; - void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ,int pri_mask ); + void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ,int pri_mask ); UINT8 cop_calculate_collsion_detection(running_machine &machine); }; diff -Nru mame-0.144/src/mame/includes/raiden.h mame-0.145/src/mame/includes/raiden.h --- mame-0.144/src/mame/includes/raiden.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/raiden.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ VIDEO_START( raidena ); WRITE16_HANDLER( raiden_control_w ); WRITE16_HANDLER( raidena_control_w ); -SCREEN_UPDATE( raiden ); +SCREEN_UPDATE_IND16( raiden ); diff -Nru mame-0.144/src/mame/includes/rainbow.h mame-0.145/src/mame/includes/rainbow.h --- mame-0.144/src/mame/includes/rainbow.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rainbow.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,10 +4,10 @@ *************************************************************************/ -class rainbow_state : public driver_device +class rbisland_state : public driver_device { public: - rainbow_state(const machine_config &mconfig, device_type type, const char *tag) + rbisland_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } /* memory pointers */ @@ -37,19 +37,19 @@ /*----------- defined in machine/rainbow.c -----------*/ -void rainbow_cchip_init(running_machine &machine, int version); -READ16_HANDLER( rainbow_cchip_ctrl_r ); -READ16_HANDLER( rainbow_cchip_ram_r ); -WRITE16_HANDLER( rainbow_cchip_ctrl_w ); -WRITE16_HANDLER( rainbow_cchip_bank_w ); -WRITE16_HANDLER( rainbow_cchip_ram_w ); +void rbisland_cchip_init(running_machine &machine, int version); +READ16_HANDLER( rbisland_cchip_ctrl_r ); +READ16_HANDLER( rbisland_cchip_ram_r ); +WRITE16_HANDLER( rbisland_cchip_ctrl_w ); +WRITE16_HANDLER( rbisland_cchip_bank_w ); +WRITE16_HANDLER( rbisland_cchip_ram_w ); /*----------- defined in video/rainbow.c -----------*/ -SCREEN_UPDATE( rainbow ); +SCREEN_UPDATE_IND16( rainbow ); VIDEO_START( jumping ); -SCREEN_UPDATE( jumping ); +SCREEN_UPDATE_IND16( jumping ); WRITE16_HANDLER( jumping_spritectrl_w ); -WRITE16_HANDLER( rainbow_spritectrl_w ); +WRITE16_HANDLER( rbisland_spritectrl_w ); diff -Nru mame-0.144/src/mame/includes/rallyx.h mame-0.145/src/mame/includes/rallyx.h --- mame-0.144/src/mame/includes/rallyx.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rallyx.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,6 +34,8 @@ /* devices */ cpu_device *m_maincpu; device_t *m_samples; + + UINT8 m_main_irq_mask; }; @@ -50,6 +52,6 @@ VIDEO_START( jungler ); VIDEO_START( locomotn ); VIDEO_START( commsega ); -SCREEN_UPDATE( rallyx ); -SCREEN_UPDATE( jungler ); -SCREEN_UPDATE( locomotn ); +SCREEN_UPDATE_IND16( rallyx ); +SCREEN_UPDATE_IND16( jungler ); +SCREEN_UPDATE_IND16( locomotn ); diff -Nru mame-0.144/src/mame/includes/rampart.h mame-0.145/src/mame/includes/rampart.h --- mame-0.144/src/mame/includes/rampart.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/rampart.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,4 +20,4 @@ /*----------- defined in video/rampart.c -----------*/ VIDEO_START( rampart ); -SCREEN_UPDATE( rampart ); +SCREEN_UPDATE_IND16( rampart ); diff -Nru mame-0.144/src/mame/includes/rastan.h mame-0.145/src/mame/includes/rastan.h --- mame-0.144/src/mame/includes/rastan.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/rastan.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,4 +33,4 @@ WRITE16_HANDLER( rastan_spritectrl_w ); -SCREEN_UPDATE( rastan ); +SCREEN_UPDATE_IND16( rastan ); diff -Nru mame-0.144/src/mame/includes/realbrk.h mame-0.145/src/mame/includes/realbrk.h --- mame-0.144/src/mame/includes/realbrk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/realbrk.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,8 +12,8 @@ UINT16 *m_vregs; UINT16 *m_vram_0ras; UINT16 *m_vram_1ras; - bitmap_t *m_tmpbitmap0; - bitmap_t *m_tmpbitmap1; + bitmap_ind16 *m_tmpbitmap0; + bitmap_ind16 *m_tmpbitmap1; int m_disable_video; tilemap_t *m_tilemap_0; tilemap_t *m_tilemap_1; @@ -28,8 +28,8 @@ #define REALBRK_H VIDEO_START(realbrk); -SCREEN_UPDATE(realbrk); -SCREEN_UPDATE(dai2kaku); +SCREEN_UPDATE_IND16(realbrk); +SCREEN_UPDATE_IND16(dai2kaku); WRITE16_HANDLER( realbrk_vram_0_w ); WRITE16_HANDLER( realbrk_vram_1_w ); diff -Nru mame-0.144/src/mame/includes/relief.h mame-0.145/src/mame/includes/relief.h --- mame-0.144/src/mame/includes/relief.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/relief.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,4 +21,4 @@ /*----------- defined in video/relief.c -----------*/ VIDEO_START( relief ); -SCREEN_UPDATE( relief ); +SCREEN_UPDATE_IND16( relief ); diff -Nru mame-0.144/src/mame/includes/renegade.h mame-0.145/src/mame/includes/renegade.h --- mame-0.144/src/mame/includes/renegade.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/renegade.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,7 +4,9 @@ { public: renegade_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 m_bank; int m_mcu_sim; @@ -35,12 +37,14 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; UINT8 *m_spriteram; + + required_device m_maincpu; }; /*----------- defined in video/renegade.c -----------*/ -SCREEN_UPDATE( renegade ); +SCREEN_UPDATE_IND16( renegade ); VIDEO_START( renegade ); WRITE8_HANDLER( renegade_scroll0_w ); WRITE8_HANDLER( renegade_scroll1_w ); diff -Nru mame-0.144/src/mame/includes/retofinv.h mame-0.145/src/mame/includes/retofinv.h --- mame-0.144/src/mame/includes/retofinv.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/retofinv.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,6 +25,9 @@ int m_bg_bank; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; + + UINT8 m_main_irq_mask; + UINT8 m_sub_irq_mask; }; @@ -48,7 +51,7 @@ VIDEO_START( retofinv ); PALETTE_INIT( retofinv ); -SCREEN_UPDATE( retofinv ); +SCREEN_UPDATE_IND16( retofinv ); WRITE8_HANDLER( retofinv_bg_videoram_w ); WRITE8_HANDLER( retofinv_fg_videoram_w ); WRITE8_HANDLER( retofinv_gfx_ctrl_w ); diff -Nru mame-0.144/src/mame/includes/rltennis.h mame-0.145/src/mame/includes/rltennis.h --- mame-0.144/src/mame/includes/rltennis.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rltennis.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,10 +14,6 @@ UINT16 m_blitter[RLT_NUM_BLITTER_REGS]; - UINT8 *m_palette; - INT32 m_palpos_r; - INT32 m_palpos_w; - INT32 m_data760000; INT32 m_data740000; INT32 m_dac_counter; @@ -28,7 +24,7 @@ INT32 m_unk_counter; - bitmap_t *m_tmp_bitmap[RLT_NUM_BITMAPS]; + bitmap_ind16 *m_tmp_bitmap[RLT_NUM_BITMAPS]; device_t *m_dac_1; device_t *m_dac_2; @@ -45,10 +41,6 @@ WRITE16_HANDLER( rlt_blitter_w ); -WRITE16_HANDLER( rlt_ramdac_address_wm_w ); -WRITE16_HANDLER( rlt_ramdac_address_rm_w ); -WRITE16_HANDLER( rlt_ramdac_data_w ); -READ16_HANDLER( rlt_ramdac_data_r ); VIDEO_START( rltennis ); -SCREEN_UPDATE( rltennis ); +SCREEN_UPDATE_IND16( rltennis ); diff -Nru mame-0.144/src/mame/includes/rockrage.h mame-0.145/src/mame/includes/rockrage.h --- mame-0.144/src/mame/includes/rockrage.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rockrage.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ WRITE8_HANDLER( rockrage_vreg_w ); -SCREEN_UPDATE( rockrage ); +SCREEN_UPDATE_IND16( rockrage ); PALETTE_INIT( rockrage ); void rockrage_tile_callback(running_machine &machine, int layer, int bank, int *code, int *color, int *flags); diff -Nru mame-0.144/src/mame/includes/rocnrope.h mame-0.145/src/mame/includes/rocnrope.h --- mame-0.144/src/mame/includes/rocnrope.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rocnrope.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,6 +13,8 @@ /* video-related */ tilemap_t *m_bg_tilemap; + + UINT8 m_irq_mask; }; /*----------- defined in video/rocnrope.c -----------*/ @@ -23,4 +25,4 @@ PALETTE_INIT( rocnrope ); VIDEO_START( rocnrope ); -SCREEN_UPDATE( rocnrope ); +SCREEN_UPDATE_IND16( rocnrope ); diff -Nru mame-0.144/src/mame/includes/rohga.h mame-0.145/src/mame/includes/rohga.h --- mame-0.144/src/mame/includes/rohga.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/rohga.h 2012-02-06 21:30:44.000000000 +0000 @@ -45,8 +45,14 @@ WRITE16_HANDLER( rohga_buffer_spriteram16_w ); VIDEO_START( rohga ); +VIDEO_START( schmeisr ); +VIDEO_START( wizdfire ); -SCREEN_UPDATE( rohga ); -SCREEN_UPDATE( schmeisr ); -SCREEN_UPDATE( wizdfire ); -SCREEN_UPDATE( nitrobal ); + +SCREEN_UPDATE_IND16( rohga ); +SCREEN_UPDATE_RGB32( wizdfire ); +SCREEN_UPDATE_RGB32( nitrobal ); + +UINT16 rohga_pri_callback(UINT16 x); +UINT16 schmeisr_col_callback(UINT16 x); +UINT16 rohga_col_callback(UINT16 x); diff -Nru mame-0.144/src/mame/includes/rollerg.h mame-0.145/src/mame/includes/rollerg.h --- mame-0.144/src/mame/includes/rollerg.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rollerg.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ extern void rollerg_zoom_callback(running_machine &machine, int *code,int *color,int *flags); VIDEO_START( rollerg ); -SCREEN_UPDATE( rollerg ); +SCREEN_UPDATE_IND16( rollerg ); diff -Nru mame-0.144/src/mame/includes/rollrace.h mame-0.145/src/mame/includes/rollrace.h --- mame-0.144/src/mame/includes/rollrace.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/rollrace.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,13 +17,16 @@ int m_ra_spritebank; UINT8 *m_spriteram; size_t m_spriteram_size; + + UINT8 m_nmi_mask; + UINT8 m_sound_nmi_mask; }; /*----------- defined in video/rollrace.c -----------*/ PALETTE_INIT( rollrace ); -SCREEN_UPDATE( rollrace ); +SCREEN_UPDATE_IND16( rollrace ); WRITE8_HANDLER( rollrace_charbank_w ); WRITE8_HANDLER( rollrace_backgroundpage_w ); diff -Nru mame-0.144/src/mame/includes/route16.h mame-0.145/src/mame/includes/route16.h --- mame-0.144/src/mame/includes/route16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/route16.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,6 +20,6 @@ WRITE8_HANDLER( route16_out0_w ); WRITE8_HANDLER( route16_out1_w ); -SCREEN_UPDATE( route16 ); -SCREEN_UPDATE( stratvox ); -SCREEN_UPDATE( ttmahjng ); +SCREEN_UPDATE_RGB32( route16 ); +SCREEN_UPDATE_RGB32( stratvox ); +SCREEN_UPDATE_RGB32( ttmahjng ); diff -Nru mame-0.144/src/mame/includes/rpunch.h mame-0.145/src/mame/includes/rpunch.h --- mame-0.144/src/mame/includes/rpunch.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rpunch.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ /*----------- defined in video/rpunch.c -----------*/ VIDEO_START( rpunch ); -SCREEN_UPDATE( rpunch ); +SCREEN_UPDATE_IND16( rpunch ); WRITE16_HANDLER( rpunch_videoram_w ); WRITE16_HANDLER( rpunch_videoreg_w ); diff -Nru mame-0.144/src/mame/includes/runaway.h mame-0.145/src/mame/includes/runaway.h --- mame-0.144/src/mame/includes/runaway.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/runaway.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,8 +16,8 @@ VIDEO_START( runaway ); VIDEO_START( qwak ); -SCREEN_UPDATE( runaway ); -SCREEN_UPDATE( qwak ); +SCREEN_UPDATE_IND16( runaway ); +SCREEN_UPDATE_IND16( qwak ); WRITE8_HANDLER( runaway_paletteram_w ); WRITE8_HANDLER( runaway_video_ram_w ); diff -Nru mame-0.144/src/mame/includes/rungun.h mame-0.145/src/mame/includes/rungun.h --- mame-0.144/src/mame/includes/rungun.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/rungun.h 2012-02-06 21:30:44.000000000 +0000 @@ -48,4 +48,4 @@ WRITE16_HANDLER( rng_936_videoram_w ); VIDEO_START( rng ); -SCREEN_UPDATE( rng ); +SCREEN_UPDATE_IND16( rng ); diff -Nru mame-0.144/src/mame/includes/sauro.h mame-0.145/src/mame/includes/sauro.h --- mame-0.144/src/mame/includes/sauro.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sauro.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,5 +30,5 @@ VIDEO_START( sauro ); VIDEO_START( trckydoc ); -SCREEN_UPDATE( sauro ); -SCREEN_UPDATE( trckydoc ); +SCREEN_UPDATE_IND16( sauro ); +SCREEN_UPDATE_IND16( trckydoc ); diff -Nru mame-0.144/src/mame/includes/sbasketb.h mame-0.145/src/mame/includes/sbasketb.h --- mame-0.144/src/mame/includes/sbasketb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sbasketb.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,6 +14,8 @@ /* video-related */ tilemap_t *m_bg_tilemap; + + UINT8 m_irq_mask; }; /*----------- defined in video/sbasketb.c -----------*/ @@ -24,4 +26,4 @@ PALETTE_INIT( sbasketb ); VIDEO_START( sbasketb ); -SCREEN_UPDATE( sbasketb ); +SCREEN_UPDATE_IND16( sbasketb ); diff -Nru mame-0.144/src/mame/includes/sbugger.h mame-0.145/src/mame/includes/sbugger.h --- mame-0.144/src/mame/includes/sbugger.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sbugger.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,7 +14,7 @@ /*----------- defined in video/sbugger.c -----------*/ PALETTE_INIT(sbugger); -SCREEN_UPDATE(sbugger); +SCREEN_UPDATE_IND16(sbugger); VIDEO_START(sbugger); WRITE8_HANDLER( sbugger_videoram_attr_w ); WRITE8_HANDLER( sbugger_videoram_w ); diff -Nru mame-0.144/src/mame/includes/scotrsht.h mame-0.145/src/mame/includes/scotrsht.h --- mame-0.144/src/mame/includes/scotrsht.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/scotrsht.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ PALETTE_INIT( scotrsht ); VIDEO_START( scotrsht ); -SCREEN_UPDATE( scotrsht ); +SCREEN_UPDATE_IND16( scotrsht ); diff -Nru mame-0.144/src/mame/includes/sderby.h mame-0.145/src/mame/includes/sderby.h --- mame-0.144/src/mame/includes/sderby.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sderby.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,6 +25,6 @@ WRITE16_HANDLER( sderby_md_videoram_w ); WRITE16_HANDLER( sderby_fg_videoram_w ); VIDEO_START( sderby ); -SCREEN_UPDATE( sderby ); -SCREEN_UPDATE( pmroulet ); +SCREEN_UPDATE_IND16( sderby ); +SCREEN_UPDATE_IND16( pmroulet ); WRITE16_HANDLER( sderby_scroll_w ); diff -Nru mame-0.144/src/mame/includes/segag80r.h mame-0.145/src/mame/includes/segag80r.h --- mame-0.144/src/mame/includes/segag80r.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/segag80r.h 2012-02-06 21:30:44.000000000 +0000 @@ -77,7 +77,7 @@ WRITE8_HANDLER( segag80r_video_port_w ); VIDEO_START( segag80r ); -SCREEN_UPDATE( segag80r ); +SCREEN_UPDATE_IND16( segag80r ); READ8_HANDLER( spaceod_back_port_r ); diff -Nru mame-0.144/src/mame/includes/segag80v.h mame-0.145/src/mame/includes/segag80v.h --- mame-0.144/src/mame/includes/segag80v.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/segag80v.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ /*----------- defined in video/segag80v.c -----------*/ VIDEO_START( segag80v ); -SCREEN_UPDATE( segag80v ); +SCREEN_UPDATE_RGB32( segag80v ); diff -Nru mame-0.144/src/mame/includes/segamsys.h mame-0.145/src/mame/includes/segamsys.h --- mame-0.144/src/mame/includes/segamsys.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/segamsys.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,15 +8,15 @@ ADDRESS_MAP_EXTERN( sms_io_map, 8 ); -extern SCREEN_UPDATE(megatech_bios); -extern SCREEN_UPDATE(megaplay_bios); -extern SCREEN_UPDATE(megatech_md_sms); +extern SCREEN_UPDATE_RGB32(megatech_bios); +extern SCREEN_UPDATE_RGB32(megaplay_bios); +extern SCREEN_UPDATE_RGB32(megatech_md_sms); extern DRIVER_INIT( megatech_bios ); extern DRIVER_INIT( hazemd_segasyse ); extern MACHINE_RESET(megatech_bios); extern MACHINE_RESET(megatech_md_sms); -extern SCREEN_EOF(megatech_bios); -extern SCREEN_EOF(megatech_md_sms); +extern SCREEN_VBLANK(megatech_bios); +extern SCREEN_VBLANK(megatech_md_sms); extern READ8_HANDLER( sms_vcounter_r ); extern READ8_HANDLER( sms_vdp_data_r ); @@ -35,14 +35,13 @@ extern WRITE8_HANDLER( md_sms_vdp_ctrl_w ); extern VIDEO_START(sms); -extern SCREEN_EOF(sms); -extern MACHINE_RESET(sms); +extern SCREEN_VBLANK(sms); extern READ8_HANDLER( sms_vdp_2_data_r ); extern WRITE8_HANDLER( sms_vdp_2_data_w ); extern READ8_HANDLER( sms_vdp_2_ctrl_r ); extern WRITE8_HANDLER( sms_vdp_2_ctrl_w ); -extern SCREEN_EOF(systeme); -extern SCREEN_UPDATE(systeme); +extern SCREEN_VBLANK(systeme); +extern SCREEN_UPDATE_RGB32(systeme); extern MACHINE_RESET(systeme); extern UINT8* sms_mainram; extern UINT8* vdp2_vram_bank0; diff -Nru mame-0.144/src/mame/includes/segas16.h mame-0.145/src/mame/includes/segas16.h --- mame-0.144/src/mame/includes/segas16.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/segas16.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ /* misc video */ UINT8 m_road_priority; // segaxbd - bitmap_t *m_tmp_bitmap; // segaybd & segas18 + bitmap_ind16 *m_tmp_bitmap; // segaybd & segas18 UINT8 m_grayscale_enable; // segas18 UINT8 m_vdp_enable; // segas18 UINT8 m_vdp_mixing; // segas18 @@ -105,23 +105,23 @@ VIDEO_START( hangon ); VIDEO_START( sharrier ); -SCREEN_UPDATE( hangon ); +SCREEN_UPDATE_IND16( hangon ); /*----------- defined in video/segas16a.c -----------*/ VIDEO_START( system16a ); -SCREEN_UPDATE( system16a ); +SCREEN_UPDATE_IND16( system16a ); /*----------- defined in video/segas16b.c -----------*/ VIDEO_START( system16b ); VIDEO_START( timscanr ); -SCREEN_UPDATE( system16b ); +SCREEN_UPDATE_IND16( system16b ); /*----------- defined in video/segas18.c -----------*/ VIDEO_START( system18 ); -SCREEN_UPDATE( system18 ); +SCREEN_UPDATE_IND16( system18 ); void system18_set_grayscale(running_machine &machine, int enable); void system18_set_vdp_enable(running_machine &machine, int eanble); @@ -131,18 +131,18 @@ VIDEO_START( outrun ); VIDEO_START( shangon ); -SCREEN_UPDATE( outrun ); -SCREEN_UPDATE( shangon ); +SCREEN_UPDATE_IND16( outrun ); +SCREEN_UPDATE_IND16( shangon ); /*----------- defined in video/segaxbd.c -----------*/ VIDEO_START( xboard ); -SCREEN_UPDATE( xboard ); +SCREEN_UPDATE_IND16( xboard ); /*----------- defined in video/segaybd.c -----------*/ VIDEO_START( yboard ); -SCREEN_UPDATE( yboard ); +SCREEN_UPDATE_IND16( yboard ); /*----------- defined in machine/s16fd.c -----------*/ diff -Nru mame-0.144/src/mame/includes/segas24.h mame-0.145/src/mame/includes/segas24.h --- mame-0.144/src/mame/includes/segas24.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/segas24.h 2012-02-06 21:30:44.000000000 +0000 @@ -104,4 +104,4 @@ /*----------- defined in video/segas24.c -----------*/ -SCREEN_UPDATE(system24); +SCREEN_UPDATE_IND16(system24); diff -Nru mame-0.144/src/mame/includes/segas32.h mame-0.145/src/mame/includes/segas32.h --- mame-0.144/src/mame/includes/segas32.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/segas32.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,8 +8,8 @@ typedef void (*sys32_output_callback)(int which, UINT16 data); struct layer_info { - bitmap_t * bitmap; - UINT8 * transparent; + bitmap_ind16 *bitmap; + UINT8 *transparent; }; @@ -92,8 +92,9 @@ VIDEO_START(system32); VIDEO_START(multi32); -SCREEN_UPDATE(system32); -SCREEN_UPDATE(multi32); +SCREEN_UPDATE_RGB32(system32); +SCREEN_UPDATE_RGB32(multi32_left); +SCREEN_UPDATE_RGB32(multi32_right); void system32_set_vblank(running_machine &machine, int state); READ16_HANDLER( system32_videoram_r ); diff -Nru mame-0.144/src/mame/includes/seibuspi.h mame-0.145/src/mame/includes/seibuspi.h --- mame-0.144/src/mame/includes/seibuspi.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/seibuspi.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,10 +54,10 @@ /*----------- defined in video/seibuspi.c -----------*/ VIDEO_START( spi ); -SCREEN_UPDATE( spi ); +SCREEN_UPDATE_RGB32( spi ); VIDEO_START( sys386f2 ); -SCREEN_UPDATE( sys386f2 ); +SCREEN_UPDATE_RGB32( sys386f2 ); READ32_HANDLER( spi_layer_bank_r ); WRITE32_HANDLER( spi_layer_bank_w ); diff -Nru mame-0.144/src/mame/includes/seicross.h mame-0.145/src/mame/includes/seicross.h --- mame-0.144/src/mame/includes/seicross.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/seicross.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,6 +17,8 @@ UINT8 *m_colorram; tilemap_t *m_bg_tilemap; UINT8 *m_row_scroll; + + UINT8 m_irq_mask; }; @@ -27,4 +29,4 @@ PALETTE_INIT( seicross ); VIDEO_START( seicross ); -SCREEN_UPDATE( seicross ); +SCREEN_UPDATE_IND16( seicross ); diff -Nru mame-0.144/src/mame/includes/sei_crtc.h mame-0.145/src/mame/includes/sei_crtc.h --- mame-0.144/src/mame/includes/sei_crtc.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sei_crtc.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,4 +11,4 @@ WRITE16_HANDLER( seibucrtc_vregs_w ); void seibucrtc_sc0bank_w(UINT16 data); VIDEO_START( seibu_crtc ); -SCREEN_UPDATE( seibu_crtc ); +SCREEN_UPDATE_IND16( seibu_crtc ); diff -Nru mame-0.144/src/mame/includes/senjyo.h mame-0.145/src/mame/includes/senjyo.h --- mame-0.144/src/mame/includes/senjyo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/senjyo.h 2012-02-06 21:30:44.000000000 +0000 @@ -62,4 +62,4 @@ WRITE8_HANDLER( senjyo_bgstripes_w ); VIDEO_START( senjyo ); -SCREEN_UPDATE( senjyo ); +SCREEN_UPDATE_IND16( senjyo ); diff -Nru mame-0.144/src/mame/includes/seta2.h mame-0.145/src/mame/includes/seta2.h --- mame-0.144/src/mame/includes/seta2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/seta2.h 2012-02-06 21:30:44.000000000 +0000 @@ -3,8 +3,10 @@ public: seta2_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), m_nvram(*this, "nvram") { } + required_device m_maincpu; optional_shared_ptr m_nvram; UINT16 *m_vregs; @@ -35,5 +37,5 @@ VIDEO_START( seta2 ); VIDEO_START( seta2_xoffset ); VIDEO_START( seta2_yoffset ); -SCREEN_UPDATE( seta2 ); -SCREEN_EOF( seta2 ); +SCREEN_UPDATE_IND16( seta2 ); +SCREEN_VBLANK( seta2 ); diff -Nru mame-0.144/src/mame/includes/seta.h mame-0.145/src/mame/includes/seta.h --- mame-0.144/src/mame/includes/seta.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/seta.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,10 @@ { public: seta_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_subcpu(*this,"sub") + { } UINT8 *m_sharedram; UINT16 *m_workram; @@ -82,6 +85,9 @@ UINT16 m_pairslove_protram[0x200]; UINT16 m_pairslove_protram_old[0x200]; UINT16 m_downtown_protection[0x200/2]; + + required_device m_maincpu; + optional_device m_subcpu; }; /*----------- defined in video/seta.c -----------*/ @@ -108,11 +114,11 @@ VIDEO_START( seta_2_layers); VIDEO_START( oisipuzl_2_layers ); -SCREEN_UPDATE( seta ); -SCREEN_UPDATE( seta_no_layers ); -SCREEN_UPDATE( usclssic ); -SCREEN_UPDATE( inttoote ); -SCREEN_UPDATE( setaroul ); +SCREEN_UPDATE_IND16( seta ); +SCREEN_UPDATE_IND16( seta_no_layers ); +SCREEN_UPDATE_IND16( usclssic ); +SCREEN_UPDATE_IND16( inttoote ); +SCREEN_UPDATE_IND16( setaroul ); -SCREEN_EOF( setaroul ); +SCREEN_VBLANK( setaroul ); diff -Nru mame-0.144/src/mame/includes/sf.h mame-0.145/src/mame/includes/sf.h --- mame-0.144/src/mame/includes/sf.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sf.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE16_HANDLER( sf_gfxctrl_w ); VIDEO_START( sf ); -SCREEN_UPDATE( sf ); +SCREEN_UPDATE_IND16( sf ); diff -Nru mame-0.144/src/mame/includes/shadfrce.h mame-0.145/src/mame/includes/shadfrce.h --- mame-0.144/src/mame/includes/shadfrce.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/shadfrce.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,8 +31,8 @@ WRITE16_HANDLER ( shadfrce_bg0scrolly_w ); WRITE16_HANDLER ( shadfrce_bg1scrolly_w ); VIDEO_START( shadfrce ); -SCREEN_EOF(shadfrce); -SCREEN_UPDATE( shadfrce ); +SCREEN_VBLANK(shadfrce); +SCREEN_UPDATE_IND16( shadfrce ); WRITE16_HANDLER( shadfrce_fgvideoram_w ); WRITE16_HANDLER( shadfrce_bg0videoram_w ); WRITE16_HANDLER( shadfrce_bg1videoram_w ); diff -Nru mame-0.144/src/mame/includes/shangha3.h mame-0.145/src/mame/includes/shangha3.h --- mame-0.144/src/mame/includes/shangha3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/shangha3.h 2012-02-06 21:30:44.000000000 +0000 @@ -11,7 +11,7 @@ int m_do_shadows; UINT16 m_gfxlist_addr; - bitmap_t *m_rawbitmap; + bitmap_ind16 m_rawbitmap; UINT8 m_drawmode_table[16]; }; @@ -23,4 +23,4 @@ WRITE16_HANDLER( shangha3_gfxlist_addr_w ); WRITE16_HANDLER( shangha3_blitter_go_w ); VIDEO_START( shangha3 ); -SCREEN_UPDATE( shangha3 ); +SCREEN_UPDATE_IND16( shangha3 ); diff -Nru mame-0.144/src/mame/includes/shangkid.h mame-0.145/src/mame/includes/shangkid.h --- mame-0.144/src/mame/includes/shangkid.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/shangkid.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,9 +17,9 @@ /*----------- defined in video/shangkid.c -----------*/ VIDEO_START( shangkid ); -SCREEN_UPDATE( shangkid ); +SCREEN_UPDATE_IND16( shangkid ); WRITE8_HANDLER( shangkid_videoram_w ); PALETTE_INIT( dynamski ); -SCREEN_UPDATE( dynamski ); +SCREEN_UPDATE_IND16( dynamski ); diff -Nru mame-0.144/src/mame/includes/shaolins.h mame-0.145/src/mame/includes/shaolins.h --- mame-0.144/src/mame/includes/shaolins.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/shaolins.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: shaolins_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } size_t m_spriteram_size; UINT8 *m_spriteram; @@ -12,6 +14,8 @@ tilemap_t *m_bg_tilemap; UINT8 m_nmi_enable; + + required_device m_maincpu; }; @@ -25,4 +29,4 @@ PALETTE_INIT( shaolins ); VIDEO_START( shaolins ); -SCREEN_UPDATE( shaolins ); +SCREEN_UPDATE_IND16( shaolins ); diff -Nru mame-0.144/src/mame/includes/shisen.h mame-0.145/src/mame/includes/shisen.h --- mame-0.144/src/mame/includes/shisen.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/shisen.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,4 +18,4 @@ WRITE8_HANDLER( sichuan2_paletteram_w ); VIDEO_START( sichuan2 ); -SCREEN_UPDATE( sichuan2 ); +SCREEN_UPDATE_IND16( sichuan2 ); diff -Nru mame-0.144/src/mame/includes/shootout.h mame-0.145/src/mame/includes/shootout.h --- mame-0.144/src/mame/includes/shootout.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/shootout.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,5 +20,5 @@ PALETTE_INIT( shootout ); VIDEO_START( shootout ); -SCREEN_UPDATE( shootout ); -SCREEN_UPDATE( shootouj ); +SCREEN_UPDATE_IND16( shootout ); +SCREEN_UPDATE_IND16( shootouj ); diff -Nru mame-0.144/src/mame/includes/shuuz.h mame-0.145/src/mame/includes/shuuz.h --- mame-0.144/src/mame/includes/shuuz.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/shuuz.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ /*----------- defined in video/shuuz.c -----------*/ VIDEO_START( shuuz ); -SCREEN_UPDATE( shuuz ); +SCREEN_UPDATE_IND16( shuuz ); diff -Nru mame-0.144/src/mame/includes/sidearms.h mame-0.145/src/mame/includes/sidearms.h --- mame-0.144/src/mame/includes/sidearms.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sidearms.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,5 +36,5 @@ WRITE8_HANDLER( sidearms_gfxctrl_w ); VIDEO_START( sidearms ); -SCREEN_UPDATE( sidearms ); -SCREEN_EOF( sidearms ); +SCREEN_UPDATE_IND16( sidearms ); +SCREEN_VBLANK( sidearms ); diff -Nru mame-0.144/src/mame/includes/sidepckt.h mame-0.145/src/mame/includes/sidepckt.h --- mame-0.144/src/mame/includes/sidepckt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sidepckt.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ PALETTE_INIT( sidepckt ); VIDEO_START( sidepckt ); -SCREEN_UPDATE( sidepckt ); +SCREEN_UPDATE_IND16( sidepckt ); WRITE8_HANDLER( sidepckt_flipscreen_w ); WRITE8_HANDLER( sidepckt_videoram_w ); diff -Nru mame-0.144/src/mame/includes/silkroad.h mame-0.145/src/mame/includes/silkroad.h --- mame-0.144/src/mame/includes/silkroad.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/silkroad.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,4 +21,4 @@ WRITE32_HANDLER( silkroad_fgram2_w ); WRITE32_HANDLER( silkroad_fgram3_w ); VIDEO_START(silkroad); -SCREEN_UPDATE(silkroad); +SCREEN_UPDATE_IND16(silkroad); diff -Nru mame-0.144/src/mame/includes/simpl156.h mame-0.145/src/mame/includes/simpl156.h --- mame-0.144/src/mame/includes/simpl156.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/simpl156.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ /*----------- defined in video/simpl156.c -----------*/ VIDEO_START( simpl156 ); -SCREEN_UPDATE( simpl156 ); +SCREEN_UPDATE_IND16( simpl156 ); diff -Nru mame-0.144/src/mame/includes/simpsons.h mame-0.145/src/mame/includes/simpsons.h --- mame-0.144/src/mame/includes/simpsons.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/simpsons.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,7 +42,7 @@ /*----------- defined in video/simpsons.c -----------*/ void simpsons_video_banking( running_machine &machine, int select ); -SCREEN_UPDATE( simpsons ); +SCREEN_UPDATE_IND16( simpsons ); extern void simpsons_tile_callback(running_machine &machine, int layer,int bank,int *code,int *color,int *flags,int *priority); extern void simpsons_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask); diff -Nru mame-0.144/src/mame/includes/skullxbo.h mame-0.145/src/mame/includes/skullxbo.h --- mame-0.144/src/mame/includes/skullxbo.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/skullxbo.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,6 +22,6 @@ WRITE16_HANDLER( skullxbo_mobmsb_w ); VIDEO_START( skullxbo ); -SCREEN_UPDATE( skullxbo ); +SCREEN_UPDATE_IND16( skullxbo ); void skullxbo_scanline_update(running_machine &machine, int param); diff -Nru mame-0.144/src/mame/includes/skydiver.h mame-0.145/src/mame/includes/skydiver.h --- mame-0.144/src/mame/includes/skydiver.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/skydiver.h 2012-02-06 21:30:44.000000000 +0000 @@ -53,4 +53,4 @@ WRITE8_HANDLER( skydiver_width_w ); WRITE8_HANDLER( skydiver_coin_lockout_w ); VIDEO_START( skydiver ); -SCREEN_UPDATE( skydiver ); +SCREEN_UPDATE_IND16( skydiver ); diff -Nru mame-0.144/src/mame/includes/skyfox.h mame-0.145/src/mame/includes/skyfox.h --- mame-0.144/src/mame/includes/skyfox.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/skyfox.h 2012-02-06 21:30:44.000000000 +0000 @@ -32,5 +32,5 @@ PALETTE_INIT( skyfox ); -SCREEN_UPDATE( skyfox ); +SCREEN_UPDATE_IND16( skyfox ); diff -Nru mame-0.144/src/mame/includes/skykid.h mame-0.145/src/mame/includes/skykid.h --- mame-0.144/src/mame/includes/skykid.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/skykid.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,13 +13,15 @@ UINT8 m_priority; UINT16 m_scroll_x; UINT16 m_scroll_y; + UINT8 m_main_irq_mask; + UINT8 m_mcu_irq_mask; }; /*----------- defined in video/skykid.c -----------*/ VIDEO_START( skykid ); -SCREEN_UPDATE( skykid ); +SCREEN_UPDATE_IND16( skykid ); PALETTE_INIT( skykid ); READ8_HANDLER( skykid_videoram_r ); diff -Nru mame-0.144/src/mame/includes/skyraid.h mame-0.145/src/mame/includes/skyraid.h --- mame-0.144/src/mame/includes/skyraid.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/skyraid.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ UINT8* m_pos_ram; UINT8* m_obj_ram; - bitmap_t *m_helper; + bitmap_ind16 m_helper; }; @@ -29,4 +29,4 @@ /*----------- defined in video/skyraid.c -----------*/ VIDEO_START(skyraid); -SCREEN_UPDATE(skyraid); +SCREEN_UPDATE_IND16(skyraid); diff -Nru mame-0.144/src/mame/includes/slapfght.h mame-0.145/src/mame/includes/slapfght.h --- mame-0.144/src/mame/includes/slapfght.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/slapfght.h 2012-02-06 21:30:44.000000000 +0000 @@ -52,6 +52,7 @@ int m_slapfight_palette_bank; tilemap_t *m_pf1_tilemap; tilemap_t *m_fix_tilemap; + UINT8 m_irq_mask; }; @@ -122,8 +123,8 @@ /*----------- defined in video/slapfght.c -----------*/ -SCREEN_UPDATE( slapfight ); -SCREEN_UPDATE( perfrman ); +SCREEN_UPDATE_IND16( slapfight ); +SCREEN_UPDATE_IND16( perfrman ); VIDEO_START( slapfight ); VIDEO_START( perfrman ); diff -Nru mame-0.144/src/mame/includes/slapshot.h mame-0.145/src/mame/includes/slapshot.h --- mame-0.144/src/mame/includes/slapshot.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/slapshot.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,5 +58,5 @@ /*----------- defined in video/slapshot.c -----------*/ VIDEO_START( slapshot ); -SCREEN_UPDATE( slapshot ); -SCREEN_EOF( taito_no_buffer ); +SCREEN_UPDATE_IND16( slapshot ); +SCREEN_VBLANK( taito_no_buffer ); diff -Nru mame-0.144/src/mame/includes/snes.h mame-0.145/src/mame/includes/snes.h --- mame-0.144/src/mame/includes/snes.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/snes.h 2012-02-06 21:30:44.000000000 +0000 @@ -688,7 +688,7 @@ extern void snes_latch_counters(running_machine &machine); extern VIDEO_START( snes ); -extern SCREEN_UPDATE( snes ); +extern SCREEN_UPDATE_RGB32( snes ); extern READ8_HANDLER( snes_ppu_read ); extern WRITE8_HANDLER( snes_ppu_write ); diff -Nru mame-0.144/src/mame/includes/snk6502.h mame-0.145/src/mame/includes/snk6502.h --- mame-0.144/src/mame/includes/snk6502.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/snk6502.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,6 +29,8 @@ tilemap_t *m_fg_tilemap; rgb_t m_palette[64]; + + UINT8 m_irq_mask; }; @@ -73,7 +75,7 @@ PALETTE_INIT( snk6502 ); VIDEO_START( snk6502 ); -SCREEN_UPDATE( snk6502 ); +SCREEN_UPDATE_IND16( snk6502 ); VIDEO_START( pballoon ); WRITE8_HANDLER( satansat_b002_w ); diff -Nru mame-0.144/src/mame/includes/snk68.h mame-0.145/src/mame/includes/snk68.h --- mame-0.144/src/mame/includes/snk68.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/snk68.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ VIDEO_START( pow ); VIDEO_START( searchar ); -SCREEN_UPDATE( pow ); +SCREEN_UPDATE_IND16( pow ); WRITE16_HANDLER( pow_paletteram16_word_w ); WRITE16_HANDLER( pow_flipscreen16_w ); WRITE16_HANDLER( searchar_flipscreen16_w ); diff -Nru mame-0.144/src/mame/includes/snk.h mame-0.145/src/mame/includes/snk.h --- mame-0.144/src/mame/includes/snk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/snk.h 2012-02-06 21:30:44.000000000 +0000 @@ -67,11 +67,11 @@ extern VIDEO_START( psychos ); extern VIDEO_START( tdfever ); -extern SCREEN_UPDATE( marvins ); -extern SCREEN_UPDATE( tnk3 ); -extern SCREEN_UPDATE( ikari ); -extern SCREEN_UPDATE( gwar ); -extern SCREEN_UPDATE( tdfever ); +extern SCREEN_UPDATE_IND16( marvins ); +extern SCREEN_UPDATE_IND16( tnk3 ); +extern SCREEN_UPDATE_IND16( ikari ); +extern SCREEN_UPDATE_IND16( gwar ); +extern SCREEN_UPDATE_IND16( tdfever ); extern WRITE8_HANDLER( snk_fg_scrollx_w ); extern WRITE8_HANDLER( snk_fg_scrolly_w ); diff -Nru mame-0.144/src/mame/includes/snookr10.h mame-0.145/src/mame/includes/snookr10.h --- mame-0.144/src/mame/includes/snookr10.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/snookr10.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,5 +26,5 @@ PALETTE_INIT( apple10 ); VIDEO_START( snookr10 ); VIDEO_START( apple10 ); -SCREEN_UPDATE( snookr10 ); +SCREEN_UPDATE_IND16( snookr10 ); diff -Nru mame-0.144/src/mame/includes/snowbros.h mame-0.145/src/mame/includes/snowbros.h --- mame-0.144/src/mame/includes/snowbros.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/snowbros.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,7 +4,9 @@ { public: snowbros_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_hyperpac_ram; int m_sb3_music_is_playing; @@ -13,5 +15,7 @@ UINT8 *m_spriteram; UINT16 *m_bootleg_spriteram16; size_t m_spriteram_size; + + required_device m_maincpu; }; diff -Nru mame-0.144/src/mame/includes/solomon.h mame-0.145/src/mame/includes/solomon.h --- mame-0.144/src/mame/includes/solomon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/solomon.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,6 +13,8 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; + + UINT8 m_nmi_mask; }; @@ -25,4 +27,4 @@ WRITE8_HANDLER( solomon_flipscreen_w ); VIDEO_START( solomon ); -SCREEN_UPDATE( solomon ); +SCREEN_UPDATE_IND16( solomon ); diff -Nru mame-0.144/src/mame/includes/sonson.h mame-0.145/src/mame/includes/sonson.h --- mame-0.144/src/mame/includes/sonson.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sonson.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( sonson ); VIDEO_START( sonson ); -SCREEN_UPDATE( sonson ); +SCREEN_UPDATE_IND16( sonson ); diff -Nru mame-0.144/src/mame/includes/spacefb.h mame-0.145/src/mame/includes/spacefb.h --- mame-0.144/src/mame/includes/spacefb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/spacefb.h 2012-02-06 21:30:44.000000000 +0000 @@ -56,7 +56,7 @@ /*----------- defined in video/spacefb.c -----------*/ VIDEO_START( spacefb ); -SCREEN_UPDATE( spacefb ); +SCREEN_UPDATE_RGB32( spacefb ); WRITE8_HANDLER( spacefb_port_0_w ); WRITE8_HANDLER( spacefb_port_2_w ); diff -Nru mame-0.144/src/mame/includes/spbactn.h mame-0.145/src/mame/includes/spbactn.h --- mame-0.144/src/mame/includes/spbactn.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/spbactn.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,12 +8,12 @@ UINT16 *m_fgvideoram; UINT16 *m_spvideoram; - bitmap_t *m_tile_bitmap_bg; - bitmap_t *m_tile_bitmap_fg; + bitmap_ind16 m_tile_bitmap_bg; + bitmap_ind16 m_tile_bitmap_fg; }; /*----------- defined in video/spbactn.c -----------*/ VIDEO_START( spbactn ); -SCREEN_UPDATE( spbactn ); +SCREEN_UPDATE_RGB32( spbactn ); diff -Nru mame-0.144/src/mame/includes/spcforce.h mame-0.145/src/mame/includes/spcforce.h --- mame-0.144/src/mame/includes/spcforce.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/spcforce.h 2012-02-06 21:30:44.000000000 +0000 @@ -10,10 +10,12 @@ int m_sn76496_latch; int m_sn76496_select; + + UINT8 m_irq_mask; }; /*----------- defined in video/spcforce.c -----------*/ WRITE8_HANDLER( spcforce_flip_screen_w ); -SCREEN_UPDATE( spcforce ); +SCREEN_UPDATE_IND16( spcforce ); diff -Nru mame-0.144/src/mame/includes/spdodgeb.h mame-0.145/src/mame/includes/spdodgeb.h --- mame-0.144/src/mame/includes/spdodgeb.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/spdodgeb.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: spdodgeb_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } int m_toggle; int m_adpcm_pos[2]; @@ -29,6 +31,8 @@ int m_lastscroll; UINT8 *m_spriteram; size_t m_spriteram_size; + + required_device m_maincpu; }; @@ -36,8 +40,8 @@ PALETTE_INIT( spdodgeb ); VIDEO_START( spdodgeb ); -SCREEN_UPDATE( spdodgeb ); -INTERRUPT_GEN( spdodgeb_interrupt ); +SCREEN_UPDATE_IND16( spdodgeb ); +TIMER_DEVICE_CALLBACK( spdodgeb_interrupt ); WRITE8_HANDLER( spdodgeb_scrollx_lo_w ); WRITE8_HANDLER( spdodgeb_ctrl_w ); WRITE8_HANDLER( spdodgeb_videoram_w ); diff -Nru mame-0.144/src/mame/includes/speedatk.h mame-0.145/src/mame/includes/speedatk.h --- mame-0.144/src/mame/includes/speedatk.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/speedatk.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ WRITE8_HANDLER( speedatk_6845_w ); PALETTE_INIT( speedatk ); VIDEO_START( speedatk ); -SCREEN_UPDATE( speedatk ); +SCREEN_UPDATE_IND16( speedatk ); diff -Nru mame-0.144/src/mame/includes/speedbal.h mame-0.145/src/mame/includes/speedbal.h --- mame-0.144/src/mame/includes/speedbal.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/speedbal.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,6 +16,6 @@ /*----------- defined in video/speedbal.c -----------*/ VIDEO_START( speedbal ); -SCREEN_UPDATE( speedbal ); +SCREEN_UPDATE_IND16( speedbal ); WRITE8_HANDLER( speedbal_foreground_videoram_w ); WRITE8_HANDLER( speedbal_background_videoram_w ); diff -Nru mame-0.144/src/mame/includes/speedspn.h mame-0.145/src/mame/includes/speedspn.h --- mame-0.144/src/mame/includes/speedspn.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/speedspn.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ /*----------- defined in video/speedspn.c -----------*/ VIDEO_START( speedspn ); -SCREEN_UPDATE( speedspn ); +SCREEN_UPDATE_IND16( speedspn ); WRITE8_HANDLER( speedspn_vidram_w ); WRITE8_HANDLER( speedspn_attram_w ); diff -Nru mame-0.144/src/mame/includes/splash.h mame-0.145/src/mame/includes/splash.h --- mame-0.144/src/mame/includes/splash.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/splash.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,5 +35,5 @@ WRITE16_HANDLER( splash_vram_w ); VIDEO_START( splash ); -SCREEN_UPDATE( splash ); -SCREEN_UPDATE( funystrp ); +SCREEN_UPDATE_IND16( splash ); +SCREEN_UPDATE_IND16( funystrp ); diff -Nru mame-0.144/src/mame/includes/sprcros2.h mame-0.145/src/mame/includes/sprcros2.h --- mame-0.144/src/mame/includes/sprcros2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sprcros2.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,10 @@ { public: sprcros2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_master(*this,"master"), + m_slave(*this,"slave") + { } UINT8 m_s_port3; UINT8 m_port7; @@ -12,6 +15,9 @@ UINT8 *m_bgvideoram; UINT8 *m_spriteram; size_t m_spriteram_size; + + required_device m_master; + required_device m_slave; }; @@ -24,4 +30,4 @@ PALETTE_INIT( sprcros2 ); VIDEO_START( sprcros2 ); -SCREEN_UPDATE( sprcros2 ); +SCREEN_UPDATE_IND16( sprcros2 ); diff -Nru mame-0.144/src/mame/includes/sprint2.h mame-0.145/src/mame/includes/sprint2.h --- mame-0.144/src/mame/includes/sprint2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sprint2.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,7 +34,7 @@ UINT8 m_dial[2]; UINT8* m_video_ram; tilemap_t* m_bg_tilemap; - bitmap_t* m_helper; + bitmap_ind16 m_helper; int m_collision[2]; }; @@ -56,7 +56,7 @@ WRITE8_HANDLER( sprint2_video_ram_w ); PALETTE_INIT( sprint2 ); -SCREEN_UPDATE( sprint2 ); +SCREEN_UPDATE_IND16( sprint2 ); VIDEO_START( sprint2 ); -SCREEN_EOF( sprint2 ); +SCREEN_VBLANK( sprint2 ); diff -Nru mame-0.144/src/mame/includes/sprint4.h mame-0.145/src/mame/includes/sprint4.h --- mame-0.144/src/mame/includes/sprint4.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sprint4.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,7 +12,7 @@ UINT8 m_last_wheel[4]; int m_collision[4]; tilemap_t* m_playfield; - bitmap_t* m_helper; + bitmap_ind16 m_helper; }; @@ -20,8 +20,8 @@ PALETTE_INIT( sprint4 ); -SCREEN_EOF( sprint4 ); +SCREEN_VBLANK( sprint4 ); VIDEO_START( sprint4 ); -SCREEN_UPDATE( sprint4 ); +SCREEN_UPDATE_IND16( sprint4 ); WRITE8_HANDLER( sprint4_video_ram_w ); diff -Nru mame-0.144/src/mame/includes/sprint8.h mame-0.145/src/mame/includes/sprint8.h --- mame-0.144/src/mame/includes/sprint8.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sprint8.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,8 +18,8 @@ UINT8* m_team; tilemap_t* m_tilemap1; tilemap_t* m_tilemap2; - bitmap_t* m_helper1; - bitmap_t* m_helper2; + bitmap_ind16 m_helper1; + bitmap_ind16 m_helper2; }; @@ -31,9 +31,9 @@ /*----------- defined in video/sprint8.c -----------*/ PALETTE_INIT( sprint8 ); -SCREEN_EOF( sprint8 ); +SCREEN_VBLANK( sprint8 ); VIDEO_START( sprint8 ); -SCREEN_UPDATE( sprint8 ); +SCREEN_UPDATE_IND16( sprint8 ); WRITE8_HANDLER( sprint8_video_ram_w ); diff -Nru mame-0.144/src/mame/includes/spy.h mame-0.145/src/mame/includes/spy.h --- mame-0.144/src/mame/includes/spy.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/spy.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ extern void spy_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask,int *shadow); VIDEO_START( spy ); -SCREEN_UPDATE( spy ); +SCREEN_UPDATE_IND16( spy ); diff -Nru mame-0.144/src/mame/includes/srmp2.h mame-0.145/src/mame/includes/srmp2.h --- mame-0.144/src/mame/includes/srmp2.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/srmp2.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,7 +29,7 @@ /*----------- defined in video/srmp2.c -----------*/ PALETTE_INIT( srmp2 ); -SCREEN_UPDATE( srmp2 ); +SCREEN_UPDATE_IND16( srmp2 ); PALETTE_INIT( srmp3 ); -SCREEN_UPDATE( srmp3 ); -SCREEN_UPDATE( mjyuugi ); +SCREEN_UPDATE_IND16( srmp3 ); +SCREEN_UPDATE_IND16( mjyuugi ); diff -Nru mame-0.144/src/mame/includes/srumbler.h mame-0.145/src/mame/includes/srumbler.h --- mame-0.144/src/mame/includes/srumbler.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/srumbler.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,13 +2,17 @@ { public: srumbler_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 *m_backgroundram; UINT8 *m_foregroundram; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; int m_scroll[4]; + + required_device m_maincpu; }; @@ -20,5 +24,5 @@ WRITE8_HANDLER( srumbler_4009_w ); VIDEO_START( srumbler ); -SCREEN_UPDATE( srumbler ); -SCREEN_EOF( srumbler ); +SCREEN_UPDATE_IND16( srumbler ); +SCREEN_VBLANK( srumbler ); diff -Nru mame-0.144/src/mame/includes/sshangha.h mame-0.145/src/mame/includes/sshangha.h --- mame-0.144/src/mame/includes/sshangha.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sshangha.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,6 +27,6 @@ /*----------- defined in video/sshangha.c -----------*/ VIDEO_START( sshangha ); -SCREEN_UPDATE( sshangha ); +SCREEN_UPDATE_RGB32( sshangha ); WRITE16_HANDLER( sshangha_video_w ); diff -Nru mame-0.144/src/mame/includes/sslam.h mame-0.145/src/mame/includes/sslam.h --- mame-0.144/src/mame/includes/sslam.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/sslam.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,5 +39,5 @@ WRITE16_HANDLER( powerbls_bg_tileram_w ); VIDEO_START(sslam); VIDEO_START(powerbls); -SCREEN_UPDATE(sslam); -SCREEN_UPDATE(powerbls); +SCREEN_UPDATE_IND16(sslam); +SCREEN_UPDATE_IND16(powerbls); diff -Nru mame-0.144/src/mame/includes/ssozumo.h mame-0.145/src/mame/includes/ssozumo.h --- mame-0.144/src/mame/includes/ssozumo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ssozumo.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,6 +14,8 @@ tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; + + UINT8 m_sound_nmi_mask; }; @@ -29,4 +31,4 @@ PALETTE_INIT( ssozumo ); VIDEO_START( ssozumo ); -SCREEN_UPDATE( ssozumo ); +SCREEN_UPDATE_IND16( ssozumo ); diff -Nru mame-0.144/src/mame/includes/sspeedr.h mame-0.145/src/mame/includes/sspeedr.h --- mame-0.144/src/mame/includes/sspeedr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/sspeedr.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,5 +37,5 @@ WRITE8_HANDLER( sspeedr_track_ice_w ); VIDEO_START( sspeedr ); -SCREEN_UPDATE( sspeedr ); -SCREEN_EOF( sspeedr ); +SCREEN_UPDATE_IND16( sspeedr ); +SCREEN_VBLANK( sspeedr ); diff -Nru mame-0.144/src/mame/includes/ssrj.h mame-0.145/src/mame/includes/ssrj.h --- mame-0.144/src/mame/includes/ssrj.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ssrj.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,6 +13,7 @@ UINT8 *m_vram3; UINT8 *m_vram4; UINT8 *m_scrollram; + UINT8 *m_buffer_spriteram; }; @@ -23,5 +24,6 @@ WRITE8_HANDLER(ssrj_vram4_w); VIDEO_START( ssrj ); -SCREEN_UPDATE( ssrj ); +SCREEN_UPDATE_IND16( ssrj ); +SCREEN_VBLANK( ssrj ); PALETTE_INIT( ssrj ); diff -Nru mame-0.144/src/mame/includes/ssv.h mame-0.145/src/mame/includes/ssv.h --- mame-0.144/src/mame/includes/ssv.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ssv.h 2012-02-06 21:30:44.000000000 +0000 @@ -63,6 +63,6 @@ VIDEO_START( eaglshot ); VIDEO_START( gdfs ); -SCREEN_UPDATE( ssv ); -SCREEN_UPDATE( eaglshot ); -SCREEN_UPDATE( gdfs ); +SCREEN_UPDATE_IND16( ssv ); +SCREEN_UPDATE_IND16( eaglshot ); +SCREEN_UPDATE_IND16( gdfs ); diff -Nru mame-0.144/src/mame/includes/st0016.h mame-0.145/src/mame/includes/st0016.h --- mame-0.144/src/mame/includes/st0016.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/st0016.h 2012-02-06 21:30:44.000000000 +0000 @@ -1,4 +1,16 @@ +class st0016_state : public driver_device +{ +public: + st0016_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } + + int mux_port; + required_device m_maincpu; +}; + #define ISMACS (st0016_game&0x80) #define ISMACS1 (((st0016_game&0x180)==0x180)) #define ISMACS2 (((st0016_game&0x180)==0x080)) @@ -45,6 +57,6 @@ READ8_HANDLER (st0016_vregs_r); WRITE8_HANDLER (st0016_vregs_w); -void st0016_draw_screen(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect); +void st0016_draw_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); VIDEO_START(st0016); -SCREEN_UPDATE(st0016); +SCREEN_UPDATE_IND16(st0016); diff -Nru mame-0.144/src/mame/includes/stadhero.h mame-0.145/src/mame/includes/stadhero.h --- mame-0.144/src/mame/includes/stadhero.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/stadhero.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,6 +14,6 @@ /*----------- defined in video/stadhero.c -----------*/ VIDEO_START( stadhero ); -SCREEN_UPDATE( stadhero ); +SCREEN_UPDATE_IND16( stadhero ); WRITE16_HANDLER( stadhero_pf1_data_w ); diff -Nru mame-0.144/src/mame/includes/starcrus.h mame-0.145/src/mame/includes/starcrus.h --- mame-0.144/src/mame/includes/starcrus.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/starcrus.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,10 +4,10 @@ starcrus_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - bitmap_t *m_ship1_vid; - bitmap_t *m_ship2_vid; - bitmap_t *m_proj1_vid; - bitmap_t *m_proj2_vid; + bitmap_ind16 *m_ship1_vid; + bitmap_ind16 *m_ship2_vid; + bitmap_ind16 *m_proj1_vid; + bitmap_ind16 *m_proj2_vid; int m_s1_x; int m_s1_y; @@ -55,4 +55,4 @@ WRITE8_HANDLER( starcrus_proj_parm_2_w ); READ8_HANDLER( starcrus_coll_det_r ); VIDEO_START( starcrus ); -SCREEN_UPDATE( starcrus ); +SCREEN_UPDATE_IND16( starcrus ); diff -Nru mame-0.144/src/mame/includes/starfire.h mame-0.145/src/mame/includes/starfire.h --- mame-0.144/src/mame/includes/starfire.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/starfire.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,12 +29,12 @@ UINT8 *m_starfire_colorram; emu_timer* m_scanline_timer; - bitmap_t *m_starfire_screen; + bitmap_rgb32 m_starfire_screen; }; /*----------- defined in video/starfire.c -----------*/ -SCREEN_UPDATE( starfire ); +SCREEN_UPDATE_RGB32( starfire ); VIDEO_START( starfire ); WRITE8_HANDLER( starfire_videoram_w ); diff -Nru mame-0.144/src/mame/includes/starshp1.h mame-0.145/src/mame/includes/starshp1.h --- mame-0.144/src/mame/includes/starshp1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/starshp1.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,7 +58,7 @@ int m_mux; int m_inverse; UINT16 *m_LSFR; - bitmap_t *m_helper; + bitmap_ind16 m_helper; tilemap_t *m_bg_tilemap; }; @@ -72,8 +72,8 @@ WRITE8_HANDLER( starshp1_playfield_w ); PALETTE_INIT( starshp1 ); -SCREEN_UPDATE( starshp1 ); -SCREEN_EOF( starshp1 ); +SCREEN_UPDATE_IND16( starshp1 ); +SCREEN_VBLANK( starshp1 ); VIDEO_START( starshp1 ); diff -Nru mame-0.144/src/mame/includes/stfight.h mame-0.145/src/mame/includes/stfight.h --- mame-0.144/src/mame/includes/stfight.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/stfight.h 2012-02-06 21:30:44.000000000 +0000 @@ -47,4 +47,4 @@ WRITE8_HANDLER( stfight_vh_latch_w ); WRITE8_HANDLER( stfight_sprite_bank_w ); VIDEO_START( stfight ); -SCREEN_UPDATE( stfight ); +SCREEN_UPDATE_IND16( stfight ); diff -Nru mame-0.144/src/mame/includes/stlforce.h mame-0.145/src/mame/includes/stlforce.h --- mame-0.144/src/mame/includes/stlforce.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/stlforce.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,7 +27,7 @@ /*----------- defined in video/stlforce.c -----------*/ VIDEO_START( stlforce ); -SCREEN_UPDATE( stlforce ); +SCREEN_UPDATE_IND16( stlforce ); WRITE16_HANDLER( stlforce_tx_videoram_w ); WRITE16_HANDLER( stlforce_mhigh_videoram_w ); WRITE16_HANDLER( stlforce_mlow_videoram_w ); diff -Nru mame-0.144/src/mame/includes/strnskil.h mame-0.145/src/mame/includes/strnskil.h --- mame-0.144/src/mame/includes/strnskil.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/strnskil.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,10 @@ { public: strnskil_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_subcpu(*this,"sub") + { } UINT8 *m_videoram; UINT8 *m_xscroll; @@ -10,6 +13,10 @@ tilemap_t *m_bg_tilemap; UINT8 *m_spriteram; size_t m_spriteram_size; + UINT8 m_irq_source; + + required_device m_maincpu; + required_device m_subcpu; }; @@ -20,4 +27,4 @@ PALETTE_INIT( strnskil ); VIDEO_START( strnskil ); -SCREEN_UPDATE( strnskil ); +SCREEN_UPDATE_IND16( strnskil ); diff -Nru mame-0.144/src/mame/includes/stv.h mame-0.145/src/mame/includes/stv.h --- mame-0.144/src/mame/includes/stv.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/stv.h 2012-02-06 21:30:44.000000000 +0000 @@ -66,7 +66,7 @@ struct { UINT8 *gfx_decode; - bitmap_t *roz_bitmap[2]; + bitmap_rgb32 roz_bitmap[2]; UINT8 dotsel; UINT8 pal; UINT16 h_count; @@ -118,6 +118,8 @@ legacy_cpu_device* m_maincpu; legacy_cpu_device* m_slave; legacy_cpu_device* m_audiocpu; + + bitmap_rgb32 m_tmpbitmap; }; #define MASTER_CLOCK_352 57272720 @@ -222,7 +224,7 @@ WRITE16_HANDLER ( saturn_vdp2_regs_w ); VIDEO_START ( stv_vdp2 ); -SCREEN_UPDATE( stv_vdp2 ); +SCREEN_UPDATE_RGB32( stv_vdp2 ); #if NEW_VIDEO_CODE -SCREEN_UPDATE( saturn ); +SCREEN_UPDATE_RGB32( saturn ); #endif diff -Nru mame-0.144/src/mame/includes/subs.h mame-0.145/src/mame/includes/subs.h --- mame-0.144/src/mame/includes/subs.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/subs.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,7 +58,8 @@ /*----------- defined in video/subs.c -----------*/ -SCREEN_UPDATE( subs ); +SCREEN_UPDATE_IND16( subs_left ); +SCREEN_UPDATE_IND16( subs_right ); WRITE8_HANDLER( subs_invert1_w ); WRITE8_HANDLER( subs_invert2_w ); diff -Nru mame-0.144/src/mame/includes/suna16.h mame-0.145/src/mame/includes/suna16.h --- mame-0.144/src/mame/includes/suna16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/suna16.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,13 +2,17 @@ { public: suna16_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 m_prot; UINT16 *m_paletteram; UINT16 *m_spriteram; UINT16 *m_spriteram2; int m_color_bank; + + required_device m_maincpu; }; @@ -21,5 +25,5 @@ WRITE16_HANDLER( suna16_paletteram16_w ); VIDEO_START( suna16 ); -SCREEN_UPDATE( suna16 ); -SCREEN_UPDATE( bestbest ); +SCREEN_UPDATE_IND16( suna16 ); +SCREEN_UPDATE_IND16( bestbest ); diff -Nru mame-0.144/src/mame/includes/suna8.h mame-0.145/src/mame/includes/suna8.h --- mame-0.144/src/mame/includes/suna8.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/suna8.h 2012-02-06 21:30:44.000000000 +0000 @@ -6,7 +6,9 @@ { public: suna8_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT8 m_rombank; UINT8 m_spritebank; @@ -33,6 +35,8 @@ INT16 *m_samplebuf; int m_sample; + + required_device m_maincpu; }; @@ -57,4 +61,4 @@ VIDEO_START( suna8_textdim0 ); VIDEO_START( suna8_textdim8 ); VIDEO_START( suna8_textdim12 ); -SCREEN_UPDATE( suna8 ); +SCREEN_UPDATE_IND16( suna8 ); diff -Nru mame-0.144/src/mame/includes/supbtime.h mame-0.145/src/mame/includes/supbtime.h --- mame-0.144/src/mame/includes/supbtime.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/supbtime.h 2012-02-06 21:30:44.000000000 +0000 @@ -29,4 +29,4 @@ /*----------- defined in video/supbtime.c -----------*/ -SCREEN_UPDATE( supbtime ); +SCREEN_UPDATE_IND16( supbtime ); diff -Nru mame-0.144/src/mame/includes/superchs.h mame-0.145/src/mame/includes/superchs.h --- mame-0.144/src/mame/includes/superchs.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/superchs.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,4 +28,4 @@ /*----------- defined in video/superchs.c -----------*/ VIDEO_START( superchs ); -SCREEN_UPDATE( superchs ); +SCREEN_UPDATE_IND16( superchs ); diff -Nru mame-0.144/src/mame/includes/superqix.h mame-0.145/src/mame/includes/superqix.h --- mame-0.144/src/mame/includes/superqix.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/superqix.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,9 @@ { public: superqix_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } INT16 *m_samplebuf; UINT8 m_port1; @@ -25,11 +27,14 @@ UINT8 *m_bitmapram; UINT8 *m_bitmapram2; int m_gfxbank; - bitmap_t *m_fg_bitmap[2]; + bitmap_ind16 *m_fg_bitmap[2]; int m_show_bitmap; tilemap_t *m_bg_tilemap; UINT8 *m_spriteram; size_t m_spriteram_size; + UINT8 m_nmi_mask; + + required_device m_maincpu; }; @@ -42,6 +47,6 @@ WRITE8_HANDLER( superqix_0410_w ); VIDEO_START( pbillian ); -SCREEN_UPDATE( pbillian ); +SCREEN_UPDATE_IND16( pbillian ); VIDEO_START( superqix ); -SCREEN_UPDATE( superqix ); +SCREEN_UPDATE_IND16( superqix ); diff -Nru mame-0.144/src/mame/includes/suprloco.h mame-0.145/src/mame/includes/suprloco.h --- mame-0.144/src/mame/includes/suprloco.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/suprloco.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,7 +17,7 @@ PALETTE_INIT( suprloco ); VIDEO_START( suprloco ); -SCREEN_UPDATE( suprloco ); +SCREEN_UPDATE_IND16( suprloco ); WRITE8_HANDLER( suprloco_videoram_w ); WRITE8_HANDLER( suprloco_scrollram_w ); WRITE8_HANDLER( suprloco_control_w ); diff -Nru mame-0.144/src/mame/includes/suprnova.h mame-0.145/src/mame/includes/suprnova.h --- mame-0.144/src/mame/includes/suprnova.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/suprnova.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,7 +18,9 @@ { public: skns_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } sknsspr_device* m_spritegen; UINT32 *m_tilemapA_ram; @@ -33,11 +35,11 @@ UINT32 *m_cache_ram; hit_t m_hit; UINT32 m_timer_0_temp[4]; - bitmap_t *m_sprite_bitmap; - bitmap_t *m_tilemap_bitmap_lower; - bitmap_t *m_tilemap_bitmapflags_lower; - bitmap_t *m_tilemap_bitmap_higher; - bitmap_t *m_tilemap_bitmapflags_higher; + bitmap_ind16 m_sprite_bitmap; + bitmap_ind16 m_tilemap_bitmap_lower; + bitmap_ind8 m_tilemap_bitmapflags_lower; + bitmap_ind16 m_tilemap_bitmap_higher; + bitmap_ind8 m_tilemap_bitmapflags_higher; int m_depthA; int m_depthB; int m_use_spc_bright; @@ -63,6 +65,8 @@ tilemap_t *m_tilemap_B; UINT8 m_region; + + required_device m_maincpu; }; @@ -70,7 +74,7 @@ void skns_sprite_kludge(int x, int y); void skns_draw_sprites( - running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, + running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32* spriteram_source, size_t spriteram_size, UINT8* gfx_source, size_t gfx_length, UINT32* sprite_regs ); @@ -82,5 +86,5 @@ WRITE32_HANDLER ( skns_palette_ram_w ); VIDEO_START(skns); VIDEO_RESET(skns); -SCREEN_EOF(skns); -SCREEN_UPDATE(skns); +SCREEN_VBLANK(skns); +SCREEN_UPDATE_RGB32(skns); diff -Nru mame-0.144/src/mame/includes/suprridr.h mame-0.145/src/mame/includes/suprridr.h --- mame-0.144/src/mame/includes/suprridr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/suprridr.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE8_HANDLER( suprridr_fgram_w ); WRITE8_HANDLER( suprridr_bgram_w ); -SCREEN_UPDATE( suprridr ); +SCREEN_UPDATE_IND16( suprridr ); diff -Nru mame-0.144/src/mame/includes/suprslam.h mame-0.145/src/mame/includes/suprslam.h --- mame-0.144/src/mame/includes/suprslam.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/suprslam.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ WRITE16_HANDLER( suprslam_bank_w ); VIDEO_START( suprslam ); -SCREEN_UPDATE( suprslam ); +SCREEN_UPDATE_IND16( suprslam ); diff -Nru mame-0.144/src/mame/includes/surpratk.h mame-0.145/src/mame/includes/surpratk.h --- mame-0.144/src/mame/includes/surpratk.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/surpratk.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ extern void surpratk_tile_callback(running_machine &machine, int layer,int bank,int *code,int *color,int *flags,int *priority); extern void surpratk_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask); -SCREEN_UPDATE( surpratk ); +SCREEN_UPDATE_IND16( surpratk ); diff -Nru mame-0.144/src/mame/includes/system16.h mame-0.145/src/mame/includes/system16.h --- mame-0.144/src/mame/includes/system16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/system16.h 2012-02-06 21:30:44.000000000 +0000 @@ -106,8 +106,8 @@ extern VIDEO_START( s16a_bootleg_wb3bl ); extern VIDEO_START( s16a_bootleg_shinobi ); extern VIDEO_START( s16a_bootleg_passsht ); -extern SCREEN_UPDATE( s16a_bootleg ); -extern SCREEN_UPDATE( s16a_bootleg_passht4b ); +extern SCREEN_UPDATE_IND16( s16a_bootleg ); +extern SCREEN_UPDATE_IND16( s16a_bootleg_passht4b ); extern WRITE16_HANDLER( s16a_bootleg_tilemapselect_w ); extern WRITE16_HANDLER( s16a_bootleg_bgscrolly_w ); extern WRITE16_HANDLER( s16a_bootleg_bgscrollx_w ); @@ -120,8 +120,8 @@ /* "normal" video hardware */ extern VIDEO_START( system16 ); -extern SCREEN_UPDATE( system16 ); +extern SCREEN_UPDATE_IND16( system16 ); /* system18 video hardware */ extern VIDEO_START( system18old ); -extern SCREEN_UPDATE( system18old ); +extern SCREEN_UPDATE_IND16( system18old ); diff -Nru mame-0.144/src/mame/includes/system1.h mame-0.145/src/mame/includes/system1.h --- mame-0.144/src/mame/includes/system1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/system1.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,7 +19,7 @@ UINT8 m_mix_collide_summary; UINT8 *m_sprite_collide; UINT8 m_sprite_collide_summary; - bitmap_t *m_sprite_bitmap; + bitmap_ind16 *m_sprite_bitmap; UINT8 m_video_mode; UINT8 m_videoram_bank; tilemap_t *m_tilemap_page[8]; @@ -48,6 +48,6 @@ WRITE8_HANDLER( system1_sprite_collision_w ); WRITE8_HANDLER( system1_sprite_collision_reset_w ); -SCREEN_UPDATE( system1 ); -SCREEN_UPDATE( system2 ); -SCREEN_UPDATE( system2_rowscroll ); +SCREEN_UPDATE_IND16( system1 ); +SCREEN_UPDATE_IND16( system2 ); +SCREEN_UPDATE_IND16( system2_rowscroll ); diff -Nru mame-0.144/src/mame/includes/tagteam.h mame-0.145/src/mame/includes/tagteam.h --- mame-0.144/src/mame/includes/tagteam.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/tagteam.h 2012-02-06 21:30:44.000000000 +0000 @@ -8,6 +8,8 @@ UINT8 *m_colorram; int m_palettebank; tilemap_t *m_bg_tilemap; + + UINT8 m_sound_nmi_mask; }; @@ -24,4 +26,4 @@ PALETTE_INIT( tagteam ); VIDEO_START( tagteam ); -SCREEN_UPDATE( tagteam ); +SCREEN_UPDATE_IND16( tagteam ); diff -Nru mame-0.144/src/mame/includes/tail2nos.h mame-0.145/src/mame/includes/tail2nos.h --- mame-0.144/src/mame/includes/tail2nos.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tail2nos.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ WRITE16_HANDLER( tail2nos_gfxbank_w ); VIDEO_START( tail2nos ); -SCREEN_UPDATE( tail2nos ); +SCREEN_UPDATE_IND16( tail2nos ); diff -Nru mame-0.144/src/mame/includes/taitoair.h mame-0.145/src/mame/includes/taitoair.h --- mame-0.144/src/mame/includes/taitoair.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/taitoair.h 2012-02-06 21:30:44.000000000 +0000 @@ -44,20 +44,20 @@ UINT16 * m_gradram; UINT16 * m_backregs; - bitmap_t *m_framebuffer[2]; + bitmap_ind16 *m_framebuffer[2]; /* 3d info */ INT16 m_frustumLeft; INT16 m_frustumBottom; INT16 m_eyecoordBuffer[4]; /* homogeneous */ - //bitmap_t *m_buffer3d; + //bitmap_ind16 *m_buffer3d; }; /*----------- defined in video/taitoair.c -----------*/ -SCREEN_UPDATE( taitoair ); +SCREEN_UPDATE_IND16( taitoair ); VIDEO_START( taitoair ); WRITE16_HANDLER( dsp_flags_w ); diff -Nru mame-0.144/src/mame/includes/taito_b.h mame-0.145/src/mame/includes/taito_b.h --- mame-0.144/src/mame/includes/taito_b.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_b.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,9 +12,9 @@ /* video-related */ /* framebuffer is a raw bitmap, remapped as a last step */ - bitmap_t *m_framebuffer[2]; - bitmap_t *m_pixel_bitmap; - bitmap_t *m_realpunc_bitmap; + bitmap_ind16 *m_framebuffer[2]; + bitmap_ind16 *m_pixel_bitmap; + bitmap_ind16 *m_realpunc_bitmap; UINT16 m_pixel_scroll[2]; @@ -56,7 +56,7 @@ VIDEO_RESET( hitice ); -SCREEN_UPDATE( realpunc ); -SCREEN_UPDATE( taitob ); +SCREEN_UPDATE_RGB32( realpunc ); +SCREEN_UPDATE_IND16( taitob ); -SCREEN_EOF( taitob ); +SCREEN_VBLANK( taitob ); diff -Nru mame-0.144/src/mame/includes/taito_f2.h mame-0.145/src/mame/includes/taito_f2.h --- mame-0.144/src/mame/includes/taito_f2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_f2.h 2012-02-06 21:30:44.000000000 +0000 @@ -108,20 +108,20 @@ VIDEO_START( taitof2_deadconx ); VIDEO_START( taitof2_deadconxj ); VIDEO_START( taitof2_dinorex ); -SCREEN_EOF( taitof2_no_buffer ); -SCREEN_EOF( taitof2_full_buffer_delayed ); -SCREEN_EOF( taitof2_partial_buffer_delayed ); -SCREEN_EOF( taitof2_partial_buffer_delayed_thundfox ); -SCREEN_EOF( taitof2_partial_buffer_delayed_qzchikyu ); +SCREEN_VBLANK( taitof2_no_buffer ); +SCREEN_VBLANK( taitof2_full_buffer_delayed ); +SCREEN_VBLANK( taitof2_partial_buffer_delayed ); +SCREEN_VBLANK( taitof2_partial_buffer_delayed_thundfox ); +SCREEN_VBLANK( taitof2_partial_buffer_delayed_qzchikyu ); -SCREEN_UPDATE( taitof2 ); -SCREEN_UPDATE( taitof2_pri ); -SCREEN_UPDATE( taitof2_pri_roz ); -SCREEN_UPDATE( taitof2_ssi ); -SCREEN_UPDATE( taitof2_thundfox ); -SCREEN_UPDATE( taitof2_deadconx ); -SCREEN_UPDATE( taitof2_metalb ); -SCREEN_UPDATE( taitof2_yesnoj ); +SCREEN_UPDATE_IND16( taitof2 ); +SCREEN_UPDATE_IND16( taitof2_pri ); +SCREEN_UPDATE_IND16( taitof2_pri_roz ); +SCREEN_UPDATE_IND16( taitof2_ssi ); +SCREEN_UPDATE_IND16( taitof2_thundfox ); +SCREEN_UPDATE_IND16( taitof2_deadconx ); +SCREEN_UPDATE_IND16( taitof2_metalb ); +SCREEN_UPDATE_IND16( taitof2_yesnoj ); WRITE16_HANDLER( taitof2_spritebank_w ); WRITE16_HANDLER( koshien_spritebank_w ); diff -Nru mame-0.144/src/mame/includes/taito_f3.h mame-0.145/src/mame/includes/taito_f3.h --- mame-0.144/src/mame/includes/taito_f3.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_f3.h 2012-02-06 21:30:44.000000000 +0000 @@ -83,7 +83,7 @@ int m_f3_skip_this_frame; int m_sprite_lag; UINT8 m_sprite_pri_usage; - bitmap_t *m_pri_alp_bitmap; + bitmap_ind8 m_pri_alp_bitmap; int m_f3_alpha_level_2as; int m_f3_alpha_level_2ad; int m_f3_alpha_level_3as; @@ -199,8 +199,8 @@ /*----------- defined in video/taito_f3.c -----------*/ VIDEO_START( f3 ); -SCREEN_UPDATE( f3 ); -SCREEN_EOF( f3 ); +SCREEN_UPDATE_RGB32( f3 ); +SCREEN_VBLANK( f3 ); WRITE16_HANDLER( f3_control_0_w ); WRITE16_HANDLER( f3_control_1_w ); diff -Nru mame-0.144/src/mame/includes/taito_h.h mame-0.145/src/mame/includes/taito_h.h --- mame-0.144/src/mame/includes/taito_h.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_h.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,6 +26,6 @@ /*----------- defined in video/taito_h.c -----------*/ -SCREEN_UPDATE( syvalion ); -SCREEN_UPDATE( recordbr ); -SCREEN_UPDATE( dleague ); +SCREEN_UPDATE_IND16( syvalion ); +SCREEN_UPDATE_IND16( recordbr ); +SCREEN_UPDATE_IND16( dleague ); diff -Nru mame-0.144/src/mame/includes/taitojc.h mame-0.145/src/mame/includes/taitojc.h --- mame-0.144/src/mame/includes/taitojc.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/taitojc.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,8 +24,8 @@ INT32 m_intersection_data[3]; UINT8 *m_texture; - bitmap_t *m_framebuffer; - bitmap_t *m_zbuffer; + bitmap_ind16 m_framebuffer; + bitmap_ind16 m_zbuffer; UINT32 *m_vram; UINT32 *m_objlist; @@ -73,7 +73,7 @@ void taitojc_render_polygons(running_machine &machine, UINT16 *polygon_fifo, int length); VIDEO_START(taitojc); -SCREEN_UPDATE(taitojc); +SCREEN_UPDATE_IND16(taitojc); const double taitojc_odometer_table[0x100] = { diff -Nru mame-0.144/src/mame/includes/taito_l.h mame-0.145/src/mame/includes/taito_l.h --- mame-0.144/src/mame/includes/taito_l.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_l.h 2012-02-06 21:30:44.000000000 +0000 @@ -63,9 +63,9 @@ /*----------- defined in video/taito_l.c -----------*/ -SCREEN_EOF( taitol ); +SCREEN_VBLANK( taitol ); VIDEO_START( taitol ); -SCREEN_UPDATE( taitol ); +SCREEN_UPDATE_IND16( taitol ); void taitol_chardef14_m(running_machine &machine, int offset); void taitol_chardef15_m(running_machine &machine, int offset); diff -Nru mame-0.144/src/mame/includes/taito_o.h mame-0.145/src/mame/includes/taito_o.h --- mame-0.144/src/mame/includes/taito_o.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_o.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,4 +20,4 @@ /*----------- defined in video/taito_o.c -----------*/ -SCREEN_UPDATE( parentj ); +SCREEN_UPDATE_IND16( parentj ); diff -Nru mame-0.144/src/mame/includes/taitosj.h mame-0.145/src/mame/includes/taitosj.h --- mame-0.144/src/mame/includes/taitosj.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taitosj.h 2012-02-06 21:30:44.000000000 +0000 @@ -33,11 +33,11 @@ UINT8 m_spacecr_prot_value; UINT8 m_protection_value; UINT32 m_address; - bitmap_t *m_layer_bitmap[3]; - bitmap_t *m_sprite_sprite_collbitmap1; - bitmap_t *m_sprite_sprite_collbitmap2; - bitmap_t *m_sprite_layer_collbitmap1; - bitmap_t *m_sprite_layer_collbitmap2[3]; + bitmap_ind16 m_layer_bitmap[3]; + bitmap_ind16 m_sprite_sprite_collbitmap1; + bitmap_ind16 m_sprite_sprite_collbitmap2; + bitmap_ind16 m_sprite_layer_collbitmap1; + bitmap_ind16 m_sprite_layer_collbitmap2[3]; int m_draw_order[32][4]; }; @@ -72,5 +72,5 @@ WRITE8_HANDLER( junglhbr_characterram_w ); WRITE8_HANDLER( taitosj_collision_reg_clear_w ); VIDEO_START( taitosj ); -SCREEN_UPDATE( taitosj ); -SCREEN_UPDATE( kikstart ); +SCREEN_UPDATE_IND16( taitosj ); +SCREEN_UPDATE_IND16( kikstart ); diff -Nru mame-0.144/src/mame/includes/taito_z.h mame-0.145/src/mame/includes/taito_z.h --- mame-0.144/src/mame/includes/taito_z.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taito_z.h 2012-02-06 21:30:44.000000000 +0000 @@ -56,10 +56,10 @@ VIDEO_START( taitoz ); -SCREEN_UPDATE( contcirc ); -SCREEN_UPDATE( chasehq ); -SCREEN_UPDATE( bshark ); -SCREEN_UPDATE( sci ); -SCREEN_UPDATE( aquajack ); -SCREEN_UPDATE( spacegun ); -SCREEN_UPDATE( dblaxle ); +SCREEN_UPDATE_IND16( contcirc ); +SCREEN_UPDATE_IND16( chasehq ); +SCREEN_UPDATE_IND16( bshark ); +SCREEN_UPDATE_IND16( sci ); +SCREEN_UPDATE_IND16( aquajack ); +SCREEN_UPDATE_IND16( spacegun ); +SCREEN_UPDATE_IND16( dblaxle ); diff -Nru mame-0.144/src/mame/includes/tank8.h mame-0.145/src/mame/includes/tank8.h --- mame-0.144/src/mame/includes/tank8.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tank8.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,9 +36,9 @@ UINT8 *m_pos_d_ram; UINT8 *m_team; tilemap_t *m_tilemap; - bitmap_t *m_helper1; - bitmap_t *m_helper2; - bitmap_t *m_helper3; + bitmap_ind16 m_helper1; + bitmap_ind16 m_helper2; + bitmap_ind16 m_helper3; }; @@ -55,9 +55,9 @@ /*----------- defined in video/tank8.c -----------*/ PALETTE_INIT( tank8 ); -SCREEN_EOF( tank8 ); +SCREEN_VBLANK( tank8 ); VIDEO_START( tank8 ); -SCREEN_UPDATE( tank8 ); +SCREEN_UPDATE_IND16( tank8 ); WRITE8_HANDLER( tank8_video_ram_w ); diff -Nru mame-0.144/src/mame/includes/tankbatt.h mame-0.145/src/mame/includes/tankbatt.h --- mame-0.144/src/mame/includes/tankbatt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tankbatt.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ PALETTE_INIT( tankbatt ); VIDEO_START( tankbatt ); -SCREEN_UPDATE( tankbatt ); +SCREEN_UPDATE_IND16( tankbatt ); diff -Nru mame-0.144/src/mame/includes/tankbust.h mame-0.145/src/mame/includes/tankbust.h --- mame-0.144/src/mame/includes/tankbust.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tankbust.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,13 +17,15 @@ UINT8 m_yscroll[2]; UINT8 *m_spriteram; size_t m_spriteram_size; + + UINT8 m_irq_mask; }; /*----------- defined in video/tankbust.c -----------*/ VIDEO_START( tankbust ); -SCREEN_UPDATE( tankbust ); +SCREEN_UPDATE_IND16( tankbust ); WRITE8_HANDLER( tankbust_background_videoram_w ); READ8_HANDLER( tankbust_background_videoram_r ); diff -Nru mame-0.144/src/mame/includes/taotaido.h mame-0.145/src/mame/includes/taotaido.h --- mame-0.144/src/mame/includes/taotaido.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/taotaido.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,5 +25,5 @@ WRITE16_HANDLER( taotaido_tileregs_w ); WRITE16_HANDLER( taotaido_bgvideoram_w ); VIDEO_START( taotaido ); -SCREEN_UPDATE( taotaido ); -SCREEN_EOF( taotaido ); +SCREEN_UPDATE_IND16( taotaido ); +SCREEN_VBLANK( taotaido ); diff -Nru mame-0.144/src/mame/includes/targeth.h mame-0.145/src/mame/includes/targeth.h --- mame-0.144/src/mame/includes/targeth.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/targeth.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,12 +2,16 @@ { public: targeth_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu") + { } UINT16 *m_vregs; UINT16 *m_videoram; UINT16 *m_spriteram; tilemap_t *m_pant[2]; + + required_device m_maincpu; }; @@ -15,4 +19,4 @@ WRITE16_HANDLER( targeth_vram_w ); VIDEO_START( targeth ); -SCREEN_UPDATE( targeth ); +SCREEN_UPDATE_IND16( targeth ); diff -Nru mame-0.144/src/mame/includes/tatsumi.h mame-0.145/src/mame/includes/tatsumi.h --- mame-0.144/src/mame/includes/tatsumi.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tatsumi.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,7 +38,7 @@ tilemap_t *m_layer1; tilemap_t *m_layer2; tilemap_t *m_layer3; - bitmap_t *m_temp_bitmap; + bitmap_rgb32 m_temp_bitmap; UINT8 *m_apache3_road_x_ram; UINT8 m_apache3_road_z; UINT16* m_roundup5_vram; @@ -101,8 +101,8 @@ VIDEO_START( cyclwarr ); VIDEO_START( bigfight ); -SCREEN_UPDATE( roundup5 ); -SCREEN_UPDATE( apache3 ); -SCREEN_UPDATE( cyclwarr ); -SCREEN_UPDATE( bigfight ); +SCREEN_UPDATE_RGB32( roundup5 ); +SCREEN_UPDATE_RGB32( apache3 ); +SCREEN_UPDATE_RGB32( cyclwarr ); +SCREEN_UPDATE_RGB32( bigfight ); diff -Nru mame-0.144/src/mame/includes/taxidriv.h mame-0.145/src/mame/includes/taxidriv.h --- mame-0.144/src/mame/includes/taxidriv.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/includes/taxidriv.h 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,31 @@ +class taxidriv_state : public driver_device +{ +public: + taxidriv_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + int m_s1; + int m_s2; + int m_s3; + int m_s4; + int m_latchA; + int m_latchB; + UINT8 *m_vram0; + UINT8 *m_vram1; + UINT8 *m_vram2; + UINT8 *m_vram3; + UINT8 *m_vram4; + UINT8 *m_vram5; + UINT8 *m_vram6; + UINT8 *m_vram7; + UINT8 *m_scroll; + int m_bghide; + int m_spritectrl[9]; +}; + + +/*----------- defined in video/taxidriv.c -----------*/ + +WRITE8_DEVICE_HANDLER( taxidriv_spritectrl_w ); + +SCREEN_UPDATE_IND16( taxidriv ); diff -Nru mame-0.144/src/mame/includes/taxidrvr.h mame-0.145/src/mame/includes/taxidrvr.h --- mame-0.144/src/mame/includes/taxidrvr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/taxidrvr.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -class taxidrvr_state : public driver_device -{ -public: - taxidrvr_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } - - int m_s1; - int m_s2; - int m_s3; - int m_s4; - int m_latchA; - int m_latchB; - UINT8 *m_vram0; - UINT8 *m_vram1; - UINT8 *m_vram2; - UINT8 *m_vram3; - UINT8 *m_vram4; - UINT8 *m_vram5; - UINT8 *m_vram6; - UINT8 *m_vram7; - UINT8 *m_scroll; - int m_bghide; - int m_spritectrl[9]; -}; - - -/*----------- defined in video/taxidrvr.c -----------*/ - -WRITE8_DEVICE_HANDLER( taxidrvr_spritectrl_w ); - -SCREEN_UPDATE( taxidrvr ); diff -Nru mame-0.144/src/mame/includes/tbowl.h mame-0.145/src/mame/includes/tbowl.h --- mame-0.144/src/mame/includes/tbowl.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tbowl.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,6 @@ WRITE8_HANDLER( tbowl_bgyscroll_hi ); VIDEO_START( tbowl ); -SCREEN_UPDATE( tbowl ); +SCREEN_UPDATE_IND16( tbowl_left ); +SCREEN_UPDATE_IND16( tbowl_right ); + diff -Nru mame-0.144/src/mame/includes/tceptor.h mame-0.145/src/mame/includes/tceptor.h --- mame-0.144/src/mame/includes/tceptor.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tceptor.h 2012-02-06 21:30:44.000000000 +0000 @@ -22,7 +22,7 @@ INT32 m_bg1_scroll_y; INT32 m_bg2_scroll_x; INT32 m_bg2_scroll_y; - bitmap_t *m_temp_bitmap; + bitmap_ind16 m_temp_bitmap; UINT16 *m_sprite_ram_buffered; int m_is_mask_spr[1024/16]; }; @@ -32,8 +32,10 @@ PALETTE_INIT( tceptor ); VIDEO_START( tceptor ); -SCREEN_UPDATE( tceptor ); -SCREEN_EOF( tceptor ); +SCREEN_UPDATE_IND16( tceptor_2d ); +SCREEN_UPDATE_IND16( tceptor_3d_left ); +SCREEN_UPDATE_IND16( tceptor_3d_right ); +SCREEN_VBLANK( tceptor ); WRITE8_HANDLER( tceptor_tile_ram_w ); WRITE8_HANDLER( tceptor_tile_attr_w ); diff -Nru mame-0.144/src/mame/includes/tecmo16.h mame-0.145/src/mame/includes/tecmo16.h --- mame-0.144/src/mame/includes/tecmo16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tecmo16.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,9 +12,9 @@ tilemap_t *m_fg_tilemap; tilemap_t *m_bg_tilemap; tilemap_t *m_tx_tilemap; - bitmap_t *m_sprite_bitmap; - bitmap_t *m_tile_bitmap_bg; - bitmap_t *m_tile_bitmap_fg; + bitmap_ind16 m_sprite_bitmap; + bitmap_ind16 m_tile_bitmap_bg; + bitmap_ind16 m_tile_bitmap_fg; int m_flipscreen; int m_game_is_riot; UINT16 m_scroll_x_w; @@ -47,4 +47,4 @@ VIDEO_START( fstarfrc ); VIDEO_START( ginkun ); VIDEO_START( riot ); -SCREEN_UPDATE( tecmo16 ); +SCREEN_UPDATE_RGB32( tecmo16 ); diff -Nru mame-0.144/src/mame/includes/tecmo.h mame-0.145/src/mame/includes/tecmo.h --- mame-0.144/src/mame/includes/tecmo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tecmo.h 2012-02-06 21:30:44.000000000 +0000 @@ -31,4 +31,4 @@ WRITE8_HANDLER( tecmo_flipscreen_w ); VIDEO_START( tecmo ); -SCREEN_UPDATE( tecmo ); +SCREEN_UPDATE_IND16( tecmo ); diff -Nru mame-0.144/src/mame/includes/tecmosys.h mame-0.145/src/mame/includes/tecmosys.h --- mame-0.144/src/mame/includes/tecmosys.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/tecmosys.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,9 +25,9 @@ UINT16* m_c80000regs; UINT16* m_880000regs; int m_spritelist; - bitmap_t *m_sprite_bitmap; - bitmap_t *m_tmp_tilemap_composebitmap; - bitmap_t *m_tmp_tilemap_renderbitmap; + bitmap_ind16 m_sprite_bitmap; + bitmap_ind16 m_tmp_tilemap_composebitmap; + bitmap_ind16 m_tmp_tilemap_renderbitmap; tilemap_t *m_bg0tilemap; tilemap_t *m_bg1tilemap; tilemap_t *m_bg2tilemap; @@ -60,5 +60,5 @@ WRITE16_HANDLER( bg1_tilemap_lineram_w ); WRITE16_HANDLER( bg2_tilemap_lineram_w ); -SCREEN_UPDATE(tecmosys); +SCREEN_UPDATE_RGB32(tecmosys); VIDEO_START(tecmosys); diff -Nru mame-0.144/src/mame/includes/tehkanwc.h mame-0.145/src/mame/includes/tehkanwc.h --- mame-0.144/src/mame/includes/tehkanwc.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tehkanwc.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ extern WRITE8_HANDLER( gridiron_led1_w ); extern VIDEO_START( tehkanwc ); -extern SCREEN_UPDATE( tehkanwc ); +extern SCREEN_UPDATE_IND16( tehkanwc ); diff -Nru mame-0.144/src/mame/includes/terracre.h mame-0.145/src/mame/includes/terracre.h --- mame-0.144/src/mame/includes/terracre.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/terracre.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ WRITE16_HANDLER( amazon_scrollx_w ); WRITE16_HANDLER( amazon_flipscreen_w ); VIDEO_START( amazon ); -SCREEN_UPDATE( amazon ); +SCREEN_UPDATE_IND16( amazon ); diff -Nru mame-0.144/src/mame/includes/tetrisp2.h mame-0.145/src/mame/includes/tetrisp2.h --- mame-0.144/src/mame/includes/tetrisp2.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/tetrisp2.h 2012-02-06 21:30:44.000000000 +0000 @@ -62,12 +62,13 @@ WRITE16_HANDLER( rocknms_sub_vram_rot_w ); VIDEO_START( tetrisp2 ); -SCREEN_UPDATE( tetrisp2 ); +SCREEN_UPDATE_IND16( tetrisp2 ); VIDEO_START( rockntread ); -SCREEN_UPDATE( rockntread ); +SCREEN_UPDATE_IND16( rockntread ); VIDEO_START( rocknms ); -SCREEN_UPDATE( rocknms ); +SCREEN_UPDATE_RGB32( rocknms_left ); +SCREEN_UPDATE_RGB32( rocknms_right ); VIDEO_START( nndmseal ); diff -Nru mame-0.144/src/mame/includes/thedeep.h mame-0.145/src/mame/includes/thedeep.h --- mame-0.144/src/mame/includes/thedeep.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/thedeep.h 2012-02-06 21:30:44.000000000 +0000 @@ -2,7 +2,11 @@ { public: thedeep_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag), + m_maincpu(*this,"maincpu"), + m_audiocpu(*this, "audiocpu"), + m_mcu(*this, "mcu") + { } UINT8 *m_spriteram; size_t m_spriteram_size; @@ -18,6 +22,11 @@ UINT8 *m_scroll2; tilemap_t *m_tilemap_0; tilemap_t *m_tilemap_1; + UINT8 m_mcu_p3_reg; + + required_device m_maincpu; + required_device m_audiocpu; + required_device m_mcu; }; @@ -28,5 +37,5 @@ PALETTE_INIT( thedeep ); VIDEO_START( thedeep ); -SCREEN_UPDATE( thedeep ); +SCREEN_UPDATE_IND16( thedeep ); diff -Nru mame-0.144/src/mame/includes/thepit.h mame-0.145/src/mame/includes/thepit.h --- mame-0.144/src/mame/includes/thepit.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/thepit.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,6 +18,7 @@ tilemap_t *m_solid_tilemap; tilemap_t *m_tilemap; UINT8 *m_dummy_tile; + UINT8 m_nmi_mask; }; @@ -26,7 +27,7 @@ PALETTE_INIT( thepit ); PALETTE_INIT( suprmous ); VIDEO_START( thepit ); -SCREEN_UPDATE( thepit ); +SCREEN_UPDATE_IND16( thepit ); WRITE8_HANDLER( thepit_videoram_w ); WRITE8_HANDLER( thepit_colorram_w ); WRITE8_HANDLER( thepit_flip_screen_x_w ); diff -Nru mame-0.144/src/mame/includes/thief.h mame-0.145/src/mame/includes/thief.h --- mame-0.144/src/mame/includes/thief.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/thief.h 2012-02-06 21:30:44.000000000 +0000 @@ -35,4 +35,4 @@ WRITE8_HANDLER( thief_coprocessor_w ); VIDEO_START( thief ); -SCREEN_UPDATE( thief ); +SCREEN_UPDATE_IND16( thief ); diff -Nru mame-0.144/src/mame/includes/thoop2.h mame-0.145/src/mame/includes/thoop2.h --- mame-0.144/src/mame/includes/thoop2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/thoop2.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,4 +17,4 @@ WRITE16_HANDLER( thoop2_vram_w ); VIDEO_START( thoop2 ); -SCREEN_UPDATE( thoop2 ); +SCREEN_UPDATE_IND16( thoop2 ); diff -Nru mame-0.144/src/mame/includes/thunderj.h mame-0.145/src/mame/includes/thunderj.h --- mame-0.144/src/mame/includes/thunderj.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/thunderj.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ /*----------- defined in video/thunderj.c -----------*/ VIDEO_START( thunderj ); -SCREEN_UPDATE( thunderj ); +SCREEN_UPDATE_IND16( thunderj ); diff -Nru mame-0.144/src/mame/includes/thunderx.h mame-0.145/src/mame/includes/thunderx.h --- mame-0.144/src/mame/includes/thunderx.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/thunderx.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ extern void thunderx_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask,int *shadow); VIDEO_START( scontra ); -SCREEN_UPDATE( scontra ); +SCREEN_UPDATE_IND16( scontra ); diff -Nru mame-0.144/src/mame/includes/tiamc1.h mame-0.145/src/mame/includes/tiamc1.h --- mame-0.144/src/mame/includes/tiamc1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tiamc1.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,7 +34,7 @@ PALETTE_INIT( tiamc1 ); VIDEO_START( tiamc1 ); -SCREEN_UPDATE( tiamc1 ); +SCREEN_UPDATE_IND16( tiamc1 ); WRITE8_HANDLER( tiamc1_palette_w ); WRITE8_HANDLER( tiamc1_videoram_w ); diff -Nru mame-0.144/src/mame/includes/tigeroad.h mame-0.145/src/mame/includes/tigeroad.h --- mame-0.144/src/mame/includes/tigeroad.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tigeroad.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,5 +18,5 @@ WRITE16_HANDLER( tigeroad_videoctrl_w ); WRITE16_HANDLER( tigeroad_scroll_w ); VIDEO_START( tigeroad ); -SCREEN_UPDATE( tigeroad ); -SCREEN_EOF( tigeroad ); +SCREEN_UPDATE_IND16( tigeroad ); +SCREEN_VBLANK( tigeroad ); diff -Nru mame-0.144/src/mame/includes/timelimt.h mame-0.145/src/mame/includes/timelimt.h --- mame-0.144/src/mame/includes/timelimt.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/timelimt.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,7 +21,7 @@ VIDEO_START( timelimt ); PALETTE_INIT( timelimt ); -SCREEN_UPDATE( timelimt ); +SCREEN_UPDATE_IND16( timelimt ); WRITE8_HANDLER( timelimt_videoram_w ); WRITE8_HANDLER( timelimt_bg_videoram_w ); diff -Nru mame-0.144/src/mame/includes/timeplt.h mame-0.145/src/mame/includes/timeplt.h --- mame-0.144/src/mame/includes/timeplt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/timeplt.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ PALETTE_INIT( timeplt ); VIDEO_START( timeplt ); VIDEO_START( chkun ); -SCREEN_UPDATE( timeplt ); +SCREEN_UPDATE_IND16( timeplt ); diff -Nru mame-0.144/src/mame/includes/tmnt.h mame-0.145/src/mame/includes/tmnt.h --- mame-0.144/src/mame/includes/tmnt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tmnt.h 2012-02-06 21:30:44.000000000 +0000 @@ -58,6 +58,8 @@ /* memory buffers */ INT16 m_sampledata[0x40000]; + + UINT8 m_irq5_mask; }; @@ -98,12 +100,12 @@ VIDEO_START( glfgreat ); VIDEO_START( prmrsocr ); -SCREEN_UPDATE( mia ); -SCREEN_UPDATE( tmnt ); -SCREEN_UPDATE( punkshot ); -SCREEN_UPDATE( lgtnfght ); -SCREEN_UPDATE( glfgreat ); -SCREEN_UPDATE( tmnt2 ); -SCREEN_UPDATE( thndrx2 ); +SCREEN_UPDATE_IND16( mia ); +SCREEN_UPDATE_IND16( tmnt ); +SCREEN_UPDATE_IND16( punkshot ); +SCREEN_UPDATE_IND16( lgtnfght ); +SCREEN_UPDATE_IND16( glfgreat ); +SCREEN_UPDATE_IND16( tmnt2 ); +SCREEN_UPDATE_IND16( thndrx2 ); -SCREEN_EOF( blswhstl ); +SCREEN_VBLANK( blswhstl ); diff -Nru mame-0.144/src/mame/includes/tnzs.h mame-0.145/src/mame/includes/tnzs.h --- mame-0.144/src/mame/includes/tnzs.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tnzs.h 2012-02-06 21:30:44.000000000 +0000 @@ -87,5 +87,5 @@ /*----------- defined in video/tnzs.c -----------*/ PALETTE_INIT( arknoid2 ); -SCREEN_UPDATE( tnzs ); -SCREEN_EOF( tnzs ); +SCREEN_UPDATE_IND16( tnzs ); +SCREEN_VBLANK( tnzs ); diff -Nru mame-0.144/src/mame/includes/toaplan1.h mame-0.145/src/mame/includes/toaplan1.h --- mame-0.144/src/mame/includes/toaplan1.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/toaplan1.h 2012-02-06 21:30:44.000000000 +0000 @@ -147,10 +147,10 @@ READ16_HANDLER ( toaplan1_spriteram_offs_r ); WRITE16_HANDLER( toaplan1_spriteram_offs_w ); -SCREEN_EOF( rallybik ); -SCREEN_EOF( toaplan1 ); -SCREEN_EOF( samesame ); +SCREEN_VBLANK( rallybik ); +SCREEN_VBLANK( toaplan1 ); +SCREEN_VBLANK( samesame ); VIDEO_START( rallybik ); VIDEO_START( toaplan1 ); -SCREEN_UPDATE( rallybik ); -SCREEN_UPDATE( toaplan1 ); +SCREEN_UPDATE_IND16( rallybik ); +SCREEN_UPDATE_IND16( toaplan1 ); diff -Nru mame-0.144/src/mame/includes/toaplan2.h mame-0.145/src/mame/includes/toaplan2.h --- mame-0.144/src/mame/includes/toaplan2.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/toaplan2.h 2012-02-06 21:30:44.000000000 +0000 @@ -48,8 +48,8 @@ size_t m_paletteram_size; size_t m_mainram_overlap_size; - bitmap_t* m_custom_priority_bitmap; - bitmap_t* m_secondary_render_bitmap; + bitmap_ind8 m_custom_priority_bitmap; + bitmap_ind16 m_secondary_render_bitmap; tilemap_t *m_tx_tilemap; /* Tilemap for extra-text-layer */ UINT8 m_tx_flip; @@ -63,13 +63,13 @@ VIDEO_START( bgaregga ); VIDEO_START( batrider ); -SCREEN_UPDATE( toaplan2 ); -SCREEN_UPDATE( truxton2 ); -SCREEN_UPDATE( batrider ); -SCREEN_UPDATE( dogyuun ); -SCREEN_UPDATE( batsugun ); +SCREEN_UPDATE_IND16( toaplan2 ); +SCREEN_UPDATE_IND16( truxton2 ); +SCREEN_UPDATE_IND16( batrider ); +SCREEN_UPDATE_IND16( dogyuun ); +SCREEN_UPDATE_IND16( batsugun ); -SCREEN_EOF( toaplan2 ); +SCREEN_VBLANK( toaplan2 ); /* non-vdp text layer */ WRITE16_HANDLER( toaplan2_txvideoram16_w ); diff -Nru mame-0.144/src/mame/includes/toki.h mame-0.145/src/mame/includes/toki.h --- mame-0.144/src/mame/includes/toki.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/toki.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,10 +19,10 @@ /*----------- defined in video/toki.c -----------*/ VIDEO_START( toki ); -SCREEN_EOF( toki ); -SCREEN_EOF( tokib ); -SCREEN_UPDATE( toki ); -SCREEN_UPDATE( tokib ); +SCREEN_VBLANK( toki ); +SCREEN_VBLANK( tokib ); +SCREEN_UPDATE_IND16( toki ); +SCREEN_UPDATE_IND16( tokib ); WRITE16_HANDLER( toki_background1_videoram16_w ); WRITE16_HANDLER( toki_background2_videoram16_w ); WRITE16_HANDLER( toki_control_w ); diff -Nru mame-0.144/src/mame/includes/toobin.h mame-0.145/src/mame/includes/toobin.h --- mame-0.144/src/mame/includes/toobin.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/toobin.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ UINT16 * m_interrupt_scan; double m_brightness; - bitmap_t * m_pfbitmap; + bitmap_ind16 m_pfbitmap; }; @@ -28,4 +28,4 @@ WRITE16_HANDLER( toobin_slip_w ); VIDEO_START( toobin ); -SCREEN_UPDATE( toobin ); +SCREEN_UPDATE_RGB32( toobin ); diff -Nru mame-0.144/src/mame/includes/topspeed.h mame-0.145/src/mame/includes/topspeed.h --- mame-0.144/src/mame/includes/topspeed.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/topspeed.h 2012-02-06 21:30:44.000000000 +0000 @@ -40,4 +40,4 @@ /*----------- defined in video/topspeed.c -----------*/ -SCREEN_UPDATE( topspeed ); +SCREEN_UPDATE_IND16( topspeed ); diff -Nru mame-0.144/src/mame/includes/toypop.h mame-0.145/src/mame/includes/toypop.h --- mame-0.144/src/mame/includes/toypop.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/toypop.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,6 +13,8 @@ int m_bitmapflip; int m_palettebank; int m_interrupt_enable_68k; + UINT8 m_main_irq_mask; + UINT8 m_sound_irq_mask; }; @@ -24,5 +26,5 @@ WRITE8_HANDLER( toypop_palettebank_w ); WRITE16_HANDLER( toypop_flipscreen_w ); VIDEO_START( toypop ); -SCREEN_UPDATE( toypop ); +SCREEN_UPDATE_IND16( toypop ); PALETTE_INIT( toypop ); diff -Nru mame-0.144/src/mame/includes/tp84.h mame-0.145/src/mame/includes/tp84.h --- mame-0.144/src/mame/includes/tp84.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tp84.h 2012-02-06 21:30:44.000000000 +0000 @@ -17,6 +17,8 @@ UINT8 *m_flipscreen_y; tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; + + UINT8 m_sub_irq_mask; }; @@ -27,4 +29,4 @@ PALETTE_INIT( tp84 ); VIDEO_START( tp84 ); -SCREEN_UPDATE( tp84 ); +SCREEN_UPDATE_IND16( tp84 ); diff -Nru mame-0.144/src/mame/includes/trackfld.h mame-0.145/src/mame/includes/trackfld.h --- mame-0.144/src/mame/includes/trackfld.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/trackfld.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,6 +27,9 @@ int m_sprite_bank2; int m_old_gfx_bank; // needed by atlantol int m_sprites_gfx_banked; + + UINT8 m_irq_mask; + UINT8 m_yieartf_nmi_mask; }; @@ -39,6 +42,6 @@ PALETTE_INIT( trackfld ); VIDEO_START( trackfld ); -SCREEN_UPDATE( trackfld ); +SCREEN_UPDATE_IND16( trackfld ); VIDEO_START( atlantol ); diff -Nru mame-0.144/src/mame/includes/travrusa.h mame-0.145/src/mame/includes/travrusa.h --- mame-0.144/src/mame/includes/travrusa.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/travrusa.h 2012-02-06 21:30:44.000000000 +0000 @@ -24,4 +24,4 @@ PALETTE_INIT( travrusa ); PALETTE_INIT( shtrider ); VIDEO_START( travrusa ); -SCREEN_UPDATE( travrusa ); +SCREEN_UPDATE_IND16( travrusa ); diff -Nru mame-0.144/src/mame/includes/triplhnt.h mame-0.145/src/mame/includes/triplhnt.h --- mame-0.144/src/mame/includes/triplhnt.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/triplhnt.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,7 +34,7 @@ UINT8* m_orga_ram; int m_sprite_zoom; int m_sprite_bank; - bitmap_t* m_helper; + bitmap_ind16 m_helper; tilemap_t* m_bg_tilemap; }; @@ -53,6 +53,6 @@ /*----------- defined in video/triplhnt.c -----------*/ VIDEO_START( triplhnt ); -SCREEN_UPDATE( triplhnt ); +SCREEN_UPDATE_IND16( triplhnt ); diff -Nru mame-0.144/src/mame/includes/trucocl.h mame-0.145/src/mame/includes/trucocl.h --- mame-0.144/src/mame/includes/trucocl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/trucocl.h 2012-02-06 21:30:44.000000000 +0000 @@ -9,6 +9,8 @@ UINT8 *m_videoram; UINT8 *m_colorram; tilemap_t *m_bg_tilemap; + + UINT8 m_irq_mask; }; @@ -18,4 +20,4 @@ WRITE8_HANDLER( trucocl_colorram_w ); PALETTE_INIT( trucocl ); VIDEO_START( trucocl ); -SCREEN_UPDATE( trucocl ); +SCREEN_UPDATE_IND16( trucocl ); diff -Nru mame-0.144/src/mame/includes/truco.h mame-0.145/src/mame/includes/truco.h --- mame-0.144/src/mame/includes/truco.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/truco.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,5 +12,5 @@ /*----------- defined in video/truco.c -----------*/ -SCREEN_UPDATE( truco ); +SCREEN_UPDATE_IND16( truco ); PALETTE_INIT( truco ); diff -Nru mame-0.144/src/mame/includes/tryout.h mame-0.145/src/mame/includes/tryout.h --- mame-0.144/src/mame/includes/tryout.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tryout.h 2012-02-06 21:30:44.000000000 +0000 @@ -26,4 +26,4 @@ PALETTE_INIT( tryout ); VIDEO_START( tryout ); -SCREEN_UPDATE( tryout ); +SCREEN_UPDATE_IND16( tryout ); diff -Nru mame-0.144/src/mame/includes/tsamurai.h mame-0.145/src/mame/includes/tsamurai.h --- mame-0.144/src/mame/includes/tsamurai.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tsamurai.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,7 +39,7 @@ WRITE8_HANDLER( tsamurai_fg_colorram_w ); VIDEO_START( tsamurai ); -SCREEN_UPDATE( tsamurai ); +SCREEN_UPDATE_IND16( tsamurai ); VIDEO_START( vsgongf ); -SCREEN_UPDATE( vsgongf ); +SCREEN_UPDATE_IND16( vsgongf ); diff -Nru mame-0.144/src/mame/includes/tubep.h mame-0.145/src/mame/includes/tubep.h --- mame-0.144/src/mame/includes/tubep.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tubep.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,9 +43,9 @@ void tubep_vblank_end(running_machine &machine); PALETTE_INIT( tubep ); -SCREEN_UPDATE( tubep ); +SCREEN_UPDATE_IND16( tubep ); PALETTE_INIT( rjammer ); -SCREEN_UPDATE( rjammer ); +SCREEN_UPDATE_IND16( rjammer ); VIDEO_START( tubep ); VIDEO_RESET( tubep ); diff -Nru mame-0.144/src/mame/includes/tumbleb.h mame-0.145/src/mame/includes/tumbleb.h --- mame-0.144/src/mame/includes/tumbleb.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tumbleb.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,8 +27,6 @@ UINT16 m_control_0[8]; int m_flipscreen; UINT16 m_tilebank; - int m_sprite_xoffset; - int m_sprite_yoffset; /* devices */ device_t *m_maincpu; @@ -60,14 +58,14 @@ VIDEO_START( suprtrio ); VIDEO_START( pangpang ); -SCREEN_UPDATE( tumblepb ); -SCREEN_UPDATE( jumpkids ); -SCREEN_UPDATE( fncywld ); -SCREEN_UPDATE( jumppop ); -SCREEN_UPDATE( semicom ); -SCREEN_UPDATE( semicom_altoffsets ); -SCREEN_UPDATE( bcstory ); -SCREEN_UPDATE(semibase ); -SCREEN_UPDATE( suprtrio ); -SCREEN_UPDATE( pangpang ); -SCREEN_UPDATE( sdfight ); +SCREEN_UPDATE_IND16( tumblepb ); +SCREEN_UPDATE_IND16( jumpkids ); +SCREEN_UPDATE_IND16( fncywld ); +SCREEN_UPDATE_IND16( jumppop ); +SCREEN_UPDATE_IND16( semicom ); +SCREEN_UPDATE_IND16( semicom_altoffsets ); +SCREEN_UPDATE_IND16( bcstory ); +SCREEN_UPDATE_IND16(semibase ); +SCREEN_UPDATE_IND16( suprtrio ); +SCREEN_UPDATE_IND16( pangpang ); +SCREEN_UPDATE_IND16( sdfight ); diff -Nru mame-0.144/src/mame/includes/tumblep.h mame-0.145/src/mame/includes/tumblep.h --- mame-0.144/src/mame/includes/tumblep.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tumblep.h 2012-02-06 21:30:44.000000000 +0000 @@ -27,4 +27,4 @@ /*----------- defined in video/tumblep.c -----------*/ -SCREEN_UPDATE( tumblep ); +SCREEN_UPDATE_IND16( tumblep ); diff -Nru mame-0.144/src/mame/includes/tunhunt.h mame-0.145/src/mame/includes/tunhunt.h --- mame-0.144/src/mame/includes/tunhunt.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/tunhunt.h 2012-02-06 21:30:44.000000000 +0000 @@ -9,6 +9,7 @@ UINT8 *m_spriteram; UINT8 *m_videoram; tilemap_t *m_fg_tilemap; + bitmap_ind16 m_tmpbitmap; }; @@ -18,4 +19,4 @@ PALETTE_INIT( tunhunt ); VIDEO_START( tunhunt ); -SCREEN_UPDATE( tunhunt ); +SCREEN_UPDATE_IND16( tunhunt ); diff -Nru mame-0.144/src/mame/includes/turbo.h mame-0.145/src/mame/includes/turbo.h --- mame-0.144/src/mame/includes/turbo.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/turbo.h 2012-02-06 21:30:44.000000000 +0000 @@ -104,14 +104,14 @@ PALETTE_INIT( turbo ); VIDEO_START( turbo ); -SCREEN_UPDATE( turbo ); +SCREEN_UPDATE_IND16( turbo ); PALETTE_INIT( subroc3d ); -SCREEN_UPDATE( subroc3d ); +SCREEN_UPDATE_IND16( subroc3d ); PALETTE_INIT( buckrog ); VIDEO_START( buckrog ); -SCREEN_UPDATE( buckrog ); +SCREEN_UPDATE_IND16( buckrog ); WRITE8_HANDLER( turbo_videoram_w ); WRITE8_HANDLER( buckrog_bitmap_w ); diff -Nru mame-0.144/src/mame/includes/tutankhm.h mame-0.145/src/mame/includes/tutankhm.h --- mame-0.144/src/mame/includes/tutankhm.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tutankhm.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,4 +28,4 @@ WRITE8_HANDLER( tutankhm_flip_screen_x_w ); WRITE8_HANDLER( tutankhm_flip_screen_y_w ); -SCREEN_UPDATE( tutankhm ); +SCREEN_UPDATE_RGB32( tutankhm ); diff -Nru mame-0.144/src/mame/includes/twin16.h mame-0.145/src/mame/includes/twin16.h --- mame-0.144/src/mame/includes/twin16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/twin16.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,7 +41,7 @@ READ16_HANDLER( twin16_sprite_status_r ); VIDEO_START( twin16 ); -SCREEN_UPDATE( twin16 ); -SCREEN_EOF( twin16 ); +SCREEN_UPDATE_IND16( twin16 ); +SCREEN_VBLANK( twin16 ); void twin16_spriteram_process( running_machine &machine ); diff -Nru mame-0.144/src/mame/includes/twincobr.h mame-0.145/src/mame/includes/twincobr.h --- mame-0.144/src/mame/includes/twincobr.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/twincobr.h 2012-02-06 21:30:44.000000000 +0000 @@ -121,5 +121,5 @@ VIDEO_START( toaplan0 ); -SCREEN_UPDATE( toaplan0 ); -SCREEN_EOF( toaplan0 ); +SCREEN_UPDATE_IND16( toaplan0 ); +SCREEN_VBLANK( toaplan0 ); diff -Nru mame-0.144/src/mame/includes/tx1.h mame-0.145/src/mame/includes/tx1.h --- mame-0.144/src/mame/includes/tx1.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/tx1.h 2012-02-06 21:30:44.000000000 +0000 @@ -119,7 +119,7 @@ UINT8 *m_chr_bmp; UINT8 *m_obj_bmp; UINT8 *m_rod_bmp; - bitmap_t *m_bitmap; + bitmap_ind16 *m_bitmap; }; @@ -161,8 +161,10 @@ PALETTE_INIT( tx1 ); VIDEO_START( tx1 ); -SCREEN_UPDATE( tx1 ); -SCREEN_EOF( tx1 ); +SCREEN_UPDATE_IND16( tx1_left ); +SCREEN_UPDATE_IND16( tx1_middle ); +SCREEN_UPDATE_IND16( tx1_right ); +SCREEN_VBLANK( tx1 ); WRITE16_HANDLER( tx1_slincs_w ); WRITE16_HANDLER( tx1_slock_w ); WRITE16_HANDLER( tx1_scolst_w ); @@ -171,11 +173,13 @@ PALETTE_INIT( buggyboy ); VIDEO_START( buggyboy ); -SCREEN_UPDATE( buggyboy ); -SCREEN_EOF( buggyboy ); +SCREEN_UPDATE_IND16( buggyboy_left ); +SCREEN_UPDATE_IND16( buggyboy_middle ); +SCREEN_UPDATE_IND16( buggyboy_right ); +SCREEN_VBLANK( buggyboy ); VIDEO_START( buggybjr ); -SCREEN_UPDATE( buggybjr ); +SCREEN_UPDATE_IND16( buggybjr ); WRITE16_HANDLER( buggyboy_gas_w ); WRITE16_HANDLER( buggyboy_sky_w ); WRITE16_HANDLER( buggyboy_scolst_w ); diff -Nru mame-0.144/src/mame/includes/ultraman.h mame-0.145/src/mame/includes/ultraman.h --- mame-0.144/src/mame/includes/ultraman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/ultraman.h 2012-02-06 21:30:44.000000000 +0000 @@ -41,4 +41,4 @@ WRITE16_HANDLER( ultraman_gfxctrl_w ); VIDEO_START( ultraman ); -SCREEN_UPDATE( ultraman ); +SCREEN_UPDATE_IND16( ultraman ); diff -Nru mame-0.144/src/mame/includes/ultratnk.h mame-0.145/src/mame/includes/ultratnk.h --- mame-0.144/src/mame/includes/ultratnk.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/ultratnk.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,7 +15,7 @@ int m_da_latch; int m_collision[4]; tilemap_t* m_playfield; - bitmap_t* m_helper; + bitmap_ind16 m_helper; }; @@ -23,7 +23,7 @@ PALETTE_INIT( ultratnk ); VIDEO_START( ultratnk ); -SCREEN_UPDATE( ultratnk ); -SCREEN_EOF( ultratnk ); +SCREEN_UPDATE_IND16( ultratnk ); +SCREEN_VBLANK( ultratnk ); WRITE8_HANDLER( ultratnk_video_ram_w ); diff -Nru mame-0.144/src/mame/includes/undrfire.h mame-0.145/src/mame/includes/undrfire.h --- mame-0.144/src/mame/includes/undrfire.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/undrfire.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,5 +30,5 @@ /*----------- defined in video/undrfire.c -----------*/ VIDEO_START( undrfire ); -SCREEN_UPDATE( undrfire ); -SCREEN_UPDATE( cbombers ); +SCREEN_UPDATE_IND16( undrfire ); +SCREEN_UPDATE_IND16( cbombers ); diff -Nru mame-0.144/src/mame/includes/unico.h mame-0.145/src/mame/includes/unico.h --- mame-0.144/src/mame/includes/unico.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/unico.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,8 +25,8 @@ WRITE32_HANDLER( unico_palette32_w ); VIDEO_START( unico ); -SCREEN_UPDATE( unico ); +SCREEN_UPDATE_IND16( unico ); VIDEO_START( zeropnt2 ); -SCREEN_UPDATE( zeropnt2 ); +SCREEN_UPDATE_IND16( zeropnt2 ); diff -Nru mame-0.144/src/mame/includes/usgames.h mame-0.145/src/mame/includes/usgames.h --- mame-0.144/src/mame/includes/usgames.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/usgames.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,4 +16,4 @@ WRITE8_HANDLER( usgames_charram_w ); VIDEO_START( usgames ); PALETTE_INIT( usgames ); -SCREEN_UPDATE( usgames ); +SCREEN_UPDATE_IND16( usgames ); diff -Nru mame-0.144/src/mame/includes/vaportra.h mame-0.145/src/mame/includes/vaportra.h --- mame-0.144/src/mame/includes/vaportra.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/vaportra.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ WRITE16_HANDLER( vaportra_palette_24bit_rg_w ); WRITE16_HANDLER( vaportra_palette_24bit_b_w ); -SCREEN_UPDATE( vaportra ); +SCREEN_UPDATE_IND16( vaportra ); diff -Nru mame-0.144/src/mame/includes/vastar.h mame-0.145/src/mame/includes/vastar.h --- mame-0.144/src/mame/includes/vastar.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/vastar.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,6 +20,8 @@ tilemap_t *m_bg2_tilemap; UINT8 *m_sharedram; + + UINT8 m_nmi_mask; }; @@ -32,4 +34,4 @@ READ8_HANDLER( vastar_bg2videoram_r ); VIDEO_START( vastar ); -SCREEN_UPDATE( vastar ); +SCREEN_UPDATE_IND16( vastar ); diff -Nru mame-0.144/src/mame/includes/vball.h mame-0.145/src/mame/includes/vball.h --- mame-0.144/src/mame/includes/vball.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/vball.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,7 +23,7 @@ /*----------- defined in video/vball.c -----------*/ VIDEO_START( vb ); -SCREEN_UPDATE( vb ); +SCREEN_UPDATE_IND16( vb ); void vb_bgprombank_w(running_machine &machine, int bank); void vb_spprombank_w(running_machine &machine, int bank); WRITE8_HANDLER( vb_attrib_w ); diff -Nru mame-0.144/src/mame/includes/vectrex.h mame-0.145/src/mame/includes/vectrex.h --- mame-0.144/src/mame/includes/vectrex.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/vectrex.h 2012-02-06 21:30:44.000000000 +0000 @@ -88,7 +88,7 @@ extern const via6522_interface spectrum1_via6522_interface; VIDEO_START( vectrex ); -SCREEN_UPDATE( vectrex ); +SCREEN_UPDATE_RGB32( vectrex ); VIDEO_START( raaspec ); diff -Nru mame-0.144/src/mame/includes/vendetta.h mame-0.145/src/mame/includes/vendetta.h --- mame-0.144/src/mame/includes/vendetta.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/vendetta.h 2012-02-06 21:30:44.000000000 +0000 @@ -39,4 +39,4 @@ extern void esckids_tile_callback(running_machine &machine, int layer,int bank,int *code,int *color,int *flags,int *priority); extern void vendetta_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask); -SCREEN_UPDATE( vendetta ); +SCREEN_UPDATE_IND16( vendetta ); diff -Nru mame-0.144/src/mame/includes/vicdual.h mame-0.145/src/mame/includes/vicdual.h --- mame-0.144/src/mame/includes/vicdual.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/vicdual.h 2012-02-06 21:30:44.000000000 +0000 @@ -45,9 +45,9 @@ WRITE8_HANDLER( vicdual_palette_bank_w ); -SCREEN_UPDATE( vicdual_bw ); -SCREEN_UPDATE( vicdual_color ); -SCREEN_UPDATE( vicdual_bw_or_color ); +SCREEN_UPDATE_RGB32( vicdual_bw ); +SCREEN_UPDATE_RGB32( vicdual_color ); +SCREEN_UPDATE_RGB32( vicdual_bw_or_color ); /*----------- defined in audio/vicdual.c -----------*/ diff -Nru mame-0.144/src/mame/includes/victory.h mame-0.145/src/mame/includes/victory.h --- mame-0.144/src/mame/includes/victory.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/victory.h 2012-02-06 21:30:44.000000000 +0000 @@ -60,7 +60,7 @@ /*----------- defined in video/victory.c -----------*/ VIDEO_START( victory ); -SCREEN_UPDATE( victory ); +SCREEN_UPDATE_IND16( victory ); INTERRUPT_GEN( victory_vblank_interrupt ); READ8_HANDLER( victory_video_control_r ); diff -Nru mame-0.144/src/mame/includes/videopin.h mame-0.145/src/mame/includes/videopin.h --- mame-0.144/src/mame/includes/videopin.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/videopin.h 2012-02-06 21:30:44.000000000 +0000 @@ -43,5 +43,5 @@ WRITE8_HANDLER( videopin_ball_w ); VIDEO_START( videopin ); -SCREEN_UPDATE( videopin ); +SCREEN_UPDATE_IND16( videopin ); diff -Nru mame-0.144/src/mame/includes/vigilant.h mame-0.145/src/mame/includes/vigilant.h --- mame-0.144/src/mame/includes/vigilant.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/vigilant.h 2012-02-06 21:30:44.000000000 +0000 @@ -12,7 +12,7 @@ int m_rear_color; int m_rear_disable; int m_rear_refresh; - bitmap_t *m_bg_bitmap; + bitmap_ind16 *m_bg_bitmap; UINT8 *m_spriteram; size_t m_spriteram_size; }; @@ -26,5 +26,5 @@ WRITE8_HANDLER( vigilant_horiz_scroll_w ); WRITE8_HANDLER( vigilant_rear_horiz_scroll_w ); WRITE8_HANDLER( vigilant_rear_color_w ); -SCREEN_UPDATE( vigilant ); -SCREEN_UPDATE( kikcubic ); +SCREEN_UPDATE_IND16( vigilant ); +SCREEN_UPDATE_IND16( kikcubic ); diff -Nru mame-0.144/src/mame/includes/vindictr.h mame-0.145/src/mame/includes/vindictr.h --- mame-0.144/src/mame/includes/vindictr.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/vindictr.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,6 +23,6 @@ WRITE16_HANDLER( vindictr_paletteram_w ); VIDEO_START( vindictr ); -SCREEN_UPDATE( vindictr ); +SCREEN_UPDATE_IND16( vindictr ); void vindictr_scanline_update(screen_device &screen, int scanline); diff -Nru mame-0.144/src/mame/includes/volfied.h mame-0.145/src/mame/includes/volfied.h --- mame-0.144/src/mame/includes/volfied.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/volfied.h 2012-02-06 21:30:44.000000000 +0000 @@ -54,5 +54,5 @@ READ16_HANDLER( volfied_video_ram_r ); READ16_HANDLER( volfied_video_ctrl_r ); -SCREEN_UPDATE( volfied ); +SCREEN_UPDATE_IND16( volfied ); VIDEO_START( volfied ); diff -Nru mame-0.144/src/mame/includes/vsnes.h mame-0.145/src/mame/includes/vsnes.h --- mame-0.144/src/mame/includes/vsnes.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/vsnes.h 2012-02-06 21:30:44.000000000 +0000 @@ -42,9 +42,9 @@ VIDEO_START( vsnes ); PALETTE_INIT( vsnes ); -SCREEN_UPDATE( vsnes ); +SCREEN_UPDATE_IND16( vsnes ); VIDEO_START( vsdual ); -SCREEN_UPDATE( vsnes_bottom ); +SCREEN_UPDATE_IND16( vsnes_bottom ); PALETTE_INIT( vsdual ); extern const ppu2c0x_interface vsnes_ppu_interface_1; diff -Nru mame-0.144/src/mame/includes/vulgus.h mame-0.145/src/mame/includes/vulgus.h --- mame-0.144/src/mame/includes/vulgus.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/vulgus.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,4 +25,4 @@ VIDEO_START( vulgus ); PALETTE_INIT( vulgus ); -SCREEN_UPDATE( vulgus ); +SCREEN_UPDATE_IND16( vulgus ); diff -Nru mame-0.144/src/mame/includes/warpwarp.h mame-0.145/src/mame/includes/warpwarp.h --- mame-0.144/src/mame/includes/warpwarp.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/warpwarp.h 2012-02-06 21:30:44.000000000 +0000 @@ -28,7 +28,7 @@ VIDEO_START( geebee ); VIDEO_START( navarone ); VIDEO_START( warpwarp ); -SCREEN_UPDATE( geebee ); +SCREEN_UPDATE_IND16( geebee ); WRITE8_HANDLER( warpwarp_videoram_w ); WRITE8_HANDLER( geebee_videoram_w ); diff -Nru mame-0.144/src/mame/includes/warriorb.h mame-0.145/src/mame/includes/warriorb.h --- mame-0.144/src/mame/includes/warriorb.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/warriorb.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,4 +36,5 @@ /*----------- defined in video/warriorb.c -----------*/ VIDEO_START( warriorb ); -SCREEN_UPDATE( warriorb ); +SCREEN_UPDATE_IND16( warriorb_left ); +SCREEN_UPDATE_IND16( warriorb_right ); diff -Nru mame-0.144/src/mame/includes/wc90b.h mame-0.145/src/mame/includes/wc90b.h --- mame-0.144/src/mame/includes/wc90b.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wc90b.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ /*----------- defined in video/wc90b.c -----------*/ VIDEO_START( wc90b ); -SCREEN_UPDATE( wc90b ); +SCREEN_UPDATE_IND16( wc90b ); WRITE8_HANDLER( wc90b_bgvideoram_w ); WRITE8_HANDLER( wc90b_fgvideoram_w ); diff -Nru mame-0.144/src/mame/includes/wc90.h mame-0.145/src/mame/includes/wc90.h --- mame-0.144/src/mame/includes/wc90.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wc90.h 2012-02-06 21:30:44.000000000 +0000 @@ -34,4 +34,4 @@ WRITE8_HANDLER( wc90_fgvideoram_w ); WRITE8_HANDLER( wc90_bgvideoram_w ); WRITE8_HANDLER( wc90_txvideoram_w ); -SCREEN_UPDATE( wc90 ); +SCREEN_UPDATE_IND16( wc90 ); diff -Nru mame-0.144/src/mame/includes/wecleman.h mame-0.145/src/mame/includes/wecleman.h --- mame-0.144/src/mame/includes/wecleman.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wecleman.h 2012-02-06 21:30:44.000000000 +0000 @@ -47,9 +47,9 @@ WRITE16_HANDLER( wecleman_videostatus_w ); WRITE16_HANDLER( wecleman_pageram_w ); WRITE16_HANDLER( wecleman_txtram_w ); -SCREEN_UPDATE( wecleman ); +SCREEN_UPDATE_RGB32( wecleman ); VIDEO_START( wecleman ); -SCREEN_UPDATE( hotchase ); +SCREEN_UPDATE_IND16( hotchase ); VIDEO_START( hotchase ); void hotchase_zoom_callback_0(running_machine &machine, int *code,int *color,int *flags); diff -Nru mame-0.144/src/mame/includes/welltris.h mame-0.145/src/mame/includes/welltris.h --- mame-0.144/src/mame/includes/welltris.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/welltris.h 2012-02-06 21:30:44.000000000 +0000 @@ -30,4 +30,4 @@ WRITE16_HANDLER( welltris_scrollreg_w ); VIDEO_START( welltris ); -SCREEN_UPDATE( welltris ); +SCREEN_UPDATE_IND16( welltris ); diff -Nru mame-0.144/src/mame/includes/wgp.h mame-0.145/src/mame/includes/wgp.h --- mame-0.144/src/mame/includes/wgp.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/wgp.h 2012-02-06 21:30:44.000000000 +0000 @@ -56,4 +56,4 @@ VIDEO_START( wgp ); VIDEO_START( wgp2 ); -SCREEN_UPDATE( wgp ); +SCREEN_UPDATE_IND16( wgp ); diff -Nru mame-0.144/src/mame/includes/williams.h mame-0.145/src/mame/includes/williams.h --- mame-0.144/src/mame/includes/williams.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/williams.h 2012-02-06 21:30:44.000000000 +0000 @@ -138,9 +138,9 @@ VIDEO_START( blaster ); VIDEO_START( williams2 ); -SCREEN_UPDATE( williams ); -SCREEN_UPDATE( blaster ); -SCREEN_UPDATE( williams2 ); +SCREEN_UPDATE_RGB32( williams ); +SCREEN_UPDATE_RGB32( blaster ); +SCREEN_UPDATE_RGB32( williams2 ); WRITE8_HANDLER( williams2_tileram_w ); diff -Nru mame-0.144/src/mame/includes/wiping.h mame-0.145/src/mame/includes/wiping.h --- mame-0.144/src/mame/includes/wiping.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wiping.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,14 +4,15 @@ wiping_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) { } - UINT8 *m_sharedram1; - UINT8 *m_sharedram2; UINT8 *m_videoram; UINT8 *m_colorram; int m_flipscreen; UINT8 *m_soundregs; UINT8 *m_spriteram; size_t m_spriteram_size; + + UINT8 m_main_irq_mask; + UINT8 m_sound_irq_mask; }; @@ -19,5 +20,5 @@ WRITE8_HANDLER( wiping_flipscreen_w ); PALETTE_INIT( wiping ); -SCREEN_UPDATE( wiping ); +SCREEN_UPDATE_IND16( wiping ); diff -Nru mame-0.144/src/mame/includes/wiz.h mame-0.145/src/mame/includes/wiz.h --- mame-0.144/src/mame/includes/wiz.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wiz.h 2012-02-06 21:30:44.000000000 +0000 @@ -21,7 +21,8 @@ UINT8 *m_spriteram; UINT8 *m_spriteram2; size_t m_spriteram_size; - UINT8 m_nmi_mask; + UINT8 m_main_nmi_mask; + UINT8 m_sound_nmi_mask; }; @@ -35,6 +36,6 @@ VIDEO_START( wiz ); PALETTE_INIT( wiz ); -SCREEN_UPDATE( wiz ); -SCREEN_UPDATE( stinger ); -SCREEN_UPDATE( kungfut ); +SCREEN_UPDATE_IND16( wiz ); +SCREEN_UPDATE_IND16( stinger ); +SCREEN_UPDATE_IND16( kungfut ); diff -Nru mame-0.144/src/mame/includes/wolfpack.h mame-0.145/src/mame/includes/wolfpack.h --- mame-0.144/src/mame/includes/wolfpack.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wolfpack.h 2012-02-06 21:30:44.000000000 +0000 @@ -20,16 +20,16 @@ UINT8 m_torpedo_h; UINT8 m_torpedo_v; UINT8* m_LFSR; - bitmap_t* m_helper; + bitmap_ind16 m_helper; }; /*----------- defined in video/wolfpack.c -----------*/ PALETTE_INIT( wolfpack ); -SCREEN_UPDATE( wolfpack ); +SCREEN_UPDATE_IND16( wolfpack ); VIDEO_START( wolfpack ); -SCREEN_EOF( wolfpack ); +SCREEN_VBLANK( wolfpack ); WRITE8_HANDLER( wolfpack_video_invert_w ); WRITE8_HANDLER( wolfpack_ship_reflect_w ); diff -Nru mame-0.144/src/mame/includes/wrally.h mame-0.145/src/mame/includes/wrally.h --- mame-0.144/src/mame/includes/wrally.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wrally.h 2012-02-06 21:30:44.000000000 +0000 @@ -23,5 +23,5 @@ /*----------- defined in video/wrally.c -----------*/ VIDEO_START( wrally ); -SCREEN_UPDATE( wrally ); +SCREEN_UPDATE_IND16( wrally ); diff -Nru mame-0.144/src/mame/includes/wwfsstar.h mame-0.145/src/mame/includes/wwfsstar.h --- mame-0.144/src/mame/includes/wwfsstar.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wwfsstar.h 2012-02-06 21:30:44.000000000 +0000 @@ -18,6 +18,6 @@ /*----------- defined in video/wwfsstar.c -----------*/ VIDEO_START( wwfsstar ); -SCREEN_UPDATE( wwfsstar ); +SCREEN_UPDATE_IND16( wwfsstar ); WRITE16_HANDLER( wwfsstar_fg0_videoram_w ); WRITE16_HANDLER( wwfsstar_bg0_videoram_w ); diff -Nru mame-0.144/src/mame/includes/wwfwfest.h mame-0.145/src/mame/includes/wwfwfest.h --- mame-0.144/src/mame/includes/wwfwfest.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/wwfwfest.h 2012-02-06 21:30:44.000000000 +0000 @@ -25,7 +25,7 @@ VIDEO_START( wwfwfest ); VIDEO_START( wwfwfstb ); -SCREEN_UPDATE( wwfwfest ); +SCREEN_UPDATE_IND16( wwfwfest ); WRITE16_HANDLER( wwfwfest_fg0_videoram_w ); WRITE16_HANDLER( wwfwfest_bg0_videoram_w ); WRITE16_HANDLER( wwfwfest_bg1_videoram_w ); diff -Nru mame-0.144/src/mame/includes/xain.h mame-0.145/src/mame/includes/xain.h --- mame-0.144/src/mame/includes/xain.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/xain.h 2012-02-06 21:30:44.000000000 +0000 @@ -36,7 +36,7 @@ /*----------- defined in video/xain.c -----------*/ -SCREEN_UPDATE( xain ); +SCREEN_UPDATE_IND16( xain ); VIDEO_START( xain ); WRITE8_HANDLER( xain_scrollxP0_w ); WRITE8_HANDLER( xain_scrollyP0_w ); diff -Nru mame-0.144/src/mame/includes/xexex.h mame-0.145/src/mame/includes/xexex.h --- mame-0.144/src/mame/includes/xexex.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/xexex.h 2012-02-06 21:30:44.000000000 +0000 @@ -55,4 +55,4 @@ extern void xexex_tile_callback(running_machine &machine, int layer, int *code, int *color, int *flags); VIDEO_START( xexex ); -SCREEN_UPDATE( xexex ); +SCREEN_UPDATE_RGB32( xexex ); diff -Nru mame-0.144/src/mame/includes/xmen.h mame-0.145/src/mame/includes/xmen.h --- mame-0.144/src/mame/includes/xmen.h 2012-01-13 15:34:58.000000000 +0000 +++ mame-0.145/src/mame/includes/xmen.h 2012-02-06 21:30:44.000000000 +0000 @@ -14,8 +14,8 @@ int m_layerpri[3]; /* for xmen6p */ - bitmap_t *m_screen_right; - bitmap_t *m_screen_left; + bitmap_ind16 *m_screen_right; + bitmap_ind16 *m_screen_left; UINT16 * m_xmen6p_spriteramleft; UINT16 * m_xmen6p_spriteramright; UINT16 * m_xmen6p_tilemapleft; @@ -43,6 +43,7 @@ void xmen_sprite_callback(running_machine &machine, int *code,int *color,int *priority_mask); VIDEO_START( xmen6p ); -SCREEN_UPDATE( xmen ); -SCREEN_UPDATE( xmen6p ); -SCREEN_EOF( xmen6p ); +SCREEN_UPDATE_IND16( xmen ); +SCREEN_UPDATE_IND16( xmen6p_left ); +SCREEN_UPDATE_IND16( xmen6p_right ); +SCREEN_VBLANK( xmen6p ); diff -Nru mame-0.144/src/mame/includes/xorworld.h mame-0.145/src/mame/includes/xorworld.h --- mame-0.144/src/mame/includes/xorworld.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/xorworld.h 2012-02-06 21:30:44.000000000 +0000 @@ -16,4 +16,4 @@ PALETTE_INIT( xorworld ); VIDEO_START( xorworld ); -SCREEN_UPDATE( xorworld ); +SCREEN_UPDATE_IND16( xorworld ); diff -Nru mame-0.144/src/mame/includes/xxmissio.h mame-0.145/src/mame/includes/xxmissio.h --- mame-0.144/src/mame/includes/xxmissio.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/xxmissio.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,7 +19,7 @@ /*----------- defined in video/xxmissio.c -----------*/ VIDEO_START( xxmissio ); -SCREEN_UPDATE( xxmissio ); +SCREEN_UPDATE_IND16( xxmissio ); WRITE8_DEVICE_HANDLER( xxmissio_scroll_x_w ); WRITE8_DEVICE_HANDLER( xxmissio_scroll_y_w ); diff -Nru mame-0.144/src/mame/includes/xybots.h mame-0.145/src/mame/includes/xybots.h --- mame-0.144/src/mame/includes/xybots.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/xybots.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ /*----------- defined in video/xybots.c -----------*/ VIDEO_START( xybots ); -SCREEN_UPDATE( xybots ); +SCREEN_UPDATE_IND16( xybots ); diff -Nru mame-0.144/src/mame/includes/xyonix.h mame-0.145/src/mame/includes/xyonix.h --- mame-0.144/src/mame/includes/xyonix.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/xyonix.h 2012-02-06 21:30:44.000000000 +0000 @@ -19,4 +19,4 @@ PALETTE_INIT( xyonix ); WRITE8_HANDLER( xyonix_vidram_w ); VIDEO_START(xyonix); -SCREEN_UPDATE(xyonix); +SCREEN_UPDATE_IND16(xyonix); diff -Nru mame-0.144/src/mame/includes/yiear.h mame-0.145/src/mame/includes/yiear.h --- mame-0.144/src/mame/includes/yiear.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/yiear.h 2012-02-06 21:30:44.000000000 +0000 @@ -13,7 +13,8 @@ /* video-related */ tilemap_t *m_bg_tilemap; - int m_yiear_nmi_enable; + UINT8 m_yiear_nmi_enable; + UINT8 m_yiear_irq_enable; }; @@ -24,4 +25,7 @@ PALETTE_INIT( yiear ); VIDEO_START( yiear ); -SCREEN_UPDATE( yiear ); +SCREEN_UPDATE_IND16( yiear ); + +READ8_DEVICE_HANDLER( yiear_speech_r ); +WRITE8_DEVICE_HANDLER( yiear_VLM5030_control_w ); diff -Nru mame-0.144/src/mame/includes/yunsun16.h mame-0.145/src/mame/includes/yunsun16.h --- mame-0.144/src/mame/includes/yunsun16.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/yunsun16.h 2012-02-06 21:30:44.000000000 +0000 @@ -37,4 +37,4 @@ WRITE16_HANDLER( yunsun16_vram_1_w ); VIDEO_START( yunsun16 ); -SCREEN_UPDATE( yunsun16 ); +SCREEN_UPDATE_IND16( yunsun16 ); diff -Nru mame-0.144/src/mame/includes/yunsung8.h mame-0.145/src/mame/includes/yunsung8.h --- mame-0.144/src/mame/includes/yunsung8.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/yunsung8.h 2012-02-06 21:30:44.000000000 +0000 @@ -38,4 +38,4 @@ WRITE8_HANDLER( yunsung8_flipscreen_w ); VIDEO_START( yunsung8 ); -SCREEN_UPDATE( yunsung8 ); +SCREEN_UPDATE_IND16( yunsung8 ); diff -Nru mame-0.144/src/mame/includes/zac2650.h mame-0.145/src/mame/includes/zac2650.h --- mame-0.144/src/mame/includes/zac2650.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/zac2650.h 2012-02-06 21:30:44.000000000 +0000 @@ -6,7 +6,8 @@ UINT8 *m_videoram; UINT8 *m_s2636_0_ram; - bitmap_t *m_spritebitmap; + bitmap_ind16 m_bitmap; + bitmap_ind16 m_spritebitmap; int m_CollisionBackground; int m_CollisionSprite; tilemap_t *m_bg_tilemap; @@ -21,5 +22,5 @@ READ8_HANDLER( tinvader_port_0_r ); VIDEO_START( tinvader ); -SCREEN_UPDATE( tinvader ); +SCREEN_UPDATE_IND16( tinvader ); diff -Nru mame-0.144/src/mame/includes/zaccaria.h mame-0.145/src/mame/includes/zaccaria.h --- mame-0.144/src/mame/includes/zaccaria.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/zaccaria.h 2012-02-06 21:30:44.000000000 +0000 @@ -15,6 +15,7 @@ tilemap_t *m_bg_tilemap; UINT8 *m_spriteram; UINT8 *m_spriteram2; + UINT8 m_nmi_mask; }; @@ -26,4 +27,4 @@ WRITE8_HANDLER( zaccaria_attributes_w ); WRITE8_HANDLER( zaccaria_flip_screen_x_w ); WRITE8_HANDLER( zaccaria_flip_screen_y_w ); -SCREEN_UPDATE( zaccaria ); +SCREEN_UPDATE_IND16( zaccaria ); diff -Nru mame-0.144/src/mame/includes/zaxxon.h mame-0.145/src/mame/includes/zaxxon.h --- mame-0.144/src/mame/includes/zaxxon.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/mame/includes/zaxxon.h 2012-02-06 21:30:44.000000000 +0000 @@ -71,7 +71,7 @@ VIDEO_START( razmataz ); VIDEO_START( congo ); -SCREEN_UPDATE( zaxxon ); -SCREEN_UPDATE( razmataz ); -SCREEN_UPDATE( congo ); -SCREEN_UPDATE( futspy ); +SCREEN_UPDATE_IND16( zaxxon ); +SCREEN_UPDATE_IND16( razmataz ); +SCREEN_UPDATE_IND16( congo ); +SCREEN_UPDATE_IND16( futspy ); diff -Nru mame-0.144/src/mame/includes/zerozone.h mame-0.145/src/mame/includes/zerozone.h --- mame-0.144/src/mame/includes/zerozone.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/zerozone.h 2012-02-06 21:30:44.000000000 +0000 @@ -4,29 +4,48 @@ *************************************************************************/ +#include "emu.h" +#include "cpu/z80/z80.h" + class zerozone_state : public driver_device { public: zerozone_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } - - /* memory pointers */ - UINT16 * m_videoram; -// UINT16 * paletteram; // currently this uses generic palette handling - size_t m_videoram_size; - - /* video-related */ - UINT16 m_tilebank; + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_vram(*this, "videoram"), + m_vram_size(*this, "videoram") + { } + + // in drivers/zerozone.c + DECLARE_WRITE16_MEMBER(sound_w); + + // in video/zerozone.c + DECLARE_WRITE16_MEMBER(tilemap_w); + DECLARE_WRITE16_MEMBER(tilebank_w); + + // devices + required_device m_maincpu; + required_device m_audiocpu; + + // shared pointers + required_shared_ptr m_vram; + required_shared_size m_vram_size; + // currently this driver uses generic palette handling + + // state + // video-related + UINT16 m_tilebank; tilemap_t *m_zz_tilemap; - /* devices */ - device_t *m_audiocpu; -}; + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); -/*----------- defined in video/zerozone.c -----------*/ +protected: -WRITE16_HANDLER( zerozone_tilemap_w ); -WRITE16_HANDLER( zerozone_tilebank_w ); + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); -VIDEO_START( zerozone ); -SCREEN_UPDATE( zerozone ); + virtual void video_start(); +}; diff -Nru mame-0.144/src/mame/includes/zodiack.h mame-0.145/src/mame/includes/zodiack.h --- mame-0.144/src/mame/includes/zodiack.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/includes/zodiack.h 2012-02-06 21:30:44.000000000 +0000 @@ -1,41 +1,84 @@ + +#include "emu.h" +#include "cpu/z80/z80.h" + class zodiack_state : public driver_device { public: zodiack_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } - - UINT8 * m_videoram; - UINT8 * m_attributeram; - UINT8 * m_spriteram; - UINT8 * m_videoram_2; - UINT8 * m_bulletsram; - size_t m_videoram_size; - size_t m_spriteram_size; - size_t m_bulletsram_size; + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_videoram(*this, "videoram"), + m_videoram_2(*this, "videoram_2"), + m_attributeram(*this, "attributeram"), + m_spriteram(*this, "spriteram"), + m_bulletsram(*this, "bulletsram"), + m_videoram_size(*this, "videoram"), + m_spriteram_size(*this, "spriteram"), + m_bulletsram_size(*this, "bulletsram") + { m_percuss_hardware = 0; } + + // in drivers/zodiack.c + DECLARE_WRITE8_MEMBER(nmi_mask_w); + DECLARE_WRITE8_MEMBER(sound_nmi_enable_w); + DECLARE_WRITE8_MEMBER(master_soundlatch_w); + DECLARE_WRITE8_MEMBER(control_w); + + // in video/zodiack.c + DECLARE_WRITE8_MEMBER(videoram_w); + DECLARE_WRITE8_MEMBER(videoram2_w); + DECLARE_WRITE8_MEMBER(attributes_w); + DECLARE_WRITE8_MEMBER(flipscreen_w); + + void draw_bullets(bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + + // devices + required_device m_maincpu; + required_device m_audiocpu; + + // shared pointers + required_shared_ptr m_videoram; + required_shared_ptr m_videoram_2; + required_shared_ptr m_attributeram; + required_shared_ptr m_spriteram; + required_shared_ptr m_bulletsram; + required_shared_size m_videoram_size; + required_shared_size m_spriteram_size; + required_shared_size m_bulletsram_size; + // currently this driver uses generic palette handling - /* video-related */ + // state + // video-related tilemap_t *m_bg_tilemap; tilemap_t *m_fg_tilemap; - /* sound-related */ + // sound-related UINT8 m_nmi_enable; UINT8 m_sound_nmi_enabled; - /* misc */ + // misc int m_percuss_hardware; - /* devices */ - device_t *m_maincpu; - device_t *m_audiocpu; -}; + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + +protected: -/*----------- defined in video/zodiack.c -----------*/ + // driver_device overrides + virtual void machine_start(); + virtual void machine_reset(); -WRITE8_HANDLER( zodiack_videoram_w ); -WRITE8_HANDLER( zodiack_videoram2_w ); -WRITE8_HANDLER( zodiack_attributes_w ); -WRITE8_HANDLER( zodiack_flipscreen_w ); + virtual void video_start(); +}; + +class percuss_state : public zodiack_state +{ +public: + percuss_state(const machine_config &mconfig, device_type type, const char *tag) + : zodiack_state(mconfig, type, tag) + { m_percuss_hardware = 1; } +}; +// in video/zodiack.c PALETTE_INIT( zodiack ); -VIDEO_START( zodiack ); -SCREEN_UPDATE( zodiack ); diff -Nru mame-0.144/src/mame/layout/beaminv.lay mame-0.145/src/mame/layout/beaminv.lay --- mame-0.144/src/mame/layout/beaminv.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/layout/beaminv.lay 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.144/src/mame/layout/fortecrd.lay mame-0.145/src/mame/layout/fortecrd.lay --- mame-0.144/src/mame/layout/fortecrd.lay 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/layout/fortecrd.lay 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mame-0.144/src/mame/layout/superchs.lay mame-0.145/src/mame/layout/superchs.lay --- mame-0.144/src/mame/layout/superchs.lay 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/layout/superchs.lay 2012-02-06 21:30:44.000000000 +0000 @@ -48,18 +48,20 @@ + + - + - + - + diff -Nru mame-0.144/src/mame/machine/3do.c mame-0.145/src/mame/machine/3do.c --- mame-0.144/src/mame/machine/3do.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/3do.c 2012-02-06 21:30:42.000000000 +0000 @@ -985,15 +985,15 @@ /* This is incorrect! Just testing stuff */ -SCREEN_UPDATE( _3do ) +SCREEN_UPDATE_RGB32( _3do ) { - _3do_state *state = screen->machine().driver_data<_3do_state>(); + _3do_state *state = screen.machine().driver_data<_3do_state>(); UINT32 *source_p = state->m_vram + 0x1c0000 / 4; for ( int i = 0; i < 120; i++ ) { - UINT32 *dest_p0 = BITMAP_ADDR32( bitmap, 22 + i * 2, 254 ); - UINT32 *dest_p1 = BITMAP_ADDR32( bitmap, 22 + i * 2 + 1, 254 ); + UINT32 *dest_p0 = &bitmap.pix32(22 + i * 2, 254 ); + UINT32 *dest_p1 = &bitmap.pix32(22 + i * 2 + 1, 254 ); for ( int j = 0; j < 320; j++ ) { diff -Nru mame-0.144/src/mame/machine/amiga.c mame-0.145/src/mame/machine/amiga.c --- mame-0.144/src/mame/machine/amiga.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/amiga.c 2012-02-06 21:30:43.000000000 +0000 @@ -336,9 +336,15 @@ if (!machine.primary_screen->update_partial(scanline)) { if (IS_AGA(state->m_intf)) - amiga_aga_render_scanline(machine, NULL, scanline); + { + bitmap_rgb32 dummy_bitmap; + amiga_aga_render_scanline(machine, dummy_bitmap, scanline); + } else - amiga_render_scanline(machine, NULL, scanline); + { + bitmap_ind16 dummy_bitmap; + amiga_render_scanline(machine, dummy_bitmap, scanline); + } } /* force a sound update */ diff -Nru mame-0.144/src/mame/machine/archimds.c mame-0.145/src/mame/machine/archimds.c --- mame-0.144/src/mame/machine/archimds.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/archimds.c 2012-02-06 21:30:43.000000000 +0000 @@ -32,10 +32,7 @@ #include "includes/archimds.h" #include "machine/i2cmem.h" #include "debugger.h" - -#ifdef MESS #include "machine/wd17xx.h" -#endif static const int page_sizes[4] = { 4096, 8192, 16384, 32768 }; @@ -667,9 +664,7 @@ READ32_HANDLER(archimedes_ioc_r) { UINT32 ioc_addr; - #ifdef MESS device_t *fdc = (device_t *)space->machine().device("wd1772"); - #endif ioc_addr = offset*4; @@ -686,13 +681,13 @@ { case 0: return ioc_ctrl_r(space,offset,mem_mask); case 1: - #ifdef MESS + if (fdc) { logerror("17XX: R @ addr %x mask %08x\n", offset*4, mem_mask); return wd17xx_data_r(fdc, offset&0xf); - #else + } else { logerror("Read from FDC device?\n"); return 0; - #endif + } case 2: logerror("IOC: Econet Read %08x\n",ioc_addr); return 0xffff; @@ -703,11 +698,11 @@ logerror("IOC: Internal Podule Read\n"); return 0xffff; case 5: - switch(ioc_addr & 0xfffc) - { - #ifdef MESS - case 0x50: return 0; //fdc type, new model returns 5 here - #endif + if (fdc) { + switch(ioc_addr & 0xfffc) + { + case 0x50: return 0; //fdc type, new model returns 5 here + } } logerror("IOC: Internal Latches Read %08x\n",ioc_addr); @@ -725,9 +720,7 @@ WRITE32_HANDLER(archimedes_ioc_w) { UINT32 ioc_addr; - #ifdef MESS device_t *fdc = (device_t *)space->machine().device("wd1772"); - #endif ioc_addr = offset*4; @@ -744,12 +737,12 @@ { case 0: ioc_ctrl_w(space,offset,data,mem_mask); return; case 1: - #ifdef MESS - logerror("17XX: %x to addr %x mask %08x\n", data, offset*4, mem_mask); - wd17xx_data_w(fdc, offset&0xf, data&0xff); - #else - logerror("Write to FDC device?\n"); - #endif + if (fdc) { + logerror("17XX: %x to addr %x mask %08x\n", data, offset*4, mem_mask); + wd17xx_data_w(fdc, offset&0xf, data&0xff); + } else { + logerror("Write to FDC device?\n"); + } return; case 2: logerror("IOC: Econet Write %02x at %08x\n",data,ioc_addr); @@ -761,23 +754,23 @@ logerror("IOC: Internal Podule Write\n"); return; case 5: - switch(ioc_addr & 0xfffc) - { - #ifdef MESS - case 0x18: // latch B - wd17xx_dden_w(fdc, BIT(data, 1)); - return; - - case 0x40: // latch A - if (data & 1) { wd17xx_set_drive(fdc,0); } - if (data & 2) { wd17xx_set_drive(fdc,1); } - if (data & 4) { wd17xx_set_drive(fdc,2); } - if (data & 8) { wd17xx_set_drive(fdc,3); } - - wd17xx_set_side(fdc,(data & 0x10)>>4); - //bit 5 is motor on - return; - #endif + if (fdc) { + switch(ioc_addr & 0xfffc) + { + case 0x18: // latch B + wd17xx_dden_w(fdc, BIT(data, 1)); + return; + + case 0x40: // latch A + if (data & 1) { wd17xx_set_drive(fdc,0); } + if (data & 2) { wd17xx_set_drive(fdc,1); } + if (data & 4) { wd17xx_set_drive(fdc,2); } + if (data & 8) { wd17xx_set_drive(fdc,3); } + + wd17xx_set_side(fdc,(data & 0x10)>>4); + //bit 5 is motor on + return; + } } break; } diff -Nru mame-0.144/src/mame/machine/atari.c mame-0.145/src/mame/machine/atari.c --- mame-0.144/src/mame/machine/atari.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/atari.c 2012-02-06 21:30:43.000000000 +0000 @@ -64,17 +64,17 @@ READ8_DEVICE_HANDLER(atari_pia_pa_r) { - return atari_input_disabled(device->machine()) ? 0xFF : input_port_read_safe(device->machine(), "djoy_0_1", 0); + return input_port_read_safe(device->machine(), "djoy_0_1", 0); } READ8_DEVICE_HANDLER(atari_pia_pb_r) { - return atari_input_disabled(device->machine()) ? 0xFF : input_port_read_safe(device->machine(), "djoy_2_3", 0); + return input_port_read_safe(device->machine(), "djoy_2_3", 0); } WRITE8_DEVICE_HANDLER(a600xl_pia_pb_w) { a600xl_mmu(device->machine(), data); } -static WRITE_LINE_DEVICE_HANDLER(atari_pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers +WRITE_LINE_DEVICE_HANDLER(atari_pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers const pia6821_interface atarixl_pia_interface = { diff -Nru mame-0.144/src/mame/machine/atarifb.c mame-0.145/src/mame/machine/atarifb.c --- mame-0.144/src/mame/machine/atarifb.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/atarifb.c 2012-02-06 21:30:43.000000000 +0000 @@ -5,7 +5,6 @@ *************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "includes/atarifb.h" #include "sound/discrete.h" @@ -121,10 +120,11 @@ * *************************************/ +/* FIXME: almost surely not tied with screen vertical position */ WRITE8_HANDLER( atarifb_out3_w ) { - atarifb_state *state = space->machine().driver_data(); - int loop = cpu_getiloops(state->m_maincpu); + //atarifb_state *state = space->machine().driver_data(); + int loop = space->machine().primary_screen->vpos() >= 123; switch (loop) { @@ -137,8 +137,6 @@ output_set_value("ledleft4", (data >> 4) & 1); break; case 0x01: - break; - case 0x02: /* Player 2 play select lamp */ output_set_value("ledright0", (data >> 0) & 1); output_set_value("ledright1", (data >> 1) & 1); @@ -146,8 +144,6 @@ output_set_value("ledright3", (data >> 3) & 1); output_set_value("ledright4", (data >> 4) & 1); break; - case 0x03: - break; } // logerror("out3_w, %02x:%02x\n", loop, data); } diff -Nru mame-0.144/src/mame/machine/atarigen.c mame-0.145/src/mame/machine/atarigen.c --- mame-0.144/src/mame/machine/atarigen.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/atarigen.c 2012-02-06 21:30:43.000000000 +0000 @@ -116,8 +116,9 @@ int i; /* allocate timers for all screens */ - assert(machine.devicelist().count(SCREEN) <= ARRAY_LENGTH(state->m_screen_timer)); - for (i = 0, screen = machine.first_screen(); screen != NULL; i++, screen = screen->next_screen()) + screen_device_iterator iter(machine.root_device()); + assert(iter.count() < ARRAY_LENGTH(state->m_screen_timer)); + for (i = 0, screen = iter.first(); screen != NULL; i++, screen = iter.next()) { state->m_screen_timer[i].screen = screen; state->m_screen_timer[i].scanline_interrupt_timer = machine.scheduler().timer_alloc(FUNC(scanline_interrupt_callback), (void *)screen); @@ -838,8 +839,8 @@ void atarigen_set_vol(running_machine &machine, int volume, device_type type) { - device_sound_interface *sound = NULL; - for (bool gotone = machine.devicelist().first(sound); gotone; gotone = sound->next(sound)) + sound_interface_iterator iter(machine.root_device()); + for (device_sound_interface *sound = iter.first(); sound != NULL; sound = iter.next()) if (sound->device().type() == type) sound->set_output_gain(ALL_OUTPUTS, volume / 100.0); } @@ -953,13 +954,13 @@ atarimo_set_xscroll(0, state->m_atarivc_state.mo_xscroll); atarimo_set_yscroll(0, state->m_atarivc_state.mo_yscroll); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, state->m_atarivc_state.pf0_xscroll); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, state->m_atarivc_state.pf0_yscroll); + state->m_playfield_tilemap->set_scrollx(0, state->m_atarivc_state.pf0_xscroll); + state->m_playfield_tilemap->set_scrolly(0, state->m_atarivc_state.pf0_yscroll); if (state->m_atarivc_playfields > 1) { - tilemap_set_scrollx(state->m_playfield2_tilemap, 0, state->m_atarivc_state.pf1_xscroll); - tilemap_set_scrolly(state->m_playfield2_tilemap, 0, state->m_atarivc_state.pf1_yscroll); + state->m_playfield2_tilemap->set_scrollx(0, state->m_atarivc_state.pf1_xscroll); + state->m_playfield2_tilemap->set_scrolly(0, state->m_atarivc_state.pf1_yscroll); } timer->adjust(screen.time_until_pos(0)); @@ -1178,7 +1179,7 @@ { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_alpha[offset]); - tilemap_mark_tile_dirty(state->m_alpha_tilemap, offset); + state->m_alpha_tilemap->mark_tile_dirty(offset); } WRITE32_HANDLER( atarigen_alpha32_w ) @@ -1186,16 +1187,16 @@ atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_alpha32[offset]); if (ACCESSING_BITS_16_31) - tilemap_mark_tile_dirty(state->m_alpha_tilemap, offset * 2); + state->m_alpha_tilemap->mark_tile_dirty(offset * 2); if (ACCESSING_BITS_0_15) - tilemap_mark_tile_dirty(state->m_alpha_tilemap, offset * 2 + 1); + state->m_alpha_tilemap->mark_tile_dirty(offset * 2 + 1); } WRITE16_HANDLER( atarigen_alpha2_w ) { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_alpha2[offset]); - tilemap_mark_tile_dirty(state->m_alpha2_tilemap, offset); + state->m_alpha2_tilemap->mark_tile_dirty(offset); } @@ -1225,7 +1226,7 @@ { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset); + state->m_playfield_tilemap->mark_tile_dirty(offset); } WRITE32_HANDLER( atarigen_playfield32_w ) @@ -1233,16 +1234,16 @@ atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield32[offset]); if (ACCESSING_BITS_16_31) - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset * 2); + state->m_playfield_tilemap->mark_tile_dirty(offset * 2); if (ACCESSING_BITS_0_15) - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset * 2 + 1); + state->m_playfield_tilemap->mark_tile_dirty(offset * 2 + 1); } WRITE16_HANDLER( atarigen_playfield2_w ) { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield2[offset]); - tilemap_mark_tile_dirty(state->m_playfield2_tilemap, offset); + state->m_playfield2_tilemap->mark_tile_dirty(offset); } @@ -1256,7 +1257,7 @@ { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset / 2); + state->m_playfield_tilemap->mark_tile_dirty(offset / 2); } @@ -1270,7 +1271,7 @@ { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield_upper[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset); + state->m_playfield_tilemap->mark_tile_dirty(offset); } @@ -1284,8 +1285,8 @@ { atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield_upper[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset); - tilemap_mark_tile_dirty(state->m_playfield2_tilemap, offset); + state->m_playfield_tilemap->mark_tile_dirty(offset); + state->m_playfield2_tilemap->mark_tile_dirty(offset); } @@ -1301,7 +1302,7 @@ atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset); + state->m_playfield_tilemap->mark_tile_dirty(offset); if (state->m_playfield_latch != -1) state->m_playfield_upper[offset] = (state->m_playfield_upper[offset] & ~0x00ff) | (state->m_playfield_latch & 0x00ff); @@ -1320,7 +1321,7 @@ atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield[offset]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offset); + state->m_playfield_tilemap->mark_tile_dirty(offset); if (state->m_playfield_latch != -1) state->m_playfield_upper[offset] = (state->m_playfield_upper[offset] & ~0xff00) | (state->m_playfield_latch & 0xff00); @@ -1339,7 +1340,7 @@ atarigen_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_playfield2[offset]); - tilemap_mark_tile_dirty(state->m_playfield2_tilemap, offset); + state->m_playfield2_tilemap->mark_tile_dirty(offset); if (state->m_playfield2_latch != -1) state->m_playfield_upper[offset] = (state->m_playfield_upper[offset] & ~0xff00) | (state->m_playfield2_latch & 0xff00); diff -Nru mame-0.144/src/mame/machine/atari_vg.c mame-0.145/src/mame/machine/atari_vg.c --- mame-0.144/src/mame/machine/atari_vg.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/atari_vg.c 2012-02-06 21:30:43.000000000 +0000 @@ -7,66 +7,41 @@ #include "emu.h" #include "atari_vg.h" -#define EAROM_SIZE 0x40 +// device type definition +const device_type ATARIVGEAROM = &device_creator; -typedef struct _atari_vg_earom_state atari_vg_earom_state; -struct _atari_vg_earom_state -{ - device_t *device; - - int offset; - int data; - char rom[EAROM_SIZE]; - -}; - - -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ - -/*------------------------------------------------- - get_safe_token - convert a device's token - into a atari_vg_earom_state --------------------------------------------------*/ +//------------------------------------------------- +// atari_vg_earom_device - constructor +//------------------------------------------------- -INLINE atari_vg_earom_state *get_safe_token(device_t *device) +atari_vg_earom_device::atari_vg_earom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ATARIVGEAROM, "ATARI VG EAROM", tag, owner, clock), + device_nvram_interface(mconfig, *this) { - assert(device != NULL); - assert(device->type() == ATARIVGEAROM); - return (atari_vg_earom_state *)downcast(device)->token(); } - - -READ8_DEVICE_HANDLER( atari_vg_earom_r ) +READ8_MEMBER( atari_vg_earom_device::read ) { - atari_vg_earom_state *earom = get_safe_token(device); - - logerror("read earom: %02x(%02x):%02x\n", earom->offset, offset, earom->data); - return (earom->data); + logerror("read earom: %02x(%02x):%02x\n", m_offset, offset, m_data); + return (m_data); } -WRITE8_DEVICE_HANDLER( atari_vg_earom_w ) +WRITE8_MEMBER( atari_vg_earom_device::write ) { - atari_vg_earom_state *earom = get_safe_token(device); - logerror("write earom: %02x:%02x\n", offset, data); - earom->offset = offset; - earom->data = data; + m_offset = offset; + m_data = data; } /* 0,8 and 14 get written to this location, too. * Don't know what they do exactly */ -WRITE8_DEVICE_HANDLER( atari_vg_earom_ctrl_w ) +WRITE8_MEMBER( atari_vg_earom_device::ctrl_w ) { - atari_vg_earom_state *earom = get_safe_token(device); - logerror("earom ctrl: %02x:%02x\n",offset, data); /* 0x01 = clock @@ -76,82 +51,64 @@ */ if (data & 0x01) { - earom->data = earom->rom[earom->offset]; -//printf("Read %02X = %02X\n", earom->offset, earom->data); + m_data = m_rom[m_offset]; +//printf("Read %02X = %02X\n", m_offset, m_data); } if ((data & 0x0c) == 0x0c) { - earom->rom[earom->offset]=earom->data; - logerror(" written %02x:%02x\n", earom->offset, earom->data); -//printf("Write %02X = %02X\n", earom->offset, earom->data); + m_rom[m_offset]=m_data; + logerror(" written %02x:%02x\n", m_offset, m_data); +//printf("Write %02X = %02X\n", m_offset, m_data); } } +//------------------------------------------------- +// nvram_default - called to initialize NVRAM to +// its default state +//------------------------------------------------- -static DEVICE_NVRAM( atari_vg_earom ) +void atari_vg_earom_device::nvram_default() { - atari_vg_earom_state *earom = get_safe_token(device); - - if (read_or_write) - file->write(earom->rom,EAROM_SIZE); - else if (file) - file->read(earom->rom,EAROM_SIZE); - else - memset(earom,0,EAROM_SIZE); + memset(m_rom,0,EAROM_SIZE); } +//------------------------------------------------- +// nvram_read - called to read NVRAM from the +// .nv file +//------------------------------------------------- -/*************************************************************************** - DEVICE INTERFACE -***************************************************************************/ - -static DEVICE_START( atari_vg_earom ) +void atari_vg_earom_device::nvram_read(emu_file &file) { - atari_vg_earom_state *earom = get_safe_token(device); - - /* validate arguments */ - assert(device != NULL); - - /* set static values */ - earom->device = device; - - /* register for save states */ - device->save_item(NAME(earom->offset)); - device->save_item(NAME(earom->data)); + file.read(m_rom,EAROM_SIZE); } +//------------------------------------------------- +// nvram_write - called to write NVRAM to the +// .nv file +//------------------------------------------------- -static DEVICE_RESET( atari_vg_earom ) +void atari_vg_earom_device::nvram_write(emu_file &file) { - atari_vg_earom_state *earom = get_safe_token(device); + file.write(m_rom,EAROM_SIZE); +} - earom->data = 0; - earom->offset = 0; +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- +void atari_vg_earom_device::device_start() +{ + /* register for save states */ + save_item(NAME(m_offset)); + save_item(NAME(m_data)); } +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- -DEVICE_GET_INFO( atari_vg_earom ) +void atari_vg_earom_device::device_reset() { - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(atari_vg_earom_state); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(atari_vg_earom);break; - case DEVINFO_FCT_NVRAM: info->nvram = DEVICE_NVRAM_NAME(atari_vg_earom); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(atari_vg_earom);break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "atari_vg_earom"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "EEPROM"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break; - } + m_data = 0; + m_offset = 0; } - -DEFINE_LEGACY_NVRAM_DEVICE(ATARIVGEAROM, atari_vg_earom); diff -Nru mame-0.144/src/mame/machine/atari_vg.h mame-0.145/src/mame/machine/atari_vg.h --- mame-0.144/src/mame/machine/atari_vg.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/atari_vg.h 2012-02-06 21:30:43.000000000 +0000 @@ -4,8 +4,8 @@ ***************************************************************************/ -#include "devlegcy.h" - +#ifndef __ATARIVGEAROM_H__ +#define __ATARIVGEAROM_H__ /*************************************************************************** DEVICE CONFIGURATION MACROS @@ -15,14 +15,36 @@ MCFG_DEVICE_ADD(_tag, ATARIVGEAROM, 0) -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +#define EAROM_SIZE 0x40 + +// ======================> atari_vg_earom_device -READ8_DEVICE_HANDLER( atari_vg_earom_r ); -WRITE8_DEVICE_HANDLER( atari_vg_earom_w ); -WRITE8_DEVICE_HANDLER( atari_vg_earom_ctrl_w ); +class atari_vg_earom_device : public device_t, + public device_nvram_interface +{ +public: + // construction/destruction + atari_vg_earom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // device_nvram_interface overrides + virtual void nvram_default(); + virtual void nvram_read(emu_file &file); + virtual void nvram_write(emu_file &file); +public: + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + DECLARE_WRITE8_MEMBER( ctrl_w ); +private: + int m_offset; + int m_data; + char m_rom[EAROM_SIZE]; +}; -/* ----- device interface ----- */ +// device type definition +extern const device_type ATARIVGEAROM; -DECLARE_LEGACY_NVRAM_DEVICE(ATARIVGEAROM, atari_vg_earom); +#endif diff -Nru mame-0.144/src/mame/machine/cdi070.c mame-0.145/src/mame/machine/cdi070.c --- mame-0.144/src/mame/machine/cdi070.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/cdi070.c 2012-02-06 21:30:43.000000000 +0000 @@ -216,9 +216,9 @@ static void quizard_calculate_state(running_machine &machine, scc68070_regs_t *scc68070) { - const UINT16 desired_bitfield = mcu_value; + //const UINT16 desired_bitfield = mcu_value; const UINT16 field0 = 0x00ff; - const UINT16 field1 = desired_bitfield ^ field0; + const UINT16 field1 = mcu_value ^ 0x00ff; UINT16 total0 = 0; UINT16 total1 = 0; @@ -275,7 +275,7 @@ static UINT8 rx_ptr = 0xff; UINT8 tx = scc68070->uart.transmit_holding_register; - //printf("T: %02x ", tx ); + //printf("%02x ", tx ); if((tx >= 0x20 && tx < 0x7f) || tx == 0x0d || tx == 0x0a) { //printf("%c ", tx); @@ -325,9 +325,18 @@ break; case 2: // Receiving the seed acknowledge + case 4: if(tx == mcu_ack) { - state = 0; + if(state == 2) + { + state = 4; + } + else + { + state = 0; + } + //printf("Sending seed ack\n"); scc68070_uart_rx(machine, scc68070, 0x5a); scc68070_uart_rx(machine, scc68070, g_state[0]); scc68070_uart_rx(machine, scc68070, g_state[1]); @@ -345,17 +354,17 @@ rx_ptr++; if(tx == 0x0a) { - rx[rx_ptr] = 0; - //printf("Database path: %s\n", rx); - scc68070_uart_rx(machine, scc68070, 0x5a); - scc68070_uart_rx(machine, scc68070, g_state[0]); - scc68070_uart_rx(machine, scc68070, g_state[1]); - scc68070_uart_rx(machine, scc68070, g_state[2]); - scc68070_uart_rx(machine, scc68070, g_state[3]); - scc68070_uart_rx(machine, scc68070, g_state[4]); - scc68070_uart_rx(machine, scc68070, g_state[5]); - scc68070_uart_rx(machine, scc68070, g_state[6]); - scc68070_uart_rx(machine, scc68070, g_state[7]); + /*rx[rx_ptr] = 0; + //printf("Database path: %s\n", rx); + scc68070_uart_rx(machine, scc68070, 0x5a); + scc68070_uart_rx(machine, scc68070, g_state[0]); + scc68070_uart_rx(machine, scc68070, g_state[1]); + scc68070_uart_rx(machine, scc68070, g_state[2]); + scc68070_uart_rx(machine, scc68070, g_state[3]); + scc68070_uart_rx(machine, scc68070, g_state[4]); + scc68070_uart_rx(machine, scc68070, g_state[5]); + scc68070_uart_rx(machine, scc68070, g_state[6]); + scc68070_uart_rx(machine, scc68070, g_state[7]);*/ state = 0; } break; diff -Nru mame-0.144/src/mame/machine/dc.c mame-0.145/src/mame/machine/dc.c --- mame-0.144/src/mame/machine/dc.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/dc.c 2012-02-06 21:30:42.000000000 +0000 @@ -20,8 +20,6 @@ #define DEBUG_AICA_DMA (0) #define DEBUG_PVRCTRL (0) -static UINT8 mp_mux_data; - #if DEBUG_SYSCTRL static const char *const sysctrl_names[] = { @@ -78,80 +76,65 @@ #endif -UINT32 dc_sysctrl_regs[0x200/4]; -static UINT32 dc_rtcregister[4]; -UINT32 g1bus_regs[0x100/4]; -static UINT32 g2bus_regs[0x100/4]; -static emu_timer *dc_rtc_timer; - -static struct { - UINT32 aica_addr; - UINT32 root_addr; - UINT32 size; - UINT8 dir; - UINT8 flag; - UINT8 indirect; - UINT8 start; - UINT8 sel; -}wave_dma; - -static struct { - UINT32 pvr_addr; - UINT32 sys_addr; - UINT32 size; - UINT8 sel; - UINT8 dir; - UINT8 flag; - UINT8 start; -}pvr_dma; - static TIMER_CALLBACK( aica_dma_irq ) { - wave_dma.start = g2bus_regs[SB_ADST] = 0; - dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_AICA; + dc_state *state = machine.driver_data(); + + state->m_wave_dma.start = state->g2bus_regs[SB_ADST] = 0; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_AICA; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( pvr_dma_irq ) { - pvr_dma.start = pvrctrl_regs[SB_PDST] = 0; - dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_PVR; + dc_state *state = machine.driver_data(); + + state->m_pvr_dma.start = state->pvrctrl_regs[SB_PDST] = 0; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_PVR; dc_update_interrupt_status(machine); } void naomi_g1_irq(running_machine &machine) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_GDROM; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_GDROM; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( ch2_dma_irq ) { - dc_sysctrl_regs[SB_C2DLEN]=0; - dc_sysctrl_regs[SB_C2DST]=0; - dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_CH2; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_C2DLEN]=0; + state->dc_sysctrl_regs[SB_C2DST]=0; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_CH2; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( yuv_fifo_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV; dc_update_interrupt_status(machine); } static void wave_dma_execute(address_space *space) { + dc_state *state = space->machine().driver_data(); + UINT32 src,dst,size; - dst = wave_dma.aica_addr; - src = wave_dma.root_addr; + dst = state->m_wave_dma.aica_addr; + src = state->m_wave_dma.root_addr; size = 0; /* 0 rounding size = 32 Mbytes */ - if(wave_dma.size == 0) { wave_dma.size = 0x200000; } + if(state->m_wave_dma.size == 0) { state->m_wave_dma.size = 0x200000; } - if(wave_dma.dir == 0) + if(state->m_wave_dma.dir == 0) { - for(;sizem_wave_dma.size;size+=4) { space->write_dword(dst,space->read_dword(src)); src+=4; @@ -160,7 +143,7 @@ } else { - for(;sizem_wave_dma.size;size+=4) { space->write_dword(src,space->read_dword(dst)); src+=4; @@ -169,10 +152,10 @@ } /* update the params*/ - wave_dma.aica_addr = g2bus_regs[SB_ADSTAG] = dst; - wave_dma.root_addr = g2bus_regs[SB_ADSTAR] = src; - wave_dma.size = g2bus_regs[SB_ADLEN] = 0; - wave_dma.flag = (wave_dma.indirect & 1) ? 1 : 0; + state->m_wave_dma.aica_addr = state->g2bus_regs[SB_ADSTAG] = dst; + state->m_wave_dma.root_addr = state->g2bus_regs[SB_ADSTAR] = src; + state->m_wave_dma.size = state->g2bus_regs[SB_ADLEN] = 0; + state->m_wave_dma.flag = (state->m_wave_dma.indirect & 1) ? 1 : 0; /* Note: if you trigger an instant DMA IRQ trigger, sfz3upper doesn't play any bgm. */ /* TODO: timing of this */ space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(aica_dma_irq)); @@ -180,22 +163,24 @@ static void pvr_dma_execute(address_space *space) { + dc_state *state = space->machine().driver_data(); + UINT32 src,dst,size; - dst = pvr_dma.pvr_addr; - src = pvr_dma.sys_addr; + dst = state->m_pvr_dma.pvr_addr; + src = state->m_pvr_dma.sys_addr; size = 0; /* used so far by usagui and sprtjam*/ //printf("PVR-DMA start\n"); - //printf("%08x %08x %08x\n",pvr_dma.pvr_addr,pvr_dma.sys_addr,pvr_dma.size); - //printf("src %s dst %08x\n",pvr_dma.dir ? "->" : "<-",pvr_dma.sel); + //printf("%08x %08x %08x\n",state->m_pvr_dma.pvr_addr,state->m_pvr_dma.sys_addr,state->m_pvr_dma.size); + //printf("src %s dst %08x\n",state->m_pvr_dma.dir ? "->" : "<-",state->m_pvr_dma.sel); /* 0 rounding size = 16 Mbytes */ - if(pvr_dma.size == 0) { pvr_dma.size = 0x100000; } + if(state->m_pvr_dma.size == 0) { state->m_pvr_dma.size = 0x100000; } - if(pvr_dma.dir == 0) + if(state->m_pvr_dma.dir == 0) { - for(;sizem_pvr_dma.size;size+=4) { space->write_dword(dst,space->read_dword(src)); src+=4; @@ -204,7 +189,7 @@ } else { - for(;sizem_pvr_dma.size;size+=4) { space->write_dword(src,space->read_dword(dst)); src+=4; @@ -267,27 +252,28 @@ int dc_compute_interrupt_level(running_machine &machine) { + dc_state *state = machine.driver_data(); UINT32 ln,lx,le; - ln=dc_sysctrl_regs[SB_ISTNRM] & dc_sysctrl_regs[SB_IML6NRM]; - lx=dc_sysctrl_regs[SB_ISTEXT] & dc_sysctrl_regs[SB_IML6EXT]; - le=dc_sysctrl_regs[SB_ISTERR] & dc_sysctrl_regs[SB_IML6ERR]; + ln=state->dc_sysctrl_regs[SB_ISTNRM] & state->dc_sysctrl_regs[SB_IML6NRM]; + lx=state->dc_sysctrl_regs[SB_ISTEXT] & state->dc_sysctrl_regs[SB_IML6EXT]; + le=state->dc_sysctrl_regs[SB_ISTERR] & state->dc_sysctrl_regs[SB_IML6ERR]; if (ln | lx | le) { return 6; } - ln=dc_sysctrl_regs[SB_ISTNRM] & dc_sysctrl_regs[SB_IML4NRM]; - lx=dc_sysctrl_regs[SB_ISTEXT] & dc_sysctrl_regs[SB_IML4EXT]; - le=dc_sysctrl_regs[SB_ISTERR] & dc_sysctrl_regs[SB_IML4ERR]; + ln=state->dc_sysctrl_regs[SB_ISTNRM] & state->dc_sysctrl_regs[SB_IML4NRM]; + lx=state->dc_sysctrl_regs[SB_ISTEXT] & state->dc_sysctrl_regs[SB_IML4EXT]; + le=state->dc_sysctrl_regs[SB_ISTERR] & state->dc_sysctrl_regs[SB_IML4ERR]; if (ln | lx | le) { return 4; } - ln=dc_sysctrl_regs[SB_ISTNRM] & dc_sysctrl_regs[SB_IML2NRM]; - lx=dc_sysctrl_regs[SB_ISTEXT] & dc_sysctrl_regs[SB_IML2EXT]; - le=dc_sysctrl_regs[SB_ISTERR] & dc_sysctrl_regs[SB_IML2ERR]; + ln=state->dc_sysctrl_regs[SB_ISTNRM] & state->dc_sysctrl_regs[SB_IML2NRM]; + lx=state->dc_sysctrl_regs[SB_ISTEXT] & state->dc_sysctrl_regs[SB_IML2EXT]; + le=state->dc_sysctrl_regs[SB_ISTERR] & state->dc_sysctrl_regs[SB_IML2ERR]; if (ln | lx | le) { return 2; @@ -298,33 +284,34 @@ void dc_update_interrupt_status(running_machine &machine) { + dc_state *state = machine.driver_data(); int level; - if (dc_sysctrl_regs[SB_ISTERR]) + if (state->dc_sysctrl_regs[SB_ISTERR]) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_ERROR; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_ERROR; } else { - dc_sysctrl_regs[SB_ISTNRM] &= ~IST_ERROR; + state->dc_sysctrl_regs[SB_ISTNRM] &= ~IST_ERROR; } - if (dc_sysctrl_regs[SB_ISTEXT]) + if (state->dc_sysctrl_regs[SB_ISTEXT]) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_G1G2EXTSTAT; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_G1G2EXTSTAT; } else { - dc_sysctrl_regs[SB_ISTNRM] &= ~IST_G1G2EXTSTAT; + state->dc_sysctrl_regs[SB_ISTNRM] &= ~IST_G1G2EXTSTAT; } level=dc_compute_interrupt_level(machine); sh4_set_irln_input(machine.device("maincpu"), 15-level); /* Wave DMA HW trigger */ - if(wave_dma.flag && ((wave_dma.sel & 2) == 2)) + if(state->m_wave_dma.flag && ((state->m_wave_dma.sel & 2) == 2)) { - if((dc_sysctrl_regs[SB_G2DTNRM] & dc_sysctrl_regs[SB_ISTNRM]) || (dc_sysctrl_regs[SB_G2DTEXT] & dc_sysctrl_regs[SB_ISTEXT])) + if((state->dc_sysctrl_regs[SB_G2DTNRM] & state->dc_sysctrl_regs[SB_ISTNRM]) || (state->dc_sysctrl_regs[SB_G2DTEXT] & state->dc_sysctrl_regs[SB_ISTEXT])) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); @@ -334,9 +321,9 @@ } /* PVR-DMA HW trigger */ - if(pvr_dma.flag && ((pvr_dma.sel & 1) == 1)) + if(state->m_pvr_dma.flag && ((state->m_pvr_dma.sel & 1) == 1)) { - if((dc_sysctrl_regs[SB_PDTNRM] & dc_sysctrl_regs[SB_ISTNRM]) || (dc_sysctrl_regs[SB_PDTEXT] & dc_sysctrl_regs[SB_ISTEXT])) + if((state->dc_sysctrl_regs[SB_PDTNRM] & state->dc_sysctrl_regs[SB_ISTNRM]) || (state->dc_sysctrl_regs[SB_PDTEXT] & state->dc_sysctrl_regs[SB_ISTEXT])) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); @@ -348,6 +335,8 @@ READ64_HANDLER( dc_sysctrl_r ) { + dc_state *state = space->machine().driver_data(); + int reg; UINT64 shift; @@ -356,15 +345,17 @@ #if DEBUG_SYSCTRL if ((reg != 0x40) && (reg != 0x41) && (reg != 0x42) && (reg != 0x23) && (reg > 2)) // filter out IRQ status reads { - mame_printf_verbose("SYSCTRL: [%08x] read %x @ %x (reg %x: %s), mask %" I64FMT "x (PC=%x)\n", 0x5f6800+reg*4, dc_sysctrl_regs[reg], offset, reg, sysctrl_names[reg], mem_mask, cpu_get_pc(&space->device())); + mame_printf_verbose("SYSCTRL: [%08x] read %x @ %x (reg %x: %s), mask %" I64FMT "x (PC=%x)\n", 0x5f6800+reg*4, state->dc_sysctrl_regs[reg], offset, reg, sysctrl_names[reg], mem_mask, cpu_get_pc(&space->device())); } #endif - return (UINT64)dc_sysctrl_regs[reg] << shift; + return (UINT64)state->dc_sysctrl_regs[reg] << shift; } WRITE64_HANDLER( dc_sysctrl_w ) { + dc_state *state = space->machine().driver_data(); + int reg; UINT64 shift; UINT32 old,dat; @@ -373,23 +364,23 @@ reg = decode_reg32_64(space->machine(), offset, mem_mask, &shift); dat = (UINT32)(data >> shift); - old = dc_sysctrl_regs[reg]; - dc_sysctrl_regs[reg] = dat; // 5f6800+off*4=dat + old = state->dc_sysctrl_regs[reg]; + state->dc_sysctrl_regs[reg] = dat; // 5f6800+off*4=dat switch (reg) { case SB_C2DST: if(((old & 1) == 0) && (dat & 1)) // 0 -> 1 { - address=(dc_sysctrl_regs[SB_C2DSTAT] & 0x03ffffe0) | 0x10000000; - if(dc_sysctrl_regs[SB_C2DSTAT] & 0x1f) - printf("C2DSTAT just used to reserved bits %02x\n",dc_sysctrl_regs[SB_C2DSTAT] & 0x1f); + address=(state->dc_sysctrl_regs[SB_C2DSTAT] & 0x03ffffe0) | 0x10000000; + if(state->dc_sysctrl_regs[SB_C2DSTAT] & 0x1f) + printf("C2DSTAT just used to reserved bits %02x\n",state->dc_sysctrl_regs[SB_C2DSTAT] & 0x1f); ddtdata.destination=address; /* 0 rounding size = 16 Mbytes */ - if(dc_sysctrl_regs[SB_C2DLEN] == 0) + if(state->dc_sysctrl_regs[SB_C2DLEN] == 0) ddtdata.length = 0x1000000; else - ddtdata.length = dc_sysctrl_regs[SB_C2DLEN]; + ddtdata.length = state->dc_sysctrl_regs[SB_C2DLEN]; ddtdata.size=1; ddtdata.direction=0; ddtdata.channel=2; @@ -397,27 +388,27 @@ sh4_dma_ddt(space->machine().device("maincpu"),&ddtdata); #if DEBUG_SYSCTRL if ((address >= 0x11000000) && (address <= 0x11FFFFFF)) - if (dc_sysctrl_regs[SB_LMMODE0]) - printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1 + if (state->dc_sysctrl_regs[SB_LMMODE0]) + printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); // 1 else - mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0 + mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); // 0 else if ((address >= 0x13000000) && (address <= 0x13FFFFFF)) - if (dc_sysctrl_regs[SB_LMMODE1]) - printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 1 + if (state->dc_sysctrl_regs[SB_LMMODE1]) + printf("SYSCTRL: Ch2 direct display lists dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); // 1 else - mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); // 0 + mame_printf_verbose("SYSCTRL: Ch2 direct textures dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); // 0 else if ((address >= 0x10800000) && (address <= 0x10ffffff)) - printf("SYSCTRL: Ch2 YUV dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); + printf("SYSCTRL: Ch2 YUV dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); else if ((address >= 0x10000000) && (address <= 0x107fffff)) - mame_printf_verbose("SYSCTRL: Ch2 TA Display List dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); + mame_printf_verbose("SYSCTRL: Ch2 TA Display List dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); else - mame_printf_verbose("SYSCTRL: Ch2 unknown dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, dc_sysctrl_regs[SB_C2DSTAT],dc_sysctrl_regs[SB_LMMODE0],dc_sysctrl_regs[SB_LMMODE1]); + mame_printf_verbose("SYSCTRL: Ch2 unknown dma %x from %08x to %08x (lmmode0=%d lmmode1=%d)\n", state->dc_sysctrl_regs[SB_C2DLEN], ddtdata.source-ddtdata.length, state->dc_sysctrl_regs[SB_C2DSTAT],state->dc_sysctrl_regs[SB_LMMODE0],state->dc_sysctrl_regs[SB_LMMODE1]); #endif if ((!(address & 0x01000000))) - dc_sysctrl_regs[SB_C2DSTAT]=address; + state->dc_sysctrl_regs[SB_C2DSTAT]=address; else //direct texture path - dc_sysctrl_regs[SB_C2DSTAT]=address+ddtdata.length; + state->dc_sysctrl_regs[SB_C2DSTAT]=address+ddtdata.length; /* 200 usecs breaks sfz3upper */ space->machine().scheduler().timer_set(attotime::from_usec(50), FUNC(ch2_dma_irq)); @@ -428,17 +419,17 @@ break; case SB_ISTNRM: - dc_sysctrl_regs[SB_ISTNRM] = old & ~(dat | 0xC0000000); // bits 31,30 ro + state->dc_sysctrl_regs[SB_ISTNRM] = old & ~(dat | 0xC0000000); // bits 31,30 ro dc_update_interrupt_status(space->machine()); break; case SB_ISTEXT: - dc_sysctrl_regs[SB_ISTEXT] = old; + state->dc_sysctrl_regs[SB_ISTEXT] = old; dc_update_interrupt_status(space->machine()); break; case SB_ISTERR: - dc_sysctrl_regs[SB_ISTERR] = old & ~dat; + state->dc_sysctrl_regs[SB_ISTERR] = old & ~dat; dc_update_interrupt_status(space->machine()); break; case SB_SDST: @@ -447,8 +438,8 @@ // TODO: Sort-DMA routine goes here printf("Sort-DMA irq\n"); - dc_sysctrl_regs[SB_SDST] = 0; - dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_SORT; + state->dc_sysctrl_regs[SB_SDST] = 0; + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_SORT; dc_update_interrupt_status(space->machine()); } break; @@ -464,6 +455,8 @@ READ64_HANDLER( dc_gdrom_r ) { +// dc_state *state = space->machine().driver_data(); + UINT32 off; if ((int)~mem_mask & 1) @@ -485,6 +478,7 @@ WRITE64_HANDLER( dc_gdrom_w ) { +// dc_state *state = space->machine().driver_data(); UINT32 dat,off; if ((int)~mem_mask & 1) @@ -503,16 +497,18 @@ READ64_HANDLER( dc_g2_ctrl_r ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; reg = decode_reg32_64(space->machine(), offset, mem_mask, &shift); mame_printf_verbose("G2CTRL: Unmapped read %08x\n", 0x5f7800+reg*4); - return (UINT64)g2bus_regs[reg] << shift; + return (UINT64)state->g2bus_regs[reg] << shift; } WRITE64_HANDLER( dc_g2_ctrl_w ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; UINT32 dat; @@ -521,41 +517,41 @@ reg = decode_reg32_64(space->machine(), offset, mem_mask, &shift); dat = (UINT32)(data >> shift); - g2bus_regs[reg] = dat; // 5f7800+reg*4=dat + state->g2bus_regs[reg] = dat; // 5f7800+reg*4=dat switch (reg) { /*AICA Address register*/ - case SB_ADSTAG: wave_dma.aica_addr = dat; break; + case SB_ADSTAG: state->m_wave_dma.aica_addr = dat; break; /*Root address (work ram)*/ - case SB_ADSTAR: wave_dma.root_addr = dat; break; + case SB_ADSTAR: state->m_wave_dma.root_addr = dat; break; /*DMA size (in dword units, bit 31 is "set dma initiation enable setting to 0"*/ case SB_ADLEN: - wave_dma.size = dat & 0x7fffffff; - wave_dma.indirect = (dat & 0x80000000)>>31; + state->m_wave_dma.size = dat & 0x7fffffff; + state->m_wave_dma.indirect = (dat & 0x80000000)>>31; break; /*0 = root memory to aica / 1 = aica to root memory*/ - case SB_ADDIR: wave_dma.dir = (dat & 1); break; + case SB_ADDIR: state->m_wave_dma.dir = (dat & 1); break; /*dma flag (active HIGH, bug in docs)*/ - case SB_ADEN: wave_dma.flag = (dat & 1); break; + case SB_ADEN: state->m_wave_dma.flag = (dat & 1); break; /* SB_ADTSEL bit 1: (0) Wave DMA through SB_ADST flag (1) Wave DMA through irq trigger, defined by SB_G2DTNRM / SB_G2DTEXT */ - case SB_ADTSEL: wave_dma.sel = dat & 7; break; + case SB_ADTSEL: state->m_wave_dma.sel = dat & 7; break; /*ready for dma'ing*/ case SB_ADST: - old = wave_dma.start & 1; - wave_dma.start = dat & 1; + old = state->m_wave_dma.start & 1; + state->m_wave_dma.start = dat & 1; #if DEBUG_AICA_DMA printf("AICA: G2-DMA start \n"); - printf("DST %08x SRC %08x SIZE %08x IND %02x\n",wave_dma.aica_addr,wave_dma.root_addr,wave_dma.size,wave_dma.indirect); - printf("SEL %08x ST %08x FLAG %08x DIR %02x\n",wave_dma.sel,wave_dma.start,wave_dma.flag,wave_dma.dir); + printf("DST %08x SRC %08x SIZE %08x IND %02x\n",state->m_wave_dma.aica_addr,state->m_wave_dma.root_addr,state->m_wave_dma.size,state->m_wave_dma.indirect); + printf("SEL %08x ST %08x FLAG %08x DIR %02x\n",state->m_wave_dma.sel,state->m_wave_dma.start,state->m_wave_dma.flag,state->m_wave_dma.dir); #endif //mame_printf_verbose("SB_ADST data %08x\n",dat); - if(((old & 1) == 0) && wave_dma.flag && wave_dma.start && ((wave_dma.sel & 2) == 0)) // 0 -> 1 + if(((old & 1) == 0) && state->m_wave_dma.flag && state->m_wave_dma.start && ((state->m_wave_dma.sel & 2) == 0)) // 0 -> 1 wave_dma_execute(space); break; @@ -604,20 +600,22 @@ READ64_HANDLER( pvr_ctrl_r ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; reg = decode_reg_64(offset, mem_mask, &shift); #if DEBUG_PVRCTRL - mame_printf_verbose("PVRCTRL: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f7c00+reg*4, pvrctrl_regs[reg], offset, reg, mem_mask, cpu_get_pc(&space->device())); + mame_printf_verbose("PVRCTRL: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f7c00+reg*4, state->pvrctrl_regs[reg], offset, reg, mem_mask, cpu_get_pc(&space->device())); #endif - return (UINT64)pvrctrl_regs[reg] << shift; + return (UINT64)state->pvrctrl_regs[reg] << shift; } WRITE64_HANDLER( pvr_ctrl_w ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; UINT32 dat; @@ -628,21 +626,21 @@ switch (reg) { - case SB_PDSTAP: pvr_dma.pvr_addr = dat; break; - case SB_PDSTAR: pvr_dma.sys_addr = dat; break; - case SB_PDLEN: pvr_dma.size = dat; break; - case SB_PDDIR: pvr_dma.dir = dat & 1; break; + case SB_PDSTAP: state->m_pvr_dma.pvr_addr = dat; break; + case SB_PDSTAR: state->m_pvr_dma.sys_addr = dat; break; + case SB_PDLEN: state->m_pvr_dma.size = dat; break; + case SB_PDDIR: state->m_pvr_dma.dir = dat & 1; break; case SB_PDTSEL: - pvr_dma.sel = dat & 1; - //if(pvr_dma.sel & 1) + state->m_pvr_dma.sel = dat & 1; + //if(state->m_pvr_dma.sel & 1) // printf("Warning: Unsupported irq mode trigger PVR-DMA\n"); break; - case SB_PDEN: pvr_dma.flag = dat & 1; break; + case SB_PDEN: state->m_pvr_dma.flag = dat & 1; break; case SB_PDST: - old = pvr_dma.start & 1; - pvr_dma.start = dat & 1; + old = state->m_pvr_dma.start & 1; + state->m_pvr_dma.start = dat & 1; - if(((old & 1) == 0) && pvr_dma.flag && pvr_dma.start && ((pvr_dma.sel & 1) == 0)) // 0 -> 1 + if(((old & 1) == 0) && state->m_pvr_dma.flag && state->m_pvr_dma.start && ((state->m_pvr_dma.sel & 1) == 0)) // 0 -> 1 pvr_dma_execute(space); break; } @@ -651,13 +649,14 @@ mame_printf_verbose("PVRCTRL: [%08x=%x] write %" I64FMT "x to %x (reg %x), mask %" I64FMT "x\n", 0x5f7c00+reg*4, dat, data>>shift, offset, reg, mem_mask); #endif -// pvrctrl_regs[reg] |= dat; - pvrctrl_regs[reg] = dat; +// state->pvrctrl_regs[reg] |= dat; + state->pvrctrl_regs[reg] = dat; } READ64_HANDLER( dc_modem_r ) { +// dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; @@ -676,6 +675,7 @@ WRITE64_HANDLER( dc_modem_w ) { +// dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; UINT32 dat; @@ -687,41 +687,43 @@ READ64_HANDLER( dc_rtc_r ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; reg = decode_reg3216_64(space->machine(), offset, mem_mask, &shift); mame_printf_verbose("RTC: Unmapped read %08x\n", 0x710000+reg*4); - return (UINT64)dc_rtcregister[reg] << shift; + return (UINT64)state->dc_rtcregister[reg] << shift; } WRITE64_HANDLER( dc_rtc_w ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; UINT32 old,dat; reg = decode_reg3216_64(space->machine(), offset, mem_mask, &shift); dat = (UINT32)(data >> shift); - old = dc_rtcregister[reg]; - dc_rtcregister[reg] = dat & 0xFFFF; // 5f6c00+off*4=dat + old = state->dc_rtcregister[reg]; + state->dc_rtcregister[reg] = dat & 0xFFFF; // 5f6c00+off*4=dat switch (reg) { case RTC1: - if (dc_rtcregister[RTC3]) - dc_rtcregister[RTC3] = 0; + if (state->dc_rtcregister[RTC3]) + state->dc_rtcregister[RTC3] = 0; else - dc_rtcregister[reg] = old; + state->dc_rtcregister[reg] = old; break; case RTC2: - if (dc_rtcregister[RTC3] == 0) - dc_rtcregister[reg] = old; + if (state->dc_rtcregister[RTC3] == 0) + state->dc_rtcregister[reg] = old; else - dc_rtc_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); + state->dc_rtc_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); break; case RTC3: - dc_rtcregister[RTC3] &= 1; + state->dc_rtcregister[RTC3] &= 1; break; } mame_printf_verbose("RTC: [%08x=%x] write %" I64FMT "x to %x, mask %" I64FMT "x\n", 0x710000 + reg*4, dat, data, offset, mem_mask); @@ -729,21 +731,24 @@ static TIMER_CALLBACK(dc_rtc_increment) { - dc_rtcregister[RTC2] = (dc_rtcregister[RTC2] + 1) & 0xFFFF; - if (dc_rtcregister[RTC2] == 0) - dc_rtcregister[RTC1] = (dc_rtcregister[RTC1] + 1) & 0xFFFF; + dc_state *state = machine.driver_data(); + + state->dc_rtcregister[RTC2] = (state->dc_rtcregister[RTC2] + 1) & 0xFFFF; + if (state->dc_rtcregister[RTC2] == 0) + state->dc_rtcregister[RTC1] = (state->dc_rtcregister[RTC1] + 1) & 0xFFFF; } /* fill the RTC registers with the proper start-up values */ static void rtc_initial_setup(running_machine &machine) { + dc_state *state = machine.driver_data(); static UINT32 current_time; static int year_count,cur_year,i; static const int month_to_day_conversion[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; system_time systime; machine.base_datetime(systime); - memset(dc_rtcregister, 0, sizeof(dc_rtcregister)); + memset(state->dc_rtcregister, 0, sizeof(state->dc_rtcregister)); /* put the seconds */ current_time = systime.local_time.second; @@ -768,33 +773,63 @@ for(i=0;i> 16; + state->dc_rtcregister[RTC2] = current_time & 0x0000ffff; + state->dc_rtcregister[RTC1] = (current_time & 0xffff0000) >> 16; - dc_rtc_timer = machine.scheduler().timer_alloc(FUNC(dc_rtc_increment)); + state->dc_rtc_timer = machine.scheduler().timer_alloc(FUNC(dc_rtc_increment)); } MACHINE_START( dc ) { + dc_state *state = machine.driver_data(); + rtc_initial_setup(machine); + + // save states + state_save_register_global_pointer(machine, state->dc_rtcregister, 4); + state_save_register_global_pointer(machine, state->dc_sysctrl_regs, 0x200/4); + state_save_register_global_pointer(machine, state->g2bus_regs, 0x100/4); + state_save_register_global(machine, state->m_wave_dma.aica_addr); + state_save_register_global(machine, state->m_wave_dma.root_addr); + state_save_register_global(machine, state->m_wave_dma.size); + state_save_register_global(machine, state->m_wave_dma.dir); + state_save_register_global(machine, state->m_wave_dma.flag); + state_save_register_global(machine, state->m_wave_dma.indirect); + state_save_register_global(machine, state->m_wave_dma.start); + state_save_register_global(machine, state->m_wave_dma.sel); + state_save_register_global(machine, state->m_pvr_dma.pvr_addr); + state_save_register_global(machine, state->m_pvr_dma.sys_addr); + state_save_register_global(machine, state->m_pvr_dma.size); + state_save_register_global(machine, state->m_pvr_dma.sel); + state_save_register_global(machine, state->m_pvr_dma.dir); + state_save_register_global(machine, state->m_pvr_dma.flag); + state_save_register_global(machine, state->m_pvr_dma.start); + state_save_register_global_pointer(machine,state->pvrta_regs,0x2000/4); + state_save_register_global_pointer(machine,state->pvrctrl_regs,0x100/4); + state_save_register_global(machine, state->debug_dip_status); + state_save_register_global_pointer(machine,state->tafifo_buff,32); + state_save_register_global(machine, state->scanline); + state_save_register_global(machine, state->next_y); + state_save_register_global_pointer(machine,state->dc_sound_ram,sizeof(state->dc_sound_ram)); } MACHINE_RESET( dc ) { + dc_state *state = machine.driver_data(); + /* halt the ARM7 */ cputag_set_input_line(machine, "soundcpu", INPUT_LINE_RESET, ASSERT_LINE); - memset(dc_sysctrl_regs, 0, sizeof(dc_sysctrl_regs)); - - dc_rtc_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); + memset(state->dc_sysctrl_regs, 0, sizeof(state->dc_sysctrl_regs)); - dc_sysctrl_regs[SB_SBREV] = 0x0b; + state->dc_rtc_timer->adjust(attotime::zero, 0, attotime::from_seconds(1)); - mp_mux_data = 0; + state->dc_sysctrl_regs[SB_SBREV] = 0x0b; } READ64_DEVICE_HANDLER( dc_aica_reg_r ) { + // dc_state *state = device->machine().driver_data(); //int reg; UINT64 shift; @@ -807,6 +842,7 @@ WRITE64_DEVICE_HANDLER( dc_aica_reg_w ) { + // dc_state *state = device->machine().driver_data(); int reg; UINT64 shift; UINT32 dat; diff -Nru mame-0.144/src/mame/machine/decocass.c mame-0.145/src/mame/machine/decocass.c --- mame-0.144/src/mame/machine/decocass.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/decocass.c 2012-02-06 21:30:43.000000000 +0000 @@ -1620,7 +1620,7 @@ state->m_type3_swap = TYPE3_SWAP_13; } -MACHINE_RESET( cprosocc ) +MACHINE_RESET( cpsoccer ) { decocass_state *state = machine.driver_data(); decocass_reset_common(machine); diff -Nru mame-0.144/src/mame/machine/decocass.h mame-0.145/src/mame/machine/decocass.h --- mame-0.144/src/mame/machine/decocass.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/decocass.h 2012-02-06 21:30:43.000000000 +0000 @@ -162,7 +162,7 @@ MACHINE_RESET( cfghtice ); MACHINE_RESET( cprobowl ); MACHINE_RESET( cnightst ); -MACHINE_RESET( cprosocc ); +MACHINE_RESET( cpsoccer ); MACHINE_RESET( cppicf ); MACHINE_RESET( cscrtry ); MACHINE_RESET( cflyball ); @@ -201,6 +201,6 @@ WRITE8_HANDLER( decocass_center_v_shift_w ); VIDEO_START( decocass ); -SCREEN_UPDATE( decocass ); +SCREEN_UPDATE_IND16( decocass ); void decocass_video_state_save_init(running_machine &machine); diff -Nru mame-0.144/src/mame/machine/gaelco2.c mame-0.145/src/mame/machine/gaelco2.c --- mame-0.144/src/mame/machine/gaelco2.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/gaelco2.c 2012-02-06 21:30:43.000000000 +0000 @@ -8,7 +8,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "machine/eeprom.h" #include "includes/gaelco2.h" @@ -189,19 +188,18 @@ state->m_clr_gun_int = 1; } -INTERRUPT_GEN( bang_interrupt ) +TIMER_DEVICE_CALLBACK( bang_irq ) { - gaelco2_state *state = device->machine().driver_data(); - if (cpu_getiloops(device) == 0){ - device_set_input_line(device, 2, HOLD_LINE); + gaelco2_state *state = timer.machine().driver_data(); + int scanline = param; + if (scanline == 256){ + device_set_input_line(state->m_maincpu, 2, HOLD_LINE); state->m_clr_gun_int = 0; } - else if (cpu_getiloops(device) % 2){ - if (state->m_clr_gun_int){ - device_set_input_line(device, 4, HOLD_LINE); - } - } + + if ((scanline % 64) == 0 && state->m_clr_gun_int) + device_set_input_line(state->m_maincpu, 4, HOLD_LINE); } /*************************************************************************** diff -Nru mame-0.144/src/mame/machine/kaneko16.c mame-0.145/src/mame/machine/kaneko16.c --- mame-0.144/src/mame/machine/kaneko16.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/kaneko16.c 2012-02-06 21:30:43.000000000 +0000 @@ -120,7 +120,7 @@ { kaneko16_state *state = space->machine().driver_data(); calc1_hit_t &hit = state->m_hit; - int isbrap = ( !strcmp(space->machine().system().name,"brapboysj") || !strcmp(space->machine().system().name,"brapboys")); + int isbrap = ( !strcmp(space->machine().system().name,"brapboysj") || !strcmp(space->machine().system().name,"brapboysu") || !strcmp(space->machine().system().name,"brapboys")); /* our implementation is incomplete, b.rap boys requires some modifications */ if (isbrap) @@ -197,7 +197,7 @@ INT16 x_coll, y_coll; /* our implementation is incomplete, b.rap boys requires some modifications */ - int isbrap = ( !strcmp(space->machine().system().name,"brapboysj") || !strcmp(space->machine().system().name,"brapboys")); + int isbrap = ( !strcmp(space->machine().system().name,"brapboysj") || !strcmp(space->machine().system().name,"brapboysu") || !strcmp(space->machine().system().name,"brapboys")); if (isbrap) { diff -Nru mame-0.144/src/mame/machine/konppc.c mame-0.145/src/mame/machine/konppc.c --- mame-0.144/src/mame/machine/konppc.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/konppc.c 2012-02-06 21:30:43.000000000 +0000 @@ -535,41 +535,41 @@ #define LED_ON 0xff00ff00 -void draw_7segment_led(bitmap_t *bitmap, int x, int y, UINT8 value) +void draw_7segment_led(bitmap_rgb32 &bitmap, int x, int y, UINT8 value) { if ((value & 0x7f) == 0x7f) { return; } - plot_box(bitmap, x-1, y-1, 7, 11, 0x00000000); + bitmap.plot_box(x-1, y-1, 7, 11, 0x00000000); /* Top */ if( (value & 0x40) == 0 ) { - plot_box(bitmap, x+1, y+0, 3, 1, LED_ON); + bitmap.plot_box(x+1, y+0, 3, 1, LED_ON); } /* Middle */ if( (value & 0x01) == 0 ) { - plot_box(bitmap, x+1, y+4, 3, 1, LED_ON); + bitmap.plot_box(x+1, y+4, 3, 1, LED_ON); } /* Bottom */ if( (value & 0x08) == 0 ) { - plot_box(bitmap, x+1, y+8, 3, 1, LED_ON); + bitmap.plot_box(x+1, y+8, 3, 1, LED_ON); } /* Top Left */ if( (value & 0x02) == 0 ) { - plot_box(bitmap, x+0, y+1, 1, 3, LED_ON); + bitmap.plot_box(x+0, y+1, 1, 3, LED_ON); } /* Top Right */ if( (value & 0x20) == 0 ) { - plot_box(bitmap, x+4, y+1, 1, 3, LED_ON); + bitmap.plot_box(x+4, y+1, 1, 3, LED_ON); } /* Bottom Left */ if( (value & 0x04) == 0 ) { - plot_box(bitmap, x+0, y+5, 1, 3, LED_ON); + bitmap.plot_box(x+0, y+5, 1, 3, LED_ON); } /* Bottom Right */ if( (value & 0x10) == 0 ) { - plot_box(bitmap, x+4, y+5, 1, 3, LED_ON); + bitmap.plot_box(x+4, y+5, 1, 3, LED_ON); } } diff -Nru mame-0.144/src/mame/machine/konppc.h mame-0.145/src/mame/machine/konppc.h --- mame-0.144/src/mame/machine/konppc.h 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/konppc.h 2012-02-06 21:30:43.000000000 +0000 @@ -38,6 +38,6 @@ WRITE32_DEVICE_HANDLER(nwk_voodoo_0_w); WRITE32_DEVICE_HANDLER(nwk_voodoo_1_w); -void draw_7segment_led(bitmap_t *bitmap, int x, int y, UINT8 value); +void draw_7segment_led(bitmap_rgb32 &bitmap, int x, int y, UINT8 value); #endif diff -Nru mame-0.144/src/mame/machine/mcr.c mame-0.145/src/mame/machine/mcr.c --- mame-0.144/src/mame/machine/mcr.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/mcr.c 2012-02-06 21:30:42.000000000 +0000 @@ -5,7 +5,6 @@ ***************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "audio/mcr.h" #include "includes/mcr.h" @@ -188,32 +187,38 @@ * *************************************/ -INTERRUPT_GEN( mcr_interrupt ) +TIMER_DEVICE_CALLBACK( mcr_interrupt ) { - device_t *ctc = device->machine().device("ctc"); + //mcr_state *state = timer.machine().driver_data(); + device_t *ctc = timer.machine().device("ctc"); + int scanline = param; /* CTC line 2 is connected to VBLANK, which is once every 1/2 frame */ /* for the 30Hz interlaced display */ - z80ctc_trg2_w(ctc, 1); - z80ctc_trg2_w(ctc, 0); + if(scanline == 0 || scanline == 240) + { + z80ctc_trg2_w(ctc, 1); + z80ctc_trg2_w(ctc, 0); + } /* CTC line 3 is connected to 493, which is signalled once every */ /* frame at 30Hz */ - if (cpu_getiloops(device) == 0) + if (scanline == 0) { z80ctc_trg3_w(ctc, 1); z80ctc_trg3_w(ctc, 0); } } - -INTERRUPT_GEN( mcr_ipu_interrupt ) +TIMER_DEVICE_CALLBACK( mcr_ipu_interrupt ) { - device_t *ctc = device->machine().device("ipu_ctc"); + //mcr_state *state = timer.machine().driver_data(); + device_t *ctc = timer.machine().device("ctc"); + int scanline = param; /* CTC line 3 is connected to 493, which is signalled once every */ /* frame at 30Hz */ - if (cpu_getiloops(device) == 0) + if (scanline == 0) { z80ctc_trg3_w(ctc, 1); z80ctc_trg3_w(ctc, 0); diff -Nru mame-0.144/src/mame/machine/md_cart.c mame-0.145/src/mame/machine/md_cart.c --- mame-0.144/src/mame/machine/md_cart.c 2012-01-13 15:34:59.000000000 +0000 +++ mame-0.145/src/mame/machine/md_cart.c 2012-02-06 21:30:42.000000000 +0000 @@ -1558,6 +1558,7 @@ /* is this a SMD file? */ if (genesis_is_SMD(&rawROM[0x2200], (unsigned)length)) { +// printf("SMD!\n"); tmpROMnew = ROM; tmpROM = ROM + 0x2000 + 512; @@ -1589,6 +1590,7 @@ else if ((rawROM[0x2080] == 'E') && (rawROM[0x2081] == 'A') && (rawROM[0x2082] == 'M' || rawROM[0x2082] == 'G')) { +// printf("MD!\n"); tmpROMnew = global_alloc_array(unsigned char, length); secondhalf = &tmpROMnew[length >> 1]; diff -Nru mame-0.144/src/mame/machine/megadriv.c mame-0.145/src/mame/machine/megadriv.c --- mame-0.144/src/mame/machine/megadriv.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/megadriv.c 2012-02-06 21:30:43.000000000 +0000 @@ -385,7 +385,7 @@ static timer_device* scanline_timer; static timer_device* irq6_on_timer; static timer_device* irq4_on_timer; -static bitmap_t* render_bitmap; +static bitmap_ind16* render_bitmap; //emu_timer* vblankirq_off_timer; /* Sega CD stuff */ @@ -5380,11 +5380,11 @@ // converts data stored in bitmap format (in dataram) to be read out as tiles (for dma->vram purposes) // used by Heart of the Alien - if(offset<0x30000/2) /* 0x20000 - 0x2ffff */ // 512x256 bitmap -> tiles + if(offset<0x30000/2) /* 0x20000 - 0x2ffff */ // 512x256 bitmap. tiles offset = BITSWAP24(offset,23,22,21,20,19,18,17,16,15,8,7,6,5,4,3,2,1,14,13,12,11,10,9,0); - else if(offset<0x38000/2) /* 0x30000 - 0x37fff */ // 512x128 bitmap -> tiles + else if(offset<0x38000/2) /* 0x30000 - 0x37fff */ // 512x128 bitmap. tiles offset = BITSWAP24(offset,23,22,21,20,19,18,17,16,15,14,7,6,5,4,3,2,1,13,12,11,10,9,8,0); - else if(offset<0x3c000/2) /* 0x38000 - 0x3bfff */ // 512x64 bitmap -> tiles + else if(offset<0x3c000/2) /* 0x38000 - 0x3bfff */ // 512x64 bitmap. tiles offset = BITSWAP24(offset,23,22,21,20,19,18,17,16,15,14,13,6,5,4,3,2,1,12,11,10,9,8,7,0); else /* 0x3c000 - 0x3dfff and 0x3e000 - 0x3ffff */ // 512x32 bitmap (x2) -> tiles offset = BITSWAP24(offset,23,22,21,20,19,18,17,16,15,14,13,12,5,4,3,2,1,11,10,9,8,7,6,0); @@ -5703,12 +5703,12 @@ #if 0 static void segacd_mark_stampmaps_dirty(void) { - tilemap_mark_all_tiles_dirty(segacd_stampmap[segacd_get_active_stampmap_tilemap()]); + segacd_stampmap[segacd_get_active_stampmap_tilemap(->mark_all_dirty()]); - //tilemap_mark_all_tiles_dirty(segacd_stampmap[0]); - //tilemap_mark_all_tiles_dirty(segacd_stampmap[1]); - //tilemap_mark_all_tiles_dirty(segacd_stampmap[2]); - //tilemap_mark_all_tiles_dirty(segacd_stampmap[3]); + //segacd_stampmap[0]->mark_all_dirty(); + //segacd_stampmap[1]->mark_all_dirty(); + //segacd_stampmap[2]->mark_all_dirty(); + //segacd_stampmap[3]->mark_all_dirty(); } #endif @@ -6457,7 +6457,7 @@ // the lower 3 bits of segacd_imagebuffer_hdot_size are set // this really needs to be doing it's own lookups rather than depending on the inefficient MAME cache.. -INLINE UINT8 read_pixel_from_stampmap( running_machine& machine, bitmap_t* srcbitmap, int x, int y) +INLINE UINT8 read_pixel_from_stampmap( running_machine& machine, bitmap_ind16* srcbitmap, int x, int y) { /* if (!srcbitmap) @@ -6468,7 +6468,7 @@ if (x >= srcbitmap->width) return 0; if (y >= srcbitmap->height) return 0; - UINT16* cacheptr = BITMAP_ADDR16( srcbitmap, y, x); + UINT16* cacheptr = &srcbitmap->pix16(y, x); return cacheptr[0] & 0xf; */ @@ -6514,8 +6514,8 @@ int line; - //bitmap_t *srcbitmap = tilemap_get_pixmap(segacd_stampmap[segacd_get_active_stampmap_tilemap()]); - bitmap_t *srcbitmap = 0; + //bitmap_ind16 *srcbitmap = segacd_stampmap[segacd_get_active_stampmap_tilemap(->pixmap()]); + bitmap_ind16 *srcbitmap = 0; UINT32 bufferstart = ((segacd_imagebuffer_start_address&0xfff8)*2)<<3; for (line=0;linealloc_compatible_bitmap(); + render_bitmap = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); megadrive_vdp_vram = auto_alloc_array(machine, UINT16, 0x10000/2); megadrive_vdp_cram = auto_alloc_array(machine, UINT16, 0x80/2); @@ -7272,10 +7272,15 @@ segac2_sp_pal_lookup[3] = 0x30; } -SCREEN_UPDATE(megadriv) +SCREEN_UPDATE_RGB32(megadriv) { /* Copy our screen buffer here */ - copybitmap(bitmap, render_bitmap, 0, 0, 0, 0, cliprect); + for (int y = cliprect.min_y; y <= cliprect.max_y; y++) + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + UINT16 src = render_bitmap->pix(y, x); + bitmap.pix32(y, x) = MAKE_RGB(pal5bit(src >> 10), pal5bit(src >> 5), pal5bit(src >> 0)); + } // int xxx; /* reference */ @@ -8553,7 +8558,7 @@ { UINT16*lineptr; int x; - lineptr = BITMAP_ADDR16(render_bitmap, scanline, 0); + lineptr = &render_bitmap->pix16(scanline); /* render 32x output to a buffer */ if (_32x_is_connected && (_32x_displaymode != 0)) @@ -9391,23 +9396,26 @@ /* VIDEO_EOF is used to resync the scanline counters */ -SCREEN_EOF(megadriv) +SCREEN_VBLANK(megadriv) { - rectangle visarea; - int scr_width = 320; + // rising edge + if (vblank_on) + { + rectangle visarea; + int scr_width = 320; - megadrive_vblank_flag = 0; - //megadrive_irq6_pending = 0; /* NO! (breaks warlock) */ + megadrive_vblank_flag = 0; + //megadrive_irq6_pending = 0; /* NO! (breaks warlock) */ - /* Set it to -1 here, so it becomes 0 when the first timer kicks in */ - genesis_scanline_counter = -1; - megadrive_sprite_collision=0;//? when to reset this .. - megadrive_imode = MEGADRIVE_REG0C_INTERLEAVE; // can't change mid-frame.. - megadrive_imode_odd_frame^=1; -// cputag_set_input_line(machine, "genesis_snd_z80", 0, CLEAR_LINE); // if the z80 interrupt hasn't happened by now, clear it.. + /* Set it to -1 here, so it becomes 0 when the first timer kicks in */ + genesis_scanline_counter = -1; + megadrive_sprite_collision=0;//? when to reset this .. + megadrive_imode = MEGADRIVE_REG0C_INTERLEAVE; // can't change mid-frame.. + megadrive_imode_odd_frame^=1; +// cputag_set_input_line(machine, "genesis_snd_z80", 0, CLEAR_LINE); // if the z80 interrupt hasn't happened by now, clear it.. - if (input_port_read_safe(machine, "RESET", 0x00) & 0x01) - cputag_set_input_line(machine, "maincpu", INPUT_LINE_RESET, PULSE_LINE); + if (input_port_read_safe(screen.machine(), "RESET", 0x00) & 0x01) + cputag_set_input_line(screen.machine(), "maincpu", INPUT_LINE_RESET, PULSE_LINE); /* int megadrive_total_scanlines = 262; @@ -9419,95 +9427,92 @@ */ - if (MEGADRIVE_REG01_240_LINE) - { - if (!megadrive_region_pal) + if (MEGADRIVE_REG01_240_LINE) { - /* this is invalid! */ - megadrive_visible_scanlines = 240; - megadrive_total_scanlines = 262; - megadrive_irq6_scanline = 240; - megadrive_z80irq_scanline = 240; + if (!megadrive_region_pal) + { + /* this is invalid! */ + megadrive_visible_scanlines = 240; + megadrive_total_scanlines = 262; + megadrive_irq6_scanline = 240; + megadrive_z80irq_scanline = 240; + } + else + { + megadrive_visible_scanlines = 240; + megadrive_total_scanlines = 313; + megadrive_irq6_scanline = 240; + megadrive_z80irq_scanline = 240; + } } else { - megadrive_visible_scanlines = 240; - megadrive_total_scanlines = 313; - megadrive_irq6_scanline = 240; - megadrive_z80irq_scanline = 240; + if (!megadrive_region_pal) + { + megadrive_visible_scanlines = 224; + megadrive_total_scanlines=262; + megadrive_irq6_scanline = 224; + megadrive_z80irq_scanline = 224; + } + else + { + megadrive_visible_scanlines = 224; + megadrive_total_scanlines=313; + megadrive_irq6_scanline = 224; + megadrive_z80irq_scanline = 224; + } } - } - else - { - if (!megadrive_region_pal) + + if (megadrive_imode==3) { - megadrive_visible_scanlines = 224; - megadrive_total_scanlines=262; - megadrive_irq6_scanline = 224; - megadrive_z80irq_scanline = 224; + megadrive_visible_scanlines<<=1; + megadrive_total_scanlines<<=1; + megadrive_irq6_scanline <<=1; + megadrive_z80irq_scanline <<=1; } - else + + + //get_hposition(); + switch (MEGADRIVE_REG0C_RS0 | (MEGADRIVE_REG0C_RS1 << 1)) { - megadrive_visible_scanlines = 224; - megadrive_total_scanlines=313; - megadrive_irq6_scanline = 224; - megadrive_z80irq_scanline = 224; + /* note, add 240 mode + init new timings! */ + case 0:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; + case 1:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); mame_printf_debug("invalid screenmode!\n"); break; + case 2:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; /* technically invalid, but used in rare cases */ + case 3:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; } - } +// mame_printf_debug("my mode %02x", megadrive_vdp_register[0x0c]); - if (megadrive_imode==3) - { - megadrive_visible_scanlines<<=1; - megadrive_total_scanlines<<=1; - megadrive_irq6_scanline <<=1; - megadrive_z80irq_scanline <<=1; - } + visarea.set(0, scr_width-1, 0, megadrive_visible_scanlines-1); + screen.machine().primary_screen->configure(scr_width, megadrive_visible_scanlines, visarea, HZ_TO_ATTOSECONDS(megadriv_framerate)); - //get_hposition(); - switch (MEGADRIVE_REG0C_RS0 | (MEGADRIVE_REG0C_RS1 << 1)) - { - /* note, add 240 mode + init new timings! */ - case 0:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; - case 1:scr_width = 256;break;// configure_screen(0, 256-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); mame_printf_debug("invalid screenmode!\n"); break; - case 2:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; /* technically invalid, but used in rare cases */ - case 3:scr_width = 320;break;// configure_screen(0, 320-1, megadrive_visible_scanlines-1,(double)megadriv_framerate); break; - } -// mame_printf_debug("my mode %02x", megadrive_vdp_register[0x0c]); - - visarea.min_x = 0; - visarea.max_x = scr_width-1; - visarea.min_y = 0; - visarea.max_y = megadrive_visible_scanlines-1; + if (0) + { + //int xxx; +// UINT64 frametime; - machine.primary_screen->configure(scr_width, megadrive_visible_scanlines, visarea, HZ_TO_ATTOSECONDS(megadriv_framerate)); + // /* reference */ +// frametime = ATTOSECONDS_PER_SECOND/megadriv_framerate; - if (0) - { - //int xxx; -// UINT64 frametime; + //time_elapsed_since_crap = frame_timer->time_elapsed(); + //xxx = screen.machine().device("maincpu")->attotime_to_cycles(time_elapsed_since_crap); + //mame_printf_debug("---------- cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff)); + //mame_printf_debug("---------- framet %d, %08x %08x\n",xxx, (UINT32)(frametime>>32),(UINT32)(frametime&0xffffffff)); + frame_timer->adjust(attotime::zero); + } - // /* reference */ -// frametime = ATTOSECONDS_PER_SECOND/megadriv_framerate; + scanline_timer->adjust(attotime::zero); - //time_elapsed_since_crap = frame_timer->time_elapsed(); - //xxx = machine.device("maincpu")->attotime_to_cycles(time_elapsed_since_crap); - //mame_printf_debug("---------- cycles %d, %08x %08x\n",xxx, (UINT32)(time_elapsed_since_crap.attoseconds>>32),(UINT32)(time_elapsed_since_crap.attoseconds&0xffffffff)); - //mame_printf_debug("---------- framet %d, %08x %08x\n",xxx, (UINT32)(frametime>>32),(UINT32)(frametime&0xffffffff)); - frame_timer->adjust(attotime::zero); + if(_32x_is_connected) + _32x_hcount_compare_val = -1; } - - scanline_timer->adjust(attotime::zero); - - if(_32x_is_connected) - _32x_hcount_compare_val = -1; } UINT16* megadriv_backupram; int megadriv_backupram_length; -#ifndef MESS static NVRAM_HANDLER( megadriv ) { if (megadriv_backupram!=NULL) @@ -9529,7 +9534,6 @@ } } } -#endif MACHINE_CONFIG_FRAGMENT( megadriv_timers ) @@ -9557,17 +9561,14 @@ MCFG_FRAGMENT_ADD(megadriv_timers) MCFG_SCREEN_ADD("megadriv", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) - MCFG_SCREEN_UPDATE(megadriv) /* Copies a bitmap */ - MCFG_SCREEN_EOF(megadriv) /* Used to Sync the timing */ + MCFG_SCREEN_UPDATE_STATIC(megadriv) /* Copies a bitmap */ + MCFG_SCREEN_VBLANK_STATIC(megadriv) /* Used to Sync the timing */ -#ifndef MESS MCFG_NVRAM_HANDLER(megadriv) -#endif MCFG_PALETTE_LENGTH(0x200) @@ -9608,17 +9609,14 @@ MCFG_FRAGMENT_ADD(megadriv_timers) MCFG_SCREEN_ADD("megadriv", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. MCFG_SCREEN_SIZE(64*8, 64*8) MCFG_SCREEN_VISIBLE_AREA(0, 32*8-1, 0, 28*8-1) - MCFG_SCREEN_UPDATE(megadriv) /* Copies a bitmap */ - MCFG_SCREEN_EOF(megadriv) /* Used to Sync the timing */ + MCFG_SCREEN_UPDATE_STATIC(megadriv) /* Copies a bitmap */ + MCFG_SCREEN_VBLANK_STATIC(megadriv) /* Used to Sync the timing */ -#ifndef MESS MCFG_NVRAM_HANDLER(megadriv) -#endif MCFG_PALETTE_LENGTH(0x200) @@ -9759,7 +9757,7 @@ MACHINE_CONFIG_DERIVED( genesis_scd, megadriv ) - + MCFG_NVRAM_HANDLER_CLEAR() MCFG_CPU_ADD("segacd_68k", M68000, SEGACD_CLOCK ) /* 12.5 MHz */ MCFG_CPU_PROGRAM_MAP(segacd_map) diff -Nru mame-0.144/src/mame/machine/mexico86.c mame-0.145/src/mame/machine/mexico86.c --- mame-0.144/src/mame/machine/mexico86.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/mexico86.c 2012-02-06 21:30:43.000000000 +0000 @@ -1,5 +1,4 @@ #include "emu.h" -#include "deprecat.h" #include "includes/mexico86.h" /* @@ -166,7 +165,6 @@ #if 0 -//AT /*************************************************************************** Collision logic used by Kiki Kaikai (theoretical) @@ -210,7 +208,6 @@ } } } -//ZT #endif @@ -224,11 +221,7 @@ INTERRUPT_GEN( mexico86_m68705_interrupt ) { - /* I don't know how to handle the interrupt line so I just toggle it every time. */ - if (cpu_getiloops(device) & 1) - device_set_input_line(device, 0, CLEAR_LINE); - else - device_set_input_line(device, 0, ASSERT_LINE); + device_set_input_line(device, 0, ASSERT_LINE); } @@ -319,7 +312,8 @@ if (BIT(state->m_ddr_b, 5) && BIT(data, 5) && BIT(~state->m_port_b_out, 5)) { device_set_input_line_vector(state->m_maincpu, 0, state->m_protection_ram[0]); - device_set_input_line(state->m_maincpu, 0, HOLD_LINE); //AT: HOLD_LINE works better in Z80 interrupt mode 1. + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); // HOLD_LINE works better in Z80 interrupt mode 1. + device_set_input_line(state->m_mcu, 0, CLEAR_LINE); } if (BIT(state->m_ddr_b, 6) && BIT(~data, 6) && BIT(state->m_port_b_out, 6)) diff -Nru mame-0.144/src/mame/machine/mie.c mame-0.145/src/mame/machine/mie.c --- mame-0.144/src/mame/machine/mie.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/mie.c 2012-02-06 21:30:42.000000000 +0000 @@ -100,7 +100,7 @@ void mie_device::device_start() { maple_device::device_start(); - cpu = downcast(subdevice("mie")); + cpu = subdevice("mie"); timer = timer_alloc(0); cpu->set_irq_callback(irq_callback_1); jvs = machine().device(jvs_name); diff -Nru mame-0.144/src/mame/machine/n64.c mame-0.145/src/mame/machine/n64.c --- mame-0.144/src/mame/machine/n64.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/n64.c 2012-02-06 21:30:42.000000000 +0000 @@ -1,21 +1,174 @@ /* machine/n64.c - contains N64 hardware emulation shared between MAME and MESS */ #include "emu.h" +#include "debugger.h" #include "cpu/mips/mips3.h" #include "cpu/mips/mips3com.h" #include "includes/n64.h" -#include "sound/dmadac.h" #include "profiler.h" UINT32 *rdram; UINT32 *rsp_imem; UINT32 *rsp_dmem; -// Memory Interface -static UINT32 mi_version = 0; -static UINT32 mi_interrupt = 0; -static UINT32 mi_intr_mask = 0; -static UINT32 mi_mode = 0; +// device type definition +const device_type N64PERIPH = &device_creator; + +static TIMER_CALLBACK(ai_timer_callback); +static TIMER_CALLBACK(pi_dma_callback); + +n64_periphs::n64_periphs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, N64PERIPH, "N64 Periphal Chips", tag, owner, clock) +{ +} + + +void n64_periphs::device_start() +{ + ai_timer = machine().scheduler().timer_alloc(FUNC(ai_timer_callback)); + pi_dma_timer = machine().scheduler().timer_alloc(FUNC(pi_dma_callback)); +} + +void n64_periphs::device_reset() +{ + UINT32 *cart = (UINT32*)machine().region("user2")->base(); + + maincpu = machine().device("maincpu"); + rspcpu = machine().device("rsp"); + mem_map = maincpu->memory().space(AS_PROGRAM); + + mi_version = 0; + mi_interrupt = 0; + mi_intr_mask = 0; + mi_mode = 0; + + sp_mem_addr = 0; + sp_dram_addr = 0; + sp_dma_length = 0; + sp_dma_count = 0; + sp_dma_skip = 0; + sp_semaphore = 0; + + vi_width = 0; + vi_origin = 0; + vi_control = 0; + vi_burst = 0; + vi_vsync = 0; + vi_hsync = 0; + vi_leap = 0; + vi_hstart = 0; + vi_vstart = 0; + vi_intr = 0; + vi_vburst = 0; + vi_xscale = 0; + vi_yscale = 0; + + ai_dac[0] = machine().device("dac1"); + ai_dac[1] = machine().device("dac2"); + ai_timer->adjust(attotime::never); + memset(ai_fifo, 0, sizeof(ai_fifo)); + ai_fifo_wpos = 0; + ai_fifo_rpos = 0; + ai_fifo_num = 0; + ai_dram_addr = 0; + ai_len = 0 ; + ai_control = 0; + ai_dacrate = 0; + ai_bitrate = 0; + ai_status = 0; + + pi_dma_timer->adjust(attotime::never); + pi_first_dma = 1; + pi_rd_len = 0; + pi_wr_len = 0; + pi_status = 0; + pi_bsd_dom1_lat = 0; + pi_bsd_dom1_pwd = 0; + pi_bsd_dom1_pgs = 0; + pi_bsd_dom1_rls = 0; + pi_bsd_dom2_lat = 0; + pi_bsd_dom2_pwd = 0; + pi_bsd_dom2_pgs = 0; + pi_bsd_dom2_rls = 0; + pi_dma_dir = 0; + + memset(pif_ram, 0, sizeof(pif_ram)); + memset(pif_cmd, 0, sizeof(pif_cmd)); + si_dram_addr = 0; + si_pif_addr = 0; + si_status = 0; + + memset(eeprom, 0, sizeof(eeprom)); + memset(mempack, 0, sizeof(mempack)); + + dp_clock = 0; + + cic_status = 0; + + // bootcode differs between CIC-chips, so we can use its checksum to detect the CIC-chip + UINT64 boot_checksum = 0; + for(int i = 0x40; i < 0x1000; i+=4) + { + boot_checksum += cart[i/4]+i; + } + + if (boot_checksum == U64(0x000000d057e84864)) + { + // CIC-NUS-6101 + printf("CIC-NUS-6102 detected\n"); + pif_ram[0x24] = 0x00; + pif_ram[0x25] = 0x02; + pif_ram[0x26] = 0x3f; + pif_ram[0x27] = 0x3f; + // crc_seed = 0x3f; + } + else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31)) + { + // CIC-NUS-6103 + printf("CIC-NUS-6101 detected\n"); + // crc_seed = 0x78; + pif_ram[0x24] = 0x00; + pif_ram[0x25] = 0x06; + pif_ram[0x26] = 0x3f; + pif_ram[0x27] = 0x3f; + } + else if (boot_checksum == U64(0x000000d6499e376b)) + { + // CIC-NUS-6103 + printf("CIC-NUS-6103 detected\n"); + // crc_seed = 0x78; + pif_ram[0x24] = 0x00; + pif_ram[0x25] = 0x02; + pif_ram[0x26] = 0x78; + pif_ram[0x27] = 0x3f; + } + else if (boot_checksum == U64(0x0000011a4a1604b6)) + { + // CIC-NUS-6105 + printf("CIC-NUS-6105 detected\n"); + // crc_seed = 0x91; + + // first_rsp = 0; + pif_ram[0x24] = 0x00; + pif_ram[0x25] = 0x02; + pif_ram[0x26] = 0x91; + pif_ram[0x27] = 0x3f; + } + else if (boot_checksum == U64(0x000000d6d5de4ba0)) + { + // CIC-NUS-6106 + printf("CIC-NUS-6106 detected\n"); + // crc_seed = 0x85; + pif_ram[0x24] = 0x00; + pif_ram[0x25] = 0x02; + pif_ram[0x26] = 0x85; + pif_ram[0x27] = 0x3f; + } + else + { + printf("Unknown BootCode Checksum %08X%08X\n", (UINT32)(boot_checksum>>32),(UINT32)(boot_checksum)); + } +} // Memory Interface (MI) @@ -30,8 +183,9 @@ #define MI_MODE_EBUS 0x0100 /* Bit 8: ebus test mode */ #define MI_MODE_RDRAM 0x0200 /* Bit 9: RDRAM reg mode */ -READ32_HANDLER( n64_mi_reg_r ) +READ32_MEMBER( n64_periphs::mi_reg_r ) { + //printf("mi_reg_r %08x\n", offset * 4); switch (offset) { case 0x00/4: // MI_MODE_REG @@ -47,15 +201,16 @@ return mi_intr_mask; default: - logerror("mi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); + logerror("mi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&mem_map->device())); break; } return 0; } -WRITE32_HANDLER( n64_mi_reg_w ) +WRITE32_MEMBER( n64_periphs::mi_reg_w ) { + //printf("mi_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); switch (offset) { case 0x00/4: // MI_INIT_MODE_REG @@ -67,7 +222,7 @@ if (data & MI_SET_RDRAM) mi_mode |= MI_MODE_RDRAM; if (data & MI_CLR_DP_INTR) { - clear_rcp_interrupt(space->machine(), DP_INTERRUPT); + clear_rcp_interrupt(DP_INTERRUPT); } break; @@ -129,36 +284,37 @@ } default: - logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); + logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } -static dmadac_sound_device *dmadac[2]; - void signal_rcp_interrupt(running_machine &machine, int interrupt) { + machine.device("rcp")->signal_rcp_interrupt(interrupt); +} + +void n64_periphs::signal_rcp_interrupt(int interrupt) +{ if (mi_intr_mask & interrupt) { mi_interrupt |= interrupt; - cputag_set_input_line(machine, "maincpu", INPUT_LINE_IRQ0, ASSERT_LINE); + cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ0, ASSERT_LINE); } } -void clear_rcp_interrupt(running_machine &machine, int interrupt) +void n64_periphs::clear_rcp_interrupt(int interrupt) { mi_interrupt &= ~interrupt; //if (!mi_interrupt) { - cputag_set_input_line(machine, "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE); + cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE); } } -static UINT8 is64_buffer[0x10000]; - -READ32_HANDLER( n64_is64_r ) +READ32_MEMBER( n64_periphs::is64_r ) { switch(offset) { @@ -182,7 +338,7 @@ } } -WRITE32_HANDLER( n64_is64_w ) +WRITE32_MEMBER( n64_periphs::is64_w ) { int i = 0; @@ -209,172 +365,72 @@ } } -READ32_HANDLER( n64_open_r ) +READ32_MEMBER( n64_periphs::open_r ) { UINT32 retval = (offset << 2) & 0x0000ffff; retval = (retval << 16) | retval; return retval; } -WRITE32_HANDLER( n64_open_w ) +WRITE32_MEMBER( n64_periphs::open_w ) { // Do nothing } -// RDRAM registers -static UINT32 rdram_config; -static UINT32 rdram_device_id; -static UINT32 rdram_delay; -static UINT32 rdram_mode; -static UINT32 rdram_ref_interval; -static UINT32 rdram_ref_row; -static UINT32 rdram_ras_interval; -static UINT32 rdram_min_interval; -static UINT32 rdram_addr_select; -static UINT32 rdram_device_manuf; - -READ32_HANDLER( n64_rdram_reg_r ) -{ - switch (offset) - { - case 0x00/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_config; - - case 0x04/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_device_id; - - case 0x08/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_delay; - - case 0x0c/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_mode; - - case 0x10/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_ref_interval; +// RDRAM Interface (RI) - case 0x14/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_ref_row; +#define RDRAM_CONFIG (0) +#define RDRAM_DEVICE_ID (1) +#define RDRAM_DELAY (2) +#define RDRAM_MODE (3) +#define RDRAM_REF_INTERVAL (4) +#define RDRAM_REF_ROW (5) +#define RDRAM_RAS_INTERVAL (6) +#define RDRAM_MIN_INTERVAL (7) +#define RDRAM_ADDR_SELECT (8) +#define RDRAM_DEVICE_MANUF (9) - case 0x18/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_ras_interval; - - case 0x1c/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_min_interval; - - case 0x20/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_addr_select; - - case 0x24/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - return rdram_device_manuf; - - default: - logerror("rdram_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); - break; - } - return 0; -} - -WRITE32_HANDLER( n64_rdram_reg_w ) +READ32_MEMBER( n64_periphs::rdram_reg_r ) { - switch (offset) - { - case 0x00/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_config = data; - break; - - case 0x04/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_device_id = data; - break; - - case 0x08/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_delay = data; - break; - - case 0x0c/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_mode = data; - break; - - case 0x10/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_ref_interval = data; - break; - - case 0x14/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_ref_row = data; - break; - - case 0x18/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_ras_interval = data; - break; - - case 0x1c/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_min_interval = data; - break; - - case 0x20/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_addr_select = data; - break; - - case 0x24/4: // RDRAM_CONFIG_REG / RDRAM_DEVICE_TYPE_REG - rdram_device_manuf = data; - break; - - default: - logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); - break; - } + //printf("rdram_reg_r %08x\n", offset * 4); + if(offset > 0x24/4) + { + logerror("rdram_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu)); + return 0; + } + return rdram_regs[offset]; } -// RSP Interface - -static UINT32 sp_mem_addr; -static UINT32 sp_dram_addr; -static int sp_dma_length; -static int sp_dma_count; -static int sp_dma_skip; -static UINT32 sp_semaphore; -static UINT32 dp_clock = 0; - -static void sp_dma(running_machine &machine, int direction) +WRITE32_MEMBER( n64_periphs::rdram_reg_w ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - int i, c; - - if (sp_dma_length == 0) + //printf("rdram_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); + if(offset > 0x24/4) { + logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); return; } + COMBINE_DATA(&rdram_regs[offset]); +} +// RSP Interface + +void n64_periphs::sp_dma(int direction) +{ sp_dma_length++; if ((sp_dma_length & 7) != 0) { - //fatalerror("sp_dma (%s): sp_dma_length unaligned %08X\n", cpu ? "RSP" : "R4300i", sp_dma_length); - //sp_dma_length = sp_dma_length & ~3; sp_dma_length = (sp_dma_length + 7) & ~7; - - //sp_dma_length &= ~7; } if (sp_mem_addr & 0x3) { - //sp_mem_addr = (sp_mem_addr + 3) & ~3; sp_mem_addr = sp_mem_addr & ~3; - // sp_mem_addr &= ~0x3; - // fatalerror("sp_dma (%s): sp_mem_addr unaligned: %08X\n", cpu ? "RSP" : "R4300i", sp_mem_addr); } if (sp_dram_addr & 0x7) { sp_dram_addr = sp_dram_addr & ~7; } - if (sp_dma_count > 0) - { - // fatalerror("sp_dma: dma_count = %d\n", sp_dma_count); - } - if (sp_dma_skip > 0) - { - // fatalerror("sp_dma: dma_skip = %d\n", sp_dma_skip); - } - if ((sp_mem_addr & 0xfff) + (sp_dma_length) > 0x1000) { printf("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length); @@ -382,20 +438,19 @@ sp_dma_length = 0x1000 - (sp_mem_addr & 0xfff); } - if (direction == 0) // RDRAM -> I/DMEM + UINT32 *sp_mem[2] = { rsp_dmem, rsp_imem }; + + if(direction == 0)// RDRAM -> I/DMEM { - for (c=0; c <= sp_dma_count; c++) + for(int c = 0; c <= sp_dma_count; c++) { - UINT32 src = sp_dram_addr; - UINT32 dst = 0x04000000 | (sp_mem_addr & 0x1fff); + UINT32 src = (sp_dram_addr & 0x007fffff) >> 2; + UINT32 dst = (sp_mem_addr & 0x1fff) >> 2; - //printf("CPU %08x -> RSP %08x\n", sp_dram_addr, 0x04000000 | sp_mem_addr); - for (i=0; i < sp_dma_length; i++) + for(int i = 0; i < sp_dma_length / 4; i++) { - //printf("%02x ", space->read_byte((src + i)^3)); - space->write_byte(dst + i, space->read_byte(src + i)); + sp_mem[(dst + i) >> 10][(dst + i) & 0x3ff] = rdram[src + i]; } - //printf("\n"); sp_mem_addr += sp_dma_length; sp_dram_addr += sp_dma_length; @@ -405,18 +460,15 @@ } else // I/DMEM -> RDRAM { - for (c=0; c <= sp_dma_count; c++) + for(int c = 0; c <= sp_dma_count; c++) { - UINT32 src = 0x04000000 | (sp_mem_addr & 0x1fff); - UINT32 dst = sp_dram_addr; + UINT32 src = (sp_mem_addr & 0x1fff) >> 2; + UINT32 dst = (sp_dram_addr & 0x007fffff) >> 2; - //printf("RSP %08x -> CPU %08x\n", 0x04000000 | sp_mem_addr, sp_dram_addr); - for (i=0; i < sp_dma_length; i++) + for(int i = 0; i < sp_dma_length / 4; i++) { - //printf("%02x ", space->read_byte((src + i)^3)); - space->write_byte(dst + i, space->read_byte(src + i)); + rdram[dst + i] = sp_mem[(src + i) >> 10][(src + i) & 0x3ff]; } - //printf("\n"); sp_mem_addr += sp_dma_length; sp_dram_addr += sp_dma_length; @@ -428,28 +480,31 @@ static void sp_set_status(device_t *device, UINT32 status) { + device->machine().device("rcp")->sp_set_status(status); +} + +void n64_periphs::sp_set_status(UINT32 status) +{ if (status & 0x1) { - //device->machine().scheduler().trigger(6789); - - device_set_input_line(device, INPUT_LINE_HALT, ASSERT_LINE); - cpu_set_reg(device, RSP_SR, cpu_get_reg(device, RSP_SR) | RSP_STATUS_HALT); - //rsp_sp_status |= SP_STATUS_HALT; + device_set_input_line(rspcpu, INPUT_LINE_HALT, ASSERT_LINE); + cpu_set_reg(rspcpu, RSP_SR, cpu_get_reg(rspcpu, RSP_SR) | RSP_STATUS_HALT); } + if (status & 0x2) { - //rsp_sp_status |= SP_STATUS_BROKE; - cpu_set_reg(device, RSP_SR, cpu_get_reg(device, RSP_SR) | RSP_STATUS_BROKE); + cpu_set_reg(rspcpu, RSP_SR, cpu_get_reg(rspcpu, RSP_SR) | RSP_STATUS_BROKE); - if (cpu_get_reg(device, RSP_SR) & RSP_STATUS_INTR_BREAK) + if (cpu_get_reg(rspcpu, RSP_SR) & RSP_STATUS_INTR_BREAK) { - signal_rcp_interrupt(device->machine(), SP_INTERRUPT); + signal_rcp_interrupt(SP_INTERRUPT); } } } -READ32_DEVICE_HANDLER( n64_sp_reg_r ) +UINT32 n64_periphs::sp_reg_r(UINT32 offset) { + //printf("sp_reg_r %08x\n", offset * 4); switch (offset) { case 0x00/4: // SP_MEM_ADDR_REG @@ -462,7 +517,7 @@ return (sp_dma_skip << 20) | (sp_dma_count << 12) | sp_dma_length; case 0x10/4: // SP_STATUS_REG - return cpu_get_reg(device, RSP_SR); + return cpu_get_reg(rspcpu, RSP_SR); case 0x14/4: // SP_DMA_FULL_REG return 0; @@ -496,18 +551,24 @@ return ++dp_clock; case 0x40000/4: // PC - return cpu_get_reg(device, RSP_PC) & 0x00000fff; + return cpu_get_reg(rspcpu, RSP_PC) & 0x00000fff; default: - logerror("sp_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(device)); + logerror("sp_reg_r: %08X at %08X\n", offset, cpu_get_pc(maincpu)); break; } return 0; } -WRITE32_DEVICE_HANDLER( n64_sp_reg_w ) +READ32_DEVICE_HANDLER( n64_sp_reg_r ) +{ + return device->machine().device("rcp")->sp_reg_r(offset); +} + +void n64_periphs::sp_reg_w(UINT32 offset, UINT32 data, UINT32 mem_mask) { + //printf("sp_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); if ((offset & 0x10000) == 0) { switch (offset & 0xffff) @@ -524,166 +585,129 @@ sp_dma_length = data & 0xfff; sp_dma_count = (data >> 12) & 0xff; sp_dma_skip = (data >> 20) & 0xfff; - sp_dma(device->machine(), 0); + sp_dma(0); break; case 0x0c/4: // SP_WR_LEN_REG sp_dma_length = data & 0xfff; sp_dma_count = (data >> 12) & 0xff; sp_dma_skip = (data >> 20) & 0xfff; - sp_dma(device->machine(), 1); + sp_dma(1); break; case 0x10/4: // RSP_STATUS_REG { - UINT32 oldstatus = cpu_get_reg(device, RSP_SR); + UINT32 oldstatus = cpu_get_reg(rspcpu, RSP_SR); UINT32 newstatus = oldstatus; // printf( "RSP_STATUS_REG Write; %08x\n", data ); if (data & 0x00000001) // clear halt { - //if (first_rsp) - //{ - // device_spin_until_trigger(device, 6789); - - // printf( "Clearing RSP_STATUS_HALT\n" ); - device_set_input_line(device, INPUT_LINE_HALT, CLEAR_LINE); - newstatus &= ~RSP_STATUS_HALT; - // RSP_STATUS &= ~RSP_STATUS_HALT; - //} - //else - //{ - // first_rsp = 1; - //} + device_set_input_line(rspcpu, INPUT_LINE_HALT, CLEAR_LINE); + newstatus &= ~RSP_STATUS_HALT; } if (data & 0x00000002) // set halt { - // printf( "Setting RSP_STATUS_HALT\n" ); - device_set_input_line(device, INPUT_LINE_HALT, ASSERT_LINE); + device_set_input_line(rspcpu, INPUT_LINE_HALT, ASSERT_LINE); newstatus |= RSP_STATUS_HALT; - // RSP_STATUS |= RSP_STATUS_HALT; } if (data & 0x00000004) { - //printf( "Clearing RSP_STATUS_BROKE\n" ); newstatus &= ~RSP_STATUS_BROKE; - // RSP_STATUS &= ~RSP_STATUS_BROKE; // clear broke } if (data & 0x00000008) // clear interrupt { - clear_rcp_interrupt(device->machine(), SP_INTERRUPT); + clear_rcp_interrupt(SP_INTERRUPT); } if (data & 0x00000010) // set interrupt { - signal_rcp_interrupt(device->machine(), SP_INTERRUPT); + signal_rcp_interrupt(SP_INTERRUPT); } if (data & 0x00000020) { - // printf( "Clearing RSP_STATUS_SSTEP\n" ); newstatus &= ~RSP_STATUS_SSTEP; - // RSP_STATUS &= ~RSP_STATUS_SSTEP; // clear single step } if (data & 0x00000040) { - //printf( "Setting RSP_STATUS_SSTEP\n" ); - newstatus |= RSP_STATUS_SSTEP; - if( !( oldstatus & ( RSP_STATUS_BROKE | RSP_STATUS_HALT ) ) ) + newstatus |= RSP_STATUS_SSTEP; // set single step + if(!(oldstatus & (RSP_STATUS_BROKE | RSP_STATUS_HALT))) { - cpu_set_reg(device, RSP_STEPCNT, 1 ); + cpu_set_reg(rspcpu, RSP_STEPCNT, 1 ); } - // RSP_STATUS |= RSP_STATUS_SSTEP; // set single step } if (data & 0x00000080) { - newstatus &= ~RSP_STATUS_INTR_BREAK; - // RSP_STATUS &= ~RSP_STATUS_INTR_BREAK; // clear interrupt on break + newstatus &= ~RSP_STATUS_INTR_BREAK; // clear interrupt on break } if (data & 0x00000100) { - newstatus |= RSP_STATUS_INTR_BREAK; - // RSP_STATUS |= RSP_STATUS_INTR_BREAK; // set interrupt on break + newstatus |= RSP_STATUS_INTR_BREAK; // set interrupt on break } if (data & 0x00000200) { - newstatus &= ~RSP_STATUS_SIGNAL0; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL0; // clear signal 0 + newstatus &= ~RSP_STATUS_SIGNAL0; // clear signal 0 } if (data & 0x00000400) { - newstatus |= RSP_STATUS_SIGNAL0; - // RSP_STATUS |= RSP_STATUS_SIGNAL0; // set signal 0 + newstatus |= RSP_STATUS_SIGNAL0; // set signal 0 } if (data & 0x00000800) { - newstatus &= ~RSP_STATUS_SIGNAL1; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL1; // clear signal 1 + newstatus &= ~RSP_STATUS_SIGNAL1; // clear signal 1 } if (data & 0x00001000) { - newstatus |= RSP_STATUS_SIGNAL1; - // RSP_STATUS |= RSP_STATUS_SIGNAL1; // set signal 1 + newstatus |= RSP_STATUS_SIGNAL1; // set signal 1 } if (data & 0x00002000) { - newstatus &= ~RSP_STATUS_SIGNAL2 ; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL2; // clear signal 2 + newstatus &= ~RSP_STATUS_SIGNAL2 ; // clear signal 2 } if (data & 0x00004000) { - newstatus |= RSP_STATUS_SIGNAL2; - // RSP_STATUS |= RSP_STATUS_SIGNAL2; // set signal 2 + newstatus |= RSP_STATUS_SIGNAL2; // set signal 2 } if (data & 0x00008000) { - newstatus &= ~RSP_STATUS_SIGNAL3; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL3; // clear signal 3 + newstatus &= ~RSP_STATUS_SIGNAL3; // clear signal 3 } if (data & 0x00010000) { - newstatus |= RSP_STATUS_SIGNAL3; - // RSP_STATUS |= RSP_STATUS_SIGNAL3; // set signal 3 + newstatus |= RSP_STATUS_SIGNAL3; // set signal 3 } if (data & 0x00020000) { - newstatus &= ~RSP_STATUS_SIGNAL4; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL4; // clear signal 4 + newstatus &= ~RSP_STATUS_SIGNAL4; // clear signal 4 } if (data & 0x00040000) { - newstatus |= RSP_STATUS_SIGNAL4; - // RSP_STATUS |= RSP_STATUS_SIGNAL4; // set signal 4 + newstatus |= RSP_STATUS_SIGNAL4; // set signal 4 } if (data & 0x00080000) { - newstatus &= ~RSP_STATUS_SIGNAL5; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL5; // clear signal 5 + newstatus &= ~RSP_STATUS_SIGNAL5; // clear signal 5 } if (data & 0x00100000) { - newstatus |= RSP_STATUS_SIGNAL5; - // RSP_STATUS |= RSP_STATUS_SIGNAL5; // set signal 5 + newstatus |= RSP_STATUS_SIGNAL5; // set signal 5 } if (data & 0x00200000) { - newstatus &= ~RSP_STATUS_SIGNAL6; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL6; // clear signal 6 + newstatus &= ~RSP_STATUS_SIGNAL6; // clear signal 6 } if (data & 0x00400000) { - newstatus |= RSP_STATUS_SIGNAL6; - // RSP_STATUS |= RSP_STATUS_SIGNAL6; // set signal 6 + newstatus |= RSP_STATUS_SIGNAL6; // set signal 6 } if (data & 0x00800000) { - newstatus &= ~RSP_STATUS_SIGNAL7; - // RSP_STATUS &= ~RSP_STATUS_SIGNAL7; // clear signal 7 + newstatus &= ~RSP_STATUS_SIGNAL7; // clear signal 7 } if (data & 0x01000000) { - newstatus |= RSP_STATUS_SIGNAL7; - // RSP_STATUS |= RSP_STATUS_SIGNAL7; // set signal 7 + newstatus |= RSP_STATUS_SIGNAL7; // set signal 7 } - cpu_set_reg(device, RSP_SR, newstatus); + cpu_set_reg(rspcpu, RSP_SR, newstatus); break; } @@ -692,11 +716,10 @@ { sp_semaphore = 0; } - // mame_printf_debug("sp_semaphore = %08X\n", sp_semaphore); break; default: - logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(device)); + logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } @@ -705,24 +728,28 @@ switch (offset & 0xffff) { case 0x00/4: // SP_PC_REG - //printf( "Setting PC to: %08x\n", 0x04001000 | (data & 0xfff ) ); - if( cpu_get_reg(device, RSP_NEXTPC) != 0xffffffff ) + if( cpu_get_reg(rspcpu, RSP_NEXTPC) != 0xffffffff ) { - cpu_set_reg(device, RSP_NEXTPC, 0x1000 | (data & 0xfff)); + cpu_set_reg(rspcpu, RSP_NEXTPC, 0x1000 | (data & 0xfff)); } else { - cpu_set_reg(device, RSP_PC, 0x1000 | (data & 0xfff)); + cpu_set_reg(rspcpu, RSP_PC, 0x1000 | (data & 0xfff)); } break; default: - logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(device)); + logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } } +WRITE32_DEVICE_HANDLER( n64_sp_reg_w ) +{ + device->machine().device("rcp")->sp_reg_w(offset, data, mem_mask); +} + // RDP Interface void dp_full_sync(running_machine &machine) @@ -807,34 +834,22 @@ // Video Interface -UINT32 n64_vi_width; -UINT32 n64_vi_origin; -UINT32 n64_vi_control; -UINT32 n64_vi_blank; -UINT32 n64_vi_hstart; -UINT32 n64_vi_vstart; -UINT32 n64_vi_xscale; -UINT32 n64_vi_yscale; -static UINT32 n64_vi_burst, n64_vi_vsync, n64_vi_hsync, n64_vi_leap; -static UINT32 n64_vi_intr, n64_vi_vburst; - - -static void n64_vi_recalculate_resolution(running_machine &machine) -{ - _n64_state *state = machine.driver_data<_n64_state>(); - - int x_start = (n64_vi_hstart & 0x03ff0000) >> 16; - int x_end = n64_vi_hstart & 0x000003ff; - int y_start = ((n64_vi_vstart & 0x03ff0000) >> 16) / 2; - int y_end = (n64_vi_vstart & 0x000003ff) / 2; - int width = ((n64_vi_xscale & 0x00000fff) * (x_end - x_start)) / 0x400; - int height = ((n64_vi_yscale & 0x00000fff) * (y_end - y_start)) / 0x400; - rectangle visarea = machine.primary_screen->visible_area(); - attoseconds_t period = machine.primary_screen->frame_period().attoseconds; +void n64_periphs::vi_recalculate_resolution() +{ + _n64_state *state = machine().driver_data<_n64_state>(); + + int x_start = (vi_hstart & 0x03ff0000) >> 16; + int x_end = vi_hstart & 0x000003ff; + int y_start = ((vi_vstart & 0x03ff0000) >> 16) / 2; + int y_end = (vi_vstart & 0x000003ff) / 2; + int width = ((vi_xscale & 0x00000fff) * (x_end - x_start)) / 0x400; + int height = ((vi_yscale & 0x00000fff) * (y_end - y_start)) / 0x400; + rectangle visarea = machine().primary_screen->visible_area(); + attoseconds_t period = machine().primary_screen->frame_period().attoseconds; if (width == 0 || height == 0) { - n64_vi_blank = 1; + vi_blank = 1; /* FIXME: MAME doesn't handle well a h/w res of zero (otherwise it hardlocks the emu, seen especially in Aleck 64 games that sets the res after a longer delay than n64), guess that this just disables drawing? @@ -843,254 +858,221 @@ } else { - n64_vi_blank = 0; + vi_blank = 0; } -// if (width == 0) -// width = 1; - -// if (height == 0) -// height = 1; - if (width > 640) width = 640; if (height > 480) height = 480; - state->m_rdp.GetMiscState()->m_fb_height = height; + state->m_rdp.MiscState.FBHeight = height; visarea.max_x = width - 1; visarea.max_y = height - 1; - machine.primary_screen->configure(width, 525, visarea, period); + machine().primary_screen->configure(width, 525, visarea, period); } -READ32_HANDLER( n64_vi_reg_r ) +READ32_MEMBER( n64_periphs::vi_reg_r ) { + //printf("vi_reg_r %08x\n", offset * 4); switch (offset) { case 0x00/4: // VI_CONTROL_REG - return n64_vi_control; + return vi_control; case 0x04/4: // VI_ORIGIN_REG - return n64_vi_origin; + return vi_origin; case 0x08/4: // VI_WIDTH_REG - return n64_vi_width; + return vi_width; case 0x0c/4: - return n64_vi_intr; + return vi_intr; case 0x10/4: // VI_CURRENT_REG - return space->machine().primary_screen->vpos(); + return machine().primary_screen->vpos(); case 0x14/4: // VI_BURST_REG - return n64_vi_burst; + return vi_burst; case 0x18/4: // VI_V_SYNC_REG - return n64_vi_vsync; + return vi_vsync; case 0x1c/4: // VI_H_SYNC_REG - return n64_vi_hsync; + return vi_hsync; case 0x20/4: // VI_LEAP_REG - return n64_vi_leap; + return vi_leap; case 0x24/4: // VI_H_START_REG - return n64_vi_hstart; + return vi_hstart; case 0x28/4: // VI_V_START_REG - return n64_vi_vstart; + return vi_vstart; case 0x2c/4: // VI_V_BURST_REG - return n64_vi_vburst; + return vi_vburst; case 0x30/4: // VI_X_SCALE_REG - return n64_vi_xscale; + return vi_xscale; case 0x34/4: // VI_Y_SCALE_REG - return n64_vi_yscale; + return vi_yscale; default: - logerror("vi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); + logerror("vi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu)); break; } return 0; } -WRITE32_HANDLER( n64_vi_reg_w ) +WRITE32_MEMBER( n64_periphs::vi_reg_w ) { - _n64_state *state = space->machine().driver_data<_n64_state>(); + //printf("vi_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); + _n64_state *state = machine().driver_data<_n64_state>(); switch (offset) { case 0x00/4: // VI_CONTROL_REG - n64_vi_control = data; - n64_vi_recalculate_resolution(space->machine()); + vi_control = data; + vi_recalculate_resolution(); break; case 0x04/4: // VI_ORIGIN_REG - n64_vi_origin = data & 0xffffff; + vi_origin = data & 0xffffff; break; case 0x08/4: // VI_WIDTH_REG - if (n64_vi_width != data && data > 0) + if (vi_width != data && data > 0) { - n64_vi_recalculate_resolution(space->machine()); + vi_recalculate_resolution(); } - n64_vi_width = data; - state->m_rdp.GetMiscState()->m_fb_width = data; + vi_width = data; + state->m_rdp.MiscState.FBWidth = data; break; case 0x0c/4: // VI_INTR_REG - n64_vi_intr = data; + vi_intr = data; break; case 0x10/4: // VI_CURRENT_REG - clear_rcp_interrupt(space->machine(), VI_INTERRUPT); + clear_rcp_interrupt(VI_INTERRUPT); break; case 0x14/4: // VI_BURST_REG - n64_vi_burst = data; + vi_burst = data; break; case 0x18/4: // VI_V_SYNC_REG - n64_vi_vsync = data; + vi_vsync = data; break; case 0x1c/4: // VI_H_SYNC_REG - n64_vi_hsync = data; + vi_hsync = data; break; case 0x20/4: // VI_LEAP_REG - n64_vi_leap = data; + vi_leap = data; break; case 0x24/4: // VI_H_START_REG - n64_vi_hstart = data; - n64_vi_recalculate_resolution(space->machine()); + vi_hstart = data; + vi_recalculate_resolution(); break; case 0x28/4: // VI_V_START_REG - n64_vi_vstart = data; - n64_vi_recalculate_resolution(space->machine()); + vi_vstart = data; + vi_recalculate_resolution(); break; case 0x2c/4: // VI_V_BURST_REG - n64_vi_vburst = data; + vi_vburst = data; break; case 0x30/4: // VI_X_SCALE_REG - n64_vi_xscale = data; - n64_vi_recalculate_resolution(space->machine()); + vi_xscale = data; + vi_recalculate_resolution(); break; case 0x34/4: // VI_Y_SCALE_REG - n64_vi_yscale = data; - n64_vi_recalculate_resolution(space->machine()); + vi_yscale = data; + vi_recalculate_resolution(); break; /* Uncomment this for convenient homebrew debugging - */ case 0x44/4: // TEMP DEBUG printf( "E Ping: %08x\n", data ); break; + */ default: - logerror("vi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); + logerror("vi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } // Audio Interface -static UINT32 ai_dram_addr; -static UINT32 ai_len; -static UINT32 ai_control = 0; -static int ai_dacrate; -static int ai_bitrate; -static UINT32 ai_status = 0; - -static emu_timer *audio_timer; - -#define AUDIO_DMA_DEPTH 2 - -static void start_audio_dma(running_machine &machine); - -typedef struct -{ - UINT32 address; - UINT32 length; -} AUDIO_DMA; - -static AUDIO_DMA audio_fifo[AUDIO_DMA_DEPTH]; -static int audio_fifo_wpos = 0; -static int audio_fifo_rpos = 0; -static int audio_fifo_num = 0; - -static void audio_fifo_push(running_machine &machine, UINT32 address, UINT32 length) +void n64_periphs::ai_fifo_push(UINT32 address, UINT32 length) { -// AUDIO_DMA *current; - - if (audio_fifo_num == AUDIO_DMA_DEPTH) + if (ai_fifo_num == AUDIO_DMA_DEPTH) { - mame_printf_debug("audio_fifo_push: tried to push to full DMA FIFO!!!\n"); + mame_printf_debug("ai_fifo_push: tried to push to full DMA FIFO!!!\n"); } -// mame_printf_debug("fifo_push: adr %08x len %08x\n", address, length); - - audio_fifo[audio_fifo_wpos].address = address; - audio_fifo[audio_fifo_wpos].length = length; -// current = &audio_fifo[audio_fifo_wpos]; + ai_fifo[ai_fifo_wpos].address = address; + ai_fifo[ai_fifo_wpos].length = length; - audio_fifo_wpos++; - audio_fifo_num++; + ai_fifo_wpos++; + ai_fifo_num++; - if (audio_fifo_wpos >= AUDIO_DMA_DEPTH) + if (ai_fifo_wpos >= AUDIO_DMA_DEPTH) { - audio_fifo_wpos = 0; + ai_fifo_wpos = 0; } - if (audio_fifo_num >= AUDIO_DMA_DEPTH) + if (ai_fifo_num >= AUDIO_DMA_DEPTH) { ai_status |= 0x80000001; // FIFO full } if (! (ai_status & 0x40000000)) { - signal_rcp_interrupt(machine, AI_INTERRUPT); - start_audio_dma(machine); + signal_rcp_interrupt(AI_INTERRUPT); + ai_dma(); } } -static void audio_fifo_pop(running_machine &machine) +void n64_periphs::ai_fifo_pop() { - audio_fifo_rpos++; - audio_fifo_num--; + ai_fifo_rpos++; + ai_fifo_num--; - if (audio_fifo_num < 0) + if (ai_fifo_num < 0) { - fatalerror("audio_fifo_pop: FIFO underflow!\n"); + fatalerror("ai_fifo_pop: FIFO underflow!\n"); } - if (audio_fifo_rpos >= AUDIO_DMA_DEPTH) + if (ai_fifo_rpos >= AUDIO_DMA_DEPTH) { - audio_fifo_rpos = 0; + ai_fifo_rpos = 0; } - if (audio_fifo_num < AUDIO_DMA_DEPTH) + if (ai_fifo_num < AUDIO_DMA_DEPTH) { ai_status &= ~0x80000001; // FIFO not full - signal_rcp_interrupt(machine, AI_INTERRUPT); + signal_rcp_interrupt(AI_INTERRUPT); } } -static AUDIO_DMA *audio_fifo_get_top(void) +n64_periphs::AUDIO_DMA *n64_periphs::ai_fifo_get_top() { - if (audio_fifo_num > 0) + if (ai_fifo_num > 0) { - return &audio_fifo[audio_fifo_rpos]; + return &ai_fifo[ai_fifo_rpos]; } else { @@ -1100,10 +1082,10 @@ #define N64_ATTOTIME_NORMALIZE(a) do { while ((a).attoseconds >= ATTOSECONDS_PER_SECOND) { (a).seconds++; (a).attoseconds -= ATTOSECONDS_PER_SECOND; } } while (0) -static void start_audio_dma(running_machine &machine) +void n64_periphs::ai_dma() { INT16 *ram = (INT16*)rdram; - AUDIO_DMA *current = audio_fifo_get_top(); + AUDIO_DMA *current = ai_fifo_get_top(); attotime period; //static FILE * audio_dump = NULL; @@ -1117,26 +1099,29 @@ // mame_printf_debug("DACDMA: %x for %x bytes\n", current->address, current->length); - dmadac[0] = machine.device("dac1"); - dmadac[1] = machine.device("dac2"); - dmadac_transfer(&dmadac[0], 2, 1, 2, current->length/4, ram); + dmadac_transfer(&ai_dac[0], 2, 1, 2, current->length/4, ram); ai_status |= 0x40000000; // adjust the timer period = attotime::from_hz(DACRATE_NTSC) * ((ai_dacrate + 1) * (current->length / 4)); - audio_timer->adjust(period); + ai_timer->adjust(period); +} + +static TIMER_CALLBACK(ai_timer_callback) +{ + machine.device("rcp")->ai_timer_tick(); } -static TIMER_CALLBACK( audio_timer_callback ) +void n64_periphs::ai_timer_tick() { - audio_fifo_pop(machine); + ai_fifo_pop(); // keep playing if there's another DMA queued - if (audio_fifo_get_top() != NULL) + if (ai_fifo_get_top() != NULL) { - start_audio_dma(machine); - signal_rcp_interrupt(machine, AI_INTERRUPT); + ai_dma(); + signal_rcp_interrupt(AI_INTERRUPT); } else { @@ -1144,8 +1129,9 @@ } } -READ32_HANDLER( n64_ai_reg_r ) +READ32_MEMBER( n64_periphs::ai_reg_r ) { + //printf("ai_reg_r %08x\n", offset * 4); switch (offset) { case 0x04/4: // AI_LEN_REG @@ -1156,7 +1142,7 @@ } else if (ai_status & 0x40000000) { - double secs_left = (audio_timer->expire() - space->machine().time()).as_double(); + double secs_left = (ai_timer->expire() - machine().time()).as_double(); unsigned int samples_left = secs_left * DACRATE_NTSC / (ai_dacrate + 1); return samples_left * 4; } @@ -1167,53 +1153,48 @@ return ai_status; default: - logerror("ai_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); + logerror("ai_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu)); break; } return 0; } -WRITE32_HANDLER( n64_ai_reg_w ) +WRITE32_MEMBER( n64_periphs::ai_reg_w ) { -// UINT16 *ram = (UINT16*)rdram; - + //printf("ai_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); switch (offset) { case 0x00/4: // AI_DRAM_ADDR_REG -// mame_printf_debug("ai_dram_addr = %08X at %08X\n", data, cpu_get_pc(&space->device())); ai_dram_addr = data & 0xffffff; break; case 0x04/4: // AI_LEN_REG -// mame_printf_debug("ai_len = %08X at %08X\n", data, cpu_get_pc(&space->device())); ai_len = data & 0x3ffff; // Hardware v2.0 has 18 bits, v1.0 has 15 bits - audio_fifo_push(space->machine(), ai_dram_addr, ai_len); + ai_fifo_push(ai_dram_addr, ai_len); break; case 0x08/4: // AI_CONTROL_REG -// mame_printf_debug("ai_control = %08X at %08X\n", data, cpu_get_pc(&space->device())); ai_control = data; break; case 0x0c/4: - clear_rcp_interrupt(space->machine(), AI_INTERRUPT); + clear_rcp_interrupt(AI_INTERRUPT); break; case 0x10/4: // AI_DACRATE_REG ai_dacrate = data & 0x3fff; - dmadac_set_frequency(&dmadac[0], 2, (double)DACRATE_NTSC / (double)(ai_dacrate+1)); - printf( "frequency: %f\n", (double)DACRATE_NTSC / (double)(ai_dacrate+1) ); - dmadac_enable(&dmadac[0], 2, 1); + dmadac_set_frequency(&ai_dac[0], 2, (double)DACRATE_NTSC / (double)(ai_dacrate+1)); + //printf( "frequency: %f\n", (double)DACRATE_NTSC / (double)(ai_dacrate+1) ); + dmadac_enable(&ai_dac[0], 2, 1); break; case 0x14/4: // AI_BITRATE_REG -// mame_printf_debug("ai_bitrate = %08X\n", data); ai_bitrate = data & 0xf; break; default: - logerror("ai_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); + logerror("ai_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } @@ -1221,22 +1202,79 @@ // Peripheral Interface -static UINT32 pi_dram_addr, pi_cart_addr; -static UINT32 pi_first_dma = 1; -static UINT32 pi_rd_len = 0; -static UINT32 pi_wr_len = 0; -static UINT32 pi_status = 0; -static UINT32 pi_bsd_dom1_lat = 0; -static UINT32 pi_bsd_dom1_pwd = 0; -static UINT32 pi_bsd_dom1_pgs = 0; -static UINT32 pi_bsd_dom1_rls = 0; -static UINT32 pi_bsd_dom2_lat = 0; -static UINT32 pi_bsd_dom2_pwd = 0; -static UINT32 pi_bsd_dom2_pgs = 0; -static UINT32 pi_bsd_dom2_rls = 0; +static TIMER_CALLBACK(pi_dma_callback) +{ + machine.device("rcp")->pi_dma_tick(); +} + +void n64_periphs::pi_dma_tick() +{ + UINT16 *cart16 = (UINT16*)machine().region("user2")->base(); + UINT16 *dram16 = (UINT16*)rdram; + + UINT32 cart_addr = (pi_cart_addr & 0x0fffffff) >> 1; + UINT32 dram_addr = (pi_dram_addr & 0x007fffff) >> 1; -READ32_HANDLER( n64_pi_reg_r ) + cart_addr &= ((machine().region("user2")->bytes() >> 1) - 1); + + if(pi_dma_dir == 1) + { + UINT32 dma_length = pi_wr_len + 1; + if (dma_length & 3) + { + dma_length = (dma_length + 3) & ~3; + } + + if (pi_dram_addr != 0xffffffff) + { + for(int i = 0; i < dma_length / 2; i++) + { + dram16[BYTE_XOR_BE(dram_addr + i)] = cart16[BYTE_XOR_BE(cart_addr + i)]; + } + + pi_cart_addr += dma_length; + pi_dram_addr += dma_length; + } + + if (pi_first_dma) + { + // TODO: CIC-6105 has different address... + mem_map->write_dword(0x00000318, 0x400000); + mem_map->write_dword(0x000003f0, 0x800000); + pi_first_dma = 0; + } + } + else + { + UINT32 dma_length = pi_rd_len + 1; + if (dma_length & 3) + { + dma_length = (dma_length + 3) & ~3; + } + + if (pi_dram_addr != 0xffffffff) + { + for(int i = 0; i < dma_length / 2; i++) + { + cart16[BYTE_XOR_BE(cart_addr + i)] = dram16[BYTE_XOR_BE(dram_addr + i)]; + } + + pi_cart_addr += dma_length; + pi_dram_addr += dma_length; + } + } + + pi_status &= ~1; // Clear DMA_BUSY + pi_status |= 8; // Set INTERRUPT + + signal_rcp_interrupt(PI_INTERRUPT); + + pi_dma_timer->adjust(attotime::never); +} + +READ32_MEMBER( n64_periphs::pi_reg_r ) { + //printf("pi_reg_r %08x\n", offset * 4); switch (offset) { case 0x00/4: // PI_DRAM_ADDR_REG @@ -1273,14 +1311,15 @@ return pi_bsd_dom2_rls; default: - logerror("pi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); + logerror("pi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu)); break; } return 0; } -WRITE32_HANDLER( n64_pi_reg_w ) +WRITE32_MEMBER( n64_periphs::pi_reg_w ) { + //printf("pi_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); switch (offset) { case 0x00/4: // PI_DRAM_ADDR_REG @@ -1297,70 +1336,25 @@ case 0x08/4: // PI_RD_LEN_REG { - int i; - UINT32 dma_length = (data + 1); pi_rd_len = data; + pi_dma_dir = 0; + pi_status |= 1; - /*if (dma_length & 3) - { - dma_length = (dma_length + 3) & ~3; - }*/ - - //mame_printf_debug("PI DMA: %08X to %08X, length %08X\n", pi_dram_addr, pi_cart_addr, dma_length); - - if (pi_dram_addr != 0xffffffff) - { - for (i=0; i < dma_length; i++) - { - UINT8 b = space->read_byte(pi_dram_addr); - space->write_byte(pi_cart_addr & 0x1fffffff, b); - pi_cart_addr += 1; - pi_dram_addr += 1; - } - } - - signal_rcp_interrupt(space->machine(), PI_INTERRUPT); + attotime dma_period = attotime::from_hz(93750000) * (pi_rd_len + 1) * 3; + //printf("want read dma in %d\n", (pi_rd_len + 1)); + pi_dma_timer->adjust(dma_period); break; } case 0x0c/4: // PI_WR_LEN_REG { - int i; - UINT32 dma_length = (data + 1); pi_wr_len = data; + pi_dma_dir = 1; + pi_status |= 1; - if (dma_length & 3) - { - dma_length = (dma_length + 3) & ~3; - } - - //printf("PI DMA: %08X to %08X, length %08X\n", pi_cart_addr, pi_dram_addr, dma_length); - - if (pi_dram_addr != 0xffffffff) - { - for (i=0; i < dma_length; i++) - { - /*UINT32 d = space->read_dword(pi_cart_addr); - space->write_dword(pi_dram_addr, d); - pi_cart_addr += 4; - pi_dram_addr += 4;*/ - - UINT8 b = space->read_byte(pi_cart_addr); - space->write_byte(pi_dram_addr & 0x1fffffff, b); - pi_cart_addr += 1; - pi_dram_addr += 1; - } - } - signal_rcp_interrupt(space->machine(), PI_INTERRUPT); - - if (pi_first_dma) - { - // TODO: CIC-6105 has different address... - space->write_dword(0x00000318, 0x400000); - space->write_dword(0x000003f0, 0x800000); - pi_first_dma = 0; - } - + attotime dma_period = attotime::from_hz(93750000) * (pi_wr_len + 1) * 3; + //printf("want write dma in %d\n", (pi_wr_len + 1)); + pi_dma_timer->adjust(dma_period); break; } @@ -1368,7 +1362,8 @@ { if (data & 0x2) { - clear_rcp_interrupt(space->machine(), PI_INTERRUPT); + pi_status &= ~8; // Clear INTERRUPT + clear_rcp_interrupt(PI_INTERRUPT); } break; } @@ -1406,122 +1401,44 @@ break; default: - logerror("pi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); + logerror("pi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); break; } } // RDRAM Interface -static UINT32 ri_mode = 0; -static UINT32 ri_config = 0; -static UINT32 ri_current_load = 0; -static UINT32 ri_select = 0; -static UINT32 ri_count = 0; -static UINT32 ri_latency = 0; -static UINT32 ri_rerror = 0; -static UINT32 ri_werror = 0; -READ32_HANDLER( n64_ri_reg_r ) +READ32_MEMBER( n64_periphs::ri_reg_r ) { - //printf( "n64_ri_reg_r: 0x%02x/4 (%08x)\n", offset << 2, mem_mask ); - switch (offset) + //printf("ri_reg_r %08x\n", offset * 4); + if(offset > 0x1c/4) { - case 0x00/4: // RI_MODE_REG - return ri_mode; - - case 0x04/4: // RI_CONFIG_REG - return ri_config; - - case 0x08/4: // RI_CURRENT_LOAD_REG - return ri_current_load; - - case 0x0c/4: // RI_SELECT_REG - return ri_select; - - case 0x10/4: // RI_COUNT_REG - return ri_count; - - case 0x14/4: // RI_LATENCY_REG - return ri_latency; - - case 0x18/4: // RI_RERROR_REG - return ri_rerror; - - case 0x1c/4: // RI_WERROR_REG - return ri_werror; - - default: - logerror("ri_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&space->device())); - break; + logerror("ri_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu)); + return 0; } - - return 0; + return ri_regs[offset]; } -WRITE32_HANDLER( n64_ri_reg_w ) +WRITE32_MEMBER( n64_periphs::ri_reg_w ) { - //printf( "n64_ri_reg_w: 0x%02x/4 = %08x (%08x)\n", offset << 2, data, mem_mask ); - switch (offset) + //printf("ri_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); + if(offset > 0x1c/4) { - case 0x00/4: // RI_MODE_REG - ri_mode = data; - break; - - case 0x04/4: // RI_CONFIG_REG - ri_config = data; - break; - - case 0x08/4: // RI_CURRENT_LOAD_REG - ri_current_load = data; - break; - - case 0x0c/4: // RI_SELECT_REG - ri_select = data; - break; - - case 0x10/4: // RI_COUNT_REG - ri_count = data; - break; - - case 0x14/4: // RI_LATENCY_REG - ri_latency = data; - break; - - case 0x18/4: // RI_RERROR_REG - ri_rerror = data; - break; - - case 0x1c/4: // RI_WERROR_REG - ri_werror = data; - break; - - default: - logerror("ri_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(&space->device())); - break; + logerror("ri_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu)); + return; } + COMBINE_DATA(&ri_regs[offset]); } // Serial Interface -static UINT8 pif_ram[0x40]; -static UINT8 pif_cmd[0x40]; -static UINT32 si_dram_addr = 0; -static UINT32 si_pif_addr = 0; -static UINT32 si_pif_addr_rd64b = 0; -static UINT32 si_pif_addr_wr64b = 0; -static UINT32 si_status = 0; - -static UINT8 eeprom[512]; -static UINT8 mempack[0x8000]; - -static UINT8 calc_mempack_crc(UINT8 *buffer, int length) +UINT8 n64_periphs::calc_mempack_crc(UINT8 *buffer, int length) { - int i, j; UINT32 crc = 0; UINT32 temp2 = 0; - for (i=0; i <= length; i++) + for(int i = 0; i <= length; i++) { - for (j=7; j >= 0; j--) + for(int j = 7; j >= 0; j--) { if ((crc & 0x80) != 0) { @@ -1553,20 +1470,14 @@ return crc; } -static int pif_channel_handle_command(running_machine &machine, int channel, int slength, UINT8 *sdata, int rlength, UINT8 *rdata) +int n64_periphs::pif_channel_handle_command(int channel, int slength, UINT8 *sdata, int rlength, UINT8 *rdata) { - int i; UINT8 command = sdata[0]; switch (command) { case 0x00: // Read status { - if (slength != 1 || rlength != 3) - { - // osd_die("handle_pif: read status (bytes to send %d, bytes to receive %d)\n", bytes_to_send, bytes_to_recv); - } - switch (channel) { case 0: @@ -1588,9 +1499,6 @@ rdata[0] = 0x00; rdata[1] = 0x80; rdata[2] = 0x00; - //rdata[0] = 0xff; - //rdata[1] = 0xff; - //rdata[2] = 0xff; return 1; } @@ -1621,9 +1529,9 @@ case 0: //p1 inputs case 1: //p2 inputs { - buttons = input_port_read(machine, portnames[(channel*3) + 0]); - x = input_port_read(machine, portnames[(channel*3) + 1]) - 128; - y = input_port_read(machine, portnames[(channel*3) + 2]) - 128; + buttons = input_port_read(machine(), portnames[(channel*3) + 0]); + x = input_port_read(machine(), portnames[(channel*3) + 1]) - 128; + y = input_port_read(machine(), portnames[(channel*3) + 2]) - 128; rdata[0] = (buttons >> 8) & 0xff; rdata[1] = (buttons >> 0) & 0xff; @@ -1646,51 +1554,32 @@ { UINT32 address; - /*mame_printf_debug("Read from mempack, rlength = %d, slength = %d\n", rlength, slength); - for (i=0; i < slength; i++) - { - mame_printf_debug("%02X ", sdata[i]); - } - mame_printf_debug("\n");*/ - address = (sdata[1] << 8) | (sdata[2]); -// checksum = address & 0x1f; address &= ~0x1f; - if (address == 0x400) + if(address == 0x400) { - for (i=0; i < rlength-1; i++) + for(int i = 0; i < rlength-1; i++) { rdata[i] = 0x00; } rdata[rlength-1] = calc_mempack_crc(rdata, rlength-1); - // mame_printf_debug("CRC = %02X\n", rdata[rlength-1]); } - else if (address < 0x7fe0) + else if(address < 0x7fe0) { - for (i=0; i < rlength-1; i++) + for(int i = 0; i < rlength-1; i++) { rdata[i] = mempack[address+i]; } rdata[rlength-1] = calc_mempack_crc(rdata, rlength-1); - // mame_printf_debug("CRC = %02X\n", rdata[rlength-1]); } return 1; } case 0x03: { - UINT32 address; - /*mame_printf_debug("Write to mempack, rlength = %d, slength = %d\n", rlength, slength); - for (i=0; i < slength; i++) - { - mame_printf_debug("%02X ", sdata[i]); - } - mame_printf_debug("\n");*/ - - address = (sdata[1] << 8) | (sdata[2]); -// checksum = address & 0x1f; + UINT32 address = (sdata[1] << 8) | (sdata[2]); address &= ~0x1f; if (address == 0x8000) @@ -1699,7 +1588,7 @@ } else { - for (i=3; i < slength; i++) + for(int i = 3; i < slength; i++) { mempack[address++] = sdata[i]; } @@ -1712,11 +1601,8 @@ case 0x04: // Read from EEPROM { - UINT8 block_offset; - if (channel != 4) { - //fatalerror("Tried to write to EEPROM on channel %d\n", channel); return 1; } @@ -1725,9 +1611,9 @@ fatalerror("handle_pif: write EEPROM (bytes to send %d, bytes to receive %d)\n", slength, rlength); } - block_offset = sdata[1] * 8; + UINT8 block_offset = sdata[1] * 8; - for (i=0; i < 8; i++) + for(int i=0; i < 8; i++) { rdata[i] = eeprom[block_offset+i]; } @@ -1737,11 +1623,8 @@ case 0x05: // Write to EEPROM { - UINT8 block_offset; - if (channel != 4) { - //fatalerror("Tried to write to EEPROM on channel %d\n", channel); return 1; } @@ -1750,16 +1633,11 @@ fatalerror("handle_pif: write EEPROM (bytes to send %d, bytes to receive %d)\n", slength, rlength); } - block_offset = sdata[1] * 8; - //mame_printf_debug("Write EEPROM: offset %02X: ", block_offset); - for (i=0; i < 8; i++) + UINT8 block_offset = sdata[1] * 8; + for(int i = 0; i < 8; i++) { - //mame_printf_debug("%02X ", sdata[2+i]); eeprom[block_offset+i] = sdata[2+i]; } - //mame_printf_debug("\n"); - - //rdata[0] = 0; return 1; } @@ -1782,34 +1660,17 @@ return 0; } -static void handle_pif(running_machine &machine) +void n64_periphs::handle_pif() { - int j; - - /* - { - int i; - for (i=0; i < 8; i++) - { - int j = i * 8; - mame_printf_debug("PIFCMD%d: %02X %02X %02X %02X %02X %02X %02X %02X\n", i, pif_cmd[j], pif_cmd[j+1], pif_cmd[j+2], pif_cmd[j+3], pif_cmd[j+4], pif_cmd[j+5], pif_cmd[j+6], pif_cmd[j+7]); - } - mame_printf_debug("\n"); - } - */ - - if (pif_cmd[0x3f] == 0x1) // only handle the command if the last byte is 1 + if(pif_cmd[0x3f] == 0x1) // only handle the command if the last byte is 1 { int channel = 0; int end = 0; int cmd_ptr = 0; - while (cmd_ptr < 0x3f && !end) + while(cmd_ptr < 0x3f && !end) { - UINT8 bytes_to_send; - INT8 bytes_to_recv; - - bytes_to_send = pif_cmd[cmd_ptr++]; + UINT8 bytes_to_send = pif_cmd[cmd_ptr++]; if (bytes_to_send == 0xfe) { @@ -1821,20 +1682,19 @@ } else { - if (bytes_to_send > 0 && (bytes_to_send & 0xc0) == 0) + if(bytes_to_send > 0 && (bytes_to_send & 0xc0) == 0) { - int res; UINT8 recv_buffer[0x40]; UINT8 send_buffer[0x40]; - bytes_to_recv = pif_cmd[cmd_ptr++]; + UINT8 bytes_to_recv = pif_cmd[cmd_ptr++]; - for (j=0; j < bytes_to_send; j++) + for(int j = 0; j < bytes_to_send; j++) { send_buffer[j] = pif_cmd[cmd_ptr++]; } - res = pif_channel_handle_command(machine, channel, bytes_to_send, send_buffer, bytes_to_recv, recv_buffer); + int res = pif_channel_handle_command(channel, bytes_to_send, send_buffer, bytes_to_recv, recv_buffer); if (res == 0) { @@ -1842,7 +1702,7 @@ { fatalerror("cmd_ptr overflow\n"); } - for (j=0; j < bytes_to_recv; j++) + for(int j = 0; j < bytes_to_recv; j++) { pif_ram[cmd_ptr++] = recv_buffer[j]; } @@ -1860,23 +1720,10 @@ pif_ram[0x3f] = 0; } - - /* - { - int i; - for (i=0; i < 8; i++) - { - int j = i * 8; - mame_printf_debug("PIFRAM%d: %02X %02X %02X %02X %02X %02X %02X %02X\n", i, pif_ram[j], pif_ram[j+1], pif_ram[j+2], pif_ram[j+3], pif_ram[j+4], pif_ram[j+5], pif_ram[j+6], pif_ram[j+7]); - } - mame_printf_debug("\n"); - } - */ } -static void pif_dma(running_machine &machine, int direction) +void n64_periphs::pif_dma(int direction) { - int i; UINT32 *src, *dst; if (si_dram_addr & 0x3) @@ -1888,7 +1735,7 @@ { src = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; - for (i=0; i < 64; i+=4) + for(int i = 0; i < 64; i+=4) { UINT32 d = *src++; pif_ram[i+0] = (d >> 24) & 0xff; @@ -1901,11 +1748,11 @@ } else // PIF RAM -> RDRAM { - handle_pif(machine); + handle_pif(); dst = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; - for (i=0; i < 64; i+=4) + for(int i = 0; i < 64; i+=4) { UINT32 d = 0; d |= pif_ram[i+0] << 24; @@ -1918,11 +1765,12 @@ } si_status |= 0x1000; - signal_rcp_interrupt(machine, SI_INTERRUPT); + signal_rcp_interrupt(SI_INTERRUPT); } -READ32_HANDLER( n64_si_reg_r ) +READ32_MEMBER( n64_periphs::si_reg_r ) { + //printf("si_reg_r %08x\n", offset * 4); switch (offset) { //case 0x00/4: // SI_DRAM_ADDR_REG @@ -1934,32 +1782,32 @@ return 0; } -WRITE32_HANDLER( n64_si_reg_w ) +WRITE32_MEMBER( n64_periphs::si_reg_w ) { + //printf("si_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask); switch (offset) { case 0x00/4: // SI_DRAM_ADDR_REG si_dram_addr = data; - // mame_printf_debug("si_dram_addr = %08X\n", si_dram_addr); break; case 0x04/4: // SI_PIF_ADDR_RD64B_REG // PIF RAM -> RDRAM si_pif_addr = data; si_pif_addr_rd64b = data; - pif_dma(space->machine(), 0); + pif_dma(0); break; case 0x10/4: // SI_PIF_ADDR_WR64B_REG // RDRAM -> PIF RAM si_pif_addr = data; si_pif_addr_wr64b = data; - pif_dma(space->machine(), 1); + pif_dma(1); break; case 0x18/4: // SI_STATUS_REG si_status &= ~0x1000; - clear_rcp_interrupt(space->machine(), SI_INTERRUPT); + clear_rcp_interrupt(SI_INTERRUPT); break; default: @@ -1968,12 +1816,9 @@ } } -static UINT32 cic_status = 0x00000000; - -READ32_HANDLER( n64_pif_ram_r ) +READ32_MEMBER( n64_periphs::pif_ram_r ) { - /*mame_printf_debug( "pif_ram_r: %08X, %08X = %08X\n", offset << 2, mem_mask, ( ( pif_ram[offset*4+0] << 24 ) | ( pif_ram[offset*4+1] << 16 ) | ( pif_ram[offset*4+2] << 8 ) | ( pif_ram[offset*4+3] << 0 ) ) & mem_mask );*/ - if(!space->debugger_access()) + if(!space.debugger_access()) { if( offset == ( 0x24 / 4 ) ) { @@ -1987,9 +1832,8 @@ return ( ( pif_ram[offset*4+0] << 24 ) | ( pif_ram[offset*4+1] << 16 ) | ( pif_ram[offset*4+2] << 8 ) | ( pif_ram[offset*4+3] << 0 ) ) & mem_mask; } -WRITE32_HANDLER( n64_pif_ram_w ) +WRITE32_MEMBER( n64_periphs::pif_ram_w ) { - /*mame_printf_debug("pif_ram_w: %08X, %08X, %08X\n", data, offset << 4, mem_mask);*/ if( mem_mask & 0xff000000 ) { pif_ram[offset*4+0] = ( data >> 24 ) & 0x000000ff; @@ -2007,140 +1851,25 @@ pif_ram[offset*4+3] = ( data >> 0 ) & 0x000000ff; } - signal_rcp_interrupt(space->machine(), SI_INTERRUPT); + signal_rcp_interrupt(SI_INTERRUPT); } //static UINT16 crc_seed = 0x3f; MACHINE_START( n64 ) { - mips3drc_set_options(machine.device("maincpu"), MIPS3DRC_FASTEST_OPTIONS + MIPS3DRC_STRICT_VERIFY); + mips3drc_set_options(machine.device("maincpu"), MIPS3DRC_FASTEST_OPTIONS + MIPS3DRC_STRICT_VERIFY + MIPS3DRC_STRICT_COP1); /* configure fast RAM regions for DRC */ mips3drc_add_fastram(machine.device("maincpu"), 0x00000000, 0x007fffff, FALSE, rdram); rspdrc_set_options(machine.device("rsp"), RSPDRC_STRICT_VERIFY); rspdrc_flush_drc_cache(machine.device("rsp")); - - audio_timer = machine.scheduler().timer_alloc(FUNC(audio_timer_callback)); + rspdrc_add_dmem(machine.device("rsp"), rsp_dmem); + rspdrc_add_imem(machine.device("rsp"), rsp_imem); } MACHINE_RESET( n64 ) { - int i; - UINT32 *cart = (UINT32*)machine.region("user2")->base(); - UINT64 boot_checksum; - - mi_version = 0; - mi_interrupt = 0; - mi_intr_mask = 0; - mi_mode = 0; - - sp_mem_addr = 0; - sp_dram_addr = 0; - sp_dma_length = 0; - sp_dma_count = 0; - sp_dma_skip = 0; - sp_semaphore = 0; - - n64_vi_width = 0; - n64_vi_origin = 0; - n64_vi_control = 0; - n64_vi_burst = n64_vi_vsync = n64_vi_hsync = n64_vi_leap = n64_vi_hstart = n64_vi_vstart = 0; - n64_vi_intr = n64_vi_vburst = n64_vi_xscale = n64_vi_yscale = 0; - - ai_dram_addr = 0; - ai_len = 0 ; - ai_control = 0; - ai_dacrate = 0; - ai_bitrate = 0; - ai_status = 0; - - memset(audio_fifo, 0, sizeof(audio_fifo)); - audio_fifo_wpos = 0; - audio_fifo_rpos = 0; - audio_fifo_num = 0; - - pi_dram_addr = 0; - pi_cart_addr = 0; - pi_first_dma = 1; - - memset(pif_ram, 0, sizeof(pif_ram)); - memset(pif_cmd, 0, sizeof(pif_cmd)); - si_dram_addr = 0; - si_pif_addr = 0; - si_status = 0; - - memset(eeprom, 0, sizeof(eeprom)); - memset(mempack, 0, sizeof(mempack)); - - cic_status = 0; - - audio_timer->adjust(attotime::never); - cputag_set_input_line(machine, "rsp", INPUT_LINE_HALT, ASSERT_LINE); - - // bootcode differs between CIC-chips, so we can use its checksum to detect the CIC-chip - boot_checksum = 0; - for (i=0x40; i < 0x1000; i+=4) - { - boot_checksum += cart[i/4]+i; - } - - if (boot_checksum == U64(0x000000d057e84864)) - { - // CIC-NUS-6101 - printf("CIC-NUS-6102 detected\n"); - pif_ram[0x24] = 0x00; - pif_ram[0x25] = 0x02; - pif_ram[0x26] = 0x3f; - pif_ram[0x27] = 0x3f; - // crc_seed = 0x3f; - } - else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31)) - { - // CIC-NUS-6103 - printf("CIC-NUS-6101 detected\n"); - // crc_seed = 0x78; - pif_ram[0x24] = 0x00; - pif_ram[0x25] = 0x06; - pif_ram[0x26] = 0x3f; - pif_ram[0x27] = 0x3f; - } - else if (boot_checksum == U64(0x000000d6499e376b)) - { - // CIC-NUS-6103 - printf("CIC-NUS-6103 detected\n"); - // crc_seed = 0x78; - pif_ram[0x24] = 0x00; - pif_ram[0x25] = 0x02; - pif_ram[0x26] = 0x78; - pif_ram[0x27] = 0x3f; - } - else if (boot_checksum == U64(0x0000011a4a1604b6)) - { - // CIC-NUS-6105 - printf("CIC-NUS-6105 detected\n"); - // crc_seed = 0x91; - - // first_rsp = 0; - pif_ram[0x24] = 0x00; - pif_ram[0x25] = 0x02; - pif_ram[0x26] = 0x91; - pif_ram[0x27] = 0x3f; - } - else if (boot_checksum == U64(0x000000d6d5de4ba0)) - { - // CIC-NUS-6106 - printf("CIC-NUS-6106 detected\n"); - // crc_seed = 0x85; - pif_ram[0x24] = 0x00; - pif_ram[0x25] = 0x02; - pif_ram[0x26] = 0x85; - pif_ram[0x27] = 0x3f; - } - else - { - printf("Unknown BootCode Checksum %08X%08X\n", (UINT32)(boot_checksum>>32),(UINT32)(boot_checksum)); - } } diff -Nru mame-0.144/src/mame/machine/nb1413m3.c mame-0.145/src/mame/machine/nb1413m3.c --- mame-0.144/src/mame/machine/nb1413m3.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/nb1413m3.c 2012-02-06 21:30:43.000000000 +0000 @@ -192,22 +192,6 @@ INTERRUPT_GEN( nb1413m3_interrupt ) { -#if 0 - if (!cpu_getiloops(device)) - { -// nb1413m3_busyflag = 1; -// nb1413m3_busyctr = 0; - device_set_input_line(device, 0, HOLD_LINE); - } - if (nb1413m3_nmi_enable) - { - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - } - - #if NB1413M3_CHEAT - #include "nbmjchet.inc" - #endif -#else // nb1413m3_busyflag = 1; // nb1413m3_busyctr = 0; device_set_input_line(device, 0, HOLD_LINE); @@ -220,7 +204,6 @@ #if NB1413M3_CHEAT #include "nbmjchet.inc" #endif -#endif } READ8_HANDLER( nb1413m3_sndrom_r ) diff -Nru mame-0.144/src/mame/machine/nb1414m4.c mame-0.145/src/mame/machine/nb1414m4.c --- mame-0.144/src/mame/machine/nb1414m4.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/nb1414m4.c 2012-02-06 21:30:43.000000000 +0000 @@ -300,5 +300,5 @@ } /* mark tiles dirty */ - tilemap_mark_all_tiles_dirty(tilemap); + tilemap->mark_all_dirty(); } diff -Nru mame-0.144/src/mame/machine/pgmprot.c mame-0.145/src/mame/machine/pgmprot.c --- mame-0.144/src/mame/machine/pgmprot.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/pgmprot.c 2012-02-06 21:30:43.000000000 +0000 @@ -912,7 +912,7 @@ READ16_HANDLER( oldsplus_r ) { - oldsplus_state *state = space->machine().driver_data(); + pgm_state *state = space->machine().driver_data(); if (offset == 0) { @@ -936,7 +936,7 @@ WRITE16_HANDLER( oldsplus_w ) { - oldsplus_state *state = space->machine().driver_data(); + pgm_state *state = space->machine().driver_data(); if (offset == 0) { @@ -1130,3 +1130,199 @@ } } } + +/* Old KOV and bootlegs sim ... really these should be read out... */ + +static const UINT8 kov_BATABLE[0x40] = { + 0x00,0x29,0x2c,0x35,0x3a,0x41,0x4a,0x4e,0x57,0x5e,0x77,0x79,0x7a,0x7b,0x7c,0x7d, + 0x7e,0x7f,0x80,0x81,0x82,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x90, + 0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9e,0xa3,0xd4,0xa9,0xaf,0xb5,0xbb,0xc1 +}; + +static const UINT8 kov_B0TABLE[16] = { 2, 0, 1, 4, 3 }; // Maps char portraits to tables + +static UINT32 kov_slots[16]; +static UINT16 kov_internal_slot; +static UINT16 kov_key; +static UINT32 kov_response; +static UINT16 kov_value; + +static UINT16 kov_c0_value; +static UINT16 kov_cb_value; +static UINT16 kov_fe_value; + +WRITE16_HANDLER( kov_asic_sim_w ) +{ + switch ((offset*2) & 0x06) + { + case 0: kov_value = data; return; + + case 2: + { + if ((data >> 8) == 0xff) kov_key = 0xffff; + + kov_value ^= kov_key; + + // bprintf (PRINT_NORMAL, _T("ASIC27 command: %2.2x data: %4.4x\n"), (data ^ kov_key) & 0xff, kov_value); + + switch ((data ^ kov_key) & 0xff) + { + case 0x67: // unknown or status check? + case 0x8e: + case 0xa3: + case 0x33: // kovsgqyz (a3) + case 0x3a: // kovplus + case 0xc5: // kovplus + kov_response = 0x880000; + break; + + case 0x99: // Reset + kov_response = 0x880000; + kov_key = 0; + break; + + case 0x9d: // Sprite palette offset + kov_response = 0xa00000 + ((kov_value & 0x1f) * 0x40); + break; + + case 0xb0: // Read from data table + kov_response = kov_B0TABLE[kov_value & 0x0f]; + break; + + case 0xb4: // Copy slot 'a' to slot 'b' + case 0xb7: // kovsgqyz (b4) + { + kov_response = 0x880000; + + if (kov_value == 0x0102) kov_value = 0x0100; // why? + + kov_slots[(kov_value >> 8) & 0x0f] = kov_slots[(kov_value >> 0) & 0x0f]; + } + break; + + case 0xba: // Read from data table + kov_response = kov_BATABLE[kov_value & 0x3f]; + break; + + case 0xc0: // Text layer 'x' select + kov_response = 0x880000; + kov_c0_value = kov_value; + break; + + case 0xc3: // Text layer offset + kov_response = 0x904000 + ((kov_c0_value + (kov_value * 0x40)) * 4); + break; + + case 0xcb: // Background layer 'x' select + kov_response = 0x880000; + kov_cb_value = kov_value; + break; + + case 0xcc: // Background layer offset + if (kov_value & 0x400) kov_value = -(0x400 - (kov_value & 0x3ff)); + kov_response = 0x900000 + ((kov_cb_value + (kov_value * 0x40)) * 4); + break; + + case 0xd0: // Text palette offset + case 0xcd: // kovsgqyz (d0) + kov_response = 0xa01000 + (kov_value * 0x20); + break; + + case 0xd6: // Copy slot to slot 0 + kov_response = 0x880000; + kov_slots[0] = kov_slots[kov_value & 0x0f]; + break; + + case 0xdc: // Background palette offset + case 0x11: // kovsgqyz (dc) + kov_response = 0xa00800 + (kov_value * 0x40); + break; + + case 0xe0: // Sprite palette offset + case 0x9e: // kovsgqyz (e0) + kov_response = 0xa00000 + ((kov_value & 0x1f) * 0x40); + break; + + case 0xe5: // Write slot (low) + { + kov_response = 0x880000; + + INT32 sel = (kov_internal_slot >> 12) & 0x0f; + kov_slots[sel] = (kov_slots[sel] & 0x00ff0000) | ((kov_value & 0xffff) << 0); + } + break; + + case 0xe7: // Write slot (and slot select) (high) + { + kov_response = 0x880000; + kov_internal_slot = kov_value; + + INT32 sel = (kov_internal_slot >> 12) & 0x0f; + kov_slots[sel] = (kov_slots[sel] & 0x0000ffff) | ((kov_value & 0x00ff) << 16); + } + break; + + case 0xf0: // Some sort of status read? + kov_response = 0x00c000; + break; + + case 0xf8: // Read slot + case 0xab: // kovsgqyz (f8) + kov_response = kov_slots[kov_value & 0x0f] & 0x00ffffff; + break; + + case 0xfc: // Adjust damage level to char experience level + kov_response = (kov_value * kov_fe_value) >> 6; + break; + + case 0xfe: // Damage level adjust + kov_response = 0x880000; + kov_fe_value = kov_value; + break; + + default: + kov_response = 0x880000; + // bprintf (PRINT_NORMAL, _T("Unknown ASIC27 command: %2.2x data: %4.4x\n"), (data ^ kov_key) & 0xff, kov_value); + break; + } + + kov_key = (kov_key + 0x0100) & 0xff00; + if (kov_key == 0xff00) kov_key = 0x0100; + kov_key |= kov_key >> 8; + } + return; + + case 4: return; + } +} + +READ16_HANDLER( kov_asic_sim_r ) +{ + switch ((offset*2) & 0x02) + { + case 0: return (kov_response >> 0) ^ kov_key; + case 2: return (kov_response >> 16) ^ kov_key; + } + + return 0; +} + +MACHINE_RESET( kov ) +{ + kov_internal_slot = 0; + kov_key = 0; + kov_response = 0; + kov_value = 0; + + kov_c0_value = 0; + kov_cb_value = 0; + kov_fe_value = 0; + + cputag_set_input_line(machine, "soundcpu", INPUT_LINE_HALT, ASSERT_LINE); +} + +void install_protection_asic_sim_kov(running_machine &machine) +{ + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x500000, 0x500003, FUNC(kov_asic_sim_r), FUNC(kov_asic_sim_w)); + machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(0x4f0000, 0x4fffff, FUNC(sango_protram_r)); +} diff -Nru mame-0.144/src/mame/machine/playch10.c mame-0.145/src/mame/machine/playch10.c --- mame-0.144/src/mame/machine/playch10.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/playch10.c 2012-02-06 21:30:43.000000000 +0000 @@ -267,7 +267,7 @@ /* do the gun thing */ if (state->m_pc10_gun_controller) { - device_t *ppu = space->machine().device("ppu"); + ppu2c0x_device *ppu = space->machine().device("ppu"); int trigger = input_port_read(space->machine(), "P1"); int x = input_port_read(space->machine(), "GUNX"); int y = input_port_read(space->machine(), "GUNY"); @@ -277,10 +277,10 @@ ret |= 0x08; /* get the pixel at the gun position */ - pix = ppu2c0x_get_pixel(ppu, x, y); + pix = ppu->get_pixel(x, y); /* get the color base from the ppu */ - color_base = ppu2c0x_get_colorbase(ppu); + color_base = ppu->get_colorbase(); /* look at the screen and see if the cursor is over a bright pixel */ if ((pix == color_base + 0x20) || (pix == color_base + 0x30) || @@ -799,6 +799,7 @@ DRIVER_INIT( pceboard ) { playch10_state *state = machine.driver_data(); + ppu2c0x_device *ppu = machine.device("ppu"); UINT8 *prg = machine.region("cart")->base(); /* we have no vram, make sure switching games doesn't point to an old allocation */ @@ -812,7 +813,7 @@ machine.device("cart")->memory().space(AS_PROGRAM)->install_legacy_write_handler(0x8000, 0xffff, FUNC(eboard_rom_switch_w) ); /* ppu_latch callback */ - ppu2c0x_set_latch(machine.device("ppu"), mapper9_latch); + ppu->set_latch(mapper9_latch); /* nvram at $6000-$6fff */ machine.device("cart")->memory().space(AS_PROGRAM)->install_ram(0x6000, 0x6fff); @@ -879,7 +880,7 @@ static WRITE8_HANDLER( gboard_rom_switch_w ) { playch10_state *state = space->machine().driver_data(); - device_t *ppu = space->machine().device("ppu"); + ppu2c0x_device *ppu = space->machine().device("ppu"); /* basically, a MMC3 mapper from the nes */ @@ -1003,11 +1004,11 @@ break; case 0x6000: /* disable irqs */ - ppu2c0x_set_scanline_callback(ppu, 0); + ppu->set_scanline_callback(0); break; case 0x6001: /* enable irqs */ - ppu2c0x_set_scanline_callback(ppu, gboard_scanline_cb); + ppu->set_scanline_callback(gboard_scanline_cb); break; } } diff -Nru mame-0.144/src/mame/machine/psx.c mame-0.145/src/mame/machine/psx.c --- mame-0.144/src/mame/machine/psx.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/psx.c 2012-02-06 21:30:42.000000000 +0000 @@ -51,19 +51,19 @@ void psx_irq_set( running_machine &machine, UINT32 data ) { - psxcpu_device::irq_set( *machine.device("maincpu"), "maincpu", data ); + psxcpu_device::irq_set( *machine.device("maincpu^"), "maincpu", data ); } /* SIO */ void psx_sio_install_handler( running_machine &machine, int n_port, psx_sio_handler p_f_sio_handler ) { - psxcpu_device::install_sio_handler( *machine.device("maincpu"), "maincpu", n_port, p_f_sio_handler ); + psxcpu_device::install_sio_handler( *machine.device("maincpu^"), "maincpu", n_port, p_f_sio_handler ); } void psx_sio_input( running_machine &machine, int n_port, int n_mask, int n_data ) { - psxcpu_device::sio_input( *machine.device("maincpu"), "maincpu", n_port, n_mask, n_data ); + psxcpu_device::sio_input( *machine.device("maincpu^"), "maincpu", n_port, n_mask, n_data ); } /* GPU */ diff -Nru mame-0.144/src/mame/machine/rainbow.c mame-0.145/src/mame/machine/rainbow.c --- mame-0.144/src/mame/machine/rainbow.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/rainbow.c 2012-02-06 21:30:43.000000000 +0000 @@ -644,7 +644,7 @@ static void request_round_data( running_machine &machine ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); int round = state->m_CRAM[1][0x141]; /* 0...49 */ memcpy(state->m_CRAM[1], CROM_BANK1, sizeof CROM_BANK1); @@ -665,7 +665,7 @@ static void request_world_data( running_machine &machine ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); int world = state->m_CRAM[0][0x00d] / 4; /* 0...9 */ /* the extra version has the world data swapped around */ @@ -713,7 +713,7 @@ static void request_goalin_data( running_machine &machine ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); int n = machine.rand() % 15; state->m_CRAM[1][0x14B] = 0x00; /* x coordinates */ @@ -733,7 +733,7 @@ static TIMER_CALLBACK( cchip_timer ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); if (state->m_CRAM[1][0x100] == 1) { @@ -773,20 +773,20 @@ * *************************************/ -WRITE16_HANDLER( rainbow_cchip_ctrl_w ) +WRITE16_HANDLER( rbisland_cchip_ctrl_w ) { /* value 2 is written here */ } -WRITE16_HANDLER( rainbow_cchip_bank_w ) +WRITE16_HANDLER( rbisland_cchip_bank_w ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); state->m_current_bank = data & 7; } -WRITE16_HANDLER( rainbow_cchip_ram_w ) +WRITE16_HANDLER( rbisland_cchip_ram_w ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); state->m_CRAM[state->m_current_bank][offset] = data; } @@ -796,7 +796,7 @@ * *************************************/ -READ16_HANDLER( rainbow_cchip_ctrl_r ) +READ16_HANDLER( rbisland_cchip_ctrl_r ) { /* Bit 2 = Error signal @@ -805,9 +805,9 @@ return 0x01; /* Return 0x05 for C-Chip error */ } -READ16_HANDLER( rainbow_cchip_ram_r ) +READ16_HANDLER( rbisland_cchip_ram_r ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); return state->m_CRAM[state->m_current_bank][offset]; } @@ -817,9 +817,9 @@ * *************************************/ -void rainbow_cchip_init( running_machine &machine, int version ) +void rbisland_cchip_init( running_machine &machine, int version ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); int i; state->m_extra_version = version; diff -Nru mame-0.144/src/mame/machine/segamsys.c mame-0.145/src/mame/machine/segamsys.c --- mame-0.144/src/mame/machine/segamsys.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/segamsys.c 2012-02-06 21:30:43.000000000 +0000 @@ -353,7 +353,7 @@ UINT8* vram; UINT8* cram; UINT8 writemode; - bitmap_t* r_bitmap; + bitmap_rgb32* r_bitmap; UINT8* tile_renderline; UINT8* sprite_renderline; @@ -377,7 +377,7 @@ int sms_total_scanlines; int sms_framerate; emu_timer* sms_scanline_timer; - UINT16* cram_mamecolours; // for use on RGB_DIRECT screen + UINT32* cram_mamecolours; // for use on RGB_DIRECT screen int (*set_irq)(running_machine &machine, int state); }; @@ -420,13 +420,13 @@ if (chip->vdp_type==GG_VDP) { chip->cram = auto_alloc_array_clear(machine, UINT8, 0x0040); - chip->cram_mamecolours = auto_alloc_array_clear(machine, UINT16, 0x0080/2); + chip->cram_mamecolours = auto_alloc_array_clear(machine, UINT32, 0x0080/2); chip->gg_cram_latch = 0; } else { chip->cram = auto_alloc_array_clear(machine, UINT8, 0x0020); - chip->cram_mamecolours = auto_alloc_array(machine, UINT16, 0x0040/2); + chip->cram_mamecolours = auto_alloc_array(machine, UINT32, 0x0040/2); } chip->tile_renderline = auto_alloc_array(machine, UINT8, 256+8); @@ -436,7 +436,7 @@ memset(chip->sprite_renderline,0x00,256+32); chip->writemode = 0; - chip->r_bitmap = auto_bitmap_alloc(machine, 256, 256, BITMAP_FORMAT_RGB15); + chip->r_bitmap = auto_bitmap_rgb32_alloc(machine, 256, 256); chip->sms_scanline_timer = machine.scheduler().timer_alloc(FUNC(sms_scanline_timer_callback), chip); @@ -521,8 +521,9 @@ r = (palword & 0x000f)>>0; g = (palword & 0x00f0)>>4; b = (palword & 0x0f00)>>8; - palette_set_color_rgb(space->machine(),(chip->addr_reg&0x3e)/2, pal4bit(r), pal4bit(g), pal4bit(b)); - chip->cram_mamecolours[(chip->addr_reg&0x3e)/2]=(b<<1)|(g<<6)|(r<<11); + rgb_t rgb = MAKE_RGB(pal4bit(r), pal4bit(g), pal4bit(b)); + palette_set_color(space->machine(),(chip->addr_reg&0x3e)/2, rgb); + chip->cram_mamecolours[(chip->addr_reg&0x3e)/2]=rgb; } } } @@ -536,8 +537,9 @@ r = (data & 0x03)>>0; g = (data & 0x0c)>>2; b = (data & 0x30)>>4; - palette_set_color_rgb(space->machine(),chip->addr_reg&0x1f, pal2bit(r), pal2bit(g), pal2bit(b)); - chip->cram_mamecolours[chip->addr_reg&0x1f]=(b<<3)|(g<<8)|(r<<13); + rgb_t rgb = MAKE_RGB(pal2bit(r), pal2bit(g), pal2bit(b)); + palette_set_color(space->machine(),chip->addr_reg&0x1f, rgb); + chip->cram_mamecolours[chip->addr_reg&0x1f]=rgb; } } @@ -937,7 +939,7 @@ static void sms_copy_to_renderbuffer(int scanline, struct sms_vdp* chip) { int x; - UINT16* lineptr = BITMAP_ADDR16(chip->r_bitmap, scanline, 0); + UINT32* lineptr = &chip->r_bitmap->pix32(scanline); for (x=0;x<256;x++) { @@ -956,7 +958,7 @@ if (!(dat & 0x80)) { lineptr[x] = chip->cram_mamecolours[dat&0x1f]; - if ((dat&0xf)==0x0) lineptr[x]|=0x8000; + if ((dat&0xf)==0x0) lineptr[x]|=0x80000000; } @@ -968,7 +970,7 @@ if (dat & 0x80) { lineptr[x] = chip->cram_mamecolours[dat&0x1f]; - if ((dat&0xf)==0x0) lineptr[x]|=0x8000; + if ((dat&0xf)==0x0) lineptr[x]|=0x80000000; } } @@ -1080,7 +1082,7 @@ for (yy=0;yy<8;yy++) { int drawypos = y*8+yy; - UINT16* lineptr = BITMAP_ADDR16(chip->r_bitmap, drawypos, 0); + UINT32* lineptr = &chip->r_bitmap->pix32(drawypos); UINT32 gfxdata = (SMS_VDP_VRAM(count)<<24)|(SMS_VDP_VRAM(count+1)<<16)|(SMS_VDP_VRAM(count+2)<<8)|(SMS_VDP_VRAM(count+3)<<0); @@ -1148,23 +1150,14 @@ if (chip->vdp_type!=GG_VDP) /* In GG mode the Game Gear resolution is fixed */ { - rectangle visarea; - - visarea.min_x = 0; - visarea.max_x = 256-1; - visarea.min_y = 0; - visarea.max_y = sms_mode_table[chip->screen_mode].sms2_height-1; + rectangle visarea(0, 256-1, 0, sms_mode_table[chip->screen_mode].sms2_height-1); if (chip->chip_id==3) machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); } else /* 160x144 */ { - rectangle visarea; - visarea.min_x = (256-160)/2; - visarea.max_x = (256-160)/2+160-1; - visarea.min_y = (192-144)/2; - visarea.max_y = (192-144)/2+144-1; + rectangle visarea((256-160)/2, (256-160)/2+160-1, (192-144)/2, (192-144)/2+144-1); machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); } @@ -1179,14 +1172,17 @@ } -SCREEN_EOF(sms) +SCREEN_VBLANK(sms) { - end_of_frame(machine, md_sms_vdp); - - // the SMS has a 'RESET' button on the machine, it generates an NMI - if (input_port_read_safe(machine,"PAUSE",0x00)) - cputag_set_input_line(machine, "maincpu", INPUT_LINE_NMI, PULSE_LINE); + // rising edge + if (vblank_on) + { + end_of_frame(screen.machine(), md_sms_vdp); + // the SMS has a 'RESET' button on the machine, it generates an NMI + if (input_port_read_safe(screen.machine(),"PAUSE",0x00)) + cputag_set_input_line(screen.machine(), "maincpu", INPUT_LINE_NMI, PULSE_LINE); + } } @@ -1196,7 +1192,7 @@ } -MACHINE_RESET(sms) +static MACHINE_RESET(sms) { md_sms_vdp->sms_scanline_timer->adjust(attotime::zero); } @@ -1248,35 +1244,43 @@ vdp1->sms_scanline_timer->adjust(attotime::zero); } -SCREEN_EOF(systeme) +SCREEN_VBLANK(systeme) { - end_of_frame(machine, vdp1); - end_of_frame(machine, vdp2); + // rising edge + if (vblank_on) + { + end_of_frame(screen.machine(), vdp1); + end_of_frame(screen.machine(), vdp2); + } } -SCREEN_EOF(megatech_md_sms) +SCREEN_VBLANK(megatech_md_sms) { - end_of_frame(machine, md_sms_vdp); + // rising edge + if (vblank_on) + end_of_frame(screen.machine(), md_sms_vdp); } -SCREEN_EOF(megatech_bios) +SCREEN_VBLANK(megatech_bios) { - end_of_frame(machine, vdp1); + // rising edge + if (vblank_on) + end_of_frame(screen.machine(), vdp1); } -SCREEN_UPDATE(megatech_md_sms) +SCREEN_UPDATE_RGB32(megatech_md_sms) { int x,y; for (y=0;y<224;y++) { - UINT16* lineptr = BITMAP_ADDR16(bitmap, y, 0); - UINT16* srcptr = BITMAP_ADDR16(md_sms_vdp->r_bitmap, y, 0); + UINT32* lineptr = &bitmap.pix32(y); + UINT32* srcptr = &md_sms_vdp->r_bitmap->pix32(y); for (x=0;x<256;x++) { - lineptr[x]=srcptr[x]&0x7fff; + lineptr[x]=srcptr[x]; } } @@ -1284,70 +1288,71 @@ } -SCREEN_UPDATE(megatech_bios) +SCREEN_UPDATE_RGB32(megatech_bios) { int x,y; for (y=0;y<224;y++) { - UINT16* lineptr = BITMAP_ADDR16(bitmap, y, 0); - UINT16* srcptr = BITMAP_ADDR16(vdp1->r_bitmap, y, 0); + UINT32* lineptr = &bitmap.pix32(y); + UINT32* srcptr = &vdp1->r_bitmap->pix32(y); for (x=0;x<256;x++) { - lineptr[x]=srcptr[x]&0x7fff; + lineptr[x]=srcptr[x]; } } return 0; } -SCREEN_UPDATE(megaplay_bios) +SCREEN_UPDATE_RGB32(megaplay_bios) { int x,y; for (y=0;y<224;y++) { - UINT16* lineptr = BITMAP_ADDR16(bitmap, y+16, 32); - UINT16* srcptr = BITMAP_ADDR16(vdp1->r_bitmap, y, 0); + UINT32* lineptr = &bitmap.pix32(y+16, 32); + UINT32* srcptr = &vdp1->r_bitmap->pix32(y); for (x=0;x<256;x++) { - UINT16 src = srcptr[x]&0x7fff; + UINT32 src = srcptr[x]&0xffffff; if (src) - lineptr[x]=srcptr[x]&0x7fff; + lineptr[x]=src; } } return 0; } -SCREEN_UPDATE(systeme) +SCREEN_UPDATE_RGB32(systeme) { // show_tiles(); int x,y; for (y=0;y<192;y++) { - UINT16* lineptr = BITMAP_ADDR16(bitmap, y, 0); - UINT16* srcptr = BITMAP_ADDR16(vdp1->r_bitmap, y, 0); + UINT32* lineptr = &bitmap.pix32(y); + UINT32* srcptr = &vdp1->r_bitmap->pix32(y); for (x=0;x<256;x++) { - lineptr[x]=srcptr[x]&0x7fff; + lineptr[x]=srcptr[x]; } } for (y=0;y<192;y++) { - UINT16* lineptr = BITMAP_ADDR16(bitmap, y, 0); - UINT16* srcptr = BITMAP_ADDR16(vdp2->r_bitmap, y, 0); + UINT32* lineptr = &bitmap.pix32(y); + UINT32* srcptr = &vdp2->r_bitmap->pix32(y); for (x=0;x<256;x++) { - if(!(srcptr[x]&0x8000)) lineptr[x]=srcptr[x]&0x7fff; + UINT16 src = srcptr[x]; + if(!(src&0x80000000)) lineptr[x]=src; } } @@ -1722,12 +1727,11 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) // Vblank handled manually. - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB15) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 223) // MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 191) - MCFG_SCREEN_UPDATE(megatech_md_sms) /* Copies a bitmap */ - MCFG_SCREEN_EOF(sms) /* Used to Sync the timing */ + MCFG_SCREEN_UPDATE_STATIC(megatech_md_sms) /* Copies a bitmap */ + MCFG_SCREEN_VBLANK_STATIC(sms) /* Used to Sync the timing */ MCFG_PALETTE_LENGTH(0x200) diff -Nru mame-0.144/src/mame/machine/slapfght.c mame-0.145/src/mame/machine/slapfght.c --- mame-0.144/src/mame/machine/slapfght.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/slapfght.c 2012-02-06 21:30:43.000000000 +0000 @@ -53,13 +53,17 @@ /* Disable and clear hardware interrupt */ WRITE8_HANDLER( slapfight_port_06_w ) { - interrupt_enable_w(space,0,0); + slapfght_state *state = space->machine().driver_data(); + + state->m_irq_mask = 0; } /* Enable hardware interrupt */ WRITE8_HANDLER( slapfight_port_07_w ) { - interrupt_enable_w(space,0,1); + slapfght_state *state = space->machine().driver_data(); + + state->m_irq_mask = 1; } WRITE8_HANDLER( slapfight_port_08_w ) diff -Nru mame-0.144/src/mame/machine/slikshot.c mame-0.145/src/mame/machine/slikshot.c --- mame-0.144/src/mame/machine/slikshot.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/slikshot.c 2012-02-06 21:30:43.000000000 +0000 @@ -549,18 +549,18 @@ * *************************************/ -SCREEN_UPDATE( slikshot ) +SCREEN_UPDATE_RGB32( slikshot ) { - itech8_state *state = screen->machine().driver_data(); + itech8_state *state = screen.machine().driver_data(); int totaldy, totaldx; int temp, i; /* draw the normal video first */ - SCREEN_UPDATE_CALL(itech8_2page); + SCREEN_UPDATE32_CALL(itech8_2page); /* add the current X,Y positions to the list */ - state->m_xbuffer[state->m_ybuffer_next % YBUFFER_COUNT] = input_port_read_safe(screen->machine(), "FAKEX", 0); - state->m_ybuffer[state->m_ybuffer_next % YBUFFER_COUNT] = input_port_read_safe(screen->machine(), "FAKEY", 0); + state->m_xbuffer[state->m_ybuffer_next % YBUFFER_COUNT] = input_port_read_safe(screen.machine(), "FAKEX", 0); + state->m_ybuffer[state->m_ybuffer_next % YBUFFER_COUNT] = input_port_read_safe(screen.machine(), "FAKEY", 0); state->m_ybuffer_next++; /* determine where to draw the starting point */ @@ -595,7 +595,7 @@ if (temp >= 0x90) temp = 0x90; state->m_curx = temp; - compute_sensors(screen->machine()); + compute_sensors(screen.machine()); // popmessage("V=%02x,%02x X=%02x", state->m_curvx, state->m_curvy, state->m_curx); state->m_crosshair_vis = 0; } diff -Nru mame-0.144/src/mame/machine/snes.c mame-0.145/src/mame/machine/snes.c --- mame-0.144/src/mame/machine/snes.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/snes.c 2012-02-06 21:30:43.000000000 +0000 @@ -575,9 +575,14 @@ case JOY4H: /* Joypad 4 status register (high) */ return state->m_joy4h; -#ifndef MESS case 0x4100: /* NSS Dip-Switches */ - return input_port_read(space->machine(), "DSW"); + { + const input_port_config *port = space->machine().port("DSW"); + if (port != NULL) + return input_port_read(space->machine(), "DSW"); + else + return snes_open_bus_r(space, 0); + } // case 0x4101: //PC: a104 - a10e - a12a //only nss_actr // case 0x420c: //PC: 9c7d - 8fab //only nss_ssoc @@ -585,9 +590,6 @@ // mame_printf_debug("snes_r: offset = %x pc = %x\n",offset,cpu_get_pc(&space->device())); // Added break; after commenting above line. If uncommenting, drop the break; break; - -#endif /* MESS */ - } //printf("unsupported read: offset == %08x\n", offset); @@ -1050,8 +1052,9 @@ } else if ((state->m_cart[0].mode == SNES_MODE_21) && (state->m_cart[0].sram > 0)) { - /* Donkey Kong Country checks this */ - int mask = state->m_cart[0].sram - 1; /* Limit SRAM size to what's actually present */ + /* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */ + /* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */ + int mask = (state->m_cart[0].sram - 1) | 0xffe000; /* Limit SRAM size to what's actually present */ value = snes_ram[0x300000 + (offset & mask)]; } else @@ -1411,8 +1414,9 @@ } else if ((state->m_cart[0].mode == SNES_MODE_21) && (state->m_cart[0].sram > 0)) { - /* Donkey Kong Country checks this */ - int mask = state->m_cart[0].sram - 1; /* Limit SRAM size to what's actually present */ + /* Donkey Kong Country checks this and detects a copier if 0x800 is not masked out due to sram size */ + /* OTOH Secret of Mana does not work properly if sram is not mirrored on later banks */ + int mask = (state->m_cart[0].sram - 1) | 0xffe000; /* Limit SRAM size to what's actually present */ snes_ram[0x300000 + (offset & mask)] = data; } else @@ -2144,7 +2148,8 @@ #if USE_CYCLE_STEAL /* every byte transfer takes 8 master cycles */ - device_adjust_icount(&space->device(),-8); +// FIXME: this cycle steal makes Final Fantasy VI (III in US) very glitchy! +// device_adjust_icount(&space->device(),-8); #endif if (state->m_dma_channel[dma].dmap & 0x80) /* PPU->CPU */ diff -Nru mame-0.144/src/mame/machine/steppers.c mame-0.145/src/mame/machine/steppers.c --- mame-0.144/src/mame/machine/steppers.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/steppers.c 2012-02-06 21:30:43.000000000 +0000 @@ -5,6 +5,12 @@ // Emulates : Stepper motors driven with full step or half step // // also emulates the index optic // // // +// 15-01-2012: J. Wallace - Total internal rewrite to remove the table // +// hoodoo that stops anyone but me actually // +// updating this. In theory, we should be able // +// to adapt the phase code to any reel type by // +// studying a game's startup // +// Documentation is much better now. // // 04-04-2011: J. Wallace - Added reverse spin (this is necessary for // // accuracy), and improved wraparound logic // // 03-2011: New 2D array to remove reel bounce and // @@ -34,7 +40,8 @@ UINT8 pattern, /* coil pattern */ old_pattern, /* old coil pattern */ phase, /* motor phase */ - type, /* reel type */ + old_phase, /* old phase */ + type, /* reel type */ reverse; /* Does reel spin backwards (construction of unit, not wiring) */ INT16 step_pos, /* step position 0 - max_steps */ max_steps; /* maximum step position */ @@ -47,52 +54,16 @@ } stepper; static stepper step[MAX_STEPPERS]; -/* step table, use active coils as row, phase as column*/ -static const int StarpointStepTab[8][16] = -{// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Phase - { 0, 2, 0, 0, 2, 1, 3, 0, -2, -1, -1, 0, 0, 0, 0, 0 },// 0 - { 0, -1, 3, 0, 1, 2, 2, 0, -3, -2, -2, 0, 0, 0, 0, 0 },// 1 - { 0, -2, 2, 0, 2, -1, 1, 0, 2, -3, 3, 0, 0, 0, 0, 0 },// 2 - { 0, -1, 1, 0, -1, -2, -2, 0, 3, 2, 2, 0, 0, 0, 0, 0 },// 3 - { 0, -2, 0, 0, -2, -3, -1, 0, 2, 3, 1, 0, 0, 0, 0, 0 },// 4 - { 0, 3, -1, 0, -1, -2, -2, 0, 1, 0, 2, 0, 0, 0, 0, 0 },// 5 - { 0, 2, -2, 0, -2, 3, -3, 0, -2, 1, -1, 0, 0, 0, 0, 0 },// 6 - { 0, 1, -3, 0, 3, 2, 2, 0, -1, -2, -2, 0, 0, 0, 0, 0 },// 7 -}; - - -static const int MPU3StepTab[8][4] = -{// 00 01 10 11 Phase - { 2, 0, 0, -2, },// 0 - { 0, 0, 0, 0, },// 1 - { 0, -2, 2, 0, },// 2 - { 0, 0, 0, 0, },// 3 - {-2, 0, 0, 2, },// 4 - { 0, 0, 0, 0, },// 5 - { 0, 2, -2, 0, },// 6 - { 0, 0, 0, 0, },// 7 -}; - -static const int BarcrestStepTab[8][16] = -{// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Phase - { 0, 1, 3, 2, -3, 0, 0, 0, -1, 0, 0, 0, -2, 0, 0, 0 },// 0 - { 0, 0, 2, 1, 0, 0, 3, 0, -2, -1, 0, 0, -3, 0, 0, 0 },// 1 - { 0, -1, 1, 0, 3, 0, 2, 0, -3, -2, 0, 0, 0, 0, 0, 0 },// 2 - { 0, -2, 0, -1, 2, 0, 1, 0, 0, -3, 0, 0, 3, 0, 0, 0 },// 3 - { 0, -3, -1, -2, 1, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0 },// 4 - { 0, 0, -2, -3, 0, 0, -1, 0, 2, 3, 0, 0, 1, 0, 0, 0 },// 5 - { 0, 3, -3, 0, -1, 0, -2, 0, 0, 2, 0, 0, 0, 0, 0, 0 },// 6 - { 0, 2, 0, 3, -2, 0, -3, 0, 0, 1, 0, 0, -1, 0, 0, 0 },// 7 -}; /* useful interfaces (Starpoint is a very common setup)*/ - +/* step table, use active coils as row, phase as column*/ const stepper_interface starpoint_interface_48step = { STARPOINT_48STEP_REEL, 16, 24, - 0x09 + 0x09,//Starpoint tech specs say that the only coil pattern guaranteed to line up the opto is this one + 0 }; const stepper_interface starpoint_interface_48step_reverse = @@ -118,6 +89,8 @@ step[which].index_end = intf->index_end; /* location of last index value in half steps */ step[which].index_patt = intf->index_patt; /* hex value of coil pattern (0 if not needed)*/ step[which].reverse = intf->reverse; + + step[which].phase = 0; step[which].pattern = 0; step[which].old_pattern = 0; @@ -132,14 +105,17 @@ step[which].max_steps = (48*2); break; case STARPOINT_144STEPS_DICE :/* STARPOINT 1DCU DICE mechanism */ - step[which].max_steps = (144*2); + //Dice reels are 48 step motors, but complete three full cycles between opto updates + step[which].max_steps = ((48*3)*2); break; + } state_save_register_item(machine, "stepper", NULL, which, step[which].index_start); state_save_register_item(machine, "stepper", NULL, which, step[which].index_end); state_save_register_item(machine, "stepper", NULL, which, step[which].index_patt); state_save_register_item(machine, "stepper", NULL, which, step[which].phase); + state_save_register_item(machine, "stepper", NULL, which, step[which].old_phase); state_save_register_item(machine, "stepper", NULL, which, step[which].pattern); state_save_register_item(machine, "stepper", NULL, which, step[which].old_pattern); state_save_register_item(machine, "stepper", NULL, which, step[which].step_pos); @@ -198,9 +174,16 @@ void stepper_reset_position(int which) { - step[which].step_pos = 0; + + step[which].step_pos = 0x00; step[which].pattern = 0x00; step[which].old_pattern = 0x00; + step[which].phase = 0x00; + if ((step[which].type == STARPOINT_48STEP_REEL)||(step[which].type == STARPOINT_144STEPS_DICE)) + {//Starpoint motor power on partially energises reel to a known state (straight up)- Bellfruit games rely on this behaviour. + step[which].phase = 0x07; + step[which].old_phase = 0x07; + } update_optic(which); } @@ -225,60 +208,212 @@ { int changed = 0; - if ( step[which].pattern != pattern ) - { /* pattern changed */ - int steps, - pos; - if ( step[which].pattern ) - { - step[which].old_pattern = step[which].pattern; - } - step[which].phase = (step[which].step_pos % 8); - step[which].pattern = pattern; + /* This code probably makes more sense if you visualise what is being emulated, namely + a spinning drum with two electromagnets inside. Essentially, the CPU + activates a pair of windings on these magnets leads as necessary to attract and repel the drum to pull it round and + display as appropriate. To attempt to visualise the rotation effect, take a look at the compass rose below, representing a side on view of the reel, + the numbers indicate the phase information as used + + 7 + N + 1 W E 5 + S + 3 + + For sake of accuracy, we're representing all possible phases of the motor, effectively moving the motor one half step at a time, so a 48 step motor becomes + 96 half steps. This is necessary because of some programs running the wiring in series with a distinct delay between the pair being completed. This causes + a small movement that may trigger the optic tab. + */ - switch ( step[which].type ) - { - default: - case STARPOINT_48STEP_REEL : /* STARPOINT RMxxx */ - case STARPOINT_144STEPS_DICE : /* STARPOINT 1DCU DICE mechanism */ - steps = StarpointStepTab[step[which].phase][pattern];//[(step[which].old_pattern << 4) | pattern];// + int pos,steps=0; + step[which].pattern = pattern; + + switch ( step[which].type ) + { + default: + case STARPOINT_48STEP_REEL : /* STARPOINT RMxxx */ + case STARPOINT_144STEPS_DICE : /* STARPOINT 1DCU DICE mechanism */ + //Standard drive table is 2,6,4,5,1,9,8,a + //this runs through the stator patterns in such a way as to drive the reel forward (downwards from the player's view, clockwise on our rose) + switch (pattern) + { //Black Blue Red Yellow + case 0x02:// 0 0 1 0 + step[which].phase = 7; + break; + case 0x06:// 0 1 1 0 + step[which].phase = 6; + break; + case 0x04:// 0 1 0 0 + step[which].phase = 5; + break; + case 0x05:// 0 1 0 1 + step[which].phase = 4; break; - case BARCREST_48STEP_REEL : /* Barcrest reel units have different windings */ - steps = BarcrestStepTab[step[which].phase][pattern]; + case 0x01:// 0 0 0 1 + step[which].phase = 3; + break; + case 0x09:// 1 0 0 1 + step[which].phase = 2; + break; + case 0x08:// 1 0 0 0 + step[which].phase = 1; + break; + case 0x0A:// 1 0 1 0 + step[which].phase = 0; + break; + // Black Blue Red Yellow + case 0x03:// 0 0 1 1 + { + if ((step[which].old_phase ==6)||(step[which].old_phase == 0)) // if the previous pattern had the drum in the northern quadrant, it will point north now + { + step[which].phase = 7; + } + else //otherwise it will line up due south + { + step[which].phase = 3; + } + } + break; + case 0x0C:// 1 1 0 0 + { + if ((step[which].old_phase ==6)||(step[which].old_phase == 4)) // if the previous pattern had the drum in the eastern quadrant, it will point east now + { + step[which].phase = 5; + } + else //otherwise it will line up due west + { + step[which].phase = 1; + } + } break; - case MPU3_48STEP_REEL : /* Same unit as above, but different interface (2 active lines, not 4)*/ - steps = MPU3StepTab[step[which].phase][pattern]; } - #if 0 /* Assists with new index generation */ - if ( which ==1 )logerror("which %d Steps %d Phase %d Pattern Old %02X New %02X\n",which,steps,(step[which].phase),step[which].old_pattern,step[which].pattern); - #endif - - int max = step[which].max_steps; - pos = 0; + break; - if (max!=0) + case BARCREST_48STEP_REEL : + //Standard drive table is 1,3,2,6,4,C,8,9 + //this runs through the stator patterns in such a way as to drive the reel forward (downwards from the player's view) + switch (pattern) { - if (step[which].reverse) + // Yellow Black Orange Brown + case 0x01:// 0 0 0 1 + step[which].phase = 7; + break; + case 0x03:// 0 0 1 1 + step[which].phase = 6; + break; + case 0x02:// 0 0 1 0 + step[which].phase = 5; + break; + case 0x06:// 0 1 1 0 + step[which].phase = 4; + break; + case 0x04:// 0 1 0 0 + step[which].phase = 3; + break; + case 0x0C:// 1 1 0 0 + step[which].phase = 2; + break; + case 0x08:// 1 0 0 0 + step[which].phase = 1; + break;//YOLB + case 0x09:// 1 0 0 1 + step[which].phase = 0; + break; + + // The below values should not be used by anything sane, as they effectively ignore one stator side entirely + // Yellow Black Orange Brown + case 0x05:// 0 1 0 1 { - pos = (step[which].step_pos - steps + max) % max; + if ((step[which].old_phase ==6)||(step[which].old_phase == 0)) // if the previous pattern had the drum in the northern quadrant, it will point north now + { + step[which].phase = 7; + } + else //otherwise it will line up due south + { + step[which].phase = 3; + } } - else + break; + + case 0x0A:// 1 0 1 0 { - pos = (step[which].step_pos + steps + max) % max; + if ((step[which].old_phase ==6)||(step[which].old_phase == 4)) // if the previous pattern had the drum in the eastern quadrant, it will point east now + { + step[which].phase = 5; + } + else //otherwise it will line up due west + { + step[which].phase = 1; + } } + break; } - else + break; + + case MPU3_48STEP_REEL : + /* The MPU3 interface is actually the same as the MPU4 setup, but with two active lines instead of four + Inverters are used so if a pin is low, the higher bit of the pair is activated, and if high the lower bit is activated. + TODO:Check this, 2 and 1 could be switched over. + */ + switch (pattern) { - logerror("step[which].max_steps == 0\n"); + // Yellow(2) Black(1) Orange(!2) Brown(!1) + case 0x00 :// 0 0 1 1 + step[which].phase = 6; + break; + case 0x01 :// 0 1 1 0 + step[which].phase = 4; + break; + case 0x03 :// 1 1 0 0 + step[which].phase = 2; + break; + case 0x02 :// 1 0 0 1 + step[which].phase = 0; + break; } + break; + } + + steps = step[which].old_phase - step[which].phase; - if (pos != step[which].step_pos) + if (steps < -4) + { + steps = steps +8; + } + if (steps > 4) + { + steps = steps -8; + } + + step[which].old_phase = step[which].phase; + step[which].old_pattern = step[which].pattern; + + int max = step[which].max_steps; + pos = 0; + + if (max!=0) + { + if (step[which].reverse) { - changed++; + pos = (step[which].step_pos - steps + max) % max; } + else + { + pos = (step[which].step_pos + steps + max) % max; + } + } + else + { + logerror("step[%x].max_steps == 0\n",which); + } - step[which].step_pos = pos; - update_optic(which); + if (pos != step[which].step_pos) + { + changed++; } + + step[which].step_pos = pos; + update_optic(which); + return changed; } diff -Nru mame-0.144/src/mame/machine/stvcd.c mame-0.145/src/mame/machine/stvcd.c --- mame-0.144/src/mame/machine/stvcd.c 2012-01-13 15:35:00.000000000 +0000 +++ mame-0.145/src/mame/machine/stvcd.c 2012-02-06 21:30:43.000000000 +0000 @@ -1466,11 +1466,17 @@ cdrom = (cdrom_file *)NULL; } - #ifdef MESS - cdrom = machine.device("cdrom")->get_cdrom_file(); - #else - cdrom = cdrom_open(get_disk_handle(machine, "cdrom")); - #endif + cdrom_image_device *cddevice = machine.device("cdrom"); + if (cddevice!=NULL) + { + // MESS case + cdrom = cddevice->get_cdrom_file(); + } + else + { + // MAME case + cdrom = cdrom_open(get_disk_handle(machine, "cdrom")); + } cdda_set_cdrom( machine.device("cdda"), cdrom ); @@ -2136,9 +2142,11 @@ if (cdrom) { - #ifndef MESS - cdrom_close(cdrom); - #endif + cdrom_image_device *cddevice = machine.device("cdrom"); + if (cddevice==NULL) + { + cdrom_close(cdrom); + } cdrom = (cdrom_file *)NULL; } } @@ -2526,11 +2534,17 @@ hirqreg |= DCHG; - #ifdef MESS - cdrom = machine.device("cdrom")->get_cdrom_file(); - #else - cdrom = cdrom_open(get_disk_handle(machine, "cdrom")); - #endif + cdrom_image_device *cddevice = machine.device("cdrom"); + if (cddevice!=NULL) + { + // MESS case + cdrom = cddevice->get_cdrom_file(); + } + else + { + // MAME case + cdrom = cdrom_open(get_disk_handle(machine, "cdrom")); + } cdda_set_cdrom( machine.device("cdda"), cdrom ); diff -Nru mame-0.144/src/mame/machine/vsnes.c mame-0.145/src/mame/machine/vsnes.c --- mame-0.144/src/mame/machine/vsnes.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/vsnes.c 2012-02-06 21:30:43.000000000 +0000 @@ -363,7 +363,7 @@ static WRITE8_HANDLER( gun_in0_w ) { vsnes_state *state = space->machine().driver_data(); - device_t *ppu1 = space->machine().device("ppu1"); + ppu2c0x_device *ppu1 = space->machine().device("ppu1"); if (state->m_do_vrom_bank) { @@ -384,10 +384,10 @@ UINT32 pix, color_base; /* get the pixel at the gun position */ - pix = ppu2c0x_get_pixel(ppu1, x, y); + pix = ppu1->get_pixel(x, y); /* get the color base from the ppu */ - color_base = ppu2c0x_get_colorbase(ppu1); + color_base = ppu1->get_colorbase(); /* look at the screen and see if the cursor is over a bright pixel */ if ((pix == color_base + 0x20 ) || (pix == color_base + 0x30) || @@ -700,7 +700,7 @@ static WRITE8_HANDLER( mapper4_w ) { vsnes_state *state = space->machine().driver_data(); - device_t *ppu1 = space->machine().device("ppu1"); + ppu2c0x_device *ppu1 = space->machine().device("ppu1"); UINT8 MMC3_helper, cmd; switch (offset & 0x6001) @@ -765,13 +765,13 @@ state->m_IRQ_enable = 0; state->m_IRQ_count = state->m_IRQ_count_latch; - ppu2c0x_set_scanline_callback (ppu1, 0); + ppu1->set_scanline_callback(0); break; case 0x6001: /* $e001 - Enable IRQs */ state->m_IRQ_enable = 1; - ppu2c0x_set_scanline_callback (ppu1, mapper4_irq); + ppu1->set_scanline_callback(mapper4_irq); break; diff -Nru mame-0.144/src/mame/machine/wrally.c mame-0.145/src/mame/machine/wrally.c --- mame-0.144/src/mame/machine/wrally.c 2011-08-04 02:16:28.000000000 +0000 +++ mame-0.145/src/mame/machine/wrally.c 2012-02-06 21:30:43.000000000 +0000 @@ -24,7 +24,7 @@ data = gaelco_decrypt(space, offset, data, 0x1f, 0x522a); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_pant[(offset & 0x1fff) >> 12], ((offset << 1) & 0x1fff) >> 2); + state->m_pant[(offset & 0x1fff) >> 12]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2); } WRITE16_HANDLER( wrally_flipscreen_w ) diff -Nru mame-0.144/src/mame/mame.c mame-0.145/src/mame/mame.c --- mame-0.144/src/mame/mame.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/mame.c 2012-02-06 21:30:44.000000000 +0000 @@ -0,0 +1,53 @@ +/*************************************************************************** + + mame.c + + Specific (per target) constants + + Copyright Nicola Salmoria and the MAME Team. + Visit http://mamedev.org for licensing and usage restrictions. + +****************************************************************************/ +#include "emu.h" + +#define APPNAME "MAME" +#define APPNAME_LOWER "mame" +#define CONFIGNAME "mame" +#define APPLONGNAME "M.A.M.E." +#define FULLLONGNAME "Multiple Arcade Machine Emulator" +#define CAPGAMENOUN "GAME" +#define CAPSTARTGAMENOUN "Game" +#define GAMENOUN "game" +#define GAMESNOUN "games" +#define COPYRIGHT "Copyright Nicola Salmoria\nand the MAME team\nhttp://mamedev.org" +#define COPYRIGHT_INFO "Copyright Nicola Salmoria and the MAME team" +#define DISCLAIMER "MAME is an emulator: it reproduces, more or less faithfully, the behaviour of\n" \ + "several arcade machines. But hardware is useless without software, so an image\n" \ + "of the ROMs which run on that hardware is required. Such ROMs, like any other\n" \ + "commercial software, are copyrighted material and it is therefore illegal to\n" \ + "use them if you don't own the original arcade machine. Needless to say, ROMs\n" \ + "are not distributed together with MAME. Distribution of MAME together with ROM\n" \ + "images is a violation of copyright law and should be promptly reported to the\n" \ + "authors so that appropriate legal action can be taken.\n" +#define USAGE "Usage: %s [%s] [options]" +#define XML_ROOT "mame" +#define XML_TOP "game" +#define STATE_MAGIC_NUM "MAMESAVE" + +const char * emulator_info::get_appname() { return APPNAME;} +const char * emulator_info::get_appname_lower() { return APPNAME_LOWER;} +const char * emulator_info::get_configname() { return CONFIGNAME;} +const char * emulator_info::get_applongname() { return APPLONGNAME;} +const char * emulator_info::get_fulllongname() { return FULLLONGNAME;} +const char * emulator_info::get_capgamenoun() { return CAPGAMENOUN;} +const char * emulator_info::get_capstartgamenoun() { return CAPSTARTGAMENOUN;} +const char * emulator_info::get_gamenoun() { return GAMENOUN;} +const char * emulator_info::get_gamesnoun() { return GAMESNOUN;} +const char * emulator_info::get_copyright() { return COPYRIGHT;} +const char * emulator_info::get_copyright_info() { return COPYRIGHT_INFO;} +const char * emulator_info::get_disclaimer() { return DISCLAIMER;} +const char * emulator_info::get_usage() { return USAGE;} +const char * emulator_info::get_xml_root() { return XML_ROOT;} +const char * emulator_info::get_xml_top() { return XML_TOP;} +const char * emulator_info::get_state_magic_num() { return STATE_MAGIC_NUM;} +void emulator_info::printf_usage(const char *par1, const char *par2) { mame_printf_info(USAGE, par1, par2); } diff -Nru mame-0.144/src/mame/mame.lst mame-0.145/src/mame/mame.lst --- mame-0.144/src/mame/mame.lst 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/mame.lst 2012-02-06 21:30:43.000000000 +0000 @@ -59,6 +59,7 @@ hangly2 // hack hangly3 // hack popeyeman // hack +crockman // 1980 bootleg (RENE PIERRE) piranhah // hack abscam // hack crush // (c) 1981 Kural Samno Electric Ltd @@ -78,7 +79,9 @@ ctrpllrp // hack eyes // (c) 1982 Digitrex Techstar + "Rockola presents" eyes2 // (c) 1982 Techstar + "Rockola presents" -eyeszac // (c) 1982 Zaccaria / bootleg +eyeszac // (c) 1982 Techstar / Zaccaria +eyeszacb // bootleg +birdiy // (c) 1983 Mama Top mrtnt // (c) 1983 Telko gorkans // (c) 1984 Techstar eggor // (c) 1983 Telko @@ -395,6 +398,7 @@ swimmera // (c) 1982 Tehkan swimmerb // (c) 1982 Tehkan guzzler // (c) 1983 Tehkan +guzzlers // (c) 1983 Tehkan (Swimmer Conversion) cannonb // (c) 1985 Soft cannonb2 // (c) 1985 TV Game Gruenberg cannonb3 // (c) 1985 Soft @@ -406,6 +410,7 @@ rugrats // (c) 1983 dacholer // (c) 1983 kickboy // (c) 1983 +itaten // (c) 1984 + Alice friskyt // (c) 1981 friskyta // (c) 1981 radrad // (c) 1982 Nichibutsu USA @@ -1100,6 +1105,7 @@ spacelnc // (c) 1979 Nintendo sheriff // (c) 1979 Nintendo bandido // (c) 1980 Exidy +westgun2 // (c) 1980 Taito Corporation helifire // (c) 1980 Nintendo helifirea // (c) 1980 Nintendo radarscp // (c) 1980 Nintendo @@ -1556,6 +1562,8 @@ nstocker2 // (c) 1986 sfootbal // (c) 1986 spiker // (c) 1986 +spiker2 // (c) 1986 +spiker3 // (c) 1986 stompin // (c) 1986 rescraid // (c) 1987 rescraida // (c) 1987 @@ -1922,9 +1930,9 @@ 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 +rbisland // B22 (c) 1987 Taito Corporation +rbislando // B22 (c) 1987 Taito Corporation +rbislande // 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) @@ -1959,6 +1967,7 @@ hotsmash // B18 (c) 1987 Taito exzisus // B12 (c) 1987 Taito Corporation (Japan) exzisusa // B23 (c) 1987 Taito Corporation (Japan) +exzisust // B23 (c) 1987 TAD Corp (based on Japan Conversion) minivadr // D26 cabinet test board volfied // C04 (c) 1989 Taito Corporation Japan (World) volfiedu // C04 (c) 1989 Taito America Corporation (US) @@ -1995,6 +2004,7 @@ // Taito multi-screen games ninjaw // B31 (c) 1987 Taito Corporation Japan (World) +ninjawu // B31 (c) 1987 Taito America Corporation (US) ninjawj // B31 (c) 1987 Taito Corporation (Japan) darius2 // C07 (c) 1989 Taito Corporation (Japan) sagaia // C07 (c) 1989 Taito Corporation Japan (World) @@ -2141,6 +2151,8 @@ aquajacku // B77 (c) 1990 Taito America Corporation (US) aquajackj // B77 (c) 1990 Taito Corporation (Japan) spacegun // C57 (c) 1990 Taito Corporation Japan (World) +spacegunu // C57 (c) 1990 Taito America Corporation (US) +spacegunj // C57 (c) 1990 Taito Corporation (Japan) dblaxle // C78 (c) 1991 Taito America Corporation (US) pwheelsj // C78 (c) 1991 Taito Corporation (Japan) racingb // C84 (c) 1991 Taito Coropration .. @@ -2362,6 +2374,7 @@ skyshark // B02 / TP-007 (c) 1987 Taito America Corporation + Romstar license (US) hishouza // B02 / TP-007 (c) 1987 Taito Corporation (Japan) fsharkbt // bootleg +fsharkbla 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) @@ -2402,10 +2415,13 @@ snowbrosj // MIN16-02 (c) 1990 Toaplan snowbrosd // MIN16-02 (c) 1990 Toaplan + Dooyong license wintbob // bootleg +// modifeid snowbros 'clone' hardware honeydol // (c) 1995 Barko Corp twinadv // (c) 1995 Barko Corp twinadvk // (c) 1995 Barko Corp - // SemiCom games on snowbros like hardware +snowbros3 // (c) 2002 Syrmex +// SemiCom games on "SnowBros"-like hardware +finalttr // (c) 1993 Jeil Computer System hyperpac // (c) 1995 SemiCom hyperpacb // bootleg toppyrap // (c) 1996 SemiCom @@ -2416,9 +2432,8 @@ 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 +4in1boot // (c) 2002 KISoft (includes hacks of Semicom games + Snowbros) + // More Toaplan Games tekipaki // TP-020 (c) 1991 Toaplan @@ -2777,7 +2792,7 @@ area88r // 8/1989 (c) 1989 (Japan) ffight // 12/1989 (c) 1989 (World) ffightu // 12/1989 (c) 1989 (USA) -ffightu1 // 12/1989 (c) 1989 (USA) (4 eprom instead of mask rom) +ffightu1 // 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) @@ -2801,6 +2816,7 @@ cawingr1 // 09/10/1990 (c) 1990 (World) cawingu // 12/10/1990 (c) 1990 (USA) cawingj // 12/10/1990 (c) 1990 (Japan) +cawingbl nemo // 30/11/1990 (c) 1990 (World) nemoj // 20/11/1990 (c) 1990 (Japan) sf2 // 22/05/1991 (c) 1991 (World) @@ -2870,13 +2886,15 @@ 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) +qad // 01/07/1992 (c) 1992 (USA) qadj // 21/09/1994 (c) 1994 (Japan) -wof // 02/10/1992 (c) 1992 (World) (CPS1 + QSound) +wof // 31/10/1992 (c) 1992 (World) (CPS1 + QSound) +wofr1 // 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 +sgyxz // bootleg (All-In Electronics) sf2hf // 09/12/1992 (c) 1992 (World) sf2hfu // 09/12/1992 (c) 1992 (USA) sf2hfj // 09/12/1992 (c) 1992 (Japan) @@ -2902,8 +2920,9 @@ 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 +pang3r1 // 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 +pang3b // bootleg megaman // 06/10/1995 (c) 1995 (USA) megamana // 06/10/1995 (c) 1995 (Asia) rockmanj // 22/09/1995 (c) 1995 (Japan) @@ -3204,8 +3223,10 @@ 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) +sfiii3 // 08/06/1999 (c) 1999 (Euro) +sfiii3a // 12/05/1999 (c) 1999 (Euro) +sfiii3u // 08/06/1999 (c) 1999 (USA) +sfiii3au // 12/05/1999 (c) 1999 (USA) jojoba // 13/09/1999 (c) 1999 (Japan) sfiiin // 04/02/1997 (c) 1997 (Asia) @@ -3219,7 +3240,8 @@ // Capcom ZN1 cpzn1 -ts2 // Battle Arena Toshinden 2 (USA 951124) +ts2 // Battle Arena Toshinden 2 (USA 951124) +ts2a // Battle Arena Toshinden 2 (USA 951124) ts2j // Battle Arena Toshinden 2 (JAPAN 951124) starglad // Star Gladiator (USA 960627) stargladj // Star Gladiator (JAPAN 960627) @@ -3234,7 +3256,8 @@ // Capcom ZN2 cpzn2 -rvschool // Rival Schools (USA 971117) +rvschool // Rival Schools (EURO 971117) +rvschoolu // Rival Schools (USA 971117) rvschoola // Rival Schools (ASIA 971117) jgakuen // Justice Gakuen (JAPAN 971117) sfex2 // Street Fighter EX 2 (USA 980526) @@ -3428,6 +3451,7 @@ // 1999.07 Bust A Move 2 (Metro) tektagt // 1999.?? Tekken Tag Tournament (US, TEG3/VER.C1) tektagtac // 1999.?? Tekken Tag Tournament (Asia, TEG2/VER.C1) +tektagtac1 // 1999.?? Tekken Tag Tournament (Asia, TEG2/VER.C1) - alt mainboard & rom board tektagtub // 1999.?? Tekken Tag Tournament (US, TEG3/VER.B) tektagtjb // 1999.07 Tekken Tag Tournament (Japan, TEG1/VER.B) tektagtja // 1999.07 Tekken Tag Tournament (Japan, TEG1/VER.A) @@ -4008,6 +4032,9 @@ opaopa tetrisse // (c) 1988 +// Shooting Zone (SMS Gun Games on a timer) +shtzone // (c) 1987 + // other Sega 8-bit games turbo // (c) 1981 Sega turboa // (c) 1981 Sega @@ -4430,12 +4457,15 @@ colmns97 // 1997.01 Columns 97 shienryu // 1997.02 Shienryu (Warashi) vmahjong // 1997.02 Virtual Mahjong (Micronet) +pclub2kc // 1997.02 Print Club Kome Kome Club +pclub2fc // 1997.04 Print Club 2 Felix The Cat 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) +pclub298 // 1997.10 Print Club 2 '98 Spring Ver cotton2 // 1997.11 Cotton 2 (Success) hanagumi // 1997.11 Sakura Taisen Hanagumi Taisen Columns findlove // 1997.12 Find Love (Daiki / FCF) @@ -4451,6 +4481,8 @@ astrass // 1998.06 Astra Super Stars (Sunsoft) myfairld // 1998.07 My Fair Lady (Micronet) othellos // 1998.07 Othello Shiyouyo (Success) +pclubol // 1998.07 Print Club Olive +pclb298a // 1998.08 Print Club 2 '98 Autumn Ver cottonbm // 1998.09 Cotton Boomerang (Success) stress // 1998.10 Stress Busters elandore // 1998.11 Touryuu Densetsu Elandore (Sai-Mate) @@ -4461,8 +4493,11 @@ 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 +pclubor // 1999.11 Print Club Goukakenran danchiq // 2000.12 Danchi de Quiz Okusan Yontaku Desuyo! (Altron) + + // Sega Model 2 Games // Model 2 (TGPs, Model 1 sound board) @@ -4789,14 +4824,15 @@ 18wheels // 2000.01 18 Wheeler (Rev A) doa2m // 2000.01 Dead or Alive 2 Millennium totd // 2000.01 The Typing of the Dead (Rev A) - // 2000.02 Touch de UNO! 2 +tduno2 // 2000.02 Touch de UNO! 2 virnba // 2000.02 Virtua NBA virnbao // 2000.02 Virtua NBA (original) +virnbap // 2000.02 Virtua NBA (prototype) mvsc2 // 2000.03 Marvel Vs. Capcom 2 New Age of Heroes (Rev A) smarinef // 2000.03 Sega Marine Fishing wldkicks // 2000.03 World Kicks pstone2 // 2000.04 Power Stone 2 - // 2000.04 Shin Nihon Prowrestling Toukon Retsuden 4 Arcade Edition +toukon4 // 2000.04 Shin Nihon Prowrestling Toukon Retsuden 4 Arcade Edition qmegamis // 2000.05 Quiz Ah Megamisama derbyo2k // 2000.06 Derby Owners Club 2000 Ver.2 (Rev A) vonot // 2000.06 Virtual-on Oratorio Tangram M.S.B.S. ver.5.66 2000 Edition @@ -4870,7 +4906,7 @@ quizqgd // 2002.?? Quiz Keitai Q mode shootopl // 2002.?? Shootout Pool shootpl // 2002.?? Shootout Pool / Shootout Pool Prize (Rev A) - // 2003.02 MushiKing The King Of Beetle +mtkob2 // 2003.02 MushiKing The King Of Beetle // 2003.03 Sega Network Taisen Mahjong MJ ggxxrl // 2003.03 Guilty Gear XX # Reload (Rev A) shikgam2 // 2003.04 Shikigami No Shiro II / The Castle of Shikigami II @@ -4923,7 +4959,7 @@ // 2008.07 Mamoru-kun wa Norowarete Shimatta! mbaa // 2008.09 Melty Blood Actress Again // 2008.12 Melty Blood Actress Again ver.A - // 2009.06 Radirgy Noah + // 2009.06 Radirgy Noa // 2009.?? Project Cerberus (planned to be released in 2009) ngdup23a // DIMM Firmware Updater (Rev A) ngdup23c // DIMM Firmware Updater (Rev C) @@ -5132,48 +5168,49 @@ chwy // 01 1980.12 Highway Chase // 02 1980.12 Sengoku Ninjatai // 03 1981.01 Manhattan -cterrani // 04 1981.02 Terranian +cterrani // 04 1981.02 Terranean // 05 1981.?? Missile Sprinter - // 06 1980.12 Nebbler + // 06 1980.12 Nebula 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 +clocknch // 11 1981.04 Lock'n'Chase // 12 1981.08 Flash Boy/DECO Kid -cprogolf // 13 1981.08 Pro Golf +cprogolf // 13 1981.08 Tournament 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 + // 17 1981.10 Bobbitto cexplore // 18 1982.02 Explorer cdiscon1 // 19 1982.04 Disco No.1 -csweetht // 19 +csweetht // 19 Sweet Heart ctornado // 20 1982.05 Tornado -cmissnx // 21 1982.04 Mission X/Zoar +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 + // 25 1982.10 Angler Dangler? (fishing) cbtime // 26 1982.08 Hamburger/Burger Time -cburnrub // 27 1982.11 Burnin' Rubber/Bump'n Jump +cburnrub // 27 1982.11 Burnin' Rubber cburnrub2 // 27 -cbnj // 27 -cgraplop // 28 1982.11 Grapelop +cbnj // 27 Bump 'n' Jump +cgraplop // 28 1982.11 Cluster Buster / Graplop cgraplop2 // 28 -clapapa // 29 1982.11 Lapapa/Rootin' Tootin' -clapapa2 // 29 // this one doesn't display lapapa anywhere +clapapa // 29 1982.11 La-Pa-Pa +clapapa2 // 29 Rootin' Tootin' // 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 +cpsoccer // 33 1982.08 Pro Soccer +cpsoccerj // 33 1982.08 Pro Soccer (Japan) // 34 1983.09 Super Doubles Tennis -cflyball // 35 1983.?? Bampoline/Flying Ball +cflyball // 35 1983.?? Flying Ball/Bampoline // 36 1984.04 Genesis/Boomer Rang'r -czeroize // 37 1983.10 Zeroize // doesn't work at all +czeroize // 37 1983.10 Zeroize cscrtry // 38 1984.03 Scrum Try cscrtry2 // 38 cppicf // 39 1984.02 Peter Pepper's Ice Cream Factory @@ -5183,8 +5220,8 @@ // 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 + // UX7 1984.12 Tokyo MIE Clinic/Tokyo MIE Shinryoujo + // UX8 1985.01 Tokyo MIE Clinic/Tokyo MIE Shinryoujo Part 2 // UX9 1985.05 Geinoujin Shikaku Shiken // Data East LD games @@ -5398,18 +5435,7 @@ 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 ?? @@ -5453,8 +5479,9 @@ // MBJ ?? // MBK ?? // MBL ?? -lockload // MBM (c) 1994 Data East Corporation (US) +lockload // MBM (c) 1994 Data East Corporation (World) lockloadu // MBM (c) 1994 Data East Corporation (US) +gunhard // MBM (c) 1994 Data East Corporation (Japan) joemacr // MBN (c) 1994 joemacra // MBN (c) 1994 // MBO ?? @@ -5497,6 +5524,19 @@ stadhr96 // MCM (c) 1996 Data East stadhr96j // MCM (c) 1996 Data East +// SemiCom games on "tumblpop"-like hardware +metlsavr // (c) 1994 First Amusements +wlstar // (c) 1995 Mijin +sdfight // (c) 1996 SemiCom +wondl96 // (c) 1996 SemiCom +htchctch // (c) 1995 SemiCom +cookbib // (c) 1995 SemiCom +chokchok // (c) 1995 SemiCom +bcstry // (c) 1997 SemiCom +bcstrya // (c) 1997 SemiCom +semibase // (c) 1997 SemiCom +dquizgo // (c) 1998 SemiCom + // Tehkan / Tecmo games (Tehkan became Tecmo in 1986) senjyo // (c) 1983 Tehkan starforc // (c) 1984 Tehkan @@ -5841,6 +5881,7 @@ xmen // GX065 (c) 1992 (US) xmenj // GX065 (c) 1992 (Japan) xmene // GX065 (c) 1992 (Europe) +xmena // GX065 (c) 1992 (Asia) xmen2pe // GX065 (c) 1992 (World) xmen2pa // GX065 (c) 1992 (Asia) xmen2pj // GX065 (c) 1992 (Japan) @@ -6093,6 +6134,7 @@ mtrap3 // (c) 1981 mtrap4 // (c) 1981 pepper2 // (c) 1982 +pepper27 // (c) 1982 hardhat // (c) 1982 fax // (c) 1983 fax2 // (c) 1983 @@ -6207,6 +6249,7 @@ asteroid1 // 035127-035145 no copyright notice asteroidb // (bootleg) asterock // Sidam bootleg (c) 1979 +hyperspc // Rumiano bootleg (c) 1979 meteorts // VCC bootleg (c) 1979 meteorho // Hoei? bootleg (c) 1980 astdelux // 0351xx (c) 1980 @@ -6987,15 +7030,17 @@ samsh5sph // 0272 (c) 2004 Playmore samsh5spn // 0272 (c) 2004 Playmore -// The BrezzaSoft games don't have proper ID codes +// Unlicensed commercial releases (no game ID) jockeygp jockeygpa vliner vlinero -// Nor does Digger Man diggerma // No Game ID (unlicensed), (c) 2000 Kyle Hodgetts, prototype +sbp // (c)2004 Vektorlogik + + // Hyper NeoGeo 64 uses a 3 digit rom code? hng64 @@ -7427,6 +7472,7 @@ hydrthnd // (c) 1999 Midway Games offrthnd // (c) 2000 Midway Games arctthnd // (c) 2001 Midway Games +arctthndult // (c) 2001 Midway Games // Midway Touchmaster / Galaxy Games tm // (c) 1996 Midway Games @@ -7635,7 +7681,8 @@ 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) +batlballe // (c) 1995 Seibu Kaihatsu (Metrotainment License) +batlballu // (c) 1995 Seibu Kaihatsu (Fabtek license) viprp1 // (c) 1995 Seibu Kaihatsu viprp1u // (c) 1995 Seibu Kaihatsu (Fabtek license) @@ -7897,6 +7944,7 @@ inufuku // (c) 1998 Video System Co. (Japan) // Psikyo games +// 68020 board samuraia // (c) 1993 (World) sngkace // (c) 1993 (Japan) gunbird // (c) 1994 @@ -7911,6 +7959,11 @@ s1945k // (c) 1995 tengai // (c) 1996 tengaij // (c) 1996 +// Semicom games on "Psikyo 68020"-like hardware +baryon // (c) 1997 SemiCom +dreamwld // (c) 2000 SemiCom + +// SH2 board s1945ii // (c) 1997 soldivid // (c) 1997 sbomber // (c) 1998 @@ -7932,6 +7985,8 @@ loderndfa // (c) 2000 hotdebut // (c) 2000 + + // Orca games marineb // (c) 1982 Orca changes // (c) 1982 Orca @@ -8058,7 +8113,8 @@ gp2se // (c) 1994 Kaneko jchan // (c) 1995 Kaneko jchan2 // (c) 1995 Kaneko -galpani3 // (c) 1995 Kaneko +galpani3 // (c) 1995 Kaneko (World) +galpani3j // (c) 1995 Kaneko (Japan) // Kaneko "AX System" games berlwall // (c) 1991 Kaneko @@ -8077,6 +8133,7 @@ fjbuster // (c) 1992 Kaneko brapboys // (c) 1992 Kaneko brapboysj // (c) 1992 Kaneko +brapboysu // (c) 1992 Kaneko bloodwar // (c) 1994 Kaneko oedfight // (c) 1994 Kaneko bonkadv // (c) 1994 Kaneko @@ -8095,7 +8152,8 @@ 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) +galpanis // 1997.04 (c) 1997 Kaneko (Europe) +galpanisj // 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) @@ -8165,6 +8223,7 @@ atehate // (C) 1993 Athena jjsquawk // (c) 1993 Athena / Able jjsquawkb // bootleg +jjsquawkb2 // bootleg kamenrid // (c) 1993 Toei / Banpresto madshark // (c) 1993 Allumer msgundam // (c) 1993 Banpresto @@ -8417,6 +8476,7 @@ bigtwinb // (c) 1995 wbeachvl // (c) 1995 wbeachvl2 // (c) 1995 +wbeachvl3 // (c) 1995 excelsr // (c) 1995 hotmind // (c) 1995 hrdtimes // (c) 1994 @@ -8814,6 +8874,8 @@ lhzb4 // (c) 200? klxyj // (c) 200? mgfx // (c) 200? +gonefsh2 // (c) 200? +chessc2 // (c) 200? // IGS PGM System Games pgm @@ -8836,11 +8898,15 @@ kov // (c) 1999 kovplus // (c) 1999 kovplusa // (c) 1999 +kovsgqyz // bootleg +kovsgqyza // bootleg +kovsgqyzb // bootleg kov115 // (c) 1999 kov100 // (c) 1999 kovsh // (c) 1999 kovsh103 // (c) 1999 kovqhsgs // bootleg +kovlsqh // bootleg kovlsqh2 // bootleg kovlsjb // bootleg kovlsjba // bootleg @@ -8886,9 +8952,13 @@ ddpdojblk // (c) 2002 Cave espgal // (c) 2003 Cave orleg2 // (c) 2007 +orleg2o // +kov2nl // (c) 2008 +kov2nlo // // IGS PC based HW speeddrv // (c) 2004 +eztouch // (c) 200? // Spirit Tech. Corp. dunhuang // (c) 1995 @@ -9852,9 +9922,9 @@ dleuro // (c) 1983 Atari dlital // (c) 1983 Sidam spaceace // (c) 1983 Cinematronics -spaceaa2 // (c) 1983 Cinematronics -spaceaa // (c) 1983 Cinematronics -saeuro // (c) 1983 Atari +spaceacea2 // (c) 1983 Cinematronics +spaceacea // (c) 1983 Cinematronics +spaceaceeuro // (c) 1983 Atari aztarac // (c) 1983 Centuri (vector game) mole // (c) 1982 Yachiyo Electronics, Ltd. thehand // (c) 1981 T.I.C. @@ -9889,7 +9959,7 @@ pass // (c) 1992 Oksan news // "Virus"??? ((c) 1993 Poby in ROM VIRUS.4) newsa // "Jeansole / Poby -taxidrvr // [1984 Graphic Techno] +taxidriv // [1984 Graphic Techno] xyonix // [1989 Philko] gt507uk // (c) 1986 Grayhound Electronics gt5 // (c) 1984 Grayhound Electronics @@ -9945,7 +10015,7 @@ histryma // bootleg of Fighter's History bbprot // unfinished prototype beaminv // (c) 1979 Tekunon Kougyou (Arcade TV Game List - P.95, Left, 9 from top) -beaminva // (c) 1979 Tekunon Kougyou (Arcade TV Game List - P.95, Left, 9 from top) +pacominv // (c) 1979 Pacom Corporation mcatadv // (c) 1993 Wintechno mcatadvj // (c) 1993 Wintechno catt // (c) 1993 Wintechno @@ -9953,6 +10023,7 @@ nostj // (c) 1993 Face nostk // (c) 1993 Face 4enraya // (c) 1990 IDSA +unkpacg // (c) 19?? ??? oneshot // no copyright notice maddonna // (c) 1995 Tuning maddonnb // (c) 1995 Tuning @@ -9994,6 +10065,7 @@ tutstomb // (c) 199?? Island Design mouseatk // (c) 1996 ICE rapidfir // (c) 1998 Hanaho Games +rapidfira // (c) 1998 Hanaho Games rapidfire // (c) 1998 Hanaho Games maletmad // (c) 1999 Hanaho Games, licensed to Capcom crgolf // (c) 1984 Nasco Japan @@ -10038,6 +10110,7 @@ vamphalf // (c) 1999 DanBi & F2 System vamphalfk // (c) 1999 DanBi & F2 System dquizgo2 // (c) 2000 Semicom +toyland // (c) 2001 Semicom misncrft // (c) 2000 Sun mrdig // (c) 2000 Sun hidnctch // (c) 1998 Eolith @@ -10051,6 +10124,7 @@ landbrk // (c) 1999 Eolith landbrka // (c) 1999 Eolith penfan // (c) 1999 Eolith +stealsee // (c) 2000 Moov Generation / Eolith raccoon // (c) 1999 Eolith fort2b // (c) 2001 Eolith fort2ba // (c) 2001 Eolith @@ -10104,9 +10178,12 @@ sothello // (c) 1986 Success / Fujiwara quake // (c) 19?? Lazer-Tron / iD Software majorpkr // (c) 1994 PAL System. +su2000 // (c) 1993 Virtuality +boonggab // (c) 2001 Taff System // Nexus 3D +acheart acheartf // (c) 2006 Examu // Multi Amenity Cassette System @@ -10118,14 +10195,15 @@ yuka // (c) 1999 Yubis yujan // (C) 1999 Yubis -onetwo // (c) 1997 Barko -onetwoe // (c) 1997 Barko -1945kiii // (c) 2000 Oriental -witch // (c) 1992 Sega / Vic Tokai / Excellent Systems -pbchmp95 // (c) 1995 Veltmeijer Automaten -cardline // (c) 199? Veltmeijer +// BMC + bmcbowl // (c) 1994 BMC koftball // (c) 1995 BMC +bmcpokr // (c) 1999 BMC +popobear // (c) 2000 BMC + +// Merit + mpoker // (c) 1983 Merit pitboss // (c) 1983 Merit pitbossa // (c) 1983 Merit @@ -10189,6 +10267,13 @@ megat5tg // (c) 1997 Merit megat6 // (c) 1998 Merit suprgolf // (c) 1989 Nasco + +onetwo // (c) 1997 Barko +onetwoe // (c) 1997 Barko +1945kiii // (c) 2000 Oriental +witch // (c) 1992 Sega / Vic Tokai / Excellent Systems +pbchmp95 // (c) 1995 Veltmeijer Automaten +cardline // (c) 199? Veltmeijer albatross hotblock // (c) 1993 Nics? / Nix? pntnpuzl // Century? @@ -10217,13 +10302,12 @@ pipeline // (c) 1990 Daehyun Electronics ttchamp ttchampa -baryon // (c) 1997 SemiCom -dreamwld // (c) 2000 SemiCom cybertnk // (c) 1990 Coreland cubeqst // (c) 1983 Simutrek Inc. cubeqsta // (c) 1983 Simutrek Inc. pkscram // (c) 1993 Cosmo Electronics Corporation + // Funworld jollycrd // (c) 1985 TAB-Austria jolyc3x3 // (c) 1985 TAB-Austria @@ -10312,6 +10396,7 @@ attckufo // (c) 1980 Ryoto Electric Co. fortecar +fortecrd jackpool // (c) 1997 Electronic Projects murogem // ??? murogema // ??? @@ -10555,6 +10640,7 @@ esha // (c) 1984 Funai / Gakken eshb // (c) 1984 Funai / Gakken comebaby // (c) 2000 ExPotato +bntyhunt // (c) 200? GCTech Co., LTD peset038 // (c) 1987 IGT - International Gaming Technology pepp0043 // (c) 1987 IGT - International Gaming Technology pepp0065 // (c) 1987 IGT - International Gaming Technology @@ -10589,8 +10675,18 @@ drw80pk2 // (c) 1983 IGT fortune1 // (c) 1984 IGT blazlaz // (c) 1989 Hudson Soft +keith // (c) 1989 Hudson Soft +aliencr // (c) 1989 Hudson Soft +paclandp // (c) 1989 Namco ggconnie // (c) ???? Capcom paranoia // (c) 1990 Naxat Soft +tourvis // (c) ???? Tourvision +tvusapb // (c) 1989 Aicom (Tourvision bootleg) +tvdunexp // (c) 1989 Hudson / Atlus (Tourvision bootleg) +tvthbld // (c) 1990 Sega / NEC Avenue (Tourvision bootleg) +tvrs2 // (c) 1990 Taito (Tourvision bootleg) +tvpwlg4 // (c) 1991 Hudson (Tourvision bootleg) +tvsci // (c) 1991 Taito (Tourvision bootleg) vcombat // (c) 1993 VR8 Inc. shadfgtr // (c) 1993 DUTECH Inc. skimaxx // (c) 1996 Kyle Hodgetts/ICE @@ -10614,6 +10710,7 @@ bingor4 // (c) 2002 Unknown bingor5 // (c) 2002 Unknown galgame // (c) 1971 Computer Recreations, Inc +ichiban // (c) 199? Excel // InterFlip / Recreativos Franco videopkr // (c) 1984 InterFlip @@ -10803,6 +10900,7 @@ lucky8a // (c) 1989 Wing Co. Ltd lucky8b // (c) 1989 Wing Co. Ltd luckgrln // (c) 1991 Wing Co. Ltd +7smash // (c) 1993 Sovic luckylad // (c) 1985 Wing Co. Ltd bingowng // (c) 1993 Wing Co. Ltd bingownga // (c) 1993 Wing Co. Ltd @@ -11192,6 +11290,13 @@ fcockt_10 // (c) 2003 fcockt_11 // (c) 2003 fcockt_12 // (c) 2003 +fcockt2_3 +fcockt2_4 +fcockt2_4a +fcockt2_4b +fcockt2_4d +fcockt2_4f +fcockt2_5 // Lucky Haunter //lhaunt // (c) 2003 @@ -11673,9 +11778,12 @@ // Quizard (Philips CD-I based HW) cdimono1 // Base unit quizard // (c) TAB Austria 1996 -quizrd22 // (c) TAB Austria 1995 -quizrd17 // (c) TAB Austria 1996 quizrd12 // (c) TAB Austria 1996 +quizrd17 // (c) TAB Austria 1996 +quizrd18 // (c) TAB Austria 199? +quizrd22 // (c) TAB Austria 1995 +quizrd23 // (c) TAB Austria 199? +quizrd34 // (c) TAB Austria 199? quizrr42 // (c) TAB Austria 1998 quizrr41 // (c) TAB Austria 1998 quizrr40 // (c) TAB Austria 1997 @@ -16746,8 +16854,34 @@ m1cluessrp m1cluesss m1cluesssp -m1coderd // Code Red Club (Maygay) +m1coderd +m1coderdp m1coro // Coronation Street (Maygay) +m1corop +m1coro32g +m1coro32gh +m1coro12g +m1coro12gp +m1coro12a +m1coro10h1 +m1coro10h2 +m1coro10h3 +m1coro81 +m1coro81p +m1coro32n +m1coro32np +m1coro22n +m1coro21n +m1coro21np +m1coro12n +m1coro12np +m1coro11n +m1coro11np +m1coro31 +m1coro31p +m1coro30h +m1coro21v +m1coro21vp m1cororr // Coronation Street - Rovers Return (Maygay) m1corocb // Coronation Street Club (Maygay) m1corosh // Coronation Street Showcase (Maygay) @@ -18071,7 +18205,7 @@ m5fire // All Fired Up (Barcrest) m5arab // Arabian Nights (Barcrest) m5austin // Austin Powers (Barcrest) -m5bankrl // Bank Roll (Barcrest) +m5bankrl // The Bank Roll (Barcrest) m5barkng // Barking Mad (Barcrest) m5barmy // Barmy Army (Barcrest) m5baxe // Battle Axe (Barcrest) @@ -18094,7 +18228,7 @@ m5cosclb // Costa Del Cash Club (Barcrest) m5crzkni // Crazy Crazy Knights (Barcrest) m5doshpk // Do$h & Pecks (Barcrest) -m5draclb // Dracula Club (Barcrest) +m5draclb // Ooh Aah Dracula Club (Barcrest) m5ewn // Each Way Nudge (Barcrest) m5elim // Eliminator (Barcrest) m5egr // Elvis Gold Rush (Barcrest) diff -Nru mame-0.144/src/mame/mame.mak mame-0.145/src/mame/mame.mak --- mame-0.144/src/mame/mame.mak 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/mame.mak 2012-02-06 21:30:43.000000000 +0000 @@ -524,6 +524,8 @@ $(MAMEOBJ)/bmc.a: \ $(DRIVERS)/bmcbowl.o \ $(DRIVERS)/koftball.o \ + $(DRIVERS)/popobear.o \ + $(DRIVERS)/bmcpokr.o \ $(MAMEOBJ)/capcom.a: \ $(DRIVERS)/1942.o $(VIDEO)/1942.o \ @@ -751,6 +753,7 @@ $(DRIVERS)/iqblock.o $(VIDEO)/iqblock.o \ $(DRIVERS)/lordgun.o $(VIDEO)/lordgun.o \ $(DRIVERS)/pgm.o $(VIDEO)/pgm.o \ + $(DRIVERS)/pgm2.o \ $(DRIVERS)/spoker.o \ $(MACHINE)/pgmcrypt.o \ $(MACHINE)/pgmprot.o \ @@ -1134,6 +1137,7 @@ $(MAMEOBJ)/pce.a: \ $(DRIVERS)/ggconnie.o \ $(DRIVERS)/paranoia.o \ + $(DRIVERS)/tourvis.o \ $(DRIVERS)/uapce.o \ $(MACHINE)/pcecommn.o $(VIDEO)/vdc.o \ @@ -1194,6 +1198,7 @@ $(DRIVERS)/megaplay.o \ $(DRIVERS)/megatech.o \ $(DRIVERS)/model1.o $(MACHINE)/model1.o $(VIDEO)/model1.o \ + $(AUDIO)/dsbz80.o \ $(DRIVERS)/model2.o $(VIDEO)/model2.o \ $(DRIVERS)/model3.o $(VIDEO)/model3.o $(MACHINE)/model3.o \ $(DRIVERS)/naomi.o $(MACHINE)/dc.o $(VIDEO)/dc.o $(MACHINE)/naomi.o \ @@ -1203,6 +1208,7 @@ $(DRIVERS)/puckpkmn.o \ $(DRIVERS)/segac2.o \ $(DRIVERS)/segae.o $(MACHINE)/segamsys.o \ + $(DRIVERS)/shtzone.o \ $(DRIVERS)/segag80r.o $(MACHINE)/segag80.o $(AUDIO)/segag80r.o $(VIDEO)/segag80r.o \ $(DRIVERS)/segag80v.o $(AUDIO)/segag80v.o $(VIDEO)/segag80v.o \ $(DRIVERS)/segahang.o $(VIDEO)/segahang.o \ @@ -1683,6 +1689,7 @@ $(DRIVERS)/coinmstr.o \ $(DRIVERS)/coinmvga.o \ $(DRIVERS)/comebaby.o \ + $(DRIVERS)/bntyhunt.o \ $(DRIVERS)/coolpool.o \ $(DRIVERS)/corona.o \ $(DRIVERS)/crystal.o $(VIDEO)/vrender0.o \ @@ -1731,6 +1738,7 @@ $(DRIVERS)/homedata.o $(VIDEO)/homedata.o \ $(DRIVERS)/hotblock.o \ $(DRIVERS)/hotstuff.o \ + $(DRIVERS)/ichiban.o \ $(DRIVERS)/imolagp.o \ $(DRIVERS)/intrscti.o \ $(DRIVERS)/istellar.o \ @@ -1823,13 +1831,14 @@ $(DRIVERS)/sstrangr.o \ $(DRIVERS)/statriv2.o \ $(DRIVERS)/stellafr.o \ + $(DRIVERS)/su2000.o \ $(DRIVERS)/summit.o \ $(DRIVERS)/sumt8035.o \ $(DRIVERS)/supertnk.o \ $(DRIVERS)/superwng.o \ $(DRIVERS)/tapatune.o \ $(DRIVERS)/tattack.o \ - $(DRIVERS)/taxidrvr.o $(VIDEO)/taxidrvr.o \ + $(DRIVERS)/taxidriv.o $(VIDEO)/taxidriv.o \ $(DRIVERS)/tcl.o \ $(DRIVERS)/thayers.o \ $(DRIVERS)/thedeep.o $(VIDEO)/thedeep.o \ @@ -1905,6 +1914,8 @@ $(DRIVERS)/balsente.o: $(LAYOUT)/stocker.lh +$(DRIVERS)/beaminv.o: $(LAYOUT)/beaminv.lh + $(DRIVERS)/bfm_sc1.o: $(LAYOUT)/bfm_sc1.lh $(DRIVERS)/bfm_sc2.o: $(LAYOUT)/bfm_sc2.lh \ @@ -1958,6 +1969,8 @@ $(DRIVERS)/firebeat.o: $(LAYOUT)/firebeat.lh +$(DRIVERS)/fortecar.o: $(LAYOUT)/fortecrd.lh + $(DRIVERS)/funworld.o: $(LAYOUT)/jollycrd.lh \ $(LAYOUT)/bigdeal.lh \ $(LAYOUT)/novoplay.lh \ @@ -2163,6 +2176,9 @@ $(MAMESRC)/machine/nes_unif.c $(VIDEO)/jaguar.o: $(MAMESRC)/video/jagobj.c \ $(MAMESRC)/video/jagblit.c +$(DRIVERS)/model1.o: $(MAMESRC)/includes/model1.h $(MAMESRC)/audio/dsbz80.h +$(VIDEO)/model1.o: $(MAMESRC)/includes/model1.h $(MAMESRC)/audio/dsbz80.h +$(MACHINE)/model1.o: $(MAMESRC)/includes/model1.h $(MAMESRC)/audio/dsbz80.h $(VIDEO)/model2.o: $(MAMESRC)/video/model2rd.c $(VIDEO)/model3.o: $(MAMESRC)/video/m3raster.c $(VIDEO)/n64.o: $(MAMESRC)/video/rdpfiltr.c diff -Nru mame-0.144/src/mame/video/1942.c mame-0.145/src/mame/video/1942.c --- mame-0.144/src/mame/video/1942.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/1942.c 2012-02-06 21:30:32.000000000 +0000 @@ -130,7 +130,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 16); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -145,7 +145,7 @@ _1942_state *state = space->machine().driver_data<_1942_state>(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( c1942_bgvideoram_w ) @@ -153,7 +153,7 @@ _1942_state *state = space->machine().driver_data<_1942_state>(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, (offset & 0x0f) | ((offset >> 1) & 0x01f0)); + state->m_bg_tilemap->mark_tile_dirty((offset & 0x0f) | ((offset >> 1) & 0x01f0)); } @@ -164,7 +164,7 @@ if (state->m_palette_bank != data) { state->m_palette_bank = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -173,7 +173,7 @@ _1942_state *state = space->machine().driver_data<_1942_state>(); state->m_scroll[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll[0] | (state->m_scroll[1] << 8)); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll[0] | (state->m_scroll[1] << 8)); } @@ -198,7 +198,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { _1942_state *state = machine.driver_data<_1942_state>(); int offs; @@ -240,12 +240,12 @@ } -SCREEN_UPDATE( 1942 ) +SCREEN_UPDATE_IND16( 1942 ) { - _1942_state *state = screen->machine().driver_data<_1942_state>(); + _1942_state *state = screen.machine().driver_data<_1942_state>(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/1943.c mame-0.145/src/mame/video/1943.c --- mame-0.144/src/mame/video/1943.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/1943.c 2012-02-06 21:30:32.000000000 +0000 @@ -123,7 +123,7 @@ _1943_state *state = space->machine().driver_data<_1943_state>(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( c1943_colorram_w ) @@ -131,7 +131,7 @@ _1943_state *state = space->machine().driver_data<_1943_state>(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( c1943_c804_w ) @@ -191,7 +191,7 @@ int color = (attr & 0x3c) >> 2; int flags = TILE_FLIPYX((attr & 0xc0) >> 6); - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO(1, code, color, flags); } @@ -213,7 +213,7 @@ state->m_fg_tilemap = tilemap_create(machine, c1943_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[1], 0x0f); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->save_item(NAME(state->m_char_on)); state->save_item(NAME(state->m_obj_on)); @@ -221,7 +221,7 @@ state->save_item(NAME(state->m_bg2_on)); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { _1943_state *state = machine.driver_data<_1943_state>(); int offs; @@ -254,29 +254,29 @@ } } -SCREEN_UPDATE( 1943 ) +SCREEN_UPDATE_IND16( 1943 ) { - _1943_state *state = screen->machine().driver_data<_1943_state>(); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bgscrollx[0] + 256 * state->m_bgscrollx[1]); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly[0]); + _1943_state *state = screen.machine().driver_data<_1943_state>(); + state->m_bg2_tilemap->set_scrollx(0, state->m_bgscrollx[0] + 256 * state->m_bgscrollx[1]); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly[0]); if (state->m_bg2_on) - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (state->m_obj_on) - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); if (state->m_bg1_on) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_obj_on) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); if (state->m_char_on) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/20pacgal.c mame-0.145/src/mame/video/20pacgal.c --- mame-0.144/src/mame/video/20pacgal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/20pacgal.c 2012-02-06 21:30:31.000000000 +0000 @@ -73,16 +73,16 @@ } -static void do_pen_lookup(running_machine &machine, const _20pacgal_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void do_pen_lookup(running_machine &machine, const _20pacgal_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int y, x; pen_t pens[NUM_PENS + NUM_STAR_PENS]; get_pens(machine, state, pens); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - for(x = cliprect->min_x; x <= cliprect->max_x; x++) - *BITMAP_ADDR32(bitmap, y, x) = pens[*BITMAP_ADDR32(bitmap, y, x)]; + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for(x = cliprect.min_x; x <= cliprect.max_x; x++) + bitmap.pix32(y, x) = pens[bitmap.pix32(y, x)]; } @@ -93,7 +93,7 @@ * *************************************/ -static void draw_sprite(running_machine& machine, const _20pacgal_state *state, bitmap_t *bitmap, int y, int x, +static void draw_sprite(running_machine& machine, const _20pacgal_state *state, bitmap_rgb32 &bitmap, int y, int x, UINT8 code, UINT8 color, int flip_y, int flip_x) { int sy; @@ -139,7 +139,7 @@ /* pen bits A0-A3 */ if (col) - *BITMAP_ADDR32(bitmap, y, x) = (*BITMAP_ADDR32(bitmap, y, x) & 0xff0) | col; + bitmap.pix32(y, x) = (bitmap.pix32(y, x) & 0xff0) | col; } /* next pixel */ @@ -163,7 +163,7 @@ } -static void draw_sprites(running_machine& machine,const _20pacgal_state *state, bitmap_t *bitmap) +static void draw_sprites(running_machine& machine,const _20pacgal_state *state, bitmap_rgb32 &bitmap) { int offs; @@ -215,7 +215,7 @@ * *************************************/ -static void draw_chars(const _20pacgal_state *state, bitmap_t *bitmap) +static void draw_chars(const _20pacgal_state *state, bitmap_rgb32 &bitmap) { offs_t offs; @@ -274,7 +274,7 @@ /* pen bits A4-A11 */ if ( col != 0 ) - *BITMAP_ADDR32(bitmap, y, x) = (color_base | col) << 4; + bitmap.pix32(y, x) = (color_base | col) << 4; /* next pixel */ if (flip) @@ -349,7 +349,7 @@ * */ -static void draw_stars(_20pacgal_state *state, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_stars(_20pacgal_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { if ( (state->m_stars_ctrl[0] >> 5) & 1 ) { @@ -391,8 +391,8 @@ if (((lfsr & 0xffc0) == star_seta) || ((lfsr & 0xffc0) == star_setb)) { - if (y >= cliprect->min_y && y <= cliprect->max_y) - *BITMAP_ADDR32(bitmap, y, x) = NUM_PENS + (lfsr & 0x3f); + if (y >= cliprect.min_y && y <= cliprect.max_y) + bitmap.pix32(y, x) = NUM_PENS + (lfsr & 0x3f); cnt++; } } @@ -406,15 +406,15 @@ * *************************************/ -static SCREEN_UPDATE( 20pacgal ) +static SCREEN_UPDATE_RGB32( 20pacgal ) { - _20pacgal_state *state = screen->machine().driver_data<_20pacgal_state>(); + _20pacgal_state *state = screen.machine().driver_data<_20pacgal_state>(); - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); draw_stars(state, bitmap,cliprect); draw_chars(state, bitmap); - draw_sprites(screen->machine(),state, bitmap); - do_pen_lookup(screen->machine(), state, bitmap, cliprect); + draw_sprites(screen.machine(),state, bitmap); + do_pen_lookup(screen.machine(), state, bitmap, cliprect); return 0; } @@ -431,8 +431,7 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(SCREEN_WIDTH, SCREEN_HEIGHT) MCFG_SCREEN_VISIBLE_AREA(0, SCREEN_WIDTH - 1, 0, SCREEN_HEIGHT - 1) - MCFG_SCREEN_UPDATE(20pacgal) + MCFG_SCREEN_UPDATE_STATIC(20pacgal) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/40love.c mame-0.145/src/mame/video/40love.c --- mame-0.144/src/mame/video/40love.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/40love.c 2012-02-06 21:30:33.000000000 +0000 @@ -90,7 +90,7 @@ { fortyl_state *state = machine.driver_data(); state->m_pix_redraw = 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } @@ -106,15 +106,15 @@ state->m_pixram1 = auto_alloc_array_clear(machine, UINT8, 0x4000); state->m_pixram2 = auto_alloc_array_clear(machine, UINT8, 0x4000); - state->m_tmp_bitmap1 = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); - state->m_tmp_bitmap2 = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); + state->m_tmp_bitmap1 = auto_bitmap_ind16_alloc(machine, 256, 256); + state->m_tmp_bitmap2 = auto_bitmap_ind16_alloc(machine, 256, 256); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_xoffset = 128; // this never changes - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_scroll_rows(32); + state->m_bg_tilemap->set_transparent_pen(0); state->save_item(NAME(state->m_flipscreen)); state->save_item(NAME(state->m_pix_color)); @@ -147,7 +147,7 @@ x &= 0x1ff; if (x & 0x100) x -= 0x200; /* sign extend */ - tilemap_set_scrollx(state->m_bg_tilemap, offset / 2, x); + state->m_bg_tilemap->set_scrollx(offset / 2, x); } WRITE8_HANDLER( fortyl_pixram_sel_w ) @@ -201,9 +201,9 @@ { c = ((d2 >> i) & 1) + ((d1 >> i) & 1) * 2; if (state->m_pixram_sel) - *BITMAP_ADDR16(state->m_tmp_bitmap2, y, x + i) = state->m_pix_color[c]; + state->m_tmp_bitmap2->pix16(y, x + i) = state->m_pix_color[c]; else - *BITMAP_ADDR16(state->m_tmp_bitmap1, y, x + i) = state->m_pix_color[c]; + state->m_tmp_bitmap1->pix16(y, x + i) = state->m_pix_color[c]; } } @@ -223,7 +223,7 @@ { fortyl_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( fortyl_bg_videoram_r ) @@ -241,7 +241,7 @@ state->m_colorram[offset] = data; for (i = (offset / 2) * 64; i < (offset / 2) * 64 + 64; i++) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); fortyl_set_scroll_x(space->machine(), offset); } @@ -274,7 +274,7 @@ offset 3 xxxxxxxx x position */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { fortyl_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -338,7 +338,7 @@ } } -static void draw_pixram( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_pixram( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { fortyl_state *state = machine.driver_data(); int offs; @@ -353,19 +353,19 @@ } if (state->m_pixram_sel) - copybitmap(bitmap, state->m_tmp_bitmap1, f, f, state->m_xoffset, 0, cliprect); + copybitmap(bitmap, *state->m_tmp_bitmap1, f, f, state->m_xoffset, 0, cliprect); else - copybitmap(bitmap, state->m_tmp_bitmap2, f, f, state->m_xoffset, 0, cliprect); + copybitmap(bitmap, *state->m_tmp_bitmap2, f, f, state->m_xoffset, 0, cliprect); } -SCREEN_UPDATE( fortyl ) +SCREEN_UPDATE_IND16( fortyl ) { - fortyl_state *state = screen->machine().driver_data(); - draw_pixram(screen->machine(), bitmap, cliprect); + fortyl_state *state = screen.machine().driver_data(); + draw_pixram(screen.machine(), bitmap, cliprect); - tilemap_set_scrolldy(state->m_bg_tilemap, - state->m_video_ctrl[1] + 1, - state->m_video_ctrl[1] - 1 ); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolldy(- state->m_video_ctrl[1] + 1, - state->m_video_ctrl[1] - 1 ); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/4enraya.c mame-0.145/src/mame/video/4enraya.c --- mame-0.144/src/mame/video/4enraya.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/4enraya.c 2012-02-06 21:30:31.000000000 +0000 @@ -15,7 +15,7 @@ state->m_videoram[(offset & 0x3ff) * 2] = data; state->m_videoram[(offset & 0x3ff) * 2 + 1] = (offset & 0xc00) >> 10; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } static TILE_GET_INFO( get_tile_info ) @@ -37,10 +37,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -SCREEN_UPDATE( 4enraya ) +SCREEN_UPDATE_IND16( 4enraya ) { - _4enraya_state *state = screen->machine().driver_data<_4enraya_state>(); + _4enraya_state *state = screen.machine().driver_data<_4enraya_state>(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/8080bw.c mame-0.145/src/mame/video/8080bw.c --- mame-0.144/src/mame/video/8080bw.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/8080bw.c 2012-02-06 21:30:32.000000000 +0000 @@ -63,21 +63,21 @@ } -INLINE void set_pixel( running_machine &machine, bitmap_t *bitmap, UINT8 y, UINT8 x, pen_t *pens, UINT8 color ) +INLINE void set_pixel( running_machine &machine, bitmap_rgb32 &bitmap, UINT8 y, UINT8 x, pen_t *pens, UINT8 color ) { _8080bw_state *state = machine.driver_data<_8080bw_state>(); if (y >= MW8080BW_VCOUNTER_START_NO_VBLANK) { if (state->m_c8080bw_flip_screen) - *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pens[color]; + bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pens[color]; else - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pens[color]; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pens[color]; } } -INLINE void set_8_pixels( running_machine &machine, bitmap_t *bitmap, UINT8 y, UINT8 x, UINT8 data, pen_t *pens, UINT8 fore_color, UINT8 back_color ) +INLINE void set_8_pixels( running_machine &machine, bitmap_rgb32 &bitmap, UINT8 y, UINT8 x, UINT8 data, pen_t *pens, UINT8 fore_color, UINT8 back_color ) { int i; @@ -92,7 +92,7 @@ /* this is needed as this driver doesn't emulate the shift register like mw8080bw does */ -static void clear_extra_columns( running_machine &machine, bitmap_t *bitmap, pen_t *pens, UINT8 color ) +static void clear_extra_columns( running_machine &machine, bitmap_rgb32 &bitmap, pen_t *pens, UINT8 color ) { _8080bw_state *state = machine.driver_data<_8080bw_state>(); UINT8 x; @@ -104,17 +104,17 @@ for (y = MW8080BW_VCOUNTER_START_NO_VBLANK; y != 0; y++) { if (state->m_c8080bw_flip_screen) - *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + x)) = pens[color]; + bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + x)) = pens[color]; else - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + x) = pens[color]; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + x) = pens[color]; } } } -SCREEN_UPDATE( invadpt2 ) +SCREEN_UPDATE_RGB32( invadpt2 ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *prom; @@ -122,7 +122,7 @@ invadpt2_get_pens(pens); - prom = screen->machine().region("proms")->base(); + prom = screen.machine().region("proms")->base(); color_map_base = state->m_color_map ? &prom[0x0400] : &prom[0x0000]; for (offs = 0; offs < state->m_main_ram_size; offs++) @@ -135,18 +135,18 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = state->m_screen_red ? 1 : color_map_base[color_address] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( ballbomb ) +SCREEN_UPDATE_RGB32( ballbomb ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *color_map_base; @@ -154,7 +154,7 @@ invadpt2_get_pens(pens); - prom = screen->machine().region("proms")->base(); + prom = screen.machine().region("proms")->base(); color_map_base = state->m_color_map ? &prom[0x0400] : &prom[0x0000]; for (offs = 0; offs < state->m_main_ram_size; offs++) @@ -168,25 +168,25 @@ UINT8 fore_color = state->m_screen_red ? 1 : color_map_base[color_address] & 0x07; /* blue background */ - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 2); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 2); } - clear_extra_columns(screen->machine(), bitmap, pens, 2); + clear_extra_columns(screen.machine(), bitmap, pens, 2); return 0; } -SCREEN_UPDATE( schaser ) +SCREEN_UPDATE_RGB32( schaser ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *background_map_base; invadpt2_get_pens(pens); - background_map_base = screen->machine().region("proms")->base(); + background_map_base = screen.machine().region("proms")->base(); for (offs = 0; offs < state->m_main_ram_size; offs++) { @@ -209,18 +209,18 @@ back_color = (((back_data & 0x0c) == 0x0c) && state->m_schaser_background_select) ? 4 : 2; } - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, back_color); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, back_color); } - clear_extra_columns(screen->machine(), bitmap, pens, state->m_schaser_background_disable ? 0 : 2); + clear_extra_columns(screen.machine(), bitmap, pens, state->m_schaser_background_disable ? 0 : 2); return 0; } -SCREEN_UPDATE( schasercv ) +SCREEN_UPDATE_RGB32( schasercv ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; @@ -235,18 +235,18 @@ UINT8 fore_color = state->m_colorram[offs & 0x1f9f] & 0x07; /* blue background */ - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 2); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 2); } - clear_extra_columns(screen->machine(), bitmap, pens, 2); + clear_extra_columns(screen.machine(), bitmap, pens, 2); return 0; } -SCREEN_UPDATE( rollingc ) +SCREEN_UPDATE_RGB32( rollingc ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; @@ -260,18 +260,18 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = state->m_colorram[offs & 0x1f1f] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( polaris ) +SCREEN_UPDATE_RGB32( polaris ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *color_map_base; @@ -279,8 +279,8 @@ invadpt2_get_pens(pens); - color_map_base = screen->machine().region("proms")->base(); - cloud_gfx = screen->machine().region("user1")->base(); + color_map_base = screen.machine().region("proms")->base(); + cloud_gfx = screen.machine().region("user1")->base(); for (offs = 0; offs < state->m_main_ram_size; offs++) { @@ -304,7 +304,7 @@ if ((color_map_base[color_address] & 0x08) || (cloud_y >= 64)) { - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, back_color); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, back_color); } else { @@ -327,7 +327,7 @@ color = (cloud_gfx[cloud_gfx_offs] & bit) ? 7 : back_color; } - set_pixel(screen->machine(), bitmap, y, x, pens, color); + set_pixel(screen.machine(), bitmap, y, x, pens, color); x = x + 1; data = data >> 1; @@ -335,15 +335,15 @@ } } - clear_extra_columns(screen->machine(), bitmap, pens, 6); + clear_extra_columns(screen.machine(), bitmap, pens, 6); return 0; } -SCREEN_UPDATE( lupin3 ) +SCREEN_UPDATE_RGB32( lupin3 ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; @@ -357,18 +357,18 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = ~state->m_colorram[offs & 0x1f9f] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( cosmo ) +SCREEN_UPDATE_RGB32( cosmo ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; @@ -384,18 +384,18 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = state->m_colorram[color_address] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( indianbt ) +SCREEN_UPDATE_RGB32( indianbt ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; UINT8 *color_map_base; @@ -403,7 +403,7 @@ cosmo_get_pens(pens); - prom = screen->machine().region("proms")->base(); + prom = screen.machine().region("proms")->base(); color_map_base = state->m_color_map ? &prom[0x0400] : &prom[0x0000]; for (offs = 0; offs < state->m_main_ram_size; offs++) @@ -416,18 +416,18 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = color_map_base[color_address] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( shuttlei ) +SCREEN_UPDATE_RGB32( shuttlei ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[2] = { RGB_BLACK, RGB_WHITE }; offs_t offs; @@ -443,22 +443,22 @@ for (i = 0; i < 8; i++) { pen_t pen = (data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data = data << 1; } } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } -SCREEN_UPDATE( sflush ) +SCREEN_UPDATE_RGB32( sflush ) { - _8080bw_state *state = screen->machine().driver_data<_8080bw_state>(); + _8080bw_state *state = screen.machine().driver_data<_8080bw_state>(); pen_t pens[NUM_PENS]; offs_t offs; @@ -472,10 +472,10 @@ UINT8 data = state->m_main_ram[offs]; UINT8 fore_color = state->m_colorram[offs & 0x1f9f] & 0x07; - set_8_pixels(screen->machine(), bitmap, y, x, data, pens, fore_color, 0); + set_8_pixels(screen.machine(), bitmap, y, x, data, pens, fore_color, 0); } - clear_extra_columns(screen->machine(), bitmap, pens, 0); + clear_extra_columns(screen.machine(), bitmap, pens, 0); return 0; } diff -Nru mame-0.144/src/mame/video/88games.c mame-0.145/src/mame/video/88games.c --- mame-0.144/src/mame/video/88games.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/88games.c 2012-02-06 21:30:31.000000000 +0000 @@ -54,9 +54,9 @@ ***************************************************************************/ -SCREEN_UPDATE( 88games ) +SCREEN_UPDATE_IND16( 88games ) { - _88games_state *state = screen->machine().driver_data<_88games_state>(); + _88games_state *state = screen.machine().driver_data<_88games_state>(); k052109_tilemap_update(state->m_k052109); diff -Nru mame-0.144/src/mame/video/actfancr.c mame-0.145/src/mame/video/actfancr.c --- mame-0.144/src/mame/video/actfancr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/actfancr.c 2012-02-06 21:30:32.000000000 +0000 @@ -24,17 +24,17 @@ /******************************************************************************/ -SCREEN_UPDATE( actfancr ) +SCREEN_UPDATE_IND16( actfancr ) { - actfancr_state *state = screen->machine().driver_data(); + actfancr_state *state = screen.machine().driver_data(); /* Draw playfield */ //state->m_flipscreen = state->m_control_2[0] & 0x80; - //tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + //screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram16, 0x00, 0x00, 0x0f); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } diff -Nru mame-0.144/src/mame/video/aeroboto.c mame-0.145/src/mame/video/aeroboto.c --- mame-0.144/src/mame/video/aeroboto.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/aeroboto.c 2012-02-06 21:30:33.000000000 +0000 @@ -45,8 +45,8 @@ aeroboto_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 64); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scroll_rows(state->m_bg_tilemap, 64); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_rows(64); state->save_item(NAME(state->m_charbank)); state->save_item(NAME(state->m_starsoff)); @@ -94,7 +94,7 @@ /* bit 1 = char bank select */ if (state->m_charbank != ((data & 0x02) >> 1)) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_charbank = (data & 0x02) >> 1; } @@ -107,7 +107,7 @@ aeroboto_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( aeroboto_tilecolor_w ) @@ -117,7 +117,7 @@ if (state->m_tilecolor[offset] != data) { state->m_tilecolor[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -129,7 +129,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { aeroboto_state *state = machine.driver_data(); int offs; @@ -154,12 +154,12 @@ } -SCREEN_UPDATE( aeroboto ) +SCREEN_UPDATE_IND16( aeroboto ) { - aeroboto_state *state = screen->machine().driver_data(); + aeroboto_state *state = screen.machine().driver_data(); - static const rectangle splitrect1 = { 0, 255, 0, 39 }; - static const rectangle splitrect2 = { 0, 255, 40, 255 }; + const rectangle splitrect1(0, 255, 0, 39); + const rectangle splitrect2(0, 255, 40, 255); UINT8 *src_base, *src_colptr, *src_rowptr; int src_offsx, src_colmask, sky_color, star_color, x, y, i, j, pen; @@ -176,7 +176,7 @@ star_color += 2; - bitmap_fill(bitmap, cliprect, sky_color); + bitmap.fill(sky_color, cliprect); // actual scroll speed is unknown but it can be adjusted by changing the SCROLL_SPEED constant state->m_sx += (char)(*state->m_starx - state->m_ox); @@ -202,7 +202,7 @@ { src_rowptr = src_colptr + (((y + j) & 0xff) << 5 ); if (!((unsigned)*src_rowptr & src_colmask)) - *BITMAP_ADDR16(bitmap, j, i) = pen; + bitmap.pix16(j, i) = pen; } } } @@ -210,20 +210,20 @@ { state->m_sx = state->m_ox = *state->m_starx; state->m_sy = state->m_oy = *state->m_stary; - bitmap_fill(bitmap, cliprect, sky_color); + bitmap.fill(sky_color, cliprect); } for (y = 0; y < 64; y++) - tilemap_set_scrollx(state->m_bg_tilemap, y, state->m_hscroll[y]); + state->m_bg_tilemap->set_scrollx(y, state->m_hscroll[y]); // the playfield is part of a splitscreen and should not overlap with status display - tilemap_set_scrolly(state->m_bg_tilemap, 0, *state->m_vscroll); - tilemap_draw(bitmap, &splitrect2, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolly(0, *state->m_vscroll); + state->m_bg_tilemap->draw(bitmap, splitrect2, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); // the status display behaves more closely to a 40-line splitscreen than an overlay - tilemap_set_scrolly(state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, &splitrect1, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolly(0, 0); + state->m_bg_tilemap->draw(bitmap, splitrect1, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/aerofgt.c mame-0.145/src/mame/video/aerofgt.c --- mame-0.144/src/mame/video/aerofgt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/aerofgt.c 2012-02-06 21:30:32.000000000 +0000 @@ -116,7 +116,7 @@ state->m_bg1_tilemap = tilemap_create(machine, karatblz_bg1_tile_info,tilemap_scan_rows, 8,8,64,64); state->m_bg2_tilemap = tilemap_create(machine, karatblz_bg2_tile_info,tilemap_scan_rows,8,8,64,64); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 15); + state->m_bg2_tilemap->set_transparent_pen(15); state->m_spritepalettebank = 0; state->m_sprite_gfx = 2; @@ -131,7 +131,7 @@ state->m_bg1_tilemap = tilemap_create(machine, spinlbrk_bg1_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_bg2_tilemap = tilemap_create(machine, karatblz_bg2_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 15); + state->m_bg2_tilemap->set_transparent_pen(15); state->m_spritepalettebank = 0; state->m_sprite_gfx = 2; @@ -160,7 +160,7 @@ state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 15); + state->m_bg2_tilemap->set_transparent_pen(15); state->m_spritepalettebank = 0; state->m_sprite_gfx = 2; @@ -174,7 +174,7 @@ state->m_bg1_tilemap = tilemap_create(machine, get_pspikes_tile_info, tilemap_scan_rows, 8, 8, 64, 32); /* no bg2 in this game */ - tilemap_set_transparent_pen(state->m_bg1_tilemap, 15); + state->m_bg1_tilemap->set_transparent_pen(15); state->m_sprite_gfx = 1; @@ -193,14 +193,14 @@ { aerofgt_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg1videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset); + state->m_bg1_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( aerofgt_bg2videoram_w ) { aerofgt_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg2videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset); + state->m_bg2_tilemap->mark_tile_dirty(offset); } @@ -210,7 +210,7 @@ if (state->m_gfxbank[num] != bank) { state->m_gfxbank[num] = bank; - tilemap_mark_all_tiles_dirty(tmap); + tmap->mark_all_dirty(); } } @@ -316,7 +316,7 @@ if (state->m_charpalettebank != (data & 0x1c) >> 2) { state->m_charpalettebank = (data & 0x1c) >> 2; - tilemap_mark_all_tiles_dirty(state->m_bg1_tilemap); + state->m_bg1_tilemap->mark_all_dirty(); } } } @@ -333,7 +333,7 @@ ***************************************************************************/ -static void aerofgt_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void aerofgt_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { aerofgt_state *state = machine.driver_data(); int offs; @@ -404,7 +404,8 @@ } } -static void turbofrc_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, int chip_disabled_pri ) +template +static void turbofrc_draw_sprites( running_machine &machine, _BitmapClass &bitmap, const rectangle &cliprect, int chip, int chip_disabled_pri ) { aerofgt_state *state = machine.driver_data(); int attr_start, base, first; @@ -489,7 +490,7 @@ } } -static void spinlbrk_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, int chip_disabled_pri ) +static void spinlbrk_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, int chip_disabled_pri ) { aerofgt_state *state = machine.driver_data(); int attr_start, base, first; @@ -573,7 +574,7 @@ } } -static void aerfboo2_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, int chip_disabled_pri ) +static void aerfboo2_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, int chip_disabled_pri ) { aerofgt_state *state = machine.driver_data(); int attr_start, base, first; @@ -658,7 +659,7 @@ } } -static void pspikesb_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void pspikesb_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { aerofgt_state *state = machine.driver_data(); int i; @@ -693,7 +694,7 @@ } } -static void spikes91_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void spikes91_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { aerofgt_state *state = machine.driver_data(); int i; @@ -735,7 +736,7 @@ } } -static void aerfboot_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void aerfboot_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { aerofgt_state *state = machine.driver_data(); int attr_start, last; @@ -817,7 +818,7 @@ } } -static void wbbc97_draw_bitmap( running_machine &machine, bitmap_t *bitmap ) +static void wbbc97_draw_bitmap( running_machine &machine, bitmap_rgb32 &bitmap ) { aerofgt_state *state = machine.driver_data(); int x, y, count; @@ -830,7 +831,7 @@ /* data is GRB; convert to RGB */ rgb_t pen = MAKE_RGB(pal5bit((color & 0x3e0) >> 5), pal5bit((color & 0x7c00) >> 10), pal5bit(color & 0x1f)); - *BITMAP_ADDR32(bitmap, y, (10 + x - state->m_rasterram[(y & 0x7f)]) & 0x1ff) = pen; + bitmap.pix32(y, (10 + x - state->m_rasterram[(y & 0x7f)]) & 0x1ff) = pen; count++; count &= 0x1ffff; @@ -838,58 +839,58 @@ } -SCREEN_UPDATE( pspikes ) +SCREEN_UPDATE_IND16( pspikes ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 256); + state->m_bg1_tilemap->set_scroll_rows(256); scrolly = state->m_bg1scrolly; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0xff, state->m_rasterram[i]); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0xff, state->m_rasterram[i]); + state->m_bg1_tilemap->set_scrolly(0, scrolly); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( pspikesb ) +SCREEN_UPDATE_IND16( pspikesb ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 256); + state->m_bg1_tilemap->set_scroll_rows(256); scrolly = state->m_bg1scrolly; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0xff, state->m_rasterram[i] + 22); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0xff, state->m_rasterram[i] + 22); + state->m_bg1_tilemap->set_scrolly(0, scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - pspikesb_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + pspikesb_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( spikes91 ) +SCREEN_UPDATE_IND16( spikes91 ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; int y, x; int count; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 256); + state->m_bg1_tilemap->set_scroll_rows(256); scrolly = state->m_bg1scrolly; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0xff, state->m_rasterram[i + 0x01f0 / 2] + 0x96 + 0x16); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0xff, state->m_rasterram[i + 0x01f0 / 2] + 0x96 + 0x16); + state->m_bg1_tilemap->set_scrolly(0, scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - spikes91_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + spikes91_draw_sprites(screen.machine(), bitmap, cliprect); /* we could use a tilemap, but it's easier to just do it here */ count = 0; @@ -914,177 +915,177 @@ return 0; } -SCREEN_UPDATE( karatblz ) +SCREEN_UPDATE_IND16( karatblz ) { - aerofgt_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg1_tilemap, 0, state->m_bg1scrollx - 8); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, state->m_bg1scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2scrollx - 4); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly); + aerofgt_state *state = screen.machine().driver_data(); + state->m_bg1_tilemap->set_scrollx(0, state->m_bg1scrollx - 8); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg1scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2scrollx - 4); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); /* we use the priority buffer so sprites are drawn front to back */ - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 1, -1); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 1, -1); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( spinlbrk ) +SCREEN_UPDATE_IND16( spinlbrk ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 512); + state->m_bg1_tilemap->set_scroll_rows(512); scrolly = 0; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[i] - 8); -// tilemap_set_scrolly(state->m_bg1_tilemap, 0, state->m_bg1scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2scrollx - 4); -// tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[i] - 8); +// state->m_bg1_tilemap->set_scrolly(0, state->m_bg1scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2scrollx - 4); +// state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 1); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 1); /* we use the priority buffer so sprites are drawn front to back */ - spinlbrk_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); - spinlbrk_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); - spinlbrk_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); - spinlbrk_draw_sprites(screen->machine(), bitmap, cliprect, 1, -1); + spinlbrk_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); + spinlbrk_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); + spinlbrk_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); + spinlbrk_draw_sprites(screen.machine(), bitmap, cliprect, 1, -1); return 0; } -SCREEN_UPDATE( turbofrc ) +SCREEN_UPDATE_IND16( turbofrc ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 512); + state->m_bg1_tilemap->set_scroll_rows(512); scrolly = state->m_bg1scrolly + 2; for (i = 0; i < 256; i++) -// tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[i] - 11); - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[7] - 11); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2scrollx - 7); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly + 2); +// state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[i] - 11); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[7] - 11); + state->m_bg1_tilemap->set_scrolly(0, scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2scrollx - 7); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly + 2); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 1); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 1); /* we use the priority buffer so sprites are drawn front to back */ - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 1, -1); //ship - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); //intro - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); //enemy - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); //enemy + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 1, -1); //ship + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); //intro + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); //enemy + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); //enemy return 0; } -SCREEN_UPDATE( aerofgt ) +SCREEN_UPDATE_IND16( aerofgt ) { - aerofgt_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg1_tilemap, 0, state->m_rasterram[0x0000] - 18); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, state->m_bg1scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_rasterram[0x0200] - 20); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly); + aerofgt_state *state = screen.machine().driver_data(); + state->m_bg1_tilemap->set_scrollx(0, state->m_rasterram[0x0000] - 18); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg1scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_rasterram[0x0200] - 20); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); - aerofgt_draw_sprites(screen->machine(), bitmap, cliprect, 0); - aerofgt_draw_sprites(screen->machine(), bitmap, cliprect, 1); + aerofgt_draw_sprites(screen.machine(), bitmap, cliprect, 0); + aerofgt_draw_sprites(screen.machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); - aerofgt_draw_sprites(screen->machine(), bitmap, cliprect, 2); - aerofgt_draw_sprites(screen->machine(), bitmap, cliprect, 3); + aerofgt_draw_sprites(screen.machine(), bitmap, cliprect, 2); + aerofgt_draw_sprites(screen.machine(), bitmap, cliprect, 3); return 0; } -SCREEN_UPDATE( aerfboot ) +SCREEN_UPDATE_IND16( aerfboot ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 512); + state->m_bg1_tilemap->set_scroll_rows(512); scrolly = state->m_bg1scrolly + 2; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[7] + 174); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2scrollx + 172); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly + 2); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[7] + 174); + state->m_bg1_tilemap->set_scrolly(0, scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2scrollx + 172); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly + 2); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 1); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 1); /* we use the priority buffer so sprites are drawn front to back */ - aerfboot_draw_sprites(screen->machine(), bitmap, cliprect); + aerfboot_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( aerfboo2 ) +SCREEN_UPDATE_IND16( aerfboo2 ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 512); + state->m_bg1_tilemap->set_scroll_rows(512); scrolly = state->m_bg1scrolly + 2; for (i = 0; i < 256; i++) -// tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[i] - 11); - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0x1ff, state->m_rasterram[7] - 11); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2scrollx - 7); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2scrolly + 2); +// state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[i] - 11); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0x1ff, state->m_rasterram[7] - 11); + state->m_bg1_tilemap->set_scrolly(0, scrolly); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2scrollx - 7); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2scrolly + 2); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 1); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 1); /* we use the priority buffer so sprites are drawn front to back */ - aerfboo2_draw_sprites(screen->machine(), bitmap, cliprect, 1, -1); //ship - aerfboo2_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); //intro - aerfboo2_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); //enemy - aerfboo2_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); //enemy + aerfboo2_draw_sprites(screen.machine(), bitmap, cliprect, 1, -1); //ship + aerfboo2_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); //intro + aerfboo2_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); //enemy + aerfboo2_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); //enemy return 0; } -SCREEN_UPDATE( wbbc97 ) +SCREEN_UPDATE_RGB32( wbbc97 ) { - aerofgt_state *state = screen->machine().driver_data(); + aerofgt_state *state = screen.machine().driver_data(); int i, scrolly; - tilemap_set_scroll_rows(state->m_bg1_tilemap, 256); + state->m_bg1_tilemap->set_scroll_rows(256); scrolly = state->m_bg1scrolly; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg1_tilemap, (i + scrolly) & 0xff, state->m_rasterram[i]); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); + state->m_bg1_tilemap->set_scrollx((i + scrolly) & 0xff, state->m_rasterram[i]); + state->m_bg1_tilemap->set_scrolly(0, scrolly); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_wbbc97_bitmap_enable) { - wbbc97_draw_bitmap(screen->machine(), bitmap); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + wbbc97_draw_bitmap(screen.machine(), bitmap); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); } - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, -1); - turbofrc_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, -1); + turbofrc_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/airbustr.c mame-0.145/src/mame/video/airbustr.c --- mame-0.144/src/mame/video/airbustr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/airbustr.c 2012-02-06 21:30:32.000000000 +0000 @@ -38,28 +38,28 @@ { airbustr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( airbustr_colorram_w ) { airbustr_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( airbustr_videoram2_w ) { airbustr_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( airbustr_colorram2_w ) { airbustr_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } /* Scroll Registers @@ -88,10 +88,10 @@ default: logerror("CPU #2 - port %02X written with %02X - PC = %04X\n", offset, data, cpu_get_pc(&space->device())); } - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_highbits << 5) & 0x100) + state->m_bg_scrolly); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_highbits << 6) & 0x100) + state->m_bg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, ((state->m_highbits << 7) & 0x100) + state->m_fg_scrolly); - tilemap_set_scrollx(state->m_fg_tilemap, 0, ((state->m_highbits << 8) & 0x100) + state->m_fg_scrollx); + state->m_bg_tilemap->set_scrolly(0, ((state->m_highbits << 5) & 0x100) + state->m_bg_scrolly); + state->m_bg_tilemap->set_scrollx(0, ((state->m_highbits << 6) & 0x100) + state->m_bg_scrollx); + state->m_fg_tilemap->set_scrolly(0, ((state->m_highbits << 7) & 0x100) + state->m_fg_scrolly); + state->m_fg_tilemap->set_scrollx(0, ((state->m_highbits << 8) & 0x100) + state->m_fg_scrollx); } static TILE_GET_INFO( get_fg_tile_info ) @@ -121,24 +121,24 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - state->m_sprites_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0x094, 0x06a); - tilemap_set_scrolldy(state->m_bg_tilemap, 0x100, 0x1ff); - tilemap_set_scrolldx(state->m_fg_tilemap, 0x094, 0x06a); - tilemap_set_scrolldy(state->m_fg_tilemap, 0x100, 0x1ff); + state->m_bg_tilemap->set_scrolldx(0x094, 0x06a); + state->m_bg_tilemap->set_scrolldy(0x100, 0x1ff); + state->m_fg_tilemap->set_scrolldx(0x094, 0x06a); + state->m_fg_tilemap->set_scrolldy(0x100, 0x1ff); - state->save_item(NAME(*state->m_sprites_bitmap)); + state->save_item(NAME(state->m_sprites_bitmap)); } -SCREEN_UPDATE( airbustr ) +SCREEN_UPDATE_IND16( airbustr ) { - airbustr_state *state = screen->machine().driver_data(); + airbustr_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); // copy the sprite bitmap to the screen pandora_update(state->m_pandora, bitmap, cliprect); @@ -146,11 +146,15 @@ return 0; } -SCREEN_EOF( airbustr ) +SCREEN_VBLANK( airbustr ) { - airbustr_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + airbustr_state *state = screen.machine().driver_data(); - // update the sprite bitmap - pandora_eof(state->m_pandora); + // update the sprite bitmap + pandora_eof(state->m_pandora); + } } diff -Nru mame-0.144/src/mame/video/ajax.c mame-0.145/src/mame/video/ajax.c --- mame-0.144/src/mame/video/ajax.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ajax.c 2012-02-06 21:30:31.000000000 +0000 @@ -87,15 +87,15 @@ ***************************************************************************/ -SCREEN_UPDATE( ajax ) +SCREEN_UPDATE_IND16( ajax ) { - ajax_state *state = screen->machine().driver_data(); + ajax_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 2, 0, 1); if (state->m_priority) { diff -Nru mame-0.144/src/mame/video/aliens.c mame-0.145/src/mame/video/aliens.c --- mame-0.144/src/mame/video/aliens.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/aliens.c 2012-02-06 21:30:32.000000000 +0000 @@ -75,14 +75,14 @@ ***************************************************************************/ -SCREEN_UPDATE( aliens ) +SCREEN_UPDATE_IND16( aliens ) { - aliens_state *state = screen->machine().driver_data(); + aliens_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, state->m_layer_colorbase[1] * 16); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(state->m_layer_colorbase[1] * 16, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 1, 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 2, 0, 2); diff -Nru mame-0.144/src/mame/video/alpha68k.c mame-0.145/src/mame/video/alpha68k.c --- mame-0.144/src/mame/video/alpha68k.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/alpha68k.c 2012-02-06 21:30:32.000000000 +0000 @@ -61,7 +61,7 @@ else state->m_videoram[offset] = (data >> 8) & 0xff; - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset / 2); + state->m_fix_tilemap->mark_tile_dirty(offset / 2); } VIDEO_START( alpha68k ) @@ -69,13 +69,13 @@ alpha68k_state *state = machine.driver_data(); state->m_fix_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); } /******************************************************************************/ //AT -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int j, int s, int e ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int j, int s, int e ) { alpha68k_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -128,24 +128,24 @@ /******************************************************************************/ -SCREEN_UPDATE( alpha68k_II ) +SCREEN_UPDATE_IND16( alpha68k_II ) { - alpha68k_state *state = screen->machine().driver_data(); + alpha68k_state *state = screen.machine().driver_data(); if (state->m_last_bank != state->m_bank_base) - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); state->m_last_bank = state->m_bank_base; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(bitmap, cliprect, 2047); + bitmap.fill(2047, cliprect); //AT - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0x07c0, 0x0800); - draw_sprites(screen->machine(), bitmap, cliprect, 1, 0x0000, 0x0800); - draw_sprites(screen->machine(), bitmap, cliprect, 2, 0x0000, 0x0800); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0x0000, 0x07c0); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0x07c0, 0x0800); + draw_sprites(screen.machine(), bitmap, cliprect, 1, 0x0000, 0x0800); + draw_sprites(screen.machine(), bitmap, cliprect, 2, 0x0000, 0x0800); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0x0000, 0x07c0); //ZT - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -221,7 +221,7 @@ } } -static void draw_sprites_V( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int j, int s, int e, int fx_mask, int fy_mask, int sprite_mask ) +static void draw_sprites_V( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int j, int s, int e, int fx_mask, int fy_mask, int sprite_mask ) { alpha68k_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -275,72 +275,72 @@ } } -SCREEN_UPDATE( alpha68k_V ) +SCREEN_UPDATE_IND16( alpha68k_V ) { - alpha68k_state *state = screen->machine().driver_data(); + alpha68k_state *state = screen.machine().driver_data(); UINT16 *spriteram = state->m_spriteram; if (state->m_last_bank != state->m_bank_base) - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); state->m_last_bank = state->m_bank_base; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(bitmap, cliprect, 4095); + bitmap.fill(4095, cliprect); /* This appears to be correct priority */ if (state->m_microcontroller_id == 0x8814) /* Sky Adventure */ { - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0, 0x8000, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0, 0x8000, 0x7fff); //AT: *KLUDGE* fixes priest priority in level 1(could be a game bug) if (spriteram[0x1bde] == 0x24 && (spriteram[0x1bdf] >> 8) == 0x3b) { - draw_sprites_V(screen->machine(), bitmap, cliprect, 2, 0x03c0, 0x0800, 0, 0x8000, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 2, 0x0000, 0x03c0, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 2, 0x03c0, 0x0800, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 2, 0x0000, 0x03c0, 0, 0x8000, 0x7fff); } else - draw_sprites_V(screen->machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0, 0x8000, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0, 0x8000, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0, 0x8000, 0x7fff); } else /* gangwars */ { - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0x8000, 0, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0x8000, 0, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0x8000, 0, 0x7fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0x8000, 0, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0x8000, 0, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0x8000, 0, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0x8000, 0, 0x7fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0x8000, 0, 0x7fff); } - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( alpha68k_V_sb ) +SCREEN_UPDATE_IND16( alpha68k_V_sb ) { - alpha68k_state *state = screen->machine().driver_data(); + alpha68k_state *state = screen.machine().driver_data(); if (state->m_last_bank != state->m_bank_base) - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); state->m_last_bank = state->m_bank_base; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(bitmap, cliprect, 4095); + bitmap.fill(4095, cliprect); /* This appears to be correct priority */ - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0x4000, 0x8000, 0x3fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0x4000, 0x8000, 0x3fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0x4000, 0x8000, 0x3fff); - draw_sprites_V(screen->machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0x4000, 0x8000, 0x3fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x07c0, 0x0800, 0x4000, 0x8000, 0x3fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 1, 0x0000, 0x0800, 0x4000, 0x8000, 0x3fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 2, 0x0000, 0x0800, 0x4000, 0x8000, 0x3fff); + draw_sprites_V(screen.machine(), bitmap, cliprect, 0, 0x0000, 0x07c0, 0x4000, 0x8000, 0x3fff); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } /******************************************************************************/ //AT -static void draw_sprites_I( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int c, int d, int yshift ) +static void draw_sprites_I( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int c, int d, int yshift ) { alpha68k_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -368,17 +368,17 @@ } } -SCREEN_UPDATE( alpha68k_I ) +SCREEN_UPDATE_IND16( alpha68k_I ) { - alpha68k_state *state = screen->machine().driver_data(); + alpha68k_state *state = screen.machine().driver_data(); int yshift = (state->m_microcontroller_id == 0x890a) ? 1 : 0; // The Next Space is 1 pixel off - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* This appears to be correct priority */ - draw_sprites_I(screen->machine(), bitmap, cliprect, 2, 0x0800, yshift); - draw_sprites_I(screen->machine(), bitmap, cliprect, 3, 0x0c00, yshift); - draw_sprites_I(screen->machine(), bitmap, cliprect, 1, 0x0400, yshift); + draw_sprites_I(screen.machine(), bitmap, cliprect, 2, 0x0800, yshift); + draw_sprites_I(screen.machine(), bitmap, cliprect, 3, 0x0c00, yshift); + draw_sprites_I(screen.machine(), bitmap, cliprect, 1, 0x0400, yshift); return 0; } //ZT @@ -448,7 +448,7 @@ *bank = (data >> 11 & 4) | (data >> 10 & 3); } -static void kyros_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int c, int d ) +static void kyros_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int c, int d ) { alpha68k_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -501,21 +501,21 @@ } } -SCREEN_UPDATE( kyros ) +SCREEN_UPDATE_IND16( kyros ) { - alpha68k_state *state = screen->machine().driver_data(); - colortable_entry_set_value(screen->machine().colortable, 0x100, *state->m_videoram & 0xff); - bitmap_fill(bitmap, cliprect, 0x100); //AT - - kyros_draw_sprites(screen->machine(), bitmap, cliprect, 2, 0x0800); - kyros_draw_sprites(screen->machine(), bitmap, cliprect, 3, 0x0c00); - kyros_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0x0400); + alpha68k_state *state = screen.machine().driver_data(); + colortable_entry_set_value(screen.machine().colortable, 0x100, *state->m_videoram & 0xff); + bitmap.fill(0x100, cliprect); //AT + + kyros_draw_sprites(screen.machine(), bitmap, cliprect, 2, 0x0800); + kyros_draw_sprites(screen.machine(), bitmap, cliprect, 3, 0x0c00); + kyros_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0x0400); return 0; } /******************************************************************************/ -static void sstingry_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int c, int d ) +static void sstingry_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int c, int d ) { //AT alpha68k_state *state = machine.driver_data(); @@ -561,14 +561,14 @@ } } -SCREEN_UPDATE( sstingry ) +SCREEN_UPDATE_IND16( sstingry ) { - alpha68k_state *state = screen->machine().driver_data(); - colortable_entry_set_value(screen->machine().colortable, 0x100, *state->m_videoram & 0xff); - bitmap_fill(bitmap, cliprect, 0x100); //AT - - sstingry_draw_sprites(screen->machine(), bitmap, cliprect, 2, 0x0800); - sstingry_draw_sprites(screen->machine(), bitmap, cliprect, 3, 0x0c00); - sstingry_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0x0400); + alpha68k_state *state = screen.machine().driver_data(); + colortable_entry_set_value(screen.machine().colortable, 0x100, *state->m_videoram & 0xff); + bitmap.fill(0x100, cliprect); //AT + + sstingry_draw_sprites(screen.machine(), bitmap, cliprect, 2, 0x0800); + sstingry_draw_sprites(screen.machine(), bitmap, cliprect, 3, 0x0c00); + sstingry_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0x0400); return 0; } diff -Nru mame-0.144/src/mame/video/ambush.c mame-0.145/src/mame/video/ambush.c --- mame-0.144/src/mame/video/ambush.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ambush.c 2012-02-06 21:30:33.000000000 +0000 @@ -47,7 +47,7 @@ } -static void draw_chars( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_chars( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { ambush_state *state = machine.driver_data(); int offs, transpen; @@ -87,15 +87,15 @@ } -SCREEN_UPDATE( ambush ) +SCREEN_UPDATE_IND16( ambush ) { - ambush_state *state = screen->machine().driver_data(); + ambush_state *state = screen.machine().driver_data(); int offs; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* Draw the characters */ - draw_chars(screen->machine(), bitmap, cliprect, 0x00); + draw_chars(screen.machine(), bitmap, cliprect, 0x00); /* Draw the sprites. */ for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) @@ -119,7 +119,7 @@ /* 16x16 sprites */ gfx = 1; - if (!flip_screen_get(screen->machine())) + if (!flip_screen_get(screen.machine())) sy = 240 - sy; else sx = 240 - sx; @@ -130,7 +130,7 @@ gfx = 0; code <<= 2; - if (!flip_screen_get(screen->machine())) + if (!flip_screen_get(screen.machine())) sy = 248 - sy; else sx = 248 - sx; @@ -140,19 +140,19 @@ flipx = state->m_spriteram[offs + 1] & 0x40; flipy = state->m_spriteram[offs + 1] & 0x80; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { flipx = !flipx; flipy = !flipy; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[gfx], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[gfx], code, col | ((*state->m_colorbank & 0x03) << 4), flipx, flipy, sx,sy,0); } /* Draw the foreground priority characters over the sprites */ - draw_chars(screen->machine(), bitmap, cliprect, 0x10); + draw_chars(screen.machine(), bitmap, cliprect, 0x10); return 0; } diff -Nru mame-0.144/src/mame/video/amigaaga.c mame-0.145/src/mame/video/amigaaga.c --- mame-0.144/src/mame/video/amigaaga.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/amigaaga.c 2012-02-06 21:30:32.000000000 +0000 @@ -444,7 +444,7 @@ * *************************************/ -void amiga_aga_render_scanline(running_machine &machine, bitmap_t *bitmap, int scanline) +void amiga_aga_render_scanline(running_machine &machine, bitmap_rgb32 &bitmap, int scanline) { amiga_state *state = machine.driver_data(); UINT16 save_color0 = CUSTOM_REG(REG_COLOR00); @@ -478,8 +478,8 @@ update_sprite_dma(state, scanline); /* start of a new line, signal we're not done with it and fill up vars */ - if (bitmap != NULL) - dst = BITMAP_ADDR32(bitmap, scanline, 0); + if (bitmap.valid()) + dst = &bitmap.pix32(scanline); /* all sprites off at the start of the line */ memset(state->m_sprite_remain, 0, sizeof(state->m_sprite_remain)); @@ -860,13 +860,13 @@ * *************************************/ -SCREEN_UPDATE( amiga_aga ) +SCREEN_UPDATE_RGB32( amiga_aga ) { int y; /* render each scanline in the visible region */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - amiga_aga_render_scanline(screen->machine(), bitmap, y); + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + amiga_aga_render_scanline(screen.machine(), bitmap, y); return 0; } diff -Nru mame-0.144/src/mame/video/amiga.c mame-0.145/src/mame/video/amiga.c --- mame-0.144/src/mame/video/amiga.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/amiga.c 2012-02-06 21:30:32.000000000 +0000 @@ -619,7 +619,7 @@ * *************************************/ -void amiga_render_scanline(running_machine &machine, bitmap_t *bitmap, int scanline) +void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int scanline) { amiga_state *state = machine.driver_data(); UINT16 save_color0 = CUSTOM_REG(REG_COLOR00); @@ -652,8 +652,8 @@ update_sprite_dma(state, scanline); /* start of a new line, signal we're not done with it and fill up vars */ - if (bitmap != NULL) - dst = BITMAP_ADDR16(bitmap, scanline, 0); + if (bitmap.valid()) + dst = &bitmap.pix16(scanline); /* all sprites off at the start of the line */ memset(state->m_sprite_remain, 0, sizeof(state->m_sprite_remain)); @@ -999,13 +999,13 @@ * *************************************/ -SCREEN_UPDATE( amiga ) +SCREEN_UPDATE_IND16( amiga ) { int y; /* render each scanline in the visible region */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - amiga_render_scanline(screen->machine(), bitmap, y); + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + amiga_render_scanline(screen.machine(), bitmap, y); return 0; } diff -Nru mame-0.144/src/mame/video/ampoker2.c mame-0.145/src/mame/video/ampoker2.c --- mame-0.144/src/mame/video/ampoker2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ampoker2.c 2012-02-06 21:30:31.000000000 +0000 @@ -116,7 +116,7 @@ ampoker2_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_bg_tile_info ) @@ -161,9 +161,9 @@ 8, 8, 64, 32); } -SCREEN_UPDATE(ampoker2) +SCREEN_UPDATE_IND16(ampoker2) { - ampoker2_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + ampoker2_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/amspdwy.c mame-0.145/src/mame/video/amspdwy.c --- mame-0.144/src/mame/video/amspdwy.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/amspdwy.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,14 +59,14 @@ { amspdwy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( amspdwy_colorram_w ) { amspdwy_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -103,7 +103,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { amspdwy_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -146,10 +146,10 @@ ***************************************************************************/ -SCREEN_UPDATE( amspdwy ) +SCREEN_UPDATE_IND16( amspdwy ) { - amspdwy_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + amspdwy_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/angelkds.c mame-0.145/src/mame/video/angelkds.c --- mame-0.144/src/mame/video/angelkds.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/angelkds.c 2012-02-06 21:30:31.000000000 +0000 @@ -28,7 +28,7 @@ angelkds_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( angelkds_txbank_write ) @@ -38,7 +38,7 @@ if (state->m_txbank != data) { state->m_txbank = data; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } } @@ -62,7 +62,7 @@ angelkds_state *state = space->machine().driver_data(); state->m_bgtopvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bgtop_tilemap, offset); + state->m_bgtop_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( angelkds_bgtopbank_write ) @@ -72,7 +72,7 @@ if (state->m_bgtopbank != data) { state->m_bgtopbank = data; - tilemap_mark_all_tiles_dirty(state->m_bgtop_tilemap); + state->m_bgtop_tilemap->mark_all_dirty(); } } @@ -80,7 +80,7 @@ { angelkds_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bgtop_tilemap, 0, data); + state->m_bgtop_tilemap->set_scrollx(0, data); } /*** Bottom Half Background Tilemap @@ -103,7 +103,7 @@ angelkds_state *state = space->machine().driver_data(); state->m_bgbotvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bgbot_tilemap, offset); + state->m_bgbot_tilemap->mark_tile_dirty(offset); } @@ -114,7 +114,7 @@ if (state->m_bgbotbank != data) { state->m_bgbotbank = data; - tilemap_mark_all_tiles_dirty(state->m_bgbot_tilemap); + state->m_bgbot_tilemap->mark_all_dirty(); } } @@ -122,7 +122,7 @@ { angelkds_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bgbot_tilemap, 0, data); + state->m_bgbot_tilemap->set_scrollx(0, data); } @@ -140,7 +140,7 @@ */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int enable_n) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int enable_n) { angelkds_state *state = machine.driver_data(); const UINT8 *source = state->m_spriteram + 0x100 - 4; @@ -261,52 +261,46 @@ angelkds_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); state->m_bgbot_tilemap = tilemap_create(machine, get_bgbot_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bgbot_tilemap, 15); + state->m_bgbot_tilemap->set_transparent_pen(15); state->m_bgtop_tilemap = tilemap_create(machine, get_bgtop_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bgtop_tilemap, 15); + state->m_bgtop_tilemap->set_transparent_pen(15); } /* enable bits are uncertain */ -SCREEN_UPDATE( angelkds ) +SCREEN_UPDATE_IND16( angelkds ) { - angelkds_state *state = screen->machine().driver_data(); - const rectangle &visarea = screen->visible_area(); + angelkds_state *state = screen.machine().driver_data(); + const rectangle &visarea = screen.visible_area(); rectangle clip; - bitmap_fill(bitmap, cliprect, 0x3f); /* is there a register controling the colour?, we currently use the last colour of the tx palette */ + bitmap.fill(0x3f, cliprect); /* is there a register controling the colour?, we currently use the last colour of the tx palette */ /* draw top of screen */ - clip.min_x = 8*0; - clip.max_x = 8*16-1; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + clip.set(8*0, 8*16-1, visarea.min_y, visarea.max_y); if ((state->m_layer_ctrl & 0x80) == 0x00) - tilemap_draw(bitmap, &clip, state->m_bgtop_tilemap, 0, 0); + state->m_bgtop_tilemap->draw(bitmap, clip, 0, 0); - draw_sprites(screen->machine(), bitmap, &clip, 0x80); + draw_sprites(screen.machine(), bitmap, clip, 0x80); if ((state->m_layer_ctrl & 0x20) == 0x00) - tilemap_draw(bitmap, &clip, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, clip, 0, 0); /* draw bottom of screen */ - clip.min_x = 8*16; - clip.max_x = 8*32-1; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + clip.set(8*16, 8*32-1, visarea.min_y, visarea.max_y); if ((state->m_layer_ctrl & 0x40) == 0x00) - tilemap_draw(bitmap, &clip, state->m_bgbot_tilemap, 0, 0); + state->m_bgbot_tilemap->draw(bitmap, clip, 0, 0); - draw_sprites(screen->machine(), bitmap, &clip, 0x40); + draw_sprites(screen.machine(), bitmap, clip, 0x40); if ((state->m_layer_ctrl & 0x20) == 0x00) - tilemap_draw(bitmap, &clip, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, clip, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/appoooh.c mame-0.145/src/mame/video/appoooh.c --- mame-0.144/src/mame/video/appoooh.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/appoooh.c 2012-02-06 21:30:31.000000000 +0000 @@ -137,9 +137,9 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldy(state->m_fg_tilemap, 8, 8); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, 8); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrolldy(8, 8); + state->m_bg_tilemap->set_scrolldy(8, 8); state->save_item(NAME(state->m_scroll_x)); state->save_item(NAME(state->m_priority)); @@ -156,35 +156,35 @@ { appoooh_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( appoooh_fg_colorram_w ) { appoooh_state *state = space->machine().driver_data(); state->m_fg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( appoooh_bg_videoram_w ) { appoooh_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( appoooh_bg_colorram_w ) { appoooh_state *state = space->machine().driver_data(); state->m_bg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( appoooh_out_w ) { appoooh_state *state = space->machine().driver_data(); /* bit 0 controls NMI */ - interrupt_enable_w(space,0,data & 0x01); + state->m_nmi_mask = data & 1; /* bit 1 flip screen */ flip_screen_set(space->machine(), data & 0x02); @@ -207,7 +207,7 @@ /* bit 7 unknown (used) */ } -static void appoooh_draw_sprites( bitmap_t *dest_bmp, const rectangle *cliprect, const gfx_element *gfx, UINT8 *sprite ) +static void appoooh_draw_sprites( bitmap_ind16 &dest_bmp, const rectangle &cliprect, const gfx_element *gfx, UINT8 *sprite ) { int offs; int flipy = flip_screen_get(gfx->machine()); @@ -238,7 +238,7 @@ } } -static void robowres_draw_sprites( bitmap_t *dest_bmp, const rectangle *cliprect, const gfx_element *gfx, UINT8 *sprite ) +static void robowres_draw_sprites( bitmap_ind16 &dest_bmp, const rectangle &cliprect, const gfx_element *gfx, UINT8 *sprite ) { int offs; int flipy = flip_screen_get(gfx->machine()); @@ -270,62 +270,62 @@ } -SCREEN_UPDATE( appoooh ) +SCREEN_UPDATE_IND16( appoooh ) { - appoooh_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + appoooh_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_priority == 0) /* fg behind sprites */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw sprites */ if (state->m_priority == 1) { /* sprite set #1 */ - appoooh_draw_sprites(bitmap, cliprect, screen->machine().gfx[2], state->m_spriteram); + appoooh_draw_sprites(bitmap, cliprect, screen.machine().gfx[2], state->m_spriteram); /* sprite set #2 */ - appoooh_draw_sprites(bitmap, cliprect, screen->machine().gfx[3], state->m_spriteram_2); + appoooh_draw_sprites(bitmap, cliprect, screen.machine().gfx[3], state->m_spriteram_2); } else { /* sprite set #2 */ - appoooh_draw_sprites(bitmap, cliprect, screen->machine().gfx[3], state->m_spriteram_2); + appoooh_draw_sprites(bitmap, cliprect, screen.machine().gfx[3], state->m_spriteram_2); /* sprite set #1 */ - appoooh_draw_sprites(bitmap, cliprect, screen->machine().gfx[2], state->m_spriteram); + appoooh_draw_sprites(bitmap, cliprect, screen.machine().gfx[2], state->m_spriteram); } if (state->m_priority != 0) /* fg in front of sprites */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( robowres ) +SCREEN_UPDATE_IND16( robowres ) { - appoooh_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + appoooh_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_priority == 0) /* fg behind sprites */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw sprites */ if (state->m_priority == 1) { /* sprite set #1 */ - robowres_draw_sprites(bitmap, cliprect, screen->machine().gfx[2], state->m_spriteram); + robowres_draw_sprites(bitmap, cliprect, screen.machine().gfx[2], state->m_spriteram); /* sprite set #2 */ - robowres_draw_sprites(bitmap, cliprect, screen->machine().gfx[3], state->m_spriteram_2); + robowres_draw_sprites(bitmap, cliprect, screen.machine().gfx[3], state->m_spriteram_2); } else { /* sprite set #2 */ - robowres_draw_sprites(bitmap, cliprect, screen->machine().gfx[3], state->m_spriteram_2); + robowres_draw_sprites(bitmap, cliprect, screen.machine().gfx[3], state->m_spriteram_2); /* sprite set #1 */ - robowres_draw_sprites(bitmap, cliprect, screen->machine().gfx[2], state->m_spriteram); + robowres_draw_sprites(bitmap, cliprect, screen.machine().gfx[2], state->m_spriteram); } if (state->m_priority != 0) /* fg in front of sprites */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/aquarium.c mame-0.145/src/mame/video/aquarium.c --- mame-0.144/src/mame/video/aquarium.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/aquarium.c 2012-02-06 21:30:32.000000000 +0000 @@ -4,7 +4,7 @@ #include "includes/aquarium.h" /* gcpinbal.c modified */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { aquarium_state *state = machine.driver_data(); int offs, chain_pos; @@ -100,7 +100,7 @@ { aquarium_state *state = space->machine().driver_data(); state->m_txt_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_txt_tilemap, offset); + state->m_txt_tilemap->mark_tile_dirty(offset); } /* MID Layer */ @@ -115,14 +115,14 @@ SET_TILE_INFO(1, tileno, colour, flag); - tileinfo->category = (state->m_mid_videoram[tile_index * 2 + 1] & 0x20) >> 5; + tileinfo.category = (state->m_mid_videoram[tile_index * 2 + 1] & 0x20) >> 5; } WRITE16_HANDLER( aquarium_mid_videoram_w ) { aquarium_state *state = space->machine().driver_data(); state->m_mid_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_mid_tilemap, offset / 2); + state->m_mid_tilemap->mark_tile_dirty(offset / 2); } /* BAK Layer */ @@ -137,14 +137,14 @@ SET_TILE_INFO(3, tileno, colour, flag); - tileinfo->category = (state->m_bak_videoram[tile_index * 2 + 1] & 0x20) >> 5; + tileinfo.category = (state->m_bak_videoram[tile_index * 2 + 1] & 0x20) >> 5; } WRITE16_HANDLER( aquarium_bak_videoram_w ) { aquarium_state *state = space->machine().driver_data(); state->m_bak_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bak_tilemap, offset / 2); + state->m_bak_tilemap->mark_tile_dirty(offset / 2); } VIDEO_START(aquarium) @@ -154,27 +154,27 @@ state->m_bak_tilemap = tilemap_create(machine, get_aquarium_bak_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_mid_tilemap = tilemap_create(machine, get_aquarium_mid_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_txt_tilemap, 0); - tilemap_set_transparent_pen(state->m_mid_tilemap, 0); + state->m_txt_tilemap->set_transparent_pen(0); + state->m_mid_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE(aquarium) +SCREEN_UPDATE_IND16(aquarium) { - aquarium_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_mid_tilemap, 0, state->m_scroll[0]); - tilemap_set_scrolly(state->m_mid_tilemap, 0, state->m_scroll[1]); - tilemap_set_scrollx(state->m_bak_tilemap, 0, state->m_scroll[2]); - tilemap_set_scrolly(state->m_bak_tilemap, 0, state->m_scroll[3]); - tilemap_set_scrollx(state->m_txt_tilemap, 0, state->m_scroll[4]); - tilemap_set_scrolly(state->m_txt_tilemap, 0, state->m_scroll[5]); + aquarium_state *state = screen.machine().driver_data(); + state->m_mid_tilemap->set_scrollx(0, state->m_scroll[0]); + state->m_mid_tilemap->set_scrolly(0, state->m_scroll[1]); + state->m_bak_tilemap->set_scrollx(0, state->m_scroll[2]); + state->m_bak_tilemap->set_scrolly(0, state->m_scroll[3]); + state->m_txt_tilemap->set_scrollx(0, state->m_scroll[4]); + state->m_txt_tilemap->set_scrolly(0, state->m_scroll[5]); - tilemap_draw(bitmap, cliprect, state->m_bak_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_mid_tilemap, 0, 0); + state->m_bak_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_mid_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 16); + draw_sprites(screen.machine(), bitmap, cliprect, 16); - tilemap_draw(bitmap, cliprect, state->m_bak_tilemap, 1, 0); - tilemap_draw(bitmap, cliprect, state->m_mid_tilemap, 1, 0); - tilemap_draw(bitmap, cliprect, state->m_txt_tilemap, 0, 0); + state->m_bak_tilemap->draw(bitmap, cliprect, 1, 0); + state->m_mid_tilemap->draw(bitmap, cliprect, 1, 0); + state->m_txt_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/arabian.c mame-0.145/src/mame/video/arabian.c --- mame-0.144/src/mame/video/arabian.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/arabian.c 2012-02-06 21:30:31.000000000 +0000 @@ -368,10 +368,10 @@ * *************************************/ -SCREEN_UPDATE( arabian ) +SCREEN_UPDATE_IND16( arabian ) { - arabian_state *state = screen->machine().driver_data(); - const pen_t *pens = &screen->machine().pens[(state->m_video_control >> 3) << 8]; + arabian_state *state = screen.machine().driver_data(); + const pen_t *pens = &screen.machine().pens[(state->m_video_control >> 3) << 8]; int y; /* render the screen from the bitmap */ diff -Nru mame-0.144/src/mame/video/arcadecl.c mame-0.145/src/mame/video/arcadecl.c --- mame-0.144/src/mame/video/arcadecl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/arcadecl.c 2012-02-06 21:30:31.000000000 +0000 @@ -13,7 +13,7 @@ #include "includes/arcadecl.h" -static void arcadecl_bitmap_render(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +static void arcadecl_bitmap_render(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); /************************************* * @@ -78,26 +78,26 @@ * *************************************/ -SCREEN_UPDATE( arcadecl ) +SCREEN_UPDATE_IND16( arcadecl ) { - arcadecl_state *state = screen->machine().driver_data(); + arcadecl_state *state = screen.machine().driver_data(); /* draw the playfield */ - arcadecl_bitmap_render(screen->machine(), bitmap, cliprect); + arcadecl_bitmap_render(screen.machine(), bitmap, cliprect); /* draw and merge the MO */ if (state->m_has_mo) { atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -121,19 +121,19 @@ * *************************************/ -static void arcadecl_bitmap_render(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void arcadecl_bitmap_render(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { arcadecl_state *state = machine.driver_data(); int x, y; /* update any dirty scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { const UINT16 *src = &state->m_bitmap[256 * y]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); /* regenerate the line */ - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { int bits = src[(x - 8) / 2]; dst[x + 0] = bits >> 8; diff -Nru mame-0.144/src/mame/video/archimds.c mame-0.145/src/mame/video/archimds.c --- mame-0.144/src/mame/video/archimds.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/archimds.c 2012-02-06 21:30:32.000000000 +0000 @@ -11,7 +11,7 @@ { } -SCREEN_UPDATE( archimds_vidc ) +SCREEN_UPDATE_RGB32( archimds_vidc ) { int xstart,ystart,xend,yend; int res_x,res_y; @@ -20,7 +20,7 @@ const UINT8 x_step[4] = { 5, 7, 11, 19 }; /* border color */ - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x10]); + bitmap.fill(screen.machine().pens[0x10], cliprect); /* define X display area through BPP mode register */ calc_dxs = (vidc_regs[VIDC_HDSR]*2)+x_step[vidc_bpp_mode & 3]; @@ -43,7 +43,7 @@ int count; int x,y,xi; UINT8 pen; - static UINT8 *vram = screen->machine().region("vram")->base(); + static UINT8 *vram = screen.machine().region("vram")->base(); count = (0); @@ -64,21 +64,15 @@ if(vidc_interlace) { - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y) <= screen->visible_area().max_y && (res_x) <= xend && (res_y) <= yend) - *BITMAP_ADDR32(bitmap, res_y, res_x) = screen->machine().pens[(pen>>(xi))&0x1]; - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y+1) <= screen->visible_area().max_y && (res_x) <= xend && (res_y+1) <= yend) - *BITMAP_ADDR32(bitmap, res_y+1, res_x) = screen->machine().pens[(pen>>(xi))&0x1]; + if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) + bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen>>(xi))&0x1]; + if (cliprect.contains(res_x, res_y+1) && (res_x) <= xend && (res_y+1) <= yend) + bitmap.pix32(res_y+1, res_x) = screen.machine().pens[(pen>>(xi))&0x1]; } else { - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y) <= screen->visible_area().max_y && (res_x) <= xend && (res_y) <= yend) - *BITMAP_ADDR32(bitmap, res_y, res_x) = screen->machine().pens[(pen>>(xi))&0x1]; + if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) + bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen>>(xi))&0x1]; } } @@ -100,21 +94,15 @@ if(vidc_interlace) { - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y) <= screen->visible_area().max_y && (res_x) <= xend && (res_y) <= yend) - *BITMAP_ADDR32(bitmap, res_y, res_x) = screen->machine().pens[(pen&0xff)+0x100]; - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y+1) <= screen->visible_area().max_y && (res_x) <= xend && (res_y+1) <= yend) - *BITMAP_ADDR32(bitmap, res_y+1, res_x) = screen->machine().pens[(pen&0xff)+0x100]; + if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) + bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen&0xff)+0x100]; + if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y+1) <= yend) + bitmap.pix32(res_y+1, res_x) = screen.machine().pens[(pen&0xff)+0x100]; } else { - if ((res_x) >= 0 && - (res_y) >= 0 && - (res_x) <= screen->visible_area().max_x && (res_y) <= screen->visible_area().max_y && (res_x) <= xend && (res_y) <= yend) - *BITMAP_ADDR32(bitmap, res_y, res_x) = screen->machine().pens[(pen&0xff)+0x100]; + if (cliprect.contains(res_x, res_y) && (res_x) <= xend && (res_y) <= yend) + bitmap.pix32(res_y, res_x) = screen.machine().pens[(pen&0xff)+0x100]; } count++; diff -Nru mame-0.144/src/mame/video/argus.c mame-0.145/src/mame/video/argus.c --- mame-0.144/src/mame/video/argus.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/argus.c 2012-02-06 21:30:32.000000000 +0000 @@ -283,8 +283,8 @@ state->m_bg1_tilemap = tilemap_create(machine, argus_get_bg1_tile_info, tilemap_scan_cols, 16, 16, 32, 32); state->m_tx_tilemap = tilemap_create(machine, argus_get_tx_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_bg1_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); /* dummy RAM for back ground */ state->m_dummy_bg0ram = auto_alloc_array(machine, UINT8, 0x800); @@ -310,9 +310,9 @@ state->m_bg1_tilemap = tilemap_create(machine, valtric_get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 32); state->m_tx_tilemap = tilemap_create(machine, valtric_get_tx_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(15); - state->m_mosaicbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_mosaicbitmap); jal_blend_init(machine, 1); } @@ -332,8 +332,8 @@ state->m_bg1_tilemap = tilemap_create(machine, butasan_get_bg1_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_tx_tilemap = tilemap_create(machine, butasan_get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_bg1_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); state->m_butasan_pagedram[0] = auto_alloc_array(machine, UINT8, 0x1000); state->m_butasan_pagedram[1] = auto_alloc_array(machine, UINT8, 0x1000); @@ -381,7 +381,7 @@ { state->m_dummy_bg0ram[dramoffs] = VROM2[voffs]; state->m_dummy_bg0ram[dramoffs + 1] = VROM2[voffs + 1]; - tilemap_mark_tile_dirty(state->m_bg0_tilemap, dramoffs >> 1); + state->m_bg0_tilemap->mark_tile_dirty(dramoffs >> 1); dramoffs += 2; voffs += 2; } @@ -455,7 +455,7 @@ { argus_state *state = space->machine().driver_data(); state->m_txram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset >> 1); + state->m_tx_tilemap->mark_tile_dirty(offset >> 1); } READ8_HANDLER( argus_bg1ram_r ) @@ -468,7 +468,7 @@ { argus_state *state = space->machine().driver_data(); state->m_bg1ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset >> 1); + state->m_bg1_tilemap->mark_tile_dirty(offset >> 1); } WRITE8_HANDLER( argus_bg_status_w ) @@ -525,7 +525,7 @@ state->m_butasan_bg1_status = data; /* Bank changed */ - tilemap_mark_all_tiles_dirty(state->m_bg1_tilemap); + state->m_bg1_tilemap->mark_all_dirty(); } } @@ -667,7 +667,7 @@ idx = (offset & 0x00f) | ((offset & 0x200) >> 5) | ((offset & 0x1f0) << 1); idx ^= 0x0f0; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, idx); + state->m_bg1_tilemap->mark_tile_dirty(idx); } WRITE8_HANDLER( butasan_pageselect_w ) @@ -697,13 +697,13 @@ int idx; idx = ((offset & 0x01e) >> 1) | ((offset & 0x400) >> 6) | (offset & 0x3e0); idx ^= 0x1e0; - tilemap_mark_tile_dirty(state->m_bg0_tilemap, idx); + state->m_bg0_tilemap->mark_tile_dirty(idx); } } else { if (offset <= 0x07ff) - tilemap_mark_tile_dirty(state->m_tx_tilemap, (offset ^ 0x7c0) >> 1); + state->m_tx_tilemap->mark_tile_dirty((offset ^ 0x7c0) >> 1); } } @@ -732,27 +732,27 @@ static void bg_setting(running_machine &machine) { argus_state *state = machine.driver_data(); - tilemap_set_flip_all(machine, state->m_flipscreen ? TILEMAP_FLIPY|TILEMAP_FLIPX : 0); + machine.tilemap().set_flip_all(state->m_flipscreen ? TILEMAP_FLIPY|TILEMAP_FLIPX : 0); if (!state->m_flipscreen) { if (state->m_bg0_tilemap != NULL) { - tilemap_set_scrollx(state->m_bg0_tilemap, 0, bg0_scrollx & 0x1ff); - tilemap_set_scrolly(state->m_bg0_tilemap, 0, bg0_scrolly & 0x1ff); + state->m_bg0_tilemap->set_scrollx(0, bg0_scrollx & 0x1ff); + state->m_bg0_tilemap->set_scrolly(0, bg0_scrolly & 0x1ff); } - tilemap_set_scrollx(state->m_bg1_tilemap, 0, bg1_scrollx & 0x1ff); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, bg1_scrolly & 0x1ff); + state->m_bg1_tilemap->set_scrollx(0, bg1_scrollx & 0x1ff); + state->m_bg1_tilemap->set_scrolly(0, bg1_scrolly & 0x1ff); } else { if (state->m_bg0_tilemap != NULL) { - tilemap_set_scrollx(state->m_bg0_tilemap, 0, (bg0_scrollx + 256) & 0x1ff); - tilemap_set_scrolly(state->m_bg0_tilemap, 0, (bg0_scrolly + 256) & 0x1ff); + state->m_bg0_tilemap->set_scrollx(0, (bg0_scrollx + 256) & 0x1ff); + state->m_bg0_tilemap->set_scrolly(0, (bg0_scrolly + 256) & 0x1ff); } - tilemap_set_scrollx(state->m_bg1_tilemap, 0, (bg1_scrollx + 256) & 0x1ff); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, (bg1_scrolly + 256) & 0x1ff); + state->m_bg1_tilemap->set_scrollx(0, (bg1_scrollx + 256) & 0x1ff); + state->m_bg1_tilemap->set_scrolly(0, (bg1_scrolly + 256) & 0x1ff); } } @@ -851,7 +851,7 @@ } } -static void argus_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void argus_draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority) { argus_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -894,7 +894,7 @@ } #if 1 -static void valtric_draw_mosaic(screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect) +static void valtric_draw_mosaic(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { argus_state *state = screen.machine().driver_data(); @@ -906,10 +906,10 @@ } if (state->m_mosaic==0) - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); else { - tilemap_draw(state->m_mosaicbitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(state->m_mosaicbitmap, cliprect, 0, 0); { int step=state->m_mosaic; UINT32 *dest; @@ -923,18 +923,18 @@ for (x=0;xm_mosaicbitmap, y, x); + c=state->m_mosaicbitmap.pix32(y, x); if (state->m_mosaic<0) if (y+step-1m_mosaicbitmap, y+step-1, x+step-1); + c = state->m_mosaicbitmap.pix32(y+step-1, x+step-1); for (yy=0;yy(); int step = 0x10 - (state->m_valtric_mosaic & 0x0f); if (step == 1) - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); else { - tilemap_draw(state->m_mosaicbitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(state->m_mosaicbitmap, cliprect, 0, 0); { UINT32 *dest; int x,y,xx,yy,c=0; @@ -963,18 +963,18 @@ for (x = 0; x < height+step; x += step) { if (y < height && x < width) - c = *BITMAP_ADDR32(state->m_mosaicbitmap, y, x); + c = state->m_mosaicbitmap.pix32(y, x); if (state->m_valtric_mosaic & 0x80) if (y+step-1 < height && x+step-1 < width) - c = *BITMAP_ADDR32(state->m_mosaicbitmap, y+step-1, x+step-1); + c = state->m_mosaicbitmap.pix32(y+step-1, x+step-1); for (yy = 0; yy < step; yy++) for (xx = 0; xx < step; xx++) { if (xx+x < width && yy+y < height) { - dest = BITMAP_ADDR32(bitmap, y+yy, x+xx); + dest = &bitmap.pix32(y+yy, x+xx); *dest = c; } } @@ -984,7 +984,7 @@ } #endif -static void valtric_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void valtric_draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { argus_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -1024,7 +1024,7 @@ } } -static void butasan_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void butasan_draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { argus_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -1189,50 +1189,50 @@ #endif } -SCREEN_UPDATE( argus ) +SCREEN_UPDATE_RGB32( argus ) { - argus_state *state = screen->machine().driver_data(); - bg_setting(screen->machine()); + argus_state *state = screen.machine().driver_data(); + bg_setting(screen.machine()); /* scroll BG0 and render tile at proper position */ - argus_bg0_scroll_handle(screen->machine()); + argus_bg0_scroll_handle(screen.machine()); - tilemap_draw(bitmap, cliprect, state->m_bg0_tilemap, 0, 0); - argus_draw_sprites(screen->machine(), bitmap, cliprect, 0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0, 0); + argus_draw_sprites(screen.machine(), bitmap, cliprect, 0); if (state->m_bg_status & 1) /* Backgound enable */ - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - argus_draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + argus_draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( valtric ) +SCREEN_UPDATE_RGB32( valtric ) { - argus_state *state = screen->machine().driver_data(); - bg_setting(screen->machine()); + argus_state *state = screen.machine().driver_data(); + bg_setting(screen.machine()); if (state->m_bg_status & 1) /* Backgound enable */ - valtric_draw_mosaic(*screen, bitmap, cliprect); + valtric_draw_mosaic(screen, bitmap, cliprect); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - valtric_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + valtric_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( butasan ) +SCREEN_UPDATE_RGB32( butasan ) { - argus_state *state = screen->machine().driver_data(); - bg_setting(screen->machine()); + argus_state *state = screen.machine().driver_data(); + bg_setting(screen.machine()); if (state->m_bg_status & 1) /* Backgound enable */ - tilemap_draw(bitmap, cliprect, state->m_bg0_tilemap, 0, 0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - if (state->m_butasan_bg1_status & 1) tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - butasan_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + if (state->m_butasan_bg1_status & 1) state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + butasan_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); - butasan_log_vram(screen->machine()); + butasan_log_vram(screen.machine()); return 0; } diff -Nru mame-0.144/src/mame/video/arkanoid.c mame-0.145/src/mame/video/arkanoid.c --- mame-0.144/src/mame/video/arkanoid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/arkanoid.c 2012-02-06 21:30:31.000000000 +0000 @@ -14,7 +14,7 @@ { arkanoid_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( arkanoid_d008_w ) @@ -26,13 +26,13 @@ if (flip_screen_x_get(space->machine()) != (data & 0x01)) { flip_screen_x_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (flip_screen_y_get(space->machine()) != (data & 0x02)) { flip_screen_y_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 2 selects the input paddle */ @@ -51,7 +51,7 @@ if (state->m_gfxbank != bank) { state->m_gfxbank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } bank = (data & 0x40) >> 6; @@ -59,7 +59,7 @@ if (state->m_palettebank != bank) { state->m_palettebank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* BM: bit 7 is suspected to be MCU reset, the evidence for this is that @@ -82,13 +82,13 @@ if (flip_screen_x_get(space->machine()) != (data & 0x01)) { flip_screen_x_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (flip_screen_y_get(space->machine()) != (data & 0x02)) { flip_screen_y_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 2 selects the input paddle? */ @@ -103,7 +103,7 @@ if (state->m_gfxbank != bank) { state->m_gfxbank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } bank = (data & 0x40) >> 6; @@ -111,7 +111,7 @@ if (state->m_palettebank != bank) { state->m_palettebank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 7 is coin lockout (but not the service coin) */ @@ -128,14 +128,14 @@ if (flip_screen_x_get(space->machine()) != (data & 0x01)) { flip_screen_x_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 1 = flipy (or x?) */ if (flip_screen_y_get(space->machine()) != (data & 0x02)) { flip_screen_y_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 2 - 3 unknown */ @@ -147,7 +147,7 @@ if (state->m_gfxbank != ((data & 0x20) >> 5)) { state->m_gfxbank = (data & 0x20) >> 5; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 6 - 7 unknown */ @@ -170,7 +170,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { arkanoid_state *state = machine.driver_data(); int offs; @@ -202,19 +202,19 @@ } -SCREEN_UPDATE( arkanoid ) +SCREEN_UPDATE_IND16( arkanoid ) { - arkanoid_state *state = screen->machine().driver_data(); + arkanoid_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( hexa ) +SCREEN_UPDATE_IND16( hexa ) { - arkanoid_state *state = screen->machine().driver_data(); + arkanoid_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/armedf.c mame-0.145/src/mame/video/armedf.c --- mame-0.144/src/mame/video/armedf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/armedf.c 2012-02-06 21:30:32.000000000 +0000 @@ -49,7 +49,7 @@ } /* bit 3 controls priority, (0) nb1414m4 has priority over all the other video layers */ - tileinfo->category = (attributes & 0x8) >> 3; + tileinfo.category = (attributes & 0x8) >> 3; SET_TILE_INFO( 0, @@ -76,7 +76,7 @@ //} /* bit 3 controls priority, (0) nb1414m4 has priority over all the other video layers */ - tileinfo->category = (attributes & 0x8) >> 3; + tileinfo.category = (attributes & 0x8) >> 3; SET_TILE_INFO( 0, @@ -128,14 +128,15 @@ state->m_tx_tilemap = tilemap_create(machine, get_nb1414m4_tx_tile_info, (state->m_scroll_type == 2) ? armedf_scan_type3 : armedf_scan_type2, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0xf); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xf); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0xf); + state->m_bg_tilemap->set_transparent_pen(0xf); + state->m_fg_tilemap->set_transparent_pen(0xf); + state->m_tx_tilemap->set_transparent_pen(0xf); if (state->m_scroll_type != 1) - tilemap_set_scrollx(state->m_tx_tilemap, 0, -128); + state->m_tx_tilemap->set_scrollx(0, -128); state->m_text_videoram = auto_alloc_array(machine, UINT8, 0x1000); + memset(state->m_text_videoram, 0x00, 0x1000); } VIDEO_START( armedf ) @@ -149,14 +150,15 @@ state->m_tx_tilemap = tilemap_create(machine, get_armedf_tx_tile_info, armedf_scan_type1, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0xf); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xf); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0xf); + state->m_bg_tilemap->set_transparent_pen(0xf); + state->m_fg_tilemap->set_transparent_pen(0xf); + state->m_tx_tilemap->set_transparent_pen(0xf); if (state->m_scroll_type != 1) - tilemap_set_scrollx(state->m_tx_tilemap, 0, -128); + state->m_tx_tilemap->set_scrollx(0, -128); state->m_text_videoram = auto_alloc_array(machine, UINT8, 0x1000); + memset(state->m_text_videoram, 0x00, 0x1000); } /*************************************************************************** @@ -177,7 +179,7 @@ armedf_state *state = space->machine().driver_data(); state->m_text_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x7ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } READ8_HANDLER( armedf_text_videoram_r ) @@ -191,21 +193,21 @@ { armedf_state *state = space->machine().driver_data(); state->m_text_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x7ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE16_HANDLER( armedf_fg_videoram_w ) { armedf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( armedf_bg_videoram_w ) { armedf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( terraf_fg_scrolly_w ) @@ -258,14 +260,14 @@ { armedf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_scrollx); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); } WRITE16_HANDLER( armedf_bg_scrolly_w ) { armedf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_scrolly); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); } @@ -277,7 +279,7 @@ ***************************************************************************/ /* custom code to handle color cycling effect, handled by m_spr_pal_clut */ -void armedf_drawgfx(running_machine &machine, bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +void armedf_drawgfx(running_machine &machine, bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color, UINT32 clut,int flipx,int flipy,int offsx,int offsy, int transparent_color) { @@ -301,29 +303,26 @@ ex = sx + gfx->width; ey = sy + gfx->height; - if (clip) - { - if (sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += xinc*pixels; - } - if (sy < clip->min_y) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += yinc*pixels; - } - /* NS 980211 - fixed incorrect clipping */ - if (ex > clip->max_x+1) - { /* clip right */ - ex = clip->max_x+1; - } - if (ey > clip->max_y+1) - { /* clip bottom */ - ey = clip->max_y+1; - } + if (sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += xinc*pixels; + } + if (sy < clip.min_y) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += yinc*pixels; + } + /* NS 980211 - fixed incorrect clipping */ + if (ex > clip.max_x+1) + { /* clip right */ + ex = clip.max_x+1; + } + if (ey > clip.max_y+1) + { /* clip bottom */ + ey = clip.max_y+1; } if (ex > sx) @@ -334,7 +333,7 @@ for (y = sy; y < ey; y++) { const UINT8 *source = source_base + y_index*gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); int x_index = x_index_base; for (x = sx; x < ex; x++) { @@ -351,7 +350,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { UINT16 *buffered_spriteram = machine.generic.buffered_spriteram.u16; armedf_state *state = machine.driver_data(); @@ -386,57 +385,61 @@ } } -SCREEN_UPDATE( armedf ) +SCREEN_UPDATE_IND16( armedf ) { - armedf_state *state = screen->machine().driver_data(); + armedf_state *state = screen.machine().driver_data(); int sprite_enable = state->m_vreg & 0x200; - tilemap_set_enable(state->m_bg_tilemap, state->m_vreg & 0x800); - tilemap_set_enable(state->m_fg_tilemap, state->m_vreg & 0x400); - tilemap_set_enable(state->m_tx_tilemap, state->m_vreg & 0x100); + state->m_bg_tilemap->enable(state->m_vreg & 0x800); + state->m_fg_tilemap->enable(state->m_vreg & 0x400); + state->m_tx_tilemap->enable(state->m_vreg & 0x100); switch (state->m_scroll_type) { case 0: /* terra force, kozure ookami */ case 2: /* legion */ case 3: /* crazy climber */ - tilemap_set_scrollx(state->m_fg_tilemap, 0, (state->m_fg_scrollx & 0x3ff)); - tilemap_set_scrolly(state->m_fg_tilemap, 0, (state->m_fg_scrolly & 0x3ff)); + state->m_fg_tilemap->set_scrollx(0, (state->m_fg_scrollx & 0x3ff)); + state->m_fg_tilemap->set_scrolly(0, (state->m_fg_scrolly & 0x3ff)); break; case 1: /* armed formation */ - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fg_scrolly); + state->m_fg_tilemap->set_scrollx(0, state->m_fg_scrollx); + state->m_fg_tilemap->set_scrolly(0, state->m_fg_scrolly); break; } - bitmap_fill(bitmap, cliprect , 0xff); + bitmap.fill(0xff, cliprect ); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, TILEMAP_DRAW_CATEGORY(1), 0); + state->m_tx_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1), 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (sprite_enable) - draw_sprites(screen->machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 2); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); if (sprite_enable) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); if (sprite_enable) - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, TILEMAP_DRAW_CATEGORY(0), 0); + state->m_tx_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0), 0); return 0; } -SCREEN_EOF( armedf ) +SCREEN_VBLANK( armedf ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/artmagic.c mame-0.145/src/mame/video/artmagic.c --- mame-0.144/src/mame/video/artmagic.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/artmagic.c 2012-02-06 21:30:31.000000000 +0000 @@ -339,12 +339,12 @@ * *************************************/ -void artmagic_scanline(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void artmagic_scanline(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { artmagic_state *state = screen.machine().driver_data(); offs_t offset = (params->rowaddr << 12) & 0x7ff000; UINT16 *vram = address_to_vram(state, &offset); - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); int coladdr = params->coladdr << 1; int x; diff -Nru mame-0.144/src/mame/video/ashnojoe.c mame-0.145/src/mame/video/ashnojoe.c --- mame-0.144/src/mame/video/ashnojoe.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ashnojoe.c 2012-02-06 21:30:33.000000000 +0000 @@ -103,7 +103,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap, offset); + state->m_joetilemap->mark_tile_dirty(offset); } @@ -112,7 +112,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_2[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap2, offset / 2); + state->m_joetilemap2->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( ashnojoe_tileram3_w ) @@ -120,7 +120,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_3[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap3, offset); + state->m_joetilemap3->mark_tile_dirty(offset); } WRITE16_HANDLER( ashnojoe_tileram4_w ) @@ -128,7 +128,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_4[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap4, offset); + state->m_joetilemap4->mark_tile_dirty(offset); } WRITE16_HANDLER( ashnojoe_tileram5_w ) @@ -136,7 +136,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_5[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap5, offset / 2); + state->m_joetilemap5->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( ashnojoe_tileram6_w ) @@ -144,7 +144,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_6[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap6, offset / 2); + state->m_joetilemap6->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( ashnojoe_tileram7_w ) @@ -152,7 +152,7 @@ ashnojoe_state *state = space->machine().driver_data(); state->m_tileram_7[offset] = data; - tilemap_mark_tile_dirty(state->m_joetilemap7, offset / 2); + state->m_joetilemap7->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( joe_tilemaps_xscroll_w ) @@ -162,20 +162,20 @@ switch( offset ) { case 0: - tilemap_set_scrollx(state->m_joetilemap3, 0, data); + state->m_joetilemap3->set_scrollx(0, data); break; case 1: - tilemap_set_scrollx(state->m_joetilemap5, 0, data); + state->m_joetilemap5->set_scrollx(0, data); break; case 2: - tilemap_set_scrollx(state->m_joetilemap2, 0, data); + state->m_joetilemap2->set_scrollx(0, data); break; case 3: - tilemap_set_scrollx(state->m_joetilemap4, 0, data); + state->m_joetilemap4->set_scrollx(0, data); break; case 4: - tilemap_set_scrollx(state->m_joetilemap6, 0, data); - tilemap_set_scrollx(state->m_joetilemap7, 0, data); + state->m_joetilemap6->set_scrollx(0, data); + state->m_joetilemap7->set_scrollx(0, data); break; } } @@ -187,20 +187,20 @@ switch( offset ) { case 0: - tilemap_set_scrolly(state->m_joetilemap3, 0, data); + state->m_joetilemap3->set_scrolly(0, data); break; case 1: - tilemap_set_scrolly(state->m_joetilemap5, 0, data); + state->m_joetilemap5->set_scrolly(0, data); break; case 2: - tilemap_set_scrolly(state->m_joetilemap2, 0, data); + state->m_joetilemap2->set_scrolly(0, data); break; case 3: - tilemap_set_scrolly(state->m_joetilemap4, 0, data); + state->m_joetilemap4->set_scrolly(0, data); break; case 4: - tilemap_set_scrolly(state->m_joetilemap6, 0, data); - tilemap_set_scrolly(state->m_joetilemap7, 0, data); + state->m_joetilemap6->set_scrolly(0, data); + state->m_joetilemap7->set_scrolly(0, data); break; } } @@ -217,31 +217,31 @@ state->m_joetilemap6 = tilemap_create(machine, get_joe_tile_info_6, tilemap_scan_rows, 16, 16, 32, 32); state->m_joetilemap7 = tilemap_create(machine, get_joe_tile_info_7, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_joetilemap, 15); - tilemap_set_transparent_pen(state->m_joetilemap2, 15); - tilemap_set_transparent_pen(state->m_joetilemap3, 15); - tilemap_set_transparent_pen(state->m_joetilemap4, 15); - tilemap_set_transparent_pen(state->m_joetilemap5, 15); + state->m_joetilemap->set_transparent_pen(15); + state->m_joetilemap2->set_transparent_pen(15); + state->m_joetilemap3->set_transparent_pen(15); + state->m_joetilemap4->set_transparent_pen(15); + state->m_joetilemap5->set_transparent_pen(15); } -SCREEN_UPDATE( ashnojoe ) +SCREEN_UPDATE_IND16( ashnojoe ) { - ashnojoe_state *state = screen->machine().driver_data(); + ashnojoe_state *state = screen.machine().driver_data(); //state->m_tilemap_reg[0] & 0x10 // ?? on coin insertion - flip_screen_set(screen->machine(), state->m_tilemap_reg[0] & 1); + flip_screen_set(screen.machine(), state->m_tilemap_reg[0] & 1); if(state->m_tilemap_reg[0] & 0x02) - tilemap_draw(bitmap, cliprect, state->m_joetilemap7, 0, 0); + state->m_joetilemap7->draw(bitmap, cliprect, 0, 0); else - tilemap_draw(bitmap, cliprect, state->m_joetilemap6, 0, 0); + state->m_joetilemap6->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_joetilemap4, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_joetilemap2, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_joetilemap5, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_joetilemap3, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_joetilemap, 0, 0); + state->m_joetilemap4->draw(bitmap, cliprect, 0, 0); + state->m_joetilemap2->draw(bitmap, cliprect, 0, 0); + state->m_joetilemap5->draw(bitmap, cliprect, 0, 0); + state->m_joetilemap3->draw(bitmap, cliprect, 0, 0); + state->m_joetilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/asterix.c mame-0.145/src/mame/video/asterix.c --- mame-0.144/src/mame/video/asterix.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/asterix.c 2012-02-06 21:30:32.000000000 +0000 @@ -46,9 +46,9 @@ *code = (*code & 0x03ff) | state->m_tilebanks[(*code >> 10) & 3]; } -SCREEN_UPDATE( asterix ) +SCREEN_UPDATE_IND16( asterix ) { - asterix_state *state = screen->machine().driver_data(); + asterix_state *state = screen.machine().driver_data(); static const int K053251_CI[4] = { K053251_CI0, K053251_CI2, K053251_CI3, K053251_CI4 }; int layer[3], plane, new_colorbase; @@ -96,8 +96,8 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, layer[0], K056832_DRAW_FLAG_MIRROR, 1); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, layer[1], K056832_DRAW_FLAG_MIRROR, 2); diff -Nru mame-0.144/src/mame/video/astrocde.c mame-0.145/src/mame/video/astrocde.c --- mame-0.144/src/mame/video/astrocde.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/astrocde.c 2012-02-06 21:30:32.000000000 +0000 @@ -244,9 +244,9 @@ * *************************************/ -SCREEN_UPDATE( astrocde ) +SCREEN_UPDATE_IND16( astrocde ) { - astrocde_state *state = screen->machine().driver_data(); + astrocde_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT32 sparklebase = 0; const int colormask = (state->m_video_config & AC_MONITOR_BW) ? 0 : 0x1f0; @@ -254,16 +254,16 @@ int y; /* compute the starting point of sparkle for the current frame */ - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); if (state->m_video_config & AC_STARS) - sparklebase = (screen->frame_number() * (UINT64)(width * height)) % RNG_PERIOD; + sparklebase = (screen.frame_number() * (UINT64)(width * height)) % RNG_PERIOD; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); int effy = mame_vpos_to_astrocade_vpos(y); UINT16 offset = (effy / xystep) * (80 / xystep); UINT32 sparkleoffs = 0, staroffs = 0; @@ -330,16 +330,16 @@ } -SCREEN_UPDATE( profpac ) +SCREEN_UPDATE_IND16( profpac ) { - astrocde_state *state = screen->machine().driver_data(); + astrocde_state *state = screen.machine().driver_data(); int y; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int effy = mame_vpos_to_astrocade_vpos(y); - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); UINT16 offset = state->m_profpac_vispage * 0x4000 + effy * 80; int x; diff -Nru mame-0.144/src/mame/video/asuka.c mame-0.145/src/mame/video/asuka.c --- mame-0.144/src/mame/video/asuka.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/asuka.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,9 +19,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( asuka ) +SCREEN_UPDATE_IND16( asuka ) { - asuka_state *state = screen->machine().driver_data(); + asuka_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -30,10 +30,10 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); @@ -45,9 +45,9 @@ } -SCREEN_UPDATE( bonzeadv ) +SCREEN_UPDATE_IND16( bonzeadv ) { - asuka_state *state = screen->machine().driver_data(); + asuka_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -56,10 +56,10 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); diff -Nru mame-0.144/src/mame/video/atari.c mame-0.145/src/mame/video/atari.c --- mame-0.144/src/mame/video/atari.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atari.c 2012-02-06 21:30:32.000000000 +0000 @@ -713,6 +713,8 @@ LOG(("atari antic_vh_start\n")); memset(&antic, 0, sizeof(antic)); + antic.bitmap = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); + antic.renderer = antic_mode_0_xx; antic.cclk_expand = auto_alloc_array(machine, UINT32, 21 * 256); @@ -759,8 +761,6 @@ { antic.video[i] = auto_alloc_clear(machine, VIDEO); } - - VIDEO_START_CALL(generic_bitmapped); } /************************************************************************ @@ -768,13 +768,13 @@ * Refresh screen bitmap. * Note: Actual drawing is done scanline wise during atari_interrupt ************************************************************************/ -SCREEN_UPDATE( atari ) +SCREEN_UPDATE_IND16( atari ) { UINT32 new_tv_artifacts; - SCREEN_UPDATE_CALL(generic_bitmapped); + copybitmap(bitmap, *antic.bitmap, 0, 0, 0, 0, cliprect); - new_tv_artifacts = input_port_read_safe(screen->machine(), "artifacts", 0); + new_tv_artifacts = input_port_read_safe(screen.machine(), "artifacts", 0); if( tv_artifacts != new_tv_artifacts ) { tv_artifacts = new_tv_artifacts; @@ -1043,7 +1043,7 @@ dst[2] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; dst[3] = antic.color_lookup[PBK] | antic.color_lookup[PBK] << 16; - draw_scanline8(machine.generic.tmpbitmap, 12, y, MIN(machine.generic.tmpbitmap->width - 12, sizeof(scanline)), (const UINT8 *) scanline, NULL); + draw_scanline8(*antic.bitmap, 12, y, MIN(antic.bitmap->width() - 12, sizeof(scanline)), (const UINT8 *) scanline, NULL); } static int cycle(running_machine &machine) @@ -1540,24 +1540,24 @@ -INTERRUPT_GEN( a400_interrupt ) +TIMER_DEVICE_CALLBACK( a400_interrupt ) { - generic_atari_interrupt(device->machine(), a800_handle_keyboard, 4); + generic_atari_interrupt(timer.machine(), a800_handle_keyboard, 4); } -INTERRUPT_GEN( a800_interrupt ) +TIMER_DEVICE_CALLBACK( a800_interrupt ) { - generic_atari_interrupt(device->machine(), a800_handle_keyboard, 4); + generic_atari_interrupt(timer.machine(), a800_handle_keyboard, 4); } -INTERRUPT_GEN( a800xl_interrupt ) +TIMER_DEVICE_CALLBACK( a800xl_interrupt ) { - generic_atari_interrupt(device->machine(), a800_handle_keyboard, 2); + generic_atari_interrupt(timer.machine(), a800_handle_keyboard, 2); } -INTERRUPT_GEN( a5200_interrupt ) +TIMER_DEVICE_CALLBACK( a5200_interrupt ) { - generic_atari_interrupt(device->machine(), a5200_handle_keypads, 4); + generic_atari_interrupt(timer.machine(), a5200_handle_keypads, 4); } /************************************************************** diff -Nru mame-0.144/src/mame/video/atarifb.c mame-0.145/src/mame/video/atarifb.c --- mame-0.144/src/mame/video/atarifb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/atarifb.c 2012-02-06 21:30:32.000000000 +0000 @@ -14,7 +14,7 @@ * *************************************/ -static void get_tile_info_common( running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, UINT8 *alpha_videoram ) +static void get_tile_info_common( running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, UINT8 *alpha_videoram ) { int code = alpha_videoram[tile_index] & 0x3f; int flip = alpha_videoram[tile_index] & 0x40; @@ -64,7 +64,7 @@ atarifb_state *state = space->machine().driver_data(); state->m_alphap1_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_alpha1_tilemap, offset); + state->m_alpha1_tilemap->mark_tile_dirty(offset); } @@ -73,7 +73,7 @@ atarifb_state *state = space->machine().driver_data(); state->m_alphap2_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_alpha2_tilemap, offset); + state->m_alpha2_tilemap->mark_tile_dirty(offset); } @@ -82,7 +82,7 @@ atarifb_state *state = space->machine().driver_data(); state->m_field_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_field_tilemap, offset); + state->m_field_tilemap->mark_tile_dirty(offset); } @@ -104,10 +104,10 @@ -static void draw_playfield_and_alpha( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int playfield_x_offset, int playfield_y_offset ) +static void draw_playfield_and_alpha( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int playfield_x_offset, int playfield_y_offset ) { atarifb_state *state = machine.driver_data(); - static const rectangle bigfield_area = { 4 * 8, 34 * 8 - 1, 0 * 8, 32 * 8 - 1 }; + const rectangle bigfield_area(4 * 8, 34 * 8 - 1, 0 * 8, 32 * 8 - 1); int scroll_x[1]; int scroll_y[1]; @@ -115,16 +115,16 @@ scroll_x[0] = - *state->m_scroll_register + 32 + playfield_x_offset; scroll_y[0] = 8 + playfield_y_offset; - copybitmap(bitmap, tilemap_get_pixmap(state->m_alpha1_tilemap), 0, 0, 35*8, 1*8, NULL); - copybitmap(bitmap, tilemap_get_pixmap(state->m_alpha2_tilemap), 0, 0, 0*8, 1*8, NULL); - copyscrollbitmap(bitmap, tilemap_get_pixmap(state->m_field_tilemap), 1, scroll_x, 1, scroll_y, &bigfield_area); + copybitmap(bitmap, state->m_alpha1_tilemap->pixmap(), 0, 0, 35*8, 1*8, cliprect); + copybitmap(bitmap, state->m_alpha2_tilemap->pixmap(), 0, 0, 0*8, 1*8, cliprect); + copyscrollbitmap(bitmap, state->m_field_tilemap->pixmap(), 1, scroll_x, 1, scroll_y, bigfield_area); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int gfx, int is_soccer ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int gfx, int is_soccer ) { atarifb_state *state = machine.driver_data(); - static const rectangle bigfield_area = { 4 * 8, 34 * 8 - 1, 0 * 8, 32 * 8 - 1 }; + const rectangle bigfield_area(4 * 8, 34 * 8 - 1, 0 * 8, 32 * 8 - 1); int obj; @@ -152,14 +152,14 @@ { shade = ((state->m_spriteram[obj * 2 + 1 + 0x20]) & 0x07); - drawgfx_transpen(bitmap, &bigfield_area, machine.gfx[gfx + 1], + drawgfx_transpen(bitmap, bigfield_area, machine.gfx[gfx + 1], charcode, shade, flipx, flipy, sx, sy, 0); shade = ((state->m_spriteram[obj * 2 + 1 + 0x20]) & 0x08) >> 3; } - drawgfx_transpen(bitmap, &bigfield_area, machine.gfx[gfx], + drawgfx_transpen(bitmap, bigfield_area, machine.gfx[gfx], charcode, shade, flipx, flipy, sx, sy, 0); @@ -171,7 +171,7 @@ if ((charcode == 0x11) && (sy == 0x07)) { sy = 0xf1; /* When multiplexed, it's 0x10...why? */ - drawgfx_transpen(bitmap, &bigfield_area, machine.gfx[gfx], + drawgfx_transpen(bitmap, bigfield_area, machine.gfx[gfx], charcode, 0, flipx, flipy, sx, sy, 0); } @@ -180,31 +180,31 @@ } -SCREEN_UPDATE( atarifb ) +SCREEN_UPDATE_IND16( atarifb ) { - draw_playfield_and_alpha(screen->machine(), bitmap, cliprect, 0, 0); + draw_playfield_and_alpha(screen.machine(), bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); return 0; } -SCREEN_UPDATE( abaseb ) +SCREEN_UPDATE_IND16( abaseb ) { - draw_playfield_and_alpha(screen->machine(), bitmap, cliprect, -8, 0); + draw_playfield_and_alpha(screen.machine(), bitmap, cliprect, -8, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1, 0); return 0; } -SCREEN_UPDATE( soccer ) +SCREEN_UPDATE_IND16( soccer ) { - draw_playfield_and_alpha(screen->machine(), bitmap, cliprect, 0, 8); + draw_playfield_and_alpha(screen.machine(), bitmap, cliprect, 0, 8); - draw_sprites(screen->machine(), bitmap, cliprect, 2, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 2, 1); return 0; } diff -Nru mame-0.144/src/mame/video/atarig1.c mame-0.145/src/mame/video/atarig1.c --- mame-0.144/src/mame/video/atarig1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarig1.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,7 +59,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* reset statics */ state->m_pfscroll_xoffset = state->m_is_pitfight ? 2 : 0; @@ -116,7 +116,7 @@ if (newscroll != state->m_playfield_xscroll) { screen.update_partial(MAX(scanline + i - 1, 0)); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrollx(0, newscroll); state->m_playfield_xscroll = newscroll; } } @@ -130,13 +130,13 @@ if (newscroll != state->m_playfield_yscroll) { screen.update_partial(MAX(scanline + i - 1, 0)); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); state->m_playfield_yscroll = newscroll; } if (newbank != state->m_playfield_tile_bank) { screen.update_partial(MAX(scanline + i - 1, 0)); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_tile_bank = newbank; } } @@ -151,24 +151,28 @@ * *************************************/ -SCREEN_UPDATE( atarig1 ) +SCREEN_UPDATE_IND16( atarig1 ) { - atarig1_state *state = screen->machine().driver_data(); + atarig1_state *state = screen.machine().driver_data(); /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* copy the motion objects on top */ - copybitmap_trans(bitmap, atarirle_get_vram(state->m_rle, 0), 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *atarirle_get_vram(state->m_rle, 0), 0, 0, 0, 0, cliprect, 0); /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( atarig1 ) +SCREEN_VBLANK( atarig1 ) { - atarig1_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + atarig1_state *state = screen.machine().driver_data(); - atarirle_eof(state->m_rle); + atarirle_eof(state->m_rle); + } } diff -Nru mame-0.144/src/mame/video/atarig42.c mame-0.145/src/mame/video/atarig42.c --- mame-0.144/src/mame/video/atarig42.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarig42.c 2012-02-06 21:30:33.000000000 +0000 @@ -49,7 +49,7 @@ int code = (state->m_playfield_tile_bank << 12) | (data & 0xfff); int color = (state->m_playfield_base >> 5) + ((state->m_playfield_color_bank << 3) & 0x18) + ((data >> 12) & 7); SET_TILE_INFO(0, code, color, (data >> 15) & 1); - tileinfo->category = (state->m_playfield_color_bank >> 2) & 7; + tileinfo.category = (state->m_playfield_color_bank >> 2) & 7; } @@ -82,7 +82,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_current_control)); @@ -137,14 +137,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrollx(0, newscroll); state->m_playfield_xscroll = newscroll; } if (newbank != state->m_playfield_color_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_color_bank = newbank; } } @@ -158,14 +158,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); state->m_playfield_yscroll = newscroll; } if (newbank != state->m_playfield_tile_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_tile_bank = newbank; } } @@ -180,37 +180,37 @@ * *************************************/ -SCREEN_UPDATE( atarig42 ) +SCREEN_UPDATE_IND16( atarig42 ) { - atarig42_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + atarig42_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 1, 1); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 2, 2); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 3, 3); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 4, 4); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 5, 5); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 6, 6); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 7, 7); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 1, 1); + state->m_playfield_tilemap->draw(bitmap, cliprect, 2, 2); + state->m_playfield_tilemap->draw(bitmap, cliprect, 3, 3); + state->m_playfield_tilemap->draw(bitmap, cliprect, 4, 4); + state->m_playfield_tilemap->draw(bitmap, cliprect, 5, 5); + state->m_playfield_tilemap->draw(bitmap, cliprect, 6, 6); + state->m_playfield_tilemap->draw(bitmap, cliprect, 7, 7); /* copy the motion objects on top */ { - bitmap_t *mo_bitmap = atarirle_get_vram(state->m_rle, 0); - int left = cliprect->min_x; - int top = cliprect->min_y; - int right = cliprect->max_x + 1; - int bottom = cliprect->max_y + 1; + bitmap_ind16 *mo_bitmap = atarirle_get_vram(state->m_rle, 0); + int left = cliprect.min_x; + int top = cliprect.min_y; + int right = cliprect.max_x + 1; + int bottom = cliprect.max_y + 1; int x, y; /* now blend with the playfield */ for (y = top; y < bottom; y++) { - UINT16 *pf = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - UINT16 *mo = (UINT16 *)mo_bitmap->base + y * mo_bitmap->rowpixels; - UINT8 *pri = (UINT8 *)priority_bitmap->base + priority_bitmap->rowpixels * y; + UINT16 *pf = &bitmap.pix16(y); + UINT16 *mo = &mo_bitmap->pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = left; x < right; x++) if (mo[x]) { @@ -223,13 +223,17 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( atarig42 ) +SCREEN_VBLANK( atarig42 ) { - atarig42_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + atarig42_state *state = screen.machine().driver_data(); - atarirle_eof(state->m_rle); + atarirle_eof(state->m_rle); + } } diff -Nru mame-0.144/src/mame/video/atarigt.c mame-0.145/src/mame/video/atarigt.c --- mame-0.144/src/mame/video/atarigt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarigt.c 2012-02-06 21:30:32.000000000 +0000 @@ -98,8 +98,8 @@ width = machine.primary_screen->width(); height = machine.primary_screen->height(); - state->m_pf_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_an_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + state->m_pf_bitmap = auto_bitmap_ind16_alloc(machine, width, height); + state->m_an_bitmap = auto_bitmap_ind16_alloc(machine, width, height); /* map pens 1:1 */ substitute_pens = auto_alloc_array(machine, pen_t, 65536); @@ -188,14 +188,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrollx(0, newscroll); state->m_playfield_xscroll = newscroll; } if (newbank != state->m_playfield_color_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_palette_offset(state->m_playfield_tilemap, (newbank & 0x1f) << 8); + state->m_playfield_tilemap->set_palette_offset((newbank & 0x1f) << 8); state->m_playfield_color_bank = newbank; } } @@ -208,14 +208,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); state->m_playfield_yscroll = newscroll; } if (newbank != state->m_playfield_tile_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_tile_bank = newbank; } } @@ -506,21 +506,21 @@ */ -SCREEN_UPDATE( atarigt ) +SCREEN_UPDATE_RGB32( atarigt ) { - atarigt_state *state = screen->machine().driver_data(); - bitmap_t *mo_bitmap = atarirle_get_vram(state->m_rle, 0); - bitmap_t *tm_bitmap = atarirle_get_vram(state->m_rle, 1); + atarigt_state *state = screen.machine().driver_data(); + bitmap_ind16 *mo_bitmap = atarirle_get_vram(state->m_rle, 0); + bitmap_ind16 *tm_bitmap = atarirle_get_vram(state->m_rle, 1); UINT16 *cram, *tram; int color_latch; UINT32 *mram; int x, y; /* draw the playfield */ - tilemap_draw(state->m_pf_bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(*state->m_pf_bitmap, cliprect, 0, 0); /* draw the alpha layer */ - tilemap_draw(state->m_an_bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(*state->m_an_bitmap, cliprect, 0, 0); /* cache pointers */ color_latch = state->m_colorram[0x30000/2]; @@ -529,18 +529,18 @@ mram = state->m_expanded_mram + 0x2000 * ((color_latch >> 6) & 3); /* now do the nasty blend */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *an = (UINT16 *)state->m_an_bitmap->base + y * state->m_an_bitmap->rowpixels; - UINT16 *pf = (UINT16 *)state->m_pf_bitmap->base + y * state->m_pf_bitmap->rowpixels; - UINT16 *mo = (UINT16 *)mo_bitmap->base + y * mo_bitmap->rowpixels; - UINT16 *tm = (UINT16 *)tm_bitmap->base + y * tm_bitmap->rowpixels; - UINT32 *dst = (UINT32 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *an = &state->m_an_bitmap->pix16(y); + UINT16 *pf = &state->m_pf_bitmap->pix16(y); + UINT16 *mo = &mo_bitmap->pix16(y); + UINT16 *tm = &tm_bitmap->pix16(y); + UINT32 *dst = &bitmap.pix32(y); /* Primal Rage: no TRAM, slightly different priorities */ if (state->m_is_primrage) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 pfpri = (pf[x] >> 10) & 7; UINT8 mopri = mo[x] >> ATARIRLE_PRIORITY_SHIFT; @@ -574,7 +574,7 @@ /* T-Mek: full TRAM and all effects */ else { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 pfpri = (pf[x] >> 10) & 7; UINT8 mopri = mo[x] >> ATARIRLE_PRIORITY_SHIFT; @@ -632,9 +632,13 @@ return 0; } -SCREEN_EOF( atarigt ) +SCREEN_VBLANK( atarigt ) { - atarigt_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + atarigt_state *state = screen.machine().driver_data(); - atarirle_eof(state->m_rle); + atarirle_eof(state->m_rle); + } } diff -Nru mame-0.144/src/mame/video/atarigx2.c mame-0.145/src/mame/video/atarigx2.c --- mame-0.144/src/mame/video/atarigx2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarigx2.c 2012-02-06 21:30:33.000000000 +0000 @@ -49,7 +49,7 @@ int code = (state->m_playfield_tile_bank << 12) | (data & 0xfff); int color = (state->m_playfield_base >> 5) + ((state->m_playfield_color_bank << 3) & 0x18) + ((data >> 12) & 7); SET_TILE_INFO(0, code, color, (data >> 15) & 1); - tileinfo->category = (state->m_playfield_color_bank >> 2) & 7; + tileinfo.category = (state->m_playfield_color_bank >> 2) & 7; } @@ -82,7 +82,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_current_control)); @@ -136,14 +136,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrollx(0, newscroll); state->m_playfield_xscroll = newscroll; } if (newbank != state->m_playfield_color_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_color_bank = newbank; } } @@ -156,14 +156,14 @@ { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); state->m_playfield_yscroll = newscroll; } if (newbank != state->m_playfield_tile_bank) { if (scanline + i > 0) screen.update_partial(scanline + i - 1); - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); state->m_playfield_tile_bank = newbank; } } @@ -178,37 +178,37 @@ * *************************************/ -SCREEN_UPDATE( atarigx2 ) +SCREEN_UPDATE_IND16( atarigx2 ) { - atarigx2_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + atarigx2_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 1, 1); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 2, 2); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 3, 3); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 4, 4); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 5, 5); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 6, 6); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 7, 7); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 1, 1); + state->m_playfield_tilemap->draw(bitmap, cliprect, 2, 2); + state->m_playfield_tilemap->draw(bitmap, cliprect, 3, 3); + state->m_playfield_tilemap->draw(bitmap, cliprect, 4, 4); + state->m_playfield_tilemap->draw(bitmap, cliprect, 5, 5); + state->m_playfield_tilemap->draw(bitmap, cliprect, 6, 6); + state->m_playfield_tilemap->draw(bitmap, cliprect, 7, 7); /* copy the motion objects on top */ { - bitmap_t *mo_bitmap = atarirle_get_vram(state->m_rle, 0); - int left = cliprect->min_x; - int top = cliprect->min_y; - int right = cliprect->max_x + 1; - int bottom = cliprect->max_y + 1; + bitmap_ind16 *mo_bitmap = atarirle_get_vram(state->m_rle, 0); + int left = cliprect.min_x; + int top = cliprect.min_y; + int right = cliprect.max_x + 1; + int bottom = cliprect.max_y + 1; int x, y; /* now blend with the playfield */ for (y = top; y < bottom; y++) { - UINT16 *pf = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - UINT16 *mo = (UINT16 *)mo_bitmap->base + y * mo_bitmap->rowpixels; - UINT8 *pri = (UINT8 *)priority_bitmap->base + y * priority_bitmap->rowpixels; + UINT16 *pf = &bitmap.pix16(y); + UINT16 *mo = &mo_bitmap->pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = left; x < right; x++) if (mo[x] && (mo[x] >> ATARIRLE_PRIORITY_SHIFT) >= pri[x]) pf[x] = mo[x] & ATARIRLE_DATA_MASK; @@ -216,13 +216,17 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( atarigx2 ) +SCREEN_VBLANK( atarigx2 ) { - atarigx2_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + atarigx2_state *state = screen.machine().driver_data(); - atarirle_eof(state->m_rle); + atarirle_eof(state->m_rle); + } } diff -Nru mame-0.144/src/mame/video/atarimo.c mame-0.145/src/mame/video/atarimo.c --- mame-0.144/src/mame/video/atarimo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarimo.c 2012-02-06 21:30:32.000000000 +0000 @@ -37,7 +37,7 @@ gfx_element * gfxelement[MAX_GFX_ELEMENTS]; /* local copy of graphics elements */ int gfxgranularity[MAX_GFX_ELEMENTS]; - bitmap_t *bitmap; /* temporary bitmap to render to */ + bitmap_ind16 *bitmap; /* temporary bitmap to render to */ int linked; /* are the entries linked? */ int split; /* are entries split or together? */ @@ -142,7 +142,7 @@ STATIC FUNCTION DECLARATIONS ***************************************************************************/ -static int mo_render_object(atarimo_data *mo, const atarimo_entry *entry, const rectangle *cliprect); +static int mo_render_object(atarimo_data *mo, const atarimo_entry *entry, const rectangle &cliprect); @@ -401,8 +401,8 @@ mo->slip_ram = auto_alloc_array_clear(machine, UINT16, 0x80); /* allocate the temp bitmap */ - mo->bitmap = auto_bitmap_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height(), BITMAP_FORMAT_INDEXED16); - bitmap_fill(mo->bitmap, NULL, desc->transpen); + mo->bitmap = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); + mo->bitmap->fill(desc->transpen); /* allocate the spriteram */ mo->spriteram = auto_alloc_array_clear(machine, atarimo_entry, mo->spriteramsize); @@ -550,19 +550,19 @@ cliprect. ---------------------------------------------------------------*/ -static void erase_dirty_grid(atarimo_data *mo, const rectangle *cliprect) +static void erase_dirty_grid(atarimo_data *mo, const rectangle &cliprect) { - int sx = cliprect->min_x >> mo->tilexshift; - int ex = cliprect->max_x >> mo->tilexshift; - int sy = cliprect->min_y >> mo->tileyshift; - int ey = cliprect->max_y >> mo->tileyshift; + int sx = cliprect.min_x >> mo->tilexshift; + int ex = cliprect.max_x >> mo->tilexshift; + int sy = cliprect.min_y >> mo->tileyshift; + int ey = cliprect.max_y >> mo->tileyshift; int y; /* loop over all grid rows that intersect our cliprect */ for (y = sy; y <= ey; y++) { /* get the base pointer and memset the row */ - UINT8 *dirtybase = get_dirty_base(mo, cliprect->min_x, y << mo->tileyshift); + UINT8 *dirtybase = get_dirty_base(mo, cliprect.min_x, y << mo->tileyshift); memset(dirtybase, 0, ex - sx + 1); } } @@ -573,12 +573,12 @@ series of cliprects. ---------------------------------------------------------------*/ -static void convert_dirty_grid_to_rects(atarimo_data *mo, const rectangle *cliprect, atarimo_rect_list *rectlist) +static void convert_dirty_grid_to_rects(atarimo_data *mo, const rectangle &cliprect, atarimo_rect_list *rectlist) { - int sx = cliprect->min_x >> mo->tilexshift; - int ex = cliprect->max_x >> mo->tilexshift; - int sy = cliprect->min_y >> mo->tileyshift; - int ey = cliprect->max_y >> mo->tileyshift; + int sx = cliprect.min_x >> mo->tilexshift; + int ex = cliprect.max_x >> mo->tilexshift; + int sy = cliprect.min_y >> mo->tileyshift; + int ey = cliprect.max_y >> mo->tileyshift; int tilewidth = 1 << mo->tilexshift; int tileheight = 1 << mo->tileyshift; rectangle *rect; @@ -592,7 +592,7 @@ /* loop over all grid rows that intersect our cliprect */ for (y = sy; y <= ey; y++) { - UINT8 *dirtybase = get_dirty_base(mo, cliprect->min_x, y << mo->tileyshift); + UINT8 *dirtybase = get_dirty_base(mo, cliprect.min_x, y << mo->tileyshift); int can_add_to_existing = 0; /* loop over all grid columns that intersect our cliprect */ @@ -636,7 +636,7 @@ destination bitmap. ---------------------------------------------------------------*/ -bitmap_t *atarimo_render(int map, const rectangle *cliprect, atarimo_rect_list *rectlist) +bitmap_ind16 *atarimo_render(int map, const rectangle &cliprect, atarimo_rect_list *rectlist) { atarimo_data *mo = atarimo[map]; int startband, stopband, band, i; @@ -651,8 +651,8 @@ } /* compute start/stop bands */ - startband = ((cliprect->min_y + mo->yscroll - mo->slipoffset) & mo->bitmapymask) >> mo->slipshift; - stopband = ((cliprect->max_y + mo->yscroll - mo->slipoffset) & mo->bitmapymask) >> mo->slipshift; + startband = ((cliprect.min_y + mo->yscroll - mo->slipoffset) & mo->bitmapymask) >> mo->slipshift; + stopband = ((cliprect.max_y + mo->yscroll - mo->slipoffset) & mo->bitmapymask) >> mo->slipshift; if (startband > stopband) startband -= mo->bitmapheight >> mo->slipshift; if (!mo->slipshift) @@ -672,7 +672,7 @@ if (!mo->slipshift) { link = 0; - bandclip = *cliprect; + bandclip = cliprect; } /* otherwise, grab the SLIP and compute the bandrect */ @@ -682,7 +682,7 @@ link = (mo->slip_ram[slipentry] >> mo->linkmask.shift) & mo->linkmask.mask; /* start with the cliprect */ - bandclip = *cliprect; + bandclip = cliprect; /* compute minimum Y and wrap around if necessary */ bandclip.min_y = ((band << mo->slipshift) - mo->yscroll + mo->slipoffset) & mo->bitmapymask; @@ -693,7 +693,7 @@ bandclip.max_y = bandclip.min_y + (1 << mo->slipshift) - 1; /* keep within the cliprect */ - sect_rect(&bandclip, cliprect); + bandclip &= cliprect; } /* if this matches the last link, we don't need to re-process the list */ @@ -718,7 +718,7 @@ /* render the mos */ for (current = first; current != last; current += step) - mo_render_object(mo, *current, &bandclip); + mo_render_object(mo, *current, bandclip); } /* convert the dirty grid to a rectlist */ @@ -726,7 +726,7 @@ /* clip the rectlist */ for (i = 0, rect = rectlist->rect; i < rectlist->numrects; i++, rect++) - sect_rect(rect, cliprect); + *rect &= cliprect; /* return the bitmap */ return mo->bitmap; @@ -739,11 +739,11 @@ to the destination. ---------------------------------------------------------------*/ -static int mo_render_object(atarimo_data *mo, const atarimo_entry *entry, const rectangle *cliprect) +static int mo_render_object(atarimo_data *mo, const atarimo_entry *entry, const rectangle &cliprect) { int gfxindex = mo->gfxlookup[EXTRACT_DATA(entry, mo->gfxmask)]; const gfx_element *gfx = mo->gfxelement[gfxindex]; - bitmap_t *bitmap = mo->bitmap; + bitmap_ind16 &bitmap = *mo->bitmap; int x, y, sx, sy; /* extract data from the various words */ @@ -838,19 +838,19 @@ for (y = 0, sy = ypos; y < height; y++, sy += yadv) { /* clip the Y coordinate */ - if (sy <= cliprect->min_y - mo->tileheight) + if (sy <= cliprect.min_y - mo->tileheight) { code += width; continue; } - else if (sy > cliprect->max_y) + else if (sy > cliprect.max_y) break; /* loop over the width */ for (x = 0, sx = xpos; x < width; x++, sx += xadv, code++) { /* clip the X coordinate */ - if (sx <= -cliprect->min_x - mo->tilewidth || sx > cliprect->max_x) + if (sx <= -cliprect.min_x - mo->tilewidth || sx > cliprect.max_x) continue; /* draw the sprite */ @@ -874,12 +874,12 @@ for (x = 0, sx = xpos; x < width; x++, sx += xadv) { /* clip the X coordinate */ - if (sx <= cliprect->min_x - mo->tilewidth) + if (sx <= cliprect.min_x - mo->tilewidth) { code += height; continue; } - else if (sx > cliprect->max_x) + else if (sx > cliprect.max_x) break; /* loop over the height */ @@ -887,7 +887,7 @@ for (y = 0, sy = ypos; y < height; y++, sy += yadv, code++) { /* clip the X coordinate */ - if (sy <= -cliprect->min_y - mo->tileheight || sy > cliprect->max_y) + if (sy <= -cliprect.min_y - mo->tileheight || sy > cliprect.max_y) continue; /* draw the sprite */ @@ -1142,13 +1142,13 @@ or the end of line. ---------------------------------------------------------------*/ -void atarimo_mark_high_palette(bitmap_t *bitmap, UINT16 *pf, UINT16 *mo, int x, int y) +void atarimo_mark_high_palette(bitmap_ind16 &bitmap, UINT16 *pf, UINT16 *mo, int x, int y) { #define START_MARKER ((4 << ATARIMO_PRIORITY_SHIFT) | 2) #define END_MARKER ((4 << ATARIMO_PRIORITY_SHIFT) | 4) int offnext = 0; - for ( ; x < bitmap->width; x++) + for ( ; x < bitmap.width(); x++) { pf[x] |= 0x400; if (offnext && (mo[x] & START_MARKER) != START_MARKER) diff -Nru mame-0.144/src/mame/video/atarimo.h mame-0.145/src/mame/video/atarimo.h --- mame-0.144/src/mame/video/atarimo.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/atarimo.h 2012-02-06 21:30:32.000000000 +0000 @@ -32,7 +32,7 @@ ***************************************************************************/ /* callback for special processing */ -typedef int (*atarimo_special_func)(bitmap_t *bitmap, const rectangle *clip, int code, int color, int xpos, int ypos, rectangle *mobounds); +typedef int (*atarimo_special_func)(bitmap_ind16 &bitmap, const rectangle &clip, int code, int color, int xpos, int ypos, rectangle *mobounds); /* description for a four-word mask */ typedef struct _atarimo_entry atarimo_entry; @@ -100,7 +100,7 @@ UINT8 *atarimo_get_gfx_lookup(int map, int *size); /* core processing */ -bitmap_t *atarimo_render(int map, const rectangle *cliprect, atarimo_rect_list *rectlist); +bitmap_ind16 *atarimo_render(int map, const rectangle &cliprect, atarimo_rect_list *rectlist); /* atrribute setters */ void atarimo_set_bank(int map, int bank); @@ -127,7 +127,7 @@ WRITE16_HANDLER( atarimo_1_spriteram_w ); WRITE16_HANDLER( atarimo_1_slipram_w ); -void atarimo_mark_high_palette(bitmap_t *bitmap, UINT16 *pf, UINT16 *mo, int x, int y); +void atarimo_mark_high_palette(bitmap_ind16 &bitmap, UINT16 *pf, UINT16 *mo, int x, int y); #endif diff -Nru mame-0.144/src/mame/video/atarirle.c mame-0.145/src/mame/video/atarirle.c --- mame-0.144/src/mame/video/atarirle.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarirle.c 2012-02-06 21:30:33.000000000 +0000 @@ -89,7 +89,7 @@ atarirle_info * info; /* list of info records */ atarirle_entry *spriteram; /* pointer to sprite RAM */ - bitmap_t * vram[2][2]; /* pointers to VRAM bitmaps and backbuffers */ + bitmap_ind16 * vram[2][2]; /* pointers to VRAM bitmaps and backbuffers */ int partial_scanline; /* partial update scanline */ UINT8 control_bits; /* current control bits */ @@ -131,14 +131,14 @@ static void prescan_rle(const atarirle_data *mo, int which); static void sort_and_render(running_machine &machine, atarirle_data *mo); static void compute_checksum(atarirle_data *mo); -static void draw_rle(atarirle_data *mo, bitmap_t *bitmap, int code, int color, int hflip, int vflip, - int x, int y, int xscale, int yscale, const rectangle *clip); -static void draw_rle_zoom(bitmap_t *bitmap, const atarirle_info *gfx, +static void draw_rle(atarirle_data *mo, bitmap_ind16 &bitmap, int code, int color, int hflip, int vflip, + int x, int y, int xscale, int yscale, const rectangle &clip); +static void draw_rle_zoom(bitmap_ind16 &bitmap, const atarirle_info *gfx, UINT32 palette, int sx, int sy, int scalex, int scaley, - const rectangle *clip); -static void draw_rle_zoom_hflip(bitmap_t *bitmap, const atarirle_info *gfx, + const rectangle &clip); +static void draw_rle_zoom_hflip(bitmap_ind16 &bitmap, const atarirle_info *gfx, UINT32 palette, int sx, int sy, int scalex, int scaley, - const rectangle *clip); + const rectangle &clip); @@ -338,18 +338,18 @@ width = machine.primary_screen->width(); height = machine.primary_screen->height(); - mo->vram[0][0] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - mo->vram[0][1] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - bitmap_fill(mo->vram[0][0], NULL, 0); - bitmap_fill(mo->vram[0][1], NULL, 0); + mo->vram[0][0] = auto_bitmap_ind16_alloc(machine, width, height); + mo->vram[0][1] = auto_bitmap_ind16_alloc(machine, width, height); + mo->vram[0][0]->fill(0); + mo->vram[0][1]->fill(0); /* allocate alternate bitmaps if needed */ if (mo->vrammask.mask != 0) { - mo->vram[1][0] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - mo->vram[1][1] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - bitmap_fill(mo->vram[1][0], NULL, 0); - bitmap_fill(mo->vram[1][1], NULL, 0); + mo->vram[1][0] = auto_bitmap_ind16_alloc(machine, width, height); + mo->vram[1][1] = auto_bitmap_ind16_alloc(machine, width, height); + mo->vram[1][0]->fill(0); + mo->vram[1][1]->fill(0); } mo->partial_scanline = -1; @@ -425,9 +425,9 @@ //logerror(" partial erase %d-%d (frame %d)\n", cliprect.min_y, cliprect.max_y, (oldbits & ATARIRLE_CONTROL_FRAME) >> 2); /* erase the bitmap */ - bitmap_fill(mo->vram[0][(oldbits & ATARIRLE_CONTROL_FRAME) >> 2], &cliprect, 0); + mo->vram[0][(oldbits & ATARIRLE_CONTROL_FRAME) >> 2]->fill(0, cliprect); if (mo->vrammask.mask != 0) - bitmap_fill(mo->vram[1][(oldbits & ATARIRLE_CONTROL_FRAME) >> 2], &cliprect, 0); + mo->vram[1][(oldbits & ATARIRLE_CONTROL_FRAME) >> 2]->fill(0, cliprect); } /* update the bits */ @@ -481,9 +481,9 @@ //logerror(" partial erase %d-%d (frame %d)\n", cliprect.min_y, cliprect.max_y, (mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2); /* erase the bitmap */ - bitmap_fill(mo->vram[0][(mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2], &cliprect, 0); + mo->vram[0][(mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]->fill(0, cliprect); if (mo->vrammask.mask != 0) - bitmap_fill(mo->vram[1][(mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2], &cliprect, 0); + mo->vram[1][(mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]->fill(0, cliprect); } /* reset the partial scanline to -1 so we can detect full updates */ @@ -566,7 +566,7 @@ atarirle_get_vram: Return the VRAM bitmap. ---------------------------------------------------------------*/ -bitmap_t *atarirle_get_vram(device_t *device, int idx) +bitmap_ind16 *atarirle_get_vram(device_t *device, int idx) { atarirle_data *mo = get_safe_token(device); //logerror("atarirle_get_vram (frame %d)\n", (mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2); @@ -775,8 +775,8 @@ static void sort_and_render(running_machine &machine, atarirle_data *mo) { - bitmap_t *bitmap1 = mo->vram[0][(~mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]; - bitmap_t *bitmap2 = mo->vram[1][(~mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]; + bitmap_ind16 *bitmap1 = mo->vram[0][(~mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]; + bitmap_ind16 *bitmap2 = mo->vram[1][(~mo->control_bits & ATARIRLE_CONTROL_FRAME) >> 2]; atarirle_entry *obj = mo->spriteram; mo_sort_entry sort_entry[256]; mo_sort_entry *list_head[256]; @@ -832,9 +832,9 @@ /* render to one or both bitmaps */ if (which == 0) - draw_rle(mo, bitmap1, code, color, hflip, 0, x, y, scale, scale, &mo->cliprect); + draw_rle(mo, *bitmap1, code, color, hflip, 0, x, y, scale, scale, mo->cliprect); if (bitmap2 && which != 0) - draw_rle(mo, bitmap2, code, color, hflip, 0, x, y, scale, scale, &mo->cliprect); + draw_rle(mo, *bitmap2, code, color, hflip, 0, x, y, scale, scale, mo->cliprect); } } @@ -921,13 +921,13 @@ for (ty = sy; ty <= ey; ty++) { - *BITMAP_ADDR16(bitmap1, ty, sx) = machine.rand() & 0xff; - *BITMAP_ADDR16(bitmap1, ty, ex) = machine.rand() & 0xff; + bitmap1->pix16(ty, sx) = machine.rand() & 0xff; + bitmap1->pix16(ty, ex) = machine.rand() & 0xff; } for (tx = sx; tx <= ex; tx++) { - *BITMAP_ADDR16(bitmap1, sy, tx) = machine.rand() & 0xff; - *BITMAP_ADDR16(bitmap1, ey, tx) = machine.rand() & 0xff; + bitmap1->pix16(sy, tx) = machine.rand() & 0xff; + bitmap1->pix16(ey, tx) = machine.rand() & 0xff; } } while (0); fprintf(stderr, " Sprite: c=%04X l=%04X h=%d X=%4d (o=%4d w=%3d) Y=%4d (o=%4d h=%d) s=%04X\n", @@ -946,8 +946,8 @@ object. ---------------------------------------------------------------*/ -void draw_rle(atarirle_data *mo, bitmap_t *bitmap, int code, int color, int hflip, int vflip, - int x, int y, int xscale, int yscale, const rectangle *clip) +void draw_rle(atarirle_data *mo, bitmap_ind16 &bitmap, int code, int color, int hflip, int vflip, + int x, int y, int xscale, int yscale, const rectangle &clip) { UINT32 palettebase = mo->palettebase + color; const atarirle_info *info = &mo->info[code]; @@ -958,7 +958,7 @@ if (hflip) scaled_xoffs = ((xscale * info->width) >> 12) - scaled_xoffs; -//if (clip->min_y == Machine->primary_screen->visible_area().min_y) +//if (clip.min_y == Machine->primary_screen->visible_area().min_y) //logerror(" Sprite: c=%04X l=%04X h=%d X=%4d (o=%4d w=%3d) Y=%4d (o=%4d h=%d) s=%04X\n", // code, color, hflip, // x, -scaled_xoffs, (xscale * info->width) >> 12, @@ -973,7 +973,7 @@ return; /* 16-bit case */ - assert(bitmap->bpp == 16); + assert(bitmap.bpp() == 16); if (!hflip) draw_rle_zoom(bitmap, info, palettebase, x, y, xscale << 4, yscale << 4, clip); else @@ -987,9 +987,9 @@ bitmap. ---------------------------------------------------------------*/ -void draw_rle_zoom(bitmap_t *bitmap, const atarirle_info *gfx, +void draw_rle_zoom(bitmap_ind16 &bitmap, const atarirle_info *gfx, UINT32 palette, int sx, int sy, int scalex, int scaley, - const rectangle *clip) + const rectangle &clip) { const UINT16 *row_start = gfx->data; const UINT16 *table = gfx->table; @@ -1014,36 +1014,36 @@ sourcey = dy / 2; /* left edge clip */ - if (sx < clip->min_x) - pixels_to_skip = clip->min_x - sx, xclipped = 1; - if (sx > clip->max_x) + if (sx < clip.min_x) + pixels_to_skip = clip.min_x - sx, xclipped = 1; + if (sx > clip.max_x) return; /* right edge clip */ - if (ex > clip->max_x) - ex = clip->max_x, xclipped = 1; - else if (ex < clip->min_x) + if (ex > clip.max_x) + ex = clip.max_x, xclipped = 1; + else if (ex < clip.min_x) return; /* top edge clip */ - if (sy < clip->min_y) + if (sy < clip.min_y) { - sourcey += (clip->min_y - sy) * dy; - sy = clip->min_y; + sourcey += (clip.min_y - sy) * dy; + sy = clip.min_y; } - else if (sy > clip->max_y) + else if (sy > clip.max_y) return; /* bottom edge clip */ - if (ey > clip->max_y) - ey = clip->max_y; - else if (ey < clip->min_y) + if (ey > clip.max_y) + ey = clip.max_y; + else if (ey < clip.min_y) return; /* loop top to bottom */ for (y = sy; y <= ey; y++, sourcey += dy) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, sx); + UINT16 *dest = &bitmap.pix16(y, sx); int j, sourcex = dx / 2, rle_end = 0; const UINT16 *base; int entry_count; @@ -1106,7 +1106,7 @@ /* clipped case */ else { - const UINT16 *end = BITMAP_ADDR16(bitmap, y, ex); + const UINT16 *end = &bitmap.pix16(y, ex); int to_be_skipped = pixels_to_skip; /* decode the pixels */ @@ -1177,9 +1177,9 @@ 16-bit bitmap with horizontal flip. ---------------------------------------------------------------*/ -void draw_rle_zoom_hflip(bitmap_t *bitmap, const atarirle_info *gfx, +void draw_rle_zoom_hflip(bitmap_ind16 &bitmap, const atarirle_info *gfx, UINT32 palette, int sx, int sy, int scalex, int scaley, - const rectangle *clip) + const rectangle &clip) { const UINT16 *row_start = gfx->data; const UINT16 *table = gfx->table; @@ -1203,36 +1203,36 @@ sourcey = dy / 2; /* left edge clip */ - if (sx < clip->min_x) - sx = clip->min_x, xclipped = 1; - if (sx > clip->max_x) + if (sx < clip.min_x) + sx = clip.min_x, xclipped = 1; + if (sx > clip.max_x) return; /* right edge clip */ - if (ex > clip->max_x) - pixels_to_skip = ex - clip->max_x, xclipped = 1; - else if (ex < clip->min_x) + if (ex > clip.max_x) + pixels_to_skip = ex - clip.max_x, xclipped = 1; + else if (ex < clip.min_x) return; /* top edge clip */ - if (sy < clip->min_y) + if (sy < clip.min_y) { - sourcey += (clip->min_y - sy) * dy; - sy = clip->min_y; + sourcey += (clip.min_y - sy) * dy; + sy = clip.min_y; } - else if (sy > clip->max_y) + else if (sy > clip.max_y) return; /* bottom edge clip */ - if (ey > clip->max_y) - ey = clip->max_y; - else if (ey < clip->min_y) + if (ey > clip.max_y) + ey = clip.max_y; + else if (ey < clip.min_y) return; /* loop top to bottom */ for (y = sy; y <= ey; y++, sourcey += dy) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, ex); + UINT16 *dest = &bitmap.pix16(y, ex); int j, sourcex = dx / 2, rle_end = 0; const UINT16 *base; int entry_count; @@ -1295,7 +1295,7 @@ /* clipped case */ else { - const UINT16 *start = BITMAP_ADDR16(bitmap, y, sx); + const UINT16 *start = &bitmap.pix16(y, sx); int to_be_skipped = pixels_to_skip; /* decode the pixels */ diff -Nru mame-0.144/src/mame/video/atarirle.h mame-0.145/src/mame/video/atarirle.h --- mame-0.144/src/mame/video/atarirle.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/atarirle.h 2012-02-06 21:30:33.000000000 +0000 @@ -88,6 +88,6 @@ /* render helpers */ void atarirle_eof(device_t *device); -bitmap_t *atarirle_get_vram(device_t *device, int idx); +bitmap_ind16 *atarirle_get_vram(device_t *device, int idx); #endif diff -Nru mame-0.144/src/mame/video/atarisy1.c mame-0.145/src/mame/video/atarisy1.c --- mame-0.144/src/mame/video/atarisy1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atarisy1.c 2012-02-06 21:30:33.000000000 +0000 @@ -178,7 +178,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* modify the motion object code lookup */ codelookup = atarimo_get_code_lookup(0, &size); @@ -242,7 +242,7 @@ if (diff & 0x0004) { state->m_playfield_tile_bank = (newselect >> 2) & 1; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } /* stash the new value */ @@ -290,7 +290,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* set the new scroll value */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrollx(0, newscroll); /* update the data */ *state->m_xscroll = newscroll; @@ -307,7 +307,7 @@ TIMER_DEVICE_CALLBACK( atarisy1_reset_yscroll_callback ) { atarisy1_state *state = timer.machine().driver_data(); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, param); + state->m_playfield_tilemap->set_scrolly(0, param); } @@ -328,7 +328,7 @@ adjusted_scroll = newscroll; if (scanline <= space->machine().primary_screen->visible_area().max_y) adjusted_scroll -= (scanline + 1); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, adjusted_scroll); + state->m_playfield_tilemap->set_scrolly(0, adjusted_scroll); /* but since we've adjusted it, we must reset it to the normal value once we hit scanline 0 again */ @@ -500,23 +500,23 @@ * *************************************/ -SCREEN_UPDATE( atarisy1 ) +SCREEN_UPDATE_IND16( atarisy1 ) { - atarisy1_state *state = screen->machine().driver_data(); + atarisy1_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -542,7 +542,7 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/atarisy2.c mame-0.145/src/mame/video/atarisy2.c --- mame-0.144/src/mame/video/atarisy2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/atarisy2.c 2012-02-06 21:30:33.000000000 +0000 @@ -44,7 +44,7 @@ int code = state->m_playfield_tile_bank[(data >> 10) & 1] + (data & 0x3ff); int color = (data >> 11) & 7; SET_TILE_INFO(0, code, color, 0); - tileinfo->category = (~data >> 14) & 3; + tileinfo.category = (~data >> 14) & 3; } @@ -107,7 +107,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,48); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* reset the statics */ state->m_yscroll_reset_timer = machine.scheduler().timer_alloc(FUNC(reset_yscroll_callback)); @@ -139,13 +139,13 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* update the playfield scrolling - hscroll is clocked on the following scanline */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll >> 6); + state->m_playfield_tilemap->set_scrollx(0, newscroll >> 6); /* update the playfield banking */ if (state->m_playfield_tile_bank[0] != (newscroll & 0x0f) * 0x400) { state->m_playfield_tile_bank[0] = (newscroll & 0x0f) * 0x400; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } /* update the data */ @@ -156,7 +156,7 @@ static TIMER_CALLBACK( reset_yscroll_callback ) { atarisy2_state *state = machine.driver_data(); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, param); + state->m_playfield_tilemap->set_scrolly(0, param); } @@ -173,7 +173,7 @@ /* if bit 4 is zero, the scroll value is clocked in right away */ if (!(newscroll & 0x10)) - tilemap_set_scrolly(state->m_playfield_tilemap, 0, (newscroll >> 6) - space->machine().primary_screen->vpos()); + state->m_playfield_tilemap->set_scrolly(0, (newscroll >> 6) - space->machine().primary_screen->vpos()); else state->m_yscroll_reset_timer->adjust(space->machine().primary_screen->time_until_pos(0), newscroll >> 6); @@ -181,7 +181,7 @@ if (state->m_playfield_tile_bank[1] != (newscroll & 0x0f) * 0x400) { state->m_playfield_tile_bank[1] = (newscroll & 0x0f) * 0x400; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } /* update the data */ @@ -283,7 +283,7 @@ if (offs < 0x0c00) { COMBINE_DATA(&state->m_alpha[offs]); - tilemap_mark_tile_dirty(state->m_alpha_tilemap, offs); + state->m_alpha_tilemap->mark_tile_dirty(offs); } /* spriteram? */ @@ -300,7 +300,7 @@ { offs -= 0x2000; COMBINE_DATA(&state->m_playfield[offs]); - tilemap_mark_tile_dirty(state->m_playfield_tilemap, offs); + state->m_playfield_tilemap->mark_tile_dirty(offs); } /* generic case */ @@ -318,29 +318,29 @@ * *************************************/ -SCREEN_UPDATE( atarisy2 ) +SCREEN_UPDATE_IND16( atarisy2 ) { - atarisy2_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + atarisy2_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 1, 1); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 2, 2); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 3, 3); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 1, 1); + state->m_playfield_tilemap->draw(bitmap, cliprect, 2, 2); + state->m_playfield_tilemap->draw(bitmap, cliprect, 3, 3); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; - UINT8 *pri = (UINT8 *)priority_bitmap->base + priority_bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x] != 0x0f) { @@ -364,6 +364,6 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/atetris.c mame-0.145/src/mame/video/atetris.c --- mame-0.144/src/mame/video/atetris.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/atetris.c 2012-02-06 21:30:31.000000000 +0000 @@ -38,7 +38,7 @@ UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -64,10 +64,10 @@ * *************************************/ -SCREEN_UPDATE( atetris ) +SCREEN_UPDATE_IND16( atetris ) { - atetris_state *state = screen->machine().driver_data(); + atetris_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/badlands.c mame-0.145/src/mame/video/badlands.c --- mame-0.144/src/mame/video/badlands.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/badlands.c 2012-02-06 21:30:31.000000000 +0000 @@ -99,7 +99,7 @@ { space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); state->m_playfield_tile_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } } @@ -111,23 +111,23 @@ * *************************************/ -SCREEN_UPDATE( badlands ) +SCREEN_UPDATE_IND16( badlands ) { - badlands_state *state = screen->machine().driver_data(); + badlands_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/bagman.c mame-0.145/src/mame/video/bagman.c --- mame-0.144/src/mame/video/bagman.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bagman.c 2012-02-06 21:30:32.000000000 +0000 @@ -15,14 +15,14 @@ { bagman_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bagman_colorram_w ) { bagman_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /*************************************************************************** @@ -87,7 +87,7 @@ if ((flip_screen_get(space->machine()) ^ data) & 1) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -107,11 +107,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scrolldy(state->m_bg_tilemap, -1, -1); + state->m_bg_tilemap->set_scrolldy(-1, -1); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { bagman_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -127,12 +127,12 @@ flipy = spriteram[offs] & 0x80; if (flip_screen_x_get(machine)) { - sx = bitmap->width - sx - 15; + sx = bitmap.width() - sx - 15; flipx = !flipx; } if (flip_screen_y_get(machine)) { - sy = bitmap->height - sy - 15; + sy = bitmap.height() - sy - 15; flipy = !flipy; } @@ -146,14 +146,14 @@ } } -SCREEN_UPDATE( bagman ) +SCREEN_UPDATE_IND16( bagman ) { - bagman_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,0); + bagman_state *state = screen.machine().driver_data(); + bitmap.fill(0, cliprect); if (*state->m_video_enable == 0) return 0; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/balsente.c mame-0.145/src/mame/video/balsente.c --- mame-0.144/src/mame/video/balsente.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/balsente.c 2012-02-06 21:30:33.000000000 +0000 @@ -126,7 +126,7 @@ * *************************************/ -static void draw_one_sprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *sprite) +static void draw_one_sprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *sprite) { balsente_state *state = machine.driver_data(); int flags = sprite[0]; @@ -143,7 +143,7 @@ /* loop over y */ for (y = 0; y < 16; y++, ypos = (ypos + 1) & 255) { - if (ypos >= (16 + BALSENTE_VBEND) && ypos >= cliprect->min_y && ypos <= cliprect->max_y) + if (ypos >= (16 + BALSENTE_VBEND) && ypos >= cliprect.min_y && ypos <= cliprect.max_y) { const pen_t *pens = &machine.pens[state->m_palettebank_vis * 256]; UINT8 *old = &state->m_expanded_videoram[(ypos - BALSENTE_VBEND) * 256 + xpos]; @@ -161,12 +161,12 @@ /* left pixel, combine with the background */ if (left && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx) = pens[left | old[0]]; + bitmap.pix16(ypos, currx) = pens[left | old[0]]; currx++; /* right pixel, combine with the background */ if (right && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx) = pens[right | old[1]]; + bitmap.pix16(ypos, currx) = pens[right | old[1]]; currx++; } } @@ -185,12 +185,12 @@ /* left pixel, combine with the background */ if (left && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx) = pens[left | old[0]]; + bitmap.pix16(ypos, currx) = pens[left | old[0]]; currx++; /* right pixel, combine with the background */ if (right && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx) = pens[right | old[1]]; + bitmap.pix16(ypos, currx) = pens[right | old[1]]; currx++; } src += 4; @@ -210,19 +210,19 @@ * *************************************/ -SCREEN_UPDATE( balsente ) +SCREEN_UPDATE_IND16( balsente ) { - balsente_state *state = screen->machine().driver_data(); - const pen_t *pens = &screen->machine().pens[state->m_palettebank_vis * 256]; + balsente_state *state = screen.machine().driver_data(); + const pen_t *pens = &screen.machine().pens[state->m_palettebank_vis * 256]; int y, i; /* draw scanlines from the VRAM directly */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) draw_scanline8(bitmap, 0, y, 256, &state->m_expanded_videoram[(y - BALSENTE_VBEND) * 256], pens); /* draw the sprite images */ for (i = 0; i < 40; i++) - draw_one_sprite(screen->machine(), bitmap, cliprect, &state->m_spriteram[(0xe0 + i * 4) & 0xff]); + draw_one_sprite(screen.machine(), bitmap, cliprect, &state->m_spriteram[(0xe0 + i * 4) & 0xff]); return 0; } diff -Nru mame-0.144/src/mame/video/bankp.c mame-0.145/src/mame/video/bankp.c --- mame-0.144/src/mame/video/bankp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bankp.c 2012-02-06 21:30:32.000000000 +0000 @@ -92,7 +92,7 @@ bankp_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bankp_colorram_w ) @@ -100,7 +100,7 @@ bankp_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bankp_videoram2_w ) @@ -108,7 +108,7 @@ bankp_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bankp_colorram2_w ) @@ -116,7 +116,7 @@ bankp_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bankp_out_w ) @@ -129,7 +129,7 @@ /* bits 2-3 unknown (2 is used) */ /* bit 4 controls NMI */ - interrupt_enable_w(space, 0, (data & 0x10) >> 4); + state->m_nmi_mask = (data & 0x10) >> 4; /* bit 5 controls screen flip */ flip_screen_set(space->machine(), data & 0x20); @@ -145,7 +145,7 @@ int flags = (state->m_colorram2[tile_index] & 0x08) ? TILE_FLIPX : 0; SET_TILE_INFO(1, code, color, flags); - tileinfo->group = color; + tileinfo.group = color; } static TILE_GET_INFO( get_fg_tile_info ) @@ -156,7 +156,7 @@ int flags = (state->m_colorram[tile_index] & 0x04) ? TILE_FLIPX : 0; SET_TILE_INFO(0, code, color, flags); - tileinfo->group = color; + tileinfo.group = color; } VIDEO_START( bankp ) @@ -173,19 +173,19 @@ state->save_item(NAME(state->m_priority)); } -SCREEN_UPDATE( bankp ) +SCREEN_UPDATE_IND16( bankp ) { - bankp_state *state = screen->machine().driver_data(); + bankp_state *state = screen.machine().driver_data(); - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { - tilemap_set_scrollx(state->m_fg_tilemap, 0, -state->m_scroll_x); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrollx(0, -state->m_scroll_x); + state->m_bg_tilemap->set_scrollx(0, 0); } else { - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll_x); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll_x); + state->m_bg_tilemap->set_scrollx(0, 0); } @@ -193,20 +193,20 @@ switch (state->m_priority) { case 0: // combat hawk uses this - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); break; case 1: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); break; case 2: - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); break; case 3: - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); // just a guess - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); // just a guess + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); break; } return 0; diff -Nru mame-0.144/src/mame/video/baraduke.c mame-0.145/src/mame/video/baraduke.c --- mame-0.144/src/mame/video/baraduke.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/baraduke.c 2012-02-06 21:30:33.000000000 +0000 @@ -122,12 +122,12 @@ state->m_bg_tilemap[0] = tilemap_create(machine, get_tile_info0,tilemap_scan_rows,8,8,64,32); state->m_bg_tilemap[1] = tilemap_create(machine, get_tile_info1,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,3); - tilemap_set_transparent_pen(state->m_bg_tilemap[0],7); - tilemap_set_transparent_pen(state->m_bg_tilemap[1],7); + state->m_tx_tilemap->set_transparent_pen(3); + state->m_bg_tilemap[0]->set_transparent_pen(7); + state->m_bg_tilemap[1]->set_transparent_pen(7); - tilemap_set_scrolldx(state->m_tx_tilemap,0,512-288); - tilemap_set_scrolldy(state->m_tx_tilemap,16,16); + state->m_tx_tilemap->set_scrolldx(0,512-288); + state->m_tx_tilemap->set_scrolldy(16,16); } @@ -148,7 +148,7 @@ { baraduke_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[offset/0x1000],(offset&0xfff)/2); + state->m_bg_tilemap[offset/0x1000]->mark_tile_dirty((offset&0xfff)/2); } READ8_HANDLER( baraduke_textram_r ) @@ -161,7 +161,7 @@ { baraduke_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -217,7 +217,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int sprite_priority) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_priority) { baraduke_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram + 0x1800; @@ -307,53 +307,57 @@ scrolly = -scrolly; } - tilemap_set_scrollx(state->m_bg_tilemap[layer], 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap[layer], 0, scrolly); + state->m_bg_tilemap[layer]->set_scrollx(0, scrollx); + state->m_bg_tilemap[layer]->set_scrolly(0, scrolly); } -SCREEN_UPDATE( baraduke ) +SCREEN_UPDATE_IND16( baraduke ) { - baraduke_state *state = screen->machine().driver_data(); + baraduke_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram + 0x1800; int back; /* flip screen is embedded in the sprite control registers */ - /* can't use flip_screen_set(screen->machine(), ) because the visible area is asymmetrical */ - flip_screen_set_no_update(screen->machine(), spriteram[0x07f6] & 0x01); - tilemap_set_flip_all(screen->machine(),flip_screen_get(screen->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); - set_scroll(screen->machine(), 0); - set_scroll(screen->machine(), 1); + /* can't use flip_screen_set(screen.machine(), ) because the visible area is asymmetrical */ + flip_screen_set_no_update(screen.machine(), spriteram[0x07f6] & 0x01); + screen.machine().tilemap().set_flip_all(flip_screen_get(screen.machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + set_scroll(screen.machine(), 0); + set_scroll(screen.machine(), 1); if (((state->m_xscroll[0] & 0x0e00) >> 9) == 6) back = 1; else back = 0; - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap[back],TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap[back ^ 1],0,0); - draw_sprites(screen->machine(), bitmap,cliprect,1); + state->m_bg_tilemap[back]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect,0); + state->m_bg_tilemap[back ^ 1]->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,1); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_EOF( baraduke ) +SCREEN_VBLANK( baraduke ) { - baraduke_state *state = machine.driver_data(); - if (state->m_copy_sprites) + // rising edge + if (vblank_on) { - UINT8 *spriteram = state->m_spriteram + 0x1800; - int i,j; - - for (i = 0;i < 0x800;i += 16) + baraduke_state *state = screen.machine().driver_data(); + if (state->m_copy_sprites) { - for (j = 10;j < 16;j++) - spriteram[i+j] = spriteram[i+j - 6]; - } + UINT8 *spriteram = state->m_spriteram + 0x1800; + int i,j; - state->m_copy_sprites = 0; + for (i = 0;i < 0x800;i += 16) + { + for (j = 10;j < 16;j++) + spriteram[i+j] = spriteram[i+j - 6]; + } + + state->m_copy_sprites = 0; + } } } diff -Nru mame-0.144/src/mame/video/batman.c mame-0.145/src/mame/video/batman.c --- mame-0.144/src/mame/video/batman.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/batman.c 2012-02-06 21:30:33.000000000 +0000 @@ -35,7 +35,7 @@ int code = data1 & 0x7fff; int color = 0x10 + (data2 & 0x0f); SET_TILE_INFO(0, code, color, (data1 >> 15) & 1); - tileinfo->category = (data2 >> 4) & 3; + tileinfo.category = (data2 >> 4) & 3; } @@ -47,7 +47,7 @@ int code = data1 & 0x7fff; int color = data2 & 0x0f; SET_TILE_INFO(0, code, color, (data1 >> 15) & 1); - tileinfo->category = (data2 >> 4) & 3; + tileinfo.category = (data2 >> 4) & 3; } @@ -103,14 +103,14 @@ /* initialize the second playfield */ state->m_playfield2_tilemap = tilemap_create(machine, get_playfield2_tile_info, tilemap_scan_cols, 8,8, 64,64); - tilemap_set_transparent_pen(state->m_playfield2_tilemap, 0); + state->m_playfield2_tilemap->set_transparent_pen(0); /* initialize the motion objects */ atarimo_init(machine, 0, &modesc); /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); } @@ -149,8 +149,8 @@ screen.update_partial(scanline - 1); state->m_atarivc_state.pf1_xscroll_raw = (data >> 7) & 0x1ff; atarivc_update_pf_xscrolls(state); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, state->m_atarivc_state.pf0_xscroll); - tilemap_set_scrollx(state->m_playfield2_tilemap, 0, state->m_atarivc_state.pf1_xscroll); + state->m_playfield_tilemap->set_scrollx(0, state->m_atarivc_state.pf0_xscroll); + state->m_playfield2_tilemap->set_scrollx(0, state->m_atarivc_state.pf1_xscroll); break; case 11: @@ -158,7 +158,7 @@ screen.update_partial(scanline - 1); state->m_atarivc_state.pf0_xscroll_raw = (data >> 7) & 0x1ff; atarivc_update_pf_xscrolls(state); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, state->m_atarivc_state.pf0_xscroll); + state->m_playfield_tilemap->set_scrollx(0, state->m_atarivc_state.pf0_xscroll); break; case 13: @@ -172,14 +172,14 @@ if (scanline > 0) screen.update_partial(scanline - 1); state->m_atarivc_state.pf1_yscroll = (data >> 7) & 0x1ff; - tilemap_set_scrolly(state->m_playfield2_tilemap, 0, state->m_atarivc_state.pf1_yscroll); + state->m_playfield2_tilemap->set_scrolly(0, state->m_atarivc_state.pf1_yscroll); break; case 15: if (scanline > 0) screen.update_partial(scanline - 1); state->m_atarivc_state.pf0_yscroll = (data >> 7) & 0x1ff; - tilemap_set_scrolly(state->m_playfield_tilemap, 0, state->m_atarivc_state.pf0_yscroll); + state->m_playfield_tilemap->set_scrolly(0, state->m_atarivc_state.pf0_yscroll); break; } } @@ -194,33 +194,33 @@ * *************************************/ -SCREEN_UPDATE( batman ) +SCREEN_UPDATE_IND16( batman ) { - batman_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + batman_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0x00); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 1, 0x01); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 2, 0x02); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 3, 0x03); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 0, 0x80); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 1, 0x84); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 2, 0x88); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 3, 0x8c); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0x00); + state->m_playfield_tilemap->draw(bitmap, cliprect, 1, 0x01); + state->m_playfield_tilemap->draw(bitmap, cliprect, 2, 0x02); + state->m_playfield_tilemap->draw(bitmap, cliprect, 3, 0x03); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 0, 0x80); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 1, 0x84); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 2, 0x88); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 3, 0x8c); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; - UINT8 *pri = (UINT8 *)priority_bitmap->base + priority_bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -284,15 +284,15 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/battlane.c mame-0.145/src/mame/video/battlane.c --- mame-0.144/src/mame/video/battlane.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/battlane.c 2012-02-06 21:30:33.000000000 +0000 @@ -48,20 +48,20 @@ WRITE8_HANDLER( battlane_scrollx_w ) { battlane_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_video_ctrl & 0x01) << 8) + data); + state->m_bg_tilemap->set_scrollx(0, ((state->m_video_ctrl & 0x01) << 8) + data); } WRITE8_HANDLER( battlane_scrolly_w ) { battlane_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_cpu_control & 0x01) << 8) + data); + state->m_bg_tilemap->set_scrolly(0, ((state->m_cpu_control & 0x01) << 8) + data); } WRITE8_HANDLER( battlane_tileram_w ) { battlane_state *state = space->machine().driver_data(); state->m_tileram[offset] = data; - //tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + //state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( battlane_spriteram_w ) @@ -84,11 +84,11 @@ { if (data & 1 << i) { - *BITMAP_ADDR8(state->m_screen_bitmap, offset % 0x100, (offset / 0x100) * 8 + i) |= orval; + state->m_screen_bitmap.pix8(offset % 0x100, (offset / 0x100) * 8 + i) |= orval; } else { - *BITMAP_ADDR8(state->m_screen_bitmap, offset % 0x100, (offset / 0x100) * 8 + i) &= ~orval; + state->m_screen_bitmap.pix8(offset % 0x100, (offset / 0x100) * 8 + i) &= ~orval; } } } @@ -145,10 +145,10 @@ { battlane_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info_bg, battlane_tilemap_scan_rows_2x2, 16, 16, 32, 32); - state->m_screen_bitmap = auto_bitmap_alloc(machine, 32 * 8, 32 * 8, BITMAP_FORMAT_INDEXED8); + state->m_screen_bitmap.allocate(32 * 8, 32 * 8); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { battlane_state *state = machine.driver_data(); int offs, attr, code, color, sx, sy, flipx, flipy, dy; @@ -212,7 +212,7 @@ } } -static void draw_fg_bitmap( running_machine &machine, bitmap_t *bitmap ) +static void draw_fg_bitmap( running_machine &machine, bitmap_ind16 &bitmap ) { battlane_state *state = machine.driver_data(); int x, y, data; @@ -221,27 +221,27 @@ { for (x = 0; x < 32 * 8; x++) { - data = *BITMAP_ADDR8(state->m_screen_bitmap, y, x); + data = state->m_screen_bitmap.pix8(y, x); if (data) { if (flip_screen_get(machine)) - *BITMAP_ADDR16(bitmap, 255 - y, 255 - x) = data; + bitmap.pix16(255 - y, 255 - x) = data; else - *BITMAP_ADDR16(bitmap, y, x) = data; + bitmap.pix16(y, x) = data; } } } } -SCREEN_UPDATE( battlane ) +SCREEN_UPDATE_IND16( battlane ) { - battlane_state *state = screen->machine().driver_data(); + battlane_state *state = screen.machine().driver_data(); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); // HACK + state->m_bg_tilemap->mark_all_dirty(); // HACK - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_fg_bitmap(screen->machine(), bitmap); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_fg_bitmap(screen.machine(), bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/battlera.c mame-0.145/src/mame/video/battlera.c --- mame-0.144/src/mame/video/battlera.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/battlera.c 2012-02-06 21:30:33.000000000 +0000 @@ -8,7 +8,6 @@ *******************************************************************************/ #include "emu.h" -#include "deprecat.h" #include "cpu/h6280/h6280.h" #include "includes/battlera.h" @@ -24,8 +23,8 @@ memset(state->m_HuC6270_vram,0,0x20000); memset(state->m_vram_dirty,1,0x1000); - state->m_tile_bitmap=auto_bitmap_alloc(machine,512,512,machine.primary_screen->format()); - state->m_front_bitmap=auto_bitmap_alloc(machine,512,512,machine.primary_screen->format()); + state->m_tile_bitmap=auto_bitmap_ind16_alloc(machine,512,512); + state->m_front_bitmap=auto_bitmap_ind16_alloc(machine,512,512); state->m_vram_ptr=0; state->m_inc_value=1; @@ -242,7 +241,7 @@ /******************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *clip,int pri) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &clip,int pri) { battlera_state *state = machine.driver_data(); int offs,my,mx,code,code2,fx,fy,cgy=0,cgx,colour,i,yinc; @@ -307,15 +306,15 @@ /******************************************************************************/ -SCREEN_UPDATE( battlera ) +SCREEN_UPDATE_IND16( battlera ) { - battlera_state *state = screen->machine().driver_data(); + battlera_state *state = screen.machine().driver_data(); int offs,code,scrollx,scrolly,mx,my; /* if any tiles changed, redraw the VRAM */ - if (screen->machine().gfx[0]->dirtyseq != state->m_tile_dirtyseq) + if (screen.machine().gfx[0]->dirtyseq != state->m_tile_dirtyseq) { - state->m_tile_dirtyseq = screen->machine().gfx[0]->dirtyseq; + state->m_tile_dirtyseq = screen.machine().gfx[0]->dirtyseq; memset(state->m_vram_dirty, 1, 0x1000); } @@ -330,17 +329,17 @@ /* If this tile was changed OR tilemap was changed, redraw */ if (state->m_vram_dirty[offs/2]) { state->m_vram_dirty[offs/2]=0; - drawgfx_opaque(state->m_tile_bitmap,0,screen->machine().gfx[0], + drawgfx_opaque(*state->m_tile_bitmap,state->m_tile_bitmap->cliprect(),screen.machine().gfx[0], code, state->m_HuC6270_vram[offs] >> 4, 0,0, 8*mx,8*my); - drawgfx_opaque(state->m_front_bitmap,0,screen->machine().gfx[2], + drawgfx_opaque(*state->m_front_bitmap,state->m_tile_bitmap->cliprect(),screen.machine().gfx[2], 0, 0, /* fill the spot with pen 256 */ 0,0, 8*mx,8*my); - drawgfx_transmask(state->m_front_bitmap,0,screen->machine().gfx[0], + drawgfx_transmask(*state->m_front_bitmap,state->m_tile_bitmap->cliprect(),screen.machine().gfx[0], code, state->m_HuC6270_vram[offs] >> 4, 0,0, @@ -350,43 +349,43 @@ /* Render bitmap */ scrollx=-state->m_HuC6270_registers[7]; - scrolly=-state->m_HuC6270_registers[8]+cliprect->min_y-1; + scrolly=-state->m_HuC6270_registers[8]+cliprect.min_y-1; - copyscrollbitmap(bitmap,state->m_tile_bitmap,1,&scrollx,1,&scrolly,cliprect); + copyscrollbitmap(bitmap,*state->m_tile_bitmap,1,&scrollx,1,&scrolly,cliprect); /* Todo: Background enable (not used anyway) */ /* Render low priority sprites, if enabled */ - if (state->m_sb_enable) draw_sprites(screen->machine(),bitmap,cliprect,0); + if (state->m_sb_enable) draw_sprites(screen.machine(),bitmap,cliprect,0); /* Render background over sprites */ - copyscrollbitmap_trans(bitmap,state->m_front_bitmap,1,&scrollx,1,&scrolly,cliprect,256); + copyscrollbitmap_trans(bitmap,*state->m_front_bitmap,1,&scrollx,1,&scrolly,cliprect,256); /* Render high priority sprites, if enabled */ - if (state->m_sb_enable) draw_sprites(screen->machine(),bitmap,cliprect,1); + if (state->m_sb_enable) draw_sprites(screen.machine(),bitmap,cliprect,1); return 0; } /******************************************************************************/ -INTERRUPT_GEN( battlera_interrupt ) +TIMER_DEVICE_CALLBACK( battlera_irq ) { - battlera_state *state = device->machine().driver_data(); - state->m_current_scanline=255-cpu_getiloops(device); /* 8 lines clipped at top */ + battlera_state *state = timer.machine().driver_data(); + state->m_current_scanline = param; /* 8 lines clipped at top */ /* If raster interrupt occurs, refresh screen _up_ to this point */ if (state->m_rcr_enable && (state->m_current_scanline+56)==state->m_HuC6270_registers[6]) { - device->machine().primary_screen->update_partial(state->m_current_scanline); - device_set_input_line(device, 0, HOLD_LINE); /* RCR interrupt */ + timer.machine().primary_screen->update_partial(state->m_current_scanline); + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); /* RCR interrupt */ } /* Start of vblank */ else if (state->m_current_scanline==240) { state->m_bldwolf_vblank=1; - device->machine().primary_screen->update_partial(240); + timer.machine().primary_screen->update_partial(240); if (state->m_irq_enable) - device_set_input_line(device, 0, HOLD_LINE); /* VBL */ + device_set_input_line(state->m_maincpu, 0, HOLD_LINE); /* VBL */ } /* End of vblank */ diff -Nru mame-0.144/src/mame/video/battlex.c mame-0.145/src/mame/video/battlex.c --- mame-0.144/src/mame/video/battlex.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/battlex.c 2012-02-06 21:30:31.000000000 +0000 @@ -33,7 +33,7 @@ { battlex_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( battlex_flipscreen_w ) @@ -44,7 +44,7 @@ if (flip_screen_get(space->machine()) != (data >> 7)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -64,7 +64,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { battlex_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -95,13 +95,13 @@ } -SCREEN_UPDATE(battlex) +SCREEN_UPDATE_IND16(battlex) { - battlex_state *state = screen->machine().driver_data(); + battlex_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_lsb | (state->m_scroll_msb << 8)); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_lsb | (state->m_scroll_msb << 8)); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/battlnts.c mame-0.145/src/mame/video/battlnts.c --- mame-0.144/src/mame/video/battlnts.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/battlnts.c 2012-02-06 21:30:33.000000000 +0000 @@ -43,14 +43,14 @@ ***************************************************************************/ -SCREEN_UPDATE( battlnts ) +SCREEN_UPDATE_IND16( battlnts ) { - battlnts_state *state = screen->machine().driver_data(); + battlnts_state *state = screen.machine().driver_data(); k007342_tilemap_update(state->m_k007342); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE ,0); - k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen->machine().gfx[1]); + k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen.machine().gfx[1]); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, 1 | TILEMAP_DRAW_OPAQUE ,0); return 0; } diff -Nru mame-0.144/src/mame/video/bbusters.c mame-0.145/src/mame/video/bbusters.c --- mame-0.144/src/mame/video/bbusters.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bbusters.c 2012-02-06 21:30:31.000000000 +0000 @@ -56,7 +56,7 @@ bbusters_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( bbusters_pf1_w ) @@ -64,7 +64,7 @@ bbusters_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf1_data[offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap, offset); + state->m_pf1_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( bbusters_pf2_w ) @@ -72,7 +72,7 @@ bbusters_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf2_data[offset]); - tilemap_mark_tile_dirty(state->m_pf2_tilemap, offset); + state->m_pf2_tilemap->mark_tile_dirty(offset); } /******************************************************************************/ @@ -85,8 +85,8 @@ state->m_pf1_tilemap = tilemap_create(machine, get_pf1_tile_info, tilemap_scan_cols, 16, 16, 128, 32); state->m_pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, tilemap_scan_cols, 16, 16, 128, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 15); - tilemap_set_transparent_pen(state->m_fix_tilemap, 15); + state->m_pf1_tilemap->set_transparent_pen(15); + state->m_fix_tilemap->set_transparent_pen(15); } VIDEO_START( mechatt ) @@ -97,8 +97,8 @@ state->m_pf1_tilemap = tilemap_create(machine, get_pf1_tile_info, tilemap_scan_cols, 16, 16, 256, 32); state->m_pf2_tilemap = tilemap_create(machine, get_pf2_tile_info, tilemap_scan_cols, 16, 16, 256, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 15); - tilemap_set_transparent_pen(state->m_fix_tilemap, 15); + state->m_pf1_tilemap->set_transparent_pen(15); + state->m_fix_tilemap->set_transparent_pen(15); } /******************************************************************************/ @@ -156,7 +156,7 @@ return gfx_element_get_data(gfx, (sprite+code) % gfx->total_elements) + ((dy%16) * gfx->line_modulo); } -static void bbusters_draw_block(running_machine &machine, bitmap_t *dest,int x,int y,int size,int flipx,int flipy,UINT32 sprite,int color,int bank,int block) +static void bbusters_draw_block(running_machine &machine, bitmap_ind16 &dest,int x,int y,int size,int flipx,int flipy,UINT32 sprite,int color,int bank,int block) { bbusters_state *state = machine.driver_data(); gfx_element *gfx = machine.gfx[bank]; @@ -170,7 +170,7 @@ while (state->m_scale_line_count) { if (dy>=16 && dy<240) { - UINT16 *destline = BITMAP_ADDR16(dest, dy, 0); + UINT16 *destline = &dest.pix16(dy); UINT8 srcline=*state->m_scale_table_ptr; const UINT8 *srcptr=0; @@ -203,7 +203,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const UINT16 *source, int bank, int colval, int colmask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const UINT16 *source, int bank, int colval, int colmask) { bbusters_state *state = machine.driver_data(); const UINT8 *scale_table=machine.region("user1")->base(); @@ -279,36 +279,36 @@ /******************************************************************************/ -SCREEN_UPDATE( bbuster ) +SCREEN_UPDATE_IND16( bbuster ) { - bbusters_state *state = screen->machine().driver_data(); + bbusters_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_pf1_scroll_data[0]); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_pf1_scroll_data[1]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_pf2_scroll_data[0]); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_pf2_scroll_data[1]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - //draw_sprites(screen->machine(), bitmap, screen->machine().generic.buffered_spriteram2.u16, 2, 0x8, 0x8); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, screen->machine().generic.buffered_spriteram2.u16, 2, 0, 0); - draw_sprites(screen->machine(), bitmap, screen->machine().generic.buffered_spriteram.u16, 1, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_pf1_tilemap->set_scrollx(0, state->m_pf1_scroll_data[0]); + state->m_pf1_tilemap->set_scrolly(0, state->m_pf1_scroll_data[1]); + state->m_pf2_tilemap->set_scrollx(0, state->m_pf2_scroll_data[0]); + state->m_pf2_tilemap->set_scrolly(0, state->m_pf2_scroll_data[1]); + + state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); + //draw_sprites(screen.machine(), bitmap, screen.machine().generic.buffered_spriteram2.u16, 2, 0x8, 0x8); + state->m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, screen.machine().generic.buffered_spriteram2.u16, 2, 0, 0); + draw_sprites(screen.machine(), bitmap, screen.machine().generic.buffered_spriteram.u16, 1, 0, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( mechatt ) +SCREEN_UPDATE_IND16( mechatt ) { - bbusters_state *state = screen->machine().driver_data(); + bbusters_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_pf1_scroll_data[0]); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_pf1_scroll_data[1]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_pf2_scroll_data[0]); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_pf2_scroll_data[1]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, screen->machine().generic.buffered_spriteram.u16, 1, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_pf1_tilemap->set_scrollx(0, state->m_pf1_scroll_data[0]); + state->m_pf1_tilemap->set_scrolly(0, state->m_pf1_scroll_data[1]); + state->m_pf2_tilemap->set_scrollx(0, state->m_pf2_scroll_data[0]); + state->m_pf2_tilemap->set_scrolly(0, state->m_pf2_scroll_data[1]); + + state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, screen.machine().generic.buffered_spriteram.u16, 1, 0, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/beathead.c mame-0.145/src/mame/video/beathead.c --- mame-0.144/src/mame/video/beathead.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/beathead.c 2012-02-06 21:30:32.000000000 +0000 @@ -154,7 +154,7 @@ * *************************************/ -bool beathead_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) +UINT32 beathead_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 *videoram = reinterpret_cast(m_videoram); int x, y; @@ -182,7 +182,7 @@ } /* then draw it */ - draw_scanline16(&bitmap, cliprect.min_x, y, cliprect.max_x - cliprect.min_x + 1, &scanline[cliprect.min_x], NULL); + draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &scanline[cliprect.min_x], NULL); } return 0; } diff -Nru mame-0.144/src/mame/video/beezer.c mame-0.145/src/mame/video/beezer.c --- mame-0.144/src/mame/video/beezer.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/beezer.c 2012-02-06 21:30:31.000000000 +0000 @@ -4,30 +4,32 @@ #include "includes/beezer.h" -INTERRUPT_GEN( beezer_interrupt ) +TIMER_DEVICE_CALLBACK( beezer_interrupt ) { - beezer_state *state = device->machine().driver_data(); - via6522_device *via_0 = device->machine().device("via6522_0"); - - state->m_scanline = (state->m_scanline + 1) % 0x80; - via_0->write_ca2((state->m_scanline & 0x10) ? 1 : 0); - if ((state->m_scanline & 0x78) == 0x78) - device_set_input_line(device, M6809_FIRQ_LINE, ASSERT_LINE); + int scanline = param; +// beezer_state *state = timer.machine().driver_data(); + via6522_device *via_0 = timer.machine().device("via6522_0"); + + via_0->write_ca2((scanline & 0x20) ? 1 : 0); + #if 0 + if (scanline == 240) // actually unused by the game! (points to a tight loop) + device_set_input_line(state->m_maincpu, M6809_FIRQ_LINE, ASSERT_LINE); else - device_set_input_line(device, M6809_FIRQ_LINE, CLEAR_LINE); + device_set_input_line(state->m_maincpu, M6809_FIRQ_LINE, CLEAR_LINE); + #endif } -SCREEN_UPDATE( beezer ) +SCREEN_UPDATE_IND16( beezer ) { - beezer_state *state = screen->machine().driver_data(); + beezer_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int x,y; - for (y = cliprect->min_y; y <= cliprect->max_y; y+=2) - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (x = cliprect.min_x; x <= cliprect.max_x; x+=2) { - *BITMAP_ADDR16(bitmap, y+1, x) = videoram[0x80*y+x] & 0x0f; - *BITMAP_ADDR16(bitmap, y, x) = videoram[0x80*y+x] >> 4; + bitmap.pix16(y, x+1) = videoram[0x80*x+y] & 0x0f; + bitmap.pix16(y, x+0) = videoram[0x80*x+y] >> 4; } return 0; @@ -68,7 +70,7 @@ READ8_HANDLER( beezer_line_r ) { - beezer_state *state = space->machine().driver_data(); - return (state->m_scanline & 0xfe) << 1; + return space->machine().primary_screen->vpos(); +// Note: was (state->m_scanline & 0xfe) << 1; with scanline % 128 } diff -Nru mame-0.144/src/mame/video/bfm_adr2.c mame-0.145/src/mame/video/bfm_adr2.c --- mame-0.144/src/mame/video/bfm_adr2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/bfm_adr2.c 2012-02-06 21:30:31.000000000 +0000 @@ -214,12 +214,12 @@ } // video update /////////////////////////////////////////////////////////// -static const rectangle visible1 = { 0, 400-1, 0, 280-1 }; //minx,maxx, miny,maxy - -SCREEN_UPDATE( adder2 ) +SCREEN_UPDATE_IND16( adder2 ) { - if (adder2_screen_page_reg & SL_DISPLAY) tilemap_draw(bitmap, &visible1, tilemap1, 0, 0); - else tilemap_draw(bitmap, &visible1, tilemap0, 0, 0); + const rectangle visible1(0, 400-1, 0, 280-1); //minx,maxx, miny,maxy + + if (adder2_screen_page_reg & SL_DISPLAY) tilemap1->draw(bitmap, visible1, 0, 0); + else tilemap0->draw(bitmap, visible1, 0, 0); return 0; } @@ -295,13 +295,13 @@ if ( adder2_screen_page_reg & SL_ACCESS ) { adder_screen_ram[1][offset] = data; - tilemap_mark_tile_dirty(tilemap1, dirty_off); + tilemap1->mark_tile_dirty(dirty_off); } else { adder_screen_ram[0][offset] = data; - tilemap_mark_tile_dirty(tilemap0, dirty_off); + tilemap0->mark_tile_dirty(dirty_off); } } diff -Nru mame-0.144/src/mame/video/bfm_adr2.h mame-0.145/src/mame/video/bfm_adr2.h --- mame-0.144/src/mame/video/bfm_adr2.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bfm_adr2.h 2012-02-06 21:30:31.000000000 +0000 @@ -15,7 +15,7 @@ VIDEO_START( adder2 ); VIDEO_RESET( adder2 ); -SCREEN_UPDATE( adder2 ); +SCREEN_UPDATE_IND16( adder2 ); PALETTE_INIT( adder2 ); #endif diff -Nru mame-0.144/src/mame/video/bigevglf.c mame-0.145/src/mame/video/bigevglf.c --- mame-0.144/src/mame/video/bigevglf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bigevglf.c 2012-02-06 21:30:32.000000000 +0000 @@ -45,7 +45,7 @@ state->m_vidram[o + 0x10000 * state->m_plane_selected] = data; y = o >>8; x = (o & 255); - *BITMAP_ADDR16(state->m_tmp_bitmap[state->m_plane_selected], y, x) = data; + state->m_tmp_bitmap[state->m_plane_selected].pix16(y, x) = data; } READ8_HANDLER( bigevglf_vidram_r ) @@ -58,21 +58,21 @@ { bigevglf_state *state = machine.driver_data(); - state->m_tmp_bitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmp_bitmap[1] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmp_bitmap[2] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmp_bitmap[3] = machine.primary_screen->alloc_compatible_bitmap(); - state->save_item(NAME(*state->m_tmp_bitmap[0])); - state->save_item(NAME(*state->m_tmp_bitmap[1])); - state->save_item(NAME(*state->m_tmp_bitmap[2])); - state->save_item(NAME(*state->m_tmp_bitmap[3])); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap[0]); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap[1]); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap[2]); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap[3]); + state->save_item(NAME(state->m_tmp_bitmap[0])); + state->save_item(NAME(state->m_tmp_bitmap[1])); + state->save_item(NAME(state->m_tmp_bitmap[2])); + state->save_item(NAME(state->m_tmp_bitmap[3])); state->m_vidram = auto_alloc_array(machine, UINT8, 0x100 * 0x100 * 4); state->save_pointer(NAME(state->m_vidram), 0x100 * 0x100 * 4); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { bigevglf_state *state = machine.driver_data(); int i, j; @@ -91,11 +91,11 @@ } } -SCREEN_UPDATE( bigevglf ) +SCREEN_UPDATE_IND16( bigevglf ) { - bigevglf_state *state = screen->machine().driver_data(); + bigevglf_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_tmp_bitmap[state->m_plane_visible], 0, 0, 0, 0, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/bigstrkb.c mame-0.145/src/mame/video/bigstrkb.c --- mame-0.144/src/mame/video/bigstrkb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bigstrkb.c 2012-02-06 21:30:32.000000000 +0000 @@ -6,7 +6,7 @@ /* Sprites */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /*- SPR RAM Format -** @@ -74,7 +74,7 @@ { bigstrkb_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bsb_tile2_info ) @@ -92,7 +92,7 @@ { bigstrkb_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap2,offset); + state->m_tilemap2->mark_tile_dirty(offset); } @@ -111,7 +111,7 @@ { bigstrkb_state *state = space->machine().driver_data(); state->m_videoram3[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap3,offset); + state->m_tilemap3->mark_tile_dirty(offset); } /* Video Start / Update */ @@ -123,28 +123,28 @@ state->m_tilemap2 = tilemap_create(machine, get_bsb_tile2_info,bsb_bg_scan, 16, 16,128,64); state->m_tilemap3 = tilemap_create(machine, get_bsb_tile3_info,bsb_bg_scan, 16, 16,128,64); - tilemap_set_transparent_pen(state->m_tilemap,15); - //tilemap_set_transparent_pen(state->m_tilemap2,15); - tilemap_set_transparent_pen(state->m_tilemap3,15); + state->m_tilemap->set_transparent_pen(15); + //state->m_tilemap2->set_transparent_pen(15); + state->m_tilemap3->set_transparent_pen(15); } -SCREEN_UPDATE(bigstrkb) +SCREEN_UPDATE_IND16(bigstrkb) { - bigstrkb_state *state = screen->machine().driver_data(); + bigstrkb_state *state = screen.machine().driver_data(); -// bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); +// bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_set_scrollx(state->m_tilemap2,0, state->m_vidreg1[0]+(256-14)); - tilemap_set_scrolly(state->m_tilemap2,0, state->m_vidreg2[0]); + state->m_tilemap2->set_scrollx(0, state->m_vidreg1[0]+(256-14)); + state->m_tilemap2->set_scrolly(0, state->m_vidreg2[0]); - tilemap_set_scrollx(state->m_tilemap3,0, state->m_vidreg1[1]+(256-14)); - tilemap_set_scrolly(state->m_tilemap3,0, state->m_vidreg2[1]); + state->m_tilemap3->set_scrollx(0, state->m_vidreg1[1]+(256-14)); + state->m_tilemap3->set_scrolly(0, state->m_vidreg2[1]); - tilemap_draw(bitmap,cliprect,state->m_tilemap2,0,0); - tilemap_draw(bitmap,cliprect,state->m_tilemap3,0,0); + state->m_tilemap2->draw(bitmap, cliprect, 0,0); + state->m_tilemap3->draw(bitmap, cliprect, 0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tilemap->draw(bitmap, cliprect, 0,0); // popmessage ("Regs %08x %08x %08x %08x",bsb_vidreg2[0],bsb_vidreg2[1],bsb_vidreg2[2],bsb_vidreg2[3]); return 0; diff -Nru mame-0.144/src/mame/video/bionicc.c mame-0.145/src/mame/video/bionicc.c --- mame-0.144/src/mame/video/bionicc.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bionicc.c 2012-02-06 21:30:31.000000000 +0000 @@ -54,14 +54,14 @@ if ((attr & 0xc0) == 0xc0) { - tileinfo->category = 1; - tileinfo->group = 0; + tileinfo.category = 1; + tileinfo.group = 0; flags = 0; } else { - tileinfo->category = 0; - tileinfo->group = (attr & 0x20) >> 5; + tileinfo.category = 0; + tileinfo.group = (attr & 0x20) >> 5; flags = TILE_FLIPXY((attr & 0xc0) >> 6); } @@ -100,10 +100,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); - tilemap_set_transmask(state->m_fg_tilemap, 0, 0xffff, 0x8000); /* split type 0 is completely transparent in front half */ - tilemap_set_transmask(state->m_fg_tilemap, 1, 0xffc1, 0x803e); /* split type 1 has pens 1-5 opaque in front half */ - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(3); + state->m_fg_tilemap->set_transmask(0, 0xffff, 0x8000); /* split type 0 is completely transparent in front half */ + state->m_fg_tilemap->set_transmask(1, 0xffc1, 0x803e); /* split type 1 has pens 1-5 opaque in front half */ + state->m_bg_tilemap->set_transparent_pen(15); } @@ -119,7 +119,7 @@ bionicc_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( bionicc_fgvideoram_w ) @@ -127,7 +127,7 @@ bionicc_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( bionicc_txvideoram_w ) @@ -135,7 +135,7 @@ bionicc_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txvideoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE16_HANDLER( bionicc_paletteram_w ) @@ -169,16 +169,16 @@ switch (offset) { case 0: - tilemap_set_scrollx(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrollx(0, data); break; case 1: - tilemap_set_scrolly(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrolly(0, data); break; case 2: - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); break; case 3: - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); break; } } @@ -191,8 +191,8 @@ { flip_screen_set(space->machine(), data & 0x0100); - tilemap_set_enable(state->m_bg_tilemap, data & 0x2000); /* guess */ - tilemap_set_enable(state->m_fg_tilemap, data & 0x1000); /* guess */ + state->m_bg_tilemap->enable(data & 0x2000); /* guess */ + state->m_fg_tilemap->enable(data & 0x1000); /* guess */ coin_counter_w(space->machine(), 0, data & 0x8000); coin_counter_w(space->machine(), 1, data & 0x4000); @@ -207,7 +207,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT16 *buffered_spriteram = machine.generic.buffered_spriteram.u16; // bionicc_state *state = machine.driver_data(); @@ -246,23 +246,27 @@ } } -SCREEN_UPDATE( bionicc ) +SCREEN_UPDATE_IND16( bionicc ) { - bionicc_state *state = screen->machine().driver_data(); + bionicc_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1 | TILEMAP_DRAW_LAYER1, 0); /* nothing in FRONT */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0 | TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 0); /* nothing in FRONT */ + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( bionicc ) +SCREEN_VBLANK( bionicc ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/bishi.c mame-0.145/src/mame/video/bishi.c --- mame-0.144/src/mame/video/bishi.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bishi.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,9 +44,9 @@ state->m_layer_colorbase[3] = 0xc0; } -SCREEN_UPDATE(bishi) +SCREEN_UPDATE_RGB32(bishi) { - bishi_state *state = screen->machine().driver_data(); + bishi_state *state = screen.machine().driver_data(); int layers[4], layerpri[4], i;/*, old;*/ /* int bg_colorbase, new_colorbase, plane, dirty; */ static const int pris[4] = { K55_PRIINP_0, K55_PRIINP_3, K55_PRIINP_6, K55_PRIINP_7 }; @@ -63,7 +63,7 @@ konami_sortlayers4(layers, layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); for (i = 0; i < 4; i++) { diff -Nru mame-0.144/src/mame/video/bking.c mame-0.145/src/mame/video/bking.c --- mame-0.144/src/mame/video/bking.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bking.c 2012-02-06 21:30:33.000000000 +0000 @@ -133,7 +133,7 @@ flip_screen_set_no_update(space->machine(), data & 0x04); - tilemap_set_flip_all(space->machine(), flip_screen_get(space->machine()) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + space->machine().tilemap().set_flip_all(flip_screen_get(space->machine()) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); state->m_controller = data & 0x02; @@ -167,7 +167,7 @@ if (state->m_palette_bank != ((data >> 1) & 0x03)) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_palette_bank = (data >> 1) & 0x03; @@ -199,7 +199,7 @@ { bking_state *state = space->machine().driver_data(); state->m_playfield_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -241,35 +241,35 @@ { bking_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - state->m_tmp_bitmap1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmp_bitmap2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap1); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap2); - state->save_item(NAME(*state->m_tmp_bitmap1)); - state->save_item(NAME(*state->m_tmp_bitmap2)); + state->save_item(NAME(state->m_tmp_bitmap1)); + state->save_item(NAME(state->m_tmp_bitmap2)); } -SCREEN_UPDATE( bking ) +SCREEN_UPDATE_IND16( bking ) { - bking_state *state = screen->machine().driver_data(); + bking_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the balls */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[2], state->m_ball1_pic, state->m_palette_bank, 0, 0, state->m_xld1, state->m_yld1, 0); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[3], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[3], state->m_ball2_pic, state->m_palette_bank, 0, 0, state->m_xld2, state->m_yld2, 0); /* draw the crow */ - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_crow_pic, state->m_palette_bank, state->m_crow_flip, state->m_crow_flip, @@ -278,80 +278,84 @@ } -SCREEN_EOF( bking ) +SCREEN_VBLANK( bking ) { - bking_state *state = machine.driver_data(); - static const rectangle rect = { 0, 7, 0, 15 }; - - int xld = 0; - int yld = 0; - - UINT32 latch = 0; - - if (state->m_pc3259_mask == 6) /* player 1 */ + // rising edge + if (vblank_on) { - xld = state->m_xld1; - yld = state->m_yld1; + bking_state *state = screen.machine().driver_data(); + const rectangle rect(0, 7, 0, 15); - drawgfx_opaque(state->m_tmp_bitmap2, &rect, machine.gfx[2], - state->m_ball1_pic, - 0, - 0, 0, - 0, 0); + int xld = 0; + int yld = 0; - latch = 0x0c00; - } + UINT32 latch = 0; - if (state->m_pc3259_mask == 3) /* player 2 */ - { - xld = state->m_xld2; - yld = state->m_yld2; + if (state->m_pc3259_mask == 6) /* player 1 */ + { + xld = state->m_xld1; + yld = state->m_yld1; - drawgfx_opaque(state->m_tmp_bitmap2, &rect, machine.gfx[3], - state->m_ball2_pic, - 0, - 0, 0, - 0, 0); + drawgfx_opaque(state->m_tmp_bitmap2, rect, screen.machine().gfx[2], + state->m_ball1_pic, + 0, + 0, 0, + 0, 0); - latch = 0x0400; - } + latch = 0x0c00; + } - tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(machine) ? -xld : xld); - tilemap_set_scrolly(state->m_bg_tilemap, 0, flip_screen_get(machine) ? -yld : yld); + if (state->m_pc3259_mask == 3) /* player 2 */ + { + xld = state->m_xld2; + yld = state->m_yld2; + + drawgfx_opaque(state->m_tmp_bitmap2, rect, screen.machine().gfx[3], + state->m_ball2_pic, + 0, + 0, 0, + 0, 0); - tilemap_draw(state->m_tmp_bitmap1, &rect, state->m_bg_tilemap, 0, 0); + latch = 0x0400; + } - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, flip_screen_get(screen.machine()) ? -xld : xld); + state->m_bg_tilemap->set_scrolly(0, flip_screen_get(screen.machine()) ? -yld : yld); - if (latch != 0) - { - const UINT8* MASK = machine.region("user1")->base() + 8 * state->m_hit; + state->m_bg_tilemap->draw(state->m_tmp_bitmap1, rect, 0, 0); - int x; - int y; + state->m_bg_tilemap->set_scrollx(0, 0); + state->m_bg_tilemap->set_scrolly(0, 0); - for (y = rect.min_y; y <= rect.max_y; y++) + if (latch != 0) { - const UINT16* p0 = BITMAP_ADDR16(state->m_tmp_bitmap1, y, 0); - const UINT16* p1 = BITMAP_ADDR16(state->m_tmp_bitmap2, y, 0); + const UINT8* MASK = screen.machine().region("user1")->base() + 8 * state->m_hit; - for (x = rect.min_x; x <= rect.max_x; x++) - { - if (MASK[p0[x] & 7] && p1[x]) - { - int col = (xld + x) / 8 + 1; - int row = (yld + y) / 8 + 0; + int x; + int y; - latch |= (flip_screen_get(machine) ? 31 - col : col) << 0; - latch |= (flip_screen_get(machine) ? 31 - row : row) << 5; + for (y = rect.min_y; y <= rect.max_y; y++) + { + const UINT16* p0 = &state->m_tmp_bitmap1.pix16(y); + const UINT16* p1 = &state->m_tmp_bitmap2.pix16(y); - state->m_pc3259_output[0] = (latch >> 0x0) & 0xf; - state->m_pc3259_output[1] = (latch >> 0x4) & 0xf; - state->m_pc3259_output[2] = (latch >> 0x8) & 0xf; - state->m_pc3259_output[3] = (latch >> 0xc) & 0xf; + for (x = rect.min_x; x <= rect.max_x; x++) + { + if (MASK[p0[x] & 7] && p1[x]) + { + int col = (xld + x) / 8 + 1; + int row = (yld + y) / 8 + 0; + + latch |= (flip_screen_get(screen.machine()) ? 31 - col : col) << 0; + latch |= (flip_screen_get(screen.machine()) ? 31 - row : row) << 5; + + state->m_pc3259_output[0] = (latch >> 0x0) & 0xf; + state->m_pc3259_output[1] = (latch >> 0x4) & 0xf; + state->m_pc3259_output[2] = (latch >> 0x8) & 0xf; + state->m_pc3259_output[3] = (latch >> 0xc) & 0xf; - return; + return; + } } } } diff -Nru mame-0.144/src/mame/video/bladestl.c mame-0.145/src/mame/video/bladestl.c --- mame-0.144/src/mame/video/bladestl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/bladestl.c 2012-02-06 21:30:31.000000000 +0000 @@ -76,15 +76,15 @@ ***************************************************************************/ -SCREEN_UPDATE( bladestl ) +SCREEN_UPDATE_IND16( bladestl ) { - bladestl_state *state = screen->machine().driver_data(); - set_pens(screen->machine()); + bladestl_state *state = screen.machine().driver_data(); + set_pens(screen.machine()); k007342_tilemap_update(state->m_k007342); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE ,0); - k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen->machine().gfx[1]); + k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen.machine().gfx[1]); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 1, 1 | TILEMAP_DRAW_OPAQUE ,0); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, 0 ,0); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, 1 ,0); diff -Nru mame-0.144/src/mame/video/blktiger.c mame-0.145/src/mame/video/blktiger.c --- mame-0.144/src/mame/video/blktiger.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/blktiger.c 2012-02-06 21:30:32.000000000 +0000 @@ -43,7 +43,7 @@ state->m_scroll_ram[2 * tile_index] + ((attr & 0x07) << 8), color, (attr & 0x80) ? TILE_FLIPX : 0); - tileinfo->group = split_table[color]; + tileinfo.group = split_table[color]; } static TILE_GET_INFO( get_tx_tile_info ) @@ -79,16 +79,16 @@ state->m_bg_tilemap8x4 = tilemap_create(machine, get_bg_tile_info, bg8x4_scan, 16, 16, 128, 64); state->m_bg_tilemap4x8 = tilemap_create(machine, get_bg_tile_info, bg4x8_scan, 16, 16, 64, 128); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); + state->m_tx_tilemap->set_transparent_pen(3); - tilemap_set_transmask(state->m_bg_tilemap8x4, 0, 0xffff, 0x8000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap8x4, 1, 0xfff0, 0x800f); /* split type 1 has pens 4-15 transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap8x4, 2, 0xff00, 0x80ff); /* split type 1 has pens 8-15 transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap8x4, 3, 0xf000, 0x8fff); /* split type 1 has pens 12-15 transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap4x8, 0, 0xffff, 0x8000); - tilemap_set_transmask(state->m_bg_tilemap4x8, 1, 0xfff0, 0x800f); - tilemap_set_transmask(state->m_bg_tilemap4x8, 2, 0xff00, 0x80ff); - tilemap_set_transmask(state->m_bg_tilemap4x8, 3, 0xf000, 0x8fff); + state->m_bg_tilemap8x4->set_transmask(0, 0xffff, 0x8000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap8x4->set_transmask(1, 0xfff0, 0x800f); /* split type 1 has pens 4-15 transparent in front half */ + state->m_bg_tilemap8x4->set_transmask(2, 0xff00, 0x80ff); /* split type 1 has pens 8-15 transparent in front half */ + state->m_bg_tilemap8x4->set_transmask(3, 0xf000, 0x8fff); /* split type 1 has pens 12-15 transparent in front half */ + state->m_bg_tilemap4x8->set_transmask(0, 0xffff, 0x8000); + state->m_bg_tilemap4x8->set_transmask(1, 0xfff0, 0x800f); + state->m_bg_tilemap4x8->set_transmask(2, 0xff00, 0x80ff); + state->m_bg_tilemap4x8->set_transmask(3, 0xf000, 0x8fff); state->save_pointer(NAME(state->m_scroll_ram), BGRAM_BANK_SIZE * BGRAM_BANKS); } @@ -105,7 +105,7 @@ { blktiger_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } READ8_HANDLER( blktiger_bgvideoram_r ) @@ -120,8 +120,8 @@ offset += state->m_scroll_bank; state->m_scroll_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap8x4, offset / 2); - tilemap_mark_tile_dirty(state->m_bg_tilemap4x8, offset / 2); + state->m_bg_tilemap8x4->mark_tile_dirty(offset / 2); + state->m_bg_tilemap4x8->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( blktiger_bgvideoram_bank_w ) @@ -138,8 +138,8 @@ state->m_scroll_y[offset] = data; scrolly = state->m_scroll_y[0] | (state->m_scroll_y[1] << 8); - tilemap_set_scrolly(state->m_bg_tilemap8x4, 0, scrolly); - tilemap_set_scrolly(state->m_bg_tilemap4x8, 0, scrolly); + state->m_bg_tilemap8x4->set_scrolly(0, scrolly); + state->m_bg_tilemap4x8->set_scrolly(0, scrolly); } WRITE8_HANDLER( blktiger_scrollx_w ) @@ -149,8 +149,8 @@ state->m_scroll_x[offset] = data; scrollx = state->m_scroll_x[0] | (state->m_scroll_x[1] << 8); - tilemap_set_scrollx(state->m_bg_tilemap8x4, 0, scrollx); - tilemap_set_scrollx(state->m_bg_tilemap4x8, 0, scrollx); + state->m_bg_tilemap8x4->set_scrollx(0, scrollx); + state->m_bg_tilemap4x8->set_scrollx(0, scrollx); } @@ -187,8 +187,8 @@ { blktiger_state *state = space->machine().driver_data(); state->m_screen_layout = data; - tilemap_set_enable(state->m_bg_tilemap8x4, state->m_screen_layout); - tilemap_set_enable(state->m_bg_tilemap4x8, !state->m_screen_layout); + state->m_bg_tilemap8x4->enable(state->m_screen_layout); + state->m_bg_tilemap4x8->enable(!state->m_screen_layout); } @@ -199,7 +199,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { // blktiger_state *state = machine.driver_data(); UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; @@ -230,30 +230,34 @@ } } -SCREEN_UPDATE( blktiger ) +SCREEN_UPDATE_IND16( blktiger ) { - blktiger_state *state = screen->machine().driver_data(); + blktiger_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 1023); + bitmap.fill(1023, cliprect); if (state->m_bgon) - tilemap_draw(bitmap, cliprect, state->m_screen_layout ? state->m_bg_tilemap8x4 : state->m_bg_tilemap4x8, TILEMAP_DRAW_LAYER1, 0); + (state->m_screen_layout ? state->m_bg_tilemap8x4 : state->m_bg_tilemap4x8)->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); if (state->m_objon) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (state->m_bgon) - tilemap_draw(bitmap, cliprect, state->m_screen_layout ? state->m_bg_tilemap8x4 : state->m_bg_tilemap4x8, TILEMAP_DRAW_LAYER0, 0); + (state->m_screen_layout ? state->m_bg_tilemap8x4 : state->m_bg_tilemap4x8)->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); if (state->m_chon) - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( blktiger ) +SCREEN_VBLANK( blktiger ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/blmbycar.c mame-0.145/src/mame/video/blmbycar.c --- mame-0.144/src/mame/video/blmbycar.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/blmbycar.c 2012-02-06 21:30:32.000000000 +0000 @@ -82,7 +82,7 @@ attr & 0x1f, TILE_FLIPYX((attr >> 6) & 3)); - tileinfo->category = (attr >> 5) & 1; + tileinfo.category = (attr >> 5) & 1; } static TILE_GET_INFO( get_tile_info_1 ) @@ -96,7 +96,7 @@ attr & 0x1f, TILE_FLIPYX((attr >> 6) & 3)); - tileinfo->category = (attr >> 5) & 1; + tileinfo.category = (attr >> 5) & 1; } @@ -104,14 +104,14 @@ { blmbycar_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0, offset / 2); + state->m_tilemap_0->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( blmbycar_vram_1_w ) { blmbycar_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1, offset / 2); + state->m_tilemap_1->mark_tile_dirty(offset / 2); } @@ -130,12 +130,12 @@ state->m_tilemap_0 = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 16, 16, DIM_NX, DIM_NY ); state->m_tilemap_1 = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 16, 16, DIM_NX, DIM_NY ); - tilemap_set_scroll_rows(state->m_tilemap_0, 1); - tilemap_set_scroll_cols(state->m_tilemap_0, 1); + state->m_tilemap_0->set_scroll_rows(1); + state->m_tilemap_0->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1, 1); - tilemap_set_scroll_cols(state->m_tilemap_1, 1); - tilemap_set_transparent_pen(state->m_tilemap_1, 0); + state->m_tilemap_1->set_scroll_rows(1); + state->m_tilemap_1->set_scroll_cols(1); + state->m_tilemap_1->set_transparent_pen(0); } @@ -165,7 +165,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { blmbycar_state *state = machine.driver_data(); UINT16 *source, *finish; @@ -219,44 +219,44 @@ ***************************************************************************/ -SCREEN_UPDATE( blmbycar ) +SCREEN_UPDATE_IND16( blmbycar ) { - blmbycar_state *state = screen->machine().driver_data(); + blmbycar_state *state = screen.machine().driver_data(); int i, layers_ctrl = -1; - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_scroll_0[0]); - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_scroll_0[1]); + state->m_tilemap_0->set_scrolly(0, state->m_scroll_0[0]); + state->m_tilemap_0->set_scrollx(0, state->m_scroll_0[1]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_scroll_1[0] + 1); - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_scroll_1[1] + 5); + state->m_tilemap_1->set_scrolly(0, state->m_scroll_1[0] + 1); + state->m_tilemap_1->set_scrollx(0, state->m_scroll_1[1] + 5); #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; -// if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; +// if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (layers_ctrl & 1) for (i = 0; i <= 1; i++) - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, i, i); + state->m_tilemap_0->draw(bitmap, cliprect, i, i); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (layers_ctrl & 2) for (i = 0; i <= 1; i++) - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, i, i); + state->m_tilemap_1->draw(bitmap, cliprect, i, i); if (layers_ctrl & 8) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/blockade.c mame-0.145/src/mame/video/blockade.c --- mame-0.144/src/mame/video/blockade.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/blockade.c 2012-02-06 21:30:32.000000000 +0000 @@ -5,7 +5,7 @@ { blockade_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); if (input_port_read(space->machine(), "IN3") & 0x80) { @@ -28,10 +28,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -SCREEN_UPDATE( blockade ) +SCREEN_UPDATE_IND16( blockade ) { - blockade_state *state = screen->machine().driver_data(); + blockade_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/blockhl.c mame-0.145/src/mame/video/blockhl.c --- mame-0.144/src/mame/video/blockhl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/blockhl.c 2012-02-06 21:30:33.000000000 +0000 @@ -55,11 +55,11 @@ state_save_register_global_pointer(machine, machine.generic.paletteram.u8, 0x800); } -SCREEN_UPDATE( blockhl ) +SCREEN_UPDATE_IND16( blockhl ) { - blockhl_state *state = screen->machine().driver_data(); + blockhl_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k052109_tilemap_update(state->m_k052109); diff -Nru mame-0.144/src/mame/video/blockout.c mame-0.145/src/mame/video/blockout.c --- mame-0.144/src/mame/video/blockout.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/blockout.c 2012-02-06 21:30:32.000000000 +0000 @@ -66,8 +66,8 @@ blockout_state *state = machine.driver_data(); /* Allocate temporary bitmaps */ - state->m_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->save_item(NAME(*state->m_tmpbitmap)); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); + state->save_item(NAME(state->m_tmpbitmap)); } static void update_pixels( running_machine &machine, int x, int y ) @@ -77,7 +77,7 @@ int color; const rectangle &visarea = machine.primary_screen->visible_area(); - if (x < visarea.min_x || x > visarea.max_x || y < visarea.min_y || y > visarea.max_y) + if (!visarea.contains(x, y)) return; front = state->m_videoram[y * 256 + x / 2]; @@ -88,14 +88,14 @@ else color = (back >> 8) + 256; - *BITMAP_ADDR16(state->m_tmpbitmap, y, x) = color; + state->m_tmpbitmap.pix16(y, x) = color; if (front & 0xff) color = front & 0xff; else color = (back & 0xff) + 256; - *BITMAP_ADDR16(state->m_tmpbitmap, y, x + 1) = color; + state->m_tmpbitmap.pix16(y, x + 1) = color; } @@ -110,9 +110,9 @@ -SCREEN_UPDATE( blockout ) +SCREEN_UPDATE_IND16( blockout ) { - blockout_state *state = screen->machine().driver_data(); + blockout_state *state = screen.machine().driver_data(); int x, y; pen_t color = 512; @@ -126,14 +126,14 @@ if (d) { - if (d & 0x80) *BITMAP_ADDR16(bitmap, y, x + 0) = color; - if (d & 0x40) *BITMAP_ADDR16(bitmap, y, x + 1) = color; - if (d & 0x20) *BITMAP_ADDR16(bitmap, y, x + 2) = color; - if (d & 0x10) *BITMAP_ADDR16(bitmap, y, x + 3) = color; - if (d & 0x08) *BITMAP_ADDR16(bitmap, y, x + 4) = color; - if (d & 0x04) *BITMAP_ADDR16(bitmap, y, x + 5) = color; - if (d & 0x02) *BITMAP_ADDR16(bitmap, y, x + 6) = color; - if (d & 0x01) *BITMAP_ADDR16(bitmap, y, x + 7) = color; + if (d & 0x80) bitmap.pix16(y, x + 0) = color; + if (d & 0x40) bitmap.pix16(y, x + 1) = color; + if (d & 0x20) bitmap.pix16(y, x + 2) = color; + if (d & 0x10) bitmap.pix16(y, x + 3) = color; + if (d & 0x08) bitmap.pix16(y, x + 4) = color; + if (d & 0x04) bitmap.pix16(y, x + 5) = color; + if (d & 0x02) bitmap.pix16(y, x + 6) = color; + if (d & 0x01) bitmap.pix16(y, x + 7) = color; } } } diff -Nru mame-0.144/src/mame/video/bloodbro.c mame-0.145/src/mame/video/bloodbro.c --- mame-0.144/src/mame/video/bloodbro.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bloodbro.c 2012-02-06 21:30:31.000000000 +0000 @@ -62,8 +62,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,16,16,32,16); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,15); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); } @@ -78,21 +78,21 @@ { bloodbro_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( bloodbro_fgvideoram_w ) { bloodbro_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( bloodbro_txvideoram_w ) { bloodbro_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txvideoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -145,7 +145,7 @@ -------X XXXXXXXX -------- YYYYYYYY */ -static void bloodbro_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void bloodbro_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { bloodbro_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -194,7 +194,7 @@ -------X XXXXXXXX */ -static void weststry_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void weststry_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { bloodbro_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -232,55 +232,55 @@ -SCREEN_UPDATE( bloodbro ) +SCREEN_UPDATE_IND16( bloodbro ) { - bloodbro_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll[0x10]); /* ? */ - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll[0x11]); /* ? */ - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll[0x12]); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll[0x13]); - - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,1); - bloodbro_draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + bloodbro_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll[0x10]); /* ? */ + state->m_bg_tilemap->set_scrolly(0,state->m_scroll[0x11]); /* ? */ + state->m_fg_tilemap->set_scrollx(0,state->m_scroll[0x12]); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll[0x13]); + + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,1); + bloodbro_draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( weststry ) +SCREEN_UPDATE_IND16( weststry ) { - bloodbro_state *state = screen->machine().driver_data(); -// tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll[0x10]); /* ? */ -// tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll[0x11]); /* ? */ -// tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll[0x12]); -// tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll[0x13]); - - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,1); - weststry_draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + bloodbro_state *state = screen.machine().driver_data(); +// state->m_bg_tilemap->set_scrollx(0,state->m_scroll[0x10]); /* ? */ +// state->m_bg_tilemap->set_scrolly(0,state->m_scroll[0x11]); /* ? */ +// state->m_fg_tilemap->set_scrollx(0,state->m_scroll[0x12]); +// state->m_fg_tilemap->set_scrolly(0,state->m_scroll[0x13]); + + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,1); + weststry_draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( skysmash ) +SCREEN_UPDATE_IND16( skysmash ) { - bloodbro_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll[0x08]); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll[0x09]); /* ? */ - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll[0x0a]); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll[0x0b]); /* ? */ - - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,1); - bloodbro_draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + bloodbro_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll[0x08]); + state->m_bg_tilemap->set_scrolly(0,state->m_scroll[0x09]); /* ? */ + state->m_fg_tilemap->set_scrollx(0,state->m_scroll[0x0a]); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll[0x0b]); /* ? */ + + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,1); + bloodbro_draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/blstroid.c mame-0.145/src/mame/video/blstroid.c --- mame-0.144/src/mame/video/blstroid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/blstroid.c 2012-02-06 21:30:32.000000000 +0000 @@ -144,23 +144,23 @@ * *************************************/ -SCREEN_UPDATE( blstroid ) +SCREEN_UPDATE_IND16( blstroid ) { - blstroid_state *state = screen->machine().driver_data(); + blstroid_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/blueprnt.c mame-0.145/src/mame/video/blueprnt.c --- mame-0.144/src/mame/video/blueprnt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/blueprnt.c 2012-02-06 21:30:32.000000000 +0000 @@ -51,7 +51,7 @@ blueprnt_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( blueprnt_colorram_w ) @@ -59,7 +59,7 @@ blueprnt_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( blueprnt_flipscreen_w ) @@ -71,7 +71,7 @@ if (state->m_gfx_bank != ((data & 0x04) >> 2)) { state->m_gfx_bank = ((data & 0x04) >> 2); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -82,7 +82,7 @@ int code = state->m_videoram[tile_index] + 256 * state->m_gfx_bank; int color = attr & 0x7f; - tileinfo->category = (attr & 0x80) ? 1 : 0; + tileinfo.category = (attr & 0x80) ? 1 : 0; SET_TILE_INFO(0, code, color, 0); } @@ -92,13 +92,13 @@ blueprnt_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); state->save_item(NAME(state->m_gfx_bank)); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { blueprnt_state *state = machine.driver_data(); int offs; @@ -124,21 +124,21 @@ } } -SCREEN_UPDATE( blueprnt ) +SCREEN_UPDATE_IND16( blueprnt ) { - blueprnt_state *state = screen->machine().driver_data(); + blueprnt_state *state = screen.machine().driver_data(); int i; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, state->m_scrollram[32 - i]); + state->m_bg_tilemap->set_scrolly(i, state->m_scrollram[32 - i]); else for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, state->m_scrollram[30 - i]); + state->m_bg_tilemap->set_scrolly(i, state->m_scrollram[30 - i]); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } diff -Nru mame-0.144/src/mame/video/bogeyman.c mame-0.145/src/mame/video/bogeyman.c --- mame-0.144/src/mame/video/bogeyman.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bogeyman.c 2012-02-06 21:30:31.000000000 +0000 @@ -40,7 +40,7 @@ bogeyman_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bogeyman_colorram_w ) @@ -48,7 +48,7 @@ bogeyman_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bogeyman_videoram2_w ) @@ -56,7 +56,7 @@ bogeyman_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bogeyman_colorram2_w ) @@ -64,7 +64,7 @@ bogeyman_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bogeyman_paletteram_w ) @@ -101,10 +101,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { bogeyman_state *state = machine.driver_data(); int offs; @@ -151,12 +151,12 @@ } } -SCREEN_UPDATE( bogeyman ) +SCREEN_UPDATE_IND16( bogeyman ) { - bogeyman_state *state = screen->machine().driver_data(); + bogeyman_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/bombjack.c mame-0.145/src/mame/video/bombjack.c --- mame-0.144/src/mame/video/bombjack.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bombjack.c 2012-02-06 21:30:31.000000000 +0000 @@ -13,14 +13,14 @@ { bombjack_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bombjack_colorram_w ) { bombjack_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( bombjack_background_w ) @@ -30,7 +30,7 @@ if (state->m_background_image != data) { state->m_background_image = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -39,7 +39,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -72,10 +72,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { bombjack_state *state = machine.driver_data(); int offs; @@ -133,11 +133,11 @@ } } -SCREEN_UPDATE( bombjack ) +SCREEN_UPDATE_IND16( bombjack ) { - bombjack_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + bombjack_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/boogwing.c mame-0.145/src/mame/video/boogwing.c --- mame-0.144/src/mame/video/boogwing.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/boogwing.c 2012-02-06 21:30:31.000000000 +0000 @@ -2,156 +2,198 @@ #include "includes/boogwing.h" #include "video/deco16ic.h" #include "video/decocomn.h" +#include "video/decospr.h" -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram_base, int gfx_region ) +VIDEO_START( boogwing ) +{ + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); +} + + +/* Mix the 2 sprite planes with the already rendered tilemaps.. + note, if we implement tilemap blending etc. too we'll probably have to mix those in here as well.. + + this is just a reimplementation of the old priority system used before conversion but to work with + the bitmaps. It could probably be simplified / improved greatly, along with the long-standing bugs + fixed, with manual mixing you have full control. + + apparently priority is based on a PROM, that should be used if possible. +*/ +static void mix_boogwing(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { boogwing_state *state = machine.driver_data(); - int offs; - int flipscreen = !flip_screen_get(machine); + int y, x; + const pen_t *paldata = machine.pens; + bitmap_ind16 *sprite_bitmap1, *sprite_bitmap2; + bitmap_ind8* priority_bitmap; + UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); - for (offs = 0x400 - 4; offs >= 0; offs -= 4) + sprite_bitmap1 = &machine.device("spritegen1")->get_sprite_temp_bitmap(); + sprite_bitmap2 = &machine.device("spritegen2")->get_sprite_temp_bitmap(); + priority_bitmap = &machine.priority_bitmap; + + UINT32* dstline; + UINT16 *srcline1, *srcline2; + UINT8 *srcpriline; + + for (y=cliprect.min_y;y<=cliprect.max_y;y++) { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult, pri = 0, spri = 0; - int alpha = 0xff; + srcline1=&sprite_bitmap1->pix16(y,0); + srcline2=&sprite_bitmap2->pix16(y,0); + srcpriline=&priority_bitmap->pix8(y,0); - sprite = spriteram_base[offs + 1]; - if (!sprite) - continue; - - y = spriteram_base[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = spriteram_base[offs + 2]; - colour = (x >> 9) & 0x1f; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ + dstline=&bitmap.pix32(y,0); - // Todo: This should be verified from the prom - if (gfx_region == 4) + for (x=cliprect.min_x;x<=cliprect.max_x;x++) { - // Sprite 2 priority vs sprite 1 - if ((spriteram_base[offs + 2] & 0xc000) == 0xc000) - spri = 4; - else if ((spriteram_base[offs + 2] & 0xc000)) - spri = 16; - else - spri = 64; + UINT16 pix1 = srcline1[x]; + UINT16 pix2 = srcline2[x]; - // Transparency - if (spriteram_base[offs + 2] & 0x2000) - alpha = 0x80; - - if (priority == 0x2) - { - // Additional sprite alpha in this mode - if (spriteram_base[offs + 2] & 0x8000) - alpha = 0x80; - - // Sprite vs playfield - if ((spriteram_base[offs + 2] & 0xc000) == 0xc000) - pri = 4; - else if ((spriteram_base[offs + 2] & 0xc000) == 0x8000) - pri = 16; - else - pri = 64; - } - else - { - if ((spriteram_base[offs + 2] & 0x8000) == 0x8000) - pri = 16; - else - pri = 64; - } - } - else - { - // Sprite 1 priority vs sprite 2 - if (spriteram_base[offs + 2] & 0x8000) // todo - check only in pri mode 2?? - spri = 8; + /* Here we have + pix1 - raw pixel / colour / priority data from first 1sdt chip + pix2 - raw pixel / colour / priority data from first 2nd chip + */ + + int pri1, pri2; + int spri1, spri2, alpha2; + alpha2 = 0xff; + + // pix1 sprite vs pix2 sprite + if (pix1 & 0x400) // todo - check only in pri mode 2?? + spri1 = 8; else - spri = 32; + spri1 = 32; - // Sprite vs playfield - if (priority == 0x1) + // pix1 sprite vs playfield + switch (priority) { - if ((spriteram_base[offs + 2] & 0xc000)) - pri = 16; - else - pri = 64; + case 0x01: + { + if ((pix1 & 0x600)) + pri1 = 16; + else + pri1 = 64; + } + break; + + default: + { + if ((pix1 & 0x600) == 0x600) + pri1 = 4; + else if ((pix1 & 0x600) == 0x400) + pri1 = 16; + else + pri1 = 64; + } + break; } + + // pix2 sprite vs pix1 sprite + if ((pix2 & 0x600) == 0x600) + spri2 = 4; + else if ((pix2 & 0x600)) + spri2 = 16; else + spri2 = 64; + + // Transparency + if (pix2 & 0x100) + alpha2 = 0x80; + + // pix2 sprite vs playfield + switch (priority) { - if ((spriteram_base[offs + 2] & 0xc000) == 0xc000) - pri = 4; - else if ((spriteram_base[offs + 2] & 0xc000) == 0x8000) - pri = 16; - else - pri = 64; + case 0x02: + { + // Additional sprite alpha in this mode + if (pix2 & 0x400) + alpha2 = 0x80; + + // Sprite vs playfield + if ((pix2 & 0x600) == 0x600) + pri2 = 4; + else if ((pix2 & 0x600) == 0x400) + pri2 = 16; + else + pri2 = 64; + } + break; + + default: + { + if ((pix2 & 0x400) == 0x400) + pri2 = 16; + else + pri2 = 64; + } + break; } - } - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - y = 240 - y; - x = 304 - x; - - sprite &= ~multi; - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } + UINT8 bgpri = srcpriline[x]; + /* once we get here we have - if (flipscreen) - { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else - mult = -16; + pri1 - 4/16/64 (sprite chip 1 pixel priority relative to bg) + pri2 - 4/16/64 (sprite chip 2 pixel priority relative to bg) + spri1 - 8/32 (priority of sprite chip 1 relative to other sprite chip) + spri2 - 4/16/64 (priority of sprite chip 2 relative to other sprite chip) + alpha2 - 0x80/0xff alpha level of sprite chip 2 pixels (0x80 if enabled, 0xff if not) + + bgpri - 0 / 8 / 32 (from drawing tilemaps earlier, to compare above pri1/pri2 priorities against) + pix1 - same as before (ready to extract just colour data from) + pix2 - same as before ^^ + */ - while (multi >= 0) - { - decocomn_pdrawgfx( - state->m_decocomn, - bitmap, cliprect, machine.gfx[gfx_region], - sprite - multi * inc, - colour, - fx,fy, - x,y + mult * multi, - 0, pri, spri, 0, alpha); + int drawnpixe1 = 0; + if (pix1 & 0xf) + { + if (pri1 > bgpri) + { + dstline[x] = paldata[(pix1&0x1ff)+0x500]; + drawnpixe1 = 1; + } + } - multi--; + if (pix2 & 0xf) + { + if (pri2 > bgpri) + { + if ((!drawnpixe1) || (spri2 > spri1)) + { + if (alpha2==0xff) + { + dstline[x] = paldata[(pix2&0xff)+0x700]; + } + else + { + UINT32 base = dstline[x]; + dstline[x] = alpha_blend_r32(base, paldata[(pix2&0xff)+0x700], alpha2); + } + } + } + } } } } -SCREEN_UPDATE( boogwing ) +SCREEN_UPDATE_RGB32( boogwing ) { - boogwing_state *state = screen->machine().driver_data(); + boogwing_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + /* Draw sprite planes to bitmaps for later mixing */ + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u16, 0x400, true); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, true); + + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - decocomn_clear_sprite_priority_bitmap(state->m_decocomn); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x400]); /* pen not confirmed */ - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(screen.machine().pens[0x400], cliprect); /* pen not confirmed */ + screen.machine().priority_bitmap.fill(0); // bit&0x8 is definitely some kind of palette effect // bit&0x4 combines playfields @@ -182,8 +224,7 @@ deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 32); } - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 3); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u16, 4); + mix_boogwing(screen.machine(), bitmap,cliprect); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; diff -Nru mame-0.144/src/mame/video/bosco.c mame-0.145/src/mame/video/bosco.c --- mame-0.144/src/mame/video/bosco.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bosco.c 2012-02-06 21:30:33.000000000 +0000 @@ -91,13 +91,13 @@ } -INLINE void get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int ram_offs) +INLINE void get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int ram_offs) { bosco_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[ram_offs + tile_index + 0x800]; - tileinfo->category = (attr & 0x20) >> 5; - tileinfo->group = attr & 0x3f; + tileinfo.category = (attr & 0x20) >> 5; + tileinfo.group = attr & 0x3f; SET_TILE_INFO( 0, state->m_videoram[ram_offs + tile_index], @@ -133,7 +133,7 @@ colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[0], 0x1f); colortable_configure_tilemap_groups(machine.colortable, state->m_fg_tilemap, machine.gfx[0], 0x1f); - tilemap_set_scrolldx(state->m_bg_tilemap,3,3); + state->m_bg_tilemap->set_scrolldx(3,3); machine.generic.spriteram_size = 0x0c; machine.generic.spriteram.u8 = state->m_videoram + 0x03d4; @@ -141,7 +141,6 @@ state->m_bosco_radarx = state->m_videoram + 0x03f0; state->m_bosco_radary = state->m_bosco_radarx + 0x0800; - state->save_item(NAME(state->m_stars_scrollx)); state->save_item(NAME(state->m_stars_scrolly)); } @@ -160,22 +159,22 @@ state->m_videoram[offset] = data; if (offset & 0x400) - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( bosco_scrollx_w ) { bosco_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,data); + state->m_bg_tilemap->set_scrollx(0,data); } WRITE8_HANDLER( bosco_scrolly_w ) { bosco_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap,0,data); + state->m_bg_tilemap->set_scrolly(0,data); } WRITE8_HANDLER( bosco_starclr_w ) @@ -190,7 +189,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 *spriteram = machine.generic.spriteram.u8; UINT8 *spriteram_2 = machine.generic.spriteram2.u8; @@ -203,7 +202,12 @@ int flipx = spriteram[offs] & 1; int flipy = spriteram[offs] & 2; int color = spriteram_2[offs + 1] & 0x3f; - if (flip_screen_get(machine)) sx += 32-2; + + if (flip_screen_get(machine)) + { + sx += 128-2; + sy += 8; + } drawgfx_transmask(bitmap,cliprect,machine.gfx[1], (spriteram[offs] & 0xfc) >> 2, @@ -215,18 +219,21 @@ } -static void draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { bosco_state *state = machine.driver_data(); int offs; for (offs = 4; offs < 0x10;offs++) { - int x,y; + int x = state->m_bosco_radarx[offs] + ((~state->m_bosco_radarattr[offs] & 0x01) << 8); + int y = 253 - state->m_bosco_radary[offs]; - x = state->m_bosco_radarx[offs] + ((~state->m_bosco_radarattr[offs] & 0x01) << 8); - y = 253 - state->m_bosco_radary[offs]; - if (flip_screen_get(machine)) x -= 3; + if (flip_screen_get(machine)) + { + x += 96-2; + y += 8; + } drawgfx_transmask(bitmap,cliprect,machine.gfx[2], ((state->m_bosco_radarattr[offs] & 0x0e) >> 1) ^ 0x07, @@ -237,9 +244,9 @@ } -static void draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int flip) +static void draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int flip) { - bosco_state *state = machine.driver_data(); + bosco_state *state = machine.driver_data(); if (1) { @@ -247,25 +254,25 @@ int set_a, set_b; /* two sets of stars controlled by these bits */ - set_a = state->m_bosco_starblink[0] & 0x01; - set_b = (state->m_bosco_starblink[1] & 0x01) |0x2; + set_a = (state->m_bosco_starblink[0] & 1); + set_b = (state->m_bosco_starblink[1] & 1) | 2; for (star_cntr = 0;star_cntr < MAX_STARS;star_cntr++) { int x,y; - if ( (set_a == star_seed_tab[star_cntr].set) || ( set_b == star_seed_tab[star_cntr].set) ) + if ( (set_a == star_seed_tab[star_cntr].set) || ( set_b == star_seed_tab[star_cntr].set) ) { - x = ( star_seed_tab[star_cntr].x + state->m_stars_scrollx) % 256; - y = ( star_seed_tab[star_cntr].y + state->m_stars_scrolly) % 256; + x = (star_seed_tab[star_cntr].x + state->m_stars_scrollx) % 256; + y = (star_seed_tab[star_cntr].y + state->m_stars_scrolly) % 256; /* dont draw the stars that are off the screen */ - if ( x < 224 && y < 224 ) + if ( x < 224 ) { - if (flip) x += 64; + if (flip) x += 20*8; - if (y >= cliprect->min_y && y <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, y, x) = STARS_COLOR_BASE + star_seed_tab[star_cntr].col; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = STARS_COLOR_BASE + star_seed_tab[star_cntr].col; } } } @@ -273,18 +280,18 @@ } -SCREEN_UPDATE( bosco ) +SCREEN_UPDATE_IND16( bosco ) { - bosco_state *state = screen->machine().driver_data(); + bosco_state *state = screen.machine().driver_data(); /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across the screen, and clip it to only the position where it is supposed to be shown */ - rectangle fg_clip = *cliprect; - rectangle bg_clip = *cliprect; - if (flip_screen_get(screen->machine())) + rectangle fg_clip = cliprect; + rectangle bg_clip = cliprect; + if (flip_screen_get(screen.machine())) { - bg_clip.min_x = 8*8; - fg_clip.max_x = 8*8-1; + bg_clip.min_x = 20*8; + fg_clip.max_x = 20*8-1; } else { @@ -292,30 +299,34 @@ fg_clip.min_x = 28*8; } - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - draw_stars(screen->machine(),bitmap,cliprect,flip_screen_get(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + draw_stars(screen.machine(),bitmap,cliprect,flip_screen_get(screen.machine())); - tilemap_draw(bitmap,&bg_clip,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,&fg_clip,state->m_fg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, bg_clip, 0,0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); /* draw the high priority characters */ - tilemap_draw(bitmap,&bg_clip,state->m_bg_tilemap,1,0); - tilemap_draw(bitmap,&fg_clip,state->m_fg_tilemap,1,0); + state->m_bg_tilemap->draw(bitmap, bg_clip, 1,0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 1,0); - draw_bullets(screen->machine(), bitmap,cliprect); + draw_bullets(screen.machine(), bitmap,cliprect); return 0; } -SCREEN_EOF( bosco ) +SCREEN_VBLANK( bosco ) { - bosco_state *state = machine.driver_data(); - static const int speedsx[8] = { -1, -2, -3, 0, 3, 2, 1, 0 }; - static const int speedsy[8] = { 0, -1, -2, -3, 0, 3, 2, 1 }; + // falling edge + if (!vblank_on) + { + bosco_state *state = screen.machine().driver_data(); + static const int speedsx[8] = { -1, -2, -3, 0, 3, 2, 1, 0 }; + static const int speedsy[8] = { 0, -1, -2, -3, 0, 3, 2, 1 }; - state->m_stars_scrollx += speedsx[state->m_bosco_starcontrol[0] & 0x07]; - state->m_stars_scrolly += speedsy[(state->m_bosco_starcontrol[0] & 0x38) >> 3]; + state->m_stars_scrollx += speedsx[state->m_bosco_starcontrol[0] & 0x07]; + state->m_stars_scrolly += speedsy[(state->m_bosco_starcontrol[0] & 0x38) >> 3]; + } } diff -Nru mame-0.144/src/mame/video/bottom9.c mame-0.145/src/mame/video/bottom9.c --- mame-0.144/src/mame/video/bottom9.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bottom9.c 2012-02-06 21:30:32.000000000 +0000 @@ -73,14 +73,14 @@ ***************************************************************************/ -SCREEN_UPDATE( bottom9 ) +SCREEN_UPDATE_IND16( bottom9 ) { - bottom9_state *state = screen->machine().driver_data(); + bottom9_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); /* note: FIX layer is not used */ - bitmap_fill(bitmap, cliprect, state->m_layer_colorbase[1]); + bitmap.fill(state->m_layer_colorbase[1], cliprect); // if (state->m_video_enable) { k051960_sprites_draw(state->m_k051960, bitmap, cliprect, 1, 1); diff -Nru mame-0.144/src/mame/video/brkthru.c mame-0.145/src/mame/video/brkthru.c --- mame-0.144/src/mame/video/brkthru.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/brkthru.c 2012-02-06 21:30:31.000000000 +0000 @@ -91,7 +91,7 @@ brkthru_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -107,7 +107,7 @@ brkthru_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } VIDEO_START( brkthru ) @@ -117,8 +117,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 16); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); } @@ -137,15 +137,15 @@ if (((data & 0x38) >> 2) != state->m_bgbasecolor) { state->m_bgbasecolor = (data & 0x38) >> 2; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 6 = screen flip */ if (state->m_flipscreen != (data & 0x40)) { state->m_flipscreen = data & 0x40; - tilemap_set_flip(state->m_bg_tilemap, state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(state->m_fg_tilemap, state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_fg_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } @@ -156,7 +156,7 @@ #if 0 -static void show_register( bitmap_t *bitmap, int x, int y, UINT32 data ) +static void show_register( bitmap_ind16 &bitmap, int x, int y, UINT32 data ) { char buf[5]; @@ -166,7 +166,7 @@ #endif -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int prio ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int prio ) { brkthru_state *state = machine.driver_data(); int offs; @@ -250,24 +250,24 @@ } } -SCREEN_UPDATE( brkthru ) +SCREEN_UPDATE_IND16( brkthru ) { - brkthru_state *state = screen->machine().driver_data(); + brkthru_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bgscroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->set_scrollx(0, state->m_bgscroll); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); /* low priority sprites */ - draw_sprites(screen->machine(), bitmap, cliprect, 0x01); + draw_sprites(screen.machine(), bitmap, cliprect, 0x01); /* draw background over low priority sprites */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* high priority sprites */ - draw_sprites(screen->machine(), bitmap, cliprect, 0x09); + draw_sprites(screen.machine(), bitmap, cliprect, 0x09); /* fg layer */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); /* show_register(bitmap, 8, 8, (UINT32)state->m_flipscreen); */ diff -Nru mame-0.144/src/mame/video/bsktball.c mame-0.145/src/mame/video/bsktball.c --- mame-0.144/src/mame/video/bsktball.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/bsktball.c 2012-02-06 21:30:32.000000000 +0000 @@ -13,7 +13,7 @@ bsktball_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -33,7 +33,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { bsktball_state *state = machine.driver_data(); int mot; @@ -53,11 +53,11 @@ } } -SCREEN_UPDATE( bsktball ) +SCREEN_UPDATE_IND16( bsktball ) { - bsktball_state *state = screen->machine().driver_data(); + bsktball_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/btime.c mame-0.145/src/mame/video/btime.c --- mame-0.144/src/mame/video/btime.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/btime.c 2012-02-06 21:30:33.000000000 +0000 @@ -129,8 +129,7 @@ /* the background area is twice as wide as the screen */ int width = 256; int height = 256; - bitmap_format format = machine.primary_screen->format(); - state->m_background_bitmap = auto_bitmap_alloc(machine, 2 * width, height, format); + state->m_background_bitmap = auto_bitmap_ind16_alloc(machine, 2 * width, height); state->save_item(NAME(*state->m_background_bitmap)); @@ -301,7 +300,7 @@ } -static void draw_chars( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 transparency, UINT8 color, int priority ) +static void draw_chars( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 transparency, UINT8 color, int priority ) { btime_state *state = machine.driver_data(); offs_t offs; @@ -319,7 +318,7 @@ if (flip_screen_get(machine)) { - x = 31 - x; + x = 31 + 16 - x; y = 33 - y; } @@ -332,7 +331,7 @@ } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 color, +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 color, UINT8 sprite_y_adjust, UINT8 sprite_y_adjust_flip_screen, UINT8 *sprite_ram, offs_t interleave ) { @@ -355,7 +354,7 @@ if (flip_screen_get(machine)) { - x = 240 - x; + x = 240 + 128 - x; y = 256 - y + sprite_y_adjust_flip_screen; flipx = !flipx; @@ -382,7 +381,7 @@ } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* tmap, UINT8 color ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* tmap, UINT8 color ) { btime_state *state = machine.driver_data(); int i; @@ -408,7 +407,7 @@ if (flip_screen_get(machine)) { - x = 240 - x; + x = 240 + 128 - x; y = 256 - y; } @@ -422,15 +421,15 @@ } -SCREEN_UPDATE( btime ) +SCREEN_UPDATE_IND16( btime ) { - btime_state *state = screen->machine().driver_data(); + btime_state *state = screen.machine().driver_data(); if (state->m_bnj_scroll1 & 0x10) { int i, start; // Generate tile map - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) start = 0; else start = 1; @@ -441,60 +440,60 @@ start = (start + 1) & 0x03; } - draw_background(screen->machine(), bitmap, cliprect, state->m_btime_tilemap, 0); - draw_chars(screen->machine(), bitmap, cliprect, TRUE, 0, -1); + draw_background(screen.machine(), bitmap, cliprect, state->m_btime_tilemap, 0); + draw_chars(screen.machine(), bitmap, cliprect, TRUE, 0, -1); } else - draw_chars(screen->machine(), bitmap, cliprect, FALSE, 0, -1); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, 0, -1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 1, 0, state->m_videoram, 0x20); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 1, 0, state->m_videoram, 0x20); return 0; } -SCREEN_UPDATE( eggs ) +SCREEN_UPDATE_IND16( eggs ) { - btime_state *state = screen->machine().driver_data(); - draw_chars(screen->machine(), bitmap, cliprect, FALSE, 0, -1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); + btime_state *state = screen.machine().driver_data(); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, 0, -1); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); return 0; } -SCREEN_UPDATE( lnc ) +SCREEN_UPDATE_IND16( lnc ) { - btime_state *state = screen->machine().driver_data(); - draw_chars(screen->machine(), bitmap, cliprect, FALSE, 0, -1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 1, 2, state->m_videoram, 0x20); + btime_state *state = screen.machine().driver_data(); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, 0, -1); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 1, 2, state->m_videoram, 0x20); return 0; } -SCREEN_UPDATE( zoar ) +SCREEN_UPDATE_IND16( zoar ) { - btime_state *state = screen->machine().driver_data(); + btime_state *state = screen.machine().driver_data(); if (state->m_bnj_scroll1 & 0x04) { - draw_background(screen->machine(), bitmap, cliprect, state->m_zoar_scrollram, state->m_btime_palette); - draw_chars(screen->machine(), bitmap, cliprect, TRUE, state->m_btime_palette + 1, -1); + draw_background(screen.machine(), bitmap, cliprect, state->m_zoar_scrollram, state->m_btime_palette); + draw_chars(screen.machine(), bitmap, cliprect, TRUE, state->m_btime_palette + 1, -1); } else - draw_chars(screen->machine(), bitmap, cliprect, FALSE, state->m_btime_palette + 1, -1); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, state->m_btime_palette + 1, -1); /* The order is important for correct priorities */ - draw_sprites(screen->machine(), bitmap, cliprect, state->m_btime_palette + 1, 1, 2, state->m_videoram + 0x1f, 0x20); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_btime_palette + 1, 1, 2, state->m_videoram, 0x20); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_btime_palette + 1, 1, 2, state->m_videoram + 0x1f, 0x20); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_btime_palette + 1, 1, 2, state->m_videoram, 0x20); return 0; } -SCREEN_UPDATE( bnj ) +SCREEN_UPDATE_IND16( bnj ) { - btime_state *state = screen->machine().driver_data(); + btime_state *state = screen.machine().driver_data(); if (state->m_bnj_scroll1) { int scroll, offs; @@ -507,44 +506,44 @@ sy = 16 * (((offs % 0x100) < 0x80) ? offs % 8 : (offs % 8) + 8); sx = 496 - sx; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 496 - sx; sy = 256 - sy; } - drawgfx_opaque(state->m_background_bitmap, 0, screen->machine().gfx[2], + drawgfx_opaque(*state->m_background_bitmap, state->m_background_bitmap->cliprect(), screen.machine().gfx[2], (state->m_bnj_backgroundram[offs] >> 4) + ((offs & 0x80) >> 3) + 32, 0, - flip_screen_get(screen->machine()), flip_screen_get(screen->machine()), + flip_screen_get(screen.machine()), flip_screen_get(screen.machine()), sx, sy); } /* copy the background bitmap to the screen */ scroll = (state->m_bnj_scroll1 & 0x02) * 128 + 511 - state->m_bnj_scroll2; - if (!flip_screen_get(screen->machine())) + if (!flip_screen_get(screen.machine())) scroll = 767 - scroll; - copyscrollbitmap(bitmap, state->m_background_bitmap, 1, &scroll, 0, 0, cliprect); + copyscrollbitmap(bitmap, *state->m_background_bitmap, 1, &scroll, 0, 0, cliprect); /* copy the low priority characters followed by the sprites then the high priority characters */ - draw_chars(screen->machine(), bitmap, cliprect, TRUE, 0, 1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); - draw_chars(screen->machine(), bitmap, cliprect, TRUE, 0, 0); + draw_chars(screen.machine(), bitmap, cliprect, TRUE, 0, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); + draw_chars(screen.machine(), bitmap, cliprect, TRUE, 0, 0); } else { - draw_chars(screen->machine(), bitmap, cliprect, FALSE, 0, -1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, 0, -1); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0, 0, state->m_videoram, 0x20); } return 0; } -SCREEN_UPDATE( cookrace ) +SCREEN_UPDATE_IND16( cookrace ) { - btime_state *state = screen->machine().driver_data(); + btime_state *state = screen.machine().driver_data(); int offs; for (offs = state->m_bnj_backgroundram_size - 1; offs >=0; offs--) @@ -554,31 +553,31 @@ sx = 31 - (offs / 32); sy = offs % 32; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 31 - sx; sy = 33 - sy; } - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[2], + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[2], state->m_bnj_backgroundram[offs], 0, - flip_screen_get(screen->machine()), flip_screen_get(screen->machine()), + flip_screen_get(screen.machine()), flip_screen_get(screen.machine()), 8*sx,8*sy); } - draw_chars(screen->machine(), bitmap, cliprect, TRUE, 0, -1); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 1, 0, state->m_videoram, 0x20); + draw_chars(screen.machine(), bitmap, cliprect, TRUE, 0, -1); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 1, 0, state->m_videoram, 0x20); return 0; } -SCREEN_UPDATE( disco ) +SCREEN_UPDATE_IND16( disco ) { - btime_state *state = screen->machine().driver_data(); - draw_chars(screen->machine(), bitmap, cliprect, FALSE, state->m_btime_palette, -1); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_btime_palette, 0, 0, state->m_spriteram, 1); + btime_state *state = screen.machine().driver_data(); + draw_chars(screen.machine(), bitmap, cliprect, FALSE, state->m_btime_palette, -1); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_btime_palette, 0, 0, state->m_spriteram, 1); return 0; } diff -Nru mame-0.144/src/mame/video/btoads.c mame-0.145/src/mame/video/btoads.c --- mame-0.144/src/mame/video/btoads.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/btoads.c 2012-02-06 21:30:32.000000000 +0000 @@ -316,13 +316,13 @@ * *************************************/ -void btoads_state::scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void btoads_state::scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { UINT32 fulladdr = ((params->rowaddr << 16) | params->coladdr) >> 4; UINT16 *bg0_base = &m_vram_bg0[(fulladdr + (m_yscroll0 << 10)) & 0x3fc00]; UINT16 *bg1_base = &m_vram_bg1[(fulladdr + (m_yscroll1 << 10)) & 0x3fc00]; UINT8 *spr_base = &m_vram_fg_display[fulladdr & 0x3fc00]; - UINT32 *dst = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dst = &bitmap.pix32(scanline); const rgb_t *pens = tlc34076_get_pens(m_tlc34076); int coladdr = fulladdr & 0x3ff; int x; diff -Nru mame-0.144/src/mame/video/bublbobl.c mame-0.145/src/mame/video/bublbobl.c --- mame-0.144/src/mame/video/bublbobl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/bublbobl.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,9 +10,9 @@ #include "includes/bublbobl.h" -SCREEN_UPDATE( bublbobl ) +SCREEN_UPDATE_IND16( bublbobl ) { - bublbobl_state *state = screen->machine().driver_data(); + bublbobl_state *state = screen.machine().driver_data(); int offs; int sx, sy, xc, yc; int gfx_num, gfx_attr, gfx_offs; @@ -25,14 +25,14 @@ /* the background character columns is stored in the area dd00-dd3f */ /* This clears & redraws the entire screen each pass */ - bitmap_fill(bitmap, cliprect, 255); + bitmap.fill(255, cliprect); if (!state->m_video_enable) return 0; sx = 0; - prom = screen->machine().region("proms")->base(); + prom = screen.machine().region("proms")->base(); for (offs = 0; offs < state->m_objectram_size; offs += 4) { /* skip empty sprites */ @@ -73,7 +73,7 @@ x = sx + xc * 8; y = (sy + yc * 8) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { x = 248 - x; y = 248 - y; @@ -81,7 +81,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, flipx,flipy, diff -Nru mame-0.144/src/mame/video/buggychl.c mame-0.145/src/mame/video/buggychl.c --- mame-0.144/src/mame/video/buggychl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/buggychl.c 2012-02-06 21:30:33.000000000 +0000 @@ -15,11 +15,11 @@ VIDEO_START( buggychl ) { buggychl_state *state = machine.driver_data(); - state->m_tmp_bitmap1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmp_bitmap2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap1); + machine.primary_screen->register_screen_bitmap(state->m_tmp_bitmap2); - state->save_item(NAME(*state->m_tmp_bitmap1)); - state->save_item(NAME(*state->m_tmp_bitmap2)); + state->save_item(NAME(state->m_tmp_bitmap1)); + state->save_item(NAME(state->m_tmp_bitmap2)); gfx_element_set_source(machine.gfx[0], state->m_charram); } @@ -80,24 +80,24 @@ } -static void draw_sky( bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sky( bitmap_ind16 &bitmap, const rectangle &cliprect ) { int x, y; for (y = 0; y < 256; y++) for (x = 0; x < 256; x++) - *BITMAP_ADDR16(bitmap, y, x) = 128 + x / 2; + bitmap.pix16(y, x) = 128 + x / 2; } -static void draw_bg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { buggychl_state *state = machine.driver_data(); int offs; int scroll[256]; /* prevent wraparound */ - rectangle clip = *cliprect; + rectangle clip = cliprect; if (flip_screen_x_get(machine)) clip.min_x += 8*8; else clip.max_x -= 8*8; @@ -113,7 +113,7 @@ if (flip_screen_y_get(machine)) sy = 31 - sy; - drawgfx_opaque(state->m_tmp_bitmap1, NULL, machine.gfx[0], + drawgfx_opaque(state->m_tmp_bitmap1, state->m_tmp_bitmap1.cliprect(), machine.gfx[0], code, 2, flip_screen_x_get(machine),flip_screen_y_get(machine), @@ -124,17 +124,17 @@ for (offs = 0; offs < 256; offs++) scroll[offs] = -state->m_scrollv[offs / 8]; - copyscrollbitmap(state->m_tmp_bitmap2, state->m_tmp_bitmap1, 1, &state->m_bg_scrollx, 256, scroll, NULL); + copyscrollbitmap(state->m_tmp_bitmap2, state->m_tmp_bitmap1, 1, &state->m_bg_scrollx, 256, scroll, state->m_tmp_bitmap2.cliprect()); /* then copy to the screen doing row scroll */ for (offs = 0; offs < 256; offs++) scroll[offs] = -state->m_scrollh[offs]; - copyscrollbitmap_trans(bitmap, state->m_tmp_bitmap2, 256, scroll, 0, 0, &clip, 32); + copyscrollbitmap_trans(bitmap, state->m_tmp_bitmap2, 256, scroll, 0, 0, clip, 32); } -static void draw_fg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_fg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { buggychl_state *state = machine.driver_data(); int offs; @@ -163,7 +163,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { buggychl_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -220,7 +220,7 @@ { int dx = flip_screen_x_get(machine) ? (255 - sx - px) : (sx + px); if ((dx & ~0xff) == 0) - *BITMAP_ADDR16(bitmap, dy, dx) = state->m_sprite_color_base + col; + bitmap.pix16(dy, dx) = state->m_sprite_color_base + col; } /* the following line is almost certainly wrong */ @@ -236,21 +236,21 @@ } -SCREEN_UPDATE( buggychl ) +SCREEN_UPDATE_IND16( buggychl ) { - buggychl_state *state = screen->machine().driver_data(); + buggychl_state *state = screen.machine().driver_data(); if (state->m_sky_on) draw_sky(bitmap, cliprect); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (state->m_bg_on) - draw_bg(screen->machine(), bitmap, cliprect); + draw_bg(screen.machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - draw_fg(screen->machine(), bitmap, cliprect); + draw_fg(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/bwing.c mame-0.145/src/mame/video/bwing.c --- mame-0.144/src/mame/video/bwing.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/bwing.c 2012-02-06 21:30:33.000000000 +0000 @@ -65,7 +65,7 @@ { bwing_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_charmap, offset); + state->m_charmap->mark_tile_dirty(offset); } @@ -92,9 +92,9 @@ { offs = state->m_srxlat[offset]; if (offs >> 12) - tilemap_mark_tile_dirty(state->m_bgmap, offs & 0xfff); + state->m_bgmap->mark_tile_dirty(offs & 0xfff); else - tilemap_mark_tile_dirty(state->m_fgmap, offs & 0xfff); + state->m_fgmap->mark_tile_dirty(offs & 0xfff); } else { @@ -179,15 +179,15 @@ static TILE_GET_INFO( get_fgtileinfo ) { bwing_state *state = machine.driver_data(); - tileinfo->pen_data = gfx_element_get_data(machine.gfx[2], state->m_fgdata[tile_index] & (BW_NTILES - 1)); - tileinfo->palette_base = machine.gfx[2]->color_base + ((state->m_fgdata[tile_index] >> 7) << 3); + tileinfo.pen_data = gfx_element_get_data(machine.gfx[2], state->m_fgdata[tile_index] & (BW_NTILES - 1)); + tileinfo.palette_base = machine.gfx[2]->color_base + ((state->m_fgdata[tile_index] >> 7) << 3); } static TILE_GET_INFO( get_bgtileinfo ) { bwing_state *state = machine.driver_data(); - tileinfo->pen_data = gfx_element_get_data(machine.gfx[3], state->m_bgdata[tile_index] & (BW_NTILES - 1)); - tileinfo->palette_base = machine.gfx[3]->color_base + ((state->m_bgdata[tile_index] >> 7) << 3); + tileinfo.pen_data = gfx_element_get_data(machine.gfx[3], state->m_bgdata[tile_index] & (BW_NTILES - 1)); + tileinfo.palette_base = machine.gfx[3]->color_base + ((state->m_bgdata[tile_index] >> 7) << 3); } static TILE_GET_INFO( get_charinfo ) @@ -212,8 +212,8 @@ state->m_fgmap = tilemap_create(machine, get_fgtileinfo, bwing_scan_cols, 16, 16, 64, 64); state->m_bgmap = tilemap_create(machine, get_bgtileinfo, bwing_scan_cols, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_charmap, 0); - tilemap_set_transparent_pen(state->m_fgmap, 0); + state->m_charmap->set_transparent_pen(0); + state->m_fgmap->set_transparent_pen(0); state->m_srxlat = auto_alloc_array(machine, int, 0x2000); state->save_pointer(NAME(state->m_srxlat), 0x2000); @@ -247,7 +247,7 @@ //**************************************************************************** // Realtime -static void draw_sprites( running_machine &machine, bitmap_t *bmp, const rectangle *clip, UINT8 *ram, int pri ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bmp, const rectangle &clip, UINT8 *ram, int pri ) { bwing_state *state = machine.driver_data(); int attrib, fx, fy, code, x, y, color, i; @@ -289,9 +289,9 @@ } -SCREEN_UPDATE( bwing ) +SCREEN_UPDATE_IND16( bwing ) { - bwing_state *state = screen->machine().driver_data(); + bwing_state *state = screen.machine().driver_data(); unsigned x, y, shiftx; if (state->m_mapmask & 0x20) @@ -308,38 +308,38 @@ // draw background if (!(state->m_mapmask & 1)) { - tilemap_set_flip(state->m_bgmap, state->m_mapflip); + state->m_bgmap->set_flip(state->m_mapflip); x = ((state->m_sreg[1]<<2 & 0x300) + state->m_sreg[2] + shiftx) & 0x3ff; - tilemap_set_scrollx(state->m_bgmap, 0, x); + state->m_bgmap->set_scrollx(0, x); y = (state->m_sreg[1]<<4 & 0x300) + state->m_sreg[3]; - tilemap_set_scrolly(state->m_bgmap, 0, y); - tilemap_draw(bitmap, cliprect, state->m_bgmap, 0, 0); + state->m_bgmap->set_scrolly(0, y); + state->m_bgmap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // draw low priority sprites - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 0); // draw foreground if (!(state->m_mapmask & 2)) { - tilemap_set_flip(state->m_fgmap, state->m_mapflip); + state->m_fgmap->set_flip(state->m_mapflip); x = ((state->m_sreg[1] << 6 & 0x300) + state->m_sreg[4] + shiftx) & 0x3ff; - tilemap_set_scrollx(state->m_fgmap, 0, x); + state->m_fgmap->set_scrollx(0, x); y = (state->m_sreg[1] << 8 & 0x300) + state->m_sreg[5]; - tilemap_set_scrolly(state->m_fgmap, 0, y); - tilemap_draw(bitmap, cliprect, state->m_fgmap, 0, 0); + state->m_fgmap->set_scrolly(0, y); + state->m_fgmap->draw(bitmap, cliprect, 0, 0); } // draw high priority sprites - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 1); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 1); // draw text layer // if (state->m_mapmask & 4) { - tilemap_set_flip(state->m_charmap, state->m_mapflip); - tilemap_draw(bitmap, cliprect, state->m_charmap, 0, 0); + state->m_charmap->set_flip(state->m_mapflip); + state->m_charmap->draw(bitmap, cliprect, 0, 0); } return 0; } diff -Nru mame-0.144/src/mame/video/cabal.c mame-0.145/src/mame/video/cabal.c --- mame-0.144/src/mame/video/cabal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cabal.c 2012-02-06 21:30:33.000000000 +0000 @@ -49,8 +49,8 @@ state->m_background_layer = tilemap_create(machine, get_back_tile_info,tilemap_scan_rows,16,16,16,16); state->m_text_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8,8,32,32); - tilemap_set_transparent_pen(state->m_text_layer,3); - tilemap_set_transparent_pen(state->m_background_layer,15); + state->m_text_layer->set_transparent_pen(3); + state->m_background_layer->set_transparent_pen(15); } @@ -62,8 +62,8 @@ { cabal_state *state = space->machine().driver_data(); int flip = (data & 0x20) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip(state->m_background_layer,flip); - tilemap_set_flip(state->m_text_layer,flip); + state->m_background_layer->set_flip(flip); + state->m_text_layer->set_flip(flip); flip_screen_set(space->machine(), data & 0x20); } @@ -73,14 +73,14 @@ { cabal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_background_layer,offset); + state->m_background_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( cabal_text_videoram16_w ) { cabal_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_colorram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer,offset); + state->m_text_layer->mark_tile_dirty(offset); } @@ -105,7 +105,7 @@ ********************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cabal_state *state = machine.driver_data(); int offs,data0,data1,data2; @@ -146,12 +146,12 @@ } -SCREEN_UPDATE( cabal ) +SCREEN_UPDATE_IND16( cabal ) { - cabal_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_background_layer,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,0); + cabal_state *state = screen.machine().driver_data(); + state->m_background_layer->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_text_layer->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/calomega.c mame-0.145/src/mame/video/calomega.c --- mame-0.144/src/mame/video/calomega.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/calomega.c 2012-02-06 21:30:32.000000000 +0000 @@ -21,14 +21,14 @@ { calomega_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( calomega_colorram_w ) { calomega_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -63,10 +63,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 31); } -SCREEN_UPDATE( calomega ) +SCREEN_UPDATE_IND16( calomega ) { - calomega_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + calomega_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/canyon.c mame-0.145/src/mame/video/canyon.c --- mame-0.144/src/mame/video/canyon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/canyon.c 2012-02-06 21:30:32.000000000 +0000 @@ -12,7 +12,7 @@ { canyon_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -33,7 +33,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle* cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { canyon_state *state = machine.driver_data(); int i; @@ -55,7 +55,7 @@ } -static void draw_bombs( running_machine &machine, bitmap_t *bitmap, const rectangle* cliprect ) +static void draw_bombs( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { canyon_state *state = machine.driver_data(); int i; @@ -65,35 +65,26 @@ int sx = 254 - state->m_videoram[0x3d0 + 2 * i + 0x5]; int sy = 246 - state->m_videoram[0x3d0 + 2 * i + 0xc]; - rectangle rect; + rectangle rect(sx, sx + 1, sy, sy + 1); + rect &= cliprect; - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + 1; - rect.max_y = sy + 1; - - if (rect.min_x < cliprect->min_x) rect.min_x = cliprect->min_x; - if (rect.min_y < cliprect->min_y) rect.min_y = cliprect->min_y; - if (rect.max_x > cliprect->max_x) rect.max_x = cliprect->max_x; - if (rect.max_y > cliprect->max_y) rect.max_y = cliprect->max_y; - - bitmap_fill(bitmap, &rect, 1 + 2 * i); + bitmap.fill(1 + 2 * i, rect); } } -SCREEN_UPDATE( canyon ) +SCREEN_UPDATE_IND16( canyon ) { - canyon_state *state = screen->machine().driver_data(); + canyon_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - draw_bombs(screen->machine(), bitmap, cliprect); + draw_bombs(screen.machine(), bitmap, cliprect); /* watchdog is disabled during service mode */ - watchdog_enable(screen->machine(), !(input_port_read(screen->machine(), "IN2") & 0x10)); + watchdog_enable(screen.machine(), !(input_port_read(screen.machine(), "IN2") & 0x10)); return 0; } diff -Nru mame-0.144/src/mame/video/capbowl.c mame-0.145/src/mame/video/capbowl.c --- mame-0.144/src/mame/video/capbowl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/capbowl.c 2012-02-06 21:30:31.000000000 +0000 @@ -165,7 +165,7 @@ } -SCREEN_UPDATE( capbowl ) +SCREEN_UPDATE_RGB32( capbowl ) { struct tms34061_display state; int x, y; @@ -176,17 +176,17 @@ /* if we're blanked, just fill with black */ if (state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* now regenerate the bitmap */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *src = &state.vram[256 * y]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { UINT8 pix = src[32 + (x / 2)]; *dest++ = pen_for_pixel(src, pix >> 4); diff -Nru mame-0.144/src/mame/video/carjmbre.c mame-0.145/src/mame/video/carjmbre.c --- mame-0.144/src/mame/video/carjmbre.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/carjmbre.c 2012-02-06 21:30:32.000000000 +0000 @@ -47,7 +47,7 @@ carjmbre_state *state = space->machine().driver_data(); state->m_flipscreen = (data & 1) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip_all(space->machine(), state->m_flipscreen); + space->machine().tilemap().set_flip_all(state->m_flipscreen); } WRITE8_HANDLER( carjmbre_bgcolor_w ) @@ -80,7 +80,7 @@ carjmbre_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_cj_tilemap, offset & 0x3ff); + state->m_cj_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -108,9 +108,9 @@ state->save_item(NAME(state->m_bgcolor)); } -SCREEN_UPDATE( carjmbre ) +SCREEN_UPDATE_IND16( carjmbre ) { - carjmbre_state *state = screen->machine().driver_data(); + carjmbre_state *state = screen.machine().driver_data(); int offs, troffs, sx, sy, flipx, flipy; //colorram @@ -119,7 +119,7 @@ //-xxx---- unused //----xxxx colour - tilemap_draw(bitmap, cliprect, state->m_cj_tilemap, 0, 0); + state->m_cj_tilemap->draw(bitmap, cliprect, 0, 0); //spriteram[offs] //+0 y pos @@ -153,7 +153,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], state->m_spriteram[troffs + 1], state->m_spriteram[troffs + 2] & 0xf, flipx,flipy, diff -Nru mame-0.144/src/mame/video/carpolo.c mame-0.145/src/mame/video/carpolo.c --- mame-0.144/src/mame/video/carpolo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/carpolo.c 2012-02-06 21:30:32.000000000 +0000 @@ -143,15 +143,14 @@ VIDEO_START( carpolo ) { carpolo_state *state = machine.driver_data(); - bitmap_format format = machine.primary_screen->format(); - state->m_sprite_sprite_collision_bitmap1 = auto_bitmap_alloc(machine, SPRITE_WIDTH*2, SPRITE_HEIGHT*2, format); - state->m_sprite_sprite_collision_bitmap2 = auto_bitmap_alloc(machine, SPRITE_WIDTH*2, SPRITE_HEIGHT*2, format); + state->m_sprite_sprite_collision_bitmap1 = auto_bitmap_ind16_alloc(machine, SPRITE_WIDTH*2, SPRITE_HEIGHT*2); + state->m_sprite_sprite_collision_bitmap2 = auto_bitmap_ind16_alloc(machine, SPRITE_WIDTH*2, SPRITE_HEIGHT*2); - state->m_sprite_goal_collision_bitmap1 = auto_bitmap_alloc(machine, SPRITE_WIDTH+GOAL_WIDTH, SPRITE_HEIGHT+GOAL_HEIGHT, format); - state->m_sprite_goal_collision_bitmap2 = auto_bitmap_alloc(machine, SPRITE_WIDTH+GOAL_WIDTH, SPRITE_HEIGHT+GOAL_HEIGHT, format); + state->m_sprite_goal_collision_bitmap1 = auto_bitmap_ind16_alloc(machine, SPRITE_WIDTH+GOAL_WIDTH, SPRITE_HEIGHT+GOAL_HEIGHT); + state->m_sprite_goal_collision_bitmap2 = auto_bitmap_ind16_alloc(machine, SPRITE_WIDTH+GOAL_WIDTH, SPRITE_HEIGHT+GOAL_HEIGHT); - state->m_sprite_border_collision_bitmap = auto_bitmap_alloc(machine, SPRITE_WIDTH, SPRITE_HEIGHT, format); + state->m_sprite_border_collision_bitmap = auto_bitmap_ind16_alloc(machine, SPRITE_WIDTH, SPRITE_HEIGHT); state_save_register_global_bitmap(machine, state->m_sprite_sprite_collision_bitmap1); state_save_register_global_bitmap(machine, state->m_sprite_sprite_collision_bitmap2); @@ -167,7 +166,7 @@ * *************************************/ -static void draw_alpha_line(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void draw_alpha_line(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int alpha_line, int video_line) { carpolo_state *state = machine.driver_data(); @@ -198,7 +197,7 @@ } -static void draw_sprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void draw_sprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 x, UINT8 y, int bank, int code, int col) { int remapped_code, flipy; @@ -221,58 +220,58 @@ } -SCREEN_UPDATE( carpolo ) +SCREEN_UPDATE_IND16( carpolo ) { - carpolo_state *state = screen->machine().driver_data(); + carpolo_state *state = screen.machine().driver_data(); /* draw the playfield elements in the correct priority order */ /* score area - position determined by bit 4 of the vertical timing PROM */ - plot_box(bitmap,0,0,RIGHT_BORDER+1,TOP_BORDER,BACKGROUND_PEN); + bitmap.plot_box(0,0,RIGHT_BORDER+1,TOP_BORDER,BACKGROUND_PEN); /* field */ - plot_box(bitmap,0,TOP_BORDER,RIGHT_BORDER+1,BOTTOM_BORDER-TOP_BORDER+1,FIELD_PEN); + bitmap.plot_box(0,TOP_BORDER,RIGHT_BORDER+1,BOTTOM_BORDER-TOP_BORDER+1,FIELD_PEN); /* car 1 */ - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x00], state->m_spriteram[0x01], 0, state->m_spriteram[0x0c] & 0x0f, CAR1_COLOR); /* border - position determined by bit 4 and 7 of the vertical timing PROM */ - plot_box(bitmap,0,TOP_BORDER, RIGHT_BORDER+1,1,LINE_PEN); - plot_box(bitmap,0,BOTTOM_BORDER,RIGHT_BORDER+1,1,LINE_PEN); - plot_box(bitmap,LEFT_BORDER,TOP_BORDER, 1,BOTTOM_BORDER-TOP_BORDER+1,LINE_PEN); - plot_box(bitmap,RIGHT_BORDER,TOP_BORDER,1,BOTTOM_BORDER-TOP_BORDER+1,LINE_PEN); + bitmap.plot_box(0,TOP_BORDER, RIGHT_BORDER+1,1,LINE_PEN); + bitmap.plot_box(0,BOTTOM_BORDER,RIGHT_BORDER+1,1,LINE_PEN); + bitmap.plot_box(LEFT_BORDER,TOP_BORDER, 1,BOTTOM_BORDER-TOP_BORDER+1,LINE_PEN); + bitmap.plot_box(RIGHT_BORDER,TOP_BORDER,1,BOTTOM_BORDER-TOP_BORDER+1,LINE_PEN); /* car 4 */ - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x06], state->m_spriteram[0x07], 0, state->m_spriteram[0x0d] >> 4, CAR4_COLOR); /* car 3 */ - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x04], state->m_spriteram[0x05], 0, state->m_spriteram[0x0d] & 0x0f, CAR3_COLOR); /* car 2 */ - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x02], state->m_spriteram[0x03], 0, state->m_spriteram[0x0c] >> 4, CAR2_COLOR); /* ball */ - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x08], state->m_spriteram[0x09], 1, state->m_spriteram[0x0e] & 0x0f, BALL_COLOR); /* left goal - position determined by bit 6 of the horizontal and vertical timing PROMs */ - drawgfxzoom_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfxzoom_transpen(bitmap,cliprect,screen.machine().gfx[1], 0,0, 0,0, LEFT_GOAL_X,GOAL_Y, 0x20000,0x20000,0); /* right goal */ - drawgfxzoom_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfxzoom_transpen(bitmap,cliprect,screen.machine().gfx[1], 0,1, 1,0, RIGHT_GOAL_X,GOAL_Y, @@ -284,7 +283,7 @@ popmessage("WIDE!\n"); if (state->m_spriteram[0x0f] & 0x01) - draw_sprite(screen->machine(), bitmap, cliprect, + draw_sprite(screen.machine(), bitmap, cliprect, state->m_spriteram[0x0a], state->m_spriteram[0x0b], 1, state->m_spriteram[0x0e] >> 4, SPECIAL_CHAR_COLOR); @@ -295,14 +294,14 @@ and bit 3 of the vertical timing PROM controls in which quadrant the line will actually appear */ - draw_alpha_line(screen->machine(), bitmap, cliprect, 0, (0*4+0)*2 ); - draw_alpha_line(screen->machine(), bitmap, cliprect, 1, (0*4+0)*2+1); - draw_alpha_line(screen->machine(), bitmap, cliprect, 2, (3*4+1)*2 ); - draw_alpha_line(screen->machine(), bitmap, cliprect, 3, (3*4+1)*2+1); - draw_alpha_line(screen->machine(), bitmap, cliprect, 4, (1*4+2)*2 ); - draw_alpha_line(screen->machine(), bitmap, cliprect, 5, (1*4+2)*2+1); - draw_alpha_line(screen->machine(), bitmap, cliprect, 6, (0*4+3)*2 ); - draw_alpha_line(screen->machine(), bitmap, cliprect, 7, (0*4+3)*2+1); + draw_alpha_line(screen.machine(), bitmap, cliprect, 0, (0*4+0)*2 ); + draw_alpha_line(screen.machine(), bitmap, cliprect, 1, (0*4+0)*2+1); + draw_alpha_line(screen.machine(), bitmap, cliprect, 2, (3*4+1)*2 ); + draw_alpha_line(screen.machine(), bitmap, cliprect, 3, (3*4+1)*2+1); + draw_alpha_line(screen.machine(), bitmap, cliprect, 4, (1*4+2)*2 ); + draw_alpha_line(screen.machine(), bitmap, cliprect, 5, (1*4+2)*2+1); + draw_alpha_line(screen.machine(), bitmap, cliprect, 6, (0*4+3)*2 ); + draw_alpha_line(screen.machine(), bitmap, cliprect, 7, (0*4+3)*2+1); return 0; } @@ -360,23 +359,23 @@ normalize_coordinates(&x1, &y1, &x2, &y2); - bitmap_fill(state->m_sprite_sprite_collision_bitmap1, 0, 0); - bitmap_fill(state->m_sprite_sprite_collision_bitmap2, 0, 0); + state->m_sprite_sprite_collision_bitmap1->fill(0); + state->m_sprite_sprite_collision_bitmap2->fill(0); - drawgfx_opaque(state->m_sprite_sprite_collision_bitmap1,0,machine.gfx[0], + drawgfx_opaque(*state->m_sprite_sprite_collision_bitmap1,state->m_sprite_sprite_collision_bitmap1->cliprect(),machine.gfx[0], code1,0, 0,flipy1, x1,y1); - drawgfx_opaque(state->m_sprite_sprite_collision_bitmap2,0,machine.gfx[0], + drawgfx_opaque(*state->m_sprite_sprite_collision_bitmap2,state->m_sprite_sprite_collision_bitmap2->cliprect(),machine.gfx[0], code2,0, 0,flipy2, x2,y2); for (x = x1; x < x1 + SPRITE_WIDTH; x++) for (y = y1; y < y1 + SPRITE_HEIGHT; y++) - if ((*BITMAP_ADDR16(state->m_sprite_sprite_collision_bitmap1, y, x) == 1) && - (*BITMAP_ADDR16(state->m_sprite_sprite_collision_bitmap2, y, x) == 1)) + if ((state->m_sprite_sprite_collision_bitmap1->pix16(y, x) == 1) && + (state->m_sprite_sprite_collision_bitmap2->pix16(y, x) == 1)) { *col_x = (x1 + x) & 0x0f; *col_y = (y1 + y) & 0x0f; @@ -414,15 +413,15 @@ normalize_coordinates(&x1, &y1, &x2, &y2); - bitmap_fill(state->m_sprite_goal_collision_bitmap1, 0, 0); - bitmap_fill(state->m_sprite_goal_collision_bitmap2, 0, 0); + state->m_sprite_goal_collision_bitmap1->fill(0); + state->m_sprite_goal_collision_bitmap2->fill(0); - drawgfx_opaque(state->m_sprite_goal_collision_bitmap1,0,machine.gfx[0], + drawgfx_opaque(*state->m_sprite_goal_collision_bitmap1,state->m_sprite_goal_collision_bitmap1->cliprect(),machine.gfx[0], code1,0, 0,flipy1, x1,y1); - drawgfxzoom_transpen(state->m_sprite_goal_collision_bitmap2,0,machine.gfx[1], + drawgfxzoom_transpen(*state->m_sprite_goal_collision_bitmap2,state->m_sprite_goal_collision_bitmap2->cliprect(),machine.gfx[1], 0,0, 0,0, x2,y2, @@ -430,9 +429,9 @@ for (x = x1; x < x1 + SPRITE_WIDTH; x++) for (y = y1; y < y1 + SPRITE_HEIGHT; y++) - if ((*BITMAP_ADDR16(state->m_sprite_goal_collision_bitmap1, y, x) == 1)) + if ((state->m_sprite_goal_collision_bitmap1->pix16(y, x) == 1)) { - pen_t pix = *BITMAP_ADDR16(state->m_sprite_goal_collision_bitmap2, y, x); + pen_t pix = state->m_sprite_goal_collision_bitmap2->pix16(y, x); if (pix == LEFT_GOAL_PEN) { @@ -472,15 +471,15 @@ normalize_coordinates(&x1, &y1, &x2, &y2); - bitmap_fill(state->m_sprite_goal_collision_bitmap1, 0, 0); - bitmap_fill(state->m_sprite_goal_collision_bitmap2, 0, 0); + state->m_sprite_goal_collision_bitmap1->fill(0); + state->m_sprite_goal_collision_bitmap2->fill(0); - drawgfx_opaque(state->m_sprite_goal_collision_bitmap1,0,machine.gfx[0], + drawgfx_opaque(*state->m_sprite_goal_collision_bitmap1,state->m_sprite_goal_collision_bitmap1->cliprect(),machine.gfx[0], code1,0, 0,flipy1, x1,y1); - drawgfxzoom_transpen(state->m_sprite_goal_collision_bitmap2,0,machine.gfx[1], + drawgfxzoom_transpen(*state->m_sprite_goal_collision_bitmap2,state->m_sprite_goal_collision_bitmap2->cliprect(),machine.gfx[1], 0,1, 1,0, x2,y2, @@ -488,9 +487,9 @@ for (x = x1; x < x1 + SPRITE_WIDTH; x++) for (y = y1; y < y1 + SPRITE_HEIGHT; y++) - if ((*BITMAP_ADDR16(state->m_sprite_goal_collision_bitmap1, y, x) == 1)) + if ((state->m_sprite_goal_collision_bitmap1->pix16(y, x) == 1)) { - pen_t pix = *BITMAP_ADDR16(state->m_sprite_goal_collision_bitmap2, y, x); + pen_t pix = state->m_sprite_goal_collision_bitmap2->pix16(y, x); if (pix == RIGHT_GOAL_PEN) { @@ -521,14 +520,14 @@ x1 = 240 - x1; y1 = 240 - y1; - drawgfx_opaque(state->m_sprite_border_collision_bitmap,0,machine.gfx[0], + drawgfx_opaque(*state->m_sprite_border_collision_bitmap,state->m_sprite_border_collision_bitmap->cliprect(),machine.gfx[0], code1,0, 0,flipy1, 0,0); for (x = 0; x < SPRITE_WIDTH; x++) for (y = 0; y < SPRITE_HEIGHT; y++) - if ((*BITMAP_ADDR16(state->m_sprite_border_collision_bitmap, y, x) == 1)) + if ((state->m_sprite_border_collision_bitmap->pix16(y, x) == 1)) { if (((UINT8)(x1 + x) == LEFT_BORDER) || ((UINT8)(x1 + x) == RIGHT_BORDER)) @@ -549,182 +548,186 @@ } -SCREEN_EOF( carpolo ) +SCREEN_VBLANK( carpolo ) { - carpolo_state *state = machine.driver_data(); - int col_x, col_y; - int car1_x, car2_x, car3_x, car4_x, ball_x; - int car1_y, car2_y, car3_y, car4_y, ball_y; - int car1_code, car2_code, car3_code, car4_code, ball_code; - int car1_flipy, car2_flipy, car3_flipy, car4_flipy, ball_flipy; - - - /* check car-car collision first */ - - car1_x = state->m_spriteram[0x00]; - car1_y = state->m_spriteram[0x01]; - remap_sprite_code(machine, 0, state->m_spriteram[0x0c] & 0x0f, &car1_code, &car1_flipy); - - car2_x = state->m_spriteram[0x02]; - car2_y = state->m_spriteram[0x03]; - remap_sprite_code(machine, 0, state->m_spriteram[0x0c] >> 4, &car2_code, &car2_flipy); - - car3_x = state->m_spriteram[0x04]; - car3_y = state->m_spriteram[0x05]; - remap_sprite_code(machine, 0, state->m_spriteram[0x0d] & 0x0f, &car3_code, &car3_flipy); - - car4_x = state->m_spriteram[0x06]; - car4_y = state->m_spriteram[0x07]; - remap_sprite_code(machine, 0, state->m_spriteram[0x0d] >> 4, &car4_code, &car4_flipy); - - ball_x = state->m_spriteram[0x08]; - ball_y = state->m_spriteram[0x09]; - remap_sprite_code(machine, 1, state->m_spriteram[0x0e] & 0x0f, &ball_code, &ball_flipy); - - - /* cars 1 and 2 */ - if (check_sprite_sprite_collision(machine, - car1_x, car1_y, car1_code, car1_flipy, - car2_x, car2_y, car2_code, car2_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 0, 1); - - /* cars 1 and 3 */ - else if (check_sprite_sprite_collision(machine, - car1_x, car1_y, car1_code, car1_flipy, - car3_x, car3_y, car3_code, car3_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 0, 2); - - /* cars 1 and 4 */ - else if (check_sprite_sprite_collision(machine, - car1_x, car1_y, car1_code, car1_flipy, - car4_x, car4_y, car4_code, car4_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 0, 3); - - /* cars 2 and 3 */ - else if (check_sprite_sprite_collision(machine, - car2_x, car2_y, car2_code, car2_flipy, - car3_x, car3_y, car3_code, car3_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 1, 2); - - /* cars 2 and 4 */ - else if (check_sprite_sprite_collision(machine, - car2_x, car2_y, car2_code, car2_flipy, - car4_x, car4_y, car4_code, car4_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 1, 3); - - /* cars 3 and 4 */ - else if (check_sprite_sprite_collision(machine, - car3_x, car3_y, car3_code, car3_flipy, - car4_x, car4_y, car4_code, car4_flipy, - &col_x, &col_y)) - carpolo_generate_car_car_interrupt(machine, 2, 3); - - - - /* check car-ball collision */ - if (check_sprite_sprite_collision(machine, - car1_x, car1_y, car1_code, car1_flipy, - ball_x, ball_y, ball_code, ball_flipy, - &col_x, &col_y)) - carpolo_generate_car_ball_interrupt(machine, 0, col_x, col_y); - - else if (check_sprite_sprite_collision(machine, - car2_x, car2_y, car2_code, car2_flipy, - ball_x, ball_y, ball_code, ball_flipy, - &col_x, &col_y)) - carpolo_generate_car_ball_interrupt(machine, 1, col_x, col_y); - - else if (check_sprite_sprite_collision(machine, - car3_x, car3_y, car3_code, car3_flipy, - ball_x, ball_y, ball_code, ball_flipy, - &col_x, &col_y)) - carpolo_generate_car_ball_interrupt(machine, 2, col_x, col_y); - - else if (check_sprite_sprite_collision(machine, - car4_x, car4_y, car4_code, car4_flipy, - ball_x, ball_y, ball_code, ball_flipy, - &col_x, &col_y)) - carpolo_generate_car_ball_interrupt(machine, 3, col_x, col_y); - - - /* check car-goal collision */ - if (check_sprite_left_goal_collision(machine, car1_x, car1_y, car1_code, car1_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 0, 0); - - else if (check_sprite_right_goal_collision(machine, car1_x, car1_y, car1_code, car1_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 0, 1); - - else if (check_sprite_left_goal_collision(machine, car2_x, car2_y, car2_code, car2_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 1, 0); - - else if (check_sprite_right_goal_collision(machine, car2_x, car2_y, car2_code, car2_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 1, 1); - - else if (check_sprite_left_goal_collision(machine, car3_x, car3_y, car3_code, car3_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 2, 0); - - else if (check_sprite_right_goal_collision(machine, car3_x, car3_y, car3_code, car3_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 2, 1); - - else if (check_sprite_left_goal_collision(machine, car4_x, car4_y, car4_code, car4_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 3, 0); + // rising edge + if (vblank_on) + { + carpolo_state *state = screen.machine().driver_data(); + int col_x, col_y; + int car1_x, car2_x, car3_x, car4_x, ball_x; + int car1_y, car2_y, car3_y, car4_y, ball_y; + int car1_code, car2_code, car3_code, car4_code, ball_code; + int car1_flipy, car2_flipy, car3_flipy, car4_flipy, ball_flipy; + + + /* check car-car collision first */ + + car1_x = state->m_spriteram[0x00]; + car1_y = state->m_spriteram[0x01]; + remap_sprite_code(screen.machine(), 0, state->m_spriteram[0x0c] & 0x0f, &car1_code, &car1_flipy); + + car2_x = state->m_spriteram[0x02]; + car2_y = state->m_spriteram[0x03]; + remap_sprite_code(screen.machine(), 0, state->m_spriteram[0x0c] >> 4, &car2_code, &car2_flipy); + + car3_x = state->m_spriteram[0x04]; + car3_y = state->m_spriteram[0x05]; + remap_sprite_code(screen.machine(), 0, state->m_spriteram[0x0d] & 0x0f, &car3_code, &car3_flipy); + + car4_x = state->m_spriteram[0x06]; + car4_y = state->m_spriteram[0x07]; + remap_sprite_code(screen.machine(), 0, state->m_spriteram[0x0d] >> 4, &car4_code, &car4_flipy); + + ball_x = state->m_spriteram[0x08]; + ball_y = state->m_spriteram[0x09]; + remap_sprite_code(screen.machine(), 1, state->m_spriteram[0x0e] & 0x0f, &ball_code, &ball_flipy); + + + /* cars 1 and 2 */ + if (check_sprite_sprite_collision(screen.machine(), + car1_x, car1_y, car1_code, car1_flipy, + car2_x, car2_y, car2_code, car2_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 0, 1); + + /* cars 1 and 3 */ + else if (check_sprite_sprite_collision(screen.machine(), + car1_x, car1_y, car1_code, car1_flipy, + car3_x, car3_y, car3_code, car3_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 0, 2); + + /* cars 1 and 4 */ + else if (check_sprite_sprite_collision(screen.machine(), + car1_x, car1_y, car1_code, car1_flipy, + car4_x, car4_y, car4_code, car4_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 0, 3); + + /* cars 2 and 3 */ + else if (check_sprite_sprite_collision(screen.machine(), + car2_x, car2_y, car2_code, car2_flipy, + car3_x, car3_y, car3_code, car3_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 1, 2); + + /* cars 2 and 4 */ + else if (check_sprite_sprite_collision(screen.machine(), + car2_x, car2_y, car2_code, car2_flipy, + car4_x, car4_y, car4_code, car4_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 1, 3); + + /* cars 3 and 4 */ + else if (check_sprite_sprite_collision(screen.machine(), + car3_x, car3_y, car3_code, car3_flipy, + car4_x, car4_y, car4_code, car4_flipy, + &col_x, &col_y)) + carpolo_generate_car_car_interrupt(screen.machine(), 2, 3); + + + + /* check car-ball collision */ + if (check_sprite_sprite_collision(screen.machine(), + car1_x, car1_y, car1_code, car1_flipy, + ball_x, ball_y, ball_code, ball_flipy, + &col_x, &col_y)) + carpolo_generate_car_ball_interrupt(screen.machine(), 0, col_x, col_y); + + else if (check_sprite_sprite_collision(screen.machine(), + car2_x, car2_y, car2_code, car2_flipy, + ball_x, ball_y, ball_code, ball_flipy, + &col_x, &col_y)) + carpolo_generate_car_ball_interrupt(screen.machine(), 1, col_x, col_y); + + else if (check_sprite_sprite_collision(screen.machine(), + car3_x, car3_y, car3_code, car3_flipy, + ball_x, ball_y, ball_code, ball_flipy, + &col_x, &col_y)) + carpolo_generate_car_ball_interrupt(screen.machine(), 2, col_x, col_y); + + else if (check_sprite_sprite_collision(screen.machine(), + car4_x, car4_y, car4_code, car4_flipy, + ball_x, ball_y, ball_code, ball_flipy, + &col_x, &col_y)) + carpolo_generate_car_ball_interrupt(screen.machine(), 3, col_x, col_y); + + + /* check car-goal collision */ + if (check_sprite_left_goal_collision(screen.machine(), car1_x, car1_y, car1_code, car1_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 0, 0); + + else if (check_sprite_right_goal_collision(screen.machine(), car1_x, car1_y, car1_code, car1_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 0, 1); + + else if (check_sprite_left_goal_collision(screen.machine(), car2_x, car2_y, car2_code, car2_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 1, 0); + + else if (check_sprite_right_goal_collision(screen.machine(), car2_x, car2_y, car2_code, car2_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 1, 1); + + else if (check_sprite_left_goal_collision(screen.machine(), car3_x, car3_y, car3_code, car3_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 2, 0); + + else if (check_sprite_right_goal_collision(screen.machine(), car3_x, car3_y, car3_code, car3_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 2, 1); - else if (check_sprite_right_goal_collision(machine, car4_x, car4_y, car4_code, car4_flipy, 1)) - carpolo_generate_car_goal_interrupt(machine, 3, 1); + else if (check_sprite_left_goal_collision(screen.machine(), car4_x, car4_y, car4_code, car4_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 3, 0); + else if (check_sprite_right_goal_collision(screen.machine(), car4_x, car4_y, car4_code, car4_flipy, 1)) + carpolo_generate_car_goal_interrupt(screen.machine(), 3, 1); - /* check ball collision with static screen elements */ - { - int col; - col = check_sprite_left_goal_collision(machine, ball_x, ball_y, ball_code, ball_flipy, 0); - - if (col == 1) carpolo_generate_ball_screen_interrupt(machine, 0x05); - if (col == 2) carpolo_generate_ball_screen_interrupt(machine, 0x03); + /* check ball collision with static screen elements */ + { + int col; + col = check_sprite_left_goal_collision(screen.machine(), ball_x, ball_y, ball_code, ball_flipy, 0); - col = check_sprite_right_goal_collision(machine, ball_x, ball_y, ball_code, ball_flipy, 0); + if (col == 1) carpolo_generate_ball_screen_interrupt(screen.machine(), 0x05); + if (col == 2) carpolo_generate_ball_screen_interrupt(screen.machine(), 0x03); - if (col == 1) carpolo_generate_ball_screen_interrupt(machine, 0x05 | 0x08); - if (col == 2) carpolo_generate_ball_screen_interrupt(machine, 0x03 | 0x08); + col = check_sprite_right_goal_collision(screen.machine(), ball_x, ball_y, ball_code, ball_flipy, 0); - if (check_sprite_border_collision(machine, ball_x, ball_y, ball_code, ball_flipy)) - carpolo_generate_ball_screen_interrupt(machine, 0x06); - } + if (col == 1) carpolo_generate_ball_screen_interrupt(screen.machine(), 0x05 | 0x08); + if (col == 2) carpolo_generate_ball_screen_interrupt(screen.machine(), 0x03 | 0x08); - /* check car-border collision */ - { - int col; + if (check_sprite_border_collision(screen.machine(), ball_x, ball_y, ball_code, ball_flipy)) + carpolo_generate_ball_screen_interrupt(screen.machine(), 0x06); + } - col = check_sprite_border_collision(machine, car1_x, car1_y, car1_code, car1_flipy); - if (col) - carpolo_generate_car_border_interrupt(machine, 0, (col == 2)); - else + /* check car-border collision */ { - col = check_sprite_border_collision(machine, car2_x, car2_y, car2_code, car2_flipy); + int col; + + col = check_sprite_border_collision(screen.machine(), car1_x, car1_y, car1_code, car1_flipy); if (col) - carpolo_generate_car_border_interrupt(machine, 1, (col == 2)); + carpolo_generate_car_border_interrupt(screen.machine(), 0, (col == 2)); else { - col = check_sprite_border_collision(machine, car3_x, car3_y, car3_code, car3_flipy); + col = check_sprite_border_collision(screen.machine(), car2_x, car2_y, car2_code, car2_flipy); if (col) - carpolo_generate_car_border_interrupt(machine, 2, (col == 2)); + carpolo_generate_car_border_interrupt(screen.machine(), 1, (col == 2)); else { - col = check_sprite_border_collision(machine, car4_x, car4_y, car4_code, car4_flipy); + col = check_sprite_border_collision(screen.machine(), car3_x, car3_y, car3_code, car3_flipy); if (col) - carpolo_generate_car_border_interrupt(machine, 3, (col == 2)); + carpolo_generate_car_border_interrupt(screen.machine(), 2, (col == 2)); + else + { + col = check_sprite_border_collision(screen.machine(), car4_x, car4_y, car4_code, car4_flipy); + + if (col) + carpolo_generate_car_border_interrupt(screen.machine(), 3, (col == 2)); + } } } } diff -Nru mame-0.144/src/mame/video/cave.c mame-0.145/src/mame/video/cave.c --- mame-0.144/src/mame/video/cave.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/cave.c 2012-02-06 21:30:32.000000000 +0000 @@ -224,7 +224,7 @@ ***************************************************************************/ -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int GFX ) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int GFX ) { cave_state *state = machine.driver_data(); UINT16 *VRAM = state->m_vram[GFX]; @@ -253,7 +253,7 @@ } SET_TILE_INFO( GFX, code, color, 0 ); - tileinfo->category = pri; + tileinfo.category = pri; } @@ -265,7 +265,7 @@ if (state->m_sailormn_tilebank != bank) { state->m_sailormn_tilebank = bank; - tilemap_mark_all_tiles_dirty(state->m_tilemap[2]); + state->m_tilemap[2]->mark_all_dirty(); } } @@ -299,7 +299,7 @@ } SET_TILE_INFO( 2, code, color, 0 ); - tileinfo->category = pri; + tileinfo.category = pri; } @@ -317,13 +317,13 @@ if (offset < 0x1000 / 4) // 16x16 tilemap { offset = (offset % (512 / 16)) * 2 + (offset / (512 / 16)) * (512 / 8) * 2; - tilemap_mark_tile_dirty(TILEMAP, offset + 0); - tilemap_mark_tile_dirty(TILEMAP, offset + 1); - tilemap_mark_tile_dirty(TILEMAP, offset + 0 + 512 / 8); - tilemap_mark_tile_dirty(TILEMAP, offset + 1 + 512 / 8); + TILEMAP->mark_tile_dirty(offset + 0); + TILEMAP->mark_tile_dirty(offset + 1); + TILEMAP->mark_tile_dirty(offset + 0 + 512 / 8); + TILEMAP->mark_tile_dirty(offset + 1 + 512 / 8); } else if (offset >= 0x4000 / 4) // 8x8 tilemap - tilemap_mark_tile_dirty(TILEMAP, offset - 0x4000 / 4); + TILEMAP->mark_tile_dirty(offset - 0x4000 / 4); } /* Some games, that only ever use the 8x8 tiles and no line scroll, @@ -343,7 +343,7 @@ COMBINE_DATA(&VRAM[offset + 0x0000 / 2]); COMBINE_DATA(&VRAM[offset + 0x4000 / 2]); - tilemap_mark_tile_dirty(TILEMAP,offset / 2); + TILEMAP->mark_tile_dirty(offset / 2); } @@ -399,33 +399,33 @@ { case 4: state->m_tilemap[3] = tilemap_create(machine, get_tile_info_3, tilemap_scan_rows, 8, 8, 512 / 8, 512 / 8); - tilemap_set_transparent_pen(state->m_tilemap[3], 0); - tilemap_set_scroll_rows(state->m_tilemap[3], 1); - tilemap_set_scroll_cols(state->m_tilemap[3], 1); + state->m_tilemap[3]->set_transparent_pen(0); + state->m_tilemap[3]->set_scroll_rows(1); + state->m_tilemap[3]->set_scroll_cols(1); state->save_item(NAME(state->m_tiledim[3])); state->save_item(NAME(state->m_old_tiledim[3])); case 3: state->m_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 512 / 8, 512 / 8); - tilemap_set_transparent_pen(state->m_tilemap[2], 0); - tilemap_set_scroll_rows(state->m_tilemap[2], 1); - tilemap_set_scroll_cols(state->m_tilemap[2], 1); + state->m_tilemap[2]->set_transparent_pen(0); + state->m_tilemap[2]->set_scroll_rows(1); + state->m_tilemap[2]->set_scroll_cols(1); state->save_item(NAME(state->m_tiledim[2])); state->save_item(NAME(state->m_old_tiledim[2])); case 2: state->m_tilemap[1] = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 8, 8, 512 / 8, 512 / 8); - tilemap_set_transparent_pen(state->m_tilemap[1], 0); - tilemap_set_scroll_rows(state->m_tilemap[1], 1); - tilemap_set_scroll_cols(state->m_tilemap[1], 1); + state->m_tilemap[1]->set_transparent_pen(0); + state->m_tilemap[1]->set_scroll_rows(1); + state->m_tilemap[1]->set_scroll_cols(1); state->save_item(NAME(state->m_tiledim[1])); state->save_item(NAME(state->m_old_tiledim[1])); case 1: state->m_tilemap[0] = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 8, 8, 512 / 8, 512 / 8); - tilemap_set_transparent_pen(state->m_tilemap[0], 0); - tilemap_set_scroll_rows(state->m_tilemap[0], 1); - tilemap_set_scroll_cols(state->m_tilemap[0], 1); + state->m_tilemap[0]->set_transparent_pen(0); + state->m_tilemap[0]->set_scroll_rows(1); + state->m_tilemap[0]->set_scroll_cols(1); state->save_item(NAME(state->m_tiledim[0])); state->save_item(NAME(state->m_old_tiledim[0])); @@ -474,9 +474,9 @@ /* Layer 2 (8x8) needs to be handled differently */ state->m_tilemap[2] = tilemap_create(machine, sailormn_get_tile_info_2, tilemap_scan_rows, 8, 8, 512 / 8, 512 / 8 ); - tilemap_set_transparent_pen(state->m_tilemap[2], 0); - tilemap_set_scroll_rows(state->m_tilemap[2], 1); - tilemap_set_scroll_cols(state->m_tilemap[2], 1); + state->m_tilemap[2]->set_transparent_pen(0); + state->m_tilemap[2]->set_scroll_rows(1); + state->m_tilemap[2]->set_scroll_cols(1); } /*************************************************************************** @@ -730,8 +730,6 @@ static void sprite_init_cave( running_machine &machine ) { cave_state *state = machine.driver_data(); - int screen_width = machine.primary_screen->width(); - int screen_height = machine.primary_screen->height(); if (state->m_spritetype[0] == 0 || state->m_spritetype[0] == 2) // most of the games { @@ -745,9 +743,7 @@ } state->m_sprite_zbuf_baseval = 0x10000 - MAX_SPRITE_NUM; - state->m_sprite_zbuf = auto_bitmap_alloc(machine, screen_width, screen_height, BITMAP_FORMAT_INDEXED16); - state->m_blit.baseaddr_zbuf = (UINT8 *)state->m_sprite_zbuf->base; - state->m_blit.line_offset_zbuf = state->m_sprite_zbuf->rowpixels * state->m_sprite_zbuf->bpp / 8; + machine.primary_screen->register_screen_bitmap(state->m_sprite_zbuf); state->m_num_sprites = state->m_spriteram_size / 0x10 / 2; state->m_sprite = auto_alloc_array_clear(machine, struct sprite_cave, state->m_num_sprites); @@ -755,7 +751,7 @@ memset(state->m_sprite_table, 0, sizeof(state->m_sprite_table)); state->m_sprite_draw = sprite_draw_donpachi; - state->save_item(NAME(*state->m_sprite_zbuf)); + state->save_item(NAME(state->m_sprite_zbuf)); state->save_item(NAME(state->m_sprite_zbuf_baseval)); state->save_item(NAME(state->m_num_sprites)); state->save_item(NAME(state->m_spriteram_bank)); @@ -769,15 +765,15 @@ machine.save().register_postload(save_prepost_delegate(FUNC(cave_get_sprite_info), &machine)); } -static void cave_sprite_check( screen_device &screen, const rectangle *clip ) +static void cave_sprite_check( screen_device &screen, const rectangle &clip ) { cave_state *state = screen.machine().driver_data(); { /* set clip */ - int left = clip->min_x; - int top = clip->min_y; - int right = clip->max_x + 1; - int bottom = clip->max_y + 1; + int left = clip.min_x; + int top = clip.min_y; + int right = clip.max_x + 1; + int bottom = clip.max_y + 1; state->m_blit.clip_left = left; state->m_blit.clip_top = top; @@ -824,19 +820,19 @@ case CAVE_SPRITETYPE_ZOOM | CAVE_SPRITETYPE_ZBUF: state->m_sprite_draw = sprite_draw_cave_zbuf; - if (clip->min_y == visarea.min_y) + if (clip.min_y == visarea.min_y) { if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - bitmap_fill(state->m_sprite_zbuf, &visarea, 0); + state->m_sprite_zbuf.fill(0, visarea); } break; case CAVE_SPRITETYPE_ZBUF: state->m_sprite_draw = sprite_draw_donpachi_zbuf; - if (clip->min_y == visarea.min_y) + if (clip.min_y == visarea.min_y) { if(!(state->m_sprite_zbuf_baseval += MAX_SPRITE_NUM)) - bitmap_fill(state->m_sprite_zbuf,&visarea,0); + state->m_sprite_zbuf.fill(0, visarea); } break; @@ -1418,7 +1414,7 @@ ***************************************************************************/ INLINE void cave_tilemap_draw( - running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, + running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 flags, UINT32 priority, UINT32 priority2, int GFX ) { cave_state *state = machine.driver_data(); @@ -1436,7 +1432,7 @@ flipx = ~VCTRL[0] & 0x8000; flipy = ~VCTRL[1] & 0x8000; - tilemap_set_flip(TILEMAP, (flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0) ); + TILEMAP->set_flip((flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0) ); offs_x = state->m_layers_offs_x; offs_y = state->m_layers_offs_y; @@ -1467,17 +1463,17 @@ tilemap_draw multiple times. */ - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; - for (startline = cliprect->min_y; startline <= cliprect->max_y;) + for (startline = cliprect.min_y; startline <= cliprect.max_y;) { /* Find the largest slice */ vramdata0 = (vramdata1 = VRAM[(0x1002 + (((sy + offs_row + startline) * 4) & 0x7ff)) / 2]); - for(endline = startline + 1; endline <= cliprect->max_y; endline++) + for(endline = startline + 1; endline <= cliprect.max_y; endline++) if((++vramdata1) != VRAM[(0x1002 + (((sy + offs_row + endline) * 4) & 0x7ff)) / 2]) break; - tilemap_set_scrolly(TILEMAP, 0, vramdata0 - startline); + TILEMAP->set_scrolly(0, vramdata0 - startline); if (VCTRL[0] & 0x4000) // row-scroll, row-select { @@ -1491,21 +1487,21 @@ tilemap_draw just once. */ - tilemap_set_scroll_rows(TILEMAP, 512); + TILEMAP->set_scroll_rows(512); for(line = startline; line < endline; line++) - tilemap_set_scrollx(TILEMAP, (vramdata0 - startline + line) & 511, + TILEMAP->set_scrollx((vramdata0 - startline + line) & 511, sx + VRAM[(0x1000 + (((sy + offs_row + line) * 4) & 0x7ff)) / 2]); } else // no row-scroll, row-select { - tilemap_set_scroll_rows(TILEMAP, 1); - tilemap_set_scrollx(TILEMAP, 0, sx); + TILEMAP->set_scroll_rows(1); + TILEMAP->set_scrollx(0, sx); } if (flipy) { - clip.min_y = cliprect->max_y - (endline - 1 - cliprect->min_y); - clip.max_y = cliprect->max_y - (startline - cliprect->min_y); + clip.min_y = cliprect.max_y - (endline - 1 - cliprect.min_y); + clip.max_y = cliprect.max_y - (startline - cliprect.min_y); } else { @@ -1513,7 +1509,7 @@ clip.max_y = endline - 1; } - tilemap_draw(bitmap, &clip, TILEMAP, flags, priority); + TILEMAP->draw(bitmap, clip, flags, priority); startline = endline; } @@ -1521,35 +1517,37 @@ else if (VCTRL[0] & 0x4000) // row-scroll, no row-select { int line; - tilemap_set_scroll_rows(TILEMAP, 512); - for(line = cliprect->min_y; line <= cliprect->max_y; line++) - tilemap_set_scrollx(TILEMAP, (line + sy) & 511, + TILEMAP->set_scroll_rows(512); + for(line = cliprect.min_y; line <= cliprect.max_y; line++) + TILEMAP->set_scrollx((line + sy) & 511, sx + VRAM[(0x1000+(((sy + offs_row + line) * 4) & 0x7ff)) / 2] ); - tilemap_set_scrolly(TILEMAP, 0, sy); - tilemap_draw(bitmap, cliprect, TILEMAP, flags, priority); + TILEMAP->set_scrolly(0, sy); + TILEMAP->draw(bitmap, cliprect, flags, priority); } else { /* DEF_STR( Normal ) scrolling */ - tilemap_set_scroll_rows(TILEMAP, 1); - tilemap_set_scroll_cols(TILEMAP, 1); - tilemap_set_scrollx(TILEMAP, 0, sx); - tilemap_set_scrolly(TILEMAP, 0, sy); - tilemap_draw(bitmap, cliprect, TILEMAP, flags, priority); + TILEMAP->set_scroll_rows(1); + TILEMAP->set_scroll_cols(1); + TILEMAP->set_scrollx(0, sx); + TILEMAP->set_scrolly(0, sy); + TILEMAP->draw(bitmap, cliprect, flags, priority); } } -SCREEN_UPDATE( cave ) +SCREEN_UPDATE_IND16( cave ) { - cave_state *state = screen->machine().driver_data(); + cave_state *state = screen.machine().driver_data(); int pri, pri2, GFX; int layers_ctrl = -1; - set_pens(screen->machine()); + set_pens(screen.machine()); - state->m_blit.baseaddr = (UINT8 *)bitmap->base; - state->m_blit.line_offset = bitmap->rowpixels * bitmap->bpp / 8; + state->m_blit.baseaddr = reinterpret_cast(bitmap.raw_pixptr(0)); + state->m_blit.line_offset = bitmap.rowbytes(); + state->m_blit.baseaddr_zbuf = reinterpret_cast(state->m_sprite_zbuf.raw_pixptr(0)); + state->m_blit.line_offset_zbuf = state->m_sprite_zbuf.rowbytes(); /* Choose the tilemap to display (8x8 tiles or 16x16 tiles) */ for (GFX = 0; GFX < 4; GFX++) @@ -1558,29 +1556,29 @@ { state->m_tiledim[GFX] = state->m_vctrl[GFX][1] & 0x2000; if (state->m_tiledim[GFX] != state->m_old_tiledim[GFX]) - tilemap_mark_all_tiles_dirty(state->m_tilemap[GFX]); + state->m_tilemap[GFX]->mark_all_dirty(); state->m_old_tiledim[GFX] = state->m_tiledim[GFX]; } } #ifdef MAME_DEBUG { - if ( screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X) || screen->machine().input().code_pressed(KEYCODE_C) || - screen->machine().input().code_pressed(KEYCODE_V) || screen->machine().input().code_pressed(KEYCODE_B) ) + if ( screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X) || screen.machine().input().code_pressed(KEYCODE_C) || + screen.machine().input().code_pressed(KEYCODE_V) || screen.machine().input().code_pressed(KEYCODE_B) ) { int msk = 0, val = 0; - if (screen->machine().input().code_pressed(KEYCODE_X)) val = 1; // priority 0 only - if (screen->machine().input().code_pressed(KEYCODE_C)) val = 2; // "" 1 - if (screen->machine().input().code_pressed(KEYCODE_V)) val = 4; // "" 2 - if (screen->machine().input().code_pressed(KEYCODE_B)) val = 8; // "" 3 - if (screen->machine().input().code_pressed(KEYCODE_Z)) val = 1|2|4|8; // All of the above priorities - - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= val << 0; // for layer 0 - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= val << 4; // for layer 1 - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= val << 8; // for layer 2 - if (screen->machine().input().code_pressed(KEYCODE_R)) msk |= val << 12; // for layer 3 - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= val << 16; // for sprites + if (screen.machine().input().code_pressed(KEYCODE_X)) val = 1; // priority 0 only + if (screen.machine().input().code_pressed(KEYCODE_C)) val = 2; // "" 1 + if (screen.machine().input().code_pressed(KEYCODE_V)) val = 4; // "" 2 + if (screen.machine().input().code_pressed(KEYCODE_B)) val = 8; // "" 3 + if (screen.machine().input().code_pressed(KEYCODE_Z)) val = 1|2|4|8; // All of the above priorities + + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= val << 0; // for layer 0 + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= val << 4; // for layer 1 + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= val << 8; // for layer 2 + if (screen.machine().input().code_pressed(KEYCODE_R)) msk |= val << 12; // for layer 3 + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= val << 16; // for sprites if (msk != 0) layers_ctrl &= msk; #if 1 @@ -1619,9 +1617,9 @@ } #endif - cave_sprite_check(*screen, cliprect); + cave_sprite_check(screen, cliprect); - bitmap_fill(bitmap, cliprect, state->m_background_color); + bitmap.fill(state->m_background_color, cliprect); /* Tiles and sprites are ordered by priority (0 back, 3 front) with @@ -1637,14 +1635,14 @@ */ for (pri = 0; pri <= 3; pri++) // tile / sprite priority { - if (layers_ctrl & (1 << (pri + 16))) (*state->m_sprite_draw)(screen->machine(), pri); + if (layers_ctrl & (1 << (pri + 16))) (*state->m_sprite_draw)(screen.machine(), pri); for (pri2 = 0; pri2 <= 3; pri2++) // priority of the whole layer { - if (layers_ctrl & (1 << (pri + 0))) cave_tilemap_draw(screen->machine(), bitmap, cliprect, pri, 0, pri2, 0); - if (layers_ctrl & (1 << (pri + 4))) cave_tilemap_draw(screen->machine(), bitmap, cliprect, pri, 0, pri2, 1); - if (layers_ctrl & (1 << (pri + 8))) cave_tilemap_draw(screen->machine(), bitmap, cliprect, pri, 0, pri2, 2); - if (layers_ctrl & (1 << (pri + 12))) cave_tilemap_draw(screen->machine(), bitmap, cliprect, pri, 0, pri2, 3); + if (layers_ctrl & (1 << (pri + 0))) cave_tilemap_draw(screen.machine(), bitmap, cliprect, pri, 0, pri2, 0); + if (layers_ctrl & (1 << (pri + 4))) cave_tilemap_draw(screen.machine(), bitmap, cliprect, pri, 0, pri2, 1); + if (layers_ctrl & (1 << (pri + 8))) cave_tilemap_draw(screen.machine(), bitmap, cliprect, pri, 0, pri2, 2); + if (layers_ctrl & (1 << (pri + 12))) cave_tilemap_draw(screen.machine(), bitmap, cliprect, pri, 0, pri2, 3); } } return 0; diff -Nru mame-0.144/src/mame/video/cbasebal.c mame-0.145/src/mame/video/cbasebal.c --- mame-0.144/src/mame/video/cbasebal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/cbasebal.c 2012-02-06 21:30:31.000000000 +0000 @@ -48,7 +48,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(3); state->save_pointer(NAME(state->m_textram), 0x1000); state->save_pointer(NAME(state->m_scrollram), 0x1000); @@ -67,7 +67,7 @@ cbasebal_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x7ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x7ff); } READ8_HANDLER( cbasebal_textram_r ) @@ -81,7 +81,7 @@ cbasebal_state *state = space->machine().driver_data(); state->m_scrollram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } READ8_HANDLER( cbasebal_scrollram_r ) @@ -98,7 +98,7 @@ /* bit 1 is flip screen */ state->m_flipscreen = data & 0x02; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* bit 2 is unknown - unused? */ @@ -106,7 +106,7 @@ if (state->m_tilebank != ((data & 0x08) >> 3)) { state->m_tilebank = (data & 0x08) >> 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 4 is sprite bank */ @@ -126,14 +126,14 @@ { cbasebal_state *state = space->machine().driver_data(); state->m_scroll_x[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_x[0] + 256 * state->m_scroll_x[1]); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x[0] + 256 * state->m_scroll_x[1]); } WRITE8_HANDLER( cbasebal_scrolly_w ) { cbasebal_state *state = space->machine().driver_data(); state->m_scroll_y[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_y[0] + 256 * state->m_scroll_y[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_y[0] + 256 * state->m_scroll_y[1]); } @@ -144,7 +144,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cbasebal_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -178,19 +178,19 @@ } } -SCREEN_UPDATE( cbasebal ) +SCREEN_UPDATE_IND16( cbasebal ) { - cbasebal_state *state = screen->machine().driver_data(); + cbasebal_state *state = screen.machine().driver_data(); if (state->m_bg_on) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, 768); + bitmap.fill(768, cliprect); if (state->m_obj_on) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (state->m_text_on) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/cbuster.c mame-0.145/src/mame/video/cbuster.c --- mame-0.144/src/mame/video/cbuster.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cbuster.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,17 +44,17 @@ VIDEO_START( twocrude ) { - machine.device("spritegen")->alloc_sprite_bitmap(machine); + machine.device("spritegen")->alloc_sprite_bitmap(); } -SCREEN_UPDATE( twocrude ) +SCREEN_UPDATE_RGB32( twocrude ) { - cbuster_state *state = screen->machine().driver_data(); + cbuster_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), !BIT(flip, 7)); + flip_screen_set(screen.machine(), !BIT(flip, 7)); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16_buffer, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram16_buffer, 0x400); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); @@ -62,8 +62,8 @@ /* Draw playfields & sprites */ deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0800, 0x0900, 0x100, 0x0ff); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0900, 0x0900, 0x500, 0x0ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0900, 0x100, 0x0ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0900, 0x0900, 0x500, 0x0ff); if (state->m_pri) { @@ -76,8 +76,8 @@ deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); } - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0900, 0x100, 0x0ff); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0100, 0x0900, 0x500, 0x0ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0900, 0x100, 0x0ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0100, 0x0900, 0x500, 0x0ff); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ccastles.c mame-0.145/src/mame/video/ccastles.c --- mame-0.144/src/mame/video/ccastles.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ccastles.c 2012-02-06 21:30:33.000000000 +0000 @@ -32,7 +32,7 @@ 3, resistances, state->m_bweights, 1000, 0); /* allocate a bitmap for drawing sprites */ - state->m_spritebitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_spritebitmap); /* register for savestates */ state->save_item(NAME(state->m_video_control)); @@ -265,16 +265,16 @@ * *************************************/ -SCREEN_UPDATE( ccastles ) +SCREEN_UPDATE_IND16( ccastles ) { - ccastles_state *state = screen->machine().driver_data(); + ccastles_state *state = screen.machine().driver_data(); UINT8 *spriteaddr = &state->m_spriteram[state->m_video_control[7] * 0x100]; /* BUF1/BUF2 */ int flip = state->m_video_control[4] ? 0xff : 0x00; /* PLAYER2 */ - pen_t black = get_black_pen(screen->machine()); + pen_t black = get_black_pen(screen.machine()); int x, y, offs; /* draw the sprites */ - bitmap_fill(state->m_spritebitmap, cliprect, 0x0f); + state->m_spritebitmap.fill(0x0f, cliprect); for (offs = 0; offs < 320/2; offs += 4) { int x = spriteaddr[offs + 3]; @@ -282,25 +282,25 @@ int which = spriteaddr[offs]; int color = spriteaddr[offs + 2] >> 7; - drawgfx_transpen(state->m_spritebitmap, cliprect, screen->machine().gfx[0], which, color, flip, flip, x, y, 7); + drawgfx_transpen(state->m_spritebitmap, cliprect, screen.machine().gfx[0], which, color, flip, flip, x, y, 7); } /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *dst = &bitmap.pix16(y); /* if we're in the VBLANK region, just fill with black */ if (state->m_syncprom[y] & 1) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = black; } /* non-VBLANK region: merge the sprites and the bitmap */ else { - UINT16 *mosrc = (UINT16 *)state->m_spritebitmap->base + y * state->m_spritebitmap->rowpixels; + UINT16 *mosrc = &state->m_spritebitmap.pix16(y); int effy = (((y - state->m_vblank_end) + (flip ? 0 : state->m_vscroll)) ^ flip) & 0xff; UINT8 *src; @@ -310,7 +310,7 @@ src = &state->m_videoram[effy * 128]; /* loop over X */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { /* if we're in the HBLANK region, just store black */ if (x >= 256) diff -Nru mame-0.144/src/mame/video/cchasm.c mame-0.145/src/mame/video/cchasm.c --- mame-0.144/src/mame/video/cchasm.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/cchasm.c 2012-02-06 21:30:32.000000000 +0000 @@ -124,8 +124,8 @@ cchasm_state *state = machine.driver_data(); const rectangle &visarea = machine.primary_screen->visible_area(); - state->m_xcenter=((visarea.max_x + visarea.min_x)/2) << 16; - state->m_ycenter=((visarea.max_y + visarea.min_y)/2) << 16; + state->m_xcenter=visarea.xcenter() << 16; + state->m_ycenter=visarea.ycenter() << 16; VIDEO_START_CALL(vector); } diff -Nru mame-0.144/src/mame/video/cclimber.c mame-0.145/src/mame/video/cclimber.c --- mame-0.144/src/mame/video/cclimber.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cclimber.c 2012-02-06 21:30:33.000000000 +0000 @@ -400,7 +400,7 @@ int code, color; /* only the lower right is visible */ - tileinfo->group = ((tile_index & 0x210) == 0x210) ? 0 : 1; + tileinfo.group = ((tile_index & 0x210) == 0x210) ? 0 : 1; /* the address doesn't use A4 of the coordinates, giving a 16x16 map */ tile_index = ((tile_index & 0x1e0) >> 1) | (tile_index & 0x0f); @@ -418,7 +418,7 @@ int code, color; /* only the lower right is visible */ - tileinfo->group = ((tile_index & 0x210) == 0x210) ? 0 : 1; + tileinfo.group = ((tile_index & 0x210) == 0x210) ? 0 : 1; /* the address doesn't use A4 of the coordinates, giving a 16x16 map */ tile_index = ((tile_index & 0x1e0) >> 1) | (tile_index & 0x0f); @@ -444,14 +444,14 @@ { cclimber_state *state = machine.driver_data(); state->m_pf_tilemap = tilemap_create(machine, cclimber_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_pf_tilemap, 0); - tilemap_set_scroll_cols(state->m_pf_tilemap, 32); + state->m_pf_tilemap->set_transparent_pen(0); + state->m_pf_tilemap->set_scroll_cols(32); state->m_bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bs_tilemap, 1); - tilemap_set_scroll_rows(state->m_bs_tilemap, 1); - tilemap_set_transmask(state->m_bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */ - tilemap_set_transmask(state->m_bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */ + state->m_bs_tilemap->set_scroll_cols(1); + state->m_bs_tilemap->set_scroll_rows(1); + state->m_bs_tilemap->set_transmask(0, 0x01, 0); /* pen 0 is transaprent */ + state->m_bs_tilemap->set_transmask(1, 0x0f, 0); /* all 4 pens are transparent */ } @@ -459,14 +459,14 @@ { cclimber_state *state = machine.driver_data(); state->m_pf_tilemap = tilemap_create(machine, swimmer_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_pf_tilemap, 0); - tilemap_set_scroll_cols(state->m_pf_tilemap, 32); + state->m_pf_tilemap->set_transparent_pen(0); + state->m_pf_tilemap->set_scroll_cols(32); state->m_bs_tilemap = tilemap_create(machine, cclimber_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bs_tilemap, 1); - tilemap_set_scroll_rows(state->m_bs_tilemap, 1); - tilemap_set_transmask(state->m_bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */ - tilemap_set_transmask(state->m_bs_tilemap, 1, 0xff, 0); /* all 8 pens are transparent */ + state->m_bs_tilemap->set_scroll_cols(1); + state->m_bs_tilemap->set_scroll_rows(1); + state->m_bs_tilemap->set_transmask(0, 0x01, 0); /* pen 0 is transaprent */ + state->m_bs_tilemap->set_transmask(1, 0xff, 0); /* all 8 pens are transparent */ } @@ -474,35 +474,35 @@ { cclimber_state *state = machine.driver_data(); state->m_pf_tilemap = tilemap_create(machine, toprollr_get_pf_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_pf_tilemap, 0); + state->m_pf_tilemap->set_transparent_pen(0); state->m_toproller_bg_tilemap = tilemap_create(machine, toproller_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_toproller_bg_tilemap, 1); + state->m_toproller_bg_tilemap->set_scroll_rows(1); state->m_bs_tilemap = tilemap_create(machine, toprollr_get_bs_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bs_tilemap, 1); - tilemap_set_scroll_rows(state->m_bs_tilemap, 1); - tilemap_set_transmask(state->m_bs_tilemap, 0, 0x01, 0); /* pen 0 is transaprent */ - tilemap_set_transmask(state->m_bs_tilemap, 1, 0x0f, 0); /* all 4 pens are transparent */ + state->m_bs_tilemap->set_scroll_cols(1); + state->m_bs_tilemap->set_scroll_rows(1); + state->m_bs_tilemap->set_transmask(0, 0x01, 0); /* pen 0 is transaprent */ + state->m_bs_tilemap->set_transmask(1, 0x0f, 0); /* all 4 pens are transparent */ } -static void draw_playfield(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_playfield(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cclimber_state *state = machine.driver_data(); int i; - tilemap_mark_all_tiles_dirty(state->m_pf_tilemap); - tilemap_set_flip(state->m_pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | + state->m_pf_tilemap->mark_all_dirty(); + state->m_pf_tilemap->set_flip((CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | (CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0)); for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_pf_tilemap, i, state->m_column_scroll[i]); + state->m_pf_tilemap->set_scrolly(i, state->m_column_scroll[i]); - tilemap_draw(bitmap, cliprect, state->m_pf_tilemap, 0, 0); + state->m_pf_tilemap->draw(bitmap, cliprect, 0, 0); } -static void cclimber_draw_bigsprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void cclimber_draw_bigsprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cclimber_state *state = machine.driver_data(); UINT8 x = state->m_bigsprite_control[3] - 8; @@ -516,36 +516,36 @@ if (bigsprite_flip_y) y = 0x80 - y; - tilemap_mark_all_tiles_dirty(state->m_bs_tilemap); + state->m_bs_tilemap->mark_all_dirty(); - tilemap_set_flip(state->m_bs_tilemap, (bigsprite_flip_x ? TILEMAP_FLIPX : 0) | + state->m_bs_tilemap->set_flip((bigsprite_flip_x ? TILEMAP_FLIPX : 0) | (CCLIMBER_FLIP_Y ^ bigsprite_flip_y ? TILEMAP_FLIPY : 0)); - tilemap_set_scrollx(state->m_bs_tilemap, 0, x); - tilemap_set_scrolly(state->m_bs_tilemap, 0, y); + state->m_bs_tilemap->set_scrollx(0, x); + state->m_bs_tilemap->set_scrolly(0, y); - tilemap_draw(bitmap, cliprect, state->m_bs_tilemap, 0, 0); + state->m_bs_tilemap->draw(bitmap, cliprect, 0, 0); } -static void toprollr_draw_bigsprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void toprollr_draw_bigsprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cclimber_state *state = machine.driver_data(); UINT8 x = state->m_bigsprite_control[3] - 8; UINT8 y = state->m_bigsprite_control[2]; - tilemap_mark_all_tiles_dirty(state->m_bs_tilemap); + state->m_bs_tilemap->mark_all_dirty(); - tilemap_set_flip(state->m_bs_tilemap, CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0); + state->m_bs_tilemap->set_flip(CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0); - tilemap_set_scrollx(state->m_bs_tilemap, 0, x); - tilemap_set_scrolly(state->m_bs_tilemap, 0, y); + state->m_bs_tilemap->set_scrollx(0, x); + state->m_bs_tilemap->set_scrolly(0, y); - tilemap_draw(bitmap, cliprect, state->m_bs_tilemap, 0, 0); + state->m_bs_tilemap->draw(bitmap, cliprect, 0, 0); } -static void cclimber_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx) +static void cclimber_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx) { cclimber_state *state = gfx->machine().driver_data(); int offs; @@ -586,7 +586,7 @@ } -static void toprollr_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx) +static void toprollr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx) { cclimber_state *state = gfx->machine().driver_data(); int offs; @@ -624,7 +624,7 @@ } -static void swimmer_draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx) +static void swimmer_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx) { cclimber_state *state = gfx->machine().driver_data(); int offs; @@ -662,35 +662,35 @@ } -SCREEN_UPDATE( cclimber ) +SCREEN_UPDATE_IND16( cclimber ) { - cclimber_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN); - draw_playfield(screen->machine(), bitmap, cliprect); + cclimber_state *state = screen.machine().driver_data(); + bitmap.fill(CCLIMBER_BG_PEN, cliprect); + draw_playfield(screen.machine(), bitmap, cliprect); /* draw the "big sprite" under the regular sprites */ if ((state->m_bigsprite_control[0] & 0x01)) { - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); - cclimber_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); + cclimber_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); } /* draw the "big sprite" over the regular sprites */ else { - cclimber_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); + cclimber_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); } return 0; } -SCREEN_UPDATE( yamato ) +SCREEN_UPDATE_IND16( yamato ) { - cclimber_state *state = screen->machine().driver_data(); + cclimber_state *state = screen.machine().driver_data(); int i; - UINT8 *sky_rom = screen->machine().region("user1")->base() + 0x1200; + UINT8 *sky_rom = screen.machine().region("user1")->base() + 0x1200; for (i = 0; i < 0x100; i++) { @@ -698,115 +698,115 @@ pen_t pen = YAMATO_SKY_PEN_BASE + sky_rom[(CCLIMBER_FLIP_X ? 0x80 : 0) + (i >> 1)]; for (j = 0; j < 0x100; j++) - *BITMAP_ADDR16(bitmap, j, (i - 8) & 0xff) = pen; + bitmap.pix16(j, (i - 8) & 0xff) = pen; } - draw_playfield(screen->machine(), bitmap, cliprect); + draw_playfield(screen.machine(), bitmap, cliprect); /* draw the "big sprite" under the regular sprites */ if ((state->m_bigsprite_control[0] & 0x01)) { - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); - toprollr_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); + toprollr_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); } /* draw the "big sprite" over the regular sprites */ else { - toprollr_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); + toprollr_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); } return 0; } -SCREEN_UPDATE( swimmer ) +SCREEN_UPDATE_IND16( swimmer ) { - cclimber_state *state = screen->machine().driver_data(); - swimmer_set_background_pen(screen->machine()); + cclimber_state *state = screen.machine().driver_data(); + swimmer_set_background_pen(screen.machine()); if (*state->m_swimmer_side_background_enabled & 0x01) { if (CCLIMBER_FLIP_X) { - rectangle split_rect_left = { 0, 0xff - SWIMMER_BG_SPLIT, 0, 0xff }; - rectangle split_rect_right = { 0x100 - SWIMMER_BG_SPLIT, 0xff, 0, 0xff }; + rectangle split_rect_left(0, 0xff - SWIMMER_BG_SPLIT, 0, 0xff); + rectangle split_rect_right(0x100 - SWIMMER_BG_SPLIT, 0xff, 0, 0xff); - sect_rect(&split_rect_left, cliprect); - bitmap_fill(bitmap, &split_rect_left, SWIMMER_SIDE_BG_PEN); + split_rect_left &= cliprect; + bitmap.fill(SWIMMER_SIDE_BG_PEN, split_rect_left); - sect_rect(&split_rect_right, cliprect); - bitmap_fill(bitmap, &split_rect_right, CCLIMBER_BG_PEN); + split_rect_right &= cliprect; + bitmap.fill(CCLIMBER_BG_PEN, split_rect_right); } else { - rectangle split_rect_left = { 0, SWIMMER_BG_SPLIT - 1, 0, 0xff }; - rectangle split_rect_right = { SWIMMER_BG_SPLIT, 0xff, 0, 0xff }; + rectangle split_rect_left(0, SWIMMER_BG_SPLIT - 1, 0, 0xff); + rectangle split_rect_right(SWIMMER_BG_SPLIT, 0xff, 0, 0xff); - sect_rect(&split_rect_left, cliprect); - bitmap_fill(bitmap, &split_rect_left, CCLIMBER_BG_PEN); + split_rect_left &= cliprect; + bitmap.fill(CCLIMBER_BG_PEN, split_rect_left); - sect_rect(&split_rect_right, cliprect); - bitmap_fill(bitmap, &split_rect_right, SWIMMER_SIDE_BG_PEN); + split_rect_right &= cliprect; + bitmap.fill(SWIMMER_SIDE_BG_PEN, split_rect_right); } } else - bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN); + bitmap.fill(CCLIMBER_BG_PEN, cliprect); - draw_playfield(screen->machine(), bitmap, cliprect); + draw_playfield(screen.machine(), bitmap, cliprect); /* draw the "big sprite" under the regular sprites */ if ((state->m_bigsprite_control[0] & 0x01)) { - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); - swimmer_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); + swimmer_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); } /* draw the "big sprite" over the regular sprites */ else { - swimmer_draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); - cclimber_draw_bigsprite(screen->machine(), bitmap, cliprect); + swimmer_draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); + cclimber_draw_bigsprite(screen.machine(), bitmap, cliprect); } return 0; } -SCREEN_UPDATE( toprollr ) +SCREEN_UPDATE_IND16( toprollr ) { - cclimber_state *state = screen->machine().driver_data(); - rectangle scroll_area_clip = *cliprect; + cclimber_state *state = screen.machine().driver_data(); + rectangle scroll_area_clip = cliprect; scroll_area_clip.min_x = 4*8; scroll_area_clip.max_x = 29*8-1; - bitmap_fill(bitmap, cliprect, CCLIMBER_BG_PEN); + bitmap.fill(CCLIMBER_BG_PEN, cliprect); - tilemap_set_scrollx(state->m_toproller_bg_tilemap, 0, state->m_toprollr_bg_videoram[0]); - tilemap_set_flip(state->m_toproller_bg_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | + state->m_toproller_bg_tilemap->set_scrollx(0, state->m_toprollr_bg_videoram[0]); + state->m_toproller_bg_tilemap->set_flip((CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | (CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0)); - tilemap_mark_all_tiles_dirty(state->m_toproller_bg_tilemap); - tilemap_draw(bitmap, &scroll_area_clip, state->m_toproller_bg_tilemap, 0, 0); + state->m_toproller_bg_tilemap->mark_all_dirty(); + state->m_toproller_bg_tilemap->draw(bitmap, scroll_area_clip, 0, 0); /* draw the "big sprite" over the regular sprites */ if ((state->m_bigsprite_control[1] & 0x20)) { - toprollr_draw_sprites(bitmap, &scroll_area_clip, screen->machine().gfx[1]); - toprollr_draw_bigsprite(screen->machine(), bitmap, &scroll_area_clip); + toprollr_draw_sprites(bitmap, scroll_area_clip, screen.machine().gfx[1]); + toprollr_draw_bigsprite(screen.machine(), bitmap, scroll_area_clip); } /* draw the "big sprite" under the regular sprites */ else { - toprollr_draw_bigsprite(screen->machine(), bitmap, &scroll_area_clip); - toprollr_draw_sprites(bitmap, &scroll_area_clip, screen->machine().gfx[1]); + toprollr_draw_bigsprite(screen.machine(), bitmap, scroll_area_clip); + toprollr_draw_sprites(bitmap, scroll_area_clip, screen.machine().gfx[1]); } - tilemap_mark_all_tiles_dirty(state->m_pf_tilemap); - tilemap_set_flip(state->m_pf_tilemap, (CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | + state->m_pf_tilemap->mark_all_dirty(); + state->m_pf_tilemap->set_flip((CCLIMBER_FLIP_X ? TILEMAP_FLIPX : 0) | (CCLIMBER_FLIP_Y ? TILEMAP_FLIPY : 0)); - tilemap_draw(bitmap, cliprect, state->m_pf_tilemap, 0, 0); + state->m_pf_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/centiped.c mame-0.145/src/mame/video/centiped.c --- mame-0.144/src/mame/video/centiped.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/centiped.c 2012-02-06 21:30:32.000000000 +0000 @@ -153,7 +153,7 @@ UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -184,7 +184,7 @@ centiped_state *state = space->machine().driver_data(); state->m_bullsdrt_tiles_bankram[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } @@ -429,15 +429,15 @@ * *************************************/ -SCREEN_UPDATE( centiped ) +SCREEN_UPDATE_IND16( centiped ) { - centiped_state *state = screen->machine().driver_data(); + centiped_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle spriteclip = *cliprect; + rectangle spriteclip = cliprect; int offs; /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* apply the sprite clip */ if (state->m_flipscreen) @@ -455,29 +455,29 @@ int x = spriteram[offs + 0x20]; int y = 240 - spriteram[offs + 0x10]; - drawgfx_transmask(bitmap, &spriteclip, screen->machine().gfx[1], code, color, flipx, flipy, x, y, state->m_penmask[color & 0x3f]); + drawgfx_transmask(bitmap, spriteclip, screen.machine().gfx[1], code, color, flipx, flipy, x, y, state->m_penmask[color & 0x3f]); } return 0; } -SCREEN_UPDATE( warlords ) +SCREEN_UPDATE_IND16( warlords ) { - centiped_state *state = screen->machine().driver_data(); + centiped_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; - int upright_mode = input_port_read(screen->machine(), "IN0") & 0x80; + int upright_mode = input_port_read(screen.machine(), "IN0") & 0x80; int offs; /* if the cocktail/upright switch flipped, force refresh */ if (state->m_flipscreen != upright_mode) { state->m_flipscreen = upright_mode; - tilemap_set_flip(state->m_bg_tilemap, upright_mode ? TILEMAP_FLIPX : 0); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->set_flip(upright_mode ? TILEMAP_FLIPX : 0); + state->m_bg_tilemap->mark_all_dirty(); } /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0; offs < 0x10; offs++) @@ -501,22 +501,22 @@ flipx = !flipx; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], code, color, flipx, flipy, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, color, flipx, flipy, x, y, 0); } return 0; } -SCREEN_UPDATE( bullsdrt ) +SCREEN_UPDATE_IND16( bullsdrt ) { - centiped_state *state = screen->machine().driver_data(); + centiped_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle spriteclip = *cliprect; + rectangle spriteclip = cliprect; int offs; /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* apply the sprite clip */ if (state->m_flipscreen) @@ -533,7 +533,7 @@ int x = spriteram[offs + 0x20]; int y = 240 - spriteram[offs + 0x10]; - drawgfx_transpen(bitmap, &spriteclip, screen->machine().gfx[1], code, color & 0x3f, 1, flipy, x, y, 0); + drawgfx_transpen(bitmap, spriteclip, screen.machine().gfx[1], code, color & 0x3f, 1, flipy, x, y, 0); } return 0; } @@ -542,15 +542,15 @@ * This varies from Centipede, in that flipx is not in * the data, but is determined by VIDROT value at 0x2506. */ -SCREEN_UPDATE( milliped ) +SCREEN_UPDATE_IND16( milliped ) { - centiped_state *state = screen->machine().driver_data(); + centiped_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle spriteclip = *cliprect; + rectangle spriteclip = cliprect; int offs; /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* apply the sprite clip */ if (state->m_flipscreen) @@ -571,7 +571,7 @@ flipy = !flipy; } - drawgfx_transmask(bitmap, &spriteclip, screen->machine().gfx[1], code, color, flipx, flipy, x, y, state->m_penmask[color & 0x3f]); + drawgfx_transmask(bitmap, spriteclip, screen.machine().gfx[1], code, color, flipx, flipy, x, y, state->m_penmask[color & 0x3f]); } return 0; } diff -Nru mame-0.144/src/mame/video/chaknpop.c mame-0.145/src/mame/video/chaknpop.c --- mame-0.144/src/mame/video/chaknpop.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/chaknpop.c 2012-02-06 21:30:32.000000000 +0000 @@ -63,8 +63,8 @@ { chaknpop_state *state = machine.driver_data(); - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); - tilemap_set_flip(state->m_tx_tilemap, state->m_flip_x | state->m_flip_y); + state->m_tx_tilemap->mark_all_dirty(); + state->m_tx_tilemap->set_flip(state->m_flip_x | state->m_flip_y); } READ8_HANDLER( chaknpop_gfxmode_r ) @@ -106,7 +106,7 @@ chaknpop_state *state = space->machine().driver_data(); state->m_tx_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( chaknpop_attrram_w ) @@ -183,7 +183,7 @@ Screen refresh ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { chaknpop_state *state = machine.driver_data(); int offs; @@ -218,7 +218,7 @@ } } -static void draw_bitmap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bitmap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { chaknpop_state *state = machine.driver_data(); int dx = state->m_flip_x ? -1 : 1; @@ -250,20 +250,20 @@ if (color) { - pen_t pen = *BITMAP_ADDR16(bitmap, y, x); + pen_t pen = bitmap.pix16(y, x); pen |= color; - *BITMAP_ADDR16(bitmap, y, x) = pen; + bitmap.pix16(y, x) = pen; } } } } -SCREEN_UPDATE( chaknpop ) +SCREEN_UPDATE_IND16( chaknpop ) { - chaknpop_state *state = screen->machine().driver_data(); + chaknpop_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bitmap(screen->machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/champbas.c mame-0.145/src/mame/video/champbas.c --- mame-0.144/src/mame/video/champbas.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/champbas.c 2012-02-06 21:30:32.000000000 +0000 @@ -165,7 +165,7 @@ { champbas_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( champbas_gfxbank_w ) @@ -175,7 +175,7 @@ if (state->m_gfx_bank != data) { state->m_gfx_bank = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -183,7 +183,7 @@ { champbas_state *state = space->machine().driver_data(); state->m_palette_bank = data & 1; - tilemap_set_palette_offset(state->m_bg_tilemap, state->m_palette_bank << 8); + state->m_bg_tilemap->set_palette_offset(state->m_palette_bank << 8); } WRITE8_HANDLER( champbas_flipscreen_w ) @@ -193,7 +193,7 @@ -static void champbas_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void champbas_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { champbas_state *state = machine.driver_data(); int offs; @@ -225,7 +225,7 @@ } } -static void exctsccr_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void exctsccr_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { champbas_state *state = machine.driver_data(); int offs; @@ -282,18 +282,18 @@ -SCREEN_UPDATE( champbas ) +SCREEN_UPDATE_IND16( champbas ) { - champbas_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - champbas_draw_sprites(screen->machine(), bitmap, cliprect); + champbas_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + champbas_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( exctsccr ) +SCREEN_UPDATE_IND16( exctsccr ) { - champbas_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - exctsccr_draw_sprites(screen->machine(), bitmap, cliprect); + champbas_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + exctsccr_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/changela.c mame-0.145/src/mame/video/changela.c --- mame-0.144/src/mame/video/changela.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/changela.c 2012-02-06 21:30:32.000000000 +0000 @@ -24,10 +24,10 @@ state->m_memory_devices = auto_alloc_array(machine, UINT8, 4 * 0x800); /* 0 - not connected, 1,2,3 - RAMs*/ state->m_tree_ram = auto_alloc_array(machine, UINT8, 2 * 0x20); - state->m_obj0_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_river_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tree0_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tree1_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_obj0_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_river_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_tree0_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_tree1_bitmap); state->m_scanline_timer = machine.scheduler().timer_alloc(FUNC(changela_scanline_callback)); state->m_scanline_timer->adjust(machine.primary_screen->time_until_pos(30), 30); @@ -42,7 +42,7 @@ ***************************************************************************/ -static void draw_obj0( running_machine &machine, bitmap_t *bitmap, int sy ) +static void draw_obj0( running_machine &machine, bitmap_ind16 &bitmap, int sy ) { changela_state *state = machine.driver_data(); int sx, i; @@ -82,7 +82,7 @@ data = (ROM[rom_addr] & 0xf0) >> 4; if ((data != 0x0f) && (data != 0)) - *BITMAP_ADDR16(bitmap, sy, xpos + i) = data | 0x10; + bitmap.pix16(sy, xpos + i) = data | 0x10; if (hs) { @@ -92,7 +92,7 @@ data = (ROM[rom_addr ^ 0x100] & 0xf0) >> 4; if ((data != 0x0f) && (data != 0)) - *BITMAP_ADDR16(bitmap, sy, xpos + i + 16) = data | 0x10; + bitmap.pix16(sy, xpos + i + 16) = data | 0x10; } } } @@ -105,7 +105,7 @@ ***************************************************************************/ -static void draw_obj1( running_machine &machine, bitmap_t *bitmap ) +static void draw_obj1( running_machine &machine, bitmap_ind16 &bitmap ) { changela_state *state = machine.driver_data(); int sx, sy; @@ -159,7 +159,7 @@ col = c0 | (c1 << 1) | ((attrib & 0xc0) >> 4); if ((col & 0x07) != 0x07) - *BITMAP_ADDR16(bitmap, sy, sx) = col | 0x20; + bitmap.pix16(sy, sx) = col | 0x20; } } } @@ -170,7 +170,7 @@ ***************************************************************************/ -static void draw_river( running_machine &machine, bitmap_t *bitmap, int sy ) +static void draw_river( running_machine &machine, bitmap_ind16 &bitmap, int sy ) { changela_state *state = machine.driver_data(); int sx, i, j; @@ -307,7 +307,7 @@ else col = (TILE_ROM[rom_addr] & 0xf0) >> 4; - *BITMAP_ADDR16(bitmap, sy, sx) = col; + bitmap.pix16(sy, sx) = col; } for (sx = 16; sx < 256; sx++) @@ -338,7 +338,7 @@ else col = (TILE_ROM[rom_addr] & 0xf0) >> 4; - *BITMAP_ADDR16(bitmap, sy, sx) = col; + bitmap.pix16(sy, sx) = col; } } } @@ -349,7 +349,7 @@ ***************************************************************************/ -static void draw_tree( running_machine &machine, bitmap_t *bitmap, int sy, int tree_num ) +static void draw_tree( running_machine &machine, bitmap_ind16 &bitmap, int sy, int tree_num ) { changela_state *state = machine.driver_data(); int sx, i, j; @@ -547,7 +547,7 @@ all_ff = 0; if (col != 0x0f && col != 0x00) - *BITMAP_ADDR16(bitmap, sy, sx) = col | 0x30; + bitmap.pix16(sy, sx) = col | 0x30; } } @@ -587,7 +587,7 @@ all_ff = 0; if (col != 0x0f && col != 0x00) - *BITMAP_ADDR16(bitmap, sy, sx) = col | 0x30; + bitmap.pix16(sy, sx) = col | 0x30; } } @@ -652,11 +652,11 @@ int sx; /* clear the current scanline first */ - rectangle rect = { 0, 255, sy, sy }; - bitmap_fill(state->m_river_bitmap, &rect, 0x00); - bitmap_fill(state->m_obj0_bitmap, &rect, 0x00); - bitmap_fill(state->m_tree0_bitmap, &rect, 0x00); - bitmap_fill(state->m_tree1_bitmap, &rect, 0x00); + const rectangle rect(0, 255, sy, sy); + state->m_river_bitmap.fill(0x00, rect); + state->m_obj0_bitmap.fill(0x00, rect); + state->m_tree0_bitmap.fill(0x00, rect); + state->m_tree1_bitmap.fill(0x00, rect); draw_river(machine, state->m_river_bitmap, sy); draw_obj0(machine, state->m_obj0_bitmap, sy); @@ -668,28 +668,28 @@ { int riv_col, prev_col; - if ((*BITMAP_ADDR16(state->m_river_bitmap, sy, sx) == 0x08) - || (*BITMAP_ADDR16(state->m_river_bitmap, sy, sx) == 0x09) - || (*BITMAP_ADDR16(state->m_river_bitmap, sy, sx) == 0x0a)) + if ((state->m_river_bitmap.pix16(sy, sx) == 0x08) + || (state->m_river_bitmap.pix16(sy, sx) == 0x09) + || (state->m_river_bitmap.pix16(sy, sx) == 0x0a)) riv_col = 1; else riv_col = 0; - if ((*BITMAP_ADDR16(state->m_river_bitmap, sy, sx-1) == 0x08) - || (*BITMAP_ADDR16(state->m_river_bitmap, sy, sx-1) == 0x09) - || (*BITMAP_ADDR16(state->m_river_bitmap, sy, sx-1) == 0x0a)) + if ((state->m_river_bitmap.pix16(sy, sx-1) == 0x08) + || (state->m_river_bitmap.pix16(sy, sx-1) == 0x09) + || (state->m_river_bitmap.pix16(sy, sx-1) == 0x0a)) prev_col = 1; else prev_col = 0; - if (*BITMAP_ADDR16(state->m_obj0_bitmap, sy, sx) == 0x14) /* Car Outline Color */ + if (state->m_obj0_bitmap.pix16(sy, sx) == 0x14) /* Car Outline Color */ { /* Tree 0 Collision */ - if (*BITMAP_ADDR16(state->m_tree0_bitmap, sy, sx) != 0) + if (state->m_tree0_bitmap.pix16(sy, sx) != 0) state->m_tree0_col = 1; /* Tree 1 Collision */ - if (*BITMAP_ADDR16(state->m_tree1_bitmap, sy, sx) != 0) + if (state->m_tree1_bitmap.pix16(sy, sx) != 0) state->m_tree1_col = 1; /* Hit Right Bank */ @@ -722,14 +722,14 @@ state->m_scanline_timer->adjust(machine.primary_screen->time_until_pos(sy), sy); } -SCREEN_UPDATE( changela ) +SCREEN_UPDATE_IND16( changela ) { - changela_state *state = screen->machine().driver_data(); + changela_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_river_bitmap, 0, 0, 0, 0, cliprect); copybitmap_trans(bitmap, state->m_obj0_bitmap, 0, 0, 0, 0, cliprect, 0); copybitmap_trans(bitmap, state->m_tree0_bitmap, 0, 0, 0, 0, cliprect, 0); copybitmap_trans(bitmap, state->m_tree1_bitmap, 0, 0, 0, 0, cliprect, 0); - draw_obj1(screen->machine(), bitmap); + draw_obj1(screen.machine(), bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/cheekyms.c mame-0.145/src/mame/video/cheekyms.c --- mame-0.144/src/mame/video/cheekyms.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cheekyms.c 2012-02-06 21:30:33.000000000 +0000 @@ -59,7 +59,7 @@ *state->m_port_80 = data; /* d2 - interrupt enable */ - interrupt_enable_w(space, offset, data & 0x04); + state->m_irq_mask = data & 4; } @@ -101,14 +101,14 @@ width = machine.primary_screen->width(); height = machine.primary_screen->height(); - state->m_bitmap_buffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + state->m_bitmap_buffer = auto_bitmap_ind16_alloc(machine, width, height); state->m_cm_tilemap = tilemap_create(machine, cheekyms_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_cm_tilemap, 0); + state->m_cm_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int flip ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx, int flip ) { cheekyms_state *state = machine.driver_data(); offs_t offs; @@ -148,29 +148,29 @@ } -SCREEN_UPDATE( cheekyms ) +SCREEN_UPDATE_IND16( cheekyms ) { - cheekyms_state *state = screen->machine().driver_data(); + cheekyms_state *state = screen.machine().driver_data(); int y, x; int scrolly = ((*state->m_port_80 >> 3) & 0x07); int flip = *state->m_port_80 & 0x80; - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_flip_all(screen->machine(), flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + screen.machine().tilemap().mark_all_dirty(); + screen.machine().tilemap().set_flip_all(flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - bitmap_fill(bitmap, cliprect, 0); - bitmap_fill(state->m_bitmap_buffer, cliprect, 0); + bitmap.fill(0, cliprect); + state->m_bitmap_buffer->fill(0, cliprect); /* sprites go under the playfield */ - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().gfx[1], flip); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().gfx[1], flip); /* draw the tilemap to a temp bitmap */ - tilemap_draw(state->m_bitmap_buffer, cliprect, state->m_cm_tilemap, 0, 0); + state->m_cm_tilemap->draw(*state->m_bitmap_buffer, cliprect, 0, 0); /* draw the tilemap to the final bitmap applying the scroll to the man character */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int in_man_area; @@ -185,13 +185,13 @@ if (in_man_area) { - if ((y + scrolly) < 27 * 8 && *BITMAP_ADDR16(state->m_bitmap_buffer, y + scrolly, x) != 0) - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(state->m_bitmap_buffer, y + scrolly, x); + if ((y + scrolly) < 27 * 8 && state->m_bitmap_buffer->pix16(y + scrolly, x) != 0) + bitmap.pix16(y, x) = state->m_bitmap_buffer->pix16(y + scrolly, x); } else { - if(*BITMAP_ADDR16(state->m_bitmap_buffer, y, x) != 0) - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(state->m_bitmap_buffer, y, x); + if(state->m_bitmap_buffer->pix16(y, x) != 0) + bitmap.pix16(y, x) = state->m_bitmap_buffer->pix16(y, x); } } } diff -Nru mame-0.144/src/mame/video/chqflag.c mame-0.145/src/mame/video/chqflag.c --- mame-0.144/src/mame/video/chqflag.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/chqflag.c 2012-02-06 21:30:32.000000000 +0000 @@ -71,11 +71,11 @@ ***************************************************************************/ -SCREEN_UPDATE( chqflag ) +SCREEN_UPDATE_IND16( chqflag ) { - chqflag_state *state = screen->machine().driver_data(); + chqflag_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); k051316_zoom_draw(state->m_k051316_2, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); k051960_sprites_draw(state->m_k051960, bitmap, cliprect, 0, 0); diff -Nru mame-0.144/src/mame/video/cidelsa.c mame-0.145/src/mame/video/cidelsa.c --- mame-0.144/src/mame/video/cidelsa.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cidelsa.c 2012-02-06 21:30:31.000000000 +0000 @@ -205,7 +205,7 @@ /* Machine Drivers */ MACHINE_CONFIG_FRAGMENT( destryer_video ) - MCFG_CDP1869_SCREEN_PAL_ADD(SCREEN_TAG, DESTRYER_CHR2) + MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, DESTRYER_CHR2) MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -214,7 +214,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_FRAGMENT( altair_video ) - MCFG_CDP1869_SCREEN_PAL_ADD(SCREEN_TAG, ALTAIR_CHR2) + MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, ALTAIR_CHR2) MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -223,7 +223,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_FRAGMENT( draco_video ) - MCFG_CDP1869_SCREEN_PAL_ADD(SCREEN_TAG, DRACO_CHR2) + MCFG_CDP1869_SCREEN_PAL_ADD(CDP1869_TAG, SCREEN_TAG, DRACO_CHR2) MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.360, 0.024) MCFG_SPEAKER_STANDARD_MONO("mono") diff -Nru mame-0.144/src/mame/video/cinemat.c mame-0.145/src/mame/video/cinemat.c --- mame-0.144/src/mame/video/cinemat.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cinemat.c 2012-02-06 21:30:32.000000000 +0000 @@ -213,12 +213,12 @@ * *************************************/ -SCREEN_UPDATE( cinemat ) +SCREEN_UPDATE_RGB32( cinemat ) { - SCREEN_UPDATE_CALL(vector); + SCREEN_UPDATE32_CALL(vector); vector_clear_list(); - ccpu_wdt_timer_trigger(screen->machine().device("maincpu")); + ccpu_wdt_timer_trigger(screen.machine().device("maincpu")); return 0; } @@ -231,11 +231,11 @@ * *************************************/ -SCREEN_UPDATE( spacewar ) +SCREEN_UPDATE_RGB32( spacewar ) { - int sw_option = input_port_read(screen->machine(), "INPUTS"); + int sw_option = input_port_read(screen.machine(), "INPUTS"); - SCREEN_UPDATE_CALL(cinemat); + SCREEN_UPDATE32_CALL(cinemat); /* set the state of the artwork */ output_set_value("pressed3", (~sw_option >> 0) & 1); diff -Nru mame-0.144/src/mame/video/circus.c mame-0.145/src/mame/video/circus.c --- mame-0.144/src/mame/video/circus.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/circus.c 2012-02-06 21:30:32.000000000 +0000 @@ -15,7 +15,7 @@ { circus_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( circus_clown_x_w ) @@ -44,7 +44,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_line( bitmap_t *bitmap, const rectangle *cliprect, int x1, int y1, int x2, int y2, int dotted ) +static void draw_line( bitmap_ind16 &bitmap, const rectangle &cliprect, int x1, int y1, int x2, int y2, int dotted ) { /* Draws horizontal and Vertical lines only! */ int count, skip; @@ -57,13 +57,13 @@ if (x1 == x2) for (count = y2; count >= y1; count -= skip) - *BITMAP_ADDR16(bitmap, count, x1) = 1; + bitmap.pix16(count, x1) = 1; else for (count = x2; count >= x1; count -= skip) - *BITMAP_ADDR16(bitmap, y1, count) = 1; + bitmap.pix16(y1, count) = 1; } -static void draw_sprite_collision( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprite_collision( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { circus_state *state = machine.driver_data(); const gfx_element *sprite_gfx = machine.gfx[1]; @@ -75,18 +75,18 @@ for (sy = 0; sy < 16; sy++) { dy = state->m_clown_x + sy-1; - if (dy>=0 && dyheight) + if (dy>=0 && dym_clown_y + sx; - if (dx>=0 && dxwidth) + if (dx>=0 && dxline_modulo + sx]; if (pixel) { - collision |= *BITMAP_ADDR16(bitmap, dy, dx); - *BITMAP_ADDR16(bitmap, dy, dx) = machine.pens[pixel]; + collision |= bitmap.pix16(dy, dx); + bitmap.pix16(dy, dx) = machine.pens[pixel]; } } } @@ -97,7 +97,7 @@ device_set_input_line(state->m_maincpu, 0, ASSERT_LINE); } -static void circus_draw_fg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void circus_draw_fg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* The sync generator hardware is used to */ /* draw the border and diving boards */ @@ -113,16 +113,16 @@ draw_line(bitmap, cliprect, 231, 192, 248, 192, 0); } -SCREEN_UPDATE( circus ) +SCREEN_UPDATE_IND16( circus ) { - circus_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - circus_draw_fg(screen->machine(), bitmap, cliprect); - draw_sprite_collision(screen->machine(), bitmap, cliprect); + circus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + circus_draw_fg(screen.machine(), bitmap, cliprect); + draw_sprite_collision(screen.machine(), bitmap, cliprect); return 0; } -static void robotbwl_draw_box( bitmap_t *bitmap, const rectangle *cliprect, int x, int y ) +static void robotbwl_draw_box( bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y ) { /* Box */ int ex = x + 24; @@ -140,7 +140,7 @@ draw_line(bitmap, cliprect, x + 16, y, x + 16, ey, 0); } -static void robotbwl_draw_scoreboard( bitmap_t *bitmap, const rectangle *cliprect ) +static void robotbwl_draw_scoreboard( bitmap_ind16 &bitmap, const rectangle &cliprect ) { int offs; @@ -165,7 +165,7 @@ draw_line(bitmap, cliprect, 39 + 152, 137, 47 + 152, 137, 0); } -static void robotbwl_draw_bowling_alley( bitmap_t *bitmap, const rectangle *cliprect ) +static void robotbwl_draw_bowling_alley( bitmap_ind16 &bitmap, const rectangle &cliprect ) { draw_line(bitmap, cliprect, 103, 17, 103, 205, 0); draw_line(bitmap, cliprect, 111, 17, 111, 203, 1); @@ -173,7 +173,7 @@ draw_line(bitmap, cliprect, 144, 17, 144, 203, 1); } -static void robotbwl_draw_ball( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void robotbwl_draw_ball( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { circus_state *state = machine.driver_data(); drawgfx_transpen(bitmap,/* Y is horizontal position */ @@ -184,17 +184,17 @@ state->m_clown_y + 8, state->m_clown_x + 8, 0); } -SCREEN_UPDATE( robotbwl ) +SCREEN_UPDATE_IND16( robotbwl ) { - circus_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + circus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); robotbwl_draw_scoreboard(bitmap, cliprect); robotbwl_draw_bowling_alley(bitmap, cliprect); - robotbwl_draw_ball(screen->machine(), bitmap, cliprect); + robotbwl_draw_ball(screen.machine(), bitmap, cliprect); return 0; } -static void crash_draw_car( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void crash_draw_car( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { circus_state *state = machine.driver_data(); drawgfx_transpen(bitmap,/* Y is horizontal position */ @@ -205,18 +205,18 @@ state->m_clown_y, state->m_clown_x - 1, 0); } -SCREEN_UPDATE( crash ) +SCREEN_UPDATE_IND16( crash ) { - circus_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - crash_draw_car(screen->machine(), bitmap, cliprect); + circus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + crash_draw_car(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( ripcord ) +SCREEN_UPDATE_IND16( ripcord ) { - circus_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprite_collision(screen->machine(), bitmap, cliprect); + circus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprite_collision(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/circusc.c mame-0.145/src/mame/video/circusc.c --- mame-0.144/src/mame/video/circusc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/circusc.c 2012-02-06 21:30:31.000000000 +0000 @@ -102,7 +102,7 @@ { circusc_state *state = machine.driver_data(); UINT8 attr = state->m_colorram[tile_index]; - tileinfo->category = (attr & 0x10) >> 4; + tileinfo.category = (attr & 0x10) >> 4; SET_TILE_INFO(0, state->m_videoram[tile_index] + ((attr & 0x20) << 3), @@ -123,7 +123,7 @@ circusc_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); } @@ -138,14 +138,14 @@ { circusc_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( circusc_colorram_w ) { circusc_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( circusc_flipscreen_w ) @@ -161,7 +161,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { circusc_state *state = machine.driver_data(); int offs; @@ -198,19 +198,19 @@ } } -SCREEN_UPDATE( circusc ) +SCREEN_UPDATE_IND16( circusc ) { - circusc_state *state = screen->machine().driver_data(); + circusc_state *state = screen.machine().driver_data(); int i; for (i = 0; i < 10; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, 0); + state->m_bg_tilemap->set_scrolly(i, 0); for (i = 10; i < 32; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, *state->m_scroll); + state->m_bg_tilemap->set_scrolly(i, *state->m_scroll); - bitmap_fill(bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + bitmap.fill(0, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/cischeat.c mame-0.145/src/mame/video/cischeat.c --- mame-0.144/src/mame/video/cischeat.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cischeat.c 2012-02-06 21:30:32.000000000 +0000 @@ -91,14 +91,14 @@ #define cischeat_tmap_SET_SCROLL(_n_) \ if (state->m_tmap[_n_]) \ { \ - tilemap_set_scrollx(state->m_tmap[_n_], 0, state->m_scrollx[_n_]); \ - tilemap_set_scrolly(state->m_tmap[_n_], 0, state->m_scrolly[_n_]); \ + state->m_tmap[_n_]->set_scrollx(0, state->m_scrollx[_n_]); \ + state->m_tmap[_n_]->set_scrolly(0, state->m_scrolly[_n_]); \ } #define cischeat_tmap_DRAW(_n_) \ if ( (state->m_tmap[_n_]) && (state->m_active_layers & (1 << _n_) ) ) \ { \ - tilemap_draw(bitmap, cliprect, state->m_tmap[_n_], flag, 0 ); \ + state->m_tmap[_n_]->draw(bitmap, cliprect, flag, 0 ); \ flag = 0; \ } @@ -137,14 +137,14 @@ { if (state->m_scroll_flag[which] & 0x10) /* tiles are 8x8 */ { - tilemap_mark_tile_dirty(state->m_tmap[which], offset); + state->m_tmap[which]->mark_tile_dirty(offset); } else { - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 0); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 1); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 2); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 3); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 0); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 1); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 2); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 3); } } } @@ -213,8 +213,8 @@ /* set user data and transparency */ for (i = 0; i < 8; i++) { - tilemap_set_user_data(state->m_tilemap[layer][i/4][i%4], (void *)(FPTR)layer); - tilemap_set_transparent_pen(state->m_tilemap[layer][i/4][i%4], 15); + state->m_tilemap[layer][i/4][i%4]->set_user_data((void *)(FPTR)layer); + state->m_tilemap[layer][i/4][i%4]->set_transparent_pen(15); } } } @@ -225,7 +225,7 @@ { state->m_scroll_flag[which] = data; state->m_tmap[which] = state->m_tilemap[which][(data >> 4) & 1][data & 3]; - tilemap_mark_all_tiles_dirty(state->m_tmap[which]); + state->m_tmap[which]->mark_all_dirty(); } } @@ -715,13 +715,13 @@ /* Draw the road in the given bitmap. The priority1 and priority2 parameters specify the range of lines to draw */ -static void cischeat_draw_road(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int road_num, int priority1, int priority2, int transparency) +static void cischeat_draw_road(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int road_num, int priority1, int priority2, int transparency) { cischeat_state *state = machine.driver_data(); int curr_code,sx,sy; int min_priority, max_priority; - rectangle rect = *cliprect; + rectangle rect = cliprect; gfx_element *gfx = machine.gfx[(road_num & 1)?5:4]; UINT16 *roadram = state->m_roadram[road_num & 1]; @@ -757,7 +757,7 @@ for (sx = -(xscroll%TILE_SIZE) ; sx <= max_x ; sx +=TILE_SIZE) { - drawgfx_transpen(bitmap,&rect,gfx, + drawgfx_transpen(bitmap,rect,gfx, curr_code++, attr, 0,0, @@ -805,14 +805,14 @@ /* Draw the road in the given bitmap. The priority1 and priority2 parameters specify the range of lines to draw */ -static void f1gpstar_draw_road(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int road_num, int priority1, int priority2, int transparency) +static void f1gpstar_draw_road(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int road_num, int priority1, int priority2, int transparency) { cischeat_state *state = machine.driver_data(); int sx,sy; int xstart; int min_priority, max_priority; - rectangle rect = *cliprect; + rectangle rect = cliprect; gfx_element *gfx = machine.gfx[(road_num & 1)?5:4]; UINT16 *roadram = state->m_roadram[road_num & 1]; @@ -864,7 +864,7 @@ /* Draw the line */ for (sx = xstart ; sx <= max_x ; sx += xdim) { - drawgfxzoom_transpen(bitmap,&rect,gfx, + drawgfxzoom_transpen(bitmap,rect,gfx, code++, attr >> 8, 0,0, @@ -921,7 +921,7 @@ sprites whose priority nibble is between 0 and 15 and whose colour code's high bit is set. */ -static void cischeat_draw_sprites(running_machine &machine, bitmap_t *bitmap , const rectangle *cliprect, int priority1, int priority2) +static void cischeat_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap , const rectangle &cliprect, int priority1, int priority2) { cischeat_state *state = machine.driver_data(); int x, sx, flipx, xzoom, xscale, xdim, xnum, xstart, xend, xinc; @@ -1077,7 +1077,7 @@ ***************************************************************************/ -static void bigrun_draw_sprites(running_machine &machine, bitmap_t *bitmap , const rectangle *cliprect, int priority1, int priority2) +static void bigrun_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap , const rectangle &cliprect, int priority1, int priority2) { cischeat_state *state = machine.driver_data(); int x, sx, flipx, xzoom, xscale, xdim, xnum, xstart, xend, xinc; @@ -1210,24 +1210,24 @@ #ifdef MAME_DEBUG #define CISCHEAT_LAYERSCTRL \ state->m_debugsprites = 0; \ -if ( screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X) ) \ +if ( screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X) ) \ { \ int msk = 0; \ - if (screen->machine().input().code_pressed(KEYCODE_Q)) { msk |= 0x01;} \ - if (screen->machine().input().code_pressed(KEYCODE_W)) { msk |= 0x02;} \ - if (screen->machine().input().code_pressed(KEYCODE_E)) { msk |= 0x04;} \ - if (screen->machine().input().code_pressed(KEYCODE_A)) { msk |= 0x08; state->m_debugsprites = 1;} \ - if (screen->machine().input().code_pressed(KEYCODE_S)) { msk |= 0x08; state->m_debugsprites = 2;} \ - if (screen->machine().input().code_pressed(KEYCODE_D)) { msk |= 0x08; state->m_debugsprites = 3;} \ - if (screen->machine().input().code_pressed(KEYCODE_F)) { msk |= 0x08; state->m_debugsprites = 4;} \ - if (screen->machine().input().code_pressed(KEYCODE_R)) { msk |= 0x10;} \ - if (screen->machine().input().code_pressed(KEYCODE_T)) { msk |= 0x20;} \ + if (screen.machine().input().code_pressed(KEYCODE_Q)) { msk |= 0x01;} \ + if (screen.machine().input().code_pressed(KEYCODE_W)) { msk |= 0x02;} \ + if (screen.machine().input().code_pressed(KEYCODE_E)) { msk |= 0x04;} \ + if (screen.machine().input().code_pressed(KEYCODE_A)) { msk |= 0x08; state->m_debugsprites = 1;} \ + if (screen.machine().input().code_pressed(KEYCODE_S)) { msk |= 0x08; state->m_debugsprites = 2;} \ + if (screen.machine().input().code_pressed(KEYCODE_D)) { msk |= 0x08; state->m_debugsprites = 3;} \ + if (screen.machine().input().code_pressed(KEYCODE_F)) { msk |= 0x08; state->m_debugsprites = 4;} \ + if (screen.machine().input().code_pressed(KEYCODE_R)) { msk |= 0x10;} \ + if (screen.machine().input().code_pressed(KEYCODE_T)) { msk |= 0x20;} \ \ if (msk != 0) state->m_active_layers &= msk; \ } \ \ { \ - if ( screen->machine().input().code_pressed(KEYCODE_Z) && screen->machine().input().code_pressed_once(KEYCODE_U) ) \ + if ( screen.machine().input().code_pressed(KEYCODE_Z) && screen.machine().input().code_pressed_once(KEYCODE_U) ) \ state->m_show_unknown ^= 1; \ if (state->m_show_unknown) \ popmessage("0:%04X 2:%04X 4:%04X 6:%04X c:%04X", \ @@ -1241,9 +1241,9 @@ Big Run **************************************************************************/ -SCREEN_UPDATE( bigrun ) +SCREEN_UPDATE_IND16( bigrun ) { - cischeat_state *state = screen->machine().driver_data(); + cischeat_state *state = screen.machine().driver_data(); int i; int active_layers1, flag; @@ -1265,12 +1265,12 @@ cischeat_tmap_SET_SCROLL(1) cischeat_tmap_SET_SCROLL(2) - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); for (i = 7; i >= 4; i--) { /* bitmap, road, min_priority, max_priority, transparency */ - if (state->m_active_layers & 0x10) cischeat_draw_road(screen->machine(),bitmap,cliprect,0,i,i,FALSE); - if (state->m_active_layers & 0x20) cischeat_draw_road(screen->machine(),bitmap,cliprect,1,i,i,TRUE); + if (state->m_active_layers & 0x10) cischeat_draw_road(screen.machine(),bitmap,cliprect,0,i,i,FALSE); + if (state->m_active_layers & 0x20) cischeat_draw_road(screen.machine(),bitmap,cliprect,1,i,i,TRUE); } flag = 0; @@ -1279,11 +1279,11 @@ for (i = 3; i >= 0; i--) { /* bitmap, road, min_priority, max_priority, transparency */ - if (state->m_active_layers & 0x10) cischeat_draw_road(screen->machine(),bitmap,cliprect,0,i,i,TRUE); - if (state->m_active_layers & 0x20) cischeat_draw_road(screen->machine(),bitmap,cliprect,1,i,i,TRUE); + if (state->m_active_layers & 0x10) cischeat_draw_road(screen.machine(),bitmap,cliprect,0,i,i,TRUE); + if (state->m_active_layers & 0x20) cischeat_draw_road(screen.machine(),bitmap,cliprect,1,i,i,TRUE); } - if (state->m_active_layers & 0x08) bigrun_draw_sprites(screen->machine(),bitmap,cliprect,15,0); + if (state->m_active_layers & 0x08) bigrun_draw_sprites(screen.machine(),bitmap,cliprect,15,0); cischeat_tmap_DRAW(2) @@ -1296,9 +1296,9 @@ Cisco Heat **************************************************************************/ -SCREEN_UPDATE( cischeat ) +SCREEN_UPDATE_IND16( cischeat ) { - cischeat_state *state = screen->machine().driver_data(); + cischeat_state *state = screen.machine().driver_data(); int active_layers1, flag; #ifdef MAME_DEBUG @@ -1319,28 +1319,28 @@ cischeat_tmap_SET_SCROLL(1) cischeat_tmap_SET_SCROLL(2) - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); /* bitmap, road, priority, transparency */ - if (state->m_active_layers & 0x10) cischeat_draw_road(screen->machine(),bitmap,cliprect,0,7,5,FALSE); - if (state->m_active_layers & 0x20) cischeat_draw_road(screen->machine(),bitmap,cliprect,1,7,5,TRUE); + if (state->m_active_layers & 0x10) cischeat_draw_road(screen.machine(),bitmap,cliprect,0,7,5,FALSE); + if (state->m_active_layers & 0x20) cischeat_draw_road(screen.machine(),bitmap,cliprect,1,7,5,TRUE); flag = 0; cischeat_tmap_DRAW(0) -// else bitmap_fill(bitmap,cliprect,0); +// else bitmap.fill(0, cliprect); cischeat_tmap_DRAW(1) - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,15,3); - if (state->m_active_layers & 0x10) cischeat_draw_road(screen->machine(),bitmap,cliprect,0,4,1,TRUE); - if (state->m_active_layers & 0x20) cischeat_draw_road(screen->machine(),bitmap,cliprect,1,4,1,TRUE); - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,2,2); - if (state->m_active_layers & 0x10) cischeat_draw_road(screen->machine(),bitmap,cliprect,0,0,0,TRUE); - if (state->m_active_layers & 0x20) cischeat_draw_road(screen->machine(),bitmap,cliprect,1,0,0,TRUE); - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,1,0); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,15,3); + if (state->m_active_layers & 0x10) cischeat_draw_road(screen.machine(),bitmap,cliprect,0,4,1,TRUE); + if (state->m_active_layers & 0x20) cischeat_draw_road(screen.machine(),bitmap,cliprect,1,4,1,TRUE); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,2,2); + if (state->m_active_layers & 0x10) cischeat_draw_road(screen.machine(),bitmap,cliprect,0,0,0,TRUE); + if (state->m_active_layers & 0x20) cischeat_draw_road(screen.machine(),bitmap,cliprect,1,0,0,TRUE); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,1,0); cischeat_tmap_DRAW(2) /* for the map screen */ - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,0+16,0+16); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,0+16,0+16); state->m_active_layers = active_layers1; @@ -1353,9 +1353,9 @@ F1 GrandPrix Star **************************************************************************/ -SCREEN_UPDATE( f1gpstar ) +SCREEN_UPDATE_IND16( f1gpstar ) { - cischeat_state *state = screen->machine().driver_data(); + cischeat_state *state = screen.machine().driver_data(); int active_layers1, flag; #ifdef MAME_DEBUG @@ -1376,32 +1376,32 @@ cischeat_tmap_SET_SCROLL(1); cischeat_tmap_SET_SCROLL(2); - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); /* 1: clouds 5, grad 7, road 0 2: clouds 5, grad 7, road 0, tunnel roof 0 */ /* road 1!! 0!! */ /* bitmap, road, min_priority, max_priority, transparency */ - if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,1,6,7,TRUE); - if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,0,6,7,TRUE); + if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,1,6,7,TRUE); + if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,0,6,7,TRUE); flag = 0; cischeat_tmap_DRAW(0) -// else bitmap_fill(bitmap,cliprect,0); +// else bitmap.fill(0, cliprect); cischeat_tmap_DRAW(1) /* road 1!! 0!! */ /* bitmap, road, min_priority, max_priority, transparency */ - if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,1,1,5,TRUE); - if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,0,1,5,TRUE); + if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,1,1,5,TRUE); + if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,0,1,5,TRUE); - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,15,2); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,15,2); /* road 1!! 0!! */ /* bitmap, road, min_priority, max_priority, transparency */ - if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,1,0,0,TRUE); - if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen->machine(),bitmap,cliprect,0,0,0,TRUE); + if (state->m_active_layers & 0x20) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,1,0,0,TRUE); + if (state->m_active_layers & 0x10) f1gpstar_draw_road(screen.machine(),bitmap,cliprect,0,0,0,TRUE); - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,1,1); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,1,1); cischeat_tmap_DRAW(2) - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,0,0); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,0,0); state->m_active_layers = active_layers1; @@ -1414,30 +1414,30 @@ Scud Hammer **************************************************************************/ -SCREEN_UPDATE( scudhamm ) +SCREEN_UPDATE_IND16( scudhamm ) { - cischeat_state *state = screen->machine().driver_data(); + cischeat_state *state = screen.machine().driver_data(); int active_layers1, flag; active_layers1 = state->m_active_layers; state->m_active_layers = 0x0d; #ifdef MAME_DEBUG state->m_debugsprites = 0; -if ( screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X) ) +if ( screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) { msk |= 0x1;} - if (screen->machine().input().code_pressed(KEYCODE_W)) { msk |= 0x2;} - if (screen->machine().input().code_pressed(KEYCODE_E)) { msk |= 0x4;} - if (screen->machine().input().code_pressed(KEYCODE_A)) { msk |= 0x8; state->m_debugsprites = 1;} - if (screen->machine().input().code_pressed(KEYCODE_S)) { msk |= 0x8; state->m_debugsprites = 2;} - if (screen->machine().input().code_pressed(KEYCODE_D)) { msk |= 0x8; state->m_debugsprites = 3;} - if (screen->machine().input().code_pressed(KEYCODE_F)) { msk |= 0x8; state->m_debugsprites = 4;} + if (screen.machine().input().code_pressed(KEYCODE_Q)) { msk |= 0x1;} + if (screen.machine().input().code_pressed(KEYCODE_W)) { msk |= 0x2;} + if (screen.machine().input().code_pressed(KEYCODE_E)) { msk |= 0x4;} + if (screen.machine().input().code_pressed(KEYCODE_A)) { msk |= 0x8; state->m_debugsprites = 1;} + if (screen.machine().input().code_pressed(KEYCODE_S)) { msk |= 0x8; state->m_debugsprites = 2;} + if (screen.machine().input().code_pressed(KEYCODE_D)) { msk |= 0x8; state->m_debugsprites = 3;} + if (screen.machine().input().code_pressed(KEYCODE_F)) { msk |= 0x8; state->m_debugsprites = 4;} if (msk != 0) state->m_active_layers &= msk; #if 1 { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); popmessage("Cmd: %04X Pos:%04X Lim:%04X Inp:%04X", state->m_scudhamm_motor_command, @@ -1453,12 +1453,12 @@ cischeat_tmap_SET_SCROLL(0) cischeat_tmap_SET_SCROLL(2) - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); flag = 0; cischeat_tmap_DRAW(0) // no layer 1 - if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen->machine(),bitmap,cliprect,0,15); + if (state->m_active_layers & 0x08) cischeat_draw_sprites(screen.machine(),bitmap,cliprect,0,15); cischeat_tmap_DRAW(2) state->m_active_layers = active_layers1; diff -Nru mame-0.144/src/mame/video/citycon.c mame-0.145/src/mame/video/citycon.c --- mame-0.144/src/mame/video/citycon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/citycon.c 2012-02-06 21:30:32.000000000 +0000 @@ -58,8 +58,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, citycon_scan, 8, 8, 128, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, citycon_scan, 8, 8, 128, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scroll_rows(state->m_fg_tilemap, 32); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scroll_rows(32); } @@ -74,7 +74,7 @@ { citycon_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -93,7 +93,7 @@ if (state->m_bg_image != (data >> 4)) { state->m_bg_image = (data >> 4); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 0 flips screen */ @@ -106,7 +106,7 @@ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { citycon_state *state = machine.driver_data(); int offs; @@ -140,9 +140,9 @@ palette_set_color_rgb(machine, color, pal4bit(data >> 12), pal4bit(data >> 8), pal4bit(data >> 4)); } -SCREEN_UPDATE( citycon ) +SCREEN_UPDATE_IND16( citycon ) { - citycon_state *state = screen->machine().driver_data(); + citycon_state *state = screen.machine().driver_data(); int offs, scroll; /* Update the virtual palette to support text color code changing on every scanline. */ @@ -152,17 +152,17 @@ int i; for (i = 0; i < 4; i++) - changecolor_RRRRGGGGBBBBxxxx(screen->machine(), 640 + 4 * offs + i, 512 + 4 * indx + i); + changecolor_RRRRGGGGBBBBxxxx(screen.machine(), 640 + 4 * offs + i, 512 + 4 * indx + i); } scroll = state->m_scroll[0] * 256 + state->m_scroll[1]; - tilemap_set_scrollx(state->m_bg_tilemap, 0, scroll >> 1); + state->m_bg_tilemap->set_scrollx(0, scroll >> 1); for (offs = 6; offs < 32; offs++) - tilemap_set_scrollx(state->m_fg_tilemap, offs, scroll); + state->m_fg_tilemap->set_scrollx(offs, scroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/cloak.c mame-0.145/src/mame/video/cloak.c --- mame-0.144/src/mame/video/cloak.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cloak.c 2012-02-06 21:30:31.000000000 +0000 @@ -150,7 +150,7 @@ UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( cloak_flipscreen_w ) @@ -188,22 +188,22 @@ machine.save().register_postload(save_prepost_delegate(FUNC(set_current_bitmap_videoram_pointer), state)); } -static void draw_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cloak_state *state = machine.driver_data(); int x, y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { pen_t pen = state->m_current_bitmap_videoram_displayed[(y << 8) | x] & 0x07; if (pen) - *BITMAP_ADDR16(bitmap, y, (x - 6) & 0xff) = 0x10 | ((x & 0x80) >> 4) | pen; + bitmap.pix16(y, (x - 6) & 0xff) = 0x10 | ((x & 0x80) >> 4) | pen; } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { cloak_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -229,12 +229,12 @@ } } -SCREEN_UPDATE( cloak ) +SCREEN_UPDATE_IND16( cloak ) { - cloak_state *state = screen->machine().driver_data(); - set_pens(screen->machine()); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + cloak_state *state = screen.machine().driver_data(); + set_pens(screen.machine()); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/cloud9.c mame-0.145/src/mame/video/cloud9.c --- mame-0.144/src/mame/video/cloud9.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cloud9.c 2012-02-06 21:30:31.000000000 +0000 @@ -36,7 +36,7 @@ 3, resistances, state->m_bweights, 1000, 0); /* allocate a bitmap for drawing sprites */ - state->m_spritebitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_spritebitmap); /* register for savestates */ state->save_pointer(NAME(state->m_videoram), 0x8000); @@ -247,16 +247,16 @@ * *************************************/ -SCREEN_UPDATE( cloud9 ) +SCREEN_UPDATE_IND16( cloud9 ) { - cloud9_state *state = screen->machine().driver_data(); + cloud9_state *state = screen.machine().driver_data(); UINT8 *spriteaddr = state->m_spriteram; int flip = state->m_video_control[5] ? 0xff : 0x00; /* PLAYER2 */ - pen_t black = get_black_pen(screen->machine()); + pen_t black = get_black_pen(screen.machine()); int x, y, offs; /* draw the sprites */ - bitmap_fill(state->m_spritebitmap, cliprect, 0x00); + state->m_spritebitmap.fill(0x00, cliprect); for (offs = 0; offs < 0x20; offs++) if (spriteaddr[offs + 0x00] != 0) { @@ -267,27 +267,27 @@ int which = spriteaddr[offs + 0x20]; int color = 0; - drawgfx_transpen(state->m_spritebitmap, cliprect, screen->machine().gfx[0], which, color, xflip, yflip, x, y, 0); + drawgfx_transpen(state->m_spritebitmap, cliprect, screen.machine().gfx[0], which, color, xflip, yflip, x, y, 0); if (x >= 256 - 16) - drawgfx_transpen(state->m_spritebitmap, cliprect, screen->machine().gfx[0], which, color, xflip, yflip, x - 256, y, 0); + drawgfx_transpen(state->m_spritebitmap, cliprect, screen.machine().gfx[0], which, color, xflip, yflip, x - 256, y, 0); } /* draw the bitmap to the screen, looping over Y */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *dst = &bitmap.pix16(y); /* if we're in the VBLANK region, just fill with black */ if (~state->m_syncprom[y] & 2) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = black; } /* non-VBLANK region: merge the sprites and the bitmap */ else { - UINT16 *mosrc = (UINT16 *)state->m_spritebitmap->base + y * state->m_spritebitmap->rowpixels; + UINT16 *mosrc = &state->m_spritebitmap.pix16(y); int effy = y ^ flip; UINT8 *src[2]; @@ -296,7 +296,7 @@ src[1] = &state->m_videoram[0x0000 | (effy * 64)]; /* loop over X */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { /* if we're in the HBLANK region, just store black */ if (x >= 256) diff -Nru mame-0.144/src/mame/video/clshroad.c mame-0.145/src/mame/video/clshroad.c --- mame-0.144/src/mame/video/clshroad.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/clshroad.c 2012-02-06 21:30:31.000000000 +0000 @@ -136,8 +136,8 @@ int tile_index = offset / 2; int tile = (tile_index & 0x1f) + (tile_index & ~0x3f)/2; state->m_vram_0[offset] = data; - if (tile_index & 0x20) tilemap_mark_tile_dirty(state->m_tilemap_0a, tile); - else tilemap_mark_tile_dirty(state->m_tilemap_0b, tile); + if (tile_index & 0x20) state->m_tilemap_0a->mark_tile_dirty(tile); + else state->m_tilemap_0b->mark_tile_dirty(tile); } /*************************************************************************** @@ -180,7 +180,7 @@ clshroad_state *state = machine.driver_data(); UINT8 code = state->m_vram_1[ tile_index + 0x000 ]; UINT8 color = state->m_vram_1[ tile_index + 0x400 ] & 0x3f; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO( 2, code, @@ -204,7 +204,7 @@ { clshroad_state *state = space->machine().driver_data(); state->m_vram_1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_1, offset % 0x400); + state->m_tilemap_1->mark_tile_dirty(offset % 0x400); } @@ -217,18 +217,18 @@ /* Text (No scrolling) */ state->m_tilemap_1 = tilemap_create(machine, get_tile_info_fb1,tilemap_scan_rows_extra,8,8,0x24,0x20); - tilemap_set_scroll_rows( state->m_tilemap_0a, 1); - tilemap_set_scroll_rows( state->m_tilemap_0b, 1); - tilemap_set_scroll_rows( state->m_tilemap_1, 1); - - tilemap_set_scroll_cols( state->m_tilemap_0a, 1); - tilemap_set_scroll_cols( state->m_tilemap_0b, 1); - tilemap_set_scroll_cols( state->m_tilemap_1, 1); + state->m_tilemap_0a->set_scroll_rows(1); + state->m_tilemap_0b->set_scroll_rows(1); + state->m_tilemap_1->set_scroll_rows(1); + + state->m_tilemap_0a->set_scroll_cols(1); + state->m_tilemap_0b->set_scroll_cols(1); + state->m_tilemap_1->set_scroll_cols(1); - tilemap_set_scrolldx( state->m_tilemap_0a, -0x30, -0xb5); - tilemap_set_scrolldx( state->m_tilemap_0b, -0x30, -0xb5); + state->m_tilemap_0a->set_scrolldx(-0x30, -0xb5); + state->m_tilemap_0b->set_scrolldx(-0x30, -0xb5); - tilemap_set_transparent_pen( state->m_tilemap_0b, 0 ); + state->m_tilemap_0b->set_transparent_pen(0 ); colortable_configure_tilemap_groups(machine.colortable, state->m_tilemap_1, machine.gfx[2], 0x0f); } @@ -241,19 +241,19 @@ /* Text (No scrolling) */ state->m_tilemap_1 = tilemap_create(machine, get_tile_info_1,tilemap_scan_rows_extra,8,8,0x24,0x20); - tilemap_set_scroll_rows( state->m_tilemap_0a, 1); - tilemap_set_scroll_rows( state->m_tilemap_0b, 1); - tilemap_set_scroll_rows( state->m_tilemap_1, 1); - - tilemap_set_scroll_cols( state->m_tilemap_0a, 1); - tilemap_set_scroll_cols( state->m_tilemap_0b, 1); - tilemap_set_scroll_cols( state->m_tilemap_1, 1); + state->m_tilemap_0a->set_scroll_rows(1); + state->m_tilemap_0b->set_scroll_rows(1); + state->m_tilemap_1->set_scroll_rows(1); + + state->m_tilemap_0a->set_scroll_cols(1); + state->m_tilemap_0b->set_scroll_cols(1); + state->m_tilemap_1->set_scroll_cols(1); - tilemap_set_scrolldx( state->m_tilemap_0a, -0x30, -0xb5); - tilemap_set_scrolldx( state->m_tilemap_0b, -0x30, -0xb5); + state->m_tilemap_0a->set_scrolldx(-0x30, -0xb5); + state->m_tilemap_0b->set_scrolldx(-0x30, -0xb5); - tilemap_set_transparent_pen( state->m_tilemap_0b, 0x0f ); - tilemap_set_transparent_pen( state->m_tilemap_1, 0x0f ); + state->m_tilemap_0b->set_transparent_pen(0x0f ); + state->m_tilemap_1->set_transparent_pen(0x0f ); } @@ -286,7 +286,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { clshroad_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -327,19 +327,19 @@ ***************************************************************************/ -SCREEN_UPDATE( clshroad ) +SCREEN_UPDATE_IND16( clshroad ) { - clshroad_state *state = screen->machine().driver_data(); + clshroad_state *state = screen.machine().driver_data(); int scrollx = state->m_vregs[ 0 ] + (state->m_vregs[ 1 ] << 8); // int priority = state->m_vregs[ 2 ]; /* Only horizontal scrolling (these 2 layers use the same value) */ - tilemap_set_scrollx(state->m_tilemap_0a, 0, scrollx); - tilemap_set_scrollx(state->m_tilemap_0b, 0, scrollx); + state->m_tilemap_0a->set_scrollx(0, scrollx); + state->m_tilemap_0b->set_scrollx(0, scrollx); - tilemap_draw(bitmap,cliprect,state->m_tilemap_0a,0,0); // Opaque - tilemap_draw(bitmap,cliprect,state->m_tilemap_0b,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); + state->m_tilemap_0a->draw(bitmap, cliprect, 0,0); // Opaque + state->m_tilemap_0b->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tilemap_1->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/cninja.c mame-0.145/src/mame/video/cninja.c --- mame-0.144/src/mame/video/cninja.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/cninja.c 2012-02-06 21:30:31.000000000 +0000 @@ -26,7 +26,7 @@ /* The bootleg sprites are in a different format! */ -static void cninjabl_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void cninjabl_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT16 *buffered_spriteram = machine.generic.buffered_spriteram.u16; int offs; @@ -124,74 +124,74 @@ /******************************************************************************/ -SCREEN_UPDATE( cninja ) +SCREEN_UPDATE_IND16( cninja ) { - cninja_state *state = screen->machine().driver_data(); + cninja_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 512); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(512, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 1); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 2); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 4); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( cninjabl ) +SCREEN_UPDATE_IND16( cninjabl ) { - cninja_state *state = screen->machine().driver_data(); + cninja_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); /* force layers to be enabled */ deco16ic_set_enable(state->m_deco_tilegen2, 0, 1 ); deco16ic_set_enable(state->m_deco_tilegen2, 1, 1 ); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 512); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(512, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 1); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 2); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 4); - cninjabl_draw_sprites(screen->machine(), bitmap, cliprect); + cninjabl_draw_sprites(screen.machine(), bitmap, cliprect); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( edrandy ) +SCREEN_UPDATE_IND16( edrandy ) { - cninja_state *state = screen->machine().driver_data(); + cninja_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 1); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( robocop2 ) +SCREEN_UPDATE_IND16( robocop2 ) { - cninja_state *state = screen->machine().driver_data(); + cninja_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); @@ -210,13 +210,13 @@ } /* Update playfields */ - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0x200); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0x200, cliprect); if ((priority & 4) == 0) deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 1); @@ -235,35 +235,35 @@ break; } - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } VIDEO_START( mutantf ) { - machine.device("spritegen1")->alloc_sprite_bitmap(machine); - machine.device("spritegen2")->alloc_sprite_bitmap(machine); + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); } -SCREEN_UPDATE( mutantf ) +SCREEN_UPDATE_RGB32( mutantf ) { - cninja_state *state = screen->machine().driver_data(); + cninja_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - bitmap_fill(bitmap, cliprect, 0x400); /* Confirmed */ + bitmap.fill(0x400, cliprect); /* Confirmed */ - screen->machine().device("spritegen1")->set_alt_format(true); - screen->machine().device("spritegen2")->set_alt_format(true); - screen->machine().device("spritegen2")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u16, 0x400, true); - screen->machine().device("spritegen1")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400, true); + screen.machine().device("spritegen1")->set_alt_format(true); + screen.machine().device("spritegen2")->set_alt_format(true); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u16, 0x400, true); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, true); /* There is no priority prom on this board, but there is a @@ -284,13 +284,13 @@ if (priority & 1) { - screen->machine().device("spritegen1")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0000, 0x100, 0x1ff); - screen->machine().device("spritegen2")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0000, 1024+768, 0x0ff, 0x80); // fixed alpha of 0x80 for this layer? + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 0x100, 0x1ff); + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 1024+768, 0x0ff, 0x80); // fixed alpha of 0x80 for this layer? } else { - screen->machine().device("spritegen2")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0000, 1024+768, 0x0ff, 0x80); // fixed alpha of 0x80 for this layer? - screen->machine().device("spritegen1")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0000, 0x100, 0x1ff); + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 1024+768, 0x0ff, 0x80); // fixed alpha of 0x80 for this layer? + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 0x100, 0x1ff); } deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; diff -Nru mame-0.144/src/mame/video/combatsc.c mame-0.145/src/mame/video/combatsc.c --- mame-0.144/src/mame/video/combatsc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/combatsc.c 2012-02-06 21:30:31.000000000 +0000 @@ -143,7 +143,7 @@ number, color, 0); - tileinfo->category = (attributes & 0x40) >> 6; + tileinfo.category = (attributes & 0x40) >> 6; } static TILE_GET_INFO( get_tile_info1 ) @@ -178,7 +178,7 @@ number, color, 0); - tileinfo->category = (attributes & 0x40) >> 6; + tileinfo.category = (attributes & 0x40) >> 6; } static TILE_GET_INFO( get_text_info ) @@ -293,11 +293,11 @@ state->m_spriteram[0] = auto_alloc_array_clear(machine, UINT8, 0x800); state->m_spriteram[1] = auto_alloc_array_clear(machine, UINT8, 0x800); - tilemap_set_transparent_pen(state->m_bg_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1], 0); - tilemap_set_transparent_pen(state->m_textlayer, 0); + state->m_bg_tilemap[0]->set_transparent_pen(0); + state->m_bg_tilemap[1]->set_transparent_pen(0); + state->m_textlayer->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_textlayer, 32); + state->m_textlayer->set_scroll_rows(32); state->save_pointer(NAME(state->m_spriteram[0]), 0x800); state->save_pointer(NAME(state->m_spriteram[1]), 0x800); @@ -314,12 +314,12 @@ state->m_spriteram[0] = auto_alloc_array_clear(machine, UINT8, 0x800); state->m_spriteram[1] = auto_alloc_array_clear(machine, UINT8, 0x800); - tilemap_set_transparent_pen(state->m_bg_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1], 0); - tilemap_set_transparent_pen(state->m_textlayer, 0); + state->m_bg_tilemap[0]->set_transparent_pen(0); + state->m_bg_tilemap[1]->set_transparent_pen(0); + state->m_textlayer->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_bg_tilemap[0], 32); - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 32); + state->m_bg_tilemap[0]->set_scroll_rows(32); + state->m_bg_tilemap[1]->set_scroll_rows(32); state->save_pointer(NAME(state->m_spriteram[0]), 0x800); state->save_pointer(NAME(state->m_spriteram[1]), 0x800); @@ -345,13 +345,13 @@ if (offset < 0x800) { if (state->m_video_circuit) - tilemap_mark_tile_dirty(state->m_bg_tilemap[1], offset & 0x3ff); + state->m_bg_tilemap[1]->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_bg_tilemap[0], offset & 0x3ff); + state->m_bg_tilemap[0]->mark_tile_dirty(offset & 0x3ff); } else if (offset < 0x1000 && state->m_video_circuit == 0) { - tilemap_mark_tile_dirty(state->m_textlayer, offset & 0x3ff); + state->m_textlayer->mark_tile_dirty(offset & 0x3ff); } } @@ -362,7 +362,7 @@ k007121_ctrl_w(k007121, offset, data); if (offset == 7) - tilemap_set_flip(state->m_bg_tilemap[state->m_video_circuit],(data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap[state->m_video_circuit]->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (offset == 3) { @@ -393,7 +393,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *source, int circuit, UINT32 pri_mask ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *source, int circuit, UINT32 pri_mask ) { combatsc_state *state = machine.driver_data(); device_t *k007121 = circuit ? state->m_k007121_2 : state->m_k007121_1; @@ -403,71 +403,71 @@ } -SCREEN_UPDATE( combatsc ) +SCREEN_UPDATE_IND16( combatsc ) { - combatsc_state *state = screen->machine().driver_data(); + combatsc_state *state = screen.machine().driver_data(); int i; - set_pens(screen->machine()); + set_pens(screen.machine()); if (k007121_ctrlram_r(state->m_k007121_1, 1) & 0x02) { - tilemap_set_scroll_rows(state->m_bg_tilemap[0], 32); + state->m_bg_tilemap[0]->set_scroll_rows(32); for (i = 0; i < 32; i++) - tilemap_set_scrollx(state->m_bg_tilemap[0], i, state->m_scrollram0[i]); + state->m_bg_tilemap[0]->set_scrollx(i, state->m_scrollram0[i]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap[0], 1); - tilemap_set_scrollx(state->m_bg_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121_1, 0) | ((k007121_ctrlram_r(state->m_k007121_1, 1) & 0x01) << 8)); + state->m_bg_tilemap[0]->set_scroll_rows(1); + state->m_bg_tilemap[0]->set_scrollx(0, k007121_ctrlram_r(state->m_k007121_1, 0) | ((k007121_ctrlram_r(state->m_k007121_1, 1) & 0x01) << 8)); } if (k007121_ctrlram_r(state->m_k007121_2, 1) & 0x02) { - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 32); + state->m_bg_tilemap[1]->set_scroll_rows(32); for (i = 0; i < 32; i++) - tilemap_set_scrollx(state->m_bg_tilemap[1], i, state->m_scrollram1[i]); + state->m_bg_tilemap[1]->set_scrollx(i, state->m_scrollram1[i]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1); - tilemap_set_scrollx(state->m_bg_tilemap[1], 0, k007121_ctrlram_r(state->m_k007121_2, 0) | ((k007121_ctrlram_r(state->m_k007121_2, 1) & 0x01) << 8)); + state->m_bg_tilemap[1]->set_scroll_rows(1); + state->m_bg_tilemap[1]->set_scrollx(0, k007121_ctrlram_r(state->m_k007121_2, 0) | ((k007121_ctrlram_r(state->m_k007121_2, 1) & 0x01) << 8)); } - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121_1, 2)); - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, k007121_ctrlram_r(state->m_k007121_2, 2)); + state->m_bg_tilemap[0]->set_scrolly(0, k007121_ctrlram_r(state->m_k007121_1, 2)); + state->m_bg_tilemap[1]->set_scrolly(0, k007121_ctrlram_r(state->m_k007121_2, 2)); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_priority == 0) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], TILEMAP_DRAW_OPAQUE | 0, 4); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], TILEMAP_DRAW_OPAQUE | 1, 8); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], 0, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], 1, 2); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 4); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 8); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 0, 1); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 1, 2); /* we use the priority buffer so sprites are drawn front to back */ - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram[1], 1, 0x0f00); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram[0], 0, 0x4444); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram[1], 1, 0x0f00); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram[0], 0, 0x4444); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], TILEMAP_DRAW_OPAQUE | 0, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], TILEMAP_DRAW_OPAQUE | 1, 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], 1, 4); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], 0, 8); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 1); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 2); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 1, 4); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 0, 8); /* we use the priority buffer so sprites are drawn front to back */ - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram[1], 1, 0x0f00); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram[0], 0, 0x4444); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram[1], 1, 0x0f00); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram[0], 0, 0x4444); } if (k007121_ctrlram_r(state->m_k007121_1, 1) & 0x08) { for (i = 0; i < 32; i++) { - tilemap_set_scrollx(state->m_textlayer, i, state->m_scrollram0[0x20 + i] ? 0 : TILE_LINE_DISABLED); - tilemap_draw(bitmap, cliprect, state->m_textlayer, 0, 0); + state->m_textlayer->set_scrollx(i, state->m_scrollram0[0x20 + i] ? 0 : TILE_LINE_DISABLED); + state->m_textlayer->draw(bitmap, cliprect, 0, 0); } } @@ -476,13 +476,13 @@ { rectangle clip; - clip = *cliprect; + clip = cliprect; clip.max_x = clip.min_x + 7; - bitmap_fill(bitmap, &clip, 0); + bitmap.fill(0, clip); - clip = *cliprect; + clip = cliprect; clip.min_x = clip.max_x - 7; - bitmap_fill(bitmap, &clip, 0); + bitmap.fill(0, clip); } return 0; } @@ -515,7 +515,7 @@ ***************************************************************************/ -static void bootleg_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *source, int circuit ) +static void bootleg_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *source, int circuit ) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); const gfx_element *gfx = machine.gfx[circuit + 2]; @@ -561,36 +561,36 @@ } } -SCREEN_UPDATE( combatscb ) +SCREEN_UPDATE_IND16( combatscb ) { - combatsc_state *state = screen->machine().driver_data(); + combatsc_state *state = screen.machine().driver_data(); int i; - set_pens(screen->machine()); + set_pens(screen.machine()); for (i = 0; i < 32; i++) { - tilemap_set_scrollx(state->m_bg_tilemap[0], i, state->m_io_ram[0x040 + i] + 5); - tilemap_set_scrollx(state->m_bg_tilemap[1], i, state->m_io_ram[0x060 + i] + 3); + state->m_bg_tilemap[0]->set_scrollx(i, state->m_io_ram[0x040 + i] + 5); + state->m_bg_tilemap[1]->set_scrollx(i, state->m_io_ram[0x060 + i] + 3); } - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_io_ram[0x000] + 1); - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_io_ram[0x020] + 1); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_io_ram[0x000] + 1); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_io_ram[0x020] + 1); if (state->m_priority == 0) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(screen->machine(), bitmap,cliprect, state->m_page[0], 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], 0 ,0); - bootleg_draw_sprites(screen->machine(), bitmap,cliprect, state->m_page[1], 1); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + bootleg_draw_sprites(screen.machine(), bitmap,cliprect, state->m_page[0], 0); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 0 ,0); + bootleg_draw_sprites(screen.machine(), bitmap,cliprect, state->m_page[1], 1); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(screen->machine(), bitmap,cliprect, state->m_page[0], 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], 0, 0); - bootleg_draw_sprites(screen->machine(), bitmap,cliprect, state->m_page[1], 1); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + bootleg_draw_sprites(screen.machine(), bitmap,cliprect, state->m_page[0], 0); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 0, 0); + bootleg_draw_sprites(screen.machine(), bitmap,cliprect, state->m_page[1], 1); } - tilemap_draw(bitmap, cliprect, state->m_textlayer, 0, 0); + state->m_textlayer->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/commando.c mame-0.145/src/mame/video/commando.c --- mame-0.144/src/mame/video/commando.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/commando.c 2012-02-06 21:30:32.000000000 +0000 @@ -15,7 +15,7 @@ commando_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( commando_colorram_w ) @@ -23,7 +23,7 @@ commando_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( commando_videoram2_w ) @@ -31,7 +31,7 @@ commando_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( commando_colorram2_w ) @@ -39,7 +39,7 @@ commando_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( commando_scrollx_w ) @@ -47,7 +47,7 @@ commando_state *state = space->machine().driver_data(); state->m_scroll_x[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_x[0] | (state->m_scroll_x[1] << 8)); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x[0] | (state->m_scroll_x[1] << 8)); } WRITE8_HANDLER( commando_scrolly_w ) @@ -55,7 +55,7 @@ commando_state *state = space->machine().driver_data(); state->m_scroll_y[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_y[0] | (state->m_scroll_y[1] << 8)); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_y[0] | (state->m_scroll_y[1] << 8)); } WRITE8_HANDLER( commando_c804_w ) @@ -102,10 +102,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(3); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; int offs; @@ -135,19 +135,23 @@ } } -SCREEN_UPDATE( commando ) +SCREEN_UPDATE_IND16( commando ) { - commando_state *state = screen->machine().driver_data(); + commando_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( commando ) +SCREEN_VBLANK( commando ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/compgolf.c mame-0.145/src/mame/video/compgolf.c --- mame-0.144/src/mame/video/compgolf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/compgolf.c 2012-02-06 21:30:31.000000000 +0000 @@ -37,14 +37,14 @@ { compgolf_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_text_tilemap, offset / 2); + state->m_text_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( compgolf_back_w ) { compgolf_state *state = space->machine().driver_data(); state->m_bg_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_text_info ) @@ -76,7 +76,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_back_info, back_scan, 16, 16, 32, 32); state->m_text_tilemap = tilemap_create(machine, get_text_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); + state->m_text_tilemap->set_transparent_pen(0); } /* @@ -90,7 +90,7 @@ -----x-- -------- -------- -------- Flip X -------- -------- -------- -------- Flip Y(used?) */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { compgolf_state *state = machine.driver_data(); int offs, fx, fy, x, y, color, sprite; @@ -118,17 +118,17 @@ } } -SCREEN_UPDATE( compgolf ) +SCREEN_UPDATE_IND16( compgolf ) { - compgolf_state *state = screen->machine().driver_data(); + compgolf_state *state = screen.machine().driver_data(); int scrollx = state->m_scrollx_hi + state->m_scrollx_lo; int scrolly = state->m_scrolly_hi + state->m_scrolly_lo; - tilemap_set_scrollx(state->m_bg_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, scrolly); + state->m_bg_tilemap->set_scrollx(0, scrollx); + state->m_bg_tilemap->set_scrolly(0, scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/contra.c mame-0.145/src/mame/video/contra.c --- mame-0.144/src/mame/video/contra.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/contra.c 2012-02-06 21:30:32.000000000 +0000 @@ -184,7 +184,7 @@ state->m_tx_clip.max_x = 39; state->m_tx_clip.min_x = 0; - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->save_pointer(NAME(state->m_buffered_spriteram), 0x800); state->save_pointer(NAME(state->m_buffered_spriteram_2), 0x800); @@ -202,7 +202,7 @@ contra_state *state = space->machine().driver_data(); state->m_fg_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_fg_cram_w ) @@ -210,7 +210,7 @@ contra_state *state = space->machine().driver_data(); state->m_fg_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_bg_vram_w ) @@ -218,7 +218,7 @@ contra_state *state = space->machine().driver_data(); state->m_bg_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_bg_cram_w ) @@ -226,7 +226,7 @@ contra_state *state = space->machine().driver_data(); state->m_bg_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_text_vram_w ) @@ -234,7 +234,7 @@ contra_state *state = space->machine().driver_data(); state->m_tx_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_text_cram_w ) @@ -242,7 +242,7 @@ contra_state *state = space->machine().driver_data(); state->m_tx_cram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( contra_K007121_ctrl_0_w ) @@ -261,11 +261,11 @@ if (offset == 6) { if (ctrl_6 != data) - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } if (offset == 7) - tilemap_set_flip(state->m_fg_tilemap, (data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_fg_tilemap->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); k007121_ctrl_w(state->m_k007121_1, offset, data); } @@ -285,10 +285,10 @@ if (offset == 6) { if (ctrl_6 != data ) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (offset == 7) - tilemap_set_flip(state->m_bg_tilemap, (data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); k007121_ctrl_w(state->m_k007121_2, offset, data); } @@ -301,7 +301,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank ) { contra_state *state = machine.driver_data(); device_t *k007121 = bank ? state->m_k007121_2 : state->m_k007121_1; @@ -316,9 +316,9 @@ k007121_sprites_draw(k007121, bitmap, cliprect, machine.gfx[bank], machine.colortable, source, base_color, 40, 0, (UINT32)-1); } -SCREEN_UPDATE( contra ) +SCREEN_UPDATE_IND16( contra ) { - contra_state *state = screen->machine().driver_data(); + contra_state *state = screen.machine().driver_data(); UINT8 ctrl_1_0 = k007121_ctrlram_r(state->m_k007121_1, 0); UINT8 ctrl_1_2 = k007121_ctrlram_r(state->m_k007121_1, 2); UINT8 ctrl_2_0 = k007121_ctrlram_r(state->m_k007121_2, 0); @@ -327,21 +327,21 @@ rectangle fg_finalclip = state->m_fg_clip; rectangle tx_finalclip = state->m_tx_clip; - sect_rect(&bg_finalclip, cliprect); - sect_rect(&fg_finalclip, cliprect); - sect_rect(&tx_finalclip, cliprect); - - set_pens(screen->machine()); - - tilemap_set_scrollx(state->m_fg_tilemap, 0, ctrl_1_0 - 40); - tilemap_set_scrolly(state->m_fg_tilemap, 0, ctrl_1_2); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ctrl_2_0 - 40); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ctrl_2_2); - - tilemap_draw(bitmap, &bg_finalclip, state->m_bg_tilemap, 0 ,0); - tilemap_draw(bitmap, &fg_finalclip, state->m_fg_tilemap, 0 ,0); - draw_sprites(screen->machine(),bitmap,cliprect, 0); - draw_sprites(screen->machine(),bitmap,cliprect, 1); - tilemap_draw(bitmap, &tx_finalclip, state->m_tx_tilemap, 0 ,0); + bg_finalclip &= cliprect; + fg_finalclip &= cliprect; + tx_finalclip &= cliprect; + + set_pens(screen.machine()); + + state->m_fg_tilemap->set_scrollx(0, ctrl_1_0 - 40); + state->m_fg_tilemap->set_scrolly(0, ctrl_1_2); + state->m_bg_tilemap->set_scrollx(0, ctrl_2_0 - 40); + state->m_bg_tilemap->set_scrolly(0, ctrl_2_2); + + state->m_bg_tilemap->draw(bitmap, bg_finalclip, 0 ,0); + state->m_fg_tilemap->draw(bitmap, fg_finalclip, 0 ,0); + draw_sprites(screen.machine(),bitmap,cliprect, 0); + draw_sprites(screen.machine(),bitmap,cliprect, 1); + state->m_tx_tilemap->draw(bitmap, tx_finalclip, 0 ,0); return 0; } diff -Nru mame-0.144/src/mame/video/cop01.c mame-0.145/src/mame/video/cop01.c --- mame-0.144/src/mame/video/cop01.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/cop01.c 2012-02-06 21:30:31.000000000 +0000 @@ -81,7 +81,7 @@ pri = 0; SET_TILE_INFO(1, tile + ((attr & 0x03) << 8), (attr & 0x1c) >> 2, 0); - tileinfo->group = pri; + tileinfo.group = pri; } static TILE_GET_INFO( get_fg_tile_info ) @@ -105,11 +105,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8, 8, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); /* priority doesn't exactly work this way, see above */ - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0fff, 0xf000); /* split type 1 has pens 0-11 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0fff, 0xf000); /* split type 1 has pens 0-11 transparent in front half */ } @@ -124,14 +124,14 @@ { cop01_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( cop01_foreground_w ) { cop01_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( cop01_vreg_w ) @@ -166,7 +166,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cop01_state *state = machine.driver_data(); int offs, code, attr, sx, sy, flipx, flipy, color; @@ -206,15 +206,15 @@ } -SCREEN_UPDATE( cop01 ) +SCREEN_UPDATE_IND16( cop01 ) { - cop01_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_vreg[1] + 256 * (state->m_vreg[2] & 1)); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_vreg[3]); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0 ); + cop01_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_vreg[1] + 256 * (state->m_vreg[2] & 1)); + state->m_bg_tilemap->set_scrolly(0, state->m_vreg[3]); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0 ); return 0; } diff -Nru mame-0.144/src/mame/video/copsnrob.c mame-0.145/src/mame/video/copsnrob.c --- mame-0.144/src/mame/video/copsnrob.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/copsnrob.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,9 +8,9 @@ #include "includes/copsnrob.h" -SCREEN_UPDATE( copsnrob ) +SCREEN_UPDATE_IND16( copsnrob ) { - copsnrob_state *state = screen->machine().driver_data(); + copsnrob_state *state = screen.machine().driver_data(); int offs, x, y; /* redrawing the entire display is faster in this case */ @@ -22,7 +22,7 @@ sx = 31 - (offs % 32); sy = offs / 32; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs] & 0x3f,0, 0,0, 8*sx,8*sy); @@ -31,25 +31,25 @@ /* Draw the cars. Positioning was based on a screen shot */ if (state->m_cary[0]) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_carimage[0],0, 1,0, 0xe4,256 - state->m_cary[0],0); if (state->m_cary[1]) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_carimage[1],0, 1,0, 0xc4,256 - state->m_cary[1],0); if (state->m_cary[2]) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_carimage[2],0, 0,0, 0x24,256 - state->m_cary[2],0); if (state->m_cary[3]) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_carimage[3],0, 0,0, 0x04,256 - state->m_cary[3],0); @@ -78,7 +78,7 @@ { /* We've hit a truck's back end, so draw the truck. The front end may be off the top of the screen, but we don't care. */ - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], 0,0, 0,0, 0x80,256 - (y + 31),0); @@ -90,7 +90,7 @@ { /* We missed a truck's back end (it was off the bottom of the screen) but have hit its front end, so draw the truck. */ - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], 0,0, 0,0, 0x80,256 - y,0); @@ -121,9 +121,9 @@ { if (val & mask1) { - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) if (state->m_bulletsram[y] & mask2) - *BITMAP_ADDR16(bitmap, y, 256 - x) = 1; + bitmap.pix16(y, 256 - x) = 1; } mask1 <<= 1; diff -Nru mame-0.144/src/mame/video/cosmic.c mame-0.145/src/mame/video/cosmic.c --- mame-0.144/src/mame/video/cosmic.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cosmic.c 2012-02-06 21:30:32.000000000 +0000 @@ -251,7 +251,7 @@ } -static void draw_bitmap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bitmap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cosmic_state *state = machine.driver_data(); offs_t offs; @@ -271,9 +271,9 @@ if (data & 0x80) { if (flip_screen_get(machine)) - *BITMAP_ADDR16(bitmap, 255-y, 255-x) = pen; + bitmap.pix16(255-y, 255-x) = pen; else - *BITMAP_ADDR16(bitmap, y, x) = pen; + bitmap.pix16(y, x) = pen; } x++; @@ -283,7 +283,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int color_mask, int extra_sprites ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int color_mask, int extra_sprites ) { cosmic_state *state = machine.driver_data(); int offs; @@ -317,11 +317,11 @@ } -static void cosmica_draw_starfield( screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect ) +static void cosmica_draw_starfield( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 y = 0; UINT8 map = 0; - UINT8 *PROM = screen->machine().region("user2")->base(); + UINT8 *PROM = screen.machine().region("user2")->base(); while (1) { @@ -335,10 +335,10 @@ UINT8 x1; int hc, hb_; - if (flip_screen_get(screen->machine())) - x1 = x - screen->frame_number(); + if (flip_screen_get(screen.machine())) + x1 = x - screen.frame_number(); else - x1 = x + screen->frame_number(); + x1 = x + screen.frame_number(); hc = (x1 >> 2) & 0x01; hb_ = (x >> 5) & 0x01; /* not a bug, this one is the real x */ @@ -353,7 +353,7 @@ /* RGB order is reversed -- bit 7=R, 6=G, 5=B */ int col = (map >> 7) | ((map >> 5) & 0x02) | ((map >> 3) & 0x04); - *BITMAP_ADDR16(bitmap, y, x) = col; + bitmap.pix16(y, x) = col; } x++; @@ -366,7 +366,7 @@ } -static void devzone_draw_grid( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void devzone_draw_grid( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 y; UINT8 *horz_PROM = machine.region("user2")->base(); @@ -407,9 +407,9 @@ { /* blue */ if (flip_screen_get(machine)) - *BITMAP_ADDR16(bitmap, 255-y, 255-x) = 4; + bitmap.pix16(255-y, 255-x) = 4; else - *BITMAP_ADDR16(bitmap, y, x) = 4; + bitmap.pix16(y, x) = 4; } horz_data = (horz_data << 1) | 0x01; @@ -424,11 +424,11 @@ } -static void nomnlnd_draw_background( screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect ) +static void nomnlnd_draw_background( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 y = 0; - UINT8 water = screen->frame_number(); - UINT8 *PROM = screen->machine().region("user2")->base(); + UINT8 water = screen.frame_number(); + UINT8 *PROM = screen.machine().region("user2")->base(); /* all positioning is via logic gates: @@ -491,7 +491,7 @@ if ((!hd_) & hc_ & (!hb_)) { offs_t offs = ((x >> 3) & 0x03) | ((y & 0x1f) << 2) | - (flip_screen_get(screen->machine()) ? 0x80 : 0); + (flip_screen_get(screen.machine()) ? 0x80 : 0); UINT8 plane1 = PROM[offs ] << (x & 0x07); UINT8 plane2 = PROM[offs | 0x0400] << (x & 0x07); @@ -525,10 +525,10 @@ if (color != 0) { - if (flip_screen_get(screen->machine())) - *BITMAP_ADDR16(bitmap, 255-y, 255-x) = color; + if (flip_screen_get(screen.machine())) + bitmap.pix16(255-y, 255-x) = color; else - *BITMAP_ADDR16(bitmap, y, x) = color; + bitmap.pix16(y, x) = color; } x++; @@ -546,67 +546,67 @@ } -SCREEN_UPDATE( cosmicg ) +SCREEN_UPDATE_IND16( cosmicg ) { - bitmap_fill(bitmap, cliprect, 0); - draw_bitmap(screen->machine(), bitmap, cliprect); + bitmap.fill(0, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( panic ) +SCREEN_UPDATE_IND16( panic ) { - bitmap_fill(bitmap, cliprect, 0); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0x07, 1); + bitmap.fill(0, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x07, 1); return 0; } -SCREEN_UPDATE( cosmica ) +SCREEN_UPDATE_IND16( cosmica ) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); cosmica_draw_starfield(screen, bitmap, cliprect); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0f, 0); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0f, 0); return 0; } -SCREEN_UPDATE( magspot ) +SCREEN_UPDATE_IND16( magspot ) { - bitmap_fill(bitmap, cliprect, 0); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0x07, 0); + bitmap.fill(0, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x07, 0); return 0; } -SCREEN_UPDATE( devzone ) +SCREEN_UPDATE_IND16( devzone ) { - cosmic_state *state = screen->machine().driver_data(); + cosmic_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (state->m_background_enable) - devzone_draw_grid(screen->machine(), bitmap, cliprect); + devzone_draw_grid(screen.machine(), bitmap, cliprect); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0x07, 0); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x07, 0); return 0; } -SCREEN_UPDATE( nomnlnd ) +SCREEN_UPDATE_IND16( nomnlnd ) { - cosmic_state *state = screen->machine().driver_data(); + cosmic_state *state = screen.machine().driver_data(); /* according to the video summation logic on pg4, the trees and river have the highest priority */ - bitmap_fill(bitmap, cliprect, 0); - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0x07, 0); + bitmap.fill(0, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x07, 0); if (state->m_background_enable) nomnlnd_draw_background(screen, bitmap, cliprect); diff -Nru mame-0.144/src/mame/video/cps1.c mame-0.145/src/mame/video/cps1.c --- mame-0.144/src/mame/video/cps1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cps1.c 2012-02-06 21:30:32.000000000 +0000 @@ -18,7 +18,7 @@ 89626A-4 89626A-4 DASH -NAME Year B-board # B-board PALs C-board # CPS-B # C-board PALs +Game Year B-board # B-board PALs C-board # CPS-B # C-board PALs ------------------------------------------------------- ---- --------- --------------------- ----------- ----------------------- ------------ Forgotten Worlds (World) 1988 88621B-2 LW621 LWIO None CPS-B-01 DL-0411-10001 N/A Forgotten Worlds (USA, B-Board 88618B-2) 88618B-2 LWCHR LWIO None CPS-B-01 DL-0411-10001 N/A @@ -50,14 +50,15 @@ Area 88 (Japan Resale Ver.) 91634B-2 ARA63B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Final Fight (World) 1989 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None -Final Fight (USA) 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None +Final Fight (USA, set 1) 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None +Final Fight (USA, set 2) 89624B-3 S224B IOB1 88622-C-5 CPS-B-04 DL-0411-10005 None Final Fight (USA 900112) 89624B-3 S224B IOB1 88622-C-5 CPS-B-04@ DL-0411-10001 None Final Fight (USA 900613) 89624B-3 S224B IOB1 88622-C-5 CPS-B-05 DL-0411-10006 None -Final Fight (Japan) 88622B-? S222B ? ? CPS-B-04 DL-0411-10005 -Final Fight (Japan 900112) 88622B-? S222B ? ? CPS-B-01 DL-0411-10001 -Final Fight (Japan 900305) 88622B-? S222B ? ? CPS-B-02 DL-0411-10002 +Final Fight (Japan) ? S222B ? ? CPS-B-04 DL-0411-10005 +Final Fight (Japan 900112) 89625B-1 S222B LWIO 88622-C-5 CPS-B-01 DL-0411-10001 None +Final Fight (Japan 900305) ? S222B ? ? CPS-B-02 DL-0411-10002 -1941: Counter Attack (World) 1990 ? YI24B ? ? CPS-B-05 DL-0411-10006 +1941: Counter Attack (World) 1990 89624B-? YI24B ? ? CPS-B-05 DL-0411-10006 1941: Counter Attack (USA 900227) 89624B-3 YI24B IOB1 88622-C-5 CPS-B-05 DL-0411-10006 None 1941: Counter Attack (Japan) 89625B-1 YI22B LWIO? 88622-C-5 CPS-B-05 DL-0411-10006 None @@ -90,7 +91,7 @@ Street Fighter II: The World Warrior (USA 910228) 90629B-3 STF29 IOB2 90632C-1 CPS-B-18 DL-0411-10013 C632B Street Fighter II: The World Warrior (USA 910306) 90629B-3 STF29 IOB1 90632C-1 CPS-B-12 DL-0411-10007 C632 Street Fighter II: The World Warrior (USA 910318) 90629B-? STF29 IOB1 ? CPS-B-05 DL-0411-10006 C632 -Street Fighter II: The World Warrior (USA 910411) 90629B-? STF29 IOB1 ? CPS-B-15 DL-0411-10010 C632 +Street Fighter II: The World Warrior (USA 910411) 90629B-3 STF29 IOB1 90632C-1 CPS-B-15 DL-0411-10010 C632 Street Fighter II: The World Warrior (USA 910522) 90629B-3 STF29 IOB1 90632C-1 CPS-B-14 DL-0411-10009 C632 Street Fighter II: The World Warrior (USA 911101) 90629B-3 STF29 IOB1 90632C-1 CPS-B-17 DL-0411-10012 C632 Street Fighter II: The World Warrior (Japan 910214) 90629B-2 STF29 IOB1 90632C-1 CPS-B-17 DL-0411-10012 C632 @@ -109,9 +110,9 @@ Captain Commando* (World 911014) 1991 91635B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 Captain Commando* (World 911202) 91635B-2 CC63B CCPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632B IOC1 -Captain Commando* (USA 910928) 91635B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 +Captain Commando* (USA 910928) 91635B-2 CC63B CCPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 Captain Commando* (Japan 910928) 91634B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 -Captain Commando* (Japan 911202) 91634B-2 CC63B CCPRG IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 +Captain Commando* (Japan 911202) 91634B-2 CC63B CCPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632B IOC1 Knights of the Round* (World 911127) 1991 91635B-2 KR63B BPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 Knights of the Round* (USA 911127) 91635B-2 KR63B BPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 @@ -122,7 +123,7 @@ Street Fighter II': Champion Edition (World 920513) 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Street Fighter II': Champion Edition (USA 920313) 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Street Fighter II': Champion Edition (USA 920513) 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 -Street Fighter II': Champion Edition (USA 920803) 91635B-? S9263B BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 C632 IOC1 +Street Fighter II': Champion Edition (USA 920803) 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Street Fighter II': Champion Edition (Japan 920513) 91634B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Adventure Quiz Capcom World 2* (Japan 920611) 1992 89625B-1 Q522B LWIO 92641C-1 CPS-B-21 DL-0921-10014 IOC1 @@ -135,10 +136,11 @@ Quiz & Dragons: Capcom Quiz Game* (USA 920701) 1992 89625B-1 QD22B IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 Quiz & Dragons: Capcom Quiz Game* (Japan 940921) 1994 91634B-2 QD63B BPRG1 IOB1 90631C-5 CPS-B-21 DL-0921-10014 C632 IOC1 -Warriors of Fate* (World 921002) 1992 91635B-? TK263B BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 +Warriors of Fate* (World 921002) 1992 91635B-2 TK263B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 +Warriors of Fate* (World 921031) 91635B-2 TK263B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 Warriors of Fate* (USA 921031) 91635B-2 TK263B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 -Sangokushi II* (Asia 921005) 91634B-? TK263B BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 -Tenchi wo Kurau II: Sekiheki no Tatakai* (Japan 921031) 91634B-? TK263B BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 +Sangokushi II* (Asia 921005) 91634B-2 TK263B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 +Tenchi wo Kurau II: Sekiheki no Tatakai* (Japan 921031) 91634B-2 TK263B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 Street Fighter II': Hyper Fighting (World 921209) 1992 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Street Fighter II': Hyper Fighting (USA 921209) 91635B-2 S9263B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 @@ -156,8 +158,8 @@ Saturday Night Slam Masters* (USA 930713) 91635B-2 MB63B BPRG1 IOB1 92641C-1 CPS-B-21 DL-0921-10014 IOC1 Muscle Bomber: The Body Explosion* (Japan 930713) 91634B-? MB63B BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 IOC1 -Muscle Bomber Duo: Ultimate Team Battle* (World 931206) 1993 91635B-? ? BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 IOC1 -Muscle Bomber Duo: Heat Up Warriors* (Japan 931206) 91634B-? ? BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 IOC1 +Muscle Bomber Duo: Ultimate Team Battle* (World 931206) 1993 91635B-? MB63B? BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 IOC1 +Muscle Bomber Duo: Heat Up Warriors* (Japan 931206) 91634B-? MB63B? BPRG1 IOB1 ? CPS-B-21 DL-0921-10014 IOC1 Ken Sei Mogura (Japan ??????) 1994 ? ? ? ? ? ? @@ -165,11 +167,11 @@ Quiz Tonosama no Yabou 2: Zenkoku-ban (Japan 950123) 1995 90629B-3 ? IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 -Pang! 3 (Euro 950511, not encrypted) 1995 94916-10 CP1B1F,CP1B8K,CP1B9KA 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 +Pang! 3 (Euro 950511) 1995 94916-10 CP1B1F,CP1B8K,CP1B9K 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Pang! 3 (Euro 950601) 94916-10 CP1B1F,CP1B8K,CP1B9KA 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 -Pang! 3: Kaitou Tachi no Karei na Gogo (Japan 950511) 94916-10 CP1B1F,CP1B8K,CP1B9KA 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 +Pang! 3: Kaitou Tachi no Karei na Gogo (Japan 950511) 94916-10 CP1B1F,CP1B8K,CP1B9K 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 -Mega Man: The Power Battle (CPS1, USA 951006) 1995 91634B-2 RCM63B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 +Mega Man: The Power Battle (CPS1, USA 951006) 1995 91635B-2 RCM63B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Mega Man: The Power Battle (CPS1, Asia 951006) 91634B-2 RCM63B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 Rockman: The Power Battle (CPS1, Japan 950922) 91634B-2 RCM63B BPRG1 IOB1 92631C-6 CPS-B-21 DL-0921-10014 C632 IOC1 @@ -918,7 +920,6 @@ }; - // RT24B and RT22B are equivalent, but since we could dump both PALs we are // documenting both. @@ -1227,8 +1228,6 @@ }; - - #define mapper_sfzch { 0x20000, 0, 0, 0 }, mapper_sfzch_table static const struct gfx_range mapper_sfzch_table[] = { @@ -1238,9 +1237,6 @@ }; - - - /* I don't know if CPS2 ROM boards use PALs as well; since all games seem to be well behaved, I'll just assume that there is no strong checking of gfx type. @@ -1269,47 +1265,48 @@ {"daimakai", CPS_B_01, mapper_DM22A }, // equivalent to DM620 {"daimakair", CPS_B_21_DEF, mapper_DAM63B }, // equivalent to DM620, also CPS_B_21_DEF is equivalent to CPS_B_01 {"strider", CPS_B_01, mapper_ST24M1 }, - {"striderua", CPS_B_01, mapper_ST24M1 }, // wrong, this set uses ST24B2, still non dumped + {"striderua", CPS_B_01, mapper_ST24M1 }, // wrong, this set uses ST24B2, still not dumped {"striderj", CPS_B_01, mapper_ST22B }, // equivalent to ST24M1 - {"striderjr", CPS_B_21_DEF, mapper_ST24M1 }, // wrong, this set uses STH63B, still non dumped + {"striderjr", CPS_B_21_DEF, mapper_ST24M1 }, // wrong, this set uses STH63B, still not dumped {"dynwar", CPS_B_02, mapper_TK22B }, // wrong, this set uses TK24B1, dumped but equations still not added {"dynwara", CPS_B_02, mapper_TK22B }, {"dynwarj", CPS_B_02, mapper_TK22B }, - {"dynwarjr", CPS_B_21_DEF, mapper_TK22B }, // wrong, this set uses TK163B, still non dumped + {"dynwarjr", CPS_B_21_DEF, mapper_TK22B }, // wrong, this set uses TK163B, still not dumped {"willow", CPS_B_03, mapper_WL24B }, {"willowo", CPS_B_03, mapper_WL24B }, - {"willowj", CPS_B_03, mapper_WL24B }, // wrong, this set uses WL22B, still non dumped + {"willowj", CPS_B_03, mapper_WL24B }, // wrong, this set uses WL22B, still not dumped {"ffight", CPS_B_04, mapper_S224B }, {"ffightu", CPS_B_04, mapper_S224B }, {"ffightu1", CPS_B_04, mapper_S224B }, {"ffightua", CPS_B_01, mapper_S224B }, {"ffightub", CPS_B_05, mapper_S224B }, - {"ffightj", CPS_B_04, mapper_S224B }, // wrong, this set uses S222B, still non dumped - {"ffightj1", CPS_B_01, mapper_S224B }, // wrong, this set uses S222B, still non dumped - {"ffightj2", CPS_B_02, mapper_S224B }, // wrong, this set uses S222B, still non dumped + {"ffightj", CPS_B_04, mapper_S224B }, // wrong, this set uses S222B, still not dumped + {"ffightj1", CPS_B_01, mapper_S224B }, // wrong, this set uses S222B, still not dumped + {"ffightj2", CPS_B_02, mapper_S224B }, // wrong, this set uses S222B, still not dumped {"ffightjh", CPS_B_01, mapper_S224B }, // wrong, ffightjh hack doesn't even use the S222B PAL, since replaced with a GAL. {"1941", CPS_B_05, mapper_YI24B }, {"1941u", CPS_B_05, mapper_YI24B }, - {"1941j", CPS_B_05, mapper_YI24B }, // wrong, this set uses YI22B, still non dumped + {"1941j", CPS_B_05, mapper_YI24B }, // wrong, this set uses YI22B, still not dumped {"unsquad", CPS_B_11, mapper_AR24B }, {"area88", CPS_B_11, mapper_AR22B }, // equivalent to AR24B - {"area88r", CPS_B_21_DEF, mapper_AR22B }, // wrong, this set uses ARA63B, still non dumped + {"area88r", CPS_B_21_DEF, mapper_AR22B }, // wrong, this set uses ARA63B, still not dumped {"mercs", CPS_B_12, mapper_O224B, 0x36, 0, 0x34 }, {"mercsu", CPS_B_12, mapper_O224B, 0x36, 0, 0x34 }, {"mercsur1", CPS_B_12, mapper_O224B, 0x36, 0, 0x34 }, - {"mercsj", CPS_B_12, mapper_O224B, 0x36, 0, 0x34 }, // wrong, this set uses O222B, still non dumped + {"mercsj", CPS_B_12, mapper_O224B, 0x36, 0, 0x34 }, // wrong, this set uses O222B, still not dumped {"msword", CPS_B_13, mapper_MS24B }, {"mswordr1", CPS_B_13, mapper_MS24B }, {"mswordu", CPS_B_13, mapper_MS24B }, - {"mswordj", CPS_B_13, mapper_MS24B }, // wrong, this set uses MS22B, still non dumped + {"mswordj", CPS_B_13, mapper_MS24B }, // wrong, this set uses MS22B, still not dumped {"mtwins", CPS_B_14, mapper_CK24B }, - {"chikij", CPS_B_14, mapper_CK24B }, // wrong, this set uses CK22B, still non dumped + {"chikij", CPS_B_14, mapper_CK24B }, // wrong, this set uses CK22B, still not dumped {"nemo", CPS_B_15, mapper_NM24B }, - {"nemoj", CPS_B_15, mapper_NM24B }, // wrong, this set uses NM22B, still non dumped + {"nemoj", CPS_B_15, mapper_NM24B }, // wrong, this set uses NM22B, still not dumped {"cawing", CPS_B_16, mapper_CA24B }, {"cawingr1", CPS_B_16, mapper_CA24B }, {"cawingu", CPS_B_16, mapper_CA24B }, {"cawingj", CPS_B_16, mapper_CA22B }, // equivalent to CA24B + {"cawingbl", CPS_B_16, mapper_CA22B }, // equivalent to CA24B {"sf2", CPS_B_11, mapper_STF29, 0x36 }, {"sf2eb", CPS_B_17, mapper_STF29, 0x36 }, {"sf2ee", CPS_B_18, mapper_STF29, 0x3c }, @@ -1338,7 +1335,7 @@ {"kodr1", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, {"kodu", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, {"kodj", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, - {"kodja", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, // wrong, this set uses KD22B, still non dumped + {"kodja", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, // wrong, this set uses KD22B, still not dumped {"kodb", CPS_B_21_BT2, mapper_KD29B, 0x36, 0, 0x34 }, /* bootleg, doesn't use multiply protection */ {"captcomm", CPS_B_21_BT3, mapper_CC63B, 0x36, 0x38, 0x34 }, {"captcommr1", CPS_B_21_BT3, mapper_CC63B, 0x36, 0x38, 0x34 }, @@ -1349,7 +1346,7 @@ {"knights", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, {"knightsu", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, {"knightsj", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, - {"knightsja", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, // wrong, this set uses KR22B, still non dumped + {"knightsja", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, // wrong, this set uses KR22B, still not dumped {"knightsb", CPS_B_21_BT4, mapper_KR63B, 0x36, 0, 0x34 }, // wrong, knightsb bootleg doesn't use the KR63B PAL {"sf2ce", CPS_B_21_DEF, mapper_S9263B, 0x36 }, {"sf2ceea", CPS_B_21_DEF, mapper_S9263B, 0x36 }, @@ -1375,12 +1372,13 @@ {"sf2yyc", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 }, {"sf2koryu", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 }, {"sf2mdt", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 1 }, - {"varth", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ // wrong, this set uses VA24B, still non dumped - {"varthr1", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ // wrong, this set uses VA24B, still non dumped + {"varth", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ // wrong, this set uses VA24B, dumped but equations still not added + {"varthr1", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ // wrong, this set uses VA24B, dumped but equations still not added {"varthu", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */ {"varthj", CPS_B_21_BT5, mapper_VA22B }, /* CPSB test has been patched out (72=0001) register is also written to, possibly leftover from development */ {"cworld2j", CPS_B_21_BT6, mapper_Q522B, 0x36, 0, 0x34 }, /* (ports 36, 34 probably leftover input code from another game) */ - {"wof", CPS_B_21_DEF, mapper_TK263B }, + {"wof", CPS_B_21_QS1, mapper_TK263B }, + {"wofr1", CPS_B_21_DEF, mapper_TK263B }, {"wofa", CPS_B_21_DEF, mapper_TK263B }, {"wofu", CPS_B_21_QS1, mapper_TK263B }, {"wofj", CPS_B_21_QS1, mapper_TK263B }, @@ -1414,15 +1412,19 @@ {"rockmanj", CPS_B_21_DEF, mapper_RCM63B }, {"pnickj", CPS_B_21_DEF, mapper_PKB10B }, {"pang3", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9KA still not dumped - {"pang3n", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9KA still not dumped - {"pang3j", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9KA still not dumped + {"pang3r1", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9K + {"pang3j", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9K + {"pang3b", CPS_B_21_DEF, mapper_pang3 }, /* EEPROM port is among the CPS registers (handled by DRIVER_INIT) */ // should use one of these three CP1B1F,CP1B8K,CP1B9K + + /* CPS Changer */ + + {"sfach", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped + {"sfzbch", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped + {"sfzch", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped + {"wofch", CPS_B_21_DEF, mapper_TK263B }, - {"sfach", CPS_B_21_DEF, mapper_sfzch }, - {"sfzbch", CPS_B_21_DEF, mapper_sfzch }, - {"sfzch", CPS_B_21_DEF, mapper_sfzch }, - {"wofch", CPS_B_21_DEF, mapper_sfzch }, + /* CPS2 games */ - /* CPS2 games */ {"cps2", CPS_B_21_DEF, mapper_cps2 }, {0} /* End of table */ @@ -1812,17 +1814,17 @@ if (state->m_scroll1 != cps1_base(machine, CPS1_SCROLL1_BASE, state->m_scroll_size)) { state->m_scroll1 = cps1_base(machine, CPS1_SCROLL1_BASE, state->m_scroll_size); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[0]); + state->m_bg_tilemap[0]->mark_all_dirty(); } if (state->m_scroll2 != cps1_base(machine, CPS1_SCROLL2_BASE, state->m_scroll_size)) { state->m_scroll2 = cps1_base(machine, CPS1_SCROLL2_BASE, state->m_scroll_size); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[1]); + state->m_bg_tilemap[1]->mark_all_dirty(); } if (state->m_scroll3 != cps1_base(machine, CPS1_SCROLL3_BASE, state->m_scroll_size)) { state->m_scroll3 = cps1_base(machine, CPS1_SCROLL3_BASE, state->m_scroll_size); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[2]); + state->m_bg_tilemap[2]->mark_all_dirty(); } /* Some of the sf2 hacks use only sprite port 0x9100 and the scroll layers are offset */ @@ -1859,9 +1861,9 @@ /* Get layer enable bits */ layercontrol = state->m_cps_b_regs[state->m_game_config->layer_control / 2]; videocontrol = state->m_cps_a_regs[CPS1_VIDEOCONTROL]; - tilemap_set_enable(state->m_bg_tilemap[0],layercontrol & state->m_game_config->layer_enable_mask[0]); - tilemap_set_enable(state->m_bg_tilemap[1],(layercontrol & state->m_game_config->layer_enable_mask[1]) && (videocontrol & 4)); - tilemap_set_enable(state->m_bg_tilemap[2],(layercontrol & state->m_game_config->layer_enable_mask[2]) && (videocontrol & 8)); + state->m_bg_tilemap[0]->enable(layercontrol & state->m_game_config->layer_enable_mask[0]); + state->m_bg_tilemap[1]->enable((layercontrol & state->m_game_config->layer_enable_mask[1]) && (videocontrol & 4)); + state->m_bg_tilemap[2]->enable((layercontrol & state->m_game_config->layer_enable_mask[2]) && (videocontrol & 8)); state->m_stars_enabled[0] = layercontrol & state->m_game_config->layer_enable_mask[3]; state->m_stars_enabled[1] = layercontrol & state->m_game_config->layer_enable_mask[4]; @@ -1903,13 +1905,13 @@ COMBINE_DATA(&state->m_gfxram[offset]); if (page == (state->m_cps_a_regs[CPS1_SCROLL1_BASE] & 0x3c0)) - tilemap_mark_tile_dirty(state->m_bg_tilemap[0], offset / 2 & 0x0fff); + state->m_bg_tilemap[0]->mark_tile_dirty(offset / 2 & 0x0fff); if (page == (state->m_cps_a_regs[CPS1_SCROLL2_BASE] & 0x3c0)) - tilemap_mark_tile_dirty(state->m_bg_tilemap[1], offset / 2 & 0x0fff); + state->m_bg_tilemap[1]->mark_tile_dirty(offset / 2 & 0x0fff); if (page == (state->m_cps_a_regs[CPS1_SCROLL3_BASE] & 0x3c0)) - tilemap_mark_tile_dirty(state->m_bg_tilemap[2], offset / 2 & 0x0fff); + state->m_bg_tilemap[2]->mark_tile_dirty(offset / 2 & 0x0fff); } @@ -2002,12 +2004,12 @@ code, (attr & 0x1f) + 0x20, TILE_FLIPYX((attr & 0x60) >> 5)); - tileinfo->group = (attr & 0x0180) >> 7; + tileinfo.group = (attr & 0x0180) >> 7; // for out of range tiles, switch to fully transparent data // (but still call SET_TILE_INFO, otherwise problems might occur on boot e.g. unsquad) if (code == -1) - tileinfo->pen_data = state->m_empty_tile8x8; + tileinfo.pen_data = state->m_empty_tile; } static TILE_GET_INFO( get_tile1_info ) @@ -2023,11 +2025,11 @@ code, (attr & 0x1f) + 0x40, TILE_FLIPYX((attr & 0x60) >> 5)); - tileinfo->group = (attr & 0x0180) >> 7; + tileinfo.group = (attr & 0x0180) >> 7; // for out of range tiles, switch to fully transparent data if (code == -1) - tileinfo->pen_data = state->m_empty_tile; + tileinfo.pen_data = state->m_empty_tile; } static TILE_GET_INFO( get_tile2_info ) @@ -2043,12 +2045,12 @@ code, (attr & 0x1f) + 0x60, TILE_FLIPYX((attr & 0x60) >> 5)); - tileinfo->group = (attr & 0x0180) >> 7; + tileinfo.group = (attr & 0x0180) >> 7; // for out of range tiles, switch to fully transparent data // (but still call SET_TILE_INFO, otherwise problems might occur on boot e.g. unsquad) if (code == -1) - tileinfo->pen_data = state->m_empty_tile; + tileinfo.pen_data = state->m_empty_tile; } @@ -2068,9 +2070,9 @@ else mask = 0xffff; /* completely transparent if priority masks not defined (qad) */ - tilemap_set_transmask(state->m_bg_tilemap[0], i, mask, 0x8000); - tilemap_set_transmask(state->m_bg_tilemap[1], i, mask, 0x8000); - tilemap_set_transmask(state->m_bg_tilemap[2], i, mask, 0x8000); + state->m_bg_tilemap[0]->set_transmask(i, mask, 0x8000); + state->m_bg_tilemap[1]->set_transmask(i, mask, 0x8000); + state->m_bg_tilemap[2]->set_transmask(i, mask, 0x8000); } } @@ -2096,8 +2098,7 @@ state->m_bg_tilemap[2] = tilemap_create(machine, get_tile2_info, tilemap2_scan, 32, 32, 64, 64); /* create empty tiles */ - memset(state->m_empty_tile8x8, 0x0f, sizeof(state->m_empty_tile8x8)); - memset(state->m_empty_tile, 0xff, sizeof(state->m_empty_tile)); // 16x16 and 32x32 use packed graphics, 8x8 does not + memset(state->m_empty_tile, 0x0f, sizeof(state->m_empty_tile)); /* front masks will change at runtime to handle sprite occluding */ cps1_update_transmasks(machine); @@ -2297,7 +2298,7 @@ } -static void cps1_render_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void cps1_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { cps_state *state = machine.driver_data(); @@ -2540,7 +2541,7 @@ state->m_cps2_last_sprite_offset = state->m_cps2_obj_size / 2 - 4; } -static void cps2_render_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int *primasks ) +static void cps2_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks ) { cps_state *state = machine.driver_data(); @@ -2689,11 +2690,11 @@ -static void cps1_render_stars( screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect ) +static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { - cps_state *state = screen->machine().driver_data(); + cps_state *state = screen.machine().driver_data(); int offs; - UINT8 *stars_rom = screen->machine().region("stars")->base(); + UINT8 *stars_rom = screen.machine().region("stars")->base(); if (!stars_rom && (state->m_stars_enabled[0] || state->m_stars_enabled[1])) { @@ -2714,17 +2715,16 @@ int sy = (offs % 256); sx = (sx - state->m_stars2x + (col & 0x1f)) & 0x1ff; sy = (sy - state->m_stars2y) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 511 - sx; sy = 255 - sy; } - col = ((col & 0xe0) >> 1) + (screen->frame_number() / 16 & 0x0f); + col = ((col & 0xe0) >> 1) + (screen.frame_number() / 16 & 0x0f); - if (sx >= cliprect->min_x && sx <= cliprect->max_x && - sy >= cliprect->min_y && sy <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, sy, sx) = 0xa00 + col; + if (cliprect.contains(sx, sy)) + bitmap.pix16(sy, sx) = 0xa00 + col; } } } @@ -2740,24 +2740,23 @@ int sy = (offs % 256); sx = (sx - state->m_stars1x + (col & 0x1f)) & 0x1ff; sy = (sy - state->m_stars1y) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 511 - sx; sy = 255 - sy; } - col = ((col & 0xe0) >> 1) + (screen->frame_number() / 16 & 0x0f); + col = ((col & 0xe0) >> 1) + (screen.frame_number() / 16 & 0x0f); - if (sx >= cliprect->min_x && sx <= cliprect->max_x && - sy >= cliprect->min_y && sy <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, sy, sx) = 0x800 + col; + if (cliprect.contains(sx, sy)) + bitmap.pix16(sy, sx) = 0x800 + col; } } } } -static void cps1_render_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int primask ) +static void cps1_render_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask ) { cps_state *state = machine.driver_data(); switch (layer) @@ -2768,14 +2767,15 @@ case 1: case 2: case 3: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer - 1], TILEMAP_DRAW_LAYER1, primask); + state->m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask); break; } } -static void cps1_render_high_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) +static void cps1_render_high_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) { cps_state *state = machine.driver_data(); + bitmap_ind16 dummy_bitmap; switch (layer) { case 0: @@ -2784,7 +2784,7 @@ case 1: case 2: case 3: - tilemap_draw(NULL, cliprect, state->m_bg_tilemap[layer - 1], TILEMAP_DRAW_LAYER0, 1); + state->m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); break; } } @@ -2796,31 +2796,31 @@ ***************************************************************************/ -SCREEN_UPDATE( cps1 ) +SCREEN_UPDATE_IND16( cps1 ) { - cps_state *state = screen->machine().driver_data(); + cps_state *state = screen.machine().driver_data(); int layercontrol, l0, l1, l2, l3; int videocontrol = state->m_cps_a_regs[CPS1_VIDEOCONTROL]; - flip_screen_set(screen->machine(), videocontrol & 0x8000); + flip_screen_set(screen.machine(), videocontrol & 0x8000); layercontrol = state->m_cps_b_regs[state->m_game_config->layer_control / 2]; /* Get video memory base registers */ - cps1_get_video_base(screen->machine()); + cps1_get_video_base(screen.machine()); /* Find the offset of the last sprite in the sprite table */ - cps1_find_last_sprite(screen->machine()); + cps1_find_last_sprite(screen.machine()); if (state->m_cps_version == 2) { - cps2_find_last_sprite(screen->machine()); + cps2_find_last_sprite(screen.machine()); } - cps1_update_transmasks(screen->machine()); + cps1_update_transmasks(screen.machine()); - tilemap_set_scrollx(state->m_bg_tilemap[0], 0, state->m_scroll1x); - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_scroll1y); + state->m_bg_tilemap[0]->set_scrollx(0, state->m_scroll1x); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_scroll1y); if (videocontrol & 0x01) /* linescroll enable */ { @@ -2828,21 +2828,21 @@ int i; int otheroffs; - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1024); + state->m_bg_tilemap[1]->set_scroll_rows(1024); otheroffs = state->m_cps_a_regs[CPS1_ROWSCROLL_OFFS]; for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap[1], (i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); + state->m_bg_tilemap[1]->set_scrollx((i - scrly) & 0x3ff, state->m_scroll2x + state->m_other[(i + otheroffs) & 0x3ff]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap[1], 1); - tilemap_set_scrollx(state->m_bg_tilemap[1], 0, state->m_scroll2x); + state->m_bg_tilemap[1]->set_scroll_rows(1); + state->m_bg_tilemap[1]->set_scrollx(0, state->m_scroll2x); } - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_scroll2y); - tilemap_set_scrollx(state->m_bg_tilemap[2], 0, state->m_scroll3x); - tilemap_set_scrolly(state->m_bg_tilemap[2], 0, state->m_scroll3y); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_scroll2y); + state->m_bg_tilemap[2]->set_scrollx(0, state->m_scroll3x); + state->m_bg_tilemap[2]->set_scrolly(0, state->m_scroll3y); /* Blank screen */ @@ -2850,7 +2850,7 @@ { // CPS1 games use pen 0xbff as background color; this is used in 3wonders, // mtwins (explosion during attract), mercs (intermission). - bitmap_fill(bitmap, cliprect, 0xbff); + bitmap.fill(0xbff, cliprect); } else { @@ -2859,7 +2859,7 @@ // Maybe Capcom changed the background handling due to the problems that // it caused on several monitors (because the background extended into the // blanking area instead of going black, causing the monitor to clip). - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); } cps1_render_stars(screen, bitmap, cliprect); @@ -2869,26 +2869,26 @@ l1 = (layercontrol >> 0x08) & 03; l2 = (layercontrol >> 0x0a) & 03; l3 = (layercontrol >> 0x0c) & 03; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_cps_version == 1) { - cps1_render_layer(screen->machine(), bitmap, cliprect, l0, 0); + cps1_render_layer(screen.machine(), bitmap, cliprect, l0, 0); if (l1 == 0) - cps1_render_high_layer(screen->machine(), bitmap, cliprect, l0); /* prepare mask for sprites */ + cps1_render_high_layer(screen.machine(), bitmap, cliprect, l0); /* prepare mask for sprites */ - cps1_render_layer(screen->machine(), bitmap, cliprect, l1, 0); + cps1_render_layer(screen.machine(), bitmap, cliprect, l1, 0); if (l2 == 0) - cps1_render_high_layer(screen->machine(), bitmap, cliprect, l1); /* prepare mask for sprites */ + cps1_render_high_layer(screen.machine(), bitmap, cliprect, l1); /* prepare mask for sprites */ - cps1_render_layer(screen->machine(), bitmap, cliprect, l2, 0); + cps1_render_layer(screen.machine(), bitmap, cliprect, l2, 0); if (l3 == 0) - cps1_render_high_layer(screen->machine(), bitmap, cliprect, l2); /* prepare mask for sprites */ + cps1_render_high_layer(screen.machine(), bitmap, cliprect, l2); /* prepare mask for sprites */ - cps1_render_layer(screen->machine(), bitmap, cliprect, l3, 0); + cps1_render_layer(screen.machine(), bitmap, cliprect, l3, 0); } else { @@ -2900,15 +2900,15 @@ l3pri = (state->m_pri_ctrl >> 4 * l3) & 0x0f; #if 0 -if ( (cps2_port(screen->machine(), CPS2_OBJ_BASE) != 0x7080 && cps2_port(screen->machine(), CPS2_OBJ_BASE) != 0x7000) || - cps2_port(screen->machine(), CPS2_OBJ_UK1) != 0x807d || - (cps2_port(screen->machine(), CPS2_OBJ_UK2) != 0x0000 && cps2_port(screen->machine(), CPS2_OBJ_UK2) != 0x1101 && cps2_port(screen->machine(), CPS2_OBJ_UK2) != 0x0001)) +if ( (cps2_port(screen.machine(), CPS2_OBJ_BASE) != 0x7080 && cps2_port(screen.machine(), CPS2_OBJ_BASE) != 0x7000) || + cps2_port(screen.machine(), CPS2_OBJ_UK1) != 0x807d || + (cps2_port(screen.machine(), CPS2_OBJ_UK2) != 0x0000 && cps2_port(screen.machine(), CPS2_OBJ_UK2) != 0x1101 && cps2_port(screen.machine(), CPS2_OBJ_UK2) != 0x0001)) popmessage("base %04x uk1 %04x uk2 %04x", - cps2_port(screen->machine(), CPS2_OBJ_BASE), - cps2_port(screen->machine(), CPS2_OBJ_UK1), - cps2_port(screen->machine(), CPS2_OBJ_UK2)); + cps2_port(screen.machine(), CPS2_OBJ_BASE), + cps2_port(screen.machine(), CPS2_OBJ_UK1), + cps2_port(screen.machine(), CPS2_OBJ_UK2)); -if (0 && screen->machine().input().code_pressed(KEYCODE_Z)) +if (0 && screen.machine().input().code_pressed(KEYCODE_Z)) popmessage("order: %d (%d) %d (%d) %d (%d) %d (%d)",l0,l0pri,l1,l1pri,l2,l2pri,l3,l3pri); #endif @@ -2939,26 +2939,30 @@ } } - cps1_render_layer(screen->machine(), bitmap, cliprect, l0, 1); - cps1_render_layer(screen->machine(), bitmap, cliprect, l1, 2); - cps1_render_layer(screen->machine(), bitmap, cliprect, l2, 4); - cps2_render_sprites(screen->machine(), bitmap, cliprect, primasks); + cps1_render_layer(screen.machine(), bitmap, cliprect, l0, 1); + cps1_render_layer(screen.machine(), bitmap, cliprect, l1, 2); + cps1_render_layer(screen.machine(), bitmap, cliprect, l2, 4); + cps2_render_sprites(screen.machine(), bitmap, cliprect, primasks); } return 0; } -SCREEN_EOF( cps1 ) +SCREEN_VBLANK( cps1 ) { - cps_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + cps_state *state = screen.machine().driver_data(); - /* Get video memory base registers */ - cps1_get_video_base(machine); + /* Get video memory base registers */ + cps1_get_video_base(screen.machine()); - if (state->m_cps_version == 1) - { - /* CPS1 sprites have to be delayed one frame */ - memcpy(state->m_buffered_obj, state->m_obj, state->m_obj_size); + if (state->m_cps_version == 1) + { + /* CPS1 sprites have to be delayed one frame */ + memcpy(state->m_buffered_obj, state->m_obj, state->m_obj_size); + } } } diff -Nru mame-0.144/src/mame/video/crbaloon.c mame-0.145/src/mame/video/crbaloon.c --- mame-0.144/src/mame/video/crbaloon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/crbaloon.c 2012-02-06 21:30:31.000000000 +0000 @@ -51,14 +51,14 @@ { crbaloon_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( crbaloon_colorram_w ) { crbaloon_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -95,7 +95,7 @@ -static void draw_sprite_and_check_collision(running_machine &machine, bitmap_t *bitmap) +static void draw_sprite_and_check_collision(running_machine &machine, bitmap_ind16 &bitmap) { crbaloon_state *state = machine.driver_data(); int y; @@ -131,12 +131,12 @@ /* draw the current pixel, but check collision first */ if (bit) { - if (*BITMAP_ADDR16(bitmap, sy, sx) & 0x01) + if (bitmap.pix16(sy, sx) & 0x01) /* compute the collision address -- the +1 is via observation of the game code, probably wrong for cocktail mode */ state->m_collision_address = ((((sy ^ 0xff) >> 3) << 5) | ((sx ^ 0xff) >> 3)) + 1; - *BITMAP_ADDR16(bitmap, sy, sx) = (color << 1) | 1; + bitmap.pix16(sy, sx) = (color << 1) | 1; } sx = sx + 1; @@ -148,12 +148,12 @@ } -SCREEN_UPDATE( crbaloon ) +SCREEN_UPDATE_IND16( crbaloon ) { - crbaloon_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + crbaloon_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprite_and_check_collision(screen->machine(), bitmap); + draw_sprite_and_check_collision(screen.machine(), bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/crgolf.c mame-0.145/src/mame/video/crgolf.c --- mame-0.144/src/mame/video/crgolf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/crgolf.c 2012-02-06 21:30:32.000000000 +0000 @@ -111,15 +111,15 @@ * *************************************/ -static SCREEN_UPDATE( crgolf ) +static SCREEN_UPDATE_RGB32( crgolf ) { - crgolf_state *state = screen->machine().driver_data(); + crgolf_state *state = screen.machine().driver_data(); int flip = *state->m_screen_flip & 1; offs_t offs; pen_t pens[NUM_PENS]; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); /* for each byte in the video RAM */ for (offs = 0; offs < VIDEORAM_SIZE / 3; offs++) @@ -165,7 +165,7 @@ if (*state->m_color_select) color = color | 0x10; - *BITMAP_ADDR32(bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; /* next pixel */ data_a0 = data_a0 << 1; @@ -196,10 +196,9 @@ MCFG_VIDEO_START(crgolf) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_SIZE(256, 256) MCFG_SCREEN_VISIBLE_AREA(0, 255, 8, 247) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) - MCFG_SCREEN_UPDATE(crgolf) + MCFG_SCREEN_UPDATE_STATIC(crgolf) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/crimfght.c mame-0.145/src/mame/video/crimfght.c --- mame-0.144/src/mame/video/crimfght.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/crimfght.c 2012-02-06 21:30:31.000000000 +0000 @@ -77,9 +77,9 @@ ***************************************************************************/ -SCREEN_UPDATE( crimfght ) +SCREEN_UPDATE_IND16( crimfght ) { - crimfght_state *state = screen->machine().driver_data(); + crimfght_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); diff -Nru mame-0.144/src/mame/video/crospang.c mame-0.145/src/mame/video/crospang.c --- mame-0.144/src/mame/video/crospang.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/crospang.c 2012-02-06 21:30:32.000000000 +0000 @@ -11,6 +11,7 @@ #include "emu.h" #include "includes/crospang.h" +#include "video/decospr.h" WRITE16_HANDLER( bestri_tilebank_w) { @@ -19,8 +20,8 @@ state->m_bestri_tilebank = (data>>10) & 0xf; //printf("bestri %04x\n", data); - tilemap_mark_all_tiles_dirty(state->m_fg_layer); - tilemap_mark_all_tiles_dirty(state->m_bg_layer); + state->m_fg_layer->mark_all_dirty(); + state->m_bg_layer->mark_all_dirty(); } @@ -30,7 +31,7 @@ /* Very Strange */ int scroll = (data & 0x3ff) ^ 0x0155; - tilemap_set_scrolly(state->m_bg_layer, 0, -scroll + 7); + state->m_bg_layer->set_scrolly(0, -scroll + 7); } WRITE16_HANDLER ( bestri_fg_scrolly_w ) @@ -39,7 +40,7 @@ /* Very Strange */ int scroll = (data & 0x3ff) ^ 0x00ab; - tilemap_set_scrolly(state->m_fg_layer, 0, -scroll + 7); + state->m_fg_layer->set_scrolly(0, -scroll + 7); } WRITE16_HANDLER ( bestri_fg_scrollx_w ) @@ -47,7 +48,7 @@ crospang_state *state = space->machine().driver_data(); // printf("fg_layer x %04x\n",data); - tilemap_set_scrollx(state->m_fg_layer, 0, data + 32); + state->m_fg_layer->set_scrollx(0, data + 32); } WRITE16_HANDLER ( bestri_bg_scrollx_w ) @@ -55,32 +56,32 @@ crospang_state *state = space->machine().driver_data(); // printf("bg_layer x %04x\n",data); - tilemap_set_scrollx(state->m_bg_layer, 0, data - 60); + state->m_bg_layer->set_scrollx(0, data - 60); } WRITE16_HANDLER ( crospang_fg_scrolly_w ) { crospang_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_fg_layer, 0, data + 8); + state->m_fg_layer->set_scrolly(0, data + 8); } WRITE16_HANDLER ( crospang_bg_scrolly_w ) { crospang_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_layer, 0, data + 8); + state->m_bg_layer->set_scrolly(0, data + 8); } WRITE16_HANDLER ( crospang_fg_scrollx_w ) { crospang_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_fg_layer, 0, data); + state->m_fg_layer->set_scrollx(0, data); } WRITE16_HANDLER ( crospang_bg_scrollx_w ) { crospang_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_layer, 0, data + 4); + state->m_bg_layer->set_scrollx(0, data + 4); } @@ -88,14 +89,14 @@ { crospang_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_layer, offset); + state->m_fg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER ( crospang_bg_videoram_w ) { crospang_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_layer, offset); + state->m_bg_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -118,93 +119,6 @@ SET_TILE_INFO(1, tile + state->m_bestri_tilebank * 0x1000, color + 0x10, 0); } -/* - - offset - - 0 -------yyyyyyyyy y offset - -----hh--------- sprite height - ---a------------ alpha blending enable - f--------------- flip x - -??-?----------- unused - - 1 --ssssssssssssss sprite code - ??-------------- unused - - 2 -------xxxxxxxxx x offset - ---cccc--------- colors - ???------------- unused - - 3 ---------------- unused - -*/ - -/* jumpkids / tumbleb.c! */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - crospang_state *state = machine.driver_data(); - int offs; - int flipscreen = 0; - - for (offs = 0; offs < state->m_spriteram_size / 2; offs += 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - - sprite = state->m_spriteram[offs + 1] & 0x7fff; - if (!sprite) - continue; - - y = state->m_spriteram[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = state->m_spriteram[offs + 2]; - colour = (x >>9) & 0xf; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - y = 240 - y; - x = 304 - x; - - // sprite &= ~multi; /* Todo: I bet TumblePop bootleg doesn't do this either */ - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (flipscreen) - { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else - mult = -16; - - while (multi >= 0) - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[0], - sprite - multi * inc, - colour, - fx, fy, - x - state->m_xsproff, y - state->m_ysproff + mult * multi,0); - - multi--; - } - } -} VIDEO_START( crospang ) { @@ -212,14 +126,14 @@ state->m_bg_layer = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_layer = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_layer, 0); + state->m_fg_layer->set_transparent_pen(0); } -SCREEN_UPDATE( crospang ) +SCREEN_UPDATE_IND16( crospang ) { - crospang_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_layer, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_layer, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + crospang_state *state = screen.machine().driver_data(); + state->m_bg_layer->draw(bitmap, cliprect, 0, 0); + state->m_fg_layer->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); return 0; } diff -Nru mame-0.144/src/mame/video/crshrace.c mame-0.145/src/mame/video/crshrace.c --- mame-0.144/src/mame/video/crshrace.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/crshrace.c 2012-02-06 21:30:32.000000000 +0000 @@ -39,8 +39,8 @@ state->m_tilemap1 = tilemap_create(machine, get_tile_info1, tilemap_scan_rows, 16, 16, 64, 64); state->m_tilemap2 = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_tilemap1, 0x0f); - tilemap_set_transparent_pen(state->m_tilemap2, 0xff); + state->m_tilemap1->set_transparent_pen(0x0f); + state->m_tilemap2->set_transparent_pen(0xff); } @@ -55,7 +55,7 @@ crshrace_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap1, offset); + state->m_tilemap1->mark_tile_dirty(offset); } WRITE16_HANDLER( crshrace_videoram2_w ) @@ -63,7 +63,7 @@ crshrace_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_tilemap2, offset); + state->m_tilemap2->mark_tile_dirty(offset); } WRITE16_HANDLER( crshrace_roz_bank_w ) @@ -75,7 +75,7 @@ if (state->m_roz_bank != (data & 0xff)) { state->m_roz_bank = data & 0xff; - tilemap_mark_all_tiles_dirty(state->m_tilemap1); + state->m_tilemap1->mark_all_dirty(); } } } @@ -99,7 +99,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { crshrace_state *state = machine.driver_data(); UINT16 *buffered_spriteram = machine.generic.buffered_spriteram.u16; @@ -171,44 +171,44 @@ } -static void draw_bg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { crshrace_state *state = machine.driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap2, 0, 0); + state->m_tilemap2->draw(bitmap, cliprect, 0, 0); } -static void draw_fg(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_fg(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { crshrace_state *state = machine.driver_data(); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_tilemap1, 0, 0, 1); } -SCREEN_UPDATE( crshrace ) +SCREEN_UPDATE_IND16( crshrace ) { - crshrace_state *state = screen->machine().driver_data(); + crshrace_state *state = screen.machine().driver_data(); if (state->m_gfxctrl & 0x04) /* display disable? */ { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - bitmap_fill(bitmap, cliprect, 0x1ff); + bitmap.fill(0x1ff, cliprect); switch (state->m_gfxctrl & 0xfb) { case 0x00: /* high score screen */ - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bg(screen->machine(), bitmap, cliprect); - draw_fg(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_bg(screen.machine(), bitmap, cliprect); + draw_fg(screen.machine(), bitmap, cliprect); break; case 0x01: case 0x02: - draw_bg(screen->machine(), bitmap, cliprect); - draw_fg(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_bg(screen.machine(), bitmap, cliprect); + draw_fg(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); break; default: popmessage("gfxctrl = %02x", state->m_gfxctrl); @@ -217,10 +217,14 @@ return 0; } -SCREEN_EOF( crshrace ) +SCREEN_VBLANK( crshrace ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); - buffer_spriteram16_2_w(space, 0, 0, 0xffff); + buffer_spriteram16_w(space, 0, 0, 0xffff); + buffer_spriteram16_2_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/cvs.c mame-0.145/src/mame/video/cvs.c --- mame-0.144/src/mame/video/cvs.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cvs.c 2012-02-06 21:30:31.000000000 +0000 @@ -169,14 +169,14 @@ } /* create helper bitmaps */ - state->m_background_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_collision_background = machine.primary_screen->alloc_compatible_bitmap(); - state->m_scrolled_collision_background = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_background_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_collision_background); + machine.primary_screen->register_screen_bitmap(state->m_scrolled_collision_background); /* register save */ - state->save_item(NAME(*state->m_background_bitmap)); - state->save_item(NAME(*state->m_collision_background)); - state->save_item(NAME(*state->m_scrolled_collision_background)); + state->save_item(NAME(state->m_background_bitmap)); + state->save_item(NAME(state->m_collision_background)); + state->save_item(NAME(state->m_scrolled_collision_background)); } @@ -187,15 +187,14 @@ } -SCREEN_UPDATE( cvs ) +SCREEN_UPDATE_IND16( cvs ) { - cvs_state *state = screen->machine().driver_data(); + cvs_state *state = screen.machine().driver_data(); static const int ram_based_char_start_indices[] = { 0xe0, 0xc0, 0x100, 0x80 }; offs_t offs; int scroll[8]; - bitmap_t *s2636_0_bitmap, *s2636_1_bitmap, *s2636_2_bitmap; - set_pens(screen->machine()); + set_pens(screen.machine()); /* draw the background */ for (offs = 0; offs < 0x0400; offs++) @@ -209,7 +208,7 @@ int gfxnum = (code < ram_based_char_start_indices[state->m_character_banking_mode]) ? 0 : 1; - drawgfx_opaque(state->m_background_bitmap, 0, screen->machine().gfx[gfxnum], + drawgfx_opaque(state->m_background_bitmap, state->m_background_bitmap.cliprect(), screen.machine().gfx[gfxnum], code, color, 0, 0, x, y); @@ -225,7 +224,7 @@ collision_color = 0x102; } - drawgfx_opaque(state->m_collision_background, 0, screen->machine().gfx[gfxnum], + drawgfx_opaque(state->m_collision_background, state->m_collision_background.cliprect(), screen.machine().gfx[gfxnum], code, collision_color, 0, 0, x, y); @@ -246,9 +245,9 @@ copyscrollbitmap(state->m_scrolled_collision_background, state->m_collision_background, 0, 0, 8, scroll, cliprect); /* update the S2636 chips */ - s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); - s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); - s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); + bitmap_ind16 &s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); + bitmap_ind16 &s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); + bitmap_ind16 &s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); /* Bullet Hardware */ for (offs = 8; offs < 256; offs++ ) @@ -261,16 +260,16 @@ int bx = 255 - 7 - state->m_bullet_ram[offs] - ct; /* Bullet/Object Collision */ - if ((*BITMAP_ADDR16(s2636_0_bitmap, offs, bx) != 0) || - (*BITMAP_ADDR16(s2636_1_bitmap, offs, bx) != 0) || - (*BITMAP_ADDR16(s2636_2_bitmap, offs, bx) != 0)) + if ((s2636_0_bitmap.pix16(offs, bx) != 0) || + (s2636_1_bitmap.pix16(offs, bx) != 0) || + (s2636_2_bitmap.pix16(offs, bx) != 0)) state->m_collision_register |= 0x08; /* Bullet/Background Collision */ - if (colortable_entry_get_value(screen->machine().colortable, *BITMAP_ADDR16(state->m_scrolled_collision_background, offs, bx))) + if (colortable_entry_get_value(screen.machine().colortable, state->m_scrolled_collision_background.pix16(offs, bx))) state->m_collision_register |= 0x80; - *BITMAP_ADDR16(bitmap, offs, bx) = BULLET_STAR_PEN; + bitmap.pix16(offs, bx) = BULLET_STAR_PEN; } } } @@ -280,21 +279,21 @@ { int y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - int pixel0 = *BITMAP_ADDR16(s2636_0_bitmap, y, x); - int pixel1 = *BITMAP_ADDR16(s2636_1_bitmap, y, x); - int pixel2 = *BITMAP_ADDR16(s2636_2_bitmap, y, x); + int pixel0 = s2636_0_bitmap.pix16(y, x); + int pixel1 = s2636_1_bitmap.pix16(y, x); + int pixel2 = s2636_2_bitmap.pix16(y, x); int pixel = pixel0 | pixel1 | pixel2; if (S2636_IS_PIXEL_DRAWN(pixel)) { - *BITMAP_ADDR16(bitmap, y, x) = SPRITE_PEN_BASE + S2636_PIXEL_COLOR(pixel); + bitmap.pix16(y, x) = SPRITE_PEN_BASE + S2636_PIXEL_COLOR(pixel); /* S2636 vs. S2636 collision detection */ if (S2636_IS_PIXEL_DRAWN(pixel0) && S2636_IS_PIXEL_DRAWN(pixel1)) state->m_collision_register |= 0x01; @@ -302,7 +301,7 @@ if (S2636_IS_PIXEL_DRAWN(pixel0) && S2636_IS_PIXEL_DRAWN(pixel2)) state->m_collision_register |= 0x04; /* S2636 vs. background collision detection */ - if (colortable_entry_get_value(screen->machine().colortable, *BITMAP_ADDR16(state->m_scrolled_collision_background, y, x))) + if (colortable_entry_get_value(screen.machine().colortable, state->m_scrolled_collision_background.pix16(y, x))) { if (S2636_IS_PIXEL_DRAWN(pixel0)) state->m_collision_register |= 0x10; if (S2636_IS_PIXEL_DRAWN(pixel1)) state->m_collision_register |= 0x20; @@ -323,15 +322,15 @@ if ((y & 1) ^ ((x >> 4) & 1)) { - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) x = ~x; - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) y = ~y; - if ((y >= cliprect->min_y) && (y <= cliprect->max_y) && - (colortable_entry_get_value(screen->machine().colortable, *BITMAP_ADDR16(bitmap, y, x)) == 0)) - *BITMAP_ADDR16(bitmap, y, x) = BULLET_STAR_PEN; + if ((y >= cliprect.min_y) && (y <= cliprect.max_y) && + (colortable_entry_get_value(screen.machine().colortable, bitmap.pix16(y, x)) == 0)) + bitmap.pix16(y, x) = BULLET_STAR_PEN; } } } diff -Nru mame-0.144/src/mame/video/cyberbal.c mame-0.145/src/mame/video/cyberbal.c --- mame-0.144/src/mame/video/cyberbal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/cyberbal.c 2012-02-06 21:30:31.000000000 +0000 @@ -153,14 +153,14 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 16,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* allocate the second screen if necessary */ if (screens == 2) { /* initialize the playfield */ state->m_playfield2_tilemap = tilemap_create(machine, get_playfield2_tile_info, tilemap_scan_rows, 16,8, 64,64); - tilemap_set_scrollx(state->m_playfield2_tilemap, 0, 0); + state->m_playfield2_tilemap->set_scrollx(0, 0); /* initialize the motion objects */ atarimo_init(machine, 1, &mo1desc); @@ -168,8 +168,8 @@ /* initialize the alphanumerics */ state->m_alpha2_tilemap = tilemap_create(machine, get_alpha2_tile_info, tilemap_scan_rows, 16,8, 64,32); - tilemap_set_scrollx(state->m_alpha2_tilemap, 0, 0); - tilemap_set_transparent_pen(state->m_alpha2_tilemap, 0); + state->m_alpha2_tilemap->set_scrollx(0, 0); + state->m_alpha2_tilemap->set_transparent_pen(0); } /* save states */ @@ -267,7 +267,8 @@ screen_device *update_screen; /* loop over screens */ - for (i = 0, update_screen = screen.machine().first_screen(); update_screen != NULL; i++, update_screen = update_screen->next_screen()) + screen_device_iterator iter(screen.machine().root_device()); + for (i = 0, update_screen = iter.first(); update_screen != NULL; i++, update_screen = iter.next()) { UINT16 *vram = i ? state->m_alpha2 : state->m_alpha; UINT16 *base = &vram[((scanline - 8) / 8) * 64 + 47]; @@ -286,7 +287,7 @@ if (scanline > 0) update_screen->update_partial(scanline - 1); state->m_playfield_palette_bank[i] = (base[3] >> 1) & 7; - tilemap_set_palette_offset(i ? state->m_playfield2_tilemap : state->m_playfield_tilemap, state->m_playfield_palette_bank[i] << 8); + (i ? state->m_playfield2_tilemap : state->m_playfield_tilemap)->set_palette_offset(state->m_playfield_palette_bank[i] << 8); } } if (!(base[4] & 1)) @@ -296,7 +297,7 @@ { if (scanline > 0) update_screen->update_partial(scanline - 1); - tilemap_set_scrollx(i ? state->m_playfield2_tilemap : state->m_playfield_tilemap, 0, newscroll); + (i ? state->m_playfield2_tilemap : state->m_playfield_tilemap)->set_scrollx(0, newscroll); state->m_playfield_xscroll[i] = newscroll; } } @@ -308,7 +309,7 @@ { if (scanline > 0) update_screen->update_partial(scanline - 1); - tilemap_set_scrolly(i ? state->m_playfield2_tilemap : state->m_playfield_tilemap, 0, newscroll); + (i ? state->m_playfield2_tilemap : state->m_playfield_tilemap)->set_scrolly(0, newscroll); state->m_playfield_yscroll[i] = newscroll; } } @@ -332,22 +333,17 @@ * *************************************/ -static void update_one_screen(screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect) +static UINT32 update_one_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index) { cyberbal_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - rectangle tempclip = *cliprect; - bitmap_t *mobitmap; + rectangle tempclip = cliprect; + bitmap_ind16 *mobitmap; int x, y, r, mooffset, temp; rectangle visarea = screen.visible_area(); - /* for 2p games, the left screen is the main screen */ - device_t *left_screen = screen.machine().device("lscreen"); - if (left_screen == NULL) - left_screen = screen.machine().device("screen"); - /* draw the playfield */ - tilemap_draw(bitmap, cliprect, (&screen == left_screen) ? state->m_playfield_tilemap : state->m_playfield2_tilemap, 0, 0); + ((index == 0) ? state->m_playfield_tilemap : state->m_playfield2_tilemap)->draw(bitmap, cliprect, 0, 0); /* draw the MOs -- note some kludging to get this to work correctly for 2 screens */ mooffset = 0; @@ -356,7 +352,7 @@ temp = visarea.max_x; if (temp > SCREEN_WIDTH) visarea.max_x /= 2; - mobitmap = atarimo_render((&screen == left_screen) ? 0 : 1, cliprect, &rectlist); + mobitmap = atarimo_render((index == 0) ? 0 : 1, cliprect, &rectlist); tempclip.min_x += mooffset; tempclip.max_x += mooffset; visarea.max_x = temp; @@ -365,8 +361,8 @@ for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y + mooffset; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y) + mooffset; for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -380,12 +376,22 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, (&screen == left_screen) ? state->m_alpha_tilemap : state->m_alpha2_tilemap, 0, 0); + ((index == 0) ? state->m_alpha_tilemap : state->m_alpha2_tilemap)->draw(bitmap, cliprect, 0, 0); + return 0; } -SCREEN_UPDATE( cyberbal ) +SCREEN_UPDATE_IND16( cyberbal_left ) { - update_one_screen(*screen, bitmap, cliprect); - return 0; + return update_one_screen(screen, bitmap, cliprect, 0); +} + +SCREEN_UPDATE_IND16( cyberbal_right ) +{ + return update_one_screen(screen, bitmap, cliprect, 1); +} + +SCREEN_UPDATE_IND16( cyberbal2p ) +{ + return update_one_screen(screen, bitmap, cliprect, 0); } diff -Nru mame-0.144/src/mame/video/darius.c mame-0.145/src/mame/video/darius.c --- mame-0.144/src/mame/video/darius.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/darius.c 2012-02-06 21:30:31.000000000 +0000 @@ -4,7 +4,7 @@ /***************************************************************************/ -INLINE void actual_get_fg_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum ) +INLINE void actual_get_fg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum ) { UINT16 code = (ram[tile_index + 0x2000] & 0x7ff); UINT16 attr = ram[tile_index]; @@ -30,7 +30,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,128,64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } /***************************************************************************/ @@ -41,12 +41,12 @@ COMBINE_DATA(&state->m_fg_ram[offset]); if (offset < 0x4000) - tilemap_mark_tile_dirty(state->m_fg_tilemap, (offset & 0x1fff)); + state->m_fg_tilemap->mark_tile_dirty((offset & 0x1fff)); } /***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int primask, int x_offs, int y_offs ) { darius_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -92,17 +92,9 @@ -SCREEN_UPDATE( darius ) +static UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs) { - darius_state *state = screen->machine().driver_data(); - int xoffs = 0; - - if (screen == state->m_lscreen) - xoffs = 36 * 8 * 0; - else if (screen == state->m_mscreen) - xoffs = 36 * 8 * 1; - else if (screen == state->m_rscreen) - xoffs = 36 * 8 * 2; + darius_state *state = screen.machine().driver_data(); pc080sn_tilemap_update(state->m_pc080sn); @@ -110,16 +102,21 @@ pc080sn_tilemap_draw_offset(state->m_pc080sn, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0, -xoffs, 0); /* Sprites can be under/over the layer below text layer */ - draw_sprites(screen->machine(), bitmap, cliprect, 0, xoffs, -8); // draw sprites with priority 0 which are under the mid layer + draw_sprites(screen.machine(), bitmap, cliprect, 0, xoffs, -8); // draw sprites with priority 0 which are under the mid layer // draw middle layer pc080sn_tilemap_draw_offset(state->m_pc080sn, bitmap, cliprect, 1, 0, 0, -xoffs, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1, xoffs, -8); // draw sprites with priority 1 which are over the mid layer + draw_sprites(screen.machine(), bitmap, cliprect, 1, xoffs, -8); // draw sprites with priority 1 which are over the mid layer /* top(text) layer is in fixed position */ - tilemap_set_scrollx(state->m_fg_tilemap, 0, 0 + xoffs); - tilemap_set_scrolly(state->m_fg_tilemap, 0, -8); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrollx(0, 0 + xoffs); + state->m_fg_tilemap->set_scrolly(0, -8); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } + +SCREEN_UPDATE_IND16( darius_left ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 0); } +SCREEN_UPDATE_IND16( darius_middle ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 1); } +SCREEN_UPDATE_IND16( darius_right ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 2); } + diff -Nru mame-0.144/src/mame/video/darkmist.c mame-0.145/src/mame/video/darkmist.c --- mame-0.144/src/mame/video/darkmist.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/darkmist.c 2012-02-06 21:30:33.000000000 +0000 @@ -123,31 +123,31 @@ state->m_bgtilemap = tilemap_create( machine, get_bgtile_info,tilemap_scan_rows,16,16,512,64 ); state->m_fgtilemap = tilemap_create( machine, get_fgtile_info,tilemap_scan_rows,16,16,64,256 ); state->m_txtilemap = tilemap_create( machine, get_txttile_info,tilemap_scan_rows,8,8,32,32 ); - tilemap_set_transparent_pen(state->m_fgtilemap, 0); - tilemap_set_transparent_pen(state->m_txtilemap, 0); + state->m_fgtilemap->set_transparent_pen(0); + state->m_txtilemap->set_transparent_pen(0); } -SCREEN_UPDATE( darkmist) +SCREEN_UPDATE_IND16( darkmist) { - darkmist_state *state = screen->machine().driver_data(); + darkmist_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; #define DM_GETSCROLL(n) (((state->m_scroll[(n)]<<1)&0xff) + ((state->m_scroll[(n)]&0x80)?1:0) +( ((state->m_scroll[(n)-1]<<4) | (state->m_scroll[(n)-1]<<12) )&0xff00)) - set_pens(screen->machine()); + set_pens(screen.machine()); - tilemap_set_scrollx(state->m_bgtilemap, 0, DM_GETSCROLL(0x2)); - tilemap_set_scrolly(state->m_bgtilemap, 0, DM_GETSCROLL(0x6)); - tilemap_set_scrollx(state->m_fgtilemap, 0, DM_GETSCROLL(0xa)); - tilemap_set_scrolly(state->m_fgtilemap, 0, DM_GETSCROLL(0xe)); + state->m_bgtilemap->set_scrollx(0, DM_GETSCROLL(0x2)); + state->m_bgtilemap->set_scrolly(0, DM_GETSCROLL(0x6)); + state->m_fgtilemap->set_scrollx(0, DM_GETSCROLL(0xa)); + state->m_fgtilemap->set_scrolly(0, DM_GETSCROLL(0xe)); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if(state->m_hw & DISPLAY_BG) - tilemap_draw(bitmap,cliprect,state->m_bgtilemap, 0,0); + state->m_bgtilemap->draw(bitmap, cliprect, 0,0); if(state->m_hw & DISPLAY_FG) - tilemap_draw(bitmap,cliprect,state->m_fgtilemap, 0,0); + state->m_fgtilemap->draw(bitmap, cliprect, 0,0); if(state->m_hw & DISPLAY_SPR) { @@ -176,13 +176,13 @@ palette=((spriteram[i+1])>>1)&0xf; if(spriteram[i+1]&0x1) - palette=screen->machine().rand()&15; + palette=screen.machine().rand()&15; palette+=32; drawgfx_transpen( bitmap,cliprect, - screen->machine().gfx[2], + screen.machine().gfx[2], tile, palette, fx,fy, @@ -192,8 +192,8 @@ if(state->m_hw & DISPLAY_TXT) { - tilemap_mark_all_tiles_dirty(state->m_txtilemap); - tilemap_draw(bitmap,cliprect,state->m_txtilemap, 0,0); + state->m_txtilemap->mark_all_dirty(); + state->m_txtilemap->draw(bitmap, cliprect, 0,0); } diff -Nru mame-0.144/src/mame/video/darkseal.c mame-0.145/src/mame/video/darkseal.c --- mame-0.144/src/mame/video/darkseal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/darkseal.c 2012-02-06 21:30:31.000000000 +0000 @@ -59,12 +59,12 @@ /******************************************************************************/ -SCREEN_UPDATE( darkseal ) +SCREEN_UPDATE_IND16( darkseal ) { - darkseal_state *state = screen->machine().driver_data(); - tilemap_set_flip_all(screen->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + darkseal_state *state = screen.machine().driver_data(); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf1_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf3_rowscroll); @@ -73,7 +73,7 @@ deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; diff -Nru mame-0.144/src/mame/video/dassault.c mame-0.145/src/mame/video/dassault.c --- mame-0.144/src/mame/video/dassault.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dassault.c 2012-02-06 21:30:32.000000000 +0000 @@ -2,217 +2,136 @@ Desert Assault Video emulation - Bryan McPhail, mish@tendril.co.uk + I'm not sure if one of the alpha blending effects is correct (mode 0x8000, + the usual mode 0x4000 should be correct). It may be some kind of orthogonal + priority effect where it should cut a hole in other higher priority sprites + to reveal a non-alpha'd hole, or alpha against a further back tilemap. + (is this the helicopter shadow at the end of lv.1 ?) + + Also, some priorities are still a little questionable. + + ****************************************************************************/ #include "emu.h" #include "video/deco16ic.h" #include "includes/dassault.h" #include "video/decocomn.h" +#include "video/decospr.h" /******************************************************************************/ -static void draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int pf_priority ) +VIDEO_START(dassault) { - dassault_state *state = machine.driver_data(); - UINT16 *buffered_spriteram = machine.generic.buffered_spriteram.u16; - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - int offs, bank, gfxbank; - const UINT16 *spritebase; + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); +} - /* Have to loop over the two sprite sources */ - for (bank = 0; bank < 2; bank++) - { - for (offs = 0x800 - 4; offs >= 0; offs -= 4) - { - int alpha = 0xff, pmask = 0; +static void mixdassaultlayer(running_machine &machine, bitmap_rgb32 &bitmap, bitmap_ind16* sprite_bitmap, const rectangle &cliprect, UINT16 pri, UINT16 primask, UINT16 penbase, UINT8 alpha) +{ + int y, x; + const pen_t *paldata = machine.pens; - /* Draw the main spritebank after the other one */ - if (bank == 0) - { - spritebase = buffered_spriteram; - gfxbank = 3; - } - else - { - spritebase = machine.generic.buffered_spriteram2.u16; - gfxbank = 4; - } + UINT16* srcline; + UINT32* dstline; - sprite = spritebase[offs + 1] & 0x7fff; - if (!sprite) - continue; + for (y=cliprect.min_y;y<=cliprect.max_y;y++) + { + srcline=&sprite_bitmap->pix16(y,0); + dstline=&bitmap.pix32(y,0); - x = spritebase[offs + 2]; + for (x=cliprect.min_x;x<=cliprect.max_x;x++) + { + UINT16 pix = srcline[x]; - /* Alpha on chip 2 only */ - if (bank == 1 && x & 0xc000) - alpha = 0x80; - - y = spritebase[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) + if ((pix & primask) != pri) continue; - colour = (x >> 9) & 0x1f; - if (y & 0x8000) - colour += 32; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - x = 304 - x; - y = 240 - y; - - if (x > 320) - continue; /* Speedup */ - - sprite &= ~multi; - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - if (flip_screen_get(machine)) + if (pix&0xf) { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else mult = -16; - - /* Priority */ - switch (pf_priority & 3) - { - case 0: - if (bank == 0) - { - switch (spritebase[offs+2]&0xc000) - { - case 0xc000: pmask = 1; break; - case 0x8000: pmask = 8; break; - case 0x4000: pmask = 32; break; - case 0x0000: pmask = 128; break; - } - } - else - { - if (spritebase[offs + 2] & 0x8000) - pmask = 64; /* Check */ - else - pmask = 64; - } - break; + UINT16 pen = pix&0x1ff; + if (pix & 0x800) pen += 0x200; - case 1: - if (bank == 0) + if (alpha!=0xff) { - switch (spritebase[offs + 2] & 0xc000) + if (pix&0x600) { - case 0xc000: pmask = 1; break; - case 0x8000: pmask = 8; break; - case 0x4000: pmask = 32; break; - case 0x0000: pmask = 128; break; + UINT32 base = dstline[x]; + dstline[x] = alpha_blend_r32(base, paldata[pen+penbase], alpha); } - } - else - { - if (spritebase[offs + 2] & 0x8000) - pmask = 16; /* Check */ else - pmask = 16; - } - break; - - case 2: /* Unused */ - case 3: - if (bank == 0) - { - switch (spritebase[offs + 2] & 0xc000) { - case 0xc000: pmask = 1; break; - case 0x8000: pmask = 8; break; - case 0x4000: pmask = 32; break; - case 0x0000: pmask = 128; break; + dstline[x] = paldata[pen+penbase]; } } else { - if (spritebase[offs + 2] & 0x8000) - pmask = 64; /* Check */ - else - pmask = 64; + dstline[x] = paldata[pen+penbase]; } - break; - } - - while (multi >= 0) - { - decocomn_pdrawgfx( - state->m_decocomn, - bitmap,cliprect,machine.gfx[gfxbank], - sprite - multi * inc, - colour, - fx, fy, - x, y + mult * multi, - 0, pmask, 1 << bank, 1, alpha); - - multi--; } } } } -/******************************************************************************/ - -SCREEN_UPDATE( dassault ) +/* are the priorities 100% correct? they're the same as they were before conversion to DECO52 sprite device, but if (for example) you walk to the side of the crates in the first part of the game you appear over them... */ +SCREEN_UPDATE_RGB32( dassault ) { - dassault_state *state = screen->machine().driver_data(); + dassault_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u16, 0x400, false); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, false); + bitmap_ind16* sprite_bitmap1 = &screen.machine().device("spritegen1")->get_sprite_temp_bitmap(); + bitmap_ind16* sprite_bitmap2 = &screen.machine().device("spritegen2")->get_sprite_temp_bitmap(); + /* Update tilemaps */ - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, 0, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, 0, state->m_pf4_rowscroll); /* Draw playfields/update priority bitmap */ - decocomn_clear_sprite_priority_bitmap(state->m_decocomn); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, screen->machine().pens[3072]); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(screen.machine().pens[3072], cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); /* The middle playfields can be swapped priority-wise */ if ((priority & 3) == 0) { - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 16); + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); // 2 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 16); // 16 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64? + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 + } else if ((priority & 3) == 1) { - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 64); + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); // 2 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 16? + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 64); // 64 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 } else if ((priority & 3) == 3) { - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 16); + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0600, 0x0600, 0x400, 0xff); // 1 + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); // 2 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0400, 0x0600, 0x400, 0xff); // 8 + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 16); // 16 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0200, 0x0600, 0x400, 0xff); // 32 + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap2, cliprect, 0x0000, 0x0000, 0x800, 0x80); // 64? + mixdassaultlayer(screen.machine(), bitmap, sprite_bitmap1, cliprect, 0x0000, 0x0600, 0x400, 0xff); // 128 } else { /* Unused */ } - /* Draw sprites - two sprite generators, with selectable priority */ - draw_sprites(screen->machine(), bitmap, cliprect, priority); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/dbz.c mame-0.145/src/mame/video/dbz.c --- mame-0.144/src/mame/video/dbz.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dbz.c 2012-02-06 21:30:31.000000000 +0000 @@ -42,7 +42,7 @@ { dbz_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg2_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset / 2); + state->m_bg2_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_dbz_bg2_tile_info ) @@ -61,7 +61,7 @@ { dbz_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg1_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset / 2); + state->m_bg1_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_dbz_bg1_tile_info ) @@ -83,8 +83,8 @@ state->m_bg1_tilemap = tilemap_create(machine, get_dbz_bg1_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_bg2_tilemap = tilemap_create(machine, get_dbz_bg2_tile_info, tilemap_scan_rows, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 0); + state->m_bg1_tilemap->set_transparent_pen(0); + state->m_bg2_tilemap->set_transparent_pen(0); if (!strcmp(machine.system().name, "dbz")) k056832_set_layer_offs(state->m_k056832, 0, -34, -16); @@ -97,9 +97,9 @@ k053247_set_sprite_offs(state->m_k053246, -87, 32); } -SCREEN_UPDATE( dbz ) +SCREEN_UPDATE_IND16( dbz ) { - dbz_state *state = screen->machine().driver_data(); + dbz_state *state = screen.machine().driver_data(); static const int K053251_CI[6] = { K053251_CI3, K053251_CI4, K053251_CI4, K053251_CI4, K053251_CI2, K053251_CI1 }; int layer[5], plane, new_colorbase; @@ -114,9 +114,9 @@ if (plane <= 3) k056832_mark_plane_dirty(state->m_k056832, plane); else if (plane == 4) - tilemap_mark_all_tiles_dirty(state->m_bg1_tilemap); + state->m_bg1_tilemap->mark_all_dirty(); else if (plane == 5) - tilemap_mark_all_tiles_dirty(state->m_bg2_tilemap); + state->m_bg2_tilemap->mark_all_dirty(); } } @@ -135,7 +135,7 @@ konami_sortlayers5(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); for (plane = 0; plane < 5; plane++) { diff -Nru mame-0.144/src/mame/video/dc.c mame-0.145/src/mame/video/dc.c --- mame-0.144/src/mame/video/dc.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/dc.c 2012-02-06 21:30:31.000000000 +0000 @@ -26,17 +26,17 @@ ---- ---- ---- ---- --xx ---- ---- ---- hblank_int_mode ---- ---- ---- ---- ---- --xx xxxx xxxx line_comp_val */ -#define spg_hblank_in_irq ((pvrta_regs[SPG_HBLANK_INT] & 0x03ff0000) >> 16) -#define spg_hblank_int_mode ((pvrta_regs[SPG_HBLANK_INT] & 0x00003000) >> 12) -#define spg_line_comp_val ((pvrta_regs[SPG_HBLANK_INT] & 0x000003ff) >> 0) +#define spg_hblank_in_irq ((state->pvrta_regs[SPG_HBLANK_INT] & 0x03ff0000) >> 16) +#define spg_hblank_int_mode ((state->pvrta_regs[SPG_HBLANK_INT] & 0x00003000) >> 12) +#define spg_line_comp_val ((state->pvrta_regs[SPG_HBLANK_INT] & 0x000003ff) >> 0) /* SPG_VBLANK_INT ---- --xx xxxx xxxx ---- ---- ---- ---- vblank_out_interrupt_line_number ---- ---- ---- ---- ---- --xx xxxx xxxx vblank_in_interrupt_line_number */ -#define spg_vblank_out_irq_line_num ((pvrta_regs[SPG_VBLANK_INT] & 0x03ff0000) >> 16) -#define spg_vblank_in_irq_line_num ((pvrta_regs[SPG_VBLANK_INT] & 0x000003ff) >> 0) +#define spg_vblank_out_irq_line_num ((state->pvrta_regs[SPG_VBLANK_INT] & 0x03ff0000) >> 16) +#define spg_vblank_in_irq_line_num ((state->pvrta_regs[SPG_VBLANK_INT] & 0x000003ff) >> 0) /* @@ -46,18 +46,18 @@ ---- ---- ---- ---- xxxx xxxx ---- ---- Green ---- ---- ---- ---- ---- ---- xxxx xxxx Blue */ -#define vo_border_K ((pvrta_regs[VO_BORDER_COL] & 0x01000000) >> 24) -#define vo_border_R ((pvrta_regs[VO_BORDER_COL] & 0x00ff0000) >> 16) -#define vo_border_G ((pvrta_regs[VO_BORDER_COL] & 0x0000ff00) >> 8) -#define vo_border_B ((pvrta_regs[VO_BORDER_COL] & 0x000000ff) >> 0) +#define vo_border_K ((state->pvrta_regs[VO_BORDER_COL] & 0x01000000) >> 24) +#define vo_border_R ((state->pvrta_regs[VO_BORDER_COL] & 0x00ff0000) >> 16) +#define vo_border_G ((state->pvrta_regs[VO_BORDER_COL] & 0x0000ff00) >> 8) +#define vo_border_B ((state->pvrta_regs[VO_BORDER_COL] & 0x000000ff) >> 0) /* SPG_HBLANK ---- ---- --xx xxxx xxxx ---- ---- ---- hbend ---- ---- ---- ---- ---- --xx xxxx xxxx hbstart */ -#define spg_hbend ((pvrta_regs[SPG_HBLANK] & 0x03ff0000) >> 16) -#define spg_hbstart ((pvrta_regs[SPG_HBLANK] & 0x000003ff) >> 0) +#define spg_hbend ((state->pvrta_regs[SPG_HBLANK] & 0x03ff0000) >> 16) +#define spg_hbstart ((state->pvrta_regs[SPG_HBLANK] & 0x000003ff) >> 0) /* @@ -65,16 +65,16 @@ ---- ---- --xx xxxx xxxx ---- ---- ---- vcount ---- ---- ---- ---- ---- --xx xxxx xxxx hcount */ -#define spg_vcount ((pvrta_regs[SPG_LOAD] & 0x03ff0000) >> 16) -#define spg_hcount ((pvrta_regs[SPG_LOAD] & 0x000003ff) >> 0) +#define spg_vcount ((state->pvrta_regs[SPG_LOAD] & 0x03ff0000) >> 16) +#define spg_hcount ((state->pvrta_regs[SPG_LOAD] & 0x000003ff) >> 0) /* SPG_VBLANK ---- ---- --xx xxxx xxxx ---- ---- ---- vbend ---- ---- ---- ---- ---- --xx xxxx xxxx vbstart */ -#define spg_vbend ((pvrta_regs[SPG_VBLANK] & 0x03ff0000) >> 16) -#define spg_vbstart ((pvrta_regs[SPG_VBLANK] & 0x000003ff) >> 0) +#define spg_vbend ((state->pvrta_regs[SPG_VBLANK] & 0x03ff0000) >> 16) +#define spg_vbstart ((state->pvrta_regs[SPG_VBLANK] & 0x000003ff) >> 0) /* @@ -87,19 +87,19 @@ ---- ---- ---- ---- ---- ---- ---- --x- vsync_pol ---- ---- ---- ---- ---- ---- ---- ---x hsync_pol */ -#define spg_pclk_delay ((pvrta_regs[VO_CONTROL] & 0x003f0000) >> 16) -#define spg_pixel_double ((pvrta_regs[VO_CONTROL] & 0x00000100) >> 8) -#define spg_field_mode ((pvrta_regs[VO_CONTROL] & 0x000000f0) >> 4) -#define spg_blank_video ((pvrta_regs[VO_CONTROL] & 0x00000008) >> 3) -#define spg_blank_pol ((pvrta_regs[VO_CONTROL] & 0x00000004) >> 2) -#define spg_vsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000002) >> 1) -#define spg_hsync_pol ((pvrta_regs[VO_CONTROL] & 0x00000001) >> 0) +#define spg_pclk_delay ((state->pvrta_regs[VO_CONTROL] & 0x003f0000) >> 16) +#define spg_pixel_double ((state->pvrta_regs[VO_CONTROL] & 0x00000100) >> 8) +#define spg_field_mode ((state->pvrta_regs[VO_CONTROL] & 0x000000f0) >> 4) +#define spg_blank_video ((state->pvrta_regs[VO_CONTROL] & 0x00000008) >> 3) +#define spg_blank_pol ((state->pvrta_regs[VO_CONTROL] & 0x00000004) >> 2) +#define spg_vsync_pol ((state->pvrta_regs[VO_CONTROL] & 0x00000002) >> 1) +#define spg_hsync_pol ((state->pvrta_regs[VO_CONTROL] & 0x00000001) >> 0) /* VO_STARTX ---- ---- ---- ---- ---- ---x xxxx xxxx horzontal start position */ -#define vo_horz_start_pos ((pvrta_regs[VO_STARTX] & 0x000003ff) >> 0) +#define vo_horz_start_pos ((state->pvrta_regs[VO_STARTX] & 0x000003ff) >> 0) /* VO_STARTY @@ -107,8 +107,8 @@ ---- ---- ---- ---- ---- ---x xxxx xxxx vertical start position on field 1 */ -#define vo_vert_start_pos_f2 ((pvrta_regs[VO_STARTY] & 0x03ff0000) >> 16) -#define vo_vert_start_pos_f1 ((pvrta_regs[VO_STARTY] & 0x000003ff) >> 0) +#define vo_vert_start_pos_f2 ((state->pvrta_regs[VO_STARTY] & 0x03ff0000) >> 16) +#define vo_vert_start_pos_f1 ((state->pvrta_regs[VO_STARTY] & 0x000003ff) >> 0) /* SPG_STATUS @@ -116,11 +116,9 @@ ---- ---- ---- ---- ---x ---- ---- ---- hsync ---- ---- ---- ---- ---- x--- ---- ---- blank ---- ---- ---- ---- ---- -x-- ---- ---- field number ----- ---- ---- ---- ---- --xx xxxx xxxx scanline +---- ---- ---- ---- ---- --xx xxxx xxxx state->scanline */ -UINT32 pvrctrl_regs[0x100/4]; -static UINT32 pvrta_regs[0x2000/4]; static const int pvr_parconfseq[] = {1,2,3,2,3,4,5,6,5,6,7,8,9,10,11,12,13,14,13,14,15,16,17,16,17,0,0,0,0,0,18,19,20,19,20,21,22,23,22,23}; static const int pvr_wordsvertex[24] = {8,8,8,8,8,16,16,8,8,8, 8, 8,8,8,8,8,16,16, 8,16,16,8,16,16}; static const int pvr_wordspolygon[24] = {8,8,8,8,8, 8, 8,8,8,8,16,16,8,8,8,8, 8, 8,16,16,16,8, 8, 8}; @@ -129,37 +127,18 @@ static UINT32 dilated1[15][1024]; static int dilatechose[64]; static float wbuffer[480][640]; -static UINT32 debug_dip_status; static void pvr_accumulationbuffer_to_framebuffer(address_space *space, int x,int y); -UINT64 *dc_framebuffer_ram; // '32-bit access area' -UINT64 *dc_texture_ram; // '64-bit access area' -UINT64 *pvr2_texture_ram; -UINT64 *pvr2_framebuffer_ram; - -UINT64 *elan_ram; - -static UINT32 tafifo_buff[32]; - -static emu_timer *vbout_timer; -static emu_timer *vbin_timer; -static emu_timer *hbin_timer; -static emu_timer *endofrender_timer_isp; -static emu_timer *endofrender_timer_tsp; -static emu_timer *endofrender_timer_video; - -static int scanline,next_y; - // the real accumulation buffer is a 32x32x8bpp buffer into which tiles get rendered before they get copied to the framebuffer // our implementation is not currently tile based, and thus the accumulation buffer is screen sized -static bitmap_t *fake_accumulationbuffer_bitmap; -static void render_to_accumulation_buffer(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect); +static bitmap_rgb32 *fake_accumulationbuffer_bitmap; +static void render_to_accumulation_buffer(running_machine &machine,bitmap_rgb32 &bitmap,const rectangle &cliprect); typedef struct texinfo { UINT32 address, vqbase; int textured, sizex, sizey, stride, sizes, pf, palette, mode, mipmapped, blend_mode, filter_mode, flip_u, flip_v; - UINT32 (*r)(struct texinfo *t, float x, float y); + UINT32 (*r)(running_machine &machine, struct texinfo *t, float x, float y); UINT32 (*blend)(UINT32 s, UINT32 d); int palbase, cd; } texinfo; @@ -436,255 +415,282 @@ } -INLINE UINT32 tex_r_yuv_n(texinfo *t, float x, float y) +INLINE UINT32 tex_r_yuv_n(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (t->stride*yt + (xt & ~1))*2; - UINT16 c1 = *(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp)); - UINT16 c2 = *(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp+2)); + UINT16 c1 = *(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp)); + UINT16 c2 = *(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp+2)); return cv_yuv(c1, c2, xt); } -INLINE UINT32 tex_r_1555_n(texinfo *t, float x, float y) +INLINE UINT32 tex_r_1555_n(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (t->stride*yt + xt)*2; - return cv_1555z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_1555z(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_1555_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_1555_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (dilated1[t->cd][xt] + dilated0[t->cd][yt])*2; - return cv_1555(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_1555(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_1555_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_1555_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; - return cv_1555(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_1555(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_565_n(texinfo *t, float x, float y) +INLINE UINT32 tex_r_565_n(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (t->stride*yt + xt)*2; - return cv_565z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_565z(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_565_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_565_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (dilated1[t->cd][xt] + dilated0[t->cd][yt])*2; - return cv_565(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_565(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_565_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_565_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; - return cv_565(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_565(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_4444_n(texinfo *t, float x, float y) +INLINE UINT32 tex_r_4444_n(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (t->stride*yt + xt)*2; - return cv_4444z(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_4444z(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_4444_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_4444_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + (dilated1[t->cd][xt] + dilated0[t->cd][yt])*2; - return cv_4444(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_4444(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_4444_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_4444_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + (dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 1])*2; - return cv_4444(*(UINT16 *)(((UINT8 *)dc_texture_ram) + WORD_XOR_LE(addrp))); + return cv_4444(*(UINT16 *)(((UINT8 *)state->dc_texture_ram) + WORD_XOR_LE(addrp))); } -INLINE UINT32 tex_r_p4_1555_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_1555_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int addrp = t->address + (off >> 1); - int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; - return cv_1555(pvrta_regs[t->palbase + c]); + int c = (((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; + return cv_1555(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_1555_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_1555_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; - return cv_1555(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; + return cv_1555(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_565_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_565_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int addrp = t->address + (off >> 1); - int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; - return cv_565(pvrta_regs[t->palbase + c]); + int c = (((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; + return cv_565(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_565_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_565_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; - return cv_565(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; + return cv_565(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_4444_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_4444_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int addrp = t->address + (off >> 1); - int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; - return cv_4444(pvrta_regs[t->palbase + c]); + int c = (((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; + return cv_4444(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_4444_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_4444_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; - return cv_4444(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; + return cv_4444(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p4_8888_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_8888_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int off = dilated1[t->cd][xt] + dilated0[t->cd][yt]; int addrp = t->address + (off >> 1); - int c = (((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; - return pvrta_regs[t->palbase + c]; + int c = (((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] >> ((off & 1) << 2)) & 0xf; + return state->pvrta_regs[t->palbase + c]; } -INLINE UINT32 tex_r_p4_8888_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p4_8888_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; - return pvrta_regs[t->palbase + c]; + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)] & 0xf; + return state->pvrta_regs[t->palbase + c]; } -INLINE UINT32 tex_r_p8_1555_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_1555_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + dilated1[t->cd][xt] + dilated0[t->cd][yt]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_1555(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_1555(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_1555_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_1555_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_1555(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_1555(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_565_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_565_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + dilated1[t->cd][xt] + dilated0[t->cd][yt]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_565(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_565(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_565_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_565_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_565(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_565(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_4444_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_4444_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + dilated1[t->cd][xt] + dilated0[t->cd][yt]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_4444(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_4444(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_4444_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_4444_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return cv_4444(pvrta_regs[t->palbase + c]); + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return cv_4444(state->pvrta_regs[t->palbase + c]); } -INLINE UINT32 tex_r_p8_8888_tw(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_8888_tw(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); int addrp = t->address + dilated1[t->cd][xt] + dilated0[t->cd][yt]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return pvrta_regs[t->palbase + c]; + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return state->pvrta_regs[t->palbase + c]; } -INLINE UINT32 tex_r_p8_8888_vq(texinfo *t, float x, float y) +INLINE UINT32 tex_r_p8_8888_vq(running_machine &machine, texinfo *t, float x, float y) { + dc_state *state = machine.driver_data(); int xt = ((int)x) & (t->sizex-1); int yt = ((int)y) & (t->sizey-1); - int idx = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; + int idx = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(t->address + dilated1[t->cd][xt >> 1] + dilated0[t->cd][yt >> 1])]; int addrp = t->vqbase + 8*idx + dilated1[t->cd][xt & 1] + dilated0[t->cd][yt & 3]; - int c = ((UINT8 *)dc_texture_ram)[BYTE_XOR_LE(addrp)]; - return pvrta_regs[t->palbase + c]; + int c = ((UINT8 *)state->dc_texture_ram)[BYTE_XOR_LE(addrp)]; + return state->pvrta_regs[t->palbase + c]; } -INLINE UINT32 tex_r_default(texinfo *t, float x, float y) +INLINE UINT32 tex_r_default(running_machine &machine, texinfo *t, float x, float y) { return ((int)x ^ (int)y) & 4 ? 0xffffff00 : 0xff0000ff; } -static void tex_get_info(texinfo *t, pvrta_state *sa) +static void tex_get_info(running_machine &machine,texinfo *t, pvrta_state *sa) { + dc_state *state = machine.driver_data(); int miptype = 0; t->textured = sa->texture; @@ -727,7 +733,7 @@ /* Stride select is used only in the non-twiddled case */ - t->stride = (t->mode & 1) && sa->strideselect ? (pvrta_regs[TEXT_CONTROL] & 0x1f) << 5 : t->sizex; + t->stride = (t->mode & 1) && sa->strideselect ? (state->pvrta_regs[TEXT_CONTROL] & 0x1f) << 5 : t->sizex; t->blend_mode = sa->blend_mode; t->filter_mode = sa->filtermode; @@ -740,7 +746,7 @@ t->vqbase = t->address; t->blend = sa->use_alpha ? blend_functions[t->blend_mode] : bl10; - // fprintf(stderr, "tex %d %d %d %d\n", t->pf, t->mode, pvrta_regs[PAL_RAM_CTRL], t->mipmapped); + // fprintf(stderr, "tex %d %d %d %d\n", t->pf, t->mode, state->pvrta_regs[PAL_RAM_CTRL], t->mipmapped); switch(t->pf) { case 0: // 1555 @@ -799,7 +805,7 @@ case 0: case 1: miptype = 0; - switch(pvrta_regs[PAL_RAM_CTRL]) { + switch(state->pvrta_regs[PAL_RAM_CTRL]) { case 0: t->r = tex_r_p4_1555_tw; break; case 1: t->r = tex_r_p4_565_tw; break; case 2: t->r = tex_r_p4_4444_tw; break; @@ -808,7 +814,7 @@ break; case 2: case 3: miptype = 3; // ? - switch(pvrta_regs[PAL_RAM_CTRL]) { + switch(state->pvrta_regs[PAL_RAM_CTRL]) { case 0: t->r = tex_r_p4_1555_vq; t->address += 0x800; break; case 1: t->r = tex_r_p4_565_vq; t->address += 0x800; break; case 2: t->r = tex_r_p4_4444_vq; t->address += 0x800; break; @@ -828,7 +834,7 @@ case 0: case 1: miptype = 1; - switch(pvrta_regs[PAL_RAM_CTRL]) { + switch(state->pvrta_regs[PAL_RAM_CTRL]) { case 0: t->r = tex_r_p8_1555_tw; break; case 1: t->r = tex_r_p8_565_tw; break; case 2: t->r = tex_r_p8_4444_tw; break; @@ -837,7 +843,7 @@ break; case 2: case 3: miptype = 3; // ? - switch(pvrta_regs[PAL_RAM_CTRL]) { + switch(state->pvrta_regs[PAL_RAM_CTRL]) { case 0: t->r = tex_r_p8_1555_vq; t->address += 0x800; break; case 1: t->r = tex_r_p8_565_vq; t->address += 0x800; break; case 2: t->r = tex_r_p8_4444_vq; t->address += 0x800; break; @@ -973,6 +979,7 @@ READ64_HANDLER( pvr_ta_r ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; @@ -996,7 +1003,7 @@ blank = (space->machine().primary_screen->vblank() | space->machine().primary_screen->hblank()) ? 0 : 1; if(spg_blank_pol) { blank^=1; } - pvrta_regs[reg] = (vsync << 13) | (hsync << 12) | (blank << 11) | (fieldnum << 10) | (space->machine().primary_screen->vpos() & 0x3ff); + state->pvrta_regs[reg] = (vsync << 13) | (hsync << 12) | (blank << 11) | (fieldnum << 10) | (space->machine().primary_screen->vpos() & 0x3ff); break; } case SPG_TRIGGER_POS: @@ -1008,13 +1015,14 @@ #if DEBUG_PVRTA_REGS if (reg != 0x43) - mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f8000+reg*4, pvrta_regs[reg], offset, reg, mem_mask, cpu_get_pc(&space->device())); + mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f8000+reg*4, state->pvrta_regs[reg], offset, reg, mem_mask, cpu_get_pc(&space->device())); #endif - return (UINT64)pvrta_regs[reg] << shift; + return (UINT64)state->pvrta_regs[reg] << shift; } WRITE64_HANDLER( pvr_ta_w ) { + dc_state *state = space->machine().driver_data(); int reg; UINT64 shift; UINT32 dat; @@ -1024,13 +1032,13 @@ reg = decode_reg_64(offset, mem_mask, &shift); dat = (UINT32)(data >> shift); - //old = pvrta_regs[reg]; + //old = state->pvrta_regs[reg]; // Dreamcast BIOS attempts to set PVRID to zero and then dies // if it succeeds. Don't allow. if ((reg != PVRID) && (reg != REVISION)) { - pvrta_regs[reg] = dat; // 5f8000+reg*4=dat + state->pvrta_regs[reg] = dat; // 5f8000+reg*4=dat } switch (reg) @@ -1068,42 +1076,37 @@ g_profiler.start(PROFILER_USER1); #if DEBUG_PVRTA mame_printf_verbose("Start Render Received:\n"); - mame_printf_verbose(" Region Array at %08x\n",pvrta_regs[REGION_BASE]); - mame_printf_verbose(" ISP/TSP Parameters at %08x\n",pvrta_regs[PARAM_BASE]); + mame_printf_verbose(" Region Array at %08x\n",state->pvrta_regs[REGION_BASE]); + mame_printf_verbose(" ISP/TSP Parameters at %08x\n",state->pvrta_regs[PARAM_BASE]); #endif // select buffer to draw using PARAM_BASE for (a=0;a < NUM_BUFFERS;a++) { - if ((state_ta.grab[a].ispbase == pvrta_regs[PARAM_BASE]) && (state_ta.grab[a].valid == 1) && (state_ta.grab[a].busy == 0)) + if ((state_ta.grab[a].ispbase == state->pvrta_regs[PARAM_BASE]) && (state_ta.grab[a].valid == 1) && (state_ta.grab[a].busy == 0)) { - rectangle clip; - state_ta.grab[a].busy = 1; state_ta.renderselect = a; state_ta.start_render_received=1; - state_ta.grab[a].fbwsof1=pvrta_regs[FB_W_SOF1]; - state_ta.grab[a].fbwsof2=pvrta_regs[FB_W_SOF2]; + state_ta.grab[a].fbwsof1=state->pvrta_regs[FB_W_SOF1]; + state_ta.grab[a].fbwsof2=state->pvrta_regs[FB_W_SOF2]; - clip.min_x = 0; - clip.max_x = 1023; - clip.min_y = 0; - clip.max_y = 1023; + rectangle clip(0, 1023, 0, 1023); // we've got a request to draw, so, draw to the accumulation buffer! // this should really be done for each tile! - render_to_accumulation_buffer(space->machine(),fake_accumulationbuffer_bitmap,&clip); + render_to_accumulation_buffer(space->machine(),*fake_accumulationbuffer_bitmap,clip); - endofrender_timer_isp->adjust(attotime::from_usec(4000) ); // hack, make sure render takes some amount of time + state->endofrender_timer_isp->adjust(attotime::from_usec(4000) ); // hack, make sure render takes some amount of time /* copy the tiles to the framebuffer (really the rendering should be in this loop too) */ - if (pvrta_regs[FPU_PARAM_CFG] & 0x200000) + if (state->pvrta_regs[FPU_PARAM_CFG] & 0x200000) sizera=6; else sizera=5; - offsetra=pvrta_regs[REGION_BASE]; + offsetra=state->pvrta_regs[REGION_BASE]; //printf("base is %08x\n", offsetra); @@ -1169,26 +1172,26 @@ state_ta.tafifo_vertexwords=8; state_ta.tafifo_listtype= -1; #if DEBUG_PVRTA - mame_printf_verbose("TA_OL_BASE %08x TA_OL_LIMIT %08x\n", pvrta_regs[TA_OL_BASE], pvrta_regs[TA_OL_LIMIT]); - mame_printf_verbose("TA_ISP_BASE %08x TA_ISP_LIMIT %08x\n", pvrta_regs[TA_ISP_BASE], pvrta_regs[TA_ISP_LIMIT]); - mame_printf_verbose("TA_ALLOC_CTRL %08x\n", pvrta_regs[TA_ALLOC_CTRL]); - mame_printf_verbose("TA_NEXT_OPB_INIT %08x\n", pvrta_regs[TA_NEXT_OPB_INIT]); + mame_printf_verbose("TA_OL_BASE %08x TA_OL_LIMIT %08x\n", state->pvrta_regs[TA_OL_BASE], state->pvrta_regs[TA_OL_LIMIT]); + mame_printf_verbose("TA_ISP_BASE %08x TA_ISP_LIMIT %08x\n", state->pvrta_regs[TA_ISP_BASE], state->pvrta_regs[TA_ISP_LIMIT]); + mame_printf_verbose("TA_ALLOC_CTRL %08x\n", state->pvrta_regs[TA_ALLOC_CTRL]); + mame_printf_verbose("TA_NEXT_OPB_INIT %08x\n", state->pvrta_regs[TA_NEXT_OPB_INIT]); #endif - pvrta_regs[TA_NEXT_OPB] = pvrta_regs[TA_NEXT_OPB_INIT]; - pvrta_regs[TA_ITP_CURRENT] = pvrta_regs[TA_ISP_BASE]; - state_ta.alloc_ctrl_OPB_Mode = pvrta_regs[TA_ALLOC_CTRL] & 0x100000; // 0 up 1 down - state_ta.alloc_ctrl_PT_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 16) & 3)) & 0x38; // number of 32 bit words (0,8,16,32) - state_ta.alloc_ctrl_TM_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 12) & 3)) & 0x38; - state_ta.alloc_ctrl_T_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 8) & 3)) & 0x38; - state_ta.alloc_ctrl_OM_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 4) & 3)) & 0x38; - state_ta.alloc_ctrl_O_OPB = (4 << ((pvrta_regs[TA_ALLOC_CTRL] >> 0) & 3)) & 0x38; + state->pvrta_regs[TA_NEXT_OPB] = state->pvrta_regs[TA_NEXT_OPB_INIT]; + state->pvrta_regs[TA_ITP_CURRENT] = state->pvrta_regs[TA_ISP_BASE]; + state_ta.alloc_ctrl_OPB_Mode = state->pvrta_regs[TA_ALLOC_CTRL] & 0x100000; // 0 up 1 down + state_ta.alloc_ctrl_PT_OPB = (4 << ((state->pvrta_regs[TA_ALLOC_CTRL] >> 16) & 3)) & 0x38; // number of 32 bit words (0,8,16,32) + state_ta.alloc_ctrl_TM_OPB = (4 << ((state->pvrta_regs[TA_ALLOC_CTRL] >> 12) & 3)) & 0x38; + state_ta.alloc_ctrl_T_OPB = (4 << ((state->pvrta_regs[TA_ALLOC_CTRL] >> 8) & 3)) & 0x38; + state_ta.alloc_ctrl_OM_OPB = (4 << ((state->pvrta_regs[TA_ALLOC_CTRL] >> 4) & 3)) & 0x38; + state_ta.alloc_ctrl_O_OPB = (4 << ((state->pvrta_regs[TA_ALLOC_CTRL] >> 0) & 3)) & 0x38; state_ta.listtype_used |= (1+4); // use TA_ISP_BASE and select buffer for grab data state_ta.grabsel = -1; // try to find already used buffer but not busy for (a=0;a < NUM_BUFFERS;a++) { - if ((state_ta.grab[a].ispbase == pvrta_regs[TA_ISP_BASE]) && (state_ta.grab[a].busy == 0) && (state_ta.grab[a].valid == 1)) + if ((state_ta.grab[a].ispbase == state->pvrta_regs[TA_ISP_BASE]) && (state_ta.grab[a].busy == 0) && (state_ta.grab[a].valid == 1)) { state_ta.grabsel=a; break; @@ -1221,7 +1224,7 @@ if (state_ta.grabsel < 0) assert_always(0, "TA grabber error B!\n"); state_ta.grabsellast=state_ta.grabsel; - state_ta.grab[state_ta.grabsel].ispbase=pvrta_regs[TA_ISP_BASE]; + state_ta.grab[state_ta.grabsel].ispbase=state->pvrta_regs[TA_ISP_BASE]; state_ta.grab[state_ta.grabsel].busy=0; state_ta.grab[state_ta.grabsel].valid=1; state_ta.grab[state_ta.grabsel].verts_size=0; @@ -1235,7 +1238,7 @@ printf("TA_YUV_TEX_BASE initialized to %08x\n", dat); // hack, this interrupt is generated after transfering a set amount of data - //dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV; + //state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV; //dc_update_interrupt_status(space->machine()); break; @@ -1245,11 +1248,11 @@ case SPG_VBLANK_INT: /* clear pending irqs and modify them with the updated ones */ - vbin_timer->adjust(attotime::never); - vbout_timer->adjust(attotime::never); + state->vbin_timer->adjust(attotime::never); + state->vbout_timer->adjust(attotime::never); - vbin_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); - vbout_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); + state->vbin_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); + state->vbout_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); break; /* TODO: timer adjust for SPG_HBLANK_INT too */ case TA_LIST_CONT: @@ -1289,36 +1292,48 @@ static TIMER_CALLBACK( transfer_opaque_list_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPLST; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPLST; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( transfer_opaque_modifier_volume_list_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPMV; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPMV; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( transfer_translucent_list_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRLST; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRLST; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( transfer_translucent_modifier_volume_list_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRMV; + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRMV; dc_update_interrupt_status(machine); } static TIMER_CALLBACK( transfer_punch_through_list_irq ) { - dc_sysctrl_regs[SB_ISTNRM] |= (1 << 21); + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= (1 << 21); dc_update_interrupt_status(machine); } static void process_ta_fifo(running_machine& machine) { + dc_state *state = machine.driver_data(); + /* first byte in the buffer is the Parameter Control Word pppp pppp gggg gggg oooo oooo oooo oooo @@ -1332,7 +1347,7 @@ receiveddata *rd = &state_ta.grab[state_ta.grabsel]; // Para Control - state_ta.paracontrol=(tafifo_buff[0] >> 24) & 0xff; + state_ta.paracontrol=(state->tafifo_buff[0] >> 24) & 0xff; // 0 end of list // 1 user tile clip // 2 object list set @@ -1348,12 +1363,12 @@ { state_ta.global_paratype = state_ta.paratype; // Group Control - state_ta.groupcontrol=(tafifo_buff[0] >> 16) & 0xff; + state_ta.groupcontrol=(state->tafifo_buff[0] >> 16) & 0xff; state_ta.groupen=(state_ta.groupcontrol >> 7) & 1; state_ta.striplen=(state_ta.groupcontrol >> 2) & 3; state_ta.userclip=(state_ta.groupcontrol >> 0) & 3; // Obj Control - state_ta.objcontrol=(tafifo_buff[0] >> 0) & 0xffff; + state_ta.objcontrol=(state->tafifo_buff[0] >> 0) & 0xffff; state_ta.shadow=(state_ta.objcontrol >> 7) & 1; state_ta.volume=(state_ta.objcontrol >> 6) & 1; state_ta.coltype=(state_ta.objcontrol >> 4) & 3; @@ -1416,20 +1431,20 @@ { // user tile clip #if DEBUG_PVRDLIST mame_printf_verbose("Para Type 1 User Tile Clip\n"); - mame_printf_verbose(" (%d , %d)-(%d , %d)\n", tafifo_buff[4], tafifo_buff[5], tafifo_buff[6], tafifo_buff[7]); + mame_printf_verbose(" (%d , %d)-(%d , %d)\n", state->tafifo_buff[4], state->tafifo_buff[5], state->tafifo_buff[6], state->tafifo_buff[7]); #endif } else if (state_ta.paratype == 2) { // object list set #if DEBUG_PVRDLIST - mame_printf_verbose("Para Type 2 Object List Set at %08x\n", tafifo_buff[1]); - mame_printf_verbose(" (%d , %d)-(%d , %d)\n", tafifo_buff[4], tafifo_buff[5], tafifo_buff[6], tafifo_buff[7]); + mame_printf_verbose("Para Type 2 Object List Set at %08x\n", state->tafifo_buff[1]); + mame_printf_verbose(" (%d , %d)-(%d , %d)\n", state->tafifo_buff[4], state->tafifo_buff[5], state->tafifo_buff[6], state->tafifo_buff[7]); #endif } else if (state_ta.paratype == 3) { #if DEBUG_PVRDLIST - mame_printf_verbose("Para Type %x Unknown!\n", tafifo_buff[0]); + mame_printf_verbose("Para Type %x Unknown!\n", state->tafifo_buff[0]); #endif } else @@ -1455,40 +1470,40 @@ if ((state_ta.paratype == 4) || (state_ta.paratype == 5)) { // quad or polygon - state_ta.depthcomparemode=(tafifo_buff[1] >> 29) & 7; - state_ta.cullingmode=(tafifo_buff[1] >> 27) & 3; - state_ta.zwritedisable=(tafifo_buff[1] >> 26) & 1; - state_ta.cachebypass=(tafifo_buff[1] >> 21) & 1; - state_ta.dcalcctrl=(tafifo_buff[1] >> 20) & 1; - state_ta.volumeinstruction=(tafifo_buff[1] >> 29) & 7; - - //state_ta.textureusize=1 << (3+((tafifo_buff[2] >> 3) & 7)); - //state_ta.texturevsize=1 << (3+(tafifo_buff[2] & 7)); - state_ta.texturesizes=tafifo_buff[2] & 0x3f; - state_ta.blend_mode = tafifo_buff[2] >> 26; - state_ta.srcselect=(tafifo_buff[2] >> 25) & 1; - state_ta.dstselect=(tafifo_buff[2] >> 24) & 1; - state_ta.fogcontrol=(tafifo_buff[2] >> 22) & 3; - state_ta.colorclamp=(tafifo_buff[2] >> 21) & 1; - state_ta.use_alpha = (tafifo_buff[2] >> 20) & 1; - state_ta.ignoretexalpha=(tafifo_buff[2] >> 19) & 1; - state_ta.flipuv=(tafifo_buff[2] >> 17) & 3; - state_ta.clampuv=(tafifo_buff[2] >> 15) & 3; - state_ta.filtermode=(tafifo_buff[2] >> 13) & 3; - state_ta.sstexture=(tafifo_buff[2] >> 12) & 1; - state_ta.mmdadjust=(tafifo_buff[2] >> 8) & 1; - state_ta.tsinstruction=(tafifo_buff[2] >> 6) & 3; + state_ta.depthcomparemode=(state->tafifo_buff[1] >> 29) & 7; + state_ta.cullingmode=(state->tafifo_buff[1] >> 27) & 3; + state_ta.zwritedisable=(state->tafifo_buff[1] >> 26) & 1; + state_ta.cachebypass=(state->tafifo_buff[1] >> 21) & 1; + state_ta.dcalcctrl=(state->tafifo_buff[1] >> 20) & 1; + state_ta.volumeinstruction=(state->tafifo_buff[1] >> 29) & 7; + + //state_ta.textureusize=1 << (3+((state->tafifo_buff[2] >> 3) & 7)); + //state_ta.texturevsize=1 << (3+(state->tafifo_buff[2] & 7)); + state_ta.texturesizes=state->tafifo_buff[2] & 0x3f; + state_ta.blend_mode = state->tafifo_buff[2] >> 26; + state_ta.srcselect=(state->tafifo_buff[2] >> 25) & 1; + state_ta.dstselect=(state->tafifo_buff[2] >> 24) & 1; + state_ta.fogcontrol=(state->tafifo_buff[2] >> 22) & 3; + state_ta.colorclamp=(state->tafifo_buff[2] >> 21) & 1; + state_ta.use_alpha = (state->tafifo_buff[2] >> 20) & 1; + state_ta.ignoretexalpha=(state->tafifo_buff[2] >> 19) & 1; + state_ta.flipuv=(state->tafifo_buff[2] >> 17) & 3; + state_ta.clampuv=(state->tafifo_buff[2] >> 15) & 3; + state_ta.filtermode=(state->tafifo_buff[2] >> 13) & 3; + state_ta.sstexture=(state->tafifo_buff[2] >> 12) & 1; + state_ta.mmdadjust=(state->tafifo_buff[2] >> 8) & 1; + state_ta.tsinstruction=(state->tafifo_buff[2] >> 6) & 3; if (state_ta.texture == 1) { - state_ta.textureaddress=(tafifo_buff[3] & 0x1FFFFF) << 3; - state_ta.scanorder=(tafifo_buff[3] >> 26) & 1; - state_ta.pixelformat=(tafifo_buff[3] >> 27) & 7; - state_ta.mipmapped=(tafifo_buff[3] >> 31) & 1; - state_ta.vqcompressed=(tafifo_buff[3] >> 30) & 1; - state_ta.strideselect=(tafifo_buff[3] >> 25) & 1; - state_ta.paletteselector=(tafifo_buff[3] >> 21) & 0x3F; + state_ta.textureaddress=(state->tafifo_buff[3] & 0x1FFFFF) << 3; + state_ta.scanorder=(state->tafifo_buff[3] >> 26) & 1; + state_ta.pixelformat=(state->tafifo_buff[3] >> 27) & 7; + state_ta.mipmapped=(state->tafifo_buff[3] >> 31) & 1; + state_ta.vqcompressed=(state->tafifo_buff[3] >> 30) & 1; + state_ta.strideselect=(state->tafifo_buff[3] >> 25) & 1; + state_ta.paletteselector=(state->tafifo_buff[3] >> 21) & 0x3F; #if DEBUG_PVRDLIST - mame_printf_verbose(" Texture at %08x format %d\n", (tafifo_buff[3] & 0x1FFFFF) << 3, state_ta.pixelformat); + mame_printf_verbose(" Texture at %08x format %d\n", (state->tafifo_buff[3] & 0x1FFFFF) << 3, state_ta.pixelformat); #endif } if (state_ta.paratype == 4) @@ -1520,9 +1535,9 @@ { #if DEBUG_PVRDLIST mame_printf_verbose(" Vertex modifier volume"); - mame_printf_verbose(" A(%f,%f,%f) B(%f,%f,%f) C(%f,%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), - u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5]), u2f(tafifo_buff[6]), u2f(tafifo_buff[7]), - u2f(tafifo_buff[8]), u2f(tafifo_buff[9])); + mame_printf_verbose(" A(%f,%f,%f) B(%f,%f,%f) C(%f,%f,%f)", u2f(state->tafifo_buff[1]), u2f(state->tafifo_buff[2]), + u2f(state->tafifo_buff[3]), u2f(state->tafifo_buff[4]), u2f(state->tafifo_buff[5]), u2f(state->tafifo_buff[6]), u2f(state->tafifo_buff[7]), + u2f(state->tafifo_buff[8]), u2f(state->tafifo_buff[9])); mame_printf_verbose("\n"); #endif } @@ -1530,9 +1545,9 @@ { #if DEBUG_PVRDLIST mame_printf_verbose(" Vertex sprite"); - mame_printf_verbose(" A(%f,%f,%f) B(%f,%f,%f) C(%f,%f,%f) D(%f,%f,)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), - u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5]), u2f(tafifo_buff[6]), u2f(tafifo_buff[7]), - u2f(tafifo_buff[8]), u2f(tafifo_buff[9]), u2f(tafifo_buff[10]), u2f(tafifo_buff[11])); + mame_printf_verbose(" A(%f,%f,%f) B(%f,%f,%f) C(%f,%f,%f) D(%f,%f,)", u2f(state->tafifo_buff[1]), u2f(state->tafifo_buff[2]), + u2f(state->tafifo_buff[3]), u2f(state->tafifo_buff[4]), u2f(state->tafifo_buff[5]), u2f(state->tafifo_buff[6]), u2f(state->tafifo_buff[7]), + u2f(state->tafifo_buff[8]), u2f(state->tafifo_buff[9]), u2f(state->tafifo_buff[10]), u2f(state->tafifo_buff[11])); mame_printf_verbose("\n"); #endif if (state_ta.texture == 1) @@ -1541,29 +1556,29 @@ { strip *ts; vert *tv = &rd->verts[rd->verts_size]; - tv[0].x = u2f(tafifo_buff[0x1]); - tv[0].y = u2f(tafifo_buff[0x2]); - tv[0].w = u2f(tafifo_buff[0x3]); - tv[1].x = u2f(tafifo_buff[0x4]); - tv[1].y = u2f(tafifo_buff[0x5]); - tv[1].w = u2f(tafifo_buff[0x6]); - tv[3].x = u2f(tafifo_buff[0x7]); - tv[3].y = u2f(tafifo_buff[0x8]); - tv[3].w = u2f(tafifo_buff[0x9]); - tv[2].x = u2f(tafifo_buff[0xa]); - tv[2].y = u2f(tafifo_buff[0xb]); + tv[0].x = u2f(state->tafifo_buff[0x1]); + tv[0].y = u2f(state->tafifo_buff[0x2]); + tv[0].w = u2f(state->tafifo_buff[0x3]); + tv[1].x = u2f(state->tafifo_buff[0x4]); + tv[1].y = u2f(state->tafifo_buff[0x5]); + tv[1].w = u2f(state->tafifo_buff[0x6]); + tv[3].x = u2f(state->tafifo_buff[0x7]); + tv[3].y = u2f(state->tafifo_buff[0x8]); + tv[3].w = u2f(state->tafifo_buff[0x9]); + tv[2].x = u2f(state->tafifo_buff[0xa]); + tv[2].y = u2f(state->tafifo_buff[0xb]); tv[2].w = tv[0].w+tv[3].w-tv[1].w; - tv[0].u = u2f(tafifo_buff[0xd] & 0xffff0000); - tv[0].v = u2f(tafifo_buff[0xd] << 16); - tv[1].u = u2f(tafifo_buff[0xe] & 0xffff0000); - tv[1].v = u2f(tafifo_buff[0xe] << 16); - tv[3].u = u2f(tafifo_buff[0xf] & 0xffff0000); - tv[3].v = u2f(tafifo_buff[0xf] << 16); + tv[0].u = u2f(state->tafifo_buff[0xd] & 0xffff0000); + tv[0].v = u2f(state->tafifo_buff[0xd] << 16); + tv[1].u = u2f(state->tafifo_buff[0xe] & 0xffff0000); + tv[1].v = u2f(state->tafifo_buff[0xe] << 16); + tv[3].u = u2f(state->tafifo_buff[0xf] & 0xffff0000); + tv[3].v = u2f(state->tafifo_buff[0xf] << 16); tv[2].u = tv[0].u+tv[3].u-tv[1].u; tv[2].v = tv[0].v+tv[3].v-tv[1].v; ts = &rd->strips[rd->strips_size++]; - tex_get_info(&ts->ti, &state_ta); + tex_get_info(machine, &ts->ti, &state_ta); ts->svert = rd->verts_size; ts->evert = rd->verts_size + 3; @@ -1575,7 +1590,7 @@ { #if DEBUG_PVRDLIST mame_printf_verbose(" Vertex polygon"); - mame_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5])); + mame_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(state->tafifo_buff[1]), u2f(state->tafifo_buff[2]), u2f(state->tafifo_buff[3]), u2f(state->tafifo_buff[4]), u2f(state->tafifo_buff[5])); mame_printf_verbose("\n"); #endif if (rd->verts_size <= 65530) @@ -1585,18 +1600,18 @@ /* -- this is also wildly inaccurate! */ vert *tv = &rd->verts[rd->verts_size]; - tv->x=u2f(tafifo_buff[1]); - tv->y=u2f(tafifo_buff[2]); - tv->w=u2f(tafifo_buff[3]); - tv->u=u2f(tafifo_buff[4]); - tv->v=u2f(tafifo_buff[5]); + tv->x=u2f(state->tafifo_buff[1]); + tv->y=u2f(state->tafifo_buff[2]); + tv->w=u2f(state->tafifo_buff[3]); + tv->u=u2f(state->tafifo_buff[4]); + tv->v=u2f(state->tafifo_buff[5]); if((!rd->strips_size) || rd->strips[rd->strips_size-1].evert != -1) { strip *ts = &rd->strips[rd->strips_size++]; - tex_get_info(&ts->ti, &state_ta); + tex_get_info(machine, &ts->ti, &state_ta); ts->svert = rd->verts_size; ts->evert = -1; } @@ -1611,13 +1626,14 @@ WRITE64_HANDLER( ta_fifo_poly_w ) { + dc_state *state = space->machine().driver_data(); if (mem_mask == U64(0xffffffffffffffff)) // 64 bit { - tafifo_buff[state_ta.tafifo_pos]=(UINT32)data; - tafifo_buff[state_ta.tafifo_pos+1]=(UINT32)(data >> 32); + state->tafifo_buff[state_ta.tafifo_pos]=(UINT32)data; + state->tafifo_buff[state_ta.tafifo_pos+1]=(UINT32)(data >> 32); #if DEBUG_FIFO_POLY - mame_printf_debug("ta_fifo_poly_w: Unmapped write64 %08x = %" I64FMT "x -> %08x %08x\n", 0x10000000+offset*8, data, tafifo_buff[state_ta.tafifo_pos], tafifo_buff[state_ta.tafifo_pos+1]); + mame_printf_debug("ta_fifo_poly_w: Unmapped write64 %08x = %" I64FMT "x -> %08x %08x\n", 0x10000000+offset*8, data, state->tafifo_buff[state_ta.tafifo_pos], state->tafifo_buff[state_ta.tafifo_pos+1]); #endif state_ta.tafifo_pos += 2; } @@ -1636,6 +1652,8 @@ WRITE64_HANDLER( ta_fifo_yuv_w ) { + //dc_state *state = space->machine().driver_data(); + // int reg; // UINT64 shift; // UINT32 dat; @@ -1693,8 +1711,9 @@ dilatechose[(b << 3) + a]=3+(a < b ? a : b); } -static void render_hline(bitmap_t *bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr) +static void render_hline(running_machine &machine,bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr) { + dc_state *state = machine.driver_data(); int xxl, xxr; float dx, ddx, dudx, dvdx, dwdx; UINT32 *tdata; @@ -1729,7 +1748,7 @@ wl += ddx*dwdx; - tdata = BITMAP_ADDR32(bitmap, y, xxl); + tdata = &bitmap.pix32(y, xxl); wbufline = &wbuffer[y][xxl]; while(xxl < xxr) { @@ -1749,16 +1768,16 @@ v = ti->sizey - v; }*/ - c = ti->r(ti, u, v); + c = ti->r(machine, ti, u, v); // debug dip to turn on/off bilinear filtering, it's slooooow - if (debug_dip_status&0x1) + if (state->debug_dip_status&0x1) { if(ti->filter_mode >= TEX_FILTER_BILINEAR) { - UINT32 c1 = ti->r(ti, u+1.0, v); - UINT32 c2 = ti->r(ti, u+1.0, v+1.0); - UINT32 c3 = ti->r(ti, u, v+1.0); + UINT32 c1 = ti->r(machine, ti, u+1.0, v); + UINT32 c2 = ti->r(machine, ti, u+1.0, v+1.0); + UINT32 c3 = ti->r(machine, ti, u, v+1.0); c = bilinear_filter(c, c1, c2, c3, u, v); } } @@ -1778,7 +1797,7 @@ } } -static void render_span(bitmap_t *bitmap, texinfo *ti, +static void render_span(running_machine &machine, bitmap_rgb32 &bitmap, texinfo *ti, float y0, float y1, float xl, float xr, float ul, float ur, @@ -1832,7 +1851,7 @@ wr += dy*dwrdy; while(yy0 < yy1) { - render_hline(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr); + render_hline(machine, bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr); xl += dxldy; xr += dxrdy; @@ -1877,7 +1896,7 @@ } -static void render_tri_sorted(bitmap_t *bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2) +static void render_tri_sorted(running_machine &machine, bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2) { float dy01, dy02, dy12; // float dy; // unused, compiler complains about this @@ -1912,47 +1931,48 @@ return; if(v1->x > v0->x) - render_span(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy); + render_span(machine, bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy); else - render_span(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy); + render_span(machine, bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy); } else if(!dy12) { if(v2->x > v1->x) - render_span(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy); + render_span(machine, bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy); else - render_span(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy); + render_span(machine, bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy); } else { if(dx01dy < dx02dy) { - render_span(bitmap, ti, v0->y, v1->y, + render_span(machine, bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy); - render_span(bitmap, ti, v1->y, v2->y, + render_span(machine, bitmap, ti, v1->y, v2->y, v1->x, v0->x + dx02dy*dy01, v1->u, v0->u + du02dy*dy01, v1->v, v0->v + dv02dy*dy01, v1->w, v0->w + dw02dy*dy01, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy); } else { - render_span(bitmap, ti, v0->y, v1->y, + render_span(machine, bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy); - render_span(bitmap, ti, v1->y, v2->y, + render_span(machine, bitmap, ti, v1->y, v2->y, v0->x + dx02dy*dy01, v1->x, v0->u + du02dy*dy01, v1->u, v0->v + dv02dy*dy01, v1->v, v0->w + dw02dy*dy01, v1->w, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy); } } } -static void render_tri(bitmap_t *bitmap, texinfo *ti, const vert *v) +static void render_tri(running_machine &machine, bitmap_rgb32 &bitmap, texinfo *ti, const vert *v) { int i0, i1, i2; sort_vertices(v, &i0, &i1, &i2); - render_tri_sorted(bitmap, ti, v+i0, v+i1, v+i2); + render_tri_sorted(machine, bitmap, ti, v+i0, v+i1, v+i2); } -static void render_to_accumulation_buffer(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect) +static void render_to_accumulation_buffer(running_machine &machine,bitmap_rgb32 &bitmap,const rectangle &cliprect) { + dc_state *state = machine.driver_data(); address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); int cs,rs,ns; UINT32 c; @@ -1969,9 +1989,9 @@ //printf("drawtest!\n"); rs=state_ta.renderselect; - c=pvrta_regs[ISP_BACKGND_T]; + c=state->pvrta_regs[ISP_BACKGND_T]; c=space->read_dword(0x05000000+((c&0xfffff8)>>1)+(3+3)*4); - bitmap_fill(bitmap,cliprect,c); + bitmap.fill(c, cliprect); ns=state_ta.grab[rs].strips_size; @@ -1996,8 +2016,8 @@ for(i=sv; i <= ev-2; i++) { - if (!(debug_dip_status&0x2)) - render_tri(bitmap, &ts->ti, state_ta.grab[rs].verts + i); + if (!(state->debug_dip_status&0x2)) + render_tri(machine, bitmap, &ts->ti, state_ta.grab[rs].verts + i); } } @@ -2025,14 +2045,16 @@ static void pvr_accumulationbuffer_to_framebuffer(address_space *space, int x,int y) { + dc_state *state = space->machine().driver_data(); + // the accumulation buffer is always 8888 // // the standard format for the framebuffer appears to be 565 // yes, this means colour data is lost in the conversion - UINT32 wc = pvrta_regs[FB_W_CTRL]; - UINT32 stride = pvrta_regs[FB_W_LINESTRIDE]; - UINT32 writeoffs = pvrta_regs[FB_W_SOF1]; + UINT32 wc = state->pvrta_regs[FB_W_CTRL]; + UINT32 stride = state->pvrta_regs[FB_W_LINESTRIDE]; + UINT32 writeoffs = state->pvrta_regs[FB_W_SOF1]; UINT32* src; @@ -2048,7 +2070,7 @@ for (ycnt=0;ycnt<32;ycnt++) { UINT32 realwriteoffs = 0x05000000 + writeoffs + (y+ycnt) * (stride<<3) + (x*2); - src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y+ycnt, x); + src = &fake_accumulationbuffer_bitmap->pix32(y+ycnt, x); for (xcnt=0;xcnt<32;xcnt++) @@ -2072,7 +2094,7 @@ for (ycnt=0;ycnt<32;ycnt++) { UINT32 realwriteoffs = 0x05000000 + writeoffs + (y+ycnt) * (stride<<3) + (x*2); - src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y+ycnt, x); + src = &fake_accumulationbuffer_bitmap->pix32(y+ycnt, x); for (xcnt=0;xcnt<32;xcnt++) @@ -2099,7 +2121,7 @@ for (ycnt=0;ycnt<32;ycnt++) { UINT32 realwriteoffs = 0x05000000 + writeoffs + (y+ycnt) * (stride<<3) + (x*2); - src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y+ycnt, x); + src = &fake_accumulationbuffer_bitmap->pix32(y+ycnt, x); for (xcnt=0;xcnt<32;xcnt++) @@ -2124,7 +2146,7 @@ for (ycnt=0;ycnt<32;ycnt++) { UINT32 realwriteoffs = 0x05000000 + writeoffs + (y+ycnt) * (stride<<3) + (x*2); - src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y+ycnt, x); + src = &fake_accumulationbuffer_bitmap->pix32(y+ycnt, x); for (xcnt=0;xcnt<32;xcnt++) @@ -2151,7 +2173,7 @@ for (ycnt=0;ycnt<32;ycnt++) { UINT32 realwriteoffs = 0x05000000 + writeoffs + (y+ycnt) * (stride<<3) + (x*2); - src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y+ycnt, x); + src = &fake_accumulationbuffer_bitmap->pix32(y+ycnt, x); for (xcnt=0;xcnt<32;xcnt++) @@ -2177,15 +2199,17 @@ } -static void pvr_drawframebuffer(bitmap_t *bitmap,const rectangle *cliprect) +static void pvr_drawframebuffer(running_machine &machine,bitmap_rgb32 &bitmap,const rectangle &cliprect) { + dc_state *state = machine.driver_data(); + int x,y,dy,xi; UINT32 addrp; UINT32 *fbaddr; UINT32 c; UINT32 r,g,b; - UINT32 wc = pvrta_regs[FB_R_CTRL]; + UINT32 wc = state->pvrta_regs[FB_R_CTRL]; UINT8 unpackmode = (wc & 0x0000000c) >>2; // aka fb_depth UINT8 enable = (wc & 0x00000001); @@ -2193,8 +2217,8 @@ if (!enable) return; // only for rgb565 framebuffer - xi=((pvrta_regs[FB_R_SIZE] & 0x3ff)+1) << 1; - dy=((pvrta_regs[FB_R_SIZE] >> 10) & 0x3ff)+1; + xi=((state->pvrta_regs[FB_R_SIZE] & 0x3ff)+1) << 1; + dy=((state->pvrta_regs[FB_R_SIZE] >> 10) & 0x3ff)+1; dy++; dy*=2; // probably depends on interlace mode, fields etc... @@ -2205,23 +2229,23 @@ // should upsample back to 8-bit output using fb_concat for (y=0;y <= dy;y++) { - addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; + addrp=state->pvrta_regs[FB_R_SOF1]+y*xi*2; if(spg_pixel_double) { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+0); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x*2+0); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x03e0) >> 2; r = (c & 0x7c00) >> 7; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+1); - if (y<=cliprect->max_y) + fbaddr=&bitmap.pix32(y, x*2+1); + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2230,14 +2254,14 @@ { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x03e0) >> 2; r = (c & 0x7c00) >> 7; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2249,24 +2273,24 @@ // should upsample back to 8-bit output using fb_concat for (y=0;y <= dy;y++) { - addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; + addrp=state->pvrta_regs[FB_R_SOF1]+y*xi*2; if(spg_pixel_double) { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+0); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x*2+0); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+1); + fbaddr=&bitmap.pix32(y, x*2+1); - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; @@ -2276,14 +2300,14 @@ { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2294,24 +2318,24 @@ case 0x02: ; // 888 RGB 24-bit - suchie3 - HACKED, see pvr_accumulationbuffer_to_framebuffer! for (y=0;y <= dy;y++) { - addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; + addrp=state->pvrta_regs[FB_R_SOF1]+y*xi*2; if(spg_pixel_double) { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+0); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x*2+0); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+1); + fbaddr=&bitmap.pix32(y, x*2+1); - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2320,14 +2344,14 @@ { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2338,23 +2362,23 @@ case 0x03: // 0888 ARGB 32-bit - HACKED, see pvr_accumulationbuffer_to_framebuffer! for (y=0;y <= dy;y++) { - addrp=pvrta_regs[FB_R_SOF1]+y*xi*2; + addrp=state->pvrta_regs[FB_R_SOF1]+y*xi*2; if(spg_pixel_double) { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+0); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x*2+0); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); - fbaddr=BITMAP_ADDR32(bitmap,y,x*2+1); - if (y<=cliprect->max_y) + fbaddr=&bitmap.pix32(y, x*2+1); + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; @@ -2364,14 +2388,14 @@ { for (x=0;x < xi;x++) { - fbaddr=BITMAP_ADDR32(bitmap,y,x); - c=*(((UINT16 *)dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); + fbaddr=&bitmap.pix32(y, x); + c=*(((UINT16 *)state->dc_framebuffer_ram) + (WORD2_XOR_LE(addrp) >> 1)); b = (c & 0x001f) << 3; g = (c & 0x07e0) >> 3; r = (c & 0xf800) >> 8; - if (y<=cliprect->max_y) + if (y<=cliprect.max_y) *fbaddr = b | (g<<8) | (r<<16); addrp+=2; } @@ -2385,16 +2409,18 @@ #if DEBUG_PALRAM static void debug_paletteram(running_machine &machine) { + dc_state *state = machine.driver_data(); + UINT64 pal; UINT32 r,g,b; int i; - //popmessage("%02x",pvrta_regs[PAL_RAM_CTRL]); + //popmessage("%02x",state->pvrta_regs[PAL_RAM_CTRL]); for(i=0;i<0x400;i++) { - pal = pvrta_regs[((0x005F9000-0x005F8000)/4)+i]; - switch(pvrta_regs[PAL_RAM_CTRL]) + pal = state->pvrta_regs[((0x005F9000-0x005F8000)/4)+i]; + switch(state->pvrta_regs[PAL_RAM_CTRL]) { case 0: //argb1555 <- guilty gear uses this mode { @@ -2472,98 +2498,109 @@ static TIMER_CALLBACK(vbin) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_IN; // V Blank-in interrupt + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_IN; // V Blank-in interrupt dc_update_interrupt_status(machine); - vbin_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); + state->vbin_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); } static TIMER_CALLBACK(vbout) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_OUT; // V Blank-out interrupt + dc_state *state = machine.driver_data(); + + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_OUT; // V Blank-out interrupt dc_update_interrupt_status(machine); - vbout_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); + state->vbout_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); } static TIMER_CALLBACK(hbin) { + dc_state *state = machine.driver_data(); + if(spg_hblank_int_mode & 1) { - if(scanline == next_y) + if(state->scanline == state->next_y) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt dc_update_interrupt_status(machine); - next_y+=spg_line_comp_val; + state->next_y+=spg_line_comp_val; } } - else if((scanline == spg_line_comp_val) || (spg_hblank_int_mode & 2)) + else if((state->scanline == spg_line_comp_val) || (spg_hblank_int_mode & 2)) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt dc_update_interrupt_status(machine); } -// printf("hbin on scanline %d\n",scanline); +// printf("hbin on state->scanline %d\n",state->scanline); - scanline++; + state->scanline++; - if(scanline >= spg_vblank_in_irq_line_num) + if(state->scanline >= spg_vblank_in_irq_line_num) { - scanline = 0; - next_y = spg_line_comp_val; + state->scanline = 0; + state->next_y = spg_line_comp_val; } - hbin_timer->adjust(machine.primary_screen->time_until_pos(scanline, spg_hblank_in_irq-1)); + state->hbin_timer->adjust(machine.primary_screen->time_until_pos(state->scanline, spg_hblank_in_irq-1)); } static TIMER_CALLBACK(endofrender_video) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_VIDEO;// VIDEO end of render + dc_state *state = machine.driver_data(); + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_VIDEO;// VIDEO end of render dc_update_interrupt_status(machine); - endofrender_timer_video->adjust(attotime::never); + state->endofrender_timer_video->adjust(attotime::never); } static TIMER_CALLBACK(endofrender_tsp) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_TSP; // TSP end of render + dc_state *state = machine.driver_data(); + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_TSP; // TSP end of render dc_update_interrupt_status(machine); - endofrender_timer_tsp->adjust(attotime::never); - endofrender_timer_video->adjust(attotime::from_usec(500) ); + state->endofrender_timer_tsp->adjust(attotime::never); + state->endofrender_timer_video->adjust(attotime::from_usec(500) ); } static TIMER_CALLBACK(endofrender_isp) { - dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_ISP; // ISP end of render + dc_state *state = machine.driver_data(); + state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_ISP; // ISP end of render dc_update_interrupt_status(machine); - endofrender_timer_isp->adjust(attotime::never); - endofrender_timer_tsp->adjust(attotime::from_usec(500) ); + state->endofrender_timer_isp->adjust(attotime::never); + state->endofrender_timer_tsp->adjust(attotime::from_usec(500) ); } VIDEO_START(dc) { - memset(pvrctrl_regs, 0, sizeof(pvrctrl_regs)); - memset(pvrta_regs, 0, sizeof(pvrta_regs)); + dc_state *state = machine.driver_data(); + + memset(state->pvrctrl_regs, 0, sizeof(state->pvrctrl_regs)); + memset(state->pvrta_regs, 0, sizeof(state->pvrta_regs)); memset(state_ta.grab, 0, sizeof(state_ta.grab)); pvr_build_parameterconfig(); // if the next 2 registers do not have the correct values, the naomi bios will hang - pvrta_regs[PVRID]=0x17fd11db; - pvrta_regs[REVISION]=0x11; + state->pvrta_regs[PVRID]=0x17fd11db; + state->pvrta_regs[REVISION]=0x11; /* FIXME: move the following regs inside MACHINE_RESET */ - pvrta_regs[VO_CONTROL]= 0x00000108; - pvrta_regs[SOFTRESET]= 0x00000007; - pvrta_regs[VO_STARTX]= 0x0000009d; - pvrta_regs[VO_STARTY]= 0x00150015; - pvrta_regs[SPG_HBLANK]= 0x007e0345; - pvrta_regs[SPG_LOAD]= 0x01060359; - pvrta_regs[SPG_VBLANK]= 0x01500104; - pvrta_regs[SPG_HBLANK_INT]= 0x031d0000; - pvrta_regs[SPG_VBLANK_INT]= 0x01500104; + state->pvrta_regs[VO_CONTROL]= 0x00000108; + state->pvrta_regs[SOFTRESET]= 0x00000007; + state->pvrta_regs[VO_STARTX]= 0x0000009d; + state->pvrta_regs[VO_STARTY]= 0x00150015; + state->pvrta_regs[SPG_HBLANK]= 0x007e0345; + state->pvrta_regs[SPG_LOAD]= 0x01060359; + state->pvrta_regs[SPG_VBLANK]= 0x01500104; + state->pvrta_regs[SPG_HBLANK_INT]= 0x031d0000; + state->pvrta_regs[SPG_VBLANK_INT]= 0x01500104; state_ta.tafifo_pos=0; state_ta.tafifo_mask=7; @@ -2575,32 +2612,34 @@ computedilated(); - vbout_timer = machine.scheduler().timer_alloc(FUNC(vbout)); - vbout_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); + state->vbout_timer = machine.scheduler().timer_alloc(FUNC(vbout)); + state->vbout_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); - vbin_timer = machine.scheduler().timer_alloc(FUNC(vbin)); - vbin_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); + state->vbin_timer = machine.scheduler().timer_alloc(FUNC(vbin)); + state->vbin_timer->adjust(machine.primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); - hbin_timer = machine.scheduler().timer_alloc(FUNC(hbin)); - hbin_timer->adjust(machine.primary_screen->time_until_pos(0, spg_hblank_in_irq-1)); + state->hbin_timer = machine.scheduler().timer_alloc(FUNC(hbin)); + state->hbin_timer->adjust(machine.primary_screen->time_until_pos(0, spg_hblank_in_irq-1)); - scanline = 0; - next_y = 0; + state->scanline = 0; + state->next_y = 0; - endofrender_timer_isp = machine.scheduler().timer_alloc(FUNC(endofrender_isp)); - endofrender_timer_tsp = machine.scheduler().timer_alloc(FUNC(endofrender_tsp)); - endofrender_timer_video = machine.scheduler().timer_alloc(FUNC(endofrender_video)); + state->endofrender_timer_isp = machine.scheduler().timer_alloc(FUNC(endofrender_isp)); + state->endofrender_timer_tsp = machine.scheduler().timer_alloc(FUNC(endofrender_tsp)); + state->endofrender_timer_video = machine.scheduler().timer_alloc(FUNC(endofrender_video)); - endofrender_timer_isp->adjust(attotime::never); - endofrender_timer_tsp->adjust(attotime::never); - endofrender_timer_video->adjust(attotime::never); + state->endofrender_timer_isp->adjust(attotime::never); + state->endofrender_timer_tsp->adjust(attotime::never); + state->endofrender_timer_video->adjust(attotime::never); - fake_accumulationbuffer_bitmap = auto_bitmap_alloc(machine,1024,1024,BITMAP_FORMAT_RGB32); + fake_accumulationbuffer_bitmap = auto_bitmap_rgb32_alloc(machine,1024,1024); } -SCREEN_UPDATE(dc) +SCREEN_UPDATE_RGB32(dc) { + dc_state *state = screen.machine().driver_data(); + /****************** MAME note ******************* @@ -2615,12 +2654,11 @@ ******************/ // static int useframebuffer=1; -// const rectangle &visarea = screen->visible_area(); +// const rectangle &visarea = screen.visible_area(); // int y,x; - //printf("videoupdate\n"); #if DEBUG_PALRAM - debug_paletteram(screen->machine()); + debug_paletteram(screen.machine()); #endif // copy our fake framebuffer bitmap (where things have been rendered) to the screen @@ -2629,20 +2667,20 @@ { for (x = visarea->min_x ; x <= visarea->max_x ; x++) { - UINT32* src = BITMAP_ADDR32(fake_accumulationbuffer_bitmap, y, x); - UINT32* dst = BITMAP_ADDR32(bitmap, y, x); + UINT32* src = &fake_accumulationbuffer_bitmap->pix32(y, x); + UINT32* dst = &bitmap.pix32(y, x); dst[0] = src[0]; } } #endif - bitmap_fill(bitmap,cliprect,MAKE_ARGB(0xff,vo_border_R,vo_border_G,vo_border_B)); //FIXME: Chroma bit? + bitmap.fill(MAKE_ARGB(0xff,vo_border_R,vo_border_G,vo_border_B), cliprect); //FIXME: Chroma bit? if(!spg_blank_video) - pvr_drawframebuffer(bitmap,cliprect); + pvr_drawframebuffer(screen.machine(),bitmap,cliprect); // update this here so we only do string lookup once per frame - debug_dip_status = input_port_read(screen->machine(), "MAMEDEBUG"); + state->debug_dip_status = input_port_read(screen.machine(), "MAMEDEBUG"); return 0; } diff -Nru mame-0.144/src/mame/video/dcheese.c mame-0.145/src/mame/video/dcheese.c --- mame-0.144/src/mame/video/dcheese.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dcheese.c 2012-02-06 21:30:32.000000000 +0000 @@ -95,7 +95,7 @@ dcheese_state *state = machine.driver_data(); /* the destination bitmap is not directly accessible to the CPU */ - state->m_dstbitmap = auto_bitmap_alloc(machine, DSTBITMAP_WIDTH, DSTBITMAP_HEIGHT, machine.primary_screen->format()); + state->m_dstbitmap = auto_bitmap_ind16_alloc(machine, DSTBITMAP_WIDTH, DSTBITMAP_HEIGHT); /* create a timer */ state->m_blitter_timer = machine.scheduler().timer_alloc(FUNC(blitter_scanline_callback)); @@ -116,18 +116,18 @@ * *************************************/ -SCREEN_UPDATE( dcheese ) +SCREEN_UPDATE_IND16( dcheese ) { - dcheese_state *state = screen->machine().driver_data(); + dcheese_state *state = screen.machine().driver_data(); int x, y; /* update the pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT16 *src = BITMAP_ADDR16(state->m_dstbitmap, (y + state->m_blitter_vidparam[0x28/2]) % DSTBITMAP_HEIGHT, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT16 *src = &state->m_dstbitmap->pix16((y + state->m_blitter_vidparam[0x28/2]) % DSTBITMAP_HEIGHT); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dest[x] = src[x]; } return 0; @@ -148,7 +148,7 @@ /* clear the requested scanlines */ for (y = state->m_blitter_vidparam[0x2c/2]; y < state->m_blitter_vidparam[0x2a/2]; y++) - memset(BITMAP_ADDR16(state->m_dstbitmap, y % DSTBITMAP_HEIGHT, 0), 0, DSTBITMAP_WIDTH * 2); + memset(&state->m_dstbitmap->pix16(y % DSTBITMAP_HEIGHT), 0, DSTBITMAP_WIDTH * 2); /* signal an IRQ when done (timing is just a guess) */ machine.scheduler().timer_set(machine.primary_screen->scan_period(), FUNC(dcheese_signal_irq_callback), 1); @@ -182,7 +182,7 @@ /* loop over target rows */ for (y = ystart; y <= yend; y++) { - UINT16 *dst = BITMAP_ADDR16(state->m_dstbitmap, y % DSTBITMAP_HEIGHT, 0); + UINT16 *dst = &state->m_dstbitmap->pix16(y % DSTBITMAP_HEIGHT); /* loop over target columns */ for (x = xstart; x <= xend; x++) diff -Nru mame-0.144/src/mame/video/dcon.c mame-0.145/src/mame/video/dcon.c --- mame-0.144/src/mame/video/dcon.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dcon.c 2012-02-06 21:30:32.000000000 +0000 @@ -23,19 +23,19 @@ { state->m_enable=data; if ((state->m_enable&4)==4) - tilemap_set_enable(state->m_foreground_layer,0); + state->m_foreground_layer->enable(0); else - tilemap_set_enable(state->m_foreground_layer,1); + state->m_foreground_layer->enable(1); if ((state->m_enable&2)==2) - tilemap_set_enable(state->m_midground_layer,0); + state->m_midground_layer->enable(0); else - tilemap_set_enable(state->m_midground_layer,1); + state->m_midground_layer->enable(1); if ((state->m_enable&1)==1) - tilemap_set_enable(state->m_background_layer,0); + state->m_background_layer->enable(0); else - tilemap_set_enable(state->m_background_layer,1); + state->m_background_layer->enable(1); } } @@ -52,28 +52,28 @@ { dcon_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_back_data[offset]); - tilemap_mark_tile_dirty(state->m_background_layer,offset); + state->m_background_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( dcon_foreground_w ) { dcon_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fore_data[offset]); - tilemap_mark_tile_dirty(state->m_foreground_layer,offset); + state->m_foreground_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( dcon_midground_w ) { dcon_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid_data[offset]); - tilemap_mark_tile_dirty(state->m_midground_layer,offset); + state->m_midground_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( dcon_text_w ) { dcon_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_textram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer,offset); + state->m_text_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_back_tile_info ) @@ -144,14 +144,14 @@ state->m_midground_layer = tilemap_create(machine, get_mid_tile_info, tilemap_scan_rows,16,16,32,32); state->m_text_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8,8,64,32); - tilemap_set_transparent_pen(state->m_midground_layer,15); - tilemap_set_transparent_pen(state->m_foreground_layer,15); - tilemap_set_transparent_pen(state->m_text_layer,15); + state->m_midground_layer->set_transparent_pen(15); + state->m_foreground_layer->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); state->m_gfx_bank_select = 0; } -static void draw_sprites(running_machine& machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine& machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { dcon_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -277,64 +277,64 @@ } } -SCREEN_UPDATE( dcon ) +SCREEN_UPDATE_IND16( dcon ) { - dcon_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + dcon_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); /* Setup the tilemaps */ - tilemap_set_scrollx( state->m_background_layer,0, state->m_scroll_ram[0] ); - tilemap_set_scrolly( state->m_background_layer,0, state->m_scroll_ram[1] ); - tilemap_set_scrollx( state->m_midground_layer, 0, state->m_scroll_ram[2] ); - tilemap_set_scrolly( state->m_midground_layer, 0, state->m_scroll_ram[3] ); - tilemap_set_scrollx( state->m_foreground_layer,0, state->m_scroll_ram[4] ); - tilemap_set_scrolly( state->m_foreground_layer,0, state->m_scroll_ram[5] ); + state->m_background_layer->set_scrollx(0, state->m_scroll_ram[0] ); + state->m_background_layer->set_scrolly(0, state->m_scroll_ram[1] ); + state->m_midground_layer->set_scrollx(0, state->m_scroll_ram[2] ); + state->m_midground_layer->set_scrolly(0, state->m_scroll_ram[3] ); + state->m_foreground_layer->set_scrollx(0, state->m_scroll_ram[4] ); + state->m_foreground_layer->set_scrolly(0, state->m_scroll_ram[5] ); if ((state->m_enable&1)!=1) - tilemap_draw(bitmap,cliprect,state->m_background_layer,0,0); + state->m_background_layer->draw(bitmap, cliprect, 0,0); else - bitmap_fill(bitmap,cliprect,15); /* Should always be black, not pen 15 */ + bitmap.fill(15, cliprect); /* Should always be black, not pen 15 */ - tilemap_draw(bitmap,cliprect,state->m_midground_layer,0,1); - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,2); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,4); + state->m_midground_layer->draw(bitmap, cliprect, 0,1); + state->m_foreground_layer->draw(bitmap, cliprect, 0,2); + state->m_text_layer->draw(bitmap, cliprect, 0,4); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( sdgndmps ) +SCREEN_UPDATE_IND16( sdgndmps ) { - dcon_state *state = screen->machine().driver_data(); + dcon_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Gfx banking */ if (state->m_last_gfx_bank!=state->m_gfx_bank_select) { - tilemap_mark_all_tiles_dirty(state->m_midground_layer); + state->m_midground_layer->mark_all_dirty(); state->m_last_gfx_bank=state->m_gfx_bank_select; } /* Setup the tilemaps */ - tilemap_set_scrollx( state->m_background_layer,0, state->m_scroll_ram[0]+128 ); - tilemap_set_scrolly( state->m_background_layer,0, state->m_scroll_ram[1] ); - tilemap_set_scrollx( state->m_midground_layer, 0, state->m_scroll_ram[2]+128 ); - tilemap_set_scrolly( state->m_midground_layer, 0, state->m_scroll_ram[3] ); - tilemap_set_scrollx( state->m_foreground_layer,0, state->m_scroll_ram[4]+128 ); - tilemap_set_scrolly( state->m_foreground_layer,0, state->m_scroll_ram[5] ); - tilemap_set_scrollx( state->m_text_layer,0, /*state->m_scroll_ram[6] + */ 128 ); - tilemap_set_scrolly( state->m_text_layer,0, /*state->m_scroll_ram[7] + */ 0 ); + state->m_background_layer->set_scrollx(0, state->m_scroll_ram[0]+128 ); + state->m_background_layer->set_scrolly(0, state->m_scroll_ram[1] ); + state->m_midground_layer->set_scrollx(0, state->m_scroll_ram[2]+128 ); + state->m_midground_layer->set_scrolly(0, state->m_scroll_ram[3] ); + state->m_foreground_layer->set_scrollx(0, state->m_scroll_ram[4]+128 ); + state->m_foreground_layer->set_scrolly(0, state->m_scroll_ram[5] ); + state->m_text_layer->set_scrollx(0, /*state->m_scroll_ram[6] + */ 128 ); + state->m_text_layer->set_scrolly(0, /*state->m_scroll_ram[7] + */ 0 ); if ((state->m_enable&1)!=1) - tilemap_draw(bitmap,cliprect,state->m_background_layer,0,0); + state->m_background_layer->draw(bitmap, cliprect, 0,0); else - bitmap_fill(bitmap,cliprect,15); /* Should always be black, not pen 15 */ + bitmap.fill(15, cliprect); /* Should always be black, not pen 15 */ - tilemap_draw(bitmap,cliprect,state->m_midground_layer,0,1); - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,2); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,4); + state->m_midground_layer->draw(bitmap, cliprect, 0,1); + state->m_foreground_layer->draw(bitmap, cliprect, 0,2); + state->m_text_layer->draw(bitmap, cliprect, 0,4); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/dday.c mame-0.145/src/mame/video/dday.c --- mame-0.144/src/mame/video/dday.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dday.c 2012-02-06 21:30:32.000000000 +0000 @@ -219,11 +219,11 @@ state->m_text_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_sl_tilemap = tilemap_create(machine, get_sl_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - state->m_main_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_main_bitmap); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0x00f0, 0xff0f); /* pens 0-3 have priority over the foreground layer */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); + state->m_bg_tilemap->set_transmask(0, 0x00f0, 0xff0f); /* pens 0-3 have priority over the foreground layer */ + state->m_fg_tilemap->set_transparent_pen(0); + state->m_text_tilemap->set_transparent_pen(0); start_countdown_timer(machine); } @@ -233,7 +233,7 @@ dday_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( dday_fgvideoram_w ) @@ -241,8 +241,8 @@ dday_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset ^ 0x1f); /* for flipx case */ + state->m_fg_tilemap->mark_tile_dirty(offset); + state->m_fg_tilemap->mark_tile_dirty(offset ^ 0x1f); /* for flipx case */ } WRITE8_HANDLER( dday_textvideoram_w ) @@ -250,7 +250,7 @@ dday_state *state = space->machine().driver_data(); state->m_textvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_text_tilemap, offset); + state->m_text_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( dday_colorram_w ) @@ -263,7 +263,7 @@ state->m_colorram[offset & 0x3e0] = data; for (i = 0; i < 0x20; i++) - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset + i); + state->m_fg_tilemap->mark_tile_dirty(offset + i); } READ8_HANDLER( dday_colorram_r ) @@ -280,7 +280,7 @@ if (state->m_sl_image != data) { state->m_sl_image = data; - tilemap_mark_all_tiles_dirty(state->m_sl_tilemap); + state->m_sl_tilemap->mark_all_dirty(); } } @@ -315,31 +315,31 @@ ***************************************************************************/ -SCREEN_UPDATE( dday ) +SCREEN_UPDATE_IND16( dday ) { - dday_state *state = screen->machine().driver_data(); + dday_state *state = screen.machine().driver_data(); - tilemap_draw(state->m_main_bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(state->m_main_bitmap, cliprect, state->m_fg_tilemap, 0, 0); - tilemap_draw(state->m_main_bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(state->m_main_bitmap, cliprect, state->m_text_tilemap, 0, 0); + state->m_bg_tilemap->draw(state->m_main_bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_fg_tilemap->draw(state->m_main_bitmap, cliprect, 0, 0); + state->m_bg_tilemap->draw(state->m_main_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_text_tilemap->draw(state->m_main_bitmap, cliprect, 0, 0); if (state->m_sl_enable) { /* apply shadow */ int x, y; - bitmap_t *sl_bitmap = tilemap_get_pixmap(state->m_sl_tilemap); + bitmap_ind16 &sl_bitmap = state->m_sl_tilemap->pixmap(); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 src_pixel = *BITMAP_ADDR16(state->m_main_bitmap, y, x); + UINT16 src_pixel = state->m_main_bitmap.pix16(y, x); - if (*BITMAP_ADDR16(sl_bitmap, y, x) == 0xff) - src_pixel += screen->machine().total_colors(); + if (sl_bitmap.pix16(y, x) == 0xff) + src_pixel += screen.machine().total_colors(); - *BITMAP_ADDR16(bitmap, y, x) = src_pixel; + bitmap.pix16(y, x) = src_pixel; } } else diff -Nru mame-0.144/src/mame/video/ddragon3.c mame-0.145/src/mame/video/ddragon3.c --- mame-0.144/src/mame/video/ddragon3.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ddragon3.c 2012-02-06 21:30:31.000000000 +0000 @@ -22,7 +22,7 @@ case 6: COMBINE_DATA(&state->m_bg_tilebase); // BG Tile Base state->m_bg_tilebase &= 0x1ff; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); break; } } @@ -48,14 +48,14 @@ { ddragon3_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( ddragon3_fg_videoram_w ) { ddragon3_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_bg_tile_info ) @@ -87,8 +87,8 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); } /* @@ -116,7 +116,7 @@ * 6,7| unused */ -static void draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ddragon3_state *state = machine.driver_data(); UINT16 *source = state->m_spriteram; @@ -162,56 +162,56 @@ } } -SCREEN_UPDATE( ddragon3 ) +SCREEN_UPDATE_IND16( ddragon3 ) { - ddragon3_state *state = screen->machine().driver_data(); + ddragon3_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); + state->m_fg_tilemap->set_scrollx(0, state->m_fg_scrollx); + state->m_fg_tilemap->set_scrolly(0, state->m_fg_scrolly); if ((state->m_vreg & 0x60) == 0x40) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); } else if ((state->m_vreg & 0x60) == 0x60) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( ctribe ) +SCREEN_UPDATE_IND16( ctribe ) { - ddragon3_state *state = screen->machine().driver_data(); + ddragon3_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); + state->m_fg_tilemap->set_scrollx(0, state->m_fg_scrollx); + state->m_fg_tilemap->set_scrolly(0, state->m_fg_scrolly); if(state->m_vreg & 8) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); } return 0; } diff -Nru mame-0.144/src/mame/video/ddragon.c mame-0.145/src/mame/video/ddragon.c --- mame-0.144/src/mame/video/ddragon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ddragon.c 2012-02-06 21:30:32.000000000 +0000 @@ -103,11 +103,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, background_scan, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, 384 - 256); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 384 - 256); - tilemap_set_scrolldy(state->m_fg_tilemap, -8, -8); - tilemap_set_scrolldy(state->m_bg_tilemap, -8, -8); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrolldx(0, 384 - 256); + state->m_bg_tilemap->set_scrolldx(0, 384 - 256); + state->m_fg_tilemap->set_scrolldy(-8, -8); + state->m_bg_tilemap->set_scrolldy(-8, -8); } VIDEO_START( chinagat ) @@ -117,9 +117,9 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,background_scan, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_16color_tile_info,tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldy(state->m_fg_tilemap, -8, -8); - tilemap_set_scrolldy(state->m_bg_tilemap, -8, -8); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrolldy(-8, -8); + state->m_bg_tilemap->set_scrolldy(-8, -8); } @@ -133,14 +133,14 @@ { ddragon_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( ddragon_fgvideoram_w ) { ddragon_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } @@ -154,7 +154,7 @@ cliprect,gfx, \ (which + order),color,flipx,flipy,sx,sy,0); -static void draw_sprites( running_machine& machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine& machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { ddragon_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -240,18 +240,18 @@ #undef DRAW_SPRITE -SCREEN_UPDATE( ddragon ) +SCREEN_UPDATE_IND16( ddragon ) { - ddragon_state *state = screen->machine().driver_data(); + ddragon_state *state = screen.machine().driver_data(); int scrollx = (state->m_scrollx_hi << 8) | *state->m_scrollx_lo; int scrolly = (state->m_scrolly_hi << 8) | *state->m_scrolly_lo; - tilemap_set_scrollx(state->m_bg_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, scrolly); + state->m_bg_tilemap->set_scrollx(0, scrollx); + state->m_bg_tilemap->set_scrolly(0, scrolly); - tilemap_draw(bitmap,cliprect, state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ddribble.c mame-0.145/src/mame/video/ddribble.c --- mame-0.144/src/mame/video/ddribble.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ddribble.c 2012-02-06 21:30:31.000000000 +0000 @@ -53,7 +53,7 @@ if ((data & 0x03) != state->m_charbank[0]) { state->m_charbank[0] = data & 0x03; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } break; case 0x04: /* IRQ control, flipscreen */ @@ -72,7 +72,7 @@ if ((data & 0x03) != state->m_charbank[1]) { state->m_charbank[1] = data & 0x03; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } break; case 0x04: /* IRQ control, flipscreen */ @@ -131,7 +131,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } /*************************************************************************** @@ -144,14 +144,14 @@ { ddribble_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0xbff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0xbff); } WRITE8_HANDLER( ddribble_bg_videoram_w ) { ddribble_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0xbff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0xbff); } /*************************************************************************** @@ -176,7 +176,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* source, int lenght, int gfxset, int flipscreen ) +static void draw_sprites( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* source, int lenght, int gfxset, int flipscreen ) { gfx_element *gfx = machine.gfx[gfxset]; const UINT8 *finish = source + lenght; @@ -250,23 +250,23 @@ ***************************************************************************/ -SCREEN_UPDATE( ddribble ) +SCREEN_UPDATE_IND16( ddribble ) { - ddribble_state *state = screen->machine().driver_data(); - set_pens(screen->machine()); + ddribble_state *state = screen.machine().driver_data(); + set_pens(screen.machine()); - tilemap_set_flip(state->m_fg_tilemap, (state->m_vregs[0][4] & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(state->m_bg_tilemap, (state->m_vregs[1][4] & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_fg_tilemap->set_flip((state->m_vregs[0][4] & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip((state->m_vregs[1][4] & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* set scroll registers */ - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_vregs[0][1] | ((state->m_vregs[0][2] & 0x01) << 8)); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_vregs[1][1] | ((state->m_vregs[1][2] & 0x01) << 8)); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_vregs[0][0]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_vregs[1][0]); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_1, 0x07d, 2, state->m_vregs[0][4] & 0x08); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram_2, 0x140, 3, state->m_vregs[1][4] & 0x08); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrollx(0, state->m_vregs[0][1] | ((state->m_vregs[0][2] & 0x01) << 8)); + state->m_bg_tilemap->set_scrollx(0, state->m_vregs[1][1] | ((state->m_vregs[1][2] & 0x01) << 8)); + state->m_fg_tilemap->set_scrolly(0, state->m_vregs[0][0]); + state->m_bg_tilemap->set_scrolly(0, state->m_vregs[1][0]); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram_1, 0x07d, 2, state->m_vregs[0][4] & 0x08); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram_2, 0x140, 3, state->m_vregs[1][4] & 0x08); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/deadang.c mame-0.145/src/mame/video/deadang.c --- mame-0.144/src/mame/video/deadang.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/deadang.c 2012-02-06 21:30:33.000000000 +0000 @@ -8,7 +8,7 @@ { deadang_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_video_data[offset]); - tilemap_mark_tile_dirty( state->m_pf1_layer, offset ); + state->m_pf1_layer->mark_tile_dirty(offset ); } WRITE16_HANDLER( deadang_text_w ) @@ -16,7 +16,7 @@ deadang_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty( state->m_text_layer, offset ); + state->m_text_layer->mark_tile_dirty(offset ); } WRITE16_HANDLER( deadang_bank_w ) @@ -28,7 +28,7 @@ if (state->m_deadangle_tilebank!=state->m_deadangle_oldtilebank) { state->m_deadangle_oldtilebank = state->m_deadangle_tilebank; - tilemap_mark_all_tiles_dirty (state->m_pf1_layer); + state->m_pf1_layer->mark_all_dirty(); } } } @@ -82,12 +82,12 @@ state->m_pf1_layer = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_cols,16,16, 32, 32); state->m_text_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_pf2_layer, 15); - tilemap_set_transparent_pen(state->m_pf1_layer, 15); - tilemap_set_transparent_pen(state->m_text_layer, 15); + state->m_pf2_layer->set_transparent_pen(15); + state->m_pf1_layer->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { deadang_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -130,16 +130,16 @@ } } -SCREEN_UPDATE( deadang ) +SCREEN_UPDATE_IND16( deadang ) { - deadang_state *state = screen->machine().driver_data(); + deadang_state *state = screen.machine().driver_data(); /* Setup the tilemaps */ - tilemap_set_scrolly( state->m_pf3_layer,0, ((state->m_scroll_ram[0x01]&0xf0)<<4)+((state->m_scroll_ram[0x02]&0x7f)<<1)+((state->m_scroll_ram[0x02]&0x80)>>7) ); - tilemap_set_scrollx( state->m_pf3_layer,0, ((state->m_scroll_ram[0x09]&0xf0)<<4)+((state->m_scroll_ram[0x0a]&0x7f)<<1)+((state->m_scroll_ram[0x0a]&0x80)>>7) ); - tilemap_set_scrolly( state->m_pf1_layer,0, ((state->m_scroll_ram[0x11]&0x10)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); - tilemap_set_scrollx( state->m_pf1_layer,0, ((state->m_scroll_ram[0x19]&0x10)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); - tilemap_set_scrolly( state->m_pf2_layer,0, ((state->m_scroll_ram[0x21]&0xf0)<<4)+((state->m_scroll_ram[0x22]&0x7f)<<1)+((state->m_scroll_ram[0x22]&0x80)>>7) ); - tilemap_set_scrollx( state->m_pf2_layer,0, ((state->m_scroll_ram[0x29]&0xf0)<<4)+((state->m_scroll_ram[0x2a]&0x7f)<<1)+((state->m_scroll_ram[0x2a]&0x80)>>7) ); + state->m_pf3_layer->set_scrolly(0, ((state->m_scroll_ram[0x01]&0xf0)<<4)+((state->m_scroll_ram[0x02]&0x7f)<<1)+((state->m_scroll_ram[0x02]&0x80)>>7) ); + state->m_pf3_layer->set_scrollx(0, ((state->m_scroll_ram[0x09]&0xf0)<<4)+((state->m_scroll_ram[0x0a]&0x7f)<<1)+((state->m_scroll_ram[0x0a]&0x80)>>7) ); + state->m_pf1_layer->set_scrolly(0, ((state->m_scroll_ram[0x11]&0x10)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); + state->m_pf1_layer->set_scrollx(0, ((state->m_scroll_ram[0x19]&0x10)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); + state->m_pf2_layer->set_scrolly(0, ((state->m_scroll_ram[0x21]&0xf0)<<4)+((state->m_scroll_ram[0x22]&0x7f)<<1)+((state->m_scroll_ram[0x22]&0x80)>>7) ); + state->m_pf2_layer->set_scrollx(0, ((state->m_scroll_ram[0x29]&0xf0)<<4)+((state->m_scroll_ram[0x2a]&0x7f)<<1)+((state->m_scroll_ram[0x2a]&0x80)>>7) ); /* Control byte: 0x01: Background playfield disable @@ -151,17 +151,17 @@ 0x40: Flipscreen 0x80: Always set? */ - tilemap_set_enable(state->m_pf3_layer,!(state->m_scroll_ram[0x34]&1)); - tilemap_set_enable(state->m_pf1_layer,!(state->m_scroll_ram[0x34]&2)); - tilemap_set_enable(state->m_pf2_layer,!(state->m_scroll_ram[0x34]&4)); - flip_screen_set(screen->machine(), state->m_scroll_ram[0x34]&0x40 ); - - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_pf3_layer,0,1); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,0,2); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,0,4); - if (!(state->m_scroll_ram[0x34]&0x10)) draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,0); + state->m_pf3_layer->enable(!(state->m_scroll_ram[0x34]&1)); + state->m_pf1_layer->enable(!(state->m_scroll_ram[0x34]&2)); + state->m_pf2_layer->enable(!(state->m_scroll_ram[0x34]&4)); + flip_screen_set(screen.machine(), state->m_scroll_ram[0x34]&0x40 ); + + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + state->m_pf3_layer->draw(bitmap, cliprect, 0,1); + state->m_pf1_layer->draw(bitmap, cliprect, 0,2); + state->m_pf2_layer->draw(bitmap, cliprect, 0,4); + if (!(state->m_scroll_ram[0x34]&0x10)) draw_sprites(screen.machine(),bitmap,cliprect); + state->m_text_layer->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/dec0.c mame-0.145/src/mame/video/dec0.c --- mame-0.144/src/mame/video/dec0.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dec0.c 2012-02-06 21:30:32.000000000 +0000 @@ -45,70 +45,70 @@ /******************************************************************************/ -SCREEN_UPDATE( hbarrel ) +SCREEN_UPDATE_IND16( hbarrel ) { - dec0_state *state = screen->machine().driver_data(); + dec0_state *state = screen.machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, 0x08, 0x0f); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, 0x08, 0x0f); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); /* HB always keeps pf2 on top of pf3, no need explicitly support priority register */ - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, 0x00, 0x0f); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( baddudes ) +SCREEN_UPDATE_IND16( baddudes ) { - dec0_state *state = screen->machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + dec0_state *state = screen.machine().driver_data(); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); /* WARNING: inverted wrt Midnight Resistance */ if ((state->m_pri & 0x01) == 0) { - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 2) - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); if (state->m_pri & 4) - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ } else { - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 2) - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); if (state->m_pri & 4) - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles /* Foreground pens only */ } - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( robocop ) +SCREEN_UPDATE_IND16( robocop ) { - dec0_state *state = screen->machine().driver_data(); + dec0_state *state = screen.machine().driver_data(); int trans; - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); if (state->m_pri & 0x04) trans = 0x08; @@ -121,100 +121,100 @@ /* Robocop uses it only for the title screen, so this might be just */ /* completely wrong. The top 8 bits of the register might mean */ /* something (they are 0x80 in midres, 0x00 here) */ - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans^0x08, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans^0x08, 0x0f); else - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( birdtry ) +SCREEN_UPDATE_IND16( birdtry ) { - dec0_state *state = screen->machine().driver_data(); + dec0_state *state = screen.machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); /* This game doesn't have the extra playfield chip on the game board, but the palette does show through. */ - bitmap_fill(bitmap,cliprect,screen->machine().pens[768]); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + bitmap.fill(screen.machine().pens[768], cliprect); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( hippodrm ) +SCREEN_UPDATE_IND16( hippodrm ) { - dec0_state *state = screen->machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + dec0_state *state = screen.machine().driver_data(); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); if (state->m_pri & 0x01) { - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( slyspy ) +SCREEN_UPDATE_IND16( slyspy ) { - dec0_state *state = screen->machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + dec0_state *state = screen.machine().driver_data(); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); /* Redraw top 8 pens of top 8 palettes over sprites */ if (state->m_pri&0x80) - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0,0x08,0x08,0x08,0x08); // upper 8 pens of upper 8 priority marked tiles - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } /******************************************************************************/ -SCREEN_UPDATE( midres ) +SCREEN_UPDATE_IND16( midres ) { - dec0_state *state = screen->machine().driver_data(); + dec0_state *state = screen.machine().driver_data(); int trans; - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); if (state->m_pri & 0x04) trans = 0x00; @@ -222,29 +222,29 @@ if (state->m_pri & 0x01) { - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } else { - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans, 0x0f); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); } if (state->m_pri & 0x02) - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans ^ 0x08, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x08, trans ^ 0x08, 0x0f); else - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } diff -Nru mame-0.144/src/mame/video/dec8.c mame-0.145/src/mame/video/dec8.c --- mame-0.144/src/mame/video/dec8.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dec8.c 2012-02-06 21:30:32.000000000 +0000 @@ -107,7 +107,7 @@ { dec8_state *state = space->machine().driver_data(); state->m_bg_data[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } READ8_HANDLER( dec8_bg_data_r ) @@ -121,14 +121,14 @@ { dec8_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset / 2); + state->m_fix_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( srdarwin_videoram_w ) { dec8_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } @@ -222,7 +222,7 @@ /******************************************************************************/ -static void srdarwin_draw_sprites( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void srdarwin_draw_sprites( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; int offs; @@ -272,17 +272,17 @@ /******************************************************************************/ -SCREEN_UPDATE( cobracom ) +SCREEN_UPDATE_IND16( cobracom ) { - dec8_state *state = screen->machine().driver_data(); + dec8_state *state = screen.machine().driver_data(); - flip_screen_set(screen->machine(), state->m_bg_control[0] >> 7); + flip_screen_set(screen.machine(), state->m_bg_control[0] >> 7); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x04, 0x00, 0x03); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x04, 0x04, 0x03); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x04, 0x00, 0x03); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x04, 0x04, 0x03); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -308,7 +308,7 @@ dec8_state *state = machine.driver_data(); state->m_fix_tilemap = tilemap_create(machine, get_cobracom_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_game_uses_priority = 0; machine.device("tilegen1")->set_colmask(0x3); @@ -318,12 +318,12 @@ /******************************************************************************/ -SCREEN_UPDATE( ghostb ) +SCREEN_UPDATE_IND16( ghostb ) { - dec8_state *state = screen->machine().driver_data(); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + dec8_state *state = screen.machine().driver_data(); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -345,7 +345,7 @@ { dec8_state *state = machine.driver_data(); state->m_fix_tilemap = tilemap_create(machine, get_ghostb_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_game_uses_priority = 0; machine.device("tilegen1")->set_colmask(0xf); @@ -353,16 +353,16 @@ /******************************************************************************/ -SCREEN_UPDATE( oscar ) +SCREEN_UPDATE_IND16( oscar ) { - dec8_state *state = screen->machine().driver_data(); - flip_screen_set(screen->machine(), state->m_bg_control[1] >> 7); + dec8_state *state = screen.machine().driver_data(); + flip_screen_set(screen.machine(), state->m_bg_control[1] >> 7); // we mimic the priority scheme in dec0.c, this was originally a bit different, so this could be wrong - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x08,0x08,0x08,0x08); - tilemap_draw(bitmap,cliprect, state->m_fix_tilemap, 0, 0); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x00, 0x00, 0x0f); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x08,0x08,0x08,0x08); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -385,7 +385,7 @@ dec8_state *state = machine.driver_data(); state->m_fix_tilemap = tilemap_create(machine, get_oscar_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_game_uses_priority = 1; machine.device("tilegen1")->set_colmask(0x7); @@ -394,30 +394,30 @@ /******************************************************************************/ -SCREEN_UPDATE( lastmisn ) +SCREEN_UPDATE_IND16( lastmisn ) { - dec8_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_scroll2[0] << 8)+ state->m_scroll2[1])); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_scroll2[2] << 8)+ state->m_scroll2[3])); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + dec8_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, ((state->m_scroll2[0] << 8)+ state->m_scroll2[1])); + state->m_bg_tilemap->set_scrolly(0, ((state->m_scroll2[2] << 8)+ state->m_scroll2[3])); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( shackled ) +SCREEN_UPDATE_IND16( shackled ) { - dec8_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + dec8_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); + state->m_bg_tilemap->set_scrolly(0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -435,9 +435,9 @@ int color = tile >> 12; if (color > 7 && state->m_game_uses_priority) - tileinfo->category = 1; + tileinfo.category = 1; else - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO( 2, @@ -466,7 +466,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_lastmisn_tile_info, lastmisn_scan_rows, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_lastmisn_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_game_uses_priority = 0; } @@ -476,23 +476,23 @@ state->m_bg_tilemap = tilemap_create(machine, get_lastmisn_tile_info, lastmisn_scan_rows, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_lastmisn_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0x000f, 0xfff0); /* Bottom 12 pens */ + state->m_fix_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transmask(0, 0x000f, 0xfff0); /* Bottom 12 pens */ state->m_game_uses_priority = 1; } /******************************************************************************/ -SCREEN_UPDATE( srdarwin ) +SCREEN_UPDATE_IND16( srdarwin ) { - dec8_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, (state->m_scroll2[0] << 8) + state->m_scroll2[1]); + dec8_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, (state->m_scroll2[0] << 8) + state->m_scroll2[1]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - srdarwin_draw_sprites(screen->machine(), bitmap, cliprect, 0); //* (srdarwin37b5gre) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - srdarwin_draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + srdarwin_draw_sprites(screen.machine(), bitmap, cliprect, 0); //* (srdarwin37b5gre) + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + srdarwin_draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -503,9 +503,9 @@ int color = 0; /* ? */ if (color > 1) - tileinfo->category = 1; + tileinfo.category = 1; else - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO( 0, @@ -530,7 +530,7 @@ tile, color, 0); - tileinfo->group = color; + tileinfo.group = color; } VIDEO_START( srdarwin ) @@ -539,39 +539,39 @@ state->m_bg_tilemap = tilemap_create(machine, get_srdarwin_tile_info, tilemap_scan_rows, 16, 16, 32, 16); state->m_fix_tilemap = tilemap_create(machine, get_srdarwin_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); //* draw as background only - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x00ff, 0xff00); /* Bottom 8 pens */ - tilemap_set_transmask(state->m_bg_tilemap, 2, 0x00ff, 0xff00); /* Bottom 8 pens */ - tilemap_set_transmask(state->m_bg_tilemap, 3, 0x0000, 0xffff); //* draw as foreground only + state->m_fix_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); //* draw as background only + state->m_bg_tilemap->set_transmask(1, 0x00ff, 0xff00); /* Bottom 8 pens */ + state->m_bg_tilemap->set_transmask(2, 0x00ff, 0xff00); /* Bottom 8 pens */ + state->m_bg_tilemap->set_transmask(3, 0x0000, 0xffff); //* draw as foreground only } /******************************************************************************/ -SCREEN_UPDATE( gondo ) +SCREEN_UPDATE_IND16( gondo ) { - dec8_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 1); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + dec8_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); + state->m_bg_tilemap->set_scrolly(0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 2); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 1); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( garyoret ) +SCREEN_UPDATE_IND16( garyoret ) { - dec8_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); - tilemap_set_scrolly(state->m_bg_tilemap, 0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + dec8_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, ((state->m_scroll2[0] << 8) + state->m_scroll2[1])); + state->m_bg_tilemap->set_scrolly(0, ((state->m_scroll2[2] << 8) + state->m_scroll2[3])); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_buffered_spriteram16, 0x400, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -597,9 +597,9 @@ int color = tile>> 12; if (color > 7 && state->m_game_uses_priority) - tileinfo->category = 1; + tileinfo.category = 1; else - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO( 2, @@ -614,8 +614,8 @@ state->m_fix_tilemap = tilemap_create(machine, get_gondo_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_gondo_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0x00ff, 0xff00); /* Bottom 8 pens */ + state->m_fix_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transmask(0, 0x00ff, 0xff00); /* Bottom 8 pens */ state->m_game_uses_priority = 0; } @@ -625,7 +625,7 @@ state->m_fix_tilemap = tilemap_create(machine, get_gondo_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_gondo_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_game_uses_priority = 1; } diff -Nru mame-0.144/src/mame/video/decbac06.c mame-0.145/src/mame/video/decbac06.c --- mame-0.144/src/mame/video/decbac06.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/decbac06.c 2012-02-06 21:30:32.000000000 +0000 @@ -126,7 +126,7 @@ int tile=dev->pf_data[tile_index]; int colourpri=(tile>>12); SET_TILE_INFO_DEVICE(dev->tile_region,tile&0xfff,0,0); - tileinfo->category = colourpri; + tileinfo.category = colourpri; } static TILE_GET_INFO_DEVICE( get_pf16x16_tile_info ) @@ -136,7 +136,7 @@ int tile=dev->pf_data[tile_index]; int colourpri=(tile>>12); SET_TILE_INFO_DEVICE(dev->tile_region,tile&0xfff,0,0); - tileinfo->category = colourpri; + tileinfo.category = colourpri; } @@ -191,8 +191,8 @@ void deco_bac06_device::custom_tilemap_draw(running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + bitmap_ind16 &bitmap, + const rectangle &cliprect, tilemap_t *tilemap_ptr, const UINT16 *rowscroll_ptr, const UINT16 *colscroll_ptr, @@ -205,8 +205,8 @@ UINT16 colpricondition ) { - const bitmap_t *src_bitmap = tilemap_get_pixmap(tilemap_ptr); - const bitmap_t *flags_bitmap = tilemap_get_flagsmap(tilemap_ptr); + const bitmap_ind16 &src_bitmap = tilemap_ptr->pixmap(); + const bitmap_ind8 &flags_bitmap = tilemap_ptr->flagsmap(); int x, y, p, colpri; int column_offset=0, src_x=0, src_y=0; UINT32 scrollx = 0; @@ -229,11 +229,8 @@ col_scroll_enabled = (colscroll_ptr && (control0[0]&0x8)); } - if (!src_bitmap) - return; - - width_mask = src_bitmap->width - 1; - height_mask = src_bitmap->height - 1; + width_mask = src_bitmap.width() - 1; + height_mask = src_bitmap.height() - 1; /* Column scroll & row scroll may per applied per pixel, there are shift registers for each which control the granularity of the row/col @@ -254,25 +251,25 @@ */ if (flip_screen_get(machine)) - src_y = (src_bitmap->height - 256) - scrolly; + src_y = (src_bitmap.height() - 256) - scrolly; else src_y = scrolly; - for (y=0; y<=cliprect->max_y; y++) { + for (y=0; y<=cliprect.max_y; y++) { if (row_scroll_enabled) src_x=scrollx + rowscroll_ptr[(src_y >> (control1[3]&0xf))&(0x1ff>>(control1[3]&0xf))]; else src_x=scrollx; if (flip_screen_get(machine)) - src_x=(src_bitmap->width - 256) - src_x; + src_x=(src_bitmap.width() - 256) - src_x; - for (x=0; x<=cliprect->max_x; x++) { + for (x=0; x<=cliprect.max_x; x++) { if (col_scroll_enabled) column_offset=colscroll_ptr[((src_x >> 3) >> (control1[2]&0xf))&(0x3f>>(control1[2]&0xf))]; - p = *BITMAP_ADDR16(src_bitmap, (src_y + column_offset)&height_mask, src_x&width_mask); - colpri = *BITMAP_ADDR8(flags_bitmap, (src_y + column_offset)&height_mask, src_x&width_mask)&0xf; + p = src_bitmap.pix16((src_y + column_offset)&height_mask, src_x&width_mask); + colpri = flags_bitmap.pix8((src_y + column_offset)&height_mask, src_x&width_mask)&0xf; src_x++; if ((flags&TILEMAP_DRAW_OPAQUE) || (p&m_bppmask)) @@ -281,14 +278,14 @@ if ((p&penmask)==pencondition) if((colpri&colprimask)==colpricondition) - *BITMAP_ADDR16(bitmap, y, x) = p+(colpri&m_gfxcolmask)*m_bppmult; + bitmap.pix16(y, x) = p+(colpri&m_gfxcolmask)*m_bppmult; } } src_y++; } } -void deco_bac06_device::deco_bac06_pf_draw(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect,int flags,UINT16 penmask, UINT16 pencondition,UINT16 colprimask, UINT16 colpricondition) +void deco_bac06_device::deco_bac06_pf_draw(running_machine &machine,bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,UINT16 penmask, UINT16 pencondition,UINT16 colprimask, UINT16 colpricondition) { tilemap_t* tm = 0; @@ -322,7 +319,7 @@ } // used for pocket gal bootleg, which doesn't set registers properly and simply expects a fixed size tilemap. -void deco_bac06_device::deco_bac06_pf_draw_bootleg(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect,int flags, int mode, int type) +void deco_bac06_device::deco_bac06_pf_draw_bootleg(running_machine &machine,bitmap_ind16 &bitmap,const rectangle &cliprect,int flags, int mode, int type) { tilemap_t* tm = 0; if (!mode) tm = pf8x8_tilemap[type]; @@ -351,12 +348,12 @@ printf("tilemap ram bank change to %d\n", newbank&1); dev->m_rambank = newbank&1; - tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[0]); - tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[1]); - tilemap_mark_all_tiles_dirty(dev->pf8x8_tilemap[2]); - tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[0]); - tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[1]); - tilemap_mark_all_tiles_dirty(dev->pf16x16_tilemap[2]); + dev->pf8x8_tilemap[0]->mark_all_dirty(); + dev->pf8x8_tilemap[1]->mark_all_dirty(); + dev->pf8x8_tilemap[2]->mark_all_dirty(); + dev->pf16x16_tilemap[0]->mark_all_dirty(); + dev->pf16x16_tilemap[1]->mark_all_dirty(); + dev->pf16x16_tilemap[2]->mark_all_dirty(); } } } @@ -382,12 +379,12 @@ if (dev->m_rambank&1) offset+=0x1000; COMBINE_DATA(&dev->pf_data[offset]); - tilemap_mark_tile_dirty(dev->pf8x8_tilemap[0],offset); - tilemap_mark_tile_dirty(dev->pf8x8_tilemap[1],offset); - tilemap_mark_tile_dirty(dev->pf8x8_tilemap[2],offset); - tilemap_mark_tile_dirty(dev->pf16x16_tilemap[0],offset); - tilemap_mark_tile_dirty(dev->pf16x16_tilemap[1],offset); - tilemap_mark_tile_dirty(dev->pf16x16_tilemap[2],offset); + dev->pf8x8_tilemap[0]->mark_tile_dirty(offset); + dev->pf8x8_tilemap[1]->mark_tile_dirty(offset); + dev->pf8x8_tilemap[2]->mark_tile_dirty(offset); + dev->pf16x16_tilemap[0]->mark_tile_dirty(offset); + dev->pf16x16_tilemap[1]->mark_tile_dirty(offset); + dev->pf16x16_tilemap[2]->mark_tile_dirty(offset); } READ16_DEVICE_HANDLER( deco_bac06_pf_data_r ) diff -Nru mame-0.144/src/mame/video/decbac06.h mame-0.145/src/mame/video/decbac06.h --- mame-0.144/src/mame/video/decbac06.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decbac06.h 2012-02-06 21:30:32.000000000 +0000 @@ -21,8 +21,8 @@ UINT16 pf_control_0[8]; UINT16 pf_control_1[8]; - void deco_bac06_pf_draw(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect,int flags,UINT16 penmask, UINT16 pencondition,UINT16 colprimask, UINT16 colpricondition); - void deco_bac06_pf_draw_bootleg(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect,int flags, int mode, int type); + void deco_bac06_pf_draw(running_machine &machine,bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,UINT16 penmask, UINT16 pencondition,UINT16 colprimask, UINT16 colpricondition); + void deco_bac06_pf_draw_bootleg(running_machine &machine,bitmap_ind16 &bitmap,const rectangle &cliprect,int flags, int mode, int type); UINT8 get_flip_state(void) { return pf_control_0[0]&0x80; }; void set_colmask(int data) { m_gfxcolmask = data; } @@ -42,8 +42,8 @@ UINT8 m_bppmask; void custom_tilemap_draw(running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + bitmap_ind16 &bitmap, + const rectangle &cliprect, tilemap_t *tilemap_ptr, const UINT16 *rowscroll_ptr, const UINT16 *colscroll_ptr, diff -Nru mame-0.144/src/mame/video/deckarn.c mame-0.145/src/mame/video/deckarn.c --- mame-0.144/src/mame/video/deckarn.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/deckarn.c 2012-02-06 21:30:31.000000000 +0000 @@ -28,7 +28,7 @@ } -void deco_karnovsprites_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int size, int priority ) +void deco_karnovsprites_device::draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram, int size, int priority ) { int offs; diff -Nru mame-0.144/src/mame/video/deckarn.h mame-0.145/src/mame/video/deckarn.h --- mame-0.144/src/mame/video/deckarn.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/deckarn.h 2012-02-06 21:30:31.000000000 +0000 @@ -5,7 +5,7 @@ public: deco_karnovsprites_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void set_gfxregion(int region) { m_gfxregion = region; }; - void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int size, int priority ); + void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram, int size, int priority ); static void set_gfx_region(device_t &device, int region); protected: diff -Nru mame-0.144/src/mame/video/decmxc06.c mame-0.145/src/mame/video/decmxc06.c --- mame-0.144/src/mame/video/decmxc06.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/decmxc06.c 2012-02-06 21:30:32.000000000 +0000 @@ -55,7 +55,7 @@ /* this implementation was originally from Mad Motor */ -void deco_mxc06_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int pri_mask, int pri_val, int col_mask ) +void deco_mxc06_device::draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram, int pri_mask, int pri_val, int col_mask ) { int offs; diff -Nru mame-0.144/src/mame/video/decmxc06.h mame-0.145/src/mame/video/decmxc06.h --- mame-0.144/src/mame/video/decmxc06.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decmxc06.h 2012-02-06 21:30:32.000000000 +0000 @@ -7,7 +7,7 @@ deco_mxc06_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); static void set_gfx_region(device_t &device, int region); void set_gfxregion(int region) { m_gfxregion = region; }; - void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram16, int pri_mask, int pri_val, int col_mask ); + void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram16, int pri_mask, int pri_val, int col_mask ); void set_pri_type( int type ) { m_priority_type = type; } protected: virtual void device_start(); diff -Nru mame-0.144/src/mame/video/deco16ic.c mame-0.145/src/mame/video/deco16ic.c --- mame-0.144/src/mame/video/deco16ic.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/deco16ic.c 2012-02-06 21:30:33.000000000 +0000 @@ -345,6 +345,7 @@ flags); } + /*****************************************************************************************/ /* @@ -355,10 +356,11 @@ by the Mame core. */ +template static void custom_tilemap_draw( device_t *device, - bitmap_t *bitmap, - const rectangle *cliprect, + _BitmapClass &bitmap, + const rectangle &cliprect, tilemap_t *tilemap0_8x8, tilemap_t *tilemap0_16x16, tilemap_t *tilemap1_8x8, @@ -379,8 +381,8 @@ running_machine &machine = device->machine(); tilemap_t *tilemap0 = BIT(control1, 7) ? tilemap0_8x8 : tilemap0_16x16; tilemap_t *tilemap1 = BIT(control1, 7) ? tilemap1_8x8 : tilemap1_16x16; - const bitmap_t *src_bitmap0 = tilemap0 ? tilemap_get_pixmap(tilemap0) : NULL; - const bitmap_t *src_bitmap1 = tilemap1 ? tilemap_get_pixmap(tilemap1) : NULL; + const bitmap_ind16 *src_bitmap0 = tilemap0 ? &tilemap0->pixmap() : NULL; + const bitmap_ind16 *src_bitmap1 = tilemap1 ? &tilemap1->pixmap() : NULL; int width_mask, height_mask, x, y, p; int column_offset, src_x = 0, src_y = 0; int row_type = 1 << ((control0 >> 3) & 0xf); @@ -393,11 +395,11 @@ if (!BIT(control0, 7)) return; - int starty = cliprect->min_y; - int endy = cliprect->max_y+1; + int starty = cliprect.min_y; + int endy = cliprect.max_y+1; - width_mask = src_bitmap0->width - 1; - height_mask = src_bitmap0->height - 1; + width_mask = src_bitmap0->width() - 1; + height_mask = src_bitmap0->height() - 1; src_y = (scrolly + starty) & height_mask; @@ -410,73 +412,42 @@ src_x &= width_mask; - if (bitmap->bpp == 16) + /* boogwing */ + for (x = 0; x < 320; x++) { - for (x = 0; x < 320; x++) - { - if (rowscroll_ptr && BIT(control1, 5)) - column_offset = rowscroll_ptr[0x200 + ((src_x & 0x1ff) / col_type)]; - else - column_offset = 0; - - p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x); + if (rowscroll_ptr && BIT(control1, 5)) + column_offset = rowscroll_ptr[0x200 + ((src_x & 0x1ff) / col_type)]; + else + column_offset = 0; - if (src_bitmap1) - { - p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; - } + p = src_bitmap0->pix16((src_y + column_offset) & height_mask, src_x); - src_x = (src_x + 1) & width_mask; - - if ((flags & TILEMAP_DRAW_OPAQUE) || (p & trans_mask)) + if (src_bitmap1) + { + if (!is_tattoo) { - *BITMAP_ADDR16(bitmap, y, x) = machine.pens[p]; - if (machine.priority_bitmap) - { - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); - pri[x] |= priority; - } + // does boogie wings actually use this, or is the tattoo assassing code correct in this mode? + p |= (src_bitmap1->pix16((src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; } - } - } - else - { - /* boogwing */ - for (x = 0; x < 320; x++) - { - if (rowscroll_ptr && BIT(control1, 5)) - column_offset = rowscroll_ptr[0x200 + ((src_x & 0x1ff) / col_type)]; else - column_offset = 0; - - p = *BITMAP_ADDR16(src_bitmap0, (src_y + column_offset) & height_mask, src_x); - - if (src_bitmap1) { - if (!is_tattoo) - { - // does boogie wings actually use this, or is the tattoo assassing code correct in this mode? - p |= (*BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x) & combine_mask) << combine_shift; - } - else - { - UINT16 p2 = *BITMAP_ADDR16(src_bitmap1, (src_y + column_offset) & height_mask, src_x); - p = 0x200+( ((p&0x30)<<4) | (p&0x0f) | ((p2 & 0x0f)<<4)); - } + UINT16 p2 = src_bitmap1->pix16((src_y + column_offset) & height_mask, src_x); + p = 0x200+( ((p&0x30)<<4) | (p&0x0f) | ((p2 & 0x0f)<<4)); } - src_x = (src_x + 1) & width_mask; + } + src_x = (src_x + 1) & width_mask; - if ((flags & TILEMAP_DRAW_OPAQUE) || (p & trans_mask)) + if ((flags & TILEMAP_DRAW_OPAQUE) || (p & trans_mask)) + { + bitmap.pix(y, x) = machine.pens[p]; + if (machine.priority_bitmap.valid()) { - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[p]; - if (machine.priority_bitmap) - { - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); - pri[x] |= priority; - } + UINT8 *pri = &machine.priority_bitmap.pix8(y); + pri[x] |= priority; } } } + src_y = (src_y + 1) & height_mask; } } @@ -509,9 +480,9 @@ if (deco16ic->pf12_last_big != big) { if (deco16ic->pf1_tilemap_16x16) - tilemap_mark_all_tiles_dirty(deco16ic->pf1_tilemap_16x16); + deco16ic->pf1_tilemap_16x16->mark_all_dirty(); if (deco16ic->pf2_tilemap_16x16) - tilemap_mark_all_tiles_dirty(deco16ic->pf2_tilemap_16x16); + deco16ic->pf2_tilemap_16x16->mark_all_dirty(); deco16ic->pf12_last_big = big; } @@ -520,9 +491,9 @@ if (deco16ic->pf12_last_small != small) { if (deco16ic->pf1_tilemap_8x8) - tilemap_mark_all_tiles_dirty(deco16ic->pf1_tilemap_8x8); + deco16ic->pf1_tilemap_8x8->mark_all_dirty(); if (deco16ic->pf2_tilemap_8x8) - tilemap_mark_all_tiles_dirty(deco16ic->pf2_tilemap_8x8); + deco16ic->pf2_tilemap_8x8->mark_all_dirty(); deco16ic->pf12_last_small = small; } @@ -538,15 +509,15 @@ { case 0: if (!size) - tilemap_set_scrolldx(deco16ic->pf1_tilemap_16x16, dx, dx_if_flipped); + deco16ic->pf1_tilemap_16x16->set_scrolldx(dx, dx_if_flipped); else - tilemap_set_scrolldx(deco16ic->pf1_tilemap_8x8, dx, dx_if_flipped); + deco16ic->pf1_tilemap_8x8->set_scrolldx(dx, dx_if_flipped); break; case 1: if (!size) - tilemap_set_scrolldx(deco16ic->pf2_tilemap_16x16, dx, dx_if_flipped); + deco16ic->pf2_tilemap_16x16->set_scrolldx(dx, dx_if_flipped); else - tilemap_set_scrolldx(deco16ic->pf2_tilemap_8x8, dx, dx_if_flipped); + deco16ic->pf2_tilemap_8x8->set_scrolldx(dx, dx_if_flipped); break; } } @@ -570,9 +541,9 @@ COMBINE_DATA(&deco16ic->pf1_data[offset]); - tilemap_mark_tile_dirty(deco16ic->pf1_tilemap_8x8, offset); + deco16ic->pf1_tilemap_8x8->mark_tile_dirty(offset); // if (offset < 0x800) - tilemap_mark_tile_dirty(deco16ic->pf1_tilemap_16x16, offset); + deco16ic->pf1_tilemap_16x16->mark_tile_dirty(offset); } WRITE16_DEVICE_HANDLER( deco16ic_pf2_data_w ) @@ -581,9 +552,9 @@ COMBINE_DATA(&deco16ic->pf2_data[offset]); - tilemap_mark_tile_dirty(deco16ic->pf2_tilemap_8x8, offset); + deco16ic->pf2_tilemap_8x8->mark_tile_dirty(offset); // if (offset < 0x800) - tilemap_mark_tile_dirty(deco16ic->pf2_tilemap_16x16, offset); + deco16ic->pf2_tilemap_16x16->mark_tile_dirty(offset); } READ16_DEVICE_HANDLER( deco16ic_pf1_data_r ) @@ -601,8 +572,9 @@ WRITE16_DEVICE_HANDLER( deco16ic_pf_control_w ) { deco16ic_state *deco16ic = get_safe_token(device); - COMBINE_DATA(&deco16ic->pf12_control[offset]); device->machine().primary_screen->update_partial(device->machine().primary_screen->vpos()); + + COMBINE_DATA(&deco16ic->pf12_control[offset]); } READ16_DEVICE_HANDLER( deco16ic_pf_control_r ) @@ -661,19 +633,19 @@ if (BIT(control1, 7)) { if (tilemap_8x8) - tilemap_set_enable(tilemap_8x8, BIT(control0, 7)); + tilemap_8x8->enable(BIT(control0, 7)); if (tilemap_16x16) - tilemap_set_enable(tilemap_16x16, 0); + tilemap_16x16->enable(0); } else { if (tilemap_8x8) - tilemap_set_enable(tilemap_8x8, 0); + tilemap_8x8->enable(0); if (tilemap_16x16) - tilemap_set_enable(tilemap_16x16, BIT(control0, 7)); + tilemap_16x16->enable(BIT(control0, 7)); } /* Rowscroll enable */ @@ -697,22 +669,22 @@ if (tilemap_16x16) { - tilemap_set_scroll_cols(tilemap_16x16, 1); - tilemap_set_scroll_rows(tilemap_16x16, rows); - tilemap_set_scrolly(tilemap_16x16, 0, scrolly); + tilemap_16x16->set_scroll_cols(1); + tilemap_16x16->set_scroll_rows(rows); + tilemap_16x16->set_scrolly(0, scrolly); for (offs = 0; offs < rows; offs++) - tilemap_set_scrollx(tilemap_16x16, offs, scrollx + rowscroll_ptr[offs]); + tilemap_16x16->set_scrollx(offs, scrollx + rowscroll_ptr[offs]); } if (tilemap_8x8) { - tilemap_set_scroll_cols(tilemap_8x8, 1); - tilemap_set_scroll_rows(tilemap_8x8, rows / 2); - tilemap_set_scrolly(tilemap_8x8, 0, scrolly); + tilemap_8x8->set_scroll_cols(1); + tilemap_8x8->set_scroll_rows(rows / 2); + tilemap_8x8->set_scrolly(0, scrolly); for (offs = 0; offs < rows / 2; offs++) - tilemap_set_scrollx(tilemap_8x8, offs, scrollx + rowscroll_ptr[offs]); + tilemap_8x8->set_scrollx(offs, scrollx + rowscroll_ptr[offs]); } } else if (rowscroll_ptr && (control1 & 0x60) == 0x20) /* Column scroll */ @@ -731,24 +703,24 @@ if (tilemap_16x16) { - tilemap_set_scroll_cols(tilemap_16x16, cols); - tilemap_set_scroll_rows(tilemap_16x16, 1); - tilemap_set_scrollx(tilemap_16x16, 0, scrollx); + tilemap_16x16->set_scroll_cols(cols); + tilemap_16x16->set_scroll_rows(1); + tilemap_16x16->set_scrollx(0, scrollx); for (offs = 0; offs < cols; offs++) - tilemap_set_scrolly(tilemap_16x16, offs, scrolly + rowscroll_ptr[(offs & mask) + 0x200]); + tilemap_16x16->set_scrolly(offs, scrolly + rowscroll_ptr[(offs & mask) + 0x200]); } if (tilemap_8x8) { cols = cols / 2; /* Adjust because 8x8 tilemap is half the width of 16x16 */ - tilemap_set_scroll_cols(tilemap_8x8, cols); - tilemap_set_scroll_rows(tilemap_8x8, 1); - tilemap_set_scrollx(tilemap_8x8, 0, scrollx); + tilemap_8x8->set_scroll_cols(cols); + tilemap_8x8->set_scroll_rows(1); + tilemap_8x8->set_scrollx(0, scrollx); for (offs = 0; offs < cols; offs++) - tilemap_set_scrolly(tilemap_8x8, offs, scrolly + rowscroll_ptr[(offs & mask) + 0x200]); + tilemap_8x8->set_scrolly(offs, scrolly + rowscroll_ptr[(offs & mask) + 0x200]); } } else if (control1 & 0x60) @@ -758,18 +730,18 @@ if (tilemap_16x16) { - tilemap_set_scroll_rows(tilemap_16x16, 1); - tilemap_set_scroll_cols(tilemap_16x16, 1); - tilemap_set_scrollx(tilemap_16x16, 0, scrollx); - tilemap_set_scrolly(tilemap_16x16, 0, scrolly); + tilemap_16x16->set_scroll_rows(1); + tilemap_16x16->set_scroll_cols(1); + tilemap_16x16->set_scrollx(0, scrollx); + tilemap_16x16->set_scrolly(0, scrolly); } if (tilemap_8x8) { - tilemap_set_scroll_rows(tilemap_8x8, 1); - tilemap_set_scroll_cols(tilemap_8x8, 1); - tilemap_set_scrollx(tilemap_8x8, 0, scrollx); - tilemap_set_scrolly(tilemap_8x8, 0, scrolly); + tilemap_8x8->set_scroll_rows(1); + tilemap_8x8->set_scroll_cols(1); + tilemap_8x8->set_scrollx(0, scrollx); + tilemap_8x8->set_scrolly(0, scrolly); } @@ -778,18 +750,18 @@ { if (tilemap_16x16) { - tilemap_set_scroll_rows(tilemap_16x16, 1); - tilemap_set_scroll_cols(tilemap_16x16, 1); - tilemap_set_scrollx(tilemap_16x16, 0, scrollx); - tilemap_set_scrolly(tilemap_16x16, 0, scrolly); + tilemap_16x16->set_scroll_rows(1); + tilemap_16x16->set_scroll_cols(1); + tilemap_16x16->set_scrollx(0, scrollx); + tilemap_16x16->set_scrolly(0, scrolly); } if (tilemap_8x8) { - tilemap_set_scroll_rows(tilemap_8x8, 1); - tilemap_set_scroll_cols(tilemap_8x8, 1); - tilemap_set_scrollx(tilemap_8x8, 0, scrollx); - tilemap_set_scrolly(tilemap_8x8, 0, scrolly); + tilemap_8x8->set_scroll_rows(1); + tilemap_8x8->set_scroll_cols(1); + tilemap_8x8->set_scrollx(0, scrollx); + tilemap_8x8->set_scrolly(0, scrolly); } } @@ -815,9 +787,9 @@ if (bank1 != deco16ic->pf1_bank) { if (deco16ic->pf1_tilemap_8x8) - tilemap_mark_all_tiles_dirty(deco16ic->pf1_tilemap_8x8); + deco16ic->pf1_tilemap_8x8->mark_all_dirty(); if (deco16ic->pf1_tilemap_16x16) - tilemap_mark_all_tiles_dirty(deco16ic->pf1_tilemap_16x16); + deco16ic->pf1_tilemap_16x16->mark_all_dirty(); deco16ic->pf1_bank = bank1; } @@ -830,9 +802,9 @@ if (bank2 != deco16ic->pf2_bank) { if (deco16ic->pf2_tilemap_8x8) - tilemap_mark_all_tiles_dirty(deco16ic->pf2_tilemap_8x8); + deco16ic->pf2_tilemap_8x8->mark_all_dirty(); if (deco16ic->pf2_tilemap_16x16) - tilemap_mark_all_tiles_dirty(deco16ic->pf2_tilemap_16x16); + deco16ic->pf2_tilemap_16x16->mark_all_dirty(); deco16ic->pf2_bank = bank2; } @@ -841,7 +813,7 @@ /*****************************************************************************************/ -void deco16ic_print_debug_info(device_t *device, bitmap_t *bitmap) +void deco16ic_print_debug_info(device_t *device, bitmap_ind16 &bitmap) { deco16ic_state *deco16ic = get_safe_token(device); char buf[64*5]; @@ -862,7 +834,8 @@ /*****************************************************************************************/ -void deco16ic_tilemap_1_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority ) +template +void deco16ic_tilemap_1_draw_common( device_t *device, _BitmapClass &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) { deco16ic_state *deco16ic = get_safe_token(device); @@ -873,13 +846,21 @@ else { if (deco16ic->pf1_tilemap_8x8) - tilemap_draw(bitmap, cliprect, deco16ic->pf1_tilemap_8x8, flags, priority); + deco16ic->pf1_tilemap_8x8->draw(bitmap, cliprect, flags, priority); if (deco16ic->pf1_tilemap_16x16) - tilemap_draw(bitmap, cliprect, deco16ic->pf1_tilemap_16x16, flags, priority); + deco16ic->pf1_tilemap_16x16->draw(bitmap, cliprect, flags, priority); } } -void deco16ic_tilemap_2_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority) +void deco16ic_tilemap_1_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) +{ deco16ic_tilemap_1_draw_common(device, bitmap, cliprect, flags, priority); } + +void deco16ic_tilemap_1_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) +{ deco16ic_tilemap_1_draw_common(device, bitmap, cliprect, flags, priority); } + + +template +void deco16ic_tilemap_2_draw_common(device_t *device, _BitmapClass &bitmap, const rectangle &cliprect, int flags, UINT32 priority) { deco16ic_state *deco16ic = get_safe_token(device); @@ -890,17 +871,29 @@ else { if (deco16ic->pf2_tilemap_8x8) - tilemap_draw(bitmap, cliprect, deco16ic->pf2_tilemap_8x8, flags, priority); + deco16ic->pf2_tilemap_8x8->draw(bitmap, cliprect, flags, priority); if (deco16ic->pf2_tilemap_16x16) - tilemap_draw(bitmap, cliprect, deco16ic->pf2_tilemap_16x16, flags, priority); + deco16ic->pf2_tilemap_16x16->draw(bitmap, cliprect, flags, priority); } } +void deco16ic_tilemap_2_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) +{ deco16ic_tilemap_2_draw_common(device, bitmap, cliprect, flags, priority); } + +void deco16ic_tilemap_2_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) +{ deco16ic_tilemap_2_draw_common(device, bitmap, cliprect, flags, priority); } + /*****************************************************************************************/ // Combines the output of two 4BPP tilemaps into an 8BPP tilemap -void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority, int is_tattoo) +void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority, int is_tattoo) +{ + deco16ic_state *deco16ic = get_safe_token(device); + custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf1_tilemap_16x16, 0, deco16ic->pf2_tilemap_16x16, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0xf, 4, 0xff, flags, priority, is_tattoo); +} + +void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority, int is_tattoo) { deco16ic_state *deco16ic = get_safe_token(device); custom_tilemap_draw(device, bitmap, cliprect, 0, deco16ic->pf1_tilemap_16x16, 0, deco16ic->pf2_tilemap_16x16, deco16ic->pf1_rowscroll_ptr, deco16ic->pf12_control[1], deco16ic->pf12_control[2], deco16ic->pf12_control[5] & 0xff, deco16ic->pf12_control[6] & 0xff, 0xf, 4, 0xff, flags, priority, is_tattoo); @@ -951,13 +944,13 @@ deco16ic->pf2_tilemap_8x8 = tilemap_create_device(device, get_pf2_tile_info_b, tilemap_scan_rows, 8, 8, fullwidth ? 64 : 32, fullheight ? 64 : 32); - tilemap_set_transparent_pen(deco16ic->pf1_tilemap_8x8, 0); - tilemap_set_transparent_pen(deco16ic->pf2_tilemap_8x8, 0); - tilemap_set_transparent_pen(deco16ic->pf1_tilemap_16x16, 0); - tilemap_set_transparent_pen(deco16ic->pf2_tilemap_16x16, 0); + deco16ic->pf1_tilemap_8x8->set_transparent_pen(0); + deco16ic->pf2_tilemap_8x8->set_transparent_pen(0); + deco16ic->pf1_tilemap_16x16->set_transparent_pen(0); + deco16ic->pf2_tilemap_16x16->set_transparent_pen(0); if (intf->split) /* Caveman Ninja only */ - tilemap_set_transmask(deco16ic->pf2_tilemap_16x16, 0, 0x00ff, 0xff01); + deco16ic->pf2_tilemap_16x16->set_transmask(0, 0x00ff, 0xff01); deco16ic->pf1_8bpp_mode = 0; diff -Nru mame-0.144/src/mame/video/deco16ic.h mame-0.145/src/mame/video/deco16ic.h --- mame-0.144/src/mame/video/deco16ic.h 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/deco16ic.h 2012-02-06 21:30:33.000000000 +0000 @@ -70,15 +70,18 @@ READ32_DEVICE_HANDLER( deco16ic_pf_control_dword_r ); -void deco16ic_print_debug_info(device_t *device, bitmap_t *bitmap); +void deco16ic_print_debug_info(device_t *device, bitmap_ind16 &bitmap); void deco16ic_pf_update(device_t *device, const UINT16 *rowscroll_1_ptr, const UINT16 *rowscroll_2_ptr); -void deco16ic_tilemap_1_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority); -void deco16ic_tilemap_2_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority); +void deco16ic_tilemap_1_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority); +void deco16ic_tilemap_1_draw(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority); +void deco16ic_tilemap_2_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority); +void deco16ic_tilemap_2_draw(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority); /* used by boogwing, nitrobal */ -void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority, int is_tattoo = false); +void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority, int is_tattoo = false); +void deco16ic_tilemap_12_combine_draw(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flags, UINT32 priority, int is_tattoo = false); /* used by robocop2 */ void deco16ic_set_tilemap_colour_mask(device_t *device, int tmap, int mask); diff -Nru mame-0.144/src/mame/video/deco32.c mame-0.145/src/mame/video/deco32.c --- mame-0.144/src/mame/video/deco32.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/deco32.c 2012-02-06 21:30:32.000000000 +0000 @@ -152,10 +152,10 @@ INLINE void dragngun_drawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int transparent_color, - int scalex, int scaley,bitmap_t *pri_buffer,UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha ) + int scalex, int scaley,bitmap_ind8 *pri_buffer,UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha ) { rectangle myclip; @@ -169,20 +169,8 @@ */ /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); { if( gfx ) @@ -222,31 +210,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -261,8 +246,8 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(pri_buffer, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); + UINT8 *pri = &pri_buffer->pix8(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(pri_buffer, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); + UINT8 *pri = &pri_buffer->pix8(y); int x, x_index = x_index_base; for( x=sx; x>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x(); const UINT32 *layout_ram; @@ -540,7 +525,7 @@ { deco32_state *state = machine.driver_data(); state->m_dirty_palette = auto_alloc_array(machine, UINT8, 4096); - machine.device("spritegen")->alloc_sprite_bitmap(machine); + machine.device("spritegen")->alloc_sprite_bitmap(); state->m_has_ace_ram=0; } @@ -573,9 +558,9 @@ state->m_dirty_palette = auto_alloc_array(machine, UINT8, 4096); width = machine.primary_screen->width(); height = machine.primary_screen->height(); - state->m_tilemap_alpha_bitmap=auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16 ); - machine.device("spritegen1")->alloc_sprite_bitmap(machine); - machine.device("spritegen2")->alloc_sprite_bitmap(machine); + state->m_tilemap_alpha_bitmap=auto_bitmap_ind16_alloc(machine, width, height ); + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); memset(state->m_dirty_palette,0,4096); state_save_register_global(machine, state->m_pri); state->m_has_ace_ram=1; @@ -583,12 +568,12 @@ /******************************************************************************/ -SCREEN_EOF( captaven ) +SCREEN_VBLANK( captaven ) { } -SCREEN_EOF( dragngun ) +SCREEN_VBLANK( dragngun ) { } @@ -596,16 +581,16 @@ /******************************************************************************/ -SCREEN_UPDATE( captaven ) +SCREEN_UPDATE_IND16( captaven ) { - deco32_state *state = screen->machine().driver_data(); - state->m_deco_tilegen1 = screen->machine().device("tilegen1"); - state->m_deco_tilegen2 = screen->machine().device("tilegen2"); + deco32_state *state = screen.machine().driver_data(); + state->m_deco_tilegen1 = screen.machine().device("tilegen1"); + state->m_deco_tilegen2 = screen.machine().device("tilegen2"); - tilemap_set_flip_all(screen->machine(),flip_screen_get(screen->machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(flip_screen_get(screen.machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0x000]); // Palette index not confirmed + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(screen.machine().pens[0x000], cliprect); // Palette index not confirmed deco16ic_set_pf1_8bpp_mode(state->m_deco_tilegen2, 1); @@ -627,19 +612,19 @@ deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); - screen->machine().device("spritegen")->set_alt_format(true); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16_buffered, 0x400); + screen.machine().device("spritegen")->set_alt_format(true); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram16_buffered, 0x400); return 0; } -SCREEN_UPDATE( dragngun ) +SCREEN_UPDATE_RGB32( dragngun ) { - deco32_state *state = screen->machine().driver_data(); - state->m_deco_tilegen1 = screen->machine().device("tilegen1"); - state->m_deco_tilegen2 = screen->machine().device("tilegen2"); + deco32_state *state = screen.machine().driver_data(); + state->m_deco_tilegen1 = screen.machine().device("tilegen1"); + state->m_deco_tilegen2 = screen.machine().device("tilegen2"); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); @@ -660,16 +645,12 @@ // with the concept of generic tilemap code. // // for now we only draw these 2 layers on the last update call - if (cliprect->max_y == 247) + if (cliprect.max_y == 247) { - rectangle clip; - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; - clip.min_y = 8; - clip.max_y = 247; + rectangle clip(cliprect.min_x, cliprect.max_x, 8, 247); - dragngun_draw_sprites(screen->machine(),bitmap,&clip,screen->machine().generic.buffered_spriteram.u32); - deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, &clip, 0, 0); + dragngun_draw_sprites(screen.machine(),bitmap,clip,screen.machine().generic.buffered_spriteram.u32); + deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, clip, 0, 0); } @@ -677,19 +658,19 @@ } -SCREEN_UPDATE( fghthist ) +SCREEN_UPDATE_RGB32( fghthist ) { - deco32_state *state = screen->machine().driver_data(); - state->m_deco_tilegen1 = screen->machine().device("tilegen1"); - state->m_deco_tilegen2 = screen->machine().device("tilegen2"); + deco32_state *state = screen.machine().driver_data(); + state->m_deco_tilegen1 = screen.machine().device("tilegen1"); + state->m_deco_tilegen2 = screen.machine().device("tilegen2"); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0x000]); // Palette index not confirmed + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(screen.machine().pens[0x000], cliprect); // Palette index not confirmed deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16_buffered, 0x800, true); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram16_buffered, 0x800, true); /* Draw screen */ deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 1); @@ -697,17 +678,17 @@ if(state->m_pri&1) { deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0800, 0x0800, 1024, 0x1ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 1024, 0x1ff); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); } else { deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0800, 0x0800, 1024, 0x1ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 1024, 0x1ff); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); } - screen->machine().device("spritegen")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0800, 1024, 0x1ff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 1024, 0x1ff); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; @@ -721,7 +702,7 @@ blending support - it can't be done in-place on the final framebuffer without a lot of support bitmaps. */ -static void mixDualAlphaSprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx0, const gfx_element *gfx1, int mixAlphaTilemap) +static void mixDualAlphaSprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, const gfx_element *gfx0, const gfx_element *gfx1, int mixAlphaTilemap) { deco32_state *state = gfx0->machine().driver_data(); running_machine &machine = gfx0->machine(); @@ -730,17 +711,17 @@ const pen_t *pal1 = &pens[gfx1->color_base]; const pen_t *pal2 = &pens[machine.gfx[(state->m_pri&1) ? 1 : 2]->color_base]; int x,y; - bitmap_t* sprite0_mix_bitmap = machine.device("spritegen1")->get_sprite_temp_bitmap(); - bitmap_t* sprite1_mix_bitmap = machine.device("spritegen2")->get_sprite_temp_bitmap(); + bitmap_ind16& sprite0_mix_bitmap = machine.device("spritegen1")->get_sprite_temp_bitmap(); + bitmap_ind16& sprite1_mix_bitmap = machine.device("spritegen2")->get_sprite_temp_bitmap(); /* Mix sprites into main bitmap, based on priority & alpha */ for (y=8; y<248; y++) { - UINT8* tilemapPri=BITMAP_ADDR8(machine.priority_bitmap, y, 0); - UINT16* sprite0=BITMAP_ADDR16(sprite0_mix_bitmap, y, 0); - UINT16* sprite1=BITMAP_ADDR16(sprite1_mix_bitmap, y, 0); - UINT32* destLine=BITMAP_ADDR32(bitmap, y, 0); - UINT16* alphaTilemap=BITMAP_ADDR16(state->m_tilemap_alpha_bitmap, y, 0); + UINT8* tilemapPri=&machine.priority_bitmap.pix8(y); + UINT16* sprite0=&sprite0_mix_bitmap.pix16(y); + UINT16* sprite1=&sprite1_mix_bitmap.pix16(y); + UINT32* destLine=&bitmap.pix32(y); + UINT16* alphaTilemap=&state->m_tilemap_alpha_bitmap->pix16(y); for (x=0; x<320; x++) { UINT16 priColAlphaPal0=sprite0[x]; @@ -854,12 +835,12 @@ } } -SCREEN_UPDATE( nslasher ) +SCREEN_UPDATE_RGB32( nslasher ) { - deco32_state *state = screen->machine().driver_data(); + deco32_state *state = screen.machine().driver_data(); int alphaTilemap=0; - state->m_deco_tilegen1 = screen->machine().device("tilegen1"); - state->m_deco_tilegen2 = screen->machine().device("tilegen2"); + state->m_deco_tilegen1 = screen.machine().device("tilegen1"); + state->m_deco_tilegen2 = screen.machine().device("tilegen2"); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); @@ -869,22 +850,22 @@ alphaTilemap=1; if (state->m_ace_ram_dirty) - updateAceRam(screen->machine()); + updateAceRam(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0x200]); + bitmap.fill(screen.machine().pens[0x200], cliprect); /* Draw sprites to temporary bitmaps, saving alpha & priority info for later mixing */ - screen->machine().device("spritegen1")->set_pix_raw_shift(8); - screen->machine().device("spritegen2")->set_pix_raw_shift(8); + screen.machine().device("spritegen1")->set_pix_raw_shift(8); + screen.machine().device("spritegen2")->set_pix_raw_shift(8); - screen->machine().device("spritegen1")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16_buffered, 0x800, true); - screen->machine().device("spritegen2")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram16_2_buffered, 0x800, true); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, state->m_spriteram16_buffered, 0x800, true); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, state->m_spriteram16_2_buffered, 0x800, true); /* Render alpha-blended tilemap to separate buffer for proper mixing */ - bitmap_fill(state->m_tilemap_alpha_bitmap,cliprect,0); + state->m_tilemap_alpha_bitmap->fill(0, cliprect); /* Draw playfields & sprites */ if (state->m_pri&2) @@ -899,7 +880,7 @@ { deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); if (alphaTilemap) - deco16ic_tilemap_1_draw(state->m_deco_tilegen2, state->m_tilemap_alpha_bitmap, cliprect, 0, 4); + deco16ic_tilemap_1_draw(state->m_deco_tilegen2, *state->m_tilemap_alpha_bitmap, cliprect, 0, 4); else deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 4); } @@ -907,13 +888,13 @@ { deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 2); if (alphaTilemap) - deco16ic_tilemap_2_draw(state->m_deco_tilegen1, state->m_tilemap_alpha_bitmap, cliprect, 0, 4); + deco16ic_tilemap_2_draw(state->m_deco_tilegen1, *state->m_tilemap_alpha_bitmap, cliprect, 0, 4); else deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); } } - mixDualAlphaSprites(bitmap, cliprect, screen->machine().gfx[3], screen->machine().gfx[4], alphaTilemap); + mixDualAlphaSprites(bitmap, cliprect, screen.machine().gfx[3], screen.machine().gfx[4], alphaTilemap); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; diff -Nru mame-0.144/src/mame/video/decocass.c mame-0.145/src/mame/video/decocass.c --- mame-0.144/src/mame/video/decocass.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decocass.c 2012-02-06 21:30:32.000000000 +0000 @@ -118,7 +118,7 @@ big object ********************************************/ -static void draw_object( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_object( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { decocass_state *state = machine.driver_data(); int sx, sy, color; @@ -141,7 +141,7 @@ drawgfx_transpen(bitmap, cliprect, machine.gfx[3], 1, color, 0, 1, sx, sy - 64, 0); } -static void draw_center( running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_center( running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { decocass_state *state = machine.driver_data(); int sx, sy, x, y, color; @@ -160,12 +160,12 @@ sx = (state->m_center_h_shift_space >> 2) & 0x3c; for (y = 0; y < 4; y++) - if ((sy + y) >= cliprect->min_y && (sy + y) <= cliprect->max_y) + if ((sy + y) >= cliprect.min_y && (sy + y) <= cliprect.max_y) { if (((sy + y) & state->m_color_center_bot & 3) == (sy & state->m_color_center_bot & 3)) for (x = 0; x < 256; x++) if (0 != (x & 16) || 0 != (state->m_center_h_shift_space & 1)) - *BITMAP_ADDR16(bitmap, sy + y, (sx + x) & 255) = color; + bitmap.pix16(sy + y, (sx + x) & 255) = color; } } @@ -198,23 +198,23 @@ { decocass_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( decocass_colorram_w ) { decocass_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static void mark_bg_tile_dirty( running_machine &machine, offs_t offset ) { decocass_state *state = machine.driver_data(); if (offset & 0x80) - tilemap_mark_tile_dirty(state->m_bg_tilemap_r, offset); + state->m_bg_tilemap_r->mark_tile_dirty(offset); else - tilemap_mark_tile_dirty(state->m_bg_tilemap_l, offset); + state->m_bg_tilemap_l->mark_tile_dirty(offset); } WRITE8_HANDLER( decocass_tileram_w ) @@ -318,11 +318,11 @@ if ((state->m_color_center_bot ^ data) & 0x80) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap_r); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap_l); + state->m_bg_tilemap_r->mark_all_dirty(); + state->m_bg_tilemap_l->mark_all_dirty(); } if ((state->m_color_center_bot ^ data) & 0x01) - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); state->m_color_center_bot = data; } @@ -391,7 +391,7 @@ memory handlers ********************************************/ -static void draw_sprites(running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int color, +static void draw_sprites(running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int color, int sprite_y_adjust, int sprite_y_adjust_flip_screen, UINT8 *sprite_ram, int interleave) { @@ -440,7 +440,7 @@ } -static void draw_missiles(running_machine &machine,bitmap_t *bitmap, const rectangle *cliprect, +static void draw_missiles(running_machine &machine,bitmap_ind16 &bitmap, const rectangle &cliprect, int missile_y_adjust, int missile_y_adjust_flip_screen, UINT8 *missile_ram, int interleave) { @@ -461,11 +461,11 @@ sy = 240 - sy + missile_y_adjust_flip_screen; } sy -= missile_y_adjust; - if (sy >= cliprect->min_y && sy <= cliprect->max_y) + if (sy >= cliprect.min_y && sy <= cliprect.max_y) for (x = 0; x < 4; x++) { - if (sx >= cliprect->min_x && sx <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, sy, sx) = (state->m_color_missiles >> 4) & 7; + if (sx >= cliprect.min_x && sx <= cliprect.max_x) + bitmap.pix16(sy, sx) = (state->m_color_missiles >> 4) & 7; sx++; } @@ -477,11 +477,11 @@ sy = 240 - sy + missile_y_adjust_flip_screen; } sy -= missile_y_adjust; - if (sy >= cliprect->min_y && sy <= cliprect->max_y) + if (sy >= cliprect.min_y && sy <= cliprect.max_y) for (x = 0; x < 4; x++) { - if (sx >= cliprect->min_x && sx <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, sy, sx) = state->m_color_missiles & 7; + if (sx >= cliprect.min_x && sx <= cliprect.max_x) + bitmap.pix16(sy, sx) = state->m_color_missiles & 7; sx++; } } @@ -495,9 +495,9 @@ state->m_bg_tilemap_r = tilemap_create(machine, get_bg_r_tile_info, bgvideoram_scan_cols, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, fgvideoram_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap_l, 0); - tilemap_set_transparent_pen(state->m_bg_tilemap_r, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap_l->set_transparent_pen(0); + state->m_bg_tilemap_r->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_bg_tilemap_l_clip = machine.primary_screen->visible_area(); state->m_bg_tilemap_l_clip.max_y = 256 / 2 - 1; @@ -519,23 +519,23 @@ gfx_element_decode(machine.gfx[2], 16); } -SCREEN_UPDATE( decocass ) +SCREEN_UPDATE_IND16( decocass ) { - decocass_state *state = screen->machine().driver_data(); + decocass_state *state = screen.machine().driver_data(); int scrollx, scrolly_l, scrolly_r; rectangle clip; - if (0xc0 != (input_port_read(screen->machine(), "IN2") & 0xc0)) /* coin slots assert an NMI */ + if (0xc0 != (input_port_read(screen.machine(), "IN2") & 0xc0)) /* coin slots assert an NMI */ device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, ASSERT_LINE); if (0 == (state->m_watchdog_flip & 0x04)) - watchdog_reset(screen->machine()); + watchdog_reset(screen.machine()); else if (state->m_watchdog_count-- > 0) - watchdog_reset(screen->machine()); + watchdog_reset(screen.machine()); #ifdef MAME_DEBUG { - if (screen->machine().input().code_pressed_once(KEYCODE_I)) + if (screen.machine().input().code_pressed_once(KEYCODE_I)) state->m_showmsg ^= 1; if (state->m_showmsg) popmessage("mode:$%02x cm:$%02x ccb:$%02x h:$%02x vl:$%02x vr:$%02x ph:$%02x pv:$%02x ch:$%02x cv:$%02x", @@ -552,7 +552,7 @@ } #endif - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); scrolly_l = state->m_back_vl_shift; scrolly_r = 256 - state->m_back_vr_shift; @@ -572,45 +572,45 @@ else scrolly_l += 256; - tilemap_set_scrollx(state->m_bg_tilemap_l, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap_l, 0, scrolly_l); + state->m_bg_tilemap_l->set_scrollx(0, scrollx); + state->m_bg_tilemap_l->set_scrolly(0, scrolly_l); - tilemap_set_scrollx(state->m_bg_tilemap_r, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap_r, 0, scrolly_r); + state->m_bg_tilemap_r->set_scrollx(0, scrollx); + state->m_bg_tilemap_r->set_scrolly(0, scrolly_r); if (state->m_mode_set & 0x08) /* bkg_ena on ? */ { clip = state->m_bg_tilemap_l_clip; - sect_rect(&clip, cliprect); - tilemap_draw(bitmap, &clip, state->m_bg_tilemap_l, TILEMAP_DRAW_OPAQUE, 0); + clip &= cliprect; + state->m_bg_tilemap_l->draw(bitmap, clip, TILEMAP_DRAW_OPAQUE, 0); clip = state->m_bg_tilemap_r_clip; - sect_rect(&clip, cliprect); - tilemap_draw(bitmap, &clip, state->m_bg_tilemap_r, TILEMAP_DRAW_OPAQUE, 0); + clip &= cliprect; + state->m_bg_tilemap_r->draw(bitmap, clip, TILEMAP_DRAW_OPAQUE, 0); } if (state->m_mode_set & 0x20) { - draw_object(screen->machine(), bitmap, cliprect); - draw_center(screen->machine(), bitmap, cliprect); + draw_object(screen.machine(), bitmap, cliprect); + draw_center(screen.machine(), bitmap, cliprect); } else { - draw_object(screen->machine(), bitmap, cliprect); - draw_center(screen->machine(), bitmap, cliprect); + draw_object(screen.machine(), bitmap, cliprect); + draw_center(screen.machine(), bitmap, cliprect); if (state->m_mode_set & 0x08) /* bkg_ena on ? */ { clip = state->m_bg_tilemap_l_clip; - sect_rect(&clip, cliprect); - tilemap_draw(bitmap, &clip, state->m_bg_tilemap_l, 0, 0); + clip &= cliprect; + state->m_bg_tilemap_l->draw(bitmap, clip, 0, 0); clip = state->m_bg_tilemap_r_clip; - sect_rect(&clip, cliprect); - tilemap_draw(bitmap, &clip, state->m_bg_tilemap_r, 0, 0); + clip &= cliprect; + state->m_bg_tilemap_r->draw(bitmap, clip, 0, 0); } } - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, (state->m_color_center_bot >> 1) & 1, 0, 0, state->m_fgvideoram, 0x20); - draw_missiles(screen->machine(), bitmap, cliprect, 1, 0, state->m_colorram, 0x20); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, (state->m_color_center_bot >> 1) & 1, 0, 0, state->m_fgvideoram, 0x20); + draw_missiles(screen.machine(), bitmap, cliprect, 1, 0, state->m_colorram, 0x20); return 0; } diff -Nru mame-0.144/src/mame/video/decocomn.c mame-0.145/src/mame/video/decocomn.c --- mame-0.144/src/mame/video/decocomn.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decocomn.c 2012-02-06 21:30:32.000000000 +0000 @@ -13,11 +13,8 @@ struct _decocomn_state { screen_device *screen; - UINT16 *raster_display_list; UINT8 *dirty_palette; - bitmap_t *sprite_priority_bitmap; UINT16 priority; - int raster_display_position; }; /***************************************************************************** @@ -113,88 +110,6 @@ /******************************************************************************/ -/*****************************************************************************************/ - -void decocomn_clear_sprite_priority_bitmap( device_t *device ) -{ - decocomn_state *decocomn = get_safe_token(device); - - if (decocomn->sprite_priority_bitmap) - bitmap_fill(decocomn->sprite_priority_bitmap, NULL, 0); -} - -/* A special pdrawgfx z-buffered sprite renderer that is needed to properly draw multiple sprite sources with alpha */ -void decocomn_pdrawgfx( - device_t *device, - bitmap_t *dest, const rectangle *clip, const gfx_element *gfx, - UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, - int transparent_color, UINT32 pri_mask, UINT32 sprite_mask, UINT8 write_pri, UINT8 alpha) -{ - decocomn_state *decocomn = get_safe_token(device); - int ox, oy, cx, cy; - int x_index, y_index, x, y; - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; - const pen_t *pal = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color % gfx->total_colors)]; - const UINT8 *code_base = gfx_element_get_data(gfx, code % gfx->total_elements); - - /* check bounds */ - ox = sx; - oy = sy; - - if (sx > 319 || sy > 247 || sx < -15 || sy < -7) - return; - - if (sy < 0) sy = 0; - if (sx < 0) sx = 0; - - if (sx > 319) cx = 319; - else cx = ox + 16; - - cy = (sy - oy); - - if (flipy) y_index = 15 - cy; else y_index = cy; - - for (y = 0; y < 16 - cy; y++) - { - const UINT8 *source = code_base + (y_index * gfx->line_modulo); - UINT32 *destb = BITMAP_ADDR32(dest, sy, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, sy, 0); - UINT8 *spri = BITMAP_ADDR8(decocomn->sprite_priority_bitmap, sy, 0); - - if (sy >= 0 && sy < 248) - { - if (flipx) { source += 15 - (sx - ox); x_index = -1; } - else { source += (sx - ox); x_index = 1; } - - for (x = sx; x < cx; x++) - { - int c = *source; - if (c != transparent_color && x >= 0 && x < 320) - { - if (pri_mask>pri[x] && sprite_mask>spri[x]) - { - if (alpha != 0xff) - destb[x] = alpha_blend_r32(destb[x], pal[c], alpha); - else - destb[x] = pal[c]; - if (write_pri) - pri[x] |= pri_mask; - } - spri[x] |= sprite_mask; - } - source += x_index; - } - } - - sy++; - if (sy > 247) - return; - if (flipy) y_index--; else y_index++; - } -} - -/*****************************************************************************************/ - /***************************************************************************** DEVICE INTERFACE *****************************************************************************/ @@ -203,31 +118,21 @@ { decocomn_state *decocomn = get_safe_token(device); const decocomn_interface *intf = get_interface(device); - int width, height; +// int width, height; decocomn->screen = device->machine().device(intf->screen); - width = decocomn->screen->width(); - height = decocomn->screen->height(); - - decocomn->sprite_priority_bitmap = auto_bitmap_alloc(device->machine(), width, height, BITMAP_FORMAT_INDEXED8); +// width = decocomn->screen->width(); +// height = decocomn->screen->height(); decocomn->dirty_palette = auto_alloc_array_clear(device->machine(), UINT8, 4096); - decocomn->raster_display_list = auto_alloc_array_clear(device->machine(), UINT16, 20 * 256 / 2); - - device->save_item(NAME(decocomn->priority)); - device->save_item(NAME(decocomn->raster_display_position)); device->save_pointer(NAME(decocomn->dirty_palette), 4096); - device->save_pointer(NAME(decocomn->raster_display_list), 20 * 256 / 2); } static DEVICE_RESET( decocomn ) { decocomn_state *decocomn = get_safe_token(device); - - decocomn->raster_display_position = 0; - decocomn->priority = 0; } diff -Nru mame-0.144/src/mame/video/decocomn.h mame-0.145/src/mame/video/decocomn.h --- mame-0.144/src/mame/video/decocomn.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decocomn.h 2012-02-06 21:30:32.000000000 +0000 @@ -46,12 +46,4 @@ READ16_DEVICE_HANDLER( decocomn_71_r ); -/* used by boogwing, dassault, nitrobal */ -void decocomn_clear_sprite_priority_bitmap(device_t *device); -void decocomn_pdrawgfx( - device_t *device, - bitmap_t *dest,const rectangle *clip,const gfx_element *gfx, - UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, - int transparent_color,UINT32 pri_mask,UINT32 sprite_mask,UINT8 write_pri,UINT8 alpha); - #endif diff -Nru mame-0.144/src/mame/video/deco_mlc.c mame-0.145/src/mame/video/deco_mlc.c --- mame-0.144/src/mame/video/deco_mlc.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/deco_mlc.c 2012-02-06 21:30:32.000000000 +0000 @@ -13,7 +13,7 @@ //extern int mlc_raster_table[9][256]; //extern UINT32 mlc_clipper[32]; -//static bitmap_t *temp_bitmap; +//static bitmap_rgb32 *temp_bitmap; /******************************************************************************/ @@ -27,19 +27,19 @@ else state->m_colour_mask=0x1f; -// temp_bitmap = auto_bitmap_alloc( machine, 512, 512, BITMAP_FORMAT_RGB32 ); +// temp_bitmap = auto_bitmap_rgb32_alloc( machine, 512, 512 ); state->m_mlc_buffered_spriteram = auto_alloc_array(machine, UINT32, 0x3000/4); } #ifdef UNUSED_FUNCTION -static void blitRaster(running_machine &machine, bitmap_t *bitmap, int rasterMode) +static void blitRaster(running_machine &machine, bitmap_rgb32 &bitmap, int rasterMode) { deco_mlc_state *state = machine.driver_data(); int x,y; for (y=0; y<256; y++) //todo { - UINT32* src=BITMAP_ADDR32(temp_bitmap, y&0x1ff, 0); - UINT32* dst=BITMAP_ADDR32(bitmap, y, 0); + UINT32* src=&temp_bitmap->pix32(y&0x1ff); + UINT32* dst=&bitmap.pix32(y); UINT32 xptr=(state->m_mlc_raster_table[0][y]<<13); if (machine.input().code_pressed(KEYCODE_X)) @@ -62,7 +62,7 @@ #endif static void mlc_drawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code1,UINT32 code2, UINT32 color,int flipx,int flipy,int sx,int sy, int transparent_color,int use8bpp, int scalex, int scaley,int alpha) @@ -79,20 +79,8 @@ */ /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); { if( gfx ) @@ -139,31 +127,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -178,7 +163,7 @@ { const UINT8 *source1 = code_base1 + (y_index>>16) * gfx->line_modulo; const UINT8 *source2 = code_base2 + (y_index>>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; @@ -205,7 +190,7 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x(); UINT32 *index_ptr=0; @@ -318,7 +303,7 @@ user_clip.min_x=state->m_mlc_clip_ram[(clipper*4)+2]; user_clip.max_x=state->m_mlc_clip_ram[(clipper*4)+3]; - sect_rect(&user_clip, cliprect); + user_clip &= cliprect; /* Any colours out of range (for the bpp value) trigger 'shadow' mode */ if (color & (state->m_colour_mask+1)) @@ -482,7 +467,7 @@ // rasterDirty=1; mlc_drawgfxzoom( - /*rasterMode ? temp_bitmap : */bitmap,&user_clip,machine.gfx[0], + /*rasterMode ? temp_bitmap : */bitmap,user_clip,machine.gfx[0], tile,tile2, color + colorOffset,fx,fy,xbase,ybase, 0, @@ -499,7 +484,7 @@ // if (lastRasterMode!=0 && rasterDirty) // { // blitRaster(machine, bitmap, rasterMode); -// bitmap_fill(temp_bitmap,cliprect,0); +// temp_bitmap->fill(0, cliprect); // rasterDirty=0; // } // lastRasterMode=rasterMode; @@ -509,21 +494,25 @@ } } -SCREEN_EOF( mlc ) +SCREEN_VBLANK( mlc ) { - deco_mlc_state *state = machine.driver_data(); - /* Spriteram is definitely double buffered, as the vram lookup tables - are often updated a frame after spriteram is setup to point to a new - lookup table. Without buffering incorrect one frame glitches are seen - in several places, especially in Hoops. - */ - memcpy(state->m_mlc_buffered_spriteram, state->m_spriteram, 0x3000); + // rising edge + if (vblank_on) + { + deco_mlc_state *state = screen.machine().driver_data(); + /* Spriteram is definitely double buffered, as the vram lookup tables + are often updated a frame after spriteram is setup to point to a new + lookup table. Without buffering incorrect one frame glitches are seen + in several places, especially in Hoops. + */ + memcpy(state->m_mlc_buffered_spriteram, state->m_spriteram, 0x3000); + } } -SCREEN_UPDATE( mlc ) +SCREEN_UPDATE_RGB32( mlc ) { -// bitmap_fill(temp_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0]); /* Pen 0 fill colour confirmed from Skull Fang level 2 */ - draw_sprites(screen->machine(),bitmap,cliprect); +// temp_bitmap->fill(0, cliprect); + bitmap.fill(screen.machine().pens[0], cliprect); /* Pen 0 fill colour confirmed from Skull Fang level 2 */ + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/decospr.c mame-0.145/src/mame/video/decospr.c --- mame-0.144/src/mame/video/decospr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/decospr.c 2012-02-06 21:30:31.000000000 +0000 @@ -1,11 +1,19 @@ /* Data East Sprite Chip DECO 52 - note, we have pri callbacks and checks to drop back to plain drawgfx because not all drivers are using pdrawgfx yet, they probably should be... - some games have different visible areas, but are confirmed as the same sprite chip. + This is a flexible implementation of the Data East Spite chip 52 emulation, used in a large number of drivers. - games with alpha aren't supported here yet, in most cases they need better mixing anyway, probably rendering to screen buffers and manual mixing. - see m_sprite_bitmap... (note, if using that you must also use BITMAP_FORMAT_RGB32 in the machine config) + Both list formats are supported (how is this selected on HW, external pin?) + + Support for rendering to a raw indexed 16-bitmap is available allowing you to do complex mixing, which is required + if a game uses alpha blending at the mixing stage. + + Basic callbacks priority and colour are supported for use with pdrawgfx if render-to-bitmap mode isn't being used. + + There is also a very simply 'drawgfx' path for games where the sprites are only of one priority level. + + Several features are included to support the various clone / bootleg chips derived from this device, it appears + to have been a popular base for Korean developers (much as the Tumble Pop code was) used by: @@ -22,20 +30,27 @@ cbuster.c (could probably use pdrawgfx, not m_sprite_bitmap) mirage.c (could probably use pdrawgfx, not m_sprite_bitmap) cninja.c + lemmings.c + deco32.c + rohga.c + dassault.c + boogwing.c + + (bootleg) esd16.c + (bootleg) nmg5.c + (bootleg) tumbleb.c + (bootleg) crospang.c - partially converted: - deco32.c - video mixing + to convert: - difficult to convert: - rohga.c - complex video mixing, 6bpp gfx.. - lemmings.c - priority stuff (plus sprites seem somewhat different anyway??) - dassault.c - complex video mixing - boogwing.c - complex video mixing + (any other bootleg / clone chips?) notes: does the chip natively support 5bpp (tattass / nslasher) in hw, or is it done with doubled up chips? the information in deco_tilegen1 lists 3x sprite chips on those games, but there are only 2 spritelists. + likewise Rohga appears to have 2x DECO52 for 1 list of 6bpp gfx. + */ @@ -98,7 +113,7 @@ ssssSSSS pppccccc s = size (height) -S = size (width) (double wings) +S = size (width) offs +3 -------- -------- @@ -109,13 +124,15 @@ todo: the priotity callback for using pdrawgfx should really pack those 8 bits, and pass them instead of currently just passing offs+2 which lacks the extra priority bit -todo: basic blend mixing - */ #include "emu.h" #include "decospr.h" +UINT16 decospr_default_colour_callback(UINT16 col) +{ + return (col >> 9) & 0x1f; +} void decospr_device::set_gfx_region(device_t &device, int gfxregion) { @@ -128,24 +145,34 @@ { decospr_device &dev = downcast(device); dev.m_pricallback = callback; -// printf("decospr_device::set_pri_callback()\n"); } +void decospr_device::set_col_callback(device_t &device, decospr_colour_callback_func callback) +{ + decospr_device &dev = downcast(device); + dev.m_colcallback = callback; +} + + const device_type DECO_SPRITE = &device_creator; decospr_device::decospr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, DECO_SPRITE, "decospr_device", tag, owner, clock), m_gfxregion(0), - m_pricallback(NULL) + m_pricallback(NULL), + m_colcallback(decospr_default_colour_callback), + m_is_bootleg(false), + m_x_offset(0), + m_y_offset(0), + m_flipallx(0), + m_transpen(0) { } void decospr_device::device_start() { -// sprite_kludge_x = sprite_kludge_y = 0; // printf("decospr_device::device_start()\n"); - m_sprite_bitmap = 0; m_alt_format = 0; m_pixmask = 0xf; m_raw_shift = 4; // set to 8 on tattass / nslashers for the custom mixing (because they have 5bpp sprites, and shifting by 4 isn't good enough) @@ -156,17 +183,9 @@ //printf("decospr_device::device_reset()\n"); } -/* -void decospr_device::decospr_sprite_kludge(int x, int y) -{ - sprite_kludge_x = x; - sprite_kludge_y = y; -} -*/ - -void decospr_device::alloc_sprite_bitmap(running_machine& machine) +void decospr_device::alloc_sprite_bitmap() { - m_sprite_bitmap = auto_bitmap_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height(), BITMAP_FORMAT_INDEXED16); + machine().primary_screen->register_screen_bitmap(m_sprite_bitmap); } void decospr_device::set_pri_callback(decospr_priority_callback_func callback) @@ -174,23 +193,27 @@ m_pricallback = callback; } +void decospr_device::set_col_callback(decospr_priority_callback_func callback) +{ + m_colcallback = callback; +} - -void decospr_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int sizewords, bool invert_flip ) +template +void decospr_device::draw_sprites_common(_BitmapClass &bitmap, const rectangle &cliprect, UINT16* spriteram, int sizewords, bool invert_flip ) { - //printf("cliprect %04x, %04x\n", cliprect->min_y, cliprect->max_y); + //printf("cliprect %04x, %04x\n", cliprect.min_y, cliprect.max_y); - if (m_sprite_bitmap && m_pricallback) + if (m_sprite_bitmap.valid() && m_pricallback) fatalerror("m_sprite_bitmap && m_pricallback is invalid"); - if (m_sprite_bitmap) - bitmap_fill(m_sprite_bitmap, cliprect, 0); + if (m_sprite_bitmap.valid()) + m_sprite_bitmap.fill(0, cliprect); int offs, end, incr; - int flipscreen = flip_screen_get(machine); + int flipscreen = flip_screen_get(machine()); if (invert_flip) flipscreen = !flipscreen; @@ -222,13 +245,15 @@ w = y & 0x0800; - if (!(flash && (machine.primary_screen->frame_number() & 1))) + if (!(flash && (machine().primary_screen->frame_number() & 1))) { x = spriteram[offs + 2]; - if (!m_sprite_bitmap) - colour = (x >> 9) & 0x1f; + if (!m_sprite_bitmap.valid()) + { + colour = m_colcallback(x); + } else { colour = (x >> 9) & 0x7f; @@ -245,7 +270,13 @@ fy = y & 0x4000; multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - if (cliprect->max_x>256) + /* bootleg support (esd16.c) */ + if (flipscreen) x = ((x&0x1ff) - m_x_offset)&0x1ff; + else x = ((x&0x1ff) + m_x_offset)&0x1ff; + y = ((y&0x1ff) + m_y_offset)&0x1ff; + + + if (cliprect.max_x>256) { x = x & 0x01ff; y = y & 0x01ff; @@ -265,10 +296,12 @@ x = 240 - x; } + //if (x <= 320) { + if (!m_is_bootleg) // several of the clone / bootleg chips don't do this, see jumpkids + sprite &= ~multi; - sprite &= ~multi; if (fy) inc = -1; else @@ -280,18 +313,23 @@ if (flipscreen) { y = 240 - y; + if (fy) fy = 0; else fy = 1; + mult = 16; + } + else + mult = -16; - if (cliprect->max_x>256) + if (flipscreen || m_flipallx) + { + if (cliprect.max_x>256) x = 304 - x; else x = 240 - x; if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; } - else - mult = -16; + + mult2 = multi + 1; @@ -299,64 +337,64 @@ { int ypos; ypos = y + mult * multi; - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y)-16)) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) { - if(!m_sprite_bitmap) + if(!m_sprite_bitmap.valid()) { - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y)-16)) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) { if (m_pricallback) - pdrawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + pdrawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite - multi * inc, colour, fx,fy, x,ypos, - machine.priority_bitmap,pri,0); + machine().priority_bitmap,pri,m_transpen); else - drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite - multi * inc, colour, fx,fy, x,ypos, - 0); + m_transpen); } // double wing uses this flag if (w) { if (m_pricallback) - pdrawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + pdrawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], (sprite - multi * inc)-mult2, colour, fx,fy, x-16,ypos, - machine.priority_bitmap,pri,0); + machine().priority_bitmap,pri,m_transpen); else - drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], (sprite - multi * inc)-mult2, colour, fx,fy, x-16,ypos, - 0); + m_transpen); } } else { // if we have a sprite bitmap draw raw data to it for manual mixing - drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine().gfx[m_gfxregion], sprite - multi * inc, colour<frame_number() & 1))) + if (!((y&0x2000) && (machine().primary_screen->frame_number() & 1))) { - if (!m_sprite_bitmap) + if (!m_sprite_bitmap.valid()) colour = (spriteram[offs+2] >>0) & 0x1f; else colour = (spriteram[offs+2] >>0) & 0xff; // store all bits for manual mixing @@ -423,32 +461,32 @@ for (int yy=0; yymax_y) && (ypos>=(cliprect->min_y)-16)) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) { - pdrawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + pdrawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour, fx,fy, - x + mult * (w-xx),ypos, - machine.priority_bitmap,pri,0); + x + mult * (w-xx),ypos, + machine().priority_bitmap,pri,m_transpen); } ypos -= 512; // wrap-around y - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y-16))) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) { - pdrawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + pdrawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour, fx,fy, x + mult * (w-xx),ypos, - machine.priority_bitmap,pri,0); + machine().priority_bitmap,pri,m_transpen); } } @@ -456,26 +494,26 @@ { ypos = y + mult2 * (h-yy); - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y)-16)) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) { - drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour, fx,fy, x + mult * (w-xx),ypos, - 0); + m_transpen); } ypos -= 512; // wrap-around y - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y-16))) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) { - drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen(bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour, fx,fy, x + mult * (w-xx),ypos, - 0); + m_transpen); } } } @@ -483,26 +521,26 @@ { ypos = y + mult2 * (h-yy); - if ((ypos<=cliprect->max_y) && (ypos>=(cliprect->min_y)-16)) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y)-16)) { - drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour<max_y) && (ypos>=(cliprect->min_y-16))) + if ((ypos<=cliprect.max_y) && (ypos>=(cliprect.min_y-16))) { - drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine.gfx[m_gfxregion], + drawgfx_transpen_raw(m_sprite_bitmap,cliprect,machine().gfx[m_gfxregion], sprite + yy + h * xx, colour<min_y;y<=cliprect->max_y;y++) + for (y=cliprect.min_y;y<=cliprect.max_y;y++) { - srcline= BITMAP_ADDR16(m_sprite_bitmap, y, 0); - dstline= BITMAP_ADDR32(bitmap, y, 0); + srcline= &m_sprite_bitmap.pix16(y); + dstline= &bitmap.pix32(y); if (alpha==0xff) { - for (x=cliprect->min_x;x<=cliprect->max_x;x++) + for (x=cliprect.min_x;x<=cliprect.max_x;x++) { UINT16 pix = srcline[x]; @@ -549,7 +593,7 @@ } else { - for (x=cliprect->min_x;x<=cliprect->max_x;x++) + for (x=cliprect.min_x;x<=cliprect.max_x;x++) { UINT16 pix = srcline[x]; diff -Nru mame-0.144/src/mame/video/decospr.h mame-0.145/src/mame/video/decospr.h --- mame-0.144/src/mame/video/decospr.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/decospr.h 2012-02-06 21:30:31.000000000 +0000 @@ -1,5 +1,6 @@ typedef UINT16 (*decospr_priority_callback_func)(UINT16 pri); +typedef UINT16 (*decospr_colour_callback_func)(UINT16 col); class decospr_device : public device_t { @@ -7,28 +8,71 @@ decospr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); static void set_gfx_region(device_t &device, int gfxregion); static void set_pri_callback(device_t &device, decospr_priority_callback_func callback); - //void decospr_sprite_kludge(int x, int y); - void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int sizewords, bool invert_flip = false ); + static void set_col_callback(device_t &device, decospr_colour_callback_func callback); + + static void set_is_bootleg(device_t &device, bool is_bootleg) + { + decospr_device &dev = downcast(device); + dev.m_is_bootleg = is_bootleg; + } + + static void set_offsets(device_t &device, int x_offset, int y_offset) + { + decospr_device &dev = downcast(device); + dev.m_x_offset = x_offset; + dev.m_y_offset = y_offset; + } + + static void set_flipallx(device_t &device, int flipallx) + { + decospr_device &dev = downcast(device); + dev.m_flipallx = flipallx; + } + + static void set_transpen(device_t &device, int transpen) + { + decospr_device &dev = downcast(device); + dev.m_transpen = transpen; + } + + + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16* spriteram, int sizewords, bool invert_flip = false ); + void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16* spriteram, int sizewords, bool invert_flip = false ); void set_pri_callback(decospr_priority_callback_func callback); + void set_col_callback(decospr_colour_callback_func callback); void set_gfxregion(int region) { m_gfxregion = region; }; void set_alt_format(bool alt) { m_alt_format = alt; }; void set_pix_mix_mask(UINT16 mask) { m_pixmask = mask; }; void set_pix_raw_shift(UINT16 shift) { m_raw_shift = shift; }; - void alloc_sprite_bitmap(running_machine& machine); - void inefficient_copy_sprite_bitmap(running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16 pri, UINT16 priority_mask, UINT16 colbase, UINT16 palmask, UINT8 alpha = 0xff); - bitmap_t* get_sprite_temp_bitmap(void) { return m_sprite_bitmap; }; + void set_is_bootleg(bool is_bootleg) { m_is_bootleg = is_bootleg; }; + void set_offsets(int x_offset, int y_offset) { m_x_offset = x_offset; m_y_offset = y_offset; }; + void set_flipallx(int flipallx) { m_flipallx = flipallx; }; + void set_transpen(int transpen) { m_transpen = transpen; }; + + void alloc_sprite_bitmap(); + void inefficient_copy_sprite_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 pri, UINT16 priority_mask, UINT16 colbase, UINT16 palmask, UINT8 alpha = 0xff); + bitmap_ind16& get_sprite_temp_bitmap() { assert(m_sprite_bitmap.valid()); return m_sprite_bitmap; }; protected: virtual void device_start(); virtual void device_reset(); UINT8 m_gfxregion; decospr_priority_callback_func m_pricallback; - bitmap_t *m_sprite_bitmap;// optional sprite bitmap (should be INDEXED16) + decospr_colour_callback_func m_colcallback; + bitmap_ind16 m_sprite_bitmap;// optional sprite bitmap (should be INDEXED16) bool m_alt_format; UINT16 m_pixmask; UINT16 m_raw_shift; -private: + // used by various bootleg / clone chips. + bool m_is_bootleg; // used by various bootlegs (disables masking of sprite tile number when multi-sprite is used) + int m_x_offset, m_y_offset; // used by various bootlegs + int m_flipallx; // used by esd16.c - hedpanio, multchmp , and nmg5.c + int m_transpen; // used by fncywld (tumbleb.c) + +private: + template + void draw_sprites_common(_BitmapClass &bitmap, const rectangle &cliprect, UINT16* spriteram, int sizewords, bool invert_flip); }; extern const device_type DECO_SPRITE; diff -Nru mame-0.144/src/mame/video/deniam.c mame-0.145/src/mame/video/deniam.c --- mame-0.144/src/mame/video/deniam.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/deniam.c 2012-02-06 21:30:32.000000000 +0000 @@ -112,8 +112,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, scan_pages, 8, 8, 128, 64); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); } @@ -134,9 +134,9 @@ for (i = 0; i < 4; i++) { if (state->m_bg_page[i] == page) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i * 0x800 + (offset & 0x7ff)); + state->m_bg_tilemap->mark_tile_dirty(i * 0x800 + (offset & 0x7ff)); if (state->m_fg_page[i] == page) - tilemap_mark_tile_dirty(state->m_fg_tilemap, i * 0x800 + (offset & 0x7ff)); + state->m_fg_tilemap->mark_tile_dirty(i * 0x800 + (offset & 0x7ff)); } } @@ -145,7 +145,7 @@ { deniam_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_textram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -214,7 +214,7 @@ * c | ---------------- | zoomy like in System 16? * e | ---------------- | */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { deniam_state *state = machine.driver_data(); int offs; @@ -269,12 +269,11 @@ { if (rom[i] & 0x0f) { - if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x && - y >= cliprect->min_y && y <= cliprect->max_y) + if (cliprect.contains(sx + x, y)) { - if ((*BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f); - *BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) = 8; + if ((machine.priority_bitmap.pix8(y, sx + x) & primask) == 0) + bitmap.pix16(y, sx + x) = color * 16 + (rom[i] & 0x0f); + machine.priority_bitmap.pix8(y, sx + x) = 8; } } x++; @@ -289,12 +288,11 @@ { if (rom[i] & 0xf0) { - if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x && - y >= cliprect->min_y && y <= cliprect->max_y) + if (cliprect.contains(sx + x, y)) { - if ((*BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16+(rom[i] >> 4); - *BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) = 8; + if ((machine.priority_bitmap.pix8(y, sx + x) & primask) == 0) + bitmap.pix16(y, sx + x) = color * 16+(rom[i] >> 4); + machine.priority_bitmap.pix8(y, sx + x) = 8; } } x++; @@ -313,12 +311,11 @@ { if (rom[i] & 0xf0) { - if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x && - y >= cliprect->min_y && y <= cliprect->max_y) + if (cliprect.contains(sx + x, y)) { - if ((*BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] >> 4); - *BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) = 8; + if ((machine.priority_bitmap.pix8(y, sx + x) & primask) == 0) + bitmap.pix16(y, sx + x) = color * 16 + (rom[i] >> 4); + machine.priority_bitmap.pix8(y, sx + x) = 8; } } x++; @@ -333,12 +330,11 @@ { if (rom[i] & 0x0f) { - if (sx + x >= cliprect->min_x && sx + x <= cliprect->max_x && - y >= cliprect->min_y && y <= cliprect->max_y) + if (cliprect.contains(sx + x, y)) { - if ((*BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) & primask) == 0) - *BITMAP_ADDR16(bitmap, y, sx + x) = color * 16 + (rom[i] & 0x0f); - *BITMAP_ADDR8(machine.priority_bitmap, y, sx + x) = 8; + if ((machine.priority_bitmap.pix8(y, sx + x) & primask) == 0) + bitmap.pix16(y, sx + x) = color * 16 + (rom[i] & 0x0f); + machine.priority_bitmap.pix8(y, sx + x) = 8; } } x++; @@ -360,7 +356,7 @@ { state->m_bg_page[page] = value; for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; tile_index++) - tilemap_mark_tile_dirty(state->m_bg_tilemap, tile_index); + state->m_bg_tilemap->mark_tile_dirty(tile_index); } } @@ -373,13 +369,13 @@ { state->m_fg_page[page] = value; for (tile_index = page * 0x800; tile_index < (page + 1) * 0x800; tile_index++) - tilemap_mark_tile_dirty(state->m_fg_tilemap, tile_index); + state->m_fg_tilemap->mark_tile_dirty(tile_index); } } -SCREEN_UPDATE( deniam ) +SCREEN_UPDATE_IND16( deniam ) { - deniam_state *state = screen->machine().driver_data(); + deniam_state *state = screen.machine().driver_data(); int bg_scrollx, bg_scrolly, fg_scrollx, fg_scrolly; int page; @@ -389,30 +385,30 @@ bg_scrollx = state->m_textram[state->m_bg_scrollx_reg] - state->m_bg_scrollx_offs; bg_scrolly = (state->m_textram[state->m_bg_scrolly_reg] & 0xff) - state->m_bg_scrolly_offs; page = state->m_textram[state->m_bg_page_reg]; - set_bg_page(screen->machine(), 3, (page >>12) & 0x0f); - set_bg_page(screen->machine(), 2, (page >> 8) & 0x0f); - set_bg_page(screen->machine(), 1, (page >> 4) & 0x0f); - set_bg_page(screen->machine(), 0, (page >> 0) & 0x0f); + set_bg_page(screen.machine(), 3, (page >>12) & 0x0f); + set_bg_page(screen.machine(), 2, (page >> 8) & 0x0f); + set_bg_page(screen.machine(), 1, (page >> 4) & 0x0f); + set_bg_page(screen.machine(), 0, (page >> 0) & 0x0f); fg_scrollx = state->m_textram[state->m_fg_scrollx_reg] - state->m_fg_scrollx_offs; fg_scrolly = (state->m_textram[state->m_fg_scrolly_reg] & 0xff) - state->m_fg_scrolly_offs; page = state->m_textram[state->m_fg_page_reg]; - set_fg_page(screen->machine(), 3, (page >>12) & 0x0f); - set_fg_page(screen->machine(), 2, (page >> 8) & 0x0f); - set_fg_page(screen->machine(), 1, (page >> 4) & 0x0f); - set_fg_page(screen->machine(), 0, (page >> 0) & 0x0f); - - tilemap_set_scrollx(state->m_bg_tilemap, 0, bg_scrollx & 0x1ff); - tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_scrolly & 0x0ff); - tilemap_set_scrollx(state->m_fg_tilemap, 0, fg_scrollx & 0x1ff); - tilemap_set_scrolly(state->m_fg_tilemap, 0, fg_scrolly & 0x0ff); - - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + set_fg_page(screen.machine(), 3, (page >>12) & 0x0f); + set_fg_page(screen.machine(), 2, (page >> 8) & 0x0f); + set_fg_page(screen.machine(), 1, (page >> 4) & 0x0f); + set_fg_page(screen.machine(), 0, (page >> 0) & 0x0f); + + state->m_bg_tilemap->set_scrollx(0, bg_scrollx & 0x1ff); + state->m_bg_tilemap->set_scrolly(0, bg_scrolly & 0x0ff); + state->m_fg_tilemap->set_scrollx(0, fg_scrollx & 0x1ff); + state->m_fg_tilemap->set_scrolly(0, fg_scrolly & 0x0ff); + + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/dietgo.c mame-0.145/src/mame/video/dietgo.c --- mame-0.144/src/mame/video/dietgo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dietgo.c 2012-02-06 21:30:31.000000000 +0000 @@ -3,19 +3,19 @@ #include "includes/dietgo.h" #include "video/decospr.h" -SCREEN_UPDATE( dietgo ) +SCREEN_UPDATE_IND16( dietgo ) { - dietgo_state *state = screen->machine().driver_data(); + dietgo_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 256); /* not verified */ + bitmap.fill(256, cliprect); /* not verified */ deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); return 0; } diff -Nru mame-0.144/src/mame/video/digdug.c mame-0.145/src/mame/video/digdug.c --- mame-0.144/src/mame/video/digdug.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/digdug.c 2012-02-06 21:30:31.000000000 +0000 @@ -149,7 +149,7 @@ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan, 8,8,36,28); state->m_fg_tilemap = tilemap_create(machine, tx_get_tile_info,tilemap_scan,8,8,36,28); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->save_item(NAME(state->m_bg_select)); state->save_item(NAME(state->m_tx_color_mode)); @@ -170,7 +170,7 @@ digdug_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( digdug_PORT_w ) @@ -188,7 +188,7 @@ if ((state->m_bg_select & mask) != ((data & 1) << shift)) { state->m_bg_select = (state->m_bg_select & ~mask) | ((data & 1) << shift); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } break; @@ -197,7 +197,7 @@ if (state->m_tx_color_mode != (data & 1)) { state->m_tx_color_mode = data & 1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } break; @@ -205,7 +205,7 @@ if (state->m_bg_disable != (data & 1)) { state->m_bg_disable = data & 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } break; @@ -218,7 +218,7 @@ if ((state->m_bg_color_bank & mask) != ((data & 1) << shift)) { state->m_bg_color_bank = (state->m_bg_color_bank & ~mask) | ((data & 1) << shift); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } break; @@ -240,13 +240,7 @@ ***************************************************************************/ -static const rectangle spritevisiblearea = -{ - 2*8, 34*8-1, - 0*8, 28*8-1 -}; - -static void draw_sprites(running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { digdug_state *state = machine.driver_data(); UINT8 *spriteram = state->m_digdug_objram + 0x380; @@ -254,6 +248,16 @@ UINT8 *spriteram_3 = state->m_digdug_flpram + 0x380; int offs; + // mask upper and lower columns + rectangle visarea = cliprect; + visarea.min_x = 2*8; + visarea.max_x = 34*8-1; + if (flip_screen_get(machine)) + { + visarea.min_x += 12*8; + visarea.max_x += 12*8; + } + for (offs = 0;offs < 0x80;offs += 2) { static const int gfx_offs[2][2] = @@ -280,7 +284,8 @@ { flipx ^= 1; flipy ^= 1; - sy += 48; + sy += 40; + sx += 96; } for (y = 0;y <= size;y++) @@ -288,13 +293,13 @@ for (x = 0;x <= size;x++) { UINT32 transmask = colortable_get_transpen_mask(machine.colortable, machine.gfx[1], color, 0x1f); - drawgfx_transmask(bitmap,&spritevisiblearea,machine.gfx[1], + drawgfx_transmask(bitmap,visarea,machine.gfx[1], sprite + gfx_offs[y ^ (size * flipy)][x ^ (size * flipx)], color, flipx,flipy, ((sx + 16*x) & 0xff), sy + 16*y,transmask); /* wraparound */ - drawgfx_transmask(bitmap,&spritevisiblearea,machine.gfx[1], + drawgfx_transmask(bitmap,visarea,machine.gfx[1], sprite + gfx_offs[y ^ (size * flipy)][x ^ (size * flipx)], color, flipx,flipy, @@ -305,12 +310,12 @@ } -SCREEN_UPDATE( digdug ) +SCREEN_UPDATE_IND16( digdug ) { - digdug_state *state = screen->machine().driver_data(); + digdug_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/djboy.c mame-0.145/src/mame/video/djboy.c --- mame-0.144/src/mame/video/djboy.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/djboy.c 2012-02-06 21:30:31.000000000 +0000 @@ -37,7 +37,7 @@ djboy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_background, offset & 0x7ff); + state->m_background->mark_tile_dirty(offset & 0x7ff); } VIDEO_START( djboy ) @@ -58,7 +58,7 @@ palette_set_color_rgb(space->machine(), offset / 2, pal4bit(val >> 8), pal4bit(val >> 4), pal4bit(val >> 0)); } -SCREEN_UPDATE( djboy ) +SCREEN_UPDATE_IND16( djboy ) { /** * xx------ msb x @@ -66,23 +66,27 @@ * ---x---- flipscreen? * ----xxxx ROM bank */ - djboy_state *state = screen->machine().driver_data(); + djboy_state *state = screen.machine().driver_data(); int scroll; scroll = state->m_scrollx | ((state->m_videoreg & 0xc0) << 2); - tilemap_set_scrollx(state->m_background, 0, scroll - 0x391); + state->m_background->set_scrollx(0, scroll - 0x391); scroll = state->m_scrolly | ((state->m_videoreg & 0x20) << 3); - tilemap_set_scrolly(state->m_background, 0, scroll); + state->m_background->set_scrolly(0, scroll); - tilemap_draw(bitmap, cliprect, state->m_background, 0, 0); + state->m_background->draw(bitmap, cliprect, 0, 0); pandora_update(state->m_pandora, bitmap, cliprect); return 0; } -SCREEN_EOF( djboy ) +SCREEN_VBLANK( djboy ) { - djboy_state *state = machine.driver_data(); - pandora_eof(state->m_pandora); + // rising edge + if (vblank_on) + { + djboy_state *state = screen.machine().driver_data(); + pandora_eof(state->m_pandora); + } } diff -Nru mame-0.144/src/mame/video/djmain.c mame-0.145/src/mame/video/djmain.c --- mame-0.144/src/mame/video/djmain.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/djmain.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,7 +12,7 @@ -static void draw_sprites(running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine& machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { djmain_state *state = machine.driver_data(); device_t *k055555 = machine.device("k055555"); @@ -143,10 +143,10 @@ k056832_set_layer_offs(k056832, 1, -88, -27); } -SCREEN_UPDATE( djmain ) +SCREEN_UPDATE_RGB32( djmain ) { - device_t *k056832 = screen->machine().device("k056832"); - device_t *k055555 = screen->machine().device("k055555"); + device_t *k056832 = screen.machine().device("k056832"); + device_t *k055555 = screen.machine().device("k055555"); int enables = k055555_read_register(k055555, K55_INPUT_ENABLES); int pri[NUM_LAYERS + 1]; int order[NUM_LAYERS + 1]; @@ -169,7 +169,7 @@ order[j] = temp; } - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); for (i = 0; i < NUM_LAYERS + 1; i++) { @@ -178,7 +178,7 @@ if (layer == NUM_LAYERS) { if (enables & K55_INP_SUB2) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); } else { diff -Nru mame-0.144/src/mame/video/dkong.c mame-0.145/src/mame/video/dkong.c --- mame-0.144/src/mame/video/dkong.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dkong.c 2012-02-06 21:30:31.000000000 +0000 @@ -479,7 +479,7 @@ if (state->m_video_ram[offset] != data) { state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } } @@ -490,7 +490,7 @@ if (state->m_gfx_bank != (data & 0x01)) { state->m_gfx_bank = data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -501,7 +501,7 @@ if (state->m_gfx_bank != (~data & 0x01)) { state->m_gfx_bank = ~data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -520,7 +520,7 @@ if (state->m_palette_bank != newbank) { state->m_palette_bank = newbank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -555,16 +555,16 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 mask_bank, UINT32 shift_bits) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 mask_bank, UINT32 shift_bits) { dkong_state *state = machine.driver_data(); int offs; int scanline_vf; /* buffering scanline including flip */ - int scanline_vfc; /* line buffering scanline including flip - this is the cached scanline_vf*/ + int scanline_vfc; /* line buffering scanline including flip - this is the cached scanline_vf */ int scanline; /* current scanline */ int add_y; int add_x; @@ -607,9 +607,9 @@ * */ - scanline_vf = (cliprect->max_y - 1) & 0xFF; - scanline_vfc = (cliprect->max_y - 1) & 0xFF; - scanline = cliprect->max_y & 0xFF; + scanline_vf = (cliprect.max_y - 1) & 0xFF; + scanline_vfc = (cliprect.max_y - 1) & 0xFF; + scanline = cliprect.max_y & 0xFF; if (state->m_flip) { @@ -637,34 +637,29 @@ /* has similar hardware, uses a memory mapped port to change */ /* palette bank, so it's limited to 16 color codes) */ - int x = state->m_sprite_ram[offs + 3]; + int code = (state->m_sprite_ram[offs + 1] & 0x7f) + ((state->m_sprite_ram[offs + 2] & mask_bank) << shift_bits); + int color = (state->m_sprite_ram[offs + 2] & 0x0f) + 16 * state->m_palette_bank; + int flipx = state->m_sprite_ram[offs + 2] & 0x80; + int flipy = state->m_sprite_ram[offs + 1] & 0x80; /* On the real board, the x and y are read inverted after the first * buffer stage. This due to the fact that the 82S09 delivers complements * of stored data on read! */ - x = (x + add_x + 1) & 0xFF; - if (state->m_flip) - x ^= 0xFF; - y = (y + add_y + 1 + scanline_vfc) & 0x0F; - + int x = (state->m_sprite_ram[offs + 3] + add_x + 1) & 0xFF; if (state->m_flip) { - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - (state->m_sprite_ram[offs + 1] & 0x7f) + ((state->m_sprite_ram[offs + 2] & mask_bank) << shift_bits), - (state->m_sprite_ram[offs + 2] & 0x0f) + 16 * state->m_palette_bank, - !(state->m_sprite_ram[offs + 2] & 0x80),(state->m_sprite_ram[offs + 1] & 0x80), - x-15, scanline-y,0); - } - else - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], - (state->m_sprite_ram[offs + 1] & 0x7f) + ((state->m_sprite_ram[offs + 2] & mask_bank) << shift_bits), - (state->m_sprite_ram[offs + 2] & 0x0f) + 16 * state->m_palette_bank, - (state->m_sprite_ram[offs + 2] & 0x80),(state->m_sprite_ram[offs + 1] & 0x80), - x, scanline-y,0); + x = (x ^ 0xFF) - 15; + flipx = !flipx; } + y = scanline - ((y + add_y + 1 + scanline_vfc) & 0x0F); + + drawgfx_transpen(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, x, y, 0); + + // wraparound + drawgfx_transpen(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, state->m_flip ? x + 256 : x - 256, y, 0); + drawgfx_transpen(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, x, y - 256, 0); num_sprt++; } @@ -805,7 +800,7 @@ } -static void radarscp_draw_background(running_machine &machine, dkong_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void radarscp_draw_background(running_machine &machine, dkong_state *state, bitmap_ind16 &bitmap, const rectangle &cliprect) { const UINT8 *htable = NULL; int x,y; @@ -815,18 +810,18 @@ if (state->m_hardware_type == HARDWARE_TRS01) htable = state->m_gfx4; - y = cliprect->min_y; - while (y <= cliprect->max_y) + y = cliprect.min_y; + while (y <= cliprect.max_y) { - x = cliprect->min_x; - while (x <= cliprect->max_x) + x = cliprect.min_x; + while (x <= cliprect.max_x) { - pixel = BITMAP_ADDR16(bitmap, y, x); + pixel = &bitmap.pix16(y, x); draw_ok = !(*pixel & 0x01) && !(*pixel & 0x02); if (state->m_hardware_type == HARDWARE_TRS01) /* Check again from schematics */ draw_ok = draw_ok && !((htable[ (!state->m_rflip_sig<<7) | (x>>2)] >>2) & 0x01); if (draw_ok) - *pixel = *(BITMAP_ADDR16(state->m_bg_bits, y, x)); + *pixel = *(&state->m_bg_bits.pix16(y, x)); x++; } y++; @@ -850,7 +845,7 @@ x = 0; while (x < machine.primary_screen->width()) { - pixel = BITMAP_ADDR16(state->m_bg_bits, y, x); + pixel = &state->m_bg_bits.pix16(y, x); if ((state->m_counter < table_len) && (x == 4 * (table[state->m_counter|offset] & 0x7f))) { if ( state->m_star_ff && (table[state->m_counter|offset] & 0x80) ) /* star */ @@ -947,20 +942,20 @@ switch (state->m_hardware_type) { case HARDWARE_TRS02: - state->m_bg_bits = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bg_bits); state->m_gfx3 = machine.region("gfx3")->base(); state->m_gfx3_len = machine.region("gfx3")->bytes(); /* fall through */ case HARDWARE_TKG04: case HARDWARE_TKG02: state->m_bg_tilemap = tilemap_create(machine, dkong_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 128); + state->m_bg_tilemap->set_scrolldx(0, 128); break; case HARDWARE_TRS01: state->m_bg_tilemap = tilemap_create(machine, radarscp1_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 128); + state->m_bg_tilemap->set_scrolldx(0, 128); - state->m_bg_bits = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bg_bits); state->m_gfx4 = machine.region("gfx4")->base(); state->m_gfx3 = machine.region("gfx3")->base(); state->m_gfx3_len = machine.region("gfx3")->bytes(); @@ -971,27 +966,27 @@ } } -SCREEN_UPDATE( dkong ) +SCREEN_UPDATE_IND16( dkong ) { - dkong_state *state = screen->machine().driver_data(); + dkong_state *state = screen.machine().driver_data(); - tilemap_set_flip_all(screen->machine(), state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_flip ? 0 : 0); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_flip ? -8 : 0); + screen.machine().tilemap().set_flip_all(state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_scrollx(0, state->m_flip ? 0 : 0); + state->m_bg_tilemap->set_scrolly(0, state->m_flip ? -8 : 0); switch (state->m_hardware_type) { case HARDWARE_TKG02: case HARDWARE_TKG04: - check_palette(screen->machine()); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x40, 1); + check_palette(screen.machine()); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x40, 1); break; case HARDWARE_TRS01: case HARDWARE_TRS02: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x40, 1); - radarscp_draw_background(screen->machine(), state, bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x40, 1); + radarscp_draw_background(screen.machine(), state, bitmap, cliprect); break; default: fatalerror("Invalid hardware type in dkong_video_update"); @@ -999,19 +994,19 @@ return 0; } -SCREEN_UPDATE( pestplce ) +SCREEN_UPDATE_IND16( pestplce ) { - dkong_state *state = screen->machine().driver_data(); + dkong_state *state = screen.machine().driver_data(); int offs; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* Draw the sprites. */ for (offs = 0;offs < state->m_sprite_ram_size;offs += 4) { if (state->m_sprite_ram[offs]) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], state->m_sprite_ram[offs + 2], (state->m_sprite_ram[offs + 1] & 0x0f) + 16 * state->m_palette_bank, state->m_sprite_ram[offs + 1] & 0x80,state->m_sprite_ram[offs + 1] & 0x40, @@ -1021,13 +1016,13 @@ return 0; } -SCREEN_UPDATE( spclforc ) +SCREEN_UPDATE_IND16( spclforc ) { - dkong_state *state = screen->machine().driver_data(); + dkong_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* it uses sprite_ram[offs + 2] & 0x10 for sprite bank */ - draw_sprites(screen->machine(), bitmap, cliprect, 0x10, 3); + draw_sprites(screen.machine(), bitmap, cliprect, 0x10, 3); return 0; } diff -Nru mame-0.144/src/mame/video/docastle.c mame-0.145/src/mame/video/docastle.c --- mame-0.144/src/mame/video/docastle.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/docastle.c 2012-02-06 21:30:32.000000000 +0000 @@ -66,21 +66,21 @@ { docastle_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_do_tilemap, offset); + state->m_do_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( docastle_colorram_w ) { docastle_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_do_tilemap, offset); + state->m_do_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( docastle_flipscreen_off_r ) { docastle_state *state = space->machine().driver_data(); flip_screen_set(space->machine(), 0); - tilemap_mark_all_tiles_dirty(state->m_do_tilemap); + state->m_do_tilemap->mark_all_dirty(); return 0; } @@ -88,7 +88,7 @@ { docastle_state *state = space->machine().driver_data(); flip_screen_set(space->machine(), 1); - tilemap_mark_all_tiles_dirty(state->m_do_tilemap); + state->m_do_tilemap->mark_all_dirty(); return 1; } @@ -96,14 +96,14 @@ { docastle_state *state = space->machine().driver_data(); flip_screen_set(space->machine(), 0); - tilemap_mark_all_tiles_dirty(state->m_do_tilemap); + state->m_do_tilemap->mark_all_dirty(); } WRITE8_HANDLER( docastle_flipscreen_on_w ) { docastle_state *state = space->machine().driver_data(); flip_screen_set(space->machine(), 1); - tilemap_mark_all_tiles_dirty(state->m_do_tilemap); + state->m_do_tilemap->mark_all_dirty(); } static TILE_GET_INFO( get_tile_info ) @@ -119,7 +119,7 @@ { docastle_state *state = machine.driver_data(); state->m_do_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transmask(state->m_do_tilemap, 0, tile_transmask, 0x0000); + state->m_do_tilemap->set_transmask(0, tile_transmask, 0x0000); } VIDEO_START( docastle ) @@ -132,12 +132,12 @@ video_start_common(machine, 0xff00); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { docastle_state *state = machine.driver_data(); int offs; - bitmap_fill(machine.priority_bitmap, NULL, 1); + machine.priority_bitmap.fill(1); for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) { @@ -224,12 +224,12 @@ } } -SCREEN_UPDATE( docastle ) +SCREEN_UPDATE_IND16( docastle ) { - docastle_state *state = screen->machine().driver_data(); + docastle_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_do_tilemap, TILEMAP_DRAW_OPAQUE, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_do_tilemap, TILEMAP_DRAW_LAYER0, 0); + state->m_do_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_do_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/dogfgt.c mame-0.145/src/mame/video/dogfgt.c --- mame-0.144/src/mame/video/dogfgt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dogfgt.c 2012-02-06 21:30:33.000000000 +0000 @@ -73,8 +73,8 @@ state->m_bitmapram = auto_alloc_array(machine, UINT8, BITMAPRAM_SIZE); state->save_pointer(NAME(state->m_bitmapram), BITMAPRAM_SIZE); - state->m_pixbitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->save_item(NAME(*state->m_pixbitmap)); + machine.primary_screen->register_screen_bitmap(state->m_pixbitmap); + state->save_item(NAME(state->m_pixbitmap)); } @@ -123,9 +123,9 @@ color |= ((state->m_bitmapram[offset + BITMAPRAM_SIZE / 3 * i] >> subx) & 1) << i; if (flip_screen_get(space->machine())) - *BITMAP_ADDR16(state->m_pixbitmap, y ^ 0xff, (x + subx) ^ 0xff) = PIXMAP_COLOR_BASE + 8 * state->m_pixcolor + color; + state->m_pixbitmap.pix16(y ^ 0xff, (x + subx) ^ 0xff) = PIXMAP_COLOR_BASE + 8 * state->m_pixcolor + color; else - *BITMAP_ADDR16(state->m_pixbitmap, y, x + subx) = PIXMAP_COLOR_BASE + 8 * state->m_pixcolor + color; + state->m_pixbitmap.pix16(y, x + subx) = PIXMAP_COLOR_BASE + 8 * state->m_pixcolor + color; } } @@ -147,7 +147,7 @@ dogfgt_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( dogfgt_scroll_w ) @@ -155,8 +155,8 @@ dogfgt_state *state = space->machine().driver_data(); state->m_scroll[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll[0] + 256 * state->m_scroll[1] + 256); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll[2] + 256 * state->m_scroll[3]); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll[0] + 256 * state->m_scroll[1] + 256); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll[2] + 256 * state->m_scroll[3]); } WRITE8_HANDLER( dogfgt_1800_w ) @@ -184,7 +184,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { dogfgt_state *state = machine.driver_data(); int offs; @@ -217,16 +217,16 @@ } -SCREEN_UPDATE( dogfgt ) +SCREEN_UPDATE_IND16( dogfgt ) { - dogfgt_state *state = screen->machine().driver_data(); + dogfgt_state *state = screen.machine().driver_data(); int offs; - if (state->m_lastflip != flip_screen_get(screen->machine()) || state->m_lastpixcolor != state->m_pixcolor) + if (state->m_lastflip != flip_screen_get(screen.machine()) || state->m_lastpixcolor != state->m_pixcolor) { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - state->m_lastflip = flip_screen_get(screen->machine()); + state->m_lastflip = flip_screen_get(screen.machine()); state->m_lastpixcolor = state->m_pixcolor; for (offs = 0; offs < BITMAPRAM_SIZE; offs++) @@ -234,9 +234,9 @@ } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); copybitmap_trans(bitmap, state->m_pixbitmap, 0, 0, 0, 0, cliprect, PIXMAP_COLOR_BASE + 8 * state->m_pixcolor); return 0; diff -Nru mame-0.144/src/mame/video/dooyong.c mame-0.145/src/mame/video/dooyong.c --- mame-0.144/src/mame/video/dooyong.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/dooyong.c 2012-02-06 21:30:31.000000000 +0000 @@ -11,19 +11,19 @@ if (map != NULL) switch (offset) { case 0: /* Low byte of x scroll - scroll tilemap */ - tilemap_set_scrollx(map, 0, data); + map->set_scrollx(0, data); break; case 1: /* High byte of x scroll - mark tilemap dirty so new tile gfx will be loaded */ - tilemap_mark_all_tiles_dirty(map); + map->mark_all_dirty(); break; case 3: /* Low byte of y scroll */ case 4: /* High byte of y scroll */ - tilemap_set_scrolly(map, 0, (int)scroll[3] | ((int)scroll[4] << 8)); + map->set_scrolly(0, (int)scroll[3] | ((int)scroll[4] << 8)); break; case 6: /* Tilemap enable and mode control */ - tilemap_set_enable(map, !(data & 0x10)); + map->enable(!(data & 0x10)); if ((data & 0x20) != (old & 0x20)) // This sets the tilemap data format - tilemap_mark_all_tiles_dirty(map); + map->mark_all_dirty(); break; default: /* Other addresses are used but function is unknown */ /* 0x05 and 0x07 are initialised on startup */ @@ -102,9 +102,9 @@ { state->m_txvideoram[offset] = data; if (state->m_tx_tilemap_mode == 0) - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x07ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x07ff); else - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset >> 1); + state->m_tx_tilemap->mark_tile_dirty(offset >> 1); } } @@ -213,7 +213,7 @@ when the x scroll moves out of range (trying to decode the whole lot at once uses hundreds of megabytes of RAM). */ -INLINE void lastday_get_tile_info(running_machine &machine, tile_data *tileinfo, int tile_index, +INLINE void lastday_get_tile_info(running_machine &machine, tile_data &tileinfo, int tile_index, const UINT8 *tilerom, UINT8 *scroll, int graphics) { int offs = (tile_index + ((int)scroll[1] << 6)) * 2; @@ -251,7 +251,7 @@ SET_TILE_INFO(graphics, code, color, flags); } -INLINE void rshark_get_tile_info(running_machine &machine, tile_data *tileinfo, int tile_index, +INLINE void rshark_get_tile_info(running_machine &machine, tile_data &tileinfo, int tile_index, const UINT8 *tilerom1, const UINT8 *tilerom2, UINT8 *scroll, int graphics) { /* Tiles take two bytes in tile ROM 1: @@ -350,7 +350,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pollux_extensions) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pollux_extensions) { /* Sprites take 32 bytes each in memory: MSB LSB @@ -440,7 +440,7 @@ } } -static void rshark_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void rshark_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT16 *buffered_spriteram16 = machine.generic.buffered_spriteram.u16; @@ -512,123 +512,123 @@ } -SCREEN_UPDATE( lastday ) +SCREEN_UPDATE_IND16( lastday ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); if (!state->m_sprites_disabled) - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); return 0; } -SCREEN_UPDATE( gulfstrm ) +SCREEN_UPDATE_IND16( gulfstrm ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); return 0; } -SCREEN_UPDATE( pollux ) +SCREEN_UPDATE_IND16( pollux ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 2); return 0; } -SCREEN_UPDATE( flytiger ) +SCREEN_UPDATE_IND16( flytiger ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_flytiger_pri) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 2); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 2); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); } - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 4); + draw_sprites(screen.machine(), bitmap, cliprect, 4); return 0; } -SCREEN_UPDATE( bluehawk ) +SCREEN_UPDATE_IND16( bluehawk ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_fg2_tilemap, 0, 4); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_fg2_tilemap->draw(bitmap, cliprect, 0, 4); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 3); + draw_sprites(screen.machine(), bitmap, cliprect, 3); return 0; } -SCREEN_UPDATE( primella ) +SCREEN_UPDATE_IND16( primella ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - if (state->m_tx_pri) tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - if (!state->m_tx_pri) tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + if (state->m_tx_pri) state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + if (!state->m_tx_pri) state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( rshark ) +SCREEN_UPDATE_IND16( rshark ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, (state->m_rshark_pri ? 2 : 1)); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_fg2_tilemap, 0, 2); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, (state->m_rshark_pri ? 2 : 1)); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + state->m_fg2_tilemap->draw(bitmap, cliprect, 0, 2); - rshark_draw_sprites(screen->machine(), bitmap, cliprect); + rshark_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( popbingo ) +SCREEN_UPDATE_IND16( popbingo ) { - dooyong_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + dooyong_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); - rshark_draw_sprites(screen->machine(), bitmap, cliprect); + rshark_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -654,11 +654,11 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); /* Text layer is offset on this machine */ - tilemap_set_scrolly(state->m_tx_tilemap, 0, 8); + state->m_tx_tilemap->set_scrolly(0, 8); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -694,11 +694,11 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); /* Text layer is offset on this machine */ - tilemap_set_scrolly(state->m_tx_tilemap, 0, 8); + state->m_tx_tilemap->set_scrolly(0, 8); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -733,8 +733,8 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -774,9 +774,9 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_fg2_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_fg2_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -810,9 +810,9 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -846,8 +846,8 @@ 8, 8, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -888,9 +888,9 @@ 16, 16, 64, 32); /* Configure tilemap transparency */ - tilemap_set_transparent_pen(state->m_bg2_tilemap, 15); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_fg2_tilemap, 15); + state->m_bg2_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_fg2_tilemap->set_transparent_pen(15); memset(state->m_bgscroll8, 0, 0x10); memset(state->m_bg2scroll8, 0, 0x10); @@ -931,16 +931,24 @@ } -SCREEN_EOF( dooyong ) +SCREEN_VBLANK( dooyong ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } -SCREEN_EOF( rshark ) +SCREEN_VBLANK( rshark ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/dragrace.c mame-0.145/src/mame/video/dragrace.c --- mame-0.144/src/mame/video/dragrace.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dragrace.c 2012-02-06 21:30:33.000000000 +0000 @@ -47,29 +47,29 @@ } -SCREEN_UPDATE( dragrace ) +SCREEN_UPDATE_IND16( dragrace ) { - dragrace_state *state = screen->machine().driver_data(); + dragrace_state *state = screen.machine().driver_data(); int y; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); for (y = 0; y < 256; y += 4) { - rectangle rect = *cliprect; + rectangle rect = cliprect; int xl = state->m_position_ram[y + 0] & 15; int xh = state->m_position_ram[y + 1] & 15; int yl = state->m_position_ram[y + 2] & 15; int yh = state->m_position_ram[y + 3] & 15; - tilemap_set_scrollx(state->m_bg_tilemap, 0, 16 * xh + xl - 8); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 16 * yh + yl); + state->m_bg_tilemap->set_scrollx(0, 16 * xh + xl - 8); + state->m_bg_tilemap->set_scrolly(0, 16 * yh + yl); if (rect.min_y < y + 0) rect.min_y = y + 0; if (rect.max_y > y + 3) rect.max_y = y + 3; - tilemap_draw(bitmap, &rect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, rect, 0, 0); } return 0; } diff -Nru mame-0.144/src/mame/video/drgnmst.c mame-0.145/src/mame/video/drgnmst.c --- mame-0.144/src/mame/video/drgnmst.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/drgnmst.c 2012-02-06 21:30:32.000000000 +0000 @@ -21,7 +21,7 @@ { drgnmst_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_drgnmst_bg_tile_info ) @@ -39,7 +39,7 @@ { drgnmst_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_drgnmst_md_tile_info ) @@ -57,10 +57,10 @@ { drgnmst_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_md_videoram[offset]); - tilemap_mark_tile_dirty(state->m_md_tilemap, offset / 2); + state->m_md_tilemap->mark_tile_dirty(offset / 2); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { drgnmst_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -127,36 +127,36 @@ { drgnmst_state *state = machine.driver_data(); state->m_fg_tilemap = tilemap_create(machine, get_drgnmst_fg_tile_info, drgnmst_fg_tilemap_scan_cols, 8, 8, 64,64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); state->m_md_tilemap = tilemap_create(machine, get_drgnmst_md_tile_info, drgnmst_md_tilemap_scan_cols, 16, 16, 64,64); - tilemap_set_transparent_pen(state->m_md_tilemap, 15); + state->m_md_tilemap->set_transparent_pen(15); state->m_bg_tilemap = tilemap_create(machine, get_drgnmst_bg_tile_info, drgnmst_bg_tilemap_scan_cols, 32, 32, 64,64); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); // do the other tilemaps have rowscroll too? probably not .. - tilemap_set_scroll_rows(state->m_md_tilemap, 1024); + state->m_md_tilemap->set_scroll_rows(1024); } -SCREEN_UPDATE(drgnmst) +SCREEN_UPDATE_IND16(drgnmst) { - drgnmst_state *state = screen->machine().driver_data(); + drgnmst_state *state = screen.machine().driver_data(); int y, rowscroll_bank; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_vidregs[10] - 18); // verify - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_vidregs[11]); // verify + state->m_bg_tilemap->set_scrollx(0, state->m_vidregs[10] - 18); // verify + state->m_bg_tilemap->set_scrolly(0, state->m_vidregs[11]); // verify -// tilemap_set_scrollx(state->m_md_tilemap,0, state->m_vidregs[8] - 16); // rowscrolled - tilemap_set_scrolly(state->m_md_tilemap,0, state->m_vidregs[9]); // verify +// state->m_md_tilemap->set_scrollx(0, state->m_vidregs[8] - 16); // rowscrolled + state->m_md_tilemap->set_scrolly(0, state->m_vidregs[9]); // verify - tilemap_set_scrollx(state->m_fg_tilemap,0, state->m_vidregs[6] - 18); // verify (test mode colour test needs it) - tilemap_set_scrolly(state->m_fg_tilemap,0, state->m_vidregs[7]); // verify + state->m_fg_tilemap->set_scrollx(0, state->m_vidregs[6] - 18); // verify (test mode colour test needs it) + state->m_fg_tilemap->set_scrolly(0, state->m_vidregs[7]); // verify rowscroll_bank = (state->m_vidregs[4] & 0x30) >> 4; for (y = 0; y < 1024; y++) - tilemap_set_scrollx(state->m_md_tilemap, y, state->m_vidregs[8] - 16 + state->m_rowscrollram[y + 0x800 * rowscroll_bank]); + state->m_md_tilemap->set_scrollx(y, state->m_vidregs[8] - 16 + state->m_rowscrollram[y + 0x800 * rowscroll_bank]); // todo: figure out which bits relate to the order switch (state->m_vidregs2[0]) @@ -165,36 +165,36 @@ case 0x2d9a: // fg unsure case 0x2440: // all ok case 0x245a: // fg unsure, title screen - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_md_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_md_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); break; case 0x23c0: // all ok - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_md_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_md_tilemap->draw(bitmap, cliprect, 0, 0); break; case 0x38da: // fg unsure case 0x215a: // fg unsure case 0x2140: // all ok - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_md_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_md_tilemap->draw(bitmap, cliprect, 0, 0); break; case 0x2d80: // all ok - tilemap_draw(bitmap, cliprect, state->m_md_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_md_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); break; default: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_md_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_md_tilemap->draw(bitmap, cliprect, 0, 0); logerror ("unknown video priority regs %04x\n", state->m_vidregs2[0]); } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); // popmessage ("x %04x x %04x x %04x x %04x x %04x", state->m_vidregs2[0], state->m_vidregs[12], state->m_vidregs[13], state->m_vidregs[14], state->m_vidregs[15]); // popmessage ("x %04x x %04x y %04x y %04x z %04x z %04x",state->m_vidregs[0],state->m_vidregs[1],state->m_vidregs[2],state->m_vidregs[3],state->m_vidregs[4],state->m_vidregs[5]); diff -Nru mame-0.144/src/mame/video/dribling.c mame-0.145/src/mame/video/dribling.c --- mame-0.144/src/mame/video/dribling.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dribling.c 2012-02-06 21:30:33.000000000 +0000 @@ -58,20 +58,20 @@ * *************************************/ -SCREEN_UPDATE( dribling ) +SCREEN_UPDATE_IND16( dribling ) { - dribling_state *state = screen->machine().driver_data(); - UINT8 *prombase = screen->machine().region("proms")->base(); - UINT8 *gfxbase = screen->machine().region("gfx1")->base(); + dribling_state *state = screen.machine().driver_data(); + UINT8 *prombase = screen.machine().region("proms")->base(); + UINT8 *gfxbase = screen.machine().region("gfx1")->base(); int x, y; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); /* loop over columns */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int b7 = prombase[(x >> 3) | ((y >> 3) << 5)] & 1; int b6 = state->m_abca; diff -Nru mame-0.144/src/mame/video/drmicro.c mame-0.145/src/mame/video/drmicro.c --- mame-0.144/src/mame/video/drmicro.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/drmicro.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,9 +19,9 @@ state->m_videoram[offset] = data; if (offset < 0x800) - tilemap_mark_tile_dirty(state->m_bg2, (offset & 0x3ff)); + state->m_bg2->mark_tile_dirty((offset & 0x3ff)); else - tilemap_mark_tile_dirty(state->m_bg1, (offset & 0x3ff)); + state->m_bg1->mark_tile_dirty((offset & 0x3ff)); } @@ -113,18 +113,18 @@ state->m_bg1 = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg2 = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg2, 0); + state->m_bg2->set_transparent_pen(0); } -SCREEN_UPDATE( drmicro ) +SCREEN_UPDATE_IND16( drmicro ) { - drmicro_state *state = screen->machine().driver_data(); + drmicro_state *state = screen.machine().driver_data(); int offs, adr, g; int chr, col, attr; int x, y, fx, fy; - tilemap_draw(bitmap, cliprect, state->m_bg1, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2, 0, 0); + state->m_bg1->draw(bitmap, cliprect, 0, 0); + state->m_bg2->draw(bitmap, cliprect, 0, 0); /* draw sprites */ for (g = 0; g < 2; g++) @@ -150,7 +150,7 @@ else x = (240 - x) & 0xff; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[3-g], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[3-g], chr, col, fx,fy, @@ -158,7 +158,7 @@ if (x > 240) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[3-g], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[3-g], chr, col, fx,fy, diff -Nru mame-0.144/src/mame/video/dynax.c mame-0.145/src/mame/video/dynax.c --- mame-0.144/src/mame/video/dynax.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dynax.c 2012-02-06 21:30:31.000000000 +0000 @@ -1000,7 +1000,7 @@ ***************************************************************************/ -static void hanamai_copylayer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int i ) +static void hanamai_copylayer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int i ) { dynax_state *state = machine.driver_data(); int color; @@ -1036,7 +1036,7 @@ for (dy = 0; dy < 256; dy++) { UINT16 *dst; - UINT16 *dstbase = BITMAP_ADDR16(bitmap, (dy - scrolly) & 0xff, 0); + UINT16 *dstbase = &bitmap.pix16((dy - scrolly) & 0xff); length = scrollx; dst = dstbase + 2 * (256 - length); @@ -1064,7 +1064,7 @@ } -static void jantouki_copylayer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int i, int y ) +static void jantouki_copylayer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int i, int y ) { dynax_state *state = machine.driver_data(); int color, scrollx, scrolly, palettes, palbank; @@ -1104,9 +1104,9 @@ { int sy = ((dy - scrolly) & 0xff) + y; UINT16 *dst; - UINT16 *dstbase = BITMAP_ADDR16(bitmap, sy, 0); + UINT16 *dstbase = &bitmap.pix16(sy); - if ((sy < cliprect->min_y) || (sy > cliprect->max_y)) + if ((sy < cliprect.min_y) || (sy > cliprect.max_y)) { src1 += 256; src2 += 256; @@ -1139,7 +1139,7 @@ } -static void mjdialq2_copylayer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int i ) +static void mjdialq2_copylayer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int i ) { dynax_state *state = machine.driver_data(); int color; @@ -1166,7 +1166,7 @@ for (dy = 0; dy < 256; dy++) { UINT16 *dst; - UINT16 *dstbase = BITMAP_ADDR16(bitmap, (dy - scrolly) & 0xff, 0); + UINT16 *dstbase = &bitmap.pix16((dy - scrolly) & 0xff); length = scrollx; dst = dstbase + 256 - length; @@ -1227,7 +1227,7 @@ I,O - Change palette (-,+) J,K & N,M - Change "tile" (-,+, slow & fast) R - move "tile" to the next 1/8th of the gfx */ -static int debug_viewer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static int debug_viewer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { #ifdef MAME_DEBUG @@ -1255,13 +1255,13 @@ state->m_blit_palettes = (c & 0xf) * 0x111; state->m_blit_palbank = (c >> 4) & 1; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); memset(state->m_pixmap[0][0], 0, sizeof(UINT8) * 0x100 * 0x100); if (state->m_layer_layout != LAYOUT_MJDIALQ2) memset(state->m_pixmap[0][1], 0, sizeof(UINT8) * 0x100 * 0x100); for (state->m_hanamai_layer_half = 0; state->m_hanamai_layer_half < 2; state->m_hanamai_layer_half++) - blitter_drawgfx(machine, 0, 1, "gfx1", i, 0, cliprect->min_x, cliprect->min_y, 3, 0); + blitter_drawgfx(machine, 0, 1, "gfx1", i, 0, cliprect.min_x, cliprect.min_y, 3, 0); if (state->m_layer_layout != LAYOUT_MJDIALQ2) hanamai_copylayer(machine, bitmap, cliprect, 0); @@ -1278,18 +1278,18 @@ -SCREEN_UPDATE( hanamai ) +SCREEN_UPDATE_IND16( hanamai ) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layers_ctrl = ~state->m_layer_enable; int lay[4]; - if (debug_viewer(screen->machine(), bitmap, cliprect)) + if (debug_viewer(screen.machine(), bitmap, cliprect)) return 0; - layers_ctrl &= debug_mask(screen->machine()); + layers_ctrl &= debug_mask(screen.machine()); - bitmap_fill(bitmap, cliprect, (state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256); + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256, cliprect); /* bit 4 = display enable? */ if (!(state->m_hanamai_priority & 0x10)) @@ -1306,27 +1306,27 @@ case 0x15: lay[0] = 0; lay[1] = 2; lay[2] = 3; lay[3] = 1; break; } - if (BIT(layers_ctrl, lay[0])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[0]); - if (BIT(layers_ctrl, lay[1])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[1]); - if (BIT(layers_ctrl, lay[2])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[2]); - if (BIT(layers_ctrl, lay[3])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[3]); + if (BIT(layers_ctrl, lay[0])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[0]); + if (BIT(layers_ctrl, lay[1])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[1]); + if (BIT(layers_ctrl, lay[2])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[2]); + if (BIT(layers_ctrl, lay[3])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[3]); return 0; } -SCREEN_UPDATE( hnoridur ) +SCREEN_UPDATE_IND16( hnoridur ) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layers_ctrl = ~BITSWAP8(state->m_hanamai_priority, 7, 6, 5, 4, 0, 1, 2, 3); int lay[4]; int pri; - if (debug_viewer(screen->machine(), bitmap, cliprect)) + if (debug_viewer(screen.machine(), bitmap, cliprect)) return 0; - layers_ctrl &= debug_mask(screen->machine()); + layers_ctrl &= debug_mask(screen.machine()); - bitmap_fill(bitmap, cliprect, (state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 0x0f) * 256); + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 0x0f) * 256, cliprect); pri = state->m_hanamai_priority >> 4; @@ -1342,78 +1342,87 @@ lay[2] = (pri >> 4) & 3; lay[3] = (pri >> 0) & 3; - if (BIT(layers_ctrl, lay[0])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[0]); - if (BIT(layers_ctrl, lay[1])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[1]); - if (BIT(layers_ctrl, lay[2])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[2]); - if (BIT(layers_ctrl, lay[3])) hanamai_copylayer(screen->machine(), bitmap, cliprect, lay[3]); + if (BIT(layers_ctrl, lay[0])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[0]); + if (BIT(layers_ctrl, lay[1])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[1]); + if (BIT(layers_ctrl, lay[2])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[2]); + if (BIT(layers_ctrl, lay[3])) hanamai_copylayer(screen.machine(), bitmap, cliprect, lay[3]); return 0; } -SCREEN_UPDATE( sprtmtch ) +SCREEN_UPDATE_IND16( sprtmtch ) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layers_ctrl = ~state->m_layer_enable; - if (debug_viewer(screen->machine(),bitmap,cliprect)) + if (debug_viewer(screen.machine(),bitmap,cliprect)) return 0; - layers_ctrl &= debug_mask(screen->machine()); + layers_ctrl &= debug_mask(screen.machine()); - bitmap_fill(bitmap, cliprect, (state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256); + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256, cliprect); - if (BIT(layers_ctrl, 0)) hanamai_copylayer(screen->machine(), bitmap, cliprect, 0); - if (BIT(layers_ctrl, 1)) hanamai_copylayer(screen->machine(), bitmap, cliprect, 1); - if (BIT(layers_ctrl, 2)) hanamai_copylayer(screen->machine(), bitmap, cliprect, 2); + if (BIT(layers_ctrl, 0)) hanamai_copylayer(screen.machine(), bitmap, cliprect, 0); + if (BIT(layers_ctrl, 1)) hanamai_copylayer(screen.machine(), bitmap, cliprect, 1); + if (BIT(layers_ctrl, 2)) hanamai_copylayer(screen.machine(), bitmap, cliprect, 2); return 0; } -SCREEN_UPDATE( jantouki ) +SCREEN_UPDATE_IND16( jantouki_top ) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layers_ctrl = state->m_layer_enable; - if (debug_viewer(screen->machine(), bitmap, cliprect)) + if (debug_viewer(screen.machine(), bitmap, cliprect)) return 0; - layers_ctrl &= debug_mask(screen->machine()); + layers_ctrl &= debug_mask(screen.machine()); - bitmap_fill(bitmap, cliprect, (state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256); + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256, cliprect); - if (screen == state->m_top_scr) - { - // if (BIT(layers_ctrl, 0)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 3, 0); - if (BIT(layers_ctrl, 1)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 2, 0); - if (BIT(layers_ctrl, 2)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 1, 0); - if (BIT(layers_ctrl, 3)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 0, 0); - } - else if (screen == state->m_bot_scr) - { - if (BIT(layers_ctrl, 0)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 3, 0); - if (BIT(layers_ctrl, 4)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 7, 0); - if (BIT(layers_ctrl, 5)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 6, 0); - if (BIT(layers_ctrl, 6)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 5, 0); - if (BIT(layers_ctrl, 7)) jantouki_copylayer(screen->machine(), bitmap, cliprect, 4, 0); - } +// if (BIT(layers_ctrl, 0)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 3, 0); + if (BIT(layers_ctrl, 1)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 2, 0); + if (BIT(layers_ctrl, 2)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 1, 0); + if (BIT(layers_ctrl, 3)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 0, 0); + return 0; +} + +SCREEN_UPDATE_IND16( jantouki_bottom ) +{ + dynax_state *state = screen.machine().driver_data(); + int layers_ctrl = state->m_layer_enable; + + if (debug_viewer(screen.machine(), bitmap, cliprect)) + return 0; + + layers_ctrl &= debug_mask(screen.machine()); + + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256, cliprect); + + if (BIT(layers_ctrl, 0)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 3, 0); + if (BIT(layers_ctrl, 4)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 7, 0); + if (BIT(layers_ctrl, 5)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 6, 0); + if (BIT(layers_ctrl, 6)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 5, 0); + if (BIT(layers_ctrl, 7)) jantouki_copylayer(screen.machine(), bitmap, cliprect, 4, 0); return 0; } -SCREEN_UPDATE( mjdialq2 ) +SCREEN_UPDATE_IND16( mjdialq2 ) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layers_ctrl = ~state->m_layer_enable; - if (debug_viewer(screen->machine(), bitmap, cliprect)) + if (debug_viewer(screen.machine(), bitmap, cliprect)) return 0; - layers_ctrl &= debug_mask(screen->machine()); + layers_ctrl &= debug_mask(screen.machine()); - bitmap_fill(bitmap, cliprect, (state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256); + bitmap.fill((state->m_blit_backpen & 0xff) + (state->m_blit_palbank & 1) * 256, cliprect); - if (BIT(layers_ctrl, 0)) mjdialq2_copylayer(screen->machine(), bitmap, cliprect, 0); - if (BIT(layers_ctrl, 1)) mjdialq2_copylayer(screen->machine(), bitmap, cliprect, 1); + if (BIT(layers_ctrl, 0)) mjdialq2_copylayer(screen.machine(), bitmap, cliprect, 0); + if (BIT(layers_ctrl, 1)) mjdialq2_copylayer(screen.machine(), bitmap, cliprect, 1); return 0; } @@ -1425,22 +1434,22 @@ VIDEO_START_CALL(hnoridur); } -SCREEN_UPDATE(htengoku) +SCREEN_UPDATE_IND16(htengoku) { - dynax_state *state = screen->machine().driver_data(); + dynax_state *state = screen.machine().driver_data(); int layer, x, y; // render the layers, one by one, "dynax.c" style. Then convert the pixmaps to "ddenlovr.c" - // format and let SCREEN_UPDATE(ddenlovr) do the final compositing (priorities + palettes) + // format and let SCREEN_UPDATE_IND16(ddenlovr) do the final compositing (priorities + palettes) for (layer = 0; layer < 4; layer++) { - bitmap_fill(bitmap, cliprect, 0); - hanamai_copylayer(screen->machine(), bitmap, cliprect, layer); + bitmap.fill(0, cliprect); + hanamai_copylayer(screen.machine(), bitmap, cliprect, layer); for (y = 0; y < 256; y++) for (x = 0; x < 512; x++) - state->m_ddenlovr_pixmap[3 - layer][y * 512 + x] = (UINT8)(*BITMAP_ADDR16(bitmap, y, x)); + state->m_ddenlovr_pixmap[3 - layer][y * 512 + x] = (UINT8)(bitmap.pix16(y, x)); } - return SCREEN_UPDATE_CALL(ddenlovr); + return SCREEN_UPDATE16_CALL(ddenlovr); } diff -Nru mame-0.144/src/mame/video/dynduke.c mame-0.145/src/mame/video/dynduke.c --- mame-0.144/src/mame/video/dynduke.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/dynduke.c 2012-02-06 21:30:33.000000000 +0000 @@ -18,14 +18,14 @@ { dynduke_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_back_data[offset]); - tilemap_mark_tile_dirty(state->m_bg_layer,offset); + state->m_bg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( dynduke_foreground_w ) { dynduke_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fore_data[offset]); - tilemap_mark_tile_dirty(state->m_fg_layer,offset); + state->m_fg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( dynduke_text_w ) @@ -33,7 +33,7 @@ dynduke_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_layer,offset); + state->m_tx_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -89,8 +89,8 @@ state->m_fg_layer = tilemap_create(machine, get_fg_tile_info,tilemap_scan_cols,16,16,32,32); state->m_tx_layer = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_fg_layer,15); - tilemap_set_transparent_pen(state->m_tx_layer,15); + state->m_fg_layer->set_transparent_pen(15); + state->m_tx_layer->set_transparent_pen(15); } WRITE16_HANDLER( dynduke_gfxbank_w ) @@ -103,9 +103,9 @@ if (data&0x10) state->m_fore_bankbase=0x1000; else state->m_fore_bankbase=0; if (state->m_back_bankbase!=state->m_old_back) - tilemap_mark_all_tiles_dirty(state->m_bg_layer); + state->m_bg_layer->mark_all_dirty(); if (state->m_fore_bankbase!=state->m_old_fore) - tilemap_mark_all_tiles_dirty(state->m_fg_layer); + state->m_fg_layer->mark_all_dirty(); state->m_old_back=state->m_back_bankbase; state->m_old_fore=state->m_fore_bankbase; @@ -137,7 +137,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int pri) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int pri) { dynduke_state *state = machine.driver_data(); UINT16 *buffered_spriteram16 = machine.generic.buffered_spriteram.u16; @@ -175,18 +175,18 @@ } } -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { dynduke_state *state = machine.driver_data(); /* The transparency / palette handling on the background layer is very strange */ - bitmap_t *bm = tilemap_get_pixmap(state->m_bg_layer); + bitmap_ind16 &bm = state->m_bg_layer->pixmap(); int scrolly, scrollx; int x,y; /* if we're disabled, don't draw */ if (!state->m_back_enable) { - bitmap_fill(bitmap,cliprect,get_black_pen(machine)); + bitmap.fill(get_black_pen(machine), cliprect); return; } @@ -196,8 +196,8 @@ for (y=0;y<256;y++) { int realy = (y + scrolly) & 0x1ff; - UINT16 *src = BITMAP_ADDR16(bm, realy, 0); - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *src = &bm.pix16(realy); + UINT16 *dst = &bitmap.pix16(y); for (x=0;x<256;x++) @@ -228,32 +228,36 @@ } } -SCREEN_UPDATE( dynduke ) +SCREEN_UPDATE_IND16( dynduke ) { - dynduke_state *state = screen->machine().driver_data(); + dynduke_state *state = screen.machine().driver_data(); /* Setup the tilemaps */ - tilemap_set_scrolly( state->m_fg_layer,0, ((state->m_scroll_ram[0x11]&0x30)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); - tilemap_set_scrollx( state->m_fg_layer,0, ((state->m_scroll_ram[0x19]&0x30)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); - tilemap_set_enable( state->m_fg_layer,state->m_fore_enable); - tilemap_set_enable( state->m_tx_layer,state->m_txt_enable); + state->m_fg_layer->set_scrolly(0, ((state->m_scroll_ram[0x11]&0x30)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); + state->m_fg_layer->set_scrollx(0, ((state->m_scroll_ram[0x19]&0x30)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); + state->m_fg_layer->enable(state->m_fore_enable); + state->m_tx_layer->enable(state->m_txt_enable); - draw_background(screen->machine(), bitmap, cliprect,0x00); - draw_sprites(screen->machine(),bitmap,cliprect,0); // Untested: does anything use it? Could be behind background - draw_sprites(screen->machine(),bitmap,cliprect,1); - draw_background(screen->machine(), bitmap, cliprect,0x20); - - draw_sprites(screen->machine(),bitmap,cliprect,2); - tilemap_draw(bitmap,cliprect,state->m_fg_layer,0,0); - draw_sprites(screen->machine(),bitmap,cliprect,3); - tilemap_draw(bitmap,cliprect,state->m_tx_layer,0,0); + draw_background(screen.machine(), bitmap, cliprect,0x00); + draw_sprites(screen.machine(),bitmap,cliprect,0); // Untested: does anything use it? Could be behind background + draw_sprites(screen.machine(),bitmap,cliprect,1); + draw_background(screen.machine(), bitmap, cliprect,0x20); + + draw_sprites(screen.machine(),bitmap,cliprect,2); + state->m_fg_layer->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect,3); + state->m_tx_layer->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_EOF( dynduke ) +SCREEN_VBLANK( dynduke ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); // Could be a memory location instead + buffer_spriteram16_w(space, 0, 0, 0xffff); // Could be a memory location instead + } } diff -Nru mame-0.144/src/mame/video/eolith.c mame-0.145/src/mame/video/eolith.c --- mame-0.144/src/mame/video/eolith.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/eolith.c 2012-02-06 21:30:32.000000000 +0000 @@ -38,16 +38,16 @@ state->m_vram = auto_alloc_array(machine, UINT32, 0x40000*2/4); } -SCREEN_UPDATE( eolith ) +SCREEN_UPDATE_IND16( eolith ) { - eolith_state *state = screen->machine().driver_data(); + eolith_state *state = screen.machine().driver_data(); int y; for (y = 0; y < 240; y++) { int x; UINT32 *src = &state->m_vram[(state->m_buffer ? 0 : 0x10000) | (y * (336 / 2))]; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); for (x = 0; x < 320; x += 2) { diff -Nru mame-0.144/src/mame/video/epos.c mame-0.145/src/mame/video/epos.c --- mame-0.144/src/mame/video/epos.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/epos.c 2012-02-06 21:30:32.000000000 +0000 @@ -72,13 +72,13 @@ } -SCREEN_UPDATE( epos ) +SCREEN_UPDATE_RGB32( epos ) { - epos_state *state = screen->machine().driver_data(); + epos_state *state = screen.machine().driver_data(); pen_t pens[0x20]; offs_t offs; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); for (offs = 0; offs < state->m_videoram_size; offs++) { @@ -87,8 +87,8 @@ int x = (offs % 136) * 2; int y = (offs / 136); - *BITMAP_ADDR32(bitmap, y, x + 0) = pens[(state->m_palette << 4) | (data & 0x0f)]; - *BITMAP_ADDR32(bitmap, y, x + 1) = pens[(state->m_palette << 4) | (data >> 4)]; + bitmap.pix32(y, x + 0) = pens[(state->m_palette << 4) | (data & 0x0f)]; + bitmap.pix32(y, x + 1) = pens[(state->m_palette << 4) | (data >> 4)]; } return 0; diff -Nru mame-0.144/src/mame/video/eprom.c mame-0.145/src/mame/video/eprom.c --- mame-0.144/src/mame/video/eprom.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/eprom.c 2012-02-06 21:30:31.000000000 +0000 @@ -139,7 +139,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_screen_intensity)); @@ -195,7 +195,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_screen_intensity)); @@ -219,8 +219,8 @@ { int xscroll = (state->m_alpha[0x780] >> 7) & 0x1ff; int yscroll = (state->m_alpha[0x781] >> 7) & 0x1ff; - tilemap_set_scrollx(state->m_playfield_tilemap, 0, xscroll); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, yscroll); + state->m_playfield_tilemap->set_scrollx(0, xscroll); + state->m_playfield_tilemap->set_scrolly(0, yscroll); atarimo_set_xscroll(0, xscroll); atarimo_set_yscroll(0, yscroll); } @@ -234,31 +234,31 @@ * *************************************/ -SCREEN_UPDATE( eprom ) +SCREEN_UPDATE_IND16( eprom ) { - eprom_state *state = screen->machine().driver_data(); + eprom_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; if (state->m_video_disable) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - update_palette(screen->machine()); + update_palette(screen.machine()); /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -359,15 +359,15 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -389,31 +389,31 @@ } -SCREEN_UPDATE( guts ) +SCREEN_UPDATE_IND16( guts ) { - eprom_state *state = screen->machine().driver_data(); + eprom_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; if (state->m_video_disable) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - update_palette(screen->machine()); + update_palette(screen.machine()); /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -433,15 +433,15 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/equites.c mame-0.145/src/mame/video/equites.c --- mame-0.144/src/mame/video/equites.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/equites.c 2012-02-06 21:30:32.000000000 +0000 @@ -68,7 +68,7 @@ SET_TILE_INFO(0, tile, color, 0); if (color & 0x10) - tileinfo->flags |= TILE_FORCE_LAYER0; + tileinfo.flags |= TILE_FORCE_LAYER0; } static TILE_GET_INFO( splndrbt_fg_info ) @@ -79,7 +79,7 @@ SET_TILE_INFO(0, tile, color, 0); if (color & 0x10) - tileinfo->flags |= TILE_FORCE_LAYER0; + tileinfo.flags |= TILE_FORCE_LAYER0; } static TILE_GET_INFO( equites_bg_info ) @@ -102,7 +102,7 @@ int fxy = (data & 0x0600) >> 9; SET_TILE_INFO(1, tile, color, TILE_FLIPXY(fxy)); - tileinfo->group = color; + tileinfo.group = color; } @@ -120,24 +120,24 @@ state->save_pointer(NAME(state->m_fg_videoram), 0x800); state->m_fg_tilemap = tilemap_create(machine, equites_fg_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_bg_tilemap = tilemap_create(machine, equites_bg_info, tilemap_scan_rows, 16, 16, 16, 16); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, -10); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(0, -10); } VIDEO_START( splndrbt ) { equites_state *state = machine.driver_data(); - assert(machine.primary_screen->format() == BITMAP_FORMAT_INDEXED16); + assert(machine.primary_screen->format() == BITMAP_FORMAT_IND16); state->m_fg_videoram = auto_alloc_array(machine, UINT8, 0x800); state->save_pointer(NAME(state->m_fg_videoram), 0x800); state->m_fg_tilemap = tilemap_create(machine, splndrbt_fg_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_fg_tilemap, 8, -8); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrolldx(8, -8); state->m_bg_tilemap = tilemap_create(machine, splndrbt_bg_info, tilemap_scan_rows, 16, 16, 32, 32); colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[1], 0x10); @@ -164,7 +164,7 @@ { state->m_fg_videoram[offset] = data & 0xff; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } } @@ -173,7 +173,7 @@ equites_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_bg_videoram + offset); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER(equites_bgcolor_w) @@ -187,10 +187,10 @@ { equites_state *state = space->machine().driver_data(); if (ACCESSING_BITS_0_7) - tilemap_set_scrolly(state->m_bg_tilemap, 0, data & 0xff); + state->m_bg_tilemap->set_scrolly(0, data & 0xff); if (ACCESSING_BITS_8_15) - tilemap_set_scrollx(state->m_bg_tilemap, 0, data >> 8); + state->m_bg_tilemap->set_scrollx(0, data >> 8); } WRITE16_HANDLER(splndrbt_selchar0_w) @@ -199,7 +199,7 @@ if (state->m_fg_char_bank != 0) { state->m_fg_char_bank = 0; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } } @@ -209,7 +209,7 @@ if (state->m_fg_char_bank != 1) { state->m_fg_char_bank = 1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } } @@ -258,7 +258,7 @@ * *************************************/ -static void equites_draw_sprites_block( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int start, int end ) +static void equites_draw_sprites_block( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int end ) { equites_state *state = machine.driver_data(); int offs; @@ -299,7 +299,7 @@ } } -static void equites_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void equites_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { // note that we draw the sprites in three blocks; in each blocks, sprites at // a lower address have priority. This gives good priorities in gekisou. @@ -332,7 +332,7 @@ 03020303 03030303 03030303 03030303 */ -static void splndrbt_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void splndrbt_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { equites_state *state = machine.driver_data(); const UINT8 * const xrom = machine.region("user2")->base(); @@ -384,13 +384,13 @@ { int const y = yhalf ? sy + 1 + yy : sy - yy; - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { for (x = 0; x <= (scalex << 1); ++x) { int bx = (sx + x) & 0xff; - if (bx >= cliprect->min_x && bx <= cliprect->max_x) + if (bx >= cliprect.min_x && bx <= cliprect.max_x) { int xx = scalex ? (x * 29 + scalex) / (scalex << 1) + 1 : 16; // FIXME This is wrong. Should use the PROM. int const offset = (fx ? (31 - xx) : xx) + ((fy ^ yhalf) ? (16 + line) : (15 - line) ) * gfx->line_modulo; @@ -398,7 +398,7 @@ int pen = srcgfx[offset]; if ((transmask & (1 << pen)) == 0) - *BITMAP_ADDR16(bitmap, y, bx) = paldata[pen]; + bitmap.pix16(y, bx) = paldata[pen]; } } } @@ -408,11 +408,11 @@ } -static void splndrbt_copy_bg( running_machine &machine, bitmap_t *dst_bitmap, const rectangle *cliprect ) +static void splndrbt_copy_bg( running_machine &machine, bitmap_ind16 &dst_bitmap, const rectangle &cliprect ) { equites_state *state = machine.driver_data(); - bitmap_t * const src_bitmap = tilemap_get_pixmap(state->m_bg_tilemap); - bitmap_t * const flags_bitmap = tilemap_get_flagsmap(state->m_bg_tilemap); + bitmap_ind16 &src_bitmap = state->m_bg_tilemap->pixmap(); + bitmap_ind8 &flags_bitmap = state->m_bg_tilemap->flagsmap(); const UINT8 * const xrom = machine.region("user1")->base(); const UINT8 * const yrom = xrom + 0x2000; int scroll_x = state->m_splndrbt_bg_scrollx; @@ -429,12 +429,12 @@ for (dst_y = 32; dst_y < 256-32; ++dst_y) { - if (dst_y >= cliprect->min_y && dst_y <= cliprect->max_y) + if (dst_y >= cliprect.min_y && dst_y <= cliprect.max_y) { const UINT8 * const romline = &xrom[(dst_y ^ dinvert) << 5]; - const UINT16 * const src_line = BITMAP_ADDR16(src_bitmap, (src_y + scroll_y) & 0x1ff, 0); - const UINT8 * const flags_line = BITMAP_ADDR8(flags_bitmap, (src_y + scroll_y) & 0x1ff, 0); - UINT16 * const dst_line = BITMAP_ADDR16(dst_bitmap, dst_y, 0); + const UINT16 * const src_line = &src_bitmap.pix16((src_y + scroll_y) & 0x1ff); + const UINT8 * const flags_line = &flags_bitmap.pix8((src_y + scroll_y) & 0x1ff); + UINT16 * const dst_line = &dst_bitmap.pix16(dst_y); int dst_x = 0; int src_x; @@ -463,34 +463,34 @@ -SCREEN_UPDATE( equites ) +SCREEN_UPDATE_IND16( equites ) { - equites_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, state->m_bgcolor); + equites_state *state = screen.machine().driver_data(); + bitmap.fill(state->m_bgcolor, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - equites_draw_sprites(screen->machine(), bitmap, cliprect); + equites_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( splndrbt ) +SCREEN_UPDATE_IND16( splndrbt ) { - equites_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, state->m_bgcolor); + equites_state *state = screen.machine().driver_data(); + bitmap.fill(state->m_bgcolor, cliprect); - splndrbt_copy_bg(screen->machine(), bitmap, cliprect); + splndrbt_copy_bg(screen.machine(), bitmap, cliprect); if (state->m_fg_char_bank) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); - splndrbt_draw_sprites(screen->machine(), bitmap, cliprect); + splndrbt_draw_sprites(screen.machine(), bitmap, cliprect); if (!state->m_fg_char_bank) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/esd16.c mame-0.145/src/mame/video/esd16.c --- mame-0.144/src/mame/video/esd16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/esd16.c 2012-02-06 21:30:31.000000000 +0000 @@ -35,7 +35,7 @@ #include "emu.h" #include "includes/esd16.h" - +#include "video/decospr.h" /*************************************************************************** @@ -99,23 +99,23 @@ { esd16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0, offset); - tilemap_mark_tile_dirty(state->m_tilemap_0_16x16, offset); + state->m_tilemap_0->mark_tile_dirty(offset); + state->m_tilemap_0_16x16->mark_tile_dirty(offset); } WRITE16_HANDLER( esd16_vram_1_w ) { esd16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1, offset); - tilemap_mark_tile_dirty(state->m_tilemap_1_16x16, offset); + state->m_tilemap_1->mark_tile_dirty(offset); + state->m_tilemap_1_16x16->mark_tile_dirty(offset); } WRITE16_HANDLER( esd16_tilemap0_color_w ) { esd16_state *state = space->machine().driver_data(); state->m_tilemap0_color = data & 3; - tilemap_mark_all_tiles_dirty(state->m_tilemap_0); + state->m_tilemap_0->mark_all_dirty(); flip_screen_set(space->machine(), data & 0x80); } @@ -143,178 +143,16 @@ /* hedpanic changes tilemap 1 to 16x16 at various times */ state->m_tilemap_1_16x16 = tilemap_create(machine, get_tile_info_1_16x16, tilemap_scan_rows, 16,16, 0x40, 0x40); - tilemap_set_scrolldx(state->m_tilemap_0, -0x60 + 2, -0x60); - tilemap_set_scrolldx(state->m_tilemap_1, -0x60, -0x60 + 2); - tilemap_set_scrolldx(state->m_tilemap_0_16x16, -0x60 + 2, -0x60); - tilemap_set_scrolldx(state->m_tilemap_1_16x16, -0x60, -0x60 + 2); - - tilemap_set_transparent_pen(state->m_tilemap_1, 0x00); - tilemap_set_transparent_pen(state->m_tilemap_1_16x16, 0x00); -} - - - - -/*************************************************************************** - - Sprites Drawing - - Offset: Bits: Value: - - 0.w fedc b--- ---- ---- - ---- -a9- ---- ---- Y Size: (1 << N) Tiles - ---- ---8 7654 3210 Y (Signed, Bottom-Up) - - 2.w Code - - 4.w f--- ---- ---- ---- Sprite priority - -ed- ---- ---- ---- - ---c ---- ---- ---- Color? - ---- ba9- ---- ---- Color - ---- ---8 7654 3210 X (Signed) - - 6.w fedc ba9- ---- ---- - ---- ---8 ---- ---- ? 1 (Display Sprite?) - ---- ---- 7654 3210 - -- To Do: Flip X&Y ? They seem unused. - - these are clearly the same as the tumble pop (bootleg?) sprites - -***************************************************************************/ - -static void esd16_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - esd16_state *state = machine.driver_data(); - int offs; - - int max_x = machine.primary_screen->width(); - int max_y = machine.primary_screen->height(); - - for (offs = state->m_spriteram_size / 2 - 8 / 2; offs >= 0 ; offs -= 8 / 2) - { - int y, starty, endy, incy; - - int sy = state->m_spriteram[offs + 0]; - int code = state->m_spriteram[offs + 1]; - int sx = state->m_spriteram[offs + 2]; - int attr = state->m_spriteram[offs + 3]; - - int dimy = 1 << ((sy >> 9) & 3); - - int flipx = sy & 0x2000; - int flipy = attr & 0x0000; - int flash = sy & 0x1000; - - int color = (sx >> 9) & 0xf; - - int pri_mask; - - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - if (sx & 0x8000) - pri_mask = 0xfffe; // under "tilemap 1" - else - pri_mask = 0; // above everything - - sx = sx & 0x1ff; - if (sx >= 0x180) - sx -= 0x200; - - sy = 0x100 - ((sy & 0xff) - (sy & 0x100)); - sy -= dimy * 16; - - if (flip_screen_get(machine)) - { - flipx = !flipx; sx = max_x - sx - 1 * 16 + 2; // small offset - flipy = !flipy; sy = max_y - sy - dimy * 16; - } - - if (flipy) { starty = sy + (dimy - 1) * 16; endy = sy-16; incy = -16; } - else { starty = sy; endy = sy + dimy * 16; incy = +16; } - - for (y = starty ; y != endy ; y += incy) - { - pdrawgfx_transpen(bitmap, cliprect, machine.gfx[0], - code++, - color, - flipx, flipy, - sx, y, - machine.priority_bitmap, pri_mask, 0); - } - } -} - -/* note, check if i can re-merge this with the other or if its really different */ -static void hedpanic_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - esd16_state *state = machine.driver_data(); - int offs; - - int max_x = machine.primary_screen->width(); - int max_y = machine.primary_screen->height(); - - for (offs = state->m_spriteram_size / 2 - 8 / 2; offs >= 0 ; offs -= 8 / 2) - { - int y, starty, endy, incy; - - int sy = state->m_spriteram[offs + 0]; - int code = state->m_spriteram[offs + 1]; - int sx = state->m_spriteram[offs + 2]; -// int attr = state->m_spriteram[offs + 3]; - - int dimy = 1 << ((sy >> 9) & 3); - - int flipx = sy & 0x2000; - int flipy = sy & 0x0000; - int flash = sy & 0x1000; - - int color = (sx >> 9) & 0xf; - - int pri_mask; - - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - if (sx & 0x8000) - pri_mask = 0xfffe; // under "tilemap 1" - else - pri_mask = 0; // above everything - - sx = sx & 0x1ff; - if (sx >= 0x180) - sx -= 0x200; - - sy &= 0x1ff; - - sx -= 24; - - sy = 0x1ff - sy; - - if (flip_screen_get(machine)) - { - flipx = !flipx; sx = max_x - sx - 1 * 16 + 2; // small offset - flipy = !flipy; sy = max_y - sy - dimy * 16; - } - - if (flipy) { starty = sy + (dimy - 1) * 16; endy = sy - 16; incy = -16; } - else { starty = sy - dimy * 16; endy = sy; incy = +16; } + state->m_tilemap_0->set_scrolldx(-0x60 + 2, -0x60); + state->m_tilemap_1->set_scrolldx(-0x60, -0x60 + 2); + state->m_tilemap_0_16x16->set_scrolldx(-0x60 + 2, -0x60); + state->m_tilemap_1_16x16->set_scrolldx(-0x60, -0x60 + 2); - for (y = starty ; y != endy ; y += incy) - { - pdrawgfx_transpen(bitmap, cliprect, machine.gfx[0], - code++, - color, - flipx, flipy, - sx, y, - machine.priority_bitmap, pri_mask, 0); - } - } + state->m_tilemap_1->set_transparent_pen(0x00); + state->m_tilemap_1_16x16->set_transparent_pen(0x00); } - /*************************************************************************** @@ -323,117 +161,20 @@ ***************************************************************************/ -SCREEN_UPDATE( esd16 ) -{ - esd16_state *state = screen->machine().driver_data(); - int layers_ctrl = -1; - - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_scroll_0[0]); - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_scroll_0[1]); - - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_scroll_1[0]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_scroll_1[1]); - -#ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) -{ - int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 4; - if (msk != 0) layers_ctrl &= msk; -} -#endif - - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - else bitmap_fill(bitmap, cliprect, 0); - - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 1); - - if (layers_ctrl & 4) esd16_draw_sprites(screen->machine(), bitmap, cliprect); - return 0; -} - - -SCREEN_UPDATE( hedpanic ) -{ - esd16_state *state = screen->machine().driver_data(); - int layers_ctrl = -1; - - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - -#ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) -{ - int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 4; - if (msk != 0) layers_ctrl &= msk; -} -#endif - - if (layers_ctrl & 1) - { - if (state->m_head_layersize[0] & 0x0001) - { - tilemap_set_scrollx(state->m_tilemap_0_16x16, 0, state->m_scroll_0[0]); - tilemap_set_scrolly(state->m_tilemap_0_16x16, 0, state->m_scroll_0[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0_16x16, 0, 0); - } - else - { - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_scroll_0[0]); - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_scroll_0[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - } - } - else - { - bitmap_fill(bitmap, cliprect, 0); - } - - - if (layers_ctrl & 2) - { - if (state->m_head_layersize[0] & 0x0002) - { - tilemap_set_scrollx(state->m_tilemap_1_16x16, 0, state->m_scroll_1[0]); - tilemap_set_scrolly(state->m_tilemap_1_16x16, 0, state->m_scroll_1[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1_16x16, 0, 1); - } - else - { - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_scroll_1[0]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_scroll_1[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 1); - } - - } - - if (layers_ctrl & 4) hedpanic_draw_sprites(screen->machine(),bitmap,cliprect); - -// popmessage("%04x %04x %04x %04x %04x",head_unknown1[0],head_layersize[0],head_unknown3[0],head_unknown4[0],head_unknown5[0]); - return 0; -} - -// uses older style sprites -SCREEN_UPDATE( hedpanio ) +SCREEN_UPDATE_IND16( hedpanic ) { - esd16_state *state = screen->machine().driver_data(); + esd16_state *state = screen.machine().driver_data(); int layers_ctrl = -1; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); #ifdef MAME_DEBUG -if ( screen->machine().input().code_pressed(KEYCODE_Z) ) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 4; if (msk != 0) layers_ctrl &= msk; } #endif @@ -442,20 +183,20 @@ { if (state->m_head_layersize[0] & 0x0001) { - tilemap_set_scrollx(state->m_tilemap_0_16x16, 0, state->m_scroll_0[0]); - tilemap_set_scrolly(state->m_tilemap_0_16x16, 0, state->m_scroll_0[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0_16x16, 0, 0); + state->m_tilemap_0_16x16->set_scrollx(0, state->m_scroll_0[0]); + state->m_tilemap_0_16x16->set_scrolly(0, state->m_scroll_0[1]); + state->m_tilemap_0_16x16->draw(bitmap, cliprect, 0, 0); } else { - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_scroll_0[0]); - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_scroll_0[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); + state->m_tilemap_0->set_scrollx(0, state->m_scroll_0[0]); + state->m_tilemap_0->set_scrolly(0, state->m_scroll_0[1]); + state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); } } else { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); } @@ -463,20 +204,20 @@ { if (state->m_head_layersize[0] & 0x0002) { - tilemap_set_scrollx(state->m_tilemap_1_16x16, 0, state->m_scroll_1[0]); - tilemap_set_scrolly(state->m_tilemap_1_16x16, 0, state->m_scroll_1[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1_16x16, 0, 1); + state->m_tilemap_1_16x16->set_scrollx(0, state->m_scroll_1[0]); + state->m_tilemap_1_16x16->set_scrolly(0, state->m_scroll_1[1]); + state->m_tilemap_1_16x16->draw(bitmap, cliprect, 0, 1); } else { - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_scroll_1[0]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_scroll_1[1]); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 1); + state->m_tilemap_1->set_scrollx(0, state->m_scroll_1[0]); + state->m_tilemap_1->set_scrolly(0, state->m_scroll_1[1]); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 1); } } - if (layers_ctrl & 4) esd16_draw_sprites(screen->machine(),bitmap,cliprect); + if (layers_ctrl & 4) screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); // popmessage("%04x %04x %04x %04x %04x",head_unknown1[0],head_layersize[0],head_unknown3[0],head_unknown4[0],head_unknown5[0]); return 0; diff -Nru mame-0.144/src/mame/video/espial.c mame-0.145/src/mame/video/espial.c --- mame-0.144/src/mame/video/espial.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/espial.c 2012-02-06 21:30:31.000000000 +0000 @@ -90,7 +90,7 @@ espial_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); state->save_item(NAME(state->m_flipscreen)); } @@ -102,8 +102,8 @@ /* Net Wars has a tile map that's twice as big as Espial's */ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 64); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 0x100); + state->m_bg_tilemap->set_scroll_cols(32); + state->m_bg_tilemap->set_scrolldy(0, 0x100); state->save_item(NAME(state->m_flipscreen)); } @@ -120,7 +120,7 @@ espial_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -129,7 +129,7 @@ espial_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -138,7 +138,7 @@ espial_state *state = space->machine().driver_data(); state->m_attributeram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -147,7 +147,7 @@ espial_state *state = space->machine().driver_data(); state->m_scrollram[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } @@ -156,7 +156,7 @@ espial_state *state = space->machine().driver_data(); state->m_flipscreen = data; - tilemap_set_flip(state->m_bg_tilemap, state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); } @@ -166,7 +166,7 @@ * *************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { espial_state *state = machine.driver_data(); int offs; @@ -232,11 +232,11 @@ } -SCREEN_UPDATE( espial ) +SCREEN_UPDATE_IND16( espial ) { - espial_state *state = screen->machine().driver_data(); + espial_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/esripsys.c mame-0.145/src/mame/video/esripsys.c --- mame-0.144/src/mame/video/esripsys.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/esripsys.c 2012-02-06 21:30:31.000000000 +0000 @@ -151,9 +151,9 @@ state_save_register_global(machine, state->m_12sel); } -SCREEN_UPDATE( esripsys ) +SCREEN_UPDATE_RGB32( esripsys ) { - esripsys_state *state = screen->machine().driver_data(); + esripsys_state *state = screen.machine().driver_data(); struct line_buffer_t *line_buffer = state->m_line_buffer; int x, y; @@ -161,9 +161,9 @@ UINT8 *intensity_buf = line_buffer[state->m_12sel ? 0 : 1].intensity_buf; UINT8 *priority_buf = line_buffer[state->m_12sel ? 0 : 1].priority_buf; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { - UINT32 *dest = BITMAP_ADDR32(bitmap, y, cliprect->min_x); + UINT32 *dest = &bitmap.pix32(y, cliprect.min_x); for (x = 0; x < 512; ++x) { diff -Nru mame-0.144/src/mame/video/exedexes.c mame-0.145/src/mame/video/exedexes.c --- mame-0.144/src/mame/video/exedexes.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exedexes.c 2012-02-06 21:30:32.000000000 +0000 @@ -85,7 +85,7 @@ exedexes_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( exedexes_colorram_w ) @@ -93,7 +93,7 @@ exedexes_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( exedexes_c804_w ) @@ -155,7 +155,7 @@ int code = state->m_videoram[tile_index] + 2 * (state->m_colorram[tile_index] & 0x80); int color = state->m_colorram[tile_index] & 0x3f; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO(0, code, color, 0); } @@ -180,11 +180,11 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, exedexes_fg_tilemap_scan, 16, 16, 128, 128); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); colortable_configure_tilemap_groups(machine.colortable, state->m_tx_tilemap, machine.gfx[0], 0xcf); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { exedexes_state *state = machine.driver_data(); UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; @@ -217,37 +217,41 @@ } } -SCREEN_UPDATE( exedexes ) +SCREEN_UPDATE_IND16( exedexes ) { - exedexes_state *state = screen->machine().driver_data(); + exedexes_state *state = screen.machine().driver_data(); if (state->m_sc2on) { - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((state->m_bg_scroll[1]) << 8) + state->m_bg_scroll[0]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, ((state->m_bg_scroll[1]) << 8) + state->m_bg_scroll[0]); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); if (state->m_sc1on) { - tilemap_set_scrollx(state->m_fg_tilemap, 0, ((state->m_nbg_yscroll[1]) << 8) + state->m_nbg_yscroll[0]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, ((state->m_nbg_xscroll[1]) << 8) + state->m_nbg_xscroll[0]); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrollx(0, ((state->m_nbg_yscroll[1]) << 8) + state->m_nbg_yscroll[0]); + state->m_fg_tilemap->set_scrolly(0, ((state->m_nbg_xscroll[1]) << 8) + state->m_nbg_xscroll[0]); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); if (state->m_chon) - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( exedexes ) +SCREEN_VBLANK( exedexes ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/exerion.c mame-0.145/src/mame/video/exerion.c --- mame-0.144/src/mame/video/exerion.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exerion.c 2012-02-06 21:30:32.000000000 +0000 @@ -234,13 +234,13 @@ * *************************************/ -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { exerion_state *state = machine.driver_data(); int x, y; /* loop over all visible scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *src0 = &state->m_background_gfx[0][state->m_background_latches[1] * 256]; UINT16 *src1 = &state->m_background_gfx[1][state->m_background_latches[3] * 256]; @@ -266,7 +266,7 @@ if (!state->m_cocktail_flip) { /* skip processing anything that's not visible */ - for (x = BACKGROUND_X_START; x < cliprect->min_x; x++) + for (x = BACKGROUND_X_START; x < cliprect.min_x; x++) { if (!(++xoffs0 & 0x1f)) start0++, stop0++; if (!(++xoffs1 & 0x1f)) start1++, stop1++; @@ -275,7 +275,7 @@ } /* draw the rest of the scanline fully */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 combined = 0; UINT8 lookupval; @@ -303,7 +303,7 @@ else { /* skip processing anything that's not visible */ - for (x = BACKGROUND_X_START; x < cliprect->min_x; x++) + for (x = BACKGROUND_X_START; x < cliprect.min_x; x++) { if (!(xoffs0-- & 0x1f)) start0++, stop0++; if (!(xoffs1-- & 0x1f)) start1++, stop1++; @@ -312,7 +312,7 @@ } /* draw the rest of the scanline fully */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 combined = 0; UINT8 lookupval; @@ -339,7 +339,7 @@ } /* draw the scanline */ - draw_scanline16(bitmap, cliprect->min_x, y, cliprect->max_x - cliprect->min_x + 1, &scanline[cliprect->min_x], NULL); + draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &scanline[cliprect.min_x], NULL); } } @@ -350,13 +350,13 @@ * *************************************/ -SCREEN_UPDATE( exerion ) +SCREEN_UPDATE_IND16( exerion ) { - exerion_state *state = screen->machine().driver_data(); + exerion_state *state = screen.machine().driver_data(); int sx, sy, offs, i; /* draw background */ - draw_background(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); /* draw sprites */ for (i = 0; i < state->m_spriteram_size; i += 4) @@ -373,7 +373,7 @@ int code2 = code; int color = ((flags >> 1) & 0x03) | ((code >> 5) & 0x04) | (code & 0x08) | (state->m_sprite_palette * 16); - const gfx_element *gfx = doubled ? screen->machine().gfx[2] : screen->machine().gfx[1]; + const gfx_element *gfx = doubled ? screen.machine().gfx[2] : screen.machine().gfx[1]; if (state->m_cocktail_flip) { @@ -392,24 +392,24 @@ code &= ~0x10, code2 |= 0x10; drawgfx_transmask(bitmap, cliprect, gfx, code2, color, xflip, yflip, x, y + gfx->height, - colortable_get_transpen_mask(screen->machine().colortable, gfx, color, 0x10)); + colortable_get_transpen_mask(screen.machine().colortable, gfx, color, 0x10)); } drawgfx_transmask(bitmap, cliprect, gfx, code, color, xflip, yflip, x, y, - colortable_get_transpen_mask(screen->machine().colortable, gfx, color, 0x10)); + colortable_get_transpen_mask(screen.machine().colortable, gfx, color, 0x10)); if (doubled) i += 4; } /* draw the visible text layer */ - for (sy = cliprect->min_y/8; sy <= cliprect->max_y/8; sy++) + for (sy = cliprect.min_y/8; sy <= cliprect.max_y/8; sy++) for (sx = VISIBLE_X_MIN/8; sx < VISIBLE_X_MAX/8; sx++) { int x = state->m_cocktail_flip ? (63*8 - 8*sx) : 8*sx; int y = state->m_cocktail_flip ? (31*8 - 8*sy) : 8*sy; offs = sx + sy * 64; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], state->m_videoram[offs] + 256 * state->m_char_bank, ((state->m_videoram[offs] & 0xf0) >> 4) + state->m_char_palette * 16, state->m_cocktail_flip, state->m_cocktail_flip, x, y, 0); diff -Nru mame-0.144/src/mame/video/exidy440.c mame-0.145/src/mame/video/exidy440.c --- mame-0.144/src/mame/video/exidy440.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/exidy440.c 2012-02-06 21:30:33.000000000 +0000 @@ -302,7 +302,7 @@ * *************************************/ -static void draw_sprites(screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect, +static void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int scroll_offset, int check_collision) { exidy440_state *state = screen.machine().driver_data(); @@ -324,7 +324,7 @@ UINT8 *src; /* skip if out of range */ - if (yoffs < cliprect->min_y || yoffs >= cliprect->max_y + 16) + if (yoffs < cliprect.min_y || yoffs >= cliprect.max_y + 16) continue; /* get a pointer to the source image */ @@ -345,11 +345,11 @@ sy += (VBSTART - VBEND); /* stop if we get before the current scanline */ - if (yoffs < cliprect->min_y) + if (yoffs < cliprect.min_y) break; /* only draw scanlines that are in this cliprect */ - if (yoffs <= cliprect->max_y) + if (yoffs <= cliprect.max_y) { UINT8 *old = &state->m_local_videoram[sy * 512 + xoffs]; int currx = xoffs; @@ -367,7 +367,7 @@ { /* combine with the background */ pen = left | old[0]; - *BITMAP_ADDR16(bitmap, yoffs, currx) = pen; + bitmap.pix16(yoffs, currx) = pen; /* check the collisions bit */ if (check_collision && (palette[2 * pen] & 0x80) && (count++ < 128)) @@ -380,7 +380,7 @@ { /* combine with the background */ pen = right | old[1]; - *BITMAP_ADDR16(bitmap, yoffs, currx) = pen; + bitmap.pix16(yoffs, currx) = pen; /* check the collisions bit */ if (check_collision && (palette[2 * pen] & 0x80) && (count++ < 128)) @@ -403,15 +403,15 @@ * *************************************/ -static void update_screen(screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect, +static void update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int scroll_offset, int check_collision) { exidy440_state *state = screen.machine().driver_data(); int y, sy; /* draw any dirty scanlines from the VRAM directly */ - sy = scroll_offset + cliprect->min_y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++, sy++) + sy = scroll_offset + cliprect.min_y; + for (y = cliprect.min_y; y <= cliprect.max_y; y++, sy++) { /* wrap at the bottom of the screen */ if (sy >= VBSTART) @@ -433,18 +433,18 @@ * *************************************/ -static SCREEN_UPDATE( exidy440 ) +static SCREEN_UPDATE_IND16( exidy440 ) { /* redraw the screen */ - update_screen(*screen, bitmap, cliprect, 0, TRUE); + update_screen(screen, bitmap, cliprect, 0, TRUE); /* generate an interrupt once/frame for the beam */ - if (cliprect->max_y == screen->visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { int i; - int beamx = ((input_port_read(screen->machine(), "AN0") & 0xff) * (HBSTART - HBEND)) >> 8; - int beamy = ((input_port_read(screen->machine(), "AN1") & 0xff) * (VBSTART - VBEND)) >> 8; + int beamx = ((input_port_read(screen.machine(), "AN0") & 0xff) * (HBSTART - HBEND)) >> 8; + int beamy = ((input_port_read(screen.machine(), "AN1") & 0xff) * (VBSTART - VBEND)) >> 8; /* The timing of this FIRQ is very important. The games look for an FIRQ and then wait about 650 cycles, clear the old FIRQ, and wait a @@ -452,11 +452,11 @@ From this, it appears that they are expecting to get beams over a 12 scanline period, and trying to pick roughly the middle one. This is how it is implemented. */ - attotime increment = screen->scan_period(); - attotime time = screen->time_until_pos(beamy, beamx) - increment * 6; + attotime increment = screen.scan_period(); + attotime time = screen.time_until_pos(beamy, beamx) - increment * 6; for (i = 0; i <= 12; i++) { - screen->machine().scheduler().timer_set(time, FUNC(beam_firq_callback), beamx); + screen.machine().scheduler().timer_set(time, FUNC(beam_firq_callback), beamx); time += increment; } } @@ -465,11 +465,11 @@ } -static SCREEN_UPDATE( topsecex ) +static SCREEN_UPDATE_IND16( topsecex ) { - exidy440_state *state = screen->machine().driver_data(); + exidy440_state *state = screen.machine().driver_data(); /* redraw the screen */ - update_screen(*screen, bitmap, cliprect, *state->m_topsecex_yscroll, FALSE); + update_screen(screen, bitmap, cliprect, *state->m_topsecex_yscroll, FALSE); return 0; } @@ -488,9 +488,8 @@ MCFG_PALETTE_LENGTH(256) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(exidy440) + MCFG_SCREEN_UPDATE_STATIC(exidy440) MACHINE_CONFIG_END @@ -500,5 +499,5 @@ MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, TOPSECEX_VBSTART) - MCFG_SCREEN_UPDATE(topsecex) + MCFG_SCREEN_UPDATE_STATIC(topsecex) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/exidy.c mame-0.145/src/mame/video/exidy.c --- mame-0.144/src/mame/video/exidy.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exidy.c 2012-02-06 21:30:32.000000000 +0000 @@ -34,21 +34,20 @@ VIDEO_START( exidy ) { exidy_state *state = machine.driver_data(); - bitmap_format format = machine.primary_screen->format(); - state->m_background_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_motion_object_1_vid = auto_bitmap_alloc(machine, 16, 16, format); - state->m_motion_object_2_vid = auto_bitmap_alloc(machine, 16, 16, format); - state->m_motion_object_2_clip = auto_bitmap_alloc(machine, 16, 16, format); + machine.primary_screen->register_screen_bitmap(state->m_background_bitmap); + state->m_motion_object_1_vid.allocate(16, 16); + state->m_motion_object_2_vid.allocate(16, 16); + state->m_motion_object_2_clip.allocate(16, 16); state_save_register_global(machine, state->m_collision_mask); state_save_register_global(machine, state->m_collision_invert); state_save_register_global(machine, state->m_is_2bpp); state_save_register_global(machine, state->m_int_condition); - state_save_register_global_bitmap(machine, state->m_background_bitmap); - state_save_register_global_bitmap(machine, state->m_motion_object_1_vid); - state_save_register_global_bitmap(machine, state->m_motion_object_2_vid); - state_save_register_global_bitmap(machine, state->m_motion_object_2_clip); + state_save_register_global_bitmap(machine, &state->m_background_bitmap); + state_save_register_global_bitmap(machine, &state->m_motion_object_1_vid); + state_save_register_global_bitmap(machine, &state->m_motion_object_2_vid); + state_save_register_global_bitmap(machine, &state->m_motion_object_2_clip); } @@ -171,9 +170,9 @@ for (i = 0; i < 8; i++) { if (data1 & 0x80) - *BITMAP_ADDR16(state->m_background_bitmap, y, x) = (data2 & 0x80) ? on_pen_2 : on_pen_1; + state->m_background_bitmap.pix16(y, x) = (data2 & 0x80) ? on_pen_2 : on_pen_1; else - *BITMAP_ADDR16(state->m_background_bitmap, y, x) = off_pen; + state->m_background_bitmap.pix16(y, x) = off_pen; x = x + 1; data1 = data1 << 1; @@ -187,7 +186,7 @@ for (i = 0; i < 8; i++) { - *BITMAP_ADDR16(state->m_background_bitmap, y, x) = (data & 0x80) ? on_pen_1 : off_pen; + state->m_background_bitmap.pix16(y, x) = (data & 0x80) ? on_pen_1 : off_pen; x = x + 1; data = data << 1; @@ -215,7 +214,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { exidy_state *state = machine.driver_data(); /* draw sprite 2 first */ @@ -280,7 +279,7 @@ exidy_state *state = machine.driver_data(); UINT8 sprite_set_1 = ((*state->m_sprite_enable & 0x20) != 0); UINT8 sprite_set_2 = ((*state->m_sprite_enable & 0x40) != 0); - static const rectangle clip = { 0, 15, 0, 15 }; + const rectangle clip(0, 15, 0, 15); int org_1_x = 0, org_1_y = 0; int org_2_x = 0, org_2_y = 0; int sx, sy; @@ -291,31 +290,31 @@ return; /* draw sprite 1 */ - bitmap_fill(state->m_motion_object_1_vid, &clip, 0xff); + state->m_motion_object_1_vid.fill(0xff, clip); if (sprite_1_enabled(state)) { org_1_x = 236 - *state->m_sprite1_xpos - 4; org_1_y = 244 - *state->m_sprite1_ypos - 4; - drawgfx_transpen(state->m_motion_object_1_vid, &clip, machine.gfx[0], + drawgfx_transpen(state->m_motion_object_1_vid, clip, machine.gfx[0], (*state->m_spriteno & 0x0f) + 16 * sprite_set_1, 0, 0, 0, 0, 0, 0); } /* draw sprite 2 */ - bitmap_fill(state->m_motion_object_2_vid, &clip, 0xff); + state->m_motion_object_2_vid.fill(0xff, clip); org_2_x = 236 - *state->m_sprite2_xpos - 4; org_2_y = 244 - *state->m_sprite2_ypos - 4; - drawgfx_transpen(state->m_motion_object_2_vid, &clip, machine.gfx[0], + drawgfx_transpen(state->m_motion_object_2_vid, clip, machine.gfx[0], ((*state->m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0, 0, 0, 0, 0, 0); /* draw sprite 2 clipped to sprite 1's location */ - bitmap_fill(state->m_motion_object_2_clip, &clip, 0xff); + state->m_motion_object_2_clip.fill(0xff, clip); if (sprite_1_enabled(state)) { sx = org_2_x - org_1_x; sy = org_2_y - org_1_y; - drawgfx_transpen(state->m_motion_object_2_clip, &clip, machine.gfx[0], + drawgfx_transpen(state->m_motion_object_2_clip, clip, machine.gfx[0], ((*state->m_spriteno >> 4) & 0x0f) + 32 + 16 * sprite_set_2, 0, 0, 0, sx, sy, 0); } @@ -324,16 +323,16 @@ for (sy = 0; sy < 16; sy++) for (sx = 0; sx < 16; sx++) { - if (*BITMAP_ADDR16(state->m_motion_object_1_vid, sy, sx) != 0xff) + if (state->m_motion_object_1_vid.pix16(sy, sx) != 0xff) { UINT8 current_collision_mask = 0; /* check for background collision (M1CHAR) */ - if (*BITMAP_ADDR16(state->m_background_bitmap, org_1_y + sy, org_1_x + sx) != 0) + if (state->m_background_bitmap.pix16(org_1_y + sy, org_1_x + sx) != 0) current_collision_mask |= 0x04; /* check for motion object collision (M1M2) */ - if (*BITMAP_ADDR16(state->m_motion_object_2_clip, sy, sx) != 0xff) + if (state->m_motion_object_2_clip.pix16(sy, sx) != 0xff) current_collision_mask |= 0x10; /* if we got one, trigger an interrupt */ @@ -341,10 +340,10 @@ machine.scheduler().timer_set(machine.primary_screen->time_until_pos(org_1_x + sx, org_1_y + sy), FUNC(collision_irq_callback), current_collision_mask); } - if (*BITMAP_ADDR16(state->m_motion_object_2_vid, sy, sx) != 0xff) + if (state->m_motion_object_2_vid.pix16(sy, sx) != 0xff) { /* check for background collision (M2CHAR) */ - if (*BITMAP_ADDR16(state->m_background_bitmap, org_2_y + sy, org_2_x + sx) != 0) + if (state->m_background_bitmap.pix16(org_2_y + sy, org_2_x + sx) != 0) if ((state->m_collision_mask & 0x08) && (count++ < 128)) machine.scheduler().timer_set(machine.primary_screen->time_until_pos(org_2_x + sx, org_2_y + sy), FUNC(collision_irq_callback), 0x08); } @@ -359,21 +358,21 @@ * *************************************/ -SCREEN_UPDATE( exidy ) +SCREEN_UPDATE_IND16( exidy ) { - exidy_state *state = screen->machine().driver_data(); + exidy_state *state = screen.machine().driver_data(); /* refresh the colors from the palette (static or dynamic) */ - set_colors(screen->machine()); + set_colors(screen.machine()); /* update the background and draw it */ - draw_background(screen->machine()); + draw_background(screen.machine()); copybitmap(bitmap, state->m_background_bitmap, 0, 0, 0, 0, cliprect); /* draw the sprites */ - draw_sprites(screen->machine(), bitmap, NULL); + draw_sprites(screen.machine(), bitmap, cliprect); /* check for collision, this will set the appropriate bits in collision_mask */ - check_collision(screen->machine()); + check_collision(screen.machine()); return 0; } diff -Nru mame-0.144/src/mame/video/exprraid.c mame-0.145/src/mame/video/exprraid.c --- mame-0.144/src/mame/video/exprraid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exprraid.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,14 +6,14 @@ { exprraid_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( exprraid_colorram_w ) { exprraid_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( exprraid_flipscreen_w ) @@ -21,7 +21,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -31,20 +31,20 @@ if (state->m_bg_index[offset] != data) { state->m_bg_index[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } WRITE8_HANDLER( exprraid_scrollx_w ) { exprraid_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrollx(offset, data); } WRITE8_HANDLER( exprraid_scrolly_w ) { exprraid_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } static TILE_GET_INFO( get_bg_tile_info ) @@ -70,7 +70,7 @@ color = (attr & 0x18) >> 3; flags = (attr & 0x04) ? TILE_FLIPX : 0; - tileinfo->category = ((attr & 0x80) ? 1 : 0); + tileinfo.category = ((attr & 0x80) ? 1 : 0); SET_TILE_INFO(bank, code, color, flags); } @@ -92,11 +92,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 2); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_scroll_rows(2); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { exprraid_state *state = machine.driver_data(); int offs; @@ -119,7 +119,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap, 0, machine.gfx[1], + drawgfx_transpen(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, sx, sy, 0); @@ -136,12 +136,12 @@ } } -SCREEN_UPDATE( exprraid ) +SCREEN_UPDATE_IND16( exprraid ) { - exprraid_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + exprraid_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/exterm.c mame-0.145/src/mame/video/exterm.c --- mame-0.144/src/mame/video/exterm.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exterm.c 2012-02-06 21:30:31.000000000 +0000 @@ -67,12 +67,12 @@ * *************************************/ -void exterm_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void exterm_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { exterm_state *state = screen.machine().driver_data(); UINT16 *bgsrc = &state->m_master_videoram[(params->rowaddr << 8) & 0xff00]; UINT16 *fgsrc = NULL; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); tms34010_display_params fgparams; int coladdr = params->coladdr; int fgcoladdr = 0; diff -Nru mame-0.144/src/mame/video/exzisus.c mame-0.145/src/mame/video/exzisus.c --- mame-0.144/src/mame/video/exzisus.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/exzisus.c 2012-02-06 21:30:32.000000000 +0000 @@ -76,15 +76,15 @@ Screen refresh ***************************************************************************/ -SCREEN_UPDATE( exzisus ) +SCREEN_UPDATE_IND16( exzisus ) { - exzisus_state *state = screen->machine().driver_data(); + exzisus_state *state = screen.machine().driver_data(); int offs; int sx, sy, xc, yc; int gfx_num, gfx_attr, gfx_offs; /* Is this correct ? */ - bitmap_fill(bitmap, cliprect, 1023); + bitmap.fill(1023, cliprect); /* ---------- 1st TC0010VCU ---------- */ sx = 0; @@ -139,16 +139,16 @@ x = (sx + (xc << 3)) & 0xff; y = (sy + (yc << 3)) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { x = 248 - x; y = 248 - y; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], code & 0x3fff, color, - flip_screen_get(screen->machine()), flip_screen_get(screen->machine()), + flip_screen_get(screen.machine()), flip_screen_get(screen.machine()), x, y, 15); goffs += 2; } @@ -208,16 +208,16 @@ x = (sx + (xc << 3)) & 0xff; y = (sy + (yc << 3)) & 0xff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { x = 248 - x; y = 248 - y; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code & 0x3fff, color, - flip_screen_get(screen->machine()), flip_screen_get(screen->machine()), + flip_screen_get(screen.machine()), flip_screen_get(screen.machine()), x, y, 15); goffs += 2; } diff -Nru mame-0.144/src/mame/video/f1gp.c mame-0.145/src/mame/video/f1gp.c --- mame-0.144/src/mame/video/f1gp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/f1gp.c 2012-02-06 21:30:31.000000000 +0000 @@ -50,7 +50,7 @@ state->m_roz_tilemap = tilemap_create(machine, f1gp_get_roz_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xff); + state->m_fg_tilemap->set_transparent_pen(0xff); state->m_zoomdata = (UINT16 *)machine.region("gfx4")->base(); gfx_element_set_source(machine.gfx[3], (UINT8 *)state->m_zoomdata); @@ -66,7 +66,7 @@ state->m_roz_tilemap = tilemap_create(machine, f1gp_get_roz_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xff); + state->m_fg_tilemap->set_transparent_pen(0xff); state->m_zoomdata = (UINT16 *)machine.region("gfx4")->base(); gfx_element_set_source(machine.gfx[3], (UINT8 *)state->m_zoomdata); @@ -81,11 +81,11 @@ state->m_roz_tilemap = tilemap_create(machine, f1gp2_get_roz_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xff); - tilemap_set_transparent_pen(state->m_roz_tilemap, 0x0f); + state->m_fg_tilemap->set_transparent_pen(0xff); + state->m_roz_tilemap->set_transparent_pen(0x0f); - tilemap_set_scrolldx(state->m_fg_tilemap, -80, 0); - tilemap_set_scrolldy(state->m_fg_tilemap, -26, 0); + state->m_fg_tilemap->set_scrolldx(-80, 0); + state->m_fg_tilemap->set_scrolldy(-26, 0); } @@ -118,14 +118,14 @@ { f1gp_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_rozvideoram[offset]); - tilemap_mark_tile_dirty(state->m_roz_tilemap, offset); + state->m_roz_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( f1gp_fgvideoram_w ) { f1gp_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( f1gp_fgscroll_w ) @@ -133,8 +133,8 @@ f1gp_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll[offset]); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll[0]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll[1]); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll[0]); + state->m_fg_tilemap->set_scrolly(0, state->m_scroll[1]); } WRITE16_HANDLER( f1gp_gfxctrl_w ) @@ -165,7 +165,7 @@ if (state->m_roz_bank != (data >> 8)) { state->m_roz_bank = (data >> 8); - tilemap_mark_all_tiles_dirty(state->m_roz_tilemap); + state->m_roz_tilemap->mark_all_dirty(); } } } @@ -177,7 +177,7 @@ ***************************************************************************/ -static void f1gp_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int chip, int primask ) +static void f1gp_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, int primask ) { f1gp_state *state = machine.driver_data(); int attr_start, first; @@ -250,32 +250,32 @@ } -SCREEN_UPDATE( f1gp ) +SCREEN_UPDATE_IND16( f1gp ) { - f1gp_state *state = screen->machine().driver_data(); + f1gp_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 1); /* quick kludge for "continue" screen priority */ if (state->m_gfxctrl == 0x00) { - f1gp_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0x02); - f1gp_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0x02); + f1gp_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0x02); + f1gp_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0x02); } else { - f1gp_draw_sprites(screen->machine(), bitmap, cliprect, 0, 0x00); - f1gp_draw_sprites(screen->machine(), bitmap, cliprect, 1, 0x02); + f1gp_draw_sprites(screen.machine(), bitmap, cliprect, 0, 0x00); + f1gp_draw_sprites(screen.machine(), bitmap, cliprect, 1, 0x02); } return 0; } -static void f1gpb_draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void f1gpb_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { f1gp_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -343,9 +343,9 @@ } } -SCREEN_UPDATE( f1gpb ) +SCREEN_UPDATE_IND16( f1gpb ) { - f1gp_state *state = screen->machine().driver_data(); + f1gp_state *state = screen.machine().driver_data(); UINT32 startx, starty; int incxx, incxy, incyx, incyy; @@ -355,24 +355,24 @@ startx = state->m_rozregs[0] + 328; starty = state->m_rozregs[2]; - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fgregs[0] + 8); + state->m_fg_tilemap->set_scrolly(0, state->m_fgregs[0] + 8); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw_roz(bitmap, cliprect, state->m_roz_tilemap, + state->m_roz_tilemap->draw_roz(bitmap, cliprect, startx << 13, starty << 13, incxx << 5, incxy << 5, incyx << 5, incyy << 5, 1, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 1); - f1gpb_draw_sprites(screen->machine(), bitmap, cliprect); + f1gpb_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -static void f1gp2_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void f1gp2_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { f1gp_state *state = machine.driver_data(); int offs; @@ -444,30 +444,30 @@ } -SCREEN_UPDATE( f1gp2 ) +SCREEN_UPDATE_IND16( f1gp2 ) { - f1gp_state *state = screen->machine().driver_data(); + f1gp_state *state = screen.machine().driver_data(); if (state->m_gfxctrl & 4) /* blank screen */ - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); else { switch (state->m_gfxctrl & 3) { case 0: k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, TILEMAP_DRAW_OPAQUE, 0, 1); - f1gp2_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + f1gp2_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); break; case 1: k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, TILEMAP_DRAW_OPAQUE, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - f1gp2_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + f1gp2_draw_sprites(screen.machine(), bitmap, cliprect); break; case 2: - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 0, 1); - f1gp2_draw_sprites(screen->machine(), bitmap, cliprect); + f1gp2_draw_sprites(screen.machine(), bitmap, cliprect); break; #ifdef MAME_DEBUG case 3: diff -Nru mame-0.144/src/mame/video/fantland.c mame-0.145/src/mame/video/fantland.c --- mame-0.144/src/mame/video/fantland.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fantland.c 2012-02-06 21:30:31.000000000 +0000 @@ -61,7 +61,7 @@ #include "emu.h" #include "includes/fantland.h" -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { fantland_state *state = machine.driver_data(); UINT8 *spriteram_2 = state->m_spriteram2; @@ -139,10 +139,10 @@ } } -SCREEN_UPDATE( fantland ) +SCREEN_UPDATE_IND16( fantland ) { - bitmap_fill(bitmap,cliprect,0); - draw_sprites(screen->machine(),bitmap,cliprect); + bitmap.fill(0, cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/fastfred.c mame-0.145/src/mame/video/fastfred.c --- mame-0.144/src/mame/video/fastfred.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fastfred.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,19 +12,6 @@ -static const rectangle spritevisiblearea = -{ - 2*8, 32*8-1, - 2*8, 30*8-1 -}; - -static const rectangle spritevisibleareaflipx = -{ - 0*8, 30*8-1, - 2*8, 30*8-1 -}; - - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -116,8 +103,8 @@ fastfred_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); } @@ -131,7 +118,7 @@ { fastfred_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -146,12 +133,12 @@ int i; for (i = offset / 2; i < 0x0400; i += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); } else { /* coloumn scroll */ - tilemap_set_scrolly(state->m_bg_tilemap, offset / 2, data); + state->m_bg_tilemap->set_scrolly(offset / 2, data); } state->m_attributesram[offset] = data; @@ -166,7 +153,7 @@ if (new_data != state->m_charbank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_charbank = new_data; } @@ -179,7 +166,7 @@ if (new_data != state->m_charbank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_charbank = new_data; } @@ -193,7 +180,7 @@ if (new_data != state->m_colorbank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_colorbank = new_data; } @@ -206,7 +193,7 @@ if (new_data != state->m_colorbank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_colorbank = new_data; } @@ -221,7 +208,7 @@ { flip_screen_x_set(space->machine(), data & 0x01); - tilemap_set_flip(state->m_bg_tilemap, (flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); } } @@ -232,7 +219,7 @@ { flip_screen_y_set(space->machine(), data & 0x01); - tilemap_set_flip(state->m_bg_tilemap, (flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); } } @@ -244,8 +231,10 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { + const rectangle spritevisiblearea(2*8, 32*8-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflipx(0*8, 30*8-1, 2*8, 30*8-1); fastfred_state *state = machine.driver_data(); int offs; @@ -298,7 +287,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap,flip_screen_x_get(machine) ? &spritevisibleareaflipx : &spritevisiblearea,machine.gfx[1], + drawgfx_transpen(bitmap,flip_screen_x_get(machine) ? spritevisibleareaflipx : spritevisiblearea,machine.gfx[1], code, state->m_colorbank | (state->m_spriteram[offs + 2] & 0x07), flipx,flipy, @@ -307,12 +296,12 @@ } -SCREEN_UPDATE( fastfred ) +SCREEN_UPDATE_IND16( fastfred ) { - fastfred_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, *state->m_background_color); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap, cliprect); + fastfred_state *state = screen.machine().driver_data(); + bitmap.fill(*state->m_background_color, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -345,7 +334,7 @@ { fastfred_state *state = space->machine().driver_data(); state->m_imago_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( imago_charbank_w ) @@ -354,7 +343,7 @@ if( state->m_charbank != data ) { state->m_charbank = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -365,8 +354,8 @@ state->m_bg_tilemap = tilemap_create(machine, imago_get_tile_info_bg, tilemap_scan_rows,8,8,32,32); state->m_fg_tilemap = tilemap_create(machine, imago_get_tile_info_fg, tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); /* the game has a galaxian starfield */ galaxold_init_stars(machine, 256); @@ -377,14 +366,14 @@ palette_set_color(machine,256+64+1,MAKE_RGB(0x00,0x00,0x00)); } -SCREEN_UPDATE( imago ) +SCREEN_UPDATE_IND16( imago ) { - fastfred_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_web_tilemap,0,0); - galaxold_draw_stars(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + fastfred_state *state = screen.machine().driver_data(); + state->m_web_tilemap->draw(bitmap, cliprect, 0,0); + galaxold_draw_stars(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/fastlane.c mame-0.145/src/mame/video/fastlane.c --- mame-0.144/src/mame/video/fastlane.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fastlane.c 2012-02-06 21:30:31.000000000 +0000 @@ -117,7 +117,7 @@ state->m_layer0 = tilemap_create(machine, get_tile_info0, tilemap_scan_rows, 8, 8, 32, 32); state->m_layer1 = tilemap_create(machine, get_tile_info1, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_layer0, 32); + state->m_layer0->set_scroll_rows(32); state->m_clip0 = machine.primary_screen->visible_area(); state->m_clip0.min_x += 40; @@ -137,14 +137,14 @@ { fastlane_state *state = space->machine().driver_data(); state->m_videoram1[offset] = data; - tilemap_mark_tile_dirty(state->m_layer0, offset & 0x3ff); + state->m_layer0->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( fastlane_vram2_w ) { fastlane_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_layer1, offset & 0x3ff); + state->m_layer1->mark_tile_dirty(offset & 0x3ff); } @@ -155,26 +155,26 @@ ***************************************************************************/ -SCREEN_UPDATE( fastlane ) +SCREEN_UPDATE_IND16( fastlane ) { - fastlane_state *state = screen->machine().driver_data(); + fastlane_state *state = screen.machine().driver_data(); rectangle finalclip0 = state->m_clip0, finalclip1 = state->m_clip1; int i, xoffs; - sect_rect(&finalclip0, cliprect); - sect_rect(&finalclip1, cliprect); + finalclip0 &= cliprect; + finalclip1 &= cliprect; - set_pens(screen->machine()); + set_pens(screen.machine()); /* set scroll registers */ xoffs = k007121_ctrlram_r(state->m_k007121, 0); for (i = 0; i < 32; i++) - tilemap_set_scrollx(state->m_layer0, i, state->m_k007121_regs[0x20 + i] + xoffs - 40); + state->m_layer0->set_scrollx(i, state->m_k007121_regs[0x20 + i] + xoffs - 40); - tilemap_set_scrolly(state->m_layer0, 0, k007121_ctrlram_r(state->m_k007121, 2)); + state->m_layer0->set_scrolly(0, k007121_ctrlram_r(state->m_k007121, 2)); - tilemap_draw(bitmap, &finalclip0, state->m_layer0, 0, 0); - k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen->machine().gfx[0], screen->machine().colortable, state->m_spriteram, 0, 40, 0, (UINT32)-1); - tilemap_draw(bitmap, &finalclip1, state->m_layer1, 0, 0); + state->m_layer0->draw(bitmap, finalclip0, 0, 0); + k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen.machine().gfx[0], screen.machine().colortable, state->m_spriteram, 0, 40, 0, (UINT32)-1); + state->m_layer1->draw(bitmap, finalclip1, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/fcombat.c mame-0.145/src/mame/video/fcombat.c --- mame-0.144/src/mame/video/fcombat.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fcombat.c 2012-02-06 21:30:33.000000000 +0000 @@ -134,17 +134,17 @@ -SCREEN_UPDATE( fcombat ) +SCREEN_UPDATE_IND16( fcombat ) { - fcombat_state *state = screen->machine().driver_data(); + fcombat_state *state = screen.machine().driver_data(); int sx, sy, offs, i; /* draw background */ - tilemap_set_scrolly(state->m_bgmap, 0, state->m_fcombat_sh); - tilemap_set_scrollx(state->m_bgmap, 0, state->m_fcombat_sv - 24); + state->m_bgmap->set_scrolly(0, state->m_fcombat_sh); + state->m_bgmap->set_scrollx(0, state->m_fcombat_sv - 24); - tilemap_mark_all_tiles_dirty(state->m_bgmap); - tilemap_draw(bitmap, cliprect, state->m_bgmap, 0, 0); + state->m_bgmap->mark_all_dirty(); + state->m_bgmap->draw(bitmap, cliprect, 0, 0); //draw_background(bitmap, cliprect); /* draw sprites */ @@ -162,7 +162,7 @@ int code2 = code; int color = ((flags >> 1) & 0x03) | ((code >> 5) & 0x04) | (code & 0x08) | (state->m_sprite_palette * 16); - const gfx_element *gfx = screen->machine().gfx[1]; + const gfx_element *gfx = screen.machine().gfx[1]; if (state->m_cocktail_flip) { @@ -204,7 +204,7 @@ int y = state->m_cocktail_flip ? (31 * 8 - 8 * sy) : 8 * sy; offs = sx + sy * 64; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], state->m_videoram[offs] + 256 * state->m_char_bank, ((state->m_videoram[offs] & 0xf0) >> 4) + state->m_char_palette * 16, state->m_cocktail_flip, state->m_cocktail_flip, x, y, 0); diff -Nru mame-0.144/src/mame/video/fgoal.c mame-0.145/src/mame/video/fgoal.c --- mame-0.144/src/mame/video/fgoal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/fgoal.c 2012-02-06 21:30:31.000000000 +0000 @@ -32,17 +32,17 @@ VIDEO_START( fgoal ) { fgoal_state *state = machine.driver_data(); - state->m_fgbitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_bgbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_fgbitmap); + machine.primary_screen->register_screen_bitmap(state->m_bgbitmap); - state->save_item(NAME(*state->m_fgbitmap)); - state->save_item(NAME(*state->m_bgbitmap)); + state->save_item(NAME(state->m_fgbitmap)); + state->save_item(NAME(state->m_bgbitmap)); } -SCREEN_UPDATE( fgoal ) +SCREEN_UPDATE_IND16( fgoal ) { - fgoal_state *state = screen->machine().driver_data(); + fgoal_state *state = screen.machine().driver_data(); const UINT8* VRAM = state->m_video_ram; int x; @@ -51,16 +51,16 @@ /* draw color overlay foreground and background */ - if (state->m_fgoal_player == 1 && (input_port_read(screen->machine(), "IN1") & 0x40)) + if (state->m_fgoal_player == 1 && (input_port_read(screen.machine(), "IN1") & 0x40)) { - drawgfxzoom_opaque(state->m_fgbitmap, cliprect, screen->machine().gfx[0], + drawgfxzoom_opaque(state->m_fgbitmap, cliprect, screen.machine().gfx[0], 0, (state->m_fgoal_player << 2) | state->m_current_color, 1, 1, 0, 16, 0x40000, 0x40000); - drawgfxzoom_opaque(state->m_bgbitmap, cliprect, screen->machine().gfx[1], + drawgfxzoom_opaque(state->m_bgbitmap, cliprect, screen.machine().gfx[1], 0, 0, 1, 1, 0, 16, @@ -69,14 +69,14 @@ } else { - drawgfxzoom_opaque(state->m_fgbitmap, cliprect, screen->machine().gfx[0], + drawgfxzoom_opaque(state->m_fgbitmap, cliprect, screen.machine().gfx[0], 0, (state->m_fgoal_player << 2) | state->m_current_color, 0, 0, 0, 0, 0x40000, 0x40000); - drawgfxzoom_opaque(state->m_bgbitmap, cliprect, screen->machine().gfx[1], + drawgfxzoom_opaque(state->m_bgbitmap, cliprect, screen.machine().gfx[1], 0, 0, 0, 0, 0, 0, @@ -92,7 +92,7 @@ { if (y < 256 && x < 256) { - *BITMAP_ADDR16(state->m_fgbitmap, y, x) = 128 + 16; + state->m_fgbitmap.pix16(y, x) = 128 + 16; } } } @@ -101,10 +101,10 @@ for (y = 0; y < 256; y++) { - UINT16* p = BITMAP_ADDR16(bitmap, y, 0); + UINT16* p = &bitmap.pix16(y); - const UINT16* FG = BITMAP_ADDR16(state->m_fgbitmap, y, 0); - const UINT16* BG = BITMAP_ADDR16(state->m_bgbitmap, y, 0); + const UINT16* FG = &state->m_fgbitmap.pix16(y); + const UINT16* BG = &state->m_bgbitmap.pix16(y); for (x = 0; x < 256; x += 8) { diff -Nru mame-0.144/src/mame/video/finalizr.c mame-0.145/src/mame/video/finalizr.c --- mame-0.144/src/mame/video/finalizr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/finalizr.c 2012-02-06 21:30:31.000000000 +0000 @@ -85,21 +85,21 @@ -SCREEN_UPDATE( finalizr ) +SCREEN_UPDATE_IND16( finalizr ) { - finalizr_state *state = screen->machine().driver_data(); + finalizr_state *state = screen.machine().driver_data(); int offs; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); + state->m_fg_tilemap->mark_all_dirty(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, *state->m_scroll - 32); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, *state->m_scroll - 32); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* Draw the sprites. */ { - const gfx_element *gfx1 = screen->machine().gfx[1]; - const gfx_element *gfx2 = screen->machine().gfx[2]; + const gfx_element *gfx1 = screen.machine().gfx[1]; + const gfx_element *gfx2 = screen.machine().gfx[2]; UINT8 *sr = state->m_spriterambank ? state->m_spriteram_2 : state->m_spriteram; @@ -122,7 +122,7 @@ if (size >= 0x10) /* 32x32 */ { - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 256 - sx; sy = 224 - sy; @@ -153,7 +153,7 @@ } else { - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = ((size & 0x08) ? 280:272) - sx; sy = ((size & 0x04) ? 248:240) - sy; @@ -213,14 +213,14 @@ } { - const rectangle &visarea = screen->visible_area(); - rectangle clip = *cliprect; + const rectangle &visarea = screen.visible_area(); + rectangle clip = cliprect; /* draw top status region */ clip.min_x = visarea.min_x; clip.max_x = visarea.min_x + 31; - tilemap_set_scrolldx(state->m_fg_tilemap, 0,-32); - tilemap_draw(bitmap, &clip, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->set_scrolldx(0,-32); + state->m_fg_tilemap->draw(bitmap, clip, 0, 0); } return 0; } diff -Nru mame-0.144/src/mame/video/firetrap.c mame-0.145/src/mame/video/firetrap.c --- mame-0.144/src/mame/video/firetrap.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/firetrap.c 2012-02-06 21:30:31.000000000 +0000 @@ -95,7 +95,7 @@ 0); } -INLINE void get_bg_tile_info(running_machine &machine, tile_data *tileinfo, int tile_index, UINT8 *bgvideoram, int gfx_region) +INLINE void get_bg_tile_info(running_machine &machine, tile_data &tileinfo, int tile_index, UINT8 *bgvideoram, int gfx_region) { int code = bgvideoram[tile_index]; int color = bgvideoram[tile_index + 0x100]; @@ -132,8 +132,8 @@ state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info, get_bg_memory_offset, 16, 16, 32, 32); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, get_bg_memory_offset, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg1_tilemap->set_transparent_pen(0); } @@ -147,21 +147,21 @@ { firetrap_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( firetrap_bg1videoram_w ) { firetrap_state *state = space->machine().driver_data(); state->m_bg1videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset & 0x6ff); + state->m_bg1_tilemap->mark_tile_dirty(offset & 0x6ff); } WRITE8_HANDLER( firetrap_bg2videoram_w ) { firetrap_state *state = space->machine().driver_data(); state->m_bg2videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset & 0x6ff); + state->m_bg2_tilemap->mark_tile_dirty(offset & 0x6ff); } @@ -169,28 +169,28 @@ { firetrap_state *state = space->machine().driver_data(); state->m_scroll1_x[offset] = data; - tilemap_set_scrollx(state->m_bg1_tilemap, 0, state->m_scroll1_x[0] | (state->m_scroll1_x[1] << 8)); + state->m_bg1_tilemap->set_scrollx(0, state->m_scroll1_x[0] | (state->m_scroll1_x[1] << 8)); } WRITE8_HANDLER( firetrap_bg1_scrolly_w ) { firetrap_state *state = space->machine().driver_data(); state->m_scroll1_y[offset] = data; - tilemap_set_scrolly(state->m_bg1_tilemap, 0, -(state->m_scroll1_y[0] | (state->m_scroll1_y[1] << 8))); + state->m_bg1_tilemap->set_scrolly(0, -(state->m_scroll1_y[0] | (state->m_scroll1_y[1] << 8))); } WRITE8_HANDLER( firetrap_bg2_scrollx_w ) { firetrap_state *state = space->machine().driver_data(); state->m_scroll2_x[offset] = data; - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_scroll2_x[0] | (state->m_scroll2_x[1] << 8)); + state->m_bg2_tilemap->set_scrollx(0, state->m_scroll2_x[0] | (state->m_scroll2_x[1] << 8)); } WRITE8_HANDLER( firetrap_bg2_scrolly_w ) { firetrap_state *state = space->machine().driver_data(); state->m_scroll2_y[offset] = data; - tilemap_set_scrolly(state->m_bg2_tilemap, 0, -(state->m_scroll2_y[0] | (state->m_scroll2_y[1] << 8))); + state->m_bg2_tilemap->set_scrolly(0, -(state->m_scroll2_y[0] | (state->m_scroll2_y[1] << 8))); } @@ -200,7 +200,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { firetrap_state *state = machine.driver_data(); int offs; @@ -271,12 +271,12 @@ } } -SCREEN_UPDATE( firetrap ) +SCREEN_UPDATE_IND16( firetrap ) { - firetrap_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + firetrap_state *state = screen.machine().driver_data(); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/firetrk.c mame-0.145/src/mame/video/firetrk.c --- mame-0.144/src/mame/video/firetrk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/firetrk.c 2012-02-06 21:30:33.000000000 +0000 @@ -13,7 +13,7 @@ -static const rectangle playfield_window = { 0x02a, 0x115, 0x000, 0x0ff }; +static const rectangle playfield_window(0x02a, 0x115, 0x000, 0x0ff); @@ -225,8 +225,8 @@ VIDEO_START( firetrk ) { firetrk_state *state = machine.driver_data(); - state->m_helper1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper1); + machine.primary_screen->register_screen_bitmap(state->m_helper2); state->m_tilemap1 = tilemap_create(machine, firetrk_get_tile_info1, tilemap_scan_rows, 16, 16, 16, 16); state->m_tilemap2 = tilemap_create(machine, firetrk_get_tile_info2, tilemap_scan_rows, 16, 16, 16, 16); @@ -236,8 +236,8 @@ VIDEO_START( superbug ) { firetrk_state *state = machine.driver_data(); - state->m_helper1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper1); + machine.primary_screen->register_screen_bitmap(state->m_helper2); state->m_tilemap1 = tilemap_create(machine, superbug_get_tile_info1, tilemap_scan_rows, 16, 16, 16, 16); state->m_tilemap2 = tilemap_create(machine, superbug_get_tile_info2, tilemap_scan_rows, 16, 16, 16, 16); @@ -247,15 +247,15 @@ VIDEO_START( montecar ) { firetrk_state *state = machine.driver_data(); - state->m_helper1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper1); + machine.primary_screen->register_screen_bitmap(state->m_helper2); state->m_tilemap1 = tilemap_create(machine, montecar_get_tile_info1, tilemap_scan_rows, 16, 16, 16, 16); state->m_tilemap2 = tilemap_create(machine, montecar_get_tile_info2, tilemap_scan_rows, 16, 16, 16, 16); } -static void firetrk_draw_car(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, gfx_element **gfx, int which, int flash) +static void firetrk_draw_car(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element **gfx, int which, int flash) { firetrk_state *state = machine.driver_data(); int gfx_bank, code, color, flip_x, flip_y, x, y; @@ -285,7 +285,7 @@ } -static void superbug_draw_car(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, gfx_element **gfx, int flash) +static void superbug_draw_car(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element **gfx, int flash) { firetrk_state *state = machine.driver_data(); int gfx_bank = (*state->m_car_rot & 0x10) ? 4 : 3; @@ -298,7 +298,7 @@ } -static void montecar_draw_car(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, gfx_element **gfx, int which, int is_collision_detection) +static void montecar_draw_car(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element **gfx, int which, int is_collision_detection) { firetrk_state *state = machine.driver_data(); int gfx_bank, code, color, flip_x, flip_y, x, y; @@ -328,7 +328,7 @@ } -static void draw_text(bitmap_t *bitmap, const rectangle *cliprect, gfx_element **gfx, UINT8 *alpha_ram, +static void draw_text(bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element **gfx, UINT8 *alpha_ram, int x, int count, int height) { int i; @@ -345,8 +345,8 @@ for (y = playfield_window.min_y; y <= playfield_window.max_y; y++) for (x = playfield_window.min_x; x <= playfield_window.max_x; x++) { - pen_t a = *BITMAP_ADDR16(state->m_helper1, y, x); - pen_t b = *BITMAP_ADDR16(state->m_helper2, y, x); + pen_t a = state->m_helper1.pix16(y, x); + pen_t b = state->m_helper2.pix16(y, x); if (b != 0xff && (state->m_color1_mask >> a) & 1) state->m_crash[which] = 1; @@ -357,32 +357,32 @@ } -SCREEN_UPDATE( firetrk ) +SCREEN_UPDATE_IND16( firetrk ) { - firetrk_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_scrollx(state->m_tilemap1, 0, *state->m_scroll_x - 37); - tilemap_set_scrollx(state->m_tilemap2, 0, *state->m_scroll_x - 37); - tilemap_set_scrolly(state->m_tilemap1, 0, *state->m_scroll_y); - tilemap_set_scrolly(state->m_tilemap2, 0, *state->m_scroll_y); - - bitmap_fill(bitmap, cliprect, 0); - tilemap_draw(bitmap, &playfield_window, state->m_tilemap1, 0, 0); - firetrk_draw_car(screen->machine(), bitmap, &playfield_window, screen->machine().gfx, 0, state->m_flash); - firetrk_draw_car(screen->machine(), bitmap, &playfield_window, screen->machine().gfx, 1, state->m_flash); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x00, 296, 0x10, 0x10); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x10, 8, 0x10, 0x10); + firetrk_state *state = screen.machine().driver_data(); + screen.machine().tilemap().mark_all_dirty(); + state->m_tilemap1->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap2->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap1->set_scrolly(0, *state->m_scroll_y); + state->m_tilemap2->set_scrolly(0, *state->m_scroll_y); + + bitmap.fill(0, cliprect); + state->m_tilemap1->draw(bitmap, playfield_window, 0, 0); + firetrk_draw_car(screen.machine(), bitmap, playfield_window, screen.machine().gfx, 0, state->m_flash); + firetrk_draw_car(screen.machine(), bitmap, playfield_window, screen.machine().gfx, 1, state->m_flash); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x00, 296, 0x10, 0x10); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x10, 8, 0x10, 0x10); - if (cliprect->max_y == screen->visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { - tilemap_draw(state->m_helper1, &playfield_window, state->m_tilemap2, 0, 0); + state->m_tilemap2->draw(state->m_helper1, playfield_window, 0, 0); - bitmap_fill(state->m_helper2, &playfield_window, 0xff); - firetrk_draw_car(screen->machine(), state->m_helper2, &playfield_window, screen->machine().gfx, 0, FALSE); + state->m_helper2.fill(0xff, playfield_window); + firetrk_draw_car(screen.machine(), state->m_helper2, playfield_window, screen.machine().gfx, 0, FALSE); check_collision(state, 0); - bitmap_fill(state->m_helper2, &playfield_window, 0xff); - firetrk_draw_car(screen->machine(), state->m_helper2, &playfield_window, screen->machine().gfx, 1, FALSE); + state->m_helper2.fill(0xff, playfield_window); + firetrk_draw_car(screen.machine(), state->m_helper2, playfield_window, screen.machine().gfx, 1, FALSE); check_collision(state, 1); *state->m_blink = FALSE; @@ -392,27 +392,27 @@ } -SCREEN_UPDATE( superbug ) +SCREEN_UPDATE_IND16( superbug ) { - firetrk_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_scrollx(state->m_tilemap1, 0, *state->m_scroll_x - 37); - tilemap_set_scrollx(state->m_tilemap2, 0, *state->m_scroll_x - 37); - tilemap_set_scrolly(state->m_tilemap1, 0, *state->m_scroll_y); - tilemap_set_scrolly(state->m_tilemap2, 0, *state->m_scroll_y); - - bitmap_fill(bitmap, cliprect, 0); - tilemap_draw(bitmap, &playfield_window, state->m_tilemap1, 0, 0); - superbug_draw_car(screen->machine(), bitmap, &playfield_window, screen->machine().gfx, state->m_flash); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x00, 296, 0x10, 0x10); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x10, 8, 0x10, 0x10); + firetrk_state *state = screen.machine().driver_data(); + screen.machine().tilemap().mark_all_dirty(); + state->m_tilemap1->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap2->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap1->set_scrolly(0, *state->m_scroll_y); + state->m_tilemap2->set_scrolly(0, *state->m_scroll_y); + + bitmap.fill(0, cliprect); + state->m_tilemap1->draw(bitmap, playfield_window, 0, 0); + superbug_draw_car(screen.machine(), bitmap, playfield_window, screen.machine().gfx, state->m_flash); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x00, 296, 0x10, 0x10); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x10, 8, 0x10, 0x10); - if (cliprect->max_y == screen->visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { - tilemap_draw(state->m_helper1, &playfield_window, state->m_tilemap2, 0, 0); + state->m_tilemap2->draw(state->m_helper1, playfield_window, 0, 0); - bitmap_fill(state->m_helper2, &playfield_window, 0xff); - superbug_draw_car(screen->machine(), state->m_helper2, &playfield_window, screen->machine().gfx, FALSE); + state->m_helper2.fill(0xff, playfield_window); + superbug_draw_car(screen.machine(), state->m_helper2, playfield_window, screen.machine().gfx, FALSE); check_collision(state, 0); *state->m_blink = FALSE; @@ -422,32 +422,32 @@ } -SCREEN_UPDATE( montecar ) +SCREEN_UPDATE_IND16( montecar ) { - firetrk_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_scrollx(state->m_tilemap1, 0, *state->m_scroll_x - 37); - tilemap_set_scrollx(state->m_tilemap2, 0, *state->m_scroll_x - 37); - tilemap_set_scrolly(state->m_tilemap1, 0, *state->m_scroll_y); - tilemap_set_scrolly(state->m_tilemap2, 0, *state->m_scroll_y); - - bitmap_fill(bitmap, cliprect, 0x2c); - tilemap_draw(bitmap, &playfield_window, state->m_tilemap1, 0, 0); - montecar_draw_car(screen->machine(), bitmap, &playfield_window, screen->machine().gfx, 0, FALSE); - montecar_draw_car(screen->machine(), bitmap, &playfield_window, screen->machine().gfx, 1, FALSE); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x00, 24, 0x20, 0x08); - draw_text(bitmap, cliprect, screen->machine().gfx, state->m_alpha_num_ram + 0x20, 16, 0x20, 0x08); + firetrk_state *state = screen.machine().driver_data(); + screen.machine().tilemap().mark_all_dirty(); + state->m_tilemap1->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap2->set_scrollx(0, *state->m_scroll_x - 37); + state->m_tilemap1->set_scrolly(0, *state->m_scroll_y); + state->m_tilemap2->set_scrolly(0, *state->m_scroll_y); + + bitmap.fill(0x2c, cliprect); + state->m_tilemap1->draw(bitmap, playfield_window, 0, 0); + montecar_draw_car(screen.machine(), bitmap, playfield_window, screen.machine().gfx, 0, FALSE); + montecar_draw_car(screen.machine(), bitmap, playfield_window, screen.machine().gfx, 1, FALSE); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x00, 24, 0x20, 0x08); + draw_text(bitmap, cliprect, screen.machine().gfx, state->m_alpha_num_ram + 0x20, 16, 0x20, 0x08); - if (cliprect->max_y == screen->visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { - tilemap_draw(state->m_helper1, &playfield_window, state->m_tilemap2, 0, 0); + state->m_tilemap2->draw(state->m_helper1, playfield_window, 0, 0); - bitmap_fill(state->m_helper2, &playfield_window, 0xff); - montecar_draw_car(screen->machine(), state->m_helper2, &playfield_window, screen->machine().gfx, 0, TRUE); + state->m_helper2.fill(0xff, playfield_window); + montecar_draw_car(screen.machine(), state->m_helper2, playfield_window, screen.machine().gfx, 0, TRUE); check_collision(state, 0); - bitmap_fill(state->m_helper2, &playfield_window, 0xff); - montecar_draw_car(screen->machine(), state->m_helper2, &playfield_window, screen->machine().gfx, 1, TRUE); + state->m_helper2.fill(0xff, playfield_window); + montecar_draw_car(screen.machine(), state->m_helper2, playfield_window, screen.machine().gfx, 1, TRUE); check_collision(state, 1); } diff -Nru mame-0.144/src/mame/video/fitfight.c mame-0.145/src/mame/video/fitfight.c --- mame-0.144/src/mame/video/fitfight.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fitfight.c 2012-02-06 21:30:32.000000000 +0000 @@ -4,7 +4,7 @@ #include "includes/fitfight.h" -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) { fitfight_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[3]; @@ -57,7 +57,7 @@ fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_bak_tileram[offset]); - tilemap_mark_tile_dirty(state->m_fof_bak_tilemap, offset / 2); + state->m_fof_bak_tilemap->mark_tile_dirty(offset / 2); } @@ -77,7 +77,7 @@ fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_mid_tileram[offset]); - tilemap_mark_tile_dirty(state->m_fof_mid_tilemap, offset / 2); + state->m_fof_mid_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_fof_txt_tile_info ) @@ -96,7 +96,7 @@ fitfight_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fof_txt_tileram[offset]); - tilemap_mark_tile_dirty(state->m_fof_txt_tilemap, offset / 2); + state->m_fof_txt_tilemap->mark_tile_dirty(offset / 2); } /* video start / update */ @@ -108,15 +108,15 @@ /* opaque */ state->m_fof_mid_tilemap = tilemap_create(machine, get_fof_mid_tile_info, tilemap_scan_cols, 8, 8, 128, 32); - tilemap_set_transparent_pen(state->m_fof_mid_tilemap, 0); + state->m_fof_mid_tilemap->set_transparent_pen(0); state->m_fof_txt_tilemap = tilemap_create(machine, get_fof_txt_tile_info, tilemap_scan_cols, 8, 8, 128, 32); - tilemap_set_transparent_pen(state->m_fof_txt_tilemap, 0); + state->m_fof_txt_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE(fitfight) +SCREEN_UPDATE_IND16(fitfight) { - fitfight_state *state = screen->machine().driver_data(); + fitfight_state *state = screen.machine().driver_data(); /* scroll isn't right */ @@ -126,42 +126,42 @@ vblank = (state->m_fof_700000[0] & 0x8000); if (vblank > 0) - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); else { -// if (screen->machine().input().code_pressed(KEYCODE_Q)) +// if (screen.machine().input().code_pressed(KEYCODE_Q)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x0038) >> 3); -// else if (screen->machine().input().code_pressed(KEYCODE_W)) +// else if (screen.machine().input().code_pressed(KEYCODE_W)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x01c0) >> 6); -// else if (screen->machine().input().code_pressed(KEYCODE_E)) +// else if (screen.machine().input().code_pressed(KEYCODE_E)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x01c0) >> 6); -// else if (screen->machine().input().code_pressed(KEYCODE_R)) +// else if (screen.machine().input().code_pressed(KEYCODE_R)) // scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x0038) >> 3); // else scrollbak = ((state->m_fof_a00000[0] & 0xff00) >> 5); - tilemap_set_scrollx(state->m_fof_bak_tilemap,0, scrollbak ); - tilemap_set_scrolly(state->m_fof_bak_tilemap,0, state->m_fof_a00000[0] & 0xff); - tilemap_draw(bitmap, cliprect, state->m_fof_bak_tilemap, 0, 0); + state->m_fof_bak_tilemap->set_scrollx(0, scrollbak ); + state->m_fof_bak_tilemap->set_scrolly(0, state->m_fof_a00000[0] & 0xff); + state->m_fof_bak_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); -// if (screen->machine().input().code_pressed(KEYCODE_A)) +// if (screen.machine().input().code_pressed(KEYCODE_A)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x01c0) >> 6); -// else if (screen->machine().input().code_pressed(KEYCODE_S)) +// else if (screen.machine().input().code_pressed(KEYCODE_S)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x0038) >> 3); -// else if (screen->machine().input().code_pressed(KEYCODE_D)) +// else if (screen.machine().input().code_pressed(KEYCODE_D)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) - ((state->m_fof_700000[0] & 0x0038) >> 3); -// else if (screen->machine().input().code_pressed(KEYCODE_F)) +// else if (screen.machine().input().code_pressed(KEYCODE_F)) // scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5) + ((state->m_fof_700000[0] & 0x01c0) >> 6); // else scrollmid = ((state->m_fof_900000[0] & 0xff00) >> 5); - tilemap_set_scrollx(state->m_fof_mid_tilemap, 0, scrollmid ); - tilemap_set_scrolly(state->m_fof_mid_tilemap, 0, state->m_fof_900000[0] & 0xff); -// if (!screen->machine().input().code_pressed(KEYCODE_F)) - tilemap_draw(bitmap, cliprect, state->m_fof_mid_tilemap, 0, 0); + state->m_fof_mid_tilemap->set_scrollx(0, scrollmid ); + state->m_fof_mid_tilemap->set_scrolly(0, state->m_fof_900000[0] & 0xff); +// if (!screen.machine().input().code_pressed(KEYCODE_F)) + state->m_fof_mid_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_fof_txt_tilemap, 0, 0); + state->m_fof_txt_tilemap->draw(bitmap, cliprect, 0, 0); } /* popmessage ("Regs %04x %04x %04x %04x %04x %04x", state->m_fof_100000[0], state->m_fof_600000[0], state->m_fof_700000[0], diff -Nru mame-0.144/src/mame/video/flkatck.c mame-0.145/src/mame/video/flkatck.c --- mame-0.144/src/mame/video/flkatck.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/flkatck.c 2012-02-06 21:30:32.000000000 +0000 @@ -91,9 +91,9 @@ if (offset < 0x1000) /* tiles */ { if (offset & 0x800) /* score */ - tilemap_mark_tile_dirty(state->m_k007121_tilemap[1], offset & 0x3ff); + state->m_k007121_tilemap[1]->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_k007121_tilemap[0], offset & 0x3ff); + state->m_k007121_tilemap[0]->mark_tile_dirty(offset & 0x3ff); } } @@ -105,12 +105,12 @@ { case 0x04: /* ROM bank select */ if (data != k007121_ctrlram_r(state->m_k007121, 4)) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); break; case 0x07: /* flip screen + IRQ control */ state->m_flipscreen = data & 0x08; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); state->m_irq_enabled = data & 0x02; break; } @@ -132,11 +132,11 @@ ***************************************************************************/ -SCREEN_UPDATE( flkatck ) +SCREEN_UPDATE_IND16( flkatck ) { - flkatck_state *state = screen->machine().driver_data(); + flkatck_state *state = screen.machine().driver_data(); rectangle clip[2]; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); if (state->m_flipscreen) { @@ -146,9 +146,9 @@ clip[1] = visarea; clip[1].min_x = clip[1].max_x - 40; - tilemap_set_scrollx(state->m_k007121_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121, 0) - 56 ); - tilemap_set_scrolly(state->m_k007121_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121, 2)); - tilemap_set_scrollx(state->m_k007121_tilemap[1], 0, -16); + state->m_k007121_tilemap[0]->set_scrollx(0, k007121_ctrlram_r(state->m_k007121, 0) - 56 ); + state->m_k007121_tilemap[0]->set_scrolly(0, k007121_ctrlram_r(state->m_k007121, 2)); + state->m_k007121_tilemap[1]->set_scrollx(0, -16); } else { @@ -159,18 +159,18 @@ clip[1].max_x = 39; clip[1].min_x = 0; - tilemap_set_scrollx(state->m_k007121_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121, 0) - 40 ); - tilemap_set_scrolly(state->m_k007121_tilemap[0], 0, k007121_ctrlram_r(state->m_k007121, 2)); - tilemap_set_scrollx(state->m_k007121_tilemap[1], 0, 0); + state->m_k007121_tilemap[0]->set_scrollx(0, k007121_ctrlram_r(state->m_k007121, 0) - 40 ); + state->m_k007121_tilemap[0]->set_scrolly(0, k007121_ctrlram_r(state->m_k007121, 2)); + state->m_k007121_tilemap[1]->set_scrollx(0, 0); } /* compute clipping */ - sect_rect(&clip[0], cliprect); - sect_rect(&clip[1], cliprect); + clip[0] &= cliprect; + clip[1] &= cliprect; /* draw the graphics */ - tilemap_draw(bitmap, &clip[0], state->m_k007121_tilemap[0], 0, 0); - k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen->machine().gfx[0], NULL, &state->m_k007121_ram[0x1000], 0, 40, 0, (UINT32)-1); - tilemap_draw(bitmap, &clip[1], state->m_k007121_tilemap[1], 0, 0); + state->m_k007121_tilemap[0]->draw(bitmap, clip[0], 0, 0); + k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen.machine().gfx[0], NULL, &state->m_k007121_ram[0x1000], 0, 40, 0, (UINT32)-1); + state->m_k007121_tilemap[1]->draw(bitmap, clip[1], 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/flower.c mame-0.145/src/mame/video/flower.c --- mame-0.144/src/mame/video/flower.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/flower.c 2012-02-06 21:30:33.000000000 +0000 @@ -25,7 +25,7 @@ colortable_entry_set_value(machine.colortable, i, i); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { flower_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -155,40 +155,40 @@ state->m_text_tilemap = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows, 8, 8,32,32); state->m_text_right_tilemap = tilemap_create(machine, get_text_tile_info,tilemap_scan_cols, 8, 8, 2,32); - tilemap_set_transparent_pen(state->m_bg1_tilemap,15); - tilemap_set_transparent_pen(state->m_text_tilemap,3); - tilemap_set_transparent_pen(state->m_text_right_tilemap,3); + state->m_bg1_tilemap->set_transparent_pen(15); + state->m_text_tilemap->set_transparent_pen(3); + state->m_text_right_tilemap->set_transparent_pen(3); - tilemap_set_scrolly(state->m_text_tilemap, 0, 16); - tilemap_set_scrolly(state->m_text_right_tilemap, 0, 16); + state->m_text_tilemap->set_scrolly(0, 16); + state->m_text_right_tilemap->set_scrolly(0, 16); } -SCREEN_UPDATE( flower ) +SCREEN_UPDATE_IND16( flower ) { - flower_state *state = screen->machine().driver_data(); - rectangle myclip = *cliprect; + flower_state *state = screen.machine().driver_data(); + rectangle myclip = cliprect; - tilemap_set_scrolly(state->m_bg0_tilemap,0, state->m_bg0_scroll[0]+16); - tilemap_set_scrolly(state->m_bg1_tilemap,0, state->m_bg1_scroll[0]+16); + state->m_bg0_tilemap->set_scrolly(0, state->m_bg0_scroll[0]+16); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg1_scroll[0]+16); - tilemap_draw(bitmap,cliprect,state->m_bg0_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_bg1_tilemap,0,0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0,0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0,0); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); - if(flip_screen_get(screen->machine())) + if(flip_screen_get(screen.machine())) { - myclip.min_x = cliprect->min_x; - myclip.max_x = cliprect->min_x + 15; + myclip.min_x = cliprect.min_x; + myclip.max_x = cliprect.min_x + 15; } else { - myclip.min_x = cliprect->max_x - 15; - myclip.max_x = cliprect->max_x; + myclip.min_x = cliprect.max_x - 15; + myclip.max_x = cliprect.max_x; } - tilemap_draw(bitmap,cliprect,state->m_text_tilemap,0,0); - tilemap_draw(bitmap,&myclip,state->m_text_right_tilemap,0,0); + state->m_text_tilemap->draw(bitmap, cliprect, 0,0); + state->m_text_right_tilemap->draw(bitmap, myclip, 0,0); return 0; } @@ -196,22 +196,22 @@ { flower_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_text_tilemap, offset); - tilemap_mark_all_tiles_dirty(state->m_text_right_tilemap); + state->m_text_tilemap->mark_tile_dirty(offset); + state->m_text_right_tilemap->mark_all_dirty(); } WRITE8_HANDLER( flower_bg0ram_w ) { flower_state *state = space->machine().driver_data(); state->m_bg0ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg0_tilemap, offset & 0x1ff); + state->m_bg0_tilemap->mark_tile_dirty(offset & 0x1ff); } WRITE8_HANDLER( flower_bg1ram_w ) { flower_state *state = space->machine().driver_data(); state->m_bg1ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset & 0x1ff); + state->m_bg1_tilemap->mark_tile_dirty(offset & 0x1ff); } WRITE8_HANDLER( flower_flipscreen_w ) diff -Nru mame-0.144/src/mame/video/flstory.c mame-0.145/src/mame/video/flstory.c --- mame-0.144/src/mame/video/flstory.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/flstory.c 2012-02-06 21:30:31.000000000 +0000 @@ -16,8 +16,8 @@ int attr = state->m_videoram[tile_index * 2 + 1]; int tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * state->m_char_bank; int flags = TILE_FLIPYX((attr & 0x18) >> 3); - tileinfo->category = (attr & 0x20) >> 5; - tileinfo->group = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; + tileinfo.group = (attr & 0x20) >> 5; SET_TILE_INFO( 0, tile_number, @@ -48,8 +48,8 @@ int tile_number = code + ((attr & 0xc0) << 2) + 0x400 + 0x800 * state->m_char_bank; int col = (attr & 0x0f); - tileinfo->category = (attr & 0x20) >> 5; - tileinfo->group = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; + tileinfo.group = (attr & 0x20) >> 5; SET_TILE_INFO( 0, tile_number, @@ -61,10 +61,10 @@ { flstory_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); -// tilemap_set_transparent_pen(state->m_bg_tilemap, 15); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */ - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); +// state->m_bg_tilemap->set_transparent_pen(15); + state->m_bg_tilemap->set_transmask(0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */ + state->m_bg_tilemap->set_scroll_cols(32); machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x200); machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x200); @@ -76,10 +76,10 @@ { flstory_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_rumba_tile_info, tilemap_scan_rows, 8, 8, 32, 32); -// tilemap_set_transparent_pen(state->m_bg_tilemap, 15); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */ - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); +// state->m_bg_tilemap->set_transparent_pen(15); + state->m_bg_tilemap->set_transmask(0, 0x3fff, 0xc000); /* split type 0 has pens 0-13 transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x8000, 0x7fff); /* split type 1 has pen 15 transparent in front half */ + state->m_bg_tilemap->set_scroll_cols(32); machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x200); machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x200); @@ -91,7 +91,7 @@ { flstory_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, victnine_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x200); machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x200); @@ -103,7 +103,7 @@ { flstory_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( flstory_palette_w ) @@ -135,7 +135,7 @@ if (state->m_char_bank != ((data & 0x10) >> 4)) { state->m_char_bank = (data & 0x10) >> 4; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_palette_bank = (data & 0x20) >> 5; @@ -174,11 +174,11 @@ { flstory_state *state = space->machine().driver_data(); state->m_scrlram[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } -static void flstory_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void flstory_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { flstory_state *state = machine.driver_data(); int i; @@ -223,19 +223,19 @@ } } -SCREEN_UPDATE( flstory ) +SCREEN_UPDATE_IND16( flstory ) { - flstory_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 | TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1 | TILEMAP_DRAW_LAYER1, 0); - flstory_draw_sprites(screen->machine(), bitmap, cliprect, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0); - flstory_draw_sprites(screen->machine(), bitmap, cliprect, 0x80); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1 | TILEMAP_DRAW_LAYER0, 0); + flstory_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 0); + flstory_draw_sprites(screen.machine(), bitmap, cliprect, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER0, 0); + flstory_draw_sprites(screen.machine(), bitmap, cliprect, 0x80); + state->m_bg_tilemap->draw(bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER0, 0); return 0; } -static void victnine_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void victnine_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { flstory_state *state = machine.driver_data(); int i; @@ -280,22 +280,22 @@ } } -SCREEN_UPDATE( victnine ) +SCREEN_UPDATE_IND16( victnine ) { - flstory_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - victnine_draw_sprites(screen->machine(), bitmap, cliprect); + flstory_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + victnine_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( rumba ) +SCREEN_UPDATE_IND16( rumba ) { - flstory_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 | TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1 | TILEMAP_DRAW_LAYER1, 0); - victnine_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0); - victnine_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1 | TILEMAP_DRAW_LAYER0, 0); + flstory_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER1, 0); + victnine_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0 | TILEMAP_DRAW_LAYER0, 0); + victnine_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1 | TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/foodf.c mame-0.145/src/mame/video/foodf.c --- mame-0.144/src/mame/video/foodf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/foodf.c 2012-02-06 21:30:32.000000000 +0000 @@ -39,10 +39,10 @@ /* initialize the playfield */ state->m_playfield_tilemap = tilemap_create(machine, get_playfield_tile_info, tilemap_scan_cols, 8,8, 32,32); - tilemap_set_transparent_pen(state->m_playfield_tilemap, 0); + state->m_playfield_tilemap->set_transparent_pen(0); /* adjust the playfield for the 8 pixel offset */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, -8); + state->m_playfield_tilemap->set_scrollx(0, -8); state->save_item(NAME(state->m_playfield_flip)); /* compute the color output resistor weights */ @@ -65,7 +65,7 @@ if (flip != state->m_playfield_flip) { state->m_playfield_flip = flip; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } } @@ -114,20 +114,20 @@ * *************************************/ -SCREEN_UPDATE( foodf ) +SCREEN_UPDATE_IND16( foodf ) { - foodf_state *state = screen->machine().driver_data(); + foodf_state *state = screen.machine().driver_data(); int offs; - const gfx_element *gfx = screen->machine().gfx[1]; - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + const gfx_element *gfx = screen.machine().gfx[1]; + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; UINT16 *spriteram16 = state->m_spriteram; /* first draw the playfield opaquely */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); /* then draw the non-transparent parts with a priority of 1 */ - bitmap_fill(priority_bitmap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 1); + priority_bitmap.fill(0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 1); /* draw the motion objects front-to-back */ for (offs = 0x80-2; offs >= 0x20; offs -= 2) diff -Nru mame-0.144/src/mame/video/freekick.c mame-0.145/src/mame/video/freekick.c --- mame-0.144/src/mame/video/freekick.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/freekick.c 2012-02-06 21:30:32.000000000 +0000 @@ -26,10 +26,10 @@ { freekick_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_freek_tilemap, offset & 0x3ff); + state->m_freek_tilemap->mark_tile_dirty(offset & 0x3ff); } -static void gigas_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void gigas_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { freekick_state *state = machine.driver_data(); int offs; @@ -64,7 +64,7 @@ } -static void pbillrd_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void pbillrd_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { freekick_state *state = machine.driver_data(); int offs; @@ -100,7 +100,7 @@ -static void freekick_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void freekick_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { freekick_state *state = machine.driver_data(); int offs; @@ -134,26 +134,26 @@ } } -SCREEN_UPDATE( gigas ) +SCREEN_UPDATE_IND16( gigas ) { - freekick_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_freek_tilemap, 0, 0); - gigas_draw_sprites(screen->machine(), bitmap, cliprect); + freekick_state *state = screen.machine().driver_data(); + state->m_freek_tilemap->draw(bitmap, cliprect, 0, 0); + gigas_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( pbillrd ) +SCREEN_UPDATE_IND16( pbillrd ) { - freekick_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_freek_tilemap, 0, 0); - pbillrd_draw_sprites(screen->machine(), bitmap, cliprect); + freekick_state *state = screen.machine().driver_data(); + state->m_freek_tilemap->draw(bitmap, cliprect, 0, 0); + pbillrd_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( freekick ) +SCREEN_UPDATE_IND16( freekick ) { - freekick_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_freek_tilemap, 0, 0); - freekick_draw_sprites(screen->machine(), bitmap, cliprect); + freekick_state *state = screen.machine().driver_data(); + state->m_freek_tilemap->draw(bitmap, cliprect, 0, 0); + freekick_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/fromanc2.c mame-0.145/src/mame/video/fromanc2.c --- mame-0.144/src/mame/video/fromanc2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/fromanc2.c 2012-02-06 21:30:32.000000000 +0000 @@ -15,7 +15,7 @@ ******************************************************************************/ -INLINE void fromanc2_get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int vram, int layer ) +INLINE void fromanc2_get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int vram, int layer ) { fromanc2_state *state = machine.driver_data(); int tile, color; @@ -36,7 +36,7 @@ static TILE_GET_INFO( fromanc2_get_v1_l3_tile_info ) { fromanc2_get_tile_info(machine, tileinfo, tile_index, 1, 3); } -INLINE void fromancr_get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int vram, int layer ) +INLINE void fromancr_get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int vram, int layer ) { fromanc2_state *state = machine.driver_data(); int tile, color; @@ -178,7 +178,7 @@ layer += (offset < 0x1000) ? 0 : 1; COMBINE_DATA(&state->m_videoram[vram][layer][offset & 0x0fff]); - tilemap_mark_tile_dirty(state->m_tilemap[vram][layer], offset & 0x0fff); + state->m_tilemap[vram][layer]->mark_tile_dirty(offset & 0x0fff); } WRITE16_HANDLER( fromanc2_videoram_0_w ) { fromanc2_dispvram_w(space->machine(), offset, data, mem_mask, 0, 0); } @@ -249,10 +249,10 @@ state->m_gfxbank[0][1] = (data & 0x00f0) >> 4; state->m_gfxbank[0][2] = (data & 0x0f00) >> 8; state->m_gfxbank[0][3] = (data & 0xf000) >> 12; - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][0]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][1]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][2]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][3]); + state->m_tilemap[0][0]->mark_all_dirty(); + state->m_tilemap[0][1]->mark_all_dirty(); + state->m_tilemap[0][2]->mark_all_dirty(); + state->m_tilemap[0][3]->mark_all_dirty(); } WRITE16_HANDLER( fromanc2_gfxbank_1_w ) @@ -262,10 +262,10 @@ state->m_gfxbank[1][1] = (data & 0x00f0) >> 4; state->m_gfxbank[1][2] = (data & 0x0f00) >> 8; state->m_gfxbank[1][3] = (data & 0xf000) >> 12; - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][0]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][1]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][2]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][3]); + state->m_tilemap[1][0]->mark_all_dirty(); + state->m_tilemap[1][1]->mark_all_dirty(); + state->m_tilemap[1][2]->mark_all_dirty(); + state->m_tilemap[1][3]->mark_all_dirty(); } @@ -275,7 +275,7 @@ int vram = (offset < 0x1000) ? 0 : 1; COMBINE_DATA(&state->m_videoram[vram][layer][offset & 0x0fff]); - tilemap_mark_tile_dirty(state->m_tilemap[vram][layer], offset & 0x0fff); + state->m_tilemap[vram][layer]->mark_tile_dirty(offset & 0x0fff); } WRITE16_HANDLER( fromancr_videoram_0_w ) { fromancr_vram_w(space->machine(), offset, data, mem_mask, 1); } @@ -318,10 +318,10 @@ state->m_gfxbank[0][1] = (data & 0xf000) >> 12; // FG (1P) state->m_gfxbank[1][0] = (data & 0x0008) >> 3; // BG (2P) state->m_gfxbank[1][1] = (data & 0x0f00) >> 8; // FG (2P) - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][0]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][1]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][0]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][1]); + state->m_tilemap[0][0]->mark_all_dirty(); + state->m_tilemap[0][1]->mark_all_dirty(); + state->m_tilemap[1][0]->mark_all_dirty(); + state->m_tilemap[1][1]->mark_all_dirty(); } @@ -331,7 +331,7 @@ int vram = (offset < 0x4000) ? 0 : 1; COMBINE_DATA(&state->m_videoram[vram][layer][offset & 0x3fff]); - tilemap_mark_tile_dirty(state->m_tilemap[vram][layer], offset & 0x3fff); + state->m_tilemap[vram][layer]->mark_tile_dirty(offset & 0x3fff); } WRITE16_HANDLER( fromanc4_videoram_0_w ) { fromanc4_vram_w(space->machine(), offset, data, mem_mask, 2); } @@ -349,8 +349,8 @@ case 0x03: state->m_scrolly[1][2] = -(data - 0x1e4); break; case 0x05: state->m_gfxbank[0][2] = (data & 0x000f) >> 0; state->m_gfxbank[1][2] = (data & 0x0f00) >> 8; - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][2]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][2]); + state->m_tilemap[0][2]->mark_all_dirty(); + state->m_tilemap[1][2]->mark_all_dirty(); break; // offset 0x04, 0x06 - 0x11 unknown default: break; @@ -368,8 +368,8 @@ case 0x03: state->m_scrolly[1][1] = -(data - 0x1e4); break; case 0x05: state->m_gfxbank[0][1] = (data & 0x000f) >> 0; state->m_gfxbank[1][1] = (data & 0x0f00) >> 8; - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][1]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][1]); + state->m_tilemap[0][1]->mark_all_dirty(); + state->m_tilemap[1][1]->mark_all_dirty(); break; // offset 0x04, 0x06 - 0x11 unknown default: break; @@ -387,8 +387,8 @@ case 0x03: state->m_scrolly[1][0] = -(data - 0x1e4); break; case 0x05: state->m_gfxbank[0][0] = (data & 0x000f) >> 0; state->m_gfxbank[1][0] = (data & 0x0f00) >> 8; - tilemap_mark_all_tiles_dirty(state->m_tilemap[0][0]); - tilemap_mark_all_tiles_dirty(state->m_tilemap[1][0]); + state->m_tilemap[0][0]->mark_all_dirty(); + state->m_tilemap[1][0]->mark_all_dirty(); break; // offset 0x04, 0x06 - 0x11 unknown default: break; @@ -415,12 +415,12 @@ state->m_tilemap[1][2] = tilemap_create(machine, fromanc2_get_v1_l2_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_tilemap[1][3] = tilemap_create(machine, fromanc2_get_v1_l3_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_tilemap[0][1], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[0][2], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[0][3], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[1][1], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[1][2], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[1][3], 0x000); + state->m_tilemap[0][1]->set_transparent_pen(0x000); + state->m_tilemap[0][2]->set_transparent_pen(0x000); + state->m_tilemap[0][3]->set_transparent_pen(0x000); + state->m_tilemap[1][1]->set_transparent_pen(0x000); + state->m_tilemap[1][2]->set_transparent_pen(0x000); + state->m_tilemap[1][3]->set_transparent_pen(0x000); state->m_videoram[0][0] = auto_alloc_array(machine, UINT16, (64 * 64)); state->m_videoram[0][1] = auto_alloc_array(machine, UINT16, (64 * 64)); @@ -465,10 +465,10 @@ state->m_tilemap[1][2] = tilemap_create(machine, fromancr_get_v1_l2_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_tilemap[1][3] = 0; - tilemap_set_transparent_pen(state->m_tilemap[0][1], 0x0ff); - tilemap_set_transparent_pen(state->m_tilemap[0][2], 0x0ff); - tilemap_set_transparent_pen(state->m_tilemap[1][1], 0x0ff); - tilemap_set_transparent_pen(state->m_tilemap[1][2], 0x0ff); + state->m_tilemap[0][1]->set_transparent_pen(0x0ff); + state->m_tilemap[0][2]->set_transparent_pen(0x0ff); + state->m_tilemap[1][1]->set_transparent_pen(0x0ff); + state->m_tilemap[1][2]->set_transparent_pen(0x0ff); state->m_videoram[0][0] = auto_alloc_array(machine, UINT16, (64 * 64)); state->m_videoram[0][1] = auto_alloc_array(machine, UINT16, (64 * 64)); @@ -510,10 +510,10 @@ state->m_tilemap[1][2] = tilemap_create(machine, fromancr_get_v1_l2_tile_info, tilemap_scan_rows, 8, 8, 256, 64); state->m_tilemap[1][3] = 0; - tilemap_set_transparent_pen(state->m_tilemap[0][1], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[0][2], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[1][1], 0x000); - tilemap_set_transparent_pen(state->m_tilemap[1][2], 0x000); + state->m_tilemap[0][1]->set_transparent_pen(0x000); + state->m_tilemap[0][2]->set_transparent_pen(0x000); + state->m_tilemap[1][1]->set_transparent_pen(0x000); + state->m_tilemap[1][2]->set_transparent_pen(0x000); state->m_videoram[0][0] = auto_alloc_array(machine, UINT16, (256 * 64)); state->m_videoram[0][1] = auto_alloc_array(machine, UINT16, (256 * 64)); @@ -547,34 +547,36 @@ ******************************************************************************/ -SCREEN_UPDATE( fromanc2 ) +SCREEN_UPDATE_IND16( fromanc2_left ) { - fromanc2_state *state = screen->machine().driver_data(); + fromanc2_state *state = screen.machine().driver_data(); int i; - int *scrollx = NULL; - int *scrolly = NULL; - tilemap_t **tilemaps = NULL; - if (screen == state->m_left_screen) - { - tilemaps = state->m_tilemap[0]; - scrollx = state->m_scrollx[0]; - scrolly = state->m_scrolly[0]; - } - else if (screen == state->m_right_screen) + for (i = 0; i < 4; i++) { - tilemaps = state->m_tilemap[1]; - scrollx = state->m_scrollx[1]; - scrolly = state->m_scrolly[1]; + if (state->m_tilemap[0][i]) + { + state->m_tilemap[0][i]->set_scrollx(0, -state->m_scrollx[0][i]); + state->m_tilemap[0][i]->set_scrolly(0, -state->m_scrolly[0][i]); + state->m_tilemap[0][i]->draw(bitmap, cliprect, 0, 0); + } } + return 0; +} + +SCREEN_UPDATE_IND16( fromanc2_right ) +{ + fromanc2_state *state = screen.machine().driver_data(); + int i; + for (i = 0; i < 4; i++) { - if (tilemaps[i]) + if (state->m_tilemap[1][i]) { - tilemap_set_scrollx(tilemaps[i], 0, -scrollx[i]); - tilemap_set_scrolly(tilemaps[i], 0, -scrolly[i]); - tilemap_draw(bitmap, cliprect, tilemaps[i], 0, 0); + state->m_tilemap[1][i]->set_scrollx(0, -state->m_scrollx[1][i]); + state->m_tilemap[1][i]->set_scrolly(0, -state->m_scrolly[1][i]); + state->m_tilemap[1][i]->draw(bitmap, cliprect, 0, 0); } } diff -Nru mame-0.144/src/mame/video/fromance.c mame-0.145/src/mame/video/fromance.c --- mame-0.144/src/mame/video/fromance.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fromance.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,7 +19,7 @@ * *************************************/ -INLINE void get_fromance_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int layer ) +INLINE void get_fromance_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int layer ) { fromance_state *state = machine.driver_data(); int tile = ((state->m_local_videoram[layer][0x0000 + tile_index] & 0x80) << 9) | @@ -34,7 +34,7 @@ static TILE_GET_INFO( get_fromance_fg_tile_info ) { get_fromance_tile_info(machine, tileinfo, tile_index, 1); } -INLINE void get_nekkyoku_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int layer ) +INLINE void get_nekkyoku_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int layer ) { fromance_state *state = machine.driver_data(); int tile = (state->m_local_videoram[layer][0x0000 + tile_index] << 8) | @@ -67,7 +67,7 @@ state->m_local_paletteram = auto_alloc_array(machine, UINT8, 0x800 * 2); /* configure tilemaps */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); /* reset the timer */ state->m_crtc_timer = machine.scheduler().timer_alloc(FUNC(crtc_interrupt_gen)); @@ -146,7 +146,7 @@ if (state->m_flipscreen != state->m_flipscreen_old) { state->m_flipscreen_old = state->m_flipscreen; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } } @@ -201,7 +201,7 @@ { fromance_state *state = space->machine().driver_data(); state->m_local_videoram[state->m_selected_videoram][offset] = data; - tilemap_mark_tile_dirty(state->m_selected_videoram ? state->m_fg_tilemap : state->m_bg_tilemap, offset & 0x0fff); + (state->m_selected_videoram ? state->m_fg_tilemap : state->m_bg_tilemap)->mark_tile_dirty(offset & 0x0fff); } @@ -303,7 +303,7 @@ * *************************************/ -static void draw_sprites( screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect, int draw_priority ) +static void draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int draw_priority ) { fromance_state *state = screen.machine().driver_data(); static const UINT8 zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 }; @@ -422,33 +422,33 @@ * *************************************/ -SCREEN_UPDATE( fromance ) +SCREEN_UPDATE_IND16( fromance ) { - fromance_state *state = screen->machine().driver_data(); + fromance_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx[0]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly[0]); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scrollx[1]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scrolly[1]); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx[0]); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly[0]); + state->m_fg_tilemap->set_scrollx(0, state->m_scrollx[1]); + state->m_fg_tilemap->set_scrolly(0, state->m_scrolly[1]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( pipedrm ) +SCREEN_UPDATE_IND16( pipedrm ) { - fromance_state *state = screen->machine().driver_data(); + fromance_state *state = screen.machine().driver_data(); /* there seems to be no logical mapping for the X scroll register -- maybe it's gone */ - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly[1]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scrolly[0]); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly[1]); + state->m_fg_tilemap->set_scrolly(0, state->m_scrolly[0]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(*screen, bitmap, cliprect, 0); - draw_sprites(*screen, bitmap, cliprect, 1); + draw_sprites(screen, bitmap, cliprect, 0); + draw_sprites(screen, bitmap, cliprect, 1); return 0; } diff -Nru mame-0.144/src/mame/video/funkybee.c mame-0.145/src/mame/video/funkybee.c --- mame-0.144/src/mame/video/funkybee.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/funkybee.c 2012-02-06 21:30:32.000000000 +0000 @@ -43,14 +43,14 @@ { funkybee_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( funkybee_colorram_w ) { funkybee_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( funkybee_gfx_bank_w ) @@ -59,14 +59,14 @@ if (state->m_gfx_bank != (data & 0x01)) { state->m_gfx_bank = data & 0x01; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } WRITE8_HANDLER( funkybee_scroll_w ) { funkybee_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(space->machine()) ? -data : data); + state->m_bg_tilemap->set_scrollx(0, flip_screen_get(space->machine()) ? -data : data); } WRITE8_HANDLER( funkybee_flipscreen_w ) @@ -95,7 +95,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, funkybee_tilemap_scan, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { funkybee_state *state = machine.driver_data(); int offs; @@ -124,7 +124,7 @@ } } -static void draw_columns( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_columns( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { funkybee_state *state = machine.driver_data(); int offs; @@ -160,11 +160,11 @@ } } -SCREEN_UPDATE( funkybee ) +SCREEN_UPDATE_IND16( funkybee ) { - funkybee_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_columns(screen->machine(), bitmap, cliprect); + funkybee_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_columns(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/funkyjet.c mame-0.145/src/mame/video/funkyjet.c --- mame-0.144/src/mame/video/funkyjet.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/funkyjet.c 2012-02-06 21:30:32.000000000 +0000 @@ -11,17 +11,17 @@ /******************************************************************************/ -SCREEN_UPDATE( funkyjet ) +SCREEN_UPDATE_IND16( funkyjet ) { - funkyjet_state *state = screen->machine().driver_data(); + funkyjet_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 768); + bitmap.fill(768, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); return 0; } diff -Nru mame-0.144/src/mame/video/funworld.c mame-0.145/src/mame/video/funworld.c --- mame-0.144/src/mame/video/funworld.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/funworld.c 2012-02-06 21:30:31.000000000 +0000 @@ -146,14 +146,14 @@ { funworld_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( funworld_colorram_w ) { funworld_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -195,9 +195,9 @@ } -SCREEN_UPDATE(funworld) +SCREEN_UPDATE_IND16(funworld) { - funworld_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + funworld_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/funybubl.c mame-0.145/src/mame/video/funybubl.c --- mame-0.144/src/mame/video/funybubl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/funybubl.c 2012-02-06 21:30:31.000000000 +0000 @@ -28,7 +28,7 @@ { } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { funybubl_state *state = machine.driver_data(); UINT8 *source = &state->m_banked_vram[0x2000 - 0x20]; @@ -73,13 +73,13 @@ } -SCREEN_UPDATE(funybubl) +SCREEN_UPDATE_IND16(funybubl) { - funybubl_state *state = screen->machine().driver_data(); + funybubl_state *state = screen.machine().driver_data(); int x, y, offs; offs = 0; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* tilemap .. convert it .. banking makes it slightly more annoying but still easy */ for (y = 0; y < 32; y++) @@ -89,15 +89,15 @@ int data; data = state->m_banked_vram[offs] | (state->m_banked_vram[offs + 1] << 8); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], data & 0x7fff, (data & 0x8000) ? 2 : 1, 0, 0, x*8, y*8, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], data & 0x7fff, (data & 0x8000) ? 2 : 1, 0, 0, x*8, y*8, 0); offs += 2; } } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); #if 0 - if ( screen->machine().input().code_pressed_once(KEYCODE_W) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_W) ) { FILE *fp; diff -Nru mame-0.144/src/mame/video/fuukifg2.c mame-0.145/src/mame/video/fuukifg2.c --- mame-0.144/src/mame/video/fuukifg2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/fuukifg2.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,7 +44,7 @@ ***************************************************************************/ -INLINE void get_tile_info(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, int _N_) +INLINE void get_tile_info(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, int _N_) { fuuki16_state *state = machine.driver_data(); UINT16 code = state->m_vram[_N_][2 * tile_index + 0]; @@ -61,7 +61,7 @@ { fuuki16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram[_N_][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[_N_], offset / 2); + state->m_tilemap[_N_]->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( fuuki16_vram_0_w ) { fuuki16_vram_w(space, offset, data, mem_mask, 0); } @@ -99,10 +99,10 @@ state->m_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 64, 32); state->m_tilemap[3] = tilemap_create(machine, get_tile_info_3, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tilemap[0], 0x0f); // 4 bits - tilemap_set_transparent_pen(state->m_tilemap[1], 0xff); // 8 bits - tilemap_set_transparent_pen(state->m_tilemap[2], 0x0f); // 4 bits - tilemap_set_transparent_pen(state->m_tilemap[3], 0x0f); // 4 bits + state->m_tilemap[0]->set_transparent_pen(0x0f); // 4 bits + state->m_tilemap[1]->set_transparent_pen(0xff); // 8 bits + state->m_tilemap[2]->set_transparent_pen(0x0f); // 4 bits + state->m_tilemap[3]->set_transparent_pen(0x0f); // 4 bits machine.gfx[2]->color_granularity = 16; /* 256 colour tiles with palette selectable on 16 colour boundaries */ } @@ -135,12 +135,12 @@ ***************************************************************************/ -static void draw_sprites( screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { fuuki16_state *state = screen.machine().driver_data(); int offs; const gfx_element *gfx = screen.machine().gfx[0]; - bitmap_t *priority_bitmap = screen.machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; const rectangle &visarea = screen.visible_area(); UINT16 *spriteram16 = state->m_spriteram; int max_x = visarea.max_x + 1; @@ -265,26 +265,26 @@ ***************************************************************************/ /* Wrapper to handle bg and bg2 ttogether */ -static void fuuki16_draw_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri ) +static void fuuki16_draw_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int i, int flag, int pri ) { fuuki16_state *state = machine.driver_data(); int buffer = (state->m_vregs[0x1e / 2] & 0x40); switch( i ) { - case 2: if (buffer) tilemap_draw(bitmap, cliprect, state->m_tilemap[3], flag, pri); - else tilemap_draw(bitmap, cliprect, state->m_tilemap[2], flag, pri); + case 2: if (buffer) state->m_tilemap[3]->draw(bitmap, cliprect, flag, pri); + else state->m_tilemap[2]->draw(bitmap, cliprect, flag, pri); return; - case 1: tilemap_draw(bitmap, cliprect, state->m_tilemap[1], flag, pri); + case 1: state->m_tilemap[1]->draw(bitmap, cliprect, flag, pri); return; - case 0: tilemap_draw(bitmap, cliprect, state->m_tilemap[0], flag, pri); + case 0: state->m_tilemap[0]->draw(bitmap, cliprect, flag, pri); return; } } -SCREEN_UPDATE( fuuki16 ) +SCREEN_UPDATE_IND16( fuuki16 ) { - fuuki16_state *state = screen->machine().driver_data(); + fuuki16_state *state = screen.machine().driver_data(); UINT16 layer0_scrollx, layer0_scrolly; UINT16 layer1_scrollx, layer1_scrolly; UINT16 layer2_scrollx, layer2_scrolly; @@ -306,12 +306,12 @@ int tm_middle = pri_table[state->m_priority[0] & 0x0f][1]; int tm_back = pri_table[state->m_priority[0] & 0x0f][2]; - flip_screen_set(screen->machine(), state->m_vregs[0x1e / 2] & 1); + flip_screen_set(screen.machine(), state->m_vregs[0x1e / 2] & 1); /* Layers scrolling */ - scrolly_offs = state->m_vregs[0xc / 2] - (flip_screen_get(screen->machine()) ? 0x103 : 0x1f3); - scrollx_offs = state->m_vregs[0xe / 2] - (flip_screen_get(screen->machine()) ? 0x2a7 : 0x3f6); + scrolly_offs = state->m_vregs[0xc / 2] - (flip_screen_get(screen.machine()) ? 0x103 : 0x1f3); + scrollx_offs = state->m_vregs[0xe / 2] - (flip_screen_get(screen.machine()) ? 0x2a7 : 0x3f6); layer0_scrolly = state->m_vregs[0x0 / 2] + scrolly_offs; layer0_scrollx = state->m_vregs[0x2 / 2] + scrollx_offs; @@ -321,30 +321,30 @@ layer2_scrolly = state->m_vregs[0x8 / 2]; layer2_scrollx = state->m_vregs[0xa / 2]; - tilemap_set_scrollx(state->m_tilemap[0], 0, layer0_scrollx); - tilemap_set_scrolly(state->m_tilemap[0], 0, layer0_scrolly); - tilemap_set_scrollx(state->m_tilemap[1], 0, layer1_scrollx); - tilemap_set_scrolly(state->m_tilemap[1], 0, layer1_scrolly); - - tilemap_set_scrollx(state->m_tilemap[2], 0, layer2_scrollx + 0x10); - tilemap_set_scrolly(state->m_tilemap[2], 0, layer2_scrolly /*+ 0x02*/); - tilemap_set_scrollx(state->m_tilemap[3], 0, layer2_scrollx + 0x10); - tilemap_set_scrolly(state->m_tilemap[3], 0, layer2_scrolly /*+ 0x02*/); + state->m_tilemap[0]->set_scrollx(0, layer0_scrollx); + state->m_tilemap[0]->set_scrolly(0, layer0_scrolly); + state->m_tilemap[1]->set_scrollx(0, layer1_scrollx); + state->m_tilemap[1]->set_scrolly(0, layer1_scrolly); + + state->m_tilemap[2]->set_scrollx(0, layer2_scrollx + 0x10); + state->m_tilemap[2]->set_scrolly(0, layer2_scrolly /*+ 0x02*/); + state->m_tilemap[3]->set_scrollx(0, layer2_scrollx + 0x10); + state->m_tilemap[3]->set_scrolly(0, layer2_scrolly /*+ 0x02*/); /* The backmost tilemap decides the background color(s) but sprites can go below the opaque pixels of that tilemap. We thus need to mark the transparent pixels of this layer with a different priority value */ -// fuuki16_draw_layer(screen->machine(), bitmap, cliprect, tm_back, TILEMAP_DRAW_OPAQUE, 0); +// fuuki16_draw_layer(screen.machine(), bitmap, cliprect, tm_back, TILEMAP_DRAW_OPAQUE, 0); /* Actually, bg colour is simply the last pen i.e. 0x1fff -pjp */ - bitmap_fill(bitmap, cliprect, (0x800 * 4) - 1); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill((0x800 * 4) - 1, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - fuuki16_draw_layer(screen->machine(), bitmap, cliprect, tm_back, 0, 1); - fuuki16_draw_layer(screen->machine(), bitmap, cliprect, tm_middle, 0, 2); - fuuki16_draw_layer(screen->machine(), bitmap, cliprect, tm_front, 0, 4); + fuuki16_draw_layer(screen.machine(), bitmap, cliprect, tm_back, 0, 1); + fuuki16_draw_layer(screen.machine(), bitmap, cliprect, tm_middle, 0, 2); + fuuki16_draw_layer(screen.machine(), bitmap, cliprect, tm_front, 0, 4); - draw_sprites(*screen, bitmap, cliprect); + draw_sprites(screen, bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/fuukifg3.c mame-0.145/src/mame/video/fuukifg3.c --- mame-0.144/src/mame/video/fuukifg3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/fuukifg3.c 2012-02-06 21:30:32.000000000 +0000 @@ -48,7 +48,7 @@ ***************************************************************************/ -INLINE void get_tile_info8bpp(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, int _N_) +INLINE void get_tile_info8bpp(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, int _N_) { fuuki32_state *state = machine.driver_data(); UINT16 code = (state->m_vram[_N_][tile_index] & 0xffff0000) >> 16; @@ -59,7 +59,7 @@ static TILE_GET_INFO( get_tile_info_0 ) { get_tile_info8bpp(machine, tileinfo, tile_index, 0); } static TILE_GET_INFO( get_tile_info_1 ) { get_tile_info8bpp(machine, tileinfo, tile_index, 1); } -INLINE void get_tile_info4bpp(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, int _N_) +INLINE void get_tile_info4bpp(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, int _N_) { fuuki32_state *state = machine.driver_data(); UINT16 code = (state->m_vram[_N_][tile_index] & 0xffff0000) >> 16; @@ -74,7 +74,7 @@ { fuuki32_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram[_N_][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[_N_],offset); + state->m_tilemap[_N_]->mark_tile_dirty(offset); } WRITE32_HANDLER( fuuki32_vram_0_w ) { fuuki32_vram_w(space, offset, data, mem_mask, 0); } @@ -105,10 +105,10 @@ state->m_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 64, 32); state->m_tilemap[3] = tilemap_create(machine, get_tile_info_3, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tilemap[0], 0xff); // 8 bits - tilemap_set_transparent_pen(state->m_tilemap[1], 0xff); // 8 bits - tilemap_set_transparent_pen(state->m_tilemap[2], 0x0f); // 4 bits - tilemap_set_transparent_pen(state->m_tilemap[3], 0x0f); // 4 bits + state->m_tilemap[0]->set_transparent_pen(0xff); // 8 bits + state->m_tilemap[1]->set_transparent_pen(0xff); // 8 bits + state->m_tilemap[2]->set_transparent_pen(0x0f); // 4 bits + state->m_tilemap[3]->set_transparent_pen(0x0f); // 4 bits //machine.gfx[1]->color_granularity = 16; /* 256 colour tiles with palette selectable on 16 colour boundaries */ //machine.gfx[2]->color_granularity = 16; @@ -143,12 +143,12 @@ ***************************************************************************/ -static void draw_sprites( screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { fuuki32_state *state = screen.machine().driver_data(); int offs; const gfx_element *gfx = screen.machine().gfx[0]; - bitmap_t *priority_bitmap = screen.machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; const rectangle &visarea = screen.visible_area(); int max_x = visarea.max_x + 1; int max_y = visarea.max_y + 1; @@ -289,26 +289,26 @@ ***************************************************************************/ /* Wrapper to handle bg and bg2 ttogether */ -static void fuuki32_draw_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri ) +static void fuuki32_draw_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int i, int flag, int pri ) { fuuki32_state *state = machine.driver_data(); int buffer = ((state->m_vregs[0x1e / 4] & 0x0000ffff) & 0x40); switch( i ) { - case 2: if (buffer) tilemap_draw(bitmap, cliprect, state->m_tilemap[3], flag, pri); - else tilemap_draw(bitmap, cliprect, state->m_tilemap[2], flag, pri); + case 2: if (buffer) state->m_tilemap[3]->draw(bitmap, cliprect, flag, pri); + else state->m_tilemap[2]->draw(bitmap, cliprect, flag, pri); return; - case 1: tilemap_draw(bitmap, cliprect, state->m_tilemap[1], flag, pri); + case 1: state->m_tilemap[1]->draw(bitmap, cliprect, flag, pri); return; - case 0: tilemap_draw(bitmap, cliprect, state->m_tilemap[0], flag, pri); + case 0: state->m_tilemap[0]->draw(bitmap, cliprect, flag, pri); return; } } -SCREEN_UPDATE( fuuki32 ) +SCREEN_UPDATE_IND16( fuuki32 ) { - fuuki32_state *state = screen->machine().driver_data(); + fuuki32_state *state = screen.machine().driver_data(); UINT16 layer0_scrollx, layer0_scrolly; UINT16 layer1_scrollx, layer1_scrolly; UINT16 layer2_scrollx, layer2_scrolly; @@ -330,12 +330,12 @@ int tm_middle = pri_table[(state->m_priority[0] >> 16) & 0x0f][1]; int tm_back = pri_table[(state->m_priority[0] >> 16) & 0x0f][2]; - flip_screen_set(screen->machine(), (state->m_vregs[0x1e / 4] & 0x0000ffff) & 1); + flip_screen_set(screen.machine(), (state->m_vregs[0x1e / 4] & 0x0000ffff) & 1); /* Layers scrolling */ - scrolly_offs = ((state->m_vregs[0xc / 4] & 0xffff0000) >> 16) - (flip_screen_get(screen->machine()) ? 0x103 : 0x1f3); - scrollx_offs = (state->m_vregs[0xc / 4] & 0x0000ffff) - (flip_screen_get(screen->machine()) ? 0x2c7 : 0x3f6); + scrolly_offs = ((state->m_vregs[0xc / 4] & 0xffff0000) >> 16) - (flip_screen_get(screen.machine()) ? 0x103 : 0x1f3); + scrollx_offs = (state->m_vregs[0xc / 4] & 0x0000ffff) - (flip_screen_get(screen.machine()) ? 0x2c7 : 0x3f6); layer0_scrolly = ((state->m_vregs[0x0 / 4] & 0xffff0000) >> 16) + scrolly_offs; layer0_scrollx = ((state->m_vregs[0x0 / 4] & 0x0000ffff)) + scrollx_offs; @@ -345,35 +345,39 @@ layer2_scrolly = ((state->m_vregs[0x8 / 4] & 0xffff0000) >> 16); layer2_scrollx = ((state->m_vregs[0x8 / 4] & 0x0000ffff)); - tilemap_set_scrollx(state->m_tilemap[0], 0, layer0_scrollx); - tilemap_set_scrolly(state->m_tilemap[0], 0, layer0_scrolly); - tilemap_set_scrollx(state->m_tilemap[1], 0, layer1_scrollx); - tilemap_set_scrolly(state->m_tilemap[1], 0, layer1_scrolly); - - tilemap_set_scrollx(state->m_tilemap[2], 0, layer2_scrollx); - tilemap_set_scrolly(state->m_tilemap[2], 0, layer2_scrolly); - tilemap_set_scrollx(state->m_tilemap[3], 0, layer2_scrollx); - tilemap_set_scrolly(state->m_tilemap[3], 0, layer2_scrolly); + state->m_tilemap[0]->set_scrollx(0, layer0_scrollx); + state->m_tilemap[0]->set_scrolly(0, layer0_scrolly); + state->m_tilemap[1]->set_scrollx(0, layer1_scrollx); + state->m_tilemap[1]->set_scrolly(0, layer1_scrolly); + + state->m_tilemap[2]->set_scrollx(0, layer2_scrollx); + state->m_tilemap[2]->set_scrolly(0, layer2_scrolly); + state->m_tilemap[3]->set_scrollx(0, layer2_scrollx); + state->m_tilemap[3]->set_scrolly(0, layer2_scrolly); /* The bg colour is the last pen i.e. 0x1fff */ - bitmap_fill(bitmap, cliprect, (0x800 * 4) - 1); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill((0x800 * 4) - 1, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - fuuki32_draw_layer(screen->machine(), bitmap, cliprect, tm_back, 0, 1); - fuuki32_draw_layer(screen->machine(), bitmap, cliprect, tm_middle, 0, 2); - fuuki32_draw_layer(screen->machine(), bitmap, cliprect, tm_front, 0, 4); + fuuki32_draw_layer(screen.machine(), bitmap, cliprect, tm_back, 0, 1); + fuuki32_draw_layer(screen.machine(), bitmap, cliprect, tm_middle, 0, 2); + fuuki32_draw_layer(screen.machine(), bitmap, cliprect, tm_front, 0, 4); - draw_sprites(*screen, bitmap, cliprect); + draw_sprites(screen, bitmap, cliprect); return 0; } -SCREEN_EOF( fuuki32 ) +SCREEN_VBLANK( fuuki32 ) { - fuuki32_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + fuuki32_state *state = screen.machine().driver_data(); - /* Buffer sprites and tilebank by 2 frames */ - state->m_spr_buffered_tilebank[1] = state->m_spr_buffered_tilebank[0]; - state->m_spr_buffered_tilebank[0] = state->m_tilebank[0]; - memcpy(state->m_buf_spriteram2, state->m_buf_spriteram, state->m_spriteram_size); - memcpy(state->m_buf_spriteram, state->m_spriteram, state->m_spriteram_size); + /* Buffer sprites and tilebank by 2 frames */ + state->m_spr_buffered_tilebank[1] = state->m_spr_buffered_tilebank[0]; + state->m_spr_buffered_tilebank[0] = state->m_tilebank[0]; + memcpy(state->m_buf_spriteram2, state->m_buf_spriteram, state->m_spriteram_size); + memcpy(state->m_buf_spriteram, state->m_spriteram, state->m_spriteram_size); + } } diff -Nru mame-0.144/src/mame/video/gaelco2.c mame-0.145/src/mame/video/gaelco2.c --- mame-0.144/src/mame/video/gaelco2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gaelco2.c 2012-02-06 21:30:33.000000000 +0000 @@ -183,12 +183,12 @@ /* tilemap 0 writes */ if ((offset >= pant0_start) && (offset < pant0_end)){ - tilemap_mark_tile_dirty(state->m_pant[0], ((offset << 1) & 0x1fff) >> 2); + state->m_pant[0]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2); } /* tilemap 1 writes */ if ((offset >= pant1_start) && (offset < pant1_end)){ - tilemap_mark_tile_dirty(state->m_pant[1], ((offset << 1) & 0x1fff) >> 2); + state->m_pant[1]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2); } } @@ -271,13 +271,13 @@ state->m_pant[1] = tilemap_create(machine, get_tile_info_gaelco2_screen1,tilemap_scan_rows,16,16,64,32); /* set tilemap properties */ - tilemap_set_transparent_pen(state->m_pant[0],0); - tilemap_set_transparent_pen(state->m_pant[1],0); + state->m_pant[0]->set_transparent_pen(0); + state->m_pant[1]->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_pant[0], 512); - tilemap_set_scroll_cols(state->m_pant[0], 1); - tilemap_set_scroll_rows(state->m_pant[1], 512); - tilemap_set_scroll_cols(state->m_pant[1], 1); + state->m_pant[0]->set_scroll_rows(512); + state->m_pant[0]->set_scroll_cols(1); + state->m_pant[1]->set_scroll_rows(512); + state->m_pant[1]->set_scroll_cols(1); state->m_dual_monitor = 0; } @@ -292,13 +292,13 @@ state->m_pant[1] = tilemap_create(machine, get_tile_info_gaelco2_screen1_dual,tilemap_scan_rows,16,16,64,32); /* set tilemap properties */ - tilemap_set_transparent_pen(state->m_pant[0],0); - tilemap_set_transparent_pen(state->m_pant[1],0); + state->m_pant[0]->set_transparent_pen(0); + state->m_pant[1]->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_pant[0], 512); - tilemap_set_scroll_cols(state->m_pant[0], 1); - tilemap_set_scroll_rows(state->m_pant[1], 512); - tilemap_set_scroll_cols(state->m_pant[1], 1); + state->m_pant[0]->set_scroll_rows(512); + state->m_pant[0]->set_scroll_cols(1); + state->m_pant[1]->set_scroll_rows(512); + state->m_pant[1]->set_scroll_cols(1); state->m_dual_monitor = 1; } @@ -339,19 +339,19 @@ ***************************************************************************/ -static void draw_sprites(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect, int mask, int xoffs) +static void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int mask, int xoffs) { - gaelco2_state *state = screen->machine().driver_data(); - UINT16 *buffered_spriteram16 = screen->machine().generic.buffered_spriteram.u16; + gaelco2_state *state = screen.machine().driver_data(); + UINT16 *buffered_spriteram16 = screen.machine().generic.buffered_spriteram.u16; int j, x, y, ex, ey, px, py; - const gfx_element *gfx = screen->machine().gfx[0]; + const gfx_element *gfx = screen.machine().gfx[0]; /* get sprite ram start and end offsets */ int start_offset = (state->m_vregs[1] & 0x10)*0x100; int end_offset = start_offset + 0x1000; /* sprite offset is based on the visible area */ - int spr_x_adjust = (screen->visible_area().max_x - 320 + 1) - (511 - 320 - 1) - ((state->m_vregs[0] >> 4) & 0x01) + xoffs; + int spr_x_adjust = (screen.visible_area().max_x - 320 + 1) - (511 - 320 - 1) - ((state->m_vregs[0] >> 4) & 0x01) + xoffs; for (j = start_offset; j < end_offset; j += 8){ int data = buffered_spriteram16[(j/2) + 0]; @@ -398,11 +398,11 @@ for (py = 0; py < gfx->height; py++){ /* get a pointer to the current line in the screen bitmap */ int ypos = ((sy + ey*16 + py) & 0x1ff); - UINT16 *srcy = BITMAP_ADDR16(bitmap, ypos, 0); + UINT16 *srcy = &bitmap.pix16(ypos); int gfx_py = yflip ? (gfx->height - 1 - py) : py; - if ((ypos < cliprect->min_y) || (ypos > cliprect->max_y)) continue; + if ((ypos < cliprect.min_y) || (ypos > cliprect.max_y)) continue; for (px = 0; px < gfx->width; px++){ /* get current pixel */ @@ -417,7 +417,7 @@ if ((gfx_pen == 0) || (gfx_pen >= 16)) continue; - if ((xpos < cliprect->min_x) || (xpos > cliprect->max_x)) continue; + if ((xpos < cliprect.min_x) || (xpos > cliprect.max_x)) continue; /* make background color darker or brighter */ *pixel = src_color + 4096*gfx_pen; @@ -436,9 +436,9 @@ ***************************************************************************/ -SCREEN_UPDATE( gaelco2 ) +SCREEN_UPDATE_IND16( gaelco2 ) { - gaelco2_state *state = screen->machine().driver_data(); + gaelco2_state *state = screen.machine().driver_data(); int i; /* read scroll values */ @@ -448,32 +448,29 @@ int scroll1y = state->m_videoram[0x2804/2] + 0x01; /* set y scroll registers */ - tilemap_set_scrolly(state->m_pant[0], 0, scroll0y & 0x1ff); - tilemap_set_scrolly(state->m_pant[1], 0, scroll1y & 0x1ff); + state->m_pant[0]->set_scrolly(0, scroll0y & 0x1ff); + state->m_pant[1]->set_scrolly(0, scroll1y & 0x1ff); /* set x linescroll registers */ for (i = 0; i < 512; i++){ - tilemap_set_scrollx(state->m_pant[0], i & 0x1ff, (state->m_vregs[0] & 0x8000) ? (state->m_videoram[(0x2000/2) + i] + 0x14) & 0x3ff : scroll0x & 0x3ff); - tilemap_set_scrollx(state->m_pant[1], i & 0x1ff, (state->m_vregs[1] & 0x8000) ? (state->m_videoram[(0x2400/2) + i] + 0x10) & 0x3ff : scroll1x & 0x3ff); + state->m_pant[0]->set_scrollx(i & 0x1ff, (state->m_vregs[0] & 0x8000) ? (state->m_videoram[(0x2000/2) + i] + 0x14) & 0x3ff : scroll0x & 0x3ff); + state->m_pant[1]->set_scrollx(i & 0x1ff, (state->m_vregs[1] & 0x8000) ? (state->m_videoram[(0x2400/2) + i] + 0x10) & 0x3ff : scroll1x & 0x3ff); } /* draw screen */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_pant[1], 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pant[0], 0, 0); + state->m_pant[1]->draw(bitmap, cliprect, 0, 0); + state->m_pant[0]->draw(bitmap, cliprect, 0, 0); draw_sprites(screen, bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( gaelco2_dual ) +static UINT32 dual_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int index) { - gaelco2_state *state = screen->machine().driver_data(); + gaelco2_state *state = screen.machine().driver_data(); int i; - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); - /* read scroll values */ int scroll0x = state->m_videoram[0x2802/2] + 0x14; int scroll1x = state->m_videoram[0x2806/2] + 0x10; @@ -481,39 +478,37 @@ int scroll1y = state->m_videoram[0x2804/2] + 0x01; /* set y scroll registers */ - tilemap_set_scrolly(state->m_pant[0], 0, scroll0y & 0x1ff); - tilemap_set_scrolly(state->m_pant[1], 0, scroll1y & 0x1ff); + state->m_pant[0]->set_scrolly(0, scroll0y & 0x1ff); + state->m_pant[1]->set_scrolly(0, scroll1y & 0x1ff); /* set x linescroll registers */ for (i = 0; i < 512; i++){ - tilemap_set_scrollx(state->m_pant[0], i & 0x1ff, (state->m_vregs[0] & 0x8000) ? (state->m_videoram[(0x2000/2) + i] + 0x14) & 0x3ff : scroll0x & 0x3ff); - tilemap_set_scrollx(state->m_pant[1], i & 0x1ff, (state->m_vregs[1] & 0x8000) ? (state->m_videoram[(0x2400/2) + i] + 0x10) & 0x3ff : scroll1x & 0x3ff); + state->m_pant[0]->set_scrollx(i & 0x1ff, (state->m_vregs[0] & 0x8000) ? (state->m_videoram[(0x2000/2) + i] + 0x14) & 0x3ff : scroll0x & 0x3ff); + state->m_pant[1]->set_scrollx(i & 0x1ff, (state->m_vregs[1] & 0x8000) ? (state->m_videoram[(0x2400/2) + i] + 0x10) & 0x3ff : scroll1x & 0x3ff); } /* draw screen */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - if (screen == right_screen) - { - /* monitor 2 output */ - tilemap_draw(bitmap,cliprect,state->m_pant[1], 0, 0); - draw_sprites(screen,bitmap,cliprect, 0x8000, 0); - } - else if (screen == left_screen) - { - /* monitor 1 output */ - tilemap_draw(bitmap,cliprect,state->m_pant[0], 0, 0); - draw_sprites(screen,bitmap,cliprect, 0x0000, 0); - } + state->m_pant[index]->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen,bitmap,cliprect, 0x8000 * index, 0); return 0; } +SCREEN_UPDATE_IND16( gaelco2_left ) { return dual_update(screen, bitmap, cliprect, 0); } +SCREEN_UPDATE_IND16( gaelco2_right ) { return dual_update(screen, bitmap, cliprect, 1); } -SCREEN_EOF( gaelco2 ) + + +SCREEN_VBLANK( gaelco2 ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - /* sprites are one frame ahead */ - buffer_spriteram16_w(space, 0, 0, 0xffff); + /* sprites are one frame ahead */ + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/gaelco3d.c mame-0.145/src/mame/video/gaelco3d.c --- mame-0.144/src/mame/video/gaelco3d.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gaelco3d.c 2012-02-06 21:30:33.000000000 +0000 @@ -24,23 +24,39 @@ #define IS_POLYEND(x) (((x) ^ ((x) >> 1)) & 0x4000) -struct poly_extra_data -{ - running_machine &machine() const { assert(m_machine != NULL); return *m_machine; } - - running_machine *m_machine; - UINT32 tex, color; - float ooz_dx, ooz_dy, ooz_base; - float uoz_dx, uoz_dy, uoz_base; - float voz_dx, voz_dy, voz_base; - float z0; -}; - - -static void render_noz_noperspective(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); -static void render_normal(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); -static void render_alphablend(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); +gaelco3d_renderer::gaelco3d_renderer(gaelco3d_state &state) + : poly_manager(state.machine()), + m_state(state), + m_screenbits(state.machine().primary_screen->width(), state.machine().primary_screen->height()), + m_zbuffer(state.machine().primary_screen->width(), state.machine().primary_screen->height()), + m_polygons(0), + m_texture_size(state.machine().region("gfx1")->bytes()), + m_texmask_size(state.machine().region("gfx2")->bytes() * 8), + m_texture(auto_alloc_array(state.machine(), UINT8, m_texture_size)), + m_texmask(auto_alloc_array(state.machine(), UINT8, m_texmask_size)) +{ + state_save_register_global_bitmap(state.machine(), &m_screenbits); + state_save_register_global_bitmap(state.machine(), &m_zbuffer); + + /* first expand the pixel data */ + UINT8 *src = state.machine().region("gfx1")->base(); + UINT8 *dst = m_texture; + for (int y = 0; y < m_texture_size/4096; y += 2) + for (int x = 0; x < 4096; x += 2) + { + dst[(y + 0) * 4096 + (x + 1)] = src[0*m_texture_size/4 + (y/2) * 2048 + (x/2)]; + dst[(y + 1) * 4096 + (x + 1)] = src[1*m_texture_size/4 + (y/2) * 2048 + (x/2)]; + dst[(y + 0) * 4096 + (x + 0)] = src[2*m_texture_size/4 + (y/2) * 2048 + (x/2)]; + dst[(y + 1) * 4096 + (x + 0)] = src[3*m_texture_size/4 + (y/2) * 2048 + (x/2)]; + } + /* then expand the mask data */ + src = state.machine().region("gfx2")->base(); + dst = m_texmask; + for (int y = 0; y < m_texmask_size/4096; y++) + for (int x = 0; x < 4096; x++) + dst[y * 4096 + x] = (src[(x / 1024) * (m_texmask_size/8/4) + (y * 1024 + x % 1024) / 8] >> (x % 8)) & 1; +} /************************************* @@ -49,26 +65,11 @@ * *************************************/ -static void gaelco3d_exit(running_machine &machine) -{ - gaelco3d_state *state = machine.driver_data(); - poly_free(state->m_poly); -} - - VIDEO_START( gaelco3d ) { gaelco3d_state *state = machine.driver_data(); - int width, height; - - state->m_poly = poly_alloc(machine, 2000, sizeof(poly_extra_data), 0); - machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(gaelco3d_exit), &machine)); - state->m_screenbits = machine.primary_screen->alloc_compatible_bitmap(); - - width = machine.primary_screen->width(); - height = machine.primary_screen->height(); - state->m_zbuffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + state->m_poly = auto_alloc(machine, gaelco3d_renderer(*state)); state->m_palette = auto_alloc_array(machine, rgb_t, 32768); state->m_polydata_buffer = auto_alloc_array(machine, UINT32, MAX_POLYDATA); @@ -79,11 +80,7 @@ state_save_register_global_pointer(machine, state->m_polydata_buffer, MAX_POLYDATA); state_save_register_global(machine, state->m_polydata_count); - state_save_register_global(machine, state->m_polygons); state_save_register_global(machine, state->m_lastscan); - - state_save_register_global_bitmap(machine, state->m_screenbits); - state_save_register_global_bitmap(machine, state->m_zbuffer); } @@ -115,9 +112,8 @@ (repeat these two for each additional point in the fan) */ -static void render_poly(screen_device &screen, UINT32 *polydata) +void gaelco3d_renderer::render_poly(screen_device &screen, UINT32 *polydata) { - gaelco3d_state *state = screen.machine().driver_data(); float midx = screen.width() / 2; float midy = screen.height() / 2; float z0 = tms3203x_device::fp_to_float(polydata[0]); @@ -130,9 +126,9 @@ float voz_base = tms3203x_device::fp_to_float(polydata[7]) * 256.0f - midx * voz_dx - midy * voz_dy; float ooz_base = tms3203x_device::fp_to_float(polydata[8]) - midx * ooz_dx - midy * ooz_dy; float uoz_base = tms3203x_device::fp_to_float(polydata[9]) * 256.0f - midx * uoz_dx - midy * uoz_dy; - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); + gaelco3d_object_data &object = object_data_alloc(); int color = (polydata[10] & 0x7f) << 8; - poly_vertex vert[MAX_VERTICES]; + vertex_t vert[MAX_VERTICES]; UINT32 data; int vertnum; @@ -160,20 +156,19 @@ logerror("\n"); } - /* fill in extra data */ - extra->m_machine = &screen.machine(); - extra->tex = polydata[11]; - extra->color = color; - extra->ooz_dx = ooz_dx; - extra->ooz_dy = ooz_dy; - extra->ooz_base = ooz_base; - extra->uoz_dx = uoz_dx; - extra->uoz_dy = uoz_dy; - extra->uoz_base = uoz_base; - extra->voz_dx = voz_dx; - extra->voz_dy = voz_dy; - extra->voz_base = voz_base; - extra->z0 = z0; + /* fill in object data */ + object.tex = polydata[11]; + object.color = color; + object.ooz_dx = ooz_dx; + object.ooz_dy = ooz_dy; + object.ooz_base = ooz_base; + object.uoz_dx = uoz_dx; + object.uoz_dy = uoz_dy; + object.uoz_base = uoz_base; + object.voz_dx = voz_dx; + object.voz_dy = voz_dy; + object.voz_base = voz_base; + object.z0 = z0; /* extract vertices */ data = 0; @@ -192,52 +187,49 @@ /* special case: no Z buffering and no perspective correction */ if (color != 0x7f00 && z0 < 0 && ooz_dx == 0 && ooz_dy == 0) - poly_render_triangle_fan(state->m_poly, state->m_screenbits, &visarea, render_noz_noperspective, 0, vertnum, &vert[0]); + render_triangle_fan(visarea, render_delegate(FUNC(gaelco3d_renderer::render_noz_noperspective), this), 0, vertnum, &vert[0]); /* general case: non-alpha blended */ else if (color != 0x7f00) - poly_render_triangle_fan(state->m_poly, state->m_screenbits, &visarea, render_normal, 0, vertnum, &vert[0]); + render_triangle_fan(visarea, render_delegate(FUNC(gaelco3d_renderer::render_normal), this), 0, vertnum, &vert[0]); /* color 0x7f seems to be hard-coded as a 50% alpha blend */ else - poly_render_triangle_fan(state->m_poly, state->m_screenbits, &visarea, render_alphablend, 0, vertnum, &vert[0]); + render_triangle_fan(visarea, render_delegate(FUNC(gaelco3d_renderer::render_alphablend), this), 0, vertnum, &vert[0]); - state->m_polygons += vertnum - 2; + m_polygons += vertnum - 2; } } -static void render_noz_noperspective(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void gaelco3d_renderer::render_noz_noperspective(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &object, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - gaelco3d_state *state = extra->machine().driver_data(); - bitmap_t *bitmap = (bitmap_t *)destbase; - float zbase = recip_approx(extra->ooz_base); - float uoz_step = extra->uoz_dx * zbase; - float voz_step = extra->voz_dx * zbase; - int zbufval = (int)(-extra->z0 * zbase); - offs_t endmask = state->m_texture_size - 1; - const rgb_t *palsource = state->m_palette + extra->color; - UINT32 tex = extra->tex; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); - UINT16 *zbuf = BITMAP_ADDR16(state->m_zbuffer, scanline, 0); - int startx = extent->startx; - float uoz = (extra->uoz_base + scanline * extra->uoz_dy + startx * extra->uoz_dx) * zbase; - float voz = (extra->voz_base + scanline * extra->voz_dy + startx * extra->voz_dx) * zbase; + float zbase = recip_approx(object.ooz_base); + float uoz_step = object.uoz_dx * zbase; + float voz_step = object.voz_dx * zbase; + int zbufval = (int)(-object.z0 * zbase); + offs_t endmask = m_texture_size - 1; + const rgb_t *palsource = m_state.m_palette + object.color; + UINT32 tex = object.tex; + UINT16 *dest = &m_screenbits.pix16(scanline); + UINT16 *zbuf = &m_zbuffer.pix16(scanline); + int startx = extent.startx; + float uoz = (object.uoz_base + scanline * object.uoz_dy + startx * object.uoz_dx) * zbase; + float voz = (object.voz_base + scanline * object.voz_dy + startx * object.voz_dx) * zbase; int x; - for (x = startx; x < extent->stopx; x++) + for (x = startx; x < extent.stopx; x++) { int u = (int)uoz; int v = (int)voz; int pixeloffs = (tex + (v >> 8) * 4096 + (u >> 8)) & endmask; - if (pixeloffs >= state->m_texmask_size || !state->m_texmask[pixeloffs]) + if (pixeloffs >= m_texmask_size || !m_texmask[pixeloffs]) { - rgb_t rgb00 = palsource[state->m_texture[pixeloffs]]; - rgb_t rgb01 = palsource[state->m_texture[(pixeloffs + 1) & endmask]]; - rgb_t rgb10 = palsource[state->m_texture[(pixeloffs + 4096) & endmask]]; - rgb_t rgb11 = palsource[state->m_texture[(pixeloffs + 4097) & endmask]]; + rgb_t rgb00 = palsource[m_texture[pixeloffs]]; + rgb_t rgb01 = palsource[m_texture[(pixeloffs + 1) & endmask]]; + rgb_t rgb10 = palsource[m_texture[(pixeloffs + 4096) & endmask]]; + rgb_t rgb11 = palsource[m_texture[(pixeloffs + 4097) & endmask]]; rgb_t filtered = rgb_bilinear_filter(rgb00, rgb01, rgb10, rgb11, u, v); dest[x] = (filtered & 0x1f) | ((filtered & 0x1ff800) >> 6); zbuf[x] = zbufval; @@ -250,27 +242,24 @@ } -static void render_normal(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void gaelco3d_renderer::render_normal(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &object, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - gaelco3d_state *state = extra->machine().driver_data(); - bitmap_t *bitmap = (bitmap_t *)destbase; - float ooz_dx = extra->ooz_dx; - float uoz_dx = extra->uoz_dx; - float voz_dx = extra->voz_dx; - offs_t endmask = state->m_texture_size - 1; - const rgb_t *palsource = state->m_palette + extra->color; - UINT32 tex = extra->tex; - float z0 = extra->z0; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); - UINT16 *zbuf = BITMAP_ADDR16(state->m_zbuffer, scanline, 0); - int startx = extent->startx; - float ooz = extra->ooz_base + scanline * extra->ooz_dy + startx * ooz_dx; - float uoz = extra->uoz_base + scanline * extra->uoz_dy + startx * uoz_dx; - float voz = extra->voz_base + scanline * extra->voz_dy + startx * voz_dx; + float ooz_dx = object.ooz_dx; + float uoz_dx = object.uoz_dx; + float voz_dx = object.voz_dx; + offs_t endmask = m_texture_size - 1; + const rgb_t *palsource = m_state.m_palette + object.color; + UINT32 tex = object.tex; + float z0 = object.z0; + UINT16 *dest = &m_screenbits.pix16(scanline); + UINT16 *zbuf = &m_zbuffer.pix16(scanline); + int startx = extent.startx; + float ooz = object.ooz_base + scanline * object.ooz_dy + startx * ooz_dx; + float uoz = object.uoz_base + scanline * object.uoz_dy + startx * uoz_dx; + float voz = object.voz_base + scanline * object.voz_dy + startx * voz_dx; int x; - for (x = startx; x < extent->stopx; x++) + for (x = startx; x < extent.stopx; x++) { if (ooz > 0) { @@ -282,12 +271,12 @@ int u = (int)(uoz * z); int v = (int)(voz * z); int pixeloffs = (tex + (v >> 8) * 4096 + (u >> 8)) & endmask; - if (pixeloffs >= state->m_texmask_size || !state->m_texmask[pixeloffs]) + if (pixeloffs >= m_texmask_size || !m_texmask[pixeloffs]) { - rgb_t rgb00 = palsource[state->m_texture[pixeloffs]]; - rgb_t rgb01 = palsource[state->m_texture[(pixeloffs + 1) & endmask]]; - rgb_t rgb10 = palsource[state->m_texture[(pixeloffs + 4096) & endmask]]; - rgb_t rgb11 = palsource[state->m_texture[(pixeloffs + 4097) & endmask]]; + rgb_t rgb00 = palsource[m_texture[pixeloffs]]; + rgb_t rgb01 = palsource[m_texture[(pixeloffs + 1) & endmask]]; + rgb_t rgb10 = palsource[m_texture[(pixeloffs + 4096) & endmask]]; + rgb_t rgb11 = palsource[m_texture[(pixeloffs + 4097) & endmask]]; rgb_t filtered = rgb_bilinear_filter(rgb00, rgb01, rgb10, rgb11, u, v); dest[x] = (filtered & 0x1f) | ((filtered & 0x1ff800) >> 6); zbuf[x] = (zbufval < 0) ? -zbufval : zbufval; @@ -303,27 +292,24 @@ } -static void render_alphablend(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void gaelco3d_renderer::render_alphablend(INT32 scanline, const extent_t &extent, const gaelco3d_object_data &object, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - gaelco3d_state *state = extra->machine().driver_data(); - bitmap_t *bitmap = (bitmap_t *)destbase; - float ooz_dx = extra->ooz_dx; - float uoz_dx = extra->uoz_dx; - float voz_dx = extra->voz_dx; - offs_t endmask = state->m_texture_size - 1; - const rgb_t *palsource = state->m_palette + extra->color; - UINT32 tex = extra->tex; - float z0 = extra->z0; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); - UINT16 *zbuf = BITMAP_ADDR16(state->m_zbuffer, scanline, 0); - int startx = extent->startx; - float ooz = extra->ooz_base + extra->ooz_dy * scanline + startx * ooz_dx; - float uoz = extra->uoz_base + extra->uoz_dy * scanline + startx * uoz_dx; - float voz = extra->voz_base + extra->voz_dy * scanline + startx * voz_dx; + float ooz_dx = object.ooz_dx; + float uoz_dx = object.uoz_dx; + float voz_dx = object.voz_dx; + offs_t endmask = m_texture_size - 1; + const rgb_t *palsource = m_state.m_palette + object.color; + UINT32 tex = object.tex; + float z0 = object.z0; + UINT16 *dest = &m_screenbits.pix16(scanline); + UINT16 *zbuf = &m_zbuffer.pix16(scanline); + int startx = extent.startx; + float ooz = object.ooz_base + object.ooz_dy * scanline + startx * ooz_dx; + float uoz = object.uoz_base + object.uoz_dy * scanline + startx * uoz_dx; + float voz = object.voz_base + object.voz_dy * scanline + startx * voz_dx; int x; - for (x = startx; x < extent->stopx; x++) + for (x = startx; x < extent.stopx; x++) { if (ooz > 0) { @@ -335,12 +321,12 @@ int u = (int)(uoz * z); int v = (int)(voz * z); int pixeloffs = (tex + (v >> 8) * 4096 + (u >> 8)) & endmask; - if (pixeloffs >= state->m_texmask_size || !state->m_texmask[pixeloffs]) + if (pixeloffs >= m_texmask_size || !m_texmask[pixeloffs]) { - rgb_t rgb00 = palsource[state->m_texture[pixeloffs]]; - rgb_t rgb01 = palsource[state->m_texture[(pixeloffs + 1) & endmask]]; - rgb_t rgb10 = palsource[state->m_texture[(pixeloffs + 4096) & endmask]]; - rgb_t rgb11 = palsource[state->m_texture[(pixeloffs + 4097) & endmask]]; + rgb_t rgb00 = palsource[m_texture[pixeloffs]]; + rgb_t rgb01 = palsource[m_texture[(pixeloffs + 1) & endmask]]; + rgb_t rgb10 = palsource[m_texture[(pixeloffs + 4096) & endmask]]; + rgb_t rgb11 = palsource[m_texture[(pixeloffs + 4097) & endmask]]; rgb_t filtered = rgb_bilinear_filter(rgb00, rgb01, rgb10, rgb11, u, v) >> 1; dest[x] = ((filtered & 0x0f) | ((filtered & 0x0f7800) >> 6)) + ((dest[x] >> 1) & 0x3def); zbuf[x] = (zbufval < 0) ? -zbufval : zbufval; @@ -366,17 +352,16 @@ { gaelco3d_state *state = screen.machine().driver_data(); /* wait for any queued stuff to complete */ - poly_wait(state->m_poly, "Time to render"); + state->m_poly->wait("Time to render"); #if DISPLAY_STATS { int scan = screen.vpos(); - popmessage("Polys = %4d Timeleft = %3d", state->m_polygons, (state->m_lastscan < scan) ? (scan - state->m_lastscan) : (scan + (state->m_lastscan - screen.visible_area().max_y))); + popmessage("Polys = %4d Timeleft = %3d", state->m_poly->polygons(), (state->m_lastscan < scan) ? (scan - state->m_lastscan) : (scan + (state->m_lastscan - screen.visible_area().max_y))); } #endif state->m_polydata_count = 0; - state->m_polygons = 0; state->m_lastscan = -1; } @@ -401,7 +386,7 @@ { if (state->m_polydata_count >= 18 && (state->m_polydata_count % 2) == 1 && IS_POLYEND(state->m_polydata_buffer[state->m_polydata_count - 2])) { - render_poly(*space->machine().primary_screen, &state->m_polydata_buffer[0]); + state->m_poly->render_poly(*space->machine().primary_screen, &state->m_polydata_buffer[0]); state->m_polydata_count = 0; } state->m_video_changed = TRUE; @@ -423,7 +408,7 @@ WRITE16_HANDLER( gaelco3d_paletteram_w ) { gaelco3d_state *state = space->machine().driver_data(); - poly_wait(state->m_poly, "Palette change"); + state->m_poly->wait("Palette change"); COMBINE_DATA(&space->machine().generic.paletteram.u16[offset]); state->m_palette[offset] = ((space->machine().generic.paletteram.u16[offset] & 0x7fe0) << 6) | (space->machine().generic.paletteram.u16[offset] & 0x1f); } @@ -432,7 +417,7 @@ WRITE32_HANDLER( gaelco3d_paletteram_020_w ) { gaelco3d_state *state = space->machine().driver_data(); - poly_wait(state->m_poly, "Palette change"); + state->m_poly->wait("Palette change"); COMBINE_DATA(&space->machine().generic.paletteram.u32[offset]); state->m_palette[offset*2+0] = ((space->machine().generic.paletteram.u32[offset] & 0x7fe00000) >> 10) | ((space->machine().generic.paletteram.u32[offset] & 0x1f0000) >> 16); state->m_palette[offset*2+1] = ((space->machine().generic.paletteram.u32[offset] & 0x7fe0) << 6) | (space->machine().generic.paletteram.u32[offset] & 0x1f); @@ -446,51 +431,52 @@ * *************************************/ -SCREEN_UPDATE( gaelco3d ) +SCREEN_UPDATE_IND16( gaelco3d ) { - gaelco3d_state *state = screen->machine().driver_data(); - int x, y, ret; - - if (DISPLAY_TEXTURE && (screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X))) - { - static int xv = 0, yv = 0x1000; - UINT8 *base = state->m_texture; - int length = state->m_texture_size; - - if (screen->machine().input().code_pressed(KEYCODE_X)) - { - base = state->m_texmask; - length = state->m_texmask_size; - } - - if (screen->machine().input().code_pressed(KEYCODE_LEFT) && xv >= 4) - xv -= 4; - if (screen->machine().input().code_pressed(KEYCODE_RIGHT) && xv < 4096 - 4) - xv += 4; - - if (screen->machine().input().code_pressed(KEYCODE_UP) && yv >= 4) - yv -= 4; - if (screen->machine().input().code_pressed(KEYCODE_DOWN) && yv < 0x40000) - yv += 4; + gaelco3d_state *state = screen.machine().driver_data(); + int ret; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) - { - int offs = (yv + y - cliprect->min_y) * 4096 + xv + x - cliprect->min_x; - if (offs < length) - dest[x] = base[offs]; - else - dest[x] = 0; - } - } - popmessage("(%04X,%04X)", xv, yv); - } - else +/* + if (DISPLAY_TEXTURE && (screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X))) + { + static int xv = 0, yv = 0x1000; + UINT8 *base = state->m_texture; + int length = state->m_texture_size; + + if (screen.machine().input().code_pressed(KEYCODE_X)) + { + base = state->m_texmask; + length = state->m_texmask_size; + } + + if (screen.machine().input().code_pressed(KEYCODE_LEFT) && xv >= 4) + xv -= 4; + if (screen.machine().input().code_pressed(KEYCODE_RIGHT) && xv < 4096 - 4) + xv += 4; + + if (screen.machine().input().code_pressed(KEYCODE_UP) && yv >= 4) + yv -= 4; + if (screen.machine().input().code_pressed(KEYCODE_DOWN) && yv < 0x40000) + yv += 4; + + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + { + UINT16 *dest = &bitmap.pix16(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) + { + int offs = (yv + y - cliprect.min_y) * 4096 + xv + x - cliprect.min_x; + if (offs < length) + dest[x] = base[offs]; + else + dest[x] = 0; + } + } + popmessage("(%04X,%04X)", xv, yv); + } + else*/ { if (state->m_video_changed) - copybitmap(bitmap, state->m_screenbits, 0,1, 0,0, cliprect); + copybitmap(bitmap, state->m_poly->screenbits(), 0,1, 0,0, cliprect); ret = state->m_video_changed; state->m_video_changed = FALSE; } diff -Nru mame-0.144/src/mame/video/gaelco.c mame-0.145/src/mame/video/gaelco.c --- mame-0.144/src/mame/video/gaelco.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gaelco.c 2012-02-06 21:30:32.000000000 +0000 @@ -38,7 +38,7 @@ int data2 = state->m_videoram[(tile_index << 1) + 1]; int code = ((data & 0xfffc) >> 2); - tileinfo->category = (data2 >> 6) & 0x03; + tileinfo.category = (data2 >> 6) & 0x03; SET_TILE_INFO(1, 0x4000 + code, data2 & 0x3f, TILE_FLIPYX(data & 0x03)); } @@ -51,7 +51,7 @@ int data2 = state->m_videoram[(0x1000 / 2) + (tile_index << 1) + 1]; int code = ((data & 0xfffc) >> 2); - tileinfo->category = (data2 >> 6) & 0x03; + tileinfo.category = (data2 >> 6) & 0x03; SET_TILE_INFO(1, 0x4000 + code, data2 & 0x3f, TILE_FLIPYX(data & 0x03)); } @@ -66,7 +66,7 @@ { gaelco_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap[offset >> 11], ((offset << 1) & 0x0fff) >> 2); + state->m_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); } /*************************************************************************** @@ -81,8 +81,8 @@ state->m_tilemap[0] = tilemap_create(machine, get_tile_info_gaelco_screen0, tilemap_scan_rows, 16, 16, 32, 32); state->m_tilemap[1] = tilemap_create(machine, get_tile_info_gaelco_screen1, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transmask(state->m_tilemap[0], 0, 0xff01, 0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ - tilemap_set_transmask(state->m_tilemap[1], 0, 0xff01, 0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ + state->m_tilemap[0]->set_transmask(0, 0xff01, 0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ + state->m_tilemap[1]->set_transmask(0, 0xff01, 0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ } VIDEO_START( maniacsq ) @@ -91,8 +91,8 @@ state->m_tilemap[0] = tilemap_create(machine, get_tile_info_gaelco_screen0, tilemap_scan_rows, 16, 16, 32, 32); state->m_tilemap[1] = tilemap_create(machine, get_tile_info_gaelco_screen1, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_tilemap[1], 0); + state->m_tilemap[0]->set_transparent_pen(0); + state->m_tilemap[1]->set_transparent_pen(0); } @@ -121,7 +121,7 @@ 3 | xxxxxxxx xxxxxx-- | sprite code */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gaelco_state *state = machine.driver_data(); int i, x, y, ex, ey; @@ -187,72 +187,72 @@ ***************************************************************************/ -SCREEN_UPDATE( maniacsq ) +SCREEN_UPDATE_IND16( maniacsq ) { - gaelco_state *state = screen->machine().driver_data(); + gaelco_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_tilemap[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_tilemap[0], 0, state->m_vregs[1] + 4); - tilemap_set_scrolly(state->m_tilemap[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_tilemap[1], 0, state->m_vregs[3]); + state->m_tilemap[0]->set_scrolly(0, state->m_vregs[0]); + state->m_tilemap[0]->set_scrollx(0, state->m_vregs[1] + 4); + state->m_tilemap[1]->set_scrolly(0, state->m_vregs[2]); + state->m_tilemap[1]->set_scrollx(0, state->m_vregs[3]); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], 3, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], 3, 0); + state->m_tilemap[1]->draw(bitmap, cliprect, 3, 0); + state->m_tilemap[0]->draw(bitmap, cliprect, 3, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], 2, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], 2, 1); + state->m_tilemap[1]->draw(bitmap, cliprect, 2, 1); + state->m_tilemap[0]->draw(bitmap, cliprect, 2, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], 1, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], 1, 2); + state->m_tilemap[1]->draw(bitmap, cliprect, 1, 2); + state->m_tilemap[0]->draw(bitmap, cliprect, 1, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], 0, 4); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], 0, 4); + state->m_tilemap[1]->draw(bitmap, cliprect, 0, 4); + state->m_tilemap[0]->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( bigkarnk ) +SCREEN_UPDATE_IND16( bigkarnk ) { - gaelco_state *state = screen->machine().driver_data(); + gaelco_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_tilemap[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_tilemap[0], 0, state->m_vregs[1] + 4); - tilemap_set_scrolly(state->m_tilemap[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_tilemap[1], 0, state->m_vregs[3]); + state->m_tilemap[0]->set_scrolly(0, state->m_vregs[0]); + state->m_tilemap[0]->set_scrollx(0, state->m_vregs[1] + 4); + state->m_tilemap[1]->set_scrolly(0, state->m_vregs[2]); + state->m_tilemap[1]->set_scrollx(0, state->m_vregs[3]); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER1 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER1 | 3, 0); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER0 | 3, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER0 | 3, 1); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 1); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER1 | 2, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER1 | 2, 1); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 1); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER0 | 2, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER0 | 2, 2); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 2); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER1 | 1, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER1 | 1, 2); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 2); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 2); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER0 | 1, 4); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER0 | 1, 4); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 4); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 4); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER1 | 0, 4); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER1 | 0, 4); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 4); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 4); - tilemap_draw(bitmap, cliprect, state->m_tilemap[1], TILEMAP_DRAW_LAYER0 | 0, 8); - tilemap_draw(bitmap, cliprect, state->m_tilemap[0], TILEMAP_DRAW_LAYER0 | 0, 8); + state->m_tilemap[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 8); + state->m_tilemap[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 8); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/gaiden.c mame-0.145/src/mame/video/gaiden.c --- mame-0.144/src/mame/video/gaiden.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gaiden.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,12 +44,12 @@ UINT16 *videoram2 = state->m_videoram2; /* bit 3 controls blending */ - tileinfo->category = (videoram2[tile_index] & 0x08) >> 3; + tileinfo.category = (videoram2[tile_index] & 0x08) >> 3; SET_TILE_INFO( 2, videoram1[tile_index] & 0x0fff, - ((videoram2[tile_index] & 0xf0) >> 4) | (tileinfo->category ? 0x80 : 0x00), + ((videoram2[tile_index] & 0xf0) >> 4) | (tileinfo.category ? 0x80 : 0x00), 0); } @@ -75,79 +75,73 @@ VIDEO_START( gaiden ) { gaiden_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); state->m_background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_foreground = tilemap_create(machine, get_fg_tile_info_raiga, tilemap_scan_rows, 16, 16, 64, 32); state->m_text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_background, 0); - tilemap_set_transparent_pen(state->m_foreground, 0); - tilemap_set_transparent_pen(state->m_text_layer, 0); - - tilemap_set_scrolldy(state->m_background, 0, 33); - tilemap_set_scrolldy(state->m_foreground, 0, 33); - tilemap_set_scrolldy(state->m_text_layer, 0, 31); - - tilemap_set_scrolldx(state->m_background, 0, -1); - tilemap_set_scrolldx(state->m_foreground, 0, -1); - tilemap_set_scrolldx(state->m_text_layer, 0, -1); + state->m_background->set_transparent_pen(0); + state->m_foreground->set_transparent_pen(0); + state->m_text_layer->set_transparent_pen(0); + + state->m_background->set_scrolldy(0, 33); + state->m_foreground->set_scrolldy(0, 33); + state->m_text_layer->set_scrolldy(0, 31); + + state->m_background->set_scrolldx(0, -1); + state->m_foreground->set_scrolldx(0, -1); + state->m_text_layer->set_scrolldx(0, -1); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); } VIDEO_START( mastninj ) { gaiden_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); state->m_background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_foreground = tilemap_create(machine, get_fg_tile_info_raiga, tilemap_scan_rows, 16, 16, 64, 32); state->m_text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); -// tilemap_set_transparent_pen(state->m_background, 15); - tilemap_set_transparent_pen(state->m_foreground, 15); - tilemap_set_transparent_pen(state->m_text_layer, 15); +// state->m_background->set_transparent_pen(15); + state->m_foreground->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); - tilemap_set_scrolldx(state->m_background, -248, 248); - tilemap_set_scrolldx(state->m_foreground, -252, 252); + state->m_background->set_scrolldx(-248, 248); + state->m_foreground->set_scrolldx(-252, 252); } VIDEO_START( raiga ) { gaiden_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); state->m_background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_foreground = tilemap_create(machine, get_fg_tile_info_raiga, tilemap_scan_rows, 16, 16, 64, 32); state->m_text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_background, 0); - tilemap_set_transparent_pen(state->m_foreground, 0); - tilemap_set_transparent_pen(state->m_text_layer, 0); + state->m_background->set_transparent_pen(0); + state->m_foreground->set_transparent_pen(0); + state->m_text_layer->set_transparent_pen(0); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); } VIDEO_START( drgnbowl ) @@ -158,11 +152,11 @@ state->m_foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_foreground, 15); - tilemap_set_transparent_pen(state->m_text_layer, 15); + state->m_foreground->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); - tilemap_set_scrolldx(state->m_background, -248, 248); - tilemap_set_scrolldx(state->m_foreground, -252, 252); + state->m_background->set_scrolldx(-248, 248); + state->m_foreground->set_scrolldx(-252, 252); } @@ -183,42 +177,42 @@ { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_scroll_x); - tilemap_set_scrollx(state->m_text_layer, 0, state->m_tx_scroll_x); + state->m_text_layer->set_scrollx(0, state->m_tx_scroll_x); } WRITE16_HANDLER( gaiden_txscrolly_w ) { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_scroll_y); - tilemap_set_scrolly(state->m_text_layer, 0, (state->m_tx_scroll_y - state->m_tx_offset_y) & 0xffff); + state->m_text_layer->set_scrolly(0, (state->m_tx_scroll_y - state->m_tx_offset_y) & 0xffff); } WRITE16_HANDLER( gaiden_fgscrollx_w ) { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_scroll_x); - tilemap_set_scrollx(state->m_foreground, 0, state->m_fg_scroll_x); + state->m_foreground->set_scrollx(0, state->m_fg_scroll_x); } WRITE16_HANDLER( gaiden_fgscrolly_w ) { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_scroll_y); - tilemap_set_scrolly(state->m_foreground, 0, (state->m_fg_scroll_y - state->m_fg_offset_y) & 0xffff); + state->m_foreground->set_scrolly(0, (state->m_fg_scroll_y - state->m_fg_offset_y) & 0xffff); } WRITE16_HANDLER( gaiden_bgscrollx_w ) { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_scroll_x); - tilemap_set_scrollx(state->m_background, 0, state->m_bg_scroll_x); + state->m_background->set_scrollx(0, state->m_bg_scroll_x); } WRITE16_HANDLER( gaiden_bgscrolly_w ) { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_scroll_y); - tilemap_set_scrolly(state->m_background, 0, (state->m_bg_scroll_y - state->m_bg_offset_y) & 0xffff); + state->m_background->set_scrolly(0, (state->m_bg_scroll_y - state->m_bg_offset_y) & 0xffff); } WRITE16_HANDLER( gaiden_txoffsety_w ) @@ -227,7 +221,7 @@ if (ACCESSING_BITS_0_7) { state->m_tx_offset_y = data; - tilemap_set_scrolly(state->m_text_layer, 0, (state->m_tx_scroll_y - state->m_tx_offset_y) & 0xffff); + state->m_text_layer->set_scrolly(0, (state->m_tx_scroll_y - state->m_tx_offset_y) & 0xffff); } } @@ -237,7 +231,7 @@ if (ACCESSING_BITS_0_7) { state->m_fg_offset_y = data; - tilemap_set_scrolly(state->m_foreground, 0, (state->m_fg_scroll_y - state->m_fg_offset_y) & 0xffff); + state->m_foreground->set_scrolly(0, (state->m_fg_scroll_y - state->m_fg_offset_y) & 0xffff); } } @@ -247,7 +241,7 @@ if (ACCESSING_BITS_0_7) { state->m_bg_offset_y = data; - tilemap_set_scrolly(state->m_background, 0, (state->m_bg_scroll_y - state->m_bg_offset_y) & 0xffff); + state->m_background->set_scrolly(0, (state->m_bg_scroll_y - state->m_bg_offset_y) & 0xffff); } } @@ -266,7 +260,7 @@ { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram3[offset]); - tilemap_mark_tile_dirty(state->m_background, offset & 0x07ff); + state->m_background->mark_tile_dirty(offset & 0x07ff); } READ16_HANDLER( gaiden_videoram3_r ) @@ -279,7 +273,7 @@ { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_foreground, offset & 0x07ff); + state->m_foreground->mark_tile_dirty(offset & 0x07ff); } READ16_HANDLER( gaiden_videoram2_r ) @@ -292,7 +286,7 @@ { gaiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer, offset & 0x03ff); + state->m_text_layer->mark_tile_dirty(offset & 0x03ff); } @@ -310,20 +304,20 @@ changes?) it appears that the sprite drawing is no longer putting the correct raw data in the bitmaps? */ static void blendbitmaps(running_machine &machine, - bitmap_t *dest,bitmap_t *src1,bitmap_t *src2,bitmap_t *src3, - int sx,int sy,const rectangle *cliprect) + bitmap_rgb32 &dest,bitmap_ind16 &src1,bitmap_ind16 &src2,bitmap_ind16 &src3, + int sx,int sy,const rectangle &cliprect) { int y,x; const pen_t *paldata = machine.pens; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dd = BITMAP_ADDR32(dest, y, 0); - UINT16 *sd1 = BITMAP_ADDR16(src1, y, 0); - UINT16 *sd2 = BITMAP_ADDR16(src2, y, 0); - UINT16 *sd3 = BITMAP_ADDR16(src3, y, 0); + UINT32 *dd = &dest.pix32(y); + UINT16 *sd1 = &src1.pix16(y); + UINT16 *sd2 = &src2.pix16(y); + UINT16 *sd3 = &src3.pix16(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { if (sd3[x]) { @@ -367,7 +361,7 @@ #define NUM_SPRITES 256 -static void gaiden_draw_sprites( running_machine &machine, bitmap_t *bitmap_bg, bitmap_t *bitmap_fg, bitmap_t *bitmap_sp, const rectangle *cliprect ) +static void gaiden_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap_bg, bitmap_ind16 &bitmap_fg, bitmap_ind16 &bitmap_sp, const rectangle &cliprect ) { static const UINT8 layout[8][8] = { @@ -465,7 +459,7 @@ } else { - bitmap_t *bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; + bitmap_ind16 &bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; for (row = 0; row < sizey; row++) { @@ -489,7 +483,7 @@ } -static void raiga_draw_sprites( running_machine &machine, bitmap_t *bitmap_bg, bitmap_t *bitmap_fg, bitmap_t *bitmap_sp, const rectangle *cliprect ) +static void raiga_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap_bg, bitmap_ind16 &bitmap_fg, bitmap_ind16 &bitmap_sp, const rectangle &cliprect ) { static const UINT8 layout[8][8] = { @@ -586,7 +580,7 @@ } else { - bitmap_t *bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; + bitmap_ind16 &bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; for (row = 0; row < sizey; row++) { @@ -629,7 +623,7 @@ * |---------x------- | x position (high bit) */ -static void drgnbowl_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void drgnbowl_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { gaiden_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -670,65 +664,65 @@ } } -SCREEN_UPDATE( gaiden ) +SCREEN_UPDATE_RGB32( gaiden ) { - gaiden_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + gaiden_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(state->m_tile_bitmap_bg, cliprect, 0x200); - bitmap_fill(state->m_tile_bitmap_fg, cliprect, 0); - bitmap_fill(state->m_sprite_bitmap, cliprect, 0); + state->m_tile_bitmap_bg.fill(0x200, cliprect); + state->m_tile_bitmap_fg.fill(0, cliprect); + state->m_sprite_bitmap.fill(0, cliprect); /* draw tilemaps into a 16-bit bitmap */ - tilemap_draw(state->m_tile_bitmap_bg, cliprect, state->m_background, 0, 1); - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_foreground, 0, 2); + state->m_background->draw(state->m_tile_bitmap_bg, cliprect, 0, 1); + state->m_foreground->draw(state->m_tile_bitmap_fg, cliprect, 0, 2); /* draw the blended tiles at a lower priority so sprites covered by them will still be drawn */ - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_foreground, 1, 0); - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_text_layer, 0, 4); + state->m_foreground->draw(state->m_tile_bitmap_fg, cliprect, 1, 0); + state->m_text_layer->draw(state->m_tile_bitmap_fg, cliprect, 0, 4); /* draw sprites into a 16-bit bitmap */ - gaiden_draw_sprites(screen->machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); + gaiden_draw_sprites(screen.machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); /* mix & blend the tilemaps and sprites into a 32-bit bitmap */ - blendbitmaps(screen->machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); + blendbitmaps(screen.machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); return 0; } -SCREEN_UPDATE( raiga ) +SCREEN_UPDATE_RGB32( raiga ) { - gaiden_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + gaiden_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(state->m_tile_bitmap_bg, cliprect, 0x200); - bitmap_fill(state->m_tile_bitmap_fg, cliprect, 0); - bitmap_fill(state->m_sprite_bitmap, cliprect, 0); + state->m_tile_bitmap_bg.fill(0x200, cliprect); + state->m_tile_bitmap_fg.fill(0, cliprect); + state->m_sprite_bitmap.fill(0, cliprect); /* draw tilemaps into a 16-bit bitmap */ - tilemap_draw(state->m_tile_bitmap_bg, cliprect, state->m_background, 0, 1); - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_foreground, 0, 2); + state->m_background->draw(state->m_tile_bitmap_bg, cliprect, 0, 1); + state->m_foreground->draw(state->m_tile_bitmap_fg, cliprect, 0, 2); /* draw the blended tiles at a lower priority so sprites covered by them will still be drawn */ - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_foreground, 1, 0); - tilemap_draw(state->m_tile_bitmap_fg, cliprect, state->m_text_layer, 0, 4); + state->m_foreground->draw(state->m_tile_bitmap_fg, cliprect, 1, 0); + state->m_text_layer->draw(state->m_tile_bitmap_fg, cliprect, 0, 4); /* draw sprites into a 16-bit bitmap */ - raiga_draw_sprites(screen->machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); + raiga_draw_sprites(screen.machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); /* mix & blend the tilemaps and sprites into a 32-bit bitmap */ - blendbitmaps(screen->machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); + blendbitmaps(screen.machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); return 0; } -SCREEN_UPDATE( drgnbowl ) +SCREEN_UPDATE_IND16( drgnbowl ) { - gaiden_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + gaiden_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_background, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_foreground, 0, 2); - tilemap_draw(bitmap, cliprect, state->m_text_layer, 0, 4); - drgnbowl_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_background->draw(bitmap, cliprect, 0, 1); + state->m_foreground->draw(bitmap, cliprect, 0, 2); + state->m_text_layer->draw(bitmap, cliprect, 0, 4); + drgnbowl_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/galaga.c mame-0.145/src/mame/video/galaga.c --- mame-0.144/src/mame/video/galaga.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/galaga.c 2012-02-06 21:30:32.000000000 +0000 @@ -419,7 +419,7 @@ (state->m_videoram[tile_index] & 0x7f) | (flip_screen_get(machine) ? 0x80 : 0) | (state->m_galaga_gfxbank << 8), color, flip_screen_get(machine) ? TILE_FLIPX : 0); - tileinfo->group = color; + tileinfo.group = color; } @@ -457,7 +457,7 @@ galaga_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER ( gatsbee_bank_w ) @@ -465,7 +465,7 @@ galaga_state *state = space->machine().driver_data(); state->m_galaga_gfxbank = data & 0x1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } @@ -476,7 +476,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { galaga_state *state = machine.driver_data(); @@ -510,7 +510,8 @@ { flipx ^= 1; flipy ^= 1; - sy += 48; + sy += 40; + sx += 96; } for (y = 0;y <= sizey;y++) @@ -529,69 +530,70 @@ } -static void draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { galaga_state *state = machine.driver_data(); /* draw the stars */ /* $a005 controls the stars ON/OFF */ - - if ( (state->m_galaga_starcontrol[5] & 1) == 1 ) { + int y_align = 112; /* 112 is a tweak to get alignment about perfect */ + int x_align = flip_screen_get(machine) ? 112 : 16; + int star_cntr; int set_a, set_b; /* two sets of stars controlled by these bits */ - set_a = (state->m_galaga_starcontrol[3] & 1); - set_b = (state->m_galaga_starcontrol[4] & 1) | 0x2; - + set_b = (state->m_galaga_starcontrol[4] & 1) | 2; for (star_cntr = 0;star_cntr < MAX_STARS ;star_cntr++) { int x,y; - if ( (set_a == star_seed_tab[star_cntr].set) || ( set_b == star_seed_tab[star_cntr].set) ) + if ( (set_a == star_seed_tab[star_cntr].set) || ( set_b == star_seed_tab[star_cntr].set) ) { - x = (star_seed_tab[star_cntr].x + state->m_stars_scrollx) % 256 + 16; - y = (112 + star_seed_tab[star_cntr].y + state->m_stars_scrolly) % 256; - /* 112 is a tweak to get alignment about perfect */ + x = (star_seed_tab[star_cntr].x + state->m_stars_scrollx) % 256 + x_align; + y = (y_align + star_seed_tab[star_cntr].y + state->m_stars_scrolly) % 256; - if (y >= cliprect->min_y && y <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, y, x) = STARS_COLOR_BASE + star_seed_tab[ star_cntr ].col; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = STARS_COLOR_BASE + star_seed_tab[ star_cntr ].col; } } } } -SCREEN_UPDATE( galaga ) +SCREEN_UPDATE_IND16( galaga ) { - galaga_state *state = screen->machine().driver_data(); + galaga_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - draw_stars(screen->machine(),bitmap,cliprect); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + draw_stars(screen.machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_EOF( galaga ) +SCREEN_VBLANK( galaga ) { - galaga_state *state = machine.driver_data(); - /* this function is called by galaga_interrupt_1() */ - int s0,s1,s2; - static const int speeds[8] = { -1, -2, -3, 0, 3, 2, 1, 0 }; - - - s0 = (state->m_galaga_starcontrol[0] & 1); - s1 = (state->m_galaga_starcontrol[1] & 1); - s2 = (state->m_galaga_starcontrol[2] & 1); + // falling edge + if (!vblank_on) + { + galaga_state *state = screen.machine().driver_data(); + /* this function is called by galaga_interrupt_1() */ + int s0,s1,s2; + static const int speeds[8] = { -1, -2, -3, 0, 3, 2, 1, 0 }; + + s0 = (state->m_galaga_starcontrol[0] & 1); + s1 = (state->m_galaga_starcontrol[1] & 1); + s2 = (state->m_galaga_starcontrol[2] & 1); - state->m_stars_scrollx += speeds[s0 + s1*2 + s2*4]; + state->m_stars_scrollx += speeds[s0 + s1*2 + s2*4]; + } } diff -Nru mame-0.144/src/mame/video/galastrm.c mame-0.145/src/mame/video/galastrm.c --- mame-0.144/src/mame/video/galastrm.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/galastrm.c 2012-02-06 21:30:32.000000000 +0000 @@ -9,7 +9,7 @@ typedef struct _poly_extra_data poly_extra_data; struct _poly_extra_data { - bitmap_t *texbase; + bitmap_ind16 *texbase; }; typedef struct _polygon polygon; @@ -33,8 +33,8 @@ galastrm_state *state = machine.driver_data(); state->m_spritelist = auto_alloc_array(machine, struct tempsprite, 0x4000); - state->m_tmpbitmaps = machine.primary_screen->alloc_compatible_bitmap(); - state->m_polybitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmaps); + machine.primary_screen->register_screen_bitmap(state->m_polybitmap); state->m_poly = poly_alloc(machine, 16, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(galastrm_exit), &machine)); @@ -193,7 +193,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const int *primasks, int priority) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int *primasks, int priority) { galastrm_state *state = machine.driver_data(); struct tempsprite *sprite_ptr = state->m_sprite_ptr_pre; @@ -223,9 +223,9 @@ static void tc0610_draw_scanline(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *framebuffer = BITMAP_ADDR16(destmap, scanline, 0); - bitmap_t *texbase = extra->texbase; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *framebuffer = &destmap->pix16(scanline); + bitmap_ind16 *texbase = extra->texbase; int startx = extent->startx; int stopx = extent->stopx; INT32 u = extent->param[0].start; @@ -236,13 +236,13 @@ for (x = startx; x < stopx; x++) { - framebuffer[x] = *BITMAP_ADDR16(texbase, v >> 16, u >> 16); + framebuffer[x] = texbase->pix16(v >> 16, u >> 16); u += dudx; v += dvdx; } } -static void tc0610_rotate_draw(running_machine &machine, bitmap_t *bitmap, bitmap_t *srcbitmap, const rectangle *clip) +static void tc0610_rotate_draw(running_machine &machine, bitmap_ind16 &bitmap, bitmap_ind16 &srcbitmap, const rectangle &clip) { galastrm_state *state = machine.driver_data(); poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); @@ -254,8 +254,8 @@ const int rzy = state->m_tc0610_ctrl_reg[1][3]; const int ryx = state->m_tc0610_ctrl_reg[1][5]; const int ryy = state->m_tc0610_ctrl_reg[1][4]; - const int lx = srcbitmap->width; - const int ly = srcbitmap->height; + const int lx = srcbitmap.width(); + const int ly = srcbitmap.height(); int yx, /*yy,*/ zx, zy, pxx, pxy, pyx, pyy; float /*ssn, scs, ysn, ycs,*/ zsn, zcs; @@ -426,31 +426,27 @@ vert[3].p[0] = (float)(lx - 1) * 65536.0; vert[3].p[1] = 0.0; - extra->texbase = srcbitmap; + extra->texbase = &srcbitmap; callback = tc0610_draw_scanline; - poly_render_quad(state->m_poly, bitmap, clip, callback, 2, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_quad(state->m_poly, &bitmap, clip, callback, 2, &vert[0], &vert[1], &vert[2], &vert[3]); } /************************************************************** SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( galastrm ) +SCREEN_UPDATE_IND16( galastrm ) { - galastrm_state *state = screen->machine().driver_data(); - device_t *tc0100scn = screen->machine().device("tc0100scn"); - device_t *tc0480scp = screen->machine().device("tc0480scp"); + galastrm_state *state = screen.machine().driver_data(); + device_t *tc0100scn = screen.machine().device("tc0100scn"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT8 pivlayer[3]; UINT16 priority; static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; - rectangle clip; - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; - clip.min_x = 0; - clip.min_y = 0; - clip.max_x = screen->width() -1; - clip.max_y = screen->height() -1; + rectangle clip(0, screen.width() -1, 0, screen.height() -1); tc0100scn_tilemap_update(tc0100scn); tc0480scp_tilemap_update(tc0480scp); @@ -466,9 +462,9 @@ pivlayer[1] = pivlayer[0] ^ 1; pivlayer[2] = 2; - bitmap_fill(bitmap, cliprect, 0); - bitmap_fill(priority_bitmap, &clip, 0); - bitmap_fill(state->m_tmpbitmaps, &clip, 0); + bitmap.fill(0, cliprect); + priority_bitmap.fill(0, clip); + state->m_tmpbitmaps.fill(0, clip); tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[0], 0, 0); tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[1], 0, 0); @@ -476,17 +472,17 @@ #if 0 if (layer[0]==0 && layer[1]==3 && layer[2]==2 && layer[3]==1) { - if (!screen->machine().input().code_pressed(KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[0], 0, 1); - if (!screen->machine().input().code_pressed(KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[1], 0, 4); - if (!screen->machine().input().code_pressed(KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[2], 0, 4); - if (!screen->machine().input().code_pressed(KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[3], 0, 4); + if (!screen.machine().input().code_pressed(KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[0], 0, 1); + if (!screen.machine().input().code_pressed(KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[1], 0, 4); + if (!screen.machine().input().code_pressed(KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[2], 0, 4); + if (!screen.machine().input().code_pressed(KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[3], 0, 4); } else { - if (!screen->machine().input().code_pressed(KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[0], 0, 1); - if (!screen->machine().input().code_pressed(KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[1], 0, 2); - if (!screen->machine().input().code_pressed(KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[2], 0, 4); - if (!screen->machine().input().code_pressed(KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[3], 0, 8); + if (!screen.machine().input().code_pressed(KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[0], 0, 1); + if (!screen.machine().input().code_pressed(KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[1], 0, 2); + if (!screen.machine().input().code_pressed(KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[2], 0, 4); + if (!screen.machine().input().code_pressed(KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[3], 0, 8); } if (layer[0]==3 && layer[1]==0 && layer[2]==1 && layer[3]==2) @@ -494,46 +490,46 @@ int x,y; UINT8 *pri; - for (y=0; y < priority_bitmap->height; y++) + for (y=0; y < priority_bitmap.height; y++) { - for (x=0; x < priority_bitmap->width; x++) + for (x=0; x < priority_bitmap.width; x++) { - pri = BITMAP_ADDR8(priority_bitmap, y, x); - if (!(*pri & 0x02) && *BITMAP_ADDR16(state->m_tmpbitmaps, y, x)) + pri = &priority_bitmap.pix8(y, x); + if (!(*pri & 0x02) && state->m_tmpbitmaps.pix16(y, x)) *pri |= 0x04; } } } - draw_sprites_pre(screen->machine(), 42-X_OFFSET, -571+Y_OFFSET); - draw_sprites(screen->machine(),state->m_tmpbitmaps,&clip,primasks,1); + draw_sprites_pre(screen.machine(), 42-X_OFFSET, -571+Y_OFFSET); + draw_sprites(screen.machine(),state->m_tmpbitmaps,clip,primasks,1); copybitmap_trans(bitmap,state->m_polybitmap,0,0, 0,0,cliprect,0); - bitmap_fill(state->m_polybitmap, &clip, 0); - tc0610_rotate_draw(screen->machine(),state->m_polybitmap,state->m_tmpbitmaps,cliprect); + state->m_polybitmap->fill(0, clip); + tc0610_rotate_draw(screen.machine(),state->m_polybitmap,state->m_tmpbitmaps,cliprect); - bitmap_fill(priority_bitmap, cliprect, 0); - draw_sprites(screen->machine(),bitmap,cliprect,primasks,0); + priority_bitmap.fill(0, cliprect); + draw_sprites(screen.machine(),bitmap,cliprect,primasks,0); - if (!screen->machine().input().code_pressed(KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 0); - if (!screen->machine().input().code_pressed(KEYCODE_M)) tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[2], 0, 0); + if (!screen.machine().input().code_pressed(KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 0); + if (!screen.machine().input().code_pressed(KEYCODE_M)) tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[2], 0, 0); #else if (layer[0]==0 && layer[1]==3 && layer[2]==2 && layer[3]==1) { - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[0], 0, 1); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[1], 0, 4); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[2], 0, 4); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[3], 0, 4); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[0], 0, 1); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[1], 0, 4); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[2], 0, 4); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[3], 0, 4); } else { - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[0], 0, 1); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[1], 0, 2); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[2], 0, 4); - tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, &clip, layer[3], 0, 8); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[0], 0, 1); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[1], 0, 2); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[2], 0, 4); + tc0480scp_tilemap_draw(tc0480scp, state->m_tmpbitmaps, clip, layer[3], 0, 8); } if (layer[0]==3 && layer[1]==0 && layer[2]==1 && layer[3]==2) @@ -541,26 +537,26 @@ int x,y; UINT8 *pri; - for (y=0; y < priority_bitmap->height; y++) + for (y=0; y < priority_bitmap.height(); y++) { - for (x=0; x < priority_bitmap->width; x++) + for (x=0; x < priority_bitmap.width(); x++) { - pri = BITMAP_ADDR8(priority_bitmap, y, x); - if (!(*pri & 0x02) && *BITMAP_ADDR16(state->m_tmpbitmaps, y, x)) + pri = &priority_bitmap.pix8(y, x); + if (!(*pri & 0x02) && state->m_tmpbitmaps.pix16(y, x)) *pri |= 0x04; } } } - draw_sprites_pre(screen->machine(), 42-X_OFFSET, -571+Y_OFFSET); - draw_sprites(screen->machine(),state->m_tmpbitmaps,&clip,primasks,1); + draw_sprites_pre(screen.machine(), 42-X_OFFSET, -571+Y_OFFSET); + draw_sprites(screen.machine(),state->m_tmpbitmaps,clip,primasks,1); copybitmap_trans(bitmap,state->m_polybitmap,0,0, 0,0,cliprect,0); - bitmap_fill(state->m_polybitmap, &clip, 0); - tc0610_rotate_draw(screen->machine(),state->m_polybitmap,state->m_tmpbitmaps,cliprect); + state->m_polybitmap.fill(0, clip); + tc0610_rotate_draw(screen.machine(),state->m_polybitmap,state->m_tmpbitmaps,cliprect); - bitmap_fill(priority_bitmap, cliprect, 0); - draw_sprites(screen->machine(),bitmap,cliprect,primasks,0); + priority_bitmap.fill(0, cliprect); + draw_sprites(screen.machine(),bitmap,cliprect,primasks,0); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 0); tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[2], 0, 0); diff -Nru mame-0.144/src/mame/video/galaxian.c mame-0.145/src/mame/video/galaxian.c --- mame-0.144/src/mame/video/galaxian.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/galaxian.c 2012-02-06 21:30:32.000000000 +0000 @@ -237,13 +237,13 @@ static void state_save_register(running_machine &machine); static TILE_GET_INFO( bg_get_tile_info ); -static void sprites_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *spritebase); +static void sprites_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT8 *spritebase); static void stars_init(running_machine &machine); static void stars_update_origin(running_machine &machine); -static void stars_draw_row(galaxian_state *state, bitmap_t *bitmap, int maxx, int y, UINT32 star_offs, UINT8 starmask); +static void stars_draw_row(galaxian_state *state, bitmap_rgb32 &bitmap, int maxx, int y, UINT32 star_offs, UINT8 starmask); -static void bullets_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *base); +static void bullets_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT8 *base); @@ -396,19 +396,19 @@ { /* normal galaxian hardware is row-based and individually scrolling columns */ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, tilemap_scan_rows, GALAXIAN_XSCALE*8,8, 32,32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, -GALAXIAN_XSCALE * 128); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 8); + state->m_bg_tilemap->set_scroll_cols(32); + state->m_bg_tilemap->set_scrolldx(0, -GALAXIAN_XSCALE * 128); + state->m_bg_tilemap->set_scrolldy(0, 8); } else { /* sfx hardware is column-based and individually scrolling rows */ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, tilemap_scan_cols, GALAXIAN_XSCALE*8,8, 32,32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, -GALAXIAN_XSCALE * 128); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 8); + state->m_bg_tilemap->set_scroll_rows(32); + state->m_bg_tilemap->set_scrolldx(0, -GALAXIAN_XSCALE * 128); + state->m_bg_tilemap->set_scrolldy(0, 8); } - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); /* initialize globals */ state->m_flipscreen_x = 0; @@ -452,32 +452,32 @@ * *************************************/ -SCREEN_UPDATE( galaxian ) +SCREEN_UPDATE_RGB32( galaxian ) { - galaxian_state *state = screen->machine().driver_data(); + galaxian_state *state = screen.machine().driver_data(); /* draw the background layer (including stars) */ - (*state->m_draw_background_ptr)(screen->machine(), bitmap, cliprect); + (*state->m_draw_background_ptr)(screen.machine(), bitmap, cliprect); /* draw the tilemap characters over top */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* render the sprites next */ - sprites_draw(screen->machine(), bitmap, cliprect, &screen->machine().generic.spriteram.u8[0x40]); + sprites_draw(screen.machine(), bitmap, cliprect, &screen.machine().generic.spriteram.u8[0x40]); /* if we have bullets to draw, render them following */ if (state->m_draw_bullet_ptr != NULL) - bullets_draw(screen->machine(), bitmap, cliprect, &screen->machine().generic.spriteram.u8[0x60]); + bullets_draw(screen.machine(), bitmap, cliprect, &screen.machine().generic.spriteram.u8[0x60]); return 0; } -SCREEN_UPDATE( zigzag ) +SCREEN_UPDATE_RGB32( zigzag ) { - SCREEN_UPDATE_CALL(galaxian); + SCREEN_UPDATE32_CALL(galaxian); /* zigzag has an extra sprite generator instead of bullets (note: ideally, this should be rendered in parallel) */ - sprites_draw(screen->machine(), bitmap, cliprect, &screen->machine().generic.spriteram.u8[0x60]); + sprites_draw(screen.machine(), bitmap, cliprect, &screen.machine().generic.spriteram.u8[0x60]); return 0; } @@ -516,7 +516,7 @@ /* store the data and mark the corresponding tile dirty */ videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -539,16 +539,16 @@ if (state->m_frogger_adjust) data = (data >> 4) | (data << 4); if (!state->m_sfx_tilemap) - tilemap_set_scrolly(state->m_bg_tilemap, offset >> 1, data); + state->m_bg_tilemap->set_scrolly(offset >> 1, data); else - tilemap_set_scrollx(state->m_bg_tilemap, offset >> 1, GALAXIAN_XSCALE*data); + state->m_bg_tilemap->set_scrollx(offset >> 1, GALAXIAN_XSCALE*data); } /* odd entries control the color base for the row */ else { for (offset >>= 1; offset < 0x0400; offset += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } } } @@ -561,10 +561,10 @@ * *************************************/ -static void sprites_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *spritebase) +static void sprites_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT8 *spritebase) { galaxian_state *state = machine.driver_data(); - rectangle clip = *cliprect; + rectangle clip = cliprect; int sprnum; /* 16 of the 256 pixels of the sprites are hard-clipped at the line buffer */ @@ -608,7 +608,7 @@ } /* draw */ - drawgfx_transpen(bitmap, &clip, + drawgfx_transpen(bitmap, clip, machine.gfx[1], code, color, flipx, flipy, @@ -624,13 +624,13 @@ * *************************************/ -static void bullets_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *base) +static void bullets_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT8 *base) { galaxian_state *state = machine.driver_data(); int y; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 shell = 0xff, missile = 0xff; UINT8 effy; @@ -682,7 +682,7 @@ stars_update_origin(space->machine()); state->m_flipscreen_x = data & 0x01; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } } @@ -693,7 +693,7 @@ { space->machine().primary_screen->update_now(); state->m_flipscreen_y = data & 0x01; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } } @@ -783,7 +783,7 @@ { space->machine().primary_screen->update_now(); state->m_gfxbank[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -881,7 +881,7 @@ * *************************************/ -static void stars_draw_row(galaxian_state *state, bitmap_t *bitmap, int maxx, int y, UINT32 star_offs, UINT8 starmask) +static void stars_draw_row(galaxian_state *state, bitmap_rgb32 &bitmap, int maxx, int y, UINT32 star_offs, UINT8 starmask) { int x; @@ -917,7 +917,7 @@ if (star_offs >= STAR_RNG_PERIOD) star_offs = 0; if (enable_star && (star & 0x80) != 0 && (star & starmask) != 0) - *BITMAP_ADDR32(bitmap, y, GALAXIAN_XSCALE*x + 0) = state->m_star_color[star & 0x3f]; + bitmap.pix32(y, GALAXIAN_XSCALE*x + 0) = state->m_star_color[star & 0x3f]; /* second RNG clock: two pixels */ star = state->m_stars[star_offs++]; @@ -925,8 +925,8 @@ star_offs = 0; if (enable_star && (star & 0x80) != 0 && (star & starmask) != 0) { - *BITMAP_ADDR32(bitmap, y, GALAXIAN_XSCALE*x + 1) = state->m_star_color[star & 0x3f]; - *BITMAP_ADDR32(bitmap, y, GALAXIAN_XSCALE*x + 2) = state->m_star_color[star & 0x3f]; + bitmap.pix32(y, GALAXIAN_XSCALE*x + 1) = state->m_star_color[star & 0x3f]; + bitmap.pix32(y, GALAXIAN_XSCALE*x + 2) = state->m_star_color[star & 0x3f]; } } } @@ -939,11 +939,11 @@ * *************************************/ -void galaxian_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void galaxian_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); /* erase the background to black first */ - bitmap_fill(bitmap, cliprect, RGB_BLACK); + bitmap.fill(RGB_BLACK, cliprect); /* update the star origin to the current frame */ stars_update_origin(machine); @@ -954,7 +954,7 @@ int y; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT32 star_offs = state->m_star_rng_origin + y * 512; stars_draw_row(state, bitmap, 256, y, star_offs, 0xff); @@ -963,38 +963,38 @@ } -static void background_draw_colorsplit(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, rgb_t color, int split, int split_flipped) +static void background_draw_colorsplit(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, rgb_t color, int split, int split_flipped) { galaxian_state *state = machine.driver_data(); /* horizontal bgcolor split */ if (state->m_flipscreen_x) { - rectangle draw = *cliprect; + rectangle draw = cliprect; draw.max_x = MIN(draw.max_x, split_flipped * GALAXIAN_XSCALE - 1); if (draw.min_x <= draw.max_x) - bitmap_fill(bitmap, &draw, RGB_BLACK); + bitmap.fill(RGB_BLACK, draw); - draw = *cliprect; + draw = cliprect; draw.min_x = MAX(draw.min_x, split_flipped * GALAXIAN_XSCALE); if (draw.min_x <= draw.max_x) - bitmap_fill(bitmap, &draw, color); + bitmap.fill(color, draw); } else { - rectangle draw = *cliprect; + rectangle draw = cliprect; draw.max_x = MIN(draw.max_x, split * GALAXIAN_XSCALE - 1); if (draw.min_x <= draw.max_x) - bitmap_fill(bitmap, &draw, color); + bitmap.fill(color, draw); - draw = *cliprect; + draw = cliprect; draw.min_x = MAX(draw.min_x, split * GALAXIAN_XSCALE); if (draw.min_x <= draw.max_x) - bitmap_fill(bitmap, &draw, RGB_BLACK); + bitmap.fill(RGB_BLACK, draw); } } -static void scramble_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int maxx) +static void scramble_draw_stars(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int maxx) { galaxian_state *state = machine.driver_data(); /* update the star origin to the current frame */ @@ -1007,7 +1007,7 @@ int y; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { /* blink state 2 suppressed stars when 2V == 0 */ if (blink_state != 2 || (y & 2) != 0) @@ -1021,17 +1021,17 @@ } -void scramble_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void scramble_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); /* blue background - 390 ohm resistor */ - bitmap_fill(bitmap, cliprect, state->m_background_enable ? MAKE_RGB(0,0,0x56) : RGB_BLACK); + bitmap.fill(state->m_background_enable ? MAKE_RGB(0,0,0x56) : RGB_BLACK, cliprect); scramble_draw_stars(machine, bitmap, cliprect, 256); } -void anteater_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void anteater_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); /* blue background, horizontal split as seen on flyer and real cabinet */ @@ -1041,18 +1041,18 @@ } -void jumpbug_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void jumpbug_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); /* blue background - 390 ohm resistor */ - bitmap_fill(bitmap, cliprect, state->m_background_enable ? MAKE_RGB(0,0,0x56) : RGB_BLACK); + bitmap.fill(state->m_background_enable ? MAKE_RGB(0,0,0x56) : RGB_BLACK, cliprect); /* render stars same as scramble but nothing in the status area */ scramble_draw_stars(machine, bitmap, cliprect, 240); } -void turtles_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void turtles_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); /* @@ -1062,11 +1062,11 @@ GREEN - 470 ohm resistor BLUE - 390 ohm resistor */ - bitmap_fill(bitmap, cliprect, MAKE_RGB(state->m_background_red * 0x55, state->m_background_green * 0x47, state->m_background_blue * 0x55)); + bitmap.fill(MAKE_RGB(state->m_background_red * 0x55, state->m_background_green * 0x47, state->m_background_blue * 0x55), cliprect); } -void frogger_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void frogger_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { /* color split point verified on real machine */ /* hmmm, according to schematics it is at 128+8; which is right? */ @@ -1075,25 +1075,25 @@ #ifdef UNUSED_FUNCTION -static int flip_and_clip(rectangle *draw, int xstart, int xend, const rectangle *cliprect) +static int flip_and_clip(rectangle &draw, int xstart, int xend, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); - *draw = *cliprect; + draw = cliprect; if (!state->m_flipscreen_x) { - draw->min_x = xstart * GALAXIAN_XSCALE; - draw->max_x = xend * GALAXIAN_XSCALE + (GALAXIAN_XSCALE - 1); + draw.min_x = xstart * GALAXIAN_XSCALE; + draw.max_x = xend * GALAXIAN_XSCALE + (GALAXIAN_XSCALE - 1); } else { - draw->min_x = (xend ^ 255) * GALAXIAN_XSCALE; - draw->max_x = (xstart ^ 255) * GALAXIAN_XSCALE + (GALAXIAN_XSCALE - 1); + draw.min_x = (xend ^ 255) * GALAXIAN_XSCALE; + draw.max_x = (xstart ^ 255) * GALAXIAN_XSCALE + (GALAXIAN_XSCALE - 1); } - sect_rect(draw, cliprect); - return (draw->min_x <= draw->max_x); + draw &= cliprect; + return (draw.min_x <= draw.max_x); } -void amidar_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void amidar_draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { galaxian_state *state = machine.driver_data(); const UINT8 *prom = machine.region("user1")->base(); @@ -1120,7 +1120,7 @@ UINT8 red = ((~prom[x] & 0x02) && state->m_background_red) ? 0x7c : 0x00; UINT8 green = ((~prom[x] & 0x02) && state->m_background_green) ? 0x3c : 0x00; UINT8 blue = ((~prom[x] & 0x01) && state->m_background_blue) ? 0x47 : 0x00; - bitmap_fill(bitmap, &draw, MAKE_RGB(red, green, blue)); + bitmap.fill(MAKE_RGB(red, green, blue, draw)); } } #endif @@ -1133,27 +1133,27 @@ * *************************************/ -INLINE void galaxian_draw_pixel(bitmap_t *bitmap, const rectangle *cliprect, int y, int x, rgb_t color) +INLINE void galaxian_draw_pixel(bitmap_rgb32 &bitmap, const rectangle &cliprect, int y, int x, rgb_t color) { - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { x *= GALAXIAN_XSCALE; x += GALAXIAN_H0START; - if (x >= cliprect->min_x && x <= cliprect->max_x) - *BITMAP_ADDR32(bitmap, y, x) = color; + if (x >= cliprect.min_x && x <= cliprect.max_x) + bitmap.pix32(y, x) = color; x++; - if (x >= cliprect->min_x && x <= cliprect->max_x) - *BITMAP_ADDR32(bitmap, y, x) = color; + if (x >= cliprect.min_x && x <= cliprect.max_x) + bitmap.pix32(y, x) = color; x++; - if (x >= cliprect->min_x && x <= cliprect->max_x) - *BITMAP_ADDR32(bitmap, y, x) = color; + if (x >= cliprect.min_x && x <= cliprect.max_x) + bitmap.pix32(y, x) = color; } } -void galaxian_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +void galaxian_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y) { galaxian_state *state = machine.driver_data(); /* @@ -1170,7 +1170,7 @@ } -void mshuttle_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +void mshuttle_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y) { /* verified by schematics: * both "W" and "Y" bullets are 4 pixels long @@ -1199,7 +1199,7 @@ } -void scramble_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +void scramble_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y) { /* Scramble only has "shells", which begin displaying when the counter @@ -1211,7 +1211,7 @@ } -void theend_draw_bullet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +void theend_draw_bullet(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int offs, int x, int y) { galaxian_state *state = machine.driver_data(); /* Same as galaxian except blue/green are swapped */ diff -Nru mame-0.144/src/mame/video/galaxold.c mame-0.145/src/mame/video/galaxold.c --- mame-0.144/src/mame/video/galaxold.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/galaxold.c 2012-02-06 21:30:32.000000000 +0000 @@ -7,18 +7,6 @@ #include "emu.h" #include "includes/galaxold.h" -static const rectangle spritevisiblearea = -{ - 2*8+1, 32*8-1, - 2*8, 30*8-1 -}; -static const rectangle spritevisibleareaflipx = -{ - 0*8, 30*8-2, - 2*8, 30*8-1 -}; - - #define STARS_COLOR_BASE (machine.region("proms")->bytes()) #define BULLETS_COLOR_BASE (STARS_COLOR_BASE + 64) #define BACKGROUND_COLOR_BASE (BULLETS_COLOR_BASE + 2) @@ -45,29 +33,29 @@ static TIMER_CALLBACK( stars_scroll_callback ); void galaxold_init_stars(running_machine &machine, int colors_offset); -static void noop_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); - void galaxold_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void scrambold_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void rescue_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void mariner_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +static void noop_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); + void galaxold_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void scrambold_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void rescue_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void mariner_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); static void start_stars_blink_timer(running_machine &machine, double ra, double rb, double c); static void start_stars_scroll_timer(running_machine &machine); /* bullets circuit */ -static void galaxold_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -static void scrambold_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -static void darkplnt_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); -static void dambustr_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y); +static void galaxold_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y); +static void scrambold_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y); +static void darkplnt_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y); +static void dambustr_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y); /* background circuit */ -static void galaxold_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void scrambold_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void ad2083_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void mariner_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void stratgyx_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void minefld_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void rescue_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); -static void dambustr_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +static void galaxold_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void scrambold_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void ad2083_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void mariner_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void stratgyx_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void minefld_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void rescue_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); +static void dambustr_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -487,10 +475,9 @@ galaxold_state *state = machine.driver_data(); video_start_common(machine); state->m_bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); + state->m_bg_tilemap->set_transparent_pen(0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - state->m_tilemap_set_scroll = tilemap_set_scrolly; + state->m_bg_tilemap->set_scroll_cols(32); state->m_color_mask = (machine.gfx[0]->color_granularity == 4) ? 7 : 3; } @@ -513,7 +500,7 @@ /* FIXME: This most probably needs to be adjusted * again when RAW video params are added to scramble */ - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolldx(0, 0); state->m_draw_stars = scrambold_draw_stars; @@ -527,7 +514,7 @@ galaxold_state *state = machine.driver_data(); VIDEO_START_CALL(galaxold_plain); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolldx(0, 0); state->m_draw_bullets = darkplnt_draw_bullets; } @@ -625,7 +612,7 @@ } #ifdef UNUSED_FUNCTION -static void theend_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +static void theend_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y) { int i; @@ -635,8 +622,8 @@ { x--; - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) - *BITMAP_ADDR16(bitmap, y, x) = BULLETS_COLOR_BASE; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = BULLETS_COLOR_BASE; } } @@ -687,10 +674,10 @@ -static void rockclim_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void rockclim_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); - tilemap_draw(bitmap,cliprect,state->m_rockclim_tilemap, 0,0); + state->m_rockclim_tilemap->draw(bitmap, cliprect, 0,0); } static void rockclim_modify_spritecode(running_machine &machine, UINT8 *spriteram, int *code, int *flipx, int *flipy, int offs) @@ -734,9 +721,8 @@ video_start_common(machine); state->m_bg_tilemap = tilemap_create(machine, drivfrcg_get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - state->m_tilemap_set_scroll = tilemap_set_scrolly; + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); state->m_modify_spritecode = mshuttle_modify_spritecode; state->m_modify_color = drivfrcg_modify_color; @@ -750,9 +736,8 @@ video_start_common(machine); state->m_bg_tilemap = tilemap_create(machine, drivfrcg_get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - state->m_tilemap_set_scroll = tilemap_set_scrolly; + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); state->m_modify_spritecode = ad2083_modify_spritecode; @@ -768,7 +753,7 @@ { galaxold_state *state = space->machine().driver_data(); state->m_racknrol_tiles_bank[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } static TILE_GET_INFO( racknrol_get_tile_info ) @@ -790,9 +775,8 @@ video_start_common(machine); state->m_bg_tilemap = tilemap_create(machine, racknrol_get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - state->m_tilemap_set_scroll = tilemap_set_scrolly; + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scroll_cols(32); state->m_color_mask = 0xff; } @@ -845,13 +829,13 @@ state->m_draw_bullets = dambustr_draw_bullets; /* allocate the temporary bitmap for the background priority */ - state->m_dambustr_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + state->m_dambustr_tmpbitmap = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); /* make a copy of the tilemap to emulate background priority */ state->m_dambustr_videoram2 = auto_alloc_array(machine, UINT8, 0x0400); state->m_dambustr_tilemap2 = tilemap_create(machine, dambustr_get_tile_info2,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_dambustr_tilemap2,0); + state->m_dambustr_tilemap2->set_transparent_pen(0); } @@ -859,7 +843,7 @@ { galaxold_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( galaxold_videoram_r ) @@ -880,7 +864,7 @@ int i; for (i = offset >> 1; i < 0x0400; i += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); } else { @@ -889,7 +873,7 @@ (*state->m_modify_ypos)(&data); } - (*state->m_tilemap_set_scroll)(state->m_bg_tilemap, offset >> 1, data); + state->m_bg_tilemap->set_scrolly(offset >> 1, data); } state->m_attributesram[offset] = data; @@ -904,7 +888,7 @@ { state->m_flipscreen_x = data & 0x01; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } } @@ -915,7 +899,7 @@ { state->m_flipscreen_y = data & 0x01; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } } @@ -992,7 +976,7 @@ { state->m_gfxbank[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -1000,7 +984,7 @@ { galaxold_state *state = space->machine().driver_data(); state->m_rockclim_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_rockclim_tilemap, offset); + state->m_rockclim_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( rockclim_scroll_w ) @@ -1008,10 +992,10 @@ galaxold_state *state = space->machine().driver_data(); switch(offset&3) { - case 0: state->m_rockclim_h=(state->m_rockclim_h&0xff00)|data;tilemap_set_scrollx(state->m_rockclim_tilemap , 0, state->m_rockclim_h );break; - case 1: state->m_rockclim_h=(state->m_rockclim_h&0xff)|(data<<8);tilemap_set_scrollx(state->m_rockclim_tilemap , 0, state->m_rockclim_h );break; - case 2: state->m_rockclim_v=(state->m_rockclim_v&0xff00)|data;tilemap_set_scrolly(state->m_rockclim_tilemap , 0, state->m_rockclim_v );break; - case 3: state->m_rockclim_v=(state->m_rockclim_v&0xff)|(data<<8);tilemap_set_scrolly(state->m_rockclim_tilemap , 0, state->m_rockclim_v );break; + case 0: state->m_rockclim_h=(state->m_rockclim_h&0xff00)|data;state->m_rockclim_tilemap ->set_scrollx(0, state->m_rockclim_h );break; + case 1: state->m_rockclim_h=(state->m_rockclim_h&0xff)|(data<<8);state->m_rockclim_tilemap ->set_scrollx(0, state->m_rockclim_h );break; + case 2: state->m_rockclim_v=(state->m_rockclim_v&0xff00)|data;state->m_rockclim_tilemap ->set_scrolly(0, state->m_rockclim_v );break; + case 3: state->m_rockclim_v=(state->m_rockclim_v&0xff)|(data<<8);state->m_rockclim_tilemap ->set_scrolly(0, state->m_rockclim_v );break; } } @@ -1038,7 +1022,7 @@ state->m_dambustr_bg_color_2 = (BIT(data,6)<<2) | (BIT(data,5)<<1) | BIT(data,4); state->m_dambustr_bg_priority = BIT(data,3); state->m_dambustr_char_bank = BIT(data,7); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } @@ -1146,7 +1130,7 @@ /* bullet drawing functions */ -static void galaxold_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +static void galaxold_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y) { int i; @@ -1155,7 +1139,7 @@ { x--; - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) + if (cliprect.contains(x, y)) { int color; @@ -1163,35 +1147,35 @@ /* yellow missile, white shells (this is the terminology on the schematics) */ color = ((offs == 7*4) ? BULLETS_COLOR_BASE : BULLETS_COLOR_BASE + 1); - *BITMAP_ADDR16(bitmap, y, x) = color; + bitmap.pix16(y, x) = color; } } } -static void scrambold_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +static void scrambold_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y) { galaxold_state *state = machine.driver_data(); if (state->m_flipscreen_x) x++; x = x - 6; - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) + if (cliprect.contains(x, y)) /* yellow bullets */ - *BITMAP_ADDR16(bitmap, y, x) = BULLETS_COLOR_BASE; + bitmap.pix16(y, x) = BULLETS_COLOR_BASE; } -static void darkplnt_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +static void darkplnt_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y) { galaxold_state *state = machine.driver_data(); if (state->m_flipscreen_x) x++; x = x - 6; - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) - *BITMAP_ADDR16(bitmap, y, x) = 32 + state->m_darkplnt_bullet_color; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = 32 + state->m_darkplnt_bullet_color; } -static void dambustr_draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int x, int y) +static void dambustr_draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int x, int y) { int i, color; @@ -1212,8 +1196,8 @@ x--; } - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) - *BITMAP_ADDR16(bitmap, y, x) = color; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = color; } } @@ -1221,30 +1205,30 @@ /* background drawing functions */ -static void galaxold_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void galaxold_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* plain black background */ - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } -static void scrambold_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void scrambold_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); if (state->m_background_enable) - bitmap_fill(bitmap,cliprect,BACKGROUND_COLOR_BASE); + bitmap.fill(BACKGROUND_COLOR_BASE, cliprect); else - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } -static void ad2083_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void ad2083_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); int color = (state->m_background_blue << 2) | (state->m_background_green << 1) | state->m_background_red; - bitmap_fill(bitmap,cliprect,BACKGROUND_COLOR_BASE + color); + bitmap.fill(BACKGROUND_COLOR_BASE + color, cliprect); } -static void stratgyx_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stratgyx_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); UINT8 x; @@ -1277,11 +1261,11 @@ else sx = 8 * x; - plot_box(bitmap, sx, 0, 8, 256, base + color); + bitmap.plot_box(sx, 0, 8, 256, base + color); } } -static void minefld_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void minefld_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); if (state->m_background_enable) @@ -1291,18 +1275,18 @@ for (x = 0; x < 128; x++) - plot_box(bitmap, x, 0, 1, 256, base + x); + bitmap.plot_box(x, 0, 1, 256, base + x); for (x = 0; x < 120; x++) - plot_box(bitmap, x + 128, 0, 1, 256, base + x + 128); + bitmap.plot_box(x + 128, 0, 1, 256, base + x + 128); - plot_box(bitmap, 248, 0, 16, 256, base); + bitmap.plot_box(248, 0, 16, 256, base); } else - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } -static void rescue_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void rescue_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); if (state->m_background_enable) @@ -1311,18 +1295,18 @@ int x; for (x = 0; x < 128; x++) - plot_box(bitmap, x, 0, 1, 256, base + x); + bitmap.plot_box(x, 0, 1, 256, base + x); for (x = 0; x < 120; x++) - plot_box(bitmap, x + 128, 0, 1, 256, base + x + 8); + bitmap.plot_box(x + 128, 0, 1, 256, base + x + 8); - plot_box(bitmap, 248, 0, 16, 256, base); + bitmap.plot_box(248, 0, 16, 256, base); } else - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } -static void mariner_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void mariner_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); int base = BACKGROUND_COLOR_BASE; @@ -1347,7 +1331,7 @@ else color = prom[0x20 + x - 1]; - plot_box(bitmap, 8 * (31 - x), 0, 8, 256, base + color); + bitmap.plot_box(8 * (31 - x), 0, 8, 256, base + color); } } else @@ -1361,12 +1345,12 @@ else color = prom[x + 1]; - plot_box(bitmap, 8 * x, 0, 8, 256, base + color); + bitmap.plot_box(8 * x, 0, 8, 256, base + color); } } } -static void dambustr_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void dambustr_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); int base = BACKGROUND_COLOR_BASE; @@ -1375,37 +1359,30 @@ if (flip_screen_x_get(machine)) { - plot_box(bitmap, 0, 0, 256-state->m_dambustr_bg_split_line, 256, col2); - plot_box(bitmap, 256-state->m_dambustr_bg_split_line, 0, state->m_dambustr_bg_split_line, 256, col1); + bitmap.plot_box( 0, 0, 256-state->m_dambustr_bg_split_line, 256, col2); + bitmap.plot_box(256-state->m_dambustr_bg_split_line, 0, state->m_dambustr_bg_split_line, 256, col1); } else { - plot_box(bitmap, 0, 0, 256-state->m_dambustr_bg_split_line, 256, col1); - plot_box(bitmap, 256-state->m_dambustr_bg_split_line, 0, state->m_dambustr_bg_split_line, 256, col2); + bitmap.plot_box( 0, 0, 256-state->m_dambustr_bg_split_line, 256, col1); + bitmap.plot_box(256-state->m_dambustr_bg_split_line, 0, state->m_dambustr_bg_split_line, 256, col2); } } -static void dambustr_draw_upper_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void dambustr_draw_upper_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); - rectangle clip; if (flip_screen_x_get(machine)) { - clip.min_x = 254 - state->m_dambustr_bg_split_line; - clip.max_x = state->m_dambustr_bg_split_line; - clip.min_y = 0; - clip.max_y = 255; - copybitmap(bitmap, state->m_dambustr_tmpbitmap, 0, 0, 0, 0, &clip); + rectangle clip(254 - state->m_dambustr_bg_split_line, state->m_dambustr_bg_split_line, 0, 255); + copybitmap(bitmap, *state->m_dambustr_tmpbitmap, 0, 0, 0, 0, clip); } else { - clip.min_x = 0; - clip.max_x = 254 - state->m_dambustr_bg_split_line; - clip.min_y = 0; - clip.max_y = 255; - copybitmap(bitmap, state->m_dambustr_tmpbitmap, 0, 0, 0, 0, &clip); + rectangle clip(0, 254 - state->m_dambustr_bg_split_line, 0, 255); + copybitmap(bitmap, *state->m_dambustr_tmpbitmap, 0, 0, 0, 0, clip); } } @@ -1486,7 +1463,7 @@ } } -static void plot_star(galaxold_state *state, bitmap_t *bitmap, int x, int y, int color, const rectangle *cliprect) +static void plot_star(galaxold_state *state, bitmap_ind16 &bitmap, int x, int y, int color, const rectangle &cliprect) { if (state->m_flipscreen_x) x = 255 - x; @@ -1494,15 +1471,15 @@ if (state->m_flipscreen_y) y = 255 - y; - if ((x >= cliprect->min_x) && (x <= cliprect->max_x) && (y >= cliprect->min_y) && (y <= cliprect->max_y)) - *BITMAP_ADDR16(bitmap, y, x) = state->m_stars_colors_start + color; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = state->m_stars_colors_start + color; } -static void noop_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void noop_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { } -void galaxold_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +void galaxold_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); struct star *stars = state->m_stars; @@ -1531,7 +1508,7 @@ } } -static void scrambold_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void scrambold_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); struct star *stars = state->m_stars; @@ -1577,7 +1554,7 @@ } } -static void rescue_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void rescue_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); struct star *stars = state->m_stars; @@ -1625,7 +1602,7 @@ } } -static void mariner_draw_stars(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void mariner_draw_stars(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); struct star *stars = state->m_stars; @@ -1724,7 +1701,7 @@ SET_TILE_INFO(2, code, 0, 0); } -static void draw_bullets_common(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bullets_common(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galaxold_state *state = machine.driver_data(); int offs; @@ -1744,8 +1721,11 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, UINT8 *spriteram, size_t spriteram_size) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, UINT8 *spriteram, size_t spriteram_size) { + const rectangle spritevisiblearea(2*8+1, 32*8-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflipx(0*8, 30*8-2, 2*8, 30*8-1); + galaxold_state *state = machine.driver_data(); int offs; @@ -1802,7 +1782,7 @@ if (offs < 3*4) sy++; - drawgfx_transpen(bitmap, state->m_flipscreen_x ? &spritevisibleareaflipx : &spritevisiblearea, machine.gfx[1], + drawgfx_transpen(bitmap, state->m_flipscreen_x ? spritevisibleareaflipx : spritevisiblearea, machine.gfx[1], code,color, flipx,flipy, sx,sy,0); @@ -1810,65 +1790,65 @@ } -SCREEN_UPDATE( galaxold ) +SCREEN_UPDATE_IND16( galaxold ) { - galaxold_state *state = screen->machine().driver_data(); + galaxold_state *state = screen.machine().driver_data(); - (*state->m_draw_background)(screen->machine(), bitmap, cliprect); + (*state->m_draw_background)(screen.machine(), bitmap, cliprect); if (state->m_stars_on) { - (*state->m_draw_stars)(screen->machine(), bitmap, cliprect); + (*state->m_draw_stars)(screen.machine(), bitmap, cliprect); } - tilemap_draw(bitmap, 0, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_draw_bullets) { - draw_bullets_common(screen->machine(), bitmap, cliprect); + draw_bullets_common(screen.machine(), bitmap, cliprect); } - draw_sprites(screen->machine(), bitmap, state->m_spriteram, state->m_spriteram_size); + draw_sprites(screen.machine(), bitmap, state->m_spriteram, state->m_spriteram_size); if (state->m_spriteram2_present) { - draw_sprites(screen->machine(), bitmap, state->m_spriteram2, state->m_spriteram2_size); + draw_sprites(screen.machine(), bitmap, state->m_spriteram2, state->m_spriteram2_size); } return 0; } -SCREEN_UPDATE( dambustr ) +SCREEN_UPDATE_IND16( dambustr ) { - galaxold_state *state = screen->machine().driver_data(); + galaxold_state *state = screen.machine().driver_data(); int i, j; UINT8 color; - (*state->m_draw_background)(screen->machine(), bitmap, cliprect); + (*state->m_draw_background)(screen.machine(), bitmap, cliprect); if (state->m_stars_on) { - (*state->m_draw_stars)(screen->machine(), bitmap, cliprect); + (*state->m_draw_stars)(screen.machine(), bitmap, cliprect); } /* save the background for drawing it again later, if background has priority over characters */ - copybitmap(state->m_dambustr_tmpbitmap, bitmap, 0, 0, 0, 0, NULL); + copybitmap(*state->m_dambustr_tmpbitmap, bitmap, 0, 0, 0, 0, state->m_dambustr_tmpbitmap->cliprect()); - tilemap_draw(bitmap, 0, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_draw_bullets) { - draw_bullets_common(screen->machine(), bitmap, cliprect); + draw_bullets_common(screen.machine(), bitmap, cliprect); } - draw_sprites(screen->machine(), bitmap, state->m_spriteram, state->m_spriteram_size); + draw_sprites(screen.machine(), bitmap, state->m_spriteram, state->m_spriteram_size); if (state->m_dambustr_bg_priority) { /* draw the upper part of the background, as it has priority */ - dambustr_draw_upper_background(screen->machine(), bitmap, cliprect); + dambustr_draw_upper_background(screen.machine(), bitmap, cliprect); /* only rows with color code > 3 are stronger than the background */ memset(state->m_dambustr_videoram2, 0x20, 0x0400); @@ -1879,8 +1859,8 @@ state->m_dambustr_videoram2[32*j+i] = state->m_videoram[32*j+i]; }; }; - tilemap_mark_all_tiles_dirty(state->m_dambustr_tilemap2); - tilemap_draw(bitmap, 0, state->m_dambustr_tilemap2, 0, 0); + state->m_dambustr_tilemap2->mark_all_dirty(); + state->m_dambustr_tilemap2->draw(bitmap, cliprect, 0, 0); }; return 0; diff -Nru mame-0.144/src/mame/video/galivan.c mame-0.145/src/mame/video/galivan.c --- mame-0.144/src/mame/video/galivan.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/galivan.c 2012-02-06 21:30:33.000000000 +0000 @@ -141,7 +141,7 @@ code, (attr & 0xe0) >> 5, /* not sure */ 0); - tileinfo->category = attr & 8 ? 0 : 1; /* seems correct */ + tileinfo.category = attr & 8 ? 0 : 1; /* seems correct */ } static TILE_GET_INFO( ninjemak_get_bg_tile_info ) @@ -187,7 +187,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 128, 128); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(15); } VIDEO_START( ninjemak ) @@ -197,7 +197,7 @@ state->m_bg_tilemap = tilemap_create(machine, ninjemak_get_bg_tile_info, tilemap_scan_cols, 16, 16, 512, 32); state->m_tx_tilemap = tilemap_create(machine, ninjemak_get_tx_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(15); } @@ -212,7 +212,7 @@ { galivan_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } /* Written through port 40 */ @@ -226,8 +226,8 @@ /* bit 2 flip screen */ state->m_flipscreen = data & 0x04; - tilemap_set_flip (state->m_bg_tilemap, state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip (state->m_tx_tilemap, state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tx_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); /* bit 7 selects one of two ROM banks for c000-dfff */ memory_set_bank(space->machine(), "bank1", (data & 0x80) >> 7); @@ -245,8 +245,8 @@ /* bit 2 flip screen */ state->m_flipscreen = data & 0x04; - tilemap_set_flip (state->m_bg_tilemap, state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip (state->m_tx_tilemap, state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tx_tilemap->set_flip(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); /* bit 3 unknown */ @@ -306,7 +306,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { galivan_state *state = machine.driver_data(); const UINT8 *spritepalettebank = machine.region("user1")->base(); @@ -345,47 +345,47 @@ } -SCREEN_UPDATE( galivan ) +SCREEN_UPDATE_IND16( galivan ) { - galivan_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_galivan_scrollx[0] + 256 * (state->m_galivan_scrollx[1] & 0x07)); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_galivan_scrolly[0] + 256 * (state->m_galivan_scrolly[1] & 0x07)); + galivan_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_galivan_scrollx[0] + 256 * (state->m_galivan_scrollx[1] & 0x07)); + state->m_bg_tilemap->set_scrolly(0, state->m_galivan_scrolly[0] + 256 * (state->m_galivan_scrolly[1] & 0x07)); if (state->m_layers & 0x40) - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); else - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_layers & 0x20) { - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); } else { - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 1, 0); } return 0; } -SCREEN_UPDATE( ninjemak ) +SCREEN_UPDATE_IND16( ninjemak ) { - galivan_state *state = screen->machine().driver_data(); + galivan_state *state = screen.machine().driver_data(); /* (scrollx[1] & 0x40) does something */ - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly); if (state->m_ninjemak_dispdisable) - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); else - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/galpani2.c mame-0.145/src/mame/video/galpani2.c --- mame-0.144/src/mame/video/galpani2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/galpani2.c 2012-02-06 21:30:32.000000000 +0000 @@ -66,7 +66,7 @@ pen = newword & 0xff; x = (offset % 512); /* 512 x 256 */ y = (offset / 512); - *BITMAP_ADDR16(state->m_bg8_bitmap[_n_], y, x) = 0x4000 + pen; + state->m_bg8_bitmap[_n_]->pix16(y, x) = 0x4000 + pen; } WRITE16_HANDLER( galpani2_bg8_0_w ) { galpani2_bg8_w(space, offset, data, mem_mask, 0); } @@ -100,7 +100,7 @@ int x = (offset % 256) + (offset / (256*256)) * 256 ; int y = (offset / 256) % 256; - *BITMAP_ADDR16(state->m_bg15_bitmap, y, x) = 0x4200 + (newword & 0x7fff); + state->m_bg15_bitmap->pix16(y, x) = 0x4200 + (newword & 0x7fff); } @@ -125,9 +125,9 @@ VIDEO_START( galpani2 ) { galpani2_state *state = machine.driver_data(); - state->m_bg15_bitmap = auto_bitmap_alloc(machine, 256*8, 256, BITMAP_FORMAT_INDEXED16); - state->m_bg8_bitmap[0] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); - state->m_bg8_bitmap[1] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); + state->m_bg15_bitmap = auto_bitmap_ind16_alloc(machine, 256*8, 256); + state->m_bg8_bitmap[0] = auto_bitmap_ind16_alloc(machine, 512, 256); + state->m_bg8_bitmap[1] = auto_bitmap_ind16_alloc(machine, 512, 256); VIDEO_START_CALL(kaneko16_sprites); } @@ -141,31 +141,31 @@ ***************************************************************************/ -SCREEN_UPDATE( galpani2 ) +SCREEN_UPDATE_IND16( galpani2 ) { - galpani2_state *state = screen->machine().driver_data(); + galpani2_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif - bitmap_fill(bitmap,cliprect,0); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill(0, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); if (layers_ctrl & 0x1) { int x = 0; int y = 0; - copyscrollbitmap_trans(bitmap, state->m_bg15_bitmap, + copyscrollbitmap_trans(bitmap, *state->m_bg15_bitmap, 1, &x, 1, &y, cliprect,0x4200 + 0); } @@ -180,7 +180,7 @@ { int x = - ( *state->m_bg8_scrollx[0] + 0x200 - 0x0f5 ); int y = - ( *state->m_bg8_scrolly[0] + 0x200 - 0x1be ); - copyscrollbitmap_trans(bitmap, state->m_bg8_bitmap[0], + copyscrollbitmap_trans(bitmap, *state->m_bg8_bitmap[0], 1, &x, 1, &y, cliprect,0x4000 + 0); } @@ -189,11 +189,11 @@ { int x = - ( *state->m_bg8_scrollx[1] + 0x200 - 0x0f5 ); int y = - ( *state->m_bg8_scrolly[1] + 0x200 - 0x1be ); - copyscrollbitmap_trans(bitmap, state->m_bg8_bitmap[1], + copyscrollbitmap_trans(bitmap, *state->m_bg8_bitmap[1], 1, &x, 1, &y, cliprect,0x4000 + 0); } - if (layers_ctrl & 0x8) kaneko16_draw_sprites(screen->machine(), bitmap, cliprect); + if (layers_ctrl & 0x8) kaneko16_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/galpanic.c mame-0.145/src/mame/video/galpanic.c --- mame-0.144/src/mame/video/galpanic.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/galpanic.c 2012-02-06 21:30:32.000000000 +0000 @@ -6,8 +6,8 @@ VIDEO_START( galpanic ) { galpanic_state *state = machine.driver_data(); - machine.generic.tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->m_sprites_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); } PALETTE_INIT( galpanic ) @@ -34,7 +34,7 @@ sy = offset / 256; sx = offset % 256; - *BITMAP_ADDR16(space->machine().generic.tmpbitmap, sy, sx) = 1024 + (data >> 1); + state->m_bitmap.pix16(sy, sx) = 1024 + (data >> 1); } WRITE16_HANDLER( galpanic_paletteram_w ) @@ -45,7 +45,7 @@ } -static void comad_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void comad_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galpanic_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -83,7 +83,7 @@ } } -static void draw_fgbitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_fgbitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { galpanic_state *state = machine.driver_data(); int offs; @@ -96,42 +96,43 @@ sy = offs / 256; color = state->m_fgvideoram[offs]; if (color) - *BITMAP_ADDR16(bitmap, sy, sx) = color; + bitmap.pix16(sy, sx) = color; } } -SCREEN_UPDATE( galpanic ) +SCREEN_UPDATE_IND16( galpanic ) { - device_t *pandora = screen->machine().device("pandora"); + galpanic_state *state = screen.machine().driver_data(); + device_t *pandora = screen.machine().device("pandora"); /* copy the temporary bitmap to the screen */ - copybitmap(bitmap,screen->machine().generic.tmpbitmap,0,0,0,0,cliprect); + copybitmap(bitmap,state->m_bitmap,0,0,0,0,cliprect); - draw_fgbitmap(screen->machine(), bitmap, cliprect); + draw_fgbitmap(screen.machine(), bitmap, cliprect); pandora_update(pandora, bitmap, cliprect); return 0; } -SCREEN_UPDATE( comad ) +SCREEN_UPDATE_IND16( comad ) { - galpanic_state *state = screen->machine().driver_data(); + galpanic_state *state = screen.machine().driver_data(); /* copy the temporary bitmap to the screen */ - copybitmap(bitmap,screen->machine().generic.tmpbitmap,0,0,0,0,cliprect); + copybitmap(bitmap,state->m_bitmap,0,0,0,0,cliprect); - draw_fgbitmap(screen->machine(), bitmap, cliprect); + draw_fgbitmap(screen.machine(), bitmap, cliprect); // if(galpanic_clear_sprites) { - bitmap_fill(state->m_sprites_bitmap,cliprect,0); - comad_draw_sprites(screen->machine(),bitmap,cliprect); + state->m_sprites_bitmap.fill(0, cliprect); + comad_draw_sprites(screen.machine(),bitmap,cliprect); } // else // { // /* keep sprites on the bitmap without clearing them */ -// comad_draw_sprites(screen->machine(),state->m_sprites_bitmap,0); +// comad_draw_sprites(screen.machine(),state->m_sprites_bitmap,0); // copybitmap_trans(bitmap,state->m_sprites_bitmap,0,0,0,0,cliprect,0); // } return 0; diff -Nru mame-0.144/src/mame/video/galspnbl.c mame-0.145/src/mame/video/galspnbl.c --- mame-0.144/src/mame/video/galspnbl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/galspnbl.c 2012-02-06 21:30:31.000000000 +0000 @@ -29,7 +29,7 @@ * 4 | xxxxxxxxxxxxxxxx | x position * 5,6,7| | unused */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { galspnbl_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -84,7 +84,7 @@ } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { galspnbl_state *state = machine.driver_data(); offs_t offs; @@ -96,19 +96,19 @@ int y = offs >> 9; int x = offs & 0x1ff; - *BITMAP_ADDR16(bitmap, y, x) = 1024 + (state->m_bgvideoram[offs] >> 1); + bitmap.pix16(y, x) = 1024 + (state->m_bgvideoram[offs] >> 1); } } -SCREEN_UPDATE( galspnbl ) +SCREEN_UPDATE_IND16( galspnbl ) { - galspnbl_state *state = screen->machine().driver_data(); + galspnbl_state *state = screen.machine().driver_data(); int offs; - draw_background(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); for (offs = 0; offs < 0x1000 / 2; offs++) { @@ -123,7 +123,7 @@ /* What is this? A priority/half transparency marker? */ if (!(attr & 0x0008)) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, 0,0, @@ -132,6 +132,6 @@ } } - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); return 0; } diff -Nru mame-0.144/src/mame/video/gameplan.c mame-0.145/src/mame/video/gameplan.c --- mame-0.144/src/mame/video/gameplan.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gameplan.c 2012-02-06 21:30:32.000000000 +0000 @@ -69,9 +69,9 @@ * *************************************/ -static SCREEN_UPDATE( gameplan ) +static SCREEN_UPDATE_RGB32( gameplan ) { - gameplan_state *state = screen->machine().driver_data(); + gameplan_state *state = screen.machine().driver_data(); pen_t pens[GAMEPLAN_NUM_PENS]; offs_t offs; @@ -82,16 +82,16 @@ UINT8 y = offs >> 8; UINT8 x = offs & 0xff; - *BITMAP_ADDR32(bitmap, y, x) = pens[state->m_videoram[offs] & 0x07]; + bitmap.pix32(y, x) = pens[state->m_videoram[offs] & 0x07]; } return 0; } -static SCREEN_UPDATE( leprechn ) +static SCREEN_UPDATE_RGB32( leprechn ) { - gameplan_state *state = screen->machine().driver_data(); + gameplan_state *state = screen.machine().driver_data(); pen_t pens[LEPRECHN_NUM_PENS]; offs_t offs; @@ -102,7 +102,7 @@ UINT8 y = offs >> 8; UINT8 x = offs & 0xff; - *BITMAP_ADDR32(bitmap, y, x) = pens[state->m_videoram[offs]]; + bitmap.pix32(y, x) = pens[state->m_videoram[offs]]; } return 0; @@ -344,21 +344,20 @@ MCFG_VIDEO_START(gameplan) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(GAMEPLAN_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(gameplan) + MCFG_SCREEN_UPDATE_STATIC(gameplan) MACHINE_CONFIG_END MACHINE_CONFIG_FRAGMENT( leprechn_video ) MCFG_VIDEO_START(leprechn) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(leprechn) + MCFG_SCREEN_UPDATE_STATIC(leprechn) MACHINE_CONFIG_END MACHINE_CONFIG_DERIVED( trvquest_video, gameplan_video ) MCFG_VIDEO_START(trvquest) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(gameplan) + MCFG_SCREEN_UPDATE_STATIC(gameplan) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/gaplus.c mame-0.145/src/mame/video/gaplus.c --- mame-0.144/src/mame/video/gaplus.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gaplus.c 2012-02-06 21:30:33.000000000 +0000 @@ -98,8 +98,8 @@ { gaplus_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[tile_index + 0x400]; - tileinfo->category = (attr & 0x40) >> 6; - tileinfo->group = attr & 0x3f; + tileinfo.category = (attr & 0x40) >> 6; + tileinfo.group = attr & 0x3f; SET_TILE_INFO( 0, state->m_videoram[tile_index] + ((attr & 0x80) << 1), @@ -207,7 +207,7 @@ { gaplus_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( gaplus_starfield_control_w ) @@ -225,7 +225,7 @@ ***************************************************************************/ -static void starfield_render(running_machine &machine, bitmap_t *bitmap) +static void starfield_render(running_machine &machine, bitmap_ind16 &bitmap) { gaplus_state *state = machine.driver_data(); struct star *stars = state->m_stars; @@ -248,12 +248,12 @@ if ( x >=0 && x < width && y >= 0 && y < height ) { - *BITMAP_ADDR16(bitmap, y, x) = stars[i].col; + bitmap.pix16(y, x) = stars[i].col; } } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gaplus_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram + 0x780; @@ -307,100 +307,104 @@ } } -SCREEN_UPDATE( gaplus ) +SCREEN_UPDATE_IND16( gaplus ) { - gaplus_state *state = screen->machine().driver_data(); + gaplus_state *state = screen.machine().driver_data(); /* flip screen control is embedded in RAM */ - flip_screen_set(screen->machine(), state->m_spriteram[0x1f7f-0x800] & 1); + flip_screen_set(screen.machine(), state->m_spriteram[0x1f7f-0x800] & 1); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - starfield_render(screen->machine(), bitmap); + starfield_render(screen.machine(), bitmap); /* draw the low priority characters */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); /* draw the high priority characters */ /* (I don't know if this feature is used by Gaplus, but it's shown in the schematics) */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,1,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1,0); return 0; } -SCREEN_EOF( gaplus ) /* update starfields */ +SCREEN_VBLANK( gaplus ) /* update starfields */ { - gaplus_state *state = machine.driver_data(); - struct star *stars = state->m_stars; - int i; - - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); - - /* check if we're running */ - if ( ( state->m_starfield_control[0] & 1 ) == 0 ) - return; - - /* update the starfields */ - for ( i = 0; i < state->m_total_stars; i++ ) { - switch( state->m_starfield_control[stars[i].set + 1] ) { - case 0x87: - /* stand still */ - break; - - case 0x86: - /* scroll down (speed 1) */ - stars[i].x += SPEED_1; - break; - - case 0x85: - /* scroll down (speed 2) */ - stars[i].x += SPEED_2; - break; - - case 0x06: - /* scroll down (speed 3) */ - stars[i].x += SPEED_3; - break; - - case 0x80: - /* scroll up (speed 1) */ - stars[i].x -= SPEED_1; - break; - - case 0x82: - /* scroll up (speed 2) */ - stars[i].x -= SPEED_2; - break; - - case 0x81: - /* scroll up (speed 3) */ - stars[i].x -= SPEED_3; - break; - - case 0x9f: - /* scroll left (speed 2) */ - stars[i].y += SPEED_2; - break; - - case 0xaf: - /* scroll left (speed 1) */ - stars[i].y += SPEED_1; - break; - } + // falling edge + if (!vblank_on) + { + gaplus_state *state = screen.machine().driver_data(); + struct star *stars = state->m_stars; + int i; + + int width = screen.machine().primary_screen->width(); + int height = screen.machine().primary_screen->height(); + + /* check if we're running */ + if ( ( state->m_starfield_control[0] & 1 ) == 0 ) + return; + + /* update the starfields */ + for ( i = 0; i < state->m_total_stars; i++ ) { + switch( state->m_starfield_control[stars[i].set + 1] ) { + case 0x87: + /* stand still */ + break; + + case 0x86: + /* scroll down (speed 1) */ + stars[i].x += SPEED_1; + break; + + case 0x85: + /* scroll down (speed 2) */ + stars[i].x += SPEED_2; + break; + + case 0x06: + /* scroll down (speed 3) */ + stars[i].x += SPEED_3; + break; + + case 0x80: + /* scroll up (speed 1) */ + stars[i].x -= SPEED_1; + break; + + case 0x82: + /* scroll up (speed 2) */ + stars[i].x -= SPEED_2; + break; + + case 0x81: + /* scroll up (speed 3) */ + stars[i].x -= SPEED_3; + break; + + case 0x9f: + /* scroll left (speed 2) */ + stars[i].y += SPEED_2; + break; + + case 0xaf: + /* scroll left (speed 1) */ + stars[i].y += SPEED_1; + break; + } - /* wrap */ - if ( stars[i].x < 0 ) - stars[i].x = ( float )( width*2 ) + stars[i].x; + /* wrap */ + if ( stars[i].x < 0 ) + stars[i].x = ( float )( width*2 ) + stars[i].x; - if ( stars[i].x >= ( float )( width*2 ) ) - stars[i].x -= ( float )( width*2 ); + if ( stars[i].x >= ( float )( width*2 ) ) + stars[i].x -= ( float )( width*2 ); - if ( stars[i].y < 0 ) - stars[i].y = ( float )( height ) + stars[i].y; + if ( stars[i].y < 0 ) + stars[i].y = ( float )( height ) + stars[i].y; - if ( stars[i].y >= ( float )( height ) ) - stars[i].y -= ( float )( height ); + if ( stars[i].y >= ( float )( height ) ) + stars[i].y -= ( float )( height ); + } } } diff -Nru mame-0.144/src/mame/video/gatron.c mame-0.145/src/mame/video/gatron.c --- mame-0.144/src/mame/video/gatron.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gatron.c 2012-02-06 21:30:33.000000000 +0000 @@ -26,7 +26,7 @@ gatron_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -51,10 +51,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 16, 48, 16); } -SCREEN_UPDATE( gat ) +SCREEN_UPDATE_IND16( gat ) { - gatron_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + gatron_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gauntlet.c mame-0.145/src/mame/video/gauntlet.c --- mame-0.144/src/mame/video/gauntlet.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gauntlet.c 2012-02-06 21:30:31.000000000 +0000 @@ -96,7 +96,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* modify the motion object code lookup table to account for the code XOR */ codelookup = atarimo_get_code_lookup(0, &size); @@ -131,7 +131,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* adjust the scrolls */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, *state->m_xscroll); + state->m_playfield_tilemap->set_scrollx(0, *state->m_xscroll); atarimo_set_xscroll(0, *state->m_xscroll & 0x1ff); } } @@ -159,11 +159,11 @@ if (state->m_playfield_tile_bank != (*state->m_yscroll & 3)) { state->m_playfield_tile_bank = *state->m_yscroll & 3; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } /* adjust the scrolls */ - tilemap_set_scrolly(state->m_playfield_tilemap, 0, *state->m_yscroll >> 7); + state->m_playfield_tilemap->set_scrolly(0, *state->m_yscroll >> 7); atarimo_set_yscroll(0, (*state->m_yscroll >> 7) & 0x1ff); } } @@ -176,23 +176,23 @@ * *************************************/ -SCREEN_UPDATE( gauntlet ) +SCREEN_UPDATE_IND16( gauntlet ) { - gauntlet_state *state = screen->machine().driver_data(); + gauntlet_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -215,6 +215,6 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gberet.c mame-0.145/src/mame/video/gberet.c --- mame-0.144/src/mame/video/gberet.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gberet.c 2012-02-06 21:30:33.000000000 +0000 @@ -81,14 +81,14 @@ { gberet_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gberet_colorram_w ) { gberet_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gberet_scroll_w ) @@ -99,7 +99,7 @@ state->m_scrollram[offset] = data; scroll = state->m_scrollram[offset & 0x1f] | (state->m_scrollram[offset | 0x20] << 8); - tilemap_set_scrollx(state->m_bg_tilemap, offset & 0x1f, scroll); + state->m_bg_tilemap->set_scrollx(offset & 0x1f, scroll); } WRITE8_HANDLER( gberet_sprite_bank_w ) @@ -116,8 +116,8 @@ int color = attr & 0x0f; int flags = TILE_FLIPYX((attr & 0x30) >> 4); - tileinfo->group = color; - tileinfo->category = (attr & 0x80) >> 7; + tileinfo.group = color; + tileinfo.category = (attr & 0x80) >> 7; SET_TILE_INFO(0, code, color, flags); } @@ -128,10 +128,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[0], 0x10); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void gberet_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void gberet_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gberet_state *state = machine.driver_data(); int offs; @@ -168,13 +168,13 @@ } } -SCREEN_UPDATE( gberet ) +SCREEN_UPDATE_IND16( gberet ) { - gberet_state *state = screen->machine().driver_data(); + gberet_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); - gberet_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); + gberet_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -189,10 +189,10 @@ scroll |= 0x100; for (offset = 6; offset < 29; offset++) - tilemap_set_scrollx(state->m_bg_tilemap, offset, scroll + 64 - 8); + state->m_bg_tilemap->set_scrollx(offset, scroll + 64 - 8); } -static void gberetb_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void gberetb_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gberet_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -224,11 +224,11 @@ } } -SCREEN_UPDATE( gberetb ) +SCREEN_UPDATE_IND16( gberetb ) { - gberet_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); - gberetb_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + gberet_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); + gberetb_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gbusters.c mame-0.145/src/mame/video/gbusters.c --- mame-0.144/src/mame/video/gbusters.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gbusters.c 2012-02-06 21:30:31.000000000 +0000 @@ -47,9 +47,9 @@ } -SCREEN_UPDATE( gbusters ) +SCREEN_UPDATE_IND16( gbusters ) { - gbusters_state *state = screen->machine().driver_data(); + gbusters_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); diff -Nru mame-0.144/src/mame/video/gcpinbal.c mame-0.145/src/mame/video/gcpinbal.c --- mame-0.144/src/mame/video/gcpinbal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gcpinbal.c 2012-02-06 21:30:31.000000000 +0000 @@ -53,17 +53,17 @@ state->m_tilemap[1] = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_rows,16,16,32,32); state->m_tilemap[2] = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,8,8,64,64); - tilemap_set_transparent_pen(state->m_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_tilemap[1], 0); - tilemap_set_transparent_pen(state->m_tilemap[2], 0); + state->m_tilemap[0]->set_transparent_pen(0); + state->m_tilemap[1]->set_transparent_pen(0); + state->m_tilemap[2]->set_transparent_pen(0); /* flipscreen n/a */ - tilemap_set_scrolldx(state->m_tilemap[0], -xoffs, 0); - tilemap_set_scrolldx(state->m_tilemap[1], -xoffs, 0); - tilemap_set_scrolldx(state->m_tilemap[2], -xoffs, 0); - tilemap_set_scrolldy(state->m_tilemap[0], -yoffs, 0); - tilemap_set_scrolldy(state->m_tilemap[1], -yoffs, 0); - tilemap_set_scrolldy(state->m_tilemap[2], -yoffs, 0); + state->m_tilemap[0]->set_scrolldx(-xoffs, 0); + state->m_tilemap[1]->set_scrolldx(-xoffs, 0); + state->m_tilemap[2]->set_scrolldx(-xoffs, 0); + state->m_tilemap[0]->set_scrolldy(-yoffs, 0); + state->m_tilemap[1]->set_scrolldy(-yoffs, 0); + state->m_tilemap[2]->set_scrolldy(-yoffs, 0); } VIDEO_START( gcpinbal ) @@ -88,11 +88,11 @@ COMBINE_DATA(&state->m_tilemapram[offset]); if (offset < 0x800) /* BG0 */ - tilemap_mark_tile_dirty(state->m_tilemap[0], offset / 2); + state->m_tilemap[0]->mark_tile_dirty(offset / 2); else if ((offset < 0x1000)) /* BG1 */ - tilemap_mark_tile_dirty(state->m_tilemap[1], (offset % 0x800) / 2); + state->m_tilemap[1]->mark_tile_dirty((offset % 0x800) / 2); else if ((offset < 0x1800)) /* FG */ - tilemap_mark_tile_dirty(state->m_tilemap[2], (offset % 0x800)); + state->m_tilemap[2]->mark_tile_dirty((offset % 0x800)); } @@ -169,7 +169,7 @@ ****************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { gcpinbal_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -248,27 +248,27 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( gcpinbal ) +SCREEN_UPDATE_IND16( gcpinbal ) { - gcpinbal_state *state = screen->machine().driver_data(); + gcpinbal_state *state = screen.machine().driver_data(); int i; UINT16 tile_sets = 0; UINT8 layer[3]; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed_once(KEYCODE_V)) + if (screen.machine().input().code_pressed_once(KEYCODE_V)) { state->m_dislayer[0] ^= 1; popmessage("bg0: %01x", state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once(KEYCODE_B)) + if (screen.machine().input().code_pressed_once(KEYCODE_B)) { state->m_dislayer[1] ^= 1; popmessage("bg1: %01x", state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once(KEYCODE_N)) + if (screen.machine().input().code_pressed_once(KEYCODE_N)) { state->m_dislayer[2] ^= 1; popmessage("fg: %01x", state->m_dislayer[2]); @@ -288,12 +288,12 @@ for (i = 0; i < 3; i++) { - tilemap_set_scrollx(state->m_tilemap[i], 0, state->m_scrollx[i]); - tilemap_set_scrolly(state->m_tilemap[i], 0, state->m_scrolly[i]); + state->m_tilemap[i]->set_scrollx(0, state->m_scrollx[i]); + state->m_tilemap[i]->set_scrolly(0, state->m_scrolly[i]); } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); layer[0] = 0; layer[1] = 1; @@ -303,20 +303,20 @@ #ifdef MAME_DEBUG if (state->m_dislayer[layer[0]] == 0) #endif - tilemap_draw(bitmap, cliprect, state->m_tilemap[layer[0]], TILEMAP_DRAW_OPAQUE, 1); + state->m_tilemap[layer[0]]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 1); #ifdef MAME_DEBUG if (state->m_dislayer[layer[1]] == 0) #endif - tilemap_draw(bitmap, cliprect, state->m_tilemap[layer[1]], 0, 2); + state->m_tilemap[layer[1]]->draw(bitmap, cliprect, 0, 2); #ifdef MAME_DEBUG if (state->m_dislayer[layer[2]] == 0) #endif - tilemap_draw(bitmap, cliprect, state->m_tilemap[layer[2]], 0, 4); + state->m_tilemap[layer[2]]->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 16); + draw_sprites(screen.machine(), bitmap, cliprect, 16); #if 0 { diff -Nru mame-0.144/src/mame/video/genesis.c mame-0.145/src/mame/video/genesis.c --- mame-0.144/src/mame/video/genesis.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/genesis.c 2012-02-06 21:30:32.000000000 +0000 @@ -119,7 +119,7 @@ ******************************************************************************/ -static void start_genesis_vdp(screen_device *screen) +static void start_genesis_vdp(screen_device &screen) { static const UINT8 vdp_init[24] = { @@ -129,12 +129,12 @@ }; int i; - genesis_screen = screen; + genesis_screen = &screen; /* allocate memory for the VDP, the lookup table, and the buffer bitmap */ - vdp_vram = auto_alloc_array(screen->machine(), UINT8, VRAM_SIZE); - vdp_vsram = auto_alloc_array(screen->machine(), UINT8, VSRAM_SIZE); - transparent_lookup = auto_alloc_array(screen->machine(), UINT16, 0x1000); + vdp_vram = auto_alloc_array(screen.machine(), UINT8, VRAM_SIZE); + vdp_vsram = auto_alloc_array(screen.machine(), UINT8, VSRAM_SIZE); + transparent_lookup = auto_alloc_array(screen.machine(), UINT16, 0x1000); /* clear the VDP memory, prevents corrupt tile in Puyo Puyo 2 */ memset(vdp_vram, 0, VRAM_SIZE); @@ -163,41 +163,41 @@ /* reset VDP */ for (i = 0; i < 24; i++) - vdp_register_w(screen->machine(), 0x8000 | (i << 8) | vdp_init[i], 1); + vdp_register_w(screen.machine(), 0x8000 | (i << 8) | vdp_init[i], 1); vdp_cmdpart = 0; vdp_code = 0; vdp_address = 0; /* Save State Stuff */ - state_save_register_global_array(screen->machine(), genesis_vdp_regs); - state_save_register_global_pointer(screen->machine(), vdp_vram, 0x10000); - state_save_register_global_pointer(screen->machine(), vdp_vsram, 0x80); - state_save_register_global_array(screen->machine(), genesis_bg_pal_lookup); - state_save_register_global_array(screen->machine(), genesis_sp_pal_lookup); - state_save_register_global(screen->machine(), display_enable); - state_save_register_global(screen->machine(), vdp_scrollabase); - state_save_register_global(screen->machine(), vdp_scrollbbase); - state_save_register_global(screen->machine(), vdp_windowbase); - state_save_register_global(screen->machine(), vdp_spritebase); - state_save_register_global(screen->machine(), vdp_hscrollbase); - state_save_register_global(screen->machine(), vdp_hscrollmask); - state_save_register_global(screen->machine(), vdp_hscrollsize); - state_save_register_global(screen->machine(), vdp_vscrollmode); - state_save_register_global(screen->machine(), vdp_cmdpart); - state_save_register_global(screen->machine(), vdp_code); - state_save_register_global(screen->machine(), vdp_address); - state_save_register_global(screen->machine(), vdp_dmafill); - state_save_register_global(screen->machine(), scrollheight); - state_save_register_global(screen->machine(), scrollwidth); - state_save_register_global(screen->machine(), bgcol); - state_save_register_global(screen->machine(), window_down); - state_save_register_global(screen->machine(), window_vpos); + state_save_register_global_array(screen.machine(), genesis_vdp_regs); + state_save_register_global_pointer(screen.machine(), vdp_vram, 0x10000); + state_save_register_global_pointer(screen.machine(), vdp_vsram, 0x80); + state_save_register_global_array(screen.machine(), genesis_bg_pal_lookup); + state_save_register_global_array(screen.machine(), genesis_sp_pal_lookup); + state_save_register_global(screen.machine(), display_enable); + state_save_register_global(screen.machine(), vdp_scrollabase); + state_save_register_global(screen.machine(), vdp_scrollbbase); + state_save_register_global(screen.machine(), vdp_windowbase); + state_save_register_global(screen.machine(), vdp_spritebase); + state_save_register_global(screen.machine(), vdp_hscrollbase); + state_save_register_global(screen.machine(), vdp_hscrollmask); + state_save_register_global(screen.machine(), vdp_hscrollsize); + state_save_register_global(screen.machine(), vdp_vscrollmode); + state_save_register_global(screen.machine(), vdp_cmdpart); + state_save_register_global(screen.machine(), vdp_code); + state_save_register_global(screen.machine(), vdp_address); + state_save_register_global(screen.machine(), vdp_dmafill); + state_save_register_global(screen.machine(), scrollheight); + state_save_register_global(screen.machine(), scrollwidth); + state_save_register_global(screen.machine(), bgcol); + state_save_register_global(screen.machine(), window_down); + state_save_register_global(screen.machine(), window_vpos); } void system18_vdp_start(running_machine &machine) { - start_genesis_vdp(machine.primary_screen); + start_genesis_vdp(*machine.primary_screen); genesis_palette_base = 0x1800; genesis_bg_pal_lookup[0] = genesis_sp_pal_lookup[0] = 0x1800; @@ -221,13 +221,13 @@ ******************************************************************************/ -void system18_vdp_update( bitmap_t *bitmap, const rectangle *cliprect ) +void system18_vdp_update( bitmap_ind16 &bitmap, const rectangle &cliprect ) { int y; /* generate the final screen */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - drawline(BITMAP_ADDR16(bitmap, y, 0), y, 0xffff); + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + drawline(&bitmap.pix16(y), y, 0xffff); } /****************************************************************************** diff -Nru mame-0.144/src/mame/video/gijoe.c mame-0.145/src/mame/video/gijoe.c --- mame-0.144/src/mame/video/gijoe.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gijoe.c 2012-02-06 21:30:32.000000000 +0000 @@ -75,9 +75,9 @@ state->save_item(NAME(state->m_layer_pri)); } -SCREEN_UPDATE( gijoe ) +SCREEN_UPDATE_IND16( gijoe ) { - gijoe_state *state = screen->machine().driver_data(); + gijoe_state *state = screen.machine().driver_data(); static const int K053251_CI[4] = { K053251_CI1, K053251_CI2, K053251_CI3, K053251_CI4 }; int layer[4]; int vrc_mode, vrc_new, colorbase_new, /*primode,*/ dirty, i; @@ -158,8 +158,8 @@ konami_sortlayers4(layer, state->m_layer_pri); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, layer[0], 0, 1); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, layer[1], 0, 2); diff -Nru mame-0.144/src/mame/video/ginganin.c mame-0.145/src/mame/video/ginganin.c --- mame-0.144/src/mame/video/ginganin.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ginganin.c 2012-02-06 21:30:31.000000000 +0000 @@ -107,7 +107,7 @@ { ginganin_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -132,7 +132,7 @@ { ginganin_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txtram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -143,8 +143,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 16, 16, FG_NX, FG_NY); state->m_tx_tilemap = tilemap_create(machine, get_txt_tile_info, tilemap_scan_rows, 8, 8, TXT_NX, TXT_NY); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); } @@ -157,16 +157,16 @@ switch (offset) { case 0: - tilemap_set_scrolly(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrolly(0, data); break; case 1: - tilemap_set_scrollx(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrollx(0, data); break; case 2: - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); break; case 3: - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); break; case 4: state->m_layers_ctrl = data; @@ -176,7 +176,7 @@ */ case 6: state->m_flipscreen = !(data & 1); - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); break; case 7: soundlatch_w(space, 0, data); @@ -209,7 +209,7 @@ ------------------------------------------------------------------------ */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { ginganin_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -245,50 +245,50 @@ } -SCREEN_UPDATE( ginganin ) +SCREEN_UPDATE_IND16( ginganin ) { - ginganin_state *state = screen->machine().driver_data(); + ginganin_state *state = screen.machine().driver_data(); int layers_ctrl1 = state->m_layers_ctrl; #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) { msk |= 0xfff1;} - if (screen->machine().input().code_pressed(KEYCODE_W)) { msk |= 0xfff2;} - if (screen->machine().input().code_pressed(KEYCODE_E)) { msk |= 0xfff4;} - if (screen->machine().input().code_pressed(KEYCODE_A)) { msk |= 0xfff8;} + if (screen.machine().input().code_pressed(KEYCODE_Q)) { msk |= 0xfff1;} + if (screen.machine().input().code_pressed(KEYCODE_W)) { msk |= 0xfff2;} + if (screen.machine().input().code_pressed(KEYCODE_E)) { msk |= 0xfff4;} + if (screen.machine().input().code_pressed(KEYCODE_A)) { msk |= 0xfff8;} if (msk != 0) layers_ctrl1 &= msk; #define SETSCROLL \ - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_posx); \ - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_posy); \ - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_posx); \ - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_posy); \ + state->m_bg_tilemap->set_scrollx(0, state->m_posx); \ + state->m_bg_tilemap->set_scrolly(0, state->m_posy); \ + state->m_fg_tilemap->set_scrollx(0, state->m_posx); \ + state->m_fg_tilemap->set_scrolly(0, state->m_posy); \ popmessage("B>%04X:%04X F>%04X:%04X",state->m_posx%(BG_NX*16),state->m_posy%(BG_NY*16),state->m_posx%(FG_NX*16),state->m_posy%(FG_NY*16)); - if (screen->machine().input().code_pressed(KEYCODE_L)) { state->m_posx +=8; SETSCROLL } - if (screen->machine().input().code_pressed(KEYCODE_J)) { state->m_posx -=8; SETSCROLL } - if (screen->machine().input().code_pressed(KEYCODE_K)) { state->m_posy +=8; SETSCROLL } - if (screen->machine().input().code_pressed(KEYCODE_I)) { state->m_posy -=8; SETSCROLL } - if (screen->machine().input().code_pressed(KEYCODE_H)) { state->m_posx = state->m_posy = 0; SETSCROLL } + if (screen.machine().input().code_pressed(KEYCODE_L)) { state->m_posx +=8; SETSCROLL } + if (screen.machine().input().code_pressed(KEYCODE_J)) { state->m_posx -=8; SETSCROLL } + if (screen.machine().input().code_pressed(KEYCODE_K)) { state->m_posy +=8; SETSCROLL } + if (screen.machine().input().code_pressed(KEYCODE_I)) { state->m_posy -=8; SETSCROLL } + if (screen.machine().input().code_pressed(KEYCODE_H)) { state->m_posx = state->m_posy = 0; SETSCROLL } } #endif if (layers_ctrl1 & 1) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (layers_ctrl1 & 2) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); if (layers_ctrl1 & 8) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (layers_ctrl1 & 4) - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gladiatr.c mame-0.145/src/mame/video/gladiatr.c --- mame-0.144/src/mame/video/gladiatr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gladiatr.c 2012-02-06 21:30:32.000000000 +0000 @@ -50,9 +50,9 @@ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows,8,8,32,64); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info,tilemap_scan_rows,8,8,32,64); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scroll_cols(state->m_bg_tilemap, 0x10); + state->m_bg_tilemap->set_scroll_cols(0x10); state->m_sprite_bank = 1; } @@ -63,10 +63,10 @@ state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows,8,8,64,32); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, -0x30, 0x12f); - tilemap_set_scrolldx(state->m_fg_tilemap, -0x30, 0x12f); + state->m_bg_tilemap->set_scrolldx(-0x30, 0x12f); + state->m_fg_tilemap->set_scrolldx(-0x30, 0x12f); state->m_sprite_bank = 2; } @@ -83,21 +83,21 @@ { gladiatr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gladiatr_colorram_w ) { gladiatr_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gladiatr_textram_w ) { gladiatr_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gladiatr_paletteram_w ) @@ -138,7 +138,7 @@ switch (offset & 0x300) { case 0x000: - tilemap_set_scrolly(state->m_bg_tilemap, offset & 0x0f, 0x100-data); + state->m_bg_tilemap->set_scrolly(offset & 0x0f, 0x100-data); break; case 0x200: if (data & 0x80) @@ -150,7 +150,7 @@ if (state->m_fg_tile_bank != (data & 0x03)) { state->m_fg_tile_bank = data & 0x03; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } state->m_video_attributes = data; break; @@ -171,12 +171,12 @@ if (state->m_fg_tile_bank != (data & 0x03)) { state->m_fg_tile_bank = data & 0x03; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } if (state->m_bg_tile_bank != ((data & 0x10) >> 4)) { state->m_bg_tile_bank = (data & 0x10) >> 4; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_video_attributes = data; break; @@ -200,7 +200,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { gladiatr_state *state = machine.driver_data(); int offs; @@ -251,30 +251,29 @@ -SCREEN_UPDATE( ppking ) +SCREEN_UPDATE_IND16( ppking ) { - gladiatr_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + gladiatr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); /* the fg layer just selects the upper palette bank on underlying pixels */ { - bitmap_t *flagsbitmap; - int sx = cliprect->min_x; - int sy = cliprect->min_y; + int sx = cliprect.min_x; + int sy = cliprect.min_y; - tilemap_get_pixmap( state->m_fg_tilemap ); - flagsbitmap = tilemap_get_flagsmap( state->m_fg_tilemap ); + state->m_fg_tilemap ->pixmap(); + bitmap_ind8 &flagsbitmap = state->m_fg_tilemap ->flagsmap(); - while( sy <= cliprect->max_y ) + while( sy <= cliprect.max_y ) { int x = sx; int y = (sy + state->m_fg_scrolly) & 0x1ff; - UINT16 *dest = BITMAP_ADDR16(bitmap, sy, sx); - while( x <= cliprect->max_x ) + UINT16 *dest = &bitmap.pix16(sy, sx); + while( x <= cliprect.max_x ) { - if( *BITMAP_ADDR8(flagsbitmap, y, x)&TILEMAP_PIXEL_LAYER0 ) + if( flagsbitmap.pix8(y, x)&TILEMAP_PIXEL_LAYER0 ) { *dest += 512; } @@ -287,27 +286,27 @@ return 0; } -SCREEN_UPDATE( gladiatr ) +SCREEN_UPDATE_IND16( gladiatr ) { - gladiatr_state *state = screen->machine().driver_data(); + gladiatr_state *state = screen.machine().driver_data(); if (state->m_video_attributes & 0x20) { int scroll; scroll = state->m_bg_scrollx + ((state->m_video_attributes & 0x04) << 6); - tilemap_set_scrollx(state->m_bg_tilemap, 0, scroll ^ (flip_screen_get(screen->machine()) ? 0x0f : 0)); + state->m_bg_tilemap->set_scrollx(0, scroll ^ (flip_screen_get(screen.machine()) ? 0x0f : 0)); scroll = state->m_fg_scrollx + ((state->m_video_attributes & 0x08) << 5); - tilemap_set_scrollx(state->m_fg_tilemap, 0, scroll ^ (flip_screen_get(screen->machine()) ? 0x0f : 0)); + state->m_fg_tilemap->set_scrollx(0, scroll ^ (flip_screen_get(screen.machine()) ? 0x0f : 0)); // always 0 anyway - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fg_scrolly); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); + state->m_fg_tilemap->set_scrolly(0, state->m_fg_scrolly); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); } else - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); return 0; } diff -Nru mame-0.144/src/mame/video/glass.c mame-0.145/src/mame/video/glass.c --- mame-0.144/src/mame/video/glass.c 2012-01-13 15:35:01.000000000 +0000 +++ mame-0.145/src/mame/video/glass.c 2012-02-06 21:30:32.000000000 +0000 @@ -97,12 +97,12 @@ { int color = *gfx; gfx++; - *BITMAP_ADDR16(state->m_screen_bitmap, j, i) = color & 0xff; + state->m_screen_bitmap->pix16(j, i) = color & 0xff; } } } else - bitmap_fill(state->m_screen_bitmap, 0, 0); + state->m_screen_bitmap->fill(0); } } } @@ -117,7 +117,7 @@ { glass_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_pant[offset >> 11], ((offset << 1) & 0x0fff) >> 2); + state->m_pant[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); } @@ -132,12 +132,12 @@ glass_state *state = machine.driver_data(); state->m_pant[0] = tilemap_create(machine, get_tile_info_glass_screen0, tilemap_scan_rows, 16, 16, 32, 32); state->m_pant[1] = tilemap_create(machine, get_tile_info_glass_screen1, tilemap_scan_rows, 16, 16, 32, 32); - state->m_screen_bitmap = auto_bitmap_alloc (machine, 320, 200, machine.primary_screen->format()); + state->m_screen_bitmap = auto_bitmap_ind16_alloc (machine, 320, 200); state->save_item(NAME(*state->m_screen_bitmap)); - tilemap_set_transparent_pen(state->m_pant[0], 0); - tilemap_set_transparent_pen(state->m_pant[1], 0); + state->m_pant[0]->set_transparent_pen(0); + state->m_pant[1]->set_transparent_pen(0); } @@ -164,7 +164,7 @@ 3 | xxxxxxxx xxxxxxxx | sprite code */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { glass_state *state = machine.driver_data(); int i; @@ -195,20 +195,20 @@ ****************************************************************************/ -SCREEN_UPDATE( glass ) +SCREEN_UPDATE_IND16( glass ) { - glass_state *state = screen->machine().driver_data(); + glass_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_pant[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_pant[0], 0, state->m_vregs[1] + 0x04); - tilemap_set_scrolly(state->m_pant[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_pant[1], 0, state->m_vregs[3]); + state->m_pant[0]->set_scrolly(0, state->m_vregs[0]); + state->m_pant[0]->set_scrollx(0, state->m_vregs[1] + 0x04); + state->m_pant[1]->set_scrolly(0, state->m_vregs[2]); + state->m_pant[1]->set_scrollx(0, state->m_vregs[3]); /* draw layers + sprites */ - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - copybitmap(bitmap, state->m_screen_bitmap, 0, 0, 0x18, 0x24, cliprect); - tilemap_draw(bitmap, cliprect, state->m_pant[1], 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pant[0], 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + copybitmap(bitmap, *state->m_screen_bitmap, 0, 0, 0x18, 0x24, cliprect); + state->m_pant[1]->draw(bitmap, cliprect, 0, 0); + state->m_pant[0]->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/gng.c mame-0.145/src/mame/video/gng.c --- mame-0.144/src/mame/video/gng.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gng.c 2012-02-06 21:30:31.000000000 +0000 @@ -36,7 +36,7 @@ state->m_bgvideoram[tile_index] + ((attr & 0xc0) << 2), attr & 0x07, TILE_FLIPYX((attr & 0x30) >> 4)); - tileinfo->group = (attr & 0x08) >> 3; + tileinfo.group = (attr & 0x08) >> 3; } @@ -53,9 +53,9 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x41, 0xbe); /* split type 1 has pens 0 and 6 transparent in front half */ + state->m_fg_tilemap->set_transparent_pen(3); + state->m_bg_tilemap->set_transmask(0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x41, 0xbe); /* split type 1 has pens 0 and 6 transparent in front half */ } @@ -69,14 +69,14 @@ { gng_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( gng_bgvideoram_w ) { gng_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -84,14 +84,14 @@ { gng_state *state = space->machine().driver_data(); state->m_scrollx[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); } WRITE8_HANDLER( gng_bgscrolly_w ) { gng_state *state = space->machine().driver_data(); state->m_scrolly[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly[0] + 256 * state->m_scrolly[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly[0] + 256 * state->m_scrolly[1]); } @@ -108,7 +108,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; const gfx_element *gfx = machine.gfx[2]; @@ -139,20 +139,24 @@ } } -SCREEN_UPDATE( gng ) +SCREEN_UPDATE_IND16( gng ) { - gng_state *state = screen->machine().driver_data(); + gng_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( gng ) +SCREEN_VBLANK( gng ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/goal92.c mame-0.145/src/mame/video/goal92.c --- mame-0.144/src/mame/video/goal92.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/goal92.c 2012-02-06 21:30:32.000000000 +0000 @@ -20,7 +20,7 @@ if (ACCESSING_BITS_0_7) { - tilemap_mark_all_tiles_dirty(state->m_fg_layer); + state->m_fg_layer->mark_all_dirty(); } } @@ -28,21 +28,21 @@ { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_data[offset]); - tilemap_mark_tile_dirty(state->m_tx_layer, offset); + state->m_tx_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( goal92_background_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_data[offset]); - tilemap_mark_tile_dirty(state->m_bg_layer, offset); + state->m_bg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( goal92_foreground_w ) { goal92_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_data[offset]); - tilemap_mark_tile_dirty(state->m_fg_layer, offset); + state->m_fg_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_text_tile_info ) @@ -92,7 +92,7 @@ SET_TILE_INFO(region, tile, color, 0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { goal92_state *state = machine.driver_data(); UINT16 *buffered_spriteram16 = state->m_buffered_spriteram; @@ -147,49 +147,53 @@ state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, 0x400 * 2); state_save_register_global_pointer(machine, state->m_buffered_spriteram, 0x400 * 2); - tilemap_set_transparent_pen(state->m_bg_layer, 15); - tilemap_set_transparent_pen(state->m_fg_layer, 15); - tilemap_set_transparent_pen(state->m_tx_layer, 15); + state->m_bg_layer->set_transparent_pen(15); + state->m_fg_layer->set_transparent_pen(15); + state->m_tx_layer->set_transparent_pen(15); } -SCREEN_UPDATE( goal92 ) +SCREEN_UPDATE_IND16( goal92 ) { - goal92_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_layer, 0, state->m_scrollram[0] + 60); - tilemap_set_scrolly(state->m_bg_layer, 0, state->m_scrollram[1] + 8); + goal92_state *state = screen.machine().driver_data(); + state->m_bg_layer->set_scrollx(0, state->m_scrollram[0] + 60); + state->m_bg_layer->set_scrolly(0, state->m_scrollram[1] + 8); if (state->m_fg_bank & 0xff) { - tilemap_set_scrollx(state->m_fg_layer, 0, state->m_scrollram[0] + 60); - tilemap_set_scrolly(state->m_fg_layer, 0, state->m_scrollram[1] + 8); + state->m_fg_layer->set_scrollx(0, state->m_scrollram[0] + 60); + state->m_fg_layer->set_scrolly(0, state->m_scrollram[1] + 8); } else { - tilemap_set_scrollx(state->m_fg_layer, 0, state->m_scrollram[2] + 60); - tilemap_set_scrolly(state->m_fg_layer, 0, state->m_scrollram[3] + 8); + state->m_fg_layer->set_scrollx(0, state->m_scrollram[2] + 60); + state->m_fg_layer->set_scrolly(0, state->m_scrollram[3] + 8); } - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_layer, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 2); + state->m_bg_layer->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 2); if (!(state->m_fg_bank & 0xff)) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_layer, 0, 0); + state->m_fg_layer->draw(bitmap, cliprect, 0, 0); if(state->m_fg_bank & 0xff) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - tilemap_draw(bitmap, cliprect, state->m_tx_layer, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + state->m_tx_layer->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( goal92 ) +SCREEN_VBLANK( goal92 ) { - goal92_state *state = machine.driver_data(); - memcpy(state->m_buffered_spriteram, state->m_spriteram, 0x400 * 2); + // rising edge + if (vblank_on) + { + goal92_state *state = screen.machine().driver_data(); + memcpy(state->m_buffered_spriteram, state->m_spriteram, 0x400 * 2); + } } diff -Nru mame-0.144/src/mame/video/goindol.c mame-0.145/src/mame/video/goindol.c --- mame-0.144/src/mame/video/goindol.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/goindol.c 2012-02-06 21:30:33.000000000 +0000 @@ -53,7 +53,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -67,14 +67,14 @@ { goindol_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( goindol_bg_videoram_w ) { goindol_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -85,7 +85,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int gfxbank, UINT8 *sprite_ram ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int gfxbank, UINT8 *sprite_ram ) { goindol_state *state = machine.driver_data(); int offs, sx, sy, tile, palette; @@ -123,15 +123,15 @@ } } -SCREEN_UPDATE( goindol ) +SCREEN_UPDATE_IND16( goindol ) { - goindol_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_fg_tilemap, 0, *state->m_fg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, *state->m_fg_scrolly); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1, state->m_spriteram); - draw_sprites(screen->machine(), bitmap, cliprect, 0, state->m_spriteram2); + goindol_state *state = screen.machine().driver_data(); + state->m_fg_tilemap->set_scrollx(0, *state->m_fg_scrollx); + state->m_fg_tilemap->set_scrolly(0, *state->m_fg_scrolly); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1, state->m_spriteram); + draw_sprites(screen.machine(), bitmap, cliprect, 0, state->m_spriteram2); return 0; } diff -Nru mame-0.144/src/mame/video/goldstar.c mame-0.145/src/mame/video/goldstar.c --- mame-0.144/src/mame/video/goldstar.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/goldstar.c 2012-02-06 21:30:31.000000000 +0000 @@ -55,7 +55,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_fg_vidram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( goldstar_fg_atrram_w ) @@ -63,7 +63,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_fg_atrram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_goldstar_fg_tile_info ) @@ -114,7 +114,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_reel1_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_goldstar_reel1_tile_info ) @@ -134,7 +134,7 @@ { goldstar_state *state = space->machine().driver_data(); state->m_reel2_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_goldstar_reel2_tile_info ) @@ -154,7 +154,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_reel3_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_goldstar_reel3_tile_info ) @@ -174,7 +174,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_reel1_attrram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel1_tilemap,offset); + state->m_reel1_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( unkch_reel2_attrram_w ) @@ -182,7 +182,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_reel2_attrram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel2_tilemap,offset); + state->m_reel2_tilemap->mark_tile_dirty(offset); } @@ -191,7 +191,7 @@ goldstar_state *state = space->machine().driver_data(); state->m_reel3_attrram[offset] = data; - tilemap_mark_tile_dirty(state->m_reel3_tilemap,offset); + state->m_reel3_tilemap->mark_tile_dirty(offset); } @@ -245,12 +245,12 @@ state->m_reel2_tilemap = tilemap_create(machine,get_goldstar_reel2_tile_info,tilemap_scan_rows,8,32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_goldstar_reel3_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); state->m_fg_tilemap = tilemap_create(machine,get_goldstar_fg_tile_info,tilemap_scan_rows,8,8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? state->m_cm_enable_reg = 0x0b; @@ -262,10 +262,10 @@ state->m_reel1_tilemap = tilemap_create(machine,get_goldstar_reel1_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); state->m_fg_tilemap = tilemap_create(machine,get_goldstar_fg_tile_info,tilemap_scan_rows,8,8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? state->m_cm_enable_reg = 0x0b; @@ -279,12 +279,12 @@ state->m_reel2_tilemap = tilemap_create(machine,get_goldstar_reel2_tile_info,tilemap_scan_rows,8,32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_goldstar_reel3_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 32); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 32); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 32); + state->m_reel1_tilemap->set_scroll_cols(32); + state->m_reel2_tilemap->set_scroll_cols(32); + state->m_reel3_tilemap->set_scroll_cols(32); state->m_fg_tilemap = tilemap_create(machine,get_magical_fg_tile_info,tilemap_scan_rows,8,8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); // is there an enable reg for this game? state->m_cm_enable_reg = 0x0b; @@ -298,16 +298,16 @@ state->m_reel2_tilemap = tilemap_create(machine,get_unkch_reel2_tile_info,tilemap_scan_rows,8,32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_unkch_reel3_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 32); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 32); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 32); + state->m_reel1_tilemap->set_scroll_cols(32); + state->m_reel2_tilemap->set_scroll_cols(32); + state->m_reel3_tilemap->set_scroll_cols(32); state->m_cmaster_girl_num = 0; state->m_cmaster_girl_pal = 0; state->m_unkch_vidreg = 0x00; state->m_fg_tilemap = tilemap_create(machine,get_cherrym_fg_tile_info,tilemap_scan_rows,8,8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_cm_enable_reg = 0x0b; } @@ -320,15 +320,15 @@ state->m_reel2_tilemap = tilemap_create(machine,get_goldstar_reel2_tile_info,tilemap_scan_rows,8,32, 64, 8); state->m_reel3_tilemap = tilemap_create(machine,get_goldstar_reel3_tile_info,tilemap_scan_rows,8,32, 64, 8); - tilemap_set_scroll_cols(state->m_reel1_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel2_tilemap, 64); - tilemap_set_scroll_cols(state->m_reel3_tilemap, 64); + state->m_reel1_tilemap->set_scroll_cols(64); + state->m_reel2_tilemap->set_scroll_cols(64); + state->m_reel3_tilemap->set_scroll_cols(64); state->m_cmaster_girl_num = 0; state->m_cmaster_girl_pal = 0; state->m_fg_tilemap = tilemap_create(machine,get_cherrym_fg_tile_info,tilemap_scan_rows,8,8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_cm_enable_reg = 0x0b; } @@ -343,9 +343,9 @@ /* bit 2 selects background gfx color (I think) */ state->m_bgcolor = (data & 0x04) >> 2; - tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap); + state->m_reel1_tilemap->mark_all_dirty(); + state->m_reel2_tilemap->mark_all_dirty(); + state->m_reel3_tilemap->mark_all_dirty(); } WRITE8_HANDLER( cm_background_col_w ) @@ -381,44 +381,19 @@ state->m_bgcolor = (data & 0x03) >> 0; #endif - tilemap_mark_all_tiles_dirty (state->m_reel1_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel2_tilemap); - tilemap_mark_all_tiles_dirty (state->m_reel3_tilemap); + state->m_reel1_tilemap->mark_all_dirty(); + state->m_reel2_tilemap->mark_all_dirty(); + state->m_reel3_tilemap->mark_all_dirty(); } -// are these hardcoded, or registers? -static const rectangle visible1 = { 0*8, (14+48)*8-1, 4*8, (4+7)*8-1 }; -static const rectangle visible2 = { 0*8, (14+48)*8-1, 12*8, (12+7)*8-1 }; -static const rectangle visible3 = { 0*8, (14+48)*8-1, 20*8, (20+7)*8-1 }; -static const rectangle cm91_visible1 = { 0*8, (14+48)*8-1, 4*8, (4+7)*8-1 }; /* same start for reel1 */ -static const rectangle cm91_visible2 = { 0*8, (14+48)*8-1, 11*8, (12+7)*8-1 }; /* 4 pixels less for reel2 */ -static const rectangle cm91_visible3 = { 0*8, (14+48)*8-1, 19*8, (19+7)*8-1 }; /* 8 pixels less for reel3 */ -static const rectangle am1a_visible1 = { 0*8, (14+48)*8-1, 4*8, (4+6)*8-1 }; -static const rectangle am1a_visible2 = { 0*8, (14+48)*8-1, 10*8, (10+6)*8-1 }; -static const rectangle am1a_visible3 = { 0*8, (14+48)*8-1, 16*8, (16+6)*8-1 }; - -static const rectangle unkch_visible1 = { 0*8, (14+48)*8-1, 3*8, (3+7)*8-1 }; -static const rectangle unkch_visible2 = { 0*8, (14+48)*8-1, 10*8, (10+7)*8-1 }; -static const rectangle unkch_visible3 = { 0*8, (14+48)*8-1, 17*8, (17+7)*8-1 }; - -static const rectangle magical_visible1 = { 0*8, (14+48)*8-1, 4*8, (4+8)*8-1 }; -static const rectangle magical_visible2 = { 0*8, (14+48)*8-1, 12*8, (12+8)*8-1 }; -static const rectangle magical_visible3 = { 0*8, (14+48)*8-1, 20*8, (20+8)*8-1 }; - -static const rectangle magical_visible1alt = { 0*8, (16+48)*8-1, 4*8, 16*8-1 }; -static const rectangle magical_visible2alt = { 0*8, (16+48)*8-1, 16*8, 28*8-1 }; - -static const rectangle bingowng_visible1 = { 0*8, (14+48)*8-1, 3*8, (4+7)*8-1 }; - - -SCREEN_UPDATE( goldstar ) +SCREEN_UPDATE_IND16( goldstar ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -427,22 +402,27 @@ { for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); } - tilemap_draw(bitmap, &visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &visible3, state->m_reel3_tilemap, 0, 0); + // are these hardcoded, or registers? + const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 12*8, (12+7)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 20*8, (20+7)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } if (state->m_cm_enable_reg &0x04) { - if (screen->machine().region("user1")->base()) + if (screen.machine().region("user1")->base()) { - const gfx_element *gfx = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[2]; int girlyscroll = (INT8)((state->m_cm_girl_scroll & 0xf0)); int girlxscroll = (INT8)((state->m_cm_girl_scroll & 0x0f)<<4); @@ -452,19 +432,19 @@ if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( bingowng ) +SCREEN_UPDATE_IND16( bingowng ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -473,18 +453,19 @@ { for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); } - tilemap_draw(bitmap, &bingowng_visible1, state->m_reel1_tilemap, 0, 0); + const rectangle visible1(0*8, (14+48)*8-1, 3*8, (4+7)*8-1); + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); } if (state->m_cm_enable_reg &0x04) { - if (screen->machine().region("user1")->base()) + if (screen.machine().region("user1")->base()) { - const gfx_element *gfx = screen->machine().gfx[2]; + const gfx_element *gfx = screen.machine().gfx[2]; int girlyscroll = (INT8)((state->m_cm_girl_scroll & 0xf0)); int girlxscroll = (INT8)((state->m_cm_girl_scroll & 0x0f)<<4); @@ -494,19 +475,19 @@ if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( magical ) +SCREEN_UPDATE_IND16( magical ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -518,47 +499,54 @@ { for (i= 0;i < 32;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i*2]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i*2]); - // tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i*2]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i*2]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i*2]); + // state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i*2]); } - tilemap_draw(bitmap, &magical_visible1alt, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &magical_visible2alt, state->m_reel2_tilemap, 0, 0); - //tilemap_draw(bitmap, &magical_visible3, state->m_reel3_tilemap, 0, 0); + const rectangle visible1alt(0*8, (16+48)*8-1, 4*8, 16*8-1); + const rectangle visible2alt(0*8, (16+48)*8-1, 16*8, 28*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1alt, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2alt, 0, 0); + //state->m_reel3_tilemap->draw(bitmap, &magical_visible3, 0, 0); } else { for (i= 0;i < 32;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i*2]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i*2]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i*2]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i*2]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i*2]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i*2]); } - tilemap_draw(bitmap, &magical_visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &magical_visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &magical_visible3, state->m_reel3_tilemap, 0, 0); + const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+8)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 12*8, (12+8)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 20*8, (20+8)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } } if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( unkch ) +SCREEN_UPDATE_IND16( unkch ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -571,12 +559,12 @@ { for (i= 0;i < 32;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, -0x08/*state->m_reel1_scroll[(i*2)+1]*/); - // tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[(i*2)+1]); - // tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[(i*2)+1]); + state->m_reel1_tilemap->set_scrolly(i, -0x08/*state->m_reel1_scroll[(i*2)+1]*/); + // state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[(i*2)+1]); + // state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[(i*2)+1]); } - tilemap_draw(bitmap, cliprect, state->m_reel1_tilemap, 0, 0); + state->m_reel1_tilemap->draw(bitmap, cliprect, 0, 0); } // or draw the reels normally? @@ -584,31 +572,35 @@ { for (i= 0;i < 32;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i*2]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i*2]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i*2]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i*2]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i*2]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i*2]); } - tilemap_draw(bitmap, &unkch_visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &unkch_visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &unkch_visible3, state->m_reel3_tilemap, 0, 0); + const rectangle visible1(0*8, (14+48)*8-1, 3*8, (3+7)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 10*8, (10+7)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 17*8, (17+7)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } } if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( cmast91 ) +SCREEN_UPDATE_IND16( cmast91 ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -617,30 +609,34 @@ { for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); } - tilemap_draw(bitmap, &cm91_visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &cm91_visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &cm91_visible3, state->m_reel3_tilemap, 0, 0); + const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+7)*8-1); /* same start for reel1 */ + const rectangle visible2(0*8, (14+48)*8-1, 11*8, (12+7)*8-1); /* 4 pixels less for reel2 */ + const rectangle visible3(0*8, (14+48)*8-1, 19*8, (19+7)*8-1); /* 8 pixels less for reel3 */ + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; } -SCREEN_UPDATE( amcoe1a ) +SCREEN_UPDATE_IND16( amcoe1a ) { - goldstar_state *state = screen->machine().driver_data(); + goldstar_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!state->m_cm_enable_reg &0x01) return 0; @@ -649,14 +645,18 @@ { for (i= 0;i < 64;i++) { - tilemap_set_scrolly(state->m_reel1_tilemap, i, state->m_reel1_scroll[i]); - tilemap_set_scrolly(state->m_reel2_tilemap, i, state->m_reel2_scroll[i]); - tilemap_set_scrolly(state->m_reel3_tilemap, i, state->m_reel3_scroll[i]); + state->m_reel1_tilemap->set_scrolly(i, state->m_reel1_scroll[i]); + state->m_reel2_tilemap->set_scrolly(i, state->m_reel2_scroll[i]); + state->m_reel3_tilemap->set_scrolly(i, state->m_reel3_scroll[i]); } - tilemap_draw(bitmap, &am1a_visible1, state->m_reel1_tilemap, 0, 0); - tilemap_draw(bitmap, &am1a_visible2, state->m_reel2_tilemap, 0, 0); - tilemap_draw(bitmap, &am1a_visible3, state->m_reel3_tilemap, 0, 0); + const rectangle visible1(0*8, (14+48)*8-1, 4*8, (4+6)*8-1); + const rectangle visible2(0*8, (14+48)*8-1, 10*8, (10+6)*8-1); + const rectangle visible3(0*8, (14+48)*8-1, 16*8, (16+6)*8-1); + + state->m_reel1_tilemap->draw(bitmap, visible1, 0, 0); + state->m_reel2_tilemap->draw(bitmap, visible2, 0, 0); + state->m_reel3_tilemap->draw(bitmap, visible3, 0, 0); } if (state->m_cm_enable_reg &0x04) @@ -666,7 +666,7 @@ if (state->m_cm_enable_reg &0x02) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } return 0; diff -Nru mame-0.144/src/mame/video/gomoku.c mame-0.145/src/mame/video/gomoku.c --- mame-0.144/src/mame/video/gomoku.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gomoku.c 2012-02-06 21:30:33.000000000 +0000 @@ -72,14 +72,14 @@ { gomoku_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gomoku_colorram_w ) { gomoku_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gomoku_bgram_w ) @@ -117,14 +117,14 @@ int bgdata; int color; - state->m_bg_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bg_bitmap); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); /* make background bitmap */ - bitmap_fill(state->m_bg_bitmap, 0, 0x20); + state->m_bg_bitmap.fill(0x20); // board for (y = 0; y < 256; y++) @@ -138,7 +138,7 @@ if (bgdata & 0x01) color = 0x21; // board (brown) if (bgdata & 0x02) color = 0x20; // frame line (while) - *BITMAP_ADDR16(state->m_bg_bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; + state->m_bg_bitmap.pix16((255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; } } } @@ -150,12 +150,12 @@ ******************************************************************************/ -SCREEN_UPDATE( gomoku ) +SCREEN_UPDATE_IND16( gomoku ) { - gomoku_state *state = screen->machine().driver_data(); - UINT8 *GOMOKU_BG_X = screen->machine().region( "user1" )->base(); - UINT8 *GOMOKU_BG_Y = screen->machine().region( "user2" )->base(); - UINT8 *GOMOKU_BG_D = screen->machine().region( "user3" )->base(); + gomoku_state *state = screen.machine().driver_data(); + UINT8 *GOMOKU_BG_X = screen.machine().region( "user1" )->base(); + UINT8 *GOMOKU_BG_Y = screen.machine().region( "user2" )->base(); + UINT8 *GOMOKU_BG_D = screen.machine().region( "user3" )->base(); int x, y; int bgram; int bgoffs; @@ -192,7 +192,7 @@ } else continue; - *BITMAP_ADDR16(bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; + bitmap.pix16((255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; } } @@ -220,15 +220,15 @@ } else continue; - *BITMAP_ADDR16(bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; + bitmap.pix16((255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color; } } } else { - bitmap_fill(bitmap, 0, 0x20); + bitmap.fill(0x20); } - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gotcha.c mame-0.145/src/mame/video/gotcha.c --- mame-0.144/src/mame/video/gotcha.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gotcha.c 2012-02-06 21:30:33.000000000 +0000 @@ -12,7 +12,7 @@ return (col & 0x1f) | (row << 5) | ((col & 0x20) << 5); } -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index ,UINT16 *vram, int color_offs) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index ,UINT16 *vram, int color_offs) { gotcha_state *state = machine.driver_data(); UINT16 data = vram[tile_index]; @@ -47,10 +47,10 @@ state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info, gotcha_tilemap_scan, 16, 16, 64, 32); state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info, gotcha_tilemap_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_fg_tilemap, -1, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, -5, 0); + state->m_fg_tilemap->set_scrolldx(-1, 0); + state->m_bg_tilemap->set_scrolldx(-5, 0); } @@ -58,14 +58,14 @@ { gotcha_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( gotcha_bgvideoram_w ) { gotcha_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( gotcha_gfxbank_select_w ) @@ -83,7 +83,7 @@ if (state->m_gfxbank[state->m_banksel] != ((data & 0x0f00) >> 8)) { state->m_gfxbank[state->m_banksel] = (data & 0x0f00) >> 8; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } } @@ -95,17 +95,17 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll[0]); break; - case 1: tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll[1]); break; - case 2: tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll[2]); break; - case 3: tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll[3]); break; + case 0: state->m_fg_tilemap->set_scrollx(0, state->m_scroll[0]); break; + case 1: state->m_fg_tilemap->set_scrolly(0, state->m_scroll[1]); break; + case 2: state->m_bg_tilemap->set_scrollx(0, state->m_scroll[2]); break; + case 3: state->m_bg_tilemap->set_scrolly(0, state->m_scroll[3]); break; } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gotcha_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -135,11 +135,11 @@ } -SCREEN_UPDATE( gotcha ) +SCREEN_UPDATE_IND16( gotcha ) { - gotcha_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + gotcha_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/gottlieb.c mame-0.145/src/mame/video/gottlieb.c --- mame-0.144/src/mame/video/gottlieb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gottlieb.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,7 +6,6 @@ #include "emu.h" #include "includes/gottlieb.h" -#include "machine/laserdsc.h" #include "video/resnet.h" @@ -57,14 +56,14 @@ if (flip_screen_x_get(space->machine()) != (data & 0x02)) { flip_screen_x_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 2 controls horizonal flip screen */ if (flip_screen_y_get(space->machine()) != (data & 0x04)) { flip_screen_y_set(space->machine(), data & 0x04); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* in Q*Bert Qubes only, bit 4 controls the sprite bank */ @@ -75,7 +74,6 @@ WRITE8_HANDLER( gottlieb_laserdisc_video_control_w ) { gottlieb_state *state = space->machine().driver_data(); - device_t *laserdisc = space->machine().devicelist().first(PIONEER_PR8210); /* bit 0 works like the other games */ gottlieb_video_control_w(space, offset, data & 0x01); @@ -85,8 +83,8 @@ /* bit 2 video enable (0 = black screen) */ /* bit 3 genlock control (1 = show laserdisc image) */ - laserdisc_overlay_enable(laserdisc, (data & 0x04) ? TRUE : FALSE); - laserdisc_video_enable(laserdisc, ((data & 0x0c) == 0x0c) ? TRUE : FALSE); + state->m_laserdisc->overlay_enable((data & 0x04) ? TRUE : FALSE); + state->m_laserdisc->video_enable(((data & 0x0c) == 0x0c) ? TRUE : FALSE); /* configure the palette if the laserdisc is enabled */ state->m_transparent0 = (data >> 3) & 1; @@ -106,7 +104,7 @@ gottlieb_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -167,8 +165,8 @@ /* configure the background tilemap */ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 318 - 256); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(0, 318 - 256); gfx_element_set_source(machine.gfx[0], state->m_charram); @@ -194,8 +192,8 @@ /* configure the background tilemap */ state->m_bg_tilemap = tilemap_create(machine, get_screwloo_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 318 - 256); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(0, 318 - 256); gfx_element_set_source(machine.gfx[0], state->m_charram); @@ -213,11 +211,11 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { gottlieb_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle clip = *cliprect; + rectangle clip = cliprect; int offs; /* this is a temporary guess until the sprite hardware is better understood */ @@ -235,7 +233,7 @@ if (flip_screen_x_get(machine)) sx = 233 - sx; if (flip_screen_y_get(machine)) sy = 244 - sy; - drawgfx_transpen(bitmap, &clip, + drawgfx_transpen(bitmap, clip, machine.gfx[2], code, 0, flip_screen_x_get(machine), flip_screen_y_get(machine), @@ -251,21 +249,21 @@ * *************************************/ -SCREEN_UPDATE( gottlieb ) +SCREEN_UPDATE_RGB32( gottlieb ) { - gottlieb_state *state = screen->machine().driver_data(); + gottlieb_state *state = screen.machine().driver_data(); /* if the background has lower priority, render it first, else clear the screen */ if (!state->m_background_priority) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(screen.machine().pens[0], cliprect); /* draw the sprites */ - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); /* if the background has higher priority, render it now */ if (state->m_background_priority) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gotya.c mame-0.145/src/mame/video/gotya.c --- mame-0.144/src/mame/video/gotya.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gotya.c 2012-02-06 21:30:32.000000000 +0000 @@ -65,14 +65,14 @@ { gotya_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gotya_colorram_w ) { gotya_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gotya_video_control_w ) @@ -88,7 +88,7 @@ if (flip_screen_get(space->machine()) != (data & 0x02)) { flip_screen_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -115,7 +115,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_thehand, 8, 8, 64, 32); } -static void draw_status_row( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int sx, int col ) +static void draw_status_row( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int sx, int col ) { gotya_state *state = machine.driver_data(); int row; @@ -143,7 +143,7 @@ } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gotya_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -167,7 +167,7 @@ } } -static void draw_status( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_status( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { draw_status_row(machine, bitmap, cliprect, 0, 1); draw_status_row(machine, bitmap, cliprect, 1, 0); @@ -177,12 +177,12 @@ draw_status_row(machine, bitmap, cliprect, 34, 15); } -SCREEN_UPDATE( gotya ) +SCREEN_UPDATE_IND16( gotya ) { - gotya_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, -(*state->m_scroll + (state->m_scroll_bit_8 * 256)) - 2 * 8); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_status(screen->machine(), bitmap, cliprect); + gotya_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, -(*state->m_scroll + (state->m_scroll_bit_8 * 256)) - 2 * 8); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_status(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/gp9001.c mame-0.145/src/mame/video/gp9001.c --- mame-0.144/src/mame/video/gp9001.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gp9001.c 2012-02-06 21:30:31.000000000 +0000 @@ -152,21 +152,21 @@ { gp9001vdp_device *vdp = (gp9001vdp_device*)device; COMBINE_DATA(&vdp->bg.vram16[offset]); - tilemap_mark_tile_dirty(vdp->bg.tmap,offset/2); + vdp->bg.tmap->mark_tile_dirty(offset/2); } static WRITE16_DEVICE_HANDLER( gp9001_fg_tmap_w ) { gp9001vdp_device *vdp = (gp9001vdp_device*)device; COMBINE_DATA(&vdp->fg.vram16[offset]); - tilemap_mark_tile_dirty(vdp->fg.tmap,offset/2); + vdp->fg.tmap->mark_tile_dirty(offset/2); } static WRITE16_DEVICE_HANDLER( gp9001_top_tmap_w ) { gp9001vdp_device *vdp = (gp9001vdp_device*)device; COMBINE_DATA(&vdp->top.vram16[offset]); - tilemap_mark_tile_dirty(vdp->top.tmap,offset/2); + vdp->top.tmap->mark_tile_dirty(offset/2); } static READ16_DEVICE_HANDLER( gp9001_bg_tmap_r ) @@ -224,10 +224,8 @@ vdp.m_gfxregion = gfxregion; } -bool gp9001vdp_device::device_validity_check(emu_options &options, const game_driver &driver) const +void gp9001vdp_device::device_validity_check(validity_checker &valid) const { - bool error = false; - return error; } const address_space_config *gp9001vdp_device::memory_space_config(address_spacenum spacenum) const @@ -259,7 +257,7 @@ tile_number, color, 0); - //tileinfo->category = (attrib & 0x0f00) >> 8; + //tileinfo.category = (attrib & 0x0f00) >> 8; } @@ -286,7 +284,7 @@ tile_number, color, 0); - //tileinfo->category = (attrib & 0x0f00) >> 8; + //tileinfo.category = (attrib & 0x0f00) >> 8; } static TILE_GET_INFO_DEVICE( get_bg0_tile_info ) @@ -309,7 +307,7 @@ tile_number, color, 0); - //tileinfo->category = (attrib & 0x0f00) >> 8; + //tileinfo.category = (attrib & 0x0f00) >> 8; } void gp9001vdp_device::create_tilemaps(int region) @@ -320,9 +318,9 @@ fg.tmap = tilemap_create_device(this, get_fg0_tile_info,tilemap_scan_rows,16,16,32,32); bg.tmap = tilemap_create_device(this, get_bg0_tile_info,tilemap_scan_rows,16,16,32,32); - tilemap_set_transparent_pen(top.tmap,0); - tilemap_set_transparent_pen(fg.tmap,0); - tilemap_set_transparent_pen(bg.tmap,0); + top.tmap->set_transparent_pen(0); + fg.tmap->set_transparent_pen(0); + bg.tmap->set_transparent_pen(0); } @@ -473,14 +471,14 @@ if (flip) { layer->flip |= TILEMAP_FLIPX; - tilemap_set_scrollx(layer->tmap,0,-(layer->scrollx+layer->extra_xoffset.flipped)); + layer->tmap->set_scrollx(0,-(layer->scrollx+layer->extra_xoffset.flipped)); } else { layer->flip &= (~TILEMAP_FLIPX); - tilemap_set_scrollx(layer->tmap,0,layer->scrollx+layer->extra_xoffset.normal); + layer->tmap->set_scrollx(0,layer->scrollx+layer->extra_xoffset.normal); } - tilemap_set_flip(layer->tmap,layer->flip); + layer->tmap->set_flip(layer->flip); } static void gp9001_set_scrolly_and_flip_reg(gp9001tilemaplayer* layer, UINT16 data, UINT16 mem_mask, int flip) @@ -490,16 +488,16 @@ if (flip) { layer->flip |= TILEMAP_FLIPY; - tilemap_set_scrolly(layer->tmap,0,-(layer->scrolly+layer->extra_yoffset.flipped)); + layer->tmap->set_scrolly(0,-(layer->scrolly+layer->extra_yoffset.flipped)); } else { layer->flip &= (~TILEMAP_FLIPY); - tilemap_set_scrolly(layer->tmap,0,layer->scrolly+layer->extra_yoffset.normal); + layer->tmap->set_scrolly(0,layer->scrolly+layer->extra_yoffset.normal); } - tilemap_set_flip(layer->tmap,layer->flip); + layer->tmap->set_flip(layer->flip); } static void gp9001_set_sprite_scrollx_and_flip_reg(gp9001spritelayer* layer, UINT16 data, UINT16 mem_mask, int flip) @@ -758,7 +756,7 @@ Sprite Handlers ***************************************************************************/ -void gp9001vdp_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8* primap ) +void gp9001vdp_device::draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8* primap ) { const gfx_element *gfx = machine.gfx[tile_region+1]; @@ -914,11 +912,11 @@ { int drawxx = xx+sx; - if (drawxx>=cliprect->min_x && drawxx<=cliprect->max_x && drawyy>=cliprect->min_y && drawyy<=cliprect->max_y) + if (cliprect.contains(drawxx, drawyy)) { UINT8 pix = srcdata[count]; - UINT16* dstptr = BITMAP_ADDR16(bitmap,drawyy,drawxx); - UINT8* dstpri = BITMAP_ADDR8(this->custom_priority_bitmap, drawyy, drawxx); + UINT16* dstptr = &bitmap.pix16(drawyy, drawxx); + UINT8* dstpri = &this->custom_priority_bitmap->pix8(drawyy, drawxx); if (priority >= dstpri[0]) { @@ -948,29 +946,29 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -void gp9001vdp_device::gp9001_draw_custom_tilemap(running_machine& machine, bitmap_t* bitmap, tilemap_t* tilemap, const UINT8* priremap, const UINT8* pri_enable ) +void gp9001vdp_device::gp9001_draw_custom_tilemap(running_machine& machine, bitmap_ind16 &bitmap, tilemap_t* tilemap, const UINT8* priremap, const UINT8* pri_enable ) { int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); int y,x; - bitmap_t *tmb = tilemap_get_pixmap(tilemap); + bitmap_ind16 &tmb = tilemap->pixmap(); UINT16* srcptr; UINT16* dstptr; UINT8* dstpriptr; - int scrollx = tilemap_get_scrollx(tilemap, 0); - int scrolly = tilemap_get_scrolly(tilemap, 0); + int scrollx = tilemap->scrollx(0); + int scrolly = tilemap->scrolly(0); for (y=0;ycustom_priority_bitmap, y, 0); + srcptr = &tmb.pix16(realy); + dstptr = &bitmap.pix16(y); + dstpriptr = &this->custom_priority_bitmap->pix8(y); for (x=0;xmark_all_dirty(); + fg.tmap->mark_all_dirty(); gp9001_gfxrom_bank_dirty = 0; } diff -Nru mame-0.144/src/mame/video/gp9001.h mame-0.145/src/mame/video/gp9001.h --- mame-0.144/src/mame/video/gp9001.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gp9001.h 2012-02-06 21:30:31.000000000 +0000 @@ -54,17 +54,17 @@ UINT16 gp9001_gfxrom_bank[8]; /* Batrider object bank */ - void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8* primap ); - void gp9001_draw_custom_tilemap(running_machine& machine, bitmap_t* bitmap, tilemap_t* tilemap, const UINT8* priremap, const UINT8* pri_enable ); - void gp9001_render_vdp(running_machine& machine, bitmap_t* bitmap, const rectangle* cliprect); + void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8* primap ); + void gp9001_draw_custom_tilemap(running_machine& machine, bitmap_ind16 &bitmap, tilemap_t* tilemap, const UINT8* priremap, const UINT8* pri_enable ); + void gp9001_render_vdp(running_machine& machine, bitmap_ind16 &bitmap, const rectangle &cliprect); void gp9001_screen_eof(void); void create_tilemaps(int region); void init_scroll_regs(void); - bitmap_t *custom_priority_bitmap; + bitmap_ind8 *custom_priority_bitmap; protected: - virtual bool device_validity_check(emu_options &options, const game_driver &driver) const; + virtual void device_validity_check(validity_checker &valid) const; virtual void device_start(); virtual void device_reset(); diff -Nru mame-0.144/src/mame/video/gradius3.c mame-0.145/src/mame/video/gradius3.c --- mame-0.144/src/mame/video/gradius3.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gradius3.c 2012-02-06 21:30:31.000000000 +0000 @@ -123,9 +123,9 @@ ***************************************************************************/ -SCREEN_UPDATE( gradius3 ) +SCREEN_UPDATE_IND16( gradius3 ) { - gradius3_state *state = screen->machine().driver_data(); + gradius3_state *state = screen.machine().driver_data(); /* TODO: this kludge enforces the char banks. For some reason, they don't work otherwise. */ k052109_w(state->m_k052109, 0x1d80, 0x10); @@ -133,7 +133,7 @@ k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_priority == 0) { k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 2); diff -Nru mame-0.144/src/mame/video/grchamp.c mame-0.145/src/mame/video/grchamp.c --- mame-0.144/src/mame/video/grchamp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/grchamp.c 2012-02-06 21:30:32.000000000 +0000 @@ -56,21 +56,21 @@ { grchamp_state *state = space->machine().driver_data(); state->m_leftram[offset] = data; - tilemap_mark_tile_dirty(state->m_left_tilemap, offset); + state->m_left_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( grchamp_center_w ) { grchamp_state *state = space->machine().driver_data(); state->m_centerram[offset] = data; - tilemap_mark_tile_dirty(state->m_center_tilemap, offset); + state->m_center_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( grchamp_right_w ) { grchamp_state *state = space->machine().driver_data(); state->m_rightram[offset] = data; - tilemap_mark_tile_dirty(state->m_right_tilemap, offset); + state->m_right_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_text_tile_info ) @@ -107,7 +107,7 @@ { grchamp_state *state = machine.driver_data(); - state->m_work_bitmap = auto_bitmap_alloc(machine,32,32,machine.primary_screen->format()); + state->m_work_bitmap.allocate(32,32); /* allocate tilemaps for each of the three sections */ state->m_text_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8,8, 32,32); @@ -117,11 +117,11 @@ } #if 0 -static int collision_check(running_machine &machine, grchamp_state *state, bitmap_t *bitmap, int which ) +static int collision_check(running_machine &machine, grchamp_state *state, bitmap_ind16 &bitmap, int which ) { int bgcolor = machine.pens[0]; int sprite_transp = machine.pens[0x24]; - const rectangle *visarea = machine.primary_screen->visible_area(); + const rectangle &visarea = machine.primary_screen->visible_area(); int y0 = 240 - state->m_cpu0_out[3]; int x0 = 256 - state->m_cpu0_out[2]; int x,y,sx,sy; @@ -132,7 +132,7 @@ { /* draw the current player sprite into a work bitmap */ drawgfx_opaque( state->m_work_bitmap, - 0, + state->m_work_bitmap.cliprect(), machine.gfx[4], state->m_cpu0_out[4]&0xf, 1, /* color */ @@ -144,21 +144,20 @@ { for( x = 0; x<32; x++ ) { - pixel = *BITMAP_ADDR16(state->m_work_bitmap, y, x); + pixel = state->m_work_bitmap.pix16(y, x); if( pixel != sprite_transp ){ sx = x+x0; sy = y+y0; - if( (sx >= visarea->min_x) && (sx <= visarea->max_x) && - (sy >= visarea->min_y) && (sy <= visarea->max_y) ) + if(visarea->contains(sx, sy)) { // Collision check uses only 16 pens! - pixel = *BITMAP_ADDR16(bitmap, sy, sx) % 16; + pixel = bitmap.pix16(sy, sx) % 16; if( pixel != bgcolor ) { result = 1; /* flag collision */ /* wipe this pixel, so collision checks with the ** next layer work */ - *BITMAP_ADDR16(bitmap, sy, sx) = bgcolor; + bitmap.pix16(sy, sx) = bgcolor; } } } @@ -168,7 +167,7 @@ return result?(1<m_cpu0_out[0] & 0x20) ? 0x40 : 0x00; @@ -352,7 +351,7 @@ } -SCREEN_UPDATE( grchamp ) +SCREEN_UPDATE_RGB32( grchamp ) { static const rgb_t objpix_lookup[8] = { @@ -366,13 +365,13 @@ MAKE_RGB(RGB_MAX,RGB_MAX,RGB_MAX) }; - grchamp_state *state = screen->machine().driver_data(); - const UINT8 *amedata = screen->machine().region("gfx5")->base(); - const UINT8 *headdata = screen->machine().region("gfx6")->base(); - const UINT8 *pldata = screen->machine().region("gfx7")->base(); - bitmap_t *lpixmap = tilemap_get_pixmap(state->m_left_tilemap); - bitmap_t *rpixmap = tilemap_get_pixmap(state->m_right_tilemap); - bitmap_t *cpixmap = tilemap_get_pixmap(state->m_center_tilemap); + grchamp_state *state = screen.machine().driver_data(); + const UINT8 *amedata = screen.machine().region("gfx5")->base(); + const UINT8 *headdata = screen.machine().region("gfx6")->base(); + const UINT8 *pldata = screen.machine().region("gfx7")->base(); + bitmap_ind16 &lpixmap = state->m_left_tilemap->pixmap(); + bitmap_ind16 &rpixmap = state->m_right_tilemap->pixmap(); + bitmap_ind16 &cpixmap = state->m_center_tilemap->pixmap(); int lrxscroll, cxscroll, lyscroll, ryscroll, cyscroll; int bgcolor = state->m_cpu1_out[3] & 0x10; int amebase = state->m_cpu0_out[4] >> 4; @@ -381,8 +380,8 @@ int x, y; /* ensure that the tilemaps are the same size */ - assert(lpixmap->width == rpixmap->width && lpixmap->width == cpixmap->width); - assert(lpixmap->height == rpixmap->height && lpixmap->height == cpixmap->height); + assert(lpixmap.width() == rpixmap.width() && lpixmap.width() == cpixmap.width()); + assert(lpixmap.height() == rpixmap.height() && lpixmap.height() == cpixmap.height()); /* extract background scroll values; left and right share the same X scroll */ lrxscroll = state->m_cpu1_out[0] + (state->m_cpu1_out[1] & 1) * 256; @@ -395,24 +394,24 @@ cxmask = (state->m_cpu1_out[3] & 0x20) ? 0xff : 0x1ff; /* iterate over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { /* select either left or right tilemaps based on Y */ - bitmap_t *lrpixmap = (y < 128) ? lpixmap : rpixmap; + bitmap_ind16 &lrpixmap = (y < 128) ? lpixmap : rpixmap; int lryscroll = (y < 128) ? lyscroll : ryscroll; /* get source/dest pointers */ /* the Y counter starts counting when VBLANK goes to 0, which is at Y=16 */ - UINT16 *lrsrc = (UINT16 *)lrpixmap->base + ((lryscroll + y - 16) & 0xff) * lrpixmap->rowpixels; - UINT16 *csrc = (UINT16 *)cpixmap->base + ((cyscroll + y - 16) & 0xff) * cpixmap->rowpixels; - UINT32 *dest = (UINT32 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *lrsrc = &lrpixmap.pix16((lryscroll + y - 16) & 0xff); + UINT16 *csrc = &cpixmap.pix16((cyscroll + y - 16) & 0xff); + UINT32 *dest = &bitmap.pix32(y); UINT8 objdata[256]; /* draw the objects for this scanline */ - draw_objects(screen->machine(), state, y, objdata); + draw_objects(screen.machine(), state, y, objdata); /* iterate over columns */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { rgb_t finalpix; int headbit = 0; diff -Nru mame-0.144/src/mame/video/gridlee.c mame-0.145/src/mame/video/gridlee.c --- mame-0.144/src/mame/video/gridlee.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/gridlee.c 2012-02-06 21:30:32.000000000 +0000 @@ -132,15 +132,15 @@ /* all the GRIDLEE_VBEND adjustments are needed because the hardware has a separate counting chain to address the video memory instead of using the video chain directly */ -SCREEN_UPDATE( gridlee ) +SCREEN_UPDATE_IND16( gridlee ) { - gridlee_state *state = screen->machine().driver_data(); - const pen_t *pens = &screen->machine().pens[state->m_palettebank_vis * 32]; + gridlee_state *state = screen.machine().driver_data(); + const pen_t *pens = &screen.machine().pens[state->m_palettebank_vis * 32]; UINT8 *gfx; int x, y, i; /* draw scanlines from the VRAM directly */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { /* non-flipped: draw directly from the bitmap */ if (!state->m_cocktail_flip) @@ -160,7 +160,7 @@ } /* draw the sprite images */ - gfx = screen->machine().region("gfx1")->base(); + gfx = screen.machine().region("gfx1")->base(); for (i = 0; i < 32; i++) { UINT8 *sprite = state->m_spriteram + i * 4; @@ -184,7 +184,7 @@ currxor = 0xff; } - if (ypos >= (16 + GRIDLEE_VBEND) && ypos >= cliprect->min_y && ypos <= cliprect->max_y) + if (ypos >= (16 + GRIDLEE_VBEND) && ypos >= cliprect.min_y && ypos <= cliprect.max_y) { int currx = xpos; @@ -197,12 +197,12 @@ /* left pixel */ if (left && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx ^ currxor) = pens[left]; + bitmap.pix16(ypos, currx ^ currxor) = pens[left]; currx++; /* right pixel */ if (right && currx >= 0 && currx < 256) - *BITMAP_ADDR16(bitmap, ypos, currx ^ currxor) = pens[right]; + bitmap.pix16(ypos, currx ^ currxor) = pens[right]; currx++; } } diff -Nru mame-0.144/src/mame/video/groundfx.c mame-0.145/src/mame/video/groundfx.c --- mame-0.144/src/mame/video/groundfx.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/groundfx.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,10 +10,7 @@ state->m_spritelist = auto_alloc_array(machine, struct tempsprite, 0x4000); /* Hack */ - state->m_hack_cliprect.min_x = 69; - state->m_hack_cliprect.max_x = 250; - state->m_hack_cliprect.min_y = 24 + 5; - state->m_hack_cliprect.max_y = 24 + 44; + state->m_hack_cliprect.set(69, 250, 24 + 5, 24 + 44); } /*************************************************************** @@ -63,7 +60,7 @@ ***************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int do_hack,int x_offs,int y_offs) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int do_hack,int x_offs,int y_offs) { groundfx_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -183,9 +180,9 @@ if (do_hack && sprite_ptr->pri==1 && sprite_ptr->y<100) clipper=&state->m_hack_cliprect; else - clipper=cliprect; + clipper=&cliprect; - pdrawgfxzoom_transpen(bitmap,clipper,machine.gfx[sprite_ptr->gfx], + pdrawgfxzoom_transpen(bitmap,*clipper,machine.gfx[sprite_ptr->gfx], sprite_ptr->code, sprite_ptr->color, sprite_ptr->flipx,sprite_ptr->flipy, @@ -199,11 +196,11 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( groundfx ) +SCREEN_UPDATE_IND16( groundfx ) { - groundfx_state *state = screen->machine().driver_data(); - device_t *tc0100scn = screen->machine().device("tc0100scn"); - device_t *tc0480scp = screen->machine().device("tc0480scp"); + groundfx_state *state = screen.machine().driver_data(); + device_t *tc0100scn = screen.machine().device("tc0100scn"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT8 pivlayer[3]; UINT16 priority; @@ -223,8 +220,8 @@ pivlayer[1] = pivlayer[0]^1; pivlayer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[0], TILEMAP_DRAW_OPAQUE, 0); tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[1], 0, 0); @@ -255,8 +252,8 @@ //tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, 0, pivlayer[2], 0, 0); if (tc0480scp_long_r(tc0480scp, 0x20 / 4, 0xffffffff) != 0x240866) /* Stupid hack for start of race */ - tc0480scp_tilemap_draw(tc0480scp, bitmap, &state->m_hack_cliprect, layer[0], 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1, 44, -574); + tc0480scp_tilemap_draw(tc0480scp, bitmap, state->m_hack_cliprect, layer[0], 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1, 44, -574); } else { @@ -267,7 +264,7 @@ tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, pivlayer[2], 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 44, -574); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 44, -574); } tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 0); /* TC0480SCP text layer */ diff -Nru mame-0.144/src/mame/video/gstriker.c mame-0.145/src/mame/video/gstriker.c --- mame-0.144/src/mame/video/gstriker.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gstriker.c 2012-02-06 21:30:31.000000000 +0000 @@ -43,14 +43,14 @@ { gstriker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_VS920A[0].vram[offset]); - tilemap_mark_tile_dirty(state->m_VS920A[0].tmap, offset); + state->m_VS920A[0].tmap->mark_tile_dirty(offset); } WRITE16_HANDLER( VS920A_1_vram_w ) { gstriker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_VS920A[1].vram[offset]); - tilemap_mark_tile_dirty(state->m_VS920A[1].tmap, offset); + state->m_VS920A[1].tmap->mark_tile_dirty(offset); } static void VS920A_init(running_machine &machine, int numchips) @@ -65,7 +65,7 @@ { state->m_VS920A[i].tmap = tilemap_create(machine, VS920A_get_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_VS920A[i].tmap, 0); + state->m_VS920A[i].tmap->set_transparent_pen(0); } } @@ -84,11 +84,11 @@ state->m_VS920A[numchip].gfx_region = gfx_region; } -static void VS920A_draw(gstriker_state *state, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) +static void VS920A_draw(gstriker_state *state, int numchip, bitmap_ind16& screen, const rectangle &cliprect, int priority) { state->m_VS920A_cur_chip = &state->m_VS920A[numchip]; - tilemap_draw(screen, cliprect, state->m_VS920A_cur_chip->tmap, 0, priority); + state->m_VS920A_cur_chip->tmap->draw(screen, cliprect, 0, priority); } @@ -163,11 +163,11 @@ switch (num_reg) { case 0: - tilemap_set_scrollx(cur->tmap, 0, cur->regs[0]>>4); + cur->tmap->set_scrollx(0, cur->regs[0]>>4); break; case 1: - tilemap_set_scrolly(cur->tmap, 0, cur->regs[1]>>4); + cur->tmap->set_scrolly(0, cur->regs[1]>>4); break; case 2: @@ -181,25 +181,25 @@ case 4: cur->bank[0] = (cur->regs[4] >> 8) & 0x1F; cur->bank[1] = (cur->regs[4] >> 0) & 0x1F; - tilemap_mark_all_tiles_dirty(cur->tmap); + cur->tmap->mark_all_dirty(); break; case 5: cur->bank[2] = (cur->regs[5] >> 8) & 0x1F; cur->bank[3] = (cur->regs[5] >> 0) & 0x1F; - tilemap_mark_all_tiles_dirty(cur->tmap); + cur->tmap->mark_all_dirty(); break; case 6: cur->bank[4] = (cur->regs[6] >> 8) & 0x1F; cur->bank[5] = (cur->regs[6] >> 0) & 0x1F; - tilemap_mark_all_tiles_dirty(cur->tmap); + cur->tmap->mark_all_dirty(); break; case 7: cur->bank[6] = (cur->regs[7] >> 8) & 0x1F; cur->bank[7] = (cur->regs[7] >> 0) & 0x1F; - tilemap_mark_all_tiles_dirty(cur->tmap); + cur->tmap->mark_all_dirty(); break; } } @@ -223,7 +223,7 @@ { state->m_MB60553[i].tmap = tilemap_create(machine, MB60553_get_tile_info,twc94_scan, 16,16,128,64); - tilemap_set_transparent_pen(state->m_MB60553[i].tmap, 0); + state->m_MB60553[i].tmap->set_transparent_pen(0); } } @@ -238,7 +238,7 @@ } /* THIS IS STILL WRONG! */ -static void MB60553_draw(running_machine &machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) +static void MB60553_draw(running_machine &machine, int numchip, bitmap_ind16& screen, const rectangle &cliprect, int priority) { gstriker_state *state = machine.driver_data(); int line; @@ -269,7 +269,7 @@ clip.min_y = clip.max_y = line; - tilemap_draw_roz(screen,&clip,state->m_MB60553_cur_chip->tmap,startx<<12,starty<<12, + state->m_MB60553_cur_chip->tmap->draw_roz(screen, clip, startx<<12,starty<<12, incxx,0,0,incyy, 1, 0,priority); @@ -313,7 +313,7 @@ gstriker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_MB60553[0].vram[offset]); - tilemap_mark_tile_dirty(state->m_MB60553[0].tmap, offset); + state->m_MB60553[0].tmap->mark_tile_dirty(offset); } WRITE16_HANDLER(MB60553_1_vram_w) @@ -321,7 +321,7 @@ gstriker_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_MB60553[1].vram[offset]); - tilemap_mark_tile_dirty(state->m_MB60553[1].tmap, offset); + state->m_MB60553[1].tmap->mark_tile_dirty(offset); } @@ -383,7 +383,7 @@ */ -static void CG10103_draw_sprite(running_machine &machine, bitmap_t* screen, const rectangle* cliprect, UINT16* spr, int drawpri) +static void CG10103_draw_sprite(running_machine &machine, bitmap_ind16& screen, const rectangle &cliprect, UINT16* spr, int drawpri) { gstriker_state *state = machine.driver_data(); int ypos = spr[0] & 0x1FF; @@ -460,7 +460,7 @@ } -static void CG10103_draw(running_machine &machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) +static void CG10103_draw(running_machine &machine, int numchip, bitmap_ind16& screen, const rectangle &cliprect, int priority) { gstriker_state *state = machine.driver_data(); UINT16* splist; @@ -533,20 +533,20 @@ #endif -SCREEN_UPDATE(gstriker) +SCREEN_UPDATE_IND16(gstriker) { - gstriker_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + gstriker_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably // needs sprite orthogonality - MB60553_draw(screen->machine(), 0, bitmap,cliprect, 0); + MB60553_draw(screen.machine(), 0, bitmap,cliprect, 0); - CG10103_draw(screen->machine(), 0, bitmap, cliprect, 0); + CG10103_draw(screen.machine(), 0, bitmap, cliprect, 0); VS920A_draw(state, 0, bitmap, cliprect, 0); - CG10103_draw(screen->machine(), 0, bitmap, cliprect, 1); + CG10103_draw(screen.machine(), 0, bitmap, cliprect, 1); #if 0 popmessage("%04x %04x %04x %04x %04x %04x %04x %04x", @@ -574,13 +574,13 @@ VS920A_init(machine, 1); VS920A_set_gfx_region(state, 0, 0); VS920A_set_pal_base(state, 0, 0x30); - tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf); + VS920A_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initalize the chip for the screen plane MB60553_init(machine, 1); MB60553_set_gfx_region(state, 0, 1); MB60553_set_pal_base(state, 0, 0); - tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf); + MB60553_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initialize the sprite generator CG10103_init(1); @@ -599,13 +599,13 @@ VS920A_init(machine, 1); VS920A_set_gfx_region(state, 0, 0); VS920A_set_pal_base(state, 0, 0x40); - tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf); + VS920A_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initalize the chip for the screen plane MB60553_init(machine, 1); MB60553_set_gfx_region(state, 0, 1); MB60553_set_pal_base(state, 0, 0x50); - tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf); + MB60553_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initialize the sprite generator CG10103_init(1); @@ -624,13 +624,13 @@ VS920A_init(machine, 1); VS920A_set_gfx_region(state, 0, 0); VS920A_set_pal_base(state, 0, 0x30); - tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf); + VS920A_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initalize the chip for the screen plane MB60553_init(machine, 1); MB60553_set_gfx_region(state, 0, 1); MB60553_set_pal_base(state, 0, 0x20); - tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf); + MB60553_get_tilemap(state, 0)->set_transparent_pen(0xf); // Initialize the sprite generator CG10103_init(1); diff -Nru mame-0.144/src/mame/video/gsword.c mame-0.145/src/mame/video/gsword.c --- mame-0.144/src/mame/video/gsword.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gsword.c 2012-02-06 21:30:32.000000000 +0000 @@ -95,7 +95,7 @@ gsword_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gsword_charbank_w ) @@ -104,7 +104,7 @@ if (state->m_charbank != data) { state->m_charbank = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -121,7 +121,7 @@ if (state->m_charpalbank != ((data & 0x60) >> 5)) { state->m_charpalbank = (data & 0x60) >> 5; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 4 is flip screen */ @@ -129,7 +129,7 @@ if (state->m_flipscreen != (data & 0x10)) { state->m_flipscreen = data & 0x10; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 0 could be used but unknown */ @@ -140,7 +140,7 @@ WRITE8_HANDLER( gsword_scroll_w ) { gsword_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } static TILE_GET_INFO( get_bg_tile_info ) @@ -161,7 +161,7 @@ 8, 8, 32, 64); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { gsword_state *state = machine.driver_data(); int offs; @@ -205,10 +205,10 @@ } } -SCREEN_UPDATE( gsword ) +SCREEN_UPDATE_IND16( gsword ) { - gsword_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + gsword_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/gticlub.c mame-0.145/src/mame/video/gticlub.c --- mame-0.144/src/mame/video/gticlub.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gticlub.c 2012-02-06 21:30:32.000000000 +0000 @@ -164,8 +164,8 @@ static const int decode_y_zr107[16] = { 0, 8, 32, 40, 4, 12, 36, 44, 64, 72, 96, 104, 68, 76, 100, 108 }; static UINT32 K001005_status = 0; -static bitmap_t *K001005_bitmap[2]; -static bitmap_t *K001005_zbuffer; +static bitmap_rgb32 *K001005_bitmap[2]; +static bitmap_ind32 *K001005_zbuffer; static rectangle K001005_cliprect; static void render_polygons(running_machine &machine); @@ -203,12 +203,12 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - K001005_zbuffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED32); + K001005_zbuffer = auto_bitmap_ind32_alloc(machine, width, height); gfxrom = machine.region("gfx1")->base(); - K001005_bitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); - K001005_bitmap[1] = machine.primary_screen->alloc_compatible_bitmap(); + K001005_bitmap[0] = auto_bitmap_rgb32_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); + K001005_bitmap[1] = auto_bitmap_rgb32_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); K001005_texture = auto_alloc_array(machine, UINT8, 0x800000); @@ -454,11 +454,11 @@ static void draw_scanline(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; float z = extent->param[0].start; float dz = extent->param[0].dpdx; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); - UINT32 *zb = BITMAP_ADDR32(K001005_zbuffer, scanline, 0); + UINT32 *fb = &destmap->pix32(scanline); + UINT32 *zb = &K001005_zbuffer->pix32(scanline); UINT32 color = extra->color; int x; @@ -482,7 +482,7 @@ static void draw_scanline_tex(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; UINT8 *texrom = gfxrom + (extra->texture_page * 0x40000); int pal_chip = (extra->texture_palette & 0x8) ? 1 : 0; int palette_index = (extra->texture_palette & 0x7) * 256; @@ -500,8 +500,8 @@ int texture_y = extra->texture_y; int x; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); - UINT32 *zb = BITMAP_ADDR32(K001005_zbuffer, scanline, 0); + UINT32 *fb = &destmap->pix32(scanline); + UINT32 *zb = &K001005_zbuffer->pix32(scanline); for (x = extent->startx; x < extent->stopx; x++) { @@ -541,7 +541,7 @@ static void render_polygons(running_machine &machine) { int i, j; - const rectangle &visarea = machine.primary_screen->visible_area(); + const rectangle visarea = machine.primary_screen->visible_area(); // mame_printf_debug("K001005_fifo_ptr = %08X\n", K001005_3d_fifo_ptr); @@ -582,9 +582,9 @@ ++index; extra->color = color; - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[0], &v[2], &v[3]); -// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, 4, v); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[0], &v[2], &v[3]); +// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, 4, v); i = index - 1; } @@ -689,13 +689,13 @@ if (num_verts < 3) { - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &prev_v[2], &v[0], &v[1]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &prev_v[2], &v[0], &v[1]); if (prev_poly_type) - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &prev_v[2], &prev_v[3], &v[0]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &prev_v[2], &prev_v[3], &v[0]); // if (prev_poly_type) -// poly_render_quad(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &prev_v[2], &prev_v[3], &v[0], &v[1]); +// poly_render_quad(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &prev_v[2], &prev_v[3], &v[0], &v[1]); // else -// poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &prev_v[2], &v[0], &v[1]); +// poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &prev_v[2], &v[0], &v[1]); memcpy(&prev_v[0], &prev_v[2], sizeof(poly_vertex)); memcpy(&prev_v[1], &prev_v[3], sizeof(poly_vertex)); @@ -704,10 +704,10 @@ } else { - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &v[0], &v[1], &v[2]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &v[0], &v[1], &v[2]); if (num_verts > 3) - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &v[2], &v[3], &v[0]); -// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, num_verts, v); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &v[2], &v[3], &v[0]); +// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, num_verts, v); memcpy(prev_v, v, sizeof(poly_vertex) * 4); } @@ -788,10 +788,10 @@ extra->color = color; - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &v[0], &v[1], &v[2]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &v[0], &v[1], &v[2]); if (new_verts > 1) - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, &v[2], &v[3], &v[0]); -// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline_tex, 4, new_verts + 2, v); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, &v[2], &v[3], &v[0]); +// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline_tex, 4, new_verts + 2, v); memcpy(prev_v, v, sizeof(poly_vertex) * 4); }; @@ -847,10 +847,10 @@ extra->color = color; - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); if (num_verts > 3) - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[2], &v[3], &v[0]); -// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, num_verts, v); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[2], &v[3], &v[0]); +// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, num_verts, v); memcpy(prev_v, v, sizeof(poly_vertex) * 4); @@ -906,10 +906,10 @@ extra->color = color; - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[0], &v[1], &v[2]); if (new_verts > 1) - poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, &v[0], &v[2], &v[3]); -// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], &visarea, draw_scanline, 1, new_verts + 2, v); + poly_render_triangle(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, &v[0], &v[2], &v[3]); +// poly_render_polygon(poly, K001005_bitmap[K001005_bitmap_page], visarea, draw_scanline, 1, new_verts + 2, v); memcpy(prev_v, v, sizeof(poly_vertex) * 4); }; @@ -934,18 +934,18 @@ } } -void K001005_draw(bitmap_t *bitmap, const rectangle *cliprect) +void K001005_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) { int i, j; - memcpy(&K001005_cliprect, cliprect, sizeof(rectangle)); + memcpy(&K001005_cliprect, &cliprect, sizeof(rectangle)); - for (j=cliprect->min_y; j <= cliprect->max_y; j++) + for (j=cliprect.min_y; j <= cliprect.max_y; j++) { - UINT32 *bmp = BITMAP_ADDR32(bitmap, j, 0); - UINT32 *src = BITMAP_ADDR32(K001005_bitmap[K001005_bitmap_page^1], j, 0); + UINT32 *bmp = &bitmap.pix32(j); + UINT32 *src = &K001005_bitmap[K001005_bitmap_page^1]->pix32(j); - for (i=cliprect->min_x; i <= cliprect->max_x; i++) + for (i=cliprect.min_x; i <= cliprect.max_x; i++) { if (src[i] & 0xff000000) { @@ -961,8 +961,8 @@ //if (K001005_status == 2) { - bitmap_fill(K001005_bitmap[K001005_bitmap_page], &K001005_cliprect, machine.pens[0]&0x00ffffff); - bitmap_fill(K001005_zbuffer, &K001005_cliprect, 0xffffffff); + K001005_bitmap[K001005_bitmap_page]->fill(machine.pens[0]&0x00ffffff, K001005_cliprect); + K001005_zbuffer->fill(0xffffffff, K001005_cliprect); } } @@ -981,9 +981,9 @@ K001005_init(machine); } -SCREEN_UPDATE( gticlub ) +SCREEN_UPDATE_RGB32( gticlub ) { - device_t *k001604 = screen->machine().device("k001604_1"); + device_t *k001604 = screen.machine().device("k001604_1"); k001604_draw_back_layer(k001604, bitmap, cliprect); @@ -995,15 +995,15 @@ if( tick >= 5 ) { tick = 0; - if( screen->machine().input().code_pressed(KEYCODE_O) ) + if( screen.machine().input().code_pressed(KEYCODE_O) ) debug_tex_page++; - if( screen->machine().input().code_pressed(KEYCODE_I) ) + if( screen.machine().input().code_pressed(KEYCODE_I) ) debug_tex_page--; - if (screen->machine().input().code_pressed(KEYCODE_U)) + if (screen.machine().input().code_pressed(KEYCODE_U)) debug_tex_palette++; - if (screen->machine().input().code_pressed(KEYCODE_Y)) + if (screen.machine().input().code_pressed(KEYCODE_Y)) debug_tex_palette--; if (debug_tex_page < 0) @@ -1032,7 +1032,7 @@ for (x=0; x < 512; x++) { UINT8 pixel = rom[index + (y*512) + x]; - *BITMAP_ADDR32(bitmap, y, x) = K001006_palette[tp][(pal * 256) + pixel]; + bitmap.pix32(y, x) = K001006_palette[tp][(pal * 256) + pixel]; } } @@ -1044,19 +1044,19 @@ draw_7segment_led(bitmap, 3, 3, gticlub_led_reg[0]); draw_7segment_led(bitmap, 9, 3, gticlub_led_reg[1]); - //cputag_set_input_line(screen->machine(), "dsp", SHARC_INPUT_FLAG1, ASSERT_LINE); - sharc_set_flag_input(screen->machine().device("dsp"), 1, ASSERT_LINE); + //cputag_set_input_line(screen.machine(), "dsp", SHARC_INPUT_FLAG1, ASSERT_LINE); + sharc_set_flag_input(screen.machine().device("dsp"), 1, ASSERT_LINE); return 0; } -SCREEN_UPDATE( hangplt ) +SCREEN_UPDATE_RGB32( hangplt ) { - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); - if (strcmp(screen->tag(), "lscreen") == 0) + if (strcmp(screen.tag(), "lscreen") == 0) { - device_t *k001604 = screen->machine().device("k001604_1"); - device_t *voodoo = screen->machine().device("voodoo0"); + device_t *k001604 = screen.machine().device("k001604_1"); + device_t *voodoo = screen.machine().device("voodoo0"); // k001604_draw_back_layer(k001604, bitmap, cliprect); @@ -1064,10 +1064,10 @@ k001604_draw_front_layer(k001604, bitmap, cliprect); } - else if (strcmp(screen->tag(), "rscreen") == 0) + else if (strcmp(screen.tag(), "rscreen") == 0) { - device_t *k001604 = screen->machine().device("k001604_2"); - device_t *voodoo = screen->machine().device("voodoo1"); + device_t *k001604 = screen.machine().device("k001604_2"); + device_t *voodoo = screen.machine().device("voodoo1"); // k001604_draw_back_layer(k001604, bitmap, cliprect); diff -Nru mame-0.144/src/mame/video/gticlub.h mame-0.145/src/mame/video/gticlub.h --- mame-0.144/src/mame/video/gticlub.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gticlub.h 2012-02-06 21:30:32.000000000 +0000 @@ -1,6 +1,6 @@ void gticlub_led_setreg(int offset, UINT8 data); -void K001005_draw(bitmap_t *bitmap, const rectangle *cliprect); +void K001005_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect); void K001005_swap_buffers(running_machine &machine); void K001005_init(running_machine &machine); void K001005_preprocess_texture_data(UINT8 *rom, int length, int gticlub); @@ -15,5 +15,5 @@ WRITE32_HANDLER(K001006_1_w); VIDEO_START( gticlub ); -SCREEN_UPDATE( gticlub ); -SCREEN_UPDATE( hangplt ); +SCREEN_UPDATE_RGB32( gticlub ); +SCREEN_UPDATE_RGB32( hangplt ); diff -Nru mame-0.144/src/mame/video/gumbo.c mame-0.145/src/mame/video/gumbo.c --- mame-0.144/src/mame/video/gumbo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gumbo.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,7 +8,7 @@ { gumbo_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_gumbo_bg_tile_info ) @@ -23,7 +23,7 @@ { gumbo_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_gumbo_fg_tile_info ) @@ -39,13 +39,13 @@ gumbo_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_gumbo_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_gumbo_fg_tile_info, tilemap_scan_rows, 4, 4, 128, 64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xff); + state->m_fg_tilemap->set_transparent_pen(0xff); } -SCREEN_UPDATE( gumbo ) +SCREEN_UPDATE_IND16( gumbo ) { - gumbo_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + gumbo_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gunbustr.c mame-0.145/src/mame/video/gunbustr.c --- mame-0.144/src/mame/video/gunbustr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gunbustr.c 2012-02-06 21:30:32.000000000 +0000 @@ -56,7 +56,7 @@ ********************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,const int *primasks,int x_offs,int y_offs) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,const int *primasks,int x_offs,int y_offs) { gunbustr_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -202,9 +202,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( gunbustr ) +SCREEN_UPDATE_IND16( gunbustr ) { - device_t *tc0480scp = screen->machine().device("tc0480scp"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT16 priority; static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; @@ -218,25 +218,25 @@ layer[3] = (priority & 0x000f) >> 0; /* tells us which is top */ layer[4] = 4; /* text layer always over bg layers */ - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); /* We have to assume 2nd to bottom layer is always underneath sprites as pdrawgfx cannot yet cope with more than 4 layers */ #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed (KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0],TILEMAP_DRAW_OPAQUE, 0); - if (!screen->machine().input().code_pressed (KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); - if (!screen->machine().input().code_pressed (KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); - if (!screen->machine().input().code_pressed (KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); - if (!screen->machine().input().code_pressed (KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); - if (!screen->machine().input().code_pressed (KEYCODE_N)) draw_sprites(screen->machine(), bitmap, cliprect, primasks, 48, -116); + if (!screen.machine().input().code_pressed (KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0],TILEMAP_DRAW_OPAQUE, 0); + if (!screen.machine().input().code_pressed (KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); + if (!screen.machine().input().code_pressed (KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); + if (!screen.machine().input().code_pressed (KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); + if (!screen.machine().input().code_pressed (KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); + if (!screen.machine().input().code_pressed (KEYCODE_N)) draw_sprites(screen.machine(), bitmap, cliprect, primasks, 48, -116); #else tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); /* text layer */ - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 48, -116); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 48, -116); #endif return 0; } diff -Nru mame-0.144/src/mame/video/gundealr.c mame-0.145/src/mame/video/gundealr.c --- mame-0.144/src/mame/video/gundealr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gundealr.c 2012-02-06 21:30:32.000000000 +0000 @@ -58,7 +58,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, gundealr_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); } @@ -73,14 +73,14 @@ { gundealr_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( gundealr_fg_videoram_w ) { gundealr_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( gundealr_paletteram_w ) @@ -105,23 +105,23 @@ { gundealr_state *state = space->machine().driver_data(); state->m_scroll[offset] = data; - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll[1] | ((state->m_scroll[0] & 0x03) << 8)); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll[3] | ((state->m_scroll[2] & 0x03) << 8)); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll[1] | ((state->m_scroll[0] & 0x03) << 8)); + state->m_fg_tilemap->set_scrolly(0, state->m_scroll[3] | ((state->m_scroll[2] & 0x03) << 8)); } WRITE8_HANDLER( yamyam_fg_scroll_w ) { gundealr_state *state = space->machine().driver_data(); state->m_scroll[offset] = data; - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll[0] | ((state->m_scroll[1] & 0x03) << 8)); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll[2] | ((state->m_scroll[3] & 0x03) << 8)); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll[0] | ((state->m_scroll[1] & 0x03) << 8)); + state->m_fg_tilemap->set_scrolly(0, state->m_scroll[2] | ((state->m_scroll[3] & 0x03) << 8)); } WRITE8_HANDLER( gundealr_flipscreen_w ) { gundealr_state *state = space->machine().driver_data(); state->m_flipscreen = data; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } @@ -132,10 +132,10 @@ ***************************************************************************/ -SCREEN_UPDATE( gundealr ) +SCREEN_UPDATE_IND16( gundealr ) { - gundealr_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + gundealr_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gunsmoke.c mame-0.145/src/mame/video/gunsmoke.c --- mame-0.144/src/mame/video/gunsmoke.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/gunsmoke.c 2012-02-06 21:30:33.000000000 +0000 @@ -62,14 +62,14 @@ { gunsmoke_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gunsmoke_colorram_w ) { gunsmoke_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( gunsmoke_c804_w ) @@ -126,7 +126,7 @@ int code = state->m_videoram[tile_index] + ((attr & 0xe0) << 2); int color = attr & 0x1f; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO(0, code, color, 0); } @@ -140,7 +140,7 @@ colortable_configure_tilemap_groups(machine.colortable, state->m_fg_tilemap, machine.gfx[0], 0x4f); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { gunsmoke_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -174,22 +174,22 @@ } } -SCREEN_UPDATE( gunsmoke ) +SCREEN_UPDATE_IND16( gunsmoke ) { - gunsmoke_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly[0]); + gunsmoke_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx[0] + 256 * state->m_scrollx[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly[0]); if (state->m_bgon) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (state->m_objon) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (state->m_chon) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/gyruss.c mame-0.145/src/mame/video/gyruss.c --- mame-0.144/src/mame/video/gyruss.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/gyruss.c 2012-02-06 21:30:31.000000000 +0000 @@ -106,7 +106,7 @@ int color = state->m_colorram[tile_index] & 0x0f; int flags = TILE_FLIPYX(state->m_colorram[tile_index] >> 6); - tileinfo->group = (state->m_colorram[tile_index] & 0x10) ? 0 : 1; + tileinfo.group = (state->m_colorram[tile_index] & 0x10) ? 0 : 1; SET_TILE_INFO(2, code, color, flags); } @@ -116,8 +116,8 @@ { gyruss_state *state = machine.driver_data(); state->m_tilemap = tilemap_create(machine, gyruss_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transmask(state->m_tilemap, 0, 0x00, 0); /* opaque */ - tilemap_set_transmask(state->m_tilemap, 1, 0x0f, 0); /* transparent */ + state->m_tilemap->set_transmask(0, 0x00, 0); /* opaque */ + state->m_tilemap->set_transmask(1, 0x0f, 0); /* transparent */ } @@ -129,7 +129,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, gfx_element **gfx ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element **gfx ) { gyruss_state *state = machine.driver_data(); int offs; @@ -150,19 +150,19 @@ } -SCREEN_UPDATE( gyruss ) +SCREEN_UPDATE_IND16( gyruss ) { - gyruss_state *state = screen->machine().driver_data(); + gyruss_state *state = screen.machine().driver_data(); - if (cliprect->min_y == screen->visible_area().min_y) + if (cliprect.min_y == screen.visible_area().min_y) { - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_flip_all(screen->machine(), (*state->m_flipscreen & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + screen.machine().tilemap().mark_all_dirty(); + screen.machine().tilemap().set_flip_all((*state->m_flipscreen & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } - tilemap_draw(bitmap, cliprect, state->m_tilemap, TILEMAP_DRAW_OPAQUE, 0); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().gfx); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().gfx); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/hanaawas.c mame-0.145/src/mame/video/hanaawas.c --- mame-0.144/src/mame/video/hanaawas.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/hanaawas.c 2012-02-06 21:30:33.000000000 +0000 @@ -66,7 +66,7 @@ { hanaawas_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( hanaawas_colorram_w ) @@ -75,8 +75,8 @@ state->m_colorram[offset] = data; /* dirty both current and next offsets */ - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_bg_tilemap, (offset + (flip_screen_get(space->machine()) ? -1 : 1)) & 0x03ff); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_bg_tilemap->mark_tile_dirty((offset + (flip_screen_get(space->machine()) ? -1 : 1)) & 0x03ff); } WRITE8_DEVICE_HANDLER( hanaawas_portB_w ) @@ -85,7 +85,7 @@ if (flip_screen_get(device->machine()) != (~data & 0x80)) { flip_screen_set(device->machine(), ~data & 0x80); - tilemap_mark_all_tiles_dirty_all(device->machine()); + device->machine().tilemap().mark_all_dirty(); } } @@ -108,9 +108,9 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -SCREEN_UPDATE( hanaawas ) +SCREEN_UPDATE_IND16( hanaawas ) { - hanaawas_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + hanaawas_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/harddriv.c mame-0.145/src/mame/video/harddriv.c --- mame-0.144/src/mame/video/harddriv.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/harddriv.c 2012-02-06 21:30:33.000000000 +0000 @@ -423,11 +423,11 @@ } -void harddriv_scanline_driver(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void harddriv_scanline_driver(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { harddriv_state *state = screen.machine().driver_data(); UINT8 *vram_base = &state->m_gsp_vram[(params->rowaddr << 12) & state->m_vram_mask]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = (params->yoffset << 9) + ((params->coladdr & 0xff) << 4) - 15 + (state->m_gfx_finescroll & 0x0f); int x; @@ -439,11 +439,11 @@ } -void harddriv_scanline_multisync(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void harddriv_scanline_multisync(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { harddriv_state *state = screen.machine().driver_data(); UINT8 *vram_base = &state->m_gsp_vram[(params->rowaddr << 11) & state->m_vram_mask]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = (params->yoffset << 9) + ((params->coladdr & 0xff) << 3) - 7 + (state->m_gfx_finescroll & 0x07); int x; diff -Nru mame-0.144/src/mame/video/hcastle.c mame-0.145/src/mame/video/hcastle.c --- mame-0.144/src/mame/video/hcastle.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/hcastle.c 2012-02-06 21:30:31.000000000 +0000 @@ -135,7 +135,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -150,14 +150,14 @@ { hcastle_state *state = space->machine().driver_data(); state->m_pf1_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0xbff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0xbff); } WRITE8_HANDLER( hcastle_pf2_video_w ) { hcastle_state *state = space->machine().driver_data(); state->m_pf2_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0xbff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0xbff); } WRITE8_HANDLER( hcastle_gfxbank_w ) @@ -185,7 +185,7 @@ } else if (offset == 7) { - tilemap_set_flip(state->m_fg_tilemap, (data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_fg_tilemap->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } k007121_ctrl_w(state->m_k007121_1, offset, data); } @@ -203,14 +203,14 @@ } else if (offset == 7) { - tilemap_set_flip(state->m_bg_tilemap, (data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } k007121_ctrl_w(state->m_k007121_2, offset, data); } /*****************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *sbank, int bank ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *sbank, int bank ) { hcastle_state *state = machine.driver_data(); device_t *k007121 = bank ? state->m_k007121_2 : state->m_k007121_1; @@ -222,9 +222,9 @@ /*****************************************************************************/ -SCREEN_UPDATE( hcastle ) +SCREEN_UPDATE_IND16( hcastle ) { - hcastle_state *state = screen->machine().driver_data(); + hcastle_state *state = screen.machine().driver_data(); UINT8 ctrl_1_0 = k007121_ctrlram_r(state->m_k007121_1, 0); UINT8 ctrl_1_1 = k007121_ctrlram_r(state->m_k007121_1, 1); @@ -235,7 +235,7 @@ UINT8 ctrl_2_2 = k007121_ctrlram_r(state->m_k007121_2, 2); UINT8 ctrl_2_3 = k007121_ctrlram_r(state->m_k007121_2, 3); - set_pens(screen->machine()); + set_pens(screen.machine()); state->m_pf1_bankbase = 0x0000; state->m_pf2_bankbase = 0x4000 * ((state->m_gfx_bank & 2) >> 1); @@ -246,34 +246,34 @@ state->m_pf2_bankbase += 0x2000; if (state->m_pf1_bankbase != state->m_old_pf1) - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); if (state->m_pf2_bankbase != state->m_old_pf2) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_old_pf1 = state->m_pf1_bankbase; state->m_old_pf2 = state->m_pf2_bankbase; - tilemap_set_scrolly(state->m_bg_tilemap, 0, ctrl_2_2); - tilemap_set_scrollx(state->m_bg_tilemap, 0, ((ctrl_2_1 << 8) + ctrl_2_0)); - tilemap_set_scrolly(state->m_fg_tilemap, 0, ctrl_1_2); - tilemap_set_scrollx(state->m_fg_tilemap, 0, ((ctrl_1_1 << 8) + ctrl_1_0)); + state->m_bg_tilemap->set_scrolly(0, ctrl_2_2); + state->m_bg_tilemap->set_scrollx(0, ((ctrl_2_1 << 8) + ctrl_2_0)); + state->m_fg_tilemap->set_scrolly(0, ctrl_1_2); + state->m_fg_tilemap->set_scrollx(0, ((ctrl_1_1 << 8) + ctrl_1_0)); // /* Sprite priority */ // if (ctrl_1_3 & 0x20) if ((state->m_gfx_bank & 0x04) == 0) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u8, 0); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u8, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u8, 0); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u8, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u8, 0); - draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u8, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u8, 0); + draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u8, 1); } return 0; } diff -Nru mame-0.144/src/mame/video/hexion.c mame-0.145/src/mame/video/hexion.c --- mame-0.144/src/mame/video/hexion.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/hexion.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,7 +10,7 @@ ***************************************************************************/ -INLINE void get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,UINT8 *ram) +INLINE void get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,UINT8 *ram) { tile_index *= 4; SET_TILE_INFO( @@ -46,9 +46,9 @@ state->m_bg_tilemap[0] = tilemap_create(machine, get_tile_info0,tilemap_scan_rows,8,8,64,32); state->m_bg_tilemap[1] = tilemap_create(machine, get_tile_info1,tilemap_scan_rows, 8,8,64,32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0],0); - tilemap_set_scrollx(state->m_bg_tilemap[1],0,-4); - tilemap_set_scrolly(state->m_bg_tilemap[1],0,4); + state->m_bg_tilemap[0]->set_transparent_pen(0); + state->m_bg_tilemap[1]->set_scrollx(0,-4); + state->m_bg_tilemap[1]->set_scrolly(0,4); state->m_vram[0] = machine.region("maincpu")->base() + 0x30000; state->m_vram[1] = state->m_vram[0] + 0x2000; @@ -76,7 +76,7 @@ { int bank = state->m_unkram[0]&1; memset(state->m_vram[bank],state->m_unkram[1],0x2000); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[bank]); + state->m_bg_tilemap[bank]->mark_all_dirty(); } /* bit 7 = PMC-BK */ state->m_pmcbank = (data & 0x80) >> 7; @@ -124,7 +124,7 @@ { //logerror("%04x: bankedram_w offset %04x, data %02x, bankctrl = %02x\n",cpu_get_pc(&space->device()),offset,data,state->m_bankctrl); state->m_vram[state->m_rambank][offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[state->m_rambank],offset/4); + state->m_bg_tilemap[state->m_rambank]->mark_tile_dirty(offset/4); } else logerror("%04x pmc internal ram %04x = %02x\n",cpu_get_pc(&space->device()),offset,data); @@ -165,10 +165,10 @@ ***************************************************************************/ -SCREEN_UPDATE( hexion ) +SCREEN_UPDATE_IND16( hexion ) { - hexion_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap[1],0,0); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap[0],0,0); + hexion_state *state = screen.machine().driver_data(); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 0,0); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/higemaru.c mame-0.145/src/mame/video/higemaru.c --- mame-0.144/src/mame/video/higemaru.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/higemaru.c 2012-02-06 21:30:33.000000000 +0000 @@ -5,14 +5,14 @@ { higemaru_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( higemaru_colorram_w ) { higemaru_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /*************************************************************************** @@ -87,7 +87,7 @@ if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -106,7 +106,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { higemaru_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -145,10 +145,10 @@ } } -SCREEN_UPDATE( higemaru ) +SCREEN_UPDATE_IND16( higemaru ) { - higemaru_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + higemaru_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/himesiki.c mame-0.145/src/mame/video/himesiki.c --- mame-0.144/src/mame/video/himesiki.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/himesiki.c 2012-02-06 21:30:32.000000000 +0000 @@ -31,7 +31,7 @@ { himesiki_state *state = space->machine().driver_data(); state->m_bg_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( himesiki_scrollx_w ) @@ -50,7 +50,7 @@ logerror("p08_w %02x\n",data); } -static void himesiki_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void himesiki_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { himesiki_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -117,14 +117,14 @@ } } -SCREEN_UPDATE( himesiki ) +SCREEN_UPDATE_IND16( himesiki ) { - himesiki_state *state = screen->machine().driver_data(); + himesiki_state *state = screen.machine().driver_data(); int x = -(state->m_scrollx[0] << 8 | state->m_scrollx[1]) & 0x1ff; - tilemap_set_scrolldx(state->m_bg_tilemap, x, x); + state->m_bg_tilemap->set_scrolldx(x, x); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - himesiki_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + himesiki_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/hnayayoi.c mame-0.145/src/mame/video/hnayayoi.c --- mame-0.144/src/mame/video/hnayayoi.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/hnayayoi.c 2012-02-06 21:30:31.000000000 +0000 @@ -227,17 +227,17 @@ } -static void draw_layer_interleaved( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int left_pixmap, int right_pixmap, int palbase, int transp ) +static void draw_layer_interleaved( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int left_pixmap, int right_pixmap, int palbase, int transp ) { hnayayoi_state *state = machine.driver_data(); int county, countx, pen; UINT8 *src1 = state->m_pixmap[left_pixmap]; UINT8 *src2 = state->m_pixmap[right_pixmap]; - UINT16 *dstbase = (UINT16 *)bitmap->base; + UINT16 *dstbase = &bitmap.pix16(0); palbase *= 16; - for (county = 255; county >= 0; county--, dstbase += bitmap->rowpixels) + for (county = 255; county >= 0; county--, dstbase += bitmap.rowpixels()) { UINT16 *dst = dstbase; @@ -263,9 +263,9 @@ } -SCREEN_UPDATE( hnayayoi ) +SCREEN_UPDATE_IND16( hnayayoi ) { - hnayayoi_state *state = screen->machine().driver_data(); + hnayayoi_state *state = screen.machine().driver_data(); int col0 = (state->m_palbank >> 0) & 0x0f; int col1 = (state->m_palbank >> 4) & 0x0f; int col2 = (state->m_palbank >> 8) & 0x0f; @@ -273,15 +273,15 @@ if (state->m_total_pixmaps == 4) { - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 3, 2, col1, 0); - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 1, 0, col0, 1); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 3, 2, col1, 0); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 1, 0, col0, 1); } else /* total_pixmaps == 8 */ { - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 7, 6, col3, 0); - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 5, 4, col2, 1); - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 3, 2, col1, 1); - draw_layer_interleaved(screen->machine(), bitmap, cliprect, 1, 0, col0, 1); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 7, 6, col3, 0); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 5, 4, col2, 1); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 3, 2, col1, 1); + draw_layer_interleaved(screen.machine(), bitmap, cliprect, 1, 0, col0, 1); } return 0; } diff -Nru mame-0.144/src/mame/video/hng64.c mame-0.145/src/mame/video/hng64.c --- mame-0.144/src/mame/video/hng64.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/hng64.c 2012-02-06 21:30:32.000000000 +0000 @@ -12,27 +12,27 @@ { if (tilemap == 0) { - tilemap_mark_all_tiles_dirty (state->m_tilemap0_8x8); - tilemap_mark_all_tiles_dirty (state->m_tilemap0_16x16); - tilemap_mark_all_tiles_dirty (state->m_tilemap0_16x16_alt); + state->m_tilemap0_8x8->mark_all_dirty(); + state->m_tilemap0_16x16->mark_all_dirty(); + state->m_tilemap0_16x16_alt->mark_all_dirty(); } else if (tilemap == 1) { - tilemap_mark_all_tiles_dirty (state->m_tilemap1_8x8); - tilemap_mark_all_tiles_dirty (state->m_tilemap1_16x16); - tilemap_mark_all_tiles_dirty (state->m_tilemap1_16x16_alt); + state->m_tilemap1_8x8->mark_all_dirty(); + state->m_tilemap1_16x16->mark_all_dirty(); + state->m_tilemap1_16x16_alt->mark_all_dirty(); } else if (tilemap == 2) { - tilemap_mark_all_tiles_dirty (state->m_tilemap2_8x8); - tilemap_mark_all_tiles_dirty (state->m_tilemap2_16x16); - tilemap_mark_all_tiles_dirty (state->m_tilemap2_16x16_alt); + state->m_tilemap2_8x8->mark_all_dirty(); + state->m_tilemap2_16x16->mark_all_dirty(); + state->m_tilemap2_16x16_alt->mark_all_dirty(); } else if (tilemap == 3) { - tilemap_mark_all_tiles_dirty (state->m_tilemap3_8x8); - tilemap_mark_all_tiles_dirty (state->m_tilemap3_16x16); - tilemap_mark_all_tiles_dirty (state->m_tilemap3_16x16_alt); + state->m_tilemap3_8x8->mark_all_dirty(); + state->m_tilemap3_16x16->mark_all_dirty(); + state->m_tilemap3_16x16_alt->mark_all_dirty(); } } @@ -40,27 +40,27 @@ { if (tilemap == 0) { - tilemap_mark_tile_dirty(state->m_tilemap0_8x8, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap0_16x16, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap0_16x16_alt, tile_index); + state->m_tilemap0_8x8->mark_tile_dirty(tile_index); + state->m_tilemap0_16x16->mark_tile_dirty(tile_index); + state->m_tilemap0_16x16_alt->mark_tile_dirty(tile_index); } else if (tilemap == 1) { - tilemap_mark_tile_dirty(state->m_tilemap1_8x8, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap1_16x16, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap1_16x16_alt, tile_index); + state->m_tilemap1_8x8->mark_tile_dirty(tile_index); + state->m_tilemap1_16x16->mark_tile_dirty(tile_index); + state->m_tilemap1_16x16_alt->mark_tile_dirty(tile_index); } else if (tilemap == 2) { - tilemap_mark_tile_dirty(state->m_tilemap2_8x8, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap2_16x16, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap2_16x16_alt, tile_index); + state->m_tilemap2_8x8->mark_tile_dirty(tile_index); + state->m_tilemap2_16x16->mark_tile_dirty(tile_index); + state->m_tilemap2_16x16_alt->mark_tile_dirty(tile_index); } else if (tilemap == 3) { - tilemap_mark_tile_dirty(state->m_tilemap3_8x8, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap3_16x16, tile_index); - tilemap_mark_tile_dirty(state->m_tilemap3_16x16_alt, tile_index); + state->m_tilemap3_8x8->mark_tile_dirty(tile_index); + state->m_tilemap3_16x16->mark_tile_dirty(tile_index); + state->m_tilemap3_16x16_alt->mark_tile_dirty(tile_index); } } @@ -92,14 +92,14 @@ while (0) \ -static void pdrawgfx_transpen_additive(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +static void pdrawgfx_transpen_additive(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - bitmap_t *priority, UINT32 pmask, UINT32 transpen) + bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { const pen_t *paldata; - assert(dest != NULL); - assert(dest->bpp == 32); + assert(dest.valid()); + assert(dest.bpp() == 32); assert(gfx != NULL); /* get final code and color, and grab lookup tables */ @@ -125,9 +125,9 @@ } -static void pdrawgfxzoom_transpen_additive(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +static void pdrawgfxzoom_transpen_additive(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, - UINT32 scalex, UINT32 scaley, bitmap_t *priority, UINT32 pmask, + UINT32 scalex, UINT32 scaley, bitmap_ind8 &priority, UINT32 pmask, UINT32 transpen) { const pen_t *paldata; @@ -140,8 +140,8 @@ return; } - assert(dest != NULL); - assert(dest->bpp == 32); + assert(dest.valid()); + assert(dest.bpp() == 32); assert(gfx != NULL); /* get final code and color, and grab lookup tables */ @@ -207,7 +207,7 @@ * 0x0e0 in Samurai Shodown/Xrally games, 0x1c0 in all the others, zooming factor? */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { hng64_state *state = machine.driver_data(); const gfx_element *gfx; @@ -431,7 +431,7 @@ */ /* this is broken for the 'How to Play' screen in Buriki after attract, disabled for now */ -static void transition_control(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void transition_control(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { hng64_state *state = machine.driver_data(); UINT32 *hng64_tcram = state->m_tcram; @@ -455,11 +455,11 @@ brigG = (INT32)((hng64_tcram[0x0000000a] >> 8) & 0xff); brigB = (INT32)((hng64_tcram[0x0000000a] >> 16) & 0xff); - for (i = cliprect->min_x; i < cliprect->max_x; i++) + for (i = cliprect.min_x; i < cliprect.max_x; i++) { - for (j = cliprect->min_y; j < cliprect->max_y; j++) + for (j = cliprect.min_y; j < cliprect.max_y; j++) { - UINT32* thePixel = BITMAP_ADDR32(bitmap, j, i); + UINT32* thePixel = &bitmap.pix32(j, i); finR = (INT32)RGB_RED(*thePixel); finG = (INT32)RGB_GREEN(*thePixel); @@ -694,7 +694,7 @@ typedef struct _blit_parameters blit_parameters; struct _blit_parameters { - bitmap_t * bitmap; + bitmap_rgb32 * bitmap; rectangle cliprect; UINT32 tilemap_priority_code; UINT8 mask; @@ -705,25 +705,16 @@ -static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_t *dest, const rectangle *cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat) +static void hng64_configure_blit_parameters(blit_parameters *blit, tilemap_t *tmap, bitmap_rgb32 &dest, const rectangle &cliprect, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat) { /* start with nothing */ memset(blit, 0, sizeof(*blit)); /* set the target bitmap */ - blit->bitmap = dest; + blit->bitmap = &dest; /* if we have a cliprect, copy */ - if (cliprect != NULL) - blit->cliprect = *cliprect; - - /* otherwise, make one up */ - else - { - blit->cliprect.min_x = blit->cliprect.min_y = 0; - blit->cliprect.max_x = dest->width - 1; - blit->cliprect.max_y = dest->height - 1; - } + blit->cliprect = cliprect; /* set the priority code and alpha */ //blit->tilemap_priority_code = priority | (priority_mask << 8) | (tmap->palette_offset << 16); // fixit @@ -794,14 +785,14 @@ UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound) { const pen_t *clut = &machine.pens[blit->tilemap_priority_code >> 16]; - bitmap_t *priority_bitmap = machine.priority_bitmap; - bitmap_t *destbitmap = blit->bitmap; - bitmap_t *srcbitmap = tilemap_get_pixmap(tmap); - bitmap_t *flagsmap = tilemap_get_flagsmap(tmap); - const int xmask = srcbitmap->width-1; - const int ymask = srcbitmap->height-1; - const int widthshifted = srcbitmap->width << 16; - const int heightshifted = srcbitmap->height << 16; + bitmap_ind8 &priority_bitmap = machine.priority_bitmap; + bitmap_rgb32 &destbitmap = *blit->bitmap; + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &flagsmap = tmap->flagsmap(); + const int xmask = srcbitmap.width()-1; + const int ymask = srcbitmap.height()-1; + const int widthshifted = srcbitmap.width() << 16; + const int heightshifted = srcbitmap.height() << 16; UINT32 priority = blit->tilemap_priority_code; UINT8 mask = blit->mask; UINT8 value = blit->value; @@ -813,11 +804,10 @@ int sy; int ex; int ey; - void *dest; + UINT32 *dest; UINT8 *pri; const UINT16 *src; const UINT8 *maskptr; - int destadvance = destbitmap->bpp / 8; /* pre-advance based on the cliprect */ startx += blit->cliprect.min_x * incxx + blit->cliprect.min_y * incyx; @@ -855,10 +845,10 @@ cy = starty >> 16; /* get source and priority pointers */ - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); - src = BITMAP_ADDR16(srcbitmap, cy, 0); - maskptr = BITMAP_ADDR8(flagsmap, cy, 0); - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; + pri = &priority_bitmap.pix8(sy, sx); + src = &srcbitmap.pix16(cy); + maskptr = &flagsmap.pix8(cy); + dest = &destbitmap.pix32(sy, sx); /* loop over columns */ while (x <= ex && cx < widthshifted) @@ -873,7 +863,7 @@ /* advance in X */ cx += incxx; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } } @@ -896,16 +886,16 @@ cy = starty; /* get dest and priority pointers */ - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); + dest = &destbitmap.pix32(sy, sx); + pri = &priority_bitmap.pix8(sy, sx); /* loop over columns */ while (x <= ex) { /* plot if we match the mask */ - if ((*BITMAP_ADDR8(flagsmap, (cy >> 16) & ymask, (cx >> 16) & xmask) & mask) == value) + if ((flagsmap.pix8((cy >> 16) & ymask, (cx >> 16) & xmask) & mask) == value) { - HNG64_ROZ_PLOT_PIXEL(*BITMAP_ADDR16(srcbitmap, (cy >> 16) & ymask, (cx >> 16) & xmask)); + HNG64_ROZ_PLOT_PIXEL(srcbitmap.pix16((cy >> 16) & ymask, (cx >> 16) & xmask)); *pri = (*pri & (priority >> 8)) | priority; } @@ -913,7 +903,7 @@ cx += incxx; cy += incxy; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } @@ -936,17 +926,17 @@ cy = starty; /* get dest and priority pointers */ - dest = (UINT8 *)destbitmap->base + (destbitmap->rowpixels * sy + sx) * destadvance; - pri = BITMAP_ADDR8(priority_bitmap, sy, sx); + dest = &destbitmap.pix32(sy, sx); + pri = &priority_bitmap.pix8(sy, sx); /* loop over columns */ while (x <= ex) { /* plot if we're within the bitmap and we match the mask */ if (cx < widthshifted && cy < heightshifted) - if ((*BITMAP_ADDR8(flagsmap, cy >> 16, cx >> 16) & mask) == value) + if ((flagsmap.pix8(cy >> 16, cx >> 16) & mask) == value) { - HNG64_ROZ_PLOT_PIXEL(*BITMAP_ADDR16(srcbitmap, cy >> 16, cx >> 16)); + HNG64_ROZ_PLOT_PIXEL(srcbitmap.pix16(cy >> 16, cx >> 16)); *pri = (*pri & (priority >> 8)) | priority; } @@ -954,7 +944,7 @@ cx += incxx; cy += incxy; x++; - dest = (UINT8 *)dest + destadvance; + dest++; pri++; } @@ -968,7 +958,7 @@ -static void hng64_tilemap_draw_roz_primask(running_machine& machine, bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, +static void hng64_tilemap_draw_roz_primask(running_machine& machine, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound, UINT32 flags, UINT8 priority, UINT8 priority_mask, hng64trans_t drawformat) { @@ -988,7 +978,7 @@ hng64_configure_blit_parameters(&blit, tmap, dest, cliprect, flags, priority, priority_mask, drawformat); /* get the full pixmap for the tilemap */ - tilemap_get_pixmap(tmap); + tmap->pixmap(); /* then do the roz copy */ hng64_tilemap_draw_roz_core(machine, tmap, &blit, startx, starty, incxx, incxy, incyx, incyy, wraparound); @@ -996,7 +986,7 @@ } -INLINE void hng64_tilemap_draw_roz(running_machine& machine, bitmap_t *dest, const rectangle *cliprect, tilemap_t *tmap, +INLINE void hng64_tilemap_draw_roz(running_machine& machine, bitmap_rgb32 &dest, const rectangle &cliprect, tilemap_t *tmap, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound, UINT32 flags, UINT8 priority, hng64trans_t drawformat) { @@ -1005,7 +995,7 @@ -static void hng64_drawtilemap(running_machine& machine, bitmap_t *bitmap, const rectangle *cliprect, int tm ) +static void hng64_drawtilemap(running_machine& machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tm ) { hng64_state *state = machine.driver_data(); UINT32 *hng64_videoregs = state->m_videoregs; @@ -1120,10 +1110,7 @@ int xinc,yinc; const rectangle &visarea = machine.primary_screen->visible_area(); - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + clip = visarea; if (global_tileregs&0x04000000) // globally selects alt scroll register layout??? { @@ -1173,7 +1160,7 @@ xinc = (xmiddle - xtopleft) / 512; yinc = (ymiddle - ytopleft) / 512; - hng64_tilemap_draw_roz(machine, bitmap,&clip,tilemap,xtopleft,ytopleft, + hng64_tilemap_draw_roz(machine, bitmap,clip,tilemap,xtopleft,ytopleft, xinc<<1,0,0,yinc<<1, 1, 0,0, debug_blend_enabled?HNG64_TILEMAP_ADDITIVE:HNG64_TILEMAP_NORMAL); @@ -1240,9 +1227,9 @@ /* manual copy = slooow */ if (MAKE_MAME_REEEEAAALLLL_SLOW) { - bitmap_t *bm = tilemap_get_pixmap(tilemap); - int bmheight = bm->height; - int bmwidth = bm->width; + bitmap_ind16 &bm = tilemap->pixmap(); + int bmheight = bm.height(); + int bmwidth = bm.width(); const pen_t *paldata = machine.pens; UINT32* dstptr; UINT16* srcptr; @@ -1256,7 +1243,7 @@ for (yy=0;yy<448;yy++) { - dstptr = BITMAP_ADDR32(bitmap,yy,0); + dstptr = &bitmap.pix32(yy); tmp = xtopleft; tmp2 = ytopleft; @@ -1267,7 +1254,7 @@ int realsrcy = (ytopleft>>16)&(bmheight-1); UINT16 pen; - srcptr = BITMAP_ADDR16(bm, realsrcy, 0); + srcptr = &bm.pix16(realsrcy); pen = srcptr[realsrcx]; @@ -1338,9 +1325,9 @@ /* manual copy = slooow */ if (MAKE_MAME_REEEEAAALLLL_SLOW) { - bitmap_t *bm = tilemap_get_pixmap(tilemap); - int bmheight = bm->height; - int bmwidth = bm->width; + bitmap_ind16 &bm = tilemap->pixmap(); + int bmheight = bm.height(); + int bmwidth = bm.width(); const pen_t *paldata = machine.pens; UINT32* dstptr; UINT16* srcptr; @@ -1354,8 +1341,8 @@ { int realsrcy = (ytopleft>>16)&(bmheight-1); - dstptr = BITMAP_ADDR32(bitmap,yy,0); - srcptr = BITMAP_ADDR16(bm, realsrcy, 0); + dstptr = &bitmap.pix32(yy); + srcptr = &bm.pix16(realsrcy); xtopleft = tmp; @@ -1446,9 +1433,9 @@ #define IMPORTANT_DIRTY_TILEFLAG_MASK (0x0600) -SCREEN_UPDATE( hng64 ) +SCREEN_UPDATE_RGB32( hng64 ) { - hng64_state *state = screen->machine().driver_data(); + hng64_state *state = screen.machine().driver_data(); UINT32 *hng64_videoregs = state->m_videoregs; UINT32 *hng64_videoram = state->m_videoram; UINT32 *hng64_tcram = state->m_tcram; @@ -1461,15 +1448,15 @@ // press in sams64_2 attract mode for a nice debug screen from the game // not sure how functional it is, and it doesn't appear to test everything (rowscroll modes etc.) // but it could be useful - if ( screen->machine().input().code_pressed_once(KEYCODE_L) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_L) ) { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); space->write_byte(0x2f27c8, 0x2); } #endif - bitmap_fill(bitmap, 0, hng64_tcram[0x50/4] & 0x10000 ? get_black_pen(screen->machine()) : screen->machine().pens[0]); //FIXME: Is the register correct? check with HW tests - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0x00); + bitmap.fill(hng64_tcram[0x50/4] & 0x10000 ? get_black_pen(screen.machine()) : screen.machine().pens[0], cliprect); //FIXME: Is the register correct? check with HW tests + screen.machine().priority_bitmap.fill(0x00, cliprect); if (state->m_screen_dis) return 0; @@ -1539,24 +1526,22 @@ //hng64_mark_all_tiles_dirty(state, 2); //hng64_mark_all_tiles_dirty(state, 3); - hng64_drawtilemap(screen->machine(),bitmap,cliprect, 3); - hng64_drawtilemap(screen->machine(),bitmap,cliprect, 2); - hng64_drawtilemap(screen->machine(),bitmap,cliprect, 1); - hng64_drawtilemap(screen->machine(),bitmap,cliprect, 0); - - draw_sprites(screen->machine(), bitmap,cliprect); + hng64_drawtilemap(screen.machine(),bitmap,cliprect, 3); + hng64_drawtilemap(screen.machine(),bitmap,cliprect, 2); + hng64_drawtilemap(screen.machine(),bitmap,cliprect, 1); + hng64_drawtilemap(screen.machine(),bitmap,cliprect, 0); // 3d really shouldn't be last, but you don't see some cool stuff right now if it's put before sprites. { int x, y; // Blit the color buffer into the primary bitmap - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *src = &state->m_colorBuffer3d[y * (cliprect->max_x-cliprect->min_x)]; - UINT32 *dst = BITMAP_ADDR32(bitmap, y, cliprect->min_x); + UINT32 *src = &state->m_colorBuffer3d[y * cliprect.max_x]; + UINT32 *dst = &bitmap.pix32(y, cliprect.min_x); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { if(*src & 0xff000000) *dst = *src; @@ -1566,11 +1551,12 @@ } } //printf("NEW FRAME!\n"); /* Debug - ajg */ - clear3d(screen->machine()); } + draw_sprites(screen.machine(), bitmap,cliprect); + if(0) - transition_control(screen->machine(), bitmap, cliprect); + transition_control(screen.machine(), bitmap, cliprect); if (0) popmessage("%08x %08x %08x %08x %08x", state->m_spriteregs[0], state->m_spriteregs[1], state->m_spriteregs[2], state->m_spriteregs[3], state->m_spriteregs[4]); @@ -1630,22 +1616,22 @@ hng64_tcram[0x58/4], hng64_tcram[0x5c/4]); - if ( screen->machine().input().code_pressed_once(KEYCODE_T) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_T) ) { state->m_additive_tilemap_debug ^= 1; popmessage("blend changed %02x", state->m_additive_tilemap_debug); } - if ( screen->machine().input().code_pressed_once(KEYCODE_Y) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_Y) ) { state->m_additive_tilemap_debug ^= 2; popmessage("blend changed %02x", state->m_additive_tilemap_debug); } - if ( screen->machine().input().code_pressed_once(KEYCODE_U) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_U) ) { state->m_additive_tilemap_debug ^= 4; popmessage("blend changed %02x", state->m_additive_tilemap_debug); } - if ( screen->machine().input().code_pressed_once(KEYCODE_I) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_I) ) { state->m_additive_tilemap_debug ^= 8; popmessage("blend changed %02x", state->m_additive_tilemap_debug); @@ -1654,6 +1640,13 @@ return 0; } +SCREEN_VBLANK( hng64 ) +{ + // rising edge + if (vblank_on) + clear3d(screen.machine()); +} + VIDEO_START( hng64 ) { hng64_state *state = machine.driver_data(); @@ -1682,28 +1675,28 @@ state->m_tilemap3_16x16 = tilemap_create(machine, get_hng64_tile3_16x16_info, tilemap_scan_rows, 16, 16, 128, 128); /* 128x128x4 = 0x10000 */ state->m_tilemap3_16x16_alt = tilemap_create(machine, get_hng64_tile3_16x16_info, tilemap_scan_rows, 16, 16, 256, 64); /* 128x128x4 = 0x10000 */ - tilemap_set_transparent_pen(state->m_tilemap0_8x8, 0); - tilemap_set_transparent_pen(state->m_tilemap0_16x16, 0); - tilemap_set_transparent_pen(state->m_tilemap0_16x16_alt, 0); - - tilemap_set_transparent_pen(state->m_tilemap1_8x8, 0); - tilemap_set_transparent_pen(state->m_tilemap1_16x16, 0); - tilemap_set_transparent_pen(state->m_tilemap1_16x16_alt, 0); - - tilemap_set_transparent_pen(state->m_tilemap2_8x8, 0); - tilemap_set_transparent_pen(state->m_tilemap2_16x16, 0); - tilemap_set_transparent_pen(state->m_tilemap2_16x16_alt, 0); - - tilemap_set_transparent_pen(state->m_tilemap3_8x8, 0); - tilemap_set_transparent_pen(state->m_tilemap3_16x16, 0); - tilemap_set_transparent_pen(state->m_tilemap3_16x16_alt, 0); + state->m_tilemap0_8x8->set_transparent_pen(0); + state->m_tilemap0_16x16->set_transparent_pen(0); + state->m_tilemap0_16x16_alt->set_transparent_pen(0); + + state->m_tilemap1_8x8->set_transparent_pen(0); + state->m_tilemap1_16x16->set_transparent_pen(0); + state->m_tilemap1_16x16_alt->set_transparent_pen(0); + + state->m_tilemap2_8x8->set_transparent_pen(0); + state->m_tilemap2_16x16->set_transparent_pen(0); + state->m_tilemap2_16x16_alt->set_transparent_pen(0); + + state->m_tilemap3_8x8->set_transparent_pen(0); + state->m_tilemap3_16x16->set_transparent_pen(0); + state->m_tilemap3_16x16_alt->set_transparent_pen(0); // Debug switch, turn on / off additive blending on a per-tilemap basis state->m_additive_tilemap_debug = 0; // 3d Buffer Allocation - state->m_depthBuffer3d = auto_alloc_array(machine, float, (visarea.max_x)*(visarea.max_y)); - state->m_colorBuffer3d = auto_alloc_array(machine, UINT32, (visarea.max_x)*(visarea.max_y)); + state->m_depthBuffer3d = auto_alloc_array(machine, float, (visarea.max_x + 1)*(visarea.max_y + 1)); + state->m_colorBuffer3d = auto_alloc_array(machine, UINT32, (visarea.max_x + 1)*(visarea.max_y + 1)); } diff -Nru mame-0.144/src/mame/video/holeland.c mame-0.145/src/mame/video/holeland.c --- mame-0.144/src/mame/video/holeland.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/holeland.c 2012-02-06 21:30:31.000000000 +0000 @@ -31,7 +31,7 @@ tile_number, state->m_palette_offset + ((attr >> 4) & 0x0f), TILE_FLIPYX((attr >> 2) & 0x03)); - tileinfo->group = (attr >> 4) & 1; + tileinfo.group = (attr >> 4) & 1; } static TILE_GET_INFO( crzrally_get_tile_info ) @@ -45,7 +45,7 @@ tile_number, state->m_palette_offset + ((attr >> 4) & 0x0f), TILE_FLIPYX((attr >> 2) & 0x03)); - tileinfo->group = (attr >> 4) & 1; + tileinfo.group = (attr >> 4) & 1; } /*************************************************************************** @@ -59,8 +59,8 @@ holeland_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, holeland_get_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x01, 0xfe); /* split type 1 has pen 0? transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x01, 0xfe); /* split type 1 has pen 0? transparent in front half */ } VIDEO_START( crzrally ) @@ -73,14 +73,14 @@ { holeland_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( holeland_colorram_w ) { holeland_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( holeland_pal_offs_w ) @@ -90,14 +90,14 @@ { state->m_po[offset] = data & 1; state->m_palette_offset = (state->m_po[0] + (state->m_po[1] << 1)) << 4; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } WRITE8_HANDLER( holeland_scroll_w ) { holeland_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( holeland_flipscreen_w ) @@ -109,7 +109,7 @@ } -static void holeland_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void holeland_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { holeland_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -149,7 +149,7 @@ } } -static void crzrally_draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void crzrally_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { holeland_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -188,20 +188,20 @@ } } -SCREEN_UPDATE( holeland ) +SCREEN_UPDATE_IND16( holeland ) { - holeland_state *state = screen->machine().driver_data(); -/*tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - holeland_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); + holeland_state *state = screen.machine().driver_data(); +/*state->m_bg_tilemap->mark_all_dirty(); */ + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + holeland_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } -SCREEN_UPDATE( crzrally ) +SCREEN_UPDATE_IND16( crzrally ) { - holeland_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - crzrally_draw_sprites(screen->machine(), bitmap, cliprect); + holeland_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + crzrally_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/homedata.c mame-0.145/src/mame/video/homedata.c --- mame-0.144/src/mame/video/homedata.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/homedata.c 2012-02-06 21:30:33.000000000 +0000 @@ -400,7 +400,7 @@ ***************************************************************************/ -INLINE void mrokumei_info0( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int gfxbank ) +INLINE void mrokumei_info0( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x2000 * page; @@ -410,7 +410,7 @@ SET_TILE_INFO( 0, code, color, state->m_flipscreen ); } -INLINE void mrokumei_info1( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int gfxbank ) +INLINE void mrokumei_info1( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x1000 + 0x2000 * page; @@ -446,7 +446,7 @@ } -INLINE void reikaids_info( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int layer, int gfxbank ) +INLINE void reikaids_info( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int layer, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 4 + layer + 0x2000 * page; @@ -517,7 +517,7 @@ } -INLINE void pteacher_info( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int layer, int gfxbank ) +INLINE void pteacher_info( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int layer, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x1000 * layer + 0x2000 * page; @@ -553,7 +553,7 @@ } -INLINE void lemnangl_info( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int layer, int gfxset, int gfxbank ) +INLINE void lemnangl_info( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int layer, int gfxset, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x1000 * layer + 0x2000 * page; @@ -590,7 +590,7 @@ } -INLINE void mirderby_info0( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int gfxbank ) +INLINE void mirderby_info0( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x2000 * page; @@ -600,7 +600,7 @@ SET_TILE_INFO( 0, code, color, state->m_flipscreen ); } -INLINE void mirderby_info1( running_machine &machine, tile_data *tileinfo, int tile_index, int page, int gfxbank ) +INLINE void mirderby_info1( running_machine &machine, tile_data &tileinfo, int tile_index, int page, int gfxbank ) { homedata_state *state = machine.driver_data(); int addr = tile_index * 2 + 0x1000 + 0x2000 * page; @@ -651,8 +651,8 @@ state->m_bg_tilemap[1][0] = tilemap_create( machine, mrokumei_get_info1_0, tilemap_scan_rows, 8, 8, 64, 32 ); state->m_bg_tilemap[1][1] = tilemap_create( machine, mrokumei_get_info1_1, tilemap_scan_rows, 8, 8, 64, 32 ); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][1], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][1], 0); + state->m_bg_tilemap[0][1]->set_transparent_pen(0); + state->m_bg_tilemap[1][1]->set_transparent_pen(0); } VIDEO_START( reikaids ) @@ -667,14 +667,14 @@ state->m_bg_tilemap[1][2] = tilemap_create(machine, reikaids_get_info1_2, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap[1][3] = tilemap_create(machine, reikaids_get_info1_3, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][0], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][1], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][2], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][3], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][0], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][1], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][2], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][3], 0xff); + state->m_bg_tilemap[0][0]->set_transparent_pen(0xff); + state->m_bg_tilemap[0][1]->set_transparent_pen(0xff); + state->m_bg_tilemap[0][2]->set_transparent_pen(0xff); + state->m_bg_tilemap[0][3]->set_transparent_pen(0xff); + state->m_bg_tilemap[1][0]->set_transparent_pen(0xff); + state->m_bg_tilemap[1][1]->set_transparent_pen(0xff); + state->m_bg_tilemap[1][2]->set_transparent_pen(0xff); + state->m_bg_tilemap[1][3]->set_transparent_pen(0xff); } VIDEO_START( pteacher ) @@ -685,8 +685,8 @@ state->m_bg_tilemap[1][0] = tilemap_create(machine, pteacher_get_info1_0, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap[1][1] = tilemap_create(machine, pteacher_get_info1_1, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][1], 0xff); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][1], 0xff); + state->m_bg_tilemap[0][1]->set_transparent_pen(0xff); + state->m_bg_tilemap[1][1]->set_transparent_pen(0xff); } VIDEO_START( lemnangl ) @@ -697,8 +697,8 @@ state->m_bg_tilemap[1][0] = tilemap_create(machine, lemnangl_get_info1_0, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap[1][1] = tilemap_create(machine, lemnangl_get_info1_1, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][1], 0x0f); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][1], 0x0f); + state->m_bg_tilemap[0][1]->set_transparent_pen(0x0f); + state->m_bg_tilemap[1][1]->set_transparent_pen(0x0f); } VIDEO_START( mirderby ) @@ -709,8 +709,8 @@ state->m_bg_tilemap[1][0] = tilemap_create( machine, mirderby_get_info1_0, tilemap_scan_rows, 8, 8, 64, 32 ); state->m_bg_tilemap[1][1] = tilemap_create( machine, mirderby_get_info1_1, tilemap_scan_rows, 8, 8, 64, 32 ); - tilemap_set_transparent_pen(state->m_bg_tilemap[0][1], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1][1], 0); + state->m_bg_tilemap[0][1]->set_transparent_pen(0); + state->m_bg_tilemap[1][1]->set_transparent_pen(0); } /*************************************************************************** @@ -723,14 +723,14 @@ { homedata_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[(offset & 0x2000) >> 13][(offset & 0x1000) >> 12], (offset & 0xffe) >> 1); + state->m_bg_tilemap[(offset & 0x2000) >> 13][(offset & 0x1000) >> 12]->mark_tile_dirty((offset & 0xffe) >> 1); } WRITE8_HANDLER( reikaids_videoram_w ) { homedata_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[(offset & 0x2000) >> 13][offset & 3], (offset & 0xffc) >> 2); + state->m_bg_tilemap[(offset & 0x2000) >> 13][offset & 3]->mark_tile_dirty((offset & 0xffc) >> 2); } @@ -742,7 +742,7 @@ if (state->m_gfx_bank[state->m_reikaids_which] != data) { state->m_gfx_bank[state->m_reikaids_which] = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } state->m_reikaids_which ^= 1; @@ -755,7 +755,7 @@ if (state->m_gfx_bank[0] != data) { state->m_gfx_bank[0] = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -777,7 +777,7 @@ */ if ((state->m_blitter_bank ^ data) & 0x3b) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_blitter_bank = data; } @@ -802,7 +802,7 @@ */ if ((state->m_blitter_bank ^ data) & 0x03) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_blitter_bank = data; } @@ -837,15 +837,15 @@ ***************************************************************************/ -SCREEN_UPDATE( mrokumei ) +SCREEN_UPDATE_IND16( mrokumei ) { - homedata_state *state = screen->machine().driver_data(); + homedata_state *state = screen.machine().driver_data(); int flags,width; /* blank screen */ if (state->m_vreg[0x3] == 0xc1 && state->m_vreg[0x4] == 0xc0 && state->m_vreg[0x5] == 0xff) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -853,7 +853,7 @@ if (flags != state->m_flipscreen) { state->m_flipscreen = flags; - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); } switch (state->m_vreg[0x3]) @@ -872,19 +872,19 @@ width = 54; break; } - screen->set_visible_area(0*8, width*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, width*8-1, 2*8, 30*8-1); - tilemap_set_scrollx(state->m_bg_tilemap[state->m_visible_page][0], 0, state->m_vreg[0xc] << 1); + state->m_bg_tilemap[state->m_visible_page][0]->set_scrollx(0, state->m_vreg[0xc] << 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][0], 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][1], 0, 0); + state->m_bg_tilemap[state->m_visible_page][0]->draw(bitmap, cliprect, 0, 0); + state->m_bg_tilemap[state->m_visible_page][1]->draw(bitmap, cliprect, 0, 0); return 0; } #ifdef UNUSED_FUNCTION -SCREEN_UPDATE( reikaids ) +SCREEN_UPDATE_IND16( reikaids ) { - homedata_state *state = screen->machine().driver_data(); + homedata_state *state = screen.machine().driver_data(); int flags; static const int pritable[8][4] = { @@ -904,22 +904,22 @@ if (flags != state->m_flipscreen) { state->m_flipscreen = flags; - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); } - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); pri = (state->m_bank & 0x70) >> 4; for (i = 0; i < 4; i++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][pritable[pri][3 - i]], 0, 0); + state->m_bg_tilemap[state->m_visible_page][pritable[pri][3 - i]]->draw(bitmap, cliprect, 0, 0); return 0; } #endif -SCREEN_UPDATE( reikaids ) +SCREEN_UPDATE_IND16( reikaids ) { - homedata_state *state = screen->machine().driver_data(); + homedata_state *state = screen.machine().driver_data(); int flags; static const int pritable[2][8][4] = /* table of priorities derived from the PROM */ { @@ -951,29 +951,29 @@ if (flags != state->m_flipscreen) { state->m_flipscreen = flags; - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); } - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); pri = (state->m_blitter_bank & 0x70) >> 4; for (i = 0; i < 4; i++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][pritable[state->m_priority][pri][3 - i]], 0, 0); + state->m_bg_tilemap[state->m_visible_page][pritable[state->m_priority][pri][3 - i]]->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( pteacher ) +SCREEN_UPDATE_IND16( pteacher ) { - homedata_state *state = screen->machine().driver_data(); + homedata_state *state = screen.machine().driver_data(); int flags, scroll_low, scroll_high; /* blank screen */ if (state->m_vreg[0x3] == 0xc1 && state->m_vreg[0x4] == 0xc0 && state->m_vreg[0x5] == 0xff) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -981,7 +981,7 @@ if (flags != state->m_flipscreen) { state->m_flipscreen = flags; - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); } /* bit 2 of blitter_bank stretches characters horizontally by 3/2, @@ -1013,44 +1013,48 @@ if (state->m_vreg[0x4] == 0xae || state->m_vreg[0x4] == 0xb8) { /* kludge for mjkinjas */ - screen->set_visible_area(0*8, 42*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, 42*8-1, 2*8, 30*8-1); scroll_low = 0; } else { if (state->m_vreg[0x3] == 0xa6) - screen->set_visible_area(0*8, 33*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, 33*8-1, 2*8, 30*8-1); else - screen->set_visible_area(0*8, 35*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, 35*8-1, 2*8, 30*8-1); scroll_low = (11 - (state->m_vreg[0x4] & 0x0f)) * 8 / 12; } } else { if (state->m_vreg[0x3] == 0xa6) - screen->set_visible_area(0*8, 51*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, 51*8-1, 2*8, 30*8-1); else - screen->set_visible_area(0*8, 54*8-1, 2*8, 30*8-1); + screen.set_visible_area(0*8, 54*8-1, 2*8, 30*8-1); scroll_low = 7 - (state->m_vreg[0x4] & 0x0f); } scroll_high = state->m_vreg[0xb] >> 2; - tilemap_set_scrollx(state->m_bg_tilemap[state->m_visible_page][0], 0, scroll_high * 8 + scroll_low); - tilemap_set_scrollx(state->m_bg_tilemap[state->m_visible_page][1], 0, scroll_high * 8 + scroll_low); + state->m_bg_tilemap[state->m_visible_page][0]->set_scrollx(0, scroll_high * 8 + scroll_low); + state->m_bg_tilemap[state->m_visible_page][1]->set_scrollx(0, scroll_high * 8 + scroll_low); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][0], 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[state->m_visible_page][1], 0, 0); + state->m_bg_tilemap[state->m_visible_page][0]->draw(bitmap, cliprect, 0, 0); + state->m_bg_tilemap[state->m_visible_page][1]->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( mirderby ) +SCREEN_UPDATE_IND16( mirderby ) { return 0; } -SCREEN_EOF( homedata ) +SCREEN_VBLANK( homedata ) { - homedata_state *state = machine.driver_data(); - state->m_visible_page ^= 1; + // rising edge + if (vblank_on) + { + homedata_state *state = screen.machine().driver_data(); + state->m_visible_page ^= 1; + } } diff -Nru mame-0.144/src/mame/video/homerun.c mame-0.145/src/mame/video/homerun.c --- mame-0.144/src/mame/video/homerun.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/homerun.c 2012-02-06 21:30:33.000000000 +0000 @@ -12,7 +12,7 @@ else state->m_gc_up = data & 3; - tilemap_mark_all_tiles_dirty(state->m_tilemap); + state->m_tilemap->mark_all_dirty(); data >>= 5; memory_set_bank(device->machine(), "bank1", data & 0x07); @@ -22,7 +22,7 @@ { homerun_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset & 0xfff); + state->m_tilemap->mark_tile_dirty(offset & 0xfff); } WRITE8_HANDLER(homerun_color_w) @@ -59,7 +59,7 @@ state->m_tilemap = tilemap_create(machine, get_homerun_tile_info, tilemap_scan_rows, 8, 8, 64, 64); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { homerun_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -82,26 +82,26 @@ } } -SCREEN_UPDATE(homerun) +SCREEN_UPDATE_IND16(homerun) { - homerun_state *state = screen->machine().driver_data(); - rectangle myclip = *cliprect; + homerun_state *state = screen.machine().driver_data(); + rectangle myclip = cliprect; /* upper part */ - tilemap_set_scrollx(state->m_tilemap, 0, state->m_xpc + ((state->m_xpa & 2) << 7) ); - tilemap_set_scrolly(state->m_tilemap, 0, state->m_xpb + ((state->m_xpa & 1) << 8) ); + state->m_tilemap->set_scrollx(0, state->m_xpc + ((state->m_xpa & 2) << 7) ); + state->m_tilemap->set_scrolly(0, state->m_xpb + ((state->m_xpa & 1) << 8) ); myclip.max_y /= 2; state->m_gfx_ctrl = state->m_gc_up; - tilemap_draw(bitmap, &myclip, state->m_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, &myclip); + state->m_tilemap->draw(bitmap, myclip, 0, 0); + draw_sprites(screen.machine(), bitmap, myclip); /* lower part */ myclip.min_y += myclip.max_y; myclip.max_y *= 2; state->m_gfx_ctrl = state->m_gc_down; - tilemap_draw(bitmap, &myclip, state->m_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, &myclip); + state->m_tilemap->draw(bitmap, myclip, 0, 0); + draw_sprites(screen.machine(), bitmap, myclip); state->m_gc_down = state->m_gc_up; return 0; diff -Nru mame-0.144/src/mame/video/hyhoo.c mame-0.145/src/mame/video/hyhoo.c --- mame-0.144/src/mame/video/hyhoo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/hyhoo.c 2012-02-06 21:30:33.000000000 +0000 @@ -148,8 +148,8 @@ pen = MAKE_RGB(pal6bit(r), pal5bit(g), pal5bit(b)); - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx1) = *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx1) | pen; - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx2) = *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx2) | pen; + state->m_tmpbitmap.pix32(dy, dx1) = state->m_tmpbitmap.pix32(dy, dx1) | pen; + state->m_tmpbitmap.pix32(dy, dx2) = state->m_tmpbitmap.pix32(dy, dx2) | pen; } else { @@ -164,8 +164,8 @@ pen = MAKE_RGB(pal6bit(r << 3), pal5bit(g << 2), pal5bit(b << 3)); - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx1) = pen; - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx2) = pen; + state->m_tmpbitmap.pix32(dy, dx1) = pen; + state->m_tmpbitmap.pix32(dy, dx2) = pen; } } } @@ -197,7 +197,7 @@ pen = MAKE_RGB(pal6bit(r << 3), pal5bit(g << 2), pal5bit(b << 3)); - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx1) = pen; + state->m_tmpbitmap.pix32(dy, dx1) = pen; } if (state->m_clut[color2]) @@ -211,7 +211,7 @@ pen = MAKE_RGB(pal6bit(r << 3), pal5bit(g << 2), pal5bit(b << 3)); - *BITMAP_ADDR32(state->m_tmpbitmap, dy, dx2) = pen; + state->m_tmpbitmap.pix32(dy, dx2) = pen; } } @@ -227,17 +227,17 @@ VIDEO_START( hyhoo ) { hyhoo_state *state = machine.driver_data(); - state->m_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); } -SCREEN_UPDATE( hyhoo ) +SCREEN_UPDATE_RGB32( hyhoo ) { - hyhoo_state *state = screen->machine().driver_data(); + hyhoo_state *state = screen.machine().driver_data(); if (state->m_dispflag) copybitmap(bitmap, state->m_tmpbitmap, state->m_flipscreen, state->m_flipscreen, 0, 0, cliprect); else - bitmap_fill(bitmap, cliprect, RGB_BLACK); + bitmap.fill(RGB_BLACK, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/hyperspt.c mame-0.145/src/mame/video/hyperspt.c --- mame-0.144/src/mame/video/hyperspt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/hyperspt.c 2012-02-06 21:30:32.000000000 +0000 @@ -93,14 +93,14 @@ { hyperspt_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( hyperspt_colorram_w ) { hyperspt_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( hyperspt_flipscreen_w ) @@ -108,7 +108,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -127,10 +127,10 @@ hyperspt_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { hyperspt_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -174,20 +174,20 @@ } } -SCREEN_UPDATE( hyperspt ) +SCREEN_UPDATE_IND16( hyperspt ) { - hyperspt_state *state = screen->machine().driver_data(); + hyperspt_state *state = screen.machine().driver_data(); int row; for (row = 0; row < 32; row++) { int scrollx = state->m_scroll[row * 2] + (state->m_scroll[(row * 2) + 1] & 0x01) * 256; - if (flip_screen_get(screen->machine())) scrollx = -scrollx; - tilemap_set_scrollx(state->m_bg_tilemap, row, scrollx); + if (flip_screen_get(screen.machine())) scrollx = -scrollx; + state->m_bg_tilemap->set_scrollx(row, scrollx); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -207,5 +207,5 @@ hyperspt_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, roadf_get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } diff -Nru mame-0.144/src/mame/video/hyprduel.c mame-0.145/src/mame/video/hyprduel.c --- mame-0.144/src/mame/video/hyprduel.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/hyprduel.c 2012-02-06 21:30:32.000000000 +0000 @@ -104,7 +104,7 @@ /* 8x8x4 tiles only */ -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int layer, UINT16 *vram) { hyprduel_state *state = machine.driver_data(); UINT16 code; @@ -125,14 +125,14 @@ if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = state->m_empty_tiles + _code * 16 * 16; - tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; - tileinfo->flags = 0; - tileinfo->group = 0; + tileinfo.pen_data = state->m_empty_tiles + _code * 16 * 16; + tileinfo.palette_base = ((code & 0x0ff0)) + 0x1000; + tileinfo.flags = 0; + tileinfo.group = 0; } else { - tileinfo->group = 0; + tileinfo.group = 0; SET_TILE_INFO( 0, (tile & 0xfffff) + (code & 0xf), @@ -143,7 +143,7 @@ /* 8x8x4 or 8x8x8 tiles. It's the tile's color that decides: if its low 4 bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */ -INLINE void get_tile_info_8bit( running_machine &machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram ) +INLINE void get_tile_info_8bit( running_machine &machine, tile_data &tileinfo, int tile_index, int layer, UINT16 *vram ) { hyprduel_state *state = machine.driver_data(); UINT16 code; @@ -164,14 +164,14 @@ if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = state->m_empty_tiles + _code * 16 * 16; - tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; - tileinfo->flags = 0; - tileinfo->group = 0; + tileinfo.pen_data = state->m_empty_tiles + _code * 16 * 16; + tileinfo.palette_base = ((code & 0x0ff0)) + 0x1000; + tileinfo.flags = 0; + tileinfo.group = 0; } else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */ { - tileinfo->group = 1; + tileinfo.group = 1; SET_TILE_INFO( 1, (tile & 0xfffff) + 2*(code & 0xf), @@ -180,7 +180,7 @@ } else { - tileinfo->group = 0; + tileinfo.group = 0; SET_TILE_INFO( 0, (tile & 0xfffff) + (code & 0xf), @@ -191,7 +191,7 @@ /* 16x16x4 or 16x16x8 tiles. It's the tile's color that decides: if its low 4 bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */ -INLINE void get_tile_info_16x16_8bit( running_machine &machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram ) +INLINE void get_tile_info_16x16_8bit( running_machine &machine, tile_data &tileinfo, int tile_index, int layer, UINT16 *vram ) { hyprduel_state *state = machine.driver_data(); UINT16 code; @@ -212,14 +212,14 @@ if (code & 0x8000) /* Special: draw a tile of a single color (i.e. not from the gfx ROMs) */ { int _code = code & 0x000f; - tileinfo->pen_data = state->m_empty_tiles + _code * 16 * 16; - tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000; - tileinfo->flags = 0; - tileinfo->group = 0; + tileinfo.pen_data = state->m_empty_tiles + _code * 16 * 16; + tileinfo.palette_base = ((code & 0x0ff0)) + 0x1000; + tileinfo.flags = 0; + tileinfo.group = 0; } else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */ { - tileinfo->group = 1; + tileinfo.group = 1; SET_TILE_INFO( 3, (tile & 0xfffff) + 8*(code & 0xf), @@ -228,7 +228,7 @@ } else { - tileinfo->group = 0; + tileinfo.group = 0; SET_TILE_INFO( 2, (tile & 0xfffff) + 4*(code & 0xf), @@ -251,7 +251,7 @@ if (row < -(BIG_NY-WIN_NY)) row += (BIG_NY-WIN_NY) + WIN_NY; if ((col >= 0) && (col < WIN_NX) && (row >= 0) && (row < WIN_NY)) - tilemap_mark_tile_dirty(state->m_bg_tilemap[layer], row * WIN_NX + col); + state->m_bg_tilemap[layer]->mark_tile_dirty(row * WIN_NX + col); } } @@ -303,7 +303,7 @@ if (newdata != olddata) { offset /= 2; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[offset]); + state->m_bg_tilemap[offset]->mark_all_dirty(); } } @@ -343,17 +343,31 @@ UINT16 wx = state->m_window[i * 2 + 1]; UINT16 wy = state->m_window[i * 2 + 0]; - tilemap_set_scrollx(state->m_bg_tilemap[i], 0, state->m_scroll[i * 2 + 1] - wx - (wx & 7)); - tilemap_set_scrolly(state->m_bg_tilemap[i], 0, state->m_scroll[i * 2 + 0] - wy - (wy & 7)); + state->m_bg_tilemap[i]->set_scrollx(0, state->m_scroll[i * 2 + 1] - wx - (wx & 7)); + state->m_bg_tilemap[i]->set_scrolly(0, state->m_scroll[i * 2 + 0] - wy - (wy & 7)); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[i]); + state->m_bg_tilemap[i]->mark_all_dirty(); } } +static void expand_gfx1(hyprduel_state &state) +{ + UINT8 *base_gfx = state.machine().region("gfx1")->base(); + UINT32 length = 2 * state.machine().region("gfx1")->bytes(); + state.m_expanded_gfx1 = auto_alloc_array(state.machine(), UINT8, length); + for (int i = 0; i < length; i += 2) + { + UINT8 src = base_gfx[i / 2]; + state.m_expanded_gfx1[i+0] = src & 15; + state.m_expanded_gfx1[i+1] = src >> 4; + } +} + static VIDEO_START( common_14220 ) { hyprduel_state *state = machine.driver_data(); + expand_gfx1(*state); alloc_empty_tiles(machine); state->m_tiletable_old = auto_alloc_array(machine, UINT16, state->m_tiletable_size / 2); state->m_dirtyindex = auto_alloc_array(machine, UINT8, state->m_tiletable_size / 4); @@ -365,18 +379,18 @@ state->m_bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); state->m_bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY); - tilemap_map_pen_to_layer(state->m_bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[0]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[0]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[1]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[1]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT); - tilemap_map_pen_to_layer(state->m_bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[2]->map_pen_to_layer(0, 15, TILEMAP_PIXEL_TRANSPARENT); + state->m_bg_tilemap[2]->map_pen_to_layer(1, 255, TILEMAP_PIXEL_TRANSPARENT); - tilemap_set_scrolldx(state->m_bg_tilemap[0], 0, 0); - tilemap_set_scrolldx(state->m_bg_tilemap[1], 0, 0); - tilemap_set_scrolldx(state->m_bg_tilemap[2], 0, 0); + state->m_bg_tilemap[0]->set_scrolldx(0, 0); + state->m_bg_tilemap[1]->set_scrolldx(0, 0); + state->m_bg_tilemap[2]->set_scrolldx(0, 0); /* Set up save state */ state->save_item(NAME(state->m_sprite_xoffs)); @@ -459,11 +473,12 @@ /* Draw sprites */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { hyprduel_state *state = machine.driver_data(); - UINT8 *base_gfx = machine.region("gfx1")->base(); - UINT8 *gfx_max = base_gfx + machine.region("gfx1")->bytes(); + UINT8 *base_gfx4 = state->m_expanded_gfx1; + UINT8 *base_gfx8 = machine.region("gfx1")->base(); + UINT32 gfx_size = machine.region("gfx1")->bytes(); int max_x = machine.primary_screen->width(); int max_y = machine.primary_screen->height(); @@ -498,7 +513,6 @@ for (j = 0; j < sprites; j++) { int x, y, attr, code, color, flipx, flipy, zoom, curr_pri, width, height; - UINT8 *gfxdata; /* Exponential zoom table extracted from daitoride */ static const int zoomtable[0x40] = @@ -546,7 +560,7 @@ width = (((attr >> 11) & 0x7) + 1) * 8; height = (((attr >> 8) & 0x7) + 1) * 8; - gfxdata = base_gfx + (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code); + UINT32 gfxstart = (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code); if (flip_screen_get(machine)) { @@ -557,10 +571,10 @@ if (color == 0xf) /* 8bpp */ { /* Bounds checking */ - if ((gfxdata + width * height - 1) >= gfx_max) + if ((gfxstart + width * height - 1) >= gfx_size) continue; - gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width, 0, 256, 0); + gfx_element_build_temporary(&gfx, machine, base_gfx8 + gfxstart, width, height, width, 0, 256, 0); pdrawgfxzoom_transpen(bitmap,cliprect, &gfx, 0, @@ -573,10 +587,10 @@ else { /* Bounds checking */ - if ( (gfxdata + width / 2 * height - 1) >= gfx_max ) + if ((gfxstart + width / 2 * height - 1) >= gfx_size) continue; - gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width / 2, 0, 16, GFX_ELEMENT_PACKED); + gfx_element_build_temporary(&gfx, machine, base_gfx4 + 2 * gfxstart, width, height, width, 0, 16, 0); pdrawgfxzoom_transpen(bitmap,cliprect, &gfx, 0, @@ -610,9 +624,9 @@ COMBINE_DATA(&state->m_scroll[offset]); if (offset & 0x01) - tilemap_set_scrollx(state->m_bg_tilemap[offset / 2], 0, state->m_scroll[offset] - window - (window & 7)); + state->m_bg_tilemap[offset / 2]->set_scrollx(0, state->m_scroll[offset] - window - (window & 7)); else - tilemap_set_scrolly(state->m_bg_tilemap[offset / 2], 0, state->m_scroll[offset] - window - (window & 7)); + state->m_bg_tilemap[offset / 2]->set_scrolly(0, state->m_scroll[offset] - window - (window & 7)); } WRITE16_HANDLER( hyprduel_scrollreg_init_w ) @@ -628,13 +642,13 @@ state->m_scroll[i * 2 + 1] = data; state->m_scroll[i * 2 + 0] = data; - tilemap_set_scrollx(state->m_bg_tilemap[i], 0, data - wx - (wx & 7)); - tilemap_set_scrolly(state->m_bg_tilemap[i], 0, data - wy - (wy & 7)); + state->m_bg_tilemap[i]->set_scrollx(0, data - wx - (wx & 7)); + state->m_bg_tilemap[i]->set_scrolly(0, data - wy - (wy & 7)); } } -static void draw_layers( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int layers_ctrl ) +static void draw_layers( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, int layers_ctrl ) { hyprduel_state *state = machine.driver_data(); UINT16 layers_pri = state->m_videoregs[0x10/2]; @@ -646,7 +660,7 @@ if ( pri == ((layers_pri >> (layer*2)) & 3) ) { if (layers_ctrl & (1 << layer)) // for debug - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer], 0, 1 << (3 - pri)); + state->m_bg_tilemap[layer]->draw(bitmap, cliprect, 0, 1 << (3 - pri)); } } } @@ -665,15 +679,15 @@ UINT16 code = vram[offset]; if (!(code & 0x8000) && state->m_dirtyindex[(code & 0x1ff0) >> 4]) - tilemap_mark_tile_dirty(state->m_bg_tilemap[layer], row * WIN_NX + col); + state->m_bg_tilemap[layer]->mark_tile_dirty(row * WIN_NX + col); } } } -SCREEN_UPDATE( hyprduel ) +SCREEN_UPDATE_IND16( hyprduel ) { - hyprduel_state *state = screen->machine().driver_data(); + hyprduel_state *state = screen.machine().driver_data(); int i, pri, layers_ctrl = -1; UINT16 screenctrl = *state->m_screenctrl; @@ -696,18 +710,18 @@ if (dirty) { - dirty_tiles(screen->machine(), 0, state->m_vram_0); - dirty_tiles(screen->machine(), 1, state->m_vram_1); - dirty_tiles(screen->machine(), 2, state->m_vram_2); + dirty_tiles(screen.machine(), 0, state->m_vram_0); + dirty_tiles(screen.machine(), 1, state->m_vram_1); + dirty_tiles(screen.machine(), 2, state->m_vram_2); } } - state->m_sprite_xoffs = state->m_videoregs[0x06 / 2] - screen->width() / 2; - state->m_sprite_yoffs = state->m_videoregs[0x04 / 2] - screen->height() / 2 - state->m_sprite_yoffs_sub; + state->m_sprite_xoffs = state->m_videoregs[0x06 / 2] - screen.width() / 2; + state->m_sprite_yoffs = state->m_videoregs[0x04 / 2] - screen.height() / 2 - state->m_sprite_yoffs_sub; /* The background color is selected by a register */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, ((state->m_videoregs[0x12 / 2] & 0x0fff)) + 0x1000); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill((state->m_videoregs[0x12 / 2] & 0x0fff) + 0x1000, cliprect); /* Screen Control Register: @@ -722,18 +736,18 @@ ---- ---- ---- ---0 Flip Screen */ if (screenctrl & 2) return 0; - flip_screen_set(screen->machine(), screenctrl & 1); + flip_screen_set(screen.machine(), screenctrl & 1); #if 0 -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 0x01; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 0x02; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 0x04; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 0x08; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 0x01; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 0x02; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 0x04; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 0x08; if (msk != 0) { - bitmap_fill(bitmap, cliprect,0); + bitmap.fill(0, cliprect); layers_ctrl &= msk; } @@ -745,10 +759,10 @@ #endif for (pri = 3; pri >= 0; pri--) - draw_layers(screen->machine(), bitmap, cliprect, pri, layers_ctrl); + draw_layers(screen.machine(), bitmap, cliprect, pri, layers_ctrl); if (layers_ctrl & 0x08) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/ikki.c mame-0.145/src/mame/video/ikki.c --- mame-0.144/src/mame/video/ikki.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ikki.c 2012-02-06 21:30:32.000000000 +0000 @@ -62,14 +62,14 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ikki_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int y; offs_t offs; - bitmap_fill(state->m_sprite_bitmap, cliprect, state->m_punch_through_pen); + state->m_sprite_bitmap.fill(state->m_punch_through_pen, cliprect); for (offs = 0; offs < state->m_spriteram_size; offs += 4) { @@ -101,16 +101,16 @@ } /* copy the sprite bitmap into the main bitmap, skipping the transparent pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - UINT16 pen = *BITMAP_ADDR16(state->m_sprite_bitmap, y, x); + UINT16 pen = state->m_sprite_bitmap.pix16(y, x); if (colortable_entry_get_value(machine.colortable, pen) != 0x100) - *BITMAP_ADDR16(bitmap, y, x) = pen; + bitmap.pix16(y, x) = pen; } } } @@ -119,16 +119,16 @@ VIDEO_START( ikki ) { ikki_state *state = machine.driver_data(); - state->m_sprite_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - state->save_item(NAME(*state->m_sprite_bitmap)); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); + state->save_item(NAME(state->m_sprite_bitmap)); } -SCREEN_UPDATE( ikki ) +SCREEN_UPDATE_IND16( ikki ) { - ikki_state *state = screen->machine().driver_data(); + ikki_state *state = screen.machine().driver_data(); offs_t offs; - UINT8 *VIDEOATTR = screen->machine().region("user1")->base(); + UINT8 *VIDEOATTR = screen.machine().region("user1")->base(); /* draw bg layer */ @@ -178,14 +178,14 @@ bank = (color & 0xe0) << 3; color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2); - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs * 2 + 1] + bank, color, state->m_flipscreen,state->m_flipscreen, x,y); } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); /* mask sprites */ @@ -213,7 +213,7 @@ bank = (color & 0xe0) << 3; color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2); - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs * 2 + 1] + bank, color, state->m_flipscreen,state->m_flipscreen, diff -Nru mame-0.144/src/mame/video/inufuku.c mame-0.145/src/mame/video/inufuku.c --- mame-0.144/src/mame/video/inufuku.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/inufuku.c 2012-02-06 21:30:31.000000000 +0000 @@ -27,10 +27,10 @@ switch (offset) { case 0x02: state->m_bg_palettebank = (data & 0xf000) >> 12; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); break; case 0x03: state->m_tx_palettebank = (data & 0xf000) >> 12; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); break; } } @@ -55,7 +55,7 @@ ******************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { inufuku_state *state = machine.driver_data(); int offs; @@ -193,7 +193,7 @@ { inufuku_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ16_HANDLER( inufuku_tx_videoram_r ) @@ -206,7 +206,7 @@ { inufuku_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -223,8 +223,8 @@ state->m_bg_tilemap = tilemap_create(machine, get_inufuku_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_tx_tilemap = tilemap_create(machine, get_inufuku_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_bg_tilemap, 255); - tilemap_set_transparent_pen(state->m_tx_tilemap, 255); + state->m_bg_tilemap->set_transparent_pen(255); + state->m_tx_tilemap->set_transparent_pen(255); } @@ -234,32 +234,32 @@ ******************************************************************************/ -SCREEN_UPDATE( inufuku ) +SCREEN_UPDATE_IND16( inufuku ) { - inufuku_state *state = screen->machine().driver_data(); + inufuku_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0); if (state->m_bg_raster) { - tilemap_set_scroll_rows(state->m_bg_tilemap, 512); + state->m_bg_tilemap->set_scroll_rows(512); for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_bg_tilemap, (state->m_bg_scrolly + i) & 0x1ff, state->m_bg_rasterram[i]); + state->m_bg_tilemap->set_scrollx((state->m_bg_scrolly + i) & 0x1ff, state->m_bg_rasterram[i]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap, 1); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scroll_rows(1); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); } - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_tx_scrollx); - tilemap_set_scrolly(state->m_tx_tilemap, 0, state->m_tx_scrolly); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); + state->m_tx_tilemap->set_scrollx(0, state->m_tx_scrollx); + state->m_tx_tilemap->set_scrolly(0, state->m_tx_scrolly); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/iqblock.c mame-0.145/src/mame/video/iqblock.c --- mame-0.144/src/mame/video/iqblock.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/iqblock.c 2012-02-06 21:30:31.000000000 +0000 @@ -44,8 +44,8 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8, 8,64,32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,32,64, 8); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_scroll_cols(state->m_fg_tilemap,64); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scroll_cols(64); } @@ -60,14 +60,14 @@ { iqblock_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( iqblock_bgvideoram_w ) { iqblock_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } READ8_HANDLER( iqblock_bgvideoram_r ) @@ -79,7 +79,7 @@ WRITE8_HANDLER( iqblock_fgscroll_w ) { iqblock_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_fg_tilemap,offset,data); + state->m_fg_tilemap->set_scrolly(offset,data); } @@ -90,12 +90,12 @@ ***************************************************************************/ -SCREEN_UPDATE( iqblock ) +SCREEN_UPDATE_IND16( iqblock ) { - iqblock_state *state = screen->machine().driver_data(); + iqblock_state *state = screen.machine().driver_data(); if (!state->m_videoenable) return 0; - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/irobot.c mame-0.145/src/mame/video/irobot.c --- mame-0.144/src/mame/video/irobot.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/irobot.c 2012-02-06 21:30:32.000000000 +0000 @@ -346,15 +346,15 @@ -SCREEN_UPDATE( irobot ) +SCREEN_UPDATE_IND16( irobot ) { - irobot_state *state = screen->machine().driver_data(); + irobot_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT8 *bitmap_base = state->m_bufsel ? state->m_polybitmap1 : state->m_polybitmap2; int x, y, offs; /* copy the polygon bitmap */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) draw_scanline8(bitmap, 0, y, BITMAP_WIDTH, &bitmap_base[y * BITMAP_WIDTH], NULL); /* redraw the non-zero characters in the alpha layer */ @@ -364,7 +364,7 @@ int code = videoram[offs] & 0x3f; int color = ((videoram[offs] & 0xc0) >> 6) | (state->m_alphamap >> 3); - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, 0,0, 8*x,8*y,0); diff -Nru mame-0.144/src/mame/video/ironhors.c mame-0.145/src/mame/video/ironhors.c --- mame-0.144/src/mame/video/ironhors.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ironhors.c 2012-02-06 21:30:32.000000000 +0000 @@ -82,14 +82,14 @@ { ironhors_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ironhors_colorram_w ) { ironhors_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ironhors_charbank_w ) @@ -98,7 +98,7 @@ if (state->m_charbank != (data & 0x03)) { state->m_charbank = data & 0x03; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } state->m_spriterambank = data & 0x08; @@ -112,7 +112,7 @@ if (state->m_palettebank != (data & 0x07)) { state->m_palettebank = data & 0x07; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } coin_counter_w(space->machine(), 0, data & 0x10); @@ -129,7 +129,7 @@ if (flip_screen_get(space->machine()) != (~data & 0x08)) { flip_screen_set(space->machine(), ~data & 0x08); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* other bits are used too, but unknown */ @@ -152,10 +152,10 @@ ironhors_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ironhors_state *state = machine.driver_data(); int offs; @@ -239,16 +239,16 @@ } } -SCREEN_UPDATE( ironhors ) +SCREEN_UPDATE_IND16( ironhors ) { - ironhors_state *state = screen->machine().driver_data(); + ironhors_state *state = screen.machine().driver_data(); int row; for (row = 0; row < 32; row++) - tilemap_set_scrollx(state->m_bg_tilemap, row, state->m_scroll[row]); + state->m_bg_tilemap->set_scrollx(row, state->m_scroll[row]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -268,10 +268,10 @@ ironhors_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, farwest_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void farwest_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void farwest_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ironhors_state *state = machine.driver_data(); int offs; @@ -352,16 +352,16 @@ } } -SCREEN_UPDATE( farwest) +SCREEN_UPDATE_IND16( farwest) { - ironhors_state *state = screen->machine().driver_data(); + ironhors_state *state = screen.machine().driver_data(); int row; for (row = 0; row < 32; row++) - tilemap_set_scrollx(state->m_bg_tilemap, row, state->m_scroll[row]); + state->m_bg_tilemap->set_scrollx(row, state->m_scroll[row]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - farwest_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + farwest_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/itech32.c mame-0.145/src/mame/video/itech32.c --- mame-0.144/src/mame/video/itech32.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/itech32.c 2012-02-06 21:30:31.000000000 +0000 @@ -140,12 +140,8 @@ INLINE void disable_clipping(itech32_state *state) { state->m_clip_save = state->m_clip_rect; - - state->m_clip_rect.min_x = state->m_clip_rect.min_y = 0; - state->m_clip_rect.max_x = state->m_clip_rect.max_y = 0xfff; - - state->m_scaled_clip_rect.min_x = state->m_scaled_clip_rect.min_y = 0; - state->m_scaled_clip_rect.max_x = state->m_scaled_clip_rect.max_y = 0xfff << 8; + state->m_clip_rect.set(0, 0xfff, 0, 0xfff); + state->m_scaled_clip_rect.set(0, 0xfff << 8, 0, 0xfff << 8); } INLINE void enable_clipping(itech32_state *state) @@ -561,8 +557,7 @@ /* render all pixels */ sx = startx; for (x = 0; x < width && sx < state->m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) - if (ty >= state->m_scaled_clip_rect.min_y && ty < state->m_scaled_clip_rect.max_y && - sx >= state->m_scaled_clip_rect.min_x && sx < state->m_scaled_clip_rect.max_x) + if (state->m_scaled_clip_rect.contains(sx, ty)) { int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen) @@ -747,8 +742,7 @@ if (state->m_drivedge_zbuf_control[3] & 0x8000) { for (x = 0; x < width && sx < state->m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) - if (ty >= state->m_scaled_clip_rect.min_y && ty < state->m_scaled_clip_rect.max_y && - sx >= state->m_scaled_clip_rect.min_x && sx < state->m_scaled_clip_rect.max_x) + if (state->m_scaled_clip_rect.contains(sx, ty)) { int pixel = rowsrc[x >> 8]; if (pixel != transparent_pen) @@ -762,8 +756,7 @@ else if (state->m_drivedge_zbuf_control[3] & 0x4000) { for (x = 0; x < width && sx < state->m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) - if (ty >= state->m_scaled_clip_rect.min_y && ty < state->m_scaled_clip_rect.max_y && - sx >= state->m_scaled_clip_rect.min_x && sx < state->m_scaled_clip_rect.max_x) + if (state->m_scaled_clip_rect.contains(sx, ty)) { int pixel = rowsrc[x >> 8]; UINT16 *zbuf = &zbase[compute_safe_address(state, sx >> 8, ty >> 8)]; @@ -778,8 +771,7 @@ else { for (x = 0; x < width && sx < state->m_scaled_clip_rect.max_x; x += xsrcstep, sx += xdststep, ty += ystep) - if (ty >= state->m_scaled_clip_rect.min_y && ty < state->m_scaled_clip_rect.max_y && - sx >= state->m_scaled_clip_rect.min_x && sx < state->m_scaled_clip_rect.max_x) + if (state->m_scaled_clip_rect.contains(sx, ty)) { int pixel = rowsrc[x >> 8]; UINT16 *zbuf = &zbase[compute_safe_address(state, sx >> 8, ty >> 8)]; @@ -1430,13 +1422,13 @@ * *************************************/ -SCREEN_UPDATE( itech32 ) +SCREEN_UPDATE_IND16( itech32 ) { - itech32_state *state = screen->machine().driver_data(); + itech32_state *state = screen.machine().driver_data(); int y; /* loop over height */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *src1 = &state->m_videoplane[0][compute_safe_address(state, VIDEO_DISPLAY_XORIGIN1, VIDEO_DISPLAY_YORIGIN1 + y)]; @@ -1448,7 +1440,7 @@ int x; /* blend the pixels in the scanline; color xxFF is transparent */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pixel = src1[x]; if ((pixel & 0xff) == 0xff) @@ -1457,12 +1449,12 @@ } /* draw from the buffer */ - draw_scanline16(bitmap, cliprect->min_x, y, cliprect->max_x - cliprect->min_x + 1, &scanline[cliprect->min_x], NULL); + draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &scanline[cliprect.min_x], NULL); } /* otherwise, draw directly from VRAM */ else - draw_scanline16(bitmap, cliprect->min_x, y, cliprect->max_x - cliprect->min_x + 1, &src1[cliprect->min_x], NULL); + draw_scanline16(bitmap, cliprect.min_x, y, cliprect.width(), &src1[cliprect.min_x], NULL); } return 0; } diff -Nru mame-0.144/src/mame/video/itech8.c mame-0.145/src/mame/video/itech8.c --- mame-0.144/src/mame/video/itech8.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/itech8.c 2012-02-06 21:30:32.000000000 +0000 @@ -608,13 +608,13 @@ * *************************************/ -SCREEN_UPDATE( itech8_2layer ) +SCREEN_UPDATE_RGB32( itech8_2layer ) { - itech8_state *state = screen->machine().driver_data(); + itech8_state *state = screen.machine().driver_data(); struct tms34061_display &tms_state = state->m_tms_state; UINT32 page_offset; int x, y; - const rgb_t *pens = tlc34076_get_pens(screen->machine().device("tlc34076")); + const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); /* first get the current display state */ tms34061_get_display_state(&tms_state); @@ -622,7 +622,7 @@ /* if we're blanked, just fill with black */ if (tms_state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -630,13 +630,13 @@ /* top layer @ 0x00000 is only 4bpp, colors come from the first 16 palettes */ /* bottom layer @ 0x20000 is full 8bpp */ page_offset = tms_state.dispstart & 0x0ffff; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *base0 = &tms_state.vram[(0x00000 + page_offset + y * 256) & 0x3ffff]; UINT8 *base2 = &tms_state.vram[(0x20000 + page_offset + y * 256) & 0x3ffff]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pix0 = base0[x] & 0x0f; dest[x] = pens[pix0 ? pix0 : base2[x]]; @@ -646,9 +646,9 @@ } -SCREEN_UPDATE( itech8_grmatch ) +SCREEN_UPDATE_RGB32( itech8_grmatch ) { - itech8_state *state = screen->machine().driver_data(); + itech8_state *state = screen.machine().driver_data(); struct tms34061_display &tms_state = state->m_tms_state; UINT32 page_offset; int x, y; @@ -659,7 +659,7 @@ /* if we're blanked, just fill with black */ if (tms_state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -669,13 +669,13 @@ /* 4bpp pixels are packed 2 to a byte */ /* xscroll is set via a separate register */ page_offset = (tms_state.dispstart & 0x0ffff) | state->m_grmatch_xscroll; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *base0 = &tms_state.vram[0x00000 + ((page_offset + y * 256) & 0xffff)]; UINT8 *base2 = &tms_state.vram[0x20000 + ((page_offset + y * 256) & 0xffff)]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { UINT8 pix0 = base0[x / 2]; UINT8 pix2 = base2[x / 2]; @@ -695,13 +695,13 @@ } -SCREEN_UPDATE( itech8_2page ) +SCREEN_UPDATE_RGB32( itech8_2page ) { - itech8_state *state = screen->machine().driver_data(); + itech8_state *state = screen.machine().driver_data(); struct tms34061_display &tms_state = state->m_tms_state; UINT32 page_offset; int x, y; - const rgb_t *pens = tlc34076_get_pens(screen->machine().device("tlc34076")); + const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); /* first get the current display state */ tms34061_get_display_state(&tms_state); @@ -709,32 +709,32 @@ /* if we're blanked, just fill with black */ if (tms_state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* there are two pages, each of which is a full 8bpp */ /* page index is selected by the top bit of the page_select register */ page_offset = ((state->m_page_select & 0x80) << 10) | (tms_state.dispstart & 0x0ffff); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *base = &tms_state.vram[(page_offset + y * 256) & 0x3ffff]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dest[x] = pens[base[x]]; } return 0; } -SCREEN_UPDATE( itech8_2page_large ) +SCREEN_UPDATE_RGB32( itech8_2page_large ) { - itech8_state *state = screen->machine().driver_data(); + itech8_state *state = screen.machine().driver_data(); struct tms34061_display &tms_state = state->m_tms_state; UINT32 page_offset; int x, y; - const rgb_t *pens = tlc34076_get_pens(screen->machine().device("tlc34076")); + const rgb_t *pens = tlc34076_get_pens(screen.machine().device("tlc34076")); /* first get the current display state */ tms34061_get_display_state(&tms_state); @@ -742,7 +742,7 @@ /* if we're blanked, just fill with black */ if (tms_state.blanked) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -751,13 +751,13 @@ /* the upper 4 bits were latched on each write into a separate bitmap */ /* page index is selected by the top bit of the page_select register */ page_offset = ((~state->m_page_select & 0x80) << 10) | (tms_state.dispstart & 0x0ffff); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *base = &tms_state.vram[(page_offset + y * 256) & 0x3ffff]; UINT8 *latch = &tms_state.latchram[(page_offset + y * 256) & 0x3ffff]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { dest[x + 0] = pens[(latch[x/2] & 0xf0) | (base[x/2] >> 4)]; dest[x + 1] = pens[((latch[x/2] << 4) & 0xf0) | (base[x/2] & 0x0f)]; diff -Nru mame-0.144/src/mame/video/jackal.c mame-0.145/src/mame/video/jackal.c --- mame-0.144/src/mame/video/jackal.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/jackal.c 2012-02-06 21:30:32.000000000 +0000 @@ -58,7 +58,7 @@ void jackal_mark_tile_dirty( running_machine &machine, int offset ) { jackal_state *state = machine.driver_data(); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -79,7 +79,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { jackal_state *state = machine.driver_data(); UINT8 *RAM = machine.region("master")->base(); @@ -87,37 +87,37 @@ state->m_scrollram = &RAM[0x0020]; - tilemap_set_scroll_rows(state->m_bg_tilemap, 1); - tilemap_set_scroll_cols(state->m_bg_tilemap, 1); + state->m_bg_tilemap->set_scroll_rows(1); + state->m_bg_tilemap->set_scroll_cols(1); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_videoctrl[0]); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_videoctrl[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_videoctrl[0]); + state->m_bg_tilemap->set_scrollx(0, state->m_videoctrl[1]); if (state->m_videoctrl[2] & 0x02) { if (state->m_videoctrl[2] & 0x08) { - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); for (i = 0; i < 32; i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_scrollram[i]); + state->m_bg_tilemap->set_scrollx(i, state->m_scrollram[i]); } if (state->m_videoctrl[2] & 0x04) { - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, state->m_scrollram[i]); + state->m_bg_tilemap->set_scrolly(i, state->m_scrollram[i]); } } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } #define DRAW_SPRITE(bank, code, sx, sy) drawgfx_transpen(bitmap, cliprect, machine.gfx[bank], code, color, flipx, flipy, sx, sy, 0); -static void draw_sprites_region( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *sram, int length, int bank ) +static void draw_sprites_region( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *sram, int length, int bank ) { int offs; @@ -201,7 +201,7 @@ } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { jackal_state *state = machine.driver_data(); UINT8 *RAM = machine.region("master")->base(); @@ -222,10 +222,10 @@ draw_sprites_region(machine, bitmap, cliprect, sr, 0x500, 1); } -SCREEN_UPDATE( jackal ) +SCREEN_UPDATE_IND16( jackal ) { - set_pens(screen->machine()); - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + set_pens(screen.machine()); + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/jack.c mame-0.145/src/mame/video/jack.c --- mame-0.144/src/mame/video/jack.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/jack.c 2012-02-06 21:30:32.000000000 +0000 @@ -14,14 +14,14 @@ { jack_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( jack_colorram_w ) { jack_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( jack_paletteram_w ) @@ -52,7 +52,7 @@ SET_TILE_INFO(0, code, color, 0); } -static UINT32 tilemap_scan_cols_flipy( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) +static TILEMAP_MAPPER( tilemap_scan_cols_flipy ) { /* logical (col,row) -> memory offset */ return (col * num_rows) + (num_rows - 1 - row); @@ -64,7 +64,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols_flipy, 8, 8, 32, 32); } -static void jack_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void jack_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { jack_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -97,11 +97,11 @@ } } -SCREEN_UPDATE( jack ) +SCREEN_UPDATE_IND16( jack ) { - jack_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - jack_draw_sprites(screen->machine(), bitmap, cliprect); + jack_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + jack_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -149,7 +149,7 @@ state->m_bg_tilemap = tilemap_create(machine, joinem_get_bg_tile_info, tilemap_scan_cols_flipy, 8, 8, 32, 32); } -static void joinem_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void joinem_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { jack_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -182,10 +182,10 @@ } } -SCREEN_UPDATE( joinem ) +SCREEN_UPDATE_IND16( joinem ) { - jack_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - joinem_draw_sprites(screen->machine(), bitmap, cliprect); + jack_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + joinem_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/jagobj.c mame-0.145/src/mame/video/jagobj.c --- mame-0.144/src/mame/video/jagobj.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/jagobj.c 2012-02-06 21:30:32.000000000 +0000 @@ -972,10 +972,8 @@ UINT32 link = (lower >> 24) | ((upper & 0x7ff) << 8); int taken = 0; -#ifndef MESS - if ((ypos & 1) && ypos != 0x7ff) - fprintf(stderr, " branch cc=%d ypos=%X link=%06X - \n", cc, ypos, link << 3); -#endif +// if ((ypos & 1) && ypos != 0x7ff) +// fprintf(stderr, " branch cc=%d ypos=%X link=%06X - \n", cc, ypos, link << 3); switch (cc) { @@ -1091,9 +1089,7 @@ logerror("stop = %08X-%08X\n", objdata[0], objdata[1]); if (interrupt) { -#ifndef MESS - fprintf(stderr, "stop int=%d\n", interrupt); -#endif +// fprintf(stderr, "stop int=%d\n", interrupt); cpu_irq_state |= 4; update_cpu_irq(machine); } diff -Nru mame-0.144/src/mame/video/jaguar.c mame-0.145/src/mame/video/jaguar.c --- mame-0.144/src/mame/video/jaguar.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/jaguar.c 2012-02-06 21:30:32.000000000 +0000 @@ -196,7 +196,7 @@ static emu_timer *object_timer; static UINT8 cpu_irq_state; -static bitmap_t *screen_bitmap; +static bitmap_rgb32 *screen_bitmap; static pen_t *pen_table; static int pixel_clock; @@ -237,8 +237,8 @@ { const rectangle &visarea = machine.primary_screen->visible_area(); - int width = visarea.max_x + 1 - visarea.min_x; - int height = visarea.max_y + 1 - visarea.min_y; + int width = visarea.width(); + int height = visarea.height(); /* only 2 lightguns are connected */ *x = visarea.min_x + (((input_port_read(machine, player ? "FAKE2_X" : "FAKE1_X") & 0xff) * width) >> 8); *y = visarea.min_y + (((input_port_read(machine, player ? "FAKE2_Y" : "FAKE1_Y") & 0xff) * height) >> 8); @@ -751,11 +751,7 @@ /* adjust for the half-lines */ if (hperiod != 0 && vperiod != 0 && hbend < hbstart && vbend < vbstart && hbstart < hperiod) { - rectangle visarea; - visarea.min_x = hbend / 2; - visarea.max_x = hbstart / 2 - 1; - visarea.min_y = vbend / 2; - visarea.max_y = vbstart / 2 - 1; + rectangle visarea(hbend / 2, hbstart / 2 - 1, vbend / 2, vbstart / 2 - 1); space->machine().primary_screen->configure(hperiod / 2, vperiod / 2, visarea, HZ_TO_ATTOSECONDS((double)pixel_clock * 2 / hperiod / vperiod)); } } @@ -832,7 +828,7 @@ /* only run if video is enabled and we are past the "display begin" */ if ((gpu_regs[VMODE] & 1) && vc >= (gpu_regs[VDB] & 0x7ff)) { - UINT32 *dest = BITMAP_ADDR32(screen_bitmap, vc >> 1, 0); + UINT32 *dest = &screen_bitmap->pix32(vc >> 1); int maxx = visarea.max_x; int hde = effective_hvalue(gpu_regs[HDE]) >> 1; UINT16 x,scanline[760]; @@ -895,7 +891,7 @@ object_timer = machine.scheduler().timer_alloc(FUNC(cojag_scanline_update)); adjust_object_timer(machine, 0); - screen_bitmap = auto_bitmap_alloc(machine, 760, 512, BITMAP_FORMAT_RGB32); + screen_bitmap = auto_bitmap_rgb32_alloc(machine, 760, 512); jagobj_init(machine); @@ -922,17 +918,17 @@ * *************************************/ -SCREEN_UPDATE( cojag ) +SCREEN_UPDATE_RGB32( cojag ) { /* if not enabled, just blank */ if (!(gpu_regs[VMODE] & 1)) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } /* render the object list */ - copybitmap(bitmap, screen_bitmap, 0, 0, 0, 0, cliprect); + copybitmap(bitmap, *screen_bitmap, 0, 0, 0, 0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/jailbrek.c mame-0.145/src/mame/video/jailbrek.c --- mame-0.144/src/mame/video/jailbrek.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/jailbrek.c 2012-02-06 21:30:31.000000000 +0000 @@ -38,14 +38,14 @@ { jailbrek_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( jailbrek_colorram_w ) { jailbrek_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -62,10 +62,10 @@ { jailbrek_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 396 - 256); + state->m_bg_tilemap->set_scrolldx(0, 396 - 256); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { jailbrek_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -95,33 +95,33 @@ } } -SCREEN_UPDATE( jailbrek ) +SCREEN_UPDATE_IND16( jailbrek ) { - jailbrek_state *state = screen->machine().driver_data(); + jailbrek_state *state = screen.machine().driver_data(); int i; // added support for vertical scrolling (credits). 23/1/2002 -BR // bit 2 appears to be horizontal/vertical scroll control if (state->m_scroll_dir[0] & 0x04) { - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 1); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scroll_cols(32); + state->m_bg_tilemap->set_scroll_rows(1); + state->m_bg_tilemap->set_scrollx(0, 0); for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_bg_tilemap, i, ((state->m_scroll_x[i + 32] << 8) + state->m_scroll_x[i])); + state->m_bg_tilemap->set_scrolly(i, ((state->m_scroll_x[i + 32] << 8) + state->m_scroll_x[i])); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 1); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scroll_rows(32); + state->m_bg_tilemap->set_scroll_cols(1); + state->m_bg_tilemap->set_scrolly(0, 0); for (i = 0; i < 32; i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, ((state->m_scroll_x[i + 32] << 8) + state->m_scroll_x[i])); + state->m_bg_tilemap->set_scrollx(i, ((state->m_scroll_x[i + 32] << 8) + state->m_scroll_x[i])); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/jalblend.c mame-0.145/src/mame/video/jalblend.c --- mame-0.144/src/mame/video/jalblend.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/jalblend.c 2012-02-06 21:30:32.000000000 +0000 @@ -84,7 +84,8 @@ return MAKE_RGB(r,g,b); } -void jal_blend_drawgfx(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +template +void jal_blend_drawgfx_common(_BitmapClass &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color) { @@ -117,96 +118,67 @@ ex = sx + gfx->width; ey = sy + gfx->height; - if (clip) - { - if (sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += xinc*pixels; - } - if (sy < clip->min_y) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += yinc*pixels; - } - /* NS 980211 - fixed incorrect clipping */ - if (ex > clip->max_x+1) - { /* clip right */ - ex = clip->max_x+1; - } - if (ey > clip->max_y+1) - { /* clip bottom */ - ey = clip->max_y+1; - } + if (sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += xinc*pixels; + } + if (sy < clip.min_y) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += yinc*pixels; + } + /* NS 980211 - fixed incorrect clipping */ + if (ex > clip.max_x+1) + { /* clip right */ + ex = clip.max_x+1; + } + if (ey > clip.max_y+1) + { /* clip bottom */ + ey = clip.max_y+1; } if (ex > sx) { /* skip if inner loop doesn't draw anything */ int x, y; - /* 32-bit destination bitmap */ - if (dest_bmp->bpp == 32) + /* taken from case 7: TRANSPARENCY_ALPHARANGE */ + for (y = sy; y < ey; y++) { - /* taken from case 7: TRANSPARENCY_ALPHARANGE */ - for (y = sy; y < ey; y++) + const UINT8 *source = source_base + y_index*gfx->line_modulo; + typename _BitmapClass::pixel_t *dest = &dest_bmp.pix(y); + int x_index = x_index_base; + for (x = sx; x < ex; x++) { - const UINT8 *source = source_base + y_index*gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - int x_index = x_index_base; - for (x = sx; x < ex; x++) + int c = source[x_index]; + if (c != transparent_color) { - int c = source[x_index]; - if (c != transparent_color) + if (alpha[c] & 8) { - if (alpha[c] & 8) - { - /* Comp with clamp */ - dest[x] = jal_blend_func(dest[x], pal[c], alpha[c]); - } - else - { - /* Skip the costly alpha step altogether */ - dest[x] = pal[c]; - } + /* Comp with clamp */ + dest[x] = jal_blend_func(dest[x], pal[c], alpha[c]); } - x_index += xinc; - } - y_index += yinc; - } - } - - /* 16-bit destination bitmap */ - else - { - /* taken from case 7: TRANSPARENCY_ALPHARANGE */ - for (y = sy; y < ey; y++) - { - const UINT8 *source = source_base + y_index*gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - int x_index = x_index_base; - for (x = sx; x < ex; x++) - { - int c = source[x_index]; - if (c != transparent_color) + else { - if (alpha[c] & 8) - { - /* Comp with clamp */ - dest[x] = jal_blend_func(dest[x], pal[c], alpha[c]); - } - else - { - /* Skip the costly alpha step altogether */ - dest[x] = pal[c]; - } + /* Skip the costly alpha step altogether */ + dest[x] = pal[c]; } - x_index += xinc; } - y_index += yinc; + x_index += xinc; } + y_index += yinc; } } } } + +void jal_blend_drawgfx(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, + int transparent_color) +{ jal_blend_drawgfx_common(dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } +void jal_blend_drawgfx(bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, + int transparent_color) +{ jal_blend_drawgfx_common(dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } diff -Nru mame-0.144/src/mame/video/jalblend.h mame-0.145/src/mame/video/jalblend.h --- mame-0.144/src/mame/video/jalblend.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/jalblend.h 2012-02-06 21:30:32.000000000 +0000 @@ -2,6 +2,9 @@ void jal_blend_set(int color, UINT8 val); rgb_t jal_blend_func(rgb_t dest, rgb_t addMe, UINT8 alpha); -void jal_blend_drawgfx(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +void jal_blend_drawgfx(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, + int transparent_color); +void jal_blend_drawgfx(bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color); diff -Nru mame-0.144/src/mame/video/jedi.c mame-0.145/src/mame/video/jedi.c --- mame-0.144/src/mame/video/jedi.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/jedi.c 2012-02-06 21:30:32.000000000 +0000 @@ -88,16 +88,16 @@ } -static void do_pen_lookup(jedi_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void do_pen_lookup(jedi_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int y, x; pen_t pens[NUM_PENS]; get_pens(state, pens); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - for(x = cliprect->min_x; x <= cliprect->max_x; x++) - *BITMAP_ADDR32(bitmap, y, x) = pens[*BITMAP_ADDR32(bitmap, y, x)]; + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + for(x = cliprect.min_x; x <= cliprect.max_x; x++) + bitmap.pix32(y, x) = pens[bitmap.pix32(y, x)]; } @@ -132,7 +132,7 @@ * *************************************/ -static void draw_background_and_text(running_machine &machine, jedi_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background_and_text(running_machine &machine, jedi_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int y; int background_line_buffer[0x200]; /* RAM chip at 2A */ @@ -149,12 +149,12 @@ memset(background_line_buffer, 0, 0x200 * sizeof(int)); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; int bg_last_col = 0; - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { int tx_col1, tx_col2, bg_col; int bg_tempcol; @@ -214,8 +214,8 @@ the next pixel just uses the current value directly. After we done with a pixel save it for later in the line buffer RAM */ bg_tempcol = prom1[(bg_last_col << 4) | bg_col]; - *BITMAP_ADDR32(bitmap, y, x + 0) = tx_col1 | prom2[(background_line_buffer[x + 0] << 4) | bg_tempcol]; - *BITMAP_ADDR32(bitmap, y, x + 1) = tx_col2 | prom2[(background_line_buffer[x + 1] << 4) | bg_col]; + bitmap.pix32(y, x + 0) = tx_col1 | prom2[(background_line_buffer[x + 0] << 4) | bg_tempcol]; + bitmap.pix32(y, x + 1) = tx_col2 | prom2[(background_line_buffer[x + 1] << 4) | bg_col]; background_line_buffer[x + 0] = bg_tempcol; background_line_buffer[x + 1] = bg_col; @@ -232,7 +232,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, jedi_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, jedi_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { offs_t offs; UINT8 *spriteram = state->m_spriteram; @@ -276,7 +276,7 @@ int i; UINT16 x = spriteram[offs + 0x100] + ((spriteram[offs + 0x40] & 0x01) << 8) - 2; - if ((y < cliprect->min_y) || (y > cliprect->max_y)) + if ((y < cliprect.min_y) || (y > cliprect.max_y)) continue; if (flip_x) @@ -296,7 +296,7 @@ x = x & 0x1ff; if (col) - *BITMAP_ADDR32(bitmap, y, x) = (*BITMAP_ADDR32(bitmap, y, x) & 0x30f) | col; + bitmap.pix32(y, x) = (bitmap.pix32(y, x) & 0x30f) | col; /* next pixel */ if (flip_x) @@ -327,19 +327,19 @@ * *************************************/ -static SCREEN_UPDATE( jedi ) +static SCREEN_UPDATE_RGB32( jedi ) { - jedi_state *state = screen->machine().driver_data(); + jedi_state *state = screen.machine().driver_data(); /* if no video, clear it all to black */ if (*state->m_video_off & 0x01) - bitmap_fill(bitmap, cliprect, RGB_BLACK); + bitmap.fill(RGB_BLACK, cliprect); else { /* draw the background/text layers, followed by the sprites - it needs to be done in this order*/ - draw_background_and_text(screen->machine(), state, bitmap, cliprect); - draw_sprites(screen->machine(), state, bitmap, cliprect); + draw_background_and_text(screen.machine(), state, bitmap, cliprect); + draw_sprites(screen.machine(), state, bitmap, cliprect); do_pen_lookup(state, bitmap, cliprect); } @@ -356,11 +356,10 @@ MACHINE_CONFIG_FRAGMENT( jedi_video ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(64*8, 262) /* verify vert size */ MCFG_SCREEN_VISIBLE_AREA(0*8, 37*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(jedi) + MCFG_SCREEN_UPDATE_STATIC(jedi) MCFG_VIDEO_START(jedi) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/jpmimpct.c mame-0.145/src/mame/video/jpmimpct.c --- mame-0.144/src/mame/video/jpmimpct.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/jpmimpct.c 2012-02-06 21:30:32.000000000 +0000 @@ -106,11 +106,11 @@ * *************************************/ -void jpmimpct_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void jpmimpct_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { jpmimpct_state *state = screen.machine().driver_data(); UINT16 *vram = &state->m_vram[(params->rowaddr << 8) & 0x3ff00]; - UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); + UINT32 *dest = &bitmap.pix32(scanline); int coladdr = params->coladdr; int x; diff -Nru mame-0.144/src/mame/video/kaneko16.c mame-0.145/src/mame/video/kaneko16.c --- mame-0.144/src/mame/video/kaneko16.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kaneko16.c 2012-02-06 21:30:31.000000000 +0000 @@ -71,13 +71,13 @@ ***************************************************************************/ -INLINE void get_tile_info(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, int _N_) +INLINE void get_tile_info(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, int _N_) { kaneko16_state *state = machine.driver_data(); UINT16 code_hi = state->m_vram[_N_][ 2 * tile_index + 0]; UINT16 code_lo = state->m_vram[_N_][ 2 * tile_index + 1]; SET_TILE_INFO(1 + _N_/2, code_lo, (code_hi >> 2) & 0x3f, TILE_FLIPXY( code_hi & 3 )); - tileinfo->category = (code_hi >> 8) & 7; + tileinfo.category = (code_hi >> 8) & 7; } static TILE_GET_INFO( get_tile_info_0 ) { get_tile_info(machine, tileinfo, tile_index, 0); } @@ -89,7 +89,7 @@ { kaneko16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram[_N_][offset]); - tilemap_mark_tile_dirty(state->m_tmap[_N_], offset/2); + state->m_tmap[_N_]->mark_tile_dirty(offset/2); } WRITE16_HANDLER( kaneko16_vram_0_w ) { kaneko16_vram_w(space, offset, data, mem_mask, 0); } @@ -122,7 +122,7 @@ state->m_tmap[3] = 0; - state->m_sprites_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); { int dx, dy; @@ -143,17 +143,17 @@ default: dy = 0; } - tilemap_set_scrolldx( state->m_tmap[0], -dx, xdim + dx -1 ); - tilemap_set_scrolldx( state->m_tmap[1], -(dx+2), xdim + (dx + 2) - 1 ); + state->m_tmap[0]->set_scrolldx(-dx, xdim + dx -1 ); + state->m_tmap[1]->set_scrolldx(-(dx+2), xdim + (dx + 2) - 1 ); - tilemap_set_scrolldy( state->m_tmap[0], -dy, ydim + dy -1 ); - tilemap_set_scrolldy( state->m_tmap[1], -dy, ydim + dy -1 ); + state->m_tmap[0]->set_scrolldy(-dy, ydim + dy -1 ); + state->m_tmap[1]->set_scrolldy(-dy, ydim + dy -1 ); - tilemap_set_transparent_pen(state->m_tmap[0], 0); - tilemap_set_transparent_pen(state->m_tmap[1], 0); + state->m_tmap[0]->set_transparent_pen(0); + state->m_tmap[1]->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_tmap[0], 0x200); // Line Scroll - tilemap_set_scroll_rows(state->m_tmap[1], 0x200); + state->m_tmap[0]->set_scroll_rows(0x200); // Line Scroll + state->m_tmap[1]->set_scroll_rows(0x200); } } @@ -195,17 +195,17 @@ default: dy = 0; } - tilemap_set_scrolldx( state->m_tmap[2], -dx, xdim + dx -1 ); - tilemap_set_scrolldx( state->m_tmap[3], -(dx+2), xdim + (dx + 2) - 1 ); + state->m_tmap[2]->set_scrolldx(-dx, xdim + dx -1 ); + state->m_tmap[3]->set_scrolldx(-(dx+2), xdim + (dx + 2) - 1 ); - tilemap_set_scrolldy( state->m_tmap[2], -dy, ydim + dy -1 ); - tilemap_set_scrolldy( state->m_tmap[3], -dy, ydim + dy -1 ); + state->m_tmap[2]->set_scrolldy(-dy, ydim + dy -1 ); + state->m_tmap[3]->set_scrolldy(-dy, ydim + dy -1 ); - tilemap_set_transparent_pen(state->m_tmap[2], 0); - tilemap_set_transparent_pen(state->m_tmap[3], 0); + state->m_tmap[2]->set_transparent_pen(0); + state->m_tmap[3]->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_tmap[2], 0x200); // Line Scroll - tilemap_set_scroll_rows(state->m_tmap[3], 0x200); + state->m_tmap[2]->set_scroll_rows(0x200); // Line Scroll + state->m_tmap[3]->set_scroll_rows(0x200); } } @@ -214,8 +214,8 @@ kaneko16_state *state = machine.driver_data(); VIDEO_START_CALL(kaneko16_1xVIEW2); - tilemap_set_scrolldy( state->m_tmap[0], 0, 256 - 1 ); - tilemap_set_scrolldy( state->m_tmap[1], 0, 256 - 1 ); + state->m_tmap[0]->set_scrolldy(0, 256 - 1 ); + state->m_tmap[1]->set_scrolldy(0, 256 - 1 ); } @@ -241,7 +241,7 @@ /* Render the hi-color static backgrounds held in the ROMs */ - state->m_bg15_bitmap = auto_bitmap_alloc(machine, 256 * 32, 256 * 1, BITMAP_FORMAT_INDEXED16); + state->m_bg15_bitmap.allocate(256 * 32, 256 * 1); /* 8aba is used as background color @@ -274,7 +274,7 @@ if ((r & 0x10) && (b & 0x10)) g = (g - 1) & 0x1f; /* decrease with wraparound */ - *BITMAP_ADDR16(state->m_bg15_bitmap, y, sx * 256 + x) = 2048 + ((g << 10) | (r << 5) | b); + state->m_bg15_bitmap.pix16(y, sx * 256 + x) = 2048 + ((g << 10) | (r << 5) | b); } VIDEO_START_CALL(kaneko16_1xVIEW2); @@ -294,7 +294,7 @@ state->m_tmap[3] = 0; - state->m_sprites_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap); { int dx = 0x5b, dy = 8; @@ -302,17 +302,17 @@ int xdim = machine.primary_screen->width(); int ydim = machine.primary_screen->height(); - tilemap_set_scrolldx( state->m_tmap[0], -dx, xdim + dx -1 ); - tilemap_set_scrolldx( state->m_tmap[1], -(dx+2), xdim + (dx + 2) - 1 ); + state->m_tmap[0]->set_scrolldx(-dx, xdim + dx -1 ); + state->m_tmap[1]->set_scrolldx(-(dx+2), xdim + (dx + 2) - 1 ); - tilemap_set_scrolldy( state->m_tmap[0], -dy, ydim + dy -1 ); - tilemap_set_scrolldy( state->m_tmap[1], -dy, ydim + dy -1 ); + state->m_tmap[0]->set_scrolldy(-dy, ydim + dy -1 ); + state->m_tmap[1]->set_scrolldy(-dy, ydim + dy -1 ); - tilemap_set_transparent_pen(state->m_tmap[0], 0); - tilemap_set_transparent_pen(state->m_tmap[1], 0); + state->m_tmap[0]->set_transparent_pen(0); + state->m_tmap[1]->set_transparent_pen(0); - tilemap_set_scroll_rows(state->m_tmap[0], 0x200); // Line Scroll - tilemap_set_scroll_rows(state->m_tmap[1], 0x200); + state->m_tmap[0]->set_scroll_rows(0x200); // Line Scroll + state->m_tmap[1]->set_scroll_rows(0x200); } } @@ -420,13 +420,13 @@ } // custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities -static void kaneko16_draw_sprites_custom(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +static void kaneko16_draw_sprites_custom(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int priority) { pen_t pen_base = gfx->color_base + gfx->color_granularity * (color % gfx->total_colors); const UINT8 *source_base = gfx_element_get_data(gfx, code % gfx->total_elements); - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; int sprite_screen_height = ((1<<16)*gfx->height+0x8000)>>16; int sprite_screen_width = ((1<<16)*gfx->width+0x8000)>>16; @@ -462,31 +462,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -496,8 +493,8 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); int x, x_index = x_index_base; for( x=sx; x(); /* Sprites *must* be parsed from the first in RAM to the last, @@ -855,7 +852,7 @@ ***************************************************************************/ -static void kaneko16_prepare_first_tilemap_chip(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kaneko16_prepare_first_tilemap_chip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kaneko16_state *state = machine.driver_data(); /* Set Up FIRST Tilemap chip */ @@ -867,13 +864,13 @@ layers_flip_0 = state->m_layers_0_regs[ 4 ]; /* Enable layers */ - tilemap_set_enable(state->m_tmap[0], ~layers_flip_0 & 0x1000); - tilemap_set_enable(state->m_tmap[1], ~layers_flip_0 & 0x0010); + state->m_tmap[0]->enable(~layers_flip_0 & 0x1000); + state->m_tmap[1]->enable(~layers_flip_0 & 0x0010); /* Flip layers */ - tilemap_set_flip(state->m_tmap[0], ((layers_flip_0 & 0x0100) ? TILEMAP_FLIPY : 0) | + state->m_tmap[0]->set_flip( ((layers_flip_0 & 0x0100) ? TILEMAP_FLIPY : 0) | ((layers_flip_0 & 0x0200) ? TILEMAP_FLIPX : 0) ); - tilemap_set_flip(state->m_tmap[1], ((layers_flip_0 & 0x0100) ? TILEMAP_FLIPY : 0) | + state->m_tmap[1]->set_flip( ((layers_flip_0 & 0x0100) ? TILEMAP_FLIPY : 0) | ((layers_flip_0 & 0x0200) ? TILEMAP_FLIPX : 0) ); /* Scroll layers */ @@ -882,21 +879,21 @@ layer1_scrollx = state->m_layers_0_regs[ 0 ]; layer1_scrolly = state->m_layers_0_regs[ 1 ] >> 6; - tilemap_set_scrolly(state->m_tmap[0],0,layer0_scrolly); - tilemap_set_scrolly(state->m_tmap[1],0,layer1_scrolly); + state->m_tmap[0]->set_scrolly(0,layer0_scrolly); + state->m_tmap[1]->set_scrolly(0,layer1_scrolly); for (i=0; i<0x200; i++) { UINT16 scroll; scroll = (layers_flip_0 & 0x0800) ? state->m_vscroll[0][i] : 0; - tilemap_set_scrollx(state->m_tmap[0],i,(layer0_scrollx + scroll) >> 6 ); + state->m_tmap[0]->set_scrollx(i,(layer0_scrollx + scroll) >> 6 ); scroll = (layers_flip_0 & 0x0008) ? state->m_vscroll[1][i] : 0; - tilemap_set_scrollx(state->m_tmap[1],i,(layer1_scrollx + scroll) >> 6 ); + state->m_tmap[1]->set_scrollx(i,(layer1_scrollx + scroll) >> 6 ); } } -static void kaneko16_prepare_second_tilemap_chip(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kaneko16_prepare_second_tilemap_chip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kaneko16_state *state = machine.driver_data(); /* Set Up SECOND Tilemap chip */ @@ -909,12 +906,12 @@ { layers_flip_1 = state->m_layers_1_regs[ 4 ]; - tilemap_set_enable(state->m_tmap[2], ~layers_flip_1 & 0x1000); - tilemap_set_enable(state->m_tmap[3], ~layers_flip_1 & 0x0010); + state->m_tmap[2]->enable(~layers_flip_1 & 0x1000); + state->m_tmap[3]->enable(~layers_flip_1 & 0x0010); - tilemap_set_flip(state->m_tmap[2], ((layers_flip_1 & 0x0100) ? TILEMAP_FLIPY : 0) | + state->m_tmap[2]->set_flip( ((layers_flip_1 & 0x0100) ? TILEMAP_FLIPY : 0) | ((layers_flip_1 & 0x0200) ? TILEMAP_FLIPX : 0) ); - tilemap_set_flip(state->m_tmap[3], ((layers_flip_1 & 0x0100) ? TILEMAP_FLIPY : 0) | + state->m_tmap[3]->set_flip( ((layers_flip_1 & 0x0100) ? TILEMAP_FLIPY : 0) | ((layers_flip_1 & 0x0200) ? TILEMAP_FLIPX : 0) ); layer0_scrollx = state->m_layers_1_regs[ 2 ]; @@ -922,38 +919,38 @@ layer1_scrollx = state->m_layers_1_regs[ 0 ]; layer1_scrolly = state->m_layers_1_regs[ 1 ] >> 6; - tilemap_set_scrolly(state->m_tmap[2],0,layer0_scrolly); - tilemap_set_scrolly(state->m_tmap[3],0,layer1_scrolly); + state->m_tmap[2]->set_scrolly(0,layer0_scrolly); + state->m_tmap[3]->set_scrolly(0,layer1_scrolly); for (i=0; i<0x200; i++) { UINT16 scroll; scroll = (layers_flip_1 & 0x0800) ? state->m_vscroll[2][i] : 0; - tilemap_set_scrollx(state->m_tmap[2],i,(layer0_scrollx + scroll) >> 6 ); + state->m_tmap[2]->set_scrollx(i,(layer0_scrollx + scroll) >> 6 ); scroll = (layers_flip_1 & 0x0008) ? state->m_vscroll[3][i] : 0; - tilemap_set_scrollx(state->m_tmap[3],i,(layer1_scrollx + scroll) >> 6 ); + state->m_tmap[3]->set_scrollx(i,(layer1_scrollx + scroll) >> 6 ); } } } -static void kaneko16_render_first_tilemap_chip(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri) +static void kaneko16_render_first_tilemap_chip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) { kaneko16_state *state = machine.driver_data(); - tilemap_draw_primask(bitmap,cliprect, state->m_tmap[0], pri, pri, 0); - tilemap_draw_primask(bitmap,cliprect, state->m_tmap[1], pri, pri, 0); + state->m_tmap[0]->draw(bitmap, cliprect, pri, pri, 0); + state->m_tmap[1]->draw(bitmap, cliprect, pri, pri, 0); } -static void kaneko16_render_second_tilemap_chip(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri) +static void kaneko16_render_second_tilemap_chip(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) { kaneko16_state *state = machine.driver_data(); if (state->m_tmap[2]) { - tilemap_draw_primask(bitmap,cliprect, state->m_tmap[2], pri, state->m_priority.VIEW2_2_pri ? pri : 0, 0); - tilemap_draw_primask(bitmap,cliprect, state->m_tmap[3], pri, state->m_priority.VIEW2_2_pri ? pri : 0, 0); + state->m_tmap[2]->draw(bitmap, cliprect, pri, state->m_priority.VIEW2_2_pri ? pri : 0, 0); + state->m_tmap[3]->draw(bitmap, cliprect, pri, state->m_priority.VIEW2_2_pri ? pri : 0, 0); } } -static void kaneko16_render_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kaneko16_render_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kaneko16_state *state = machine.driver_data(); /* Sprites last (rendered with pdrawgfx, so they can slip @@ -967,15 +964,15 @@ } else { - bitmap_fill(state->m_sprites_bitmap,cliprect,0); + state->m_sprites_bitmap.fill(0, cliprect); kaneko16_draw_sprites(machine,bitmap,cliprect); } } -static void kaneko16_render_15bpp_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kaneko16_render_15bpp_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kaneko16_state *state = machine.driver_data(); - if (state->m_bg15_bitmap) + if (state->m_bg15_bitmap.valid()) { int select = state->m_bg15_select[ 0 ]; // int reg = state->m_bg15_reg[ 0 ]; @@ -993,88 +990,88 @@ } } -static void kaneko16_fill_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kaneko16_fill_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kaneko16_state *state = machine.driver_data(); if(state->m_sprite_type == 1) - bitmap_fill(bitmap,cliprect,0x7f00); + bitmap.fill(0x7f00, cliprect); else /* Fill the bitmap with pen 0. This is wrong, but will work most of the times. To do it right, each pixel should be drawn with pen 0 of the bottomost tile that covers it (which is pretty tricky to do) */ - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } -static SCREEN_UPDATE( common ) +static SCREEN_UPDATE_IND16( common ) { int i; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - kaneko16_prepare_first_tilemap_chip(screen->machine(), bitmap, cliprect); - kaneko16_prepare_second_tilemap_chip(screen->machine(), bitmap, cliprect); + kaneko16_prepare_first_tilemap_chip(screen.machine(), bitmap, cliprect); + kaneko16_prepare_second_tilemap_chip(screen.machine(), bitmap, cliprect); for ( i = 0; i < 8; i++ ) { - kaneko16_render_first_tilemap_chip(screen->machine(),bitmap,cliprect,i); - kaneko16_render_second_tilemap_chip(screen->machine(),bitmap,cliprect,i); + kaneko16_render_first_tilemap_chip(screen.machine(),bitmap,cliprect,i); + kaneko16_render_second_tilemap_chip(screen.machine(),bitmap,cliprect,i); } return 0; } -SCREEN_UPDATE(berlwall) +SCREEN_UPDATE_IND16(berlwall) { - kaneko16_state *state = screen->machine().driver_data(); + kaneko16_state *state = screen.machine().driver_data(); // berlwall uses a 15bpp bitmap as a bg, not a solid fill - kaneko16_render_15bpp_bitmap(screen->machine(),bitmap,cliprect); + kaneko16_render_15bpp_bitmap(screen.machine(),bitmap,cliprect); // if the display is disabled, do nothing? if (!state->m_disp_enable) return 0; - SCREEN_UPDATE_CALL(common); - kaneko16_render_sprites(screen->machine(),bitmap,cliprect); + SCREEN_UPDATE16_CALL(common); + kaneko16_render_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( jchan_view2 ) +SCREEN_UPDATE_IND16( jchan_view2 ) { - kaneko16_state *state = screen->machine().driver_data(); + kaneko16_state *state = screen.machine().driver_data(); int dx,dy; - SCREEN_UPDATE_CALL(common); + SCREEN_UPDATE16_CALL(common); /* override the offsets set in common - tuned to char select in jchan2 */ dx = 25;dy = 11; - tilemap_set_scrolldx( state->m_tmap[0], -dx, 320 + dx -1 ); - tilemap_set_scrolldx( state->m_tmap[1], -(dx+2), 320 + (dx + 2) - 1 ); + state->m_tmap[0]->set_scrolldx(-dx, 320 + dx -1 ); + state->m_tmap[1]->set_scrolldx(-(dx+2), 320 + (dx + 2) - 1 ); - tilemap_set_scrolldy( state->m_tmap[0], -dy, 240 + dy -1 ); - tilemap_set_scrolldy( state->m_tmap[1], -dy, 240 + dy -1 ); + state->m_tmap[0]->set_scrolldy(-dy, 240 + dy -1 ); + state->m_tmap[1]->set_scrolldy(-dy, 240 + dy -1 ); return 0; } -SCREEN_UPDATE( kaneko16 ) +SCREEN_UPDATE_IND16( kaneko16 ) { - kaneko16_state *state = screen->machine().driver_data(); - kaneko16_fill_bitmap(screen->machine(),bitmap,cliprect); + kaneko16_state *state = screen.machine().driver_data(); + kaneko16_fill_bitmap(screen.machine(),bitmap,cliprect); // if the display is disabled, do nothing? if (!state->m_disp_enable) return 0; - SCREEN_UPDATE_CALL(common); - kaneko16_render_sprites(screen->machine(),bitmap,cliprect); + SCREEN_UPDATE16_CALL(common); + kaneko16_render_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( galsnew ) +SCREEN_UPDATE_IND16( galsnew ) { - kaneko16_state *state = screen->machine().driver_data(); -// kaneko16_fill_bitmap(screen->machine(),bitmap,cliprect); + kaneko16_state *state = screen.machine().driver_data(); +// kaneko16_fill_bitmap(screen.machine(),bitmap,cliprect); int y,x; int count; @@ -1082,7 +1079,7 @@ count = 0; for (y=0;y<256;y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); for (x=0;x<256;x++) { @@ -1096,7 +1093,7 @@ count = 0; for (y=0;y<256;y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); for (x=0;x<256;x++) { @@ -1113,23 +1110,23 @@ // if the display is disabled, do nothing? if (!state->m_disp_enable) return 0; - SCREEN_UPDATE_CALL(common); + SCREEN_UPDATE16_CALL(common); - kaneko16_render_sprites(screen->machine(),bitmap,cliprect); + kaneko16_render_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( sandscrp ) +SCREEN_UPDATE_IND16( sandscrp ) { - kaneko16_state *state = screen->machine().driver_data(); - device_t *pandora = screen->machine().device("pandora"); - kaneko16_fill_bitmap(screen->machine(),bitmap,cliprect); + kaneko16_state *state = screen.machine().driver_data(); + device_t *pandora = screen.machine().device("pandora"); + kaneko16_fill_bitmap(screen.machine(),bitmap,cliprect); // if the display is disabled, do nothing? if (!state->m_disp_enable) return 0; - SCREEN_UPDATE_CALL(common); + SCREEN_UPDATE16_CALL(common); // copy sprite bitmap to screen pandora_update(pandora, bitmap, cliprect); diff -Nru mame-0.144/src/mame/video/kangaroo.c mame-0.145/src/mame/video/kangaroo.c --- mame-0.144/src/mame/video/kangaroo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kangaroo.c 2012-02-06 21:30:32.000000000 +0000 @@ -136,9 +136,9 @@ * *************************************/ -SCREEN_UPDATE( kangaroo ) +SCREEN_UPDATE_RGB32( kangaroo ) { - kangaroo_state *state = screen->machine().driver_data(); + kangaroo_state *state = screen.machine().driver_data(); UINT8 scrolly = state->m_video_control[6]; UINT8 scrollx = state->m_video_control[7]; UINT8 maska = (state->m_video_control[10] & 0x28) >> 3; @@ -157,11 +157,11 @@ pens[x] = MAKE_RGB(pal1bit(x >> 2), pal1bit(x >> 1), pal1bit(x >> 0)); /* iterate over pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 2) { UINT8 effxa = scrollx + ((x / 2) ^ xora); UINT8 effya = scrolly + (y ^ xora); diff -Nru mame-0.144/src/mame/video/kan_panb.c mame-0.145/src/mame/video/kan_panb.c --- mame-0.144/src/mame/video/kan_panb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kan_panb.c 2012-02-06 21:30:32.000000000 +0000 @@ -4,9 +4,9 @@ #include "kan_panb.h" #include "includes/snowbros.h" -SCREEN_UPDATE( honeydol ) +SCREEN_UPDATE_IND16( honeydol ) { - snowbros_state *state = screen->machine().driver_data(); + snowbros_state *state = screen.machine().driver_data(); UINT16 *spriteram16 = state->m_bootleg_spriteram16; int sx=0, sy=0, x=0, y=0, offs; /* sprites clip on left / right edges when scrolling, but it seems correct, @@ -15,7 +15,7 @@ /* not standard snowbros video */ - bitmap_fill(bitmap,cliprect,0xf0); + bitmap.fill(0xf0, cliprect); for (offs = 0x0000/2;offs < 0x2000/2;offs += 8) { @@ -33,7 +33,7 @@ x = dx; y = dy; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 240 - x; sy = 240 - y; @@ -46,7 +46,7 @@ sy = y; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], tile, tilecolour, flipx, flipy, @@ -64,7 +64,7 @@ x = dx; y = dy; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 240 - x; sy = 240 - y; @@ -80,7 +80,7 @@ tilecolour = (tilecolour&0x03f0) >> 4; tilecolour ^=0x3f; // unusual, but correct.. - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, tilecolour, flipx, flipy, @@ -90,9 +90,9 @@ } -SCREEN_UPDATE( twinadv ) +SCREEN_UPDATE_IND16( twinadv ) { - snowbros_state *state = screen->machine().driver_data(); + snowbros_state *state = screen.machine().driver_data(); UINT16 *spriteram16 = state->m_bootleg_spriteram16; int sx=0, sy=0, x=0, y=0, offs; /* sprites clip on left / right edges when scrolling, but it seems correct, @@ -101,7 +101,7 @@ /* not standard snowbros video */ - bitmap_fill(bitmap,cliprect,0xf0); + bitmap.fill(0xf0, cliprect); for (offs = 0x0000/2;offs < 0x2000/2;offs += 8) { @@ -120,7 +120,7 @@ x = dx; y = dy; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 240 - x; sy = 240 - y; @@ -136,7 +136,7 @@ tilecolour = (tilecolour&0x00f0) >> 4; tilecolour ^=0xf; // unusual, but correct.. - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, tilecolour, flipx, flipy, @@ -146,13 +146,13 @@ } -SCREEN_UPDATE( wintbob ) +SCREEN_UPDATE_IND16( wintbob ) { - snowbros_state *state = screen->machine().driver_data(); + snowbros_state *state = screen.machine().driver_data(); UINT16 *spriteram16 = state->m_bootleg_spriteram16; int offs; - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); for (offs = 0;offs < state->m_spriteram_size/2;offs += 8) { @@ -169,7 +169,7 @@ if (wrapr == 8) xpos -= 256; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { xpos = 240 - xpos; ypos = 240 - ypos; @@ -179,7 +179,7 @@ if ((xpos > -16) && (ypos > 0) && (xpos < 256) && (ypos < 240) && (disbl !=2)) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tilen, colr, flipx, flipy, @@ -190,9 +190,9 @@ } -SCREEN_UPDATE( snowbro3 ) +SCREEN_UPDATE_IND16( snowbro3 ) { - snowbros_state *state = screen->machine().driver_data(); + snowbros_state *state = screen.machine().driver_data(); UINT16 *spriteram16 = state->m_bootleg_spriteram16; int sx=0, sy=0, x=0, y=0, offs; @@ -220,11 +220,11 @@ /* This clears & redraws the entire screen each pass */ - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); for (offs = 0;offs < state->m_spriteram_size/2;offs += 8) { - gfx_element *gfx = screen->machine().gfx[0]; + gfx_element *gfx = screen.machine().gfx[0]; int dx = spriteram16[offs+4] & 0xff; int dy = spriteram16[offs+5] & 0xff; int tilecolour = spriteram16[offs+3]; @@ -249,7 +249,7 @@ if (x > 511) x &= 0x1ff; if (y > 511) y &= 0x1ff; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { sx = 240 - x; sy = 240 - y; @@ -264,7 +264,7 @@ if (offs < 0x800) /* i guess this is the right way */ { - gfx = screen->machine().gfx[1]; + gfx = screen.machine().gfx[1]; tilecolour = 0x10; } diff -Nru mame-0.144/src/mame/video/kan_panb.h mame-0.145/src/mame/video/kan_panb.h --- mame-0.144/src/mame/video/kan_panb.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kan_panb.h 2012-02-06 21:30:32.000000000 +0000 @@ -1,4 +1,4 @@ -SCREEN_UPDATE( honeydol ); -SCREEN_UPDATE( twinadv ); -SCREEN_UPDATE( wintbob ); -SCREEN_UPDATE( snowbro3 ); +SCREEN_UPDATE_IND16( honeydol ); +SCREEN_UPDATE_IND16( twinadv ); +SCREEN_UPDATE_IND16( wintbob ); +SCREEN_UPDATE_IND16( snowbro3 ); diff -Nru mame-0.144/src/mame/video/kan_pand.c mame-0.145/src/mame/video/kan_pand.c --- mame-0.144/src/mame/video/kan_pand.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kan_pand.c 2012-02-06 21:30:32.000000000 +0000 @@ -55,7 +55,7 @@ { screen_device *screen; UINT8 * spriteram; - bitmap_t *sprites_bitmap; /* bitmap to render sprites to, Pandora seems to be frame'buffered' */ + bitmap_ind16 *sprites_bitmap; /* bitmap to render sprites to, Pandora seems to be frame'buffered' */ int clear_bitmap; UINT8 region; int xoffset, yoffset; @@ -97,7 +97,7 @@ pandora->clear_bitmap = clear; } -void pandora_update( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void pandora_update( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kaneko_pandora_state *pandora = get_safe_token(device); @@ -107,11 +107,11 @@ return; } - copybitmap_trans(bitmap, pandora->sprites_bitmap, 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *pandora->sprites_bitmap, 0, 0, 0, 0, cliprect, 0); } -static void pandora_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +static void pandora_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kaneko_pandora_state *pandora = get_safe_token(device); int sx = 0, sy = 0, x = 0, y = 0, offs; @@ -202,9 +202,9 @@ // the games can disable the clearing of the sprite bitmap, to leave sprite trails if (pandora->clear_bitmap) - bitmap_fill(pandora->sprites_bitmap, &pandora->screen->visible_area(), pandora->bg_pen); + pandora->sprites_bitmap->fill(pandora->bg_pen, pandora->screen->visible_area()); - pandora_draw(device, pandora->sprites_bitmap, &pandora->screen->visible_area()); + pandora_draw(device, *pandora->sprites_bitmap, pandora->screen->visible_area()); } /***************************************************************************** @@ -309,7 +309,7 @@ pandora->spriteram = auto_alloc_array(device->machine(), UINT8, 0x1000); - pandora->sprites_bitmap = pandora->screen->alloc_compatible_bitmap(); + pandora->sprites_bitmap = auto_bitmap_ind16_alloc(device->machine(), pandora->screen->width(), pandora->screen->height()); device->save_item(NAME(pandora->clear_bitmap)); device->save_pointer(NAME(pandora->spriteram), 0x1000); diff -Nru mame-0.144/src/mame/video/kan_pand.h mame-0.145/src/mame/video/kan_pand.h --- mame-0.144/src/mame/video/kan_pand.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kan_pand.h 2012-02-06 21:30:32.000000000 +0000 @@ -39,7 +39,7 @@ DEVICE I/O FUNCTIONS ***************************************************************************/ -void pandora_update(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +void pandora_update(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); void pandora_eof(device_t *device); void pandora_set_clear_bitmap(device_t *device, int clear); void pandora_set_bg_pen( device_t *device, int pen ); diff -Nru mame-0.144/src/mame/video/karnov.c mame-0.145/src/mame/video/karnov.c --- mame-0.144/src/mame/video/karnov.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/karnov.c 2012-02-06 21:30:31.000000000 +0000 @@ -69,10 +69,10 @@ { karnov_state *state = machine.driver_data(); state->m_flipscreen = data; - tilemap_set_flip_all(machine, state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + machine.tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { karnov_state *state = machine.driver_data(); int my, mx, offs, color, tile, fx, fy; @@ -100,10 +100,10 @@ color = tile >> 12; tile = tile & 0x7ff; if (state->m_flipscreen) - drawgfx_opaque(state->m_bitmap_f, 0, machine.gfx[1],tile, + drawgfx_opaque(*state->m_bitmap_f, state->m_bitmap_f->cliprect(), machine.gfx[1],tile, color, fx, fy, 496-16*mx,496-16*my); else - drawgfx_opaque(state->m_bitmap_f, 0, machine.gfx[1],tile, + drawgfx_opaque(*state->m_bitmap_f, state->m_bitmap_f->cliprect(), machine.gfx[1],tile, color, fx, fy, 16*mx,16*my); } @@ -118,17 +118,17 @@ scrollx = scrollx + 256; } - copyscrollbitmap(bitmap, state->m_bitmap_f, 1, &scrollx, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_bitmap_f, 1, &scrollx, 1, &scrolly, cliprect); } /******************************************************************************/ -SCREEN_UPDATE( karnov ) +SCREEN_UPDATE_IND16( karnov ) { - karnov_state *state = screen->machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0x800, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + karnov_state *state = screen.machine().driver_data(); + draw_background(screen.machine(), bitmap, cliprect); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x800, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -149,7 +149,7 @@ { karnov_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( karnov_playfield_swap_w ) @@ -166,12 +166,12 @@ karnov_state *state = machine.driver_data(); /* Allocate bitmap & tilemap */ - state->m_bitmap_f = auto_bitmap_alloc(machine, 512, 512, machine.primary_screen->format()); + state->m_bitmap_f = auto_bitmap_ind16_alloc(machine, 512, 512); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->save_item(NAME(*state->m_bitmap_f)); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); } VIDEO_START( wndrplnt ) @@ -179,12 +179,12 @@ karnov_state *state = machine.driver_data(); /* Allocate bitmap & tilemap */ - state->m_bitmap_f = auto_bitmap_alloc(machine, 512, 512, machine.primary_screen->format()); + state->m_bitmap_f = auto_bitmap_ind16_alloc(machine, 512, 512); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, tilemap_scan_cols, 8, 8, 32, 32); state->save_item(NAME(*state->m_bitmap_f)); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); } /******************************************************************************/ diff -Nru mame-0.144/src/mame/video/kchamp.c mame-0.145/src/mame/video/kchamp.c --- mame-0.144/src/mame/video/kchamp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kchamp.c 2012-02-06 21:30:31.000000000 +0000 @@ -28,14 +28,14 @@ { kchamp_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kchamp_colorram_w ) { kchamp_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kchamp_flipscreen_w ) @@ -68,7 +68,7 @@ 3 XXXXXXXX */ -static void kchamp_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void kchamp_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kchamp_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -97,7 +97,7 @@ } } -static void kchampvs_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void kchampvs_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kchamp_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -127,20 +127,20 @@ } -SCREEN_UPDATE( kchamp ) +SCREEN_UPDATE_IND16( kchamp ) { - kchamp_state *state = screen->machine().driver_data(); + kchamp_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - kchamp_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + kchamp_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( kchampvs ) +SCREEN_UPDATE_IND16( kchampvs ) { - kchamp_state *state = screen->machine().driver_data(); + kchamp_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - kchampvs_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + kchampvs_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/kickgoal.c mame-0.145/src/mame/video/kickgoal.c --- mame-0.144/src/mame/video/kickgoal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kickgoal.c 2012-02-06 21:30:31.000000000 +0000 @@ -8,21 +8,21 @@ { kickgoal_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fgtm, offset / 2); + state->m_fgtm->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( kickgoal_bgram_w ) { kickgoal_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bgtm, offset / 2); + state->m_bgtm->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( kickgoal_bg2ram_w ) { kickgoal_state *state = space->machine().driver_data(); state->m_bg2ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2tm, offset / 2); + state->m_bg2tm->mark_tile_dirty(offset / 2); } @@ -86,13 +86,13 @@ state->m_bgtm = tilemap_create(machine, get_kickgoal_bg_tile_info, tilemap_scan_kicksbg, 16, 32, 64, 64); state->m_bg2tm = tilemap_create(machine, get_kickgoal_bg2_tile_info, tilemap_scan_kicksbg2, 32, 64, 64, 64); - tilemap_set_transparent_pen(state->m_fgtm, 15); - tilemap_set_transparent_pen(state->m_bgtm, 15); + state->m_fgtm->set_transparent_pen(15); + state->m_bgtm->set_transparent_pen(15); } -static void kickgoal_draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void kickgoal_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { kickgoal_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -122,25 +122,25 @@ } -SCREEN_UPDATE( kickgoal ) +SCREEN_UPDATE_IND16( kickgoal ) { - kickgoal_state *state = screen->machine().driver_data(); + kickgoal_state *state = screen.machine().driver_data(); /* set scroll */ - tilemap_set_scrollx(state->m_fgtm, 0, state->m_scrram[0]); - tilemap_set_scrolly(state->m_fgtm, 0, state->m_scrram[1] * 2); - tilemap_set_scrollx(state->m_bgtm, 0, state->m_scrram[2]); - tilemap_set_scrolly(state->m_bgtm, 0, state->m_scrram[3] * 2); - tilemap_set_scrollx(state->m_bg2tm, 0, state->m_scrram[4]); - tilemap_set_scrolly(state->m_bg2tm, 0, state->m_scrram[5] * 2); + state->m_fgtm->set_scrollx(0, state->m_scrram[0]); + state->m_fgtm->set_scrolly(0, state->m_scrram[1] * 2); + state->m_bgtm->set_scrollx(0, state->m_scrram[2]); + state->m_bgtm->set_scrolly(0, state->m_scrram[3] * 2); + state->m_bg2tm->set_scrollx(0, state->m_scrram[4]); + state->m_bg2tm->set_scrolly(0, state->m_scrram[5] * 2); /* draw */ - tilemap_draw(bitmap, cliprect, state->m_bg2tm, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bgtm, 0, 0); + state->m_bg2tm->draw(bitmap, cliprect, 0, 0); + state->m_bgtm->draw(bitmap, cliprect, 0, 0); - kickgoal_draw_sprites(screen->machine(), bitmap, cliprect); + kickgoal_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fgtm, 0, 0); + state->m_fgtm->draw(bitmap, cliprect, 0, 0); /* popmessage ("Regs %04x %04x %04x %04x %04x %04x %04x %04x", @@ -220,12 +220,12 @@ state->m_bgtm = tilemap_create(machine, get_actionhw_bg_tile_info, tilemap_scan_actionhwbg, 16, 16, 64, 64); state->m_bg2tm = tilemap_create(machine, get_actionhw_bg2_tile_info, tilemap_scan_actionhwbg2, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_fgtm, 15); - tilemap_set_transparent_pen(state->m_bgtm, 15); + state->m_fgtm->set_transparent_pen(15); + state->m_bgtm->set_transparent_pen(15); } -static void actionhw_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void actionhw_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { kickgoal_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -253,23 +253,23 @@ } -SCREEN_UPDATE( actionhw ) +SCREEN_UPDATE_IND16( actionhw ) { - kickgoal_state *state = screen->machine().driver_data(); + kickgoal_state *state = screen.machine().driver_data(); /* set scroll */ - tilemap_set_scrollx(state->m_fgtm, 0, state->m_scrram[0]); - tilemap_set_scrolly(state->m_fgtm, 0, state->m_scrram[1]); - tilemap_set_scrollx(state->m_bgtm, 0, state->m_scrram[2]); - tilemap_set_scrolly(state->m_bgtm, 0, state->m_scrram[3]); - tilemap_set_scrollx(state->m_bg2tm, 0, state->m_scrram[4]); - tilemap_set_scrolly(state->m_bg2tm, 0, state->m_scrram[5]); + state->m_fgtm->set_scrollx(0, state->m_scrram[0]); + state->m_fgtm->set_scrolly(0, state->m_scrram[1]); + state->m_bgtm->set_scrollx(0, state->m_scrram[2]); + state->m_bgtm->set_scrolly(0, state->m_scrram[3]); + state->m_bg2tm->set_scrollx(0, state->m_scrram[4]); + state->m_bg2tm->set_scrolly(0, state->m_scrram[5]); /* draw */ - tilemap_draw(bitmap, cliprect, state->m_bg2tm, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bgtm, 0, 0); + state->m_bg2tm->draw(bitmap, cliprect, 0, 0); + state->m_bgtm->draw(bitmap, cliprect, 0, 0); - actionhw_draw_sprites(screen->machine(), bitmap, cliprect); + actionhw_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fgtm, 0, 0); + state->m_fgtm->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/kingobox.c mame-0.145/src/mame/video/kingobox.c --- mame-0.144/src/mame/video/kingobox.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kingobox.c 2012-02-06 21:30:31.000000000 +0000 @@ -135,28 +135,28 @@ { kingofb_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kingofb_colorram_w ) { kingofb_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kingofb_videoram2_w ) { kingofb_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kingofb_colorram2_w ) { kingofb_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kingofb_f800_w ) @@ -167,13 +167,13 @@ if (state->m_palette_bank != ((data & 0x18) >> 3)) { state->m_palette_bank = (data & 0x18) >> 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -205,10 +205,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols_flip_y, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols_flip_y, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void kingofb_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void kingofb_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { kingofb_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -246,14 +246,14 @@ } } -SCREEN_UPDATE( kingofb ) +SCREEN_UPDATE_IND16( kingofb ) { - kingofb_state *state = screen->machine().driver_data(); + kingofb_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, -(*state->m_scroll_y)); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - kingofb_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolly(0, -(*state->m_scroll_y)); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + kingofb_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -274,10 +274,10 @@ state->m_bg_tilemap = tilemap_create(machine, ringking_get_bg_tile_info, tilemap_scan_cols_flip_y, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols_flip_y, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void ringking_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void ringking_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kingofb_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -308,13 +308,13 @@ } } -SCREEN_UPDATE( ringking ) +SCREEN_UPDATE_IND16( ringking ) { - kingofb_state *state = screen->machine().driver_data(); + kingofb_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, -(*state->m_scroll_y)); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - ringking_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrolly(0, -(*state->m_scroll_y)); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + ringking_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/klax.c mame-0.145/src/mame/video/klax.c --- mame-0.144/src/mame/video/klax.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/klax.c 2012-02-06 21:30:32.000000000 +0000 @@ -101,23 +101,23 @@ * *************************************/ -SCREEN_UPDATE( klax ) +SCREEN_UPDATE_IND16( klax ) { - klax_state *state = screen->machine().driver_data(); + klax_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/kncljoe.c mame-0.145/src/mame/video/kncljoe.c --- mame-0.144/src/mame/video/kncljoe.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/kncljoe.c 2012-02-06 21:30:32.000000000 +0000 @@ -106,7 +106,7 @@ kncljoe_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 4); + state->m_bg_tilemap->set_scroll_rows(4); } @@ -121,7 +121,7 @@ { kncljoe_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( kncljoe_control_w ) @@ -139,7 +139,7 @@ set after IN0 - Coin 1 goes high AND the credit has been added */ state->m_flipscreen = data & 0x01; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? TILEMAP_FLIPX : TILEMAP_FLIPY); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? TILEMAP_FLIPX : TILEMAP_FLIPY); coin_counter_w(space->machine(), 0, data & 0x02); coin_counter_w(space->machine(), 1, data & 0x20); @@ -148,7 +148,7 @@ if (state->m_tile_bank != i) { state->m_tile_bank = i; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } i = (data & 0x04) >> 2; @@ -166,10 +166,10 @@ state->m_scrollregs[offset] = data; scrollx = state->m_scrollregs[0] | state->m_scrollregs[1] << 8; - tilemap_set_scrollx(state->m_bg_tilemap, 0, scrollx); - tilemap_set_scrollx(state->m_bg_tilemap, 1, scrollx); - tilemap_set_scrollx(state->m_bg_tilemap, 2, scrollx); - tilemap_set_scrollx(state->m_bg_tilemap, 3, 0); + state->m_bg_tilemap->set_scrollx(0, scrollx); + state->m_bg_tilemap->set_scrollx(1, scrollx); + state->m_bg_tilemap->set_scrollx(2, scrollx); + state->m_bg_tilemap->set_scrollx(3, 0); } @@ -180,11 +180,11 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kncljoe_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle clip = *cliprect; + rectangle clip = cliprect; const gfx_element *gfx = machine.gfx[1 + state->m_sprite_bank]; int i, j; static const int pribase[4]={0x0180, 0x0080, 0x0100, 0x0000}; @@ -230,7 +230,7 @@ if (sx >= 256-8) sx -= 256; - drawgfx_transpen(bitmap,&clip,gfx, + drawgfx_transpen(bitmap,clip,gfx, code, color, flipx,flipy, @@ -238,11 +238,11 @@ } } -SCREEN_UPDATE( kncljoe ) +SCREEN_UPDATE_IND16( kncljoe ) { - kncljoe_state *state = screen->machine().driver_data(); + kncljoe_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/konamigx.c mame-0.145/src/mame/video/konamigx.c --- mame-0.144/src/mame/video/konamigx.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/konamigx.c 2012-02-06 21:30:32.000000000 +0000 @@ -42,15 +42,15 @@ static int gx_rushingheroes_hack; static int gx_le2_textcolour_hack; static tilemap_t *gx_psac_tilemap, *gx_psac_tilemap2; -static bitmap_t* type3_roz_temp_bitmap; +static bitmap_ind16* type3_roz_temp_bitmap; static tilemap_t* gx_psac_tilemap_alt; static int konamigx_has_dual_screen; int konamigx_current_frame; INLINE void set_color_555(running_machine &machine, pen_t color, int rshift, int gshift, int bshift, UINT16 data); static int konamigx_palformat; -static bitmap_t* dualscreen_left_tempbitmap; -static bitmap_t* dualscreen_right_tempbitmap; +static bitmap_rgb32* dualscreen_left_tempbitmap; +static bitmap_rgb32* dualscreen_right_tempbitmap; /* On Type-1 the K053936 output is rendered to these temporary bitmaps as raw data the 'voxel' effect to give the pixels height is a post-process operation on the @@ -69,8 +69,8 @@ */ -static bitmap_t *gxtype1_roz_dstbitmap; -static bitmap_t *gxtype1_roz_dstbitmap2; +static bitmap_ind16 *gxtype1_roz_dstbitmap; +static bitmap_ind16 *gxtype1_roz_dstbitmap2; static rectangle gxtype1_roz_dstbitmapclip; static void (*game_tile_callback)(running_machine &machine, int layer, int *code, int *color, int *flags); @@ -78,7 +78,7 @@ // Localized K053936/ROZ+ #define K053936_MAX_CHIPS 2 -static rectangle K053936_cliprect[K053936_MAX_CHIPS] = {{0,0,0,0},{0,0,0,0}}; +static rectangle K053936_cliprect[K053936_MAX_CHIPS]; static int K053936_offset[K053936_MAX_CHIPS][2] = {{0,0},{0,0}}; static int K053936_clip_enabled[K053936_MAX_CHIPS] = {0,0}; @@ -89,16 +89,13 @@ void K053936GP_set_cliprect(int chip, int minx, int maxx, int miny, int maxy) { - rectangle *cliprect = &K053936_cliprect[chip]; - cliprect->min_x = minx; - cliprect->max_x = maxx; - cliprect->min_y = miny; - cliprect->max_y = maxy; + rectangle &cliprect = K053936_cliprect[chip]; + cliprect.set(minx, maxx, miny, maxy); } INLINE void K053936GP_copyroz32clip( running_machine &machine, - bitmap_t *dst_bitmap, bitmap_t *src_bitmap, - const rectangle *dst_cliprect, const rectangle *src_cliprect, + bitmap_rgb32 &dst_bitmap, bitmap_ind16 &src_bitmap, + const rectangle &dst_cliprect, const rectangle &src_cliprect, UINT32 _startx,UINT32 _starty,int _incxx,int _incxy,int _incyx,int _incyy, int tilebpp, int blend, int alpha, int clip, int pixeldouble_output ) { @@ -123,31 +120,28 @@ incxy = _incxy; incxx = _incxx; incyy = _incyy; incyx = _incyx; starty = _starty; startx = _startx; - if (src_cliprect && clip) // set source clip range to some extreme values when disabled + if (clip) // set source clip range to some extreme values when disabled { - src_minx = src_cliprect->min_x; - src_maxx = src_cliprect->max_x; - src_miny = src_cliprect->min_y; - src_maxy = src_cliprect->max_y; + src_minx = src_cliprect.min_x; + src_maxx = src_cliprect.max_x; + src_miny = src_cliprect.min_y; + src_maxy = src_cliprect.max_y; } // this simply isn't safe to do! else { src_minx = src_miny = -0x10000; src_maxx = src_maxy = 0x10000; } - if (dst_cliprect) // set target clip range - { - sx = dst_cliprect->min_x; - tx = dst_cliprect->max_x - sx + 1; - sy = dst_cliprect->min_y; - ty = dst_cliprect->max_y - sy + 1; + // set target clip range + sx = dst_cliprect.min_x; + tx = dst_cliprect.max_x - sx + 1; + sy = dst_cliprect.min_y; + ty = dst_cliprect.max_y - sy + 1; - startx += sx * incxx + sy * incyx; - starty += sx * incxy + sy * incyy; - } - else { sx = sy = 0; tx = dst_bitmap->width; ty = dst_bitmap->height; } + startx += sx * incxx + sy * incyx; + starty += sx * incxy + sy * incyy; // adjust entry points and other loop constants - dst_pitch = dst_bitmap->rowpixels; - dst_base = (UINT32*)dst_bitmap->base; + dst_pitch = dst_bitmap.rowpixels(); + dst_base = &dst_bitmap.pix32(0); dst_base2 = sy * dst_pitch + sx + tx; ecx = tx = -tx; @@ -155,10 +149,10 @@ pal_base = machine.pens; cmask = colormask[tilebpp]; - src_pitch = src_bitmap->rowpixels; - src_base = (UINT16 *)src_bitmap->base; - src_size = src_bitmap->width * src_bitmap->height; - dst_size = dst_bitmap->width * dst_bitmap->height; + src_pitch = src_bitmap.rowpixels(); + src_base = &src_bitmap.pix16(0); + src_size = src_bitmap.width() * src_bitmap.height(); + dst_size = dst_bitmap.width() * dst_bitmap.height(); dst_ptr = 0;//dst_base; cy = starty; cx = startx; @@ -283,27 +277,25 @@ // adapted from generic K053936_zoom_draw() static void K053936GP_zoom_draw(running_machine &machine, int chip, UINT16 *ctrl, UINT16 *linectrl, - bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, + bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output) { - bitmap_t *src_bitmap; - rectangle *src_cliprect; UINT16 *lineaddr; rectangle my_clip; UINT32 startx, starty; int incxx, incxy, incyx, incyy, y, maxy, clip; - src_bitmap = tilemap_get_pixmap(tmap); - src_cliprect = &K053936_cliprect[chip]; + bitmap_ind16 &src_bitmap = tmap->pixmap(); + rectangle &src_cliprect = K053936_cliprect[chip]; clip = K053936_clip_enabled[chip]; if (ctrl[0x07] & 0x0040) /* "super" mode */ { - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; - y = cliprect->min_y; - maxy = cliprect->max_y; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; + y = cliprect.min_y; + maxy = cliprect.max_y; while (y <= maxy) { @@ -322,7 +314,7 @@ starty -= K053936_offset[chip][0] * incxy; K053936GP_copyroz32clip(machine, - bitmap, src_bitmap, &my_clip, src_cliprect, + bitmap, src_bitmap, my_clip, src_cliprect, startx<<5, starty<<5, incxx<<5, incxy<<5, 0, 0, tilebpp, blend, alpha, clip, pixeldouble_output); y++; @@ -353,13 +345,13 @@ } } -static void K053936GP_0_zoom_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void K053936GP_0_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output) { K053936GP_zoom_draw(machine, 0,K053936_0_ctrl,K053936_0_linectrl,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output); } -static void K053936GP_1_zoom_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void K053936GP_1_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output) { K053936GP_zoom_draw(machine, 1,K053936_1_ctrl,K053936_1_linectrl,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output); @@ -385,7 +377,7 @@ INLINE void zdrawgfxzoom32GP( - bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, + bitmap_rgb32 &bitmap, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int alpha, int drawmode, int zcode, int pri) { @@ -453,12 +445,12 @@ pal_base = gfx->machine().pens + gfx->color_base + (color % gfx->total_colors) * granularity; shd_base = gfx->machine().shadow_table; - dst_ptr = (UINT32 *)bitmap->base; - dst_pitch = bitmap->rowpixels; - dst_minx = cliprect->min_x; - dst_maxx = cliprect->max_x; - dst_miny = cliprect->min_y; - dst_maxy = cliprect->max_y; + dst_ptr = &bitmap.pix32(0); + dst_pitch = bitmap.rowpixels(); + dst_minx = cliprect.min_x; + dst_maxx = cliprect.max_x; + dst_miny = cliprect.min_y; + dst_maxy = cliprect.max_y; dst_x = sx; dst_y = sy; @@ -510,8 +502,8 @@ // adjust insertion points and pre-entry constants eax = (dst_y - dst_miny) * GX_ZBUFW + (dst_x - dst_minx) + dst_w; -// db0 = z8 = (UINT8)zcode; -// db1 = p8 = (UINT8)pri; + z8 = (UINT8)zcode; + p8 = (UINT8)pri; ozbuf_ptr += eax; szbuf_ptr += eax << 1; dst_ptr += dst_y * dst_pitch + dst_x + dst_w; @@ -1061,8 +1053,8 @@ { const rectangle &visarea = machine.primary_screen->visible_area(); - int w = visarea.max_x - visarea.min_x + 1; - int h = visarea.max_y - visarea.min_y + 1; + int w = visarea.width(); + int h = visarea.height(); UINT8 *zptr = gx_objzbuf; int ecx = h; @@ -1134,7 +1126,7 @@ gx_objdma = 0; gx_primode = 0; - gx_objzbuf = (UINT8 *)machine.priority_bitmap->base; + gx_objzbuf = &machine.priority_bitmap.pix8(0); gx_shdzbuf = auto_alloc_array(machine, UINT8, GX_ZBUFSIZE); gx_objpool = auto_alloc_array(machine, struct GX_OBJ, GX_MAX_OBJECTS); @@ -1163,10 +1155,10 @@ if (gx_objdma && gx_spriteram && K053247_ram) memcpy(gx_spriteram, K053247_ram, 0x1000); } -void konamigx_mixer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +void konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *sub1, int sub1flags, tilemap_t *sub2, int sub2flags, - int mixerflags, bitmap_t *extra_bitmap, int rushingheroes_hack) + int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack) { static const int xoffset[8] = { 0, 1, 4, 5, 16, 17, 20, 21 }; static const int yoffset[8] = { 0, 2, 8, 10, 32, 34, 40, 42 }; @@ -1182,6 +1174,8 @@ int nobj, i, j, k, l, temp, temp1, temp2, temp3, temp4, count; int order, offs, code, color, zcode, pri = 0, spri, spri_min, shdprisel, shadow, alpha, drawmode; + // buffer can move when it's resized, so refresh the pointer + gx_objzbuf = &machine.priority_bitmap.pix8(0); // abort if object database failed to initialize objpool = gx_objpool; @@ -1580,7 +1574,7 @@ { int pixeldouble_output = 0; const rectangle &visarea = machine.primary_screen->visible_area(); - int width = visarea.max_x - visarea.min_x + 1; + int width = visarea.width(); if (width>512) // vsnetscr case pixeldouble_output = 1; @@ -1633,8 +1627,8 @@ // - todo, use the pixeldouble_output I just added for vsnet instead? for (yy=0;yypix16(yy); + UINT32* dst = &bitmap.pix32(yy); int shiftpos = 0; for (xx=0;xxmark_all_dirty(); konamigx_type3_psac2_actual_last_bank = konamigx_type3_psac2_actual_bank; } */ @@ -2156,8 +2150,8 @@ K056832_vh_start(machine, "gfx1", K056832_BPP_6, 0, NULL, konamigx_type2_tile_callback, 1); K055673_vh_start(machine, "gfx2", K055673_LAYOUT_GX6, -132, -23, konamigx_type2_sprite_callback); - dualscreen_left_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); - dualscreen_right_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); + dualscreen_left_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); + dualscreen_right_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); _gxcommoninitnosprites(machine); @@ -2169,10 +2163,10 @@ /* set up tile layers */ - type3_roz_temp_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + type3_roz_temp_bitmap = auto_bitmap_ind16_alloc(machine, width, height); - //tilemap_set_flip(gx_psac_tilemap, TILEMAP_FLIPX| TILEMAP_FLIPY); + //gx_psac_tilemap->set_flip(TILEMAP_FLIPX| TILEMAP_FLIPY); K053936_wraparound_enable(0, 1); // K053936GP_set_offset(0, -30, -1); @@ -2195,8 +2189,8 @@ K056832_vh_start(machine, "gfx1", K056832_BPP_8, 0, NULL, konamigx_type2_tile_callback, 0); K055673_vh_start(machine, "gfx2", K055673_LAYOUT_GX6, -79, -24, konamigx_type2_sprite_callback); // -23 looks better in intro - dualscreen_left_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); - dualscreen_right_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); + dualscreen_left_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); + dualscreen_right_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); _gxcommoninitnosprites(machine); @@ -2226,8 +2220,8 @@ K056832_vh_start(machine, "gfx1", K056832_BPP_8, 0, NULL, konamigx_type2_tile_callback, 2); // set djmain_hack to 2 to kill layer association or half the tilemaps vanish on screen 0 K055673_vh_start(machine, "gfx2", K055673_LAYOUT_GX6, -132, -23, konamigx_type2_sprite_callback); - dualscreen_left_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); - dualscreen_right_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); + dualscreen_left_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); + dualscreen_right_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); _gxcommoninitnosprites(machine); @@ -2256,8 +2250,8 @@ K056832_vh_start(machine, "gfx1", K056832_BPP_8, 0, NULL, konamigx_type2_tile_callback, 0); K055673_vh_start(machine, "gfx2", K055673_LAYOUT_GX6, -81, -23, konamigx_type2_sprite_callback); - dualscreen_left_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); - dualscreen_right_tempbitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_RGB32); + dualscreen_left_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); + dualscreen_right_tempbitmap = auto_bitmap_rgb32_alloc(machine, width, height); _gxcommoninitnosprites(machine); @@ -2314,20 +2308,17 @@ gx_psac_tilemap2 = tilemap_create(machine, get_gx_psac1b_tile_info, tilemap_scan_cols, 16, 16, 128, 128); // transparency will be handled manually in post-processing - //tilemap_set_transparent_pen(gx_psac_tilemap, 0); - //tilemap_set_transparent_pen(gx_psac_tilemap2, 0); + //gx_psac_tilemap->set_transparent_pen(0); + //gx_psac_tilemap2->set_transparent_pen(0); gx_rozenable = 0; gx_specialrozenable = 1; - gxtype1_roz_dstbitmap = auto_bitmap_alloc(machine,512,512,BITMAP_FORMAT_INDEXED16); // BITMAP_FORMAT_INDEXED16 because we NEED the raw pen data for post-processing - gxtype1_roz_dstbitmap2 = auto_bitmap_alloc(machine,512,512,BITMAP_FORMAT_INDEXED16); // BITMAP_FORMAT_INDEXED16 because we NEED the raw pen data for post-processing + gxtype1_roz_dstbitmap = auto_bitmap_ind16_alloc(machine,512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing + gxtype1_roz_dstbitmap2 = auto_bitmap_ind16_alloc(machine,512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing - gxtype1_roz_dstbitmapclip.min_x = 0; - gxtype1_roz_dstbitmapclip.max_x = 512-1; - gxtype1_roz_dstbitmapclip.min_y = 0; - gxtype1_roz_dstbitmapclip.max_y = 512-1; + gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1); K053936_wraparound_enable(0, 1); @@ -2335,7 +2326,7 @@ // urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge // until there is a better solution, or priority bitmap can be specified manually. - machine.priority_bitmap = auto_bitmap_alloc(machine,2048,2048,BITMAP_FORMAT_INDEXED16); + machine.priority_bitmap.allocate(2048,2048); } @@ -2355,20 +2346,17 @@ gx_psac_tilemap2 = tilemap_create(machine, get_gx_psac1b_tile_info, tilemap_scan_cols, 16, 16, 128, 128); // transparency will be handled manually in post-processing - //tilemap_set_transparent_pen(gx_psac_tilemap, 0); - //tilemap_set_transparent_pen(gx_psac_tilemap2, 0); + //gx_psac_tilemap->set_transparent_pen(0); + //gx_psac_tilemap2->set_transparent_pen(0); gx_rozenable = 0; gx_specialrozenable = 1; - gxtype1_roz_dstbitmap = auto_bitmap_alloc(machine,512,512,BITMAP_FORMAT_INDEXED16); // BITMAP_FORMAT_INDEXED16 because we NEED the raw pen data for post-processing - gxtype1_roz_dstbitmap2 = auto_bitmap_alloc(machine,512,512,BITMAP_FORMAT_INDEXED16); // BITMAP_FORMAT_INDEXED16 because we NEED the raw pen data for post-processing + gxtype1_roz_dstbitmap = auto_bitmap_ind16_alloc(machine,512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing + gxtype1_roz_dstbitmap2 = auto_bitmap_ind16_alloc(machine,512,512); // BITMAP_FORMAT_IND16 because we NEED the raw pen data for post-processing - gxtype1_roz_dstbitmapclip.min_x = 0; - gxtype1_roz_dstbitmapclip.max_x = 512-1; - gxtype1_roz_dstbitmapclip.min_y = 0; - gxtype1_roz_dstbitmapclip.max_y = 512-1; + gxtype1_roz_dstbitmapclip.set(0, 512-1, 0, 512-1); K053936_wraparound_enable(0, 1); @@ -2376,106 +2364,14 @@ // urgh.. the priority bitmap is global, and because our temp bitmaps are bigger than the screen, this causes issues.. so just allocate something huge // until there is a better solution, or priority bitmap can be specified manually. - machine.priority_bitmap = auto_bitmap_alloc(machine,2048,2048,BITMAP_FORMAT_INDEXED16); + machine.priority_bitmap.allocate(2048,2048); } -SCREEN_UPDATE(konamigx) +SCREEN_UPDATE_RGB32(konamigx) { int i, newbank, newbase, dirty, unchained; - bitmap_t* realbitmap = bitmap; - - if (konamigx_has_dual_screen) - { - device_t *left_screen = screen->machine().device("screen"); - device_t *right_screen = screen->machine().device("screen2"); - - /* the video gets demuxed by a board which plugs into the jamma connector */ - if (screen==left_screen) - { - konamigx_current_frame^=1; - - if (konamigx_current_frame==1) - { - int offset=0; - - if (konamigx_palformat==1) - { - for (offset=0;offset<0x4000/4;offset++) - { - UINT32 coldat = screen->machine().generic.paletteram.u32[offset]; - - set_color_555(screen->machine(), offset*2, 0, 5, 10,coldat >> 16); - set_color_555(screen->machine(), offset*2+1, 0, 5, 10,coldat & 0xffff); - } - } - else - { - for (offset=0;offset<0x8000/4;offset++) - { - int r,g,b; - - r = (screen->machine().generic.paletteram.u32[offset] >>16) & 0xff; - g = (screen->machine().generic.paletteram.u32[offset] >> 8) & 0xff; - b = (screen->machine().generic.paletteram.u32[offset] >> 0) & 0xff; - - palette_set_color(screen->machine(),offset,MAKE_RGB(r,g,b)); - } - } - - bitmap = dualscreen_left_tempbitmap; - // draw - } - else - { - copybitmap(bitmap, dualscreen_left_tempbitmap, 0, 0, 0, 0, cliprect); - return 0; - } - - } - else if (screen==right_screen) - { - - if (konamigx_current_frame==1) - { - copybitmap(bitmap, dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect); - return 0; - } - else - { - - int offset=0; - - if (konamigx_palformat==1) - { - for (offset=0;offset<0x4000/4;offset++) - { - UINT32 coldat = gx_subpaletteram32[offset]; - - set_color_555(screen->machine(), offset*2, 0, 5, 10,coldat >> 16); - set_color_555(screen->machine(), offset*2+1, 0, 5, 10,coldat & 0xffff); - } - } - else - { - for (offset=0;offset<0x8000/4;offset++) - { - int r,g,b; - - r = (gx_subpaletteram32[offset] >>16) & 0xff; - g = (gx_subpaletteram32[offset] >> 8) & 0xff; - b = (gx_subpaletteram32[offset] >> 0) & 0xff; - - palette_set_color(screen->machine(),offset,MAKE_RGB(r,g,b)); - } - } - bitmap = dualscreen_right_tempbitmap; - // draw - } - } - } - /* if any banks are different from last render, we need to flush the planes */ for (dirty = 0, i = 0; i < 8; i++) @@ -2515,10 +2411,10 @@ if (psac_colorbase != last_psac_colorbase) { - tilemap_mark_all_tiles_dirty(gx_psac_tilemap); + gx_psac_tilemap->mark_all_dirty(); if (gx_rozenable == 3) { - tilemap_mark_all_tiles_dirty(gx_psac_tilemap2); + gx_psac_tilemap2->mark_all_dirty(); } } } @@ -2528,15 +2424,15 @@ // Type-1 if (gx_specialrozenable == 1) { - K053936_0_zoom_draw(gxtype1_roz_dstbitmap, &gxtype1_roz_dstbitmapclip,gx_psac_tilemap, 0,0,0); // height data - K053936_0_zoom_draw(gxtype1_roz_dstbitmap2,&gxtype1_roz_dstbitmapclip,gx_psac_tilemap2,0,0,0); // colour data (+ some voxel height data?) + K053936_0_zoom_draw(*gxtype1_roz_dstbitmap, gxtype1_roz_dstbitmapclip,gx_psac_tilemap, 0,0,0); // height data + K053936_0_zoom_draw(*gxtype1_roz_dstbitmap2,gxtype1_roz_dstbitmapclip,gx_psac_tilemap2,0,0,0); // colour data (+ some voxel height data?) } if (gx_specialrozenable==3) { - konamigx_mixer(screen->machine(), bitmap, cliprect, gx_psac_tilemap, GXSUB_8BPP,0,0, 0, 0, gx_rushingheroes_hack); + konamigx_mixer(screen.machine(), bitmap, cliprect, gx_psac_tilemap, GXSUB_8BPP,0,0, 0, 0, gx_rushingheroes_hack); } // hack, draw the roz tilemap if W is held // todo: fix so that it works with the mixer without crashing(!) @@ -2544,20 +2440,18 @@ { // we're going to throw half of this away anyway in post-process, so only render what's needed rectangle temprect; - temprect.min_x = cliprect->min_x; - temprect.max_x = cliprect->min_x+320; - temprect.min_y = cliprect->min_y; - temprect.max_y = cliprect->max_y; + temprect = cliprect; + temprect.max_x = cliprect.min_x+320; - if (konamigx_type3_psac2_actual_bank == 1) K053936_0_zoom_draw(type3_roz_temp_bitmap, &temprect,gx_psac_tilemap_alt, 0,0,0); // soccerss playfield - else K053936_0_zoom_draw(type3_roz_temp_bitmap, &temprect,gx_psac_tilemap, 0,0,0); // soccerss playfield + if (konamigx_type3_psac2_actual_bank == 1) K053936_0_zoom_draw(*type3_roz_temp_bitmap, temprect,gx_psac_tilemap_alt, 0,0,0); // soccerss playfield + else K053936_0_zoom_draw(*type3_roz_temp_bitmap, temprect,gx_psac_tilemap, 0,0,0); // soccerss playfield - konamigx_mixer(screen->machine(), bitmap, cliprect, 0, 0, 0, 0, 0, type3_roz_temp_bitmap, gx_rushingheroes_hack); + konamigx_mixer(screen.machine(), bitmap, cliprect, 0, 0, 0, 0, 0, type3_roz_temp_bitmap, gx_rushingheroes_hack); } else { - konamigx_mixer(screen->machine(), bitmap, cliprect, 0, 0, 0, 0, 0, 0, gx_rushingheroes_hack); + konamigx_mixer(screen.machine(), bitmap, cliprect, 0, 0, 0, 0, 0, 0, gx_rushingheroes_hack); } @@ -2565,25 +2459,25 @@ /* Hack! draw type-1 roz layer here for testing purposes only */ if (gx_specialrozenable == 1) { - const pen_t *paldata = screen->machine().pens; + const pen_t *paldata = screen.machine().pens; - if ( screen->machine().input().code_pressed(KEYCODE_W) ) + if ( screen.machine().input().code_pressed(KEYCODE_W) ) { int y,x; // make it flicker, to compare positioning - //if (screen->frame_number() & 1) + //if (screen.frame_number() & 1) { for (y=0;y<256;y++) { - //UINT16* src = BITMAP_ADDR16( gxtype1_roz_dstbitmap, y, 0); + //UINT16* src = &gxtype1_roz_dstbitmap->pix16(y); - //UINT32* dst = BITMAP_ADDR32( bitmap, y, 0); + //UINT32* dst = &bitmap.pix32(y); // ths K053936 rendering should probably just be flipped // this is just kludged to align the racing force 2d logo - UINT16* src = BITMAP_ADDR16( gxtype1_roz_dstbitmap2, y+30, 0); - UINT32* dst = BITMAP_ADDR32( bitmap, 256-y, 0); + UINT16* src = &gxtype1_roz_dstbitmap2->pix16(y+30); + UINT32* dst = &bitmap.pix32(256-y); for (x=0;x<512;x++) { @@ -2597,19 +2491,90 @@ } - if (konamigx_has_dual_screen) + return 0; +} + +SCREEN_UPDATE_RGB32(konamigx_left) +{ + /* the video gets demuxed by a board which plugs into the jamma connector */ + konamigx_current_frame^=1; + + if (konamigx_current_frame==1) { - device_t *left_screen = screen->machine().device("screen"); - device_t *right_screen = screen->machine().device("screen2"); + int offset=0; - if (screen==left_screen) + if (konamigx_palformat==1) { - copybitmap(realbitmap, dualscreen_left_tempbitmap, 0, 0, 0, 0, cliprect); + for (offset=0;offset<0x4000/4;offset++) + { + UINT32 coldat = screen.machine().generic.paletteram.u32[offset]; + + set_color_555(screen.machine(), offset*2, 0, 5, 10,coldat >> 16); + set_color_555(screen.machine(), offset*2+1, 0, 5, 10,coldat & 0xffff); + } } - else if (screen==right_screen) + else { - copybitmap(realbitmap, dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect); + for (offset=0;offset<0x8000/4;offset++) + { + int r,g,b; + + r = (screen.machine().generic.paletteram.u32[offset] >>16) & 0xff; + g = (screen.machine().generic.paletteram.u32[offset] >> 8) & 0xff; + b = (screen.machine().generic.paletteram.u32[offset] >> 0) & 0xff; + + palette_set_color(screen.machine(),offset,MAKE_RGB(r,g,b)); + } } + + SCREEN_UPDATE_NAME(konamigx)(NULL, screen, downcast(*dualscreen_left_tempbitmap), cliprect); + copybitmap(bitmap, *dualscreen_left_tempbitmap, 0, 0, 0, 0, cliprect); + } + else + { + copybitmap(bitmap, *dualscreen_left_tempbitmap, 0, 0, 0, 0, cliprect); + } + + return 0; +} + +SCREEN_UPDATE_RGB32(konamigx_right) +{ + if (konamigx_current_frame==1) + { + copybitmap(bitmap, *dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect); + } + else + { + + int offset=0; + + if (konamigx_palformat==1) + { + for (offset=0;offset<0x4000/4;offset++) + { + UINT32 coldat = gx_subpaletteram32[offset]; + + set_color_555(screen.machine(), offset*2, 0, 5, 10,coldat >> 16); + set_color_555(screen.machine(), offset*2+1, 0, 5, 10,coldat & 0xffff); + } + } + else + { + for (offset=0;offset<0x8000/4;offset++) + { + int r,g,b; + + r = (gx_subpaletteram32[offset] >>16) & 0xff; + g = (gx_subpaletteram32[offset] >> 8) & 0xff; + b = (gx_subpaletteram32[offset] >> 0) & 0xff; + + palette_set_color(screen.machine(),offset,MAKE_RGB(r,g,b)); + } + } + + SCREEN_UPDATE_NAME(konamigx)(NULL, screen, downcast(*dualscreen_right_tempbitmap), cliprect); + copybitmap(bitmap, *dualscreen_right_tempbitmap, 0, 0, 0, 0, cliprect); } return 0; @@ -2695,8 +2660,8 @@ WRITE32_HANDLER(konamigx_t1_psacmap_w) { COMBINE_DATA(&gx_psacram[offset]); - tilemap_mark_tile_dirty(gx_psac_tilemap, offset/2); - tilemap_mark_tile_dirty(gx_psac_tilemap2, offset/2); + gx_psac_tilemap->mark_tile_dirty(offset/2); + gx_psac_tilemap2->mark_tile_dirty(offset/2); } // type 4 RAM-based PSAC tilemap @@ -2704,7 +2669,7 @@ { COMBINE_DATA(&gx_psacram[offset]); - tilemap_mark_tile_dirty(gx_psac_tilemap, offset*2); - tilemap_mark_tile_dirty(gx_psac_tilemap, (offset*2)+1); + gx_psac_tilemap->mark_tile_dirty(offset*2); + gx_psac_tilemap->mark_tile_dirty((offset*2)+1); } diff -Nru mame-0.144/src/mame/video/konamiic.c mame-0.145/src/mame/video/konamiic.c --- mame-0.144/src/mame/video/konamiic.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/konamiic.c 2012-02-06 21:30:32.000000000 +0000 @@ -1518,7 +1518,7 @@ // there is another implementation of this in machine/konamigx.c (!) // why? -static void K053936_zoom_draw(int chip,UINT16 *ctrl,UINT16 *linectrl, bitmap_t *bitmap,const rectangle *cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack) +static void K053936_zoom_draw(int chip,UINT16 *ctrl,UINT16 *linectrl, bitmap_ind16 &bitmap,const rectangle &cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack) { if (!tmap) return; @@ -1542,25 +1542,25 @@ { my_clip.min_x = ctrl[0x08] + K053936_offset[chip][0]+2; my_clip.max_x = ctrl[0x09] + K053936_offset[chip][0]+2 - 1; - if (my_clip.min_x < cliprect->min_x) - my_clip.min_x = cliprect->min_x; - if (my_clip.max_x > cliprect->max_x) - my_clip.max_x = cliprect->max_x; + if (my_clip.min_x < cliprect.min_x) + my_clip.min_x = cliprect.min_x; + if (my_clip.max_x > cliprect.max_x) + my_clip.max_x = cliprect.max_x; y = ctrl[0x0a] + K053936_offset[chip][1]-2; - if (y < cliprect->min_y) - y = cliprect->min_y; + if (y < cliprect.min_y) + y = cliprect.min_y; maxy = ctrl[0x0b] + K053936_offset[chip][1]-2 - 1; - if (maxy > cliprect->max_y) - maxy = cliprect->max_y; + if (maxy > cliprect.max_y) + maxy = cliprect.max_y; } else { - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; - y = cliprect->min_y; - maxy = cliprect->max_y; + y = cliprect.min_y; + maxy = cliprect.max_y; } while (y <= maxy) @@ -1581,7 +1581,7 @@ startx -= K053936_offset[chip][0] * incxx; starty -= K053936_offset[chip][0] * incxy; - tilemap_draw_roz(bitmap,&my_clip,tmap,startx << 5,starty << 5, + tmap->draw_roz(bitmap, my_clip, startx << 5,starty << 5, incxx << 5,incxy << 5,0,0, K053936_wraparound[chip], flags,priority); @@ -1610,7 +1610,7 @@ startx -= K053936_offset[chip][0] * incxx; starty -= K053936_offset[chip][0] * incxy; - tilemap_draw_roz(bitmap,cliprect,tmap,startx << 5,starty << 5, + tmap->draw_roz(bitmap, cliprect, startx << 5,starty << 5, incxx << 5,incxy << 5,incyx << 5,incyy << 5, K053936_wraparound[chip], flags,priority); @@ -1639,7 +1639,7 @@ } -void K053936_0_zoom_draw(bitmap_t *bitmap,const rectangle *cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack) +void K053936_0_zoom_draw(bitmap_ind16 &bitmap,const rectangle &cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack) { K053936_zoom_draw(0,K053936_0_ctrl,K053936_0_linectrl,bitmap,cliprect,tmap,flags,priority, glfgreat_hack); } @@ -1735,7 +1735,7 @@ #define K056832_PAGE_COUNT 16 static tilemap_t *K056832_tilemap[K056832_PAGE_COUNT]; -static bitmap_t *K056832_pixmap[K056832_PAGE_COUNT]; +static bitmap_ind16 *K056832_pixmap[K056832_PAGE_COUNT]; static UINT16 K056832_regs[0x20]; // 157/832 regs group 1 static UINT16 K056832_regsb[4]; // 157/832 regs group 2, board dependent @@ -1785,7 +1785,7 @@ static void K056832_mark_page_dirty(int page) { if (K056832_PageTileMode[page]) - tilemap_mark_all_tiles_dirty(K056832_tilemap[page]); + K056832_tilemap[page]->mark_all_dirty(); else K056832_mark_all_lines_dirty(page); } @@ -1875,7 +1875,7 @@ static void (*K056832_callback)(running_machine &machine, int layer, int *code, int *color, int *flags); -INLINE void K056832_get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int pageIndex ) +INLINE void K056832_get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int pageIndex ) { static const struct K056832_SHIFTMASKS { @@ -2179,9 +2179,9 @@ { tmap = K056832_tilemap[i]; - K056832_pixmap[i] = tilemap_get_pixmap(tmap); + K056832_pixmap[i] = &tmap->pixmap(); - tilemap_set_transparent_pen(tmap, 0); + tmap->set_transparent_pen(0); } memset(K056832_videoram, 0x00, 0x20000); @@ -2400,7 +2400,7 @@ *tile_ptr = data; if (K056832_PageTileMode[K056832_SelectedPage]) - tilemap_mark_tile_dirty(K056832_tilemap[K056832_SelectedPage], offset); + K056832_tilemap[K056832_SelectedPage]->mark_tile_dirty(offset); else K056832_mark_line_dirty(K056832_SelectedPage, offset); } @@ -2423,7 +2423,7 @@ tile_ptr[1] = data; if (K056832_PageTileMode[K056832_SelectedPage]) - tilemap_mark_tile_dirty(K056832_tilemap[K056832_SelectedPage], offset); + K056832_tilemap[K056832_SelectedPage]->mark_tile_dirty(offset); else K056832_mark_line_dirty(K056832_SelectedPage, offset); } @@ -2455,7 +2455,7 @@ if (new_data & 0x10) flip |= TILEMAP_FLIPX; for (i=0; iset_flip(flip); } } @@ -2563,7 +2563,7 @@ } -static int K056832_update_linemap(running_machine &machine, bitmap_t *bitmap, int page, int flags) +static int K056832_update_linemap(running_machine &machine, bitmap_rgb32 &bitmap, int page, int flags) { if (K056832_PageTileMode[page]) return(0); @@ -2576,12 +2576,11 @@ tilemap_t *tmap; UINT32 *dirty; int all_dirty; - bitmap_t* xprmap; UINT8 *xprdata; tmap = K056832_tilemap[page]; - xprmap = tilemap_get_flagsmap(tmap); - xprdata = tilemap_get_tile_flags(tmap); + bitmap_ind8 &xprmap = tmap->flagsmap(); + xprdata = tmap->tile_flags(); dirty = K056832_LineDirty[page]; all_dirty = K056832_AllLinesDirty[page]; @@ -2594,8 +2593,8 @@ // force tilemap into a clean, static state // *really ugly but it minimizes alteration to tilemap.c memset (&zerorect, 0, sizeof(rectangle)); // zero dimension - tilemap_draw(bitmap, &zerorect, tmap, 0, 0); // dummy call to reset tile_dirty_map - bitmap_fill(xprmap, 0, 0); // reset pixel transparency_bitmap; + tmap->draw(bitmap, zerorect, 0, 0); // dummy call to reset tile_dirty_map + xprmap.fill(0); // reset pixel transparency_bitmap; memset(xprdata, TILEMAP_PIXEL_LAYER0, 0x800); // reset tile transparency_data; } else @@ -2611,7 +2610,7 @@ { - bitmap_t *pixmap; + bitmap_ind16 *pixmap; UINT8 code_transparent, code_opaque; const pen_t *pal_ptr; @@ -2646,8 +2645,8 @@ tile_data tileinfo = {0}; - dst_ptr = BITMAP_ADDR16(pixmap, line, 0); - xpr_ptr = BITMAP_ADDR8(xprmap, line, 0); + dst_ptr = &pixmap->pix16(line); + xpr_ptr = &xprmap.pix8(line); if (!all_dirty) { @@ -2687,7 +2686,7 @@ return(0); } -void K056832_tilemap_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, UINT32 flags, UINT32 priority) +void K056832_tilemap_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority) { static int last_colorbase[K056832_PAGE_COUNT]; @@ -2721,10 +2720,10 @@ height = rowspan * K056832_PAGE_HEIGHT; width = colspan * K056832_PAGE_WIDTH; - cminx = cliprect->min_x; - cmaxx = cliprect->max_x; - cminy = cliprect->min_y; - cmaxy = cliprect->max_y; + cminx = cliprect.min_x; + cmaxx = cliprect.max_x; + cminy = cliprect.min_y; + cmaxy = cliprect.max_y; // flip correction registers flipy = K056832_regs[0] & 0x20; @@ -2890,7 +2889,7 @@ if (K056832_update_linemap(machine, bitmap, pageIndex, flags)) continue; tmap = K056832_tilemap[pageIndex]; - tilemap_set_scrolly(tmap, 0, ay); + tmap->set_scrolly(0, ay); last_dx = 0x100000; last_visible = 0; @@ -2961,12 +2960,12 @@ // the tilemaps are 512 pixels across. Assume that if the limits were set as below that we // want the tilemap to be drawn on the right hand side.. this is probably not the correct // logic, but it works. - if ((drawrect.min_x>0) && (drawrect.max_x==511)) drawrect.max_x=cliprect->max_x; + if ((drawrect.min_x>0) && (drawrect.max_x==511)) drawrect.max_x=cliprect.max_x; - tilemap_set_scrollx(tmap, 0, dx); + tmap->set_scrollx(0, dx); LINE_SHORTCIRCUIT: - tilemap_draw(bitmap, &drawrect, tmap, flags, priority); + tmap->draw(bitmap, drawrect, flags, priority); } // end of line loop } // end of column loop @@ -3154,7 +3153,7 @@ #ifdef UNUSED_FUNCTION // K054338 BG color fill -void K054338_fill_solid_bg(bitmap_t *bitmap) +void K054338_fill_solid_bg(bitmap_ind16 &bitmap) { UINT32 bgcolor; UINT32 *pLine; @@ -3164,18 +3163,18 @@ bgcolor |= K054338_read_register(K338_REG_BGC_GB); /* and fill the screen with it */ - for (y = 0; y < bitmap->height; y++) + for (y = 0; y < bitmap.height; y++) { - pLine = (UINT32 *)bitmap->base; - pLine += (bitmap->rowpixels*y); - for (x = 0; x < bitmap->width; x++) + pLine = (UINT32 *)bitmap.base; + pLine += (bitmap.rowpixels*y); + for (x = 0; x < bitmap.width; x++) *pLine++ = bgcolor; } } #endif // Unified K054338/K055555 BG color fill -void K054338_fill_backcolor(running_machine &machine, bitmap_t *bitmap, int mode) // (see p.67) +void K054338_fill_backcolor(running_machine &machine, bitmap_rgb32 &bitmap, int mode) // (see p.67) { int clipx, clipy, clipw, cliph, i, dst_pitch; int BGC_CBLK, BGC_SET; @@ -3188,8 +3187,8 @@ clipw = (visarea.max_x - clipx + 4) & ~3; cliph = visarea.max_y - clipy + 1; - dst_ptr = BITMAP_ADDR32(bitmap, clipy, 0); - dst_pitch = bitmap->rowpixels; + dst_ptr = &bitmap.pix32(clipy); + dst_pitch = bitmap.rowpixels(); dst_ptr += clipx; BGC_SET = 0; diff -Nru mame-0.144/src/mame/video/konamiic.h mame-0.145/src/mame/video/konamiic.h --- mame-0.144/src/mame/video/konamiic.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/konamiic.h 2012-02-06 21:30:32.000000000 +0000 @@ -37,13 +37,13 @@ extern UINT16 *K053936_0_ctrl,*K053936_0_linectrl; extern UINT16 *K053936_1_ctrl,*K053936_1_linectrl; -void K053936_0_zoom_draw(bitmap_t *bitmap,const rectangle *cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack); +void K053936_0_zoom_draw(bitmap_ind16 &bitmap,const rectangle &cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack); void K053936_wraparound_enable(int chip, int status); void K053936_set_offset(int chip, int xoffs, int yoffs); /* - Note: K053251_w() automatically does a tilemap_mark_all_tiles_dirty(ALL_TILEMAPS) + Note: K053251_w() automatically does a ALL_TILEMAPS->mark_all_dirty() when some palette index changes. If ALL_TILEMAPS is too expensive, use K053251_set_tilemaps() to indicate which tilemap is associated with each index. */ @@ -76,7 +76,7 @@ WRITE16_HANDLER( K056832_b_word_w ); void K056832_mark_plane_dirty(int num); void K056832_MarkAllTilemapsDirty(void); -void K056832_tilemap_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int num, UINT32 flags, UINT32 priority); +void K056832_tilemap_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int num, UINT32 flags, UINT32 priority); int K056832_get_LayerAssociation(void); void K056832_set_LayerOffset(int layer, int offsx, int offsy); void K056832_set_UpdateMode(int mode); @@ -173,8 +173,8 @@ WRITE32_HANDLER( K054338_long_w ); int K054338_read_register(int reg); void K054338_update_all_shadows(running_machine &machine, int rushingheroes_hack); // called at the beginning of SCREEN_UPDATE() -void K054338_fill_solid_bg(bitmap_t *bitmap); // solid backcolor fill -void K054338_fill_backcolor(running_machine &machine, bitmap_t *bitmap, int mode); // unified fill, 0=solid, 1=gradient +void K054338_fill_solid_bg(bitmap_ind16 &bitmap); // solid backcolor fill +void K054338_fill_backcolor(running_machine &machine, bitmap_rgb32 &bitmap, int mode); // unified fill, 0=solid, 1=gradient int K054338_set_alpha_level(int pblend); // blend style 0-2 void K054338_invert_alpha(int invert); // 0=0x00(invis)-0x1f(solid), 1=0x1f(invis)-0x00(solod) void K054338_export_config(int **shdRGB); diff -Nru mame-0.144/src/mame/video/konicdev.c mame-0.145/src/mame/video/konicdev.c --- mame-0.144/src/mame/video/konicdev.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/konicdev.c 2012-02-06 21:30:32.000000000 +0000 @@ -1377,7 +1377,7 @@ case 6: /* palette bank change */ if ((k007121->ctrlram[offset] & 0x30) != (data & 0x30)) - tilemap_mark_all_tiles_dirty_all(device->machine()); + device->machine().tilemap().mark_all_dirty(); break; case 7: k007121->flipscreen = data & 0x08; @@ -1422,12 +1422,12 @@ * */ -void k007121_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, gfx_element *gfx, colortable_t *ctable, +void k007121_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, colortable_t *ctable, const UINT8 *source, int base_color, int global_x_offset, int bank_base, UINT32 pri_mask ) { k007121_state *k007121 = k007121_get_safe_token(device); // const gfx_element *gfx = gfxs[chip]; - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; int flipscreen = k007121->flipscreen; int i, num, inc, offs[5]; int is_flakatck = (ctable == NULL); @@ -1638,9 +1638,9 @@ k007342->ram[offset] = data; if (offset < 0x1000) /* layer 0 */ - tilemap_mark_tile_dirty(k007342->tilemap[0], offset & 0x7ff); + k007342->tilemap[0]->mark_tile_dirty(offset & 0x7ff); else /* layer 1 */ - tilemap_mark_tile_dirty(k007342->tilemap[1], offset & 0x7ff); + k007342->tilemap[1]->mark_tile_dirty(offset & 0x7ff); } READ8_DEVICE_HANDLER( k007342_scroll_r ) @@ -1664,12 +1664,12 @@ /* bit 1: INT control */ k007342->int_enabled = data & 0x02; k007342->flipscreen = data & 0x10; - tilemap_set_flip(k007342->tilemap[0], k007342->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(k007342->tilemap[1], k007342->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k007342->tilemap[0]->set_flip(k007342->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k007342->tilemap[1]->set_flip(k007342->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); break; case 0x01: /* used for banking in Rock'n'Rage */ if (data != k007342->regs[1]) - tilemap_mark_all_tiles_dirty_all(device->machine()); + device->machine().tilemap().mark_all_dirty(); case 0x02: k007342->scrollx[0] = (k007342->scrollx[0] & 0xff) | ((data & 0x01) << 8); k007342->scrollx[1] = (k007342->scrollx[1] & 0xff) | ((data & 0x02) << 7); @@ -1701,27 +1701,27 @@ { case 0x00: case 0x08: /* unknown, blades of steel shootout between periods */ - tilemap_set_scroll_rows(k007342->tilemap[0], 1); - tilemap_set_scroll_cols(k007342->tilemap[0], 1); - tilemap_set_scrollx(k007342->tilemap[0], 0, k007342->scrollx[0]); - tilemap_set_scrolly(k007342->tilemap[0], 0, k007342->scrolly[0]); + k007342->tilemap[0]->set_scroll_rows(1); + k007342->tilemap[0]->set_scroll_cols(1); + k007342->tilemap[0]->set_scrollx(0, k007342->scrollx[0]); + k007342->tilemap[0]->set_scrolly(0, k007342->scrolly[0]); break; case 0x0c: /* 32 columns */ - tilemap_set_scroll_rows(k007342->tilemap[0], 1); - tilemap_set_scroll_cols(k007342->tilemap[0], 512); - tilemap_set_scrollx(k007342->tilemap[0], 0, k007342->scrollx[0]); + k007342->tilemap[0]->set_scroll_rows(1); + k007342->tilemap[0]->set_scroll_cols(512); + k007342->tilemap[0]->set_scrollx(0, k007342->scrollx[0]); for (offs = 0; offs < 256; offs++) - tilemap_set_scrolly(k007342->tilemap[0], (offs + k007342->scrollx[0]) & 0x1ff, + k007342->tilemap[0]->set_scrolly((offs + k007342->scrollx[0]) & 0x1ff, k007342->scroll_ram[2 * (offs / 8)] + 256 * k007342->scroll_ram[2 * (offs / 8) + 1]); break; case 0x14: /* 256 rows */ - tilemap_set_scroll_rows(k007342->tilemap[0], 256); - tilemap_set_scroll_cols(k007342->tilemap[0], 1); - tilemap_set_scrolly(k007342->tilemap[0], 0, k007342->scrolly[0]); + k007342->tilemap[0]->set_scroll_rows(256); + k007342->tilemap[0]->set_scroll_cols(1); + k007342->tilemap[0]->set_scrolly(0, k007342->scrolly[0]); for (offs = 0; offs < 256; offs++) - tilemap_set_scrollx(k007342->tilemap[0], (offs + k007342->scrolly[0]) & 0xff, + k007342->tilemap[0]->set_scrollx((offs + k007342->scrolly[0]) & 0xff, k007342->scroll_ram[2 * offs] + 256 * k007342->scroll_ram[2 * offs + 1]); break; @@ -1730,16 +1730,16 @@ break; } - tilemap_set_scrollx(k007342->tilemap[1], 0, k007342->scrollx[1]); - tilemap_set_scrolly(k007342->tilemap[1], 0, k007342->scrolly[1]); + k007342->tilemap[1]->set_scrollx(0, k007342->scrollx[1]); + k007342->tilemap[1]->set_scrolly(0, k007342->scrolly[1]); #if 0 { static int current_layer = 0; if (machine.input().code_pressed_once(KEYCODE_Z)) current_layer = !current_layer; - tilemap_set_enable(k007342->tilemap[current_layer], 1); - tilemap_set_enable(k007342->tilemap[!current_layer], 0); + k007342->tilemap[current_layer]->enable(1); + k007342->tilemap[!current_layer]->enable(0); popmessage("regs:%02x %02x %02x %02x-%02x %02x %02x %02x:%02x", k007342->regs[0], k007342->regs[1], k007342->regs[2], k007342->regs[3], @@ -1749,10 +1749,10 @@ #endif } -void k007342_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int num, int flags, UINT32 priority ) +void k007342_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int num, int flags, UINT32 priority ) { k007342_state *k007342 = k007342_get_safe_token(device); - tilemap_draw(bitmap, cliprect, k007342->tilemap[num], flags, priority); + k007342->tilemap[num]->draw(bitmap, cliprect, flags, priority); } int k007342_is_int_enabled( device_t *device ) @@ -1784,7 +1784,7 @@ return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5); } -INLINE void k007342_get_tile_info( device_t *device, tile_data *tileinfo, int tile_index, int layer, UINT8 *cram, UINT8 *vram ) +INLINE void k007342_get_tile_info( device_t *device, tile_data &tileinfo, int tile_index, int layer, UINT8 *cram, UINT8 *vram ) { k007342_state *k007342 = k007342_get_safe_token(device); int color, code, flags; @@ -1793,7 +1793,7 @@ code = vram[tile_index]; flags = TILE_FLIPYX((color & 0x30) >> 4); - tileinfo->category = (color & 0x80) >> 7; + tileinfo.category = (color & 0x80) >> 7; k007342->callback(device->machine(), layer, k007342->regs[1], &code, &color, &flags); @@ -1840,8 +1840,8 @@ k007342->videoram_0 = &k007342->ram[0x0800]; k007342->videoram_1 = &k007342->ram[0x1800]; - tilemap_set_transparent_pen(k007342->tilemap[0], 0); - tilemap_set_transparent_pen(k007342->tilemap[1], 0); + k007342->tilemap[0]->set_transparent_pen(0); + k007342->tilemap[1]->set_transparent_pen(0); device->save_pointer(NAME(k007342->ram), 0x2000); device->save_pointer(NAME(k007342->scroll_ram), 0x0200); @@ -1942,7 +1942,7 @@ * 7 | xxxxxxxx | unused */ -void k007420_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, gfx_element *gfx ) +void k007420_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx ) { k007420_state *k007420 = k007420_get_safe_token(device); int offs; @@ -2246,7 +2246,7 @@ k052109->has_extra_video_ram = 1; /* kludge for X-Men */ k052109->ram[offset] = data; - tilemap_mark_tile_dirty(k052109->tilemap[(offset & 0x1800) >> 11],offset & 0x7ff); + k052109->tilemap[(offset & 0x1800) >> 11]->mark_tile_dirty(offset & 0x7ff); } else /* control registers */ { @@ -2293,7 +2293,7 @@ int bank = (k052109->ram[i]&0x0c) >> 2; if ((bank == 0 && (dirty & 1)) || (bank == 1 && (dirty & 2))) { - tilemap_mark_tile_dirty(k052109->tilemap[(i & 0x1800) >> 11], i & 0x7ff); + k052109->tilemap[(i & 0x1800) >> 11]->mark_tile_dirty(i & 0x7ff); } } } @@ -2306,16 +2306,16 @@ else if (offset == 0x1e80) { //if ((data & 0xfe)) logerror("%04x: 052109 register 1e80 = %02x\n",cpu_get_pc(&space->device()),data); - tilemap_set_flip(k052109->tilemap[0], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(k052109->tilemap[1], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(k052109->tilemap[2], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[0]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[1]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[2]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (k052109->tileflip_enable != ((data & 0x06) >> 1)) { k052109->tileflip_enable = ((data & 0x06) >> 1); - tilemap_mark_all_tiles_dirty(k052109->tilemap[0]); - tilemap_mark_all_tiles_dirty(k052109->tilemap[1]); - tilemap_mark_all_tiles_dirty(k052109->tilemap[2]); + k052109->tilemap[0]->mark_all_dirty(); + k052109->tilemap[1]->mark_all_dirty(); + k052109->tilemap[2]->mark_all_dirty(); } } else if (offset == 0x1f00) @@ -2339,7 +2339,7 @@ { int bank = (k052109->ram[i] & 0x0c) >> 2; if ((bank == 2 && (dirty & 1)) || (bank == 3 && (dirty & 2))) - tilemap_mark_tile_dirty(k052109->tilemap[(i & 0x1800) >> 11],i & 0x7ff); + k052109->tilemap[(i & 0x1800) >> 11]->mark_tile_dirty(i & 0x7ff); } } } @@ -2404,7 +2404,7 @@ void k052109_tilemap_mark_dirty( device_t *device, int tmap_num ) { k052109_state *k052109 = k052109_get_safe_token(device); - tilemap_mark_all_tiles_dirty(k052109->tilemap[tmap_num]); + k052109->tilemap[tmap_num]->mark_all_dirty(); } @@ -2427,116 +2427,116 @@ { UINT8 *scrollram = &k052109->ram[0x1a00]; - tilemap_set_scroll_rows(k052109->tilemap[1], 256); - tilemap_set_scroll_cols(k052109->tilemap[1], 1); + k052109->tilemap[1]->set_scroll_rows(256); + k052109->tilemap[1]->set_scroll_cols(1); yscroll = k052109->ram[0x180c]; - tilemap_set_scrolly(k052109->tilemap[1], 0, yscroll + k052109->dy[1]); + k052109->tilemap[1]->set_scrolly(0, yscroll + k052109->dy[1]); for (offs = 0; offs < 256; offs++) { xscroll = scrollram[2 * (offs & 0xfff8) + 0] + 256 * scrollram[2 * (offs & 0xfff8) + 1]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[1], (offs + yscroll) & 0xff, xscroll + k052109->dx[1]); + k052109->tilemap[1]->set_scrollx((offs + yscroll) & 0xff, xscroll + k052109->dx[1]); } } else if ((k052109->scrollctrl & 0x03) == 0x03) { UINT8 *scrollram = &k052109->ram[0x1a00]; - tilemap_set_scroll_rows(k052109->tilemap[1], 256); - tilemap_set_scroll_cols(k052109->tilemap[1], 1); + k052109->tilemap[1]->set_scroll_rows(256); + k052109->tilemap[1]->set_scroll_cols(1); yscroll = k052109->ram[0x180c]; - tilemap_set_scrolly(k052109->tilemap[1], 0, yscroll + k052109->dy[1]); + k052109->tilemap[1]->set_scrolly(0, yscroll + k052109->dy[1]); for (offs = 0; offs < 256; offs++) { xscroll = scrollram[2 * offs + 0] + 256 * scrollram[2 * offs + 1]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[1], (offs + yscroll) & 0xff, xscroll + k052109->dx[1]); + k052109->tilemap[1]->set_scrollx((offs + yscroll) & 0xff, xscroll + k052109->dx[1]); } } else if ((k052109->scrollctrl & 0x04) == 0x04) { UINT8 *scrollram = &k052109->ram[0x1800]; - tilemap_set_scroll_rows(k052109->tilemap[1], 1); - tilemap_set_scroll_cols(k052109->tilemap[1], 512); + k052109->tilemap[1]->set_scroll_rows(1); + k052109->tilemap[1]->set_scroll_cols(512); xscroll = k052109->ram[0x1a00] + 256 * k052109->ram[0x1a01]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[1], 0, xscroll + k052109->dx[1]); + k052109->tilemap[1]->set_scrollx(0, xscroll + k052109->dx[1]); for (offs = 0; offs < 512; offs++) { yscroll = scrollram[offs / 8]; - tilemap_set_scrolly(k052109->tilemap[1], (offs + xscroll) & 0x1ff, yscroll + k052109->dy[1]); + k052109->tilemap[1]->set_scrolly((offs + xscroll) & 0x1ff, yscroll + k052109->dy[1]); } } else { UINT8 *scrollram = &k052109->ram[0x1a00]; - tilemap_set_scroll_rows(k052109->tilemap[1], 1); - tilemap_set_scroll_cols(k052109->tilemap[1], 1); + k052109->tilemap[1]->set_scroll_rows(1); + k052109->tilemap[1]->set_scroll_cols(1); xscroll = scrollram[0] + 256 * scrollram[1]; xscroll -= 6; yscroll = k052109->ram[0x180c]; - tilemap_set_scrollx(k052109->tilemap[1], 0, xscroll + k052109->dx[1]); - tilemap_set_scrolly(k052109->tilemap[1], 0, yscroll + k052109->dy[1]); + k052109->tilemap[1]->set_scrollx(0, xscroll + k052109->dx[1]); + k052109->tilemap[1]->set_scrolly(0, yscroll + k052109->dy[1]); } if ((k052109->scrollctrl & 0x18) == 0x10) { UINT8 *scrollram = &k052109->ram[0x3a00]; - tilemap_set_scroll_rows(k052109->tilemap[2], 256); - tilemap_set_scroll_cols(k052109->tilemap[2], 1); + k052109->tilemap[2]->set_scroll_rows(256); + k052109->tilemap[2]->set_scroll_cols(1); yscroll = k052109->ram[0x380c]; - tilemap_set_scrolly(k052109->tilemap[2], 0, yscroll + k052109->dy[2]); + k052109->tilemap[2]->set_scrolly(0, yscroll + k052109->dy[2]); for (offs = 0; offs < 256; offs++) { xscroll = scrollram[2 * (offs & 0xfff8) + 0] + 256 * scrollram[2 * (offs & 0xfff8) + 1]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[2], (offs + yscroll) & 0xff, xscroll + k052109->dx[2]); + k052109->tilemap[2]->set_scrollx((offs + yscroll) & 0xff, xscroll + k052109->dx[2]); } } else if ((k052109->scrollctrl & 0x18) == 0x18) { UINT8 *scrollram = &k052109->ram[0x3a00]; - tilemap_set_scroll_rows(k052109->tilemap[2], 256); - tilemap_set_scroll_cols(k052109->tilemap[2], 1); + k052109->tilemap[2]->set_scroll_rows(256); + k052109->tilemap[2]->set_scroll_cols(1); yscroll = k052109->ram[0x380c]; - tilemap_set_scrolly(k052109->tilemap[2], 0, yscroll + k052109->dy[2]); + k052109->tilemap[2]->set_scrolly(0, yscroll + k052109->dy[2]); for (offs = 0; offs < 256; offs++) { xscroll = scrollram[2 * offs + 0] + 256 * scrollram[2 * offs + 1]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[2], (offs + yscroll) & 0xff, xscroll + k052109->dx[2]); + k052109->tilemap[2]->set_scrollx((offs + yscroll) & 0xff, xscroll + k052109->dx[2]); } } else if ((k052109->scrollctrl & 0x20) == 0x20) { UINT8 *scrollram = &k052109->ram[0x3800]; - tilemap_set_scroll_rows(k052109->tilemap[2], 1); - tilemap_set_scroll_cols(k052109->tilemap[2], 512); + k052109->tilemap[2]->set_scroll_rows(1); + k052109->tilemap[2]->set_scroll_cols(512); xscroll = k052109->ram[0x3a00] + 256 * k052109->ram[0x3a01]; xscroll -= 6; - tilemap_set_scrollx(k052109->tilemap[2], 0, xscroll + k052109->dx[2]); + k052109->tilemap[2]->set_scrollx(0, xscroll + k052109->dx[2]); for (offs = 0; offs < 512; offs++) { yscroll = scrollram[offs / 8]; - tilemap_set_scrolly(k052109->tilemap[2], (offs + xscroll) & 0x1ff, yscroll + k052109->dy[2]); + k052109->tilemap[2]->set_scrolly((offs + xscroll) & 0x1ff, yscroll + k052109->dy[2]); } } else { UINT8 *scrollram = &k052109->ram[0x3a00]; - tilemap_set_scroll_rows(k052109->tilemap[2], 1); - tilemap_set_scroll_cols(k052109->tilemap[2], 1); + k052109->tilemap[2]->set_scroll_rows(1); + k052109->tilemap[2]->set_scroll_cols(1); xscroll = scrollram[0] + 256 * scrollram[1]; xscroll -= 6; yscroll = k052109->ram[0x380c]; - tilemap_set_scrollx(k052109->tilemap[2], 0, xscroll + k052109->dx[2]); - tilemap_set_scrolly(k052109->tilemap[2], 0, yscroll + k052109->dy[2]); + k052109->tilemap[2]->set_scrollx(0, xscroll + k052109->dx[2]); + k052109->tilemap[2]->set_scrolly(0, yscroll + k052109->dy[2]); } #if 0 @@ -2561,10 +2561,10 @@ #endif } -void k052109_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int tmap_num, UINT32 flags, UINT8 priority ) +void k052109_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, UINT32 flags, UINT8 priority ) { k052109_state *k052109 = k052109_get_safe_token(device); - tilemap_draw(bitmap, cliprect, k052109->tilemap[tmap_num], flags, priority); + k052109->tilemap[tmap_num]->draw(bitmap, cliprect, flags, priority); } int k052109_is_irq_enabled( device_t *device ) @@ -2600,7 +2600,7 @@ color RAM ------xx depends on external connections (usually banking, flip) */ -INLINE void k052109_get_tile_info( device_t *device, tile_data *tileinfo, int tile_index, int layer, UINT8 *cram, UINT8 *vram1, UINT8 *vram2 ) +INLINE void k052109_get_tile_info( device_t *device, tile_data &tileinfo, int tile_index, int layer, UINT8 *cram, UINT8 *vram1, UINT8 *vram2 ) { k052109_state *k052109 = k052109_get_safe_token(device); int flipy = 0; @@ -2633,7 +2633,7 @@ color, flags); - tileinfo->category = priority; + tileinfo.category = priority; } static TILE_GET_INFO_DEVICE( k052109_get_tile_info0 ) @@ -2658,9 +2658,9 @@ static void k052109_tileflip_reset(k052109_state *k052109) { int data = k052109->ram[0x1e80]; - tilemap_set_flip(k052109->tilemap[0], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(k052109->tilemap[1], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(k052109->tilemap[2], (data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[0]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[1]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + k052109->tilemap[2]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); k052109->tileflip_enable = ((data & 0x06) >> 1); } @@ -2732,9 +2732,9 @@ k052109->videoram2_A = &k052109->ram[0x4800]; k052109->videoram2_B = &k052109->ram[0x5000]; - tilemap_set_transparent_pen(k052109->tilemap[0], 0); - tilemap_set_transparent_pen(k052109->tilemap[1], 0); - tilemap_set_transparent_pen(k052109->tilemap[2], 0); + k052109->tilemap[0]->set_transparent_pen(0); + k052109->tilemap[1]->set_transparent_pen(0); + k052109->tilemap[2]->set_transparent_pen(0); device->save_pointer(NAME(k052109->ram), 0x6000); device->save_item(NAME(k052109->rmrd_line)); @@ -3003,7 +3003,7 @@ * Note that Aliens also uses the shadow bit to select the second sprite bank. */ -void k051960_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int min_priority, int max_priority ) +void k051960_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int min_priority, int max_priority ) { #define NUM_SPRITES 128 k051960_state *k051960 = k051960_get_safe_token(device); @@ -3529,7 +3529,7 @@ * The rest of the sprite remains normal. */ -void k053245_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k053245_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { #define NUM_SPRITES 128 k05324x_state *k053245 = k05324x_get_safe_token(device); @@ -3783,7 +3783,7 @@ /* Lethal Enforcers has 2 of these chips hooked up in parallel to give 6bpp gfx.. lets cheat a bit and make emulating it a little less messy by using a custom function instead */ -void k053245_sprites_draw_lethal( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k053245_sprites_draw_lethal( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) { #define NUM_SPRITES 128 k05324x_state *k053245 = k05324x_get_safe_token(device); @@ -4450,7 +4450,8 @@ * The rest of the sprite remains normal. */ -void k053247_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +template +void k053247_sprites_draw_common( device_t *device, _BitmapClass &bitmap, const rectangle &cliprect ) { #define NUM_SPRITES 256 k053247_state *k053246 = k053247_get_safe_token(device); @@ -4496,7 +4497,7 @@ */ if (machine.config().m_video_attributes & VIDEO_HAS_SHADOWS) { - if (bitmap->bpp == 32 && (machine.config().m_video_attributes & VIDEO_HAS_HIGHLIGHTS)) + if (sizeof(typename _BitmapClass::pixel_t) == 4 && (machine.config().m_video_attributes & VIDEO_HAS_HIGHLIGHTS)) shdmask = 3; // enable all shadows and highlights else shdmask = 0; // enable default shadows @@ -4848,6 +4849,12 @@ #undef NUM_SPRITES } +void k053247_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect ) +{ k053247_sprites_draw_common(device, bitmap, cliprect); } + +void k053247_sprites_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) +{ k053247_sprites_draw_common(device, bitmap, cliprect); } + /***************************************************************************** DEVICE INTERFACE @@ -5155,7 +5162,7 @@ k051316_state *k051316= k051316_get_safe_token(device); k051316->ram[offset] = data; - tilemap_mark_tile_dirty(k051316->tmap, offset & 0x3ff); + k051316->tmap->mark_tile_dirty(offset & 0x3ff); } @@ -5201,7 +5208,7 @@ ***************************************************************************/ -INLINE void k051316_get_tile_info( device_t *device, tile_data *tileinfo, int tile_index ) +INLINE void k051316_get_tile_info( device_t *device, tile_data &tileinfo, int tile_index ) { k051316_state *k051316 = k051316_get_safe_token(device); int code = k051316->ram[tile_index]; @@ -5221,7 +5228,7 @@ static TILE_GET_INFO_DEVICE( k051316_get_tile_info0 ) { k051316_get_tile_info(device, tileinfo, tile_index); } -void k051316_zoom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority ) +void k051316_zoom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) { k051316_state *k051316= k051316_get_safe_token(device); UINT32 startx, starty; @@ -5240,7 +5247,7 @@ startx -= (89 + k051316->offset[0]) * incxx; starty -= (89 + k051316->offset[0]) * incxy; - tilemap_draw_roz(bitmap,cliprect,k051316->tmap,startx << 5,starty << 5, + k051316->tmap->draw_roz(bitmap, cliprect, startx << 5,starty << 5, incxx << 5,incxy << 5,incyx << 5,incyy << 5, k051316->wraparound, flags,priority); @@ -5370,11 +5377,11 @@ k051316->ram = auto_alloc_array(machine, UINT8, 0x800); if (!intf->pen_is_mask) - tilemap_set_transparent_pen(k051316->tmap, intf->transparent_pen); + k051316->tmap->set_transparent_pen(intf->transparent_pen); else { - tilemap_map_pens_to_layer(k051316->tmap, 0, 0, 0, TILEMAP_PIXEL_LAYER1); - tilemap_map_pens_to_layer(k051316->tmap, 0, intf->transparent_pen, intf->transparent_pen, TILEMAP_PIXEL_LAYER0); + k051316->tmap->map_pens_to_layer(0, 0, 0, TILEMAP_PIXEL_LAYER1); + k051316->tmap->map_pens_to_layer(0, intf->transparent_pen, intf->transparent_pen, TILEMAP_PIXEL_LAYER0); } k051316->wraparound = intf->wrap; @@ -5459,7 +5466,7 @@ // there is another implementation of this in video/konamigx.c (!) // why? shall they be merged? -void k053936_zoom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, int flags, UINT32 priority, int glfgreat_hack ) +void k053936_zoom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int flags, UINT32 priority, int glfgreat_hack ) { k053936_state *k053936= k053936_get_safe_token(device); if (!tmap) @@ -5484,25 +5491,25 @@ { my_clip.min_x = k053936->ctrl[0x08] + k053936->offset[0] + 2; my_clip.max_x = k053936->ctrl[0x09] + k053936->offset[0] + 2 - 1; - if (my_clip.min_x < cliprect->min_x) - my_clip.min_x = cliprect->min_x; - if (my_clip.max_x > cliprect->max_x) - my_clip.max_x = cliprect->max_x; + if (my_clip.min_x < cliprect.min_x) + my_clip.min_x = cliprect.min_x; + if (my_clip.max_x > cliprect.max_x) + my_clip.max_x = cliprect.max_x; y = k053936->ctrl[0x0a] + k053936->offset[1] - 2; - if (y < cliprect->min_y) - y = cliprect->min_y; + if (y < cliprect.min_y) + y = cliprect.min_y; maxy = k053936->ctrl[0x0b] + k053936->offset[1] - 2 - 1; - if (maxy > cliprect->max_y) - maxy = cliprect->max_y; + if (maxy > cliprect.max_y) + maxy = cliprect.max_y; } else { - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; - y = cliprect->min_y; - maxy = cliprect->max_y; + y = cliprect.min_y; + maxy = cliprect.max_y; } while (y <= maxy) @@ -5525,7 +5532,7 @@ startx -= k053936->offset[0] * incxx; starty -= k053936->offset[0] * incxy; - tilemap_draw_roz(bitmap,&my_clip,tmap,startx << 5,starty << 5, + tmap->draw_roz(bitmap, my_clip, startx << 5,starty << 5, incxx << 5,incxy << 5,0,0, k053936->wraparound, flags,priority); @@ -5563,7 +5570,7 @@ startx -= k053936->offset[0] * incxx; starty -= k053936->offset[0] * incxy; - tilemap_draw_roz(bitmap,cliprect,tmap,startx << 5,starty << 5, + tmap->draw_roz(bitmap, cliprect, startx << 5,starty << 5, incxx << 5,incxy << 5,incyx << 5,incyy << 5, k053936->wraparound, flags,priority); @@ -5674,7 +5681,7 @@ } if (!k053251->tilemaps_set) - tilemap_mark_all_tiles_dirty_all(device->machine()); + device->machine().tilemap().mark_all_dirty(); } else if (offset == 10) { @@ -5690,7 +5697,7 @@ } if (!k053251->tilemaps_set) - tilemap_mark_all_tiles_dirty_all(device->machine()); + device->machine().tilemap().mark_all_dirty(); } } } @@ -6053,7 +6060,7 @@ struct _k056832_state { tilemap_t *tilemap[K056832_PAGE_COUNT]; - bitmap_t *pixmap[K056832_PAGE_COUNT]; + bitmap_ind16 *pixmap[K056832_PAGE_COUNT]; UINT16 regs[0x20]; // 157/832 regs group 1 UINT16 regsb[4]; // 157/832 regs group 2, board dependent @@ -6132,7 +6139,7 @@ static void k056832_mark_page_dirty( k056832_state *k056832, int page ) { if (k056832->page_tile_mode[page]) - tilemap_mark_all_tiles_dirty(k056832->tilemap[page]); + k056832->tilemap[page]->mark_all_dirty(); else k056832_mark_all_lines_dirty(page); } @@ -6241,7 +6248,7 @@ return res; } -INLINE void k056832_get_tile_info( device_t *device, tile_data *tileinfo, int tile_index, int pageIndex ) +INLINE void k056832_get_tile_info( device_t *device, tile_data &tileinfo, int tile_index, int pageIndex ) { k056832_state *k056832 = k056832_get_safe_token(device); static const struct K056832_SHIFTMASKS @@ -6649,7 +6656,7 @@ if (!(k056832->regs[0] & 0x02)) // external linescroll enable { if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6666,7 +6673,7 @@ if (!(k056832->regs[0] & 0x02)) // external linescroll enable { if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6683,7 +6690,7 @@ if (!(k056832->regs[0] & 0x02)) // external linescroll enable { if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6700,7 +6707,7 @@ if (!(k056832->regs[0] & 0x02)) // external linescroll enable { if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6723,7 +6730,7 @@ *tile_ptr = data; if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6743,7 +6750,7 @@ dofs >>= 1; if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], dofs); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(dofs); else k056832_mark_line_dirty(k056832->selected_page, dofs); } @@ -6766,7 +6773,7 @@ tile_ptr[1] = data; if (k056832->page_tile_mode[k056832->selected_page]) - tilemap_mark_tile_dirty(k056832->tilemap[k056832->selected_page], offset); + k056832->tilemap[k056832->selected_page]->mark_tile_dirty(offset); else k056832_mark_line_dirty(k056832->selected_page, offset); } @@ -6789,7 +6796,7 @@ tile_ptr[1] = data; if (k056832->page_tile_mode[offset/0x800]) - tilemap_mark_tile_dirty(k056832->tilemap[offset/0x800], offset&0x7ff); + k056832->tilemap[offset/0x800]->mark_tile_dirty(offset&0x7ff); else k056832_mark_line_dirty(offset/0x800, (offset&0x7ff)); } @@ -6822,7 +6829,7 @@ if (new_data & 0x10) flip |= TILEMAP_FLIPX; for (i = 0; i < K056832_PAGE_COUNT; i++) { - tilemap_set_flip(k056832->tilemap[i], flip); + k056832->tilemap[i]->set_flip(flip); } } @@ -6966,7 +6973,8 @@ } } -static int k056832_update_linemap( device_t *device, bitmap_t *bitmap, int page, int flags ) +template +static int k056832_update_linemap( device_t *device, _BitmapClass &bitmap, int page, int flags ) { k056832_state *k056832 = k056832_get_safe_token(device); @@ -6980,12 +6988,11 @@ tilemap_t *tmap; UINT32 *dirty; int all_dirty; - bitmap_t* xprmap; UINT8 *xprdata; tmap = k056832->tilemap[page]; - xprmap = tilemap_get_flagsmap(tmap); - xprdata = tilemap_get_tile_flags(tmap); + bitmap_ind8 &xprmap = tmap->flagsmap(); + xprdata = tmap->tile_flags(); dirty = k056832->line_dirty[page]; all_dirty = k056832->all_lines_dirty[page]; @@ -6998,8 +7005,8 @@ // force tilemap into a clean, static state // *really ugly but it minimizes alteration to tilemap.c memset(&zerorect, 0, sizeof(rectangle)); // zero dimension - tilemap_draw(bitmap, &zerorect, tmap, 0, 0); // dummy call to reset tile_dirty_map - bitmap_fill(xprmap, 0, 0); // reset pixel transparency_bitmap; + tmap->draw(bitmap, zerorect, 0, 0); // dummy call to reset tile_dirty_map + xprmap.fill(0); // reset pixel transparency_bitmap; memset(xprdata, TILEMAP_PIXEL_LAYER0, 0x800); // reset tile transparency_data; } else @@ -7015,7 +7022,7 @@ */ { - bitmap_t *pixmap; + bitmap_ind16 *pixmap; running_machine &machine = device->machine(); UINT8 code_transparent, code_opaque; @@ -7049,8 +7056,8 @@ { tile_data tileinfo = {0}; - dst_ptr = BITMAP_ADDR16(pixmap, line, 0); - xpr_ptr = BITMAP_ADDR8(xprmap, line, 0); + dst_ptr = &pixmap->pix16(line); + xpr_ptr = &xprmap.pix8(line); if (!all_dirty) { @@ -7090,7 +7097,8 @@ return(0); } -void k056832_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, UINT32 flags, UINT32 priority ) +template +void k056832_tilemap_draw_common( device_t *device, _BitmapClass &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority ) { k056832_state *k056832 = k056832_get_safe_token(device); UINT32 last_dx, last_visible, new_colorbase, last_active; @@ -7123,10 +7131,10 @@ height = rowspan * K056832_PAGE_HEIGHT; width = colspan * K056832_PAGE_WIDTH; - cminx = cliprect->min_x; - cmaxx = cliprect->max_x; - cminy = cliprect->min_y; - cmaxy = cliprect->max_y; + cminx = cliprect.min_x; + cmaxx = cliprect.max_x; + cminy = cliprect.min_y; + cmaxy = cliprect.max_y; // flip correction registers flipy = k056832->regs[0] & 0x20; @@ -7322,7 +7330,7 @@ tmap = k056832->tilemap[pageIndex]; - tilemap_set_scrolly(tmap, 0, ay); + tmap->set_scrolly(0, ay); last_dx = 0x100000; last_visible = 0; @@ -7398,12 +7406,12 @@ // want the tilemap to be drawn on the right hand side.. this is probably not the correct // logic, but it works. if ((drawrect.min_x>0) && (drawrect.max_x==511)) - drawrect.max_x=cliprect->max_x; + drawrect.max_x=cliprect.max_x; - tilemap_set_scrollx(tmap, 0, dx); + tmap->set_scrollx(0, dx); LINE_SHORTCIRCUIT: - tilemap_draw(bitmap, &drawrect, tmap, flags, priority); + tmap->draw(bitmap, drawrect, flags, priority); } // end of line loop } // end of column loop @@ -7412,8 +7420,14 @@ k056832->active_layer = last_active; } // end of function +void k056832_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority ) +{ k056832_tilemap_draw_common(device, bitmap, cliprect, layer, flags, priority); } + +void k056832_tilemap_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority ) +{ k056832_tilemap_draw_common(device, bitmap, cliprect, layer, flags, priority); } + -void k056832_tilemap_draw_dj( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, UINT32 flags, UINT32 priority ) +void k056832_tilemap_draw_dj( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority ) { k056832_state *k056832 = k056832_get_safe_token(device); UINT32 last_dx, last_visible, new_colorbase, last_active; @@ -7442,10 +7456,10 @@ height = rowspan * K056832_PAGE_HEIGHT; width = colspan * K056832_PAGE_WIDTH; - cminx = cliprect->min_x; - cmaxx = cliprect->max_x; - cminy = cliprect->min_y; - cmaxy = cliprect->max_y; + cminx = cliprect.min_x; + cmaxx = cliprect.max_x; + cminy = cliprect.min_y; + cmaxy = cliprect.max_y; // flip correction registers flipy = k056832->regs[0] & 0x20; @@ -7597,7 +7611,7 @@ continue; tmap = k056832->tilemap[pageIndex]; - tilemap_set_scrolly(tmap, 0, ay); + tmap->set_scrolly(0, ay); last_dx = 0x100000; last_visible = 0; @@ -7668,10 +7682,10 @@ drawrect.min_x = (dminx < cminx ) ? cminx : dminx; drawrect.max_x = (dmaxx > cmaxx ) ? cmaxx : dmaxx; - tilemap_set_scrollx(tmap, 0, dx); + tmap->set_scrollx(0, dx); LINE_SHORTCIRCUIT: - tilemap_draw(bitmap, &drawrect, tmap, flags, priority); + tmap->draw(bitmap, drawrect, flags, priority); } // end of line loop } // end of column loop @@ -7942,9 +7956,9 @@ { tmap = k056832->tilemap[i]; - k056832->pixmap[i] = tilemap_get_pixmap(tmap); + k056832->pixmap[i] = &tmap->pixmap(); - tilemap_set_transparent_pen(tmap, 0); + tmap->set_transparent_pen(0); } memset(k056832->videoram, 0x00, 0x20000); @@ -8209,7 +8223,7 @@ } // k054338 BG color fill -void k054338_fill_solid_bg( device_t *device, bitmap_t *bitmap ) +void k054338_fill_solid_bg( device_t *device, bitmap_rgb32 &bitmap ) { UINT32 bgcolor; UINT32 *pLine; @@ -8219,17 +8233,16 @@ bgcolor |= k054338_register_r(device, K338_REG_BGC_GB); /* and fill the screen with it */ - for (y = 0; y < bitmap->height; y++) + for (y = 0; y < bitmap.height(); y++) { - pLine = (UINT32 *)bitmap->base; - pLine += (bitmap->rowpixels * y); - for (x = 0; x < bitmap->width; x++) + pLine = &bitmap.pix32(y); + for (x = 0; x < bitmap.width(); x++) *pLine++ = bgcolor; } } // Unified k054338/K055555 BG color fill -void k054338_fill_backcolor( device_t *device, bitmap_t *bitmap, int mode ) // (see p.67) +void k054338_fill_backcolor( device_t *device, bitmap_rgb32 &bitmap, int mode ) // (see p.67) { k054338_state *k054338 = k054338_get_safe_token(device); int clipx, clipy, clipw, cliph, i, dst_pitch; @@ -8243,8 +8256,8 @@ clipw = (visarea.max_x - clipx + 4) & ~3; cliph = visarea.max_y - clipy + 1; - dst_ptr = BITMAP_ADDR32(bitmap, clipy, 0); - dst_pitch = bitmap->rowpixels; + dst_ptr = &bitmap.pix32(clipy); + dst_pitch = bitmap.rowpixels(); dst_ptr += clipx; BGC_SET = 0; @@ -8633,8 +8646,8 @@ UINT32 * _3d_fifo; UINT32 status; - bitmap_t *bitmap[2]; - bitmap_t *zbuffer; + bitmap_rgb32 *bitmap[2]; + bitmap_ind32 *zbuffer; rectangle cliprect; int ram_ptr; int fifo_read_ptr; @@ -8744,8 +8757,8 @@ //if (k001005->status == 2) { - bitmap_fill(k001005->bitmap[k001005->bitmap_page], &k001005->cliprect, device->machine().pens[0] & 0x00ffffff); - bitmap_fill(k001005->zbuffer, &k001005->cliprect, 0xffffffff); + k001005->bitmap[k001005->bitmap_page]->fill(device->machine().pens[0] & 0x00ffffff, k001005->cliprect); + k001005->zbuffer->fill(0xffffffff, k001005->cliprect); } } @@ -8919,11 +8932,11 @@ { k001005_state *k001005 = k001005_get_safe_token(device); const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; float z = extent->param[0].start; float dz = extent->param[0].dpdx; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); - UINT32 *zb = BITMAP_ADDR32(k001005->zbuffer, scanline, 0); + UINT32 *fb = &destmap->pix32(scanline); + UINT32 *zb = &k001005->zbuffer->pix32(scanline); UINT32 color = extra->color; int x; @@ -8950,7 +8963,7 @@ { k001005_state *k001005 = k001005_get_safe_token(device); const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; UINT8 *texrom = k001005->gfxrom + (extra->texture_page * 0x40000); device_t *pal_device = (extra->texture_palette & 0x8) ? k001005->k001006_2 : k001005->k001006_1; int palette_index = (extra->texture_palette & 0x7) * 256; @@ -8968,8 +8981,8 @@ int texture_y = extra->texture_y; int x; - UINT32 *fb = BITMAP_ADDR32(destmap, scanline, 0); - UINT32 *zb = BITMAP_ADDR32(k001005->zbuffer, scanline, 0); + UINT32 *fb = &destmap->pix32(scanline); + UINT32 *zb = &k001005->zbuffer->pix32(scanline); for (x = extent->startx; x < extent->stopx; x++) { @@ -9417,19 +9430,19 @@ } } -void k001005_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k001005_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { k001005_state *k001005 = k001005_get_safe_token(device); int i, j; - memcpy(&k001005->cliprect, cliprect, sizeof(rectangle)); + memcpy(&k001005->cliprect, &cliprect, sizeof(rectangle)); - for (j = cliprect->min_y; j <= cliprect->max_y; j++) + for (j = cliprect.min_y; j <= cliprect.max_y; j++) { - UINT32 *bmp = BITMAP_ADDR32(bitmap, j, 0); - UINT32 *src = BITMAP_ADDR32(k001005->bitmap[k001005->bitmap_page ^ 1], j, 0); + UINT32 *bmp = &bitmap.pix32(j); + UINT32 *src = &k001005->bitmap[k001005->bitmap_page ^ 1]->pix32(j); - for (i = cliprect->min_x; i <= cliprect->max_x; i++) + for (i = cliprect.min_x; i <= cliprect.max_x; i++) { if (src[i] & 0xff000000) { @@ -9457,12 +9470,12 @@ k001005->screen = device->machine().device(intf->screen); width = k001005->screen->width(); height = k001005->screen->height(); - k001005->zbuffer = auto_bitmap_alloc(device->machine(), width, height, BITMAP_FORMAT_INDEXED32); + k001005->zbuffer = auto_bitmap_ind32_alloc(device->machine(), width, height); k001005->gfxrom = device->machine().region(intf->gfx_memory_region)->base(); - k001005->bitmap[0] = k001005->screen->alloc_compatible_bitmap(); - k001005->bitmap[1] = k001005->screen->alloc_compatible_bitmap(); + k001005->bitmap[0] = auto_bitmap_rgb32_alloc(device->machine(), k001005->screen->width(), k001005->screen->height()); + k001005->bitmap[1] = auto_bitmap_rgb32_alloc(device->machine(), k001005->screen->width(), k001005->screen->height()); k001005->texture = auto_alloc_array(device->machine(), UINT8, 0x800000); @@ -9696,12 +9709,12 @@ } -void k001604_draw_back_layer( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k001604_draw_back_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { k001604_state *k001604 = k001604_get_safe_token(device); int layer; int num_layers; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); num_layers = k001604->layer_size ? 2 : 1; @@ -9725,18 +9738,18 @@ if ((k001604->reg[0x6c / 4] & (0x08 >> layer)) != 0) { - tilemap_draw_roz(bitmap, cliprect, k001604->layer_roz[layer], + k001604->layer_roz[layer]->draw_roz(bitmap, cliprect, x << 5, y << 5, xx << 5, xy << 5, yx << 5, yy << 5, 1, 0, 0); } } } -void k001604_draw_front_layer( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k001604_draw_front_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { k001604_state *k001604 = k001604_get_safe_token(device); - //tilemap_draw(bitmap, cliprect, k001604->layer_8x8[1], 0,0); - tilemap_draw(bitmap, cliprect, k001604->layer_8x8[0], 0,0); + //k001604->layer_8x8[1]->draw(bitmap, cliprect, 0,0); + k001604->layer_8x8[0]->draw(bitmap, cliprect, 0,0); } READ32_DEVICE_HANDLER( k001604_tile_r ) @@ -9800,32 +9813,32 @@ { if (x < 64) { - tilemap_mark_tile_dirty(k001604->layer_8x8[0], offset); + k001604->layer_8x8[0]->mark_tile_dirty(offset); } else if (x < 128) { - tilemap_mark_tile_dirty(k001604->layer_8x8[1], offset); + k001604->layer_8x8[1]->mark_tile_dirty(offset); } else if (x < 192) { - tilemap_mark_tile_dirty(k001604->layer_roz[0], offset); + k001604->layer_roz[0]->mark_tile_dirty(offset); } else { - tilemap_mark_tile_dirty(k001604->layer_roz[1], offset); + k001604->layer_roz[1]->mark_tile_dirty(offset); } } else { if (x < 64) { - tilemap_mark_tile_dirty(k001604->layer_8x8[0], offset); - tilemap_mark_tile_dirty(k001604->layer_roz[0], offset); + k001604->layer_8x8[0]->mark_tile_dirty(offset); + k001604->layer_roz[0]->mark_tile_dirty(offset); } else { - tilemap_mark_tile_dirty(k001604->layer_8x8[1], offset); - tilemap_mark_tile_dirty(k001604->layer_roz[1], offset); + k001604->layer_8x8[1]->mark_tile_dirty(offset); + k001604->layer_roz[1]->mark_tile_dirty(offset); } } } @@ -9921,8 +9934,8 @@ k001604->layer_roz[1] = tilemap_create_device(device, k001604_tile_info_layer_roz, k001604_scan_layer_roz_1_size0, roz_tile_size, roz_tile_size, 64, 64); } - tilemap_set_transparent_pen(k001604->layer_8x8[0], 0); - tilemap_set_transparent_pen(k001604->layer_8x8[1], 0); + k001604->layer_8x8[0]->set_transparent_pen(0); + k001604->layer_8x8[1]->set_transparent_pen(0); device->machine().gfx[k001604->gfx_index[0]] = gfx_element_alloc(device->machine(), &k001604_char_layout_layer_8x8, (UINT8*)&k001604->char_ram[0], device->machine().total_colors() / 16, 0); device->machine().gfx[k001604->gfx_index[1]] = gfx_element_alloc(device->machine(), &k001604_char_layout_layer_16x16, (UINT8*)&k001604->char_ram[0], device->machine().total_colors() / 16, 0); @@ -10032,22 +10045,22 @@ } -void k037122_tile_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ) +void k037122_tile_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { k037122_state *k037122 = k037122_get_safe_token(device); const rectangle &visarea = k037122->screen->visible_area(); if (k037122->reg[0xc] & 0x10000) { - tilemap_set_scrolldx(k037122->layer[1], visarea.min_x, visarea.min_x); - tilemap_set_scrolldy(k037122->layer[1], visarea.min_y, visarea.min_y); - tilemap_draw(bitmap, cliprect, k037122->layer[1], 0, 0); + k037122->layer[1]->set_scrolldx(visarea.min_x, visarea.min_x); + k037122->layer[1]->set_scrolldy(visarea.min_y, visarea.min_y); + k037122->layer[1]->draw(bitmap, cliprect, 0, 0); } else { - tilemap_set_scrolldx(k037122->layer[0], visarea.min_x, visarea.min_x); - tilemap_set_scrolldy(k037122->layer[0], visarea.min_y, visarea.min_y); - tilemap_draw(bitmap, cliprect, k037122->layer[0], 0, 0); + k037122->layer[0]->set_scrolldx(visarea.min_x, visarea.min_x); + k037122->layer[0]->set_scrolldy(visarea.min_y, visarea.min_y); + k037122->layer[0]->draw(bitmap, cliprect, 0, 0); } } @@ -10076,11 +10089,11 @@ { if (offset < 0x8000 / 4) { - tilemap_mark_tile_dirty(k037122->layer[1], offset); + k037122->layer[1]->mark_tile_dirty(offset); } else if (offset >= 0x8000 / 4 && offset < 0x18000 / 4) { - tilemap_mark_tile_dirty(k037122->layer[0], offset - (0x8000 / 4)); + k037122->layer[0]->mark_tile_dirty(offset - (0x8000 / 4)); } else if (offset >= 0x18000 / 4) { @@ -10095,11 +10108,11 @@ } else if (offset >= 0x8000 / 4 && offset < 0x18000 / 4) { - tilemap_mark_tile_dirty(k037122->layer[0], offset - (0x8000 / 4)); + k037122->layer[0]->mark_tile_dirty(offset - (0x8000 / 4)); } else if (offset >= 0x18000 / 4) { - tilemap_mark_tile_dirty(k037122->layer[1], offset - (0x18000 / 4)); + k037122->layer[1]->mark_tile_dirty(offset - (0x18000 / 4)); } } } @@ -10163,8 +10176,8 @@ k037122->layer[0] = tilemap_create_device(device, k037122_tile_info_layer0, tilemap_scan_rows, 8, 8, 256, 64); k037122->layer[1] = tilemap_create_device(device, k037122_tile_info_layer1, tilemap_scan_rows, 8, 8, 128, 64); - tilemap_set_transparent_pen(k037122->layer[0], 0); - tilemap_set_transparent_pen(k037122->layer[1], 0); + k037122->layer[0]->set_transparent_pen(0); + k037122->layer[1]->set_transparent_pen(0); device->machine().gfx[k037122->gfx_index] = gfx_element_alloc(device->machine(), &k037122_char_layout, (UINT8*)k037122->char_ram, device->machine().total_colors() / 16, 0); diff -Nru mame-0.144/src/mame/video/konicdev.h mame-0.145/src/mame/video/konicdev.h --- mame-0.144/src/mame/video/konicdev.h 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/konicdev.h 2012-02-06 21:30:32.000000000 +0000 @@ -309,7 +309,7 @@ /* shall we move source in the interface? */ /* also notice that now we directly pass *gfx[chip] instead of **gfx !! */ -void k007121_sprites_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, gfx_element *gfx, colortable_t *ctable, +void k007121_sprites_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, colortable_t *ctable, const UINT8 *source, int base_color, int global_x_offset, int bank_base, UINT32 pri_mask ); @@ -321,7 +321,7 @@ WRITE8_DEVICE_HANDLER( k007342_vreg_w ); void k007342_tilemap_update(device_t *device); -void k007342_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int num, int flags, UINT32 priority); +void k007342_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int num, int flags, UINT32 priority); int k007342_is_int_enabled(device_t *device); @@ -330,7 +330,7 @@ READ8_DEVICE_HANDLER( k007420_r ); WRITE8_DEVICE_HANDLER( k007420_w ); -void k007420_sprites_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, gfx_element *gfx); +void k007420_sprites_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx); /** Konami 052109 **/ @@ -376,7 +376,7 @@ int k052109_is_irq_enabled(device_t *device); void k052109_set_layer_offsets(device_t *device, int layer, int dx, int dy); void k052109_tilemap_mark_dirty(device_t *device, int tmap_num); -void k052109_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int tmap_num, UINT32 flags, UINT8 priority); +void k052109_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, UINT32 flags, UINT8 priority); /** Konami 051960 / 051937 **/ @@ -404,7 +404,7 @@ READ16_DEVICE_HANDLER( k051937_word_r ); WRITE16_DEVICE_HANDLER( k051937_word_w ); -void k051960_sprites_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int min_priority, int max_priority); +void k051960_sprites_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int min_priority, int max_priority); int k051960_is_irq_enabled(device_t *device); int k051960_is_nmi_enabled(device_t *device); void k051960_set_sprite_offsets(device_t *device, int dx, int dy); @@ -428,8 +428,8 @@ READ16_DEVICE_HANDLER( k053244_word_r ); WRITE16_DEVICE_HANDLER( k053244_word_w ); void k053244_bankselect(device_t *device, int bank); /* used by TMNT2, Asterix and Premier Soccer for ROM testing */ -void k053245_sprites_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void k053245_sprites_draw_lethal(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); /* for lethal enforcers */ +void k053245_sprites_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void k053245_sprites_draw_lethal(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); /* for lethal enforcers */ void k053245_clear_buffer(device_t *device); void k053245_set_sprite_offs(device_t *device, int offsx, int offsy); @@ -463,7 +463,8 @@ WRITE16_DEVICE_HANDLER( k053247_reg_word_w ); // "OBJSET2" registers WRITE32_DEVICE_HANDLER( k053247_reg_long_w ); -void k053247_sprites_draw(device_t *device, bitmap_t *bitmap,const rectangle *cliprect); +void k053247_sprites_draw(device_t *device, bitmap_ind16 &bitmap,const rectangle &cliprect); +void k053247_sprites_draw(device_t *device, bitmap_rgb32 &bitmap,const rectangle &cliprect); int k053247_read_register(device_t *device, int regnum); void k053247_set_sprite_offs(device_t *device, int offsx, int offsy); void k053247_wraparound_enable(device_t *device, int status); @@ -501,7 +502,7 @@ WRITE8_DEVICE_HANDLER( k051316_w ); READ8_DEVICE_HANDLER( k051316_rom_r ); WRITE8_DEVICE_HANDLER( k051316_ctrl_w ); -void k051316_zoom_draw(device_t *device, bitmap_t *bitmap,const rectangle *cliprect,int flags,UINT32 priority); +void k051316_zoom_draw(device_t *device, bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,UINT32 priority); void k051316_wraparound_enable(device_t *device, int status); @@ -510,14 +511,14 @@ READ16_DEVICE_HANDLER( k053936_ctrl_r ); // FIXME: this is probably unused... to be checked! WRITE16_DEVICE_HANDLER( k053936_linectrl_w ); READ16_DEVICE_HANDLER( k053936_linectrl_r ); -void k053936_zoom_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, int flags, UINT32 priority, int glfgreat_hack); +void k053936_zoom_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int flags, UINT32 priority, int glfgreat_hack); void k053936_wraparound_enable(device_t *device, int status); // shall we merge this into the configuration intf? void k053936_set_offset(device_t *device, int xoffs, int yoffs); // shall we merge this into the configuration intf? /** Konami 053251 **/ /* - Note: k053251_w() automatically does a tilemap_mark_all_tiles_dirty(ALL_TILEMAPS) + Note: k053251_w() automatically does a ALL_TILEMAPS->mark_all_dirty() when some palette index changes. If ALL_TILEMAPS is too expensive, use k053251_set_tilemaps() to indicate which tilemap is associated with each index. */ @@ -579,8 +580,9 @@ WRITE8_DEVICE_HANDLER( k056832_b_w ); void k056832_mark_plane_dirty(device_t *device, int num); void k056832_mark_all_tmaps_dirty(device_t *device); -void k056832_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int num, UINT32 flags, UINT32 priority); -void k056832_tilemap_draw_dj(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, UINT32 flags, UINT32 priority); +void k056832_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int num, UINT32 flags, UINT32 priority); +void k056832_tilemap_draw(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int num, UINT32 flags, UINT32 priority); +void k056832_tilemap_draw_dj(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, UINT32 flags, UINT32 priority); void k056832_set_layer_association(device_t *device, int status); int k056832_get_layer_association(device_t *device); void k056832_set_layer_offs(device_t *device, int layer, int offsx, int offsy); @@ -691,8 +693,8 @@ WRITE32_DEVICE_HANDLER( k054338_long_w ); int k054338_register_r(device_t *device, int reg); void k054338_update_all_shadows(device_t *device, int rushingheroes_hack); // called at the beginning of SCREEN_UPDATE() -void k054338_fill_solid_bg(device_t *device, bitmap_t *bitmap); // solid backcolor fill -void k054338_fill_backcolor(device_t *device, bitmap_t *bitmap, int mode); // unified fill, 0=solid, 1=gradient (by using a k055555) +void k054338_fill_solid_bg(device_t *device, bitmap_ind16 &bitmap); // solid backcolor fill +void k054338_fill_backcolor(device_t *device, bitmap_rgb32 &bitmap, int mode); // unified fill, 0=solid, 1=gradient (by using a k055555) int k054338_set_alpha_level(device_t *device, int pblend); // blend style 0-2 void k054338_invert_alpha(device_t *device, int invert); // 0=0x00(invis)-0x1f(solid), 1=0x1f(invis)-0x00(solod) //void K054338_export_config(device_t *device, int **shdRGB); @@ -720,7 +722,7 @@ /** Konami 001005 **/ -void k001005_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +void k001005_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); void k001005_swap_buffers(device_t *device); void k001005_preprocess_texture_data(UINT8 *rom, int length, int gticlub); @@ -729,8 +731,8 @@ /** Konami 001604 **/ -void k001604_draw_back_layer( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ); -void k001604_draw_front_layer( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ); +void k001604_draw_back_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ); +void k001604_draw_front_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ); WRITE32_DEVICE_HANDLER( k001604_tile_w ); READ32_DEVICE_HANDLER( k001604_tile_r ); WRITE32_DEVICE_HANDLER( k001604_char_w ); @@ -740,7 +742,7 @@ /** Konami 037122 **/ -void k037122_tile_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect ); +void k037122_tile_draw( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ); READ32_DEVICE_HANDLER( k037122_sram_r ); WRITE32_DEVICE_HANDLER( k037122_sram_w ); READ32_DEVICE_HANDLER( k037122_char_r ); diff -Nru mame-0.144/src/mame/video/kopunch.c mame-0.145/src/mame/video/kopunch.c --- mame-0.144/src/mame/video/kopunch.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kopunch.c 2012-02-06 21:30:31.000000000 +0000 @@ -36,26 +36,26 @@ { kopunch_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kopunch_videoram2_w ) { kopunch_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( kopunch_scroll_x_w ) { kopunch_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( kopunch_scroll_y_w ) { kopunch_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( kopunch_gfxbank_w ) @@ -64,10 +64,10 @@ if (state->m_gfxbank != (data & 0x07)) { state->m_gfxbank = data & 0x07; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } - tilemap_set_flip(state->m_bg_tilemap, (data & 0x08) ? TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_flip((data & 0x08) ? TILEMAP_FLIPY : 0); } static TILE_GET_INFO( get_fg_tile_info ) @@ -92,17 +92,17 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 16, 16); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, 16, 16); + state->m_bg_tilemap->set_scrolldx(16, 16); } -SCREEN_UPDATE( kopunch ) +SCREEN_UPDATE_IND16( kopunch ) { - kopunch_state *state = screen->machine().driver_data(); + kopunch_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ksayakyu.c mame-0.145/src/mame/video/ksayakyu.c --- mame-0.144/src/mame/video/ksayakyu.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ksayakyu.c 2012-02-06 21:30:32.000000000 +0000 @@ -6,7 +6,7 @@ { ksayakyu_state *state = space->machine().driver_data(); state->m_videoram[offset]=data; - tilemap_mark_tile_dirty(state->m_textmap, offset >> 1); + state->m_textmap->mark_tile_dirty(offset >> 1); } WRITE8_HANDLER(ksayakyu_videoctrl_w) @@ -25,11 +25,11 @@ state->m_flipscreen = data & 4; flip_screen_set(space->machine(), state->m_flipscreen); - tilemap_set_scrolly(state->m_tilemap, 0, (data & 0xe0) << 3); + state->m_tilemap->set_scrolly(0, (data & 0xe0) << 3); if(state->m_flipscreen) - tilemap_set_flip(state->m_tilemap, (data & 2) ? TILEMAP_FLIPY : TILEMAP_FLIPX | TILEMAP_FLIPY); + state->m_tilemap->set_flip((data & 2) ? TILEMAP_FLIPY : TILEMAP_FLIPX | TILEMAP_FLIPY); else - tilemap_set_flip(state->m_tilemap, (data & 2) ? TILEMAP_FLIPX : 0); + state->m_tilemap->set_flip((data & 2) ? TILEMAP_FLIPX : 0); } PALETTE_INIT( ksayakyu ) @@ -81,7 +81,7 @@ [3] */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ksayakyu_state *state = machine.driver_data(); const UINT8 *source = state->m_spriteram + state->m_spriteram_size - 4; @@ -121,19 +121,19 @@ ksayakyu_state *state = machine.driver_data(); state->m_tilemap = tilemap_create(machine, get_ksayakyu_tile_info, tilemap_scan_rows, 8, 8, 32, 32 * 8); state->m_textmap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_textmap, 0); + state->m_textmap->set_transparent_pen(0); } -SCREEN_UPDATE(ksayakyu) +SCREEN_UPDATE_IND16(ksayakyu) { - ksayakyu_state *state = screen->machine().driver_data(); + ksayakyu_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (state->m_video_ctrl & 1) - tilemap_draw(bitmap, cliprect,state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_textmap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_textmap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/kyugo.c mame-0.145/src/mame/video/kyugo.c --- mame-0.144/src/mame/video/kyugo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/kyugo.c 2012-02-06 21:30:31.000000000 +0000 @@ -52,10 +52,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, 224); - tilemap_set_scrolldx(state->m_bg_tilemap, -32, 32); + state->m_fg_tilemap->set_scrolldx(0, 224); + state->m_bg_tilemap->set_scrolldx(-32, 32); } @@ -70,7 +70,7 @@ kyugo_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -79,7 +79,7 @@ kyugo_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -88,7 +88,7 @@ kyugo_state *state = space->machine().driver_data(); state->m_bgattribram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -120,14 +120,14 @@ { state->m_fgcolor = (data & 0x20) >> 5; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } /* bit 6 is background palette bank */ if (state->m_bgpalbank != ((data & 0x40) >> 6)) { state->m_bgpalbank = (data & 0x40) >> 6; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } if (data & 0x9e) @@ -149,7 +149,7 @@ if (state->m_flipscreen != (data & 0x01)) { state->m_flipscreen = (data & 0x01); - tilemap_set_flip_all(space->machine(), (state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY): 0)); + space->machine().tilemap().set_flip_all((state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY): 0)); } } @@ -160,7 +160,7 @@ * *************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { kyugo_state *state = machine.driver_data(); @@ -220,19 +220,19 @@ } -SCREEN_UPDATE( kyugo ) +SCREEN_UPDATE_IND16( kyugo ) { - kyugo_state *state = screen->machine().driver_data(); + kyugo_state *state = screen.machine().driver_data(); if (state->m_flipscreen) - tilemap_set_scrollx(state->m_bg_tilemap, 0, -(state->m_scroll_x_lo + (state->m_scroll_x_hi * 256))); + state->m_bg_tilemap->set_scrollx(0, -(state->m_scroll_x_lo + (state->m_scroll_x_hi * 256))); else - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_x_lo + (state->m_scroll_x_hi * 256)); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x_lo + (state->m_scroll_x_hi * 256)); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_y); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_y); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/labyrunr.c mame-0.145/src/mame/video/labyrunr.c --- mame-0.144/src/mame/video/labyrunr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/labyrunr.c 2012-02-06 21:30:32.000000000 +0000 @@ -137,8 +137,8 @@ state->m_layer0 = tilemap_create(machine, get_tile_info0, tilemap_scan_rows, 8, 8, 32, 32); state->m_layer1 = tilemap_create(machine, get_tile_info1, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_layer0, 0); - tilemap_set_transparent_pen(state->m_layer1, 0); + state->m_layer0->set_transparent_pen(0); + state->m_layer1->set_transparent_pen(0); state->m_clip0 = machine.primary_screen->visible_area(); state->m_clip0.min_x += 40; @@ -147,7 +147,7 @@ state->m_clip1.max_x = 39; state->m_clip1.min_x = 0; - tilemap_set_scroll_cols(state->m_layer0, 32); + state->m_layer0->set_scroll_cols(32); } @@ -162,14 +162,14 @@ { labyrunr_state *state = space->machine().driver_data(); state->m_videoram1[offset] = data; - tilemap_mark_tile_dirty(state->m_layer0, offset & 0x3ff); + state->m_layer0->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( labyrunr_vram2_w ) { labyrunr_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_layer1, offset & 0x3ff); + state->m_layer1->mark_tile_dirty(offset & 0x3ff); } @@ -180,16 +180,16 @@ ***************************************************************************/ -SCREEN_UPDATE( labyrunr ) +SCREEN_UPDATE_IND16( labyrunr ) { - labyrunr_state *state = screen->machine().driver_data(); + labyrunr_state *state = screen.machine().driver_data(); UINT8 ctrl_0 = k007121_ctrlram_r(state->m_k007121, 0); rectangle finalclip0, finalclip1; - set_pens(screen->machine()); + set_pens(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap, cliprect,0); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (~k007121_ctrlram_r(state->m_k007121, 3) & 0x20) { @@ -198,25 +198,25 @@ finalclip0 = state->m_clip0; finalclip1 = state->m_clip1; - sect_rect(&finalclip0, cliprect); - sect_rect(&finalclip1, cliprect); + finalclip0 &= cliprect; + finalclip1 &= cliprect; - tilemap_set_scrollx(state->m_layer0, 0, ctrl_0 - 40); - tilemap_set_scrollx(state->m_layer1, 0, 0); + state->m_layer0->set_scrollx(0, ctrl_0 - 40); + state->m_layer1->set_scrollx(0, 0); for(i = 0; i < 32; i++) { /* enable colscroll */ if((k007121_ctrlram_r(state->m_k007121, 1) & 6) == 6) // it's probably just one bit, but it's only used once in the game so I don't know which it's - tilemap_set_scrolly(state->m_layer0, (i + 2) & 0x1f, k007121_ctrlram_r(state->m_k007121, 2) + state->m_scrollram[i]); + state->m_layer0->set_scrolly((i + 2) & 0x1f, k007121_ctrlram_r(state->m_k007121, 2) + state->m_scrollram[i]); else - tilemap_set_scrolly(state->m_layer0, (i + 2) & 0x1f, k007121_ctrlram_r(state->m_k007121, 2)); + state->m_layer0->set_scrolly((i + 2) & 0x1f, k007121_ctrlram_r(state->m_k007121, 2)); } - tilemap_draw(bitmap, &finalclip0, state->m_layer0, TILEMAP_DRAW_OPAQUE, 0); - k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen->machine().gfx[0], screen->machine().colortable, state->m_spriteram,(k007121_ctrlram_r(state->m_k007121, 6) & 0x30) * 2, 40,0,(k007121_ctrlram_r(state->m_k007121, 3) & 0x40) >> 5); + state->m_layer0->draw(bitmap, finalclip0, TILEMAP_DRAW_OPAQUE, 0); + k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen.machine().gfx[0], screen.machine().colortable, state->m_spriteram,(k007121_ctrlram_r(state->m_k007121, 6) & 0x30) * 2, 40,0,(k007121_ctrlram_r(state->m_k007121, 3) & 0x40) >> 5); /* we ignore the transparency because layer1 is drawn only at the top of the screen also covering sprites */ - tilemap_draw(bitmap, &finalclip1, state->m_layer1, TILEMAP_DRAW_OPAQUE, 0); + state->m_layer1->draw(bitmap, finalclip1, TILEMAP_DRAW_OPAQUE, 0); } else { @@ -224,17 +224,17 @@ rectangle finalclip3; /* custom cliprects needed for the weird effect used in the endinq sequence to hide and show the needed part of text */ - finalclip0.min_y = finalclip1.min_y = cliprect->min_y; - finalclip0.max_y = finalclip1.max_y = cliprect->max_y; + finalclip0.min_y = finalclip1.min_y = cliprect.min_y; + finalclip0.max_y = finalclip1.max_y = cliprect.max_y; if(k007121_ctrlram_r(state->m_k007121, 1) & 1) { - finalclip0.min_x = cliprect->max_x - ctrl_0 + 8; - finalclip0.max_x = cliprect->max_x; + finalclip0.min_x = cliprect.max_x - ctrl_0 + 8; + finalclip0.max_x = cliprect.max_x; if(ctrl_0 >= 40) { - finalclip1.min_x = cliprect->min_x; + finalclip1.min_x = cliprect.min_x; } else { @@ -243,14 +243,14 @@ finalclip1.min_x = 40 - ctrl_0; } - finalclip1.max_x = cliprect->max_x - ctrl_0 + 8; + finalclip1.max_x = cliprect.max_x - ctrl_0 + 8; } else { if(ctrl_0 >= 40) { - finalclip0.min_x = cliprect->min_x; + finalclip0.min_x = cliprect.min_x; } else { @@ -259,32 +259,32 @@ finalclip0.min_x = 40 - ctrl_0; } - finalclip0.max_x = cliprect->max_x - ctrl_0 + 8; + finalclip0.max_x = cliprect.max_x - ctrl_0 + 8; - finalclip1.min_x = cliprect->max_x - ctrl_0 + 8; - finalclip1.max_x = cliprect->max_x; + finalclip1.min_x = cliprect.max_x - ctrl_0 + 8; + finalclip1.max_x = cliprect.max_x; } if(use_clip3[0] || use_clip3[1]) { - finalclip3.min_y = cliprect->min_y; - finalclip3.max_y = cliprect->max_y; - finalclip3.min_x = cliprect->min_x; + finalclip3.min_y = cliprect.min_y; + finalclip3.max_y = cliprect.max_y; + finalclip3.min_x = cliprect.min_x; finalclip3.max_x = 40 - ctrl_0 - 8; } - tilemap_set_scrollx(state->m_layer0, 0, ctrl_0 - 40); - tilemap_set_scrollx(state->m_layer1, 0, ctrl_0 - 40); + state->m_layer0->set_scrollx(0, ctrl_0 - 40); + state->m_layer1->set_scrollx(0, ctrl_0 - 40); - tilemap_draw(bitmap, &finalclip0, state->m_layer0, 0, 1); + state->m_layer0->draw(bitmap, finalclip0, 0, 1); if(use_clip3[0]) - tilemap_draw(bitmap, &finalclip3, state->m_layer0, 0, 1); + state->m_layer0->draw(bitmap, finalclip3, 0, 1); - tilemap_draw(bitmap, &finalclip1, state->m_layer1, 0, 1); + state->m_layer1->draw(bitmap, finalclip1, 0, 1); if(use_clip3[1]) - tilemap_draw(bitmap, &finalclip3, state->m_layer1, 0, 1); + state->m_layer1->draw(bitmap, finalclip3, 0, 1); - k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen->machine().gfx[0], screen->machine().colortable, state->m_spriteram, (k007121_ctrlram_r(state->m_k007121, 6) & 0x30) * 2,40,0,(k007121_ctrlram_r(state->m_k007121, 3) & 0x40) >> 5); + k007121_sprites_draw(state->m_k007121, bitmap, cliprect, screen.machine().gfx[0], screen.machine().colortable, state->m_spriteram, (k007121_ctrlram_r(state->m_k007121, 6) & 0x30) * 2,40,0,(k007121_ctrlram_r(state->m_k007121, 3) & 0x40) >> 5); } return 0; } diff -Nru mame-0.144/src/mame/video/ladybug.c mame-0.145/src/mame/video/ladybug.c --- mame-0.144/src/mame/video/ladybug.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ladybug.c 2012-02-06 21:30:32.000000000 +0000 @@ -139,14 +139,14 @@ { ladybug_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ladybug_colorram_w ) { ladybug_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ladybug_flipscreen_w ) @@ -154,7 +154,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -172,7 +172,7 @@ if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } state->m_grid_color = data & 0x70; @@ -214,8 +214,8 @@ ladybug_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_scroll_rows(32); + state->m_bg_tilemap->set_transparent_pen(0); } VIDEO_START( sraider ) @@ -223,15 +223,15 @@ ladybug_state *state = machine.driver_data(); state->m_grid_tilemap = tilemap_create(machine, get_grid_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_grid_tilemap, 32); - tilemap_set_transparent_pen(state->m_grid_tilemap, 0); + state->m_grid_tilemap->set_scroll_rows(32); + state->m_grid_tilemap->set_transparent_pen(0); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_scroll_rows(32); + state->m_bg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ladybug_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -282,38 +282,40 @@ } } -SCREEN_UPDATE( ladybug ) +SCREEN_UPDATE_IND16( ladybug ) { - ladybug_state *state = screen->machine().driver_data(); + ladybug_state *state = screen.machine().driver_data(); int offs; // clear the bg bitmap - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (offs = 0; offs < 32; offs++) { int sx = offs % 4; int sy = offs / 4; - if (flip_screen_get(screen->machine())) - tilemap_set_scrollx(state->m_bg_tilemap, offs, -state->m_videoram[32 * sx + sy]); + if (flip_screen_get(screen.machine())) + state->m_bg_tilemap->set_scrollx(offs, -state->m_videoram[32 * sx + sy]); else - tilemap_set_scrollx(state->m_bg_tilemap, offs, state->m_videoram[32 * sx + sy]); + state->m_bg_tilemap->set_scrollx(offs, state->m_videoram[32 * sx + sy]); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( sraider ) /* update starfield position */ +SCREEN_VBLANK( sraider ) /* update starfield position */ { - redclash_update_stars_state(machine); + // falling edge + if (!vblank_on) + redclash_update_stars_state(screen.machine()); } -SCREEN_UPDATE( sraider ) +SCREEN_UPDATE_IND16( sraider ) { - ladybug_state *state = screen->machine().driver_data(); + ladybug_state *state = screen.machine().driver_data(); // this part is boilerplate from ladybug, not sure if hardware does this, // since it's not used @@ -326,46 +328,46 @@ int sx = offs % 4; int sy = offs / 4; - if (flip_screen_get(screen->machine())) - tilemap_set_scrollx(state->m_bg_tilemap, offs, -state->m_videoram[32 * sx + sy]); + if (flip_screen_get(screen.machine())) + state->m_bg_tilemap->set_scrollx(offs, -state->m_videoram[32 * sx + sy]); else - tilemap_set_scrollx(state->m_bg_tilemap, offs, state->m_videoram[32 * sx + sy]); + state->m_bg_tilemap->set_scrollx(offs, state->m_videoram[32 * sx + sy]); } // clear the bg bitmap - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); // draw the stars - if (flip_screen_get(screen->machine())) - redclash_draw_stars(screen->machine(), bitmap, cliprect, 0x60, 1, 0x27, 0xff); + if (flip_screen_get(screen.machine())) + redclash_draw_stars(screen.machine(), bitmap, cliprect, 0x60, 1, 0x27, 0xff); else - redclash_draw_stars(screen->machine(), bitmap, cliprect, 0x60, 1, 0x00, 0xd8); + redclash_draw_stars(screen.machine(), bitmap, cliprect, 0x60, 1, 0x00, 0xd8); // draw the gridlines - colortable_palette_set_color(screen->machine().colortable, 0x40, MAKE_RGB(state->m_grid_color & 0x40 ? 0xff : 0, + colortable_palette_set_color(screen.machine().colortable, 0x40, MAKE_RGB(state->m_grid_color & 0x40 ? 0xff : 0, state->m_grid_color & 0x20 ? 0xff : 0, state->m_grid_color & 0x10 ? 0xff : 0)); - tilemap_draw(bitmap, cliprect, state->m_grid_tilemap, 0, flip_screen_get(screen->machine())); + state->m_grid_tilemap->draw(bitmap, cliprect, 0, flip_screen_get(screen.machine())); for (i = 0; i < 0x100; i++) { if (state->m_grid_data[i] != 0) { UINT8 x = i; - int height = cliprect->max_y - cliprect->min_y + 1; + int height = cliprect.max_y - cliprect.min_y + 1; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) x = ~x; - plot_box(bitmap, x, cliprect->min_y, 1, height, 0x81); + bitmap.plot_box(x, cliprect.min_y, 1, height, 0x81); } } // now the chars - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, flip_screen_get(screen->machine())); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, flip_screen_get(screen.machine())); // now the sprites - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/ladyfrog.c mame-0.145/src/mame/video/ladyfrog.c --- mame-0.144/src/mame/video/ladyfrog.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ladyfrog.c 2012-02-06 21:30:32.000000000 +0000 @@ -37,7 +37,7 @@ { ladyfrog_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } READ8_HANDLER( ladyfrog_videoram_r ) @@ -76,7 +76,7 @@ { ladyfrog_state *state = space->machine().driver_data(); state->m_tilebank = ((data & 0x18) >> 3) ^ 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } @@ -100,10 +100,10 @@ ladyfrog_state *state = space->machine().driver_data(); state->m_scrlram[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ladyfrog_state *state = machine.driver_data(); int i; @@ -147,8 +147,8 @@ machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x200); machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x200); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); - tilemap_set_scrolldy(state->m_bg_tilemap, 15, 15); + state->m_bg_tilemap->set_scroll_cols(32); + state->m_bg_tilemap->set_scrolldy(15, 15); state_save_register_global_pointer(machine, machine.generic.paletteram.u8, 0x200); state_save_register_global_pointer(machine, machine.generic.paletteram2.u8, 0x200); @@ -173,11 +173,11 @@ } -SCREEN_UPDATE( ladyfrog ) +SCREEN_UPDATE_IND16( ladyfrog ) { - ladyfrog_state *state = screen->machine().driver_data(); + ladyfrog_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/lasso.c mame-0.145/src/mame/video/lasso.c --- mame-0.144/src/mame/video/lasso.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/lasso.c 2012-02-06 21:30:31.000000000 +0000 @@ -170,7 +170,7 @@ /* create tilemap */ state->m_bg_tilemap = tilemap_create(machine, lasso_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } VIDEO_START( wwjgtin ) @@ -181,7 +181,7 @@ state->m_bg_tilemap = tilemap_create(machine, lasso_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_track_tilemap = tilemap_create(machine, wwjgtin_get_track_tile_info, tilemap_scan_rows, 16, 16, 128, 64); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } VIDEO_START( pinbo ) @@ -190,6 +190,8 @@ /* create tilemap */ state->m_bg_tilemap = tilemap_create(machine, pinbo_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + + state->m_bg_tilemap->set_transparent_pen(0); } @@ -203,14 +205,14 @@ { lasso_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( lasso_colorram_w ) { lasso_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -220,7 +222,7 @@ flip_screen_x_set(space->machine(), data & 0x01); flip_screen_y_set(space->machine(), data & 0x02); - tilemap_set_flip_all(space->machine(), (flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); + space->machine().tilemap().set_flip_all((flip_screen_x_get(space->machine()) ? TILEMAP_FLIPX : 0) | (flip_screen_y_get(space->machine()) ? TILEMAP_FLIPY : 0)); } @@ -232,7 +234,7 @@ if (state->m_gfxbank != bank) { state->m_gfxbank = bank; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } lasso_flip_screen_w(space, offset, data); @@ -247,7 +249,7 @@ if (state->m_gfxbank != bank) { state->m_gfxbank = bank; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } lasso_flip_screen_w(space, offset, data); @@ -270,7 +272,7 @@ * *************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int reverse ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int reverse ) { lasso_state *state = machine.driver_data(); const UINT8 *finish, *source; @@ -324,7 +326,7 @@ } -static void draw_lasso( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_lasso( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lasso_state *state = machine.driver_data(); offs_t offs; @@ -340,7 +342,7 @@ if (flip_screen_y_get(machine)) y = ~y; - if ((y < cliprect->min_y) || (y > cliprect->max_y)) + if ((y < cliprect.min_y) || (y > cliprect.max_y)) continue; x = (offs & 0x1f) << 3; @@ -351,8 +353,8 @@ for (bit = 0; bit < 8; bit++) { - if ((data & 0x80) && (x >= cliprect->min_x) && (x <= cliprect->max_x)) - *BITMAP_ADDR16(bitmap, y, x) = pen; + if ((data & 0x80) && (x >= cliprect.min_x) && (x <= cliprect.max_x)) + bitmap.pix16(y, x) = pen; if (flip_screen_x_get(machine)) x = x - 1; @@ -365,58 +367,48 @@ } -SCREEN_UPDATE( lasso ) +SCREEN_UPDATE_IND16( lasso ) { - lasso_state *state = screen->machine().driver_data(); - palette_set_color(screen->machine(), 0, get_color(*state->m_back_color)); - bitmap_fill(bitmap, cliprect, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_lasso(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + lasso_state *state = screen.machine().driver_data(); + palette_set_color(screen.machine(), 0, get_color(*state->m_back_color)); + bitmap.fill(0, cliprect); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_lasso(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0); return 0; } -SCREEN_UPDATE( chameleo ) +SCREEN_UPDATE_IND16( chameleo ) { - lasso_state *state = screen->machine().driver_data(); - palette_set_color(screen->machine(), 0, get_color(*state->m_back_color)); - bitmap_fill(bitmap, cliprect, 0); + lasso_state *state = screen.machine().driver_data(); + palette_set_color(screen.machine(), 0, get_color(*state->m_back_color)); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); return 0; } -SCREEN_UPDATE( wwjgtin ) +SCREEN_UPDATE_IND16( wwjgtin ) { - lasso_state *state = screen->machine().driver_data(); - colortable_palette_set_color(screen->machine().colortable, 0, get_color(*state->m_back_color)); - wwjgtin_set_last_four_colors(screen->machine(), screen->machine().colortable); + lasso_state *state = screen.machine().driver_data(); + colortable_palette_set_color(screen.machine().colortable, 0, get_color(*state->m_back_color)); + wwjgtin_set_last_four_colors(screen.machine(), screen.machine().colortable); - tilemap_set_scrollx(state->m_track_tilemap, 0, state->m_track_scroll[0] + state->m_track_scroll[1] * 256); - tilemap_set_scrolly(state->m_track_tilemap, 0, state->m_track_scroll[2] + state->m_track_scroll[3] * 256); + state->m_track_tilemap->set_scrollx(0, state->m_track_scroll[0] + state->m_track_scroll[1] * 256); + state->m_track_tilemap->set_scrolly(0, state->m_track_scroll[2] + state->m_track_scroll[3] * 256); if (state->m_track_enable) - tilemap_draw(bitmap, cliprect, state->m_track_tilemap, 0, 0); + state->m_track_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - - draw_sprites(screen->machine(), bitmap, cliprect, 1); // reverse order - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - return 0; -} - - -SCREEN_UPDATE( pinbo ) -{ - lasso_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); // reverse order + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/lastduel.c mame-0.145/src/mame/video/lastduel.c --- mame-0.144/src/mame/video/lastduel.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lastduel.c 2012-02-06 21:30:32.000000000 +0000 @@ -37,7 +37,7 @@ tile, color & 0xf, TILE_FLIPYX((color & 0x60) >> 5)); - tileinfo->group = (color & 0x80) >> 7; + tileinfo.group = (color & 0x80) >> 7; } static TILE_GET_INFO( get_bg_tile_info ) @@ -62,7 +62,7 @@ tile, color & 0xf, TILE_FLIPYX((color & 0x60) >> 5)); - tileinfo->group = (color & 0x10) >> 4; + tileinfo.group = (color & 0x10) >> 4; } static TILE_GET_INFO( get_fix_info ) @@ -91,9 +91,9 @@ state->m_fg_tilemap = tilemap_create(machine, ld_get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_tx_tilemap = tilemap_create(machine, get_fix_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transmask(state->m_fg_tilemap, 0, 0xffff, 0x0001); - tilemap_set_transmask(state->m_fg_tilemap, 1, 0xf07f, 0x0f81); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); + state->m_fg_tilemap->set_transmask(0, 0xffff, 0x0001); + state->m_fg_tilemap->set_transmask(1, 0xf07f, 0x0f81); + state->m_tx_tilemap->set_transparent_pen(3); state->m_sprite_flipy_mask = 0x40; state->m_sprite_pri_mask = 0x00; @@ -107,10 +107,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_cols,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, get_fix_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transmask(state->m_fg_tilemap, 0, 0xffff, 0x8000); - tilemap_set_transmask(state->m_fg_tilemap, 1, 0x80ff, 0xff00); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_fg_tilemap->set_transmask(0, 0xffff, 0x8000); + state->m_fg_tilemap->set_transmask(1, 0x80ff, 0xff00); + state->m_tx_tilemap->set_transparent_pen(3); + state->m_bg_tilemap->set_transparent_pen(15); state->m_sprite_flipy_mask = 0x80; state->m_sprite_pri_mask = 0x10; @@ -144,10 +144,10 @@ data = COMBINE_DATA(&state->m_scroll[offset]); switch (offset) { - case 0: tilemap_set_scrolly(state->m_fg_tilemap, 0, data); break; - case 1: tilemap_set_scrollx(state->m_fg_tilemap, 0, data); break; - case 2: tilemap_set_scrolly(state->m_bg_tilemap, 0, data); break; - case 3: tilemap_set_scrollx(state->m_bg_tilemap, 0, data); break; + case 0: state->m_fg_tilemap->set_scrolly(0, data); break; + case 1: state->m_fg_tilemap->set_scrollx(0, data); break; + case 2: state->m_bg_tilemap->set_scrolly(0, data); break; + case 3: state->m_bg_tilemap->set_scrollx(0, data); break; case 7: state->m_tilemap_priority = data; break; default: logerror("Unmapped video write %d %04x\n", offset, data); @@ -160,7 +160,7 @@ lastduel_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll1[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( lastduel_scroll2_w ) @@ -168,7 +168,7 @@ lastduel_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( lastduel_vram_w ) @@ -176,7 +176,7 @@ lastduel_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( madgear_scroll1_w ) @@ -184,7 +184,7 @@ lastduel_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll1[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x7ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE16_HANDLER( madgear_scroll2_w ) @@ -192,7 +192,7 @@ lastduel_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE16_HANDLER( lastduel_palette_word_w ) @@ -218,7 +218,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { lastduel_state *state = machine.driver_data(); @@ -269,49 +269,53 @@ } } -SCREEN_UPDATE( lastduel ) +SCREEN_UPDATE_IND16( lastduel ) { - lastduel_state *state = screen->machine().driver_data(); + lastduel_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( madgear ) +SCREEN_UPDATE_IND16( madgear ) { - lastduel_state *state = screen->machine().driver_data(); + lastduel_state *state = screen.machine().driver_data(); if (state->m_tilemap_priority) { - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_OPAQUE, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | TILEMAP_DRAW_OPAQUE, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); } else { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); } - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( lastduel ) +SCREEN_VBLANK( lastduel ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - /* Spriteram is always 1 frame ahead, suggesting buffering. I can't find - a register to control this so I assume it happens automatically - every frame at the end of vblank */ - buffer_spriteram16_w(space, 0, 0, 0xffff); + /* Spriteram is always 1 frame ahead, suggesting buffering. I can't find + a register to control this so I assume it happens automatically + every frame at the end of vblank */ + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/lazercmd.c mame-0.145/src/mame/video/lazercmd.c --- mame-0.144/src/mame/video/lazercmd.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lazercmd.c 2012-02-06 21:30:33.000000000 +0000 @@ -24,7 +24,7 @@ /* plot a bitmap marker */ /* hardware has 2 marker sizes 2x2 and 4x2 selected by jumper */ /* meadows lanes normaly use 2x2 pixels and lazer command uses either */ -static void plot_pattern( running_machine &machine, bitmap_t *bitmap, int x, int y ) +static void plot_pattern( running_machine &machine, bitmap_ind16 &bitmap, int x, int y ) { int xbit, ybit, size; @@ -44,18 +44,18 @@ if (x + xbit < 0 || x + xbit >= HORZ_RES * HORZ_CHR) continue; - *BITMAP_ADDR16(bitmap, y + ybit, x + xbit) = 4; + bitmap.pix16(y + ybit, x + xbit) = 4; } } } -SCREEN_UPDATE( lazercmd ) +SCREEN_UPDATE_IND16( lazercmd ) { - lazercmd_state *state = screen->machine().driver_data(); + lazercmd_state *state = screen.machine().driver_data(); int i, x, y; - int video_inverted = input_port_read(screen->machine(), "DSW") & 0x20; + int video_inverted = input_port_read(screen.machine(), "DSW") & 0x20; /* The first row of characters are invisible */ for (i = 0; i < (VERT_RES - 1) * HORZ_RES; i++) @@ -68,7 +68,7 @@ sx *= HORZ_CHR; sy *= VERT_CHR; - drawgfx_opaque(bitmap, cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap, cliprect,screen.machine().gfx[0], state->m_videoram[i], video_inverted ? 1 : 0, 0,0, sx,sy); @@ -76,7 +76,7 @@ x = state->m_marker_x - 1; /* normal video lags marker by 1 pixel */ y = vert_scale(state->m_marker_y) - VERT_CHR; /* first line used as scratch pad */ - plot_pattern(screen->machine(), bitmap, x, y); + plot_pattern(screen.machine(), bitmap, x, y); return 0; } diff -Nru mame-0.144/src/mame/video/legionna.c mame-0.145/src/mame/video/legionna.c --- mame-0.144/src/mame/video/legionna.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/legionna.c 2012-02-06 21:30:31.000000000 +0000 @@ -24,38 +24,38 @@ state->m_back_gfx_bank = (data &0x4000) >> 2; state->m_mid_gfx_bank = (data &0x8000) >> 3;//??? - tilemap_mark_all_tiles_dirty (state->m_background_layer); - tilemap_mark_all_tiles_dirty (state->m_foreground_layer); - tilemap_mark_all_tiles_dirty (state->m_midground_layer); - tilemap_mark_all_tiles_dirty (state->m_text_layer); + state->m_background_layer->mark_all_dirty(); + state->m_foreground_layer->mark_all_dirty(); + state->m_midground_layer->mark_all_dirty(); + state->m_text_layer->mark_all_dirty(); } WRITE16_HANDLER( legionna_background_w ) { legionna_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_back_data[offset]); - tilemap_mark_tile_dirty(state->m_background_layer,offset); + state->m_background_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( legionna_midground_w ) { legionna_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid_data[offset]); - tilemap_mark_tile_dirty(state->m_midground_layer,offset); + state->m_midground_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( legionna_foreground_w ) { legionna_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fore_data[offset]); - tilemap_mark_tile_dirty(state->m_foreground_layer,offset); + state->m_foreground_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( legionna_text_w ) { legionna_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_textram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer,offset); + state->m_text_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_back_tile_info ) @@ -157,10 +157,10 @@ state->m_has_extended_banking = 0; state->m_has_extended_priority = 0; - tilemap_set_transparent_pen(state->m_background_layer,15); - tilemap_set_transparent_pen(state->m_midground_layer,15); - tilemap_set_transparent_pen(state->m_foreground_layer,15); - tilemap_set_transparent_pen(state->m_text_layer,15); + state->m_background_layer->set_transparent_pen(15); + state->m_midground_layer->set_transparent_pen(15); + state->m_foreground_layer->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); } VIDEO_START( denjinmk ) @@ -178,10 +178,10 @@ state->m_has_extended_banking = 1; state->m_has_extended_priority = 0; - tilemap_set_transparent_pen(state->m_background_layer,15); - tilemap_set_transparent_pen(state->m_midground_layer,15); - tilemap_set_transparent_pen(state->m_foreground_layer,15); - tilemap_set_transparent_pen(state->m_text_layer,7);//? + state->m_background_layer->set_transparent_pen(15); + state->m_midground_layer->set_transparent_pen(15); + state->m_foreground_layer->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(7);//? } VIDEO_START( cupsoc ) @@ -199,10 +199,10 @@ state->m_has_extended_banking = 0; state->m_has_extended_priority = 1; - tilemap_set_transparent_pen(state->m_background_layer,15); - tilemap_set_transparent_pen(state->m_midground_layer,15); - tilemap_set_transparent_pen(state->m_foreground_layer,15); - tilemap_set_transparent_pen(state->m_text_layer,15); + state->m_background_layer->set_transparent_pen(15); + state->m_midground_layer->set_transparent_pen(15); + state->m_foreground_layer->set_transparent_pen(15); + state->m_text_layer->set_transparent_pen(15); } VIDEO_START(grainbow) @@ -251,7 +251,7 @@ *************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { legionna_state *state = machine.driver_data(); UINT16 *spriteram16 = machine.generic.spriteram.u16; @@ -335,7 +335,7 @@ /* heated barrel hardware seems to need 0x1ff with 0x100 sign bit for sprite warp, this doesn't work on denjin makai as the visible area is larger */ - if (cliprect->max_x<(320-1)) + if (cliprect.max_x<(320-1)) { x&=0x1ff; y&=0x1ff; @@ -415,94 +415,94 @@ #define LAYER_DB 0 -SCREEN_UPDATE( legionna ) +SCREEN_UPDATE_IND16( legionna ) { - legionna_state *state = screen->machine().driver_data(); + legionna_state *state = screen.machine().driver_data(); /* Setup the tilemaps */ - tilemap_set_scrollx( state->m_background_layer, 0, state->m_scrollram16[0] ); - tilemap_set_scrolly( state->m_background_layer, 0, state->m_scrollram16[1] ); - tilemap_set_scrollx( state->m_midground_layer, 0, state->m_scrollram16[2] ); - tilemap_set_scrolly( state->m_midground_layer, 0, state->m_scrollram16[3] ); - tilemap_set_scrollx( state->m_foreground_layer, 0, state->m_scrollram16[4] ); - tilemap_set_scrolly( state->m_foreground_layer, 0, state->m_scrollram16[5] ); - tilemap_set_scrollx( state->m_text_layer, 0, 0/*state->m_scrollram16[6]*/ ); - tilemap_set_scrolly( state->m_text_layer, 0, 0/*state->m_scrollram16[7]*/ ); + state->m_background_layer->set_scrollx(0, state->m_scrollram16[0] ); + state->m_background_layer->set_scrolly(0, state->m_scrollram16[1] ); + state->m_midground_layer->set_scrollx(0, state->m_scrollram16[2] ); + state->m_midground_layer->set_scrolly(0, state->m_scrollram16[3] ); + state->m_foreground_layer->set_scrollx(0, state->m_scrollram16[4] ); + state->m_foreground_layer->set_scrolly(0, state->m_scrollram16[5] ); + state->m_text_layer->set_scrollx(0, 0/*state->m_scrollram16[6]*/ ); + state->m_text_layer->set_scrolly(0, 0/*state->m_scrollram16[7]*/ ); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* wrong color? */ /* state->m_layer_disable is a guess based on 'stage 1' screen in heatbrl */ - if (!(state->m_layer_disable&0x0020)) tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0, 0); - if (!(state->m_layer_disable&0x0010)) tilemap_draw(bitmap,cliprect,state->m_midground_layer,0, 0); - if (!(state->m_layer_disable&0x0002)) tilemap_draw(bitmap,cliprect,state->m_background_layer,0, 1); - if (!(state->m_layer_disable&0x0001)) tilemap_draw(bitmap,cliprect,state->m_text_layer,0, 2); + if (!(state->m_layer_disable&0x0020)) state->m_foreground_layer->draw(bitmap, cliprect, 0, 0); + if (!(state->m_layer_disable&0x0010)) state->m_midground_layer->draw(bitmap, cliprect, 0, 0); + if (!(state->m_layer_disable&0x0002)) state->m_background_layer->draw(bitmap, cliprect, 0, 1); + if (!(state->m_layer_disable&0x0001)) state->m_text_layer->draw(bitmap, cliprect, 0, 2); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( godzilla ) +SCREEN_UPDATE_IND16( godzilla ) { - legionna_state *state = screen->machine().driver_data(); -// tilemap_set_scrollx( state->m_text_layer, 0, 0 ); -// tilemap_set_scrolly( state->m_text_layer, 0, 112 ); + legionna_state *state = screen.machine().driver_data(); +// state->m_text_layer->set_scrollx(0, 0 ); +// state->m_text_layer->set_scrolly(0, 112 ); /* Setup the tilemaps */ - tilemap_set_scrollx( state->m_background_layer, 0, state->m_scrollram16[0] ); - tilemap_set_scrolly( state->m_background_layer, 0, state->m_scrollram16[1] ); - tilemap_set_scrollx( state->m_midground_layer, 0, state->m_scrollram16[2] ); - tilemap_set_scrolly( state->m_midground_layer, 0, state->m_scrollram16[3] ); - tilemap_set_scrollx( state->m_foreground_layer, 0, state->m_scrollram16[4] ); - tilemap_set_scrolly( state->m_foreground_layer, 0, state->m_scrollram16[5] ); - tilemap_set_scrollx( state->m_text_layer, 0, 0/*state->m_scrollram16[6]*/ ); - tilemap_set_scrolly( state->m_text_layer, 0, 0/*state->m_scrollram16[7]*/ ); - - - bitmap_fill(bitmap,cliprect,0x0200); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - - if (!(state->m_layer_disable&0x0001)) tilemap_draw(bitmap,cliprect,state->m_background_layer,0,0); - if (!(state->m_layer_disable&0x0002)) tilemap_draw(bitmap,cliprect,state->m_midground_layer,0,0); - if (!(state->m_layer_disable&0x0004)) tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,1); - if (!(state->m_layer_disable&0x0008)) tilemap_draw(bitmap,cliprect,state->m_text_layer,0,2); + state->m_background_layer->set_scrollx(0, state->m_scrollram16[0] ); + state->m_background_layer->set_scrolly(0, state->m_scrollram16[1] ); + state->m_midground_layer->set_scrollx(0, state->m_scrollram16[2] ); + state->m_midground_layer->set_scrolly(0, state->m_scrollram16[3] ); + state->m_foreground_layer->set_scrollx(0, state->m_scrollram16[4] ); + state->m_foreground_layer->set_scrolly(0, state->m_scrollram16[5] ); + state->m_text_layer->set_scrollx(0, 0/*state->m_scrollram16[6]*/ ); + state->m_text_layer->set_scrolly(0, 0/*state->m_scrollram16[7]*/ ); + + + bitmap.fill(0x0200, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + + if (!(state->m_layer_disable&0x0001)) state->m_background_layer->draw(bitmap, cliprect, 0,0); + if (!(state->m_layer_disable&0x0002)) state->m_midground_layer->draw(bitmap, cliprect, 0,0); + if (!(state->m_layer_disable&0x0004)) state->m_foreground_layer->draw(bitmap, cliprect, 0,1); + if (!(state->m_layer_disable&0x0008)) state->m_text_layer->draw(bitmap, cliprect, 0,2); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( grainbow ) +SCREEN_UPDATE_IND16( grainbow ) { - legionna_state *state = screen->machine().driver_data(); + legionna_state *state = screen.machine().driver_data(); /* Setup the tilemaps */ - tilemap_set_scrollx( state->m_background_layer, 0, state->m_scrollram16[0] ); - tilemap_set_scrolly( state->m_background_layer, 0, state->m_scrollram16[1] ); - tilemap_set_scrollx( state->m_midground_layer, 0, state->m_scrollram16[2] ); - tilemap_set_scrolly( state->m_midground_layer, 0, state->m_scrollram16[3] ); - tilemap_set_scrollx( state->m_foreground_layer, 0, state->m_scrollram16[4] ); - tilemap_set_scrolly( state->m_foreground_layer, 0, state->m_scrollram16[5] ); - tilemap_set_scrollx( state->m_text_layer, 0, 0/*state->m_scrollram16[6]*/ ); - tilemap_set_scrolly( state->m_text_layer, 0, 0/*state->m_scrollram16[7]*/ ); + state->m_background_layer->set_scrollx(0, state->m_scrollram16[0] ); + state->m_background_layer->set_scrolly(0, state->m_scrollram16[1] ); + state->m_midground_layer->set_scrollx(0, state->m_scrollram16[2] ); + state->m_midground_layer->set_scrolly(0, state->m_scrollram16[3] ); + state->m_foreground_layer->set_scrollx(0, state->m_scrollram16[4] ); + state->m_foreground_layer->set_scrolly(0, state->m_scrollram16[5] ); + state->m_text_layer->set_scrollx(0, 0/*state->m_scrollram16[6]*/ ); + state->m_text_layer->set_scrolly(0, 0/*state->m_scrollram16[7]*/ ); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); if(!(state->m_layer_disable & 1)) - tilemap_draw(bitmap,cliprect,state->m_background_layer,0,1); + state->m_background_layer->draw(bitmap, cliprect, 0,1); if(!(state->m_layer_disable & 2)) - tilemap_draw(bitmap,cliprect,state->m_midground_layer,0,2); + state->m_midground_layer->draw(bitmap, cliprect, 0,2); if(!(state->m_layer_disable & 4)) - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,4); + state->m_foreground_layer->draw(bitmap, cliprect, 0,4); if(!(state->m_layer_disable & 8)) - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,8); + state->m_text_layer->draw(bitmap, cliprect, 0,8); - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/leland.c mame-0.145/src/mame/video/leland.c --- mame-0.144/src/mame/video/leland.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/leland.c 2012-02-06 21:30:31.000000000 +0000 @@ -388,24 +388,24 @@ * *************************************/ -static SCREEN_UPDATE( leland ) +static SCREEN_UPDATE_IND16( leland ) { - leland_state *state = screen->machine().driver_data(); + leland_state *state = screen.machine().driver_data(); int y; - const UINT8 *bg_prom = screen->machine().region("user1")->base(); - const UINT8 *bg_gfx = screen->machine().region("gfx1")->base(); - offs_t bg_gfx_bank_page_size = screen->machine().region("gfx1")->bytes() / 3; + const UINT8 *bg_prom = screen.machine().region("user1")->base(); + const UINT8 *bg_gfx = screen.machine().region("gfx1")->base(); + offs_t bg_gfx_bank_page_size = screen.machine().region("gfx1")->bytes() / 3; offs_t char_bank = (((state->m_gfxbank >> 4) & 0x03) * 0x2000) & (bg_gfx_bank_page_size - 1); offs_t prom_bank = ((state->m_gfxbank >> 3) & 0x01) * 0x2000; /* for each scanline in the visible region */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; UINT8 fg_data = 0; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); UINT8 *fg_src = &state->m_video_ram[y << 8]; /* for each pixel on the scanline */ @@ -457,22 +457,22 @@ * *************************************/ -static SCREEN_UPDATE( ataxx ) +static SCREEN_UPDATE_IND16( ataxx ) { - leland_state *state = screen->machine().driver_data(); + leland_state *state = screen.machine().driver_data(); int y; - const UINT8 *bg_gfx = screen->machine().region("gfx1")->base(); - offs_t bg_gfx_bank_page_size = screen->machine().region("gfx1")->bytes() / 6; + const UINT8 *bg_gfx = screen.machine().region("gfx1")->base(); + offs_t bg_gfx_bank_page_size = screen.machine().region("gfx1")->bytes() / 6; offs_t bg_gfx_offs_mask = bg_gfx_bank_page_size - 1; /* for each scanline in the visible region */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; UINT8 fg_data = 0; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); UINT8 *fg_src = &state->m_video_ram[y << 8]; /* for each pixel on the scanline */ @@ -531,16 +531,15 @@ MCFG_PALETTE_LENGTH(1024) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(40*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 0*8, 30*8-1) MCFG_SCREEN_REFRESH_RATE(60) - MCFG_SCREEN_UPDATE(leland) + MCFG_SCREEN_UPDATE_STATIC(leland) MACHINE_CONFIG_END MACHINE_CONFIG_DERIVED( ataxx_video, leland_video ) MCFG_VIDEO_START(ataxx) MCFG_SCREEN_MODIFY("screen") - MCFG_SCREEN_UPDATE(ataxx) + MCFG_SCREEN_UPDATE_STATIC(ataxx) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/lemmings.c mame-0.145/src/mame/video/lemmings.c --- mame-0.144/src/mame/video/lemmings.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lemmings.c 2012-02-06 21:30:31.000000000 +0000 @@ -14,61 +14,7 @@ #include "emu.h" #include "includes/lemmings.h" - -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16 *spritedata, int gfxbank, UINT16 pri ) -{ - int offs; - - for (offs = 0; offs < 0x400; offs += 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - - sprite = spritedata[offs + 1] & 0x3fff; - - if ((spritedata[offs + 2] & 0x2000) != pri) - continue; - - y = spritedata[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = spritedata[offs + 2]; - colour = (x >>9) & 0xf; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - - if (x > 320 || x < -16) continue; - - sprite &= ~multi; - if (fy) - inc = 1; - else - { - sprite += multi; - inc = -1; - } - mult = -16; - - while (multi >= 0) - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[gfxbank], - sprite - multi * inc, - colour, - fx,fy, - x,y + mult * multi,0); - - multi--; - } - } -} +#include "video/decospr.h" /******************************************************************************/ @@ -87,36 +33,45 @@ VIDEO_START( lemmings ) { lemmings_state *state = machine.driver_data(); - state->m_bitmap0 = auto_bitmap_alloc(machine, 2048, 256, machine.primary_screen->format()); + state->m_bitmap0 = auto_bitmap_ind16_alloc(machine, 2048, 256); state->m_vram_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_cols, 8, 8, 64, 32); state->m_vram_buffer = auto_alloc_array(machine, UINT8, 2048 * 64); /* 64 bytes per VRAM character */ state->m_sprite_triple_buffer_0 = auto_alloc_array(machine, UINT16, 0x800 / 2); state->m_sprite_triple_buffer_1 = auto_alloc_array(machine, UINT16, 0x800 / 2); - tilemap_set_transparent_pen(state->m_vram_tilemap, 0); - bitmap_fill(state->m_bitmap0, 0, 0x100); + state->m_vram_tilemap->set_transparent_pen(0); + state->m_bitmap0->fill(0x100); gfx_element_set_source(machine.gfx[2], state->m_vram_buffer); + machine.device("spritegen")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); + state->save_item(NAME(*state->m_bitmap0)); state->save_pointer(NAME(state->m_vram_buffer), 2048 * 64); state->save_pointer(NAME(state->m_sprite_triple_buffer_0), 0x800 / 2); state->save_pointer(NAME(state->m_sprite_triple_buffer_1), 0x800 / 2); } -SCREEN_EOF( lemmings ) +SCREEN_VBLANK( lemmings ) { - lemmings_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + lemmings_state *state = screen.machine().driver_data(); - memcpy(state->m_sprite_triple_buffer_0, machine.generic.buffered_spriteram.u16, 0x800); - memcpy(state->m_sprite_triple_buffer_1, machine.generic.buffered_spriteram2.u16, 0x800); + memcpy(state->m_sprite_triple_buffer_0, screen.machine().generic.buffered_spriteram.u16, 0x800); + memcpy(state->m_sprite_triple_buffer_1, screen.machine().generic.buffered_spriteram2.u16, 0x800); + } } /******************************************************************************/ +// RAM based WRITE16_HANDLER( lemmings_pixel_0_w ) { + lemmings_state *state = space->machine().driver_data(); int sx, sy, src, old; @@ -132,20 +87,18 @@ if (sx > 2047 || sy > 255) return; - *BITMAP_ADDR16(state->m_bitmap0, sy, sx + 0) = ((src >> 8) & 0xf) | 0x100; - *BITMAP_ADDR16(state->m_bitmap0, sy, sx + 1) = ((src >> 0) & 0xf) | 0x100; + state->m_bitmap0->pix16(sy, sx + 0) = ((src >> 8) & 0xf) | 0x100; + state->m_bitmap0->pix16(sy, sx + 1) = ((src >> 0) & 0xf) | 0x100; } +// RAM based tiles for the FG tilemap WRITE16_HANDLER( lemmings_pixel_1_w ) { lemmings_state *state = space->machine().driver_data(); - int sx, sy, src, /*old,*/ tile; + int sx, sy, src, tile; -// old = state->m_pixel_1_data[offset]; COMBINE_DATA(&state->m_pixel_1_data[offset]); src = state->m_pixel_1_data[offset]; -// if (old == src) -// return; sy = ((offset << 1) / 0x200); sx = ((offset << 1) & 0x1ff); @@ -163,37 +116,64 @@ { lemmings_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_data[offset]); - tilemap_mark_tile_dirty(state->m_vram_tilemap, offset); + state->m_vram_tilemap->mark_tile_dirty(offset); +} + + +void lemmings_copy_bitmap(running_machine &machine, bitmap_rgb32& bitmap, bitmap_ind16& srcbitmap, int* xscroll, int* yscroll, const rectangle& cliprect) +{ + int y,x; + const pen_t *paldata = machine.pens; + + for (y=cliprect.min_y; ymachine().driver_data(); + lemmings_state *state = screen.machine().driver_data(); int x1 = -state->m_control_data[0]; int x0 = -state->m_control_data[2]; int y = 0; rectangle rect; - rect.max_y = cliprect->max_y; - rect.min_y = cliprect->min_y; + rect.max_y = cliprect.max_y; + rect.min_y = cliprect.min_y; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_sprite_triple_buffer_1, 1, 0x0000); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_sprite_triple_buffer_1, 0x400, true); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, state->m_sprite_triple_buffer_0, 0x400, true); + + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x300, 0xff); /* Pixel layer can be windowed in hardware (two player mode) */ if ((state->m_control_data[6] & 2) == 0) - copyscrollbitmap_trans(bitmap, state->m_bitmap0, 1, &x1, 1, &y, cliprect, 0x100); + { + lemmings_copy_bitmap(screen.machine(), bitmap, *state->m_bitmap0, &x1, &y, cliprect); + } else { rect.max_x = 159; rect.min_x = 0; - copyscrollbitmap_trans(bitmap, state->m_bitmap0, 1, &x0, 1, &y, &rect, 0x100); + lemmings_copy_bitmap(screen.machine(), bitmap, *state->m_bitmap0, &x0, &y, rect); + rect.max_x = 319; rect.min_x = 160; - copyscrollbitmap_trans(bitmap, state->m_bitmap0, 1, &x1, 1, &y, &rect, 0x100); + lemmings_copy_bitmap(screen.machine(), bitmap, *state->m_bitmap0, &x1, &y, rect); } - draw_sprites(screen->machine(), bitmap, cliprect, state->m_sprite_triple_buffer_0, 0, 0x0000); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_sprite_triple_buffer_1, 1, 0x2000); - tilemap_draw(bitmap, cliprect, state->m_vram_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_sprite_triple_buffer_0, 0, 0x2000); + + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0800, 0x0800, 0x200, 0xff); + screen.machine().device("spritegen")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x300, 0xff); + state->m_vram_tilemap->draw(bitmap, cliprect, 0, 0); + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0800, 0x200, 0xff); return 0; } diff -Nru mame-0.144/src/mame/video/lethal.c mame-0.145/src/mame/video/lethal.c --- mame-0.144/src/mame/video/lethal.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/lethal.c 2012-02-06 21:30:32.000000000 +0000 @@ -102,12 +102,12 @@ } } -SCREEN_UPDATE(lethalen) +SCREEN_UPDATE_IND16(lethalen) { - lethal_state *state = screen->machine().driver_data(); + lethal_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 7168); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(7168, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, 3, K056832_DRAW_FLAG_MIRROR, 1); k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, 2, K056832_DRAW_FLAG_MIRROR, 2); diff -Nru mame-0.144/src/mame/video/lethalj.c mame-0.145/src/mame/video/lethalj.c --- mame-0.144/src/mame/video/lethalj.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lethalj.c 2012-02-06 21:30:31.000000000 +0000 @@ -24,8 +24,8 @@ { static const char *const gunnames[] = { "LIGHT0_X", "LIGHT0_Y", "LIGHT1_X", "LIGHT1_Y" }; const rectangle &visarea = machine.primary_screen->visible_area(); - int width = visarea.max_x + 1 - visarea.min_x; - int height = visarea.max_y + 1 - visarea.min_y; + int width = visarea.width(); + int height = visarea.height(); *x = ((input_port_read_safe(machine, gunnames[player * 2], 0x00) & 0xff) * width) / 255; *y = ((input_port_read_safe(machine, gunnames[1 + player * 2], 0x00) & 0xff) * height) / 255; @@ -171,11 +171,11 @@ * *************************************/ -void lethalj_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void lethalj_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { lethalj_state *state = screen.machine().driver_data(); UINT16 *src = &state->m_screenram[(state->m_vispage << 17) | ((params->rowaddr << 9) & 0x3fe00)]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = params->coladdr << 1; int x; diff -Nru mame-0.144/src/mame/video/liberate.c mame-0.145/src/mame/video/liberate.c --- mame-0.144/src/mame/video/liberate.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/liberate.c 2012-02-06 21:30:31.000000000 +0000 @@ -14,7 +14,7 @@ #include "includes/liberate.h" #if 0 -void debug_print(bitmap_t *bitmap) +void debug_print(bitmap_ind16 &bitmap) { int i, j; char buf[20 * 16]; @@ -107,7 +107,7 @@ liberate_state *state = space->machine().driver_data(); state->m_io_ram[offset] = data; if (offset > 1 && offset < 6) - tilemap_mark_all_tiles_dirty(state->m_back_tilemap); + state->m_back_tilemap->mark_all_dirty(); switch (offset) { @@ -115,7 +115,7 @@ if (((data >> 4) & 3) != state->m_background_color) { state->m_background_color = (data >> 4) & 3; - tilemap_mark_all_tiles_dirty(state->m_back_tilemap); + state->m_back_tilemap->mark_all_dirty(); } state->m_background_disable = data & 0x4; flip_screen_set(space->machine(), data & 0x01); @@ -138,7 +138,7 @@ liberate_state *state = space->machine().driver_data(); state->m_io_ram[offset] = data; if (offset > 1 && offset < 6) - tilemap_mark_all_tiles_dirty(state->m_back_tilemap); + state->m_back_tilemap->mark_all_dirty(); // popmessage("%02x %02x",state->m_io_ram[6],state->m_io_ram[7]); @@ -173,7 +173,7 @@ case 0: //background_disable = ~data & 0x80; flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty(state->m_back_tilemap); + state->m_back_tilemap->mark_all_dirty(); break; case 2: /* Sound */ soundlatch_w(space, 0, data); @@ -189,21 +189,21 @@ { liberate_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( liberate_colorram_w ) { liberate_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fix_tilemap, offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( prosport_bg_vram_w ) { liberate_state *state = space->machine().driver_data(); state->m_bg_vram[offset] = data; - tilemap_mark_tile_dirty(state->m_back_tilemap, offset); + state->m_back_tilemap->mark_tile_dirty(offset); } /***************************************************************************/ @@ -214,7 +214,7 @@ state->m_back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); state->m_charram = auto_alloc_array(machine, UINT8, 0x1800 * 2); } @@ -225,8 +225,8 @@ state->m_back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32); - tilemap_set_transmask(state->m_back_tilemap, 0, 0x0001, 0x007e); /* Bottom 1 pen/Top 7 pens */ - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_back_tilemap->set_transmask(0, 0x0001, 0x007e); /* Bottom 1 pen/Top 7 pens */ + state->m_fix_tilemap->set_transparent_pen(0); } VIDEO_START( liberate ) @@ -235,7 +235,7 @@ state->m_back_tilemap = tilemap_create(machine, get_back_tile_info, back_scan, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); } VIDEO_START( prosport ) @@ -244,7 +244,7 @@ state->m_back_tilemap = tilemap_create(machine, prosport_get_back_tile_info, back_scan, 16, 16, 32, 32); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info, fix_scan, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fix_tilemap, 0); + state->m_fix_tilemap->set_transparent_pen(0); } /***************************************************************************/ @@ -290,7 +290,7 @@ /***************************************************************************/ -static void liberate_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void liberate_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { liberate_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -359,7 +359,7 @@ } } -static void prosport_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void prosport_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { liberate_state *state = machine.driver_data(); int offs, multi, fx, fy, sx, sy, sy2, code, code2, color, gfx_region; @@ -424,7 +424,7 @@ } } -static void boomrang_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void boomrang_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { liberate_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -485,7 +485,7 @@ } } -static void prosoccr_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void prosoccr_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { liberate_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -512,42 +512,42 @@ /***************************************************************************/ -SCREEN_UPDATE( prosoccr ) +SCREEN_UPDATE_IND16( prosoccr ) { - liberate_state *state = screen->machine().driver_data(); - tilemap_set_scrolly(state->m_back_tilemap, 0, state->m_io_ram[1]); - tilemap_set_scrollx(state->m_back_tilemap, 0, -state->m_io_ram[0]); + liberate_state *state = screen.machine().driver_data(); + state->m_back_tilemap->set_scrolly(0, state->m_io_ram[1]); + state->m_back_tilemap->set_scrollx(0, -state->m_io_ram[0]); if (state->m_background_disable) - bitmap_fill(bitmap, cliprect, 32); + bitmap.fill(32, cliprect); else - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, 0, 0); + state->m_back_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); - prosoccr_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); + prosoccr_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( prosport ) +SCREEN_UPDATE_IND16( prosport ) { - liberate_state *state = screen->machine().driver_data(); + liberate_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT8 *colorram = state->m_colorram; int mx, my, tile, offs, gfx_region; int scrollx, scrolly; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); offs = 0; /* TODO: what's bits 0 and 2 for? Internal scrolling state? */ scrolly = ((state->m_io_ram[0] & 0x8) << 5); scrollx = ((state->m_io_ram[0] & 0x2) << 7) | (state->m_io_ram[1]); - tilemap_set_scrolly(state->m_back_tilemap, 0, scrolly); - tilemap_set_scrollx(state->m_back_tilemap, 0, -scrollx); + state->m_back_tilemap->set_scrolly(0, scrolly); + state->m_back_tilemap->set_scrollx(0, -scrollx); - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, 0, 0); + state->m_back_tilemap->draw(bitmap, cliprect, 0, 0); // popmessage("%d %02x %02x %02x %02x %02x %02x %02x %02x",scrollx,deco16_io_ram[0],deco16_io_ram[1],deco16_io_ram[2],deco16_io_ram[3] // ,deco16_io_ram[4],deco16_io_ram[5],deco16_io_ram[6],deco16_io_ram[7]); @@ -564,47 +564,47 @@ my = (offs) % 32; mx = (offs) / 32; - drawgfx_transpen(bitmap, cliprect,screen->machine().gfx[gfx_region], + drawgfx_transpen(bitmap, cliprect,screen.machine().gfx[gfx_region], tile, 1, 0, 0, 248 - 8 * mx, 8 * my, 0); } - prosport_draw_sprites(screen->machine(), bitmap, cliprect); + prosport_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( boomrang ) +SCREEN_UPDATE_IND16( boomrang ) { - liberate_state *state = screen->machine().driver_data(); - tilemap_set_scrolly(state->m_back_tilemap, 0, state->m_io_ram[1]); - tilemap_set_scrollx(state->m_back_tilemap, 0, -state->m_io_ram[0]); + liberate_state *state = screen.machine().driver_data(); + state->m_back_tilemap->set_scrolly(0, state->m_io_ram[1]); + state->m_back_tilemap->set_scrollx(0, -state->m_io_ram[0]); if (state->m_background_disable) - bitmap_fill(bitmap, cliprect, 32); + bitmap.fill(32, cliprect); else - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, TILEMAP_DRAW_LAYER1, 0); + state->m_back_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); - boomrang_draw_sprites(screen->machine(),bitmap,cliprect,8); + boomrang_draw_sprites(screen.machine(),bitmap,cliprect,8); if (!state->m_background_disable) - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, TILEMAP_DRAW_LAYER0, 0); + state->m_back_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); - boomrang_draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + boomrang_draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( liberate ) +SCREEN_UPDATE_IND16( liberate ) { - liberate_state *state = screen->machine().driver_data(); - tilemap_set_scrolly(state->m_back_tilemap, 0, state->m_io_ram[1]); - tilemap_set_scrollx(state->m_back_tilemap, 0, -state->m_io_ram[0]); + liberate_state *state = screen.machine().driver_data(); + state->m_back_tilemap->set_scrolly(0, state->m_io_ram[1]); + state->m_back_tilemap->set_scrollx(0, -state->m_io_ram[0]); if (state->m_background_disable) - bitmap_fill(bitmap, cliprect, 32); + bitmap.fill(32, cliprect); else - tilemap_draw(bitmap, cliprect, state->m_back_tilemap, 0, 0); + state->m_back_tilemap->draw(bitmap, cliprect, 0, 0); - liberate_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fix_tilemap, 0, 0); + liberate_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fix_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/liberatr.c mame-0.145/src/mame/video/liberatr.c --- mame-0.144/src/mame/video/liberatr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/liberatr.c 2012-02-06 21:30:31.000000000 +0000 @@ -243,7 +243,7 @@ } -void liberatr_state::draw_planet(bitmap_t &bitmap, pen_t *pens) +void liberatr_state::draw_planet(bitmap_rgb32 &bitmap, pen_t *pens) { UINT8 latitude; @@ -273,13 +273,13 @@ color = base_color; for (i = 0; i < segment_length; i++, x++) - *BITMAP_ADDR32(&bitmap, y, x) = pens[color]; + bitmap.pix32(y, x) = pens[color]; } } } -void liberatr_state::draw_bitmap(bitmap_t &bitmap, pen_t *pens) +void liberatr_state::draw_bitmap(bitmap_rgb32 &bitmap, pen_t *pens) { offs_t offs; @@ -291,19 +291,19 @@ UINT8 x = offs & 0xff; if (data) - *BITMAP_ADDR32(&bitmap, y, x) = pens[(data >> 5) | 0x10]; + bitmap.pix32(y, x) = pens[(data >> 5) | 0x10]; } } -bool liberatr_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) +UINT32 liberatr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { pen_t pens[NUM_PENS]; get_pens(pens); - bitmap_fill(&bitmap, &cliprect, RGB_BLACK); + bitmap.fill(RGB_BLACK, cliprect); draw_planet(bitmap, pens); draw_bitmap(bitmap, pens); - return false; + return 0; } diff -Nru mame-0.144/src/mame/video/lkage.c mame-0.145/src/mame/video/lkage.c --- mame-0.144/src/mame/video/lkage.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/lkage.c 2012-02-06 21:30:31.000000000 +0000 @@ -50,15 +50,15 @@ switch (offset / 0x400) { case 0: - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); break; case 1: - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); break; case 2: - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); break; default: @@ -95,16 +95,16 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, -5, -5 + 24); - tilemap_set_scrolldx(state->m_fg_tilemap, -3, -3 + 24); - tilemap_set_scrolldx(state->m_tx_tilemap, -1, -1 + 24); + state->m_bg_tilemap->set_scrolldx(-5, -5 + 24); + state->m_fg_tilemap->set_scrolldx(-3, -3 + 24); + state->m_tx_tilemap->set_scrolldx(-1, -1 + 24); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lkage_state *state = machine.driver_data(); const UINT8 *source = state->m_spriteram; @@ -172,60 +172,60 @@ } } -SCREEN_UPDATE( lkage ) +SCREEN_UPDATE_IND16( lkage ) { - lkage_state *state = screen->machine().driver_data(); + lkage_state *state = screen.machine().driver_data(); int bank; - flip_screen_x_set(screen->machine(), ~state->m_vreg[2] & 0x01); - flip_screen_y_set(screen->machine(), ~state->m_vreg[2] & 0x02); + flip_screen_x_set(screen.machine(), ~state->m_vreg[2] & 0x01); + flip_screen_y_set(screen.machine(), ~state->m_vreg[2] & 0x02); bank = state->m_vreg[1] & 0x08; if (state->m_bg_tile_bank != bank) { state->m_bg_tile_bank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } bank = state->m_vreg[0]&0x04; if (state->m_fg_tile_bank != bank) { state->m_fg_tile_bank = bank; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } bank = state->m_vreg[0]&0x02; if (state->m_tx_tile_bank != bank) { state->m_tx_tile_bank = bank; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } - tilemap_set_palette_offset(state->m_bg_tilemap, 0x300 + (state->m_vreg[1] & 0xf0)); - tilemap_set_palette_offset(state->m_fg_tilemap, 0x200 + (state->m_vreg[1] & 0xf0)); - tilemap_set_palette_offset(state->m_tx_tilemap, 0x110); + state->m_bg_tilemap->set_palette_offset(0x300 + (state->m_vreg[1] & 0xf0)); + state->m_fg_tilemap->set_palette_offset(0x200 + (state->m_vreg[1] & 0xf0)); + state->m_tx_tilemap->set_palette_offset(0x110); - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_scroll[0]); - tilemap_set_scrolly(state->m_tx_tilemap, 0, state->m_scroll[1]); + state->m_tx_tilemap->set_scrollx(0, state->m_scroll[0]); + state->m_tx_tilemap->set_scrolly(0, state->m_scroll[1]); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll[2]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_scroll[3]); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll[2]); + state->m_fg_tilemap->set_scrolly(0, state->m_scroll[3]); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll[4]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll[5]); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll[4]); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll[5]); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if ((state->m_vreg[2] & 0xf0) == 0xf0) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, (state->m_vreg[1] & 2) ? 2 : 4); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, (state->m_vreg[1] & 2) ? 2 : 4); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); + draw_sprites(screen.machine(), bitmap, cliprect); } else { - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, TILEMAP_DRAW_OPAQUE, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); } return 0; diff -Nru mame-0.144/src/mame/video/lockon.c mame-0.145/src/mame/video/lockon.c --- mame-0.144/src/mame/video/lockon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lockon.c 2012-02-06 21:30:32.000000000 +0000 @@ -136,7 +136,7 @@ { lockon_state *state = space->machine().driver_data(); state->m_char_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_lockon_tile_info ) @@ -213,7 +213,7 @@ d2 = *(gfx3 + tileidx); } - bmpaddr = BITMAP_ADDR16(state->m_back_buffer, y, 0); + bmpaddr = &state->m_back_buffer->pix16(y); for (x = 0; x < FRAMEBUFFER_MAX_X; ++x) { @@ -324,7 +324,7 @@ /* TODO: Clean up and emulate CS of GFX ROMs? */ for (y = 0; y < FRAMEBUFFER_MAX_Y; ++y) { - UINT16 *bmpaddr = BITMAP_ADDR16(state->m_back_buffer, y, 0); + UINT16 *bmpaddr = &state->m_back_buffer->pix16(y); UINT8 ls163; UINT32 clut_addr; UINT32 gfx_addr; @@ -491,7 +491,7 @@ UINT32 tile; UINT8 cnt; UINT32 yidx; - UINT16 *line = BITMAP_ADDR16(state->m_back_buffer, y, 0); + UINT16 *line = &state->m_back_buffer->pix16(y); UINT32 px = xpos; /* Outside the limits? */ @@ -698,7 +698,7 @@ if (carry) --CNT; \ } while(0) -static void rotate_draw( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void rotate_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lockon_state *state = machine.driver_data(); UINT32 y; @@ -722,10 +722,10 @@ UINT32 axy_en = !BIT(state->m_dx0ll, 8); UINT32 ayy_en = !BIT(state->m_dy0ll, 8); - for (y = 0; y <= cliprect->max_y; ++y) + for (y = 0; y <= cliprect.max_y; ++y) { UINT32 carry; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); UINT32 x; UINT32 cx = cxy; @@ -734,12 +734,12 @@ UINT8 axx = axy; UINT8 ayx = ayy; - for (x = 0; x <= cliprect->max_x; ++x) + for (x = 0; x <= cliprect.max_x; ++x) { cx &= 0x1ff; cy &= 0x1ff; - *dst++ = *BITMAP_ADDR16(state->m_front_buffer, cy, cx); + *dst++ = state->m_front_buffer->pix16(cy, cx); if (axx_en) INCREMENT(axx, cx); @@ -803,7 +803,7 @@ *******************************************************************************************/ -static void hud_draw( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void hud_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lockon_state *state = machine.driver_data(); UINT8 *tile_rom = machine.region("gfx3")->base(); @@ -844,7 +844,7 @@ else y_size = 8; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT32 xt; UINT32 cy; @@ -883,9 +883,9 @@ { UINT32 x = x_pos + (xt << 3) + px; - if (x <= cliprect->max_x) + if (x <= cliprect.max_x) { - UINT16 *dst = BITMAP_ADDR16(bitmap, y, x); + UINT16 *dst = &bitmap.pix16(y, x); if (BIT(gfx_strip, px ^ 7) && *dst > 255) *dst = colour; @@ -908,11 +908,11 @@ lockon_state *state = machine.driver_data(); state->m_tilemap = tilemap_create(machine, get_lockon_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tilemap, 0); + state->m_tilemap->set_transparent_pen(0); /* Allocate the two frame buffers for rotation */ - state->m_back_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); - state->m_front_buffer = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); + state->m_back_buffer = auto_bitmap_ind16_alloc(machine, 512, 512); + state->m_front_buffer = auto_bitmap_ind16_alloc(machine, 512, 512); /* 2kB of object ASIC palette RAM */ state->m_obj_pal_ram = auto_alloc_array(machine, UINT8, 2048); @@ -929,40 +929,44 @@ state->save_pointer(NAME(state->m_obj_pal_ram), 2048); } -SCREEN_UPDATE( lockon ) +SCREEN_UPDATE_IND16( lockon ) { - lockon_state *state = screen->machine().driver_data(); + lockon_state *state = screen.machine().driver_data(); /* If screen output is disabled, fill with black */ if (!BIT(state->m_ctrl_reg, 7)) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* Scan out the frame buffer in rotated order */ - rotate_draw(screen->machine(), bitmap, cliprect); + rotate_draw(screen.machine(), bitmap, cliprect); /* Draw the character tilemap */ - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); /* Draw the HUD */ - hud_draw(screen->machine(), bitmap, cliprect); + hud_draw(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( lockon ) +SCREEN_VBLANK( lockon ) { - lockon_state *state = machine.driver_data(); + // on falling edge + if (!vblank_on) + { + lockon_state *state = screen.machine().driver_data(); - /* Swap the frame buffers */ - bitmap_t *tmp = state->m_front_buffer; - state->m_front_buffer = state->m_back_buffer; - state->m_back_buffer = tmp; - - /* Draw the frame buffer layers */ - scene_draw(machine); - ground_draw(machine); - objects_draw(machine); + /* Swap the frame buffers */ + bitmap_ind16 *tmp = state->m_front_buffer; + state->m_front_buffer = state->m_back_buffer; + state->m_back_buffer = tmp; + + /* Draw the frame buffer layers */ + scene_draw(screen.machine()); + ground_draw(screen.machine()); + objects_draw(screen.machine()); + } } diff -Nru mame-0.144/src/mame/video/lordgun.c mame-0.145/src/mame/video/lordgun.c --- mame-0.144/src/mame/video/lordgun.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lordgun.c 2012-02-06 21:30:33.000000000 +0000 @@ -61,7 +61,7 @@ ***************************************************************************/ -INLINE void get_tile_info(running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, int _N_) +INLINE void get_tile_info(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, int _N_) { lordgun_state *state = machine.driver_data(); UINT16 attr = state->m_vram[_N_][tile_index * 2 + 0 ]; @@ -79,7 +79,7 @@ { lordgun_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram[_N_][offset]); - tilemap_mark_tile_dirty(state->m_tilemap[_N_], offset/2); + state->m_tilemap[_N_]->mark_tile_dirty(offset/2); } WRITE16_HANDLER( lordgun_vram_0_w ) { lordgun_vram_w(space, offset, data, mem_mask, 0); } @@ -117,26 +117,26 @@ state->m_tilemap[3] = tilemap_create( machine, get_tile_info_3, tilemap_scan_rows, 8,8, 0x40,0x20 ); - tilemap_set_scroll_rows(state->m_tilemap[0],1); - tilemap_set_scroll_cols(state->m_tilemap[0],1); - tilemap_set_transparent_pen(state->m_tilemap[0],0x3f); + state->m_tilemap[0]->set_scroll_rows(1); + state->m_tilemap[0]->set_scroll_cols(1); + state->m_tilemap[0]->set_transparent_pen(0x3f); // Has line scroll - tilemap_set_scroll_rows(state->m_tilemap[1],0x200); - tilemap_set_scroll_cols(state->m_tilemap[1],1); - tilemap_set_transparent_pen(state->m_tilemap[1],0x3f); - - tilemap_set_scroll_rows(state->m_tilemap[2],1); - tilemap_set_scroll_cols(state->m_tilemap[2],1); - tilemap_set_transparent_pen(state->m_tilemap[2],0x3f); - - tilemap_set_scroll_rows(state->m_tilemap[3],1); - tilemap_set_scroll_cols(state->m_tilemap[3],1); - tilemap_set_transparent_pen(state->m_tilemap[3],0x3f); + state->m_tilemap[1]->set_scroll_rows(0x200); + state->m_tilemap[1]->set_scroll_cols(1); + state->m_tilemap[1]->set_transparent_pen(0x3f); + + state->m_tilemap[2]->set_scroll_rows(1); + state->m_tilemap[2]->set_scroll_cols(1); + state->m_tilemap[2]->set_transparent_pen(0x3f); + + state->m_tilemap[3]->set_scroll_rows(1); + state->m_tilemap[3]->set_scroll_cols(1); + state->m_tilemap[3]->set_transparent_pen(0x3f); // Buffer bitmaps for 4 tilemaps (0-3) + sprites (4) for (i = 0; i < 5; i++) - state->m_bitmaps[i] = auto_bitmap_alloc(machine, w, h, BITMAP_FORMAT_INDEXED16); + state->m_bitmaps[i] = auto_bitmap_ind16_alloc(machine, w, h); } /*************************************************************************** @@ -211,10 +211,7 @@ lorddgun_calc_gun_scr(machine, i); - if ( (state->m_gun[i].scr_x < visarea.min_x) || - (state->m_gun[i].scr_x > visarea.max_x) || - (state->m_gun[i].scr_y < visarea.min_y) || - (state->m_gun[i].scr_y > visarea.max_y) ) + if (!visarea.contains(state->m_gun[i].scr_x, state->m_gun[i].scr_y)) state->m_gun[i].hw_x = state->m_gun[i].hw_y = 0; } @@ -243,7 +240,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { lordgun_state *state = machine.driver_data(); UINT16 *s = state->m_spriteram; @@ -325,28 +322,28 @@ ***************************************************************************/ -SCREEN_UPDATE( lordgun ) +SCREEN_UPDATE_IND16( lordgun ) { - lordgun_state *state = screen->machine().driver_data(); + lordgun_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed(KEYCODE_Z)) + if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_R)) msk |= 8; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 16; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_R)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 16; if (msk != 0) layers_ctrl &= msk; } #endif if (state->m_whitescreen) { - bitmap_fill(bitmap, cliprect, get_white_pen(screen->machine())); + bitmap.fill(get_white_pen(screen.machine()), cliprect); return 0; } @@ -354,18 +351,18 @@ int x, y; - tilemap_set_scrollx( state->m_tilemap[0], 0, *state->m_scroll_x[0] ); - tilemap_set_scrolly( state->m_tilemap[0], 0, *state->m_scroll_y[0] ); + state->m_tilemap[0]->set_scrollx(0, *state->m_scroll_x[0] ); + state->m_tilemap[0]->set_scrolly(0, *state->m_scroll_y[0] ); for (y = 0; y < 0x200; y++) - tilemap_set_scrollx( state->m_tilemap[1], y, (*state->m_scroll_x[1]) + state->m_scrollram[y * 4/2 + 2/2]); - tilemap_set_scrolly( state->m_tilemap[1], 0, *state->m_scroll_y[1] ); + state->m_tilemap[1]->set_scrollx(y, (*state->m_scroll_x[1]) + state->m_scrollram[y * 4/2 + 2/2]); + state->m_tilemap[1]->set_scrolly(0, *state->m_scroll_y[1] ); - tilemap_set_scrollx( state->m_tilemap[2], 0, *state->m_scroll_x[2] ); - tilemap_set_scrolly( state->m_tilemap[2], 0, *state->m_scroll_y[2] ); + state->m_tilemap[2]->set_scrollx(0, *state->m_scroll_x[2] ); + state->m_tilemap[2]->set_scrolly(0, *state->m_scroll_y[2] ); - tilemap_set_scrollx( state->m_tilemap[3], 0, *state->m_scroll_x[3] ); - tilemap_set_scrolly( state->m_tilemap[3], 0, *state->m_scroll_y[3] ); + state->m_tilemap[3]->set_scrollx(0, *state->m_scroll_x[3] ); + state->m_tilemap[3]->set_scrolly(0, *state->m_scroll_y[3] ); // Rendering: @@ -376,13 +373,13 @@ int l; for (l = 0; l < 5; l++) - bitmap_fill(state->m_bitmaps[l], cliprect, trans_pen); + state->m_bitmaps[l]->fill(trans_pen, cliprect); - if (layers_ctrl & 1) tilemap_draw(state->m_bitmaps[0], cliprect, state->m_tilemap[0], 0, 0); - if (layers_ctrl & 2) tilemap_draw(state->m_bitmaps[1], cliprect, state->m_tilemap[1], 0, 0); - if (layers_ctrl & 4) tilemap_draw(state->m_bitmaps[2], cliprect, state->m_tilemap[2], 0, 0); - if (layers_ctrl & 8) tilemap_draw(state->m_bitmaps[3], cliprect, state->m_tilemap[3], 0, 0); - if (layers_ctrl & 16) draw_sprites(screen->machine(), state->m_bitmaps[4], cliprect); + if (layers_ctrl & 1) state->m_tilemap[0]->draw(*state->m_bitmaps[0], cliprect, 0, 0); + if (layers_ctrl & 2) state->m_tilemap[1]->draw(*state->m_bitmaps[1], cliprect, 0, 0); + if (layers_ctrl & 4) state->m_tilemap[2]->draw(*state->m_bitmaps[2], cliprect, 0, 0); + if (layers_ctrl & 8) state->m_tilemap[3]->draw(*state->m_bitmaps[3], cliprect, 0, 0); + if (layers_ctrl & 16) draw_sprites(screen.machine(), *state->m_bitmaps[4], cliprect); // copy to screen bitmap @@ -391,9 +388,9 @@ // layer index (0-3, 4 for sprites) -> priority address bit const int layer2bit[5] = {0,1,2,4,3}; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pens[5]; @@ -402,7 +399,7 @@ // bits 0-4: layer transparency for (l = 0; l < 5; l++) { - pens[l] = *BITMAP_ADDR16(state->m_bitmaps[l], y, x); + pens[l] = state->m_bitmaps[l]->pix16(y, x); if (pens[l] == trans_pen) pri_addr |= 1 << layer2bit[l]; } @@ -420,7 +417,7 @@ l = pri2layer[state->m_priority_ram[pri_addr] & 7]; - *BITMAP_ADDR16(bitmap, y, x) = pens[l]; + bitmap.pix16(y, x) = pens[l]; } } diff -Nru mame-0.144/src/mame/video/lsasquad.c mame-0.145/src/mame/video/lsasquad.c --- mame-0.144/src/mame/video/lsasquad.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lsasquad.c 2012-02-06 21:30:31.000000000 +0000 @@ -1,7 +1,7 @@ #include "emu.h" #include "includes/lsasquad.h" -static void draw_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *scrollram ) +static void draw_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *scrollram ) { lsasquad_state *state = machine.driver_data(); int offs, scrollx, scrolly; @@ -48,7 +48,7 @@ } } -static int draw_layer_daikaiju( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int offs, int * previd, int type ) +static int draw_layer_daikaiju( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int * previd, int type ) { lsasquad_state *state = machine.driver_data(); int id, scrollx, scrolly, initoffs, globalscrollx; @@ -138,7 +138,7 @@ return offs; } -static void drawbg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int type ) +static void drawbg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int type ) { lsasquad_state *state = machine.driver_data(); int i = 0; @@ -158,7 +158,7 @@ } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lsasquad_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -198,24 +198,24 @@ } } -SCREEN_UPDATE( lsasquad ) +SCREEN_UPDATE_IND16( lsasquad ) { - lsasquad_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 511); + lsasquad_state *state = screen.machine().driver_data(); + bitmap.fill(511, cliprect); - draw_layer(screen->machine(), bitmap, cliprect, state->m_scrollram + 0x000); - draw_layer(screen->machine(), bitmap, cliprect, state->m_scrollram + 0x080); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_layer(screen->machine(), bitmap, cliprect, state->m_scrollram + 0x100); + draw_layer(screen.machine(), bitmap, cliprect, state->m_scrollram + 0x000); + draw_layer(screen.machine(), bitmap, cliprect, state->m_scrollram + 0x080); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_layer(screen.machine(), bitmap, cliprect, state->m_scrollram + 0x100); return 0; } -SCREEN_UPDATE( daikaiju ) +SCREEN_UPDATE_IND16( daikaiju ) { - bitmap_fill(bitmap, cliprect, 511); - drawbg(screen->machine(), bitmap, cliprect, 0); // bottom - draw_sprites(screen->machine(), bitmap, cliprect); - drawbg(screen->machine(), bitmap, cliprect, 1); // top = pallete $d ? + bitmap.fill(511, cliprect); + drawbg(screen.machine(), bitmap, cliprect, 0); // bottom + draw_sprites(screen.machine(), bitmap, cliprect); + drawbg(screen.machine(), bitmap, cliprect, 1); // top = palette $d ? return 0; } diff -Nru mame-0.144/src/mame/video/lucky74.c mame-0.145/src/mame/video/lucky74.c --- mame-0.144/src/mame/video/lucky74.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/lucky74.c 2012-02-06 21:30:32.000000000 +0000 @@ -102,28 +102,28 @@ { lucky74_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( lucky74_fg_colorram_w ) { lucky74_state *state = space->machine().driver_data(); state->m_fg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( lucky74_bg_videoram_w ) { lucky74_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( lucky74_bg_colorram_w ) { lucky74_state *state = space->machine().driver_data(); state->m_bg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -238,14 +238,14 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE( lucky74 ) +SCREEN_UPDATE_IND16( lucky74 ) { - lucky74_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + lucky74_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/lvcards.c mame-0.145/src/mame/video/lvcards.c --- mame-0.144/src/mame/video/lvcards.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lvcards.c 2012-02-06 21:30:33.000000000 +0000 @@ -84,14 +84,14 @@ { lvcards_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( lvcards_colorram_w ) { lvcards_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -112,9 +112,9 @@ 8, 8, 32, 32); } -SCREEN_UPDATE( lvcards ) +SCREEN_UPDATE_IND16( lvcards ) { - lvcards_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + lvcards_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/lwings.c mame-0.145/src/mame/video/lwings.c --- mame-0.144/src/mame/video/lwings.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/lwings.c 2012-02-06 21:30:33.000000000 +0000 @@ -56,7 +56,7 @@ state->m_bg2_avenger_hw ? ((color & 7) ^ 6) : (color & 7), ((color & 0x10) ? TILE_FLIPX : 0)); - tileinfo->group = (color & 0x08) >> 3; + tileinfo.group = (color & 0x08) >> 3; } static TILE_GET_INFO( get_bg2_tile_info ) @@ -89,7 +89,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg1_tilemap = tilemap_create(machine, lwings_get_bg1_tile_info, tilemap_scan_cols, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(3); } VIDEO_START( trojan ) @@ -100,9 +100,9 @@ state->m_bg1_tilemap = tilemap_create(machine, trojan_get_bg1_tile_info,tilemap_scan_cols, 16, 16, 32, 32); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, get_bg2_memory_offset, 16, 16, 32, 16); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); - tilemap_set_transmask(state->m_bg1_tilemap, 0, 0xffff, 0x0001); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg1_tilemap, 1, 0xf07f, 0x0f81); /* split type 1 has pens 7-11 opaque in front half */ + state->m_fg_tilemap->set_transparent_pen(3); + state->m_bg1_tilemap->set_transmask(0, 0xffff, 0x0001); /* split type 0 is totally transparent in front half */ + state->m_bg1_tilemap->set_transmask(1, 0xf07f, 0x0f81); /* split type 1 has pens 7-11 opaque in front half */ state->m_bg2_avenger_hw = 0; } @@ -125,14 +125,14 @@ { lwings_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( lwings_bg1videoram_w ) { lwings_state *state = space->machine().driver_data(); state->m_bg1videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset & 0x3ff); + state->m_bg1_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -140,20 +140,20 @@ { lwings_state *state = space->machine().driver_data(); state->m_scroll_x[offset] = data; - tilemap_set_scrollx(state->m_bg1_tilemap, 0, state->m_scroll_x[0] | (state->m_scroll_x[1] << 8)); + state->m_bg1_tilemap->set_scrollx(0, state->m_scroll_x[0] | (state->m_scroll_x[1] << 8)); } WRITE8_HANDLER( lwings_bg1_scrolly_w ) { lwings_state *state = space->machine().driver_data(); state->m_scroll_y[offset] = data; - tilemap_set_scrolly(state->m_bg1_tilemap, 0, state->m_scroll_y[0] | (state->m_scroll_y[1] << 8)); + state->m_bg1_tilemap->set_scrolly(0, state->m_scroll_y[0] | (state->m_scroll_y[1] << 8)); } WRITE8_HANDLER( trojan_bg2_scrollx_w ) { lwings_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, data); + state->m_bg2_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( trojan_bg2_image_w ) @@ -163,7 +163,7 @@ if (state->m_bg2_image != data) { state->m_bg2_image = data; - tilemap_mark_all_tiles_dirty(state->m_bg2_tilemap); + state->m_bg2_tilemap->mark_all_dirty(); } } @@ -184,7 +184,7 @@ return sx || sy; } -static void lwings_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void lwings_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; int offs; @@ -220,7 +220,7 @@ } } -static void trojan_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void trojan_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { lwings_state *state = machine.driver_data(); UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; @@ -269,31 +269,35 @@ } } -SCREEN_UPDATE( lwings ) +SCREEN_UPDATE_IND16( lwings ) { - lwings_state *state = screen->machine().driver_data(); + lwings_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - lwings_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + lwings_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( trojan ) +SCREEN_UPDATE_IND16( trojan ) { - lwings_state *state = screen->machine().driver_data(); + lwings_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_LAYER1, 0); - trojan_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + trojan_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( lwings ) +SCREEN_VBLANK( lwings ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/m107.c mame-0.145/src/mame/video/m107.c --- mame-0.144/src/mame/video/m107.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/m107.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,7 +59,7 @@ TILE_FLIPYX(attrib >> 10)); /* Priority 1 = tile appears above sprites */ - tileinfo->category = (attrib >> 9) & 1; + tileinfo.category = (attrib >> 9) & 1; } /*****************************************************************************/ @@ -72,7 +72,7 @@ COMBINE_DATA(&state->m_vram_data[offset]); for (laynum = 0; laynum < 4; laynum++) if ((offset & 0x6000) == state->m_pf_layer[laynum].vram_base) - tilemap_mark_tile_dirty(state->m_pf_layer[laynum].tmap, (offset & 0x1fff) / 2); + state->m_pf_layer[laynum].tmap->mark_tile_dirty((offset & 0x1fff) / 2); } /*****************************************************************************/ @@ -97,11 +97,11 @@ layer->vram_base = ((state->m_control[offset] >> 8) & 15) * 0x800; /* update enable (bit 7) */ - tilemap_set_enable(layer->tmap, (~state->m_control[offset] >> 7) & 1); + layer->tmap->enable((~state->m_control[offset] >> 7) & 1); /* mark everything dirty of the VRAM base changes */ if ((old ^ state->m_control[offset]) & 0x0f00) - tilemap_mark_all_tiles_dirty(layer->tmap); + layer->tmap->mark_all_dirty(); if(state->m_control[offset] & 0xf07c) printf("%04x %02x\n",state->m_control[offset],offset*2); @@ -134,15 +134,15 @@ layer->tmap = tilemap_create(machine, get_pf_tile_info, tilemap_scan_rows, 8,8, 64,64); /* set the user data to point to the layer */ - tilemap_set_user_data(layer->tmap, &state->m_pf_layer[laynum]); + layer->tmap->set_user_data(&state->m_pf_layer[laynum]); /* set scroll offsets */ - tilemap_set_scrolldx(layer->tmap, -3 + 2 * laynum, -3 + 2 * laynum); - tilemap_set_scrolldy(layer->tmap, -128, -128); + layer->tmap->set_scrolldx(-3 + 2 * laynum, -3 + 2 * laynum); + layer->tmap->set_scrolldy(-128, -128); /* set pen 0 to transparent for all tilemaps except #4 */ if (laynum != 3) - tilemap_set_transparent_pen(layer->tmap, 0); + layer->tmap->set_transparent_pen(0); } state->m_buffered_spriteram = auto_alloc_array_clear(machine, UINT16, 0x1000/2); @@ -150,7 +150,7 @@ /*****************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m107_state *state = machine.driver_data(); UINT16 *spriteram = state->m_buffered_spriteram; @@ -296,56 +296,53 @@ { const UINT16 *scrolldata = state->m_vram_data + (0xe000 + 0x200 * laynum) / 2; - tilemap_set_scroll_rows(layer->tmap, 512); + layer->tmap->set_scroll_rows(512); for (i = 0; i < 512; i++) - tilemap_set_scrollx(layer->tmap, i, scrolldata[((i+0xff80)-(scrolly))&0x1ff] + scrollx); + layer->tmap->set_scrollx(i, scrolldata[((i+0xff80)-(scrolly))&0x1ff] + scrollx); } else { - tilemap_set_scroll_rows(layer->tmap, 1); - tilemap_set_scrollx(layer->tmap, 0, scrollx); + layer->tmap->set_scroll_rows(1); + layer->tmap->set_scrollx(0, scrollx); } - tilemap_set_scrolly(layer->tmap, 0,scrolly); + layer->tmap->set_scrolly(0,scrolly); } } /*****************************************************************************/ -static void m107_tilemap_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int laynum, int category,int opaque) +static void m107_tilemap_draw(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int laynum, int category,int opaque) { m107_state *state = machine.driver_data(); int line; rectangle clip; const rectangle &visarea = machine.primary_screen->visible_area(); - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + clip = visarea; if (state->m_control[0x08 + laynum] & 0x02) { - for (line = cliprect->min_y; line <= cliprect->max_y;line++) + for (line = cliprect.min_y; line <= cliprect.max_y;line++) { const UINT16 *scrolldata = state->m_vram_data + (0xe800 + 0x200 * laynum) / 2; clip.min_y = clip.max_y = line; - tilemap_set_scrollx(state->m_pf_layer[laynum].tmap,0, state->m_control[1 + 2 * laynum]); - tilemap_set_scrolly(state->m_pf_layer[laynum].tmap,0, (state->m_control[0 + 2 * laynum] + scrolldata[line])); + state->m_pf_layer[laynum].tmap->set_scrollx(0, state->m_control[1 + 2 * laynum]); + state->m_pf_layer[laynum].tmap->set_scrolly(0, (state->m_control[0 + 2 * laynum] + scrolldata[line])); - tilemap_draw(bitmap, &clip, state->m_pf_layer[laynum].tmap, category | opaque, category); + state->m_pf_layer[laynum].tmap->draw(bitmap, clip, category | opaque, category); } } else - tilemap_draw(bitmap, cliprect, state->m_pf_layer[laynum].tmap, category | opaque, category); + state->m_pf_layer[laynum].tmap->draw(bitmap, cliprect, category | opaque, category); } -static void m107_screenrefresh(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void m107_screenrefresh(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m107_state *state = machine.driver_data(); - bitmap_fill(machine.priority_bitmap, cliprect, 0); + machine.priority_bitmap.fill(0, cliprect); if ((~state->m_control[0x0b] >> 7) & 1) { @@ -353,7 +350,7 @@ m107_tilemap_draw(machine, bitmap, cliprect, 3, 1,0); } else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* note: the opaque flag is used if layer 3 is disabled, noticeable in World PK Soccer title and gameplay screens */ m107_tilemap_draw(machine, bitmap, cliprect, 2, 0,(((state->m_control[0x0b] >> 7) & 1) ? TILEMAP_DRAW_OPAQUE : 0)); @@ -388,10 +385,10 @@ /*****************************************************************************/ -SCREEN_UPDATE( m107 ) +SCREEN_UPDATE_IND16( m107 ) { - m107_update_scroll_positions(screen->machine()); - m107_screenrefresh(screen->machine(), bitmap, cliprect); + m107_update_scroll_positions(screen.machine()); + m107_screenrefresh(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/m10.c mame-0.145/src/mame/video/m10.c --- mame-0.144/src/mame/video/m10.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/m10.c 2012-02-06 21:30:31.000000000 +0000 @@ -42,13 +42,13 @@ 8*8 /* every char takes 8 consecutive bytes */ }; -static UINT32 tilemap_scan( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) +static TILEMAP_MAPPER( tilemap_scan ) { return (31 - col) * 32 + row; } -static void get_tile_info( running_machine &machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param ) +static void get_tile_info( running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, void *param ) { m10_state *state = machine.driver_data(); @@ -62,7 +62,7 @@ if (state->m_colorram[offset] != data) { - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); state->m_colorram[offset] = data; } } @@ -92,14 +92,14 @@ } -INLINE void plot_pixel_m10( running_machine &machine, bitmap_t *bm, int x, int y, int col ) +INLINE void plot_pixel_m10( running_machine &machine, bitmap_ind16 &bm, int x, int y, int col ) { m10_state *state = machine.driver_data(); if (!state->m_flip) - *BITMAP_ADDR16(bm, y, x) = col; + bm.pix16(y, x) = col; else - *BITMAP_ADDR16(bm, (IREMM10_VBSTART - 1) - (y - IREMM10_VBEND) + 6, + bm.pix16((IREMM10_VBSTART - 1) - (y - IREMM10_VBEND) + 6, (IREMM10_HBSTART - 1) - (x - IREMM10_HBEND)) = col; // only when flip_screen(?) } @@ -108,9 +108,9 @@ m10_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_scrolldx(state->m_tx_tilemap, 0, 62); - tilemap_set_scrolldy(state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_scrolldx(0, 62); + state->m_tx_tilemap->set_scrolldy(0, 0); state->m_back_gfx = gfx_element_alloc(machine, &backlayout, state->m_chargen, 8, 0); @@ -125,27 +125,27 @@ machine.gfx[0] = gfx_element_alloc(machine, &charlayout, state->m_chargen, 8, 0); state->m_tx_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan, 8, 8, 32, 32); - tilemap_set_scrolldx(state->m_tx_tilemap, 0, 116); - tilemap_set_scrolldy(state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_scrolldx(0, 116); + state->m_tx_tilemap->set_scrolldy(0, 0); return ; } /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -SCREEN_UPDATE( m10 ) +SCREEN_UPDATE_IND16( m10 ) { - m10_state *state = screen->machine().driver_data(); + m10_state *state = screen.machine().driver_data(); int offs; static const int color[4]= { 3, 3, 5, 5 }; static const int xpos[4] = { 4*8, 26*8, 7*8, 6*8}; int i; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (i = 0; i < 4; i++) if (state->m_flip) @@ -158,14 +158,14 @@ int y; for (y = IREMM10_VBEND; y < IREMM10_VBSTART; y++) - plot_pixel_m10(screen->machine(), bitmap, 16, y, 1); + plot_pixel_m10(screen.machine(), bitmap, 16, y, 1); } for (offs = state->m_videoram_size - 1; offs >= 0; offs--) - tilemap_mark_tile_dirty(state->m_tx_tilemap, offs); + state->m_tx_tilemap->mark_tile_dirty(offs); - tilemap_set_flip(state->m_tx_tilemap, state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_flip(state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -173,21 +173,21 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -SCREEN_UPDATE( m15 ) +SCREEN_UPDATE_IND16( m15 ) { - m10_state *state = screen->machine().driver_data(); + m10_state *state = screen.machine().driver_data(); int offs; for (offs = state->m_videoram_size - 1; offs >= 0; offs--) - tilemap_mark_tile_dirty(state->m_tx_tilemap, offs); + state->m_tx_tilemap->mark_tile_dirty(offs); - //tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); - tilemap_set_flip(state->m_tx_tilemap, state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + //state->m_tx_tilemap->mark_all_dirty(); + state->m_tx_tilemap->set_flip(state->m_flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/m3raster.c mame-0.145/src/mame/video/m3raster.c --- mame-0.144/src/mame/video/m3raster.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/m3raster.c 2012-02-06 21:30:32.000000000 +0000 @@ -2,9 +2,9 @@ { const poly_extra_data *extra = (const poly_extra_data *)extradata; const cached_texture *texture = extra->texture; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *p = BITMAP_ADDR16(destmap, scanline, 0); - UINT32 *d = BITMAP_ADDR32(extra->zbuffer, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *p = &destmap->pix16(scanline); + UINT32 *d = &extra->zbuffer->pix32(scanline); float ooz = extent->param[0].start; float uoz = extent->param[1].start; float voz = extent->param[2].start; @@ -51,9 +51,9 @@ { const poly_extra_data *extra = (const poly_extra_data *)extradata; const cached_texture *texture = extra->texture; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *p = BITMAP_ADDR16(destmap, scanline, 0); - UINT32 *d = BITMAP_ADDR32(extra->zbuffer, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *p = &destmap->pix16(scanline); + UINT32 *d = &extra->zbuffer->pix32(scanline); float ooz = extent->param[0].start; float uoz = extent->param[1].start; float voz = extent->param[2].start; @@ -106,9 +106,9 @@ { const poly_extra_data *extra = (const poly_extra_data *)extradata; const cached_texture *texture = extra->texture; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *p = BITMAP_ADDR16(destmap, scanline, 0); - UINT32 *d = BITMAP_ADDR32(extra->zbuffer, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *p = &destmap->pix16(scanline); + UINT32 *d = &extra->zbuffer->pix32(scanline); float ooz = extent->param[0].start; float uoz = extent->param[1].start; float voz = extent->param[2].start; @@ -167,9 +167,9 @@ { const poly_extra_data *extra = (const poly_extra_data *)extradata; const cached_texture *texture = extra->texture; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *p = BITMAP_ADDR16(destmap, scanline, 0); - UINT32 *d = BITMAP_ADDR32(extra->zbuffer, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *p = &destmap->pix16(scanline); + UINT32 *d = &extra->zbuffer->pix32(scanline); float ooz = extent->param[0].start; float uoz = extent->param[1].start; float voz = extent->param[2].start; @@ -226,9 +226,9 @@ static void draw_scanline_color(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; - UINT16 *p = BITMAP_ADDR16(destmap, scanline, 0); - UINT32 *d = BITMAP_ADDR32(extra->zbuffer, scanline, 0); + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; + UINT16 *p = &destmap->pix16(scanline); + UINT32 *d = &extra->zbuffer->pix32(scanline); float ooz = extent->param[0].start; float doozdx = extent->param[0].dpdx; int fr = extra->color & 0x7c00; diff -Nru mame-0.144/src/mame/video/m52.c mame-0.145/src/mame/video/m52.c --- mame-0.144/src/mame/video/m52.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/m52.c 2012-02-06 21:30:31.000000000 +0000 @@ -152,10 +152,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 128 - 1, -1); - tilemap_set_scrolldy(state->m_bg_tilemap, 16, 16); - tilemap_set_scroll_rows(state->m_bg_tilemap, 4); /* only lines 192-256 scroll */ + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(128 - 1, -1); + state->m_bg_tilemap->set_scrolldy(16, 16); + state->m_bg_tilemap->set_scroll_rows(4); /* only lines 192-256 scroll */ state->save_item(NAME(state->m_bg1xpos)); state->save_item(NAME(state->m_bg1ypos)); @@ -182,10 +182,10 @@ So we set the first 3 quarters to 255 and the last to the scroll value */ - tilemap_set_scrollx(state->m_bg_tilemap, 0, 255); - tilemap_set_scrollx(state->m_bg_tilemap, 1, 255); - tilemap_set_scrollx(state->m_bg_tilemap, 2, 255); - tilemap_set_scrollx(state->m_bg_tilemap, 3, -data); + state->m_bg_tilemap->set_scrollx(0, 255); + state->m_bg_tilemap->set_scrollx(1, 255); + state->m_bg_tilemap->set_scrollx(2, 255); + state->m_bg_tilemap->set_scrollx(3, -data); } @@ -201,7 +201,7 @@ m52_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -210,7 +210,7 @@ m52_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -303,7 +303,7 @@ * *************************************/ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int xpos, int ypos, int image) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int xpos, int ypos, int image) { rectangle rect; const rectangle &visarea = machine.primary_screen->visible_area(); @@ -349,7 +349,7 @@ rect.max_y = ypos + 2 * BGHEIGHT - 1; } - bitmap_fill(bitmap, &rect, machine.gfx[image]->color_base + 3); + bitmap.fill(machine.gfx[image]->color_base + 3, rect); } @@ -360,28 +360,28 @@ * *************************************/ -SCREEN_UPDATE( m52 ) +SCREEN_UPDATE_IND16( m52 ) { - m52_state *state = screen->machine().driver_data(); + m52_state *state = screen.machine().driver_data(); int offs; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (!(state->m_bgcontrol & 0x20)) { if (!(state->m_bgcontrol & 0x10)) - draw_background(screen->machine(), bitmap, cliprect, state->m_bg2xpos, state->m_bg2ypos, 2); /* distant mountains */ + draw_background(screen.machine(), bitmap, cliprect, state->m_bg2xpos, state->m_bg2ypos, 2); /* distant mountains */ if (!(state->m_bgcontrol & 0x02)) - draw_background(screen->machine(), bitmap, cliprect, state->m_bg1xpos, state->m_bg1ypos, 3); /* hills */ + draw_background(screen.machine(), bitmap, cliprect, state->m_bg1xpos, state->m_bg1ypos, 3); /* hills */ if (!(state->m_bgcontrol & 0x04)) - draw_background(screen->machine(), bitmap, cliprect, state->m_bg1xpos, state->m_bg1ypos, 4); /* cityscape */ + draw_background(screen.machine(), bitmap, cliprect, state->m_bg1xpos, state->m_bg1ypos, 4); /* cityscape */ } - tilemap_set_flip(state->m_bg_tilemap, flip_screen_get(screen->machine()) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_bg_tilemap->set_flip(flip_screen_get(screen.machine()) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0xfc; offs >= 0; offs -= 4) @@ -396,14 +396,14 @@ /* sprites from offsets $00-$7F are processed in the upper half of the frame */ /* sprites from offsets $80-$FF are processed in the lower half of the frame */ - clip = *cliprect; + clip = cliprect; if (!(offs & 0x80)) clip.min_y = 0, clip.max_y = 127; else clip.min_y = 128, clip.max_y = 255; /* adjust for flipping */ - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { int temp = clip.min_y; clip.min_y = 255 - clip.max_y; @@ -420,12 +420,12 @@ #ifdef SPLIT_SPRITES sect_rect(&clip, cliprect); #else - clip = *cliprect; + clip = cliprect; #endif - drawgfx_transmask(bitmap, &clip, screen->machine().gfx[1], + drawgfx_transmask(bitmap, clip, screen.machine().gfx[1], code, color, flipx, flipy, sx, sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color, 512 + 32)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color, 512 + 32)); } return 0; } diff -Nru mame-0.144/src/mame/video/m57.c mame-0.145/src/mame/video/m57.c --- mame-0.144/src/mame/video/m57.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/m57.c 2012-02-06 21:30:31.000000000 +0000 @@ -131,7 +131,7 @@ m57_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -146,7 +146,7 @@ m57_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 256); + state->m_bg_tilemap->set_scroll_rows(256); state->save_item(NAME(state->m_flipscreen)); } @@ -164,7 +164,7 @@ /* screen flip is handled both by software and hardware */ state->m_flipscreen = (data & 0x01) ^ (~input_port_read(space->machine(), "DSW2") & 0x01); - tilemap_set_flip(state->m_bg_tilemap, state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); coin_counter_w(space->machine(), 0,data & 0x02); coin_counter_w(space->machine(), 1,data & 0x20); @@ -177,7 +177,7 @@ * *************************************/ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m57_state *state = machine.driver_data(); int y,x; @@ -185,31 +185,31 @@ // from 64 to 127: not wrapped for (y = 64; y < 128; y++) - tilemap_set_scrollx(state->m_bg_tilemap, y, state->m_scrollram[0x40]); + state->m_bg_tilemap->set_scrollx(y, state->m_scrollram[0x40]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); // from 128 to 255: wrapped - for (y = 128; y <= cliprect->max_y; y++) + for (y = 128; y <= cliprect.max_y; y++) { scrolly = state->m_scrollram[y] + (state->m_scrollram[y + 0x100] << 8); if (scrolly >= 0) { - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - if ((x + scrolly) <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap, y, x + scrolly); + if ((x + scrolly) <= cliprect.max_x) + bitmap.pix16(y, x) = bitmap.pix16(y, x + scrolly); else - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap, y, cliprect->max_x); + bitmap.pix16(y, x) = bitmap.pix16(y, cliprect.max_x); } } else { - for (x = cliprect->max_x; x >= cliprect->min_x; x--) + for (x = cliprect.max_x; x >= cliprect.min_x; x--) { - if ((x + scrolly) >= cliprect->min_x) - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap, y, x + scrolly); + if ((x + scrolly) >= cliprect.min_x) + bitmap.pix16(y, x) = bitmap.pix16(y, x + scrolly); else - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(bitmap, y, cliprect->min_x); + bitmap.pix16(y, x) = bitmap.pix16(y, cliprect.min_x); } } } @@ -221,7 +221,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m57_state *state = machine.driver_data(); int offs; @@ -267,9 +267,9 @@ * *************************************/ -SCREEN_UPDATE( m57 ) +SCREEN_UPDATE_IND16( m57 ) { - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/m58.c mame-0.145/src/mame/video/m58.c --- mame-0.144/src/mame/video/m58.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/m58.c 2012-02-06 21:30:31.000000000 +0000 @@ -108,7 +108,7 @@ m58_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -133,7 +133,7 @@ col = (data >> i) & 0x11; col = ((col >> 3) | col) & 3; - *BITMAP_ADDR16(state->m_scroll_panel_bitmap, sy, sx + i) = RADAR_PALETTE_BASE + (sy & 0xfc) + col; + state->m_scroll_panel_bitmap->pix16(sy, sx + i) = RADAR_PALETTE_BASE + (sy & 0xfc) + col; } } @@ -159,7 +159,7 @@ } -static UINT32 yard_tilemap_scan_rows( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) +static TILEMAP_MAPPER( yard_tilemap_scan_rows ) { /* logical (col,row) -> memory offset */ if (col >= 32) @@ -182,14 +182,13 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - bitmap_format format = machine.primary_screen->format(); const rectangle &visarea = machine.primary_screen->visible_area(); state->m_bg_tilemap = tilemap_create(machine, yard_get_bg_tile_info, yard_tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scrolldx(state->m_bg_tilemap, visarea.min_x, width - (visarea.max_x + 1)); - tilemap_set_scrolldy(state->m_bg_tilemap, visarea.min_y - 8, height + 16 - (visarea.max_y + 1)); + state->m_bg_tilemap->set_scrolldx(visarea.min_x, width - (visarea.max_x + 1)); + state->m_bg_tilemap->set_scrolldy(visarea.min_y - 8, height + 16 - (visarea.max_y + 1)); - state->m_scroll_panel_bitmap = auto_bitmap_alloc(machine, SCROLL_PANEL_WIDTH, height, format); + state->m_scroll_panel_bitmap = auto_bitmap_ind16_alloc(machine, SCROLL_PANEL_WIDTH, height); } @@ -219,7 +218,7 @@ #define DRAW_SPRITE(code, sy) drawgfx_transmask(bitmap, cliprect, machine.gfx[1], code, color, flipx, flipy, sx, sy, colortable_get_transpen_mask(machine.colortable, machine.gfx[1], color, 512)); -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { m58_state *state = machine.driver_data(); int offs; @@ -274,33 +273,25 @@ * *************************************/ -static void draw_panel( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_panel( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { m58_state *state = machine.driver_data(); if (!*state->m_yard_score_panel_disabled) { - static const rectangle clippanel = - { - 26*8, 32*8-1, - 1*8, 31*8-1 - }; - static const rectangle clippanelflip = - { - 0*8, 6*8-1, - 1*8, 31*8-1 - }; + const rectangle clippanel(26*8, 32*8-1, 1*8, 31*8-1); + const rectangle clippanelflip(0*8, 6*8-1, 1*8, 31*8-1); rectangle clip = flip_screen_get(machine) ? clippanelflip : clippanel; const rectangle &visarea = machine.primary_screen->visible_area(); - int sx = flip_screen_get(machine) ? cliprect->min_x - 8 : cliprect->max_x + 1 - SCROLL_PANEL_WIDTH; + int sx = flip_screen_get(machine) ? cliprect.min_x - 8 : cliprect.max_x + 1 - SCROLL_PANEL_WIDTH; int yoffs = flip_screen_get(machine) ? -40 : -16; clip.min_y += visarea.min_y + yoffs; clip.max_y += visarea.max_y + yoffs; - sect_rect(&clip, cliprect); + clip &= cliprect; - copybitmap(bitmap, state->m_scroll_panel_bitmap, flip_screen_get(machine), flip_screen_get(machine), - sx, visarea.min_y + yoffs, &clip); + copybitmap(bitmap, *state->m_scroll_panel_bitmap, flip_screen_get(machine), flip_screen_get(machine), + sx, visarea.min_y + yoffs, clip); } } @@ -312,15 +303,15 @@ * *************************************/ -SCREEN_UPDATE( yard ) +SCREEN_UPDATE_IND16( yard ) { - m58_state *state = screen->machine().driver_data(); + m58_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, (*state->m_yard_scroll_x_high * 0x100) + *state->m_yard_scroll_x_low); - tilemap_set_scrolly(state->m_bg_tilemap, 0, *state->m_yard_scroll_y_low); + state->m_bg_tilemap->set_scrollx(0, (*state->m_yard_scroll_x_high * 0x100) + *state->m_yard_scroll_x_low); + state->m_bg_tilemap->set_scrolly(0, *state->m_yard_scroll_y_low); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_panel(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_panel(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/m62.c mame-0.145/src/mame/video/m62.c --- mame-0.144/src/mame/video/m62.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/m62.c 2012-02-06 21:30:31.000000000 +0000 @@ -306,9 +306,9 @@ state->m_flipscreen = data & 0x01; if (state->m_flipscreen) - tilemap_set_flip_all(space->machine(), TILEMAP_FLIPX | TILEMAP_FLIPY); + space->machine().tilemap().set_flip_all(TILEMAP_FLIPX | TILEMAP_FLIPY); else - tilemap_set_flip_all(space->machine(), 0); + space->machine().tilemap().set_flip_all(0); coin_counter_w(space->machine(), 0, data & 2); coin_counter_w(space->machine(), 1, data & 4); @@ -342,18 +342,18 @@ { m62_state *state = space->machine().driver_data(); state->m_m62_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } WRITE8_HANDLER( m62_textram_w ) { m62_state *state = space->machine().driver_data(); state->m_m62_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int colormask, int prioritymask, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int colormask, int prioritymask, int priority ) { m62_state *state = machine.driver_data(); int offs; @@ -420,10 +420,10 @@ register_savestate(machine); if (rows != 0) - tilemap_set_scroll_rows(state->m_bg_tilemap, rows); + state->m_bg_tilemap->set_scroll_rows(rows); if (cols != 0) - tilemap_set_scroll_cols(state->m_bg_tilemap, cols); + state->m_bg_tilemap->set_scroll_cols(cols); } static void m62_textlayer( running_machine &machine, tile_get_info_func tile_get_info, int rows, int cols, int x1, int y1, int x2, int y2 ) @@ -432,17 +432,17 @@ state->m_fg_tilemap = tilemap_create(machine, tile_get_info, tilemap_scan_rows, x1, y1, x2, y2); if (rows != 0) - tilemap_set_scroll_rows(state->m_fg_tilemap, rows); + state->m_fg_tilemap->set_scroll_rows(rows); if (cols != 0) - tilemap_set_scroll_cols(state->m_fg_tilemap, cols); + state->m_fg_tilemap->set_scroll_cols(cols); } WRITE8_HANDLER( kungfum_tileram_w ) { m62_state *state = space->machine().driver_data(); state->m_m62_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } static TILE_GET_INFO( get_kungfum_bg_tile_info ) @@ -462,9 +462,9 @@ /* is the following right? */ if ((tile_index / 64) < 6 || ((color & 0x1f) >> 1) > 0x0c) - tileinfo->category = 1; + tileinfo.category = 1; else - tileinfo->category = 0; + tileinfo.category = 0; } VIDEO_START( kungfum ) @@ -472,21 +472,21 @@ m62_start(machine, get_kungfum_bg_tile_info, 32, 0, 8, 8, 64, 32); } -SCREEN_UPDATE( kungfum ) +SCREEN_UPDATE_IND16( kungfum ) { - m62_state *state = screen->machine().driver_data(); + m62_state *state = screen.machine().driver_data(); int i; for (i = 0; i < 6; i++) { - tilemap_set_scrollx(state->m_bg_tilemap, i, 0); + state->m_bg_tilemap->set_scrollx(i, 0); } for (i = 6; i < 32; i++) { - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_m62_background_hscroll); + state->m_bg_tilemap->set_scrollx(i, state->m_m62_background_hscroll); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } @@ -507,9 +507,9 @@ } SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags); if (((color & 0x1f) >> 1) >= 0x0c) - tileinfo->group = 1; + tileinfo.group = 1; else - tileinfo->group = 0; + tileinfo.group = 0; } VIDEO_START( ldrun ) @@ -517,20 +517,20 @@ m62_state *state = machine.driver_data(); m62_start(machine, get_ldrun_bg_tile_info, 1, 1, 8, 8, 64, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ } -SCREEN_UPDATE( ldrun ) +SCREEN_UPDATE_IND16( ldrun ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_m62_background_vscroll); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll); + state->m_bg_tilemap->set_scrolly(0, state->m_m62_background_vscroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0f, 0x10, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0f, 0x10, 0x10); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0f, 0x10, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0f, 0x10, 0x10); return 0; } @@ -549,17 +549,17 @@ } SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags); if (((color & 0x1f) >> 1) >= 0x04) - tileinfo->group = 1; + tileinfo.group = 1; else - tileinfo->group = 0; + tileinfo.group = 0; } VIDEO_START( ldrun2 ) { m62_state *state = machine.driver_data(); m62_start(machine, get_ldrun2_bg_tile_info, 1, 1, 8, 8, 64, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ } @@ -569,22 +569,22 @@ state->m_ldrun3_topbottom_mask = data & 1; } -SCREEN_UPDATE( ldrun3 ) +SCREEN_UPDATE_IND16( ldrun3 ) { - m62_state *state = screen->machine().driver_data(); - SCREEN_UPDATE_CALL(ldrun); + m62_state *state = screen.machine().driver_data(); + SCREEN_UPDATE16_CALL(ldrun); if (state->m_ldrun3_topbottom_mask) { - rectangle my_cliprect = *cliprect; + rectangle my_cliprect = cliprect; my_cliprect.min_y = 0 * 8; my_cliprect.max_y = 1 * 8 - 1; - bitmap_fill(bitmap, &my_cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), my_cliprect); my_cliprect.min_y = 31 * 8; my_cliprect.max_y = 32 * 8 - 1; - bitmap_fill(bitmap, &my_cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), my_cliprect); } return 0; @@ -606,9 +606,9 @@ } SET_TILE_INFO(0, code | ((color & 0x40) << 3) | ((color & 0x10) << 4), color & 0x0f, flags); if (((color & 0x1f) >> 1) >= 0x04) - tileinfo->group = 1; + tileinfo.group = 1; else - tileinfo->group = 0; + tileinfo.group = 0; } static TILE_GET_INFO( get_battroad_fg_tile_info ) @@ -626,24 +626,24 @@ m62_state *state = machine.driver_data(); m62_start(machine, get_battroad_bg_tile_info, 1, 1, 8, 8, 64, 32); m62_textlayer(machine, get_battroad_fg_tile_info, 1, 1, 8, 8, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ } -SCREEN_UPDATE( battroad ) +SCREEN_UPDATE_IND16( battroad ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_m62_background_vscroll); - tilemap_set_scrollx(state->m_fg_tilemap, 0, 128); - tilemap_set_scrolly(state->m_fg_tilemap, 0, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0f, 0x10, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0f, 0x10, 0x10); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll); + state->m_bg_tilemap->set_scrolly(0, state->m_m62_background_vscroll); + state->m_fg_tilemap->set_scrollx(0, 128); + state->m_fg_tilemap->set_scrolly(0, 0); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0f, 0x10, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0f, 0x10, 0x10); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -665,13 +665,13 @@ m62_start(machine, get_ldrun4_bg_tile_info, 1, 0, 8, 8, 64, 32); } -SCREEN_UPDATE( ldrun4 ) +SCREEN_UPDATE_IND16( ldrun4 ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll - 2); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll - 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); return 0; } @@ -708,18 +708,18 @@ m62_textlayer(machine, get_lotlot_fg_tile_info, 1, 1, 12, 10, 32, 64); } -SCREEN_UPDATE( lotlot ) +SCREEN_UPDATE_IND16( lotlot ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll - 64); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_m62_background_vscroll + 32); - tilemap_set_scrollx(state->m_fg_tilemap, 0, -64); - tilemap_set_scrolly(state->m_fg_tilemap, 0, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll - 64); + state->m_bg_tilemap->set_scrolly(0, state->m_m62_background_vscroll + 32); + state->m_fg_tilemap->set_scrollx(0, -64); + state->m_fg_tilemap->set_scrolly(0, 32); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); return 0; } @@ -742,7 +742,7 @@ if (state->m_kidniki_background_bank != (data & 1)) { state->m_kidniki_background_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -754,7 +754,7 @@ code = state->m_m62_tileram[tile_index << 1]; color = state->m_m62_tileram[(tile_index << 1) | 1]; SET_TILE_INFO(0, code | ((color & 0xe0) << 3) | (state->m_kidniki_background_bank << 11), color & 0x1f, 0); - tileinfo->group = ((color & 0xe0) == 0xe0) ? 1 : 0; + tileinfo.group = ((color & 0xe0) == 0xe0) ? 1 : 0; } static TILE_GET_INFO( get_kidniki_fg_tile_info ) @@ -772,26 +772,26 @@ m62_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_kidniki_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ register_savestate(machine); m62_textlayer(machine, get_kidniki_fg_tile_info, 1, 1, 12, 8, 32, 64); } -SCREEN_UPDATE( kidniki ) +SCREEN_UPDATE_IND16( kidniki ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll); - tilemap_set_scrollx(state->m_fg_tilemap, 0, -64); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_kidniki_text_vscroll + 128); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll); + state->m_fg_tilemap->set_scrollx(0, -64); + state->m_fg_tilemap->set_scrolly(0, state->m_kidniki_text_vscroll + 128); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -802,8 +802,8 @@ if (state->m_spelunkr_palbank != (data & 0x01)) { state->m_spelunkr_palbank = data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); + state->m_fg_tilemap->mark_all_dirty(); } } @@ -834,18 +834,18 @@ m62_textlayer(machine, get_spelunkr_fg_tile_info, 1, 1, 12, 8, 32, 32); } -SCREEN_UPDATE( spelunkr ) +SCREEN_UPDATE_IND16( spelunkr ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_m62_background_vscroll + 128); - tilemap_set_scrollx(state->m_fg_tilemap, 0, -64); - tilemap_set_scrolly(state->m_fg_tilemap, 0, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll); + state->m_bg_tilemap->set_scrolly(0, state->m_m62_background_vscroll + 128); + state->m_fg_tilemap->set_scrollx(0, -64); + state->m_fg_tilemap->set_scrolly(0, 0); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -858,8 +858,8 @@ if (state->m_spelunkr_palbank != ((data & 0x0c) >> 2)) { state->m_spelunkr_palbank = (data & 0x0c) >> 2; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); + state->m_fg_tilemap->mark_all_dirty(); } } @@ -879,18 +879,18 @@ m62_textlayer(machine, get_spelunkr_fg_tile_info, 1, 1, 12, 8, 32, 32); } -SCREEN_UPDATE( spelunk2 ) +SCREEN_UPDATE_IND16( spelunk2 ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll - 1); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_m62_background_vscroll + 128); - tilemap_set_scrollx(state->m_fg_tilemap, 0, -65); - tilemap_set_scrolly(state->m_fg_tilemap, 0, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll - 1); + state->m_bg_tilemap->set_scrolly(0, state->m_m62_background_vscroll + 128); + state->m_fg_tilemap->set_scrollx(0, -65); + state->m_fg_tilemap->set_scrolly(0, 0); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -904,9 +904,9 @@ color = state->m_m62_tileram[(tile_index << 1) | 1]; SET_TILE_INFO( 0, code | ((color & 0x60) << 3), color & 0x1f, 0); if (((color & 0x1f) >> 1) >= 0x08) - tileinfo->group = 1; + tileinfo.group = 1; else - tileinfo->group = 0; + tileinfo.group = 0; } static TILE_GET_INFO( get_youjyudn_fg_tile_info ) @@ -924,22 +924,22 @@ m62_state *state = machine.driver_data(); m62_start(machine, get_youjyudn_bg_tile_info, 1, 0, 8, 16, 64, 16); m62_textlayer(machine, get_youjyudn_fg_tile_info, 1, 1, 12, 8, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ } -SCREEN_UPDATE( youjyudn ) +SCREEN_UPDATE_IND16( youjyudn ) { - m62_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_m62_background_hscroll); - tilemap_set_scrollx(state->m_fg_tilemap, 0, -64); - tilemap_set_scrolly(state->m_fg_tilemap, 0, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + m62_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_m62_background_hscroll); + state->m_fg_tilemap->set_scrollx(0, -64); + state->m_fg_tilemap->set_scrolly(0, 0); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -960,29 +960,29 @@ SET_TILE_INFO(0, code | ((color & 0xc0) << 2) | ((color & 0x20) << 5), color & 0x1f, 0); if (((color & 0x1f) >> 1) >= 0x08) - tileinfo->group = 1; + tileinfo.group = 1; else - tileinfo->group = 0; + tileinfo.group = 0; } VIDEO_START( horizon ) { m62_state *state = machine.driver_data(); m62_start(machine, get_horizon_bg_tile_info, 32, 0, 8, 8, 64, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */ } -SCREEN_UPDATE( horizon ) +SCREEN_UPDATE_IND16( horizon ) { - m62_state *state = screen->machine().driver_data(); + m62_state *state = screen.machine().driver_data(); int i; for (i = 0; i < 32; i++) { - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_scrollram[i << 1] | (state->m_scrollram[(i << 1) | 1] << 8)); + state->m_bg_tilemap->set_scrollx(i, state->m_scrollram[i << 1] | (state->m_scrollram[(i << 1) | 1] << 8)); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0x1f, 0x00, 0x00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/m72.c mame-0.145/src/mame/video/m72.c --- mame-0.144/src/mame/video/m72.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/m72.c 2012-02-06 21:30:31.000000000 +0000 @@ -8,7 +8,7 @@ ***************************************************************************/ -INLINE void m72_get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,const UINT16 *vram,int gfxnum) +INLINE void m72_get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum) { int code,attr,color,pri; @@ -28,10 +28,10 @@ code + ((attr & 0x3f) << 8), color & 0x0f, TILE_FLIPYX((attr & 0xc0) >> 6)); - tileinfo->group = pri; + tileinfo.group = pri; } -INLINE void rtype2_get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,const UINT16 *vram,int gfxnum) +INLINE void rtype2_get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,const UINT16 *vram,int gfxnum) { int code,attr,color,pri; @@ -53,7 +53,7 @@ code, color & 0x0f, TILE_FLIPYX((color & 0x60) >> 5)); - tileinfo->group = pri; + tileinfo.group = pri; } @@ -122,22 +122,22 @@ state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, state->m_spriteram_size/2); - tilemap_set_transmask(state->m_fg_tilemap,0,0xffff,0x0001); - tilemap_set_transmask(state->m_fg_tilemap,1,0x00ff,0xff01); - tilemap_set_transmask(state->m_fg_tilemap,2,0x0001,0xffff); - - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); - tilemap_set_transmask(state->m_bg_tilemap,1,0x00ff,0xff00); - //tilemap_set_transmask(state->m_bg_tilemap,2,0x0001,0xfffe); - tilemap_set_transmask(state->m_bg_tilemap,2,0x0007,0xfff8); + state->m_fg_tilemap->set_transmask(0,0xffff,0x0001); + state->m_fg_tilemap->set_transmask(1,0x00ff,0xff01); + state->m_fg_tilemap->set_transmask(2,0x0001,0xffff); + + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); + state->m_bg_tilemap->set_transmask(1,0x00ff,0xff00); + //state->m_bg_tilemap->set_transmask(2,0x0001,0xfffe); + state->m_bg_tilemap->set_transmask(2,0x0007,0xfff8); memset(state->m_buffered_spriteram,0,state->m_spriteram_size); - tilemap_set_scrolldx(state->m_fg_tilemap,0,0); - tilemap_set_scrolldy(state->m_fg_tilemap,-128,16); + state->m_fg_tilemap->set_scrolldx(0,0); + state->m_fg_tilemap->set_scrolldy(-128,16); - tilemap_set_scrolldx(state->m_bg_tilemap,0,0); - tilemap_set_scrolldy(state->m_bg_tilemap,-128,16); + state->m_bg_tilemap->set_scrolldx(0,0); + state->m_bg_tilemap->set_scrolldy(-128,16); register_savestate(machine); } @@ -147,8 +147,8 @@ m72_state *state = machine.driver_data(); VIDEO_START_CALL(m72); - tilemap_set_scrolldx(state->m_fg_tilemap,4,0); - tilemap_set_scrolldx(state->m_bg_tilemap,6,0); + state->m_fg_tilemap->set_scrolldx(4,0); + state->m_bg_tilemap->set_scrolldx(6,0); } VIDEO_START( rtype2 ) @@ -159,21 +159,21 @@ state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, state->m_spriteram_size/2); - tilemap_set_transmask(state->m_fg_tilemap,0,0xffff,0x0001); - tilemap_set_transmask(state->m_fg_tilemap,1,0x00ff,0xff01); - tilemap_set_transmask(state->m_fg_tilemap,2,0x0001,0xffff); - - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); - tilemap_set_transmask(state->m_bg_tilemap,1,0x00ff,0xff00); - tilemap_set_transmask(state->m_bg_tilemap,2,0x0001,0xfffe); + state->m_fg_tilemap->set_transmask(0,0xffff,0x0001); + state->m_fg_tilemap->set_transmask(1,0x00ff,0xff01); + state->m_fg_tilemap->set_transmask(2,0x0001,0xffff); + + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); + state->m_bg_tilemap->set_transmask(1,0x00ff,0xff00); + state->m_bg_tilemap->set_transmask(2,0x0001,0xfffe); memset(state->m_buffered_spriteram,0,state->m_spriteram_size); - tilemap_set_scrolldx(state->m_fg_tilemap,4,0); - tilemap_set_scrolldy(state->m_fg_tilemap,-128,16); + state->m_fg_tilemap->set_scrolldx(4,0); + state->m_fg_tilemap->set_scrolldy(-128,16); - tilemap_set_scrolldx(state->m_bg_tilemap,4,0); - tilemap_set_scrolldy(state->m_bg_tilemap,-128,16); + state->m_bg_tilemap->set_scrolldx(4,0); + state->m_bg_tilemap->set_scrolldy(-128,16); register_savestate(machine); } @@ -183,8 +183,8 @@ m72_state *state = machine.driver_data(); VIDEO_START_CALL(rtype2); - tilemap_set_scrolldx(state->m_fg_tilemap,6,0); - tilemap_set_scrolldx(state->m_bg_tilemap,6,0); + state->m_fg_tilemap->set_scrolldx(6,0); + state->m_bg_tilemap->set_scrolldx(6,0); } VIDEO_START( hharryu ) @@ -192,8 +192,8 @@ m72_state *state = machine.driver_data(); VIDEO_START_CALL(rtype2); - tilemap_set_scrolldx(state->m_fg_tilemap,4,0); - tilemap_set_scrolldx(state->m_bg_tilemap,6,0); + state->m_fg_tilemap->set_scrolldx(4,0); + state->m_bg_tilemap->set_scrolldx(6,0); } /* Major Title has a larger background RAM, and rowscroll */ @@ -208,21 +208,21 @@ state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, state->m_spriteram_size/2); - tilemap_set_transmask(state->m_fg_tilemap,0,0xffff,0x0001); - tilemap_set_transmask(state->m_fg_tilemap,1,0x00ff,0xff01); - tilemap_set_transmask(state->m_fg_tilemap,2,0x0001,0xffff); - - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); - tilemap_set_transmask(state->m_bg_tilemap,1,0x00ff,0xff00); - tilemap_set_transmask(state->m_bg_tilemap,2,0x0001,0xfffe); + state->m_fg_tilemap->set_transmask(0,0xffff,0x0001); + state->m_fg_tilemap->set_transmask(1,0x00ff,0xff01); + state->m_fg_tilemap->set_transmask(2,0x0001,0xffff); + + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); + state->m_bg_tilemap->set_transmask(1,0x00ff,0xff00); + state->m_bg_tilemap->set_transmask(2,0x0001,0xfffe); memset(state->m_buffered_spriteram,0,state->m_spriteram_size); - tilemap_set_scrolldx(state->m_fg_tilemap,4,0); - tilemap_set_scrolldy(state->m_fg_tilemap,-128,16); + state->m_fg_tilemap->set_scrolldx(4,0); + state->m_fg_tilemap->set_scrolldy(-128,16); - tilemap_set_scrolldx(state->m_bg_tilemap,4,0); - tilemap_set_scrolldy(state->m_bg_tilemap,-128,16); + state->m_bg_tilemap->set_scrolldx(4,0); + state->m_bg_tilemap->set_scrolldy(-128,16); register_savestate(machine); } @@ -235,21 +235,21 @@ state->m_buffered_spriteram = auto_alloc_array(machine, UINT16, state->m_spriteram_size/2); - tilemap_set_transmask(state->m_fg_tilemap,0,0xffff,0x0001); - tilemap_set_transmask(state->m_fg_tilemap,1,0x00ff,0xff01); - tilemap_set_transmask(state->m_fg_tilemap,2,0x0001,0xffff); - - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); - tilemap_set_transmask(state->m_bg_tilemap,1,0x00ff,0xff00); - tilemap_set_transmask(state->m_bg_tilemap,2,0x0001,0xfffe); + state->m_fg_tilemap->set_transmask(0,0xffff,0x0001); + state->m_fg_tilemap->set_transmask(1,0x00ff,0xff01); + state->m_fg_tilemap->set_transmask(2,0x0001,0xffff); + + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); + state->m_bg_tilemap->set_transmask(1,0x00ff,0xff00); + state->m_bg_tilemap->set_transmask(2,0x0001,0xfffe); memset(state->m_buffered_spriteram,0,state->m_spriteram_size); - tilemap_set_scrolldx(state->m_fg_tilemap,4,0); - tilemap_set_scrolldy(state->m_fg_tilemap,-128,16); + state->m_fg_tilemap->set_scrolldx(4,0); + state->m_fg_tilemap->set_scrolldy(-128,16); - tilemap_set_scrolldx(state->m_bg_tilemap,6,0); - tilemap_set_scrolldy(state->m_bg_tilemap,-128,16); + state->m_bg_tilemap->set_scrolldx(6,0); + state->m_bg_tilemap->set_scrolldy(-128,16); register_savestate(machine); } @@ -314,14 +314,14 @@ { m72_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( m72_videoram2_w ) { m72_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( m72_irq_line_w ) @@ -430,7 +430,7 @@ ***************************************************************************/ -static void m72_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void m72_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m72_state *state = machine.driver_data(); UINT16 *spriteram = state->m_buffered_spriteram; @@ -484,7 +484,7 @@ } } -static void majtitle_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void majtitle_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m72_state *state = machine.driver_data(); UINT16 *spriteram16_2 = state->m_spriteram2; @@ -535,63 +535,63 @@ } } -SCREEN_UPDATE( m72 ) +SCREEN_UPDATE_IND16( m72 ) { - m72_state *state = screen->machine().driver_data(); + m72_state *state = screen.machine().driver_data(); if (state->m_video_off) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scrollx1); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scrolly1); + state->m_fg_tilemap->set_scrollx(0,state->m_scrollx1); + state->m_fg_tilemap->set_scrolly(0,state->m_scrolly1); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scrollx2); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scrolly2); + state->m_bg_tilemap->set_scrollx(0,state->m_scrollx2); + state->m_bg_tilemap->set_scrolly(0,state->m_scrolly2); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER1,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,TILEMAP_DRAW_LAYER1,0); - m72_draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,TILEMAP_DRAW_LAYER0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + m72_draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); return 0; } -SCREEN_UPDATE( majtitle ) +SCREEN_UPDATE_IND16( majtitle ) { - m72_state *state = screen->machine().driver_data(); + m72_state *state = screen.machine().driver_data(); int i; if (state->m_video_off) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scrollx1); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scrolly1); + state->m_fg_tilemap->set_scrollx(0,state->m_scrollx1); + state->m_fg_tilemap->set_scrolly(0,state->m_scrolly1); if (state->m_majtitle_rowscroll) { - tilemap_set_scroll_rows(state->m_bg_tilemap,512); + state->m_bg_tilemap->set_scroll_rows(512); for (i = 0;i < 512;i++) - tilemap_set_scrollx(state->m_bg_tilemap,(i+state->m_scrolly2)&0x1ff, + state->m_bg_tilemap->set_scrollx((i+state->m_scrolly2)&0x1ff, 256 + state->m_majtitle_rowscrollram[i]); } else { - tilemap_set_scroll_rows(state->m_bg_tilemap,1); - tilemap_set_scrollx(state->m_bg_tilemap,0,256 + state->m_scrollx2); + state->m_bg_tilemap->set_scroll_rows(1); + state->m_bg_tilemap->set_scrollx(0,256 + state->m_scrollx2); } - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scrolly2); + state->m_bg_tilemap->set_scrolly(0,state->m_scrolly2); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER1,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,TILEMAP_DRAW_LAYER1,0); - majtitle_draw_sprites(screen->machine(), bitmap,cliprect); - m72_draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,TILEMAP_DRAW_LAYER0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + majtitle_draw_sprites(screen.machine(), bitmap,cliprect); + m72_draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); return 0; } diff -Nru mame-0.144/src/mame/video/m90.c mame-0.145/src/mame/video/m90.c --- mame-0.144/src/mame/video/m90.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/m90.c 2012-02-06 21:30:31.000000000 +0000 @@ -30,7 +30,7 @@ #include "includes/m90.h" -INLINE void get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int layer,int page_mask) +INLINE void get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int layer,int page_mask) { m90_state *state = machine.driver_data(); int tile,color; @@ -43,10 +43,10 @@ tile, color&0xf, TILE_FLIPYX((color & 0xc0) >> 6)); - tileinfo->category = (color & 0x30) ? 1 : 0; + tileinfo.category = (color & 0x30) ? 1 : 0; } -INLINE void bomblord_get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int layer) +INLINE void bomblord_get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int layer) { m90_state *state = machine.driver_data(); int tile,color; @@ -59,10 +59,10 @@ tile, color&0xf, TILE_FLIPYX((color & 0xc0) >> 6)); - tileinfo->category = (color & 0x30) ? 1 : 0; + tileinfo.category = (color & 0x30) ? 1 : 0; } -INLINE void dynablsb_get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int layer) +INLINE void dynablsb_get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int layer) { m90_state *state = machine.driver_data(); int tile,color; @@ -75,7 +75,7 @@ tile, color&0xf, TILE_FLIPYX((color & 0xc0) >> 6)); - tileinfo->category = (color & 0x30) ? 1 : 0; + tileinfo.category = (color & 0x30) ? 1 : 0; } static TILE_GET_INFO( get_pf1_tile_info ) { get_tile_info(machine,tileinfo,tile_index,0,0x3); } @@ -101,8 +101,8 @@ state->m_pf2_layer = tilemap_create(machine, get_pf2_tile_info, tilemap_scan_rows,8,8,64,64); state->m_pf2_wide_layer = tilemap_create(machine, get_pf2w_tile_info,tilemap_scan_rows,8,8,128,64); - tilemap_set_transparent_pen(state->m_pf1_layer,0); - tilemap_set_transparent_pen(state->m_pf1_wide_layer,0); + state->m_pf1_layer->set_transparent_pen(0); + state->m_pf1_wide_layer->set_transparent_pen(0); state_save_register_global_array(machine, state->m_video_control_data); state_save_register_global(machine, state->m_last_pf1); @@ -117,10 +117,10 @@ state->m_pf2_layer = tilemap_create(machine, bomblord_get_pf2_tile_info, tilemap_scan_rows,8,8,64,64); state->m_pf2_wide_layer = tilemap_create(machine, bomblord_get_pf2w_tile_info,tilemap_scan_rows,8,8,128,64); - tilemap_set_transparent_pen(state->m_pf2_layer,0); - tilemap_set_transparent_pen(state->m_pf2_wide_layer,0); - tilemap_set_transparent_pen(state->m_pf1_layer,0); - tilemap_set_transparent_pen(state->m_pf1_wide_layer,0); + state->m_pf2_layer->set_transparent_pen(0); + state->m_pf2_wide_layer->set_transparent_pen(0); + state->m_pf1_layer->set_transparent_pen(0); + state->m_pf1_wide_layer->set_transparent_pen(0); state_save_register_global_array(machine, state->m_video_control_data); } @@ -133,13 +133,13 @@ state->m_pf2_layer = tilemap_create(machine, dynablsb_get_pf2_tile_info, tilemap_scan_rows,8,8,64,64); state->m_pf2_wide_layer = tilemap_create(machine, dynablsb_get_pf2w_tile_info,tilemap_scan_rows,8,8,128,64); - tilemap_set_transparent_pen(state->m_pf2_layer,0); - tilemap_set_transparent_pen(state->m_pf2_wide_layer,0); + state->m_pf2_layer->set_transparent_pen(0); + state->m_pf2_wide_layer->set_transparent_pen(0); state_save_register_global_array(machine, state->m_video_control_data); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m90_state *state = machine.driver_data(); UINT16 *spriteram = state->m_video_data + 0xee00/2;; @@ -193,7 +193,7 @@ } } -static void bomblord_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void bomblord_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m90_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -233,7 +233,7 @@ } } -static void dynablsb_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void dynablsb_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m90_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -283,7 +283,7 @@ offset -= page * 0x2000; if (offset >= 0 && offset < 0x2000) - tilemap_mark_tile_dirty(tmap,offset/2); + tmap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( m90_video_w ) @@ -297,9 +297,9 @@ markdirty(state->m_pf2_wide_layer,state->m_video_control_data[6] & 0x2,offset); } -SCREEN_UPDATE( m90 ) +SCREEN_UPDATE_IND16( m90 ) { - m90_state *state = screen->machine().driver_data(); + m90_state *state = screen.machine().driver_data(); UINT8 pf1_base = state->m_video_control_data[5] & 0x3; UINT8 pf2_base = state->m_video_control_data[6] & 0x3; int i,pf1_enable,pf2_enable, video_enable; @@ -308,21 +308,21 @@ if (state->m_video_control_data[5]&0x10) pf1_enable=0; else pf1_enable=1; if (state->m_video_control_data[6]&0x10) pf2_enable=0; else pf2_enable=1; -// tilemap_set_enable(state->m_pf1_layer,pf1_enable); -// tilemap_set_enable(state->m_pf2_layer,pf2_enable); -// tilemap_set_enable(state->m_pf1_wide_layer,pf1_enable); -// tilemap_set_enable(state->m_pf2_wide_layer,pf2_enable); +// state->m_pf1_layer->enable(pf1_enable); +// state->m_pf2_layer->enable(pf2_enable); +// state->m_pf1_wide_layer->enable(pf1_enable); +// state->m_pf2_wide_layer->enable(pf2_enable); /* Dirty tilemaps if VRAM base changes */ if (pf1_base!=state->m_last_pf1) { - tilemap_mark_all_tiles_dirty(state->m_pf1_layer); - tilemap_mark_all_tiles_dirty(state->m_pf1_wide_layer); + state->m_pf1_layer->mark_all_dirty(); + state->m_pf1_wide_layer->mark_all_dirty(); } if (pf2_base!=state->m_last_pf2) { - tilemap_mark_all_tiles_dirty(state->m_pf2_layer); - tilemap_mark_all_tiles_dirty(state->m_pf2_wide_layer); + state->m_pf2_layer->mark_all_dirty(); + state->m_pf2_wide_layer->mark_all_dirty(); } state->m_last_pf1=pf1_base; state->m_last_pf2=pf2_base; @@ -330,40 +330,40 @@ /* Setup scrolling */ if (state->m_video_control_data[5]&0x20) { - tilemap_set_scroll_rows(state->m_pf1_layer,512); - tilemap_set_scroll_rows(state->m_pf1_wide_layer,512); + state->m_pf1_layer->set_scroll_rows(512); + state->m_pf1_wide_layer->set_scroll_rows(512); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf1_layer,i, state->m_video_data[0xf000/2+i]+2); + state->m_pf1_layer->set_scrollx(i, state->m_video_data[0xf000/2+i]+2); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf1_wide_layer,i, state->m_video_data[0xf000/2+i]+256+2); + state->m_pf1_wide_layer->set_scrollx(i, state->m_video_data[0xf000/2+i]+256+2); } else { - tilemap_set_scroll_rows(state->m_pf1_layer,1); - tilemap_set_scroll_rows(state->m_pf1_wide_layer,1); - tilemap_set_scrollx( state->m_pf1_layer,0, state->m_video_control_data[1]+2); - tilemap_set_scrollx( state->m_pf1_wide_layer,0, state->m_video_control_data[1]+256+2); + state->m_pf1_layer->set_scroll_rows(1); + state->m_pf1_wide_layer->set_scroll_rows(1); + state->m_pf1_layer->set_scrollx(0, state->m_video_control_data[1]+2); + state->m_pf1_wide_layer->set_scrollx(0, state->m_video_control_data[1]+256+2); } /* Setup scrolling */ if (state->m_video_control_data[6]&0x20) { - tilemap_set_scroll_rows(state->m_pf2_layer,512); - tilemap_set_scroll_rows(state->m_pf2_wide_layer,512); + state->m_pf2_layer->set_scroll_rows(512); + state->m_pf2_wide_layer->set_scroll_rows(512); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf2_layer,i, state->m_video_data[0xf400/2+i]-2); + state->m_pf2_layer->set_scrollx(i, state->m_video_data[0xf400/2+i]-2); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf2_wide_layer,i, state->m_video_data[0xf400/2+i]+256-2); + state->m_pf2_wide_layer->set_scrollx(i, state->m_video_data[0xf400/2+i]+256-2); } else { - tilemap_set_scroll_rows(state->m_pf2_layer,1); - tilemap_set_scroll_rows(state->m_pf2_wide_layer,1); - tilemap_set_scrollx( state->m_pf2_layer,0, state->m_video_control_data[3]-2); - tilemap_set_scrollx( state->m_pf2_wide_layer,0, state->m_video_control_data[3]+256-2 ); + state->m_pf2_layer->set_scroll_rows(1); + state->m_pf2_wide_layer->set_scroll_rows(1); + state->m_pf2_layer->set_scrollx(0, state->m_video_control_data[3]-2); + state->m_pf2_wide_layer->set_scrollx(0, state->m_video_control_data[3]+256-2 ); } - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); if (video_enable) { @@ -375,8 +375,8 @@ { int line; rectangle clip; - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; for(line = 0; line < 512; line++) { @@ -384,13 +384,13 @@ if (state->m_video_control_data[6] & 0x4) { - tilemap_set_scrolly(state->m_pf2_wide_layer, 0, 0x200 + state->m_video_data[0xfc00/2 + line]); - tilemap_draw(bitmap,&clip,state->m_pf2_wide_layer,0,0); - tilemap_draw(bitmap,&clip,state->m_pf2_wide_layer,1,1); + state->m_pf2_wide_layer->set_scrolly(0, 0x200 + state->m_video_data[0xfc00/2 + line]); + state->m_pf2_wide_layer->draw(bitmap, clip, 0,0); + state->m_pf2_wide_layer->draw(bitmap, clip, 1,1); } else { - tilemap_set_scrolly(state->m_pf2_layer, 0, 0x200 + state->m_video_data[0xfc00/2 + line]); - tilemap_draw(bitmap,&clip,state->m_pf2_layer,0,0); - tilemap_draw(bitmap,&clip,state->m_pf2_layer,1,1); + state->m_pf2_layer->set_scrolly(0, 0x200 + state->m_video_data[0xfc00/2 + line]); + state->m_pf2_layer->draw(bitmap, clip, 0,0); + state->m_pf2_layer->draw(bitmap, clip, 1,1); } } } @@ -398,19 +398,19 @@ { if (state->m_video_control_data[6] & 0x4) { - tilemap_set_scrolly( state->m_pf2_wide_layer,0, state->m_video_control_data[2] ); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,1,1); + state->m_pf2_wide_layer->set_scrolly(0, state->m_video_control_data[2] ); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_set_scrolly( state->m_pf2_layer,0, state->m_video_control_data[2] ); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,1,1); + state->m_pf2_layer->set_scrolly(0, state->m_video_control_data[2] ); + state->m_pf2_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_layer->draw(bitmap, cliprect, 1,1); } } } else { - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } if (pf1_enable) @@ -420,8 +420,8 @@ { int line; rectangle clip; - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; for(line = 0; line < 512; line++) { @@ -429,13 +429,13 @@ if (state->m_video_control_data[5] & 0x4) { - tilemap_set_scrolly(state->m_pf1_wide_layer, 0, 0x200 + state->m_video_data[0xf800/2 + line]); - tilemap_draw(bitmap,&clip,state->m_pf1_wide_layer,0,0); - tilemap_draw(bitmap,&clip,state->m_pf1_wide_layer,1,1); + state->m_pf1_wide_layer->set_scrolly(0, 0x200 + state->m_video_data[0xf800/2 + line]); + state->m_pf1_wide_layer->draw(bitmap, clip, 0,0); + state->m_pf1_wide_layer->draw(bitmap, clip, 1,1); } else { - tilemap_set_scrolly(state->m_pf1_layer, 0, 0x200 + state->m_video_data[0xf800/2 + line]); - tilemap_draw(bitmap,&clip,state->m_pf1_layer,0,0); - tilemap_draw(bitmap,&clip,state->m_pf1_layer,1,1); + state->m_pf1_layer->set_scrolly(0, 0x200 + state->m_video_data[0xf800/2 + line]); + state->m_pf1_layer->draw(bitmap, clip, 0,0); + state->m_pf1_layer->draw(bitmap, clip, 1,1); } } } @@ -443,118 +443,118 @@ { if (state->m_video_control_data[5] & 0x4) { - tilemap_set_scrolly( state->m_pf1_wide_layer,0, state->m_video_control_data[0] ); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,1,1); + state->m_pf1_wide_layer->set_scrolly(0, state->m_video_control_data[0] ); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_set_scrolly( state->m_pf1_layer,0, state->m_video_control_data[0] ); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,1,1); + state->m_pf1_layer->set_scrolly(0, state->m_video_control_data[0] ); + state->m_pf1_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_layer->draw(bitmap, cliprect, 1,1); } } } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); } else { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); } return 0; } -SCREEN_UPDATE( bomblord ) +SCREEN_UPDATE_IND16( bomblord ) { - m90_state *state = screen->machine().driver_data(); + m90_state *state = screen.machine().driver_data(); int i; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* Setup scrolling */ if (state->m_video_control_data[6]&0x20) { - tilemap_set_scroll_rows(state->m_pf1_layer,512); - tilemap_set_scroll_rows(state->m_pf1_wide_layer,512); + state->m_pf1_layer->set_scroll_rows(512); + state->m_pf1_wide_layer->set_scroll_rows(512); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf1_layer,i, state->m_video_data[0xf400/2+i]-12); + state->m_pf1_layer->set_scrollx(i, state->m_video_data[0xf400/2+i]-12); for (i=0; i<512; i++) - tilemap_set_scrollx( state->m_pf1_wide_layer,i, state->m_video_data[0xf400/2+i]-12+256); + state->m_pf1_wide_layer->set_scrollx(i, state->m_video_data[0xf400/2+i]-12+256); } else { - tilemap_set_scroll_rows(state->m_pf1_layer,1); - tilemap_set_scroll_rows(state->m_pf1_wide_layer,1); - tilemap_set_scrollx( state->m_pf1_layer,0, state->m_video_data[0xf004/2]-12); - tilemap_set_scrollx( state->m_pf1_wide_layer,0, state->m_video_data[0xf004/2]-12 ); + state->m_pf1_layer->set_scroll_rows(1); + state->m_pf1_wide_layer->set_scroll_rows(1); + state->m_pf1_layer->set_scrollx(0, state->m_video_data[0xf004/2]-12); + state->m_pf1_wide_layer->set_scrollx(0, state->m_video_data[0xf004/2]-12 ); } if (state->m_video_control_data[6] & 0x02) { - tilemap_mark_all_tiles_dirty(state->m_pf2_wide_layer); - tilemap_set_scrollx( state->m_pf2_wide_layer,0, state->m_video_data[0xf000/2]-16 ); - tilemap_set_scrolly( state->m_pf2_wide_layer,0, state->m_video_data[0xf008/2]+388 ); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,1,1); + state->m_pf2_wide_layer->mark_all_dirty(); + state->m_pf2_wide_layer->set_scrollx(0, state->m_video_data[0xf000/2]-16 ); + state->m_pf2_wide_layer->set_scrolly(0, state->m_video_data[0xf008/2]+388 ); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_mark_all_tiles_dirty(state->m_pf2_layer); - tilemap_set_scrollx( state->m_pf2_layer,0, state->m_video_data[0xf000/2]-16 ); - tilemap_set_scrolly( state->m_pf2_layer,0, state->m_video_data[0xf008/2]-120 ); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,1,1); + state->m_pf2_layer->mark_all_dirty(); + state->m_pf2_layer->set_scrollx(0, state->m_video_data[0xf000/2]-16 ); + state->m_pf2_layer->set_scrolly(0, state->m_video_data[0xf008/2]-120 ); + state->m_pf2_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_layer->draw(bitmap, cliprect, 1,1); } if (state->m_video_control_data[6] & 0x04) { - tilemap_mark_all_tiles_dirty(state->m_pf1_wide_layer); - tilemap_set_scrolly( state->m_pf1_wide_layer,0, state->m_video_data[0xf00c/2]+392 ); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,1,1); + state->m_pf1_wide_layer->mark_all_dirty(); + state->m_pf1_wide_layer->set_scrolly(0, state->m_video_data[0xf00c/2]+392 ); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_mark_all_tiles_dirty(state->m_pf1_layer); - tilemap_set_scrolly( state->m_pf1_layer,0, state->m_video_data[0xf00c/2]-116 ); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,1,1); + state->m_pf1_layer->mark_all_dirty(); + state->m_pf1_layer->set_scrolly(0, state->m_video_data[0xf00c/2]-116 ); + state->m_pf1_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_layer->draw(bitmap, cliprect, 1,1); } - bomblord_draw_sprites(screen->machine(),bitmap,cliprect); + bomblord_draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( dynablsb ) +SCREEN_UPDATE_IND16( dynablsb ) { - m90_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + m90_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!(state->m_video_data[0xf008/2] & 0x4000)) { - tilemap_mark_all_tiles_dirty(state->m_pf1_wide_layer); - tilemap_set_scroll_rows(state->m_pf1_wide_layer,1); - tilemap_set_scrollx( state->m_pf1_wide_layer,0, state->m_video_data[0xf004/2]+64); - tilemap_set_scrolly( state->m_pf1_wide_layer,0, state->m_video_data[0xf006/2]+512); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_wide_layer,1,1); + state->m_pf1_wide_layer->mark_all_dirty(); + state->m_pf1_wide_layer->set_scroll_rows(1); + state->m_pf1_wide_layer->set_scrollx(0, state->m_video_data[0xf004/2]+64); + state->m_pf1_wide_layer->set_scrolly(0, state->m_video_data[0xf006/2]+512); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_mark_all_tiles_dirty(state->m_pf1_layer); - tilemap_set_scroll_rows(state->m_pf1_layer,1); - tilemap_set_scrollx( state->m_pf1_layer,0, state->m_video_data[0xf004/2]+64); - tilemap_set_scrolly( state->m_pf1_layer,0, state->m_video_data[0xf006/2]+4); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_layer,1,1); + state->m_pf1_layer->mark_all_dirty(); + state->m_pf1_layer->set_scroll_rows(1); + state->m_pf1_layer->set_scrollx(0, state->m_video_data[0xf004/2]+64); + state->m_pf1_layer->set_scrolly(0, state->m_video_data[0xf006/2]+4); + state->m_pf1_layer->draw(bitmap, cliprect, 0,0); + state->m_pf1_layer->draw(bitmap, cliprect, 1,1); } if (!(state->m_video_data[0xf008/2] & 0x8000)) { - tilemap_mark_all_tiles_dirty(state->m_pf2_wide_layer); - tilemap_set_scroll_rows(state->m_pf2_wide_layer,1); - tilemap_set_scrollx( state->m_pf2_wide_layer,0, state->m_video_data[0xf000/2]+68); - tilemap_set_scrolly( state->m_pf2_wide_layer,0, state->m_video_data[0xf002/2]+512); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_wide_layer,1,1); + state->m_pf2_wide_layer->mark_all_dirty(); + state->m_pf2_wide_layer->set_scroll_rows(1); + state->m_pf2_wide_layer->set_scrollx(0, state->m_video_data[0xf000/2]+68); + state->m_pf2_wide_layer->set_scrolly(0, state->m_video_data[0xf002/2]+512); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_wide_layer->draw(bitmap, cliprect, 1,1); } else { - tilemap_mark_all_tiles_dirty(state->m_pf2_layer); - tilemap_set_scroll_rows(state->m_pf2_layer,1); - tilemap_set_scrollx( state->m_pf2_layer,0, state->m_video_data[0xf000/2]+68); - tilemap_set_scrolly( state->m_pf2_layer,0, state->m_video_data[0xf002/2]+4); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,0,0); - tilemap_draw(bitmap,cliprect,state->m_pf2_layer,1,1); + state->m_pf2_layer->mark_all_dirty(); + state->m_pf2_layer->set_scroll_rows(1); + state->m_pf2_layer->set_scrollx(0, state->m_video_data[0xf000/2]+68); + state->m_pf2_layer->set_scrolly(0, state->m_video_data[0xf002/2]+4); + state->m_pf2_layer->draw(bitmap, cliprect, 0,0); + state->m_pf2_layer->draw(bitmap, cliprect, 1,1); } - dynablsb_draw_sprites(screen->machine(),bitmap,cliprect); + dynablsb_draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/m92.c mame-0.145/src/mame/video/m92.c --- mame-0.144/src/mame/video/m92.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/m92.c 2012-02-06 21:30:31.000000000 +0000 @@ -155,9 +155,9 @@ tile, attrib & 0x7f, TILE_FLIPYX(attrib >> 9)); - if (attrib & 0x100) tileinfo->group = 2; - else if (attrib & 0x80) tileinfo->group = 1; - else tileinfo->group = 0; + if (attrib & 0x100) tileinfo.group = 2; + else if (attrib & 0x80) tileinfo.group = 1; + else tileinfo.group = 0; } /*****************************************************************************/ @@ -173,11 +173,11 @@ { if ((offset & 0x6000) == state->m_pf_layer[laynum].vram_base) { - tilemap_mark_tile_dirty(state->m_pf_layer[laynum].tmap, (offset & 0x1fff) / 2); - tilemap_mark_tile_dirty(state->m_pf_layer[laynum].wide_tmap, (offset & 0x3fff) / 2); + state->m_pf_layer[laynum].tmap->mark_tile_dirty((offset & 0x1fff) / 2); + state->m_pf_layer[laynum].wide_tmap->mark_tile_dirty((offset & 0x3fff) / 2); } if ((offset & 0x6000) == state->m_pf_layer[laynum].vram_base + 0x2000) - tilemap_mark_tile_dirty(state->m_pf_layer[laynum].wide_tmap, (offset & 0x3fff) / 2); + state->m_pf_layer[laynum].wide_tmap->mark_tile_dirty((offset & 0x3fff) / 2); } } @@ -222,20 +222,20 @@ /* update size (bit 2) */ if (state->m_pf_master_control[offset] & 0x04) { - tilemap_set_enable(layer->tmap, FALSE); - tilemap_set_enable(layer->wide_tmap, (~state->m_pf_master_control[offset] >> 4) & 1); + layer->tmap->enable(FALSE); + layer->wide_tmap->enable((~state->m_pf_master_control[offset] >> 4) & 1); } else { - tilemap_set_enable(layer->tmap, (~state->m_pf_master_control[offset] >> 4) & 1); - tilemap_set_enable(layer->wide_tmap, FALSE); + layer->tmap->enable((~state->m_pf_master_control[offset] >> 4) & 1); + layer->wide_tmap->enable(FALSE); } /* mark everything dirty of the VRAM base or size changes */ if ((old ^ state->m_pf_master_control[offset]) & 0x07) { - tilemap_mark_all_tiles_dirty(layer->tmap); - tilemap_mark_all_tiles_dirty(layer->wide_tmap); + layer->tmap->mark_all_dirty(); + layer->wide_tmap->mark_all_dirty(); } break; @@ -262,26 +262,26 @@ layer->wide_tmap = tilemap_create(machine, get_pf_tile_info, tilemap_scan_rows, 8,8, 128,64); /* set the user data for each one to point to the layer */ - tilemap_set_user_data(layer->tmap, &state->m_pf_layer[laynum]); - tilemap_set_user_data(layer->wide_tmap, &state->m_pf_layer[laynum]); + layer->tmap->set_user_data(&state->m_pf_layer[laynum]); + layer->wide_tmap->set_user_data(&state->m_pf_layer[laynum]); /* set scroll offsets */ - tilemap_set_scrolldx(layer->tmap, 2 * laynum, -2 * laynum + 8); - tilemap_set_scrolldy(layer->tmap, -128, -128); - tilemap_set_scrolldx(layer->wide_tmap, 2 * laynum - 256, -2 * laynum + 8 - 256); - tilemap_set_scrolldy(layer->wide_tmap, -128, -128); + layer->tmap->set_scrolldx(2 * laynum, -2 * laynum + 8); + layer->tmap->set_scrolldy(-128, -128); + layer->wide_tmap->set_scrolldx(2 * laynum - 256, -2 * laynum + 8 - 256); + layer->wide_tmap->set_scrolldy(-128, -128); /* layer group 0 - totally transparent in front half */ - tilemap_set_transmask(layer->tmap, 0, 0xffff, (laynum == 2) ? 0x0000 : 0x0001); - tilemap_set_transmask(layer->wide_tmap, 0, 0xffff, (laynum == 2) ? 0x0000 : 0x0001); + layer->tmap->set_transmask(0, 0xffff, (laynum == 2) ? 0x0000 : 0x0001); + layer->wide_tmap->set_transmask(0, 0xffff, (laynum == 2) ? 0x0000 : 0x0001); /* layer group 1 - pens 0-7 transparent in front half */ - tilemap_set_transmask(layer->tmap, 1, 0x00ff, (laynum == 2) ? 0xff00 : 0xff01); - tilemap_set_transmask(layer->wide_tmap, 1, 0x00ff, (laynum == 2) ? 0xff00 : 0xff01); + layer->tmap->set_transmask(1, 0x00ff, (laynum == 2) ? 0xff00 : 0xff01); + layer->wide_tmap->set_transmask(1, 0x00ff, (laynum == 2) ? 0xff00 : 0xff01); /* layer group 2 - pen 0 transparent in front half */ - tilemap_set_transmask(layer->tmap, 2, 0x0001, (laynum == 2) ? 0xfffe : 0xffff); - tilemap_set_transmask(layer->wide_tmap, 2, 0x0001, (laynum == 2) ? 0xfffe : 0xffff); + layer->tmap->set_transmask(2, 0x0001, (laynum == 2) ? 0xfffe : 0xffff); + layer->wide_tmap->set_transmask(2, 0x0001, (laynum == 2) ? 0xfffe : 0xffff); state_save_register_item(machine, "layer", NULL, laynum, layer->vram_base); state_save_register_item_array(machine, "layer", NULL, laynum, layer->control); @@ -314,16 +314,16 @@ pf_layer_info *layer = &state->m_pf_layer[laynum]; /* set scroll offsets */ - tilemap_set_scrolldx(layer->tmap, 2 * laynum + 11, -2 * laynum + 11); - tilemap_set_scrolldy(layer->tmap, -8, -8); - tilemap_set_scrolldx(layer->wide_tmap, 2 * laynum - 256 + 11, -2 * laynum + 11 - 256); - tilemap_set_scrolldy(layer->wide_tmap, -8, -8); + layer->tmap->set_scrolldx(2 * laynum + 11, -2 * laynum + 11); + layer->tmap->set_scrolldy(-8, -8); + layer->wide_tmap->set_scrolldx(2 * laynum - 256 + 11, -2 * laynum + 11 - 256); + layer->wide_tmap->set_scrolldy(-8, -8); } } /*****************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m92_state *state = machine.driver_data(); UINT16 *source = machine.generic.buffered_spriteram.u16; @@ -397,7 +397,7 @@ } // This needs a lot of work... -static void ppan_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void ppan_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { m92_state *state = machine.driver_data(); UINT16 *source = machine.generic.spriteram.u16; // sprite buffer control is never triggered @@ -498,83 +498,83 @@ { const UINT16 *scrolldata = state->m_vram_data + (0xf400 + 0x400 * laynum) / 2; - tilemap_set_scroll_rows(layer->tmap, 512); - tilemap_set_scroll_rows(layer->wide_tmap, 512); + layer->tmap->set_scroll_rows(512); + layer->wide_tmap->set_scroll_rows(512); for (i = 0; i < 512; i++) { - tilemap_set_scrollx(layer->tmap, i, scrolldata[i]); - tilemap_set_scrollx(layer->wide_tmap, i, scrolldata[i]); + layer->tmap->set_scrollx(i, scrolldata[i]); + layer->wide_tmap->set_scrollx(i, scrolldata[i]); } } else { - tilemap_set_scroll_rows(layer->tmap, 1); - tilemap_set_scroll_rows(layer->wide_tmap, 1); - tilemap_set_scrollx(layer->tmap, 0, layer->control[2]); - tilemap_set_scrollx(layer->wide_tmap, 0, layer->control[2]); + layer->tmap->set_scroll_rows(1); + layer->wide_tmap->set_scroll_rows(1); + layer->tmap->set_scrollx(0, layer->control[2]); + layer->wide_tmap->set_scrollx(0, layer->control[2]); } - tilemap_set_scrolly(layer->tmap, 0, layer->control[0]); - tilemap_set_scrolly(layer->wide_tmap, 0, layer->control[0]); + layer->tmap->set_scrolly(0, layer->control[0]); + layer->wide_tmap->set_scrolly(0, layer->control[0]); } } /*****************************************************************************/ -static void m92_draw_tiles(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void m92_draw_tiles(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { m92_state *state = machine.driver_data(); if ((~state->m_pf_master_control[2] >> 4) & 1) { - tilemap_draw(bitmap, cliprect, state->m_pf_layer[2].wide_tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[2].tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[2].wide_tmap, TILEMAP_DRAW_LAYER0, 1); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[2].tmap, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[2].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[2].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[2].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[2].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); } - tilemap_draw(bitmap, cliprect, state->m_pf_layer[1].wide_tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[1].tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[1].wide_tmap, TILEMAP_DRAW_LAYER0, 1); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[1].tmap, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[1].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[1].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[1].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[1].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].wide_tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].tmap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].wide_tmap, TILEMAP_DRAW_LAYER0, 1); - tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].tmap, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[0].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[0].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_pf_layer[0].wide_tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); + state->m_pf_layer[0].tmap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); } -SCREEN_UPDATE( m92 ) +SCREEN_UPDATE_IND16( m92 ) { - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); - m92_update_scroll_positions(screen->machine()); - m92_draw_tiles(screen->machine(), bitmap, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); + m92_update_scroll_positions(screen.machine()); + m92_draw_tiles(screen.machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); /* Flipscreen appears hardwired to the dipswitch - strange */ - if (input_port_read(screen->machine(), "DSW") & 0x100) - flip_screen_set(screen->machine(), 0); + if (input_port_read(screen.machine(), "DSW") & 0x100) + flip_screen_set(screen.machine(), 0); else - flip_screen_set(screen->machine(), 1); + flip_screen_set(screen.machine(), 1); return 0; } -SCREEN_UPDATE( ppan ) +SCREEN_UPDATE_IND16( ppan ) { - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); - m92_update_scroll_positions(screen->machine()); - m92_draw_tiles(screen->machine(), bitmap, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); + m92_update_scroll_positions(screen.machine()); + m92_draw_tiles(screen.machine(), bitmap, cliprect); - ppan_draw_sprites(screen->machine(), bitmap, cliprect); + ppan_draw_sprites(screen.machine(), bitmap, cliprect); /* Flipscreen appears hardwired to the dipswitch - strange */ - if (input_port_read(screen->machine(), "DSW") & 0x100) - flip_screen_set(screen->machine(), 0); + if (input_port_read(screen.machine(), "DSW") & 0x100) + flip_screen_set(screen.machine(), 0); else - flip_screen_set(screen->machine(), 1); + flip_screen_set(screen.machine(), 1); return 0; } diff -Nru mame-0.144/src/mame/video/macrossp.c mame-0.145/src/mame/video/macrossp.c --- mame-0.144/src/mame/video/macrossp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/macrossp.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,7 +12,7 @@ COMBINE_DATA(&state->m_scra_videoram[offset]); - tilemap_mark_tile_dirty(state->m_scra_tilemap, offset); + state->m_scra_tilemap->mark_tile_dirty(offset); } @@ -50,7 +50,7 @@ COMBINE_DATA(&state->m_scrb_videoram[offset]); - tilemap_mark_tile_dirty(state->m_scrb_tilemap, offset); + state->m_scrb_tilemap->mark_tile_dirty(offset); } @@ -88,7 +88,7 @@ COMBINE_DATA(&state->m_scrc_videoram[offset]); - tilemap_mark_tile_dirty(state->m_scrc_tilemap, offset); + state->m_scrc_tilemap->mark_tile_dirty(offset); } @@ -126,7 +126,7 @@ COMBINE_DATA(&state->m_text_videoram[offset]); - tilemap_mark_tile_dirty(state->m_text_tilemap, offset); + state->m_text_tilemap->mark_tile_dirty(offset); } @@ -157,10 +157,10 @@ state->m_scrb_tilemap = tilemap_create(machine, get_macrossp_scrb_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_scrc_tilemap = tilemap_create(machine, get_macrossp_scrc_tile_info, tilemap_scan_rows, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); - tilemap_set_transparent_pen(state->m_scra_tilemap, 0); - tilemap_set_transparent_pen(state->m_scrb_tilemap, 0); - tilemap_set_transparent_pen(state->m_scrc_tilemap, 0); + state->m_text_tilemap->set_transparent_pen(0); + state->m_scra_tilemap->set_transparent_pen(0); + state->m_scrb_tilemap->set_transparent_pen(0); + state->m_scrc_tilemap->set_transparent_pen(0); machine.gfx[0]->color_granularity = 64; machine.gfx[1]->color_granularity = 64; @@ -173,7 +173,7 @@ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority ) { macrossp_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -320,7 +320,7 @@ } -static void draw_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer ) +static void draw_layer( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer ) { macrossp_state *state = machine.driver_data(); tilemap_t *tm; @@ -358,16 +358,16 @@ startx -= (368/2) * inc; starty -= (240/2) * inc; - tilemap_draw_roz(bitmap,cliprect,tm, + tm->draw_roz(bitmap, cliprect, startx,starty,inc,0,0,inc, 1, /* wraparound */ 0,0); } else { - tilemap_set_scrollx( tm, 0, ((vr[0] & 0x000003ff) >> 0 ) ); - tilemap_set_scrolly( tm, 0, ((vr[0] & 0x03ff0000) >> 16) ); - tilemap_draw(bitmap, cliprect, tm, 0, 0); + tm->set_scrollx(0, ((vr[0] & 0x000003ff) >> 0 ) ); + tm->set_scrolly(0, ((vr[0] & 0x03ff0000) >> 16) ); + tm->draw(bitmap, cliprect, 0, 0); } } @@ -387,12 +387,12 @@ SWAP(1,2) } -SCREEN_UPDATE( macrossp ) +SCREEN_UPDATE_RGB32( macrossp ) { - macrossp_state *state = screen->machine().driver_data(); + macrossp_state *state = screen.machine().driver_data(); int layers[3],layerpri[3]; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); layers[0] = 0; layerpri[0] = (state->m_scra_videoregs[0] & 0x0000c000) >> 14; @@ -403,14 +403,14 @@ sortlayers(layers, layerpri); - draw_layer(screen->machine(), bitmap, cliprect, layers[0]); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - draw_layer(screen->machine(), bitmap, cliprect, layers[1]); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - draw_layer(screen->machine(), bitmap, cliprect, layers[2]); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + draw_layer(screen.machine(), bitmap, cliprect, layers[0]); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + draw_layer(screen.machine(), bitmap, cliprect, layers[1]); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + draw_layer(screen.machine(), bitmap, cliprect, layers[2]); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); #if 0 popmessage ("scra - %08x %08x %08x\nscrb - %08x %08x %08x\nscrc - %08x %08x %08x", @@ -429,11 +429,15 @@ return 0; } -SCREEN_EOF( macrossp ) +SCREEN_VBLANK( macrossp ) { - macrossp_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + macrossp_state *state = screen.machine().driver_data(); - /* looks like sprites are *two* frames ahead, like nmk16 */ - memcpy(state->m_spriteram_old2, state->m_spriteram_old, state->m_spriteram_size); - memcpy(state->m_spriteram_old, state->m_spriteram, state->m_spriteram_size); + /* looks like sprites are *two* frames ahead, like nmk16 */ + memcpy(state->m_spriteram_old2, state->m_spriteram_old, state->m_spriteram_size); + memcpy(state->m_spriteram_old, state->m_spriteram, state->m_spriteram_size); + } } diff -Nru mame-0.144/src/mame/video/madalien.c mame-0.145/src/mame/video/madalien.c --- mame-0.144/src/mame/video/madalien.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/madalien.c 2012-02-06 21:30:31.000000000 +0000 @@ -116,7 +116,7 @@ { madalien_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_fg, offset); + state->m_tilemap_fg->mark_tile_dirty(offset); } @@ -136,38 +136,38 @@ }; state->m_tilemap_fg = tilemap_create(machine, get_tile_info_FG, tilemap_scan_cols_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap_fg, 0); - tilemap_set_scrolldx(state->m_tilemap_fg, 0, 0x50); - tilemap_set_scrolldy(state->m_tilemap_fg, 0, 0x20); + state->m_tilemap_fg->set_transparent_pen(0); + state->m_tilemap_fg->set_scrolldx(0, 0x50); + state->m_tilemap_fg->set_scrolldy(0, 0x20); for (i = 0; i < 4; i++) { state->m_tilemap_edge1[i] = tilemap_create(machine, get_tile_info_BG_1, scan_functions[i], 16, 16, tilemap_cols[i], 8); - tilemap_set_scrolldx(state->m_tilemap_edge1[i], 0, 0x50); - tilemap_set_scrolldy(state->m_tilemap_edge1[i], 0, 0x20); + state->m_tilemap_edge1[i]->set_scrolldx(0, 0x50); + state->m_tilemap_edge1[i]->set_scrolldy(0, 0x20); state->m_tilemap_edge2[i] = tilemap_create(machine, get_tile_info_BG_2, scan_functions[i], 16, 16, tilemap_cols[i], 8); - tilemap_set_scrolldx(state->m_tilemap_edge2[i], 0, 0x50); - tilemap_set_scrolldy(state->m_tilemap_edge2[i], 0, machine.primary_screen->height() - 256); + state->m_tilemap_edge2[i]->set_scrolldx(0, 0x50); + state->m_tilemap_edge2[i]->set_scrolldy(0, machine.primary_screen->height() - 256); } - state->m_headlight_bitmap = auto_bitmap_alloc(machine, 128, 128, BITMAP_FORMAT_INDEXED16); + state->m_headlight_bitmap = auto_bitmap_ind16_alloc(machine, 128, 128); gfx_element_set_source(machine.gfx[0], state->m_charram); - drawgfx_opaque(state->m_headlight_bitmap, NULL, machine.gfx[2], 0, 0, 0, 0, 0x00, 0x00); - drawgfx_opaque(state->m_headlight_bitmap, NULL, machine.gfx[2], 0, 0, 0, 1, 0x00, 0x40); + drawgfx_opaque(*state->m_headlight_bitmap, state->m_headlight_bitmap->cliprect(), machine.gfx[2], 0, 0, 0, 0, 0x00, 0x00); + drawgfx_opaque(*state->m_headlight_bitmap, state->m_headlight_bitmap->cliprect(), machine.gfx[2], 0, 0, 0, 1, 0x00, 0x40); } -static void draw_edges(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int flip, int scroll_mode) +static void draw_edges(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int flip, int scroll_mode) { madalien_state *state = machine.driver_data(); rectangle clip_edge1; rectangle clip_edge2; - clip_edge1 = *cliprect; - clip_edge2 = *cliprect; + clip_edge1 = cliprect; + clip_edge2 = cliprect; if (flip) { @@ -180,26 +180,26 @@ clip_edge2.min_y = *state->m_edge2_pos | 0x80; } - sect_rect(&clip_edge1, cliprect); - sect_rect(&clip_edge2, cliprect); + clip_edge1 &= cliprect; + clip_edge2 &= cliprect; - tilemap_mark_all_tiles_dirty(state->m_tilemap_edge1[scroll_mode]); - tilemap_mark_all_tiles_dirty(state->m_tilemap_edge2[scroll_mode]); + state->m_tilemap_edge1[scroll_mode]->mark_all_dirty(); + state->m_tilemap_edge2[scroll_mode]->mark_all_dirty(); - tilemap_set_flip(state->m_tilemap_edge1[scroll_mode], flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_scrollx(state->m_tilemap_edge1[scroll_mode], 0, -(*state->m_scroll & 0xfc)); - tilemap_set_scrolly(state->m_tilemap_edge1[scroll_mode], 0, *state->m_edge1_pos & 0x7f); - - tilemap_set_flip(state->m_tilemap_edge2[scroll_mode], flip ? TILEMAP_FLIPX : TILEMAP_FLIPY); - tilemap_set_scrollx(state->m_tilemap_edge2[scroll_mode], 0, -(*state->m_scroll & 0xfc)); - tilemap_set_scrolly(state->m_tilemap_edge2[scroll_mode], 0, *state->m_edge2_pos & 0x7f); + state->m_tilemap_edge1[scroll_mode]->set_flip(flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tilemap_edge1[scroll_mode]->set_scrollx(0, -(*state->m_scroll & 0xfc)); + state->m_tilemap_edge1[scroll_mode]->set_scrolly(0, *state->m_edge1_pos & 0x7f); + + state->m_tilemap_edge2[scroll_mode]->set_flip(flip ? TILEMAP_FLIPX : TILEMAP_FLIPY); + state->m_tilemap_edge2[scroll_mode]->set_scrollx(0, -(*state->m_scroll & 0xfc)); + state->m_tilemap_edge2[scroll_mode]->set_scrolly(0, *state->m_edge2_pos & 0x7f); - tilemap_draw(bitmap, &clip_edge1, state->m_tilemap_edge1[scroll_mode], 0, 0); - tilemap_draw(bitmap, &clip_edge2, state->m_tilemap_edge2[scroll_mode], 0, 0); + state->m_tilemap_edge1[scroll_mode]->draw(bitmap, clip_edge1, 0, 0); + state->m_tilemap_edge2[scroll_mode]->draw(bitmap, clip_edge2, 0, 0); } -static void draw_headlight(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int flip) +static void draw_headlight(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int flip) { madalien_state *state = machine.driver_data(); if (BIT(*state->m_video_flags, 0)) @@ -214,7 +214,7 @@ if (flip) hy = ~hy; - if ((hy < cliprect->min_y) || (hy > cliprect->max_y)) + if ((hy < cliprect.min_y) || (hy > cliprect.max_y)) continue; for (x = 0; x < 0x80; x++) @@ -224,22 +224,22 @@ if (flip) hx = ~hx; - if ((hx < cliprect->min_x) || (hx > cliprect->max_x)) + if ((hx < cliprect.min_x) || (hx > cliprect.max_x)) continue; - if (*BITMAP_ADDR16(state->m_headlight_bitmap, y, x) != 0) - *BITMAP_ADDR16(bitmap, hy, hx) |= 8; + if (state->m_headlight_bitmap->pix16(y, x) != 0) + bitmap.pix16(hy, hx) |= 8; } } } } -static void draw_foreground(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int flip) +static void draw_foreground(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int flip) { madalien_state *state = machine.driver_data(); - tilemap_set_flip(state->m_tilemap_fg, flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_fg, 0, 0); + state->m_tilemap_fg->set_flip(flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 0); } @@ -251,10 +251,10 @@ } -static SCREEN_UPDATE( madalien ) +static SCREEN_UPDATE_IND16( madalien ) { - madalien_state *state = screen->machine().driver_data(); - int flip = BIT(input_port_read(screen->machine(), "DSW"), 6) && BIT(*state->m_video_control, 0); + madalien_state *state = screen.machine().driver_data(); + int flip = BIT(input_port_read(screen.machine(), "DSW"), 6) && BIT(*state->m_video_control, 0); // bits #0 and #1 define scrolling mode // @@ -265,9 +265,9 @@ // mode 3 - transition from A to B int scroll_mode = *state->m_scroll & 3; - bitmap_fill(bitmap, cliprect, 0); - draw_edges(screen->machine(), bitmap, cliprect, flip, scroll_mode); - draw_foreground(screen->machine(), bitmap, cliprect, flip); + bitmap.fill(0, cliprect); + draw_edges(screen.machine(), bitmap, cliprect, flip, scroll_mode); + draw_foreground(screen.machine(), bitmap, cliprect, flip); /* highlight section A (outside of tunnels). * also, bit 1 of the video_flags register (6A) is @@ -295,13 +295,13 @@ min_x = 0xff - max_x_save; } - for (y = cliprect->min_y; y <= cliprect->max_y ; y++) + for (y = cliprect.min_y; y <= cliprect.max_y ; y++) for (x = min_x; x <= max_x; x++) - if ((x >= cliprect->min_x) && (x <= cliprect->max_x)) - *BITMAP_ADDR16(bitmap, y, x) |= 8; + if ((x >= cliprect.min_x) && (x <= cliprect.max_x)) + bitmap.pix16(y, x) |= 8; } - draw_headlight(screen->machine(), bitmap, cliprect, flip); + draw_headlight(screen.machine(), bitmap, cliprect, flip); return 0; } @@ -398,8 +398,7 @@ MACHINE_CONFIG_FRAGMENT( madalien_video ) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 336, 0, 256, 288, 0, 256) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) - MCFG_SCREEN_UPDATE(madalien) + MCFG_SCREEN_UPDATE_STATIC(madalien) MCFG_GFXDECODE(madalien) MCFG_PALETTE_LENGTH(0x30) diff -Nru mame-0.144/src/mame/video/madmotor.c mame-0.145/src/mame/video/madmotor.c --- mame-0.144/src/mame/video/madmotor.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/madmotor.c 2012-02-06 21:30:31.000000000 +0000 @@ -22,16 +22,16 @@ /******************************************************************************/ -SCREEN_UPDATE( madmotor ) +SCREEN_UPDATE_IND16( madmotor ) { - madmotor_state *state = screen->machine().driver_data(); - flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); + madmotor_state *state = screen.machine().driver_data(); + flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); -// tilemap_set_flip_all(screen->machine(), screen->machine().device("tilegen1")->get_flip_state() ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); +// screen.machine().tilemap().set_flip_all(screen.machine().device("tilegen1")->get_flip_state() ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - screen->machine().device("tilegen3")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("tilegen2")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x00, 0x00, 0x0f); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen3")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("tilegen2")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 0x00, 0x00, 0x0f); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,0, 0x00, 0x00, 0x00, 0x00); return 0; } diff -Nru mame-0.144/src/mame/video/magmax.c mame-0.145/src/mame/video/magmax.c --- mame-0.144/src/mame/video/magmax.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/magmax.c 2012-02-06 21:30:31.000000000 +0000 @@ -72,9 +72,9 @@ state->m_prom_tab = auto_alloc_array(machine, UINT32, 256); - /* Allocate temporary bitmap */ - machine.generic.tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap); + /* Allocate temporary bitmap */ for (i=0; i<256; i++) { v = (prom14D[i] << 4) + prom14D[i + 0x100]; @@ -84,9 +84,9 @@ -SCREEN_UPDATE( magmax ) +SCREEN_UPDATE_IND16( magmax ) { - magmax_state *state = screen->machine().driver_data(); + magmax_state *state = screen.machine().driver_data(); UINT16 *videoram = state->m_videoram; UINT16 *spriteram16 = state->m_spriteram; int offs; @@ -96,16 +96,16 @@ /* copy the background graphics */ if (*state->m_vreg & 0x40) /* background disable */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); else { int v; - UINT8 * rom18B = screen->machine().region("user1")->base(); + UINT8 * rom18B = screen.machine().region("user1")->base(); UINT32 scroll_h = (*state->m_scroll_x) & 0x3fff; UINT32 scroll_v = (*state->m_scroll_y) & 0xff; /*clear background-over-sprites bitmap*/ - bitmap_fill(screen->machine().generic.tmpbitmap, NULL, 0); + state->m_bitmap.fill(0); for (v = 2*8; v < 30*8; v++) /*only for visible area*/ { @@ -156,7 +156,7 @@ /*priority: background over sprites*/ if (map_v_scr_100 && ((graph_data & 0x0c)==0x0c)) - *BITMAP_ADDR16(screen->machine().generic.tmpbitmap, v, h) = line_data[h]; + state->m_bitmap.pix16(v, h) = line_data[h]; } if (state->m_flipscreen) @@ -201,17 +201,17 @@ if (code & 0x80) /* sprite bankswitch */ code += (*state->m_vreg & 0x30) * 0x8; - drawgfx_transmask(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transmask(bitmap, cliprect, screen.machine().gfx[1], code, color, flipx, flipy, sx, sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color, 0x1f)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color, 0x1f)); } } if (!(*state->m_vreg & 0x40)) /* background disable */ - copybitmap_trans(bitmap, screen->machine().generic.tmpbitmap, state->m_flipscreen,state->m_flipscreen,0,0, cliprect, 0); + copybitmap_trans(bitmap, state->m_bitmap, state->m_flipscreen,state->m_flipscreen,0,0, cliprect, 0); /* draw the foreground characters */ for (offs = 32*32-1; offs >= 0; offs -= 1) @@ -231,7 +231,7 @@ sy = 31 - sy; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], code, 0, state->m_flipscreen, state->m_flipscreen, diff -Nru mame-0.144/src/mame/video/mainevt.c mame-0.145/src/mame/video/mainevt.c --- mame-0.144/src/mame/video/mainevt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mainevt.c 2012-02-06 21:30:33.000000000 +0000 @@ -93,13 +93,13 @@ /*****************************************************************************/ -SCREEN_UPDATE( mainevt ) +SCREEN_UPDATE_IND16( mainevt ) { - mainevt_state *state = screen->machine().driver_data(); + mainevt_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 2, 1, 2); /* low priority part of layer */ k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 2, 0, 4); /* high priority part of layer */ @@ -109,9 +109,9 @@ return 0; } -SCREEN_UPDATE( dv ) +SCREEN_UPDATE_IND16( dv ) { - mainevt_state *state = screen->machine().driver_data(); + mainevt_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); diff -Nru mame-0.144/src/mame/video/mainsnk.c mame-0.145/src/mame/video/mainsnk.c --- mame-0.144/src/mame/video/mainsnk.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mainsnk.c 2012-02-06 21:30:33.000000000 +0000 @@ -75,11 +75,11 @@ state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_scrolldx(state->m_bg_tilemap, 16, 16); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, 8); + state->m_bg_tilemap->set_scrolldx(16, 16); + state->m_bg_tilemap->set_scrolldy(8, 8); } @@ -91,8 +91,8 @@ flip_screen_set(space->machine(), ~data & 0x80); - tilemap_set_palette_offset(state->m_bg_tilemap, (data & 0x07) << 4); - tilemap_set_palette_offset(state->m_tx_tilemap, (data & 0x07) << 4); + state->m_bg_tilemap->set_palette_offset((data & 0x07) << 4); + state->m_tx_tilemap->set_palette_offset((data & 0x07) << 4); bank = 0; if (total_elements == 0x400) // mainsnk @@ -103,7 +103,7 @@ if (state->m_bg_tile_offset != (bank << 8)) { state->m_bg_tile_offset = bank << 8; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -112,7 +112,7 @@ mainsnk_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mainsnk_bgram_w ) @@ -120,12 +120,12 @@ mainsnk_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int scrollx, int scrolly ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int scrollx, int scrolly ) { mainsnk_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -168,13 +168,13 @@ } -SCREEN_UPDATE(mainsnk) +SCREEN_UPDATE_IND16(mainsnk) { - mainsnk_state *state = screen->machine().driver_data(); + mainsnk_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/malzak.c mame-0.145/src/mame/video/malzak.c --- mame-0.144/src/mame/video/malzak.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/malzak.c 2012-02-06 21:30:31.000000000 +0000 @@ -18,15 +18,13 @@ #include "includes/malzak.h" -SCREEN_UPDATE( malzak ) +SCREEN_UPDATE_IND16( malzak ) { - malzak_state *state = screen->machine().driver_data(); + malzak_state *state = screen.machine().driver_data(); int sx, sy; int x,y; - bitmap_t *s2636_0_bitmap; - bitmap_t *s2636_1_bitmap; - bitmap_fill(bitmap, 0, 0); + bitmap.fill(0); saa5050_update(state->m_saa5050, bitmap, cliprect); saa5050_frame_advance(state->m_saa5050); @@ -43,38 +41,38 @@ if (sx < -15*2) sx += 256*2; - drawgfxzoom_transpen(bitmap,cliprect, screen->machine().gfx[0], state->m_playfield_code[x * 16 + y], 7*2, 0, 0, sx, sy, 0x20000, 0x20000, 0); + drawgfxzoom_transpen(bitmap,cliprect, screen.machine().gfx[0], state->m_playfield_code[x * 16 + y], 7*2, 0, 0, sx, sy, 0x20000, 0x20000, 0); } /* update the S2636 chips */ - s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); - s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); + bitmap_ind16 &s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); + bitmap_ind16 &s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); /* copy the S2636 images into the main bitmap */ { int y; - for (y = cliprect->min_y; y <= cliprect->max_y / 2; y++) + for (y = cliprect.min_y; y <= cliprect.max_y / 2; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x / 2; x++) + for (x = cliprect.min_x; x <= cliprect.max_x / 2; x++) { - int pixel0 = *BITMAP_ADDR16(s2636_0_bitmap, y, x); - int pixel1 = *BITMAP_ADDR16(s2636_1_bitmap, y, x); + int pixel0 = s2636_0_bitmap.pix16(y, x); + int pixel1 = s2636_1_bitmap.pix16(y, x); if (S2636_IS_PIXEL_DRAWN(pixel0)) { - *BITMAP_ADDR16(bitmap, y*2, x*2) = S2636_PIXEL_COLOR(pixel0); - *BITMAP_ADDR16(bitmap, y*2+1, x*2) = S2636_PIXEL_COLOR(pixel0); - *BITMAP_ADDR16(bitmap, y*2, x*2+1) = S2636_PIXEL_COLOR(pixel0); - *BITMAP_ADDR16(bitmap, y*2+1, x*2+1) = S2636_PIXEL_COLOR(pixel0); + bitmap.pix16(y*2, x*2) = S2636_PIXEL_COLOR(pixel0); + bitmap.pix16(y*2+1, x*2) = S2636_PIXEL_COLOR(pixel0); + bitmap.pix16(y*2, x*2+1) = S2636_PIXEL_COLOR(pixel0); + bitmap.pix16(y*2+1, x*2+1) = S2636_PIXEL_COLOR(pixel0); } if (S2636_IS_PIXEL_DRAWN(pixel1)) { - *BITMAP_ADDR16(bitmap, y*2, x*2) = S2636_PIXEL_COLOR(pixel1); - *BITMAP_ADDR16(bitmap, y*2+1, x*2) = S2636_PIXEL_COLOR(pixel1); - *BITMAP_ADDR16(bitmap, y*2, x*2+1) = S2636_PIXEL_COLOR(pixel1); - *BITMAP_ADDR16(bitmap, y*2+1, x*2+1) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y*2, x*2) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y*2+1, x*2) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y*2, x*2+1) = S2636_PIXEL_COLOR(pixel1); + bitmap.pix16(y*2+1, x*2+1) = S2636_PIXEL_COLOR(pixel1); } } } diff -Nru mame-0.144/src/mame/video/mappy.c mame-0.145/src/mame/video/mappy.c --- mame-0.144/src/mame/video/mappy.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mappy.c 2012-02-06 21:30:31.000000000 +0000 @@ -273,8 +273,8 @@ mappy_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[tile_index + 0x400]; - tileinfo->category = (attr & 0x40) >> 6; - tileinfo->group = attr & 0x3f; + tileinfo.category = (attr & 0x40) >> 6; + tileinfo.group = attr & 0x3f; SET_TILE_INFO( 0, state->m_videoram[tile_index], @@ -287,8 +287,8 @@ mappy_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[tile_index + 0x400]; - tileinfo->category = (attr & 0x40) >> 6; - tileinfo->group = attr & 0x3f; + tileinfo.category = (attr & 0x40) >> 6; + tileinfo.group = attr & 0x3f; SET_TILE_INFO( 0, state->m_videoram[tile_index] + ((attr & 0x80) << 1), @@ -301,8 +301,8 @@ mappy_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[tile_index + 0x800]; - tileinfo->category = (attr & 0x40) >> 6; - tileinfo->group = attr & 0x3f; + tileinfo.category = (attr & 0x40) >> 6; + tileinfo.group = attr & 0x3f; SET_TILE_INFO( 0, state->m_videoram[tile_index], @@ -323,7 +323,7 @@ mappy_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, superpac_get_tile_info,superpac_tilemap_scan,8,8,36,28); - state->m_sprite_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[0], 31); } @@ -346,7 +346,7 @@ state->m_bg_tilemap = tilemap_create(machine, mappy_get_tile_info,mappy_tilemap_scan,8,8,36,60); colortable_configure_tilemap_groups(machine.colortable, state->m_bg_tilemap, machine.gfx[0], 31); - tilemap_set_scroll_cols(state->m_bg_tilemap, 36); + state->m_bg_tilemap->set_scroll_cols(36); } @@ -362,7 +362,7 @@ mappy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( mappy_videoram_w ) @@ -370,7 +370,7 @@ mappy_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( superpac_flipscreen_w ) @@ -399,7 +399,7 @@ ***************************************************************************/ -static void mappy_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *spriteram_base) +static void mappy_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *spriteram_base) { UINT8 *spriteram = spriteram_base + 0x780; UINT8 *spriteram_2 = spriteram + 0x800; @@ -438,6 +438,7 @@ flipx ^= 1; flipy ^= 1; sy += 40; + sx += 96; } for (y = 0;y <= sizey;y++) @@ -478,7 +479,7 @@ 1 -------x X position MSB */ -static void phozon_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *spriteram_base) +static void phozon_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *spriteram_base) { UINT8 *spriteram = spriteram_base + 0x780; UINT8 *spriteram_2 = spriteram + 0x800; @@ -516,6 +517,7 @@ flipx ^= 1; flipy ^= 1; sy += 40; + sx += 96; } for (y = 0;y <= sizey;y++) @@ -535,73 +537,64 @@ } -SCREEN_UPDATE( superpac ) +SCREEN_UPDATE_IND16( superpac ) { - mappy_state *state = screen->machine().driver_data(); - bitmap_t *sprite_bitmap = state->m_sprite_bitmap; + mappy_state *state = screen.machine().driver_data(); + bitmap_ind16 &sprite_bitmap = state->m_sprite_bitmap; int x,y; - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 96); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); - - bitmap_fill(sprite_bitmap,cliprect,15); - mappy_draw_sprites(screen->machine(),sprite_bitmap,cliprect,state->m_spriteram); + sprite_bitmap.fill(15, cliprect); + mappy_draw_sprites(screen.machine(),sprite_bitmap,cliprect,state->m_spriteram); copybitmap_trans(bitmap,sprite_bitmap,0,0,0,0,cliprect,15); /* Redraw the high priority characters */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,1,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1,0); /* sprite color 0/1 still has priority over that (ghost eyes in Pac 'n Pal) */ - for (y = 0;y < sprite_bitmap->height;y++) + for (y = 0;y < sprite_bitmap.height();y++) { - for (x = 0;x < sprite_bitmap->width;x++) + for (x = 0;x < sprite_bitmap.width();x++) { - int spr_entry = *BITMAP_ADDR16(sprite_bitmap, y, x); - int spr_pen = colortable_entry_get_value(screen->machine().colortable, spr_entry); + int spr_entry = sprite_bitmap.pix16(y, x); + int spr_pen = colortable_entry_get_value(screen.machine().colortable, spr_entry); if (spr_pen == 0 || spr_pen == 1) - *BITMAP_ADDR16(bitmap, y, x) = spr_entry; + bitmap.pix16(y, x) = spr_entry; } } return 0; } -SCREEN_UPDATE( phozon ) +SCREEN_UPDATE_IND16( phozon ) { - mappy_state *state = screen->machine().driver_data(); + mappy_state *state = screen.machine().driver_data(); /* flip screen control is embedded in RAM */ - flip_screen_set(screen->machine(), state->m_spriteram[0x1f7f-0x800] & 1); - - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 96); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 0); + flip_screen_set(screen.machine(), state->m_spriteram[0x1f7f-0x800] & 1); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); - phozon_draw_sprites(screen->machine(),bitmap,cliprect,state->m_spriteram); + phozon_draw_sprites(screen.machine(),bitmap,cliprect,state->m_spriteram); /* Redraw the high priority characters */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,1,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1,0); return 0; } -SCREEN_UPDATE( mappy ) +SCREEN_UPDATE_IND16( mappy ) { - mappy_state *state = screen->machine().driver_data(); + mappy_state *state = screen.machine().driver_data(); int offs; - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 96); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 0); - for (offs = 2;offs < 34;offs++) - tilemap_set_scrolly(state->m_bg_tilemap,offs,state->m_scroll); + state->m_bg_tilemap->set_scrolly(offs,state->m_scroll); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); - mappy_draw_sprites(screen->machine(),bitmap,cliprect,state->m_spriteram); + mappy_draw_sprites(screen.machine(),bitmap,cliprect,state->m_spriteram); /* Redraw the high priority characters */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,1,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1,0); return 0; } diff -Nru mame-0.144/src/mame/video/marineb.c mame-0.145/src/mame/video/marineb.c --- mame-0.144/src/mame/video/marineb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/marineb.c 2012-02-06 21:30:31.000000000 +0000 @@ -70,7 +70,7 @@ marineb_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); state->save_item(NAME(state->m_palette_bank)); state->save_item(NAME(state->m_column_scroll)); @@ -91,7 +91,7 @@ marineb_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -100,7 +100,7 @@ marineb_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -120,7 +120,7 @@ if (old != state->m_palette_bank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -134,7 +134,7 @@ if (old != state->m_palette_bank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -144,7 +144,7 @@ marineb_state *state = space->machine().driver_data(); state->m_flipscreen_x = data ^ state->m_marineb_active_low_flipscreen; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } @@ -153,7 +153,7 @@ marineb_state *state = space->machine().driver_data(); state->m_flipscreen_y = data ^ state->m_marineb_active_low_flipscreen; - tilemap_set_flip(state->m_bg_tilemap, (state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); + state->m_bg_tilemap->set_flip((state->m_flipscreen_x ? TILEMAP_FLIPX : 0) | (state->m_flipscreen_y ? TILEMAP_FLIPY : 0)); } @@ -170,20 +170,20 @@ int col; for (col = 0; col < cols; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, state->m_column_scroll); + state->m_bg_tilemap->set_scrolly(col, state->m_column_scroll); for (; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, 0); + state->m_bg_tilemap->set_scrolly(col, 0); } -SCREEN_UPDATE( marineb ) +SCREEN_UPDATE_IND16( marineb ) { - marineb_state *state = screen->machine().driver_data(); + marineb_state *state = screen.machine().driver_data(); int offs; - set_tilemap_scrolly(screen->machine(), 24); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + set_tilemap_scrolly(screen.machine(), 24); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0x0f; offs >= 0; offs--) @@ -220,7 +220,7 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[gfx]->width - sy; + sy = 256 - screen.machine().gfx[gfx]->width - sy; flipy = !flipy; } @@ -229,7 +229,7 @@ sx++; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[gfx], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[gfx], code, col, flipx,flipy, @@ -239,13 +239,13 @@ } -SCREEN_UPDATE( changes ) +SCREEN_UPDATE_IND16( changes ) { - marineb_state *state = screen->machine().driver_data(); + marineb_state *state = screen.machine().driver_data(); int offs, sx, sy, code, col, flipx, flipy; - set_tilemap_scrolly(screen->machine(), 26); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + set_tilemap_scrolly(screen.machine(), 26); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the small sprites */ for (offs = 0x05; offs >= 0; offs--) @@ -263,7 +263,7 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[1]->width - sy; + sy = 256 - screen.machine().gfx[1]->width - sy; flipy = !flipy; } @@ -272,7 +272,7 @@ sx++; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], code >> 2, col, flipx,flipy, @@ -290,7 +290,7 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[2]->width - sy; + sy = 256 - screen.machine().gfx[2]->width - sy; flipy = !flipy; } @@ -301,7 +301,7 @@ code >>= 4; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], code, col, flipx,flipy, @@ -309,7 +309,7 @@ /* draw again for wrap around */ - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], code, col, flipx,flipy, @@ -318,13 +318,13 @@ } -SCREEN_UPDATE( springer ) +SCREEN_UPDATE_IND16( springer ) { - marineb_state *state = screen->machine().driver_data(); + marineb_state *state = screen.machine().driver_data(); int offs; - set_tilemap_scrolly(screen->machine(), 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + set_tilemap_scrolly(screen.machine(), 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0x0f; offs >= 0; offs--) @@ -359,7 +359,7 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[gfx]->width - sy; + sy = 256 - screen.machine().gfx[gfx]->width - sy; flipy = !flipy; } @@ -368,7 +368,7 @@ sx--; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[gfx], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[gfx], code, col, flipx,flipy, @@ -378,13 +378,13 @@ } -SCREEN_UPDATE( hoccer ) +SCREEN_UPDATE_IND16( hoccer ) { - marineb_state *state = screen->machine().driver_data(); + marineb_state *state = screen.machine().driver_data(); int offs; - set_tilemap_scrolly(screen->machine(), 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + set_tilemap_scrolly(screen.machine(), 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0x07; offs >= 0; offs--) @@ -402,17 +402,17 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[1]->width - sy; + sy = 256 - screen.machine().gfx[1]->width - sy; flipy = !flipy; } if (state->m_flipscreen_x) { - sx = 256 - screen->machine().gfx[1]->width - sx; + sx = 256 - screen.machine().gfx[1]->width - sx; flipx = !flipx; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], code >> 2, col, flipx,flipy, @@ -422,13 +422,13 @@ } -SCREEN_UPDATE( hopprobo ) +SCREEN_UPDATE_IND16( hopprobo ) { - marineb_state *state = screen->machine().driver_data(); + marineb_state *state = screen.machine().driver_data(); int offs; - set_tilemap_scrolly(screen->machine(), 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + set_tilemap_scrolly(screen.machine(), 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (offs = 0x0f; offs >= 0; offs--) @@ -462,7 +462,7 @@ if (!state->m_flipscreen_y) { - sy = 256 - screen->machine().gfx[gfx]->width - sy; + sy = 256 - screen.machine().gfx[gfx]->width - sy; flipy = !flipy; } @@ -471,7 +471,7 @@ sx--; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[gfx], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[gfx], code, col, flipx,flipy, diff -Nru mame-0.144/src/mame/video/mario.c mame-0.145/src/mame/video/mario.c --- mame-0.144/src/mame/video/mario.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mario.c 2012-02-06 21:30:31.000000000 +0000 @@ -82,7 +82,7 @@ mario_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mario_gfxbank_w ) @@ -92,7 +92,7 @@ if (state->m_gfx_bank != (data & 0x01)) { state->m_gfx_bank = data & 0x01; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -103,7 +103,7 @@ if (state->m_palette_bank != (data & 0x01)) { state->m_palette_bank = data & 0x01; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -122,10 +122,10 @@ { state->m_flip = data & 0x01; if (state->m_flip) - tilemap_set_flip_all(space->machine(), TILEMAP_FLIPX | TILEMAP_FLIPY); + space->machine().tilemap().set_flip_all(TILEMAP_FLIPX | TILEMAP_FLIPY); else - tilemap_set_flip_all(space->machine(), 0); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().set_flip_all(0); + space->machine().tilemap().mark_all_dirty(); } } @@ -161,7 +161,7 @@ * confirmed on mametests.org as being present on real PCB as well. */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* TODO: draw_sprites should adopt the scanline logic from dkong.c * The schematics have the same logic for sprite buffering. @@ -208,23 +208,23 @@ } } -SCREEN_UPDATE( mario ) +SCREEN_UPDATE_IND16( mario ) { - mario_state *state = screen->machine().driver_data(); + mario_state *state = screen.machine().driver_data(); int t; - t = input_port_read(screen->machine(), "MONITOR"); + t = input_port_read(screen.machine(), "MONITOR"); if (t != state->m_monitor) { state->m_monitor = t; - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); } - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_flip ? (HTOTAL-HBSTART) : 0); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_gfx_scroll - (state->m_flip ? 8 : 0)); + state->m_bg_tilemap->set_scrollx(0, state->m_flip ? (HTOTAL-HBSTART) : 0); + state->m_bg_tilemap->set_scrolly(0, state->m_gfx_scroll - (state->m_flip ? 8 : 0)); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/markham.c mame-0.145/src/mame/video/markham.c --- mame-0.144/src/mame/video/markham.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/markham.c 2012-02-06 21:30:31.000000000 +0000 @@ -43,7 +43,7 @@ { markham_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( markham_flipscreen_w ) @@ -51,7 +51,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -70,10 +70,10 @@ markham_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { markham_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -117,20 +117,20 @@ } } -SCREEN_UPDATE( markham ) +SCREEN_UPDATE_IND16( markham ) { - markham_state *state = screen->machine().driver_data(); + markham_state *state = screen.machine().driver_data(); int i; for (i = 0; i < 32; i++) { if ((i > 3) && (i < 16)) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_xscroll[0]); + state->m_bg_tilemap->set_scrollx(i, state->m_xscroll[0]); if (i >= 16) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_xscroll[1]); + state->m_bg_tilemap->set_scrollx(i, state->m_xscroll[1]); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/matmania.c mame-0.145/src/mame/video/matmania.c --- mame-0.144/src/mame/video/matmania.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/matmania.c 2012-02-06 21:30:32.000000000 +0000 @@ -118,18 +118,17 @@ matmania_state *state = machine.driver_data(); int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - bitmap_format format = machine.primary_screen->format(); /* Mat Mania has a virtual screen twice as large as the visible screen */ - state->m_tmpbitmap = auto_bitmap_alloc(machine, width, 2 * height, format); - state->m_tmpbitmap2 = auto_bitmap_alloc(machine, width, 2 * height, format); + state->m_tmpbitmap = auto_bitmap_ind16_alloc(machine, width, 2 * height); + state->m_tmpbitmap2 = auto_bitmap_ind16_alloc(machine, width, 2 * height); } -SCREEN_UPDATE( matmania ) +SCREEN_UPDATE_IND16( matmania ) { - matmania_state *state = screen->machine().driver_data(); + matmania_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; @@ -140,7 +139,7 @@ int sx = 15 - offs / 32; int sy = offs % 32; - drawgfx_opaque(state->m_tmpbitmap, 0, screen->machine().gfx[1], + drawgfx_opaque(*state->m_tmpbitmap, state->m_tmpbitmap->cliprect(), screen.machine().gfx[1], state->m_videoram[offs] + ((state->m_colorram[offs] & 0x08) << 5), (state->m_colorram[offs] & 0x30) >> 4, 0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */ @@ -153,7 +152,7 @@ int sx = 15 - offs / 32; int sy = offs % 32; - drawgfx_opaque(state->m_tmpbitmap2, 0, screen->machine().gfx[1], + drawgfx_opaque(*state->m_tmpbitmap2, state->m_tmpbitmap2->cliprect(), screen.machine().gfx[1], state->m_videoram3[offs] + ((state->m_colorram3[offs] & 0x08) << 5), (state->m_colorram3[offs] & 0x30) >> 4, 0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */ @@ -164,9 +163,9 @@ { int scrolly = -*state->m_scroll; if (state->m_pageselect[0] & 0x01) // maniach sets 0x20 sometimes, which must have a different meaning - copyscrollbitmap(bitmap, state->m_tmpbitmap2, 0, 0, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap2, 0, 0, 1, &scrolly, cliprect); else - copyscrollbitmap(bitmap, state->m_tmpbitmap, 0, 0, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap, 0, 0, 1, &scrolly, cliprect); } @@ -175,7 +174,7 @@ { if (spriteram[offs] & 0x01) { - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[2], spriteram[offs + 1] + ((spriteram[offs] & 0xf0) << 4), (spriteram[offs] & 0x08) >> 3, spriteram[offs] & 0x04, spriteram[offs] & 0x02, @@ -190,7 +189,7 @@ int sx = 31 - offs / 32; int sy = offs % 32; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram2[offs] + 256 * (state->m_colorram2[offs] & 0x07), (state->m_colorram2[offs] & 0x30) >> 4, 0,0, @@ -199,9 +198,9 @@ return 0; } -SCREEN_UPDATE( maniach ) +SCREEN_UPDATE_IND16( maniach ) { - matmania_state *state = screen->machine().driver_data(); + matmania_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; @@ -212,7 +211,7 @@ int sx = 15 - offs / 32; int sy = offs % 32; - drawgfx_opaque(state->m_tmpbitmap, 0, screen->machine().gfx[1], + drawgfx_opaque(*state->m_tmpbitmap, state->m_tmpbitmap->cliprect(), screen.machine().gfx[1], state->m_videoram[offs] + ((state->m_colorram[offs] & 0x03) << 8), (state->m_colorram[offs] & 0x30) >> 4, 0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */ @@ -225,7 +224,7 @@ int sx = 15 - offs / 32; int sy = offs % 32; - drawgfx_opaque(state->m_tmpbitmap2, 0, screen->machine().gfx[1], + drawgfx_opaque(*state->m_tmpbitmap2, state->m_tmpbitmap2->cliprect(), screen.machine().gfx[1], state->m_videoram3[offs] + ((state->m_colorram3[offs] & 0x03) << 8), (state->m_colorram3[offs] & 0x30) >> 4, 0,sy >= 16, /* flip horizontally tiles on the right half of the bitmap */ @@ -238,9 +237,9 @@ int scrolly = -*state->m_scroll; if (state->m_pageselect[0] & 0x01) // this sets 0x20 sometimes, which must have a different meaning - copyscrollbitmap(bitmap, state->m_tmpbitmap2, 0, 0, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap2, 0, 0, 1, &scrolly, cliprect); else - copyscrollbitmap(bitmap, state->m_tmpbitmap, 0, 0, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap, 0, 0, 1, &scrolly, cliprect); } @@ -249,7 +248,7 @@ { if (spriteram[offs] & 0x01) { - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], spriteram[offs+1] + ((spriteram[offs] & 0xf0) << 4), (spriteram[offs] & 0x08) >> 3, spriteram[offs] & 0x04,spriteram[offs] & 0x02, @@ -264,7 +263,7 @@ int sx = 31 - offs / 32; int sy = offs % 32; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram2[offs] + 256 * (state->m_colorram2[offs] & 0x07), (state->m_colorram2[offs] & 0x30) >> 4, 0,0, diff -Nru mame-0.144/src/mame/video/mcatadv.c mame-0.145/src/mame/video/mcatadv.c --- mame-0.144/src/mame/video/mcatadv.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/mcatadv.c 2012-02-06 21:30:31.000000000 +0000 @@ -22,7 +22,7 @@ int pri = (state->m_videoram1[tile_index * 2] & 0xc000) >> 14; SET_TILE_INFO(0,tileno,colour + state->m_palette_bank1 * 0x40, 0); - tileinfo->category = pri; + tileinfo.category = pri; } WRITE16_HANDLER( mcatadv_videoram1_w ) @@ -30,7 +30,7 @@ mcatadv_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap1, offset / 2); + state->m_tilemap1->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_mcatadv_tile_info2 ) @@ -41,7 +41,7 @@ int pri = (state->m_videoram2[tile_index * 2] & 0xc000) >> 14; SET_TILE_INFO(1, tileno, colour + state->m_palette_bank2 * 0x40, 0); - tileinfo->category = pri; + tileinfo.category = pri; } WRITE16_HANDLER( mcatadv_videoram2_w ) @@ -49,11 +49,11 @@ mcatadv_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_tilemap2, offset / 2); + state->m_tilemap2->mark_tile_dirty(offset / 2); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mcatadv_state *state = machine.driver_data(); UINT16 *source = state->m_spriteram_old; @@ -121,10 +121,10 @@ { drawypos = y + ycnt - global_y; - if ((drawypos >= cliprect->min_y) && (drawypos <= cliprect->max_y)) + if ((drawypos >= cliprect.min_y) && (drawypos <= cliprect.max_y)) { - destline = BITMAP_ADDR16(bitmap, drawypos, 0); - priline = BITMAP_ADDR8(machine.priority_bitmap, drawypos, 0); + destline = &bitmap.pix16(drawypos); + priline = &machine.priority_bitmap.pix8(drawypos); for (xcnt = xstart; xcnt != xend; xcnt += xinc) { @@ -140,7 +140,7 @@ pix = pix >> 4; pix &= 0x0f; - if ((drawxpos >= cliprect->min_x) && (drawxpos <= cliprect->max_x) && pix) + if ((drawxpos >= cliprect.min_x) && (drawxpos <= cliprect.max_x) && pix) destline[drawxpos] = (pix + (pen << 4)); } offset++; @@ -156,16 +156,16 @@ } } -static void mcatadv_draw_tilemap_part( UINT16* current_scroll, UINT16* current_videoram1, int i, tilemap_t* current_tilemap, bitmap_t *bitmap, const rectangle *cliprect ) +static void mcatadv_draw_tilemap_part( UINT16* current_scroll, UINT16* current_videoram1, int i, tilemap_t* current_tilemap, bitmap_ind16 &bitmap, const rectangle &cliprect ) { int flip; UINT32 drawline; rectangle clip; - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; - for (drawline = cliprect->min_y; drawline <= cliprect->max_y; drawline++) + for (drawline = cliprect.min_y; drawline <= cliprect.max_y; drawline++) { int scrollx, scrolly; @@ -192,32 +192,32 @@ if (!(current_scroll[1] & 0x8000)) scrolly -= 0x141; flip = ((current_scroll[0] & 0x8000) ? 0 : TILEMAP_FLIPX) | ((current_scroll[1] & 0x8000) ? 0 : TILEMAP_FLIPY); - tilemap_set_scrollx(current_tilemap, 0, scrollx); - tilemap_set_scrolly(current_tilemap, 0, scrolly); - tilemap_set_flip(current_tilemap, flip); + current_tilemap->set_scrollx(0, scrollx); + current_tilemap->set_scrolly(0, scrolly); + current_tilemap->set_flip(flip); - tilemap_draw(bitmap, &clip, current_tilemap, i, i); + current_tilemap->draw(bitmap, clip, i, i); } } -SCREEN_UPDATE( mcatadv ) +SCREEN_UPDATE_IND16( mcatadv ) { - mcatadv_state *state = screen->machine().driver_data(); + mcatadv_state *state = screen.machine().driver_data(); int i; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_scroll1[2] != state->m_palette_bank1) { state->m_palette_bank1 = state->m_scroll1[2]; - tilemap_mark_all_tiles_dirty(state->m_tilemap1); + state->m_tilemap1->mark_all_dirty(); } if (state->m_scroll2[2] != state->m_palette_bank2) { state->m_palette_bank2 = state->m_scroll2[2]; - tilemap_mark_all_tiles_dirty(state->m_tilemap2); + state->m_tilemap2->mark_all_dirty(); } /* @@ -231,21 +231,21 @@ for (i = 0; i <= 3; i++) { #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed(KEYCODE_Q)) + if (!screen.machine().input().code_pressed(KEYCODE_Q)) #endif mcatadv_draw_tilemap_part(state->m_scroll1, state->m_videoram1, i, state->m_tilemap1, bitmap, cliprect); #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed(KEYCODE_W)) + if (!screen.machine().input().code_pressed(KEYCODE_W)) #endif mcatadv_draw_tilemap_part(state->m_scroll2, state->m_videoram2, i, state->m_tilemap2, bitmap, cliprect); } g_profiler.start(PROFILER_USER1); #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed(KEYCODE_E)) + if (!screen.machine().input().code_pressed(KEYCODE_E)) #endif - draw_sprites (screen->machine(), bitmap, cliprect); + draw_sprites (screen.machine(), bitmap, cliprect); g_profiler.stop(); return 0; } @@ -254,10 +254,10 @@ { mcatadv_state *state = machine.driver_data(); state->m_tilemap1 = tilemap_create(machine, get_mcatadv_tile_info1, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap1, 0); + state->m_tilemap1->set_transparent_pen(0); state->m_tilemap2 = tilemap_create(machine, get_mcatadv_tile_info2, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap2, 0); + state->m_tilemap2->set_transparent_pen(0); state->m_spriteram_old = auto_alloc_array_clear(machine, UINT16, state->m_spriteram_size / 2); state->m_vidregs_old = auto_alloc_array(machine, UINT16, (0x0f + 1) / 2); @@ -269,9 +269,13 @@ state->save_pointer(NAME(state->m_vidregs_old), (0x0f + 1) / 2); } -SCREEN_EOF( mcatadv ) +SCREEN_VBLANK( mcatadv ) { - mcatadv_state *state = machine.driver_data(); - memcpy(state->m_spriteram_old, state->m_spriteram, state->m_spriteram_size); - memcpy(state->m_vidregs_old, state->m_vidregs, 0xf); + // rising edge + if (vblank_on) + { + mcatadv_state *state = screen.machine().driver_data(); + memcpy(state->m_spriteram_old, state->m_spriteram, state->m_spriteram_size); + memcpy(state->m_vidregs_old, state->m_vidregs, 0xf); + } } diff -Nru mame-0.144/src/mame/video/mcd212.c mame-0.145/src/mame/video/mcd212.c --- mame-0.144/src/mame/video/mcd212.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mcd212.c 2012-02-06 21:30:32.000000000 +0000 @@ -87,8 +87,8 @@ static void cdi220_draw_lcd(running_machine &machine, int y) { cdi_state *state = machine.driver_data(); - bitmap_t *bitmap = state->m_lcdbitmap; - UINT32 *scanline = BITMAP_ADDR32(bitmap, y, 0); + bitmap_rgb32 &bitmap = state->m_lcdbitmap; + UINT32 *scanline = &bitmap.pix32(y); int x = 0; int lcd = 0; @@ -1331,12 +1331,11 @@ static void mcd212_draw_scanline(mcd212_regs_t *mcd212, int y) { - running_machine &machine = mcd212->machine(); - bitmap_t *bitmap = machine.generic.tmpbitmap; + bitmap_rgb32 &bitmap = mcd212->m_bitmap; UINT8 plane_a_r[768], plane_a_g[768], plane_a_b[768]; UINT8 plane_b_r[768], plane_b_g[768], plane_b_b[768]; UINT32 out[768]; - UINT32 *scanline = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *scanline = &bitmap.pix32(y); int x; mcd212_process_vsr(mcd212, 0, plane_a_r, plane_a_g, plane_a_b); @@ -1512,6 +1511,7 @@ void mcd212_init(running_machine &machine, mcd212_regs_t *mcd212) { mcd212->m_machine = &machine; + machine.primary_screen->register_screen_bitmap(mcd212->m_bitmap); int index = 0; for(index = 0; index < 2; index++) @@ -1523,9 +1523,9 @@ mcd212->channel[index].ddr = 0; mcd212->channel[index].dcp = 0; mcd212->channel[index].dca = 0; - memset(mcd212->channel[index].clut_r, 0, 768); - memset(mcd212->channel[index].clut_g, 0, 768); - memset(mcd212->channel[index].clut_b, 0, 768); + memset(mcd212->channel[index].clut_r, 0, 256); + memset(mcd212->channel[index].clut_g, 0, 256); + memset(mcd212->channel[index].clut_b, 0, 256); mcd212->channel[index].image_coding_method = 0; mcd212->channel[index].transparency_control = 0; mcd212->channel[index].plane_order = 0; @@ -1652,24 +1652,25 @@ { cdi_state *state = machine.driver_data(); - VIDEO_START_CALL(generic_bitmapped); mcd212_ab_init(&state->m_mcd212_ab); mcd212_init(machine, &state->m_mcd212_regs); state->m_mcd212_regs.scan_timer = machine.scheduler().timer_alloc(FUNC(mcd212_perform_scan)); state->m_mcd212_regs.scan_timer->adjust(machine.primary_screen->time_until_pos(0, 0)); - state->m_lcdbitmap = downcast(machine.device("lcd"))->alloc_compatible_bitmap(); + screen_device *screen = downcast(machine.device("lcd")); + screen->register_screen_bitmap(state->m_lcdbitmap); } -SCREEN_UPDATE( cdimono1 ) +SCREEN_UPDATE_RGB32( cdimono1 ) { - copybitmap(bitmap, screen->machine().generic.tmpbitmap, 0, 0, 0, 0, cliprect); + cdi_state *state = screen.machine().driver_data(); + copybitmap(bitmap, state->m_mcd212_regs.m_bitmap, 0, 0, 0, 0, cliprect); return 0; } -SCREEN_UPDATE( cdimono1_lcd ) +SCREEN_UPDATE_RGB32( cdimono1_lcd ) { - cdi_state *state = screen->machine().driver_data(); + cdi_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_lcdbitmap, 0, 0, 0, 0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mcd212.h mame-0.145/src/mame/video/mcd212.h --- mame-0.144/src/mame/video/mcd212.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mcd212.h 2012-02-06 21:30:32.000000000 +0000 @@ -70,6 +70,7 @@ UINT8 region_flag_1[768]; running_machine *m_machine; + bitmap_rgb32 m_bitmap; } mcd212_regs_t; #define MCD212_CURCNT_COLOR 0x00000f // Cursor color @@ -189,7 +190,7 @@ WRITE16_HANDLER( mcd212_w ); TIMER_CALLBACK( mcd212_perform_scan ); VIDEO_START( cdimono1 ); -SCREEN_UPDATE( cdimono1 ); -SCREEN_UPDATE( cdimono1_lcd ); +SCREEN_UPDATE_RGB32( cdimono1 ); +SCREEN_UPDATE_RGB32( cdimono1_lcd ); #endif // _VIDEO_MCD212_H_ diff -Nru mame-0.144/src/mame/video/mcr3.c mame-0.145/src/mame/video/mcr3.c --- mame-0.144/src/mame/video/mcr3.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mcr3.c 2012-02-06 21:30:32.000000000 +0000 @@ -114,8 +114,8 @@ /* initialize the text tilemap */ state->m_alpha_tilemap = tilemap_create(machine, spyhunt_get_alpha_tile_info, tilemap_scan_cols, 16,16, 32,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); - tilemap_set_scrollx(state->m_alpha_tilemap, 0, 16); + state->m_alpha_tilemap->set_transparent_pen(0); + state->m_alpha_tilemap->set_scrollx(0, 16); state_save_register_global(machine, state->m_spyhunt_sprite_color_mask); state_save_register_global(machine, state->m_spyhunt_scrollx); @@ -153,7 +153,7 @@ mcr3_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -162,7 +162,7 @@ mcr3_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -170,7 +170,7 @@ { mcr3_state *state = space->machine().driver_data(); state->m_spyhunt_alpharam[offset] = data; - tilemap_mark_tile_dirty(state->m_alpha_tilemap, offset); + state->m_alpha_tilemap->mark_tile_dirty(offset); } @@ -205,13 +205,13 @@ * *************************************/ -static void mcr3_update_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int color_mask, int code_xor, int dx, int dy) +static void mcr3_update_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int color_mask, int code_xor, int dx, int dy) { mcr3_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; - bitmap_fill(machine.priority_bitmap, cliprect, 1); + machine.priority_bitmap.fill(1, cliprect); /* loop over sprite RAM */ for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) @@ -280,34 +280,34 @@ * *************************************/ -SCREEN_UPDATE( mcr3 ) +SCREEN_UPDATE_IND16( mcr3 ) { - mcr3_state *state = screen->machine().driver_data(); + mcr3_state *state = screen.machine().driver_data(); /* update the flip state */ - tilemap_set_flip(state->m_bg_tilemap, mcr_cocktail_flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + state->m_bg_tilemap->set_flip(mcr_cocktail_flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ - mcr3_update_sprites(screen->machine(), bitmap, cliprect, 0x03, 0, 0, 0); + mcr3_update_sprites(screen.machine(), bitmap, cliprect, 0x03, 0, 0, 0); return 0; } -SCREEN_UPDATE( spyhunt ) +SCREEN_UPDATE_IND16( spyhunt ) { - mcr3_state *state = screen->machine().driver_data(); + mcr3_state *state = screen.machine().driver_data(); /* for every character in the Video RAM, check if it has been modified */ /* since last time and update it accordingly. */ - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_spyhunt_scrollx * 2 + state->m_spyhunt_scroll_offset); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_spyhunt_scrolly * 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, state->m_spyhunt_scrollx * 2 + state->m_spyhunt_scroll_offset); + state->m_bg_tilemap->set_scrolly(0, state->m_spyhunt_scrolly * 2); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ - mcr3_update_sprites(screen->machine(), bitmap, cliprect, state->m_spyhunt_sprite_color_mask, 0, -12, 0); + mcr3_update_sprites(screen.machine(), bitmap, cliprect, state->m_spyhunt_sprite_color_mask, 0, -12, 0); /* render any characters on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/mcr68.c mame-0.145/src/mame/video/mcr68.c --- mame-0.144/src/mame/video/mcr68.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mcr68.c 2012-02-06 21:30:31.000000000 +0000 @@ -26,7 +26,7 @@ int color = (~data >> 12) & 3; SET_TILE_INFO(0, code, color, TILE_FLIPYX((data >> 10) & 3)); if (machine.gfx[0]->total_elements < 0x1000) - tileinfo->category = (data >> 15) & 1; + tileinfo.category = (data >> 15) & 1; } @@ -47,7 +47,7 @@ int data = videoram[tile_index]; int color = (data >> 13) & 7; SET_TILE_INFO(2, data & 0x3ff, color, TILE_FLIPYX((data >> 11) & 3)); - tileinfo->category = (color != 0); + tileinfo.category = (color != 0); } @@ -63,7 +63,7 @@ mcr68_state *state = machine.driver_data(); /* initialize the background tilemap */ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16,16, 32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } @@ -82,7 +82,7 @@ /* initialize the foreground tilemap */ state->m_fg_tilemap = tilemap_create(machine, zwackery_get_fg_tile_info, tilemap_scan_rows, 16,16, 32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); /* allocate memory for the assembled gfx data */ srcdata0 = auto_alloc_array(machine, UINT8, gfx0->total_elements * gfx0->width * gfx0->height); @@ -181,7 +181,7 @@ mcr68_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -190,8 +190,8 @@ mcr68_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -212,7 +212,7 @@ * *************************************/ -static void mcr68_update_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void mcr68_update_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { mcr68_state *state = machine.driver_data(); rectangle sprite_clip = machine.primary_screen->visible_area(); @@ -222,9 +222,9 @@ /* adjust for clipping */ sprite_clip.min_x += state->m_sprite_clip; sprite_clip.max_x -= state->m_sprite_clip; - sect_rect(&sprite_clip, cliprect); + sprite_clip &= cliprect; - bitmap_fill(machine.priority_bitmap,&sprite_clip,1); + machine.priority_bitmap.fill(1, sprite_clip); /* loop over sprite RAM */ for (offs = state->m_spriteram_size / 2 - 4;offs >= 0;offs -= 4) @@ -256,23 +256,23 @@ The color 8 is used to cover over other sprites. */ /* first draw the sprite, visible */ - pdrawgfx_transmask(bitmap, &sprite_clip, machine.gfx[1], code, color, flipx, flipy, x, y, + pdrawgfx_transmask(bitmap, sprite_clip, machine.gfx[1], code, color, flipx, flipy, x, y, machine.priority_bitmap, 0x00, 0x0101); /* then draw the mask, behind the background but obscuring following sprites */ - pdrawgfx_transmask(bitmap, &sprite_clip, machine.gfx[1], code, color, flipx, flipy, x, y, + pdrawgfx_transmask(bitmap, sprite_clip, machine.gfx[1], code, color, flipx, flipy, x, y, machine.priority_bitmap, 0x02, 0xfeff); } } -static void zwackery_update_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void zwackery_update_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { mcr68_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; int offs; - bitmap_fill(machine.priority_bitmap,cliprect,1); + machine.priority_bitmap.fill(1, cliprect); /* loop over sprite RAM */ for (offs = state->m_spriteram_size / 2 - 4;offs >= 0;offs -= 4) @@ -331,37 +331,37 @@ * *************************************/ -SCREEN_UPDATE( mcr68 ) +SCREEN_UPDATE_IND16( mcr68 ) { - mcr68_state *state = screen->machine().driver_data(); + mcr68_state *state = screen.machine().driver_data(); /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); /* draw the low-priority sprites */ - mcr68_update_sprites(screen->machine(), bitmap, cliprect, 0); + mcr68_update_sprites(screen.machine(), bitmap, cliprect, 0); /* redraw tiles with priority over sprites */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); /* draw the high-priority sprites */ - mcr68_update_sprites(screen->machine(), bitmap, cliprect, 1); + mcr68_update_sprites(screen.machine(), bitmap, cliprect, 1); return 0; } -SCREEN_UPDATE( zwackery ) +SCREEN_UPDATE_IND16( zwackery ) { - mcr68_state *state = screen->machine().driver_data(); + mcr68_state *state = screen.machine().driver_data(); /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the low-priority sprites */ - zwackery_update_sprites(screen->machine(), bitmap, cliprect, 0); + zwackery_update_sprites(screen.machine(), bitmap, cliprect, 0); /* redraw tiles with priority over sprites */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 1, 0); /* draw the high-priority sprites */ - zwackery_update_sprites(screen->machine(), bitmap, cliprect, 1); + zwackery_update_sprites(screen.machine(), bitmap, cliprect, 1); return 0; } diff -Nru mame-0.144/src/mame/video/mcr.c mame-0.145/src/mame/video/mcr.c --- mame-0.144/src/mame/video/mcr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/mcr.c 2012-02-06 21:30:31.000000000 +0000 @@ -33,7 +33,7 @@ SET_TILE_INFO(0, videoram[tile_index], 0, 0); /* sprite color base is constant 0x10 */ - tileinfo->category = 1; + tileinfo.category = 1; } @@ -60,7 +60,7 @@ SET_TILE_INFO(0, code, color, TILE_FLIPYX((data >> 9) & 3)); /* sprite color base comes from the top 2 bits */ - tileinfo->category = (data >> 14) & 3; + tileinfo.category = (data >> 14) & 3; } @@ -87,7 +87,7 @@ SET_TILE_INFO(0, code, color, TILE_FLIPYX((data >> 10) & 3)); /* sprite color base might come from the top 2 bits */ - tileinfo->category = (data >> 14) & 3; + tileinfo.category = (data >> 14) & 3; } @@ -188,7 +188,7 @@ mcr_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset); + bg_tilemap->mark_tile_dirty(offset); } @@ -197,7 +197,7 @@ mcr_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset / 2); + bg_tilemap->mark_tile_dirty(offset / 2); /* palette RAM is mapped into the upper 0x80 bytes here */ if ((offset & 0x780) == 0x780) @@ -227,7 +227,7 @@ int effoffs = ((offset << 1) & 0x7fe) | ((offset >> 10) & 1); videoram[effoffs] = data; - tilemap_mark_tile_dirty(bg_tilemap, effoffs / 2); + bg_tilemap->mark_tile_dirty(effoffs / 2); /* palette RAM is mapped into the upper 0x80 bytes here */ if ((effoffs & 0x780) == 0x780) @@ -240,7 +240,7 @@ mcr_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(bg_tilemap, offset / 2); + bg_tilemap->mark_tile_dirty(offset / 2); } @@ -255,7 +255,7 @@ * *************************************/ -static void render_sprites_91399(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void render_sprites_91399(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 *spriteram = machine.generic.spriteram.u8; const gfx_element *gfx = machine.gfx[1]; @@ -290,11 +290,11 @@ /* loop over lines in the sprite */ for (y = 0; y < 32; y++, sy = (sy + 1) & 0x1ff) - if (sy >= cliprect->min_y && sy <= cliprect->max_y) + if (sy >= cliprect.min_y && sy <= cliprect.max_y) { const UINT8 *src = gfx_element_get_data(gfx, code) + gfx->line_modulo * (y ^ vflip); - UINT16 *dst = BITMAP_ADDR16(bitmap, sy, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, sy, 0); + UINT16 *dst = &bitmap.pix16(sy); + UINT8 *pri = &machine.priority_bitmap.pix8(sy); /* loop over columns */ for (x = 0; x < 32; x++) @@ -327,7 +327,7 @@ * *************************************/ -static void render_sprites_91464(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int sprmask, int colormask) +static void render_sprites_91464(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int primask, int sprmask, int colormask) { UINT8 *spriteram = machine.generic.spriteram.u8; const gfx_element *gfx = machine.gfx[1]; @@ -361,11 +361,11 @@ /* loop over lines in the sprite */ for (y = 0; y < 32; y++, sy = (sy + 1) & 0x1ff) - if (sy >= 2 && sy >= cliprect->min_y && sy <= cliprect->max_y) + if (sy >= 2 && sy >= cliprect.min_y && sy <= cliprect.max_y) { const UINT8 *src = gfx_element_get_data(gfx, code) + gfx->line_modulo * (y ^ vflip); - UINT16 *dst = BITMAP_ADDR16(bitmap, sy, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, sy, 0); + UINT16 *dst = &bitmap.pix16(sy); + UINT8 *pri = &machine.priority_bitmap.pix8(sy); /* loop over columns */ for (x = 0; x < 32; x++) @@ -401,34 +401,34 @@ * *************************************/ -SCREEN_UPDATE( mcr ) +SCREEN_UPDATE_IND16( mcr ) { /* update the flip state */ - tilemap_set_flip(bg_tilemap, mcr_cocktail_flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + bg_tilemap->set_flip(mcr_cocktail_flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); /* draw the background */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0x00); - tilemap_draw(bitmap, cliprect, bg_tilemap, 1, 0x10); - tilemap_draw(bitmap, cliprect, bg_tilemap, 2, 0x20); - tilemap_draw(bitmap, cliprect, bg_tilemap, 3, 0x30); + screen.machine().priority_bitmap.fill(0, cliprect); + bg_tilemap->draw(bitmap, cliprect, 0, 0x00); + bg_tilemap->draw(bitmap, cliprect, 1, 0x10); + bg_tilemap->draw(bitmap, cliprect, 2, 0x20); + bg_tilemap->draw(bitmap, cliprect, 3, 0x30); /* update the sprites and render them */ switch (mcr_sprite_board) { case 91399: - render_sprites_91399(screen->machine(), bitmap, cliprect); + render_sprites_91399(screen.machine(), bitmap, cliprect); break; case 91464: if (mcr_cpu_board == 91442) - render_sprites_91464(screen->machine(), bitmap, cliprect, 0x00, 0x30, 0x00); + render_sprites_91464(screen.machine(), bitmap, cliprect, 0x00, 0x30, 0x00); else if (mcr_cpu_board == 91475) - render_sprites_91464(screen->machine(), bitmap, cliprect, 0x00, 0x30, 0x40); + render_sprites_91464(screen.machine(), bitmap, cliprect, 0x00, 0x30, 0x40); else if (mcr_cpu_board == 91490) - render_sprites_91464(screen->machine(), bitmap, cliprect, 0x00, 0x30, 0x00); + render_sprites_91464(screen.machine(), bitmap, cliprect, 0x00, 0x30, 0x00); else if (mcr_cpu_board == 91721) - render_sprites_91464(screen->machine(), bitmap, cliprect, 0x00, 0x30, 0x00); + render_sprites_91464(screen.machine(), bitmap, cliprect, 0x00, 0x30, 0x00); break; } return 0; diff -Nru mame-0.144/src/mame/video/meadows.c mame-0.145/src/mame/video/meadows.c --- mame-0.144/src/mame/video/meadows.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/meadows.c 2012-02-06 21:30:31.000000000 +0000 @@ -52,7 +52,7 @@ meadows_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -78,7 +78,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *clip) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &clip) { meadows_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -105,14 +105,14 @@ * *************************************/ -SCREEN_UPDATE( meadows ) +SCREEN_UPDATE_IND16( meadows ) { - meadows_state *state = screen->machine().driver_data(); + meadows_state *state = screen.machine().driver_data(); /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ - if (screen->machine().gfx[1]) - draw_sprites(screen->machine(), bitmap, cliprect); + if (screen.machine().gfx[1]) + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/megasys1.c mame-0.145/src/mame/video/megasys1.c --- mame-0.144/src/mame/video/megasys1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/megasys1.c 2012-02-06 21:30:32.000000000 +0000 @@ -299,14 +299,14 @@ { if (state->m_scroll_flag[which] & 0x10) /* tiles are 8x8 */ { - tilemap_mark_tile_dirty(state->m_tmap[which], offset ); + state->m_tmap[which]->mark_tile_dirty(offset ); } else { - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 0); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 1); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 2); - tilemap_mark_tile_dirty(state->m_tmap[which], offset*4 + 3); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 0); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 1); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 2); + state->m_tmap[which]->mark_tile_dirty(offset*4 + 3); } } } @@ -395,8 +395,8 @@ /* set user data and transparency */ for (i = 0; i < 8; i++) { - tilemap_set_user_data(state->m_tilemap[layer][i/4][i%4], (void *)(FPTR)layer); - tilemap_set_transparent_pen(state->m_tilemap[layer][i/4][i%4], 15); + state->m_tilemap[layer][i/4][i%4]->set_user_data((void *)(FPTR)layer); + state->m_tilemap[layer][i/4][i%4]->set_transparent_pen(15); } } } @@ -407,7 +407,7 @@ { state->m_scroll_flag[which] = data; state->m_tmap[which] = state->m_tilemap[which][(data >> 4) & 1][data & 3]; - tilemap_mark_all_tiles_dirty(state->m_tmap[which]); + state->m_tmap[which]->mark_all_dirty(); } } @@ -567,7 +567,7 @@ 0C Y position 0E Code */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { megasys1_state *state = machine.driver_data(); int color,code,sx,sy,flipx,flipy,attr,sprite,offs,color_mask; @@ -920,13 +920,13 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -SCREEN_UPDATE( megasys1 ) +SCREEN_UPDATE_IND16( megasys1 ) { - megasys1_state *state = screen->machine().driver_data(); + megasys1_state *state = screen.machine().driver_data(); int i,flag,pri,primask; int active_layers; @@ -960,20 +960,20 @@ active_layers |= 1 << ((pri & 0xf0000) >> 16); // bottom layer can't be disabled } - tilemap_set_flip_all( screen->machine(), (state->m_screen_flag & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0 ); + screen.machine().tilemap().set_flip_all((state->m_screen_flag & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0 ); for (i = 0;i < 3;i++) { if (state->m_tmap[i]) { - tilemap_set_enable(state->m_tmap[i],active_layers & (1 << i)); + state->m_tmap[i]->enable(active_layers & (1 << i)); - tilemap_set_scrollx(state->m_tmap[i],0,state->m_scrollx[i]); - tilemap_set_scrolly(state->m_tmap[i],0,state->m_scrolly[i]); + state->m_tmap[i]->set_scrollx(0,state->m_scrollx[i]); + state->m_tmap[i]->set_scrolly(0,state->m_scrolly[i]); } } - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); flag = TILEMAP_DRAW_OPAQUE; primask = 0; @@ -990,7 +990,7 @@ case 2: if ( (state->m_tmap[layer]) && (active_layers & (1 << layer) ) ) { - tilemap_draw(bitmap,cliprect,state->m_tmap[layer],flag,primask); + state->m_tmap[layer]->draw(bitmap, cliprect, flag,primask); flag = 0; } break; @@ -999,7 +999,7 @@ if (flag != 0) { flag = 0; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); } if (state->m_sprite_flag & 0x100) /* sprites are split */ @@ -1016,20 +1016,24 @@ } if (active_layers & 0x08) - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_EOF( megasys1 ) +SCREEN_VBLANK( megasys1 ) { - megasys1_state *state = machine.driver_data(); - /* Sprite are TWO frames ahead, like NMK16 HW. */ -//state->m_objectram - memcpy(state->m_buffer2_objectram,state->m_buffer_objectram, 0x2000); - memcpy(state->m_buffer_objectram, state->m_objectram, 0x2000); -//spriteram16 - memcpy(state->m_buffer2_spriteram16, state->m_buffer_spriteram16, 0x2000); - memcpy(state->m_buffer_spriteram16, state->m_spriteram, 0x2000); + // rising edge + if (vblank_on) + { + megasys1_state *state = screen.machine().driver_data(); + /* Sprite are TWO frames ahead, like NMK16 HW. */ + //state->m_objectram + memcpy(state->m_buffer2_objectram,state->m_buffer_objectram, 0x2000); + memcpy(state->m_buffer_objectram, state->m_objectram, 0x2000); + //spriteram16 + memcpy(state->m_buffer2_spriteram16, state->m_buffer_spriteram16, 0x2000); + memcpy(state->m_buffer_spriteram16, state->m_spriteram, 0x2000); + } } diff -Nru mame-0.144/src/mame/video/megazone.c mame-0.145/src/mame/video/megazone.c --- mame-0.144/src/mame/video/megazone.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/megazone.c 2012-02-06 21:30:32.000000000 +0000 @@ -105,15 +105,15 @@ VIDEO_START( megazone ) { megazone_state *state = machine.driver_data(); - state->m_tmpbitmap = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); + state->m_tmpbitmap = auto_bitmap_ind16_alloc(machine, 256, 256); state->save_item(NAME(*state->m_tmpbitmap)); } -SCREEN_UPDATE( megazone ) +SCREEN_UPDATE_IND16( megazone ) { - megazone_state *state = screen->machine().driver_data(); + megazone_state *state = screen.machine().driver_data(); int offs; int x, y; @@ -135,7 +135,7 @@ flipy = !flipy; } - drawgfx_opaque(state->m_tmpbitmap, 0, screen->machine().gfx[1], + drawgfx_opaque(*state->m_tmpbitmap, state->m_tmpbitmap->cliprect(), screen.machine().gfx[1], ((int)state->m_videoram[offs]) + ((state->m_colorram[offs] & (1 << 7) ? 256 : 0) ), (state->m_colorram[offs] & 0x0f) + 0x10, flipx,flipy, @@ -159,7 +159,7 @@ } - copyscrollbitmap(bitmap, state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); } @@ -182,12 +182,12 @@ else sx = sx + 32; - drawgfx_transmask(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transmask(bitmap,cliprect,screen.machine().gfx[0], spriteram[offs + 2], color, flipx,flipy, sx,sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[0], color, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[0], color, 0)); } } @@ -215,7 +215,7 @@ - drawgfx_opaque(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[1], ((int)state->m_videoram2[offs]) + ((state->m_colorram2[offs] & (1 << 7) ? 256 : 0) ), (state->m_colorram2[offs] & 0x0f) + 0x10, flipx,flipy, diff -Nru mame-0.144/src/mame/video/mermaid.c mame-0.145/src/mame/video/mermaid.c --- mame-0.144/src/mame/video/mermaid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mermaid.c 2012-02-06 21:30:32.000000000 +0000 @@ -2,18 +2,6 @@ #include "includes/mermaid.h" -static const rectangle spritevisiblearea = -{ - 0 * 8, 26 * 8 - 1, - 2 * 8, 30 * 8 - 1 -}; - -static const rectangle flip_spritevisiblearea = -{ - 6 * 8, 31 * 8 - 1, - 2 * 8, 30 * 8 - 1 -}; - PALETTE_INIT( mermaid ) { int i; @@ -79,21 +67,21 @@ { mermaid_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mermaid_videoram_w ) { mermaid_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mermaid_colorram_w ) { mermaid_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mermaid_flip_screen_x_w ) @@ -110,14 +98,14 @@ { mermaid_state *state = space->machine().driver_data(); state->m_bg_scrollram[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } WRITE8_HANDLER( mermaid_fg_scroll_w ) { mermaid_state *state = space->machine().driver_data(); state->m_fg_scrollram[offset] = data; - tilemap_set_scrolly(state->m_fg_tilemap, offset, data); + state->m_fg_tilemap->set_scrolly(offset, data); } WRITE8_HANDLER( rougien_gfxbankswitch1_w ) @@ -190,18 +178,21 @@ mermaid_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_fg_tilemap, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_scroll_cols(32); + state->m_fg_tilemap->set_transparent_pen(0); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); + machine.primary_screen->register_screen_bitmap(state->m_helper2); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { + const rectangle spritevisiblearea(0 * 8, 26 * 8 - 1, 2 * 8, 30 * 8 - 1); + const rectangle flip_spritevisiblearea(6 * 8, 31 * 8 - 1, 2 * 8, 30 * 8 - 1); + mermaid_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; @@ -234,22 +225,22 @@ sy = 240 - sy; } - drawgfx_transpen(bitmap, (flip_screen_x_get(machine) ? &flip_spritevisiblearea : &spritevisiblearea), + drawgfx_transpen(bitmap, (flip_screen_x_get(machine) ? flip_spritevisiblearea : spritevisiblearea), machine.gfx[1], code, color, flipx, flipy, sx, sy, 0); } } -SCREEN_UPDATE( mermaid ) +SCREEN_UPDATE_IND16( mermaid ) { - mermaid_state *state = screen->machine().driver_data(); + mermaid_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -static UINT8 collision_check( running_machine &machine, rectangle* rect ) +static UINT8 collision_check( running_machine &machine, rectangle& rect ) { mermaid_state *state = machine.driver_data(); UINT8 data = 0; @@ -257,11 +248,11 @@ int x; int y; - for (y = rect->min_y; y <= rect->max_y; y++) - for (x = rect->min_x; x <= rect->max_x; x++) + for (y = rect.min_y; y <= rect.max_y; y++) + for (x = rect.min_x; x <= rect.max_x; x++) { - UINT16 a = colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(state->m_helper, y, x)) & 0x3f; - UINT16 b = colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(state->m_helper2, y, x)) & 0x3f; + UINT16 a = colortable_entry_get_value(machine.colortable, state->m_helper.pix16(y, x)) & 0x3f; + UINT16 b = colortable_entry_get_value(machine.colortable, state->m_helper2.pix16(y, x)) & 0x3f; if (b) if (a) @@ -271,304 +262,286 @@ return data; } -SCREEN_EOF( mermaid ) +SCREEN_VBLANK( mermaid ) { - mermaid_state *state = machine.driver_data(); - const rectangle &visarea = machine.primary_screen->visible_area(); - UINT8 *spriteram = state->m_spriteram; - - int offs, offs2; - - state->m_coll_bit0 = 0; - state->m_coll_bit1 = 0; - state->m_coll_bit2 = 0; - state->m_coll_bit3 = 0; - state->m_coll_bit6 = 0; - - // check for bit 0 (sprite-sprite), 1 (sprite-foreground), 2 (sprite-background) - - for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) + // rising edge + if (vblank_on) { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; + mermaid_state *state = screen.machine().driver_data(); + const rectangle &visarea = screen.machine().primary_screen->visible_area(); + UINT8 *spriteram = state->m_spriteram; - rectangle rect; + int offs, offs2; - if (coll != 1) continue; + state->m_coll_bit0 = 0; + state->m_coll_bit1 = 0; + state->m_coll_bit2 = 0; + state->m_coll_bit3 = 0; + state->m_coll_bit6 = 0; - code |= state->m_rougien_gfxbank1 * 0x2800; - code |= state->m_rougien_gfxbank2 * 0x2400; + // check for bit 0 (sprite-sprite), 1 (sprite-foreground), 2 (sprite-background) - if (flip_screen_x_get(machine)) + for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) { - flipx = !flipx; - sx = 240 - sx; - } + int attr = spriteram[offs + 2]; + int bank = (attr & 0x30) >> 4; + int coll = (attr & 0xc0) >> 6; + int code = (spriteram[offs] & 0x3f) | (bank << 6); + int flipx = spriteram[offs] & 0x40; + int flipy = spriteram[offs] & 0x80; + int sx = spriteram[offs + 3] + 1; + int sy = 240 - spriteram[offs + 1]; - if (flip_screen_y_get(machine)) - { - flipy = !flipy; - sy = 240 - sy; - } + rectangle rect; - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + machine.gfx[1]->width - 1; - rect.max_y = sy + machine.gfx[1]->height - 1; + if (coll != 1) continue; - if (rect.min_x < visarea.min_x) - rect.min_x = visarea.min_x; - if (rect.min_y < visarea.min_y) - rect.min_y = visarea.min_y; - if (rect.max_x > visarea.max_x) - rect.max_x = visarea.max_x; - if (rect.max_y > visarea.max_y) - rect.max_y = visarea.max_y; + code |= state->m_rougien_gfxbank1 * 0x2800; + code |= state->m_rougien_gfxbank2 * 0x2400; - // check collision sprite - background + if (flip_screen_x_get(screen.machine())) + { + flipx = !flipx; + sx = 240 - sx; + } - bitmap_fill(state->m_helper, &rect, 0); - bitmap_fill(state->m_helper2, &rect, 0); + if (flip_screen_y_get(screen.machine())) + { + flipy = !flipy; + sy = 240 - sy; + } - tilemap_draw(state->m_helper, &rect, state->m_bg_tilemap, 0, 0); + rect.min_x = sx; + rect.min_y = sy; + rect.max_x = sx + screen.machine().gfx[1]->width - 1; + rect.max_y = sy + screen.machine().gfx[1]->height - 1; - drawgfx_transpen(state->m_helper2, &rect, machine.gfx[1], code, 0, flipx, flipy, sx, sy, 0); + rect &= visarea; - state->m_coll_bit2 |= collision_check(machine, &rect); + // check collision sprite - background - // check collision sprite - foreground + state->m_helper.fill(0, rect); + state->m_helper2.fill(0, rect); - bitmap_fill(state->m_helper, &rect, 0); - bitmap_fill(state->m_helper2, &rect, 0); + state->m_bg_tilemap->draw(state->m_helper, rect, 0, 0); - tilemap_draw(state->m_helper, &rect, state->m_fg_tilemap, 0, 0); + drawgfx_transpen(state->m_helper2, rect, screen.machine().gfx[1], code, 0, flipx, flipy, sx, sy, 0); - drawgfx_transpen(state->m_helper2, &rect, machine.gfx[1], code, 0, flipx, flipy, sx, sy, 0); + state->m_coll_bit2 |= collision_check(screen.machine(), rect); - state->m_coll_bit1 |= collision_check(machine, &rect); + // check collision sprite - foreground - // check collision sprite - sprite + state->m_helper.fill(0, rect); + state->m_helper2.fill(0, rect); - bitmap_fill(state->m_helper, &rect, 0); - bitmap_fill(state->m_helper2, &rect, 0); + state->m_fg_tilemap->draw(state->m_helper, rect, 0, 0); - for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) - { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; + drawgfx_transpen(state->m_helper2, rect, screen.machine().gfx[1], code, 0, flipx, flipy, sx, sy, 0); - if (coll2 != 0) continue; + state->m_coll_bit1 |= collision_check(screen.machine(), rect); - code2 |= state->m_rougien_gfxbank1 * 0x2800; - code2 |= state->m_rougien_gfxbank2 * 0x2400; + // check collision sprite - sprite - if (flip_screen_x_get(machine)) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } + state->m_helper.fill(0, rect); + state->m_helper2.fill(0, rect); - if (flip_screen_y_get(machine)) + for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) + if (offs != offs2) { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } - - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); - } - - drawgfx_transpen(state->m_helper2, &rect, machine.gfx[1], code, 0, flipx, flipy, sx, sy, 0); - - state->m_coll_bit0 |= collision_check(machine, &rect); - } - - // check for bit 3 (sprite-sprite) - - for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; - - rectangle rect; + int attr2 = spriteram[offs2 + 2]; + int bank2 = (attr2 & 0x30) >> 4; + int coll2 = (attr2 & 0xc0) >> 6; + int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); + int flipx2 = spriteram[offs2] & 0x40; + int flipy2 = spriteram[offs2] & 0x80; + int sx2 = spriteram[offs2 + 3] + 1; + int sy2 = 240 - spriteram[offs2 + 1]; + + if (coll2 != 0) continue; + + code2 |= state->m_rougien_gfxbank1 * 0x2800; + code2 |= state->m_rougien_gfxbank2 * 0x2400; + + if (flip_screen_x_get(screen.machine())) + { + flipx2 = !flipx2; + sx2 = 240 - sx2; + } + + if (flip_screen_y_get(screen.machine())) + { + flipy2 = !flipy2; + sy2 = 240 - sy2; + } - if (coll != 2) continue; + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); + } - code |= state->m_rougien_gfxbank1 * 0x2800; - code |= state->m_rougien_gfxbank2 * 0x2400; + drawgfx_transpen(state->m_helper2, rect, screen.machine().gfx[1], code, 0, flipx, flipy, sx, sy, 0); - if (flip_screen_x_get(machine)) - { - flipx = !flipx; - sx = 240 - sx; + state->m_coll_bit0 |= collision_check(screen.machine(), rect); } - if (flip_screen_y_get(machine)) + // check for bit 3 (sprite-sprite) + + for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) { - flipy = !flipy; - sy = 240 - sy; - } + int attr = spriteram[offs + 2]; + int bank = (attr & 0x30) >> 4; + int coll = (attr & 0xc0) >> 6; + int code = (spriteram[offs] & 0x3f) | (bank << 6); + int flipx = spriteram[offs] & 0x40; + int flipy = spriteram[offs] & 0x80; + int sx = spriteram[offs + 3] + 1; + int sy = 240 - spriteram[offs + 1]; - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + machine.gfx[1]->width - 1; - rect.max_y = sy + machine.gfx[1]->height - 1; - - if (rect.min_x < visarea.min_x) - rect.min_x = visarea.min_x; - if (rect.min_y < visarea.min_y) - rect.min_y = visarea.min_y; - if (rect.max_x > visarea.max_x) - rect.max_x = visarea.max_x; - if (rect.max_y > visarea.max_y) - rect.max_y = visarea.max_y; + rectangle rect; - // check collision sprite - sprite + if (coll != 2) continue; - bitmap_fill(state->m_helper, &rect, 0); - bitmap_fill(state->m_helper2, &rect, 0); + code |= state->m_rougien_gfxbank1 * 0x2800; + code |= state->m_rougien_gfxbank2 * 0x2400; - for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) + if (flip_screen_x_get(screen.machine())) { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; - - if (coll2 != 0) continue; - - code2 |= state->m_rougien_gfxbank1 * 0x2800; - code2 |= state->m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x_get(machine)) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } - - if (flip_screen_y_get(machine)) - { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } + flipx = !flipx; + sx = 240 - sx; + } - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); + if (flip_screen_y_get(screen.machine())) + { + flipy = !flipy; + sy = 240 - sy; } - drawgfx_transpen(state->m_helper2, &rect, machine.gfx[1], code, 0, flipx, flipy, sx, sy, 0); + rect.min_x = sx; + rect.min_y = sy; + rect.max_x = sx + screen.machine().gfx[1]->width - 1; + rect.max_y = sy + screen.machine().gfx[1]->height - 1; - state->m_coll_bit3 |= collision_check(machine, &rect); - } + rect &= visarea; - // check for bit 6 + // check collision sprite - sprite - for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; + state->m_helper.fill(0, rect); + state->m_helper2.fill(0, rect); - rectangle rect; + for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) + if (offs != offs2) + { + int attr2 = spriteram[offs2 + 2]; + int bank2 = (attr2 & 0x30) >> 4; + int coll2 = (attr2 & 0xc0) >> 6; + int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); + int flipx2 = spriteram[offs2] & 0x40; + int flipy2 = spriteram[offs2] & 0x80; + int sx2 = spriteram[offs2 + 3] + 1; + int sy2 = 240 - spriteram[offs2 + 1]; + + if (coll2 != 0) continue; + + code2 |= state->m_rougien_gfxbank1 * 0x2800; + code2 |= state->m_rougien_gfxbank2 * 0x2400; + + if (flip_screen_x_get(screen.machine())) + { + flipx2 = !flipx2; + sx2 = 240 - sx2; + } + + if (flip_screen_y_get(screen.machine())) + { + flipy2 = !flipy2; + sy2 = 240 - sy2; + } - if (coll != 1) continue; + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); + } - code |= state->m_rougien_gfxbank1 * 0x2800; - code |= state->m_rougien_gfxbank2 * 0x2400; + drawgfx_transpen(state->m_helper2, rect, screen.machine().gfx[1], code, 0, flipx, flipy, sx, sy, 0); - if (flip_screen_x_get(machine)) - { - flipx = !flipx; - sx = 240 - sx; + state->m_coll_bit3 |= collision_check(screen.machine(), rect); } - if (flip_screen_y_get(machine)) + // check for bit 6 + + for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) { - flipy = !flipy; - sy = 240 - sy; - } + int attr = spriteram[offs + 2]; + int bank = (attr & 0x30) >> 4; + int coll = (attr & 0xc0) >> 6; + int code = (spriteram[offs] & 0x3f) | (bank << 6); + int flipx = spriteram[offs] & 0x40; + int flipy = spriteram[offs] & 0x80; + int sx = spriteram[offs + 3] + 1; + int sy = 240 - spriteram[offs + 1]; - rect.min_x = sx; - rect.min_y = sy; - rect.max_x = sx + machine.gfx[1]->width - 1; - rect.max_y = sy + machine.gfx[1]->height - 1; - - if (rect.min_x < visarea.min_x) - rect.min_x = visarea.min_x; - if (rect.min_y < visarea.min_y) - rect.min_y = visarea.min_y; - if (rect.max_x > visarea.max_x) - rect.max_x = visarea.max_x; - if (rect.max_y > visarea.max_y) - rect.max_y = visarea.max_y; + rectangle rect; - // check collision sprite - sprite + if (coll != 1) continue; - bitmap_fill(state->m_helper, &rect, 0); - bitmap_fill(state->m_helper2, &rect, 0); + code |= state->m_rougien_gfxbank1 * 0x2800; + code |= state->m_rougien_gfxbank2 * 0x2400; - for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) + if (flip_screen_x_get(screen.machine())) { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; + flipx = !flipx; + sx = 240 - sx; + } - if (coll2 != 2) continue; + if (flip_screen_y_get(screen.machine())) + { + flipy = !flipy; + sy = 240 - sy; + } - code2 |= state->m_rougien_gfxbank1 * 0x2800; - code2 |= state->m_rougien_gfxbank2 * 0x2400; + rect.min_x = sx; + rect.min_y = sy; + rect.max_x = sx + screen.machine().gfx[1]->width - 1; + rect.max_y = sy + screen.machine().gfx[1]->height - 1; - if (flip_screen_x_get(machine)) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } + rect &= visarea; - if (flip_screen_y_get(machine)) + // check collision sprite - sprite + + state->m_helper.fill(0, rect); + state->m_helper2.fill(0, rect); + + for (offs2 = state->m_spriteram_size - 4; offs2 >= 0; offs2 -= 4) + if (offs != offs2) { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } + int attr2 = spriteram[offs2 + 2]; + int bank2 = (attr2 & 0x30) >> 4; + int coll2 = (attr2 & 0xc0) >> 6; + int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); + int flipx2 = spriteram[offs2] & 0x40; + int flipy2 = spriteram[offs2] & 0x80; + int sx2 = spriteram[offs2 + 3] + 1; + int sy2 = 240 - spriteram[offs2 + 1]; + + if (coll2 != 2) continue; + + code2 |= state->m_rougien_gfxbank1 * 0x2800; + code2 |= state->m_rougien_gfxbank2 * 0x2400; + + if (flip_screen_x_get(screen.machine())) + { + flipx2 = !flipx2; + sx2 = 240 - sx2; + } + + if (flip_screen_y_get(screen.machine())) + { + flipy2 = !flipy2; + sy2 = 240 - sy2; + } - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); - } + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], code2, 0, flipx2, flipy2, sx2, sy2, 0); + } - drawgfx_transpen(state->m_helper2, &rect, machine.gfx[1], code, 0, flipx, flipy, sx, sy, 0); + drawgfx_transpen(state->m_helper2, rect, screen.machine().gfx[1], code, 0, flipx, flipy, sx, sy, 0); - state->m_coll_bit6 |= collision_check(machine, &rect); + state->m_coll_bit6 |= collision_check(screen.machine(), rect); + } } - } diff -Nru mame-0.144/src/mame/video/metlclsh.c mame-0.145/src/mame/video/metlclsh.c --- mame-0.144/src/mame/video/metlclsh.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/metlclsh.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,7 +44,7 @@ if (!(data & 4) && (state->m_gfxbank != data)) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_gfxbank = data & 3; } } @@ -98,7 +98,7 @@ { /* tilemap */ state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x1ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x1ff); } } @@ -121,14 +121,14 @@ UINT8 code = state->m_fgram[tile_index + 0x000]; UINT8 attr = state->m_fgram[tile_index + 0x400]; SET_TILE_INFO(2, code + ((attr & 0x03) << 8), (attr >> 5) & 3, 0); - tileinfo->category = ((attr & 0x80) ? 1 : 2); + tileinfo.category = ((attr & 0x80) ? 1 : 2); } WRITE8_HANDLER( metlclsh_fgram_w ) { metlclsh_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -147,8 +147,8 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, metlclsh_bgtilemap_scan, 16, 16, 32, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); state->save_pointer(NAME(state->m_otherram), 0x800); } @@ -174,7 +174,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { metlclsh_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -242,23 +242,23 @@ ***************************************************************************/ -SCREEN_UPDATE( metlclsh ) +SCREEN_UPDATE_IND16( metlclsh ) { - metlclsh_state *state = screen->machine().driver_data(); + metlclsh_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x10); + bitmap.fill(0x10, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1, 0); // low priority tiles of foreground + state->m_fg_tilemap->draw(bitmap, cliprect, 1, 0); // low priority tiles of foreground if (state->m_scrollx[0] & 0x08) // background (if enabled) { /* The background seems to be always flipped along x */ - tilemap_set_flip(state->m_bg_tilemap, (flip_screen_get(screen->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0) ^ TILEMAP_FLIPX); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx[1] + ((state->m_scrollx[0] & 0x02) << 7) ); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_flip((flip_screen_get(screen.machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0) ^ TILEMAP_FLIPX); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx[1] + ((state->m_scrollx[0] & 0x02) << 7) ); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } - draw_sprites(screen->machine(), bitmap, cliprect); // sprites - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 2, 0); // high priority tiles of foreground + draw_sprites(screen.machine(), bitmap, cliprect); // sprites + state->m_fg_tilemap->draw(bitmap, cliprect, 2, 0); // high priority tiles of foreground // popmessage("%02X", state->m_scrollx[0]); return 0; diff -Nru mame-0.144/src/mame/video/metro.c mame-0.145/src/mame/video/metro.c --- mame-0.144/src/mame/video/metro.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/metro.c 2012-02-06 21:30:31.000000000 +0000 @@ -83,7 +83,7 @@ { metro_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_k053936_ram[offset]); - tilemap_mark_tile_dirty(state->m_k053936_tilemap, offset); + state->m_k053936_tilemap->mark_tile_dirty(offset); } static TILEMAP_MAPPER( tilemap_scan_gstrik2 ) @@ -215,21 +215,10 @@ switch (flipxy) { default: - case 0x0: *pix = data[(y * (big?8:4)) + (x>>1)]; break; - case 0x1: *pix = data[(((big?15:7)-y) * (big?8:4)) + (x>>1)]; break; - case 0x2: *pix = data[(y * (big?8:4)) + ((big?7:3)-(x>>1))]; break; - case 0x3: *pix = data[(((big?15:7)-y) * (big?8:4)) + ((big?7:3)-(x>>1))]; break; - } - - if (!(flipxy&2)) - { - if (x&1) *pix >>= 4; - else *pix &= 0xf; - } - else - { - if (x&1) *pix &= 0xf; - else *pix >>= 4; + case 0x0: *pix = data[(y * (big?16:8)) + x]; break; + case 0x1: *pix = data[(((big?15:7)-y) * (big?16:8)) + x]; break; + case 0x2: *pix = data[(y * (big?16:8)) + ((big?15:7)-x)]; break; + case 0x3: *pix = data[(((big?15:7)-y) * (big?16:8)) + ((big?15:7)-x)]; break; } *pix |= (((((tile & 0x0ff00000) >> 20)) + 0x100)*0x10); @@ -284,9 +273,23 @@ /* Dirty tilemaps when the tiles set changes */ +static void expand_gfx1(metro_state &state) +{ + UINT8 *base_gfx = state.machine().region("gfx1")->base(); + UINT32 length = 2 * state.machine().region("gfx1")->bytes(); + state.m_expanded_gfx1 = auto_alloc_array(state.machine(), UINT8, length); + for (int i = 0; i < length; i += 2) + { + UINT8 src = base_gfx[i / 2]; + state.m_expanded_gfx1[i+0] = src & 15; + state.m_expanded_gfx1[i+1] = src >> 4; + } +} + VIDEO_START( metro_14100 ) { metro_state *state = machine.driver_data(); + expand_gfx1(*state); state->m_support_8bpp = 0; state->m_support_16x16 = 0; @@ -308,6 +311,7 @@ VIDEO_START( metro_14220 ) { metro_state *state = machine.driver_data(); + expand_gfx1(*state); state->m_support_8bpp = 1; state->m_support_16x16 = 0; @@ -329,6 +333,7 @@ VIDEO_START( metro_14300 ) { metro_state *state = machine.driver_data(); + expand_gfx1(*state); state->m_support_8bpp = 1; state->m_support_16x16 = 1; @@ -439,14 +444,16 @@ /* Draw sprites */ -void metro_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +void metro_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { metro_state *state = machine.driver_data(); - UINT8 *base_gfx = machine.region("gfx1")->base(); - UINT8 *gfx_max = base_gfx + machine.region("gfx1")->bytes(); + UINT8 *base_gfx4 = state->m_expanded_gfx1; + UINT8 *base_gfx8 = machine.region("gfx1")->base(); + UINT32 gfx_size = machine.region("gfx1")->bytes(); + const rectangle &visarea = machine.primary_screen->visible_area(); - int max_x = machine.primary_screen->width(); - int max_y = machine.primary_screen->height(); + int max_x = visarea.max_x + 1; + int max_y = visarea.max_y + 1; int max_sprites = state->m_spriteram_size / 8; int sprites = state->m_videoregs[0x00/2] % max_sprites; @@ -478,7 +485,6 @@ for (j = 0; j < sprites; j++) { int x, y, attr, code, color, flipx, flipy, zoom, curr_pri, width, height; - UINT8 *gfxdata; /* Exponential zoom table extracted from daitoride */ static const int zoomtable[0x40] = @@ -524,7 +530,7 @@ width = (((attr >> 11) & 0x7) + 1) * 8; height = (((attr >> 8) & 0x7) + 1) * 8; - gfxdata = base_gfx + (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code); + UINT32 gfxstart = (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code); if (state->m_flip_screen) { @@ -535,10 +541,10 @@ if (state->m_support_8bpp && color == 0xf) /* 8bpp */ { /* Bounds checking */ - if ((gfxdata + width * height - 1) >= gfx_max) + if ((gfxstart + width * height - 1) >= gfx_size) continue; - gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width, 0, 256, 0); + gfx_element_build_temporary(&gfx, machine, base_gfx8 + gfxstart, width, height, width, 0, 256, 0); pdrawgfxzoom_transpen( bitmap,cliprect, &gfx, 0, @@ -551,10 +557,10 @@ else { /* Bounds checking */ - if ((gfxdata + width / 2 * height - 1) >= gfx_max) + if ((gfxstart + width / 2 * height - 1) >= gfx_size) continue; - gfx_element_build_temporary(&gfx, machine, gfxdata, width, height, width/2, 0, 16, GFX_ELEMENT_PACKED); + gfx_element_build_temporary(&gfx, machine, base_gfx4 + 2 * gfxstart, width, height, width, 0, 16, 0); pdrawgfxzoom_transpen( bitmap,cliprect, &gfx, 0, @@ -589,19 +595,19 @@ /* copy a 'window' from the large 2048x2048 (or 4096x4096 for 16x16 tiles) tilemap */ -static void draw_tilemap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 flags, UINT32 pcode, +static void draw_tilemap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 flags, UINT32 pcode, int sx, int sy, int wx, int wy, int big, UINT16* tilemapram, int layer ) { metro_state *state = machine.driver_data(); int y; - bitmap_t *priority_bitmap = machine.priority_bitmap; + bitmap_ind8 &priority_bitmap = machine.priority_bitmap; int width = big ? 4096 : 2048;//pixdata->width; int height = big ? 4096 : 2048;//pixdata->height; - int scrwidth = bitmap->width; - int scrheight = bitmap->height; + int scrwidth = bitmap.width(); + int scrheight = bitmap.height(); int windowwidth = width >> 2; int windowheight = height >> 3; @@ -636,8 +642,8 @@ if (!state->m_flip_screen) { - dst = BITMAP_ADDR16(bitmap, y, 0); - priority_baseaddr = BITMAP_ADDR8(priority_bitmap, y, 0); + dst = &bitmap.pix16(y); + priority_baseaddr = &priority_bitmap.pix8(y); for (x=0;x(); UINT16 layers_pri = state->m_videoregs[0x10 / 2]; @@ -720,18 +726,19 @@ -SCREEN_UPDATE( metro ) +SCREEN_UPDATE_IND16( metro ) { - metro_state *state = screen->machine().driver_data(); + metro_state *state = screen.machine().driver_data(); int pri, layers_ctrl = -1; UINT16 screenctrl = *state->m_screenctrl; + const rectangle &visarea = screen.machine().primary_screen->visible_area(); - state->m_sprite_xoffs = state->m_videoregs[0x06 / 2] - screen->width() / 2; - state->m_sprite_yoffs = state->m_videoregs[0x04 / 2] - screen->height() / 2; + state->m_sprite_xoffs = state->m_videoregs[0x06 / 2] - (visarea.max_x + 1) / 2; + state->m_sprite_yoffs = state->m_videoregs[0x04 / 2] - (visarea.max_y + 1) / 2; /* The background color is selected by a register */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, ((state->m_videoregs[0x12/2] & 0x0fff)) + 0x1000); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill((state->m_videoregs[0x12/2] & 0x0fff) + 0x1000, cliprect); /* Screen Control Register: @@ -747,7 +754,7 @@ if (screenctrl & 2) return 0; - //flip_screen_set(screen->machine(), screenctrl & 1); + //flip_screen_set(screen.machine(), screenctrl & 1); state->m_flip_screen = screenctrl & 1; /* If the game supports 16x16 tiles, make sure that the @@ -768,16 +775,16 @@ #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); layers_ctrl &= msk; } @@ -792,9 +799,9 @@ k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_k053936_tilemap, 0, 0, 1); for (pri = 3; pri >= 0; pri--) - draw_layers(screen->machine(), bitmap, cliprect, pri, layers_ctrl); + draw_layers(screen.machine(), bitmap, cliprect, pri, layers_ctrl); if (layers_ctrl & 0x08) - metro_draw_sprites(screen->machine(), bitmap, cliprect); + metro_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mexico86.c mame-0.145/src/mame/video/mexico86.c --- mame-0.144/src/mame/video/mexico86.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mexico86.c 2012-02-06 21:30:32.000000000 +0000 @@ -16,9 +16,9 @@ -SCREEN_UPDATE( mexico86 ) +SCREEN_UPDATE_IND16( mexico86 ) { - mexico86_state *state = screen->machine().driver_data(); + mexico86_state *state = screen.machine().driver_data(); int offs; int sx, sy, xc, yc; int gfx_num, gfx_attr, gfx_offs; @@ -27,7 +27,7 @@ /* Bubble Bobble doesn't have a real video RAM. All graphics (characters */ /* and sprites) are stored in the same memory region, and information on */ /* the background character columns is stored inthe area dd00-dd3f */ - bitmap_fill(bitmap, cliprect, 255); + bitmap.fill(255, cliprect); sx = 0; @@ -88,7 +88,7 @@ x = (sx + xc * 8) & 0xff; y = (sy + yc * 8) & 0xff; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, flipx,flipy, @@ -99,9 +99,9 @@ return 0; } -SCREEN_UPDATE( kikikai ) +SCREEN_UPDATE_IND16( kikikai ) { - mexico86_state *state = screen->machine().driver_data(); + mexico86_state *state = screen.machine().driver_data(); int offs; int sx, sy, yc; int gfx_num, /*gfx_attr,*/ gfx_offs; @@ -109,7 +109,7 @@ int goffs, code, color, y; int tx, ty; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); sx = 0; for (offs = 0; offs < state->m_objectram_size; offs += 4) { @@ -147,7 +147,7 @@ color = (state->m_videoram[goffs + 1] & 0xe0) >> 5; goffs += 0x40; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, 0,0, @@ -156,7 +156,7 @@ code = state->m_videoram[goffs] + ((state->m_videoram[goffs + 1] & 0x1f) << 8); color = (state->m_videoram[goffs + 1] & 0xe0) >> 5; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, color, 0,0, diff -Nru mame-0.144/src/mame/video/micro3d.c mame-0.145/src/mame/video/micro3d.c --- mame-0.144/src/mame/video/micro3d.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/micro3d.c 2012-02-06 21:30:33.000000000 +0000 @@ -64,12 +64,12 @@ * *************************************/ -void micro3d_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void micro3d_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { micro3d_state *state = screen.machine().driver_data(); UINT16 *src = &state->m_micro3d_sprite_vram[(params->rowaddr << 8) & 0x7fe00]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = params->coladdr; int sd_11_7 = (state->m_creg & 0x1f) << 7; int x; diff -Nru mame-0.144/src/mame/video/midtunit.c mame-0.145/src/mame/video/midtunit.c --- mame-0.144/src/mame/video/midtunit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/midtunit.c 2012-02-06 21:30:32.000000000 +0000 @@ -802,10 +802,10 @@ * *************************************/ -void midtunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void midtunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { UINT16 *src = &local_videoram[(params->rowaddr << 9) & 0x3fe00]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = params->coladdr << 1; int x; @@ -814,11 +814,11 @@ dest[x] = src[coladdr++ & 0x1ff] & 0x7fff; } -void midxunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void midxunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { UINT32 fulladdr = ((params->rowaddr << 16) | params->coladdr) >> 3; UINT16 *src = &local_videoram[fulladdr & 0x3fe00]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int x; /* copy the non-blanked portions of this scanline */ diff -Nru mame-0.144/src/mame/video/midvunit.c mame-0.145/src/mame/video/midvunit.c --- mame-0.144/src/mame/video/midvunit.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/midvunit.c 2012-02-06 21:30:31.000000000 +0000 @@ -8,7 +8,6 @@ #include "cpu/tms34010/tms34010.h" #include "cpu/adsp2100/adsp2100.h" #include "audio/williams.h" -#include "video/poly.h" #include "includes/midvunit.h" @@ -24,14 +23,9 @@ #define TIME_PER_PIXEL 41e-9 -typedef struct _poly_extra_data poly_extra_data; -struct _poly_extra_data -{ - UINT8 * texbase; - UINT16 pixdata; - UINT8 dither; -}; - +midvunit_renderer::midvunit_renderer(midvunit_state &state) + : poly_manager(state.machine()), + m_state(state) { } /************************************* @@ -56,19 +50,12 @@ } -static void midvunit_exit(running_machine &machine) -{ - midvunit_state *state = machine.driver_data(); - poly_free(state->m_poly); -} - - VIDEO_START( midvunit ) { midvunit_state *state = machine.driver_data(); state->m_scanline_timer = machine.scheduler().timer_alloc(FUNC(scanline_timer_cb)); - state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); - machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midvunit_exit), &machine)); + + state->m_poly = auto_alloc(machine, midvunit_renderer(*state)); state_save_register_global_array(machine, state->m_video_regs); state_save_register_global_array(machine, state->m_dma_data); @@ -85,26 +72,25 @@ * *************************************/ -static void render_flat(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void midvunit_renderer::render_flat(INT32 scanline, const extent_t &extent, const midvunit_object_data &objectdata, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - UINT16 pixdata = extra->pixdata; - int xstep = extra->dither + 1; - UINT16 *dest = (UINT16 *)destbase + scanline * 512; - int startx = extent->startx; + UINT16 pixdata = objectdata.pixdata; + int xstep = objectdata.dither + 1; + UINT16 *dest = objectdata.destbase + scanline * 512; + int startx = extent.startx; int x; /* if dithering, ensure that we start on an appropriate pixel */ - startx += (scanline ^ startx) & extra->dither; + startx += (scanline ^ startx) & objectdata.dither; /* non-dithered 0 pixels can use a memset */ if (pixdata == 0 && xstep == 1) - memset(&dest[startx], 0, 2 * (extent->stopx - startx + 1)); + memset(&dest[startx], 0, 2 * (extent.stopx - startx + 1)); /* otherwise, we fill manually */ else { - for (x = startx; x < extent->stopx; x += xstep) + for (x = startx; x < extent.stopx; x += xstep) dest[x] = pixdata; } } @@ -117,19 +103,18 @@ * *************************************/ -static void render_tex(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void midvunit_renderer::render_tex(INT32 scanline, const extent_t &extent, const midvunit_object_data &objectdata, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - UINT16 pixdata = extra->pixdata & 0xff00; - const UINT8 *texbase = extra->texbase; - int xstep = extra->dither + 1; - UINT16 *dest = (UINT16 *)destbase + scanline * 512; - int startx = extent->startx; - int stopx = extent->stopx; - INT32 u = extent->param[0].start; - INT32 v = extent->param[1].start; - INT32 dudx = extent->param[0].dpdx; - INT32 dvdx = extent->param[1].dpdx; + UINT16 pixdata = objectdata.pixdata & 0xff00; + const UINT8 *texbase = objectdata.texbase; + int xstep = objectdata.dither + 1; + UINT16 *dest = objectdata.destbase + scanline * 512; + int startx = extent.startx; + int stopx = extent.stopx; + INT32 u = extent.param[0].start; + INT32 v = extent.param[1].start; + INT32 dudx = extent.param[0].dpdx; + INT32 dvdx = extent.param[1].dpdx; int x; /* if dithering, we advance by 2x; also ensure that we start on an appropriate pixel */ @@ -155,19 +140,18 @@ } -static void render_textrans(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void midvunit_renderer::render_textrans(INT32 scanline, const extent_t &extent, const midvunit_object_data &objectdata, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - UINT16 pixdata = extra->pixdata & 0xff00; - const UINT8 *texbase = extra->texbase; - int xstep = extra->dither + 1; - UINT16 *dest = (UINT16 *)destbase + scanline * 512; - int startx = extent->startx; - int stopx = extent->stopx; - INT32 u = extent->param[0].start; - INT32 v = extent->param[1].start; - INT32 dudx = extent->param[0].dpdx; - INT32 dvdx = extent->param[1].dpdx; + UINT16 pixdata = objectdata.pixdata & 0xff00; + const UINT8 *texbase = objectdata.texbase; + int xstep = objectdata.dither + 1; + UINT16 *dest = objectdata.destbase + scanline * 512; + int startx = extent.startx; + int stopx = extent.stopx; + INT32 u = extent.param[0].start; + INT32 v = extent.param[1].start; + INT32 dudx = extent.param[0].dpdx; + INT32 dvdx = extent.param[1].dpdx; int x; /* if dithering, we advance by 2x; also ensure that we start on an appropriate pixel */ @@ -195,19 +179,18 @@ } -static void render_textransmask(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +void midvunit_renderer::render_textransmask(INT32 scanline, const extent_t &extent, const midvunit_object_data &objectdata, int threadid) { - const poly_extra_data *extra = (const poly_extra_data *)extradata; - UINT16 pixdata = extra->pixdata; - const UINT8 *texbase = extra->texbase; - int xstep = extra->dither + 1; - UINT16 *dest = (UINT16 *)destbase + scanline * 512; - int startx = extent->startx; - int stopx = extent->stopx; - INT32 u = extent->param[0].start; - INT32 v = extent->param[1].start; - INT32 dudx = extent->param[0].dpdx; - INT32 dvdx = extent->param[1].dpdx; + UINT16 pixdata = objectdata.pixdata; + const UINT8 *texbase = objectdata.texbase; + int xstep = objectdata.dither + 1; + UINT16 *dest = objectdata.destbase + scanline * 512; + int startx = extent.startx; + int stopx = extent.stopx; + INT32 u = extent.param[0].start; + INT32 v = extent.param[1].start; + INT32 dudx = extent.param[0].dpdx; + INT32 dvdx = extent.param[1].dpdx; int x; /* if dithering, we advance by 2x; also ensure that we start on an appropriate pixel */ @@ -242,17 +225,15 @@ * *************************************/ -static void make_vertices_inclusive(poly_vertex *vert) +void midvunit_renderer::make_vertices_inclusive(vertex_t *vert) { - UINT8 rmask = 0, bmask = 0, eqmask = 0; - int vnum; - /* build up a mask of right and bottom points */ /* note we assume clockwise orientation here */ - for (vnum = 0; vnum < 4; vnum++) + UINT8 rmask = 0, bmask = 0, eqmask = 0; + for (int vnum = 0; vnum < 4; vnum++) { - poly_vertex *currv = &vert[vnum]; - poly_vertex *nextv = &vert[(vnum + 1) & 3]; + vertex_t *currv = &vert[vnum]; + vertex_t *nextv = &vert[(vnum + 1) & 3]; /* if this vertex equals the next one, tag it */ if (nextv->y == currv->y && nextv->x == currv->x) @@ -272,9 +253,9 @@ return; /* adjust the right/bottom points so that they get included */ - for (vnum = 0; vnum < 4; vnum++) + for (int vnum = 0; vnum < 4; vnum++) { - poly_vertex *currv = &vert[vnum]; + vertex_t *currv = &vert[vnum]; int effvnum = vnum; /* if we're equal to the next vertex, use that instead */ @@ -290,73 +271,71 @@ } -static void process_dma_queue(running_machine &machine) +void midvunit_renderer::process_dma_queue() { - midvunit_state *state = machine.driver_data(); - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); - UINT16 *dest = &state->m_videoram[(state->m_page_control & 4) ? 0x40000 : 0x00000]; - int textured = ((state->m_dma_data[0] & 0x300) == 0x100); - poly_draw_scanline_func callback; - poly_vertex vert[4]; - /* if we're rendering to the same page we're viewing, it has changed */ - if ((((state->m_page_control >> 2) ^ state->m_page_control) & 1) == 0 || WATCH_RENDER) - state->m_video_changed = TRUE; + if ((((m_state.m_page_control >> 2) ^ m_state.m_page_control) & 1) == 0 || WATCH_RENDER) + m_state.m_video_changed = TRUE; /* fill in the vertex data */ - vert[0].x = (float)(INT16)state->m_dma_data[2] + 0.5f; - vert[0].y = (float)(INT16)state->m_dma_data[3] + 0.5f; - vert[1].x = (float)(INT16)state->m_dma_data[4] + 0.5f; - vert[1].y = (float)(INT16)state->m_dma_data[5] + 0.5f; - vert[2].x = (float)(INT16)state->m_dma_data[6] + 0.5f; - vert[2].y = (float)(INT16)state->m_dma_data[7] + 0.5f; - vert[3].x = (float)(INT16)state->m_dma_data[8] + 0.5f; - vert[3].y = (float)(INT16)state->m_dma_data[9] + 0.5f; + vertex_t vert[4]; + vert[0].x = (float)(INT16)m_state.m_dma_data[2] + 0.5f; + vert[0].y = (float)(INT16)m_state.m_dma_data[3] + 0.5f; + vert[1].x = (float)(INT16)m_state.m_dma_data[4] + 0.5f; + vert[1].y = (float)(INT16)m_state.m_dma_data[5] + 0.5f; + vert[2].x = (float)(INT16)m_state.m_dma_data[6] + 0.5f; + vert[2].y = (float)(INT16)m_state.m_dma_data[7] + 0.5f; + vert[3].x = (float)(INT16)m_state.m_dma_data[8] + 0.5f; + vert[3].y = (float)(INT16)m_state.m_dma_data[9] + 0.5f; /* make the vertices inclusive of right/bottom points */ make_vertices_inclusive(vert); /* handle flat-shaded quads here */ + render_delegate callback; + bool textured = ((m_state.m_dma_data[0] & 0x300) == 0x100); if (!textured) - callback = render_flat; + callback = render_delegate(FUNC(midvunit_renderer::render_flat), this); /* handle textured quads here */ else { /* if textured, add the texture info */ - vert[0].p[0] = (float)(state->m_dma_data[10] & 0xff) * 65536.0f + 32768.0f; - vert[0].p[1] = (float)(state->m_dma_data[10] >> 8) * 65536.0f + 32768.0f; - vert[1].p[0] = (float)(state->m_dma_data[11] & 0xff) * 65536.0f + 32768.0f; - vert[1].p[1] = (float)(state->m_dma_data[11] >> 8) * 65536.0f + 32768.0f; - vert[2].p[0] = (float)(state->m_dma_data[12] & 0xff) * 65536.0f + 32768.0f; - vert[2].p[1] = (float)(state->m_dma_data[12] >> 8) * 65536.0f + 32768.0f; - vert[3].p[0] = (float)(state->m_dma_data[13] & 0xff) * 65536.0f + 32768.0f; - vert[3].p[1] = (float)(state->m_dma_data[13] >> 8) * 65536.0f + 32768.0f; + vert[0].p[0] = (float)(m_state.m_dma_data[10] & 0xff) * 65536.0f + 32768.0f; + vert[0].p[1] = (float)(m_state.m_dma_data[10] >> 8) * 65536.0f + 32768.0f; + vert[1].p[0] = (float)(m_state.m_dma_data[11] & 0xff) * 65536.0f + 32768.0f; + vert[1].p[1] = (float)(m_state.m_dma_data[11] >> 8) * 65536.0f + 32768.0f; + vert[2].p[0] = (float)(m_state.m_dma_data[12] & 0xff) * 65536.0f + 32768.0f; + vert[2].p[1] = (float)(m_state.m_dma_data[12] >> 8) * 65536.0f + 32768.0f; + vert[3].p[0] = (float)(m_state.m_dma_data[13] & 0xff) * 65536.0f + 32768.0f; + vert[3].p[1] = (float)(m_state.m_dma_data[13] >> 8) * 65536.0f + 32768.0f; /* handle non-masked, non-transparent quads */ - if ((state->m_dma_data[0] & 0xc00) == 0x000) - callback = render_tex; + if ((m_state.m_dma_data[0] & 0xc00) == 0x000) + callback = render_delegate(FUNC(midvunit_renderer::render_tex), this); /* handle non-masked, transparent quads */ - else if ((state->m_dma_data[0] & 0xc00) == 0x800) - callback = render_textrans; + else if ((m_state.m_dma_data[0] & 0xc00) == 0x800) + callback = render_delegate(FUNC(midvunit_renderer::render_textrans), this); /* handle masked, transparent quads */ - else if ((state->m_dma_data[0] & 0xc00) == 0xc00) - callback = render_textransmask; + else if ((m_state.m_dma_data[0] & 0xc00) == 0xc00) + callback = render_delegate(FUNC(midvunit_renderer::render_textransmask), this); /* handle masked, non-transparent quads */ else - callback = render_flat; + callback = render_delegate(FUNC(midvunit_renderer::render_flat), this); } - /* set up the extra data for this triangle */ - extra->texbase = (UINT8 *)state->m_textureram + (state->m_dma_data[14] * 256); - extra->pixdata = state->m_dma_data[1] | (state->m_dma_data[0] & 0x00ff); - extra->dither = ((state->m_dma_data[0] & 0x2000) != 0); + /* set up the object data for this triangle */ + midvunit_object_data &objectdata = object_data_alloc(); + objectdata.destbase = &m_state.m_videoram[(m_state.m_page_control & 4) ? 0x40000 : 0x00000]; + objectdata.texbase = (UINT8 *)m_state.m_textureram + (m_state.m_dma_data[14] * 256); + objectdata.pixdata = m_state.m_dma_data[1] | (m_state.m_dma_data[0] & 0x00ff); + objectdata.dither = ((m_state.m_dma_data[0] & 0x2000) != 0); /* render as a quad */ - poly_render_quad(state->m_poly, dest, &machine.primary_screen->visible_area(), callback, textured ? 2 : 0, &vert[0], &vert[1], &vert[2], &vert[3]); + render_polygon<4>(machine().primary_screen->visible_area(), callback, textured ? 2 : 0, vert); } @@ -391,7 +370,7 @@ { if (LOG_DMA && space->machine().input().code_pressed(KEYCODE_L)) logerror("%06X:trigger\n", cpu_get_pc(&space->device())); - process_dma_queue(space->machine()); + state->m_poly->process_dma_queue(); state->m_dma_data_index = 0; } return 0; @@ -477,7 +456,7 @@ WRITE32_HANDLER( midvunit_videoram_w ) { midvunit_state *state = space->machine().driver_data(); - poly_wait(state->m_poly, "Video RAM write"); + state->m_poly->wait("Video RAM write"); if (!state->m_video_changed) { int visbase = (state->m_page_control & 1) ? 0x40000 : 0x00000; @@ -491,7 +470,7 @@ READ32_HANDLER( midvunit_videoram_r ) { midvunit_state *state = space->machine().driver_data(); - poly_wait(state->m_poly, "Video RAM read"); + state->m_poly->wait("Video RAM read"); return state->m_videoram[offset]; } @@ -524,7 +503,7 @@ { midvunit_state *state = space->machine().driver_data(); UINT8 *base = (UINT8 *)state->m_textureram; - poly_wait(state->m_poly, "Texture RAM write"); + state->m_poly->wait("Texture RAM write"); base[offset * 2] = data; base[offset * 2 + 1] = data >> 8; } @@ -546,13 +525,13 @@ * *************************************/ -SCREEN_UPDATE( midvunit ) +SCREEN_UPDATE_IND16( midvunit ) { - midvunit_state *state = screen->machine().driver_data(); + midvunit_state *state = screen.machine().driver_data(); int x, y, width, xoffs; UINT32 offset; - poly_wait(state->m_poly, "Refresh Time"); + state->m_poly->wait("Refresh Time"); /* if the video didn't change, indicate as much */ if (!state->m_video_changed) @@ -567,17 +546,17 @@ #endif /* determine how many pixels to copy */ - xoffs = cliprect->min_x; - width = cliprect->max_x - xoffs + 1; + xoffs = cliprect.min_x; + width = cliprect.max_x - xoffs + 1; /* adjust the offset */ offset += xoffs; - offset += 512 * (cliprect->min_y - screen->visible_area().min_y); + offset += 512 * (cliprect.min_y - screen.visible_area().min_y); /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels + cliprect->min_x; + UINT16 *dest = &bitmap.pix16(y, cliprect.min_x); for (x = 0; x < width; x++) *dest++ = state->m_videoram[offset + x] & 0x7fff; offset += 512; diff -Nru mame-0.144/src/mame/video/midyunit.c mame-0.145/src/mame/video/midyunit.c --- mame-0.144/src/mame/video/midyunit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/midyunit.c 2012-02-06 21:30:32.000000000 +0000 @@ -552,11 +552,11 @@ } -void midyunit_scanline_update(screen_device &screen, bitmap_t *bitmap, int scanline, const tms34010_display_params *params) +void midyunit_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params) { midyunit_state *state = screen.machine().driver_data(); UINT16 *src = &state->m_local_videoram[(params->rowaddr << 9) & 0x3fe00]; - UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + UINT16 *dest = &bitmap.pix16(scanline); int coladdr = params->coladdr << 1; int x; diff -Nru mame-0.144/src/mame/video/midzeus2.c mame-0.145/src/mame/video/midzeus2.c --- mame-0.144/src/mame/video/midzeus2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/midzeus2.c 2012-02-06 21:30:31.000000000 +0000 @@ -187,14 +187,14 @@ #ifdef UNUSED_FUNCTION INLINE void waveram_plot(int y, int x, UINT32 color) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) WAVERAM_WRITEPIX(zeus_renderbase, y, x, color); } #endif INLINE void waveram_plot_depth(int y, int x, UINT32 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { WAVERAM_WRITEPIX(zeus_renderbase, y, x, color); WAVERAM_WRITEDEPTH(zeus_renderbase, y, x, depth); @@ -204,7 +204,7 @@ #ifdef UNUSED_FUNCTION INLINE void waveram_plot_check_depth(int y, int x, UINT32 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x); if (depth <= *depthptr) @@ -219,7 +219,7 @@ #ifdef UNUSED_FUNCTION INLINE void waveram_plot_check_depth_nowrite(int y, int x, UINT32 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x); if (depth <= *depthptr) @@ -358,24 +358,24 @@ * *************************************/ -SCREEN_UPDATE( midzeus2 ) +SCREEN_UPDATE_RGB32( midzeus2 ) { int x, y; poly_wait(poly, "VIDEO_UPDATE"); -if (screen->machine().input().code_pressed(KEYCODE_UP)) { zbase += 1.0f; popmessage("Zbase = %f", zbase); } -if (screen->machine().input().code_pressed(KEYCODE_DOWN)) { zbase -= 1.0f; popmessage("Zbase = %f", zbase); } +if (screen.machine().input().code_pressed(KEYCODE_UP)) { zbase += 1.0f; popmessage("Zbase = %f", zbase); } +if (screen.machine().input().code_pressed(KEYCODE_DOWN)) { zbase -= 1.0f; popmessage("Zbase = %f", zbase); } /* normal update case */ - if (!screen->machine().input().code_pressed(KEYCODE_W)) + if (!screen.machine().input().code_pressed(KEYCODE_W)) { const void *base = waveram1_ptr_from_expanded_addr(zeusbase[0x38]); - int xoffs = screen->visible_area().min_x; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + int xoffs = screen.visible_area().min_x; + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dest = (UINT32 *)bitmap->base + y * bitmap->rowpixels; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT32 *dest = &bitmap.pix32(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dest[x] = WAVERAM_READPIX(base, y, x - xoffs); } } @@ -385,18 +385,18 @@ { const UINT64 *base; - if (screen->machine().input().code_pressed(KEYCODE_DOWN)) yoffs += screen->machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; - if (screen->machine().input().code_pressed(KEYCODE_UP)) yoffs -= screen->machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; - if (screen->machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (screen->machine().input().code_pressed(KEYCODE_LEFT)) ; } - if (screen->machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (screen->machine().input().code_pressed(KEYCODE_RIGHT)) ; } + if (screen.machine().input().code_pressed(KEYCODE_DOWN)) yoffs += screen.machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; + if (screen.machine().input().code_pressed(KEYCODE_UP)) yoffs -= screen.machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; + if (screen.machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (screen.machine().input().code_pressed(KEYCODE_LEFT)) ; } + if (screen.machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (screen.machine().input().code_pressed(KEYCODE_RIGHT)) ; } if (yoffs < 0) yoffs = 0; base = (const UINT64 *)waveram0_ptr_from_expanded_addr(yoffs << 16); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dest = (UINT32 *)bitmap->base + y * bitmap->rowpixels; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT32 *dest = &bitmap.pix32(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 tex = get_texel_8bit(base, y, x, texel_width); dest[x] = (tex << 16) | (tex << 8) | tex; @@ -564,12 +564,8 @@ { int vtotal = zeusbase[0x37] & 0xffff; int htotal = zeusbase[0x34] >> 16; - rectangle visarea; - visarea.min_x = zeusbase[0x33] >> 16; - visarea.max_x = (zeusbase[0x34] & 0xffff) - 1; - visarea.min_y = 0; - visarea.max_y = zeusbase[0x35] & 0xffff; + rectangle visarea(zeusbase[0x33] >> 16, (zeusbase[0x34] & 0xffff) - 1, 0, zeusbase[0x35] & 0xffff); if (htotal > 0 && vtotal > 0 && visarea.min_x < visarea.max_x && visarea.max_y < vtotal) { machine.primary_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS((double)MIDZEUS_VIDEO_CLOCK / 4.0 / (htotal * vtotal))); @@ -1260,7 +1256,7 @@ extra->texbase = WAVERAM_BLOCK0(zeus_texbase); extra->palbase = waveram0_ptr_from_expanded_addr(zeusbase[0x41]); - poly_render_quad_fan(poly, NULL, &zeus_cliprect, callback, 4, numverts, &clipvert[0]); + poly_render_quad_fan(poly, NULL, zeus_cliprect, callback, 4, numverts, &clipvert[0]); } diff -Nru mame-0.144/src/mame/video/midzeus.c mame-0.145/src/mame/video/midzeus.c --- mame-0.144/src/mame/video/midzeus.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/midzeus.c 2012-02-06 21:30:31.000000000 +0000 @@ -184,13 +184,13 @@ INLINE void waveram_plot(int y, int x, UINT16 color) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) WAVERAM_WRITEPIX(zeus_renderbase, y, x, color); } INLINE void waveram_plot_depth(int y, int x, UINT16 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { WAVERAM_WRITEPIX(zeus_renderbase, y, x, color); WAVERAM_WRITEDEPTH(zeus_renderbase, y, x, depth); @@ -199,7 +199,7 @@ INLINE void waveram_plot_check_depth(int y, int x, UINT16 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x); if (depth <= *depthptr) @@ -213,7 +213,7 @@ #ifdef UNUSED_FUNCTION INLINE void waveram_plot_check_depth_nowrite(int y, int x, UINT16 color, UINT16 depth) { - if (x >= 0 && x <= zeus_cliprect.max_x && y >= 0 && y < zeus_cliprect.max_y) + if (zeus_cliprect.contains(x, y)) { UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x); if (depth <= *depthptr) @@ -332,21 +332,21 @@ * *************************************/ -SCREEN_UPDATE( midzeus ) +SCREEN_UPDATE_IND16( midzeus ) { int x, y; poly_wait(poly, "VIDEO_UPDATE"); /* normal update case */ - if (!screen->machine().input().code_pressed(KEYCODE_W)) + if (!screen.machine().input().code_pressed(KEYCODE_W)) { const void *base = waveram1_ptr_from_expanded_addr(zeusbase[0xcc]); - int xoffs = screen->visible_area().min_x; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + int xoffs = screen.visible_area().min_x; + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT16 *dest = &bitmap.pix16(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dest[x] = WAVERAM_READPIX(base, y, x - xoffs) & 0x7fff; } } @@ -356,18 +356,18 @@ { const void *base; - if (screen->machine().input().code_pressed(KEYCODE_DOWN)) yoffs += screen->machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; - if (screen->machine().input().code_pressed(KEYCODE_UP)) yoffs -= screen->machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; - if (screen->machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (screen->machine().input().code_pressed(KEYCODE_LEFT)) ; } - if (screen->machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (screen->machine().input().code_pressed(KEYCODE_RIGHT)) ; } + if (screen.machine().input().code_pressed(KEYCODE_DOWN)) yoffs += screen.machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; + if (screen.machine().input().code_pressed(KEYCODE_UP)) yoffs -= screen.machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; + if (screen.machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (screen.machine().input().code_pressed(KEYCODE_LEFT)) ; } + if (screen.machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (screen.machine().input().code_pressed(KEYCODE_RIGHT)) ; } if (yoffs < 0) yoffs = 0; base = waveram0_ptr_from_block_addr(yoffs << 12); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT16 *dest = &bitmap.pix16(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 tex = get_texel_8bit(base, y, x, texel_width); dest[x] = (tex << 8) | tex; @@ -653,7 +653,7 @@ extra->solidcolor = zeusbase[0x00]; extra->zoffset = 0x7fff; - poly_render_quad(poly, NULL, &zeus_cliprect, render_poly_solid_fixedz, 0, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_quad(poly, NULL, zeus_cliprect, render_poly_solid_fixedz, 0, &vert[0], &vert[1], &vert[2], &vert[3]); poly_wait(poly, "Normal"); } else @@ -743,12 +743,8 @@ { int vtotal = zeusbase[0xca] >> 16; int htotal = zeusbase[0xc6] >> 16; - rectangle visarea; - visarea.min_x = zeusbase[0xc6] & 0xffff; - visarea.max_x = htotal - 3; - visarea.min_y = 0; - visarea.max_y = zeusbase[0xc8] & 0xffff; + rectangle visarea(zeusbase[0xc6] & 0xffff, htotal - 3, 0, zeusbase[0xc8] & 0xffff); if (htotal > 0 && vtotal > 0 && visarea.min_x < visarea.max_x && visarea.max_y < vtotal) { machine.primary_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS((double)MIDZEUS_VIDEO_CLOCK / 8.0 / (htotal * vtotal))); @@ -1275,7 +1271,7 @@ extra->transcolor = ((ctrl_word >> 16) & 1) ? 0 : 0x100; extra->palbase = waveram0_ptr_from_block_addr(zeus_palbase); - poly_render_quad_fan(poly, NULL, &zeus_cliprect, callback, 4, numverts, &clipvert[0]); + poly_render_quad_fan(poly, NULL, zeus_cliprect, callback, 4, numverts, &clipvert[0]); } diff -Nru mame-0.144/src/mame/video/mikie.c mame-0.145/src/mame/video/mikie.c --- mame-0.144/src/mame/video/mikie.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mikie.c 2012-02-06 21:30:31.000000000 +0000 @@ -92,7 +92,7 @@ mikie_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mikie_colorram_w ) @@ -100,7 +100,7 @@ mikie_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mikie_palettebank_w ) @@ -110,7 +110,7 @@ if (state->m_palettebank != (data & 0x07)) { state->m_palettebank = data & 0x07; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -119,7 +119,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -130,9 +130,9 @@ int color = (state->m_colorram[tile_index] & 0x0f) + 16 * state->m_palettebank; int flags = ((state->m_colorram[tile_index] & 0x40) ? TILE_FLIPX : 0) | ((state->m_colorram[tile_index] & 0x80) ? TILE_FLIPY : 0); if (state->m_colorram[tile_index] & 0x10) - tileinfo->category = 1; + tileinfo.category = 1; else - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO(0, code, color, flags); @@ -145,7 +145,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { mikie_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -175,11 +175,11 @@ } } -SCREEN_UPDATE( mikie ) +SCREEN_UPDATE_IND16( mikie ) { - mikie_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_CATEGORY(0), 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_CATEGORY(1), 0); + mikie_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0), 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1), 0); return 0; } diff -Nru mame-0.144/src/mame/video/mitchell.c mame-0.145/src/mame/video/mitchell.c --- mame-0.144/src/mame/video/mitchell.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mitchell.c 2012-02-06 21:30:32.000000000 +0000 @@ -39,7 +39,7 @@ mitchell_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); /* OBJ RAM */ state->m_objram = auto_alloc_array_clear(machine, UINT8, state->m_videoram_size); @@ -85,7 +85,7 @@ mitchell_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } READ8_HANDLER( mgakuen_videoram_r ) @@ -135,7 +135,7 @@ mitchell_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( pang_colorram_r ) @@ -170,7 +170,7 @@ if (state->m_flipscreen != (data & 0x04)) { state->m_flipscreen = data & 0x04; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } /* bit 3 is unknown (used, e.g. marukin pulses it on the title screen) */ @@ -210,7 +210,7 @@ if (state->m_flipscreen != (data & 0x04)) { state->m_flipscreen = data & 0x04; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } /* bit 3 is unknown (used, e.g. marukin pulses it on the title screen) */ @@ -246,7 +246,7 @@ if (state->m_flipscreen != (data & 0x04)) { state->m_flipscreen = data & 0x04; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } /* bit 3 is unknown (used, e.g. marukin pulses it on the title screen) */ @@ -300,7 +300,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mitchell_state *state = machine.driver_data(); int offs, sx, sy; @@ -328,12 +328,12 @@ } } -SCREEN_UPDATE( pang ) +SCREEN_UPDATE_IND16( pang ) { - mitchell_state *state = screen->machine().driver_data(); + mitchell_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(0, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mjkjidai.c mame-0.145/src/mame/video/mjkjidai.c --- mame-0.144/src/mame/video/mjkjidai.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mjkjidai.c 2012-02-06 21:30:33.000000000 +0000 @@ -45,7 +45,7 @@ mjkjidai_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( mjkjidai_ctrl_w ) @@ -56,7 +56,7 @@ // logerror("%04x: port c0 = %02x\n",cpu_get_pc(&space->device()),data); /* bit 0 = NMI enable */ - interrupt_enable_w(space,0,data & 1); + state->m_nmi_mask = data & 1; /* bit 1 = flip screen */ flip_screen_set(space->machine(), data & 0x02); @@ -87,7 +87,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { mjkjidai_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram1; @@ -129,15 +129,15 @@ -SCREEN_UPDATE( mjkjidai ) +SCREEN_UPDATE_IND16( mjkjidai ) { - mjkjidai_state *state = screen->machine().driver_data(); + mjkjidai_state *state = screen.machine().driver_data(); if (!state->m_display_enable) - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); else { - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); } return 0; } diff -Nru mame-0.144/src/mame/video/model1.c mame-0.145/src/mame/video/model1.c --- mame-0.144/src/mame/video/model1.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/model1.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,7 +10,7 @@ // Model 1 geometrizer TGP and rasterizer simulation enum { FRAC_SHIFT = 16 }; -enum { MOIRE = 0x00010000 }; +enum { MOIRE = 0x01000000 }; @@ -135,18 +135,18 @@ } -static void draw_hline(bitmap_t *bitmap, int x1, int x2, int y, int color) +static void draw_hline(bitmap_rgb32 &bitmap, int x1, int x2, int y, int color) { - UINT16 *base = BITMAP_ADDR16(bitmap, y, 0); + UINT32 *base = &bitmap.pix32(y); while(x1 <= x2) { base[x1] = color; x1++; } } -static void draw_hline_moired(bitmap_t *bitmap, int x1, int x2, int y, int color) +static void draw_hline_moired(bitmap_rgb32 &bitmap, int x1, int x2, int y, int color) { - UINT16 *base = BITMAP_ADDR16(bitmap, y, 0); + UINT32 *base = &bitmap.pix32(y); while(x1 <= x2) { if((x1^y)&1) base[x1] = color; @@ -154,7 +154,7 @@ } } -static void fill_slope(bitmap_t *bitmap, struct view *view, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2) +static void fill_slope(bitmap_rgb32 &bitmap, struct view *view, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2) { if(y1 > view->y2) return; @@ -214,7 +214,7 @@ *nx2 = x2; } -static void fill_line(bitmap_t *bitmap, struct view *view, int color, INT32 y, INT32 x1, INT32 x2) +static void fill_line(bitmap_rgb32 &bitmap, struct view *view, int color, INT32 y, INT32 x1, INT32 x2) { int xx1 = x1>>FRAC_SHIFT; int xx2 = x2>>FRAC_SHIFT; @@ -235,7 +235,7 @@ } } -static void fill_quad(bitmap_t *bitmap, struct view *view, const struct quad_m1 *q) +static void fill_quad(bitmap_rgb32 &bitmap, struct view *view, const struct quad_m1 *q) { INT32 sl1, sl2, cury, limy, x1, x2; int pmin, pmax, i, ps1, ps2; @@ -336,7 +336,7 @@ fill_line(bitmap, view, color, cury, x1, x2); } #if 0 -static void draw_line(bitmap_t *bitmap, struct view *view, int color, int x1, int y1, int x2, int y2) +static void draw_line(bitmap_rgb32 &bitmap, struct view *view, int color, int x1, int y1, int x2, int y2) { int s1x, s1y, s2x, s2y; int d1, d2; @@ -385,7 +385,7 @@ cur = 0; while(x != x2 || y != y2) { if(x>=view->x1 && x<=view->x2 && y>=view->y1 && y<=view->y2) - *BITMAP_ADDR16(bitmap, y, x) = color; + bitmap.pix32(y, x) = color; x += s1x; y += s1y; cur += d2; @@ -396,7 +396,7 @@ } } if(x>=view->x1 && x<=view->x2 && y>=view->y1 && y<=view->y2) - *BITMAP_ADDR16(bitmap, y, x) = color; + bitmap.pix16(y, x) = color; } #endif static int comp_quads(const void *q1, const void *q2) @@ -433,7 +433,7 @@ } -static void draw_quads(model1_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_quads(model1_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { struct view *view = state->m_view; int count = state->m_quadpt - state->m_quaddb; @@ -444,20 +444,20 @@ int save_x2 = view->x2; int save_y1 = view->y1; int save_y2 = view->y2; - view->x1 = MAX(view->x1, cliprect->min_x); - view->x2 = MIN(view->x2, cliprect->max_x); - view->y1 = MAX(view->y1, cliprect->min_y); - view->y2 = MIN(view->y2, cliprect->max_y); + view->x1 = MAX(view->x1, cliprect.min_x); + view->x2 = MIN(view->x2, cliprect.max_x); + view->y1 = MAX(view->y1, cliprect.min_y); + view->y2 = MIN(view->y2, cliprect.max_y); for(i=0; im_quadind[i]; fill_quad(bitmap, view, q); #if 0 - draw_line(bitmap, get_black_pen(screen->machine()), q->p[0]->s.x, q->p[0]->s.y, q->p[1]->s.x, q->p[1]->s.y); - draw_line(bitmap, get_black_pen(screen->machine()), q->p[1]->s.x, q->p[1]->s.y, q->p[2]->s.x, q->p[2]->s.y); - draw_line(bitmap, get_black_pen(screen->machine()), q->p[2]->s.x, q->p[2]->s.y, q->p[3]->s.x, q->p[3]->s.y); - draw_line(bitmap, get_black_pen(screen->machine()), q->p[3]->s.x, q->p[3]->s.y, q->p[0]->s.x, q->p[0]->s.y); + draw_line(bitmap, get_black_pen(screen.machine()), q->p[0]->s.x, q->p[0]->s.y, q->p[1]->s.x, q->p[1]->s.y); + draw_line(bitmap, get_black_pen(screen.machine()), q->p[1]->s.x, q->p[1]->s.y, q->p[2]->s.x, q->p[2]->s.y); + draw_line(bitmap, get_black_pen(screen.machine()), q->p[2]->s.x, q->p[2]->s.y, q->p[3]->s.x, q->p[3]->s.y); + draw_line(bitmap, get_black_pen(screen.machine()), q->p[3]->s.x, q->p[3]->s.y, q->p[0]->s.x, q->p[0]->s.y); #endif } @@ -913,7 +913,7 @@ r=(state->m_color_xlat[(r<<8)|lumval|0x0]>>3)&0x1f; g=(state->m_color_xlat[(g<<8)|lumval|0x2000]>>3)&0x1f; b=(state->m_color_xlat[(b<<8)|lumval|0x4000]>>3)&0x1f; - cquad.col=(r<<10)|(g<<5)|(b<<0); + cquad.col=(pal5bit(r)<<16)|(pal5bit(g)<<8)|(pal5bit(b)<<0); } if(flags & 0x00002000) @@ -1071,7 +1071,7 @@ r=(state->m_color_xlat[(r<<8)|lumval|0x0]>>3)&0x1f; g=(state->m_color_xlat[(g<<8)|lumval|0x2000]>>3)&0x1f; b=(state->m_color_xlat[(b<<8)|lumval|0x4000]>>3)&0x1f; - cquad.col=(r<<10)|(g<<5)|(b<<0); + cquad.col=(pal5bit(r)<<16)|(pal5bit(g)<<8)|(pal5bit(b)<<0); } //cquad.col = scale_color(machine.pens[0x1000|(state->m_tgp_ram[tex_adr-0x40000] & 0x3ff)],((float) (lum>>24)) / 128.0); if(flags & 0x00002000) @@ -1119,7 +1119,7 @@ return list+2; } -static void draw_objects(model1_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_objects(model1_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect) { if(state->m_quadpt != state->m_quaddb) { LOG_TGP(("VIDEO: sort&draw\n")); @@ -1131,7 +1131,7 @@ state->m_pointpt = state->m_pointdb; } -static UINT16 *draw_direct(model1_state *state, bitmap_t *bitmap, const rectangle *cliprect, UINT16 *list) +static UINT16 *draw_direct(model1_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 *list) { UINT16 *res; @@ -1184,7 +1184,7 @@ LOG_TGP(("VIDEO: control=%08x\n", (state->m_listctl[1]<<16)|state->m_listctl[0])); } -static void tgp_render(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void tgp_render(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { model1_state *state = machine.driver_data(); struct view *view = state->m_view; @@ -1468,9 +1468,9 @@ state_save_register_global_array(machine, state->m_listctl); } -SCREEN_UPDATE(model1) +SCREEN_UPDATE_RGB32(model1) { - model1_state *state = screen->machine().driver_data(); + model1_state *state = screen.machine().driver_data(); struct view *view = state->m_view; #if 0 { @@ -1478,35 +1478,35 @@ double delta; delta = 1; - if(screen->machine().input().code_pressed(KEYCODE_F)) { + if(screen.machine().input().code_pressed(KEYCODE_F)) { mod = 1; view->vxx -= delta; } - if(screen->machine().input().code_pressed(KEYCODE_G)) { + if(screen.machine().input().code_pressed(KEYCODE_G)) { mod = 1; view->vxx += delta; } - if(screen->machine().input().code_pressed(KEYCODE_H)) { + if(screen.machine().input().code_pressed(KEYCODE_H)) { mod = 1; view->vyy -= delta; } - if(screen->machine().input().code_pressed(KEYCODE_J)) { + if(screen.machine().input().code_pressed(KEYCODE_J)) { mod = 1; view->vyy += delta; } - if(screen->machine().input().code_pressed(KEYCODE_K)) { + if(screen.machine().input().code_pressed(KEYCODE_K)) { mod = 1; view->vzz -= delta; } - if(screen->machine().input().code_pressed(KEYCODE_L)) { + if(screen.machine().input().code_pressed(KEYCODE_L)) { mod = 1; view->vzz += delta; } - if(screen->machine().input().code_pressed(KEYCODE_U)) { + if(screen.machine().input().code_pressed(KEYCODE_U)) { mod = 1; view->ayy -= 0.05; } - if(screen->machine().input().code_pressed(KEYCODE_I)) { + if(screen.machine().input().code_pressed(KEYCODE_I)) { mod = 1; view->ayy += 0.05; } @@ -1518,16 +1518,16 @@ view->ayyc = cos(view->ayy); view->ayys = sin(view->ayy); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + screen.machine().priority_bitmap.fill(0); + bitmap.fill(screen.machine().pens[0], cliprect); - segas24_tile *tile = screen->machine().device("tile"); + segas24_tile *tile = screen.machine().device("tile"); tile->draw(bitmap, cliprect, 6, 0, 0); tile->draw(bitmap, cliprect, 4, 0, 0); tile->draw(bitmap, cliprect, 2, 0, 0); tile->draw(bitmap, cliprect, 0, 0, 0); - tgp_render(screen->machine(), bitmap, cliprect); + tgp_render(screen.machine(), bitmap, cliprect); tile->draw(bitmap, cliprect, 7, 0, 0); tile->draw(bitmap, cliprect, 5, 0, 0); @@ -1537,9 +1537,13 @@ return 0; } -SCREEN_EOF(model1) +SCREEN_VBLANK(model1) { - tgp_scan(machine); - end_frame(machine); - LOG_TGP(("TGP: vsync\n")); + // on rising edge + if (vblank_on) + { + tgp_scan(screen.machine()); + end_frame(screen.machine()); + LOG_TGP(("TGP: vsync\n")); + } } diff -Nru mame-0.144/src/mame/video/model2.c mame-0.145/src/mame/video/model2.c --- mame-0.144/src/mame/video/model2.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/model2.c 2012-02-06 21:30:31.000000000 +0000 @@ -923,26 +923,18 @@ model2_3d_render_7 /* checker = 1, textured = 1, translucent = 1 */ }; -static void model2_3d_render( model2_state *state, bitmap_t *bitmap, triangle *tri, const rectangle *cliprect ) +static void model2_3d_render( model2_state *state, bitmap_rgb32 &bitmap, triangle *tri, const rectangle &cliprect ) { poly_manager *poly = state->m_poly; poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(poly); UINT8 renderer; - rectangle vp; /* select renderer based on attributes (bit15 = checker, bit14 = textured, bit13 = transparent */ renderer = (tri->texheader[0] >> 13) & 7; /* calculate and clip to viewport */ - vp.min_x = tri->viewport[0] - 8; - vp.max_x = tri->viewport[2] - 8; - vp.min_y = (384-tri->viewport[3])+90; - vp.max_y = (384-tri->viewport[1])+90; - - if ( vp.min_x < cliprect->min_x ) vp.min_x = cliprect->min_x; - if ( vp.max_x > cliprect->max_x ) vp.max_x = cliprect->max_x; - if ( vp.min_y < cliprect->min_y ) vp.min_y = cliprect->min_y; - if ( vp.max_y > cliprect->max_y ) vp.max_y = cliprect->max_y; + rectangle vp(tri->viewport[0] - 8, tri->viewport[2] - 8, (384-tri->viewport[3])+90, (384-tri->viewport[1])+90); + vp &= cliprect; extra->state = state; extra->lumabase = ((tri->texheader[1] & 0xFF) << 7) + ((tri->luma >> 5) ^ 0x7); @@ -968,10 +960,10 @@ tri->v[2].pu = tri->v[2].pu * tri->v[2].pz * (1.0f / 8.0f); tri->v[2].pv = tri->v[2].pv * tri->v[2].pz * (1.0f / 8.0f); - poly_render_triangle(poly, bitmap, &vp, render_funcs[renderer], 3, &tri->v[0], &tri->v[1], &tri->v[2]); + poly_render_triangle(poly, &bitmap, vp, render_funcs[renderer], 3, &tri->v[0], &tri->v[1], &tri->v[2]); } else - poly_render_triangle(poly, bitmap, &vp, render_funcs[renderer], 0, &tri->v[0], &tri->v[1], &tri->v[2]); + poly_render_triangle(poly, &bitmap, vp, render_funcs[renderer], 0, &tri->v[0], &tri->v[1], &tri->v[2]); } /* @@ -1022,7 +1014,7 @@ raster->max_z = 0; } -static void model2_3d_frame_end( model2_state *state, bitmap_t *bitmap, const rectangle *cliprect ) +static void model2_3d_frame_end( model2_state *state, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { raster_state *raster = state->m_raster; INT32 z; @@ -2712,10 +2704,10 @@ { model2_state *state = machine.driver_data(); const rectangle &visarea = machine.primary_screen->visible_area(); - int width = visarea.max_x - visarea.min_x; - int height = visarea.max_y - visarea.min_y; + int width = visarea.width(); + int height = visarea.height(); - state->m_sys24_bitmap = auto_alloc(machine, bitmap_t(width, height+4, BITMAP_FORMAT_INDEXED16)); + state->m_sys24_bitmap.allocate(width, height+4); state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), 0); machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model2_exit), &machine)); @@ -2727,38 +2719,21 @@ geo_init( machine, (UINT32*)machine.region("user2")->base() ); } -static void convert_bitmap( running_machine &machine, bitmap_t *dst, bitmap_t *src, const rectangle *rect ) +SCREEN_UPDATE_RGB32(model2) { - int x, y; - - for( y = rect->min_y; y < rect->max_y; y++ ) - { - UINT32 *d = BITMAP_ADDR32( dst, y, 0 ); - UINT16 *s = BITMAP_ADDR16( src, y, 0 ); - - for( x = rect->min_x; x < rect->max_x; x++ ) - { - if ( s[x] ) - d[x] = machine.pens[s[x]]; - } - } -} - -SCREEN_UPDATE(model2) -{ - model2_state *state = screen->machine().driver_data(); + model2_state *state = screen.machine().driver_data(); logerror("--- frame ---\n"); - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); - bitmap_fill(state->m_sys24_bitmap, cliprect, 0); + bitmap.fill(screen.machine().pens[0], cliprect); + state->m_sys24_bitmap.fill(0, cliprect); - segas24_tile *tile = screen->machine().device("tile"); + segas24_tile *tile = screen.machine().device("tile"); tile->draw(state->m_sys24_bitmap, cliprect, 7, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 6, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 5, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 4, 0, 0); - convert_bitmap(screen->machine(), bitmap, state->m_sys24_bitmap, cliprect); + copybitmap_trans(bitmap, state->m_sys24_bitmap, 0, 0, 0, 0, cliprect, 0); /* tell the rasterizer we're starting a frame */ model2_3d_frame_start(state); @@ -2769,13 +2744,13 @@ /* have the rasterizer output the frame */ model2_3d_frame_end( state, bitmap, cliprect ); - bitmap_fill(state->m_sys24_bitmap, cliprect, 0); + state->m_sys24_bitmap.fill(0, cliprect); tile->draw(state->m_sys24_bitmap, cliprect, 3, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 2, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 1, 0, 0); tile->draw(state->m_sys24_bitmap, cliprect, 0, 0, 0); - convert_bitmap(screen->machine(), bitmap, state->m_sys24_bitmap, cliprect); + copybitmap_trans(bitmap, state->m_sys24_bitmap, 0, 0, 0, 0, cliprect, 0); return 0; } diff -Nru mame-0.144/src/mame/video/model2rd.c mame-0.145/src/mame/video/model2rd.c --- mame-0.144/src/mame/video/model2rd.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/model2rd.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,8 +59,8 @@ #if !defined( MODEL2_TRANSLUCENT) const poly_extra_data *extra = (const poly_extra_data *)extradata; model2_state *state = extra->state; - bitmap_t *destmap = (bitmap_t *)dest; - UINT32 *p = BITMAP_ADDR32(destmap, scanline, 0); + bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; + UINT32 *p = &destmap->pix32(scanline); /* extract color information */ const UINT16 *colortable_r = (const UINT16 *)&state->m_colorxlat[0x0000/4]; @@ -112,8 +112,8 @@ { const poly_extra_data *extra = (const poly_extra_data *)extradata; model2_state *state = extra->state; - bitmap_t *destmap = (bitmap_t *)dest; - UINT32 *p = BITMAP_ADDR32(destmap, scanline, 0); + bitmap_rgb32 *destmap = (bitmap_rgb32 *)dest; + UINT32 *p = &destmap->pix32(scanline); UINT32 tex_width = extra->texwidth; UINT32 tex_height = extra->texheight; diff -Nru mame-0.144/src/mame/video/model3.c mame-0.145/src/mame/video/model3.c --- mame-0.144/src/mame/video/model3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/model3.c 2012-02-06 21:30:31.000000000 +0000 @@ -37,7 +37,7 @@ struct _poly_extra_data { cached_texture *texture; - bitmap_t *zbuffer; + bitmap_ind32 *zbuffer; UINT32 color; UINT8 texture_param; int polygon_transparency; @@ -117,15 +117,12 @@ VIDEO_START( model3 ) { model3_state *state = machine.driver_data(); - int width, height; state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), 0); machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model3_exit), &machine)); - width = machine.primary_screen->width(); - height = machine.primary_screen->height(); - state->m_bitmap3d = machine.primary_screen->alloc_compatible_bitmap(); - state->m_zbuffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED32); + machine.primary_screen->register_screen_bitmap(state->m_bitmap3d); + machine.primary_screen->register_screen_bitmap(state->m_zbuffer); state->m_m3_char_ram = auto_alloc_array_clear(machine, UINT64, 0x100000/8); state->m_m3_tile_ram = auto_alloc_array_clear(machine, UINT64, 0x8000/8); @@ -158,7 +155,7 @@ init_matrix_stack(machine); } -static void draw_tile_4bit(running_machine &machine, bitmap_t *bitmap, int tx, int ty, int tilenum) +static void draw_tile_4bit(running_machine &machine, bitmap_ind16 &bitmap, int tx, int ty, int tilenum) { model3_state *state = machine.driver_data(); int x, y; @@ -173,7 +170,7 @@ tile = &tile_base[tile_index]; for(y = ty; y < ty+8; y++) { - UINT16 *d = BITMAP_ADDR16(bitmap, y^1, 0); + UINT16 *d = &bitmap.pix16(y^1); for(x = tx; x < tx+8; x+=2) { UINT8 tile0, tile1; UINT16 pix0, pix1; @@ -194,7 +191,7 @@ } } -static void draw_tile_8bit(running_machine &machine, bitmap_t *bitmap, int tx, int ty, int tilenum) +static void draw_tile_8bit(running_machine &machine, bitmap_ind16 &bitmap, int tx, int ty, int tilenum) { model3_state *state = machine.driver_data(); int x, y; @@ -209,7 +206,7 @@ tile = &tile_base[tile_index]; for(y = ty; y < ty+8; y++) { - UINT16 *d = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *d = &bitmap.pix16(y); int xx = 0; for(x = tx; x < tx+8; x++) { UINT8 tile0; @@ -226,15 +223,15 @@ } } #ifdef UNUSED_FUNCTION -static void draw_texture_sheet(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_texture_sheet(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { model3_state *state = machine.driver_data(); int x,y; - for(y = cliprect->min_y; y <= cliprect->max_y; y++) + for(y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *d = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *d = &bitmap.pix16(y); int index = (y*2)*2048; - for(x = cliprect->min_x; x <= cliprect->max_x; x++) { + for(x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = state->m_texture_ram[0][index]; index+=4; if(pix != 0) { @@ -245,7 +242,7 @@ } #endif -static void draw_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int bitdepth) +static void draw_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int bitdepth) { model3_state *state = machine.driver_data(); int x, y; @@ -296,10 +293,10 @@ if(bitdepth) /* 4-bit */ { - for(y = cliprect->min_y; y <= cliprect->max_y; y+=8) + for(y = cliprect.min_y; y <= cliprect.max_y; y+=8) { tile_index = ((y/8) * 64); - for (x = cliprect->min_x; x <= cliprect->max_x; x+=8) { + for (x = cliprect.min_x; x <= cliprect.max_x; x+=8) { UINT16 tile = tiles[tile_index ^ 0x2]; draw_tile_4bit(machine, bitmap, x, y, tile); ++tile_index; @@ -308,10 +305,10 @@ } else /* 8-bit */ { - for(y = cliprect->min_y; y <= cliprect->max_y; y+=8) + for(y = cliprect.min_y; y <= cliprect.max_y; y+=8) { tile_index = ((y/8) * 64); - for (x = cliprect->min_x; x <= cliprect->max_x; x+=8) { + for (x = cliprect.min_x; x <= cliprect.max_x; x+=8) { UINT16 tile = tiles[tile_index ^ 0x2]; draw_tile_8bit(machine, bitmap, x, y, tile); ++tile_index; @@ -321,14 +318,14 @@ } #ifdef UNUSED_FUNCTION -static void copy_screen(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void copy_screen(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { model3_state *state = machine.driver_data(); int x,y; - for(y=cliprect->min_y; y <= cliprect->max_y; y++) { - UINT16 *d = BITMAP_ADDR16(bitmap, y, 0); - UINT16 *s = BITMAP_ADDR16(state->m_bitmap3d, y, 0); - for(x=cliprect->min_x; x <= cliprect->max_x; x++) { + for(y=cliprect.min_y; y <= cliprect.max_y; y++) { + UINT16 *d = &bitmap.pix16(y); + UINT16 *s = &state->m_bitmap3d.pix16(y); + for(x=cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = s[x]; if(!(pix & 0x8000)) { d[x] = pix; @@ -338,9 +335,9 @@ } #endif -SCREEN_UPDATE( model3 ) +SCREEN_UPDATE_IND16( model3 ) { - model3_state *state = screen->machine().driver_data(); + model3_state *state = screen.machine().driver_data(); #if 0 int layer_scroll_x[4], layer_scroll_y[4]; UINT32 layer_data[4]; @@ -358,55 +355,52 @@ layer_scroll_x[3] = (layer_data[3] & 0x8000) ? (layer_data[3] & 0x1ff) : -(layer_data[3] & 0x1ff); layer_scroll_y[3] = (layer_data[3] & 0x8000) ? (layer_data[3] & 0x1ff) : -(layer_data[3] & 0x1ff); #endif - state->m_screen_clip = (rectangle*)cliprect; + state->m_screen_clip = (rectangle*)&cliprect; - state->m_clip3d.min_x = cliprect->min_x; - state->m_clip3d.max_x = cliprect->max_x; - state->m_clip3d.min_y = cliprect->min_y; - state->m_clip3d.max_y = cliprect->max_y; + state->m_clip3d = cliprect; /* layer disable debug keys */ state->m_tick++; if( state->m_tick >= 5 ) { state->m_tick = 0; - if( screen->machine().input().code_pressed(KEYCODE_Y) ) + if( screen.machine().input().code_pressed(KEYCODE_Y) ) state->m_debug_layer_disable ^= 0x1; - if( screen->machine().input().code_pressed(KEYCODE_U) ) + if( screen.machine().input().code_pressed(KEYCODE_U) ) state->m_debug_layer_disable ^= 0x2; - if( screen->machine().input().code_pressed(KEYCODE_I) ) + if( screen.machine().input().code_pressed(KEYCODE_I) ) state->m_debug_layer_disable ^= 0x4; - if( screen->machine().input().code_pressed(KEYCODE_O) ) + if( screen.machine().input().code_pressed(KEYCODE_O) ) state->m_debug_layer_disable ^= 0x8; - if( screen->machine().input().code_pressed(KEYCODE_T) ) + if( screen.machine().input().code_pressed(KEYCODE_T) ) state->m_debug_layer_disable ^= 0x10; } - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (!(state->m_debug_layer_disable & 0x8)) - draw_layer(screen->machine(), bitmap, cliprect, 3, (state->m_layer_enable >> 3) & 0x1); + draw_layer(screen.machine(), bitmap, cliprect, 3, (state->m_layer_enable >> 3) & 0x1); if (!(state->m_debug_layer_disable & 0x4)) - draw_layer(screen->machine(), bitmap, cliprect, 2, (state->m_layer_enable >> 2) & 0x1); + draw_layer(screen.machine(), bitmap, cliprect, 2, (state->m_layer_enable >> 2) & 0x1); if( !(state->m_debug_layer_disable & 0x10) ) { #if 0 if(state->m_real3d_display_list) { - bitmap_fill(state->m_zbuffer, cliprect, 0); - bitmap_fill(state->m_bitmap3d, cliprect, 0x8000); - real3d_traverse_display_list(screen->machine()); + state->m_zbuffer.fill(0, cliprect); + state->m_bitmap3d.fill(0x8000, cliprect); + real3d_traverse_display_list(screen.machine()); } #endif copybitmap_trans(bitmap, state->m_bitmap3d, 0, 0, 0, 0, cliprect, 0x8000); } if (!(state->m_debug_layer_disable & 0x2)) - draw_layer(screen->machine(), bitmap, cliprect, 1, (state->m_layer_enable >> 1) & 0x1); + draw_layer(screen.machine(), bitmap, cliprect, 1, (state->m_layer_enable >> 1) & 0x1); if (!(state->m_debug_layer_disable & 0x1)) - draw_layer(screen->machine(), bitmap, cliprect, 0, (state->m_layer_enable >> 0) & 0x1); + draw_layer(screen.machine(), bitmap, cliprect, 0, (state->m_layer_enable >> 0) & 0x1); //copy_screen(bitmap, cliprect); @@ -784,8 +778,8 @@ }; } state->m_texture_fifo_pos = 0; - bitmap_fill(state->m_zbuffer, NULL, 0); - bitmap_fill(state->m_bitmap3d, NULL, 0x8000); + state->m_zbuffer.fill(0); + state->m_bitmap3d.fill(0x8000); real3d_traverse_display_list(machine); //state->m_real3d_display_list = 1; } @@ -1070,7 +1064,7 @@ tri->v[1].pz = 1.0f / tri->v[1].pz; tri->v[2].pz = 1.0f / tri->v[2].pz; - extra->zbuffer = state->m_zbuffer; + extra->zbuffer = &state->m_zbuffer; if (tri->param & TRI_PARAM_TEXTURE_ENABLE) { tri->v[0].pu = tri->v[0].pu * tri->v[0].pz * 256.0f; @@ -1091,7 +1085,7 @@ callback = (tri->transparency >= 32) ? draw_scanline_normal : draw_scanline_trans; else callback = draw_scanline_alpha; - poly_render_triangle(state->m_poly, state->m_bitmap3d, &state->m_clip3d, callback, 3, &tri->v[0], &tri->v[1], &tri->v[2]); + poly_render_triangle(state->m_poly, &state->m_bitmap3d, state->m_clip3d, callback, 3, &tri->v[0], &tri->v[1], &tri->v[2]); } else { @@ -1099,7 +1093,7 @@ extra->polygon_intensity = tri->intensity; extra->color = tri->color; - poly_render_triangle(state->m_poly, state->m_bitmap3d, &state->m_clip3d, draw_scanline_color, 1, &tri->v[0], &tri->v[1], &tri->v[2]); + poly_render_triangle(state->m_poly, &state->m_bitmap3d, state->m_clip3d, draw_scanline_color, 1, &tri->v[0], &tri->v[1], &tri->v[2]); } } diff -Nru mame-0.144/src/mame/video/momoko.c mame-0.145/src/mame/video/momoko.c --- mame-0.144/src/mame/video/momoko.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/momoko.c 2012-02-06 21:30:32.000000000 +0000 @@ -76,7 +76,7 @@ /****************************************************************************/ -static void momoko_draw_bg_pri( running_machine &machine, bitmap_t *bitmap, int chr, int col, int flipx, int flipy, int x, int y, int pri ) +static void momoko_draw_bg_pri( running_machine &machine, bitmap_ind16 &bitmap, int chr, int col, int flipx, int flipy, int x, int y, int pri ) { int xx, sx, sy, px, py, dot; UINT32 gfxadr; @@ -100,7 +100,7 @@ else py = 7 - sy + y; if (dot >= pri) - *BITMAP_ADDR16(bitmap, py, px) = col * 16 + dot + 256; + bitmap.pix16(py, px) = col * 16 + dot + 256; d0 = d0 << 1; d1 = d1 << 1; @@ -111,19 +111,19 @@ /****************************************************************************/ -SCREEN_UPDATE( momoko ) +SCREEN_UPDATE_IND16( momoko ) { - momoko_state *state = screen->machine().driver_data(); + momoko_state *state = screen.machine().driver_data(); int x, y, dx, dy, rx, ry, radr, chr, sy, fx, fy, px, py, offs, col, pri, flip ; UINT8 *spriteram = state->m_spriteram; - UINT8 *BG_MAP = screen->machine().region("user1")->base(); - UINT8 *BG_COL_MAP = screen->machine().region("user2")->base(); - UINT8 *FG_MAP = screen->machine().region("user3")->base(); - UINT8 *TEXT_COLOR = screen->machine().region("proms")->base(); + UINT8 *BG_MAP = screen.machine().region("user1")->base(); + UINT8 *BG_COL_MAP = screen.machine().region("user2")->base(); + UINT8 *FG_MAP = screen.machine().region("user3")->base(); + UINT8 *TEXT_COLOR = screen.machine().region("proms")->base(); - flip = state->m_flipscreen ^ (input_port_read(screen->machine(), "FAKE") & 0x01); + flip = state->m_flipscreen ^ (input_port_read(screen.machine(), "FAKE") & 0x01); /* draw BG layer */ dx = (7 - state->m_bg_scrollx[0]) & 7; @@ -153,7 +153,7 @@ py = 248 - (8 * y + dy + 9); } - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[1], chr, col, flip,flip, @@ -162,7 +162,7 @@ } } else - bitmap_fill(bitmap, cliprect, 256); + bitmap.fill(256, cliprect); /* draw sprites (momoko) */ @@ -187,7 +187,7 @@ py = y + 1; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[3], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[3], chr, col, !fx,fy, @@ -221,7 +221,7 @@ { col = col & 0x0f; chr = chr + state->m_bg_select * 512; - momoko_draw_bg_pri(screen->machine(), bitmap, chr, col, flip, flip, px, py, pri); + momoko_draw_bg_pri(screen.machine(), bitmap, chr, col, flip, flip, px, py, pri); } } } @@ -249,7 +249,7 @@ px = 248 - x; py = y + 1; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[3], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[3], chr, col, !fx,fy, @@ -282,7 +282,7 @@ px = 248 - x * 8; py = 255 - y; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[(sy >> 3) * 32 + x] * 8 + dy, col, flip,0, @@ -315,7 +315,7 @@ px = 248 - (8 * x + dx - 8); py = 248 - (8 * y + dy + 9); } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], chr, 0, /* color */ flip,flip, /* flip */ diff -Nru mame-0.144/src/mame/video/moo.c mame-0.145/src/mame/video/moo.c --- mame-0.144/src/mame/video/moo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/moo.c 2012-02-06 21:30:31.000000000 +0000 @@ -63,9 +63,9 @@ } } -SCREEN_UPDATE(moo) +SCREEN_UPDATE_RGB32(moo) { - moo_state *state = screen->machine().driver_data(); + moo_state *state = screen.machine().driver_data(); static const int K053251_CI[4] = { K053251_CI1, K053251_CI2, K053251_CI3, K053251_CI4 }; int layers[3]; int new_colorbase, plane, dirty, alpha; @@ -112,7 +112,7 @@ k054338_update_all_shadows(state->m_k054338, 0); k054338_fill_backcolor(state->m_k054338, bitmap, 0); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_layerpri[0] < k053251_get_priority(state->m_k053251, K053251_CI1)) /* bucky hides back layer behind background */ k056832_tilemap_draw(state->m_k056832, bitmap, cliprect, layers[0], 0, 1); diff -Nru mame-0.144/src/mame/video/mosaic.c mame-0.145/src/mame/video/mosaic.c --- mame-0.144/src/mame/video/mosaic.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mosaic.c 2012-02-06 21:30:32.000000000 +0000 @@ -52,7 +52,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0xff); + state->m_fg_tilemap->set_transparent_pen(0xff); } @@ -67,7 +67,7 @@ mosaic_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( mosaic_bgvideoram_w ) @@ -75,16 +75,16 @@ mosaic_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } -SCREEN_UPDATE( mosaic ) +SCREEN_UPDATE_IND16( mosaic ) { - mosaic_state *state = screen->machine().driver_data(); + mosaic_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/mouser.c mame-0.145/src/mame/video/mouser.c --- mame-0.144/src/mame/video/mouser.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mouser.c 2012-02-06 21:30:32.000000000 +0000 @@ -54,9 +54,9 @@ flip_screen_y_set(space->machine(), ~data & 1); } -SCREEN_UPDATE( mouser ) +SCREEN_UPDATE_IND16( mouser ) { - mouser_state *state = screen->machine().driver_data(); + mouser_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; int sx, sy; @@ -71,12 +71,12 @@ sx = offs % 32; sy = offs / 32; - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) { sx = 31 - sx; } - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) { sy = 31 - sy; } @@ -90,10 +90,10 @@ /* Note: this is _not_ dependant on flipping */ color_offs = offs % 32 + ((256 + 8 * (offs / 32) - spriteram[offs % 32] )% 256) / 8 * 32; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs] | (state->m_colorram[color_offs] >> 5) * 256 | ((state->m_colorram[color_offs] >> 4) & 1) * 512, state->m_colorram[color_offs]%16, - flip_screen_x_get(screen->machine()),flip_screen_y_get(screen->machine()), + flip_screen_x_get(screen.machine()),flip_screen_y_get(screen.machine()), 8*sx,scrolled_y_position); } @@ -108,20 +108,20 @@ flipx = BIT(spriteram[offs], 6); flipy = BIT(spriteram[offs], 7); - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) { flipx = !flipx; sx = 240 - sx; } - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) { flipy = !flipy; sy = 238 - sy; } if (BIT(spriteram[offs + 1], 4)) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1+((spriteram[offs+1]&0x20)>>5)], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1+((spriteram[offs+1]&0x20)>>5)], spriteram[offs]&0x3f, spriteram[offs+1]%16, flipx,flipy, @@ -137,20 +137,20 @@ flipx = BIT(spriteram[offs], 6); flipy = BIT(spriteram[offs], 7); - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) { flipx = !flipx; sx = 240 - sx; } - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) { flipy = !flipy; sy = 238 - sy; } if (BIT(spriteram[offs + 1], 4)) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1+((spriteram[offs+1]&0x20)>>5)], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1+((spriteram[offs+1]&0x20)>>5)], spriteram[offs]&0x3f, spriteram[offs+1]%16, flipx,flipy, diff -Nru mame-0.144/src/mame/video/mrdo.c mame-0.145/src/mame/video/mrdo.c --- mame-0.144/src/mame/video/mrdo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/mrdo.c 2012-02-06 21:30:32.000000000 +0000 @@ -170,13 +170,13 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,32,32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 56); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, 56); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, 6); - tilemap_set_scrolldy(state->m_fg_tilemap, 0, 6); + state->m_bg_tilemap->set_scrolldx(0, 56); + state->m_fg_tilemap->set_scrolldx(0, 56); + state->m_bg_tilemap->set_scrolldy(0, 6); + state->m_fg_tilemap->set_scrolldy(0, 6); state->m_flipscreen = 0; @@ -195,21 +195,21 @@ { mrdo_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( mrdo_fgvideoram_w ) { mrdo_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( mrdo_scrollx_w ) { mrdo_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( mrdo_scrolly_w ) @@ -218,9 +218,9 @@ /* This is NOT affected by flipscreen (so stop it happening) */ if (state->m_flipscreen) - tilemap_set_scrolly(state->m_bg_tilemap, 0,((256 - data) & 0xff)); + state->m_bg_tilemap->set_scrolly(0,((256 - data) & 0xff)); else - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } @@ -232,7 +232,7 @@ /* Mr. Do! so we don't emulate them */ state->m_flipscreen = data & 0x01; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } @@ -243,7 +243,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { mrdo_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -261,13 +261,13 @@ } } -SCREEN_UPDATE( mrdo ) +SCREEN_UPDATE_IND16( mrdo ) { - mrdo_state *state = screen->machine().driver_data(); + mrdo_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect,0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(0, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mrflea.c mame-0.145/src/mame/video/mrflea.c --- mame-0.144/src/mame/video/mrflea.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/mrflea.c 2012-02-06 21:30:32.000000000 +0000 @@ -43,7 +43,7 @@ state->m_spriteram[offset] = data; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mrflea_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -60,12 +60,12 @@ int ypos = source[0] - 16 + 3; int tile_number = source[2] + source[3] * 0x100; - drawgfx_transpen( bitmap, &clip,gfx, + drawgfx_transpen( bitmap, clip,gfx, tile_number, 0, /* color */ 0,0, /* no flip */ xpos,ypos,0 ); - drawgfx_transpen( bitmap, &clip,gfx, + drawgfx_transpen( bitmap, clip,gfx, tile_number, 0, /* color */ 0,0, /* no flip */ @@ -74,7 +74,7 @@ } } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mrflea_state *state = machine.driver_data(); const UINT8 *source = state->m_videoram; @@ -104,9 +104,9 @@ } } -SCREEN_UPDATE( mrflea ) +SCREEN_UPDATE_IND16( mrflea ) { - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mrjong.c mame-0.145/src/mame/video/mrjong.c --- mame-0.144/src/mame/video/mrjong.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mrjong.c 2012-02-06 21:30:33.000000000 +0000 @@ -72,14 +72,14 @@ { mrjong_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mrjong_colorram_w ) { mrjong_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( mrjong_flipscreen_w ) @@ -87,7 +87,7 @@ if (flip_screen_get(space->machine()) != BIT(data, 2)) { flip_screen_set(space->machine(), BIT(data, 2)); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -110,7 +110,7 @@ /* Note: First 0x40 entries in the videoram are actually spriteram */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mrjong_state *state = machine.driver_data(); int offs; @@ -145,10 +145,10 @@ } } -SCREEN_UPDATE( mrjong ) +SCREEN_UPDATE_IND16( mrjong ) { - mrjong_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + mrjong_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/ms32.c mame-0.145/src/mame/video/ms32.c --- mame-0.144/src/mame/video/ms32.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ms32.c 2012-02-06 21:30:32.000000000 +0000 @@ -69,8 +69,6 @@ VIDEO_START( ms32 ) { ms32_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); state->m_priram_8 = auto_alloc_array_clear(machine, UINT8, 0x2000); state->m_palram_16 = auto_alloc_array_clear(machine, UINT16, 0x20000); @@ -87,18 +85,18 @@ /* set up tile layers */ - state->m_temp_bitmap_tilemaps = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_temp_bitmap_sprites = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_temp_bitmap_sprites_pri = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); // not actually being used for rendering, we embed pri info in the raw colour bitmap - - bitmap_fill(state->m_temp_bitmap_tilemaps,0,0); - bitmap_fill(state->m_temp_bitmap_sprites,0,0); - bitmap_fill(state->m_temp_bitmap_sprites_pri,0,0); - - tilemap_set_transparent_pen(state->m_tx_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap_alt,0); - tilemap_set_transparent_pen(state->m_roz_tilemap,0); + machine.primary_screen->register_screen_bitmap(state->m_temp_bitmap_tilemaps); + machine.primary_screen->register_screen_bitmap(state->m_temp_bitmap_sprites); + machine.primary_screen->register_screen_bitmap(state->m_temp_bitmap_sprites_pri); // not actually being used for rendering, we embed pri info in the raw colour bitmap + + state->m_temp_bitmap_tilemaps.fill(0); + state->m_temp_bitmap_sprites.fill(0); + state->m_temp_bitmap_sprites_pri.fill(0); + + state->m_tx_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap_alt->set_transparent_pen(0); + state->m_roz_tilemap->set_transparent_pen(0); state->m_reverse_sprite_order = 1; @@ -190,9 +188,9 @@ { /* bit 1 = flip screen */ state->m_flipscreen = data & 0x02; - tilemap_set_flip(state->m_tx_tilemap,state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(state->m_bg_tilemap,state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_flip(state->m_bg_tilemap_alt,state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_tx_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_bg_tilemap_alt->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* bit 2 used by f1superb, unknown */ @@ -205,7 +203,7 @@ /* SPRITES based on tetrisp2 for now, readd priority bits later */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, bitmap_t *bitmap_pri, const rectangle *cliprect, UINT16 *sprram_top, size_t sprram_size, int gfxnum, int reverseorder) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, UINT16 *sprram_top, size_t sprram_size, int gfxnum, int reverseorder) { int tx, ty, sx, sy, flipx, flipy; int xsize, ysize; @@ -275,7 +273,7 @@ } -static void draw_roz(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect,int priority) +static void draw_roz(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect,int priority) { ms32_state *state = machine.driver_data(); /* TODO: registers 0x40/4 / 0x44/4 and 0x50/4 / 0x54/4 are used, meaning unknown */ @@ -285,11 +283,11 @@ rectangle my_clip; int y,maxy; - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; - y = cliprect->min_y; - maxy = cliprect->max_y; + y = cliprect.min_y; + maxy = cliprect.max_y; while (y <= maxy) { @@ -317,7 +315,7 @@ if (incxx & 0x10000) incxx |= ~0x1ffff; if (incxy & 0x10000) incxy |= ~0x1ffff; - tilemap_draw_roz(bitmap, &my_clip, state->m_roz_tilemap, + state->m_roz_tilemap->draw_roz(bitmap, my_clip, (start2x+startx+offsx)<<16, (start2y+starty+offsy)<<16, incxx<<8, incxy<<8, 0, 0, 1, // Wrap @@ -348,7 +346,7 @@ if (incyy & 0x10000) incyy |= ~0x1ffff; if (incyx & 0x10000) incyx |= ~0x1ffff; - tilemap_draw_roz(bitmap, cliprect, state->m_roz_tilemap, + state->m_roz_tilemap->draw_roz(bitmap, cliprect, (startx+offsx)<<16, (starty+offsy)<<16, incxx<<8, incxy<<8, incyx<<8, incyy<<8, 1, // Wrap @@ -358,9 +356,9 @@ -SCREEN_UPDATE( ms32 ) +SCREEN_UPDATE_RGB32( ms32 ) { - ms32_state *state = screen->machine().driver_data(); + ms32_state *state = screen.machine().driver_data(); int scrollx,scrolly; int asc_pri; int scr_pri; @@ -377,34 +375,34 @@ int i; for (i = 0;i < 0x10000;i++) // colors 0x3000-0x3fff are not used - update_color(screen->machine(), i); + update_color(screen.machine(), i); scrollx = state->m_tx_scroll[0x00/4] + state->m_tx_scroll[0x08/4] + 0x18; scrolly = state->m_tx_scroll[0x0c/4] + state->m_tx_scroll[0x14/4]; - tilemap_set_scrollx(state->m_tx_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_tx_tilemap, 0, scrolly); + state->m_tx_tilemap->set_scrollx(0, scrollx); + state->m_tx_tilemap->set_scrolly(0, scrolly); scrollx = state->m_bg_scroll[0x00/4] + state->m_bg_scroll[0x08/4] + 0x10; scrolly = state->m_bg_scroll[0x0c/4] + state->m_bg_scroll[0x14/4]; - tilemap_set_scrollx(state->m_bg_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, scrolly); - tilemap_set_scrollx(state->m_bg_tilemap_alt, 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap_alt, 0, scrolly); + state->m_bg_tilemap->set_scrollx(0, scrollx); + state->m_bg_tilemap->set_scrolly(0, scrolly); + state->m_bg_tilemap_alt->set_scrollx(0, scrollx); + state->m_bg_tilemap_alt->set_scrolly(0, scrolly); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); /* TODO: 0 is correct for gametngk, but break f1superb scrolling grid (text at top and bottom of the screen becomes black on black) */ - bitmap_fill(state->m_temp_bitmap_tilemaps,cliprect,0); /* bg color */ + state->m_temp_bitmap_tilemaps.fill(0, cliprect); /* bg color */ /* clear our sprite bitmaps */ - bitmap_fill(state->m_temp_bitmap_sprites,cliprect,0); - bitmap_fill(state->m_temp_bitmap_sprites_pri,cliprect,0); + state->m_temp_bitmap_sprites.fill(0, cliprect); + state->m_temp_bitmap_sprites_pri.fill(0, cliprect); - draw_sprites(screen->machine(), state->m_temp_bitmap_sprites, state->m_temp_bitmap_sprites_pri, cliprect, state->m_sprram_16, 0x20000, 0, state->m_reverse_sprite_order); + draw_sprites(screen.machine(), state->m_temp_bitmap_sprites, state->m_temp_bitmap_sprites_pri, cliprect, state->m_sprram_16, 0x20000, 0, state->m_reverse_sprite_order); @@ -427,46 +425,46 @@ rot_pri++; if (rot_pri == 0) - draw_roz(screen->machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); + draw_roz(screen.machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); else if (scr_pri == 0) if (state->m_tilemaplayoutcontrol&1) { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap_alt, 0, 1 << 0); + state->m_bg_tilemap_alt->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap, 0, 1 << 0); + state->m_bg_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else if (asc_pri == 0) - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_tx_tilemap, 0, 1 << 2); + state->m_tx_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 2); if (rot_pri == 1) - draw_roz(screen->machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); + draw_roz(screen.machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); else if (scr_pri == 1) if (state->m_tilemaplayoutcontrol&1) { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap_alt, 0, 1 << 0); + state->m_bg_tilemap_alt->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap, 0, 1 << 0); + state->m_bg_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else if (asc_pri == 1) - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_tx_tilemap, 0, 1 << 2); + state->m_tx_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 2); if (rot_pri == 2) - draw_roz(screen->machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); + draw_roz(screen.machine(), state->m_temp_bitmap_tilemaps, cliprect, 1 << 1); else if (scr_pri == 2) if (state->m_tilemaplayoutcontrol&1) { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap_alt, 0, 1 << 0); + state->m_bg_tilemap_alt->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else { - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_bg_tilemap, 0, 1 << 0); + state->m_bg_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 0); } else if (asc_pri == 2) - tilemap_draw(state->m_temp_bitmap_tilemaps,cliprect, state->m_tx_tilemap, 0, 1 << 2); + state->m_tx_tilemap->draw(state->m_temp_bitmap_tilemaps, cliprect, 0, 1 << 2); /* MIX it! */ /* this mixing isn't 100% accurate, it should be using ALL the data in @@ -474,9 +472,9 @@ than are supported here.. I don't know, it will need hw tests I think */ { int xx, yy; - int width = screen->width(); - int height = screen->height(); - const pen_t *paldata = screen->machine().pens; + int width = screen.width(); + int height = screen.height(); + const pen_t *paldata = screen.machine().pens; UINT16* srcptr_tile; UINT8* srcptr_tilepri; @@ -485,15 +483,15 @@ UINT32* dstptr_bitmap; - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); for (yy=0;yym_temp_bitmap_tilemaps, yy, 0); - srcptr_tilepri = BITMAP_ADDR8(screen->machine().priority_bitmap, yy, 0); - srcptr_spri = BITMAP_ADDR16(state->m_temp_bitmap_sprites, yy, 0); - //srcptr_spripri = BITMAP_ADDR8(state->m_temp_bitmap_sprites_pri, yy, 0); - dstptr_bitmap = BITMAP_ADDR32(bitmap, yy, 0); + srcptr_tile = &state->m_temp_bitmap_tilemaps.pix16(yy); + srcptr_tilepri = &screen.machine().priority_bitmap.pix8(yy); + srcptr_spri = &state->m_temp_bitmap_sprites.pix16(yy); + //srcptr_spripri = &state->m_temp_bitmap_sprites_pri.pix8(yy); + dstptr_bitmap = &bitmap.pix32(yy); for (xx=0;xxmachine().rand()&0xfff]; + dstptr_bitmap[xx] = paldata[screen.machine().rand()&0xfff]; } else if (primask == 0xf0) { @@ -663,12 +661,12 @@ } else if (src_tilepri==0x06) { - //dstptr_bitmap[xx] = paldata[screen->machine().rand()&0xfff]; + //dstptr_bitmap[xx] = paldata[screen.machine().rand()&0xfff]; dstptr_bitmap[xx] = paldata[src_tile]; // assumed } else if (src_tilepri==0x07) { - //dstptr_bitmap[xx] = paldata[screen->machine().rand()&0xfff]; + //dstptr_bitmap[xx] = paldata[screen.machine().rand()&0xfff]; dstptr_bitmap[xx] = paldata[src_tile]; // assumed } } diff -Nru mame-0.144/src/mame/video/msisaac.c mame-0.145/src/mame/video/msisaac.c --- mame-0.144/src/mame/video/msisaac.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/msisaac.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,8 +59,8 @@ state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg2_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -73,37 +73,37 @@ WRITE8_HANDLER( msisaac_fg_scrolly_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( msisaac_fg_scrollx_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_fg_tilemap, 0, 9 + data); + state->m_fg_tilemap->set_scrollx(0, 9 + data); } WRITE8_HANDLER( msisaac_bg2_scrolly_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, data); + state->m_bg2_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( msisaac_bg2_scrollx_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, 9 + 2 + data); + state->m_bg2_tilemap->set_scrollx(0, 9 + 2 + data); } WRITE8_HANDLER( msisaac_bg_scrolly_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( msisaac_bg_scrollx_w ) { msisaac_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 9 + 4 + data); + state->m_bg_tilemap->set_scrollx(0, 9 + 4 + data); } @@ -113,7 +113,7 @@ if (textbank1!=data) { textbank1 = data; - tilemap_mark_all_tiles_dirty(fg_tilemap); + fg_tilemap->mark_all_dirty(); } } #endif @@ -124,7 +124,7 @@ if (state->m_bg2_textbank != data ) { state->m_bg2_textbank = data; - tilemap_mark_all_tiles_dirty(state->m_bg2_tilemap); + state->m_bg2_tilemap->mark_all_dirty(); //check if we are correct on this one if ((data != 8) && (data != 0)) @@ -138,21 +138,21 @@ { msisaac_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( msisaac_bg2_videoram_w ) { msisaac_state *state = space->machine().driver_data(); state->m_videoram3[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset); + state->m_bg2_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( msisaac_fg_videoram_w ) { msisaac_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -161,7 +161,7 @@ Display refresh ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { msisaac_state *state = machine.driver_data(); const UINT8 *source = state->m_spriteram + 32 * 4 - 4; @@ -244,12 +244,12 @@ } } -SCREEN_UPDATE( msisaac ) +SCREEN_UPDATE_IND16( msisaac ) { - msisaac_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + msisaac_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/mugsmash.c mame-0.145/src/mame/video/mugsmash.c --- mame-0.144/src/mame/video/mugsmash.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mugsmash.c 2012-02-06 21:30:31.000000000 +0000 @@ -3,7 +3,7 @@ #include "emu.h" #include "includes/mugsmash.h" -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* Each Sprite takes 16 bytes, 5 used? */ @@ -85,7 +85,7 @@ mugsmash_state *state = space->machine().driver_data(); state->m_videoram1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap1, offset / 2); + state->m_tilemap1->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_mugsmash_tile_info2 ) @@ -114,7 +114,7 @@ mugsmash_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap2, offset / 2); + state->m_tilemap2->mark_tile_dirty(offset / 2); } WRITE16_HANDLER (mugsmash_reg_w) @@ -127,16 +127,16 @@ switch (offset) { case 0: - tilemap_set_scrollx(state->m_tilemap2, 0, state->m_regs1[2] + 7); + state->m_tilemap2->set_scrollx(0, state->m_regs1[2] + 7); break; case 1: - tilemap_set_scrolly(state->m_tilemap2, 0, state->m_regs1[3] + 4); + state->m_tilemap2->set_scrolly(0, state->m_regs1[3] + 4); break; case 2: - tilemap_set_scrollx(state->m_tilemap1, 0, state->m_regs1[0] + 3); + state->m_tilemap1->set_scrollx(0, state->m_regs1[0] + 3); break; case 3: - tilemap_set_scrolly(state->m_tilemap1, 0, state->m_regs1[1] + 4); + state->m_tilemap1->set_scrolly(0, state->m_regs1[1] + 4); break; } } @@ -146,17 +146,17 @@ mugsmash_state *state = machine.driver_data(); state->m_tilemap1 = tilemap_create(machine, get_mugsmash_tile_info1, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap1, 0); + state->m_tilemap1->set_transparent_pen(0); state->m_tilemap2 = tilemap_create(machine, get_mugsmash_tile_info2, tilemap_scan_rows, 16, 16, 32, 32); } -SCREEN_UPDATE( mugsmash ) +SCREEN_UPDATE_IND16( mugsmash ) { - mugsmash_state *state = screen->machine().driver_data(); + mugsmash_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap2, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap1, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_tilemap2->draw(bitmap, cliprect, 0, 0); + state->m_tilemap1->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/munchmo.c mame-0.145/src/mame/video/munchmo.c --- mame-0.144/src/mame/video/munchmo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/munchmo.c 2012-02-06 21:30:32.000000000 +0000 @@ -45,10 +45,10 @@ VIDEO_START( mnchmobl ) { munchmo_state *state = machine.driver_data(); - state->m_tmpbitmap = auto_bitmap_alloc(machine, 512, 512, machine.primary_screen->format()); + state->m_tmpbitmap = auto_bitmap_ind16_alloc(machine, 512, 512); } -static void draw_status( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_status( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { munchmo_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -76,7 +76,7 @@ } } -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* ROM B1.2C contains 256 tilemaps defining 4x4 configurations of @@ -98,7 +98,7 @@ { for (col = 0; col < 4; col++) { - drawgfx_opaque(state->m_tmpbitmap, 0, gfx, + drawgfx_opaque(*state->m_tmpbitmap, state->m_tmpbitmap->cliprect(), gfx, rom[col + tile_number * 4 + row * 0x400], state->m_palette_bank, 0,0, /* flip */ @@ -111,11 +111,11 @@ int scrollx = -(state->m_vreg[6] *2 + (state->m_vreg[7] >> 7)) - 64 - 128 - 16; int scrolly = 0; - copyscrollbitmap(bitmap, state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); + copyscrollbitmap(bitmap, *state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { munchmo_state *state = machine.driver_data(); int scroll = state->m_vreg[6]; @@ -150,10 +150,10 @@ } } -SCREEN_UPDATE( mnchmobl ) +SCREEN_UPDATE_IND16( mnchmobl ) { - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_status(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_status(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mustache.c mame-0.145/src/mame/video/mustache.c --- mame-0.144/src/mame/video/mustache.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mustache.c 2012-02-06 21:30:32.000000000 +0000 @@ -48,7 +48,7 @@ mustache_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER (mustache_video_control_w) @@ -57,7 +57,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* tile bank */ @@ -65,17 +65,17 @@ if ((state->m_control_byte ^ data) & 0x08) { state->m_control_byte = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } WRITE8_HANDLER( mustache_scroll_w ) { mustache_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0x100 - data); - tilemap_set_scrollx(state->m_bg_tilemap, 1, 0x100 - data); - tilemap_set_scrollx(state->m_bg_tilemap, 2, 0x100 - data); - tilemap_set_scrollx(state->m_bg_tilemap, 3, 0x100); + state->m_bg_tilemap->set_scrollx(0, 0x100 - data); + state->m_bg_tilemap->set_scrollx(1, 0x100 - data); + state->m_bg_tilemap->set_scrollx(2, 0x100 - data); + state->m_bg_tilemap->set_scrollx(3, 0x100); } static TILE_GET_INFO( get_bg_tile_info ) @@ -97,13 +97,13 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_flip_x, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 4); + state->m_bg_tilemap->set_scroll_rows(4); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { mustache_state *state = machine.driver_data(); - rectangle clip = *cliprect; + rectangle clip = cliprect; const gfx_element *gfx = machine.gfx[1]; const rectangle &visarea = machine.primary_screen->visible_area(); UINT8 *spriteram = state->m_spriteram; @@ -135,7 +135,7 @@ sy = 240 - sy; } - drawgfx_transpen(bitmap,&clip,gfx, + drawgfx_transpen(bitmap,clip,gfx, code, color, flip_screen_get(machine),flip_screen_get(machine), @@ -143,10 +143,10 @@ } } -SCREEN_UPDATE( mustache ) +SCREEN_UPDATE_IND16( mustache ) { - mustache_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + mustache_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/mw8080bw.c mame-0.145/src/mame/video/mw8080bw.c --- mame-0.144/src/mame/video/mw8080bw.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/mw8080bw.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,9 +8,9 @@ #include "includes/mw8080bw.h" -SCREEN_UPDATE( mw8080bw ) +SCREEN_UPDATE_RGB32( mw8080bw ) { - mw8080bw_state *state = screen->machine().driver_data(); + mw8080bw_state *state = screen.machine().driver_data(); UINT8 x = 0; UINT8 y = MW8080BW_VCOUNTER_START_NO_VBLANK; UINT8 video_data = 0; @@ -19,7 +19,7 @@ { /* plot the current pixel */ pen_t pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; /* next pixel */ video_data = video_data >> 1; @@ -34,7 +34,7 @@ for (i = 0; i < 4; i++) { pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; video_data = video_data >> 1; } @@ -75,9 +75,9 @@ #define PHANTOM2_SIDE_TRENCH_LIGHT_RGB32_PEN MAKE_RGB(0x72, 0x72, 0x72) -SCREEN_UPDATE( spcenctr ) +SCREEN_UPDATE_RGB32( spcenctr ) { - mw8080bw_state *state = screen->machine().driver_data(); + mw8080bw_state *state = screen.machine().driver_data(); UINT8 line_buf[256]; /* 256x1 bit RAM */ UINT8 x = 0; @@ -121,7 +121,7 @@ pen = line_buf[x] ? PHANTOM2_BOTTOM_TRENCH_LIGHT_RGB32_PEN : PHANTOM2_BOTTOM_TRENCH_DARK_RGB32_PEN; } - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; center = center + 1; width = width + ((center & 0x80) ? -1 : 1); @@ -143,7 +143,7 @@ for (i = 0; i < 4; i++) { pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; video_data = video_data >> 1; } @@ -219,9 +219,9 @@ #define PHANTOM2_RGB32_CLOUD_PEN MAKE_RGB(0xc0, 0xc0, 0xc0) -SCREEN_UPDATE( phantom2 ) +SCREEN_UPDATE_RGB32( phantom2 ) { - mw8080bw_state *state = screen->machine().driver_data(); + mw8080bw_state *state = screen.machine().driver_data(); UINT8 x = 0; UINT8 y = MW8080BW_VCOUNTER_START_NO_VBLANK; UINT8 video_data = 0; @@ -229,7 +229,7 @@ UINT16 cloud_counter = state->m_phantom2_cloud_counter; - UINT8 *cloud_region = screen->machine().region("proms")->base(); + UINT8 *cloud_region = screen.machine().region("proms")->base(); while (1) { @@ -246,7 +246,7 @@ else pen = bit ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; /* move to next pixel -- if ripple carry is currently set, prepare for loading the shift register */ @@ -280,7 +280,7 @@ for (i = 0; i < 4; i++) { pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; video_data = video_data >> 1; } @@ -311,14 +311,18 @@ } -SCREEN_EOF( phantom2 ) +SCREEN_VBLANK( phantom2 ) { - mw8080bw_state *state = machine.driver_data(); + // falling edge + if (!vblank_on) + { + mw8080bw_state *state = screen.machine().driver_data(); - state->m_phantom2_cloud_counter += MW8080BW_VTOTAL; + state->m_phantom2_cloud_counter += MW8080BW_VTOTAL; - if (state->m_phantom2_cloud_counter >= PHANTOM2_CLOUD_COUNTER_END) - state->m_phantom2_cloud_counter = PHANTOM2_CLOUD_COUNTER_START + (state->m_phantom2_cloud_counter - PHANTOM2_CLOUD_COUNTER_END); + if (state->m_phantom2_cloud_counter >= PHANTOM2_CLOUD_COUNTER_END) + state->m_phantom2_cloud_counter = PHANTOM2_CLOUD_COUNTER_START + (state->m_phantom2_cloud_counter - PHANTOM2_CLOUD_COUNTER_END); + } } @@ -331,9 +335,9 @@ /* the flip screen circuit is just a couple of relays on the monitor PCB */ -SCREEN_UPDATE( invaders ) +SCREEN_UPDATE_RGB32( invaders ) { - mw8080bw_state *state = screen->machine().driver_data(); + mw8080bw_state *state = screen.machine().driver_data(); UINT8 x = 0; UINT8 y = MW8080BW_VCOUNTER_START_NO_VBLANK; UINT8 video_data = 0; @@ -345,9 +349,9 @@ pen_t pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; if (flip) - *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pen; + bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - x) = pen; else - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, x) = pen; /* next pixel */ video_data = video_data >> 1; @@ -364,9 +368,9 @@ pen = (video_data & 0x01) ? RGB_WHITE : RGB_BLACK; if (flip) - *BITMAP_ADDR32(bitmap, MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + i)) = pen; + bitmap.pix32(MW8080BW_VBSTART - 1 - (y - MW8080BW_VCOUNTER_START_NO_VBLANK), MW8080BW_HPIXCOUNT - 1 - (256 + i)) = pen; else - *BITMAP_ADDR32(bitmap, y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; + bitmap.pix32(y - MW8080BW_VCOUNTER_START_NO_VBLANK, 256 + i) = pen; video_data = video_data >> 1; } diff -Nru mame-0.144/src/mame/video/mystston.c mame-0.145/src/mame/video/mystston.c --- mame-0.144/src/mame/video/mystston.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/mystston.c 2012-02-06 21:30:33.000000000 +0000 @@ -179,7 +179,7 @@ * *************************************/ -static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, int flip) +static void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx, int flip) { mystston_state *state = gfx->machine().driver_data(); int offs; @@ -225,7 +225,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols_flip_x, 16, 16, 16, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); /* create the interrupt timer */ state->m_interrupt_timer = machine.scheduler().timer_alloc(FUNC(interrupt_callback)); @@ -254,21 +254,21 @@ * *************************************/ -static SCREEN_UPDATE( mystston ) +static SCREEN_UPDATE_IND16( mystston ) { - mystston_state *state = screen->machine().driver_data(); + mystston_state *state = screen.machine().driver_data(); - int flip = (*state->m_video_control & 0x80) ^ ((input_port_read(screen->machine(), "DSW1") & 0x20) << 2); + int flip = (*state->m_video_control & 0x80) ^ ((input_port_read(screen.machine(), "DSW1") & 0x20) << 2); - set_palette(screen->machine(), state); + set_palette(screen.machine(), state); - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_scrolly(state->m_bg_tilemap, 0, *state->m_scroll); - tilemap_set_flip_all(screen->machine(), flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().mark_all_dirty(); + state->m_bg_tilemap->set_scrolly(0, *state->m_scroll); + screen.machine().tilemap().set_flip_all(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(bitmap, cliprect, screen->machine().gfx[2], flip); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect, screen.machine().gfx[2], flip); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -329,7 +329,6 @@ MCFG_PALETTE_LENGTH(0x40) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) - MCFG_SCREEN_UPDATE(mystston) + MCFG_SCREEN_UPDATE_STATIC(mystston) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/mystwarr.c mame-0.145/src/mame/video/mystwarr.c --- mame-0.144/src/mame/video/mystwarr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/mystwarr.c 2012-02-06 21:30:33.000000000 +0000 @@ -186,7 +186,7 @@ K053936GP_set_offset(0, -10, 0); // floor tiles in demo loop2 (Elaine vs. boss) state->m_ult_936_tilemap = tilemap_create(machine, get_gai_936_tile_info, tilemap_scan_rows, 16, 16, 512, 512); - tilemap_set_transparent_pen(state->m_ult_936_tilemap, 0); + state->m_ult_936_tilemap->set_transparent_pen(0); } static TILE_GET_INFO( get_ult_936_tile_info ) @@ -230,7 +230,7 @@ K053936GP_set_offset(0, -8, 0); // Brainy's laser state->m_ult_936_tilemap = tilemap_create(machine, get_ult_936_tile_info, tilemap_scan_rows, 16, 16, 512, 512); - tilemap_set_transparent_pen(state->m_ult_936_tilemap, 0); + state->m_ult_936_tilemap->set_transparent_pen(0); } VIDEO_START(mystwarr) @@ -329,9 +329,9 @@ -SCREEN_UPDATE(mystwarr) +SCREEN_UPDATE_RGB32(mystwarr) { - mystwarr_state *state = screen->machine().driver_data(); + mystwarr_state *state = screen.machine().driver_data(); int i, old, blendmode=0; if (state->m_cbparam<0) state->m_cbparam=0; else if (state->m_cbparam>=32) blendmode=(1<<16|GXMIX_BLEND_FORCE)<<2; //* water hack (TEMPORARY) @@ -345,13 +345,13 @@ state->m_sprite_colorbase = K055555_get_palette_index(4)<<5; - konamigx_mixer(screen->machine(), bitmap, cliprect, 0, 0, 0, 0, blendmode, 0, 0); + konamigx_mixer(screen.machine(), bitmap, cliprect, 0, 0, 0, 0, blendmode, 0, 0); return 0; } -SCREEN_UPDATE(metamrph) +SCREEN_UPDATE_RGB32(metamrph) { - mystwarr_state *state = screen->machine().driver_data(); + mystwarr_state *state = screen.machine().driver_data(); int i, old; for (i = 0; i < 4; i++) @@ -363,13 +363,13 @@ state->m_sprite_colorbase = K055555_get_palette_index(4)<<4; - konamigx_mixer(screen->machine(), bitmap, cliprect, 0, GXSUB_K053250 | GXSUB_4BPP, 0, 0, 0, 0, 0); + konamigx_mixer(screen.machine(), bitmap, cliprect, 0, GXSUB_K053250 | GXSUB_4BPP, 0, 0, 0, 0, 0); return 0; } -SCREEN_UPDATE(martchmp) +SCREEN_UPDATE_RGB32(martchmp) { - mystwarr_state *state = screen->machine().driver_data(); + mystwarr_state *state = screen.machine().driver_data(); int i, old, blendmode; for (i = 0; i < 4; i++) @@ -387,7 +387,7 @@ // not quite right blendmode = (state->m_oinprion==0xef && K054338_read_register(K338_REG_PBLEND)) ? ((1<<16|GXMIX_BLEND_FORCE)<<2) : 0; - konamigx_mixer(screen->machine(), bitmap, cliprect, 0, 0, 0, 0, blendmode, 0, 0); + konamigx_mixer(screen.machine(), bitmap, cliprect, 0, 0, 0, 0, blendmode, 0, 0); return 0; } @@ -499,9 +499,9 @@ return ROM[offset]<<8; } -SCREEN_UPDATE(dadandrn) /* and gaiapols */ +SCREEN_UPDATE_RGB32(dadandrn) /* and gaiapols */ { - mystwarr_state *state = screen->machine().driver_data(); + mystwarr_state *state = screen.machine().driver_data(); int i, newbase, dirty, rozmode; if (state->m_gametype == 0) @@ -547,12 +547,12 @@ if (state->m_last_psac_colorbase != state->m_sub1_colorbase) { - tilemap_mark_all_tiles_dirty(state->m_ult_936_tilemap); + state->m_ult_936_tilemap->mark_all_dirty(); if (MW_VERBOSE) popmessage("K053936: PSAC colorbase changed"); } - konamigx_mixer(screen->machine(), bitmap, cliprect, (state->m_roz_enable) ? state->m_ult_936_tilemap : 0, rozmode, 0, 0, 0, 0, 0); + konamigx_mixer(screen.machine(), bitmap, cliprect, (state->m_roz_enable) ? state->m_ult_936_tilemap : 0, rozmode, 0, 0, 0, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/n64.c mame-0.145/src/mame/video/n64.c --- mame-0.144/src/mame/video/n64.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/n64.c 2012-02-06 21:30:31.000000000 +0000 @@ -45,17 +45,17 @@ void Processor::GetAlphaCvg(UINT8 *comb_alpha) { INT32 temp = *comb_alpha; - INT32 temp2 = m_misc_state.m_curpixel_cvg; + INT32 temp2 = MiscState.CurrentPixCvg; INT32 temp3 = 0; - if (m_other_modes.cvg_times_alpha) + if (OtherModes.cvg_times_alpha) { temp3 = (temp * temp2) + 4; - m_misc_state.m_curpixel_cvg = (temp3 >> 8) & 0xf; + MiscState.CurrentPixCvg = (temp3 >> 8) & 0xf; } - if (m_other_modes.alpha_cvg_select) + if (OtherModes.alpha_cvg_select) { - temp = (m_other_modes.cvg_times_alpha) ? (temp3 >> 3) : (temp2 << 5); + temp = (OtherModes.cvg_times_alpha) ? (temp3 >> 3) : (temp2 << 5); } if (temp > 0xff) { @@ -66,45 +66,45 @@ /*****************************************************************************/ -void Processor::VideoUpdate(bitmap_t *bitmap) +void Processor::VideoUpdate(n64_periphs *n64, bitmap_rgb32 &bitmap) { - switch(n64_vi_control & 0x3) + switch(n64->vi_control & 0x3) { case PIXEL_SIZE_16BIT: - VideoUpdate16(bitmap); + VideoUpdate16(n64, bitmap); break; case PIXEL_SIZE_32BIT: - VideoUpdate32(bitmap); + VideoUpdate32(n64, bitmap); break; default: - //fatalerror("Unsupported framebuffer depth: m_fb_size=%d\n", m_misc_state.m_fb_size); + //fatalerror("Unsupported framebuffer depth: m_fb_size=%d\n", MiscState.FBSize); break; } } -void Processor::VideoUpdate16(bitmap_t *bitmap) +void Processor::VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap) { - int fsaa = (((n64_vi_control >> 8) & 3) < 2); - int divot = (n64_vi_control >> 4) & 1; + //int fsaa = (((n64->vi_control >> 8) & 3) < 2); + //int divot = (n64->vi_control >> 4) & 1; - UINT32 prev_cvg = 0; - UINT32 next_cvg = 0; - //int dither_filter = (n64_vi_control >> 16) & 1; - //int vibuffering = ((n64_vi_control & 2) && fsaa && divot); - - UINT16 *frame_buffer = (UINT16*)&rdram[(n64_vi_origin & 0xffffff) >> 2]; - UINT32 hb = ((n64_vi_origin & 0xffffff) >> 2) >> 1; - UINT8* hidden_buffer = &m_hidden_bits[hb]; + //UINT32 prev_cvg = 0; + //UINT32 next_cvg = 0; + //int dither_filter = (n64->vi_control >> 16) & 1; + //int vibuffering = ((n64->vi_control & 2) && fsaa && divot); + + UINT16 *frame_buffer = (UINT16*)&rdram[(n64->vi_origin & 0xffffff) >> 2]; + UINT32 hb = ((n64->vi_origin & 0xffffff) >> 2) >> 1; + UINT8* hidden_buffer = &HiddenBits[hb]; - INT32 hdiff = (n64_vi_hstart & 0x3ff) - ((n64_vi_hstart >> 16) & 0x3ff); - float hcoeff = ((float)(n64_vi_xscale & 0xfff) / (1 << 10)); + INT32 hdiff = (n64->vi_hstart & 0x3ff) - ((n64->vi_hstart >> 16) & 0x3ff); + float hcoeff = ((float)(n64->vi_xscale & 0xfff) / (1 << 10)); UINT32 hres = ((float)hdiff * hcoeff); - INT32 invisiblewidth = n64_vi_width - hres; + INT32 invisiblewidth = n64->vi_width - hres; - INT32 vdiff = ((n64_vi_vstart & 0x3ff) - ((n64_vi_vstart >> 16) & 0x3ff)) >> 1; - float vcoeff = ((float)(n64_vi_yscale & 0xfff) / (1 << 10)); + INT32 vdiff = ((n64->vi_vstart & 0x3ff) - ((n64->vi_vstart >> 16) & 0x3ff)) >> 1; + float vcoeff = ((float)(n64->vi_yscale & 0xfff) / (1 << 10)); UINT32 vres = ((float)vdiff * vcoeff); if (vdiff <= 0 || hdiff <= 0) @@ -118,13 +118,18 @@ hres = 640; } + if (vres > bitmap.height()) // makes Perfect Dark boot w/o crashing + { + vres = bitmap.height(); + } + UINT32 pixels = 0; if (frame_buffer) { for(int j = 0; j < vres; j++) { - UINT32 *d = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *d = &bitmap.pix32(j); for(int i = 0; i < hres; i++) { @@ -132,42 +137,42 @@ //int r, g, b; UINT16 pix = frame_buffer[pixels ^ WORD_ADDR_XOR]; - m_misc_state.m_curpixel_cvg = ((pix & 1) << 2) | (hidden_buffer[pixels ^ BYTE_ADDR_XOR] & 3); + MiscState.CurrentPixCvg = ((pix & 1) << 2) | (hidden_buffer[pixels ^ BYTE_ADDR_XOR] & 3); - if(divot) - { - if(i > 0 && i < (hres - 1)) - { - prev_cvg = ((frame_buffer[(pixels - 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels - 1)^BYTE_ADDR_XOR] & 3); - next_cvg = ((frame_buffer[(pixels + 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels + 1)^BYTE_ADDR_XOR] & 3); - } - } + //if(divot) + //{ + // if(i > 0 && i < (hres - 1)) + // { + // prev_cvg = ((frame_buffer[(pixels - 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels - 1)^BYTE_ADDR_XOR] & 3); + // next_cvg = ((frame_buffer[(pixels + 1)^WORD_ADDR_XOR] & 1) << 2) | (hidden_buffer[(pixels + 1)^BYTE_ADDR_XOR] & 3); + // } + //} c.i.r = ((pix >> 8) & 0xf8) | (pix >> 13); c.i.g = ((pix >> 3) & 0xf8) | ((pix >> 8) & 0x07); c.i.b = ((pix << 2) & 0xf8) | ((pix >> 3) & 0x07); - if(fsaa) - { - //if (/*!vibuffering &&*/ state->m_rdp.GetMiscState()->m_curpixel_cvg < 7 && i > 1 && j > 1 && i < (hres - 2) && j < (vres - 2)) + //if(fsaa) + //{ + //if (/*!vibuffering &&*/ state->m_rdp.MiscState.CurrentPixCvg < 7 && i > 1 && j > 1 && i < (hres - 2) && j < (vres - 2)) //{ - //video_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR],&hidden_buffer[pixels ^ BYTE_ADDR_XOR], n64_vi_width); + //video_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR],&hidden_buffer[pixels ^ BYTE_ADDR_XOR], n64->vi_width); //} - } - //else if (dither_filter && state->m_rdp.GetMiscState()->m_curpixel_cvg == 7 && i > 0 && j > 0 && i < (hres - 1) && j < (vres - 1)) + //} + //else if (dither_filter && state->m_rdp.MiscState.CurrentPixCvg == 7 && i > 0 && j > 0 && i < (hres - 1) && j < (vres - 1)) //{ //if (vibuffering) //{ - // restore_filter16_buffer(&r, &g, &b, &ViBuffer[i][j], n64_vi_width); + // restore_filter16_buffer(&r, &g, &b, &ViBuffer[i][j], n64->vi_width); //} //else //{ - //restore_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR], pixels ^ WORD_ADDR_XOR, n64_vi_width); + //restore_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR], pixels ^ WORD_ADDR_XOR, n64->vi_width); //} //} - if(divot) - { - if (i > 0 && i < (hres - 1) && (m_misc_state.m_curpixel_cvg != 7 || prev_cvg != 7 || next_cvg != 7)) - { + //if(divot) + //{ + //if (i > 0 && i < (hres - 1) && (MiscState.CurrentPixCvg != 7 || prev_cvg != 7 || next_cvg != 7)) + //{ //if (vibuffering) //{ // divot_filter16_buffer(&r, &g, &b, &ViBuffer[i][j]); @@ -176,13 +181,13 @@ //{ //divot_filter16(&c.i.r, &c.i.g, &c.i.b, &frame_buffer[pixels ^ WORD_ADDR_XOR], pixels ^ WORD_ADDR_XOR); //} - } - } + //} + //} /* if (gamma_dither) { - dith = screen->machine().rand() & 0x3f; + dith = screen.machine().rand() & 0x3f; } if (gamma) { @@ -218,21 +223,21 @@ } } -void Processor::VideoUpdate32(bitmap_t *bitmap) +void Processor::VideoUpdate32(n64_periphs *n64, bitmap_rgb32 &bitmap) { - int gamma = (n64_vi_control >> 3) & 1; - int gamma_dither = (n64_vi_control >> 2) & 1; - //int vibuffering = ((n64_vi_control & 2) && fsaa && divot); + int gamma = (n64->vi_control >> 3) & 1; + int gamma_dither = (n64->vi_control >> 2) & 1; + //int vibuffering = ((n64->vi_control & 2) && fsaa && divot); - UINT32 *frame_buffer32 = (UINT32*)&rdram[(n64_vi_origin & 0xffffff) >> 2]; + UINT32 *frame_buffer32 = (UINT32*)&rdram[(n64->vi_origin & 0xffffff) >> 2]; - const INT32 hdiff = (n64_vi_hstart & 0x3ff) - ((n64_vi_hstart >> 16) & 0x3ff); - const float hcoeff = ((float)(n64_vi_xscale & 0xfff) / (1 << 10)); + const INT32 hdiff = (n64->vi_hstart & 0x3ff) - ((n64->vi_hstart >> 16) & 0x3ff); + const float hcoeff = ((float)(n64->vi_xscale & 0xfff) / (1 << 10)); UINT32 hres = ((float)hdiff * hcoeff); - INT32 invisiblewidth = n64_vi_width - hres; + INT32 invisiblewidth = n64->vi_width - hres; - const INT32 vdiff = ((n64_vi_vstart & 0x3ff) - ((n64_vi_vstart >> 16) & 0x3ff)) >> 1; - const float vcoeff = ((float)(n64_vi_yscale & 0xfff) / (1 << 10)); + const INT32 vdiff = ((n64->vi_vstart & 0x3ff) - ((n64->vi_vstart >> 16) & 0x3ff)) >> 1; + const float vcoeff = ((float)(n64->vi_yscale & 0xfff) / (1 << 10)); const UINT32 vres = ((float)vdiff * vcoeff); if (vdiff <= 0 || hdiff <= 0) @@ -250,7 +255,7 @@ { for (int j = 0; j < vres; j++) { - UINT32 *d = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *d = &bitmap.pix32(j); for (int i = 0; i < hres; i++) { UINT32 pix = *frame_buffer32++; @@ -412,56 +417,56 @@ { if (noisecompute) { - m_noise_color.i.r = m_noise_color.i.g = m_noise_color.i.b = machine().rand() & 0xff; // Not accurate... + NoiseColor.i.r = NoiseColor.i.g = NoiseColor.i.b = machine().rand() & 0xff; // Not accurate... } - m_pixel_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[1],*m_color_inputs.combiner_rgbsub_b_r[1],*m_color_inputs.combiner_rgbmul_r[1],*m_color_inputs.combiner_rgbadd_r[1]); - m_pixel_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[1],*m_color_inputs.combiner_rgbsub_b_g[1],*m_color_inputs.combiner_rgbmul_g[1],*m_color_inputs.combiner_rgbadd_g[1]); - m_pixel_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[1],*m_color_inputs.combiner_rgbsub_b_b[1],*m_color_inputs.combiner_rgbmul_b[1],*m_color_inputs.combiner_rgbadd_b[1]); - m_pixel_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[1],*m_color_inputs.combiner_alphasub_b[1],*m_color_inputs.combiner_alphamul[1],*m_color_inputs.combiner_alphaadd[1]); + PixelColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[1],*ColorInputs.combiner_rgbsub_b_r[1],*ColorInputs.combiner_rgbmul_r[1],*ColorInputs.combiner_rgbadd_r[1]); + PixelColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[1],*ColorInputs.combiner_rgbsub_b_g[1],*ColorInputs.combiner_rgbmul_g[1],*ColorInputs.combiner_rgbadd_g[1]); + PixelColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[1],*ColorInputs.combiner_rgbsub_b_b[1],*ColorInputs.combiner_rgbmul_b[1],*ColorInputs.combiner_rgbadd_b[1]); + PixelColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[1],*ColorInputs.combiner_alphasub_b[1],*ColorInputs.combiner_alphamul[1],*ColorInputs.combiner_alphaadd[1]); //Alpha coverage combiner - GetAlphaCvg(&m_pixel_color.i.a); + GetAlphaCvg(&PixelColor.i.a); } void Processor::ColorCombiner2Cycle(bool noisecompute) { if (noisecompute) { - m_noise_color.i.r = m_noise_color.i.g = m_noise_color.i.b = machine().rand() & 0xff; // HACK + NoiseColor.i.r = NoiseColor.i.g = NoiseColor.i.b = machine().rand() & 0xff; // HACK } - m_combined_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[0],*m_color_inputs.combiner_rgbsub_b_r[0],*m_color_inputs.combiner_rgbmul_r[0],*m_color_inputs.combiner_rgbadd_r[0]); - m_combined_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[0],*m_color_inputs.combiner_rgbsub_b_g[0],*m_color_inputs.combiner_rgbmul_g[0],*m_color_inputs.combiner_rgbadd_g[0]); - m_combined_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[0],*m_color_inputs.combiner_rgbsub_b_b[0],*m_color_inputs.combiner_rgbmul_b[0],*m_color_inputs.combiner_rgbadd_b[0]); - m_combined_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[0],*m_color_inputs.combiner_alphasub_b[0],*m_color_inputs.combiner_alphamul[0],*m_color_inputs.combiner_alphaadd[0]); + CombinedColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[0],*ColorInputs.combiner_rgbsub_b_r[0],*ColorInputs.combiner_rgbmul_r[0],*ColorInputs.combiner_rgbadd_r[0]); + CombinedColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[0],*ColorInputs.combiner_rgbsub_b_g[0],*ColorInputs.combiner_rgbmul_g[0],*ColorInputs.combiner_rgbadd_g[0]); + CombinedColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[0],*ColorInputs.combiner_rgbsub_b_b[0],*ColorInputs.combiner_rgbmul_b[0],*ColorInputs.combiner_rgbadd_b[0]); + CombinedColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[0],*ColorInputs.combiner_alphasub_b[0],*ColorInputs.combiner_alphamul[0],*ColorInputs.combiner_alphaadd[0]); - m_texel0_color = m_texel1_color; - m_texel1_color = m_next_texel_color; + Texel0Color = Texel1Color; + Texel1Color = NextTexelColor; - m_pixel_color.i.r = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_r[1],*m_color_inputs.combiner_rgbsub_b_r[1],*m_color_inputs.combiner_rgbmul_r[1],*m_color_inputs.combiner_rgbadd_r[1]); - m_pixel_color.i.g = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_g[1],*m_color_inputs.combiner_rgbsub_b_g[1],*m_color_inputs.combiner_rgbmul_g[1],*m_color_inputs.combiner_rgbadd_g[1]); - m_pixel_color.i.b = ColorCombinerEquation(*m_color_inputs.combiner_rgbsub_a_b[1],*m_color_inputs.combiner_rgbsub_b_b[1],*m_color_inputs.combiner_rgbmul_b[1],*m_color_inputs.combiner_rgbadd_b[1]); - m_pixel_color.i.a = AlphaCombinerEquation(*m_color_inputs.combiner_alphasub_a[1],*m_color_inputs.combiner_alphasub_b[1],*m_color_inputs.combiner_alphamul[1],*m_color_inputs.combiner_alphaadd[1]); + PixelColor.i.r = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_r[1],*ColorInputs.combiner_rgbsub_b_r[1],*ColorInputs.combiner_rgbmul_r[1],*ColorInputs.combiner_rgbadd_r[1]); + PixelColor.i.g = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_g[1],*ColorInputs.combiner_rgbsub_b_g[1],*ColorInputs.combiner_rgbmul_g[1],*ColorInputs.combiner_rgbadd_g[1]); + PixelColor.i.b = ColorCombinerEquation(*ColorInputs.combiner_rgbsub_a_b[1],*ColorInputs.combiner_rgbsub_b_b[1],*ColorInputs.combiner_rgbmul_b[1],*ColorInputs.combiner_rgbadd_b[1]); + PixelColor.i.a = AlphaCombinerEquation(*ColorInputs.combiner_alphasub_a[1],*ColorInputs.combiner_alphasub_b[1],*ColorInputs.combiner_alphamul[1],*ColorInputs.combiner_alphaadd[1]); - GetAlphaCvg(&m_pixel_color.i.a); + GetAlphaCvg(&PixelColor.i.a); } void Processor::SetSubAInputRGB(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) { switch (code & 0xf) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_one_color.i.r; *input_g = &m_one_color.i.g; *input_b = &m_one_color.i.b; break; - case 7: *input_r = &m_noise_color.i.r; *input_g = &m_noise_color.i.g; *input_b = &m_noise_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &OneColor.i.r; *input_g = &OneColor.i.g; *input_b = &OneColor.i.b; break; + case 7: *input_r = &NoiseColor.i.r; *input_g = &NoiseColor.i.g; *input_b = &NoiseColor.i.b; break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -470,17 +475,17 @@ { switch (code & 0xf) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n"); break; - case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break; + case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -489,26 +494,26 @@ { switch (code & 0x1f) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_key_scale.i.r; *input_g = &m_key_scale.i.g; *input_b = &m_key_scale.i.b; break; - case 7: *input_r = &m_combined_color.i.a; *input_g = &m_combined_color.i.a; *input_b = &m_combined_color.i.a; break; - case 8: *input_r = &m_texel0_color.i.a; *input_g = &m_texel0_color.i.a; *input_b = &m_texel0_color.i.a; break; - case 9: *input_r = &m_texel1_color.i.a; *input_g = &m_texel1_color.i.a; *input_b = &m_texel1_color.i.a; break; - case 10: *input_r = &m_prim_color.i.a; *input_g = &m_prim_color.i.a; *input_b = &m_prim_color.i.a; break; - case 11: *input_r = &m_shade_color.i.a; *input_g = &m_shade_color.i.a; *input_b = &m_shade_color.i.a; break; - case 12: *input_r = &m_env_color.i.a; *input_g = &m_env_color.i.a; *input_b = &m_env_color.i.a; break; - case 13: *input_r = &m_lod_frac; *input_g = &m_lod_frac; *input_b = &m_lod_frac; break; - case 14: *input_r = &m_prim_lod_frac; *input_g = &m_prim_lod_frac; *input_b = &m_prim_lod_frac; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &KeyScale.i.r; *input_g = &KeyScale.i.g; *input_b = &KeyScale.i.b; break; + case 7: *input_r = &CombinedColor.i.a; *input_g = &CombinedColor.i.a; *input_b = &CombinedColor.i.a; break; + case 8: *input_r = &Texel0Color.i.a; *input_g = &Texel0Color.i.a; *input_b = &Texel0Color.i.a; break; + case 9: *input_r = &Texel1Color.i.a; *input_g = &Texel1Color.i.a; *input_b = &Texel1Color.i.a; break; + case 10: *input_r = &PrimColor.i.a; *input_g = &PrimColor.i.a; *input_b = &PrimColor.i.a; break; + case 11: *input_r = &ShadeColor.i.a; *input_g = &ShadeColor.i.a; *input_b = &ShadeColor.i.a; break; + case 12: *input_r = &EnvColor.i.a; *input_g = &EnvColor.i.a; *input_b = &EnvColor.i.a; break; + case 13: *input_r = &LODFraction; *input_g = &LODFraction; *input_b = &LODFraction; break; + case 14: *input_r = &PrimLODFraction; *input_g = &PrimLODFraction; *input_b = &PrimLODFraction; break; case 15: *input_r = (UINT8*)&m_k5; *input_g = (UINT8*)&m_k5; *input_b = (UINT8*)&m_k5; break; case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: { - *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } } @@ -517,14 +522,14 @@ { switch (code & 0x7) { - case 0: *input_r = &m_combined_color.i.r; *input_g = &m_combined_color.i.g; *input_b = &m_combined_color.i.b; break; - case 1: *input_r = &m_texel0_color.i.r; *input_g = &m_texel0_color.i.g; *input_b = &m_texel0_color.i.b; break; - case 2: *input_r = &m_texel1_color.i.r; *input_g = &m_texel1_color.i.g; *input_b = &m_texel1_color.i.b; break; - case 3: *input_r = &m_prim_color.i.r; *input_g = &m_prim_color.i.g; *input_b = &m_prim_color.i.b; break; - case 4: *input_r = &m_shade_color.i.r; *input_g = &m_shade_color.i.g; *input_b = &m_shade_color.i.b; break; - case 5: *input_r = &m_env_color.i.r; *input_g = &m_env_color.i.g; *input_b = &m_env_color.i.b; break; - case 6: *input_r = &m_one_color.i.r; *input_g = &m_one_color.i.g; *input_b = &m_one_color.i.b; break; - case 7: *input_r = &m_zero_color.i.r; *input_g = &m_zero_color.i.g; *input_b = &m_zero_color.i.b; break; + case 0: *input_r = &CombinedColor.i.r; *input_g = &CombinedColor.i.g; *input_b = &CombinedColor.i.b; break; + case 1: *input_r = &Texel0Color.i.r; *input_g = &Texel0Color.i.g; *input_b = &Texel0Color.i.b; break; + case 2: *input_r = &Texel1Color.i.r; *input_g = &Texel1Color.i.g; *input_b = &Texel1Color.i.b; break; + case 3: *input_r = &PrimColor.i.r; *input_g = &PrimColor.i.g; *input_b = &PrimColor.i.b; break; + case 4: *input_r = &ShadeColor.i.r; *input_g = &ShadeColor.i.g; *input_b = &ShadeColor.i.b; break; + case 5: *input_r = &EnvColor.i.r; *input_g = &EnvColor.i.g; *input_b = &EnvColor.i.b; break; + case 6: *input_r = &OneColor.i.r; *input_g = &OneColor.i.g; *input_b = &OneColor.i.b; break; + case 7: *input_r = &ZeroColor.i.r; *input_g = &ZeroColor.i.g; *input_b = &ZeroColor.i.b; break; } } @@ -532,14 +537,14 @@ { switch (code & 0x7) { - case 0: *input = &m_combined_color.i.a; break; - case 1: *input = &m_texel0_color.i.a; break; - case 2: *input = &m_texel1_color.i.a; break; - case 3: *input = &m_prim_color.i.a; break; - case 4: *input = &m_shade_color.i.a; break; - case 5: *input = &m_env_color.i.a; break; - case 6: *input = &m_one_color.i.a; break; - case 7: *input = &m_zero_color.i.a; break; + case 0: *input = &CombinedColor.i.a; break; + case 1: *input = &Texel0Color.i.a; break; + case 2: *input = &Texel1Color.i.a; break; + case 3: *input = &PrimColor.i.a; break; + case 4: *input = &ShadeColor.i.a; break; + case 5: *input = &EnvColor.i.a; break; + case 6: *input = &OneColor.i.a; break; + case 7: *input = &ZeroColor.i.a; break; } } @@ -547,14 +552,14 @@ { switch (code & 0x7) { - case 0: *input = &m_lod_frac; break; - case 1: *input = &m_texel0_color.i.a; break; - case 2: *input = &m_texel1_color.i.a; break; - case 3: *input = &m_prim_color.i.a; break; - case 4: *input = &m_shade_color.i.a; break; - case 5: *input = &m_env_color.i.a; break; - case 6: *input = &m_prim_lod_frac; break; - case 7: *input = &m_zero_color.i.a; break; + case 0: *input = &LODFraction; break; + case 1: *input = &Texel0Color.i.a; break; + case 2: *input = &Texel1Color.i.a; break; + case 3: *input = &PrimColor.i.a; break; + case 4: *input = &ShadeColor.i.a; break; + case 5: *input = &EnvColor.i.a; break; + case 6: *input = &PrimLODFraction; break; + case 7: *input = &ZeroColor.i.a; break; } } @@ -566,40 +571,40 @@ { if (cycle == 0) { - *input_r = &m_pixel_color.i.r; - *input_g = &m_pixel_color.i.g; - *input_b = &m_pixel_color.i.b; + *input_r = &PixelColor.i.r; + *input_g = &PixelColor.i.g; + *input_b = &PixelColor.i.b; } else { - *input_r = &m_blended_pixel_color.i.r; - *input_g = &m_blended_pixel_color.i.g; - *input_b = &m_blended_pixel_color.i.b; + *input_r = &BlendedPixelColor.i.r; + *input_g = &BlendedPixelColor.i.g; + *input_b = &BlendedPixelColor.i.b; } break; } case 1: { - *input_r = &m_memory_color.i.r; - *input_g = &m_memory_color.i.g; - *input_b = &m_memory_color.i.b; + *input_r = &MemoryColor.i.r; + *input_g = &MemoryColor.i.g; + *input_b = &MemoryColor.i.b; break; } case 2: { - *input_r = &m_blend_color.i.r; - *input_g = &m_blend_color.i.g; - *input_b = &m_blend_color.i.b; + *input_r = &BlendColor.i.r; + *input_g = &BlendColor.i.g; + *input_b = &BlendColor.i.b; break; } case 3: { - *input_r = &m_fog_color.i.r; - *input_g = &m_fog_color.i.g; - *input_b = &m_fog_color.i.b; + *input_r = &FogColor.i.r; + *input_g = &FogColor.i.g; + *input_b = &FogColor.i.b; break; } } @@ -608,20 +613,20 @@ { switch (b & 0x3) { - case 0: *input_a = &m_pixel_color.i.a; break; - case 1: *input_a = &m_fog_color.i.a; break; - case 2: *input_a = &m_shade_color.i.a; break; - case 3: *input_a = &m_zero_color.i.a; break; + case 0: *input_a = &PixelColor.i.a; break; + case 1: *input_a = &FogColor.i.a; break; + case 2: *input_a = &ShadeColor.i.a; break; + case 3: *input_a = &ZeroColor.i.a; break; } } else { switch (b & 0x3) { - case 0: *input_a = &m_inv_pixel_color.i.a; break; - case 1: *input_a = &m_memory_color.i.a; break; - case 2: *input_a = &m_one_color.i.a; break; - case 3: *input_a = &m_zero_color.i.a; break; + case 0: *input_a = &InvPixelColor.i.a; break; + case 1: *input_a = &MemoryColor.i.a; break; + case 2: *input_a = &OneColor.i.a; break; + case 3: *input_a = &ZeroColor.i.a; break; } } } @@ -859,14 +864,9 @@ void Processor::lookup_cvmask_derivatives(UINT32 mask, UINT8* offx, UINT8* offy) { - UINT32 index; - /* - if (mask != (mask & 0xa5a5))//never happens - stricterror("wrong cvmask computed: %x", mask); - */ - index = compressed_cvmasks[mask];//???????? VTune, ???-?? ?? 50% ???????, ??? ?????? ?? 8 ??? ?? ????? ? ???? ?-?? - m_misc_state.m_curpixel_cvg = cvarray[index].cvg; - m_misc_state.m_curpixel_cvbit = cvarray[index].cvbit;//??? mask15b: cv.c, bl.c + UINT32 index = compressed_cvmasks[mask]; + MiscState.CurrentPixCvg = cvarray[index].cvg; + MiscState.CurrentCvgBit = cvarray[index].cvbit; *offx = cvarray[index].xoff; *offy = cvarray[index].yoff; } @@ -880,7 +880,7 @@ } if(dzcurpixel <= MEM8_LIMIT) { - m_hidden_bits[dzcurpixel ^ BYTE_ADDR_XOR] = m_dzpix_enc & 3; + HiddenBits[dzcurpixel ^ BYTE_ADDR_XOR] = m_dzpix_enc & 3; } } @@ -913,7 +913,7 @@ UINT32 Processor::DZDecompress(UINT32 zcurpixel, UINT32 dzcurpixel) { UINT16 zval = RREADIDX16(zcurpixel); - UINT8 dzval = (((dzcurpixel) <= 0x7fffff) ? (GetHiddenBits()[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0); + UINT8 dzval = (((dzcurpixel) <= 0x7fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0); UINT32 dz_compressed = ((zval & 3) << 2) | (dzval & 3); return (1 << dz_compressed); } @@ -928,7 +928,7 @@ void Processor::GetDitherValues(int x, int y, int* cdith, int* adith) { int dithindex = ((y & 3) << 2) | (x & 3); - switch((m_other_modes.rgb_dither_sel << 2) | m_other_modes.alpha_dither_sel) + switch((OtherModes.rgb_dither_sel << 2) | OtherModes.alpha_dither_sel) { case 0: *adith = *cdith = s_magic_matrix[dithindex]; @@ -1011,12 +1011,12 @@ UINT32 zval; INT32 rawdzmem; - if (m_other_modes.z_compare_en) + if (OtherModes.z_compare_en) { oz = ZDecompress(zcurpixel); dzmem = DZDecompress(zcurpixel, dzcurpixel); zval = RREADIDX16(zcurpixel); - rawdzmem = ((zval & 3) << 2) | ((((dzcurpixel) <= 0x3fffff) ? (GetHiddenBits()[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0) & 3); + rawdzmem = ((zval & 3) << 2) | ((((dzcurpixel) <= 0x3fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0) & 3); } else { @@ -1027,16 +1027,13 @@ } m_dzpix_enc = DZCompress(dzpix & 0xffff); - m_blender.SetShiftA(CLAMP(m_dzpix_enc - rawdzmem, 0, 4)); - m_blender.SetShiftB(CLAMP(rawdzmem - m_dzpix_enc, 0, 4)); + Blender.ShiftA = CLAMP(m_dzpix_enc - rawdzmem, 0, 4); + Blender.ShiftB = CLAMP(rawdzmem - m_dzpix_enc, 0, 4); int precision_factor = (zval >> 13) & 0xf; - - bool precision_important = precision_factor < 3; - int dzmemmodifier; - if (precision_important) + if (precision_factor < 3) { - dzmemmodifier = 16 >> precision_factor; + int dzmemmodifier = 16 >> precision_factor; if (dzmem == 0x8000) { force_coplanar = true; @@ -1068,21 +1065,21 @@ farther = true; } - bool overflow = ((m_misc_state.m_curpixel_memcvg + m_misc_state.m_curpixel_cvg) & 8) > 0; - m_blender.SetBlendEnable(m_other_modes.force_blend || (!overflow && m_other_modes.antialias_en && farther)); - m_framebuffer.SetPreWrap(overflow); + bool overflow = ((MiscState.CurrentMemCvg + MiscState.CurrentPixCvg) & 8) > 0; + Blender.BlendEnable = OtherModes.force_blend || (!overflow && OtherModes.antialias_en && farther); + Framebuffer.SetPreWrap(overflow); int cvgcoeff = 0; UINT32 dzenc = 0; - if (m_other_modes.z_mode == 1 && infront && farther && overflow) + if (OtherModes.z_mode == 1 && infront && farther && overflow) { dzenc = DZCompress(dznotshift & 0xffff); cvgcoeff = ((oz >> dzenc) - (sz >> dzenc)) & 0xf; - m_misc_state.m_curpixel_cvg = ((cvgcoeff * m_misc_state.m_curpixel_cvg) >> 3) & 0xf; + MiscState.CurrentPixCvg = ((cvgcoeff * MiscState.CurrentPixCvg) >> 3) & 0xf; } - if (!m_other_modes.z_compare_en) + if (!OtherModes.z_compare_en) { return true; } @@ -1095,7 +1092,7 @@ nearer = true; } - switch(m_other_modes.z_mode) + switch(OtherModes.z_mode) { case 0: return (max || (overflow ? infront : nearer)); @@ -1743,7 +1740,6 @@ m_machine = &machine; m_rdp = &(machine.driver_data<_n64_state>())->m_rdp; m_cmd_data = rect ? m_rdp->GetTempRectData() : m_rdp->GetCommandData(); - m_misc_state = m_rdp->GetMiscState(); m_shade = shade; m_texture = texture; m_zbuffer = zbuffer; @@ -1809,7 +1805,7 @@ if (length < 0) return; - memset(&m_rdp->GetSpans()[scanline].m_cvg[purgestart], 0, (length + 1) << 2); + memset(&m_rdp->Spans[scanline].m_cvg[purgestart], 0, (length + 1) << 1); for(int i = 0; i < 4; i++) { @@ -1831,11 +1827,11 @@ { if (!(minorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[minorcurint] |= (leftcvghex(minorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[minorcurint] |= (leftcvghex(minorcur, fmask) << maskshift); } if (!(majorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (rightcvghex(majorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (rightcvghex(majorcur, fmask) << maskshift); } } else @@ -1843,12 +1839,12 @@ if (!(majorcurint & ~0x3ff)) { INT32 samecvg = leftcvghex(minorcur, fmask) & rightcvghex(majorcur, fmask); - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); } } for (; fleft <= fright; fleft++) { - m_rdp->GetSpans()[scanline].m_cvg[fleft] |= fmaskshifted; + m_rdp->Spans[scanline].m_cvg[fleft] |= fmaskshifted; } } } @@ -1882,7 +1878,7 @@ if (length < 0) return; - memset(&m_rdp->GetSpans()[scanline].m_cvg[purgestart], 0, (length + 1) << 2); + memset(&m_rdp->Spans[scanline].m_cvg[purgestart], 0, (length + 1) << 1); for(int i = 0; i < 4; i++) { @@ -1904,11 +1900,11 @@ { if (!(minorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[minorcurint] |= (rightcvghex(minorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[minorcurint] |= (rightcvghex(minorcur, fmask) << maskshift); } if (!(majorcurint & ~0x3ff)) { - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (leftcvghex(majorcur, fmask) << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (leftcvghex(majorcur, fmask) << maskshift); } } else @@ -1916,12 +1912,12 @@ if (!(majorcurint & ~0x3ff)) { INT32 samecvg = rightcvghex(minorcur, fmask) & leftcvghex(majorcur, fmask); - m_rdp->GetSpans()[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); + m_rdp->Spans[scanline].m_cvg[majorcurint] |= (samecvg << maskshift); } } for (; fleft <= fright; fleft++) { - m_rdp->GetSpans()[scanline].m_cvg[fleft] |= fmaskshifted; + m_rdp->Spans[scanline].m_cvg[fleft] |= fmaskshifted; } } } @@ -1934,7 +1930,7 @@ UINT32 w2 = m_cmd_data[fifo_index + 1]; int flip = (w1 & 0x800000) ? 1 : 0; - m_misc_state->m_max_level = ((w1 >> 19) & 7); + m_rdp->MiscState.MaxLevel = ((w1 >> 19) & 7); int tilenum = (w1 >> 16) & 0x7; int dsdiff = 0, dtdiff = 0, dwdiff = 0, drdiff = 0, dgdiff = 0, dbdiff = 0, dadiff = 0, dzdiff = 0; @@ -2140,24 +2136,24 @@ if (spix == 3) { - m_rdp->GetSpans()[j].m_lx = maxxmx; - m_rdp->GetSpans()[j].m_rx = minxhx; + m_rdp->Spans[j].m_lx = maxxmx; + m_rdp->Spans[j].m_rx = minxhx; compute_cvg_flip(majorx, minorx, majorxint, minorxint, j, yh, yl); } if (spix == ldflag) { - m_rdp->GetSpans()[j].m_unscissored_rx = xend; + m_rdp->Spans[j].m_unscissored_rx = xend; xfrac = ((xright >> 8) & 0xff); - m_rdp->GetSpans()[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); - m_rdp->GetSpans()[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); - m_rdp->GetSpans()[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); - m_rdp->GetSpans()[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); - m_rdp->GetSpans()[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); - //printf("%d - %08x\n", j, m_rdp->GetSpans()[j].m_z.w); + m_rdp->Spans[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); + m_rdp->Spans[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); + m_rdp->Spans[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); + m_rdp->Spans[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); + m_rdp->Spans[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; + m_rdp->Spans[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; + m_rdp->Spans[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; + m_rdp->Spans[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); + //printf("%d - %08x\n", j, m_rdp->Spans[j].m_z.w); } } @@ -2214,23 +2210,23 @@ if (spix == 3) { - m_rdp->GetSpans()[j].m_lx = minxmx; - m_rdp->GetSpans()[j].m_rx = maxxhx; + m_rdp->Spans[j].m_lx = minxmx; + m_rdp->Spans[j].m_rx = maxxhx; compute_cvg_noflip(majorx, minorx, majorxint, minorxint, j, yh, yl); } if (spix == ldflag) { - m_rdp->GetSpans()[j].m_unscissored_rx = xend; + m_rdp->Spans[j].m_unscissored_rx = xend; xfrac = ((xright >> 8) & 0xff); - m_rdp->GetSpans()[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); - m_rdp->GetSpans()[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); - m_rdp->GetSpans()[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); - m_rdp->GetSpans()[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); - m_rdp->GetSpans()[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; - m_rdp->GetSpans()[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); + m_rdp->Spans[j].m_r.w = ((r >> 9) << 9) + drdiff - (xfrac * drdxh); + m_rdp->Spans[j].m_g.w = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh); + m_rdp->Spans[j].m_b.w = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh); + m_rdp->Spans[j].m_a.w = ((a >> 9) << 9) + dadiff - (xfrac * dadxh); + m_rdp->Spans[j].m_s.w = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f; + m_rdp->Spans[j].m_t.w = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f; + m_rdp->Spans[j].m_w.w = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f; + m_rdp->Spans[j].m_z.w = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh); } } @@ -2325,7 +2321,7 @@ dsdx = SIGN16(dsdx); dtdy = SIGN16(dtdy); - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2385,7 +2381,7 @@ dsdx = SIGN16(dsdx); dtdy = SIGN16(dtdy); - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2447,18 +2443,18 @@ void N64::RDP::Processor::CmdSetKeyGB(UINT32 w1, UINT32 w2) { - m_key_scale.i.b = w2 & 0xff; - m_key_scale.i.g = (w2 >> 16) & 0xff; + KeyScale.i.b = w2 & 0xff; + KeyScale.i.g = (w2 >> 16) & 0xff; } void N64::RDP::Processor::CmdSetKeyR(UINT32 w1, UINT32 w2) { - m_key_scale.i.r = w2 & 0xff; + KeyScale.i.r = w2 & 0xff; } void N64::RDP::Processor::CmdSetFillColor32(UINT32 w1, UINT32 w2) { - m_fill_color = w2; + FillColor = w2; } void N64::RDP::Processor::CmdSetConvert(UINT32 w1, UINT32 w2) @@ -2490,55 +2486,55 @@ void N64::RDP::Processor::CmdSetPrimDepth(UINT32 w1, UINT32 w2) { - m_misc_state.m_primitive_z = (UINT16)(w2 >> 16) & 0x7fff; - m_misc_state.m_primitive_delta_z = (UINT16)(w1); + MiscState.PrimitiveZ = (UINT16)(w2 >> 16) & 0x7fff; + MiscState.PrimitiveDZ = (UINT16)(w1); } void N64::RDP::Processor::CmdSetOtherModes(UINT32 w1, UINT32 w2) { - m_other_modes.cycle_type = (w1 >> 20) & 0x3; // 01 - m_other_modes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; // 1 - m_other_modes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; // 0 - m_other_modes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; // 0 - m_other_modes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; // 0 - m_other_modes.en_tlut = (w1 & 0x08000) ? 1 : 0; // 0 - m_other_modes.tlut_type = (w1 & 0x04000) ? 1 : 0; // 0 - m_other_modes.sample_type = (w1 & 0x02000) ? 1 : 0; // 1 - m_other_modes.mid_texel = (w1 & 0x01000) ? 1 : 0; // 0 - m_other_modes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; // 1 - m_other_modes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; // 1 - m_other_modes.convert_one = (w1 & 0x00200) ? 1 : 0; // 0 - m_other_modes.key_en = (w1 & 0x00100) ? 1 : 0; // 0 - m_other_modes.rgb_dither_sel = (w1 >> 6) & 0x3; // 00 - m_other_modes.alpha_dither_sel = (w1 >> 4) & 0x3; // 01 - m_other_modes.blend_m1a_0 = (w2 >> 30) & 0x3; // 11 - m_other_modes.blend_m1a_1 = (w2 >> 28) & 0x3; // 00 - m_other_modes.blend_m1b_0 = (w2 >> 26) & 0x3; // 10 - m_other_modes.blend_m1b_1 = (w2 >> 24) & 0x3; // 00 - m_other_modes.blend_m2a_0 = (w2 >> 22) & 0x3; // 00 - m_other_modes.blend_m2a_1 = (w2 >> 20) & 0x3; // 01 - m_other_modes.blend_m2b_0 = (w2 >> 18) & 0x3; // 00 - m_other_modes.blend_m2b_1 = (w2 >> 16) & 0x3; // 01 - m_other_modes.force_blend = (w2 >> 14) & 1; // 0 - m_other_modes.alpha_cvg_select = (w2 >> 13) & 1; // 1 - m_other_modes.cvg_times_alpha = (w2 >> 12) & 1; // 0 - m_other_modes.z_mode = (w2 >> 10) & 0x3; // 00 - m_other_modes.cvg_dest = (w2 >> 8) & 0x3; // 00 - m_other_modes.color_on_cvg = (w2 >> 7) & 1; // 0 - m_other_modes.image_read_en = (w2 >> 6) & 1; // 1 - m_other_modes.z_update_en = (w2 >> 5) & 1; // 1 - m_other_modes.z_compare_en = (w2 >> 4) & 1; // 1 - m_other_modes.antialias_en = (w2 >> 3) & 1; // 1 - m_other_modes.z_source_sel = (w2 >> 2) & 1; // 0 - m_other_modes.dither_alpha_en = (w2 >> 1) & 1; // 0 - m_other_modes.alpha_compare_en = (w2) & 1; // 0 + OtherModes.cycle_type = (w1 >> 20) & 0x3; // 01 + OtherModes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; // 1 + OtherModes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; // 0 + OtherModes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; // 0 + OtherModes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; // 0 + OtherModes.en_tlut = (w1 & 0x08000) ? 1 : 0; // 0 + OtherModes.tlut_type = (w1 & 0x04000) ? 1 : 0; // 0 + OtherModes.sample_type = (w1 & 0x02000) ? 1 : 0; // 1 + OtherModes.mid_texel = (w1 & 0x01000) ? 1 : 0; // 0 + OtherModes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; // 1 + OtherModes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; // 1 + OtherModes.convert_one = (w1 & 0x00200) ? 1 : 0; // 0 + OtherModes.key_en = (w1 & 0x00100) ? 1 : 0; // 0 + OtherModes.rgb_dither_sel = (w1 >> 6) & 0x3; // 00 + OtherModes.alpha_dither_sel = (w1 >> 4) & 0x3; // 01 + OtherModes.blend_m1a_0 = (w2 >> 30) & 0x3; // 11 + OtherModes.blend_m1a_1 = (w2 >> 28) & 0x3; // 00 + OtherModes.blend_m1b_0 = (w2 >> 26) & 0x3; // 10 + OtherModes.blend_m1b_1 = (w2 >> 24) & 0x3; // 00 + OtherModes.blend_m2a_0 = (w2 >> 22) & 0x3; // 00 + OtherModes.blend_m2a_1 = (w2 >> 20) & 0x3; // 01 + OtherModes.blend_m2b_0 = (w2 >> 18) & 0x3; // 00 + OtherModes.blend_m2b_1 = (w2 >> 16) & 0x3; // 01 + OtherModes.force_blend = (w2 >> 14) & 1; // 0 + OtherModes.alpha_cvg_select = (w2 >> 13) & 1; // 1 + OtherModes.cvg_times_alpha = (w2 >> 12) & 1; // 0 + OtherModes.z_mode = (w2 >> 10) & 0x3; // 00 + OtherModes.cvg_dest = (w2 >> 8) & 0x3; // 00 + OtherModes.color_on_cvg = (w2 >> 7) & 1; // 0 + OtherModes.image_read_en = (w2 >> 6) & 1; // 1 + OtherModes.z_update_en = (w2 >> 5) & 1; // 1 + OtherModes.z_compare_en = (w2 >> 4) & 1; // 1 + OtherModes.antialias_en = (w2 >> 3) & 1; // 1 + OtherModes.z_source_sel = (w2 >> 2) & 1; // 0 + OtherModes.dither_alpha_en = (w2 >> 1) & 1; // 0 + OtherModes.alpha_compare_en = (w2) & 1; // 0 // These should belong to the Blender class - SetBlenderInput(0, 0, &m_color_inputs.blender1a_r[0], &m_color_inputs.blender1a_g[0], &m_color_inputs.blender1a_b[0], &m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0); - SetBlenderInput(0, 1, &m_color_inputs.blender2a_r[0], &m_color_inputs.blender2a_g[0], &m_color_inputs.blender2a_b[0], &m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0); - SetBlenderInput(1, 0, &m_color_inputs.blender1a_r[1], &m_color_inputs.blender1a_g[1], &m_color_inputs.blender1a_b[1], &m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1); - SetBlenderInput(1, 1, &m_color_inputs.blender2a_r[1], &m_color_inputs.blender2a_g[1], &m_color_inputs.blender2a_b[1], &m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1); + SetBlenderInput(0, 0, &ColorInputs.blender1a_r[0], &ColorInputs.blender1a_g[0], &ColorInputs.blender1a_b[0], &ColorInputs.blender1b_a[0], OtherModes.blend_m1a_0, OtherModes.blend_m1b_0); + SetBlenderInput(0, 1, &ColorInputs.blender2a_r[0], &ColorInputs.blender2a_g[0], &ColorInputs.blender2a_b[0], &ColorInputs.blender2b_a[0], OtherModes.blend_m2a_0, OtherModes.blend_m2b_0); + SetBlenderInput(1, 0, &ColorInputs.blender1a_r[1], &ColorInputs.blender1a_g[1], &ColorInputs.blender1a_b[1], &ColorInputs.blender1b_a[1], OtherModes.blend_m1a_1, OtherModes.blend_m1b_1); + SetBlenderInput(1, 1, &ColorInputs.blender2a_r[1], &ColorInputs.blender2a_g[1], &ColorInputs.blender2a_b[1], &ColorInputs.blender2b_a[1], OtherModes.blend_m2a_1, OtherModes.blend_m2b_1); } void N64::RDP::Processor::CmdLoadTLUT(UINT32 w1, UINT32 w2) @@ -2559,7 +2555,7 @@ int count = (sh >> 2) - (sl >> 2) + 1; count <<= 2; - switch (m_misc_state.m_ti_size) + switch (MiscState.TISize) { case PIXEL_SIZE_16BIT: { @@ -2567,7 +2563,7 @@ { fatalerror("rdp_load_tlut: loading tlut into low half at %d qwords",tile[tilenum].tmem); } - UINT32 srcstart = (m_misc_state.m_ti_address + (tl >> 2) * (m_misc_state.m_ti_width << 1) + (sl >> 1)) >> 1; + UINT32 srcstart = (MiscState.TIAddress + (tl >> 2) * (MiscState.TIWidth << 1) + (sl >> 1)) >> 1; UINT16 *dst = GetTMEM16(); UINT32 dststart = tile[tilenum].tmem << 2; @@ -2585,7 +2581,7 @@ } break; } - default: fatalerror("RDP: load_tlut: size = %d\n", m_misc_state.m_ti_size); + default: fatalerror("RDP: load_tlut: size = %d\n", MiscState.TISize); } } @@ -2619,7 +2615,7 @@ INT32 width = (sh - sl) + 1; - width = (width << m_misc_state.m_ti_size) >> 1; + width = (width << MiscState.TISize) >> 1; if (width & 7) { width = (width & ~7) + 8; @@ -2628,15 +2624,15 @@ UINT32 tb = tile[tilenum].tmem << 2; - int tiwinwords = m_misc_state.m_ti_width; + int tiwinwords = MiscState.TIWidth; UINT32 slinwords = sl; - tiwinwords = (tiwinwords << m_misc_state.m_ti_size) >> 2; - slinwords = (slinwords << m_misc_state.m_ti_size) >> 2; + tiwinwords = (tiwinwords << MiscState.TISize) >> 2; + slinwords = (slinwords << MiscState.TISize) >> 2; int ptr = 0, srcptr = 0; UINT16 first, sec; - UINT32 src = (m_misc_state.m_ti_address >> 1) + (tl * tiwinwords) + slinwords; + UINT32 src = (MiscState.TIAddress >> 1) + (tl * tiwinwords) + slinwords; if (dxt != 0) { @@ -2785,9 +2781,9 @@ INT32 height = (th - tl) + 1; /* int topad; - if (m_misc_state.m_ti_size < 3) + if (MiscState.TISize < 3) { - topad = (width * m_misc_state.m_ti_size) & 0x7; + topad = (width * MiscState.TISize) & 0x7; } else { @@ -2795,20 +2791,20 @@ } topad = 0; // ???? */ - switch (m_misc_state.m_ti_size) + switch (MiscState.TISize) { case PIXEL_SIZE_8BIT: { - UINT32 src = m_misc_state.m_ti_address; + UINT32 src = MiscState.TIAddress; UINT8 *tc = GetTMEM(); int tb = tile[tilenum].tmem << 3; for (int j = 0; j < height; j++) { int tline = tb + ((tile[tilenum].line << 3) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; - int xorval8 = ((j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR);//???????,??? ? Ziggy + int xorval8 = ((j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); for (int i = 0; i < width; i++) { tc[((tline + i) ^ xorval8) & 0xfff] = RREADADDR8(src + s + i); @@ -2818,7 +2814,7 @@ } case PIXEL_SIZE_16BIT: { - UINT32 src = m_misc_state.m_ti_address >> 1; + UINT32 src = MiscState.TIAddress >> 1; UINT16 *tc = GetTMEM16(); UINT16 yuvword; @@ -2828,7 +2824,7 @@ { int tb = tile[tilenum].tmem << 2; int tline = tb + ((tile[tilenum].line << 2) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval16 = (j & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR; for (int i = 0; i < width; i++) @@ -2844,7 +2840,7 @@ { int tb = tile[tilenum].tmem << 3; int tline = tb + ((tile[tilenum].line << 3) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval8 = (j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR; for (int i = 0; i < width; i++) @@ -2860,7 +2856,7 @@ } case PIXEL_SIZE_32BIT: { - UINT32 src = m_misc_state.m_ti_address >> 2; + UINT32 src = MiscState.TIAddress >> 2; UINT16 *tc16 = GetTMEM16(); int tb = (tile[tilenum].tmem << 2); @@ -2868,7 +2864,7 @@ { int tline = tb + ((tile[tilenum].line << 2) * j); - int s = ((j + tl) * m_misc_state.m_ti_width) + sl; + int s = ((j + tl) * MiscState.TIWidth) + sl; int xorval32cur = (j & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR; for (int i = 0; i < width; i++) { @@ -2881,7 +2877,7 @@ break; } - default: fatalerror("RDP: load_tile: size = %d\n", m_misc_state.m_ti_size); + default: fatalerror("RDP: load_tile: size = %d\n", MiscState.TISize); } } @@ -2903,6 +2899,20 @@ tex_tile->ms = (w2 >> 8) & 0x1; tex_tile->mask_s = (w2 >> 4) & 0xf; tex_tile->shift_s = (w2 >> 0) & 0xf; + + if (tex_tile->format == FORMAT_I && tex_tile->size > PIXEL_SIZE_8BIT) + { + tex_tile->format = FORMAT_RGBA; // Used by Supercross 2000 (in-game) + } + if (tex_tile->format == FORMAT_CI && tex_tile->size > PIXEL_SIZE_8BIT) + { + tex_tile->format = FORMAT_RGBA; // Used by Clay Fighter - Sculptor's Cut + } + + if (tex_tile->format == FORMAT_RGBA && tex_tile->size < PIXEL_SIZE_16BIT) + { + tex_tile->format = FORMAT_CI; // Used by Exterem-G2, Madden Football 64, and Rat Attack + } } void N64::RDP::Processor::CmdFillRect(UINT32 w1, UINT32 w2) @@ -2912,7 +2922,7 @@ UINT32 xh = (w2 >> 12) & 0xfff; UINT32 yh = (w2 >> 0) & 0xfff; - if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY) + if (OtherModes.cycle_type == CYCLE_TYPE_FILL || OtherModes.cycle_type == CYCLE_TYPE_COPY) { yl |= 3; } @@ -2937,24 +2947,24 @@ void N64::RDP::Processor::CmdSetFogColor(UINT32 w1, UINT32 w2) { - m_fog_color.c = w2; + FogColor.c = w2; } void N64::RDP::Processor::CmdSetBlendColor(UINT32 w1, UINT32 w2) { - m_blend_color.c = w2; + BlendColor.c = w2; } void N64::RDP::Processor::CmdSetPrimColor(UINT32 w1, UINT32 w2) { - m_misc_state.m_min_level = (w1 >> 8) & 0x1f; - m_prim_lod_frac = w1 & 0xff; - m_prim_color.c = w2; + MiscState.MinLevel = (w1 >> 8) & 0x1f; + PrimLODFraction = w1 & 0xff; + PrimColor.c = w2; } void N64::RDP::Processor::CmdSetEnvColor(UINT32 w1, UINT32 w2) { - m_env_color.c = w2; + EnvColor.c = w2; } void N64::RDP::Processor::CmdSetCombine(UINT32 w1, UINT32 w2) @@ -2977,60 +2987,60 @@ m_combine.sub_b_a1 = (w2 >> 3) & 0x7; m_combine.add_a1 = (w2 >> 0) & 0x7; - SetSubAInputRGB(&m_color_inputs.combiner_rgbsub_a_r[0], &m_color_inputs.combiner_rgbsub_a_g[0], &m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0); - SetSubBInputRGB(&m_color_inputs.combiner_rgbsub_b_r[0], &m_color_inputs.combiner_rgbsub_b_g[0], &m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0); - SetMulInputRGB(&m_color_inputs.combiner_rgbmul_r[0], &m_color_inputs.combiner_rgbmul_g[0], &m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0); - SetAddInputRGB(&m_color_inputs.combiner_rgbadd_r[0], &m_color_inputs.combiner_rgbadd_g[0], &m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0); - SetMulInputAlpha(&m_color_inputs.combiner_alphamul[0], m_combine.mul_a0); - SetSubInputAlpha(&m_color_inputs.combiner_alphaadd[0], m_combine.add_a0); - - SetSubAInputRGB(&m_color_inputs.combiner_rgbsub_a_r[1], &m_color_inputs.combiner_rgbsub_a_g[1], &m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1); - SetSubBInputRGB(&m_color_inputs.combiner_rgbsub_b_r[1], &m_color_inputs.combiner_rgbsub_b_g[1], &m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1); - SetMulInputRGB(&m_color_inputs.combiner_rgbmul_r[1], &m_color_inputs.combiner_rgbmul_g[1], &m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1); - SetAddInputRGB(&m_color_inputs.combiner_rgbadd_r[1], &m_color_inputs.combiner_rgbadd_g[1], &m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1); - SetSubInputAlpha(&m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1); - SetMulInputAlpha(&m_color_inputs.combiner_alphamul[1], m_combine.mul_a1); - SetSubInputAlpha(&m_color_inputs.combiner_alphaadd[1], m_combine.add_a1); + SetSubAInputRGB(&ColorInputs.combiner_rgbsub_a_r[0], &ColorInputs.combiner_rgbsub_a_g[0], &ColorInputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0); + SetSubBInputRGB(&ColorInputs.combiner_rgbsub_b_r[0], &ColorInputs.combiner_rgbsub_b_g[0], &ColorInputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0); + SetMulInputRGB(&ColorInputs.combiner_rgbmul_r[0], &ColorInputs.combiner_rgbmul_g[0], &ColorInputs.combiner_rgbmul_b[0], m_combine.mul_rgb0); + SetAddInputRGB(&ColorInputs.combiner_rgbadd_r[0], &ColorInputs.combiner_rgbadd_g[0], &ColorInputs.combiner_rgbadd_b[0], m_combine.add_rgb0); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_a[0], m_combine.sub_a_a0); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_b[0], m_combine.sub_b_a0); + SetMulInputAlpha(&ColorInputs.combiner_alphamul[0], m_combine.mul_a0); + SetSubInputAlpha(&ColorInputs.combiner_alphaadd[0], m_combine.add_a0); + + SetSubAInputRGB(&ColorInputs.combiner_rgbsub_a_r[1], &ColorInputs.combiner_rgbsub_a_g[1], &ColorInputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1); + SetSubBInputRGB(&ColorInputs.combiner_rgbsub_b_r[1], &ColorInputs.combiner_rgbsub_b_g[1], &ColorInputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1); + SetMulInputRGB(&ColorInputs.combiner_rgbmul_r[1], &ColorInputs.combiner_rgbmul_g[1], &ColorInputs.combiner_rgbmul_b[1], m_combine.mul_rgb1); + SetAddInputRGB(&ColorInputs.combiner_rgbadd_r[1], &ColorInputs.combiner_rgbadd_g[1], &ColorInputs.combiner_rgbadd_b[1], m_combine.add_rgb1); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_a[1], m_combine.sub_a_a1); + SetSubInputAlpha(&ColorInputs.combiner_alphasub_b[1], m_combine.sub_b_a1); + SetMulInputAlpha(&ColorInputs.combiner_alphamul[1], m_combine.mul_a1); + SetSubInputAlpha(&ColorInputs.combiner_alphaadd[1], m_combine.add_a1); } void N64::RDP::Processor::CmdSetTextureImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_ti_format = (w1 >> 21) & 0x7; - m_misc_state.m_ti_size = (w1 >> 19) & 0x3; - m_misc_state.m_ti_width = (w1 & 0x3ff) + 1; - m_misc_state.m_ti_address = w2 & 0x01ffffff; + MiscState.TIFormat = (w1 >> 21) & 0x7; + MiscState.TISize = (w1 >> 19) & 0x3; + MiscState.TIWidth = (w1 & 0x3ff) + 1; + MiscState.TIAddress = w2 & 0x01ffffff; } void N64::RDP::Processor::CmdSetMaskImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_zb_address = w2 & 0x01ffffff; + MiscState.ZBAddress = w2 & 0x01ffffff; } void N64::RDP::Processor::CmdSetColorImage(UINT32 w1, UINT32 w2) { - m_misc_state.m_fb_format = (w1 >> 21) & 0x7; - m_misc_state.m_fb_size = (w1 >> 19) & 0x3; - m_misc_state.m_fb_width = (w1 & 0x3ff) + 1; - m_misc_state.m_fb_address = w2 & 0x01ffffff; + MiscState.FBFormat = (w1 >> 21) & 0x7; + MiscState.FBSize = (w1 >> 19) & 0x3; + MiscState.FBWidth = (w1 & 0x3ff) + 1; + MiscState.FBAddress = w2 & 0x01ffffff; - if (m_misc_state.m_fb_format && m_misc_state.m_fb_format != 2) // Jet Force Gemini sets the format to 4, Intensity. Protection? + if (MiscState.FBFormat && MiscState.FBFormat != 2) // Jet Force Gemini sets the format to 4, Intensity. Protection? { - if (m_misc_state.m_fb_size == 1) + if (MiscState.FBSize == 1) { - m_misc_state.m_fb_format = 2; + MiscState.FBFormat = 2; } else { - m_misc_state.m_fb_format = 0; + MiscState.FBFormat = 0; } } - if (m_misc_state.m_fb_format != 0) + if (MiscState.FBFormat != 0) { - m_misc_state.m_fb_format = 0; + MiscState.FBFormat = 0; } } @@ -3137,12 +3147,18 @@ { UINT32 length = m_end - m_current; + //printf("length %08x\n", length); + //printf("end %08x\n", m_end); + //printf("current %08x\n", m_current); + // load command data for(int i = 0; i < length; i += 4) { + //printf("%08x\n", m_current); m_cmd_data[m_cmd_ptr++] = ReadData((m_current & 0x1fffffff) + i); } + //printf("Queued\n"); m_current = m_end; UINT32 cmd = (m_cmd_data[0] >> 24) & 0x3f; @@ -3153,11 +3169,13 @@ // check if more data is needed if (cmd_length < rdp_command_length[cmd]) { + //printf("Early-out\n"); return; } while (m_cmd_cur < m_cmd_ptr) { + //printf("Command\n"); cmd = (m_cmd_data[m_cmd_cur] >> 24) & 0x3f; if (((m_cmd_ptr - m_cmd_cur) * 4) < rdp_command_length[cmd]) @@ -3235,6 +3253,7 @@ m_cmd_cur = 0; m_start = m_current = m_end; + //printf("Done RDP\n"); } } // namespace RDP @@ -3250,36 +3269,40 @@ state->m_rdp.SetMachine(machine); state->m_rdp.InitInternalState(); - state->m_rdp.GetBlender()->SetOtherModes(state->m_rdp.GetOtherModes()); - state->m_rdp.GetBlender()->SetMiscState(state->m_rdp.GetMiscState()); - state->m_rdp.GetBlender()->SetMachine(machine); - state->m_rdp.GetBlender()->SetProcessor(&state->m_rdp); - - state->m_rdp.GetFramebuffer()->SetOtherModes(state->m_rdp.GetOtherModes()); - state->m_rdp.GetFramebuffer()->SetMiscState(state->m_rdp.GetMiscState()); - state->m_rdp.GetFramebuffer()->SetProcessor(&state->m_rdp); + state->m_rdp.Blender.SetMachine(machine); + state->m_rdp.Blender.SetProcessor(&state->m_rdp); - state->m_rdp.GetTexPipe()->SetMachine(machine); + state->m_rdp.Framebuffer.SetProcessor(&state->m_rdp); + + state->m_rdp.TexPipe.SetMachine(machine); if (LOG_RDP_EXECUTION) { rdp_exec = fopen("rdp_execute.txt", "wt"); } + + printf("A"); + for (int i = 0; i < 4096; i++) + { + state->m_rdp.Spans[i].SetMachine(machine); + } + printf("B"); } -SCREEN_UPDATE(n64) +SCREEN_UPDATE_RGB32(n64) { - _n64_state *state = screen->machine().driver_data<_n64_state>(); + _n64_state *state = screen.machine().driver_data<_n64_state>(); + n64_periphs *n64 = screen.machine().device("rcp"); - int height = state->m_rdp.GetMiscState()->m_fb_height; - //UINT16 *frame_buffer = (UINT16*)&rdram[(n64_vi_origin & 0xffffff) >> 2]; - //UINT8 *cvg_buffer = &state->m_rdp.GetHiddenBits()[((n64_vi_origin & 0xffffff) >> 2) >> 1]; - //int vibuffering = ((n64_vi_control & 2) && fsaa && divot); + int height = state->m_rdp.MiscState.FBHeight; + //UINT16 *frame_buffer = (UINT16*)&rdram[(n64->vi_origin & 0xffffff) >> 2]; + //UINT8 *cvg_buffer = &state->m_rdp.HiddenBits[((n64->vi_origin & 0xffffff) >> 2) >> 1]; + //int vibuffering = ((n64->vi_control & 2) && fsaa && divot); //vibuffering = 0; // Disabled for now /* - if (vibuffering && ((n64_vi_control & 3) == 2)) + if (vibuffering && ((n64->vi_control & 3) == 2)) { if (frame_buffer) { @@ -3292,7 +3315,7 @@ curpixel_cvg = ((pix & 1) << 2) | (cvg_buffer[pixels ^ BYTE_ADDR_XOR] & 3); // Reuse of this variable if (curpixel_cvg < 7 && i > 1 && j > 1 && i < (hres - 2) && j < (vres - 2) && fsaa) { - newc = video_filter16(&frame_buffer[pixels ^ WORD_ADDR_XOR], &cvg_buffer[pixels ^ BYTE_ADDR_XOR], n64_vi_width); + newc = video_filter16(&frame_buffer[pixels ^ WORD_ADDR_XOR], &cvg_buffer[pixels ^ BYTE_ADDR_XOR], n64->vi_width); ViBuffer[i][j] = newc; } else @@ -3310,12 +3333,12 @@ } */ - if (n64_vi_blank) + if (n64->vi_blank) { for (int j = 0; j m_rdp.GetMiscState()->m_fb_width; i++) + UINT32 *d = &bitmap.pix32(j); + for (int i = 0; i < state->m_rdp.MiscState.FBWidth; i++) { d[BYTE_XOR_BE(i)] = 0; } @@ -3323,7 +3346,7 @@ return 0; } - state->m_rdp.VideoUpdate(bitmap); + state->m_rdp.VideoUpdate(n64, bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/n64.h mame-0.145/src/mame/video/n64.h --- mame-0.144/src/mame/video/n64.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/n64.h 2012-02-06 21:30:31.000000000 +0000 @@ -49,9 +49,9 @@ #endif #define DWORD_XOR_DWORD_SWAP 1 -#define GET_LOW_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 1) & 0x1f]) -#define GET_MED_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 6) & 0x1f]) -#define GET_HI_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA()[((x) >> 11) & 0x1f]) +#define GET_LOW_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 1) & 0x1f]) +#define GET_MED_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 6) & 0x1f]) +#define GET_HI_RGBA16_TMEM(x) (m_rdp->ReplicatedRGBA[((x) >> 11) & 0x1f]) #define MEM8_LIMIT 0x7fffff #define MEM16_LIMIT 0x3fffff @@ -69,8 +69,8 @@ #define GETMEDCOL(x) (((x) & 0x7c0) >> 3) #define GETHICOL(x) (((x) & 0xf800) >> 8) -#define HREADADDR8(in) (((in) <= MEM8_LIMIT) ? (m_rdp->GetHiddenBits()[(in) ^ BYTE_ADDR_XOR]) : 0) -#define HWRITEADDR8(in, val) {if ((in) <= MEM8_LIMIT) m_rdp->GetHiddenBits()[(in) ^ BYTE_ADDR_XOR] = val;} +#define HREADADDR8(in) (((in) <= MEM8_LIMIT) ? (m_rdp->HiddenBits[(in) ^ BYTE_ADDR_XOR]) : 0) +#define HWRITEADDR8(in, val) {if ((in) <= MEM8_LIMIT) m_rdp->HiddenBits[(in) ^ BYTE_ADDR_XOR] = val;} //sign-extension macros #define SIGN22(x) (((x) & 0x200000) ? ((x) | ~0x3fffff) : ((x) & 0x3fffff)) @@ -85,6 +85,8 @@ /*****************************************************************************/ +class n64_periphs; + namespace N64 { @@ -92,8 +94,8 @@ { class Processor; -class MiscState; -class OtherModes; +class MiscStateT; +class OtherModesT; class Color { @@ -136,48 +138,48 @@ int num; }; -class MiscState +class MiscStateT { public: - MiscState() + MiscStateT() { - m_curpixel_cvg = 0; - m_curpixel_memcvg = 0; - m_curpixel_cvbit = 0; - m_curpixel_overlap = 0; + CurrentPixCvg = 0; + CurrentMemCvg = 0; + CurrentCvgBit = 0; + CurrentPixOverlap = 0; - m_max_level = 0; - m_min_level = 0; + MaxLevel = 0; + MinLevel = 0; } - int m_fb_format; - int m_fb_size; - int m_fb_width; - int m_fb_height; - UINT32 m_fb_address; - - UINT32 m_zb_address; - - int m_ti_format; - int m_ti_size; - int m_ti_width; - UINT32 m_ti_address; - - UINT32 m_curpixel_cvg; - UINT32 m_curpixel_memcvg; - UINT32 m_curpixel_cvbit; - UINT32 m_curpixel_overlap; - - UINT8 m_random_seed; + int FBFormat; // Framebuffer pixel format index (0 - I, 1 - IA, 2 - CI, 3 - RGBA) + int FBSize; // Framebuffer pixel size index (0 - 4bpp, 1 - 8bpp, 2 - 16bpp, 3 - 32bpp) + int FBWidth; // Framebuffer width, in pixels + int FBHeight; // Framebuffer height, in scanlines + UINT32 FBAddress; // Framebuffer source address offset (in bytes) from start of RDRAM + + UINT32 ZBAddress; // Z-buffer source address offset (in bytes) from start of RDRAM + + int TIFormat; // Format for Texture Interface (TI) transfers + int TISize; // Size (in bytes) of TI transfers + int TIWidth; // Width (in pixels) of TI transfers + UINT32 TIAddress; // Destination address for TI transfers + + UINT32 CurrentPixCvg; // Coverage for the current pixel + UINT32 CurrentMemCvg; // Incoming coverage, in memory, for the current pixel + UINT32 CurrentCvgBit; // Bitfield representation of current coverage value + UINT32 CurrentPixOverlap; // Current overlap value, in coverage indices, for the current pixel + + UINT8 RandomSeed; // %HACK%, adds 19 each time it's read and is more or less random - int m_special_bsel0; - int m_special_bsel1; + int SpecialBlendSelect0; // Special blend-mode select for cycle 0 + int SpecialBlendSelect1; // Special blend-mode select for cycle 1 - UINT32 m_max_level; - UINT32 m_min_level; + UINT32 MaxLevel; // Maximum LOD level for texture filtering + UINT32 MinLevel; // Minimum LOD level for texture filtering - UINT16 m_primitive_z; - UINT16 m_primitive_delta_z; + UINT16 PrimitiveZ; // Forced Z value for current primitive, if applicable + UINT16 PrimitiveDZ; // Forced Delta-Z value for current primitive, if applicable }; class CombineModes @@ -202,7 +204,7 @@ int add_a1; }; -class OtherModes +class OtherModesT { public: int cycle_type; @@ -244,7 +246,7 @@ bool alpha_compare_en; }; -class ColorInputs +class ColorInputsT { public: // combiner inputs @@ -303,35 +305,35 @@ m_tiles[i].num = i; } - m_one_color.c = 0xffffffff; - m_zero_color.c = 0x00000000; + OneColor.c = 0xffffffff; + ZeroColor.c = 0x00000000; - m_color_inputs.combiner_rgbsub_a_r[0] = m_color_inputs.combiner_rgbsub_a_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbsub_a_g[0] = m_color_inputs.combiner_rgbsub_a_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbsub_a_b[0] = m_color_inputs.combiner_rgbsub_a_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbsub_b_r[0] = m_color_inputs.combiner_rgbsub_b_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbsub_b_g[0] = m_color_inputs.combiner_rgbsub_b_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbsub_b_b[0] = m_color_inputs.combiner_rgbsub_b_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbmul_r[0] = m_color_inputs.combiner_rgbmul_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbmul_g[0] = m_color_inputs.combiner_rgbmul_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbmul_b[0] = m_color_inputs.combiner_rgbmul_b[1] = &m_one_color.i.b; - m_color_inputs.combiner_rgbadd_r[0] = m_color_inputs.combiner_rgbadd_r[1] = &m_one_color.i.r; - m_color_inputs.combiner_rgbadd_g[0] = m_color_inputs.combiner_rgbadd_g[1] = &m_one_color.i.g; - m_color_inputs.combiner_rgbadd_b[0] = m_color_inputs.combiner_rgbadd_b[1] = &m_one_color.i.b; - - m_color_inputs.combiner_alphasub_a[0] = m_color_inputs.combiner_alphasub_a[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphasub_b[0] = m_color_inputs.combiner_alphasub_b[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphamul[0] = m_color_inputs.combiner_alphamul[1] = &m_one_color.i.a; - m_color_inputs.combiner_alphaadd[0] = m_color_inputs.combiner_alphaadd[1] = &m_one_color.i.a; - - m_color_inputs.blender1a_r[0] = m_color_inputs.blender1a_r[1] = &m_pixel_color.i.r; - m_color_inputs.blender1a_g[0] = m_color_inputs.blender1a_g[1] = &m_pixel_color.i.r; - m_color_inputs.blender1a_b[0] = m_color_inputs.blender1a_b[1] = &m_pixel_color.i.r; - m_color_inputs.blender1b_a[0] = m_color_inputs.blender1b_a[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_r[0] = m_color_inputs.blender2a_r[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_g[0] = m_color_inputs.blender2a_g[1] = &m_pixel_color.i.r; - m_color_inputs.blender2a_b[0] = m_color_inputs.blender2a_b[1] = &m_pixel_color.i.r; - m_color_inputs.blender2b_a[0] = m_color_inputs.blender2b_a[1] = &m_pixel_color.i.r; + ColorInputs.combiner_rgbsub_a_r[0] = ColorInputs.combiner_rgbsub_a_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbsub_a_g[0] = ColorInputs.combiner_rgbsub_a_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbsub_a_b[0] = ColorInputs.combiner_rgbsub_a_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbsub_b_r[0] = ColorInputs.combiner_rgbsub_b_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbsub_b_g[0] = ColorInputs.combiner_rgbsub_b_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbsub_b_b[0] = ColorInputs.combiner_rgbsub_b_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbmul_r[0] = ColorInputs.combiner_rgbmul_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbmul_g[0] = ColorInputs.combiner_rgbmul_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbmul_b[0] = ColorInputs.combiner_rgbmul_b[1] = &OneColor.i.b; + ColorInputs.combiner_rgbadd_r[0] = ColorInputs.combiner_rgbadd_r[1] = &OneColor.i.r; + ColorInputs.combiner_rgbadd_g[0] = ColorInputs.combiner_rgbadd_g[1] = &OneColor.i.g; + ColorInputs.combiner_rgbadd_b[0] = ColorInputs.combiner_rgbadd_b[1] = &OneColor.i.b; + + ColorInputs.combiner_alphasub_a[0] = ColorInputs.combiner_alphasub_a[1] = &OneColor.i.a; + ColorInputs.combiner_alphasub_b[0] = ColorInputs.combiner_alphasub_b[1] = &OneColor.i.a; + ColorInputs.combiner_alphamul[0] = ColorInputs.combiner_alphamul[1] = &OneColor.i.a; + ColorInputs.combiner_alphaadd[0] = ColorInputs.combiner_alphaadd[1] = &OneColor.i.a; + + ColorInputs.blender1a_r[0] = ColorInputs.blender1a_r[1] = &PixelColor.i.r; + ColorInputs.blender1a_g[0] = ColorInputs.blender1a_g[1] = &PixelColor.i.r; + ColorInputs.blender1a_b[0] = ColorInputs.blender1a_b[1] = &PixelColor.i.r; + ColorInputs.blender1b_a[0] = ColorInputs.blender1b_a[1] = &PixelColor.i.r; + ColorInputs.blender2a_r[0] = ColorInputs.blender2a_r[1] = &PixelColor.i.r; + ColorInputs.blender2a_g[0] = ColorInputs.blender2a_g[1] = &PixelColor.i.r; + ColorInputs.blender2a_b[0] = ColorInputs.blender2a_b[1] = &PixelColor.i.r; + ColorInputs.blender2b_a[0] = ColorInputs.blender2b_a[1] = &PixelColor.i.r; m_tmem = NULL; @@ -339,8 +341,8 @@ //memset(m_hidden_bits, 3, 8388608); - m_prim_lod_frac = 0; - m_lod_frac = 0; + PrimLODFraction = 0; + LODFraction = 0; for (int i = 0; i < 256; i++) { @@ -384,14 +386,12 @@ for(int i = 0; i < 32; i++) { - m_replicated_rgba[i] = (i << 3) | ((i >> 2) & 7); + ReplicatedRGBA[i] = (i << 3) | ((i >> 2) & 7); } } ~Processor() { } - UINT8* ReplicatedRGBA() { return m_replicated_rgba; } - void Dasm(char *buffer); void ProcessList(); @@ -452,71 +452,8 @@ void SetStatusReg(UINT32 val) { m_status = val; } UINT32 GetStatusReg() const { return m_status; } - // Functional blocks - Blender* GetBlender() { return &m_blender; } - Framebuffer* GetFramebuffer() { return &m_framebuffer; } - TexturePipe* GetTexPipe() { return &m_tex_pipe; } - // Internal state - OtherModes* GetOtherModes() { return &m_other_modes; } - ColorInputs* GetColorInputs() { return &m_color_inputs; } CombineModes* GetCombine() { return &m_combine; } - MiscState* GetMiscState() { return &m_misc_state; } - - // Color constants - Color* GetBlendColor() { return &m_blend_color; } - void SetBlendColor(UINT32 color) { m_blend_color.c = color; } - - Color* GetPixelColor() { return &m_pixel_color; } - void SetPixelColor(UINT32 color) { m_pixel_color.c = color; } - - Color* GetInvPixelColor() { return &m_inv_pixel_color; } - void SetInvPixelColor(UINT32 color) { m_inv_pixel_color.c = color; } - - Color* GetBlendedColor() { return &m_blended_pixel_color; } - void SetBlendedColor(UINT32 color) { m_blended_pixel_color.c = color; } - - Color* GetMemoryColor() { return &m_memory_color; } - void SetMemoryColor(UINT32 color) { m_memory_color.c = color; } - - Color* GetPrimColor() { return &m_prim_color; } - void SetPrimColor(UINT32 color) { m_prim_color.c = color; } - - Color* GetEnvColor() { return &m_env_color; } - void SetEnvColor(UINT32 color) { m_env_color.c = color; } - - Color* GetFogColor() { return &m_fog_color; } - void SetFogColor(UINT32 color) { m_fog_color.c = color; } - - Color* GetCombinedColor() { return &m_combined_color; } - void SetCombinedColor(UINT32 color) { m_combined_color.c = color; } - - Color* GetTexel0Color() { return &m_texel0_color; } - void SetTexel0Color(UINT32 color) { m_texel0_color.c = color; } - - Color* GetTexel1Color() { return &m_texel1_color; } - void SetTexel1Color(UINT32 color) { m_texel1_color.c = color; } - - Color* GetNextTexelColor() { return &m_next_texel_color; } - void SetNextTexelColor(UINT32 color) { m_next_texel_color.c = color; } - - Color* GetShadeColor() { return &m_shade_color; } - void SetShadeColor(UINT32 color) { m_shade_color.c = color; } - - Color* GetKeyScale() { return &m_key_scale; } - void SetKeyScale(UINT32 scale) { m_key_scale.c = scale; } - - Color* GetNoiseColor() { return &m_noise_color; } - void SetNoiseColor(UINT32 color) { m_noise_color.c = color; } - - Color* GetOne() { return &m_one_color; } - Color* GetZero() { return &m_zero_color; } - - UINT8 GetLODFrac() { return m_lod_frac; } - void SetLODFrac(UINT8 lod_frac) { m_lod_frac = lod_frac; } - - UINT8 GetPrimLODFrac() { return m_prim_lod_frac; } - void SetPrimLODFrac(UINT8 prim_lod_frac) { m_prim_lod_frac = prim_lod_frac; } // Color Combiner INT32 ColorCombinerEquation(INT32 a, INT32 b, INT32 c, INT32 d); @@ -538,7 +475,7 @@ Tile* GetTiles(){ return m_tiles; } // Emulation Accelerators - UINT8 GetRandom() { return m_misc_state.m_random_seed += 0x13; } + UINT8 GetRandom() { return MiscState.RandomSeed += 0x13; } // YUV Factors void SetYUVFactors(INT32 k0, INT32 k1, INT32 k2, INT32 k3, INT32 k4, INT32 k5) { m_k0 = k0; m_k1 = k1; m_k2 = k2; m_k3 = k3; m_k4 = k4; m_k5 = k5; } @@ -558,13 +495,10 @@ void TCDivNoPersp(INT32 ss, INT32 st, INT32 sw, INT32* sss, INT32* sst); UINT32 GetLog2(UINT32 lod_clamp); void RenderSpans(int start, int end, int tilenum, bool flip); - UINT8* GetHiddenBits() { return m_hidden_bits; } void GetAlphaCvg(UINT8 *comb_alpha); const UINT8* GetBayerMatrix() const { return s_bayer_matrix; } const UINT8* GetMagicMatrix() const { return s_magic_matrix; } - Span* GetSpans() { return m_span; } int GetCurrFIFOIndex() const { return m_cmd_cur; } - UINT32 GetFillColor32() const { return m_fill_color; } void ZStore(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 z); UINT32 ZDecompress(UINT32 zcurpixel); @@ -574,7 +508,7 @@ bool ZCompare(UINT32 zcurpixel, UINT32 dzcurpixel, UINT32 sz, UINT16 dzpix); // Fullscreen update-related - void VideoUpdate(bitmap_t *bitmap); + void VideoUpdate(n64_periphs *n64, bitmap_rgb32 &bitmap); // Commands void CmdInvalid(UINT32 w1, UINT32 w2); @@ -646,39 +580,50 @@ UINT16 decompress_cvmask_frombyte(UINT8 x); void lookup_cvmask_derivatives(UINT32 mask, UINT8* offx, UINT8* offy); - protected: - Blender m_blender; - Framebuffer m_framebuffer; - TexturePipe m_tex_pipe; - - OtherModes m_other_modes; - MiscState m_misc_state; - ColorInputs m_color_inputs; - CombineModes m_combine; + MiscStateT MiscState; + + // Color constants + Color MemoryColor; + Color PixelColor; + Color InvPixelColor; + Color BlendedPixelColor; + Color BlendColor; + + Color PrimColor; + Color EnvColor; + Color FogColor; + Color CombinedColor; + Color Texel0Color; + Color Texel1Color; + Color NextTexelColor; + Color ShadeColor; + Color KeyScale; + Color NoiseColor; + + Color OneColor; + Color ZeroColor; + + UINT8 LODFraction; + UINT8 PrimLODFraction; + + UINT32 FillColor; - Color m_pixel_color; - Color m_inv_pixel_color; - Color m_blended_pixel_color; - Color m_memory_color; - Color m_blend_color; - - Color m_prim_color; - Color m_env_color; - Color m_fog_color; - Color m_combined_color; - Color m_texel0_color; - Color m_texel1_color; - Color m_next_texel_color; - Color m_shade_color; - Color m_key_scale; - Color m_noise_color; - UINT8 m_lod_frac; - UINT8 m_prim_lod_frac; + OtherModesT OtherModes; + ColorInputsT ColorInputs; - Color m_one_color; - Color m_zero_color; + BlenderT Blender; - UINT32 m_fill_color; + Span Spans[4096]; + + FramebufferT Framebuffer; + TexturePipeT TexPipe; + + UINT8 HiddenBits[0x800000]; + + UINT8 ReplicatedRGBA[32]; + + protected: + CombineModes m_combine; typedef struct { @@ -725,10 +670,6 @@ INT32 m_norm_point_rom[64]; INT32 m_norm_slope_rom[64]; - UINT8 m_hidden_bits[0x800000]; - - Span m_span[4096]; - static const UINT8 s_bayer_matrix[16]; static const UINT8 s_magic_matrix[16]; @@ -737,8 +678,6 @@ UINT32 m_special_9bit_clamptable[512]; - UINT8 m_replicated_rgba[32]; - INT32 m_dzpix_enc; INT32 m_dz_enc; @@ -754,8 +693,8 @@ static const ZDecompressEntry z_dec_table[8]; // Internal screen-update functions - void VideoUpdate16(bitmap_t *bitmap); - void VideoUpdate32(bitmap_t *bitmap); + void VideoUpdate16(n64_periphs *n64, bitmap_rgb32 &bitmap); + void VideoUpdate32(n64_periphs *n64, bitmap_rgb32 &bitmap); typedef void (*Command)(UINT32 w1, UINT32 w2); diff -Nru mame-0.144/src/mame/video/n8080.c mame-0.145/src/mame/video/n8080.c --- mame-0.144/src/mame/video/n8080.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/n8080.c 2012-02-06 21:30:32.000000000 +0000 @@ -139,20 +139,20 @@ } -SCREEN_UPDATE( spacefev ) +SCREEN_UPDATE_IND16( spacefev ) { - n8080_state *state = screen->machine().driver_data(); - UINT8 mask = flip_screen_get(screen->machine()) ? 0xff : 0x00; + n8080_state *state = screen.machine().driver_data(); + UINT8 mask = flip_screen_get(screen.machine()) ? 0xff : 0x00; int x; int y; const UINT8* pRAM = state->m_videoram; - const UINT8* pPROM = screen->machine().region("proms")->base(); + const UINT8* pPROM = screen.machine().region("proms")->base(); for (y = 0; y < 256; y++) { - UINT16* pLine = BITMAP_ADDR16(bitmap, y ^ mask, 0); + UINT16* pLine = &bitmap.pix16(y ^ mask); for (x = 0; x < 256; x += 8) { @@ -183,7 +183,7 @@ 6, /* cyan */ }; - int cycle = screen->frame_number() / 32; + int cycle = screen.frame_number() / 32; color = ufo_color[cycle % 6]; } @@ -209,12 +209,12 @@ } -SCREEN_UPDATE( sheriff ) +SCREEN_UPDATE_IND16( sheriff ) { - n8080_state *state = screen->machine().driver_data(); - UINT8 mask = flip_screen_get(screen->machine()) ? 0xff : 0x00; + n8080_state *state = screen.machine().driver_data(); + UINT8 mask = flip_screen_get(screen.machine()) ? 0xff : 0x00; - const UINT8* pPROM = screen->machine().region("proms")->base(); + const UINT8* pPROM = screen.machine().region("proms")->base(); int x; int y; @@ -223,7 +223,7 @@ for (y = 0; y < 256; y++) { - UINT16* pLine = BITMAP_ADDR16(bitmap, y ^ mask, 0); + UINT16* pLine = &bitmap.pix16(y ^ mask); for (x = 0; x < 256; x += 8) { @@ -252,11 +252,11 @@ } -SCREEN_UPDATE( helifire ) +SCREEN_UPDATE_IND16( helifire ) { - n8080_state *state = screen->machine().driver_data(); - int SUN_BRIGHTNESS = input_port_read(screen->machine(), "POT0"); - int SEA_BRIGHTNESS = input_port_read(screen->machine(), "POT1"); + n8080_state *state = screen.machine().driver_data(); + int SUN_BRIGHTNESS = input_port_read(screen.machine(), "POT0"); + int SEA_BRIGHTNESS = input_port_read(screen.machine(), "POT1"); static const int wave[8] = { 0, 1, 2, 2, 2, 1, 0, 0 }; @@ -268,7 +268,7 @@ for (y = 0; y < 256; y++) { - UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); + UINT16* pLine = &bitmap.pix16(y); int level = 120 + wave[state->m_helifire_mv & 7]; @@ -324,7 +324,7 @@ for (n = 0; n < 8; n++) { - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { if ((state->m_videoram[offset ^ 0x1fff] << n) & 0x80) { @@ -343,7 +343,7 @@ /* next line */ - helifire_next_line(screen->machine()); + helifire_next_line(screen.machine()); } state->m_helifire_mv = saved_mv; @@ -352,40 +352,44 @@ } -SCREEN_EOF( helifire ) +SCREEN_VBLANK( helifire ) { - n8080_state *state = machine.driver_data(); - int n = (machine.primary_screen->frame_number() >> 1) % sizeof state->m_helifire_LSFR; - - int i; - - for (i = 0; i < 8; i++) + // falling edge + if (!vblank_on) { - int R = (i & 1); - int G = (i & 2); - int B = (i & 4); + n8080_state *state = screen.machine().driver_data(); + int n = (screen.machine().primary_screen->frame_number() >> 1) % sizeof state->m_helifire_LSFR; - if (state->m_helifire_flash) + int i; + + for (i = 0; i < 8; i++) { - if (state->m_helifire_LSFR[n] & 0x20) - { - G |= B; - } + int R = (i & 1); + int G = (i & 2); + int B = (i & 4); - if (machine.primary_screen->frame_number() & 0x04) + if (state->m_helifire_flash) { - R |= G; + if (state->m_helifire_LSFR[n] & 0x20) + { + G |= B; + } + + if (screen.machine().primary_screen->frame_number() & 0x04) + { + R |= G; + } } - } - palette_set_color_rgb(machine,i, - R ? 255 : 0, - G ? 255 : 0, - B ? 255 : 0); - } + palette_set_color_rgb(screen.machine(),i, + R ? 255 : 0, + G ? 255 : 0, + B ? 255 : 0); + } - for (i = 0; i < 256; i++) - { - helifire_next_line(machine); + for (i = 0; i < 256; i++) + { + helifire_next_line(screen.machine()); + } } } diff -Nru mame-0.144/src/mame/video/namcofl.c mame-0.145/src/mame/video/namcofl.c --- mame-0.144/src/mame/video/namcofl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/namcofl.c 2012-02-06 21:30:33.000000000 +0000 @@ -80,20 +80,20 @@ } -SCREEN_UPDATE( namcofl ) +SCREEN_UPDATE_IND16( namcofl ) { int pri; - namcofl_install_palette(screen->machine()); + namcofl_install_palette(screen.machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); for( pri=0; pri<16; pri++ ) { namco_roz_draw( bitmap,cliprect,pri ); if((pri&1)==0) namco_tilemap_draw( bitmap, cliprect, pri>>1 ); - namco_obj_draw(screen->machine(), bitmap, cliprect, pri ); + namco_obj_draw(screen.machine(), bitmap, cliprect, pri ); } return 0; diff -Nru mame-0.144/src/mame/video/namcona1.c mame-0.145/src/mame/video/namcona1.c --- mame-0.144/src/mame/video/namcona1.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/namcona1.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,7 +12,7 @@ static void tilemap_get_info( running_machine &machine, - tile_data *tileinfo, + tile_data &tileinfo, int tile_index, const UINT16 *tilemap_videoram, int tilemap_color, @@ -44,7 +44,7 @@ { SET_TILE_INFO( gfx,tile,tilemap_color,0 ); if (ENDIANNESS_NATIVE == ENDIANNESS_BIG) - tileinfo->mask_data = (UINT8 *)(state->m_shaperam+4*tile); + tileinfo.mask_data = (UINT8 *)(state->m_shaperam+4*tile); else { UINT8 *mask_data = state->m_mask_data; @@ -57,7 +57,7 @@ mask_data[5] = source[2]&0xff; mask_data[6] = source[3]>>8; mask_data[7] = source[3]&0xff; - tileinfo->mask_data = mask_data; + tileinfo.mask_data = mask_data; } } } /* tilemap_get_info */ @@ -130,7 +130,7 @@ mask_data = conv_data; } SET_TILE_INFO( gfx,tile,tilemap_color,0 ); - tileinfo->mask_data = mask_data; + tileinfo.mask_data = mask_data; } } /* roz_get_info */ @@ -143,11 +143,11 @@ COMBINE_DATA( &videoram[offset] ); if( offset<0x8000/2 ) { - tilemap_mark_tile_dirty( state->m_bg_tilemap[offset/0x1000], offset&0xfff ); + state->m_bg_tilemap[offset/0x1000]->mark_tile_dirty(offset&0xfff ); } else if( offset<0xa000/2 ) { - tilemap_mark_all_tiles_dirty( state->m_roz_tilemap ); + state->m_roz_tilemap ->mark_all_dirty(); } } /* namcona1_videoram_w */ @@ -311,8 +311,8 @@ /*************************************************************************/ static void pdraw_tile(running_machine &machine, - bitmap_t *dest_bmp, - const rectangle *clip, + bitmap_ind16 &dest_bmp, + const rectangle &clip, UINT32 code, int color, int sx, int sy, @@ -364,31 +364,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -399,8 +396,8 @@ { const UINT8 *source = source_base + (y_index>>16) * gfx->line_modulo; const UINT8 *mask_addr = mask_base + (y_index>>16) * mask->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int x, x_index = x_index_base; for( x=sx; x(); int which; @@ -553,7 +550,7 @@ } /* next x */ } /* draw_pixel_line */ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int which, int primask ) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int primask ) { namcona1_state *state = machine.driver_data(); UINT16 *videoram = state->m_videoram; @@ -576,8 +573,8 @@ paldata = &machine.pens[pGfx->color_base + pGfx->color_granularity * state->m_tilemap_palette_bank[which]]; /* draw one scanline at a time */ - clip.min_x = cliprect->min_x; - clip.max_x = cliprect->max_x; + clip.min_x = cliprect.min_x; + clip.max_x = cliprect.max_x; scrollx = 0; scrolly = 0; for( line=0; line<256; line++ ) @@ -597,7 +594,7 @@ scrolly = (ydata - line)&0x1ff; } - if (line >= cliprect->min_y && line <= cliprect->max_y) + if (line >= cliprect.min_y && line <= cliprect.max_y) { if( xdata == 0xc001 ) { @@ -605,8 +602,8 @@ * feature, Numan Athletics. */ draw_pixel_line( - BITMAP_ADDR16(bitmap, line, 0), - BITMAP_ADDR8(machine.priority_bitmap, line, 0), + &bitmap.pix16(line), + &machine.priority_bitmap.pix8(line), videoram + ydata + 25, paldata ); } @@ -624,23 +621,23 @@ int dy = -8; /* vertical adjust */ UINT32 startx = (xoffset<<12)+incxx*dx+incyx*dy; UINT32 starty = (yoffset<<12)+incxy*dx+incyy*dy; - tilemap_draw_roz_primask(bitmap, &clip, state->m_roz_tilemap, + state->m_roz_tilemap->draw_roz(bitmap, clip, startx, starty, incxx, incxy, incyx, incyy, 0, 0, primask, 0); } else { - tilemap_set_scrollx( state->m_bg_tilemap[which], 0, scrollx ); - tilemap_set_scrolly( state->m_bg_tilemap[which], 0, scrolly ); - tilemap_draw_primask( bitmap, &clip, state->m_bg_tilemap[which], 0, primask, 0 ); + state->m_bg_tilemap[which]->set_scrollx(0, scrollx ); + state->m_bg_tilemap[which]->set_scrolly(0, scrolly ); + state->m_bg_tilemap[which]->draw(bitmap, clip, 0, primask, 0 ); } } } } } /* draw_background */ -SCREEN_UPDATE( namcona1 ) +SCREEN_UPDATE_IND16( namcona1 ) { - namcona1_state *state = screen->machine().driver_data(); + namcona1_state *state = screen.machine().driver_data(); int which; int priority; @@ -653,17 +650,17 @@ /* palette updates are delayed when graphics are disabled */ for( which=0; which<0x1000; which++ ) { - UpdatePalette(screen->machine(), which ); + UpdatePalette(screen.machine(), which ); } state->m_palette_is_dirty = 0; } - UpdateGfx(screen->machine()); + UpdateGfx(screen.machine()); for( which=0; whichm_vreg[0xb0/2+(which&3)]&0xf; if( tilemap_color!=state->m_tilemap_palette_bank[which] ) { - tilemap_mark_all_tiles_dirty( state->m_bg_tilemap[which] ); + state->m_bg_tilemap[which] ->mark_all_dirty(); state->m_tilemap_palette_bank[which] = tilemap_color; } } /* next tilemap */ @@ -672,14 +669,14 @@ int color = state->m_vreg[0xba/2]&0xf; if( color != state->m_roz_palette ) { - tilemap_mark_all_tiles_dirty( state->m_roz_tilemap ); + state->m_roz_tilemap ->mark_all_dirty(); state->m_roz_palette = color; } } - bitmap_fill( screen->machine().priority_bitmap,cliprect ,0); + screen.machine().priority_bitmap.fill(0, cliprect ); - bitmap_fill( bitmap, cliprect , 0xff); /* background color? */ + bitmap.fill(0xff, cliprect ); /* background color? */ for( priority = 0; priority<8; priority++ ) { @@ -696,12 +693,12 @@ } if( pri == priority ) { - draw_background(screen->machine(),bitmap,cliprect,which,priority); + draw_background(screen.machine(),bitmap,cliprect,which,priority); } } /* next tilemap */ } /* next priority level */ - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); } /* gfx enabled */ return 0; } diff -Nru mame-0.144/src/mame/video/namconb1.c mame-0.145/src/mame/video/namconb1.c --- mame-0.144/src/mame/video/namconb1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/namconb1.c 2012-02-06 21:30:31.000000000 +0000 @@ -102,7 +102,7 @@ } /* namconb1_install_palette */ static void -video_update_common(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bROZ ) +video_update_common(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bROZ ) { int pri; namconb1_install_palette(machine); @@ -131,26 +131,23 @@ /************************************************************************************************/ -SCREEN_UPDATE( namconb1 ) +SCREEN_UPDATE_IND16( namconb1 ) { /* compute window for custom screen blanking */ rectangle clip; //004a 016a 0021 0101 0144 0020 (nebulas ray) - UINT32 xclip = screen->machine().generic.paletteram.u32[0x1800/4]; - UINT32 yclip = screen->machine().generic.paletteram.u32[0x1804/4]; + UINT32 xclip = screen.machine().generic.paletteram.u32[0x1800/4]; + UINT32 yclip = screen.machine().generic.paletteram.u32[0x1804/4]; clip.min_x = (xclip>>16) - 0x4a; clip.max_x = (xclip&0xffff) - 0x4a - 1; clip.min_y = (yclip>>16) - 0x21; clip.max_y = (yclip&0xffff) - 0x21 - 1; /* intersect with master clip rectangle */ - if( clip.min_x < cliprect->min_x ){ clip.min_x = cliprect->min_x; } - if( clip.min_y < cliprect->min_y ){ clip.min_y = cliprect->min_y; } - if( clip.max_x > cliprect->max_x ){ clip.max_x = cliprect->max_x; } - if( clip.max_y > cliprect->max_y ){ clip.max_y = cliprect->max_y; } + clip &= cliprect; - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); - video_update_common( screen->machine(), bitmap, &clip, 0 ); + video_update_common( screen.machine(), bitmap, clip, 0 ); return 0; } @@ -171,32 +168,29 @@ /****************************************************************************************************/ -SCREEN_UPDATE( namconb2 ) +SCREEN_UPDATE_IND16( namconb2 ) { - namconb1_state *state = screen->machine().driver_data(); + namconb1_state *state = screen.machine().driver_data(); /* compute window for custom screen blanking */ rectangle clip; //004a016a 00210101 01440020 - UINT32 xclip = screen->machine().generic.paletteram.u32[0x1800/4]; - UINT32 yclip = screen->machine().generic.paletteram.u32[0x1804/4]; + UINT32 xclip = screen.machine().generic.paletteram.u32[0x1800/4]; + UINT32 yclip = screen.machine().generic.paletteram.u32[0x1804/4]; clip.min_x = (xclip>>16) - 0x4b; clip.max_x = (xclip&0xffff) - 0x4b - 1; clip.min_y = (yclip>>16) - 0x21; clip.max_y = (yclip&0xffff) - 0x21 - 1; /* intersect with master clip rectangle */ - if( clip.min_x < cliprect->min_x ){ clip.min_x = cliprect->min_x; } - if( clip.min_y < cliprect->min_y ){ clip.min_y = cliprect->min_y; } - if( clip.max_x > cliprect->max_x ){ clip.max_x = cliprect->max_x; } - if( clip.max_y > cliprect->max_y ){ clip.max_y = cliprect->max_y; } + clip &= cliprect; - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); if( memcmp(state->m_tilemap_tile_bank,state->m_tilebank32,sizeof(state->m_tilemap_tile_bank))!=0 ) { namco_tilemap_invalidate(); memcpy(state->m_tilemap_tile_bank,state->m_tilebank32,sizeof(state->m_tilemap_tile_bank)); } - video_update_common( screen->machine(), bitmap, &clip, 1 ); + video_update_common( screen.machine(), bitmap, clip, 1 ); return 0; } diff -Nru mame-0.144/src/mame/video/namcos1.c mame-0.145/src/mame/video/namcos1.c --- mame-0.144/src/mame/video/namcos1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/namcos1.c 2012-02-06 21:30:33.000000000 +0000 @@ -50,7 +50,7 @@ ***************************************************************************/ -INLINE void bg_get_info(running_machine &machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram) +INLINE void bg_get_info(running_machine &machine,tile_data &tileinfo,int tile_index,UINT8 *info_vram) { namcos1_state *state = machine.driver_data(); int code; @@ -58,10 +58,10 @@ tile_index <<= 1; code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8); SET_TILE_INFO(0,code,0,0); - tileinfo->mask_data = &state->m_tilemap_maskdata[code << 3]; + tileinfo.mask_data = &state->m_tilemap_maskdata[code << 3]; } -INLINE void fg_get_info(running_machine &machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram) +INLINE void fg_get_info(running_machine &machine,tile_data &tileinfo,int tile_index,UINT8 *info_vram) { namcos1_state *state = machine.driver_data(); int code; @@ -69,7 +69,7 @@ tile_index <<= 1; code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8); SET_TILE_INFO(0,code,0,0); - tileinfo->mask_data = &state->m_tilemap_maskdata[code << 3]; + tileinfo.mask_data = &state->m_tilemap_maskdata[code << 3]; } static TILE_GET_INFO( bg_get_info0 ) @@ -135,10 +135,10 @@ state->m_bg_tilemap[4] = tilemap_create(machine, fg_get_info4,tilemap_scan_rows,8,8,36,28); state->m_bg_tilemap[5] = tilemap_create(machine, fg_get_info5,tilemap_scan_rows,8,8,36,28); - tilemap_set_scrolldx(state->m_bg_tilemap[4],73,512-73); - tilemap_set_scrolldx(state->m_bg_tilemap[5],73,512-73); - tilemap_set_scrolldy(state->m_bg_tilemap[4],0x10,0x110); - tilemap_set_scrolldy(state->m_bg_tilemap[5],0x10,0x110); + state->m_bg_tilemap[4]->set_scrolldx(73,512-73); + state->m_bg_tilemap[5]->set_scrolldx(73,512-73); + state->m_bg_tilemap[4]->set_scrolldy(0x10,0x110); + state->m_bg_tilemap[5]->set_scrolldy(0x10,0x110); /* register videoram to the save state system (post-allocation) */ state_save_register_global_pointer(machine, state->m_videoram, 0x8000); @@ -190,14 +190,14 @@ { /* background 0-3 */ int layer = offset >> 13; int num = (offset & 0x1fff) >> 1; - tilemap_mark_tile_dirty(state->m_bg_tilemap[layer],num); + state->m_bg_tilemap[layer]->mark_tile_dirty(num); } else { /* foreground 4-5 */ int layer = (offset >> 11 & 1) + 4; int num = ((offset & 0x7ff) - 0x10) >> 1; if (num >= 0 && num < 0x3f0) - tilemap_mark_tile_dirty(state->m_bg_tilemap[layer],num); + state->m_bg_tilemap[layer]->mark_tile_dirty(num); } } @@ -298,7 +298,7 @@ 15 xxxxxxxx Y position */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { namcos1_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram + 0x800; @@ -370,20 +370,20 @@ -SCREEN_UPDATE( namcos1 ) +SCREEN_UPDATE_IND16( namcos1 ) { - namcos1_state *state = screen->machine().driver_data(); + namcos1_state *state = screen.machine().driver_data(); int i, j, scrollx, scrolly, priority; - rectangle new_clip = *cliprect; + rectangle new_clip = cliprect; /* flip screen is embedded in the sprite control registers */ - /* can't use flip_screen_set(screen->machine(), ) because the visible area is asymmetrical */ - flip_screen_set_no_update(screen->machine(), state->m_spriteram[0x0ff6] & 1); - tilemap_set_flip_all(screen->machine(),flip_screen_get(screen->machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + /* can't use flip_screen_set(screen.machine(), ) because the visible area is asymmetrical */ + flip_screen_set_no_update(screen.machine(), state->m_spriteram[0x0ff6] & 1); + screen.machine().tilemap().set_flip_all(flip_screen_get(screen.machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* background color */ - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* berabohm uses asymmetrical visibility windows to iris on the character */ i = ((state->m_cus116[0] << 8) | state->m_cus116[1]) - 1; // min x @@ -395,13 +395,13 @@ i = ((state->m_cus116[6] << 8) | state->m_cus116[7]) - 0x11 - 1; // max y if (new_clip.max_y > i) new_clip.max_y = i; - if (new_clip.max_x < new_clip.min_x || new_clip.max_y < new_clip.min_y) + if (new_clip.empty()) return 0; /* set palette base */ for (i = 0;i < 6;i++) - tilemap_set_palette_offset(state->m_bg_tilemap[i],(state->m_playfield_control[i + 24] & 7) * 256); + state->m_bg_tilemap[i]->set_palette_offset((state->m_playfield_control[i + 24] & 7) * 256); for (i = 0;i < 4;i++) { @@ -411,18 +411,18 @@ scrollx = ( state->m_playfield_control[j+1] + (state->m_playfield_control[j+0]<<8) ) - disp_x[i]; scrolly = ( state->m_playfield_control[j+3] + (state->m_playfield_control[j+2]<<8) ) + 8; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { scrollx = -scrollx; scrolly = -scrolly; } - tilemap_set_scrollx(state->m_bg_tilemap[i],0,scrollx); - tilemap_set_scrolly(state->m_bg_tilemap[i],0,scrolly); + state->m_bg_tilemap[i]->set_scrollx(0,scrollx); + state->m_bg_tilemap[i]->set_scrolly(0,scrolly); } - bitmap_fill(screen->machine().priority_bitmap, &new_clip, 0); + screen.machine().priority_bitmap.fill(0, new_clip); /* bit 0-2 priority */ /* bit 3 disable */ @@ -431,29 +431,33 @@ for (i = 0;i < 6;i++) { if (state->m_playfield_control[16 + i] == priority) - tilemap_draw_primask(bitmap,&new_clip,state->m_bg_tilemap[i],0,priority,0); + state->m_bg_tilemap[i]->draw(bitmap, new_clip, 0,priority,0); } } - draw_sprites(screen->machine(), bitmap, &new_clip); + draw_sprites(screen.machine(), bitmap, new_clip); return 0; } -SCREEN_EOF( namcos1 ) +SCREEN_VBLANK( namcos1 ) { - namcos1_state *state = machine.driver_data(); - if (state->m_copy_sprites) + // rising edge + if (vblank_on) { - UINT8 *spriteram = state->m_spriteram + 0x800; - int i,j; - - for (i = 0;i < 0x800;i += 16) + namcos1_state *state = screen.machine().driver_data(); + if (state->m_copy_sprites) { - for (j = 10;j < 16;j++) - spriteram[i+j] = spriteram[i+j - 6]; - } + UINT8 *spriteram = state->m_spriteram + 0x800; + int i,j; - state->m_copy_sprites = 0; + for (i = 0;i < 0x800;i += 16) + { + for (j = 10;j < 16;j++) + spriteram[i+j] = spriteram[i+j - 6]; + } + + state->m_copy_sprites = 0; + } } } diff -Nru mame-0.144/src/mame/video/namcos21.c mame-0.145/src/mame/video/namcos21.c --- mame-0.144/src/mame/video/namcos21.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/namcos21.c 2012-02-06 21:30:31.000000000 +0000 @@ -98,17 +98,17 @@ } /* namcos21_ClearPolyFrameBuffer */ static void -CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_t *bitmap, const rectangle *clip, int zlo, int zhi ) +CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi ) { namcos21_state *state = machine.driver_data(); /* blit the visible framebuffer */ int sy; - for( sy=clip->min_y; sy<=clip->max_y; sy++ ) + for( sy=clip.min_y; sy<=clip.max_y; sy++ ) { - UINT16 *dest = BITMAP_ADDR16(bitmap, sy, 0); + UINT16 *dest = &bitmap.pix16(sy); const UINT16 *pPen = state->m_mpPolyFrameBufferPens2+NAMCOS21_POLY_FRAME_WIDTH*sy; const UINT16 *pZ = state->m_mpPolyFrameBufferZ2+NAMCOS21_POLY_FRAME_WIDTH*sy; int sx; - for( sx=clip->min_x; sx<=clip->max_x; sx++ ) + for( sx=clip.min_x; sx<=clip.max_x; sx++ ) { int z = pZ[sx]; //if( pZ[sx]!=0x7fff ) @@ -172,50 +172,50 @@ } /* update_palette */ -SCREEN_UPDATE( namcos21 ) +SCREEN_UPDATE_IND16( namcos21 ) { - namcos21_state *state = screen->machine().driver_data(); + namcos21_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int pivot = 3; int pri; - update_palette(screen->machine()); - bitmap_fill( bitmap, cliprect , 0xff); + update_palette(screen.machine()); + bitmap.fill(0xff, cliprect ); if( namcos2_gametype != NAMCOS21_WINRUN91 ) { /* draw low priority 2d sprites */ - namco_obj_draw(screen->machine(), bitmap, cliprect, 2 ); - namco_obj_draw(screen->machine(), bitmap, cliprect, 14 ); //driver's eyes + namco_obj_draw(screen.machine(), bitmap, cliprect, 2 ); + namco_obj_draw(screen.machine(), bitmap, cliprect, 14 ); //driver's eyes } - CopyVisiblePolyFrameBuffer( screen->machine(), bitmap, cliprect, 0x7fc0, 0x7ffe ); + CopyVisiblePolyFrameBuffer( screen.machine(), bitmap, cliprect, 0x7fc0, 0x7ffe ); if( namcos2_gametype != NAMCOS21_WINRUN91 ) { /* draw low priority 2d sprites */ - namco_obj_draw(screen->machine(), bitmap, cliprect, 0 ); - namco_obj_draw(screen->machine(), bitmap, cliprect, 1 ); + namco_obj_draw(screen.machine(), bitmap, cliprect, 0 ); + namco_obj_draw(screen.machine(), bitmap, cliprect, 1 ); } - CopyVisiblePolyFrameBuffer( screen->machine(), bitmap, cliprect, 0, 0x7fbf ); + CopyVisiblePolyFrameBuffer( screen.machine(), bitmap, cliprect, 0, 0x7fbf ); if( namcos2_gametype != NAMCOS21_WINRUN91 ) { /* draw high priority 2d sprites */ for( pri=pivot; pri<8; pri++ ) { - namco_obj_draw(screen->machine(), bitmap, cliprect, pri ); + namco_obj_draw(screen.machine(), bitmap, cliprect, pri ); } - namco_obj_draw(screen->machine(), bitmap, cliprect, 15 ); //driver's eyes + namco_obj_draw(screen.machine(), bitmap, cliprect, 15 ); //driver's eyes } else { /* winrun bitmap layer */ - int yscroll = -cliprect->min_y+(INT16)state->m_winrun_gpu_register[0x2/2]; + int yscroll = -cliprect.min_y+(INT16)state->m_winrun_gpu_register[0x2/2]; int base = 0x1000+0x100*(state->m_winrun_color&0xf); int sx,sy; - for( sy=cliprect->min_y; sy<=cliprect->max_y; sy++ ) + for( sy=cliprect.min_y; sy<=cliprect.max_y; sy++ ) { const UINT8 *pSource = &videoram[((yscroll+sy)&0x3ff)*0x200]; - UINT16 *pDest = BITMAP_ADDR16(bitmap, sy, 0); - for( sx=cliprect->min_x; sx<=cliprect->max_x; sx++ ) + UINT16 *pDest = &bitmap.pix16(sy); + for( sx=cliprect.min_x; sx<=cliprect.max_x; sx++ ) { int pen = pSource[sx]; switch( pen ) @@ -236,7 +236,7 @@ } } /* winrun bitmap layer */ return 0; -} /* SCREEN_UPDATE( namcos21 ) */ +} /* SCREEN_UPDATE_IND16( namcos21 ) */ /*********************************************************************************************/ diff -Nru mame-0.144/src/mame/video/namcos22.c mame-0.145/src/mame/video/namcos22.c --- mame-0.144/src/mame/video/namcos22.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/namcos22.c 2012-02-06 21:30:31.000000000 +0000 @@ -293,10 +293,7 @@ int cy = 240+vy; mClip.cx = cx; mClip.cy = cy; - mClip.scissor.min_x = cx + vw; - mClip.scissor.max_x = cx - vw; - mClip.scissor.min_y = cy + vh; - mClip.scissor.max_y = cy - vh; + mClip.scissor.set(cx + vw, cx - vw, cy + vh, cy - vh); if( mClip.scissor.min_x<0 ) mClip.scissor.min_x = 0; if( mClip.scissor.max_x>639 ) mClip.scissor.max_x = 639; if( mClip.scissor.min_y<0 ) mClip.scissor.min_y = 0; @@ -307,10 +304,7 @@ sprite_Clip( int min_x, int max_x, int min_y, int max_y ) { // cx/cy not used - mClip.scissor.min_x = min_x; - mClip.scissor.max_x = max_x; - mClip.scissor.min_y = min_y; - mClip.scissor.max_y = max_y; + mClip.scissor.set(min_x, max_x, min_y, max_y); if( mClip.scissor.min_x<0 ) mClip.scissor.min_x = 0; if( mClip.scissor.max_x>639 ) mClip.scissor.max_x = 639; if( mClip.scissor.min_y<0 ) mClip.scissor.min_y = 0; @@ -322,10 +316,7 @@ { mClip.cx = 320; mClip.cy = 240; - mClip.scissor.min_x = 0; - mClip.scissor.max_x = 639; - mClip.scissor.min_y = 0; - mClip.scissor.max_y = 479; + mClip.scissor.set(0, 639, 0, 479); } typedef struct @@ -356,7 +347,7 @@ rgbint fadeColor; rgbint polyColor; const pen_t *pens; - bitmap_t *priority_bitmap; + bitmap_ind8 *priority_bitmap; int bn; int flags; int prioverchar; @@ -390,7 +381,7 @@ float du = extent->param[1].dpdx; float dv = extent->param[2].dpdx; float di = extent->param[3].dpdx; - bitmap_t *destmap = (bitmap_t *)destbase; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)destbase; int bn = extra->bn * 0x1000; const pen_t *pens = extra->pens; const UINT8 *czram = extra->czram; @@ -407,8 +398,8 @@ int penmask = 0xff; int penshift = 0; int prioverchar = extra->prioverchar; - UINT32 *dest = BITMAP_ADDR32(destmap, scanline, 0); - UINT8 *primap = BITMAP_ADDR8(extra->priority_bitmap, scanline, 0); + UINT32 *dest = &destmap->pix32(scanline); + UINT8 *primap = &extra->priority_bitmap->pix8(scanline); int x; if (extra->cmode & 4) @@ -522,7 +513,7 @@ } } /* renderscanline_uvi_full */ -static void poly3d_DrawQuad(running_machine &machine, bitmap_t *bitmap, int textureBank, int color, Poly3dVertex pv[4], int flags, int cz_adjust, int direct, int cmode ) +static void poly3d_DrawQuad(running_machine &machine, bitmap_rgb32 &bitmap, int textureBank, int color, Poly3dVertex pv[4], int flags, int cz_adjust, int direct, int cmode ) { namcos22_state *state = machine.driver_data(); poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); @@ -537,7 +528,7 @@ extra->fogFactor = 0; extra->pens = &machine.pens[(color&0x7f)<<8]; - extra->priority_bitmap = machine.priority_bitmap; + extra->priority_bitmap = &machine.priority_bitmap; extra->bn = textureBank; extra->flags = flags; extra->cz_adjust = cz_adjust; @@ -726,7 +717,7 @@ } } - poly_render_triangle_fan(state->m_poly, bitmap, &mClip.scissor, renderscanline_uvi_full, 4, clipverts, clipv); + poly_render_triangle_fan(state->m_poly, &bitmap, mClip.scissor, renderscanline_uvi_full, 4, clipverts, clipv); } static void renderscanline_sprite(void *destbase, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) @@ -735,7 +726,7 @@ int y_index = extent->param[1].start - extra->flipy; float x_index = extent->param[0].start - extra->flipx; float dx = extent->param[0].dpdx; - bitmap_t *destmap = (bitmap_t *)destbase; + bitmap_rgb32 *destmap = (bitmap_rgb32 *)destbase; const pen_t *pal = extra->pens; int prioverchar = extra->prioverchar; int alphaFactor = extra->alpha; @@ -744,8 +735,8 @@ rgbint fogColor = extra->fogColor; rgbint fadeColor = extra->fadeColor; UINT8 *source = (UINT8 *)extra->source + y_index * extra->line_modulo; - UINT32 *dest = BITMAP_ADDR32(destmap, scanline, 0); - UINT8 *primap = BITMAP_ADDR8(extra->priority_bitmap, scanline, 0); + UINT32 *dest = &destmap->pix32(scanline); + UINT8 *primap = &extra->priority_bitmap->pix8(scanline); int x; for( x=extent->startx; xstopx; x++ ) @@ -779,7 +770,7 @@ static void poly3d_DrawSprite( - bitmap_t *dest_bmp, const gfx_element *gfx, UINT32 code, + bitmap_rgb32 &dest_bmp, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int cz_factor, int prioverchar, int alpha ) { @@ -808,7 +799,7 @@ extra->flipx = flipx; extra->flipy = flipy; extra->pens = &gfx->machine().pens[gfx->color_base + gfx->color_granularity * (color&0x7f)]; - extra->priority_bitmap = gfx->machine().priority_bitmap; + extra->priority_bitmap = &gfx->machine().priority_bitmap; extra->source = gfx_element_get_data(gfx, code % gfx->total_elements); vert[0].x = fsx; @@ -843,12 +834,12 @@ rgb_comp_to_rgbint(&extra->fogColor, mixer.rFogColor, mixer.gFogColor, mixer.bFogColor); } - poly_render_triangle_fan(state->m_poly, dest_bmp, &mClip.scissor, renderscanline_sprite, 2, 4, vert); + poly_render_triangle_fan(state->m_poly, &dest_bmp, mClip.scissor, renderscanline_sprite, 2, 4, vert); } } /* poly3d_DrawSprite */ static void -ApplyGamma( running_machine &machine, bitmap_t *bitmap ) +ApplyGamma( running_machine &machine, bitmap_rgb32 &bitmap ) { namcos22_state *state = machine.driver_data(); int x,y; @@ -857,10 +848,10 @@ const UINT8 *rlut = (const UINT8 *)&state->m_gamma[0x100/4]; const UINT8 *glut = (const UINT8 *)&state->m_gamma[0x200/4]; const UINT8 *blut = (const UINT8 *)&state->m_gamma[0x300/4]; - for( y=0; yheight; y++ ) + for( y=0; ywidth; x++ ) + UINT32 *dest = &bitmap.pix32(y); + for( x=0; x>16)&0xff)]; @@ -875,10 +866,10 @@ const UINT8 *rlut = 0x000+(const UINT8 *)machine.region("user1")->base(); const UINT8 *glut = 0x100+rlut; const UINT8 *blut = 0x200+rlut; - for( y=0; yheight; y++ ) + for( y=0; ywidth; x++ ) + UINT32 *dest = &bitmap.pix32(y); + for( x=0; x>16)&0xff]; @@ -1077,7 +1068,7 @@ } /* NewSceneNode */ -static void RenderSprite(running_machine &machine, bitmap_t *bitmap, struct SceneNode *node ) +static void RenderSprite(running_machine &machine, bitmap_rgb32 &bitmap, struct SceneNode *node ) { namcos22_state *state = machine.driver_data(); int tile = node->data.sprite.tile; @@ -1113,7 +1104,7 @@ } /* next row */ } /* RenderSprite */ -static void RenderSceneHelper(running_machine &machine, bitmap_t *bitmap, struct SceneNode *node ) +static void RenderSceneHelper(running_machine &machine, bitmap_rgb32 &bitmap, struct SceneNode *node ) { if( node ) { @@ -1174,7 +1165,7 @@ } } /* RenderSceneHelper */ -static void RenderScene(running_machine &machine, bitmap_t *bitmap ) +static void RenderScene(running_machine &machine, bitmap_rgb32 &bitmap ) { namcos22_state *state = machine.driver_data(); struct SceneNode *node = &mSceneRoot; @@ -1506,8 +1497,8 @@ static void DrawSpritesHelper( running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + bitmap_rgb32 &bitmap, + const rectangle &cliprect, UINT32 *pBase, const UINT32 *pSource, const UINT32 *pPal, @@ -1641,7 +1632,7 @@ } /* DrawSpritesHelper */ static void -DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +DrawSprites( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { namcos22_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -1830,8 +1821,8 @@ { namcos22_state *state = space->machine().driver_data(); COMBINE_DATA( &state->m_textram[offset] ); - tilemap_mark_tile_dirty( state->m_bgtilemap, offset*2 ); - tilemap_mark_tile_dirty( state->m_bgtilemap, offset*2+1 ); + state->m_bgtilemap->mark_tile_dirty(offset*2 ); + state->m_bgtilemap->mark_tile_dirty(offset*2+1 ); } READ32_HANDLER( namcos22_tilemapattr_r ) @@ -1957,7 +1948,7 @@ } } -static void namcos22s_mix_textlayer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int prival ) +static void namcos22s_mix_textlayer( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int prival ) { namcos22_state *state = machine.driver_data(); const pen_t *pens = machine.pens; @@ -1986,9 +1977,9 @@ // mix textlayer with poly/sprites for (y=0;y<480;y++) { - src = BITMAP_ADDR16(state->m_mix_bitmap, y, 0); - dest = BITMAP_ADDR32(bitmap, y, 0); - pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + src = &state->m_mix_bitmap->pix16(y); + dest = &bitmap.pix32(y); + pri = &machine.priority_bitmap.pix8(y); for (x=0;x<640;x++) { // skip if transparent or under poly/sprite @@ -2041,7 +2032,7 @@ } } -static void namcos22_mix_textlayer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void namcos22_mix_textlayer( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { namcos22_state *state = machine.driver_data(); const pen_t *pens = machine.pens; @@ -2063,9 +2054,9 @@ // mix textlayer with poly/sprites for (y=0;y<480;y++) { - src = BITMAP_ADDR16(state->m_mix_bitmap, y, 0); - dest = BITMAP_ADDR32(bitmap, y, 0); - pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + src = &state->m_mix_bitmap->pix16(y); + dest = &bitmap.pix32(y); + pri = &machine.priority_bitmap.pix8(y); for (x=0;x<640;x++) { // skip if transparent or under poly @@ -2099,24 +2090,24 @@ } } -static void DrawCharacterLayer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void DrawCharacterLayer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { namcos22_state *state = machine.driver_data(); int scroll_x = (state->m_tilemapattr[0]>>16) - 0x35c; int scroll_y = state->m_tilemapattr[0]&0xffff; - tilemap_set_scrollx( state->m_bgtilemap,0, scroll_x & 0x3ff ); - tilemap_set_scrolly( state->m_bgtilemap,0, scroll_y & 0x3ff ); - tilemap_set_palette_offset( state->m_bgtilemap, mixer.palBase*256 ); + state->m_bgtilemap->set_scrollx(0, scroll_x & 0x3ff ); + state->m_bgtilemap->set_scrolly(0, scroll_y & 0x3ff ); + state->m_bgtilemap->set_palette_offset(mixer.palBase*256 ); if (state->m_mbSuperSystem22) { - tilemap_draw_primask(state->m_mix_bitmap, cliprect, state->m_bgtilemap, 0, 4, 4); + state->m_bgtilemap->draw(*state->m_mix_bitmap, cliprect, 0, 4, 4); namcos22s_mix_textlayer(machine, bitmap, cliprect, 4); } else { - tilemap_draw_primask(state->m_mix_bitmap, cliprect, state->m_bgtilemap, 0, 2, 3); + state->m_bgtilemap->draw(*state->m_mix_bitmap, cliprect, 0, 2, 3); namcos22_mix_textlayer(machine, bitmap, cliprect); } } @@ -2171,7 +2162,7 @@ static void BlitQuadHelper( running_machine &machine, - bitmap_t *bitmap, + bitmap_rgb32 &bitmap, unsigned color, unsigned addr, float m[4][4], @@ -2339,7 +2330,7 @@ } /* RegisterNormals */ static void -BlitQuads( running_machine &machine, bitmap_t *bitmap, INT32 addr, float m[4][4], INT32 base ) +BlitQuads( running_machine &machine, bitmap_rgb32 &bitmap, INT32 addr, float m[4][4], INT32 base ) { namcos22_state *state = machine.driver_data(); // int numAdditionalNormals = 0; @@ -2430,7 +2421,7 @@ } /* BlitQuads */ static void -BlitPolyObject( running_machine &machine, bitmap_t *bitmap, int code, float M[4][4] ) +BlitPolyObject( running_machine &machine, bitmap_rgb32 &bitmap, int code, float M[4][4] ) { namcos22_state *state = machine.driver_data(); unsigned addr1 = GetPolyData(state, code); @@ -2561,7 +2552,7 @@ } /* HandleBB0003 */ static void -Handle200002( running_machine &machine, bitmap_t *bitmap, const INT32 *pSource ) +Handle200002( running_machine &machine, bitmap_rgb32 &bitmap, const INT32 *pSource ) { namcos22_state *state = machine.driver_data(); if( state->m_mPrimitiveID>=0x45 ) @@ -2630,7 +2621,7 @@ } /* Handle233002 */ static void -SimulateSlaveDSP( running_machine &machine, bitmap_t *bitmap ) +SimulateSlaveDSP( running_machine &machine, bitmap_rgb32 &bitmap ) { namcos22_state *state = machine.driver_data(); const INT32 *pSource = 0x300 + (INT32 *)state->m_polygonram; @@ -2696,7 +2687,7 @@ } /* SimulateSlaveDSP */ static void -DrawPolygons( running_machine &machine, bitmap_t *bitmap ) +DrawPolygons( running_machine &machine, bitmap_rgb32 &bitmap ) { namcos22_state *state = machine.driver_data(); if( state->m_mbDSPisActive ) @@ -2757,9 +2748,9 @@ namcos22_state *state = machine.driver_data(); int code; - state->m_mix_bitmap = auto_bitmap_alloc(machine,640,480,BITMAP_FORMAT_INDEXED16); + state->m_mix_bitmap = auto_bitmap_ind16_alloc(machine,640,480); state->m_bgtilemap = tilemap_create( machine, TextTilemapGetInfo,tilemap_scan_rows,16,16,64,64 ); - tilemap_set_transparent_pen(state->m_bgtilemap, 0xf); + state->m_bgtilemap->set_transparent_pen(0xf); state->m_mbDSPisActive = 0; memset( state->m_polygonram, 0xcc, 0x20000 ); @@ -2811,13 +2802,13 @@ VIDEO_START_CALL(common); } -SCREEN_UPDATE( namcos22s ) +SCREEN_UPDATE_RGB32( namcos22s ) { - namcos22_state *state = screen->machine().driver_data(); - UpdateVideoMixer(screen->machine()); - UpdatePalette(screen->machine()); - namcos22s_recalc_czram(screen->machine()); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + namcos22_state *state = screen.machine().driver_data(); + UpdateVideoMixer(screen.machine()); + UpdatePalette(screen.machine()); + namcos22s_recalc_czram(screen.machine()); + screen.machine().priority_bitmap.fill(0, cliprect); // background color rgbint bg_color; @@ -2828,25 +2819,25 @@ rgb_comp_to_rgbint(&fade_color, mixer.rFadeColor, mixer.gFadeColor, mixer.bFadeColor); rgbint_blend(&bg_color, &fade_color, 0xff - mixer.fadeFactor); } - bitmap_fill( bitmap, cliprect, rgbint_to_rgb(&bg_color)); + bitmap.fill(rgbint_to_rgb(&bg_color), cliprect); // layers UINT8 layer = nthbyte(state->m_gamma,0x1f); - if (layer&4) DrawCharacterLayer(screen->machine(), bitmap, cliprect); - if (layer&2) DrawSprites(screen->machine(), bitmap, cliprect); - if (layer&1) DrawPolygons(screen->machine(), bitmap); - RenderScene(screen->machine(), bitmap ); - if (layer&4) namcos22s_mix_textlayer(screen->machine(), bitmap, cliprect, 6); - ApplyGamma(screen->machine(), bitmap); + if (layer&4) DrawCharacterLayer(screen.machine(), bitmap, cliprect); + if (layer&2) DrawSprites(screen.machine(), bitmap, cliprect); + if (layer&1) DrawPolygons(screen.machine(), bitmap); + RenderScene(screen.machine(), bitmap ); + if (layer&4) namcos22s_mix_textlayer(screen.machine(), bitmap, cliprect, 6); + ApplyGamma(screen.machine(), bitmap); // debug stuff #if ALLOW_MEMDUMP - if( screen->machine().input().code_pressed(KEYCODE_D) ) + if( screen.machine().input().code_pressed(KEYCODE_D) ) { FILE *f = fopen( "dump.txt", "wb" ); if( f ) { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); if (1) // czram { @@ -2885,7 +2876,7 @@ //Dump(space, f,0xc00000, 0xc1ffff, "polygonram"); fclose( f ); } - while( screen->machine().input().code_pressed(KEYCODE_D) ){} + while( screen.machine().input().code_pressed(KEYCODE_D) ){} } #endif @@ -2894,24 +2885,24 @@ return 0; } -SCREEN_UPDATE( namcos22 ) +SCREEN_UPDATE_RGB32( namcos22 ) { - UpdateVideoMixer(screen->machine()); - UpdatePalette(screen->machine()); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - DrawPolygons(screen->machine(), bitmap); - RenderScene(screen->machine(), bitmap); - DrawCharacterLayer(screen->machine(), bitmap, cliprect); - ApplyGamma(screen->machine(), bitmap); + UpdateVideoMixer(screen.machine()); + UpdatePalette(screen.machine()); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + DrawPolygons(screen.machine(), bitmap); + RenderScene(screen.machine(), bitmap); + DrawCharacterLayer(screen.machine(), bitmap, cliprect); + ApplyGamma(screen.machine(), bitmap); #if ALLOW_MEMDUMP - if( screen->machine().input().code_pressed(KEYCODE_D) ) + if( screen.machine().input().code_pressed(KEYCODE_D) ) { FILE *f = fopen( "dump.txt", "wb" ); if( f ) { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); //Dump(space, f,0x90000000, 0x90000003, "led?" ); Dump(space, f,0x90010000, 0x90017fff, "cz_ram"); @@ -2920,7 +2911,7 @@ //Dump(space, f,0x70000000, 0x7001ffff, "polygonram"); fclose( f ); } - while( screen->machine().input().code_pressed(KEYCODE_D) ){} + while( screen.machine().input().code_pressed(KEYCODE_D) ){} } #endif diff -Nru mame-0.144/src/mame/video/namcos2.c mame-0.145/src/mame/video/namcos2.c --- mame-0.144/src/mame/video/namcos2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/namcos2.c 2012-02-06 21:30:33.000000000 +0000 @@ -74,16 +74,16 @@ INLINE void DrawRozHelperBlock(const struct RozParam *rozInfo, int destx, int desty, int srcx, int srcy, int width, int height, - bitmap_t *destbitmap, bitmap_t *flagsbitmap, - bitmap_t *srcbitmap, UINT32 size_mask) + bitmap_ind16 &destbitmap, bitmap_ind8 &flagsbitmap, + bitmap_ind16 &srcbitmap, UINT32 size_mask) { int desty_end = desty + height; int end_incrx = rozInfo->incyx - (width * rozInfo->incxx); int end_incry = rozInfo->incyy - (width * rozInfo->incxy); - UINT16 *dest = BITMAP_ADDR16(destbitmap, desty, destx); - int dest_rowinc = destbitmap->rowpixels - width; + UINT16 *dest = &destbitmap.pix16(desty, destx); + int dest_rowinc = destbitmap.rowpixels() - width; while (desty < desty_end) { @@ -103,9 +103,9 @@ goto L_SkipPixel; } - if (*BITMAP_ADDR8(flagsbitmap, ypos, xpos) & TILEMAP_PIXEL_LAYER0) + if (flagsbitmap.pix8(ypos, xpos) & TILEMAP_PIXEL_LAYER0) { - *dest = *BITMAP_ADDR16(srcbitmap, ypos, xpos) + rozInfo->color; + *dest = srcbitmap.pix16(ypos, xpos) + rozInfo->color; } L_SkipPixel: @@ -123,14 +123,14 @@ static void DrawRozHelper( - bitmap_t *bitmap, + bitmap_ind16 &bitmap, tilemap_t *tmap, - const rectangle *clip, + const rectangle &clip, const struct RozParam *rozInfo ) { - tilemap_set_palette_offset( tmap, rozInfo->color ); + tmap->set_palette_offset(rozInfo->color ); - if( bitmap->bpp == 16 ) + if( bitmap.bpp() == 16 ) { /* On many processors, the simple approach of an outer loop over the rows of the destination bitmap with an inner loop over the columns @@ -162,20 +162,20 @@ #define ROZ_BLOCK_SIZE 8 UINT32 size_mask = rozInfo->size - 1; - bitmap_t *srcbitmap = tilemap_get_pixmap(tmap); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(tmap); - UINT32 srcx = (rozInfo->startx + (clip->min_x * rozInfo->incxx) + - (clip->min_y * rozInfo->incyx)); - UINT32 srcy = (rozInfo->starty + (clip->min_x * rozInfo->incxy) + - (clip->min_y * rozInfo->incyy)); - int destx = clip->min_x; - int desty = clip->min_y; + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &flagsbitmap = tmap->flagsmap(); + UINT32 srcx = (rozInfo->startx + (clip.min_x * rozInfo->incxx) + + (clip.min_y * rozInfo->incyx)); + UINT32 srcy = (rozInfo->starty + (clip.min_x * rozInfo->incxy) + + (clip.min_y * rozInfo->incyy)); + int destx = clip.min_x; + int desty = clip.min_y; - int row_count = (clip->max_y - desty) + 1; + int row_count = (clip.max_y - desty) + 1; int row_block_count = row_count / ROZ_BLOCK_SIZE; int row_extra_count = row_count % ROZ_BLOCK_SIZE; - int column_count = (clip->max_x - destx) + 1; + int column_count = (clip.max_x - destx) + 1; int column_block_count = column_count / ROZ_BLOCK_SIZE; int column_extra_count = column_count % ROZ_BLOCK_SIZE; @@ -235,8 +235,8 @@ } else { - tilemap_draw_roz( - bitmap, clip, tmap, + tmap->draw_roz( + bitmap, clip, rozInfo->startx, rozInfo->starty, rozInfo->incxx, rozInfo->incxy, rozInfo->incyx, rozInfo->incyy, @@ -245,7 +245,7 @@ } /* DrawRozHelper */ static void -DrawROZ(bitmap_t *bitmap,const rectangle *cliprect) +DrawROZ(bitmap_ind16 &bitmap,const rectangle &cliprect) { const int xoffset = 38,yoffset = 0; struct RozParam rozParam; @@ -313,7 +313,7 @@ WRITE16_HANDLER( namcos2_68k_roz_ram_w ) { COMBINE_DATA(&namcos2_68k_roz_ram[offset]); - tilemap_mark_tile_dirty(tilemap_roz,offset); + tilemap_roz->mark_tile_dirty(offset); // if( space->machine().input().code_pressed(KEYCODE_Q) ) // { // debugger_break(space->machine()); @@ -445,44 +445,44 @@ { namco_tilemap_init(machine,2,machine.region("gfx4")->base(),TilemapCB); tilemap_roz = tilemap_create(machine, get_tile_info_roz,tilemap_scan_rows,8,8,256,256); - tilemap_set_transparent_pen(tilemap_roz,0xff); + tilemap_roz->set_transparent_pen(0xff); DrawSpriteInit(machine); } static void -ApplyClip( rectangle *clip, const rectangle *cliprect ) +ApplyClip( rectangle &clip, const rectangle &cliprect ) { - clip->min_x = GetPaletteRegister(0) - 0x4a; - clip->max_x = GetPaletteRegister(1) - 0x4a - 1; - clip->min_y = GetPaletteRegister(2) - 0x21; - clip->max_y = GetPaletteRegister(3) - 0x21 - 1; + clip.min_x = GetPaletteRegister(0) - 0x4a; + clip.max_x = GetPaletteRegister(1) - 0x4a - 1; + clip.min_y = GetPaletteRegister(2) - 0x21; + clip.max_y = GetPaletteRegister(3) - 0x21 - 1; /* intersect with master clip rectangle */ - sect_rect(clip, cliprect); + clip &= cliprect; } /* ApplyClip */ -SCREEN_UPDATE( namcos2_default ) +SCREEN_UPDATE_IND16( namcos2_default ) { rectangle clip; int pri; - UpdatePalette(screen->machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); - ApplyClip( &clip, cliprect ); + UpdatePalette(screen.machine()); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); + ApplyClip( clip, cliprect ); /* HACK: enable ROZ layer only if it has priority > 0 */ - tilemap_set_enable(tilemap_roz,(namcos2_gfx_ctrl & 0x7000) ? 1 : 0); + tilemap_roz->enable((namcos2_gfx_ctrl & 0x7000) ? 1 : 0); for( pri=0; pri<16; pri++ ) { if( (pri&1)==0 ) { - namco_tilemap_draw( bitmap, &clip, pri/2 ); + namco_tilemap_draw( bitmap, clip, pri/2 ); if( ((namcos2_gfx_ctrl & 0x7000) >> 12)==pri/2 ) { - DrawROZ(bitmap,&clip); + DrawROZ(bitmap,clip); } - namcos2_draw_sprites(screen->machine(), bitmap, &clip, pri/2, namcos2_gfx_ctrl ); + namcos2_draw_sprites(screen.machine(), bitmap, clip, pri/2, namcos2_gfx_ctrl ); } } return 0; @@ -497,23 +497,23 @@ namco_road_init(machine, 3); } -SCREEN_UPDATE( finallap ) +SCREEN_UPDATE_IND16( finallap ) { rectangle clip; int pri; - UpdatePalette(screen->machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); - ApplyClip( &clip, cliprect ); + UpdatePalette(screen.machine()); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); + ApplyClip( clip, cliprect ); for( pri=0; pri<16; pri++ ) { if( (pri&1)==0 ) { - namco_tilemap_draw( bitmap, &clip, pri/2 ); + namco_tilemap_draw( bitmap, clip, pri/2 ); } - namco_road_draw(screen->machine(), bitmap,&clip,pri ); - namcos2_draw_sprites(screen->machine(), bitmap,&clip,pri,namcos2_gfx_ctrl ); + namco_road_draw(screen.machine(), bitmap,clip,pri ); + namcos2_draw_sprites(screen.machine(), bitmap,clip,pri,namcos2_gfx_ctrl ); } return 0; } @@ -534,27 +534,27 @@ } } /* luckywld */ -SCREEN_UPDATE( luckywld ) +SCREEN_UPDATE_IND16( luckywld ) { rectangle clip; int pri; - UpdatePalette(screen->machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); - ApplyClip( &clip, cliprect ); + UpdatePalette(screen.machine()); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); + ApplyClip( clip, cliprect ); for( pri=0; pri<16; pri++ ) { if( (pri&1)==0 ) { - namco_tilemap_draw( bitmap, &clip, pri/2 ); + namco_tilemap_draw( bitmap, clip, pri/2 ); } - namco_road_draw(screen->machine(), bitmap,&clip,pri ); + namco_road_draw(screen.machine(), bitmap,clip,pri ); if( namcos2_gametype==NAMCOS2_LUCKY_AND_WILD ) { - namco_roz_draw( bitmap, &clip, pri ); + namco_roz_draw( bitmap, clip, pri ); } - namco_obj_draw(screen->machine(), bitmap, &clip, pri ); + namco_obj_draw(screen.machine(), bitmap, clip, pri ); } return 0; } @@ -567,19 +567,19 @@ namco_obj_init( machine, 0, 0x0, NULL ); } -SCREEN_UPDATE( sgunner ) +SCREEN_UPDATE_IND16( sgunner ) { rectangle clip; int pri; - UpdatePalette(screen->machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); - ApplyClip( &clip, cliprect ); + UpdatePalette(screen.machine()); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); + ApplyClip( clip, cliprect ); for( pri=0; pri<8; pri++ ) { - namco_tilemap_draw( bitmap, &clip, pri ); - namco_obj_draw(screen->machine(), bitmap, &clip, pri ); + namco_tilemap_draw( bitmap, clip, pri ); + namco_obj_draw(screen.machine(), bitmap, clip, pri ); } return 0; } @@ -593,23 +593,23 @@ namco_roz_init( machine, 1, "gfx5" ); } -SCREEN_UPDATE( metlhawk ) +SCREEN_UPDATE_IND16( metlhawk ) { rectangle clip; int pri; - UpdatePalette(screen->machine()); - bitmap_fill( bitmap, cliprect , get_black_pen(screen->machine())); - ApplyClip( &clip, cliprect ); + UpdatePalette(screen.machine()); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); + ApplyClip( clip, cliprect ); for( pri=0; pri<16; pri++ ) { if( (pri&1)==0 ) { - namco_tilemap_draw( bitmap, &clip, pri/2 ); + namco_tilemap_draw( bitmap, clip, pri/2 ); } - namco_roz_draw( bitmap, &clip, pri ); - namcos2_draw_sprites_metalhawk(screen->machine(), bitmap,&clip,pri ); + namco_roz_draw( bitmap, clip, pri ); + namcos2_draw_sprites_metalhawk(screen.machine(), bitmap,clip,pri ); } return 0; } diff -Nru mame-0.144/src/mame/video/namcos86.c mame-0.145/src/mame/video/namcos86.c --- mame-0.144/src/mame/video/namcos86.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/namcos86.c 2012-02-06 21:30:31.000000000 +0000 @@ -87,7 +87,7 @@ ***************************************************************************/ -INLINE void get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int layer,UINT8 *vram) +INLINE void get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int layer,UINT8 *vram) { namcos86_state *state = machine.driver_data(); int attr = vram[2*tile_index + 1]; @@ -143,10 +143,10 @@ state->m_bg_tilemap[2] = tilemap_create(machine, get_tile_info2,tilemap_scan_rows,8,8,64,32); state->m_bg_tilemap[3] = tilemap_create(machine, get_tile_info3,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0],7); - tilemap_set_transparent_pen(state->m_bg_tilemap[1],7); - tilemap_set_transparent_pen(state->m_bg_tilemap[2],7); - tilemap_set_transparent_pen(state->m_bg_tilemap[3],7); + state->m_bg_tilemap[0]->set_transparent_pen(7); + state->m_bg_tilemap[1]->set_transparent_pen(7); + state->m_bg_tilemap[2]->set_transparent_pen(7); + state->m_bg_tilemap[3]->set_transparent_pen(7); state->m_spriteram = state->m_rthunder_spriteram + 0x1800; } @@ -169,7 +169,7 @@ { namcos86_state *state = space->machine().driver_data(); state->m_rthunder_videoram1[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[offset/0x1000],(offset & 0xfff)/2); + state->m_bg_tilemap[offset/0x1000]->mark_tile_dirty((offset & 0xfff)/2); } READ8_HANDLER( rthunder_videoram2_r ) @@ -182,7 +182,7 @@ { namcos86_state *state = space->machine().driver_data(); state->m_rthunder_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap[2+offset/0x1000],(offset & 0xfff)/2); + state->m_bg_tilemap[2+offset/0x1000]->mark_tile_dirty((offset & 0xfff)/2); } WRITE8_HANDLER( rthunder_tilebank_select_w ) @@ -192,8 +192,8 @@ if (state->m_tilebank != bit) { state->m_tilebank = bit; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[0]); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap[1]); + state->m_bg_tilemap[0]->mark_all_dirty(); + state->m_bg_tilemap[1]->mark_all_dirty(); } } @@ -282,7 +282,7 @@ 15 xxxxxxxx Y position */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { namcos86_state *state = machine.driver_data(); const UINT8 *source = &state->m_spriteram[0x0800-0x20]; /* the last is NOT a sprite */ @@ -357,28 +357,28 @@ scrollx = -scrollx; scrolly = -scrolly; } - tilemap_set_scrollx(state->m_bg_tilemap[layer], 0, scrollx); - tilemap_set_scrolly(state->m_bg_tilemap[layer], 0, scrolly); + state->m_bg_tilemap[layer]->set_scrollx(0, scrollx); + state->m_bg_tilemap[layer]->set_scrolly(0, scrolly); } -SCREEN_UPDATE( namcos86 ) +SCREEN_UPDATE_IND16( namcos86 ) { - namcos86_state *state = screen->machine().driver_data(); + namcos86_state *state = screen.machine().driver_data(); int layer; /* flip screen is embedded in the sprite control registers */ - /* can't use flip_screen_set(screen->machine(), ) because the visible area is asymmetrical */ - flip_screen_set_no_update(screen->machine(), state->m_spriteram[0x07f6] & 1); - tilemap_set_flip_all(screen->machine(),flip_screen_get(screen->machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - set_scroll(screen->machine(), 0); - set_scroll(screen->machine(), 1); - set_scroll(screen->machine(), 2); - set_scroll(screen->machine(), 3); + /* can't use flip_screen_set(screen.machine(), ) because the visible area is asymmetrical */ + flip_screen_set_no_update(screen.machine(), state->m_spriteram[0x07f6] & 1); + screen.machine().tilemap().set_flip_all(flip_screen_get(screen.machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + set_scroll(screen.machine(), 0); + set_scroll(screen.machine(), 1); + set_scroll(screen.machine(), 2); + set_scroll(screen.machine(), 3); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap,cliprect,screen->machine().gfx[0]->color_base + 8*state->m_backcolor+7); + bitmap.fill(screen.machine().gfx[0]->color_base + 8*state->m_backcolor+7, cliprect); for (layer = 0;layer < 8;layer++) { @@ -387,29 +387,33 @@ for (i = 3;i >= 0;i--) { if (((state->m_xscroll[i] & 0x0e00) >> 9) == layer) - tilemap_draw_primask(bitmap,cliprect,state->m_bg_tilemap[i],0,layer,0); + state->m_bg_tilemap[i]->draw(bitmap, cliprect, 0,layer,0); } } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_EOF( namcos86 ) +SCREEN_VBLANK( namcos86 ) { - namcos86_state *state = machine.driver_data(); - if (state->m_copy_sprites) + // rising edge + if (vblank_on) { - UINT8 *spriteram = state->m_spriteram; - int i,j; - - for (i = 0;i < 0x800;i += 16) + namcos86_state *state = screen.machine().driver_data(); + if (state->m_copy_sprites) { - for (j = 10;j < 16;j++) - spriteram[i+j] = spriteram[i+j - 6]; - } + UINT8 *spriteram = state->m_spriteram; + int i,j; - state->m_copy_sprites = 0; + for (i = 0;i < 0x800;i += 16) + { + for (j = 10;j < 16;j++) + spriteram[i+j] = spriteram[i+j - 6]; + } + + state->m_copy_sprites = 0; + } } } diff -Nru mame-0.144/src/mame/video/naughtyb.c mame-0.145/src/mame/video/naughtyb.c --- mame-0.144/src/mame/video/naughtyb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/naughtyb.c 2012-02-06 21:30:32.000000000 +0000 @@ -12,24 +12,6 @@ #include "includes/naughtyb.h" -static const rectangle scrollvisiblearea = -{ - 2*8, 34*8-1, - 0*8, 28*8-1 -}; - -static const rectangle leftvisiblearea = -{ - 0*8, 2*8-1, - 0*8, 28*8-1 -}; - -static const rectangle rightvisiblearea = -{ - 34*8, 36*8-1, - 0*8, 28*8-1 -}; - static const res_net_decode_info naughtyb_decode_info = { 2, /* two proms */ @@ -122,7 +104,7 @@ state->m_palreg = state->m_bankreg = 0; /* Naughty Boy has a virtual screen twice as large as the visible screen */ - machine.generic.tmpbitmap = auto_bitmap_alloc(machine,68*8,28*8,machine.primary_screen->format()); + state->m_tmpbitmap.allocate(68*8,28*8,machine.primary_screen->format()); } @@ -137,7 +119,7 @@ state->m_cocktail = ( ( input_port_read(space->machine(), "DSW0") & 0x80 ) && // cabinet == cocktail ( data & 0x01 ) ); // handling player 2 - state->m_palreg = (data >> 1) & 0x03; // pallette sel is bit 1 & 2 + state->m_palreg = (data >> 1) & 0x03; // palette sel is bit 1 & 2 state->m_bankreg = (data >> 2) & 0x01; // banksel is just bit 2 } @@ -150,7 +132,7 @@ state->m_cocktail = ( ( input_port_read(space->machine(), "DSW0") & 0x80 ) && // cabinet == cocktail ( data & 0x01 ) ); // handling player 2 - state->m_palreg = (data >> 1) & 0x03; // pallette sel is bit 1 & 2 + state->m_palreg = (data >> 1) & 0x03; // palette sel is bit 1 & 2 state->m_bankreg = (data >> 3) & 0x01; // banksel is just bit 3 } @@ -200,10 +182,15 @@ ***************************************************************************/ -SCREEN_UPDATE( naughtyb ) +SCREEN_UPDATE_IND16( naughtyb ) { - naughtyb_state *state = screen->machine().driver_data(); + const rectangle scrollvisiblearea(2*8, 34*8-1, 0*8, 28*8-1); + const rectangle leftvisiblearea(0*8, 2*8-1, 0*8, 28*8-1); + const rectangle rightvisiblearea(34*8, 36*8-1, 0*8, 28*8-1); + + naughtyb_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; + bitmap_ind16 &tmpbitmap = state->m_tmpbitmap; int offs; // for every character in the Video RAM @@ -239,13 +226,13 @@ } } - drawgfx_opaque(screen->machine().generic.tmpbitmap,0,screen->machine().gfx[0], + drawgfx_opaque(tmpbitmap,tmpbitmap.cliprect(),screen.machine().gfx[0], state->m_videoram2[offs] + 256 * state->m_bankreg, (state->m_videoram2[offs] >> 5) + 8 * state->m_palreg, state->m_cocktail,state->m_cocktail, 8*sx,8*sy); - drawgfx_transpen(screen->machine().generic.tmpbitmap,0,screen->machine().gfx[1], + drawgfx_transpen(tmpbitmap,tmpbitmap.cliprect(),screen.machine().gfx[1], videoram[offs] + 256*state->m_bankreg, (videoram[offs] >> 5) + 8 * state->m_palreg, state->m_cocktail,state->m_cocktail, @@ -256,11 +243,11 @@ { int scrollx; - copybitmap(bitmap,screen->machine().generic.tmpbitmap,0,0,-66*8,0,&leftvisiblearea); - copybitmap(bitmap,screen->machine().generic.tmpbitmap,0,0,-30*8,0,&rightvisiblearea); + copybitmap(bitmap,tmpbitmap,0,0,-66*8,0,leftvisiblearea); + copybitmap(bitmap,tmpbitmap,0,0,-30*8,0,rightvisiblearea); scrollx = ( state->m_cocktail ) ? *state->m_scrollreg - 239 : -*state->m_scrollreg + 16; - copyscrollbitmap(bitmap,screen->machine().generic.tmpbitmap,1,&scrollx,0,0,&scrollvisiblearea); + copyscrollbitmap(bitmap,tmpbitmap,1,&scrollx,0,0,scrollvisiblearea); } return 0; } diff -Nru mame-0.144/src/mame/video/nbmj8688.c mame-0.145/src/mame/video/nbmj8688.c --- mame-0.144/src/mame/video/nbmj8688.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/nbmj8688.c 2012-02-06 21:30:31.000000000 +0000 @@ -259,7 +259,7 @@ static void update_pixel(nbmj8688_state *state, int x, int y) { int color = state->m_mjsikaku_videoram[(y * 512) + x]; - *BITMAP_ADDR16(state->m_mjsikaku_tmpbitmap, y, x) = color; + state->m_mjsikaku_tmpbitmap->pix16(y, x) = color; } static void writeram_low(nbmj8688_state *state, int x, int y, int color) @@ -549,7 +549,7 @@ static void common_video_start(running_machine &machine) { nbmj8688_state *state = machine.driver_data(); - state->m_mjsikaku_tmpbitmap = auto_bitmap_alloc(machine, 512, 256, machine.primary_screen->format()); + state->m_mjsikaku_tmpbitmap = auto_bitmap_ind16_alloc(machine, 512, 256); state->m_mjsikaku_videoram = auto_alloc_array_clear(machine, UINT16, 512 * 256); state->m_clut = auto_alloc_array(machine, UINT8, 0x20); @@ -676,9 +676,9 @@ ******************************************************************************/ -SCREEN_UPDATE( mbmj8688 ) +SCREEN_UPDATE_IND16( mbmj8688 ) { - nbmj8688_state *state = screen->machine().driver_data(); + nbmj8688_state *state = screen.machine().driver_data(); int x, y; if (state->m_mjsikaku_screen_refresh) @@ -699,20 +699,20 @@ if (state->m_mjsikaku_flipscreen) scrolly = state->m_mjsikaku_scrolly; else scrolly = (-state->m_mjsikaku_scrolly) & 0xff; - copybitmap(bitmap, state->m_mjsikaku_tmpbitmap, 0, 0, 0, scrolly, cliprect); - copybitmap(bitmap, state->m_mjsikaku_tmpbitmap, 0, 0, 0, scrolly - 256, cliprect); + copybitmap(bitmap, *state->m_mjsikaku_tmpbitmap, 0, 0, 0, scrolly, cliprect); + copybitmap(bitmap, *state->m_mjsikaku_tmpbitmap, 0, 0, 0, scrolly - 256, cliprect); } else - bitmap_fill(bitmap, 0, 0); + bitmap.fill(0); return 0; } -SCREEN_UPDATE( mbmj8688_lcd0 ) +SCREEN_UPDATE_IND16( mbmj8688_lcd0 ) { - nbmj8688_state *state = screen->machine().driver_data(); + nbmj8688_state *state = screen.machine().driver_data(); int x, y, b; for (y = 0;y < 64;y++) @@ -721,14 +721,14 @@ int data = state->m_HD61830B_ram[0][y * 60 + x]; for (b = 0;b < 8;b++) - *BITMAP_ADDR16(bitmap, y, (8*x+b)) = (data & (1<machine().driver_data(); + nbmj8688_state *state = screen.machine().driver_data(); int x, y, b; for (y = 0;y < 64;y++) @@ -737,7 +737,7 @@ int data = state->m_HD61830B_ram[1][y * 60 + x]; for (b = 0;b < 8;b++) - *BITMAP_ADDR16(bitmap, y, (8*x+b)) = (data & (1<(); UINT8 color = state->m_videoram0[(y * machine.primary_screen->width()) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap0, y, x) = color; + state->m_tmpbitmap0.pix16(y, x) = color; } static void update_pixel1(running_machine &machine, int x, int y) { nbmj8891_state *state = machine.driver_data(); UINT8 color = state->m_videoram1[(y * machine.primary_screen->width()) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap1, y, x) = (color == 0x7f) ? 0xff : color; + state->m_tmpbitmap1.pix16(y, x) = (color == 0x7f) ? 0xff : color; } static TIMER_CALLBACK( blitter_timer_callback ) @@ -499,7 +499,7 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap0 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap0); state->m_videoram0 = auto_alloc_array(machine, UINT8, width * height); state->m_palette = auto_alloc_array(machine, UINT8, 0x200); state->m_clut = auto_alloc_array(machine, UINT8, 0x800); @@ -516,8 +516,8 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap0 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap1 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap0); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap1); state->m_videoram0 = auto_alloc_array(machine, UINT8, width * height); state->m_videoram1 = auto_alloc_array(machine, UINT8, width * height); state->m_palette = auto_alloc_array(machine, UINT8, 0x200); @@ -531,25 +531,25 @@ ******************************************************************************/ -SCREEN_UPDATE( nbmj8891 ) +SCREEN_UPDATE_IND16( nbmj8891 ) { - nbmj8891_state *state = screen->machine().driver_data(); + nbmj8891_state *state = screen.machine().driver_data(); int x, y; if (state->m_screen_refresh) { - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); state->m_screen_refresh = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) - update_pixel0(screen->machine(), x, y); + update_pixel0(screen.machine(), x, y); if (state->m_gfxdraw_mode) for (y = 0; y < height; y++) for (x = 0; x < width; x++) - update_pixel1(screen->machine(), x, y); + update_pixel1(screen.machine(), x, y); } if (state->m_dispflag) @@ -567,7 +567,7 @@ copyscrollbitmap(bitmap, state->m_tmpbitmap0, 0, 0, 1, &scrolly, cliprect); } else - bitmap_fill(bitmap, 0, 0xff); + bitmap.fill(0xff); return 0; } diff -Nru mame-0.144/src/mame/video/nbmj8900.c mame-0.145/src/mame/video/nbmj8900.c --- mame-0.144/src/mame/video/nbmj8900.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/nbmj8900.c 2012-02-06 21:30:31.000000000 +0000 @@ -206,14 +206,14 @@ { nbmj8900_state *state = machine.driver_data(); UINT8 color = state->m_videoram0[(y * state->m_screen_width) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap0, y, x) = machine.pens[color]; + state->m_tmpbitmap0.pix16(y, x) = machine.pens[color]; } static void update_pixel1(running_machine &machine, int x, int y) { nbmj8900_state *state = machine.driver_data(); UINT8 color = state->m_videoram1[(y * state->m_screen_width) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap1, y, x) = machine.pens[color]; + state->m_tmpbitmap1.pix16(y, x) = machine.pens[color]; } static TIMER_CALLBACK( blitter_timer_callback ) @@ -383,8 +383,8 @@ state->m_screen_width = machine.primary_screen->width(); state->m_screen_height = machine.primary_screen->height(); - state->m_tmpbitmap0 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap1 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap0); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap1); state->m_videoram0 = auto_alloc_array(machine, UINT8, state->m_screen_width * state->m_screen_height); state->m_videoram1 = auto_alloc_array(machine, UINT8, state->m_screen_width * state->m_screen_height); state->m_palette = auto_alloc_array(machine, UINT8, 0x200); @@ -399,9 +399,9 @@ ******************************************************************************/ -SCREEN_UPDATE( nbmj8900 ) +SCREEN_UPDATE_IND16( nbmj8900 ) { - nbmj8900_state *state = screen->machine().driver_data(); + nbmj8900_state *state = screen.machine().driver_data(); int x, y; if (state->m_screen_refresh) @@ -411,7 +411,7 @@ { for (x = 0; x < state->m_screen_width; x++) { - update_pixel0(screen->machine(), x, y); + update_pixel0(screen.machine(), x, y); } } if (state->m_gfxdraw_mode) @@ -420,7 +420,7 @@ { for (x = 0; x < state->m_screen_width; x++) { - update_pixel1(screen->machine(), x, y); + update_pixel1(screen.machine(), x, y); } } } @@ -444,7 +444,7 @@ } else { - bitmap_fill(bitmap, 0, 0); + bitmap.fill(0); } return 0; } diff -Nru mame-0.144/src/mame/video/nbmj8991.c mame-0.145/src/mame/video/nbmj8991.c --- mame-0.144/src/mame/video/nbmj8991.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/nbmj8991.c 2012-02-06 21:30:31.000000000 +0000 @@ -172,7 +172,7 @@ { nbmj8991_state *state = machine.driver_data(); UINT8 color = state->m_videoram[(y * machine.primary_screen->width()) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap, y, x) = color; + state->m_tmpbitmap.pix16(y, x) = color; } static TIMER_CALLBACK( blitter_timer_callback ) @@ -296,27 +296,27 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); state->m_videoram = auto_alloc_array(machine, UINT8, width * height); state->m_clut = auto_alloc_array(machine, UINT8, 0x800); memset(state->m_videoram, 0x00, (width * height * sizeof(UINT8))); } -SCREEN_UPDATE( nbmj8991_type1 ) +SCREEN_UPDATE_IND16( nbmj8991_type1 ) { - nbmj8991_state *state = screen->machine().driver_data(); + nbmj8991_state *state = screen.machine().driver_data(); int x, y; if (state->m_screen_refresh) { - int width = screen->machine().primary_screen->width(); - int height = screen->machine().primary_screen->height(); + int width = screen.machine().primary_screen->width(); + int height = screen.machine().primary_screen->height(); state->m_screen_refresh = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) - update_pixel(screen->machine(), x, y); + update_pixel(screen.machine(), x, y); } if (state->m_dispflag) @@ -337,26 +337,26 @@ copyscrollbitmap(bitmap, state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); } else - bitmap_fill(bitmap, 0, 0); + bitmap.fill(0); return 0; } -SCREEN_UPDATE( nbmj8991_type2 ) +SCREEN_UPDATE_IND16( nbmj8991_type2 ) { - nbmj8991_state *state = screen->machine().driver_data(); + nbmj8991_state *state = screen.machine().driver_data(); int x, y; if (state->m_screen_refresh) { - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); state->m_screen_refresh = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) - update_pixel(screen->machine(), x, y); + update_pixel(screen.machine(), x, y); } if (nb1413m3_inputport & 0x20) @@ -377,7 +377,7 @@ copyscrollbitmap(bitmap, state->m_tmpbitmap, 1, &scrollx, 1, &scrolly, cliprect); } else - bitmap_fill(bitmap, 0, 0); + bitmap.fill(0); return 0; } diff -Nru mame-0.144/src/mame/video/nbmj9195.c mame-0.145/src/mame/video/nbmj9195.c --- mame-0.144/src/mame/video/nbmj9195.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/nbmj9195.c 2012-02-06 21:30:31.000000000 +0000 @@ -201,7 +201,7 @@ { nbmj9195_state *state = machine.driver_data(); UINT16 color = state->m_videoram[vram][(y * machine.primary_screen->width()) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap[vram], y, x) = color; + state->m_tmpbitmap[vram].pix16(y, x) = color; } static TIMER_CALLBACK( blitter_timer_callback ) @@ -394,7 +394,7 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[0]); state->m_videoram[0] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_palette = auto_alloc_array(machine, UINT8, 0x200); state->m_clut[0] = auto_alloc_array(machine, UINT8, 0x1000); @@ -409,8 +409,8 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap[1] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[0]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[1]); state->m_videoram[0] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_videoram[1] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_palette = auto_alloc_array(machine, UINT8, 0x200); @@ -427,8 +427,8 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap[1] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[0]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[1]); state->m_videoram[0] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_videoram[1] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_videoworkram[0] = auto_alloc_array_clear(machine, UINT16, width * height); @@ -445,27 +445,27 @@ ******************************************************************************/ -SCREEN_UPDATE( nbmj9195 ) +SCREEN_UPDATE_IND16( nbmj9195 ) { - nbmj9195_state *state = screen->machine().driver_data(); + nbmj9195_state *state = screen.machine().driver_data(); int i; int x, y; int scrolly[2]; if (state->m_screen_refresh) { - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); state->m_screen_refresh = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) { - update_pixel(screen->machine(), 0, x, y); + update_pixel(screen.machine(), 0, x, y); if (state->m_gfxdraw_mode) - update_pixel(screen->machine(), 1, x, y); + update_pixel(screen.machine(), 1, x, y); } } @@ -494,7 +494,7 @@ // nbmj9195 1layer copyscrollbitmap(bitmap, state->m_tmpbitmap[0], SCANLINE_MAX, state->m_scrollx_raster[0], 1, &scrolly[0], cliprect); else - bitmap_fill(bitmap, 0, 0x0ff); + bitmap.fill(0x0ff); if (state->m_dispflag[1]) { diff -Nru mame-0.144/src/mame/video/nemesis.c mame-0.145/src/mame/video/nemesis.c --- mame-0.144/src/mame/video/nemesis.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/nemesis.c 2012-02-06 21:30:31.000000000 +0000 @@ -46,7 +46,7 @@ else { SET_TILE_INFO( 0, 0, 0x00, 0 ); - tileinfo->pen_data = state->m_blank_tile; + tileinfo.pen_data = state->m_blank_tile; } mask = (code & 0x1000) >> 12; @@ -54,7 +54,7 @@ if (mask && !layer) layer = 1; - tileinfo->category = mask | (layer << 1); + tileinfo.category = mask | (layer << 1); } static TILE_GET_INFO( get_fg_tile_info ) @@ -82,7 +82,7 @@ else { SET_TILE_INFO( 0, 0, 0x00, 0 ); - tileinfo->pen_data = state->m_blank_tile; + tileinfo.pen_data = state->m_blank_tile; } mask = (code & 0x1000) >> 12; @@ -90,7 +90,7 @@ if (mask && !layer) layer = 1; - tileinfo->category = mask | (layer << 1); + tileinfo.category = mask | (layer << 1); } @@ -107,7 +107,7 @@ else state->m_tilemap_flip &= ~TILEMAP_FLIPX; - tilemap_set_flip_all(space->machine(), state->m_tilemap_flip); + space->machine().tilemap().set_flip_all(state->m_tilemap_flip); } if (ACCESSING_BITS_8_15) @@ -128,7 +128,7 @@ else state->m_tilemap_flip &= ~TILEMAP_FLIPY; - tilemap_set_flip_all(space->machine(), state->m_tilemap_flip); + space->machine().tilemap().set_flip_all(state->m_tilemap_flip); } } @@ -156,7 +156,7 @@ state->m_tilemap_flip &= ~TILEMAP_FLIPY; if (accessing_bits & 0x0c) - tilemap_set_flip_all(space->machine(), state->m_tilemap_flip); + space->machine().tilemap().set_flip_all(state->m_tilemap_flip); state->m_irq_port_last = data; } @@ -233,7 +233,7 @@ nemesis_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_videoram1 + offset); - tilemap_mark_tile_dirty(state->m_foreground, offset); + state->m_foreground->mark_tile_dirty(offset); } WRITE16_HANDLER( nemesis_videoram2_word_w ) @@ -241,7 +241,7 @@ nemesis_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_videoram2 + offset); - tilemap_mark_tile_dirty(state->m_background, offset); + state->m_background->mark_tile_dirty(offset); } WRITE16_HANDLER( nemesis_colorram1_word_w ) @@ -249,7 +249,7 @@ nemesis_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_colorram1 + offset); - tilemap_mark_tile_dirty(state->m_foreground, offset); + state->m_foreground->mark_tile_dirty(offset); } WRITE16_HANDLER( nemesis_colorram2_word_w ) @@ -257,7 +257,7 @@ nemesis_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_colorram2 + offset); - tilemap_mark_tile_dirty(state->m_background, offset); + state->m_background->mark_tile_dirty(offset); } @@ -297,8 +297,8 @@ gfx_element_mark_dirty(machine.gfx[sprite_data[i].char_type], offs * 4 / (w * h)); } } - tilemap_mark_all_tiles_dirty(state->m_background); - tilemap_mark_all_tiles_dirty(state->m_foreground); + state->m_background->mark_all_dirty(); + state->m_foreground->mark_all_dirty(); } @@ -312,10 +312,10 @@ state->m_background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_background, 0); - tilemap_set_transparent_pen(state->m_foreground, 0); - tilemap_set_scroll_rows(state->m_background, 256); - tilemap_set_scroll_rows(state->m_foreground, 256); + state->m_background->set_transparent_pen(0); + state->m_foreground->set_transparent_pen(0); + state->m_background->set_scroll_rows(256); + state->m_foreground->set_scroll_rows(256); memset(state->m_charram, 0, state->m_charram_size); memset(state->m_blank_tile, 0, ARRAY_LENGTH(state->m_blank_tile)); @@ -334,7 +334,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* * 16 bytes per sprite, in memory from 56000-56fff @@ -425,22 +425,22 @@ /******************************************************************************/ -SCREEN_UPDATE( nemesis ) +SCREEN_UPDATE_IND16( nemesis ) { - nemesis_state *state = screen->machine().driver_data(); + nemesis_state *state = screen.machine().driver_data(); int offs; rectangle clip; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); clip.min_x = 0; clip.max_x = 255; - tilemap_set_scroll_cols(state->m_background, 64); - tilemap_set_scroll_cols(state->m_foreground, 64); - tilemap_set_scroll_rows(state->m_background, 1); - tilemap_set_scroll_rows(state->m_foreground, 1); + state->m_background->set_scroll_cols(64); + state->m_foreground->set_scroll_cols(64); + state->m_background->set_scroll_rows(1); + state->m_foreground->set_scroll_rows(1); for (offs = 0; offs < 64; offs++) { @@ -449,11 +449,11 @@ if (state->m_flipscreen) offset_x = (offs + 0x20) & 0x3f; - tilemap_set_scrolly(state->m_background, offs, state->m_yscroll2[offset_x]); - tilemap_set_scrolly(state->m_foreground, offs, state->m_yscroll1[offset_x]); + state->m_background->set_scrolly(offs, state->m_yscroll2[offset_x]); + state->m_foreground->set_scrolly(offs, state->m_yscroll1[offset_x]); } - for (offs = cliprect->min_y; offs <= cliprect->max_y; offs++) + for (offs = cliprect.min_y; offs <= cliprect.max_y; offs++) { int i; int offset_y = offs; @@ -464,19 +464,19 @@ if (state->m_flipscreen) offset_y = 255 - offs; - tilemap_set_scrollx(state->m_background, 0, (state->m_xscroll2[offset_y] & 0xff) + ((state->m_xscroll2[0x100 + offset_y] & 0x01) << 8) - (state->m_flipscreen ? 0x107 : 0)); - tilemap_set_scrollx(state->m_foreground, 0, (state->m_xscroll1[offset_y] & 0xff) + ((state->m_xscroll1[0x100 + offset_y] & 0x01) << 8) - (state->m_flipscreen ? 0x107 : 0)); + state->m_background->set_scrollx(0, (state->m_xscroll2[offset_y] & 0xff) + ((state->m_xscroll2[0x100 + offset_y] & 0x01) << 8) - (state->m_flipscreen ? 0x107 : 0)); + state->m_foreground->set_scrollx(0, (state->m_xscroll1[offset_y] & 0xff) + ((state->m_xscroll1[0x100 + offset_y] & 0x01) << 8) - (state->m_flipscreen ? 0x107 : 0)); for (i = 0; i < 4; i += 2) { - tilemap_draw(bitmap, &clip, state->m_background, TILEMAP_DRAW_CATEGORY(i + 0), 1); - tilemap_draw(bitmap, &clip, state->m_background, TILEMAP_DRAW_CATEGORY(i + 1), 2); - tilemap_draw(bitmap, &clip, state->m_foreground, TILEMAP_DRAW_CATEGORY(i + 0), 1); - tilemap_draw(bitmap, &clip, state->m_foreground, TILEMAP_DRAW_CATEGORY(i + 1), 2); + state->m_background->draw(bitmap, clip, TILEMAP_DRAW_CATEGORY(i + 0), 1); + state->m_background->draw(bitmap, clip, TILEMAP_DRAW_CATEGORY(i + 1), 2); + state->m_foreground->draw(bitmap, clip, TILEMAP_DRAW_CATEGORY(i + 0), 1); + state->m_foreground->draw(bitmap, clip, TILEMAP_DRAW_CATEGORY(i + 1), 2); } } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/neogeo.c mame-0.145/src/mame/video/neogeo.c --- mame-0.144/src/mame/video/neogeo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/neogeo.c 2012-02-06 21:30:32.000000000 +0000 @@ -268,7 +268,7 @@ } -static void draw_fixed_layer( running_machine &machine, bitmap_t *bitmap, int scanline ) +static void draw_fixed_layer( running_machine &machine, bitmap_rgb32 &bitmap, int scanline ) { neogeo_state *state = machine.driver_data(); int x; @@ -276,7 +276,7 @@ UINT8* gfx_base = machine.region(state->m_fixed_layer_source ? "fixed" : "fixedbios")->base(); UINT32 addr_mask = machine.region(state->m_fixed_layer_source ? "fixed" : "fixedbios")->bytes() - 1; UINT16 *video_data = &state->m_videoram[0x7000 | (scanline >> 3)]; - UINT32 *pixel_addr = BITMAP_ADDR32(bitmap, scanline, NEOGEO_HBEND); + UINT32 *pixel_addr = &bitmap.pix32(scanline, NEOGEO_HBEND); int garouoffsets[32]; int banked = state->m_fixed_layer_source && (addr_mask > 0x1ffff); @@ -401,7 +401,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, int scanline ) +static void draw_sprites( running_machine &machine, bitmap_rgb32 &bitmap, int scanline ) { neogeo_state *state = machine.driver_data(); int sprite_index; @@ -540,7 +540,7 @@ { int i; - UINT32 *pixel_addr = BITMAP_ADDR32(bitmap, scanline, x + NEOGEO_HBEND); + UINT32 *pixel_addr = &bitmap.pix32(scanline, x + NEOGEO_HBEND); for (i = 0; i < 0x10; i++) { @@ -562,7 +562,7 @@ int i; int x_save = x; - UINT32 *pixel_addr = BITMAP_ADDR32(bitmap, scanline, NEOGEO_HBEND); + UINT32 *pixel_addr = &bitmap.pix32(scanline, NEOGEO_HBEND); for (i = 0; i < 0x10; i++) { @@ -920,16 +920,16 @@ * *************************************/ -SCREEN_UPDATE( neogeo ) +SCREEN_UPDATE_RGB32( neogeo ) { - neogeo_state *state = screen->machine().driver_data(); + neogeo_state *state = screen.machine().driver_data(); /* fill with background color first */ - bitmap_fill(bitmap, cliprect, state->m_pens[0x0fff]); + bitmap.fill(state->m_pens[0x0fff], cliprect); - draw_sprites(screen->machine(), bitmap, cliprect->min_y); + draw_sprites(screen.machine(), bitmap, cliprect.min_y); - draw_fixed_layer(screen->machine(), bitmap, cliprect->min_y); + draw_fixed_layer(screen.machine(), bitmap, cliprect.min_y); return 0; } diff -Nru mame-0.144/src/mame/video/news.c mame-0.145/src/mame/video/news.c --- mame-0.144/src/mame/video/news.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/news.c 2012-02-06 21:30:32.000000000 +0000 @@ -49,7 +49,7 @@ news_state *state = machine.driver_data(); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } @@ -67,7 +67,7 @@ news_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( news_bgram_w ) @@ -75,7 +75,7 @@ news_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( news_bgpic_w ) @@ -85,7 +85,7 @@ if (state->m_bgpic != data) { state->m_bgpic = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -97,10 +97,10 @@ ***************************************************************************/ -SCREEN_UPDATE( news ) +SCREEN_UPDATE_IND16( news ) { - news_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + news_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ninjakd2.c mame-0.145/src/mame/video/ninjakd2.c --- mame-0.144/src/mame/video/ninjakd2.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/ninjakd2.c 2012-02-06 21:30:31.000000000 +0000 @@ -70,7 +70,7 @@ return (col & 0x0f) | ((row & 0x1f) << 4) | ((col & 0x70) << 5); } -static void robokid_get_bg_tile_info(running_machine& machine, tile_data* const tileinfo, tilemap_memory_index const tile_index, int const gfxnum, const UINT8* const videoram) +static void robokid_get_bg_tile_info(running_machine& machine, tile_data& tileinfo, tilemap_memory_index const tile_index, int const gfxnum, const UINT8* const videoram) { int const lo = videoram[(tile_index << 1)]; int const hi = videoram[(tile_index << 1) | 1]; @@ -121,7 +121,7 @@ state->m_robokid_bg2_videoram = auto_alloc_array_clear(machine, UINT8, size); } - state->m_sp_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_sp_bitmap); } static int stencil_ninjakd2( UINT16 pal ); @@ -138,7 +138,7 @@ state->m_fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, ninjakd2_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, TRANSPARENTCODE); + state->m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE); state->m_robokid_sprites = 0; state->m_stencil_compare_function = stencil_ninjakd2; @@ -152,7 +152,7 @@ state->m_fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, TRANSPARENTCODE); + state->m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE); state->m_robokid_sprites = 0; state->m_stencil_compare_function = stencil_mnight; @@ -166,7 +166,7 @@ state->m_fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, TRANSPARENTCODE); + state->m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE); state->m_robokid_sprites = 0; state->m_stencil_compare_function = stencil_arkarea; @@ -184,9 +184,9 @@ state->m_bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, robokid_bg_scan, 16, 16, 32, 32); state->m_bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, robokid_bg_scan, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, TRANSPARENTCODE); - tilemap_set_transparent_pen(state->m_bg1_tilemap, TRANSPARENTCODE); - tilemap_set_transparent_pen(state->m_bg2_tilemap, TRANSPARENTCODE); + state->m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE); + state->m_bg1_tilemap->set_transparent_pen(TRANSPARENTCODE); + state->m_bg2_tilemap->set_transparent_pen(TRANSPARENTCODE); state->m_robokid_sprites = 1; state->m_stencil_compare_function = stencil_robokid; @@ -204,10 +204,10 @@ state->m_bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, omegaf_bg_scan, 16, 16, 128, 32); state->m_bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, omegaf_bg_scan, 16, 16, 128, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, TRANSPARENTCODE); - tilemap_set_transparent_pen(state->m_bg0_tilemap, TRANSPARENTCODE); - tilemap_set_transparent_pen(state->m_bg1_tilemap, TRANSPARENTCODE); - tilemap_set_transparent_pen(state->m_bg2_tilemap, TRANSPARENTCODE); + state->m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE); + state->m_bg0_tilemap->set_transparent_pen(TRANSPARENTCODE); + state->m_bg1_tilemap->set_transparent_pen(TRANSPARENTCODE); + state->m_bg2_tilemap->set_transparent_pen(TRANSPARENTCODE); state->m_robokid_sprites = 1; state->m_stencil_compare_function = stencil_omegaf; @@ -225,14 +225,14 @@ { ninjakd2_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } WRITE8_HANDLER( ninjakd2_fgvideoram_w ) { ninjakd2_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } @@ -279,7 +279,7 @@ int const address = (state->m_robokid_bg0_bank << 10 ) | offset; state->m_robokid_bg0_videoram[address] = data; - tilemap_mark_tile_dirty(state->m_bg0_tilemap, address >> 1); + state->m_bg0_tilemap->mark_tile_dirty(address >> 1); } WRITE8_HANDLER( robokid_bg1_videoram_w ) @@ -288,7 +288,7 @@ int const address = (state->m_robokid_bg1_bank << 10 ) | offset; state->m_robokid_bg1_videoram[address] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, address >> 1); + state->m_bg1_tilemap->mark_tile_dirty(address >> 1); } WRITE8_HANDLER( robokid_bg2_videoram_w ) @@ -297,15 +297,15 @@ int const address = (state->m_robokid_bg2_bank << 10 ) | offset; state->m_robokid_bg2_videoram[address] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, address >> 1); + state->m_bg2_tilemap->mark_tile_dirty(address >> 1); } static void bg_ctrl(int offset, int data, tilemap_t* tilemap) { - int scrollx = tilemap_get_scrollx(tilemap, 0); - int scrolly = tilemap_get_scrolly(tilemap, 0); + int scrollx = tilemap->scrollx(0); + int scrolly = tilemap->scrolly(0); switch (offset) { @@ -313,11 +313,11 @@ case 1: scrollx = ((scrollx & 0x0ff) | (data << 8)); break; case 2: scrolly = ((scrolly & 0x100) | data); break; case 3: scrolly = ((scrolly & 0x0ff) | (data << 8)); break; - case 4: tilemap_set_enable(tilemap, data & 1); break; + case 4: tilemap->enable(data & 1); break; } - tilemap_set_scrollx(tilemap, 0, scrollx); - tilemap_set_scrolly(tilemap, 0, scrolly); + tilemap->set_scrollx(0, scrollx); + tilemap->set_scrolly(0, scrolly); } WRITE8_HANDLER( ninjakd2_bg_ctrl_w ) @@ -360,7 +360,7 @@ * *************************************/ -static void draw_sprites(running_machine& machine, bitmap_t* bitmap) +static void draw_sprites(running_machine& machine, bitmap_ind16 &bitmap) { ninjakd2_state *state = machine.driver_data(); const gfx_element* const gfx = machine.gfx[1]; @@ -413,7 +413,7 @@ { int const tile = code ^ (x << big_xshift) ^ (y << big_yshift); - drawgfx_transpen(bitmap, 0, gfx, + drawgfx_transpen(bitmap, bitmap.cliprect(), gfx, tile, color, flipx,flipy, @@ -452,18 +452,18 @@ // This is very hackish. // (Is there a possibility that software can't select it but hardware can?) -static void erase_sprites(running_machine& machine, bitmap_t* bitmap, const rectangle* cliprect) +static void erase_sprites(running_machine& machine, bitmap_ind16 &bitmap) { ninjakd2_state *state = machine.driver_data(); // if sprite overdraw is disabled, clear the sprite framebuffer if (!state->m_next_sprite_overdraw_enabled) - bitmap_fill(state->m_sp_bitmap, cliprect, TRANSPARENTCODE); + state->m_sp_bitmap.fill(TRANSPARENTCODE); else - for (int y = 0; y < state->m_sp_bitmap->height; ++y) + for (int y = 0; y < state->m_sp_bitmap.height(); ++y) { - for (int x = 0; x < state->m_sp_bitmap->width; ++x) + for (int x = 0; x < state->m_sp_bitmap.width(); ++x) { - UINT16* const ptr = BITMAP_ADDR16(state->m_sp_bitmap, y, x); + UINT16* const ptr = &state->m_sp_bitmap.pix16(y, x); if ( (*state->m_stencil_compare_function)(*ptr) ) *ptr = TRANSPARENTCODE ; } @@ -474,7 +474,7 @@ static void update_sprites(running_machine& machine) { ninjakd2_state *state = machine.driver_data(); - erase_sprites(machine, state->m_sp_bitmap, 0); + erase_sprites(machine, state->m_sp_bitmap); draw_sprites(machine, state->m_sp_bitmap); } ////// Before modified, this was written. @@ -484,73 +484,77 @@ ////// The glitch is correct behavior. -SCREEN_UPDATE( ninjakd2 ) +SCREEN_UPDATE_IND16( ninjakd2 ) { - ninjakd2_state *state = screen->machine().driver_data(); + ninjakd2_state *state = screen.machine().driver_data(); // updating sprites here instead than in screen_eof avoids a palette glitch // at the end of the "rainbow sky" screens. - update_sprites(screen->machine()); + update_sprites(screen.machine()); state->m_sprites_updated = 1; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); copybitmap_trans(bitmap, state->m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( robokid ) +SCREEN_UPDATE_IND16( robokid ) { - ninjakd2_state *state = screen->machine().driver_data(); - update_sprites(screen->machine()); + ninjakd2_state *state = screen.machine().driver_data(); + update_sprites(screen.machine()); state->m_sprites_updated = 1; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg0_tilemap, 0, 0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); copybitmap_trans(bitmap, state->m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( omegaf ) +SCREEN_UPDATE_IND16( omegaf ) { - ninjakd2_state *state = screen->machine().driver_data(); - update_sprites(screen->machine()); + ninjakd2_state *state = screen.machine().driver_data(); + update_sprites(screen.machine()); state->m_sprites_updated = 1; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg0_tilemap, 0, 0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); copybitmap_trans(bitmap, state->m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( ninjakd2 ) +SCREEN_VBLANK( ninjakd2 ) { - ninjakd2_state *state = machine.driver_data(); - if (!state->m_sprites_updated) - update_sprites(machine); + // rising edge + if (vblank_on) + { + ninjakd2_state *state = screen.machine().driver_data(); + if (!state->m_sprites_updated) + update_sprites(screen.machine()); - state->m_sprites_updated = 0; + state->m_sprites_updated = 0; + } } diff -Nru mame-0.144/src/mame/video/ninjaw.c mame-0.145/src/mame/video/ninjaw.c --- mame-0.144/src/mame/video/ninjaw.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ninjaw.c 2012-02-06 21:30:31.000000000 +0000 @@ -16,7 +16,7 @@ SPRITE DRAW ROUTINE ************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int primask, int x_offs, int y_offs ) { ninjaw_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -97,28 +97,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( ninjaw ) +static UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs, device_t *tc0100scn) { - ninjaw_state *state = screen->machine().driver_data(); - int xoffs = 0; UINT8 layer[3], nodraw; - device_t *tc0100scn = NULL; - - if (screen == state->m_lscreen) - { - xoffs = 36 * 8 * 0; - tc0100scn = state->m_tc0100scn_1; - } - else if (screen == state->m_mscreen) - { - xoffs = 36 * 8 * 1; - tc0100scn = state->m_tc0100scn_2; - } - else if (screen == state->m_rscreen) - { - xoffs = 36 * 8 * 2; - tc0100scn = state->m_tc0100scn_3; - } tc0100scn_tilemap_update(tc0100scn); @@ -132,17 +113,21 @@ /* Ensure screen blanked even when bottom layers not drawn due to disable bit */ if (nodraw) - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* Sprites can be under/over the layer below text layer */ - draw_sprites(screen->machine(), bitmap, cliprect, 1, xoffs, 8); // draw sprites with priority 1 which are under the mid layer + draw_sprites(screen.machine(), bitmap, cliprect, 1, xoffs, 8); // draw sprites with priority 1 which are under the mid layer // draw middle layer tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[1], 0, 0); - draw_sprites(screen->machine(),bitmap,cliprect,0,xoffs,8); // draw sprites with priority 0 which are over the mid layer + draw_sprites(screen.machine(),bitmap,cliprect,0,xoffs,8); // draw sprites with priority 0 which are over the mid layer // draw top(text) layer tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[2], 0, 0); return 0; } + +SCREEN_UPDATE_IND16( ninjaw_left ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 0, screen.machine().driver_data()->m_tc0100scn_1); } +SCREEN_UPDATE_IND16( ninjaw_middle ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 1, screen.machine().driver_data()->m_tc0100scn_2); } +SCREEN_UPDATE_IND16( ninjaw_right ) { return update_screen(screen, bitmap, cliprect, 36 * 8 * 2, screen.machine().driver_data()->m_tc0100scn_3); } diff -Nru mame-0.144/src/mame/video/nitedrvr.c mame-0.145/src/mame/video/nitedrvr.c --- mame-0.144/src/mame/video/nitedrvr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/nitedrvr.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,7 +12,7 @@ nitedrvr_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( nitedrvr_hvc_w ) @@ -41,7 +41,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_box( bitmap_t *bitmap, int bx, int by, int ex, int ey ) +static void draw_box( bitmap_ind16 &bitmap, int bx, int by, int ex, int ey ) { int x, y; @@ -49,13 +49,13 @@ { for (x = bx; x < ex; x++) if ((y < 256) && (x < 256)) - *BITMAP_ADDR16(bitmap, y, x) = 1; + bitmap.pix16(y, x) = 1; } return; } -static void draw_roadway( running_machine &machine, bitmap_t *bitmap ) +static void draw_roadway( running_machine &machine, bitmap_ind16 &bitmap ) { nitedrvr_state *state = machine.driver_data(); int roadway; @@ -73,11 +73,11 @@ } } -SCREEN_UPDATE( nitedrvr ) +SCREEN_UPDATE_IND16( nitedrvr ) { - nitedrvr_state *state = screen->machine().driver_data(); + nitedrvr_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_roadway(screen->machine(), bitmap); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_roadway(screen.machine(), bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/niyanpai.c mame-0.145/src/mame/video/niyanpai.c --- mame-0.144/src/mame/video/niyanpai.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/niyanpai.c 2012-02-06 21:30:32.000000000 +0000 @@ -170,7 +170,7 @@ { niyanpai_state *state = machine.driver_data(); UINT16 color = state->m_videoram[vram][(y * machine.primary_screen->width()) + x]; - *BITMAP_ADDR16(state->m_tmpbitmap[vram], y, x) = color; + state->m_tmpbitmap[vram].pix16(y, x) = color; } static TIMER_CALLBACK( blitter_timer_callback ) @@ -365,9 +365,9 @@ int width = machine.primary_screen->width(); int height = machine.primary_screen->height(); - state->m_tmpbitmap[0] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap[1] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_tmpbitmap[2] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[0]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[1]); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap[2]); state->m_videoram[0] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_videoram[1] = auto_alloc_array_clear(machine, UINT16, width * height); state->m_videoram[2] = auto_alloc_array_clear(machine, UINT16, width * height); @@ -385,26 +385,26 @@ ******************************************************************************/ -SCREEN_UPDATE( niyanpai ) +SCREEN_UPDATE_IND16( niyanpai ) { - niyanpai_state *state = screen->machine().driver_data(); + niyanpai_state *state = screen.machine().driver_data(); int i; int x, y; int scrollx[3], scrolly[3]; if (state->m_screen_refresh) { - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); state->m_screen_refresh = 0; for (y = 0; y < height; y++) for (x = 0; x < width; x++) { - update_pixel(screen->machine(), 0, x, y); - update_pixel(screen->machine(), 1, x, y); - update_pixel(screen->machine(), 2, x, y); + update_pixel(screen.machine(), 0, x, y); + update_pixel(screen.machine(), 1, x, y); + update_pixel(screen.machine(), 2, x, y); } } @@ -425,7 +425,7 @@ if (state->m_dispflag[0]) copyscrollbitmap(bitmap, state->m_tmpbitmap[0], 1, &scrollx[0], 1, &scrolly[0], cliprect); else - bitmap_fill(bitmap, 0, 0x00ff); + bitmap.fill(0x00ff); if (state->m_dispflag[1]) copyscrollbitmap_trans(bitmap, state->m_tmpbitmap[1], 1, &scrollx[1], 1, &scrolly[1], cliprect, 0x01ff); diff -Nru mame-0.144/src/mame/video/nmk16.c mame-0.145/src/mame/video/nmk16.c --- mame-0.144/src/mame/video/nmk16.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/nmk16.c 2012-02-06 21:30:32.000000000 +0000 @@ -134,11 +134,11 @@ state->m_bg_tilemap0 = tilemap_create(machine, macross_get_bg0_tile_info, afega_tilemap_scan_pages,16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); state->m_tx_tilemap = tilemap_create(machine, macross_get_tx_tile_info,tilemap_scan_cols,8,8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap0,15); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_bg_tilemap0->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); nmk16_video_init(machine); - state->m_background_bitmap = auto_bitmap_alloc(machine,8192,512,machine.primary_screen->format()); + state->m_background_bitmap = auto_bitmap_ind16_alloc(machine,8192,512); state->m_bioship_background_bank=0; state->m_redraw_bitmap = 1; @@ -151,8 +151,8 @@ state->m_fg_tilemap = tilemap_create(machine, strahl_get_fg_tile_info, afega_tilemap_scan_pages,16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); state->m_tx_tilemap = tilemap_create(machine, macross_get_tx_tile_info,tilemap_scan_cols,8,8,32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,15); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); nmk16_video_init(machine); } @@ -163,7 +163,7 @@ state->m_bg_tilemap0 = tilemap_create(machine, macross_get_bg0_tile_info, afega_tilemap_scan_pages,16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); state->m_tx_tilemap = tilemap_create(machine, macross_get_tx_tile_info,tilemap_scan_cols,8,8,32,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_tx_tilemap->set_transparent_pen(15); nmk16_video_init(machine); } @@ -174,8 +174,8 @@ state->m_bg_tilemap0 = tilemap_create(machine, macross_get_bg0_tile_info, afega_tilemap_scan_pages,16,16,TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); state->m_tx_tilemap = tilemap_create(machine, macross_get_tx_tile_info,tilemap_scan_cols,8,8,64,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); - tilemap_set_scroll_rows(state->m_bg_tilemap0,512); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_bg_tilemap0->set_scroll_rows(512); nmk16_video_init(machine); state->m_videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ @@ -193,7 +193,7 @@ state->m_tx_tilemap = tilemap_create(machine, macross_get_tx_tile_info,tilemap_scan_cols,8,8,64,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_tx_tilemap->set_transparent_pen(15); nmk16_video_init(machine); state->m_videoshift = 64; /* 384x224 screen, leftmost 64 pixels have to be retrieved */ @@ -229,42 +229,42 @@ { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_bgvideoram0[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap0,offset); + state->m_bg_tilemap0->mark_tile_dirty(offset); } WRITE16_HANDLER( nmk_bgvideoram1_w ) { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_bgvideoram1[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap1,offset); + state->m_bg_tilemap1->mark_tile_dirty(offset); } WRITE16_HANDLER( nmk_bgvideoram2_w ) { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_bgvideoram2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap2,offset); + state->m_bg_tilemap2->mark_tile_dirty(offset); } WRITE16_HANDLER( nmk_bgvideoram3_w ) { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_bgvideoram3[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap3,offset); + state->m_bg_tilemap3->mark_tile_dirty(offset); } WRITE16_HANDLER( nmk_fgvideoram_w ) { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_fgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( nmk_txvideoram_w ) { nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_nmk_txvideoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -293,7 +293,7 @@ break; } - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_mustang_bg_xscroll - state->m_videoshift); + state->m_bg_tilemap0->set_scrollx(0,state->m_mustang_bg_xscroll - state->m_videoshift); } WRITE16_HANDLER( bioshipbg_scroll_w ) @@ -305,9 +305,9 @@ state->m_scroll[offset] = (data >> 8) & 0xff; if (offset & 2) - tilemap_set_scrolly(state->m_bg_tilemap0,0,state->m_scroll[2] * 256 + state->m_scroll[3]); + state->m_bg_tilemap0->set_scrolly(0,state->m_scroll[2] * 256 + state->m_scroll[3]); else - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_scroll[0] * 256 + state->m_scroll[1] - state->m_videoshift); + state->m_bg_tilemap0->set_scrollx(0,state->m_scroll[0] * 256 + state->m_scroll[1] - state->m_videoshift); } } @@ -320,9 +320,9 @@ state->m_scroll[offset] = data & 0xff; if (offset & 2) - tilemap_set_scrolly(state->m_bg_tilemap0,0,state->m_scroll[2] * 256 + state->m_scroll[3]); + state->m_bg_tilemap0->set_scrolly(0,state->m_scroll[2] * 256 + state->m_scroll[3]); else - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_scroll[0] * 256 + state->m_scroll[1] - state->m_videoshift); + state->m_bg_tilemap0->set_scrollx(0,state->m_scroll[0] * 256 + state->m_scroll[1] - state->m_videoshift); } } @@ -335,9 +335,9 @@ state->m_scroll_2[offset] = data & 0xff; if (offset & 2) - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll_2[2] * 256 + state->m_scroll_2[3]); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll_2[2] * 256 + state->m_scroll_2[3]); else - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll_2[0] * 256 + state->m_scroll_2[1] - state->m_videoshift); + state->m_fg_tilemap->set_scrollx(0,state->m_scroll_2[0] * 256 + state->m_scroll_2[1] - state->m_videoshift); } } @@ -347,8 +347,8 @@ state->m_vscroll[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_vscroll[0] * 256 + (state->m_vscroll[1] >> 8)); - tilemap_set_scrolly(state->m_bg_tilemap0,0,state->m_vscroll[2] * 256 + (state->m_vscroll[3] >> 8)); + state->m_bg_tilemap0->set_scrollx(0,state->m_vscroll[0] * 256 + (state->m_vscroll[1] >> 8)); + state->m_bg_tilemap0->set_scrolly(0,state->m_vscroll[2] * 256 + (state->m_vscroll[3] >> 8)); } WRITE16_HANDLER( vandykeb_scroll_w ) @@ -363,8 +363,8 @@ case 6: COMBINE_DATA(&state->m_vscroll[0]); break; } - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_vscroll[0] * 256 + (state->m_vscroll[1] >> 8)); - tilemap_set_scrolly(state->m_bg_tilemap0,0,state->m_vscroll[2] * 256 + (state->m_vscroll[3] >> 8)); + state->m_bg_tilemap0->set_scrollx(0,state->m_vscroll[0] * 256 + (state->m_vscroll[1] >> 8)); + state->m_bg_tilemap0->set_scrolly(0,state->m_vscroll[2] * 256 + (state->m_vscroll[3] >> 8)); } WRITE16_HANDLER( manybloc_scroll_w ) @@ -372,8 +372,8 @@ nmk16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_gunnail_scrollram[offset]); - tilemap_set_scrollx(state->m_bg_tilemap0,0,state->m_gunnail_scrollram[0x82/2]-state->m_videoshift); - tilemap_set_scrolly(state->m_bg_tilemap0,0,state->m_gunnail_scrollram[0xc2/2]); + state->m_bg_tilemap0->set_scrollx(0,state->m_gunnail_scrollram[0x82/2]-state->m_videoshift); + state->m_bg_tilemap0->set_scrolly(0,state->m_gunnail_scrollram[0xc2/2]); } WRITE16_HANDLER( nmk_flipscreen_w ) @@ -390,7 +390,7 @@ if (state->m_bgbank != (data & 0xff)) { state->m_bgbank = data & 0xff; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap0); + state->m_bg_tilemap0->mark_all_dirty(); } } } @@ -425,7 +425,7 @@ // manybloc uses extra flip bits on the sprites, but these break other games -static void nmk16_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void nmk16_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { nmk16_state *state = machine.driver_data(); int offs; @@ -476,7 +476,7 @@ } } -static void nmk16_draw_sprites_flipsupported(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void nmk16_draw_sprites_flipsupported(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { nmk16_state *state = machine.driver_data(); int offs; @@ -540,107 +540,107 @@ } -SCREEN_UPDATE( macross ) +SCREEN_UPDATE_IND16( macross ) { - nmk16_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + nmk16_state *state = screen.machine().driver_data(); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( tdragon ) +SCREEN_UPDATE_IND16( tdragon ) { - nmk16_state *state = screen->machine().driver_data(); -// mcu_run(screen->machine(), 1); + nmk16_state *state = screen.machine().driver_data(); +// mcu_run(screen.machine(), 1); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( hachamf ) +SCREEN_UPDATE_IND16( hachamf ) { - nmk16_state *state = screen->machine().driver_data(); -// mcu_run(screen->machine(), 0); + nmk16_state *state = screen.machine().driver_data(); +// mcu_run(screen.machine(), 0); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( manybloc ) +SCREEN_UPDATE_IND16( manybloc ) { - nmk16_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + nmk16_state *state = screen.machine().driver_data(); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( tharrier ) +SCREEN_UPDATE_IND16( tharrier ) { - nmk16_state *state = screen->machine().driver_data(); + nmk16_state *state = screen.machine().driver_data(); /* I think the protection device probably copies this to the regs... */ UINT16 tharrier_scroll = state->m_mainram[0x9f00/2]; - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); - tilemap_set_scrollx(state->m_bg_tilemap0,0,tharrier_scroll); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); - - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,0); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); + state->m_bg_tilemap0->set_scrollx(0,tharrier_scroll); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); + + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( gunnail ) +SCREEN_UPDATE_IND16( gunnail ) { - nmk16_state *state = screen->machine().driver_data(); + nmk16_state *state = screen.machine().driver_data(); int y1; int i=16; - rectangle bgclip = *cliprect; + rectangle bgclip = cliprect; // the hardware supports per-scanline X *and* Y scroll which isn't // supported by tilemaps so we have to draw the tilemap one line at a time - y1 = cliprect->min_y; + y1 = cliprect.min_y; if (!state->m_simple_scroll) { - while (y1 <= cliprect->max_y) + while (y1 <= cliprect.max_y) { int const yscroll = state->m_gunnail_scrollramy[0] + state->m_gunnail_scrollramy[y1]; int tilemap_bank_select; @@ -659,12 +659,12 @@ case 3: if (state->m_bg_tilemap3) bg_tilemap = state->m_bg_tilemap3; break; } - tilemap_set_scroll_rows(bg_tilemap,512); + bg_tilemap->set_scroll_rows(512); - tilemap_set_scrolly(bg_tilemap, 0, yscroll); - tilemap_set_scrollx(bg_tilemap,(i + yscroll) & 0x1ff, state->m_gunnail_scrollram[0] + state->m_gunnail_scrollram[i] - state->m_videoshift); + bg_tilemap->set_scrolly(0, yscroll); + bg_tilemap->set_scrollx((i + yscroll) & 0x1ff, state->m_gunnail_scrollram[0] + state->m_gunnail_scrollram[i] - state->m_videoshift); - tilemap_draw(bitmap,&bgclip,bg_tilemap,0,0); + bg_tilemap->draw(bitmap, bgclip, 0,0); y1++; i++; @@ -688,32 +688,32 @@ case 3: if (state->m_bg_tilemap3) bg_tilemap = state->m_bg_tilemap3; break; } - tilemap_set_scroll_rows(bg_tilemap,1); + bg_tilemap->set_scroll_rows(1); - tilemap_set_scrolly(bg_tilemap, 0, yscroll); - tilemap_set_scrollx(bg_tilemap, 0, xscroll - state->m_videoshift); + bg_tilemap->set_scrolly(0, yscroll); + bg_tilemap->set_scrollx(0, xscroll - state->m_videoshift); - tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); + bg_tilemap->draw(bitmap, cliprect, 0,0); } - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( bioship ) +SCREEN_UPDATE_IND16( bioship ) { - nmk16_state *state = screen->machine().driver_data(); - UINT16 *tilerom = (UINT16 *)screen->machine().region("gfx5")->base(); + nmk16_state *state = screen.machine().driver_data(); + UINT16 *tilerom = (UINT16 *)screen.machine().region("gfx5")->base(); int scrollx=-(state->m_bioship_scroll[1] + state->m_bioship_scroll[0]*256); int scrolly=-(state->m_bioship_scroll[3] + state->m_bioship_scroll[2]*256); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); if (state->m_redraw_bitmap) { @@ -727,7 +727,7 @@ int numtile = data&0xfff; int color = (data&0xf000)>>12; - drawgfx_opaque(state->m_background_bitmap,0,screen->machine().gfx[3], + drawgfx_opaque(*state->m_background_bitmap,state->m_background_bitmap->cliprect(),screen.machine().gfx[3], numtile, color, 0,0, /* no flip */ @@ -736,7 +736,7 @@ data = tilerom[offs+0x1000+bank]; numtile = data&0xfff; color = (data&0xf000)>>12; - drawgfx_opaque(state->m_background_bitmap,0,screen->machine().gfx[3], + drawgfx_opaque(*state->m_background_bitmap,state->m_background_bitmap->cliprect(),screen.machine().gfx[3], numtile, color, 0,0, /* no flip */ @@ -747,75 +747,83 @@ } } - copyscrollbitmap(bitmap,state->m_background_bitmap,1,&scrollx,1,&scrolly,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + copyscrollbitmap(bitmap,*state->m_background_bitmap,1,&scrollx,1,&scrolly,cliprect); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( strahl ) +SCREEN_UPDATE_IND16( strahl ) { - nmk16_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_tx_tilemap,0,-state->m_videoshift); + nmk16_state *state = screen.machine().driver_data(); + state->m_tx_tilemap->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( bjtwin ) +SCREEN_UPDATE_IND16( bjtwin ) { - nmk16_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap0,0,-state->m_videoshift); + nmk16_state *state = screen.machine().driver_data(); + state->m_bg_tilemap0->set_scrollx(0,-state->m_videoshift); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites(screen.machine(), bitmap,cliprect,0); return 0; } -SCREEN_EOF( nmk ) +SCREEN_VBLANK( nmk ) { - nmk16_state *state = machine.driver_data(); - /* sprites are DMA'd from Main RAM to a private buffer automatically - (or at least this is how I interpret the datasheet) */ + // rising edge + if (vblank_on) + { + nmk16_state *state = screen.machine().driver_data(); + /* sprites are DMA'd from Main RAM to a private buffer automatically + (or at least this is how I interpret the datasheet) */ - /* -- I actually see little evidence to support this, sprite lag - in some games should be checked on real boards */ + /* -- I actually see little evidence to support this, sprite lag + in some games should be checked on real boards */ -// memcpy(state->m_spriteram_old2,state->m_spriteram_old,0x1000); - memcpy(state->m_spriteram_old2,state->m_mainram+0x8000/2,0x1000); + // memcpy(state->m_spriteram_old2,state->m_spriteram_old,0x1000); + memcpy(state->m_spriteram_old2,state->m_mainram+0x8000/2,0x1000); + } } -SCREEN_EOF( strahl ) +SCREEN_VBLANK( strahl ) { - nmk16_state *state = machine.driver_data(); - /* sprites are DMA'd from Main RAM to a private buffer automatically - (or at least this is how I interpret the datasheet) */ + // rising edge + if (vblank_on) + { + nmk16_state *state = screen.machine().driver_data(); + /* sprites are DMA'd from Main RAM to a private buffer automatically + (or at least this is how I interpret the datasheet) */ - /* -- I actually see little evidence to support this, sprite lag - in some games should be checked on real boards */ + /* -- I actually see little evidence to support this, sprite lag + in some games should be checked on real boards */ - /* strahl sprites are allocated in memory range FF000-FFFFF */ + /* strahl sprites are allocated in memory range FF000-FFFFF */ - memcpy(state->m_spriteram_old2,state->m_mainram+0xF000/2,0x1000); + memcpy(state->m_spriteram_old2,state->m_mainram+0xF000/2,0x1000); + } } @@ -844,7 +852,7 @@ 8,8, 32,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0xf); + state->m_tx_tilemap->set_transparent_pen(0xf); } @@ -865,7 +873,7 @@ 8,8, 32,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0xf); + state->m_tx_tilemap->set_transparent_pen(0xf); } @@ -886,7 +894,7 @@ 8,8, 32,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0xf); + state->m_tx_tilemap->set_transparent_pen(0xf); } @@ -898,7 +906,7 @@ ***************************************************************************/ -static void video_update(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void video_update(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int dsw_flipscreen, // 1 = Horizontal and vertical screen flip are hardwired to 2 dip switches int xoffset, int yoffset, // bg_tilemap0 offsets int attr_mask // "sprite active" mask @@ -916,32 +924,32 @@ } - tilemap_set_scrollx(state->m_bg_tilemap0, 0, state->m_afega_scroll_0[1] + xoffset); - tilemap_set_scrolly(state->m_bg_tilemap0, 0, state->m_afega_scroll_0[0] + yoffset); + state->m_bg_tilemap0->set_scrollx(0, state->m_afega_scroll_0[1] + xoffset); + state->m_bg_tilemap0->set_scrolly(0, state->m_afega_scroll_0[0] + yoffset); - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_afega_scroll_1[1]); - tilemap_set_scrolly(state->m_tx_tilemap, 0, state->m_afega_scroll_1[0]); + state->m_tx_tilemap->set_scrollx(0, state->m_afega_scroll_1[1]); + state->m_tx_tilemap->set_scrolly(0, state->m_afega_scroll_1[0]); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,3); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,2); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,1); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); } -static void redhawki_video_update(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void redhawki_video_update(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { nmk16_state *state = machine.driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap0, 0, state->m_afega_scroll_1[0]&0xff); - tilemap_set_scrolly(state->m_bg_tilemap0, 0, state->m_afega_scroll_1[1]&0xff); + state->m_bg_tilemap0->set_scrollx(0, state->m_afega_scroll_1[0]&0xff); + state->m_bg_tilemap0->set_scrolly(0, state->m_afega_scroll_1[1]&0xff); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,3); nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,2); @@ -949,25 +957,25 @@ nmk16_draw_sprites_flipsupported(machine, bitmap,cliprect,0); } -SCREEN_UPDATE( afega ) { video_update(screen->machine(),bitmap,cliprect, 1, -0x100,+0x000, 0x0001); return 0; } -SCREEN_UPDATE( bubl2000 ) { video_update(screen->machine(),bitmap,cliprect, 0, -0x100,+0x000, 0x0001); return 0; } // no flipscreen support, I really would confirmation from the schematics -SCREEN_UPDATE( redhawkb ) { video_update(screen->machine(),bitmap,cliprect, 0, +0x000,+0x100, 0x0001); return 0; } -SCREEN_UPDATE( redhawki ) { redhawki_video_update(screen->machine(),bitmap,cliprect); return 0;} // strange scroll regs +SCREEN_UPDATE_IND16( afega ) { video_update(screen.machine(),bitmap,cliprect, 1, -0x100,+0x000, 0x0001); return 0; } +SCREEN_UPDATE_IND16( bubl2000 ) { video_update(screen.machine(),bitmap,cliprect, 0, -0x100,+0x000, 0x0001); return 0; } // no flipscreen support, I really would confirmation from the schematics +SCREEN_UPDATE_IND16( redhawkb ) { video_update(screen.machine(),bitmap,cliprect, 0, +0x000,+0x100, 0x0001); return 0; } +SCREEN_UPDATE_IND16( redhawki ) { redhawki_video_update(screen.machine(),bitmap,cliprect); return 0;} // strange scroll regs -SCREEN_UPDATE( firehawk ) +SCREEN_UPDATE_IND16( firehawk ) { - nmk16_state *state = screen->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap0, 0, state->m_afega_scroll_1[1] + 0x100); - tilemap_set_scrollx(state->m_bg_tilemap0, 0, state->m_afega_scroll_1[0]); + nmk16_state *state = screen.machine().driver_data(); + state->m_bg_tilemap0->set_scrolly(0, state->m_afega_scroll_1[1] + 0x100); + state->m_bg_tilemap0->set_scrollx(0, state->m_afega_scroll_1[0]); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap0,0,0); + state->m_bg_tilemap0->draw(bitmap, cliprect, 0,0); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,3); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,2); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,1); - nmk16_draw_sprites_flipsupported(screen->machine(), bitmap,cliprect,0); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,3); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,2); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,1); + nmk16_draw_sprites_flipsupported(screen.machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/nova2001.c mame-0.145/src/mame/video/nova2001.c --- mame-0.144/src/mame/video/nova2001.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/nova2001.c 2012-02-06 21:30:32.000000000 +0000 @@ -94,7 +94,7 @@ SET_TILE_INFO(1, code, color, 0); - tileinfo->category = (attr & 0x10) >> 4; + tileinfo.category = (attr & 0x10) >> 4; } static TILE_GET_INFO( ninjakun_get_bg_tile_info ) @@ -116,7 +116,7 @@ SET_TILE_INFO(1, code, color, 0); - tileinfo->category = (attr & 0x10) >> 4; + tileinfo.category = (attr & 0x10) >> 4; } static TILE_GET_INFO( pkunwar_get_bg_tile_info ) @@ -128,7 +128,7 @@ SET_TILE_INFO(1, code, color, 0); - tileinfo->category = (attr & 0x08) >> 3; + tileinfo.category = (attr & 0x08) >> 3; } static TILE_GET_INFO( raiders5_get_bg_tile_info ) @@ -163,15 +163,15 @@ nova2001_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, nova2001_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, nova2001_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, -7); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(0, -7); } VIDEO_START( pkunwar ) { nova2001_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, pkunwar_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } VIDEO_START( ninjakun ) @@ -179,8 +179,8 @@ nova2001_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, ninjakun_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, ninjakun_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 7, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(7, 0); } VIDEO_START( raiders5 ) @@ -188,8 +188,8 @@ nova2001_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, raiders5_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, raiders5_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 7, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(7, 0); } @@ -204,34 +204,34 @@ { nova2001_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( nova2001_bg_videoram_w ) { nova2001_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( ninjakun_bg_videoram_w ) { nova2001_state *state = space->machine().driver_data(); - int x = tilemap_get_scrollx(state->m_bg_tilemap, 0) >> 3; - int y = tilemap_get_scrolly(state->m_bg_tilemap, 0) >> 3; + int x = state->m_bg_tilemap->scrollx(0) >> 3; + int y = state->m_bg_tilemap->scrolly(0) >> 3; // add scroll registers to address offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } READ8_HANDLER( ninjakun_bg_videoram_r ) { nova2001_state *state = space->machine().driver_data(); - int x = tilemap_get_scrollx(state->m_bg_tilemap, 0) >> 3; - int y = tilemap_get_scrolly(state->m_bg_tilemap, 0) >> 3; + int x = state->m_bg_tilemap->scrollx(0) >> 3; + int y = state->m_bg_tilemap->scrolly(0) >> 3; // add scroll registers to address offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400); @@ -242,13 +242,13 @@ WRITE8_HANDLER( nova2001_scroll_x_w ) { nova2001_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( nova2001_scroll_y_w ) { nova2001_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( nova2001_flipscreen_w ) @@ -270,7 +270,7 @@ * *************************************/ -static void nova2001_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void nova2001_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { nova2001_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -308,7 +308,7 @@ } } -static void pkunwar_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void pkunwar_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { nova2001_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -355,55 +355,55 @@ -SCREEN_UPDATE( nova2001 ) +SCREEN_UPDATE_IND16( nova2001 ) { - nova2001_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + nova2001_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - nova2001_draw_sprites(screen->machine(), bitmap, cliprect); + nova2001_draw_sprites(screen.machine(), bitmap, cliprect); // according to the schematics, fg category 0 should be drawn behind sprites, // but it doesn't look right that way - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } -SCREEN_UPDATE( pkunwar ) +SCREEN_UPDATE_IND16( pkunwar ) { - nova2001_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); + nova2001_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); - pkunwar_draw_sprites(screen->machine(), bitmap, cliprect); + pkunwar_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } -SCREEN_UPDATE( ninjakun ) +SCREEN_UPDATE_IND16( ninjakun ) { - nova2001_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + nova2001_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 1, 0); - nova2001_draw_sprites(screen->machine(), bitmap, cliprect); + nova2001_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( raiders5 ) +SCREEN_UPDATE_IND16( raiders5 ) { - nova2001_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + nova2001_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - pkunwar_draw_sprites(screen->machine(), bitmap, cliprect); + pkunwar_draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/nycaptor.c mame-0.145/src/mame/video/nycaptor.c --- mame-0.144/src/mame/video/nycaptor.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/nycaptor.c 2012-02-06 21:30:32.000000000 +0000 @@ -41,21 +41,21 @@ { nycaptor_state *state = machine.driver_data(); int pal = state->m_videoram[tile_index * 2 + 1] & 0x0f; - tileinfo->category = (state->m_videoram[tile_index * 2 + 1] & 0x30) >> 4; + tileinfo.category = (state->m_videoram[tile_index * 2 + 1] & 0x30) >> 4; - tileinfo->group = 0; + tileinfo.group = 0; if ((!nycaptor_spot(machine)) && (pal == 6)) - tileinfo->group = 1; + tileinfo.group = 1; if (((nycaptor_spot(machine) == 3) && (pal == 8)) || ((nycaptor_spot(machine) == 1) && (pal == 0xc))) - tileinfo->group = 2; + tileinfo.group = 2; - if ((nycaptor_spot(machine) == 1) && (tileinfo->category == 2)) - tileinfo->group = 3; + if ((nycaptor_spot(machine) == 1) && (tileinfo.category == 2)) + tileinfo.group = 3; #if NYCAPTOR_DEBUG - if (state->m_mask & (1 << tileinfo->category)) + if (state->m_mask & (1 << tileinfo.category)) { if (nycaptor_spot(machine)) pal = 0xe; @@ -79,14 +79,14 @@ state->m_spriteram = auto_alloc_array(machine, UINT8, 160); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32 ); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xf800, 0x7ff); //split 0 - tilemap_set_transmask(state->m_bg_tilemap, 1, 0xfe00, 0x01ff);//split 1 - tilemap_set_transmask(state->m_bg_tilemap, 2, 0xfffc, 0x0003);//split 2 - tilemap_set_transmask(state->m_bg_tilemap, 3, 0xfff0, 0x000f);//split 3 + state->m_bg_tilemap->set_transmask(0, 0xf800, 0x7ff); //split 0 + state->m_bg_tilemap->set_transmask(1, 0xfe00, 0x01ff);//split 1 + state->m_bg_tilemap->set_transmask(2, 0xfffc, 0x0003);//split 2 + state->m_bg_tilemap->set_transmask(3, 0xfff0, 0x000f);//split 3 machine.generic.paletteram.u8 = auto_alloc_array(machine, UINT8, 0x200); machine.generic.paletteram2.u8 = auto_alloc_array(machine, UINT8, 0x200); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); state->save_pointer(NAME(state->m_spriteram), 160); state_save_register_global_pointer(machine, machine.generic.paletteram.u8, 0x200); @@ -97,7 +97,7 @@ { nycaptor_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } READ8_HANDLER( nycaptor_videoram_r ) @@ -141,7 +141,7 @@ if (state->m_char_bank != ((data & 0x18) >> 3)) { state->m_char_bank = ((data & 0x18) >> 3); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_palette_bank = BIT(data, 5); @@ -164,10 +164,10 @@ { nycaptor_state *state = space->machine().driver_data(); state->m_scrlram[offset] = data; - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { nycaptor_state *state = machine.driver_data(); int i; @@ -224,7 +224,7 @@ x - no bg/sprite pri. */ -#define mKEY_MASK(x,y) if (machine.input().code_pressed_once(x)) { state->m_mask |= y; tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); } +#define mKEY_MASK(x,y) if (machine.input().code_pressed_once(x)) { state->m_mask |= y; state->m_bg_tilemap->mark_all_dirty(); } static void nycaptor_setmask( running_machine &machine ) { @@ -244,91 +244,91 @@ mKEY_MASK(KEYCODE_J, 0x400); mKEY_MASK(KEYCODE_K, 0x800); - if (machine.input().code_pressed_once(KEYCODE_Z)){state->m_mask = 0; tilemap_mark_all_tiles_dirty(state->m_bg_tilemap);} /* disable */ - if (machine.input().code_pressed_once(KEYCODE_X)){state->m_mask |= 0x1000; tilemap_mark_all_tiles_dirty(state->m_bg_tilemap);} /* no layers */ + if (machine.input().code_pressed_once(KEYCODE_Z)){state->m_mask = 0; state->m_bg_tilemap->mark_all_dirty();} /* disable */ + if (machine.input().code_pressed_once(KEYCODE_X)){state->m_mask |= 0x1000; state->m_bg_tilemap->mark_all_dirty();} /* no layers */ } #endif -SCREEN_UPDATE( nycaptor ) +SCREEN_UPDATE_IND16( nycaptor ) { - nycaptor_state *state = screen->machine().driver_data(); + nycaptor_state *state = screen.machine().driver_data(); #if NYCAPTOR_DEBUG - nycaptor_setmask(screen->machine()); + nycaptor_setmask(screen.machine()); if (state->m_mask & 0x1000) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - draw_sprites(screen->machine(), bitmap, cliprect, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 5); - draw_sprites(screen->machine(), bitmap, cliprect, 6); - draw_sprites(screen->machine(), bitmap, cliprect, 7); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + draw_sprites(screen.machine(), bitmap, cliprect, 4); + draw_sprites(screen.machine(), bitmap, cliprect, 5); + draw_sprites(screen.machine(), bitmap, cliprect, 6); + draw_sprites(screen.machine(), bitmap, cliprect, 7); } else #endif - switch (nycaptor_spot(screen->machine()) & 3) + switch (nycaptor_spot(screen.machine()) & 3) { case 0: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 3, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 6); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 6); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); break; case 1: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 3, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 3, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 2, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); break; case 2: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 3, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 2, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 2, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); break; case 3: - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1 | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0); break; } diff -Nru mame-0.144/src/mame/video/offtwall.c mame-0.145/src/mame/video/offtwall.c --- mame-0.144/src/mame/video/offtwall.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/offtwall.c 2012-02-06 21:30:32.000000000 +0000 @@ -89,23 +89,23 @@ * *************************************/ -SCREEN_UPDATE( offtwall ) +SCREEN_UPDATE_IND16( offtwall ) { - offtwall_state *state = screen->machine().driver_data(); + offtwall_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/ohmygod.c mame-0.145/src/mame/video/ohmygod.c --- mame-0.144/src/mame/video/ohmygod.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ohmygod.c 2012-02-06 21:30:33.000000000 +0000 @@ -45,7 +45,7 @@ { ohmygod_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( ohmygod_spritebank_w ) @@ -59,14 +59,14 @@ { ohmygod_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scrollx); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx - 0x81ec); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx - 0x81ec); } WRITE16_HANDLER( ohmygod_scrolly_w ) { ohmygod_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scrolly); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly - 0x81ef); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly - 0x81ef); } @@ -76,7 +76,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ohmygod_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -105,11 +105,11 @@ } } -SCREEN_UPDATE( ohmygod ) +SCREEN_UPDATE_IND16( ohmygod ) { - ohmygod_state *state = screen->machine().driver_data(); + ohmygod_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/ojankohs.c mame-0.145/src/mame/video/ojankohs.c --- mame-0.144/src/mame/video/ojankohs.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ojankohs.c 2012-02-06 21:30:31.000000000 +0000 @@ -114,14 +114,14 @@ { ojankohs_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ojankohs_colorram_w ) { ojankohs_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ojankohs_gfxreg_w ) @@ -131,7 +131,7 @@ if (state->m_gfxreg != data) { state->m_gfxreg = data; - tilemap_mark_all_tiles_dirty(state->m_tilemap); + state->m_tilemap->mark_all_dirty(); } } @@ -144,7 +144,7 @@ state->m_flipscreen = BIT(data, 0); - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); if (state->m_flipscreen) { @@ -252,7 +252,7 @@ px = x + (i ^ xx); py = y; - *BITMAP_ADDR16(state->m_tmpbitmap, py, px) = color; + state->m_tmpbitmap.pix16(py, px) = color; color1 >>= 1; color2 >>= 1; @@ -296,13 +296,13 @@ { ojankohs_state *state = machine.driver_data(); - state->m_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); state->m_videoram = auto_alloc_array(machine, UINT8, 0x8000); state->m_paletteram = auto_alloc_array(machine, UINT8, 0x20); state->save_pointer(NAME(state->m_videoram), 0x8000); state->save_pointer(NAME(state->m_paletteram), 0x20); - state->save_item(NAME(*state->m_tmpbitmap)); + state->save_item(NAME(state->m_tmpbitmap)); } @@ -312,25 +312,25 @@ ******************************************************************************/ -SCREEN_UPDATE( ojankohs ) +SCREEN_UPDATE_IND16( ojankohs ) { - ojankohs_state *state = screen->machine().driver_data(); + ojankohs_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_tilemap, 0, state->m_scrollx); - tilemap_set_scrolly(state->m_tilemap, 0, state->m_scrolly); + state->m_tilemap->set_scrollx(0, state->m_scrollx); + state->m_tilemap->set_scrolly(0, state->m_scrolly); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( ojankoc ) +SCREEN_UPDATE_IND16( ojankoc ) { - ojankohs_state *state = screen->machine().driver_data(); + ojankohs_state *state = screen.machine().driver_data(); int offs; if (state->m_screen_refresh) { - address_space *space = screen->machine().device("maincpu")->memory().space(AS_PROGRAM); + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); /* redraw bitmap */ for (offs = 0; offs < 0x8000; offs++) diff -Nru mame-0.144/src/mame/video/oneshot.c mame-0.145/src/mame/video/oneshot.c --- mame-0.144/src/mame/video/oneshot.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/oneshot.c 2012-02-06 21:30:31.000000000 +0000 @@ -17,7 +17,7 @@ { oneshot_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } /* mid tilemap */ @@ -33,7 +33,7 @@ { oneshot_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_mid_videoram[offset]); - tilemap_mark_tile_dirty(state->m_mid_tilemap, offset / 2); + state->m_mid_tilemap->mark_tile_dirty(offset / 2); } @@ -50,7 +50,7 @@ { oneshot_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } VIDEO_START( oneshot ) @@ -61,12 +61,12 @@ state->m_mid_tilemap = tilemap_create(machine, get_oneshot_mid_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_oneshot_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); - tilemap_set_transparent_pen(state->m_mid_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_mid_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_crosshairs( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_crosshairs( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { oneshot_state *state = machine.driver_data(); //int xpos,ypos; @@ -99,7 +99,7 @@ state->m_gun_x_p2 = 0; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { oneshot_state *state = machine.driver_data(); const UINT16 *source = state->m_sprites; @@ -156,35 +156,35 @@ } -SCREEN_UPDATE( oneshot ) +SCREEN_UPDATE_IND16( oneshot ) { - oneshot_state *state = screen->machine().driver_data(); + oneshot_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_set_scrollx(state->m_mid_tilemap, 0, state->m_scroll[0] - 0x1f5); - tilemap_set_scrolly(state->m_mid_tilemap, 0, state->m_scroll[1]); + state->m_mid_tilemap->set_scrollx(0, state->m_scroll[0] - 0x1f5); + state->m_mid_tilemap->set_scrolly(0, state->m_scroll[1]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_mid_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_crosshairs(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_mid_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_crosshairs(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( maddonna ) +SCREEN_UPDATE_IND16( maddonna ) { - oneshot_state *state = screen->machine().driver_data(); + oneshot_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_set_scrolly(state->m_mid_tilemap, 0, state->m_scroll[1]); // other registers aren't used so we don't know which layers they relate to + state->m_mid_tilemap->set_scrolly(0, state->m_scroll[1]); // other registers aren't used so we don't know which layers they relate to - tilemap_draw(bitmap, cliprect, state->m_mid_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_mid_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); // popmessage ("%04x %04x %04x %04x %04x %04x %04x %04x", state->m_scroll[0], state->m_scroll[1], state->m_scroll[2], state->m_scroll[3], state->m_scroll[4], state->m_scroll[5], state->m_scroll[6], state->m_scroll[7]); return 0; diff -Nru mame-0.144/src/mame/video/opwolf.c mame-0.145/src/mame/video/opwolf.c --- mame-0.144/src/mame/video/opwolf.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/opwolf.c 2012-02-06 21:30:33.000000000 +0000 @@ -36,9 +36,9 @@ /***************************************************************************/ -SCREEN_UPDATE( opwolf ) +SCREEN_UPDATE_IND16( opwolf ) { - opwolf_state *state = screen->machine().driver_data(); + opwolf_state *state = screen.machine().driver_data(); int layer[2]; pc080sn_tilemap_update(state->m_pc080sn); @@ -46,7 +46,7 @@ layer[0] = 0; layer[1] = 1; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[1], 0, 2); diff -Nru mame-0.144/src/mame/video/orbit.c mame-0.145/src/mame/video/orbit.c --- mame-0.144/src/mame/video/orbit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/orbit.c 2012-02-06 21:30:32.000000000 +0000 @@ -11,7 +11,7 @@ { orbit_state *state = space->machine().driver_data(); state->m_playfield_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -37,7 +37,7 @@ } -static void draw_sprites( running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { orbit_state *state = machine.driver_data(); const UINT8* p = state->m_sprite_ram; @@ -79,14 +79,14 @@ } -SCREEN_UPDATE( orbit ) +SCREEN_UPDATE_IND16( orbit ) { - orbit_state *state = screen->machine().driver_data(); + orbit_state *state = screen.machine().driver_data(); - state->m_flip_screen = input_port_read(screen->machine(), "DSW2") & 8; + state->m_flip_screen = input_port_read(screen.machine(), "DSW2") & 8; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/othldrby.c mame-0.145/src/mame/video/othldrby.c --- mame-0.144/src/mame/video/othldrby.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/othldrby.c 2012-02-06 21:30:32.000000000 +0000 @@ -13,7 +13,7 @@ ***************************************************************************/ -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int plane ) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int plane ) { othldrby_state *state = machine.driver_data(); UINT16 attr; @@ -25,7 +25,7 @@ state->m_vram[tile_index + 1], attr & 0x7f, 0); - tileinfo->category = (attr & 0x0600) >> 9; + tileinfo.category = (attr & 0x0600) >> 9; } static TILE_GET_INFO( get_tile_info0 ) @@ -63,9 +63,9 @@ state->m_buf_spriteram = auto_alloc_array(machine, UINT16, 2 * SPRITERAM_SIZE); state->m_buf_spriteram2 = state->m_buf_spriteram + SPRITERAM_SIZE; - tilemap_set_transparent_pen(state->m_bg_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[2], 0); + state->m_bg_tilemap[0]->set_transparent_pen(0); + state->m_bg_tilemap[1]->set_transparent_pen(0); + state->m_bg_tilemap[2]->set_transparent_pen(0); state->save_pointer(NAME(state->m_vram), VIDEORAM_SIZE); state->save_pointer(NAME(state->m_buf_spriteram), 2 * SPRITERAM_SIZE); @@ -105,7 +105,7 @@ if (state->m_vram_addr < VIDEORAM_SIZE) { if (state->m_vram_addr < SPRITERAM_START) - tilemap_mark_tile_dirty(state->m_bg_tilemap[state->m_vram_addr / 0x800], (state->m_vram_addr & 0x7ff) / 2); + state->m_bg_tilemap[state->m_vram_addr / 0x800]->mark_tile_dirty((state->m_vram_addr & 0x7ff) / 2); state->m_vram[state->m_vram_addr++] = data; } else @@ -136,7 +136,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { othldrby_state *state = machine.driver_data(); int offs; @@ -180,55 +180,59 @@ } } -SCREEN_UPDATE( othldrby ) +SCREEN_UPDATE_IND16( othldrby ) { - othldrby_state *state = screen->machine().driver_data(); + othldrby_state *state = screen.machine().driver_data(); int layer; - flip_screen_set(screen->machine(), state->m_vreg[0x0f] & 0x80); + flip_screen_set(screen.machine(), state->m_vreg[0x0f] & 0x80); for (layer = 0; layer < 3; layer++) { - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { - tilemap_set_scrollx(state->m_bg_tilemap[layer], 0, state->m_vreg[2 * layer] + 59); - tilemap_set_scrolly(state->m_bg_tilemap[layer], 0, state->m_vreg[2 * layer + 1] + 248); + state->m_bg_tilemap[layer]->set_scrollx(0, state->m_vreg[2 * layer] + 59); + state->m_bg_tilemap[layer]->set_scrolly(0, state->m_vreg[2 * layer + 1] + 248); } else { - tilemap_set_scrollx(state->m_bg_tilemap[layer], 0, state->m_vreg[2 * layer] - 58); - tilemap_set_scrolly(state->m_bg_tilemap[layer], 0, state->m_vreg[2 * layer+1] + 9); + state->m_bg_tilemap[layer]->set_scrollx(0, state->m_vreg[2 * layer] - 58); + state->m_bg_tilemap[layer]->set_scrolly(0, state->m_vreg[2 * layer+1] + 9); } } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); for (layer = 0; layer < 3; layer++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer], 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + state->m_bg_tilemap[layer]->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); for (layer = 0; layer < 3; layer++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer], 1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + state->m_bg_tilemap[layer]->draw(bitmap, cliprect, 1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); for (layer = 0; layer < 3; layer++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer], 2, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 2); + state->m_bg_tilemap[layer]->draw(bitmap, cliprect, 2, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 2); for (layer = 0; layer < 3; layer++) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[layer], 3, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 3); + state->m_bg_tilemap[layer]->draw(bitmap, cliprect, 3, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 3); return 0; } -SCREEN_EOF( othldrby ) +SCREEN_VBLANK( othldrby ) { - othldrby_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + othldrby_state *state = screen.machine().driver_data(); - /* sprites need to be delayed two frames */ - memcpy(state->m_buf_spriteram, state->m_buf_spriteram2, SPRITERAM_SIZE * sizeof(state->m_buf_spriteram[0])); - memcpy(state->m_buf_spriteram2, &state->m_vram[SPRITERAM_START], SPRITERAM_SIZE * sizeof(state->m_buf_spriteram[0])); + /* sprites need to be delayed two frames */ + memcpy(state->m_buf_spriteram, state->m_buf_spriteram2, SPRITERAM_SIZE * sizeof(state->m_buf_spriteram[0])); + memcpy(state->m_buf_spriteram2, &state->m_vram[SPRITERAM_START], SPRITERAM_SIZE * sizeof(state->m_buf_spriteram[0])); + } } diff -Nru mame-0.144/src/mame/video/othunder.c mame-0.145/src/mame/video/othunder.c --- mame-0.144/src/mame/video/othunder.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/othunder.c 2012-02-06 21:30:31.000000000 +0000 @@ -63,7 +63,7 @@ ********************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const int *primasks, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int *primasks, int y_offs ) { othunder_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -200,9 +200,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( othunder ) +SCREEN_UPDATE_IND16( othunder ) { - othunder_state *state = screen->machine().driver_data(); + othunder_state *state = screen.machine().driver_data(); int layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -211,10 +211,10 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); @@ -223,7 +223,7 @@ /* Sprites can be under/over the layer below text layer */ { static const int primasks[2] = {0xf0, 0xfc}; - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 3); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 3); } return 0; diff -Nru mame-0.144/src/mame/video/overdriv.c mame-0.145/src/mame/video/overdriv.c --- mame-0.144/src/mame/video/overdriv.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/overdriv.c 2012-02-06 21:30:32.000000000 +0000 @@ -50,9 +50,9 @@ ***************************************************************************/ -SCREEN_UPDATE( overdriv ) +SCREEN_UPDATE_IND16( overdriv ) { - overdriv_state *state = screen->machine().driver_data(); + overdriv_state *state = screen.machine().driver_data(); state->m_sprite_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); state->m_road_colorbase[1] = k053251_get_palette_index(state->m_k053251, K053251_CI1); @@ -60,7 +60,7 @@ state->m_zoom_colorbase[1] = k053251_get_palette_index(state->m_k053251, K053251_CI3); state->m_zoom_colorbase[0] = k053251_get_palette_index(state->m_k053251, K053251_CI4); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k051316_zoom_draw(state->m_k051316_1, bitmap, cliprect, 0, 0); k051316_zoom_draw(state->m_k051316_2, bitmap, cliprect, 0, 1); diff -Nru mame-0.144/src/mame/video/pacland.c mame-0.145/src/mame/video/pacland.c --- mame-0.144/src/mame/video/pacland.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pacland.c 2012-02-06 21:30:32.000000000 +0000 @@ -177,8 +177,8 @@ int color = ((attr & 0x1e) >> 1) + ((code & 0x1e0) >> 1); int flags = TILE_FLIPYX(attr >> 6); - tileinfo->category = (attr & 0x20) ? 1 : 0; - tileinfo->group = color; + tileinfo.category = (attr & 0x20) ? 1 : 0; + tileinfo.group = color; SET_TILE_INFO(0, code, color, flags); } @@ -196,13 +196,13 @@ pacland_state *state = machine.driver_data(); int color; - state->m_fg_bitmap = machine.primary_screen->alloc_compatible_bitmap(); - bitmap_fill(state->m_fg_bitmap, NULL, 0xffff); + machine.primary_screen->register_screen_bitmap(state->m_fg_bitmap); + state->m_fg_bitmap.fill(0xffff); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,64,32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_scroll_rows(state->m_fg_tilemap, 32); + state->m_fg_tilemap->set_scroll_rows(32); /* create one group per color code; for each group, set the transparency mask to correspond to the pens that are 0x7f or 0xff */ @@ -211,7 +211,7 @@ { UINT32 mask = colortable_get_transpen_mask(machine.colortable, machine.gfx[0], color, 0x7f); mask |= colortable_get_transpen_mask(machine.colortable, machine.gfx[0], color, 0xff); - tilemap_set_transmask(state->m_fg_tilemap, color, mask, 0); + state->m_fg_tilemap->set_transmask(color, mask, 0); } state_save_register_global(machine, state->m_palette_bank); @@ -231,14 +231,14 @@ { pacland_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( pacland_videoram2_w ) { pacland_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( pacland_scroll0_w ) @@ -280,7 +280,7 @@ ***************************************************************************/ /* the sprite generator IC is the same as Mappy */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int whichmask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int whichmask) { pacland_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram + 0x780; @@ -340,7 +340,7 @@ } -static void draw_fg(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_fg(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { pacland_state *state = machine.driver_data(); int y, x; @@ -348,18 +348,18 @@ /* draw tilemap transparently over it; this will leave invalid pens (0xffff) anywhere where the fg_tilemap should be transparent; note that we assume the fg_bitmap has been pre-erased to 0xffff */ - tilemap_draw(state->m_fg_bitmap, cliprect, state->m_fg_tilemap, priority, 0); + state->m_fg_tilemap->draw(state->m_fg_bitmap, cliprect, priority, 0); /* now copy the fg_bitmap to the destination wherever the sprite pixel allows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - const UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); - UINT16 *src = BITMAP_ADDR16(state->m_fg_bitmap, y, 0); - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + const UINT8 *pri = &machine.priority_bitmap.pix8(y); + UINT16 *src = &state->m_fg_bitmap.pix16(y); + UINT16 *dst = &bitmap.pix16(y); /* only copy if the priority bitmap is 0 (no high priority sprite) and the source pixel is not the invalid pen; also clear to 0xffff when finished */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = src[x]; if (pix != 0xffff) @@ -373,34 +373,34 @@ } -SCREEN_UPDATE( pacland ) +SCREEN_UPDATE_IND16( pacland ) { - pacland_state *state = screen->machine().driver_data(); + pacland_state *state = screen.machine().driver_data(); int row; for (row = 5; row < 29; row++) - tilemap_set_scrollx(state->m_fg_tilemap, row, flip_screen_get(screen->machine()) ? state->m_scroll0-7 : state->m_scroll0); - tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(screen->machine()) ? state->m_scroll1-4 : state->m_scroll1-3); + state->m_fg_tilemap->set_scrollx(row, flip_screen_get(screen.machine()) ? state->m_scroll0-7 : state->m_scroll0); + state->m_bg_tilemap->set_scrollx(0, flip_screen_get(screen.machine()) ? state->m_scroll1-4 : state->m_scroll1-3); /* draw high priority sprite pixels, setting priority bitmap to non-zero wherever there is a high-priority pixel; note that we draw to the bitmap which is safe because the bg_tilemap draw will overwrite everything */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0x00); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0x00, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0); /* draw background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw low priority fg tiles */ - draw_fg(screen->machine(), bitmap, cliprect, 0); + draw_fg(screen.machine(), bitmap, cliprect, 0); /* draw sprites with regular transparency */ - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); /* draw high priority fg tiles */ - draw_fg(screen->machine(), bitmap, cliprect, 1); + draw_fg(screen.machine(), bitmap, cliprect, 1); /* draw sprite pixels with colortable values >= 0xf0, which have priority over everything */ - draw_sprites(screen->machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 2); return 0; } diff -Nru mame-0.144/src/mame/video/pacman.c mame-0.145/src/mame/video/pacman.c --- mame-0.144/src/mame/video/pacman.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/pacman.c 2012-02-06 21:30:31.000000000 +0000 @@ -21,13 +21,6 @@ #include "video/resnet.h" -static const rectangle spritevisiblearea = -{ - 2*8, 34*8-1, - 0*8, 28*8-1 -}; - - /*************************************************************************** @@ -177,6 +170,7 @@ state->m_colortablebank = 0; state->m_flipscreen = 0; state->m_bgpriority = 0; + state->m_inv_spr = 0; /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */ /* one pixel to the left to get a more correct placement */ @@ -184,74 +178,96 @@ state->m_bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 ); - tilemap_set_scrolldx( state->m_bg_tilemap, 0, 384 - 288 ); - tilemap_set_scrolldy( state->m_bg_tilemap, 0, 264 - 224 ); + state->m_bg_tilemap->set_scrolldx(0, 384 - 288 ); + state->m_bg_tilemap->set_scrolldy(0, 264 - 224 ); +} + +VIDEO_START( birdiy ) +{ + pacman_state *state = machine.driver_data(); + + VIDEO_START_CALL( pacman ); + state->m_xoffsethack = 0; + state->m_inv_spr = 1; // sprites are mirrored in X-axis compared to normal behaviour } WRITE8_HANDLER( pacman_videoram_w ) { pacman_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty( state->m_bg_tilemap, offset ); + state->m_bg_tilemap->mark_tile_dirty(offset ); } WRITE8_HANDLER( pacman_colorram_w ) { pacman_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty( state->m_bg_tilemap, offset ); + state->m_bg_tilemap->mark_tile_dirty(offset ); } WRITE8_HANDLER( pacman_flipscreen_w ) { pacman_state *state = space->machine().driver_data(); state->m_flipscreen = data & 1; - tilemap_set_flip( state->m_bg_tilemap, state->m_flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) ); + state->m_bg_tilemap->set_flip(state->m_flipscreen * ( TILEMAP_FLIPX + TILEMAP_FLIPY ) ); } -SCREEN_UPDATE( pacman ) +SCREEN_UPDATE_IND16( pacman ) { - pacman_state *state = screen->machine().driver_data(); + pacman_state *state = screen.machine().driver_data(); if (state->m_bgpriority != 0) - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); else - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); - if( screen->machine().generic.spriteram_size ) + if( screen.machine().generic.spriteram_size ) { - UINT8 *spriteram = screen->machine().generic.spriteram.u8; - UINT8 *spriteram_2 = screen->machine().generic.spriteram2.u8; + UINT8 *spriteram = screen.machine().generic.spriteram.u8; + UINT8 *spriteram_2 = screen.machine().generic.spriteram2.u8; int offs; - rectangle spriteclip = spritevisiblearea; - sect_rect(&spriteclip, cliprect); + rectangle spriteclip(2*8, 34*8-1, 0*8, 28*8-1); + spriteclip &= cliprect; /* Draw the sprites. Note that it is important to draw them exactly in this */ /* order, to have the correct priorities. */ - for (offs = screen->machine().generic.spriteram_size - 2;offs > 2*2;offs -= 2) + for (offs = screen.machine().generic.spriteram_size - 2;offs > 2*2;offs -= 2) { int color; int sx,sy; + UINT8 fx,fy; + + if(state->m_inv_spr) + { + sx = spriteram_2[offs + 1]; + sy = 240 - (spriteram_2[offs]); + } + else + { + sx = 272 - spriteram_2[offs + 1]; + sy = spriteram_2[offs] - 31; + } + + fx = (spriteram[offs] & 1) ^ state->m_inv_spr; + fy = (spriteram[offs] & 2) ^ ((state->m_inv_spr) << 1); - sx = 272 - spriteram_2[offs + 1]; - sy = spriteram_2[offs] - 31; color = ( spriteram[offs + 1] & 0x1f ) | (state->m_colortablebank << 5) | (state->m_palettebank << 6 ); - drawgfx_transmask(bitmap,&spriteclip,screen->machine().gfx[1], + drawgfx_transmask(bitmap,spriteclip,screen.machine().gfx[1], ( spriteram[offs] >> 2 ) | (state->m_spritebank << 6), color, - spriteram[offs] & 1,spriteram[offs] & 2, + fx,fy, sx,sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); /* also plot the sprite with wraparound (tunnel in Crush Roller) */ - drawgfx_transmask(bitmap,&spriteclip,screen->machine().gfx[1], + drawgfx_transmask(bitmap,spriteclip,screen.machine().gfx[1], ( spriteram[offs] >> 2 ) | (state->m_spritebank << 6), color, - spriteram[offs] & 1,spriteram[offs] & 2, + fx,fy, sx - 256,sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); } /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */ /* one pixel to the left to get a more correct placement */ @@ -259,30 +275,42 @@ { int color; int sx,sy; + UINT8 fx,fy; - sx = 272 - spriteram_2[offs + 1]; - sy = spriteram_2[offs] - 31; + if(state->m_inv_spr) + { + sx = spriteram_2[offs + 1]; + sy = 240 - (spriteram_2[offs]); + } + else + { + sx = 272 - spriteram_2[offs + 1]; + sy = spriteram_2[offs] - 31; + } color = ( spriteram[offs + 1] & 0x1f ) | (state->m_colortablebank << 5) | (state->m_palettebank << 6 ); - drawgfx_transmask(bitmap,&spriteclip,screen->machine().gfx[1], + fx = (spriteram[offs] & 1) ^ state->m_inv_spr; + fy = (spriteram[offs] & 2) ^ ((state->m_inv_spr) << 1); + + drawgfx_transmask(bitmap,spriteclip,screen.machine().gfx[1], ( spriteram[offs] >> 2 ) | (state->m_spritebank << 6), color, - spriteram[offs] & 1,spriteram[offs] & 2, + fx,fy, sx,sy + state->m_xoffsethack, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); /* also plot the sprite with wraparound (tunnel in Crush Roller) */ - drawgfx_transmask(bitmap,&spriteclip,screen->machine().gfx[1], + drawgfx_transmask(bitmap,spriteclip,screen.machine().gfx[1], ( spriteram[offs] >> 2 ) | (state->m_spritebank << 6), color, - spriteram[offs] & 2,spriteram[offs] & 1, + fy,fx, //FIXME: flipping bits are really supposed to be inverted here? sx - 256,sy + state->m_xoffsethack, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); } } if (state->m_bgpriority != 0) - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -304,13 +332,13 @@ state->m_colortablebank = 0; state->m_flipscreen = 0; state->m_bgpriority = 0; - + state->m_inv_spr = 0; state->m_xoffsethack = 0; state->m_bg_tilemap = tilemap_create( machine, pacman_get_tile_info, pacman_scan_rows, 8, 8, 36, 28 ); - tilemap_set_scrolldx( state->m_bg_tilemap, 0, 384 - 288 ); - tilemap_set_scrolldy( state->m_bg_tilemap, 0, 264 - 224 ); + state->m_bg_tilemap->set_scrolldx(0, 384 - 288 ); + state->m_bg_tilemap->set_scrolldy(0, 264 - 224 ); } WRITE8_HANDLER( pengo_palettebank_w ) @@ -319,7 +347,7 @@ if (state->m_palettebank != data) { state->m_palettebank = data; - tilemap_mark_all_tiles_dirty( state->m_bg_tilemap ); + state->m_bg_tilemap ->mark_all_dirty(); } } @@ -329,7 +357,7 @@ if (state->m_colortablebank != data) { state->m_colortablebank = data; - tilemap_mark_all_tiles_dirty( state->m_bg_tilemap ); + state->m_bg_tilemap ->mark_all_dirty(); } } @@ -340,7 +368,7 @@ { state->m_spritebank = data & 1; state->m_charbank = data & 1; - tilemap_mark_all_tiles_dirty( state->m_bg_tilemap ); + state->m_bg_tilemap ->mark_all_dirty(); } } @@ -375,24 +403,24 @@ state->m_colortablebank = 0; state->m_flipscreen = 0; state->m_bgpriority = 0; - + state->m_inv_spr = 0; state->m_xoffsethack = 1; state->m_bg_tilemap = tilemap_create( machine, s2650_get_tile_info,tilemap_scan_rows,8,8,32,32 ); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); } -SCREEN_UPDATE( s2650games ) +SCREEN_UPDATE_IND16( s2650games ) { - pacman_state *state = screen->machine().driver_data(); - UINT8 *spriteram = screen->machine().generic.spriteram.u8; - UINT8 *spriteram_2 = screen->machine().generic.spriteram2.u8; + pacman_state *state = screen.machine().driver_data(); + UINT8 *spriteram = screen.machine().generic.spriteram.u8; + UINT8 *spriteram_2 = screen.machine().generic.spriteram2.u8; int offs; - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); - for (offs = screen->machine().generic.spriteram_size - 2;offs > 2*2;offs -= 2) + for (offs = screen.machine().generic.spriteram_size - 2;offs > 2*2;offs -= 2) { int color; int sx,sy; @@ -403,12 +431,12 @@ color = spriteram[offs + 1] & 0x1f; /* TODO: ?? */ - drawgfx_transmask(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transmask(bitmap,cliprect,screen.machine().gfx[1], (spriteram[offs] >> 2) | ((state->m_s2650games_spriteram[offs] & 3) << 6), color, spriteram[offs] & 1,spriteram[offs] & 2, sx,sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); } /* In the Pac Man based games (NOT Pengo) the first two sprites must be offset */ /* one pixel to the left to get a more correct placement */ @@ -423,12 +451,12 @@ color = spriteram[offs + 1] & 0x1f; /* TODO: ?? */ - drawgfx_transmask(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transmask(bitmap,cliprect,screen.machine().gfx[1], (spriteram[offs] >> 2) | ((state->m_s2650games_spriteram[offs] & 3)<<6), color, spriteram[offs] & 1,spriteram[offs] & 2, sx,sy + state->m_xoffsethack, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color & 0x3f, 0)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color & 0x3f, 0)); } return 0; } @@ -437,7 +465,7 @@ { pacman_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( s2650games_colorram_w ) @@ -446,20 +474,20 @@ int i; state->m_colorram[offset & 0x1f] = data; for (i = offset; i < 0x0400; i += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); } WRITE8_HANDLER( s2650games_scroll_w ) { pacman_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, offset, data); + state->m_bg_tilemap->set_scrolly(offset, data); } WRITE8_HANDLER( s2650games_tilesbank_w ) { pacman_state *state = space->machine().driver_data(); state->m_s2650games_tileram[offset] = data; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } @@ -525,18 +553,18 @@ int i; for( i = 2 * 0x20; i < 56 * 0x20; i += 0x20 ) { - tilemap_mark_tile_dirty( state->m_bg_tilemap, offset + i ); + state->m_bg_tilemap->mark_tile_dirty(offset + i ); } } else if (offset < 1792) { /* tiles for playfield */ - tilemap_mark_tile_dirty( state->m_bg_tilemap, offset ); + state->m_bg_tilemap->mark_tile_dirty(offset ); } else { /* tiles & colors for top and bottom two rows */ - tilemap_mark_tile_dirty( state->m_bg_tilemap, offset & ~0x80 ); + state->m_bg_tilemap->mark_tile_dirty(offset & ~0x80 ); } } @@ -556,13 +584,13 @@ state->m_colortablebank = 0; state->m_flipscreen = 0; state->m_bgpriority = 0; - + state->m_inv_spr = 0; state->m_xoffsethack = 1; state->m_bg_tilemap = tilemap_create( machine, jrpacman_get_tile_info,jrpacman_scan_rows,8,8,36,54 ); - tilemap_set_transparent_pen( state->m_bg_tilemap, 0 ); - tilemap_set_scroll_cols( state->m_bg_tilemap, 36 ); + state->m_bg_tilemap->set_transparent_pen(0 ); + state->m_bg_tilemap->set_scroll_cols(36 ); } WRITE8_HANDLER( jrpacman_videoram_w ) @@ -578,7 +606,7 @@ if (state->m_charbank != (data & 1)) { state->m_charbank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -594,7 +622,7 @@ int i; for( i = 2; i < 34; i++ ) { - tilemap_set_scrolly( state->m_bg_tilemap, i, data ); + state->m_bg_tilemap->set_scrolly(i, data ); } } diff -Nru mame-0.144/src/mame/video/pandoras.c mame-0.145/src/mame/video/pandoras.c --- mame-0.144/src/mame/video/pandoras.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pandoras.c 2012-02-06 21:30:32.000000000 +0000 @@ -96,7 +96,7 @@ state->m_videoram[tile_index] + ((attr & 0x10) << 4), attr & 0x0f, TILE_FLIPYX((attr & 0xc0) >> 6)); - tileinfo->category = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; } /*************************************************************************** @@ -123,7 +123,7 @@ { pandoras_state *state = space->machine().driver_data(); - tilemap_mark_tile_dirty(state->m_layer0, offset); + state->m_layer0->mark_tile_dirty(offset); state->m_videoram[offset] = data; } @@ -131,7 +131,7 @@ { pandoras_state *state = space->machine().driver_data(); - tilemap_mark_tile_dirty(state->m_layer0, offset); + state->m_layer0->mark_tile_dirty(offset); state->m_colorram[offset] = data; } @@ -139,7 +139,7 @@ { pandoras_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_layer0, 0, data); + state->m_layer0->set_scrolly(0, data); } WRITE8_HANDLER( pandoras_flipscreen_w ) @@ -147,7 +147,7 @@ pandoras_state *state = space->machine().driver_data(); state->m_flipscreen = data; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } /*************************************************************************** @@ -156,7 +156,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8* sr ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8* sr ) { int offs; @@ -177,11 +177,11 @@ } } -SCREEN_UPDATE( pandoras ) +SCREEN_UPDATE_IND16( pandoras ) { - pandoras_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect, state->m_layer0, 1 ,0); - draw_sprites(screen->machine(), bitmap, cliprect, &state->m_spriteram[0x800] ); - tilemap_draw(bitmap,cliprect, state->m_layer0, 0 ,0); + pandoras_state *state = screen.machine().driver_data(); + state->m_layer0->draw(bitmap, cliprect, 1 ,0); + draw_sprites(screen.machine(), bitmap, cliprect, &state->m_spriteram[0x800] ); + state->m_layer0->draw(bitmap, cliprect, 0 ,0); return 0; } diff -Nru mame-0.144/src/mame/video/paradise.c mame-0.145/src/mame/video/paradise.c --- mame-0.144/src/mame/video/paradise.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/paradise.c 2012-02-06 21:30:32.000000000 +0000 @@ -77,7 +77,7 @@ { paradise_state *state = space->machine().driver_data(); state->m_vram_0[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_0, offset % 0x400); + state->m_tilemap_0->mark_tile_dirty(offset % 0x400); } /* 16 color tiles with paradise_palbank as color code */ @@ -94,7 +94,7 @@ if (state->m_palbank != bank1) { state->m_palbank = bank1; - tilemap_mark_all_tiles_dirty(state->m_tilemap_0); + state->m_tilemap_0->mark_all_dirty(); } } @@ -111,7 +111,7 @@ { paradise_state *state = space->machine().driver_data(); state->m_vram_1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_1, offset % 0x400); + state->m_tilemap_1->mark_tile_dirty(offset % 0x400); } static TILE_GET_INFO( get_tile_info_1 ) @@ -127,7 +127,7 @@ { paradise_state *state = space->machine().driver_data(); state->m_vram_2[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_2, offset % 0x400); + state->m_tilemap_2->mark_tile_dirty(offset % 0x400); } static TILE_GET_INFO( get_tile_info_2 ) @@ -149,8 +149,8 @@ x = (offset & 0x7f) << 1; y = (offset >> 7); - *BITMAP_ADDR16(state->m_tmpbitmap, y, x + 0) = 0x80f - (data >> 4); - *BITMAP_ADDR16(state->m_tmpbitmap, y, x + 1) = 0x80f - (data & 0x0f); + state->m_tmpbitmap.pix16(y, x + 0) = 0x80f - (data >> 4); + state->m_tmpbitmap.pix16(y, x + 1) = 0x80f - (data & 0x0f); } @@ -169,13 +169,13 @@ state->m_tilemap_2 = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 0x20, 0x20); /* pixmap */ - state->m_tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); - tilemap_set_transparent_pen(state->m_tilemap_0, 0x0f); - tilemap_set_transparent_pen(state->m_tilemap_1, 0xff); - tilemap_set_transparent_pen(state->m_tilemap_2, 0xff); + state->m_tilemap_0->set_transparent_pen(0x0f); + state->m_tilemap_1->set_transparent_pen(0xff); + state->m_tilemap_2->set_transparent_pen(0xff); - state->save_item(NAME(*state->m_tmpbitmap)); + state->save_item(NAME(state->m_tmpbitmap)); } @@ -192,7 +192,7 @@ state->m_priority = data; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { paradise_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -241,97 +241,97 @@ ***************************************************************************/ -SCREEN_UPDATE( paradise ) +SCREEN_UPDATE_IND16( paradise ) { - paradise_state *state = screen->machine().driver_data(); + paradise_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int mask = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) mask |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) mask |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) mask |= 4; - if (screen->machine().input().code_pressed(KEYCODE_R)) mask |= 8; - if (screen->machine().input().code_pressed(KEYCODE_A)) mask |= 16; + if (screen.machine().input().code_pressed(KEYCODE_Q)) mask |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) mask |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) mask |= 4; + if (screen.machine().input().code_pressed(KEYCODE_R)) mask |= 8; + if (screen.machine().input().code_pressed(KEYCODE_A)) mask |= 16; if (mask != 0) layers_ctrl &= mask; } #endif - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!(state->m_priority & 4)) /* Screen blanking */ return 0; if (state->m_priority & 1) if (layers_ctrl & 16) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0); - if (layers_ctrl & 4) copybitmap_trans(bitmap, state->m_tmpbitmap, flip_screen_get(screen->machine()), flip_screen_get(screen->machine()), 0, 0, cliprect, 0x80f); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 2) state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 4) copybitmap_trans(bitmap, state->m_tmpbitmap, flip_screen_get(screen.machine()), flip_screen_get(screen.machine()), 0, 0, cliprect, 0x80f); if (state->m_priority & 2) { if (!(state->m_priority & 1)) if (layers_ctrl & 16) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (layers_ctrl & 8) - tilemap_draw(bitmap,cliprect, state->m_tilemap_2, 0, 0); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); } else { if (layers_ctrl & 8) - tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); if (!(state->m_priority & 1)) if (layers_ctrl & 16) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); } return 0; } /* no pix layer, no tilemap_0, different priority bits */ -SCREEN_UPDATE( torus ) +SCREEN_UPDATE_IND16( torus ) { - paradise_state *state = screen->machine().driver_data(); + paradise_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (!(state->m_priority & 2)) /* Screen blanking */ return 0; if (state->m_priority & 1) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0,0); + state->m_tilemap_1->draw(bitmap, cliprect, 0,0); if (state->m_priority & 4) { if (!(state->m_priority & 1)) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); } else { - tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); if (!(state->m_priority & 1)) - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); } return 0; } /* I don't know how the priority bits work on this one */ -SCREEN_UPDATE( madball ) +SCREEN_UPDATE_IND16( madball ) { - paradise_state *state = screen->machine().driver_data(); + paradise_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); + state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/parodius.c mame-0.145/src/mame/video/parodius.c --- mame-0.144/src/mame/video/parodius.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/parodius.c 2012-02-06 21:30:32.000000000 +0000 @@ -45,9 +45,9 @@ ***************************************************************************/ -SCREEN_UPDATE( parodius ) +SCREEN_UPDATE_IND16( parodius ) { - parodius_state *state = screen->machine().driver_data(); + parodius_state *state = screen.machine().driver_data(); int layer[3], bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -67,8 +67,8 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[0], 0,1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[1], 0,2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[2], 0,4); diff -Nru mame-0.144/src/mame/video/pass.c mame-0.145/src/mame/video/pass.c --- mame-0.144/src/mame/video/pass.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pass.c 2012-02-06 21:30:32.000000000 +0000 @@ -21,7 +21,7 @@ pass_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /* foreground 'sprites' tilemap stuff */ @@ -42,7 +42,7 @@ { pass_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } /* video update / start */ @@ -54,15 +54,15 @@ state->m_bg_tilemap = tilemap_create(machine, get_pass_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_pass_fg_tile_info, tilemap_scan_rows, 4, 4, 128, 64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 255); + state->m_fg_tilemap->set_transparent_pen(255); } -SCREEN_UPDATE( pass ) +SCREEN_UPDATE_IND16( pass ) { - pass_state *state = screen->machine().driver_data(); + pass_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/pastelg.c mame-0.145/src/mame/video/pastelg.c --- mame-0.144/src/mame/video/pastelg.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pastelg.c 2012-02-06 21:30:31.000000000 +0000 @@ -302,21 +302,21 @@ ******************************************************************************/ -SCREEN_UPDATE( pastelg ) +SCREEN_UPDATE_IND16( pastelg ) { - pastelg_state *state = screen->machine().driver_data(); + pastelg_state *state = screen.machine().driver_data(); if (state->m_dispflag) { int x, y; - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); for (y = 0; y < height; y++) for (x = 0; x < width; x++) - *BITMAP_ADDR16(bitmap, y, x) = state->m_videoram[(y * width) + x]; + bitmap.pix16(y, x) = state->m_videoram[(y * width) + x]; } else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/pbaction.c mame-0.145/src/mame/video/pbaction.c --- mame-0.144/src/mame/video/pbaction.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pbaction.c 2012-02-06 21:30:31.000000000 +0000 @@ -13,28 +13,28 @@ { pbaction_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( pbaction_colorram_w ) { pbaction_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( pbaction_videoram2_w ) { pbaction_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( pbaction_colorram2_w ) { pbaction_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( pbaction_scroll_w ) @@ -44,8 +44,8 @@ if (flip_screen_get(space->machine())) state->m_scroll = -state->m_scroll; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_scroll); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll); + state->m_fg_tilemap->set_scrollx(0, state->m_scroll); } WRITE8_HANDLER( pbaction_flipscreen_w ) @@ -81,10 +81,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { pbaction_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -132,12 +132,12 @@ } } -SCREEN_UPDATE( pbaction ) +SCREEN_UPDATE_IND16( pbaction ) { - pbaction_state *state = screen->machine().driver_data(); + pbaction_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/pcktgal.c mame-0.145/src/mame/video/pcktgal.c --- mame-0.144/src/mame/video/pcktgal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pcktgal.c 2012-02-06 21:30:31.000000000 +0000 @@ -30,7 +30,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { pcktgal_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -64,17 +64,17 @@ } } -SCREEN_UPDATE( pcktgal ) +SCREEN_UPDATE_IND16( pcktgal ) { -// flip_screen_set(screen->machine(), screen->machine().device("tilegen1")->get_flip_state()); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - draw_sprites(screen->machine(), bitmap, cliprect); +// flip_screen_set(screen.machine(), screen.machine().device("tilegen1")->get_flip_state()); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( pcktgalb ) +SCREEN_UPDATE_IND16( pcktgalb ) { // the bootleg doesn't properly set the tilemap registers, because it's on non-original hardware, which probably doesn't have the flexible tilemaps. - screen->machine().device("tilegen1")->deco_bac06_pf_draw_bootleg(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0, 2); - draw_sprites(screen->machine(), bitmap, cliprect); + screen.machine().device("tilegen1")->deco_bac06_pf_draw_bootleg(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0, 2); + draw_sprites(screen.machine(), bitmap, cliprect); return 0;} diff -Nru mame-0.144/src/mame/video/pgm.c mame-0.145/src/mame/video/pgm.c --- mame-0.144/src/mame/video/pgm.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/pgm.c 2012-02-06 21:30:31.000000000 +0000 @@ -4,213 +4,489 @@ #include "emu.h" #include "includes/pgm.h" -/* Sprites - These are a pain! */ +/****************************************************************************** + Sprites -/* this decodes one of the funky sprites to a bitmap so we can draw it more easily -- slow but easier to use*/ -static void pgm_prepare_sprite( running_machine &machine, int wide, int high, int palt, int boffset ) -{ - pgm_state *state = machine.driver_data(); - UINT8 *bdata = machine.region("sprmask")->base(); - size_t bdatasize = machine.region("sprmask")->bytes() - 1; - UINT8 *adata = state->m_sprite_a_region; - size_t adatasize = state->m_sprite_a_region_size - 1; - int xcnt, ycnt; + these are fairly complex to render due to the data format, unless you + pre-decode the data you have to draw pixels in the order they're decoded from + the ROM which becomes quite complex with flipped and zoomed cases +******************************************************************************/ - UINT32 aoffset; - UINT16 msk; - - aoffset = (bdata[(boffset + 3) & bdatasize] << 24) | (bdata[(boffset + 2) & bdatasize] << 16) | - (bdata[(boffset + 1) & bdatasize] << 8) | (bdata[(boffset + 0) & bdatasize] << 0); - aoffset = aoffset >> 2; aoffset *= 3; +// nothing pri is 0 +// bg pri is 2 +// sprite already here is 1 / 3 - boffset += 4; /* because the first dword is the a data offset */ +INLINE void pgm_draw_pix( int xdrawpos, int pri, UINT16* dest, UINT8* destpri, UINT16 srcdat) +{ - for (ycnt = 0 ; ycnt < high ; ycnt++) + if ((xdrawpos >= 0) && (xdrawpos < 448)) { - for (xcnt = 0 ; xcnt < wide ; xcnt++) + if (!(destpri[xdrawpos]&1)) { - int x; - - msk = ((bdata[(boffset + 1) & bdatasize] << 8) |( bdata[(boffset + 0) & bdatasize] << 0)); - - for (x = 0; x < 16; x++) + if (!pri) { - if (!(msk & 0x0001)) - { - state->m_sprite_temp_render[(ycnt * (wide * 16))+(xcnt * 16 + x)] = adata[aoffset & adatasize] + palt * 32; - aoffset++; - } - else + dest[xdrawpos] = srcdat; + } + else + { + if (!(destpri[xdrawpos]&2)) { - state->m_sprite_temp_render[(ycnt * (wide * 16)) + (xcnt * 16 + x)] = 0x8000; + dest[xdrawpos] = srcdat; } - msk >>= 1; } + } + + destpri[xdrawpos]|=1; + } +} + +INLINE void pgm_draw_pix_nopri( int xdrawpos, UINT16* dest, UINT8* destpri, UINT16 srcdat) +{ + if ((xdrawpos >= 0) && (xdrawpos < 448)) + { + if (!(destpri[xdrawpos]&1)) + { + dest[xdrawpos] = srcdat; + } + destpri[xdrawpos]|=1; + } +} - boffset += 2; +INLINE void pgm_draw_pix_pri( int xdrawpos, UINT16* dest, UINT8* destpri, UINT16 srcdat) +{ + if ((xdrawpos >= 0) && (xdrawpos < 448)) + { + if (!(destpri[xdrawpos]&1)) + { + if (!(destpri[xdrawpos]&2)) + { + dest[xdrawpos] = srcdat; + } } + destpri[xdrawpos]|=1; } } +/************************************************************************* + Full Sprite Renderer + for complex zoomed cases +*************************************************************************/ -// in the dest bitmap 0x10000 is used to mark 'used pixel' and 0x8000 is used to mark 'high priority' -static void draw_sprite_line( running_machine &machine, int wide, UINT32* dest, int xzoom, int xgrow, int yoffset, int flip, int xpos, int pri ) +static void draw_sprite_line( running_machine &machine, int wide, UINT16* dest, UINT8* destpri, int xzoom, int xgrow, int flip, int xpos, int pri, int realxsize, int palt, int draw ) { pgm_state *state = machine.driver_data(); int xcnt,xcntdraw; int xzoombit; - int xoffset; + int xoffset = 0; int xdrawpos = 0; + UINT8 *adata = state->m_sprite_a_region; + size_t adatasize = state->m_sprite_a_region_size - 1; + + UINT16 msk; + UINT16 srcdat; + xcnt = 0; xcntdraw = 0; - while (xcnt < wide * 16) + + for (xcnt = 0 ; xcnt < wide ; xcnt++) { - UINT32 srcdat; - if (!(flip & 0x01)) - xoffset = xcnt; - else - xoffset = (wide * 16) - xcnt - 1; + int x; - srcdat = state->m_sprite_temp_render[yoffset + xoffset]; - xzoombit = (xzoom >> (xcnt & 0x1f)) & 1; + msk = ((state->m_bdata[(state->m_boffset + 1) & state->m_bdatasize] << 8) |( state->m_bdata[(state->m_boffset + 0) & state->m_bdatasize] << 0)); - if (xzoombit == 1 && xgrow == 1) - { // double this column - xdrawpos = xpos + xcntdraw; - if (!(srcdat & 0x8000)) + for (x = 0; x < 16; x++) + { + if (!(msk & 0x0001)) { - if ((xdrawpos >= 0) && (xdrawpos < 448)) + srcdat = adata[state->m_aoffset & adatasize] + palt * 32; + state->m_aoffset++; + + if (draw) { - if (pri) - dest[xdrawpos] = srcdat | 0x8000 | 0x10000; - else - dest[xdrawpos] = srcdat | 0x10000; - } - } - xcntdraw++; + xzoombit = (xzoom >> (xoffset & 0x1f)) & 1; + xoffset++; - xdrawpos = xpos + xcntdraw; + if (xzoombit == 1 && xgrow == 1) + { // double this column - if (!(srcdat & 0x8000)) - { - if ((xdrawpos >= 0) && (xdrawpos < 448)) - { - if (pri) - dest[xdrawpos] = srcdat | 0x8000 | 0x10000; - else - dest[xdrawpos] = srcdat | 0x10000; + if (!(flip & 0x01)) + xdrawpos = xpos + xcntdraw; + else + xdrawpos = xpos + realxsize - xcntdraw; + + pgm_draw_pix(xdrawpos, pri, dest, destpri, srcdat); + + xcntdraw++; + + if (!(flip & 0x01)) + xdrawpos = xpos + xcntdraw; + else + xdrawpos = xpos + realxsize - xcntdraw; + + pgm_draw_pix(xdrawpos, pri, dest, destpri, srcdat); + + xcntdraw++; + } + else if (xzoombit == 1 && xgrow == 0) + { + /* skip this column */ + } + else //normal column + { + if (!(flip & 0x01)) + xdrawpos = xpos + xcntdraw; + else + xdrawpos = xpos + realxsize - xcntdraw; + + pgm_draw_pix(xdrawpos, pri, dest, destpri, srcdat); + + xcntdraw++; + } } + } - xcntdraw++; - } - else if (xzoombit == 1 && xgrow == 0) - { - /* skip this column */ - } - else //normal column - { - xdrawpos = xpos + xcntdraw; - if (!(srcdat & 0x8000)) + else { - if ((xdrawpos >= 0) && (xdrawpos < 448)) - { - if (pri) - dest[xdrawpos] = srcdat | 0x8000 | 0x10000; - else - dest[xdrawpos] = srcdat | 0x10000; - } + xzoombit = (xzoom >> (xoffset & 0x1f)) & 1; + xoffset++; + if (xzoombit == 1 && xgrow == 1) { xcntdraw+=2; } + else if (xzoombit == 1 && xgrow == 0) { } + else { xcntdraw++; } } - xcntdraw++; - } - xcnt++; + msk >>= 1; + + + } - if (xdrawpos == 448) xcnt = wide*16; + state->m_boffset += 2; } } -/* this just loops over our decoded bitmap and puts it on the screen */ -static void draw_sprite_new_zoomed( running_machine &machine, int wide, int high, int xpos, int ypos, int palt, int boffset, int flip, bitmap_t* bitmap, UINT32 xzoom, int xgrow, UINT32 yzoom, int ygrow, int pri ) + +static void draw_sprite_new_zoomed( pgm_state *state, running_machine &machine, int wide, int high, int xpos, int ypos, int palt, int flip, bitmap_ind16 &bitmap, bitmap_ind8 &priority_bitmap, UINT32 xzoom, int xgrow, UINT32 yzoom, int ygrow, int pri ) { int ycnt; int ydrawpos; - UINT32 *dest; - int yoffset; + UINT16 *dest; + UINT8* destpri; int ycntdraw; int yzoombit; + int xzoombit; + int xcnt = 0; + + + state->m_aoffset = (state->m_bdata[(state->m_boffset + 3) & state->m_bdatasize] << 24) | (state->m_bdata[(state->m_boffset + 2) & state->m_bdatasize] << 16) | + (state->m_bdata[(state->m_boffset + 1) & state->m_bdatasize] << 8) | (state->m_bdata[(state->m_boffset + 0) & state->m_bdatasize] << 0); + state->m_aoffset = state->m_aoffset >> 2; state->m_aoffset *= 3; + + state->m_boffset+=4; + + /* precalculate where drawing will end, for flipped zoomed cases. */ + /* if we're to avoid pre-decoding the data for each sprite each time we draw then we have to draw the sprite data + in the order it is in ROM due to the nature of the compresson scheme. This means drawing upwards from the end point + in the case of flipped sprites */ + ycnt = 0; + ycntdraw = 0; + int realysize = 0; + + while (ycnt < high) + { + yzoombit = (yzoom >> (ycnt & 0x1f)) & 1; + if (yzoombit == 1 && ygrow == 1) { realysize+=2; } + else if (yzoombit == 1 && ygrow == 0) { } + else { realysize++; }; + + ycnt++; + } + realysize--; + + int realxsize = 0; + + while (xcnt < wide * 16) + { + xzoombit = (xzoom >> (xcnt & 0x1f)) & 1; + if (xzoombit == 1 && xgrow == 1) { realxsize+=2; } + else if (xzoombit == 1 && xgrow == 0) { } + else { realxsize++; }; + + xcnt++; + } + realxsize--; - pgm_prepare_sprite(machine, wide,high, palt, boffset); /* now draw it */ ycnt = 0; ycntdraw = 0; + while (ycnt < high) { yzoombit = (yzoom >> (ycnt & 0x1f)) & 1; if (yzoombit == 1 && ygrow == 1) // double this line { - ydrawpos = ypos + ycntdraw; + int temp_aoffset = state->m_aoffset; + int temp_boffset = state->m_boffset; if (!(flip & 0x02)) - yoffset = (ycnt * (wide * 16)); + ydrawpos = ypos + ycntdraw; else - yoffset = ((high - ycnt - 1) * (wide * 16)); + ydrawpos = ypos + realysize - ycntdraw; if ((ydrawpos >= 0) && (ydrawpos < 224)) { - dest = BITMAP_ADDR32(bitmap, ydrawpos, 0); - draw_sprite_line(machine, wide, dest, xzoom, xgrow, yoffset, flip, xpos, pri); + dest = &bitmap.pix16(ydrawpos); + destpri = &priority_bitmap.pix8(ydrawpos); + draw_sprite_line(machine, wide, dest, destpri, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 1); + } + else + { + draw_sprite_line(machine, wide, NULL, NULL, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 0); } + ycntdraw++; - ydrawpos = ypos + ycntdraw; + // we need to draw this line again, so restore our pointers to previous values + state->m_aoffset = temp_aoffset; + state->m_boffset = temp_boffset; + if (!(flip & 0x02)) - yoffset = (ycnt * (wide * 16)); + ydrawpos = ypos + ycntdraw; else - yoffset = ((high - ycnt - 1) * (wide * 16)); + ydrawpos = ypos + realysize - ycntdraw; if ((ydrawpos >= 0) && (ydrawpos < 224)) { - dest = BITMAP_ADDR32(bitmap, ydrawpos, 0); - draw_sprite_line(machine, wide, dest, xzoom, xgrow, yoffset, flip, xpos, pri); + dest = &bitmap.pix16(ydrawpos); + destpri = &priority_bitmap.pix8(ydrawpos); + draw_sprite_line(machine, wide, dest, destpri, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 1); + } + else + { + draw_sprite_line(machine, wide, NULL, NULL, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 0); + + if (!(flip & 0x02)) + { + if (ydrawpos>224) + return; + } + else + { + if (ydrawpos<0) + return; + } } + ycntdraw++; - if (ydrawpos ==224) - ycnt = high; } else if (yzoombit == 1 && ygrow == 0) { /* skip this line */ - /* we should process anyway if we don't do the pre-decode.. */ + draw_sprite_line(machine, wide, NULL, NULL, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 0); } else /* normal line */ { - ydrawpos = ypos + ycntdraw; - if (!(flip & 0x02)) - yoffset = (ycnt * (wide * 16)); + ydrawpos = ypos + ycntdraw; else - yoffset = ((high - ycnt - 1) * (wide * 16)); + ydrawpos = ypos + realysize - ycntdraw; if ((ydrawpos >= 0) && (ydrawpos < 224)) { - dest = BITMAP_ADDR32(bitmap, ydrawpos, 0); - draw_sprite_line(machine, wide, dest, xzoom, xgrow, yoffset, flip, xpos, pri); + dest = &bitmap.pix16(ydrawpos); + destpri = &priority_bitmap.pix8(ydrawpos); + draw_sprite_line(machine, wide, dest, destpri, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 1); } + else + { + draw_sprite_line(machine, wide, NULL, NULL, xzoom, xgrow, flip, xpos, pri, realxsize, palt, 0); + + if (!(flip & 0x02)) + { + if (ydrawpos>224) + return; + } + else + { + if (ydrawpos<0) + return; + } + + } + ycntdraw++; + } + + ycnt++; + } +} + + +static void draw_sprite_line_basic( running_machine &machine, int wide, UINT16* dest, UINT8* destpri, int flip, int xpos, int pri, int realxsize, int palt, int draw ) +{ + pgm_state *state = machine.driver_data(); + int xcnt,xcntdraw; + int xoffset = 0; + int xdrawpos = 0; + UINT8 *adata = state->m_sprite_a_region; + size_t adatasize = state->m_sprite_a_region_size - 1; + + UINT16 msk; + UINT16 srcdat; + + xcnt = 0; + xcntdraw = 0; + + if (!pri) + { + for (xcnt = 0 ; xcnt < wide ; xcnt++) + { + int x; + + msk = ((state->m_bdata[(state->m_boffset + 1) & state->m_bdatasize] << 8) |( state->m_bdata[(state->m_boffset + 0) & state->m_bdatasize] << 0)); + + for (x = 0; x < 16; x++) + { + if (!(msk & 0x0001)) + { + srcdat = adata[state->m_aoffset & adatasize] + palt * 32; + state->m_aoffset++; + + if (draw) + { + xoffset++; + + if (!(flip & 0x01)) + xdrawpos = xpos + xcntdraw; + else + xdrawpos = xpos + realxsize - xcntdraw; + + pgm_draw_pix_nopri(xdrawpos, dest, destpri, srcdat); + + xcntdraw++; + } + + } + else + { + xoffset++; + xcntdraw++; + } + + msk >>= 1; + } + + state->m_boffset += 2; + } + } + else + { + for (xcnt = 0 ; xcnt < wide ; xcnt++) + { + int x; + + msk = ((state->m_bdata[(state->m_boffset + 1) & state->m_bdatasize] << 8) |( state->m_bdata[(state->m_boffset + 0) & state->m_bdatasize] << 0)); + + for (x = 0; x < 16; x++) + { + if (!(msk & 0x0001)) + { + srcdat = adata[state->m_aoffset & adatasize] + palt * 32; + state->m_aoffset++; + + if (draw) + { + xoffset++; + + if (!(flip & 0x01)) + xdrawpos = xpos + xcntdraw; + else + xdrawpos = xpos + realxsize - xcntdraw; + + pgm_draw_pix_pri(xdrawpos, dest, destpri, srcdat); + + xcntdraw++; + } + + } + else + { + xoffset++; + xcntdraw++; + } + + msk >>= 1; + } + + state->m_boffset += 2; + } + } +} + +/************************************************************************* + Basic Sprite Renderer + simplified version for non-zoomed cases, a bit faster +*************************************************************************/ + +static void draw_sprite_new_basic( pgm_state *state, running_machine &machine, int wide, int high, int xpos, int ypos, int palt, int flip, bitmap_ind16 &bitmap, bitmap_ind8 &priority_bitmap, int pri ) +{ + int ycnt; + int ydrawpos; + UINT16 *dest; + UINT8* destpri; + int ycntdraw; - if (ydrawpos == 224) - ycnt = high; + state->m_aoffset = (state->m_bdata[(state->m_boffset + 3) & state->m_bdatasize] << 24) | (state->m_bdata[(state->m_boffset + 2) & state->m_bdatasize] << 16) | + (state->m_bdata[(state->m_boffset + 1) & state->m_bdatasize] << 8) | (state->m_bdata[(state->m_boffset + 0) & state->m_bdatasize] << 0); + state->m_aoffset = state->m_aoffset >> 2; state->m_aoffset *= 3; + + state->m_boffset+=4; + + int realysize = high-1; + int realxsize = (wide * 16)-1; + + /* now draw it */ + ycnt = 0; + ycntdraw = 0; + + while (ycnt < high) + { + + if (!(flip & 0x02)) + ydrawpos = ypos + ycntdraw; + else + ydrawpos = ypos + realysize - ycntdraw; + + if ((ydrawpos >= 0) && (ydrawpos < 224)) + { + dest = &bitmap.pix16(ydrawpos); + destpri = &priority_bitmap.pix8(ydrawpos); + draw_sprite_line_basic(machine, wide, dest, destpri, flip, xpos, pri, realxsize, palt, 1); + } + else + { + draw_sprite_line_basic(machine, wide, NULL, NULL, flip, xpos, pri, realxsize, palt, 0); + + if (!(flip & 0x02)) + { + if (ydrawpos>224) + return; + } + else + { + if (ydrawpos<0) + return; + } } + ycntdraw++; ycnt++; } } -static void draw_sprites( running_machine &machine, bitmap_t* spritebitmap, UINT16 *sprite_source ) +static void draw_sprites( pgm_state *state, running_machine &machine, bitmap_ind16& spritebitmap, UINT16 *sprite_source, bitmap_ind8& priority_bitmap ) { /* ZZZZ Zxxx xxxx xxxx zzzz z-yy yyyy yyyy @@ -219,12 +495,19 @@ wwww wwwh hhhh hhhh */ - - pgm_state *state = machine.driver_data(); const UINT16 *finish = state->m_spritebufferram + (0xa00 / 2); + UINT16* start = sprite_source; + while (sprite_source < finish) { + if (!sprite_source[4]) break; /* is this right? */ + sprite_source += 5; + } + sprite_source-=5; + + while (sprite_source >= start) + { int xpos = sprite_source[0] & 0x07ff; int ypos = sprite_source[1] & 0x03ff; int xzom = (sprite_source[0] & 0x7800) >> 11; @@ -261,13 +544,13 @@ if (xpos > 0x3ff) xpos -=0x800; if (ypos > 0x1ff) ypos -=0x400; - if (!sprite_source[4]) break; /* is this right? */ - //if ((priority == 1) && (pri == 0)) break; - draw_sprite_new_zoomed(machine, wide, high, xpos, ypos, palt, boff, flip, spritebitmap, xzoom, xgrow, yzoom, ygrow, pri); + state->m_boffset = boff; + if ((!xzoom) && (!yzoom)) draw_sprite_new_basic(state, machine, wide, high, xpos, ypos, palt, flip, spritebitmap, priority_bitmap, pri ); + else draw_sprite_new_zoomed(state, machine, wide, high, xpos, ypos, palt, flip, spritebitmap, priority_bitmap, xzoom, xgrow, yzoom, ygrow, pri ); - sprite_source += 5; + sprite_source -= 5; } } @@ -276,7 +559,7 @@ { pgm_state *state = space->machine().driver_data(); state->m_tx_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset / 2); + state->m_tx_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_pgm_tx_tilemap_tile_info ) @@ -312,7 +595,7 @@ { pgm_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_pgm_bg_tilemap_tile_info ) @@ -339,89 +622,65 @@ pgm_state *state = machine.driver_data(); int i; + state->m_bdata = machine.region("sprmask")->base(); + state->m_bdatasize = machine.region("sprmask")->bytes() - 1; + state->m_aoffset = 0; + state->m_boffset = 0; + state->m_tx_tilemap = tilemap_create(machine, get_pgm_tx_tilemap_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(15); state->m_bg_tilemap = tilemap_create(machine, get_pgm_bg_tilemap_tile_info, tilemap_scan_rows, 32, 32, 64, 16); - tilemap_set_transparent_pen(state->m_bg_tilemap, 31); - tilemap_set_scroll_rows(state->m_bg_tilemap, 16 * 32); - - state->m_tmppgmbitmap = auto_bitmap_alloc(machine, 448, 224, BITMAP_FORMAT_RGB32); + state->m_bg_tilemap->set_transparent_pen(31); + state->m_bg_tilemap->set_scroll_rows(16 * 32); for (i = 0; i < 0x1200 / 2; i++) palette_set_color(machine, i, MAKE_RGB(0, 0, 0)); state->m_spritebufferram = auto_alloc_array(machine, UINT16, 0xa00/2); - /* we render each sprite to a bitmap then copy the bitmap to screen bitmap with zooming */ - /* easier this way because of the funky sprite format */ - state->m_sprite_temp_render = auto_alloc_array(machine, UINT16, 0x400*0x200); state->save_pointer(NAME(state->m_spritebufferram), 0xa00/2); - state->save_pointer(NAME(state->m_sprite_temp_render), 0x400*0x200); - state->save_item(NAME(*state->m_tmppgmbitmap)); } -SCREEN_UPDATE( pgm ) +SCREEN_UPDATE_IND16( pgm ) { - pgm_state *state = screen->machine().driver_data(); + pgm_state *state = screen.machine().driver_data(); int y; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(state->m_tmppgmbitmap, cliprect, 0x00000000); + bitmap.fill(0x3ff, cliprect); // ddp2 igs logo needs 0x3ff - draw_sprites(screen->machine(), state->m_tmppgmbitmap, state->m_spritebufferram); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_set_scrolly(state->m_bg_tilemap,0, state->m_videoregs[0x2000/2]); + state->m_bg_tilemap->set_scrolly(0, state->m_videoregs[0x2000/2]); for (y = 0; y < 224; y++) - tilemap_set_scrollx(state->m_bg_tilemap, (y + state->m_videoregs[0x2000 / 2]) & 0x1ff, state->m_videoregs[0x3000 / 2] + state->m_rowscrollram[y]); + state->m_bg_tilemap->set_scrollx((y + state->m_videoregs[0x2000 / 2]) & 0x1ff, state->m_videoregs[0x3000 / 2] + state->m_rowscrollram[y]); - { - int y, x; - for (y = 0; y < 224; y++) - { - UINT32* src = BITMAP_ADDR32(state->m_tmppgmbitmap, y, 0); - UINT16* dst = BITMAP_ADDR16(bitmap, y, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 2); - for (x = 0; x < 448; x++) - { - if (src[x] & 0x10000) - if ((src[x] & 0x8000) == 0x8000) - dst[x] = src[x] & 0x7fff; - } - } - } + draw_sprites(state, screen.machine(), bitmap, state->m_spritebufferram, screen.machine().priority_bitmap); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - { - int y, x; + state->m_tx_tilemap->set_scrolly(0, state->m_videoregs[0x5000/2]); + state->m_tx_tilemap->set_scrollx(0, state->m_videoregs[0x6000/2]); // Check - for (y = 0; y < 224; y++) - { - UINT32* src = BITMAP_ADDR32(state->m_tmppgmbitmap, y, 0); - UINT16* dst = BITMAP_ADDR16(bitmap, y, 0); - for (x = 0; x < 448; x++) - { - if (src[x] & 0x10000) - if ((src[x] & 0x8000) == 0x0000) - dst[x] = src[x]; - } - } - } + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); + - tilemap_set_scrolly(state->m_tx_tilemap, 0, state->m_videoregs[0x5000/2]); - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_videoregs[0x6000/2]); // Check - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); return 0; + } -SCREEN_EOF( pgm ) +SCREEN_VBLANK( pgm ) { - pgm_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + pgm_state *state = screen.machine().driver_data(); - /* first 0xa00 of main ram = sprites, seems to be buffered, DMA? */ - memcpy(state->m_spritebufferram, pgm_mainram, 0xa00); + /* first 0xa00 of main ram = sprites, seems to be buffered, DMA? */ + memcpy(state->m_spritebufferram, pgm_mainram, 0xa00); + } } diff -Nru mame-0.144/src/mame/video/phoenix.c mame-0.145/src/mame/video/phoenix.c --- mame-0.144/src/mame/video/phoenix.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/phoenix.c 2012-02-06 21:30:32.000000000 +0000 @@ -186,12 +186,12 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, (HTOTAL - HBSTART)); - tilemap_set_scrolldx(state->m_bg_tilemap, 0, (HTOTAL - HBSTART)); - tilemap_set_scrolldy(state->m_fg_tilemap, 0, (VTOTAL - VBSTART)); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, (VTOTAL - VBSTART)); + state->m_fg_tilemap->set_scrolldx(0, (HTOTAL - HBSTART)); + state->m_bg_tilemap->set_scrolldx(0, (HTOTAL - HBSTART)); + state->m_fg_tilemap->set_scrolldy(0, (VTOTAL - VBSTART)); + state->m_bg_tilemap->set_scrolldy(0, (VTOTAL - VBSTART)); state_save_register_global_pointer(machine, state->m_videoram_pg[0], 0x1000); state_save_register_global_pointer(machine, state->m_videoram_pg[1], 0x1000); @@ -231,9 +231,9 @@ if ((offset & 0x7ff) < 0x340) { if (offset & 0x800) - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } /* as part of the protecion, Survival executes code from $43a4 */ @@ -252,8 +252,8 @@ state->m_cocktail_mode = state->m_videoram_pg_index && (input_port_read(space->machine(), "CAB") & 0x01); - tilemap_set_flip_all(space->machine(), state->m_cocktail_mode ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().set_flip_all(state->m_cocktail_mode ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().mark_all_dirty(); } /* Phoenix has only one palette select effecting both layers */ @@ -261,7 +261,7 @@ { state->m_palette_bank = (data >> 1) & 1; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -276,8 +276,8 @@ state->m_cocktail_mode = state->m_videoram_pg_index && (input_port_read(space->machine(), "CAB") & 0x01); - tilemap_set_flip_all(space->machine(), state->m_cocktail_mode ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().set_flip_all(state->m_cocktail_mode ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().mark_all_dirty(); } @@ -289,7 +289,7 @@ { state->m_palette_bank = ((data >> 1) & 3); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); logerror("Palette: %02X\n", (data & 0x06) >> 1); } @@ -304,7 +304,7 @@ WRITE8_HANDLER( phoenix_scroll_w ) { phoenix_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,data); + state->m_bg_tilemap->set_scrollx(0,data); } @@ -450,10 +450,10 @@ ***************************************************************************/ -SCREEN_UPDATE( phoenix ) +SCREEN_UPDATE_IND16( phoenix ) { - phoenix_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + phoenix_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/pingpong.c mame-0.145/src/mame/video/pingpong.c --- mame-0.144/src/mame/video/pingpong.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pingpong.c 2012-02-06 21:30:32.000000000 +0000 @@ -11,17 +11,6 @@ -/* This is strange; it's unlikely that the sprites actually have a hardware */ -/* clipping region, but I haven't found another way to have them masked by */ -/* the characters at the top and bottom of the screen. */ -static const rectangle spritevisiblearea = -{ - 0*8, 32*8-1, - 4*8, 29*8-1 -}; - - - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -97,14 +86,14 @@ { pingpong_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( pingpong_colorram_w ) { pingpong_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -124,8 +113,13 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { + /* This is strange; it's unlikely that the sprites actually have a hardware */ + /* clipping region, but I haven't found another way to have them masked by */ + /* the characters at the top and bottom of the screen. */ + const rectangle spritevisiblearea(0*8, 32*8-1, 4*8, 29*8-1); + pingpong_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; @@ -143,7 +137,7 @@ color = spriteram[offs] & 0x1f; schar = spriteram[offs + 2] & 0x7f; - drawgfx_transmask(bitmap,&spritevisiblearea,machine.gfx[1], + drawgfx_transmask(bitmap,spritevisiblearea,machine.gfx[1], schar, color, flipx,flipy, @@ -152,10 +146,10 @@ } } -SCREEN_UPDATE( pingpong ) +SCREEN_UPDATE_IND16( pingpong ) { - pingpong_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + pingpong_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/pirates.c mame-0.145/src/mame/video/pirates.c --- mame-0.144/src/mame/video/pirates.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pirates.c 2012-02-06 21:30:32.000000000 +0000 @@ -45,8 +45,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_cols,8,8,64,32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_cols, 8,8,64,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -55,26 +55,26 @@ { pirates_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_tx_tileram+offset); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset/2); + state->m_tx_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( pirates_fg_tileram_w ) { pirates_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_fg_tileram+offset); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( pirates_bg_tileram_w ) { pirates_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_bg_tileram+offset); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { pirates_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -107,14 +107,14 @@ } } -SCREEN_UPDATE(pirates) +SCREEN_UPDATE_IND16(pirates) { - pirates_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll[0]); - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll[0]); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + pirates_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll[0]); + state->m_fg_tilemap->set_scrollx(0,state->m_scroll[0]); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/pitnrun.c mame-0.145/src/mame/video/pitnrun.c --- mame-0.144/src/mame/video/pitnrun.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pitnrun.c 2012-02-06 21:30:31.000000000 +0000 @@ -51,14 +51,14 @@ pitnrun_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_all_tiles_dirty( state->m_fg ); + state->m_fg ->mark_all_dirty(); } WRITE8_HANDLER( pitnrun_videoram2_w ) { pitnrun_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_all_tiles_dirty( state->m_bg ); + state->m_bg ->mark_all_dirty(); } WRITE8_HANDLER( pitnrun_char_bank_select ) @@ -66,7 +66,7 @@ pitnrun_state *state = space->machine().driver_data(); if(state->m_char_bank!=data) { - tilemap_mark_all_tiles_dirty( state->m_bg ); + state->m_bg ->mark_all_dirty(); state->m_char_bank=data; } } @@ -76,7 +76,7 @@ { pitnrun_state *state = space->machine().driver_data(); state->m_scroll = (state->m_scroll & (0xff<<((offset)?0:8))) |( data<<((offset)?8:0)); - tilemap_set_scrollx( state->m_bg, 0, state->m_scroll); + state->m_bg->set_scrollx(0, state->m_scroll); } WRITE8_HANDLER(pitnrun_ha_w) @@ -101,7 +101,7 @@ { pitnrun_state *state = space->machine().driver_data(); state->m_color_select=data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } static void pitnrun_spotlights(running_machine &machine) @@ -116,7 +116,7 @@ datapix=ROM[128*16*i+x+y*16]; for(b=0;b<8;b++) { - *BITMAP_ADDR16(state->m_tmp_bitmap[i], y, x*8+(7-b)) = (datapix&1); + state->m_tmp_bitmap[i]->pix16(y, x*8+(7-b)) = (datapix&1); datapix>>=1; } } @@ -174,15 +174,15 @@ pitnrun_state *state = machine.driver_data(); state->m_fg = tilemap_create( machine, get_tile_info1,tilemap_scan_rows,8,8,32,32 ); state->m_bg = tilemap_create( machine, get_tile_info2,tilemap_scan_rows,8,8,32*4,32 ); - tilemap_set_transparent_pen( state->m_fg, 0 ); - state->m_tmp_bitmap[0] = auto_bitmap_alloc(machine,128,128,machine.primary_screen->format()); - state->m_tmp_bitmap[1] = auto_bitmap_alloc(machine,128,128,machine.primary_screen->format()); - state->m_tmp_bitmap[2] = auto_bitmap_alloc(machine,128,128,machine.primary_screen->format()); - state->m_tmp_bitmap[3] = auto_bitmap_alloc(machine,128,128,machine.primary_screen->format()); + state->m_fg->set_transparent_pen(0 ); + state->m_tmp_bitmap[0] = auto_bitmap_ind16_alloc(machine,128,128); + state->m_tmp_bitmap[1] = auto_bitmap_ind16_alloc(machine,128,128); + state->m_tmp_bitmap[2] = auto_bitmap_ind16_alloc(machine,128,128); + state->m_tmp_bitmap[3] = auto_bitmap_ind16_alloc(machine,128,128); pitnrun_spotlights(machine); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { pitnrun_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -217,68 +217,59 @@ } } -SCREEN_UPDATE( pitnrun ) +SCREEN_UPDATE_IND16( pitnrun ) { - pitnrun_state *state = screen->machine().driver_data(); + pitnrun_state *state = screen.machine().driver_data(); int dx=0,dy=0; - rectangle myclip=*cliprect; + rectangle myclip=cliprect; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed_once(KEYCODE_Q)) + if (screen.machine().input().code_pressed_once(KEYCODE_Q)) { - UINT8 *ROM = screen->machine().region("maincpu")->base(); + UINT8 *ROM = screen.machine().region("maincpu")->base(); ROM[0x84f6]=0; /* lap 0 - normal */ } - if (screen->machine().input().code_pressed_once(KEYCODE_W)) + if (screen.machine().input().code_pressed_once(KEYCODE_W)) { - UINT8 *ROM = screen->machine().region("maincpu")->base(); + UINT8 *ROM = screen.machine().region("maincpu")->base(); ROM[0x84f6]=6; /* lap 6 = spotlight */ } - if (screen->machine().input().code_pressed_once(KEYCODE_E)) + if (screen.machine().input().code_pressed_once(KEYCODE_E)) { - UINT8 *ROM = screen->machine().region("maincpu")->base(); + UINT8 *ROM = screen.machine().region("maincpu")->base(); ROM[0x84f6]=2; /* lap 3 (trial 2)= lightnings */ ROM[0x8102]=1; } #endif - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); if(!(state->m_ha&4)) - tilemap_draw(bitmap,cliprect,state->m_bg, 0,0); + state->m_bg->draw(bitmap, cliprect, 0,0); else { dx=128-state->m_h_heed+((state->m_ha&8)<<5)+3; dy=128-state->m_v_heed+((state->m_ha&0x10)<<4); - if (flip_screen_x_get(screen->machine())) + if (flip_screen_x_get(screen.machine())) dx=128-dx+16; - if (flip_screen_y_get(screen->machine())) + if (flip_screen_y_get(screen.machine())) dy=128-dy; - myclip.min_x=dx; - myclip.min_y=dy; - myclip.max_x=dx+127; - myclip.max_y=dy+127; + myclip.set(dx, dx+127, dy, dy+127); + myclip &= cliprect; - - if(myclip.min_ymin_y)myclip.min_y=cliprect->min_y; - if(myclip.min_xmin_x)myclip.min_x=cliprect->min_x; - - if(myclip.max_y>cliprect->max_y)myclip.max_y=cliprect->max_y; - if(myclip.max_x>cliprect->max_x)myclip.max_x=cliprect->max_x; - - tilemap_draw(bitmap,&myclip,state->m_bg, 0,0); + state->m_bg->draw(bitmap, myclip, 0,0); } - draw_sprites(screen->machine(),bitmap,&myclip); + draw_sprites(screen.machine(),bitmap,myclip); if(state->m_ha&4) - copybitmap_trans(bitmap,state->m_tmp_bitmap[state->m_ha&3],flip_screen_x_get(screen->machine()),flip_screen_y_get(screen->machine()),dx,dy,&myclip, 1); - tilemap_draw(bitmap,cliprect,state->m_fg, 0,0); + copybitmap_trans(bitmap,*state->m_tmp_bitmap[state->m_ha&3],flip_screen_x_get(screen.machine()),flip_screen_y_get(screen.machine()),dx,dy,myclip, 1); + state->m_fg->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/pk8000.c mame-0.145/src/mame/video/pk8000.c --- mame-0.144/src/mame/video/pk8000.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pk8000.c 2012-02-06 21:30:33.000000000 +0000 @@ -95,18 +95,15 @@ palette_set_colors(machine, 0, pk8000_palette, ARRAY_LENGTH(pk8000_palette)); } -UINT32 pk8000_video_update(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *videomem) +UINT32 pk8000_video_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *videomem) { int x,y,j,b; UINT16 offset = (pk8000_video_mode & 0xc0) << 8; rectangle my_rect; - my_rect.min_x = 0; - my_rect.max_x = 256+32-1; - my_rect.min_y = 0; - my_rect.max_y = 192+32-1; + my_rect.set(0, 256+32-1, 0, 192+32-1); if (pk8000_video_enable) { - bitmap_fill(bitmap, &my_rect, (pk8000_video_color >> 4) & 0x0f); + bitmap.fill((pk8000_video_color >> 4) & 0x0f, my_rect); if (BIT(pk8000_video_mode,4)==0){ // Text mode @@ -124,7 +121,7 @@ for (b = 0; b < 8; b++) { UINT8 col = (code >> b) & 0x01 ? (color & 0x0f) : ((color>>4) & 0x0f); - *BITMAP_ADDR16(bitmap, (y*8)+j+16, x*8+(7-b)+16) = col; + bitmap.pix16((y*8)+j+16, x*8+(7-b)+16) = col; } } } @@ -141,7 +138,7 @@ for (b = 2; b < 8; b++) { UINT8 col = ((code >> b) & 0x01) ? (pk8000_video_color) & 0x0f : (pk8000_video_color>>4) & 0x0f; - *BITMAP_ADDR16(bitmap, (y*8)+j+16, x*6+(7-b)+16+8) = col; + bitmap.pix16((y*8)+j+16, x*6+(7-b)+16+8) = col; } } } @@ -163,7 +160,7 @@ for (b = 0; b < 8; b++) { UINT8 col = (code >> b) & 0x01 ? (color & 0x0f) : ((color>>4) & 0x0f); - *BITMAP_ADDR16(bitmap, (y*8)+j+16, x*8+(7-b)+16) = col; + bitmap.pix16((y*8)+j+16, x*8+(7-b)+16) = col; } } } @@ -171,7 +168,7 @@ } } else { // Disabled video - bitmap_fill(bitmap, &my_rect, 0); + bitmap.fill(0, my_rect); } return 0; } diff -Nru mame-0.144/src/mame/video/pktgaldx.c mame-0.145/src/mame/video/pktgaldx.c --- mame-0.144/src/mame/video/pktgaldx.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/pktgaldx.c 2012-02-06 21:30:31.000000000 +0000 @@ -5,34 +5,34 @@ /* Video on the orginal */ -SCREEN_UPDATE( pktgaldx ) +SCREEN_UPDATE_IND16( pktgaldx ) { - pktgaldx_state *state = screen->machine().driver_data(); + pktgaldx_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 0); /* not Confirmed */ - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(0, cliprect); /* not Confirmed */ + screen.machine().priority_bitmap.fill(0); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400, true); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400, true); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } /* Video for the bootleg */ -SCREEN_UPDATE( pktgaldb ) +SCREEN_UPDATE_IND16( pktgaldb ) { - pktgaldx_state *state = screen->machine().driver_data(); + pktgaldx_state *state = screen.machine().driver_data(); int x, y; int offset = 0; int tileno; int colour; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); /* the bootleg seems to treat the tilemaps as sprites */ for (offset = 0; offset < 0x1600 / 2; offset += 8) @@ -46,7 +46,7 @@ y &= 0x1ff; y -= 8; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], tileno ^ 0x1000, colour, 0, 0, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], tileno ^ 0x1000, colour, 0, 0, x, y, 0); } for (offset = 0x1600/2; offset < 0x2000 / 2; offset += 8) @@ -60,7 +60,7 @@ y &= 0x1ff; y -= 8; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], tileno ^ 0x4000, colour, 0, 0, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], tileno ^ 0x4000, colour, 0, 0, x, y, 0); } for (offset = 0x2000/2; offset < 0x4000 / 2; offset += 8) @@ -74,7 +74,7 @@ y &= 0x1ff; y -= 8; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], tileno ^ 0x3000, colour, 0, 0, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], tileno ^ 0x3000, colour, 0, 0, x, y, 0); } return 0; diff -Nru mame-0.144/src/mame/video/playch10.c mame-0.145/src/mame/video/playch10.c --- mame-0.144/src/mame/video/playch10.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/playch10.c 2012-02-06 21:30:33.000000000 +0000 @@ -11,12 +11,13 @@ if (state->m_pc10_sdcs) { videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } } PALETTE_INIT( playch10 ) { + ppu2c0x_device *ppu = machine.device("ppu"); int i; for (i = 0; i < 256; i++) @@ -54,7 +55,7 @@ color_prom++; } - ppu2c0x_init_palette_rgb(machine, 256 ); + ppu->init_palette_rgb(machine, 256); } static void ppu_irq( device_t *device, int *ppu_regs ) @@ -70,14 +71,8 @@ const ppu2c0x_interface playch10_ppu_interface = { - 1, /* gfxlayout num */ - 256, /* color base */ - PPU_MIRROR_NONE, /* mirroring */ - ppu_irq /* irq */ -}; - -const ppu2c0x_interface playch10_ppu_interface_hboard = -{ + "cart", + "bottom", 1, /* gfxlayout num */ 256, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -121,63 +116,67 @@ ***************************************************************************/ -SCREEN_UPDATE( playch10 ) +SCREEN_UPDATE_IND16( playch10_single ) { - playch10_state *state = screen->machine().driver_data(); - device_t *ppu = screen->machine().device("ppu"); + playch10_state *state = screen.machine().driver_data(); + ppu2c0x_device *ppu = screen.machine().device("ppu"); + + rectangle top_monitor = screen.visible_area(); + + top_monitor.max_y = ( top_monitor.max_y - top_monitor.min_y ) / 2; - /* Dual monitor version */ - if (state->m_pc10_bios == 1) + if(state->m_pc10_dispmask_old != state->m_pc10_dispmask) { - device_t *top_screen = screen->machine().device("top"); + state->m_pc10_dispmask_old = state->m_pc10_dispmask; - /* On Playchoice 10 single monitor, this bit toggles */ - /* between PPU and BIOS display. */ - /* We support the multi-monitor layout. In this case, */ - /* if the bit is not set, then we should display */ - /* the PPU portion. */ - - if (screen == top_screen) - { - if ( !state->m_pc10_dispmask ) - /* render the ppu */ - ppu2c0x_render( ppu, bitmap, 0, 0, 0, 0 ); - else - bitmap_fill(bitmap, cliprect, 0); - } - else - { - /* When the bios is accessing vram, the video circuitry can't access it */ - - if ( !state->m_pc10_sdcs ) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - else - bitmap_fill(bitmap, cliprect, 0); - } + if(state->m_pc10_dispmask) + state->m_pc10_game_mode ^= 1; } - else /* Single Monitor version */ + + if ( state->m_pc10_game_mode ) + /* render the ppu */ + ppu->render(bitmap, 0, 0, 0, 0 ); + else { - rectangle top_monitor = screen->visible_area(); + /* When the bios is accessing vram, the video circuitry can't access it */ + if ( !state->m_pc10_sdcs ) + state->m_bg_tilemap->draw(bitmap, top_monitor, 0, 0); + } + return 0; +} - top_monitor.max_y = ( top_monitor.max_y - top_monitor.min_y ) / 2; +SCREEN_UPDATE_IND16( playch10_top ) +{ + playch10_state *state = screen.machine().driver_data(); + ppu2c0x_device *ppu = screen.machine().device("ppu"); + + /* Single Monitor version */ + if (state->m_pc10_bios != 1) + return SCREEN_UPDATE16_CALL(playch10_single); + + if (!state->m_pc10_dispmask) + /* render the ppu */ + ppu->render(bitmap, 0, 0, 0, 0); + else + bitmap.fill(0, cliprect); + + return 0; +} + +SCREEN_UPDATE_IND16( playch10_bottom ) +{ + playch10_state *state = screen.machine().driver_data(); + + /* Single Monitor version */ + if (state->m_pc10_bios != 1) + return SCREEN_UPDATE16_CALL(playch10_single); + + /* When the bios is accessing vram, the video circuitry can't access it */ + + if ( !state->m_pc10_sdcs ) + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + else + bitmap.fill(0, cliprect); - if(state->m_pc10_dispmask_old != state->m_pc10_dispmask) - { - state->m_pc10_dispmask_old = state->m_pc10_dispmask; - - if(state->m_pc10_dispmask) - state->m_pc10_game_mode ^= 1; - } - - if ( state->m_pc10_game_mode ) - /* render the ppu */ - ppu2c0x_render( ppu, bitmap, 0, 0, 0, 0 ); - else - { - /* When the bios is accessing vram, the video circuitry can't access it */ - if ( !state->m_pc10_sdcs ) - tilemap_draw(bitmap, &top_monitor, state->m_bg_tilemap, 0, 0); - } - } return 0; } diff -Nru mame-0.144/src/mame/video/playmark.c mame-0.145/src/mame/video/playmark.c --- mame-0.144/src/mame/video/playmark.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/playmark.c 2012-02-06 21:30:31.000000000 +0000 @@ -120,7 +120,7 @@ state->m_tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); state->m_xoffset = 0; state->m_yoffset = 0; @@ -140,10 +140,10 @@ state->m_fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info,tilemap_scan_rows, 16, 16, 32, 32); state->m_bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info,tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap, -4, -4); + state->m_bg_tilemap->set_scrolldx(-4, -4); state->m_xoffset = 1; state->m_yoffset = 0; @@ -163,8 +163,8 @@ state->m_fg_tilemap = tilemap_create(machine, wbeachvl_get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); state->m_bg_tilemap = tilemap_create(machine, wbeachvl_get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_xoffset = 0; state->m_yoffset = 0; @@ -182,7 +182,7 @@ state->m_tx_tilemap = tilemap_create(machine, bigtwin_get_tx_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_fg_tilemap = tilemap_create(machine, bigtwin_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); state->m_xoffset = 0; state->m_yoffset = 0; @@ -201,12 +201,12 @@ state->m_fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_tx_tilemap, -14, -14); - tilemap_set_scrolldx(state->m_fg_tilemap, -14, -14); - tilemap_set_scrolldx(state->m_bg_tilemap, -14, -14); + state->m_tx_tilemap->set_scrolldx(-14, -14); + state->m_fg_tilemap->set_scrolldx(-14, -14); + state->m_bg_tilemap->set_scrolldx(-14, -14); state->m_xoffset = -9; state->m_yoffset = -8; @@ -225,12 +225,12 @@ state->m_fg_tilemap = tilemap_create(machine, hrdtimes_get_fg_tile_info,tilemap_scan_rows, 16, 16, 32, 32); state->m_bg_tilemap = tilemap_create(machine, hrdtimes_get_bg_tile_info,tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_tx_tilemap, -14, -14); - tilemap_set_scrolldx(state->m_fg_tilemap, -10, -10); - tilemap_set_scrolldx(state->m_bg_tilemap, -12, -12); + state->m_tx_tilemap->set_scrolldx(-14, -14); + state->m_fg_tilemap->set_scrolldx(-10, -10); + state->m_bg_tilemap->set_scrolldx(-12, -12); state->m_xoffset = -8; state->m_yoffset = -8; @@ -252,7 +252,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset / 2); + state->m_tx_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( wbeachvl_fgvideoram_w ) @@ -260,7 +260,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset / 2); + state->m_fg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( wbeachvl_bgvideoram_w ) @@ -268,7 +268,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram3[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( hrdtimes_txvideoram_w ) @@ -276,7 +276,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram1[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( hrdtimes_fgvideoram_w ) @@ -284,7 +284,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( hrdtimes_bgvideoram_w ) @@ -292,7 +292,7 @@ playmark_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram3[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -322,15 +322,15 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_tx_tilemap, 0, data + 2); break; - case 1: tilemap_set_scrolly(state->m_tx_tilemap, 0, data); break; + case 0: state->m_tx_tilemap->set_scrollx(0, data + 2); break; + case 1: state->m_tx_tilemap->set_scrolly(0, data); break; case 2: state->m_bgscrollx = -(data + 4); break; case 3: state->m_bgscrolly = (-data) & 0x1ff; state->m_bg_enable = data & 0x0200; state->m_bg_full_size = data & 0x0400; break; - case 4: tilemap_set_scrollx(state->m_fg_tilemap, 0, data + 6); break; - case 5: tilemap_set_scrolly(state->m_fg_tilemap, 0, data); break; + case 4: state->m_fg_tilemap->set_scrollx(0, data + 6); break; + case 5: state->m_fg_tilemap->set_scrolly(0, data); break; } } @@ -342,14 +342,14 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_tx_tilemap, 0, data + 2); break; - case 1: tilemap_set_scrolly(state->m_tx_tilemap, 0, data); break; + case 0: state->m_tx_tilemap->set_scrollx(0, data + 2); break; + case 1: state->m_tx_tilemap->set_scrolly(0, data); break; case 2: state->m_fgscrollx = data + 4;break; - case 3: tilemap_set_scrolly(state->m_fg_tilemap, 0, data & 0x3ff); + case 3: state->m_fg_tilemap->set_scrolly(0, data & 0x3ff); state->m_fg_rowscroll_enable = data & 0x0800; break; - case 4: tilemap_set_scrollx(state->m_bg_tilemap, 0, data + 6); break; - case 5: tilemap_set_scrolly(state->m_bg_tilemap, 0, data); break; + case 4: state->m_bg_tilemap->set_scrollx(0, data + 6); break; + case 5: state->m_bg_tilemap->set_scrolly(0, data); break; } } @@ -361,15 +361,15 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_tx_tilemap, 0, data + 2); break; - case 1: tilemap_set_scrolly(state->m_tx_tilemap, 0, data); break; + case 0: state->m_tx_tilemap->set_scrollx(0, data + 2); break; + case 1: state->m_tx_tilemap->set_scrolly(0, data); break; case 2: state->m_bgscrollx = -data; break; case 3: state->m_bgscrolly = (-data + 2)& 0x1ff; state->m_bg_enable = data & 0x0200; state->m_bg_full_size = data & 0x0400; break; - case 4: tilemap_set_scrollx(state->m_fg_tilemap, 0, data + 6); break; - case 5: tilemap_set_scrolly(state->m_fg_tilemap, 0, data); break; + case 4: state->m_fg_tilemap->set_scrollx(0, data + 6); break; + case 5: state->m_fg_tilemap->set_scrolly(0, data); break; } } @@ -381,12 +381,12 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_tx_tilemap, 0, data); break; - case 1: tilemap_set_scrolly(state->m_tx_tilemap, 0, data); break; - case 2: tilemap_set_scrollx(state->m_fg_tilemap, 0, data); break; - case 3: tilemap_set_scrolly(state->m_fg_tilemap, 0, data); break; - case 4: tilemap_set_scrollx(state->m_bg_tilemap, 0, data); break; - case 5: tilemap_set_scrolly(state->m_bg_tilemap, 0, data); break; + case 0: state->m_tx_tilemap->set_scrollx(0, data); break; + case 1: state->m_tx_tilemap->set_scrolly(0, data); break; + case 2: state->m_fg_tilemap->set_scrollx(0, data); break; + case 3: state->m_fg_tilemap->set_scrolly(0, data); break; + case 4: state->m_bg_tilemap->set_scrollx(0, data); break; + case 5: state->m_bg_tilemap->set_scrolly(0, data); break; } } @@ -396,7 +396,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int codeshift ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int codeshift ) { playmark_state *state = machine.driver_data(); int offs, start_offset = state->m_spriteram_size / 2 - 4; @@ -440,7 +440,7 @@ } -static void bigtwinb_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int codeshift ) +static void bigtwinb_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int codeshift ) { playmark_state *state = machine.driver_data(); int offs, start_offset = state->m_spriteram_size / 2 - 4; @@ -477,7 +477,7 @@ } } -static void draw_bitmap( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bitmap( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { playmark_state *state = machine.driver_data(); int x, y, count; @@ -495,9 +495,9 @@ { if (state->m_bg_full_size) { - *BITMAP_ADDR16(bitmap, (y + state->m_bgscrolly) & 0x1ff, (x + state->m_bgscrollx) & 0x1ff) = 0x100 + color; + bitmap.pix16((y + state->m_bgscrolly) & 0x1ff, (x + state->m_bgscrollx) & 0x1ff) = 0x100 + color; - pri = BITMAP_ADDR8(machine.priority_bitmap, (y + state->m_bgscrolly) & 0x1ff, 0); + pri = &machine.priority_bitmap.pix8((y + state->m_bgscrolly) & 0x1ff); pri[(x + state->m_bgscrollx) & 0x1ff] |= 2; } else @@ -505,9 +505,9 @@ /* 50% size */ if(!(x % 2) && !(y % 2)) { - *BITMAP_ADDR16(bitmap, (y / 2 + state->m_bgscrolly) & 0x1ff, (x / 2 + state->m_bgscrollx) & 0x1ff) = 0x100 + color; + bitmap.pix16((y / 2 + state->m_bgscrolly) & 0x1ff, (x / 2 + state->m_bgscrollx) & 0x1ff) = 0x100 + color; - pri = BITMAP_ADDR8(machine.priority_bitmap, (y / 2 + state->m_bgscrolly) & 0x1ff, 0); + pri = &machine.priority_bitmap.pix8((y / 2 + state->m_bgscrolly) & 0x1ff); pri[(x / 2 + state->m_bgscrollx) & 0x1ff] |= 2; } } @@ -518,94 +518,94 @@ } } -SCREEN_UPDATE( bigtwin ) +SCREEN_UPDATE_IND16( bigtwin ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_bg_enable) - draw_bitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 4); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + draw_bitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 4); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( bigtwinb ) +SCREEN_UPDATE_IND16( bigtwinb ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); // video enabled if (state->m_scroll[6] & 1) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - bigtwinb_draw_sprites(screen->machine(), bitmap, cliprect, 4); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + bigtwinb_draw_sprites(screen.machine(), bitmap, cliprect, 4); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } -SCREEN_UPDATE( excelsr ) +SCREEN_UPDATE_IND16( excelsr ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 1); if (state->m_bg_enable) - draw_bitmap(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 2); + draw_bitmap(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 4); + draw_sprites(screen.machine(), bitmap, cliprect, 2); return 0; } -SCREEN_UPDATE( wbeachvl ) +SCREEN_UPDATE_IND16( wbeachvl ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); if (state->m_fg_rowscroll_enable) { int i; - tilemap_set_scroll_rows(state->m_fg_tilemap, 512); + state->m_fg_tilemap->set_scroll_rows(512); for (i = 0; i < 256; i++) - tilemap_set_scrollx(state->m_fg_tilemap, i + 1, state->m_rowscroll[8 * i]); + state->m_fg_tilemap->set_scrollx(i + 1, state->m_rowscroll[8 * i]); } else { - tilemap_set_scroll_rows(state->m_fg_tilemap, 1); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fgscrollx); + state->m_fg_tilemap->set_scroll_rows(1); + state->m_fg_tilemap->set_scrollx(0, state->m_fgscrollx); } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( hrdtimes ) +SCREEN_UPDATE_IND16( hrdtimes ) { - playmark_state *state = screen->machine().driver_data(); + playmark_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); // video enabled if (state->m_scroll[6] & 1) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/plygonet.c mame-0.145/src/mame/video/plygonet.c --- mame-0.144/src/mame/video/plygonet.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/plygonet.c 2012-02-06 21:30:33.000000000 +0000 @@ -51,8 +51,8 @@ COMBINE_DATA(&vram[offset]); - tilemap_mark_tile_dirty(state->m_ttl_tilemap, offset*2); - tilemap_mark_tile_dirty(state->m_ttl_tilemap, offset*2+1); + state->m_ttl_tilemap->mark_tile_dirty(offset*2); + state->m_ttl_tilemap->mark_tile_dirty(offset*2+1); } READ32_HANDLER( polygonet_roz_ram_r ) @@ -70,8 +70,8 @@ COMBINE_DATA(&vram[offset]); - tilemap_mark_tile_dirty(state->m_roz_tilemap, offset*2); - tilemap_mark_tile_dirty(state->m_roz_tilemap, offset*2+1); + state->m_roz_tilemap->mark_tile_dirty(offset*2); + state->m_roz_tilemap->mark_tile_dirty(offset*2+1); } static TILEMAP_MAPPER( plygonet_scan ) @@ -111,11 +111,11 @@ /* create the tilemap */ state->m_ttl_tilemap = tilemap_create(machine, ttl_get_tile_info, plygonet_scan, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_ttl_tilemap, 0); + state->m_ttl_tilemap->set_transparent_pen(0); /* set up the roz t-map too */ state->m_roz_tilemap = tilemap_create(machine, roz_get_tile_info, plygonet_scan_cols, 16, 16, 32, 64); - tilemap_set_transparent_pen(state->m_roz_tilemap, 0); + state->m_roz_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_ttl_gfx_index)); @@ -123,16 +123,16 @@ state->save_item(NAME(state->m_roz_vram)); } -SCREEN_UPDATE( polygonet ) +SCREEN_UPDATE_IND16( polygonet ) { - polygonet_state *state = screen->machine().driver_data(); - device_t *k053936 = screen->machine().device("k053936"); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + polygonet_state *state = screen.machine().driver_data(); + device_t *k053936 = screen.machine().device("k053936"); + screen.machine().priority_bitmap.fill(0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); k053936_zoom_draw(k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_ttl_tilemap, 0, 1<<0); + state->m_ttl_tilemap->draw(bitmap, cliprect, 0, 1<<0); return 0; } diff -Nru mame-0.144/src/mame/video/pokechmp.c mame-0.145/src/mame/video/pokechmp.c --- mame-0.144/src/mame/video/pokechmp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pokechmp.c 2012-02-06 21:30:32.000000000 +0000 @@ -9,7 +9,7 @@ pokechmp_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( pokechmp_flipscreen_w ) @@ -17,7 +17,7 @@ if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -38,7 +38,7 @@ 8, 8, 32, 32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { pokechmp_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -72,10 +72,10 @@ } } -SCREEN_UPDATE( pokechmp ) +SCREEN_UPDATE_IND16( pokechmp ) { - pokechmp_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + pokechmp_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/polepos.c mame-0.145/src/mame/video/polepos.c --- mame-0.144/src/mame/video/polepos.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/polepos.c 2012-02-06 21:30:31.000000000 +0000 @@ -181,7 +181,7 @@ code, color, 0); - tileinfo->group = color; + tileinfo.group = color; } @@ -287,7 +287,7 @@ polepos_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_view16_memory[offset]); if (offset < 0x400) - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( polepos_view_r ) @@ -301,7 +301,7 @@ polepos_state *state = space->machine().driver_data(); state->m_view16_memory[offset] = (state->m_view16_memory[offset] & 0xff00) | data; if (offset < 0x400) - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( polepos_view16_hscroll_w ) @@ -309,7 +309,7 @@ polepos_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll); } WRITE8_HANDLER( polepos_chacl_w ) @@ -318,7 +318,7 @@ if (state->m_chacl != (data & 1)) { state->m_chacl = data & 1; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } } @@ -339,7 +339,7 @@ { polepos_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_alpha16_memory[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( polepos_alpha_r ) @@ -352,7 +352,7 @@ { polepos_state *state = space->machine().driver_data(); state->m_alpha16_memory[offset] = (state->m_alpha16_memory[offset] & 0xff00) | data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -363,7 +363,7 @@ ***************************************************************************/ -static void draw_road(running_machine &machine, bitmap_t *bitmap) +static void draw_road(running_machine &machine, bitmap_ind16 &bitmap) { polepos_state *state = machine.driver_data(); const UINT8 *road_control = machine.region("gfx5")->base(); @@ -439,7 +439,7 @@ } } -static void zoom_sprite(running_machine &machine, bitmap_t *bitmap,int big, +static void zoom_sprite(running_machine &machine, bitmap_ind16 &bitmap,int big, UINT32 code,UINT32 color,int flipx,int sx,int sy, int sizex,int sizey) { @@ -475,7 +475,7 @@ int pen = src[offs/2 ^ flipx]; if (!((transmask >> pen) & 1)) - *BITMAP_ADDR16(bitmap, yy, xx) = pen + coloroffs; + bitmap.pix16(yy, xx) = pen + coloroffs; } offs++; @@ -490,7 +490,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { polepos_state *state = machine.driver_data(); UINT16 *posmem = &state->m_sprite16_memory[0x380]; @@ -520,14 +520,14 @@ } -SCREEN_UPDATE( polepos ) +SCREEN_UPDATE_IND16( polepos ) { - polepos_state *state = screen->machine().driver_data(); - rectangle clip = *cliprect; + polepos_state *state = screen.machine().driver_data(); + rectangle clip = cliprect; clip.max_y = 127; - tilemap_draw(bitmap,&clip,state->m_bg_tilemap,0,0); - draw_road(screen->machine(), bitmap); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, clip, 0,0); + draw_road(screen.machine(), bitmap); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/policetr.c mame-0.145/src/mame/video/policetr.c --- mame-0.144/src/mame/video/policetr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/policetr.c 2012-02-06 21:30:33.000000000 +0000 @@ -348,15 +348,15 @@ * *************************************/ -SCREEN_UPDATE( policetr ) +SCREEN_UPDATE_IND16( policetr ) { - policetr_state *state = screen->machine().driver_data(); - int width = cliprect->max_x - cliprect->min_x + 1; + policetr_state *state = screen.machine().driver_data(); + int width = cliprect.width(); int y; /* render all the scanlines from the dstbitmap to MAME's bitmap */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - draw_scanline8(bitmap, cliprect->min_x, y, width, &state->m_dstbitmap[DSTBITMAP_WIDTH * y + cliprect->min_x], NULL); + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + draw_scanline8(bitmap, cliprect.min_x, y, width, &state->m_dstbitmap[DSTBITMAP_WIDTH * y + cliprect.min_x], NULL); return 0; } diff -Nru mame-0.144/src/mame/video/polyplay.c mame-0.145/src/mame/video/polyplay.c --- mame-0.144/src/mame/video/polyplay.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/polyplay.c 2012-02-06 21:30:31.000000000 +0000 @@ -47,9 +47,9 @@ } -SCREEN_UPDATE( polyplay ) +SCREEN_UPDATE_IND16( polyplay ) { - polyplay_state *state = screen->machine().driver_data(); + polyplay_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; offs_t offs; @@ -60,7 +60,7 @@ int sy = offs >> 6 << 3; UINT8 code = videoram[offs]; - drawgfx_opaque(bitmap,cliprect, screen->machine().gfx[(code >> 7) & 0x01], + drawgfx_opaque(bitmap,cliprect, screen.machine().gfx[(code >> 7) & 0x01], code, 0, 0, 0, sx, sy); } diff -Nru mame-0.144/src/mame/video/poolshrk.c mame-0.145/src/mame/video/poolshrk.c --- mame-0.144/src/mame/video/poolshrk.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/poolshrk.c 2012-02-06 21:30:31.000000000 +0000 @@ -23,18 +23,18 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE( poolshrk ) +SCREEN_UPDATE_IND16( poolshrk ) { - poolshrk_state *state = screen->machine().driver_data(); + poolshrk_state *state = screen.machine().driver_data(); int i; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* draw sprites */ @@ -43,12 +43,12 @@ int hpos = state->m_hpos_ram[i]; int vpos = state->m_vpos_ram[i]; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], i, (i == 0) ? 0 : 1, 0, 0, + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[0], i, (i == 0) ? 0 : 1, 0, 0, 248 - hpos, vpos - 15, 0); } /* draw playfield */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/pooyan.c mame-0.145/src/mame/video/pooyan.c --- mame-0.144/src/mame/video/pooyan.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/pooyan.c 2012-02-06 21:30:31.000000000 +0000 @@ -132,7 +132,7 @@ { pooyan_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -140,7 +140,7 @@ { pooyan_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -157,7 +157,7 @@ * *************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { pooyan_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -192,11 +192,11 @@ * *************************************/ -SCREEN_UPDATE( pooyan ) +SCREEN_UPDATE_IND16( pooyan ) { - pooyan_state *state = screen->machine().driver_data(); + pooyan_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/popeye.c mame-0.145/src/mame/video/popeye.c --- mame-0.144/src/mame/video/popeye.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/popeye.c 2012-02-06 21:30:31.000000000 +0000 @@ -172,14 +172,14 @@ { popeye_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popeye_colorram_w ) { popeye_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popeye_bitmap_w ) @@ -202,7 +202,7 @@ { for (x = 0; x < 8; x++) { - *BITMAP_ADDR16(state->m_tmpbitmap2, sy+y, sx+x) = colour; + state->m_tmpbitmap2->pix16(sy+y, sx+x) = colour; } } } @@ -219,7 +219,7 @@ { for (x = 0; x < 8; x++) { - *BITMAP_ADDR16(state->m_tmpbitmap2, sy+y, sx+x) = colour; + state->m_tmpbitmap2->pix16(sy+y, sx+x) = colour; } } } @@ -247,12 +247,12 @@ { popeye_state *state = machine.driver_data(); state->m_bitmapram = auto_alloc_array(machine, UINT8, popeye_bitmapram_size); - state->m_tmpbitmap2 = auto_bitmap_alloc(machine,1024,1024,machine.primary_screen->format()); /* actually 1024x512 but not rolling over vertically? */ + state->m_tmpbitmap2 = auto_bitmap_ind16_alloc(machine,1024,1024); /* actually 1024x512 but not rolling over vertically? */ state->m_bitmap_type = TYPE_SKYSKIPR; state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_lastflip = 0; @@ -265,12 +265,12 @@ { popeye_state *state = machine.driver_data(); state->m_bitmapram = auto_alloc_array(machine, UINT8, popeye_bitmapram_size); - state->m_tmpbitmap2 = auto_bitmap_alloc(machine,512,512,machine.primary_screen->format()); + state->m_tmpbitmap2 = auto_bitmap_ind16_alloc(machine,512,512); state->m_bitmap_type = TYPE_POPEYE; state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_lastflip = 0; @@ -279,7 +279,7 @@ state_save_register_global_pointer(machine, state->m_bitmapram, popeye_bitmapram_size); } -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { popeye_state *state = machine.driver_data(); int offs; @@ -296,7 +296,7 @@ set_background_palette(machine, (*state->m_palettebank & 0x08) >> 3); if (state->m_background_pos[1] == 0) /* no background */ - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); else { /* copy the background graphics */ @@ -313,11 +313,11 @@ scrolly = -scrolly; } - copyscrollbitmap(bitmap,state->m_tmpbitmap2,1,&scrollx,1,&scrolly,cliprect); + copyscrollbitmap(bitmap,*state->m_tmpbitmap2,1,&scrollx,1,&scrolly,cliprect); } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { popeye_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -371,11 +371,11 @@ } } -SCREEN_UPDATE( popeye ) +SCREEN_UPDATE_IND16( popeye ) { - popeye_state *state = screen->machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + popeye_state *state = screen.machine().driver_data(); + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/popper.c mame-0.145/src/mame/video/popper.c --- mame-0.144/src/mame/video/popper.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/popper.c 2012-02-06 21:30:31.000000000 +0000 @@ -59,8 +59,8 @@ popper_state *state = space->machine().driver_data(); state->m_ol_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_ol_p123_tilemap, offset); - tilemap_mark_tile_dirty(state->m_ol_p0_tilemap, offset); + state->m_ol_p123_tilemap->mark_tile_dirty(offset); + state->m_ol_p0_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popper_videoram_w ) @@ -68,8 +68,8 @@ popper_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_p123_tilemap, offset); - tilemap_mark_tile_dirty(state->m_p0_tilemap, offset); + state->m_p123_tilemap->mark_tile_dirty(offset); + state->m_p0_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popper_ol_attribram_w ) @@ -77,8 +77,8 @@ popper_state *state = space->machine().driver_data(); state->m_ol_attribram[offset] = data; - tilemap_mark_tile_dirty(state->m_ol_p123_tilemap, offset); - tilemap_mark_tile_dirty(state->m_ol_p0_tilemap, offset); + state->m_ol_p123_tilemap->mark_tile_dirty(offset); + state->m_ol_p0_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popper_attribram_w ) @@ -86,8 +86,8 @@ popper_state *state = space->machine().driver_data(); state->m_attribram[offset] = data; - tilemap_mark_tile_dirty(state->m_p123_tilemap, offset); - tilemap_mark_tile_dirty(state->m_p0_tilemap, offset); + state->m_p123_tilemap->mark_tile_dirty(offset); + state->m_p0_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( popper_flipscreen_w ) @@ -95,7 +95,7 @@ popper_state *state = space->machine().driver_data(); state->m_flipscreen = data; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); if (state->m_flipscreen) state->m_tilemap_clip.min_x = state->m_tilemap_clip.max_x - 15; @@ -116,7 +116,7 @@ if (state->m_gfx_bank != data) { state->m_gfx_bank = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -132,7 +132,7 @@ tile_number, (attr & 0xf), 0); - tileinfo->group = (attr & 0x80) >> 7; + tileinfo.group = (attr & 0x80) >> 7; } static TILE_GET_INFO( get_popper_p0_tile_info ) @@ -143,7 +143,7 @@ tile_number += state->m_gfx_bank << 8; //pen 0 only in front if colour set as well - tileinfo->group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0; + tileinfo.group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0; SET_TILE_INFO( 0, @@ -164,7 +164,7 @@ tile_number, (attr & 0xf), 0); - tileinfo->group = (attr & 0x80) >> 7; + tileinfo.group = (attr & 0x80) >> 7; } static TILE_GET_INFO( get_popper_ol_p0_tile_info ) @@ -175,7 +175,7 @@ tile_number += state->m_gfx_bank << 8; //pen 0 only in front if colour set as well - tileinfo->group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0; + tileinfo.group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0; SET_TILE_INFO( 0, @@ -192,19 +192,19 @@ state->m_ol_p123_tilemap = tilemap_create(machine, get_popper_ol_p123_tile_info, tilemap_scan_cols, 8, 8, 2, 32); state->m_ol_p0_tilemap = tilemap_create(machine, get_popper_ol_p0_tile_info, tilemap_scan_cols, 8, 8, 2, 32); - tilemap_set_transmask(state->m_p123_tilemap, 0, 0x0f, 0x01); - tilemap_set_transmask(state->m_p123_tilemap, 1, 0x01, 0x0f); - tilemap_set_transmask(state->m_p0_tilemap, 0, 0x0f, 0x0e); - tilemap_set_transmask(state->m_p0_tilemap, 1, 0x0e, 0x0f); - tilemap_set_transmask(state->m_ol_p123_tilemap, 0, 0x0f, 0x01); - tilemap_set_transmask(state->m_ol_p123_tilemap, 1, 0x01, 0x0f); - tilemap_set_transmask(state->m_ol_p0_tilemap, 0, 0x0f, 0x0e); - tilemap_set_transmask(state->m_ol_p0_tilemap, 1, 0x0e, 0x0f); + state->m_p123_tilemap->set_transmask(0, 0x0f, 0x01); + state->m_p123_tilemap->set_transmask(1, 0x01, 0x0f); + state->m_p0_tilemap->set_transmask(0, 0x0f, 0x0e); + state->m_p0_tilemap->set_transmask(1, 0x0e, 0x0f); + state->m_ol_p123_tilemap->set_transmask(0, 0x0f, 0x01); + state->m_ol_p123_tilemap->set_transmask(1, 0x01, 0x0f); + state->m_ol_p0_tilemap->set_transmask(0, 0x0f, 0x0e); + state->m_ol_p0_tilemap->set_transmask(1, 0x0e, 0x0f); state->m_tilemap_clip = machine.primary_screen->visible_area(); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { popper_state *state = machine.driver_data(); int offs, sx, sy, flipx, flipy; @@ -246,11 +246,11 @@ } } -SCREEN_UPDATE( popper ) +SCREEN_UPDATE_IND16( popper ) { - popper_state *state = screen->machine().driver_data(); + popper_state *state = screen.machine().driver_data(); rectangle finalclip = state->m_tilemap_clip; - sect_rect(&finalclip, cliprect); + finalclip &= cliprect; //attribram //76543210 @@ -258,16 +258,16 @@ //-xxx---- colour for pen 0 (from second prom?) //----xxxx colour for pens 1,2,3 - tilemap_draw(bitmap, cliprect, state->m_p123_tilemap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_p0_tilemap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, &finalclip, state->m_ol_p123_tilemap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, &finalclip, state->m_ol_p0_tilemap, TILEMAP_DRAW_LAYER1, 0); - - draw_sprites(screen->machine(), bitmap, cliprect); - - tilemap_draw(bitmap, cliprect, state->m_p123_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_p0_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, &finalclip, state->m_ol_p123_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, &finalclip, state->m_ol_p0_tilemap, TILEMAP_DRAW_LAYER0, 0); + state->m_p123_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_p0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_ol_p123_tilemap->draw(bitmap, finalclip, TILEMAP_DRAW_LAYER1, 0); + state->m_ol_p0_tilemap->draw(bitmap, finalclip, TILEMAP_DRAW_LAYER1, 0); + + draw_sprites(screen.machine(), bitmap, cliprect); + + state->m_p123_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_p0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_ol_p123_tilemap->draw(bitmap, finalclip, TILEMAP_DRAW_LAYER0, 0); + state->m_ol_p0_tilemap->draw(bitmap, finalclip, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/portrait.c mame-0.145/src/mame/video/portrait.c --- mame-0.144/src/mame/video/portrait.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/portrait.c 2012-02-06 21:30:31.000000000 +0000 @@ -12,18 +12,18 @@ WRITE8_HANDLER( portrait_bgvideo_write ) { portrait_state *state = space->machine().driver_data(); - tilemap_mark_tile_dirty(state->m_background,offset/2); + state->m_background->mark_tile_dirty(offset/2); state->m_bgvideoram[offset] = data; } WRITE8_HANDLER( portrait_fgvideo_write ) { portrait_state *state = space->machine().driver_data(); - tilemap_mark_tile_dirty(state->m_foreground,offset/2); + state->m_foreground->mark_tile_dirty(offset/2); state->m_fgvideoram[offset] = data; } -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, const UINT8 *source ) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, const UINT8 *source ) { int attr = source[tile_index*2+0]; int tilenum = source[tile_index*2+1]; @@ -72,7 +72,7 @@ state->m_background = tilemap_create( machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32 ); state->m_foreground = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32 ); - tilemap_set_transparent_pen( state->m_foreground, 7 ); + state->m_foreground->set_transparent_pen(7 ); } @@ -129,7 +129,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { portrait_state *state = machine.driver_data(); UINT8 *source = state->m_spriteram; @@ -188,26 +188,26 @@ } } -SCREEN_UPDATE( portrait ) +SCREEN_UPDATE_IND16( portrait ) { - portrait_state *state = screen->machine().driver_data(); + portrait_state *state = screen.machine().driver_data(); rectangle cliprect_scroll, cliprect_no_scroll; - cliprect_scroll = cliprect_no_scroll = *cliprect; + cliprect_scroll = cliprect_no_scroll = cliprect; cliprect_no_scroll.min_x = cliprect_no_scroll.max_x - 111; cliprect_scroll.max_x = cliprect_scroll.min_x + 319; - tilemap_set_scrolly(state->m_background, 0, 0); - tilemap_set_scrolly(state->m_foreground, 0, 0); - tilemap_draw(bitmap, &cliprect_no_scroll, state->m_background, 0, 0); - tilemap_draw(bitmap, &cliprect_no_scroll, state->m_foreground, 0, 0); - - tilemap_set_scrolly(state->m_background, 0, state->m_scroll); - tilemap_set_scrolly(state->m_foreground, 0, state->m_scroll); - tilemap_draw(bitmap, &cliprect_scroll, state->m_background, 0, 0); - tilemap_draw(bitmap, &cliprect_scroll, state->m_foreground, 0, 0); + state->m_background->set_scrolly(0, 0); + state->m_foreground->set_scrolly(0, 0); + state->m_background->draw(bitmap, cliprect_no_scroll, 0, 0); + state->m_foreground->draw(bitmap, cliprect_no_scroll, 0, 0); + + state->m_background->set_scrolly(0, state->m_scroll); + state->m_foreground->set_scrolly(0, state->m_scroll); + state->m_background->draw(bitmap, cliprect_scroll, 0, 0); + state->m_foreground->draw(bitmap, cliprect_scroll, 0, 0); - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/powerins.c mame-0.145/src/mame/video/powerins.c --- mame-0.144/src/mame/video/powerins.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/powerins.c 2012-02-06 21:30:31.000000000 +0000 @@ -61,7 +61,7 @@ if (data != state->m_tile_bank) { state->m_tile_bank = data; // Tiles Bank (VRAM 0) - tilemap_mark_all_tiles_dirty(state->m_tilemap_0); + state->m_tilemap_0->mark_all_dirty(); } } } @@ -134,7 +134,7 @@ { powerins_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0, offset); + state->m_tilemap_0->mark_tile_dirty(offset); } static TILEMAP_MAPPER( powerins_get_memory_offset_0 ) @@ -176,7 +176,7 @@ { powerins_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1, offset); + state->m_tilemap_1->mark_tile_dirty(offset); } @@ -206,12 +206,12 @@ 8,8, DIM_NX_1, DIM_NY_1 ); - tilemap_set_scroll_rows(state->m_tilemap_0,1); - tilemap_set_scroll_cols(state->m_tilemap_0,1); + state->m_tilemap_0->set_scroll_rows(1); + state->m_tilemap_0->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1,1); - tilemap_set_scroll_cols(state->m_tilemap_1,1); - tilemap_set_transparent_pen(state->m_tilemap_1,15); + state->m_tilemap_1->set_scroll_rows(1); + state->m_tilemap_1->set_scroll_cols(1); + state->m_tilemap_1->set_transparent_pen(15); } @@ -263,7 +263,7 @@ #define SIGN_EXTEND_POS(_var_) {_var_ &= 0x3ff; if (_var_ > 0x1ff) _var_ -= 0x400;} -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { powerins_state *state = machine.driver_data(); UINT16 *source = state->m_spriteram + 0x8000/2; @@ -340,36 +340,36 @@ ***************************************************************************/ -SCREEN_UPDATE( powerins ) +SCREEN_UPDATE_IND16( powerins ) { - powerins_state *state = screen->machine().driver_data(); + powerins_state *state = screen.machine().driver_data(); int layers_ctrl = -1; int scrollx = (state->m_vctrl_0[2/2]&0xff) + (state->m_vctrl_0[0/2]&0xff)*256; int scrolly = (state->m_vctrl_0[6/2]&0xff) + (state->m_vctrl_0[4/2]&0xff)*256; - tilemap_set_scrollx( state->m_tilemap_0, 0, scrollx - 0x20); - tilemap_set_scrolly( state->m_tilemap_0, 0, scrolly ); + state->m_tilemap_0->set_scrollx(0, scrollx - 0x20); + state->m_tilemap_0->set_scrolly(0, scrolly ); - tilemap_set_scrollx( state->m_tilemap_1, 0, -0x20); // fixed offset - tilemap_set_scrolly( state->m_tilemap_1, 0, 0x00); + state->m_tilemap_1->set_scrollx(0, -0x20); // fixed offset + state->m_tilemap_1->set_scrolly(0, 0x00); #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; -// if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; +// if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif - if (layers_ctrl&1) tilemap_draw(bitmap,cliprect, state->m_tilemap_0, 0, 0); - else bitmap_fill(bitmap,cliprect,0); - if (layers_ctrl&8) draw_sprites(screen->machine(),bitmap,cliprect); - if (layers_ctrl&2) tilemap_draw(bitmap,cliprect, state->m_tilemap_1, 0, 0); + if (layers_ctrl&1) state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); + else bitmap.fill(0, cliprect); + if (layers_ctrl&8) draw_sprites(screen.machine(),bitmap,cliprect); + if (layers_ctrl&2) state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ppu2c0x.c mame-0.145/src/mame/video/ppu2c0x.c --- mame-0.144/src/mame/video/ppu2c0x.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ppu2c0x.c 2012-02-06 21:30:32.000000000 +0000 @@ -23,6 +23,7 @@ ******************************************************************************/ +#define ADDRESS_MAP_MODERN #include "emu.h" #include "profiler.h" #include "video/ppu2c0x.h" @@ -67,90 +68,216 @@ 0,29,30,31, }; +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// devices +const device_type PPU_2C02 = &device_creator; +const device_type PPU_2C03B = &device_creator; +const device_type PPU_2C04 = &device_creator; +const device_type PPU_2C07 = &device_creator; +const device_type PPU_2C05_01 = &device_creator; +const device_type PPU_2C05_02 = &device_creator; +const device_type PPU_2C05_03 = &device_creator; +const device_type PPU_2C05_04 = &device_creator; + + +// default address map +static ADDRESS_MAP_START( ppu2c0x, AS_0, 8, ppu2c0x_device ) + AM_RANGE(0x0000, 0x3eff) AM_RAM + AM_RANGE(0x3f00, 0x3fff) AM_READWRITE(palette_read, palette_write) +// AM_RANGE(0x0000, 0x3fff) AM_RAM +ADDRESS_MAP_END + +//------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +const address_space_config *ppu2c0x_device::memory_space_config(address_spacenum spacenum) const +{ + return (spacenum == AS_0) ? &m_space_config : NULL; +} -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +//------------------------------------------------- +// ppu2c0x_device - constructor +//------------------------------------------------- -typedef struct _ppu2c0x_state ppu2c0x_state; -struct _ppu2c0x_state +void ppu2c0x_device::device_config_complete() { - address_space *space; /* memory space */ - bitmap_t *bitmap; /* target bitmap */ - UINT8 *spriteram; /* sprite ram */ - pen_t *colortable; /* color table modified at run time */ - pen_t *colortable_mono; /* monochromatic color table modified at run time */ - emu_timer *scanline_timer; /* scanline timer */ - emu_timer *hblank_timer; /* hblank period at end of each scanline */ - emu_timer *nmi_timer; /* NMI timer */ - int scanline; /* scanline count */ - ppu2c0x_scanline_cb scanline_callback_proc; /* optional scanline callback */ - ppu2c0x_hblank_cb hblank_callback_proc; /* optional hblank callback */ - ppu2c0x_vidaccess_cb vidaccess_callback_proc; /* optional video access callback */ - ppu2c0x_nmi_cb nmi_callback_proc; /* nmi access callback from interface */ - int regs[PPU_MAX_REG]; /* registers */ - int refresh_data; /* refresh-related */ - int refresh_latch; /* refresh-related */ - int x_fine; /* refresh-related */ - int toggle; /* used to latch hi-lo scroll */ - int add; /* vram increment amount */ - int videomem_addr; /* videomem address pointer */ - int addr_latch; /* videomem address latch */ - int data_latch; /* latched videomem data */ - int buffered_data; - int tile_page; /* current tile page */ - int sprite_page; /* current sprite page */ - int back_color; /* background color */ - int color_base; - UINT8 palette_ram[0x20]; /* shouldn't be in main memory! */ - int scan_scale; /* scan scale */ - int scanlines_per_frame; /* number of scanlines per frame */ - rgb_t palette[64*4]; /* palette for this chip */ - int security_value; /* 2C05 protection */ - void (*latch)( device_t *device, offs_t offset ); -}; + const ppu2c0x_interface *config = reinterpret_cast(static_config()); + assert(config); + /* reset the callbacks */ + m_latch = NULL; + m_scanline_callback_proc = NULL; + m_hblank_callback_proc = NULL; + m_vidaccess_callback_proc = NULL; + + m_nmi_callback_proc = config->nmi_handler; + m_color_base = config->color_base; + + m_cpu_tag = config->cpu_tag; + m_screen_tag = config->screen_tag; +} + +ppu2c0x_device::ppu2c0x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, type, name, tag, owner, clock), + device_memory_interface(mconfig, *this), + m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, NULL, *ADDRESS_MAP_NAME(ppu2c0x)), + m_scanline(0), // reset the scanline count + m_refresh_data(0), + m_refresh_latch(0), + m_x_fine(0), + m_toggle(0), + m_add(1), + m_videomem_addr(0), + m_data_latch(0), + m_buffered_data(0), + m_tile_page(0), + m_sprite_page(0), + m_back_color(0), + m_scan_scale(1) // set the scan scale (this is for dual monitor vertical setups) +{ + for (int i = 0; i < PPU_MAX_REG; i++) + m_regs[i] = 0; -/*************************************************************************** - PROTOTYPES -***************************************************************************/ + memset(m_palette_ram, 0, ARRAY_LENGTH(m_palette_ram)); + + m_scanlines_per_frame = PPU_NTSC_SCANLINES_PER_FRAME; + + /* usually, no security value... */ + m_security_value = 0; +} -static void update_scanline( device_t *device ); -static TIMER_CALLBACK( scanline_callback ); -static TIMER_CALLBACK( hblank_callback ); -static TIMER_CALLBACK( nmi_callback ); +// NTSC NES +ppu2c02_device::ppu2c02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C02, "2C02 PPU", tag, owner, clock) +{ +} +// Playchoice 10 +ppu2c03b_device::ppu2c03b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C03B, "2C03B PPU PPU", tag, owner, clock) +{ +} -/* palette handlers */ -static WRITE8_HANDLER( ppu2c0x_palette_write ); -static READ8_HANDLER( ppu2c0x_palette_read ); +// Vs. Unisystem +ppu2c04_device::ppu2c04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C04, "2C04 PPU", tag, owner, clock) +{ +} +// PAL NES +ppu2c07_device::ppu2c07_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C07, "2C07 PPU", tag, owner, clock) +{ + m_scanlines_per_frame = PPU_PAL_SCANLINES_PER_FRAME; +} -/*************************************************************************** - INLINE FUNCTIONS -***************************************************************************/ +// The PPU_2C05 variants have different protection value, set at DEVICE_START, but otherwise are all the same... +// Vs. Unisystem (Ninja Jajamaru Kun) +ppu2c05_01_device::ppu2c05_01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C05_01, "2C05 PPU", tag, owner, clock) +{ + m_security_value = 0x1b; // game (jajamaru) doesn't seem to ever actually check it +} +// Vs. Unisystem (Mighty Bomb Jack) +ppu2c05_02_device::ppu2c05_02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C05_02, "2C05 PPU", tag, owner, clock) +{ + m_security_value = 0x3d; +} +// Vs. Unisystem (Gumshoe) +ppu2c05_03_device::ppu2c05_03_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C05_03, "2C05 PPU", tag, owner, clock) +{ + m_security_value = 0x1c; +} +// Vs. Unisystem (Top Gun) +ppu2c05_04_device::ppu2c05_04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : ppu2c0x_device(mconfig, PPU_2C05_04, "2C05 PPU", tag, owner, clock) +{ + m_security_value = 0x1b; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ppu2c0x_device::device_start() +{ + m_screen = machine().device( m_screen_tag ); + m_cpu = machine().device( m_cpu_tag ); + + assert(m_screen && m_cpu); + + // allocate timers + m_hblank_timer = timer_alloc(TIMER_HBLANK); + m_nmi_timer = timer_alloc(TIMER_NMI); + m_scanline_timer = timer_alloc(TIMER_SCANLINE); + + /* initialize the scanline handling portion */ + m_scanline_timer->adjust(m_screen->time_until_pos(1)); + m_hblank_timer->adjust(m_cpu->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation + m_nmi_timer->adjust(attotime::never); + + /* allocate a screen bitmap, videomem and spriteram, a dirtychar array and the monochromatic colortable */ + m_bitmap = auto_bitmap_ind16_alloc(machine(), VISIBLE_SCREEN_WIDTH, VISIBLE_SCREEN_HEIGHT); + m_spriteram = auto_alloc_array_clear(machine(), UINT8, SPRITERAM_SIZE); + m_colortable = auto_alloc_array(machine(), pen_t, ARRAY_LENGTH(default_colortable)); + m_colortable_mono = auto_alloc_array(machine(), pen_t, ARRAY_LENGTH(default_colortable_mono)); + + /* initialize the color tables */ + for (int i = 0; i < ARRAY_LENGTH(default_colortable_mono); i++) + { + /* monochromatic table */ + m_colortable_mono[i] = default_colortable_mono[i] + m_color_base; + + /* color table */ + m_colortable[i] = default_colortable[i] + m_color_base; + } + + // register for state saving + save_item(NAME(m_scanline)); + save_item(NAME(m_refresh_data)); + save_item(NAME(m_refresh_latch)); + save_item(NAME(m_x_fine)); + save_item(NAME(m_toggle)); + save_item(NAME(m_add)); + save_item(NAME(m_videomem_addr)); + save_item(NAME(m_data_latch)); + save_item(NAME(m_buffered_data)); + save_item(NAME(m_tile_page)); + save_item(NAME(m_sprite_page)); + save_item(NAME(m_back_color)); + save_item(NAME(m_scan_scale)); + save_item(NAME(m_scanlines_per_frame)); + save_item(NAME(m_regs)); + save_item(NAME(m_palette_ram)); + save_pointer(NAME(m_spriteram), SPRITERAM_SIZE); + save_pointer(NAME(m_colortable), ARRAY_LENGTH(default_colortable)); + save_pointer(NAME(m_colortable_mono), ARRAY_LENGTH(default_colortable_mono)); + save_item(NAME(*m_bitmap)); +} + +//************************************************************************** +// INLINE HELPERS +//************************************************************************** -INLINE ppu2c0x_state *get_token( device_t *device ) +//------------------------------------------------- +// readbyte - read a byte at the given address +//------------------------------------------------- + +inline UINT8 ppu2c0x_device::readbyte(offs_t address) { - assert(device != NULL); - assert((device->type() == PPU_2C02) || (device->type() == PPU_2C03B) - || (device->type() == PPU_2C04) || (device->type() == PPU_2C05_01) - || (device->type() == PPU_2C05_02) || (device->type() == PPU_2C05_03) - || (device->type() == PPU_2C05_04) || (device->type() == PPU_2C07)); - return (ppu2c0x_state *) downcast(device)->token(); + return space()->read_byte(address); } -INLINE const ppu2c0x_interface *get_interface( device_t *device ) +//------------------------------------------------- +// writebyte - write a byte at the given address +//------------------------------------------------- + +inline void ppu2c0x_device::writebyte(offs_t address, UINT8 data) { - assert(device != NULL); - assert((device->type() == PPU_2C02) || (device->type() == PPU_2C03B) - || (device->type() == PPU_2C04) || (device->type() == PPU_2C05_01) - || (device->type() == PPU_2C05_02) || (device->type() == PPU_2C05_03) - || (device->type() == PPU_2C05_04) || (device->type() == PPU_2C07)); - return (const ppu2c0x_interface *) device->static_config(); + space()->write_byte(address, data); } @@ -164,13 +291,7 @@ * *************************************/ -/* default address map */ -// make this INTERNAL, default should just be enough to avoid compile errors, print error messages! -static ADDRESS_MAP_START( ppu2c0x, AS_0, 8 ) - AM_RANGE(0x3f00, 0x3fff) AM_READWRITE(ppu2c0x_palette_read, ppu2c0x_palette_write) -ADDRESS_MAP_END - -void ppu2c0x_init_palette( running_machine &machine, int first_entry ) +void ppu2c0x_device::init_palette( running_machine &machine, int first_entry ) { /* This routine builds a palette using a transformation from */ @@ -285,7 +406,7 @@ /* color tables are modified at run-time, and are initialized on 'ppu2c0x_reset' */ } -void ppu2c0x_init_palette_rgb( running_machine &machine, int first_entry ) +void ppu2c0x_device::init_palette_rgb( running_machine &machine, int first_entry ) { int color_emphasis, color_num; @@ -327,54 +448,114 @@ * *************************************/ -void ppu2c0x_set_latch( device_t *device, void (*latch)(device_t *device, offs_t offset)) +void ppu2c0x_device::set_latch( void (*latch)(device_t *device, offs_t offset) ) { - ppu2c0x_state *ppu2c0x = get_token(device); - ppu2c0x->latch = latch; + if (latch) + m_latch = latch; } -static TIMER_CALLBACK( hblank_callback ) +//------------------------------------------------- +// device_timer - handle timer events +//------------------------------------------------- + +void ppu2c0x_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - device_t *device = (device_t *)ptr; - ppu2c0x_state *ppu2c0x = get_token(device); - int *ppu_regs = &ppu2c0x->regs[0]; + int blanked, vblank; + int *regs = &m_regs[0]; - int blanked = (ppu_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) == 0; - int vblank = ((ppu2c0x->scanline >= PPU_VBLANK_FIRST_SCANLINE - 1) && (ppu2c0x->scanline < ppu2c0x->scanlines_per_frame - 1)) ? 1 : 0; + switch (id) + { + case TIMER_HBLANK: + blanked = (m_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) == 0; + vblank = ((m_scanline >= PPU_VBLANK_FIRST_SCANLINE - 1) && (m_scanline < m_scanlines_per_frame - 1)) ? 1 : 0; -// update_scanline(device); + //update_scanline(); - if (ppu2c0x->hblank_callback_proc) - (*ppu2c0x->hblank_callback_proc) (device, ppu2c0x->scanline, vblank, blanked); + if (m_hblank_callback_proc) + (*m_hblank_callback_proc) (this, m_scanline, vblank, blanked); - ppu2c0x->hblank_timer->adjust(attotime::never); -} + m_hblank_timer->adjust(attotime::never); + break; -static TIMER_CALLBACK( nmi_callback ) -{ - device_t *device = (device_t *)ptr; - ppu2c0x_state *ppu2c0x = get_token(device); - int *ppu_regs = &ppu2c0x->regs[0]; + case TIMER_NMI: + // Actually fire the VMI + if (m_nmi_callback_proc) + (*m_nmi_callback_proc) (this, regs); + + m_nmi_timer->adjust(attotime::never); + break; - // Actually fire the VMI - if (ppu2c0x->nmi_callback_proc != NULL) - (*ppu2c0x->nmi_callback_proc) (device, ppu_regs); + case TIMER_SCANLINE: + blanked = (m_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) == 0; + vblank = ((m_scanline >= PPU_VBLANK_FIRST_SCANLINE - 1) && (m_scanline < m_scanlines_per_frame - 1)) ? 1 : 0; + int next_scanline; - ppu2c0x->nmi_timer->adjust(attotime::never); -} + /* if a callback is available, call it */ + if (m_scanline_callback_proc) + (*m_scanline_callback_proc)(this, m_scanline, vblank, blanked); -static void draw_background( device_t *device, UINT8 *line_priority ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); + /* update the scanline that just went by */ + update_scanline(); + + /* increment our scanline count */ + m_scanline++; + + // logerror("starting scanline %d (MAME %d, beam %d)\n", m_scanline, device->machine().primary_screen->vpos(), device->machine().primary_screen->hpos()); + + /* Note: this is called at the _end_ of each scanline */ + if (m_scanline == PPU_VBLANK_FIRST_SCANLINE) + { + // logerror("vblank starting\n"); + /* We just entered VBLANK */ + m_regs[PPU_STATUS] |= PPU_STATUS_VBLANK; - /* cache some values locally */ - bitmap_t *bitmap = ppu2c0x->bitmap; - const int *ppu_regs = &ppu2c0x->regs[0]; - const int scanline = ppu2c0x->scanline; - const int refresh_data = ppu2c0x->refresh_data; - const int tile_page = ppu2c0x->tile_page; + /* If NMI's are set to be triggered, go for it */ + if (m_regs[PPU_CONTROL0] & PPU_CONTROL0_NMI) + { + // We need an ever-so-slight delay between entering vblank and firing an NMI - enough so that + // a game can read the high bit of $2002 before the NMI is called (potentially resetting the bit + // via a read from $2002 in the NMI handler). + // B-Wings is an example game that needs this. + m_nmi_timer->adjust(m_cpu->cycles_to_attotime(4)); + } + } + + if (m_scanline == m_scanlines_per_frame - 1) + { + // logerror("vblank ending\n"); + /* clear the vblank & sprite hit flag */ + m_regs[PPU_STATUS] &= ~(PPU_STATUS_VBLANK | PPU_STATUS_SPRITE0_HIT | PPU_STATUS_8SPRITES); + } + + /* see if we rolled */ + else if (m_scanline == m_scanlines_per_frame) + { + /* if background or sprites are enabled, copy the ppu address latch */ + if (!blanked) + m_refresh_data = m_refresh_latch; + + /* reset the scanline count */ + m_scanline = 0; + //logerror("sprite 0 x: %d y: %d num: %d\n", m_spriteram[3], m_spriteram[0] + 1, m_spriteram[1]); + } + + next_scanline = m_scanline + 1; + if (next_scanline == m_scanlines_per_frame) + next_scanline = 0; + + // Call us back when the hblank starts for this scanline + m_hblank_timer->adjust(m_cpu->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation + + // trigger again at the start of the next scanline + m_scanline_timer->adjust(m_screen->time_until_pos(next_scanline * m_scan_scale)); + break; + } +} - int start_x = (ppu2c0x->x_fine ^ 0x07) - 7; +void ppu2c0x_device::draw_background( UINT8 *line_priority ) +{ + bitmap_ind16 &bitmap = *m_bitmap; + int start_x = (m_x_fine ^ 0x07) - 7; UINT16 back_pen; UINT16 *dest; @@ -387,33 +568,33 @@ int tilecount = 0; /* setup the color mask and colortable to use */ - if (ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) { color_mask = 0xf0; - color_table = ppu2c0x->colortable_mono; + color_table = m_colortable_mono; } else { color_mask = 0xff; - color_table = ppu2c0x->colortable; + color_table = m_colortable; } /* cache the background pen */ - back_pen = (ppu2c0x->back_color & color_mask) + ppu2c0x->color_base; + back_pen = (m_back_color & color_mask) + m_color_base; /* determine where in the nametable to start drawing from */ /* based on the current scanline and scroll regs */ - scroll_x_coarse = refresh_data & 0x1f; - scroll_y_coarse = (refresh_data & 0x3e0) >> 5; - scroll_y_fine = (refresh_data & 0x7000) >> 12; + scroll_x_coarse = m_refresh_data & 0x1f; + scroll_y_coarse = (m_refresh_data & 0x3e0) >> 5; + scroll_y_fine = (m_refresh_data & 0x7000) >> 12; x = scroll_x_coarse; /* get the tile index */ - tile_index = ((refresh_data & 0xc00) | 0x2000) + scroll_y_coarse * 32; + tile_index = ((m_refresh_data & 0xc00) | 0x2000) + scroll_y_coarse * 32; /* set up dest */ - dest = ((UINT16 *) bitmap->base) + (bitmap->rowpixels * scanline) + start_x; + dest = &bitmap.pix16(m_scanline, start_x); /* draw the 32 or 33 tiles that make up a line */ while (tilecount < 34) @@ -432,20 +613,18 @@ pos = ((index1 & 0x380) >> 4) | ((index1 & 0x1f) >> 2); page = (index1 & 0x0c00) >> 10; address = 0x3c0 + pos; - color_byte = ppu2c0x->space->read_byte((((page * 0x400) + address) & 0xfff) + 0x2000); + color_byte = readbyte((((page * 0x400) + address) & 0xfff) + 0x2000); /* figure out which bits in the color table to use */ color_bits = ((index1 & 0x40) >> 4) + (index1 & 0x02); // page2 is the output of the nametable read (this section is the FIRST read per tile!) address = index1 & 0x3ff; - page2 = ppu2c0x->space->read_byte(index1); + page2 = readbyte(index1); // 27/12/2002 - if (ppu2c0x->latch) - { - (*ppu2c0x->latch)(device, (tile_page << 10) | (page2 << 4)); - } + if (m_latch) + (*m_latch)(this, (m_tile_page << 10) | (page2 << 4)); if (start_x < VISIBLE_SCREEN_WIDTH) { @@ -453,12 +632,12 @@ paldata = &color_table[4 * (((color_byte >> color_bits) & 0x03))]; // need to read 0x0000 or 0x1000 + 16*nametable data - address = ((ppu2c0x->tile_page) ? 0x1000 : 0) + (page2 * 16); + address = ((m_tile_page) ? 0x1000 : 0) + (page2 * 16); // plus something that accounts for y address += scroll_y_fine; - plane1 = ppu2c0x->space->read_byte((address & 0x1fff)); - plane2 = ppu2c0x->space->read_byte((address + 8) & 0x1fff); + plane1 = readbyte((address & 0x1fff)); + plane2 = readbyte((address + 8) & 0x1fff); /* render the pixel */ for (i = 0; i < 8; i++) @@ -498,9 +677,9 @@ } /* if the left 8 pixels for the background are off, blank 'em */ - if (!(ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_BACKGROUND_L8)) + if (!(m_regs[PPU_CONTROL1] & PPU_CONTROL1_BACKGROUND_L8)) { - dest = ((UINT16 *) bitmap->base) + (bitmap->rowpixels * scanline); + dest = &bitmap.pix16(m_scanline); for (i = 0; i < 8; i++) { *(dest++) = back_pen; @@ -509,17 +688,9 @@ } } -static void draw_sprites( device_t *device, UINT8 *line_priority ) +void ppu2c0x_device::draw_sprites( UINT8 *line_priority ) { - ppu2c0x_state *ppu2c0x = get_token(device); - - /* cache some values locally */ - bitmap_t *bitmap = ppu2c0x->bitmap; - const int scanline = ppu2c0x->scanline; - const int sprite_page = ppu2c0x->sprite_page; - const UINT8 *sprite_ram = ppu2c0x->spriteram; - pen_t *color_table = ppu2c0x->colortable; - int *ppu_regs = &ppu2c0x->regs[0]; + bitmap_ind16 &bitmap = *m_bitmap; int sprite_xpos, sprite_ypos, sprite_index; int tile, index1; @@ -536,17 +707,17 @@ int pixel; /* determine if the sprites are 8x8 or 8x16 */ - size = (ppu_regs[PPU_CONTROL0] & PPU_CONTROL0_SPRITE_SIZE) ? 16 : 8; + size = (m_regs[PPU_CONTROL0] & PPU_CONTROL0_SPRITE_SIZE) ? 16 : 8; - first_pixel = (ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_SPRITES_L8)? 0: 8; + first_pixel = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_SPRITES_L8)? 0: 8; for (sprite_index = 0; sprite_index < SPRITERAM_SIZE; sprite_index += 4) { UINT8 plane1; UINT8 plane2; - sprite_ypos = sprite_ram[sprite_index] + 1; - sprite_xpos = sprite_ram[sprite_index + 3]; + sprite_ypos = m_spriteram[sprite_index] + 1; + sprite_xpos = m_spriteram[sprite_index + 3]; // The sprite collision acts funny on the last pixel of a scanline. // The various scanline latches update while the last few pixels @@ -560,18 +731,18 @@ sprite_ypos--; /* set the "sprite 0 hit" flag if appropriate */ if (line_priority[sprite_xpos] & 0x02) - ppu_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; + m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; } /* if the sprite isn't visible, skip it */ - if ((sprite_ypos + size <= scanline) || (sprite_ypos > scanline)) + if ((sprite_ypos + size <= m_scanline) || (sprite_ypos > m_scanline)) continue; - tile = sprite_ram[sprite_index + 1]; - color = (sprite_ram[sprite_index + 2] & 0x03) + 4; - pri = sprite_ram[sprite_index + 2] & 0x20; - flipx = sprite_ram[sprite_index + 2] & 0x40; - flipy = sprite_ram[sprite_index + 2] & 0x80; + tile = m_spriteram[sprite_index + 1]; + color = (m_spriteram[sprite_index + 2] & 0x03) + 4; + pri = m_spriteram[sprite_index + 2] & 0x20; + flipx = m_spriteram[sprite_index + 2] & 0x40; + flipy = m_spriteram[sprite_index + 2] & 0x80; if (size == 16) { @@ -583,16 +754,16 @@ } } - if (ppu2c0x->latch) - (*ppu2c0x->latch)(device, (sprite_page << 10) | ((tile & 0xff) << 4)); + if (m_latch) + (*m_latch)(this, (m_sprite_page << 10) | ((tile & 0xff) << 4)); /* compute the character's line to draw */ - sprite_line = scanline - sprite_ypos; + sprite_line = m_scanline - sprite_ypos; if (flipy) sprite_line = (size - 1) - sprite_line; - paldata = &color_table[4 * color]; + paldata = &m_colortable[4 * color]; if (size == 16 && sprite_line > 7) { @@ -602,16 +773,16 @@ index1 = tile * 16; if (size == 8) - index1 += ((sprite_page == 0) ? 0 : 0x1000); + index1 += ((m_sprite_page == 0) ? 0 : 0x1000); - plane1 = ppu2c0x->space->read_byte((index1 + sprite_line + 0) & 0x1fff); - plane2 = ppu2c0x->space->read_byte((index1 + sprite_line + 8) & 0x1fff); + plane1 = readbyte((index1 + sprite_line + 0) & 0x1fff); + plane2 = readbyte((index1 + sprite_line + 8) & 0x1fff); /* if there are more than 8 sprites on this line, set the flag */ if (sprite_count == 8) { - ppu_regs[PPU_STATUS] |= PPU_STATUS_8SPRITES; -// logerror ("> 8 sprites, scanline: %d\n", scanline); + m_regs[PPU_STATUS] |= PPU_STATUS_8SPRITES; +// logerror ("> 8 sprites, scanline: %d\n", m_scanline); /* the real NES only draws up to 8 sprites - the rest should be invisible */ break; @@ -620,7 +791,7 @@ sprite_count++; /* abort drawing if sprites aren't rendered */ - if (!(ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_SPRITES)) + if (!(m_regs[PPU_CONTROL1] & PPU_CONTROL1_SPRITES)) continue; if (pri) @@ -652,7 +823,7 @@ { /* no, draw */ if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH) - *BITMAP_ADDR16(bitmap, scanline, sprite_xpos + pixel) = paldata[pixel_data]; + bitmap.pix16(m_scanline, sprite_xpos + pixel) = paldata[pixel_data]; } /* indicate that a sprite was drawn at this location, even if it's not seen */ if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH) @@ -661,7 +832,7 @@ /* set the "sprite 0 hit" flag if appropriate */ if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02)) - ppu_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; + m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; } } } @@ -695,7 +866,7 @@ /* no, draw */ if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH) { - *BITMAP_ADDR16(bitmap, scanline, sprite_xpos + pixel) = paldata[pixel_data]; + bitmap.pix16(m_scanline, sprite_xpos + pixel) = paldata[pixel_data]; line_priority[sprite_xpos + pixel] |= 0x01; } } @@ -703,7 +874,7 @@ /* set the "sprite 0 hit" flag if appropriate */ if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02)) - ppu_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; + m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; } } } @@ -716,11 +887,9 @@ * *************************************/ -static void render_scanline( device_t *device ) +void ppu2c0x_device::render_scanline( void ) { - ppu2c0x_state *ppu2c0x = get_token(device); UINT8 line_priority[VISIBLE_SCREEN_WIDTH]; - int *ppu_regs = &ppu2c0x->regs[0]; /* lets see how long it takes */ g_profiler.start(PROFILER_USER1); @@ -729,71 +898,66 @@ memset(line_priority, 0, VISIBLE_SCREEN_WIDTH); /* see if we need to render the background */ - if (ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_BACKGROUND) - draw_background(device, line_priority); + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_BACKGROUND) + draw_background(line_priority); else { - bitmap_t *bitmap = ppu2c0x->bitmap; - const int scanline = ppu2c0x->scanline; + bitmap_ind16 &bitmap = *m_bitmap; UINT8 color_mask; UINT16 back_pen; int i; /* setup the color mask and colortable to use */ - if (ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) color_mask = 0xf0; else color_mask = 0xff; /* cache the background pen */ - back_pen = (ppu2c0x->back_color & color_mask) + ppu2c0x->color_base; + back_pen = (m_back_color & color_mask) + m_color_base; // Fill this scanline with the background pen. - for (i = 0; i < bitmap->width; i++) - *BITMAP_ADDR16(bitmap, scanline, i) = back_pen; + for (i = 0; i < bitmap.width(); i++) + bitmap.pix16(m_scanline, i) = back_pen; } /* if sprites are on, draw them, but we call always to process them */ - draw_sprites(device, line_priority); + draw_sprites(line_priority); /* done updating, whew */ g_profiler.stop(); } -static void update_scanline( device_t *device ) +void ppu2c0x_device::update_scanline( void ) { - ppu2c0x_state *ppu2c0x = get_token(device); - const int scanline = ppu2c0x->scanline; - int *ppu_regs = &ppu2c0x->regs[0]; - - if (scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) + if (m_scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) { /* Render this scanline if appropriate */ - if (ppu_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) + if (m_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) { /* If background or sprites are enabled, copy the ppu address latch */ /* Copy only the scroll x-coarse and the x-overflow bit */ - ppu2c0x->refresh_data &= ~0x041f; - ppu2c0x->refresh_data |= (ppu2c0x->refresh_latch & 0x041f); + m_refresh_data &= ~0x041f; + m_refresh_data |= (m_refresh_latch & 0x041f); -// logerror("updating refresh_data: %04x (scanline: %d)\n", ppu2c0x->refresh_data, ppu2c0x->scanline); - render_scanline(device); +// logerror("updating refresh_data: %04x (scanline: %d)\n", m_refresh_data, m_scanline); + render_scanline(); } else { - bitmap_t *bitmap = ppu2c0x->bitmap; + bitmap_ind16 &bitmap = *m_bitmap; UINT8 color_mask; UINT16 back_pen; int i; /* setup the color mask and colortable to use */ - if (ppu_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) color_mask = 0xf0; else color_mask = 0xff; /* cache the background pen */ - if (ppu2c0x->videomem_addr >= 0x3f00) + if (m_videomem_addr >= 0x3f00) { // If the PPU's VRAM address happens to point into palette ram space while // both the sprites and background are disabled, the PPU paints the scanline @@ -801,110 +965,41 @@ // pen. Micro Machines makes use of this feature. int pen_num; - if (ppu2c0x->videomem_addr & 0x03) - pen_num = ppu2c0x->palette_ram[ppu2c0x->videomem_addr & 0x1f]; + if (m_videomem_addr & 0x03) + pen_num = m_palette_ram[m_videomem_addr & 0x1f]; else - pen_num = ppu2c0x->palette_ram[0]; + pen_num = m_palette_ram[0]; - back_pen = pen_num + ppu2c0x->color_base; + back_pen = pen_num + m_color_base; } else - back_pen = (ppu2c0x->back_color & color_mask) + ppu2c0x->color_base; + back_pen = (m_back_color & color_mask) + m_color_base; // Fill this scanline with the background pen. - for (i = 0; i < bitmap->width; i++) - *BITMAP_ADDR16(bitmap, scanline, i) = back_pen; + for (i = 0; i < bitmap.width(); i++) + bitmap.pix16(m_scanline, i) = back_pen; } /* increment the fine y-scroll */ - ppu2c0x->refresh_data += 0x1000; + m_refresh_data += 0x1000; /* if it's rolled, increment the coarse y-scroll */ - if (ppu2c0x->refresh_data & 0x8000) + if (m_refresh_data & 0x8000) { UINT16 tmp; - tmp = (ppu2c0x->refresh_data & 0x03e0) + 0x20; - ppu2c0x->refresh_data &= 0x7c1f; + tmp = (m_refresh_data & 0x03e0) + 0x20; + m_refresh_data &= 0x7c1f; /* handle bizarro scrolling rollover at the 30th (not 32nd) vertical tile */ if (tmp == 0x03c0) - ppu2c0x->refresh_data ^= 0x0800; + m_refresh_data ^= 0x0800; else - ppu2c0x->refresh_data |= (tmp & 0x03e0); - -// logerror("updating refresh_data: %04x\n", ppu2c0x->refresh_data); - } - } - -} - -static TIMER_CALLBACK( scanline_callback ) -{ - device_t *device = (device_t *)ptr; - ppu2c0x_state *ppu2c0x = get_token(device); - int *ppu_regs = &ppu2c0x->regs[0]; - int blanked = (ppu_regs[PPU_CONTROL1] & (PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES)) == 0; - int vblank = ((ppu2c0x->scanline >= PPU_VBLANK_FIRST_SCANLINE - 1) && (ppu2c0x->scanline < ppu2c0x->scanlines_per_frame - 1)) ? 1 : 0; - int next_scanline; - - /* if a callback is available, call it */ - if (ppu2c0x->scanline_callback_proc != NULL) - (*ppu2c0x->scanline_callback_proc)(device, ppu2c0x->scanline, vblank, blanked); + m_refresh_data |= (tmp & 0x03e0); - /* update the scanline that just went by */ - update_scanline(device); - - /* increment our scanline count */ - ppu2c0x->scanline++; - -// logerror("starting scanline %d (MAME %d, beam %d)\n", ppu2c0x->scanline, device->machine().primary_screen->vpos(), device->machine().primary_screen->hpos()); - - /* Note: this is called at the _end_ of each scanline */ - if (ppu2c0x->scanline == PPU_VBLANK_FIRST_SCANLINE) - { - // logerror("vblank starting\n"); - /* We just entered VBLANK */ - ppu_regs[PPU_STATUS] |= PPU_STATUS_VBLANK; - - /* If NMI's are set to be triggered, go for it */ - if (ppu_regs[PPU_CONTROL0] & PPU_CONTROL0_NMI) - { - // We need an ever-so-slight delay between entering vblank and firing an NMI - enough so that - // a game can read the high bit of $2002 before the NMI is called (potentially resetting the bit - // via a read from $2002 in the NMI handler). - // B-Wings is an example game that needs this. - ppu2c0x->nmi_timer->adjust(device->machine().device("maincpu")->cycles_to_attotime(4)); +// logerror("updating refresh_data: %04x\n", m_refresh_data); } } - if (ppu2c0x->scanline == ppu2c0x->scanlines_per_frame - 1) - { - // logerror("vblank ending\n"); - /* clear the vblank & sprite hit flag */ - ppu_regs[PPU_STATUS] &= ~(PPU_STATUS_VBLANK | PPU_STATUS_SPRITE0_HIT | PPU_STATUS_8SPRITES); - } - - /* see if we rolled */ - else if (ppu2c0x->scanline == ppu2c0x->scanlines_per_frame) - { - /* if background or sprites are enabled, copy the ppu address latch */ - if (!blanked) - ppu2c0x->refresh_data = ppu2c0x->refresh_latch; - - /* reset the scanline count */ - ppu2c0x->scanline = 0; -// logerror("sprite 0 x: %d y: %d num: %d\n", ppu2c0x->spriteram[3], ppu2c0x->spriteram[0] + 1, ppu2c0x->spriteram[1]); - } - - next_scanline = ppu2c0x->scanline + 1; - if (next_scanline == ppu2c0x->scanlines_per_frame) - next_scanline = 0; - - // Call us back when the hblank starts for this scanline - ppu2c0x->hblank_timer->adjust(device->machine().device("maincpu")->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation - - // trigger again at the start of the next scanline - ppu2c0x->scanline_timer->adjust(device->machine().primary_screen->time_until_pos(next_scanline * ppu2c0x->scan_scale)); } /************************************* @@ -913,11 +1008,10 @@ * *************************************/ -static WRITE8_HANDLER( ppu2c0x_palette_write ) +WRITE8_MEMBER( ppu2c0x_device::palette_write ) { - ppu2c0x_state *ppu2c0x = get_token(&space->device()); - int color_base = ppu2c0x->color_base; - int color_emphasis = (ppu2c0x->regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) * 2; + int color_base = m_color_base; + int color_emphasis = (m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) * 2; // palette RAM is only 6 bits wide data &= 0x3f; @@ -925,36 +1019,33 @@ // transparent pens are mirrored! if (offset & 0x3) { - ppu2c0x->palette_ram[offset & 0x1f] = data; - ppu2c0x->colortable[offset & 0x1f] = color_base + data + color_emphasis; - ppu2c0x->colortable_mono[offset & 0x1f] = color_base + (data & 0xf0) + color_emphasis; + m_palette_ram[offset & 0x1f] = data; + m_colortable[offset & 0x1f] = color_base + data + color_emphasis; + m_colortable_mono[offset & 0x1f] = color_base + (data & 0xf0) + color_emphasis; } else { int i; if (0 == (offset & 0xf)) { - ppu2c0x->back_color = data; + m_back_color = data; for (i = 0; i < 32; i += 4) { - ppu2c0x->colortable[i] = color_base + data + color_emphasis; - ppu2c0x->colortable_mono[i] = color_base + (data & 0xf0) + color_emphasis; + m_colortable[i] = color_base + data + color_emphasis; + m_colortable_mono[i] = color_base + (data & 0xf0) + color_emphasis; } } - ppu2c0x->palette_ram[offset & 0xf] = ppu2c0x->palette_ram[(offset & 0xf) + 0x10] = data; + m_palette_ram[offset & 0xf] = m_palette_ram[(offset & 0xf) + 0x10] = data; } } -static READ8_HANDLER( ppu2c0x_palette_read ) +READ8_MEMBER( ppu2c0x_device::palette_read ) { - ppu2c0x_state *ppu2c0x = get_token(&space->device()); - { - if (ppu2c0x->regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) - return (ppu2c0x->palette_ram[offset & 0x1f] & 0x30); + if (m_regs[PPU_CONTROL1] & PPU_CONTROL1_DISPLAY_MONO) + return (m_palette_ram[offset & 0x1f] & 0x30); - else - return (ppu2c0x->palette_ram[offset & 0x1f]); - } + else + return (m_palette_ram[offset & 0x1f]); } /************************************* @@ -963,13 +1054,12 @@ * *************************************/ -READ8_DEVICE_HANDLER( ppu2c0x_r ) +READ8_MEMBER( ppu2c0x_device::read ) { - ppu2c0x_state *ppu2c0x = get_token(device); if (offset >= PPU_MAX_REG) { - logerror("PPU %s: Attempting to read past the chip: offset %x\n", device->tag(), offset); + logerror("PPU %s: Attempting to read past the chip: offset %x\n", this->tag(), offset); offset &= PPU_MAX_REG - 1; } @@ -979,47 +1069,47 @@ case PPU_STATUS: /* 2 */ // The top 3 bits of the status register are the only ones that report data. The // remainder contain whatever was last in the PPU data latch, except on the RC2C05 (protection) - if (ppu2c0x->security_value) - ppu2c0x->data_latch = (ppu2c0x->regs[PPU_STATUS] & 0xc0) | ppu2c0x->security_value; + if (m_security_value) + m_data_latch = (m_regs[PPU_STATUS] & 0xc0) | m_security_value; else - ppu2c0x->data_latch = ppu2c0x->regs[PPU_STATUS] | (ppu2c0x->data_latch & 0x1f); + m_data_latch = m_regs[PPU_STATUS] | (m_data_latch & 0x1f); // Reset hi/lo scroll toggle - ppu2c0x->toggle = 0; + m_toggle = 0; // If the vblank bit is set, clear all status bits but the 2 sprite flags - if (ppu2c0x->data_latch & PPU_STATUS_VBLANK) - ppu2c0x->regs[PPU_STATUS] &= 0x60; + if (m_data_latch & PPU_STATUS_VBLANK) + m_regs[PPU_STATUS] &= 0x60; break; case PPU_SPRITE_DATA: /* 4 */ - ppu2c0x->data_latch = ppu2c0x->spriteram[ppu2c0x->regs[PPU_SPRITE_ADDRESS]]; + m_data_latch = m_spriteram[m_regs[PPU_SPRITE_ADDRESS]]; break; case PPU_DATA: /* 7 */ - if (ppu2c0x->latch) - (*ppu2c0x->latch)(device, ppu2c0x->videomem_addr & 0x3fff); + if (m_latch) + (*m_latch)(this, m_videomem_addr & 0x3fff); - if (ppu2c0x->videomem_addr >= 0x3f00) + if (m_videomem_addr >= 0x3f00) { - ppu2c0x->data_latch = ppu2c0x->space->read_byte(ppu2c0x->videomem_addr); + m_data_latch = readbyte(m_videomem_addr); // buffer the mirrored NT data - ppu2c0x->buffered_data = ppu2c0x->space->read_byte(ppu2c0x->videomem_addr & 0x2fff); + m_buffered_data = readbyte(m_videomem_addr & 0x2fff); } else { - ppu2c0x->data_latch = ppu2c0x->buffered_data; - ppu2c0x->buffered_data = ppu2c0x->space->read_byte(ppu2c0x->videomem_addr); + m_data_latch = m_buffered_data; + m_buffered_data = readbyte(m_videomem_addr); } - ppu2c0x->videomem_addr += ppu2c0x->add; + m_videomem_addr += m_add; break; default: break; } - return ppu2c0x->data_latch; + return m_data_latch; } @@ -1029,145 +1119,143 @@ * *************************************/ -WRITE8_DEVICE_HANDLER( ppu2c0x_w ) +WRITE8_MEMBER( ppu2c0x_device::write ) { - ppu2c0x_state *ppu2c0x = get_token(device); int color_base; - color_base = ppu2c0x->color_base; + color_base = m_color_base; if (offset >= PPU_MAX_REG) { - logerror("PPU %s: Attempting to write past the chip: offset %x, data %x\n", device->tag(), offset, data); + logerror("PPU %s: Attempting to write past the chip: offset %x, data %x\n", this->tag(), offset, data); offset &= PPU_MAX_REG - 1; } #ifdef MAME_DEBUG - if (ppu2c0x->scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) + if (m_scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) { - screen_device *screen = device->machine().primary_screen; - logerror("PPU register %d write %02x during non-vblank scanline %d (MAME %d, beam pos: %d)\n", offset, data, ppu2c0x->scanline, screen->vpos(), screen->hpos()); + logerror("PPU register %d write %02x during non-vblank scanline %d (MAME %d, beam pos: %d)\n", offset, data, m_scanline, m_screen->vpos(), m_screen->hpos()); } #endif /* on the RC2C05, PPU_CONTROL0 and PPU_CONTROL1 are swapped (protection) */ - if ((ppu2c0x->security_value) && !(offset & 6)) + if ((m_security_value) && !(offset & 6)) offset ^= 1; switch (offset & 7) { case PPU_CONTROL0: /* 0 */ - ppu2c0x->regs[PPU_CONTROL0] = data; + m_regs[PPU_CONTROL0] = data; /* update the name table number on our refresh latches */ - ppu2c0x->refresh_latch &= 0x73ff; - ppu2c0x->refresh_latch |= (data & 3) << 10; + m_refresh_latch &= 0x73ff; + m_refresh_latch |= (data & 3) << 10; /* the char ram bank points either 0x0000 or 0x1000 (page 0 or page 4) */ - ppu2c0x->tile_page = (data & PPU_CONTROL0_CHR_SELECT) >> 2; - ppu2c0x->sprite_page = (data & PPU_CONTROL0_SPR_SELECT) >> 1; + m_tile_page = (data & PPU_CONTROL0_CHR_SELECT) >> 2; + m_sprite_page = (data & PPU_CONTROL0_SPR_SELECT) >> 1; - ppu2c0x->add = (data & PPU_CONTROL0_INC) ? 32 : 1; -// logerror("control0 write: %02x (scanline: %d)\n", data, ppu2c0x->scanline); + m_add = (data & PPU_CONTROL0_INC) ? 32 : 1; +// logerror("control0 write: %02x (scanline: %d)\n", data, m_scanline); break; case PPU_CONTROL1: /* 1 */ /* if color intensity has changed, change all the color tables to reflect them */ - if ((data & PPU_CONTROL1_COLOR_EMPHASIS) != (ppu2c0x->regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS)) + if ((data & PPU_CONTROL1_COLOR_EMPHASIS) != (m_regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS)) { int i; for (i = 0; i <= 0x1f; i++) { - UINT8 oldColor = ppu2c0x->palette_ram[i]; + UINT8 oldColor = m_palette_ram[i]; - ppu2c0x->colortable[i] = color_base + oldColor + (data & PPU_CONTROL1_COLOR_EMPHASIS) * 2; + m_colortable[i] = color_base + oldColor + (data & PPU_CONTROL1_COLOR_EMPHASIS) * 2; } } -// logerror("control1 write: %02x (scanline: %d)\n", data, ppu2c0x->scanline); - ppu2c0x->regs[PPU_CONTROL1] = data; +// logerror("control1 write: %02x (scanline: %d)\n", data, m_scanline); + m_regs[PPU_CONTROL1] = data; break; case PPU_SPRITE_ADDRESS: /* 3 */ - ppu2c0x->regs[PPU_SPRITE_ADDRESS] = data; + m_regs[PPU_SPRITE_ADDRESS] = data; break; case PPU_SPRITE_DATA: /* 4 */ // If the PPU is currently rendering the screen, 0xff is written instead of the desired data. - if (ppu2c0x->scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) + if (m_scanline <= PPU_BOTTOM_VISIBLE_SCANLINE) data = 0xff; - ppu2c0x->spriteram[ppu2c0x->regs[PPU_SPRITE_ADDRESS]] = data; - ppu2c0x->regs[PPU_SPRITE_ADDRESS] = (ppu2c0x->regs[PPU_SPRITE_ADDRESS] + 1) & 0xff; + m_spriteram[m_regs[PPU_SPRITE_ADDRESS]] = data; + m_regs[PPU_SPRITE_ADDRESS] = (m_regs[PPU_SPRITE_ADDRESS] + 1) & 0xff; break; case PPU_SCROLL: /* 5 */ - if (ppu2c0x->toggle) + if (m_toggle) { /* second write */ - ppu2c0x->refresh_latch &= 0x0c1f; - ppu2c0x->refresh_latch |= (data & 0xf8) << 2; - ppu2c0x->refresh_latch |= (data & 0x07) << 12; -// logerror("scroll write 2: %d, %04x (scanline: %d)\n", data, ppu2c0x->refresh_latch, ppu2c0x->scanline); + m_refresh_latch &= 0x0c1f; + m_refresh_latch |= (data & 0xf8) << 2; + m_refresh_latch |= (data & 0x07) << 12; +// logerror("scroll write 2: %d, %04x (scanline: %d)\n", data, m_refresh_latch, m_scanline); } else { /* first write */ - ppu2c0x->refresh_latch &= 0x7fe0; - ppu2c0x->refresh_latch |= (data & 0xf8) >> 3; + m_refresh_latch &= 0x7fe0; + m_refresh_latch |= (data & 0xf8) >> 3; - ppu2c0x->x_fine = data & 7; -// logerror("scroll write 1: %d, %04x (scanline: %d)\n", data, ppu2c0x->refresh_latch, ppu2c0x->scanline); + m_x_fine = data & 7; +// logerror("scroll write 1: %d, %04x (scanline: %d)\n", data, m_refresh_latch, m_scanline); } - ppu2c0x->toggle ^= 1; + m_toggle ^= 1; break; case PPU_ADDRESS: /* 6 */ - if (ppu2c0x->toggle) + if (m_toggle) { /* second write */ - ppu2c0x->refresh_latch &= 0x7f00; - ppu2c0x->refresh_latch |= data; - ppu2c0x->refresh_data = ppu2c0x->refresh_latch; + m_refresh_latch &= 0x7f00; + m_refresh_latch |= data; + m_refresh_data = m_refresh_latch; - ppu2c0x->videomem_addr = ppu2c0x->refresh_latch; -// logerror("vram addr write 2: %02x, %04x (scanline: %d)\n", data, ppu2c0x->refresh_latch, ppu2c0x->scanline); + m_videomem_addr = m_refresh_latch; +// logerror("vram addr write 2: %02x, %04x (scanline: %d)\n", data, m_refresh_latch, m_scanline); } else { /* first write */ - ppu2c0x->refresh_latch &= 0x00ff; - ppu2c0x->refresh_latch |= (data & 0x3f) << 8; -// logerror("vram addr write 1: %02x, %04x (scanline: %d)\n", data, ppu2c0x->refresh_latch, ppu2c0x->scanline); + m_refresh_latch &= 0x00ff; + m_refresh_latch |= (data & 0x3f) << 8; +// logerror("vram addr write 1: %02x, %04x (scanline: %d)\n", data, m_refresh_latch, m_scanline); } - ppu2c0x->toggle ^= 1; + m_toggle ^= 1; break; case PPU_DATA: /* 7 */ { - int tempAddr = ppu2c0x->videomem_addr & 0x3fff; + int tempAddr = m_videomem_addr & 0x3fff; - if (ppu2c0x->latch) - (*ppu2c0x->latch)(device, tempAddr); + if (m_latch) + (*m_latch)(this, tempAddr); /* if there's a callback, call it now */ - if (ppu2c0x->vidaccess_callback_proc) - data = (*ppu2c0x->vidaccess_callback_proc)(device, tempAddr, data); + if (m_vidaccess_callback_proc) + data = (*m_vidaccess_callback_proc)(this, tempAddr, data); /* see if it's on the chargen portion */ if (tempAddr < 0x2000) { /* store the data */ - ppu2c0x->space->write_byte(tempAddr, data); + writebyte(tempAddr, data); } else { - ppu2c0x->space->write_byte(tempAddr, data); + writebyte(tempAddr, data); } /* increment the address */ - ppu2c0x->videomem_addr += ppu2c0x->add; + m_videomem_addr += m_add; } break; @@ -1176,7 +1264,7 @@ break; } - ppu2c0x->data_latch = data; + m_data_latch = data; } /************************************* @@ -1185,7 +1273,7 @@ * *************************************/ -void ppu2c0x_spriteram_dma( address_space *space, device_t *device, const UINT8 page ) +void ppu2c0x_device::spriteram_dma( address_space *space, const UINT8 page ) { int i; int address = page << 8; @@ -1206,10 +1294,9 @@ * *************************************/ -void ppu2c0x_render( device_t *device, bitmap_t *bitmap, int flipx, int flipy, int sx, int sy ) +void ppu2c0x_device::render( bitmap_ind16 &bitmap, int flipx, int flipy, int sx, int sy ) { - ppu2c0x_state *ppu2c0x = get_token(device); - copybitmap(bitmap, ppu2c0x->bitmap, flipx, flipy, sx, sy, 0); + copybitmap(bitmap, *m_bitmap, flipx, flipy, sx, sy, bitmap.cliprect()); } /************************************* @@ -1218,9 +1305,8 @@ * *************************************/ -int ppu2c0x_get_pixel( device_t *device, int x, int y ) +int ppu2c0x_device::get_pixel( int x, int y ) { - ppu2c0x_state *ppu2c0x = get_token(device); if (x >= VISIBLE_SCREEN_WIDTH) x = VISIBLE_SCREEN_WIDTH - 1; @@ -1228,274 +1314,6 @@ if (y >= VISIBLE_SCREEN_HEIGHT) y = VISIBLE_SCREEN_HEIGHT - 1; - return *BITMAP_ADDR16(ppu2c0x->bitmap, y, x); -} - -int ppu2c0x_get_colorbase( device_t *device ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - return ppu2c0x->color_base; -} - -int ppu2c0x_get_current_scanline( device_t *device ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - return ppu2c0x->scanline; -} - -// MMC5 has to be able to check this -int ppu2c0x_is_sprite_8x16( device_t *device ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - return BIT(ppu2c0x->regs[0], 5); -} - -void ppu2c0x_set_scanline_callback( device_t *device, ppu2c0x_scanline_cb cb ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - ppu2c0x->scanline_callback_proc = cb; -} - -void ppu2c0x_set_hblank_callback( device_t *device, ppu2c0x_hblank_cb cb ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - ppu2c0x->hblank_callback_proc = cb; -} - -void ppu2c0x_set_vidaccess_callback( device_t *device, ppu2c0x_vidaccess_cb cb ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - ppu2c0x->vidaccess_callback_proc = cb; -} - -void ppu2c0x_set_scanlines_per_frame( device_t *device, int scanlines ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - ppu2c0x->scanlines_per_frame = scanlines; -} - - -/************************************* - * - * PPU Start - * - *************************************/ - -static DEVICE_START( ppu2c0x ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - const ppu2c0x_interface *intf = get_interface(device); - - memset(ppu2c0x, 0, sizeof(*ppu2c0x)); - ppu2c0x->space = device->memory().space(); - ppu2c0x->scanlines_per_frame = (device->type() != PPU_2C07) ? PPU_NTSC_SCANLINES_PER_FRAME : PPU_PAL_SCANLINES_PER_FRAME; - - /* usually, no security value... */ - ppu2c0x->security_value = 0; - - /* ...except for VS. games which specific PPU types */ - if (device->type() == PPU_2C05_01) - ppu2c0x->security_value = 0x1b; // game (jajamaru) doesn't seem to ever actually check it - - if (device->type() == PPU_2C05_02) - ppu2c0x->security_value = 0x3d; - - if (device->type() == PPU_2C05_03) - ppu2c0x->security_value = 0x1c; - - if (device->type() == PPU_2C05_04) - ppu2c0x->security_value = 0x1b; - - /* initialize the scanline handling portion */ - ppu2c0x->scanline_timer = device->machine().scheduler().timer_alloc(FUNC(scanline_callback), (void *) device); - ppu2c0x->scanline_timer->adjust(device->machine().primary_screen->time_until_pos(1)); - - ppu2c0x->hblank_timer = device->machine().scheduler().timer_alloc(FUNC(hblank_callback), (void *) device); - ppu2c0x->hblank_timer->adjust(device->machine().device("maincpu")->cycles_to_attotime(86.67)); // ??? FIXME - hardcoding NTSC, need better calculation - - ppu2c0x->nmi_timer = device->machine().scheduler().timer_alloc(FUNC(nmi_callback), (void *) device); - ppu2c0x->nmi_timer->adjust(attotime::never); - - ppu2c0x->nmi_callback_proc = intf->nmi_handler; - ppu2c0x->color_base = intf->color_base; - - /* allocate a screen bitmap, videomem and spriteram, a dirtychar array and the monochromatic colortable */ - ppu2c0x->bitmap = auto_bitmap_alloc(device->machine(), VISIBLE_SCREEN_WIDTH, VISIBLE_SCREEN_HEIGHT, device->machine().primary_screen->format()); - ppu2c0x->spriteram = auto_alloc_array_clear(device->machine(), UINT8, SPRITERAM_SIZE); - ppu2c0x->colortable = auto_alloc_array(device->machine(), pen_t, ARRAY_LENGTH(default_colortable)); - ppu2c0x->colortable_mono = auto_alloc_array(device->machine(), pen_t, ARRAY_LENGTH(default_colortable_mono)); - - device->save_item(NAME(ppu2c0x->scanline)); - device->save_item(NAME(ppu2c0x->refresh_data)); - device->save_item(NAME(ppu2c0x->refresh_latch)); - device->save_item(NAME(ppu2c0x->x_fine)); - device->save_item(NAME(ppu2c0x->toggle)); - device->save_item(NAME(ppu2c0x->add)); - device->save_item(NAME(ppu2c0x->videomem_addr)); - device->save_item(NAME(ppu2c0x->addr_latch)); - device->save_item(NAME(ppu2c0x->data_latch)); - device->save_item(NAME(ppu2c0x->buffered_data)); - device->save_item(NAME(ppu2c0x->tile_page)); - device->save_item(NAME(ppu2c0x->sprite_page)); - device->save_item(NAME(ppu2c0x->back_color)); - device->save_item(NAME(ppu2c0x->scan_scale)); - device->save_item(NAME(ppu2c0x->scanlines_per_frame)); - device->save_item(NAME(ppu2c0x->regs)); - device->save_item(NAME(ppu2c0x->palette_ram)); - device->save_pointer(NAME(ppu2c0x->spriteram), SPRITERAM_SIZE); - device->save_pointer(NAME(ppu2c0x->colortable), ARRAY_LENGTH(default_colortable)); - device->save_pointer(NAME(ppu2c0x->colortable_mono), ARRAY_LENGTH(default_colortable_mono)); - device->save_item(NAME(*ppu2c0x->bitmap)); + return m_bitmap->pix16(y, x); } -/************************************* - * - * PPU Reset - * - *************************************/ - -static DEVICE_RESET( ppu2c0x ) -{ - ppu2c0x_state *ppu2c0x = get_token(device); - const ppu2c0x_interface *intf = get_interface(device); - int i; - - /* reset the scanline count */ - ppu2c0x->scanline = 0; - - /* set the scan scale (this is for dual monitor vertical setups) */ - ppu2c0x->scan_scale = 1; - - /* reset the callbacks */ - ppu2c0x->scanline_callback_proc = NULL; - ppu2c0x->vidaccess_callback_proc = NULL; - - for (i = 0; i < PPU_MAX_REG; i++) - ppu2c0x->regs[i] = 0; - - memset(ppu2c0x->palette_ram, 0, ARRAY_LENGTH(ppu2c0x->palette_ram)); - - /* initialize the rest of the members */ - ppu2c0x->refresh_data = 0; - ppu2c0x->refresh_latch = 0; - ppu2c0x->x_fine = 0; - ppu2c0x->toggle = 0; - ppu2c0x->add = 1; - ppu2c0x->videomem_addr = 0; - ppu2c0x->addr_latch = 0; - ppu2c0x->data_latch = 0; - ppu2c0x->tile_page = 0; - ppu2c0x->sprite_page = 0; - ppu2c0x->back_color = 0; - ppu2c0x->buffered_data = 0; - - /* initialize the color tables */ - { - int color_base = intf->color_base; - - for (i = 0; i < ARRAY_LENGTH(default_colortable_mono); i++) - { - /* monochromatic table */ - ppu2c0x->colortable_mono[i] = default_colortable_mono[i] + color_base; - - /* color table */ - ppu2c0x->colortable[i] = default_colortable[i] + color_base; - } - } -} - -/*************************************************************************** - GET INFO FUNCTIONS -***************************************************************************/ - -DEVICE_GET_INFO(ppu2c02) -{ - switch (state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(ppu2c0x_state); break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; - case DEVINFO_INT_DATABUS_WIDTH_0: info->i = 8; break; - case DEVINFO_INT_ADDRBUS_WIDTH_0: info->i = 14; break; - case DEVINFO_INT_ADDRBUS_SHIFT_0: info->i = 0; break; - - - /* --- the following bits of info are returned as pointers to data --- */ - case DEVINFO_PTR_DEFAULT_MEMORY_MAP_0: info->default_map8 = ADDRESS_MAP_NAME(ppu2c0x);break; - - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(ppu2c0x); break; - case DEVINFO_FCT_STOP: /* Nothing */ break; - case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(ppu2c0x); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "2C02 PPU"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "2C0X PPU"); break; - case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_CREDITS: /* Nothing */ break; - } -} - -DEVICE_GET_INFO(ppu2c03b) -{ - switch (state) - { - case DEVINFO_STR_NAME: strcpy(info->s, "2C02B PPU"); break; - default: DEVICE_GET_INFO_CALL(ppu2c02); break; - } -} - -DEVICE_GET_INFO(ppu2c04) -{ - switch (state) - { - case DEVINFO_STR_NAME: strcpy(info->s, "2C04 PPU"); break; - default: DEVICE_GET_INFO_CALL(ppu2c02); break; - } -} - -DEVICE_GET_INFO(ppu2c05_01) -{ - switch (state) - { - case DEVINFO_STR_NAME: strcpy(info->s, "2C05 PPU"); break; - default: DEVICE_GET_INFO_CALL(ppu2c02); break; - } -} - -DEVICE_GET_INFO(ppu2c05_02) -{ - DEVICE_GET_INFO_CALL(ppu2c05_01); -} - -DEVICE_GET_INFO(ppu2c05_03) -{ - DEVICE_GET_INFO_CALL(ppu2c05_01); -} - -DEVICE_GET_INFO(ppu2c05_04) -{ - DEVICE_GET_INFO_CALL(ppu2c05_01); -} - -DEVICE_GET_INFO(ppu2c07) -{ - switch (state) - { - case DEVINFO_STR_NAME: strcpy(info->s, "2C07 PPU"); break; - default: DEVICE_GET_INFO_CALL(ppu2c02); break; - } -} - - -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C02, ppu2c02); // NTSC NES -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C03B, ppu2c03b); // Playchoice 10 -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C04, ppu2c04); // Vs. Unisystem -// The PPU_2C05 variants have different protection value, set at DEVICE_START, but otherwise are all the same... -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C05_01, ppu2c05_01); // Vs. Unisystem (Ninja Jajamaru Kun) -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C05_02, ppu2c05_02); // Vs. Unisystem (Mighty Bomb Jack) -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C05_03, ppu2c05_03); // Vs. Unisystem (Gumshoe) -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C05_04, ppu2c05_04); // Vs. Unisystem (Top Gun) -DEFINE_LEGACY_MEMORY_DEVICE(PPU_2C07, ppu2c07); // PAL NES diff -Nru mame-0.144/src/mame/video/ppu2c0x.h mame-0.145/src/mame/video/ppu2c0x.h --- mame-0.144/src/mame/video/ppu2c0x.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ppu2c0x.h 2012-02-06 21:30:32.000000000 +0000 @@ -7,17 +7,19 @@ ******************************************************************************/ +#pragma once + #ifndef __PPU_2C03B_H__ #define __PPU_2C03B_H__ #include "devlegcy.h" -/*************************************************************************** - CONSTANTS -***************************************************************************/ +///************************************************************************* +// MACROS / CONSTANTS +///************************************************************************* -/* mirroring types */ +// mirroring types #define PPU_MIRROR_NONE 0 #define PPU_MIRROR_VERT 1 #define PPU_MIRROR_HORZ 2 @@ -25,7 +27,7 @@ #define PPU_MIRROR_LOW 4 #define PPU_MIRROR_4SCREEN 5 // Same effect as NONE, but signals that we should never mirror -/* registers definition */ +// registers definition enum { PPU_CONTROL0 = 0, @@ -39,7 +41,7 @@ PPU_MAX_REG }; -/* bit definitions for (some of) the registers */ +// bit definitions for (some of) the registers enum { PPU_CONTROL0_INC = 0x04, @@ -74,15 +76,58 @@ // are non-rendering and non-vblank. }; -/* callback datatypes */ +/*----------- defined in video/ppu2c0x.c -----------*/ + +///************************************************************************* +// INTERFACE CONFIGURATION MACROS +///************************************************************************* + +#define MCFG_PPU2C0X_ADD(_tag, _type, _intrf) \ + MCFG_DEVICE_ADD(_tag, _type, 0) \ + MCFG_DEVICE_CONFIG(_intrf) + +#define MCFG_PPU2C02_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C02, _intrf) \ + +#define MCFG_PPU2C03B_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C03B, _intrf) \ + +#define MCFG_PPU2C04_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C04, _intrf) \ + +#define MCFG_PPU2C07_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C07, _intrf) \ + +#define MCFG_PPU2C05_01_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C05_01, _intrf) \ + +#define MCFG_PPU2C05_02_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C05_02, _intrf) \ + +#define MCFG_PPU2C05_03_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C05_03, _intrf) \ + +#define MCFG_PPU2C05_04_ADD(_tag, _intrf) \ + MCFG_PPU2C0X_ADD(_tag, PPU_2C05_04, _intrf) \ + + +///************************************************************************* +// TYPE DEFINITIONS +///************************************************************************* + +// callback datatypes typedef void (*ppu2c0x_scanline_cb)( device_t *device, int scanline, int vblank, int blanked ); typedef void (*ppu2c0x_hblank_cb)( device_t *device, int scanline, int vblank, int blanked ); typedef void (*ppu2c0x_nmi_cb)( device_t *device, int *ppu_regs ); typedef int (*ppu2c0x_vidaccess_cb)( device_t *device, int address, int data ); -typedef struct _ppu2c0x_interface ppu2c0x_interface; -struct _ppu2c0x_interface + +// ======================> ppu2c0x_interface + +struct ppu2c0x_interface { + const char *cpu_tag; + const char *screen_tag; int gfx_layout_number; /* gfx layout number used by each chip */ int color_base; /* color base to use per ppu */ int mirroring; /* mirroring options (PPU_MIRROR_* flag) */ @@ -90,75 +135,154 @@ }; -/*************************************************************************** - PROTOTYPES -***************************************************************************/ - -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C02, ppu2c02); // NTSC NES -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C03B, ppu2c03b); // Playchoice 10 -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C04, ppu2c04); // Vs. Unisystem -// The PPU_2C05 variants have different protection value, set at DEVICE_START, but otherwise are all the same... -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C05_01, ppu2c05_01); // Vs. Unisystem (Ninja Jajamaru Kun) -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C05_02, ppu2c05_02); // Vs. Unisystem (Mighty Bomb Jack) -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C05_03, ppu2c05_03); // Vs. Unisystem (Gumshoe) -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C05_04, ppu2c05_04); // Vs. Unisystem (Top Gun) -DECLARE_LEGACY_MEMORY_DEVICE(PPU_2C07, ppu2c07); // PAL NES - -/* routines */ -void ppu2c0x_init_palette(running_machine &machine, int first_entry ); -void ppu2c0x_init_palette_rgb(running_machine &machine, int first_entry ); - -void ppu2c0x_spriteram_dma(address_space *space, device_t *device, const UINT8 page ) ATTR_NONNULL(1); -void ppu2c0x_render( device_t *device, bitmap_t *bitmap, int flipx, int flipy, int sx, int sy ) ATTR_NONNULL(1); -int ppu2c0x_get_pixel( device_t *device, int x, int y ) ATTR_NONNULL(1); -int ppu2c0x_get_colorbase( device_t *device ) ATTR_NONNULL(1); -int ppu2c0x_get_current_scanline( device_t *device ) ATTR_NONNULL(1); -int ppu2c0x_is_sprite_8x16( device_t *device ) ATTR_NONNULL(1); -void ppu2c0x_set_scanline_callback( device_t *device, ppu2c0x_scanline_cb cb ) ATTR_NONNULL(1); -void ppu2c0x_set_hblank_callback( device_t *device, ppu2c0x_scanline_cb cb ) ATTR_NONNULL(1); -void ppu2c0x_set_vidaccess_callback( device_t *device, ppu2c0x_vidaccess_cb cb ) ATTR_NONNULL(1); -void ppu2c0x_set_scanlines_per_frame( device_t *device, int scanlines ) ATTR_NONNULL(1); - -//27/12/2002 (HACK!) -void ppu2c0x_set_latch( device_t *device, void (*ppu_latch_t)( device_t *device, offs_t offset )); -WRITE8_DEVICE_HANDLER( ppu2c0x_w ); -READ8_DEVICE_HANDLER( ppu2c0x_r ); - - -/*************************************************************************** - DEVICE CONFIGURATION MACROS -***************************************************************************/ +// ======================> ppu2c0x_device -#define MCFG_PPU2C02_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C02, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c0x_device : public device_t, + public device_memory_interface, + public ppu2c0x_interface +{ +public: + // construction/destruction + ppu2c0x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( palette_read ); + DECLARE_WRITE8_MEMBER( palette_write ); + + virtual void device_start(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + virtual void device_config_complete(); + // device_config_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + // address space configurations + const address_space_config m_space_config; + + + /* routines */ + void init_palette( running_machine &machine, int first_entry ); + void init_palette_rgb( running_machine &machine, int first_entry ); + + void draw_background( UINT8 *line_priority ); + void draw_sprites( UINT8 *line_priority ); + void render_scanline(); + void update_scanline(); + + void spriteram_dma(address_space *space, const UINT8 page ) ATTR_NONNULL(1); + void render( bitmap_ind16 &bitmap, int flipx, int flipy, int sx, int sy ) ATTR_NONNULL(1); + int get_pixel( int x, int y ) ATTR_NONNULL(1); + + int get_colorbase() { return m_color_base; }; + int get_current_scanline() { return m_scanline; }; + int is_sprite_8x16() { return BIT(m_regs[0], 5); }; // MMC5 has to be able to check this + void set_scanline_callback( ppu2c0x_scanline_cb cb ) { if (cb != NULL) m_scanline_callback_proc = cb; }; + void set_hblank_callback( ppu2c0x_scanline_cb cb ) { if (cb != NULL) m_hblank_callback_proc = cb; }; + void set_vidaccess_callback( ppu2c0x_vidaccess_cb cb ) { if (cb != NULL) m_vidaccess_callback_proc = cb; }; + void set_scanlines_per_frame( int scanlines ) { m_scanlines_per_frame = scanlines; }; + + //27/12/2002 (HACK!) + void set_latch( void (*ppu_latch_t)( device_t *device, offs_t offset ) ); + + // void update_screen(bitmap_t &bitmap, const rectangle &cliprect); + + cpu_device *m_cpu; + screen_device *m_screen; + bitmap_ind16 *m_bitmap; /* target bitmap */ + UINT8 *m_spriteram; /* sprite ram */ + pen_t *m_colortable; /* color table modified at run time */ + pen_t *m_colortable_mono; /* monochromatic color table modified at run time */ + int m_scanline; /* scanline count */ + ppu2c0x_scanline_cb m_scanline_callback_proc; /* optional scanline callback */ + ppu2c0x_hblank_cb m_hblank_callback_proc; /* optional hblank callback */ + ppu2c0x_vidaccess_cb m_vidaccess_callback_proc; /* optional video access callback */ + ppu2c0x_nmi_cb m_nmi_callback_proc; /* nmi access callback from interface */ + int m_regs[PPU_MAX_REG]; /* registers */ + int m_refresh_data; /* refresh-related */ + int m_refresh_latch; /* refresh-related */ + int m_x_fine; /* refresh-related */ + int m_toggle; /* used to latch hi-lo scroll */ + int m_add; /* vram increment amount */ + int m_videomem_addr; /* videomem address pointer */ + int m_data_latch; /* latched videomem data */ + int m_buffered_data; + int m_tile_page; /* current tile page */ + int m_sprite_page; /* current sprite page */ + int m_back_color; /* background color */ + int m_color_base; + UINT8 m_palette_ram[0x20]; /* shouldn't be in main memory! */ + int m_scan_scale; /* scan scale */ + int m_scanlines_per_frame; /* number of scanlines per frame */ + int m_security_value; /* 2C05 protection */ + void (*m_latch)( device_t *device, offs_t offset ); + + // timers + emu_timer *m_hblank_timer; /* hblank period at end of each scanline */ + emu_timer *m_nmi_timer; /* NMI timer */ + emu_timer *m_scanline_timer; /* scanline timer */ + + const char *m_cpu_tag; + const char *m_screen_tag; + +private: + static const device_timer_id TIMER_HBLANK = 0; + static const device_timer_id TIMER_NMI = 1; + static const device_timer_id TIMER_SCANLINE = 2; -#define MCFG_PPU2C03B_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C03B, 0) \ - MCFG_DEVICE_CONFIG(_intrf) + inline UINT8 readbyte(offs_t address); + inline void writebyte(offs_t address, UINT8 data); +}; -#define MCFG_PPU2C04_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C04, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c02_device : public ppu2c0x_device { +public: + ppu2c02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; -#define MCFG_PPU2C05_01_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C05_01, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c03b_device : public ppu2c0x_device { +public: + ppu2c03b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; -#define MCFG_PPU2C05_02_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C05_02, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c04_device : public ppu2c0x_device { +public: + ppu2c04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; -#define MCFG_PPU2C05_03_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C05_03, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c07_device : public ppu2c0x_device { +public: + ppu2c07_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; -#define MCFG_PPU2C05_04_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C05_04, 0) \ - MCFG_DEVICE_CONFIG(_intrf) +class ppu2c05_01_device : public ppu2c0x_device { +public: + ppu2c05_01_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class ppu2c05_02_device : public ppu2c0x_device { +public: + ppu2c05_02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class ppu2c05_03_device : public ppu2c0x_device { +public: + ppu2c05_03_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + +class ppu2c05_04_device : public ppu2c0x_device { +public: + ppu2c05_04_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + + +// device type definition +//extern const device_type PPU_2C0X; +extern const device_type PPU_2C02; // NTSC NES +extern const device_type PPU_2C03B; // Playchoice 10 +extern const device_type PPU_2C04; // Vs. Unisystem +extern const device_type PPU_2C07; // PAL NES +extern const device_type PPU_2C05_01; // Vs. Unisystem (Ninja Jajamaru Kun) +extern const device_type PPU_2C05_02; // Vs. Unisystem (Mighty Bomb Jack) +extern const device_type PPU_2C05_03; // Vs. Unisystem (Gumshoe) +extern const device_type PPU_2C05_04; // Vs. Unisystem (Top Gun) -#define MCFG_PPU2C07_ADD(_tag, _intrf) \ - MCFG_DEVICE_ADD(_tag, PPU_2C07, 0) \ - MCFG_DEVICE_CONFIG(_intrf) -#endif /* __PPU_2C0X_H__ */ +#endif diff -Nru mame-0.144/src/mame/video/prehisle.c mame-0.145/src/mame/video/prehisle.c --- mame-0.144/src/mame/video/prehisle.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/prehisle.c 2012-02-06 21:30:32.000000000 +0000 @@ -15,7 +15,7 @@ prehisle_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_videoram16[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( prehisle_fg_videoram16_w ) @@ -23,7 +23,7 @@ prehisle_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } READ16_HANDLER( prehisle_control16_r ) @@ -50,10 +50,10 @@ switch (offset) { - case 0x00: tilemap_set_scrolly(state->m_bg_tilemap, 0, scroll); break; - case 0x08: tilemap_set_scrollx(state->m_bg_tilemap, 0, scroll); break; - case 0x10: tilemap_set_scrolly(state->m_bg2_tilemap, 0, scroll); break; - case 0x18: tilemap_set_scrollx(state->m_bg2_tilemap, 0, scroll); break; + case 0x00: state->m_bg_tilemap->set_scrolly(0, scroll); break; + case 0x08: state->m_bg_tilemap->set_scrollx(0, scroll); break; + case 0x10: state->m_bg2_tilemap->set_scrolly(0, scroll); break; + case 0x18: state->m_bg2_tilemap->set_scrollx(0, scroll); break; case 0x23: state->m_invert_controls = data ? 0x00ff : 0x0000; break; case 0x28: coin_counter_w(space->machine(), 0, data & 1); break; case 0x29: coin_counter_w(space->machine(), 1, data & 1); break; @@ -108,8 +108,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_transparent_pen(15); /* register for saving */ state->save_item(NAME(state->m_invert_controls)); @@ -128,7 +128,7 @@ 3 xxxx............ color+priority, other bits unknown */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int foreground ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int foreground ) { prehisle_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -164,14 +164,14 @@ } } -SCREEN_UPDATE( prehisle ) +SCREEN_UPDATE_IND16( prehisle ) { - prehisle_state *state = screen->machine().driver_data(); + prehisle_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/psikyo4.c mame-0.145/src/mame/video/psikyo4.c --- mame-0.144/src/mame/video/psikyo4.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/psikyo4.c 2012-02-06 21:30:32.000000000 +0000 @@ -31,7 +31,7 @@ /* --- SPRITES --- */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 scr ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 scr ) { /*- Sprite Format 0x0000 - 0x2bff -** @@ -127,21 +127,17 @@ } } -SCREEN_UPDATE( psikyo4 ) +SCREEN_UPDATE_IND16( psikyo4_left ) { - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + bitmap.fill(0x1000, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x0000); + return 0; +} - if (screen == left_screen) - { - bitmap_fill(bitmap, cliprect, 0x1000); - draw_sprites(screen->machine(), bitmap, cliprect, 0x0000); - } - if (screen == right_screen) - { - bitmap_fill(bitmap, cliprect, 0x1001); - draw_sprites(screen->machine(), bitmap, cliprect, 0x2000); - } +SCREEN_UPDATE_IND16( psikyo4_right ) +{ + bitmap.fill(0x1001, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0x2000); return 0; } diff -Nru mame-0.144/src/mame/video/psikyo.c mame-0.145/src/mame/video/psikyo.c --- mame-0.144/src/mame/video/psikyo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/psikyo.c 2012-02-06 21:30:33.000000000 +0000 @@ -101,18 +101,18 @@ COMBINE_DATA(&state->m_vram_0[offset]); if (ACCESSING_BITS_16_31) { - tilemap_mark_tile_dirty(state->m_tilemap_0_size0, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_0_size1, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_0_size2, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_0_size3, offset * 2); + state->m_tilemap_0_size0->mark_tile_dirty(offset * 2); + state->m_tilemap_0_size1->mark_tile_dirty(offset * 2); + state->m_tilemap_0_size2->mark_tile_dirty(offset * 2); + state->m_tilemap_0_size3->mark_tile_dirty(offset * 2); } if (ACCESSING_BITS_0_15) { - tilemap_mark_tile_dirty(state->m_tilemap_0_size0, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_0_size1, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_0_size2, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_0_size3, offset * 2 + 1); + state->m_tilemap_0_size0->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_0_size1->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_0_size2->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_0_size3->mark_tile_dirty(offset * 2 + 1); } } @@ -123,18 +123,18 @@ COMBINE_DATA(&state->m_vram_1[offset]); if (ACCESSING_BITS_16_31) { - tilemap_mark_tile_dirty(state->m_tilemap_1_size0, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_1_size1, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_1_size2, offset * 2); - tilemap_mark_tile_dirty(state->m_tilemap_1_size3, offset * 2); + state->m_tilemap_1_size0->mark_tile_dirty(offset * 2); + state->m_tilemap_1_size1->mark_tile_dirty(offset * 2); + state->m_tilemap_1_size2->mark_tile_dirty(offset * 2); + state->m_tilemap_1_size3->mark_tile_dirty(offset * 2); } if (ACCESSING_BITS_0_15) { - tilemap_mark_tile_dirty(state->m_tilemap_1_size0, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_1_size1, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_1_size2, offset * 2 + 1); - tilemap_mark_tile_dirty(state->m_tilemap_1_size3, offset * 2 + 1); + state->m_tilemap_1_size0->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_1_size1->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_1_size2->mark_tile_dirty(offset * 2 + 1); + state->m_tilemap_1_size3->mark_tile_dirty(offset * 2 + 1); } } @@ -145,18 +145,18 @@ if ((tmap == 0) && (bank != state->m_tilemap_0_bank)) { state->m_tilemap_0_bank = bank; - tilemap_mark_all_tiles_dirty(state->m_tilemap_0_size0); - tilemap_mark_all_tiles_dirty(state->m_tilemap_0_size1); - tilemap_mark_all_tiles_dirty(state->m_tilemap_0_size2); - tilemap_mark_all_tiles_dirty(state->m_tilemap_0_size3); + state->m_tilemap_0_size0->mark_all_dirty(); + state->m_tilemap_0_size1->mark_all_dirty(); + state->m_tilemap_0_size2->mark_all_dirty(); + state->m_tilemap_0_size3->mark_all_dirty(); } else if ((tmap == 1) && (bank != state->m_tilemap_1_bank)) { state->m_tilemap_1_bank = bank; - tilemap_mark_all_tiles_dirty(state->m_tilemap_1_size0); - tilemap_mark_all_tiles_dirty(state->m_tilemap_1_size1); - tilemap_mark_all_tiles_dirty(state->m_tilemap_1_size2); - tilemap_mark_all_tiles_dirty(state->m_tilemap_1_size3); + state->m_tilemap_1_size0->mark_all_dirty(); + state->m_tilemap_1_size1->mark_all_dirty(); + state->m_tilemap_1_size2->mark_all_dirty(); + state->m_tilemap_1_size3->mark_all_dirty(); } } @@ -181,29 +181,29 @@ state->m_spritebuf1 = auto_alloc_array(machine, UINT32, 0x2000 / 4); state->m_spritebuf2 = auto_alloc_array(machine, UINT32, 0x2000 / 4); - tilemap_set_scroll_rows(state->m_tilemap_0_size0, 0x80 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_0_size0, 1); + state->m_tilemap_0_size0->set_scroll_rows(0x80 * 16); // line scrolling + state->m_tilemap_0_size0->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_0_size1, 0x40 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_0_size1, 1); + state->m_tilemap_0_size1->set_scroll_rows(0x40 * 16); // line scrolling + state->m_tilemap_0_size1->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_0_size2, 0x20 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_0_size2, 1); + state->m_tilemap_0_size2->set_scroll_rows(0x20 * 16); // line scrolling + state->m_tilemap_0_size2->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_0_size3, 0x10 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_0_size3, 1); + state->m_tilemap_0_size3->set_scroll_rows(0x10 * 16); // line scrolling + state->m_tilemap_0_size3->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1_size0, 0x80 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_1_size0, 1); + state->m_tilemap_1_size0->set_scroll_rows(0x80 * 16); // line scrolling + state->m_tilemap_1_size0->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1_size1, 0x40 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_1_size1, 1); + state->m_tilemap_1_size1->set_scroll_rows(0x40 * 16); // line scrolling + state->m_tilemap_1_size1->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1_size2, 0x20 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_1_size2, 1); + state->m_tilemap_1_size2->set_scroll_rows(0x20 * 16); // line scrolling + state->m_tilemap_1_size2->set_scroll_cols(1); - tilemap_set_scroll_rows(state->m_tilemap_1_size3, 0x10 * 16); // line scrolling - tilemap_set_scroll_cols(state->m_tilemap_1_size3, 1); + state->m_tilemap_1_size3->set_scroll_rows(0x10 * 16); // line scrolling + state->m_tilemap_1_size3->set_scroll_cols(1); state->save_pointer(NAME(state->m_spritebuf1), 0x2000 / 4); state->save_pointer(NAME(state->m_spritebuf2), 0x2000 / 4); @@ -263,7 +263,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int trans_pen ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen ) { psikyo_state *state = machine.driver_data(); @@ -382,17 +382,14 @@ // until I work out why it makes a partial copy of the sprite list, and how best to apply it // sprite placement of the explosion graphic seems incorrect compared to the original sets? (no / different zoom support?) // it might be a problem with the actual bootleg -static void draw_sprites_bootleg( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int trans_pen ) +static void draw_sprites_bootleg( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int trans_pen ) { psikyo_state *state = machine.driver_data(); /* tile layers 0 & 1 have priorities 1 & 2 */ static const int pri[] = { 0, 0xfc, 0xff, 0xff }; int offs; - -// UINT16 *spritelist = (UINT16 *)(state->m_spriteram + 0x1800/4); UINT16 *spritelist = (UINT16 *)(state->m_spritebuf2 + 0x1800 / 4); - UINT8 *TILES = machine.region("spritelut")->base(); // Sprites LUT int TILES_LEN = machine.region("spritelut")->bytes(); @@ -426,7 +423,6 @@ sprite = spritelist[BYTE_XOR_BE(offs)]; sprite %= 0x300; -// source = &state->m_bootleg_spritebuffer[sprite * 8 / 4]; source = &state->m_spritebuf2[sprite * 8 / 4]; /* Draw this sprite */ @@ -524,9 +520,9 @@ return 0x10 * 16; } -SCREEN_UPDATE( psikyo ) +SCREEN_UPDATE_IND16( psikyo ) { - psikyo_state *state = screen->machine().driver_data(); + psikyo_state *state = screen.machine().driver_data(); int i, layers_ctrl = -1; UINT32 tm0size, tm1size; @@ -539,7 +535,7 @@ tilemap_t *tmptilemap0, *tmptilemap1; - flip_screen_set(screen->machine(), ~input_port_read(screen->machine(), "DSW") & 0x00010000); // hardwired to a DSW bit + flip_screen_set(screen.machine(), ~input_port_read(screen.machine(), "DSW") & 0x00010000); // hardwired to a DSW bit /* Layers enable (not quite right) */ @@ -574,8 +570,8 @@ /* For gfx banking for s1945jn/gunbird/btlkroad */ if (state->m_ka302c_banking) { - psikyo_switch_banks(screen->machine(), 0, (layer0_ctrl & 0x400) >> 10); - psikyo_switch_banks(screen->machine(), 1, (layer1_ctrl & 0x400) >> 10); + psikyo_switch_banks(screen.machine(), 0, (layer0_ctrl & 0x400) >> 10); + psikyo_switch_banks(screen.machine(), 1, (layer1_ctrl & 0x400) >> 10); } switch ((layer0_ctrl & 0x00c0) >> 6) @@ -612,8 +608,8 @@ else tmptilemap1 = state->m_tilemap_1_size3; - tilemap_set_enable(tmptilemap0, ~layer0_ctrl & 1); - tilemap_set_enable(tmptilemap1, ~layer1_ctrl & 1); + tmptilemap0->enable(~layer0_ctrl & 1); + tmptilemap1->enable(~layer1_ctrl & 1); /* Layers scrolling */ @@ -622,9 +618,9 @@ layer1_scrolly = state->m_vregs[0x40a / 4]; layer1_scrollx = state->m_vregs[0x40e / 4]; - tilemap_set_scrolly(tmptilemap0, 0, layer0_scrolly); + tmptilemap0->set_scrolly(0, layer0_scrolly); - tilemap_set_scrolly(tmptilemap1, 0, layer1_scrolly); + tmptilemap1->set_scrolly(0, layer1_scrolly); for (i = 0; i < 256; i++) /* 256 screen lines */ { @@ -641,8 +637,8 @@ x0 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x000/2 + i)]; } - tilemap_set_scrollx( - tmptilemap0, + + tmptilemap0->set_scrollx( (i + layer0_scrolly) % tilemap_width(tm0size), layer0_scrollx + x0 ); @@ -658,34 +654,34 @@ x1 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x200/2 + i)]; } - tilemap_set_scrollx( - tmptilemap1, + + tmptilemap1->set_scrollx( (i + layer1_scrolly) % tilemap_width(tm1size), layer1_scrollx + x1 ); } - tilemap_set_transparent_pen(state->m_tilemap_0_size0, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size1, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size2, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size3, (layer0_ctrl & 8 ? 0 : 15)); - - tilemap_set_transparent_pen(state->m_tilemap_1_size0, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size1, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size2, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size3, (layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size0->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size1->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size2->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size3->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + + state->m_tilemap_1_size0->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size1->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size2->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size3->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (layers_ctrl & 1) - tilemap_draw(bitmap, cliprect, tmptilemap0, layer0_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); + tmptilemap0->draw(bitmap, cliprect, layer0_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); if (layers_ctrl & 2) - tilemap_draw(bitmap, cliprect, tmptilemap1, layer1_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); + tmptilemap1->draw(bitmap, cliprect, layer1_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); if (layers_ctrl & 4) - draw_sprites(screen->machine(), bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15)); + draw_sprites(screen.machine(), bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15)); return 0; } @@ -698,9 +694,9 @@ */ -SCREEN_UPDATE( psikyo_bootleg ) +SCREEN_UPDATE_IND16( psikyo_bootleg ) { - psikyo_state *state = screen->machine().driver_data(); + psikyo_state *state = screen.machine().driver_data(); int i, layers_ctrl = -1; UINT32 tm0size, tm1size; @@ -713,7 +709,7 @@ tilemap_t *tmptilemap0, *tmptilemap1; - flip_screen_set(screen->machine(), ~input_port_read(screen->machine(), "DSW") & 0x00010000); // hardwired to a DSW bit + flip_screen_set(screen.machine(), ~input_port_read(screen.machine(), "DSW") & 0x00010000); // hardwired to a DSW bit /* Layers enable (not quite right) */ @@ -748,8 +744,8 @@ /* For gfx banking for s1945jn/gunbird/btlkroad */ if (state->m_ka302c_banking) { - psikyo_switch_banks(screen->machine(), 0, (layer0_ctrl & 0x400) >> 10); - psikyo_switch_banks(screen->machine(), 1, (layer1_ctrl & 0x400) >> 10); + psikyo_switch_banks(screen.machine(), 0, (layer0_ctrl & 0x400) >> 10); + psikyo_switch_banks(screen.machine(), 1, (layer1_ctrl & 0x400) >> 10); } switch ((layer0_ctrl & 0x00c0) >> 6) @@ -786,8 +782,8 @@ else tmptilemap1 = state->m_tilemap_1_size3; - tilemap_set_enable(tmptilemap0, ~layer0_ctrl & 1); - tilemap_set_enable(tmptilemap1, ~layer1_ctrl & 1); + tmptilemap0->enable(~layer0_ctrl & 1); + tmptilemap1->enable(~layer1_ctrl & 1); /* Layers scrolling */ @@ -796,9 +792,9 @@ layer1_scrolly = state->m_vregs[0x40a / 4]; layer1_scrollx = state->m_vregs[0x40e / 4]; - tilemap_set_scrolly(tmptilemap0, 0, layer0_scrolly); + tmptilemap0->set_scrolly(0, layer0_scrolly); - tilemap_set_scrolly(tmptilemap1, 0, layer1_scrolly); + tmptilemap1->set_scrolly(0, layer1_scrolly); for (i = 0; i < 256; i++) /* 256 screen lines */ { @@ -815,8 +811,8 @@ x0 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x000/2 + i)]; } - tilemap_set_scrollx( - tmptilemap0, + + tmptilemap0->set_scrollx( (i + layer0_scrolly) % tilemap_width(tm0size), layer0_scrollx + x0 ); @@ -832,42 +828,46 @@ x1 = ((UINT16 *)state->m_vregs)[BYTE_XOR_BE(0x200/2 + i)]; } - tilemap_set_scrollx( - tmptilemap1, + + tmptilemap1->set_scrollx( (i + layer1_scrolly) % tilemap_width(tm1size), layer1_scrollx + x1 ); } - tilemap_set_transparent_pen(state->m_tilemap_0_size0, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size1, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size2, (layer0_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_0_size3, (layer0_ctrl & 8 ? 0 : 15)); - - tilemap_set_transparent_pen(state->m_tilemap_1_size0, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size1, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size2, (layer1_ctrl & 8 ? 0 : 15)); - tilemap_set_transparent_pen(state->m_tilemap_1_size3, (layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size0->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size1->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size2->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + state->m_tilemap_0_size3->set_transparent_pen((layer0_ctrl & 8 ? 0 : 15)); + + state->m_tilemap_1_size0->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size1->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size2->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); + state->m_tilemap_1_size3->set_transparent_pen((layer1_ctrl & 8 ? 0 : 15)); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (layers_ctrl & 1) - tilemap_draw(bitmap, cliprect, tmptilemap0, layer0_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); + tmptilemap0->draw(bitmap, cliprect, layer0_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); if (layers_ctrl & 2) - tilemap_draw(bitmap, cliprect, tmptilemap1, layer1_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); + tmptilemap1->draw(bitmap, cliprect, layer1_ctrl & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); if (layers_ctrl & 4) - draw_sprites_bootleg(screen->machine(), bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15)); + draw_sprites_bootleg(screen.machine(), bitmap, cliprect, (spr_ctrl & 4 ? 0 : 15)); return 0; } -SCREEN_EOF( psikyo ) +SCREEN_VBLANK( psikyo ) { - psikyo_state *state = machine.driver_data(); - memcpy(state->m_spritebuf2, state->m_spritebuf1, 0x2000); - memcpy(state->m_spritebuf1, state->m_spriteram, 0x2000); + // rising edge + if (vblank_on) + { + psikyo_state *state = screen.machine().driver_data(); + memcpy(state->m_spritebuf2, state->m_spritebuf1, 0x2000); + memcpy(state->m_spritebuf1, state->m_spriteram, 0x2000); + } } diff -Nru mame-0.144/src/mame/video/psikyosh.c mame-0.145/src/mame/video/psikyosh.c --- mame-0.144/src/mame/video/psikyosh.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/psikyosh.c 2012-02-06 21:30:31.000000000 +0000 @@ -147,14 +147,11 @@ draw_scanline32_alpha - take an RGB-encoded UINT32 scanline and alpha-blend it into the destination bitmap -------------------------------------------------*/ -static void draw_scanline32_alpha(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, int alpha) +static void draw_scanline32_alpha(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr, int alpha) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; UINT32 transpen = BG_TRANSPEN; - assert(bitmap != NULL); - assert(bitmap->bpp == 32); - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN_ALPHARENDER32, NO_PRIORITY); } @@ -162,15 +159,11 @@ draw_scanline32_argb - take an ARGB-encoded UINT32 scanline and alpha-blend it into the destination bitmap -------------------------------------------------*/ -static void draw_scanline32_argb(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr) +static void draw_scanline32_argb(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; UINT32 transpen = BG_TRANSPEN; - assert(bitmap != NULL); - assert(bitmap->bpp == 32); - assert(bitmap->format == BITMAP_FORMAT_ARGB32); - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN_ARGBRENDER32, NO_PRIORITY); } @@ -178,15 +171,11 @@ draw_scanline32_tranpens - take an RGB-encoded UINT32 scanline and copy it into the destination bitmap, testing for the special ARGB transpen -------------------------------------------------*/ -static void draw_scanline32_transpen(bitmap_t *bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr) +static void draw_scanline32_transpen(bitmap_rgb32 &bitmap, INT32 destx, INT32 desty, INT32 length, const UINT32 *srcptr) { - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; UINT32 transpen = BG_TRANSPEN; - assert(bitmap != NULL); - assert(bitmap->bpp == 32); - assert(bitmap->format == BITMAP_FORMAT_ARGB32); - DRAWSCANLINE_CORE(UINT32, PIXEL_OP_COPY_TRANSPEN_RENDER32, NO_PRIORITY); } @@ -195,18 +184,17 @@ a single transparent pen, storing the alpha value in alpha field of ARGB32, negative alpha implies alphatable -------------------------------------------------*/ -static void drawgfx_alphastore(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +static void drawgfx_alphastore(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, int fixedalpha) { psikyosh_state *state = gfx->machine().driver_data(); UINT8 *alphatable = state->m_alphatable; - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; const pen_t *paldata; - assert(dest != NULL); - assert(dest->bpp == 32); - assert(dest->format == BITMAP_FORMAT_ARGB32); + assert(dest.bpp() == 32); + assert(dest.format() == BITMAP_FORMAT_ARGB32); assert(gfx != NULL); assert(alphatable != NULL); @@ -242,13 +230,13 @@ a fixed alpha value, or if alpha==-1 then uses the per-pen alphatable[] array -------------------------------------------------*/ -static void drawgfx_alphatable(bitmap_t *dest, const rectangle *cliprect, const gfx_element *gfx, +static void drawgfx_alphatable(bitmap_rgb32 &dest, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, INT32 destx, INT32 desty, int fixedalpha) { psikyosh_state *state = gfx->machine().driver_data(); UINT8 *alphatable = state->m_alphatable; - bitmap_t *priority = NULL; /* dummy, no priority in this case */ + DECLARE_NO_PRIORITY; const pen_t *paldata; @@ -259,8 +247,7 @@ return; } - assert(dest != NULL); - assert(dest->bpp == 32); + assert(dest.bpp() == 32); assert(gfx != NULL); assert(alphatable != NULL); @@ -281,7 +268,7 @@ /* 'Normal' layers, no line/columnscroll. No per-line effects. Zooming isn't supported just because it's not used and it would be slow */ -static void draw_bglayer( running_machine &machine, int layer, bitmap_t *bitmap, const rectangle *cliprect, UINT8 req_pri ) +static void draw_bglayer( running_machine &machine, int layer, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 req_pri ) { psikyosh_state *state = machine.driver_data(); gfx_element *gfx; @@ -355,12 +342,9 @@ { rectangle cliprect; - cliprect.min_x = 0; - cliprect.max_x = state->m_bg_bitmap->width - 1; - cliprect.min_y = sy * 16; - cliprect.max_y = cliprect.min_y + 16 - 1; + cliprect.set(0, state->m_bg_bitmap.width() - 1, sy * 16, cliprect.min_y + 16 - 1); - bitmap_fill(state->m_bg_bitmap, &cliprect, BG_TRANSPEN); + state->m_bg_bitmap.fill(BG_TRANSPEN, cliprect); int width = size * 16; int offs = size * sy; @@ -375,7 +359,7 @@ int need_alpha = alpha < 0 ? -1 : 0xff; // store per-pen alpha in bitmap, otherwise don't since we'll need it per-line if(tileno) { // valid tile, but blank in all games? - drawgfx_alphastore(state->m_bg_bitmap, NULL, gfx, tileno, colour, 0, 0, (16 * sx) & 0x1ff, ((16 * sy) & (width - 1)), need_alpha); + drawgfx_alphastore(state->m_bg_bitmap, state->m_bg_bitmap.cliprect(), gfx, tileno, colour, 0, 0, (16 * sx) & 0x1ff, ((16 * sy) & (width - 1)), need_alpha); } offs++; @@ -389,7 +373,7 @@ Bitmap is first rendered to an ARGB image, taking into account the per-pen alpha (if used). From there we extract data as we compose the image, one scanline at a time, blending the ARGB pixels into the RGB32 bitmap (with either the alpha information from the ARGB, or per-line alpha */ -static void draw_bglayerscroll( running_machine &machine, int layer, bitmap_t *bitmap, const rectangle *cliprect, UINT8 req_pri ) +static void draw_bglayerscroll( running_machine &machine, int layer, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 req_pri ) { psikyosh_state *state = machine.driver_data(); assert(BG_LINE(layer)); @@ -404,8 +388,8 @@ int last_bank[32]; // corresponds to bank of bitmap in state->m_bg_bitmap. bg_bitmap is split into 16/32-rows of one-tile high each for(int ii = 0; ii < 32; ii++) last_bank[ii] = -1; - int scr_width = (cliprect->max_x-cliprect->min_x + 1); - int scr_height = (cliprect->max_y-cliprect->min_y + 1); + int scr_width = cliprect.width(); + int scr_height = cliprect.height(); UINT32 *scroll_reg = &state->m_bgram[(linebank * 0x800) / 4 - 0x4000 / 4]; UINT32 *pzab_reg = &state->m_bgram[(linebank * 0x800) / 4 - 0x4000 / 4 + 0x400 / 4]; // pri, zoom, alpha, bank @@ -484,7 +468,7 @@ } /* 3 BG layers, with priority */ -static void draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 req_pri ) +static void draw_background( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 req_pri ) { psikyosh_state *state = machine.driver_data(); int i; @@ -532,7 +516,7 @@ /* Note that Level 5-4 of sbomberb boss is perfect! (Alpha blended zoomed) as well as S1945II logo */ /* pixel is only plotted if z is >= priority_buffer[y][x] */ static void psikyosh_drawgfxzoom( running_machine &machine, - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int alpha, int zoomx, int zoomy, int wide, int high, UINT32 z) { @@ -547,23 +531,11 @@ g_profiler.start(PROFILER_DRAWGFX); - assert(dest_bmp->bpp == 32); + assert(dest_bmp.bpp() == 32); /* KW 991012 -- Added code to force clip to bitmap boundary */ - if (clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width - 1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip = &myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); /* Temporary fallback for non-zoomed, needs z-buffer. Note that this is probably a lot slower than drawgfx.c, especially if there was separate code for flipped cases */ if (zoomx == 0x400 && zoomy == 0x400) @@ -602,31 +574,28 @@ ex = sx + gfx->width; ey = sy + gfx->height; - if (clip) - { - if (sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x - sx; - sx += pixels; - x_index_base += xinc * pixels; - } - if (sy < clip->min_y) - { /* clip top */ - int pixels = clip->min_y - sy; - sy += pixels; - y_index += yinc * pixels; - } - /* NS 980211 - fixed incorrect clipping */ - if (ex > clip->max_x + 1) - { /* clip right */ - int pixels = ex - clip->max_x - 1; - ex -= pixels; - } - if (ey > clip->max_y + 1) - { /* clip bottom */ - int pixels = ey - clip->max_y - 1; - ey -= pixels; - } + if (sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x - sx; + sx += pixels; + x_index_base += xinc * pixels; + } + if (sy < myclip.min_y) + { /* clip top */ + int pixels = myclip.min_y - sy; + sy += pixels; + y_index += yinc * pixels; + } + /* NS 980211 - fixed incorrect clipping */ + if (ex > myclip.max_x + 1) + { /* clip right */ + int pixels = ex - myclip.max_x - 1; + ex -= pixels; + } + if (ey > myclip.max_y + 1) + { /* clip bottom */ + int pixels = ey - myclip.max_y - 1; + ey -= pixels; } if (ex > sx) @@ -639,10 +608,10 @@ if (z > 0) { const UINT8 *source = code_base + (y_index) * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; - UINT16 *pri = (UINT16 *)state->m_z_bitmap->base + sy * state->m_z_bitmap->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); + UINT16 *pri = &state->m_z_bitmap.pix16(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -670,9 +639,9 @@ else { const UINT8 *source = code_base + y_index * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -698,10 +667,10 @@ if (z > 0) { const UINT8 *source = code_base + y_index * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; - UINT16 *pri = (UINT16 *)state->m_z_bitmap->base + sy * state->m_z_bitmap->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); + UINT16 *pri = &state->m_z_bitmap.pix16(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -729,9 +698,9 @@ else { const UINT8 *source = code_base + y_index * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -758,10 +727,10 @@ if (z > 0) { const UINT8 *source = code_base + y_index * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; - UINT16 *pri = (UINT16 *)state->m_z_bitmap->base + sy * state->m_z_bitmap->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); + UINT16 *pri = &state->m_z_bitmap.pix16(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -793,9 +762,9 @@ else { const UINT8 *source = code_base + y_index * gfx->line_modulo + x_index_base; - UINT32 *dest = (UINT32 *)dest_bmp->base + sy * dest_bmp->rowpixels + sx; + UINT32 *dest = &dest_bmp.pix32(sy, sx); int src_modulo = yinc * gfx->line_modulo - xinc * (ex - sx); - int dst_modulo = dest_bmp->rowpixels - (ex - sx); + int dst_modulo = dest_bmp.rowpixels() - (ex - sx); for (y = sy; y < ey; y++) { @@ -836,7 +805,7 @@ for (ypixel = 0; ypixel < gfx->height; ypixel++) { const UINT8 *source = code_base + ypixel * gfx->line_modulo; - UINT8 *dest = BITMAP_ADDR8(state->m_zoom_bitmap, ypixel + ytile*gfx->height, 0); + UINT8 *dest = &state->m_zoom_bitmap.pix8(ypixel + ytile*gfx->height); for (xpixel = 0; xpixel < gfx->width; xpixel++) { @@ -875,31 +844,28 @@ if (flipy) { y_index = (sprite_screen_height - 1) * zoomy; dy = -zoomy; } else { y_index = 0; dy = zoomy; } - if (clip) - { - if (sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x - sx; - sx += pixels; - x_index_base += pixels * dx; - } - if (sy < clip->min_y) - { /* clip top */ - int pixels = clip->min_y - sy; - sy += pixels; - y_index += pixels * dy; - } - /* NS 980211 - fixed incorrect clipping */ - if (ex > clip->max_x + 1) - { /* clip right */ - int pixels = ex-clip->max_x - 1; - ex -= pixels; - } - if (ey > clip->max_y + 1) - { /* clip bottom */ - int pixels = ey-clip->max_y - 1; - ey -= pixels; - } + if (sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x - sx; + sx += pixels; + x_index_base += pixels * dx; + } + if (sy < myclip.min_y) + { /* clip top */ + int pixels = myclip.min_y - sy; + sy += pixels; + y_index += pixels * dy; + } + /* NS 980211 - fixed incorrect clipping */ + if (ex > myclip.max_x + 1) + { /* clip right */ + int pixels = ex-myclip.max_x - 1; + ex -= pixels; + } + if (ey > myclip.max_y + 1) + { /* clip bottom */ + int pixels = ey-myclip.max_y - 1; + ey -= pixels; } if (ex > sx) @@ -914,9 +880,9 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT16 *pri = BITMAP_ADDR16(state->m_z_bitmap, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); + UINT16 *pri = &state->m_z_bitmap.pix16(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -940,8 +906,8 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -964,9 +930,9 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT16 *pri = BITMAP_ADDR16(state->m_z_bitmap, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); + UINT16 *pri = &state->m_z_bitmap.pix16(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -990,8 +956,8 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -1013,9 +979,9 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT16 *pri = BITMAP_ADDR16(state->m_z_bitmap, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); + UINT16 *pri = &state->m_z_bitmap.pix16(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -1043,8 +1009,8 @@ { for (y = sy; y < ey; y++) { - UINT8 *source = BITMAP_ADDR8(state->m_zoom_bitmap, y_index >> 10, 0); - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); + UINT8 *source = &state->m_zoom_bitmap.pix8(y_index >> 10); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -1072,7 +1038,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 req_pri) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 req_pri) { /*- Sprite Format 0x0000 - 0x37ff -** @@ -1192,7 +1158,7 @@ } -static void psikyosh_prelineblend( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void psikyosh_prelineblend( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { /* There are 224 values for pre-lineblending. Using one for every row currently */ /* I suspect that it should be blended against black by the amount specified as @@ -1204,22 +1170,22 @@ UINT32 *linefill = &state->m_bgram[(bank * 0x800) / 4 - 0x4000 / 4]; /* Per row */ int x, y; - assert(bitmap->bpp == 32); + assert(bitmap.bpp() == 32); g_profiler.start(PROFILER_USER8); - for (y = cliprect->min_y; y <= cliprect->max_y; y += 1) { + for (y = cliprect.min_y; y <= cliprect.max_y; y += 1) { - dstline = BITMAP_ADDR32(bitmap, y, 0); + dstline = &bitmap.pix32(y); /* linefill[y] & 0xff does what? */ - for (x = cliprect->min_x; x <= cliprect->max_x; x += 1) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 1) dstline[x] = linefill[y] >> 8; } g_profiler.stop(); } -static void psikyosh_postlineblend( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 req_pri ) +static void psikyosh_postlineblend( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 req_pri ) { /* There are 224 values for post-lineblending. Using one for every row currently */ psikyosh_state *state = machine.driver_data(); @@ -1228,25 +1194,25 @@ UINT32 *lineblend = &state->m_bgram[(bank * 0x800) / 4 - 0x4000 / 4 + 0x400 / 4]; /* Per row */ int x, y; - assert(bitmap->bpp == 32); + assert(bitmap.bpp() == 32); if ((state->m_vidregs[2] & 0xf) != req_pri) { return; } g_profiler.start(PROFILER_USER8); - for (y = cliprect->min_y; y <= cliprect->max_y; y += 1) { + for (y = cliprect.min_y; y <= cliprect.max_y; y += 1) { - dstline = BITMAP_ADDR32(bitmap, y, 0); + dstline = &bitmap.pix32(y); if (lineblend[y] & 0x80) /* solid */ { - for (x = cliprect->min_x; x <= cliprect->max_x; x += 1) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 1) dstline[x] = lineblend[y] >> 8; } else if (lineblend[y] & 0x7f) /* blended */ { - for (x = cliprect->min_x; x <= cliprect->max_x; x += 1) + for (x = cliprect.min_x; x <= cliprect.max_x; x += 1) dstline[x] = alpha_blend_r32(dstline[x], lineblend[y] >> 8, 2 * (lineblend[y] & 0x7f)); } } @@ -1258,12 +1224,10 @@ { psikyosh_state *state = machine.driver_data(); UINT8 *alphatable = state->m_alphatable; - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); - state->m_z_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); /* z-buffer */ - state->m_zoom_bitmap = auto_bitmap_alloc(machine, 16*16, 16*16, BITMAP_FORMAT_INDEXED8); /* temp buffer for assembling sprites */ - state->m_bg_bitmap = auto_bitmap_alloc(machine, 32*16, 32*16, BITMAP_FORMAT_RGB32); /* temp buffer for assembling tilemaps */ + machine.primary_screen->register_screen_bitmap(state->m_z_bitmap); /* z-buffer */ + state->m_zoom_bitmap.allocate(16*16, 16*16); /* temp buffer for assembling sprites */ + state->m_bg_bitmap.allocate(32*16, 32*16); /* temp buffer for assembling tilemaps */ state->m_bg_zoom = auto_alloc_array(machine, UINT16, 256); machine.gfx[1]->color_granularity = 16; /* 256 colour sprites with palette selectable on 16 colour boundaries */ @@ -1285,17 +1249,17 @@ state->m_bg_zoom[i] = (64 * 0x400) / (i + 64); } - state->save_item(NAME(*state->m_z_bitmap)); - state->save_item(NAME(*state->m_zoom_bitmap)); - state->save_item(NAME(*state->m_bg_bitmap)); + state->save_item(NAME(state->m_z_bitmap)); + state->save_item(NAME(state->m_zoom_bitmap)); + state->save_item(NAME(state->m_bg_bitmap)); state->save_pointer(NAME(state->m_bg_zoom), 256); } -SCREEN_UPDATE( psikyosh ) /* Note the z-buffer on each sprite to get correct priority */ +SCREEN_UPDATE_RGB32( psikyosh ) /* Note the z-buffer on each sprite to get correct priority */ { int i; - psikyosh_state *state = screen->machine().driver_data(); + psikyosh_state *state = screen.machine().driver_data(); // show only the priority associated with a given keypress(s) and/or hide sprites/tilemaps int pri_debug = false; @@ -1305,14 +1269,14 @@ #ifdef DEBUG_KEYS for (i = 0; i <= 7; i++) { - if(screen->machine().input().code_pressed(pri_keys[i])) { + if(screen.machine().input().code_pressed(pri_keys[i])) { pri_debug = true; } } - if(screen->machine().input().code_pressed(KEYCODE_G)) { + if(screen.machine().input().code_pressed(KEYCODE_G)) { sprites = false; } - if(screen->machine().input().code_pressed(KEYCODE_H)) { + if(screen.machine().input().code_pressed(KEYCODE_H)) { backgrounds = false; } #endif @@ -1325,28 +1289,32 @@ state->m_vidregs[6], state->m_vidregs[7]); #endif - bitmap_fill(state->m_z_bitmap, cliprect, 0); /* z-buffer */ + state->m_z_bitmap.fill(0, cliprect); /* z-buffer */ - psikyosh_prelineblend(screen->machine(), bitmap, cliprect); // fills screen + psikyosh_prelineblend(screen.machine(), bitmap, cliprect); // fills screen for (i = 0; i <= 7; i++) { - if(!pri_debug || screen->machine().input().code_pressed(pri_keys[i])) + if(!pri_debug || screen.machine().input().code_pressed(pri_keys[i])) { if(sprites) { - draw_sprites(screen->machine(), bitmap, cliprect, i); // When same priority bg's have higher pri + draw_sprites(screen.machine(), bitmap, cliprect, i); // When same priority bg's have higher pri } if(backgrounds) { - draw_background(screen->machine(), bitmap, cliprect, i); + draw_background(screen.machine(), bitmap, cliprect, i); } - psikyosh_postlineblend(screen->machine(), bitmap, cliprect, i); // assume this has highest priority at same priority level + psikyosh_postlineblend(screen.machine(), bitmap, cliprect, i); // assume this has highest priority at same priority level } } return 0; } -SCREEN_EOF( psikyosh ) +SCREEN_VBLANK( psikyosh ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram32_w(space, 0, 0, 0xffffffff); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram32_w(space, 0, 0, 0xffffffff); + } } diff -Nru mame-0.144/src/mame/video/psychic5.c mame-0.145/src/mame/video/psychic5.c --- mame-0.144/src/mame/video/psychic5.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/psychic5.c 2012-02-06 21:30:31.000000000 +0000 @@ -133,19 +133,19 @@ if (state->m_ps5_vram_page == 0) { if (offset <= 0xfff) - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } else { if (offset == BG_SCROLLX_LSB || offset == BG_SCROLLX_MSB) { UINT16 bg_scrollx = state->m_ps5_io_ram[BG_SCROLLX_LSB] | (state->m_ps5_io_ram[BG_SCROLLX_MSB] << 8); - tilemap_set_scrollx(state->m_bg_tilemap, 0, bg_scrollx); + state->m_bg_tilemap->set_scrollx(0, bg_scrollx); } else if (offset == BG_SCROLLY_LSB || offset == BG_SCROLLY_MSB) { UINT16 bg_scrolly = state->m_ps5_io_ram[BG_SCROLLY_LSB] | (state->m_ps5_io_ram[BG_SCROLLY_MSB] << 8); - tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_scrolly); + state->m_bg_tilemap->set_scrolly(0, bg_scrolly); } else if (offset == BG_SCREEN_MODE) { @@ -158,7 +158,7 @@ else if (offset >= 0xa00 && offset <= 0xbff) /* Text color */ psychic5_change_palette(space->machine(),((offset >> 1) & 0xff)+0x200,offset-0x400); else if (offset >= 0x1000) - tilemap_mark_tile_dirty(state->m_fg_tilemap, (offset-0x1000) >> 1); + state->m_fg_tilemap->mark_tile_dirty((offset-0x1000) >> 1); } } @@ -169,26 +169,26 @@ if (state->m_ps5_vram_page == 0) { - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } else { if (offset == BG_SCROLLX_LSB || offset == BG_SCROLLX_MSB) { UINT16 bg_scrollx = state->m_ps5_io_ram[BG_SCROLLX_LSB] | (state->m_ps5_io_ram[BG_SCROLLX_MSB] << 8); - tilemap_set_scrollx(state->m_bg_tilemap, 0, bg_scrollx); + state->m_bg_tilemap->set_scrollx(0, bg_scrollx); } else if (offset == BG_SCROLLY_LSB || offset == BG_SCROLLY_MSB) { UINT16 bg_scrolly = state->m_ps5_io_ram[BG_SCROLLY_LSB] | (state->m_ps5_io_ram[BG_SCROLLY_MSB] << 8); - tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_scrolly); + state->m_bg_tilemap->set_scrolly(0, bg_scrolly); } else if (offset == BG_SCREEN_MODE) { state->m_bg_status = state->m_ps5_io_ram[BG_SCREEN_MODE]; } else if (offset >= 0x0800 && offset <= 0x0fff) - tilemap_mark_tile_dirty(state->m_fg_tilemap, (offset & 0x7ff) >> 1); + state->m_fg_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); else if (offset >= 0x1000 && offset <= 0x15ff) psychic5_change_palette(space->machine(), (offset >> 1) & 0x3ff, offset-0x1000); } @@ -241,7 +241,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 64, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); state->m_ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000); state->m_ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000); @@ -265,7 +265,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 128, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); + state->m_fg_tilemap->set_transparent_pen(15); state->m_ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000); state->m_ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000); @@ -311,7 +311,7 @@ #define DRAW_SPRITE(code, sx, sy) jal_blend_drawgfx(bitmap, cliprect, machine.gfx[0], code, color, flipx, flipy, sx, sy, 15); -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { psychic5_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -365,12 +365,12 @@ } } -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { psychic5_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; - rectangle clip = *cliprect; + rectangle clip = cliprect; set_background_palette_intensity(machine); @@ -405,7 +405,7 @@ switch (state->m_bg_clip_mode) { case 0: case 4: case 8: case 12: case 16: - clip.min_x = clip.max_x = clip.min_y = clip.max_y = 0; + clip.set(0, 0, 0, 0); break; case 1: clip.min_y = state->m_sy1; break; case 3: clip.max_y = state->m_sy2; break; @@ -416,42 +416,32 @@ } if (flip_screen_get(machine)) - { - int min_x,max_x,min_y,max_y; - min_x = 255 - clip.max_x; - max_x = 255 - clip.min_x; - min_y = 255 - clip.max_y; - max_y = 255 - clip.min_y; - clip.min_x = min_x; - clip.max_x = max_x; - clip.min_y = min_y; - clip.max_y = max_y; - } + clip.set(255 - clip.max_x, 255 - clip.min_x, 255 - clip.max_y, 255 - clip.min_y); } - tilemap_draw(bitmap, &clip, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, clip, 0, 0); } -SCREEN_UPDATE( psychic5 ) +SCREEN_UPDATE_RGB32( psychic5 ) { - psychic5_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + psychic5_state *state = screen.machine().driver_data(); + bitmap.fill(get_black_pen(screen.machine()), cliprect); if (state->m_bg_status & 1) /* Backgound enable */ - draw_background(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); if (!(state->m_title_screen & 1)) - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( bombsa ) +SCREEN_UPDATE_RGB32( bombsa ) { - psychic5_state *state = screen->machine().driver_data(); + psychic5_state *state = screen.machine().driver_data(); if (state->m_bg_status & 1) /* Backgound enable */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x0ff]); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + bitmap.fill(screen.machine().pens[0x0ff], cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/punchout.c mame-0.145/src/mame/video/punchout.c --- mame-0.144/src/mame/video/punchout.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/punchout.c 2012-02-06 21:30:32.000000000 +0000 @@ -135,15 +135,15 @@ punchout_state *state = machine.driver_data(); state->m_bg_top_tilemap = tilemap_create(machine, top_get_info, tilemap_scan_rows, 8,8, 32,32); state->m_bg_bot_tilemap = tilemap_create(machine, bot_get_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_scroll_rows(state->m_bg_bot_tilemap, 32); + state->m_bg_bot_tilemap->set_scroll_rows(32); state->m_spr1_tilemap = tilemap_create(machine, bs1_get_info, tilemap_scan_rows, 8,8, 16,32); state->m_spr2_tilemap = tilemap_create(machine, bs2_get_info, tilemap_scan_rows, 8,8, 16,32); state->m_fg_tilemap = NULL; - tilemap_set_transparent_pen(state->m_spr1_tilemap, 0x07); - tilemap_set_transparent_pen(state->m_spr2_tilemap, 0x03); + state->m_spr1_tilemap->set_transparent_pen(0x07); + state->m_spr2_tilemap->set_transparent_pen(0x03); } @@ -158,10 +158,10 @@ state->m_spr2_tilemap = tilemap_create(machine, bs2_get_info, tilemap_scan_rows, 8,8, 16,32); state->m_fg_tilemap = tilemap_create(machine, armwrest_fg_get_info, tilemap_scan_rows, 8,8, 32,32); - tilemap_set_transparent_pen(state->m_spr1_tilemap, 0x07); - tilemap_set_transparent_pen(state->m_spr1_tilemap_flipx, 0x07); - tilemap_set_transparent_pen(state->m_spr2_tilemap, 0x03); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0x07); + state->m_spr1_tilemap->set_transparent_pen(0x07); + state->m_spr1_tilemap_flipx->set_transparent_pen(0x07); + state->m_spr2_tilemap->set_transparent_pen(0x03); + state->m_fg_tilemap->set_transparent_pen(0x07); } @@ -170,42 +170,42 @@ { punchout_state *state = space->machine().driver_data(); state->m_bg_top_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_top_tilemap, offset/2); + state->m_bg_top_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( punchout_bg_bot_videoram_w ) { punchout_state *state = space->machine().driver_data(); state->m_bg_bot_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_bot_tilemap, offset/2); + state->m_bg_bot_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( armwrest_fg_videoram_w ) { punchout_state *state = space->machine().driver_data(); state->m_armwrest_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( punchout_spr1_videoram_w ) { punchout_state *state = space->machine().driver_data(); state->m_spr1_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_spr1_tilemap, offset/4); + state->m_spr1_tilemap->mark_tile_dirty(offset/4); if (state->m_spr1_tilemap_flipx) - tilemap_mark_tile_dirty(state->m_spr1_tilemap_flipx, offset/4); + state->m_spr1_tilemap_flipx->mark_tile_dirty(offset/4); } WRITE8_HANDLER( punchout_spr2_videoram_w ) { punchout_state *state = space->machine().driver_data(); state->m_spr2_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_spr2_tilemap, offset/4); + state->m_spr2_tilemap->mark_tile_dirty(offset/4); } -static void draw_big_sprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int palette) +static void draw_big_sprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int palette) { punchout_state *state = machine.driver_data(); int zoom; @@ -238,9 +238,9 @@ incxx = -incxx; } - tilemap_set_palette_offset(state->m_spr1_tilemap, 0x100 * palette); + state->m_spr1_tilemap->set_palette_offset(0x100 * palette); - tilemap_draw_roz(bitmap,cliprect,state->m_spr1_tilemap, + state->m_spr1_tilemap->draw_roz(bitmap, cliprect, startx,starty + 0x200*(2) * zoom, incxx,0,0,incyy, /* zoom, no rotation */ 0, /* no wraparound */ @@ -249,7 +249,7 @@ } -static void armwrest_draw_big_sprite(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int palette) +static void armwrest_draw_big_sprite(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int palette) { punchout_state *state = machine.driver_data(); int zoom; @@ -286,9 +286,9 @@ else _tilemap = state->m_spr1_tilemap; - tilemap_set_palette_offset(_tilemap, 0x100 * palette); + _tilemap->set_palette_offset(0x100 * palette); - tilemap_draw_roz(bitmap,cliprect,_tilemap, + _tilemap->draw_roz(bitmap, cliprect, startx,starty + 0x200*(2) * zoom, incxx,0,0,incyy, /* zoom, no rotation */ 0, /* no wraparound */ @@ -296,7 +296,7 @@ } } -static void drawbs2(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void drawbs2(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { punchout_state *state = machine.driver_data(); int sx,sy; @@ -321,7 +321,7 @@ incxx = 1; // this tilemap doesn't actually zoom, but draw_roz is the only way to draw it without wraparound - tilemap_draw_roz(bitmap,cliprect,state->m_spr2_tilemap, + state->m_spr2_tilemap->draw_roz(bitmap, cliprect, sx, sy, incxx << 16, 0, 0, 1 << 16, 0, 0, 0); } @@ -369,67 +369,68 @@ } -SCREEN_UPDATE( punchout ) +SCREEN_UPDATE_IND16( punchout_top ) { - punchout_state *state = screen->machine().driver_data(); - device_t *top_screen = screen->machine().device("top"); - device_t *bottom_screen = screen->machine().device("bottom"); + punchout_state *state = screen.machine().driver_data(); - if (screen == top_screen) - { - punchout_copy_top_palette(screen->machine(), BIT(*state->m_palettebank,1)); + punchout_copy_top_palette(screen.machine(), BIT(*state->m_palettebank,1)); - tilemap_draw(bitmap, cliprect, state->m_bg_top_tilemap, 0, 0); + state->m_bg_top_tilemap->draw(bitmap, cliprect, 0, 0); - if (state->m_spr1_ctrlram[7] & 1) /* display in top monitor */ - draw_big_sprite(screen->machine(), bitmap, cliprect, 0); - } - else if (screen == bottom_screen) - { - int offs; + if (state->m_spr1_ctrlram[7] & 1) /* display in top monitor */ + draw_big_sprite(screen.machine(), bitmap, cliprect, 0); - punchout_copy_bot_palette(screen->machine(), BIT(*state->m_palettebank,0)); + return 0; +} - /* copy the character mapped graphics */ - for (offs = 0;offs < 32;offs++) - tilemap_set_scrollx(state->m_bg_bot_tilemap, offs, 58 + state->m_bg_bot_videoram[2*offs] + 256 * (state->m_bg_bot_videoram[2*offs + 1] & 0x01)); +SCREEN_UPDATE_IND16( punchout_bottom ) +{ + punchout_state *state = screen.machine().driver_data(); + int offs; - tilemap_draw(bitmap, cliprect, state->m_bg_bot_tilemap, 0, 0); + punchout_copy_bot_palette(screen.machine(), BIT(*state->m_palettebank,0)); + + /* copy the character mapped graphics */ + for (offs = 0;offs < 32;offs++) + state->m_bg_bot_tilemap->set_scrollx(offs, 58 + state->m_bg_bot_videoram[2*offs] + 256 * (state->m_bg_bot_videoram[2*offs + 1] & 0x01)); + + state->m_bg_bot_tilemap->draw(bitmap, cliprect, 0, 0); + + if (state->m_spr1_ctrlram[7] & 2) /* display in bottom monitor */ + draw_big_sprite(screen.machine(), bitmap, cliprect, 1); + drawbs2(screen.machine(), bitmap, cliprect); - if (state->m_spr1_ctrlram[7] & 2) /* display in bottom monitor */ - draw_big_sprite(screen->machine(), bitmap, cliprect, 1); - drawbs2(screen->machine(), bitmap, cliprect); - } return 0; } -SCREEN_UPDATE( armwrest ) +SCREEN_UPDATE_IND16( armwrest_top ) { - punchout_state *state = screen->machine().driver_data(); - device_t *top_screen = screen->machine().device("top"); - device_t *bottom_screen = screen->machine().device("bottom"); + punchout_state *state = screen.machine().driver_data(); - if (screen == top_screen) - { - punchout_copy_top_palette(screen->machine(), BIT(*state->m_palettebank,1)); + punchout_copy_top_palette(screen.machine(), BIT(*state->m_palettebank,1)); - tilemap_draw(bitmap, cliprect, state->m_bg_top_tilemap, 0, 0); + state->m_bg_top_tilemap->draw(bitmap, cliprect, 0, 0); - if (state->m_spr1_ctrlram[7] & 1) /* display in top monitor */ - armwrest_draw_big_sprite(screen->machine(), bitmap, cliprect, 0); - } - else if (screen == bottom_screen) - { - punchout_copy_bot_palette(screen->machine(), BIT(*state->m_palettebank,0)); + if (state->m_spr1_ctrlram[7] & 1) /* display in top monitor */ + armwrest_draw_big_sprite(screen.machine(), bitmap, cliprect, 0); + + return 0; +} - tilemap_draw(bitmap, cliprect, state->m_bg_bot_tilemap, 0, 0); +SCREEN_UPDATE_IND16( armwrest_bottom ) +{ + punchout_state *state = screen.machine().driver_data(); - if (state->m_spr1_ctrlram[7] & 2) /* display in bottom monitor */ - armwrest_draw_big_sprite(screen->machine(), bitmap, cliprect, 1); - drawbs2(screen->machine(), bitmap, cliprect); + punchout_copy_bot_palette(screen.machine(), BIT(*state->m_palettebank,0)); + + state->m_bg_bot_tilemap->draw(bitmap, cliprect, 0, 0); + + if (state->m_spr1_ctrlram[7] & 2) /* display in bottom monitor */ + armwrest_draw_big_sprite(screen.machine(), bitmap, cliprect, 1); + drawbs2(screen.machine(), bitmap, cliprect); + + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - } return 0; } diff -Nru mame-0.144/src/mame/video/pushman.c mame-0.145/src/mame/video/pushman.c --- mame-0.144/src/mame/video/pushman.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/pushman.c 2012-02-06 21:30:31.000000000 +0000 @@ -53,7 +53,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_back_tile_info, background_scan_rows, 32, 32, 128, 64); state->m_tx_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); + state->m_tx_tilemap->set_transparent_pen(3); } @@ -74,7 +74,7 @@ { pushman_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } @@ -85,7 +85,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { pushman_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -120,16 +120,16 @@ } } -SCREEN_UPDATE( pushman ) +SCREEN_UPDATE_IND16( pushman ) { - pushman_state *state = screen->machine().driver_data(); + pushman_state *state = screen.machine().driver_data(); /* Setup the tilemaps */ - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_control[0]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 0xf00 - state->m_control[1]); + state->m_bg_tilemap->set_scrollx(0, state->m_control[0]); + state->m_bg_tilemap->set_scrolly(0, 0xf00 - state->m_control[1]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/qdrmfgp.c mame-0.145/src/mame/video/qdrmfgp.c --- mame-0.144/src/mame/video/qdrmfgp.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/qdrmfgp.c 2012-02-06 21:30:31.000000000 +0000 @@ -57,10 +57,10 @@ ***************************************************************************/ -SCREEN_UPDATE( qdrmfgp ) +SCREEN_UPDATE_IND16( qdrmfgp ) { - device_t *k056832 = screen->machine().device("k056832"); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + device_t *k056832 = screen.machine().device("k056832"); + bitmap.fill(get_black_pen(screen.machine()), cliprect); k056832_tilemap_draw(k056832, bitmap, cliprect, 3, 0, 1); k056832_tilemap_draw(k056832, bitmap, cliprect, 2, 0, 2); diff -Nru mame-0.144/src/mame/video/qix.c mame-0.145/src/mame/video/qix.c --- mame-0.144/src/mame/video/qix.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/qix.c 2012-02-06 21:30:31.000000000 +0000 @@ -323,7 +323,7 @@ static MC6845_UPDATE_ROW( update_row ) { qix_state *state = device->machine().driver_data(); - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); UINT16 x; pen_t *pens = (pen_t *)param; @@ -340,22 +340,6 @@ /************************************* * - * Standard video update - * - *************************************/ - -static SCREEN_UPDATE( qix ) -{ - mc6845_device *mc6845 = screen->machine().device(MC6845_TAG); - mc6845->update(bitmap, cliprect); - - return 0; -} - - - -/************************************* - * * Memory handlers * *************************************/ @@ -452,9 +436,8 @@ MCFG_MC6845_ADD(MC6845_TAG, MC6845, QIX_CHARACTER_CLOCK, mc6845_intf) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_RAW_PARAMS(QIX_CHARACTER_CLOCK*8, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */ - MCFG_SCREEN_UPDATE(qix) + MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/quasar.c mame-0.145/src/mame/video/quasar.c --- mame-0.144/src/mame/video/quasar.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/quasar.c 2012-02-06 21:30:32.000000000 +0000 @@ -96,18 +96,17 @@ state->m_effectram = auto_alloc_array(machine, UINT8, 0x400); /* create helper bitmap */ - state->m_collision_background = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_collision_background); /* register save */ - state->save_item(NAME(*state->m_collision_background)); + state->save_item(NAME(state->m_collision_background)); state->save_pointer(NAME(state->m_effectram), 0x400); } -SCREEN_UPDATE( quasar ) +SCREEN_UPDATE_IND16( quasar ) { - quasar_state *state = screen->machine().driver_data(); + quasar_state *state = screen.machine().driver_data(); int offs; - bitmap_t *s2636_0_bitmap, *s2636_1_bitmap, *s2636_2_bitmap; /* for every character in the video RAM */ for (offs = 0; offs < 0x0400; offs++) @@ -124,10 +123,10 @@ for (ox = 0; ox < 8; ox++) for (oy = 0; oy < 8; oy++) - *BITMAP_ADDR16(bitmap, y + oy, x + ox) = forecolor; + bitmap.pix16(y + oy, x + ox) = forecolor; /* Main Screen */ - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, state->m_color_ram[offs] & 0x3f, 0,0, @@ -137,7 +136,7 @@ /* background for Collision Detection (it can only hit certain items) */ if((state->m_color_ram[offs] & 7) == 0) { - drawgfx_opaque(state->m_collision_background,cliprect,screen->machine().gfx[0], + drawgfx_opaque(state->m_collision_background,cliprect,screen.machine().gfx[0], code, 64, 0,0, @@ -146,9 +145,9 @@ } /* update the S2636 chips */ - s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); - s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); - s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); + bitmap_ind16 &s2636_0_bitmap = s2636_update(state->m_s2636_0, cliprect); + bitmap_ind16 &s2636_1_bitmap = s2636_update(state->m_s2636_1, cliprect); + bitmap_ind16 &s2636_2_bitmap = s2636_update(state->m_s2636_2, cliprect); /* Bullet Hardware */ for (offs = 8; offs < 256; offs++ ) @@ -161,10 +160,10 @@ int bx = 255 - 9 - state->m_bullet_ram[offs] - ct; /* bullet/object Collision */ - if (*BITMAP_ADDR16(s2636_0_bitmap, offs, bx) != 0) state->m_collision_register |= 0x04; - if (*BITMAP_ADDR16(s2636_2_bitmap, offs, bx) != 0) state->m_collision_register |= 0x08; + if (s2636_0_bitmap.pix16(offs, bx) != 0) state->m_collision_register |= 0x04; + if (s2636_2_bitmap.pix16(offs, bx) != 0) state->m_collision_register |= 0x08; - *BITMAP_ADDR16(bitmap, offs, bx) = 7; + bitmap.pix16(offs, bx) = 7; } } } @@ -174,24 +173,24 @@ { int y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - int pixel0 = *BITMAP_ADDR16(s2636_0_bitmap, y, x); - int pixel1 = *BITMAP_ADDR16(s2636_1_bitmap, y, x); - int pixel2 = *BITMAP_ADDR16(s2636_2_bitmap, y, x); + int pixel0 = s2636_0_bitmap.pix16(y, x); + int pixel1 = s2636_1_bitmap.pix16(y, x); + int pixel2 = s2636_2_bitmap.pix16(y, x); int pixel = pixel0 | pixel1 | pixel2; if (S2636_IS_PIXEL_DRAWN(pixel)) { - *BITMAP_ADDR16(bitmap, y, x) = S2636_PIXEL_COLOR(pixel); + bitmap.pix16(y, x) = S2636_PIXEL_COLOR(pixel); /* S2636 vs. background collision detection */ - if (colortable_entry_get_value(screen->machine().colortable, *BITMAP_ADDR16(state->m_collision_background, y, x))) + if (colortable_entry_get_value(screen.machine().colortable, state->m_collision_background.pix16(y, x))) { if (S2636_IS_PIXEL_DRAWN(pixel0)) state->m_collision_register |= 0x01; if (S2636_IS_PIXEL_DRAWN(pixel2)) state->m_collision_register |= 0x02; diff -Nru mame-0.144/src/mame/video/quizdna.c mame-0.145/src/mame/video/quizdna.c --- mame-0.144/src/mame/video/quizdna.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/quizdna.c 2012-02-06 21:30:32.000000000 +0000 @@ -60,7 +60,7 @@ state->m_bg_tilemap = tilemap_create( machine, get_bg_tile_info,tilemap_scan_rows,8,8,64,32 ); state->m_fg_tilemap = tilemap_create( machine, get_fg_tile_info,tilemap_scan_rows,16,8,32,32 ); - tilemap_set_transparent_pen( state->m_fg_tilemap,0 ); + state->m_fg_tilemap->set_transparent_pen(0 ); } WRITE8_HANDLER( quizdna_bg_ram_w ) @@ -70,7 +70,7 @@ state->m_bg_ram[offset] = data; RAM[0x12000+offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, (offset & 0xfff) / 2 ); + state->m_bg_tilemap->mark_tile_dirty((offset & 0xfff) / 2 ); } WRITE8_HANDLER( quizdna_fg_ram_w ) @@ -85,13 +85,13 @@ state->m_fg_ram[offs] = data; for (i=0; i<32; i++) - tilemap_mark_tile_dirty(state->m_fg_tilemap, ((offs/2) & 0x1f) + i*0x20 ); + state->m_fg_tilemap->mark_tile_dirty(((offs/2) & 0x1f) + i*0x20 ); } WRITE8_HANDLER( quizdna_bg_yscroll_w ) { quizdna_state *state = space->machine().driver_data(); - tilemap_set_scrolldy( state->m_bg_tilemap, 255-data, 255-data+1 ); + state->m_bg_tilemap->set_scrolldy(255-data, 255-data+1 ); } WRITE8_HANDLER( quizdna_bg_xscroll_w ) @@ -101,7 +101,7 @@ state->m_bg_xscroll[offset] = data; x = ~(state->m_bg_xscroll[0] + state->m_bg_xscroll[1]*0x100) & 0x1ff; - tilemap_set_scrolldx( state->m_bg_tilemap, x+64, x-64+10 ); + state->m_bg_tilemap->set_scrolldx(x+64, x-64+10 ); } WRITE8_HANDLER( quizdna_screen_ctrl_w ) @@ -118,7 +118,7 @@ state->m_flipscreen = tmp; flip_screen_set(space->machine(), tmp); - tilemap_set_scrolldx( state->m_fg_tilemap, 64, -64 +16); + state->m_fg_tilemap->set_scrolldx(64, -64 +16); } WRITE8_HANDLER( paletteram_xBGR_RRRR_GGGG_BBBB_w ) @@ -138,7 +138,7 @@ palette_set_color_rgb(space->machine(),offs/2,pal5bit(r),pal5bit(g),pal5bit(b)); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { quizdna_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -192,16 +192,16 @@ } } -SCREEN_UPDATE( quizdna ) +SCREEN_UPDATE_IND16( quizdna ) { - quizdna_state *state = screen->machine().driver_data(); + quizdna_state *state = screen.machine().driver_data(); if (state->m_video_enable) { - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/quizpani.c mame-0.145/src/mame/video/quizpani.c --- mame-0.144/src/mame/video/quizpani.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/quizpani.c 2012-02-06 21:30:32.000000000 +0000 @@ -42,14 +42,14 @@ { quizpani_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( quizpani_txt_videoram_w ) { quizpani_state *state = space->machine().driver_data(); state->m_txt_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_txt_tilemap, offset); + state->m_txt_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( quizpani_tilesbank_w ) @@ -60,13 +60,13 @@ if(state->m_txtbank != (data & 0x30)>>4) { state->m_txtbank = (data & 0x30)>>4; - tilemap_mark_all_tiles_dirty(state->m_txt_tilemap); + state->m_txt_tilemap->mark_all_dirty(); } if(state->m_bgbank != (data & 3)) { state->m_bgbank = data & 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } } @@ -76,18 +76,18 @@ quizpani_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, bg_tile_info, bg_scan,16,16,256,32); state->m_txt_tilemap = tilemap_create(machine, txt_tile_info,bg_scan,16,16,256,32); - tilemap_set_transparent_pen(state->m_txt_tilemap,15); + state->m_txt_tilemap->set_transparent_pen(15); } -SCREEN_UPDATE( quizpani ) +SCREEN_UPDATE_IND16( quizpani ) { - quizpani_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollreg[0] - 64); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrollreg[1] + 16); - tilemap_set_scrollx(state->m_txt_tilemap, 0, state->m_scrollreg[2] - 64); - tilemap_set_scrolly(state->m_txt_tilemap, 0, state->m_scrollreg[3] + 16); + quizpani_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollreg[0] - 64); + state->m_bg_tilemap->set_scrolly(0, state->m_scrollreg[1] + 16); + state->m_txt_tilemap->set_scrollx(0, state->m_scrollreg[2] - 64); + state->m_txt_tilemap->set_scrolly(0, state->m_scrollreg[3] + 16); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_txt_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_txt_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/raiden.c mame-0.145/src/mame/video/raiden.c --- mame-0.144/src/mame/video/raiden.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/raiden.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,14 +8,14 @@ { raiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_back_data[offset]); - tilemap_mark_tile_dirty(state->m_bg_layer, offset); + state->m_bg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( raiden_foreground_w ) { raiden_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fore_data[offset]); - tilemap_mark_tile_dirty(state->m_fg_layer, offset); + state->m_fg_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( raiden_text_w ) @@ -23,7 +23,7 @@ raiden_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_layer, offset); + state->m_tx_layer->mark_tile_dirty(offset); } static TILE_GET_INFO( get_back_tile_info ) @@ -79,8 +79,8 @@ state->m_tx_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_cols,8,8,32,32); state->m_alternate=0; - tilemap_set_transparent_pen(state->m_fg_layer,15); - tilemap_set_transparent_pen(state->m_tx_layer,15); + state->m_fg_layer->set_transparent_pen(15); + state->m_tx_layer->set_transparent_pen(15); } VIDEO_START( raidena ) @@ -91,8 +91,8 @@ state->m_tx_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows,8,8,32,32); state->m_alternate=1; - tilemap_set_transparent_pen(state->m_fg_layer,15); - tilemap_set_transparent_pen(state->m_tx_layer,15); + state->m_fg_layer->set_transparent_pen(15); + state->m_tx_layer->set_transparent_pen(15); } WRITE16_HANDLER( raiden_control_w ) @@ -103,7 +103,7 @@ /* Flipscreen */ if (offset==3 && ACCESSING_BITS_0_7) { state->m_flipscreen=data&0x2; - tilemap_set_flip_all(space->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } } @@ -115,11 +115,11 @@ /* Flipscreen */ if (offset==3 && ACCESSING_BITS_0_7) { state->m_flipscreen=data&0x40; - tilemap_set_flip_all(space->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int pri_mask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int pri_mask) { raiden_state *state = machine.driver_data(); UINT16 *buffered_spriteram16 = machine.generic.buffered_spriteram.u16; @@ -153,33 +153,33 @@ } } -SCREEN_UPDATE( raiden ) +SCREEN_UPDATE_IND16( raiden ) { - raiden_state *state = screen->machine().driver_data(); + raiden_state *state = screen.machine().driver_data(); /* Setup the tilemaps, alternate version has different scroll positions */ if (!state->m_alternate) { - tilemap_set_scrollx( state->m_bg_layer,0, state->m_scroll_ram[0]); - tilemap_set_scrolly( state->m_bg_layer,0, state->m_scroll_ram[1]); - tilemap_set_scrollx( state->m_fg_layer,0, state->m_scroll_ram[2]); - tilemap_set_scrolly( state->m_fg_layer,0, state->m_scroll_ram[3]); + state->m_bg_layer->set_scrollx(0, state->m_scroll_ram[0]); + state->m_bg_layer->set_scrolly(0, state->m_scroll_ram[1]); + state->m_fg_layer->set_scrollx(0, state->m_scroll_ram[2]); + state->m_fg_layer->set_scrolly(0, state->m_scroll_ram[3]); } else { - tilemap_set_scrolly( state->m_bg_layer,0, ((state->m_scroll_ram[0x01]&0x30)<<4)+((state->m_scroll_ram[0x02]&0x7f)<<1)+((state->m_scroll_ram[0x02]&0x80)>>7) ); - tilemap_set_scrollx( state->m_bg_layer,0, ((state->m_scroll_ram[0x09]&0x30)<<4)+((state->m_scroll_ram[0x0a]&0x7f)<<1)+((state->m_scroll_ram[0x0a]&0x80)>>7) ); - tilemap_set_scrolly( state->m_fg_layer,0, ((state->m_scroll_ram[0x11]&0x30)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); - tilemap_set_scrollx( state->m_fg_layer,0, ((state->m_scroll_ram[0x19]&0x30)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); + state->m_bg_layer->set_scrolly(0, ((state->m_scroll_ram[0x01]&0x30)<<4)+((state->m_scroll_ram[0x02]&0x7f)<<1)+((state->m_scroll_ram[0x02]&0x80)>>7) ); + state->m_bg_layer->set_scrollx(0, ((state->m_scroll_ram[0x09]&0x30)<<4)+((state->m_scroll_ram[0x0a]&0x7f)<<1)+((state->m_scroll_ram[0x0a]&0x80)>>7) ); + state->m_fg_layer->set_scrolly(0, ((state->m_scroll_ram[0x11]&0x30)<<4)+((state->m_scroll_ram[0x12]&0x7f)<<1)+((state->m_scroll_ram[0x12]&0x80)>>7) ); + state->m_fg_layer->set_scrollx(0, ((state->m_scroll_ram[0x19]&0x30)<<4)+((state->m_scroll_ram[0x1a]&0x7f)<<1)+((state->m_scroll_ram[0x1a]&0x80)>>7) ); } - tilemap_draw(bitmap,cliprect,state->m_bg_layer,0,0); + state->m_bg_layer->draw(bitmap, cliprect, 0,0); /* Draw sprites underneath foreground */ - draw_sprites(screen->machine(),bitmap,cliprect,0x40); - tilemap_draw(bitmap,cliprect,state->m_fg_layer,0,0); + draw_sprites(screen.machine(),bitmap,cliprect,0x40); + state->m_fg_layer->draw(bitmap, cliprect, 0,0); /* Rest of sprites */ - draw_sprites(screen->machine(),bitmap,cliprect,0x80); + draw_sprites(screen.machine(),bitmap,cliprect,0x80); /* Text layer */ - tilemap_draw(bitmap,cliprect,state->m_tx_layer,0,0); + state->m_tx_layer->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/rainbow.c mame-0.145/src/mame/video/rainbow.c --- mame-0.144/src/mame/video/rainbow.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rainbow.c 2012-02-06 21:30:33.000000000 +0000 @@ -12,9 +12,9 @@ /***************************************************************************/ -WRITE16_HANDLER( rainbow_spritectrl_w ) +WRITE16_HANDLER( rbisland_spritectrl_w ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); if (offset == 0) { @@ -28,7 +28,7 @@ WRITE16_HANDLER( jumping_spritectrl_w ) { - rainbow_state *state = space->machine().driver_data(); + rbisland_state *state = space->machine().driver_data(); if (offset == 0) { @@ -42,9 +42,9 @@ /***************************************************************************/ -SCREEN_UPDATE( rainbow ) +SCREEN_UPDATE_IND16( rainbow ) { - rainbow_state *state = screen->machine().driver_data(); + rbisland_state *state = screen.machine().driver_data(); int layer[2]; pc080sn_tilemap_update(state->m_pc080sn); @@ -52,7 +52,7 @@ layer[0] = 0; layer[1] = 1; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[1], 0, 2); @@ -65,7 +65,7 @@ /*************************************************************************** Jumping uses different sprite controller -than rainbow island. - values are remapped +than Rainbow Island. - values are remapped at address 0x2EA in the code. Apart from physical layout, the main change is that the Y settings are active low. @@ -74,7 +74,7 @@ VIDEO_START( jumping ) { - rainbow_state *state = machine.driver_data(); + rbisland_state *state = machine.driver_data(); pc080sn_set_trans_pen(state->m_pc080sn, 1, 15); @@ -87,9 +87,9 @@ } -SCREEN_UPDATE( jumping ) +SCREEN_UPDATE_IND16( jumping ) { - rainbow_state *state = screen->machine().driver_data(); + rbisland_state *state = screen.machine().driver_data(); UINT16 *spriteram = state->m_spriteram; int offs, layer[2]; int sprite_colbank = (state->m_sprite_ctrl & 0xe0) >> 1; @@ -102,7 +102,7 @@ layer[0] = 0; layer[1] = 1; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); @@ -110,7 +110,7 @@ for (offs = state->m_spriteram_size / 2 - 8; offs >= 0; offs -= 8) { int tile = spriteram[offs]; - if (tile < screen->machine().gfx[1]->total_elements) + if (tile < screen.machine().gfx[1]->total_elements) { int sx,sy,color,data1; @@ -122,7 +122,7 @@ data1 = spriteram[offs + 3]; color = (spriteram[offs + 4] & 0x0f) | sprite_colbank; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], tile, color, data1 & 0x40, data1 & 0x80, diff -Nru mame-0.144/src/mame/video/rallyx.c mame-0.145/src/mame/video/rallyx.c --- mame-0.144/src/mame/video/rallyx.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rallyx.c 2012-02-06 21:30:32.000000000 +0000 @@ -220,11 +220,11 @@ } -INLINE void rallyx_get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int ram_offs) +INLINE void rallyx_get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int ram_offs) { rallyx_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[ram_offs + tile_index + 0x800]; - tileinfo->category = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; SET_TILE_INFO( 0, state->m_videoram[ram_offs + tile_index], @@ -243,13 +243,13 @@ } -INLINE void locomotn_get_tile_info(running_machine &machine,tile_data *tileinfo,int tile_index,int ram_offs) +INLINE void locomotn_get_tile_info(running_machine &machine,tile_data &tileinfo,int tile_index,int ram_offs) { rallyx_state *state = machine.driver_data(); UINT8 attr = state->m_videoram[ram_offs + tile_index + 0x800]; int code = state->m_videoram[ram_offs + tile_index]; code = (code & 0x7f) + 2 * (attr & 0x40) + 2 * (code & 0x80); - tileinfo->category = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; SET_TILE_INFO( 0, code, @@ -345,7 +345,7 @@ state->m_fg_tilemap = tilemap_create(machine, rallyx_fg_get_tile_info, fg_tilemap_scan, 8, 8, 8, 32); /* the scrolling tilemap is slightly misplaced in Rally X */ - tilemap_set_scrolldx(state->m_bg_tilemap, 3, 3); + state->m_bg_tilemap->set_scrolldx(3, 3); state->m_spriteram_base = 0x14; @@ -377,8 +377,8 @@ /* handle reduced visible area in some games */ if (machine.primary_screen->visible_area().max_x == 32 * 8 - 1) { - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 32); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, 32); + state->m_bg_tilemap->set_scrolldx(0, 32); + state->m_fg_tilemap->set_scrolldx(0, 32); } state->m_spriteram_base = 0x14; @@ -398,8 +398,8 @@ /* handle reduced visible area in some games */ if (machine.primary_screen->visible_area().max_x == 32 * 8 - 1) { - tilemap_set_scrolldx(state->m_bg_tilemap, 0, 32); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, 32); + state->m_bg_tilemap->set_scrolldx(0, 32); + state->m_fg_tilemap->set_scrolldx(0, 32); } /* commsega has more sprites and bullets than the other games */ @@ -422,21 +422,21 @@ state->m_videoram[offset] = data; if (offset & 0x400) - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( rallyx_scrollx_w ) { rallyx_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( rallyx_scrolly_w ) { rallyx_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( tactcian_starson_w ) @@ -446,10 +446,9 @@ } -static void plot_star( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int x, int y, int color ) +static void plot_star( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, int color ) { - if (y < cliprect->min_y || y > cliprect->max_y || - x < cliprect->min_x || x > cliprect->max_x) + if (!cliprect.contains(x, y)) return; if (flip_screen_x_get(machine)) @@ -458,11 +457,11 @@ if (flip_screen_y_get(machine)) y = 255 - y; - if (colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(bitmap, y, x) % 0x144) == 0) - *BITMAP_ADDR16(bitmap, y, x) = STARS_COLOR_BASE + color; + if (colortable_entry_get_value(machine.colortable, bitmap.pix16(y, x) % 0x144) == 0) + bitmap.pix16(y, x) = STARS_COLOR_BASE + color; } -static void draw_stars( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_stars( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { rallyx_state *state = machine.driver_data(); int offs; @@ -478,7 +477,7 @@ } -static void rallyx_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int displacement ) +static void rallyx_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int displacement ) { rallyx_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -505,7 +504,7 @@ } } -static void locomotn_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int displacement ) +static void locomotn_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int displacement ) { rallyx_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -529,7 +528,7 @@ } } -static void rallyx_draw_bullets( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int transpen ) +static void rallyx_draw_bullets( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int transpen ) { rallyx_state *state = machine.driver_data(); int offs; @@ -560,7 +559,7 @@ } } -static void jungler_draw_bullets( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int transpen ) +static void jungler_draw_bullets( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int transpen ) { rallyx_state *state = machine.driver_data(); int offs; @@ -589,7 +588,7 @@ } } -static void locomotn_draw_bullets( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int transpen ) +static void locomotn_draw_bullets( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int transpen ) { rallyx_state *state = machine.driver_data(); int offs; @@ -627,15 +626,15 @@ } -SCREEN_UPDATE( rallyx ) +SCREEN_UPDATE_IND16( rallyx ) { - rallyx_state *state = screen->machine().driver_data(); + rallyx_state *state = screen.machine().driver_data(); /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across the screen, and clip it to only the position where it is supposed to be shown */ - rectangle fg_clip = *cliprect; - rectangle bg_clip = *cliprect; + rectangle fg_clip = cliprect; + rectangle bg_clip = cliprect; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { bg_clip.min_x = 8 * 8; fg_clip.max_x = 8 * 8 - 1; @@ -646,30 +645,30 @@ fg_clip.min_x = 28 * 8; } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, &bg_clip, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, &fg_clip, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, &bg_clip, state->m_bg_tilemap, 1, 1); - tilemap_draw(bitmap, &fg_clip, state->m_fg_tilemap, 1, 1); - - rallyx_draw_bullets(screen->machine(), bitmap, cliprect, TRUE); - rallyx_draw_sprites(screen->machine(), bitmap, cliprect, 1); - rallyx_draw_bullets(screen->machine(), bitmap, cliprect, FALSE); + state->m_bg_tilemap->draw(bitmap, bg_clip, 0, 0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 0, 0); + state->m_bg_tilemap->draw(bitmap, bg_clip, 1, 1); + state->m_fg_tilemap->draw(bitmap, fg_clip, 1, 1); + + rallyx_draw_bullets(screen.machine(), bitmap, cliprect, TRUE); + rallyx_draw_sprites(screen.machine(), bitmap, cliprect, 1); + rallyx_draw_bullets(screen.machine(), bitmap, cliprect, FALSE); return 0; } -SCREEN_UPDATE( jungler ) +SCREEN_UPDATE_IND16( jungler ) { - rallyx_state *state = screen->machine().driver_data(); + rallyx_state *state = screen.machine().driver_data(); /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across the screen, and clip it to only the position where it is supposed to be shown */ - rectangle fg_clip = *cliprect; - rectangle bg_clip = *cliprect; + rectangle fg_clip = cliprect; + rectangle bg_clip = cliprect; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { bg_clip.min_x = 8 * 8; fg_clip.max_x = 8 * 8 - 1; @@ -680,37 +679,37 @@ fg_clip.min_x = 28 * 8; } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* tile priority doesn't seem to be supported in Jungler */ - tilemap_draw(bitmap,&bg_clip, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap,&fg_clip, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap,&bg_clip, state->m_bg_tilemap, 1, 0); - tilemap_draw(bitmap,&fg_clip, state->m_fg_tilemap, 1, 0); - - jungler_draw_bullets(screen->machine(), bitmap, cliprect, TRUE); - rallyx_draw_sprites(screen->machine(), bitmap, cliprect, 0); - jungler_draw_bullets(screen->machine(), bitmap, cliprect, FALSE); + state->m_bg_tilemap->draw(bitmap, bg_clip, 0, 0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 0, 0); + state->m_bg_tilemap->draw(bitmap, bg_clip, 1, 0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 1, 0); + + jungler_draw_bullets(screen.machine(), bitmap, cliprect, TRUE); + rallyx_draw_sprites(screen.machine(), bitmap, cliprect, 0); + jungler_draw_bullets(screen.machine(), bitmap, cliprect, FALSE); if (state->m_stars_enable) - draw_stars(screen->machine(), bitmap, cliprect); + draw_stars(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( locomotn ) +SCREEN_UPDATE_IND16( locomotn ) { - rallyx_state *state = screen->machine().driver_data(); + rallyx_state *state = screen.machine().driver_data(); /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across the screen, and clip it to only the position where it is supposed to be shown */ - rectangle fg_clip = *cliprect; - rectangle bg_clip = *cliprect; + rectangle fg_clip = cliprect; + rectangle bg_clip = cliprect; - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { /* handle reduced visible area in some games */ - if (screen->visible_area().max_x == 32 * 8 - 1) + if (screen.visible_area().max_x == 32 * 8 - 1) { bg_clip.min_x = 4 * 8; fg_clip.max_x = 4 * 8 - 1; @@ -727,19 +726,19 @@ fg_clip.min_x = 28 * 8; } - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, &bg_clip, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, &fg_clip, state->m_fg_tilemap, 0, 0); - tilemap_draw(bitmap, &bg_clip, state->m_bg_tilemap, 1, 1); - tilemap_draw(bitmap, &fg_clip, state->m_fg_tilemap, 1, 1); - - locomotn_draw_bullets(screen->machine(), bitmap, cliprect, TRUE); - locomotn_draw_sprites(screen->machine(), bitmap, cliprect, 0); - locomotn_draw_bullets(screen->machine(), bitmap, cliprect, FALSE); + state->m_bg_tilemap->draw(bitmap, bg_clip, 0, 0); + state->m_fg_tilemap->draw(bitmap, fg_clip, 0, 0); + state->m_bg_tilemap->draw(bitmap, bg_clip, 1, 1); + state->m_fg_tilemap->draw(bitmap, fg_clip, 1, 1); + + locomotn_draw_bullets(screen.machine(), bitmap, cliprect, TRUE); + locomotn_draw_sprites(screen.machine(), bitmap, cliprect, 0); + locomotn_draw_bullets(screen.machine(), bitmap, cliprect, FALSE); if (state->m_stars_enable) - draw_stars(screen->machine(), bitmap, cliprect); + draw_stars(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/rampart.c mame-0.145/src/mame/video/rampart.c --- mame-0.144/src/mame/video/rampart.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rampart.c 2012-02-06 21:30:32.000000000 +0000 @@ -10,7 +10,7 @@ #include "includes/rampart.h" -static void rampart_bitmap_render(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +static void rampart_bitmap_render(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect); /************************************* * @@ -72,22 +72,22 @@ * *************************************/ -SCREEN_UPDATE( rampart ) +SCREEN_UPDATE_IND16( rampart ) { atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - rampart_bitmap_render(screen->machine(), bitmap, cliprect); + rampart_bitmap_render(screen.machine(), bitmap, cliprect); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -109,19 +109,19 @@ * *************************************/ -static void rampart_bitmap_render(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void rampart_bitmap_render(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { rampart_state *state = machine.driver_data(); int x, y; /* update any dirty scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { const UINT16 *src = &state->m_bitmap[256 * y]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); /* regenerate the line */ - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { int bits = src[(x - 8) / 2]; dst[x + 0] = bits >> 8; diff -Nru mame-0.144/src/mame/video/rastan.c mame-0.145/src/mame/video/rastan.c --- mame-0.144/src/mame/video/rastan.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rastan.c 2012-02-06 21:30:32.000000000 +0000 @@ -31,9 +31,9 @@ /***************************************************************************/ -SCREEN_UPDATE( rastan ) +SCREEN_UPDATE_IND16( rastan ) { - rastan_state *state = screen->machine().driver_data(); + rastan_state *state = screen.machine().driver_data(); int layer[2]; pc080sn_tilemap_update(state->m_pc080sn); @@ -41,7 +41,7 @@ layer[0] = 0; layer[1] = 1; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); pc080sn_tilemap_draw(state->m_pc080sn, bitmap, cliprect, layer[1], 0, 2); diff -Nru mame-0.144/src/mame/video/rdpblend.c mame-0.145/src/mame/video/rdpblend.c --- mame-0.144/src/mame/video/rdpblend.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdpblend.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,95 +8,94 @@ namespace RDP { -bool Blender::Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel) +bool BlenderT::Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel) { - ColorInputs* ci = m_rdp->GetColorInputs(); INT32 r, g, b; - if (!m_other_modes->alpha_cvg_select) + if (!m_rdp->OtherModes.alpha_cvg_select) { - DitherA(&m_rdp->GetPixelColor()->i.a, adseed); + DitherA(&m_rdp->PixelColor.i.a, adseed); } - DitherA(&m_rdp->GetShadeColor()->i.a, adseed); + DitherA(&m_rdp->ShadeColor.i.a, adseed); - if (!AlphaCompare(m_rdp->GetPixelColor()->i.a)) + if (!AlphaCompare(m_rdp->PixelColor.i.a)) { return false; } - if (m_other_modes->antialias_en ? (!m_misc_state->m_curpixel_cvg) : (!m_misc_state->m_curpixel_cvbit)) + if (m_rdp->OtherModes.antialias_en ? (!m_rdp->MiscState.CurrentPixCvg) : (!m_rdp->MiscState.CurrentCvgBit)) { return false; } - bool dontblend = (partialreject && m_rdp->GetPixelColor()->i.a >= 0xff); - if (!m_blend_enable || dontblend) + bool dontblend = (partialreject && m_rdp->PixelColor.i.a >= 0xff); + if (!BlendEnable || dontblend) { - r = *ci->blender1a_r[0]; - g = *ci->blender1a_g[0]; - b = *ci->blender1a_b[0]; + r = *m_rdp->ColorInputs.blender1a_r[0]; + g = *m_rdp->ColorInputs.blender1a_g[0]; + b = *m_rdp->ColorInputs.blender1a_b[0]; } else { - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[0]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[0]; BlendEquationCycle0(&r, &g, &b, special_bsel); } - if (m_other_modes->rgb_dither_sel < 3) + if (m_rdp->OtherModes.rgb_dither_sel < 3) { DitherRGB(&r, &g, &b, dith); } *fr = r; *fg = g; *fb = b; + return true; } -bool Blender::Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel0, int special_bsel1) +bool BlenderT::Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel0, int special_bsel1) { - ColorInputs* ci = m_rdp->GetColorInputs(); - if (!m_other_modes->alpha_cvg_select) + if (!m_rdp->OtherModes.alpha_cvg_select) { - DitherA(&m_rdp->GetPixelColor()->i.a, adseed); + DitherA(&m_rdp->PixelColor.i.a, adseed); } - DitherA(&m_rdp->GetShadeColor()->i.a, adseed); + DitherA(&m_rdp->ShadeColor.i.a, adseed); - if (!AlphaCompare(m_rdp->GetPixelColor()->i.a)) + if (!AlphaCompare(m_rdp->PixelColor.i.a)) { return false; } - if (m_other_modes->antialias_en ? (!m_misc_state->m_curpixel_cvg) : (!m_misc_state->m_curpixel_cvbit)) + if (m_rdp->OtherModes.antialias_en ? (!m_rdp->MiscState.CurrentPixCvg) : (!m_rdp->MiscState.CurrentCvgBit)) { return false; } - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[0]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[0]; INT32 r, g, b; BlendEquationCycle0(&r, &g, &b, special_bsel0); - m_rdp->GetBlendedColor()->i.r = r; - m_rdp->GetBlendedColor()->i.g = g; - m_rdp->GetBlendedColor()->i.b = b; - m_rdp->GetBlendedColor()->i.a = m_rdp->GetPixelColor()->i.a; - - bool dontblend = (partialreject && m_rdp->GetPixelColor()->i.a >= 0xff); - if (!m_blend_enable || dontblend) - { - r = *ci->blender1a_r[1]; - g = *ci->blender1a_g[1]; - b = *ci->blender1a_b[1]; + m_rdp->BlendedPixelColor.i.r = r; + m_rdp->BlendedPixelColor.i.g = g; + m_rdp->BlendedPixelColor.i.b = b; + m_rdp->BlendedPixelColor.i.a = m_rdp->PixelColor.i.a; + + bool dontblend = (partialreject && m_rdp->PixelColor.i.a >= 0xff); + if (!BlendEnable || dontblend) + { + r = *m_rdp->ColorInputs.blender1a_r[1]; + g = *m_rdp->ColorInputs.blender1a_g[1]; + b = *m_rdp->ColorInputs.blender1a_b[1]; } else { - m_rdp->GetInvPixelColor()->i.a = 0xff - *ci->blender1b_a[1]; + m_rdp->InvPixelColor.i.a = 0xff - *m_rdp->ColorInputs.blender1b_a[1]; BlendEquationCycle1(&r, &g, &b, special_bsel1); } - if (m_other_modes->rgb_dither_sel < 3) + if (m_rdp->OtherModes.rgb_dither_sel < 3) { DitherRGB(&r, &g, &b, dith); } @@ -108,47 +107,46 @@ return true; } -void Blender::BlendEquationCycle0(int* r, int* g, int* b, int bsel_special) +void BlenderT::BlendEquationCycle0(int* r, int* g, int* b, int bsel_special) { - ColorInputs* ci = m_rdp->GetColorInputs(); - UINT8 blend1a = *ci->blender1b_a[0] >> 3; - UINT8 blend2a = *ci->blender2b_a[0] >> 3; + UINT8 blend1a = *m_rdp->ColorInputs.blender1b_a[0] >> 3; + UINT8 blend2a = *m_rdp->ColorInputs.blender2b_a[0] >> 3; if (bsel_special) { - blend1a = (blend1a >> m_shift_a) & 0x1C; - blend2a = (blend2a >> m_shift_b) & 0x1C; + blend1a = (blend1a >> ShiftA) & 0x1C; + blend2a = (blend2a >> ShiftB) & 0x1C; } UINT32 sum = ((blend1a >> 2) + (blend2a >> 2) + 1) & 0xf; - *r = (((int)(*ci->blender1a_r[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_r[0]) * (int)(blend2a))); + *r = (((int)(*m_rdp->ColorInputs.blender1a_r[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_r[0]) * (int)(blend2a))); - *g = (((int)(*ci->blender1a_g[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_g[0]) * (int)(blend2a))); + *g = (((int)(*m_rdp->ColorInputs.blender1a_g[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_g[0]) * (int)(blend2a))); - *b = (((int)(*ci->blender1a_b[0]) * (int)(blend1a))) + - (((int)(*ci->blender2a_b[0]) * (int)(blend2a))); + *b = (((int)(*m_rdp->ColorInputs.blender1a_b[0]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_b[0]) * (int)(blend2a))); if (bsel_special) { - *r += (((int)*ci->blender2a_r[0]) << 2); - *g += (((int)*ci->blender2a_g[0]) << 2); - *b += (((int)*ci->blender2a_b[0]) << 2); + *r += (((int)*m_rdp->ColorInputs.blender2a_r[0]) << 2); + *g += (((int)*m_rdp->ColorInputs.blender2a_g[0]) << 2); + *b += (((int)*m_rdp->ColorInputs.blender2a_b[0]) << 2); } else { - *r += (int)*ci->blender2a_r[0]; - *g += (int)*ci->blender2a_g[0]; - *b += (int)*ci->blender2a_b[0]; + *r += (int)*m_rdp->ColorInputs.blender2a_r[0]; + *g += (int)*m_rdp->ColorInputs.blender2a_g[0]; + *b += (int)*m_rdp->ColorInputs.blender2a_b[0]; } *r >>= 2; *g >>= 2; *b >>= 2; - if (m_other_modes->force_blend) + if (m_rdp->OtherModes.force_blend) { *r >>= 3; *g >>= 3; @@ -173,47 +171,46 @@ if (*b > 255) *b = 255; } -void Blender::BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special) +void BlenderT::BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special) { - ColorInputs* ci = m_rdp->GetColorInputs(); - UINT8 blend1a = *ci->blender1b_a[1] >> 3; - UINT8 blend2a = *ci->blender2b_a[1] >> 3; + UINT8 blend1a = *m_rdp->ColorInputs.blender1b_a[1] >> 3; + UINT8 blend2a = *m_rdp->ColorInputs.blender2b_a[1] >> 3; if (bsel_special) { - blend1a = (blend1a >> m_shift_a) & 0x1C; - blend2a = (blend2a >> m_shift_b) & 0x1C; + blend1a = (blend1a >> ShiftA) & 0x1C; + blend2a = (blend2a >> ShiftB) & 0x1C; } UINT32 sum = ((blend1a >> 2) + (blend2a >> 2) + 1) & 0xf; - *r = (((int)(*ci->blender1a_r[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_r[1]) * (int)(blend2a))); + *r = (((int)(*m_rdp->ColorInputs.blender1a_r[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_r[1]) * (int)(blend2a))); - *g = (((int)(*ci->blender1a_g[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_g[1]) * (int)(blend2a))); + *g = (((int)(*m_rdp->ColorInputs.blender1a_g[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_g[1]) * (int)(blend2a))); - *b = (((int)(*ci->blender1a_b[1]) * (int)(blend1a))) + - (((int)(*ci->blender2a_b[1]) * (int)(blend2a))); + *b = (((int)(*m_rdp->ColorInputs.blender1a_b[1]) * (int)(blend1a))) + + (((int)(*m_rdp->ColorInputs.blender2a_b[1]) * (int)(blend2a))); if (bsel_special) { - *r += (((int)*ci->blender2a_r[1]) << 2); - *g += (((int)*ci->blender2a_g[1]) << 2); - *b += (((int)*ci->blender2a_b[1]) << 2); + *r += (((int)*m_rdp->ColorInputs.blender2a_r[1]) << 2); + *g += (((int)*m_rdp->ColorInputs.blender2a_g[1]) << 2); + *b += (((int)*m_rdp->ColorInputs.blender2a_b[1]) << 2); } else { - *r += (int)*ci->blender2a_r[1]; - *g += (int)*ci->blender2a_g[1]; - *b += (int)*ci->blender2a_b[1]; + *r += (int)*m_rdp->ColorInputs.blender2a_r[1]; + *g += (int)*m_rdp->ColorInputs.blender2a_g[1]; + *b += (int)*m_rdp->ColorInputs.blender2a_b[1]; } *r >>= 2; *g >>= 2; *b >>= 2; - if (m_other_modes->force_blend) + if (m_rdp->OtherModes.force_blend) { *r >>= 3; *g >>= 3; @@ -238,12 +235,12 @@ if (*b > 255) *b = 255; } -bool Blender::AlphaCompare(UINT8 alpha) +bool BlenderT::AlphaCompare(UINT8 alpha) { INT32 threshold; - if (m_other_modes->alpha_compare_en) + if (m_rdp->OtherModes.alpha_compare_en) { - threshold = (m_other_modes->dither_alpha_en) ? (machine().rand() & 0xff) : m_rdp->GetBlendColor()->i.a; + threshold = (m_rdp->OtherModes.dither_alpha_en) ? m_rdp->GetRandom() : m_rdp->BlendColor.i.a; if (alpha < threshold) { return false; @@ -253,7 +250,7 @@ return true; } -void Blender::DitherA(UINT8 *a, int dith) +void BlenderT::DitherA(UINT8 *a, int dith) { INT32 new_a = *a + dith; if(new_a & 0x100) @@ -263,7 +260,7 @@ *a = (UINT8)new_a; } -void Blender::DitherRGB(INT32 *r, INT32 *g, INT32 *b, int dith) +void BlenderT::DitherRGB(INT32 *r, INT32 *g, INT32 *b, int dith) { if ((*r & 7) > dith) { diff -Nru mame-0.144/src/mame/video/rdpblend.h mame-0.145/src/mame/video/rdpblend.h --- mame-0.144/src/mame/video/rdpblend.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdpblend.h 2012-02-06 21:30:32.000000000 +0000 @@ -9,45 +9,35 @@ namespace RDP { -class OtherModes; -class MiscState; +class OtherModesT; +class MiscStateT; class Processor; class Color; -class Blender +class BlenderT { public: - Blender() + BlenderT() { - m_blend_enable = false; + BlendEnable = false; } bool Blend2Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int bsel0, int bsel1); bool Blend1Cycle(UINT32* fr, UINT32* fg, UINT32* fb, int dith, int adseed, int partialreject, int special_bsel); - void SetOtherModes(OtherModes* other_modes) { m_other_modes = other_modes; } - void SetMiscState(MiscState* misc_state) { m_misc_state = misc_state; } void SetMachine(running_machine& machine) { m_machine = &machine; } void SetProcessor(Processor* rdp) { m_rdp = rdp; } - void SetBlendEnable(bool enable) { m_blend_enable = enable; } - bool GetBlendEnable() { return m_blend_enable; } - - void SetShiftA(INT32 shift) { m_shift_a = shift; } - void SetShiftB(INT32 shift) { m_shift_b = shift; } - running_machine &machine() const { assert(m_machine != NULL); return *m_machine; } + bool BlendEnable; + INT32 ShiftA; + INT32 ShiftB; + private: running_machine* m_machine; - OtherModes* m_other_modes; - MiscState* m_misc_state; Processor* m_rdp; - bool m_blend_enable; - INT32 m_shift_a; - INT32 m_shift_b; - void BlendEquationCycle0(INT32* r, INT32* g, INT32* b, int bsel_special); void BlendEquationCycle1(INT32* r, INT32* g, INT32* b, int bsel_special); diff -Nru mame-0.144/src/mame/video/rdpfb.c mame-0.145/src/mame/video/rdpfb.c --- mame-0.144/src/mame/video/rdpfb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rdpfb.c 2012-02-06 21:30:31.000000000 +0000 @@ -8,9 +8,9 @@ namespace RDP { -void Framebuffer::Write(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Write16Bit(curpixel, r, g, b); @@ -21,51 +21,51 @@ break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { #undef CVG_DRAW #ifdef CVG_DRAW - int covdraw = (curpixel_cvg - 1) << 5; + int covdraw = (CurrentPixCvg - 1) << 5; r = covdraw; g = covdraw; b = covdraw; #endif - UINT32 fb = (m_misc_state->m_fb_address >> 1) + curpixel; + UINT32 fb = (m_rdp->MiscState.FBAddress >> 1) + curpixel; UINT32 hb = fb; #if 0 - if (m_misc_state->m_curpixel_cvg > 8 && m_other_modes->z_mode != 1) + if (m_rdp->MiscState.CurrentPixCvg > 8 && m_rdp->OtherModes.z_mode != 1) { - stricterror("FBWRITE_16: curpixel_cvg %d", m_misc_state->m_curpixel_cvg); + stricterror("FBWRITE_16: CurrentPixCvg %d", m_rdp->MiscState.CurrentPixCvg); } #endif UINT16 finalcolor = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1); UINT32 finalcvg = 0; - if (m_other_modes->color_on_cvg && !m_pre_wrap) + if (m_rdp->OtherModes.color_on_cvg && !m_pre_wrap) { finalcolor = RREADIDX16(fb) & 0xfffe; } - switch(m_other_modes->cvg_dest) + switch(m_rdp->OtherModes.cvg_dest) { case 0: - if (!m_rdp->GetBlender()->GetBlendEnable()) + if (!m_rdp->Blender.BlendEnable) { - finalcvg = (m_misc_state->m_curpixel_cvg - 1) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg - 1) & 7; RWRITEIDX16(fb, finalcolor | ((finalcvg >> 2) & 1)); HWRITEADDR8(hb, finalcvg & 3); } else { - finalcvg = m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg; + finalcvg = m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg; if (finalcvg & 8) { finalcvg = 7; @@ -75,7 +75,7 @@ } break; case 1: - finalcvg = (m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg) & 7; RWRITEIDX16(fb, finalcolor | ((finalcvg >> 2) & 1)); HWRITEADDR8(hb, finalcvg & 3); break; @@ -84,42 +84,42 @@ HWRITEADDR8(hb, 3); break; case 3: - RWRITEIDX16(fb, finalcolor | ((m_misc_state->m_curpixel_memcvg >> 2) & 1)); - HWRITEADDR8(hb, m_misc_state->m_curpixel_memcvg & 3); + RWRITEIDX16(fb, finalcolor | ((m_rdp->MiscState.CurrentMemCvg >> 2) & 1)); + HWRITEADDR8(hb, m_rdp->MiscState.CurrentMemCvg & 3); break; } } -void Framebuffer::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Write32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT32 fb = (m_misc_state->m_fb_address >> 2) + curpixel; + UINT32 fb = (m_rdp->MiscState.FBAddress >> 2) + curpixel; UINT32 finalcolor = (r << 24) | (g << 16) | (b << 8);//cvg as 3 MSBs of alpha channel; UINT32 finalcvg = 0; #if 0 - if (curpixel_cvg > 8 && m_other_modes->z_mode != 1) + if (CurrentPixCvg > 8 && m_rdp->OtherModes.z_mode != 1) { - stricterror("FBWRITE_16: curpixel_cvg %d", curpixel_cvg); + stricterror("FBWRITE_16: CurrentPixCvg %d", CurrentPixCvg); } #endif - if (m_other_modes->color_on_cvg && !m_pre_wrap) + if (m_rdp->OtherModes.color_on_cvg && !m_pre_wrap) { finalcolor = RREADIDX32(fb) & 0xffffff00; } - switch(m_other_modes->cvg_dest) + switch(m_rdp->OtherModes.cvg_dest) { case 0: //normal - if (!m_rdp->GetBlender()->GetBlendEnable()) + if (!m_rdp->Blender.BlendEnable) { - finalcvg = (m_misc_state->m_curpixel_cvg - 1) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg - 1) & 7; finalcolor |= (finalcvg << 5); RWRITEIDX32(fb, finalcolor); } else { - finalcvg = m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg; + finalcvg = m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg; if (finalcvg & 8) { finalcvg = 7; @@ -129,7 +129,7 @@ } break; case 1: - finalcvg = (m_misc_state->m_curpixel_cvg + m_misc_state->m_curpixel_memcvg) & 7; + finalcvg = (m_rdp->MiscState.CurrentPixCvg + m_rdp->MiscState.CurrentMemCvg) & 7; finalcolor |= (finalcvg << 5); RWRITEIDX32(fb, finalcolor); break; @@ -137,15 +137,15 @@ RWRITEIDX32(fb, finalcolor | 0xE0); break; case 3: - finalcolor |= (m_misc_state->m_curpixel_memcvg << 5); + finalcolor |= (m_rdp->MiscState.CurrentMemCvg << 5); RWRITEIDX32(fb, finalcolor); break; } } -void Framebuffer::Read(UINT32 curpixel) +void FramebufferT::Read(UINT32 curpixel) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Read16Bit(curpixel); @@ -156,51 +156,51 @@ break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Read16Bit(UINT32 curpixel) +void FramebufferT::Read16Bit(UINT32 curpixel) { - UINT16 fword = RREADIDX16((m_misc_state->m_fb_address >> 1) + curpixel); - UINT8 hbyte = HREADADDR8((m_misc_state->m_fb_address >> 1) + curpixel); - m_rdp->GetMemoryColor()->i.r = GETHICOL(fword); - m_rdp->GetMemoryColor()->i.g = GETMEDCOL(fword); - m_rdp->GetMemoryColor()->i.b = GETLOWCOL(fword); - if (m_other_modes->image_read_en) + UINT16 fword = RREADIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel); + UINT8 hbyte = HREADADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel); + m_rdp->MemoryColor.i.r = GETHICOL(fword); + m_rdp->MemoryColor.i.g = GETMEDCOL(fword); + m_rdp->MemoryColor.i.b = GETLOWCOL(fword); + if (m_rdp->OtherModes.image_read_en) { - m_misc_state->m_curpixel_memcvg = ((fword & 1) << 2) | (hbyte & 3); - m_rdp->GetMemoryColor()->i.a = m_misc_state->m_curpixel_memcvg << 5; + m_rdp->MiscState.CurrentMemCvg = ((fword & 1) << 2) | (hbyte & 3); + m_rdp->MemoryColor.i.a = m_rdp->MiscState.CurrentMemCvg << 5; } else { - m_misc_state->m_curpixel_memcvg = 7; - m_rdp->GetMemoryColor()->i.a = 0xff; + m_rdp->MiscState.CurrentMemCvg = 7; + m_rdp->MemoryColor.i.a = 0xff; } } -void Framebuffer::Read32Bit(UINT32 curpixel) +void FramebufferT::Read32Bit(UINT32 curpixel) { - UINT32 mem = RREADIDX32((m_misc_state->m_fb_address >> 2) + curpixel); - m_rdp->GetMemoryColor()->i.r = (mem >> 24) & 0xff; - m_rdp->GetMemoryColor()->i.g = (mem >> 16) & 0xff; - m_rdp->GetMemoryColor()->i.b = (mem >> 8) & 0xff; - if (m_other_modes->image_read_en) + UINT32 mem = RREADIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel); + m_rdp->MemoryColor.i.r = (mem >> 24) & 0xff; + m_rdp->MemoryColor.i.g = (mem >> 16) & 0xff; + m_rdp->MemoryColor.i.b = (mem >> 8) & 0xff; + if (m_rdp->OtherModes.image_read_en) { - m_misc_state->m_curpixel_memcvg = (mem >> 5) & 7; - m_rdp->GetMemoryColor()->i.a = (mem) & 0xff; + m_rdp->MiscState.CurrentMemCvg = (mem >> 5) & 7; + m_rdp->MemoryColor.i.a = (mem) & 0xff; } else { - m_misc_state->m_curpixel_memcvg = 7; - m_rdp->GetMemoryColor()->i.a = 0xff; + m_rdp->MiscState.CurrentMemCvg = 7; + m_rdp->MemoryColor.i.a = 0xff; } } -void Framebuffer::Copy(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Copy16Bit(curpixel, r, g, b); @@ -211,27 +211,27 @@ break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Copy16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy16Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT16 val = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((m_misc_state->m_curpixel_cvg >> 2) & 1); - RWRITEIDX16((m_misc_state->m_fb_address >> 1) + curpixel, val); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + curpixel, m_misc_state->m_curpixel_cvg & 3); + UINT16 val = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((m_rdp->MiscState.CurrentPixCvg >> 2) & 1); + RWRITEIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel, val); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel, m_rdp->MiscState.CurrentPixCvg & 3); } -void Framebuffer::Copy32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) +void FramebufferT::Copy32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b) { - UINT32 val = (r << 24) | (g << 16) | (b << 8) | (m_misc_state->m_curpixel_cvg << 5); - RWRITEIDX32((m_misc_state->m_fb_address >> 2) + curpixel, val); + UINT32 val = (r << 24) | (g << 16) | (b << 8) | (m_rdp->MiscState.CurrentPixCvg << 5); + RWRITEIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel, val); } -void Framebuffer::Fill(UINT32 curpixel) +void FramebufferT::Fill(UINT32 curpixel) { - switch(m_misc_state->m_fb_size) + switch(m_rdp->MiscState.FBSize) { case PIXEL_SIZE_16BIT: Fill16Bit(curpixel); @@ -242,32 +242,32 @@ break; default: - fatalerror("Unsupported bit depth: %d\n", m_misc_state->m_fb_size); + fatalerror("Unsupported bit depth: %d\n", m_rdp->MiscState.FBSize); break; } } -void Framebuffer::Fill16Bit(UINT32 curpixel) +void FramebufferT::Fill16Bit(UINT32 curpixel) { UINT16 val; if (curpixel & 1) { - val = m_rdp->GetFillColor32() & 0xffff; + val = m_rdp->FillColor & 0xffff; } else { - val = (m_rdp->GetFillColor32() >> 16) & 0xffff; + val = (m_rdp->FillColor >> 16) & 0xffff; } - RWRITEIDX16((m_misc_state->m_fb_address >> 1) + curpixel, val); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + curpixel, ((val & 1) << 1) | (val & 1)); + RWRITEIDX16((m_rdp->MiscState.FBAddress >> 1) + curpixel, val); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + curpixel, ((val & 1) << 1) | (val & 1)); } -void Framebuffer::Fill32Bit(UINT32 curpixel) +void FramebufferT::Fill32Bit(UINT32 curpixel) { - UINT32 fill_color = m_rdp->GetFillColor32(); - RWRITEIDX32((m_misc_state->m_fb_address >> 2) + curpixel, fill_color); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + (curpixel << 1), (fill_color & 0x10000) ? 3 : 0); - HWRITEADDR8((m_misc_state->m_fb_address >> 1) + (curpixel << 1) + 1, (fill_color & 0x1) ? 3 : 0); + UINT32 FillColor = m_rdp->FillColor; + RWRITEIDX32((m_rdp->MiscState.FBAddress >> 2) + curpixel, FillColor); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + (curpixel << 1), (FillColor & 0x10000) ? 3 : 0); + HWRITEADDR8((m_rdp->MiscState.FBAddress >> 1) + (curpixel << 1) + 1, (FillColor & 0x1) ? 3 : 0); } } // namespace RDP diff -Nru mame-0.144/src/mame/video/rdpfb.h mame-0.145/src/mame/video/rdpfb.h --- mame-0.144/src/mame/video/rdpfb.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdpfb.h 2012-02-06 21:30:31.000000000 +0000 @@ -12,10 +12,10 @@ class OtherModes; class MiscState; -class Framebuffer +class FramebufferT { public: - Framebuffer() + FramebufferT() { m_pre_wrap = false; } diff -Nru mame-0.144/src/mame/video/rdpspn16.c mame-0.145/src/mame/video/rdpspn16.c --- mame-0.144/src/mame/video/rdpspn16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdpspn16.c 2012-02-06 21:30:31.000000000 +0000 @@ -15,6 +15,11 @@ int clipy1 = GetScissor()->m_yh; int clipy2 = GetScissor()->m_yl; + if (clipy2 <= 0) + { + return; + } + if (start < clipy1) { start = clipy1; @@ -34,15 +39,13 @@ for(int i = start; i <= end; i++) { - m_span[i].SetMachine(machine()); - switch(m_other_modes.cycle_type) + switch(OtherModes.cycle_type) { - case CYCLE_TYPE_1: m_span[i].Draw1Cycle(i, tilenum, flip); break; - case CYCLE_TYPE_2: m_span[i].Draw2Cycle(i, tilenum, flip); break; - case CYCLE_TYPE_COPY: m_span[i].DrawCopy(i, tilenum, flip); break; - case CYCLE_TYPE_FILL: m_span[i].DrawFill(i, tilenum, flip); break; + case CYCLE_TYPE_1: Spans[i].Draw1Cycle(i, tilenum, flip); break; + case CYCLE_TYPE_2: Spans[i].Draw2Cycle(i, tilenum, flip); break; + case CYCLE_TYPE_COPY: Spans[i].DrawCopy(i, tilenum, flip); break; + case CYCLE_TYPE_FILL: Spans[i].DrawFill(i, tilenum, flip); break; } - } } @@ -73,16 +76,14 @@ m_machine = &machine; m_rdp = &state->m_rdp; - m_other_modes = m_rdp->GetOtherModes(); - m_misc_state = m_rdp->GetMiscState(); } void Span::RGBAZClip(int sr, int sg, int sb, int sa, int *sz) { - m_rdp->GetShadeColor()->i.r = m_rdp->GetSpecial9BitClampTable()[sr & 0x1ff]; - m_rdp->GetShadeColor()->i.g = m_rdp->GetSpecial9BitClampTable()[sg & 0x1ff]; - m_rdp->GetShadeColor()->i.b = m_rdp->GetSpecial9BitClampTable()[sb & 0x1ff]; - m_rdp->GetShadeColor()->i.a = m_rdp->GetSpecial9BitClampTable()[sa & 0x1ff]; + m_rdp->ShadeColor.i.r = m_rdp->GetSpecial9BitClampTable()[sr & 0x1ff]; + m_rdp->ShadeColor.i.g = m_rdp->GetSpecial9BitClampTable()[sg & 0x1ff]; + m_rdp->ShadeColor.i.b = m_rdp->GetSpecial9BitClampTable()[sb & 0x1ff]; + m_rdp->ShadeColor.i.a = m_rdp->GetSpecial9BitClampTable()[sa & 0x1ff]; INT32 zanded = (*sz) & 0x60000; @@ -98,7 +99,7 @@ void Span::RGBAZCorrectTriangle(INT32 offx, INT32 offy, INT32* r, INT32* g, INT32* b, INT32* a, INT32* z) { - if (m_rdp->GetMiscState()->m_curpixel_cvg == 8) + if (m_rdp->MiscState.CurrentPixCvg == 8) { *r >>= 2; *g >>= 2; @@ -142,17 +143,17 @@ SpanParam t = m_t; SpanParam w = m_w; - UINT32 zb = m_misc_state->m_zb_address >> 1; + UINT32 zb = m_rdp->MiscState.ZBAddress >> 1; UINT32 zhb = zb; UINT8 offx = 0, offy = 0; INT32 tile1 = tilenum; - m_rdp->GetTexPipe()->CalculateClampDiffs(tile1); + m_rdp->TexPipe.CalculateClampDiffs(tile1); - bool noisecompute = m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1] == &m_rdp->GetNoiseColor()->i.r; - bool partialreject = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetInvPixelColor()->i.a && m_rdp->GetColorInputs()->blender1b_a[0] == &m_rdp->GetPixelColor()->i.a); - bool bsel0 = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetMemoryColor()->i.a); + bool noisecompute = m_rdp->ColorInputs.combiner_rgbsub_a_r[1] == &m_rdp->NoiseColor.i.r; + bool partialreject = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->InvPixelColor.i.a && m_rdp->ColorInputs.blender1b_a[0] == &m_rdp->PixelColor.i.a); + bool bsel0 = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->MemoryColor.i.a); int drinc = flip ? (m_rdp->m_span_dr) : -m_rdp->m_span_dr; int dginc = flip ? (m_rdp->m_span_dg) : -m_rdp->m_span_dg; @@ -165,7 +166,7 @@ int dzpix = m_rdp->m_span_dzpix; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int cdith = 0; int adith = 0; @@ -177,7 +178,7 @@ int x = xend; int length = flip ? (xstart - xend) : (xend - xstart); - m_rdp->GetTexPipe()->m_start_span = true; + m_rdp->TexPipe.m_start_span = true; UINT32 fir, fig, fib; for (int j = 0; j <= length; j++) @@ -193,10 +194,10 @@ INT32 sss = 0; INT32 sst = 0; - if (m_other_modes->z_source_sel) + if (m_rdp->OtherModes.z_source_sel) { - sz = (((UINT32)m_misc_state->m_primitive_z) << 6) & 0x3fffff; - dzpix = m_misc_state->m_primitive_delta_z; + sz = (((UINT32)m_rdp->MiscState.PrimitiveZ) << 6) & 0x3fffff; + dzpix = m_rdp->MiscState.PrimitiveDZ; dzinc = m_rdp->m_span_dz = m_rdp->m_span_dzdy = 0; } @@ -206,9 +207,9 @@ { m_rdp->lookup_cvmask_derivatives(m_cvg[x], &offx, &offy); - if (m_rdp->GetTexPipe()->m_start_span) + if (m_rdp->TexPipe.m_start_span) { - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(ss, st, sw, &sss, &sst); } @@ -219,16 +220,16 @@ } else { - sss = m_rdp->GetTexPipe()->m_precomp_s; - sst = m_rdp->GetTexPipe()->m_precomp_t; + sss = m_rdp->TexPipe.m_precomp_s; + sst = m_rdp->TexPipe.m_precomp_t; } - m_rdp->GetTexPipe()->LOD1Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc); + m_rdp->TexPipe.LOD1Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc); RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz); RGBAZClip(sr, sg, sb, sa, &sz); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel0Color(), m_rdp->GetTexel0Color(), sss, sst, tilenum, 0); + m_rdp->TexPipe.Cycle(&m_rdp->Texel0Color, &m_rdp->Texel0Color, sss, sst, tilenum, 0); m_rdp->ColorCombiner1Cycle(noisecompute); @@ -236,18 +237,18 @@ UINT32 zbcur = zb + curpixel; UINT32 zhbcur = zhb + curpixel; - m_rdp->GetFramebuffer()->Read(curpixel); + m_rdp->Framebuffer.Read(curpixel); if(m_rdp->ZCompare(zbcur, zhbcur, sz, dzpix)) { m_rdp->GetDitherValues(index, j, &cdith, &adith); - bool rendered = m_rdp->GetBlender()->Blend1Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0); + bool rendered = m_rdp->Blender.Blend1Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0); if (rendered) { - m_rdp->GetFramebuffer()->Write(curpixel, fir, fig, fib); - if (m_other_modes->z_update_en) + m_rdp->Framebuffer.Write(curpixel, fir, fig, fib); + if (m_rdp->OtherModes.z_update_en) { m_rdp->ZStore(zbcur, zhbcur, sz); } @@ -282,7 +283,7 @@ SpanParam t = m_t; SpanParam w = m_w; - UINT32 zb = m_misc_state->m_zb_address >> 1; + UINT32 zb = m_rdp->MiscState.ZBAddress >> 1; UINT32 zhb = zb; UINT8 offx = 0, offy = 0; @@ -294,12 +295,12 @@ INT32 news = 0; INT32 newt = 0; - m_rdp->GetTexPipe()->CalculateClampDiffs(tile1); + m_rdp->TexPipe.CalculateClampDiffs(tile1); - bool noisecompute = (m_rdp->GetColorInputs()->combiner_rgbsub_a_r[0] == &m_rdp->GetNoiseColor()->i.r || m_rdp->GetColorInputs()->combiner_rgbsub_a_r[1] == &m_rdp->GetPixelColor()->i.r); - bool partialreject = (m_rdp->GetColorInputs()->blender2b_a[1] == &m_rdp->GetInvPixelColor()->i.a && m_rdp->GetColorInputs()->blender1b_a[1] == &m_rdp->GetPixelColor()->i.a); - bool bsel0 = (m_rdp->GetColorInputs()->blender2b_a[0] == &m_rdp->GetMemoryColor()->i.a); - bool bsel1 = (m_rdp->GetColorInputs()->blender2b_a[1] == &m_rdp->GetMemoryColor()->i.a); + bool noisecompute = (m_rdp->ColorInputs.combiner_rgbsub_a_r[0] == &m_rdp->NoiseColor.i.r || m_rdp->ColorInputs.combiner_rgbsub_a_r[1] == &m_rdp->PixelColor.i.r); + bool partialreject = (m_rdp->ColorInputs.blender2b_a[1] == &m_rdp->InvPixelColor.i.a && m_rdp->ColorInputs.blender1b_a[1] == &m_rdp->PixelColor.i.a); + bool bsel0 = (m_rdp->ColorInputs.blender2b_a[0] == &m_rdp->MemoryColor.i.a); + bool bsel1 = (m_rdp->ColorInputs.blender2b_a[1] == &m_rdp->MemoryColor.i.a); int dzpix = m_rdp->m_span_dzpix; int drinc = flip ? (m_rdp->m_span_dr) : -m_rdp->m_span_dr; @@ -312,7 +313,7 @@ int dwinc = flip ? (m_rdp->m_span_dw) : -m_rdp->m_span_dw; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int cdith = 0; int adith = 0; @@ -324,7 +325,7 @@ int x = xend; int length = flip ? (xstart - xend) : (xend - xstart); - m_rdp->GetTexPipe()->m_start_span = true; + m_rdp->TexPipe.m_start_span = true; UINT32 fir, fig, fib; //printf( "Span length: %d\n", length); @@ -344,10 +345,10 @@ Color c1; Color c2; - if (m_other_modes->z_source_sel) + if (m_rdp->OtherModes.z_source_sel) { - sz = (((UINT32)m_misc_state->m_primitive_z) << 6) & 0x3fffff; - dzpix = m_misc_state->m_primitive_delta_z; + sz = (((UINT32)m_rdp->MiscState.PrimitiveZ) << 6) & 0x3fffff; + dzpix = m_rdp->MiscState.PrimitiveDZ; dzinc = m_rdp->m_span_dz = m_rdp->m_span_dzdy = 0; } @@ -357,9 +358,9 @@ { m_rdp->lookup_cvmask_derivatives(m_cvg[x], &offx, &offy); - if (m_rdp->GetTexPipe()->m_start_span) + if (m_rdp->TexPipe.m_start_span) { - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(ss, st, sw, &sss, &sst); } @@ -370,23 +371,23 @@ } else { - sss = m_rdp->GetTexPipe()->m_precomp_s; - sst = m_rdp->GetTexPipe()->m_precomp_t; + sss = m_rdp->TexPipe.m_precomp_s; + sst = m_rdp->TexPipe.m_precomp_t; } - m_rdp->GetTexPipe()->LOD2Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc, prim_tile, &tile1, &tile2); + m_rdp->TexPipe.LOD2Cycle(&sss, &sst, s.w, t.w, w.w, dsinc, dtinc, dwinc, prim_tile, &tile1, &tile2); - news = m_rdp->GetTexPipe()->m_precomp_s; - newt = m_rdp->GetTexPipe()->m_precomp_t; - m_rdp->GetTexPipe()->LOD2CycleLimited(&news, &newt, s.w + dsinc, t.w + dtinc, w.w + dwinc, dsinc, dtinc, dwinc, prim_tile, &newtile1); + news = m_rdp->TexPipe.m_precomp_s; + newt = m_rdp->TexPipe.m_precomp_t; + m_rdp->TexPipe.LOD2CycleLimited(&news, &newt, s.w + dsinc, t.w + dtinc, w.w + dwinc, dsinc, dtinc, dwinc, prim_tile, &newtile1); RGBAZCorrectTriangle(offx, offy, &sr, &sg, &sb, &sa, &sz); RGBAZClip(sr, sg, sb, sa, &sz); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel0Color(), m_rdp->GetTexel0Color(), sss, sst, tile1, 0); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetTexel1Color(), m_rdp->GetTexel0Color(), sss, sst, tile2, 1); + m_rdp->TexPipe.Cycle(&m_rdp->Texel0Color, &m_rdp->Texel0Color, sss, sst, tile1, 0); + m_rdp->TexPipe.Cycle(&m_rdp->Texel1Color, &m_rdp->Texel0Color, sss, sst, tile2, 1); - m_rdp->GetTexPipe()->Cycle(m_rdp->GetNextTexelColor(), m_rdp->GetNextTexelColor(), sss, sst, tile2, 1); + m_rdp->TexPipe.Cycle(&m_rdp->NextTexelColor, &m_rdp->NextTexelColor, sss, sst, tile2, 1); m_rdp->ColorCombiner2Cycle(noisecompute); @@ -394,18 +395,18 @@ UINT32 zbcur = zb + curpixel; UINT32 zhbcur = zhb + curpixel; - m_rdp->GetFramebuffer()->Read(curpixel); + m_rdp->Framebuffer.Read(curpixel); if(m_rdp->ZCompare(zbcur, zhbcur, sz, dzpix)) { m_rdp->GetDitherValues(index, j, &cdith, &adith); - bool rendered = m_rdp->GetBlender()->Blend2Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0, bsel1); + bool rendered = m_rdp->Blender.Blend2Cycle(&fir, &fig, &fib, cdith, adith, partialreject, bsel0, bsel1); if (rendered) { - m_rdp->GetFramebuffer()->Write(curpixel, fir, fig, fib); - if (m_other_modes->z_update_en) + m_rdp->Framebuffer.Write(curpixel, fir, fig, fib); + if (m_rdp->OtherModes.z_update_en) { m_rdp->ZStore(zbcur, zhbcur, sz); } @@ -440,7 +441,7 @@ int dtinc = flip ? (dt) : -dt; int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int xstart = m_lx; int xend = m_unscissored_rx; @@ -458,13 +459,13 @@ { INT32 sss = s.h.h; INT32 sst = t.h.h; - m_rdp->GetTexPipe()->Copy(m_rdp->GetTexel0Color(), sss, sst, tilenum); + m_rdp->TexPipe.Copy(&m_rdp->Texel0Color, sss, sst, tilenum); UINT32 curpixel = fb_index + x; - m_misc_state->m_curpixel_cvg = m_rdp->GetTexel0Color()->i.a ? 7 : 0; - if ((m_rdp->GetTexel0Color()->i.a != 0) || (!m_other_modes->alpha_compare_en)) + m_rdp->MiscState.CurrentPixCvg = m_rdp->Texel0Color.i.a ? 7 : 0; + if ((m_rdp->Texel0Color.i.a != 0) || (!m_rdp->OtherModes.alpha_compare_en)) { - m_rdp->GetFramebuffer()->Copy(curpixel, m_rdp->GetTexel0Color()->i.r, m_rdp->GetTexel0Color()->i.g, m_rdp->GetTexel0Color()->i.b); + m_rdp->Framebuffer.Copy(curpixel, m_rdp->Texel0Color.i.r, m_rdp->Texel0Color.i.g, m_rdp->Texel0Color.i.b); } } @@ -481,7 +482,7 @@ int xinc = flip ? 1 : -1; - int fb_index = m_misc_state->m_fb_width * index; + int fb_index = m_rdp->MiscState.FBWidth * index; int xstart = m_lx; int xend_scissored = m_rx; @@ -495,7 +496,7 @@ if (x >= clipx1 && x < clipx2) { UINT32 curpixel = fb_index + x; - m_rdp->GetFramebuffer()->Fill(curpixel); + m_rdp->Framebuffer.Fill(curpixel); } x += xinc; diff -Nru mame-0.144/src/mame/video/rdpspn16.h mame-0.145/src/mame/video/rdpspn16.h --- mame-0.144/src/mame/video/rdpspn16.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdpspn16.h 2012-02-06 21:30:31.000000000 +0000 @@ -58,7 +58,7 @@ SpanParam m_a; SpanParam m_z; - UINT16 m_cvg[RDP_CVG_SPAN_MAX]; + UINT16 m_cvg[RDP_CVG_SPAN_MAX+1]; // guard word for worst-case private: void RGBAZClip(int sr, int sg, int sb, int sa, int *sz); diff -Nru mame-0.144/src/mame/video/rdptpipe.c mame-0.145/src/mame/video/rdptpipe.c --- mame-0.144/src/mame/video/rdptpipe.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rdptpipe.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,17 +10,25 @@ #define RELATIVE(x, y) ((((x) >> 3) - (y)) << 3) | (x & 7); -void TexturePipe::SetMachine(running_machine &machine) +void TexturePipeT::SetMachine(running_machine &machine) { _n64_state *state = machine.driver_data<_n64_state>(); m_machine = &machine; m_rdp = &state->m_rdp; - m_other_modes = m_rdp->GetOtherModes(); - m_misc_state = m_rdp->GetMiscState(); + + for(int i = 0; i < 0x10000; i++) + { + Color c; + c.i.r = m_rdp->ReplicatedRGBA[(i >> 11) & 0x1f]; + c.i.g = m_rdp->ReplicatedRGBA[(i >> 6) & 0x1f]; + c.i.b = m_rdp->ReplicatedRGBA[(i >> 1) & 0x1f]; + c.i.a = (i & 1) ? 0xff : 0x00; + Expand16To32Table[i] = c.c; + } } -void TexturePipe::Mask(INT32* S, INT32* T, INT32 num) +void TexturePipeT::Mask(INT32* S, INT32* T, INT32 num) { Tile* tile = m_rdp->GetTiles(); @@ -47,7 +55,7 @@ } } -void TexturePipe::MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num) +void TexturePipeT::MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num) { Tile* tile = m_rdp->GetTiles(); @@ -94,7 +102,7 @@ } } -void TexturePipe::ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT32 num) +void TexturePipeT::ShiftCycle(INT32* S, INT32* T, INT32* maxs, INT32* maxt, UINT32 num) { Tile* tile = m_rdp->GetTiles(); *S = SIGN16(*S); @@ -122,7 +130,7 @@ *maxt = ((*T >> 3) >= tile[num].th); } -void TexturePipe::ShiftCopy(INT32* S, INT32* T, UINT32 num) +void TexturePipeT::ShiftCopy(INT32* S, INT32* T, UINT32 num) { Tile* tile = m_rdp->GetTiles(); *S = SIGN16(*S); @@ -147,7 +155,7 @@ *T = SIGN16(*T); } -void TexturePipe::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num) +void TexturePipeT::ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num) { Tile* tile = m_rdp->GetTiles(); int dos = tile[num].cs || !tile[num].mask_s; @@ -198,7 +206,7 @@ } } -void TexturePipe::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num) +void TexturePipeT::ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num) { Tile* tile = m_rdp->GetTiles(); int dos = tile[num].cs || !tile[num].mask_s; @@ -245,18 +253,18 @@ } } -void TexturePipe::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle) +void TexturePipeT::Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle) { Tile* tile = m_rdp->GetTiles(); #define TRELATIVE(x, y) ((((x) >> 3) - (y)) << 3) | (x & 7); - INT32 bilerp = cycle ? m_other_modes->bi_lerp1 : m_other_modes->bi_lerp0; - int convert = m_other_modes->convert_one && cycle; + INT32 bilerp = cycle ? m_rdp->OtherModes.bi_lerp1 : m_rdp->OtherModes.bi_lerp0; + int convert = m_rdp->OtherModes.convert_one && cycle; Color t0; Color t1; Color t2; Color t3; - if (m_other_modes->sample_type) + if (m_rdp->OtherModes.sample_type) { int sss1, sst1, sss2, sst2; @@ -293,7 +301,7 @@ invtf = 0x20 - tfrac; } - center = (sfrac == 0x10) && (tfrac == 0x10) && m_other_modes->mid_texel; + center = (sfrac == 0x10) && (tfrac == 0x10) && m_rdp->OtherModes.mid_texel; invsf <<= 3; invtf <<= 3; @@ -411,7 +419,7 @@ } } -void TexturePipe::Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum) +void TexturePipeT::Copy(Color* TEX, INT32 SSS, INT32 SST, UINT32 tilenum) { Tile* tile = m_rdp->GetTiles(); INT32 sss1 = SSS; @@ -425,13 +433,13 @@ TEX->c = Fetch(sss1, sst1, tilenum); } -void TexturePipe::LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc) +void TexturePipeT::LOD1Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -496,13 +504,13 @@ } } -void TexturePipe::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, INT32* t2) +void TexturePipeT::LOD2Cycle(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1, INT32* t2) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -585,44 +593,44 @@ { lod = 0x7fff; } - else if (lod < m_misc_state->m_min_level) + else if (lod < m_rdp->MiscState.MinLevel) { - lod = m_misc_state->m_min_level; + lod = m_rdp->MiscState.MinLevel; } bool magnify = (lod < 32); INT32 l_tile = m_rdp->GetLog2((lod >> 5) & 0xff); - bool distant = ((lod & 0x6000) || (l_tile >= m_misc_state->m_max_level)); + bool distant = ((lod & 0x6000) || (l_tile >= m_rdp->MiscState.MaxLevel)); - m_rdp->SetLODFrac(((lod << 3) >> l_tile) & 0xff); + m_rdp->LODFraction = ((lod << 3) >> l_tile) & 0xff; - if(!m_other_modes->sharpen_tex_en && !m_other_modes->detail_tex_en) + if(!m_rdp->OtherModes.sharpen_tex_en && !m_rdp->OtherModes.detail_tex_en) { if (distant) { - m_rdp->SetLODFrac(0xff); + m_rdp->LODFraction = 0xff; } else if (magnify) { - m_rdp->SetLODFrac(0); + m_rdp->LODFraction = 0; } } - if(m_other_modes->sharpen_tex_en && magnify) + if(m_rdp->OtherModes.sharpen_tex_en && magnify) { - m_rdp->SetLODFrac(m_rdp->GetLODFrac() | 0x100); + m_rdp->LODFraction = m_rdp->LODFraction | 0x100; } - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { if (distant) { - l_tile = m_misc_state->m_max_level; + l_tile = m_rdp->MiscState.MaxLevel; } - if (!m_other_modes->detail_tex_en) + if (!m_rdp->OtherModes.detail_tex_en) { *t1 = (prim_tile + l_tile) & 7; - if (!(distant || (!m_other_modes->sharpen_tex_en && magnify))) + if (!(distant || (!m_rdp->OtherModes.sharpen_tex_en && magnify))) { *t2 = (*t1 + 1) & 7; } @@ -654,13 +662,13 @@ } } -void TexturePipe::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1) +void TexturePipeT::LOD2CycleLimited(INT32* sss, INT32* sst, INT32 s, INT32 t, INT32 w, INT32 dsinc, INT32 dtinc, INT32 dwinc, INT32 prim_tile, INT32* t1) { INT32 nextsw = (w + dwinc) >> 16; INT32 nexts = (s + dsinc) >> 16; INT32 nextt = (t + dtinc) >> 16; - if (m_other_modes->persp_tex_en) + if (m_rdp->OtherModes.persp_tex_en) { m_rdp->TCDiv(nexts, nextt, nextsw, &nexts, &nextt); } @@ -739,22 +747,22 @@ { lod = 0x7fff; } - else if (lod < m_misc_state->m_min_level) + else if (lod < m_rdp->MiscState.MinLevel) { - lod = m_misc_state->m_min_level; + lod = m_rdp->MiscState.MinLevel; } bool magnify = (lod < 32); INT32 l_tile = m_rdp->GetLog2((lod >> 5) & 0xff); - bool distant = (lod & 0x6000) || (l_tile >= m_misc_state->m_max_level); + bool distant = (lod & 0x6000) || (l_tile >= m_rdp->MiscState.MaxLevel); - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { if (distant) { - l_tile = m_misc_state->m_max_level; + l_tile = m_rdp->MiscState.MaxLevel; } - if (!m_other_modes->detail_tex_en) + if (!m_rdp->OtherModes.detail_tex_en) { *t1 = (prim_tile + l_tile) & 7; } @@ -773,12 +781,12 @@ } } -void TexturePipe::CalculateClampDiffs(UINT32 prim_tile) +void TexturePipeT::CalculateClampDiffs(UINT32 prim_tile) { Tile* tile = m_rdp->GetTiles(); - if (m_other_modes->cycle_type == CYCLE_TYPE_2) + if (m_rdp->OtherModes.cycle_type == CYCLE_TYPE_2) { - if (m_other_modes->tex_lod_en) + if (m_rdp->OtherModes.tex_lod_en) { int start = 0; int end = 7; @@ -805,456 +813,577 @@ } } -UINT32 TexturePipe::Fetch(INT32 s, INT32 t, INT32 tilenum) +#define USE_64K_LUT (1) + +static INT32 sTexAddrSwap16[2] = { WORD_ADDR_XOR, WORD_XOR_DWORD_SWAP }; +static INT32 sTexAddrSwap8[2] = { BYTE_ADDR_XOR, BYTE_XOR_DWORD_SWAP }; + +UINT32 TexturePipeT::_FetchRGBA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) { - Tile* tile = m_rdp->GetTiles(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + + UINT16 c = m_rdp->GetTMEM16()[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else Color color; - UINT32 tbase = (tile[tilenum].line * t) & 0x1ff; - UINT32 tformat = tile[tilenum].format; - UINT32 tsize = tile[tilenum].size; - tbase += tile[tilenum].tmem; - UINT32 tpal = tile[tilenum].palette; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} - if (tformat == FORMAT_I && tsize > PIXEL_SIZE_8BIT) - { - tformat = FORMAT_RGBA; // Used by Supercross 2000 (in-game) - } - if (tformat == FORMAT_CI && tsize > PIXEL_SIZE_8BIT) - { - tformat = FORMAT_RGBA; // Used by Clay Fighter - Sculptor's Cut - } +UINT32 TexturePipeT::_FetchRGBA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; - if (tformat == FORMAT_RGBA && tsize < PIXEL_SIZE_16BIT) - { - tformat = FORMAT_CI; // Used by Exterem-G2, Madden Football 64, and Rat Attack - } + UINT16 c = m_rdp->GetTMEM16()[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; - UINT16 *tc16 = m_rdp->GetTMEM16(); + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + return color.c; +} - switch (tformat) - { - case FORMAT_RGBA: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - break; - case PIXEL_SIZE_8BIT: - break; - case PIXEL_SIZE_16BIT: - { - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - taddr &= 0x7ff; - - if (!m_other_modes->en_tlut) - { - UINT16 c = tc16[taddr]; - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - UINT16 c = tc16[taddr]; - c = m_rdp->GetTLUT()[(c >> 8) << 2]; - if (m_other_modes->tlut_type == 0) // Used by Goldeneye 007 (ocean in Frigate) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else // Used by Beetle Adventure Racing (Mount Mayhem level) - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_32BIT: - { - UINT32 *tc = m_rdp->GetTMEM32(); - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - - if (!m_other_modes->en_tlut) - { - taddr &= 0x3ff; - UINT32 c = tc16[taddr]; - color.i.r = (c >> 8) & 0xff; - color.i.g = c & 0xff; - c = tc16[taddr | 0x400]; - color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - else // Used by California Speed, attract mode - { - taddr &= 0x3ff; - UINT32 c = tc[taddr]; - c = m_rdp->GetTLUT()[(c >> 24) << 2]; - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } +UINT32 TexturePipeT::_FetchRGBA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + +#if USE_64K_LUT + return Expand16To32Table[m_rdp->GetTMEM16()[taddr]]; +#else + UINT16 c = m_rdp->GetTMEM16()[taddr]; + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} - break; - } - default: - fatalerror("FETCH_TEXEL: unknown RGBA texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_YUV: // Used by: Bottom of the 9th, Pokemon Stadium, Ogre Battle, Major League Baseball, Ken Griffey Jr.'s Slugfest, Vigilante 8 Second Offense - { - switch(tsize) - { - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = m_rdp->GetTMEM16(); +UINT32 TexturePipeT::_FetchRGBA_32_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT32 *tc = m_rdp->GetTMEM32(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x3ff; + UINT32 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 24) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} - int taddr = (tbase << 3) + s; - int taddrlow = taddr >> 1; +UINT32 TexturePipeT::_FetchRGBA_32_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT32 *tc = m_rdp->GetTMEM32(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x3ff; + UINT32 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 24) << 2]; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddrlow ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; - taddr &= 0x7ff; - taddrlow &= 0x3ff; - - UINT16 c = tc[taddrlow]; - - INT32 y = m_rdp->GetTMEM()[taddr | 0x800]; - INT32 u = c >> 8; - INT32 v = c & 0xff; - - v ^= 0x80; u ^= 0x80; - if (v & 0x80) - { - v |= 0x100; - } - if (u & 0x80) - { - u |= 0x100; - } - - color.i.r = u; - color.i.g = v; - color.i.b = y; - color.i.a = y; - break; - } - default: - fatalerror("FETCH_TEXEL: unknown YUV texture size %d\n",tsize); - break; - } - break; - } - case FORMAT_CI: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: // Madden Football 64, Bust-A-Move 2 - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (m_other_modes->en_tlut) - { - taddr &= 0x7ff; - UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; - - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - else - { - UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - p = (tpal << 4) | p; - color.i.r = color.i.g = color.i.b = color.i.a = p; - } + return color.c; +} - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (m_other_modes->en_tlut) - { - taddr &= 0x7ff; - UINT8 p = tc[taddr]; - UINT16 c = m_rdp->GetTLUT()[p << 2]; - - if (m_other_modes->tlut_type == 0) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - else - { - UINT8 p = tc[taddr]; - color.i.r = p; - color.i.g = p; - color.i.b = p; - color.i.a = p; - } - break; - } - default: - fatalerror("FETCH_TEXEL: unknown CI texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_IA: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT8 i = p & 0xe; - i = (i << 4) | (i << 1) | (i >> 2); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = (p & 0x1) ? 0xff : 0; - } - else - { - taddr &= 0x7ff; - UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); - UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - if (!m_other_modes->en_tlut) - { - UINT8 p = tc[taddr]; - UINT8 i = p & 0xf0; - i |= (i >> 4); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = ((p & 0xf) << 4) | (p & 0xf); - } - else - { - UINT8 p = tc[taddr & 0x7ff]; - UINT16 c = m_rdp->GetTLUT()[p << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; - color.i.a = c & 0xff; - } - } - break; - } - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = m_rdp->GetTMEM16(); - int taddr = (tbase << 2) + s; - taddr ^= ((t & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR); - taddr &= 0x7ff; - - if (!m_other_modes->en_tlut) - { - UINT16 c = tc[taddr]; - UINT8 i = (c >> 8); - color.i.r = i; - color.i.g = i; - color.i.b = i; - color.i.a = c & 0xff; - } - else - { - UINT16 c = tc[taddr & 0x3ff]; - c = m_rdp->GetTLUT()[(c >> 8) << 2]; - if (m_other_modes->tlut_type == 1) - { - color.i.r = c >> 8; - color.i.g = c >> 8; - color.i.b = c >> 8; - color.i.a = c & 0xff; - } - else - { - color.i.r = GET_HI_RGBA16_TMEM(c); - color.i.g = GET_MED_RGBA16_TMEM(c); - color.i.b = GET_LOW_RGBA16_TMEM(c); - color.i.a = (c & 1) ? 0xff : 0; - } - } - break; - } - default: - color.i.r = color.i.g = color.i.b = color.i.a = 0xff; - fatalerror("FETCH_TEXEL: unknown IA texture size %d\n", tsize); - break; - } - break; - } - case FORMAT_I: - { - switch (tsize) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = ((tbase << 4) + s) >> 1; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 byteval = tc[taddr]; - UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); - c |= (c << 4); - color.i.r = c; - color.i.g = c; - color.i.b = c; - color.i.a = c; - } - else - { - UINT8 byteval = tc[taddr & 0x7ff]; - UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); - UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(k); - color.i.g = GET_MED_RGBA16_TMEM(k); - color.i.b = GET_LOW_RGBA16_TMEM(k); - color.i.a = (k & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; - color.i.a = k & 0xff; - } - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = m_rdp->GetTMEM(); - int taddr = (tbase << 3) + s; - taddr ^= ((t & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR); - taddr &= 0xfff; - - if (!m_other_modes->en_tlut) - { - UINT8 c = tc[taddr]; - color.i.r = c; - color.i.g = c; - color.i.b = c; - color.i.a = c; - } - else - { - UINT8 c = tc[taddr & 0x7ff]; - UINT16 k = m_rdp->GetTLUT()[c << 2]; - if (!m_other_modes->tlut_type) - { - color.i.r = GET_HI_RGBA16_TMEM(k); - color.i.g = GET_MED_RGBA16_TMEM(k); - color.i.b = GET_LOW_RGBA16_TMEM(k); - color.i.a = (k & 1) ? 0xff : 0; - } - else - { - color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; - color.i.a = k & 0xff; - } - } +UINT32 TexturePipeT::_FetchRGBA_32_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; - break; - } - default: - fatalerror("FETCH_TEXEL: unknown I texture size %d\n", tsize); - break; - } - break; - } - default: - { - fatalerror("FETCH_TEXEL: unknown texture format %d, tilenum %d\n", tformat, tilenum); - break; - } - } + taddr &= 0x3ff; + + UINT32 c = m_rdp->GetTMEM16()[taddr]; + Color color; + color.i.r = (c >> 8) & 0xff; + color.i.g = c & 0xff; + c = m_rdp->GetTMEM16()[taddr | 0x400]; + color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchNOP(INT32 s, INT32 t, INT32 tbase, INT32 tpal) { return 0; } + +UINT32 TexturePipeT::_FetchYUV(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + + int taddr = (tbase << 3) + s; + int taddrlow = taddr >> 1; + + taddr ^= sTexAddrSwap8[t & 1]; + taddrlow ^= sTexAddrSwap16[t & 1]; + + taddr &= 0x7ff; + taddrlow &= 0x3ff; + + UINT16 c = tc[taddrlow]; + + INT32 y = m_rdp->GetTMEM()[taddr | 0x800]; + INT32 u = c >> 8; + INT32 v = c & 0xff; + + v ^= 0x80; u ^= 0x80; + u |= ((u & 0x80) << 1); + v |= ((v & 0x80) << 1); + + Color color; + color.i.r = u; + color.i.g = v; + color.i.b = y; + color.i.a = y; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + taddr &= 0x7ff; + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchCI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + taddr &= 0x7ff; + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = (s & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + p = (tpal << 4) | p; + + Color color; + color.i.r = color.i.g = color.i.b = color.i.a = p; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchCI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchCI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = tc[taddr]; + + Color color; + color.i.r = color.i.g = color.i.b = color.i.a = p; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT16 c = m_rdp->GetTLUT()[((tpal << 4) | p) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = ((s) & 1) ? (tc[taddr] & 0xf) : (tc[taddr] >> 4); + UINT8 i = p & 0xe; + i = (i << 4) | (i << 1) | (i >> 2); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = (p & 1) & 0xff; return color.c; } +UINT32 TexturePipeT::_FetchIA_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 p = tc[taddr]; + UINT16 c = m_rdp->GetTLUT()[p << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 p = tc[taddr]; + UINT8 i = p & 0xf0; + i |= (i >> 4); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = ((p & 0xf) << 4) | (p & 0xf); + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x3ff; + + UINT16 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[c]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(c); + color.i.g = GET_MED_RGBA16_TMEM(c); + color.i.b = GET_LOW_RGBA16_TMEM(c); + color.i.a = (c & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchIA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x3ff; + + UINT16 c = tc[taddr]; + c = m_rdp->GetTLUT()[(c >> 8) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (c >> 8) & 0xff; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchIA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT16 *tc = m_rdp->GetTMEM16(); + int taddr = (tbase << 2) + s; + taddr ^= sTexAddrSwap16[t & 1]; + taddr &= 0x7ff; + + UINT16 c = tc[taddr]; + UINT8 i = (c >> 8); + + Color color; + color.i.r = i; + color.i.g = i; + color.i.b = i; + color.i.a = c & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; + +#if USE_64K_LUT + return Expand16To32Table[k]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(k); + color.i.g = GET_MED_RGBA16_TMEM(k); + color.i.b = GET_LOW_RGBA16_TMEM(k); + color.i.a = (k & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + UINT16 k = m_rdp->GetTLUT()[((tpal << 4) | c) << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; + color.i.a = k & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = ((tbase << 4) + s) >> 1; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 byteval = tc[taddr]; + UINT8 c = ((s & 1)) ? (byteval & 0xf) : ((byteval >> 4) & 0xf); + c |= (c << 4); + + Color color; + color.i.r = c; + color.i.g = c; + color.i.b = c; + color.i.a = c; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 c = tc[taddr]; + UINT16 k = m_rdp->GetTLUT()[c << 2]; + +#if USE_64K_LUT + return Expand16To32Table[k]; +#else + Color color; + color.i.r = GET_HI_RGBA16_TMEM(k); + color.i.g = GET_MED_RGBA16_TMEM(k); + color.i.b = GET_LOW_RGBA16_TMEM(k); + color.i.a = (k & 1) * 0xff; + return color.c; +#endif +} + +UINT32 TexturePipeT::_FetchI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0x7ff; + + UINT8 c = tc[taddr]; + UINT16 k = m_rdp->GetTLUT()[c << 2]; + + Color color; + color.i.r = color.i.g = color.i.b = (k >> 8) & 0xff; + color.i.a = k & 0xff; + + return color.c; +} + +UINT32 TexturePipeT::_FetchI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal) +{ + UINT8 *tc = m_rdp->GetTMEM(); + int taddr = (tbase << 3) + s; + taddr ^= sTexAddrSwap8[t & 1]; + taddr &= 0xfff; + + UINT8 c = tc[taddr]; + + Color color; + color.i.r = c; + color.i.g = c; + color.i.b = c; + color.i.a = c; + + return color.c; +} + +UINT32 TexturePipeT::Fetch(INT32 s, INT32 t, INT32 tilenum) +{ + Tile* tile = m_rdp->GetTiles(); + UINT32 tformat = tile[tilenum].format; + UINT32 tsize = tile[tilenum].size; + + UINT32 tbase = (tile[tilenum].line * t) & 0x1ff; + tbase += tile[tilenum].tmem; + UINT32 tpal = tile[tilenum].palette; + + UINT32 index = (tformat << 4) | (tsize << 2) | (m_rdp->OtherModes.en_tlut << 1) | m_rdp->OtherModes.tlut_type; + + return ((this)->*(TexelFetch[index]))(s, t, tbase, tpal); +} + } // namespace RDP } // namespace N64 diff -Nru mame-0.144/src/mame/video/rdptpipe.h mame-0.145/src/mame/video/rdptpipe.h --- mame-0.144/src/mame/video/rdptpipe.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdptpipe.h 2012-02-06 21:30:31.000000000 +0000 @@ -14,10 +14,12 @@ class Processor; class Color; -class TexturePipe +class TexturePipeT { public: - TexturePipe() + typedef UINT32 (N64::RDP::TexturePipeT::*TexelFetcher) (INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + TexturePipeT() { m_maskbits_table[0] = 0x3ff; for(int i = 1; i < 16; i++) @@ -27,6 +29,56 @@ m_start_span = false; m_precomp_s = 0; m_precomp_t = 0; + + for (int idx = 0; idx < 80; idx++) + { + TexelFetch[idx] = &N64::RDP::TexturePipeT::_FetchNOP; + } + + TexelFetch[ 8] = &N64::RDP::TexturePipeT::_FetchRGBA_16_RAW; + TexelFetch[ 9] = &N64::RDP::TexturePipeT::_FetchRGBA_16_RAW; + TexelFetch[10] = &N64::RDP::TexturePipeT::_FetchRGBA_16_TLUT0; + TexelFetch[11] = &N64::RDP::TexturePipeT::_FetchRGBA_16_TLUT1; + TexelFetch[12] = &N64::RDP::TexturePipeT::_FetchRGBA_32_RAW; + TexelFetch[13] = &N64::RDP::TexturePipeT::_FetchRGBA_32_RAW; + TexelFetch[14] = &N64::RDP::TexturePipeT::_FetchRGBA_32_TLUT0; + TexelFetch[15] = &N64::RDP::TexturePipeT::_FetchRGBA_32_TLUT1; + + TexelFetch[24] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[25] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[26] = &N64::RDP::TexturePipeT::_FetchYUV; + TexelFetch[27] = &N64::RDP::TexturePipeT::_FetchYUV; + + TexelFetch[32] = &N64::RDP::TexturePipeT::_FetchCI_4_RAW; + TexelFetch[33] = &N64::RDP::TexturePipeT::_FetchCI_4_RAW; + TexelFetch[34] = &N64::RDP::TexturePipeT::_FetchCI_4_TLUT0; + TexelFetch[35] = &N64::RDP::TexturePipeT::_FetchCI_4_TLUT1; + TexelFetch[36] = &N64::RDP::TexturePipeT::_FetchCI_8_RAW; + TexelFetch[37] = &N64::RDP::TexturePipeT::_FetchCI_8_RAW; + TexelFetch[38] = &N64::RDP::TexturePipeT::_FetchCI_8_TLUT0; + TexelFetch[39] = &N64::RDP::TexturePipeT::_FetchCI_8_TLUT1; + + TexelFetch[48] = &N64::RDP::TexturePipeT::_FetchIA_4_RAW; + TexelFetch[49] = &N64::RDP::TexturePipeT::_FetchIA_4_RAW; + TexelFetch[50] = &N64::RDP::TexturePipeT::_FetchIA_4_TLUT0; + TexelFetch[51] = &N64::RDP::TexturePipeT::_FetchIA_4_TLUT1; + TexelFetch[52] = &N64::RDP::TexturePipeT::_FetchIA_8_RAW; + TexelFetch[53] = &N64::RDP::TexturePipeT::_FetchIA_8_RAW; + TexelFetch[54] = &N64::RDP::TexturePipeT::_FetchIA_8_TLUT0; + TexelFetch[55] = &N64::RDP::TexturePipeT::_FetchIA_8_TLUT1; + TexelFetch[56] = &N64::RDP::TexturePipeT::_FetchIA_16_RAW; + TexelFetch[57] = &N64::RDP::TexturePipeT::_FetchIA_16_RAW; + TexelFetch[58] = &N64::RDP::TexturePipeT::_FetchIA_16_TLUT0; + TexelFetch[59] = &N64::RDP::TexturePipeT::_FetchIA_16_TLUT1; + + TexelFetch[64] = &N64::RDP::TexturePipeT::_FetchI_4_RAW; + TexelFetch[65] = &N64::RDP::TexturePipeT::_FetchI_4_RAW; + TexelFetch[66] = &N64::RDP::TexturePipeT::_FetchI_4_TLUT0; + TexelFetch[67] = &N64::RDP::TexturePipeT::_FetchI_4_TLUT1; + TexelFetch[68] = &N64::RDP::TexturePipeT::_FetchI_8_RAW; + TexelFetch[69] = &N64::RDP::TexturePipeT::_FetchI_8_RAW; + TexelFetch[70] = &N64::RDP::TexturePipeT::_FetchI_8_TLUT0; + TexelFetch[71] = &N64::RDP::TexturePipeT::_FetchI_8_TLUT1; } void Cycle(Color* TEX, Color* prev, INT32 SSS, INT32 SST, UINT32 tilenum, UINT32 cycle); @@ -44,6 +96,8 @@ INT32 m_precomp_t; private: + UINT32 Expand16To32Table[0x10000]; + void Mask(INT32* S, INT32* T, INT32 num); void MaskCoupled(INT32* S, INT32* S1, INT32* T, INT32* T1, INT32 num); @@ -53,6 +107,43 @@ void ClampCycle(INT32* S, INT32* T, INT32* SFRAC, INT32* TFRAC, INT32 maxs, INT32 maxt, INT32 num); void ClampCycleLight(INT32* S, INT32* T, bool maxs, bool maxt, INT32 num); + UINT32 _FetchNOP(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchRGBA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchRGBA_32_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchYUV(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchCI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchCI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchIA_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchIA_16_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + UINT32 _FetchI_4_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_4_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_4_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_TLUT0(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_TLUT1(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + UINT32 _FetchI_8_RAW(INT32 s, INT32 t, INT32 tbase, INT32 tpal); + + TexelFetcher TexelFetch[16*5]; + running_machine* m_machine; OtherModes* m_other_modes; MiscState* m_misc_state; diff -Nru mame-0.144/src/mame/video/rdptri.h mame-0.145/src/mame/video/rdptri.h --- mame-0.144/src/mame/video/rdptri.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rdptri.h 2012-02-06 21:30:33.000000000 +0000 @@ -27,7 +27,6 @@ running_machine* m_machine; UINT32* m_cmd_data; - MiscState* m_misc_state; Processor* m_rdp; bool m_shade; bool m_texture; diff -Nru mame-0.144/src/mame/video/realbrk.c mame-0.145/src/mame/video/realbrk.c --- mame-0.144/src/mame/video/realbrk.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/realbrk.c 2012-02-06 21:30:31.000000000 +0000 @@ -98,14 +98,14 @@ { realbrk_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0,offset/2); + state->m_tilemap_0->mark_tile_dirty(offset/2); } WRITE16_HANDLER( realbrk_vram_1_w ) { realbrk_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1,offset/2); + state->m_tilemap_1->mark_tile_dirty(offset/2); } /*************************************************************************** @@ -137,7 +137,7 @@ { realbrk_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_2[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_2,offset); + state->m_tilemap_2->mark_tile_dirty(offset); } @@ -160,12 +160,12 @@ /* Text */ state->m_tilemap_2 = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 0x40, 0x20); - tilemap_set_transparent_pen(state->m_tilemap_0,0); - tilemap_set_transparent_pen(state->m_tilemap_1,0); - tilemap_set_transparent_pen(state->m_tilemap_2,0); + state->m_tilemap_0->set_transparent_pen(0); + state->m_tilemap_1->set_transparent_pen(0); + state->m_tilemap_2->set_transparent_pen(0); - state->m_tmpbitmap0 = auto_bitmap_alloc(machine,32,32, machine.primary_screen->format()); - state->m_tmpbitmap1 = auto_bitmap_alloc(machine,32,32, machine.primary_screen->format()); + state->m_tmpbitmap0 = auto_bitmap_ind16_alloc(machine,32,32); + state->m_tmpbitmap1 = auto_bitmap_ind16_alloc(machine,32,32); } /*************************************************************************** @@ -213,7 +213,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { realbrk_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -222,11 +222,7 @@ int max_x = machine.primary_screen->width(); int max_y = machine.primary_screen->height(); - rectangle spritetile_clip; - spritetile_clip.min_x = 0; - spritetile_clip.min_y = 0; - spritetile_clip.max_x = 31; - spritetile_clip.max_y = 31; + rectangle spritetile_clip(0, 31, 0, 31); for ( offs = 0x3000/2; offs < 0x3600/2; offs += 2/2 ) { @@ -300,9 +296,9 @@ // buffer the tile and rotate it into bitmap if( rot ) { - bitmap_fill( state->m_tmpbitmap0, &spritetile_clip , 0); - bitmap_fill( state->m_tmpbitmap1, &spritetile_clip , 0); - drawgfxzoom_transpen( state->m_tmpbitmap0,&spritetile_clip,machine.gfx[gfx], + state->m_tmpbitmap0->fill(0, spritetile_clip ); + state->m_tmpbitmap1->fill(0, spritetile_clip ); + drawgfxzoom_transpen( *state->m_tmpbitmap0,spritetile_clip,machine.gfx[gfx], code++, color, flipx, flipy, @@ -310,13 +306,13 @@ (rot & 1 ? scaley : scalex) << 12, (rot & 1 ? scalex : scaley) << 12,0); // peek at the unrotated sprite - // copybitmap_trans( bitmap,state->m_tmpbitmap0, 0,0, 50+(x * xdim/0x10000),50+(y * ydim/0x10000), cliprect, 0 ); + // copybitmap_trans( bitmap,*state->m_tmpbitmap0, 0,0, 50+(x * xdim/0x10000),50+(y * ydim/0x10000), cliprect, 0 ); } switch( rot ) { case 0x10: // rot 90 - copyrozbitmap_trans( state->m_tmpbitmap1, NULL, state->m_tmpbitmap0, + copyrozbitmap_trans( *state->m_tmpbitmap1, state->m_tmpbitmap1->cliprect(), *state->m_tmpbitmap0, (UINT32)0<<16, (UINT32)16<<16, 0 << 16, @@ -328,11 +324,11 @@ currx = (sx - (y+1) * ydim) / 0x10000; curry = (sy + x * xdim) / 0x10000; - copybitmap_trans( bitmap,state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copybitmap_trans( bitmap,*state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); break; case 0x20: // rot 180 - copyrozbitmap_trans( state->m_tmpbitmap1, NULL, state->m_tmpbitmap0, + copyrozbitmap_trans( *state->m_tmpbitmap1, state->m_tmpbitmap1->cliprect(), *state->m_tmpbitmap0, (UINT32)16<<16, (UINT32)16<<16, -1 << 16, @@ -344,11 +340,11 @@ currx = (sx - (x+1) * xdim) / 0x10000; curry = (sy - (y+1) * ydim) / 0x10000; - copybitmap_trans( bitmap,state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copybitmap_trans( bitmap,*state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); break; case 0x30: // rot 270 - copyrozbitmap_trans( state->m_tmpbitmap1, NULL, state->m_tmpbitmap0, + copyrozbitmap_trans( *state->m_tmpbitmap1, state->m_tmpbitmap1->cliprect(), *state->m_tmpbitmap0, (UINT32)16<<16, (UINT32)0<<16, 0 << 16, @@ -360,7 +356,7 @@ currx = (sx + y * ydim) / 0x10000; curry = (sy - (x+1) * xdim) / 0x10000; - copybitmap_trans( bitmap,state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); + copybitmap_trans( bitmap,*state->m_tmpbitmap1, 0,0, currx,curry, cliprect, 0 ); break; default: @@ -380,7 +376,7 @@ /* DaiDaiKakumei */ /* layer : 0== bghigh(); UINT16 *spriteram16 = state->m_spriteram; @@ -493,56 +489,56 @@ if (new_data != old_data) { if (offset == 0xa/2) - tilemap_mark_all_tiles_dirty(state->m_tilemap_0); + state->m_tilemap_0->mark_all_dirty(); } } -SCREEN_UPDATE(realbrk) +SCREEN_UPDATE_IND16(realbrk) { - realbrk_state *state = screen->machine().driver_data(); + realbrk_state *state = screen.machine().driver_data(); int layers_ctrl = -1; - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_vregs[0x0/2]); - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_vregs[0x2/2]); + state->m_tilemap_0->set_scrolly(0, state->m_vregs[0x0/2]); + state->m_tilemap_0->set_scrollx(0, state->m_vregs[0x2/2]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_vregs[0x4/2]); - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_vregs[0x6/2]); + state->m_tilemap_1->set_scrolly(0, state->m_vregs[0x4/2]); + state->m_tilemap_1->set_scrollx(0, state->m_vregs[0x6/2]); #ifdef MAME_DEBUG -if ( screen->machine().input().code_pressed(KEYCODE_Z) ) +if ( screen.machine().input().code_pressed(KEYCODE_Z) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif if (state->m_disable_video) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } else - bitmap_fill(bitmap,cliprect,state->m_vregs[0xc/2] & 0x7fff); + bitmap.fill(state->m_vregs[0xc/2] & 0x7fff, cliprect); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->m_tilemap_0,0,0); + if (layers_ctrl & 2) state->m_tilemap_1->draw(bitmap, cliprect, 0,0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0,0); - if (layers_ctrl & 8) draw_sprites(screen->machine(),bitmap,cliprect); + if (layers_ctrl & 8) draw_sprites(screen.machine(),bitmap,cliprect); - if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->m_tilemap_2,0,0); + if (layers_ctrl & 4) state->m_tilemap_2->draw(bitmap, cliprect, 0,0); // popmessage("%04x",state->m_vregs[0x8/2]); return 0; } /* DaiDaiKakumei */ -SCREEN_UPDATE(dai2kaku) +SCREEN_UPDATE_IND16(dai2kaku) { - realbrk_state *state = screen->machine().driver_data(); + realbrk_state *state = screen.machine().driver_data(); int layers_ctrl = -1; int offs, bgx0, bgy0, bgx1, bgy1; @@ -552,80 +548,80 @@ bgx1 = state->m_vregs[0x6/2]; // bg0 - tilemap_set_scroll_rows(state->m_tilemap_0,512); - tilemap_set_scroll_cols(state->m_tilemap_0,1); + state->m_tilemap_0->set_scroll_rows(512); + state->m_tilemap_0->set_scroll_cols(1); if( state->m_vregs[8/2] & (0x0100)){ for(offs=0; offs<(512); offs++) { - tilemap_set_scrollx( state->m_tilemap_0, offs, bgx0 - (state->m_vram_1ras[offs]&0x3ff) ); + state->m_tilemap_0->set_scrollx(offs, bgx0 - (state->m_vram_1ras[offs]&0x3ff) ); } } else { for(offs=0; offs<(512); offs++) { - tilemap_set_scrollx( state->m_tilemap_0, offs, bgx0 ); + state->m_tilemap_0->set_scrollx(offs, bgx0 ); } } - tilemap_set_scrolly( state->m_tilemap_0, 0, bgy0 ); + state->m_tilemap_0->set_scrolly(0, bgy0 ); // bg1 - tilemap_set_scroll_rows(state->m_tilemap_1,512); - tilemap_set_scroll_cols(state->m_tilemap_1,1); + state->m_tilemap_1->set_scroll_rows(512); + state->m_tilemap_1->set_scroll_cols(1); if( state->m_vregs[8/2] & (0x0001)){ for(offs=0; offs<(512); offs++) { - tilemap_set_scrollx( state->m_tilemap_1, offs, bgx1 - (state->m_vram_1ras[offs]&0x3ff) ); + state->m_tilemap_1->set_scrollx(offs, bgx1 - (state->m_vram_1ras[offs]&0x3ff) ); } } else { for(offs=0; offs<(512); offs++) { - tilemap_set_scrollx( state->m_tilemap_1, offs, bgx1 ); + state->m_tilemap_1->set_scrollx(offs, bgx1 ); } } - tilemap_set_scrolly( state->m_tilemap_1, 0, bgy1 ); + state->m_tilemap_1->set_scrolly(0, bgy1 ); #ifdef MAME_DEBUG -if ( screen->machine().input().code_pressed(KEYCODE_Z) ) +if ( screen.machine().input().code_pressed(KEYCODE_Z) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif if (state->m_disable_video) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } else - bitmap_fill(bitmap,cliprect,state->m_vregs[0xc/2] & 0x7fff); + bitmap.fill(state->m_vregs[0xc/2] & 0x7fff, cliprect); // spr 0 - if (layers_ctrl & 8) dai2kaku_draw_sprites(screen->machine(),bitmap,cliprect,2); + if (layers_ctrl & 8) dai2kaku_draw_sprites(screen.machine(),bitmap,cliprect,2); // bglow if( state->m_vregs[8/2] & (0x8000)){ - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->m_tilemap_0,0,0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0,0); } else { - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); + if (layers_ctrl & 2) state->m_tilemap_1->draw(bitmap, cliprect, 0,0); } // spr 1 - if (layers_ctrl & 8) dai2kaku_draw_sprites(screen->machine(),bitmap,cliprect,1); + if (layers_ctrl & 8) dai2kaku_draw_sprites(screen.machine(),bitmap,cliprect,1); // bghigh if( state->m_vregs[8/2] & (0x8000)){ - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); + if (layers_ctrl & 2) state->m_tilemap_1->draw(bitmap, cliprect, 0,0); } else { - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->m_tilemap_0,0,0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0,0); } // spr 2 - if (layers_ctrl & 8) dai2kaku_draw_sprites(screen->machine(),bitmap,cliprect,0); + if (layers_ctrl & 8) dai2kaku_draw_sprites(screen.machine(),bitmap,cliprect,0); // fix - if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->m_tilemap_2,0,0); + if (layers_ctrl & 4) state->m_tilemap_2->draw(bitmap, cliprect, 0,0); // usrintf_showmessage("%04x",state->m_vregs[0x8/2]); return 0; diff -Nru mame-0.144/src/mame/video/redalert.c mame-0.145/src/mame/video/redalert.c --- mame-0.144/src/mame/video/redalert.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/redalert.c 2012-02-06 21:30:33.000000000 +0000 @@ -186,13 +186,13 @@ * *************************************/ -static SCREEN_UPDATE( redalert ) +static SCREEN_UPDATE_RGB32( redalert ) { - redalert_state *state = screen->machine().driver_data(); + redalert_state *state = screen.machine().driver_data(); pen_t pens[NUM_CHARMAP_PENS + NUM_BITMAP_PENS + 1]; offs_t offs; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); for (offs = 0; offs < 0x2000; offs++) { @@ -235,9 +235,9 @@ pen = pens[((charmap_code & 0xfe) << 1) | color_prom_a0_a1]; if ((*state->m_video_control ^ state->m_control_xor) & 0x04) - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; else - *BITMAP_ADDR32(bitmap, y ^ 0xff, x ^ 0xff) = pen; + bitmap.pix32(y ^ 0xff, x ^ 0xff) = pen; /* next pixel */ x = x + 1; @@ -259,13 +259,13 @@ * *************************************/ -static SCREEN_UPDATE( demoneye ) +static SCREEN_UPDATE_RGB32( demoneye ) { - redalert_state *state = screen->machine().driver_data(); + redalert_state *state = screen.machine().driver_data(); pen_t pens[NUM_CHARMAP_PENS + NUM_BITMAP_PENS + 1]; offs_t offs; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); for (offs = 0; offs < 0x2000; offs++) { @@ -312,9 +312,9 @@ pen = pens[((charmap_code & 0xfe) << 1) | color_prom_a0_a1]; if (*state->m_video_control & 0x04) - *BITMAP_ADDR32(bitmap, y ^ 0xff, x ^ 0xff) = pen; + bitmap.pix32(y ^ 0xff, x ^ 0xff) = pen; else - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; /* next pixel */ x = x + 1; @@ -334,13 +334,13 @@ * *************************************/ -static SCREEN_UPDATE( panther ) +static SCREEN_UPDATE_RGB32( panther ) { - redalert_state *state = screen->machine().driver_data(); + redalert_state *state = screen.machine().driver_data(); pen_t pens[NUM_CHARMAP_PENS + NUM_BITMAP_PENS + 1]; offs_t offs; - get_panther_pens(screen->machine(), pens); + get_panther_pens(screen.machine(), pens); for (offs = 0; offs < 0x2000; offs++) { @@ -383,9 +383,9 @@ pen = pens[((charmap_code & 0xfe) << 1) | color_prom_a0_a1]; if ((*state->m_video_control ^ state->m_control_xor) & 0x04) - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; else - *BITMAP_ADDR32(bitmap, y ^ 0xff, x ^ 0xff) = pen; + bitmap.pix32(y ^ 0xff, x ^ 0xff) = pen; /* next pixel */ x = x + 1; @@ -408,12 +408,11 @@ static MACHINE_CONFIG_FRAGMENT( redalert_video_common ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(redalert) + MCFG_SCREEN_UPDATE_STATIC(redalert) MACHINE_CONFIG_END MACHINE_CONFIG_FRAGMENT( redalert_video ) @@ -441,12 +440,11 @@ MCFG_VIDEO_START(redalert) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(demoneye) + MCFG_SCREEN_UPDATE_STATIC(demoneye) MACHINE_CONFIG_END @@ -455,11 +453,10 @@ MCFG_VIDEO_START(ww3) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_RGB32) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) - MCFG_SCREEN_UPDATE(panther) + MCFG_SCREEN_UPDATE_STATIC(panther) MACHINE_CONFIG_END diff -Nru mame-0.144/src/mame/video/redclash.c mame-0.145/src/mame/video/redclash.c --- mame-0.144/src/mame/video/redclash.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/redclash.c 2012-02-06 21:30:31.000000000 +0000 @@ -104,7 +104,7 @@ ladybug_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( redclash_gfxbank_w ) @@ -114,7 +114,7 @@ if (state->m_gfxbank != (data & 0x01)) { state->m_gfxbank = data & 0x01; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -180,10 +180,10 @@ ladybug_state *state = machine.driver_data(); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ladybug_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -267,7 +267,7 @@ } } -static void draw_bullets( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_bullets( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ladybug_state *state = machine.driver_data(); int offs; @@ -283,9 +283,8 @@ sx = 240 - sx; } - if (sx >= cliprect->min_x && sx <= cliprect->max_x && - sy >= cliprect->min_y && sy <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, sy, sx) = 0x19; + if (cliprect.contains(sx, sy)) + bitmap.pix16(sy, sx) = 0x19; } } @@ -315,7 +314,7 @@ } /* This sets up which starfield to draw and the offset, */ -/* To be called from SCREEN_EOF() */ +/* To be called from SCREEN_VBLANK() */ void redclash_update_stars_state( running_machine &machine ) { @@ -360,7 +359,7 @@ /* Space Raider doesn't use the Va bit, and it is also set up to */ /* window the stars to a certain x range */ -void redclash_draw_stars( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 palette_offset, UINT8 sraider, UINT8 firstx, UINT8 lastx ) +void redclash_draw_stars( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 palette_offset, UINT8 sraider, UINT8 firstx, UINT8 lastx ) { ladybug_state *redclash = machine.driver_data(); int i; @@ -396,7 +395,7 @@ else vcond = yloc & 0x01; - if (xloc >= cliprect->min_x && xloc <= cliprect->max_x && yloc >= cliprect->min_y && yloc <= cliprect->max_y) + if (cliprect.contains(xloc, yloc)) { if ((hcond ^ vcond) == 0) { @@ -407,7 +406,7 @@ if ((xloc >= firstx) && (xloc <= lastx)) { star_color = (state >> 9) & 0x1f; - *BITMAP_ADDR16(bitmap, yloc, xloc) = palette_offset + star_color; + bitmap.pix16(yloc, xloc) = palette_offset + star_color; } } } @@ -418,19 +417,21 @@ } } -SCREEN_EOF( redclash ) +SCREEN_VBLANK( redclash ) { - redclash_update_stars_state(machine); + // falling edge + if (!vblank_on) + redclash_update_stars_state(screen.machine()); } -SCREEN_UPDATE( redclash ) +SCREEN_UPDATE_IND16( redclash ) { - ladybug_state *state = screen->machine().driver_data(); + ladybug_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - redclash_draw_stars(screen->machine(), bitmap, cliprect, 0x60, 0, 0x00, 0xff); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bullets(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + redclash_draw_stars(screen.machine(), bitmap, cliprect, 0x60, 0, 0x00, 0xff); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_bullets(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/relief.c mame-0.145/src/mame/video/relief.c --- mame-0.144/src/mame/video/relief.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/relief.c 2012-02-06 21:30:31.000000000 +0000 @@ -94,7 +94,7 @@ /* initialize the second playfield */ state->m_playfield2_tilemap = tilemap_create(machine, get_playfield2_tile_info, tilemap_scan_cols, 8,8, 64,64); - tilemap_set_transparent_pen(state->m_playfield2_tilemap, 0); + state->m_playfield2_tilemap->set_transparent_pen(0); /* initialize the motion objects */ atarimo_init(machine, 0, &modesc); @@ -108,27 +108,27 @@ * *************************************/ -SCREEN_UPDATE( relief ) +SCREEN_UPDATE_IND16( relief ) { - relief_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + relief_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 0, 1); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 0, 1); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; - UINT8 *pri = (UINT8 *)priority_bitmap->base + priority_bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/renegade.c mame-0.145/src/mame/video/renegade.c --- mame-0.144/src/mame/video/renegade.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/renegade.c 2012-02-06 21:30:31.000000000 +0000 @@ -14,7 +14,7 @@ UINT8 *videoram = state->m_videoram; videoram[offset] = data; offset = offset % (64 * 16); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( renegade_videoram2_w ) @@ -22,7 +22,7 @@ renegade_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; offset = offset % (32 * 32); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( renegade_flipscreen_w ) @@ -73,13 +73,13 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tilemap_info, tilemap_scan_rows, 16, 16, 64, 16); state->m_fg_tilemap = tilemap_create(machine, get_fg_tilemap_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_bg_tilemap, 256, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_scrolldx(256, 0); state_save_register_global(machine, state->m_scrollx); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { renegade_state *state = machine.driver_data(); UINT8 *source = state->m_spriteram; @@ -131,12 +131,12 @@ } } -SCREEN_UPDATE( renegade ) +SCREEN_UPDATE_IND16( renegade ) { - renegade_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 , 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0 , 0); + renegade_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx); + state->m_bg_tilemap->draw(bitmap, cliprect, 0 , 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0 , 0); return 0; } diff -Nru mame-0.144/src/mame/video/retofinv.c mame-0.145/src/mame/video/retofinv.c --- mame-0.144/src/mame/video/retofinv.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/retofinv.c 2012-02-06 21:30:32.000000000 +0000 @@ -86,7 +86,7 @@ retofinv_state *state = machine.driver_data(); int color = state->m_fg_videoram[0x400 + tile_index]; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO( 0, @@ -124,14 +124,14 @@ { retofinv_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( retofinv_fg_videoram_w ) { retofinv_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( retofinv_gfx_ctrl_w ) @@ -147,7 +147,7 @@ if (state->m_fg_bank != (data & 1)) { state->m_fg_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } break; @@ -155,7 +155,7 @@ if (state->m_bg_bank != (data & 1)) { state->m_bg_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } break; } @@ -169,18 +169,14 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap) { retofinv_state *state = machine.driver_data(); UINT8 *spriteram = state->m_sharedram + 0x0780; UINT8 *spriteram_2 = state->m_sharedram + 0x0f80; UINT8 *spriteram_3 = state->m_sharedram + 0x1780; int offs; - static const rectangle spritevisiblearea = - { - 2*8, 34*8-1, - 0*8, 28*8-1 - }; + const rectangle spritevisiblearea(2*8, 34*8-1, 0*8, 28*8-1); for (offs = 0;offs < 0x80;offs += 2) { @@ -216,7 +212,7 @@ { for (x = 0;x <= sizex;x++) { - drawgfx_transmask(bitmap,&spritevisiblearea,machine.gfx[1], + drawgfx_transmask(bitmap,spritevisiblearea,machine.gfx[1], sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)], color, flipx,flipy, @@ -229,11 +225,11 @@ -SCREEN_UPDATE( retofinv ) +SCREEN_UPDATE_IND16( retofinv ) { - retofinv_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + retofinv_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/rltennis.c mame-0.145/src/mame/video/rltennis.c --- mame-0.144/src/mame/video/rltennis.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rltennis.c 2012-02-06 21:30:31.000000000 +0000 @@ -122,13 +122,13 @@ { if(new_data & BLTFLAG_DISPLAY_UD) { - copybitmap(state->m_tmp_bitmap[BITMAP_FG_DISPLAY], state->m_tmp_bitmap[BITMAP_FG_1], 0, 0, 0, 0, NULL); - bitmap_fill(state->m_tmp_bitmap[BITMAP_FG_1], NULL, 0); + copybitmap(*state->m_tmp_bitmap[BITMAP_FG_DISPLAY], *state->m_tmp_bitmap[BITMAP_FG_1], 0, 0, 0, 0, state->m_tmp_bitmap[BITMAP_FG_DISPLAY]->cliprect()); + state->m_tmp_bitmap[BITMAP_FG_1]->fill(0); } else { - copybitmap(state->m_tmp_bitmap[BITMAP_FG_DISPLAY], state->m_tmp_bitmap[BITMAP_FG_2], 0, 0, 0, 0, NULL); - bitmap_fill(state->m_tmp_bitmap[BITMAP_FG_2], NULL, 0); + copybitmap(*state->m_tmp_bitmap[BITMAP_FG_DISPLAY], *state->m_tmp_bitmap[BITMAP_FG_2], 0, 0, 0, 0, state->m_tmp_bitmap[BITMAP_FG_DISPLAY]->cliprect()); + state->m_tmp_bitmap[BITMAP_FG_2]->fill(0); } } @@ -214,64 +214,26 @@ if((pix || force_blit)&& screen_x >0 && y >0 && screen_x < 512 && y < 256 ) { - *BITMAP_ADDR16(state->m_tmp_bitmap[layer], y , screen_x ) = pix; + state->m_tmp_bitmap[layer]->pix16(y , screen_x ) = pix; } } } } } -WRITE16_HANDLER(rlt_ramdac_address_wm_w ) -{ - rltennis_state *state = space->machine().driver_data(); - state->m_palpos_w = data*3; -} - -WRITE16_HANDLER(rlt_ramdac_address_rm_w ) -{ - rltennis_state *state = space->machine().driver_data(); - state->m_palpos_r = data*3; -} - -WRITE16_HANDLER( rlt_ramdac_data_w ) -{ - rltennis_state *state = space->machine().driver_data(); - int color=state->m_palpos_w/3; - state->m_palette[state->m_palpos_w] = data & 0xff; - ++state->m_palpos_w; - - state->m_palpos_w %=256*3; - - { - int r = state->m_palette[color*3]; - int g = state->m_palette[color*3+1]; - int b = state->m_palette[color*3+2]; - palette_set_color(space->machine(), color, MAKE_RGB(r,g,b)); - } -} - -READ16_HANDLER( rlt_ramdac_data_r ) -{ - rltennis_state *state = space->machine().driver_data(); - int data=state->m_palette[state->m_palpos_r]; - ++state->m_palpos_r; - state->m_palpos_r %=256*3; - return data; -} - VIDEO_START( rltennis ) { rltennis_state *state = machine.driver_data(); - state->m_tmp_bitmap[BITMAP_BG] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); - state->m_tmp_bitmap[BITMAP_FG_1] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); - state->m_tmp_bitmap[BITMAP_FG_2] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); - state->m_tmp_bitmap[BITMAP_FG_DISPLAY] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); + state->m_tmp_bitmap[BITMAP_BG] = auto_bitmap_ind16_alloc(machine, 512, 256); + state->m_tmp_bitmap[BITMAP_FG_1] = auto_bitmap_ind16_alloc(machine, 512, 256); + state->m_tmp_bitmap[BITMAP_FG_2] = auto_bitmap_ind16_alloc(machine, 512, 256); + state->m_tmp_bitmap[BITMAP_FG_DISPLAY] = auto_bitmap_ind16_alloc(machine, 512, 256); } -SCREEN_UPDATE( rltennis ) +SCREEN_UPDATE_IND16( rltennis ) { - rltennis_state *state = screen->machine().driver_data(); - copybitmap(bitmap, state->m_tmp_bitmap[BITMAP_BG], 0, 0, 0, 0, cliprect); - copybitmap_trans(bitmap, state->m_tmp_bitmap[BITMAP_FG_DISPLAY], 0, 0, 0, 0, cliprect, 0); + rltennis_state *state = screen.machine().driver_data(); + copybitmap(bitmap, *state->m_tmp_bitmap[BITMAP_BG], 0, 0, 0, 0, cliprect); + copybitmap_trans(bitmap, *state->m_tmp_bitmap[BITMAP_FG_DISPLAY], 0, 0, 0, 0, cliprect, 0); return 0; } diff -Nru mame-0.144/src/mame/video/rockrage.c mame-0.145/src/mame/video/rockrage.c --- mame-0.144/src/mame/video/rockrage.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rockrage.c 2012-02-06 21:30:32.000000000 +0000 @@ -85,7 +85,7 @@ rockrage_state *state = space->machine().driver_data(); if ((data & 0x0c) != (state->m_vreg & 0x0c)) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_vreg = data; } @@ -96,16 +96,16 @@ ***************************************************************************/ -SCREEN_UPDATE( rockrage ) +SCREEN_UPDATE_IND16( rockrage ) { - rockrage_state *state = screen->machine().driver_data(); + rockrage_state *state = screen.machine().driver_data(); - set_pens(screen->machine()); + set_pens(screen.machine()); k007342_tilemap_update(state->m_k007342); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen->machine().gfx[1]); + k007420_sprites_draw(state->m_k007420, bitmap, cliprect, screen.machine().gfx[1]); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 0, 1 | TILEMAP_DRAW_OPAQUE, 0); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 1, 0, 0); k007342_tilemap_draw(state->m_k007342, bitmap, cliprect, 1, 1, 0); diff -Nru mame-0.144/src/mame/video/rocnrope.c mame-0.145/src/mame/video/rocnrope.c --- mame-0.144/src/mame/video/rocnrope.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rocnrope.c 2012-02-06 21:30:33.000000000 +0000 @@ -86,14 +86,14 @@ { rocnrope_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( rocnrope_colorram_w ) { rocnrope_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( rocnrope_flipscreen_w ) @@ -101,7 +101,7 @@ if (flip_screen_get(space->machine()) != (~data & 0x01)) { flip_screen_set(space->machine(), ~data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -122,7 +122,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { rocnrope_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -142,10 +142,10 @@ } } -SCREEN_UPDATE( rocnrope ) +SCREEN_UPDATE_IND16( rocnrope ) { - rocnrope_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + rocnrope_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/rohga.c mame-0.145/src/mame/video/rohga.c --- mame-0.144/src/mame/video/rohga.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/rohga.c 2012-02-06 21:30:31.000000000 +0000 @@ -7,7 +7,7 @@ #include "emu.h" #include "includes/rohga.h" #include "video/deco16ic.h" - +#include "video/decospr.h" WRITE16_HANDLER( rohga_buffer_spriteram16_w ) { @@ -23,416 +23,63 @@ rohga_state *state = machine.driver_data(); state->m_spriteram = auto_alloc_array(machine, UINT16, 0x800/2); state->save_pointer(NAME(state->m_spriteram), 0x800/2); + machine.device("spritegen1")->set_col_callback(rohga_col_callback); + machine.device("spritegen1")->set_pri_callback(rohga_pri_callback); } -/******************************************************************************/ - -static void rohga_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT16 *spriteptr, int is_schmeisr ) +VIDEO_START( schmeisr ) { - int offs; - - for (offs = 0x400 - 4; offs >= 0; offs -= 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult, pri = 0; - sprite = spriteptr[offs + 1]; - if (!sprite) - continue; - - x = spriteptr[offs + 2]; - - /* Sprite/playfield priority */ - switch (x & 0x6000) - { - case 0x0000: pri = 0; break; - case 0x4000: pri = 0xf0; break; - case 0x6000: pri = 0xf0 | 0xcc; break; - case 0x2000: pri = 0;//0xf0|0xcc; break; /* Perhaps 0xf0|0xcc|0xaa (Sprite under bottom layer) */ - } - - y = spriteptr[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - // Sprite colour is different between Rohga (6bpp) and Schmeisr (4bpp plus wire mods on pcb) - if (is_schmeisr) - { - colour = ((x >> 9) & 0xf) << 2; - if (x & 0x8000) - colour++; - } - else - { - colour = (x >> 9) & 0xf; - } - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - - sprite &= ~multi; - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (flip_screen_get(machine)) - { - x = 304 - x; - y = 240 - y; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = -16; - } - else - mult = +16; - - while (multi >= 0) - { - pdrawgfx_transpen(bitmap,cliprect,machine.gfx[3], - sprite - multi * inc, - colour, - fx,fy, - x,y + mult * multi, - machine.priority_bitmap,pri,0); - - multi--; - } - } + VIDEO_START_CALL( rohga ); + // wire mods on pcb.. + machine.device("spritegen1")->set_col_callback(schmeisr_col_callback); } -static void wizdfire_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16 *spriteptr, int mode, int bank ) -{ - int offs; - for (offs = 0; offs < 0x400; offs += 4) +UINT16 rohga_pri_callback(UINT16 x) +{ + switch (x & 0x6000) { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - int alpha = 0xff; - - sprite = spriteptr[offs + 1]; - if (!sprite) - continue; - - x = spriteptr[offs + 2]; - - /* - Sprite/playfield priority - we can't use pdrawgfx because we need alpha'd sprites overlaid - over non-alpha'd sprites, plus sprites underneath and above an alpha'd background layer. - - Hence, we rely on the hardware sorting everything correctly and not relying on any orthoganality - effects (it doesn't seem to), and instead draw separate passes for each sprite priority. :( - */ - switch (mode) - { - case 4: - if ((x & 0xc000) != 0xc000) - continue; - break; - case 3: - if ((x & 0xc000) != 0x8000) - continue; - break; - case 2: - if ((x & 0x8000) != 0x8000) - continue; - break; - case 1: - case 0: - default: - if ((x & 0x8000) != 0) - continue; - break; - } - - y = spriteptr[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - colour = (x >> 9) & 0x1f; - - if (bank == 4 && colour & 0x10) - { - alpha = 0x80; - colour &= 0xf; - } - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - - sprite &= ~multi; - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (flip_screen_get(machine)) - { - x = 304 - x; - y = 240 - y; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = -16; - } - else - mult = +16; - - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - - while (multi >= 0) - { - drawgfx_alpha(bitmap,cliprect,machine.gfx[bank], - sprite - multi * inc, - colour, - fx,fy, - x,y + mult * multi, - 0,alpha); - - multi--; - } + case 0x0000: return 0; + case 0x4000: return 0xf0; + case 0x6000: return 0xf0 | 0xcc; + case 0x2000: return 0;//0xf0|0xcc; /* Perhaps 0xf0|0xcc|0xaa (Sprite under bottom layer) */ } + + return 0; } -static void nitrobal_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT16 *spriteptr, int gfxbank ) +UINT16 schmeisr_col_callback(UINT16 x) { - rohga_state *state = machine.driver_data(); - int offs, end, inc; - UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); - - /* - Alternate format from most 16 bit games - same as Captain America and Mutant Fighter - - Word 0: - 0x8000: Y flip - 0x4000: X flip - 0x2000: Flash (Sprite toggles on/off every frame) - 0x1fff: Y value - Word 1: - 0xffff: X value - Word 2: - 0xf000: Block height - 0x0f00: Block width - 0x00e0: Unused? - -sprites1: - bit 0x40 set for under PF2 - bit 0x20 set on others... - bit 0x80 set in game pf3 (split) - -Sprites 2: - bit 0x10 set on alpha sprites.. - bit 0x80 set is above pf2 else under pf2 - - 0x001f: Colour - Word 3: - 0xffff: Sprite value - */ - - offs = 0x3fc; - end = -4; - inc = -4; - - while (offs != end) - { - int x, y, sprite, colour, fx, fy, w, h, sx, sy, x_mult, y_mult, tilemap_pri, sprite_pri; - int alpha = 0xff; - - sprite = spriteptr[offs + 3]; - if (!sprite) - { - offs += inc; - continue; - } - - sx = spriteptr[offs + 1]; + UINT16 colour = ((x >> 9) & 0xf) << 2; + if (x & 0x8000) + colour++; - h = (spriteptr[offs + 2] & 0xf000) >> 12; - w = (spriteptr[offs + 2] & 0x0f00) >> 8; - - sy = spriteptr[offs]; - if ((sy & 0x2000) && (machine.primary_screen->frame_number() & 1)) - { - offs += inc; - continue; - } - - colour = (spriteptr[offs + 2] >> 0) & 0x1f; - - // PRIORITIES - TODO - if (gfxbank == 3) - { - /* Sprite chip 1 */ - switch (spriteptr[offs + 2] & 0xe0) - { -// case 0xc0: colour = rand()%0xff; tilemap_pri = 256; break; //todo - case 0xc0: tilemap_pri = 8; break; //? under other sprites - case 0x80: tilemap_pri = 32; break; //? under other sprites - case 0x20: tilemap_pri = 32; break; /* Over pf2 and under other sprite chip */ - case 0x40: tilemap_pri = 8; break; /* Under pf2 and under other sprite chip */ - case 0xa0: tilemap_pri = 32; break; - case 0: - tilemap_pri = 128; break; - default: - tilemap_pri = 128; - break; - } - -/* -Intro: - 0x40 is under pf2 and other sprites - 0x20 is under pf2 - -Level 1 - 0xa0 means under other sprites and pf2? - -Level 2 (tank scene) - - Chip 1: - - 0x20 set means under pf2 else above?? - 0x80 set means under other sprites else above - -Level 3: - 0xc0 means under other sprites and pf2 check?? - 0x40 means under pf2 - 0xa0 means under pf2.. - - always over other sprites..? - - -PRI MODE 2: (Level 4) -sprite 1: - mode 0xa0 is under pf2 (sprites unknown) - mode 0x40 is under pf2 (sprites unknown) - -sprite 2: - - mode 0x40 is under pf2 - mode 0 is under pf2 - - -Level 5 (Space, pri mode 1) - -sprite 1: - mode 0x80 is over pf2 and over other sprites - - - -sprite 2: - - mode 0 is over pf2 - - */ - - sprite_pri = 1; - } - else - { - /* Sprite chip 2 (with alpha blending) */ - - /* Sprite above playfield 2, but still below other sprite chip */ -// if (spriteptr[offs + 2] & 0x80) - tilemap_pri = 64; -// else -// tilemap_pri = 8; - - if (priority) - tilemap_pri = 8; - else - tilemap_pri = 64; - - sprite_pri = 2; - } - - if (gfxbank == 4 && colour & 0x10) - { - alpha = 0x80; - colour &= 0xf; - } - - fx = (spriteptr[offs + 0] & 0x4000); - fy = (spriteptr[offs + 0] & 0x8000); - - if (!flip_screen_get(machine)) - { /* Inverted from Mutant Fighter! */ - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - - sx = sx & 0x01ff; - sy = sy & 0x01ff; - if (sx > 0x180) sx = -(0x200 - sx); - if (sy > 0x180) sy = -(0x200 - sy); + return colour; +} - if (fx) { x_mult = -16; sx += 16 * w; } else { x_mult = 16; sx -= 16; } - if (fy) { y_mult = -16; sy += 16 * h; } else { y_mult = 16; sy -= 16; } - } - else - { - sx = sx & 0x01ff; - sy = sy & 0x01ff; - if (sx & 0x100) sx = -(0x100 - (sx & 0xff)); - if (sy & 0x100) sy = -(0x100 - (sy & 0xff)); - sx = 304 - sx; - sy = 240 - sy; - if (sx >= 432) sx -= 512; - if (sy >= 384) sy -= 512; - if (fx) { x_mult = -16; sx += 16; } else { x_mult = 16; sx -= 16 * w; } - if (fy) { y_mult = -16; sy += 16; } else { y_mult = 16; sy -= 16 * h; } - } +UINT16 rohga_col_callback(UINT16 x) +{ + return (x >> 9) & 0xf; +} - for (x = 0; x < w; x++) - { - for (y = 0; y < h; y++) - { - decocomn_pdrawgfx( - state->m_decocomn, - bitmap,cliprect,machine.gfx[gfxbank], - sprite + y + h * x, - colour, - fx,fy, - sx + x_mult * (w-x),sy + y_mult * (h-y), - 0,tilemap_pri,sprite_pri,1,alpha); - } - } - offs += inc; - } -} /******************************************************************************/ -static void update_rohga( device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int is_schmeisr ) +SCREEN_UPDATE_IND16( rohga ) { - rohga_state *state = screen->machine().driver_data(); + rohga_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); /* Update playfields */ - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, screen->machine().pens[768]); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(screen.machine().pens[768], cliprect); switch (priority & 3) { @@ -462,78 +109,131 @@ break; } - rohga_draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, is_schmeisr); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, true); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); + + return 0; } -SCREEN_UPDATE( rohga ) + + +VIDEO_START(wizdfire) { - update_rohga(screen, bitmap, cliprect, 0); - return 0; + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); } -SCREEN_UPDATE( schmeisr ) +// not amazingly efficient, called multiple times to pull a layer out of the sprite bitmaps, but keeps correct sprite<->sprite priorities +static void mixwizdfirelayer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int gfxregion, UINT16 pri, UINT16 primask) { - // The Schmeisr pcb has wire mods which seem to remap sprite palette indices. - // Otherwise video update is the same as Rohga. - update_rohga(screen, bitmap, cliprect, 1); - return 0; + int y, x; + const pen_t *paldata = machine.pens; + bitmap_ind16* sprite_bitmap; + int penbase; + + sprite_bitmap = &machine.device("spritegen2")->get_sprite_temp_bitmap(); + penbase = 0x600; + + UINT16* srcline; + UINT32* dstline; + + + for (y=cliprect.min_y;y<=cliprect.max_y;y++) + { + srcline=&sprite_bitmap->pix16(y,0); + dstline=&bitmap.pix32(y,0); + + for (x=cliprect.min_x;x<=cliprect.max_x;x++) + { + UINT16 pix = srcline[x]; + + if ((pix & primask) != pri) + continue; + + if (pix&0xf) + { + UINT16 pen = pix&0x1ff; + + if (pen&0x100) + { + UINT32 base = dstline[x]; + pen &=0xff; + dstline[x] = alpha_blend_r32(base, paldata[pen+penbase], 0x80); + } + else + { + dstline[x] = paldata[pen+penbase]; + } + } + } + } } -SCREEN_UPDATE( wizdfire ) +SCREEN_UPDATE_RGB32( wizdfire ) { - rohga_state *state = screen->machine().driver_data(); + rohga_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); UINT16 priority = decocomn_priority_r(state->m_decocomn, 0, 0xffff); + /* draw sprite gfx to temp bitmaps */ + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u16, 0x400, true); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, true); + /* Update playfields */ - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, 0, 0); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields - Palette of 2nd playfield chip visible if playfields turned off */ - bitmap_fill(bitmap, cliprect, screen->machine().pens[512]); + bitmap.fill(screen.machine().pens[512], cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - wizdfire_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 4, 3); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0600, 0x0600, 0x400, 0x1ff); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - wizdfire_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 3, 3); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0400, 0x0600, 0x400, 0x1ff); if ((priority & 0x1f) == 0x1f) /* Wizdfire has bit 0x40 always set, Dark Seal 2 doesn't?! */ deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_ALPHA(0x80), 0); else deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); - /* See notes in wizdfire_draw_sprites about this */ - wizdfire_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0, 3); - wizdfire_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u16, 2, 4); - wizdfire_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u16, 1, 4); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0400, 0x400, 0x1ff); // 0x000 and 0x200 of 0x600 + + mixwizdfirelayer(screen.machine(), bitmap, cliprect, 4, 0x000, 0x000); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( nitrobal ) +SCREEN_UPDATE_RGB32( nitrobal ) { - rohga_state *state = screen->machine().driver_data(); + rohga_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); + /* draw sprite gfx to temp bitmaps */ + screen.machine().device("spritegen1")->set_alt_format(true); + screen.machine().device("spritegen2")->set_alt_format(true); + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram2.u16, 0x400, false); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0x400, false); + /* Update playfields */ - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll); /* Draw playfields - Palette of 2nd playfield chip visible if playfields turned off */ - bitmap_fill(bitmap, cliprect, screen->machine().pens[512]); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); - decocomn_clear_sprite_priority_bitmap(state->m_decocomn); + bitmap.fill(screen.machine().pens[512], cliprect); + screen.machine().priority_bitmap.fill(0); /* pf3 and pf4 are combined into a single 8bpp bitmap */ deco16ic_tilemap_12_combine_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 16); - nitrobal_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 3); - nitrobal_draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram2.u16, 4); + + /* ToDo reimplement priorities + mixing / alpha, it was busted worse than this before anyway, so no big loss that we don't do it for now ;-) */ + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 0x600, 0xff); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 0x400, 0x1ff); + deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; diff -Nru mame-0.144/src/mame/video/rollerg.c mame-0.145/src/mame/video/rollerg.c --- mame-0.144/src/mame/video/rollerg.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rollerg.c 2012-02-06 21:30:32.000000000 +0000 @@ -59,13 +59,13 @@ ***************************************************************************/ -SCREEN_UPDATE( rollerg ) +SCREEN_UPDATE_IND16( rollerg ) { - rollerg_state *state = screen->machine().driver_data(); + rollerg_state *state = screen.machine().driver_data(); int bg_colorbase = 16; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k051316_zoom_draw(state->m_k051316, bitmap, cliprect, 0, 1); k053245_sprites_draw(state->m_k053244, bitmap, cliprect); return 0; diff -Nru mame-0.144/src/mame/video/rollrace.c mame-0.145/src/mame/video/rollrace.c --- mame-0.144/src/mame/video/rollrace.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/rollrace.c 2012-02-06 21:30:31.000000000 +0000 @@ -101,18 +101,18 @@ state->m_ra_flipx = data & 0x01; } -SCREEN_UPDATE( rollrace ) +SCREEN_UPDATE_IND16( rollrace ) { - rollrace_state *state = screen->machine().driver_data(); + rollrace_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; int sx, sy; int scroll; int col; - const UINT8 *mem = screen->machine().region("user1")->base(); + const UINT8 *mem = screen.machine().region("user1")->base(); /* fill in background colour*/ - bitmap_fill(bitmap,cliprect,state->m_ra_bkgpen); + bitmap.fill(state->m_ra_bkgpen, cliprect); /* draw road */ for (offs = 0x3ff; offs >= 0; offs--) @@ -133,7 +133,7 @@ sy = 31-sy ; drawgfx_transpen(bitmap, - cliprect,screen->machine().gfx[RA_BGCHAR_BASE], + cliprect,screen.machine().gfx[RA_BGCHAR_BASE], mem[offs + ( state->m_ra_bkgpage * 1024 )] + ((( mem[offs + 0x4000 + ( state->m_ra_bkgpage * 1024 )] & 0xc0 ) >> 6 ) * 256 ) , state->m_ra_bkgcol, @@ -171,7 +171,7 @@ if(bank) bank += state->m_ra_spritebank; - drawgfx_transpen(bitmap, cliprect,screen->machine().gfx[ RA_SP_BASE + bank ], + drawgfx_transpen(bitmap, cliprect,screen.machine().gfx[ RA_SP_BASE + bank ], spriteram[offs+1] & 0x3f , spriteram[offs+2] & 0x1f, state->m_ra_flipx,!(s_flipy^state->m_ra_flipy), @@ -199,7 +199,7 @@ if (state->m_ra_flipx) sx = 31 - sx; - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[RA_FGCHAR_BASE + state->m_ra_chrbank] , + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[RA_FGCHAR_BASE + state->m_ra_chrbank] , state->m_videoram[ offs ] , col, state->m_ra_flipx,state->m_ra_flipy, diff -Nru mame-0.144/src/mame/video/route16.c mame-0.145/src/mame/video/route16.c --- mame-0.144/src/mame/video/route16.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/route16.c 2012-02-06 21:30:31.000000000 +0000 @@ -70,13 +70,13 @@ * a black output. */ -SCREEN_UPDATE( route16 ) +SCREEN_UPDATE_RGB32( route16 ) { - route16_state *state = screen->machine().driver_data(); + route16_state *state = screen.machine().driver_data(); offs_t offs; - UINT8 *color_prom1 = &screen->machine().region("proms")->base()[0x000]; - UINT8 *color_prom2 = &screen->machine().region("proms")->base()[0x100]; + UINT8 *color_prom1 = &screen.machine().region("proms")->base()[0x000]; + UINT8 *color_prom2 = &screen.machine().region("proms")->base()[0x100]; for (offs = 0; offs < state->m_videoram_size; offs++) { @@ -107,9 +107,9 @@ pen_t pen = route16_make_pen(final_color); if (state->m_flipscreen) - *BITMAP_ADDR32(bitmap, 255 - y, 255 - x) = pen; + bitmap.pix32(255 - y, 255 - x) = pen; else - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data1 = data1 >> 1; @@ -125,8 +125,8 @@ * The Stratovox video connections have been verified from the schematics */ -static int video_update_stratvox_ttmahjng(running_machine &machine, bitmap_t *bitmap, - const rectangle *cliprect, +static int video_update_stratvox_ttmahjng(running_machine &machine, bitmap_rgb32 &bitmap, + const rectangle &cliprect, pen_t (*make_pen)(UINT8)) { route16_state *state = machine.driver_data(); @@ -163,9 +163,9 @@ pen_t pen = make_pen(final_color); if (state->m_flipscreen) - *BITMAP_ADDR32(bitmap, 255 - y, 255 - x) = pen; + bitmap.pix32(255 - y, 255 - x) = pen; else - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; x = x + 1; data1 = data1 >> 1; @@ -177,13 +177,13 @@ } -SCREEN_UPDATE( stratvox ) +SCREEN_UPDATE_RGB32( stratvox ) { - return video_update_stratvox_ttmahjng(screen->machine(), bitmap, cliprect, route16_make_pen); + return video_update_stratvox_ttmahjng(screen.machine(), bitmap, cliprect, route16_make_pen); } -SCREEN_UPDATE( ttmahjng ) +SCREEN_UPDATE_RGB32( ttmahjng ) { - return video_update_stratvox_ttmahjng(screen->machine(), bitmap, cliprect, ttmajng_make_pen); + return video_update_stratvox_ttmahjng(screen.machine(), bitmap, cliprect, ttmajng_make_pen); } diff -Nru mame-0.144/src/mame/video/rpunch.c mame-0.145/src/mame/video/rpunch.c --- mame-0.144/src/mame/video/rpunch.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rpunch.c 2012-02-06 21:30:32.000000000 +0000 @@ -77,7 +77,7 @@ state->m_background[1] = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_cols,8,8,64,64); /* configure the tilemaps */ - tilemap_set_transparent_pen(state->m_background[1],15); + state->m_background[1]->set_transparent_pen(15); if (state->m_bitmapram) memset(state->m_bitmapram, 0xff, state->m_bitmapram_size); @@ -101,7 +101,7 @@ int tmap = offset >> 12; int tile_index = offset & 0xfff; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_background[tmap],tile_index); + state->m_background[tmap]->mark_tile_dirty(tile_index); } @@ -115,9 +115,9 @@ { /* invalidate tilemaps */ if ((oldword ^ state->m_videoflags) & 0x0410) - tilemap_mark_all_tiles_dirty(state->m_background[0]); + state->m_background[0]->mark_all_dirty(); if ((oldword ^ state->m_videoflags) & 0x0820) - tilemap_mark_all_tiles_dirty(state->m_background[1]); + state->m_background[1]->mark_all_dirty(); } } @@ -129,19 +129,19 @@ switch (offset) { case 0: - tilemap_set_scrolly(state->m_background[0], 0, data & 0x1ff); + state->m_background[0]->set_scrolly(0, data & 0x1ff); break; case 1: - tilemap_set_scrollx(state->m_background[0], 0, data & 0x1ff); + state->m_background[0]->set_scrollx(0, data & 0x1ff); break; case 2: - tilemap_set_scrolly(state->m_background[1], 0, data & 0x1ff); + state->m_background[1]->set_scrolly(0, data & 0x1ff); break; case 3: - tilemap_set_scrollx(state->m_background[1], 0, data & 0x1ff); + state->m_background[1]->set_scrollx(0, data & 0x1ff); break; } } @@ -201,7 +201,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int start, int stop) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int start, int stop) { rpunch_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -239,7 +239,7 @@ * *************************************/ -static void draw_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { rpunch_state *state = machine.driver_data(); int colourbase; @@ -256,10 +256,10 @@ for(x=0;xm_bitmapram[count]>>12)&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+0)-4)&0x1ff) = coldat+colourbase; - coldat = (state->m_bitmapram[count]>>8 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+1)-4)&0x1ff) = coldat+colourbase; - coldat = (state->m_bitmapram[count]>>4 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+2)-4)&0x1ff) = coldat+colourbase; - coldat = (state->m_bitmapram[count]>>0 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+3)-4)&0x1ff) = coldat+colourbase; + coldat = (state->m_bitmapram[count]>>12)&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+0)-4)&0x1ff) = coldat+colourbase; + coldat = (state->m_bitmapram[count]>>8 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+1)-4)&0x1ff) = coldat+colourbase; + coldat = (state->m_bitmapram[count]>>4 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+2)-4)&0x1ff) = coldat+colourbase; + coldat = (state->m_bitmapram[count]>>0 )&0xf; if (coldat!=15) bitmap.pix16(y, ((x*4+3)-4)&0x1ff) = coldat+colourbase; count++; } } @@ -272,19 +272,19 @@ * *************************************/ -SCREEN_UPDATE( rpunch ) +SCREEN_UPDATE_IND16( rpunch ) { - rpunch_state *state = screen->machine().driver_data(); + rpunch_state *state = screen.machine().driver_data(); int effbins; /* this seems like the most plausible explanation */ effbins = (state->m_bins > state->m_gins) ? state->m_gins : state->m_bins; - tilemap_draw(bitmap, cliprect, state->m_background[0], 0,0); - draw_sprites(screen->machine(), bitmap, cliprect, 0, effbins); - tilemap_draw(bitmap, cliprect, state->m_background[1], 0,0); - draw_sprites(screen->machine(), bitmap, cliprect, effbins, state->m_gins); + state->m_background[0]->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect, 0, effbins); + state->m_background[1]->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect, effbins, state->m_gins); if (state->m_bitmapram) - draw_bitmap(screen->machine(), bitmap, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/runaway.c mame-0.145/src/mame/video/runaway.c --- mame-0.144/src/mame/video/runaway.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/runaway.c 2012-02-06 21:30:32.000000000 +0000 @@ -34,7 +34,7 @@ { runaway_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -44,7 +44,7 @@ runaway_state *state = space->machine().driver_data(); if ((data & 1) != state->m_tile_bank) { - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_tile_bank = data & 1; @@ -89,12 +89,12 @@ -SCREEN_UPDATE( runaway ) +SCREEN_UPDATE_IND16( runaway ) { - runaway_state *state = screen->machine().driver_data(); + runaway_state *state = screen.machine().driver_data(); int i; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); for (i = 0; i < 16; i++) { @@ -108,13 +108,13 @@ code |= (state->m_sprite_ram[i + 0x30] << 2) & 0x1c0; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, 0, flipx, flipy, x, 240 - y, 0); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, 0, flipx, flipy, @@ -124,12 +124,12 @@ } -SCREEN_UPDATE( qwak ) +SCREEN_UPDATE_IND16( qwak ) { - runaway_state *state = screen->machine().driver_data(); + runaway_state *state = screen.machine().driver_data(); int i; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); for (i = 0; i < 16; i++) { @@ -143,13 +143,13 @@ code |= (state->m_sprite_ram[i + 0x30] << 2) & 0x1c0; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, 0, flipx, flipy, x, 240 - y, 0); - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], code, 0, flipx, flipy, diff -Nru mame-0.144/src/mame/video/rungun.c mame-0.145/src/mame/video/rungun.c --- mame-0.144/src/mame/video/rungun.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/rungun.c 2012-02-06 21:30:31.000000000 +0000 @@ -49,7 +49,7 @@ { rungun_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_936_videoram[offset]); - tilemap_mark_tile_dirty(state->m_936_tilemap, offset / 2); + state->m_936_tilemap->mark_tile_dirty(offset / 2); } static TILE_GET_INFO( get_rng_936_tile_info ) @@ -82,7 +82,7 @@ int gfx_index; state->m_936_tilemap = tilemap_create(machine, get_rng_936_tile_info, tilemap_scan_rows, 16, 16, 128, 128); - tilemap_set_transparent_pen(state->m_936_tilemap, 0); + state->m_936_tilemap->set_transparent_pen(0); /* find first empty slot to decode gfx */ for (gfx_index = 0; gfx_index < MAX_GFX_ELEMENTS; gfx_index++) @@ -98,23 +98,23 @@ // create the tilemap state->m_ttl_tilemap = tilemap_create(machine, ttl_get_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_ttl_tilemap, 0); + state->m_ttl_tilemap->set_transparent_pen(0); state->m_sprite_colorbase = 0x20; } -SCREEN_UPDATE(rng) +SCREEN_UPDATE_IND16(rng) { - rungun_state *state = screen->machine().driver_data(); + rungun_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_936_tilemap, 0, 0, 1); k053247_sprites_draw(state->m_k055673, bitmap, cliprect); - tilemap_mark_all_tiles_dirty(state->m_ttl_tilemap); - tilemap_draw(bitmap, cliprect, state->m_ttl_tilemap, 0, 0); + state->m_ttl_tilemap->mark_all_dirty(); + state->m_ttl_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/sauro.c mame-0.145/src/mame/video/sauro.c --- mame-0.144/src/mame/video/sauro.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sauro.c 2012-02-06 21:30:31.000000000 +0000 @@ -16,7 +16,7 @@ sauro_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tecfri_colorram_w ) @@ -24,7 +24,7 @@ sauro_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tecfri_videoram2_w ) @@ -32,7 +32,7 @@ sauro_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tecfri_colorram2_w ) @@ -40,14 +40,14 @@ sauro_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tecfri_scroll_bg_w ) { sauro_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } static TILE_GET_INFO( get_tile_info_bg ) @@ -80,7 +80,7 @@ sauro_state *state = space->machine().driver_data(); state->m_palette_bank = (data & 0x03) << 4; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } WRITE8_HANDLER( sauro_scroll_fg_w ) @@ -89,7 +89,7 @@ const int *map = (flip_screen_get(space->machine()) ? scroll2_map_flip : scroll2_map); int scroll = (data & 0xf8) | map[data & 7]; - tilemap_set_scrollx(state->m_fg_tilemap, 0, scroll); + state->m_fg_tilemap->set_scrollx(0, scroll); } VIDEO_START( sauro ) @@ -102,11 +102,11 @@ state->m_fg_tilemap = tilemap_create(machine, get_tile_info_fg, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); state->m_palette_bank = 0; } -static void sauro_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void sauro_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sauro_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -154,13 +154,13 @@ } } -SCREEN_UPDATE( sauro ) +SCREEN_UPDATE_IND16( sauro ) { - sauro_state *state = screen->machine().driver_data(); + sauro_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - sauro_draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + sauro_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -174,7 +174,7 @@ 8, 8, 32, 32); } -static void trckydoc_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void trckydoc_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sauro_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -230,10 +230,10 @@ } } -SCREEN_UPDATE( trckydoc ) +SCREEN_UPDATE_IND16( trckydoc ) { - sauro_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - trckydoc_draw_sprites(screen->machine(), bitmap, cliprect); + sauro_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + trckydoc_draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sbasketb.c mame-0.145/src/mame/video/sbasketb.c --- mame-0.144/src/mame/video/sbasketb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sbasketb.c 2012-02-06 21:30:31.000000000 +0000 @@ -98,14 +98,14 @@ { sbasketb_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sbasketb_colorram_w ) { sbasketb_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sbasketb_flipscreen_w ) @@ -113,7 +113,7 @@ if (flip_screen_get(space->machine()) != data) { flip_screen_set(space->machine(), data); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -132,10 +132,10 @@ sbasketb_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { sbasketb_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -171,15 +171,15 @@ } } -SCREEN_UPDATE( sbasketb ) +SCREEN_UPDATE_IND16( sbasketb ) { - sbasketb_state *state = screen->machine().driver_data(); + sbasketb_state *state = screen.machine().driver_data(); int col; for (col = 6; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, *state->m_scroll); + state->m_bg_tilemap->set_scrolly(col, *state->m_scroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sbugger.c mame-0.145/src/mame/video/sbugger.c --- mame-0.144/src/mame/video/sbugger.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sbugger.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,7 +19,7 @@ sbugger_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sbugger_videoram_attr_w ) @@ -27,7 +27,7 @@ sbugger_state *state = space->machine().driver_data(); state->m_videoram_attr[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset); + state->m_tilemap->mark_tile_dirty(offset); } VIDEO_START(sbugger) @@ -36,10 +36,10 @@ state->m_tilemap = tilemap_create(machine, get_sbugger_tile_info, tilemap_scan_rows, 8, 16, 64, 16); } -SCREEN_UPDATE(sbugger) +SCREEN_UPDATE_IND16(sbugger) { - sbugger_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + sbugger_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/scotrsht.c mame-0.145/src/mame/video/scotrsht.c --- mame-0.144/src/mame/video/scotrsht.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/scotrsht.c 2012-02-06 21:30:32.000000000 +0000 @@ -41,7 +41,7 @@ scotrsht_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( scotrsht_colorram_w ) @@ -49,7 +49,7 @@ scotrsht_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( scotrsht_charbank_w ) @@ -59,7 +59,7 @@ if (state->m_charbank != (data & 0x01)) { state->m_charbank = data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* other bits unknown */ @@ -72,7 +72,7 @@ if (state->m_palette_bank != ((data & 0x70) >> 4)) { state->m_palette_bank = ((data & 0x70) >> 4); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } coin_counter_w(space->machine(), 0, data & 1); @@ -99,7 +99,7 @@ } /* Same as Jailbreak + palette bank */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { scotrsht_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -135,18 +135,18 @@ state->m_bg_tilemap = tilemap_create(machine, scotrsht_get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 64); + state->m_bg_tilemap->set_scroll_cols(64); } -SCREEN_UPDATE( scotrsht ) +SCREEN_UPDATE_IND16( scotrsht ) { - scotrsht_state *state = screen->machine().driver_data(); + scotrsht_state *state = screen.machine().driver_data(); int col; for (col = 0; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, state->m_scroll[col]); + state->m_bg_tilemap->set_scrolly(col, state->m_scroll[col]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sderby.c mame-0.145/src/mame/video/sderby.c --- mame-0.144/src/mame/video/sderby.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sderby.c 2012-02-06 21:30:31.000000000 +0000 @@ -19,7 +19,7 @@ sderby_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap,offset/2); + state->m_tilemap->mark_tile_dirty(offset/2); } /* MD Layer */ @@ -40,7 +40,7 @@ sderby_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_md_videoram[offset]); - tilemap_mark_tile_dirty(state->m_md_tilemap,offset/2); + state->m_md_tilemap->mark_tile_dirty(offset/2); } /* FG Layer */ @@ -61,11 +61,11 @@ sderby_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int codeshift) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int codeshift) { sderby_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -102,31 +102,31 @@ state->m_tilemap = tilemap_create(machine, get_sderby_tile_info,tilemap_scan_rows, 16, 16,32,32); state->m_md_tilemap = tilemap_create(machine, get_sderby_md_tile_info,tilemap_scan_rows, 16, 16,32,32); - tilemap_set_transparent_pen(state->m_md_tilemap,0); + state->m_md_tilemap->set_transparent_pen(0); state->m_fg_tilemap = tilemap_create(machine, get_sderby_fg_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE( sderby ) +SCREEN_UPDATE_IND16( sderby ) { - sderby_state *state = screen->machine().driver_data(); + sderby_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_md_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0); + state->m_md_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( pmroulet ) +SCREEN_UPDATE_IND16( pmroulet ) { - sderby_state *state = screen->machine().driver_data(); + sderby_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_md_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); + state->m_md_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -139,11 +139,11 @@ switch (offset) { - case 0: tilemap_set_scrollx(state->m_fg_tilemap,0,data+2);break; - case 1: tilemap_set_scrolly(state->m_fg_tilemap,0,data-8);break; - case 2: tilemap_set_scrollx(state->m_md_tilemap,0,data+4);break; - case 3: tilemap_set_scrolly(state->m_md_tilemap,0,data-8);break; - case 4: tilemap_set_scrollx(state->m_tilemap,0,data+6); break; - case 5: tilemap_set_scrolly(state->m_tilemap,0,data-8); break; + case 0: state->m_fg_tilemap->set_scrollx(0,data+2);break; + case 1: state->m_fg_tilemap->set_scrolly(0,data-8);break; + case 2: state->m_md_tilemap->set_scrollx(0,data+4);break; + case 3: state->m_md_tilemap->set_scrolly(0,data-8);break; + case 4: state->m_tilemap->set_scrollx(0,data+6); break; + case 5: state->m_tilemap->set_scrolly(0,data-8); break; } } diff -Nru mame-0.144/src/mame/video/sega16sp.c mame-0.145/src/mame/video/sega16sp.c --- mame-0.144/src/mame/video/sega16sp.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sega16sp.c 2012-02-06 21:30:31.000000000 +0000 @@ -76,7 +76,7 @@ pri[x] = 0xff; \ } \ -void segaic16_sprites_hangon_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_hangon_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x10000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -132,10 +132,10 @@ addr += pitch; /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int xacc = 0x00; /* note that the System 16A sprites have a design flaw that allows the address */ @@ -147,15 +147,15 @@ { /* start at the word before because we preincrement below */ data[7] = addr - 1; - for (x = xpos; x <= cliprect->max_x; ) + for (x = xpos; x <= cliprect.max_x; ) { UINT16 pixels = spritedata[++data[7] & 0x7fff]; /* draw four pixels */ - pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } /* stop if the last pixel in the group was 0xf */ if (pix == 15) @@ -168,15 +168,15 @@ { /* start at the word after because we predecrement below */ data[7] = addr + 1; - for (x = xpos; x <= cliprect->max_x; ) + for (x = xpos; x <= cliprect.max_x; ) { UINT16 pixels = spritedata[--data[7] & 0x7fff]; /* draw four pixels */ - pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } - pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } + pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) hangon_draw_pixel(); x++; } /* stop if the last pixel in the group was 0xf */ if (pix == 15) @@ -241,7 +241,7 @@ pri[x] = 0xff; \ } \ -void segaic16_sprites_sharrier_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_sharrier_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x20000; const UINT32 *spritebase = (const UINT32 *)machine.region("gfx2")->base(); @@ -298,10 +298,10 @@ addr += pitch; /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int xacc = 0x00; /* note that the System 16A sprites have a design flaw that allows the address */ @@ -313,19 +313,19 @@ { /* start at the word before because we preincrement below */ data[7] = addr - 1; - for (x = xpos; x <= cliprect->max_x; ) + for (x = xpos; x <= cliprect.max_x; ) { UINT32 pixels = spritedata[++data[7] & 0x7fff]; /* draw 8 pixels */ - pix = (pixels >> 28) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 24) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 20) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 16) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 28) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 24) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 20) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 16) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } /* stop if the last pixel in the group was 0xf */ if (pix == 15) @@ -338,19 +338,19 @@ { /* start at the word after because we predecrement below */ data[7] = addr + 1; - for (x = xpos; x <= cliprect->max_x; ) + for (x = xpos; x <= cliprect.max_x; ) { UINT32 pixels = spritedata[--data[7] & 0x7fff]; /* draw 8 pixels */ - pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 16) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 20) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 24) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } - pix = (pixels >> 28) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect->min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 0) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 4) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 8) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 12) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 16) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 20) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 24) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } + pix = (pixels >> 28) & 0xf; xacc = (xacc & 0xff) + hzoom; if (xacc < 0x100) { if (x >= cliprect.min_x) sharrier_draw_pixel(); x++; } /* stop if the last pixel in the group was 0xf */ if (pix == 15) @@ -394,7 +394,7 @@ #define system16a_draw_pixel() \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= cliprect->min_x && x <= cliprect->max_x && pix != 0 && pix != 15) \ + if (x >= cliprect.min_x && x <= cliprect.max_x && pix != 0 && pix != 15) \ { \ /* are we high enough priority to be visible? */ \ if (sprpri > pri[x]) \ @@ -412,7 +412,7 @@ pri[x] = 0xff; \ } \ -void segaic16_sprites_16a_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_16a_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x10000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -467,10 +467,10 @@ addr += pitch; /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); /* note that the System 16A sprites have a design flaw that allows the address */ /* to carry into the flip flag, which is the topmost bit -- it is very important */ @@ -550,7 +550,7 @@ #define system16b_draw_pixel() \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= cliprect->min_x && x <= cliprect->max_x && pix != 0 && pix != 15) \ + if (x >= cliprect.min_x && x <= cliprect.max_x && pix != 0 && pix != 15) \ { \ /* are we high enough priority to be visible? */ \ if (sprpri > pri[x]) \ @@ -573,7 +573,7 @@ pri[x] = 0xff; \ } \ -void segaic16_sprites_16b_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_16b_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks; const UINT16 *spritebase; @@ -656,10 +656,10 @@ } /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int xacc; /* compute the initial X zoom accumulator; this is verified on the real PCB */ @@ -721,7 +721,7 @@ #define yboard_16b_draw_pixel() \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= cliprect->min_x && x <= cliprect->max_x && pix != 0 && pix != 15) \ + if (x >= cliprect.min_x && x <= cliprect.max_x && pix != 0 && pix != 15) \ { \ /* are we high enough priority to be visible? */ \ if ((sprpri & 0x1f) < (pri[x] & 0x1f)) \ @@ -739,7 +739,7 @@ pri[x] = 0; \ } \ -void segaic16_sprites_yboard_16b_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_yboard_16b_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x20000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -809,10 +809,10 @@ } /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int xacc; /* compute the initial X zoom accumulator; this is verified on the real PCB */ @@ -899,7 +899,7 @@ #define outrun_draw_pixel() \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= cliprect->min_x && x <= cliprect->max_x && pix != 0 && pix != 15) \ + if (x >= cliprect.min_x && x <= cliprect.max_x && pix != 0 && pix != 15) \ { \ /* are we high enough priority to be visible? */ \ if (sprpri > pri[x]) \ @@ -917,7 +917,7 @@ pri[x] = 0xff; \ } \ -static void segaic16_sprites_xboard_outrun_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int type) +static void segaic16_sprites_xboard_outrun_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int type) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x40000; const UINT32 *spritebase = (const UINT32 *)machine.region("gfx2")->base(); @@ -978,10 +978,10 @@ for (y = top; y != ytarget; y += ydelta) { /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pri = &machine.priority_bitmap.pix8(y); int xacc = 0; /* non-flipped case */ @@ -989,7 +989,7 @@ { /* start at the word before because we preincrement below */ data[7] = addr - 1; - for (x = xpos; (xdelta > 0 && x <= cliprect->max_x) || (xdelta < 0 && x >= cliprect->min_x); ) + for (x = xpos; (xdelta > 0 && x <= cliprect.max_x) || (xdelta < 0 && x >= cliprect.min_x); ) { UINT32 pixels = spritedata[++data[7]]; @@ -1014,7 +1014,7 @@ { /* start at the word after because we predecrement below */ data[7] = addr + 1; - for (x = xpos; (xdelta > 0 && x <= cliprect->max_x) || (xdelta < 0 && x >= cliprect->min_x); ) + for (x = xpos; (xdelta > 0 && x <= cliprect.max_x) || (xdelta < 0 && x >= cliprect.min_x); ) { UINT32 pixels = spritedata[--data[7]]; @@ -1043,12 +1043,12 @@ } } -void segaic16_sprites_outrun_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_outrun_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { segaic16_sprites_xboard_outrun_draw(machine, device, bitmap, cliprect, SEGAIC16_SPRITES_OUTRUN); } -void segaic16_sprites_xboard_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_xboard_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { segaic16_sprites_xboard_outrun_draw(machine, device, bitmap, cliprect, SEGAIC16_SPRITES_XBOARD); } @@ -1088,7 +1088,7 @@ if (x >= minx && x <= maxx && ind < 0x1fe) \ dest[x] = ind | colorpri; \ -void segaic16_sprites_yboard_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_yboard_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx1")->bytes() / 0x80000; const UINT64 *spritebase = (const UINT64 *)machine.region("gfx1")->base(); @@ -1103,9 +1103,9 @@ memset(visited, 0, sizeof(visited)); /* clear out any scanlines we might be using */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) if (!(rotatebase[y & ~1] & 0xc000)) - memset(BITMAP_ADDR16(bitmap, y, cliprect->min_x), 0xff, (cliprect->max_x - cliprect->min_x + 1) * sizeof(UINT16)); + memset(&bitmap.pix16(y, cliprect.min_x), 0xff, cliprect.width() * sizeof(UINT16)); /* now scan backwards and render the sprites in order */ for (data = sega16sp->spriteram; !(data[0] & 0x8000) && !visited[next]; data = sega16sp->spriteram + next * 8) @@ -1148,9 +1148,9 @@ for (y = top; y != ytarget; y += ydelta) { /* skip drawing if not within the cliprect */ - if (y >= cliprect->min_y && y <= cliprect->max_y) + if (y >= cliprect.min_y && y <= cliprect.max_y) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); int minx = rotatebase[y & ~1]; int maxx = rotatebase[y | 1]; int xacc = 0; @@ -1169,10 +1169,10 @@ /* clamp min/max to the cliprect */ minx -= 0x600; maxx -= 0x600; - if (minx < cliprect->min_x) - minx = cliprect->min_x; - if (maxx > cliprect->max_x) - maxx = cliprect->max_x; + if (minx < cliprect.min_x) + minx = cliprect.min_x; + if (maxx > cliprect.max_x) + maxx = cliprect.max_x; /* non-flipped case */ if (!flip) @@ -1266,7 +1266,7 @@ /* ignores the sprite priority until we understand priority better on the bootlegs */ #define system16a_bootleg_draw_pixel() \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= cliprect->min_x && x <= cliprect->max_x && pix != 0 && pix != 15) \ + if (x >= cliprect.min_x && x <= cliprect.max_x && pix != 0 && pix != 15) \ { \ /* are we high enough priority to be visible? */ \ if (sprpri || 1) \ @@ -1323,10 +1323,10 @@ { \ \ /* skip drawing if not within the cliprect */ \ - if (y >= cliprect->min_y && y <= cliprect->max_y) \ + if (y >= cliprect.min_y && y <= cliprect.max_y) \ { \ - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); \ - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); \ + UINT16 *dest = &bitmap.pix16(y); \ + UINT8 *pri = &machine.priority_bitmap.pix8(y); \ \ /* note that the System 16A sprites have a design flaw that allows the address */ \ /* to carry into the flip flag, which is the topmost bit -- it is very important */ \ @@ -1382,7 +1382,7 @@ -void segaic16_sprites_16a_bootleg_wb3bl_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_16a_bootleg_wb3bl_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x10000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -1405,7 +1405,7 @@ } /* 4 player passing shot is different to this.. */ -void segaic16_sprites_16a_bootleg_passhtb_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_16a_bootleg_passhtb_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x10000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -1427,7 +1427,7 @@ } } -void segaic16_sprites_16a_bootleg_shinobld_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect) +void segaic16_sprites_16a_bootleg_shinobld_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 numbanks = machine.region("gfx2")->bytes() / 0x10000; const UINT16 *spritebase = (const UINT16 *)machine.region("gfx2")->base(); @@ -1455,15 +1455,15 @@ * *************************************/ -void segaic16_sprites_draw(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int which) +void segaic16_sprites_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which) { device_t* device = 0; sega16sp_state *sega16sp; if (!which) - device = screen->machine().device("segaspr1"); + device = screen.machine().device("segaspr1"); else - device = screen->machine().device("segaspr2"); + device = screen.machine().device("segaspr2"); if (!device) fatalerror("segaic16_sprites_draw device not found\n"); @@ -1475,7 +1475,7 @@ else sega16sp->spriteram = segaic16_spriteram_1; - (*sega16sp->draw)(screen->machine(), device, bitmap, cliprect); + (*sega16sp->draw)(screen.machine(), device, bitmap, cliprect); } @@ -1502,8 +1502,8 @@ if (sega16sp->bank[banknum] != offset) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); sega16sp->bank[banknum] = offset; } } @@ -1533,8 +1533,8 @@ flip = (flip != 0); if (sega16sp->flip != flip) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); sega16sp->flip = flip; } } @@ -1564,8 +1564,8 @@ shadow = (shadow != 0); if (sega16sp->shadow != shadow) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); sega16sp->shadow = shadow; } } diff -Nru mame-0.144/src/mame/video/segag80r.c mame-0.145/src/mame/video/segag80r.c --- mame-0.144/src/mame/video/segag80r.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segag80r.c 2012-02-06 21:30:32.000000000 +0000 @@ -359,8 +359,8 @@ case 0: if ((state->m_spaceod_bg_control ^ data) & 0xc4) { - tilemap_mark_all_tiles_dirty(state->m_spaceod_bg_htilemap); - tilemap_mark_all_tiles_dirty(state->m_spaceod_bg_vtilemap); + state->m_spaceod_bg_htilemap->mark_all_dirty(); + state->m_spaceod_bg_vtilemap->mark_all_dirty(); } state->m_spaceod_bg_control = data; break; @@ -475,7 +475,7 @@ */ case 4: if ((state->m_bg_char_bank ^ data) & 0x0f) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_bg_char_bank = data & 0x0f; state->m_bg_scrolly = (data << 4) & 0x700; state->m_bg_enable = data & 0x80; @@ -564,7 +564,7 @@ case 4: data = (data & 0x09) | ((data >> 2) & 0x02) | ((data << 2) & 0x04); if ((state->m_bg_char_bank ^ data) & 0x0f) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_bg_char_bank = data & 0x0f; break; @@ -626,7 +626,7 @@ state->m_bg_scrollx = (data << 6) & 0x300; state->m_bg_scrolly = (data << 4) & 0x700; if ((state->m_bg_char_bank ^ data) & 0x03) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); state->m_bg_char_bank = data & 0x03; break; } @@ -640,7 +640,7 @@ * *************************************/ -static void draw_videoram(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *transparent_pens) +static void draw_videoram(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *transparent_pens) { segag80r_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; @@ -648,10 +648,10 @@ int x, y; /* iterate over the screen and draw visible tiles */ - for (y = cliprect->min_y / 8; y <= cliprect->max_y / 8; y++) + for (y = cliprect.min_y / 8; y <= cliprect.max_y / 8; y++) { int effy = state->m_video_flip ? 27 - y : y; - for (x = cliprect->min_x / 8; x <= cliprect->max_x / 8; x++) + for (x = cliprect.min_x / 8; x <= cliprect.max_x / 8; x++) { int offs = effy * 32 + (x ^ flipmask); UINT8 tile = videoram[offs]; @@ -670,14 +670,14 @@ * *************************************/ -static void draw_background_spaceod(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background_spaceod(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { segag80r_state *state = machine.driver_data(); - bitmap_t *pixmap = tilemap_get_pixmap(!(state->m_spaceod_bg_control & 0x02) ? state->m_spaceod_bg_htilemap : state->m_spaceod_bg_vtilemap); + bitmap_ind16 &pixmap = (!(state->m_spaceod_bg_control & 0x02) ? state->m_spaceod_bg_htilemap : state->m_spaceod_bg_vtilemap)->pixmap(); int flipmask = (state->m_spaceod_bg_control & 0x01) ? 0xff : 0x00; int xoffset = (state->m_spaceod_bg_control & 0x02) ? 0x10 : 0x00; - int xmask = pixmap->width - 1; - int ymask = pixmap->height - 1; + int xmask = pixmap.width() - 1; + int ymask = pixmap.height() - 1; int x, y; /* The H and V counters on this board are independent of the ones on */ @@ -687,14 +687,14 @@ /* 240, giving us an offset of (262-240) = 22 scanlines. */ /* now fill in the background wherever there are black pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int effy = (y + state->m_spaceod_vcounter + 22) ^ flipmask; - UINT16 *src = (UINT16 *)pixmap->base + (effy & ymask) * pixmap->rowpixels; - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *src = &pixmap.pix16(effy & ymask); + UINT16 *dst = &bitmap.pix16(y); /* loop over horizontal pixels */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int effx = ((x + state->m_spaceod_hcounter) ^ flipmask) + xoffset; UINT8 fgpix = machine.generic.paletteram.u8[dst[x]]; @@ -728,31 +728,31 @@ * *************************************/ -static void draw_background_page_scroll(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background_page_scroll(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { segag80r_state *state = machine.driver_data(); - bitmap_t *pixmap = tilemap_get_pixmap(state->m_bg_tilemap); + bitmap_ind16 &pixmap = state->m_bg_tilemap->pixmap(); int flipmask = (state->m_video_control & 0x08) ? 0xff : 0x00; - int xmask = pixmap->width - 1; - int ymask = pixmap->height - 1; + int xmask = pixmap.width() - 1; + int ymask = pixmap.height() - 1; int x, y; /* if disabled, draw nothing */ if (!state->m_bg_enable) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return; } /* now fill in the background wherever there are black pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int effy = state->m_bg_scrolly + (((y ^ flipmask) + (flipmask & 0xe0)) & 0xff); - UINT16 *src = (UINT16 *)pixmap->base + (effy & ymask) * pixmap->rowpixels; - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *src = &pixmap.pix16(effy & ymask); + UINT16 *dst = &bitmap.pix16(y); /* loop over horizontal pixels */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int effx = state->m_bg_scrollx + (x ^ flipmask); dst[x] = src[effx & xmask]; @@ -769,31 +769,31 @@ * *************************************/ -static void draw_background_full_scroll(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background_full_scroll(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { segag80r_state *state = machine.driver_data(); - bitmap_t *pixmap = tilemap_get_pixmap(state->m_bg_tilemap); + bitmap_ind16 &pixmap = state->m_bg_tilemap->pixmap(); int flipmask = (state->m_video_control & 0x08) ? 0x3ff : 0x000; - int xmask = pixmap->width - 1; - int ymask = pixmap->height - 1; + int xmask = pixmap.width() - 1; + int ymask = pixmap.height() - 1; int x, y; /* if disabled, draw nothing */ if (!state->m_bg_enable) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return; } /* now fill in the background wherever there are black pixels */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int effy = (y + state->m_bg_scrolly) ^ flipmask; - UINT16 *src = (UINT16 *)pixmap->base + (effy & ymask) * pixmap->rowpixels; - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *src = &pixmap.pix16(effy & ymask); + UINT16 *dst = &bitmap.pix16(y); /* loop over horizontal pixels */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int effx = (x + state->m_bg_scrollx) ^ flipmask; dst[x] = src[effx & xmask]; @@ -809,9 +809,9 @@ * *************************************/ -SCREEN_UPDATE( segag80r ) +SCREEN_UPDATE_IND16( segag80r ) { - segag80r_state *state = screen->machine().driver_data(); + segag80r_state *state = screen.machine().driver_data(); UINT8 transparent_pens[16]; switch (state->m_background_pcb) @@ -820,7 +820,7 @@ /* background: none */ case G80_BACKGROUND_NONE: memset(transparent_pens, 0, 16); - draw_videoram(screen->machine(), bitmap, cliprect, transparent_pens); + draw_videoram(screen.machine(), bitmap, cliprect, transparent_pens); break; /* foreground: visible except where black */ @@ -828,32 +828,32 @@ /* we draw the foreground first, then the background to do collision detection */ case G80_BACKGROUND_SPACEOD: memset(transparent_pens, 0, 16); - draw_videoram(screen->machine(), bitmap, cliprect, transparent_pens); - draw_background_spaceod(screen->machine(), bitmap, cliprect); + draw_videoram(screen.machine(), bitmap, cliprect, transparent_pens); + draw_background_spaceod(screen.machine(), bitmap, cliprect); break; /* foreground: visible except for pen 0 (this disagrees with schematics) */ /* background: page-granular scrolling */ case G80_BACKGROUND_MONSTERB: memset(transparent_pens, 1, 16); - draw_background_page_scroll(screen->machine(), bitmap, cliprect); - draw_videoram(screen->machine(), bitmap, cliprect, transparent_pens); + draw_background_page_scroll(screen.machine(), bitmap, cliprect); + draw_videoram(screen.machine(), bitmap, cliprect, transparent_pens); break; /* foreground: visible except for pen 0 */ /* background: full scrolling */ case G80_BACKGROUND_PIGNEWT: memset(transparent_pens, 1, 16); - draw_background_full_scroll(screen->machine(), bitmap, cliprect); - draw_videoram(screen->machine(), bitmap, cliprect, transparent_pens); + draw_background_full_scroll(screen.machine(), bitmap, cliprect); + draw_videoram(screen.machine(), bitmap, cliprect, transparent_pens); break; /* foreground: visible except for pen 0 */ /* background: page-granular scrolling */ case G80_BACKGROUND_SINDBADM: memset(transparent_pens, 1, 16); - draw_background_page_scroll(screen->machine(), bitmap, cliprect); - draw_videoram(screen->machine(), bitmap, cliprect, transparent_pens); + draw_background_page_scroll(screen.machine(), bitmap, cliprect); + draw_videoram(screen.machine(), bitmap, cliprect, transparent_pens); break; } return 0; diff -Nru mame-0.144/src/mame/video/segag80v.c mame-0.145/src/mame/video/segag80v.c --- mame-0.144/src/mame/video/segag80v.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segag80v.c 2012-02-06 21:30:32.000000000 +0000 @@ -335,9 +335,9 @@ } -SCREEN_UPDATE( segag80v ) +SCREEN_UPDATE_RGB32( segag80v ) { - sega_generate_vector_list(screen->machine()); - SCREEN_UPDATE_CALL(vector); + sega_generate_vector_list(screen.machine()); + SCREEN_UPDATE32_CALL(vector); return 0; } diff -Nru mame-0.144/src/mame/video/segahang.c mame-0.145/src/mame/video/segahang.c --- mame-0.144/src/mame/video/segahang.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segahang.c 2012-02-06 21:30:33.000000000 +0000 @@ -49,17 +49,17 @@ * *************************************/ -SCREEN_UPDATE( hangon ) +SCREEN_UPDATE_IND16( hangon ) { /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw the low priority road layer */ segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_BACKGROUND); diff -Nru mame-0.144/src/mame/video/segaic16.c mame-0.145/src/mame/video/segaic16.c --- mame-0.144/src/mame/video/segaic16.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/segaic16.c 2012-02-06 21:30:33.000000000 +0000 @@ -518,7 +518,7 @@ * *************************************/ -static void segaic16_draw_virtual_tilemap(running_machine &machine, struct tilemap_info *info, bitmap_t *bitmap, const rectangle *cliprect, UINT16 pages, UINT16 xscroll, UINT16 yscroll, UINT32 flags, UINT32 priority) +static void segaic16_draw_virtual_tilemap(running_machine &machine, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 pages, UINT16 xscroll, UINT16 yscroll, UINT32 flags, UINT32 priority) { int leftmin = -1, leftmax = -1, rightmin = -1, rightmax = -1; int topmin = -1, topmax = -1, bottommin = -1, bottommax = -1; @@ -616,64 +616,64 @@ /* draw the upper-left chunk */ if (leftmin != -1 && topmin != -1) { - pageclip.min_x = (leftmin < cliprect->min_x) ? cliprect->min_x : leftmin; - pageclip.max_x = (leftmax > cliprect->max_x) ? cliprect->max_x : leftmax; - pageclip.min_y = (topmin < cliprect->min_y) ? cliprect->min_y : topmin; - pageclip.max_y = (topmax > cliprect->max_y) ? cliprect->max_y : topmax; + pageclip.min_x = (leftmin < cliprect.min_x) ? cliprect.min_x : leftmin; + pageclip.max_x = (leftmax > cliprect.max_x) ? cliprect.max_x : leftmax; + pageclip.min_y = (topmin < cliprect.min_y) ? cliprect.min_y : topmin; + pageclip.max_y = (topmax > cliprect.max_y) ? cliprect.max_y : topmax; if (pageclip.min_x <= pageclip.max_x && pageclip.min_y <= pageclip.max_y) { page = (pages >> 0) & 0xf; - tilemap_set_scrollx(info->tilemaps[page], 0, xscroll); - tilemap_set_scrolly(info->tilemaps[page], 0, yscroll); - tilemap_draw(bitmap, &pageclip, info->tilemaps[page], flags, priority); + info->tilemaps[page]->set_scrollx(0, xscroll); + info->tilemaps[page]->set_scrolly(0, yscroll); + info->tilemaps[page]->draw(bitmap, pageclip, flags, priority); } } /* draw the upper-right chunk */ if (rightmin != -1 && topmin != -1) { - pageclip.min_x = (rightmin < cliprect->min_x) ? cliprect->min_x : rightmin; - pageclip.max_x = (rightmax > cliprect->max_x) ? cliprect->max_x : rightmax; - pageclip.min_y = (topmin < cliprect->min_y) ? cliprect->min_y : topmin; - pageclip.max_y = (topmax > cliprect->max_y) ? cliprect->max_y : topmax; + pageclip.min_x = (rightmin < cliprect.min_x) ? cliprect.min_x : rightmin; + pageclip.max_x = (rightmax > cliprect.max_x) ? cliprect.max_x : rightmax; + pageclip.min_y = (topmin < cliprect.min_y) ? cliprect.min_y : topmin; + pageclip.max_y = (topmax > cliprect.max_y) ? cliprect.max_y : topmax; if (pageclip.min_x <= pageclip.max_x && pageclip.min_y <= pageclip.max_y) { page = (pages >> 4) & 0xf; - tilemap_set_scrollx(info->tilemaps[page], 0, xscroll); - tilemap_set_scrolly(info->tilemaps[page], 0, yscroll); - tilemap_draw(bitmap, &pageclip, info->tilemaps[page], flags, priority); + info->tilemaps[page]->set_scrollx(0, xscroll); + info->tilemaps[page]->set_scrolly(0, yscroll); + info->tilemaps[page]->draw(bitmap, pageclip, flags, priority); } } /* draw the lower-left chunk */ if (leftmin != -1 && bottommin != -1) { - pageclip.min_x = (leftmin < cliprect->min_x) ? cliprect->min_x : leftmin; - pageclip.max_x = (leftmax > cliprect->max_x) ? cliprect->max_x : leftmax; - pageclip.min_y = (bottommin < cliprect->min_y) ? cliprect->min_y : bottommin; - pageclip.max_y = (bottommax > cliprect->max_y) ? cliprect->max_y : bottommax; + pageclip.min_x = (leftmin < cliprect.min_x) ? cliprect.min_x : leftmin; + pageclip.max_x = (leftmax > cliprect.max_x) ? cliprect.max_x : leftmax; + pageclip.min_y = (bottommin < cliprect.min_y) ? cliprect.min_y : bottommin; + pageclip.max_y = (bottommax > cliprect.max_y) ? cliprect.max_y : bottommax; if (pageclip.min_x <= pageclip.max_x && pageclip.min_y <= pageclip.max_y) { page = (pages >> 8) & 0xf; - tilemap_set_scrollx(info->tilemaps[page], 0, xscroll); - tilemap_set_scrolly(info->tilemaps[page], 0, yscroll); - tilemap_draw(bitmap, &pageclip, info->tilemaps[page], flags, priority); + info->tilemaps[page]->set_scrollx(0, xscroll); + info->tilemaps[page]->set_scrolly(0, yscroll); + info->tilemaps[page]->draw(bitmap, pageclip, flags, priority); } } /* draw the lower-right chunk */ if (rightmin != -1 && bottommin != -1) { - pageclip.min_x = (rightmin < cliprect->min_x) ? cliprect->min_x : rightmin; - pageclip.max_x = (rightmax > cliprect->max_x) ? cliprect->max_x : rightmax; - pageclip.min_y = (bottommin < cliprect->min_y) ? cliprect->min_y : bottommin; - pageclip.max_y = (bottommax > cliprect->max_y) ? cliprect->max_y : bottommax; + pageclip.min_x = (rightmin < cliprect.min_x) ? cliprect.min_x : rightmin; + pageclip.max_x = (rightmax > cliprect.max_x) ? cliprect.max_x : rightmax; + pageclip.min_y = (bottommin < cliprect.min_y) ? cliprect.min_y : bottommin; + pageclip.max_y = (bottommax > cliprect.max_y) ? cliprect.max_y : bottommax; if (pageclip.min_x <= pageclip.max_x && pageclip.min_y <= pageclip.max_y) { page = (pages >> 12) & 0xf; - tilemap_set_scrollx(info->tilemaps[page], 0, xscroll); - tilemap_set_scrolly(info->tilemaps[page], 0, yscroll); - tilemap_draw(bitmap, &pageclip, info->tilemaps[page], flags, priority); + info->tilemaps[page]->set_scrollx(0, xscroll); + info->tilemaps[page]->set_scrolly(0, yscroll); + info->tilemaps[page]->draw(bitmap, pageclip, flags, priority); } } } @@ -728,7 +728,7 @@ int color = (data >> 5) & 0x7f; SET_TILE_INFO(0, code, color, 0); - tileinfo->category = (data >> 12) & 1; + tileinfo.category = (data >> 12) & 1; } @@ -740,11 +740,11 @@ int code = data & 0xff; SET_TILE_INFO(0, code, color, 0); - tileinfo->category = (data >> 11) & 1; + tileinfo.category = (data >> 11) & 1; } -static void segaic16_tilemap_16a_draw_layer(running_machine &machine, struct tilemap_info *info, bitmap_t *bitmap, const rectangle *cliprect, int which, int flags, int priority) +static void segaic16_tilemap_16a_draw_layer(running_machine &machine, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority) { UINT16 *textram = info->textram; @@ -766,23 +766,23 @@ if (PRINT_UNUSUAL_MODES) mame_printf_debug("Column AND row scroll\n"); /* loop over row chunks */ - for (y = cliprect->min_y & ~7; y <= cliprect->max_y; y += 8) + for (y = cliprect.min_y & ~7; y <= cliprect.max_y; y += 8) { int rowscrollindex = (info->flip ? (216 - y) : y) / 8; rectangle rowcolclip; /* adjust to clip this row only */ - rowcolclip.min_y = (y < cliprect->min_y) ? cliprect->min_y : y; - rowcolclip.max_y = (y + 7 > cliprect->max_y) ? cliprect->max_y : y + 7; + rowcolclip.min_y = (y < cliprect.min_y) ? cliprect.min_y : y; + rowcolclip.max_y = (y + 7 > cliprect.max_y) ? cliprect.max_y : y + 7; /* loop over column chunks */ - for (x = cliprect->min_x & ~15; x <= cliprect->max_x; x += 16) + for (x = cliprect.min_x & ~15; x <= cliprect.max_x; x += 16) { UINT16 effxscroll, effyscroll; /* adjust to clip this column only */ - rowcolclip.min_x = (x < cliprect->min_x) ? cliprect->min_x : x; - rowcolclip.max_x = (x + 15 > cliprect->max_x) ? cliprect->max_x : x + 15; + rowcolclip.min_x = (x < cliprect.min_x) ? cliprect.min_x : x; + rowcolclip.max_x = (x + 15 > cliprect.max_x) ? cliprect.max_x : x + 15; /* get the effective scroll values */ effxscroll = textram[0xf80/2 + rowscrollindex * 2 + which] & 0x1ff; @@ -795,7 +795,7 @@ /* draw the chunk */ effxscroll = (0xc8 - effxscroll + info->xoffs) & 0x3ff; effyscroll = effyscroll & 0x1ff; - segaic16_draw_virtual_tilemap(machine, info, bitmap, &rowcolclip, pages, effxscroll, effyscroll, flags, priority); + segaic16_draw_virtual_tilemap(machine, info, bitmap, rowcolclip, pages, effxscroll, effyscroll, flags, priority); } } } @@ -804,14 +804,14 @@ if (PRINT_UNUSUAL_MODES) mame_printf_debug("Column scroll\n"); /* loop over column chunks */ - for (x = cliprect->min_x & ~15; x <= cliprect->max_x; x += 16) + for (x = cliprect.min_x & ~15; x <= cliprect.max_x; x += 16) { - rectangle colclip = *cliprect; + rectangle colclip = cliprect; UINT16 effxscroll, effyscroll; /* adjust to clip this row only */ - colclip.min_x = (x < cliprect->min_x) ? cliprect->min_x : x; - colclip.max_x = (x + 15 > cliprect->max_x) ? cliprect->max_x : x + 15; + colclip.min_x = (x < cliprect.min_x) ? cliprect.min_x : x; + colclip.max_x = (x + 15 > cliprect.max_x) ? cliprect.max_x : x + 15; /* get the effective scroll values */ effxscroll = xscroll; @@ -824,7 +824,7 @@ /* draw the chunk */ effxscroll = (0xc8 - effxscroll + info->xoffs) & 0x3ff; effyscroll = effyscroll & 0x1ff; - segaic16_draw_virtual_tilemap(machine, info, bitmap, &colclip, pages, effxscroll, effyscroll, flags, priority); + segaic16_draw_virtual_tilemap(machine, info, bitmap, colclip, pages, effxscroll, effyscroll, flags, priority); } } else if (info->rowscroll) @@ -832,15 +832,15 @@ if (PRINT_UNUSUAL_MODES) mame_printf_debug("Row scroll\n"); /* loop over row chunks */ - for (y = cliprect->min_y & ~7; y <= cliprect->max_y; y += 8) + for (y = cliprect.min_y & ~7; y <= cliprect.max_y; y += 8) { int rowscrollindex = (info->flip ? (216 - y) : y) / 8; - rectangle rowclip = *cliprect; + rectangle rowclip = cliprect; UINT16 effxscroll, effyscroll; /* adjust to clip this row only */ - rowclip.min_y = (y < cliprect->min_y) ? cliprect->min_y : y; - rowclip.max_y = (y + 7 > cliprect->max_y) ? cliprect->max_y : y + 7; + rowclip.min_y = (y < cliprect.min_y) ? cliprect.min_y : y; + rowclip.max_y = (y + 7 > cliprect.max_y) ? cliprect.max_y : y + 7; /* get the effective scroll values */ effxscroll = textram[0xf80/2 + rowscrollindex * 2 + which] & 0x1ff; @@ -853,7 +853,7 @@ /* draw the chunk */ effxscroll = (0xc8 - effxscroll + info->xoffs) & 0x3ff; effyscroll = effyscroll & 0x1ff; - segaic16_draw_virtual_tilemap(machine, info, bitmap, &rowclip, pages, effxscroll, effyscroll, flags, priority); + segaic16_draw_virtual_tilemap(machine, info, bitmap, rowclip, pages, effxscroll, effyscroll, flags, priority); } } else @@ -942,7 +942,7 @@ code = info->bank[code / info->banksize] * info->banksize + code % info->banksize; SET_TILE_INFO(0, code, color, 0); - tileinfo->category = (data >> 15) & 1; + tileinfo.category = (data >> 15) & 1; } @@ -955,7 +955,7 @@ int code = data & 0x1ff; SET_TILE_INFO(0, bank * info->banksize + code, color, 0); - tileinfo->category = (data >> 15) & 1; + tileinfo.category = (data >> 15) & 1; } @@ -969,7 +969,7 @@ code = info->bank[code / info->banksize] * info->banksize + code % info->banksize; SET_TILE_INFO(0, code, color, 0); - tileinfo->category = (data >> 15) & 1; + tileinfo.category = (data >> 15) & 1; } @@ -982,11 +982,11 @@ int code = data & 0xff; SET_TILE_INFO(0, bank * info->banksize + code, color, 0); - tileinfo->category = (data >> 15) & 1; + tileinfo.category = (data >> 15) & 1; } -static void segaic16_tilemap_16b_draw_layer(running_machine &machine, struct tilemap_info *info, bitmap_t *bitmap, const rectangle *cliprect, int which, int flags, int priority) +static void segaic16_tilemap_16b_draw_layer(running_machine &machine, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority) { UINT16 *textram = info->textram; UINT16 xscroll, yscroll, pages; @@ -1003,24 +1003,24 @@ if (PRINT_UNUSUAL_MODES) mame_printf_debug("Column AND row scroll\n"); /* loop over row chunks */ - for (y = cliprect->min_y & ~7; y <= cliprect->max_y; y += 8) + for (y = cliprect.min_y & ~7; y <= cliprect.max_y; y += 8) { int rowscrollindex = (info->flip ? (216 - y) : y) / 8; rectangle rowcolclip; /* adjust to clip this row only */ - rowcolclip.min_y = (y < cliprect->min_y) ? cliprect->min_y : y; - rowcolclip.max_y = (y + 7 > cliprect->max_y) ? cliprect->max_y : y + 7; + rowcolclip.min_y = (y < cliprect.min_y) ? cliprect.min_y : y; + rowcolclip.max_y = (y + 7 > cliprect.max_y) ? cliprect.max_y : y + 7; /* loop over column chunks */ - for (x = ((cliprect->min_x + 8) & ~15) - 8; x <= cliprect->max_x; x += 16) + for (x = ((cliprect.min_x + 8) & ~15) - 8; x <= cliprect.max_x; x += 16) { UINT16 effxscroll, effyscroll, rowscroll; UINT16 effpages = pages; /* adjust to clip this column only */ - rowcolclip.min_x = (x < cliprect->min_x) ? cliprect->min_x : x; - rowcolclip.max_x = (x + 15 > cliprect->max_x) ? cliprect->max_x : x + 15; + rowcolclip.min_x = (x < cliprect.min_x) ? cliprect.min_x : x; + rowcolclip.max_x = (x + 15 > cliprect.max_x) ? cliprect.max_x : x + 15; /* get the effective scroll values */ rowscroll = textram[0xf80/2 + 0x40/2 * which + rowscrollindex]; @@ -1038,7 +1038,7 @@ /* draw the chunk */ effxscroll = (0xc0 - effxscroll + info->xoffs) & 0x3ff; effyscroll = effyscroll & 0x1ff; - segaic16_draw_virtual_tilemap(machine, info, bitmap, &rowcolclip, effpages, effxscroll, effyscroll, flags, priority); + segaic16_draw_virtual_tilemap(machine, info, bitmap, rowcolclip, effpages, effxscroll, effyscroll, flags, priority); } } } @@ -1047,16 +1047,16 @@ if (PRINT_UNUSUAL_MODES) mame_printf_debug("Row scroll\n"); /* loop over row chunks */ - for (y = cliprect->min_y & ~7; y <= cliprect->max_y; y += 8) + for (y = cliprect.min_y & ~7; y <= cliprect.max_y; y += 8) { int rowscrollindex = (info->flip ? (216 - y) : y) / 8; - rectangle rowclip = *cliprect; + rectangle rowclip = cliprect; UINT16 effxscroll, effyscroll, rowscroll; UINT16 effpages = pages; /* adjust to clip this row only */ - rowclip.min_y = (y < cliprect->min_y) ? cliprect->min_y : y; - rowclip.max_y = (y + 7 > cliprect->max_y) ? cliprect->max_y : y + 7; + rowclip.min_y = (y < cliprect.min_y) ? cliprect.min_y : y; + rowclip.max_y = (y + 7 > cliprect.max_y) ? cliprect.max_y : y + 7; /* get the effective scroll values */ rowscroll = textram[0xf80/2 + 0x40/2 * which + rowscrollindex]; @@ -1074,7 +1074,7 @@ /* draw the chunk */ effxscroll = (0xc0 - effxscroll + info->xoffs) & 0x3ff; effyscroll = effyscroll & 0x1ff; - segaic16_draw_virtual_tilemap(machine, info, bitmap, &rowclip, effpages, effxscroll, effyscroll, flags, priority); + segaic16_draw_virtual_tilemap(machine, info, bitmap, rowclip, effpages, effxscroll, effyscroll, flags, priority); } } } @@ -1192,11 +1192,11 @@ info->textmap_info.rambase = info->textram; info->textmap_info.bank = info->bank; info->textmap_info.banksize = info->banksize; - tilemap_set_user_data(info->textmap, &info->textmap_info); - tilemap_set_palette_offset(info->textmap, colorbase); - tilemap_set_transparent_pen(info->textmap, 0); - tilemap_set_scrolldx(info->textmap, -192 + xoffs, -170 + xoffs); - tilemap_set_scrolldy(info->textmap, 0, 38); + info->textmap->set_user_data(&info->textmap_info); + info->textmap->set_palette_offset(colorbase); + info->textmap->set_transparent_pen(0); + info->textmap->set_scrolldx(-192 + xoffs, -170 + xoffs); + info->textmap->set_scrolldy(0, 38); /* create the tilemaps for the tile pages */ for (pagenum = 0; pagenum < info->numpages; pagenum++) @@ -1208,11 +1208,11 @@ info->tmap_info[pagenum].rambase = info->tileram + pagenum * 64*32; info->tmap_info[pagenum].bank = info->bank; info->tmap_info[pagenum].banksize = info->banksize; - tilemap_set_user_data(info->tilemaps[pagenum], &info->tmap_info[pagenum]); - tilemap_set_palette_offset(info->tilemaps[pagenum], colorbase); - tilemap_set_transparent_pen(info->tilemaps[pagenum], 0); - tilemap_set_scrolldx(info->tilemaps[pagenum], 0, 22); - tilemap_set_scrolldy(info->tilemaps[pagenum], 0, 38); + info->tilemaps[pagenum]->set_user_data(&info->tmap_info[pagenum]); + info->tilemaps[pagenum]->set_palette_offset(colorbase); + info->tilemaps[pagenum]->set_transparent_pen(0); + info->tilemaps[pagenum]->set_scrolldx(0, 22); + info->tilemaps[pagenum]->set_scrolldy(0, 38); } } @@ -1224,14 +1224,14 @@ * *************************************/ -void segaic16_tilemap_draw(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int which, int map, int priority, int priority_mark) +void segaic16_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int map, int priority, int priority_mark) { - running_machine &machine = screen->machine(); + running_machine &machine = screen.machine(); struct tilemap_info *info = &bg_tilemap[which]; /* text layer is a special common case */ if (map == SEGAIC16_TILEMAP_TEXT) - tilemap_draw(bitmap, cliprect, info->textmap, priority, priority_mark); + info->textmap->draw(bitmap, cliprect, priority, priority_mark); /* other layers are handled differently per-system */ else @@ -1268,10 +1268,10 @@ if (info->bank[banknum] != offset) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); info->bank[banknum] = offset; - tilemap_mark_all_tiles_dirty_all(machine); + machine.tilemap().mark_all_dirty(); } } @@ -1291,12 +1291,12 @@ flip = (flip != 0); if (info->flip != flip) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); info->flip = flip; - tilemap_set_flip(info->textmap, flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + info->textmap->set_flip(flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); for (pagenum = 0; pagenum < info->numpages; pagenum++) - tilemap_set_flip(info->tilemaps[pagenum], flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + info->tilemaps[pagenum]->set_flip(flip ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } } @@ -1315,8 +1315,8 @@ enable = (enable != 0); if (info->rowscroll != enable) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); info->rowscroll = enable; } } @@ -1336,8 +1336,8 @@ enable = (enable != 0); if (info->colscroll != enable) { - screen_device *screen = machine.primary_screen; - screen->update_partial(screen->vpos()); + screen_device &screen = *machine.primary_screen; + screen.update_partial(screen.vpos()); info->colscroll = enable; } } @@ -1353,7 +1353,7 @@ WRITE16_HANDLER( segaic16_tileram_0_w ) { COMBINE_DATA(&segaic16_tileram_0[offset]); - tilemap_mark_tile_dirty(bg_tilemap[0].tilemaps[offset / (64*32)], offset % (64*32)); + bg_tilemap[0].tilemaps[offset / (64*32)]->mark_tile_dirty(offset % (64*32)); } @@ -1364,7 +1364,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); COMBINE_DATA(&segaic16_textram_0[offset]); - tilemap_mark_tile_dirty(bg_tilemap[0].textmap, offset); + bg_tilemap[0].textmap->mark_tile_dirty(offset); } @@ -1431,15 +1431,15 @@ } -static void segaic16_road_hangon_draw(struct road_info *info, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void segaic16_road_hangon_draw(struct road_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { UINT16 *roadram = info->roadram; int x, y; /* loop over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); int control = roadram[0x000 + y]; int hpos = roadram[0x100 + (control & 0xff)]; int color0 = roadram[0x200 + (control & 0xff)]; @@ -1474,7 +1474,7 @@ ss8j = 0; /* draw this scanline from the beginning */ - for (x = -24; x <= cliprect->max_x; x++) + for (x = -24; x <= cliprect.max_x; x++) { int md, color, select; @@ -1547,7 +1547,7 @@ } /* write the pixel if we're past the minimum clip */ - if (x >= cliprect->min_x) + if (x >= cliprect.min_x) dest[x] = color; /* ---- the following logic all happens on the 6M clock ---- */ @@ -1701,13 +1701,13 @@ } -static void segaic16_road_outrun_draw(struct road_info *info, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void segaic16_road_outrun_draw(struct road_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { UINT16 *roadram = info->buffer; int x, y; /* loop over scanlines */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { static const UINT8 priority_map[2][8] = { @@ -1718,7 +1718,7 @@ // { 0x80,0x81,0x81,0x83,0,0,0,0x00 }, // { 0x81,0x87,0x87,0x8f,0,0,0,0x00 } }; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); int data0 = roadram[0x000 + y]; int data1 = roadram[0x100 + y]; @@ -1759,7 +1759,7 @@ if (color != -1) { color |= info->colorbase3; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dest[x] = color; } } @@ -1810,7 +1810,7 @@ if (data0 & 0x800) continue; hpos0 = (hpos0 - (0x5f8 + info->xoffs)) & 0xfff; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pix0 = (hpos0 < 0x200) ? src0[hpos0] : 3; dest[x] = color_table[0x00 + pix0]; @@ -1821,7 +1821,7 @@ case 1: hpos0 = (hpos0 - (0x5f8 + info->xoffs)) & 0xfff; hpos1 = (hpos1 - (0x5f8 + info->xoffs)) & 0xfff; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pix0 = (hpos0 < 0x200) ? src0[hpos0] : 3; int pix1 = (hpos1 < 0x200) ? src1[hpos1] : 3; @@ -1837,7 +1837,7 @@ case 2: hpos0 = (hpos0 - (0x5f8 + info->xoffs)) & 0xfff; hpos1 = (hpos1 - (0x5f8 + info->xoffs)) & 0xfff; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pix0 = (hpos0 < 0x200) ? src0[hpos0] : 3; int pix1 = (hpos1 < 0x200) ? src1[hpos1] : 3; @@ -1854,7 +1854,7 @@ if (data1 & 0x800) continue; hpos1 = (hpos1 - (0x5f8 + info->xoffs)) & 0xfff; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { int pix1 = (hpos1 < 0x200) ? src1[hpos1] : 3; dest[x] = color_table[0x10 + pix1]; @@ -1927,7 +1927,7 @@ * *************************************/ -void segaic16_road_draw(int which, bitmap_t *bitmap, const rectangle *cliprect, int priority) +void segaic16_road_draw(int which, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { struct road_info *info = &segaic16_road[which]; (*info->draw)(info, bitmap, cliprect, priority); @@ -2029,7 +2029,7 @@ * *************************************/ -void segaic16_rotate_draw(running_machine &machine, int which, bitmap_t *bitmap, const rectangle *cliprect, bitmap_t *srcbitmap) +void segaic16_rotate_draw(running_machine &machine, int which, bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind16 *srcbitmap) { struct rotate_info *info = &segaic16_rotate[which]; INT32 currx = (info->buffer[0x3f0] << 16) | info->buffer[0x3f1]; @@ -2041,25 +2041,25 @@ int x, y; /* advance forward based on the clip rect */ - currx += dxx * (cliprect->min_x + 27) + dxy * cliprect->min_y; - curry += dyx * (cliprect->min_x + 27) + dyy * cliprect->min_y; + currx += dxx * (cliprect.min_x + 27) + dxy * cliprect.min_y; + curry += dyx * (cliprect.min_x + 27) + dyy * cliprect.min_y; /* loop over screen Y coordinates */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT16 *src = (UINT16 *)srcbitmap->base; - UINT8 *pri = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT16 *src = &srcbitmap->pix16(0); + UINT8 *pri = &machine.priority_bitmap.pix8(y); INT32 tx = currx; INT32 ty = curry; /* loop over screen X coordinates */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { /* fetch the pixel from the source bitmap */ int sx = (tx >> 14) & 0x1ff; int sy = (ty >> 14) & 0x1ff; - int pix = src[sy * srcbitmap->rowpixels + sx]; + int pix = src[sy * srcbitmap->rowpixels() + sx]; /* non-zero pixels get written; everything else is the scanline color */ if (pix != 0xffff) diff -Nru mame-0.144/src/mame/video/segaic16.h mame-0.145/src/mame/video/segaic16.h --- mame-0.144/src/mame/video/segaic16.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segaic16.h 2012-02-06 21:30:33.000000000 +0000 @@ -37,7 +37,7 @@ void segaic16_tilemap_init(running_machine &machine, int which, int type, int colorbase, int xoffs, int numbanks); void segaic16_tilemap_reset(running_machine &machine, int which); -void segaic16_tilemap_draw(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int which, int map, int priority, int priority_mark); +void segaic16_tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int map, int priority, int priority_mark); void segaic16_tilemap_set_bank(running_machine &machine, int which, int banknum, int offset); void segaic16_tilemap_set_flip(running_machine &machine, int which, int flip); void segaic16_tilemap_set_rowscroll(running_machine &machine, int which, int enable); @@ -52,7 +52,7 @@ #define SEGAIC16_SPRITES_OUTRUN 4 #define SEGAIC16_SPRITES_XBOARD 5 -void segaic16_sprites_draw(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int which); +void segaic16_sprites_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which); void segaic16_sprites_set_bank(running_machine &machine, int which, int banknum, int offset); void segaic16_sprites_set_flip(running_machine &machine, int which, int flip); void segaic16_sprites_set_shadow(running_machine &machine, int which, int shadow); @@ -71,7 +71,7 @@ #define SEGAIC16_ROAD_FOREGROUND 1 void segaic16_road_init(running_machine &machine, int which, int type, int colorbase1, int colorbase2, int colorbase3, int xoffs); -void segaic16_road_draw(int which, bitmap_t *bitmap, const rectangle *cliprect, int priority); +void segaic16_road_draw(int which, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority); READ16_HANDLER( segaic16_road_control_0_r ); WRITE16_HANDLER( segaic16_road_control_0_w ); @@ -81,7 +81,7 @@ #define SEGAIC16_ROTATE_YBOARD 0 void segaic16_rotate_init(running_machine &machine, int which, int type, int colorbase); -void segaic16_rotate_draw(running_machine &machine, int which, bitmap_t *bitmap, const rectangle *cliprect, bitmap_t *srcbitmap); +void segaic16_rotate_draw(running_machine &machine, int which, bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind16 *srcbitmap); READ16_HANDLER( segaic16_rotate_control_0_r ); /************************************* @@ -118,7 +118,7 @@ struct tilemap_callback_info tmap_info[16]; /* callback info for 16 tilemap pages */ struct tilemap_callback_info textmap_info; /* callback info for a single textmap page */ void (*reset)(running_machine &machine, struct tilemap_info *info);/* reset callback */ - void (*draw_layer)(running_machine &machine, struct tilemap_info *info, bitmap_t *bitmap, const rectangle *cliprect, int which, int flags, int priority); + void (*draw_layer)(running_machine &machine, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority); UINT16 * textram; /* pointer to textram pointer */ UINT16 * tileram; /* pointer to tileram pointer */ emu_timer * latch_timer; /* timer for latching 16b tilemap scroll values */ @@ -133,7 +133,7 @@ UINT16 colorbase2; /* color base for road background data */ UINT16 colorbase3; /* color base for sky data */ INT32 xoffs; /* X scroll offset */ - void (*draw)(struct road_info *info, bitmap_t *bitmap, const rectangle *cliprect, int priority); + void (*draw)(struct road_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority); UINT16 * roadram; /* pointer to roadram pointer */ UINT16 * buffer; /* buffered roadram pointer */ UINT8 * gfx; /* expanded road graphics */ @@ -165,7 +165,7 @@ UINT16 colorbase; /* base color index */ INT32 ramsize; /* size of sprite RAM */ INT32 xoffs; /* X scroll offset */ - void (*draw)(running_machine &machine, device_t* device, bitmap_t *bitmap, const rectangle *cliprect); + void (*draw)(running_machine &machine, device_t* device, bitmap_ind16 &bitmap, const rectangle &cliprect); int buffer; /* should ram be buffered? */ }; @@ -183,7 +183,7 @@ UINT16 colorbase; /* base color index */ INT32 ramsize; /* size of sprite RAM */ INT32 xoffs; /* X scroll offset */ - void (*draw)(running_machine &machine, device_t* device, bitmap_t *bitmap, const rectangle *cliprect); + void (*draw)(running_machine &machine, device_t* device, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT16 * spriteram; /* pointer to spriteram pointer */ UINT16 * buffer; /* buffered spriteram for those that use it */ @@ -195,17 +195,17 @@ DECLARE_LEGACY_DEVICE(SEGA16SP, sega16sp); -void segaic16_sprites_hangon_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_sharrier_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_16a_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_16b_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_yboard_16b_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_yboard_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_outrun_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_xboard_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_16a_bootleg_wb3bl_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_16a_bootleg_passhtb_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); -void segaic16_sprites_16a_bootleg_shinobld_draw(running_machine &machine, device_t *device, bitmap_t *bitmap, const rectangle *cliprect); +void segaic16_sprites_hangon_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_sharrier_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_16a_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_16b_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_yboard_16b_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_yboard_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_outrun_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_xboard_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_16a_bootleg_wb3bl_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_16a_bootleg_passhtb_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); +void segaic16_sprites_16a_bootleg_shinobld_draw(running_machine &machine, device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect); /* the various sprite configs */ static const sega16sp_interface hangon_sega16sp_intf = diff -Nru mame-0.144/src/mame/video/segaic24.c mame-0.145/src/mame/video/segaic24.c --- mame-0.144/src/mame/video/segaic24.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/segaic24.c 2012-02-06 21:30:33.000000000 +0000 @@ -44,11 +44,11 @@ 8*32 }; -void segas24_tile::tile_info(int offset, tile_data *tileinfo, tilemap_memory_index tile_index) +void segas24_tile::tile_info(int offset, tile_data &tileinfo, tilemap_memory_index tile_index) { UINT16 val = tile_ram[tile_index|offset]; - tileinfo->category = (val & 0x8000) != 0; - tileinfo_set(machine(), tileinfo, char_gfx_index, val & tile_mask, (val >> 7) & 0xff, 0); + tileinfo.category = (val & 0x8000) != 0; + tileinfo.set(machine(), char_gfx_index, val & tile_mask, (val >> 7) & 0xff, 0); } TILE_GET_INFO_DEVICE( segas24_tile::tile_info_0s ) @@ -86,10 +86,10 @@ tile_layer[2] = tilemap_create_device(this, tile_info_1s, tilemap_scan_rows, 8, 8, 64, 64); tile_layer[3] = tilemap_create_device(this, tile_info_1w, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(tile_layer[0], 0); - tilemap_set_transparent_pen(tile_layer[1], 0); - tilemap_set_transparent_pen(tile_layer[2], 0); - tilemap_set_transparent_pen(tile_layer[3], 0); + tile_layer[0]->set_transparent_pen(0); + tile_layer[1]->set_transparent_pen(0); + tile_layer[2]->set_transparent_pen(0); + tile_layer[3]->set_transparent_pen(0); memset(char_ram, 0, 0x80000); memset(tile_ram, 0, 0x10000); @@ -100,19 +100,19 @@ save_pointer(NAME(char_ram), 0x80000/2); } -void segas24_tile::draw_rect(bitmap_t *bm, bitmap_t *tm, bitmap_t *dm, const UINT16 *mask, +void segas24_tile::draw_rect(bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const UINT16 *mask, UINT16 tpri, UINT8 lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) { int y; - const UINT16 *source = ((UINT16 *)bm->base) + sx + sy*bm->rowpixels; - const UINT8 *trans = ((UINT8 *) tm->base) + sx + sy*tm->rowpixels; - UINT8 *prib = (UINT8 *)machine().priority_bitmap->base; - UINT16 *dest = (UINT16 *)dm->base; + const UINT16 *source = &bm.pix16(sy, sx); + const UINT8 *trans = &tm.pix8(sy, sx); + UINT8 *prib = &machine().priority_bitmap.pix8(0); + UINT16 *dest = &dm.pix16(0); tpri |= TILEMAP_PIXEL_LAYER0; - dest += yy1*dm->rowpixels + xx1; - prib += yy1*machine().priority_bitmap->rowpixels + xx1; + dest += yy1*dm.rowpixels() + xx1; + prib += yy1*machine().priority_bitmap.rowpixels() + xx1; mask += yy1*4; yy2 -= yy1; @@ -221,10 +221,10 @@ llx -= 128; cur_x = 0; } - source += bm->rowpixels; - trans += tm->rowpixels; - dest += dm->rowpixels; - prib += machine().priority_bitmap->rowpixels; + source += bm.rowpixels(); + trans += tm.rowpixels(); + dest += dm.rowpixels(); + prib += machine().priority_bitmap.rowpixels(); mask += 4; } } @@ -234,18 +234,18 @@ // about sprite priority hence the lack of support for the // priority_bitmap -void segas24_tile::draw_rect_rgb(bitmap_t *bm, bitmap_t *tm, bitmap_t *dm, const UINT16 *mask, +void segas24_tile::draw_rect(bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const UINT16 *mask, UINT16 tpri, UINT8 lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) { int y; - const UINT16 *source = ((UINT16 *)bm->base) + sx + sy*bm->rowpixels; - const UINT8 *trans = ((UINT8 *) tm->base) + sx + sy*tm->rowpixels; - UINT16 *dest = (UINT16 *)dm->base; + const UINT16 *source = &bm.pix16(sy, sx); + const UINT8 *trans = &tm.pix8(sy, sx); + UINT32 *dest = &dm.pix32(0); const pen_t *pens = machine().pens; tpri |= TILEMAP_PIXEL_LAYER0; - dest += yy1*dm->rowpixels + xx1; + dest += yy1*dm.rowpixels() + xx1; mask += yy1*4; yy2 -= yy1; @@ -258,7 +258,7 @@ for(y=0; yrowpixels; - trans += tm->rowpixels; - dest += dm->rowpixels; + source += bm.rowpixels(); + trans += tm.rowpixels(); + dest += dm.rowpixels(); mask += 4; } } -void segas24_tile::draw(bitmap_t *bitmap, const rectangle *cliprect, int layer, int lpri, int flags) +template +void segas24_tile::draw_common(_BitmapClass &bitmap, const rectangle &cliprect, int layer, int lpri, int flags) { UINT16 hscr = tile_ram[0x5000+(layer >> 1)]; UINT16 vscr = tile_ram[0x5004+(layer >> 1)]; @@ -366,8 +367,8 @@ if(layer & 1) return; - tilemap_set_scrolly(tile_layer[layer], 0, vscr & 0x1ff); - tilemap_set_scrolly(tile_layer[layer|1], 0, vscr & 0x1ff); + tile_layer[layer]->set_scrolly(0, vscr & 0x1ff); + tile_layer[layer|1]->set_scrolly(0, vscr & 0x1ff); if(hscr & 0x8000) { UINT16 *hscrtb = tile_ram + 0x4000 + 0x200*layer; @@ -378,9 +379,9 @@ UINT16 v = (-vscr) & 0x1ff; if(!((-vscr) & 0x200)) layer ^= 1; - for(y=cliprect->min_y; y<=cliprect->max_y; y++) { + for(y=cliprect.min_y; y<=cliprect.max_y; y++) { UINT16 h; - rectangle c = *cliprect; + rectangle c = cliprect; int l1 = layer; if(y >= v) l1 ^= 1; @@ -390,24 +391,24 @@ hscr = hscrtb[y]; h = hscr & 0x1ff; - tilemap_set_scrollx(tile_layer[l1], 0, -h); - tilemap_draw(bitmap, &c, tile_layer[l1], tpri, lpri); + tile_layer[l1]->set_scrollx(0, -h); + tile_layer[l1]->draw(bitmap, c, tpri, lpri); } break; } case 2: case 3: { int y; - for(y=cliprect->min_y; y<=cliprect->max_y; y++) { + for(y=cliprect.min_y; y<=cliprect.max_y; y++) { UINT16 h; - rectangle c1 = *cliprect; - rectangle c2 = *cliprect; + rectangle c1 = cliprect; + rectangle c2 = cliprect; int l1 = layer; hscr = hscrtb[y]; h = hscr & 0x1ff; - tilemap_set_scrollx(tile_layer[layer], 0, -h); - tilemap_set_scrollx(tile_layer[layer|1], 0, -h); + tile_layer[layer]->set_scrollx(0, -h); + tile_layer[layer|1]->set_scrollx(0, -h); if(c1.max_x >= h) c1.max_x = h-1; @@ -418,21 +419,21 @@ c1.min_y = c1.max_y = c2.min_y = c2.max_y = y; - tilemap_draw(bitmap, &c1, tile_layer[l1], tpri, lpri); - tilemap_draw(bitmap, &c2, tile_layer[l1^1], tpri, lpri); + tile_layer[l1]->draw(bitmap, c1, tpri, lpri); + tile_layer[l1^1]->draw(bitmap, c2, tpri, lpri); } break; } } } else { - tilemap_set_scrollx(tile_layer[layer], 0, -(hscr & 0x1ff)); - tilemap_set_scrollx(tile_layer[layer|1], 0, -(hscr & 0x1ff)); + tile_layer[layer]->set_scrollx(0, -(hscr & 0x1ff)); + tile_layer[layer|1]->set_scrollx(0, -(hscr & 0x1ff)); switch((ctrl & 0x6000) >> 13) { case 1: { - rectangle c1 = *cliprect; - rectangle c2 = *cliprect; + rectangle c1 = cliprect; + rectangle c2 = cliprect; UINT16 v; v = (-vscr) & 0x1ff; if(c1.max_y >= v) @@ -442,13 +443,13 @@ if(!((-vscr) & 0x200)) layer ^= 1; - tilemap_draw(bitmap, &c1, tile_layer[layer], tpri, lpri); - tilemap_draw(bitmap, &c2, tile_layer[layer^1], tpri, lpri); + tile_layer[layer]->draw(bitmap, c1, tpri, lpri); + tile_layer[layer^1]->draw(bitmap, c2, tpri, lpri); break; } case 2: case 3: { - rectangle c1 = *cliprect; - rectangle c2 = *cliprect; + rectangle c1 = cliprect; + rectangle c2 = cliprect; UINT16 h; h = (+hscr) & 0x1ff; if(c1.max_x >= h) @@ -458,26 +459,18 @@ if(!((+hscr) & 0x200)) layer ^= 1; - tilemap_draw(bitmap, &c1, tile_layer[layer], tpri, lpri); - tilemap_draw(bitmap, &c2, tile_layer[layer^1], tpri, lpri); + tile_layer[layer]->draw(bitmap, c1, tpri, lpri); + tile_layer[layer^1]->draw(bitmap, c2, tpri, lpri); break; } } } } else { - bitmap_t *bm, *tm; - void (segas24_tile::*draw)(bitmap_t *, bitmap_t *, bitmap_t *, const UINT16 *, - UINT16, UINT8, int, int, int, int, int, int, int); int win = layer & 1; - if(bitmap->format != BITMAP_FORMAT_INDEXED16) - draw = &segas24_tile::draw_rect_rgb; - else - draw = &segas24_tile::draw_rect; - - bm = tilemap_get_pixmap(tile_layer[layer]); - tm = tilemap_get_flagsmap(tile_layer[layer]); + bitmap_ind16 &bm = tile_layer[layer]->pixmap(); + bitmap_ind8 &tm = tile_layer[layer]->flagsmap(); if(hscr & 0x8000) { int y; @@ -488,11 +481,11 @@ hscr = (-hscrtb[y]) & 0x1ff; if(hscr + 496 <= 512) { // Horizontal split unnecessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1); } else { // Horizontal split necessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 512-hscr, y+1); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, y, 496, y+1); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 512-hscr, y+1); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, y, 496, y+1); } vscr = (vscr + 1) & 0x1ff; } @@ -504,31 +497,37 @@ // Horizontal split unnecessary if(vscr + 384 <= 512) { // Vertical split unnecessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 384); } else { // Vertical split necessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 512-vscr); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 496, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 512-vscr); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 496, 384); } } else { // Horizontal split necessary if(vscr + 384 <= 512) { // Vertical split unnecessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 384); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 384); } else { // Vertical split necessary - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 512-vscr); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 512-hscr, 384); - (this->*draw)(bm, tm, bitmap, mask, tpri, lpri, win, 0, 0, 512-hscr, 512-vscr, 496, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 512-vscr); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 512-hscr, 384); + draw_rect(bm, tm, bitmap, mask, tpri, lpri, win, 0, 0, 512-hscr, 512-vscr, 496, 384); } } } } } +void segas24_tile::draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int lpri, int flags) +{ draw_common(bitmap, cliprect, layer, lpri, flags); } + +void segas24_tile::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int lpri, int flags) +{ draw_common(bitmap, cliprect, layer, lpri, flags); } + READ16_MEMBER(segas24_tile::tile_r) { return tile_ram[offset]; @@ -543,7 +542,7 @@ { COMBINE_DATA(tile_ram + offset); if(offset < 0x4000) - tilemap_mark_tile_dirty(tile_layer[offset >> 12], offset & 0xfff); + tile_layer[offset >> 12]->mark_tile_dirty(offset & 0xfff); } WRITE16_MEMBER(segas24_tile::char_w) @@ -613,7 +612,7 @@ 0 11------ -------- */ -void segas24_sprite::draw(bitmap_t *bitmap, const rectangle *cliprect, const int *spri) +void segas24_sprite::draw(bitmap_ind16 &bitmap, const rectangle &cliprect, const int *spri) { UINT16 curspr = 0; int countspr = 0; @@ -690,14 +689,14 @@ } - if(min_x < cliprect->min_x) - min_x = cliprect->min_x; - if(min_y < cliprect->min_y) - min_y = cliprect->min_y; - if(max_x > cliprect->max_x) - max_x = cliprect->max_x; - if(max_y > cliprect->max_y) - max_y = cliprect->max_y; + if(min_x < cliprect.min_x) + min_x = cliprect.min_x; + if(min_y < cliprect.min_y) + min_y = cliprect.min_y; + if(max_x > cliprect.max_x) + max_x = cliprect.max_x; + if(max_y > cliprect.max_y) + max_y = cliprect.max_y; if(!(source[0] & 0x2000)) zoomx = zoomy = source[1] & 0xff; @@ -775,11 +774,11 @@ int zx1 = flipx ? 7-zx : zx; UINT32 neweroffset = (newoffset+(zx1>>2))&0x1ffff; // crackdown sometimes attempts to use data past the end of spriteram int c = (sprite_ram[neweroffset] >> (((~zx1) & 3) << 2)) & 0xf; - UINT8 *pri = BITMAP_ADDR8(machine().priority_bitmap, ypos1, xpos2); + UINT8 *pri = &machine().priority_bitmap.pix8(ypos1, xpos2); if(!(*pri & pm[c])) { c = colors[c]; if(c) { - UINT16 *dst = BITMAP_ADDR16(bitmap, ypos1, xpos2); + UINT16 *dst = &bitmap.pix16(ypos1, xpos2); if(c==1) *dst = (*dst) | 0x2000; else diff -Nru mame-0.144/src/mame/video/segaic24.h mame-0.145/src/mame/video/segaic24.h --- mame-0.144/src/mame/video/segaic24.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segaic24.h 2012-02-06 21:30:33.000000000 +0000 @@ -30,7 +30,8 @@ DECLARE_READ32_MEMBER(char32_r); DECLARE_WRITE32_MEMBER(char32_w); - void draw(bitmap_t *bitmap, const rectangle *cliprect, int layer, int pri, int flags); + void draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int pri, int flags); + void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, int layer, int pri, int flags); protected: virtual void device_start(); @@ -47,17 +48,19 @@ static const gfx_layout char_layout; - void tile_info(int offset, tile_data *tileinfo, tilemap_memory_index tile_index); + void tile_info(int offset, tile_data &tileinfo, tilemap_memory_index tile_index); static TILE_GET_INFO_DEVICE(tile_info_0s); static TILE_GET_INFO_DEVICE(tile_info_0w); static TILE_GET_INFO_DEVICE(tile_info_1s); static TILE_GET_INFO_DEVICE(tile_info_1w); - void draw_rect(bitmap_t *bm, bitmap_t *tm, bitmap_t *dm, const UINT16 *mask, + void draw_rect(bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const UINT16 *mask, UINT16 tpri, UINT8 lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); - void draw_rect_rgb(bitmap_t *bm, bitmap_t *tm, bitmap_t *dm, const UINT16 *mask, + void draw_rect(bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const UINT16 *mask, UINT16 tpri, UINT8 lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); + template + void draw_common(_BitmapClass &bitmap, const rectangle &cliprect, int layer, int pri, int flags); }; class segas24_sprite : public device_t @@ -70,7 +73,7 @@ DECLARE_READ16_MEMBER(read); DECLARE_WRITE16_MEMBER(write); - void draw(bitmap_t *bitmap, const rectangle *cliprect, const int *spri); + void draw(bitmap_ind16 &bitmap, const rectangle &cliprect, const int *spri); protected: virtual void device_start(); diff -Nru mame-0.144/src/mame/video/segaorun.c mame-0.145/src/mame/video/segaorun.c --- mame-0.144/src/mame/video/segaorun.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segaorun.c 2012-02-06 21:30:33.000000000 +0000 @@ -49,10 +49,10 @@ * *************************************/ -SCREEN_UPDATE( shangon ) +SCREEN_UPDATE_IND16( shangon ) { /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw the low priority road layer */ segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_BACKGROUND); @@ -80,17 +80,17 @@ } -SCREEN_UPDATE( outrun ) +SCREEN_UPDATE_IND16( outrun ) { /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw the low priority road layer */ segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_BACKGROUND); diff -Nru mame-0.144/src/mame/video/segas16a.c mame-0.145/src/mame/video/segas16a.c --- mame-0.144/src/mame/video/segas16a.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segas16a.c 2012-02-06 21:30:33.000000000 +0000 @@ -33,25 +33,26 @@ * *************************************/ -SCREEN_UPDATE( system16a ) +SCREEN_UPDATE_IND16( system16a ) { /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw background opaquely first, not setting any priorities */ segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0 | TILEMAP_DRAW_OPAQUE, 0x00); segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1 | TILEMAP_DRAW_OPAQUE, 0x00); /* draw background again, just to set the priorities on non-transparent pixels */ - segaic16_tilemap_draw(screen, NULL, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0, 0x01); - segaic16_tilemap_draw(screen, NULL, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1, 0x02); + bitmap_ind16 dummy_bitmap; + segaic16_tilemap_draw(screen, dummy_bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0, 0x01); + segaic16_tilemap_draw(screen, dummy_bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1, 0x02); /* draw foreground */ segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_FOREGROUND, 0, 0x02); diff -Nru mame-0.144/src/mame/video/segas16b.c mame-0.145/src/mame/video/segas16b.c --- mame-0.144/src/mame/video/segas16b.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segas16b.c 2012-02-06 21:30:33.000000000 +0000 @@ -45,25 +45,26 @@ * *************************************/ -SCREEN_UPDATE( system16b ) +SCREEN_UPDATE_IND16( system16b ) { /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw background opaquely first, not setting any priorities */ segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0 | TILEMAP_DRAW_OPAQUE, 0x00); segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1 | TILEMAP_DRAW_OPAQUE, 0x00); /* draw background again, just to set the priorities on non-transparent pixels */ - segaic16_tilemap_draw(screen, NULL, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0, 0x01); - segaic16_tilemap_draw(screen, NULL, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1, 0x02); + bitmap_ind16 dummy_bitmap; + segaic16_tilemap_draw(screen, dummy_bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0, 0x01); + segaic16_tilemap_draw(screen, dummy_bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1, 0x02); /* draw foreground */ segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_FOREGROUND, 0, 0x02); diff -Nru mame-0.144/src/mame/video/segas18.c mame-0.145/src/mame/video/segas18.c --- mame-0.144/src/mame/video/segas18.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/segas18.c 2012-02-06 21:30:31.000000000 +0000 @@ -47,7 +47,7 @@ /* create a temp bitmap to draw the VDP data into */ width = machine.primary_screen->width(); height = machine.primary_screen->height(); - state->m_tmp_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + state->m_tmp_bitmap = auto_bitmap_ind16_alloc(machine, width, height); state->save_item(NAME(state->m_grayscale_enable)); @@ -116,19 +116,19 @@ * *************************************/ -static void draw_vdp(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void draw_vdp(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { - segas1x_state *state = screen->machine().driver_data(); + segas1x_state *state = screen.machine().driver_data(); int x, y; - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *src = BITMAP_ADDR16(state->m_tmp_bitmap, y, 0); - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); + UINT16 *src = &state->m_tmp_bitmap->pix16(y); + UINT16 *dst = &bitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = src[x]; if (pix != 0xffff) @@ -148,9 +148,9 @@ * *************************************/ -SCREEN_UPDATE( system18 ) +SCREEN_UPDATE_IND16( system18 ) { - segas1x_state *state = screen->machine().driver_data(); + segas1x_state *state = screen.machine().driver_data(); int vdppri, vdplayer; /* @@ -188,30 +188,30 @@ vdppri = (state->m_vdp_mixing & 1) ? (1 << vdplayer) : 0; #if DEBUG_VDP - if (screen->machine().input().code_pressed(KEYCODE_Q)) vdplayer = 0; - if (screen->machine().input().code_pressed(KEYCODE_W)) vdplayer = 1; - if (screen->machine().input().code_pressed(KEYCODE_E)) vdplayer = 2; - if (screen->machine().input().code_pressed(KEYCODE_R)) vdplayer = 3; - if (screen->machine().input().code_pressed(KEYCODE_A)) vdppri = 0x00; - if (screen->machine().input().code_pressed(KEYCODE_S)) vdppri = 0x01; - if (screen->machine().input().code_pressed(KEYCODE_D)) vdppri = 0x02; - if (screen->machine().input().code_pressed(KEYCODE_F)) vdppri = 0x04; - if (screen->machine().input().code_pressed(KEYCODE_G)) vdppri = 0x08; + if (screen.machine().input().code_pressed(KEYCODE_Q)) vdplayer = 0; + if (screen.machine().input().code_pressed(KEYCODE_W)) vdplayer = 1; + if (screen.machine().input().code_pressed(KEYCODE_E)) vdplayer = 2; + if (screen.machine().input().code_pressed(KEYCODE_R)) vdplayer = 3; + if (screen.machine().input().code_pressed(KEYCODE_A)) vdppri = 0x00; + if (screen.machine().input().code_pressed(KEYCODE_S)) vdppri = 0x01; + if (screen.machine().input().code_pressed(KEYCODE_D)) vdppri = 0x02; + if (screen.machine().input().code_pressed(KEYCODE_F)) vdppri = 0x04; + if (screen.machine().input().code_pressed(KEYCODE_G)) vdppri = 0x08; #endif /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* if the VDP is enabled, update our tmp_bitmap */ if (state->m_vdp_enable) - system18_vdp_update(state->m_tmp_bitmap, cliprect); + system18_vdp_update(*state->m_tmp_bitmap, cliprect); /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw background opaquely first, not setting any priorities */ segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0 | TILEMAP_DRAW_OPAQUE, 0x00); @@ -237,12 +237,12 @@ segaic16_sprites_draw(screen, bitmap, cliprect, 0); #if DEBUG_VDP - if (state->m_vdp_enable && screen->machine().input().code_pressed(KEYCODE_V)) + if (state->m_vdp_enable && screen.machine().input().code_pressed(KEYCODE_V)) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); update_system18_vdp(bitmap, cliprect); } - if (vdp_enable && screen->machine().input().code_pressed(KEYCODE_B)) + if (vdp_enable && screen.machine().input().code_pressed(KEYCODE_B)) { FILE *f = fopen("vdp.bin", "w"); fwrite(state->m_tmp_bitmap->base, 1, state->m_tmp_bitmap->rowpixels * (state->m_tmp_bitmap->bpp / 8) * state->m_tmp_bitmap->height, f); diff -Nru mame-0.144/src/mame/video/segas24.c mame-0.145/src/mame/video/segas24.c --- mame-0.144/src/mame/video/segas24.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/segas24.c 2012-02-06 21:30:31.000000000 +0000 @@ -23,17 +23,17 @@ }; }; -SCREEN_UPDATE(system24) +SCREEN_UPDATE_IND16(system24) { - segas24_state *state = screen->machine().driver_data(); + segas24_state *state = screen.machine().driver_data(); if(state->vmixer->get_reg(13) & 1) { - bitmap_fill(bitmap, 0, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine())); return 0; } - bitmap_fill(screen->machine().priority_bitmap, 0, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0); + bitmap.fill(0, cliprect); std::vector order; order.resize(12); diff -Nru mame-0.144/src/mame/video/segas32.c mame-0.145/src/mame/video/segas32.c --- mame-0.144/src/mame/video/segas32.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segas32.c 2012-02-06 21:30:31.000000000 +0000 @@ -257,7 +257,7 @@ entry->page = 0xff; entry->bank = 0; entry->next = state->m_cache_head; - tilemap_set_user_data(entry->tmap, entry); + entry->tmap->set_user_data(entry); state->m_cache_head = entry; } @@ -265,7 +265,7 @@ /* allocate the bitmaps (a few extra for multi32) */ for (tmap = 0; tmap < 9 + 2 * multi32; tmap++) { - state->m_layer_data[tmap].bitmap = auto_bitmap_alloc(machine, 416, 224, BITMAP_FORMAT_INDEXED16); + state->m_layer_data[tmap].bitmap = auto_bitmap_ind16_alloc(machine, 416, 224); state->m_layer_data[tmap].transparent = auto_alloc_array_clear(machine, UINT8, 256); } @@ -507,7 +507,7 @@ /* scan the cache for a matching pages */ for (entry = state->m_cache_head; entry != NULL; entry = entry->next) if (entry->page == page) - tilemap_mark_tile_dirty(entry->tmap, offset); + entry->tmap->mark_tile_dirty(offset); } } @@ -545,7 +545,7 @@ /* D1 : Seems to be '1' only during an erase in progress, this occurs very briefly though. D0 : Selected frame buffer (0= A, 1= B) */ - return 0xfffc | (int)(state->m_layer_data[MIXER_LAYER_SPRITES].bitmap < state->m_layer_data[MIXER_LAYER_SPRITES_2].bitmap); + return 0xfffc | (int)(&state->m_layer_data[MIXER_LAYER_SPRITES].bitmap < &state->m_layer_data[MIXER_LAYER_SPRITES_2].bitmap); case 1: /* D1 : ? @@ -743,7 +743,7 @@ /* okay, we didn't find one; take over this last entry */ entry->page = page; entry->bank = bank; - tilemap_mark_all_tiles_dirty(entry->tmap); + entry->tmap->mark_all_dirty(); /* move it to the head */ prev->next = entry->next; @@ -777,7 +777,7 @@ * *************************************/ -static int compute_clipping_extents(screen_device &screen, int enable, int clipout, int clipmask, const rectangle *cliprect, struct extents_list *list) +static int compute_clipping_extents(screen_device &screen, int enable, int clipout, int clipmask, const rectangle &cliprect, struct extents_list *list) { segas32_state *state = screen.machine().driver_data(); int flip = (state->m_system32_videoram[0x1ff00/2] >> 9) & 1; @@ -787,7 +787,7 @@ int i, j, y; /* expand our cliprect to exclude the bottom-right */ - tempclip = *cliprect; + tempclip = cliprect; tempclip.max_x++; tempclip.max_y++; @@ -821,7 +821,7 @@ clips[i].min_x = (visarea.max_x + 1) - ((state->m_system32_videoram[0x1ff64/2 + i * 4] & 0x1ff) + 1); clips[i].min_y = (visarea.max_y + 1) - ((state->m_system32_videoram[0x1ff66/2 + i * 4] & 0x0ff) + 1); } - sect_rect(&clips[i], &tempclip); + clips[i] &= tempclip; sorted[i] = i; } @@ -843,20 +843,20 @@ for (j = 0; j < 5; j++) if (i & (1 << sorted[j])) { - const rectangle *cur = &clips[sorted[j]]; + const rectangle &cur = clips[sorted[j]]; /* see if this intersects our last extent */ - if (extent != &list->extent[i][1] && cur->min_x <= extent[-1]) + if (extent != &list->extent[i][1] && cur.min_x <= extent[-1]) { - if (cur->max_x > extent[-1]) - extent[-1] = cur->max_x; + if (cur.max_x > extent[-1]) + extent[-1] = cur.max_x; } /* otherwise, just append to the list */ else { - *extent++ = cur->min_x; - *extent++ = cur->max_x; + *extent++ = cur.min_x; + *extent++ = cur.max_x; } } @@ -909,11 +909,11 @@ } -static void update_tilemap_zoom(screen_device &screen, struct layer_info *layer, const rectangle *cliprect, int bgnum) +static void update_tilemap_zoom(screen_device &screen, struct layer_info *layer, const rectangle &cliprect, int bgnum) { segas32_state *state = screen.machine().driver_data(); int clipenable, clipout, clips, clipdraw_start; - bitmap_t *bitmap = layer->bitmap; + bitmap_ind16 &bitmap = *layer->bitmap; struct extents_list clip_extents; tilemap_t *tilemaps[4]; UINT32 srcx, srcx_start, srcy; @@ -968,39 +968,38 @@ srcy -= ((INT16)(state->m_system32_videoram[0x1ff32/2 + 2 * bgnum] << 7) >> 7) * srcystep; /* finally, account for destination top,left coordinates */ - srcx_start += cliprect->min_x * srcxstep; - srcy += cliprect->min_y * srcystep; + srcx_start += cliprect.min_x * srcxstep; + srcy += cliprect.min_y * srcystep; /* if we're flipped, simply adjust the start/step parameters */ if (flip) { const rectangle &visarea = screen.visible_area(); - srcx_start += (visarea.max_x - 2 * cliprect->min_x) * srcxstep; - srcy += (visarea.max_y - 2 * cliprect->min_y) * srcystep; + srcx_start += (visarea.max_x - 2 * cliprect.min_x) * srcxstep; + srcy += (visarea.max_y - 2 * cliprect.min_y) * srcystep; srcxstep = -srcxstep; srcystep = -srcystep; } /* loop over the target rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *extents = &clip_extents.extent[clip_extents.scan_extent[y]][0]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); int clipdraw = clipdraw_start; /* optimize for the case where we are clipped out */ - if (clipdraw || extents[1] <= cliprect->max_x) + if (clipdraw || extents[1] <= cliprect.max_x) { - bitmap_t *tm0, *tm1; int transparent = 0; UINT16 *src[2]; /* look up the pages and get their source pixmaps */ - tm0 = tilemap_get_pixmap(tilemaps[((srcy >> 27) & 2) + 0]); - tm1 = tilemap_get_pixmap(tilemaps[((srcy >> 27) & 2) + 1]); - src[0] = BITMAP_ADDR16(tm0, (srcy >> 20) & 0xff, 0); - src[1] = BITMAP_ADDR16(tm1, (srcy >> 20) & 0xff, 0); + bitmap_ind16 &tm0 = tilemaps[((srcy >> 27) & 2) + 0]->pixmap(); + bitmap_ind16 &tm1 = tilemaps[((srcy >> 27) & 2) + 1]->pixmap(); + src[0] = &tm0.pix16((srcy >> 20) & 0xff); + src[1] = &tm1.pix16((srcy >> 20) & 0xff); /* loop over extents */ srcx = srcx_start; @@ -1029,7 +1028,7 @@ } /* stop at the end */ - if (extents[1] > cliprect->max_x) + if (extents[1] > cliprect.max_x) break; /* swap states and advance to the next extent */ @@ -1037,7 +1036,7 @@ extents++; } - layer->transparent[y] = (transparent == cliprect->max_x - cliprect->min_x + 1); + layer->transparent[y] = (transparent == cliprect.max_x - cliprect.min_x + 1); } else layer->transparent[y] = 1; @@ -1063,11 +1062,11 @@ * *************************************/ -static void update_tilemap_rowscroll(screen_device &screen, struct layer_info *layer, const rectangle *cliprect, int bgnum) +static void update_tilemap_rowscroll(screen_device &screen, struct layer_info *layer, const rectangle &cliprect, int bgnum) { segas32_state *state = screen.machine().driver_data(); int clipenable, clipout, clips, clipdraw_start; - bitmap_t *bitmap = layer->bitmap; + bitmap_ind16 &bitmap = *layer->bitmap; struct extents_list clip_extents; tilemap_t *tilemaps[4]; int rowscroll, rowselect; @@ -1109,16 +1108,15 @@ yscroll = (state->m_system32_videoram[0x1ff16/2 + 4 * bgnum] & 0x1ff); /* render the tilemap into its bitmap */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *extents = &clip_extents.extent[clip_extents.scan_extent[y]][0]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); int clipdraw = clipdraw_start; /* optimize for the case where we are clipped out */ - if (clipdraw || extents[1] <= cliprect->max_x) + if (clipdraw || extents[1] <= cliprect.max_x) { - bitmap_t *tm0, *tm1; int transparent = 0; UINT16 *src[2]; int srcxstep; @@ -1127,7 +1125,7 @@ if (!flip) { /* get starting scroll values */ - srcx = cliprect->min_x + xscroll; + srcx = cliprect.min_x + xscroll; srcxstep = 1; srcy = yscroll + y; @@ -1144,7 +1142,7 @@ const rectangle &visarea = screen.visible_area(); /* get starting scroll values */ - srcx = cliprect->max_x + xscroll; + srcx = cliprect.max_x + xscroll; srcxstep = -1; srcy = yscroll + visarea.max_y - y; @@ -1156,10 +1154,10 @@ } /* look up the pages and get their source pixmaps */ - tm0 = tilemap_get_pixmap(tilemaps[((srcy >> 7) & 2) + 0]); - tm1 = tilemap_get_pixmap(tilemaps[((srcy >> 7) & 2) + 1]); - src[0] = BITMAP_ADDR16(tm0, srcy & 0xff, 0); - src[1] = BITMAP_ADDR16(tm1, srcy & 0xff, 0); + bitmap_ind16 &tm0 = tilemaps[((srcy >> 7) & 2) + 0]->pixmap(); + bitmap_ind16 &tm1 = tilemaps[((srcy >> 7) & 2) + 1]->pixmap(); + src[0] = &tm0.pix16(srcy & 0xff); + src[1] = &tm1.pix16(srcy & 0xff); /* loop over extents */ while (1) @@ -1186,7 +1184,7 @@ } /* stop at the end */ - if (extents[1] > cliprect->max_x) + if (extents[1] > cliprect.max_x) break; /* swap states and advance to the next extent */ @@ -1194,7 +1192,7 @@ extents++; } - layer->transparent[y] = (transparent == cliprect->max_x - cliprect->min_x + 1); + layer->transparent[y] = (transparent == cliprect.max_x - cliprect.min_x + 1); } else layer->transparent[y] = 1; @@ -1216,10 +1214,10 @@ * *************************************/ -static void update_tilemap_text(screen_device &screen, struct layer_info *layer, const rectangle *cliprect) +static void update_tilemap_text(screen_device &screen, struct layer_info *layer, const rectangle &cliprect) { segas32_state *state = screen.machine().driver_data(); - bitmap_t *bitmap = layer->bitmap; + bitmap_ind16 &bitmap = *layer->bitmap; UINT16 *tilebase; UINT16 *gfxbase; int startx, starty; @@ -1235,10 +1233,10 @@ gfxbase = &state->m_system32_videoram[(state->m_system32_videoram[0x1ff5c/2] & 7) * 0x2000]; /* compute start/end tile numbers */ - startx = cliprect->min_x / 8; - starty = cliprect->min_y / 8; - endx = cliprect->max_x / 8; - endy = cliprect->max_y / 8; + startx = cliprect.min_x / 8; + starty = cliprect.min_y / 8; + endx = cliprect.max_x / 8; + endy = cliprect.max_y / 8; /* loop over tiles */ for (y = starty; y <= endy; y++) @@ -1251,7 +1249,7 @@ /* non-flipped case */ if (!flip) { - UINT16 *dst = BITMAP_ADDR16(bitmap, y * 8, x * 8); + UINT16 *dst = &bitmap.pix16(y * 8, x * 8); /* loop over rows */ for (iy = 0; iy < 8; iy++) @@ -1301,7 +1299,7 @@ pix += color; dst[7] = pix; - dst += bitmap->rowpixels; + dst += bitmap.rowpixels(); } } @@ -1312,7 +1310,7 @@ int effdstx = visarea.max_x - x * 8; int effdsty = visarea.max_y - y * 8; - UINT16 *dst = BITMAP_ADDR16(bitmap, effdsty, effdstx); + UINT16 *dst = &bitmap.pix16(effdsty, effdstx); /* loop over rows */ for (iy = 0; iy < 8; iy++) @@ -1362,7 +1360,7 @@ pix += color; dst[-7] = pix; - dst -= bitmap->rowpixels; + dst -= bitmap.rowpixels(); } } } @@ -1376,11 +1374,11 @@ * *************************************/ -static void update_bitmap(screen_device &screen, struct layer_info *layer, const rectangle *cliprect) +static void update_bitmap(screen_device &screen, struct layer_info *layer, const rectangle &cliprect) { segas32_state *state = screen.machine().driver_data(); int clipenable, clipout, clips, clipdraw_start; - bitmap_t *bitmap = layer->bitmap; + bitmap_ind16 &bitmap = *layer->bitmap; struct extents_list clip_extents; int xscroll, yscroll; int color; @@ -1402,14 +1400,14 @@ color = (state->m_system32_videoram[0x1ff8c/2] << 4) & 0x1fff0 & ~((1 << bpp) - 1); /* loop over target rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT16 *extents = &clip_extents.extent[clip_extents.scan_extent[y]][0]; - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); int clipdraw = clipdraw_start; /* optimize for the case where we are clipped out */ - if (clipdraw || extents[1] <= cliprect->max_x) + if (clipdraw || extents[1] <= cliprect.max_x) { int transparent = 0; @@ -1457,7 +1455,7 @@ } /* stop at the end */ - if (extents[1] > cliprect->max_x) + if (extents[1] > cliprect.max_x) break; /* swap states and advance to the next extent */ @@ -1465,7 +1463,7 @@ extents++; } - layer->transparent[y] = (transparent == cliprect->max_x - cliprect->min_x + 1); + layer->transparent[y] = (transparent == cliprect.max_x - cliprect.min_x + 1); } else layer->transparent[y] = 1; @@ -1480,14 +1478,14 @@ * *************************************/ -static void update_background(segas32_state *state, struct layer_info *layer, const rectangle *cliprect) +static void update_background(segas32_state *state, struct layer_info *layer, const rectangle &cliprect) { - bitmap_t *bitmap = layer->bitmap; + bitmap_ind16 &bitmap = *layer->bitmap; int x, y; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dst = &bitmap.pix16(y); int color; /* determine the color */ @@ -1497,14 +1495,14 @@ color = state->m_system32_videoram[0x1ff5e/2] & 0x1e00; /* if the color doesn't match, fill */ - if (dst[cliprect->min_x] != color) - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + if (dst[cliprect.min_x] != color) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = color; } } -static UINT8 update_tilemaps(screen_device &screen, const rectangle *cliprect) +static UINT8 update_tilemaps(screen_device &screen, const rectangle &cliprect) { segas32_state *state = screen.machine().driver_data(); int enable0 = !(state->m_system32_videoram[0x1ff02/2] & 0x0001) && !(state->m_system32_videoram[0x1ff8e/2] & 0x0002); @@ -1543,11 +1541,11 @@ static void sprite_erase_buffer(segas32_state *state) { /* erase the visible sprite buffer and clear the checksums */ - bitmap_fill(state->m_layer_data[MIXER_LAYER_SPRITES].bitmap, NULL, 0xffff); + state->m_layer_data[MIXER_LAYER_SPRITES].bitmap->fill(0xffff); /* for multi32, erase the other buffer as well */ if (state->m_is_multi32) - bitmap_fill(state->m_layer_data[MIXER_LAYER_MULTISPR].bitmap, NULL, 0xffff); + state->m_layer_data[MIXER_LAYER_MULTISPR].bitmap->fill(0xffff); } @@ -1613,8 +1611,8 @@ #define sprite_draw_pixel_16(trans) \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= clipin->min_x && x <= clipin->max_x && \ - (!do_clipout || x < clipout->min_x || x > clipout->max_x) && \ + if (x >= clipin.min_x && x <= clipin.max_x && \ + (!do_clipout || x < clipout.min_x || x > clipout.max_x) && \ pix != trans) \ { \ if (!indirect) \ @@ -1642,8 +1640,8 @@ #define sprite_draw_pixel_256(trans) \ /* only draw if onscreen, not 0 or 15 */ \ - if (x >= clipin->min_x && x <= clipin->max_x && \ - (!do_clipout || x < clipout->min_x || x > clipout->max_x) && \ + if (x >= clipin.min_x && x <= clipin.max_x && \ + (!do_clipout || x < clipout.min_x || x > clipout.max_x) && \ pix != trans) \ { \ if (!indirect) \ @@ -1669,7 +1667,7 @@ } \ } -static int draw_one_sprite(running_machine &machine, UINT16 *data, int xoffs, int yoffs, const rectangle *clipin, const rectangle *clipout) +static int draw_one_sprite(running_machine &machine, UINT16 *data, int xoffs, int yoffs, const rectangle &clipin, const rectangle &clipout) { segas32_state *state = machine.driver_data(); static const int transparency_masks[4][4] = @@ -1680,7 +1678,7 @@ { 0x1fff, 0x0fff, 0x07ff, 0x03ff } }; - bitmap_t *bitmap = state->m_layer_data[(!state->m_is_multi32 || !(data[3] & 0x0800)) ? MIXER_LAYER_SPRITES_2 : MIXER_LAYER_MULTISPR_2].bitmap; + bitmap_ind16 &bitmap = *state->m_layer_data[(!state->m_is_multi32 || !(data[3] & 0x0800)) ? MIXER_LAYER_SPRITES_2 : MIXER_LAYER_MULTISPR_2].bitmap; UINT8 numbanks = machine.region("gfx2")->bytes() / 0x400000; const UINT32 *spritebase = (const UINT32 *)machine.region("gfx2")->base(); @@ -1788,15 +1786,15 @@ ytarget = ypos + ydelta * dsth; /* adjust target x for clipping */ - if (xdelta > 0 && xtarget > clipin->max_x) + if (xdelta > 0 && xtarget > clipin.max_x) { - xtarget = clipin->max_x + 1; + xtarget = clipin.max_x + 1; if (xpos >= xtarget) goto bail; } - if (xdelta < 0 && xtarget < clipin->min_x) + if (xdelta < 0 && xtarget < clipin.min_x) { - xtarget = clipin->min_x - 1; + xtarget = clipin.min_x - 1; if (xpos <= xtarget) goto bail; } @@ -1805,10 +1803,10 @@ for (y = ypos; y != ytarget; y += ydelta) { /* skip drawing if not within the inclusive cliprect */ - if (y >= clipin->min_y && y <= clipin->max_y) + if (y >= clipin.min_y && y <= clipin.max_y) { - int do_clipout = (y >= clipout->min_y && y <= clipout->max_y); - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + int do_clipout = (y >= clipout.min_y && y <= clipout.max_y); + UINT16 *dest = &bitmap.pix16(y); int xacc = 0; /* 4bpp case */ @@ -1882,7 +1880,7 @@ g_profiler.start(PROFILER_USER2); - logerror("----\n"); +// logerror("----\n"); /* compute the outer clip */ outerclip.min_x = outerclip.min_y = 0; @@ -1903,7 +1901,7 @@ { /* command 0 = draw sprite */ case 0: - spritenum += 1 + draw_one_sprite(machine, sprite, xoffs, yoffs, &clipin, &clipout); + spritenum += 1 + draw_one_sprite(machine, sprite, xoffs, yoffs, clipin, clipout); break; /* command 1 = set clipping */ @@ -1916,7 +1914,7 @@ clipin.max_y = (INT16)(sprite[1] << 4) >> 4; clipin.min_x = (INT16)(sprite[2] << 4) >> 4; clipin.max_x = (INT16)(sprite[3] << 4) >> 4; - sect_rect(&clipin, &outerclip); + clipin &= outerclip; } /* set the exclusive cliprect */ @@ -2007,10 +2005,10 @@ { if (state->m_layer_data[layer].transparent[scanline]) return (layer == MIXER_LAYER_SPRITES) ? state->m_solid_ffff : state->m_solid_0000; - return BITMAP_ADDR16(state->m_layer_data[layer].bitmap, scanline, 0); + return &state->m_layer_data[layer].bitmap->pix16(scanline); } -static void mix_all_layers(segas32_state *state, int which, int xoffs, bitmap_t *bitmap, const rectangle *cliprect, UINT8 enablemask) +static void mix_all_layers(segas32_state *state, int which, int xoffs, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 enablemask) { int blendenable = state->m_mixer_control[which][0x4e/2] & 0x0800; int blendfactor = (state->m_mixer_control[which][0x4e/2] >> 8) & 7; @@ -2163,30 +2161,30 @@ /* directions; account for this */ if (state->m_sprite_control_latched[0x04/2] & 1) { - sprx_start = cliprect->max_x; + sprx_start = cliprect.max_x; sprdx = -1; } else { - sprx_start = cliprect->min_x; + sprx_start = cliprect.min_x; sprdx = 1; } if (state->m_sprite_control_latched[0x04/2] & 2) { - spry = cliprect->max_y; + spry = cliprect.max_y; sprdy = -1; } else { - spry = cliprect->min_y; + spry = cliprect.min_y; sprdy = 1; } /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++, spry += sprdy) + for (y = cliprect.min_y; y <= cliprect.max_y; y++, spry += sprdy) { - UINT32 *dest = BITMAP_ADDR32(bitmap, y, xoffs); + UINT32 *dest = &bitmap.pix32(y, xoffs); UINT16 *layerbase[8]; /* get the starting address for each layer */ @@ -2200,7 +2198,7 @@ layerbase[MIXER_LAYER_BACKGROUND] = get_layer_scanline(state, MIXER_LAYER_BACKGROUND, y); /* loop over columns */ - for (x = cliprect->min_x, sprx = sprx_start; x <= cliprect->max_x; x++, sprx += sprdx) + for (x = cliprect.min_x, sprx = sprx_start; x <= cliprect.max_x; x++, sprx += sprdx) { struct mixer_layer_info *first; int *rgbdelta; @@ -2421,37 +2419,37 @@ } } -SCREEN_UPDATE( system32 ) +SCREEN_UPDATE_RGB32( system32 ) { - segas32_state *state = screen->machine().driver_data(); + segas32_state *state = screen.machine().driver_data(); UINT8 enablemask; /* update the visible area */ if (state->m_system32_videoram[0x1ff00/2] & 0x8000) - screen->set_visible_area(0, 52*8-1, 0, 28*8-1); + screen.set_visible_area(0, 52*8-1, 0, 28*8-1); else - screen->set_visible_area(0, 40*8-1, 0, 28*8-1); + screen.set_visible_area(0, 40*8-1, 0, 28*8-1); /* if the display is off, punt */ if (!state->m_system32_displayenable[0]) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* update the tilemaps */ g_profiler.start(PROFILER_USER1); - enablemask = update_tilemaps(*screen, cliprect); + enablemask = update_tilemaps(screen, cliprect); g_profiler.stop(); /* debugging */ #if QWERTY_LAYER_ENABLE - if (screen->machine().input().code_pressed(KEYCODE_Q)) enablemask = 0x01; - if (screen->machine().input().code_pressed(KEYCODE_W)) enablemask = 0x02; - if (screen->machine().input().code_pressed(KEYCODE_E)) enablemask = 0x04; - if (screen->machine().input().code_pressed(KEYCODE_R)) enablemask = 0x08; - if (screen->machine().input().code_pressed(KEYCODE_T)) enablemask = 0x10; - if (screen->machine().input().code_pressed(KEYCODE_Y)) enablemask = 0x20; + if (screen.machine().input().code_pressed(KEYCODE_Q)) enablemask = 0x01; + if (screen.machine().input().code_pressed(KEYCODE_W)) enablemask = 0x02; + if (screen.machine().input().code_pressed(KEYCODE_E)) enablemask = 0x04; + if (screen.machine().input().code_pressed(KEYCODE_R)) enablemask = 0x08; + if (screen.machine().input().code_pressed(KEYCODE_T)) enablemask = 0x10; + if (screen.machine().input().code_pressed(KEYCODE_Y)) enablemask = 0x20; #endif /* do the mixing */ @@ -2459,9 +2457,9 @@ mix_all_layers(state, 0, 0, bitmap, cliprect, enablemask); g_profiler.stop(); - if (LOG_SPRITES && screen->machine().input().code_pressed(KEYCODE_L)) + if (LOG_SPRITES && screen.machine().input().code_pressed(KEYCODE_L)) { - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); FILE *f = fopen("sprite.txt", "w"); int x, y; @@ -2537,13 +2535,13 @@ { int showclip = -1; -// if (screen->machine().input().code_pressed(KEYCODE_V)) +// if (screen.machine().input().code_pressed(KEYCODE_V)) // showclip = 0; -// if (screen->machine().input().code_pressed(KEYCODE_B)) +// if (screen.machine().input().code_pressed(KEYCODE_B)) // showclip = 1; -// if (screen->machine().input().code_pressed(KEYCODE_N)) +// if (screen.machine().input().code_pressed(KEYCODE_N)) // showclip = 2; -// if (screen->machine().input().code_pressed(KEYCODE_M)) +// if (screen.machine().input().code_pressed(KEYCODE_M)) // showclip = 3; // if (showclip != -1) for (showclip = 0; showclip < 4; showclip++) @@ -2556,10 +2554,10 @@ for (i = 0; i < 4; i++) if (clips & (1 << i)) { - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); rectangle rect; - pen_t white = get_white_pen(screen->machine()); + pen_t white = get_white_pen(screen.machine()); if (!flip) { rect.min_x = state->m_system32_videoram[0x1ff60/2 + i * 4] & 0x1ff; @@ -2574,19 +2572,19 @@ rect.min_x = (visarea.max_x + 1) - ((state->m_system32_videoram[0x1ff64/2 + i * 4] & 0x1ff) + 1); rect.min_y = (visarea.max_y + 1) - ((state->m_system32_videoram[0x1ff66/2 + i * 4] & 0x0ff) + 1); } - sect_rect(&rect, &screen->visible_area()); + sect_rect(&rect, &screen.visible_area()); if (rect.min_y <= rect.max_y && rect.min_x <= rect.max_x) { for (y = rect.min_y; y <= rect.max_y; y++) { - bitmap->plot(bitmap, rect.min_x, y, white); - bitmap->plot(bitmap, rect.max_x, y, white); + bitmap.plot(bitmap, rect.min_x, y, white); + bitmap.plot(bitmap, rect.max_x, y, white); } for (x = rect.min_x; x <= rect.max_x; x++) { - bitmap->plot(bitmap, x, rect.min_y, white); - bitmap->plot(bitmap, x, rect.max_y, white); + bitmap.plot(bitmap, x, rect.min_y, white); + bitmap.plot(bitmap, x, rect.max_y, white); } } } @@ -2600,54 +2598,52 @@ } -SCREEN_UPDATE( multi32 ) +static UINT32 multi32_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int index) { - segas32_state *state = screen->machine().driver_data(); + segas32_state *state = screen.machine().driver_data(); UINT8 enablemask; - device_t *left_screen = screen->machine().device("lscreen"); - /* update the visible area */ if (state->m_system32_videoram[0x1ff00/2] & 0x8000) - screen->set_visible_area(0, 52*8-1, 0, 28*8-1); + screen.set_visible_area(0, 52*8-1, 0, 28*8-1); else - screen->set_visible_area(0, 40*8-1, 0, 28*8-1); + screen.set_visible_area(0, 40*8-1, 0, 28*8-1); /* if the display is off, punt */ - if (!state->m_system32_displayenable[(screen == left_screen) ? 0 : 1]) + if (!state->m_system32_displayenable[index]) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* update the tilemaps */ g_profiler.start(PROFILER_USER1); - enablemask = update_tilemaps(*screen, cliprect); + enablemask = update_tilemaps(screen, cliprect); g_profiler.stop(); /* debugging */ #if QWERTY_LAYER_ENABLE - if (screen->machine().input().code_pressed(KEYCODE_Q)) enablemask = 0x01; - if (screen->machine().input().code_pressed(KEYCODE_W)) enablemask = 0x02; - if (screen->machine().input().code_pressed(KEYCODE_E)) enablemask = 0x04; - if (screen->machine().input().code_pressed(KEYCODE_R)) enablemask = 0x08; - if (screen->machine().input().code_pressed(KEYCODE_T)) enablemask = 0x10; - if (screen->machine().input().code_pressed(KEYCODE_Y)) enablemask = 0x20; + if (screen.machine().input().code_pressed(KEYCODE_Q)) enablemask = 0x01; + if (screen.machine().input().code_pressed(KEYCODE_W)) enablemask = 0x02; + if (screen.machine().input().code_pressed(KEYCODE_E)) enablemask = 0x04; + if (screen.machine().input().code_pressed(KEYCODE_R)) enablemask = 0x08; + if (screen.machine().input().code_pressed(KEYCODE_T)) enablemask = 0x10; + if (screen.machine().input().code_pressed(KEYCODE_Y)) enablemask = 0x20; #endif /* do the mixing */ g_profiler.start(PROFILER_USER3); - mix_all_layers(state, ((screen == left_screen) ? 0 : 1), 0, bitmap, cliprect, enablemask); + mix_all_layers(state, index, 0, bitmap, cliprect, enablemask); g_profiler.stop(); if (PRINTF_MIXER_DATA) { - if (!screen->machine().input().code_pressed(KEYCODE_M)) print_mixer_data(state, 0); + if (!screen.machine().input().code_pressed(KEYCODE_M)) print_mixer_data(state, 0); else print_mixer_data(state, 1); } - if (LOG_SPRITES && screen->machine().input().code_pressed(KEYCODE_L)) + if (LOG_SPRITES && screen.machine().input().code_pressed(KEYCODE_L)) { - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); FILE *f = fopen("sprite.txt", "w"); int x, y; @@ -2664,6 +2660,8 @@ return 0; } +SCREEN_UPDATE_RGB32( multi32_left ) { return multi32_update(screen, bitmap, cliprect, 0); } +SCREEN_UPDATE_RGB32( multi32_right ) { return multi32_update(screen, bitmap, cliprect, 1); } /* diff -Nru mame-0.144/src/mame/video/segaxbd.c mame-0.145/src/mame/video/segaxbd.c --- mame-0.144/src/mame/video/segaxbd.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segaxbd.c 2012-02-06 21:30:31.000000000 +0000 @@ -34,19 +34,19 @@ * *************************************/ -SCREEN_UPDATE( xboard ) +SCREEN_UPDATE_IND16( xboard ) { - segas1x_state *state = screen->machine().driver_data(); + segas1x_state *state = screen.machine().driver_data(); /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* reset priorities */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* draw the low priority road layer */ segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_BACKGROUND); diff -Nru mame-0.144/src/mame/video/segaybd.c mame-0.145/src/mame/video/segaybd.c --- mame-0.144/src/mame/video/segaybd.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/segaybd.c 2012-02-06 21:30:31.000000000 +0000 @@ -23,7 +23,7 @@ segaic16_palette_init(0x2000); /* allocate a bitmap for the yboard layer */ - state->m_tmp_bitmap = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_INDEXED16); + state->m_tmp_bitmap = auto_bitmap_ind16_alloc(machine, 512, 512); /* initialize the rotation layer */ segaic16_rotate_init(machine, 0, SEGAIC16_ROTATE_YBOARD, 0x000); @@ -39,25 +39,24 @@ * *************************************/ -SCREEN_UPDATE( yboard ) +SCREEN_UPDATE_IND16( yboard ) { - segas1x_state *state = screen->machine().driver_data(); + segas1x_state *state = screen.machine().driver_data(); rectangle yboard_clip; /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } /* draw the yboard sprites */ - yboard_clip.min_x = yboard_clip.min_y = 0; - yboard_clip.max_x = yboard_clip.max_y = 511; - segaic16_sprites_draw(screen, state->m_tmp_bitmap, &yboard_clip, 1); + yboard_clip.set(0, 511, 0, 511); + segaic16_sprites_draw(screen, *state->m_tmp_bitmap, yboard_clip, 1); /* apply rotation */ - segaic16_rotate_draw(screen->machine(), 0, bitmap, cliprect, state->m_tmp_bitmap); + segaic16_rotate_draw(screen.machine(), 0, bitmap, cliprect, state->m_tmp_bitmap); /* draw the 16B sprites */ segaic16_sprites_draw(screen, bitmap, cliprect, 0); diff -Nru mame-0.144/src/mame/video/seibuspi.c mame-0.145/src/mame/video/seibuspi.c --- mame-0.144/src/mame/video/seibuspi.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/seibuspi.c 2012-02-06 21:30:31.000000000 +0000 @@ -31,19 +31,19 @@ if (state->m_rf2_layer_bank[0] != BIT(banks,0)) { state->m_rf2_layer_bank[0] = BIT(banks,0); - tilemap_mark_all_tiles_dirty(state->m_back_layer); + state->m_back_layer->mark_all_dirty(); } if (state->m_rf2_layer_bank[1] != BIT(banks,1)) { state->m_rf2_layer_bank[1] = BIT(banks,1); - tilemap_mark_all_tiles_dirty(state->m_mid_layer); + state->m_mid_layer->mark_all_dirty(); } if (state->m_rf2_layer_bank[2] != BIT(banks,2)) { state->m_rf2_layer_bank[2] = BIT(banks,2); - tilemap_mark_all_tiles_dirty(state->m_fore_layer); + state->m_fore_layer->mark_all_dirty(); } } @@ -59,9 +59,9 @@ { seibuspi_state *state = space->machine().driver_data(); COMBINE_DATA( &state->m_layer_enable ); - tilemap_set_enable(state->m_back_layer, (state->m_layer_enable & 0x1) ^ 0x1); - tilemap_set_enable(state->m_mid_layer, ((state->m_layer_enable >> 1) & 0x1) ^ 0x1); - tilemap_set_enable(state->m_fore_layer, ((state->m_layer_enable >> 2) & 0x1) ^ 0x1); + state->m_back_layer->enable((state->m_layer_enable & 0x1) ^ 0x1); + state->m_mid_layer->enable(((state->m_layer_enable >> 1) & 0x1) ^ 0x1); + state->m_fore_layer->enable(((state->m_layer_enable >> 2) & 0x1) ^ 0x1); } WRITE32_HANDLER( tilemap_dma_start_w ) @@ -79,8 +79,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i] != tile) { state->m_tilemap_ram[i] = tile; - tilemap_mark_tile_dirty( state->m_back_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_back_layer, (i * 2) + 1 ); + state->m_back_layer->mark_tile_dirty((i * 2) ); + state->m_back_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -94,8 +94,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_fore_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_fore_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_fore_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_fore_layer, (i * 2) + 1 ); + state->m_fore_layer->mark_tile_dirty((i * 2) ); + state->m_fore_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -109,8 +109,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_mid_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_mid_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_mid_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_mid_layer, (i * 2) + 1 ); + state->m_mid_layer->mark_tile_dirty((i * 2) ); + state->m_mid_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -124,8 +124,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_text_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_text_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_text_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_text_layer, (i * 2) + 1 ); + state->m_text_layer->mark_tile_dirty((i * 2) ); + state->m_text_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -137,8 +137,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i] != tile) { state->m_tilemap_ram[i] = tile; - tilemap_mark_tile_dirty( state->m_back_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_back_layer, (i * 2) + 1 ); + state->m_back_layer->mark_tile_dirty((i * 2) ); + state->m_back_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -148,8 +148,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_fore_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_fore_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_fore_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_fore_layer, (i * 2) + 1 ); + state->m_fore_layer->mark_tile_dirty((i * 2) ); + state->m_fore_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -159,8 +159,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_mid_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_mid_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_mid_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_mid_layer, (i * 2) + 1 ); + state->m_mid_layer->mark_tile_dirty((i * 2) ); + state->m_mid_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -170,8 +170,8 @@ UINT32 tile = state->m_spimainram[index]; if (state->m_tilemap_ram[i+state->m_text_layer_offset] != tile) { state->m_tilemap_ram[i+state->m_text_layer_offset] = tile; - tilemap_mark_tile_dirty( state->m_text_layer, (i * 2) ); - tilemap_mark_tile_dirty( state->m_text_layer, (i * 2) + 1 ); + state->m_text_layer->mark_tile_dirty((i * 2) ); + state->m_text_layer->mark_tile_dirty((i * 2) + 1 ); } index++; } @@ -218,7 +218,7 @@ COMBINE_DATA( &state->m_video_dma_address ); } -static void drawgfx_blend(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy) +static void drawgfx_blend(bitmap_rgb32 &bitmap, const rectangle &cliprect, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy) { seibuspi_state *state = gfx->machine().driver_data(); const pen_t *pens = &gfx->machine().pens[gfx->color_base]; @@ -237,11 +237,11 @@ y1 = sy; y2 = sy + height - 1; - if (x1 > cliprect->max_x || x2 < cliprect->min_x) + if (x1 > cliprect.max_x || x2 < cliprect.min_x) { return; } - if (y1 > cliprect->max_y || y2 < cliprect->min_y) + if (y1 > cliprect.max_y || y2 < cliprect.min_y) { return; } @@ -261,39 +261,39 @@ } // clip x - if (x1 < cliprect->min_x) + if (x1 < cliprect.min_x) { if (flipx) { - px = width - (cliprect->min_x - x1) - 1; + px = width - (cliprect.min_x - x1) - 1; } else { - px = (cliprect->min_x - x1); + px = (cliprect.min_x - x1); } - x1 = cliprect->min_x; + x1 = cliprect.min_x; } - if (x2 > cliprect->max_x) + if (x2 > cliprect.max_x) { - x2 = cliprect->max_x; + x2 = cliprect.max_x; } // clip y - if (y1 < cliprect->min_y) + if (y1 < cliprect.min_y) { if (flipy) { - py = height - (cliprect->min_y - y1) - 1; + py = height - (cliprect.min_y - y1) - 1; } else { - py = (cliprect->min_y - y1); + py = (cliprect.min_y - y1); } - y1 = cliprect->min_y; + y1 = cliprect.min_y; } - if (y2 > cliprect->max_y) + if (y2 > cliprect.max_y) { - y2 = cliprect->max_y; + y2 = cliprect.max_y; } if (gfx->total_elements <= 0x10000) @@ -306,7 +306,7 @@ // draw for (j=y1; j <= y2; j++) { - UINT32 *p = BITMAP_ADDR32(bitmap, j, 0); + UINT32 *p = &bitmap.pix32(j); UINT8 trans_pen = (1 << state->m_sprite_bpp) - 1; int dp_i = (py * width) + px; py += yd; @@ -343,7 +343,7 @@ { 7*16, 6*16, 5*16, 4*16, 3*16, 2*16, 1*16, 0*16 } }; -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri_mask) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri_mask) { seibuspi_state *state = machine.driver_data(); INT16 xpos, ypos; @@ -481,9 +481,9 @@ state->m_mid_layer = tilemap_create( machine, get_mid_tile_info, tilemap_scan_cols, 16,16,32,32 ); state->m_fore_layer = tilemap_create( machine, get_fore_tile_info, tilemap_scan_cols, 16,16,32,32 ); - tilemap_set_transparent_pen(state->m_text_layer, 31); - tilemap_set_transparent_pen(state->m_mid_layer, 63); - tilemap_set_transparent_pen(state->m_fore_layer, 63); + state->m_text_layer->set_transparent_pen(31); + state->m_mid_layer->set_transparent_pen(63); + state->m_fore_layer->set_transparent_pen(63); state->m_tilemap_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4); state->m_palette_ram = auto_alloc_array_clear(machine, UINT32, 0x3000/4); @@ -540,11 +540,11 @@ int i; int x = state->m_spi_scrollram[scroll] & 0xffff; int y = (state->m_spi_scrollram[scroll] >> 16) & 0xffff; - tilemap_set_scroll_rows(layer, 512); + layer->set_scroll_rows(512); for( i=0; i < 512; i++ ) { - tilemap_set_scrollx(layer, i, x + rows[i]); + layer->set_scrollx(i, x + rows[i]); } - tilemap_set_scrolly(layer, 0, y); + layer->set_scrolly(0, y); } static void set_scroll(tilemap_t *layer, int scroll) @@ -552,13 +552,13 @@ seibuspi_state *state = machine.driver_data(); int x = state->m_spi_scrollram[scroll] & 0xffff; int y = (state->m_spi_scrollram[scroll] >> 16) & 0xffff; - tilemap_set_scrollx(layer, 0, x); - tilemap_set_scrolly(layer, 0, y); + layer->set_scrollx(0, x); + layer->set_scrolly(0, y); } #endif -static void combine_tilemap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tile, int x, int y, int opaque, INT16 *rowscroll) +static void combine_tilemap(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tile, int x, int y, int opaque, INT16 *rowscroll) { seibuspi_state *state = machine.driver_data(); int i,j; @@ -566,15 +566,13 @@ UINT32 *d; UINT8 *t; UINT32 xscroll_mask, yscroll_mask; - bitmap_t *pen_bitmap; - bitmap_t *flags_bitmap; - pen_bitmap = tilemap_get_pixmap(tile); - flags_bitmap = tilemap_get_flagsmap(tile); - xscroll_mask = pen_bitmap->width - 1; - yscroll_mask = pen_bitmap->height - 1; + bitmap_ind16 &pen_bitmap = tile->pixmap(); + bitmap_ind8 &flags_bitmap = tile->flagsmap(); + xscroll_mask = pen_bitmap.width() - 1; + yscroll_mask = pen_bitmap.height() - 1; - for (j=cliprect->min_y; j <= cliprect->max_y; j++) + for (j=cliprect.min_y; j <= cliprect.max_y; j++) { int rx = x; if (rowscroll) @@ -582,10 +580,10 @@ rx += rowscroll[(j+y) & yscroll_mask]; } - d = BITMAP_ADDR32(bitmap, j, 0); - s = BITMAP_ADDR16(pen_bitmap, (j+y) & yscroll_mask, 0); - t = BITMAP_ADDR8(flags_bitmap, (j+y) & yscroll_mask, 0); - for (i=cliprect->min_x+rx; i <= cliprect->max_x+rx; i++) + d = &bitmap.pix32(j); + s = &pen_bitmap.pix16((j+y) & yscroll_mask); + t = &flags_bitmap.pix8((j+y) & yscroll_mask); + for (i=cliprect.min_x+rx; i <= cliprect.max_x+rx; i++) { if (opaque || (t[i & xscroll_mask] & (TILEMAP_PIXEL_LAYER0 | TILEMAP_PIXEL_LAYER1))) { @@ -607,9 +605,9 @@ -SCREEN_UPDATE( spi ) +SCREEN_UPDATE_RGB32( spi ) { - seibuspi_state *state = screen->machine().driver_data(); + seibuspi_state *state = screen.machine().driver_data(); INT16 *back_rowscroll, *mid_rowscroll, *fore_rowscroll; if( state->m_layer_bank & 0x80000000 ) { back_rowscroll = (INT16*)&state->m_tilemap_ram[0x200]; @@ -622,32 +620,32 @@ } if( state->m_layer_enable & 0x1 ) - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (!(state->m_layer_enable & 0x1)) - combine_tilemap(screen->machine(), bitmap, cliprect, state->m_back_layer, state->m_spi_scrollram[0] & 0xffff, (state->m_spi_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll); + combine_tilemap(screen.machine(), bitmap, cliprect, state->m_back_layer, state->m_spi_scrollram[0] & 0xffff, (state->m_spi_scrollram[0] >> 16) & 0xffff, 1, back_rowscroll); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); // if fore layer is enabled, draw priority 1 sprites behind mid layer if (!(state->m_layer_enable & 0x4)) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); if (!(state->m_layer_enable & 0x2)) - combine_tilemap(screen->machine(), bitmap, cliprect, state->m_mid_layer, state->m_spi_scrollram[1] & 0xffff, (state->m_spi_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll); + combine_tilemap(screen.machine(), bitmap, cliprect, state->m_mid_layer, state->m_spi_scrollram[1] & 0xffff, (state->m_spi_scrollram[1] >> 16) & 0xffff, 0, mid_rowscroll); // if fore layer is disabled, draw priority 1 sprites above mid layer if ((state->m_layer_enable & 0x4)) - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); - draw_sprites(screen->machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 2); if (!(state->m_layer_enable & 0x4)) - combine_tilemap(screen->machine(), bitmap, cliprect, state->m_fore_layer, state->m_spi_scrollram[2] & 0xffff, (state->m_spi_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll); + combine_tilemap(screen.machine(), bitmap, cliprect, state->m_fore_layer, state->m_spi_scrollram[2] & 0xffff, (state->m_spi_scrollram[2] >> 16) & 0xffff, 0, fore_rowscroll); - draw_sprites(screen->machine(), bitmap, cliprect, 3); + draw_sprites(screen.machine(), bitmap, cliprect, 3); - combine_tilemap(screen->machine(), bitmap, cliprect, state->m_text_layer, 0, 0, 0, NULL); + combine_tilemap(screen.machine(), bitmap, cliprect, state->m_text_layer, 0, 0, 0, NULL); return 0; } @@ -670,12 +668,12 @@ memset(state->m_alpha_table, 0, 8192 * sizeof(UINT8)); } -SCREEN_UPDATE( sys386f2 ) +SCREEN_UPDATE_RGB32( sys386f2 ) { - bitmap_fill(bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 3); + bitmap.fill(0, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 3); return 0; } diff -Nru mame-0.144/src/mame/video/seicross.c mame-0.145/src/mame/video/seicross.c --- mame-0.144/src/mame/video/seicross.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/seicross.c 2012-02-06 21:30:32.000000000 +0000 @@ -58,7 +58,7 @@ seicross_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( seicross_colorram_w ) @@ -73,8 +73,8 @@ state->m_colorram[offset] = data; state->m_colorram[offset + 0x20] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset + 0x20); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_bg_tilemap->mark_tile_dirty(offset + 0x20); } static TILE_GET_INFO( get_bg_tile_info ) @@ -94,10 +94,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { seicross_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -137,15 +137,15 @@ } } -SCREEN_UPDATE( seicross ) +SCREEN_UPDATE_IND16( seicross ) { - seicross_state *state = screen->machine().driver_data(); + seicross_state *state = screen.machine().driver_data(); int col; for (col = 0; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, state->m_row_scroll[col]); + state->m_bg_tilemap->set_scrolly(col, state->m_row_scroll[col]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sei_crtc.c mame-0.145/src/mame/video/sei_crtc.c --- mame-0.144/src/mame/video/sei_crtc.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sei_crtc.c 2012-02-06 21:30:32.000000000 +0000 @@ -136,26 +136,26 @@ WRITE16_HANDLER( seibucrtc_sc0vram_w ) { COMBINE_DATA(&seibucrtc_sc0vram[offset]); - tilemap_mark_tile_dirty(sc0_tilemap,offset); + sc0_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( seibucrtc_sc2vram_w ) { COMBINE_DATA(&seibucrtc_sc2vram[offset]); - tilemap_mark_tile_dirty(sc2_tilemap,offset); + sc2_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( seibucrtc_sc1vram_w ) { COMBINE_DATA(&seibucrtc_sc1vram[offset]); - tilemap_mark_tile_dirty(sc1_tilemap,offset); + sc1_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( seibucrtc_sc3vram_w ) { COMBINE_DATA(&seibucrtc_sc3vram[offset]); - tilemap_mark_tile_dirty(sc3_tilemap_0,offset); - tilemap_mark_tile_dirty(sc3_tilemap_1,offset); + sc3_tilemap_0->mark_tile_dirty(offset); + sc3_tilemap_1->mark_tile_dirty(offset); } WRITE16_HANDLER( seibucrtc_vregs_w ) @@ -167,7 +167,7 @@ void seibucrtc_sc0bank_w(UINT16 data) { seibucrtc_sc0bank = data & 1; - tilemap_mark_all_tiles_dirty(sc0_tilemap); + sc0_tilemap->mark_all_dirty(); } @@ -206,7 +206,7 @@ SET_TILE_INFO(4, tile, color, 0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int pri) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int pri) { UINT16 *spriteram16 = reinterpret_cast(memory_get_shared(machine, "spriteram")); int offs,fx,fy,x,y,color,sprite; @@ -261,35 +261,35 @@ sc3_tilemap_0 = tilemap_create(machine, seibucrtc_sc3_tile_info,tilemap_scan_rows, 8, 8,32,32); sc3_tilemap_1 = tilemap_create(machine, seibucrtc_sc3_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(sc2_tilemap,15); - tilemap_set_transparent_pen(sc1_tilemap,15); - tilemap_set_transparent_pen(sc3_tilemap_0,15); - tilemap_set_transparent_pen(sc3_tilemap_1,15); + sc2_tilemap->set_transparent_pen(15); + sc1_tilemap->set_transparent_pen(15); + sc3_tilemap_0->set_transparent_pen(15); + sc3_tilemap_1->set_transparent_pen(15); seibucrtc_sc0bank = 0; } -SCREEN_UPDATE( seibu_crtc ) +SCREEN_UPDATE_IND16( seibu_crtc ) { - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x7ff]); //black pen + bitmap.fill(screen.machine().pens[0x7ff], cliprect); //black pen - tilemap_set_scrollx( sc0_tilemap,0, (SEIBU_CRTC_SC0_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); - tilemap_set_scrolly( sc0_tilemap,0, (SEIBU_CRTC_SC0_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); - tilemap_set_scrollx( sc2_tilemap,0, (SEIBU_CRTC_SC2_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); - tilemap_set_scrolly( sc2_tilemap,0, (SEIBU_CRTC_SC2_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); - tilemap_set_scrollx( sc1_tilemap,0, (SEIBU_CRTC_SC1_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); - tilemap_set_scrolly( sc1_tilemap,0, (SEIBU_CRTC_SC1_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); - tilemap_set_scrollx( SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1,0, (SEIBU_CRTC_FIX_SX+64) & 0x1ff ); - tilemap_set_scrolly( SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1,0, (SEIBU_CRTC_FIX_SY+1) & 0x1ff ); - - if(SEIBU_CRTC_ENABLE_SC0) { tilemap_draw(bitmap,cliprect,sc0_tilemap,0,0); } - if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen->machine(), bitmap,cliprect, 2); } - if(SEIBU_CRTC_ENABLE_SC2) { tilemap_draw(bitmap,cliprect,sc2_tilemap,0,0); } - if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen->machine(), bitmap,cliprect, 1); } - if(SEIBU_CRTC_ENABLE_SC1) { tilemap_draw(bitmap,cliprect,sc1_tilemap,0,0); } - if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen->machine(), bitmap,cliprect, 0); } - if(SEIBU_CRTC_ENABLE_SC3) { tilemap_draw(bitmap,cliprect,SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1,0,0); } - if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen->machine(), bitmap,cliprect, 3); } + sc0_tilemap->set_scrollx(0, (SEIBU_CRTC_SC0_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); + sc0_tilemap->set_scrolly(0, (SEIBU_CRTC_SC0_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); + sc2_tilemap->set_scrollx(0, (SEIBU_CRTC_SC2_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); + sc2_tilemap->set_scrolly(0, (SEIBU_CRTC_SC2_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); + sc1_tilemap->set_scrollx(0, (SEIBU_CRTC_SC1_SX + SEIBU_CRTC_FIX_SX+64) & 0x1ff ); + sc1_tilemap->set_scrolly(0, (SEIBU_CRTC_SC1_SY + SEIBU_CRTC_FIX_SY+1) & 0x1ff ); + (SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1)->set_scrollx(0, (SEIBU_CRTC_FIX_SX+64) & 0x1ff ); + (SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1)->set_scrolly(0, (SEIBU_CRTC_FIX_SY+1) & 0x1ff ); + + if(SEIBU_CRTC_ENABLE_SC0) { sc0_tilemap->draw(bitmap, cliprect, 0,0); } + if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen.machine(), bitmap,cliprect, 2); } + if(SEIBU_CRTC_ENABLE_SC2) { sc2_tilemap->draw(bitmap, cliprect, 0,0); } + if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen.machine(), bitmap,cliprect, 1); } + if(SEIBU_CRTC_ENABLE_SC1) { sc1_tilemap->draw(bitmap, cliprect, 0,0); } + if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen.machine(), bitmap,cliprect, 0); } + if(SEIBU_CRTC_ENABLE_SC3) { (SEIBU_CRTC_SC3_PAGE_SEL ? sc3_tilemap_0 : sc3_tilemap_1)->draw(bitmap, cliprect, 0,0); } + if(SEIBU_CRTC_ENABLE_SPR) { draw_sprites(screen.machine(), bitmap,cliprect, 3); } return 0; } diff -Nru mame-0.144/src/mame/video/senjyo.c mame-0.145/src/mame/video/senjyo.c --- mame-0.144/src/mame/video/senjyo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/senjyo.c 2012-02-06 21:30:32.000000000 +0000 @@ -111,11 +111,11 @@ state->m_bg3_tilemap = tilemap_create(machine, get_bg3_tile_info, tilemap_scan_rows, 16, 16, 16, 32); /* only 16x32 used by Star Force */ } - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg1_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg2_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg3_tilemap, 0); - tilemap_set_scroll_cols(state->m_fg_tilemap, 32); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg1_tilemap->set_transparent_pen(0); + state->m_bg2_tilemap->set_transparent_pen(0); + state->m_bg3_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scroll_cols(32); } @@ -131,35 +131,35 @@ senjyo_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( senjyo_fgcolorram_w ) { senjyo_state *state = space->machine().driver_data(); state->m_fgcolorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( senjyo_bg1videoram_w ) { senjyo_state *state = space->machine().driver_data(); state->m_bg1videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset); + state->m_bg1_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( senjyo_bg2videoram_w ) { senjyo_state *state = space->machine().driver_data(); state->m_bg2videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset); + state->m_bg2_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( senjyo_bg3videoram_w ) { senjyo_state *state = space->machine().driver_data(); state->m_bg3videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg3_tilemap, offset); + state->m_bg3_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( senjyo_bgstripes_w ) @@ -175,14 +175,14 @@ ***************************************************************************/ -static void draw_bgbitmap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_bgbitmap(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { senjyo_state *state = machine.driver_data(); int x,y,pen,strwid,count; if (state->m_bgstripes == 0xff) /* off */ - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); else { int flip = flip_screen_get(machine); @@ -197,10 +197,10 @@ { if (flip) for (y = 0;y < 256;y++) - *BITMAP_ADDR16(bitmap, y, 255 - x) = 384 + pen; + bitmap.pix16(y, 255 - x) = 384 + pen; else for (y = 0;y < 256;y++) - *BITMAP_ADDR16(bitmap, y, x) = 384 + pen; + bitmap.pix16(y, x) = 384 + pen; count += 0x10; if (count >= strwid) @@ -212,7 +212,7 @@ } } -static void draw_radar(running_machine &machine,bitmap_t *bitmap,const rectangle *cliprect) +static void draw_radar(running_machine &machine,bitmap_ind16 &bitmap,const rectangle &cliprect) { senjyo_state *state = machine.driver_data(); int offs,x; @@ -232,13 +232,12 @@ sy = 255 - sy; } - if (sy >= cliprect->min_y && sy <= cliprect->max_y && - sx >= cliprect->min_x && sx <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, sy, sx) = offs < 0x200 ? 512 : 513; + if (cliprect.contains(sx, sy)) + bitmap.pix16(sy, sx) = offs < 0x200 ? 512 : 513; } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int priority) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int priority) { senjyo_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -289,29 +288,29 @@ } } -SCREEN_UPDATE( senjyo ) +SCREEN_UPDATE_IND16( senjyo ) { - senjyo_state *state = screen->machine().driver_data(); + senjyo_state *state = screen.machine().driver_data(); int i; /* two colors for the radar dots (verified on the real board) */ - palette_set_color(screen->machine(),512,MAKE_RGB(0xff,0x00,0x00)); /* red for enemies */ - palette_set_color(screen->machine(),513,MAKE_RGB(0xff,0xff,0x00)); /* yellow for player */ + palette_set_color(screen.machine(),512,MAKE_RGB(0xff,0x00,0x00)); /* red for enemies */ + palette_set_color(screen.machine(),513,MAKE_RGB(0xff,0xff,0x00)); /* yellow for player */ { - int flip = flip_screen_get(screen->machine()); + int flip = flip_screen_get(screen.machine()); int scrollx,scrolly; for (i = 0;i < 32;i++) - tilemap_set_scrolly(state->m_fg_tilemap, i, state->m_fgscroll[i]); + state->m_fg_tilemap->set_scrolly(i, state->m_fgscroll[i]); scrollx = state->m_scrollx1[0]; scrolly = state->m_scrolly1[0] + 256 * state->m_scrolly1[1]; if (flip) scrollx = -scrollx; - tilemap_set_scrollx(state->m_bg1_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, scrolly); + state->m_bg1_tilemap->set_scrollx(0, scrollx); + state->m_bg1_tilemap->set_scrolly(0, scrolly); scrollx = state->m_scrollx2[0]; scrolly = state->m_scrolly2[0] + 256 * state->m_scrolly2[1]; @@ -322,27 +321,27 @@ } if (flip) scrollx = -scrollx; - tilemap_set_scrollx(state->m_bg2_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, scrolly); + state->m_bg2_tilemap->set_scrollx(0, scrollx); + state->m_bg2_tilemap->set_scrolly(0, scrolly); scrollx = state->m_scrollx3[0]; scrolly = state->m_scrolly3[0] + 256 * state->m_scrolly3[1]; if (flip) scrollx = -scrollx; - tilemap_set_scrollx(state->m_bg3_tilemap, 0, scrollx); - tilemap_set_scrolly(state->m_bg3_tilemap, 0, scrolly); + state->m_bg3_tilemap->set_scrollx(0, scrollx); + state->m_bg3_tilemap->set_scrolly(0, scrolly); } - draw_bgbitmap(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg3_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_bg2_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 2); - tilemap_draw(bitmap, cliprect, state->m_bg1_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_radar(screen->machine(), bitmap, cliprect); + draw_bgbitmap(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg3_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 1); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_radar(screen.machine(), bitmap, cliprect); #if 0 { diff -Nru mame-0.144/src/mame/video/seta001.c mame-0.145/src/mame/video/seta001.c --- mame-0.144/src/mame/video/seta001.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/seta001.c 2012-02-06 21:30:31.000000000 +0000 @@ -36,6 +36,15 @@ void seta001_device::device_start() { + // chukatai draws a column on the left from uninitialized RAM which causes garbage in a debug build + // if we initialize ram this is a single line in the top left instead. + // maybe there is less RAM actually present and it should mirror, or there is another flaw? + memset(m_spritectrl,0xff,4); + memset(m_spriteylow,0xff,0x300); + memset(m_spritecodelow,0xff,0x2000); + memset(m_spritecodehigh,0xff,0x2000); + + m_fg_flipxoffs = 0; m_fg_noflipxoffs = 0; @@ -198,7 +207,7 @@ -void seta001_device::seta001_draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size, int setac_type) +void seta001_device::seta001_draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac_type) { int transpen; @@ -319,7 +328,7 @@ } -void seta001_device::seta001_draw_foreground( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size) +void seta001_device::seta001_draw_foreground( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size) { int screenflip = (m_spritectrl[0] & 0x40) >> 6; int i; @@ -457,7 +466,7 @@ } -void seta001_device::seta001_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size, int setac) +void seta001_device::seta001_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac) { seta001_draw_background(machine, bitmap, cliprect, bank_size, setac); seta001_draw_foreground(machine, bitmap, cliprect, bank_size); diff -Nru mame-0.144/src/mame/video/seta001.h mame-0.145/src/mame/video/seta001.h --- mame-0.144/src/mame/video/seta001.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/seta001.h 2012-02-06 21:30:31.000000000 +0000 @@ -7,7 +7,7 @@ seta001_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void seta001_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size, int setac); + void seta001_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac); void setac_eof( void ); void tnzs_eof( void ); @@ -52,8 +52,8 @@ private: - void seta001_draw_background( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size, int setac_type); - void seta001_draw_foreground( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_size); + void seta001_draw_background( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac_type); + void seta001_draw_foreground( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size); }; diff -Nru mame-0.144/src/mame/video/seta2.c mame-0.145/src/mame/video/seta2.c --- mame-0.144/src/mame/video/seta2.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/seta2.c 2012-02-06 21:30:31.000000000 +0000 @@ -161,7 +161,7 @@ ***************************************************************************/ -static void seta_drawgfx( bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, +static void seta_drawgfx( bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int x0,int y0, int shadow_depth ) { @@ -183,16 +183,16 @@ #define SETA_DRAWGFX(SETPIXELCOLOR) \ for ( sy = y0; sy != y1; sy += dy ) \ { \ - if ( sy >= cliprect->min_y && sy <= cliprect->max_y ) \ + if ( sy >= cliprect.min_y && sy <= cliprect.max_y ) \ { \ source = addr; \ - dest = BITMAP_ADDR16(bitmap, sy, 0); \ + dest = &bitmap.pix16(sy); \ \ for ( sx = x0; sx != x1; sx += dx ) \ { \ pen = *source++; \ \ - if ( pen && sx >= cliprect->min_x && sx <= cliprect->max_x ) \ + if ( pen && sx >= cliprect.min_x && sx <= cliprect.max_x ) \ SETPIXELCOLOR \ } \ } \ @@ -212,7 +212,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { // Sprites list @@ -328,19 +328,19 @@ clip.min_x = (clip.min_x & 0x1ff) - (clip.min_x & 0x200); clip.max_x = clip.min_x + width * 0x10 - 1; - if (clip.min_x > cliprect->max_x) continue; - if (clip.max_x < cliprect->min_x) continue; - if (clip.min_x < cliprect->min_x) clip.min_x = cliprect->min_x; - if (clip.max_x > cliprect->max_x) clip.max_x = cliprect->max_x; + if (clip.min_x > cliprect.max_x) continue; + if (clip.max_x < cliprect.min_x) continue; + if (clip.min_x < cliprect.min_x) clip.min_x = cliprect.min_x; + if (clip.max_x > cliprect.max_x) clip.max_x = cliprect.max_x; // sprite clipping region (y) clip.min_y = ((sy + yoffs) & 0x1ff) - state->m_yoffset; clip.max_y = clip.min_y + height * 0x10 - 1; - if (clip.min_y > cliprect->max_y) continue; - if (clip.max_y < cliprect->min_y) continue; - if (clip.min_y < cliprect->min_y) clip.min_y = cliprect->min_y; - if (clip.max_y > cliprect->max_y) clip.max_y = cliprect->max_y; + if (clip.min_y > cliprect.max_y) continue; + if (clip.max_y < cliprect.min_y) continue; + if (clip.min_y < cliprect.min_y) clip.min_y = cliprect.min_y; + if (clip.max_y > cliprect.max_y) clip.max_y = cliprect.max_y; dx = sx + (scrollx & 0x3ff) + xoffs + 0x10; @@ -375,7 +375,7 @@ dst_x = (dst_x & 0x1ff) - (dst_x & 0x200); - seta_drawgfx(bitmap, &clip, gfx, + seta_drawgfx(bitmap, clip, gfx, code ^ tx ^ (ty<<1), color, flipx, flipy, @@ -478,23 +478,27 @@ state->m_yoffset = 0x10; } -SCREEN_UPDATE( seta2 ) +SCREEN_UPDATE_IND16( seta2 ) { - seta2_state *state = screen->machine().driver_data(); + seta2_state *state = screen.machine().driver_data(); // Black or pen 0? - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); if ( (state->m_vregs[0x30/2] & 1) == 0 ) // 1 = BLANK SCREEN - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( seta2 ) +SCREEN_VBLANK( seta2 ) { - seta2_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + seta2_state *state = screen.machine().driver_data(); - // Buffer sprites by 1 frame - memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + // Buffer sprites by 1 frame + memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + } } diff -Nru mame-0.144/src/mame/video/seta.c mame-0.145/src/mame/video/seta.c --- mame-0.144/src/mame/video/seta.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/seta.c 2012-02-06 21:30:32.000000000 +0000 @@ -69,7 +69,7 @@ [ Floating Tilemap ] - There's a floating tilemap made of vertical colums composed of 2x16 + There's a floating tilemap made of vertical columns composed of 2x16 "sprites". Each 32 consecutive "sprites" define a column. For column I: @@ -360,7 +360,7 @@ ***************************************************************************/ -INLINE void twineagl_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int offset ) +INLINE void twineagl_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int offset ) { seta_state *state = machine.driver_data(); UINT16 *vram = state->m_vram_0 + offset; @@ -375,7 +375,7 @@ static TILE_GET_INFO( twineagl_get_tile_info_1 ) { twineagl_tile_info( machine, tileinfo, tile_index, 0x1000 ); } -INLINE void get_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int layer, int offset ) +INLINE void get_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int layer, int offset ) { seta_state *state = machine.driver_data(); int gfx = 1 + layer; @@ -408,9 +408,9 @@ COMBINE_DATA(&state->m_vram_0[offset]); if (offset & 0x1000) - tilemap_mark_tile_dirty(state->m_tilemap_1, offset & 0x7ff); + state->m_tilemap_1->mark_tile_dirty(offset & 0x7ff); else - tilemap_mark_tile_dirty(state->m_tilemap_0, offset & 0x7ff); + state->m_tilemap_0->mark_tile_dirty(offset & 0x7ff); } WRITE16_HANDLER( seta_vram_2_w ) @@ -419,9 +419,9 @@ COMBINE_DATA(&state->m_vram_2[offset]); if (offset & 0x1000) - tilemap_mark_tile_dirty(state->m_tilemap_3, offset & 0x7ff); + state->m_tilemap_3->mark_tile_dirty(offset & 0x7ff); else - tilemap_mark_tile_dirty(state->m_tilemap_2, offset & 0x7ff); + state->m_tilemap_2->mark_tile_dirty(offset & 0x7ff); } WRITE16_HANDLER( twineagl_tilebank_w ) @@ -433,7 +433,7 @@ if (state->m_twineagl_tilebank[offset] != data) { state->m_twineagl_tilebank[offset] = data; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } } @@ -468,10 +468,10 @@ state->m_tilemaps_flip = 0; state->m_color_mode_shift = 3; - tilemap_set_transparent_pen(state->m_tilemap_0, 0); - tilemap_set_transparent_pen(state->m_tilemap_1, 0); - tilemap_set_transparent_pen(state->m_tilemap_2, 0); - tilemap_set_transparent_pen(state->m_tilemap_3, 0); + state->m_tilemap_0->set_transparent_pen(0); + state->m_tilemap_1->set_transparent_pen(0); + state->m_tilemap_2->set_transparent_pen(0); + state->m_tilemap_3->set_transparent_pen(0); } @@ -494,8 +494,8 @@ state->m_color_mode_shift = 4; - tilemap_set_transparent_pen(state->m_tilemap_0, 0); - tilemap_set_transparent_pen(state->m_tilemap_1, 0); + state->m_tilemap_0->set_transparent_pen(0); + state->m_tilemap_1->set_transparent_pen(0); } VIDEO_START( twineagl_1_layer ) @@ -514,8 +514,8 @@ state->m_tilemap_1 = tilemap_create( machine, twineagl_get_tile_info_1, tilemap_scan_rows, 16,16, 64,32 ); - tilemap_set_transparent_pen(state->m_tilemap_0, 0); - tilemap_set_transparent_pen(state->m_tilemap_1, 0); + state->m_tilemap_0->set_transparent_pen(0); + state->m_tilemap_1->set_transparent_pen(0); } int setac_gfxbank_callback( running_machine &machine, UINT16 code, UINT8 color ) @@ -770,33 +770,33 @@ -static void draw_tilemap_palette_effect(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tilemap, int scrollx, int scrolly, int gfxnum, int flipscreen) +static void draw_tilemap_palette_effect(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tilemap, int scrollx, int scrolly, int gfxnum, int flipscreen) { int y; const gfx_element *gfx_tilemap = machine.gfx[gfxnum]; - const bitmap_t *src_bitmap = tilemap_get_pixmap(tilemap); + const bitmap_ind16 &src_bitmap = tilemap->pixmap(); int width_mask, height_mask; int opaque_mask = gfx_tilemap->color_granularity - 1; int pixel_effect_mask = gfx_tilemap->color_base + (gfx_tilemap->total_colors - 1) * gfx_tilemap->color_granularity; int p; - width_mask = src_bitmap->width - 1; - height_mask = src_bitmap->height - 1; + width_mask = src_bitmap.width() - 1; + height_mask = src_bitmap.height() - 1; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); int x; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { if(!flipscreen) { - p = *BITMAP_ADDR16(src_bitmap, (y + scrolly) & height_mask, (x + scrollx) & width_mask); + p = src_bitmap.pix16((y + scrolly) & height_mask, (x + scrollx) & width_mask); } else { - p = *BITMAP_ADDR16(src_bitmap, (y - scrolly - 256) & height_mask, (x - scrollx - 512) & width_mask); + p = src_bitmap.pix16((y - scrolly - 256) & height_mask, (x - scrollx - 512) & width_mask); } // draw not transparent pixels @@ -828,27 +828,27 @@ /* For games without tilemaps */ -SCREEN_UPDATE( seta_no_layers ) +SCREEN_UPDATE_IND16( seta_no_layers ) { - set_pens(screen->machine()); - bitmap_fill(bitmap,cliprect,0x1f0); + set_pens(screen.machine()); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,0x1000, 1); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,0x1000, 1); return 0; } /* For games with 1 or 2 tilemaps */ -void seta_layers_update(screen_device* screen, bitmap_t *bitmap, const rectangle *cliprect, int sprite_bank_size, int sprite_setac ) +void seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size, int sprite_setac ) { - seta_state *state = screen->machine().driver_data(); + seta_state *state = screen.machine().driver_data(); int layers_ctrl = -1; int enab_0, enab_1, x_0, x_1=0, y_0, y_1=0; int order = 0; - int flip = screen->machine().device("spritegen")->is_flipped(); + int flip = screen.machine().device("spritegen")->is_flipped(); - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); int vis_dimy = visarea.max_y - visarea.min_y + 1; // check tilemaps color modes @@ -856,8 +856,8 @@ if(state->m_current_tilemap_mode[0] != (state->m_vctrl_0[ 4/2 ] & 0x10)) { state->m_current_tilemap_mode[0] = state->m_vctrl_0[ 4/2 ] & 0x10; - tilemap_mark_all_tiles_dirty(state->m_tilemap_0); - tilemap_mark_all_tiles_dirty(state->m_tilemap_1); + state->m_tilemap_0->mark_all_dirty(); + state->m_tilemap_1->mark_all_dirty(); } if(state->m_tilemap_2 != NULL && state->m_tilemap_3 != NULL) @@ -865,22 +865,22 @@ if(state->m_current_tilemap_mode[1] != (state->m_vctrl_2[ 4/2 ] & 0x10)) { state->m_current_tilemap_mode[1] = state->m_vctrl_2[ 4/2 ] & 0x10; - tilemap_mark_all_tiles_dirty(state->m_tilemap_2); - tilemap_mark_all_tiles_dirty(state->m_tilemap_3); + state->m_tilemap_2->mark_all_dirty(); + state->m_tilemap_3->mark_all_dirty(); } } flip ^= state->m_tilemaps_flip; - tilemap_set_flip_all(screen->machine(), flip ? (TILEMAP_FLIPX|TILEMAP_FLIPY) : 0 ); + screen.machine().tilemap().set_flip_all(flip ? (TILEMAP_FLIPX|TILEMAP_FLIPY) : 0 ); x_0 = state->m_vctrl_0[ 0/2 ]; y_0 = state->m_vctrl_0[ 2/2 ]; enab_0 = state->m_vctrl_0[ 4/2 ]; /* Only one tilemap per layer is enabled! */ - tilemap_set_enable(state->m_tilemap_0, (!(enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); - tilemap_set_enable(state->m_tilemap_1, ( (enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); + state->m_tilemap_0->enable((!(enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); + state->m_tilemap_1->enable(( (enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); /* the hardware wants different scroll values when flipped */ @@ -898,10 +898,10 @@ y_0 = y_0 - vis_dimy; } - tilemap_set_scrollx(state->m_tilemap_0, 0, x_0); - tilemap_set_scrollx(state->m_tilemap_1, 0, x_0); - tilemap_set_scrolly(state->m_tilemap_0, 0, y_0); - tilemap_set_scrolly(state->m_tilemap_1, 0, y_0); + state->m_tilemap_0->set_scrollx(0, x_0); + state->m_tilemap_1->set_scrollx(0, x_0); + state->m_tilemap_0->set_scrolly(0, y_0); + state->m_tilemap_1->set_scrolly(0, y_0); if (state->m_tilemap_2) { @@ -909,8 +909,8 @@ y_1 = state->m_vctrl_2[ 2/2 ]; enab_1 = state->m_vctrl_2[ 4/2 ]; - tilemap_set_enable(state->m_tilemap_2, (!(enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); - tilemap_set_enable(state->m_tilemap_3, ( (enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); + state->m_tilemap_2->enable((!(enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); + state->m_tilemap_3->enable(( (enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); x_1 += 0x10 - state->m_global_offsets->tilemap_offs[flip ? 1 : 0]; y_1 -= (256 - vis_dimy)/2; @@ -920,21 +920,21 @@ y_1 = y_1 - vis_dimy; } - tilemap_set_scrollx(state->m_tilemap_2, 0, x_1); - tilemap_set_scrollx(state->m_tilemap_3, 0, x_1); - tilemap_set_scrolly(state->m_tilemap_2, 0, y_1); - tilemap_set_scrolly(state->m_tilemap_3, 0, y_1); + state->m_tilemap_2->set_scrollx(0, x_1); + state->m_tilemap_3->set_scrollx(0, x_1); + state->m_tilemap_2->set_scrolly(0, y_1); + state->m_tilemap_3->set_scrolly(0, y_1); order = state->m_vregs[ 2/2 ]; } #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; if (state->m_tilemap_2) @@ -944,27 +944,27 @@ } #endif - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); if (order & 1) // swap the layers? { if (state->m_tilemap_2) { - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_2, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_3, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 2) state->m_tilemap_2->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 2) state->m_tilemap_3->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); } if (order & 2) // layer-sprite priority? { - if (layers_ctrl & 8) screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); + if (layers_ctrl & 8) screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); if(order & 4) { popmessage("Missing palette effect. Contact MAMETesters."); } - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 1) state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); } else { @@ -973,30 +973,30 @@ popmessage("Missing palette effect. Contact MAMETesters."); } - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 1) state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); - if (layers_ctrl & 8) screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); + if (layers_ctrl & 8) screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); } } else { - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_0, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->m_tilemap_1, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) state->m_tilemap_0->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) state->m_tilemap_1->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); if (order & 2) // layer-sprite priority? { - if (layers_ctrl & 8) screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); + if (layers_ctrl & 8) screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); if((order & 4) && state->m_paletteram2 != NULL) { - if(tilemap_get_enable(state->m_tilemap_2)) + if(state->m_tilemap_2->enabled()) { - draw_tilemap_palette_effect(screen->machine(), bitmap, cliprect, state->m_tilemap_2, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); + draw_tilemap_palette_effect(screen.machine(), bitmap, cliprect, state->m_tilemap_2, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); } else { - draw_tilemap_palette_effect(screen->machine(), bitmap, cliprect, state->m_tilemap_3, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); + draw_tilemap_palette_effect(screen.machine(), bitmap, cliprect, state->m_tilemap_3, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); } } else @@ -1008,8 +1008,8 @@ if (state->m_tilemap_2) { - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_3, 0, 0); + if (layers_ctrl & 2) state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 2) state->m_tilemap_3->draw(bitmap, cliprect, 0, 0); } } } @@ -1017,13 +1017,13 @@ { if((order & 4) && state->m_paletteram2 != NULL) { - if(tilemap_get_enable(state->m_tilemap_2)) + if(state->m_tilemap_2->enabled()) { - draw_tilemap_palette_effect(screen->machine(), bitmap, cliprect, state->m_tilemap_2, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); + draw_tilemap_palette_effect(screen.machine(), bitmap, cliprect, state->m_tilemap_2, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); } else { - draw_tilemap_palette_effect(screen->machine(), bitmap, cliprect, state->m_tilemap_3, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); + draw_tilemap_palette_effect(screen.machine(), bitmap, cliprect, state->m_tilemap_3, x_1, y_1, 2 + ((state->m_vctrl_2[ 4/2 ] & 0x10) >> state->m_color_mode_shift), flip); } } else @@ -1035,59 +1035,61 @@ if (state->m_tilemap_2) { - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_2, 0, 0); - if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->m_tilemap_3, 0, 0); + if (layers_ctrl & 2) state->m_tilemap_2->draw(bitmap, cliprect, 0, 0); + if (layers_ctrl & 2) state->m_tilemap_3->draw(bitmap, cliprect, 0, 0); } } - if (layers_ctrl & 8) screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); + if (layers_ctrl & 8) screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,sprite_bank_size, sprite_setac); } } } -static SCREEN_UPDATE( seta_layers ) +static SCREEN_UPDATE_IND16( seta_layers ) { seta_layers_update(screen, bitmap, cliprect, 0x1000, 1 ); return 0; } -SCREEN_UPDATE( setaroul ) +SCREEN_UPDATE_IND16( setaroul ) { - bitmap_fill(bitmap, cliprect, 0x0); + bitmap.fill(0x0, cliprect); - screen->machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); - screen->machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); + screen.machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); + screen.machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); seta_layers_update(screen, bitmap, cliprect, 0x800, 1 ); return 0; } -SCREEN_EOF( setaroul ) +SCREEN_VBLANK( setaroul ) { - machine.device("spritegen")->tnzs_eof(); + // rising edge + if (vblank_on) + screen.machine().device("spritegen")->tnzs_eof(); } -SCREEN_UPDATE( seta ) +SCREEN_UPDATE_IND16( seta ) { - set_pens(screen->machine()); - return SCREEN_UPDATE_CALL(seta_layers); + set_pens(screen.machine()); + return SCREEN_UPDATE16_CALL(seta_layers); } -SCREEN_UPDATE( usclssic ) +SCREEN_UPDATE_IND16( usclssic ) { - usclssic_set_pens(screen->machine()); - return SCREEN_UPDATE_CALL(seta_layers); + usclssic_set_pens(screen.machine()); + return SCREEN_UPDATE16_CALL(seta_layers); } -SCREEN_UPDATE( inttoote ) +SCREEN_UPDATE_IND16( inttoote ) { /* no palette to set */ - return SCREEN_UPDATE_CALL(seta_layers); + return SCREEN_UPDATE16_CALL(seta_layers); } diff -Nru mame-0.144/src/mame/video/sf.c mame-0.145/src/mame/video/sf.c --- mame-0.144/src/mame/video/sf.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sf.c 2012-02-06 21:30:31.000000000 +0000 @@ -60,8 +60,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 16, 16, 2048, 16); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_transparent_pen(state->m_tx_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(3); } @@ -76,21 +76,21 @@ { sf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( sf_bg_scroll_w ) { sf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgscroll); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bgscroll); + state->m_bg_tilemap->set_scrollx(0, state->m_bgscroll); } WRITE16_HANDLER( sf_fg_scroll_w ) { sf_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgscroll); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fgscroll); + state->m_fg_tilemap->set_scrollx(0, state->m_fgscroll); } WRITE16_HANDLER( sf_gfxctrl_w ) @@ -109,9 +109,9 @@ { state->m_sf_active = data & 0xff; flip_screen_set(space->machine(), data & 0x04); - tilemap_set_enable(state->m_tx_tilemap, data & 0x08); - tilemap_set_enable(state->m_bg_tilemap, data & 0x20); - tilemap_set_enable(state->m_fg_tilemap, data & 0x40); + state->m_tx_tilemap->enable(data & 0x08); + state->m_bg_tilemap->enable(data & 0x20); + state->m_fg_tilemap->enable(data & 0x40); } } @@ -129,7 +129,7 @@ return nb ^ delta[(nb >> 3) & 3]; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect ) { sf_state *state = machine.driver_data(); int offs; @@ -218,20 +218,20 @@ } -SCREEN_UPDATE( sf ) +SCREEN_UPDATE_IND16( sf ) { - sf_state *state = screen->machine().driver_data(); + sf_state *state = screen.machine().driver_data(); if (state->m_sf_active & 0x20) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_sf_active & 0x80) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/shadfrce.c mame-0.145/src/mame/video/shadfrce.c --- mame-0.144/src/mame/video/shadfrce.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shadfrce.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,7 +19,7 @@ shadfrce_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fgtilemap,offset/2); + state->m_fgtilemap->mark_tile_dirty(offset/2); } static TILE_GET_INFO( get_shadfrce_bg0tile_info ) @@ -42,7 +42,7 @@ shadfrce_state *state = space->machine().driver_data(); state->m_bg0videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg0tilemap,offset/2); + state->m_bg0tilemap->mark_tile_dirty(offset/2); } static TILE_GET_INFO( get_shadfrce_bg1tile_info ) @@ -61,7 +61,7 @@ shadfrce_state *state = space->machine().driver_data(); state->m_bg1videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1tilemap,offset); + state->m_bg1tilemap->mark_tile_dirty(offset); } @@ -72,10 +72,10 @@ shadfrce_state *state = machine.driver_data(); state->m_fgtilemap = tilemap_create(machine, get_shadfrce_fgtile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fgtilemap,0); + state->m_fgtilemap->set_transparent_pen(0); state->m_bg0tilemap = tilemap_create(machine, get_shadfrce_bg0tile_info,tilemap_scan_rows, 16, 16,32,32); - tilemap_set_transparent_pen(state->m_bg0tilemap,0); + state->m_bg0tilemap->set_transparent_pen(0); state->m_bg1tilemap = tilemap_create(machine, get_shadfrce_bg1tile_info,tilemap_scan_rows, 16, 16,32,32); @@ -86,34 +86,34 @@ { shadfrce_state *state = space->machine().driver_data(); - tilemap_set_scrollx( state->m_bg0tilemap, 0, data & 0x1ff ); + state->m_bg0tilemap->set_scrollx(0, data & 0x1ff ); } WRITE16_HANDLER ( shadfrce_bg0scrolly_w ) { shadfrce_state *state = space->machine().driver_data(); - tilemap_set_scrolly( state->m_bg0tilemap, 0, data & 0x1ff ); + state->m_bg0tilemap->set_scrolly(0, data & 0x1ff ); } WRITE16_HANDLER ( shadfrce_bg1scrollx_w ) { shadfrce_state *state = space->machine().driver_data(); - tilemap_set_scrollx( state->m_bg1tilemap, 0, data & 0x1ff ); + state->m_bg1tilemap->set_scrollx(0, data & 0x1ff ); } WRITE16_HANDLER ( shadfrce_bg1scrolly_w ) { shadfrce_state *state = space->machine().driver_data(); - tilemap_set_scrolly( state->m_bg1tilemap, 0, data & 0x1ff ); + state->m_bg1tilemap->set_scrolly(0, data & 0x1ff ); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* | ---- ---- hhhf Fe-Y | ---- ---- yyyy yyyy | ---- ---- TTTT TTTT | ---- ---- tttt tttt | @@ -162,30 +162,34 @@ } } -SCREEN_UPDATE( shadfrce ) +SCREEN_UPDATE_IND16( shadfrce ) { - shadfrce_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + shadfrce_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); if (state->m_video_enable) { - tilemap_draw(bitmap,cliprect,state->m_bg1tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_bg0tilemap,0,1); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fgtilemap, 0,0); + state->m_bg1tilemap->draw(bitmap, cliprect, 0,0); + state->m_bg0tilemap->draw(bitmap, cliprect, 0,1); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fgtilemap->draw(bitmap, cliprect, 0,0); } else { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); } return 0; } -SCREEN_EOF( shadfrce ) +SCREEN_VBLANK( shadfrce ) { - shadfrce_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + shadfrce_state *state = screen.machine().driver_data(); - /* looks like sprites are *two* frames ahead */ - memcpy(state->m_spvideoram_old, state->m_spvideoram, state->m_spvideoram_size); + /* looks like sprites are *two* frames ahead */ + memcpy(state->m_spvideoram_old, state->m_spvideoram, state->m_spvideoram_size); + } } diff -Nru mame-0.144/src/mame/video/shangha3.c mame-0.145/src/mame/video/shangha3.c --- mame-0.144/src/mame/video/shangha3.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shangha3.c 2012-02-06 21:30:33.000000000 +0000 @@ -69,7 +69,7 @@ shangha3_state *state = machine.driver_data(); int i; - state->m_rawbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_rawbitmap); for (i = 0;i < 14;i++) state->m_drawmode_table[i] = DRAWMODE_SOURCE; @@ -109,7 +109,7 @@ { shangha3_state *state = space->machine().driver_data(); UINT16 *shangha3_ram = state->m_ram; - bitmap_t *rawbitmap = state->m_rawbitmap; + bitmap_ind16 &rawbitmap = state->m_rawbitmap; UINT8 *drawmode_table = state->m_drawmode_table; int offs; @@ -151,11 +151,8 @@ //if (shangha3_ram[offs+11] || shangha3_ram[offs+12]) //logerror("offs %04x: sx %04x sy %04x zoom %04x %04x %04x %04x fx %d fy %d\n",offs,sx,sy,zoomx,shangha3_ram[offs+11]),shangha3_ram[offs+12],zoomy,flipx,flipy); - myclip.min_x = sx; - myclip.max_x = sx + sizex; - myclip.min_y = sy; - myclip.max_y = sy + sizey; - sect_rect(&myclip, &rawbitmap->cliprect); + myclip.set(sx, sx + sizex, sy, sy + sizey); + myclip &= rawbitmap.cliprect(); if (shangha3_ram[offs+4] & 0x08) /* tilemap */ { @@ -213,7 +210,7 @@ if (flipy) dy = sy + sizey-15 - dy; else dy = sy + dy; - drawgfx_transpen(rawbitmap,&myclip,space->machine().gfx[0], + drawgfx_transpen(rawbitmap,myclip,space->machine().gfx[0], (tile & 0x0fff) | (code & 0xf000), (tile >> 12) | (color & 0x70), flipx,flipy, @@ -226,7 +223,7 @@ int w; if (zoomx <= 1 && zoomy <= 1) - drawgfxzoom_transtable(rawbitmap,&myclip,space->machine().gfx[0], + drawgfxzoom_transtable(rawbitmap,myclip,space->machine().gfx[0], code, color, flipx,flipy, @@ -239,7 +236,7 @@ for (x = 0;x < w;x++) { - drawgfxzoom_transtable(rawbitmap,&myclip,space->machine().gfx[0], + drawgfxzoom_transtable(rawbitmap,myclip,space->machine().gfx[0], code, color, flipx,flipy, @@ -261,9 +258,9 @@ } -SCREEN_UPDATE( shangha3 ) +SCREEN_UPDATE_IND16( shangha3 ) { - shangha3_state *state = screen->machine().driver_data(); + shangha3_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_rawbitmap, 0, 0, 0, 0, cliprect); return 0; diff -Nru mame-0.144/src/mame/video/shangkid.c mame-0.145/src/mame/video/shangkid.c --- mame-0.144/src/mame/video/shangkid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shangkid.c 2012-02-06 21:30:33.000000000 +0000 @@ -42,7 +42,7 @@ (attributes&0x80)?TILE_FLIPX:0); } - tileinfo->category = + tileinfo.category = (machine.region( "proms" )->base()[0x800+color*4]==2)?1:0; } @@ -57,10 +57,10 @@ shangkid_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty( state->m_background, offset&0x7ff ); + state->m_background->mark_tile_dirty(offset&0x7ff ); } -static void draw_sprite(running_machine &machine, const UINT8 *source, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprite(running_machine &machine, const UINT8 *source, bitmap_ind16 &bitmap, const rectangle &cliprect) { shangkid_state *state = machine.driver_data(); const gfx_element *gfx; @@ -172,7 +172,7 @@ } } -static void shangkid_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void shangkid_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { shangkid_state *state = machine.driver_data(); const UINT8 *source, *finish; @@ -185,17 +185,17 @@ } } -SCREEN_UPDATE( shangkid ) +SCREEN_UPDATE_IND16( shangkid ) { - shangkid_state *state = screen->machine().driver_data(); + shangkid_state *state = screen.machine().driver_data(); int flipscreen = state->m_videoreg[1]&0x80; - tilemap_set_flip( state->m_background, flipscreen?(TILEMAP_FLIPX|TILEMAP_FLIPY):0 ); - tilemap_set_scrollx( state->m_background,0,state->m_videoreg[0]-40 ); - tilemap_set_scrolly( state->m_background,0,state->m_videoreg[2]+0x10 ); - - tilemap_draw( bitmap,cliprect,state->m_background,0,0 ); - shangkid_draw_sprites(screen->machine(), bitmap,cliprect ); - tilemap_draw( bitmap,cliprect,state->m_background,1,0 ); /* high priority tiles */ + state->m_background->set_flip(flipscreen?(TILEMAP_FLIPX|TILEMAP_FLIPY):0 ); + state->m_background->set_scrollx(0,state->m_videoreg[0]-40 ); + state->m_background->set_scrolly(0,state->m_videoreg[2]+0x10 ); + + state->m_background->draw(bitmap, cliprect, 0,0 ); + shangkid_draw_sprites(screen.machine(), bitmap,cliprect ); + state->m_background->draw(bitmap, cliprect, 1,0 ); /* high priority tiles */ return 0; } @@ -235,7 +235,7 @@ } -static void dynamski_draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ) +static void dynamski_draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri ) { shangkid_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; @@ -289,7 +289,7 @@ } } -static void dynamski_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void dynamski_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { shangkid_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; @@ -321,10 +321,10 @@ } } -SCREEN_UPDATE( dynamski ) +SCREEN_UPDATE_IND16( dynamski ) { - dynamski_draw_background(screen->machine(), bitmap,cliprect, 0 ); - dynamski_draw_sprites(screen->machine(), bitmap,cliprect ); - dynamski_draw_background(screen->machine(), bitmap,cliprect, 1 ); + dynamski_draw_background(screen.machine(), bitmap,cliprect, 0 ); + dynamski_draw_sprites(screen.machine(), bitmap,cliprect ); + dynamski_draw_background(screen.machine(), bitmap,cliprect, 1 ); return 0; } diff -Nru mame-0.144/src/mame/video/shaolins.c mame-0.145/src/mame/video/shaolins.c --- mame-0.144/src/mame/video/shaolins.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shaolins.c 2012-02-06 21:30:31.000000000 +0000 @@ -93,7 +93,7 @@ shaolins_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( shaolins_colorram_w ) @@ -101,7 +101,7 @@ shaolins_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( shaolins_palettebank_w ) @@ -111,7 +111,7 @@ if (state->m_palettebank != (data & 0x07)) { state->m_palettebank = data & 0x07; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -121,7 +121,7 @@ int col; for (col = 4; col < 32; col++) - tilemap_set_scrolly(state->m_bg_tilemap, col, data + 1); + state->m_bg_tilemap->set_scrolly(col, data + 1); } WRITE8_HANDLER( shaolins_nmi_w ) @@ -133,7 +133,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -155,10 +155,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_cols(32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { shaolins_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -192,11 +192,11 @@ } } -SCREEN_UPDATE( shaolins ) +SCREEN_UPDATE_IND16( shaolins ) { - shaolins_state *state = screen->machine().driver_data(); + shaolins_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/shisen.c mame-0.145/src/mame/video/shisen.c --- mame-0.144/src/mame/video/shisen.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shisen.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,7 +6,7 @@ shisen_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( sichuan2_bankswitch_w ) @@ -28,7 +28,7 @@ if (state->m_gfxbank != bank) { state->m_gfxbank = bank; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bits 6-7 unknown */ @@ -62,16 +62,16 @@ 8, 8, 64, 32); } -SCREEN_UPDATE( sichuan2 ) +SCREEN_UPDATE_IND16( sichuan2 ) { - shisen_state *state = screen->machine().driver_data(); + shisen_state *state = screen.machine().driver_data(); // on Irem boards, screen flip is handled in both hardware and software. // this game doesn't have cocktail mode so if there's software control we don't // know where it is mapped. - flip_screen_set(screen->machine(), ~input_port_read(screen->machine(), "DSW2") & 1); + flip_screen_set(screen.machine(), ~input_port_read(screen.machine(), "DSW2") & 1); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/shootout.c mame-0.145/src/mame/video/shootout.c --- mame-0.144/src/mame/video/shootout.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/shootout.c 2012-02-06 21:30:32.000000000 +0000 @@ -71,7 +71,7 @@ shootout_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty( state->m_background, offset&0x3ff ); + state->m_background->mark_tile_dirty(offset&0x3ff ); } WRITE8_HANDLER( shootout_textram_w ) @@ -79,7 +79,7 @@ shootout_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty( state->m_foreground, offset&0x3ff ); + state->m_foreground->mark_tile_dirty(offset&0x3ff ); } VIDEO_START( shootout ) @@ -88,10 +88,10 @@ state->m_background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen( state->m_foreground, 0 ); + state->m_foreground->set_transparent_pen(0 ); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank_bits ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_bits ) { shootout_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -171,26 +171,26 @@ } } -SCREEN_UPDATE( shootout ) +SCREEN_UPDATE_IND16( shootout ) { - shootout_state *state = screen->machine().driver_data(); + shootout_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap,cliprect,state->m_background,0,0); - tilemap_draw(bitmap,cliprect,state->m_foreground,0,1); - draw_sprites(screen->machine(), bitmap,cliprect,3/*bank bits */); + state->m_background->draw(bitmap, cliprect, 0,0); + state->m_foreground->draw(bitmap, cliprect, 0,1); + draw_sprites(screen.machine(), bitmap,cliprect,3/*bank bits */); return 0; } -SCREEN_UPDATE( shootouj ) +SCREEN_UPDATE_IND16( shootouj ) { - shootout_state *state = screen->machine().driver_data(); + shootout_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap,cliprect,state->m_background,0,0); - tilemap_draw(bitmap,cliprect,state->m_foreground,0,1); - draw_sprites(screen->machine(), bitmap,cliprect,2/*bank bits*/); + state->m_background->draw(bitmap, cliprect, 0,0); + state->m_foreground->draw(bitmap, cliprect, 0,1); + draw_sprites(screen.machine(), bitmap,cliprect,2/*bank bits*/); return 0; } diff -Nru mame-0.144/src/mame/video/shuuz.c mame-0.145/src/mame/video/shuuz.c --- mame-0.144/src/mame/video/shuuz.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/shuuz.c 2012-02-06 21:30:31.000000000 +0000 @@ -89,23 +89,23 @@ * *************************************/ -SCREEN_UPDATE( shuuz ) +SCREEN_UPDATE_IND16( shuuz ) { - shuuz_state *state = screen->machine().driver_data(); + shuuz_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/sidearms.c mame-0.145/src/mame/video/sidearms.c --- mame-0.144/src/mame/video/sidearms.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sidearms.c 2012-02-06 21:30:33.000000000 +0000 @@ -14,7 +14,7 @@ sidearms_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sidearms_colorram_w ) @@ -22,7 +22,7 @@ sidearms_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sidearms_c804_w ) @@ -67,7 +67,7 @@ { state->m_flipon = data & 0x80; flip_screen_set(space->machine(), state->m_flipon); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -156,7 +156,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_sidearms_bg_tile_info, sidearms_tilemap_scan, 32, 32, 128, 128); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); } else { @@ -166,7 +166,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(3); state->m_hflop_74a_n = 1; state->m_latch_374 = state->m_vcount_191 = state->m_hcount_191 = 0; @@ -174,7 +174,7 @@ state->m_flipon = state->m_charon = state->m_staron = state->m_objon = state->m_bgon = 0; } -static void draw_sprites_region(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int start_offset, int end_offset ) +static void draw_sprites_region(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int start_offset, int end_offset ) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; const gfx_element *gfx = machine.gfx[2]; @@ -207,7 +207,7 @@ } } -static void sidearms_draw_starfield( running_machine &machine, bitmap_t *bitmap ) +static void sidearms_draw_starfield( running_machine &machine, bitmap_ind16 &bitmap ) { int x, y, i; UINT32 hadd_283, vadd_283, _hflop_74a_n, _hcount_191, _vcount_191; @@ -217,8 +217,8 @@ sidearms_state *state = machine.driver_data(); // clear starfield background - lineptr = BITMAP_ADDR16(bitmap, 16, 64); - lineadv = bitmap->rowpixels; + lineptr = &bitmap.pix16(16, 64); + lineadv = bitmap.rowpixels(); for (i=224; i; i--) { memset(lineptr, 0, 768); lineptr += lineadv; } @@ -237,13 +237,13 @@ #if 0 // old loop (for reference; easier to read) if (!flipon) { - lineptr = bitmap->base; + lineptr = bitmap.base; pixadv = 1; lineadv = lineadv - 512; } else { - lineptr = BITMAP_ADDR16(bitmap, 255, 512 - 1); + lineptr = &bitmap.pix16(255, 512 - 1); pixadv = -1; lineadv = -lineadv + 512; } @@ -280,13 +280,13 @@ #else // optimized loop if (!state->m_flipon) { - lineptr = BITMAP_ADDR16(bitmap, 16, 64); + lineptr = &bitmap.pix16(16, 64); pixadv = 1; lineadv = lineadv - 384; } else { - lineptr = BITMAP_ADDR16(bitmap, 239, 512 - 64 - 1); + lineptr = &bitmap.pix16(239, 512 - 64 - 1); pixadv = -1; lineadv = -lineadv + 384; } @@ -331,7 +331,7 @@ #endif } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sidearms_state *state = machine.driver_data(); @@ -346,29 +346,33 @@ } } -SCREEN_UPDATE( sidearms ) +SCREEN_UPDATE_IND16( sidearms ) { - sidearms_state *state = screen->machine().driver_data(); + sidearms_state *state = screen.machine().driver_data(); - sidearms_draw_starfield(screen->machine(), bitmap); + sidearms_draw_starfield(screen.machine(), bitmap); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx[0] + (state->m_bg_scrollx[1] << 8 & 0xf00)); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly[0] + (state->m_bg_scrolly[1] << 8 & 0xf00)); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx[0] + (state->m_bg_scrollx[1] << 8 & 0xf00)); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly[0] + (state->m_bg_scrolly[1] << 8 & 0xf00)); if (state->m_bgon) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_objon) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (state->m_charon) - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( sidearms ) +SCREEN_VBLANK( sidearms ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space, 0, 0); + buffer_spriteram_w(space, 0, 0); + } } diff -Nru mame-0.144/src/mame/video/sidepckt.c mame-0.145/src/mame/video/sidepckt.c --- mame-0.144/src/mame/video/sidepckt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sidepckt.c 2012-02-06 21:30:31.000000000 +0000 @@ -50,7 +50,7 @@ state->m_videoram[tile_index] + ((attr & 0x07) << 8), ((attr & 0x10) >> 3) | ((attr & 0x20) >> 5), TILE_FLIPX); - tileinfo->group = (attr & 0x80) >> 7; + tileinfo.group = (attr & 0x80) >> 7; } @@ -66,10 +66,10 @@ sidepckt_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transmask(state->m_bg_tilemap,0,0xff,0x00); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap,1,0x01,0xfe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0,0xff,0x00); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1,0x01,0xfe); /* split type 1 has pen 0 transparent in front half */ - tilemap_set_flip_all(machine,TILEMAP_FLIPX); + machine.tilemap().set_flip_all(TILEMAP_FLIPX); } @@ -84,20 +84,20 @@ { sidepckt_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sidepckt_colorram_w ) { sidepckt_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sidepckt_flipscreen_w ) { int flipscreen = data; - tilemap_set_flip_all(space->machine(),flipscreen ? TILEMAP_FLIPY : TILEMAP_FLIPX); + space->machine().tilemap().set_flip_all(flipscreen ? TILEMAP_FLIPY : TILEMAP_FLIPX); } @@ -107,7 +107,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { sidepckt_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -141,11 +141,11 @@ } -SCREEN_UPDATE( sidepckt ) +SCREEN_UPDATE_IND16( sidepckt ) { - sidepckt_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER1,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER0,0); + sidepckt_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); return 0; } diff -Nru mame-0.144/src/mame/video/silkroad.c mame-0.145/src/mame/video/silkroad.c --- mame-0.144/src/mame/video/silkroad.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/silkroad.c 2012-02-06 21:30:32.000000000 +0000 @@ -7,7 +7,7 @@ /* Clean Up */ /* is theres a bg colour register? */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { silkroad_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -78,7 +78,7 @@ silkroad_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vidram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_fg2_tile_info ) @@ -102,7 +102,7 @@ silkroad_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vidram2[offset]); - tilemap_mark_tile_dirty(state->m_fg2_tilemap,offset); + state->m_fg2_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_fg3_tile_info ) @@ -126,7 +126,7 @@ silkroad_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vidram3[offset]); - tilemap_mark_tile_dirty(state->m_fg3_tilemap,offset); + state->m_fg3_tilemap->mark_tile_dirty(offset); } VIDEO_START(silkroad) @@ -136,30 +136,30 @@ state->m_fg2_tilemap = tilemap_create(machine, get_fg2_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_fg3_tilemap = tilemap_create(machine, get_fg3_tile_info, tilemap_scan_rows, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg2_tilemap, 0); - tilemap_set_transparent_pen(state->m_fg3_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg2_tilemap->set_transparent_pen(0); + state->m_fg3_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE(silkroad) +SCREEN_UPDATE_IND16(silkroad) { - silkroad_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,0x7c0); + silkroad_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0x7c0, cliprect); - tilemap_set_scrollx( state->m_fg_tilemap, 0, ((state->m_regs[0] & 0xffff0000) >> 16) ); - tilemap_set_scrolly( state->m_fg_tilemap, 0, (state->m_regs[0] & 0x0000ffff) >> 0 ); + state->m_fg_tilemap->set_scrollx(0, ((state->m_regs[0] & 0xffff0000) >> 16) ); + state->m_fg_tilemap->set_scrolly(0, (state->m_regs[0] & 0x0000ffff) >> 0 ); - tilemap_set_scrolly( state->m_fg3_tilemap, 0, (state->m_regs[1] & 0xffff0000) >> 16 ); - tilemap_set_scrollx( state->m_fg3_tilemap, 0, (state->m_regs[2] & 0xffff0000) >> 16 ); + state->m_fg3_tilemap->set_scrolly(0, (state->m_regs[1] & 0xffff0000) >> 16 ); + state->m_fg3_tilemap->set_scrollx(0, (state->m_regs[2] & 0xffff0000) >> 16 ); - tilemap_set_scrolly( state->m_fg2_tilemap, 0, ((state->m_regs[5] & 0xffff0000) >> 16)); - tilemap_set_scrollx( state->m_fg2_tilemap, 0, (state->m_regs[2] & 0x0000ffff) >> 0 ); + state->m_fg2_tilemap->set_scrolly(0, ((state->m_regs[5] & 0xffff0000) >> 16)); + state->m_fg2_tilemap->set_scrollx(0, (state->m_regs[2] & 0x0000ffff) >> 0 ); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap, 0,0); - tilemap_draw(bitmap,cliprect,state->m_fg2_tilemap,0,1); - tilemap_draw(bitmap,cliprect,state->m_fg3_tilemap,0,2); - draw_sprites(screen->machine(),bitmap,cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg2_tilemap->draw(bitmap, cliprect, 0,1); + state->m_fg3_tilemap->draw(bitmap, cliprect, 0,2); + draw_sprites(screen.machine(),bitmap,cliprect); if (0) { diff -Nru mame-0.144/src/mame/video/simpl156.c mame-0.145/src/mame/video/simpl156.c --- mame-0.144/src/mame/video/simpl156.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/simpl156.c 2012-02-06 21:30:33.000000000 +0000 @@ -18,6 +18,8 @@ state->m_spriteram = auto_alloc_array_clear(machine, UINT16, 0x2000/2); machine.generic.paletteram.u16 = auto_alloc_array_clear(machine, UINT16, 0x1000/2); + memset(state->m_spriteram, 0xff, 0x2000); + /* and register the allocated ram so that save states still work */ state->save_pointer(NAME(state->m_pf1_rowscroll), 0x800/2); state->save_pointer(NAME(state->m_pf2_rowscroll), 0x800/2); @@ -25,22 +27,22 @@ state_save_register_global_pointer(machine, machine.generic.paletteram.u16, 0x1000/2); } -SCREEN_UPDATE( simpl156 ) +SCREEN_UPDATE_IND16( simpl156 ) { - simpl156_state *state = screen->machine().driver_data(); + simpl156_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + screen.machine().priority_bitmap.fill(0); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 256); + bitmap.fill(256, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 2); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 4); //FIXME: flip_screen_x should not be written! - flip_screen_set_no_update(screen->machine(), 1); + flip_screen_set_no_update(screen.machine(), 1); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x800); // 0x800 needed to charlien title + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x1400/4); // 0x1400/4 seems right for charlien (doesn't initialize any more RAM, so will draw a garbage 0 with more) return 0; } diff -Nru mame-0.144/src/mame/video/simpsons.c mame-0.145/src/mame/video/simpsons.c --- mame-0.144/src/mame/video/simpsons.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/simpsons.c 2012-02-06 21:30:31.000000000 +0000 @@ -122,9 +122,9 @@ ***************************************************************************/ -SCREEN_UPDATE( simpsons ) +SCREEN_UPDATE_IND16( simpsons ) { - simpsons_state *state = screen->machine().driver_data(); + simpsons_state *state = screen.machine().driver_data(); int layer[3], bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -144,8 +144,8 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[0], 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[2], 0, 4); diff -Nru mame-0.144/src/mame/video/sknsspr.c mame-0.145/src/mame/video/sknsspr.c --- mame-0.144/src/mame/video/sknsspr.c 2012-01-13 15:35:02.000000000 +0000 +++ mame-0.145/src/mame/video/sknsspr.c 2012-02-06 21:30:31.000000000 +0000 @@ -78,10 +78,10 @@ int step_spr = step; \ int bxs = 0, bys = 0; \ rectangle clip; \ - clip.min_x = cliprect->min_x<<6; \ - clip.max_x = (cliprect->max_x+1)<<6; \ - clip.min_y = cliprect->min_y<<6; \ - clip.max_y = (cliprect->max_y+1)<<6; \ + clip.min_x = cliprect.min_x<<6; \ + clip.max_x = (cliprect.max_x+1)<<6; \ + clip.min_y = cliprect.min_y<<6; \ + clip.max_y = (cliprect.max_y+1)<<6; \ sx <<= 6; \ sy <<= 6; \ x <<= 6; \ @@ -144,7 +144,7 @@ #define z_draw_pixel() \ UINT8 val = src[xs >> 6]; \ if(val) \ - *BITMAP_ADDR16(bitmap, yd>>6, xd>>6) = val + colour; + bitmap.pix16(yd>>6, xd>>6) = val + colour; #define z_x_dst(op) \ old = xd; \ @@ -165,7 +165,7 @@ old2 += 0x40; \ } -static void blit_nf_z(bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) +static void blit_nf_z(bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) { z_decls(sx); z_clamp_x_min(); @@ -179,7 +179,7 @@ } } -static void blit_fy_z(bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) +static void blit_fy_z(bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) { z_decls(sx); z_clamp_x_min(); @@ -193,7 +193,7 @@ } } -static void blit_fx_z(bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) +static void blit_fx_z(bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) { z_decls(sx); z_clamp_x_max(); @@ -207,7 +207,7 @@ } } -static void blit_fxy_z(bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) +static void blit_fxy_z(bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) { z_decls(sx); z_clamp_x_max(); @@ -221,14 +221,14 @@ } } -static void (*const blit_z[4])(bitmap_t *bitmap, const rectangle *cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) = { +static void (*const blit_z[4])(bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *src, int x, int y, int sx, int sy, UINT16 zx_m, UINT16 zx_s, UINT16 zy_m, UINT16 zy_s, int colour) = { blit_nf_z, blit_fy_z, blit_fx_z, blit_fxy_z, }; -void sknsspr_device::skns_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32* spriteram_source, size_t spriteram_size, UINT8* gfx_source, size_t gfx_length, UINT32* sprite_regs) +void sknsspr_device::skns_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32* spriteram_source, size_t spriteram_size, UINT8* gfx_source, size_t gfx_length, UINT32* sprite_regs) { /*- SPR RAM Format -** @@ -475,16 +475,16 @@ for (xx = 0; xxmax_x+1)) && (sx+xx >= cliprect->min_x)) + if ((sx+xx < (cliprect.max_x+1)) && (sx+xx >= cliprect.min_x)) { for (yy = 0; yymax_y+1)) && (sy+yy >= cliprect->min_y)) + if ((sy+yy < (cliprect.max_y+1)) && (sy+yy >= cliprect.min_y)) { int pix; pix = decodebuffer[xsize*yy+xx]; if (pix) - *BITMAP_ADDR16(bitmap, sy+yy, sx+xx) = pix+ NewColour; // change later + bitmap.pix16(sy+yy, sx+xx) = pix+ NewColour; // change later } } } @@ -495,16 +495,16 @@ for (xx = 0; xxmax_x+1)) && (sx+xx >= cliprect->min_x)) + if ((sx+xx < (cliprect.max_x+1)) && (sx+xx >= cliprect.min_x)) { for (yy = 0; yymax_y+1)) && (sy+(ysize-1-yy) >= cliprect->min_y)) + if ((sy+(ysize-1-yy) < (cliprect.max_y+1)) && (sy+(ysize-1-yy) >= cliprect.min_y)) { int pix; pix = decodebuffer[xsize*yy+xx]; if (pix) - *BITMAP_ADDR16(bitmap, sy+(ysize-1-yy), sx+xx) = pix+ NewColour; // change later + bitmap.pix16(sy+(ysize-1-yy), sx+xx) = pix+ NewColour; // change later } } } @@ -515,16 +515,16 @@ for (xx = 0; xxmax_x+1)) && (sx+(xsize-1-xx) >= cliprect->min_x)) + if ( (sx+(xsize-1-xx) < (cliprect.max_x+1)) && (sx+(xsize-1-xx) >= cliprect.min_x)) { for (yy = 0; yymax_y+1)) && (sy+yy >= cliprect->min_y)) + if ((sy+yy < (cliprect.max_y+1)) && (sy+yy >= cliprect.min_y)) { int pix; pix = decodebuffer[xsize*yy+xx]; if (pix) - *BITMAP_ADDR16(bitmap, sy+yy, sx+(xsize-1-xx)) = pix+ NewColour; // change later + bitmap.pix16(sy+yy, sx+(xsize-1-xx)) = pix+ NewColour; // change later } } } @@ -536,16 +536,16 @@ for (xx = 0; xxmax_x+1)) && (sx+(xsize-1-xx) >= cliprect->min_x)) + if ((sx+(xsize-1-xx) < (cliprect.max_x+1)) && (sx+(xsize-1-xx) >= cliprect.min_x)) { for (yy = 0; yymax_y+1)) && (sy+(ysize-1-yy) >= cliprect->min_y)) + if ((sy+(ysize-1-yy) < (cliprect.max_y+1)) && (sy+(ysize-1-yy) >= cliprect.min_y)) { int pix; pix = decodebuffer[xsize*yy+xx]; if (pix) - *BITMAP_ADDR16(bitmap, sy+(ysize-1-yy), sx+(xsize-1-xx)) = pix+ NewColour; // change later + bitmap.pix16(sy+(ysize-1-yy), sx+(xsize-1-xx)) = pix+ NewColour; // change later } } } diff -Nru mame-0.144/src/mame/video/sknsspr.h mame-0.145/src/mame/video/sknsspr.h --- mame-0.144/src/mame/video/sknsspr.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sknsspr.h 2012-02-06 21:30:31.000000000 +0000 @@ -3,7 +3,7 @@ { public: sknsspr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void skns_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32* spriteram_source, size_t spriteram_size, UINT8* gfx_source, size_t gfx_length, UINT32* sprite_regs); + void skns_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32* spriteram_source, size_t spriteram_size, UINT8* gfx_source, size_t gfx_length, UINT32* sprite_regs); void skns_sprite_kludge(int x, int y); protected: diff -Nru mame-0.144/src/mame/video/skullxbo.c mame-0.145/src/mame/video/skullxbo.c --- mame-0.144/src/mame/video/skullxbo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/skullxbo.c 2012-02-06 21:30:31.000000000 +0000 @@ -93,7 +93,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 16,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); } @@ -118,7 +118,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* adjust the actual scrolls */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, 2 * (newscroll >> 7)); + state->m_playfield_tilemap->set_scrollx(0, 2 * (newscroll >> 7)); atarimo_set_xscroll(0, 2 * (newscroll >> 7)); /* update the data */ @@ -147,7 +147,7 @@ effscroll = (newscroll >> 7) - scanline; /* adjust the actual scrolls */ - tilemap_set_scrolly(state->m_playfield_tilemap, 0, effscroll); + state->m_playfield_tilemap->set_scrolly(0, effscroll); atarimo_set_yscroll(0, effscroll & 0x1ff); /* update the data */ @@ -204,7 +204,7 @@ if (scanline == 0) { int newscroll = (*state->m_yscroll >> 7) & 0x1ff; - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); atarimo_set_yscroll(0, newscroll); } @@ -225,7 +225,7 @@ machine.primary_screen->update_partial(scanline - 1); /* update the new scroll */ - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll); + state->m_playfield_tilemap->set_scrolly(0, newscroll); atarimo_set_yscroll(0, newscroll); /* make sure we change this value so that writes to the scroll register */ @@ -243,23 +243,23 @@ * *************************************/ -SCREEN_UPDATE( skullxbo ) +SCREEN_UPDATE_IND16( skullxbo ) { - skullxbo_state *state = screen->machine().driver_data(); + skullxbo_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -315,6 +315,6 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/skydiver.c mame-0.145/src/mame/video/skydiver.c --- mame-0.144/src/mame/video/skydiver.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/skydiver.c 2012-02-06 21:30:32.000000000 +0000 @@ -67,7 +67,7 @@ { skydiver_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -168,7 +168,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skydiver_state *state = machine.driver_data(); int pic; @@ -206,11 +206,11 @@ } -SCREEN_UPDATE( skydiver ) +SCREEN_UPDATE_IND16( skydiver ) { - skydiver_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + skydiver_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/skyfox.c mame-0.145/src/mame/video/skyfox.c --- mame-0.144/src/mame/video/skyfox.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/skyfox.c 2012-02-06 21:30:32.000000000 +0000 @@ -159,7 +159,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { skyfox_state *state = machine.driver_data(); int offs; @@ -238,7 +238,7 @@ ***************************************************************************/ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skyfox_state *state = machine.driver_data(); UINT8 *RAM = machine.region("gfx2")->base(); @@ -265,7 +265,7 @@ } for (j = 0 ; j <= ((pen & 0x80) ? 0 : 3); j++) - *BITMAP_ADDR16(bitmap, + bitmap.pix16( (((j / 2) & 1) + y) % 256, ((j & 1) + x) % 512) = 256 + (pen & 0x7f); } @@ -281,10 +281,10 @@ ***************************************************************************/ -SCREEN_UPDATE( skyfox ) +SCREEN_UPDATE_IND16( skyfox ) { - bitmap_fill(bitmap, cliprect, 255); // the bg is black - draw_background(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + bitmap.fill(255, cliprect); // the bg is black + draw_background(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/skykid.c mame-0.145/src/mame/video/skykid.c --- mame-0.144/src/mame/video/skykid.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/skykid.c 2012-02-06 21:30:32.000000000 +0000 @@ -75,7 +75,7 @@ skykid_state *state = machine.driver_data(); int code = state->m_textram[tile_index]; int attr = state->m_textram[tile_index + 0x400]; - tileinfo->category = code >> 4 & 0xf; + tileinfo.category = code >> 4 & 0xf; /* the hardware has two character sets, one normal and one flipped. When screen is flipped, character flip is done by selecting the 2nd character set. @@ -116,7 +116,7 @@ state->m_tx_tilemap = tilemap_create(machine, tx_get_tile_info,tx_tilemap_scan, 8,8,36,28); state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows, 8,8,64,32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_transparent_pen(0); state_save_register_global(machine, state->m_priority); state_save_register_global(machine, state->m_scroll_x); @@ -141,7 +141,7 @@ { skykid_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } READ8_HANDLER( skykid_textram_r ) @@ -154,7 +154,7 @@ { skykid_state *state = space->machine().driver_data(); state->m_textram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( skykid_scroll_x_w ) @@ -185,7 +185,7 @@ ***************************************************************************/ /* the sprite generator IC is the same as Mappy */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { skykid_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram + 0x780; @@ -238,21 +238,21 @@ } -SCREEN_UPDATE( skykid ) +SCREEN_UPDATE_IND16( skykid ) { - skykid_state *state = screen->machine().driver_data(); - if (flip_screen_get(screen->machine())) + skykid_state *state = screen.machine().driver_data(); + if (flip_screen_get(screen.machine())) { - tilemap_set_scrollx(state->m_bg_tilemap, 0, 189 - (state->m_scroll_x ^ 1)); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 7 - state->m_scroll_y); + state->m_bg_tilemap->set_scrollx(0, 189 - (state->m_scroll_x ^ 1)); + state->m_bg_tilemap->set_scrolly(0, 7 - state->m_scroll_y); } else { - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_x + 35); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_y + 25); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x + 35); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_y + 25); } - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE,0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); if (state->m_priority & 0x04) { @@ -260,18 +260,18 @@ int cat, pri = state->m_priority >> 4; // draw low priority tiles - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, pri, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, pri, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); // draw the other tiles for (cat = 0; cat < 0xf; cat++) - if (cat != pri) tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, cat, 0); + if (cat != pri) state->m_tx_tilemap->draw(bitmap, cliprect, cat, 0); } else { - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, TILEMAP_DRAW_ALL_CATEGORIES, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_ALL_CATEGORIES, 0); } return 0; diff -Nru mame-0.144/src/mame/video/skyraid.c mame-0.145/src/mame/video/skyraid.c --- mame-0.144/src/mame/video/skyraid.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/skyraid.c 2012-02-06 21:30:32.000000000 +0000 @@ -12,11 +12,11 @@ { skyraid_state *state = machine.driver_data(); - state->m_helper = auto_bitmap_alloc(machine, 128, 240, machine.primary_screen->format()); + state->m_helper.allocate(128, 240); } -static void draw_text(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_text(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skyraid_state *state = machine.driver_data(); const UINT8* p = state->m_alpha_num_ram; @@ -30,13 +30,13 @@ y = 136 + 16 * (i ^ 1); - for (x = 0; x < bitmap->width; x += 16) + for (x = 0; x < bitmap.width(); x += 16) drawgfx_transpen(bitmap, cliprect, machine.gfx[0], *p++, 0, 0, 0, x, y, 0); } } -static void draw_terrain(running_machine &machine, bitmap_t* bitmap, const rectangle *cliprect) +static void draw_terrain(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skyraid_state *state = machine.driver_data(); const UINT8* p = machine.region("user1")->base(); @@ -44,27 +44,22 @@ int x; int y; - for (y = 0; y < bitmap->height; y++) + for (y = 0; y < bitmap.height(); y++) { int offset = (16 * state->m_scroll + 16 * ((y + 1) / 2)) & 0x7FF; x = 0; - while (x < bitmap->width) + while (x < bitmap.width()) { UINT8 val = p[offset++]; int color = val / 32; int count = val % 32; - rectangle r; + rectangle r(x, x + 31 - count, y, y+ 1); - r.min_y = y; - r.min_x = x; - r.max_y = y + 1; - r.max_x = x + 31 - count; - - bitmap_fill(bitmap, &r, color); + bitmap.fill(color, r); x += 32 - count; } @@ -72,7 +67,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skyraid_state *state = machine.driver_data(); int i; @@ -94,7 +89,7 @@ } -static void draw_missiles(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_missiles(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { skyraid_state *state = machine.driver_data(); int i; @@ -117,17 +112,17 @@ } -static void draw_trapezoid(running_machine &machine, bitmap_t* dst, bitmap_t* src) +static void draw_trapezoid(running_machine &machine, bitmap_ind16& dst, bitmap_ind16& src) { const UINT8* p = machine.region("user2")->base(); int x; int y; - for (y = 0; y < dst->height; y++) + for (y = 0; y < dst.height(); y++) { - UINT16* pSrc = BITMAP_ADDR16(src, y, 0); - UINT16* pDst = BITMAP_ADDR16(dst, y, 0); + UINT16* pSrc = &src.pix16(y); + UINT16* pDst = &dst.pix16(y); int x1 = 0x000 + p[(y & ~1) + 0]; int x2 = 0x100 + p[(y & ~1) + 1]; @@ -138,16 +133,19 @@ } -SCREEN_UPDATE( skyraid ) +SCREEN_UPDATE_IND16( skyraid ) { - skyraid_state *state = screen->machine().driver_data(); + skyraid_state *state = screen.machine().driver_data(); + + bitmap.fill(0, cliprect); - bitmap_fill(bitmap, cliprect, 0); + rectangle helper_clip = cliprect; + helper_clip &= state->m_helper.cliprect(); - draw_terrain(screen->machine(), state->m_helper, NULL); - draw_sprites(screen->machine(), state->m_helper, NULL); - draw_missiles(screen->machine(), state->m_helper, NULL); - draw_trapezoid(screen->machine(), bitmap, state->m_helper); - draw_text(screen->machine(), bitmap, cliprect); + draw_terrain(screen.machine(), state->m_helper, helper_clip); + draw_sprites(screen.machine(), state->m_helper, helper_clip); + draw_missiles(screen.machine(), state->m_helper, helper_clip); + draw_trapezoid(screen.machine(), bitmap, state->m_helper); + draw_text(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/slapfght.c mame-0.145/src/mame/video/slapfght.c --- mame-0.144/src/mame/video/slapfght.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/slapfght.c 2012-02-06 21:30:32.000000000 +0000 @@ -72,7 +72,7 @@ slapfght_state *state = machine.driver_data(); state->m_pf1_tilemap = tilemap_create(machine, get_pf_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_pf1_tilemap,0); + state->m_pf1_tilemap->set_transparent_pen(0); } VIDEO_START( slapfight ) @@ -81,7 +81,7 @@ state->m_pf1_tilemap = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_rows,8,8,64,32); state->m_fix_tilemap = tilemap_create(machine, get_fix_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_fix_tilemap,0); + state->m_fix_tilemap->set_transparent_pen(0); } @@ -95,28 +95,28 @@ { slapfght_state *state = space->machine().driver_data(); state->m_slapfight_videoram[offset]=data; - tilemap_mark_tile_dirty(state->m_pf1_tilemap,offset); + state->m_pf1_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( slapfight_colorram_w ) { slapfght_state *state = space->machine().driver_data(); state->m_slapfight_colorram[offset]=data; - tilemap_mark_tile_dirty(state->m_pf1_tilemap,offset); + state->m_pf1_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( slapfight_fixram_w ) { slapfght_state *state = space->machine().driver_data(); state->m_slapfight_fixvideoram[offset]=data; - tilemap_mark_tile_dirty(state->m_fix_tilemap,offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( slapfight_fixcol_w ) { slapfght_state *state = space->machine().driver_data(); state->m_slapfight_fixcolorram[offset]=data; - tilemap_mark_tile_dirty(state->m_fix_tilemap,offset); + state->m_fix_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( slapfight_flipscreen_w ) @@ -153,7 +153,7 @@ Render the Sprites ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority_to_display ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority_to_display ) { slapfght_state *state = machine.driver_data(); UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; @@ -187,69 +187,69 @@ } -SCREEN_UPDATE( perfrman ) +SCREEN_UPDATE_IND16( perfrman ) { - slapfght_state *state = screen->machine().driver_data(); - tilemap_set_flip( state->m_pf1_tilemap, state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - tilemap_set_scrolly( state->m_pf1_tilemap ,0 , 0 ); + slapfght_state *state = screen.machine().driver_data(); + state->m_pf1_tilemap->set_flip(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + state->m_pf1_tilemap ->set_scrolly(0 , 0 ); if (state->m_flipscreen) { - tilemap_set_scrollx( state->m_pf1_tilemap ,0 , 264 ); + state->m_pf1_tilemap ->set_scrollx(0 , 264 ); } else { - tilemap_set_scrollx( state->m_pf1_tilemap ,0 , -16 ); + state->m_pf1_tilemap ->set_scrollx(0 , -16 ); } - tilemap_draw(bitmap,cliprect,state->m_pf1_tilemap,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_pf1_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0x80); + state->m_pf1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect,0); + state->m_pf1_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0x80); - slapfght_log_vram(screen->machine()); + slapfght_log_vram(screen.machine()); return 0; } -SCREEN_UPDATE( slapfight ) +SCREEN_UPDATE_IND16( slapfight ) { - slapfght_state *state = screen->machine().driver_data(); - UINT8 *buffered_spriteram = screen->machine().generic.buffered_spriteram.u8; + slapfght_state *state = screen.machine().driver_data(); + UINT8 *buffered_spriteram = screen.machine().generic.buffered_spriteram.u8; int offs; - tilemap_set_flip_all(screen->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (state->m_flipscreen) { - tilemap_set_scrollx( state->m_fix_tilemap,0,296); - tilemap_set_scrollx( state->m_pf1_tilemap,0,(*state->m_slapfight_scrollx_lo + 256 * *state->m_slapfight_scrollx_hi)+296 ); - tilemap_set_scrolly( state->m_pf1_tilemap,0, (*state->m_slapfight_scrolly)+15 ); - tilemap_set_scrolly( state->m_fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ + state->m_fix_tilemap->set_scrollx(0,296); + state->m_pf1_tilemap->set_scrollx(0,(*state->m_slapfight_scrollx_lo + 256 * *state->m_slapfight_scrollx_hi)+296 ); + state->m_pf1_tilemap->set_scrolly(0, (*state->m_slapfight_scrolly)+15 ); + state->m_fix_tilemap->set_scrolly(0, -1 ); /* Glitch in Tiger Heli otherwise */ } else { - tilemap_set_scrollx( state->m_fix_tilemap,0,0); - tilemap_set_scrollx( state->m_pf1_tilemap,0,(*state->m_slapfight_scrollx_lo + 256 * *state->m_slapfight_scrollx_hi) ); - tilemap_set_scrolly( state->m_pf1_tilemap,0, (*state->m_slapfight_scrolly)-1 ); - tilemap_set_scrolly( state->m_fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ + state->m_fix_tilemap->set_scrollx(0,0); + state->m_pf1_tilemap->set_scrollx(0,(*state->m_slapfight_scrollx_lo + 256 * *state->m_slapfight_scrollx_hi) ); + state->m_pf1_tilemap->set_scrolly(0, (*state->m_slapfight_scrolly)-1 ); + state->m_fix_tilemap->set_scrolly(0, -1 ); /* Glitch in Tiger Heli otherwise */ } - tilemap_draw(bitmap,cliprect,state->m_pf1_tilemap,0,0); + state->m_pf1_tilemap->draw(bitmap, cliprect, 0,0); /* Draw the sprites */ - for (offs = 0;offs < screen->machine().generic.spriteram_size;offs += 4) + for (offs = 0;offs < screen.machine().generic.spriteram_size;offs += 4) { if (state->m_flipscreen) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2), (buffered_spriteram[offs+2] & 0x1e) >> 1, 1,1, 288-(buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) +18,240-buffered_spriteram[offs+3],0); else - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2), (buffered_spriteram[offs+2] & 0x1e) >> 1, 0,0, (buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) - 13,buffered_spriteram[offs+3],0); } - tilemap_draw(bitmap,cliprect,state->m_fix_tilemap,0,0); + state->m_fix_tilemap->draw(bitmap, cliprect, 0,0); - slapfght_log_vram(screen->machine()); + slapfght_log_vram(screen.machine()); return 0; } diff -Nru mame-0.144/src/mame/video/slapshot.c mame-0.145/src/mame/video/slapshot.c --- mame-0.144/src/mame/video/slapshot.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/slapshot.c 2012-02-06 21:30:32.000000000 +0000 @@ -34,7 +34,7 @@ SPRITE DRAW ROUTINES ************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int *primasks, int y_offset ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks, int y_offset ) { /* Sprite format: @@ -428,13 +428,17 @@ } } -SCREEN_EOF( taito_no_buffer ) +SCREEN_VBLANK( taito_no_buffer ) { - slapshot_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + slapshot_state *state = screen.machine().driver_data(); - taito_update_sprites_active_area(machine); + taito_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 1; + state->m_prepare_sprites = 1; + } } @@ -454,47 +458,47 @@ a bg layer given priority over some sprites. ********************************************************************/ -SCREEN_UPDATE( slapshot ) +SCREEN_UPDATE_IND16( slapshot ) { - slapshot_state *state = screen->machine().driver_data(); + slapshot_state *state = screen.machine().driver_data(); UINT8 layer[5]; UINT8 tilepri[5]; UINT8 spritepri[4]; UINT16 priority; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed_once (KEYCODE_Z)) + if (screen.machine().input().code_pressed_once (KEYCODE_Z)) { state->m_dislayer[0] ^= 1; popmessage("bg0: %01x",state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once (KEYCODE_X)) + if (screen.machine().input().code_pressed_once (KEYCODE_X)) { state->m_dislayer[1] ^= 1; popmessage("bg1: %01x",state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once (KEYCODE_C)) + if (screen.machine().input().code_pressed_once (KEYCODE_C)) { state->m_dislayer[2] ^= 1; popmessage("bg2: %01x",state->m_dislayer[2]); } - if (screen->machine().input().code_pressed_once (KEYCODE_V)) + if (screen.machine().input().code_pressed_once (KEYCODE_V)) { state->m_dislayer[3] ^= 1; popmessage("bg3: %01x",state->m_dislayer[3]); } - if (screen->machine().input().code_pressed_once (KEYCODE_B)) + if (screen.machine().input().code_pressed_once (KEYCODE_B)) { state->m_dislayer[4] ^= 1; popmessage("text: %01x",state->m_dislayer[4]); } #endif - taito_handle_sprite_buffering(screen->machine()); + taito_handle_sprite_buffering(screen.machine()); tc0480scp_tilemap_update(state->m_tc0480scp); @@ -519,8 +523,8 @@ spritepri[2] = tc0360pri_r(state->m_tc0360pri, 7) & 0x0f; spritepri[3] = tc0360pri_r(state->m_tc0360pri, 7) >> 4; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); #ifdef MAME_DEBUG if (state->m_dislayer[layer[0]] == 0) @@ -554,7 +558,7 @@ if (spritepri[i] < tilepri[(layer[3])]) primasks[i] |= 0xff00; } - draw_sprites(screen->machine(),bitmap,cliprect,primasks,0); + draw_sprites(screen.machine(),bitmap,cliprect,primasks,0); } /* diff -Nru mame-0.144/src/mame/video/snes.c mame-0.145/src/mame/video/snes.c --- mame-0.144/src/mame/video/snes.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/snes.c 2012-02-06 21:30:32.000000000 +0000 @@ -1498,7 +1498,7 @@ * the optimized averaging algorithm. *********************************************/ -static void snes_refresh_scanline( running_machine &machine, bitmap_t *bitmap, UINT16 curline ) +static void snes_refresh_scanline( running_machine &machine, bitmap_rgb32 &bitmap, UINT16 curline ) { UINT16 ii; int x; @@ -1512,7 +1512,7 @@ if (snes_ppu.screen_disabled) /* screen is forced blank */ for (x = 0; x < SNES_SCR_WIDTH * 2; x++) - *BITMAP_ADDR32(bitmap, curline, x) = RGB_BLACK; + bitmap.pix32(curline, x) = RGB_BLACK; else { /* Update clip window masks if necessary */ @@ -1596,8 +1596,8 @@ g = (((c & 0x3e0) >> 5) * fade) >> 4; b = (((c & 0x7c00) >> 10) * fade) >> 4; - *BITMAP_ADDR32(bitmap, curline, x * 2 + 0) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); - *BITMAP_ADDR32(bitmap, curline, x * 2 + 1) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); + bitmap.pix32(curline, x * 2 + 0) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); + bitmap.pix32(curline, x * 2 + 1) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); } else { @@ -1635,7 +1635,7 @@ g = (((c & 0x3e0) >> 5) * fade) >> 4; b = (((c & 0x7c00) >> 10) * fade) >> 4; - *BITMAP_ADDR32(bitmap, curline, x * 2 + 0) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); + bitmap.pix32(curline, x * 2 + 0) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); prev_colour = tmp_col[0]; /* average the second pixel if required, or draw it directly*/ @@ -1648,7 +1648,7 @@ g = (((c & 0x3e0) >> 5) * fade) >> 4; b = (((c & 0x7c00) >> 10) * fade) >> 4; - *BITMAP_ADDR32(bitmap, curline, x * 2 + 1) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); + bitmap.pix32(curline, x * 2 + 1) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); prev_colour = tmp_col[1]; } } @@ -1789,14 +1789,14 @@ state_save_register_global_pointer(machine, snes_oam, SNES_OAM_SIZE/2); } -SCREEN_UPDATE( snes ) +SCREEN_UPDATE_RGB32( snes ) { int y; /*NTSC SNES draw range is 1-225. */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - snes_refresh_scanline(screen->machine(), bitmap, y + 1); + snes_refresh_scanline(screen.machine(), bitmap, y + 1); } return 0; } diff -Nru mame-0.144/src/mame/video/snk6502.c mame-0.145/src/mame/video/snk6502.c --- mame-0.144/src/mame/video/snk6502.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/snk6502.c 2012-02-06 21:30:32.000000000 +0000 @@ -79,7 +79,7 @@ snk6502_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( snk6502_videoram2_w ) @@ -87,7 +87,7 @@ snk6502_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( snk6502_colorram_w ) @@ -95,8 +95,8 @@ snk6502_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( snk6502_charram_w ) @@ -135,7 +135,7 @@ if (state->m_charbank != bank) { state->m_charbank = bank; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 7 flips screen */ @@ -143,7 +143,7 @@ if (flip_screen_get(space->machine()) != (data & 0x80)) { flip_screen_set(space->machine(), data & 0x80); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -151,14 +151,14 @@ { snk6502_state *state = space->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrollx(0, data); } WRITE8_HANDLER( snk6502_scrolly_w ) { snk6502_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } @@ -187,7 +187,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); gfx_element_set_source(machine.gfx[0], state->m_charram); } @@ -198,17 +198,17 @@ VIDEO_START_CALL( snk6502 ); - tilemap_set_scrolldy(state->m_bg_tilemap, -24, 0); - tilemap_set_scrolldy(state->m_fg_tilemap, -24, 0); + state->m_bg_tilemap->set_scrolldy(-16, -16); + state->m_fg_tilemap->set_scrolldy(-16, -16); } -SCREEN_UPDATE( snk6502 ) +SCREEN_UPDATE_IND16( snk6502 ) { - snk6502_state *state = screen->machine().driver_data(); + snk6502_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -268,19 +268,17 @@ WRITE8_HANDLER( satansat_b002_w ) { + snk6502_state *state = space->machine().driver_data(); /* bit 0 flips screen */ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } - /* bit 1 enables interrups */ - /* it controls only IRQs, not NMIs. Here I am affecting both, which */ - /* is wrong. */ - - interrupt_enable_w(space,0,data & 0x02); + /* bit 1 enables interrupts */ + state->m_irq_mask = data & 2; /* other bits unused */ } @@ -327,7 +325,7 @@ state->m_bg_tilemap = tilemap_create(machine, satansat_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, satansat_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); gfx_element_set_source(machine.gfx[0], state->m_charram); } diff -Nru mame-0.144/src/mame/video/snk68.c mame-0.145/src/mame/video/snk68.c --- mame-0.144/src/mame/video/snk68.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/snk68.c 2012-02-06 21:30:31.000000000 +0000 @@ -54,10 +54,10 @@ { snk68_state *state = machine.driver_data(); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, machine.primary_screen->width() - 256); - tilemap_set_scrolldy(state->m_fg_tilemap, 0, machine.primary_screen->height() - 256); + state->m_fg_tilemap->set_scrolldx(0, machine.primary_screen->width() - 256); + state->m_fg_tilemap->set_scrolldy(0, machine.primary_screen->height() - 256); } VIDEO_START( pow ) @@ -133,7 +133,7 @@ data |= 0xff00; COMBINE_DATA(&state->m_pow_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } WRITE16_HANDLER( searchar_fg_videoram_w ) @@ -142,7 +142,7 @@ // RAM is full 16-bit, though only half of it is used by the hardware COMBINE_DATA(&state->m_pow_fg_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset >> 1); + state->m_fg_tilemap->mark_tile_dirty(offset >> 1); } WRITE16_HANDLER( pow_flipscreen16_w ) @@ -151,14 +151,14 @@ { snk68_state *state = space->machine().driver_data(); state->m_flipscreen = data & 0x08; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); state->m_sprite_flip_axis = data & 0x04; // for streetsm? though might not be present on this board if (state->m_fg_tile_offset != ((data & 0x70) << 4)) { state->m_fg_tile_offset = (data & 0x70) << 4; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } } } @@ -170,7 +170,7 @@ snk68_state *state = space->machine().driver_data(); state->m_flipscreen = data & 0x08; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); state->m_sprite_flip_axis = data & 0x04; } @@ -199,7 +199,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int group) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int group) { snk68_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -235,7 +235,7 @@ { my &= 0x1ff; - if (my <= cliprect->max_y && my + 15 >= cliprect->min_y) + if (my <= cliprect.max_y && my + 15 >= cliprect.min_y) { int color = *(tiledata++) & 0x7f; int tile = *(tiledata++); @@ -288,17 +288,17 @@ } -SCREEN_UPDATE( pow ) +SCREEN_UPDATE_IND16( pow ) { - snk68_state *state = screen->machine().driver_data(); + snk68_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x7ff); + bitmap.fill(0x7ff, cliprect); /* This appears to be the correct priority order */ - draw_sprites(screen->machine(), bitmap, cliprect, 2); - draw_sprites(screen->machine(), bitmap, cliprect, 3); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 2); + draw_sprites(screen.machine(), bitmap, cliprect, 3); + draw_sprites(screen.machine(), bitmap, cliprect, 1); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/snk.c mame-0.145/src/mame/video/snk.c --- mame-0.144/src/mame/video/snk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/snk.c 2012-02-06 21:30:31.000000000 +0000 @@ -183,7 +183,7 @@ // (still call SET_TILE_INFO, otherwise problems might occur on boot when // the tile data hasn't been initialised) if (code >= machine.gfx[1]->total_elements) - tileinfo->pen_data = state->m_empty_tile; + tileinfo.pen_data = state->m_empty_tile; } @@ -238,15 +238,15 @@ state->m_fg_tilemap = tilemap_create(machine, marvins_get_fg_tile_info, tilemap_scan_cols, 8, 8, 64, 32); state->m_bg_tilemap = tilemap_create(machine, marvins_get_bg_tile_info, tilemap_scan_cols, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_transparent_pen(state->m_fg_tilemap, 15); - tilemap_set_scrolldx(state->m_fg_tilemap, 15, 31); - tilemap_set_scrolldy(state->m_fg_tilemap, 8, -32); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_fg_tilemap->set_scrolldx(15, 31); + state->m_fg_tilemap->set_scrolldy(8, -32); - tilemap_set_scrolldx(state->m_bg_tilemap, 15, 31); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32); + state->m_bg_tilemap->set_scrolldx(15, 31); + state->m_bg_tilemap->set_scrolldy(8, -32); state->m_tx_tile_offset = 0; } @@ -260,11 +260,11 @@ state->m_tx_tilemap = tilemap_create(machine, marvins_get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, aso_get_bg_tile_info, tilemap_scan_cols, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_scrolldx(state->m_bg_tilemap, 15, 24); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32); + state->m_bg_tilemap->set_scrolldx(15, 24); + state->m_bg_tilemap->set_scrolldy(8, -32); state->m_num_sprites = 25; state->m_yscroll_mask = 0x1ff; @@ -281,11 +281,11 @@ state->m_tx_tilemap = tilemap_create(machine, marvins_get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, aso_get_bg_tile_info, tilemap_scan_cols, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_scrolldx(state->m_bg_tilemap, 15, 24); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32); + state->m_bg_tilemap->set_scrolldx(15, 24); + state->m_bg_tilemap->set_scrolldy(8, -32); state->m_num_sprites = 25; state->m_yscroll_mask = 0x0ff; @@ -299,7 +299,7 @@ VIDEO_START_CALL(jcross); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32+256); + state->m_bg_tilemap->set_scrolldy(8, -32+256); state->m_num_sprites = 50; state->m_yscroll_mask = 0x1ff; @@ -311,7 +311,7 @@ VIDEO_START_CALL(jcross); - tilemap_set_scrolldx(state->m_bg_tilemap, 15+256, 24+256); + state->m_bg_tilemap->set_scrolldx(15+256, 24+256); state->m_num_sprites = 50; state->m_yscroll_mask = 0x1ff; @@ -327,11 +327,11 @@ state->m_tx_tilemap = tilemap_create(machine, marvins_get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, tnk3_get_bg_tile_info, tilemap_scan_cols, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_scrolldx(state->m_bg_tilemap, 15, 24); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32); + state->m_bg_tilemap->set_scrolldx(15, 24); + state->m_bg_tilemap->set_scrolldy(8, -32); state->m_num_sprites = 50; state->m_yscroll_mask = 0x1ff; @@ -347,11 +347,11 @@ state->m_tx_tilemap = tilemap_create(machine, ikari_get_tx_tile_info, marvins_tx_scan_cols, 8, 8, 36, 28); state->m_bg_tilemap = tilemap_create(machine, ikari_get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); - tilemap_set_scrolldy(state->m_tx_tilemap, 8, 8); + state->m_tx_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_scrolldy(8, 8); - tilemap_set_scrolldx(state->m_bg_tilemap, 15, 24); - tilemap_set_scrolldy(state->m_bg_tilemap, 8, -32); + state->m_bg_tilemap->set_scrolldx(15, 24); + state->m_bg_tilemap->set_scrolldy(8, -32); state->m_tx_tile_offset = 0; } @@ -370,10 +370,10 @@ state->m_tx_tilemap = tilemap_create(machine, gwar_get_tx_tile_info, tilemap_scan_cols, 8, 8, 50, 32); state->m_bg_tilemap = tilemap_create(machine, gwar_get_bg_tile_info, tilemap_scan_cols, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_tx_tilemap, 15); + state->m_tx_tilemap->set_transparent_pen(15); - tilemap_set_scrolldx(state->m_bg_tilemap, 16, 143); - tilemap_set_scrolldy(state->m_bg_tilemap, 0, -32); + state->m_bg_tilemap->set_scrolldx(16, 143); + state->m_bg_tilemap->set_scrolldy(0, -32); state->m_tx_tile_offset = 0; @@ -401,7 +401,7 @@ snk_state *state = space->machine().driver_data(); state->m_tx_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( marvins_fg_videoram_w ) @@ -409,7 +409,7 @@ snk_state *state = space->machine().driver_data(); state->m_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( marvins_bg_videoram_w ) @@ -417,7 +417,7 @@ snk_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( snk_bg_videoram_w ) @@ -425,7 +425,7 @@ snk_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1); + state->m_bg_tilemap->mark_tile_dirty(offset >> 1); } @@ -497,8 +497,8 @@ { snk_state *state = space->machine().driver_data(); - tilemap_set_palette_offset(state->m_bg_tilemap, data & 0x70); - tilemap_set_palette_offset(state->m_fg_tilemap, (data & 0x07) << 4); + state->m_bg_tilemap->set_palette_offset(data & 0x70); + state->m_fg_tilemap->set_palette_offset((data & 0x07) << 4); } WRITE8_HANDLER( marvins_flipscreen_w ) @@ -514,7 +514,7 @@ flip_screen_set(space->machine(), data & 0x80); - tilemap_set_palette_offset(state->m_bg_tilemap, ((data & 0xf) ^ 8) << 4); + state->m_bg_tilemap->set_palette_offset(((data & 0xf) ^ 8) << 4); // other bits unknown } @@ -525,11 +525,11 @@ flip_screen_set(space->machine(), data & 0x80); - tilemap_set_palette_offset(state->m_bg_tilemap, ((data & 0xf) ^ 8) << 4); + state->m_bg_tilemap->set_palette_offset(((data & 0xf) ^ 8) << 4); if (state->m_bg_tile_offset != ((data & 0x20) << 3)) { state->m_bg_tile_offset = (data & 0x20) << 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } // other bits unknown @@ -607,7 +607,7 @@ if (state->m_tx_tile_offset != ((data & 0x40) << 2)) { state->m_tx_tile_offset = (data & 0x40) << 2; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } state->m_bg_scrolly = (state->m_bg_scrolly & 0xff) | ((data & 0x10) << 4); @@ -620,11 +620,11 @@ { snk_state *state = space->machine().driver_data(); - tilemap_set_palette_offset(state->m_bg_tilemap, ((data & 0xf) ^ 8) << 4); + state->m_bg_tilemap->set_palette_offset(((data & 0xf) ^ 8) << 4); if (state->m_bg_tile_offset != ((data & 0x30) << 4)) { state->m_bg_tile_offset = (data & 0x30) << 4; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -661,11 +661,11 @@ data != 0xaa) // victroad spurious during boot popmessage("attrs %02x contact MAMEDEV", data); - tilemap_set_palette_offset(state->m_tx_tilemap, (data & 0x01) << 4); + state->m_tx_tilemap->set_palette_offset((data & 0x01) << 4); if (state->m_tx_tile_offset != ((data & 0x10) << 4)) { state->m_tx_tile_offset = (data & 0x10) << 4; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } } @@ -673,15 +673,15 @@ { snk_state *state = space->machine().driver_data(); - tilemap_set_palette_offset(state->m_tx_tilemap, (data & 0xf) << 4); + state->m_tx_tilemap->set_palette_offset((data & 0xf) << 4); if (state->m_tx_tile_offset != ((data & 0x30) << 4)) { state->m_tx_tile_offset = (data & 0x30) << 4; - tilemap_mark_all_tiles_dirty(state->m_tx_tilemap); + state->m_tx_tilemap->mark_all_dirty(); } if (state->m_is_psychos) - tilemap_set_palette_offset(state->m_bg_tilemap, (data & 0x80)); + state->m_bg_tilemap->set_palette_offset((data & 0x80)); } WRITE8_HANDLER( gwar_videoattrs_w ) @@ -744,7 +744,7 @@ /**************************************************************************************/ -static void marvins_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void marvins_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int scrollx, const int scrolly, const int from, const int to) { snk_state *state = machine.driver_data(); @@ -789,7 +789,7 @@ } -static void tnk3_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const int xscroll, const int yscroll) +static void tnk3_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int xscroll, const int yscroll) { snk_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -854,7 +854,7 @@ } -static void ikari_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void ikari_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int start, const int xscroll, const int yscroll, const UINT8 *source, const int gfxnum ) { snk_state *state = machine.driver_data(); @@ -926,7 +926,7 @@ -xx-x--- (bank number) x------- (x offset bit8) */ -static void tdfever_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void tdfever_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const int xscroll, const int yscroll, const UINT8 *source, const int gfxnum, const int hw_xflip, const int from, const int to ) { snk_state *state = machine.driver_data(); @@ -990,89 +990,89 @@ /**************************************************************/ -SCREEN_UPDATE( marvins ) +SCREEN_UPDATE_IND16( marvins ) { - snk_state *state = screen->machine().driver_data(); + snk_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fg_scrollx); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fg_scrolly); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - marvins_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, 0, state->m_sprite_split_point>>2); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - marvins_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_sprite_split_point>>2, 25); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); + state->m_fg_tilemap->set_scrollx(0, state->m_fg_scrollx); + state->m_fg_tilemap->set_scrolly(0, state->m_fg_scrolly); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + marvins_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, 0, state->m_sprite_split_point>>2); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + marvins_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_sprite_split_point>>2, 25); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( tnk3 ) +SCREEN_UPDATE_IND16( tnk3 ) { - snk_state *state = screen->machine().driver_data(); + snk_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tnk3_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + tnk3_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( ikari ) +SCREEN_UPDATE_IND16( ikari ) { - snk_state *state = screen->machine().driver_data(); + snk_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - ikari_draw_sprites(screen->machine(), bitmap, cliprect, 0, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2 ); - ikari_draw_sprites(screen->machine(), bitmap, cliprect, 0, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 3 ); - ikari_draw_sprites(screen->machine(), bitmap, cliprect, 25, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2 ); + ikari_draw_sprites(screen.machine(), bitmap, cliprect, 0, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2 ); + ikari_draw_sprites(screen.machine(), bitmap, cliprect, 0, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 3 ); + ikari_draw_sprites(screen.machine(), bitmap, cliprect, 25, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2 ); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( gwar ) +SCREEN_UPDATE_IND16( gwar ) { - snk_state *state = screen->machine().driver_data(); + snk_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tdfever_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2, 0, 0, state->m_sprite_split_point ); - tdfever_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 3, 0, 0, 32 ); - tdfever_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2, 0, state->m_sprite_split_point, 64 ); + tdfever_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2, 0, 0, state->m_sprite_split_point ); + tdfever_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 3, 0, 0, 32 ); + tdfever_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp16_scrollx, state->m_sp16_scrolly, state->m_spriteram + 0x800, 2, 0, state->m_sprite_split_point, 64 ); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( tdfever ) +SCREEN_UPDATE_IND16( tdfever ) { - snk_state *state = screen->machine().driver_data(); + snk_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bg_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bg_scrolly); + state->m_bg_tilemap->set_scrollx(0, state->m_bg_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_bg_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - tdfever_draw_sprites(screen->machine(), bitmap, cliprect, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 2, 1, 0, 32 ); + tdfever_draw_sprites(screen.machine(), bitmap, cliprect, state->m_sp32_scrollx, state->m_sp32_scrolly, state->m_spriteram, 2, 1, 0, 32 ); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/snookr10.c mame-0.145/src/mame/video/snookr10.c --- mame-0.144/src/mame/video/snookr10.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/snookr10.c 2012-02-06 21:30:33.000000000 +0000 @@ -46,14 +46,14 @@ { snookr10_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( snookr10_colorram_w ) { snookr10_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -187,9 +187,9 @@ state->m_bg_tilemap = tilemap_create(machine, apple10_get_bg_tile_info, tilemap_scan_rows, 4, 8, 128, 30); } -SCREEN_UPDATE( snookr10 ) +SCREEN_UPDATE_IND16( snookr10 ) { - snookr10_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + snookr10_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/solomon.c mame-0.145/src/mame/video/solomon.c --- mame-0.144/src/mame/video/solomon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/solomon.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,7 +6,7 @@ solomon_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( solomon_colorram_w ) @@ -14,7 +14,7 @@ solomon_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( solomon_videoram2_w ) @@ -22,7 +22,7 @@ solomon_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( solomon_colorram2_w ) @@ -30,7 +30,7 @@ solomon_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( solomon_flipscreen_w ) @@ -38,7 +38,7 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -73,10 +73,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { solomon_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -107,11 +107,11 @@ } } -SCREEN_UPDATE( solomon ) +SCREEN_UPDATE_IND16( solomon ) { - solomon_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + solomon_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sonson.c mame-0.145/src/mame/video/sonson.c --- mame-0.144/src/mame/video/sonson.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sonson.c 2012-02-06 21:30:31.000000000 +0000 @@ -98,14 +98,14 @@ { sonson_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sonson_colorram_w ) { sonson_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( sonson_scrollx_w ) @@ -114,7 +114,7 @@ int row; for (row = 5; row < 32; row++) - tilemap_set_scrollx(state->m_bg_tilemap, row, data); + state->m_bg_tilemap->set_scrollx(row, data); } WRITE8_HANDLER( sonson_flipscreen_w ) @@ -137,10 +137,10 @@ sonson_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { sonson_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -175,10 +175,10 @@ } } -SCREEN_UPDATE( sonson ) +SCREEN_UPDATE_IND16( sonson ) { - sonson_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + sonson_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/spacefb.c mame-0.145/src/mame/video/spacefb.c --- mame-0.144/src/mame/video/spacefb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/spacefb.c 2012-02-06 21:30:31.000000000 +0000 @@ -138,7 +138,7 @@ } -static void draw_starfield(screen_device &screen, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_starfield(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { spacefb_state *state = screen.machine().driver_data(); int y; @@ -147,7 +147,7 @@ get_starfield_pens(state, pens); /* the shift register is always shifting -- do the portion in the top VBLANK */ - if (cliprect->min_y == screen.visible_area().min_y) + if (cliprect.min_y == screen.visible_area().min_y) { int i; @@ -159,22 +159,22 @@ } /* visible region of the screen */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int x; for (x = SPACEFB_HBEND; x < SPACEFB_HBSTART; x++) { - if (state->m_object_present_map[(y * bitmap->width) + x] == 0) + if (state->m_object_present_map[(y * bitmap.width()) + x] == 0) { /* draw the star - the 4 possible values come from the effect of the two XOR gates */ if (((state->m_star_shift_reg & 0x1c0ff) == 0x0c0b7) || ((state->m_star_shift_reg & 0x1c0ff) == 0x0c0d7) || ((state->m_star_shift_reg & 0x1c0ff) == 0x0c0bb) || ((state->m_star_shift_reg & 0x1c0ff) == 0x0c0db)) - *BITMAP_ADDR32(bitmap, y, x) = pens[(state->m_star_shift_reg >> 8) & 0x3f]; + bitmap.pix32(y, x) = pens[(state->m_star_shift_reg >> 8) & 0x3f]; else - *BITMAP_ADDR32(bitmap, y, x) = pens[0]; + bitmap.pix32(y, x) = pens[0]; } shift_star_generator(state); @@ -182,7 +182,7 @@ } /* do the shifting in the bottom VBLANK */ - if (cliprect->max_y == screen.visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { int i; int clock_count = (SPACEFB_HBSTART - SPACEFB_HBEND) * (SPACEFB_VTOTAL - SPACEFB_VBSTART); @@ -248,7 +248,7 @@ } -static void draw_bullet(running_machine &machine, offs_t offs, pen_t pen, bitmap_t *bitmap, const rectangle *cliprect, int flip) +static void draw_bullet(running_machine &machine, offs_t offs, pen_t pen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flip) { spacefb_state *state = machine.driver_data(); UINT8 sy; @@ -270,7 +270,7 @@ else dy = y; - if ((dy > cliprect->min_y) && (dy < cliprect->max_y)) + if ((dy > cliprect.min_y) && (dy < cliprect.max_y)) { for (sx = 0; sx < 4; sx++) { @@ -283,11 +283,11 @@ else dx = x * 2; - *BITMAP_ADDR32(bitmap, dy, dx + 0) = pen; - *BITMAP_ADDR32(bitmap, dy, dx + 1) = pen; + bitmap.pix32(dy, dx + 0) = pen; + bitmap.pix32(dy, dx + 1) = pen; - state->m_object_present_map[(dy * bitmap->width) + dx + 0] = 1; - state->m_object_present_map[(dy * bitmap->width) + dx + 1] = 1; + state->m_object_present_map[(dy * bitmap.width()) + dx + 0] = 1; + state->m_object_present_map[(dy * bitmap.width()) + dx + 1] = 1; } x = x + 1; @@ -300,7 +300,7 @@ } -static void draw_sprite(running_machine &machine, offs_t offs, pen_t *pens, bitmap_t *bitmap, const rectangle *cliprect, int flip) +static void draw_sprite(running_machine &machine, offs_t offs, pen_t *pens, bitmap_rgb32 &bitmap, const rectangle &cliprect, int flip) { spacefb_state *state = machine.driver_data(); UINT8 sy; @@ -325,7 +325,7 @@ else dy = y; - if ((dy > cliprect->min_y) && (dy < cliprect->max_y)) + if ((dy > cliprect.min_y) && (dy < cliprect.max_y)) { for (sx = 0; sx < 8; sx++) { @@ -341,11 +341,11 @@ data = ((data1 << 1) & 0x02) | (data2 & 0x01); pen = pens[color_base | data]; - *BITMAP_ADDR32(bitmap, dy, dx + 0) = pen; - *BITMAP_ADDR32(bitmap, dy, dx + 1) = pen; + bitmap.pix32(dy, dx + 0) = pen; + bitmap.pix32(dy, dx + 1) = pen; - state->m_object_present_map[(dy * bitmap->width) + dx + 0] = (data != 0); - state->m_object_present_map[(dy * bitmap->width) + dx + 1] = (data != 0); + state->m_object_present_map[(dy * bitmap.width()) + dx + 0] = (data != 0); + state->m_object_present_map[(dy * bitmap.width()) + dx + 1] = (data != 0); x = x + 1; data1 = data1 >> 1; @@ -358,7 +358,7 @@ } -static void draw_objects(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_objects(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { spacefb_state *state = machine.driver_data(); pen_t sprite_pens[NUM_SPRITE_PENS]; @@ -372,7 +372,7 @@ get_sprite_pens(machine, sprite_pens); - memset(state->m_object_present_map, 0, bitmap->width * bitmap->height); + memset(state->m_object_present_map, 0, bitmap.width() * bitmap.height()); while (1) { @@ -397,10 +397,10 @@ * *************************************/ -SCREEN_UPDATE( spacefb ) +SCREEN_UPDATE_RGB32( spacefb ) { - draw_objects(screen->machine(), bitmap, cliprect); - draw_starfield(*screen, bitmap, cliprect); + draw_objects(screen.machine(), bitmap, cliprect); + draw_starfield(screen, bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/spbactn.c mame-0.145/src/mame/video/spbactn.c --- mame-0.144/src/mame/video/spbactn.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/spbactn.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,19 +6,19 @@ static void blendbitmaps(running_machine &machine, - bitmap_t *dest,bitmap_t *src1,bitmap_t *src2, - const rectangle *cliprect) + bitmap_rgb32 &dest,bitmap_ind16 &src1,bitmap_ind16 &src2, + const rectangle &cliprect) { int y,x; const pen_t *paldata = machine.pens; - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dd = BITMAP_ADDR32(dest, y, 0); - UINT16 *sd1 = BITMAP_ADDR16(src1, y, 0); - UINT16 *sd2 = BITMAP_ADDR16(src2, y, 0); + UINT32 *dd = &dest.pix32(y); + UINT16 *sd1 = &src1.pix16(y); + UINT16 *sd2 = &src2.pix16(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { if (sd2[x]) { @@ -35,7 +35,7 @@ /* from gals pinball (which was in turn from ninja gaiden) */ -static int draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static int draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { static const UINT8 layout[8][8] = { @@ -111,19 +111,16 @@ spbactn_state *state = machine.driver_data(); /* allocate bitmaps */ - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); - - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); } -SCREEN_UPDATE( spbactn ) +SCREEN_UPDATE_RGB32( spbactn ) { - spbactn_state *state = screen->machine().driver_data(); + spbactn_state *state = screen.machine().driver_data(); int offs, sx, sy; - bitmap_fill(state->m_tile_bitmap_fg, cliprect, 0); + state->m_tile_bitmap_fg.fill(0, cliprect); /* draw table bg gfx */ for (sx = sy = offs = 0; offs < 0x4000 / 2; offs++) @@ -135,9 +132,9 @@ color = ((attr & 0x00f0) >> 4) | 0x80; - drawgfx_transpen_raw(state->m_tile_bitmap_bg, cliprect, screen->machine().gfx[1], + drawgfx_transpen_raw(state->m_tile_bitmap_bg, cliprect, screen.machine().gfx[1], code, - screen->machine().gfx[1]->color_base + color * screen->machine().gfx[1]->color_granularity, + screen.machine().gfx[1]->color_base + color * screen.machine().gfx[1]->color_granularity, 0, 0, 16 * sx, 8 * sy, (UINT32)-1); @@ -150,7 +147,7 @@ } } - if (draw_sprites(screen->machine(), state->m_tile_bitmap_bg, cliprect, 0)) + if (draw_sprites(screen.machine(), state->m_tile_bitmap_bg, cliprect, 0)) { /* kludge: draw table bg gfx again if priority 0 sprites are enabled */ for (sx = sy = offs = 0; offs < 0x4000 / 2; offs++) @@ -162,9 +159,9 @@ color = ((attr & 0x00f0) >> 4) | 0x80; - drawgfx_transpen_raw(state->m_tile_bitmap_bg, cliprect, screen->machine().gfx[1], + drawgfx_transpen_raw(state->m_tile_bitmap_bg, cliprect, screen.machine().gfx[1], code, - screen->machine().gfx[1]->color_base + color * screen->machine().gfx[1]->color_granularity, + screen.machine().gfx[1]->color_base + color * screen.machine().gfx[1]->color_granularity, 0, 0, 16 * sx, 8 * sy, 0); @@ -178,7 +175,7 @@ } } - draw_sprites(screen->machine(), state->m_tile_bitmap_bg, cliprect, 1); + draw_sprites(screen.machine(), state->m_tile_bitmap_bg, cliprect, 1); /* draw table fg gfx */ for (sx = sy = offs = 0; offs < 0x4000 / 2; offs++) @@ -196,9 +193,9 @@ else color |= 0x0080; - drawgfx_transpen_raw(state->m_tile_bitmap_fg, cliprect, screen->machine().gfx[0], + drawgfx_transpen_raw(state->m_tile_bitmap_fg, cliprect, screen.machine().gfx[0], code, - screen->machine().gfx[0]->color_base + color * screen->machine().gfx[0]->color_granularity, + screen.machine().gfx[0]->color_base + color * screen.machine().gfx[0]->color_granularity, 0, 0, 16 * sx, 8 * sy, 0); @@ -211,10 +208,10 @@ } } - draw_sprites(screen->machine(), state->m_tile_bitmap_fg, cliprect, 2); - draw_sprites(screen->machine(), state->m_tile_bitmap_fg, cliprect, 3); + draw_sprites(screen.machine(), state->m_tile_bitmap_fg, cliprect, 2); + draw_sprites(screen.machine(), state->m_tile_bitmap_fg, cliprect, 3); /* mix & blend the tilemaps and sprites into a 32-bit bitmap */ - blendbitmaps(screen->machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, cliprect); + blendbitmaps(screen.machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/spcforce.c mame-0.145/src/mame/video/spcforce.c --- mame-0.144/src/mame/video/spcforce.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/spcforce.c 2012-02-06 21:30:32.000000000 +0000 @@ -16,14 +16,14 @@ } -SCREEN_UPDATE( spcforce ) +SCREEN_UPDATE_IND16( spcforce ) { - spcforce_state *state = screen->machine().driver_data(); + spcforce_state *state = screen.machine().driver_data(); int offs; - int flip = flip_screen_get(screen->machine()); + int flip = flip_screen_get(screen.machine()); /* draw the characters as sprites because they could be overlapping */ - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); for (offs = 0; offs < 0x400; offs++) { int code,sx,sy,col; @@ -40,7 +40,7 @@ sy = 248 - sy; } - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], code, col, flip, flip, sx, sy,0); diff -Nru mame-0.144/src/mame/video/spdodgeb.c mame-0.145/src/mame/video/spdodgeb.c --- mame-0.144/src/mame/video/spdodgeb.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/spdodgeb.c 2012-02-06 21:30:31.000000000 +0000 @@ -1,5 +1,4 @@ #include "emu.h" -#include "deprecat.h" #include "cpu/m6502/m6502.h" #include "includes/spdodgeb.h" @@ -84,20 +83,20 @@ ***************************************************************************/ -INTERRUPT_GEN( spdodgeb_interrupt ) +TIMER_DEVICE_CALLBACK( spdodgeb_interrupt ) { - int iloop = cpu_getiloops(device); - int scanline = (32-iloop) * 8; + spdodgeb_state *state = timer.machine().driver_data(); + int scanline = param; - if (iloop > 1 && iloop < 32) + if (scanline == 256) { - device_set_input_line(device, M6502_IRQ_LINE, HOLD_LINE); - device->machine().primary_screen->update_partial(scanline+7); + device_set_input_line(state->m_maincpu, INPUT_LINE_NMI, PULSE_LINE); + timer.machine().primary_screen->update_partial(256); } - else if (!iloop) + else if ((scanline % 8) == 0) { - device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); - device->machine().primary_screen->update_partial(256); + device_set_input_line(state->m_maincpu, M6502_IRQ_LINE, HOLD_LINE); + timer.machine().primary_screen->update_partial(scanline+16); /* TODO: pretty off ... */ } } @@ -127,7 +126,7 @@ if (state->m_tile_palbank != ((data & 0x30) >> 4)) { state->m_tile_palbank = ((data & 0x30) >> 4); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } state->m_sprite_palbank = (data & 0xc0) >> 6; } @@ -136,7 +135,7 @@ { spdodgeb_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } @@ -151,7 +150,7 @@ cliprect,gfx, \ (which+order),color+ 8 * state->m_sprite_palbank,flipx,flipy,sx,sy,0); -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { spdodgeb_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -209,11 +208,11 @@ #undef DRAW_SPRITE -SCREEN_UPDATE( spdodgeb ) +SCREEN_UPDATE_IND16( spdodgeb ) { - spdodgeb_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_lastscroll+5); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + spdodgeb_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_lastscroll+5); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/speedatk.c mame-0.145/src/mame/video/speedatk.c --- mame-0.144/src/mame/video/speedatk.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/speedatk.c 2012-02-06 21:30:32.000000000 +0000 @@ -87,15 +87,15 @@ } } -SCREEN_UPDATE( speedatk ) +SCREEN_UPDATE_IND16( speedatk ) { - speedatk_state *state = screen->machine().driver_data(); + speedatk_state *state = screen.machine().driver_data(); int x,y; int count; UINT16 tile; UINT8 color, region; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); count = (state->m_crtc_vreg[0x0c]<<8)|(state->m_crtc_vreg[0x0d] & 0xff); @@ -109,7 +109,7 @@ color = state->m_colorram[count] & 0x1f; region = (state->m_colorram[count] & 0x10) >> 4; - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[region],tile,color,state->m_flip_scr,state->m_flip_scr,x*8,y*8); + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[region],tile,color,state->m_flip_scr,state->m_flip_scr,x*8,y*8); count = (state->m_flip_scr) ? count-1 : count+1; count&=0x3ff; diff -Nru mame-0.144/src/mame/video/speedbal.c mame-0.145/src/mame/video/speedbal.c --- mame-0.144/src/mame/video/speedbal.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/speedbal.c 2012-02-06 21:30:32.000000000 +0000 @@ -17,7 +17,7 @@ int color = state->m_background_videoram[tile_index*2+1] & 0x0f; SET_TILE_INFO(1, code, color, 0); - tileinfo->group = (color == 8); + tileinfo.group = (color == 8); } static TILE_GET_INFO( get_tile_info_fg ) @@ -27,7 +27,7 @@ int color = state->m_foreground_videoram[tile_index*2+1] & 0x0f; SET_TILE_INFO(0, code, color, 0); - tileinfo->group = (color == 9); + tileinfo.group = (color == 9); } /************************************* @@ -42,11 +42,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info_bg, tilemap_scan_cols_flip_x, 16, 16, 16, 16); state->m_fg_tilemap = tilemap_create(machine, get_tile_info_fg, tilemap_scan_cols_flip_x, 8, 8, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap,1,0x00f7,0x0000); /* split type 1 has pen 0-2, 4-7 transparent in front half */ + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1,0x00f7,0x0000); /* split type 1 has pen 0-2, 4-7 transparent in front half */ - tilemap_set_transmask(state->m_fg_tilemap,0,0xffff,0x0001); /* split type 0 is totally transparent in front half and has pen 0 transparent in back half */ - tilemap_set_transmask(state->m_fg_tilemap,1,0x0001,0x0001); /* split type 1 has pen 0 transparent in front and back half */ + state->m_fg_tilemap->set_transmask(0,0xffff,0x0001); /* split type 0 is totally transparent in front half and has pen 0 transparent in back half */ + state->m_fg_tilemap->set_transmask(1,0x0001,0x0001); /* split type 1 has pen 0 transparent in front and back half */ } @@ -61,7 +61,7 @@ { speedbal_state *state = space->machine().driver_data(); state->m_foreground_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset>>1); + state->m_fg_tilemap->mark_tile_dirty(offset>>1); } /************************************* @@ -74,7 +74,7 @@ { speedbal_state *state = space->machine().driver_data(); state->m_background_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset>>1); + state->m_bg_tilemap->mark_tile_dirty(offset>>1); } @@ -84,7 +84,7 @@ * * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { speedbal_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -127,13 +127,13 @@ * * *************************************/ -SCREEN_UPDATE( speedbal ) +SCREEN_UPDATE_IND16( speedbal ) { - speedbal_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, TILEMAP_DRAW_LAYER0, 0); + speedbal_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/speedspn.c mame-0.145/src/mame/video/speedspn.c --- mame-0.144/src/mame/video/speedspn.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/speedspn.c 2012-02-06 21:30:32.000000000 +0000 @@ -26,7 +26,7 @@ state->m_vidram[offset + state->m_bank_vidram] = data; if (state->m_bank_vidram == 0) - tilemap_mark_tile_dirty(state->m_tilemap,offset/2); + state->m_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( speedspn_attram_w ) @@ -34,7 +34,7 @@ speedspn_state *state = space->machine().driver_data(); state->m_attram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset^0x400); + state->m_tilemap->mark_tile_dirty(offset^0x400); } READ8_HANDLER( speedspn_vidram_r ) @@ -59,7 +59,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { speedspn_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -93,12 +93,12 @@ } -SCREEN_UPDATE(speedspn) +SCREEN_UPDATE_IND16(speedspn) { - speedspn_state *state = screen->machine().driver_data(); + speedspn_state *state = screen.machine().driver_data(); if (state->m_display_disable) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -110,8 +110,8 @@ fclose(f); } #endif - tilemap_set_scrollx(state->m_tilemap,0, 0x100); // verify - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_tilemap->set_scrollx(0, 0x100); // verify + state->m_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/splash.c mame-0.145/src/mame/video/splash.c --- mame-0.144/src/mame/video/splash.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/splash.c 2012-02-06 21:30:31.000000000 +0000 @@ -77,10 +77,10 @@ splash_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap[offset >> 11],((offset << 1) & 0x0fff) >> 1); + state->m_bg_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 1); } -static void draw_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bitmap(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { splash_state *state = machine.driver_data(); int sx,sy,color,count,colxor,bitswap; @@ -156,8 +156,8 @@ break; } - if (sy >= cliprect->min_y && sy <= cliprect->max_y && sx-9 >= cliprect->min_x && sx-9 <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, sy, sx-9) = 0x300+(color^colxor); + if (sy >= cliprect.min_y && sy <= cliprect.max_y && sx-9 >= cliprect.min_x && sx-9 <= cliprect.max_x) + bitmap.pix16(sy, sx-9) = 0x300+(color^colxor); } } @@ -175,10 +175,10 @@ state->m_bg_tilemap[0] = tilemap_create(machine, get_tile_info_splash_tilemap0, tilemap_scan_rows, 8, 8, 64, 32); state->m_bg_tilemap[1] = tilemap_create(machine, get_tile_info_splash_tilemap1, tilemap_scan_rows, 16, 16, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_bg_tilemap[1], 0); + state->m_bg_tilemap[0]->set_transparent_pen(0); + state->m_bg_tilemap[1]->set_transparent_pen(0); - tilemap_set_scrollx(state->m_bg_tilemap[0], 0, 4); + state->m_bg_tilemap[0]->set_scrollx(0, 4); } /*************************************************************************** @@ -210,7 +210,7 @@ 400| xxxxxxxx -------- | unused */ -static void splash_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void splash_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { splash_state *state = machine.driver_data(); int i; @@ -231,7 +231,7 @@ } } -static void funystrp_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void funystrp_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { splash_state *state = machine.driver_data(); int i; @@ -258,35 +258,35 @@ ***************************************************************************/ -SCREEN_UPDATE( splash ) +SCREEN_UPDATE_IND16( splash ) { - splash_state *state = screen->machine().driver_data(); + splash_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_vregs[0]); - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_vregs[1]); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_vregs[0]); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_vregs[1]); - draw_bitmap(screen->machine(), bitmap, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], 0, 0); - splash_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], 0, 0); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 0, 0); + splash_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( funystrp ) +SCREEN_UPDATE_IND16( funystrp ) { - splash_state *state = screen->machine().driver_data(); + splash_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_bg_tilemap[0], 0, state->m_vregs[0]); - tilemap_set_scrolly(state->m_bg_tilemap[1], 0, state->m_vregs[1]); + state->m_bg_tilemap[0]->set_scrolly(0, state->m_vregs[0]); + state->m_bg_tilemap[1]->set_scrolly(0, state->m_vregs[1]); - draw_bitmap(screen->machine(), bitmap, cliprect); + draw_bitmap(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[1], 0, 0); + state->m_bg_tilemap[1]->draw(bitmap, cliprect, 0, 0); /*Sprite chip is similar but not the same*/ - funystrp_draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap[0], 0, 0); + funystrp_draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap[0]->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/sprcros2.c mame-0.145/src/mame/video/sprcros2.c --- mame-0.144/src/mame/video/sprcros2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sprcros2.c 2012-02-06 21:30:31.000000000 +0000 @@ -64,7 +64,7 @@ sprcros2_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fgtilemap, offset&0x3ff); + state->m_fgtilemap->mark_tile_dirty(offset&0x3ff); } WRITE8_HANDLER( sprcros2_bgvideoram_w ) @@ -72,7 +72,7 @@ sprcros2_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bgtilemap, offset&0x3ff); + state->m_bgtilemap->mark_tile_dirty(offset&0x3ff); } WRITE8_HANDLER( sprcros2_bgscrollx_w ) @@ -80,16 +80,16 @@ sprcros2_state *state = space->machine().driver_data(); if(state->m_port7&0x02) - tilemap_set_scrollx(state->m_bgtilemap, 0, 0x100-data); + state->m_bgtilemap->set_scrollx(0, 0x100-data); else - tilemap_set_scrollx(state->m_bgtilemap, 0, data); + state->m_bgtilemap->set_scrollx(0, data); } WRITE8_HANDLER( sprcros2_bgscrolly_w ) { sprcros2_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bgtilemap, 0, data); + state->m_bgtilemap->set_scrolly(0, data); } static TILE_GET_INFO( get_sprcros2_bgtile_info ) @@ -120,7 +120,7 @@ UINT8 attr = state->m_fgvideoram[tile_index + 0x400]; int color = (attr&0xfc)>>2; - tileinfo->group = color; + tileinfo.group = color; //attr //76543210 @@ -146,7 +146,7 @@ colortable_configure_tilemap_groups(machine.colortable, state->m_fgtilemap, machine.gfx[2], 0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { sprcros2_state *state = machine.driver_data(); int offs,sx,sy,color,flipx,flipy; @@ -194,12 +194,12 @@ } } -SCREEN_UPDATE( sprcros2 ) +SCREEN_UPDATE_IND16( sprcros2 ) { - sprcros2_state *state = screen->machine().driver_data(); + sprcros2_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bgtilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fgtilemap, 0, 0); + state->m_bgtilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fgtilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/sprint2.c mame-0.145/src/mame/video/sprint2.c --- mame-0.144/src/mame/video/sprint2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sprint2.c 2012-02-06 21:30:32.000000000 +0000 @@ -46,7 +46,7 @@ VIDEO_START( sprint2 ) { sprint2_state *state = machine.driver_data(); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 16, 8, 32, 32); } @@ -80,21 +80,21 @@ { sprint2_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } -static UINT8 collision_check(sprint2_state *state, colortable_t *colortable, rectangle* rect) +static UINT8 collision_check(sprint2_state *state, colortable_t *colortable, rectangle& rect) { UINT8 data = 0; int x; int y; - for (y = rect->min_y; y <= rect->max_y; y++) - for (x = rect->min_x; x <= rect->max_x; x++) + for (y = rect.min_y; y <= rect.max_y; y++) + for (x = rect.min_x; x <= rect.max_x; x++) { - UINT16 a = colortable_entry_get_value(colortable, *BITMAP_ADDR16(state->m_helper, y, x)); + UINT16 a = colortable_entry_get_value(colortable, state->m_helper.pix16(y, x)); if (a == 0) data |= 0x40; @@ -121,19 +121,19 @@ } -SCREEN_UPDATE( sprint2 ) +SCREEN_UPDATE_IND16( sprint2 ) { - sprint2_state *state = screen->machine().driver_data(); + sprint2_state *state = screen.machine().driver_data(); UINT8 *video_ram = state->m_video_ram; int i; - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (i = 0; i < 4; i++) { - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], get_sprite_code(video_ram, i), i, 0, 0, @@ -144,73 +144,70 @@ } -SCREEN_EOF( sprint2 ) +SCREEN_VBLANK( sprint2 ) { - sprint2_state *state = machine.driver_data(); - UINT8 *video_ram = state->m_video_ram; - int i; - int j; - const rectangle &visarea = machine.primary_screen->visible_area(); - - /* - * Collisions are detected for both player cars: - * - * D7 => state->m_collision w/ white playfield - * D6 => state->m_collision w/ black playfield or another car - * - */ - - for (i = 0; i < 2; i++) + // rising edge + if (vblank_on) { - rectangle rect; + sprint2_state *state = screen.machine().driver_data(); + UINT8 *video_ram = state->m_video_ram; + int i; + int j; + const rectangle &visarea = screen.machine().primary_screen->visible_area(); + + /* + * Collisions are detected for both player cars: + * + * D7 => state->m_collision w/ white playfield + * D6 => state->m_collision w/ black playfield or another car + * + */ - rect.min_x = get_sprite_x(video_ram, i); - rect.min_y = get_sprite_y(video_ram, i); - rect.max_x = get_sprite_x(video_ram, i) + machine.gfx[1]->width - 1; - rect.max_y = get_sprite_y(video_ram, i) + machine.gfx[1]->height - 1; - - if (rect.min_x < visarea.min_x) - rect.min_x = visarea.min_x; - if (rect.min_y < visarea.min_y) - rect.min_y = visarea.min_y; - if (rect.max_x > visarea.max_x) - rect.max_x = visarea.max_x; - if (rect.max_y > visarea.max_y) - rect.max_y = visarea.max_y; - - /* check for sprite-tilemap collisions */ - - tilemap_draw(state->m_helper, &rect, state->m_bg_tilemap, 0, 0); - - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], - get_sprite_code(video_ram, i), - 0, - 0, 0, - get_sprite_x(video_ram, i), - get_sprite_y(video_ram, i), 1); - - state->m_collision[i] |= collision_check(state, machine.colortable, &rect); - - /* check for sprite-sprite collisions */ + for (i = 0; i < 2; i++) + { + rectangle rect; - for (j = 0; j < 4; j++) - if (j != i) - { - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], - get_sprite_code(video_ram, j), - 1, - 0, 0, - get_sprite_x(video_ram, j), - get_sprite_y(video_ram, j), 0); - } + rect.min_x = get_sprite_x(video_ram, i); + rect.min_y = get_sprite_y(video_ram, i); + rect.max_x = get_sprite_x(video_ram, i) + screen.machine().gfx[1]->width - 1; + rect.max_y = get_sprite_y(video_ram, i) + screen.machine().gfx[1]->height - 1; + + rect &= visarea; + + /* check for sprite-tilemap collisions */ + + state->m_bg_tilemap->draw(state->m_helper, rect, 0, 0); + + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], + get_sprite_code(video_ram, i), + 0, + 0, 0, + get_sprite_x(video_ram, i), + get_sprite_y(video_ram, i), 1); + + state->m_collision[i] |= collision_check(state, screen.machine().colortable, rect); + + /* check for sprite-sprite collisions */ + + for (j = 0; j < 4; j++) + if (j != i) + { + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], + get_sprite_code(video_ram, j), + 1, + 0, 0, + get_sprite_x(video_ram, j), + get_sprite_y(video_ram, j), 0); + } + + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], + get_sprite_code(video_ram, i), + 0, + 0, 0, + get_sprite_x(video_ram, i), + get_sprite_y(video_ram, i), 1); - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], - get_sprite_code(video_ram, i), - 0, - 0, 0, - get_sprite_x(video_ram, i), - get_sprite_y(video_ram, i), 1); - - state->m_collision[i] |= collision_check(state, machine.colortable, &rect); + state->m_collision[i] |= collision_check(state, screen.machine().colortable, rect); + } } } diff -Nru mame-0.144/src/mame/video/sprint4.c mame-0.145/src/mame/video/sprint4.c --- mame-0.144/src/mame/video/sprint4.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sprint4.c 2012-02-06 21:30:32.000000000 +0000 @@ -51,19 +51,19 @@ VIDEO_START( sprint4 ) { sprint4_state *state = machine.driver_data(); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); state->m_playfield = tilemap_create(machine, sprint4_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -SCREEN_UPDATE( sprint4 ) +SCREEN_UPDATE_IND16( sprint4 ) { - sprint4_state *state = screen->machine().driver_data(); + sprint4_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int i; - tilemap_draw(bitmap, cliprect, state->m_playfield, 0, 0); + state->m_playfield->draw(bitmap, cliprect, 0, 0); for (i = 0; i < 4; i++) { @@ -77,7 +77,7 @@ if (i & 1) bank = 32; - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], (code >> 3) | bank, (attr & 0x80) ? 4 : i, 0, 0, @@ -88,60 +88,64 @@ } -SCREEN_EOF( sprint4 ) +SCREEN_VBLANK( sprint4 ) { - sprint4_state *state = machine.driver_data(); - UINT8 *videoram = state->m_videoram; - int i; + // rising edge + if (vblank_on) + { + sprint4_state *state = screen.machine().driver_data(); + UINT8 *videoram = state->m_videoram; + int i; - /* check for sprite-playfield collisions */ + /* check for sprite-playfield collisions */ - device_t *discrete = machine.device("discrete"); + device_t *discrete = screen.machine().device("discrete"); - for (i = 0; i < 4; i++) - { - rectangle rect; + for (i = 0; i < 4; i++) + { + rectangle rect; - int x; - int y; + int x; + int y; - int bank = 0; + int bank = 0; - UINT8 horz = videoram[0x390 + 2 * i + 0]; - UINT8 vert = videoram[0x398 + 2 * i + 0]; - UINT8 code = videoram[0x398 + 2 * i + 1]; + UINT8 horz = videoram[0x390 + 2 * i + 0]; + UINT8 vert = videoram[0x398 + 2 * i + 0]; + UINT8 code = videoram[0x398 + 2 * i + 1]; - rect.min_x = horz - 15; - rect.min_y = vert - 15; - rect.max_x = horz - 15 + machine.gfx[1]->width - 1; - rect.max_y = vert - 15 + machine.gfx[1]->height - 1; + rect.min_x = horz - 15; + rect.min_y = vert - 15; + rect.max_x = horz - 15 + screen.machine().gfx[1]->width - 1; + rect.max_y = vert - 15 + screen.machine().gfx[1]->height - 1; - sect_rect(&rect, &machine.primary_screen->visible_area()); + rect &= screen.machine().primary_screen->visible_area(); - tilemap_draw(state->m_helper, &rect, state->m_playfield, 0, 0); + state->m_playfield->draw(state->m_helper, rect, 0, 0); - if (i & 1) - bank = 32; + if (i & 1) + bank = 32; - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], - (code >> 3) | bank, - 4, - 0, 0, - horz - 15, - vert - 15, 1); + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], + (code >> 3) | bank, + 4, + 0, 0, + horz - 15, + vert - 15, 1); - for (y = rect.min_y; y <= rect.max_y; y++) - for (x = rect.min_x; x <= rect.max_x; x++) - if (colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(state->m_helper, y, x)) != 0) - state->m_collision[i] = 1; - } + for (y = rect.min_y; y <= rect.max_y; y++) + for (x = rect.min_x; x <= rect.max_x; x++) + if (colortable_entry_get_value(screen.machine().colortable, state->m_helper.pix16(y, x)) != 0) + state->m_collision[i] = 1; + } - /* update sound status */ + /* update sound status */ - discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_1, videoram[0x391] & 15); - discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_2, videoram[0x393] & 15); - discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_3, videoram[0x395] & 15); - discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_4, videoram[0x397] & 15); + discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_1, videoram[0x391] & 15); + discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_2, videoram[0x393] & 15); + discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_3, videoram[0x395] & 15); + discrete_sound_w(discrete, SPRINT4_MOTOR_DATA_4, videoram[0x397] & 15); + } } @@ -150,5 +154,5 @@ sprint4_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_playfield, offset); + state->m_playfield->mark_tile_dirty(offset); } diff -Nru mame-0.144/src/mame/video/sprint8.c mame-0.145/src/mame/video/sprint8.c --- mame-0.144/src/mame/video/sprint8.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sprint8.c 2012-02-06 21:30:32.000000000 +0000 @@ -109,26 +109,26 @@ { sprint8_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap1, offset); - tilemap_mark_tile_dirty(state->m_tilemap2, offset); + state->m_tilemap1->mark_tile_dirty(offset); + state->m_tilemap2->mark_tile_dirty(offset); } VIDEO_START( sprint8 ) { sprint8_state *state = machine.driver_data(); - state->m_helper1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper1); + machine.primary_screen->register_screen_bitmap(state->m_helper2); state->m_tilemap1 = tilemap_create(machine, get_tile_info1, tilemap_scan_rows, 16, 8, 32, 32); state->m_tilemap2 = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 16, 8, 32, 32); - tilemap_set_scrolly(state->m_tilemap1, 0, +24); - tilemap_set_scrolly(state->m_tilemap2, 0, +24); + state->m_tilemap1->set_scrolly(0, +24); + state->m_tilemap2->set_scrolly(0, +24); } -static void draw_sprites(running_machine &machine, bitmap_t* bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sprint8_state *state = machine.driver_data(); int i; @@ -158,38 +158,42 @@ } -SCREEN_UPDATE( sprint8 ) +SCREEN_UPDATE_IND16( sprint8 ) { - sprint8_state *state = screen->machine().driver_data(); - set_pens(state, screen->machine().colortable); - tilemap_draw(bitmap, cliprect, state->m_tilemap1, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + sprint8_state *state = screen.machine().driver_data(); + set_pens(state, screen.machine().colortable); + state->m_tilemap1->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( sprint8 ) +SCREEN_VBLANK( sprint8 ) { - sprint8_state *state = machine.driver_data(); - int x; - int y; - const rectangle &visarea = machine.primary_screen->visible_area(); - - tilemap_draw(state->m_helper2, &visarea, state->m_tilemap2, 0, 0); - - bitmap_fill(state->m_helper1, &visarea, 0x20); - - draw_sprites(machine, state->m_helper1, &visarea); - - for (y = visarea.min_y; y <= visarea.max_y; y++) + // rising edge + if (vblank_on) { - const UINT16* p1 = BITMAP_ADDR16(state->m_helper1, y, 0); - const UINT16* p2 = BITMAP_ADDR16(state->m_helper2, y, 0); - - for (x = visarea.min_x; x <= visarea.max_x; x++) - if (p1[x] != 0x20 && p2[x] == 0x23) - machine.scheduler().timer_set(machine.primary_screen->time_until_pos(y + 24, x), - FUNC(sprint8_collision_callback), - colortable_entry_get_value(machine.colortable, p1[x])); + sprint8_state *state = screen.machine().driver_data(); + int x; + int y; + const rectangle &visarea = screen.machine().primary_screen->visible_area(); + + state->m_tilemap2->draw(state->m_helper2, visarea, 0, 0); + + state->m_helper1.fill(0x20, visarea); + + draw_sprites(screen.machine(), state->m_helper1, visarea); + + for (y = visarea.min_y; y <= visarea.max_y; y++) + { + const UINT16* p1 = &state->m_helper1.pix16(y); + const UINT16* p2 = &state->m_helper2.pix16(y); + + for (x = visarea.min_x; x <= visarea.max_x; x++) + if (p1[x] != 0x20 && p2[x] == 0x23) + screen.machine().scheduler().timer_set(screen.machine().primary_screen->time_until_pos(y + 24, x), + FUNC(sprint8_collision_callback), + colortable_entry_get_value(screen.machine().colortable, p1[x])); + } } } diff -Nru mame-0.144/src/mame/video/spy.c mame-0.145/src/mame/video/spy.c --- mame-0.144/src/mame/video/spy.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/spy.c 2012-02-06 21:30:31.000000000 +0000 @@ -62,16 +62,16 @@ ***************************************************************************/ -SCREEN_UPDATE( spy ) +SCREEN_UPDATE_IND16( spy ) { - spy_state *state = screen->machine().driver_data(); + spy_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if (!state->m_video_enable) - bitmap_fill(bitmap, cliprect, 16 * state->m_layer_colorbase[0]); + bitmap.fill(16 * state->m_layer_colorbase[0], cliprect); else { k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 1); diff -Nru mame-0.144/src/mame/video/srmp2.c mame-0.145/src/mame/video/srmp2.c --- mame-0.144/src/mame/video/srmp2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/srmp2.c 2012-02-06 21:30:31.000000000 +0000 @@ -50,53 +50,53 @@ } -SCREEN_UPDATE( srmp2 ) +SCREEN_UPDATE_IND16( srmp2 ) { - srmp2_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x1ff); + srmp2_state *state = screen.machine().driver_data(); + bitmap.fill(0x1ff, cliprect); - screen->machine().device("spritegen")->set_transpen(15); + screen.machine().device("spritegen")->set_transpen(15); - screen->machine().device("spritegen")->set_colorbase((state->m_color_bank)?0x20:0x00); + screen.machine().device("spritegen")->set_colorbase((state->m_color_bank)?0x20:0x00); - screen->machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); - screen->machine().device("spritegen")->set_fg_yoffsets( 0x05, 0x07 ); - screen->machine().device("spritegen")->set_bg_xoffsets( 0x00, 0x00 ); // bg not used? - screen->machine().device("spritegen")->set_bg_yoffsets( 0x00, 0x00 ); // bg not used? + screen.machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); + screen.machine().device("spritegen")->set_fg_yoffsets( 0x05, 0x07 ); + screen.machine().device("spritegen")->set_bg_xoffsets( 0x00, 0x00 ); // bg not used? + screen.machine().device("spritegen")->set_bg_yoffsets( 0x00, 0x00 ); // bg not used? - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,0x1000, 1); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,0x1000, 1); return 0; } -SCREEN_UPDATE( srmp3 ) +SCREEN_UPDATE_IND16( srmp3 ) { - //srmp2_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x1f0); + //srmp2_state *state = screen.machine().driver_data(); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); - screen->machine().device("spritegen")->set_fg_yoffsets( 0x06, 0x06 ); - screen->machine().device("spritegen")->set_bg_xoffsets( -0x01, 0x10 ); - screen->machine().device("spritegen")->set_bg_yoffsets( -0x06, 0x06 ); + screen.machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); + screen.machine().device("spritegen")->set_fg_yoffsets( 0x06, 0x06 ); + screen.machine().device("spritegen")->set_bg_xoffsets( -0x01, 0x10 ); + screen.machine().device("spritegen")->set_bg_yoffsets( -0x06, 0x06 ); - screen->machine().device("spritegen")->set_gfxbank_callback( srmp3_gfxbank_callback ); + screen.machine().device("spritegen")->set_gfxbank_callback( srmp3_gfxbank_callback ); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,0x1000, 1); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,0x1000, 1); return 0; } -SCREEN_UPDATE( mjyuugi ) +SCREEN_UPDATE_IND16( mjyuugi ) { - //srmp2_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap, cliprect, 0x1f0); + //srmp2_state *state = screen.machine().driver_data(); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); - screen->machine().device("spritegen")->set_fg_yoffsets( 0x06, 0x06 ); - screen->machine().device("spritegen")->set_bg_yoffsets( 0x09, 0x07 ); + screen.machine().device("spritegen")->set_fg_xoffsets( 0x10, 0x10 ); + screen.machine().device("spritegen")->set_fg_yoffsets( 0x06, 0x06 ); + screen.machine().device("spritegen")->set_bg_yoffsets( 0x09, 0x07 ); - screen->machine().device("spritegen")->set_spritelimit( 0x1ff-6 ); + screen.machine().device("spritegen")->set_spritelimit( 0x1ff-6 ); - screen->machine().device("spritegen")->set_gfxbank_callback( srmp3_gfxbank_callback ); + screen.machine().device("spritegen")->set_gfxbank_callback( srmp3_gfxbank_callback ); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(),bitmap,cliprect,0x1000, 1); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(),bitmap,cliprect,0x1000, 1); return 0; } diff -Nru mame-0.144/src/mame/video/srumbler.c mame-0.145/src/mame/video/srumbler.c --- mame-0.144/src/mame/video/srumbler.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/srumbler.c 2012-02-06 21:30:32.000000000 +0000 @@ -36,7 +36,7 @@ state->m_backgroundram[2*tile_index + 1] + ((attr & 0x07) << 8), (attr & 0xe0) >> 5, ((attr & 0x08) ? TILE_FLIPY : 0)); - tileinfo->group = (attr & 0x10) >> 4; + tileinfo.group = (attr & 0x10) >> 4; } @@ -53,10 +53,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_cols,8,8,64,32); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_cols, 16,16,64,64); - tilemap_set_transparent_pen(state->m_fg_tilemap,3); + state->m_fg_tilemap->set_transparent_pen(3); - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap,1,0x07ff,0xf800); /* split type 1 has pens 0-10 transparent in front half */ + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1,0x07ff,0xf800); /* split type 1 has pens 0-10 transparent in front half */ } @@ -71,14 +71,14 @@ { srumbler_state *state = space->machine().driver_data(); state->m_foregroundram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset/2); + state->m_fg_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( srumbler_background_w ) { srumbler_state *state = space->machine().driver_data(); state->m_backgroundram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); } @@ -101,8 +101,8 @@ state->m_scroll[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll[0] | (state->m_scroll[1] << 8)); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll[2] | (state->m_scroll[3] << 8)); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll[0] | (state->m_scroll[1] << 8)); + state->m_bg_tilemap->set_scrolly(0,state->m_scroll[2] | (state->m_scroll[3] << 8)); } @@ -113,7 +113,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { UINT8 *buffered_spriteram = machine.generic.buffered_spriteram.u8; int offs; @@ -160,19 +160,23 @@ } -SCREEN_UPDATE( srumbler ) +SCREEN_UPDATE_IND16( srumbler ) { - srumbler_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER1,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_LAYER0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + srumbler_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_EOF( srumbler ) +SCREEN_VBLANK( srumbler ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram_w(space,0,0); + buffer_spriteram_w(space,0,0); + } } diff -Nru mame-0.144/src/mame/video/sshangha.c mame-0.145/src/mame/video/sshangha.c --- mame-0.144/src/mame/video/sshangha.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/sshangha.c 2012-02-06 21:30:32.000000000 +0000 @@ -23,43 +23,43 @@ VIDEO_START( sshangha ) { - machine.device("spritegen1")->alloc_sprite_bitmap(machine); - machine.device("spritegen2")->alloc_sprite_bitmap(machine); + machine.device("spritegen1")->alloc_sprite_bitmap(); + machine.device("spritegen2")->alloc_sprite_bitmap(); } /******************************************************************************/ -SCREEN_UPDATE( sshangha ) +SCREEN_UPDATE_RGB32( sshangha ) { - sshangha_state *state = screen->machine().driver_data(); + sshangha_state *state = screen.machine().driver_data(); - screen->machine().device("spritegen1")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.spriteram.u16, 0x800, true); + screen.machine().device("spritegen1")->draw_sprites(bitmap, cliprect, screen.machine().generic.spriteram.u16, 0x800, true); // I'm pretty sure only the original has the 2nd spriteram, used for the Japanese text on the 2nd scene (non-scrolling text) in the intro of the quest (3rd in JPN) mode - if (screen->machine().generic.spriteram2.u16) - screen->machine().device("spritegen2")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.spriteram2.u16, 0x800, true); + if (screen.machine().generic.spriteram2.u16) + screen.machine().device("spritegen2")->draw_sprites(bitmap, cliprect, screen.machine().generic.spriteram2.u16, 0x800, true); - tilemap_set_flip_all(screen->machine(),flip_screen_x_get(screen->machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(flip_screen_x_get(screen.machine()) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); /* the tilemap 4bpp + 4bpp = 8bpp mixing actually seems external to the tilemap, note video_control is not part of the tilemap chip */ if ((state->m_video_control&4)==0) { deco16ic_tilemap_12_combine_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0, 1); - screen->machine().device("spritegen1")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0200, 0x0200, 0x100, 0x1ff); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0200, 0x0200, 0x100, 0x1ff); } else { deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen1")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0200, 0x0200, 0x100, 0x1ff); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0200, 0x0200, 0x100, 0x1ff); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); } - if (screen->machine().generic.spriteram2.u16) - screen->machine().device("spritegen2")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0000, 0, 0x1ff); + if (screen.machine().generic.spriteram2.u16) + screen.machine().device("spritegen2")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0000, 0, 0x1ff); - screen->machine().device("spritegen1")->inefficient_copy_sprite_bitmap(screen->machine(), bitmap, cliprect, 0x0000, 0x0200, 0, 0x1ff); + screen.machine().device("spritegen1")->inefficient_copy_sprite_bitmap(bitmap, cliprect, 0x0000, 0x0200, 0, 0x1ff); return 0; } diff -Nru mame-0.144/src/mame/video/sslam.c mame-0.145/src/mame/video/sslam.c --- mame-0.144/src/mame/video/sslam.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sslam.c 2012-02-06 21:30:32.000000000 +0000 @@ -22,7 +22,7 @@ palette_set_color_rgb(space->machine(), offset, pal5bit(r), pal5bit(g), pal5bit(b)); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sslam_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[0]; @@ -105,7 +105,7 @@ sslam_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tx_tileram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } /* Middle Layer */ @@ -124,7 +124,7 @@ sslam_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_md_tileram[offset]); - tilemap_mark_tile_dirty(state->m_md_tilemap,offset); + state->m_md_tilemap->mark_tile_dirty(offset); } /* Background Layer */ @@ -143,7 +143,7 @@ sslam_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_tileram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_powerbls_bg_tile_info ) @@ -163,7 +163,7 @@ sslam_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg_tileram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset>>1); + state->m_bg_tilemap->mark_tile_dirty(offset>>1); } VIDEO_START(sslam) @@ -174,8 +174,8 @@ state->m_md_tilemap = tilemap_create(machine, get_sslam_md_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->m_tx_tilemap = tilemap_create(machine, get_sslam_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_md_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_md_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); state->m_sprites_x_offset = 0; state->save_item(NAME(state->m_sprites_x_offset)); @@ -191,60 +191,60 @@ state->save_item(NAME(state->m_sprites_x_offset)); } -SCREEN_UPDATE(sslam) +SCREEN_UPDATE_IND16(sslam) { - sslam_state *state = screen->machine().driver_data(); + sslam_state *state = screen.machine().driver_data(); if (!(state->m_regs[6] & 1)) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - tilemap_set_scrollx(state->m_tx_tilemap,0, state->m_regs[0]+1); /* +0 looks better, but the real board has the left most pixel at the left edge shifted off screen */ - tilemap_set_scrolly(state->m_tx_tilemap,0, (state->m_regs[1] & 0xff)+8); - tilemap_set_scrollx(state->m_md_tilemap,0, state->m_regs[2]+2); - tilemap_set_scrolly(state->m_md_tilemap,0, state->m_regs[3]+8); - tilemap_set_scrollx(state->m_bg_tilemap,0, state->m_regs[4]+4); - tilemap_set_scrolly(state->m_bg_tilemap,0, state->m_regs[5]+8); + state->m_tx_tilemap->set_scrollx(0, state->m_regs[0]+1); /* +0 looks better, but the real board has the left most pixel at the left edge shifted off screen */ + state->m_tx_tilemap->set_scrolly(0, (state->m_regs[1] & 0xff)+8); + state->m_md_tilemap->set_scrollx(0, state->m_regs[2]+2); + state->m_md_tilemap->set_scrolly(0, state->m_regs[3]+8); + state->m_bg_tilemap->set_scrollx(0, state->m_regs[4]+4); + state->m_bg_tilemap->set_scrolly(0, state->m_regs[5]+8); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); /* remove wraparound from the tilemap (used on title screen) */ if (state->m_regs[2]+2 > 0x8c8) { rectangle md_clip; - md_clip.min_x = cliprect->min_x; - md_clip.max_x = cliprect->max_x - (state->m_regs[2]+2 - 0x8c8); - md_clip.min_y = cliprect->min_y; - md_clip.max_y = cliprect->max_y; + md_clip.min_x = cliprect.min_x; + md_clip.max_x = cliprect.max_x - (state->m_regs[2]+2 - 0x8c8); + md_clip.min_y = cliprect.min_y; + md_clip.max_y = cliprect.max_y; - tilemap_draw(bitmap,&md_clip,state->m_md_tilemap,0,0); + state->m_md_tilemap->draw(bitmap, md_clip, 0,0); } else { - tilemap_draw(bitmap,cliprect,state->m_md_tilemap,0,0); + state->m_md_tilemap->draw(bitmap, cliprect, 0,0); } - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE(powerbls) +SCREEN_UPDATE_IND16(powerbls) { - sslam_state *state = screen->machine().driver_data(); + sslam_state *state = screen.machine().driver_data(); if (!(state->m_regs[6] & 1)) { - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - tilemap_set_scrollx(state->m_bg_tilemap,0, state->m_regs[0]+21); - tilemap_set_scrolly(state->m_bg_tilemap,0, state->m_regs[1]-240); + state->m_bg_tilemap->set_scrollx(0, state->m_regs[0]+21); + state->m_bg_tilemap->set_scrolly(0, state->m_regs[1]-240); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/ssozumo.c mame-0.145/src/mame/video/ssozumo.c --- mame-0.144/src/mame/video/ssozumo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ssozumo.c 2012-02-06 21:30:31.000000000 +0000 @@ -45,7 +45,7 @@ ssozumo_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ssozumo_colorram_w ) @@ -53,7 +53,7 @@ ssozumo_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ssozumo_videoram2_w ) @@ -61,7 +61,7 @@ ssozumo_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ssozumo_colorram2_w ) @@ -69,7 +69,7 @@ ssozumo_state *state = space->machine().driver_data(); state->m_colorram2[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( ssozumo_paletteram_w ) @@ -110,7 +110,7 @@ { ssozumo_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( ssozumo_flipscreen_w ) @@ -147,10 +147,10 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols_flip_x, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { ssozumo_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -184,12 +184,12 @@ } } -SCREEN_UPDATE( ssozumo ) +SCREEN_UPDATE_IND16( ssozumo ) { - ssozumo_state *state = screen->machine().driver_data(); + ssozumo_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/sspeedr.c mame-0.145/src/mame/video/sspeedr.c --- mame-0.144/src/mame/video/sspeedr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/sspeedr.c 2012-02-06 21:30:31.000000000 +0000 @@ -92,7 +92,7 @@ } -static void draw_track(running_machine &machine, bitmap_t* bitmap) +static void draw_track(running_machine &machine, bitmap_ind16 &bitmap) { sspeedr_state *state = machine.driver_data(); const UINT8* p = machine.region("gfx3")->base(); @@ -142,11 +142,11 @@ if (counter_x & 2) { - *BITMAP_ADDR16(bitmap, y, x) = p[offset] / 16; + bitmap.pix16(y, x) = p[offset] / 16; } else { - *BITMAP_ADDR16(bitmap, y, x) = p[offset] % 16; + bitmap.pix16(y, x) = p[offset] % 16; } } @@ -154,7 +154,7 @@ for (; y < 128 + state->m_track_vert[1]; y++) { - *BITMAP_ADDR16(bitmap, y, x) = flag ? 15 : 0; + bitmap.pix16(y, x) = flag ? 15 : 0; } /* lower landscape */ @@ -170,18 +170,18 @@ if (counter_x & 2) { - *BITMAP_ADDR16(bitmap, y, x) = p[offset] / 16; + bitmap.pix16(y, x) = p[offset] / 16; } else { - *BITMAP_ADDR16(bitmap, y, x) = p[offset] % 16; + bitmap.pix16(y, x) = p[offset] % 16; } } } } -static void draw_drones(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_drones(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sspeedr_state *state = machine.driver_data(); static const UINT8 code[6] = @@ -221,7 +221,7 @@ } -static void draw_driver(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_driver(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { sspeedr_state *state = machine.driver_data(); int x; @@ -258,17 +258,21 @@ } -SCREEN_UPDATE( sspeedr ) +SCREEN_UPDATE_IND16( sspeedr ) { - draw_track(screen->machine(), bitmap); - draw_drones(screen->machine(), bitmap, cliprect); - draw_driver(screen->machine(), bitmap, cliprect); + draw_track(screen.machine(), bitmap); + draw_drones(screen.machine(), bitmap, cliprect); + draw_driver(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( sspeedr ) +SCREEN_VBLANK( sspeedr ) { - sspeedr_state *state = machine.driver_data(); - state->m_toggle ^= 1; + // rising edge + if (vblank_on) + { + sspeedr_state *state = screen.machine().driver_data(); + state->m_toggle ^= 1; + } } diff -Nru mame-0.144/src/mame/video/ssrj.c mame-0.145/src/mame/video/ssrj.c --- mame-0.144/src/mame/video/ssrj.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ssrj.c 2012-02-06 21:30:32.000000000 +0000 @@ -8,7 +8,7 @@ ssrj_state *state = space->machine().driver_data(); state->m_vram1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap1, offset>>1); + state->m_tilemap1->mark_tile_dirty(offset>>1); } static TILE_GET_INFO( get_tile_info1 ) @@ -20,7 +20,7 @@ 0, code&0x3ff, (code>>12)&0x3, - ((code & 0x8000) ? TILE_FLIPX:0) |( (code & 0x4000) ? TILE_FLIPY:0) ); + ((code & 0x8000) ? TILE_FLIPY:0) |( (code & 0x4000) ? TILE_FLIPX:0) ); } /* tilemap 2 */ @@ -30,7 +30,7 @@ ssrj_state *state = space->machine().driver_data(); state->m_vram2[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap2, offset>>1); + state->m_tilemap2->mark_tile_dirty(offset>>1); } static TILE_GET_INFO( get_tile_info2 ) @@ -42,7 +42,7 @@ 0, code&0x3ff, ((code>>12)&0x3)+4, - ((code & 0x8000) ? TILE_FLIPX:0) |( (code & 0x4000) ? TILE_FLIPY:0) ); + ((code & 0x8000) ? TILE_FLIPY:0) |( (code & 0x4000) ? TILE_FLIPX:0) ); } /* tilemap 4 */ @@ -52,7 +52,7 @@ ssrj_state *state = space->machine().driver_data(); state->m_vram4[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap4, offset>>1); + state->m_tilemap4->mark_tile_dirty(offset>>1); } static TILE_GET_INFO( get_tile_info4 ) @@ -64,7 +64,7 @@ 0, code&0x3ff, ((code>>12)&0x3)+12, - ((code & 0x8000) ? TILE_FLIPX:0) |( (code & 0x4000) ? TILE_FLIPY:0) ); + ((code & 0x8000) ? TILE_FLIPY:0) |( (code & 0x4000) ? TILE_FLIPX:0) ); } @@ -226,25 +226,30 @@ { ssrj_state *state = machine.driver_data(); - state->m_tilemap1 = tilemap_create(machine, get_tile_info1, tilemap_scan_rows, 8, 8, 32, 32); - state->m_tilemap2 = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 8, 8, 32, 32); - state->m_tilemap4 = tilemap_create(machine, get_tile_info4, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_tilemap2, 0); - tilemap_set_transparent_pen(state->m_tilemap4, 0); + state->m_tilemap1 = tilemap_create(machine, get_tile_info1, tilemap_scan_cols, 8, 8, 32, 32); + state->m_tilemap2 = tilemap_create(machine, get_tile_info2, tilemap_scan_cols, 8, 8, 32, 32); + state->m_tilemap4 = tilemap_create(machine, get_tile_info4, tilemap_scan_cols, 8, 8, 32, 32); + state->m_tilemap2->set_transparent_pen(0); + state->m_tilemap4->set_transparent_pen(0); + + state->m_buffer_spriteram = auto_alloc_array(machine, UINT8, 0x0800); } -static void draw_objects(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_objects(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { ssrj_state *state = machine.driver_data(); int i,j,k,x,y; for(i=0;i<6;i++) { - x = state->m_scrollram[0x80+20*i]; - y = state->m_scrollram[0x80+20*i+2]; - if (!state->m_scrollram[0x80+20*i+3]) - for(k=0;k<5;k++,y+=8) + y = state->m_buffer_spriteram[0x80+20*i]; + x = state->m_buffer_spriteram[0x80+20*i+2]; + if (!state->m_buffer_spriteram[0x80+20*i+3]) + { + + for(k=0;k<5;k++,x+=8) + { for(j=0;j<0x20;j++) { int code; @@ -255,12 +260,14 @@ cliprect,machine.gfx[0], code&1023, ((code>>12)&0x3)+8, - code&0x8000, code&0x4000, - (247-(x+(j<<3)))&0xff, - y, + code&0x8000, + x, + (247-(y+(j<<3)))&0xff, 0); } + } + } } } @@ -273,18 +280,27 @@ palette_set_color_rgb(machine, i*8+j, fakecols[i][j][0], fakecols[i][j][1], fakecols[i][j][2]); } -SCREEN_UPDATE( ssrj ) +SCREEN_UPDATE_IND16( ssrj ) { - ssrj_state *state = screen->machine().driver_data(); + ssrj_state *state = screen.machine().driver_data(); - tilemap_set_scrolly(state->m_tilemap1, 0, 0xff-state->m_scrollram[2] ); - tilemap_set_scrollx(state->m_tilemap1, 0, state->m_scrollram[0] ); - tilemap_draw(bitmap, cliprect, state->m_tilemap1, 0, 0); - draw_objects(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_tilemap2, 0, 0); + state->m_tilemap1->set_scrollx(0, 0xff-state->m_scrollram[2] ); + state->m_tilemap1->set_scrolly(0, state->m_scrollram[0] ); + state->m_tilemap1->draw(bitmap, cliprect, 0, 0); + draw_objects(screen.machine(), bitmap, cliprect); + state->m_tilemap2->draw(bitmap, cliprect, 0, 0); - if (state->m_scrollram[0x101] == 0xb) tilemap_draw(bitmap, cliprect, state->m_tilemap4, 0, 0);/* hack to display 4th tilemap */ + if (state->m_scrollram[0x101] == 0xb) state->m_tilemap4->draw(bitmap, cliprect, 0, 0);/* hack to display 4th tilemap */ return 0; } +SCREEN_VBLANK( ssrj ) +{ + // rising edge + if (vblank_on) + { + ssrj_state *state = screen.machine().driver_data(); + memcpy(state->m_buffer_spriteram, state->m_scrollram, 0x800); + } +} diff -Nru mame-0.144/src/mame/video/ssv.c mame-0.145/src/mame/video/ssv.c --- mame-0.144/src/mame/video/ssv.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ssv.c 2012-02-06 21:30:31.000000000 +0000 @@ -141,7 +141,7 @@ #endif -static void ssv_drawgfx( bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx, +static void ssv_drawgfx( bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int x0,int y0, int shadow ) { @@ -164,16 +164,16 @@ #define SSV_DRAWGFX(SETPIXELCOLOR) \ for ( sy = y0; sy != y1; sy += dy ) \ { \ - if ( sy >= cliprect->min_y && sy <= cliprect->max_y ) \ + if ( sy >= cliprect.min_y && sy <= cliprect.max_y ) \ { \ source = addr; \ - dest = BITMAP_ADDR16(bitmap, sy, 0); \ + dest = &bitmap.pix16(sy); \ \ for ( sx = x0; sx != x1; sx += dx ) \ { \ pen = *source++; \ \ - if ( pen && sx >= cliprect->min_x && sx <= cliprect->max_x ) \ + if ( pen && sx >= cliprect.min_x && sx <= cliprect.max_x ) \ SETPIXELCOLOR \ } \ } \ @@ -221,7 +221,7 @@ ssv_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_gdfs_tmapram[offset]); - tilemap_mark_tile_dirty(state->m_gdfs_tmap, offset); + state->m_gdfs_tmap->mark_tile_dirty(offset); } VIDEO_START( gdfs ) @@ -238,7 +238,7 @@ state->m_gdfs_tmap = tilemap_create( machine, get_tile_info_0, tilemap_scan_rows, 16,16, 0x100,0x100 ); - tilemap_set_transparent_pen(state->m_gdfs_tmap, 0); + state->m_gdfs_tmap->set_transparent_pen(0); } /*************************************************************************** @@ -606,7 +606,7 @@ /* Draw a tilemap sprite */ -static void draw_row(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int sx, int sy, int scroll) +static void draw_row(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int sx, int sy, int scroll) { ssv_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -628,24 +628,21 @@ /* Set up a clipping region for the tilemap slice .. */ - clip.min_x = sx; - clip.max_x = sx + xnum * 0x10 - 1; - clip.min_y = sy; - clip.max_y = sy + ynum * 0x8 - 1; + clip.set(sx, sx + xnum * 0x10 - 1, sy, sy + ynum * 0x8 - 1); /* .. and clip it against the visible screen */ - if (clip.min_x > cliprect->max_x) return; - if (clip.min_y > cliprect->max_y) return; + if (clip.min_x > cliprect.max_x) return; + if (clip.min_y > cliprect.max_y) return; - if (clip.max_x < cliprect->min_x) return; - if (clip.max_y < cliprect->min_y) return; + if (clip.max_x < cliprect.min_x) return; + if (clip.max_y < cliprect.min_y) return; - if (clip.min_x < cliprect->min_x) clip.min_x = cliprect->min_x; - if (clip.max_x > cliprect->max_x) clip.max_x = cliprect->max_x; + if (clip.min_x < cliprect.min_x) clip.min_x = cliprect.min_x; + if (clip.max_x > cliprect.max_x) clip.max_x = cliprect.max_x; - if (clip.min_y < cliprect->min_y) clip.min_y = cliprect->min_y; - if (clip.max_y > cliprect->max_y) clip.max_y = cliprect->max_y; + if (clip.min_y < cliprect.min_y) clip.min_y = cliprect.min_y; + if (clip.max_y > cliprect.max_y) clip.max_y = cliprect.max_y; /* Get the scroll data */ x = ssv_scroll[ scroll * 4 + 0 ]; // x scroll @@ -725,7 +722,7 @@ { for (ty = ystart; ty != yend; ty += yinc) { - ssv_drawgfx( bitmap, &clip, machine.gfx[gfx], + ssv_drawgfx( bitmap, clip, machine.gfx[gfx], code++, color, flipx, flipy, @@ -741,7 +738,7 @@ /* Draw the "background layer" using multiple tilemap sprites */ -static void draw_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int nr) +static void draw_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int nr) { int sy; for ( sy = 0; sy <= machine.primary_screen->visible_area().max_y; sy += 0x40 ) @@ -750,7 +747,7 @@ /* Draw sprites in the sprites list */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* Sprites list */ ssv_state *state = machine.driver_data(); @@ -984,9 +981,9 @@ ***************************************************************************/ -SCREEN_UPDATE( eaglshot ) +SCREEN_UPDATE_IND16( eaglshot ) { - return SCREEN_UPDATE_CALL(ssv); + return SCREEN_UPDATE16_CALL(ssv); } /* @@ -1042,7 +1039,7 @@ E.h Unused */ -static void gdfs_draw_zooming_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void gdfs_draw_zooming_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { /* Sprites list */ @@ -1165,19 +1162,19 @@ } /* sprites list */ } -SCREEN_UPDATE( gdfs ) +SCREEN_UPDATE_IND16( gdfs ) { - ssv_state *state = screen->machine().driver_data(); + ssv_state *state = screen.machine().driver_data(); int pri; - SCREEN_UPDATE_CALL(ssv); + SCREEN_UPDATE16_CALL(ssv); for (pri = 0; pri <= 0xf; pri++) - gdfs_draw_zooming_sprites(screen->machine(), bitmap, cliprect, pri); + gdfs_draw_zooming_sprites(screen.machine(), bitmap, cliprect, pri); - tilemap_set_scrollx(state->m_gdfs_tmap, 0, state->m_gdfs_tmapscroll[0x0c/2]); - tilemap_set_scrolly(state->m_gdfs_tmap, 0, state->m_gdfs_tmapscroll[0x10/2]); - tilemap_draw(bitmap,cliprect, state->m_gdfs_tmap, 0, 0); + state->m_gdfs_tmap->set_scrollx(0, state->m_gdfs_tmapscroll[0x0c/2]); + state->m_gdfs_tmap->set_scrolly(0, state->m_gdfs_tmapscroll[0x10/2]); + state->m_gdfs_tmap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1189,11 +1186,11 @@ state->m_enable_video = enable; } -SCREEN_UPDATE( ssv ) +SCREEN_UPDATE_IND16( ssv ) { - rectangle clip = { 0, 0, 0, 0 }; + rectangle clip; - ssv_state *state = screen->machine().driver_data(); + ssv_state *state = screen.machine().driver_data(); // Shadow if (state->m_scroll[0x76/2] & 0x0080) @@ -1209,20 +1206,20 @@ state->m_shadow_pen_mask = (1 << state->m_shadow_pen_shift) - 1; /* The background color is the first one in the palette */ - bitmap_fill(bitmap,cliprect, 0); + bitmap.fill(0, cliprect); // used by twineag2 and ultrax - clip.min_x = (cliprect->max_x / 2 + state->m_scroll[0x62/2]) * 2 - state->m_scroll[0x64/2] * 2 + 2; - clip.max_x = (cliprect->max_x / 2 + state->m_scroll[0x62/2]) * 2 - state->m_scroll[0x62/2] * 2 + 1; - clip.min_y = (cliprect->max_y + state->m_scroll[0x6a/2]) - state->m_scroll[0x6c/2] + 1; - clip.max_y = (cliprect->max_y + state->m_scroll[0x6a/2]) - state->m_scroll[0x6a/2] ; + clip.min_x = (cliprect.max_x / 2 + state->m_scroll[0x62/2]) * 2 - state->m_scroll[0x64/2] * 2 + 2; + clip.max_x = (cliprect.max_x / 2 + state->m_scroll[0x62/2]) * 2 - state->m_scroll[0x62/2] * 2 + 1; + clip.min_y = (cliprect.max_y + state->m_scroll[0x6a/2]) - state->m_scroll[0x6c/2] + 1; + clip.max_y = (cliprect.max_y + state->m_scroll[0x6a/2]) - state->m_scroll[0x6a/2] ; // printf("%04x %04x %04x %04x\n",clip.min_x, clip.max_x, clip.min_y, clip.max_y); if (clip.min_x < 0) clip.min_x = 0; if (clip.min_y < 0) clip.min_y = 0; - if (clip.max_x > cliprect->max_x) clip.max_x = cliprect->max_x; - if (clip.max_y > cliprect->max_y) clip.max_y = cliprect->max_y; + if (clip.max_x > cliprect.max_x) clip.max_x = cliprect.max_x; + if (clip.max_y > cliprect.max_y) clip.max_y = cliprect.max_y; if (clip.min_x > clip.max_x) clip.min_x = clip.max_x; @@ -1232,9 +1229,9 @@ if (!state->m_enable_video) return 0; - draw_layer(screen->machine(), bitmap, &clip, 0); // "background layer" + draw_layer(screen.machine(), bitmap, clip, 0); // "background layer" - draw_sprites(screen->machine(), bitmap, &clip); // sprites list + draw_sprites(screen.machine(), bitmap, clip); // sprites list return 0; diff -Nru mame-0.144/src/mame/video/st0016.c mame-0.145/src/mame/video/st0016.c --- mame-0.144/src/mame/video/st0016.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/st0016.c 2012-02-06 21:30:33.000000000 +0000 @@ -212,7 +212,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* object ram : @@ -367,7 +367,7 @@ UINT16 drawypos; if (!flipy) {drawypos = ypos+yloop;} else {drawypos = (ypos+8-1)-yloop;} - destline = BITMAP_ADDR16(bitmap, drawypos, 0); + destline = &bitmap.pix16(drawypos); for (xloop=0; xloop<8; xloop++) { @@ -377,10 +377,10 @@ if (!flipx) { drawxpos = xpos+xloop; } else { drawxpos = (xpos+8-1)-xloop; } - if (drawxpos > cliprect->max_x) + if (drawxpos > cliprect.max_x) drawxpos -= 512; // wrap around - if ((drawxpos >= cliprect->min_x) && (drawxpos <= cliprect->max_x) && (drawypos >= cliprect->min_y) && (drawypos <= cliprect->max_y) ) + if (cliprect.contains(drawxpos, drawypos)) { if(st0016_spriteram[offset+5]&0x40) { @@ -488,7 +488,7 @@ } -static void draw_bgmap(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, int priority) +static void draw_bgmap(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect, int priority) { gfx_element *gfx = machine.gfx[st0016_ramgfx]; int j; @@ -533,7 +533,7 @@ UINT16 drawypos; if (!flipy) {drawypos = ypos+yloop;} else {drawypos = (ypos+8-1)-yloop;} - destline = BITMAP_ADDR16(bitmap, drawypos, 0); + destline = &bitmap.pix16(drawypos); for (xloop=0; xloop<8; xloop++) { @@ -543,10 +543,10 @@ if (!flipx) { drawxpos = xpos+xloop; } else { drawxpos = (xpos+8-1)-xloop; } - if (drawxpos > cliprect->max_x) + if (drawxpos > cliprect.max_x) drawxpos -= 512; // wrap around - if ((drawxpos >= cliprect->min_x) && (drawxpos <= cliprect->max_x) && (drawypos >= cliprect->min_y) && (drawypos <= cliprect->max_y) ) + if (cliprect.contains(drawxpos, drawypos)) { if(st0016_vregs[j+7]==0x12) @@ -584,18 +584,18 @@ } -void st0016_draw_screen(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect) +void st0016_draw_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - draw_bgmap(screen->machine(), bitmap,cliprect,0); - draw_sprites(screen->machine(), bitmap,cliprect); - draw_bgmap(screen->machine(), bitmap,cliprect,1); + draw_bgmap(screen.machine(), bitmap,cliprect,0); + draw_sprites(screen.machine(), bitmap,cliprect); + draw_bgmap(screen.machine(), bitmap,cliprect,1); } -SCREEN_UPDATE( st0016 ) +SCREEN_UPDATE_IND16( st0016 ) { #ifdef MAME_DEBUG - if(screen->machine().input().code_pressed_once(KEYCODE_Z)) + if(screen.machine().input().code_pressed_once(KEYCODE_Z)) { int h,j; FILE *p=fopen("vram.bin","wb"); @@ -616,7 +616,7 @@ } #endif - bitmap_fill(bitmap,cliprect,UNUSED_PEN); + bitmap.fill(UNUSED_PEN, cliprect); st0016_draw_screen(screen, bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/stactics.c mame-0.145/src/mame/video/stactics.c --- mame-0.144/src/mame/video/stactics.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/stactics.c 2012-02-06 21:30:31.000000000 +0000 @@ -236,11 +236,11 @@ } -static void draw_background(stactics_state *state, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(stactics_state *state, bitmap_ind16 &bitmap, const rectangle &cliprect) { int y; - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* for every row */ for (y = 0; y < 0x100; y++) @@ -275,7 +275,7 @@ /* plot if visible */ if ((sy >= 0) && (sy < 0x100) && (sx >= 0) && (sx < 0x100)) - *BITMAP_ADDR16(bitmap, sy, sx) = pen; + bitmap.pix16(sy, sx) = pen; } } } @@ -388,13 +388,13 @@ * *************************************/ -static SCREEN_UPDATE( stactics ) +static SCREEN_UPDATE_IND16( stactics ) { - stactics_state *state = screen->machine().driver_data(); + stactics_state *state = screen.machine().driver_data(); update_beam(state); draw_background(state, bitmap, cliprect); - update_artwork(screen->machine(), state); + update_artwork(screen.machine(), state); state->m_frame_count = (state->m_frame_count + 1) & 0x0f; @@ -416,10 +416,9 @@ MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) - MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) - MCFG_SCREEN_UPDATE(stactics) + MCFG_SCREEN_UPDATE_STATIC(stactics) MCFG_PALETTE_LENGTH(0x400) diff -Nru mame-0.144/src/mame/video/stadhero.c mame-0.145/src/mame/video/stadhero.c --- mame-0.144/src/mame/video/stadhero.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/stadhero.c 2012-02-06 21:30:31.000000000 +0000 @@ -19,15 +19,15 @@ /******************************************************************************/ -SCREEN_UPDATE( stadhero ) +SCREEN_UPDATE_IND16( stadhero ) { - stadhero_state *state = screen->machine().driver_data(); -// tilemap_set_flip_all(screen->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + stadhero_state *state = screen.machine().driver_data(); +// screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - screen->machine().device("tilegen1")->set_bppmultmask(0x8, 0x7); - screen->machine().device("tilegen1")->deco_bac06_pf_draw(screen->machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x00, 0x00, 0x0f); - tilemap_draw(bitmap,cliprect,state->m_pf1_tilemap,0,0); + screen.machine().device("tilegen1")->set_bppmultmask(0x8, 0x7); + screen.machine().device("tilegen1")->deco_bac06_pf_draw(screen.machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 0x00, 0x00, 0x0f); + state->m_pf1_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -37,7 +37,7 @@ { stadhero_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf1_data[offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap,offset); + state->m_pf1_tilemap->mark_tile_dirty(offset); } @@ -61,7 +61,7 @@ { stadhero_state *state = machine.driver_data(); state->m_pf1_tilemap = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_pf1_tilemap,0); + state->m_pf1_tilemap->set_transparent_pen(0); } /******************************************************************************/ diff -Nru mame-0.144/src/mame/video/starcrus.c mame-0.145/src/mame/video/starcrus.c --- mame-0.144/src/mame/video/starcrus.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/starcrus.c 2012-02-06 21:30:31.000000000 +0000 @@ -20,11 +20,11 @@ VIDEO_START( starcrus ) { starcrus_state *state = machine.driver_data(); - state->m_ship1_vid = auto_bitmap_alloc(machine, 16, 16, machine.primary_screen->format()); - state->m_ship2_vid = auto_bitmap_alloc(machine, 16, 16, machine.primary_screen->format()); + state->m_ship1_vid = auto_bitmap_ind16_alloc(machine, 16, 16); + state->m_ship2_vid = auto_bitmap_ind16_alloc(machine, 16, 16); - state->m_proj1_vid = auto_bitmap_alloc(machine, 16, 16, machine.primary_screen->format()); - state->m_proj2_vid = auto_bitmap_alloc(machine, 16, 16, machine.primary_screen->format()); + state->m_proj1_vid = auto_bitmap_ind16_alloc(machine, 16, 16); + state->m_proj2_vid = auto_bitmap_ind16_alloc(machine, 16, 16); } WRITE8_HANDLER( starcrus_ship_parm_1_w ) @@ -167,15 +167,10 @@ starcrus_state *state = machine.driver_data(); int org_x, org_y; int sx, sy; - rectangle clip; + rectangle clip(0, 15, 0, 15); - clip.min_x=0; - clip.max_x=15; - clip.min_y=0; - clip.max_y=15; - - bitmap_fill(state->m_ship1_vid, &clip, 0); - bitmap_fill(state->m_ship2_vid, &clip, 0); + state->m_ship1_vid->fill(0, clip); + state->m_ship2_vid->fill(0, clip); /* origin is with respect to ship1 */ @@ -183,8 +178,8 @@ org_y = state->m_s1_y; /* Draw ship 1 */ - drawgfx_opaque(state->m_ship1_vid, - &clip, + drawgfx_opaque(*state->m_ship1_vid, + clip, machine.gfx[8+((state->m_s1_sprite&0x04)>>2)], (state->m_s1_sprite&0x03)^0x03, 0, @@ -192,8 +187,8 @@ state->m_s1_x-org_x, state->m_s1_y-org_y); /* Draw ship 2 */ - drawgfx_opaque(state->m_ship2_vid, - &clip, + drawgfx_opaque(*state->m_ship2_vid, + clip, machine.gfx[10+((state->m_s2_sprite&0x04)>>2)], (state->m_s2_sprite&0x03)^0x03, 0, @@ -204,7 +199,7 @@ for (sy=0;sy<16;sy++) for (sx=0;sx<16;sx++) /* Condition 1 - ship 1 = ship 2 */ - if ((*BITMAP_ADDR16(state->m_ship1_vid, sy, sx) == 1) && (*BITMAP_ADDR16(state->m_ship2_vid, sy, sx) == 1)) + if ((state->m_ship1_vid->pix16(sy, sx) == 1) && (state->m_ship2_vid->pix16(sy, sx) == 1)) return 1; return 0; @@ -215,7 +210,7 @@ starcrus_state *state = machine.driver_data(); int org_x, org_y; int sx, sy; - rectangle clip; + rectangle clip(0, 15, 0, 15); /* if both are scores, return */ if ( ((state->m_p1_sprite & 0x08) == 0) && @@ -224,13 +219,8 @@ return 0; } - clip.min_x=0; - clip.max_x=15; - clip.min_y=0; - clip.max_y=15; - - bitmap_fill(state->m_proj1_vid, &clip, 0); - bitmap_fill(state->m_proj2_vid, &clip, 0); + state->m_proj1_vid->fill(0, clip); + state->m_proj2_vid->fill(0, clip); /* origin is with respect to proj1 */ @@ -240,8 +230,8 @@ if (state->m_p1_sprite & 0x08) /* if p1 is a projectile */ { /* Draw score/projectile 1 */ - drawgfx_opaque(state->m_proj1_vid, - &clip, + drawgfx_opaque(*state->m_proj1_vid, + clip, machine.gfx[(state->m_p1_sprite&0x0c)>>2], (state->m_p1_sprite&0x03)^0x03, 0, @@ -252,8 +242,8 @@ if (state->m_p2_sprite & 0x08) /* if p2 is a projectile */ { /* Draw score/projectile 2 */ - drawgfx_opaque(state->m_proj2_vid, - &clip, + drawgfx_opaque(*state->m_proj2_vid, + clip, machine.gfx[4+((state->m_p2_sprite&0x0c)>>2)], (state->m_p2_sprite&0x03)^0x03, 0, @@ -265,7 +255,7 @@ for (sy=0;sy<16;sy++) for (sx=0;sx<16;sx++) /* Condition 1 - proj 1 = proj 2 */ - if ((*BITMAP_ADDR16(state->m_proj1_vid, sy, sx) == 1) && (*BITMAP_ADDR16(state->m_proj2_vid, sy, sx) == 1)) + if ((state->m_proj1_vid->pix16(sy, sx) == 1) && (state->m_proj2_vid->pix16(sy, sx) == 1)) return 1; return 0; @@ -276,7 +266,7 @@ starcrus_state *state = machine.driver_data(); int org_x, org_y; int sx, sy; - rectangle clip; + rectangle clip(0, 15, 0, 15); /* if both are scores, return */ if ( ((state->m_p1_sprite & 0x08) == 0) && @@ -285,14 +275,9 @@ return 0; } - clip.min_x=0; - clip.max_x=15; - clip.min_y=0; - clip.max_y=15; - - bitmap_fill(state->m_ship1_vid, &clip, 0); - bitmap_fill(state->m_proj1_vid, &clip, 0); - bitmap_fill(state->m_proj2_vid, &clip, 0); + state->m_ship1_vid->fill(0, clip); + state->m_proj1_vid->fill(0, clip); + state->m_proj2_vid->fill(0, clip); /* origin is with respect to ship1 */ @@ -300,8 +285,8 @@ org_y = state->m_s1_y; /* Draw ship 1 */ - drawgfx_opaque(state->m_ship1_vid, - &clip, + drawgfx_opaque(*state->m_ship1_vid, + clip, machine.gfx[8+((state->m_s1_sprite&0x04)>>2)], (state->m_s1_sprite&0x03)^0x03, 0, @@ -311,8 +296,8 @@ if (state->m_p1_sprite & 0x08) /* if p1 is a projectile */ { /* Draw projectile 1 */ - drawgfx_opaque(state->m_proj1_vid, - &clip, + drawgfx_opaque(*state->m_proj1_vid, + clip, machine.gfx[(state->m_p1_sprite&0x0c)>>2], (state->m_p1_sprite&0x03)^0x03, 0, @@ -323,8 +308,8 @@ if (state->m_p2_sprite & 0x08) /* if p2 is a projectile */ { /* Draw projectile 2 */ - drawgfx_opaque(state->m_proj2_vid, - &clip, + drawgfx_opaque(*state->m_proj2_vid, + clip, machine.gfx[4+((state->m_p2_sprite&0x0c)>>2)], (state->m_p2_sprite&0x03)^0x03, 0, @@ -335,13 +320,13 @@ /* Now check for collisions */ for (sy=0;sy<16;sy++) for (sx=0;sx<16;sx++) - if (*BITMAP_ADDR16(state->m_ship1_vid, sy, sx) == 1) + if (state->m_ship1_vid->pix16(sy, sx) == 1) { /* Condition 1 - ship 1 = proj 1 */ - if (*BITMAP_ADDR16(state->m_proj1_vid, sy, sx) == 1) + if (state->m_proj1_vid->pix16(sy, sx) == 1) return 1; /* Condition 2 - ship 1 = proj 2 */ - if (*BITMAP_ADDR16(state->m_proj2_vid, sy, sx) == 1) + if (state->m_proj2_vid->pix16(sy, sx) == 1) return 1; } @@ -353,7 +338,7 @@ starcrus_state *state = machine.driver_data(); int org_x, org_y; int sx, sy; - rectangle clip; + rectangle clip(0, 15, 0, 15); /* if both are scores, return */ if ( ((state->m_p1_sprite & 0x08) == 0) && @@ -362,14 +347,9 @@ return 0; } - clip.min_x=0; - clip.max_x=15; - clip.min_y=0; - clip.max_y=15; - - bitmap_fill(state->m_ship2_vid, &clip, 0); - bitmap_fill(state->m_proj1_vid, &clip, 0); - bitmap_fill(state->m_proj2_vid, &clip, 0); + state->m_ship2_vid->fill(0, clip); + state->m_proj1_vid->fill(0, clip); + state->m_proj2_vid->fill(0, clip); /* origin is with respect to ship2 */ @@ -377,8 +357,8 @@ org_y = state->m_s2_y; /* Draw ship 2 */ - drawgfx_opaque(state->m_ship2_vid, - &clip, + drawgfx_opaque(*state->m_ship2_vid, + clip, machine.gfx[10+((state->m_s2_sprite&0x04)>>2)], (state->m_s2_sprite&0x03)^0x03, 0, @@ -388,8 +368,8 @@ if (state->m_p1_sprite & 0x08) /* if p1 is a projectile */ { /* Draw projectile 1 */ - drawgfx_opaque(state->m_proj1_vid, - &clip, + drawgfx_opaque(*state->m_proj1_vid, + clip, machine.gfx[(state->m_p1_sprite&0x0c)>>2], (state->m_p1_sprite&0x03)^0x03, 0, @@ -400,8 +380,8 @@ if (state->m_p2_sprite & 0x08) /* if p2 is a projectile */ { /* Draw projectile 2 */ - drawgfx_opaque(state->m_proj2_vid, - &clip, + drawgfx_opaque(*state->m_proj2_vid, + clip, machine.gfx[4+((state->m_p2_sprite&0x0c)>>2)], (state->m_p2_sprite&0x03)^0x03, 0, @@ -412,29 +392,29 @@ /* Now check for collisions */ for (sy=0;sy<16;sy++) for (sx=0;sx<16;sx++) - if (*BITMAP_ADDR16(state->m_ship2_vid, sy, sx) == 1) + if (state->m_ship2_vid->pix16(sy, sx) == 1) { /* Condition 1 - ship 2 = proj 1 */ - if (*BITMAP_ADDR16(state->m_proj1_vid, sy, sx) == 1) + if (state->m_proj1_vid->pix16(sy, sx) == 1) return 1; /* Condition 2 - ship 2 = proj 2 */ - if (*BITMAP_ADDR16(state->m_proj2_vid, sy, sx) == 1) + if (state->m_proj2_vid->pix16(sy, sx) == 1) return 1; } return 0; } -SCREEN_UPDATE( starcrus ) +SCREEN_UPDATE_IND16( starcrus ) { - starcrus_state *state = screen->machine().driver_data(); + starcrus_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); /* Draw ship 1 */ drawgfx_transpen(bitmap, cliprect, - screen->machine().gfx[8+((state->m_s1_sprite&0x04)>>2)], + screen.machine().gfx[8+((state->m_s1_sprite&0x04)>>2)], (state->m_s1_sprite&0x03)^0x03, 0, (state->m_s1_sprite&0x08)>>3, (state->m_s1_sprite&0x10)>>4, @@ -444,7 +424,7 @@ /* Draw ship 2 */ drawgfx_transpen(bitmap, cliprect, - screen->machine().gfx[10+((state->m_s2_sprite&0x04)>>2)], + screen.machine().gfx[10+((state->m_s2_sprite&0x04)>>2)], (state->m_s2_sprite&0x03)^0x03, 0, (state->m_s2_sprite&0x08)>>3, (state->m_s2_sprite&0x10)>>4, @@ -454,7 +434,7 @@ /* Draw score/projectile 1 */ drawgfx_transpen(bitmap, cliprect, - screen->machine().gfx[(state->m_p1_sprite&0x0c)>>2], + screen.machine().gfx[(state->m_p1_sprite&0x0c)>>2], (state->m_p1_sprite&0x03)^0x03, 0, 0,0, @@ -464,7 +444,7 @@ /* Draw score/projectile 2 */ drawgfx_transpen(bitmap, cliprect, - screen->machine().gfx[4+((state->m_p2_sprite&0x0c)>>2)], + screen.machine().gfx[4+((state->m_p2_sprite&0x0c)>>2)], (state->m_p2_sprite&0x03)^0x03, 0, 0,0, @@ -472,28 +452,28 @@ 0); /* Collision detection */ - if (cliprect->max_y == screen->visible_area().max_y) + if (cliprect.max_y == screen.visible_area().max_y) { state->m_collision_reg = 0x00; /* Check for collisions between ship1 and ship2 */ - if (collision_check_s1s2(screen->machine())) + if (collision_check_s1s2(screen.machine())) { state->m_collision_reg |= 0x08; } /* Check for collisions between ship1 and projectiles */ - if (collision_check_s1p1p2(screen->machine())) + if (collision_check_s1p1p2(screen.machine())) { state->m_collision_reg |= 0x02; } /* Check for collisions between ship1 and projectiles */ - if (collision_check_s2p1p2(screen->machine())) + if (collision_check_s2p1p2(screen.machine())) { state->m_collision_reg |= 0x01; } /* Check for collisions between ship1 and projectiles */ /* Note: I don't think this is used by the game */ - if (collision_check_p1p2(screen->machine())) + if (collision_check_p1p2(screen.machine())) { state->m_collision_reg |= 0x04; } diff -Nru mame-0.144/src/mame/video/starfire.c mame-0.145/src/mame/video/starfire.c --- mame-0.144/src/mame/video/starfire.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/starfire.c 2012-02-06 21:30:31.000000000 +0000 @@ -19,7 +19,7 @@ { starfire_state *state = machine.driver_data(); - state->m_starfire_screen = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_starfire_screen); state->m_scanline_timer = machine.scheduler().timer_alloc(FUNC(starfire_scanline_callback)); state->m_scanline_timer->adjust(machine.primary_screen->time_until_pos(STARFIRE_VBEND), STARFIRE_VBEND); @@ -250,14 +250,14 @@ int data = pix[0]; int color = col[0]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 0) = pens[color | ((data >> 2) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 1) = pens[color | ((data >> 1) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 2) = pens[color | ((data >> 0) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 3) = pens[color | ((data << 1) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 4) = pens[color | ((data << 2) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 5) = pens[color | ((data << 3) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 6) = pens[color | ((data << 4) & 0x20)]; - *BITMAP_ADDR32(state->m_starfire_screen, y, x + 7) = pens[color | ((data << 5) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 0) = pens[color | ((data >> 2) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 1) = pens[color | ((data >> 1) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 2) = pens[color | ((data >> 0) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 3) = pens[color | ((data << 1) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 4) = pens[color | ((data << 2) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 5) = pens[color | ((data << 3) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 6) = pens[color | ((data << 4) & 0x20)]; + state->m_starfire_screen.pix32(y, x + 7) = pens[color | ((data << 5) & 0x20)]; pix += 256; col += 256; @@ -268,9 +268,9 @@ state->m_scanline_timer->adjust(machine.primary_screen->time_until_pos(y), y); } -SCREEN_UPDATE( starfire ) +SCREEN_UPDATE_RGB32( starfire ) { - starfire_state *state = screen->machine().driver_data(); + starfire_state *state = screen.machine().driver_data(); copybitmap(bitmap, state->m_starfire_screen, 0, 0, 0, 0, cliprect); return 0; diff -Nru mame-0.144/src/mame/video/starshp1.c mame-0.145/src/mame/video/starshp1.c --- mame-0.144/src/mame/video/starshp1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/starshp1.c 2012-02-06 21:30:32.000000000 +0000 @@ -63,9 +63,9 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 16, 8, 32, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); - tilemap_set_scrollx(state->m_bg_tilemap, 0, -8); + state->m_bg_tilemap->set_scrollx(0, -8); state->m_LSFR = auto_alloc_array(machine, UINT16, 0x10000); @@ -81,7 +81,7 @@ val = (val << 1) | (bit & 1); } - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); } @@ -142,12 +142,12 @@ { offset ^= 0x1f; state->m_playfield_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } } -static void draw_starfield(starshp1_state *state, bitmap_t* bitmap) +static void draw_starfield(starshp1_state *state, bitmap_ind16 &bitmap) { /* * The LSFR is reset once per frame at the position of @@ -158,13 +158,13 @@ int x; int y; - for (y = 0; y < bitmap->height; y++) + for (y = 0; y < bitmap.height(); y++) { const UINT16* p = state->m_LSFR + (UINT16) (512 * y); - UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); + UINT16* pLine = &bitmap.pix16(y); - for (x = 0; x < bitmap->width; x++) + for (x = 0; x < bitmap.width(); x++) if ((p[x] & 0x5b56) == 0x5b44) pLine[x] = (p[x] & 0x0400) ? 0x0e : 0x0f; } @@ -181,7 +181,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { starshp1_state *state = machine.driver_data(); int i; @@ -200,7 +200,7 @@ } -static void draw_spaceship(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_spaceship(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { starshp1_state *state = machine.driver_data(); double scaler = -5 * log(1 - state->m_ship_size / 256.0); /* ? */ @@ -226,17 +226,17 @@ } -static void draw_phasor(starshp1_state *state, bitmap_t* bitmap) +static void draw_phasor(starshp1_state *state, bitmap_ind16 &bitmap) { int i; for (i = 128; i < 240; i++) if (i >= get_sprite_vpos(state, 13)) { - *BITMAP_ADDR16(bitmap, i, 2 * i + 0) = 0x10; - *BITMAP_ADDR16(bitmap, i, 2 * i + 1) = 0x10; - *BITMAP_ADDR16(bitmap, i, 2 * (255 - i) + 0) = 0x10; - *BITMAP_ADDR16(bitmap, i, 2 * (255 - i) + 1) = 0x10; + bitmap.pix16(i, 2 * i + 0) = 0x10; + bitmap.pix16(i, 2 * i + 1) = 0x10; + bitmap.pix16(i, 2 * (255 - i) + 0) = 0x10; + bitmap.pix16(i, 2 * (255 - i) + 1) = 0x10; } } @@ -255,22 +255,22 @@ } -static void draw_circle_line(running_machine &machine, bitmap_t *bitmap, int x, int y, int l) +static void draw_circle_line(running_machine &machine, bitmap_ind16 &bitmap, int x, int y, int l) { starshp1_state *state = machine.driver_data(); - if (y >= 0 && y <= bitmap->height - 1) + if (y >= 0 && y <= bitmap.height() - 1) { const UINT16* p = state->m_LSFR + (UINT16) (512 * y); - UINT16* pLine = BITMAP_ADDR16(bitmap, y, 0); + UINT16* pLine = &bitmap.pix16(y); int h1 = x - 2 * l; int h2 = x + 2 * l; if (h1 < 0) h1 = 0; - if (h2 > bitmap->width - 1) - h2 = bitmap->width - 1; + if (h2 > bitmap.width() - 1) + h2 = bitmap.width() - 1; for (x = h1; x <= h2; x++) if (state->m_circle_mod) @@ -284,7 +284,7 @@ } -static void draw_circle(running_machine &machine, bitmap_t* bitmap) +static void draw_circle(running_machine &machine, bitmap_ind16 &bitmap) { starshp1_state *state = machine.driver_data(); int cx = get_circle_hpos(state); @@ -314,17 +314,17 @@ } -static int spaceship_collision(running_machine &machine, bitmap_t *bitmap, const rectangle *rect) +static int spaceship_collision(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &rect) { starshp1_state *state = machine.driver_data(); int x; int y; - for (y = rect->min_y; y <= rect->max_y; y++) + for (y = rect.min_y; y <= rect.max_y; y++) { - const UINT16* pLine = BITMAP_ADDR16(state->m_helper, y, 0); + const UINT16* pLine = &state->m_helper.pix16(y); - for (x = rect->min_x; x <= rect->max_x; x++) + for (x = rect.min_x; x <= rect.max_x; x++) if (pLine[x] != 0) return 1; } @@ -342,42 +342,42 @@ } -static int circle_collision(starshp1_state *state, const rectangle *rect) +static int circle_collision(starshp1_state *state, const rectangle &rect) { int center_x = get_circle_hpos(state); int center_y = get_circle_vpos(state); int r = get_radius(state); - return point_in_circle(rect->min_x, rect->min_y, center_x, center_y, r) || - point_in_circle(rect->min_x, rect->max_y, center_x, center_y, r) || - point_in_circle(rect->max_x, rect->min_y, center_x, center_y, r) || - point_in_circle(rect->max_x, rect->max_y, center_x, center_y, r); + return point_in_circle(rect.min_x, rect.min_y, center_x, center_y, r) || + point_in_circle(rect.min_x, rect.max_y, center_x, center_y, r) || + point_in_circle(rect.max_x, rect.min_y, center_x, center_y, r) || + point_in_circle(rect.max_x, rect.max_y, center_x, center_y, r); } -SCREEN_UPDATE( starshp1 ) +SCREEN_UPDATE_IND16( starshp1 ) { - starshp1_state *state = screen->machine().driver_data(); - set_pens(state, screen->machine().colortable); + starshp1_state *state = screen.machine().driver_data(); + set_pens(state, screen.machine().colortable); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (state->m_starfield_kill == 0) draw_starfield(state, bitmap); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); if (state->m_circle_kill == 0 && state->m_circle_mod != 0) - draw_circle(screen->machine(), bitmap); + draw_circle(screen.machine(), bitmap); if (state->m_attract == 0) - draw_spaceship(screen->machine(), bitmap, cliprect); + draw_spaceship(screen.machine(), bitmap, cliprect); if (state->m_circle_kill == 0 && state->m_circle_mod == 0) - draw_circle(screen->machine(), bitmap); + draw_circle(screen.machine(), bitmap); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_phasor != 0) draw_phasor(state, bitmap); @@ -386,40 +386,37 @@ } -SCREEN_EOF( starshp1 ) +SCREEN_VBLANK( starshp1 ) { - starshp1_state *state = machine.driver_data(); - rectangle rect; - const rectangle &visarea = machine.primary_screen->visible_area(); + // rising edge + if (vblank_on) + { + starshp1_state *state = screen.machine().driver_data(); + rectangle rect; + const rectangle &visarea = screen.machine().primary_screen->visible_area(); - rect.min_x = get_sprite_hpos(state, 13); - rect.min_y = get_sprite_vpos(state, 13); - rect.max_x = rect.min_x + machine.gfx[1]->width - 1; - rect.max_y = rect.min_y + machine.gfx[1]->height - 1; - - if (rect.min_x < 0) - rect.min_x = 0; - if (rect.min_y < 0) - rect.min_y = 0; - if (rect.max_x > state->m_helper->width - 1) - rect.max_x = state->m_helper->width - 1; - if (rect.max_y > state->m_helper->height - 1) - rect.max_y = state->m_helper->height - 1; + rect.min_x = get_sprite_hpos(state, 13); + rect.min_y = get_sprite_vpos(state, 13); + rect.max_x = rect.min_x + screen.machine().gfx[1]->width - 1; + rect.max_y = rect.min_y + screen.machine().gfx[1]->height - 1; - bitmap_fill(state->m_helper, &visarea, 0); + rect &= state->m_helper.cliprect(); - if (state->m_attract == 0) - draw_spaceship(machine, state->m_helper, &visarea); + state->m_helper.fill(0, visarea); - if (circle_collision(state, &visarea)) - state->m_collision_latch |= 1; + if (state->m_attract == 0) + draw_spaceship(screen.machine(), state->m_helper, visarea); - if (circle_collision(state, &rect)) - state->m_collision_latch |= 2; + if (circle_collision(state, visarea)) + state->m_collision_latch |= 1; - if (spaceship_collision(machine, state->m_helper, &rect)) - state->m_collision_latch |= 4; + if (circle_collision(state, rect)) + state->m_collision_latch |= 2; - if (spaceship_collision(machine, state->m_helper, &visarea)) - state->m_collision_latch |= 8; + if (spaceship_collision(screen.machine(), state->m_helper, rect)) + state->m_collision_latch |= 4; + + if (spaceship_collision(screen.machine(), state->m_helper, visarea)) + state->m_collision_latch |= 8; + } } diff -Nru mame-0.144/src/mame/video/stfight.c mame-0.145/src/mame/video/stfight.c --- mame-0.144/src/mame/video/stfight.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/stfight.c 2012-02-06 21:30:31.000000000 +0000 @@ -138,7 +138,7 @@ UINT8 attr = state->m_text_attr_ram[tile_index]; int color = attr & 0x0f; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO( 0, @@ -161,7 +161,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,fg_scan,16,16,128,256); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8,8,32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0x0f); + state->m_fg_tilemap->set_transparent_pen(0x0f); colortable_configure_tilemap_groups(machine.colortable, state->m_tx_tilemap, machine.gfx[0], 0xcf); } @@ -177,14 +177,14 @@ { stfight_state *state = space->machine().driver_data(); state->m_text_char_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( stfight_text_attr_w ) { stfight_state *state = space->machine().driver_data(); state->m_text_attr_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( stfight_sprite_bank_w ) @@ -207,32 +207,32 @@ case 0x00: case 0x01: scroll = (state->m_vh_latch_ram[1] << 8) | state->m_vh_latch_ram[0]; - tilemap_set_scrollx(state->m_fg_tilemap,0,scroll); + state->m_fg_tilemap->set_scrollx(0,scroll); break; case 0x02: case 0x03: scroll = (state->m_vh_latch_ram[3] << 8) | state->m_vh_latch_ram[2]; - tilemap_set_scrolly(state->m_fg_tilemap,0,scroll); + state->m_fg_tilemap->set_scrolly(0,scroll); break; case 0x04: case 0x05: scroll = (state->m_vh_latch_ram[5] << 8) | state->m_vh_latch_ram[4]; - tilemap_set_scrollx(state->m_bg_tilemap,0,scroll); + state->m_bg_tilemap->set_scrollx(0,scroll); break; case 0x06: case 0x08: scroll = (state->m_vh_latch_ram[8] << 8) | state->m_vh_latch_ram[6]; - tilemap_set_scrolly(state->m_bg_tilemap,0,scroll); + state->m_bg_tilemap->set_scrolly(0,scroll); break; case 0x07: - tilemap_set_enable(state->m_tx_tilemap,data & 0x80); + state->m_tx_tilemap->enable(data & 0x80); /* 0x40 = sprites */ - tilemap_set_enable(state->m_bg_tilemap,data & 0x20); - tilemap_set_enable(state->m_fg_tilemap,data & 0x10); + state->m_bg_tilemap->enable(data & 0x20); + state->m_fg_tilemap->enable(data & 0x10); flip_screen_set(space->machine(), data & 0x01); break; } @@ -244,7 +244,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { stfight_state *state = machine.driver_data(); int offs,sx,sy; @@ -292,21 +292,21 @@ } -SCREEN_UPDATE( stfight ) +SCREEN_UPDATE_IND16( stfight ) { - stfight_state *state = screen->machine().driver_data(); - set_pens(screen->machine()); + stfight_state *state = screen.machine().driver_data(); + set_pens(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap,cliprect,0); /* in case state->m_bg_tilemap is disabled */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,1); + bitmap.fill(0, cliprect); /* in case state->m_bg_tilemap is disabled */ + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,1); /* Draw sprites (may be obscured by foreground layer) */ if (state->m_vh_latch_ram[0x07] & 0x40) - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/stlforce.c mame-0.145/src/mame/video/stlforce.c --- mame-0.144/src/mame/video/stlforce.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/stlforce.c 2012-02-06 21:30:31.000000000 +0000 @@ -21,7 +21,7 @@ stlforce_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /* middle layer, low */ @@ -45,7 +45,7 @@ stlforce_state *state = space->machine().driver_data(); state->m_mlow_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_mlow_tilemap,offset); + state->m_mlow_tilemap->mark_tile_dirty(offset); } /* middle layer, high */ @@ -69,7 +69,7 @@ stlforce_state *state = space->machine().driver_data(); state->m_mhigh_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_mhigh_tilemap,offset); + state->m_mhigh_tilemap->mark_tile_dirty(offset); } /* text layer, appears to be the top layer */ @@ -94,12 +94,12 @@ stlforce_state *state = space->machine().driver_data(); state->m_tx_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } /* sprites - quite a bit still needs doing .. */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { stlforce_state *state = machine.driver_data(); const UINT16 *source = state->m_spriteram+0x0; @@ -131,56 +131,56 @@ } } -SCREEN_UPDATE( stlforce ) +SCREEN_UPDATE_IND16( stlforce ) { - stlforce_state *state = screen->machine().driver_data(); + stlforce_state *state = screen.machine().driver_data(); int i; if (state->m_vidattrram[6] & 1) { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_bg_scrollram[i]+9); //+9 for twinbrat + state->m_bg_tilemap->set_scrollx(i, state->m_bg_scrollram[i]+9); //+9 for twinbrat } else { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_bg_scrollram[0]+9); //+9 for twinbrat + state->m_bg_tilemap->set_scrollx(i, state->m_bg_scrollram[0]+9); //+9 for twinbrat } if (state->m_vidattrram[6] & 4) { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_mlow_tilemap, i, state->m_mlow_scrollram[i]+8); + state->m_mlow_tilemap->set_scrollx(i, state->m_mlow_scrollram[i]+8); } else { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_mlow_tilemap, i, state->m_mlow_scrollram[0]+8); + state->m_mlow_tilemap->set_scrollx(i, state->m_mlow_scrollram[0]+8); } if (state->m_vidattrram[6] & 0x10) { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_mhigh_tilemap, i, state->m_mhigh_scrollram[i]+8); + state->m_mhigh_tilemap->set_scrollx(i, state->m_mhigh_scrollram[i]+8); } else { for(i=0;i<256;i++) - tilemap_set_scrollx(state->m_mhigh_tilemap, i, state->m_mhigh_scrollram[0]+8); + state->m_mhigh_tilemap->set_scrollx(i, state->m_mhigh_scrollram[0]+8); } - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_vidattrram[1]); - tilemap_set_scrolly(state->m_mlow_tilemap, 0, state->m_vidattrram[2]); - tilemap_set_scrolly(state->m_mhigh_tilemap, 0, state->m_vidattrram[3]); + state->m_bg_tilemap->set_scrolly(0, state->m_vidattrram[1]); + state->m_mlow_tilemap->set_scrolly(0, state->m_vidattrram[2]); + state->m_mhigh_tilemap->set_scrolly(0, state->m_vidattrram[3]); - tilemap_set_scrollx(state->m_tx_tilemap, 0, state->m_vidattrram[0]+8); - tilemap_set_scrolly(state->m_tx_tilemap, 0,state->m_vidattrram[4]); + state->m_tx_tilemap->set_scrollx(0, state->m_vidattrram[0]+8); + state->m_tx_tilemap->set_scrolly(0,state->m_vidattrram[4]); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_mlow_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_mhigh_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_mlow_tilemap->draw(bitmap, cliprect, 0,0); + state->m_mhigh_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); return 0; } @@ -193,11 +193,11 @@ state->m_mhigh_tilemap = tilemap_create(machine, get_stlforce_mhigh_tile_info,tilemap_scan_cols, 16,16,64,16); state->m_tx_tilemap = tilemap_create(machine, get_stlforce_tx_tile_info, tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_mlow_tilemap,0); - tilemap_set_transparent_pen(state->m_mhigh_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); - - tilemap_set_scroll_rows(state->m_bg_tilemap, 256); - tilemap_set_scroll_rows(state->m_mlow_tilemap, 256); - tilemap_set_scroll_rows(state->m_mhigh_tilemap, 256); + state->m_mlow_tilemap->set_transparent_pen(0); + state->m_mhigh_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); + + state->m_bg_tilemap->set_scroll_rows(256); + state->m_mlow_tilemap->set_scroll_rows(256); + state->m_mhigh_tilemap->set_scroll_rows(256); } diff -Nru mame-0.144/src/mame/video/strnskil.c mame-0.145/src/mame/video/strnskil.c --- mame-0.144/src/mame/video/strnskil.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/strnskil.c 2012-02-06 21:30:31.000000000 +0000 @@ -46,7 +46,7 @@ strnskil_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( strnskil_scrl_ctrl_w ) @@ -57,7 +57,7 @@ if (flip_screen_get(space->machine()) != (data & 0x08)) { flip_screen_set(space->machine(), data & 0x08); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -78,10 +78,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { strnskil_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -123,11 +123,11 @@ } } -SCREEN_UPDATE( strnskil ) +SCREEN_UPDATE_IND16( strnskil ) { - strnskil_state *state = screen->machine().driver_data(); + strnskil_state *state = screen.machine().driver_data(); int row; - const UINT8 *usr1 = screen->machine().region("user1")->base(); + const UINT8 *usr1 = screen.machine().region("user1")->base(); for (row = 0; row < 32; row++) { @@ -136,16 +136,16 @@ switch (usr1[state->m_scrl_ctrl * 32 + row]) { case 2: - tilemap_set_scrollx(state->m_bg_tilemap, row, -~state->m_xscroll[1]); + state->m_bg_tilemap->set_scrollx(row, -~state->m_xscroll[1]); break; case 4: - tilemap_set_scrollx(state->m_bg_tilemap, row, -~state->m_xscroll[0]); + state->m_bg_tilemap->set_scrollx(row, -~state->m_xscroll[0]); break; } } } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/stvvdp1.c mame-0.145/src/mame/video/stvvdp1.c --- mame-0.144/src/mame/video/stvvdp1.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/stvvdp1.c 2012-02-06 21:30:33.000000000 +0000 @@ -705,7 +705,7 @@ *ng2 = g2; } -static void stv_vdp1_setup_shading(running_machine &machine,const struct spoint* q, const rectangle *cliprect) +static void stv_vdp1_setup_shading(running_machine &machine,const struct spoint* q, const rectangle &cliprect) { INT32 x1, x2, delta, cury, limy; INT32 r1, g1, b1, r2, g2, b2; @@ -865,7 +865,7 @@ for ( cury = stv_vdp1_shading_data->sy; cury <= stv_vdp1_shading_data->ey; cury++ ) { - while( (stv_vdp1_shading_data->scanline[cury].x[0] >> 16) < cliprect->min_x ) + while( (stv_vdp1_shading_data->scanline[cury].x[0] >> 16) < cliprect.min_x ) { stv_vdp1_shading_data->scanline[cury].x[0] += (1 << FRAC_SHIFT); stv_vdp1_shading_data->scanline[cury].b[0] += stv_vdp1_shading_data->scanline[cury].db; @@ -1123,16 +1123,16 @@ } -static void vdp1_fill_slope(running_machine &machine, const rectangle *cliprect, int patterndata, int xsize, +static void vdp1_fill_slope(running_machine &machine, const rectangle &cliprect, int patterndata, int xsize, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 *nx1, INT32 *nx2, INT32 u1, INT32 u2, INT32 slu1, INT32 slu2, INT32 *nu1, INT32 *nu2, INT32 v1, INT32 v2, INT32 slv1, INT32 slv2, INT32 *nv1, INT32 *nv2, INT32 _y1, INT32 y2) { - if(_y1 > cliprect->max_y) + if(_y1 > cliprect.max_y) return; - if(y2 <= cliprect->min_y) { + if(y2 <= cliprect.min_y) { int delta = y2-_y1; *nx1 = x1+delta*sl1; *nu1 = u1+delta*slu1; @@ -1143,18 +1143,18 @@ return; } - if(y2 > cliprect->max_y) - y2 = cliprect->max_y+1; + if(y2 > cliprect.max_y) + y2 = cliprect.max_y+1; - if(_y1 < cliprect->min_y) { - int delta = cliprect->min_y - _y1; + if(_y1 < cliprect.min_y) { + int delta = cliprect.min_y - _y1; x1 += delta*sl1; u1 += delta*slu1; v1 += delta*slv1; x2 += delta*sl2; u2 += delta*slu2; v2 += delta*slv2; - _y1 = cliprect->min_y; + _y1 = cliprect.min_y; } if(x1 > x2 || (x1==x2 && sl1 > sl2)) { @@ -1191,7 +1191,7 @@ } while(_y1 < y2) { - if(_y1 >= cliprect->min_y) { + if(_y1 >= cliprect.min_y) { INT32 slux = 0, slvx = 0; int xx1 = x1>>FRAC_SHIFT; int xx2 = x2>>FRAC_SHIFT; @@ -1202,15 +1202,15 @@ slux = (u2-u1)/delta; slvx = (v2-v1)/delta; } - if(xx1 <= cliprect->max_x || xx2 >= cliprect->min_x) { - if(xx1 < cliprect->min_x) { - int delta = cliprect->min_x-xx1; + if(xx1 <= cliprect.max_x || xx2 >= cliprect.min_x) { + if(xx1 < cliprect.min_x) { + int delta = cliprect.min_x-xx1; u += slux*delta; v += slvx*delta; - xx1 = cliprect->min_x; + xx1 = cliprect.min_x; } - if(xx2 > cliprect->max_x) - xx2 = cliprect->max_x; + if(xx2 > cliprect.max_x) + xx2 = cliprect.max_x; while(xx1 <= xx2) { drawpixel(machine,xx1,_y1, @@ -1239,16 +1239,16 @@ *nv2 = v2; } -static void vdp1_fill_line(running_machine &machine, const rectangle *cliprect, int patterndata, int xsize, INT32 y, +static void vdp1_fill_line(running_machine &machine, const rectangle &cliprect, int patterndata, int xsize, INT32 y, INT32 x1, INT32 x2, INT32 u1, INT32 u2, INT32 v1, INT32 v2) { int xx1 = x1>>FRAC_SHIFT; int xx2 = x2>>FRAC_SHIFT; - if(y > cliprect->max_y || y < cliprect->min_y) + if(y > cliprect.max_y || y < cliprect.min_y) return; - if(xx1 <= cliprect->max_x || xx2 >= cliprect->min_x) { + if(xx1 <= cliprect.max_x || xx2 >= cliprect.min_x) { INT32 slux = 0, slvx = 0; INT32 u = u1; INT32 v = v1; @@ -1257,14 +1257,14 @@ slux = (u2-u1)/delta; slvx = (v2-v1)/delta; } - if(xx1 < cliprect->min_x) { - int delta = cliprect->min_x-xx1; + if(xx1 < cliprect.min_x) { + int delta = cliprect.min_x-xx1; u += slux*delta; v += slvx*delta; - xx1 = cliprect->min_x; + xx1 = cliprect.min_x; } - if(xx2 > cliprect->max_x) - xx2 = cliprect->max_x; + if(xx2 > cliprect.max_x) + xx2 = cliprect.max_x; while(xx1 <= xx2) { drawpixel(machine,xx1,y, @@ -1277,7 +1277,7 @@ } } -static void vdp1_fill_quad(running_machine &machine, const rectangle *cliprect, int patterndata, int xsize, const struct spoint *q) +static void vdp1_fill_quad(running_machine &machine, const rectangle &cliprect, int patterndata, int xsize, const struct spoint *q) { INT32 sl1, sl2, slu1, slu2, slv1, slv2, cury, limy, x1, x2, u1, u2, v1, v2, delta; int pmin, pmax, i, ps1, ps2; @@ -1321,13 +1321,13 @@ return; } - if(cury > cliprect->max_y) + if(cury > cliprect.max_y) return; - if(limy <= cliprect->min_y) + if(limy <= cliprect.min_y) return; - if(limy > cliprect->max_y) - limy = cliprect->max_y; + if(limy > cliprect.max_y) + limy = cliprect.max_y; ps1 = pmin+4; ps2 = pmin; @@ -1428,7 +1428,7 @@ return (INT32)(INT16)v + state->m_vdp1.local_y; } -static void stv_vdp1_draw_line(running_machine &machine, const rectangle *cliprect) +static void stv_vdp1_draw_line(running_machine &machine, const rectangle &cliprect) { struct spoint q[4]; @@ -1447,7 +1447,7 @@ vdp1_fill_quad(machine, cliprect, 0, 1, q); } -static void stv_vdp1_draw_poly_line(running_machine &machine, const rectangle *cliprect) +static void stv_vdp1_draw_poly_line(running_machine &machine, const rectangle &cliprect) { struct spoint q[4]; @@ -1510,7 +1510,7 @@ } -static void stv_vpd1_draw_distorted_sprite(running_machine &machine, const rectangle *cliprect) +static void stv_vpd1_draw_distorted_sprite(running_machine &machine, const rectangle &cliprect) { struct spoint q[4]; @@ -1568,7 +1568,7 @@ vdp1_fill_quad(machine, cliprect, patterndata, xsize, q); } -static void stv_vpd1_draw_scaled_sprite(running_machine &machine, const rectangle *cliprect) +static void stv_vpd1_draw_scaled_sprite(running_machine &machine, const rectangle &cliprect) { struct spoint q[4]; @@ -1716,7 +1716,7 @@ } -static void stv_vpd1_draw_normal_sprite(running_machine &machine, const rectangle *cliprect, int sprite_type) +static void stv_vpd1_draw_normal_sprite(running_machine &machine, const rectangle &cliprect, int sprite_type) { //UINT16 *destline; //saturn_state *state = machine.driver_data(); @@ -1747,8 +1747,8 @@ if (VDP1_LOG) logerror ("Drawing Normal Sprite x %04x y %04x xsize %04x ysize %04x patterndata %06x\n",x,y,xsize,ysize,patterndata); - if ( x > cliprect->max_x ) return; - if ( y > cliprect->max_y ) return; + if ( x > cliprect.max_x ) return; + if ( y > cliprect.max_y ) return; shading = stv_read_gouraud_table(machine); if ( shading ) @@ -1775,20 +1775,20 @@ duy = -xsize; u += xsize*(ysize-1); } - if ( y < cliprect->min_y ) //clip y + if ( y < cliprect.min_y ) //clip y { - u += xsize*(cliprect->min_y - y); - ysize -= (cliprect->min_y - y); - y = cliprect->min_y; + u += xsize*(cliprect.min_y - y); + ysize -= (cliprect.min_y - y); + y = cliprect.min_y; } - if ( x < cliprect->min_x ) //clip x + if ( x < cliprect.min_x ) //clip x { - u += dux*(cliprect->min_x - x); - xsize -= (cliprect->min_x - x); - x = cliprect->min_x; + u += dux*(cliprect.min_x - x); + xsize -= (cliprect.min_x - x); + x = cliprect.min_x; } - maxdrawypos = MIN(y+ysize-1,cliprect->max_y); - maxdrawxpos = MIN(x+xsize-1,cliprect->max_x); + maxdrawypos = MIN(y+ysize-1,cliprect.max_y); + maxdrawxpos = MIN(x+xsize-1,cliprect.max_x); for (drawypos = y; drawypos <= maxdrawypos; drawypos++ ) { //destline = state->m_vdp1.framebuffer_draw_lines[drawypos]; @@ -1961,13 +1961,13 @@ case 0x0000: if (VDP1_LOG) logerror ("Sprite List Normal Sprite (%d %d)\n",stv2_current_sprite.CMDXA,stv2_current_sprite.CMDYA); stv2_current_sprite.ispoly = 0; - stv_vpd1_draw_normal_sprite(machine, cliprect, 0); + stv_vpd1_draw_normal_sprite(machine, *cliprect, 0); break; case 0x0001: if (VDP1_LOG) logerror ("Sprite List Scaled Sprite (%d %d)\n",stv2_current_sprite.CMDXA,stv2_current_sprite.CMDYA); stv2_current_sprite.ispoly = 0; - stv_vpd1_draw_scaled_sprite(machine, cliprect); + stv_vpd1_draw_scaled_sprite(machine, *cliprect); break; case 0x0002: @@ -1979,41 +1979,35 @@ if (VDP1_LOG) logerror ("CMDPMOD = %04x\n",stv2_current_sprite.CMDPMOD); stv2_current_sprite.ispoly = 0; - stv_vpd1_draw_distorted_sprite(machine, cliprect); + stv_vpd1_draw_distorted_sprite(machine, *cliprect); break; case 0x0004: if (VDP1_LOG) logerror ("Sprite List Polygon\n"); stv2_current_sprite.ispoly = 1; - stv_vpd1_draw_distorted_sprite(machine, cliprect); + stv_vpd1_draw_distorted_sprite(machine, *cliprect); break; case 0x0005: if (VDP1_LOG) logerror ("Sprite List Polyline\n"); stv2_current_sprite.ispoly = 1; - stv_vdp1_draw_poly_line(machine, cliprect); + stv_vdp1_draw_poly_line(machine, *cliprect); break; case 0x0006: if (VDP1_LOG) logerror ("Sprite List Line\n"); stv2_current_sprite.ispoly = 1; - stv_vdp1_draw_line(machine, cliprect); + stv_vdp1_draw_line(machine, *cliprect); break; case 0x0008: if (VDP1_LOG) logerror ("Sprite List Set Command for User Clipping (%d,%d),(%d,%d)\n", stv2_current_sprite.CMDXA, stv2_current_sprite.CMDYA, stv2_current_sprite.CMDXC, stv2_current_sprite.CMDYC); - state->m_vdp1.user_cliprect.min_x = stv2_current_sprite.CMDXA; - state->m_vdp1.user_cliprect.min_y = stv2_current_sprite.CMDYA; - state->m_vdp1.user_cliprect.max_x = stv2_current_sprite.CMDXC; - state->m_vdp1.user_cliprect.max_y = stv2_current_sprite.CMDYC; + state->m_vdp1.user_cliprect.set(stv2_current_sprite.CMDXA, stv2_current_sprite.CMDXC, stv2_current_sprite.CMDYA, stv2_current_sprite.CMDYC); break; case 0x0009: if (VDP1_LOG) logerror ("Sprite List Set Command for System Clipping (0,0),(%d,%d)\n", stv2_current_sprite.CMDXC, stv2_current_sprite.CMDYC); - state->m_vdp1.system_cliprect.min_x = 0; - state->m_vdp1.system_cliprect.min_y = 0; - state->m_vdp1.system_cliprect.max_x = stv2_current_sprite.CMDXC; - state->m_vdp1.system_cliprect.max_y = stv2_current_sprite.CMDYC; + state->m_vdp1.system_cliprect.set(0, stv2_current_sprite.CMDXC, 0, stv2_current_sprite.CMDYC); break; case 0x000a: @@ -2178,13 +2172,9 @@ stv_clear_framebuffer(machine, state->m_vdp1.framebuffer_current_draw); state->m_vdp1.framebuffer_clear_on_next_frame = 0; - state->m_vdp1.system_cliprect.min_x = state->m_vdp1.system_cliprect.max_x = 0; - state->m_vdp1.system_cliprect.min_y = state->m_vdp1.system_cliprect.max_y = 0; + state->m_vdp1.system_cliprect.set(0, 0, 0, 0); /* Kidou Senshi Z Gundam - Zenpen Zeta no Kodou loves to use the user cliprect vars in an undefined state ... */ - state->m_vdp1.user_cliprect.min_x = 0; - state->m_vdp1.user_cliprect.min_y = 0; - state->m_vdp1.user_cliprect.max_x = 512; - state->m_vdp1.user_cliprect.max_y = 256; + state->m_vdp1.user_cliprect.set(0, 512, 0, 256); // save state state_save_register_global_pointer(machine, state->m_vdp1_regs, 0x020/2); diff -Nru mame-0.144/src/mame/video/stvvdp2.c mame-0.145/src/mame/video/stvvdp2.c --- mame-0.144/src/mame/video/stvvdp2.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/stvvdp2.c 2012-02-06 21:30:33.000000000 +0000 @@ -104,6 +104,7 @@ #include "emu.h" #include "profiler.h" #include "includes/stv.h" +#include "drawgfxm.h" static UINT8 get_vblank(running_machine &machine); static UINT8 get_hblank(running_machine &machine); @@ -114,9 +115,9 @@ static void refresh_palette_data(running_machine &machine); static int stv_vdp2_window_process(running_machine &machine,int x,int y); -static int stv_vdp2_apply_window_on_layer(running_machine &machine,rectangle *cliprect); +static int stv_vdp2_apply_window_on_layer(running_machine &machine,rectangle &cliprect); static void stv_vdp2_get_window0_coordinates(running_machine &machine,UINT16 *s_x, UINT16 *e_x, UINT16 *s_y, UINT16 *e_y); -static void stv_vdp2_check_tilemap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect); +static void stv_vdp2_check_tilemap(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect); enum { @@ -2433,21 +2434,18 @@ return access_command_ok == 3 ? 1 : 0; } -INLINE UINT16 stv_add_blend(UINT16 a, UINT16 b) +INLINE UINT32 stv_add_blend(UINT32 a, UINT32 b) { - UINT16 _r = ((a & 0x7c00) >> 10) + ((b & 0x7c00) >> 10); - UINT16 _g = ((a & 0x03e0) >> 5) + ((b & 0x03e0) >> 5); - UINT16 _b = ((a & 0x001f) >> 0) + ((b & 0x001f) >> 0); - - if ( _r > 0x1f ) _r = 0x1f; - if ( _g > 0x1f ) _g = 0x1f; - if ( _b > 0x1f ) _b = 0x1f; - - return (_r<<10) | (_g<<5) | (_b<<0); + UINT32 rb = (a & 0xff00ff) + (b & 0xff00ff); + UINT32 g = (a & 0x00ff00) + (b & 0x00ff00); + if (rb & 0x1000000) rb |= 0xff0000; + if (g & 0x10000) g = 0xff00; + if (rb & 0x100) rb |= 0xff; + return (rb & 0xff00ff) | g; } static void stv_vdp2_drawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int transparency,int transparent_color,int scalex, int scaley, int sprite_screen_width, int sprite_screen_height, int alpha) @@ -2479,20 +2477,8 @@ /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); if( gfx ) { @@ -2536,31 +2522,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -2570,80 +2553,39 @@ /* case 0: STV_TRANSPARENCY_NONE */ if (transparency == STV_TRANSPARENCY_NONE) { - if (gfx->flags & GFX_ELEMENT_PACKED) + for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>17] >> ((x_index & 0x10000) >> 14)) & 0x0f]; - x_index += dx; - } + const UINT8 *source = source_base + (y_index>>16) * gfx->line_modulo; + UINT32 *dest = &dest_bmp.pix32(y); - y_index += dy; - } - } - else - { - for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>16]]; - x_index += dx; - } - - y_index += dy; + dest[x] = pal[source[x_index>>16]]; + x_index += dx; } + + y_index += dy; } } /* case 1: STV_TRANSPARENCY_PEN */ if (transparency == STV_TRANSPARENCY_PEN) { - if (gfx->flags & GFX_ELEMENT_PACKED) + for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>17] >> ((x_index & 0x10000) >> 14)) & 0x0f; - if( c != transparent_color ) dest[x] = pal[c]; - x_index += dx; - } + const UINT8 *source = source_base + (y_index>>16) * gfx->line_modulo; + UINT32 *dest = &dest_bmp.pix32(y); - y_index += dy; - } - } - else - { - for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) dest[x] = pal[c]; - x_index += dx; - } - - y_index += dy; + int c = source[x_index>>16]; + if( c != transparent_color ) dest[x] = pal[c]; + x_index += dx; } + + y_index += dy; } } @@ -2653,13 +2595,13 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); int x, x_index = x_index_base; for( x=sx; x>16]; - if( c != transparent_color ) dest[x] = alpha_blend_r16(dest[x], pal[c], alpha); + if( c != transparent_color ) dest[x] = alpha_blend_r32(dest[x], pal[c], alpha); x_index += dx; } @@ -2670,41 +2612,20 @@ /* case : STV_TRANSPARENCY_ADD_BLEND */ if (transparency == STV_TRANSPARENCY_ADD_BLEND ) { - if (gfx->flags & GFX_ELEMENT_PACKED) + for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>17] >> ((x_index & 0x10000) >> 14)) & 0x0f; - if( c != transparent_color ) dest[x] = stv_add_blend(dest[x],pal[c]); - x_index += dx; - } + const UINT8 *source = source_base + (y_index>>16) * gfx->line_modulo; + UINT32 *dest = &dest_bmp.pix32(y); - y_index += dy; - } - } - else - { - for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) dest[x] = stv_add_blend(dest[x],pal[c]); - x_index += dx; - } - - y_index += dy; + int c = source[x_index>>16]; + if( c != transparent_color ) dest[x] = stv_add_blend(dest[x],pal[c]); + x_index += dx; } + + y_index += dy; } } @@ -2714,12 +2635,9 @@ } -static void stv_vdp2_compute_color_offset_RGB555( running_machine &machine,int *r, int *g, int *b, int cor ) +static void stv_vdp2_compute_color_offset( running_machine &machine,int *r, int *g, int *b, int cor ) { saturn_state *state = machine.driver_data(); - *r <<= 3; - *g <<= 3; - *b <<= 3; if ( cor == 0 ) { *r = (STV_VDP2_COAR & 0x100) ? (*r - (0x100 - (STV_VDP2_COAR & 0xff))) : ((STV_VDP2_COAR & 0xff) + *r); @@ -2738,18 +2656,14 @@ if(*g > 0xff) { *g = 0xff; } if(*b < 0) { *b = 0; } if(*b > 0xff) { *b = 0xff; } - *r >>= 3; - *g >>= 3; - *b >>= 3; - } -static void stv_vdp2_compute_color_offset_RGB555_UINT16(running_machine &machine,UINT16 *rgb, int cor) +static void stv_vdp2_compute_color_offset_UINT32(running_machine &machine,UINT32 *rgb, int cor) { saturn_state *state = machine.driver_data(); - int _r = (*rgb & 0x7c00) >> (10-3); - int _g = (*rgb & 0x03e0) >> (5-3); - int _b = (*rgb & 0x001f) << 3; + int _r = RGB_RED(*rgb); + int _g = RGB_GREEN(*rgb); + int _b = RGB_BLUE(*rgb); if ( cor == 0 ) { _r = (STV_VDP2_COAR & 0x100) ? (_r - (0x100 - (STV_VDP2_COAR & 0xff))) : ((STV_VDP2_COAR & 0xff) + _r); @@ -2768,14 +2682,11 @@ if(_g > 0xff) { _g = 0xff; } if(_b < 0) { _b = 0; } if(_b > 0xff) { _b = 0xff; } - _r >>= 3; - _g >>= 3; - _b >>= 3; - *rgb = (_r << 10) | (_g << 5) | _b; + *rgb = MAKE_RGB(_r, _g, _b); } -static void stv_vdp2_drawgfx_rgb555( bitmap_t *dest_bmp, const rectangle *clip, running_machine &machine, UINT32 code, int flipx, int flipy, +static void stv_vdp2_drawgfx_rgb555( bitmap_rgb32 &dest_bmp, const rectangle &clip, running_machine &machine, UINT32 code, int flipx, int flipy, int sx, int sy, int transparency, int alpha) { saturn_state *state = machine.driver_data(); @@ -2788,20 +2699,9 @@ sprite_screen_width = sprite_screen_height = 8; /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; + myclip = clip; + myclip &= dest_bmp.cliprect(); - clip=&myclip; - } { int dx = stv2_current_tilemap.incx; int dy = stv2_current_tilemap.incy; @@ -2832,31 +2732,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -2866,7 +2763,7 @@ for( y=sy; y>16)*16; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); UINT16 data; int x, x_index = x_index_base; @@ -2878,16 +2775,16 @@ t_pen = (data & 0x8000) || ( transparency == STV_TRANSPARENCY_NONE ); if (t_pen) { - b = (data & 0x7c00) >> 10; - g = (data & 0x03e0) >> 5; - r = (data & 0x001f); + b = (data & 0x7c00) >> 7; + g = (data & 0x03e0) >> 2; + r = (data & 0x001f) << 3; if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); if ( transparency == STV_TRANSPARENCY_ALPHA ) - dest[x] = alpha_blend_r16( dest[x], b | g << 5 | r << 10, alpha ); + dest[x] = alpha_blend_r32( dest[x], MAKE_RGB(r, g, b), alpha ); else - dest[x] = b | g << 5 | r << 10; + dest[x] = MAKE_RGB(r, g, b); } x_index += dx; } @@ -2902,7 +2799,7 @@ } -static void stv_vdp2_drawgfx_rgb888( bitmap_t *dest_bmp, const rectangle *clip, running_machine &machine, UINT32 code, int flipx, int flipy, +static void stv_vdp2_drawgfx_rgb888( bitmap_rgb32 &dest_bmp, const rectangle &clip, running_machine &machine, UINT32 code, int flipx, int flipy, int sx, int sy, int transparency, int alpha) { saturn_state *state = machine.driver_data(); @@ -2915,20 +2812,8 @@ sprite_screen_width = sprite_screen_height = 8; /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); { int dx = stv2_current_tilemap.incx; int dy = stv2_current_tilemap.incy; @@ -2959,31 +2844,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -2993,7 +2875,7 @@ for( y=sy; y>16)*32; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); UINT32 data; int x, x_index = x_index_base; @@ -3009,18 +2891,14 @@ b = (data & 0xff0000) >> 16; g = (data & 0x00ff00) >> 8; r = (data & 0x0000ff); - /* HACK: downscale because we don't yet do true color */ - b >>= 3; - g >>= 3; - r >>= 3; if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); if ( transparency == STV_TRANSPARENCY_ALPHA ) - dest[x] = alpha_blend_r16( dest[x], b | g << 5 | r << 10, alpha ); + dest[x] = alpha_blend_r32( dest[x], MAKE_RGB(r, g, b), alpha ); else - dest[x] = b | g << 5 | r << 10; + dest[x] = MAKE_RGB(r, g, b); } x_index += dx; } @@ -3034,7 +2912,7 @@ } -static void stv_vdp2_draw_basic_bitmap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_basic_bitmap(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); @@ -3047,7 +2925,7 @@ int xlinesize = 0/*, xpixelsize = 0*/; int xcnt,ycnt; UINT8* gfxdata = state->m_vdp2.gfx_decode; - static UINT16 *destline; + static UINT32 *destline; UINT16 pal_color_offset = 0; UINT8* gfxdatalow, *gfxdatahigh; /*Window effect 1=no draw*/ @@ -3125,9 +3003,9 @@ if (((xcnt + 1) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - *BITMAP_ADDR16(bitmap, ycnt, xcnt+1) = machine.pens[((gfxdata[0] & 0x0f) >> 0) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; + bitmap.pix32(ycnt, xcnt+1) = machine.pens[((gfxdata[0] & 0x0f) >> 0) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; else - *BITMAP_ADDR16(bitmap, ycnt, xcnt+1) = alpha_blend_r16(*BITMAP_ADDR16(bitmap, ycnt, xcnt+1), machine.pens[((gfxdata[0] & 0x0f) >> 0) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); + bitmap.pix32(ycnt, xcnt+1) = alpha_blend_r32(bitmap.pix32(ycnt, xcnt+1), machine.pens[((gfxdata[0] & 0x0f) >> 0) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); } } } @@ -3141,9 +3019,9 @@ if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = machine.pens[((gfxdata[0] & 0xf0) >> 4) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; + bitmap.pix32(ycnt, xcnt) = machine.pens[((gfxdata[0] & 0xf0) >> 4) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; else - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = alpha_blend_r16(*BITMAP_ADDR16(bitmap, ycnt, xcnt), machine.pens[((gfxdata[0] & 0xf0) >> 4) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); + bitmap.pix32(ycnt, xcnt) = alpha_blend_r32(bitmap.pix32(ycnt, xcnt), machine.pens[((gfxdata[0] & 0xf0) >> 4) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); } } } @@ -3157,11 +3035,11 @@ { //int gfx_wraparound = -1; - gfxdata += xlinesize*cliprect->min_y; + gfxdata += xlinesize*cliprect.min_y; - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y; ycnt++) + for (ycnt = cliprect.min_y; ycnt <= cliprect.max_y; ycnt++) { - for (xcnt = cliprect->min_x; xcnt <= cliprect->max_x; xcnt++) + for (xcnt = cliprect.min_x; xcnt <= cliprect.max_x; xcnt++) { int xs = xcnt & xsizemask; @@ -3176,9 +3054,9 @@ if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; + bitmap.pix32(ycnt, xcnt) = machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; else - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = alpha_blend_r16(*BITMAP_ADDR16(bitmap, ycnt, xcnt), machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); + bitmap.pix32(ycnt, xcnt) = alpha_blend_r32(bitmap.pix32(ycnt, xcnt), machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); } } } @@ -3202,14 +3080,14 @@ else { int xx, xs, yy=0; - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y; yy+=stv2_current_tilemap.incy, ycnt++ ) + for (ycnt = cliprect.min_y; ycnt <= cliprect.max_y; yy+=stv2_current_tilemap.incy, ycnt++ ) { gfxdata += xlinesize*(yy>>16); yy &= 0xffff; - destline = BITMAP_ADDR16(bitmap, ycnt, 0); + destline = &bitmap.pix32(ycnt); xx = 0; - for (xcnt = cliprect->min_x; xcnt <= cliprect->max_x; xx+=stv2_current_tilemap.incx, xcnt++) + for (xcnt = cliprect.min_x; xcnt <= cliprect.max_x; xx+=stv2_current_tilemap.incx, xcnt++) { xs = xx >> 16; tw = stv_vdp2_window_process(machine,xcnt,ycnt); @@ -3222,9 +3100,9 @@ if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; + bitmap.pix32(ycnt, xcnt) = machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset]; else - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = alpha_blend_r16(*BITMAP_ADDR16(bitmap, ycnt, xcnt), machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); + bitmap.pix32(ycnt, xcnt) = alpha_blend_r32(bitmap.pix32(ycnt, xcnt), machine.pens[(gfxdata[xs] & 0xff) | (stv2_current_tilemap.bitmap_palette_number * 0x100) | pal_color_offset], stv2_current_tilemap.alpha); } } } @@ -3250,9 +3128,9 @@ if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = machine.pens[((gfxdata[0] & 0x07) * 0x100) | (gfxdata[1] & 0xff) | pal_color_offset]; + bitmap.pix32(ycnt, xcnt) = machine.pens[((gfxdata[0] & 0x07) * 0x100) | (gfxdata[1] & 0xff) | pal_color_offset]; else - *BITMAP_ADDR16(bitmap, ycnt, xcnt) = alpha_blend_r16(*BITMAP_ADDR16(bitmap, ycnt, xcnt), machine.pens[((gfxdata[0] & 0x07) * 0x100) | (gfxdata[1] & 0xff) | pal_color_offset], stv2_current_tilemap.alpha); + bitmap.pix32(ycnt, xcnt) = alpha_blend_r32(bitmap.pix32(ycnt, xcnt), machine.pens[((gfxdata[0] & 0x07) * 0x100) | (gfxdata[1] & 0xff) | pal_color_offset], stv2_current_tilemap.alpha); } } } @@ -3273,13 +3151,13 @@ if ( stv2_current_tilemap.incx == 0x10000 && stv2_current_tilemap.incy == 0x10000 ) { /* adjust for cliprect */ - gfxdata += xlinesize*cliprect->min_y; + gfxdata += xlinesize*cliprect.min_y; - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y; ycnt++) + for (ycnt = cliprect.min_y; ycnt <= cliprect.max_y; ycnt++) { - destline = BITMAP_ADDR16(bitmap, ycnt, 0); + destline = &bitmap.pix32(ycnt); - for (xcnt = cliprect->min_x; xcnt <= cliprect->max_x; xcnt++) + for (xcnt = cliprect.min_x; xcnt <= cliprect.max_x; xcnt++) { int r,g,b; int xs = xcnt & xsizemask; @@ -3288,20 +3166,20 @@ if(t_pen) { - b = ((gfxdata[2*xs] & 0x7c) >> 2); - g = ((gfxdata[2*xs] & 0x03) << 3) | ((gfxdata[2*xs+1] & 0xe0) >> 5); - r = ((gfxdata[2*xs+1] & 0x1f)); + b = ((gfxdata[2*xs] & 0x7c) << 1); + g = ((gfxdata[2*xs] & 0x03) << 6) | ((gfxdata[2*xs+1] & 0xe0) >> 2); + r = ((gfxdata[2*xs+1] & 0x1f) << 3); if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); tw = stv_vdp2_window_process(machine,xcnt,ycnt); if(tw == 0) { if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - destline[xcnt] = b | g << 5 | r << 10; + destline[xcnt] = MAKE_RGB(r, g, b); else - destline[xcnt] = alpha_blend_r16( destline[xcnt], b | g << 5 | r << 10, stv2_current_tilemap.alpha ); + destline[xcnt] = alpha_blend_r32( destline[xcnt], MAKE_RGB(r, g, b), stv2_current_tilemap.alpha ); } } } @@ -3318,25 +3196,25 @@ { int xx, xs, yy=0; - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y; yy+=stv2_current_tilemap.incy, ycnt++ ) + for (ycnt = cliprect.min_y; ycnt <= cliprect.max_y; yy+=stv2_current_tilemap.incy, ycnt++ ) { gfxdata += xlinesize*(yy>>16); yy &= 0xffff; - destline = BITMAP_ADDR16(bitmap, ycnt, 0); + destline = &bitmap.pix32(ycnt); xx = 0; - for (xcnt = cliprect->min_x; xcnt <= cliprect->max_x; xx+=stv2_current_tilemap.incx, xcnt++) + for (xcnt = cliprect.min_x; xcnt <= cliprect.max_x; xx+=stv2_current_tilemap.incx, xcnt++) { int r,g,b; xs = xx >> 16; t_pen = ((gfxdata[2*xs] & 0x80) >> 7); if(stv2_current_tilemap.transparency == STV_TRANSPARENCY_NONE) t_pen = 1; - b = ((gfxdata[2*xs] & 0x7c) >> 2); - g = ((gfxdata[2*xs] & 0x03) << 3) | ((gfxdata[2*xs+1] & 0xe0) >> 5); - r = ((gfxdata[2*xs+1] & 0x1f)); + b = ((gfxdata[2*xs] & 0x7c) << 1); + g = ((gfxdata[2*xs] & 0x03) << 6) | ((gfxdata[2*xs+1] & 0xe0) >> 2); + r = ((gfxdata[2*xs+1] & 0x1f) << 3); if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555(machine, &r,&g,&b,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset(machine, &r,&g,&b,stv2_current_tilemap.fade_control & 2); tw = stv_vdp2_window_process(machine,xcnt,ycnt); if(tw == 0) { @@ -3345,9 +3223,9 @@ if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 1 ) - destline[xcnt] = alpha_blend_r16( destline[xcnt], b | g << 5 | r << 10, stv2_current_tilemap.alpha ); + destline[xcnt] = alpha_blend_r32( destline[xcnt], MAKE_RGB(r, g, b), stv2_current_tilemap.alpha ); else - destline[xcnt] = b | g << 5 | r << 10; + destline[xcnt] = MAKE_RGB(r, g, b); } } } @@ -3369,13 +3247,13 @@ */ case 4: /* adjust for cliprect */ - gfxdata += xlinesize*(cliprect->min_y); + gfxdata += xlinesize*(cliprect.min_y); - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y; ycnt++) + for (ycnt = cliprect.min_y; ycnt <= cliprect.max_y; ycnt++) { - destline = BITMAP_ADDR16(bitmap, ycnt, 0); + destline = &bitmap.pix32(ycnt); - for (xcnt = cliprect->min_x; xcnt <= cliprect->max_x; xcnt++) + for (xcnt = cliprect.min_x; xcnt <= cliprect.max_x; xcnt++) { int r,g,b; int xs = xcnt & xsizemask; @@ -3391,21 +3269,18 @@ b = ((dot_data & 0x00ff0000) >> 16); g = ((dot_data & 0x0000ff00) >> 8); r = ((dot_data & 0x000000ff) >> 0); - b >>= 3; - g >>= 3; - r >>= 3; if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset(machine,&r,&g,&b,stv2_current_tilemap.fade_control & 2); tw = stv_vdp2_window_process(machine,xcnt,ycnt); if(tw == 0) { if (((xcnt + 0) <= screen_x) && (ycnt <= screen_y)) { if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) - destline[xcnt] = b | g << 5 | r << 10; + destline[xcnt] = MAKE_RGB(r, g, b); else - destline[xcnt] = alpha_blend_r16( destline[xcnt], b | g << 5 | r << 10, stv2_current_tilemap.alpha ); + destline[xcnt] = alpha_blend_r32( destline[xcnt], MAKE_RGB(r, g, b), stv2_current_tilemap.alpha ); } } } @@ -3589,7 +3464,7 @@ *_map = map; } -static void stv_vdp2_draw_basic_tilemap(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_basic_tilemap(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); /* hopefully this is easier to follow than it is efficient .. */ @@ -3823,7 +3698,7 @@ { int drawyposinc = tilesizey*(stv2_current_tilemap.tile_size ? 2 : 1); drawypos = -(stv2_current_tilemap.scrolly*scaley); - while( ((drawypos + drawyposinc) >> 16) < cliprect->min_y ) + while( ((drawypos + drawyposinc) >> 16) < cliprect.min_y ) { drawypos += drawyposinc; y++; @@ -3834,7 +3709,7 @@ { drawypos += tilesizey*(stv2_current_tilemap.tile_size ? 2 : 1); } - if ((drawypos >> 16) > cliprect->max_y) break; + if ((drawypos >> 16) > cliprect.max_y) break; ypageoffs = y & (pgtiles_y-1); @@ -3846,7 +3721,7 @@ { int drawxposinc = tilesizex*(stv2_current_tilemap.tile_size ? 2 : 1); drawxpos = -(stv2_current_tilemap.scrollx*scalex); - while( ((drawxpos + drawxposinc) >> 16) < cliprect->min_x ) + while( ((drawxpos + drawxposinc) >> 16) < cliprect.min_x ) { drawxpos += drawxposinc; x++; @@ -3857,7 +3732,7 @@ { drawxpos+=tilesizex*(stv2_current_tilemap.tile_size ? 2 : 1); } - if ( (drawxpos >> 16) > cliprect->max_x ) break; + if ( (drawxpos >> 16) > cliprect.max_x ) break; xpageoffs = x & (pgtiles_x-1); @@ -4040,7 +3915,7 @@ if ( LOG_VDP2 ) { - logerror( "Layer RBG%d, size %d x %d\n", stv2_current_tilemap.layer_name & 0x7f, cliprect->max_x + 1, cliprect->max_y + 1 ); + logerror( "Layer RBG%d, size %d x %d\n", stv2_current_tilemap.layer_name & 0x7f, cliprect.max_x + 1, cliprect.max_y + 1 ); logerror( "Tiles: min %08X, max %08X\n", tilecodemin, tilecodemax ); logerror( "MAP size in dwords %08X\n", mpsize_dwords ); for (i = 0; i < stv2_current_tilemap.map_count; i++) @@ -4081,11 +3956,11 @@ } -static void stv_vdp2_check_tilemap_with_linescroll(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_check_tilemap_with_linescroll(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); rectangle mycliprect; - int cur_line = cliprect->min_y; + int cur_line = cliprect.min_y; int address; int active_functions = 0; INT32 scroll_values[3], prev_scroll_values[3]; @@ -4111,7 +3986,7 @@ stv2_current_tilemap.linezoom_enable = 0; // prepare working clipping rectangle - memcpy( &mycliprect, cliprect, sizeof(rectangle) ); + memcpy( &mycliprect, &cliprect, sizeof(rectangle) ); // calculate the number of active functions if ( linescroll_enable ) active_functions++; @@ -4123,7 +3998,7 @@ if ( linezoom_enable ) active_functions++; // address of data table - address = stv2_current_tilemap.linescroll_table_address + active_functions*4*cliprect->min_y; + address = stv2_current_tilemap.linescroll_table_address + active_functions*4*cliprect.min_y; // get the first scroll values for ( i = 0; i < active_functions; i++ ) @@ -4139,7 +4014,7 @@ } } - while( cur_line <= cliprect->max_y ) + while( cur_line <= cliprect.max_y ) { lines = 0; do @@ -4170,7 +4045,7 @@ { scroll_values_equal &= (scroll_values[i] == prev_scroll_values[i]); } - } while( scroll_values_equal && ((cur_line + lines) <= cliprect->max_y) ); + } while( scroll_values_equal && ((cur_line + lines) <= cliprect.max_y) ); // determined how many lines can be drawn // prepare clipping rectangle @@ -4205,7 +4080,7 @@ // if ( LOG_VDP2 ) logerror( "Linescroll: y < %d, %d >, scrollx = %d, scrolly = %d, incx = %f\n", mycliprect.min_y, mycliprect.max_y, stv2_current_tilemap.scrollx, stv2_current_tilemap.scrolly, (float)stv2_current_tilemap.incx/65536.0 ); // render current tilemap portion - stv_vdp2_check_tilemap(machine, bitmap, &mycliprect ); + stv_vdp2_check_tilemap(machine, bitmap, mycliprect ); // update parameters for next iteration memcpy( prev_scroll_values, scroll_values, sizeof(scroll_values)); @@ -4213,13 +4088,13 @@ } } -static void stv_vdp2_draw_line(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_line(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); int x,y; UINT8* gfxdata = state->m_vdp2.gfx_decode; UINT32 base_offs,base_mask; - UINT16 pix; + UINT32 pix; UINT8 interlace; interlace = (STV_VDP2_LSMD == 3)+1; @@ -4227,32 +4102,32 @@ { base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - for(y=cliprect->min_y;y<=cliprect->max_y;y++) + for(y=cliprect.min_y;y<=cliprect.max_y;y++) { base_offs = (STV_VDP2_LCTA & base_mask) << 1; if(STV_VDP2_LCCLMD) base_offs += (y / interlace) << 1; - for(x=cliprect->min_x;x<=cliprect->max_x;x++) + for(x=cliprect.min_x;x<=cliprect.max_x;x++) { UINT16 pen; pen = (gfxdata[base_offs+0]<<8)|gfxdata[base_offs+1]; - pix = *BITMAP_ADDR16(bitmap, y,x); + pix = bitmap.pix32(y, x); - *BITMAP_ADDR16(bitmap, y, x) = stv_add_blend(machine.pens[pen & 0x7ff],pix); + bitmap.pix32(y, x) = stv_add_blend(machine.pens[pen & 0x7ff],pix); } } } } -static void stv_vdp2_draw_mosaic(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 is_roz) +static void stv_vdp2_draw_mosaic(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 is_roz) { saturn_state *state = machine.driver_data(); int x,y,xi,yi; UINT8 h_size,v_size; - UINT16 pix; + UINT32 pix; h_size = STV_VDP2_MZSZH+1; v_size = STV_VDP2_MZSZV+1; @@ -4266,31 +4141,27 @@ if(STV_VDP2_LSMD == 3) v_size <<= 1; - for(y=cliprect->min_y;y<=cliprect->max_y;y+=v_size) + for(y=cliprect.min_y;y<=cliprect.max_y;y+=v_size) { - for(x=cliprect->min_x;x<=cliprect->max_x;x+=h_size) + for(x=cliprect.min_x;x<=cliprect.max_x;x+=h_size) { - pix = *BITMAP_ADDR16(bitmap, y,x); + pix = bitmap.pix32(y, x); for(yi=0;yi(); // int window_applied = 0; - rectangle mycliprect; - mycliprect.min_x = cliprect->min_x; - mycliprect.max_x = cliprect->max_x; - mycliprect.min_y = cliprect->min_y; - mycliprect.max_y = cliprect->max_y; + rectangle mycliprect = cliprect; if ( stv2_current_tilemap.linescroll_enable || stv2_current_tilemap.vertical_linescroll_enable || @@ -4301,7 +4172,7 @@ } // window_applied = - stv_vdp2_apply_window_on_layer(machine,&mycliprect); + stv_vdp2_apply_window_on_layer(machine,mycliprect); if (stv2_current_tilemap.bitmap_enable) // this layer is a bitmap { @@ -4309,11 +4180,11 @@ //if ( window_applied && stv2_current_tilemap.colour_depth != 4) // stv2_current_tilemap.window_control = 0; - stv_vdp2_draw_basic_bitmap(machine, bitmap, &mycliprect); + stv_vdp2_draw_basic_bitmap(machine, bitmap, mycliprect); } else { - stv_vdp2_draw_basic_tilemap(machine, bitmap, &mycliprect); + stv_vdp2_draw_basic_tilemap(machine, bitmap, mycliprect); } /* post-processing functions (TODO: needs layer bitmaps to be individual planes to work correctly) */ @@ -4393,13 +4264,13 @@ } } -static void stv_vdp2_draw_rotation_screen(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int iRP); +static void stv_vdp2_draw_rotation_screen(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int iRP); -static void stv_vdp2_copy_roz_bitmap(bitmap_t *bitmap, +static void stv_vdp2_copy_roz_bitmap(bitmap_rgb32 &bitmap, running_machine &machine, - bitmap_t *roz_bitmap, - const rectangle *cliprect, + bitmap_rgb32 &roz_bitmap, + const rectangle &cliprect, int iRP, int planesizex, int planesizey, @@ -4417,8 +4288,8 @@ UINT32 *coeff_table_base, coeff_table_offset; INT32 coeff_table_val; UINT32 address; - UINT16 *line; - UINT16 pix; + UINT32 *line; + UINT32 pix; //UINT32 coeff_line_color_screen_data; INT32 clipxmask = 0, clipymask = 0; @@ -4534,7 +4405,7 @@ xp = mul_fixed32( RP.A, RP.px - RP.cx ) + mul_fixed32( RP.B, RP.py - RP.cy ) + mul_fixed32( RP.C, RP.pz - RP.cz ) + RP.cx + RP.mx; yp = mul_fixed32( RP.D, RP.px - RP.cx ) + mul_fixed32( RP.E, RP.py - RP.cy ) + mul_fixed32( RP.F, RP.pz - RP.cz ) + RP.cy + RP.my; - for (vcnt = cliprect->min_y; vcnt <= cliprect->max_y; vcnt++ ) + for (vcnt = cliprect.min_y; vcnt <= cliprect.max_y; vcnt++ ) { /*xsp = RP.A * ( ( RP.xst + RP.dxst * (vcnt << 16) ) - RP.px ) + RP.B * ( ( RP.yst + RP.dyst * (vcnt << 16) ) - RP.py ) + @@ -4553,7 +4424,7 @@ //dx = (RP.A * RP.dx) + (RP.B * RP.dy); //dy = (RP.D * RP.dx) + (RP.E * RP.dy); - line = BITMAP_ADDR16(bitmap, vcnt, 0); + line = &bitmap.pix32(vcnt); if ( !use_coeff_table || RP.dkax == 0 ) { @@ -4625,27 +4496,27 @@ dxs = mul_fixed32( kx, mul_fixed32( dx, 1 << (16-hcnt_shift))); dys = mul_fixed32( ky, mul_fixed32( dy, 1 << (16-hcnt_shift))); - for (hcnt = cliprect->min_x; hcnt <= cliprect->max_x; xs+=dxs, ys+=dys, hcnt++ ) + for (hcnt = cliprect.min_x; hcnt <= cliprect.max_x; xs+=dxs, ys+=dys, hcnt++ ) { x = xs >> 16; y = ys >> 16; if ( x & clipxmask || y & clipymask ) continue; - pix = *BITMAP_ADDR16(roz_bitmap, y & planerenderedsizey, x & planerenderedsizex); + pix = roz_bitmap.pix32(y & planerenderedsizey, x & planerenderedsizex); switch( stv2_current_tilemap.transparency ) { case STV_TRANSPARENCY_PEN: if ( pix != 0x0000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = pix; } break; case STV_TRANSPARENCY_NONE: if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = pix; break; @@ -4653,16 +4524,16 @@ if ( pix != 0x000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); - line[hcnt] = alpha_blend_r16( line[hcnt], pix, stv2_current_tilemap.alpha ); + line[hcnt] = alpha_blend_r32( line[hcnt], pix, stv2_current_tilemap.alpha ); } break; case STV_TRANSPARENCY_ADD_BLEND: if ( pix != 0x0000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = stv_add_blend( line[hcnt], pix ); } @@ -4673,7 +4544,7 @@ } else { - for (hcnt = cliprect->min_x; hcnt <= cliprect->max_x; hcnt++ ) + for (hcnt = cliprect.min_x; hcnt <= cliprect.max_x; hcnt++ ) { switch( coeff_table_size ) { @@ -4742,21 +4613,21 @@ if ( x & clipxmask || y & clipymask ) continue; - pix = *BITMAP_ADDR16(roz_bitmap, y & planerenderedsizey, x & planerenderedsizex); + pix = roz_bitmap.pix32(y & planerenderedsizey, x & planerenderedsizex); switch( stv2_current_tilemap.transparency ) { case STV_TRANSPARENCY_PEN: if ( pix != 0x0000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = pix; } break; case STV_TRANSPARENCY_NONE: if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = pix; break; @@ -4764,16 +4635,16 @@ if ( pix != 0x000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); - line[hcnt] = alpha_blend_r16( line[hcnt], pix, stv2_current_tilemap.alpha ); + line[hcnt] = alpha_blend_r32( line[hcnt], pix, stv2_current_tilemap.alpha ); } break; case STV_TRANSPARENCY_ADD_BLEND: if ( pix != 0x0000 ) { if(stv2_current_tilemap.fade_control & 1) - stv_vdp2_compute_color_offset_RGB555_UINT16(machine,&pix,stv2_current_tilemap.fade_control & 2); + stv_vdp2_compute_color_offset_UINT32(machine,&pix,stv2_current_tilemap.fade_control & 2); line[hcnt] = stv_add_blend( line[hcnt], pix ); } @@ -4784,7 +4655,7 @@ } } -static void stv_vdp2_draw_NBG0(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_NBG0(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); UINT32 base_mask; @@ -4886,7 +4757,7 @@ stv_vdp2_check_tilemap(machine, bitmap, cliprect); } -static void stv_vdp2_draw_NBG1(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_NBG1(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); UINT32 base_mask; @@ -4984,7 +4855,7 @@ stv_vdp2_check_tilemap(machine, bitmap, cliprect); } -static void stv_vdp2_draw_NBG2(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_NBG2(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); @@ -5089,7 +4960,7 @@ stv_vdp2_check_tilemap(machine, bitmap, cliprect); } -static void stv_vdp2_draw_NBG3(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_NBG3(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); /* @@ -5194,7 +5065,7 @@ } -static void stv_vdp2_draw_rotation_screen(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int iRP) +static void stv_vdp2_draw_rotation_screen(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int iRP) { saturn_state *state = machine.driver_data(); rectangle roz_clip_rect, mycliprect; @@ -5298,8 +5169,8 @@ } else { - if ( state->m_vdp2.roz_bitmap[iRP-1] == NULL ) - state->m_vdp2.roz_bitmap[iRP-1] = auto_alloc(machine, bitmap_t(4096, 4096, machine.primary_screen->format())); + if ( !state->m_vdp2.roz_bitmap[iRP-1].valid() ) + state->m_vdp2.roz_bitmap[iRP-1].allocate(4096, 4096); roz_clip_rect.min_x = roz_clip_rect.min_y = 0; if ( (iRP == 1 && STV_VDP2_RAOVR == 3) || @@ -5336,8 +5207,8 @@ if ( (stv_rbg_cache_data.is_cache_dirty & iRP) || memcmp(&stv_rbg_cache_data.layer_data[iRP-1],&stv2_current_tilemap,sizeof(stv2_current_tilemap)) != 0 ) { - bitmap_fill( state->m_vdp2.roz_bitmap[iRP-1], &roz_clip_rect , get_black_pen(machine)); - stv_vdp2_check_tilemap(machine, state->m_vdp2.roz_bitmap[iRP-1], &roz_clip_rect); + state->m_vdp2.roz_bitmap[iRP-1].fill(get_black_pen(machine), roz_clip_rect ); + stv_vdp2_check_tilemap(machine, state->m_vdp2.roz_bitmap[iRP-1], roz_clip_rect); // prepare cache data stv_rbg_cache_data.watch_vdp2_vram_writes |= iRP; stv_rbg_cache_data.is_cache_dirty &= ~iRP; @@ -5358,27 +5229,24 @@ stv2_current_tilemap.transparency = STV_TRANSPARENCY_ALPHA; } - mycliprect.min_x = cliprect->min_x; - mycliprect.max_x = cliprect->max_x; - mycliprect.min_y = cliprect->min_y; - mycliprect.max_y = cliprect->max_y; + mycliprect = cliprect; if ( window_control ) { stv2_current_tilemap.window_control = window_control; - stv_vdp2_apply_window_on_layer(machine,&mycliprect); + stv_vdp2_apply_window_on_layer(machine,mycliprect); } stv2_current_tilemap.fade_control = fade_control; g_profiler.start(PROFILER_USER2); - stv_vdp2_copy_roz_bitmap(bitmap, machine, state->m_vdp2.roz_bitmap[iRP-1], &mycliprect, iRP, planesizex, planesizey, planerenderedsizex, planerenderedsizey ); + stv_vdp2_copy_roz_bitmap(bitmap, machine, state->m_vdp2.roz_bitmap[iRP-1], mycliprect, iRP, planesizex, planesizey, planerenderedsizex, planerenderedsizey ); g_profiler.stop(); } } -static void stv_vdp2_draw_RBG0(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_RBG0(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); /* @@ -5481,7 +5349,7 @@ } -static void stv_vdp2_draw_back(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void stv_vdp2_draw_back(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); int x,y; @@ -5495,30 +5363,30 @@ /* draw black if BDCLMD and DISP are cleared */ if(!(STV_VDP2_BDCLMD) && !(STV_VDP2_DISP)) - bitmap_fill(bitmap, cliprect, get_black_pen(machine)); + bitmap.fill(get_black_pen(machine), cliprect); else { base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - for(y=cliprect->min_y;y<=cliprect->max_y;y++) + for(y=cliprect.min_y;y<=cliprect.max_y;y++) { base_offs = ((STV_VDP2_BKTA ) & base_mask) << 1; if(STV_VDP2_BKCLMD) base_offs += ((y / interlace) << 1); - for(x=cliprect->min_x;x<=cliprect->max_x;x++) + for(x=cliprect.min_x;x<=cliprect.max_x;x++) { int r,g,b; UINT16 dot; dot = (gfxdata[base_offs+0]<<8)|gfxdata[base_offs+1]; - b = (dot & 0x7c00) >> 10; - g = (dot & 0x03e0) >> 5; - r = (dot & 0x001f) >> 0; + b = (dot & 0x7c00) >> 7; + g = (dot & 0x03e0) >> 2; + r = (dot & 0x001f) << 3; if(STV_VDP2_BKCOEN) - stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_BKCOSL ); + stv_vdp2_compute_color_offset( machine, &r, &g, &b, STV_VDP2_BKCOSL ); - *BITMAP_ADDR16(bitmap, y,x) = b | g << 5 | r << 10; + bitmap.pix32(y, x) = MAKE_RGB(r, g, b); } } } @@ -5951,7 +5819,8 @@ static void stv_vdp2_exit (running_machine &machine) { saturn_state *state = machine.driver_data(); - state->m_vdp2.roz_bitmap[0] = state->m_vdp2.roz_bitmap[1] = NULL; + state->m_vdp2.roz_bitmap[0].reset(); + state->m_vdp2.roz_bitmap[1].reset(); } static int stv_vdp2_start (running_machine &machine) @@ -5983,7 +5852,7 @@ VIDEO_START( stv_vdp2 ) { saturn_state *state = machine.driver_data(); - state->m_vdp2.roz_bitmap[0] = state->m_vdp2.roz_bitmap[1] = NULL; + machine.primary_screen->register_screen_bitmap(state->m_tmpbitmap); stv_vdp2_start(machine); stv_vdp1_start(machine); debug.l_en = 0xff; @@ -6024,12 +5893,8 @@ { int vblank_period,hblank_period; - rectangle visarea = machine.primary_screen->visible_area(); attoseconds_t refresh;; - visarea.min_x = 0; - visarea.max_x = horz_res-1; - visarea.min_y = 0; - visarea.max_y = vert_res-1; + rectangle visarea(0, horz_res-1, 0, vert_res-1); vblank_period = get_vblank_duration(machine); hblank_period = get_hblank_duration(machine); @@ -6271,7 +6136,7 @@ return stv2_current_tilemap.window_control & 1 ? (w0_pix & w1_pix) : (w0_pix | w1_pix); } -static int stv_vdp2_apply_window_on_layer(running_machine &machine,rectangle *cliprect) +static int stv_vdp2_apply_window_on_layer(running_machine &machine,rectangle &cliprect) { //saturn_state *state = machine.driver_data(); UINT16 s_x=0,e_x=0,s_y=0,e_y=0; @@ -6281,10 +6146,10 @@ /* w0, transparent outside supported */ stv_vdp2_get_window0_coordinates(machine,&s_x, &e_x, &s_y, &e_y); - if ( s_x > cliprect->min_x ) cliprect->min_x = s_x; - if ( e_x < cliprect->max_x ) cliprect->max_x = e_x; - if ( s_y > cliprect->min_y ) cliprect->min_y = s_y; - if ( e_y < cliprect->max_y ) cliprect->max_y = e_y; + if ( s_x > cliprect.min_x ) cliprect.min_x = s_x; + if ( e_x < cliprect.max_x ) cliprect.max_x = e_x; + if ( s_y > cliprect.min_y ) cliprect.min_y = s_y; + if ( e_y < cliprect.max_y ) cliprect.max_y = e_y; return 1; } @@ -6293,10 +6158,10 @@ /* w1, transparent outside supported */ stv_vdp2_get_window1_coordinates(machine,&s_x, &e_x, &s_y, &e_y); - if ( s_x > cliprect->min_x ) cliprect->min_x = s_x; - if ( e_x < cliprect->max_x ) cliprect->max_x = e_x; - if ( s_y > cliprect->min_y ) cliprect->min_y = s_y; - if ( e_y < cliprect->max_y ) cliprect->max_y = e_y; + if ( s_x > cliprect.min_x ) cliprect.min_x = s_x; + if ( e_x < cliprect.max_x ) cliprect.max_x = e_x; + if ( s_y > cliprect.min_y ) cliprect.min_y = s_y; + if ( e_y < cliprect.max_y ) cliprect.max_y = e_y; return 1; } @@ -6311,14 +6176,14 @@ static int stv_sprite_priorities_usage_valid; static UINT8 stv_sprite_priorities_in_fb_line[512][8]; -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 pri) +static void draw_sprites(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT8 pri) { saturn_state *state = machine.driver_data(); int x,y,r,g,b; int i; UINT16 pix; UINT16 *framebuffer_line; - UINT16 *bitmap_line, *bitmap_line2 = NULL; + UINT32 *bitmap_line, *bitmap_line2 = NULL; UINT8 interlace_framebuffer; UINT8 double_x; static const UINT16 sprite_colormask_table[] = { @@ -6424,12 +6289,9 @@ (STV_VDP2_SPW0A * 0x10) | (STV_VDP2_SPW1A * 0x20) | (STV_VDP2_SPSWA * 0x40); - mycliprect.min_x = cliprect->min_x; - mycliprect.max_x = cliprect->max_x; - mycliprect.min_y = cliprect->min_y; - mycliprect.max_y = cliprect->max_y; + mycliprect = cliprect; - stv_vdp2_apply_window_on_layer(machine,&mycliprect); + stv_vdp2_apply_window_on_layer(machine,mycliprect); if (interlace_framebuffer == 0 && double_x == 0 ) { @@ -6442,7 +6304,7 @@ continue; framebuffer_line = state->m_vdp1.framebuffer_display_lines[y]; - bitmap_line = BITMAP_ADDR16(bitmap, y, 0); + bitmap_line = &bitmap.pix32(y); for ( x = mycliprect.min_x; x <= mycliprect.max_x; x++ ) { @@ -6459,16 +6321,16 @@ if(STV_VDP2_SPWINEN && pix == 0x8000) /* Pukunpa */ continue; - b = (pix & 0x7c00) >> 10; - g = (pix & 0x03e0) >> 5; - r = (pix & 0x1f); + b = (pix & 0x7c00) >> 7; + g = (pix & 0x03e0) >> 2; + r = (pix & 0x1f) << 3; if ( color_offset_pal ) { - stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_SPCOSL ); + stv_vdp2_compute_color_offset( machine, &r, &g, &b, STV_VDP2_SPCOSL ); } - bitmap_line[x] = b | g << 5 | r << 10; + bitmap_line[x] = MAKE_RGB(r, g, b); } else { @@ -6484,7 +6346,7 @@ { if ( pix & ~sprite_shadow ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } } else @@ -6495,7 +6357,7 @@ /*shadow - in reality, we should check from what layer pixel beneath comes...*/ if ( STV_VDP2_SDCTL & 0x3f ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } /* note that when shadows are disabled, "shadow" palette entries are not drawn */ } @@ -6520,7 +6382,7 @@ continue; framebuffer_line = state->m_vdp1.framebuffer_display_lines[y]; - bitmap_line = BITMAP_ADDR16(bitmap, y, 0); + bitmap_line = &bitmap.pix32(y); for ( x = mycliprect.min_x; x <= mycliprect.max_x; x++ ) { @@ -6534,21 +6396,21 @@ continue; }; - b = (pix & 0x7c00) >> 10; - g = (pix & 0x03e0) >> 5; - r = (pix & 0x1f); + b = (pix & 0x7c00) >> 7; + g = (pix & 0x03e0) >> 2; + r = (pix & 0x1f) << 3; if ( color_offset_pal ) { - stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_SPCOSL ); + stv_vdp2_compute_color_offset( machine, &r, &g, &b, STV_VDP2_SPCOSL ); } ccr = sprite_ccr[0]; if ( STV_VDP2_CCMD ) { - bitmap_line[x] = stv_add_blend( bitmap_line[x], b | g << 5 | r << 10 ); + bitmap_line[x] = stv_add_blend( bitmap_line[x], MAKE_RGB(r, g, b)); } else { - bitmap_line[x] = alpha_blend_r16( bitmap_line[x], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f); + bitmap_line[x] = alpha_blend_r32( bitmap_line[x], MAKE_RGB(r, g ,b), ((UINT16)(0x1f-ccr)*0xff)/0x1f); } } else @@ -6574,7 +6436,7 @@ { if ( pix & ~sprite_shadow ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } } else @@ -6585,7 +6447,7 @@ /*shadow - in reality, we should check from what layer pixel beneath comes...*/ if ( STV_VDP2_SDCTL & 0x3f ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } /* note that when shadows are disabled, "shadow" palette entries are not drawn */ } else if ( pix ) @@ -6601,7 +6463,7 @@ } else { - bitmap_line[x] = alpha_blend_r16( bitmap_line[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + bitmap_line[x] = alpha_blend_r32( bitmap_line[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); } } else @@ -6624,12 +6486,12 @@ framebuffer_line = state->m_vdp1.framebuffer_display_lines[y]; if ( interlace_framebuffer == 0 ) { - bitmap_line = BITMAP_ADDR16(bitmap, y, 0); + bitmap_line = &bitmap.pix32(y); } else { - bitmap_line = BITMAP_ADDR16(bitmap, 2*y, 0); - bitmap_line2 = BITMAP_ADDR16(bitmap, 2*y + 1, 0); + bitmap_line = &bitmap.pix32(2*y); + bitmap_line2 = &bitmap.pix32(2*y + 1); } for ( x = mycliprect.min_x; x <= mycliprect.max_x /(double_x+1) ; x++ ) @@ -6643,26 +6505,26 @@ stv_sprite_priorities_in_fb_line[y][sprite_priorities[0]] = 1; continue; }; - b = (pix & 0x7c00) >> 10; - g = (pix & 0x03e0) >> 5; - r = (pix & 0x1f); + b = (pix & 0x7c00) >> 7; + g = (pix & 0x03e0) >> 2; + r = (pix & 0x1f) << 3; if ( color_offset_pal ) { - stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_SPCOSL ); + stv_vdp2_compute_color_offset( machine, &r, &g, &b, STV_VDP2_SPCOSL ); } if ( alpha_enabled == 0 ) { if(double_x) { - bitmap_line[x*2] = b | g << 5 | r << 10; - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = b | g << 5 | r << 10; - bitmap_line[x*2+1] = b | g << 5 | r << 10; - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = b | g << 5 | r << 10; + bitmap_line[x*2] = MAKE_RGB(r, g, b); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = MAKE_RGB(r, g, b); + bitmap_line[x*2+1] = MAKE_RGB(r, g, b); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = MAKE_RGB(r, g, b); } else { - bitmap_line[x] = b | g << 5 | r << 10; - if ( interlace_framebuffer == 1 ) bitmap_line2[x] = b | g << 5 | r << 10; + bitmap_line[x] = MAKE_RGB(r, g, b); + if ( interlace_framebuffer == 1 ) bitmap_line2[x] = MAKE_RGB(r, g, b); } } else // alpha_blend == 1 @@ -6673,30 +6535,30 @@ { if(double_x) { - bitmap_line[x*2] = stv_add_blend( bitmap_line[x*2], b | g << 5 | r << 10 ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = stv_add_blend( bitmap_line2[x*2], b | g << 5 | r << 10 ); - bitmap_line[x*2+1] = stv_add_blend( bitmap_line[x*2+1], b | g << 5 | r << 10 ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = stv_add_blend( bitmap_line2[x*2+1], b | g << 5 | r << 10 ); + bitmap_line[x*2] = stv_add_blend( bitmap_line[x*2], MAKE_RGB(r, g, b) ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = stv_add_blend( bitmap_line2[x*2], MAKE_RGB(r, g, b) ); + bitmap_line[x*2+1] = stv_add_blend( bitmap_line[x*2+1], MAKE_RGB(r, g, b) ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = stv_add_blend( bitmap_line2[x*2+1], MAKE_RGB(r, g, b) ); } else { - bitmap_line[x] = stv_add_blend( bitmap_line[x], b | g << 5 | r << 10 ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x] = stv_add_blend( bitmap_line2[x], b | g << 5 | r << 10 ); + bitmap_line[x] = stv_add_blend( bitmap_line[x], MAKE_RGB(r, g, b) ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x] = stv_add_blend( bitmap_line2[x], MAKE_RGB(r, g, b) ); } } else { if(double_x) { - bitmap_line[x*2] = alpha_blend_r16( bitmap_line[x*2], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = alpha_blend_r16( bitmap_line2[x*2], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - bitmap_line[x*2+1] = alpha_blend_r16( bitmap_line[x*2+1], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = alpha_blend_r16( bitmap_line2[x*2+1], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f); + bitmap_line[x*2] = alpha_blend_r32( bitmap_line[x*2], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = alpha_blend_r32( bitmap_line2[x*2], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + bitmap_line[x*2+1] = alpha_blend_r32( bitmap_line[x*2+1], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = alpha_blend_r32( bitmap_line2[x*2+1], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f); } else { - bitmap_line[x] = alpha_blend_r16( bitmap_line[x], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f); - if ( interlace_framebuffer == 1 ) bitmap_line2[x] = alpha_blend_r16( bitmap_line2[x], b | g << 5 | r << 10, ((UINT16)(0x1f-ccr)*0xff)/0x1f); + bitmap_line[x] = alpha_blend_r32( bitmap_line[x], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f); + if ( interlace_framebuffer == 1 ) bitmap_line2[x] = alpha_blend_r32( bitmap_line2[x], MAKE_RGB(r, g, b), ((UINT16)(0x1f-ccr)*0xff)/0x1f); } } } @@ -6726,7 +6588,7 @@ { if ( pix & ~sprite_shadow ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } } else @@ -6737,7 +6599,7 @@ /*shadow - in reality, we should check from what layer pixel beneath comes...*/ if ( STV_VDP2_SDCTL & 0x3f ) { - bitmap_line[x] = (bitmap_line[x] & ~0x421) >> 1; + bitmap_line[x] = (bitmap_line[x] & ~0x010101) >> 1; } /* note that when shadows are disabled, "shadow" palette entries are not drawn */ } else if ( pix ) @@ -6781,15 +6643,15 @@ { if(double_x) { - bitmap_line[x*2] = alpha_blend_r16( bitmap_line[x*2], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = alpha_blend_r16( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - bitmap_line[x*2+1] = alpha_blend_r16( bitmap_line[x*2+1], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = alpha_blend_r16( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + bitmap_line[x*2] = alpha_blend_r32( bitmap_line[x*2], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2] = alpha_blend_r32( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + bitmap_line[x*2+1] = alpha_blend_r32( bitmap_line[x*2+1], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x*2+1] = alpha_blend_r32( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); } else { - bitmap_line[x] = alpha_blend_r16( bitmap_line[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); - if ( interlace_framebuffer == 1 ) bitmap_line2[x] = alpha_blend_r16( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + bitmap_line[x] = alpha_blend_r32( bitmap_line[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); + if ( interlace_framebuffer == 1 ) bitmap_line2[x] = alpha_blend_r32( bitmap_line2[x], machine.pens[pix], ((UINT16)(0x1f-ccr)*0xff)/0x1f ); } } } @@ -6803,42 +6665,42 @@ stv_sprite_priorities_usage_valid = 1; } -SCREEN_UPDATE( stv_vdp2 ) +SCREEN_UPDATE_RGB32( stv_vdp2 ) { - saturn_state *state = screen->machine().driver_data(); + saturn_state *state = screen.machine().driver_data(); static UINT8 pri; - stv_vdp2_fade_effects(screen->machine()); + stv_vdp2_fade_effects(screen.machine()); - stv_vdp2_draw_back(screen->machine(), bitmap,cliprect); + stv_vdp2_draw_back(screen.machine(), state->m_tmpbitmap,cliprect); #if DEBUG_MODE - if(screen->machine().input().code_pressed_once(KEYCODE_T)) + if(screen.machine().input().code_pressed_once(KEYCODE_T)) { debug.l_en^=1; popmessage("NBG3 %sabled",debug.l_en & 1 ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_Y)) + if(screen.machine().input().code_pressed_once(KEYCODE_Y)) { debug.l_en^=2; popmessage("NBG2 %sabled",debug.l_en & 2 ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_U)) + if(screen.machine().input().code_pressed_once(KEYCODE_U)) { debug.l_en^=4; popmessage("NBG1 %sabled",debug.l_en & 4 ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_I)) + if(screen.machine().input().code_pressed_once(KEYCODE_I)) { debug.l_en^=8; popmessage("NBG0 %sabled",debug.l_en & 8 ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_K)) + if(screen.machine().input().code_pressed_once(KEYCODE_K)) { debug.l_en^=0x10; popmessage("RBG0 %sabled",debug.l_en & 0x10 ? "en" : "dis"); } - if(screen->machine().input().code_pressed_once(KEYCODE_O)) + if(screen.machine().input().code_pressed_once(KEYCODE_O)) { debug.l_en^=0x20; popmessage("SPRITE %sabled",debug.l_en & 0x20 ? "en" : "dis"); @@ -6854,12 +6716,12 @@ /*If a plane has a priority value of zero it isn't shown at all.*/ for(pri=1;pri<8;pri++) { - if (debug.l_en & 1) { if(pri==STV_VDP2_N3PRIN) stv_vdp2_draw_NBG3(screen->machine(), bitmap,cliprect); } - if (debug.l_en & 2) { if(pri==STV_VDP2_N2PRIN) stv_vdp2_draw_NBG2(screen->machine(), bitmap,cliprect); } - if (debug.l_en & 4) { if(pri==STV_VDP2_N1PRIN) stv_vdp2_draw_NBG1(screen->machine(), bitmap,cliprect); } - if (debug.l_en & 8) { if(pri==STV_VDP2_N0PRIN) stv_vdp2_draw_NBG0(screen->machine(), bitmap,cliprect); } - if (debug.l_en & 0x10) { if(pri==STV_VDP2_R0PRIN) stv_vdp2_draw_RBG0(screen->machine(), bitmap,cliprect); } - if (debug.l_en & 0x20) { draw_sprites(screen->machine(),bitmap,cliprect,pri); } + if (debug.l_en & 1) { if(pri==STV_VDP2_N3PRIN) stv_vdp2_draw_NBG3(screen.machine(), state->m_tmpbitmap,cliprect); } + if (debug.l_en & 2) { if(pri==STV_VDP2_N2PRIN) stv_vdp2_draw_NBG2(screen.machine(), state->m_tmpbitmap,cliprect); } + if (debug.l_en & 4) { if(pri==STV_VDP2_N1PRIN) stv_vdp2_draw_NBG1(screen.machine(), state->m_tmpbitmap,cliprect); } + if (debug.l_en & 8) { if(pri==STV_VDP2_N0PRIN) stv_vdp2_draw_NBG0(screen.machine(), state->m_tmpbitmap,cliprect); } + if (debug.l_en & 0x10) { if(pri==STV_VDP2_R0PRIN) stv_vdp2_draw_RBG0(screen.machine(), state->m_tmpbitmap,cliprect); } + if (debug.l_en & 0x20) { draw_sprites(screen.machine(),state->m_tmpbitmap,cliprect,pri); } } } @@ -6870,51 +6732,51 @@ ,STV_VDP2_N1ZMXI,STV_VDP2_N1ZMXD ,STV_VDP2_N1ZMYI,STV_VDP2_N1ZMYD);*/ - if ( screen->machine().input().code_pressed_once(KEYCODE_W) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_W) ) { int tilecode; for (tilecode = 0;tilecode<0x8000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[0], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[0], tilecode); } for (tilecode = 0;tilecode<0x2000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[1], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[1], tilecode); } for (tilecode = 0;tilecode<0x4000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[2], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[2], tilecode); } for (tilecode = 0;tilecode<0x1000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[3], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[3], tilecode); } /* vdp 1 ... doesn't have to be tile based */ for (tilecode = 0;tilecode<0x8000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[4], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[4], tilecode); } for (tilecode = 0;tilecode<0x2000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[5], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[5], tilecode); } for (tilecode = 0;tilecode<0x4000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[6], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[6], tilecode); } for (tilecode = 0;tilecode<0x1000;tilecode++) { - gfx_element_mark_dirty(screen->machine().gfx[7], tilecode); + gfx_element_mark_dirty(screen.machine().gfx[7], tilecode); } } - if ( screen->machine().input().code_pressed_once(KEYCODE_N) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_N) ) { FILE *fp; @@ -6926,7 +6788,7 @@ } } - if ( screen->machine().input().code_pressed_once(KEYCODE_M) ) + if ( screen.machine().input().code_pressed_once(KEYCODE_M) ) { FILE *fp; @@ -6940,7 +6802,7 @@ #endif - + copybitmap(bitmap, state->m_tmpbitmap, 0, 0, 0, 0, cliprect); return 0; } @@ -7084,7 +6946,7 @@ } } -static void vdp2_draw_back(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void vdp2_draw_back(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { saturn_state *state = machine.driver_data(); int x,y; @@ -7096,18 +6958,18 @@ /* draw black if BDCLMD and DISP are cleared */ if(!(STV_VDP2_BDCLMD) && !(STV_VDP2_DISP)) - bitmap_fill(bitmap, cliprect, get_black_pen(machine)); + bitmap.fill(get_black_pen(machine), cliprect); else { base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - for(y=cliprect->min_y;y<=cliprect->max_y;y++) + for(y=cliprect.min_y;y<=cliprect.max_y;y++) { base_offs = ((STV_VDP2_BKTA ) & base_mask) << 1; if(STV_VDP2_BKCLMD) base_offs += ((y / interlace) << 1); - for(x=cliprect->min_x;x<=cliprect->max_x;x++) + for(x=cliprect.min_x;x<=cliprect.max_x;x++) { int r,g,b; UINT16 dot; @@ -7121,10 +6983,10 @@ r <<= 3; //if(STV_VDP2_BKCOEN) - // stv_vdp2_compute_color_offset_RGB555( machine, &r, &g, &b, STV_VDP2_BKCOSL ); + // stv_vdp2_compute_color_offset( machine, &r, &g, &b, STV_VDP2_BKCOSL ); /* TODO: this needs post-processing too! */ - *BITMAP_ADDR32(bitmap, y,x) = b | g << 8 | r << 16; + bitmap.pix32(y, x) = b | g << 8 | r << 16; } } } @@ -7294,15 +7156,15 @@ } /* now copy the vram buffer to the screen buffer, apply post-processing at this stage */ -static void draw_normal_screen(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, UINT8 layer_name) +static void draw_normal_screen(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect, UINT8 layer_name) { int x,y; int r,g,b; - for(y=0;y<=cliprect->max_y;y++) + for(y=0;y<=cliprect.max_y;y++) { - for(x=0;x<=cliprect->max_x;x++) + for(x=0;x<=cliprect.max_x;x++) { if(layer_tpen[layer_name][(x)+(y)*XB_SIZE]) { @@ -7314,7 +7176,7 @@ if(m_vdp2_state[layer_name].color_offset_en) vdp2_calc_color_offset(machine,layer_name,&r,&g,&b); - *BITMAP_ADDR32(bitmap, y, x) = b | g << 8 | r << 16; + bitmap.pix32(y, x) = b | g << 8 | r << 16; } } } @@ -7354,18 +7216,18 @@ } } -SCREEN_UPDATE( saturn ) +SCREEN_UPDATE_RGB32( saturn ) { - saturn_state *state = screen->machine().driver_data(); + saturn_state *state = screen.machine().driver_data(); static UINT8 disclaimer; - vdp2_draw_back(screen->machine(),bitmap,cliprect); + vdp2_draw_back(screen.machine(),bitmap,cliprect); if(STV_VDP2_DISP) { - copy_plane(screen->machine(),3); + copy_plane(screen.machine(),3); - draw_normal_screen(screen->machine(),bitmap,cliprect,3); + draw_normal_screen(screen.machine(),bitmap,cliprect,3); } if(disclaimer == 0) diff -Nru mame-0.144/src/mame/video/subs.c mame-0.145/src/mame/video/subs.c --- mame-0.144/src/mame/video/subs.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/subs.c 2012-02-06 21:30:32.000000000 +0000 @@ -37,16 +37,14 @@ } -SCREEN_UPDATE( subs ) +SCREEN_UPDATE_IND16( subs_left ) { - subs_state *state = screen->machine().driver_data(); + subs_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT8 *spriteram = state->m_spriteram; int offs; - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); - device_t *discrete = screen->machine().device("discrete"); + device_t *discrete = screen.machine().device("discrete"); /* for every character in the Video RAM, check if it has been modified */ /* since last time and update it accordingly. */ @@ -54,7 +52,7 @@ { int charcode; int sx,sy; - int left_enable,right_enable; + int left_enable; //,right_enable; int left_sonar_window,right_sonar_window; left_sonar_window = 0; @@ -63,7 +61,7 @@ charcode = videoram[offs]; /* Which monitor is this for? */ - right_enable = charcode & 0x40; +// right_enable = charcode & 0x40; left_enable = charcode & 0x80; sx = 8 * (offs % 32); @@ -78,30 +76,14 @@ charcode = charcode & 0x3F; /* draw the left screen */ - if (screen == left_screen) - { - if ((left_enable || left_sonar_window) && (!right_sonar_window)) - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], - charcode, 1, - 0,0,sx,sy); - else - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], - 0, 1, - 0,0,sx,sy); - } - - /* draw the right screen */ - if (screen == right_screen) - { - if ((right_enable || right_sonar_window) && (!left_sonar_window)) - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], - charcode, 0, - 0,0,sx,sy); - else - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], - 0, 0, - 0,0,sx,sy); - } + if ((left_enable || left_sonar_window) && (!right_sonar_window)) + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], + charcode, 1, + 0,0,sx,sy); + else + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], + 0, 1, + 0,0,sx,sy); } /* draw the motion objects */ @@ -124,25 +106,11 @@ charcode = (charcode >> 3) & 0x1F; /* left screen - special check for drawing right screen's sub */ - if (screen == left_screen) - { - if ((offs!=0) || (sub_enable)) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], - charcode + 32 * prom_set, - 0, - 0,0,sx,sy,0); - } - - - /* right screen - special check for drawing left screen's sub */ - if (screen == right_screen) - { - if ((offs!=1) || (sub_enable)) - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], - charcode + 32 * prom_set, - 0, - 0,0,sx,sy,0); - } + if ((offs!=0) || (sub_enable)) + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], + charcode + 32 * prom_set, + 0, + 0,0,sx,sy,0); } /* Update sound */ @@ -150,3 +118,79 @@ discrete_sound_w(discrete, SUBS_CRASH_DATA, spriteram[5] >> 4); // Crash/explode data return 0; } + +SCREEN_UPDATE_IND16( subs_right ) +{ + subs_state *state = screen.machine().driver_data(); + UINT8 *videoram = state->m_videoram; + UINT8 *spriteram = state->m_spriteram; + int offs; + + /* for every character in the Video RAM, check if it has been modified */ + /* since last time and update it accordingly. */ + for (offs = 0x400 - 1; offs >= 0; offs--) + { + int charcode; + int sx,sy; + int right_enable; //, left_enable; + int left_sonar_window,right_sonar_window; + + left_sonar_window = 0; + right_sonar_window = 0; + + charcode = videoram[offs]; + + /* Which monitor is this for? */ + right_enable = charcode & 0x40; + //left_enable = charcode & 0x80; + + sx = 8 * (offs % 32); + sy = 8 * (offs / 32); + + /* Special hardware logic for sonar windows */ + if ((sy >= (128+64)) && (sx < 32)) + left_sonar_window = 1; + else if ((sy >= (128+64)) && (sx >= (128+64+32))) + right_sonar_window = 1; + else + charcode = charcode & 0x3F; + + /* draw the right screen */ + if ((right_enable || right_sonar_window) && (!left_sonar_window)) + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], + charcode, 0, + 0,0,sx,sy); + else + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], + 0, 0, + 0,0,sx,sy); + } + + /* draw the motion objects */ + for (offs = 0; offs < 4; offs++) + { + int sx,sy; + int charcode; + int prom_set; + int sub_enable; + + sx = spriteram[0x00 + (offs * 2)] - 16; + sy = spriteram[0x08 + (offs * 2)] - 16; + charcode = spriteram[0x09 + (offs * 2)]; + if (offs < 2) + sub_enable = spriteram[0x01 + (offs * 2)] & 0x80; + else + sub_enable = 1; + + prom_set = charcode & 0x01; + charcode = (charcode >> 3) & 0x1F; + + if ((offs!=1) || (sub_enable)) + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], + charcode + 32 * prom_set, + 0, + 0,0,sx,sy,0); + } + + return 0; +} diff -Nru mame-0.144/src/mame/video/suna16.c mame-0.145/src/mame/video/suna16.c --- mame-0.144/src/mame/video/suna16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/suna16.c 2012-02-06 21:30:33.000000000 +0000 @@ -122,7 +122,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16 *sprites, int gfx) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 *sprites, int gfx) { suna16_state *state = machine.driver_data(); int offs; @@ -221,33 +221,33 @@ ***************************************************************************/ -SCREEN_UPDATE( suna16 ) +SCREEN_UPDATE_IND16( suna16 ) { - suna16_state *state = screen->machine().driver_data(); + suna16_state *state = screen.machine().driver_data(); /* Suna Quiz indicates the background is the last pen */ - bitmap_fill(bitmap,cliprect,0xff); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0); + bitmap.fill(0xff, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 0); return 0; } -SCREEN_UPDATE( bestbest ) +SCREEN_UPDATE_IND16( bestbest ) { - suna16_state *state = screen->machine().driver_data(); + suna16_state *state = screen.machine().driver_data(); int layers_ctrl = -1; #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; if (msk != 0) layers_ctrl &= msk; } #endif /* Suna Quiz indicates the background is the last pen */ - bitmap_fill(bitmap,cliprect,0xff); - if (layers_ctrl & 1) draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0); - if (layers_ctrl & 2) draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2, 1); + bitmap.fill(0xff, cliprect); + if (layers_ctrl & 1) draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram, 0); + if (layers_ctrl & 2) draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram2, 1); return 0; } diff -Nru mame-0.144/src/mame/video/suna8.c mame-0.145/src/mame/video/suna8.c --- mame-0.144/src/mame/video/suna8.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/suna8.c 2012-02-06 21:30:32.000000000 +0000 @@ -123,7 +123,7 @@ state->m_spriteram[offset] = data; #if TILEMAPS - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); #endif } @@ -134,7 +134,7 @@ offset += state->m_spritebank * 0x2000; state->m_spriteram[offset] = data; #if TILEMAPS - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); #endif } @@ -186,7 +186,7 @@ 8, 8, 0x20*((state->m_text_dim > 0)?4:8), 0x20); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); #endif } @@ -202,7 +202,7 @@ ***************************************************************************/ -static void draw_normal_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_normal_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { suna8_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -336,7 +336,7 @@ } } -static void draw_text_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_text_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { suna8_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -412,33 +412,33 @@ ***************************************************************************/ -SCREEN_UPDATE( suna8 ) +SCREEN_UPDATE_IND16( suna8 ) { /* see hardhead, hardhea2 test mode (press button 2 for both players) */ - bitmap_fill(bitmap,cliprect,0xff); + bitmap.fill(0xff, cliprect); #ifdef MAME_DEBUG #if TILEMAPS - if (screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X)) + if (screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X)) { - suna8_state *state = screen->machine().driver_data(); - int max_tiles = screen->machine().region("gfx1")->bytes() / (0x400 * 0x20); + suna8_state *state = screen.machine().driver_data(); + int max_tiles = screen.machine().region("gfx1")->bytes() / (0x400 * 0x20); - if (screen->machine().input().code_pressed_once(KEYCODE_Q)) { state->m_page--; tilemap_mark_all_tiles_dirty_all(screen->machine()); } - if (screen->machine().input().code_pressed_once(KEYCODE_W)) { state->m_page++; tilemap_mark_all_tiles_dirty_all(screen->machine()); } - if (screen->machine().input().code_pressed_once(KEYCODE_E)) { state->m_tiles--; tilemap_mark_all_tiles_dirty_all(screen->machine()); } - if (screen->machine().input().code_pressed_once(KEYCODE_R)) { state->m_tiles++; tilemap_mark_all_tiles_dirty_all(screen->machine()); } - if (screen->machine().input().code_pressed_once(KEYCODE_A)) { state->m_trombank--; tilemap_mark_all_tiles_dirty_all(screen->machine()); } - if (screen->machine().input().code_pressed_once(KEYCODE_S)) { state->m_trombank++; tilemap_mark_all_tiles_dirty_all(screen->machine()); } + if (screen.machine().input().code_pressed_once(KEYCODE_Q)) { state->m_page--; screen.machine().tilemap().mark_all_dirty(); } + if (screen.machine().input().code_pressed_once(KEYCODE_W)) { state->m_page++; screen.machine().tilemap().mark_all_dirty(); } + if (screen.machine().input().code_pressed_once(KEYCODE_E)) { state->m_tiles--; screen.machine().tilemap().mark_all_dirty(); } + if (screen.machine().input().code_pressed_once(KEYCODE_R)) { state->m_tiles++; screen.machine().tilemap().mark_all_dirty(); } + if (screen.machine().input().code_pressed_once(KEYCODE_A)) { state->m_trombank--; screen.machine().tilemap().mark_all_dirty(); } + if (screen.machine().input().code_pressed_once(KEYCODE_S)) { state->m_trombank++; screen.machine().tilemap().mark_all_dirty(); } state->m_rombank &= 0xf; state->m_page &= (state->m_text_dim > 0)?3:7; state->m_tiles %= max_tiles; if (state->m_tiles < 0) state->m_tiles += max_tiles; - tilemap_set_scrollx(state->m_bg_tilemap, 0, 0x100 * state->m_page); - tilemap_set_scrolly(state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->set_scrollx(0, 0x100 * state->m_page); + state->m_bg_tilemap->set_scrolly(0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); #if 1 popmessage("%02X %02X %02X %02X - p%2X g%02X r%02X", state->m_rombank, state->m_palettebank, state->m_spritebank, state->m_unknown, @@ -449,8 +449,8 @@ #endif #endif { - draw_normal_sprites(screen->machine() ,bitmap,cliprect); - draw_text_sprites(screen->machine(), bitmap,cliprect); + draw_normal_sprites(screen.machine() ,bitmap,cliprect); + draw_text_sprites(screen.machine(), bitmap,cliprect); } return 0; } diff -Nru mame-0.144/src/mame/video/supbtime.c mame-0.145/src/mame/video/supbtime.c --- mame-0.144/src/mame/video/supbtime.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/supbtime.c 2012-02-06 21:30:33.000000000 +0000 @@ -21,18 +21,18 @@ /******************************************************************************/ -SCREEN_UPDATE(supbtime) +SCREEN_UPDATE_IND16(supbtime) { - supbtime_state *state = screen->machine().driver_data(); + supbtime_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 768); + bitmap.fill(768, cliprect); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/superchs.c mame-0.145/src/mame/video/superchs.c --- mame-0.144/src/mame/video/superchs.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/superchs.c 2012-02-06 21:30:31.000000000 +0000 @@ -54,7 +54,7 @@ ********************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,const int *primasks,int x_offs,int y_offs) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,const int *primasks,int x_offs,int y_offs) { superchs_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -199,9 +199,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( superchs ) +SCREEN_UPDATE_IND16( superchs ) { - device_t *tc0480scp = screen->machine().device("tc0480scp"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT16 priority; static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; @@ -215,25 +215,25 @@ layer[3] = (priority & 0x000f) >> 0; /* tells us which is top */ layer[4] = 4; /* text layer always over bg layers */ - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); /* We have to assume 2nd to bottom layer is always underneath sprites as pdrawgfx cannot yet cope with more than 4 layers */ #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed (KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); - if (!screen->machine().input().code_pressed (KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); - if (!screen->machine().input().code_pressed (KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); - if (!screen->machine().input().code_pressed (KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); - if (!screen->machine().input().code_pressed (KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); - if (!screen->machine().input().code_pressed (KEYCODE_N)) draw_sprites(screen->machine(), bitmap, cliprect, primasks, 48, -116); + if (!screen.machine().input().code_pressed (KEYCODE_Z)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); + if (!screen.machine().input().code_pressed (KEYCODE_X)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); + if (!screen.machine().input().code_pressed (KEYCODE_C)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); + if (!screen.machine().input().code_pressed (KEYCODE_V)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); + if (!screen.machine().input().code_pressed (KEYCODE_B)) tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); + if (!screen.machine().input().code_pressed (KEYCODE_N)) draw_sprites(screen.machine(), bitmap, cliprect, primasks, 48, -116); #else tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 1); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 2); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 4); tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 8); /* text layer */ - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 48, -116); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 48, -116); #endif return 0; } diff -Nru mame-0.144/src/mame/video/superqix.c mame-0.145/src/mame/video/superqix.c --- mame-0.144/src/mame/video/superqix.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/superqix.c 2012-02-06 21:30:31.000000000 +0000 @@ -38,7 +38,7 @@ if (bank) code += 1024 * state->m_gfxbank; SET_TILE_INFO(bank, code, color, 0); - tileinfo->group = (attr & 0x08) >> 3; + tileinfo.group = (attr & 0x08) >> 3; } @@ -58,12 +58,12 @@ VIDEO_START( superqix ) { superqix_state *state = machine.driver_data(); - state->m_fg_bitmap[0] = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); - state->m_fg_bitmap[1] = auto_bitmap_alloc(machine, 256, 256, machine.primary_screen->format()); + state->m_fg_bitmap[0] = auto_bitmap_ind16_alloc(machine, 256, 256); + state->m_fg_bitmap[1] = auto_bitmap_ind16_alloc(machine, 256, 256); state->m_bg_tilemap = tilemap_create(machine, sqix_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ + state->m_bg_tilemap->set_transmask(0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ state->save_item(NAME(state->m_gfxbank)); state->save_item(NAME(state->m_show_bitmap)); @@ -83,7 +83,7 @@ { superqix_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( superqix_bitmapram_w ) @@ -96,8 +96,8 @@ state->m_bitmapram[offset] = data; - *BITMAP_ADDR16(state->m_fg_bitmap[0], y, x) = data >> 4; - *BITMAP_ADDR16(state->m_fg_bitmap[0], y, x + 1) = data & 0x0f; + state->m_fg_bitmap[0]->pix16(y, x) = data >> 4; + state->m_fg_bitmap[0]->pix16(y, x + 1) = data & 0x0f; } } @@ -111,13 +111,14 @@ state->m_bitmapram2[offset] = data; - *BITMAP_ADDR16(state->m_fg_bitmap[1], y, x) = data >> 4; - *BITMAP_ADDR16(state->m_fg_bitmap[1], y, x + 1) = data & 0x0f; + state->m_fg_bitmap[1]->pix16(y, x) = data >> 4; + state->m_fg_bitmap[1]->pix16(y, x + 1) = data & 0x0f; } } WRITE8_HANDLER( pbillian_0410_w ) { + superqix_state *state = space->machine().driver_data(); /* -------0 ? [not used] ------1- coin counter 1 @@ -132,7 +133,7 @@ memory_set_bank(space->machine(), "bank1", (data & 0x08) >> 3); - interrupt_enable_w(space,0,data & 0x10); + state->m_nmi_mask = data & 0x10; flip_screen_set(space->machine(), data & 0x20); } @@ -143,14 +144,14 @@ if (state->m_gfxbank != (data & 0x03)) { state->m_gfxbank = data & 0x03; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 2 selects which of the two bitmaps to display (for 2 players game) */ state->m_show_bitmap = (data & 0x04) >> 2; /* bit 3 enables NMI */ - interrupt_enable_w(space,offset,data & 0x08); + state->m_nmi_mask = data & 0x08; /* bits 4-5 control ROM bank */ memory_set_bank(space->machine(), "bank1", (data & 0x30) >> 4); @@ -164,7 +165,7 @@ ***************************************************************************/ -static void pbillian_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void pbillian_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { superqix_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -192,7 +193,7 @@ } } -static void superqix_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void superqix_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { superqix_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -224,21 +225,21 @@ } } -SCREEN_UPDATE( pbillian ) +SCREEN_UPDATE_IND16( pbillian ) { - superqix_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - pbillian_draw_sprites(screen->machine(), bitmap,cliprect); + superqix_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + pbillian_draw_sprites(screen.machine(), bitmap,cliprect); return 0; } -SCREEN_UPDATE( superqix ) +SCREEN_UPDATE_IND16( superqix ) { - superqix_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - copybitmap_trans(bitmap,state->m_fg_bitmap[state->m_show_bitmap],flip_screen_get(screen->machine()),flip_screen_get(screen->machine()),0,0,cliprect,0); - superqix_draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); + superqix_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + copybitmap_trans(bitmap,*state->m_fg_bitmap[state->m_show_bitmap],flip_screen_get(screen.machine()),flip_screen_get(screen.machine()),0,0,cliprect,0); + superqix_draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/suprloco.c mame-0.145/src/mame/video/suprloco.c --- mame-0.144/src/mame/video/suprloco.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/suprloco.c 2012-02-06 21:30:31.000000000 +0000 @@ -83,7 +83,7 @@ state->m_videoram[2*tile_index] | ((attr & 0x03) << 8), (attr & 0x1c) >> 2, 0); - tileinfo->category = (attr & 0x20) >> 5; + tileinfo.category = (attr & 0x20) >> 5; } @@ -99,7 +99,7 @@ suprloco_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_scroll_rows(state->m_bg_tilemap,32); + state->m_bg_tilemap->set_scroll_rows(32); } @@ -114,7 +114,7 @@ { suprloco_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset/2); + state->m_bg_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( suprloco_scrollram_w ) @@ -123,7 +123,7 @@ int adj = flip_screen_get(space->machine()) ? -8 : 8; state->m_scrollram[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap,offset, data - adj); + state->m_bg_tilemap->set_scrollx(offset, data - adj); } WRITE8_HANDLER( suprloco_control_w ) @@ -161,25 +161,20 @@ -INLINE void draw_pixel(bitmap_t *bitmap,const rectangle *cliprect,int x,int y,int color,int flip) +INLINE void draw_pixel(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip) { if (flip) { - x = bitmap->width - x - 1; - y = bitmap->height - y - 1; + x = bitmap.width() - x - 1; + y = bitmap.height() - y - 1; } - if (x < cliprect->min_x || - x > cliprect->max_x || - y < cliprect->min_y || - y > cliprect->max_y) - return; - - *BITMAP_ADDR16(bitmap, y, x) = color; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = color; } -static void draw_sprite(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int spr_number) +static void draw_sprite(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int spr_number) { suprloco_state *state = machine.driver_data(); int flip = flip_screen_get(machine); @@ -254,7 +249,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { suprloco_state *state = machine.driver_data(); int spr_number; @@ -269,11 +264,11 @@ } } -SCREEN_UPDATE( suprloco ) +SCREEN_UPDATE_IND16( suprloco ) { - suprloco_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,1,0); + suprloco_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1,0); return 0; } diff -Nru mame-0.144/src/mame/video/suprnova.c mame-0.145/src/mame/video/suprnova.c --- mame-0.144/src/mame/video/suprnova.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/suprnova.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,15 +6,15 @@ /* draws ROZ with linescroll OR columnscroll to 16-bit indexed bitmap */ -static void suprnova_draw_roz(bitmap_t* bitmap, bitmap_t* bitmapflags, const rectangle *cliprect, tilemap_t *tmap, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound, int columnscroll, UINT32* scrollram) +static void suprnova_draw_roz(bitmap_ind16 &bitmap, bitmap_ind8& bitmapflags, const rectangle &cliprect, tilemap_t *tmap, UINT32 startx, UINT32 starty, int incxx, int incxy, int incyx, int incyy, int wraparound, int columnscroll, UINT32* scrollram) { - //bitmap_t *destbitmap = bitmap; - bitmap_t *srcbitmap = tilemap_get_pixmap(tmap); - bitmap_t *srcbitmapflags = tilemap_get_flagsmap(tmap); - const int xmask = srcbitmap->width-1; - const int ymask = srcbitmap->height-1; - const int widthshifted = srcbitmap->width << 16; - const int heightshifted = srcbitmap->height << 16; + //bitmap_ind16 *destbitmap = bitmap; + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &srcbitmapflags = tmap->flagsmap(); + const int xmask = srcbitmap.width()-1; + const int ymask = srcbitmap.height()-1; + const int widthshifted = srcbitmap.width() << 16; + const int heightshifted = srcbitmap.height() << 16; UINT32 cx; UINT32 cy; int x; @@ -30,14 +30,14 @@ //int destadvance = destbitmap->bpp / 8; /* pre-advance based on the cliprect */ - startx += cliprect->min_x * incxx + cliprect->min_y * incyx; - starty += cliprect->min_x * incxy + cliprect->min_y * incyy; + startx += cliprect.min_x * incxx + cliprect.min_y * incyx; + starty += cliprect.min_x * incxy + cliprect.min_y * incyy; /* extract start/end points */ - sx = cliprect->min_x; - sy = cliprect->min_y; - ex = cliprect->max_x; - ey = cliprect->max_y; + sx = cliprect.min_x; + sy = cliprect.min_y; + ex = cliprect.max_x; + ey = cliprect.max_y; { /* loop over rows */ @@ -50,8 +50,8 @@ cy = starty; /* get dest and priority pointers */ - dest = BITMAP_ADDR16( bitmap, sy, sx); - destflags = BITMAP_ADDR8( bitmapflags, sy, sx); + dest = &bitmap.pix16(sy, sx); + destflags = &bitmapflags.pix8(sy, sx); /* loop over columns */ while (x <= ex) @@ -60,13 +60,13 @@ { if (columnscroll) { - dest[0] = BITMAP_ADDR16(srcbitmap, ((cy >> 16) - scrollram[(cx>>16)&0x3ff]) & ymask, (cx >> 16) & xmask)[0]; - destflags[0] = BITMAP_ADDR8(srcbitmapflags, ((cy >> 16) - scrollram[(cx>>16)&0x3ff]) & ymask, (cx >> 16) & xmask)[0]; + dest[0] = srcbitmap.pix16(((cy >> 16) - scrollram[(cx>>16)&0x3ff]) & ymask, (cx >> 16) & xmask); + destflags[0] = srcbitmapflags.pix8(((cy >> 16) - scrollram[(cx>>16)&0x3ff]) & ymask, (cx >> 16) & xmask); } else { - dest[0] = BITMAP_ADDR16(srcbitmap, (cy >> 16) & ymask, ((cx >> 16) - scrollram[(cy>>16)&0x3ff]) & xmask)[0]; - destflags[0] = BITMAP_ADDR8(srcbitmapflags, (cy >> 16) & ymask, ((cx >> 16) - scrollram[(cy>>16)&0x3ff]) & xmask)[0]; + dest[0] = srcbitmap.pix16((cy >> 16) & ymask, ((cx >> 16) - scrollram[(cy>>16)&0x3ff]) & xmask); + destflags[0] = srcbitmapflags.pix8((cy >> 16) & ymask, ((cx >> 16) - scrollram[(cy>>16)&0x3ff]) & xmask); } } @@ -291,7 +291,7 @@ code, 0x40+colr, flags); - tileinfo->category = pri; + tileinfo.category = pri; //if (pri) popmessage("pri A!! %02x\n", pri); } @@ -300,7 +300,7 @@ { skns_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemapA_ram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_A,offset); + state->m_tilemap_A->mark_tile_dirty(offset); } static TILE_GET_INFO( get_tilemap_B_tile_info ) @@ -320,7 +320,7 @@ code, 0x40+colr, flags); - tileinfo->category = pri; + tileinfo.category = pri; //if (pri) popmessage("pri B!! %02x\n", pri); // 02 on cyvern } @@ -329,7 +329,7 @@ { skns_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_tilemapB_ram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_B,offset); + state->m_tilemap_B->mark_tile_dirty(offset); } WRITE32_HANDLER ( skns_v3_regs_w ) @@ -346,8 +346,8 @@ state->m_depthA = (state->m_v3_regs[0x0c/4] & 0x0001) << 1; state->m_depthB = (state->m_v3_regs[0x0c/4] & 0x0100) >> 7; - if (old_depthA != state->m_depthA) tilemap_mark_all_tiles_dirty (state->m_tilemap_A); - if (old_depthB != state->m_depthB) tilemap_mark_all_tiles_dirty (state->m_tilemap_B); + if (old_depthA != state->m_depthA) state->m_tilemap_A->mark_all_dirty(); + if (old_depthB != state->m_depthB) state->m_tilemap_B->mark_all_dirty(); } } @@ -360,18 +360,18 @@ state->m_spritegen = machine.device("spritegen"); state->m_tilemap_A = tilemap_create(machine, get_tilemap_A_tile_info,tilemap_scan_rows,16,16,64, 64); - tilemap_set_transparent_pen(state->m_tilemap_A,0); + state->m_tilemap_A->set_transparent_pen(0); state->m_tilemap_B = tilemap_create(machine, get_tilemap_B_tile_info,tilemap_scan_rows,16,16,64, 64); - tilemap_set_transparent_pen(state->m_tilemap_B,0); + state->m_tilemap_B->set_transparent_pen(0); - state->m_sprite_bitmap = auto_bitmap_alloc(machine,1024,1024,BITMAP_FORMAT_INDEXED16); + state->m_sprite_bitmap.allocate(1024,1024); - state->m_tilemap_bitmap_lower = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16); - state->m_tilemap_bitmapflags_lower = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED8); + state->m_tilemap_bitmap_lower.allocate(320,240); + state->m_tilemap_bitmapflags_lower.allocate(320,240); - state->m_tilemap_bitmap_higher = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16); - state->m_tilemap_bitmapflags_higher = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED8); + state->m_tilemap_bitmap_higher.allocate(320,240); + state->m_tilemap_bitmapflags_higher.allocate(320,240); machine.gfx[2]->color_granularity=256; machine.gfx[3]->color_granularity=256; @@ -391,7 +391,7 @@ state->m_alt_enable_background = state->m_alt_enable_sprites = 1; } -static void supernova_draw_a( running_machine &machine, bitmap_t *bitmap, bitmap_t* bitmap_flags, const rectangle *cliprect, int tran ) +static void supernova_draw_a( running_machine &machine, bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_flags, const rectangle &cliprect, int tran ) { skns_state *state = machine.driver_data(); int enable_a = (state->m_v3_regs[0x10/4] >> 0) & 0x0001; @@ -422,7 +422,7 @@ } } -static void supernova_draw_b( running_machine &machine, bitmap_t *bitmap, bitmap_t* bitmap_flags, const rectangle *cliprect, int tran ) +static void supernova_draw_b( running_machine &machine, bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_flags, const rectangle &cliprect, int tran ) { skns_state *state = machine.driver_data(); int enable_b = (state->m_v3_regs[0x34/4] >> 0) & 0x0001; @@ -453,17 +453,17 @@ } } -SCREEN_UPDATE(skns) +SCREEN_UPDATE_RGB32(skns) { - skns_state *state = screen->machine().driver_data(); + skns_state *state = screen.machine().driver_data(); - palette_update(screen->machine()); + palette_update(screen.machine()); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); - bitmap_fill(state->m_tilemap_bitmap_lower, NULL, 0); - bitmap_fill(state->m_tilemap_bitmapflags_lower, NULL, 0); - bitmap_fill(state->m_tilemap_bitmap_higher, NULL, 0); - bitmap_fill(state->m_tilemap_bitmapflags_higher, NULL, 0); + bitmap.fill(get_black_pen(screen.machine()), cliprect); + state->m_tilemap_bitmap_lower.fill(0); + state->m_tilemap_bitmapflags_lower.fill(0); + state->m_tilemap_bitmap_higher.fill(0); + state->m_tilemap_bitmapflags_higher.fill(0); { int supernova_pri_a; @@ -476,8 +476,8 @@ //popmessage("pri %d %d\n", supernova_pri_a, supernova_pri_b); /*if (!supernova_pri_b) { */ - supernova_draw_b(screen->machine(), state->m_tilemap_bitmap_lower, state->m_tilemap_bitmapflags_lower, cliprect,tran);// tran = 1; - supernova_draw_a(screen->machine(), state->m_tilemap_bitmap_higher,state->m_tilemap_bitmapflags_higher,cliprect,tran);// tran = 1; + supernova_draw_b(screen.machine(), state->m_tilemap_bitmap_lower, state->m_tilemap_bitmapflags_lower, cliprect,tran);// tran = 1; + supernova_draw_a(screen.machine(), state->m_tilemap_bitmap_higher,state->m_tilemap_bitmapflags_higher,cliprect,tran);// tran = 1; { int x,y; @@ -486,21 +486,21 @@ UINT32* dst; UINT16 pri, pri2, pri3; UINT16 bgpri; - const pen_t *clut = &screen->machine().pens[0]; + const pen_t *clut = &screen.machine().pens[0]; // int drawpri; for (y=0;y<240;y++) { - src = BITMAP_ADDR16(state->m_tilemap_bitmap_lower, y, 0); - srcflags = BITMAP_ADDR8(state->m_tilemap_bitmapflags_lower, y, 0); + src = &state->m_tilemap_bitmap_lower.pix16(y); + srcflags = &state->m_tilemap_bitmapflags_lower.pix8(y); - src2 = BITMAP_ADDR16(state->m_tilemap_bitmap_higher, y, 0); - src2flags = BITMAP_ADDR8(state->m_tilemap_bitmapflags_higher, y, 0); + src2 = &state->m_tilemap_bitmap_higher.pix16(y); + src2flags = &state->m_tilemap_bitmapflags_higher.pix8(y); - src3 = BITMAP_ADDR16(state->m_sprite_bitmap, y, 0); + src3 = &state->m_sprite_bitmap.pix16(y); - dst = BITMAP_ADDR32(bitmap, y, 0); + dst = &bitmap.pix32(y); for (x=0;x<320;x++) @@ -628,16 +628,16 @@ } } - bitmap_fill(state->m_sprite_bitmap, cliprect, 0x0000); + state->m_sprite_bitmap.fill(0x0000, cliprect); if (state->m_alt_enable_sprites) - state->m_spritegen->skns_draw_sprites(screen->machine(), state->m_sprite_bitmap, cliprect, screen->machine().generic.spriteram.u32, screen->machine().generic.spriteram_size, screen->machine().region("gfx1")->base(), screen->machine().region ("gfx1")->bytes(), state->m_spc_regs ); + state->m_spritegen->skns_draw_sprites(screen.machine(), state->m_sprite_bitmap, cliprect, screen.machine().generic.spriteram.u32, screen.machine().generic.spriteram_size, screen.machine().region("gfx1")->base(), screen.machine().region ("gfx1")->bytes(), state->m_spc_regs ); return 0; } -SCREEN_EOF(skns) +SCREEN_VBLANK(skns) { } diff -Nru mame-0.144/src/mame/video/suprridr.c mame-0.145/src/mame/video/suprridr.c --- mame-0.144/src/mame/video/suprridr.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/suprridr.c 2012-02-06 21:30:31.000000000 +0000 @@ -44,7 +44,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32); state->m_bg_tilemap_noscroll = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } @@ -95,7 +95,7 @@ { suprridr_state *state = space->machine().driver_data(); state->m_flipx = data & 1; - tilemap_set_flip_all(space->machine(), (state->m_flipx ? TILEMAP_FLIPX : 0) | (state->m_flipy ? TILEMAP_FLIPY : 0)); + space->machine().tilemap().set_flip_all((state->m_flipx ? TILEMAP_FLIPX : 0) | (state->m_flipy ? TILEMAP_FLIPY : 0)); } @@ -103,28 +103,28 @@ { suprridr_state *state = space->machine().driver_data(); state->m_flipy = data & 1; - tilemap_set_flip_all(space->machine(), (state->m_flipx ? TILEMAP_FLIPX : 0) | (state->m_flipy ? TILEMAP_FLIPY : 0)); + space->machine().tilemap().set_flip_all((state->m_flipx ? TILEMAP_FLIPX : 0) | (state->m_flipy ? TILEMAP_FLIPY : 0)); } WRITE8_HANDLER( suprridr_fgdisable_w ) { suprridr_state *state = space->machine().driver_data(); - tilemap_set_enable(state->m_fg_tilemap, ~data & 1); + state->m_fg_tilemap->enable(~data & 1); } WRITE8_HANDLER( suprridr_fgscrolly_w ) { suprridr_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_fg_tilemap, 0, data); + state->m_fg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( suprridr_bgscrolly_w ) { suprridr_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } @@ -146,8 +146,8 @@ { suprridr_state *state = space->machine().driver_data(); state->m_bgram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); - tilemap_mark_tile_dirty(state->m_bg_tilemap_noscroll, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); + state->m_bg_tilemap_noscroll->mark_tile_dirty(offset); } @@ -155,7 +155,7 @@ { suprridr_state *state = space->machine().driver_data(); state->m_fgram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -166,35 +166,35 @@ * *************************************/ -SCREEN_UPDATE( suprridr ) +SCREEN_UPDATE_IND16( suprridr ) { - suprridr_state *state = screen->machine().driver_data(); + suprridr_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; rectangle subclip; int i; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); /* render left 4 columns with no scroll */ subclip = visarea;; subclip.max_x = subclip.min_x + (state->m_flipx ? 1*8 : 4*8) - 1; - sect_rect(&subclip, cliprect); - tilemap_draw(bitmap, &subclip, state->m_bg_tilemap_noscroll, 0, 0); + subclip &= cliprect; + state->m_bg_tilemap_noscroll->draw(bitmap, subclip, 0, 0); /* render right 1 column with no scroll */ subclip = visarea;; subclip.min_x = subclip.max_x - (state->m_flipx ? 4*8 : 1*8) + 1; - sect_rect(&subclip, cliprect); - tilemap_draw(bitmap, &subclip, state->m_bg_tilemap_noscroll, 0, 0); + subclip &= cliprect; + state->m_bg_tilemap_noscroll->draw(bitmap, subclip, 0, 0); /* render the middle columns normally */ subclip = visarea;; subclip.min_x += state->m_flipx ? 1*8 : 4*8; subclip.max_x -= state->m_flipx ? 4*8 : 1*8; - sect_rect(&subclip, cliprect); - tilemap_draw(bitmap, &subclip, state->m_bg_tilemap, 0, 0); + subclip &= cliprect; + state->m_bg_tilemap->draw(bitmap, subclip, 0, 0); /* render the top layer */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); /* draw the sprites */ for (i = 0; i < 48; i++) @@ -216,7 +216,7 @@ fy = !fy; y = 240 - y; } - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2], code, color, fx, fy, x, y, 0); + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[2], code, color, fx, fy, x, y, 0); } return 0; } diff -Nru mame-0.144/src/mame/video/suprslam.c mame-0.145/src/mame/video/suprslam.c --- mame-0.144/src/mame/video/suprslam.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/suprslam.c 2012-02-06 21:30:31.000000000 +0000 @@ -6,7 +6,7 @@ /* todo, fix zooming correctly, it's _not_ like aerofgt */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* SPRITE INFO @@ -102,7 +102,7 @@ suprslam_state *state = space->machine().driver_data(); state->m_screen_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_screen_tilemap, offset); + state->m_screen_tilemap->mark_tile_dirty(offset); } @@ -125,7 +125,7 @@ suprslam_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -149,21 +149,21 @@ state->m_bg_tilemap = tilemap_create(machine, get_suprslam_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_screen_tilemap = tilemap_create(machine, get_suprslam_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_screen_tilemap, 15); + state->m_screen_tilemap->set_transparent_pen(15); } -SCREEN_UPDATE( suprslam ) +SCREEN_UPDATE_IND16( suprslam ) { - suprslam_state *state = screen->machine().driver_data(); - tilemap_set_scrollx( state->m_screen_tilemap,0, state->m_screen_vregs[0x04/2] ); + suprslam_state *state = screen.machine().driver_data(); + state->m_screen_tilemap->set_scrollx(0, state->m_screen_vregs[0x04/2] ); - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_bg_tilemap, 0, 0, 1); if(!(state->m_spr_ctrl[0] & 8)) - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_screen_tilemap, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_screen_tilemap->draw(bitmap, cliprect, 0, 0); if(state->m_spr_ctrl[0] & 8) - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -178,7 +178,7 @@ state->m_bg_bank = (data & 0x0f00) << 4; if (state->m_screen_bank != old_screen_bank) - tilemap_mark_all_tiles_dirty(state->m_screen_tilemap); + state->m_screen_tilemap->mark_all_dirty(); if (state->m_bg_bank != old_bg_bank) - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } diff -Nru mame-0.144/src/mame/video/surpratk.c mame-0.145/src/mame/video/surpratk.c --- mame-0.144/src/mame/video/surpratk.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/surpratk.c 2012-02-06 21:30:31.000000000 +0000 @@ -46,9 +46,9 @@ ***************************************************************************/ -SCREEN_UPDATE( surpratk ) +SCREEN_UPDATE_IND16( surpratk ) { - surpratk_state *state = screen->machine().driver_data(); + surpratk_state *state = screen.machine().driver_data(); int layer[3], bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -68,8 +68,8 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[0], 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[2], 0, 4); diff -Nru mame-0.144/src/mame/video/system16.c mame-0.145/src/mame/video/system16.c --- mame-0.144/src/mame/video/system16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/system16.c 2012-02-06 21:30:31.000000000 +0000 @@ -176,18 +176,18 @@ { all_dirty = 1; state->m_old_tile_bank0 = state->m_tile_bank0; - tilemap_mark_all_tiles_dirty(state->m_text_layer); + state->m_text_layer->mark_all_dirty(); } if (all_dirty) { - tilemap_mark_all_tiles_dirty(state->m_background); - tilemap_mark_all_tiles_dirty(state->m_foreground); + state->m_background->mark_all_dirty(); + state->m_foreground->mark_all_dirty(); if (state->m_system18) { - tilemap_mark_all_tiles_dirty(state->m_background2); - tilemap_mark_all_tiles_dirty(state->m_foreground2); + state->m_background2->mark_all_dirty(); + state->m_foreground2->mark_all_dirty(); } } else { @@ -199,7 +199,7 @@ state->m_old_bg_page[i] = state->m_bg_page[i]; for (offset = page0; offset < page0 + 64 * 32; offset++) { - tilemap_mark_tile_dirty(state->m_background, offset); + state->m_background->mark_tile_dirty(offset); } } @@ -208,7 +208,7 @@ state->m_old_fg_page[i] = state->m_fg_page[i]; for (offset = page0; offset < page0 + 64 * 32; offset++) { - tilemap_mark_tile_dirty(state->m_foreground, offset); + state->m_foreground->mark_tile_dirty(offset); } } @@ -219,7 +219,7 @@ state->m_old_bg2_page[i] = state->m_bg2_page[i]; for (offset = page0; offset < page0 + 64 * 32; offset++) { - tilemap_mark_tile_dirty(state->m_background2, offset); + state->m_background2->mark_tile_dirty(offset); } } @@ -228,7 +228,7 @@ state->m_old_fg2_page[i] = state->m_fg2_page[i]; for (offset = page0; offset < page0 + 64 * 32; offset++) { - tilemap_mark_tile_dirty(state->m_foreground2, offset); + state->m_foreground2->mark_tile_dirty(offset); } } } @@ -304,27 +304,27 @@ int page = offset / (64 * 32); offset = offset % (64 * 32); - if (state->m_bg_page[0] == page) tilemap_mark_tile_dirty(state->m_background, offset + 64 * 32 * 0); - if (state->m_bg_page[1] == page) tilemap_mark_tile_dirty(state->m_background, offset + 64 * 32 * 1); - if (state->m_bg_page[2] == page) tilemap_mark_tile_dirty(state->m_background, offset + 64 * 32 * 2); - if (state->m_bg_page[3] == page) tilemap_mark_tile_dirty(state->m_background, offset + 64 * 32 * 3); - - if (state->m_fg_page[0] == page) tilemap_mark_tile_dirty(state->m_foreground, offset + 64 * 32 * 0); - if (state->m_fg_page[1] == page) tilemap_mark_tile_dirty(state->m_foreground, offset + 64 * 32 * 1); - if (state->m_fg_page[2] == page) tilemap_mark_tile_dirty(state->m_foreground, offset + 64 * 32 * 2); - if (state->m_fg_page[3] == page) tilemap_mark_tile_dirty(state->m_foreground, offset + 64 * 32 * 3); + if (state->m_bg_page[0] == page) state->m_background->mark_tile_dirty(offset + 64 * 32 * 0); + if (state->m_bg_page[1] == page) state->m_background->mark_tile_dirty(offset + 64 * 32 * 1); + if (state->m_bg_page[2] == page) state->m_background->mark_tile_dirty(offset + 64 * 32 * 2); + if (state->m_bg_page[3] == page) state->m_background->mark_tile_dirty(offset + 64 * 32 * 3); + + if (state->m_fg_page[0] == page) state->m_foreground->mark_tile_dirty(offset + 64 * 32 * 0); + if (state->m_fg_page[1] == page) state->m_foreground->mark_tile_dirty(offset + 64 * 32 * 1); + if (state->m_fg_page[2] == page) state->m_foreground->mark_tile_dirty(offset + 64 * 32 * 2); + if (state->m_fg_page[3] == page) state->m_foreground->mark_tile_dirty(offset + 64 * 32 * 3); if (state->m_system18) { - if (state->m_bg2_page[0] == page) tilemap_mark_tile_dirty(state->m_background2, offset + 64 * 32 * 0); - if (state->m_bg2_page[1] == page) tilemap_mark_tile_dirty(state->m_background2, offset + 64 * 32 * 1); - if (state->m_bg2_page[2] == page) tilemap_mark_tile_dirty(state->m_background2, offset + 64 * 32 * 2); - if (state->m_bg2_page[3] == page) tilemap_mark_tile_dirty(state->m_background2, offset + 64 * 32 * 3); - - if (state->m_fg2_page[0] == page) tilemap_mark_tile_dirty(state->m_foreground2, offset + 64 * 32 * 0); - if (state->m_fg2_page[1] == page) tilemap_mark_tile_dirty(state->m_foreground2, offset + 64 * 32 * 1); - if (state->m_fg2_page[2] == page) tilemap_mark_tile_dirty(state->m_foreground2, offset + 64 * 32 * 2); - if (state->m_fg2_page[3] == page) tilemap_mark_tile_dirty(state->m_foreground2, offset + 64 * 32 * 3); + if (state->m_bg2_page[0] == page) state->m_background2->mark_tile_dirty(offset + 64 * 32 * 0); + if (state->m_bg2_page[1] == page) state->m_background2->mark_tile_dirty(offset + 64 * 32 * 1); + if (state->m_bg2_page[2] == page) state->m_background2->mark_tile_dirty(offset + 64 * 32 * 2); + if (state->m_bg2_page[3] == page) state->m_background2->mark_tile_dirty(offset + 64 * 32 * 3); + + if (state->m_fg2_page[0] == page) state->m_foreground2->mark_tile_dirty(offset + 64 * 32 * 0); + if (state->m_fg2_page[1] == page) state->m_foreground2->mark_tile_dirty(offset + 64 * 32 * 1); + if (state->m_fg2_page[2] == page) state->m_foreground2->mark_tile_dirty(offset + 64 * 32 * 2); + if (state->m_fg2_page[3] == page) state->m_foreground2->mark_tile_dirty(offset + 64 * 32 * 3); } } } @@ -356,9 +356,9 @@ } if (pri >= state->m_textlayer_lo_min && pri <= state->m_textlayer_lo_max) - tileinfo->category = 1; + tileinfo.category = 1; if (pri >= state->m_textlayer_hi_min && pri <= state->m_textlayer_hi_max) - tileinfo->category = 0; + tileinfo.category = 0; } WRITE16_HANDLER( sys16_textram_w ) @@ -366,7 +366,7 @@ segas1x_bootleg_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_textram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer, offset); + state->m_text_layer->mark_tile_dirty(offset); } /***************************************************************************/ @@ -407,9 +407,9 @@ 40,28 ); { - if (state->m_bg1_trans) tilemap_set_transparent_pen(state->m_background, 0); - tilemap_set_transparent_pen(state->m_foreground, 0); - tilemap_set_transparent_pen(state->m_text_layer, 0); + if (state->m_bg1_trans) state->m_background->set_transparent_pen(0); + state->m_foreground->set_transparent_pen(0); + state->m_text_layer->set_transparent_pen(0); state->m_tile_bank0 = 0; state->m_tile_bank1 = 1; @@ -456,18 +456,18 @@ 8,8, 64*2,32*2 ); - tilemap_set_transparent_pen(state->m_foreground2, 0); + state->m_foreground2->set_transparent_pen(0); if (state->m_splittab_fg_x) { - tilemap_set_scroll_rows(state->m_foreground , 64); - tilemap_set_scroll_rows(state->m_foreground2 , 64); + state->m_foreground ->set_scroll_rows(64); + state->m_foreground2 ->set_scroll_rows(64); } if (state->m_splittab_bg_x) { - tilemap_set_scroll_rows(state->m_background , 64); - tilemap_set_scroll_rows(state->m_background2 , 64); + state->m_background ->set_scroll_rows(64); + state->m_background2 ->set_scroll_rows(64); } state->m_textlayer_lo_min = 0; @@ -602,9 +602,9 @@ state->m_bg_tilemaps[0] = tilemap_create(machine, get_s16a_bootleg_tile_info0, tilemap_scan_rows, 8,8, 64,32 ); state->m_bg_tilemaps[1] = tilemap_create(machine, get_s16a_bootleg_tile_info1, tilemap_scan_rows, 8,8, 64,32 ); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); - tilemap_set_transparent_pen(state->m_bg_tilemaps[0], 0); - tilemap_set_transparent_pen(state->m_bg_tilemaps[1], 0); + state->m_text_tilemap->set_transparent_pen(0); + state->m_bg_tilemaps[0]->set_transparent_pen(0); + state->m_bg_tilemaps[1]->set_transparent_pen(0); segaic16_palette_init(0x800); @@ -629,9 +629,9 @@ } // Passing Shot (2 player), Shinobi (Datsu), Wonderboy 3 -SCREEN_UPDATE( s16a_bootleg ) +SCREEN_UPDATE_IND16( s16a_bootleg ) { - segas1x_bootleg_state *state = screen->machine().driver_data(); + segas1x_bootleg_state *state = screen.machine().driver_data(); // passing shot int offset_txtx = 192; @@ -641,43 +641,43 @@ int offset_bg0x = 187; int offset_bg0y = 0; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // I can't bring myself to care about dirty tile marking on something which runs at a bazillion % speed anyway, clean code is better - tilemap_mark_all_tiles_dirty(state->m_bg_tilemaps[0]); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemaps[1]); - tilemap_mark_all_tiles_dirty(state->m_text_tilemap); + state->m_bg_tilemaps[0]->mark_all_dirty(); + state->m_bg_tilemaps[1]->mark_all_dirty(); + state->m_text_tilemap->mark_all_dirty(); - tilemap_set_scrollx(state->m_text_tilemap, 0, offset_txtx); - tilemap_set_scrolly(state->m_text_tilemap, 0, offset_txty); + state->m_text_tilemap->set_scrollx(0, offset_txtx); + state->m_text_tilemap->set_scrolly(0, offset_txty); if ((state->m_tilemapselect & 0xff) == 0x12) { - tilemap_set_scrollx(state->m_bg_tilemaps[1], 0, state->m_bg_scrollx + offset_bg1x); - tilemap_set_scrolly(state->m_bg_tilemaps[1], 0, state->m_bg_scrolly + offset_bg1y + state->m_back_yscroll); - tilemap_set_scrollx(state->m_bg_tilemaps[0], 0, state->m_fg_scrollx + offset_bg0x); - tilemap_set_scrolly(state->m_bg_tilemaps[0], 0, state->m_fg_scrolly + offset_bg0y + state->m_fore_yscroll); + state->m_bg_tilemaps[1]->set_scrollx(0, state->m_bg_scrollx + offset_bg1x); + state->m_bg_tilemaps[1]->set_scrolly(0, state->m_bg_scrolly + offset_bg1y + state->m_back_yscroll); + state->m_bg_tilemaps[0]->set_scrollx(0, state->m_fg_scrollx + offset_bg0x); + state->m_bg_tilemaps[0]->set_scrolly(0, state->m_fg_scrolly + offset_bg0y + state->m_fore_yscroll); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[0], TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[1], 0, 0); + state->m_bg_tilemaps[0]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemaps[1]->draw(bitmap, cliprect, 0, 0); - tilemap_set_scrolly(state->m_text_tilemap, 0, state->m_text_yscroll); + state->m_text_tilemap->set_scrolly(0, state->m_text_yscroll); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); } else if ((state->m_tilemapselect & 0xff) == 0x21) { - tilemap_set_scrollx(state->m_bg_tilemaps[0], 0, state->m_bg_scrollx + 187 ); - tilemap_set_scrolly(state->m_bg_tilemaps[0], 0, state->m_bg_scrolly + state->m_back_yscroll ); - tilemap_set_scrollx(state->m_bg_tilemaps[1], 0, state->m_fg_scrollx + 187 ); - tilemap_set_scrolly(state->m_bg_tilemaps[1], 0, state->m_fg_scrolly + 1 + state->m_fore_yscroll ); + state->m_bg_tilemaps[0]->set_scrollx(0, state->m_bg_scrollx + 187 ); + state->m_bg_tilemaps[0]->set_scrolly(0, state->m_bg_scrolly + state->m_back_yscroll ); + state->m_bg_tilemaps[1]->set_scrollx(0, state->m_fg_scrollx + 187 ); + state->m_bg_tilemaps[1]->set_scrolly(0, state->m_fg_scrolly + 1 + state->m_fore_yscroll ); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[1], TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[0], 0, 0); + state->m_bg_tilemaps[1]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemaps[0]->draw(bitmap, cliprect, 0, 0); - tilemap_set_scrolly(state->m_text_tilemap, 0, state->m_text_yscroll); + state->m_text_tilemap->set_scrolly(0, state->m_text_yscroll); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); } /* draw the sprites */ @@ -687,9 +687,9 @@ } /* The Passing Shot 4 Player bootleg has weird scroll registers (different offsets, ^0x7 xor) */ -SCREEN_UPDATE( s16a_bootleg_passht4b ) +SCREEN_UPDATE_IND16( s16a_bootleg_passht4b ) { - segas1x_bootleg_state *state = screen->machine().driver_data(); + segas1x_bootleg_state *state = screen.machine().driver_data(); // passing shot int offset_txtx = 192; @@ -699,26 +699,26 @@ int offset_bg0x = 5; int offset_bg0y = 32; - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // I can't bring myself to care about dirty tile marking on something which runs at a bazillion % speed anyway, clean code is better - tilemap_mark_all_tiles_dirty(state->m_bg_tilemaps[0]); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemaps[1]); - tilemap_mark_all_tiles_dirty(state->m_text_tilemap); + state->m_bg_tilemaps[0]->mark_all_dirty(); + state->m_bg_tilemaps[1]->mark_all_dirty(); + state->m_text_tilemap->mark_all_dirty(); - tilemap_set_scrollx(state->m_text_tilemap, 0, offset_txtx); - tilemap_set_scrolly(state->m_text_tilemap, 0, offset_txty); + state->m_text_tilemap->set_scrollx(0, offset_txtx); + state->m_text_tilemap->set_scrolly(0, offset_txty); if ((state->m_tilemapselect & 0xff) == 0x12) { - tilemap_set_scrollx(state->m_bg_tilemaps[1], 0, (state->m_bg_scrollx ^ 0x7) + offset_bg1x); - tilemap_set_scrolly(state->m_bg_tilemaps[1], 0, state->m_bg_scrolly + offset_bg1y); - tilemap_set_scrollx(state->m_bg_tilemaps[0], 0, (state->m_fg_scrollx ^ 0x7) + offset_bg0x); - tilemap_set_scrolly(state->m_bg_tilemaps[0], 0, state->m_fg_scrolly + offset_bg0y); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[0], TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemaps[1], 0, 0); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + state->m_bg_tilemaps[1]->set_scrollx(0, (state->m_bg_scrollx ^ 0x7) + offset_bg1x); + state->m_bg_tilemaps[1]->set_scrolly(0, state->m_bg_scrolly + offset_bg1y); + state->m_bg_tilemaps[0]->set_scrollx(0, (state->m_fg_scrollx ^ 0x7) + offset_bg0x); + state->m_bg_tilemaps[0]->set_scrolly(0, state->m_fg_scrolly + offset_bg0y); + + state->m_bg_tilemaps[0]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_bg_tilemaps[1]->draw(bitmap, cliprect, 0, 0); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); } /* draw the sprites */ @@ -730,45 +730,45 @@ /***************************************************************************/ -SCREEN_UPDATE( system16 ) +SCREEN_UPDATE_IND16( system16 ) { - segas1x_bootleg_state *state = screen->machine().driver_data(); + segas1x_bootleg_state *state = screen.machine().driver_data(); if (!state->m_refreshenable) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } - update_page(screen->machine()); + update_page(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_set_scrollx(state->m_background, 0, -320 - state->m_bg_scrollx); - tilemap_set_scrolly(state->m_background, 0, -256 + state->m_bg_scrolly + state->m_back_yscroll); - tilemap_set_scrollx(state->m_foreground, 0, -320 - state->m_fg_scrollx); - tilemap_set_scrolly(state->m_foreground, 0, -256 + state->m_fg_scrolly + state->m_fore_yscroll); + state->m_background->set_scrollx(0, -320 - state->m_bg_scrollx); + state->m_background->set_scrolly(0, -256 + state->m_bg_scrolly + state->m_back_yscroll); + state->m_foreground->set_scrollx(0, -320 - state->m_fg_scrollx); + state->m_foreground->set_scrolly(0, -256 + state->m_fg_scrolly + state->m_fore_yscroll); - tilemap_set_scrollx(state->m_text_layer, 0, 0); - tilemap_set_scrolly(state->m_text_layer, 0, 0 + state->m_text_yscroll); + state->m_text_layer->set_scrollx(0, 0); + state->m_text_layer->set_scrolly(0, 0 + state->m_text_yscroll); /* Background */ - tilemap_draw(bitmap, cliprect, state->m_background, TILEMAP_DRAW_OPAQUE, 0x00); + state->m_background->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0x00); /* Foreground */ - tilemap_draw(bitmap, cliprect, state->m_foreground, 0, 0x03); - tilemap_draw(bitmap, cliprect, state->m_foreground, 1, 0x07); + state->m_foreground->draw(bitmap, cliprect, 0, 0x03); + state->m_foreground->draw(bitmap, cliprect, 1, 0x07); /* Text Layer */ if (state->m_textlayer_lo_max != 0) { - tilemap_draw(bitmap, cliprect, state->m_text_layer, 1, 7);// needed for Body Slam + state->m_text_layer->draw(bitmap, cliprect, 1, 7);// needed for Body Slam } - tilemap_draw(bitmap, cliprect, state->m_text_layer, 0, 0xf); + state->m_text_layer->draw(bitmap, cliprect, 0, 0xf); - //draw_sprites(screen->machine(), bitmap, cliprect,0); + //draw_sprites(screen.machine(), bitmap, cliprect,0); /* draw the sprites */ segaic16_sprites_draw(screen, bitmap, cliprect, 0); @@ -776,33 +776,33 @@ } -SCREEN_UPDATE( system18old ) +SCREEN_UPDATE_IND16( system18old ) { - segas1x_bootleg_state *state = screen->machine().driver_data(); + segas1x_bootleg_state *state = screen.machine().driver_data(); if (!state->m_refreshenable) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } - update_page(screen->machine()); + update_page(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + screen.machine().priority_bitmap.fill(0); - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_background, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_background, TILEMAP_DRAW_OPAQUE | 1, 0); //?? - tilemap_draw(bitmap, cliprect, state->m_background, TILEMAP_DRAW_OPAQUE | 2, 0); //?? - tilemap_draw(bitmap, cliprect, state->m_background, 1, 0x1); - tilemap_draw(bitmap, cliprect, state->m_background, 2, 0x3); + state->m_background->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_background->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 0); //?? + state->m_background->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 2, 0); //?? + state->m_background->draw(bitmap, cliprect, 1, 0x1); + state->m_background->draw(bitmap, cliprect, 2, 0x3); - tilemap_draw(bitmap, cliprect, state->m_foreground, 0, 0x3); - tilemap_draw(bitmap, cliprect, state->m_foreground, 1, 0x7); + state->m_foreground->draw(bitmap, cliprect, 0, 0x3); + state->m_foreground->draw(bitmap, cliprect, 1, 0x7); - tilemap_draw(bitmap, cliprect, state->m_text_layer, 1, 0x7); - tilemap_draw(bitmap, cliprect, state->m_text_layer, 0, 0xf); + state->m_text_layer->draw(bitmap, cliprect, 1, 0x7); + state->m_text_layer->draw(bitmap, cliprect, 0, 0xf); /* draw the sprites */ segaic16_sprites_draw(screen, bitmap, cliprect, 0); diff -Nru mame-0.144/src/mame/video/system1.c mame-0.145/src/mame/video/system1.c --- mame-0.144/src/mame/video/system1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/system1.c 2012-02-06 21:30:31.000000000 +0000 @@ -76,6 +76,14 @@ The third and fourth collision regions operate similarly, but return data for the 32x32x1 sprite collisions. +************************************************************************** + + TODO: + - Sprite vs background alignment is off sometimes, best visible when + scrolling, eg. in regulus, brain. Yet it is correct in other games, + such as wboy. + - not sure if sprite priorities are completely accurate + *************************************************************************/ #include "emu.h" @@ -123,12 +131,12 @@ for (pagenum = 0; pagenum < pagecount; pagenum++) { state->m_tilemap_page[pagenum] = tilemap_create(machine, tile_get_info, tilemap_scan_rows, 8,8, 32,32); - tilemap_set_transparent_pen(state->m_tilemap_page[pagenum], 0); - tilemap_set_user_data(state->m_tilemap_page[pagenum], state->m_videoram + 0x800 * pagenum); + state->m_tilemap_page[pagenum]->set_transparent_pen(0); + state->m_tilemap_page[pagenum]->set_user_data(state->m_videoram + 0x800 * pagenum); } /* allocate a temporary bitmap for sprite rendering */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, 256, 256, BITMAP_FORMAT_INDEXED16); + state->m_sprite_bitmap = auto_bitmap_ind16_alloc(machine, 512, 256); /* register for save stats */ state_save_register_global(machine, state->m_video_mode); @@ -162,7 +170,7 @@ WRITE8_HANDLER( system1_videomode_w ) { system1_state *state = space->machine().driver_data(); -if (data & 0x6e) logerror("videomode = %02x\n",data); + if (data & 0x6e) logerror("videomode = %02x\n",data); /* bit 4 is screen blank */ state->m_video_mode = data; @@ -269,7 +277,7 @@ offset |= 0x1000 * ((state->m_videoram_bank >> 1) % (state->m_tilemap_pages / 2)); videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_page[offset / 0x800], (offset % 0x800) / 2); + state->m_tilemap_page[offset / 0x800]->mark_tile_dirty((offset % 0x800) / 2); /* force a partial update if the page is changing */ if (state->m_tilemap_pages > 2 && offset >= 0x740 && offset < 0x748 && offset % 2 == 0) @@ -361,7 +369,7 @@ * *************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int xoffset) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset) { system1_state *state = machine.driver_data(); UINT32 gfxbanks = machine.region("sprites")->bytes() / 0x8000; @@ -377,12 +385,12 @@ UINT16 srcaddr = spritedata[6] + (spritedata[7] << 8); UINT16 stride = spritedata[4] + (spritedata[5] << 8); UINT8 bank = ((spritedata[3] & 0x80) >> 7) | ((spritedata[3] & 0x40) >> 5) | ((spritedata[3] & 0x20) >> 3); - int xstart = ((spritedata[2] + (spritedata[3] << 8)) & 0x1ff) / 2 + xoffset; + int xstart = ((spritedata[2] | (spritedata[3] << 8)) & 0x1ff) + xoffset; int bottom = spritedata[1] + 1; int top = spritedata[0] + 1; UINT16 palettebase = spritenum * 0x10; const UINT8 *gfxbankbase; - int x, y; + int x, y, i; /* writing an 0xff into the first byte of sprite RAM seems to disable all sprites; not sure if this applies to each sprite or only to the first one; see pitfall2 @@ -405,7 +413,7 @@ /* iterate over all rows of the sprite */ for (y = top; y < bottom; y++) { - UINT16 *destbase = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *destbase = &bitmap.pix16(y); UINT16 curaddr; int addrdelta; @@ -413,12 +421,12 @@ srcaddr += stride; /* skip if outside of our clipping area */ - if (y < cliprect->min_y || y > cliprect->max_y) + if (y < cliprect.min_y || y > cliprect.max_y) continue; /* iterate over X */ addrdelta = (srcaddr & 0x8000) ? -1 : 1; - for (x = xstart, curaddr = srcaddr; ; x += 2, curaddr += addrdelta) + for (x = xstart, curaddr = srcaddr; ; x += 4, curaddr += addrdelta) { UINT8 color1, color2; UINT8 data; @@ -444,14 +452,17 @@ /* draw if non-transparent */ if (color1 != 0) { - int effx = flipscreen ? 255 - (x + 0) : (x + 0); - if (effx >= cliprect->min_x && effx <= cliprect->max_x) + for (i = 0; i < 2; i++) { - int prevpix = destbase[effx]; - - if ((prevpix & 0x0f) != 0) - state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1; - destbase[effx] = color1 | palettebase; + int effx = flipscreen ? 0x1fe - (x + i) : (x + i); + if (effx >= cliprect.min_x && effx <= cliprect.max_x) + { + int prevpix = destbase[effx]; + + if ((prevpix & 0x0f) != 0) + state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1; + destbase[effx] = color1 | palettebase; + } } } @@ -462,14 +473,17 @@ /* draw if non-transparent */ if (color2 != 0) { - int effx = flipscreen ? 255 - (x + 1) : (x + 1); - if (effx >= cliprect->min_x && effx <= cliprect->max_x) + for (i = 0; i < 2; i++) { - int prevpix = destbase[effx]; - - if ((prevpix & 0x0f) != 0) - state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1; - destbase[effx] = color2 | palettebase; + int effx = flipscreen ? 0x1fe - (x + 2 + i) : (x + 2 + i); + if (effx >= cliprect.min_x && effx <= cliprect.max_x) + { + int prevpix = destbase[effx]; + + if ((prevpix & 0x0f) != 0) + state->m_sprite_collide[((prevpix >> 4) & 0x1f) + 32 * spritenum] = state->m_sprite_collide_summary = 1; + destbase[effx] = color2 | palettebase; + } } } } @@ -485,35 +499,35 @@ * *************************************/ -static void video_update_common(device_t *screen, bitmap_t *bitmap, const rectangle *cliprect, bitmap_t *fgpixmap, bitmap_t **bgpixmaps, const int *bgrowscroll, int bgyscroll, int spritexoffs) +static void video_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind16 &fgpixmap, bitmap_ind16 **bgpixmaps, const int *bgrowscroll, int bgyscroll, int spritexoffs) { - system1_state *state = screen->machine().driver_data(); - const UINT8 *lookup = screen->machine().region("proms")->base(); + system1_state *state = screen.machine().driver_data(); + const UINT8 *lookup = screen.machine().region("proms")->base(); int x, y; /* first clear the sprite bitmap and draw sprites within this area */ - bitmap_fill(state->m_sprite_bitmap, cliprect, 0); - draw_sprites(screen->machine(), state->m_sprite_bitmap, cliprect, spritexoffs); + state->m_sprite_bitmap->fill(0, cliprect); + draw_sprites(screen.machine(), *state->m_sprite_bitmap, cliprect, spritexoffs); /* iterate over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *fgbase = BITMAP_ADDR16(fgpixmap, y & 0xff, 0); - UINT16 *sprbase = BITMAP_ADDR16(state->m_sprite_bitmap, y & 0xff, 0); - UINT16 *dstbase = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *fgbase = &fgpixmap.pix16(y & 0xff); + UINT16 *sprbase = &state->m_sprite_bitmap->pix16(y & 0xff); + UINT16 *dstbase = &bitmap.pix16(y); int bgy = (y + bgyscroll) & 0x1ff; int bgxscroll = bgrowscroll[y / 8]; UINT16 *bgbase[2]; /* get the base of the left and right pixmaps for the effective background Y */ - bgbase[0] = BITMAP_ADDR16(bgpixmaps[(bgy >> 8) * 2 + 0], bgy & 0xff, 0); - bgbase[1] = BITMAP_ADDR16(bgpixmaps[(bgy >> 8) * 2 + 1], bgy & 0xff, 0); + bgbase[0] = &bgpixmaps[(bgy >> 8) * 2 + 0]->pix16(bgy & 0xff); + bgbase[1] = &bgpixmaps[(bgy >> 8) * 2 + 1]->pix16(bgy & 0xff); /* iterate over pixels */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { - int bgx = (x - bgxscroll) & 0x1ff; - UINT16 fgpix = fgbase[x]; + int bgx = ((x - bgxscroll) / 2) & 0x1ff; + UINT16 fgpix = fgbase[x / 2]; UINT16 bgpix = bgbase[bgx >> 8][bgx & 0xff]; UINT16 sprpix = sprbase[x]; UINT8 lookup_index; @@ -553,30 +567,30 @@ * *************************************/ -SCREEN_UPDATE( system1 ) +SCREEN_UPDATE_IND16( system1 ) { - system1_state *state = screen->machine().driver_data(); + system1_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - bitmap_t *bgpixmaps[4], *fgpixmap; + bitmap_ind16 *bgpixmaps[4]; int bgrowscroll[32]; int xscroll, yscroll; int y; /* all 4 background pages are the same, fixed to page 0 */ - bgpixmaps[0] = bgpixmaps[1] = bgpixmaps[2] = bgpixmaps[3] = tilemap_get_pixmap(state->m_tilemap_page[0]); + bgpixmaps[0] = bgpixmaps[1] = bgpixmaps[2] = bgpixmaps[3] = &state->m_tilemap_page[0]->pixmap(); /* foreground is fixed to page 1 */ - fgpixmap = tilemap_get_pixmap(state->m_tilemap_page[1]); + bitmap_ind16 &fgpixmap = state->m_tilemap_page[1]->pixmap(); /* get fixed scroll offsets */ - xscroll = (videoram[0xffc] | (videoram[0xffd] << 8)) / 2 + 14; + xscroll = (INT16)((videoram[0xffc] | (videoram[0xffd] << 8)) + 28); yscroll = videoram[0xfbd]; /* adjust for flipping */ - if (flip_screen_get(screen->machine())) + if (flip_screen_get(screen.machine())) { - xscroll = 279 - xscroll; - yscroll = 256 - yscroll; + xscroll = 640 - (xscroll & 0x1ff); + yscroll = 764 - (yscroll & 0x1ff); } /* fill in the row scroll table */ @@ -589,37 +603,37 @@ } -SCREEN_UPDATE( system2 ) +SCREEN_UPDATE_IND16( system2 ) { - system1_state *state = screen->machine().driver_data(); + system1_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - bitmap_t *bgpixmaps[4], *fgpixmap; + bitmap_ind16 *bgpixmaps[4]; int rowscroll[32]; int xscroll, yscroll; int sprxoffset; int y; /* 4 independent background pages */ - bgpixmaps[0] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x740] & 7]); - bgpixmaps[1] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x742] & 7]); - bgpixmaps[2] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x744] & 7]); - bgpixmaps[3] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x746] & 7]); + bgpixmaps[0] = &state->m_tilemap_page[videoram[0x740] & 7]->pixmap(); + bgpixmaps[1] = &state->m_tilemap_page[videoram[0x742] & 7]->pixmap(); + bgpixmaps[2] = &state->m_tilemap_page[videoram[0x744] & 7]->pixmap(); + bgpixmaps[3] = &state->m_tilemap_page[videoram[0x746] & 7]->pixmap(); /* foreground is fixed to page 0 */ - fgpixmap = tilemap_get_pixmap(state->m_tilemap_page[0]); + bitmap_ind16 &fgpixmap = state->m_tilemap_page[0]->pixmap(); /* get scroll offsets */ - if (!flip_screen_get(screen->machine())) + if (!flip_screen_get(screen.machine())) { - xscroll = (((videoram[0x7c0] | (videoram[0x7c1] << 8)) / 2) & 0xff) - 256 + 5; + xscroll = ((videoram[0x7c0] | (videoram[0x7c1] << 8)) & 0x1ff) - 512 + 10; yscroll = videoram[0x7ba]; - sprxoffset = 7; + sprxoffset = 14; } else { - xscroll = 262+256 - ((((videoram[0x7f6] | (videoram[0x7f7] << 8)) / 2) & 0xff) - 256 + 5); - yscroll = 256+256 - videoram[0x784]; - sprxoffset = -7; + xscroll = 512 + 512 + 10 - (((videoram[0x7f6] | (videoram[0x7f7] << 8)) & 0x1ff) - 512 + 10); + yscroll = 512 + 512 - videoram[0x784]; + sprxoffset = -14; } /* fill in the row scroll table */ @@ -632,39 +646,44 @@ } -SCREEN_UPDATE( system2_rowscroll ) +SCREEN_UPDATE_IND16( system2_rowscroll ) { - system1_state *state = screen->machine().driver_data(); + system1_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; - bitmap_t *bgpixmaps[4], *fgpixmap; + bitmap_ind16 *bgpixmaps[4]; int rowscroll[32]; int yscroll; + int sprxoffset; int y; /* 4 independent background pages */ - bgpixmaps[0] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x740] & 7]); - bgpixmaps[1] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x742] & 7]); - bgpixmaps[2] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x744] & 7]); - bgpixmaps[3] = tilemap_get_pixmap(state->m_tilemap_page[videoram[0x746] & 7]); + bgpixmaps[0] = &state->m_tilemap_page[videoram[0x740] & 7]->pixmap(); + bgpixmaps[1] = &state->m_tilemap_page[videoram[0x742] & 7]->pixmap(); + bgpixmaps[2] = &state->m_tilemap_page[videoram[0x744] & 7]->pixmap(); + bgpixmaps[3] = &state->m_tilemap_page[videoram[0x746] & 7]->pixmap(); /* foreground is fixed to page 0 */ - fgpixmap = tilemap_get_pixmap(state->m_tilemap_page[0]); + bitmap_ind16 &fgpixmap = state->m_tilemap_page[0]->pixmap(); /* get scroll offsets */ - if (!flip_screen_get(screen->machine())) + if (!flip_screen_get(screen.machine())) { for (y = 0; y < 32; y++) - rowscroll[y] = (((videoram[0x7c0 + y * 2] | (videoram[0x7c1 + y * 2] << 8)) / 2) & 0xff) - 256 + 5; + rowscroll[y] = ((videoram[0x7c0 + y * 2] | (videoram[0x7c1 + y * 2] << 8)) & 0x1ff) - 512 + 10; + yscroll = videoram[0x7ba]; + sprxoffset = 14; } else { for (y = 0; y < 32; y++) - rowscroll[y] = 262+256 - ((((videoram[0x7fe - y * 2] | (videoram[0x7ff - y * 2] << 8)) / 2) & 0xff) - 256 + 5); - yscroll = 256+256 - videoram[0x784]; + rowscroll[y] = 512 + 512 + 10 - (((videoram[0x7fe - y * 2] | (videoram[0x7ff - y * 2] << 8)) & 0x1ff) - 512 + 10); + + yscroll = 512 + 512 - videoram[0x784]; + sprxoffset = -14; } /* common update */ - video_update_common(screen, bitmap, cliprect, fgpixmap, bgpixmaps, rowscroll, yscroll, 7); + video_update_common(screen, bitmap, cliprect, fgpixmap, bgpixmaps, rowscroll, yscroll, sprxoffset); return 0; } diff -Nru mame-0.144/src/mame/video/tagteam.c mame-0.145/src/mame/video/tagteam.c --- mame-0.144/src/mame/video/tagteam.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/tagteam.c 2012-02-06 21:30:32.000000000 +0000 @@ -46,14 +46,14 @@ { tagteam_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tagteam_colorram_w ) { tagteam_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( tagteam_mirrorvideoram_r ) @@ -123,7 +123,7 @@ if (flip_screen_get(space->machine()) != (data &0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } // d6/7: coin counters @@ -147,7 +147,7 @@ 8, 8, 32, 32); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tagteam_state *state = machine.driver_data(); int offs; @@ -192,10 +192,10 @@ } } -SCREEN_UPDATE( tagteam ) +SCREEN_UPDATE_IND16( tagteam ) { - tagteam_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + tagteam_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tail2nos.c mame-0.145/src/mame/video/tail2nos.c --- mame-0.144/src/mame/video/tail2nos.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tail2nos.c 2012-02-06 21:30:33.000000000 +0000 @@ -46,7 +46,7 @@ tail2nos_state *state = machine.driver_data(); int i; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); for (i = 0; i < 0x20000; i += 64) { @@ -60,7 +60,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg_tilemap, 15); + state->m_bg_tilemap->set_transparent_pen(15); state->m_zoomdata = (UINT16 *)machine.region("gfx3")->base(); @@ -81,7 +81,7 @@ tail2nos_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgvideoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ16_HANDLER( tail2nos_zoomdata_r ) @@ -119,7 +119,7 @@ if (state->m_charbank != bank) { state->m_charbank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 5 seems to select palette bank (used on startup) */ @@ -131,7 +131,7 @@ if (state->m_charpalette != bank) { state->m_charpalette = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bit 4 seems to be video enable */ @@ -146,7 +146,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { tail2nos_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -177,18 +177,18 @@ } } -SCREEN_UPDATE( tail2nos ) +SCREEN_UPDATE_IND16( tail2nos ) { - tail2nos_state *state = screen->machine().driver_data(); + tail2nos_state *state = screen.machine().driver_data(); if (state->m_video_enable) { k051316_zoom_draw(state->m_k051316, bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/taitoair.c mame-0.145/src/mame/video/taitoair.c --- mame-0.144/src/mame/video/taitoair.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/taitoair.c 2012-02-06 21:30:33.000000000 +0000 @@ -69,7 +69,7 @@ Screen refresh ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ @@ -182,12 +182,12 @@ } } -static void fill_slope( bitmap_t *bitmap, const rectangle *cliprect, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2 ) +static void fill_slope( bitmap_ind16 &bitmap, const rectangle &cliprect, int color, INT32 x1, INT32 x2, INT32 sl1, INT32 sl2, INT32 y1, INT32 y2, INT32 *nx1, INT32 *nx2 ) { - if (y1 > cliprect->max_y) + if (y1 > cliprect.max_y) return; - if (y2 <= cliprect->min_y) + if (y2 <= cliprect.min_y) { int delta = y2 - y1; *nx1 = x1 + delta * sl1; @@ -198,15 +198,15 @@ if (y1 < -1000000 || y1 > 1000000) return; - if (y2 > cliprect->max_y) - y2 = cliprect->max_y + 1; + if (y2 > cliprect.max_y) + y2 = cliprect.max_y + 1; - if (y1 < cliprect->min_y) + if (y1 < cliprect.min_y) { - int delta = cliprect->min_y - y1; + int delta = cliprect.min_y - y1; x1 += delta * sl1; x2 += delta * sl2; - y1 = cliprect->min_y; + y1 = cliprect.min_y; } if (x1 > x2 || (x1==x2 && sl1 > sl2)) @@ -225,25 +225,25 @@ while (y1 < y2) { - if (y1 >= cliprect->min_y) + if (y1 >= cliprect.min_y) { int xx1 = x1 >> TAITOAIR_FRAC_SHIFT; int xx2 = x2 >> TAITOAIR_FRAC_SHIFT; int grad_col; - if (xx1 <= cliprect->max_x || xx2 >= cliprect->min_x) + if (xx1 <= cliprect.max_x || xx2 >= cliprect.min_x) { - if (xx1 < cliprect->min_x) - xx1 = cliprect->min_x; - if (xx2 > cliprect->max_x) - xx2 = cliprect->max_x; + if (xx1 < cliprect.min_x) + xx1 = cliprect.min_x; + if (xx2 > cliprect.max_x) + xx2 = cliprect.max_x; /* TODO: it's unknown if gradient color applies by global screen Y coordinate or there's a calculation to somewhere ... */ grad_col = (y1 >> 3) & 0x3f; while (xx1 <= xx2) { - *BITMAP_ADDR16(bitmap, y1, xx1) = color + grad_col; + bitmap.pix16(y1, xx1) = color + grad_col; xx1++; } } @@ -257,7 +257,7 @@ *nx2 = x2; } -static void fill_poly( bitmap_t *bitmap, const rectangle *cliprect, const struct taitoair_poly *q ) +static void fill_poly( bitmap_ind16 &bitmap, const rectangle &cliprect, const struct taitoair_poly *q ) { INT32 sl1, sl2, cury, limy, x1, x2; int pmin, pmax, i, ps1, ps2; @@ -286,13 +286,13 @@ if (cury == limy) return; - if (cury > cliprect->max_y) + if (cury > cliprect.max_y) return; - if (limy <= cliprect->min_y) + if (limy <= cliprect.min_y) return; - if (limy > cliprect->max_y) - limy = cliprect->max_y; + if (limy > cliprect.max_y) + limy = cliprect.max_y; ps1 = pmin + pcount; ps2 = pmin; @@ -372,11 +372,11 @@ if(offset == 1) { /* clear screen fb */ - bitmap_fill(state->m_framebuffer[1], &cliprect, 0); + state->m_framebuffer[1]->fill(0, cliprect); /* copy buffer fb into screen fb (at this stage we are ready to draw) */ - copybitmap_trans(state->m_framebuffer[1], state->m_framebuffer[0], 0, 0, 0, 0, &cliprect, 0); + copybitmap_trans(*state->m_framebuffer[1], *state->m_framebuffer[0], 0, 0, 0, 0, cliprect, 0); /* now clear buffer fb */ - bitmap_fill(state->m_framebuffer[0], &cliprect, 0); + state->m_framebuffer[0]->fill(0, cliprect); } /* if offset 0x3001 OR 0x3002 we put data in the buffer fb */ @@ -407,7 +407,7 @@ } adr--; state->m_q.pcount = pcount; - fill_poly(state->m_framebuffer[0], &cliprect, &state->m_q); + fill_poly(*state->m_framebuffer[0], cliprect, &state->m_q); } } } @@ -566,18 +566,18 @@ width = machine.primary_screen->width(); height = machine.primary_screen->height(); - state->m_framebuffer[0] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_framebuffer[1] = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - //state->m_buffer3d = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + state->m_framebuffer[0] = auto_bitmap_ind16_alloc(machine, width, height); + state->m_framebuffer[1] = auto_bitmap_ind16_alloc(machine, width, height); + //state->m_buffer3d = auto_bitmap_ind16_alloc(machine, width, height); } -SCREEN_UPDATE( taitoair ) +SCREEN_UPDATE_IND16( taitoair ) { - taitoair_state *state = screen->machine().driver_data(); + taitoair_state *state = screen.machine().driver_data(); tc0080vco_tilemap_update(state->m_tc0080vco); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); { int x,y; @@ -589,20 +589,20 @@ [0x98000c-f] dword for rotation param 1 */ - for(y=cliprect->min_y;ymax_y/2;y++) + for(y=cliprect.min_y;ymin_x;xmax_x;x++) + for(x=cliprect.min_x;x> 2) & 0x3f)); + bitmap.pix16(y, x) = 0x2000 + (0x3f - ((y >> 2) & 0x3f)); } } #if 0 - for(y=cliprect->max_y/2;ymax_y;y++) + for(y=cliprect.max_y/2;ymin_x;xmax_x;x++) + for(x=cliprect.min_x;x> 2) & 0x3f)); + bitmap.pix16(y, x) = 0x2040 + (0x3f - ((y >> 2) & 0x3f)); } } #endif @@ -610,19 +610,19 @@ tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); - copybitmap_trans(bitmap, state->m_framebuffer[1], 0, 0, 0, 0, cliprect, 0); + copybitmap_trans(bitmap, *state->m_framebuffer[1], 0, 0, 0, 0, cliprect, 0); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 2, 0, 0); /* Hacky 3d bitmap */ //copybitmap_trans(bitmap, state->m_buffer3d, 0, 0, 0, 0, cliprect, 0); - //bitmap_fill(state->m_buffer3d, cliprect, 0); + //state->m_buffer3d->fill(0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/taito_b.c mame-0.145/src/mame/video/taito_b.c --- mame-0.144/src/mame/video/taito_b.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/taito_b.c 2012-02-06 21:30:31.000000000 +0000 @@ -15,8 +15,8 @@ if (ACCESSING_BITS_0_7) { /* bit 15 of pixel_scroll[0] is probably flip screen */ - *BITMAP_ADDR16(state->m_pixel_bitmap, sy, 2 * sx + 0) = state->m_b_fg_color_base * 16 + (data & 0xff); - *BITMAP_ADDR16(state->m_pixel_bitmap, sy, 2 * sx + 1) = state->m_b_fg_color_base * 16 + (data & 0xff); + state->m_pixel_bitmap->pix16(sy, 2 * sx + 0) = state->m_b_fg_color_base * 16 + (data & 0xff); + state->m_pixel_bitmap->pix16(sy, 2 * sx + 1) = state->m_b_fg_color_base * 16 + (data & 0xff); } } @@ -45,8 +45,8 @@ { taitob_state *state = machine.driver_data(); - state->m_framebuffer[0] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); - state->m_framebuffer[1] = auto_bitmap_alloc(machine, 512, 256, BITMAP_FORMAT_INDEXED16); + state->m_framebuffer[0] = auto_bitmap_ind16_alloc(machine, 512, 256); + state->m_framebuffer[1] = auto_bitmap_ind16_alloc(machine, 512, 256); state->m_pixel_bitmap = NULL; /* only hitice needs this */ state->save_item(NAME(state->m_pixel_scroll)); @@ -97,7 +97,7 @@ state->m_b_fg_color_base = 0x80; /* hitice also uses this for the pixel_bitmap */ - state->m_pixel_bitmap = auto_bitmap_alloc(machine, 1024, 512, machine.primary_screen->format()); + state->m_pixel_bitmap = auto_bitmap_ind16_alloc(machine, 1024, 512); state->save_item(NAME(*state->m_pixel_bitmap)); } @@ -113,7 +113,7 @@ { taitob_state *state = machine.driver_data(); - state->m_realpunc_bitmap = auto_bitmap_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height(), BITMAP_FORMAT_INDEXED16); + state->m_realpunc_bitmap = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); VIDEO_START_CALL(taitob_color_order0); } @@ -125,7 +125,7 @@ int sy = offset >> 8; int sx = 2 * (offset & 0xff); - return (*BITMAP_ADDR16(state->m_framebuffer[sy >> 8], sy & 0xff, sx + 0) << 8) | *BITMAP_ADDR16(state->m_framebuffer[sy >> 8], sy & 0xff, sx + 1); + return (state->m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 0) << 8) | state->m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 1); } WRITE16_HANDLER( tc0180vcu_framebuffer_word_w ) @@ -135,13 +135,13 @@ int sx = 2 * (offset & 0xff); if (ACCESSING_BITS_8_15) - *BITMAP_ADDR16(state->m_framebuffer[sy >> 8], sy & 0xff, sx + 0) = data >> 8; + state->m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 0) = data >> 8; if (ACCESSING_BITS_0_7) - *BITMAP_ADDR16(state->m_framebuffer[sy >> 8], sy & 0xff, sx + 1) = data & 0xff; + state->m_framebuffer[sy >> 8]->pix16(sy & 0xff, sx + 1) = data & 0xff; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* Sprite format: (16 bytes per sprite) offs: bits: @@ -270,10 +270,10 @@ } -static void draw_framebuffer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_framebuffer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { taitob_state *state = machine.driver_data(); - rectangle myclip = *cliprect; + rectangle myclip = cliprect; int x, y; UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, 0); UINT8 framebuffer_page = tc0180vcu_get_fb_page(state->m_tc0180vcu, 0); @@ -295,10 +295,10 @@ /*popmessage("1. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ for (y = myclip.min_y; y <= myclip.max_y; y++) { - UINT16 *src = BITMAP_ADDR16(state->m_framebuffer[framebuffer_page], y, myclip.min_x); + UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); UINT16 *dst; - dst = BITMAP_ADDR16(bitmap, bitmap->height-1-y, myclip.max_x); + dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); for (x = myclip.min_x; x <= myclip.max_x; x++) { @@ -315,8 +315,8 @@ { for (y = myclip.min_y; y <= myclip.max_y; y++) { - UINT16 *src = BITMAP_ADDR16(state->m_framebuffer[framebuffer_page], y, myclip.min_x); - UINT16 *dst = BITMAP_ADDR16(bitmap, y, myclip.min_x); + UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); + UINT16 *dst = &bitmap.pix16(y, myclip.min_x); for (x = myclip.min_x; x <= myclip.max_x; x++) { @@ -337,10 +337,10 @@ /*popmessage("3. X[%3i;%3i] Y[%3i;%3i]", myclip.min_x, myclip.max_x, myclip.min_y, myclip.max_y);*/ for (y = myclip.min_y ;y <= myclip.max_y; y++) { - UINT16 *src = BITMAP_ADDR16(state->m_framebuffer[framebuffer_page], y, myclip.min_x); + UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); UINT16 *dst; - dst = BITMAP_ADDR16(bitmap, bitmap->height-1-y, myclip.max_x); + dst = &bitmap.pix16(bitmap.height()-1-y, myclip.max_x); for (x = myclip.min_x; x <= myclip.max_x; x++) { @@ -357,8 +357,8 @@ { for (y = myclip.min_y; y <= myclip.max_y; y++) { - UINT16 *src = BITMAP_ADDR16(state->m_framebuffer[framebuffer_page], y, myclip.min_x); - UINT16 *dst = BITMAP_ADDR16(bitmap, y, myclip.min_x); + UINT16 *src = &state->m_framebuffer[framebuffer_page]->pix16(y, myclip.min_x); + UINT16 *dst = &bitmap.pix16(y, myclip.min_x); for (x = myclip.min_x; x <= myclip.max_x; x++) { @@ -375,21 +375,21 @@ g_profiler.stop(); } -SCREEN_UPDATE( taitob ) +SCREEN_UPDATE_IND16( taitob ) { - taitob_state *state = screen->machine().driver_data(); + taitob_state *state = screen.machine().driver_data(); UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, 0); if ((video_control & 0x20) == 0) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } /* Draw playfields */ tc0180vcu_tilemap_draw(state->m_tc0180vcu, bitmap, cliprect, 0, 1); - draw_framebuffer(screen->machine(), bitmap, cliprect, 1); + draw_framebuffer(screen.machine(), bitmap, cliprect, 1); tc0180vcu_tilemap_draw(state->m_tc0180vcu, bitmap, cliprect, 1, 0); @@ -399,10 +399,10 @@ int scrolly = - state->m_pixel_scroll[1]; //+240; /* bit 15 of pixel_scroll[0] is probably flip screen */ - copyscrollbitmap_trans(bitmap, state->m_pixel_bitmap, 1, &scrollx, 1, &scrolly, cliprect, state->m_b_fg_color_base * 16); + copyscrollbitmap_trans(bitmap, *state->m_pixel_bitmap, 1, &scrollx, 1, &scrolly, cliprect, state->m_b_fg_color_base * 16); } - draw_framebuffer(screen->machine(), bitmap, cliprect, 0); + draw_framebuffer(screen.machine(), bitmap, cliprect, 0); tc0180vcu_tilemap_draw(state->m_tc0180vcu, bitmap, cliprect, 2, 0); @@ -411,39 +411,39 @@ -SCREEN_UPDATE( realpunc ) +SCREEN_UPDATE_RGB32( realpunc ) { - taitob_state *state = screen->machine().driver_data(); - const rgb_t *palette = palette_entry_list_adjusted(screen->machine().palette); + taitob_state *state = screen.machine().driver_data(); + const rgb_t *palette = palette_entry_list_adjusted(screen.machine().palette); UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, 0); int x, y; /* Video blanked? */ if (!(video_control & 0x20)) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); return 0; } /* Draw the palettized playfields to an indexed bitmap */ - tc0180vcu_tilemap_draw(state->m_tc0180vcu, state->m_realpunc_bitmap, cliprect, 0, 1); + tc0180vcu_tilemap_draw(state->m_tc0180vcu, *state->m_realpunc_bitmap, cliprect, 0, 1); - draw_framebuffer(screen->machine(), state->m_realpunc_bitmap, cliprect, 1); + draw_framebuffer(screen.machine(), *state->m_realpunc_bitmap, cliprect, 1); - tc0180vcu_tilemap_draw(state->m_tc0180vcu, state->m_realpunc_bitmap, cliprect, 1, 0); + tc0180vcu_tilemap_draw(state->m_tc0180vcu, *state->m_realpunc_bitmap, cliprect, 1, 0); if (state->m_realpunc_video_ctrl & 0x0001) - draw_framebuffer(screen->machine(), state->m_realpunc_bitmap, cliprect, 0); + draw_framebuffer(screen.machine(), *state->m_realpunc_bitmap, cliprect, 0); /* Copy the intermediate bitmap to the output bitmap, applying the palette */ - for (y = 0; y <= cliprect->max_y; y++) - for (x = 0; x <= cliprect->max_x; x++) - *BITMAP_ADDR32(bitmap, y, x) = palette[*BITMAP_ADDR16(state->m_realpunc_bitmap, y, x)]; + for (y = 0; y <= cliprect.max_y; y++) + for (x = 0; x <= cliprect.max_x; x++) + bitmap.pix32(y, x) = palette[state->m_realpunc_bitmap->pix16(y, x)]; /* Draw the 15bpp raw CRTC frame buffer directly to the output bitmap */ if (state->m_realpunc_video_ctrl & 0x0002) { - device_t *hd63484 = screen->machine().device("hd63484"); + device_t *hd63484 = screen.machine().device("hd63484"); int base = (hd63484_regs_r(hd63484, 0xcc/2, 0xffff) << 16) + hd63484_regs_r(hd63484, 0xce/2, 0xffff); int stride = hd63484_regs_r(hd63484, 0xca/2, 0xffff); @@ -451,10 +451,10 @@ // scrollx = taitob_scroll[0]; // scrolly = taitob_scroll[1]; - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { int addr = base + (y*stride); - for (x = 0; x <= cliprect->max_x; x++) + for (x = 0; x <= cliprect.max_x; x++) { int r, g, b; UINT16 srcpix = hd63484_ram_r(hd63484, addr++, 0xffff); @@ -464,7 +464,7 @@ b = (BIT(srcpix, 3)) | ((srcpix >> 3) & 0x1e); if (srcpix) - *BITMAP_ADDR32(bitmap, y, x) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); + bitmap.pix32(y, x) = MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)); } addr += stride; @@ -473,28 +473,28 @@ /* Draw the 15bpp raw output of the camera ADCs (TODO) */ else if (state->m_realpunc_video_ctrl & 0x0004) { - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { - for (x = 0; x <= cliprect->max_x; x++) - *BITMAP_ADDR32(bitmap, y, x) = MAKE_RGB(0x00, 0x00, 0x00); + for (x = 0; x <= cliprect.max_x; x++) + bitmap.pix32(y, x) = MAKE_RGB(0x00, 0x00, 0x00); } } /* Clear the indexed bitmap and draw the final indexed layers */ - bitmap_fill(state->m_realpunc_bitmap, cliprect, 0); + state->m_realpunc_bitmap->fill(0, cliprect); if (!(state->m_realpunc_video_ctrl & 0x0001)) - draw_framebuffer(screen->machine(), state->m_realpunc_bitmap, cliprect, 0); + draw_framebuffer(screen.machine(), *state->m_realpunc_bitmap, cliprect, 0); - tc0180vcu_tilemap_draw(state->m_tc0180vcu, state->m_realpunc_bitmap, cliprect, 2, 0); + tc0180vcu_tilemap_draw(state->m_tc0180vcu, *state->m_realpunc_bitmap, cliprect, 2, 0); /* Merge the indexed layers with the output bitmap */ - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { - for (x = 0; x <= cliprect->max_x; x++) + for (x = 0; x <= cliprect.max_x; x++) { - if (*BITMAP_ADDR16(state->m_realpunc_bitmap, y, x)) - *BITMAP_ADDR32(bitmap, y, x) = palette[*BITMAP_ADDR16(state->m_realpunc_bitmap, y, x)]; + if (state->m_realpunc_bitmap->pix16(y, x)) + bitmap.pix32(y, x) = palette[state->m_realpunc_bitmap->pix16(y, x)]; } } @@ -503,20 +503,24 @@ -SCREEN_EOF( taitob ) +SCREEN_VBLANK( taitob ) { - taitob_state *state = machine.driver_data(); - UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, 0); - UINT8 framebuffer_page = tc0180vcu_get_fb_page(state->m_tc0180vcu, 0); + // rising edge + if (vblank_on) + { + taitob_state *state = screen.machine().driver_data(); + UINT8 video_control = tc0180vcu_get_videoctrl(state->m_tc0180vcu, 0); + UINT8 framebuffer_page = tc0180vcu_get_fb_page(state->m_tc0180vcu, 0); - if (~video_control & 0x01) - bitmap_fill(state->m_framebuffer[framebuffer_page], &machine.primary_screen->visible_area(), 0); + if (~video_control & 0x01) + state->m_framebuffer[framebuffer_page]->fill(0, screen.machine().primary_screen->visible_area()); - if (~video_control & 0x80) - { - framebuffer_page ^= 1; - tc0180vcu_set_fb_page(state->m_tc0180vcu, 0, framebuffer_page); - } + if (~video_control & 0x80) + { + framebuffer_page ^= 1; + tc0180vcu_set_fb_page(state->m_tc0180vcu, 0, framebuffer_page); + } - draw_sprites(machine, state->m_framebuffer[framebuffer_page], &machine.primary_screen->visible_area()); + draw_sprites(screen.machine(), *state->m_framebuffer[framebuffer_page], screen.machine().primary_screen->visible_area()); + } } diff -Nru mame-0.144/src/mame/video/taito_f2.c mame-0.145/src/mame/video/taito_f2.c --- mame-0.144/src/mame/video/taito_f2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taito_f2.c 2012-02-06 21:30:33.000000000 +0000 @@ -286,13 +286,13 @@ state->m_spritebank_buffered[7] = state->m_spritebank_buffered[6] + 0x400; } -static void taito_f2_tc360_spritemixdraw( running_machine &machine, bitmap_t *dest_bmp, const rectangle *clip, const gfx_element *gfx, +static void taito_f2_tc360_spritemixdraw( running_machine &machine, bitmap_ind16 &dest_bmp, const rectangle &clip, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley ) { taitof2_state *state = machine.driver_data(); int pal_base = gfx->color_base + gfx->color_granularity * (color % gfx->total_colors); const UINT8 *source_base = gfx_element_get_data(gfx, code % gfx->total_elements); - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; int sprite_screen_height = (scaley * gfx->height + 0x8000) >> 16; int sprite_screen_width = (scalex * gfx->width + 0x8000) >> 16; @@ -331,31 +331,28 @@ y_index = 0; } - if (clip) - { - if (sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x - sx; - sx += pixels; - x_index_base += pixels * dx; - } - if (sy < clip->min_y) - { /* clip top */ - int pixels = clip->min_y - sy; - sy += pixels; - y_index += pixels * dy; - } - /* NS 980211 - fixed incorrect clipping */ - if (ex > clip->max_x + 1) - { /* clip right */ - int pixels = ex-clip->max_x - 1; - ex -= pixels; - } - if (ey > clip->max_y + 1) - { /* clip bottom */ - int pixels = ey-clip->max_y - 1; - ey -= pixels; - } + if (sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x - sx; + sx += pixels; + x_index_base += pixels * dx; + } + if (sy < clip.min_y) + { /* clip top */ + int pixels = clip.min_y - sy; + sy += pixels; + y_index += pixels * dy; + } + /* NS 980211 - fixed incorrect clipping */ + if (ex > clip.max_x + 1) + { /* clip right */ + int pixels = ex-clip.max_x - 1; + ex -= pixels; + } + if (ey > clip.max_y + 1) + { /* clip bottom */ + int pixels = ey-clip.max_y - 1; + ey -= pixels; } if (ex > sx) @@ -366,8 +363,8 @@ for (y = sy; y < ey; y++) { const UINT8 *source = source_base + (y_index >> 16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); int x, x_index = x_index_base; for (x = sx; x < ex; x++) @@ -435,7 +432,7 @@ } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int *primasks, int uses_tc360_mixer ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks, int uses_tc360_mixer ) { /* Sprite format: @@ -894,115 +891,135 @@ } -SCREEN_EOF( taitof2_no_buffer ) +SCREEN_VBLANK( taitof2_no_buffer ) { - taitof2_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + taitof2_state *state = screen.machine().driver_data(); - taitof2_update_sprites_active_area(machine); + taitof2_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 1; + state->m_prepare_sprites = 1; + } } -SCREEN_EOF( taitof2_full_buffer_delayed ) +SCREEN_VBLANK( taitof2_full_buffer_delayed ) { - taitof2_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int i; + // rising edge + if (vblank_on) + { + taitof2_state *state = screen.machine().driver_data(); + UINT16 *spriteram = state->m_spriteram; + int i; - taitof2_update_sprites_active_area(machine); + taitof2_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 0; - memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); - for (i = 0; i < state->m_spriteram_size / 2; i++) - state->m_spriteram_buffered[i] = spriteram[i]; - memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); + state->m_prepare_sprites = 0; + memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); + for (i = 0; i < state->m_spriteram_size / 2; i++) + state->m_spriteram_buffered[i] = spriteram[i]; + memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); + } } -SCREEN_EOF( taitof2_partial_buffer_delayed ) +SCREEN_VBLANK( taitof2_partial_buffer_delayed ) { - taitof2_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int i; + // rising edge + if (vblank_on) + { + taitof2_state *state = screen.machine().driver_data(); + UINT16 *spriteram = state->m_spriteram; + int i; - taitof2_update_sprites_active_area(machine); + taitof2_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 0; - memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); - for (i = 0;i < state->m_spriteram_size / 2; i += 4) - state->m_spriteram_buffered[i] = spriteram[i]; - memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); + state->m_prepare_sprites = 0; + memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); + for (i = 0;i < state->m_spriteram_size / 2; i += 4) + state->m_spriteram_buffered[i] = spriteram[i]; + memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); + } } -SCREEN_EOF( taitof2_partial_buffer_delayed_thundfox ) +SCREEN_VBLANK( taitof2_partial_buffer_delayed_thundfox ) { - taitof2_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int i; + // rising edge + if (vblank_on) + { + taitof2_state *state = screen.machine().driver_data(); + UINT16 *spriteram = state->m_spriteram; + int i; - taitof2_update_sprites_active_area(machine); + taitof2_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 0; - memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); - for (i = 0; i < state->m_spriteram_size / 2; i += 8) - { - state->m_spriteram_buffered[i] = spriteram[i]; - state->m_spriteram_buffered[i + 1] = spriteram[i + 1]; - state->m_spriteram_buffered[i + 4] = spriteram[i + 4]; + state->m_prepare_sprites = 0; + memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); + for (i = 0; i < state->m_spriteram_size / 2; i += 8) + { + state->m_spriteram_buffered[i] = spriteram[i]; + state->m_spriteram_buffered[i + 1] = spriteram[i + 1]; + state->m_spriteram_buffered[i + 4] = spriteram[i + 4]; + } + memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); } - memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); } -SCREEN_EOF( taitof2_partial_buffer_delayed_qzchikyu ) +SCREEN_VBLANK( taitof2_partial_buffer_delayed_qzchikyu ) { - /* spriteram[2] and [3] are 1 frame behind... - probably thundfox_eof_callback would work fine */ + // rising edge + if (vblank_on) + { + /* spriteram[2] and [3] are 1 frame behind... + probably thundfox_eof_callback would work fine */ - taitof2_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int i; + taitof2_state *state = screen.machine().driver_data(); + UINT16 *spriteram = state->m_spriteram; + int i; - taitof2_update_sprites_active_area(machine); + taitof2_update_sprites_active_area(screen.machine()); - state->m_prepare_sprites = 0; - memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); - for (i = 0; i < state->m_spriteram_size / 2; i += 8) - { - state->m_spriteram_buffered[i] = spriteram[i]; - state->m_spriteram_buffered[i + 1] = spriteram[i + 1]; - state->m_spriteram_buffered[i + 4] = spriteram[i + 4]; - state->m_spriteram_buffered[i + 5] = spriteram[i + 5]; // not needed? - state->m_spriteram_buffered[i + 6] = spriteram[i + 6]; // not needed? - state->m_spriteram_buffered[i + 7] = spriteram[i + 7]; // not needed? + state->m_prepare_sprites = 0; + memcpy(state->m_spriteram_buffered, state->m_spriteram_delayed, state->m_spriteram_size); + for (i = 0; i < state->m_spriteram_size / 2; i += 8) + { + state->m_spriteram_buffered[i] = spriteram[i]; + state->m_spriteram_buffered[i + 1] = spriteram[i + 1]; + state->m_spriteram_buffered[i + 4] = spriteram[i + 4]; + state->m_spriteram_buffered[i + 5] = spriteram[i + 5]; // not needed? + state->m_spriteram_buffered[i + 6] = spriteram[i + 6]; // not needed? + state->m_spriteram_buffered[i + 7] = spriteram[i + 7]; // not needed? + } + memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); } - memcpy(state->m_spriteram_delayed, spriteram, state->m_spriteram_size); } /* SSI */ -SCREEN_UPDATE( taitof2_ssi ) +SCREEN_UPDATE_IND16( taitof2_ssi ) { - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); /* SSI only uses sprites, the tilemap registers are not even initialized. (they are in Majestic 12, but the tilemaps are not used anyway) */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 0); return 0; } -SCREEN_UPDATE( taitof2_yesnoj ) +SCREEN_UPDATE_IND16( taitof2_yesnoj ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0100scn_tilemap_update(state->m_tc0100scn); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(state->m_tc0100scn), 0, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(state->m_tc0100scn) ^ 1, 0, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, 2, 0, 0); @@ -1010,30 +1027,30 @@ } -SCREEN_UPDATE( taitof2 ) +SCREEN_UPDATE_IND16( taitof2 ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0100scn_tilemap_update(state->m_tc0100scn); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(state->m_tc0100scn), 0, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, tc0100scn_bottomlayer(state->m_tc0100scn) ^ 1, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 0); + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, 2, 0, 0); return 0; } -SCREEN_UPDATE( taitof2_pri ) +SCREEN_UPDATE_IND16( taitof2_pri ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); int layer[3]; - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0100scn_tilemap_update(state->m_tc0100scn); @@ -1051,20 +1068,20 @@ state->m_spriteblendmode = tc0360pri_r(state->m_tc0360pri, 0) & 0xc0; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], 0, 1); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 1); + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 1); return 0; } -static void draw_roz_layer( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 priority) +static void draw_roz_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 priority) { taitof2_state *state = machine.driver_data(); @@ -1075,9 +1092,9 @@ tc0430grw_zoom_draw(state->m_tc0430grw, bitmap, cliprect, state->m_pivot_xdisp, state->m_pivot_ydisp, priority); } -SCREEN_UPDATE( taitof2_pri_roz ) +SCREEN_UPDATE_IND16( taitof2_pri_roz ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); int tilepri[3]; int rozpri; int layer[3]; @@ -1085,7 +1102,7 @@ int i,j; int roz_base_color = (tc0360pri_r(state->m_tc0360pri, 1) & 0x3f) << 2; - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); if (state->m_tc0280grd != NULL) tc0280grd_tilemap_update(state->m_tc0280grd, roz_base_color); @@ -1113,15 +1130,15 @@ state->m_spriteblendmode = tc0360pri_r(state->m_tc0360pri, 0) & 0xc0; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ drawn = 0; for (i = 0; i < 16; i++) { if (rozpri == i) { - draw_roz_layer(screen->machine(), bitmap, cliprect, 1 << drawn); + draw_roz_layer(screen.machine(), bitmap, cliprect, 1 << drawn); state->m_tilepri[drawn] = i; drawn++; } @@ -1137,22 +1154,22 @@ } } - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 1); + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 1); return 0; } /* Thunderfox */ -SCREEN_UPDATE( taitof2_thundfox ) +SCREEN_UPDATE_IND16( taitof2_thundfox ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); int tilepri[2][3]; int spritepri[4]; int layer[2][3]; int drawn[2]; - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0100scn_tilemap_update(state->m_tc0100scn_1); tc0100scn_tilemap_update(state->m_tc0100scn_2); @@ -1176,8 +1193,8 @@ spritepri[2] = tc0360pri_r(state->m_tc0360pri, 7) & 0x0f; spritepri[3] = tc0360pri_r(state->m_tc0360pri, 7) >> 4; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ /* TODO: This isn't the correct way to handle the priority. At the moment of @@ -1228,7 +1245,7 @@ if (spritepri[i] < tilepri[1][1]) primasks[i] |= 0xff00; } - draw_sprites(screen->machine(), bitmap,cliprect,primasks,0); + draw_sprites(screen.machine(), bitmap,cliprect,primasks,0); } @@ -1281,13 +1298,13 @@ ********************************************************************/ -SCREEN_UPDATE( taitof2_metalb ) +SCREEN_UPDATE_IND16( taitof2_metalb ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); UINT8 layer[5], invlayer[4]; UINT16 priority; - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0480scp_tilemap_update(state->m_tc0480scp); @@ -1317,8 +1334,8 @@ state->m_spriteblendmode = tc0360pri_r(state->m_tc0360pri, 0) & 0xc0; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[0], 0 ,1); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[1], 0, 2); @@ -1326,21 +1343,21 @@ tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[3], 0, 8); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[4], 0, 16); - draw_sprites(screen->machine(), bitmap, cliprect, NULL, 1); + draw_sprites(screen.machine(), bitmap, cliprect, NULL, 1); return 0; } /* Deadconx, Footchmp */ -SCREEN_UPDATE( taitof2_deadconx ) +SCREEN_UPDATE_IND16( taitof2_deadconx ) { - taitof2_state *state = screen->machine().driver_data(); + taitof2_state *state = screen.machine().driver_data(); UINT8 layer[5]; UINT8 tilepri[5]; UINT8 spritepri[4]; UINT16 priority; - taitof2_handle_sprite_buffering(screen->machine()); + taitof2_handle_sprite_buffering(screen.machine()); tc0480scp_tilemap_update(state->m_tc0480scp); @@ -1365,8 +1382,8 @@ spritepri[2] = tc0360pri_r(state->m_tc0360pri, 7) & 0x0f; spritepri[3] = tc0360pri_r(state->m_tc0360pri, 7) >> 4; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[0], 0 ,1); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[1], 0, 2); @@ -1385,7 +1402,7 @@ if (spritepri[i] < tilepri[(layer[3])]) primasks[i] |= 0xff00; } - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 0); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 0); } /* diff -Nru mame-0.144/src/mame/video/taito_f3.c mame-0.145/src/mame/video/taito_f3.c --- mame-0.144/src/mame/video/taito_f3.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/taito_f3.c 2012-02-06 21:30:33.000000000 +0000 @@ -326,7 +326,7 @@ /******************************************************************************/ -static void print_debug_info(running_machine &machine, bitmap_t *bitmap) +static void print_debug_info(running_machine &machine, bitmap_rgb32 &bitmap) { taito_f3_state *state = machine.driver_data(); UINT16 *f3_line_ram = state->m_f3_line_ram; @@ -402,7 +402,7 @@ /******************************************************************************/ -INLINE void get_tile_info(running_machine &machine, tile_data *tileinfo, int tile_index, UINT16 *gfx_base) +INLINE void get_tile_info(running_machine &machine, tile_data &tileinfo, int tile_index, UINT16 *gfx_base) { UINT32 tile=(gfx_base[tile_index*2+0]<<16)|(gfx_base[tile_index*2+1]&0xffff); UINT8 abtype=(tile>>(16+9)) & 1; @@ -416,8 +416,8 @@ tile&0xffff, (tile>>16) & 0x1ff & (~extra_planes), TILE_FLIPYX( tile >> 30 )); - tileinfo->category = abtype&1; /* alpha blending type */ - tileinfo->pen_mask = (extra_planes << 4) | 0x0f; + tileinfo.category = abtype&1; /* alpha blending type */ + tileinfo.pen_mask = (extra_planes << 4) | 0x0f; } static TILE_GET_INFO( get_tile_info1 ) @@ -515,22 +515,26 @@ /******************************************************************************/ -SCREEN_EOF( f3 ) +SCREEN_VBLANK( f3 ) { - taito_f3_state *state = machine.driver_data(); - if (state->m_sprite_lag==2) + // rising edge + if (vblank_on) { - if (machine.video().skip_this_frame() == 0) + taito_f3_state *state = screen.machine().driver_data(); + if (state->m_sprite_lag==2) { - get_sprite_info(machine, state->m_spriteram16_buffered); + if (screen.machine().video().skip_this_frame() == 0) + { + get_sprite_info(screen.machine(), state->m_spriteram16_buffered); + } + memcpy(state->m_spriteram16_buffered,state->m_spriteram,0x10000); } - memcpy(state->m_spriteram16_buffered,state->m_spriteram,0x10000); - } - else if (state->m_sprite_lag==1) - { - if (machine.video().skip_this_frame() == 0) + else if (state->m_sprite_lag==1) { - get_sprite_info(machine, state->m_spriteram); + if (screen.machine().video().skip_this_frame() == 0) + { + get_sprite_info(screen.machine(), state->m_spriteram); + } } } } @@ -539,7 +543,7 @@ { taito_f3_state *state = machine.driver_data(); const struct F3config *pCFG=&f3_config_table[0]; - int width, height, i; + int i; state->m_f3_alpha_level_2as=127; state->m_f3_alpha_level_2ad=127; @@ -563,7 +567,6 @@ state->m_spritelist=0; state->m_spriteram16_buffered=0; state->m_pf_line_inf=0; - state->m_pri_alp_bitmap=0; state->m_tile_opaque_sp=0; /* Setup individual game */ @@ -599,10 +602,10 @@ state->m_twidth_mask=0x7f; state->m_twidth_mask_bit=7; - tilemap_set_transparent_pen(state->m_pf1_tilemap,0); - tilemap_set_transparent_pen(state->m_pf2_tilemap,0); - tilemap_set_transparent_pen(state->m_pf3_tilemap,0); - tilemap_set_transparent_pen(state->m_pf4_tilemap,0); + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf2_tilemap->set_transparent_pen(0); + state->m_pf3_tilemap->set_transparent_pen(0); + state->m_pf4_tilemap->set_transparent_pen(0); } else { @@ -628,14 +631,14 @@ state->m_twidth_mask=0x3f; state->m_twidth_mask_bit=6; - tilemap_set_transparent_pen(state->m_pf1_tilemap,0); - tilemap_set_transparent_pen(state->m_pf2_tilemap,0); - tilemap_set_transparent_pen(state->m_pf3_tilemap,0); - tilemap_set_transparent_pen(state->m_pf4_tilemap,0); - tilemap_set_transparent_pen(state->m_pf5_tilemap,0); - tilemap_set_transparent_pen(state->m_pf6_tilemap,0); - tilemap_set_transparent_pen(state->m_pf7_tilemap,0); - tilemap_set_transparent_pen(state->m_pf8_tilemap,0); + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf2_tilemap->set_transparent_pen(0); + state->m_pf3_tilemap->set_transparent_pen(0); + state->m_pf4_tilemap->set_transparent_pen(0); + state->m_pf5_tilemap->set_transparent_pen(0); + state->m_pf6_tilemap->set_transparent_pen(0); + state->m_pf7_tilemap->set_transparent_pen(0); + state->m_pf8_tilemap->set_transparent_pen(0); } state->m_spriteram16_buffered = auto_alloc_array(machine, UINT16, 0x10000/2); @@ -645,16 +648,14 @@ state->m_pixel_layer = tilemap_create(machine, get_tile_info_pixel,tilemap_scan_cols,8,8,64,32); state->m_pf_line_inf = auto_alloc_array(machine, struct f3_playfield_line_inf, 5); state->m_sa_line_inf = auto_alloc_array(machine, struct f3_spritealpha_line_inf, 1); - width = machine.primary_screen->width(); - height = machine.primary_screen->height(); - state->m_pri_alp_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED8 ); + machine.primary_screen->register_screen_bitmap(state->m_pri_alp_bitmap); state->m_tile_opaque_sp = auto_alloc_array(machine, UINT8, machine.gfx[2]->total_elements); for (i=0; i<8; i++) state->m_tile_opaque_pf[i] = auto_alloc_array(machine, UINT8, machine.gfx[1]->total_elements); - tilemap_set_transparent_pen(state->m_vram_layer,0); - tilemap_set_transparent_pen(state->m_pixel_layer,0); + state->m_vram_layer->set_transparent_pen(0); + state->m_pixel_layer->set_transparent_pen(0); /* Palettes have 4 bpp indexes despite up to 6 bpp data. The unused */ /* top bits in the gfx data are cleared later. */ @@ -747,19 +748,19 @@ COMBINE_DATA(&state->m_f3_pf_data[offset]); if (state->m_f3_game_config->extend) { - if (offset<0x1000) tilemap_mark_tile_dirty(state->m_pf1_tilemap,(offset & 0xfff) >> 1); - else if (offset<0x2000) tilemap_mark_tile_dirty(state->m_pf2_tilemap,(offset & 0xfff) >> 1); - else if (offset<0x3000) tilemap_mark_tile_dirty(state->m_pf3_tilemap,(offset & 0xfff) >> 1); - else if (offset<0x4000) tilemap_mark_tile_dirty(state->m_pf4_tilemap,(offset & 0xfff) >> 1); + if (offset<0x1000) state->m_pf1_tilemap->mark_tile_dirty((offset & 0xfff) >> 1); + else if (offset<0x2000) state->m_pf2_tilemap->mark_tile_dirty((offset & 0xfff) >> 1); + else if (offset<0x3000) state->m_pf3_tilemap->mark_tile_dirty((offset & 0xfff) >> 1); + else if (offset<0x4000) state->m_pf4_tilemap->mark_tile_dirty((offset & 0xfff) >> 1); } else { - if (offset<0x0800) tilemap_mark_tile_dirty(state->m_pf1_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x1000) tilemap_mark_tile_dirty(state->m_pf2_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x1800) tilemap_mark_tile_dirty(state->m_pf3_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x2000) tilemap_mark_tile_dirty(state->m_pf4_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x2800) tilemap_mark_tile_dirty(state->m_pf5_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x3000) tilemap_mark_tile_dirty(state->m_pf6_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x3800) tilemap_mark_tile_dirty(state->m_pf7_tilemap,(offset & 0x7ff) >> 1); - else if (offset<0x4000) tilemap_mark_tile_dirty(state->m_pf8_tilemap,(offset & 0x7ff) >> 1); + if (offset<0x0800) state->m_pf1_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x1000) state->m_pf2_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x1800) state->m_pf3_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x2000) state->m_pf4_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x2800) state->m_pf5_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x3000) state->m_pf6_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x3800) state->m_pf7_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); + else if (offset<0x4000) state->m_pf8_tilemap->mark_tile_dirty((offset & 0x7ff) >> 1); } } @@ -799,16 +800,16 @@ int tile,col_off; COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_vram_layer,offset); - //tilemap_mark_tile_dirty(state->m_vram_layer,offset+1); + state->m_vram_layer->mark_tile_dirty(offset); + //state->m_vram_layer->mark_tile_dirty(offset+1); if (offset>0x7ff) offset-=0x800; tile=offset; col_off=((tile&0x3f)*32)+((tile&0xfc0)>>6); - tilemap_mark_tile_dirty(state->m_pixel_layer,col_off); - //tilemap_mark_tile_dirty(state->m_pixel_layer,col_off+32); + state->m_pixel_layer->mark_tile_dirty(col_off); + //state->m_pixel_layer->mark_tile_dirty(col_off+32); } @@ -1437,7 +1438,7 @@ /*============================================================================*/ INLINE void draw_scanlines(running_machine &machine, - bitmap_t *bitmap,int xsize,INT16 *draw_line_num, + bitmap_rgb32 &bitmap,int xsize,INT16 *draw_line_num, const struct f3_playfield_line_inf **line_t, const int *sprite, UINT32 orient, @@ -1459,17 +1460,19 @@ UINT8 *dstp0,*dstp; - int yadv = bitmap->rowpixels; + int yadv = bitmap.rowpixels(); + int yadvp = state->m_pri_alp_bitmap.rowpixels(); int i=0,y=draw_line_num[0]; int ty = y; if (orient & ORIENTATION_FLIP_Y) { - ty = bitmap->height - 1 - ty; + ty = bitmap.height() - 1 - ty; yadv = -yadv; + yadvp = -yadvp; } - dstp0 = BITMAP_ADDR8(state->m_pri_alp_bitmap, ty, x); + dstp0 = &state->m_pri_alp_bitmap.pix8(ty, x); state->m_pdest_2a = state->m_f3_alpha_level_2ad ? 0x10 : 0; state->m_pdest_2b = state->m_f3_alpha_level_2bd ? 0x20 : 0; @@ -1482,7 +1485,7 @@ { UINT32 *dsti0,*dsti; - dsti0 = BITMAP_ADDR32(bitmap, ty, x); + dsti0 = &bitmap.pix32(ty, x); while(1) { int cx=0; @@ -1545,15 +1548,14 @@ if(draw_line_num[i]==y+1) { dsti0 += yadv; - dstp0 += yadv; + dstp0 += yadvp; y++; continue; } else { - int dy=(draw_line_num[i]-y)*yadv; - dsti0 += dy; - dstp0 += dy; + dsti0 += (draw_line_num[i]-y)*yadv; + dstp0 += (draw_line_num[i]-y)*yadvp; y=draw_line_num[i]; } } @@ -1846,8 +1848,6 @@ { taito_f3_state *state = machine.driver_data(); struct f3_playfield_line_inf *line_t=&state->m_pf_line_inf[pos]; - const bitmap_t *srcbitmap; - const bitmap_t *flagsbitmap; int y,y_start,y_end,y_inc; int line_base,zoom_base,col_base,pri_base,inc; @@ -2011,8 +2011,8 @@ } /* set pixmap pointer */ - srcbitmap = tilemap_get_pixmap(tmap); - flagsbitmap = tilemap_get_flagsmap(tmap); + bitmap_ind16 &srcbitmap = tmap->pixmap(); + bitmap_ind8 &flagsbitmap = tmap->flagsmap(); if(line_t->alpha_mode[y]!=0) { @@ -2031,11 +2031,11 @@ /* set pixmap index */ line_t->x_count[y]=x_index_fx & 0xffff; // Fractional part - line_t->src_s[y]=src_s=BITMAP_ADDR16(srcbitmap, y_index, 0); + line_t->src_s[y]=src_s=&srcbitmap.pix16(y_index); line_t->src_e[y]=&src_s[state->m_width_mask+1]; line_t->src[y]=&src_s[x_index_fx>>16]; - line_t->tsrc_s[y]=tsrc_s=BITMAP_ADDR8(flagsbitmap, y_index, 0); + line_t->tsrc_s[y]=tsrc_s=&flagsbitmap.pix8(y_index); line_t->tsrc[y]=&tsrc_s[x_index_fx>>16]; } @@ -2049,8 +2049,6 @@ taito_f3_state *state = machine.driver_data(); const struct f3_spritealpha_line_inf *sprite_alpha_line_t=&state->m_sa_line_inf[0]; struct f3_playfield_line_inf *line_t=&state->m_pf_line_inf[4]; - const bitmap_t *srcbitmap_pixel, *srcbitmap_vram; - const bitmap_t *flagsbitmap_pixel, *flagsbitmap_vram; int y,y_start,y_end,y_inc; int pri_base,inc; @@ -2128,10 +2126,10 @@ sx&=0x1ff; /* set pixmap pointer */ - srcbitmap_pixel = tilemap_get_pixmap(pixel_tilemap); - flagsbitmap_pixel = tilemap_get_flagsmap(pixel_tilemap); - srcbitmap_vram = tilemap_get_pixmap(vram_tilemap); - flagsbitmap_vram = tilemap_get_flagsmap(vram_tilemap); + bitmap_ind16 &srcbitmap_pixel = pixel_tilemap->pixmap(); + bitmap_ind8 &flagsbitmap_pixel = pixel_tilemap->flagsmap(); + bitmap_ind16 &srcbitmap_vram = vram_tilemap->pixmap(); + bitmap_ind8 &flagsbitmap_vram = vram_tilemap->flagsmap(); y=y_start; while(y!=y_end) @@ -2148,16 +2146,16 @@ /* set pixmap index */ line_t->x_count[y]=0xffff; if (usePixelLayer) - line_t->src_s[y]=src_s=BITMAP_ADDR16(srcbitmap_pixel, sy&0xff, 0); + line_t->src_s[y]=src_s=&srcbitmap_pixel.pix16(sy&0xff); else - line_t->src_s[y]=src_s=BITMAP_ADDR16(srcbitmap_vram, sy&0x1ff, 0); + line_t->src_s[y]=src_s=&srcbitmap_vram.pix16(sy&0x1ff); line_t->src_e[y]=&src_s[vram_width_mask+1]; line_t->src[y]=&src_s[sx]; if (usePixelLayer) - line_t->tsrc_s[y]=tsrc_s=BITMAP_ADDR8(flagsbitmap_pixel, sy&0xff, 0); + line_t->tsrc_s[y]=tsrc_s=&flagsbitmap_pixel.pix8(sy&0xff); else - line_t->tsrc_s[y]=tsrc_s=BITMAP_ADDR8(flagsbitmap_vram, sy&0x1ff, 0); + line_t->tsrc_s[y]=tsrc_s=&flagsbitmap_vram.pix8(sy&0x1ff); line_t->tsrc[y]=&tsrc_s[sx]; } @@ -2168,7 +2166,7 @@ /******************************************************************************/ -static void scanline_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void scanline_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) { taito_f3_state *state = machine.driver_data(); int i,j,y,ys,ye; @@ -2597,7 +2595,7 @@ pri++; INLINE void f3_drawgfx( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, int code, int color, int flipx,int flipy, @@ -2610,20 +2608,8 @@ pri_dst=1<min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); if( gfx ) @@ -2662,43 +2648,41 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx && ey>sy) { /* skip if inner loop doesn't draw anything */ -// if (dest_bmp->bpp == 32) +// if (dest_bmp.bpp == 32) { int y=ey-sy; int x=(ex-sx-1)|(state->m_tile_opaque_sp[code % gfx->total_elements]<<4); const UINT8 *source0 = code_base + y_index * 16 + x_index_base; - UINT32 *dest0 = BITMAP_ADDR32(dest_bmp, sy, sx); - UINT8 *pri0 = BITMAP_ADDR8(state->m_pri_alp_bitmap, sy, sx); - int yadv = dest_bmp->rowpixels; + UINT32 *dest0 = &dest_bmp.pix32(sy, sx); + UINT8 *pri0 = &state->m_pri_alp_bitmap.pix8(sy, sx); + int yadv = dest_bmp.rowpixels(); + int yadvp = state->m_pri_alp_bitmap.rowpixels(); dy=dy*16; while(1) { @@ -2748,7 +2732,7 @@ if(!(--y)) break; source0 += dy; dest0+=yadv; - pri0+=yadv; + pri0+=yadvp; } } } @@ -2761,7 +2745,7 @@ INLINE void f3_drawgfxzoom( - bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, + bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx, int code, int color, int flipx,int flipy, @@ -2775,20 +2759,8 @@ pri_dst=1<min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); if( gfx ) @@ -2827,43 +2799,40 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) { /* skip if inner loop doesn't draw anything */ -// if (dest_bmp->bpp == 32) +// if (dest_bmp.bpp == 32) { int y; for( y=sy; y>16) * 16; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(state->m_pri_alp_bitmap, y, 0); + UINT32 *dest = &dest_bmp.pix32(y); + UINT8 *pri = &state->m_pri_alp_bitmap.pix8(y); int x, x_index = x_index_base; for( x=sx; x(); const struct tempsprite *sprite_ptr; @@ -3206,13 +3175,13 @@ /******************************************************************************/ -SCREEN_UPDATE( f3 ) +SCREEN_UPDATE_RGB32( f3 ) { - taito_f3_state *state = screen->machine().driver_data(); + taito_f3_state *state = screen.machine().driver_data(); UINT32 sy_fix[5],sx_fix[5]; state->m_f3_skip_this_frame=0; - tilemap_set_flip_all(screen->machine(),state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* Setup scroll */ sy_fix[0]=((state->m_f3_control_0[4]&0xffff)<< 9) + (1<<16); @@ -3245,29 +3214,29 @@ sy_fix[4]=-sy_fix[4]; } - bitmap_fill(state->m_pri_alp_bitmap,cliprect,0); + state->m_pri_alp_bitmap.fill(0, cliprect); /* sprites */ if (state->m_sprite_lag==0) - get_sprite_info(screen->machine(), state->m_spriteram); + get_sprite_info(screen.machine(), state->m_spriteram); /* Update sprite buffer */ - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); /* Parse sprite, alpha & clipping parts of lineram */ get_spritealphaclip_info(state); /* Parse playfield effects */ - get_line_ram_info(screen->machine(), state->m_pf1_tilemap,sx_fix[0],sy_fix[0],0,state->m_f3_pf_data_1); - get_line_ram_info(screen->machine(), state->m_pf2_tilemap,sx_fix[1],sy_fix[1],1,state->m_f3_pf_data_2); - get_line_ram_info(screen->machine(), state->m_pf3_tilemap,sx_fix[2],sy_fix[2],2,state->m_f3_pf_data_3); - get_line_ram_info(screen->machine(), state->m_pf4_tilemap,sx_fix[3],sy_fix[3],3,state->m_f3_pf_data_4); - get_vram_info(screen->machine(), state->m_vram_layer,state->m_pixel_layer,sx_fix[4],sy_fix[4]); + get_line_ram_info(screen.machine(), state->m_pf1_tilemap,sx_fix[0],sy_fix[0],0,state->m_f3_pf_data_1); + get_line_ram_info(screen.machine(), state->m_pf2_tilemap,sx_fix[1],sy_fix[1],1,state->m_f3_pf_data_2); + get_line_ram_info(screen.machine(), state->m_pf3_tilemap,sx_fix[2],sy_fix[2],2,state->m_f3_pf_data_3); + get_line_ram_info(screen.machine(), state->m_pf4_tilemap,sx_fix[3],sy_fix[3],3,state->m_f3_pf_data_4); + get_vram_info(screen.machine(), state->m_vram_layer,state->m_pixel_layer,sx_fix[4],sy_fix[4]); /* Draw final framebuffer */ - scanline_draw(screen->machine(), bitmap,cliprect); + scanline_draw(screen.machine(), bitmap,cliprect); if (VERBOSE) - print_debug_info(screen->machine(), bitmap); + print_debug_info(screen.machine(), bitmap); return 0; } diff -Nru mame-0.144/src/mame/video/taito_h.c mame-0.145/src/mame/video/taito_h.c --- mame-0.144/src/mame/video/taito_h.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taito_h.c 2012-02-06 21:30:31.000000000 +0000 @@ -70,7 +70,7 @@ Screen refresh ***************************************************************************/ -static void syvalion_draw_sprites( running_machine &machine,bitmap_t *bitmap, const rectangle *cliprect ) +static void syvalion_draw_sprites( running_machine &machine,bitmap_ind16 &bitmap, const rectangle &cliprect ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ @@ -163,7 +163,7 @@ } } -static void recordbr_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void recordbr_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ @@ -275,7 +275,7 @@ } } -static void dleague_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void dleague_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ @@ -391,49 +391,49 @@ /**************************************************************************/ -SCREEN_UPDATE( syvalion ) +SCREEN_UPDATE_IND16( syvalion ) { - taitoh_state *state = screen->machine().driver_data(); + taitoh_state *state = screen.machine().driver_data(); tc0080vco_tilemap_update(state->m_tc0080vco); - taitoh_log_vram(screen->machine()); + taitoh_log_vram(screen.machine()); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - syvalion_draw_sprites(screen->machine(), bitmap,cliprect); + syvalion_draw_sprites(screen.machine(), bitmap,cliprect); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 2, 0, 0); return 0; } -SCREEN_UPDATE( recordbr ) +SCREEN_UPDATE_IND16( recordbr ) { - taitoh_state *state = screen->machine().driver_data(); + taitoh_state *state = screen.machine().driver_data(); tc0080vco_tilemap_update(state->m_tc0080vco); - taitoh_log_vram(screen->machine()); + taitoh_log_vram(screen.machine()); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed(KEYCODE_A)) + if (!screen.machine().input().code_pressed(KEYCODE_A)) tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - if (!screen->machine().input().code_pressed(KEYCODE_S)) - recordbr_draw_sprites(screen->machine(), bitmap, cliprect, 0); - if (!screen->machine().input().code_pressed(KEYCODE_D)) + if (!screen.machine().input().code_pressed(KEYCODE_S)) + recordbr_draw_sprites(screen.machine(), bitmap, cliprect, 0); + if (!screen.machine().input().code_pressed(KEYCODE_D)) tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - if (!screen->machine().input().code_pressed(KEYCODE_F)) - recordbr_draw_sprites(screen->machine(), bitmap, cliprect, 1); + if (!screen.machine().input().code_pressed(KEYCODE_F)) + recordbr_draw_sprites(screen.machine(), bitmap, cliprect, 1); #else tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - recordbr_draw_sprites(screen->machine(), bitmap, cliprect, 0); + recordbr_draw_sprites(screen.machine(), bitmap, cliprect, 0); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - recordbr_draw_sprites(screen->machine(), bitmap, cliprect, 1); + recordbr_draw_sprites(screen.machine(), bitmap, cliprect, 1); #endif tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 2, 0, 0); @@ -441,30 +441,30 @@ } -SCREEN_UPDATE( dleague ) +SCREEN_UPDATE_IND16( dleague ) { - taitoh_state *state = screen->machine().driver_data(); + taitoh_state *state = screen.machine().driver_data(); tc0080vco_tilemap_update(state->m_tc0080vco); - taitoh_log_vram(screen->machine()); + taitoh_log_vram(screen.machine()); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); #ifdef MAME_DEBUG - if (!screen->machine().input().code_pressed(KEYCODE_A)) + if (!screen.machine().input().code_pressed(KEYCODE_A)) tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - if (!screen->machine().input().code_pressed(KEYCODE_S)) - dleague_draw_sprites(screen->machine(), bitmap, cliprect, 0); - if (!screen->machine().input().code_pressed(KEYCODE_D)) + if (!screen.machine().input().code_pressed(KEYCODE_S)) + dleague_draw_sprites(screen.machine(), bitmap, cliprect, 0); + if (!screen.machine().input().code_pressed(KEYCODE_D)) tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - if (!screen->machine().input().code_pressed(KEYCODE_F)) - dleague_draw_sprites(screen->machine(), bitmap, cliprect, 1); + if (!screen.machine().input().code_pressed(KEYCODE_F)) + dleague_draw_sprites(screen.machine(), bitmap, cliprect, 1); #else tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - dleague_draw_sprites (screen->machine(), bitmap, cliprect, 0); + dleague_draw_sprites (screen.machine(), bitmap, cliprect, 0); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); - dleague_draw_sprites (screen->machine(), bitmap, cliprect, 1); + dleague_draw_sprites (screen.machine(), bitmap, cliprect, 1); #endif tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 2, 0, 0); diff -Nru mame-0.144/src/mame/video/taitoic.c mame-0.145/src/mame/video/taitoic.c --- mame-0.144/src/mame/video/taitoic.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/taitoic.c 2012-02-06 21:30:31.000000000 +0000 @@ -501,16 +501,16 @@ /* These scanline drawing routines lifted from Taito F3: optimise / merge ? */ -INLINE void taitoic_drawscanline( bitmap_t *bitmap, const rectangle *cliprect, int x, int y, - const UINT16 *src, int transparent, UINT32 orient, bitmap_t *priority, int pri) +INLINE void taitoic_drawscanline( bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, + const UINT16 *src, int transparent, UINT32 orient, bitmap_ind8 &priority, int pri) { - UINT16 *dsti = BITMAP_ADDR16(bitmap, y, x); - UINT8 *dstp = BITMAP_ADDR8(priority, y, x); - int length = cliprect->max_x - cliprect->min_x + 1; - - src += cliprect->min_x; - dsti += cliprect->min_x; - dstp += cliprect->min_x; + UINT16 *dsti = &bitmap.pix16(y, x); + UINT8 *dstp = &priority.pix8(y, x); + int length = cliprect.width(); + + src += cliprect.min_x; + dsti += cliprect.min_x; + dstp += cliprect.min_x; if (transparent) { while (length--) @@ -586,7 +586,7 @@ DEVICE HANDLERS *****************************************************************************/ -INLINE void common_get_pc080sn_bg_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum ) +INLINE void common_get_pc080sn_bg_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); UINT16 code, attr; @@ -609,7 +609,7 @@ TILE_FLIPYX((attr & 0xc000) >> 14)); } -INLINE void common_get_pc080sn_fg_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum ) +INLINE void common_get_pc080sn_fg_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); UINT16 code,attr; @@ -660,16 +660,16 @@ if (!pc080sn->dblwidth) { if (offset < 0x2000) - tilemap_mark_tile_dirty(pc080sn->tilemap[0], offset / 2); + pc080sn->tilemap[0]->mark_tile_dirty(offset / 2); else if (offset >= 0x4000 && offset < 0x6000) - tilemap_mark_tile_dirty(pc080sn->tilemap[1], (offset & 0x1fff) / 2); + pc080sn->tilemap[1]->mark_tile_dirty((offset & 0x1fff) / 2); } else { if (offset < 0x4000) - tilemap_mark_tile_dirty(pc080sn->tilemap[0], (offset & 0x1fff)); + pc080sn->tilemap[0]->mark_tile_dirty((offset & 0x1fff)); else if (offset >= 0x4000 && offset < 0x8000) - tilemap_mark_tile_dirty(pc080sn->tilemap[1], (offset & 0x1fff)); + pc080sn->tilemap[1]->mark_tile_dirty((offset & 0x1fff)); } } @@ -730,8 +730,8 @@ { int flip = (data & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip(pc080sn->tilemap[0], flip); - tilemap_set_flip(pc080sn->tilemap[1], flip); + pc080sn->tilemap[0]->set_flip(flip); + pc080sn->tilemap[1]->set_flip(flip); break; } } @@ -748,8 +748,8 @@ { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); - tilemap_set_scrollx(pc080sn->tilemap[tilemap_num], 0, scrollx); - tilemap_set_scrolly(pc080sn->tilemap[tilemap_num], 0, scrolly); + pc080sn->tilemap[tilemap_num]->set_scrollx(0, scrollx); + pc080sn->tilemap[tilemap_num]->set_scrolly(0, scrolly); } /* This routine is needed as an override by Jumping */ @@ -757,7 +757,7 @@ void pc080sn_set_trans_pen( device_t *device, int tilemap_num, int pen ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); - tilemap_set_transparent_pen(pc080sn->tilemap[tilemap_num], pen); + pc080sn->tilemap[tilemap_num]->set_transparent_pen(pen); } @@ -766,21 +766,21 @@ pc080sn_state *pc080sn = pc080sn_get_safe_token(device); int j; - tilemap_set_scrolly(pc080sn->tilemap[0], 0, pc080sn->bgscrolly[0]); - tilemap_set_scrolly(pc080sn->tilemap[1], 0, pc080sn->bgscrolly[1]); + pc080sn->tilemap[0]->set_scrolly(0, pc080sn->bgscrolly[0]); + pc080sn->tilemap[1]->set_scrolly(0, pc080sn->bgscrolly[1]); if (!pc080sn->dblwidth) { for (j = 0; j < 256; j++) - tilemap_set_scrollx(pc080sn->tilemap[0], (j + pc080sn->bgscrolly[0]) & 0x1ff, pc080sn->bgscrollx[0] - pc080sn->bgscroll_ram[0][j]); + pc080sn->tilemap[0]->set_scrollx((j + pc080sn->bgscrolly[0]) & 0x1ff, pc080sn->bgscrollx[0] - pc080sn->bgscroll_ram[0][j]); for (j = 0; j < 256; j++) - tilemap_set_scrollx(pc080sn->tilemap[1], (j + pc080sn->bgscrolly[1]) & 0x1ff, pc080sn->bgscrollx[1] - pc080sn->bgscroll_ram[1][j]); + pc080sn->tilemap[1]->set_scrollx((j + pc080sn->bgscrolly[1]) & 0x1ff, pc080sn->bgscrollx[1] - pc080sn->bgscroll_ram[1][j]); } else { - tilemap_set_scrollx(pc080sn->tilemap[0], 0, pc080sn->bgscrollx[0]); - tilemap_set_scrollx(pc080sn->tilemap[1], 0, pc080sn->bgscrollx[1]); + pc080sn->tilemap[0]->set_scrollx(0, pc080sn->bgscrollx[0]); + pc080sn->tilemap[1]->set_scrollx(0, pc080sn->bgscrollx[1]); } } @@ -834,7 +834,7 @@ } -static void topspeed_custom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, +static void topspeed_custom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority, UINT16 *color_ctrl_ram ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); @@ -842,8 +842,8 @@ UINT8 *tsrc; UINT16 scanline[1024]; /* won't be called by a wide-screen game, but just in case... */ - bitmap_t *srcbitmap = tilemap_get_pixmap(pc080sn->tilemap[layer]); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(pc080sn->tilemap[layer]); + bitmap_ind16 &srcbitmap = pc080sn->tilemap[layer]->pixmap(); + bitmap_ind8 &flagsbitmap = pc080sn->tilemap[layer]->flagsmap(); UINT16 a, color; int sx, x_index; @@ -852,10 +852,10 @@ int flip = 0; int machine_flip = 0; /* for ROT 180 ? */ - int min_x = cliprect->min_x; - int max_x = cliprect->max_x; - int min_y = cliprect->min_y; - int max_y = cliprect->max_y; + int min_x = cliprect.min_x; + int max_x = cliprect.max_x; + int min_y = cliprect.min_y; + int max_y = cliprect.max_y; int screen_width = max_x - min_x + 1; int width_mask = 0x1ff; /* underlying tilemap */ @@ -883,8 +883,8 @@ x_index = sx - (pc080sn->bgscroll_ram[layer][row_index]); - src16 = BITMAP_ADDR16(srcbitmap, src_y_index, 0); - tsrc = BITMAP_ADDR8(flagsbitmap, src_y_index, 0); + src16 = &srcbitmap.pix16(src_y_index); + tsrc = &flagsbitmap.pix8(src_y_index); dst16 = scanline; if (flags & TILEMAP_DRAW_OPAQUE) @@ -928,13 +928,13 @@ while ((!machine_flip && y <= max_y) || (machine_flip && y >= min_y)); } -void pc080sn_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +void pc080sn_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); - tilemap_draw(bitmap, cliprect, pc080sn->tilemap[layer], flags, priority); + pc080sn->tilemap[layer]->draw(bitmap, cliprect, flags, priority); } -void pc080sn_tilemap_draw_offset( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority, int xoffs, int yoffs ) +void pc080sn_tilemap_draw_offset( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority, int xoffs, int yoffs ) { pc080sn_state *pc080sn = pc080sn_get_safe_token(device); int basedx = -16 - pc080sn->xoffs; @@ -942,14 +942,14 @@ int basedy = pc080sn->yoffs; int basedyflip = -pc080sn->yoffs; - tilemap_set_scrolldx(pc080sn->tilemap[layer], basedx + xoffs, basedxflip + xoffs); - tilemap_set_scrolldy(pc080sn->tilemap[layer], basedy + yoffs, basedyflip + yoffs); - tilemap_draw(bitmap, cliprect, pc080sn->tilemap[layer], flags, priority); - tilemap_set_scrolldx(pc080sn->tilemap[layer], basedx, basedxflip); - tilemap_set_scrolldy(pc080sn->tilemap[layer], basedy, basedyflip); + pc080sn->tilemap[layer]->set_scrolldx(basedx + xoffs, basedxflip + xoffs); + pc080sn->tilemap[layer]->set_scrolldy(basedy + yoffs, basedyflip + yoffs); + pc080sn->tilemap[layer]->draw(bitmap, cliprect, flags, priority); + pc080sn->tilemap[layer]->set_scrolldx(basedx, basedxflip); + pc080sn->tilemap[layer]->set_scrolldy(basedy, basedyflip); } -void pc080sn_tilemap_draw_special( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority, UINT16 *ram ) +void pc080sn_tilemap_draw_special( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority, UINT16 *ram ) { topspeed_custom_draw(device, bitmap, cliprect, layer, flags, priority, ram); } @@ -965,8 +965,8 @@ pc080sn->bgscrolly[1] = -pc080sn->ctrl[3]; flip = (pc080sn->ctrl[4] & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip(pc080sn->tilemap[0], flip); - tilemap_set_flip(pc080sn->tilemap[1], flip); + pc080sn->tilemap[0]->set_flip(flip); + pc080sn->tilemap[1]->set_flip(flip); } /***************************************************************************** @@ -997,18 +997,18 @@ pc080sn->tilemap[1] = tilemap_create_device(device, pc080sn_get_fg_tile_info, tilemap_scan_rows, 8, 8, 128, 64); } - tilemap_set_transparent_pen(pc080sn->tilemap[0], 0); - tilemap_set_transparent_pen(pc080sn->tilemap[1], 0); + pc080sn->tilemap[0]->set_transparent_pen(0); + pc080sn->tilemap[1]->set_transparent_pen(0); - tilemap_set_scrolldx(pc080sn->tilemap[0], -16 + pc080sn->xoffs, -16 - pc080sn->xoffs); - tilemap_set_scrolldy(pc080sn->tilemap[0], pc080sn->yoffs, -pc080sn->yoffs); - tilemap_set_scrolldx(pc080sn->tilemap[1], -16 + pc080sn->xoffs, -16 - pc080sn->xoffs); - tilemap_set_scrolldy(pc080sn->tilemap[1], pc080sn->yoffs, -pc080sn->yoffs); + pc080sn->tilemap[0]->set_scrolldx(-16 + pc080sn->xoffs, -16 - pc080sn->xoffs); + pc080sn->tilemap[0]->set_scrolldy(pc080sn->yoffs, -pc080sn->yoffs); + pc080sn->tilemap[1]->set_scrolldx(-16 + pc080sn->xoffs, -16 - pc080sn->xoffs); + pc080sn->tilemap[1]->set_scrolldy(pc080sn->yoffs, -pc080sn->yoffs); if (!pc080sn->dblwidth) { - tilemap_set_scroll_rows(pc080sn->tilemap[0], 512); - tilemap_set_scroll_rows(pc080sn->tilemap[1], 512); + pc080sn->tilemap[0]->set_scroll_rows(512); + pc080sn->tilemap[1]->set_scroll_rows(512); } pc080sn->ram = auto_alloc_array_clear(device->machine(), UINT16, PC080SN_RAM_SIZE / 2); @@ -1122,7 +1122,7 @@ } -void pc090oj_draw_sprites( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int pri_type ) +void pc090oj_draw_sprites( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri_type ) { pc090oj_state *pc090oj = pc090oj_get_safe_token(device); int offs, priority = 0; @@ -1312,7 +1312,7 @@ color = tc0080vco->bg0_ram_1[tile_index] & 0x001f; tile = tc0080vco->bg0_ram_0[tile_index] & 0x7fff; - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO_DEVICE( tc0080vco->bg_gfx, @@ -1329,7 +1329,7 @@ color = tc0080vco->bg1_ram_1[tile_index] & 0x001f; tile = tc0080vco->bg1_ram_0[tile_index] & 0x7fff; - tileinfo->category = 0; + tileinfo.category = 0; SET_TILE_INFO_DEVICE( tc0080vco->bg_gfx, @@ -1349,7 +1349,7 @@ tile = (tc0080vco->tx_ram_0[tile_index >> 1] & 0x00ff); else tile = (tc0080vco->tx_ram_0[tile_index >> 1] & 0xff00) >> 8; - tileinfo->category = 0; + tileinfo.category = 0; } else { @@ -1357,7 +1357,7 @@ tile = (tc0080vco->tx_ram_0[tile_index >> 1] & 0xff00) >> 8; else tile = (tc0080vco->tx_ram_0[tile_index >> 1] & 0x00ff); - tileinfo->category = 0; + tileinfo.category = 0; } SET_TILE_INFO_DEVICE( @@ -1392,9 +1392,9 @@ case 0x00: /* screen invert control */ tc0080vco->flipscreen = tc0080vco->scroll_ram[0] & 0x0c00; - tilemap_set_flip(tc0080vco->tilemap[0], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip(tc0080vco->tilemap[1], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip(tc0080vco->tilemap[2], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[0]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[1]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[2]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tc0080vco->bg0_scrollx = tc0080vco->scroll_ram[1] & 0x03ff; tc0080vco->bg1_scrollx = tc0080vco->scroll_ram[2] & 0x03ff; @@ -1450,8 +1450,8 @@ } else if (offset < 0x2000 / 2) /* fg0 (text layer) */ { - tilemap_mark_tile_dirty(tc0080vco->tilemap[2], (offset & 0x07ff) * 2); - tilemap_mark_tile_dirty(tc0080vco->tilemap[2], (offset & 0x07ff) * 2 + 1); + tc0080vco->tilemap[2]->mark_tile_dirty((offset & 0x07ff) * 2); + tc0080vco->tilemap[2]->mark_tile_dirty((offset & 0x07ff) * 2 + 1); #if 0 if (!tc0080vco->has_tx) { @@ -1463,10 +1463,10 @@ else if (offset < 0xc000 / 2) /* chain ram */ {} else if (offset < 0xe000 / 2) /* bg0 (0) */ - tilemap_mark_tile_dirty(tc0080vco->tilemap[0], (offset & 0xfff)); + tc0080vco->tilemap[0]->mark_tile_dirty((offset & 0xfff)); else if (offset < 0x10000 / 2) /* bg1 (0) */ - tilemap_mark_tile_dirty(tc0080vco->tilemap[1],(offset & 0xfff)); + tc0080vco->tilemap[1]->mark_tile_dirty((offset & 0xfff)); else if (offset < 0x11000 / 2) { @@ -1489,10 +1489,10 @@ else if (offset < 0x1c000 / 2) /* chain ram */ {} else if (offset < 0x1e000 / 2) /* bg0 (1) */ - tilemap_mark_tile_dirty(tc0080vco->tilemap[0], (offset & 0xfff)); + tc0080vco->tilemap[0]->mark_tile_dirty((offset & 0xfff)); else if (offset < 0x20000 / 2) /* bg1 (1) */ - tilemap_mark_tile_dirty(tc0080vco->tilemap[1], (offset & 0xfff)); + tc0080vco->tilemap[1]->mark_tile_dirty((offset & 0xfff)); else if (offset < 0x20400 / 2) /* bg0 rowscroll */ {} @@ -1510,25 +1510,25 @@ if (!tc0080vco->flipscreen) { for (j = 0; j < 0x400; j++) - tilemap_set_scrollx(tc0080vco->tilemap[0], (j + 0) & 0x3ff, -tc0080vco->bg0_scrollx - tc0080vco->bgscroll_ram[j & 0x1ff]); + tc0080vco->tilemap[0]->set_scrollx((j + 0) & 0x3ff, -tc0080vco->bg0_scrollx - tc0080vco->bgscroll_ram[j & 0x1ff]); } else { for (j = 0; j < 0x400; j++) - tilemap_set_scrollx(tc0080vco->tilemap[0], (j + 0) & 0x3ff, -tc0080vco->bg0_scrollx + tc0080vco->bgscroll_ram[j & 0x1ff]); + tc0080vco->tilemap[0]->set_scrollx((j + 0) & 0x3ff, -tc0080vco->bg0_scrollx + tc0080vco->bgscroll_ram[j & 0x1ff]); } - tilemap_set_scrolly(tc0080vco->tilemap[0], 0, tc0080vco->bg0_scrolly); - tilemap_set_scrollx(tc0080vco->tilemap[1], 0, -tc0080vco->bg1_scrollx); - tilemap_set_scrolly(tc0080vco->tilemap[1], 0, tc0080vco->bg1_scrolly); - tilemap_set_scrollx(tc0080vco->tilemap[2], 0, 0); /* no scroll (maybe) */ - tilemap_set_scrolly(tc0080vco->tilemap[2], 0, 0); + tc0080vco->tilemap[0]->set_scrolly(0, tc0080vco->bg0_scrolly); + tc0080vco->tilemap[1]->set_scrollx(0, -tc0080vco->bg1_scrollx); + tc0080vco->tilemap[1]->set_scrolly(0, tc0080vco->bg1_scrolly); + tc0080vco->tilemap[2]->set_scrollx(0, 0); /* no scroll (maybe) */ + tc0080vco->tilemap[2]->set_scrolly(0, 0); } /* NB: orientation_flipx code in following routine has not been tested */ -static void tc0080vco_bg0_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority ) +static void tc0080vco_bg0_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) { tc0080vco_state *tc0080vco = tc0080vco_get_safe_token(device); UINT16 zoom = tc0080vco->scroll_ram[6]; @@ -1539,15 +1539,15 @@ if (zx == 0x3f && zy == 0x7f) /* normal size */ { - tilemap_draw(bitmap, cliprect, tc0080vco->tilemap[0], flags, priority); + tc0080vco->tilemap[0]->draw(bitmap, cliprect, flags, priority); } else /* zoom + rowscroll = custom draw routine */ { UINT16 *dst16, *src16; UINT8 *tsrc; UINT16 scanline[512]; - bitmap_t *srcbitmap = tilemap_get_pixmap(tc0080vco->tilemap[0]); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(tc0080vco->tilemap[0]); + bitmap_ind16 &srcbitmap = tc0080vco->tilemap[0]->pixmap(); + bitmap_ind8 &flagsbitmap = tc0080vco->tilemap[0]->flagsmap(); int sx, zoomx, zoomy; int dx, ex, dy, ey; @@ -1557,10 +1557,10 @@ int flip = tc0080vco->flipscreen; int machine_flip = 0; /* for ROT 180 ? */ - int min_x = cliprect->min_x; - int max_x = cliprect->max_x; - int min_y = cliprect->min_y; - int max_y = cliprect->max_y; + int min_x = cliprect.min_x; + int max_x = cliprect.max_x; + int min_y = cliprect.min_y; + int max_y = cliprect.max_y; int screen_width = max_x + 1; int width_mask = 0x3ff; /* underlying tilemap */ @@ -1629,8 +1629,8 @@ x_index = sx - ((tc0080vco->bgscroll_ram[row_index] << 16)); - src16 = BITMAP_ADDR16(srcbitmap, src_y_index, 0); - tsrc = BITMAP_ADDR8(flagsbitmap, src_y_index, 0); + src16 = &srcbitmap.pix16(src_y_index); + tsrc = &flagsbitmap.pix8(src_y_index); dst16 = scanline; x_step = zoomx; @@ -1681,15 +1681,15 @@ } \ while (0) \ -static void tc0080vco_bg1_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int flags, UINT32 priority ) +static void tc0080vco_bg1_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int flags, UINT32 priority ) { tc0080vco_state *tc0080vco = tc0080vco_get_safe_token(device); UINT8 layer = 1; UINT16 zoom = tc0080vco->scroll_ram[6 + layer]; - int min_x = cliprect->min_x; - int max_x = cliprect->max_x; - int min_y = cliprect->min_y; - int max_y = cliprect->max_y; + int min_x = cliprect.min_x; + int max_x = cliprect.max_x; + int min_y = cliprect.min_y; + int max_y = cliprect.max_y; int zoomx, zoomy; zoomx = (zoom & 0xff00) >> 8; @@ -1697,7 +1697,7 @@ if (zoomx == 0x3f && zoomy == 0x7f) /* normal size */ { - tilemap_draw(bitmap, cliprect, tc0080vco->tilemap[layer], flags, priority); + tc0080vco->tilemap[layer]->draw(bitmap, cliprect, flags, priority); } else /* zoomed */ { @@ -1705,7 +1705,7 @@ int sx,sy; /* shouldn't we set no_clip before doing this (see TC0480SCP) ? */ - bitmap_t *srcbitmap = tilemap_get_pixmap(tc0080vco->tilemap[layer]); + bitmap_ind16 &srcbitmap = tc0080vco->tilemap[layer]->pixmap(); if (zoomx < 63) { @@ -1746,8 +1746,8 @@ } { - bitmap_t *dest = bitmap; - bitmap_t *src = srcbitmap; + bitmap_ind16 &dest = bitmap; + bitmap_ind16 &src = srcbitmap; INT32 startx = sx; INT32 starty = sy; INT32 incxx = zx; @@ -1756,9 +1756,9 @@ INT32 incyy = zy; int wraparound = 0; UINT32 privalue = priority; - bitmap_t *priority = device->machine().priority_bitmap; + bitmap_ind8 &priority = device->machine().priority_bitmap; - if (dest->bpp == 16) + if (dest.bpp() == 16) COPYROZBITMAP_CORE(UINT16, PIXEL_OP_COPY_TRANS0_SET_PRIORITY, UINT8); else COPYROZBITMAP_CORE(UINT32, PIXEL_OP_COPY_TRANS0_SET_PRIORITY, UINT8); @@ -1767,7 +1767,7 @@ } -void tc0080vco_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +void tc0080vco_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { tc0080vco_state *tc0080vco = tc0080vco_get_safe_token(device); int disable = 0x00; /* possibly layer disable bits do exist ?? */ @@ -1791,7 +1791,7 @@ case 2: if (disable & 0x04) return; - tilemap_draw(bitmap, cliprect, tc0080vco->tilemap[2], flags, priority); + tc0080vco->tilemap[2]->draw(bitmap, cliprect, flags, priority); break; } } @@ -1833,9 +1833,9 @@ { tc0080vco->flipscreen = tc0080vco->scroll_ram[0] & 0x0c00; - tilemap_set_flip(tc0080vco->tilemap[0], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip(tc0080vco->tilemap[1], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - tilemap_set_flip(tc0080vco->tilemap[2], tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[0]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[1]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + tc0080vco->tilemap[2]->set_flip(tc0080vco->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tc0080vco->bg0_scrollx = tc0080vco->scroll_ram[1] & 0x03ff; tc0080vco->bg1_scrollx = tc0080vco->scroll_ram[2] & 0x03ff; @@ -1864,24 +1864,24 @@ tc0080vco->tilemap[0] = tilemap_create_device(device, tc0080vco_get_bg0_tile_info, tilemap_scan_rows, 16, 16, 64, 64); tc0080vco->tilemap[1] = tilemap_create_device(device, tc0080vco_get_bg1_tile_info, tilemap_scan_rows, 16, 16, 64, 64); - tilemap_set_transparent_pen(tc0080vco->tilemap[0], 0); - tilemap_set_transparent_pen(tc0080vco->tilemap[1], 0); + tc0080vco->tilemap[0]->set_transparent_pen(0); + tc0080vco->tilemap[1]->set_transparent_pen(0); - tilemap_set_scrolldx(tc0080vco->tilemap[0], tc0080vco->bg_xoffs, 512); - tilemap_set_scrolldx(tc0080vco->tilemap[1], tc0080vco->bg_xoffs, 512); - tilemap_set_scrolldy(tc0080vco->tilemap[0], tc0080vco->bg_yoffs, tc0080vco->bg_flip_yoffs); - tilemap_set_scrolldy(tc0080vco->tilemap[1], tc0080vco->bg_yoffs, tc0080vco->bg_flip_yoffs); + tc0080vco->tilemap[0]->set_scrolldx(tc0080vco->bg_xoffs, 512); + tc0080vco->tilemap[1]->set_scrolldx(tc0080vco->bg_xoffs, 512); + tc0080vco->tilemap[0]->set_scrolldy(tc0080vco->bg_yoffs, tc0080vco->bg_flip_yoffs); + tc0080vco->tilemap[1]->set_scrolldy(tc0080vco->bg_yoffs, tc0080vco->bg_flip_yoffs); /* bg0 tilemap scrollable per pixel row */ - tilemap_set_scroll_rows(tc0080vco->tilemap[0], 512); + tc0080vco->tilemap[0]->set_scroll_rows(512); /* Perform extra initialisations for text layer */ tc0080vco->tilemap[2] = tilemap_create_device(device, tc0080vco_get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_scrolldx(tc0080vco->tilemap[2], 0, 0); - tilemap_set_scrolldy(tc0080vco->tilemap[2], 48, -448); + tc0080vco->tilemap[2]->set_scrolldx(0, 0); + tc0080vco->tilemap[2]->set_scrolldy(48, -448); - tilemap_set_transparent_pen(tc0080vco->tilemap[2], 0); + tc0080vco->tilemap[2]->set_transparent_pen(0); tc0080vco->ram = auto_alloc_array_clear(device->machine(), UINT16, TC0080VCO_RAM_SIZE / 2); @@ -1969,7 +1969,7 @@ DEVICE HANDLERS *****************************************************************************/ -INLINE void common_get_bg0_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) +INLINE void common_get_bg0_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); int code, attr; @@ -1993,7 +1993,7 @@ TILE_FLIPYX((attr & 0xc000) >> 14)); } -INLINE void common_get_bg1_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) +INLINE void common_get_bg1_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); int code, attr; @@ -2017,7 +2017,7 @@ TILE_FLIPYX((attr & 0xc000) >> 14)); } -INLINE void common_get_tx_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) +INLINE void common_get_tx_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum, int colbank, int dblwidth ) { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); int attr = ram[tile_index]; @@ -2113,9 +2113,9 @@ { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[0][tc0100scn->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[1][tc0100scn->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[2][tc0100scn->dblwidth]); + tc0100scn->tilemap[0][tc0100scn->dblwidth]->mark_all_dirty(); + tc0100scn->tilemap[1][tc0100scn->dblwidth]->mark_all_dirty(); + tc0100scn->tilemap[2][tc0100scn->dblwidth]->mark_all_dirty(); } static void tc0100scn_restore_scroll( tc0100scn_state *tc0100scn ) @@ -2124,21 +2124,21 @@ tc0100scn->bgscrollx = -tc0100scn->ctrl[0]; tc0100scn->fgscrollx = -tc0100scn->ctrl[1]; - tilemap_set_scrollx(tc0100scn->tilemap[2][0], 0, -tc0100scn->ctrl[2]); - tilemap_set_scrollx(tc0100scn->tilemap[2][1], 0, -tc0100scn->ctrl[2]); + tc0100scn->tilemap[2][0]->set_scrollx(0, -tc0100scn->ctrl[2]); + tc0100scn->tilemap[2][1]->set_scrollx(0, -tc0100scn->ctrl[2]); tc0100scn->bgscrolly = -tc0100scn->ctrl[3]; tc0100scn->fgscrolly = -tc0100scn->ctrl[4]; - tilemap_set_scrolly(tc0100scn->tilemap[2][0], 0, -tc0100scn->ctrl[5]); - tilemap_set_scrolly(tc0100scn->tilemap[2][1], 0, -tc0100scn->ctrl[5]); + tc0100scn->tilemap[2][0]->set_scrolly(0, -tc0100scn->ctrl[5]); + tc0100scn->tilemap[2][1]->set_scrolly(0, -tc0100scn->ctrl[5]); flip = (tc0100scn->ctrl[7] & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip(tc0100scn->tilemap[0][0], flip); - tilemap_set_flip(tc0100scn->tilemap[1][0], flip); - tilemap_set_flip(tc0100scn->tilemap[2][0], flip); - tilemap_set_flip(tc0100scn->tilemap[0][1], flip); - tilemap_set_flip(tc0100scn->tilemap[1][1], flip); - tilemap_set_flip(tc0100scn->tilemap[2][1], flip); + tc0100scn->tilemap[0][0]->set_flip(flip); + tc0100scn->tilemap[1][0]->set_flip(flip); + tc0100scn->tilemap[2][0]->set_flip(flip); + tc0100scn->tilemap[0][1]->set_flip(flip); + tc0100scn->tilemap[1][1]->set_flip(flip); + tc0100scn->tilemap[2][1]->set_flip(flip); } @@ -2147,12 +2147,12 @@ tc0100scn_set_layer_ptrs(tc0100scn); tc0100scn_restore_scroll(tc0100scn); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[0][0]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[1][0]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[2][0]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[0][1]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[1][1]); - tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[2][1]); + tc0100scn->tilemap[0][0]->mark_all_dirty(); + tc0100scn->tilemap[1][0]->mark_all_dirty(); + tc0100scn->tilemap[2][0]->mark_all_dirty(); + tc0100scn->tilemap[0][1]->mark_all_dirty(); + tc0100scn->tilemap[1][1]->mark_all_dirty(); + tc0100scn->tilemap[2][1]->mark_all_dirty(); } READ16_DEVICE_HANDLER( tc0100scn_word_r ) @@ -2169,24 +2169,24 @@ if (!tc0100scn->dblwidth) { if (offset < 0x2000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[0][0], offset / 2); + tc0100scn->tilemap[0][0]->mark_tile_dirty(offset / 2); else if (offset < 0x3000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[2][0], (offset & 0x0fff)); + tc0100scn->tilemap[2][0]->mark_tile_dirty((offset & 0x0fff)); else if (offset < 0x3800) gfx_element_mark_dirty(device->machine().gfx[tc0100scn->tx_gfx], (offset - 0x3000) / 8); else if (offset >= 0x4000 && offset < 0x6000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[1][0], (offset & 0x1fff) / 2); + tc0100scn->tilemap[1][0]->mark_tile_dirty((offset & 0x1fff) / 2); } else /* Double-width tilemaps have a different memory map */ { if (offset < 0x4000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[0][1], offset / 2); + tc0100scn->tilemap[0][1]->mark_tile_dirty(offset / 2); else if (offset >= 0x4000 && offset < 0x8000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[1][1], (offset & 0x3fff) / 2); + tc0100scn->tilemap[1][1]->mark_tile_dirty((offset & 0x3fff) / 2); else if (offset >= 0x8800 && offset < 0x9000) gfx_element_mark_dirty(device->machine().gfx[tc0100scn->tx_gfx], (offset - 0x8800) / 8); else if (offset >= 0x9000) - tilemap_mark_tile_dirty(tc0100scn->tilemap[2][1], (offset & 0x0fff)); + tc0100scn->tilemap[2][1]->mark_tile_dirty((offset & 0x0fff)); } } @@ -2215,8 +2215,8 @@ break; case 0x02: - tilemap_set_scrollx(tc0100scn->tilemap[2][0], 0, -data); - tilemap_set_scrollx(tc0100scn->tilemap[2][1], 0, -data); + tc0100scn->tilemap[2][0]->set_scrollx(0, -data); + tc0100scn->tilemap[2][1]->set_scrollx(0, -data); break; case 0x03: @@ -2228,8 +2228,8 @@ break; case 0x05: - tilemap_set_scrolly(tc0100scn->tilemap[2][0], 0, -data); - tilemap_set_scrolly(tc0100scn->tilemap[2][1], 0, -data); + tc0100scn->tilemap[2][0]->set_scrolly(0, -data); + tc0100scn->tilemap[2][1]->set_scrolly(0, -data); break; case 0x06: @@ -2256,12 +2256,12 @@ { int flip = (data & 0x01) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; - tilemap_set_flip(tc0100scn->tilemap[0][0], flip); - tilemap_set_flip(tc0100scn->tilemap[1][0], flip); - tilemap_set_flip(tc0100scn->tilemap[2][0], flip); - tilemap_set_flip(tc0100scn->tilemap[0][1], flip); - tilemap_set_flip(tc0100scn->tilemap[1][1], flip); - tilemap_set_flip(tc0100scn->tilemap[2][1], flip); + tc0100scn->tilemap[0][0]->set_flip(flip); + tc0100scn->tilemap[1][0]->set_flip(flip); + tc0100scn->tilemap[2][0]->set_flip(flip); + tc0100scn->tilemap[0][1]->set_flip(flip); + tc0100scn->tilemap[1][1]->set_flip(flip); + tc0100scn->tilemap[2][1]->set_flip(flip); break; } @@ -2317,53 +2317,53 @@ tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); int j; - tilemap_set_scrolly(tc0100scn->tilemap[0][tc0100scn->dblwidth], 0, tc0100scn->bgscrolly); - tilemap_set_scrolly(tc0100scn->tilemap[1][tc0100scn->dblwidth], 0, tc0100scn->fgscrolly); + tc0100scn->tilemap[0][tc0100scn->dblwidth]->set_scrolly(0, tc0100scn->bgscrolly); + tc0100scn->tilemap[1][tc0100scn->dblwidth]->set_scrolly(0, tc0100scn->fgscrolly); for (j = 0; j < 256; j++) - tilemap_set_scrollx(tc0100scn->tilemap[0][tc0100scn->dblwidth], (j + tc0100scn->bgscrolly) & 0x1ff, tc0100scn->bgscrollx - tc0100scn->bgscroll_ram[j]); + tc0100scn->tilemap[0][tc0100scn->dblwidth]->set_scrollx((j + tc0100scn->bgscrolly) & 0x1ff, tc0100scn->bgscrollx - tc0100scn->bgscroll_ram[j]); for (j = 0; j < 256; j++) - tilemap_set_scrollx(tc0100scn->tilemap[1][tc0100scn->dblwidth], (j + tc0100scn->fgscrolly) & 0x1ff, tc0100scn->fgscrollx - tc0100scn->fgscroll_ram[j]); + tc0100scn->tilemap[1][tc0100scn->dblwidth]->set_scrollx((j + tc0100scn->fgscrolly) & 0x1ff, tc0100scn->fgscrollx - tc0100scn->fgscroll_ram[j]); } -static void tc0100scn_tilemap_draw_fg( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t* tmap, int flags, UINT32 priority ) +static void tc0100scn_tilemap_draw_fg( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t* tmap, int flags, UINT32 priority ) { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); - const bitmap_t *src_bitmap = tilemap_get_pixmap(tmap); + const bitmap_ind16 &src_bitmap = tmap->pixmap(); int width_mask, height_mask, x, y, p; int column_offset, src_x = 0, src_y = 0; - int scrollx_delta = - tilemap_get_scrolldx(tmap); - int scrolly_delta = - tilemap_get_scrolldy(tmap); + int scrollx_delta = - tmap->scrolldx(); + int scrolly_delta = - tmap->scrolldy(); - width_mask = src_bitmap->width - 1; - height_mask = src_bitmap->height - 1; + width_mask = src_bitmap.width() - 1; + height_mask = src_bitmap.height() - 1; src_y = (tc0100scn->fgscrolly + scrolly_delta) & height_mask; if (tc0100scn->ctrl[0x7] & 1) // Flipscreen src_y = (256 - src_y) & height_mask; - //We use cliprect->max_y and cliprect->max_x to support games which use more than 1 screen + //We use cliprect.max_y and cliprect.max_x to support games which use more than 1 screen // Row offsets are 'screen space' 0-255 regardless of Y scroll - for (y = 0; y <= cliprect->max_y; y++) + for (y = 0; y <= cliprect.max_y; y++) { - src_x = (tc0100scn->fgscrollx - tc0100scn->fgscroll_ram[(y + scrolly_delta) & 0x1ff] + scrollx_delta + cliprect->min_x) & width_mask; + src_x = (tc0100scn->fgscrollx - tc0100scn->fgscroll_ram[(y + scrolly_delta) & 0x1ff] + scrollx_delta + cliprect.min_x) & width_mask; if (tc0100scn->ctrl[0x7] & 1) // Flipscreen src_x = (256 - 64 - src_x) & width_mask; // Col offsets are 'tilemap' space 0-511, and apply to blocks of 8 pixels at once - for (x = 0; x <= (cliprect->max_x - cliprect->min_x); x++) + for (x = 0; x < cliprect.width(); x++) { column_offset = tc0100scn->colscroll_ram[(src_x & 0x3ff) / 8]; - p = *BITMAP_ADDR16(src_bitmap, (src_y - column_offset) & height_mask, src_x); + p = src_bitmap.pix16((src_y - column_offset) & height_mask, src_x); if ((p & 0xf)!= 0 || (flags & TILEMAP_DRAW_OPAQUE)) { - *BITMAP_ADDR16(bitmap, y, x + cliprect->min_x) = p; - if (device->machine().priority_bitmap) + bitmap.pix16(y, x + cliprect.min_x) = p; + if (device->machine().priority_bitmap.valid()) { - UINT8 *pri = BITMAP_ADDR8(device->machine().priority_bitmap, y, 0); - pri[x + cliprect->min_x] |= priority; + UINT8 *pri = &device->machine().priority_bitmap.pix8(y); + pri[x + cliprect.min_x] |= priority; } } src_x = (src_x + 1) & width_mask; @@ -2372,12 +2372,12 @@ } } -int tc0100scn_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +int tc0100scn_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { tc0100scn_state *tc0100scn = tc0100scn_get_safe_token(device); int disable = tc0100scn->ctrl[6] & 0xf7; - rectangle clip = *cliprect; - sect_rect(&clip, &tc0100scn->cliprect); + rectangle clip = cliprect; + clip &= tc0100scn->cliprect; #if 0 if (disable != 0 && disable != 3 && disable != 7) @@ -2389,17 +2389,17 @@ case 0: if (disable & 0x01) return 1; - tilemap_draw(bitmap, &clip, tc0100scn->tilemap[0][tc0100scn->dblwidth], flags, priority); + tc0100scn->tilemap[0][tc0100scn->dblwidth]->draw(bitmap, clip, flags, priority); break; case 1: if (disable & 0x02) return 1; - tc0100scn_tilemap_draw_fg(device, bitmap, &clip, tc0100scn->tilemap[1][tc0100scn->dblwidth], flags, priority); + tc0100scn_tilemap_draw_fg(device, bitmap, clip, tc0100scn->tilemap[1][tc0100scn->dblwidth], flags, priority); break; case 2: if (disable & 0x04) return 1; - tilemap_draw(bitmap, &clip, tc0100scn->tilemap[2][tc0100scn->dblwidth], flags, priority); + tc0100scn->tilemap[2][tc0100scn->dblwidth]->draw(bitmap, clip, flags, priority); break; } return 0; @@ -2444,13 +2444,13 @@ tc0100scn->tilemap[1][1] = tilemap_create_device(device, tc0100scn_get_fg_tile_info, tilemap_scan_rows, 8, 8, 128, 64); tc0100scn->tilemap[2][1] = tilemap_create_device(device, tc0100scn_get_tx_tile_info, tilemap_scan_rows, 8, 8, 128, 32); - tilemap_set_transparent_pen(tc0100scn->tilemap[0][0], 0); - tilemap_set_transparent_pen(tc0100scn->tilemap[1][0], 0); - tilemap_set_transparent_pen(tc0100scn->tilemap[2][0], 0); - - tilemap_set_transparent_pen(tc0100scn->tilemap[0][1], 0); - tilemap_set_transparent_pen(tc0100scn->tilemap[1][1], 0); - tilemap_set_transparent_pen(tc0100scn->tilemap[2][1], 0); + tc0100scn->tilemap[0][0]->set_transparent_pen(0); + tc0100scn->tilemap[1][0]->set_transparent_pen(0); + tc0100scn->tilemap[2][0]->set_transparent_pen(0); + + tc0100scn->tilemap[0][1]->set_transparent_pen(0); + tc0100scn->tilemap[1][1]->set_transparent_pen(0); + tc0100scn->tilemap[2][1]->set_transparent_pen(0); /* Standard width tilemaps. I'm setting the optional chip #2 7 bits higher and 2 pixels to the left than chip #1 because @@ -2459,12 +2459,12 @@ xd = (intf->multiscrn_hack == 0) ? (-intf->x_offset) : (-intf->x_offset - 2); yd = (intf->multiscrn_hack == 0) ? (8 - intf->y_offset) : (1 - intf->y_offset); - tilemap_set_scrolldx(tc0100scn->tilemap[0][0], xd - 16, -intf->flip_xoffs - xd - 16); - tilemap_set_scrolldy(tc0100scn->tilemap[0][0], yd, -intf->flip_yoffs - yd); - tilemap_set_scrolldx(tc0100scn->tilemap[1][0], xd - 16, -intf->flip_xoffs - xd - 16); - tilemap_set_scrolldy(tc0100scn->tilemap[1][0], yd, -intf->flip_yoffs - yd); - tilemap_set_scrolldx(tc0100scn->tilemap[2][0], xd - 16, -intf->flip_text_xoffs - xd - 16 - 7); - tilemap_set_scrolldy(tc0100scn->tilemap[2][0], yd, -intf->flip_text_yoffs - yd); + tc0100scn->tilemap[0][0]->set_scrolldx(xd - 16, -intf->flip_xoffs - xd - 16); + tc0100scn->tilemap[0][0]->set_scrolldy(yd, -intf->flip_yoffs - yd); + tc0100scn->tilemap[1][0]->set_scrolldx(xd - 16, -intf->flip_xoffs - xd - 16); + tc0100scn->tilemap[1][0]->set_scrolldy(yd, -intf->flip_yoffs - yd); + tc0100scn->tilemap[2][0]->set_scrolldx(xd - 16, -intf->flip_text_xoffs - xd - 16 - 7); + tc0100scn->tilemap[2][0]->set_scrolldy(yd, -intf->flip_text_yoffs - yd); /* Double width tilemaps. We must correct offsets for extra chips, as MAME sees offsets from LHS of whole @@ -2474,17 +2474,17 @@ xd = -intf->x_offset - intf->multiscrn_xoffs; yd = 8 - intf->y_offset; - tilemap_set_scrolldx(tc0100scn->tilemap[0][1], xd - 16, -intf->flip_xoffs - xd - 16); - tilemap_set_scrolldy(tc0100scn->tilemap[0][1], yd, -intf->flip_yoffs - yd); - tilemap_set_scrolldx(tc0100scn->tilemap[1][1], xd - 16, -intf->flip_xoffs - xd - 16); - tilemap_set_scrolldy(tc0100scn->tilemap[1][1], yd, -intf->flip_yoffs - yd); - tilemap_set_scrolldx(tc0100scn->tilemap[2][1], xd - 16, -intf->flip_text_xoffs - xd - 16 - 7); - tilemap_set_scrolldy(tc0100scn->tilemap[2][1], yd, -intf->flip_text_yoffs - yd); - - tilemap_set_scroll_rows(tc0100scn->tilemap[0][0], 512); - tilemap_set_scroll_rows(tc0100scn->tilemap[1][0], 512); - tilemap_set_scroll_rows(tc0100scn->tilemap[0][1], 512); - tilemap_set_scroll_rows(tc0100scn->tilemap[1][1], 512); + tc0100scn->tilemap[0][1]->set_scrolldx(xd - 16, -intf->flip_xoffs - xd - 16); + tc0100scn->tilemap[0][1]->set_scrolldy(yd, -intf->flip_yoffs - yd); + tc0100scn->tilemap[1][1]->set_scrolldx(xd - 16, -intf->flip_xoffs - xd - 16); + tc0100scn->tilemap[1][1]->set_scrolldy(yd, -intf->flip_yoffs - yd); + tc0100scn->tilemap[2][1]->set_scrolldx(xd - 16, -intf->flip_text_xoffs - xd - 16 - 7); + tc0100scn->tilemap[2][1]->set_scrolldy(yd, -intf->flip_text_yoffs - yd); + + tc0100scn->tilemap[0][0]->set_scroll_rows(512); + tc0100scn->tilemap[1][0]->set_scroll_rows(512); + tc0100scn->tilemap[0][1]->set_scroll_rows(512); + tc0100scn->tilemap[1][1]->set_scroll_rows(512); tc0100scn->bg_tilemask = 0xffff; /* Mjnquest has 0x7fff tilemask */ @@ -2594,7 +2594,7 @@ { tc0280grd_state *tc0280grd = tc0280grd_get_safe_token(device); COMBINE_DATA(&tc0280grd->ram[offset]); - tilemap_mark_tile_dirty(tc0280grd->tilemap, offset); + tc0280grd->tilemap->mark_tile_dirty(offset); } WRITE16_DEVICE_HANDLER( tc0280grd_ctrl_word_w ) @@ -2624,7 +2624,7 @@ if (tc0280grd->base_color != base_color) { tc0280grd->base_color = base_color; - tilemap_mark_all_tiles_dirty(tc0280grd->tilemap); + tc0280grd->tilemap->mark_all_dirty(); } } @@ -2633,7 +2633,7 @@ tc0280grd_tilemap_update(device, base_color); } -static void zoom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int xoffset, int yoffset, UINT32 priority, int xmultiply ) +static void zoom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset, int yoffset, UINT32 priority, int xmultiply ) { tc0280grd_state *tc0280grd = tc0280grd_get_safe_token(device); UINT32 startx, starty; @@ -2662,18 +2662,18 @@ startx -= xoffset * incxx + yoffset * incyx; starty -= xoffset * incxy + yoffset * incyy; - tilemap_draw_roz(bitmap, cliprect, tc0280grd->tilemap, startx << 4, starty << 4, + tc0280grd->tilemap->draw_roz(bitmap, cliprect, startx << 4, starty << 4, incxx << 4, incxy << 4, incyx << 4, incyy << 4, 1, /* copy with wraparound */ 0, priority); } -void tc0280grd_zoom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int xoffset, int yoffset, UINT32 priority ) +void tc0280grd_zoom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset, int yoffset, UINT32 priority ) { zoom_draw(device, bitmap, cliprect, xoffset, yoffset, priority, 2); } -void tc0430grw_zoom_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int xoffset, int yoffset, UINT32 priority ) +void tc0430grw_zoom_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset, int yoffset, UINT32 priority ) { zoom_draw(device, bitmap, cliprect, xoffset, yoffset, priority, 1); } @@ -2690,7 +2690,7 @@ tc0280grd->gfxnum = intf->gfxnum; tc0280grd->tilemap = tilemap_create_device(device, tc0280grd_get_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(tc0280grd->tilemap, 0); + tc0280grd->tilemap->set_transparent_pen(0); tc0280grd->ram = auto_alloc_array(device->machine(), UINT16, TC0280GRD_RAM_SIZE / 2); @@ -2836,7 +2836,7 @@ *****************************************************************************/ -INLINE void common_get_tc0480bg_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum ) +INLINE void common_get_tc0480bg_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum ) { tc0480scp_state *tc0480scp = tc0480scp_get_safe_token(device); int code = ram[2 * tile_index + 1] & 0x7fff; @@ -2848,7 +2848,7 @@ TILE_FLIPYX((attr & 0xc000) >> 14)); } -INLINE void common_get_tc0480tx_tile_info( device_t *device, tile_data *tileinfo, int tile_index, UINT16 *ram, int gfxnum ) +INLINE void common_get_tc0480tx_tile_info( device_t *device, tile_data &tileinfo, int tile_index, UINT16 *ram, int gfxnum ) { tc0480scp_state *tc0480scp = tc0480scp_get_safe_token(device); int attr = ram[tile_index]; @@ -2903,11 +2903,11 @@ static void tc0480scp_dirty_tilemaps( tc0480scp_state *tc0480scp ) { - tilemap_mark_all_tiles_dirty(tc0480scp->tilemap[0][tc0480scp->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0480scp->tilemap[1][tc0480scp->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0480scp->tilemap[2][tc0480scp->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0480scp->tilemap[3][tc0480scp->dblwidth]); - tilemap_mark_all_tiles_dirty(tc0480scp->tilemap[4][tc0480scp->dblwidth]); + tc0480scp->tilemap[0][tc0480scp->dblwidth]->mark_all_dirty(); + tc0480scp->tilemap[1][tc0480scp->dblwidth]->mark_all_dirty(); + tc0480scp->tilemap[2][tc0480scp->dblwidth]->mark_all_dirty(); + tc0480scp->tilemap[3][tc0480scp->dblwidth]->mark_all_dirty(); + tc0480scp->tilemap[4][tc0480scp->dblwidth]->mark_all_dirty(); } @@ -2965,14 +2965,14 @@ { if (offset < 0x2000) { - tilemap_mark_tile_dirty(tc0480scp->tilemap[(offset / 0x800)][tc0480scp->dblwidth], ((offset % 0x800) / 2)); + tc0480scp->tilemap[(offset / 0x800)][tc0480scp->dblwidth]->mark_tile_dirty(((offset % 0x800) / 2)); } else if (offset < 0x6000) { /* do nothing */ } else if (offset < 0x7000) { - tilemap_mark_tile_dirty(tc0480scp->tilemap[4][tc0480scp->dblwidth], (offset - 0x6000)); + tc0480scp->tilemap[4][tc0480scp->dblwidth]->mark_tile_dirty((offset - 0x6000)); } else if (offset <= 0x7fff) { @@ -2983,14 +2983,14 @@ { if (offset < 0x4000) { - tilemap_mark_tile_dirty(tc0480scp->tilemap[(offset / 0x1000)][tc0480scp->dblwidth], ((offset % 0x1000) / 2)); + tc0480scp->tilemap[(offset / 0x1000)][tc0480scp->dblwidth]->mark_tile_dirty(((offset % 0x1000) / 2)); } else if (offset < 0x6000) { /* do nothing */ } else if (offset < 0x7000) { - tilemap_mark_tile_dirty(tc0480scp->tilemap[4][tc0480scp->dblwidth], (offset - 0x6000)); + tc0480scp->tilemap[4][tc0480scp->dblwidth]->mark_tile_dirty((offset - 0x6000)); } else if (offset <= 0x7fff) { @@ -3071,8 +3071,8 @@ if (!flip) data -= tc0480scp->text_xoffs; if (flip) data += tc0480scp->text_xoffs; - tilemap_set_scrollx(tc0480scp->tilemap[4][0], 0, -data); - tilemap_set_scrollx(tc0480scp->tilemap[4][1], 0, -data); + tc0480scp->tilemap[4][0]->set_scrollx(0, -data); + tc0480scp->tilemap[4][1]->set_scrollx(0, -data); break; case 0x0d: /* fg (text) y */ @@ -3081,8 +3081,8 @@ if (!flip) data -= tc0480scp->text_yoffs; if (flip) data += tc0480scp->text_yoffs; - tilemap_set_scrolly(tc0480scp->tilemap[4][0], 0, -data); - tilemap_set_scrolly(tc0480scp->tilemap[4][1], 0, -data); + tc0480scp->tilemap[4][0]->set_scrolly(0, -data); + tc0480scp->tilemap[4][1]->set_scrolly(0, -data); break; /* offset 0x0e unused */ @@ -3093,17 +3093,17 @@ flip = (data & 0x40) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0; tc0480scp->pri_reg = data; - tilemap_set_flip(tc0480scp->tilemap[0][0],flip); - tilemap_set_flip(tc0480scp->tilemap[1][0],flip); - tilemap_set_flip(tc0480scp->tilemap[2][0],flip); - tilemap_set_flip(tc0480scp->tilemap[3][0],flip); - tilemap_set_flip(tc0480scp->tilemap[4][0],flip); - - tilemap_set_flip(tc0480scp->tilemap[0][1],flip); - tilemap_set_flip(tc0480scp->tilemap[1][1],flip); - tilemap_set_flip(tc0480scp->tilemap[2][1],flip); - tilemap_set_flip(tc0480scp->tilemap[3][1],flip); - tilemap_set_flip(tc0480scp->tilemap[4][1],flip); + tc0480scp->tilemap[0][0]->set_flip(flip); + tc0480scp->tilemap[1][0]->set_flip(flip); + tc0480scp->tilemap[2][0]->set_flip(flip); + tc0480scp->tilemap[3][0]->set_flip(flip); + tc0480scp->tilemap[4][0]->set_flip(flip); + + tc0480scp->tilemap[0][1]->set_flip(flip); + tc0480scp->tilemap[1][1]->set_flip(flip); + tc0480scp->tilemap[2][1]->set_flip(flip); + tc0480scp->tilemap[3][1]->set_flip(flip); + tc0480scp->tilemap[4][1]->set_flip(flip); tc0480scp->dblwidth = (tc0480scp->pri_reg & 0x80) >> 7; @@ -3177,12 +3177,12 @@ for (layer = 0; layer < 4; layer++) { - tilemap_set_scrolly(tc0480scp->tilemap[layer][tc0480scp->dblwidth], 0, tc0480scp->bgscrolly[layer]); + tc0480scp->tilemap[layer][tc0480scp->dblwidth]->set_scrolly(0, tc0480scp->bgscrolly[layer]); zoom = 0x10000 + 0x7f - tc0480scp->ctrl[0x08 + layer]; if (zoom != 0x10000) /* can't use scroll rows when zooming */ { - tilemap_set_scrollx(tc0480scp->tilemap[layer][tc0480scp->dblwidth], 0, tc0480scp->bgscrollx[layer]); + tc0480scp->tilemap[layer][tc0480scp->dblwidth]->set_scrollx(0, tc0480scp->bgscrollx[layer]); } else { @@ -3191,9 +3191,9 @@ i = tc0480scp->bgscroll_ram[layer][j]; if (!flip) - tilemap_set_scrollx(tc0480scp->tilemap[layer][tc0480scp->dblwidth], j & 0x1ff, tc0480scp->bgscrollx[layer] - i); + tc0480scp->tilemap[layer][tc0480scp->dblwidth]->set_scrollx(j & 0x1ff, tc0480scp->bgscrollx[layer] - i); else - tilemap_set_scrollx(tc0480scp->tilemap[layer][tc0480scp->dblwidth], j & 0x1ff, tc0480scp->bgscrollx[layer] + i); + tc0480scp->tilemap[layer][tc0480scp->dblwidth]->set_scrollx(j & 0x1ff, tc0480scp->bgscrollx[layer] + i); } } } @@ -3236,7 +3236,7 @@ **********************************************************************/ -static void tc0480scp_bg01_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +static void tc0480scp_bg01_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { /* X-axis zoom offers expansion only: 0 = no zoom, 0xff = max Y-axis zoom offers expansion/compression: 0x7f = no zoom, 0xff = max @@ -3249,7 +3249,7 @@ if ((zoomx == 0x10000) && (zoomy == 0x10000)) /* no zoom, simple */ { /* Prevent bad things */ - tilemap_draw(bitmap, cliprect, tc0480scp->tilemap[layer][tc0480scp->dblwidth], flags, priority); + tc0480scp->tilemap[layer][tc0480scp->dblwidth]->draw(bitmap, cliprect, flags, priority); } else /* zoom */ { @@ -3257,16 +3257,16 @@ UINT8 *tsrc; UINT16 scanline[512]; UINT32 sx; - bitmap_t *srcbitmap = tilemap_get_pixmap(tc0480scp->tilemap[layer][tc0480scp->dblwidth]); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(tc0480scp->tilemap[layer][tc0480scp->dblwidth]); + bitmap_ind16 &srcbitmap = tc0480scp->tilemap[layer][tc0480scp->dblwidth]->pixmap(); + bitmap_ind8 &flagsbitmap = tc0480scp->tilemap[layer][tc0480scp->dblwidth]->flagsmap(); int flip = tc0480scp->pri_reg & 0x40; int i, y, y_index, src_y_index, row_index; int x_index, x_step; int machine_flip = 0; /* for ROT 180 ? */ - UINT16 screen_width = 512; //cliprect->max_x - cliprect->min_x + 1; - UINT16 min_y = cliprect->min_y; - UINT16 max_y = cliprect->max_y; + UINT16 screen_width = 512; //cliprect.width(); + UINT16 min_y = cliprect.min_y; + UINT16 max_y = cliprect.max_y; int width_mask = 0x1ff; if (tc0480scp->dblwidth) @@ -3305,8 +3305,8 @@ x_index = sx - ((tc0480scp->bgscroll_ram[layer][row_index] << 16)) - ((tc0480scp->bgscroll_ram[layer][row_index + 0x800] << 8) & 0xffff); - src16 = BITMAP_ADDR16(srcbitmap, src_y_index, 0); - tsrc = BITMAP_ADDR8(flagsbitmap, src_y_index, 0); + src16 = &srcbitmap.pix16(src_y_index); + tsrc = &flagsbitmap.pix8(src_y_index); dst16 = scanline; x_step = zoomx; @@ -3385,11 +3385,11 @@ ****************************************************************/ -static void tc0480scp_bg23_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +static void tc0480scp_bg23_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { tc0480scp_state *tc0480scp = tc0480scp_get_safe_token(device); - bitmap_t *srcbitmap = tilemap_get_pixmap(tc0480scp->tilemap[layer][tc0480scp->dblwidth]); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(tc0480scp->tilemap[layer][tc0480scp->dblwidth]); + bitmap_ind16 &srcbitmap = tc0480scp->tilemap[layer][tc0480scp->dblwidth]->pixmap(); + bitmap_ind8 &flagsbitmap = tc0480scp->tilemap[layer][tc0480scp->dblwidth]->flagsmap(); UINT16 *dst16, *src16; UINT8 *tsrc; @@ -3400,9 +3400,9 @@ int flipscreen = tc0480scp->pri_reg & 0x40; int machine_flip = 0; /* for ROT 180 ? */ - UINT16 screen_width = 512; //cliprect->max_x - cliprect->min_x + 1; - UINT16 min_y = cliprect->min_y; - UINT16 max_y = cliprect->max_y; + UINT16 screen_width = 512; //cliprect.width(); + UINT16 min_y = cliprect.min_y; + UINT16 max_y = cliprect.max_y; int width_mask = 0x1ff; if (tc0480scp->dblwidth) @@ -3471,8 +3471,8 @@ x_step -= (((row_zoom & 0xff) * 256) & 0xffff); } - src16 = BITMAP_ADDR16(srcbitmap, src_y_index, 0); - tsrc = BITMAP_ADDR8(flagsbitmap, src_y_index, 0); + src16 = &srcbitmap.pix16(src_y_index); + tsrc = &flagsbitmap.pix8(src_y_index); dst16 = scanline; if (flags & TILEMAP_DRAW_OPAQUE) @@ -3507,7 +3507,7 @@ } -void tc0480scp_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +void tc0480scp_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { tc0480scp_state *tc0480scp = tc0480scp_get_safe_token(device); @@ -3527,7 +3527,7 @@ tc0480scp_bg23_draw(device, bitmap, cliprect, 3, flags, priority); break; case 4: - tilemap_draw(bitmap, cliprect, tc0480scp->tilemap[4][tc0480scp->dblwidth], flags, priority); + tc0480scp->tilemap[4][tc0480scp->dblwidth]->draw(bitmap, cliprect, flags, priority); break; } } @@ -3566,17 +3566,17 @@ tc0480scp_set_layer_ptrs(tc0480scp); - tilemap_set_flip(tc0480scp->tilemap[0][0], flip); - tilemap_set_flip(tc0480scp->tilemap[1][0], flip); - tilemap_set_flip(tc0480scp->tilemap[2][0], flip); - tilemap_set_flip(tc0480scp->tilemap[3][0], flip); - tilemap_set_flip(tc0480scp->tilemap[4][0], flip); - - tilemap_set_flip(tc0480scp->tilemap[0][1], flip); - tilemap_set_flip(tc0480scp->tilemap[1][1], flip); - tilemap_set_flip(tc0480scp->tilemap[2][1], flip); - tilemap_set_flip(tc0480scp->tilemap[3][1], flip); - tilemap_set_flip(tc0480scp->tilemap[4][1], flip); + tc0480scp->tilemap[0][0]->set_flip(flip); + tc0480scp->tilemap[1][0]->set_flip(flip); + tc0480scp->tilemap[2][0]->set_flip(flip); + tc0480scp->tilemap[3][0]->set_flip(flip); + tc0480scp->tilemap[4][0]->set_flip(flip); + + tc0480scp->tilemap[0][1]->set_flip(flip); + tc0480scp->tilemap[1][1]->set_flip(flip); + tc0480scp->tilemap[2][1]->set_flip(flip); + tc0480scp->tilemap[3][1]->set_flip(flip); + tc0480scp->tilemap[4][1]->set_flip(flip); reg = tc0480scp->ctrl[0]; if (!flip) reg = -reg; @@ -3613,14 +3613,14 @@ reg = tc0480scp->ctrl[0x0c]; if (!flip) reg -= tc0480scp->text_xoffs; if (flip) reg += tc0480scp->text_xoffs; - tilemap_set_scrollx(tc0480scp->tilemap[4][0], 0, -reg); - tilemap_set_scrollx(tc0480scp->tilemap[4][1], 0, -reg); + tc0480scp->tilemap[4][0]->set_scrollx(0, -reg); + tc0480scp->tilemap[4][1]->set_scrollx(0, -reg); reg = tc0480scp->ctrl[0x0d]; if (!flip) reg -= tc0480scp->text_yoffs; if (flip) reg += tc0480scp->text_yoffs; - tilemap_set_scrolly(tc0480scp->tilemap[4][0], 0, -reg); - tilemap_set_scrolly(tc0480scp->tilemap[4][1], 0, -reg); + tc0480scp->tilemap[4][0]->set_scrolly(0, -reg); + tc0480scp->tilemap[4][1]->set_scrolly(0, -reg); } /***************************************************************************** @@ -3661,11 +3661,11 @@ for (i = 0; i < 2; i++) { - tilemap_set_transparent_pen(tc0480scp->tilemap[0][i], 0); - tilemap_set_transparent_pen(tc0480scp->tilemap[1][i], 0); - tilemap_set_transparent_pen(tc0480scp->tilemap[2][i], 0); - tilemap_set_transparent_pen(tc0480scp->tilemap[3][i], 0); - tilemap_set_transparent_pen(tc0480scp->tilemap[4][i], 0); + tc0480scp->tilemap[0][i]->set_transparent_pen(0); + tc0480scp->tilemap[1][i]->set_transparent_pen(0); + tc0480scp->tilemap[2][i]->set_transparent_pen(0); + tc0480scp->tilemap[3][i]->set_transparent_pen(0); + tc0480scp->tilemap[4][i]->set_transparent_pen(0); } xd = -tc0480scp->x_offs; @@ -3680,36 +3680,36 @@ next valid pair:- the numbers diverge from xd, 319-xd */ /* Single width offsets */ - tilemap_set_scrolldx(tc0480scp->tilemap[0][0], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[0][0], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[1][0], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[1][0], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[2][0], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[2][0], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[3][0], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[3][0], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[4][0], xd - 3, 316 - xd); /* text layer */ - tilemap_set_scrolldy(tc0480scp->tilemap[4][0], yd, 256 - yd); /* text layer */ + tc0480scp->tilemap[0][0]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[0][0]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[1][0]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[1][0]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[2][0]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[2][0]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[3][0]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[3][0]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[4][0]->set_scrolldx(xd - 3, 316 - xd); /* text layer */ + tc0480scp->tilemap[4][0]->set_scrolldy(yd, 256 - yd); /* text layer */ /* Double width offsets */ - tilemap_set_scrolldx(tc0480scp->tilemap[0][1], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[0][1], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[1][1], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[1][1], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[2][1], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[2][1], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[3][1], xd, 320 - xd + tc0480scp->flip_xoffs); - tilemap_set_scrolldy(tc0480scp->tilemap[3][1], yd, 256 - yd + tc0480scp->flip_yoffs); - tilemap_set_scrolldx(tc0480scp->tilemap[4][1], xd - 3, 317 - xd); /* text layer */ - tilemap_set_scrolldy(tc0480scp->tilemap[4][1], yd, 256 - yd); /* text layer */ + tc0480scp->tilemap[0][1]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[0][1]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[1][1]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[1][1]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[2][1]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[2][1]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[3][1]->set_scrolldx(xd, 320 - xd + tc0480scp->flip_xoffs); + tc0480scp->tilemap[3][1]->set_scrolldy(yd, 256 - yd + tc0480scp->flip_yoffs); + tc0480scp->tilemap[4][1]->set_scrolldx(xd - 3, 317 - xd); /* text layer */ + tc0480scp->tilemap[4][1]->set_scrolldy(yd, 256 - yd); /* text layer */ for (i = 0; i < 2; i++) { /* Both sets of bg tilemaps scrollable per pixel row */ - tilemap_set_scroll_rows(tc0480scp->tilemap[0][i], 512); - tilemap_set_scroll_rows(tc0480scp->tilemap[1][i], 512); - tilemap_set_scroll_rows(tc0480scp->tilemap[2][i], 512); - tilemap_set_scroll_rows(tc0480scp->tilemap[3][i], 512); + tc0480scp->tilemap[0][i]->set_scroll_rows(512); + tc0480scp->tilemap[1][i]->set_scroll_rows(512); + tc0480scp->tilemap[2][i]->set_scroll_rows(512); + tc0480scp->tilemap[3][i]->set_scroll_rows(512); } tc0480scp->ram = auto_alloc_array_clear(device->machine(), UINT16, TC0480SCP_RAM_SIZE / 2); @@ -3951,7 +3951,7 @@ ******************************************************************************/ -void tc0150rod_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int y_offs, int palette_offs, int type, int road_trans, UINT32 low_priority, UINT32 high_priority ) +void tc0150rod_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs, int palette_offs, int type, int road_trans, UINT32 low_priority, UINT32 high_priority ) { tc0150rod_state *tc0150rod = tc0150rod_get_safe_token(device); @@ -3978,10 +3978,10 @@ int left_edge, right_edge, begin, end, right_over, left_over; int line_needs_drawing, draw_top_road_line, background_only; - int min_x = cliprect->min_x; - int max_x = cliprect->max_x; - int min_y = cliprect->min_y; - int max_y = cliprect->max_y; + int min_x = cliprect.min_x; + int max_x = cliprect.max_x; + int min_y = cliprect.min_y; + int max_y = cliprect.max_y; int screen_width = max_x - min_x + 1; int y = min_y; @@ -4893,7 +4893,7 @@ if (tc0180vcu->video_control & 0x80) tc0180vcu->framebuffer_page = (~tc0180vcu->video_control & 0x40) >> 6; - tilemap_set_flip_all(device->machine(), (tc0180vcu->video_control & 0x10) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0 ); + device->machine().tilemap().set_flip_all((tc0180vcu->video_control & 0x10) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0 ); } READ16_DEVICE_HANDLER( tc0180vcu_ctrl_r ) @@ -4916,21 +4916,21 @@ switch(offset) { case 0: - tilemap_mark_all_tiles_dirty(tc0180vcu->tilemap[1]); + tc0180vcu->tilemap[1]->mark_all_dirty(); tc0180vcu->fg_rambank[0] = (((tc0180vcu->ctrl[offset] >> 8) & 0x0f) << 12); tc0180vcu->fg_rambank[1] = (((tc0180vcu->ctrl[offset] >> 12) & 0x0f) << 12); break; case 1: - tilemap_mark_all_tiles_dirty(tc0180vcu->tilemap[0]); + tc0180vcu->tilemap[0]->mark_all_dirty(); tc0180vcu->bg_rambank[0] = (((tc0180vcu->ctrl[offset] >> 8) & 0x0f) << 12); tc0180vcu->bg_rambank[1] = (((tc0180vcu->ctrl[offset] >> 12) & 0x0f) << 12); break; case 4: case 5: - tilemap_mark_all_tiles_dirty(tc0180vcu->tilemap[2]); + tc0180vcu->tilemap[2]->mark_all_dirty(); break; case 6: - tilemap_mark_all_tiles_dirty(tc0180vcu->tilemap[2]); + tc0180vcu->tilemap[2]->mark_all_dirty(); tc0180vcu->tx_rambank = (((tc0180vcu->ctrl[offset] >> 8) & 0x0f) << 11); break; case 7: @@ -5005,23 +5005,23 @@ COMBINE_DATA(&tc0180vcu->ram[offset]); if ((offset & 0x7000) == tc0180vcu->fg_rambank[0] || (offset & 0x7000) == tc0180vcu->fg_rambank[1]) - tilemap_mark_tile_dirty(tc0180vcu->tilemap[1], offset & 0x0fff); + tc0180vcu->tilemap[1]->mark_tile_dirty(offset & 0x0fff); if ((offset & 0x7000) == tc0180vcu->bg_rambank[0] || (offset & 0x7000) == tc0180vcu->bg_rambank[1]) - tilemap_mark_tile_dirty(tc0180vcu->tilemap[0], offset & 0x0fff); + tc0180vcu->tilemap[0]->mark_tile_dirty(offset & 0x0fff); if ((offset & 0x7800) == tc0180vcu->tx_rambank) - tilemap_mark_tile_dirty(tc0180vcu->tilemap[2], offset & 0x7ff); + tc0180vcu->tilemap[2]->mark_tile_dirty(offset & 0x7ff); } -void tc0180vcu_tilemap_draw( device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int tmap_num, int plane ) +void tc0180vcu_tilemap_draw( device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, int plane ) { tc0180vcu_state *tc0180vcu = tc0180vcu_get_safe_token(device); assert(tmap_num < 3); if (tmap_num == 2) - tilemap_draw(bitmap, cliprect, tc0180vcu->tilemap[2], 0, 0); /* not much to do for tx_tilemap */ + tc0180vcu->tilemap[2]->draw(bitmap, cliprect, 0, 0); /* not much to do for tx_tilemap */ else { /*plane = 0 fg tilemap*/ @@ -5035,8 +5035,8 @@ lines_per_block = 256 - (tc0180vcu->ctrl[2 + plane] >> 8); number_of_blocks = 256 / lines_per_block; - my_clip.min_x = cliprect->min_x; - my_clip.max_x = cliprect->max_x; + my_clip.min_x = cliprect.min_x; + my_clip.max_x = cliprect.max_x; for (i = 0; i < number_of_blocks; i++) { @@ -5048,17 +5048,17 @@ if (tc0180vcu->video_control & 0x10) /*flip screen*/ { - my_clip.min_y = bitmap->height - 1 - (i + 1) * lines_per_block - 1; - my_clip.max_y = bitmap->height - 1 - i * lines_per_block; + my_clip.min_y = bitmap.height() - 1 - (i + 1) * lines_per_block - 1; + my_clip.max_y = bitmap.height() - 1 - i * lines_per_block; } - sect_rect(&my_clip, cliprect); + my_clip &= cliprect; if (my_clip.min_y <= my_clip.max_y) { - tilemap_set_scrollx(tc0180vcu->tilemap[tmap_num], 0, -scrollx); - tilemap_set_scrolly(tc0180vcu->tilemap[tmap_num], 0, -scrolly); - tilemap_draw(bitmap, &my_clip, tc0180vcu->tilemap[tmap_num], 0, 0); + tc0180vcu->tilemap[tmap_num]->set_scrollx(0, -scrollx); + tc0180vcu->tilemap[tmap_num]->set_scrolly(0, -scrolly); + tc0180vcu->tilemap[tmap_num]->draw(bitmap, my_clip, 0, 0); } } } @@ -5081,12 +5081,12 @@ tc0180vcu->tilemap[1] = tilemap_create_device(device, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 64); tc0180vcu->tilemap[2] = tilemap_create_device(device, get_tx_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(tc0180vcu->tilemap[1], 0); - tilemap_set_transparent_pen(tc0180vcu->tilemap[2], 0); + tc0180vcu->tilemap[1]->set_transparent_pen(0); + tc0180vcu->tilemap[2]->set_transparent_pen(0); - tilemap_set_scrolldx(tc0180vcu->tilemap[0], 0, 24 * 8); - tilemap_set_scrolldx(tc0180vcu->tilemap[1], 0, 24 * 8); - tilemap_set_scrolldx(tc0180vcu->tilemap[2], 0, 24 * 8); + tc0180vcu->tilemap[0]->set_scrolldx(0, 24 * 8); + tc0180vcu->tilemap[1]->set_scrolldx(0, 24 * 8); + tc0180vcu->tilemap[2]->set_scrolldx(0, 24 * 8); tc0180vcu->ram = auto_alloc_array_clear(device->machine(), UINT16, TC0180VCU_RAM_SIZE / 2); tc0180vcu->scrollram = auto_alloc_array_clear(device->machine(), UINT16, TC0180VCU_SCROLLRAM_SIZE / 2); diff -Nru mame-0.144/src/mame/video/taitoic.h mame-0.145/src/mame/video/taitoic.h --- mame-0.144/src/mame/video/taitoic.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taitoic.h 2012-02-06 21:30:31.000000000 +0000 @@ -180,11 +180,11 @@ void pc080sn_set_scroll(device_t *device, int tilemap_num, int scrollx, int scrolly); void pc080sn_set_trans_pen(device_t *device, int tilemap_num, int pen); void pc080sn_tilemap_update(device_t *device); -void pc080sn_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority); -void pc080sn_tilemap_draw_offset(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority, int xoffs, int yoffs); +void pc080sn_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority); +void pc080sn_tilemap_draw_offset(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority, int xoffs, int yoffs); /* For Topspeed */ -void pc080sn_tilemap_draw_special(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority, UINT16 *ram); +void pc080sn_tilemap_draw_special(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority, UINT16 *ram); /** PC090OJ **/ @@ -193,7 +193,7 @@ void pc090oj_set_sprite_ctrl(device_t *device, UINT16 sprctrl); void pc090oj_eof_callback(device_t *device); -void pc090oj_draw_sprites(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int pri_type); +void pc090oj_draw_sprites(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri_type); /** TC0080VCO **/ @@ -201,7 +201,7 @@ WRITE16_DEVICE_HANDLER( tc0080vco_word_w ); void tc0080vco_tilemap_update(device_t *device); -void tc0080vco_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority); +void tc0080vco_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority); READ16_DEVICE_HANDLER( tc0080vco_cram_0_r ); READ16_DEVICE_HANDLER( tc0080vco_cram_1_r ); @@ -239,7 +239,7 @@ WRITE32_DEVICE_HANDLER( tc0100scn_ctrl_long_w ); void tc0100scn_tilemap_update(device_t *device); -int tc0100scn_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority); +int tc0100scn_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority); /* returns 0 or 1 depending on the lowest priority tilemap set in the internal register. Use this function to draw tilemaps in the correct order. */ @@ -251,13 +251,13 @@ WRITE16_DEVICE_HANDLER( tc0280grd_word_w ); WRITE16_DEVICE_HANDLER( tc0280grd_ctrl_word_w ); void tc0280grd_tilemap_update(device_t *device, int base_color); -void tc0280grd_zoom_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int xoffset, int yoffset, UINT32 priority); +void tc0280grd_zoom_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset, int yoffset, UINT32 priority); READ16_DEVICE_HANDLER( tc0430grw_word_r ); WRITE16_DEVICE_HANDLER( tc0430grw_word_w ); WRITE16_DEVICE_HANDLER( tc0430grw_ctrl_word_w ); void tc0430grw_tilemap_update(device_t *device, int base_color); -void tc0430grw_zoom_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int xoffset, int yoffset, UINT32 priority); +void tc0430grw_zoom_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffset, int yoffset, UINT32 priority); /** TC0360PRI **/ @@ -282,7 +282,7 @@ WRITE32_DEVICE_HANDLER( tc0480scp_ctrl_long_w ); void tc0480scp_tilemap_update(device_t *device); -void tc0480scp_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority); +void tc0480scp_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority); /* Returns the priority order of the bg tilemaps set in the internal register. The order in which the four layers should be drawn is @@ -296,7 +296,7 @@ /** TC0150ROD **/ READ16_DEVICE_HANDLER( tc0150rod_word_r ); WRITE16_DEVICE_HANDLER( tc0150rod_word_w ); -void tc0150rod_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int y_offs, int palette_offs, int type, int road_trans, UINT32 low_priority, UINT32 high_priority); +void tc0150rod_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs, int palette_offs, int type, int road_trans, UINT32 low_priority, UINT32 high_priority); /** TC0110PCR **/ @@ -317,4 +317,4 @@ WRITE16_DEVICE_HANDLER( tc0180vcu_scroll_w ); READ16_DEVICE_HANDLER( tc0180vcu_word_r ); WRITE16_DEVICE_HANDLER( tc0180vcu_word_w ); -void tc0180vcu_tilemap_draw(device_t *device, bitmap_t *bitmap, const rectangle *cliprect, int tmap_num, int plane); +void tc0180vcu_tilemap_draw(device_t *device, bitmap_ind16 &bitmap, const rectangle &cliprect, int tmap_num, int plane); diff -Nru mame-0.144/src/mame/video/taitojc.c mame-0.145/src/mame/video/taitojc.c --- mame-0.144/src/mame/video/taitojc.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/taitojc.c 2012-02-06 21:30:31.000000000 +0000 @@ -5,7 +5,7 @@ typedef struct _poly_extra_data poly_extra_data; struct _poly_extra_data { - bitmap_t *zbuffer; + bitmap_ind16 *zbuffer; UINT8 *texture; int tex_base_x; @@ -58,7 +58,7 @@ taitojc_state *state = space->machine().driver_data(); COMBINE_DATA(state->m_tile_ram + offset); - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } WRITE32_HANDLER(taitojc_char_w) @@ -97,7 +97,7 @@ */ -static void draw_object(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 w1, UINT32 w2, UINT8 bank_type) +static void draw_object(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT32 w1, UINT32 w2, UINT8 bank_type) { taitojc_state *state = machine.driver_data(); int x, y, width, height, palette; @@ -151,7 +151,7 @@ y2 = y + height; // trivial rejection - if (x1 > cliprect->max_x || x2 < cliprect->min_x || y1 > cliprect->max_y || y2 < cliprect->min_y) + if (x1 > cliprect.max_x || x2 < cliprect.min_x || y1 > cliprect.max_y || y2 < cliprect.min_y) { return; } @@ -162,23 +162,23 @@ iy = 0; // clip - if (x1 < cliprect->min_x) + if (x1 < cliprect.min_x) { - ix = abs(cliprect->min_x - x1); - x1 = cliprect->min_x; + ix = abs(cliprect.min_x - x1); + x1 = cliprect.min_x; } - if (x2 > cliprect->max_x) + if (x2 > cliprect.max_x) { - x2 = cliprect->max_x; + x2 = cliprect.max_x; } - if (y1 < cliprect->min_y) + if (y1 < cliprect.min_y) { - iy = abs(cliprect->min_y - y1); - y1 = cliprect->min_y; + iy = abs(cliprect.min_y - y1); + y1 = cliprect.min_y; } - if (y2 > cliprect->max_y) + if (y2 > cliprect.max_y) { - y2 = cliprect->max_y; + y2 = cliprect.max_y; } /* this bit seems to set up border at left/right of screen (reads at 0xffc00) */ @@ -192,7 +192,7 @@ for (j=y1; j < y2; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); for (i=x1; i < x2; i++) { @@ -208,7 +208,7 @@ { for (j=y1; j < y2; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); int index = (iy * (width / 2)) + ix; for (i=x1; i < x2; i+=2) @@ -232,7 +232,7 @@ { for (j=y1; j < y2; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); int index = (iy * width) + ix; for (i=x1; i < x2; i++) @@ -261,7 +261,6 @@ VIDEO_START( taitojc ) { taitojc_state *state = machine.driver_data(); - int width, height; state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(taitojc_exit), &machine)); @@ -275,7 +274,7 @@ state->m_tilemap = tilemap_create(machine, taitojc_tile_info, tilemap_scan_rows, 16, 16, 64, 64); - tilemap_set_transparent_pen(state->m_tilemap, 0); + state->m_tilemap->set_transparent_pen(0); state->m_char_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4); state->m_tile_ram = auto_alloc_array_clear(machine, UINT32, 0x4000/4); @@ -285,14 +284,11 @@ state->m_texture = auto_alloc_array(machine, UINT8, 0x400000); - state->m_framebuffer = machine.primary_screen->alloc_compatible_bitmap(); - - width = machine.primary_screen->width(); - height = machine.primary_screen->height(); - state->m_zbuffer = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_framebuffer); + machine.primary_screen->register_screen_bitmap(state->m_zbuffer); } -static void draw_object_bank(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 bank_type, UINT8 pri) +static void draw_object_bank(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 bank_type, UINT8 pri) { taitojc_state *state = machine.driver_data(); UINT16 start_offs; @@ -319,26 +315,26 @@ } //static int tick = 0; -SCREEN_UPDATE( taitojc ) +SCREEN_UPDATE_IND16( taitojc ) { - taitojc_state *state = screen->machine().driver_data(); + taitojc_state *state = screen.machine().driver_data(); #if 0 tick++; if( tick >= 5 ) { tick = 0; - if( screen->machine().input().code_pressed(KEYCODE_O) ) + if( screen.machine().input().code_pressed(KEYCODE_O) ) debug_tex_pal++; - if( screen->machine().input().code_pressed(KEYCODE_I) ) + if( screen.machine().input().code_pressed(KEYCODE_I) ) debug_tex_pal--; debug_tex_pal &= 0x7f; } #endif - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); /* 0xf000 used on Densha de Go disclaimer screen(s) (disable object RAM?) */ if((state->m_objlist[0xfc4/4] & 0x0000ffff) != 0x0000 && (state->m_objlist[0xfc4/4] & 0x0000ffff) != 0x2000 && (state->m_objlist[0xfc4/4] & 0x0000ffff) != 0xf000 ) @@ -346,28 +342,28 @@ //popmessage("%08x %08x %08x %08x",state->m_objlist[0xd20/4],state->m_objlist[0xd24/4],state->m_objlist[0xd28/4],state->m_objlist[0xd2c/4]); - draw_object_bank(screen->machine(), bitmap, cliprect, 0, 0); - draw_object_bank(screen->machine(), bitmap, cliprect, 1, 0); - draw_object_bank(screen->machine(), bitmap, cliprect, 2, 0); + draw_object_bank(screen.machine(), bitmap, cliprect, 0, 0); + draw_object_bank(screen.machine(), bitmap, cliprect, 1, 0); + draw_object_bank(screen.machine(), bitmap, cliprect, 2, 0); copybitmap_trans(bitmap, state->m_framebuffer, 0, 0, 0, 0, cliprect, 0); - draw_object_bank(screen->machine(), bitmap, cliprect, 0, 1); - draw_object_bank(screen->machine(), bitmap, cliprect, 1, 1); - draw_object_bank(screen->machine(), bitmap, cliprect, 2, 1); + draw_object_bank(screen.machine(), bitmap, cliprect, 0, 1); + draw_object_bank(screen.machine(), bitmap, cliprect, 1, 1); + draw_object_bank(screen.machine(), bitmap, cliprect, 2, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0,0); + state->m_tilemap->draw(bitmap, cliprect, 0,0); #if 0 if (debug_tex_pal > 0) { int j; - for (j=cliprect->min_y; j <= cliprect->max_y; j++) + for (j=cliprect.min_y; j <= cliprect.max_y; j++) { - UINT16 *d = BITMAP_ADDR16(bitmap, j, 0); + UINT16 *d = &bitmap.pix16(j); int index = 2048 * j; - for (i=cliprect->min_x; i <= cliprect->max_x; i++) + for (i=cliprect.min_x; i <= cliprect.max_x; i++) { UINT8 t = state->m_texture[index+i]; UINT32 color; @@ -396,12 +392,12 @@ static void render_solid_scan(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; float z = extent->param[0].start; int color = extent->param[1].start; float dz = extent->param[0].dpdx; - UINT16 *fb = BITMAP_ADDR16(destmap, scanline, 0); - UINT16 *zb;// = BITMAP_ADDR16(extra->zbuffer, scanline, 0); + UINT16 *fb = &destmap->pix16(scanline); + UINT16 *zb;// = &extra->zbuffer->pix16(scanline); int x; // avoid crash in dendego2 @@ -410,7 +406,7 @@ // return; //} - zb = BITMAP_ADDR16(extra->zbuffer, scanline, 0); + zb = &extra->zbuffer->pix16(scanline); for (x = extent->startx; x < extent->stopx; x++) { @@ -429,12 +425,12 @@ static void render_shade_scan(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; float z = extent->param[0].start; float color = extent->param[1].start; float dz = extent->param[0].dpdx; float dcolor = extent->param[1].dpdx; - UINT16 *fb = BITMAP_ADDR16(destmap, scanline, 0); + UINT16 *fb = &destmap->pix16(scanline); UINT16 *zb; int x; @@ -444,7 +440,7 @@ // return; //} - zb = BITMAP_ADDR16(extra->zbuffer, scanline, 0); + zb = &extra->zbuffer->pix16(scanline); for (x = extent->startx; x < extent->stopx; x++) { @@ -465,7 +461,7 @@ static void render_texture_scan(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - bitmap_t *destmap = (bitmap_t *)dest; + bitmap_ind16 *destmap = (bitmap_ind16 *)dest; float z = extent->param[0].start; float u = extent->param[1].start; float v = extent->param[2].start; @@ -474,8 +470,8 @@ float du = extent->param[1].dpdx; float dv = extent->param[2].dpdx; float dcolor = extent->param[3].dpdx; - UINT16 *fb = BITMAP_ADDR16(destmap, scanline, 0); - UINT16 *zb = BITMAP_ADDR16(extra->zbuffer, scanline, 0); + UINT16 *fb = &destmap->pix16(scanline); + UINT16 *zb = &extra->zbuffer->pix16(scanline); int tex_wrap_x = extra->tex_wrap_x; int tex_wrap_y = extra->tex_wrap_y; int tex_base_x = extra->tex_base_x; @@ -573,7 +569,7 @@ texbase = polygon_fifo[ptr++]; - extra->zbuffer = state->m_zbuffer; + extra->zbuffer = &state->m_zbuffer; extra->texture = state->m_texture; extra->tex_base_x = ((texbase >> 0) & 0xff) << 4; extra->tex_base_y = ((texbase >> 8) & 0xff) << 4; @@ -593,7 +589,7 @@ if (vert[0].p[0] < 0x8000 && vert[1].p[0] < 0x8000 && vert[2].p[0] < 0x8000) { - poly_render_triangle(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_texture_scan, 4, &vert[0], &vert[1], &vert[2]); + poly_render_triangle(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_texture_scan, 4, &vert[0], &vert[1], &vert[2]); } break; } @@ -627,7 +623,7 @@ */ poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); - extra->zbuffer = state->m_zbuffer; + extra->zbuffer = &state->m_zbuffer; for (i=0; i < 4; i++) { @@ -644,11 +640,11 @@ vert[2].p[1] == vert[3].p[1]) { // optimization: all colours the same -> render solid - poly_render_quad(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_solid_scan, 2, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_quad(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_solid_scan, 2, &vert[0], &vert[1], &vert[2], &vert[3]); } else { - poly_render_quad(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_shade_scan, 2, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_quad(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_shade_scan, 2, &vert[0], &vert[1], &vert[2], &vert[3]); } } break; @@ -696,7 +692,7 @@ texbase = polygon_fifo[ptr++]; - extra->zbuffer = state->m_zbuffer; + extra->zbuffer = &state->m_zbuffer; extra->texture = state->m_texture; extra->tex_base_x = ((texbase >> 0) & 0xff) << 4; extra->tex_base_y = ((texbase >> 8) & 0xff) << 4; @@ -716,7 +712,7 @@ if (vert[0].p[0] < 0x8000 && vert[1].p[0] < 0x8000 && vert[2].p[0] < 0x8000 && vert[3].p[0] < 0x8000) { - poly_render_quad(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_texture_scan, 4, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_quad(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_texture_scan, 4, &vert[0], &vert[1], &vert[2], &vert[3]); } break; } @@ -749,7 +745,7 @@ { poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(state->m_poly); - extra->zbuffer = state->m_zbuffer; + extra->zbuffer = &state->m_zbuffer; for (i=0; i < 3; i++) { @@ -765,11 +761,11 @@ vert[1].p[1] == vert[2].p[1]) { // optimization: all colours the same -> render solid - poly_render_triangle(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_solid_scan, 2, &vert[0], &vert[1], &vert[2]); + poly_render_triangle(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_solid_scan, 2, &vert[0], &vert[1], &vert[2]); } else { - poly_render_triangle(state->m_poly, state->m_framebuffer, &machine.primary_screen->visible_area(), render_shade_scan, 2, &vert[0], &vert[1], &vert[2]); + poly_render_triangle(state->m_poly, &state->m_framebuffer, machine.primary_screen->visible_area(), render_shade_scan, 2, &vert[0], &vert[1], &vert[2]); } } break; @@ -794,6 +790,6 @@ cliprect.max_x = machine.primary_screen->width() - 1; cliprect.max_y = machine.primary_screen->height() - 1; - bitmap_fill(state->m_framebuffer, &cliprect, 0); - bitmap_fill(state->m_zbuffer, &cliprect, 0xffff); + state->m_framebuffer.fill(0, cliprect); + state->m_zbuffer.fill(0xffff, cliprect); } diff -Nru mame-0.144/src/mame/video/taito_l.c mame-0.145/src/mame/video/taito_l.c --- mame-0.144/src/mame/video/taito_l.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taito_l.c 2012-02-06 21:30:31.000000000 +0000 @@ -69,15 +69,15 @@ state->m_bg19_tilemap = tilemap_create(machine, get_bg19_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->m_ch1a_tilemap = tilemap_create(machine, get_ch1a_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_bg18_tilemap, 0); - tilemap_set_transparent_pen(state->m_ch1a_tilemap, 0); + state->m_bg18_tilemap->set_transparent_pen(0); + state->m_ch1a_tilemap->set_transparent_pen(0); for (i = 0; i < 256; i++) palette_set_color(machine, i, MAKE_RGB(0, 0, 0)); - tilemap_set_scrolldx(state->m_ch1a_tilemap, -8, -8); - tilemap_set_scrolldx(state->m_bg18_tilemap, 28, -11); - tilemap_set_scrolldx(state->m_bg19_tilemap, 38, -21); + state->m_ch1a_tilemap->set_scrolldx(-8, -8); + state->m_bg18_tilemap->set_scrolldx(28, -11); + state->m_bg19_tilemap->set_scrolldx(38, -21); } @@ -96,8 +96,8 @@ { state->m_horshoes_gfxbank = data; - tilemap_mark_all_tiles_dirty(state->m_bg18_tilemap); - tilemap_mark_all_tiles_dirty(state->m_bg19_tilemap); + state->m_bg18_tilemap->mark_all_dirty(); + state->m_bg19_tilemap->mark_all_dirty(); } } @@ -110,8 +110,8 @@ state->m_bankc[offset] = data; // logerror("Bankc %d, %02x (%04x)\n", offset, data, cpu_get_pc(&space->device())); - tilemap_mark_all_tiles_dirty(state->m_bg18_tilemap); - tilemap_mark_all_tiles_dirty(state->m_bg19_tilemap); + state->m_bg18_tilemap->mark_all_dirty(); + state->m_bg19_tilemap->mark_all_dirty(); } } @@ -139,7 +139,7 @@ /* bit 4 flip screen */ state->m_flipscreen = data & 0x10; - tilemap_set_flip_all(space->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + space->machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* bit 5 display enable - handled in vh_screenrefresh() */ } @@ -195,19 +195,19 @@ void taitol_bg18_m( running_machine &machine, int offset ) { taitol_state *state = machine.driver_data(); - tilemap_mark_tile_dirty(state->m_bg18_tilemap, offset / 2); + state->m_bg18_tilemap->mark_tile_dirty(offset / 2); } void taitol_bg19_m( running_machine &machine, int offset ) { taitol_state *state = machine.driver_data(); - tilemap_mark_tile_dirty(state->m_bg19_tilemap, offset / 2); + state->m_bg19_tilemap->mark_tile_dirty(offset / 2); } void taitol_char1a_m( running_machine &machine, int offset ) { taitol_state *state = machine.driver_data(); - tilemap_mark_tile_dirty(state->m_ch1a_tilemap, offset / 2); + state->m_ch1a_tilemap->mark_tile_dirty(offset / 2); } void taitol_obj1b_m( running_machine &machine, int offset ) @@ -243,7 +243,7 @@ plgirs2 bullets and raimais big bosses. */ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { taitol_state *state = machine.driver_data(); int offs; @@ -284,9 +284,9 @@ } -SCREEN_UPDATE( taitol ) +SCREEN_UPDATE_IND16( taitol ) { - taitol_state *state = screen->machine().driver_data(); + taitol_state *state = screen.machine().driver_data(); int dx, dy; dx = state->m_rambanks[0xb3f4] | (state->m_rambanks[0xb3f5] << 8); @@ -294,43 +294,47 @@ dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; dy = state->m_rambanks[0xb3f6]; - tilemap_set_scrollx(state->m_bg18_tilemap, 0, -dx); - tilemap_set_scrolly(state->m_bg18_tilemap, 0, -dy); + state->m_bg18_tilemap->set_scrollx(0, -dx); + state->m_bg18_tilemap->set_scrolly(0, -dy); dx = state->m_rambanks[0xb3fc] | (state->m_rambanks[0xb3fd] << 8); if (state->m_flipscreen) dx = ((dx & 0xfffc) | ((dx - 3) & 0x0003)) ^ 0xf; dy = state->m_rambanks[0xb3fe]; - tilemap_set_scrollx(state->m_bg19_tilemap, 0, -dx); - tilemap_set_scrolly(state->m_bg19_tilemap, 0, -dy); + state->m_bg19_tilemap->set_scrollx(0, -dx); + state->m_bg19_tilemap->set_scrolly(0, -dy); if (state->m_cur_ctrl & 0x20) /* display enable */ { - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg19_tilemap, 0, 0); + state->m_bg19_tilemap->draw(bitmap, cliprect, 0, 0); if (state->m_cur_ctrl & 0x08) /* sprites always over BG1 */ - tilemap_draw(bitmap, cliprect, state->m_bg18_tilemap, 0, 0); + state->m_bg18_tilemap->draw(bitmap, cliprect, 0, 0); else /* split priority */ - tilemap_draw(bitmap, cliprect, state->m_bg18_tilemap,0,1); + state->m_bg18_tilemap->draw(bitmap, cliprect, 0,1); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_ch1a_tilemap, 0, 0); + state->m_ch1a_tilemap->draw(bitmap, cliprect, 0, 0); } else - bitmap_fill(bitmap, cliprect, screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); return 0; } -SCREEN_EOF( taitol ) +SCREEN_VBLANK( taitol ) { - taitol_state *state = machine.driver_data(); - UINT8 *spriteram = state->m_rambanks + 0xb000; + // rising edge + if (vblank_on) + { + taitol_state *state = screen.machine().driver_data(); + UINT8 *spriteram = state->m_rambanks + 0xb000; - memcpy(state->m_buff_spriteram, spriteram, TAITOL_SPRITERAM_SIZE); + memcpy(state->m_buff_spriteram, spriteram, TAITOL_SPRITERAM_SIZE); + } } diff -Nru mame-0.144/src/mame/video/taito_o.c mame-0.145/src/mame/video/taito_o.c --- mame-0.144/src/mame/video/taito_o.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taito_o.c 2012-02-06 21:30:31.000000000 +0000 @@ -25,7 +25,7 @@ }; -static void parentj_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void parentj_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { /* Y chain size is 16/32?/64/64? pixels. X chain size is always 64 pixels. */ @@ -138,18 +138,18 @@ } -SCREEN_UPDATE( parentj ) +SCREEN_UPDATE_IND16( parentj ) { - taitoo_state *state = screen->machine().driver_data(); + taitoo_state *state = screen.machine().driver_data(); tc0080vco_tilemap_update(state->m_tc0080vco); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0); - parentj_draw_sprites(screen->machine(), bitmap, cliprect, 0); - parentj_draw_sprites(screen->machine(), bitmap, cliprect, 1); + parentj_draw_sprites(screen.machine(), bitmap, cliprect, 0); + parentj_draw_sprites(screen.machine(), bitmap, cliprect, 1); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 1, 0, 0); tc0080vco_tilemap_draw(state->m_tc0080vco, bitmap, cliprect, 2, 0, 0); diff -Nru mame-0.144/src/mame/video/taitosj.c mame-0.145/src/mame/video/taitosj.c --- mame-0.144/src/mame/video/taitosj.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/taitosj.c 2012-02-06 21:30:31.000000000 +0000 @@ -21,8 +21,8 @@ static const int layer_enable_mask[3] = { 0x10, 0x20, 0x40 }; -typedef void (*copy_layer_func_t)(running_machine &, bitmap_t *, - const rectangle *, int, int *, rectangle *); +typedef void (*copy_layer_func_t)(running_machine &, bitmap_ind16 &, + const rectangle &, int, int *, rectangle *); /*************************************************************************** @@ -176,16 +176,16 @@ taitosj_state *state = machine.driver_data(); int i; - state->m_sprite_layer_collbitmap1 = auto_bitmap_alloc(machine,16,16,machine.primary_screen->format()); + state->m_sprite_layer_collbitmap1.allocate(16,16); for (i = 0; i < 3; i++) { - state->m_layer_bitmap[i] = machine.primary_screen->alloc_compatible_bitmap(); - state->m_sprite_layer_collbitmap2[i] = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_layer_bitmap[i]); + machine.primary_screen->register_screen_bitmap(state->m_sprite_layer_collbitmap2[i]); } - state->m_sprite_sprite_collbitmap1 = auto_bitmap_alloc(machine,32,32,machine.primary_screen->format()); - state->m_sprite_sprite_collbitmap2 = auto_bitmap_alloc(machine,32,32,machine.primary_screen->format()); + state->m_sprite_sprite_collbitmap1.allocate(32,32); + state->m_sprite_sprite_collbitmap2.allocate(32,32); gfx_element_set_source(machine.gfx[0], state->m_characterram); gfx_element_set_source(machine.gfx[1], state->m_characterram); @@ -313,16 +313,16 @@ } /* draw the sprites into separate bitmaps and check overlapping region */ - bitmap_fill(state->m_sprite_layer_collbitmap1, NULL, TRANSPARENT_PEN); - drawgfx_transpen(state->m_sprite_sprite_collbitmap1, 0, get_sprite_gfx_element(machine, which1), + state->m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); + drawgfx_transpen(state->m_sprite_sprite_collbitmap1, state->m_sprite_sprite_collbitmap1.cliprect(), get_sprite_gfx_element(machine, which1), state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 3] & 0x3f, 0, state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x01, state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs1 + 2] & 0x02, sx1, sy1, 0); - bitmap_fill(state->m_sprite_sprite_collbitmap2, NULL, TRANSPARENT_PEN); - drawgfx_transpen(state->m_sprite_sprite_collbitmap2, 0, get_sprite_gfx_element(machine, which2), + state->m_sprite_sprite_collbitmap2.fill(TRANSPARENT_PEN); + drawgfx_transpen(state->m_sprite_sprite_collbitmap2, state->m_sprite_sprite_collbitmap2.cliprect(), get_sprite_gfx_element(machine, which2), state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 3] & 0x3f, 0, state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs2 + 2] & 0x01, @@ -331,8 +331,8 @@ for (y = miny; y < maxy; y++) for (x = minx; x < maxx; x++) - if ((*BITMAP_ADDR16(state->m_sprite_sprite_collbitmap1, y, x) != TRANSPARENT_PEN) && - (*BITMAP_ADDR16(state->m_sprite_sprite_collbitmap2, y, x) != TRANSPARENT_PEN)) + if ((state->m_sprite_sprite_collbitmap1.pix16(y, x) != TRANSPARENT_PEN) && + (state->m_sprite_sprite_collbitmap2.pix16(y, x) != TRANSPARENT_PEN)) return 1; /* collided */ return 0; @@ -470,8 +470,8 @@ int flip_y = (state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 2] & 0x02) ^ GLOBAL_FLIP_Y; /* draw sprite into a bitmap and check if layers collide */ - bitmap_fill(state->m_sprite_layer_collbitmap1, NULL, TRANSPARENT_PEN); - drawgfx_transpen(state->m_sprite_layer_collbitmap1, 0,get_sprite_gfx_element(machine, which), + state->m_sprite_layer_collbitmap1.fill(TRANSPARENT_PEN); + drawgfx_transpen(state->m_sprite_layer_collbitmap1, state->m_sprite_layer_collbitmap1.cliprect(),get_sprite_gfx_element(machine, which), state->m_spriteram[SPRITE_RAM_PAGE_OFFSET + offs + 3] & 0x3f, 0, flip_x, flip_y, @@ -479,15 +479,15 @@ for (y = miny; y < maxy; y++) for (x = minx; x < maxx; x++) - if (*BITMAP_ADDR16(state->m_sprite_layer_collbitmap1, y - miny, x - minx) != TRANSPARENT_PEN) /* is there anything to check for ? */ + if (state->m_sprite_layer_collbitmap1.pix16(y - miny, x - minx) != TRANSPARENT_PEN) /* is there anything to check for ? */ { - if (check_layer_1 && (*BITMAP_ADDR16(state->m_sprite_layer_collbitmap2[0], y, x) != TRANSPARENT_PEN)) + if (check_layer_1 && (state->m_sprite_layer_collbitmap2[0].pix16(y, x) != TRANSPARENT_PEN)) result |= 0x01; /* collided with layer 1 */ - if (check_layer_2 && (*BITMAP_ADDR16(state->m_sprite_layer_collbitmap2[1], y, x) != TRANSPARENT_PEN)) + if (check_layer_2 && (state->m_sprite_layer_collbitmap2[1].pix16(y, x) != TRANSPARENT_PEN)) result |= 0x02; /* collided with layer 2 */ - if (check_layer_3 && (*BITMAP_ADDR16(state->m_sprite_layer_collbitmap2[2], y, x) != TRANSPARENT_PEN)) + if (check_layer_3 && (state->m_sprite_layer_collbitmap2[2].pix16(y, x) != TRANSPARENT_PEN)) result |= 0x04; /* collided with layer 3 */ } @@ -519,9 +519,9 @@ taitosj_state *state = machine.driver_data(); offs_t offs; - bitmap_fill(state->m_layer_bitmap[0], NULL, TRANSPARENT_PEN); - bitmap_fill(state->m_layer_bitmap[1], NULL, TRANSPARENT_PEN); - bitmap_fill(state->m_layer_bitmap[2], NULL, TRANSPARENT_PEN); + state->m_layer_bitmap[0].fill(TRANSPARENT_PEN); + state->m_layer_bitmap[1].fill(TRANSPARENT_PEN); + state->m_layer_bitmap[2].fill(TRANSPARENT_PEN); for (offs = 0; offs < 0x0400; offs++) { @@ -531,19 +531,19 @@ if (GLOBAL_FLIP_X) sx = 31 - sx; if (GLOBAL_FLIP_Y) sy = 31 - sy; - drawgfx_transpen(state->m_layer_bitmap[0],0,machine.gfx[state->m_colorbank[0] & 0x08 ? 2 : 0], + drawgfx_transpen(state->m_layer_bitmap[0],state->m_layer_bitmap[0].cliprect(),machine.gfx[state->m_colorbank[0] & 0x08 ? 2 : 0], state->m_videoram_1[offs], state->m_colorbank[0] & 0x07, GLOBAL_FLIP_X,GLOBAL_FLIP_Y, 8*sx,8*sy,0); - drawgfx_transpen(state->m_layer_bitmap[1],0,machine.gfx[state->m_colorbank[0] & 0x80 ? 2 : 0], + drawgfx_transpen(state->m_layer_bitmap[1],state->m_layer_bitmap[1].cliprect(),machine.gfx[state->m_colorbank[0] & 0x80 ? 2 : 0], state->m_videoram_2[offs], (state->m_colorbank[0] >> 4) & 0x07, GLOBAL_FLIP_X,GLOBAL_FLIP_Y, 8*sx,8*sy,0); - drawgfx_transpen(state->m_layer_bitmap[2],0,machine.gfx[state->m_colorbank[1] & 0x08 ? 2 : 0], + drawgfx_transpen(state->m_layer_bitmap[2],state->m_layer_bitmap[2].cliprect(),machine.gfx[state->m_colorbank[1] & 0x08 ? 2 : 0], state->m_videoram_3[offs], state->m_colorbank[1] & 0x07, GLOBAL_FLIP_X,GLOBAL_FLIP_Y, @@ -552,7 +552,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap) { taitosj_state *state = machine.driver_data(); /* @@ -561,16 +561,8 @@ Note that the clipping is asymmetrical. This matches the real thing. I'm not sure of what should happen when the screen is flipped, though. */ - static const rectangle spritevisiblearea = - { - 0*8+3, 32*8-1-1, - 2*8, 30*8-1 - }; - static const rectangle spritevisibleareaflip = - { - 0*8+1, 32*8-3-1, - 2*8, 30*8-1 - }; + const rectangle spritevisiblearea(0*8+3, 32*8-1-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflip(0*8+1, 32*8-3-1, 2*8, 30*8-1); if (SPRITES_ON) { @@ -605,11 +597,11 @@ flip_y = !flip_y; } - drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? &spritevisibleareaflip : &spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, + drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, flip_x, flip_y, sx, sy,0); /* draw with wrap around. The horizontal games (eg. sfposeid) need this */ - drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? &spritevisibleareaflip : &spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, + drawgfx_transpen(bitmap, GLOBAL_FLIP_X ? spritevisibleareaflip : spritevisiblearea,get_sprite_gfx_element(machine, which), code, color, flip_x, flip_y, sx - 0x100, sy,0); } } @@ -617,7 +609,7 @@ } -static void taitosj_copy_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void taitosj_copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int *sprites_on, rectangle *sprite_areas) { taitosj_state *state = machine.driver_data(); @@ -650,13 +642,13 @@ if ((i >= 0x10) && (i <= 0x17)) continue; /* no sprites here */ if (sprites_on[i]) - copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 1, &scrollx, 32, scrolly, &sprite_areas[i]); + copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 1, &scrollx, 32, scrolly, sprite_areas[i]); } } } -static void kikstart_copy_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void kikstart_copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int *sprites_on, rectangle *sprite_areas) { taitosj_state *state = machine.driver_data(); @@ -689,13 +681,13 @@ if ((i >= 0x10) && (i <= 0x17)) continue; /* no sprites here */ if (sprites_on[i]) - copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, &sprite_areas[i]); + copyscrollbitmap(state->m_sprite_layer_collbitmap2[which], state->m_layer_bitmap[which], 32 * 8, scrollx, 1, &scrolly, sprite_areas[i]); } } } -static void copy_layer(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void copy_layer(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, copy_layer_func_t copy_layer_func, int which, int *sprites_on, rectangle *sprite_areas) { if (which == 0) @@ -705,14 +697,14 @@ } -static void copy_layers(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, +static void copy_layers(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, copy_layer_func_t copy_layer_func, int *sprites_on, rectangle *sprite_areas) { taitosj_state *state = machine.driver_data(); int i = 0; /* fill the screen with the background color */ - bitmap_fill(bitmap, cliprect, 8 * (state->m_colorbank[1] & 0x07)); + bitmap.fill(8 * (state->m_colorbank[1] & 0x07), cliprect); for (i = 0; i < 4; i++) { @@ -733,8 +725,8 @@ } -static int video_update_common(running_machine &machine, bitmap_t *bitmap, - const rectangle *cliprect, copy_layer_func_t copy_layer_func) +static int video_update_common(running_machine &machine, bitmap_ind16 &bitmap, + const rectangle &cliprect, copy_layer_func_t copy_layer_func) { int sprites_on[0x20]; /* 1 if sprite is active */ rectangle sprite_areas[0x20]; /* areas on bitmap (sprite locations) */ @@ -754,13 +746,13 @@ } -SCREEN_UPDATE( taitosj ) +SCREEN_UPDATE_IND16( taitosj ) { - return video_update_common(screen->machine(), bitmap, cliprect, taitosj_copy_layer); + return video_update_common(screen.machine(), bitmap, cliprect, taitosj_copy_layer); } -SCREEN_UPDATE( kikstart ) +SCREEN_UPDATE_IND16( kikstart ) { - return video_update_common(screen->machine(), bitmap, cliprect, kikstart_copy_layer); + return video_update_common(screen.machine(), bitmap, cliprect, kikstart_copy_layer); } diff -Nru mame-0.144/src/mame/video/taito_z.c mame-0.145/src/mame/video/taito_z.c --- mame-0.144/src/mame/video/taito_z.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/taito_z.c 2012-02-06 21:30:31.000000000 +0000 @@ -146,7 +146,7 @@ ********************************************************/ -static void contcirc_draw_sprites_16x8( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void contcirc_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -241,7 +241,7 @@ -static void chasehq_draw_sprites_16x16( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void chasehq_draw_sprites_16x16( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -427,7 +427,7 @@ -static void bshark_draw_sprites_16x8( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void bshark_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -523,7 +523,7 @@ -static void sci_draw_sprites_16x8( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void sci_draw_sprites_16x8( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -628,7 +628,7 @@ -static void aquajack_draw_sprites_16x8(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int y_offs) +static void aquajack_draw_sprites_16x8(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -723,7 +723,7 @@ -static void spacegun_draw_sprites_16x8(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,int y_offs) +static void spacegun_draw_sprites_16x8(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,int y_offs) { taitoz_state *state = machine.driver_data(); UINT16 *spritemap = (UINT16 *)machine.region("user1")->base(); @@ -842,9 +842,9 @@ } -SCREEN_UPDATE( contcirc ) +SCREEN_UPDATE_IND16( contcirc ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -853,25 +853,25 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], 0, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -3, state->m_road_palbank << 6, 1, 0, 1, 2); // -6 tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - contcirc_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 5); // 7 + contcirc_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 5); // 7 return 0; } /* Nightstr and ChaseHQ */ -SCREEN_UPDATE( chasehq ) +SCREEN_UPDATE_IND16( chasehq ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -880,24 +880,24 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - chasehq_draw_sprites_16x16(screen->machine(), bitmap, cliprect, 7); + chasehq_draw_sprites_16x16(screen.machine(), bitmap, cliprect, 7); return 0; } -SCREEN_UPDATE( bshark ) +SCREEN_UPDATE_IND16( bshark ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -906,24 +906,24 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 1, 1, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - bshark_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 8); + bshark_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 8); return 0; } -SCREEN_UPDATE( sci ) +SCREEN_UPDATE_IND16( sci ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -932,24 +932,24 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - sci_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 6); + sci_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 6); return 0; } -SCREEN_UPDATE( aquajack ) +SCREEN_UPDATE_IND16( aquajack ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -958,24 +958,24 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -1, 0, 2, 1, 1, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - aquajack_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 3); + aquajack_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 3); return 0; } -SCREEN_UPDATE( spacegun ) +SCREEN_UPDATE_IND16( spacegun ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[3]; tc0100scn_tilemap_update(state->m_tc0100scn); @@ -984,24 +984,24 @@ layer[1] = layer[0] ^ 1; layer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked even when bottom layer not drawn due to disable bit */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[1], 0, 2); tc0100scn_tilemap_draw(state->m_tc0100scn, bitmap, cliprect, layer[2], 0, 4); - spacegun_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 4); + spacegun_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 4); return 0; } -SCREEN_UPDATE( dblaxle ) +SCREEN_UPDATE_IND16( dblaxle ) { - taitoz_state *state = screen->machine().driver_data(); + taitoz_state *state = screen.machine().driver_data(); UINT8 layer[5]; UINT16 priority; @@ -1015,17 +1015,17 @@ layer[3] = (priority & 0x000f) >> 0; /* tells us which is top */ layer[4] = 4; /* text layer always over bg layers */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* Ensure screen blanked - this shouldn't be necessary! */ - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 0); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[1], 0, 0); tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[2], 0, 1); tc0150rod_draw(state->m_tc0150rod, bitmap, cliprect, -1, 0xc0, 0, 0, 1, 2); - bshark_draw_sprites_16x8(screen->machine(), bitmap, cliprect, 7); + bshark_draw_sprites_16x8(screen.machine(), bitmap, cliprect, 7); /* This layer used for the big numeric displays */ tc0480scp_tilemap_draw(state->m_tc0480scp, bitmap, cliprect, layer[3], 0, 4); diff -Nru mame-0.144/src/mame/video/tank8.c mame-0.145/src/mame/video/tank8.c --- mame-0.144/src/mame/video/tank8.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tank8.c 2012-02-06 21:30:31.000000000 +0000 @@ -65,7 +65,7 @@ { tank8_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } @@ -104,15 +104,15 @@ VIDEO_START( tank8 ) { tank8_state *state = machine.driver_data(); - state->m_helper1 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper2 = machine.primary_screen->alloc_compatible_bitmap(); - state->m_helper3 = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper1); + machine.primary_screen->register_screen_bitmap(state->m_helper2); + machine.primary_screen->register_screen_bitmap(state->m_helper3); state->m_tilemap = tilemap_create(machine, tank8_get_tile_info, tilemap_scan_rows, 16, 16, 32, 32); /* VBLANK starts on scanline #256 and ends on scanline #24 */ - tilemap_set_scrolly(state->m_tilemap, 0, 2 * 24); + state->m_tilemap->set_scrolly(0, 2 * 24); } @@ -128,7 +128,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tank8_state *state = machine.driver_data(); int i; @@ -151,35 +151,22 @@ } -static void draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tank8_state *state = machine.driver_data(); int i; for (i = 0; i < 8; i++) { - rectangle rect; - int x = get_x_pos(state, 8 + i); int y = get_y_pos(state, 8 + i); x -= 4; /* ? */ - rect.min_x = x; - rect.min_y = y; - rect.max_x = rect.min_x + 3; - rect.max_y = rect.min_y + 4; - - if (rect.min_x < cliprect->min_x) - rect.min_x = cliprect->min_x; - if (rect.min_y < cliprect->min_y) - rect.min_y = cliprect->min_y; - if (rect.max_x > cliprect->max_x) - rect.max_x = cliprect->max_x; - if (rect.max_y > cliprect->max_y) - rect.max_y = cliprect->max_y; + rectangle rect(x, x + 3, y, y + 4); + rect &= cliprect; - bitmap_fill(bitmap, &rect, (i << 1) | 0x01); + bitmap.fill((i << 1) | 0x01, rect); } } @@ -190,103 +177,107 @@ } -SCREEN_UPDATE( tank8 ) +SCREEN_UPDATE_IND16( tank8 ) { - tank8_state *state = screen->machine().driver_data(); - set_pens(state, screen->machine().colortable); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + tank8_state *state = screen.machine().driver_data(); + set_pens(state, screen.machine().colortable); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - draw_bullets(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); + draw_bullets(screen.machine(), bitmap, cliprect); return 0; } -SCREEN_EOF( tank8 ) +SCREEN_VBLANK( tank8 ) { - tank8_state *state = machine.driver_data(); - int x; - int y; - const rectangle &visarea = machine.primary_screen->visible_area(); - - tilemap_draw(state->m_helper1, &visarea, state->m_tilemap, 0, 0); - - bitmap_fill(state->m_helper2, &visarea, 8); - bitmap_fill(state->m_helper3, &visarea, 8); - - draw_sprites(machine, state->m_helper2, &visarea); - draw_bullets(machine, state->m_helper3, &visarea); - - for (y = visarea.min_y; y <= visarea.max_y; y++) + // on falling edge + if (!vblank_on) { - int _state = 0; - - const UINT16* p1 = BITMAP_ADDR16(state->m_helper1, y, 0); - const UINT16* p2 = BITMAP_ADDR16(state->m_helper2, y, 0); - const UINT16* p3 = BITMAP_ADDR16(state->m_helper3, y, 0); - - if (y % 2 != machine.primary_screen->frame_number() % 2) - continue; /* video display is interlaced */ - - for (x = visarea.min_x; x <= visarea.max_x; x++) - { - UINT8 index; - - /* neither wall nor mine */ - if ((p1[x] != 0x11) && (p1[x] != 0x13)) - { - _state = 0; - continue; - } + tank8_state *state = screen.machine().driver_data(); + int x; + int y; + const rectangle &visarea = screen.machine().primary_screen->visible_area(); - /* neither tank nor bullet */ - if ((p2[x] == 8) && (p3[x] == 8)) - { - _state = 0; - continue; - } + state->m_tilemap->draw(state->m_helper1, visarea, 0, 0); - /* bullets cannot hit mines */ - if ((p3[x] != 8) && (p1[x] == 0x13)) - { - _state = 0; - continue; - } + state->m_helper2.fill(8, visarea); + state->m_helper3.fill(8, visarea); - if (_state) - continue; + draw_sprites(screen.machine(), state->m_helper2, visarea); + draw_bullets(screen.machine(), state->m_helper3, visarea); - if (p3[x] != 8) - { - index = ((p3[x] & ~0x01) >> 1) | 0x18; + for (y = visarea.min_y; y <= visarea.max_y; y++) + { + int _state = 0; - if (1) - index |= 0x20; + const UINT16* p1 = &state->m_helper1.pix16(y); + const UINT16* p2 = &state->m_helper2.pix16(y); + const UINT16* p3 = &state->m_helper3.pix16(y); - if (0) - index |= 0x40; + if (y % 2 != screen.machine().primary_screen->frame_number() % 2) + continue; /* video display is interlaced */ - if (1) - index |= 0x80; - } - else + for (x = visarea.min_x; x <= visarea.max_x; x++) { - int sprite_num = (p2[x] & ~0x01) >> 1; - index = sprite_num | 0x10; + UINT8 index; - if (p1[x] == 0x11) - index |= 0x20; + /* neither wall nor mine */ + if ((p1[x] != 0x11) && (p1[x] != 0x13)) + { + _state = 0; + continue; + } + + /* neither tank nor bullet */ + if ((p2[x] == 8) && (p3[x] == 8)) + { + _state = 0; + continue; + } + + /* bullets cannot hit mines */ + if ((p3[x] != 8) && (p1[x] == 0x13)) + { + _state = 0; + continue; + } + + if (_state) + continue; + + if (p3[x] != 8) + { + index = ((p3[x] & ~0x01) >> 1) | 0x18; + + if (1) + index |= 0x20; + + if (0) + index |= 0x40; + + if (1) + index |= 0x80; + } + else + { + int sprite_num = (p2[x] & ~0x01) >> 1; + index = sprite_num | 0x10; + + if (p1[x] == 0x11) + index |= 0x20; + + if (y - get_y_pos(state, sprite_num) >= 8) + index |= 0x40; /* collision on bottom side */ + + if (x - get_x_pos(state, sprite_num) >= 8) + index |= 0x80; /* collision on right side */ + } - if (y - get_y_pos(state, sprite_num) >= 8) - index |= 0x40; /* collision on bottom side */ + screen.machine().scheduler().timer_set(screen.time_until_pos(y, x), FUNC(tank8_collision_callback), index); - if (x - get_x_pos(state, sprite_num) >= 8) - index |= 0x80; /* collision on right side */ + _state = 1; } - - machine.scheduler().timer_set(machine.primary_screen->time_until_pos(y, x), FUNC(tank8_collision_callback), index); - - _state = 1; } } } diff -Nru mame-0.144/src/mame/video/tankbatt.c mame-0.145/src/mame/video/tankbatt.c --- mame-0.144/src/mame/video/tankbatt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tankbatt.c 2012-02-06 21:30:31.000000000 +0000 @@ -63,7 +63,7 @@ tankbatt_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -82,7 +82,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_bullets(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_bullets(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tankbatt_state *state = machine.driver_data(); int offs; @@ -101,10 +101,10 @@ } } -SCREEN_UPDATE( tankbatt ) +SCREEN_UPDATE_IND16( tankbatt ) { - tankbatt_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_bullets(screen->machine(), bitmap, cliprect); + tankbatt_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_bullets(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tankbust.c mame-0.145/src/mame/video/tankbust.c --- mame-0.144/src/mame/video/tankbust.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tankbust.c 2012-02-06 21:30:32.000000000 +0000 @@ -49,7 +49,7 @@ #endif /* priority bg/sprites (1 = this bg tile on top of sprites) */ - tileinfo->category = (attr & 0x08) >> 3; + tileinfo.category = (attr & 0x08) >> 3; SET_TILE_INFO( 1, code, @@ -86,7 +86,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_txt_tilemap, 0); + state->m_txt_tilemap->set_transparent_pen(0); } @@ -100,7 +100,7 @@ { tankbust_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( tankbust_background_videoram_r ) { @@ -112,7 +112,7 @@ { tankbust_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( tankbust_background_colorram_r ) { @@ -124,7 +124,7 @@ { tankbust_state *state = space->machine().driver_data(); state->m_txtram[offset] = data; - tilemap_mark_tile_dirty(state->m_txt_tilemap, offset); + state->m_txt_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( tankbust_txtram_r ) { @@ -145,7 +145,7 @@ x = state->m_xscroll[0] + 256 * (state->m_xscroll[1]&1); if (x>=0x100) x-=0x200; - tilemap_set_scrollx(state->m_bg_tilemap, 0, x ); + state->m_bg_tilemap->set_scrollx(0, x ); } //popmessage("x=%02x %02x", state->m_xscroll[0], state->m_xscroll[1]); } @@ -161,7 +161,7 @@ state->m_yscroll[offset] = data; y = state->m_yscroll[0]; if (y>=0x80) y-=0x100; - tilemap_set_scrolly(state->m_bg_tilemap, 0, y ); + state->m_bg_tilemap->set_scrolly(0, y ); } //popmessage("y=%02x %02x", state->m_yscroll[0], state->m_yscroll[1]); } @@ -187,7 +187,7 @@ offset 3 xxxxxxxx x position (8 LSB bits) */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tankbust_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -232,9 +232,9 @@ } -SCREEN_UPDATE( tankbust ) +SCREEN_UPDATE_IND16( tankbust ) { - tankbust_state *state = screen->machine().driver_data(); + tankbust_state *state = screen.machine().driver_data(); #if 0 int i; @@ -244,15 +244,15 @@ if ( (tile_attrib&8) || (tile_attrib&0x80) ) { - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); + state->m_bg_tilemap->mark_tile_dirty(i); } } #endif - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); - tilemap_draw(bitmap, cliprect, state->m_txt_tilemap, 0,0); + state->m_txt_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/taotaido.c mame-0.145/src/mame/video/taotaido.c --- mame-0.144/src/mame/video/taotaido.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/taotaido.c 2012-02-06 21:30:31.000000000 +0000 @@ -25,7 +25,7 @@ /* sprites are like the other video system / psikyo games, we can merge this with aerofgt and plenty of other things eventually */ -static void draw_sprite(running_machine &machine, UINT16 spriteno, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprite(running_machine &machine, UINT16 spriteno, bitmap_ind16 &bitmap, const rectangle &cliprect ) { taotaido_state *state = machine.driver_data(); /*- SPR RAM Format -** @@ -109,7 +109,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { taotaido_state *state = machine.driver_data(); /* first part of sprite ram is the list of sprites to draw, terminated with 0x4000 */ @@ -150,7 +150,7 @@ state->m_video_bank_select[(offset-4)*2] = data >> 8; if(ACCESSING_BITS_0_7) state->m_video_bank_select[(offset-4)*2+1] = data &0xff; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); break; } } @@ -159,7 +159,7 @@ { taotaido_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( taotaido_bg_tile_info ) @@ -197,44 +197,45 @@ } -SCREEN_UPDATE(taotaido) +SCREEN_UPDATE_IND16(taotaido) { - taotaido_state *state = screen->machine().driver_data(); -// tilemap_set_scrollx(state->m_bg_tilemap,0,(state->m_scrollram[0x380/2]>>4)); // the values put here end up being wrong every other frame -// tilemap_set_scrolly(state->m_bg_tilemap,0,(state->m_scrollram[0x382/2]>>4)); // the values put here end up being wrong every other frame + taotaido_state *state = screen.machine().driver_data(); +// state->m_bg_tilemap->set_scrollx(0,(state->m_scrollram[0x380/2]>>4)); // the values put here end up being wrong every other frame +// state->m_bg_tilemap->set_scrolly(0,(state->m_scrollram[0x382/2]>>4)); // the values put here end up being wrong every other frame /* not amazingly efficient however it should be functional for row select and linescroll */ int line; rectangle clip; - const rectangle &visarea = screen->visible_area(); - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + const rectangle &visarea = screen.visible_area(); + clip = visarea; for (line = 0; line < 224;line++) { clip.min_y = clip.max_y = line; - tilemap_set_scrollx(state->m_bg_tilemap,0,((state->m_scrollram[(0x00+4*line)/2])>>4)+30); - tilemap_set_scrolly(state->m_bg_tilemap,0,((state->m_scrollram[(0x02+4*line)/2])>>4)-line); + state->m_bg_tilemap->set_scrollx(0,((state->m_scrollram[(0x00+4*line)/2])>>4)+30); + state->m_bg_tilemap->set_scrolly(0,((state->m_scrollram[(0x02+4*line)/2])>>4)-line); - tilemap_draw(bitmap,&clip,state->m_bg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, clip, 0,0); } - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } -SCREEN_EOF( taotaido ) +SCREEN_VBLANK( taotaido ) { - taotaido_state *state = machine.driver_data(); - /* sprites need to be delayed by 2 frames? */ + // rising edge + if (vblank_on) + { + taotaido_state *state = screen.machine().driver_data(); + /* sprites need to be delayed by 2 frames? */ - memcpy(state->m_spriteram2_older,state->m_spriteram2_old,0x10000); - memcpy(state->m_spriteram2_old,state->m_spriteram2,0x10000); + memcpy(state->m_spriteram2_older,state->m_spriteram2_old,0x10000); + memcpy(state->m_spriteram2_old,state->m_spriteram2,0x10000); - memcpy(state->m_spriteram_older,state->m_spriteram_old,0x2000); - memcpy(state->m_spriteram_old,state->m_spriteram,0x2000); + memcpy(state->m_spriteram_older,state->m_spriteram_old,0x2000); + memcpy(state->m_spriteram_old,state->m_spriteram,0x2000); + } } diff -Nru mame-0.144/src/mame/video/targeth.c mame-0.145/src/mame/video/targeth.c --- mame-0.144/src/mame/video/targeth.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/targeth.c 2012-02-06 21:30:31.000000000 +0000 @@ -62,7 +62,7 @@ { targeth_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_pant[(offset & 0x1fff) >> 12], ((offset << 1) & 0x1fff) >> 2); + state->m_pant[(offset & 0x1fff) >> 12]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2); } @@ -78,7 +78,7 @@ state->m_pant[0] = tilemap_create(machine, get_tile_info_targeth_screen0,tilemap_scan_rows,16,16,64,32); state->m_pant[1] = tilemap_create(machine, get_tile_info_targeth_screen1,tilemap_scan_rows,16,16,64,32); - tilemap_set_transparent_pen(state->m_pant[0],0); + state->m_pant[0]->set_transparent_pen(0); } @@ -105,7 +105,7 @@ 3 | xx------ -------- | not used? */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { targeth_state *state = machine.driver_data(); int i; @@ -133,18 +133,18 @@ ***************************************************************************/ -SCREEN_UPDATE( targeth ) +SCREEN_UPDATE_IND16( targeth ) { - targeth_state *state = screen->machine().driver_data(); + targeth_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_pant[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_pant[0], 0, state->m_vregs[1] + 0x04); - tilemap_set_scrolly(state->m_pant[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_pant[1], 0, state->m_vregs[3]); - - tilemap_draw(bitmap,cliprect,state->m_pant[1],0,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_pant[0]->set_scrolly(0, state->m_vregs[0]); + state->m_pant[0]->set_scrollx(0, state->m_vregs[1] + 0x04); + state->m_pant[1]->set_scrolly(0, state->m_vregs[2]); + state->m_pant[1]->set_scrollx(0, state->m_vregs[3]); + + state->m_pant[1]->draw(bitmap, cliprect, 0,0); + state->m_pant[0]->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tatsumi.c mame-0.145/src/mame/video/tatsumi.c --- mame-0.144/src/mame/video/tatsumi.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tatsumi.c 2012-02-06 21:30:32.000000000 +0000 @@ -119,7 +119,7 @@ tatsumi_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty( state->m_tx_layer,offset); + state->m_tx_layer->mark_tile_dirty(offset); } READ16_HANDLER( cyclwarr_videoram0_r ) @@ -140,8 +140,8 @@ COMBINE_DATA(&state->m_cyclwarr_videoram0[offset]); if (offset>=0x400) { - tilemap_mark_tile_dirty( state->m_layer0, offset-0x400); - tilemap_mark_tile_dirty( state->m_layer1, offset-0x400); + state->m_layer0->mark_tile_dirty(offset-0x400); + state->m_layer1->mark_tile_dirty(offset-0x400); } } @@ -151,8 +151,8 @@ COMBINE_DATA(&state->m_cyclwarr_videoram1[offset]); if (offset>=0x400) { - tilemap_mark_tile_dirty( state->m_layer2, offset-0x400); - tilemap_mark_tile_dirty( state->m_layer3, offset-0x400); + state->m_layer2->mark_tile_dirty(offset-0x400); + state->m_layer3->mark_tile_dirty(offset-0x400); } } @@ -205,10 +205,10 @@ tatsumi_state *state = machine.driver_data(); state->m_tx_layer = tilemap_create(machine, get_text_tile_info,tilemap_scan_rows,8,8,64,64); state->m_shadow_pen_array = auto_alloc_array_clear(machine, UINT8, 8192); - state->m_temp_bitmap = auto_bitmap_alloc(machine, 512, 512, BITMAP_FORMAT_RGB32); + state->m_temp_bitmap.allocate(512, 512); state->m_apache3_road_x_ram = auto_alloc_array(machine, UINT8, 512); - tilemap_set_transparent_pen(state->m_tx_layer,0); + state->m_tx_layer->set_transparent_pen(0); } VIDEO_START( roundup5 ) @@ -218,7 +218,7 @@ state->m_shadow_pen_array = auto_alloc_array_clear(machine, UINT8, 8192); state->m_roundup5_vram = auto_alloc_array(machine, UINT16, (0x48000 * 4)/2); - tilemap_set_transparent_pen(state->m_tx_layer,0); + state->m_tx_layer->set_transparent_pen(0); gfx_element_set_source(machine.gfx[1], (UINT8 *)state->m_roundup5_vram); } @@ -248,12 +248,12 @@ /********************************************************************/ -INLINE void roundupt_drawgfxzoomrotate( - bitmap_t *dest_bmp, const rectangle *clip, const gfx_element *gfx, +template +INLINE void roundupt_drawgfxzoomrotate(tatsumi_state *state, + _BitmapClass &dest_bmp, const rectangle &clip, const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,UINT32 ssx,UINT32 ssy, int scalex, int scaley, int rotate, int write_priority_only ) { - tatsumi_state *state = gfx->machine().driver_data(); rectangle myclip; if (!scalex || !scaley) return; @@ -266,20 +266,8 @@ */ /* KW 991012 -- Added code to force clip to bitmap boundary */ - if(clip) - { - myclip.min_x = clip->min_x; - myclip.max_x = clip->max_x; - myclip.min_y = clip->min_y; - myclip.max_y = clip->max_y; - - if (myclip.min_x < 0) myclip.min_x = 0; - if (myclip.max_x >= dest_bmp->width) myclip.max_x = dest_bmp->width-1; - if (myclip.min_y < 0) myclip.min_y = 0; - if (myclip.max_y >= dest_bmp->height) myclip.max_y = dest_bmp->height-1; - - clip=&myclip; - } + myclip = clip; + myclip &= dest_bmp.cliprect(); { if( gfx ) @@ -346,31 +334,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < myclip.min_x) + { /* clip left */ + int pixels = myclip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < myclip.min_y ) + { /* clip top */ + int pixels = myclip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > myclip.max_x+1 ) + { /* clip right */ + int pixels = ex-myclip.max_x-1; + ex -= pixels; + } + if( ey > myclip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-myclip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -403,7 +388,7 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT32 *dest = BITMAP_ADDR32(dest_bmp, y, 0); - UINT8 *priority_dest = BITMAP_ADDR8(dest_bmp, y, 0); + typename _BitmapClass::pixel_t *dest = &dest_bmp.pix(y); int x, x_index = x_index_base; for( x=sx; xwidth-1; -// const int ymask = srcbitmap->height-1; +// const int xmask = srcbitmap.width()-1; +// const int ymask = srcbitmap.height()-1; const int widthshifted = srcwidth << 16; const int heightshifted = srcheight << 16; UINT32 *dest; @@ -488,10 +477,10 @@ ex = dstx + srcwidth; ey = dsty + srcheight; - if (sxmin_x) sx=clip->min_x; - if (ex>clip->max_x) ex=clip->max_x; - if (symin_y) sy=clip->min_y; - if (ey>clip->max_y) ey=clip->max_y; + if (sxclip.max_x) ex=clip.max_x; + if (syclip.max_y) ey=clip.max_y; if (sx <= ex) { @@ -501,13 +490,13 @@ x = sx; cx = startx; cy = starty; - dest = BITMAP_ADDR32(bitmap, sy, sx); + dest = &bitmap.pix32(sy, sx); while (x <= ex) { if (cx < widthshifted && cy < heightshifted) { - int c = *BITMAP_ADDR32(srcbitmap, cy >> 16, cx >> 16); + int c = srcbitmap.pix32(cy >> 16, cx >> 16); if (c != transparent_color) *dest = c; @@ -525,7 +514,8 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int write_priority_only, int rambank) +template +static void draw_sprites(running_machine &machine, _BitmapClass &bitmap, const rectangle &cliprect, int write_priority_only, int rambank) { tatsumi_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -612,7 +602,7 @@ if (rotate) { render_y = 0; - bitmap_fill(state->m_temp_bitmap, 0, 0); + state->m_temp_bitmap.fill(0); } extent_x = extent_y = 0; @@ -651,13 +641,13 @@ for (w = 0; w < x_width; w++) { if (rotate) - roundupt_drawgfxzoomrotate( + roundupt_drawgfxzoomrotate(state, state->m_temp_bitmap,cliprect,machine.gfx[0], base, color,flip_x,flip_y,x_pos,render_y, scale,scale,0,write_priority_only); else - roundupt_drawgfxzoomrotate( + roundupt_drawgfxzoomrotate(state, bitmap,cliprect,machine.gfx[0], base, color,flip_x,flip_y,x_pos,render_y, @@ -712,7 +702,7 @@ } } -static void draw_sky(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, int palette_base, int start_offset) +static void draw_sky(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect, int palette_base, int start_offset) { // all todo int x,y; @@ -729,12 +719,12 @@ if (colpalette_base+127) col=palette_base+127; - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[col]; + bitmap.pix32(y, x) = machine.pens[col]; } } } -static void draw_road(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,bitmap_t *shadow_bitmap) +static void draw_road(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect,bitmap_ind8 &shadow_bitmap) { tatsumi_state *state = machine.driver_data(); /* @@ -860,11 +850,11 @@ /* Fill in left of road segment */ for (x=0; x>11)<0x80; x++) { // look up colour int col = linedata[(samplePos>>11)&0x7f]&0xf; - UINT8 shadow=*BITMAP_ADDR8(shadow_bitmap, y, x); + UINT8 shadow=shadow_bitmap.pix8(y, x); /* Clamp if we have reached the end of the pixel data */ //if ((samplePos>>11) > 0x7f) // col=linedata[0x7f]&0xf; if (shadow) - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[768 + pal*16 + col]; + bitmap.pix32(y, x) = machine.pens[768 + pal*16 + col]; else - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[256 + pal*16 + col]; + bitmap.pix32(y, x) = machine.pens[256 + pal*16 + col]; samplePos+=step; } @@ -910,16 +900,16 @@ /* Fill pixels */ for (x=startPos; x<320 && x>11) > 0x7f) // col=linedata[0x7f]&0xf; if (shadow) - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[768 + pal*16 + col + 32]; + bitmap.pix32(y, x) = machine.pens[768 + pal*16 + col + 32]; else - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[256 + pal*16 + col + 32]; + bitmap.pix32(y, x) = machine.pens[256 + pal*16 + col + 32]; } if (endPos<0) { @@ -934,16 +924,16 @@ for (/*x=endPos*/; x<320; x++) { // look up colour int col = linedata[((samplePos>>11)&0x7f) + 0x200]&0xf; - UINT8 shadow=*BITMAP_ADDR8(shadow_bitmap, y, x); + UINT8 shadow=shadow_bitmap.pix8(y, x); /* Clamp if we have reached the end of the pixel data */ if ((samplePos>>11) > 0x7f) col=linedata[0x7f + 0x200]&0xf; if (shadow) - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[768 + pal*16 + col + 32]; + bitmap.pix32(y, x) = machine.pens[768 + pal*16 + col + 32]; else - *BITMAP_ADDR32(bitmap, y, x) = machine.pens[256 + pal*16 + col + 32]; + bitmap.pix32(y, x) = machine.pens[256 + pal*16 + col + 32]; samplePos+=step; } @@ -988,14 +978,14 @@ /**********************************************************************/ -static void draw_bg(running_machine &machine, bitmap_t *dst, tilemap_t *src, const UINT16* scrollx, const UINT16* scrolly, const UINT16* tilemap_ram, int tile_bank, int xscroll_offset, int yscroll_offset, int xsize, int ysize) +static void draw_bg(running_machine &machine, bitmap_rgb32 &dst, tilemap_t *src, const UINT16* scrollx, const UINT16* scrolly, const UINT16* tilemap_ram, int tile_bank, int xscroll_offset, int yscroll_offset, int xsize, int ysize) { /* Each tile (0x4000 of them) has a lookup table in ROM to build an individual 3-bit palette from sets of 8 bit palettes! */ const UINT8* tile_cluts = machine.region("gfx4")->base(); - const bitmap_t *src_bitmap = tilemap_get_pixmap(src); + const bitmap_ind16 &src_bitmap = src->pixmap(); int src_y_mask=ysize-1; int src_x_mask=xsize-1; int tile_y_mask=(ysize/8)-1; @@ -1013,19 +1003,19 @@ int bank = (tile_bank >> (((tilemap_ram[(tile_index+0x400)&0x7fff]&0xc00)>>10)*4))&0xf; int tile = (tilemap_ram[(tile_index+0x400)&0x7fff]&0x3ff) | (bank<<10); - p=*BITMAP_ADDR16(src_bitmap, src_y&src_y_mask, src_x&src_x_mask); + p=src_bitmap.pix16(src_y&src_y_mask, src_x&src_x_mask); pp=tile_cluts[tile*8 + (p&0x7)]; ppp=pp + ((p&0x78)<<5); if ((p&0x7)!=0 || ((p&0x7)==0 && (pp&0x7)!=0)) // Transparent pixels are set by both the tile pixel data==0 AND colour palette==0 - *BITMAP_ADDR32(dst, y, x) = machine.pens[ppp]; + dst.pix32(y, x) = machine.pens[ppp]; } } } /* Draw the sky and ground, applying rotation (eventually). Experimental! */ #if 0 -static void draw_ground(running_machine &machine, bitmap_t *dst, const rectangle *cliprect) +static void draw_ground(running_machine &machine, bitmap_rgb32 &dst, const rectangle &cliprect) { tatsumi_state *state = machine.driver_data(); int x, y; @@ -1034,7 +1024,7 @@ UINT16 gva = 0x180; // TODO UINT8 sky_val = state->m_apache3_rotate_ctrl[1] & 0xff; - for (y = cliprect->min_y; y <= cliprect->max_y; ++y) + for (y = cliprect.min_y; y <= cliprect.max_y; ++y) { UINT16 rgdb = 0;//state->m_apache3_road_x_ram[gva & 0xff]; UINT16 gha = 0xf60; // test @@ -1043,9 +1033,9 @@ if (gva & 0x100) { /* Sky */ - for (x = cliprect->min_x; x <= cliprect->max_x; ++x) + for (x = cliprect.min_x; x <= cliprect.max_x; ++x) { - *BITMAP_ADDR32(dst, y, x) = machine.pens[0x100 + (sky_val & 0x7f)]; + dst.pix32(y, x) = machine.pens[0x100 + (sky_val & 0x7f)]; /* Update horizontal counter? */ gha = (gha + 1) & 0xfff; @@ -1054,7 +1044,7 @@ else { /* Ground */ - for (x = cliprect->min_x; x <= cliprect->max_x; ++x) + for (x = cliprect.min_x; x <= cliprect.max_x; ++x) { UINT8 colour; UINT16 hval; @@ -1075,7 +1065,7 @@ colour = (BIT(hval, 11) << 4) | (colour << 2) | ln; /* Draw the pixel */ - *BITMAP_ADDR32(dst, y, x) = machine.pens[0x200 + colour]; + dst.pix32(y, x) = machine.pens[0x200 + colour]; /* Update horizontal counter */ gha = (gha + 1) & 0xfff; @@ -1090,87 +1080,87 @@ #endif /**********************************************************************/ -SCREEN_UPDATE( apache3 ) +SCREEN_UPDATE_RGB32( apache3 ) { - tatsumi_state *state = screen->machine().driver_data(); - update_cluts(screen->machine(), 1024, 0, 2048); + tatsumi_state *state = screen.machine().driver_data(); + update_cluts(screen.machine(), 1024, 0, 2048); - tilemap_set_scrollx(state->m_tx_layer,0,24); + state->m_tx_layer->set_scrollx(0,24); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0]); - draw_sky(screen->machine(), bitmap, cliprect, 256, state->m_apache3_rotate_ctrl[1]); -// draw_ground(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap,cliprect,0, (state->m_sprite_control_ram[0x20]&0x1000) ? 0x1000 : 0); - tilemap_draw(bitmap,cliprect,state->m_tx_layer,0,0); + bitmap.fill(screen.machine().pens[0], cliprect); + draw_sky(screen.machine(), bitmap, cliprect, 256, state->m_apache3_rotate_ctrl[1]); +// draw_ground(screen.machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap,cliprect,0, (state->m_sprite_control_ram[0x20]&0x1000) ? 0x1000 : 0); + state->m_tx_layer->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( roundup5 ) +SCREEN_UPDATE_RGB32( roundup5 ) { - tatsumi_state *state = screen->machine().driver_data(); + tatsumi_state *state = screen.machine().driver_data(); // UINT16 bg_x_scroll=state->m_roundup5_unknown1[0]; // UINT16 bg_y_scroll=state->m_roundup5_unknown2[0]; - update_cluts(screen->machine(), 1024, 512, 4096); + update_cluts(screen.machine(), 1024, 512, 4096); - tilemap_set_scrollx(state->m_tx_layer,0,24); - tilemap_set_scrolly(state->m_tx_layer,0,0); //(((state->m_roundupt_crt_reg[0xe]<<8)|state->m_roundupt_crt_reg[0xf])>>5) + 96); + state->m_tx_layer->set_scrollx(0,24); + state->m_tx_layer->set_scrolly(0,0); //(((state->m_roundupt_crt_reg[0xe]<<8)|state->m_roundupt_crt_reg[0xf])>>5) + 96); - bitmap_fill(bitmap,cliprect,screen->machine().pens[384]); // todo - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill(screen.machine().pens[384], cliprect); // todo + screen.machine().priority_bitmap.fill(0, cliprect); - draw_sprites(screen->machine(), screen->machine().priority_bitmap,cliprect,1,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only - draw_road(screen->machine(), bitmap,cliprect,screen->machine().priority_bitmap); - draw_sprites(screen->machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Full pass - tilemap_draw(bitmap,cliprect,state->m_tx_layer,0,0); + draw_sprites(screen.machine(), screen.machine().priority_bitmap,cliprect,1,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only + draw_road(screen.machine(), bitmap,cliprect,screen.machine().priority_bitmap); + draw_sprites(screen.machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Full pass + state->m_tx_layer->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( cyclwarr ) +SCREEN_UPDATE_RGB32( cyclwarr ) { - tatsumi_state *state = screen->machine().driver_data(); + tatsumi_state *state = screen.machine().driver_data(); state->m_bigfight_bank=state->m_bigfight_a40000[0]; if (state->m_bigfight_bank!=state->m_bigfight_last_bank) { - tilemap_mark_all_tiles_dirty(state->m_layer0); - tilemap_mark_all_tiles_dirty(state->m_layer1); - tilemap_mark_all_tiles_dirty(state->m_layer2); - tilemap_mark_all_tiles_dirty(state->m_layer3); + state->m_layer0->mark_all_dirty(); + state->m_layer1->mark_all_dirty(); + state->m_layer2->mark_all_dirty(); + state->m_layer3->mark_all_dirty(); state->m_bigfight_last_bank=state->m_bigfight_bank; } - bitmap_fill(bitmap,cliprect,screen->machine().pens[0]); + bitmap.fill(screen.machine().pens[0], cliprect); - draw_bg(screen->machine(), bitmap, state->m_layer3, &state->m_cyclwarr_videoram1[0x000], &state->m_cyclwarr_videoram1[0x100], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x80, 512, 4096); - draw_bg(screen->machine(), bitmap, state->m_layer2, &state->m_cyclwarr_videoram1[0x200], &state->m_cyclwarr_videoram1[0x300], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x80, 512, 4096); - draw_bg(screen->machine(), bitmap, state->m_layer1, &state->m_cyclwarr_videoram0[0x000], &state->m_cyclwarr_videoram0[0x100], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - update_cluts(screen->machine(), 8192, 4096, 8192); - draw_sprites(screen->machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); - draw_bg(screen->machine(), bitmap, state->m_layer0, &state->m_cyclwarr_videoram0[0x200], &state->m_cyclwarr_videoram0[0x300], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 0x10, -0x80, 512, 4096); + draw_bg(screen.machine(), bitmap, state->m_layer3, &state->m_cyclwarr_videoram1[0x000], &state->m_cyclwarr_videoram1[0x100], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x80, 512, 4096); + draw_bg(screen.machine(), bitmap, state->m_layer2, &state->m_cyclwarr_videoram1[0x200], &state->m_cyclwarr_videoram1[0x300], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x80, 512, 4096); + draw_bg(screen.machine(), bitmap, state->m_layer1, &state->m_cyclwarr_videoram0[0x000], &state->m_cyclwarr_videoram0[0x100], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + update_cluts(screen.machine(), 8192, 4096, 8192); + draw_sprites(screen.machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); + draw_bg(screen.machine(), bitmap, state->m_layer0, &state->m_cyclwarr_videoram0[0x200], &state->m_cyclwarr_videoram0[0x300], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 0x10, -0x80, 512, 4096); return 0; } -SCREEN_UPDATE( bigfight ) +SCREEN_UPDATE_RGB32( bigfight ) { - tatsumi_state *state = screen->machine().driver_data(); + tatsumi_state *state = screen.machine().driver_data(); state->m_bigfight_bank=state->m_bigfight_a40000[0]; if (state->m_bigfight_bank!=state->m_bigfight_last_bank) { - tilemap_mark_all_tiles_dirty(state->m_layer0); - tilemap_mark_all_tiles_dirty(state->m_layer1); - tilemap_mark_all_tiles_dirty(state->m_layer2); - tilemap_mark_all_tiles_dirty(state->m_layer3); + state->m_layer0->mark_all_dirty(); + state->m_layer1->mark_all_dirty(); + state->m_layer2->mark_all_dirty(); + state->m_layer3->mark_all_dirty(); state->m_bigfight_last_bank=state->m_bigfight_bank; } - bitmap_fill(bitmap,cliprect,screen->machine().pens[0]); - draw_bg(screen->machine(), bitmap, state->m_layer3, &state->m_cyclwarr_videoram1[0x000], &state->m_cyclwarr_videoram1[0x100], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - draw_bg(screen->machine(), bitmap, state->m_layer2, &state->m_cyclwarr_videoram1[0x200], &state->m_cyclwarr_videoram1[0x300], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - draw_bg(screen->machine(), bitmap, state->m_layer1, &state->m_cyclwarr_videoram0[0x000], &state->m_cyclwarr_videoram0[0x100], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); - update_cluts(screen->machine(), 8192, 4096, 8192); - draw_sprites(screen->machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); - draw_bg(screen->machine(), bitmap, state->m_layer0, &state->m_cyclwarr_videoram0[0x200], &state->m_cyclwarr_videoram0[0x300], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 0x10, -0x40, 1024, 2048); + bitmap.fill(screen.machine().pens[0], cliprect); + draw_bg(screen.machine(), bitmap, state->m_layer3, &state->m_cyclwarr_videoram1[0x000], &state->m_cyclwarr_videoram1[0x100], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + draw_bg(screen.machine(), bitmap, state->m_layer2, &state->m_cyclwarr_videoram1[0x200], &state->m_cyclwarr_videoram1[0x300], state->m_cyclwarr_videoram1, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + draw_bg(screen.machine(), bitmap, state->m_layer1, &state->m_cyclwarr_videoram0[0x000], &state->m_cyclwarr_videoram0[0x100], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 8, -0x40, 1024, 2048); + update_cluts(screen.machine(), 8192, 4096, 8192); + draw_sprites(screen.machine(), bitmap,cliprect,0,(state->m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); + draw_bg(screen.machine(), bitmap, state->m_layer0, &state->m_cyclwarr_videoram0[0x200], &state->m_cyclwarr_videoram0[0x300], state->m_cyclwarr_videoram0, state->m_bigfight_a40000[0], 0x10, -0x40, 1024, 2048); return 0; } diff -Nru mame-0.144/src/mame/video/taxidriv.c mame-0.145/src/mame/video/taxidriv.c --- mame-0.144/src/mame/video/taxidriv.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/mame/video/taxidriv.c 2012-02-06 21:30:31.000000000 +0000 @@ -0,0 +1,148 @@ +#include "emu.h" +#include "includes/taxidriv.h" + + +WRITE8_DEVICE_HANDLER( taxidriv_spritectrl_w ) +{ + taxidriv_state *state = device->machine().driver_data(); + state->m_spritectrl[offset] = data; +} + + + +SCREEN_UPDATE_IND16( taxidriv ) +{ + taxidriv_state *state = screen.machine().driver_data(); + int offs; + int sx,sy; + + + if (state->m_bghide) + { + bitmap.fill(0, cliprect); + + + /* kludge to fix scroll after death */ + state->m_scroll[0] = state->m_scroll[1] = state->m_scroll[2] = state->m_scroll[3] = 0; + state->m_spritectrl[2] = state->m_spritectrl[5] = state->m_spritectrl[8] = 0; + } + else + { + for (offs = 0;offs < 0x400;offs++) + { + sx = offs % 32; + sy = offs / 32; + + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[3], + state->m_vram3[offs], + 0, + 0,0, + (sx*8-state->m_scroll[0])&0xff,(sy*8-state->m_scroll[1])&0xff); + } + + for (offs = 0;offs < 0x400;offs++) + { + sx = offs % 32; + sy = offs / 32; + + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[2], + state->m_vram2[offs]+256*state->m_vram2[offs+0x400], + 0, + 0,0, + (sx*8-state->m_scroll[2])&0xff,(sy*8-state->m_scroll[3])&0xff,0); + } + + if (state->m_spritectrl[2] & 4) + { + for (offs = 0;offs < 0x1000;offs++) + { + int color; + + sx = ((offs/2) % 64-state->m_spritectrl[0]-256*(state->m_spritectrl[2]&1))&0x1ff; + sy = ((offs/2) / 64-state->m_spritectrl[1]-128*(state->m_spritectrl[2]&2))&0x1ff; + + color = (state->m_vram5[offs/4]>>(2*(offs&3)))&0x03; + if (color) + { + if (sx > 0 && sx < 256 && sy > 0 && sy < 256) + bitmap.pix16(sy, sx) = color; + } + } + } + + if (state->m_spritectrl[5] & 4) + { + for (offs = 0;offs < 0x1000;offs++) + { + int color; + + sx = ((offs/2) % 64-state->m_spritectrl[3]-256*(state->m_spritectrl[5]&1))&0x1ff; + sy = ((offs/2) / 64-state->m_spritectrl[4]-128*(state->m_spritectrl[5]&2))&0x1ff; + + color = (state->m_vram6[offs/4]>>(2*(offs&3)))&0x03; + if (color) + { + if (sx > 0 && sx < 256 && sy > 0 && sy < 256) + bitmap.pix16(sy, sx) = color; + } + } + } + + if (state->m_spritectrl[8] & 4) + { + for (offs = 0;offs < 0x1000;offs++) + { + int color; + + sx = ((offs/2) % 64-state->m_spritectrl[6]-256*(state->m_spritectrl[8]&1))&0x1ff; + sy = ((offs/2) / 64-state->m_spritectrl[7]-128*(state->m_spritectrl[8]&2))&0x1ff; + + color = (state->m_vram7[offs/4]>>(2*(offs&3)))&0x03; + if (color) + { + if (sx > 0 && sx < 256 && sy > 0 && sy < 256) + bitmap.pix16(sy, sx) = color; + } + } + } + + for (offs = 0;offs < 0x400;offs++) + { + sx = offs % 32; + sy = offs / 32; + + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[1], + state->m_vram1[offs], + 0, + 0,0, + sx*8,sy*8,0); + } + + for (offs = 0;offs < 0x2000;offs++) + { + int color; + + sx = (offs/2) % 64; + sy = (offs/2) / 64; + + color = (state->m_vram4[offs/4]>>(2*(offs&3)))&0x03; + if (color) + { + bitmap.pix16(sy, sx) = 2 * color; + } + } + } + + for (offs = 0;offs < 0x400;offs++) + { + sx = offs % 32; + sy = offs / 32; + + drawgfx_transpen(bitmap,cliprect,screen.machine().gfx[0], + state->m_vram0[offs], + 0, + 0,0, + sx*8,sy*8,0); + } + return 0; +} diff -Nru mame-0.144/src/mame/video/taxidrvr.c mame-0.145/src/mame/video/taxidrvr.c --- mame-0.144/src/mame/video/taxidrvr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/taxidrvr.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -#include "emu.h" -#include "includes/taxidrvr.h" - - -WRITE8_DEVICE_HANDLER( taxidrvr_spritectrl_w ) -{ - taxidrvr_state *state = device->machine().driver_data(); - state->m_spritectrl[offset] = data; -} - - - -SCREEN_UPDATE( taxidrvr ) -{ - taxidrvr_state *state = screen->machine().driver_data(); - int offs; - int sx,sy; - - - if (state->m_bghide) - { - bitmap_fill(bitmap,cliprect,0); - - - /* kludge to fix scroll after death */ - state->m_scroll[0] = state->m_scroll[1] = state->m_scroll[2] = state->m_scroll[3] = 0; - state->m_spritectrl[2] = state->m_spritectrl[5] = state->m_spritectrl[8] = 0; - } - else - { - for (offs = 0;offs < 0x400;offs++) - { - sx = offs % 32; - sy = offs / 32; - - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[3], - state->m_vram3[offs], - 0, - 0,0, - (sx*8-state->m_scroll[0])&0xff,(sy*8-state->m_scroll[1])&0xff); - } - - for (offs = 0;offs < 0x400;offs++) - { - sx = offs % 32; - sy = offs / 32; - - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[2], - state->m_vram2[offs]+256*state->m_vram2[offs+0x400], - 0, - 0,0, - (sx*8-state->m_scroll[2])&0xff,(sy*8-state->m_scroll[3])&0xff,0); - } - - if (state->m_spritectrl[2] & 4) - { - for (offs = 0;offs < 0x1000;offs++) - { - int color; - - sx = ((offs/2) % 64-state->m_spritectrl[0]-256*(state->m_spritectrl[2]&1))&0x1ff; - sy = ((offs/2) / 64-state->m_spritectrl[1]-128*(state->m_spritectrl[2]&2))&0x1ff; - - color = (state->m_vram5[offs/4]>>(2*(offs&3)))&0x03; - if (color) - { - if (sx > 0 && sx < 256 && sy > 0 && sy < 256) - *BITMAP_ADDR16(bitmap, sy, sx) = color; - } - } - } - - if (state->m_spritectrl[5] & 4) - { - for (offs = 0;offs < 0x1000;offs++) - { - int color; - - sx = ((offs/2) % 64-state->m_spritectrl[3]-256*(state->m_spritectrl[5]&1))&0x1ff; - sy = ((offs/2) / 64-state->m_spritectrl[4]-128*(state->m_spritectrl[5]&2))&0x1ff; - - color = (state->m_vram6[offs/4]>>(2*(offs&3)))&0x03; - if (color) - { - if (sx > 0 && sx < 256 && sy > 0 && sy < 256) - *BITMAP_ADDR16(bitmap, sy, sx) = color; - } - } - } - - if (state->m_spritectrl[8] & 4) - { - for (offs = 0;offs < 0x1000;offs++) - { - int color; - - sx = ((offs/2) % 64-state->m_spritectrl[6]-256*(state->m_spritectrl[8]&1))&0x1ff; - sy = ((offs/2) / 64-state->m_spritectrl[7]-128*(state->m_spritectrl[8]&2))&0x1ff; - - color = (state->m_vram7[offs/4]>>(2*(offs&3)))&0x03; - if (color) - { - if (sx > 0 && sx < 256 && sy > 0 && sy < 256) - *BITMAP_ADDR16(bitmap, sy, sx) = color; - } - } - } - - for (offs = 0;offs < 0x400;offs++) - { - sx = offs % 32; - sy = offs / 32; - - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[1], - state->m_vram1[offs], - 0, - 0,0, - sx*8,sy*8,0); - } - - for (offs = 0;offs < 0x2000;offs++) - { - int color; - - sx = (offs/2) % 64; - sy = (offs/2) / 64; - - color = (state->m_vram4[offs/4]>>(2*(offs&3)))&0x03; - if (color) - { - *BITMAP_ADDR16(bitmap, sy, sx) = 2 * color; - } - } - } - - for (offs = 0;offs < 0x400;offs++) - { - sx = offs % 32; - sy = offs / 32; - - drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[0], - state->m_vram0[offs], - 0, - 0,0, - sx*8,sy*8,0); - } - return 0; -} diff -Nru mame-0.144/src/mame/video/tbowl.c mame-0.145/src/mame/video/tbowl.c --- mame-0.144/src/mame/video/tbowl.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tbowl.c 2012-02-06 21:30:31.000000000 +0000 @@ -24,7 +24,7 @@ { tbowl_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x7ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } /* Bottom BG Layer (bg) Tilemap */ @@ -45,7 +45,7 @@ { tbowl_state *state = space->machine().driver_data(); state->m_bg2videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap,offset & 0xfff); + state->m_bg2_tilemap->mark_tile_dirty(offset & 0xfff); } WRITE8_HANDLER (tbowl_bgxscroll_lo) @@ -91,7 +91,7 @@ { tbowl_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0xfff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0xfff); } WRITE8_HANDLER (tbowl_bg2xscroll_lo) @@ -118,7 +118,7 @@ state->m_bg2yscroll = (state->m_bg2yscroll & 0x00ff) | (data << 8); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect, int xscroll) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect, int xscroll) { tbowl_state *state = machine.driver_data(); int offs; @@ -208,47 +208,48 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 16, 16,128,32); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info,tilemap_scan_rows, 16, 16,128,32); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg2_tilemap,0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_bg2_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE( tbowl ) +SCREEN_UPDATE_IND16( tbowl_left ) { - tbowl_state *state = screen->machine().driver_data(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + tbowl_state *state = screen.machine().driver_data(); + + state->m_bg_tilemap->set_scrollx(0, state->m_xscroll ); + state->m_bg_tilemap->set_scrolly(0, state->m_yscroll ); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2xscroll ); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2yscroll ); + state->m_tx_tilemap->set_scrollx(0, 0 ); + state->m_tx_tilemap->set_scrolly(0, 0 ); + + bitmap.fill(0x100, cliprect); /* is there a register controling the colour? looks odd when screen is blank */ + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); + + return 0; +} + +SCREEN_UPDATE_IND16( tbowl_right ) +{ + tbowl_state *state = screen.machine().driver_data(); + + state->m_bg_tilemap->set_scrollx(0, state->m_xscroll+32*8 ); + state->m_bg_tilemap->set_scrolly(0, state->m_yscroll ); + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2xscroll+32*8 ); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2yscroll ); + state->m_tx_tilemap->set_scrollx(0, 32*8 ); + state->m_tx_tilemap->set_scrolly(0, 0 ); + + bitmap.fill(0x100, cliprect); /* is there a register controling the colour? looks odd when screen is blank */ + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 32*8); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); - if (screen == left_screen) - { - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_xscroll ); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_yscroll ); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2xscroll ); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2yscroll ); - tilemap_set_scrollx(state->m_tx_tilemap, 0, 0 ); - tilemap_set_scrolly(state->m_tx_tilemap, 0, 0 ); - - bitmap_fill(bitmap,cliprect,0x100); /* is there a register controling the colour? looks odd when screen is blank */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 0); - tilemap_draw(bitmap,cliprect,state->m_bg2_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); - } - else if (screen == right_screen) - { - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_xscroll+32*8 ); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_yscroll ); - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2xscroll+32*8 ); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2yscroll ); - tilemap_set_scrollx(state->m_tx_tilemap, 0, 32*8 ); - tilemap_set_scrolly(state->m_tx_tilemap, 0, 0 ); - - bitmap_fill(bitmap,cliprect,0x100); /* is there a register controling the colour? looks odd when screen is blank */ - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 32*8); - tilemap_draw(bitmap,cliprect,state->m_bg2_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); - } return 0; } diff -Nru mame-0.144/src/mame/video/tceptor.c mame-0.145/src/mame/video/tceptor.c --- mame-0.144/src/mame/video/tceptor.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tceptor.c 2012-02-06 21:30:32.000000000 +0000 @@ -110,7 +110,7 @@ int code = state->m_tile_ram[offset]; int color = state->m_tile_attr[offset]; - tileinfo->group = color; + tileinfo.group = color; SET_TILE_INFO(0, code, color, 0); } @@ -138,7 +138,7 @@ } if (x >= 0) - tilemap_mark_tile_dirty(state->m_tx_tilemap, x * 28 + y); + state->m_tx_tilemap->mark_tile_dirty(x * 28 + y); } @@ -192,9 +192,9 @@ offset /= 2; if (offset < 0x800) - tilemap_mark_tile_dirty(state->m_bg1_tilemap, offset); + state->m_bg1_tilemap->mark_tile_dirty(offset); else - tilemap_mark_tile_dirty(state->m_bg2_tilemap, offset - 0x800); + state->m_bg2_tilemap->mark_tile_dirty(offset - 0x800); } WRITE8_HANDLER( tceptor_bg_scroll_w ) @@ -394,7 +394,7 @@ decode_sprite32(machine, "gfx4"); /* allocate temp bitmaps */ - state->m_temp_bitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_temp_bitmap); namco_road_init(machine, gfx_index); @@ -402,8 +402,8 @@ state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_cols, 8, 8, 34, 28); - tilemap_set_scrollx(state->m_tx_tilemap, 0, -2*8); - tilemap_set_scrolly(state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_scrollx(0, -2*8); + state->m_tx_tilemap->set_scrolly(0, 0); colortable_configure_tilemap_groups(machine.colortable, state->m_tx_tilemap, machine.gfx[0], 7); state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 8, 8, 64, 32); @@ -440,7 +440,7 @@ z: zoom y */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int sprite_priority) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_priority) { tceptor_state *state = machine.driver_data(); UINT16 *mem1 = &state->m_sprite_ram_buffered[0x000/2]; @@ -511,64 +511,68 @@ { int x, y; - for (x = cliprect->min_x; x <= cliprect->max_x; x++) - for (y = cliprect->min_y; y <= cliprect->max_y; y++) - if (colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(bitmap, y, x)) == SPR_MASK_COLOR) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) + if (colortable_entry_get_value(machine.colortable, bitmap.pix16(y, x)) == SPR_MASK_COLOR) // restore pixel - *BITMAP_ADDR16(bitmap, y, x) = *BITMAP_ADDR16(state->m_temp_bitmap, y, x); + bitmap.pix16(y, x) = state->m_temp_bitmap.pix16(y, x); } } -SCREEN_UPDATE( tceptor ) +SCREEN_UPDATE_IND16( tceptor_2d ) { - tceptor_state *state = screen->machine().driver_data(); + tceptor_state *state = screen.machine().driver_data(); rectangle rect; int pri; int bg_center = 144 - ((((state->m_bg1_scroll_x + state->m_bg2_scroll_x ) & 0x1ff) - 288) / 2); - device_t *_2d_screen = screen->machine().device("2dscreen"); - device_t *_3d_left_screen = screen->machine().device("3dleft"); - device_t *_3d_right_screen = screen->machine().device("3dright"); - - if (screen != _2d_screen) - { - int frame = screen->frame_number(); - - if ((frame & 1) == 1 && screen == _3d_left_screen) - return UPDATE_HAS_NOT_CHANGED; - if ((frame & 1) == 0 && screen == _3d_right_screen) - return UPDATE_HAS_NOT_CHANGED; - } - // left background - rect = *cliprect; + rect = cliprect; rect.max_x = bg_center; - tilemap_set_scrollx(state->m_bg1_tilemap, 0, state->m_bg1_scroll_x + 12); - tilemap_set_scrolly(state->m_bg1_tilemap, 0, state->m_bg1_scroll_y + 20); //32? - tilemap_draw(bitmap, &rect, state->m_bg1_tilemap, 0, 0); + state->m_bg1_tilemap->set_scrollx(0, state->m_bg1_scroll_x + 12); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg1_scroll_y + 20); //32? + state->m_bg1_tilemap->draw(bitmap, rect, 0, 0); // right background rect.min_x = bg_center; - rect.max_x = cliprect->max_x; - tilemap_set_scrollx(state->m_bg2_tilemap, 0, state->m_bg2_scroll_x + 20); - tilemap_set_scrolly(state->m_bg2_tilemap, 0, state->m_bg2_scroll_y + 20); // 32? - tilemap_draw(bitmap, &rect, state->m_bg2_tilemap, 0, 0); + rect.max_x = cliprect.max_x; + state->m_bg2_tilemap->set_scrollx(0, state->m_bg2_scroll_x + 20); + state->m_bg2_tilemap->set_scrolly(0, state->m_bg2_scroll_y + 20); // 32? + state->m_bg2_tilemap->draw(bitmap, rect, 0, 0); for (pri = 0; pri < 8; pri++) { - namco_road_draw(screen->machine(), bitmap, cliprect, pri * 2); - namco_road_draw(screen->machine(), bitmap, cliprect, pri * 2 + 1); - draw_sprites(screen->machine(), bitmap, cliprect, pri); + namco_road_draw(screen.machine(), bitmap, cliprect, pri * 2); + namco_road_draw(screen.machine(), bitmap, cliprect, pri * 2 + 1); + draw_sprites(screen.machine(), bitmap, cliprect, pri); } - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } +SCREEN_UPDATE_IND16( tceptor_3d_left ) +{ + if ((screen.frame_number() & 1) == 1) + return UPDATE_HAS_NOT_CHANGED; + return SCREEN_UPDATE16_CALL( tceptor_2d ); +} -SCREEN_EOF( tceptor ) +SCREEN_UPDATE_IND16( tceptor_3d_right ) { - tceptor_state *state = machine.driver_data(); - memcpy(state->m_sprite_ram_buffered, state->m_sprite_ram, 0x200); + if ((screen.frame_number() & 1) == 0) + return UPDATE_HAS_NOT_CHANGED; + return SCREEN_UPDATE16_CALL( tceptor_2d ); +} + + +SCREEN_VBLANK( tceptor ) +{ + // rising edge + if (vblank_on) + { + tceptor_state *state = screen.machine().driver_data(); + memcpy(state->m_sprite_ram_buffered, state->m_sprite_ram, 0x200); + } } diff -Nru mame-0.144/src/mame/video/tecmo16.c mame-0.145/src/mame/video/tecmo16.c --- mame-0.144/src/mame/video/tecmo16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tecmo16.c 2012-02-06 21:30:32.000000000 +0000 @@ -21,12 +21,12 @@ int color = state->m_colorram[tile_index] & 0x0f; /* bit 4 controls blending */ - tileinfo->category = (state->m_colorram[tile_index] & 0x10) >> 4; + tileinfo.category = (state->m_colorram[tile_index] & 0x10) >> 4; SET_TILE_INFO( 1, tile, - color | (tileinfo->category ? 0x70 : 0x00), + color | (tileinfo.category ? 0x70 : 0x00), 0); } @@ -59,25 +59,23 @@ VIDEO_START( fstarfrc ) { tecmo16_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info,tilemap_scan_rows,16,16,32,32); state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows,16,16,32,32); state->m_tx_tilemap = tilemap_create(machine, tx_get_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); - tilemap_set_scrolly(state->m_tx_tilemap,0,-16); + state->m_tx_tilemap->set_scrolly(0,-16); state->m_flipscreen = 0; state->m_game_is_riot = 0; } @@ -85,23 +83,21 @@ VIDEO_START( ginkun ) { tecmo16_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info,tilemap_scan_rows,16,16,64,32); state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, tx_get_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); state->m_flipscreen = 0; state->m_game_is_riot = 0; } @@ -109,24 +105,22 @@ VIDEO_START( riot ) { tecmo16_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* set up tile layers */ - state->m_tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_bg); + machine.primary_screen->register_screen_bitmap(state->m_tile_bitmap_fg); /* set up sprites */ - state->m_sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_sprite_bitmap); state->m_fg_tilemap = tilemap_create(machine, fg_get_tile_info,tilemap_scan_rows,16,16,64,32); state->m_bg_tilemap = tilemap_create(machine, bg_get_tile_info,tilemap_scan_rows,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, tx_get_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); - tilemap_set_scrolldy(state->m_tx_tilemap,-16,-16); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_scrolldy(-16,-16); state->m_flipscreen = 0; state->m_game_is_riot = 1; } @@ -137,28 +131,28 @@ { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tecmo16_colorram_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_colorram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tecmo16_videoram2_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tecmo16_colorram2_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_colorram2[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -166,7 +160,7 @@ { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_charram[offset]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tecmo16_flipscreen_w ) @@ -182,50 +176,50 @@ { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll_x_w); - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll_x_w); + state->m_fg_tilemap->set_scrollx(0,state->m_scroll_x_w); } WRITE16_HANDLER( tecmo16_scroll_y_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll_y_w); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll_y_w); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll_y_w); } WRITE16_HANDLER( tecmo16_scroll2_x_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll2_x_w); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll2_x_w); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll2_x_w); } WRITE16_HANDLER( tecmo16_scroll2_y_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll2_y_w); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll2_y_w); + state->m_bg_tilemap->set_scrolly(0,state->m_scroll2_y_w); } WRITE16_HANDLER( tecmo16_scroll_char_x_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll_char_x_w); - tilemap_set_scrollx(state->m_tx_tilemap,0,state->m_scroll_char_x_w); + state->m_tx_tilemap->set_scrollx(0,state->m_scroll_char_x_w); } WRITE16_HANDLER( tecmo16_scroll_char_y_w ) { tecmo16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_scroll_char_y_w); - tilemap_set_scrolly(state->m_tx_tilemap,0,state->m_scroll_char_y_w-16); + state->m_tx_tilemap->set_scrolly(0,state->m_scroll_char_y_w-16); } /******************************************************************************/ /* mix & blend the paletted 16-bit tile and sprite bitmaps into an RGB 32-bit bitmap */ static void blendbitmaps(running_machine &machine, - bitmap_t *dest,bitmap_t *src1,bitmap_t *src2,bitmap_t *src3, - int sx,int sy,const rectangle *clip) + bitmap_rgb32 &dest,bitmap_ind16 &src1,bitmap_ind16 &src2,bitmap_ind16 &src3, + int sx,int sy,const rectangle &clip) { int ox; int oy; @@ -236,34 +230,34 @@ ox = sx; oy = sy; - ex = sx + src1->width - 1; + ex = sx + src1.width() - 1; if (sx < 0) sx = 0; - if (sx < clip->min_x) sx = clip->min_x; - if (ex >= dest->width) ex = dest->width - 1; - if (ex > clip->max_x) ex = clip->max_x; + if (sx < clip.min_x) sx = clip.min_x; + if (ex >= dest.width()) ex = dest.width() - 1; + if (ex > clip.max_x) ex = clip.max_x; if (sx > ex) return; - ey = sy + src1->height - 1; + ey = sy + src1.height() - 1; if (sy < 0) sy = 0; - if (sy < clip->min_y) sy = clip->min_y; - if (ey >= dest->height) ey = dest->height - 1; - if (ey > clip->max_y) ey = clip->max_y; + if (sy < clip.min_y) sy = clip.min_y; + if (ey >= dest.height()) ey = dest.height() - 1; + if (ey > clip.max_y) ey = clip.max_y; if (sy > ey) return; { const pen_t *paldata = machine.pens; UINT32 *end; - UINT16 *sd1 = (UINT16 *)src1->base; /* source data */ - UINT16 *sd2 = (UINT16 *)src2->base; - UINT16 *sd3 = (UINT16 *)src3->base; + UINT16 *sd1 = &src1.pix16(0); + UINT16 *sd2 = &src2.pix16(0); + UINT16 *sd3 = &src3.pix16(0); int sw = ex-sx+1; /* source width */ int sh = ey-sy+1; /* source height */ - int sm = src1->rowpixels; /* source modulo */ + int sm = src1.rowpixels(); /* source modulo */ - UINT32 *dd = BITMAP_ADDR32(dest, sy, sx); /* dest data */ - int dm = dest->rowpixels; /* dest modulo */ + UINT32 *dd = &dest.pix32(sy, sx); /* dest data */ + int dm = dest.rowpixels(); /* dest modulo */ sd1 += (sx-ox); sd1 += sm * (sy-oy); @@ -332,7 +326,7 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap_bg, bitmap_t *bitmap_fg, bitmap_t *bitmap_sp, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap_bg, bitmap_ind16 &bitmap_fg, bitmap_ind16 &bitmap_sp, const rectangle &cliprect) { tecmo16_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -349,7 +343,7 @@ {42,43,46,47,58,59,62,63} }; - bitmap_t *bitmap = bitmap_bg; + bitmap_ind16 &bitmap = bitmap_bg; for (offs = state->m_spriteram_size/2 - 8;offs >= 0;offs -= 8) { @@ -443,7 +437,7 @@ } else { - bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; + bitmap_ind16 &bitmap = (priority >= 2) ? bitmap_bg : bitmap_fg; for (y = 0;y < sizey;y++) { @@ -490,27 +484,27 @@ /******************************************************************************/ -SCREEN_UPDATE( tecmo16 ) +SCREEN_UPDATE_RGB32( tecmo16 ) { - tecmo16_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + tecmo16_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); - bitmap_fill(state->m_tile_bitmap_bg, cliprect, 0x300); - bitmap_fill(state->m_tile_bitmap_fg, cliprect, 0); - bitmap_fill(state->m_sprite_bitmap, cliprect, 0); + state->m_tile_bitmap_bg.fill(0x300, cliprect); + state->m_tile_bitmap_fg.fill(0, cliprect); + state->m_sprite_bitmap.fill(0, cliprect); /* draw tilemaps into a 16-bit bitmap */ - tilemap_draw(state->m_tile_bitmap_bg, cliprect,state->m_bg_tilemap, 0, 1); - tilemap_draw(state->m_tile_bitmap_fg, cliprect,state->m_fg_tilemap, 0, 2); + state->m_bg_tilemap->draw(state->m_tile_bitmap_bg, cliprect, 0, 1); + state->m_fg_tilemap->draw(state->m_tile_bitmap_fg, cliprect, 0, 2); /* draw the blended tiles at a lower priority so sprites covered by them will still be drawn */ - tilemap_draw(state->m_tile_bitmap_fg, cliprect,state->m_fg_tilemap, 1, 0); - tilemap_draw(state->m_tile_bitmap_fg, cliprect,state->m_tx_tilemap, 0, 4); + state->m_fg_tilemap->draw(state->m_tile_bitmap_fg, cliprect, 1, 0); + state->m_tx_tilemap->draw(state->m_tile_bitmap_fg, cliprect, 0, 4); /* draw sprites into a 16-bit bitmap */ - draw_sprites(screen->machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); + draw_sprites(screen.machine(), state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, cliprect); /* mix & blend the tilemaps and sprites into a 32-bit bitmap */ - blendbitmaps(screen->machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); + blendbitmaps(screen.machine(), bitmap, state->m_tile_bitmap_bg, state->m_tile_bitmap_fg, state->m_sprite_bitmap, 0, 0, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tecmo.c mame-0.145/src/mame/video/tecmo.c --- mame-0.144/src/mame/video/tecmo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tecmo.c 2012-02-06 21:30:31.000000000 +0000 @@ -99,12 +99,12 @@ } state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_bg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); - tilemap_set_scrolldx(state->m_bg_tilemap,-48,256+48); - tilemap_set_scrolldx(state->m_fg_tilemap,-48,256+48); + state->m_bg_tilemap->set_scrolldx(-48,256+48); + state->m_fg_tilemap->set_scrolldx(-48,256+48); } @@ -119,21 +119,21 @@ { tecmo_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x3ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( tecmo_fgvideoram_w ) { tecmo_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x1ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x1ff); } WRITE8_HANDLER( tecmo_bgvideoram_w ) { tecmo_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x1ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x1ff); } WRITE8_HANDLER( tecmo_fgscroll_w ) @@ -142,8 +142,8 @@ state->m_fgscroll[offset] = data; - tilemap_set_scrollx(state->m_fg_tilemap, 0, state->m_fgscroll[0] + 256 * state->m_fgscroll[1]); - tilemap_set_scrolly(state->m_fg_tilemap, 0, state->m_fgscroll[2]); + state->m_fg_tilemap->set_scrollx(0, state->m_fgscroll[0] + 256 * state->m_fgscroll[1]); + state->m_fg_tilemap->set_scrolly(0, state->m_fgscroll[2]); } WRITE8_HANDLER( tecmo_bgscroll_w ) @@ -152,8 +152,8 @@ state->m_bgscroll[offset] = data; - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_bgscroll[0] + 256 * state->m_bgscroll[1]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_bgscroll[2]); + state->m_bg_tilemap->set_scrollx(0, state->m_bgscroll[0] + 256 * state->m_bgscroll[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_bgscroll[2]); } WRITE8_HANDLER( tecmo_flipscreen_w ) @@ -169,7 +169,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { tecmo_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -248,15 +248,15 @@ } -SCREEN_UPDATE( tecmo ) +SCREEN_UPDATE_IND16( tecmo ) { - tecmo_state *state = screen->machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,0x100); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,1); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,2); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,4); + tecmo_state *state = screen.machine().driver_data(); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0x100, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,1); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,4); - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tecmosys.c mame-0.145/src/mame/video/tecmosys.c --- mame-0.144/src/mame/video/tecmosys.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/tecmosys.c 2012-02-06 21:30:32.000000000 +0000 @@ -57,28 +57,28 @@ { tecmosys_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg0tilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg0tilemap,offset/2); + state->m_bg0tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( bg1_tilemap_w ) { tecmosys_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg1tilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg1tilemap,offset/2); + state->m_bg1tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( bg2_tilemap_w ) { tecmosys_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg2tilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_bg2tilemap,offset/2); + state->m_bg2tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( fg_tilemap_w ) { tecmosys_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgtilemap_ram[offset]); - tilemap_mark_tile_dirty(state->m_txt_tilemap,offset/2); + state->m_txt_tilemap->mark_tile_dirty(offset/2); } @@ -117,14 +117,14 @@ -static void tecmosys_render_sprites_to_bitmap(running_machine &machine, bitmap_t *bitmap, UINT16 extrax, UINT16 extray ) +static void tecmosys_render_sprites_to_bitmap(running_machine &machine, bitmap_rgb32 &bitmap, UINT16 extrax, UINT16 extray ) { tecmosys_state *state = machine.driver_data(); UINT8 *gfxsrc = machine.region ( "gfx1" )->base(); int i; /* render sprites (with priority information) to temp bitmap */ - bitmap_fill(state->m_sprite_bitmap, NULL, 0x0000); + state->m_sprite_bitmap.fill(0x0000); /* there are multiple spritelists in here, to allow for buffering */ for (i=(state->m_spritelist*0x4000)/2;i<((state->m_spritelist+1)*0x4000)/2;i+=8) { @@ -194,7 +194,7 @@ { UINT8 data; - dstptr = BITMAP_ADDR16(state->m_sprite_bitmap, drawy, drawx); + dstptr = &state->m_sprite_bitmap.pix16(drawy, drawx); data = (gfxsrc[address]); @@ -216,8 +216,8 @@ UINT16 *dstptr; for (y=0;y<240;y++) { - srcptr = BITMAP_ADDR16(state->m_tmp_tilemap_renderbitmap, y, 0); - dstptr = BITMAP_ADDR16(state->m_tmp_tilemap_composebitmap, y, 0); + srcptr = &state->m_tmp_tilemap_renderbitmap.pix16(y); + dstptr = &state->m_tmp_tilemap_composebitmap.pix16(y); for (x=0;x<320;x++) { if ((srcptr[x]&0xf)!=0x0) @@ -226,7 +226,7 @@ } } -static void tecmosys_do_final_mix(running_machine &machine, bitmap_t* bitmap) +static void tecmosys_do_final_mix(running_machine &machine, bitmap_rgb32 &bitmap) { tecmosys_state *state = machine.driver_data(); const pen_t *paldata = machine.pens; @@ -237,10 +237,10 @@ for (y=0;y<240;y++) { - srcptr = BITMAP_ADDR16(state->m_tmp_tilemap_composebitmap, y, 0); - srcptr2 = BITMAP_ADDR16(state->m_sprite_bitmap, y, 0); + srcptr = &state->m_tmp_tilemap_composebitmap.pix16(y); + srcptr2 = &state->m_sprite_bitmap.pix16(y); - dstptr = BITMAP_ADDR32(bitmap, y, 0); + dstptr = &bitmap.pix32(y); for (x=0;x<320;x++) { UINT16 pri, pri2; @@ -297,45 +297,45 @@ } -SCREEN_UPDATE(tecmosys) +SCREEN_UPDATE_RGB32(tecmosys) { - tecmosys_state *state = screen->machine().driver_data(); + tecmosys_state *state = screen.machine().driver_data(); - bitmap_fill(bitmap,cliprect,screen->machine().pens[0x4000]); + bitmap.fill(screen.machine().pens[0x4000], cliprect); - tilemap_set_scrolly( state->m_bg0tilemap, 0, state->m_c80000regs[1]+16); - tilemap_set_scrollx( state->m_bg0tilemap, 0, state->m_c80000regs[0]+104); + state->m_bg0tilemap->set_scrolly(0, state->m_c80000regs[1]+16); + state->m_bg0tilemap->set_scrollx(0, state->m_c80000regs[0]+104); - tilemap_set_scrolly( state->m_bg1tilemap, 0, state->m_a80000regs[1]+17); - tilemap_set_scrollx( state->m_bg1tilemap, 0, state->m_a80000regs[0]+106); + state->m_bg1tilemap->set_scrolly(0, state->m_a80000regs[1]+17); + state->m_bg1tilemap->set_scrollx(0, state->m_a80000regs[0]+106); - tilemap_set_scrolly( state->m_bg2tilemap, 0, state->m_b00000regs[1]+17); - tilemap_set_scrollx( state->m_bg2tilemap, 0, state->m_b00000regs[0]+106); + state->m_bg2tilemap->set_scrolly(0, state->m_b00000regs[1]+17); + state->m_bg2tilemap->set_scrollx(0, state->m_b00000regs[0]+106); - bitmap_fill(state->m_tmp_tilemap_composebitmap,cliprect,0); + state->m_tmp_tilemap_composebitmap.fill(0, cliprect); - bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0); - tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg0tilemap,0,0); + state->m_tmp_tilemap_renderbitmap.fill(0, cliprect); + state->m_bg0tilemap->draw(state->m_tmp_tilemap_renderbitmap, cliprect, 0,0); tecmosys_tilemap_copy_to_compose(state, 0x0000); - bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0); - tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg1tilemap,0,0); + state->m_tmp_tilemap_renderbitmap.fill(0, cliprect); + state->m_bg1tilemap->draw(state->m_tmp_tilemap_renderbitmap, cliprect, 0,0); tecmosys_tilemap_copy_to_compose(state, 0x4000); - bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0); - tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_bg2tilemap,0,0); + state->m_tmp_tilemap_renderbitmap.fill(0, cliprect); + state->m_bg2tilemap->draw(state->m_tmp_tilemap_renderbitmap, cliprect, 0,0); tecmosys_tilemap_copy_to_compose(state, 0x8000); - bitmap_fill(state->m_tmp_tilemap_renderbitmap,cliprect,0); - tilemap_draw(state->m_tmp_tilemap_renderbitmap,cliprect,state->m_txt_tilemap,0,0); + state->m_tmp_tilemap_renderbitmap.fill(0, cliprect); + state->m_txt_tilemap->draw(state->m_tmp_tilemap_renderbitmap, cliprect, 0,0); tecmosys_tilemap_copy_to_compose(state, 0xc000); - tecmosys_do_final_mix(screen->machine(), bitmap); + tecmosys_do_final_mix(screen.machine(), bitmap); // prepare sprites for NEXT frame - causes 1 frame palette errors, but prevents sprite lag in tkdensho, which is correct? - tecmosys_render_sprites_to_bitmap(screen->machine(), bitmap, state->m_880000regs[0x0], state->m_880000regs[0x1]); + tecmosys_render_sprites_to_bitmap(screen.machine(), bitmap, state->m_880000regs[0x0], state->m_880000regs[0x1]); return 0; } @@ -343,25 +343,25 @@ VIDEO_START(tecmosys) { tecmosys_state *state = machine.driver_data(); - state->m_sprite_bitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16); - bitmap_fill(state->m_sprite_bitmap, NULL, 0x4000); + state->m_sprite_bitmap.allocate(320,240); + state->m_sprite_bitmap.fill(0x4000); - state->m_tmp_tilemap_composebitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16); - state->m_tmp_tilemap_renderbitmap = auto_bitmap_alloc(machine,320,240,BITMAP_FORMAT_INDEXED16); + state->m_tmp_tilemap_composebitmap.allocate(320,240); + state->m_tmp_tilemap_renderbitmap.allocate(320,240); - bitmap_fill(state->m_tmp_tilemap_composebitmap, NULL, 0x0000); - bitmap_fill(state->m_tmp_tilemap_renderbitmap, NULL, 0x0000); + state->m_tmp_tilemap_composebitmap.fill(0x0000); + state->m_tmp_tilemap_renderbitmap.fill(0x0000); state->m_txt_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32*2,32*2); - tilemap_set_transparent_pen(state->m_txt_tilemap,0); + state->m_txt_tilemap->set_transparent_pen(0); state->m_bg0tilemap = tilemap_create(machine, get_bg0tile_info,tilemap_scan_rows,16,16,32,32); - tilemap_set_transparent_pen(state->m_bg0tilemap,0); + state->m_bg0tilemap->set_transparent_pen(0); state->m_bg1tilemap = tilemap_create(machine, get_bg1tile_info,tilemap_scan_rows,16,16,32,32); - tilemap_set_transparent_pen(state->m_bg1tilemap,0); + state->m_bg1tilemap->set_transparent_pen(0); state->m_bg2tilemap = tilemap_create(machine, get_bg2tile_info,tilemap_scan_rows,16,16,32,32); - tilemap_set_transparent_pen(state->m_bg2tilemap,0); + state->m_bg2tilemap->set_transparent_pen(0); } diff -Nru mame-0.144/src/mame/video/tehkanwc.c mame-0.145/src/mame/video/tehkanwc.c --- mame-0.144/src/mame/video/tehkanwc.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tehkanwc.c 2012-02-06 21:30:31.000000000 +0000 @@ -19,21 +19,21 @@ { tehkanwc_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tehkanwc_colorram_w ) { tehkanwc_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( tehkanwc_videoram2_w ) { tehkanwc_state *state = space->machine().driver_data(); state->m_videoram2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( tehkanwc_scroll_x_w ) @@ -45,7 +45,7 @@ WRITE8_HANDLER( tehkanwc_scroll_y_w ) { tehkanwc_state *state = space->machine().driver_data(); - tilemap_set_scrolly(state->m_bg_tilemap, 0, data); + state->m_bg_tilemap->set_scrolly(0, data); } WRITE8_HANDLER( tehkanwc_flipscreen_x_w ) @@ -89,7 +89,7 @@ int color = attr & 0x0f; int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0); - tileinfo->category = (attr & 0x20) ? 0 : 1; + tileinfo.category = (attr & 0x20) ? 0 : 1; SET_TILE_INFO(0, code, color, flags); } @@ -103,7 +103,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } /* @@ -123,7 +123,7 @@ bit 7 = enable (0 = display off) */ -static void gridiron_draw_led(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 led,int player) +static void gridiron_draw_led(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 led,int player) { if (led&0x80) output_set_digit_value(player, led&0x7f); @@ -131,7 +131,7 @@ output_set_digit_value(player, 0x00); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tehkanwc_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -164,15 +164,15 @@ } } -SCREEN_UPDATE( tehkanwc ) +SCREEN_UPDATE_IND16( tehkanwc ) { - tehkanwc_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_x[0] + 256 * state->m_scroll_x[1]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 1, 0); - gridiron_draw_led(screen->machine(), bitmap, cliprect, state->m_led0, 0); - gridiron_draw_led(screen->machine(), bitmap, cliprect, state->m_led1, 1); + tehkanwc_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_x[0] + 256 * state->m_scroll_x[1]); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 1, 0); + gridiron_draw_led(screen.machine(), bitmap, cliprect, state->m_led0, 0); + gridiron_draw_led(screen.machine(), bitmap, cliprect, state->m_led1, 1); return 0; } diff -Nru mame-0.144/src/mame/video/terracre.c mame-0.145/src/mame/video/terracre.c --- mame-0.144/src/mame/video/terracre.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/terracre.c 2012-02-06 21:30:31.000000000 +0000 @@ -31,7 +31,7 @@ SET_TILE_INFO( 0,data&0xff,0,0 ); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { terracre_state *state = machine.driver_data(); const UINT8 *spritepalettebank = machine.region("user1")->base(); @@ -155,7 +155,7 @@ { terracre_state *state = space->machine().driver_data(); COMBINE_DATA( &state->m_amazon_videoram[offset] ); - tilemap_mark_tile_dirty( state->m_background, offset ); + state->m_background->mark_tile_dirty(offset ); } WRITE16_HANDLER( amazon_foreground_w ) @@ -163,7 +163,7 @@ terracre_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA( &videoram[offset] ); - tilemap_mark_tile_dirty( state->m_foreground, offset ); + state->m_foreground->mark_tile_dirty(offset ); } WRITE16_HANDLER( amazon_flipscreen_w ) @@ -180,14 +180,14 @@ { terracre_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_yscroll); - tilemap_set_scrolly(state->m_background,0,state->m_yscroll); + state->m_background->set_scrolly(0,state->m_yscroll); } WRITE16_HANDLER( amazon_scrollx_w ) { terracre_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_xscroll); - tilemap_set_scrollx(state->m_background,0,state->m_xscroll); + state->m_background->set_scrollx(0,state->m_xscroll); } VIDEO_START( amazon ) @@ -195,22 +195,22 @@ terracre_state *state = machine.driver_data(); state->m_background = tilemap_create(machine, get_bg_tile_info,tilemap_scan_cols,16,16,64,32); state->m_foreground = tilemap_create(machine, get_fg_tile_info,tilemap_scan_cols,8,8,64,32); - tilemap_set_transparent_pen(state->m_foreground,0xf); + state->m_foreground->set_transparent_pen(0xf); /* register for saving */ state_save_register_global(machine, state->m_xscroll); state_save_register_global(machine, state->m_yscroll); } -SCREEN_UPDATE( amazon ) +SCREEN_UPDATE_IND16( amazon ) { - terracre_state *state = screen->machine().driver_data(); + terracre_state *state = screen.machine().driver_data(); if( state->m_xscroll&0x2000 ) - bitmap_fill( bitmap,cliprect ,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect ); else - tilemap_draw( bitmap,cliprect, state->m_background, 0, 0 ); + state->m_background->draw(bitmap, cliprect, 0, 0 ); - draw_sprites(screen->machine(), bitmap,cliprect ); - tilemap_draw( bitmap,cliprect, state->m_foreground, 0, 0 ); + draw_sprites(screen.machine(), bitmap,cliprect ); + state->m_foreground->draw(bitmap, cliprect, 0, 0 ); return 0; } diff -Nru mame-0.144/src/mame/video/tetrisp2.c mame-0.145/src/mame/video/tetrisp2.c --- mame-0.144/src/mame/video/tetrisp2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tetrisp2.c 2012-02-06 21:30:32.000000000 +0000 @@ -144,7 +144,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_bg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_bg,offset/2); + state->m_tilemap_bg->mark_tile_dirty(offset/2); } @@ -168,7 +168,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_fg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_fg,offset/2); + state->m_tilemap_fg->mark_tile_dirty(offset/2); } @@ -188,7 +188,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_rot[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_rot,offset/2); + state->m_tilemap_rot->mark_tile_dirty(offset/2); } static TILE_GET_INFO( get_tile_info_rocknms_sub_bg ) @@ -207,7 +207,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_rocknms_sub_vram_bg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_sub_bg,offset/2); + state->m_tilemap_sub_bg->mark_tile_dirty(offset/2); } @@ -227,7 +227,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_rocknms_sub_vram_fg[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_sub_fg,offset/2); + state->m_tilemap_sub_fg->mark_tile_dirty(offset/2); } @@ -247,7 +247,7 @@ { tetrisp2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_rocknms_sub_vram_rot[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_sub_rot,offset/2); + state->m_tilemap_sub_rot->mark_tile_dirty(offset/2); } @@ -269,9 +269,9 @@ 16,16,NX_0*2,NY_0*2); - tilemap_set_transparent_pen(state->m_tilemap_bg,0); - tilemap_set_transparent_pen(state->m_tilemap_fg,0); - tilemap_set_transparent_pen(state->m_tilemap_rot,0); + state->m_tilemap_bg->set_transparent_pen(0); + state->m_tilemap_fg->set_transparent_pen(0); + state->m_tilemap_rot->set_transparent_pen(0); // should be smaller and mirrored like m32 I guess state->m_priority = auto_alloc_array(machine, UINT8, 0x40000); @@ -282,7 +282,7 @@ { tetrisp2_state *state = machine.driver_data(); VIDEO_START_CALL( tetrisp2 ); - tilemap_set_scrolldx(state->m_tilemap_bg, -4,-4); + state->m_tilemap_bg->set_scrolldx(-4,-4); } VIDEO_START( rockntread ) @@ -302,9 +302,9 @@ 16, 16, 128, 128); - tilemap_set_transparent_pen(state->m_tilemap_bg, 0); - tilemap_set_transparent_pen(state->m_tilemap_fg, 0); - tilemap_set_transparent_pen(state->m_tilemap_rot, 0); + state->m_tilemap_bg->set_transparent_pen(0); + state->m_tilemap_fg->set_transparent_pen(0); + state->m_tilemap_rot->set_transparent_pen(0); // should be smaller and mirrored like m32 I guess state->m_priority = auto_alloc_array(machine, UINT8, 0x40000); @@ -329,9 +329,9 @@ 16, 16, 128, 128); - tilemap_set_transparent_pen(state->m_tilemap_sub_bg, 0); - tilemap_set_transparent_pen(state->m_tilemap_sub_fg, 0); - tilemap_set_transparent_pen(state->m_tilemap_sub_rot, 0); + state->m_tilemap_sub_bg->set_transparent_pen(0); + state->m_tilemap_sub_fg->set_transparent_pen(0); + state->m_tilemap_sub_rot->set_transparent_pen(0); ms32_rearrange_sprites(machine, "gfx5"); } @@ -380,7 +380,8 @@ /* sprites should be able to create shadows too, how? -- it appears that sprites which should be shadows are often rendered *UNDER* the tilemaps, maybe related? */ -static void tetrisp2_draw_sprites(running_machine &machine, bitmap_t *bitmap, bitmap_t *bitmap_pri, const rectangle *cliprect, UINT8* priority_ram, UINT16 *sprram_top, size_t sprram_size, int gfxnum, int flip) +template +static void tetrisp2_draw_sprites(running_machine &machine, _BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, UINT8* priority_ram, UINT16 *sprram_top, size_t sprram_size, int gfxnum, int flip) { int tx, ty, sx, sy, flipx, flipy; int xsize, ysize; @@ -459,9 +460,9 @@ ***************************************************************************/ -SCREEN_UPDATE( tetrisp2 ) +SCREEN_UPDATE_IND16( tetrisp2 ) { - tetrisp2_state *state = screen->machine().driver_data(); + tetrisp2_state *state = screen.machine().driver_data(); int flipscreen; int asc_pri; int scr_pri; @@ -471,14 +472,14 @@ flipscreen = (state->m_systemregs[0x00] & 0x02); /* Black background color */ - bitmap_fill(bitmap, cliprect, 0); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(0, cliprect); + screen.machine().priority_bitmap.fill(0); /* Flip Screen */ if (flipscreen != state->m_flipscreen_old) { state->m_flipscreen_old = flipscreen; - tilemap_set_flip_all(screen->machine(), flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + screen.machine().tilemap().set_flip_all(flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } /* Flip Screen */ @@ -493,14 +494,14 @@ rot_ofsy = 0x400; } - tilemap_set_scrollx(state->m_tilemap_bg, 0, (((state->m_scroll_bg[ 0 ] + 0x0014) + state->m_scroll_bg[ 2 ] ) & 0xffff)); - tilemap_set_scrolly(state->m_tilemap_bg, 0, (((state->m_scroll_bg[ 3 ] + 0x0000) + state->m_scroll_bg[ 5 ] ) & 0xffff)); + state->m_tilemap_bg->set_scrollx(0, (((state->m_scroll_bg[ 0 ] + 0x0014) + state->m_scroll_bg[ 2 ] ) & 0xffff)); + state->m_tilemap_bg->set_scrolly(0, (((state->m_scroll_bg[ 3 ] + 0x0000) + state->m_scroll_bg[ 5 ] ) & 0xffff)); - tilemap_set_scrollx(state->m_tilemap_fg, 0, state->m_scroll_fg[ 2 ]); - tilemap_set_scrolly(state->m_tilemap_fg, 0, state->m_scroll_fg[ 5 ]); + state->m_tilemap_fg->set_scrollx(0, state->m_scroll_fg[ 2 ]); + state->m_tilemap_fg->set_scrolly(0, state->m_scroll_fg[ 5 ]); - tilemap_set_scrollx(state->m_tilemap_rot, 0, (state->m_rotregs[ 0 ] - rot_ofsx)); - tilemap_set_scrolly(state->m_tilemap_rot, 0, (state->m_rotregs[ 2 ] - rot_ofsy)); + state->m_tilemap_rot->set_scrollx(0, (state->m_rotregs[ 0 ] - rot_ofsx)); + state->m_tilemap_rot->set_scrolly(0, (state->m_rotregs[ 2 ] - rot_ofsy)); asc_pri = scr_pri = rot_pri = 0; @@ -520,33 +521,33 @@ rot_pri++; if (rot_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); if (rot_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); if (rot_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); - tetrisp2_draw_sprites(screen->machine(), bitmap, screen->machine().priority_bitmap, cliprect, state->m_priority, screen->machine().generic.spriteram.u16, screen->machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); + tetrisp2_draw_sprites(screen.machine(), bitmap, screen.machine().priority_bitmap, cliprect, state->m_priority, screen.machine().generic.spriteram.u16, screen.machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); return 0; } -SCREEN_UPDATE( rockntread ) +SCREEN_UPDATE_IND16( rockntread ) { - tetrisp2_state *state = screen->machine().driver_data(); + tetrisp2_state *state = screen.machine().driver_data(); int flipscreen; int asc_pri; int scr_pri; @@ -556,14 +557,14 @@ flipscreen = (state->m_systemregs[0x00] & 0x02); /* Black background color */ - bitmap_fill(bitmap, cliprect, 0); - bitmap_fill(screen->machine().priority_bitmap, NULL, 0); + bitmap.fill(0, cliprect); + screen.machine().priority_bitmap.fill(0); /* Flip Screen */ if (flipscreen != state->m_flipscreen_old) { state->m_flipscreen_old = flipscreen; - tilemap_set_flip_all(screen->machine(), flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + screen.machine().tilemap().set_flip_all(flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } /* Flip Screen */ @@ -578,14 +579,14 @@ rot_ofsy = 0x400; } - tilemap_set_scrollx(state->m_tilemap_bg, 0, (((state->m_scroll_bg[ 0 ] + 0x0014) + state->m_scroll_bg[ 2 ] ) & 0xffff)); - tilemap_set_scrolly(state->m_tilemap_bg, 0, (((state->m_scroll_bg[ 3 ] + 0x0000) + state->m_scroll_bg[ 5 ] ) & 0xffff)); + state->m_tilemap_bg->set_scrollx(0, (((state->m_scroll_bg[ 0 ] + 0x0014) + state->m_scroll_bg[ 2 ] ) & 0xffff)); + state->m_tilemap_bg->set_scrolly(0, (((state->m_scroll_bg[ 3 ] + 0x0000) + state->m_scroll_bg[ 5 ] ) & 0xffff)); - tilemap_set_scrollx(state->m_tilemap_fg, 0, state->m_scroll_fg[ 2 ]); - tilemap_set_scrolly(state->m_tilemap_fg, 0, state->m_scroll_fg[ 5 ]); + state->m_tilemap_fg->set_scrollx(0, state->m_scroll_fg[ 2 ]); + state->m_tilemap_fg->set_scrolly(0, state->m_scroll_fg[ 5 ]); - tilemap_set_scrollx(state->m_tilemap_rot, 0, (state->m_rotregs[ 0 ] - rot_ofsx)); - tilemap_set_scrolly(state->m_tilemap_rot, 0, (state->m_rotregs[ 2 ] - rot_ofsy)); + state->m_tilemap_rot->set_scrollx(0, (state->m_rotregs[ 0 ] - rot_ofsx)); + state->m_tilemap_rot->set_scrolly(0, (state->m_rotregs[ 2 ] - rot_ofsy)); asc_pri = scr_pri = rot_pri = 0; @@ -605,149 +606,150 @@ rot_pri++; if (rot_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); if (rot_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); if (rot_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); else if (scr_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); else if (asc_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); - tetrisp2_draw_sprites(screen->machine(), bitmap, screen->machine().priority_bitmap,cliprect, state->m_priority, screen->machine().generic.spriteram.u16, screen->machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); + tetrisp2_draw_sprites(screen.machine(), bitmap, screen.machine().priority_bitmap,cliprect, state->m_priority, screen.machine().generic.spriteram.u16, screen.machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); return 0; } -SCREEN_UPDATE( rocknms ) +SCREEN_UPDATE_RGB32( rocknms_left ) { - tetrisp2_state *state = screen->machine().driver_data(); + tetrisp2_state *state = screen.machine().driver_data(); int asc_pri; int scr_pri; int rot_pri; - device_t *left_screen = screen->machine().device("lscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + state->m_tilemap_sub_bg->set_scrollx(0, state->m_rocknms_sub_scroll_bg[ 2 ] + 0x000); + state->m_tilemap_sub_bg->set_scrolly(0, state->m_rocknms_sub_scroll_bg[ 5 ] + 0x000); + state->m_tilemap_sub_fg->set_scrollx(0, state->m_rocknms_sub_scroll_fg[ 2 ] + 0x000); + state->m_tilemap_sub_fg->set_scrolly(0, state->m_rocknms_sub_scroll_fg[ 5 ] + 0x000); + state->m_tilemap_sub_rot->set_scrollx(0, state->m_rocknms_sub_rotregs[ 0 ] + 0x400); + state->m_tilemap_sub_rot->set_scrolly(0, state->m_rocknms_sub_rotregs[ 2 ] + 0x400); + + bitmap.fill(screen.machine().pens[0x0000], cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); + + asc_pri = scr_pri = rot_pri = 0; + + if((state->m_rocknms_sub_priority[0x2b00 / 2] & 0x00ff) == 0x0034) + asc_pri++; + else + rot_pri++; + + if((state->m_rocknms_sub_priority[0x2e00 / 2] & 0x00ff) == 0x0034) + asc_pri++; + else + scr_pri++; + + if((state->m_rocknms_sub_priority[0x3a00 / 2] & 0x00ff) == 0x000c) + scr_pri++; + else + rot_pri++; + + if (rot_pri == 0) + state->m_tilemap_sub_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 0) + state->m_tilemap_sub_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 0) + state->m_tilemap_sub_fg->draw(bitmap, cliprect, 0, 1 << 2); + + if (rot_pri == 1) + state->m_tilemap_sub_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 1) + state->m_tilemap_sub_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 1) + state->m_tilemap_sub_fg->draw(bitmap, cliprect, 0, 1 << 2); + + if (rot_pri == 2) + state->m_tilemap_sub_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 2) + state->m_tilemap_sub_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 2) + state->m_tilemap_sub_fg->draw(bitmap, cliprect, 0, 1 << 2); + + tetrisp2_draw_sprites(screen.machine(), bitmap, screen.machine().priority_bitmap,cliprect, state->m_priority, screen.machine().generic.spriteram2.u16, screen.machine().generic.spriteram2_size, 4, (state->m_systemregs[0x00] & 0x02)); + + return 0; +} + +SCREEN_UPDATE_RGB32( rocknms_right ) +{ + tetrisp2_state *state = screen.machine().driver_data(); + int asc_pri; + int scr_pri; + int rot_pri; + + state->m_tilemap_bg->set_scrollx(0, state->m_scroll_bg[ 2 ] + 0x000); + state->m_tilemap_bg->set_scrolly(0, state->m_scroll_bg[ 5 ] + 0x000); + state->m_tilemap_fg->set_scrollx(0, state->m_scroll_fg[ 2 ] + 0x000); + state->m_tilemap_fg->set_scrolly(0, state->m_scroll_fg[ 5 ] + 0x000); + state->m_tilemap_rot->set_scrollx(0, state->m_rotregs[ 0 ] + 0x400); + state->m_tilemap_rot->set_scrolly(0, state->m_rotregs[ 2 ] + 0x400); /* Black background color */ - if (screen == left_screen) - { - tilemap_set_scrollx(state->m_tilemap_sub_bg, 0, state->m_rocknms_sub_scroll_bg[ 2 ] + 0x000); - tilemap_set_scrolly(state->m_tilemap_sub_bg, 0, state->m_rocknms_sub_scroll_bg[ 5 ] + 0x000); - tilemap_set_scrollx(state->m_tilemap_sub_fg, 0, state->m_rocknms_sub_scroll_fg[ 2 ] + 0x000); - tilemap_set_scrolly(state->m_tilemap_sub_fg, 0, state->m_rocknms_sub_scroll_fg[ 5 ] + 0x000); - tilemap_set_scrollx(state->m_tilemap_sub_rot, 0, state->m_rocknms_sub_rotregs[ 0 ] + 0x400); - tilemap_set_scrolly(state->m_tilemap_sub_rot, 0, state->m_rocknms_sub_rotregs[ 2 ] + 0x400); - - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x0000]); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - asc_pri = scr_pri = rot_pri = 0; - - if((state->m_rocknms_sub_priority[0x2b00 / 2] & 0x00ff) == 0x0034) - asc_pri++; - else - rot_pri++; - - if((state->m_rocknms_sub_priority[0x2e00 / 2] & 0x00ff) == 0x0034) - asc_pri++; - else - scr_pri++; - - if((state->m_rocknms_sub_priority[0x3a00 / 2] & 0x00ff) == 0x000c) - scr_pri++; - else - rot_pri++; - - if (rot_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_rot, 0, 1 << 1); - else if (scr_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_bg, 0, 1 << 0); - else if (asc_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_fg, 0, 1 << 2); - - if (rot_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_rot, 0, 1 << 1); - else if (scr_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_bg, 0, 1 << 0); - else if (asc_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_fg, 0, 1 << 2); - - if (rot_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_rot, 0, 1 << 1); - else if (scr_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_bg, 0, 1 << 0); - else if (asc_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_sub_fg, 0, 1 << 2); + bitmap.fill(screen.machine().pens[0x0000], cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - tetrisp2_draw_sprites(screen->machine(), bitmap, screen->machine().priority_bitmap,cliprect, state->m_priority, screen->machine().generic.spriteram2.u16, screen->machine().generic.spriteram2_size, 4, (state->m_systemregs[0x00] & 0x02)); - } - else if (screen == right_screen) /* game screen */ - { - tilemap_set_scrollx(state->m_tilemap_bg, 0, state->m_scroll_bg[ 2 ] + 0x000); - tilemap_set_scrolly(state->m_tilemap_bg, 0, state->m_scroll_bg[ 5 ] + 0x000); - tilemap_set_scrollx(state->m_tilemap_fg, 0, state->m_scroll_fg[ 2 ] + 0x000); - tilemap_set_scrolly(state->m_tilemap_fg, 0, state->m_scroll_fg[ 5 ] + 0x000); - tilemap_set_scrollx(state->m_tilemap_rot, 0, state->m_rotregs[ 0 ] + 0x400); - tilemap_set_scrolly(state->m_tilemap_rot, 0, state->m_rotregs[ 2 ] + 0x400); - - /* Black background color */ - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x0000]); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - - asc_pri = scr_pri = rot_pri = 0; - - if((state->m_priority[0x2b00 / 2] & 0x00ff) == 0x0034) - asc_pri++; - else - rot_pri++; - - if((state->m_priority[0x2e00 / 2] & 0x00ff) == 0x0034) - asc_pri++; - else - scr_pri++; - - if((state->m_priority[0x3a00 / 2] & 0x00ff) == 0x000c) - scr_pri++; - else - rot_pri++; - - if (rot_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); - else if (scr_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); - else if (asc_pri == 0) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); - - if (rot_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); - else if (scr_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); - else if (asc_pri == 1) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); - - if (rot_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_rot, 0, 1 << 1); - else if (scr_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_bg, 0, 1 << 0); - else if (asc_pri == 2) - tilemap_draw(bitmap,cliprect, state->m_tilemap_fg, 0, 1 << 2); + asc_pri = scr_pri = rot_pri = 0; - tetrisp2_draw_sprites(screen->machine(), bitmap, screen->machine().priority_bitmap,cliprect, state->m_priority, screen->machine().generic.spriteram.u16, screen->machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); - } + if((state->m_priority[0x2b00 / 2] & 0x00ff) == 0x0034) + asc_pri++; + else + rot_pri++; + + if((state->m_priority[0x2e00 / 2] & 0x00ff) == 0x0034) + asc_pri++; + else + scr_pri++; + + if((state->m_priority[0x3a00 / 2] & 0x00ff) == 0x000c) + scr_pri++; + else + rot_pri++; + + if (rot_pri == 0) + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 0) + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 0) + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); + + if (rot_pri == 1) + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 1) + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 1) + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); + + if (rot_pri == 2) + state->m_tilemap_rot->draw(bitmap, cliprect, 0, 1 << 1); + else if (scr_pri == 2) + state->m_tilemap_bg->draw(bitmap, cliprect, 0, 1 << 0); + else if (asc_pri == 2) + state->m_tilemap_fg->draw(bitmap, cliprect, 0, 1 << 2); + + tetrisp2_draw_sprites(screen.machine(), bitmap, screen.machine().priority_bitmap,cliprect, state->m_priority, screen.machine().generic.spriteram.u16, screen.machine().generic.spriteram_size, 0, (state->m_systemregs[0x00] & 0x02)); return 0; } diff -Nru mame-0.144/src/mame/video/thedeep.c mame-0.145/src/mame/video/thedeep.c --- mame-0.144/src/mame/video/thedeep.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/thedeep.c 2012-02-06 21:30:32.000000000 +0000 @@ -71,14 +71,14 @@ { thedeep_state *state = space->machine().driver_data(); state->m_vram_0[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_0, offset / 2); + state->m_tilemap_0->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( thedeep_vram_1_w ) { thedeep_state *state = space->machine().driver_data(); state->m_vram_1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_1, offset / 2); + state->m_tilemap_1->mark_tile_dirty(offset / 2); } @@ -107,10 +107,10 @@ state->m_tilemap_0 = tilemap_create(machine, get_tile_info_0,tilemap_scan_rows_back,16,16,0x20,0x20); state->m_tilemap_1 = tilemap_create(machine, get_tile_info_1,tilemap_scan_rows,8,8,0x20,0x20); - tilemap_set_transparent_pen( state->m_tilemap_0, 0 ); - tilemap_set_transparent_pen( state->m_tilemap_1, 0 ); + state->m_tilemap_0->set_transparent_pen(0 ); + state->m_tilemap_1->set_transparent_pen(0 ); - tilemap_set_scroll_cols(state->m_tilemap_0, 0x20); // column scroll for the background + state->m_tilemap_0->set_scroll_cols(0x20); // column scroll for the background } /*************************************************************************** @@ -147,7 +147,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { thedeep_state *state = machine.driver_data(); UINT8 *s = state->m_spriteram, *end = s + state->m_spriteram_size; @@ -209,25 +209,25 @@ ***************************************************************************/ -SCREEN_UPDATE( thedeep ) +SCREEN_UPDATE_IND16( thedeep ) { - thedeep_state *state = screen->machine().driver_data(); + thedeep_state *state = screen.machine().driver_data(); int scrollx = state->m_scroll[0] + (state->m_scroll[1]<<8); int scrolly = state->m_scroll[2] + (state->m_scroll[3]<<8); int x; - tilemap_set_scrollx(state->m_tilemap_0, 0, scrollx); + state->m_tilemap_0->set_scrollx(0, scrollx); for (x = 0; x < 0x20; x++) { int y = state->m_scroll2[x*2+0] + (state->m_scroll2[x*2+1]<<8); - tilemap_set_scrolly(state->m_tilemap_0, x, y + scrolly); + state->m_tilemap_0->set_scrolly(x, y + scrolly); } - bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); - tilemap_draw(bitmap,cliprect,state->m_tilemap_0,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_tilemap_1,0,0); + state->m_tilemap_0->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_tilemap_1->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/thepit.c mame-0.145/src/mame/video/thepit.c --- mame-0.144/src/mame/video/thepit.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/thepit.c 2012-02-06 21:30:32.000000000 +0000 @@ -10,20 +10,6 @@ #include "includes/thepit.h" -static const rectangle spritevisiblearea = -{ - 2*8+1, 32*8-1, - 2*8, 30*8-1 -}; - -static const rectangle spritevisibleareaflipx = -{ - 0*8, 30*8-2, - 2*8, 30*8-1 -}; - - - /*************************************************************************** Convert the color PROMs into a more useable format. @@ -112,9 +98,9 @@ thepit_state *state = machine.driver_data(); UINT8 back_color = (state->m_colorram[tile_index] & 0x70) >> 4; int priority = (back_color != 0) && ((state->m_colorram[tile_index] & 0x80) == 0); - tileinfo->pen_data = state->m_dummy_tile; - tileinfo->palette_base = back_color + 32; - tileinfo->category = priority; + tileinfo.pen_data = state->m_dummy_tile; + tileinfo.palette_base = back_color + 32; + tileinfo.category = priority; } @@ -140,10 +126,10 @@ state->m_solid_tilemap = tilemap_create(machine, solid_get_tile_info,tilemap_scan_rows,8,8,32,32); state->m_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_tilemap, 0); + state->m_tilemap->set_transparent_pen(0); - tilemap_set_scroll_cols(state->m_solid_tilemap, 32); - tilemap_set_scroll_cols(state->m_tilemap, 32); + state->m_solid_tilemap->set_scroll_cols(32); + state->m_tilemap->set_scroll_cols(32); state->m_dummy_tile = auto_alloc_array_clear(machine, UINT8, 8*8); @@ -162,7 +148,7 @@ { thepit_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); } @@ -170,8 +156,8 @@ { thepit_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap, offset); - tilemap_mark_tile_dirty(state->m_solid_tilemap, offset); + state->m_tilemap->mark_tile_dirty(offset); + state->m_solid_tilemap->mark_tile_dirty(offset); } @@ -186,8 +172,8 @@ if (state->m_flip_screen_y) flip |= TILEMAP_FLIPY ; - tilemap_set_flip(state->m_tilemap, flip); - tilemap_set_flip(state->m_solid_tilemap, flip); + state->m_tilemap->set_flip(flip); + state->m_solid_tilemap->set_flip(flip); } @@ -203,8 +189,8 @@ if (state->m_flip_screen_y) flip |= TILEMAP_FLIPY ; - tilemap_set_flip(state->m_tilemap, flip); - tilemap_set_flip(state->m_solid_tilemap, flip); + state->m_tilemap->set_flip(flip); + state->m_solid_tilemap->set_flip(flip); } @@ -216,7 +202,7 @@ { state->m_graphics_bank = data & 0x01; - tilemap_mark_all_tiles_dirty(state->m_tilemap); + state->m_tilemap->mark_all_dirty(); } } @@ -245,10 +231,13 @@ *************************************/ static void draw_sprites(running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + bitmap_ind16 &bitmap, + const rectangle &cliprect, int priority_to_draw) { + const rectangle spritevisiblearea(2*8+1, 32*8-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflipx(0*8, 30*8-2, 2*8, 30*8-1); + thepit_state *state = machine.driver_data(); int offs; @@ -284,7 +273,7 @@ /* sprites 0-3 are drawn one pixel down */ if (offs < 16) y++; - drawgfx_transpen(bitmap, state->m_flip_screen_x ? &spritevisibleareaflipx : &spritevisiblearea, + drawgfx_transpen(bitmap, state->m_flip_screen_x ? spritevisibleareaflipx : spritevisiblearea, machine.gfx[2 * state->m_graphics_bank + 1], state->m_spriteram[offs + 1] & 0x3f, state->m_spriteram[offs + 2], @@ -294,9 +283,9 @@ } -SCREEN_UPDATE( thepit ) +SCREEN_UPDATE_IND16( thepit ) { - thepit_state *state = screen->machine().driver_data(); + thepit_state *state = screen.machine().driver_data(); offs_t offs; for (offs = 0; offs < 32; offs++) @@ -304,25 +293,25 @@ int xshift = state->m_flip_screen_x ? 128 : 0; int yshift = state->m_flip_screen_y ? -8 : 0; - tilemap_set_scrollx(state->m_tilemap, offs, xshift); - tilemap_set_scrollx(state->m_solid_tilemap, offs, xshift); + state->m_tilemap->set_scrollx(offs, xshift); + state->m_solid_tilemap->set_scrollx(offs, xshift); - tilemap_set_scrolly(state->m_tilemap, offs, yshift + state->m_attributesram[offs << 1]); - tilemap_set_scrolly(state->m_solid_tilemap, offs, yshift + state->m_attributesram[offs << 1]); + state->m_tilemap->set_scrolly(offs, yshift + state->m_attributesram[offs << 1]); + state->m_solid_tilemap->set_scrolly(offs, yshift + state->m_attributesram[offs << 1]); } /* low priority tiles */ - tilemap_draw(bitmap, cliprect, state->m_solid_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_solid_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); /* low priority sprites */ - draw_sprites(screen->machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); /* high priority tiles */ - tilemap_draw(bitmap, cliprect, state->m_solid_tilemap, 1, 1); + state->m_solid_tilemap->draw(bitmap, cliprect, 1, 1); /* high priority sprites */ - draw_sprites(screen->machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, 1); return 0; } diff -Nru mame-0.144/src/mame/video/thief.c mame-0.145/src/mame/video/thief.c --- mame-0.144/src/mame/video/thief.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/thief.c 2012-02-06 21:30:31.000000000 +0000 @@ -107,16 +107,16 @@ state->m_coprocessor.context_ram = auto_alloc_array(machine, UINT8, 0x400 ); } -SCREEN_UPDATE( thief ){ - thief_state *state = screen->machine().driver_data(); +SCREEN_UPDATE_IND16( thief ){ + thief_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT32 offs; int flipscreen = state->m_video_control&1; const UINT8 *source = videoram; - if (tms9927_screen_reset(screen->machine().device("tms"))) + if (tms9927_screen_reset(screen.machine().device("tms"))) { - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); return 0; } @@ -133,7 +133,7 @@ int bit; if( flipscreen ){ for( bit=0; bit<8; bit++ ){ - *BITMAP_ADDR16(bitmap, 0xff - ypos, 0xff - (xpos+bit)) = + bitmap.pix16(0xff - ypos, 0xff - (xpos+bit)) = (((plane0<>7) | (((plane1<>6) | (((plane2<>5) | @@ -142,7 +142,7 @@ } else { for( bit=0; bit<8; bit++ ){ - *BITMAP_ADDR16(bitmap, ypos, xpos+bit) = + bitmap.pix16(ypos, xpos+bit) = (((plane0<>7) | (((plane1<>6) | (((plane2<>5) | diff -Nru mame-0.144/src/mame/video/thoop2.c mame-0.145/src/mame/video/thoop2.c --- mame-0.144/src/mame/video/thoop2.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/thoop2.c 2012-02-06 21:30:32.000000000 +0000 @@ -43,7 +43,7 @@ int data2 = state->m_videoram[(tile_index << 1) + 1]; int code = ((data & 0xfffc) >> 2) | ((data & 0x0003) << 14); - tileinfo->category = (data2 >> 6) & 0x03; + tileinfo.category = (data2 >> 6) & 0x03; SET_TILE_INFO(1, code, data2 & 0x3f, TILE_FLIPYX((data2 >> 14) & 0x03)); } @@ -56,7 +56,7 @@ int data2 = state->m_videoram[(0x1000/2) + (tile_index << 1) + 1]; int code = ((data & 0xfffc) >> 2) | ((data & 0x0003) << 14); - tileinfo->category = (data2 >> 6) & 0x03; + tileinfo.category = (data2 >> 6) & 0x03; SET_TILE_INFO(1, code, data2 & 0x3f, TILE_FLIPYX((data2 >> 14) & 0x03)); } @@ -71,7 +71,7 @@ { thoop2_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_pant[offset >> 11],((offset << 1) & 0x0fff) >> 2); + state->m_pant[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); } /*************************************************************************** @@ -88,8 +88,8 @@ state->m_pant[0] = tilemap_create(machine, get_tile_info_thoop2_screen0,tilemap_scan_rows,16,16,32,32); state->m_pant[1] = tilemap_create(machine, get_tile_info_thoop2_screen1,tilemap_scan_rows,16,16,32,32); - tilemap_set_transmask(state->m_pant[0],0,0xff01,0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ - tilemap_set_transmask(state->m_pant[1],0,0xff01,0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ + state->m_pant[0]->set_transmask(0,0xff01,0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ + state->m_pant[1]->set_transmask(0,0xff01,0x00ff); /* pens 1-7 opaque, pens 0, 8-15 transparent */ for (i = 0; i < 5; i++){ state->m_sprite_table[i] = auto_alloc_array(machine, int, 512); @@ -148,7 +148,7 @@ 3 | xxxxxxxx xxxxxx-- | sprite code (low bits) */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int pri) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) { thoop2_state *state = machine.driver_data(); int j, x, y, ex, ey; @@ -199,43 +199,43 @@ ***************************************************************************/ -SCREEN_UPDATE( thoop2 ) +SCREEN_UPDATE_IND16( thoop2 ) { - thoop2_state *state = screen->machine().driver_data(); + thoop2_state *state = screen.machine().driver_data(); /* set scroll registers */ - tilemap_set_scrolly(state->m_pant[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_pant[0], 0, state->m_vregs[1]+4); - tilemap_set_scrolly(state->m_pant[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_pant[1], 0, state->m_vregs[3]); - - thoop2_sort_sprites(screen->machine()); - - bitmap_fill( bitmap, cliprect , 0); - - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER1 | 3,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER1 | 3,0); - draw_sprites(screen->machine(), bitmap,cliprect,3); - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER0 | 3,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER0 | 3,0); - - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER1 | 2,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER1 | 2,0); - draw_sprites(screen->machine(), bitmap,cliprect,2); - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER0 | 2,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER0 | 2,0); - - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER1 | 1,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER1 | 1,0); - draw_sprites(screen->machine(), bitmap,cliprect,1); - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER0 | 1,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER0 | 1,0); - - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER1 | 0,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER1 | 0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_LAYER0 | 0,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_LAYER0 | 0,0); + state->m_pant[0]->set_scrolly(0, state->m_vregs[0]); + state->m_pant[0]->set_scrollx(0, state->m_vregs[1]+4); + state->m_pant[1]->set_scrolly(0, state->m_vregs[2]); + state->m_pant[1]->set_scrollx(0, state->m_vregs[3]); + + thoop2_sort_sprites(screen.machine()); + + bitmap.fill(0, cliprect ); + + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 3,0); + draw_sprites(screen.machine(), bitmap,cliprect,3); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 3,0); + + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 2,0); + draw_sprites(screen.machine(), bitmap,cliprect,2); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 2,0); + + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1,0); + draw_sprites(screen.machine(), bitmap,cliprect,1); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1,0); + + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0,0); - draw_sprites(screen->machine(), bitmap,cliprect,4); + draw_sprites(screen.machine(), bitmap,cliprect,4); return 0; } diff -Nru mame-0.144/src/mame/video/thunderj.c mame-0.145/src/mame/video/thunderj.c --- mame-0.144/src/mame/video/thunderj.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/thunderj.c 2012-02-06 21:30:31.000000000 +0000 @@ -36,7 +36,7 @@ int code = data1 & 0x7fff; int color = 0x10 + (data2 & 0x0f); SET_TILE_INFO(0, code, color, (data1 >> 15) & 1); - tileinfo->category = (data2 >> 4) & 3; + tileinfo.category = (data2 >> 4) & 3; } @@ -48,7 +48,7 @@ int code = data1 & 0x7fff; int color = data2 & 0x0f; SET_TILE_INFO(0, code, color, (data1 >> 15) & 1); - tileinfo->category = (data2 >> 4) & 3; + tileinfo.category = (data2 >> 4) & 3; } @@ -104,14 +104,14 @@ /* initialize the second playfield */ state->m_playfield2_tilemap = tilemap_create(machine, get_playfield2_tile_info, tilemap_scan_cols, 8,8, 64,64); - tilemap_set_transparent_pen(state->m_playfield2_tilemap, 0); + state->m_playfield2_tilemap->set_transparent_pen(0); /* initialize the motion objects */ atarimo_init(machine, 0, &modesc); /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); } @@ -122,33 +122,33 @@ * *************************************/ -SCREEN_UPDATE( thunderj ) +SCREEN_UPDATE_IND16( thunderj ) { - thunderj_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; + thunderj_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0x00); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 1, 0x01); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 2, 0x02); - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 3, 0x03); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 0, 0x80); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 1, 0x84); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 2, 0x88); - tilemap_draw(bitmap, cliprect, state->m_playfield2_tilemap, 3, 0x8c); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0x00); + state->m_playfield_tilemap->draw(bitmap, cliprect, 1, 0x01); + state->m_playfield_tilemap->draw(bitmap, cliprect, 2, 0x02); + state->m_playfield_tilemap->draw(bitmap, cliprect, 3, 0x03); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 0, 0x80); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 1, 0x84); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 2, 0x88); + state->m_playfield2_tilemap->draw(bitmap, cliprect, 3, 0x8c); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; - UINT8 *pri = (UINT8 *)priority_bitmap->base + priority_bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -238,15 +238,15 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/thunderx.c mame-0.145/src/mame/video/thunderx.c --- mame-0.144/src/mame/video/thunderx.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/thunderx.c 2012-02-06 21:30:31.000000000 +0000 @@ -66,16 +66,16 @@ ***************************************************************************/ -SCREEN_UPDATE( scontra ) +SCREEN_UPDATE_IND16( scontra ) { - thunderx_state *state = screen->machine().driver_data(); + thunderx_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* The background color is always from layer 1 - but it's always black anyway */ -// bitmap_fill(bitmap,cliprect,16 * state->m_layer_colorbase[1]); +// bitmap.fill(16 * state->m_layer_colorbase[1], cliprect); if (state->m_priority) { k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, 2, TILEMAP_DRAW_OPAQUE, 1); diff -Nru mame-0.144/src/mame/video/tia.c mame-0.145/src/mame/video/tia.c --- mame-0.144/src/mame/video/tia.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/tia.c 2012-02-06 21:30:31.000000000 +0000 @@ -106,7 +106,7 @@ static UINT8 REFLECT; /* Should playfield be reflected or not */ static UINT8 NUSIZx_changed; -static bitmap_t *helper[3]; +static bitmap_ind16 *helper[3]; static UINT16 screen_height; @@ -274,16 +274,16 @@ int cx = machine.primary_screen->width(); screen_height = machine.primary_screen->height(); - helper[0] = auto_bitmap_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT, machine.primary_screen->format()); - helper[1] = auto_bitmap_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT, machine.primary_screen->format()); - helper[2] = auto_bitmap_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT, machine.primary_screen->format()); + helper[0] = auto_bitmap_ind16_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT); + helper[1] = auto_bitmap_ind16_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT); + helper[2] = auto_bitmap_ind16_alloc(machine, cx, TIA_MAX_SCREEN_HEIGHT); } -SCREEN_UPDATE( tia ) +SCREEN_UPDATE_IND16( tia ) { - screen_height = screen->height(); - copybitmap(bitmap, helper[2], 0, 0, 0, 0, cliprect); + screen_height = screen.height(); + copybitmap(bitmap, *helper[2], 0, 0, 0, 0, cliprect); return 0; } @@ -819,7 +819,7 @@ if (collision_check(lineM0, lineM1, colx1, x2)) CXPPMM |= 0x40; - p = BITMAP_ADDR16(helper[current_bitmap], y % screen_height, 34); + p = &helper[current_bitmap]->pix16(y % screen_height, 34); for (x = x1; x < x2; x++) { @@ -828,12 +828,12 @@ if ( x2 == 160 && y % screen_height == (screen_height - 1) ) { int t_y; - for ( t_y = 0; t_y < helper[2]->height; t_y++ ) { - UINT16* l0 = BITMAP_ADDR16( helper[current_bitmap], t_y, 0 ); - UINT16* l1 = BITMAP_ADDR16( helper[1 - current_bitmap], t_y, 0 ); - UINT16* l2 = BITMAP_ADDR16( helper[2], t_y, 0 ); + for ( t_y = 0; t_y < helper[2]->height(); t_y++ ) { + UINT16* l0 = &helper[current_bitmap]->pix16(t_y); + UINT16* l1 = &helper[1 - current_bitmap]->pix16(t_y); + UINT16* l2 = &helper[2]->pix16(t_y); int t_x; - for( t_x = 0; t_x < helper[2]->width; t_x++ ) { + for( t_x = 0; t_x < helper[2]->width(); t_x++ ) { if ( l0[t_x] != l1[t_x] ) { /* Combine both entries */ l2[t_x] = ( ( l0[t_x] + 1 ) << 7 ) | l1[t_x]; @@ -1188,7 +1188,7 @@ } if (curr_y < screen_height) { - memset(BITMAP_ADDR16(helper[current_bitmap], curr_y, 34), 0, 16); + memset(&helper[current_bitmap]->pix16(curr_y, 34), 0, 16); } prev_x = 8; diff -Nru mame-0.144/src/mame/video/tia.h mame-0.145/src/mame/video/tia.h --- mame-0.144/src/mame/video/tia.h 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tia.h 2012-02-06 21:30:31.000000000 +0000 @@ -16,7 +16,7 @@ PALETTE_INIT( tia_PAL ); VIDEO_START( tia ); -SCREEN_UPDATE( tia ); +SCREEN_UPDATE_IND16( tia ); READ8_HANDLER( tia_r ); WRITE8_HANDLER( tia_w ); diff -Nru mame-0.144/src/mame/video/tiamc1.c mame-0.145/src/mame/video/tiamc1.c --- mame-0.144/src/mame/video/tiamc1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tiamc1.c 2012-02-06 21:30:32.000000000 +0000 @@ -29,9 +29,9 @@ if(!(state->m_layers_ctrl & 1)) { state->m_tileram[offset] = data; if (offset < 1024) - tilemap_mark_tile_dirty(state->m_bg_tilemap1, offset & 0x3ff); + state->m_bg_tilemap1->mark_tile_dirty(offset & 0x3ff); else - tilemap_mark_tile_dirty(state->m_bg_tilemap2, offset & 0x3ff); + state->m_bg_tilemap2->mark_tile_dirty(offset & 0x3ff); } } @@ -39,7 +39,7 @@ { tiamc1_state *state = space->machine().driver_data(); if ((data & 128) != (state->m_layers_ctrl & 128)) - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); state->m_layers_ctrl = data; } @@ -165,7 +165,7 @@ gfx_element_set_source(machine.gfx[0], state->m_charram); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tiamc1_state *state = machine.driver_data(); int offs; @@ -189,32 +189,32 @@ } } -SCREEN_UPDATE( tiamc1 ) +SCREEN_UPDATE_IND16( tiamc1 ) { - tiamc1_state *state = screen->machine().driver_data(); + tiamc1_state *state = screen.machine().driver_data(); #if 0 int i; for (i = 0; i < 32; i++) { - tilemap_set_scrolly(state->m_bg_tilemap1, i, state->m_bg_vshift ^ 0xff); - tilemap_set_scrolly(state->m_bg_tilemap2, i, state->m_bg_vshift ^ 0xff); + state->m_bg_tilemap1->set_scrolly(i, state->m_bg_vshift ^ 0xff); + state->m_bg_tilemap2->set_scrolly(i, state->m_bg_vshift ^ 0xff); } for (i = 0; i < 32; i++) { - tilemap_set_scrollx(state->m_bg_tilemap1, i, state->m_bg_hshift ^ 0xff); - tilemap_set_scrollx(state->m_bg_tilemap2, i, state->m_bg_hshift ^ 0xff); + state->m_bg_tilemap1->set_scrollx(i, state->m_bg_hshift ^ 0xff); + state->m_bg_tilemap2->set_scrollx(i, state->m_bg_hshift ^ 0xff); } #endif if (state->m_layers_ctrl & 0x80) - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap2, 0, 0); + state->m_bg_tilemap2->draw(bitmap, cliprect, 0, 0); else - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap1, 0, 0); + state->m_bg_tilemap1->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tigeroad.c mame-0.145/src/mame/video/tigeroad.c --- mame-0.144/src/mame/video/tigeroad.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tigeroad.c 2012-02-06 21:30:31.000000000 +0000 @@ -7,7 +7,7 @@ tigeroad_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tigeroad_videoctrl_w ) @@ -24,7 +24,7 @@ if (flip_screen_get(space->machine()) != (data & 0x02)) { flip_screen_set(space->machine(), data & 0x02); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 2 selects bg char bank */ @@ -34,7 +34,7 @@ if (state->m_bgcharbank != bank) { state->m_bgcharbank = bank; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* bits 4-5 are coin lockouts */ @@ -59,15 +59,15 @@ switch (offset) { case 0: - tilemap_set_scrollx(state->m_bg_tilemap, 0, scroll); + state->m_bg_tilemap->set_scrollx(0, scroll); break; case 1: - tilemap_set_scrolly(state->m_bg_tilemap, 0, -scroll - 32 * 8); + state->m_bg_tilemap->set_scrolly(0, -scroll - 32 * 8); break; } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { UINT16 *source = &machine.generic.buffered_spriteram.u16[machine.generic.spriteram_size/2] - 4; UINT16 *finish = machine.generic.buffered_spriteram.u16; @@ -123,7 +123,7 @@ int flags = (attr & 0x20) ? TILE_FLIPX : 0; SET_TILE_INFO(1, code, color, flags); - tileinfo->group = (attr & 0x10) ? 1 : 0; + tileinfo.group = (attr & 0x10) ? 1 : 0; } static TILE_GET_INFO( get_fg_tile_info ) @@ -154,26 +154,30 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xffff, 0); - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x1ff, 0xfe00); + state->m_bg_tilemap->set_transmask(0, 0xffff, 0); + state->m_bg_tilemap->set_transmask(1, 0x1ff, 0xfe00); - tilemap_set_transparent_pen(state->m_fg_tilemap, 3); + state->m_fg_tilemap->set_transparent_pen(3); } -SCREEN_UPDATE( tigeroad ) +SCREEN_UPDATE_IND16( tigeroad ) { - tigeroad_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap, cliprect, 0); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 1); - //draw_sprites(screen->machine(), bitmap, cliprect, 1); draw priority sprites? - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 2); + tigeroad_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap, cliprect, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); + //draw_sprites(screen.machine(), bitmap, cliprect, 1); draw priority sprites? + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 2); return 0; } -SCREEN_EOF( tigeroad ) +SCREEN_VBLANK( tigeroad ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space, 0, 0, 0xffff); + buffer_spriteram16_w(space, 0, 0, 0xffff); + } } diff -Nru mame-0.144/src/mame/video/timelimt.c mame-0.145/src/mame/video/timelimt.c --- mame-0.144/src/mame/video/timelimt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/timelimt.c 2012-02-06 21:30:32.000000000 +0000 @@ -75,7 +75,7 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } /***************************************************************************/ @@ -85,14 +85,14 @@ timelimt_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( timelimt_bg_videoram_w ) { timelimt_state *state = space->machine().driver_data(); state->m_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( timelimt_scroll_x_lsb_w ) @@ -116,7 +116,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { timelimt_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -143,15 +143,15 @@ } -SCREEN_UPDATE( timelimt ) +SCREEN_UPDATE_IND16( timelimt ) { - timelimt_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scrolly); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + timelimt_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scrollx); + state->m_bg_tilemap->set_scrolly(0, state->m_scrolly); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/timeplt.c mame-0.145/src/mame/video/timeplt.c --- mame-0.144/src/mame/video/timeplt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/timeplt.c 2012-02-06 21:30:31.000000000 +0000 @@ -97,7 +97,7 @@ int color = attr & 0x1f; int flags = TILE_FLIPYX(attr >> 6); - tileinfo->category = (attr & 0x10) >> 4; + tileinfo.category = (attr & 0x10) >> 4; SET_TILE_INFO(0, code, color, flags); } @@ -109,7 +109,7 @@ int color = attr & 0x1f; int flags = 0;//TILE_FLIPYX(attr >> 6); - tileinfo->category = (attr & 0x80) >> 7; + tileinfo.category = (attr & 0x80) >> 7; SET_TILE_INFO(0, code, color, flags); } @@ -145,7 +145,7 @@ { timeplt_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -153,7 +153,7 @@ { timeplt_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -176,7 +176,7 @@ * *************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { timeplt_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -209,12 +209,12 @@ * *************************************/ -SCREEN_UPDATE( timeplt ) +SCREEN_UPDATE_IND16( timeplt ) { - timeplt_state *state = screen->machine().driver_data(); + timeplt_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 1, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 1, 0); return 0; } diff -Nru mame-0.144/src/mame/video/tmnt.c mame-0.145/src/mame/video/tmnt.c --- mame-0.144/src/mame/video/tmnt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tmnt.c 2012-02-06 21:30:32.000000000 +0000 @@ -275,7 +275,7 @@ tmnt_state *state = machine.driver_data(); state->m_roz_tilemap = tilemap_create(machine, glfgreat_get_roz_tile_info, tilemap_scan_rows, 16, 16, 512, 512); - tilemap_set_transparent_pen(state->m_roz_tilemap,0); + state->m_roz_tilemap->set_transparent_pen(0); state->m_glfgreat_roz_rom_bank = 0; state->m_glfgreat_roz_char_bank = 0; @@ -290,7 +290,7 @@ tmnt_state *state = machine.driver_data(); state->m_roz_tilemap = tilemap_create(machine, prmrsocr_get_roz_tile_info, tilemap_scan_rows, 16, 16, 512, 256); - tilemap_set_transparent_pen(state->m_roz_tilemap,0); + state->m_roz_tilemap->set_transparent_pen(0); state->m_prmrsocr_sprite_bank = 0; state->m_glfgreat_roz_char_bank = 0; @@ -341,7 +341,7 @@ state->m_last = data & 0x08; /* bit 5 = irq enable */ - interrupt_enable_w(space, 0, data & 0x20); + state->m_irq5_mask = data & 0x20; /* bit 7 = enable char ROM reading through the video RAM */ k052109_set_rmrd_line(state->m_k052109, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); @@ -408,7 +408,7 @@ if (state->m_blswhstl_rombank != ((data & 0x80) >> 7)) { state->m_blswhstl_rombank = (data & 0x80) >> 7; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* other bits unknown */ @@ -448,7 +448,7 @@ if (state->m_glfgreat_roz_rom_bank != (data & 0x20) >> 5) { state->m_glfgreat_roz_rom_bank = (data & 0x20) >> 5; - tilemap_mark_all_tiles_dirty(state->m_roz_tilemap); + state->m_roz_tilemap->mark_all_dirty(); } /* bit 6,7 = 53596 char bank selection for ROM test */ @@ -576,9 +576,9 @@ ***************************************************************************/ -SCREEN_UPDATE( mia ) +SCREEN_UPDATE_IND16( mia ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); @@ -591,9 +591,9 @@ return 0; } -SCREEN_UPDATE( tmnt ) +SCREEN_UPDATE_IND16( tmnt ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); k052109_tilemap_update(state->m_k052109); @@ -607,9 +607,9 @@ } -SCREEN_UPDATE( punkshot ) +SCREEN_UPDATE_IND16( punkshot ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); state->m_sprite_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI1); state->m_layer_colorbase[0] = k053251_get_palette_index(state->m_k053251, K053251_CI2); @@ -627,7 +627,7 @@ konami_sortlayers3(state->m_sorted_layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[0], TILEMAP_DRAW_OPAQUE, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[2], 0, 4); @@ -637,9 +637,9 @@ } -SCREEN_UPDATE( lgtnfght ) +SCREEN_UPDATE_IND16( lgtnfght ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); int bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -659,8 +659,8 @@ konami_sortlayers3(state->m_sorted_layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[0], 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[2], 0, 4); @@ -684,9 +684,9 @@ return state->m_glfgreat_pixel & 0xff; } -SCREEN_UPDATE( glfgreat ) +SCREEN_UPDATE_IND16( glfgreat ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); int bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -708,14 +708,14 @@ /* not sure about the 053936 priority, but it seems to work */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect,16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[0], 0, 1); if (state->m_layerpri[0] >= 0x30 && state->m_layerpri[1] < 0x30) { k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 1, 1); - state->m_glfgreat_pixel = *BITMAP_ADDR16(bitmap, 0x80, 0x105); + state->m_glfgreat_pixel = bitmap.pix16(0x80, 0x105); } k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[1], 0, 2); @@ -723,7 +723,7 @@ if (state->m_layerpri[1] >= 0x30 && state->m_layerpri[2] < 0x30) { k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 1, 1); - state->m_glfgreat_pixel = *BITMAP_ADDR16(bitmap, 0x80, 0x105); + state->m_glfgreat_pixel = bitmap.pix16(0x80, 0x105); } k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[2], 0, 4); @@ -731,16 +731,16 @@ if (state->m_layerpri[2] >= 0x30) { k053936_zoom_draw(state->m_k053936, bitmap, cliprect, state->m_roz_tilemap, 0, 1, 1); - state->m_glfgreat_pixel = *BITMAP_ADDR16(bitmap, 0x80, 0x105); + state->m_glfgreat_pixel = bitmap.pix16(0x80, 0x105); } k053245_sprites_draw(state->m_k053245, bitmap, cliprect); return 0; } -SCREEN_UPDATE( tmnt2 ) +SCREEN_UPDATE_IND16( tmnt2 ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); double brt; int i, newdim, newen, cb, ce; @@ -769,31 +769,31 @@ // dim all colors before it for (i = 0; i < cb; i++) - palette_set_pen_contrast(screen->machine(), i, brt); + palette_set_pen_contrast(screen.machine(), i, brt); // reset all colors in range for (i = cb; i < ce; i++) - palette_set_pen_contrast(screen->machine(), i, 1.0); + palette_set_pen_contrast(screen.machine(), i, 1.0); // dim all colors after it for (i = ce; i < 2048; i++) - palette_set_pen_contrast(screen->machine(), i, brt); + palette_set_pen_contrast(screen.machine(), i, brt); // toggle shadow/highlight if (~state->m_dim_c & 0x10) - palette_set_shadow_mode(screen->machine(), 1); + palette_set_shadow_mode(screen.machine(), 1); else - palette_set_shadow_mode(screen->machine(), 0); + palette_set_shadow_mode(screen.machine(), 0); } - SCREEN_UPDATE_CALL(lgtnfght); + SCREEN_UPDATE16_CALL(lgtnfght); return 0; } -SCREEN_UPDATE( thndrx2 ) +SCREEN_UPDATE_IND16( thndrx2 ) { - tmnt_state *state = screen->machine().driver_data(); + tmnt_state *state = screen.machine().driver_data(); int bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI0); @@ -813,8 +813,8 @@ konami_sortlayers3(state->m_sorted_layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(16 * bg_colorbase, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[0], 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, state->m_sorted_layer[2], 0, 4); @@ -831,8 +831,12 @@ ***************************************************************************/ -SCREEN_EOF( blswhstl ) +SCREEN_VBLANK( blswhstl ) { - tmnt_state *state = machine.driver_data(); - k053245_clear_buffer(state->m_k053245); + // on rising edge + if (vblank_on) + { + tmnt_state *state = screen.machine().driver_data(); + k053245_clear_buffer(state->m_k053245); + } } diff -Nru mame-0.144/src/mame/video/tnzs.c mame-0.145/src/mame/video/tnzs.c --- mame-0.144/src/mame/video/tnzs.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tnzs.c 2012-02-06 21:30:32.000000000 +0000 @@ -42,18 +42,20 @@ } -SCREEN_UPDATE( tnzs ) +SCREEN_UPDATE_IND16( tnzs ) { - bitmap_fill(bitmap, cliprect, 0x1f0); + bitmap.fill(0x1f0, cliprect); - screen->machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); - screen->machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); + screen.machine().device("spritegen")->set_fg_yoffsets( -0x12, 0x0e ); + screen.machine().device("spritegen")->set_bg_yoffsets( 0x1, -0x1 ); - screen->machine().device("spritegen")->seta001_draw_sprites(screen->machine(), bitmap, cliprect, 0x800, 0 ); + screen.machine().device("spritegen")->seta001_draw_sprites(screen.machine(), bitmap, cliprect, 0x800, 0 ); return 0; } -SCREEN_EOF( tnzs ) +SCREEN_VBLANK( tnzs ) { - machine.device("spritegen")->tnzs_eof(); + // rising edge + if (vblank_on) + screen.machine().device("spritegen")->tnzs_eof(); } diff -Nru mame-0.144/src/mame/video/toaplan1.c mame-0.145/src/mame/video/toaplan1.c --- mame-0.144/src/mame/video/toaplan1.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/toaplan1.c 2012-02-06 21:30:32.000000000 +0000 @@ -149,8 +149,8 @@ tile_number, color, 0); - if (state->m_pf1_tilevram16[2*tile_index+1] & 0x8000) tileinfo->pen_data = state->m_empty_tile; - tileinfo->category = (attrib & 0xf000) >> 12; + if (state->m_pf1_tilevram16[2*tile_index+1] & 0x8000) tileinfo.pen_data = state->m_empty_tile; + tileinfo.category = (attrib & 0xf000) >> 12; } static TILE_GET_INFO( get_pf2_tile_info ) @@ -166,8 +166,8 @@ tile_number, color, 0); - if (state->m_pf2_tilevram16[2*tile_index+1] & 0x8000) tileinfo->pen_data = state->m_empty_tile; - tileinfo->category = (attrib & 0xf000) >> 12; + if (state->m_pf2_tilevram16[2*tile_index+1] & 0x8000) tileinfo.pen_data = state->m_empty_tile; + tileinfo.category = (attrib & 0xf000) >> 12; } static TILE_GET_INFO( get_pf3_tile_info ) @@ -183,8 +183,8 @@ tile_number, color, 0); - if (state->m_pf3_tilevram16[2*tile_index+1] & 0x8000) tileinfo->pen_data = state->m_empty_tile; - tileinfo->category = (attrib & 0xf000) >> 12; + if (state->m_pf3_tilevram16[2*tile_index+1] & 0x8000) tileinfo.pen_data = state->m_empty_tile; + tileinfo.category = (attrib & 0xf000) >> 12; } static TILE_GET_INFO( get_pf4_tile_info ) @@ -200,8 +200,8 @@ tile_number, color, 0); - if (state->m_pf4_tilevram16[2*tile_index+1] & 0x8000) tileinfo->pen_data = state->m_empty_tile; - tileinfo->category = (attrib & 0xf000) >> 12; + if (state->m_pf4_tilevram16[2*tile_index+1] & 0x8000) tileinfo.pen_data = state->m_empty_tile; + tileinfo.category = (attrib & 0xf000) >> 12; } /*************************************************************************** @@ -219,10 +219,10 @@ state->m_pf3_tilemap = tilemap_create(machine, get_pf3_tile_info, tilemap_scan_rows, 8, 8, 64, 64); state->m_pf4_tilemap = tilemap_create(machine, get_pf4_tile_info, tilemap_scan_rows, 8, 8, 64, 64); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf2_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf3_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf4_tilemap, 0); + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf2_tilemap->set_transparent_pen(0); + state->m_pf3_tilemap->set_transparent_pen(0); + state->m_pf4_tilemap->set_transparent_pen(0); memset(state->m_empty_tile, 0x00, sizeof(state->m_empty_tile)); } @@ -281,14 +281,14 @@ { toaplan1_state *state = machine.driver_data(); - tilemap_set_scrollx(state->m_pf1_tilemap, 0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); - tilemap_set_scrollx(state->m_pf3_tilemap, 0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); - tilemap_set_scrollx(state->m_pf4_tilemap, 0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf3_tilemap, 0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf4_tilemap, 0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); + state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); + state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); + state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); + state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); } static void rallybik_flipscreen(running_machine &machine) @@ -425,7 +425,7 @@ { logerror("Setting BCU controller flipscreen port to %04x\n",data); state->m_bcu_flipscreen = data & 0x01; /* 0x0001 = flip, 0x0000 = no flip */ - tilemap_set_flip_all(space->machine(), (data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); + space->machine().tilemap().set_flip_all((data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); if (state->m_bcu_flipscreen) { state->m_scrollx_offs1 = 0x1c0 - 6; @@ -454,7 +454,7 @@ { logerror("Setting BCU controller flipscreen port to %04x\n",data); state->m_bcu_flipscreen = data & 0x01; /* 0x0001 = flip, 0x0000 = no flip */ - tilemap_set_flip_all(space->machine(), (data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); + space->machine().tilemap().set_flip_all((data ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); if (state->m_bcu_flipscreen) { const rectangle &visarea = space->machine().primary_screen->visible_area(); @@ -674,22 +674,22 @@ case 0x0000: vram_offset = ((state->m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1); COMBINE_DATA(&state->m_pf1_tilevram16[vram_offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap, vram_offset/2); + state->m_pf1_tilemap->mark_tile_dirty(vram_offset/2); break; case 0x1000: vram_offset = ((state->m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1); COMBINE_DATA(&state->m_pf2_tilevram16[vram_offset]); - tilemap_mark_tile_dirty(state->m_pf2_tilemap, vram_offset/2); + state->m_pf2_tilemap->mark_tile_dirty(vram_offset/2); break; case 0x2000: vram_offset = ((state->m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1); COMBINE_DATA(&state->m_pf3_tilevram16[vram_offset]); - tilemap_mark_tile_dirty(state->m_pf3_tilemap, vram_offset/2); + state->m_pf3_tilemap->mark_tile_dirty(vram_offset/2); break; case 0x3000: vram_offset = ((state->m_pf_voffs * 2) + offset) & ((TOAPLAN1_TILEVRAM_SIZE/2)-1); COMBINE_DATA(&state->m_pf4_tilevram16[vram_offset]); - tilemap_mark_tile_dirty(state->m_pf4_tilemap, vram_offset/2); + state->m_pf4_tilemap->mark_tile_dirty(vram_offset/2); break; default: logerror("Hmmm, writing %04x to unknown playfield layer address %06x Offset:%01x\n", data, state->m_pf_voffs, offset); @@ -728,28 +728,28 @@ switch(offset) { case 00: COMBINE_DATA(&state->m_pf1_scrollx); /* 1D3h */ - tilemap_set_scrollx(state->m_pf1_tilemap, 0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); + state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); break; case 01: COMBINE_DATA(&state->m_pf1_scrolly); /* 1EBh */ - tilemap_set_scrolly(state->m_pf1_tilemap, 0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); break; case 02: COMBINE_DATA(&state->m_pf2_scrollx); /* 1D5h */ - tilemap_set_scrollx(state->m_pf2_tilemap, 0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); + state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); break; case 03: COMBINE_DATA(&state->m_pf2_scrolly); /* 1EBh */ - tilemap_set_scrolly(state->m_pf2_tilemap, 0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); break; case 04: COMBINE_DATA(&state->m_pf3_scrollx); /* 1D7h */ - tilemap_set_scrollx(state->m_pf3_tilemap, 0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); + state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); break; case 05: COMBINE_DATA(&state->m_pf3_scrolly); /* 1EBh */ - tilemap_set_scrolly(state->m_pf3_tilemap, 0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); break; case 06: COMBINE_DATA(&state->m_pf4_scrollx); /* 1D9h */ - tilemap_set_scrollx(state->m_pf4_tilemap, 0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); + state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); break; case 07: COMBINE_DATA(&state->m_pf4_scrolly); /* 1EBh */ - tilemap_set_scrolly(state->m_pf4_tilemap, 0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); break; default: logerror("Hmmm, writing %08x to unknown video scroll register (%08x) !!!\n",data ,offset); break; @@ -885,40 +885,40 @@ // while (machine.input().code_pressed(KEYCODE_B)) ; state->m_scrollx_offs1 += 0x1; state->m_scrollx_offs2 += 0x1; state->m_scrollx_offs3 += 0x1; state->m_scrollx_offs4 += 0x1; logerror("Scrollx_offs now = %08x\n", state->m_scrollx_offs4); - tilemap_set_scrollx(state->m_pf1_tilemap, 0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); - tilemap_set_scrollx(state->m_pf3_tilemap, 0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); - tilemap_set_scrollx(state->m_pf4_tilemap, 0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); + state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); + state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); + state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); + state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); } if ( machine.input().code_pressed(KEYCODE_V) ) { // while (machine.input().code_pressed(KEYCODE_V)) ; state->m_scrollx_offs1 -= 0x1; state->m_scrollx_offs2 -= 0x1; state->m_scrollx_offs3 -= 0x1; state->m_scrollx_offs4 -= 0x1; logerror("Scrollx_offs now = %08x\n", state->m_scrollx_offs4); - tilemap_set_scrollx(state->m_pf1_tilemap, 0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); - tilemap_set_scrollx(state->m_pf3_tilemap, 0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); - tilemap_set_scrollx(state->m_pf4_tilemap, 0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); + state->m_pf1_tilemap->set_scrollx(0, (state->m_pf1_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs1)); + state->m_pf2_tilemap->set_scrollx(0, (state->m_pf2_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs2)); + state->m_pf3_tilemap->set_scrollx(0, (state->m_pf3_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs3)); + state->m_pf4_tilemap->set_scrollx(0, (state->m_pf4_scrollx >> 7) - (state->m_tiles_offsetx - state->m_scrollx_offs4)); } if ( machine.input().code_pressed(KEYCODE_C) ) { // while (machine.input().code_pressed(KEYCODE_C)) ; state->m_scrolly_offs += 0x1; logerror("Scrolly_offs now = %08x\n", state->m_scrolly_offs); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf3_tilemap, 0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf4_tilemap, 0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); } if ( machine.input().code_pressed(KEYCODE_X) ) { // while (machine.input().code_pressed(KEYCODE_X)) ; state->m_scrolly_offs -= 0x1; logerror("Scrolly_offs now = %08x\n", state->m_scrolly_offs); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf3_tilemap, 0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); - tilemap_set_scrolly(state->m_pf4_tilemap, 0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf1_tilemap->set_scrolly(0, (state->m_pf1_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf2_tilemap->set_scrolly(0, (state->m_pf2_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf3_tilemap->set_scrolly(0, (state->m_pf3_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); + state->m_pf4_tilemap->set_scrolly(0, (state->m_pf4_scrolly >> 7) - (state->m_tiles_offsety - state->m_scrolly_offs)); } if ( machine.input().code_pressed(KEYCODE_L) ) /* Turn Playfield 4 on/off */ @@ -926,28 +926,28 @@ while (machine.input().code_pressed(KEYCODE_L)) ; state->m_display_pf4 += 1; state->m_display_pf4 &= 1; - tilemap_set_enable(state->m_pf4_tilemap, state->m_display_pf4); + state->m_pf4_tilemap->enable(state->m_display_pf4); } if ( machine.input().code_pressed(KEYCODE_K) ) /* Turn Playfield 3 on/off */ { while (machine.input().code_pressed(KEYCODE_K)) ; state->m_display_pf3 += 1; state->m_display_pf3 &= 1; - tilemap_set_enable(state->m_pf3_tilemap, state->m_display_pf3); + state->m_pf3_tilemap->enable(state->m_display_pf3); } if ( machine.input().code_pressed(KEYCODE_J) ) /* Turn Playfield 2 on/off */ { while (machine.input().code_pressed(KEYCODE_J)) ; state->m_display_pf2 += 1; state->m_display_pf2 &= 1; - tilemap_set_enable(state->m_pf2_tilemap, state->m_display_pf2); + state->m_pf2_tilemap->enable(state->m_display_pf2); } if ( machine.input().code_pressed(KEYCODE_H) ) /* Turn Playfield 1 on/off */ { while (machine.input().code_pressed(KEYCODE_H)) ; state->m_display_pf1 += 1; state->m_display_pf1 &= 1; - tilemap_set_enable(state->m_pf1_tilemap, state->m_display_pf1); + state->m_pf1_tilemap->enable(state->m_display_pf1); } #endif } @@ -959,13 +959,13 @@ ***************************************************************************/ // custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities -static void toaplan1_draw_sprite_custom(bitmap_t *dest_bmp,const rectangle *clip,const gfx_element *gfx, +static void toaplan1_draw_sprite_custom(bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, int priority) { int pal_base = gfx->color_base + gfx->color_granularity * (color % gfx->total_colors); const UINT8 *source_base = gfx_element_get_data(gfx, code % gfx->total_elements); - bitmap_t *priority_bitmap = gfx->machine().priority_bitmap; + bitmap_ind8 &priority_bitmap = gfx->machine().priority_bitmap; int sprite_screen_height = ((1<<16)*gfx->height+0x8000)>>16; int sprite_screen_width = ((1<<16)*gfx->width+0x8000)>>16; @@ -1001,31 +1001,28 @@ y_index = 0; } - if( clip ) - { - if( sx < clip->min_x) - { /* clip left */ - int pixels = clip->min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip->min_y ) - { /* clip top */ - int pixels = clip->min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip->max_x+1 ) - { /* clip right */ - int pixels = ex-clip->max_x-1; - ex -= pixels; - } - if( ey > clip->max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip->max_y-1; - ey -= pixels; - } + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; } if( ex>sx ) @@ -1035,8 +1032,8 @@ for( y=sy; y>16) * gfx->line_modulo; - UINT16 *dest = BITMAP_ADDR16(dest_bmp, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); + UINT16 *dest = &dest_bmp.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); int x, x_index = x_index_base; for( x=sx; x(); UINT16 *source = (UINT16 *)state->m_buffered_spriteram; @@ -1097,9 +1094,9 @@ { const rectangle &visarea = machine.primary_screen->visible_area(); - sx_base = ((visarea.max_x + 1) - visarea.min_x) - (sx_base + 8); /* visarea.x = 320 */ - sy_base = ((visarea.max_y + 1) - visarea.min_y) - (sy_base + 8); /* visarea.y = 240 */ - sy_base += ((visarea.max_y + 1) - ((visarea.max_y + 1) - visarea.min_y)) * 2; /* Horizontal games are offset so adjust by +0x20 */ + sx_base = visarea.width() - (sx_base + 8); /* visarea.x = 320 */ + sy_base = visarea.height() - (sy_base + 8); /* visarea.y = 240 */ + sy_base += ((visarea.max_y + 1) - visarea.height()) * 2; /* Horizontal games are offset so adjust by +0x20 */ } for (dim_y = 0; dim_y < sprite_sizey; dim_y += 8) @@ -1126,7 +1123,7 @@ } -static void rallybik_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void rallybik_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { toaplan1_state *state = machine.driver_data(); UINT16 *buffered_spriteram16 = state->m_buffered_spriteram; @@ -1161,56 +1158,56 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -SCREEN_UPDATE( rallybik ) +SCREEN_UPDATE_IND16( rallybik ) { - toaplan1_state *state = screen->machine().driver_data(); + toaplan1_state *state = screen.machine().driver_data(); int priority; - toaplan1_log_vram(screen->machine()); + toaplan1_log_vram(screen.machine()); - bitmap_fill(bitmap,cliprect,0x120); + bitmap.fill(0x120, cliprect); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, TILEMAP_DRAW_OPAQUE | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, TILEMAP_DRAW_OPAQUE | 1, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 0); for (priority = 1; priority < 16; priority++) { - tilemap_draw(bitmap, cliprect, state->m_pf4_tilemap, priority, 0); - tilemap_draw(bitmap, cliprect, state->m_pf3_tilemap, priority, 0); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, priority, 0); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, priority, 0); - rallybik_draw_sprites(screen->machine(), bitmap,cliprect,priority << 8); + state->m_pf4_tilemap->draw(bitmap, cliprect, priority, 0); + state->m_pf3_tilemap->draw(bitmap, cliprect, priority, 0); + state->m_pf2_tilemap->draw(bitmap, cliprect, priority, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, priority, 0); + rallybik_draw_sprites(screen.machine(), bitmap,cliprect,priority << 8); } return 0; } -SCREEN_UPDATE( toaplan1 ) +SCREEN_UPDATE_IND16( toaplan1 ) { - toaplan1_state *state = screen->machine().driver_data(); + toaplan1_state *state = screen.machine().driver_data(); int priority; - toaplan1_log_vram(screen->machine()); + toaplan1_log_vram(screen.machine()); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - bitmap_fill(bitmap,cliprect,0x120); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0x120, cliprect); // it's really correct? - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, TILEMAP_DRAW_OPAQUE | 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, TILEMAP_DRAW_OPAQUE | 1, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 0); for (priority = 1; priority < 16; priority++) { - tilemap_draw_primask(bitmap, cliprect, state->m_pf4_tilemap, priority, priority, 0); - tilemap_draw_primask(bitmap, cliprect, state->m_pf3_tilemap, priority, priority, 0); - tilemap_draw_primask(bitmap, cliprect, state->m_pf2_tilemap, priority, priority, 0); - tilemap_draw_primask(bitmap, cliprect, state->m_pf1_tilemap, priority, priority, 0); + state->m_pf4_tilemap->draw(bitmap, cliprect, priority, priority, 0); + state->m_pf3_tilemap->draw(bitmap, cliprect, priority, priority, 0); + state->m_pf2_tilemap->draw(bitmap, cliprect, priority, priority, 0); + state->m_pf1_tilemap->draw(bitmap, cliprect, priority, priority, 0); } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } @@ -1220,26 +1217,38 @@ assume it happens automatically every frame, at the end of vblank ****************************************************************************/ -SCREEN_EOF( rallybik ) +SCREEN_VBLANK( rallybik ) { - toaplan1_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + toaplan1_state *state = screen.machine().driver_data(); - memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + } } -SCREEN_EOF( toaplan1 ) +SCREEN_VBLANK( toaplan1 ) { - toaplan1_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + toaplan1_state *state = screen.machine().driver_data(); - memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); - memcpy(state->m_buffered_spritesizeram16, state->m_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE); + memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + memcpy(state->m_buffered_spritesizeram16, state->m_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE); + } } -SCREEN_EOF( samesame ) +SCREEN_VBLANK( samesame ) { - toaplan1_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + toaplan1_state *state = screen.machine().driver_data(); - memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); - memcpy(state->m_buffered_spritesizeram16, state->m_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE); - cputag_set_input_line(machine, "maincpu", M68K_IRQ_2, HOLD_LINE); /* Frame done */ + memcpy(state->m_buffered_spriteram, state->m_spriteram, state->m_spriteram_size); + memcpy(state->m_buffered_spritesizeram16, state->m_spritesizeram16, TOAPLAN1_SPRITESIZERAM_SIZE); + cputag_set_input_line(screen.machine(), "maincpu", M68K_IRQ_2, HOLD_LINE); /* Frame done */ + } } diff -Nru mame-0.144/src/mame/video/toaplan2.c mame-0.145/src/mame/video/toaplan2.c --- mame-0.144/src/mame/video/toaplan2.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/toaplan2.c 2012-02-06 21:30:32.000000000 +0000 @@ -61,9 +61,9 @@ toaplan2_state *state = machine.driver_data(); state->m_tx_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_tx_tilemap, 8*32); /* line scrolling */ - tilemap_set_scroll_cols(state->m_tx_tilemap, 1); - tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + state->m_tx_tilemap->set_scroll_rows(8*32); /* line scrolling */ + state->m_tx_tilemap->set_scroll_cols(1); + state->m_tx_tilemap->set_transparent_pen(0); } static void register_state_save(running_machine &machine) @@ -82,26 +82,24 @@ VIDEO_START( toaplan2 ) { toaplan2_state *state = machine.driver_data(); - int width = machine.primary_screen->width(); - int height = machine.primary_screen->height(); /* cache the VDP device */ state->m_vdp0 = machine.device("gp9001vdp0"); state->m_vdp1 = machine.device("gp9001vdp1"); /* our current VDP implementation needs this bitmap to work with */ - state->m_custom_priority_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED8); + machine.primary_screen->register_screen_bitmap(state->m_custom_priority_bitmap); if (state->m_vdp0 != NULL) { - state->m_secondary_render_bitmap = NULL; - state->m_vdp0->custom_priority_bitmap = state->m_custom_priority_bitmap; + state->m_secondary_render_bitmap.reset(); + state->m_vdp0->custom_priority_bitmap = &state->m_custom_priority_bitmap; } if (state->m_vdp1 != NULL) { - state->m_secondary_render_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); - state->m_vdp1->custom_priority_bitmap = state->m_custom_priority_bitmap; + machine.primary_screen->register_screen_bitmap(state->m_secondary_render_bitmap); + state->m_vdp1->custom_priority_bitmap = &state->m_custom_priority_bitmap; } register_state_save(machine); @@ -118,7 +116,7 @@ machine.save().register_postload(save_prepost_delegate(FUNC(truxton2_postload), &machine)); truxton2_create_tx_tilemap(machine); - tilemap_set_scrolldx(state->m_tx_tilemap, 0x1d4 +1, 0x2a); + state->m_tx_tilemap->set_scrolldx(0x1d4 +1, 0x2a); } VIDEO_START( fixeightbl ) @@ -145,7 +143,7 @@ state->m_vdp0->init_scroll_regs(); - tilemap_set_scrolldx(state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_scrolldx(0, 0); } VIDEO_START( bgaregga ) @@ -156,7 +154,7 @@ /* Create the Text tilemap for this game */ truxton2_create_tx_tilemap(machine); - tilemap_set_scrolldx(state->m_tx_tilemap, 0x1d4, 0x2a); + state->m_tx_tilemap->set_scrolldx(0x1d4, 0x2a); } VIDEO_START( batrider ) @@ -173,7 +171,7 @@ machine.save().register_postload(save_prepost_delegate(FUNC(truxton2_postload), &machine)); truxton2_create_tx_tilemap(machine); - tilemap_set_scrolldx(state->m_tx_tilemap, 0x1d4, 0x2a); + state->m_tx_tilemap->set_scrolldx(0x1d4, 0x2a); /* Has special banking */ state->m_vdp0->gp9001_gfxrom_is_banked = 1; @@ -185,13 +183,13 @@ COMBINE_DATA(&state->m_txvideoram16[offset]); if (offset < (state->m_tx_vram_size/4)) - tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); + state->m_tx_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( toaplan2_txvideoram16_offs_w ) { // FIXME: implement line select and per-line flipping for all games - // see SCREEN_UPDATE( batrider ) + // see SCREEN_UPDATE_IND16( batrider ) toaplan2_state *state = space->machine().driver_data(); UINT16 oldword = state->m_txvideoram16_offs[offset]; @@ -203,14 +201,14 @@ if (data & 0x8000) /* Flip off */ { state->m_tx_flip = 0; - tilemap_set_flip(state->m_tx_tilemap, state->m_tx_flip); - tilemap_set_scrolly(state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->set_flip(state->m_tx_flip); + state->m_tx_tilemap->set_scrolly(0, 0); } else /* Flip on */ { state->m_tx_flip = (TILEMAP_FLIPY | TILEMAP_FLIPX); - tilemap_set_flip(state->m_tx_tilemap, state->m_tx_flip); - tilemap_set_scrolly(state->m_tx_tilemap, 0, -16); + state->m_tx_tilemap->set_flip(state->m_tx_flip); + state->m_tx_tilemap->set_scrolly(0, -16); } } COMBINE_DATA(&state->m_txvideoram16_offs[offset]); @@ -225,7 +223,7 @@ toaplan2_state *state = space->machine().driver_data(); int data_tx = data; - tilemap_set_scrollx(state->m_tx_tilemap, offset, data_tx); + state->m_tx_tilemap->set_scrollx(offset, data_tx); // logerror("Writing %04x to text scroll RAM offset %04x\n",data,offset); COMBINE_DATA(&state->m_txscrollram16[offset]); @@ -291,21 +289,21 @@ } // Dogyuun doesn't appear to require fancy mixing? -SCREEN_UPDATE( toaplan2_dual ) +SCREEN_UPDATE_IND16( toaplan2_dual ) { - toaplan2_state *state = screen->machine().driver_data(); + toaplan2_state *state = screen.machine().driver_data(); if (state->m_vdp1) { - bitmap_fill(bitmap,cliprect,0); - bitmap_fill(state->m_custom_priority_bitmap, cliprect, 0); - state->m_vdp1->gp9001_render_vdp(screen->machine(), bitmap, cliprect); + bitmap.fill(0, cliprect); + state->m_custom_priority_bitmap.fill(0, cliprect); + state->m_vdp1->gp9001_render_vdp(screen.machine(), bitmap, cliprect); } if (state->m_vdp0) { - // bitmap_fill(bitmap,cliprect,0); - bitmap_fill(state->m_custom_priority_bitmap, cliprect, 0); - state->m_vdp0->gp9001_render_vdp(screen->machine(), bitmap, cliprect); + // bitmap.fill(0, cliprect); + state->m_custom_priority_bitmap.fill(0, cliprect); + state->m_vdp0->gp9001_render_vdp(screen.machine(), bitmap, cliprect); } @@ -314,24 +312,24 @@ // renders to 2 bitmaps, and mixes output -SCREEN_UPDATE( toaplan2_mixed ) +SCREEN_UPDATE_IND16( toaplan2_mixed ) { - toaplan2_state *state = screen->machine().driver_data(); + toaplan2_state *state = screen.machine().driver_data(); -// bitmap_fill(bitmap,cliprect,0); -// bitmap_fill(gp9001_custom_priority_bitmap, cliprect, 0); +// bitmap.fill(0, cliprect); +// gp9001_custom_priority_bitmap->fill(0, cliprect); if (state->m_vdp0) { - bitmap_fill(bitmap,cliprect,0); - bitmap_fill(state->m_custom_priority_bitmap, cliprect, 0); - state->m_vdp0->gp9001_render_vdp(screen->machine(), bitmap, cliprect); + bitmap.fill(0, cliprect); + state->m_custom_priority_bitmap.fill(0, cliprect); + state->m_vdp0->gp9001_render_vdp(screen.machine(), bitmap, cliprect); } if (state->m_vdp1) { - bitmap_fill(state->m_secondary_render_bitmap,cliprect,0); - bitmap_fill(state->m_custom_priority_bitmap, cliprect, 0); - state->m_vdp1->gp9001_render_vdp(screen->machine(), state->m_secondary_render_bitmap, cliprect); + state->m_secondary_render_bitmap.fill(0, cliprect); + state->m_custom_priority_bitmap.fill(0, cliprect); + state->m_vdp1->gp9001_render_vdp(screen.machine(), state->m_secondary_render_bitmap, cliprect); } @@ -348,16 +346,16 @@ if (state->m_vdp0 && state->m_vdp1) { - int width = screen->width(); - int height = screen->height(); + int width = screen.width(); + int height = screen.height(); int y,x; UINT16* src_vdp0; // output buffer of vdp0 UINT16* src_vdp1; // output buffer of vdp1 for (y=0;ym_secondary_render_bitmap, y, 0); + src_vdp0 = &bitmap.pix16(y); + src_vdp1 = &state->m_secondary_render_bitmap.pix16(y); for (x=0;xmachine().driver_data(); + toaplan2_state *state = screen.machine().driver_data(); if (state->m_vdp0) { - device_t *screen1 = screen->machine().device("screen"); - - if (screen == screen1) - { - bitmap_fill(bitmap,cliprect,0); - bitmap_fill(state->m_custom_priority_bitmap, cliprect, 0); - state->m_vdp0->gp9001_render_vdp(screen->machine(), bitmap, cliprect); - } + bitmap.fill(0, cliprect); + state->m_custom_priority_bitmap.fill(0, cliprect); + state->m_vdp0->gp9001_render_vdp(screen.machine(), bitmap, cliprect); } return 0; } -SCREEN_UPDATE( truxton2 ) +SCREEN_UPDATE_IND16( truxton2 ) { - toaplan2_state *state = screen->machine().driver_data(); + toaplan2_state *state = screen.machine().driver_data(); - SCREEN_UPDATE_CALL(toaplan2); - tilemap_draw(bitmap, cliprect, state->m_tx_tilemap, 0, 0); + SCREEN_UPDATE16_CALL(toaplan2); + state->m_tx_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( batrider ) +SCREEN_UPDATE_IND16( batrider ) { - toaplan2_state *state = screen->machine().driver_data(); + toaplan2_state *state = screen.machine().driver_data(); - SCREEN_UPDATE_CALL( toaplan2 ); + SCREEN_UPDATE16_CALL( toaplan2 ); int line; rectangle clip; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); - clip.min_x = visarea.min_x; - clip.max_x = visarea.max_x; - clip.min_y = visarea.min_y; - clip.max_y = visarea.max_y; + clip = visarea; /* used for 'for use in' and '8ing' screen on bbakraid, raizing on batrider */ for (line = 0; line < 256;line++) @@ -464,35 +454,39 @@ if (state->m_tx_flip) { clip.min_y = clip.max_y = 256 - line; - tilemap_set_scrolly(state->m_tx_tilemap, 0, 256 - line + state->m_txvideoram16_offs[256 - line]); + state->m_tx_tilemap->set_scrolly(0, 256 - line + state->m_txvideoram16_offs[256 - line]); } else { clip.min_y = clip.max_y = line; - tilemap_set_scrolly(state->m_tx_tilemap, 0, - line + state->m_txvideoram16_offs[ line]); + state->m_tx_tilemap->set_scrolly(0, - line + state->m_txvideoram16_offs[ line]); } - tilemap_draw(bitmap, &clip, state->m_tx_tilemap, 0, 0); + state->m_tx_tilemap->draw(bitmap, clip, 0, 0); } return 0; } -SCREEN_UPDATE( dogyuun ) +SCREEN_UPDATE_IND16( dogyuun ) { - SCREEN_UPDATE_CALL( toaplan2_dual ); + SCREEN_UPDATE16_CALL( toaplan2_dual ); return 0; } -SCREEN_UPDATE( batsugun ) +SCREEN_UPDATE_IND16( batsugun ) { - SCREEN_UPDATE_CALL( toaplan2_mixed ); + SCREEN_UPDATE16_CALL( toaplan2_mixed ); return 0; } -SCREEN_EOF( toaplan2 ) +SCREEN_VBLANK( toaplan2 ) { - toaplan2_state *state = machine.driver_data(); - if (state->m_vdp0) state->m_vdp0->gp9001_screen_eof(); - if (state->m_vdp1) state->m_vdp1->gp9001_screen_eof(); + // rising edge + if (vblank_on) + { + toaplan2_state *state = screen.machine().driver_data(); + if (state->m_vdp0) state->m_vdp0->gp9001_screen_eof(); + if (state->m_vdp1) state->m_vdp1->gp9001_screen_eof(); + } } diff -Nru mame-0.144/src/mame/video/toki.c mame-0.145/src/mame/video/toki.c --- mame-0.144/src/mame/video/toki.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/toki.c 2012-02-06 21:30:32.000000000 +0000 @@ -33,14 +33,18 @@ COMBINE_DATA(&state->m_scrollram16[offset]); } -SCREEN_EOF( toki ) +SCREEN_VBLANK( toki ) { - buffer_spriteram16_w(machine.device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); + // rising edge + if (vblank_on) + buffer_spriteram16_w(screen.machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); } -SCREEN_EOF( tokib ) +SCREEN_VBLANK( tokib ) { - buffer_spriteram16_w(machine.device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); + // rising edge + if (vblank_on) + buffer_spriteram16_w(screen.machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); } static TILE_GET_INFO( get_text_tile_info ) @@ -103,9 +107,9 @@ state->m_background_layer = tilemap_create(machine, get_back_tile_info,tilemap_scan_rows,16,16,32,32); state->m_foreground_layer = tilemap_create(machine, get_fore_tile_info,tilemap_scan_rows,16,16,32,32); - tilemap_set_transparent_pen(state->m_text_layer,15); - tilemap_set_transparent_pen(state->m_background_layer,15); - tilemap_set_transparent_pen(state->m_foreground_layer,15); + state->m_text_layer->set_transparent_pen(15); + state->m_background_layer->set_transparent_pen(15); + state->m_foreground_layer->set_transparent_pen(15); } /*************************************/ @@ -115,21 +119,21 @@ toki_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_text_layer,offset); + state->m_text_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( toki_background1_videoram16_w ) { toki_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_background1_videoram16[offset]); - tilemap_mark_tile_dirty(state->m_background_layer,offset); + state->m_background_layer->mark_tile_dirty(offset); } WRITE16_HANDLER( toki_background2_videoram16_w ) { toki_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_background2_videoram16[offset]); - tilemap_mark_tile_dirty(state->m_foreground_layer,offset); + state->m_foreground_layer->mark_tile_dirty(offset); } /*************************************************************************** @@ -181,7 +185,7 @@ ***************************************************************************/ -static void toki_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void toki_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { int x,y,xoffs,yoffs,tile,flipx,flipy,color,offs; UINT16 *sprite_word; @@ -224,7 +228,7 @@ } -static void tokib_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void tokib_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { int x,y,tile,flipx,color,offs; UINT16 *sprite_word; @@ -267,9 +271,9 @@ * *************************************/ -SCREEN_UPDATE( toki ) +SCREEN_UPDATE_IND16( toki ) { - toki_state *state = screen->machine().driver_data(); + toki_state *state = screen.machine().driver_data(); int background_y_scroll,foreground_y_scroll,background_x_scroll,foreground_x_scroll; background_x_scroll=((state->m_scrollram16[0x06] &0x7f) << 1) @@ -277,50 +281,50 @@ |((state->m_scrollram16[0x05] &0x10) << 4); background_y_scroll=((state->m_scrollram16[0x0d]&0x10)<<4)+((state->m_scrollram16[0x0e]&0x7f)<<1)+((state->m_scrollram16[0x0e]&0x80)>>7); - tilemap_set_scrollx( state->m_background_layer, 0, background_x_scroll ); - tilemap_set_scrolly( state->m_background_layer, 0, background_y_scroll ); + state->m_background_layer->set_scrollx(0, background_x_scroll ); + state->m_background_layer->set_scrolly(0, background_y_scroll ); foreground_x_scroll= ((state->m_scrollram16[0x16] &0x7f) << 1) |((state->m_scrollram16[0x16] &0x80) >> 7) |((state->m_scrollram16[0x15] &0x10) << 4); foreground_y_scroll=((state->m_scrollram16[0x1d]&0x10)<<4)+((state->m_scrollram16[0x1e]&0x7f)<<1)+((state->m_scrollram16[0x1e]&0x80)>>7); - tilemap_set_scrollx( state->m_foreground_layer, 0, foreground_x_scroll ); - tilemap_set_scrolly( state->m_foreground_layer, 0, foreground_y_scroll ); + state->m_foreground_layer->set_scrollx(0, foreground_x_scroll ); + state->m_foreground_layer->set_scrolly(0, foreground_y_scroll ); - flip_screen_set(screen->machine(), (state->m_scrollram16[0x28]&0x8000)==0); + flip_screen_set(screen.machine(), (state->m_scrollram16[0x28]&0x8000)==0); if (state->m_scrollram16[0x28]&0x100) { - tilemap_draw(bitmap,cliprect,state->m_background_layer,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,0); + state->m_background_layer->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_foreground_layer->draw(bitmap, cliprect, 0,0); } else { - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_background_layer,0,0); + state->m_foreground_layer->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_background_layer->draw(bitmap, cliprect, 0,0); } - toki_draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,0); + toki_draw_sprites(screen.machine(), bitmap,cliprect); + state->m_text_layer->draw(bitmap, cliprect, 0,0); return 0; } -SCREEN_UPDATE( tokib ) +SCREEN_UPDATE_IND16( tokib ) { - toki_state *state = screen->machine().driver_data(); - tilemap_set_scroll_rows(state->m_foreground_layer,1); - tilemap_set_scroll_rows(state->m_background_layer,1); - tilemap_set_scrolly( state->m_background_layer, 0, state->m_scrollram16[0]+1 ); - tilemap_set_scrollx( state->m_background_layer, 0, state->m_scrollram16[1]-0x103 ); - tilemap_set_scrolly( state->m_foreground_layer, 0, state->m_scrollram16[2]+1 ); - tilemap_set_scrollx( state->m_foreground_layer, 0, state->m_scrollram16[3]-0x101 ); + toki_state *state = screen.machine().driver_data(); + state->m_foreground_layer->set_scroll_rows(1); + state->m_background_layer->set_scroll_rows(1); + state->m_background_layer->set_scrolly(0, state->m_scrollram16[0]+1 ); + state->m_background_layer->set_scrollx(0, state->m_scrollram16[1]-0x103 ); + state->m_foreground_layer->set_scrolly(0, state->m_scrollram16[2]+1 ); + state->m_foreground_layer->set_scrollx(0, state->m_scrollram16[3]-0x101 ); if (state->m_scrollram16[3]&0x2000) { - tilemap_draw(bitmap,cliprect,state->m_background_layer,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,0,0); + state->m_background_layer->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_foreground_layer->draw(bitmap, cliprect, 0,0); } else { - tilemap_draw(bitmap,cliprect,state->m_foreground_layer,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_background_layer,0,0); + state->m_foreground_layer->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_background_layer->draw(bitmap, cliprect, 0,0); } - tokib_draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_text_layer,0,0); + tokib_draw_sprites(screen.machine(), bitmap,cliprect); + state->m_text_layer->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/toobin.c mame-0.145/src/mame/video/toobin.c --- mame-0.144/src/mame/video/toobin.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/toobin.c 2012-02-06 21:30:32.000000000 +0000 @@ -35,7 +35,7 @@ int code = data2 & 0x3fff; int color = data1 & 0x0f; SET_TILE_INFO(0, code, color, TILE_FLIPYX(data2 >> 14)); - tileinfo->category = (data1 >> 4) & 3; + tileinfo.category = (data1 >> 4) & 3; } @@ -94,10 +94,10 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,48); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* allocate a playfield bitmap for rendering */ - state->m_pfbitmap = auto_bitmap_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height(), BITMAP_FORMAT_INDEXED16); + machine.primary_screen->register_screen_bitmap(state->m_pfbitmap); state->save_item(NAME(state->m_brightness)); } @@ -171,7 +171,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* update the playfield scrolling - hscroll is clocked on the following scanline */ - tilemap_set_scrollx(state->m_playfield_tilemap, 0, newscroll >> 6); + state->m_playfield_tilemap->set_scrollx(0, newscroll >> 6); atarimo_set_xscroll(0, newscroll >> 6); /* update the data */ @@ -191,7 +191,7 @@ space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); /* if bit 4 is zero, the scroll value is clocked in right away */ - tilemap_set_scrolly(state->m_playfield_tilemap, 0, newscroll >> 6); + state->m_playfield_tilemap->set_scrolly(0, newscroll >> 6); atarimo_set_yscroll(0, (newscroll >> 6) & 0x1ff); /* update the data */ @@ -228,31 +228,31 @@ * *************************************/ -SCREEN_UPDATE( toobin ) +SCREEN_UPDATE_RGB32( toobin ) { - toobin_state *state = screen->machine().driver_data(); - bitmap_t *priority_bitmap = screen->machine().priority_bitmap; - const rgb_t *palette = palette_entry_list_adjusted(screen->machine().palette); + toobin_state *state = screen.machine().driver_data(); + bitmap_ind8 &priority_bitmap = screen.machine().priority_bitmap; + const rgb_t *palette = palette_entry_list_adjusted(screen.machine().palette); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y; /* draw the playfield */ - bitmap_fill(priority_bitmap, cliprect, 0); - tilemap_draw(state->m_pfbitmap, cliprect, state->m_playfield_tilemap, 0, 0); - tilemap_draw(state->m_pfbitmap, cliprect, state->m_playfield_tilemap, 1, 1); - tilemap_draw(state->m_pfbitmap, cliprect, state->m_playfield_tilemap, 2, 2); - tilemap_draw(state->m_pfbitmap, cliprect, state->m_playfield_tilemap, 3, 3); + priority_bitmap.fill(0, cliprect); + state->m_playfield_tilemap->draw(state->m_pfbitmap, cliprect, 0, 0); + state->m_playfield_tilemap->draw(state->m_pfbitmap, cliprect, 1, 1); + state->m_playfield_tilemap->draw(state->m_pfbitmap, cliprect, 2, 2); + state->m_playfield_tilemap->draw(state->m_pfbitmap, cliprect, 3, 3); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); - UINT16 *mo = BITMAP_ADDR16(mobitmap, y, 0); - UINT16 *pf = BITMAP_ADDR16(state->m_pfbitmap, y, 0); - UINT8 *pri = BITMAP_ADDR8(priority_bitmap, y, 0); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + UINT32 *dest = &bitmap.pix32(y); + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &state->m_pfbitmap.pix16(y); + UINT8 *pri = &priority_bitmap.pix8(y); + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT16 pix = pf[x]; if (mo[x]) @@ -275,6 +275,6 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/topspeed.c mame-0.145/src/mame/video/topspeed.c --- mame-0.144/src/mame/video/topspeed.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/topspeed.c 2012-02-06 21:30:31.000000000 +0000 @@ -26,7 +26,7 @@ ********************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { topspeed_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -109,37 +109,37 @@ /***************************************************************************/ -SCREEN_UPDATE( topspeed ) +SCREEN_UPDATE_IND16( topspeed ) { - topspeed_state *state = screen->machine().driver_data(); + topspeed_state *state = screen.machine().driver_data(); UINT8 layer[4]; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed_once (KEYCODE_V)) + if (screen.machine().input().code_pressed_once (KEYCODE_V)) { state->m_dislayer[0] ^= 1; popmessage("bg: %01x", state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once (KEYCODE_B)) + if (screen.machine().input().code_pressed_once (KEYCODE_B)) { state->m_dislayer[1] ^= 1; popmessage("fg: %01x", state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once (KEYCODE_N)) + if (screen.machine().input().code_pressed_once (KEYCODE_N)) { state->m_dislayer[2] ^= 1; popmessage("bg2: %01x", state->m_dislayer[2]); } - if (screen->machine().input().code_pressed_once (KEYCODE_M)) + if (screen.machine().input().code_pressed_once (KEYCODE_M)) { state->m_dislayer[3] ^= 1; popmessage("fg2: %01x", state->m_dislayer[3]); } - if (screen->machine().input().code_pressed_once (KEYCODE_C)) + if (screen.machine().input().code_pressed_once (KEYCODE_C)) { state->m_dislayer[4] ^= 1; popmessage("sprites: %01x", state->m_dislayer[4]); @@ -155,8 +155,8 @@ layer[2] = 1; layer[3] = 0; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); #ifdef MAME_DEBUG if (state->m_dislayer[3] == 0) @@ -182,6 +182,6 @@ if (state->m_dislayer[4] == 0) #endif - draw_sprites(screen->machine(), bitmap,cliprect); + draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/toypop.c mame-0.145/src/mame/video/toypop.c --- mame-0.144/src/mame/video/toypop.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/toypop.c 2012-02-06 21:30:33.000000000 +0000 @@ -115,7 +115,7 @@ toypop_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine,get_tile_info,tilemap_scan,8,8,36,28); - tilemap_set_transparent_pen(state->m_bg_tilemap, 0); + state->m_bg_tilemap->set_transparent_pen(0); } @@ -130,7 +130,7 @@ { toypop_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( toypop_palettebank_w ) @@ -139,7 +139,7 @@ if (state->m_palettebank != (offset & 1)) { state->m_palettebank = offset & 1; - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -172,7 +172,7 @@ state->m_bg_image[2*offset+1] = (data & 0xf) | ((data & 0xf0) << 4); } -static void draw_background(running_machine &machine, bitmap_t *bitmap) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap) { toypop_state *state = machine.driver_data(); pen_t pen_base = 0x300 + 0x10*state->m_palettebank; @@ -183,7 +183,7 @@ int offs = 0xFDFE/2; for (int y = 0; y < 224; y++) { - UINT16 *scanline = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *scanline = &bitmap.pix16(y); for (int x = 0; x < 288; x+=2) { UINT16 data = state->m_bg_image[offs]; @@ -198,7 +198,7 @@ int offs = 0x200/2; for (int y = 0; y < 224; y++) { - UINT16 *scanline = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *scanline = &bitmap.pix16(y); for (int x = 0; x < 288; x+=2) { UINT16 data = state->m_bg_image[offs]; @@ -219,7 +219,7 @@ ***************************************************************************/ -void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 *spriteram_base) +void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT8 *spriteram_base) { UINT8 *spriteram = spriteram_base + 0x780; UINT8 *spriteram_2 = spriteram + 0x800; @@ -275,11 +275,11 @@ } -SCREEN_UPDATE( toypop ) +SCREEN_UPDATE_IND16( toypop ) { - toypop_state *state = screen->machine().driver_data(); - draw_background(screen->machine(), bitmap); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram); + toypop_state *state = screen.machine().driver_data(); + draw_background(screen.machine(), bitmap); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram); return 0; } diff -Nru mame-0.144/src/mame/video/tp84.c mame-0.145/src/mame/video/tp84.c --- mame-0.144/src/mame/video/tp84.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tp84.c 2012-02-06 21:30:32.000000000 +0000 @@ -152,7 +152,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { tp84_state *state = machine.driver_data(); int offs; @@ -175,35 +175,35 @@ } -SCREEN_UPDATE( tp84 ) +SCREEN_UPDATE_IND16( tp84 ) { - tp84_state *state = screen->machine().driver_data(); - rectangle clip = *cliprect; - const rectangle &visarea = screen->visible_area(); + tp84_state *state = screen.machine().driver_data(); + rectangle clip = cliprect; + const rectangle &visarea = screen.visible_area(); - if (cliprect->min_y == screen->visible_area().min_y) + if (cliprect.min_y == screen.visible_area().min_y) { - tilemap_mark_all_tiles_dirty_all(screen->machine()); + screen.machine().tilemap().mark_all_dirty(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, *state->m_scroll_x); - tilemap_set_scrolly(state->m_bg_tilemap, 0, *state->m_scroll_y); + state->m_bg_tilemap->set_scrollx(0, *state->m_scroll_x); + state->m_bg_tilemap->set_scrolly(0, *state->m_scroll_y); - tilemap_set_flip_all(screen->machine(), ((*state->m_flipscreen_x & 0x01) ? TILEMAP_FLIPX : 0) | + screen.machine().tilemap().set_flip_all(((*state->m_flipscreen_x & 0x01) ? TILEMAP_FLIPX : 0) | ((*state->m_flipscreen_y & 0x01) ? TILEMAP_FLIPY : 0)); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); /* draw top status region */ clip.min_x = visarea.min_x; clip.max_x = visarea.min_x + 15; - tilemap_draw(bitmap, &clip, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, clip, 0, 0); /* draw bottom status region */ clip.min_x = visarea.max_x - 15; clip.max_x = visarea.max_x; - tilemap_draw(bitmap, &clip, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, clip, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/trackfld.c mame-0.145/src/mame/video/trackfld.c --- mame-0.144/src/mame/video/trackfld.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/trackfld.c 2012-02-06 21:30:31.000000000 +0000 @@ -93,14 +93,14 @@ { trackfld_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( trackfld_colorram_w ) { trackfld_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( trackfld_flipscreen_w ) @@ -108,7 +108,7 @@ if (flip_screen_get(space->machine()) != data) { flip_screen_set(space->machine(), data); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } } @@ -156,7 +156,7 @@ if (state->m_bg_bank != (data & 0x8)) { state->m_bg_bank = data & 0x8; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -178,7 +178,7 @@ { trackfld_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_scroll_rows(state->m_bg_tilemap, 32); + state->m_bg_tilemap->set_scroll_rows(32); state->m_sprites_gfx_banked = 0; } @@ -192,7 +192,7 @@ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { trackfld_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -248,20 +248,20 @@ -SCREEN_UPDATE( trackfld ) +SCREEN_UPDATE_IND16( trackfld ) { - trackfld_state *state = screen->machine().driver_data(); + trackfld_state *state = screen.machine().driver_data(); int row, scrollx; for (row = 0; row < 32; row++) { scrollx = state->m_scroll[row] + 256 * (state->m_scroll2[row] & 0x01); - if (flip_screen_get(screen->machine())) scrollx = -scrollx; - tilemap_set_scrollx(state->m_bg_tilemap, row, scrollx); + if (flip_screen_get(screen.machine())) scrollx = -scrollx; + state->m_bg_tilemap->set_scrollx(row, scrollx); } - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/travrusa.c mame-0.145/src/mame/video/travrusa.c --- mame-0.144/src/mame/video/travrusa.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/travrusa.c 2012-02-06 21:30:31.000000000 +0000 @@ -201,7 +201,7 @@ UINT8 attr = state->m_videoram[2 * tile_index + 1]; int flags = TILE_FLIPXY((attr & 0x30) >> 4); - tileinfo->group = ((attr & 0x0f) == 0x0f) ? 1 : 0; /* tunnels */ + tileinfo.group = ((attr & 0x0f) == 0x0f) ? 1 : 0; /* tunnels */ SET_TILE_INFO( 0, @@ -226,10 +226,10 @@ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transmask(state->m_bg_tilemap, 0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ - tilemap_set_transmask(state->m_bg_tilemap, 1, 0x3f, 0xc0); /* split type 1 has pens 6 and 7 opaque - tunnels */ + state->m_bg_tilemap->set_transmask(0, 0xff, 0x00); /* split type 0 is totally transparent in front half */ + state->m_bg_tilemap->set_transmask(1, 0x3f, 0xc0); /* split type 1 has pens 6 and 7 opaque - tunnels */ - tilemap_set_scroll_rows(state->m_bg_tilemap, 4); + state->m_bg_tilemap->set_scroll_rows(4); } @@ -244,7 +244,7 @@ { travrusa_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } @@ -254,9 +254,9 @@ int i; for (i = 0; i <= 2; i++) - tilemap_set_scrollx(state->m_bg_tilemap, i, state->m_scrollx[0] + 256 * state->m_scrollx[1]); + state->m_bg_tilemap->set_scrollx(i, state->m_scrollx[0] + 256 * state->m_scrollx[1]); - tilemap_set_scrollx(state->m_bg_tilemap, 3, 0); + state->m_bg_tilemap->set_scrollx(3, 0); } WRITE8_HANDLER( travrusa_scroll_x_low_w ) @@ -293,25 +293,17 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { travrusa_state *state = machine.driver_data(); int offs; - static const rectangle spritevisiblearea = - { - 1*8, 31*8-1, - 0*8, 24*8-1 - }; - static const rectangle spritevisibleareaflip = - { - 1*8, 31*8-1, - 8*8, 32*8-1 - }; - rectangle clip = *cliprect; + const rectangle spritevisiblearea(1*8, 31*8-1, 0*8, 24*8-1); + const rectangle spritevisibleareaflip(1*8, 31*8-1, 8*8, 32*8-1); + rectangle clip = cliprect; if (flip_screen_get(machine)) - sect_rect(&clip, &spritevisibleareaflip); + clip &= spritevisibleareaflip; else - sect_rect(&clip, &spritevisiblearea); + clip &= spritevisiblearea; for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) @@ -331,7 +323,7 @@ flipy = !flipy; } - drawgfx_transpen(bitmap, &clip, machine.gfx[1], + drawgfx_transpen(bitmap, clip, machine.gfx[1], code, attr & 0x0f, flipx, flipy, @@ -340,11 +332,11 @@ } -SCREEN_UPDATE( travrusa ) +SCREEN_UPDATE_IND16( travrusa ) { - travrusa_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER1, 0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, TILEMAP_DRAW_LAYER0, 0); + travrusa_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/triplhnt.c mame-0.145/src/mame/video/triplhnt.c --- mame-0.144/src/mame/video/triplhnt.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/triplhnt.c 2012-02-06 21:30:31.000000000 +0000 @@ -20,7 +20,7 @@ VIDEO_START( triplhnt ) { triplhnt_state *state = machine.driver_data(); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 16, 16, 16, 16); } @@ -32,7 +32,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { triplhnt_state *state = machine.driver_data(); int i; @@ -59,17 +59,11 @@ if (state->m_sprite_zoom) { - rect.min_x = hpos - 16; - rect.min_y = 196 - vpos; - rect.max_x = rect.min_x + 63; - rect.max_y = rect.min_y + 63; + rect.set(hpos - 16, hpos - 16 + 63, 196 - vpos, 196 - vpos + 63); } else { - rect.min_x = hpos - 16; - rect.min_y = 224 - vpos; - rect.max_x = rect.min_x + 31; - rect.max_y = rect.min_y + 31; + rect.set(hpos - 16, hpos - 16 + 31, 224 - vpos, 224 - vpos + 31); } /* render sprite to auxiliary bitmap */ @@ -78,14 +72,7 @@ 2 * code + state->m_sprite_bank, 0, code & 8, 0, rect.min_x, rect.min_y); - if (rect.min_x < cliprect->min_x) - rect.min_x = cliprect->min_x; - if (rect.min_y < cliprect->min_y) - rect.min_y = cliprect->min_y; - if (rect.max_x > cliprect->max_x) - rect.max_x = cliprect->max_x; - if (rect.max_y > cliprect->max_y) - rect.max_y = cliprect->max_y; + rect &= cliprect; /* check for collisions and copy sprite */ @@ -97,8 +84,8 @@ { for (y = rect.min_y; y <= rect.max_y; y++) { - pen_t a = *BITMAP_ADDR16(state->m_helper, y, x); - pen_t b = *BITMAP_ADDR16(bitmap, y, x); + pen_t a = state->m_helper.pix16(y, x); + pen_t b = bitmap.pix16(y, x); if (a == 2 && b == 7) { @@ -107,7 +94,7 @@ } if (a != 1) - *BITMAP_ADDR16(bitmap, y, x) = a; + bitmap.pix16(y, x) = a; } } } @@ -118,16 +105,16 @@ } -SCREEN_UPDATE( triplhnt ) +SCREEN_UPDATE_IND16( triplhnt ) { - triplhnt_state *state = screen->machine().driver_data(); - device_t *discrete = screen->machine().device("discrete"); + triplhnt_state *state = screen.machine().driver_data(); + device_t *discrete = screen.machine().device("discrete"); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); discrete_sound_w(discrete, TRIPLHNT_BEAR_ROAR_DATA, state->m_playfield_ram[0xfa] & 15); discrete_sound_w(discrete, TRIPLHNT_SHOT_DATA, state->m_playfield_ram[0xfc] & 15); diff -Nru mame-0.144/src/mame/video/truco.c mame-0.145/src/mame/video/truco.c --- mame-0.144/src/mame/video/truco.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/truco.c 2012-02-06 21:30:32.000000000 +0000 @@ -31,9 +31,9 @@ } } -SCREEN_UPDATE( truco ) +SCREEN_UPDATE_IND16( truco ) { - truco_state *state = screen->machine().driver_data(); + truco_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; UINT8 *vid = videoram; int x, y; @@ -49,7 +49,7 @@ else pixel = ( vid[x>>1] >> 4 ) & 0x0f; - *BITMAP_ADDR16(bitmap, y, x) = pixel; + bitmap.pix16(y, x) = pixel; } vid += 0x80; diff -Nru mame-0.144/src/mame/video/trucocl.c mame-0.145/src/mame/video/trucocl.c --- mame-0.144/src/mame/video/trucocl.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/trucocl.c 2012-02-06 21:30:33.000000000 +0000 @@ -48,14 +48,14 @@ { trucocl_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( trucocl_colorram_w ) { trucocl_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_bg_tile_info ) @@ -79,9 +79,9 @@ state->m_bg_tilemap = tilemap_create( machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32 ); } -SCREEN_UPDATE( trucocl ) +SCREEN_UPDATE_IND16( trucocl ) { - trucocl_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + trucocl_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/tryout.c mame-0.145/src/mame/video/tryout.c --- mame-0.144/src/mame/video/tryout.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tryout.c 2012-02-06 21:30:31.000000000 +0000 @@ -68,7 +68,7 @@ tryout_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( tryout_vram_w ) @@ -94,7 +94,7 @@ int newoff=offset&0x3ff; state->m_vram[newoff]=data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,newoff); + state->m_bg_tilemap->mark_tile_dirty(newoff); return; } @@ -179,10 +179,10 @@ gfx_element_set_source(machine.gfx[2], state->m_vram_gfx); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { tryout_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -233,34 +233,34 @@ } } -SCREEN_UPDATE( tryout ) +SCREEN_UPDATE_IND16( tryout ) { - tryout_state *state = screen->machine().driver_data(); + tryout_state *state = screen.machine().driver_data(); int scrollx = 0; - if (!flip_screen_get(screen->machine())) - tilemap_set_scrollx(state->m_fg_tilemap, 0, 16); /* Assumed hard-wired */ + if (!flip_screen_get(screen.machine())) + state->m_fg_tilemap->set_scrollx(0, 16); /* Assumed hard-wired */ else - tilemap_set_scrollx(state->m_fg_tilemap, 0, -8); /* Assumed hard-wired */ + state->m_fg_tilemap->set_scrollx(0, -8); /* Assumed hard-wired */ scrollx = state->m_gfx_control[1] + ((state->m_gfx_control[0]&1)<<8) + ((state->m_gfx_control[0]&4)<<7) - ((state->m_gfx_control[0] & 2) ? 0 : 0x100); /* wrap-around */ if(state->m_gfx_control[1] == 0) { scrollx+=0x100; } - tilemap_set_scrollx(state->m_bg_tilemap, 0, scrollx+2); /* why +2? hard-wired? */ - tilemap_set_scrolly(state->m_bg_tilemap, 0, -state->m_gfx_control[2]); + state->m_bg_tilemap->set_scrollx(0, scrollx+2); /* why +2? hard-wired? */ + state->m_bg_tilemap->set_scrolly(0, -state->m_gfx_control[2]); if(!(state->m_gfx_control[0] & 0x8)) // screen disable { /* TODO: Color might be different, needs a video from an original pcb. */ - bitmap_fill(bitmap, cliprect, screen->machine().pens[0x10]); + bitmap.fill(screen.machine().pens[0x10], cliprect); } else { - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); } // popmessage("%02x %02x %02x %02x",state->m_gfx_control[0],state->m_gfx_control[1],state->m_gfx_control[2],scrollx); diff -Nru mame-0.144/src/mame/video/tsamurai.c mame-0.145/src/mame/video/tsamurai.c --- mame-0.144/src/mame/video/tsamurai.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tsamurai.c 2012-02-06 21:30:32.000000000 +0000 @@ -52,8 +52,8 @@ state->m_background = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows,8,8,32,32); state->m_foreground = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_background,0); - tilemap_set_transparent_pen(state->m_foreground,0); + state->m_background->set_transparent_pen(0); + state->m_foreground->set_transparent_pen(0); } @@ -66,13 +66,13 @@ WRITE8_HANDLER( tsamurai_scrolly_w ) { tsamurai_state *state = space->machine().driver_data(); - tilemap_set_scrolly( state->m_background, 0, data ); + state->m_background->set_scrolly(0, data ); } WRITE8_HANDLER( tsamurai_scrollx_w ) { tsamurai_state *state = space->machine().driver_data(); - tilemap_set_scrollx( state->m_background, 0, data ); + state->m_background->set_scrollx(0, data ); } WRITE8_HANDLER( tsamurai_bgcolor_w ) @@ -87,7 +87,7 @@ if( state->m_textbank1!=data ) { state->m_textbank1 = data; - tilemap_mark_all_tiles_dirty( state->m_foreground ); + state->m_foreground ->mark_all_dirty(); } } @@ -97,7 +97,7 @@ if( state->m_textbank2!=data ) { state->m_textbank2 = data; - tilemap_mark_all_tiles_dirty( state->m_foreground ); + state->m_foreground ->mark_all_dirty(); } } @@ -106,13 +106,13 @@ tsamurai_state *state = space->machine().driver_data(); state->m_bg_videoram[offset]=data; offset = offset/2; - tilemap_mark_tile_dirty(state->m_background,offset); + state->m_background->mark_tile_dirty(offset); } WRITE8_HANDLER( tsamurai_fg_videoram_w ) { tsamurai_state *state = space->machine().driver_data(); state->m_videoram[offset]=data; - tilemap_mark_tile_dirty(state->m_foreground,offset); + state->m_foreground->mark_tile_dirty(offset); } WRITE8_HANDLER( tsamurai_fg_colorram_w ) { @@ -125,7 +125,7 @@ int col = offset/2; int row; for (row = 0;row < 32;row++) - tilemap_mark_tile_dirty(state->m_foreground,32*row+col); + state->m_foreground->mark_tile_dirty(32*row+col); } } } @@ -137,7 +137,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { tsamurai_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -197,16 +197,16 @@ } } -SCREEN_UPDATE( tsamurai ) +SCREEN_UPDATE_IND16( tsamurai ) { - tsamurai_state *state = screen->machine().driver_data(); + tsamurai_state *state = screen.machine().driver_data(); int i; /* Do the column scroll used for the "660" logo on the title screen */ - tilemap_set_scroll_cols(state->m_foreground, 32); + state->m_foreground->set_scroll_cols(32); for (i = 0 ; i < 32 ; i++) { - tilemap_set_scrolly(state->m_foreground, i, state->m_colorram[i*2]); + state->m_foreground->set_scrolly(i, state->m_colorram[i*2]); } /* end of column scroll code */ @@ -218,10 +218,10 @@ Note that the background color register isn't well understood (screenshots would be helpful) */ - bitmap_fill(bitmap,cliprect,state->m_bgcolor); - tilemap_draw(bitmap,cliprect,state->m_background,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_foreground,0,0); + bitmap.fill(state->m_bgcolor, cliprect); + state->m_background->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_foreground->draw(bitmap, cliprect, 0,0); return 0; } @@ -238,7 +238,7 @@ if( state->m_vsgongf_color != data ) { state->m_vsgongf_color = data; - tilemap_mark_all_tiles_dirty( state->m_foreground ); + state->m_foreground ->mark_all_dirty(); } } @@ -262,20 +262,20 @@ state->m_foreground = tilemap_create(machine, get_vsgongf_tile_info,tilemap_scan_rows,8,8,32,32); } -SCREEN_UPDATE( vsgongf ) +SCREEN_UPDATE_IND16( vsgongf ) { - tsamurai_state *state = screen->machine().driver_data(); + tsamurai_state *state = screen.machine().driver_data(); #ifdef MAME_DEBUG - if( screen->machine().input().code_pressed( KEYCODE_Q ) ){ - while( screen->machine().input().code_pressed( KEYCODE_Q ) ){ + if( screen.machine().input().code_pressed( KEYCODE_Q ) ){ + while( screen.machine().input().code_pressed( KEYCODE_Q ) ){ state->m_key_count++; state->m_vsgongf_color = state->m_key_count; - tilemap_mark_all_tiles_dirty( state->m_foreground ); + state->m_foreground ->mark_all_dirty(); } } #endif - tilemap_draw(bitmap,cliprect,state->m_foreground,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); + state->m_foreground->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/tubep.c mame-0.145/src/mame/video/tubep.c --- mame-0.144/src/mame/video/tubep.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tubep.c 2012-02-06 21:30:32.000000000 +0000 @@ -585,20 +585,20 @@ } -SCREEN_UPDATE( tubep ) +SCREEN_UPDATE_IND16( tubep ) { - tubep_state *state = screen->machine().driver_data(); + tubep_state *state = screen.machine().driver_data(); int DISP_ = state->m_DISP^1; pen_t pen_base = 32; //change it later UINT32 v; - UINT8 *text_gfx_base = screen->machine().region("gfx1")->base(); - UINT8 *romBxx = screen->machine().region("user1")->base() + 0x2000*state->m_background_romsel; + UINT8 *text_gfx_base = screen.machine().region("gfx1")->base(); + UINT8 *romBxx = screen.machine().region("user1")->base() + 0x2000*state->m_background_romsel; - /* logerror(" update: from DISP=%i y_min=%3i y_max=%3i\n", DISP_, cliprect->min_y, cliprect->max_y+1); */ + /* logerror(" update: from DISP=%i y_min=%3i y_max=%3i\n", DISP_, cliprect.min_y, cliprect.max_y+1); */ - for (v = cliprect->min_y; v <= cliprect->max_y; v++) /* only for current scanline */ + for (v = cliprect.min_y; v <= cliprect.max_y; v++) /* only for current scanline */ { UINT32 h; UINT32 sp_data0=0,sp_data1=0,sp_data2=0; @@ -617,7 +617,7 @@ text_gfx_data = text_gfx_base[(text_code << 3) | (v & 0x07)]; if (text_gfx_data & (0x80 >> (h & 0x07))) - *BITMAP_ADDR16(bitmap, v, h) = (state->m_textram[text_offs + 1] & 0x0f) | state->m_color_A4; + bitmap.pix16(v, h) = (state->m_textram[text_offs + 1] & 0x0f) | state->m_color_A4; else { UINT32 bg_data; @@ -658,7 +658,7 @@ if (sp_data != 0x0f) bg_data = state->m_prom2[sp_data | state->m_color_A4]; - *BITMAP_ADDR16(bitmap, v, h) = pen_base + bg_data*64 + romB_data_h; + bitmap.pix16(v, h) = pen_base + bg_data*64 + romB_data_h; } } } @@ -743,14 +743,14 @@ } -SCREEN_UPDATE( rjammer ) +SCREEN_UPDATE_IND16( rjammer ) { - tubep_state *state = screen->machine().driver_data(); + tubep_state *state = screen.machine().driver_data(); int DISP_ = state->m_DISP^1; UINT32 v; - UINT8 *text_gfx_base = screen->machine().region("gfx1")->base(); - UINT8 *rom13D = screen->machine().region("user1")->base(); + UINT8 *text_gfx_base = screen.machine().region("gfx1")->base(); + UINT8 *rom13D = screen.machine().region("user1")->base(); UINT8 *rom11BD = rom13D+0x1000; UINT8 *rom19C = rom13D+0x5000; @@ -758,7 +758,7 @@ /* especially read from ROM19C can be done once per 8 pixels*/ /* and the data could be bitswapped beforehand */ - for (v = cliprect->min_y; v <= cliprect->max_y; v++) /* only for current scanline */ + for (v = cliprect.min_y; v <= cliprect.max_y; v++) /* only for current scanline */ { UINT32 h; UINT32 sp_data0=0,sp_data1=0,sp_data2=0; @@ -788,7 +788,7 @@ text_gfx_data = text_gfx_base[(text_code << 3) | (v & 0x07)]; if (text_gfx_data & (0x80 >> (h & 0x07))) - *BITMAP_ADDR16(bitmap, v, h) = 0x10 | (state->m_textram[text_offs + 1] & 0x0f); + bitmap.pix16(v, h) = 0x10 | (state->m_textram[text_offs + 1] & 0x0f); else { UINT32 sp_data; @@ -799,7 +799,7 @@ sp_data = sp_data1; if (sp_data != 0x0f) - *BITMAP_ADDR16(bitmap, v, h) = 0x00 + sp_data; + bitmap.pix16(v, h) = 0x00 + sp_data; else { UINT32 bg_data; @@ -852,7 +852,7 @@ color_bank = (pal14h4_pin13 & ((bg_data&0x08)>>3) & ((bg_data&0x04)>>2) & (((bg_data&0x02)>>1)^1) & (bg_data&0x01) ) | (pal14h4_pin18 & ((bg_data&0x08)>>3) & ((bg_data&0x04)>>2) & ((bg_data&0x02)>>1) & ((bg_data&0x01)^1) ) | (pal14h4_pin19); - *BITMAP_ADDR16(bitmap, v, h) = 0x20 + color_bank*0x10 + bg_data; + bitmap.pix16(v, h) = 0x20 + color_bank*0x10 + bg_data; } } } diff -Nru mame-0.144/src/mame/video/tumbleb.c mame-0.145/src/mame/video/tumbleb.c --- mame-0.144/src/mame/video/tumbleb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tumbleb.c 2012-02-06 21:30:32.000000000 +0000 @@ -16,206 +16,10 @@ #include "emu.h" #include "includes/tumbleb.h" +#include "video/decospr.h" /******************************************************************************/ -static void tumblepb_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - tumbleb_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int offs; - - for (offs = 0; offs < 0x400; offs += 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - - sprite = spriteram[offs + 1] & 0x3fff; - if (!sprite) - continue; - - y = spriteram[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = spriteram[offs + 2]; - colour = (x >> 9) & 0xf; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - y = 240 - y; - x = 304 - x; - - sprite &= ~multi; - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (state->m_flipscreen) - { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else - mult = -16; - - while (multi >= 0) - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[3], - sprite - multi * inc, - colour, - fx,fy, - state->m_sprite_xoffset + x, state->m_sprite_yoffset + y + mult * multi, 0); - - multi--; - } - } -} - -static void jumpkids_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - tumbleb_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int offs; - - for (offs = 0; offs < state->m_spriteram_size / 2; offs += 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - - sprite = spriteram[offs + 1] & 0x7fff; - if (!sprite) - continue; - - y = spriteram[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = spriteram[offs+2]; - colour = (x >> 9) & 0xf; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - y = 240 - y; - x = 304 - x; - - // sprite &= ~multi; /* Todo: I bet TumblePop bootleg doesn't do this either */ - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (state->m_flipscreen) - { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else - mult = -16; - - while (multi >= 0) - { - drawgfx_transpen(bitmap,// x-1 for bcstory .. realign other layers? - cliprect,machine.gfx[3], - sprite - multi * inc, - colour, - fx,fy, - state->m_sprite_xoffset + x, state->m_sprite_yoffset + y + mult * multi, 0); - - multi--; - } - } -} - -static void fncywld_draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) -{ - tumbleb_state *state = machine.driver_data(); - UINT16 *spriteram = state->m_spriteram; - int offs; - - for (offs = 0; offs < 0x400; offs += 4) - { - int x, y, sprite, colour, multi, fx, fy, inc, flash, mult; - - sprite = spriteram[offs + 1] & 0x3fff; - if (!sprite) - continue; - - y = spriteram[offs]; - flash = y & 0x1000; - if (flash && (machine.primary_screen->frame_number() & 1)) - continue; - - x = spriteram[offs + 2]; - colour = (x >> 9) & 0x3f; - - fx = y & 0x2000; - fy = y & 0x4000; - multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */ - - x = x & 0x01ff; - y = y & 0x01ff; - if (x >= 320) x -= 512; - if (y >= 256) y -= 512; - y = 240 - y; - x = 304 - x; - - // sprite &= ~multi; /* Todo: I bet TumblePop bootleg doesn't do this either */ - if (fy) - inc = -1; - else - { - sprite += multi; - inc = 1; - } - - if (state->m_flipscreen) - { - y = 240 - y; - x = 304 - x; - if (fx) fx = 0; else fx = 1; - if (fy) fy = 0; else fy = 1; - mult = 16; - } - else mult = -16; - - while (multi >= 0) - { - drawgfx_transpen(bitmap,cliprect,machine.gfx[3], - sprite - multi * inc, - colour, - fx,fy, - state->m_sprite_xoffset + x, state->m_sprite_yoffset + y + mult * multi, 15); - - multi--; - } - } -} /******************************************************************************/ @@ -224,9 +28,9 @@ tumbleb_state *state = space->machine().driver_data(); state->m_tilebank = data; - tilemap_mark_all_tiles_dirty(state->m_pf1_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf1_alt_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf2_tilemap); + state->m_pf1_tilemap->mark_all_dirty(); + state->m_pf1_alt_tilemap->mark_all_dirty(); + state->m_pf2_tilemap->mark_all_dirty(); } WRITE16_HANDLER( chokchok_tilebank_w ) @@ -234,9 +38,9 @@ tumbleb_state *state = space->machine().driver_data(); state->m_tilebank = data << 1; - tilemap_mark_all_tiles_dirty(state->m_pf1_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf1_alt_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf2_tilemap); + state->m_pf1_tilemap->mark_all_dirty(); + state->m_pf1_alt_tilemap->mark_all_dirty(); + state->m_pf2_tilemap->mark_all_dirty(); } WRITE16_HANDLER( wlstar_tilebank_w ) @@ -245,9 +49,9 @@ /* it just writes 0000 or ffff */ state->m_tilebank = data & 0x4000; - tilemap_mark_all_tiles_dirty(state->m_pf1_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf1_alt_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf2_tilemap); + state->m_pf1_tilemap->mark_all_dirty(); + state->m_pf1_alt_tilemap->mark_all_dirty(); + state->m_pf2_tilemap->mark_all_dirty(); } @@ -256,9 +60,9 @@ tumbleb_state *state = space->machine().driver_data(); state->m_tilebank = data << 14; // shift it here, makes using bcstory_tilebank easier - tilemap_mark_all_tiles_dirty(state->m_pf1_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf1_alt_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf2_tilemap); + state->m_pf1_tilemap->mark_all_dirty(); + state->m_pf1_alt_tilemap->mark_all_dirty(); + state->m_pf2_tilemap->mark_all_dirty(); } @@ -267,8 +71,8 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf1_data[offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap, offset); - tilemap_mark_tile_dirty(state->m_pf1_alt_tilemap, offset); + state->m_pf1_tilemap->mark_tile_dirty(offset); + state->m_pf1_alt_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( tumblepb_pf2_data_w ) @@ -276,10 +80,10 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf2_data[offset]); - tilemap_mark_tile_dirty(state->m_pf2_tilemap, offset); + state->m_pf2_tilemap->mark_tile_dirty(offset); if (state->m_pf2_alt_tilemap) - tilemap_mark_tile_dirty(state->m_pf2_alt_tilemap, offset); + state->m_pf2_alt_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( fncywld_pf1_data_w ) @@ -287,8 +91,8 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf1_data[offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap, offset / 2); - tilemap_mark_tile_dirty(state->m_pf1_alt_tilemap, offset / 2); + state->m_pf1_tilemap->mark_tile_dirty(offset / 2); + state->m_pf1_alt_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( fncywld_pf2_data_w ) @@ -296,7 +100,7 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf2_data[offset]); - tilemap_mark_tile_dirty(state->m_pf2_tilemap, offset / 2); + state->m_pf2_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( tumblepb_control_0_w ) @@ -311,8 +115,8 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf1_data[offset]); - tilemap_mark_tile_dirty(state->m_pf1_tilemap, offset / 2); - tilemap_mark_tile_dirty(state->m_pf1_alt_tilemap, offset / 2); + state->m_pf1_tilemap->mark_tile_dirty(offset / 2); + state->m_pf1_alt_tilemap->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( pangpang_pf2_data_w ) @@ -320,10 +124,10 @@ tumbleb_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_pf2_data[offset]); - tilemap_mark_tile_dirty(state->m_pf2_tilemap, offset / 2); + state->m_pf2_tilemap->mark_tile_dirty(offset / 2); if (state->m_pf2_alt_tilemap) - tilemap_mark_tile_dirty(state->m_pf2_alt_tilemap, offset / 2); + state->m_pf2_alt_tilemap->mark_tile_dirty(offset / 2); } /******************************************************************************/ @@ -334,7 +138,7 @@ return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x60) << 5); } -INLINE void get_bg_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) +INLINE void get_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) { tumbleb_state *state = machine.driver_data(); int data = gfx_base[tile_index]; @@ -361,7 +165,7 @@ 0); } -INLINE void get_fncywld_bg_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) +INLINE void get_fncywld_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base) { int data = gfx_base[tile_index * 2]; int attr = gfx_base[tile_index * 2 + 1]; @@ -440,7 +244,7 @@ 0); } -INLINE void pangpang_get_bg_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) +INLINE void pangpang_get_bg_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) { int data = gfx_base[tile_index * 2 + 1]; int attr = gfx_base[tile_index * 2]; @@ -452,7 +256,7 @@ 0); } -INLINE void pangpang_get_bg2x_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) +INLINE void pangpang_get_bg2x_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int gfx_bank, UINT16 *gfx_base ) { int data = gfx_base[tile_index * 2 + 1]; int attr = gfx_base[tile_index * 2]; @@ -486,11 +290,11 @@ { tumbleb_state *state = machine.driver_data(); - tilemap_mark_all_tiles_dirty(state->m_pf1_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf1_alt_tilemap); - tilemap_mark_all_tiles_dirty(state->m_pf2_tilemap); + state->m_pf1_tilemap->mark_all_dirty(); + state->m_pf1_alt_tilemap->mark_all_dirty(); + state->m_pf2_tilemap->mark_all_dirty(); if (state->m_pf2_alt_tilemap) - tilemap_mark_all_tiles_dirty(state->m_pf2_alt_tilemap); + state->m_pf2_alt_tilemap->mark_all_dirty(); } VIDEO_START( pangpang ) @@ -501,11 +305,8 @@ state->m_pf1_alt_tilemap = tilemap_create(machine, pangpang_get_bg1_tile_info, tumblep_scan, 16, 16, 64, 32); state->m_pf2_tilemap = tilemap_create(machine, pangpang_get_bg2_tile_info, tumblep_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 0); - - state->m_sprite_xoffset = -1; - state->m_sprite_yoffset = 0; + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf1_alt_tilemap->set_transparent_pen(0); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } @@ -519,11 +320,8 @@ state->m_pf1_alt_tilemap = tilemap_create(machine, get_bg1_tile_info, tumblep_scan, 16, 16, 64, 32); state->m_pf2_tilemap = tilemap_create(machine, get_bg2_tile_info, tumblep_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 0); - - state->m_sprite_xoffset = -1; - state->m_sprite_yoffset = 0; + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf1_alt_tilemap->set_transparent_pen(0); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } @@ -536,12 +334,8 @@ state->m_pf1_alt_tilemap = tilemap_create(machine, get_bg1_tile_info, tumblep_scan, 16, 16, 64, 32); state->m_pf2_tilemap = tilemap_create(machine, get_bg2_tile_info, tumblep_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 0); - - /* aligned to monitor test */ - state->m_sprite_xoffset = 0; - state->m_sprite_yoffset = 1; + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf1_alt_tilemap->set_transparent_pen(0); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } @@ -554,11 +348,8 @@ state->m_pf1_alt_tilemap = tilemap_create(machine, get_fncywld_bg1_tile_info, tumblep_scan, 16, 16, 64, 32); state->m_pf2_tilemap = tilemap_create(machine, get_fncywld_bg2_tile_info, tumblep_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 15); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 15); - - state->m_sprite_xoffset = -1; - state->m_sprite_yoffset = 0; + state->m_pf1_tilemap->set_transparent_pen(15); + state->m_pf1_alt_tilemap->set_transparent_pen(15); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } @@ -572,16 +363,13 @@ state->m_pf2_tilemap = tilemap_create(machine, get_jumppop_bg2_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->m_pf2_alt_tilemap = tilemap_create(machine, get_jumppop_bg2_alt_tile_info, tilemap_scan_rows, 8, 8, 128, 64); - tilemap_set_transparent_pen(state->m_pf1_tilemap, 0); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 0); - - tilemap_set_flip(state->m_pf1_tilemap, TILEMAP_FLIPX); - tilemap_set_flip(state->m_pf1_alt_tilemap, TILEMAP_FLIPX); - tilemap_set_flip(state->m_pf2_tilemap, TILEMAP_FLIPX); - tilemap_set_flip(state->m_pf2_alt_tilemap, TILEMAP_FLIPX); + state->m_pf1_tilemap->set_transparent_pen(0); + state->m_pf1_alt_tilemap->set_transparent_pen(0); - state->m_sprite_xoffset = -1; - state->m_sprite_yoffset = 0; + state->m_pf1_tilemap->set_flip(TILEMAP_FLIPX); + state->m_pf1_alt_tilemap->set_flip(TILEMAP_FLIPX); + state->m_pf2_tilemap->set_flip(TILEMAP_FLIPX); + state->m_pf2_alt_tilemap->set_flip(TILEMAP_FLIPX); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } @@ -595,21 +383,41 @@ state->m_pf1_alt_tilemap = tilemap_create(machine, get_bg1_tile_info, tumblep_scan, 16, 16, 64, 32); state->m_pf2_tilemap = tilemap_create(machine, get_bg2_tile_info, tumblep_scan, 16, 16, 64, 32); - tilemap_set_transparent_pen(state->m_pf1_alt_tilemap, 0); + state->m_pf1_alt_tilemap->set_transparent_pen(0); machine.save().register_postload(save_prepost_delegate(FUNC(tumbleb_tilemap_redraw), &machine)); } /******************************************************************************/ +void tumbleb_draw_common(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pf1x_offs, int pf1y_offs, int pf2x_offs, int pf2y_offs) +{ + tumbleb_state *state = machine.driver_data(); + + state->m_pf1_tilemap->set_scrollx(0, state->m_control_0[1] + pf1x_offs); + state->m_pf1_tilemap->set_scrolly(0, state->m_control_0[2] + pf1y_offs); + state->m_pf1_alt_tilemap->set_scrollx(0, state->m_control_0[1] + pf1x_offs); + state->m_pf1_alt_tilemap->set_scrolly(0, state->m_control_0[2] + pf1y_offs); + state->m_pf2_tilemap->set_scrollx(0, state->m_control_0[3] + pf2x_offs); + state->m_pf2_tilemap->set_scrolly(0, state->m_control_0[4] + pf2y_offs); -SCREEN_UPDATE( tumblepb ) + state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); + + if (state->m_control_0[6] & 0x80) + state->m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); + else + state->m_pf1_alt_tilemap->draw(bitmap, cliprect, 0, 0); + + machine.device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, state->m_spriteram_size/2); +} + +SCREEN_UPDATE_IND16( tumblepb ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (state->m_flipscreen) offs = 1; @@ -621,31 +429,18 @@ else offs2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, 0, offs, 0); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - tumblepb_draw_sprites(screen->machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( jumpkids ) +SCREEN_UPDATE_IND16( jumpkids ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (state->m_flipscreen) offs = 1; @@ -657,31 +452,17 @@ else offs2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, 0, offs, 0); return 0; } -SCREEN_UPDATE( semicom ) +SCREEN_UPDATE_IND16( semicom ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (state->m_flipscreen) offs = 1; @@ -693,27 +474,13 @@ else offs2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, 0, offs, 0); return 0; } -SCREEN_UPDATE( semicom_altoffsets ) +SCREEN_UPDATE_IND16( semicom_altoffsets ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offsx, offsy, offsx2; state->m_flipscreen = state->m_control_0[0] & 0x80; @@ -722,31 +489,18 @@ offsy = 2; offsx2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offsx2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offsx2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offsx); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4] + offsy); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offsx2, 0, offsx, offsy); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( bcstory ) +SCREEN_UPDATE_IND16( bcstory ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); /* not sure of this */ if (state->m_flipscreen) @@ -760,90 +514,48 @@ else offs2 = 8; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, 0, offs, 0); return 0; } -SCREEN_UPDATE( semibase ) +SCREEN_UPDATE_IND16( semibase ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); offs = -1; offs2 = -2; - /* sprites need an offset too */ - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, 0, offs, 0); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); return 0; } -SCREEN_UPDATE( sdfight ) +SCREEN_UPDATE_IND16( sdfight ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); offs = -1; offs2 = -5; // foreground scroll.. - /* sprites need an offset too */ - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2] - 16); // needed for the ground ... - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2] - 16); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, -16, offs, 0); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); - - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, state->m_spriteram_size/2); return 0; } - - -SCREEN_UPDATE( fncywld ) +SCREEN_UPDATE_IND16( fncywld ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); int offs, offs2; state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); if (state->m_flipscreen) offs = 1; @@ -855,117 +567,77 @@ else offs2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); - - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, -16, offs, 0); - fncywld_draw_sprites(screen->machine(), bitmap, cliprect); return 0; } - -SCREEN_UPDATE( jumppop ) +SCREEN_UPDATE_IND16( pangpang ) { - tumbleb_state *state = screen->machine().driver_data(); - - // bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + tumbleb_state *state = screen.machine().driver_data(); + int offs, offs2; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control[2] - 0x3a0); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control[3]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control[2] - 0x3a0); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control[3]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control[0] - 0x3a2); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control[1]); - tilemap_set_scrollx(state->m_pf2_alt_tilemap, 0, state->m_control[0] - 0x3a2); - tilemap_set_scrolly(state->m_pf2_alt_tilemap, 0, state->m_control[1]); + state->m_flipscreen = state->m_control_0[0] & 0x80; + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - if (state->m_control[7] & 1) - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); + if (state->m_flipscreen) + offs = 1; else - tilemap_draw(bitmap, cliprect, state->m_pf2_alt_tilemap, 0, 0); + offs = -1; - if (state->m_control[7] & 2) - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); + if (state->m_flipscreen) + offs2 = -3; else - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - -//popmessage("%04x %04x %04x %04x %04x %04x %04x %04x", state->m_control[0],state->m_control[1],state->m_control[2],state->m_control[3],state->m_control[4],state->m_control[5],state->m_control[6],state->m_control[7]); + offs2 = -5; - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + tumbleb_draw_common(screen.machine(),bitmap,cliprect, offs2, -16, offs, 0); return 0; } -SCREEN_UPDATE( suprtrio ) + +SCREEN_UPDATE_IND16( jumppop ) { - tumbleb_state *state = screen->machine().driver_data(); + tumbleb_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, -state->m_control[1] - 6); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, -state->m_control[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, -state->m_control[3] - 2); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, -state->m_control[4]); + state->m_pf1_tilemap->set_scrollx(0, state->m_control[2] - 0x3a0); + state->m_pf1_tilemap->set_scrolly(0, state->m_control[3]); + state->m_pf1_alt_tilemap->set_scrollx(0, state->m_control[2] - 0x3a0); + state->m_pf1_alt_tilemap->set_scrolly(0, state->m_control[3]); + state->m_pf2_tilemap->set_scrollx(0, state->m_control[0] - 0x3a2); + state->m_pf2_tilemap->set_scrolly(0, state->m_control[1]); + state->m_pf2_alt_tilemap->set_scrollx(0, state->m_control[0] - 0x3a2); + state->m_pf2_alt_tilemap->set_scrolly(0, state->m_control[1]); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); + if (state->m_control[7] & 1) + state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); + else + state->m_pf2_alt_tilemap->draw(bitmap, cliprect, 0, 0); + + if (state->m_control[7] & 2) + state->m_pf1_alt_tilemap->draw(bitmap, cliprect, 0, 0); + else + state->m_pf1_tilemap->draw(bitmap, cliprect, 0, 0); - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); -#if 0 -popmessage("%04x %04x %04x %04x %04x %04x %04x %04x", - state->m_control[0], - state->m_control[1], - state->m_control[2], - state->m_control[3], - state->m_control[4], - state->m_control[5], - state->m_control[6], - state->m_control[7]); -#endif + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, state->m_spriteram_size/2); return 0; } -SCREEN_UPDATE( pangpang ) -{ - tumbleb_state *state = screen->machine().driver_data(); - int offs, offs2; - - state->m_flipscreen = state->m_control_0[0] & 0x80; - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - - if (state->m_flipscreen) - offs = 1; - else - offs = -1; - - if (state->m_flipscreen) - offs2 = -3; - else - offs2 = -5; - tilemap_set_scrollx(state->m_pf1_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf1_alt_tilemap, 0, state->m_control_0[1] + offs2); - tilemap_set_scrolly(state->m_pf1_alt_tilemap, 0, state->m_control_0[2]); - tilemap_set_scrollx(state->m_pf2_tilemap, 0, state->m_control_0[3] + offs); - tilemap_set_scrolly(state->m_pf2_tilemap, 0, state->m_control_0[4]); +SCREEN_UPDATE_IND16( suprtrio ) +{ + tumbleb_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_pf2_tilemap, 0, 0); + state->m_pf1_alt_tilemap->set_scrollx(0, -state->m_control[1] - 6); + state->m_pf1_alt_tilemap->set_scrolly(0, -state->m_control[2]); + state->m_pf2_tilemap->set_scrollx(0, -state->m_control[3] - 2); + state->m_pf2_tilemap->set_scrolly(0, -state->m_control[4]); - if (state->m_control_0[6] & 0x80) - tilemap_draw(bitmap, cliprect, state->m_pf1_tilemap, 0, 0); - else - tilemap_draw(bitmap, cliprect, state->m_pf1_alt_tilemap, 0, 0); + state->m_pf2_tilemap->draw(bitmap, cliprect, 0, 0); + state->m_pf1_alt_tilemap->draw(bitmap, cliprect, 0, 0); - jumpkids_draw_sprites(screen->machine(), bitmap, cliprect); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, state->m_spriteram_size/2); return 0; } + diff -Nru mame-0.144/src/mame/video/tumblep.c mame-0.145/src/mame/video/tumblep.c --- mame-0.144/src/mame/video/tumblep.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tumblep.c 2012-02-06 21:30:32.000000000 +0000 @@ -19,19 +19,19 @@ #include "video/decospr.h" -SCREEN_UPDATE( tumblep ) +SCREEN_UPDATE_IND16( tumblep ) { - tumblep_state *state = screen->machine().driver_data(); + tumblep_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); - flip_screen_set(screen->machine(), BIT(flip, 7)); + flip_screen_set(screen.machine(), BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll); - bitmap_fill(bitmap, cliprect, 256); /* not verified */ + bitmap.fill(256, cliprect); /* not verified */ deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram, 0x400); + screen.machine().device("spritegen")->draw_sprites(bitmap, cliprect, state->m_spriteram, 0x400); return 0; } diff -Nru mame-0.144/src/mame/video/tunhunt.c mame-0.145/src/mame/video/tunhunt.c --- mame-0.144/src/mame/video/tunhunt.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tunhunt.c 2012-02-06 21:30:32.000000000 +0000 @@ -53,7 +53,7 @@ tunhunt_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } static TILE_GET_INFO( get_fg_tile_info ) @@ -76,12 +76,12 @@ */ tunhunt_state *state = machine.driver_data(); - machine.generic.tmpbitmap = auto_bitmap_alloc(machine, 256, 64, machine.primary_screen->format()); + state->m_tmpbitmap.allocate(256, 64, machine.primary_screen->format()); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrollx(state->m_fg_tilemap, 0, 64); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrollx(0, 64); } PALETTE_INIT( tunhunt ) @@ -200,7 +200,7 @@ } } -static void draw_motion_object(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_motion_object(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* * VSTRLO 0x1202 @@ -214,7 +214,7 @@ */ tunhunt_state *state = machine.driver_data(); - bitmap_t *tmpbitmap = machine.generic.tmpbitmap; + bitmap_ind16 &tmpbitmap = state->m_tmpbitmap; UINT8 *spriteram = state->m_spriteram; UINT8 *tunhunt_ram = state->m_workram; //int skip = tunhunt_ram[MOBST]; @@ -238,10 +238,10 @@ color = ((span_data>>6)&0x3)^0x3; count = (span_data&0x1f)+1; while( count-- && x < 256 ) - *BITMAP_ADDR16(tmpbitmap, line, x++) = color; + tmpbitmap.pix16(line, x++) = color; } while( x<256 ) - *BITMAP_ADDR16(tmpbitmap, line, x++) = 0; + tmpbitmap.pix16(line, x++) = 0; } /* next line */ switch( tunhunt_ram[VSTRLO] ) @@ -272,7 +272,7 @@ ); } -static void draw_box(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_box(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* This is unnecessarily slow, but the box priorities aren't completely understood, @@ -302,7 +302,7 @@ for( y=0; y<256; y++ ) { - if (0xff-y >= cliprect->min_y && 0xff-y <= cliprect->max_y) + if (0xff-y >= cliprect.min_y && 0xff-y <= cliprect.max_y) for( x=0; x<256; x++ ) { color = 0; @@ -319,16 +319,16 @@ z = x0; /* give priority to rightmost spans */ } } - if (x >= cliprect->min_x && x <= cliprect->max_x) - *BITMAP_ADDR16(bitmap, 0xff-y, x) = color; + if (x >= cliprect.min_x && x <= cliprect.max_x) + bitmap.pix16(0xff-y, x) = color; } } } /* "shell" graphics are 16x16 pixel tiles used for player shots and targeting cursor */ static void draw_shell(running_machine &machine, - bitmap_t *bitmap, - const rectangle *cliprect, + bitmap_ind16 &bitmap, + const rectangle &cliprect, int picture_code, int hposition, int vstart, @@ -376,16 +376,16 @@ 255-hposition-16,vstart-32,0 ); } -SCREEN_UPDATE( tunhunt ) +SCREEN_UPDATE_IND16( tunhunt ) { - tunhunt_state *state = screen->machine().driver_data(); - set_pens(screen->machine()); + tunhunt_state *state = screen.machine().driver_data(); + set_pens(screen.machine()); - draw_box(screen->machine(), bitmap, cliprect); + draw_box(screen.machine(), bitmap, cliprect); - draw_motion_object(screen->machine(), bitmap, cliprect); + draw_motion_object(screen.machine(), bitmap, cliprect); - draw_shell(screen->machine(), bitmap, cliprect, + draw_shell(screen.machine(), bitmap, cliprect, state->m_workram[SHL0PC], /* picture code */ state->m_workram[SHEL0H], /* hposition */ state->m_workram[SHL0V], /* vstart */ @@ -393,7 +393,7 @@ state->m_workram[SHL0ST], /* vstretch */ state->m_control&0x08 ); /* hstretch */ - draw_shell(screen->machine(), bitmap, cliprect, + draw_shell(screen.machine(), bitmap, cliprect, state->m_workram[SHL1PC], /* picture code */ state->m_workram[SHEL1H], /* hposition */ state->m_workram[SHL1V], /* vstart */ @@ -401,6 +401,6 @@ state->m_workram[SHL1ST], /* vstretch */ state->m_control&0x10 ); /* hstretch */ - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/turbo.c mame-0.145/src/mame/video/turbo.c --- mame-0.144/src/mame/video/turbo.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/turbo.c 2012-02-06 21:30:32.000000000 +0000 @@ -209,7 +209,7 @@ if (offset < 0x400) { space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } } @@ -404,12 +404,12 @@ * *************************************/ -SCREEN_UPDATE( turbo ) +SCREEN_UPDATE_IND16( turbo ) { - turbo_state *state = screen->machine().driver_data(); - bitmap_t *fgpixmap = tilemap_get_pixmap(state->m_fg_tilemap); - const UINT8 *road_gfxdata = screen->machine().region("gfx3")->base(); - const UINT8 *prom_base = screen->machine().region("proms")->base(); + turbo_state *state = screen.machine().driver_data(); + bitmap_ind16 &fgpixmap = state->m_fg_tilemap->pixmap(); + const UINT8 *road_gfxdata = screen.machine().region("gfx3")->base(); + const UINT8 *prom_base = screen.machine().region("proms")->base(); const UINT8 *pr1114 = prom_base + 0x000; const UINT8 *pr1115 = prom_base + 0x020; const UINT8 *pr1116 = prom_base + 0x040; @@ -421,10 +421,10 @@ int x, y; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - const UINT16 *fore = (UINT16 *)fgpixmap->base + y * fgpixmap->rowpixels; - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + const UINT16 *fore = &fgpixmap.pix16(y); + UINT16 *dest = &bitmap.pix16(y); int sel, coch, babit, slipar_acciar, area, offs, areatmp, road = 0; sprite_info sprinfo; @@ -437,10 +437,10 @@ /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ /* on the previous scanline */ - turbo_prepare_sprites(screen->machine(), state, y, &sprinfo); + turbo_prepare_sprites(screen.machine(), state, y, &sprinfo); /* loop over columns */ - for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) + for (x = 0; x <= cliprect.max_x; x += TURBO_X_SCALE) { int bacol, red, grn, blu, priority, foreraw, forebits, mx, ix; int xx = x / TURBO_X_SCALE; @@ -533,7 +533,7 @@ /* CDG0-7 = D8 -D15 */ /* CDR0-7 = D16-D23 */ /* PLB0-7 = D24-D31 */ - sprbits = turbo_get_sprite_bits(screen->machine(), road, &sprinfo); + sprbits = turbo_get_sprite_bits(screen.machine(), road, &sprinfo); /* perform collision detection here via lookup in IC20/PR1116 (p. 144) */ state->m_turbo_collision |= pr1116[((sprbits >> 24) & 7) | (slipar_acciar >> 1)]; @@ -759,11 +759,11 @@ * *************************************/ -SCREEN_UPDATE( subroc3d ) +SCREEN_UPDATE_IND16( subroc3d ) { - turbo_state *state = screen->machine().driver_data(); - bitmap_t *fgpixmap = tilemap_get_pixmap(state->m_fg_tilemap); - const UINT8 *prom_base = screen->machine().region("proms")->base(); + turbo_state *state = screen.machine().driver_data(); + bitmap_ind16 &fgpixmap = state->m_fg_tilemap->pixmap(); + const UINT8 *prom_base = screen.machine().region("proms")->base(); const UINT8 *pr1419 = prom_base + 0x000; const UINT8 *pr1620 = prom_base + 0x200; const UINT8 *pr1450 = prom_base + 0x500; @@ -771,18 +771,18 @@ int x, y; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - const UINT16 *fore = (UINT16 *)fgpixmap->base + y * fgpixmap->rowpixels; - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + const UINT16 *fore = &fgpixmap.pix16(y); + UINT16 *dest = &bitmap.pix16(y); sprite_info sprinfo; /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ /* on the previous scanline */ - subroc3d_prepare_sprites(screen->machine(), state, y, &sprinfo); + subroc3d_prepare_sprites(screen.machine(), state, y, &sprinfo); /* loop over columns */ - for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) + for (x = 0; x <= cliprect.max_x; x += TURBO_X_SCALE) { int offs, finalbits, ix; UINT8 xx = x / TURBO_X_SCALE; @@ -819,7 +819,7 @@ /* CDB0-7 = D8 -D15 */ /* CDC0-7 = D16-D23 */ /* CDD0-7 = D24-D31 */ - sprbits = subroc3d_get_sprite_bits(screen->machine(), &sprinfo, &plb); + sprbits = subroc3d_get_sprite_bits(screen.machine(), &sprinfo, &plb); /* MUX0-3 is selected by PLY0-3 and the sprite enable bits, and is the output */ /* of IC21/PR1450 (p. 141), unless MPLB = 0, in which case the values are grounded (p. 141) */ @@ -979,30 +979,30 @@ * *************************************/ -SCREEN_UPDATE( buckrog ) +SCREEN_UPDATE_IND16( buckrog ) { - turbo_state *state = screen->machine().driver_data(); - bitmap_t *fgpixmap = tilemap_get_pixmap(state->m_fg_tilemap); - const UINT8 *bgcolor = screen->machine().region("gfx3")->base(); - const UINT8 *prom_base = screen->machine().region("proms")->base(); + turbo_state *state = screen.machine().driver_data(); + bitmap_ind16 &fgpixmap = state->m_fg_tilemap->pixmap(); + const UINT8 *bgcolor = screen.machine().region("gfx3")->base(); + const UINT8 *prom_base = screen.machine().region("proms")->base(); const UINT8 *pr5194 = prom_base + 0x000; const UINT8 *pr5198 = prom_base + 0x500; const UINT8 *pr5199 = prom_base + 0x700; int x, y; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - const UINT16 *fore = (UINT16 *)fgpixmap->base + y * fgpixmap->rowpixels; - UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + const UINT16 *fore = &fgpixmap.pix16(y); + UINT16 *dest = &bitmap.pix16(y); sprite_info sprinfo; /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ /* on the previous scanline */ - buckrog_prepare_sprites(screen->machine(), state, y, &sprinfo); + buckrog_prepare_sprites(screen.machine(), state, y, &sprinfo); /* loop over columns */ - for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) + for (x = 0; x <= cliprect.max_x; x += TURBO_X_SCALE) { UINT8 foreraw, forebits, cd, plb, star, mux; UINT8 xx = x / TURBO_X_SCALE; @@ -1036,7 +1036,7 @@ /* CDB0-7 = D8 -D15 */ /* CDC0-7 = D16-D23 */ /* CDD0-7 = D24-D31 */ - sprbits = buckrog_get_sprite_bits(screen->machine(), &sprinfo, &plb); + sprbits = buckrog_get_sprite_bits(screen.machine(), &sprinfo, &plb); /* the PLB bits go into an LS148 8-to-1 decoder and become MUX0-3 (PROM board SH 2/10) */ if (plb == 0) diff -Nru mame-0.144/src/mame/video/tutankhm.c mame-0.145/src/mame/video/tutankhm.c --- mame-0.144/src/mame/video/tutankhm.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/tutankhm.c 2012-02-06 21:30:31.000000000 +0000 @@ -59,21 +59,21 @@ * *************************************/ -SCREEN_UPDATE( tutankhm ) +SCREEN_UPDATE_RGB32( tutankhm ) { - tutankhm_state *state = screen->machine().driver_data(); + tutankhm_state *state = screen.machine().driver_data(); int xorx = state->m_flip_x ? 255 : 0; int xory = state->m_flip_y ? 255 : 0; pen_t pens[NUM_PENS]; int x, y; - get_pens(screen->machine(), pens); + get_pens(screen.machine(), pens); - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT32 *dst = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dst = &bitmap.pix32(y); - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { UINT8 effx = x ^ xorx; UINT8 yscroll = (effx < 192) ? *state->m_scroll : 0; diff -Nru mame-0.144/src/mame/video/twin16.c mame-0.145/src/mame/video/twin16.c --- mame-0.144/src/mame/video/twin16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/twin16.c 2012-02-06 21:30:32.000000000 +0000 @@ -44,7 +44,7 @@ { twin16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_text_ram[offset]); - tilemap_mark_tile_dirty(state->m_text_tilemap, offset); + state->m_text_tilemap->mark_tile_dirty(offset); } WRITE16_HANDLER( twin16_paletteram_word_w ) @@ -221,7 +221,7 @@ state->m_need_process_spriteram = 0; } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap ) { twin16_state *state = machine.driver_data(); const UINT16 *source = 0x1800+machine.generic.buffered_spriteram.u16 + 0x800 - 4; @@ -303,8 +303,8 @@ int sy = (flipy)?(ypos+height-1-y):(ypos+y); if( sy>=16 && sy<256-16 ) { - UINT16 *dest = BITMAP_ADDR16(bitmap, sy, 0); - UINT8 *pdest = BITMAP_ADDR8(machine.priority_bitmap, sy, 0); + UINT16 *dest = &bitmap.pix16(sy); + UINT8 *pdest = &machine.priority_bitmap.pix8(sy); for( x=0; x(); UINT16 *videoram = state->m_videoram; @@ -416,9 +416,9 @@ if( ypos>=256 ) ypos -= 512; x1 = MAX(xpos, 0); - x2 = MIN(xpos+7, bitmap->width-1); + x2 = MIN(xpos+7, bitmap.width()-1); y1 = MAX(ypos, 0); - y2 = MIN(ypos+7, bitmap->height-1); + y2 = MIN(ypos+7, bitmap.height()-1); if (x1 <= x2 && y1 <= y2) { @@ -438,8 +438,8 @@ for (y = y1; y <= y2; y++) { const UINT16 *gfxptr = gfx_data + ((y - ypos) ^ yxor) * 2; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pdest = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pdest = &machine.priority_bitmap.pix8(y); for (x = x1; x <= x2; x++) { @@ -455,8 +455,8 @@ for (y = y1; y <= y2; y++) { const UINT16 *gfxptr = gfx_data + ((y - ypos) ^ yxor) * 2; - UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0); - UINT8 *pdest = BITMAP_ADDR8(machine.priority_bitmap, y, 0); + UINT16 *dest = &bitmap.pix16(y); + UINT8 *pdest = &machine.priority_bitmap.pix8(y); for (x = x1; x <= x2; x++) { @@ -500,7 +500,7 @@ { twin16_state *state = machine.driver_data(); state->m_text_tilemap = tilemap_create(machine, get_text_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_text_tilemap, 0); + state->m_text_tilemap->set_transparent_pen(0); palette_set_shadow_factor(machine,0.4); // screenshots estimate @@ -520,41 +520,45 @@ state_save_register_global(machine, state->m_sprite_busy); } -SCREEN_UPDATE( twin16 ) +SCREEN_UPDATE_IND16( twin16 ) { - twin16_state *state = screen->machine().driver_data(); + twin16_state *state = screen.machine().driver_data(); int text_flip=0; if (state->m_video_register&TWIN16_SCREEN_FLIPX) text_flip|=TILEMAP_FLIPX; if (state->m_video_register&TWIN16_SCREEN_FLIPY) text_flip|=TILEMAP_FLIPY; - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); - draw_layer( screen->machine(), bitmap, 1 ); - draw_layer( screen->machine(), bitmap, 0 ); - draw_sprites( screen->machine(), bitmap ); + screen.machine().priority_bitmap.fill(0, cliprect); + draw_layer( screen.machine(), bitmap, 1 ); + draw_layer( screen.machine(), bitmap, 0 ); + draw_sprites( screen.machine(), bitmap ); - if (text_flip) tilemap_set_flip(state->m_text_tilemap, text_flip); - tilemap_draw(bitmap, cliprect, state->m_text_tilemap, 0, 0); + if (text_flip) state->m_text_tilemap->set_flip(text_flip); + state->m_text_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_EOF( twin16 ) +SCREEN_VBLANK( twin16 ) { - twin16_state *state = machine.driver_data(); - twin16_set_sprite_timer(machine); + // rising edge + if (vblank_on) + { + twin16_state *state = screen.machine().driver_data(); + twin16_set_sprite_timer(screen.machine()); - if (twin16_spriteram_process_enable(machine)) { - if (state->m_need_process_spriteram) twin16_spriteram_process(machine); - state->m_need_process_spriteram = 1; - - /* if the sprite preprocessor is used, sprite ram is copied to an external buffer first, - as evidenced by 1-frame sprite lag in gradius2 and devilw otherwise, though there's probably - more to it than that */ - memcpy(&machine.generic.buffered_spriteram.u16[0x1800],state->m_sprite_buffer,0x800*sizeof(UINT16)); - memcpy(state->m_sprite_buffer,&machine.generic.spriteram.u16[0x1800],0x800*sizeof(UINT16)); - } - else { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); - buffer_spriteram16_w(space,0,0,0xffff); + if (twin16_spriteram_process_enable(screen.machine())) { + if (state->m_need_process_spriteram) twin16_spriteram_process(screen.machine()); + state->m_need_process_spriteram = 1; + + /* if the sprite preprocessor is used, sprite ram is copied to an external buffer first, + as evidenced by 1-frame sprite lag in gradius2 and devilw otherwise, though there's probably + more to it than that */ + memcpy(&screen.machine().generic.buffered_spriteram.u16[0x1800],state->m_sprite_buffer,0x800*sizeof(UINT16)); + memcpy(state->m_sprite_buffer,&screen.machine().generic.spriteram.u16[0x1800],0x800*sizeof(UINT16)); + } + else { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); + buffer_spriteram16_w(space,0,0,0xffff); + } } } diff -Nru mame-0.144/src/mame/video/twincobr.c mame-0.145/src/mame/video/twincobr.c --- mame-0.144/src/mame/video/twincobr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/twincobr.c 2012-02-06 21:30:32.000000000 +0000 @@ -97,8 +97,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,64); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); } VIDEO_START( toaplan0 ) @@ -159,16 +159,16 @@ twincobr_state *state = machine.driver_data(); state->m_display_on = enable; - tilemap_set_enable(state->m_bg_tilemap, enable); - tilemap_set_enable(state->m_fg_tilemap, enable); - tilemap_set_enable(state->m_tx_tilemap, enable); + state->m_bg_tilemap->enable(enable); + state->m_fg_tilemap->enable(enable); + state->m_tx_tilemap->enable(enable); } void twincobr_flipscreen(running_machine &machine, int flip) { twincobr_state *state = machine.driver_data(); - tilemap_set_flip_all(machine, (flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); + machine.tilemap().set_flip_all((flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0)); state->m_flip_screen = flip; if (flip) { state->m_scroll_x = 0x008; @@ -199,7 +199,7 @@ twincobr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_txvideoram16[state->m_txoffs]); - tilemap_mark_tile_dirty(state->m_tx_tilemap,state->m_txoffs); + state->m_tx_tilemap->mark_tile_dirty(state->m_txoffs); } WRITE16_HANDLER( twincobr_bgoffs_w ) @@ -220,7 +220,7 @@ twincobr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bgvideoram16[state->m_bgoffs+state->m_bg_ram_bank]); - tilemap_mark_tile_dirty(state->m_bg_tilemap,(state->m_bgoffs+state->m_bg_ram_bank)); + state->m_bg_tilemap->mark_tile_dirty((state->m_bgoffs+state->m_bg_ram_bank)); } WRITE16_HANDLER( twincobr_fgoffs_w ) @@ -241,7 +241,7 @@ twincobr_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fgvideoram16[state->m_fgoffs]); - tilemap_mark_tile_dirty(state->m_fg_tilemap,state->m_fgoffs); + state->m_fg_tilemap->mark_tile_dirty(state->m_fgoffs); } @@ -251,11 +251,11 @@ if (offset == 0) { COMBINE_DATA(&state->m_txscrollx); - tilemap_set_scrollx(state->m_tx_tilemap,0,(state->m_txscrollx+state->m_scroll_x) & 0x1ff); + state->m_tx_tilemap->set_scrollx(0,(state->m_txscrollx+state->m_scroll_x) & 0x1ff); } else { COMBINE_DATA(&state->m_txscrolly); - tilemap_set_scrolly(state->m_tx_tilemap,0,(state->m_txscrolly+state->m_scroll_y) & 0x1ff); + state->m_tx_tilemap->set_scrolly(0,(state->m_txscrolly+state->m_scroll_y) & 0x1ff); } } @@ -265,11 +265,11 @@ if (offset == 0) { COMBINE_DATA(&state->m_bgscrollx); - tilemap_set_scrollx(state->m_bg_tilemap,0,(state->m_bgscrollx+state->m_scroll_x) & 0x1ff); + state->m_bg_tilemap->set_scrollx(0,(state->m_bgscrollx+state->m_scroll_x) & 0x1ff); } else { COMBINE_DATA(&state->m_bgscrolly); - tilemap_set_scrolly(state->m_bg_tilemap,0,(state->m_bgscrolly+state->m_scroll_y) & 0x1ff); + state->m_bg_tilemap->set_scrolly(0,(state->m_bgscrolly+state->m_scroll_y) & 0x1ff); } } @@ -279,11 +279,11 @@ if (offset == 0) { COMBINE_DATA(&state->m_fgscrollx); - tilemap_set_scrollx(state->m_fg_tilemap,0,(state->m_fgscrollx+state->m_scroll_x) & 0x1ff); + state->m_fg_tilemap->set_scrollx(0,(state->m_fgscrollx+state->m_scroll_x) & 0x1ff); } else { COMBINE_DATA(&state->m_fgscrolly); - tilemap_set_scrolly(state->m_fg_tilemap,0,(state->m_fgscrolly+state->m_scroll_y) & 0x1ff); + state->m_fg_tilemap->set_scrolly(0,(state->m_fgscrolly+state->m_scroll_y) & 0x1ff); } } @@ -458,7 +458,7 @@ Sprite Handlers ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { twincobr_state *state = machine.driver_data(); int offs; @@ -494,34 +494,38 @@ /*************************************************************************** - Draw the game screen in the given bitmap_t. + Draw the game screen in the given bitmap_ind16. ***************************************************************************/ -SCREEN_UPDATE( toaplan0 ) +SCREEN_UPDATE_IND16( toaplan0 ) { - twincobr_state *state = screen->machine().driver_data(); - twincobr_log_vram(screen->machine()); + twincobr_state *state = screen.machine().driver_data(); + twincobr_log_vram(screen.machine()); - if (state->m_wardner_sprite_hack) wardner_sprite_priority_hack(screen->machine()); + if (state->m_wardner_sprite_hack) wardner_sprite_priority_hack(screen.machine()); - bitmap_fill(bitmap,cliprect,0); + bitmap.fill(0, cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect,0x0400); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0x0800); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect,0x0c00); + state->m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect,0x0400); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0x0800); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect,0x0c00); return 0; } -SCREEN_EOF( toaplan0 ) +SCREEN_VBLANK( toaplan0 ) { - address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); + // rising edge + if (vblank_on) + { + address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); - /* Spriteram is always 1 frame ahead, suggesting spriteram buffering. - There are no CPU output registers that control this so we - assume it happens automatically every frame, at the end of vblank */ - buffer_spriteram16_w(space,0,0,0xffff); + /* Spriteram is always 1 frame ahead, suggesting spriteram buffering. + There are no CPU output registers that control this so we + assume it happens automatically every frame, at the end of vblank */ + buffer_spriteram16_w(space,0,0,0xffff); + } } diff -Nru mame-0.144/src/mame/video/tx1.c mame-0.145/src/mame/video/tx1.c --- mame-0.144/src/mame/video/tx1.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/tx1.c 2012-02-06 21:30:31.000000000 +0000 @@ -1110,7 +1110,7 @@ { tx1_state *state = machine.driver_data(); /* Allocate a large bitmap that covers the three screens */ - state->m_bitmap = auto_bitmap_alloc(machine, 768, 256, BITMAP_FORMAT_INDEXED16); + state->m_bitmap = auto_bitmap_ind16_alloc(machine, 768, 256); /* Allocate some bitmaps */ state->m_chr_bmp = auto_alloc_array(machine, UINT8, 256 * 3 * 240); @@ -1124,14 +1124,19 @@ state->m_interrupt_timer->adjust(machine.primary_screen->time_until_pos(CURSOR_YPOS, CURSOR_XPOS)); } -SCREEN_EOF( tx1 ) +SCREEN_VBLANK( tx1 ) { - tx1_state *state = machine.driver_data(); - /* /VSYNC: Update TZ113 */ - state->m_vregs.slin_val += state->m_vregs.slin_inc; + // rising edge + if (vblank_on) + { + tx1_state *state = screen.machine().driver_data(); + + /* /VSYNC: Update TZ113 */ + state->m_vregs.slin_val += state->m_vregs.slin_inc; + } } -static void tx1_combine_layers(running_machine &machine, bitmap_t *bitmap, int screen) +static void tx1_combine_layers(running_machine &machine, bitmap_ind16 &bitmap, int screen) { tx1_state *state = machine.driver_data(); int x, y; @@ -1141,7 +1146,7 @@ for (y = 0; y < 240; ++y) { - UINT16 *bmp_addr = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *bmp_addr = &bitmap.pix16(y); UINT32 bmp_offset = y * 768 + x_offset; @@ -1182,32 +1187,29 @@ } } -SCREEN_UPDATE( tx1 ) +SCREEN_UPDATE_IND16( tx1_left ) { - tx1_state *state = screen->machine().driver_data(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *centre_screen = screen->machine().device("cscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + tx1_state *state = screen.machine().driver_data(); - if (screen == left_screen) - { - memset(state->m_obj_bmp, 0, 768*240); + memset(state->m_obj_bmp, 0, 768*240); - tx1_draw_char(screen->machine(), state->m_chr_bmp); - tx1_draw_road(screen->machine(), state->m_rod_bmp); - tx1_draw_objects(screen->machine(), state->m_obj_bmp); + tx1_draw_char(screen.machine(), state->m_chr_bmp); + tx1_draw_road(screen.machine(), state->m_rod_bmp); + tx1_draw_objects(screen.machine(), state->m_obj_bmp); - tx1_combine_layers(screen->machine(), bitmap, 0); - } - else if (screen == centre_screen) - { - tx1_combine_layers(screen->machine(), bitmap, 1); - } - else if (screen == right_screen) - { - tx1_combine_layers(screen->machine(), bitmap, 2); - } + tx1_combine_layers(screen.machine(), bitmap, 0); + return 0; +} + +SCREEN_UPDATE_IND16( tx1_middle ) +{ + tx1_combine_layers(screen.machine(), bitmap, 1); + return 0; +} +SCREEN_UPDATE_IND16( tx1_right ) +{ + tx1_combine_layers(screen.machine(), bitmap, 2); return 0; } @@ -2932,7 +2934,7 @@ * *************************************/ -static void bb_combine_layers(running_machine &machine, bitmap_t *bitmap, int screen) +static void bb_combine_layers(running_machine &machine, bitmap_ind16 &bitmap, int screen) { tx1_state *state = machine.driver_data(); UINT8 *chr_pal = machine.region("proms")->base() + 0x400; @@ -2964,7 +2966,7 @@ UINT32 sky_en = BIT(state->m_vregs.sky, 7); UINT32 sky_val = (((state->m_vregs.sky & 0x7f) + y) >> 2) & 0x3f; - UINT16 *bmp_addr = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *bmp_addr = &bitmap.pix16(y); for (x = 0; x < 256; ++x) { @@ -3030,58 +3032,58 @@ state->m_interrupt_timer->adjust(machine.primary_screen->time_until_pos(CURSOR_YPOS, CURSOR_XPOS)); } -SCREEN_EOF( buggyboy ) +SCREEN_VBLANK( buggyboy ) { - tx1_state *state = machine.driver_data(); + // rising edge + if (vblank_on) + { + tx1_state *state = screen.machine().driver_data(); - /* /VSYNC: Update TZ113 @ 219 */ - state->m_vregs.slin_val += state->m_vregs.slin_inc; + /* /VSYNC: Update TZ113 @ 219 */ + state->m_vregs.slin_val += state->m_vregs.slin_inc; - /* /VSYNC: Clear wave LFSR */ - state->m_vregs.wave_lfsr = 0; + /* /VSYNC: Clear wave LFSR */ + state->m_vregs.wave_lfsr = 0; + } } -SCREEN_UPDATE( buggyboy ) +SCREEN_UPDATE_IND16( buggyboy_left ) { - tx1_state *state = screen->machine().driver_data(); - device_t *left_screen = screen->machine().device("lscreen"); - device_t *center_screen = screen->machine().device("cscreen"); - device_t *right_screen = screen->machine().device("rscreen"); + tx1_state *state = screen.machine().driver_data(); - if (screen == left_screen) - { - memset(state->m_obj_bmp, 0, 768*240); - memset(state->m_rod_bmp, 0, 768*240); + memset(state->m_obj_bmp, 0, 768*240); + memset(state->m_rod_bmp, 0, 768*240); - buggyboy_draw_char(screen->machine(), state->m_chr_bmp, 1); - buggyboy_draw_road(screen->machine(), state->m_rod_bmp); - buggyboy_draw_objs(screen->machine(), state->m_obj_bmp, 1); + buggyboy_draw_char(screen.machine(), state->m_chr_bmp, 1); + buggyboy_draw_road(screen.machine(), state->m_rod_bmp); + buggyboy_draw_objs(screen.machine(), state->m_obj_bmp, 1); - bb_combine_layers(screen->machine(), bitmap, 0); - } - else if (screen == center_screen) - { - bb_combine_layers(screen->machine(), bitmap, 1); - } - else if (screen == right_screen) - { - bb_combine_layers(screen->machine(), bitmap, 2); - } + bb_combine_layers(screen.machine(), bitmap, 0); + return 0; +} +SCREEN_UPDATE_IND16( buggyboy_middle ) +{ + bb_combine_layers(screen.machine(), bitmap, 1); return 0; +} +SCREEN_UPDATE_IND16( buggyboy_right ) +{ + bb_combine_layers(screen.machine(), bitmap, 2); + return 0; } -SCREEN_UPDATE( buggybjr ) +SCREEN_UPDATE_IND16( buggybjr ) { - tx1_state *state = screen->machine().driver_data(); + tx1_state *state = screen.machine().driver_data(); memset(state->m_obj_bmp, 0, 256*240); - buggyboy_draw_char(screen->machine(), state->m_chr_bmp, 0); - buggybjr_draw_road(screen->machine(), state->m_rod_bmp, 0); - buggyboy_draw_objs(screen->machine(), state->m_obj_bmp, 0); + buggyboy_draw_char(screen.machine(), state->m_chr_bmp, 0); + buggybjr_draw_road(screen.machine(), state->m_rod_bmp, 0); + buggyboy_draw_objs(screen.machine(), state->m_obj_bmp, 0); - bb_combine_layers(screen->machine(), bitmap, -1); + bb_combine_layers(screen.machine(), bitmap, -1); return 0; } diff -Nru mame-0.144/src/mame/video/ultraman.c mame-0.145/src/mame/video/ultraman.c --- mame-0.144/src/mame/video/ultraman.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/ultraman.c 2012-02-06 21:30:32.000000000 +0000 @@ -90,7 +90,7 @@ if (state->m_bank0 != ((data & 0x02) >> 1)) { state->m_bank0 = (data & 0x02) >> 1; - tilemap_mark_all_tiles_dirty_all(space->machine()); /* should mark only zoom0 */ + space->machine().tilemap().mark_all_dirty(); /* should mark only zoom0 */ } k051316_wraparound_enable(state->m_k051316_2, data & 0x04); @@ -98,7 +98,7 @@ if (state->m_bank1 != ((data & 0x08) >> 3)) { state->m_bank1 = (data & 0x08) >> 3; - tilemap_mark_all_tiles_dirty_all(space->machine()); /* should mark only zoom1 */ + space->machine().tilemap().mark_all_dirty(); /* should mark only zoom1 */ } k051316_wraparound_enable(state->m_k051316_3, data & 0x10); @@ -106,7 +106,7 @@ if (state->m_bank2 != ((data & 0x20) >> 5)) { state->m_bank2 = (data & 0x20) >> 5; - tilemap_mark_all_tiles_dirty_all(space->machine()); /* should mark only zoom2 */ + space->machine().tilemap().mark_all_dirty(); /* should mark only zoom2 */ } coin_counter_w(space->machine(), 0, data & 0x40); @@ -122,9 +122,9 @@ ***************************************************************************/ -SCREEN_UPDATE( ultraman ) +SCREEN_UPDATE_IND16( ultraman ) { - ultraman_state *state = screen->machine().driver_data(); + ultraman_state *state = screen.machine().driver_data(); k051316_zoom_draw(state->m_k051316_3, bitmap, cliprect, 0, 0); k051316_zoom_draw(state->m_k051316_2, bitmap, cliprect, 0, 0); diff -Nru mame-0.144/src/mame/video/ultratnk.c mame-0.145/src/mame/video/ultratnk.c --- mame-0.144/src/mame/video/ultratnk.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ultratnk.c 2012-02-06 21:30:32.000000000 +0000 @@ -49,19 +49,19 @@ VIDEO_START( ultratnk ) { ultratnk_state *state = machine.driver_data(); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); state->m_playfield = tilemap_create(machine, ultratnk_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -SCREEN_UPDATE( ultratnk ) +SCREEN_UPDATE_IND16( ultratnk ) { - ultratnk_state *state = screen->machine().driver_data(); + ultratnk_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int i; - tilemap_draw(bitmap, cliprect, state->m_playfield, 0, 0); + state->m_playfield->draw(bitmap, cliprect, 0, 0); for (i = 0; i < 4; i++) { @@ -77,7 +77,7 @@ if (!(attr & 0x80)) { - drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, cliprect, screen.machine().gfx[1], (code >> 3) | bank, i, 0, 0, @@ -90,58 +90,62 @@ } -SCREEN_EOF( ultratnk ) +SCREEN_VBLANK( ultratnk ) { - ultratnk_state *state = machine.driver_data(); - int i; - UINT16 BG = colortable_entry_get_value(machine.colortable, 0); - device_t *discrete = machine.device("discrete"); - UINT8 *videoram = state->m_videoram; + // rising edge + if (vblank_on) + { + ultratnk_state *state = screen.machine().driver_data(); + int i; + UINT16 BG = colortable_entry_get_value(screen.machine().colortable, 0); + device_t *discrete = screen.machine().device("discrete"); + UINT8 *videoram = state->m_videoram; - /* check for sprite-playfield collisions */ + /* check for sprite-playfield collisions */ - for (i = 0; i < 4; i++) - { - rectangle rect; + for (i = 0; i < 4; i++) + { + rectangle rect; - int x; - int y; + int x; + int y; - int bank = 0; + int bank = 0; - UINT8 horz = videoram[0x390 + 2 * i + 0]; - UINT8 vert = videoram[0x398 + 2 * i + 0]; - UINT8 code = videoram[0x398 + 2 * i + 1]; + UINT8 horz = videoram[0x390 + 2 * i + 0]; + UINT8 vert = videoram[0x398 + 2 * i + 0]; + UINT8 code = videoram[0x398 + 2 * i + 1]; - rect.min_x = horz - 15; - rect.min_y = vert - 15; - rect.max_x = horz - 15 + machine.gfx[1]->width - 1; - rect.max_y = vert - 15 + machine.gfx[1]->height - 1; + rect.min_x = horz - 15; + rect.min_y = vert - 15; + rect.max_x = horz - 15 + screen.machine().gfx[1]->width - 1; + rect.max_y = vert - 15 + screen.machine().gfx[1]->height - 1; - sect_rect(&rect, &machine.primary_screen->visible_area()); + rect &= screen.machine().primary_screen->visible_area(); - tilemap_draw(state->m_helper, &rect, state->m_playfield, 0, 0); + state->m_playfield->draw(state->m_helper, rect, 0, 0); - if (code & 4) - bank = 32; + if (code & 4) + bank = 32; - drawgfx_transpen(state->m_helper, &rect, machine.gfx[1], - (code >> 3) | bank, - 4, - 0, 0, - horz - 15, - vert - 15, 1); - - for (y = rect.min_y; y <= rect.max_y; y++) - for (x = rect.min_x; x <= rect.max_x; x++) - if (colortable_entry_get_value(machine.colortable, *BITMAP_ADDR16(state->m_helper, y, x)) != BG) - state->m_collision[i] = 1; - } + drawgfx_transpen(state->m_helper, rect, screen.machine().gfx[1], + (code >> 3) | bank, + 4, + 0, 0, + horz - 15, + vert - 15, 1); - /* update sound status */ + for (y = rect.min_y; y <= rect.max_y; y++) + for (x = rect.min_x; x <= rect.max_x; x++) + if (colortable_entry_get_value(screen.machine().colortable, state->m_helper.pix16(y, x)) != BG) + state->m_collision[i] = 1; + } - discrete_sound_w(discrete, ULTRATNK_MOTOR_DATA_1, videoram[0x391] & 15); - discrete_sound_w(discrete, ULTRATNK_MOTOR_DATA_2, videoram[0x393] & 15); + /* update sound status */ + + discrete_sound_w(discrete, ULTRATNK_MOTOR_DATA_1, videoram[0x391] & 15); + discrete_sound_w(discrete, ULTRATNK_MOTOR_DATA_2, videoram[0x393] & 15); + } } @@ -150,5 +154,5 @@ ultratnk_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_playfield, offset); + state->m_playfield->mark_tile_dirty(offset); } diff -Nru mame-0.144/src/mame/video/undrfire.c mame-0.145/src/mame/video/undrfire.c --- mame-0.144/src/mame/video/undrfire.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/undrfire.c 2012-02-06 21:30:31.000000000 +0000 @@ -64,7 +64,7 @@ ***************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,const int *primasks,int x_offs,int y_offs) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,const int *primasks,int x_offs,int y_offs) { undrfire_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -208,7 +208,7 @@ } -static void draw_sprites_cbombers(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,const int *primasks,int x_offs,int y_offs) +static void draw_sprites_cbombers(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,const int *primasks,int x_offs,int y_offs) { undrfire_state *state = machine.driver_data(); UINT32 *spriteram32 = state->m_spriteram; @@ -347,46 +347,46 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( undrfire ) +SCREEN_UPDATE_IND16( undrfire ) { - device_t *tc0100scn = screen->machine().device("tc0100scn"); - device_t *tc0480scp = screen->machine().device("tc0480scp"); + device_t *tc0100scn = screen.machine().device("tc0100scn"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT8 pivlayer[3]; UINT16 priority; #ifdef MAME_DEBUG - undrfire_state *state = screen->machine().driver_data(); - if (screen->machine().input().code_pressed_once (KEYCODE_X)) + undrfire_state *state = screen.machine().driver_data(); + if (screen.machine().input().code_pressed_once (KEYCODE_X)) { state->m_dislayer[5] ^= 1; popmessage("piv text: %01x",state->m_dislayer[5]); } - if (screen->machine().input().code_pressed_once (KEYCODE_C)) + if (screen.machine().input().code_pressed_once (KEYCODE_C)) { state->m_dislayer[0] ^= 1; popmessage("bg0: %01x",state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once (KEYCODE_V)) + if (screen.machine().input().code_pressed_once (KEYCODE_V)) { state->m_dislayer[1] ^= 1; popmessage("bg1: %01x",state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once (KEYCODE_B)) + if (screen.machine().input().code_pressed_once (KEYCODE_B)) { state->m_dislayer[2] ^= 1; popmessage("bg2: %01x",state->m_dislayer[2]); } - if (screen->machine().input().code_pressed_once (KEYCODE_N)) + if (screen.machine().input().code_pressed_once (KEYCODE_N)) { state->m_dislayer[3] ^= 1; popmessage("bg3: %01x",state->m_dislayer[3]); } - if (screen->machine().input().code_pressed_once (KEYCODE_M)) + if (screen.machine().input().code_pressed_once (KEYCODE_M)) { state->m_dislayer[4] ^= 1; popmessage("sprites: %01x",state->m_dislayer[4]); @@ -408,8 +408,8 @@ pivlayer[1] = pivlayer[0] ^ 1; pivlayer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ /* The "PIV" chip seems to be a renamed TC0100SCN. It has a @@ -449,12 +449,12 @@ if ((tc0480scp_pri_reg_r(tc0480scp, 0) & 0x3) == 3) /* on road levels kludge sprites up 1 priority */ { static const int primasks[4] = {0xfff0, 0xff00, 0x0, 0x0}; - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 44, -574); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 44, -574); } else { static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; - draw_sprites(screen->machine(), bitmap, cliprect, primasks, 44, -574); + draw_sprites(screen.machine(), bitmap, cliprect, primasks, 44, -574); } } @@ -468,7 +468,7 @@ /* See if we should draw artificial gun targets */ /* (not yet implemented...) */ - if (input_port_read(screen->machine(), "FAKE") & 0x1) /* Fake DSW */ + if (input_port_read(screen.machine(), "FAKE") & 0x1) /* Fake DSW */ { popmessage("Gunsights on"); } @@ -490,46 +490,46 @@ } -SCREEN_UPDATE( cbombers ) +SCREEN_UPDATE_IND16( cbombers ) { - device_t *tc0100scn = screen->machine().device("tc0100scn"); - device_t *tc0480scp = screen->machine().device("tc0480scp"); + device_t *tc0100scn = screen.machine().device("tc0100scn"); + device_t *tc0480scp = screen.machine().device("tc0480scp"); UINT8 layer[5]; UINT8 pivlayer[3]; UINT16 priority; #ifdef MAME_DEBUG - undrfire_state *state = screen->machine().driver_data(); - if (screen->machine().input().code_pressed_once (KEYCODE_X)) + undrfire_state *state = screen.machine().driver_data(); + if (screen.machine().input().code_pressed_once (KEYCODE_X)) { state->m_dislayer[5] ^= 1; popmessage("piv text: %01x",state->m_dislayer[5]); } - if (screen->machine().input().code_pressed_once (KEYCODE_C)) + if (screen.machine().input().code_pressed_once (KEYCODE_C)) { state->m_dislayer[0] ^= 1; popmessage("bg0: %01x",state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once (KEYCODE_V)) + if (screen.machine().input().code_pressed_once (KEYCODE_V)) { state->m_dislayer[1] ^= 1; popmessage("bg1: %01x",state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once (KEYCODE_B)) + if (screen.machine().input().code_pressed_once (KEYCODE_B)) { state->m_dislayer[2] ^= 1; popmessage("bg2: %01x",state->m_dislayer[2]); } - if (screen->machine().input().code_pressed_once (KEYCODE_N)) + if (screen.machine().input().code_pressed_once (KEYCODE_N)) { state->m_dislayer[3] ^= 1; popmessage("bg3: %01x",state->m_dislayer[3]); } - if (screen->machine().input().code_pressed_once (KEYCODE_M)) + if (screen.machine().input().code_pressed_once (KEYCODE_M)) { state->m_dislayer[4] ^= 1; popmessage("sprites: %01x",state->m_dislayer[4]); @@ -551,8 +551,8 @@ pivlayer[1] = pivlayer[0] ^ 1; pivlayer[2] = 2; - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - bitmap_fill(bitmap, cliprect, 0); /* wrong color? */ + screen.machine().priority_bitmap.fill(0, cliprect); + bitmap.fill(0, cliprect); /* wrong color? */ /* The "PIV" chip seems to be a renamed TC0100SCN. It has a @@ -592,12 +592,12 @@ if ((tc0480scp_pri_reg_r(tc0480scp, 0) & 0x3) == 3) /* on road levels kludge sprites up 1 priority */ { static const int primasks[4] = {0xfff0, 0xff00, 0x0, 0x0}; - draw_sprites_cbombers(screen->machine(), bitmap, cliprect, primasks, 80, -208); + draw_sprites_cbombers(screen.machine(), bitmap, cliprect, primasks, 80, -208); } else { static const int primasks[4] = {0xfffc, 0xfff0, 0xff00, 0x0}; - draw_sprites_cbombers(screen->machine(), bitmap, cliprect, primasks, 80, -208); + draw_sprites_cbombers(screen.machine(), bitmap, cliprect, primasks, 80, -208); } } diff -Nru mame-0.144/src/mame/video/unico.c mame-0.145/src/mame/video/unico.c --- mame-0.144/src/mame/video/unico.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/unico.c 2012-02-06 21:30:32.000000000 +0000 @@ -110,7 +110,7 @@ UINT16 *vram = state->m_vram; int tile = ((offset / 0x2000) + 1) % 3; COMBINE_DATA(&vram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap[tile],(offset & 0x3fff)/2); + state->m_tilemap[tile]->mark_tile_dirty((offset & 0x3fff)/2); } WRITE32_HANDLER( unico_vram32_w ) @@ -119,7 +119,7 @@ UINT32 *vram = state->m_vram32; int tile = ((offset / 0x1000) + 1) % 3; COMBINE_DATA(&vram[offset]); - tilemap_mark_tile_dirty(state->m_tilemap[tile],(offset & 0x3fff)); + state->m_tilemap[tile]->mark_tile_dirty((offset & 0x3fff)); } @@ -145,24 +145,24 @@ state->m_tilemap[2] = tilemap_create( machine, get_tile_info,tilemap_scan_rows, 16,16, 0x40, 0x40); - tilemap_set_user_data(state->m_tilemap[0], &state->m_vram[0x8000/2]); - tilemap_set_user_data(state->m_tilemap[1], &state->m_vram[0x0000/2]); - tilemap_set_user_data(state->m_tilemap[2], &state->m_vram[0x4000/2]); + state->m_tilemap[0]->set_user_data(&state->m_vram[0x8000/2]); + state->m_tilemap[1]->set_user_data(&state->m_vram[0x0000/2]); + state->m_tilemap[2]->set_user_data(&state->m_vram[0x4000/2]); state->m_sprites_scrolldx = -0x3f; state->m_sprites_scrolldy = -0x0e; - tilemap_set_scrolldx(state->m_tilemap[0],-0x32,0); - tilemap_set_scrolldx(state->m_tilemap[1],-0x30,0); - tilemap_set_scrolldx(state->m_tilemap[2],-0x2e,0); - - tilemap_set_scrolldy(state->m_tilemap[0],-0x0f,0); - tilemap_set_scrolldy(state->m_tilemap[1],-0x0f,0); - tilemap_set_scrolldy(state->m_tilemap[2],-0x0f,0); - - tilemap_set_transparent_pen(state->m_tilemap[0],0x00); - tilemap_set_transparent_pen(state->m_tilemap[1],0x00); - tilemap_set_transparent_pen(state->m_tilemap[2],0x00); + state->m_tilemap[0]->set_scrolldx(-0x32,0); + state->m_tilemap[1]->set_scrolldx(-0x30,0); + state->m_tilemap[2]->set_scrolldx(-0x2e,0); + + state->m_tilemap[0]->set_scrolldy(-0x0f,0); + state->m_tilemap[1]->set_scrolldy(-0x0f,0); + state->m_tilemap[2]->set_scrolldy(-0x0f,0); + + state->m_tilemap[0]->set_transparent_pen(0x00); + state->m_tilemap[1]->set_transparent_pen(0x00); + state->m_tilemap[2]->set_transparent_pen(0x00); } VIDEO_START( zeropnt2 ) @@ -177,24 +177,24 @@ state->m_tilemap[2] = tilemap_create( machine, get_tile_info32,tilemap_scan_rows, 16,16, 0x40, 0x40); - tilemap_set_user_data(state->m_tilemap[0], &state->m_vram32[0x8000/4]); - tilemap_set_user_data(state->m_tilemap[1], &state->m_vram32[0x0000/4]); - tilemap_set_user_data(state->m_tilemap[2], &state->m_vram32[0x4000/4]); + state->m_tilemap[0]->set_user_data(&state->m_vram32[0x8000/4]); + state->m_tilemap[1]->set_user_data(&state->m_vram32[0x0000/4]); + state->m_tilemap[2]->set_user_data(&state->m_vram32[0x4000/4]); state->m_sprites_scrolldx = -0x3f; state->m_sprites_scrolldy = -0x0e; - tilemap_set_scrolldx(state->m_tilemap[0],-0x32,0); - tilemap_set_scrolldx(state->m_tilemap[1],-0x30,0); - tilemap_set_scrolldx(state->m_tilemap[2],-0x2e,0); - - tilemap_set_scrolldy(state->m_tilemap[0],-0x0f,0); - tilemap_set_scrolldy(state->m_tilemap[1],-0x0f,0); - tilemap_set_scrolldy(state->m_tilemap[2],-0x0f,0); - - tilemap_set_transparent_pen(state->m_tilemap[0],0x00); - tilemap_set_transparent_pen(state->m_tilemap[1],0x00); - tilemap_set_transparent_pen(state->m_tilemap[2],0x00); + state->m_tilemap[0]->set_scrolldx(-0x32,0); + state->m_tilemap[1]->set_scrolldx(-0x30,0); + state->m_tilemap[2]->set_scrolldx(-0x2e,0); + + state->m_tilemap[0]->set_scrolldy(-0x0f,0); + state->m_tilemap[1]->set_scrolldy(-0x0f,0); + state->m_tilemap[2]->set_scrolldy(-0x0f,0); + + state->m_tilemap[0]->set_transparent_pen(0x00); + state->m_tilemap[1]->set_transparent_pen(0x00); + state->m_tilemap[2]->set_transparent_pen(0x00); } @@ -221,7 +221,7 @@ ***************************************************************************/ -static void unico_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void unico_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { unico_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -276,7 +276,7 @@ } } -static void zeropnt2_draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void zeropnt2_draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { unico_state *state = machine.driver_data(); UINT32 *spriteram32 = (UINT32 *)state->m_spriteram; @@ -341,82 +341,82 @@ ***************************************************************************/ -SCREEN_UPDATE( unico ) +SCREEN_UPDATE_IND16( unico ) { - unico_state *state = screen->machine().driver_data(); + unico_state *state = screen.machine().driver_data(); int layers_ctrl = -1; - tilemap_set_scrollx(state->m_tilemap[0], 0, state->m_scroll[0x00]); - tilemap_set_scrolly(state->m_tilemap[0], 0, state->m_scroll[0x01]); + state->m_tilemap[0]->set_scrollx(0, state->m_scroll[0x00]); + state->m_tilemap[0]->set_scrolly(0, state->m_scroll[0x01]); - tilemap_set_scrollx(state->m_tilemap[1], 0, state->m_scroll[0x05]); - tilemap_set_scrolly(state->m_tilemap[1], 0, state->m_scroll[0x0a]); + state->m_tilemap[1]->set_scrollx(0, state->m_scroll[0x05]); + state->m_tilemap[1]->set_scrolly(0, state->m_scroll[0x0a]); - tilemap_set_scrollx(state->m_tilemap[2], 0, state->m_scroll[0x04]); - tilemap_set_scrolly(state->m_tilemap[2], 0, state->m_scroll[0x02]); + state->m_tilemap[2]->set_scrollx(0, state->m_scroll[0x04]); + state->m_tilemap[2]->set_scrolly(0, state->m_scroll[0x02]); #ifdef MAME_DEBUG -if ( screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X) ) +if ( screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif /* The background color is the first of the last palette */ - bitmap_fill(bitmap,cliprect,0x1f00); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill(0x1f00, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->m_tilemap[0],0,1); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->m_tilemap[1],0,2); - if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->m_tilemap[2],0,4); + if (layers_ctrl & 1) state->m_tilemap[0]->draw(bitmap, cliprect, 0,1); + if (layers_ctrl & 2) state->m_tilemap[1]->draw(bitmap, cliprect, 0,2); + if (layers_ctrl & 4) state->m_tilemap[2]->draw(bitmap, cliprect, 0,4); /* Sprites are drawn last, using pdrawgfx */ - if (layers_ctrl & 8) unico_draw_sprites(screen->machine(), bitmap,cliprect); + if (layers_ctrl & 8) unico_draw_sprites(screen.machine(), bitmap,cliprect); return 0; } -SCREEN_UPDATE( zeropnt2 ) +SCREEN_UPDATE_IND16( zeropnt2 ) { - unico_state *state = screen->machine().driver_data(); + unico_state *state = screen.machine().driver_data(); int layers_ctrl = -1; - tilemap_set_scrollx(state->m_tilemap[0], 0, state->m_scroll32[0] >> 16); - tilemap_set_scrolly(state->m_tilemap[0], 0, state->m_scroll32[0] & 0xffff); + state->m_tilemap[0]->set_scrollx(0, state->m_scroll32[0] >> 16); + state->m_tilemap[0]->set_scrolly(0, state->m_scroll32[0] & 0xffff); - tilemap_set_scrollx(state->m_tilemap[1], 0, state->m_scroll32[2] & 0xffff); - tilemap_set_scrolly(state->m_tilemap[1], 0, state->m_scroll32[5] >> 16); + state->m_tilemap[1]->set_scrollx(0, state->m_scroll32[2] & 0xffff); + state->m_tilemap[1]->set_scrolly(0, state->m_scroll32[5] >> 16); - tilemap_set_scrollx(state->m_tilemap[2], 0, state->m_scroll32[2] >> 16); - tilemap_set_scrolly(state->m_tilemap[2], 0, state->m_scroll32[1] >> 16); + state->m_tilemap[2]->set_scrollx(0, state->m_scroll32[2] >> 16); + state->m_tilemap[2]->set_scrolly(0, state->m_scroll32[1] >> 16); #ifdef MAME_DEBUG -if ( screen->machine().input().code_pressed(KEYCODE_Z) || screen->machine().input().code_pressed(KEYCODE_X) ) +if ( screen.machine().input().code_pressed(KEYCODE_Z) || screen.machine().input().code_pressed(KEYCODE_X) ) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; - if (screen->machine().input().code_pressed(KEYCODE_E)) msk |= 4; - if (screen->machine().input().code_pressed(KEYCODE_A)) msk |= 8; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_E)) msk |= 4; + if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; } #endif /* The background color is the first of the last palette */ - bitmap_fill(bitmap,cliprect,0x1f00); - bitmap_fill(screen->machine().priority_bitmap,cliprect,0); + bitmap.fill(0x1f00, cliprect); + screen.machine().priority_bitmap.fill(0, cliprect); - if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->m_tilemap[0],0,1); - if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->m_tilemap[1],0,2); - if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->m_tilemap[2],0,4); + if (layers_ctrl & 1) state->m_tilemap[0]->draw(bitmap, cliprect, 0,1); + if (layers_ctrl & 2) state->m_tilemap[1]->draw(bitmap, cliprect, 0,2); + if (layers_ctrl & 4) state->m_tilemap[2]->draw(bitmap, cliprect, 0,4); /* Sprites are drawn last, using pdrawgfx */ - if (layers_ctrl & 8) zeropnt2_draw_sprites(screen->machine(), bitmap,cliprect); + if (layers_ctrl & 8) zeropnt2_draw_sprites(screen.machine(), bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/usgames.c mame-0.145/src/mame/video/usgames.c --- mame-0.144/src/mame/video/usgames.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/usgames.c 2012-02-06 21:30:33.000000000 +0000 @@ -54,7 +54,7 @@ { usgames_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,offset/2); + state->m_tilemap->mark_tile_dirty(offset/2); } WRITE8_HANDLER( usgames_charram_w ) @@ -65,9 +65,9 @@ } -SCREEN_UPDATE(usgames) +SCREEN_UPDATE_IND16(usgames) { - usgames_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_tilemap,0,0); + usgames_state *state = screen.machine().driver_data(); + state->m_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/vaportra.c mame-0.145/src/mame/video/vaportra.c --- mame-0.144/src/mame/video/vaportra.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vaportra.c 2012-02-06 21:30:31.000000000 +0000 @@ -50,49 +50,49 @@ /******************************************************************************/ -SCREEN_UPDATE( vaportra ) +SCREEN_UPDATE_IND16( vaportra ) { - vaportra_state *state = screen->machine().driver_data(); + vaportra_state *state = screen.machine().driver_data(); UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff); int pri = state->m_priority[0] & 0x03; - flip_screen_set(screen->machine(), !BIT(flip, 7)); + flip_screen_set(screen.machine(), !BIT(flip, 7)); deco16ic_pf_update(state->m_deco_tilegen1, 0, 0); deco16ic_pf_update(state->m_deco_tilegen2, 0, 0); - screen->machine().device("spritegen")->set_pri_type(1); // force priorities to be handled in a different way for this driver for now + screen.machine().device("spritegen")->set_pri_type(1); // force priorities to be handled in a different way for this driver for now /* Draw playfields */ if (pri == 0) { deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); } else if (pri == 1) { deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); } else if (pri == 2) { deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); } else { deco16ic_tilemap_1_draw(state->m_deco_tilegen2, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); deco16ic_tilemap_2_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 0, state->m_priority[1], 0x0f); deco16ic_tilemap_2_draw(state->m_deco_tilegen2, bitmap, cliprect, 0, 0); } - screen->machine().device("spritegen")->draw_sprites(screen->machine(), bitmap, cliprect, screen->machine().generic.buffered_spriteram.u16, 1, state->m_priority[1], 0x0f); + screen.machine().device("spritegen")->draw_sprites(screen.machine(), bitmap, cliprect, screen.machine().generic.buffered_spriteram.u16, 1, state->m_priority[1], 0x0f); deco16ic_tilemap_1_draw(state->m_deco_tilegen1, bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/vastar.c mame-0.145/src/mame/video/vastar.c --- mame-0.144/src/mame/video/vastar.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vastar.c 2012-02-06 21:30:33.000000000 +0000 @@ -76,12 +76,12 @@ state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_rows,8,8,32,32); state->m_bg2_tilemap = tilemap_create(machine, get_bg2_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_bg1_tilemap,0); - tilemap_set_transparent_pen(state->m_bg2_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_bg1_tilemap->set_transparent_pen(0); + state->m_bg2_tilemap->set_transparent_pen(0); - tilemap_set_scroll_cols(state->m_bg1_tilemap, 32); - tilemap_set_scroll_cols(state->m_bg2_tilemap, 32); + state->m_bg1_tilemap->set_scroll_cols(32); + state->m_bg2_tilemap->set_scroll_cols(32); } @@ -96,7 +96,7 @@ vastar_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( vastar_bg1videoram_w ) @@ -104,7 +104,7 @@ vastar_state *state = space->machine().driver_data(); state->m_bg1videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg1_tilemap,offset & 0x3ff); + state->m_bg1_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( vastar_bg2videoram_w ) @@ -112,7 +112,7 @@ vastar_state *state = space->machine().driver_data(); state->m_bg2videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg2_tilemap,offset & 0x3ff); + state->m_bg2_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -137,7 +137,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { vastar_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram1; @@ -196,40 +196,40 @@ } } -SCREEN_UPDATE( vastar ) +SCREEN_UPDATE_IND16( vastar ) { - vastar_state *state = screen->machine().driver_data(); + vastar_state *state = screen.machine().driver_data(); int i; for (i = 0;i < 32;i++) { - tilemap_set_scrolly(state->m_bg1_tilemap,i,state->m_bg1_scroll[i]); - tilemap_set_scrolly(state->m_bg2_tilemap,i,state->m_bg2_scroll[i]); + state->m_bg1_tilemap->set_scrolly(i,state->m_bg1_scroll[i]); + state->m_bg2_tilemap->set_scrolly(i,state->m_bg2_scroll[i]); } switch (*state->m_sprite_priority) { case 0: - tilemap_draw(bitmap,cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect, state->m_bg2_tilemap, 0,0); - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0,0); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); break; case 2: - tilemap_draw(bitmap,cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect, state->m_bg1_tilemap, 0,0); - tilemap_draw(bitmap,cliprect, state->m_bg2_tilemap, 0,0); - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0,0); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0,0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); break; case 3: - tilemap_draw(bitmap,cliprect, state->m_bg1_tilemap, TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect, state->m_bg2_tilemap, 0,0); - tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0,0); - draw_sprites(screen->machine(), bitmap,cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bg2_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); break; default: diff -Nru mame-0.144/src/mame/video/vball.c mame-0.145/src/mame/video/vball.c --- mame-0.144/src/mame/video/vball.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vball.c 2012-02-06 21:30:32.000000000 +0000 @@ -43,7 +43,7 @@ vball_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,background_scan, 8, 8,64,64); - tilemap_set_scroll_rows(state->m_bg_tilemap,32); + state->m_bg_tilemap->set_scroll_rows(32); state->m_gfxset=0; state->m_vb_bgprombank=0xff; state->m_vb_spprombank=0xff; @@ -53,7 +53,7 @@ { vball_state *state = space->machine().driver_data(); state->m_vb_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } #ifdef UNUSED_FUNCTION @@ -68,7 +68,7 @@ { vball_state *state = space->machine().driver_data(); state->m_vb_attribram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } void vb_bgprombank_w( running_machine &machine, int bank ) @@ -107,14 +107,14 @@ void vb_mark_all_dirty( running_machine &machine ) { vball_state *state = machine.driver_data(); - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } #define DRAW_SPRITE( order, sx, sy ) drawgfx_transpen( bitmap, \ cliprect,gfx, \ (which+order),color,flipx,flipy,sx,sy,0); -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { vball_state *state = machine.driver_data(); const gfx_element *gfx = machine.gfx[1]; @@ -161,19 +161,19 @@ #undef DRAW_SPRITE -SCREEN_UPDATE( vb ) +SCREEN_UPDATE_IND16( vb ) { - vball_state *state = screen->machine().driver_data(); + vball_state *state = screen.machine().driver_data(); int i; - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_vb_scrolly_hi + *state->m_vb_scrolly_lo); + state->m_bg_tilemap->set_scrolly(0,state->m_vb_scrolly_hi + *state->m_vb_scrolly_lo); /*To get linescrolling to work properly, we must ignore the 1st two scroll values, no idea why! -SJE */ for (i = 2; i < 256; i++) { - tilemap_set_scrollx(state->m_bg_tilemap,i,state->m_vb_scrollx[i-2]); + state->m_bg_tilemap->set_scrollx(i,state->m_vb_scrollx[i-2]); //logerror("scrollx[%d] = %d\n",i,state->m_vb_scrollx[i]); } - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(),bitmap,cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/vdc.c mame-0.145/src/mame/video/vdc.c --- mame-0.144/src/mame/video/vdc.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vdc.c 2012-02-06 21:30:31.000000000 +0000 @@ -46,7 +46,7 @@ pair vce_address; /* Current address in the palette */ pair vce_data[512]; /* Palette data */ int current_bitmap_line; /* The current line in the display we are on */ - bitmap_t *bmp; + bitmap_ind16 *bmp; }VCE; typedef struct { @@ -79,7 +79,7 @@ static void vdc_do_dma(running_machine &machine, int which); static void vpc_init( running_machine &machine ); -INTERRUPT_GEN( pce_interrupt ) +TIMER_DEVICE_CALLBACK( pce_interrupt ) { /* Draw the last scanline */ if ( vce.current_bitmap_line >= 14 && vce.current_bitmap_line < 14 + 242 ) @@ -96,7 +96,7 @@ otherwise is 2 + sprite# */ UINT8 drawn[VDC_WPF]; /* our line buffer */ - UINT16 *line_buffer = BITMAP_ADDR16( vce.bmp, vce.current_bitmap_line, 86 ); + UINT16 *line_buffer = &vce.bmp->pix16(vce.current_bitmap_line, 86 ); /* clear our priority/sprite collision detection buffer. */ memset(drawn, 0, VDC_WPF); @@ -109,22 +109,22 @@ /* Draw VDC #0 sprite layer */ if(vdc[0].vdc_data[CR].w & CR_SB) { - pce_refresh_sprites(device->machine(), 0, vdc[0].current_segment_line, drawn, line_buffer); + pce_refresh_sprites(timer.machine(), 0, vdc[0].current_segment_line, drawn, line_buffer); } } } else { /* We are in one of the blanking areas */ - draw_black_line(device->machine(), vce.current_bitmap_line ); + draw_black_line(timer.machine(), vce.current_bitmap_line ); } /* bump current scanline */ vce.current_bitmap_line = ( vce.current_bitmap_line + 1 ) % VDC_LPF; - vdc_advance_line(device->machine(), 0 ); + vdc_advance_line(timer.machine(), 0 ); } -INTERRUPT_GEN( sgx_interrupt ) +TIMER_DEVICE_CALLBACK( sgx_interrupt ) { /* Draw the last scanline */ if ( vce.current_bitmap_line >= 14 && vce.current_bitmap_line < 14 + 242 ) @@ -156,7 +156,7 @@ /* Draw VDC #0 sprite layer */ if(vdc[0].vdc_data[CR].w & CR_SB) { - pce_refresh_sprites(device->machine(), 0, vdc[0].current_segment_line, drawn[0], temp_buffer[0]); + pce_refresh_sprites(timer.machine(), 0, vdc[0].current_segment_line, drawn[0], temp_buffer[0]); } /* Draw VDC #1 background layer */ @@ -165,10 +165,10 @@ /* Draw VDC #1 sprite layer */ if ( vdc[1].vdc_data[CR].w & CR_SB ) { - pce_refresh_sprites(device->machine(), 1, vdc[1].current_segment_line, drawn[1], temp_buffer[1]); + pce_refresh_sprites(timer.machine(), 1, vdc[1].current_segment_line, drawn[1], temp_buffer[1]); } - line_buffer = BITMAP_ADDR16( vce.bmp, vce.current_bitmap_line, 86 ); + line_buffer = &vce.bmp->pix16(vce.current_bitmap_line, 86 ); /* Combine the output of both VDCs */ for( i = 0; i < 512; i++ ) { @@ -269,13 +269,13 @@ else { /* We are in one of the blanking areas */ - draw_black_line(device->machine(), vce.current_bitmap_line ); + draw_black_line(timer.machine(), vce.current_bitmap_line ); } /* bump current scanline */ vce.current_bitmap_line = ( vce.current_bitmap_line + 1 ) % VDC_LPF; - vdc_advance_line(device->machine(), 0 ); - vdc_advance_line(device->machine(), 1 ); + vdc_advance_line(timer.machine(), 0 ); + vdc_advance_line(timer.machine(), 1 ); } static void vdc_advance_line(running_machine &machine, int which) @@ -423,7 +423,7 @@ memset(vdc[1].vram, 0, 0x10000); /* create display bitmap */ - vce.bmp = machine.primary_screen->alloc_compatible_bitmap(); + vce.bmp = auto_bitmap_ind16_alloc(machine, machine.primary_screen->width(), machine.primary_screen->height()); vdc[0].inc = 1; vdc[1].inc = 1; @@ -432,10 +432,10 @@ } -SCREEN_UPDATE( pce ) +SCREEN_UPDATE_IND16( pce ) { /* copy our rendering buffer to the display */ - copybitmap (bitmap,vce.bmp,0,0,0,0,cliprect); + copybitmap (bitmap,*vce.bmp,0,0,0,0,cliprect); return 0; } @@ -444,7 +444,7 @@ int i; /* our line buffer */ - UINT16 *line_buffer = BITMAP_ADDR16( vce.bmp, line, 0 ); + UINT16 *line_buffer = &vce.bmp->pix16(line); for( i=0; i< VDC_WPF; i++ ) line_buffer[i] = get_black_pen( machine ); @@ -458,7 +458,7 @@ int color_base = vce.vce_control & 0x80 ? 512 : 0; /* our line buffer */ - UINT16 *line_buffer = BITMAP_ADDR16( vce.bmp, line, 0 ); + UINT16 *line_buffer = &vce.bmp->pix16(line); for ( i = 0; i < VDC_WPF; i++ ) line_buffer[i] = color_base + vce.vce_data[0x100].w; @@ -472,7 +472,7 @@ int color_base = vce.vce_control & 0x80 ? 512 : 0; /* our line buffer */ - UINT16 *line_buffer = BITMAP_ADDR16( vce.bmp, line, 0 ); + UINT16 *line_buffer = &vce.bmp->pix16(line); for ( i = 0; i < VDC_WPF; i++ ) line_buffer[i] = color_base + vce.vce_data[0].w; diff -Nru mame-0.144/src/mame/video/vdc.h mame-0.145/src/mame/video/vdc.h --- mame-0.144/src/mame/video/vdc.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/vdc.h 2012-02-06 21:30:31.000000000 +0000 @@ -2,7 +2,7 @@ #include "video/generic.h" VIDEO_START( pce ); -SCREEN_UPDATE( pce ); +SCREEN_UPDATE_IND16( pce ); WRITE8_HANDLER ( vdc_0_w ); WRITE8_HANDLER ( vdc_1_w ); READ8_HANDLER ( vdc_0_r ); @@ -14,8 +14,8 @@ READ8_HANDLER( vpc_r ); WRITE8_HANDLER( sgx_vdc_w ); READ8_HANDLER( sgx_vdc_r ); -INTERRUPT_GEN( pce_interrupt ); -INTERRUPT_GEN( sgx_interrupt ); +TIMER_DEVICE_CALLBACK( pce_interrupt ); +TIMER_DEVICE_CALLBACK( sgx_interrupt ); /* Screen timing stuff */ diff -Nru mame-0.144/src/mame/video/vectrex.c mame-0.145/src/mame/video/vectrex.c --- mame-0.144/src/mame/video/vectrex.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vectrex.c 2012-02-06 21:30:32.000000000 +0000 @@ -153,21 +153,21 @@ { vectrex_state *state = machine.driver_data(); /* Refresh only marks the range of vectors which will be drawn - * during the next SCREEN_UPDATE. */ + * during the next SCREEN_UPDATE_RGB32. */ state->m_display_start = state->m_display_end; state->m_display_end = state->m_point_index; } -SCREEN_UPDATE(vectrex) +SCREEN_UPDATE_RGB32(vectrex) { - vectrex_state *state = screen->machine().driver_data(); + vectrex_state *state = screen.machine().driver_data(); int i; - vectrex_configuration(screen->machine()); + vectrex_configuration(screen.machine()); /* start black */ - vector_add_point(screen->machine(), + vector_add_point(screen.machine(), state->m_points[state->m_display_start].x, state->m_points[state->m_display_start].y, state->m_points[state->m_display_start].col, @@ -175,14 +175,14 @@ for (i = state->m_display_start; i != state->m_display_end; i = (i + 1) % NVECT) { - vector_add_point(screen->machine(), + vector_add_point(screen.machine(), state->m_points[i].x, state->m_points[i].y, state->m_points[i].col, state->m_points[i].intensity); } - SCREEN_UPDATE_CALL(vector); + SCREEN_UPDATE32_CALL(vector); vector_clear_list(); return 0; } @@ -284,8 +284,8 @@ screen_device *screen = machine.first_screen(); const rectangle &visarea = screen->visible_area(); - state->m_x_center=((visarea.max_x - visarea.min_x) / 2) << 16; - state->m_y_center=((visarea.max_y - visarea.min_y) / 2) << 16; + state->m_x_center=(visarea.width() / 2) << 16; + state->m_y_center=(visarea.height() / 2) << 16; state->m_x_max = visarea.max_x << 16; state->m_y_max = visarea.max_y << 16; @@ -484,8 +484,8 @@ screen_device *screen = machine.first_screen(); const rectangle &visarea = screen->visible_area(); - state->m_x_center=((visarea.max_x - visarea.min_x) / 2) << 16; - state->m_y_center=((visarea.max_y - visarea.min_y) / 2) << 16; + state->m_x_center=(visarea.width() / 2) << 16; + state->m_y_center=(visarea.height() / 2) << 16; state->m_x_max = visarea.max_x << 16; state->m_y_max = visarea.max_y << 16; diff -Nru mame-0.144/src/mame/video/vendetta.c mame-0.145/src/mame/video/vendetta.c --- mame-0.144/src/mame/video/vendetta.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vendetta.c 2012-02-06 21:30:31.000000000 +0000 @@ -52,9 +52,9 @@ ***************************************************************************/ -SCREEN_UPDATE( vendetta ) +SCREEN_UPDATE_IND16( vendetta ) { - vendetta_state *state = screen->machine().driver_data(); + vendetta_state *state = screen.machine().driver_data(); int layer[3]; state->m_sprite_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI1); @@ -73,7 +73,7 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[2], 0, 4); diff -Nru mame-0.144/src/mame/video/vertigo.c mame-0.145/src/mame/video/vertigo.c --- mame-0.144/src/mame/video/vertigo.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vertigo.c 2012-02-06 21:30:33.000000000 +0000 @@ -133,7 +133,6 @@ state_save_register_item(machine, "vector_proc", NULL, 0, state->m_bsp.f); state_save_register_item(machine, "vector_proc", NULL, 0, state->m_bsp.y); - state->m_vgen.set_machine(machine); state_save_register_item(machine, "vector_proc", NULL, 0, state->m_vgen.sreg); state_save_register_item(machine, "vector_proc", NULL, 0, state->m_vgen.l1); state_save_register_item(machine, "vector_proc", NULL, 0, state->m_vgen.l2); @@ -188,6 +187,7 @@ memset(&state->m_vs, 0, sizeof(state->m_vs)); memset(&state->m_bsp, 0, sizeof(state->m_bsp)); memset(&state->m_vgen, 0, sizeof(state->m_vgen)); + state->m_vgen.set_machine(machine); } diff -Nru mame-0.144/src/mame/video/vicdual.c mame-0.145/src/mame/video/vicdual.c --- mame-0.144/src/mame/video/vicdual.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/vicdual.c 2012-02-06 21:30:33.000000000 +0000 @@ -29,11 +29,11 @@ } -SCREEN_UPDATE( vicdual_bw ) +SCREEN_UPDATE_RGB32( vicdual_bw ) { - vicdual_state *state = screen->machine().driver_data(); + vicdual_state *state = screen.machine().driver_data(); UINT8 x = 0; - UINT8 y = cliprect->min_y; + UINT8 y = cliprect.min_y; UINT8 video_data = 0; while (1) @@ -56,7 +56,7 @@ /* plot the current pixel */ pen = (video_data & 0x80) ? RGB_WHITE : RGB_BLACK; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; /* next pixel */ video_data = video_data << 1; @@ -66,7 +66,7 @@ if (x == 0) { /* end of region to update? */ - if (y == cliprect->max_y) + if (y == cliprect.max_y) { break; } @@ -80,12 +80,12 @@ } -SCREEN_UPDATE( vicdual_color ) +SCREEN_UPDATE_RGB32( vicdual_color ) { - vicdual_state *state = screen->machine().driver_data(); - UINT8 *color_prom = (UINT8 *)screen->machine().region("proms")->base(); + vicdual_state *state = screen.machine().driver_data(); + UINT8 *color_prom = (UINT8 *)screen.machine().region("proms")->base(); UINT8 x = 0; - UINT8 y = cliprect->min_y; + UINT8 y = cliprect.min_y; UINT8 video_data = 0; pen_t back_pen = 0; pen_t fore_pen = 0; @@ -115,7 +115,7 @@ /* plot the current pixel */ pen = (video_data & 0x80) ? fore_pen : back_pen; - *BITMAP_ADDR32(bitmap, y, x) = pen; + bitmap.pix32(y, x) = pen; /* next pixel */ video_data = video_data << 1; @@ -125,7 +125,7 @@ if (x == 0) { /* end of region to update? */ - if (y == cliprect->max_y) + if (y == cliprect.max_y) { break; } @@ -139,12 +139,12 @@ } -SCREEN_UPDATE( vicdual_bw_or_color ) +SCREEN_UPDATE_RGB32( vicdual_bw_or_color ) { - if (vicdual_is_cabinet_color(screen->machine())) - SCREEN_UPDATE_CALL(vicdual_color); + if (vicdual_is_cabinet_color(screen.machine())) + SCREEN_UPDATE32_CALL(vicdual_color); else - SCREEN_UPDATE_CALL(vicdual_bw); + SCREEN_UPDATE32_CALL(vicdual_bw); return 0; } diff -Nru mame-0.144/src/mame/video/victory.c mame-0.145/src/mame/video/victory.c --- mame-0.144/src/mame/video/victory.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/victory.c 2012-02-06 21:30:31.000000000 +0000 @@ -1090,24 +1090,24 @@ * *************************************/ -SCREEN_UPDATE( victory ) +SCREEN_UPDATE_IND16( victory ) { - victory_state *state = screen->machine().driver_data(); + victory_state *state = screen.machine().driver_data(); int bgcollmask = (state->m_video_control & 4) ? 4 : 7; int count = 0; int x, y; /* copy the palette from palette RAM */ - set_palette(screen->machine()); + set_palette(screen.machine()); /* update the foreground & background */ - update_foreground(screen->machine()); - update_background(screen->machine()); + update_foreground(screen.machine()); + update_background(screen.machine()); /* blend the bitmaps and do collision detection */ for (y = 0; y < 256; y++) { - UINT16 *scanline = BITMAP_ADDR16(bitmap, y, 0); + UINT16 *scanline = &bitmap.pix16(y); UINT8 sy = state->m_scrolly + y; UINT8 *fg = &state->m_fgbitmap[y * 256]; UINT8 *bg = &state->m_bgbitmap[sy * 256]; @@ -1119,7 +1119,7 @@ int bpix = bg[(x + state->m_scrollx) & 255]; scanline[x] = bpix | (fpix << 3); if (fpix && (bpix & bgcollmask) && count++ < 128) - screen->machine().scheduler().timer_set(screen->time_until_pos(y, x), FUNC(bgcoll_irq_callback), x | (y << 8)); + screen.machine().scheduler().timer_set(screen.time_until_pos(y, x), FUNC(bgcoll_irq_callback), x | (y << 8)); } } diff -Nru mame-0.144/src/mame/video/videopin.c mame-0.145/src/mame/video/videopin.c --- mame-0.144/src/mame/video/videopin.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/videopin.c 2012-02-06 21:30:32.000000000 +0000 @@ -33,26 +33,24 @@ } -SCREEN_UPDATE( videopin ) +SCREEN_UPDATE_IND16( videopin ) { - videopin_state *state = screen->machine().driver_data(); + videopin_state *state = screen.machine().driver_data(); int col; int row; - tilemap_set_scrollx(state->m_bg_tilemap, 0, -8); /* account for delayed loading of shift reg C6 */ + state->m_bg_tilemap->set_scrollx(0, -8); /* account for delayed loading of shift reg C6 */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); for (row = 0; row < 32; row++) { for (col = 0; col < 48; col++) { - UINT32 offset = get_memory_offset(col, row, 48, 32); + UINT32 offset = state->m_bg_tilemap->memory_index(col, row); if (state->m_video_ram[offset] & 0x80) /* ball bit found */ { - rectangle rect; - int x = 8 * col; int y = 8 * row; @@ -61,19 +59,8 @@ x += 4; /* account for delayed loading of flip-flop C4 */ - rect.min_x = x; - rect.min_y = y; - rect.max_x = x + 15; - rect.max_y = y + 15; - - if (rect.min_x < cliprect->min_x) - rect.min_x = cliprect->min_x; - if (rect.min_y < cliprect->min_y) - rect.min_y = cliprect->min_y; - if (rect.max_x > cliprect->max_x) - rect.max_x = cliprect->max_x; - if (rect.max_y > cliprect->max_y) - rect.max_y = cliprect->max_y; + rectangle rect(x, x + 15, y, y + 15); + rect &= cliprect; x -= state->m_ball_x; y -= state->m_ball_y; @@ -84,7 +71,7 @@ { for (j = 0; j < 2; j++) { - drawgfx_transpen(bitmap, &rect, screen->machine().gfx[1], + drawgfx_transpen(bitmap, rect, screen.machine().gfx[1], 0, 0, 0, 0, x + 16 * i, @@ -112,5 +99,5 @@ { videopin_state *state = space->machine().driver_data(); state->m_video_ram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } diff -Nru mame-0.144/src/mame/video/vigilant.c mame-0.145/src/mame/video/vigilant.c --- mame-0.144/src/mame/video/vigilant.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/vigilant.c 2012-02-06 21:30:31.000000000 +0000 @@ -18,17 +18,13 @@ #include "includes/vigilant.h" -static const rectangle bottomvisiblearea = -{ - 16*8, 48*8-1, - 6*8, 32*8-1 -}; +static const rectangle bottomvisiblearea(16*8, 48*8-1, 6*8, 32*8-1); VIDEO_START( vigilant ) { vigilant_state *state = machine.driver_data(); - state->m_bg_bitmap = auto_bitmap_alloc(machine,512*4,256,machine.primary_screen->format()); + state->m_bg_bitmap = auto_bitmap_ind16_alloc(machine,512*4,256); } @@ -67,8 +63,8 @@ { for( col=0; col<512; col+=32 ) { - drawgfx_opaque(state->m_bg_bitmap, - 0,machine.gfx[2], + drawgfx_opaque(*state->m_bg_bitmap, + state->m_bg_bitmap->cliprect(),machine.gfx[2], charcode, row < 128 ? 0 : 1, 0,0, @@ -172,7 +168,7 @@ ??? **************************************************************************/ -static void draw_foreground(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority, int opaque ) +static void draw_foreground(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority, int opaque ) { vigilant_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; @@ -196,7 +192,7 @@ { sx = (sx + scroll) & 0x1ff; - drawgfx_transmask(bitmap,&bottomvisiblearea,machine.gfx[0], + drawgfx_transmask(bitmap,bottomvisiblearea,machine.gfx[0], tile_number, color, 0,0, @@ -221,7 +217,7 @@ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { vigilant_state *state = machine.driver_data(); int scrollx = 0x17a + 16*8 - (state->m_rear_horiz_scroll_low + state->m_rear_horiz_scroll_high); @@ -233,11 +229,11 @@ state->m_rear_refresh=0; } - copyscrollbitmap(bitmap,state->m_bg_bitmap,1,&scrollx,0,0,&bottomvisiblearea); + copyscrollbitmap(bitmap,*state->m_bg_bitmap,1,&scrollx,0,0,bottomvisiblearea); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { vigilant_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -274,9 +270,9 @@ } } -SCREEN_UPDATE( kikcubic ) +SCREEN_UPDATE_IND16( kikcubic ) { - vigilant_state *state = screen->machine().driver_data(); + vigilant_state *state = screen.machine().driver_data(); UINT8 *videoram = state->m_videoram; int offs; @@ -288,20 +284,20 @@ int color = (attributes & 0xF0) >> 4; int tile_number = videoram[offs] | ((attributes & 0x0F) << 8); - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], tile_number, color, 0,0, sx,sy); } - draw_sprites(screen->machine(),bitmap,cliprect); + draw_sprites(screen.machine(),bitmap,cliprect); return 0; } -SCREEN_UPDATE( vigilant ) +SCREEN_UPDATE_IND16( vigilant ) { - vigilant_state *state = screen->machine().driver_data(); + vigilant_state *state = screen.machine().driver_data(); int i; /* copy the background palette */ @@ -310,31 +306,31 @@ int r,g,b; - r = (screen->machine().generic.paletteram.u8[0x400 + 16 * state->m_rear_color + i] << 3) & 0xFF; - g = (screen->machine().generic.paletteram.u8[0x500 + 16 * state->m_rear_color + i] << 3) & 0xFF; - b = (screen->machine().generic.paletteram.u8[0x600 + 16 * state->m_rear_color + i] << 3) & 0xFF; + r = (screen.machine().generic.paletteram.u8[0x400 + 16 * state->m_rear_color + i] << 3) & 0xFF; + g = (screen.machine().generic.paletteram.u8[0x500 + 16 * state->m_rear_color + i] << 3) & 0xFF; + b = (screen.machine().generic.paletteram.u8[0x600 + 16 * state->m_rear_color + i] << 3) & 0xFF; - palette_set_color(screen->machine(),512 + i,MAKE_RGB(r,g,b)); + palette_set_color(screen.machine(),512 + i,MAKE_RGB(r,g,b)); - r = (screen->machine().generic.paletteram.u8[0x400 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; - g = (screen->machine().generic.paletteram.u8[0x500 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; - b = (screen->machine().generic.paletteram.u8[0x600 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; + r = (screen.machine().generic.paletteram.u8[0x400 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; + g = (screen.machine().generic.paletteram.u8[0x500 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; + b = (screen.machine().generic.paletteram.u8[0x600 + 16 * state->m_rear_color + 32 + i] << 3) & 0xFF; - palette_set_color(screen->machine(),512 + 16 + i,MAKE_RGB(r,g,b)); + palette_set_color(screen.machine(),512 + 16 + i,MAKE_RGB(r,g,b)); } if (state->m_rear_disable) /* opaque foreground */ { - draw_foreground(screen->machine(),bitmap,cliprect,0,1); - draw_sprites(screen->machine(),bitmap,&bottomvisiblearea); - draw_foreground(screen->machine(),bitmap,cliprect,1,0); + draw_foreground(screen.machine(),bitmap,cliprect,0,1); + draw_sprites(screen.machine(),bitmap,bottomvisiblearea); + draw_foreground(screen.machine(),bitmap,cliprect,1,0); } else { - draw_background(screen->machine(),bitmap,cliprect); - draw_foreground(screen->machine(),bitmap,cliprect,0,0); - draw_sprites(screen->machine(),bitmap,&bottomvisiblearea); - draw_foreground(screen->machine(),bitmap,cliprect,1,0); // priority tiles + draw_background(screen.machine(),bitmap,cliprect); + draw_foreground(screen.machine(),bitmap,cliprect,0,0); + draw_sprites(screen.machine(),bitmap,bottomvisiblearea); + draw_foreground(screen.machine(),bitmap,cliprect,1,0); // priority tiles } return 0; } diff -Nru mame-0.144/src/mame/video/vindictr.c mame-0.145/src/mame/video/vindictr.c --- mame-0.144/src/mame/video/vindictr.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/vindictr.c 2012-02-06 21:30:32.000000000 +0000 @@ -92,7 +92,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); /* save states */ state->save_item(NAME(state->m_playfield_tile_bank)); @@ -162,7 +162,7 @@ { screen.update_partial(scanline - 1); state->m_playfield_tile_bank = data & 7; - tilemap_mark_all_tiles_dirty(state->m_playfield_tilemap); + state->m_playfield_tilemap->mark_all_dirty(); } break; @@ -170,7 +170,7 @@ if (state->m_playfield_xscroll != (data & 0x1ff)) { screen.update_partial(scanline - 1); - tilemap_set_scrollx(state->m_playfield_tilemap, 0, data); + state->m_playfield_tilemap->set_scrollx(0, data); state->m_playfield_xscroll = data & 0x1ff; } break; @@ -201,7 +201,7 @@ if (state->m_playfield_yscroll != ((data - offset) & 0x1ff)) { screen.update_partial(scanline - 1); - tilemap_set_scrolly(state->m_playfield_tilemap, 0, data - offset); + state->m_playfield_tilemap->set_scrolly(0, data - offset); atarimo_set_yscroll(0, (data - offset) & 0x1ff); } break; @@ -218,23 +218,23 @@ * *************************************/ -SCREEN_UPDATE( vindictr ) +SCREEN_UPDATE_IND16( vindictr ) { - vindictr_state *state = screen->machine().driver_data(); + vindictr_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -267,15 +267,15 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); /* now go back and process the upper bit of MO priority */ rectlist.rect -= rectlist.numrects; for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { diff -Nru mame-0.144/src/mame/video/volfied.c mame-0.145/src/mame/video/volfied.c --- mame-0.144/src/mame/video/volfied.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/volfied.c 2012-02-06 21:30:32.000000000 +0000 @@ -73,7 +73,7 @@ SCREEN REFRESH *******************************************************/ -static void refresh_pixel_layer( running_machine &machine, bitmap_t *bitmap ) +static void refresh_pixel_layer( running_machine &machine, bitmap_ind16 &bitmap ) { int x, y; @@ -121,19 +121,19 @@ else color |= p[x] & 0xf; - *BITMAP_ADDR16(bitmap, y, x - 1) = color; + bitmap.pix16(y, x - 1) = color; } p += 512; } } -SCREEN_UPDATE( volfied ) +SCREEN_UPDATE_IND16( volfied ) { - volfied_state *state = screen->machine().driver_data(); + volfied_state *state = screen.machine().driver_data(); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); - refresh_pixel_layer(screen->machine(), bitmap); + screen.machine().priority_bitmap.fill(0, cliprect); + refresh_pixel_layer(screen.machine(), bitmap); pc090oj_draw_sprites(state->m_pc090oj, bitmap, cliprect, 0); return 0; } diff -Nru mame-0.144/src/mame/video/vsnes.c mame-0.145/src/mame/video/vsnes.c --- mame-0.144/src/mame/video/vsnes.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/vsnes.c 2012-02-06 21:30:33.000000000 +0000 @@ -5,13 +5,16 @@ PALETTE_INIT( vsnes ) { - ppu2c0x_init_palette_rgb(machine, 0 ); + ppu2c0x_device *ppu = machine.device("ppu1"); + ppu->init_palette_rgb(machine, 0 ); } PALETTE_INIT( vsdual ) { - ppu2c0x_init_palette_rgb(machine, 0 ); - ppu2c0x_init_palette_rgb(machine, 8*4*16 ); + ppu2c0x_device *ppu1 = machine.device("ppu1"); + ppu2c0x_device *ppu2 = machine.device("ppu2"); + ppu1->init_palette_rgb(machine, 0 ); + ppu2->init_palette_rgb(machine, 8*4*16 ); } static void ppu_irq_1( device_t *device, int *ppu_regs ) @@ -27,6 +30,8 @@ /* our ppu interface */ const ppu2c0x_interface vsnes_ppu_interface_1 = { + "maincpu", + "screen1", 0, /* gfxlayout num */ 0, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -36,6 +41,8 @@ /* our ppu interface for dual games */ const ppu2c0x_interface vsnes_ppu_interface_2 = { + "sub", + "screen2", 1, /* gfxlayout num */ 512, /* color base */ PPU_MIRROR_NONE, /* mirroring */ @@ -55,16 +62,18 @@ Display refresh ***************************************************************************/ -SCREEN_UPDATE( vsnes ) +SCREEN_UPDATE_IND16( vsnes ) { /* render the ppu */ - ppu2c0x_render( screen->machine().device("ppu1"), bitmap, 0, 0, 0, 0 ); + ppu2c0x_device *ppu = screen.machine().device("ppu1"); + ppu->render(bitmap, 0, 0, 0, 0); return 0; } -SCREEN_UPDATE( vsnes_bottom ) +SCREEN_UPDATE_IND16( vsnes_bottom ) { - ppu2c0x_render(screen->machine().device("ppu2"), bitmap, 0, 0, 0, 0); + ppu2c0x_device *ppu = screen.machine().device("ppu2"); + ppu->render(bitmap, 0, 0, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/vulgus.c mame-0.145/src/mame/video/vulgus.c --- mame-0.144/src/mame/video/vulgus.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/vulgus.c 2012-02-06 21:30:32.000000000 +0000 @@ -88,7 +88,7 @@ code + ((color & 0x80) << 1), color & 0x3f, 0); - tileinfo->group = color & 0x3f; + tileinfo.group = color & 0x3f; } static TILE_GET_INFO( get_bg_tile_info ) @@ -132,14 +132,14 @@ { vulgus_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x3ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( vulgus_bgvideoram_w ) { vulgus_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -160,7 +160,7 @@ if (state->m_palette_bank != (data & 3)) { state->m_palette_bank = data & 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } } @@ -171,7 +171,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { vulgus_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -217,14 +217,14 @@ } } -SCREEN_UPDATE( vulgus ) +SCREEN_UPDATE_IND16( vulgus ) { - vulgus_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scroll_low[1] + 256 * state->m_scroll_high[1]); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_scroll_low[0] + 256 * state->m_scroll_high[0]); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + vulgus_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0, state->m_scroll_low[1] + 256 * state->m_scroll_high[1]); + state->m_bg_tilemap->set_scrolly(0, state->m_scroll_low[0] + 256 * state->m_scroll_high[0]); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/warpwarp.c mame-0.145/src/mame/video/warpwarp.c --- mame-0.144/src/mame/video/warpwarp.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/warpwarp.c 2012-02-06 21:30:32.000000000 +0000 @@ -197,14 +197,14 @@ { warpwarp_state *state = space->machine().driver_data(); state->m_geebee_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( warpwarp_videoram_w ) { warpwarp_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } @@ -215,13 +215,13 @@ ***************************************************************************/ -INLINE void geebee_plot(bitmap_t *bitmap, const rectangle *cliprect, int x, int y, pen_t pen) +INLINE void geebee_plot(bitmap_ind16 &bitmap, const rectangle &cliprect, int x, int y, pen_t pen) { - if (x >= cliprect->min_x && x <= cliprect->max_x && y >= cliprect->min_y && y <= cliprect->max_y) - *BITMAP_ADDR16(bitmap, y, x) = pen; + if (cliprect.contains(x, y)) + bitmap.pix16(y, x) = pen; } -static void draw_ball(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect,pen_t pen) +static void draw_ball(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect,pen_t pen) { warpwarp_state *state = machine.driver_data(); if (state->m_ball_on) @@ -243,11 +243,11 @@ } } -SCREEN_UPDATE( geebee ) +SCREEN_UPDATE_IND16( geebee ) { - warpwarp_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + warpwarp_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); - draw_ball(screen->machine(), bitmap, cliprect, state->m_ball_pen); + draw_ball(screen.machine(), bitmap, cliprect, state->m_ball_pen); return 0; } diff -Nru mame-0.144/src/mame/video/warriorb.c mame-0.145/src/mame/video/warriorb.c --- mame-0.144/src/mame/video/warriorb.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/warriorb.c 2012-02-06 21:30:32.000000000 +0000 @@ -17,7 +17,7 @@ SPRITE DRAW ROUTINE ************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int x_offs, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int x_offs, int y_offs ) { warriorb_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -84,23 +84,9 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( warriorb ) +static UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs, device_t *tc0100scn) { - warriorb_state *state = screen->machine().driver_data(); - int xoffs = 0; UINT8 layer[3], nodraw; - device_t *tc0100scn = NULL; - - if (screen == state->m_lscreen) - { - xoffs = 40 * 8 * 0; - tc0100scn = state->m_tc0100scn_1; - } - else if (screen == state->m_rscreen) - { - xoffs = 40 * 8 * 1; - tc0100scn = state->m_tc0100scn_2; - } tc0100scn_tilemap_update(tc0100scn); @@ -109,7 +95,7 @@ layer[2] = 2; /* Clear priority bitmap */ - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* chip 0 does tilemaps on the left, chip 1 does the ones on the right */ // draw bottom layer @@ -117,15 +103,18 @@ /* Ensure screen blanked even when bottom layers not drawn due to disable bit */ if (nodraw) - bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine())); + bitmap.fill(get_black_pen(screen.machine()), cliprect); // draw middle layer tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[1], 0, 1); /* Sprites can be under/over the layer below text layer */ - draw_sprites(screen->machine(), bitmap, cliprect, xoffs, 8); // draw sprites + draw_sprites(screen.machine(), bitmap, cliprect, xoffs, 8); // draw sprites // draw top(text) layer tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[2], 0, 0); return 0; } + +SCREEN_UPDATE_IND16( warriorb_left ) { return update_screen(screen, bitmap, cliprect, 40 * 8 * 0, screen.machine().driver_data()->m_tc0100scn_1); } +SCREEN_UPDATE_IND16( warriorb_right ) { return update_screen(screen, bitmap, cliprect, 40 * 8 * 1, screen.machine().driver_data()->m_tc0100scn_2); } diff -Nru mame-0.144/src/mame/video/wc90b.c mame-0.145/src/mame/video/wc90b.c --- mame-0.144/src/mame/video/wc90b.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wc90b.c 2012-02-06 21:30:32.000000000 +0000 @@ -57,8 +57,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,15); - tilemap_set_transparent_pen(state->m_tx_tilemap,15); + state->m_fg_tilemap->set_transparent_pen(15); + state->m_tx_tilemap->set_transparent_pen(15); } @@ -73,21 +73,21 @@ { wc90b_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( wc90b_fgvideoram_w ) { wc90b_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x7ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( wc90b_txvideoram_w ) { wc90b_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x7ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } @@ -98,7 +98,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { wc90b_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -132,18 +132,18 @@ } } -SCREEN_UPDATE( wc90b ) +SCREEN_UPDATE_IND16( wc90b ) { - wc90b_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,8 * (state->m_scroll2x[0] & 0x7f) + 256 - 4 + (state->m_scroll_x_lo[0] & 0x07)); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll2y[0] + 1 + ((state->m_scroll2x[0] & 0x80) ? 256 : 0)); - tilemap_set_scrollx(state->m_fg_tilemap,0,8 * (state->m_scroll1x[0] & 0x7f) + 256 - 6 + ((state->m_scroll_x_lo[0] & 0x38) >> 3)); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll1y[0] + 1 + ((state->m_scroll1x[0] & 0x80) ? 256 : 0)); - - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 1 ); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 0 ); + wc90b_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,8 * (state->m_scroll2x[0] & 0x7f) + 256 - 4 + (state->m_scroll_x_lo[0] & 0x07)); + state->m_bg_tilemap->set_scrolly(0,state->m_scroll2y[0] + 1 + ((state->m_scroll2x[0] & 0x80) ? 256 : 0)); + state->m_fg_tilemap->set_scrollx(0,8 * (state->m_scroll1x[0] & 0x7f) + 256 - 6 + ((state->m_scroll_x_lo[0] & 0x38) >> 3)); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll1y[0] + 1 + ((state->m_scroll1x[0] & 0x80) ? 256 : 0)); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 1 ); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 0 ); return 0; } diff -Nru mame-0.144/src/mame/video/wc90.c mame-0.145/src/mame/video/wc90.c --- mame-0.144/src/mame/video/wc90.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/wc90.c 2012-02-06 21:30:32.000000000 +0000 @@ -84,8 +84,8 @@ state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); } VIDEO_START( wc90t ) @@ -95,8 +95,8 @@ state->m_fg_tilemap = tilemap_create(machine, track_get_fg_tile_info,tilemap_scan_rows,16,16,64,32); state->m_tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,64,32); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - tilemap_set_transparent_pen(state->m_tx_tilemap,0); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_tx_tilemap->set_transparent_pen(0); } @@ -110,21 +110,21 @@ { wc90_state *state = space->machine().driver_data(); state->m_bgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x7ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( wc90_fgvideoram_w ) { wc90_state *state = space->machine().driver_data(); state->m_fgvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset & 0x7ff); + state->m_fg_tilemap->mark_tile_dirty(offset & 0x7ff); } WRITE8_HANDLER( wc90_txvideoram_w ) { wc90_state *state = space->machine().driver_data(); state->m_txvideoram[offset] = data; - tilemap_mark_tile_dirty(state->m_tx_tilemap,offset & 0x7ff); + state->m_tx_tilemap->mark_tile_dirty(offset & 0x7ff); } @@ -167,12 +167,12 @@ { 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } }; -static void draw_sprite_16x16(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_16x16(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { WC90_DRAW_SPRITE( code, sx, sy ); } -static void draw_sprite_16x32(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_16x32(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { if ( bank & 2 ) { WC90_DRAW_SPRITE( code+1, sx, sy+16 ); @@ -183,7 +183,7 @@ } } -static void draw_sprite_16x64(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_16x64(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { if ( bank & 2 ) { WC90_DRAW_SPRITE( code+3, sx, sy+48 ); @@ -198,7 +198,7 @@ } } -static void draw_sprite_32x16(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_32x16(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { if ( bank & 1 ) { WC90_DRAW_SPRITE( code+1, sx+16, sy ); @@ -209,7 +209,7 @@ } } -static void draw_sprite_32x32(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_32x32(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { const char *p = p32x32[ bank&3 ]; @@ -220,7 +220,7 @@ WC90_DRAW_SPRITE( code+p[3], sx+16, sy+16 ); } -static void draw_sprite_32x64(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_32x64(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { const char *p = p32x64[ bank&3 ]; @@ -235,7 +235,7 @@ WC90_DRAW_SPRITE( code+p[7], sx+16, sy+48 ); } -static void draw_sprite_64x16(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_64x16(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { if ( bank & 1 ) { WC90_DRAW_SPRITE( code+3, sx+48, sy ); @@ -250,7 +250,7 @@ } } -static void draw_sprite_64x32(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_64x32(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { const char *p = p64x32[ bank&3 ]; @@ -265,7 +265,7 @@ WC90_DRAW_SPRITE( code+p[7], sx+48, sy+16 ); } -static void draw_sprite_64x64(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_64x64(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { const char *p = p64x64[ bank&3 ]; @@ -289,12 +289,12 @@ WC90_DRAW_SPRITE( code+p[15], sx+48, sy+48 ); } -static void draw_sprite_invalid(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int code, +static void draw_sprite_invalid(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int sx, int sy, int bank, int flags ) { logerror("8 pixel sprite size not supported\n" ); } -typedef void (*draw_sprites_func)(running_machine &, bitmap_t *, const rectangle *, int, int, int, int, int ); +typedef void (*draw_sprites_func)(running_machine &, bitmap_ind16 &, const rectangle &, int, int, int, int, int ); static const draw_sprites_func draw_sprites_proc[16] = { draw_sprite_invalid, /* 0000 = 08x08 */ @@ -315,7 +315,7 @@ draw_sprite_64x64 /* 1111 = 64x64 */ }; -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) { wc90_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -345,22 +345,22 @@ #undef WC90_DRAW_SPRITE -SCREEN_UPDATE( wc90 ) +SCREEN_UPDATE_IND16( wc90 ) { - wc90_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_bg_tilemap,0,state->m_scroll2xlo[0] + 256 * state->m_scroll2xhi[0]); - tilemap_set_scrolly(state->m_bg_tilemap,0,state->m_scroll2ylo[0] + 256 * state->m_scroll2yhi[0]); - tilemap_set_scrollx(state->m_fg_tilemap,0,state->m_scroll1xlo[0] + 256 * state->m_scroll1xhi[0]); - tilemap_set_scrolly(state->m_fg_tilemap,0,state->m_scroll1ylo[0] + 256 * state->m_scroll1yhi[0]); - tilemap_set_scrollx(state->m_tx_tilemap,0,state->m_scroll0xlo[0] + 256 * state->m_scroll0xhi[0]); - tilemap_set_scrolly(state->m_tx_tilemap,0,state->m_scroll0ylo[0] + 256 * state->m_scroll0yhi[0]); - -// draw_sprites(screen->machine(), bitmap,cliprect, 3 ); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 2 ); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 1 ); - tilemap_draw(bitmap,cliprect,state->m_tx_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect, 0 ); + wc90_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->set_scrollx(0,state->m_scroll2xlo[0] + 256 * state->m_scroll2xhi[0]); + state->m_bg_tilemap->set_scrolly(0,state->m_scroll2ylo[0] + 256 * state->m_scroll2yhi[0]); + state->m_fg_tilemap->set_scrollx(0,state->m_scroll1xlo[0] + 256 * state->m_scroll1xhi[0]); + state->m_fg_tilemap->set_scrolly(0,state->m_scroll1ylo[0] + 256 * state->m_scroll1yhi[0]); + state->m_tx_tilemap->set_scrollx(0,state->m_scroll0xlo[0] + 256 * state->m_scroll0xhi[0]); + state->m_tx_tilemap->set_scrolly(0,state->m_scroll0ylo[0] + 256 * state->m_scroll0yhi[0]); + +// draw_sprites(screen.machine(), bitmap,cliprect, 3 ); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 2 ); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 1 ); + state->m_tx_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect, 0 ); return 0; } diff -Nru mame-0.144/src/mame/video/wecleman.c mame-0.145/src/mame/video/wecleman.c --- mame-0.144/src/mame/video/wecleman.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wecleman.c 2012-02-06 21:30:31.000000000 +0000 @@ -169,7 +169,8 @@ } // draws a 8bpp palette sprites on a 16bpp direct RGB target (sub-par implementation) -static void do_blit_zoom32(wecleman_state *state, bitmap_t *bitmap, const rectangle *cliprect, struct sprite *sprite) +template +static void do_blit_zoom32(wecleman_state *state, _BitmapClass &bitmap, const rectangle &cliprect, struct sprite *sprite) { #define PRECISION_X 20 #define PRECISION_Y 20 @@ -185,11 +186,11 @@ x2 = sprite->x; x1 = x2 + sprite->total_width; dx = -1; - if (x2 < cliprect->min_x) x2 = cliprect->min_x; - if (x1 > cliprect->max_x ) + if (x2 < cliprect.min_x) x2 = cliprect.min_x; + if (x1 > cliprect.max_x ) { - xcount0 = x1 - cliprect->max_x; - x1 = cliprect->max_x; + xcount0 = x1 - cliprect.max_x; + x1 = cliprect.max_x; } if (x2 >= x1) return; x1--; x2--; @@ -199,12 +200,12 @@ x1 = sprite->x; x2 = x1 + sprite->total_width; dx = 1; - if (x1 < cliprect->min_x ) + if (x1 < cliprect.min_x ) { - xcount0 = cliprect->min_x - x1; - x1 = cliprect->min_x; + xcount0 = cliprect.min_x - x1; + x1 = cliprect.min_x; } - if (x2 > cliprect->max_x ) x2 = cliprect->max_x; + if (x2 > cliprect.max_x ) x2 = cliprect.max_x; if (x1 >= x2) return; } @@ -213,11 +214,11 @@ y2 = sprite->y; y1 = y2 + sprite->total_height; dy = -1; - if (y2 < cliprect->min_y ) y2 = cliprect->min_y; - if (y1 > cliprect->max_y ) + if (y2 < cliprect.min_y ) y2 = cliprect.min_y; + if (y1 > cliprect.max_y ) { - ycount0 = cliprect->max_y; - y1 = cliprect->max_y; + ycount0 = cliprect.max_y; + y1 = cliprect.max_y; } if (y2 >= y1) return; y1--; y2--; @@ -227,12 +228,12 @@ y1 = sprite->y; y2 = y1 + sprite->total_height; dy = 1; - if (y1 < cliprect->min_y ) + if (y1 < cliprect.min_y ) { - ycount0 = cliprect->min_y - y1; - y1 = cliprect->min_y; + ycount0 = cliprect.min_y - y1; + y1 = cliprect.min_y; } - if (y2 > cliprect->max_y) y2 = cliprect->max_y; + if (y2 > cliprect.max_y) y2 = cliprect.max_y; if (y1 >= y2) return; } @@ -246,7 +247,7 @@ // pre-loop assignments and adjustments pal_base = sprite->pal_data; - if (x1 > cliprect->min_x) + if (x1 > cliprect.min_x) { x1 -= dx; x2 -= dx; @@ -256,11 +257,10 @@ { UINT8 *row_base = sprite->pen_data + (src_f0y>>PRECISION_Y) * sprite->line_offset; src_fpx = src_f0x; + typename _BitmapClass::pixel_t *dst_ptr = &bitmap.pix(sy); - if (bitmap->format == BITMAP_FORMAT_RGB32) // Wec Le Mans + if (bitmap.format() == BITMAP_FORMAT_RGB32) // Wec Le Mans { - UINT32 *dst_ptr = BITMAP_ADDR32(bitmap, sy, 0); - if (!sprite->shadow_mode) { for (sx = x1; sx != x2; sx += dx) @@ -291,7 +291,6 @@ } else // Hot Chase { - UINT16 *dst_ptr = BITMAP_ADDR16(bitmap, sy, 0); pen_t base = sprite->pal_base; if (!sprite->shadow_mode) @@ -330,7 +329,8 @@ } } -static void sprite_draw(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +template +static void sprite_draw(running_machine &machine, _BitmapClass &bitmap, const rectangle &cliprect) { wecleman_state *state = machine.driver_data(); int i; @@ -441,7 +441,7 @@ state->m_bgpage[1] = (new_data >> 0x0) & 3; state->m_bgpage[2] = (new_data >> 0xc) & 3; state->m_bgpage[3] = (new_data >> 0x8) & 3; - tilemap_mark_all_tiles_dirty(state->m_bg_tilemap); + state->m_bg_tilemap->mark_all_dirty(); } /* pages selector for the foreground */ @@ -451,13 +451,13 @@ state->m_fgpage[1] = (new_data >> 0x0) & 3; state->m_fgpage[2] = (new_data >> 0xc) & 3; state->m_fgpage[3] = (new_data >> 0x8) & 3; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } /* Parallactic horizontal scroll registers follow */ } else - tilemap_mark_tile_dirty(state->m_txt_tilemap, offset); + state->m_txt_tilemap->mark_tile_dirty(offset); } } @@ -506,16 +506,16 @@ row = ( offset / PAGE_NX ) % PAGE_NY; /* background */ - if (state->m_bgpage[0] == page) tilemap_mark_tile_dirty(state->m_bg_tilemap, (col+PAGE_NX*0) + (row+PAGE_NY*0)*PAGE_NX*2 ); - if (state->m_bgpage[1] == page) tilemap_mark_tile_dirty(state->m_bg_tilemap, (col+PAGE_NX*1) + (row+PAGE_NY*0)*PAGE_NX*2 ); - if (state->m_bgpage[2] == page) tilemap_mark_tile_dirty(state->m_bg_tilemap, (col+PAGE_NX*0) + (row+PAGE_NY*1)*PAGE_NX*2 ); - if (state->m_bgpage[3] == page) tilemap_mark_tile_dirty(state->m_bg_tilemap, (col+PAGE_NX*1) + (row+PAGE_NY*1)*PAGE_NX*2 ); + if (state->m_bgpage[0] == page) state->m_bg_tilemap->mark_tile_dirty((col+PAGE_NX*0) + (row+PAGE_NY*0)*PAGE_NX*2 ); + if (state->m_bgpage[1] == page) state->m_bg_tilemap->mark_tile_dirty((col+PAGE_NX*1) + (row+PAGE_NY*0)*PAGE_NX*2 ); + if (state->m_bgpage[2] == page) state->m_bg_tilemap->mark_tile_dirty((col+PAGE_NX*0) + (row+PAGE_NY*1)*PAGE_NX*2 ); + if (state->m_bgpage[3] == page) state->m_bg_tilemap->mark_tile_dirty((col+PAGE_NX*1) + (row+PAGE_NY*1)*PAGE_NX*2 ); /* foreground */ - if (state->m_fgpage[0] == page) tilemap_mark_tile_dirty(state->m_fg_tilemap, (col+PAGE_NX*0) + (row+PAGE_NY*0)*PAGE_NX*2 ); - if (state->m_fgpage[1] == page) tilemap_mark_tile_dirty(state->m_fg_tilemap, (col+PAGE_NX*1) + (row+PAGE_NY*0)*PAGE_NX*2 ); - if (state->m_fgpage[2] == page) tilemap_mark_tile_dirty(state->m_fg_tilemap, (col+PAGE_NX*0) + (row+PAGE_NY*1)*PAGE_NX*2 ); - if (state->m_fgpage[3] == page) tilemap_mark_tile_dirty(state->m_fg_tilemap, (col+PAGE_NX*1) + (row+PAGE_NY*1)*PAGE_NX*2 ); + if (state->m_fgpage[0] == page) state->m_fg_tilemap->mark_tile_dirty((col+PAGE_NX*0) + (row+PAGE_NY*0)*PAGE_NX*2 ); + if (state->m_fgpage[1] == page) state->m_fg_tilemap->mark_tile_dirty((col+PAGE_NX*1) + (row+PAGE_NY*0)*PAGE_NX*2 ); + if (state->m_fgpage[2] == page) state->m_fg_tilemap->mark_tile_dirty((col+PAGE_NX*0) + (row+PAGE_NY*1)*PAGE_NX*2 ); + if (state->m_fgpage[3] == page) state->m_fg_tilemap->mark_tile_dirty((col+PAGE_NX*1) + (row+PAGE_NY*1)*PAGE_NX*2 ); } } @@ -539,7 +539,7 @@ ------------------------------------------------------------------------*/ -static void wecleman_draw_road(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void wecleman_draw_road(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int priority) { wecleman_state *state = machine.driver_data(); // must be powers of 2 @@ -576,9 +576,9 @@ if (priority == 0x02) { // draw sky; each scanline is assumed to be dword aligned - for (sy=cliprect->min_y-BMP_PAD; symin_y-BMP_PAD; sy> 8) * bitmap->rowpixels; - tdy = ((road * TOPCURB_DY) >> 8) * bitmap->rowpixels; + mdy = ((road * MIDCURB_DY) >> 8) * bitmap.rowpixels(); + tdy = ((road * TOPCURB_DY) >> 8) * bitmap.rowpixels(); scrollx = state->m_roadram[sy+YSIZE] + (0x18 - 0xe00); @@ -657,7 +657,7 @@ ------------------------------------------------------------------------*/ // blends two 8x8x16bpp direct RGB tilemaps -static void draw_cloud(bitmap_t *bitmap, +static void draw_cloud(bitmap_rgb32 &bitmap, const gfx_element *gfx, UINT16 *tm_base, int x0, int y0, // target coordinate @@ -693,7 +693,7 @@ tmskipy = scrolly / tileh; dy = -(scrolly & (tileh-1)); - dst_base = BITMAP_ADDR32(bitmap, y0+dy, x0+dx); + dst_base = &bitmap.pix32(y0+dy, x0+dx); pal_base = gfx->machine().pens + pal_offset * gfx->color_granularity; @@ -745,7 +745,7 @@ dst_ptr[tx] = MAKE_RGB(pal5bit(db), pal5bit(dg), pal5bit(dr)); } - dst_ptr += bitmap->rowpixels; + dst_ptr += bitmap.rowpixels(); } } @@ -756,12 +756,12 @@ { for (tx = 0; tx < tilew; tx++) dst_ptr[tx] = pal_ptr[*src_ptr++]; - dst_ptr += bitmap->rowpixels; + dst_ptr += bitmap.rowpixels(); } } } - dst_base += bitmap->rowpixels * tileh; + dst_base += bitmap.rowpixels() * tileh; } } @@ -792,7 +792,7 @@ ------------------------------------------------------------------------*/ -static void hotchase_draw_road(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void hotchase_draw_road(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { wecleman_state *state = machine.driver_data(); /* Referred to what's in the ROMs */ @@ -954,20 +954,20 @@ 8,8, PAGE_NX * 1, PAGE_NY * 1); - tilemap_set_scroll_rows(state->m_bg_tilemap, TILEMAP_DIMY); /* Screen-wise scrolling */ - tilemap_set_scroll_cols(state->m_bg_tilemap, 1); - tilemap_set_transparent_pen(state->m_bg_tilemap,0); - - tilemap_set_scroll_rows(state->m_fg_tilemap, TILEMAP_DIMY); /* Screen-wise scrolling */ - tilemap_set_scroll_cols(state->m_fg_tilemap, 1); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); - - tilemap_set_scroll_rows(state->m_txt_tilemap, 1); - tilemap_set_scroll_cols(state->m_txt_tilemap, 1); - tilemap_set_transparent_pen(state->m_txt_tilemap,0); + state->m_bg_tilemap->set_scroll_rows(TILEMAP_DIMY); /* Screen-wise scrolling */ + state->m_bg_tilemap->set_scroll_cols(1); + state->m_bg_tilemap->set_transparent_pen(0); + + state->m_fg_tilemap->set_scroll_rows(TILEMAP_DIMY); /* Screen-wise scrolling */ + state->m_fg_tilemap->set_scroll_cols(1); + state->m_fg_tilemap->set_transparent_pen(0); + + state->m_txt_tilemap->set_scroll_rows(1); + state->m_txt_tilemap->set_scroll_cols(1); + state->m_txt_tilemap->set_transparent_pen(0); - tilemap_set_scrollx(state->m_txt_tilemap, 0, 512-320-16 -BMP_PAD); - tilemap_set_scrolly(state->m_txt_tilemap, 0, -BMP_PAD ); + state->m_txt_tilemap->set_scrollx(0, 512-320-16 -BMP_PAD); + state->m_txt_tilemap->set_scrolly(0, -BMP_PAD ); // patches out a mysterious pixel floating in the sky (tile decoding bug?) *(machine.gfx[0]->gfxdata + (machine.gfx[0]->char_modulo*0xaca+7)) = 0; @@ -1022,20 +1022,20 @@ Video Updates ***************************************************************************/ -SCREEN_UPDATE( wecleman ) +SCREEN_UPDATE_RGB32( wecleman ) { - wecleman_state *state = screen->machine().driver_data(); + wecleman_state *state = screen.machine().driver_data(); const pen_t *mrct; int video_on; int fg_x, bg_x, fg_y, bg_y; int cloud_sx, cloud_sy; int i, j, k; - mrct = screen->machine().pens; + mrct = screen.machine().pens; video_on = state->m_irqctrl & 0x40; - set_led_status(screen->machine(), 0, state->m_selected_ip & 0x04); // Start lamp + set_led_status(screen.machine(), 0, state->m_selected_ip & 0x04); // Start lamp fg_y = (state->m_txtram[0x0f24>>1] & (TILEMAP_DIMY - 1)); bg_y = (state->m_txtram[0x0f26>>1] & (TILEMAP_DIMY - 1)); @@ -1043,8 +1043,8 @@ cloud_sx = state->m_txtram[0xfee>>1] + 0xb0; cloud_sy = bg_y; - tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_y -BMP_PAD); - tilemap_set_scrolly(state->m_fg_tilemap, 0, fg_y -BMP_PAD); + state->m_bg_tilemap->set_scrolly(0, bg_y -BMP_PAD); + state->m_fg_tilemap->set_scrolly(0, fg_y -BMP_PAD); for (i=0; i<(28<<2); i+=4) { @@ -1054,8 +1054,8 @@ k = i<<1; for (j=0; j<8; j++) { - tilemap_set_scrollx(state->m_fg_tilemap, (fg_y + k + j) & (TILEMAP_DIMY - 1), fg_x); - tilemap_set_scrollx(state->m_bg_tilemap, (bg_y + k + j) & (TILEMAP_DIMY - 1), bg_x); + state->m_fg_tilemap->set_scrollx((fg_y + k + j) & (TILEMAP_DIMY - 1), fg_x); + state->m_bg_tilemap->set_scrollx((bg_y + k + j) & (TILEMAP_DIMY - 1), bg_x); } } @@ -1063,15 +1063,15 @@ /* palette hacks! */ ((pen_t *)mrct)[0x27] = mrct[0x24]; - get_sprite_info(screen->machine()); + get_sprite_info(screen.machine()); - bitmap_fill(bitmap, cliprect, state->m_black_pen); + bitmap.fill(state->m_black_pen, cliprect); /* Draw the road (lines which have priority 0x02) */ - if (video_on) wecleman_draw_road(screen->machine(), bitmap, cliprect, 0x02); + if (video_on) wecleman_draw_road(screen.machine(), bitmap, cliprect, 0x02); /* Draw the background */ - if (video_on) tilemap_draw(bitmap,cliprect, state->m_bg_tilemap, 0, 0); + if (video_on) state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); // draws the cloud layer; needs work if (state->m_cloud_visible) @@ -1082,7 +1082,7 @@ if (video_on) draw_cloud( bitmap, - screen->machine().gfx[0], + screen.machine().gfx[0], state->m_pageram+0x1800, BMP_PAD, BMP_PAD, 41, 20, @@ -1099,16 +1099,16 @@ } /* Draw the foreground */ - if (video_on) tilemap_draw(bitmap,cliprect, state->m_fg_tilemap, 0, 0); + if (video_on) state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); /* Draw the road (lines which have priority 0x04) */ - if (video_on) wecleman_draw_road(screen->machine(), bitmap,cliprect, 0x04); + if (video_on) wecleman_draw_road(screen.machine(), bitmap,cliprect, 0x04); /* Draw the sprites */ - if (video_on) sprite_draw(screen->machine(), bitmap,cliprect); + if (video_on) sprite_draw(screen.machine(), bitmap,cliprect); /* Draw the text layer */ - if (video_on) tilemap_draw(bitmap,cliprect, state->m_txt_tilemap, 0, 0); + if (video_on) state->m_txt_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } @@ -1116,20 +1116,20 @@ Hot Chase ***************************************************************************/ -SCREEN_UPDATE( hotchase ) +SCREEN_UPDATE_IND16( hotchase ) { - wecleman_state *state = screen->machine().driver_data(); - device_t *k051316_1 = screen->machine().device("k051316_1"); - device_t *k051316_2 = screen->machine().device("k051316_2"); + wecleman_state *state = screen.machine().driver_data(); + device_t *k051316_1 = screen.machine().device("k051316_1"); + device_t *k051316_2 = screen.machine().device("k051316_2"); int video_on; video_on = state->m_irqctrl & 0x40; - set_led_status(screen->machine(), 0, state->m_selected_ip & 0x04); // Start lamp + set_led_status(screen.machine(), 0, state->m_selected_ip & 0x04); // Start lamp - get_sprite_info(screen->machine()); + get_sprite_info(screen.machine()); - bitmap_fill(bitmap, cliprect, state->m_black_pen); + bitmap.fill(state->m_black_pen, cliprect); /* Draw the background */ if (video_on) @@ -1137,11 +1137,11 @@ /* Draw the road */ if (video_on) - hotchase_draw_road(screen->machine(), bitmap, cliprect); + hotchase_draw_road(screen.machine(), bitmap, cliprect); /* Draw the sprites */ if (video_on) - sprite_draw(screen->machine(), bitmap,cliprect); + sprite_draw(screen.machine(), bitmap,cliprect); /* Draw the foreground (text) */ if (video_on) diff -Nru mame-0.144/src/mame/video/welltris.c mame-0.145/src/mame/video/welltris.c --- mame-0.144/src/mame/video/welltris.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/welltris.c 2012-02-06 21:30:32.000000000 +0000 @@ -29,7 +29,7 @@ /* Sprite Drawing is pretty much the same as fromance.c */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { static const UINT8 zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 }; welltris_state *state = machine.driver_data(); @@ -148,7 +148,7 @@ if (state->m_gfxbank[num] != bank) { state->m_gfxbank[num] = bank; - tilemap_mark_all_tiles_dirty(state->m_char_tilemap); + state->m_char_tilemap->mark_all_dirty(); } } @@ -164,7 +164,7 @@ if (state->m_charpalettebank != (data & 0x03)) { state->m_charpalettebank = (data & 0x03); - tilemap_mark_all_tiles_dirty(state->m_char_tilemap); + state->m_char_tilemap->mark_all_dirty(); } flip_screen_set(space->machine(), data & 0x80); @@ -213,7 +213,7 @@ welltris_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_charvideoram[offset]); - tilemap_mark_tile_dirty(state->m_char_tilemap, offset); + state->m_char_tilemap->mark_tile_dirty(offset); } VIDEO_START( welltris ) @@ -221,10 +221,10 @@ welltris_state *state = machine.driver_data(); state->m_char_tilemap = tilemap_create(machine, get_welltris_tile_info, tilemap_scan_rows, 8, 8, 64, 32); - tilemap_set_transparent_pen(state->m_char_tilemap, 15); + state->m_char_tilemap->set_transparent_pen(15); } -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { welltris_state *state = machine.driver_data(); int x, y; @@ -234,20 +234,20 @@ for (x = 0; x < 512 / 2; x++) { pixdata = state->m_pixelram[(x & 0xff) + (y & 0xff) * 256]; - *BITMAP_ADDR16(bitmap, y, (x * 2) + 0) = (pixdata >> 8) + (0x100 * state->m_pixelpalettebank) + 0x400; - *BITMAP_ADDR16(bitmap, y, (x * 2) + 1) = (pixdata & 0xff) + (0x100 * state->m_pixelpalettebank) + 0x400; + bitmap.pix16(y, (x * 2) + 0) = (pixdata >> 8) + (0x100 * state->m_pixelpalettebank) + 0x400; + bitmap.pix16(y, (x * 2) + 1) = (pixdata & 0xff) + (0x100 * state->m_pixelpalettebank) + 0x400; } } } -SCREEN_UPDATE( welltris ) +SCREEN_UPDATE_IND16( welltris ) { - welltris_state *state = screen->machine().driver_data(); - tilemap_set_scrollx(state->m_char_tilemap, 0, state->m_scrollx); - tilemap_set_scrolly(state->m_char_tilemap, 0, state->m_scrolly); + welltris_state *state = screen.machine().driver_data(); + state->m_char_tilemap->set_scrollx(0, state->m_scrollx); + state->m_char_tilemap->set_scrolly(0, state->m_scrolly); - draw_background(screen->machine(), bitmap, cliprect); - tilemap_draw(bitmap, cliprect, state->m_char_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + draw_background(screen.machine(), bitmap, cliprect); + state->m_char_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/wgp.c mame-0.145/src/mame/video/wgp.c --- mame-0.144/src/mame/video/wgp.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/wgp.c 2012-02-06 21:30:31.000000000 +0000 @@ -5,7 +5,7 @@ /*******************************************************************/ -INLINE void common_get_piv_tile_info( running_machine &machine, tile_data *tileinfo, int tile_index, int num ) +INLINE void common_get_piv_tile_info( running_machine &machine, tile_data &tileinfo, int tile_index, int num ) { wgp_state *state = machine.driver_data(); UINT16 tilenum = state->m_pivram[tile_index + num * 0x1000]; /* 3 blocks of $2000 */ @@ -45,17 +45,17 @@ state->m_piv_xoffs = piv_xoffs; state->m_piv_yoffs = piv_yoffs; - tilemap_set_transparent_pen(state->m_piv_tilemap[0], 0); - tilemap_set_transparent_pen(state->m_piv_tilemap[1], 0); - tilemap_set_transparent_pen(state->m_piv_tilemap[2], 0); + state->m_piv_tilemap[0]->set_transparent_pen(0); + state->m_piv_tilemap[1]->set_transparent_pen(0); + state->m_piv_tilemap[2]->set_transparent_pen(0); /* flipscreen n/a */ - tilemap_set_scrolldx(state->m_piv_tilemap[0], -piv_xoffs, 0); - tilemap_set_scrolldx(state->m_piv_tilemap[1], -piv_xoffs, 0); - tilemap_set_scrolldx(state->m_piv_tilemap[2], -piv_xoffs, 0); - tilemap_set_scrolldy(state->m_piv_tilemap[0], -piv_yoffs, 0); - tilemap_set_scrolldy(state->m_piv_tilemap[1], -piv_yoffs, 0); - tilemap_set_scrolldy(state->m_piv_tilemap[2], -piv_yoffs, 0); + state->m_piv_tilemap[0]->set_scrolldx(-piv_xoffs, 0); + state->m_piv_tilemap[1]->set_scrolldx(-piv_xoffs, 0); + state->m_piv_tilemap[2]->set_scrolldx(-piv_xoffs, 0); + state->m_piv_tilemap[0]->set_scrolldy(-piv_yoffs, 0); + state->m_piv_tilemap[1]->set_scrolldy(-piv_yoffs, 0); + state->m_piv_tilemap[2]->set_scrolldy(-piv_yoffs, 0); /* We don't need tilemap_set_scroll_rows, as the custom draw routine applies rowscroll manually */ tc0100scn_set_colbanks(state->m_tc0100scn, 0x80, 0xc0, 0x40); @@ -136,7 +136,7 @@ if (offset < 0x3000) { - tilemap_mark_tile_dirty(state->m_piv_tilemap[(offset / 0x1000)], (offset % 0x1000)); + state->m_piv_tilemap[(offset / 0x1000)]->mark_tile_dirty((offset % 0x1000)); } else if ((offset >= 0x3400) && (offset < 0x4000)) { @@ -144,7 +144,7 @@ } else if ((offset >= 0x8000) && (offset < 0xb000)) { - tilemap_mark_tile_dirty(state->m_piv_tilemap[((offset - 0x8000)/ 0x1000)], (offset % 0x1000)); + state->m_piv_tilemap[((offset - 0x8000)/ 0x1000)]->mark_tile_dirty((offset % 0x1000)); } } @@ -346,7 +346,7 @@ 2, 2, 3, 3, 2, 2, 3, 3 }; -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs ) { wgp_state *state = machine.driver_data(); UINT16 *spriteram = state->m_spriteram; @@ -486,11 +486,11 @@ CUSTOM DRAW *********************************************************/ -INLINE void bryan2_drawscanline( bitmap_t *bitmap, int x, int y, int length, - const UINT16 *src, int transparent, UINT32 orient, bitmap_t *priority, int pri ) +INLINE void bryan2_drawscanline( bitmap_ind16 &bitmap, int x, int y, int length, + const UINT16 *src, int transparent, UINT32 orient, bitmap_ind8 &priority, int pri ) { - UINT16 *dsti = BITMAP_ADDR16(bitmap, y, x); - UINT8 *dstp = BITMAP_ADDR8(priority, y, x); + UINT16 *dsti = &bitmap.pix16(y, x); + UINT8 *dstp = &priority.pix8(y, x); if (transparent) { @@ -518,11 +518,11 @@ -static void wgp_piv_layer_draw( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) +static void wgp_piv_layer_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int flags, UINT32 priority ) { wgp_state *state = machine.driver_data(); - bitmap_t *srcbitmap = tilemap_get_pixmap(state->m_piv_tilemap[layer]); - bitmap_t *flagsbitmap = tilemap_get_flagsmap(state->m_piv_tilemap[layer]); + bitmap_ind16 &srcbitmap = state->m_piv_tilemap[layer]->pixmap(); + bitmap_ind8 &flagsbitmap = state->m_piv_tilemap[layer]->flagsmap(); UINT16 *dst16,*src16; UINT8 *tsrc; @@ -538,9 +538,9 @@ int flipscreen = 0; /* n/a */ int machine_flip = 0; /* for ROT 180 ? */ - UINT16 screen_width = cliprect->max_x - cliprect->min_x + 1; - UINT16 min_y = cliprect->min_y; - UINT16 max_y = cliprect->max_y; + UINT16 screen_width = cliprect.width(); + UINT16 min_y = cliprect.min_y; + UINT16 max_y = cliprect.max_y; int width_mask = 0x3ff; @@ -604,8 +604,8 @@ x_step += (((0x7f - row_zoom) << 8) & 0xffff); } - src16 = BITMAP_ADDR16(srcbitmap, src_y_index, 0); - tsrc = BITMAP_ADDR8(flagsbitmap, src_y_index, 0); + src16 = &srcbitmap.pix16(src_y_index); + tsrc = &flagsbitmap.pix8(src_y_index); dst16 = scanline; if (flags & TILEMAP_DRAW_OPAQUE) @@ -643,32 +643,32 @@ SCREEN REFRESH **************************************************************/ -SCREEN_UPDATE( wgp ) +SCREEN_UPDATE_IND16( wgp ) { - wgp_state *state = screen->machine().driver_data(); + wgp_state *state = screen.machine().driver_data(); int i; UINT8 layer[3]; #ifdef MAME_DEBUG - if (screen->machine().input().code_pressed_once (KEYCODE_V)) + if (screen.machine().input().code_pressed_once (KEYCODE_V)) { state->m_dislayer[0] ^= 1; popmessage("piv0: %01x",state->m_dislayer[0]); } - if (screen->machine().input().code_pressed_once (KEYCODE_B)) + if (screen.machine().input().code_pressed_once (KEYCODE_B)) { state->m_dislayer[1] ^= 1; popmessage("piv1: %01x",state->m_dislayer[1]); } - if (screen->machine().input().code_pressed_once (KEYCODE_N)) + if (screen.machine().input().code_pressed_once (KEYCODE_N)) { state->m_dislayer[2] ^= 1; popmessage("piv2: %01x",state->m_dislayer[2]); } - if (screen->machine().input().code_pressed_once (KEYCODE_M)) + if (screen.machine().input().code_pressed_once (KEYCODE_M)) { state->m_dislayer[3] ^= 1; popmessage("TC0100SCN top bg layer: %01x",state->m_dislayer[3]); @@ -677,13 +677,13 @@ for (i = 0; i < 3; i++) { - tilemap_set_scrollx(state->m_piv_tilemap[i], 0, state->m_piv_scrollx[i]); - tilemap_set_scrolly(state->m_piv_tilemap[i], 0, state->m_piv_scrolly[i]); + state->m_piv_tilemap[i]->set_scrollx(0, state->m_piv_scrollx[i]); + state->m_piv_tilemap[i]->set_scrolly(0, state->m_piv_scrolly[i]); } tc0100scn_tilemap_update(state->m_tc0100scn); - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); layer[0] = 0; layer[1] = 1; @@ -700,19 +700,19 @@ #ifdef MAME_DEBUG if (state->m_dislayer[layer[0]] == 0) #endif - wgp_piv_layer_draw(screen->machine(), bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); + wgp_piv_layer_draw(screen.machine(), bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); #ifdef MAME_DEBUG if (state->m_dislayer[layer[1]] == 0) #endif - wgp_piv_layer_draw(screen->machine(), bitmap, cliprect, layer[1], 0, 2); + wgp_piv_layer_draw(screen.machine(), bitmap, cliprect, layer[1], 0, 2); #ifdef MAME_DEBUG if (state->m_dislayer[layer[2]] == 0) #endif - wgp_piv_layer_draw(screen->machine(), bitmap, cliprect, layer[2], 0, 4); + wgp_piv_layer_draw(screen.machine(), bitmap, cliprect, layer[2], 0, 4); - draw_sprites(screen->machine(), bitmap, cliprect, 16); + draw_sprites(screen.machine(), bitmap, cliprect, 16); /* ... then here we should apply rotation from wgp_sate_ctrl[] to the bitmap before we draw the TC0100SCN layers on it */ layer[0] = tc0100scn_bottomlayer(state->m_tc0100scn); diff -Nru mame-0.144/src/mame/video/williams.c mame-0.145/src/mame/video/williams.c --- mame-0.144/src/mame/video/williams.c 2012-01-13 15:35:03.000000000 +0000 +++ mame-0.145/src/mame/video/williams.c 2012-02-06 21:30:32.000000000 +0000 @@ -159,7 +159,7 @@ /* create the tilemap */ state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_cols, 24,16, 128,16); - tilemap_set_scrolldx(state->m_bg_tilemap, 2, 0); + state->m_bg_tilemap->set_scrolldx(2, 0); state_save_register(machine); } @@ -172,24 +172,24 @@ * *************************************/ -SCREEN_UPDATE( williams ) +SCREEN_UPDATE_RGB32( williams ) { - williams_state *state = screen->machine().driver_data(); + williams_state *state = screen.machine().driver_data(); rgb_t pens[16]; int x, y; /* precompute the palette */ for (x = 0; x < 16; x++) - pens[x] = state->m_palette_lookup[screen->machine().generic.paletteram.u8[x]]; + pens[x] = state->m_palette_lookup[screen.machine().generic.paletteram.u8[x]]; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *source = &state->m_videoram[y]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); /* loop over columns */ - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { int pix = source[(x/2) * 256]; dest[x+0] = pens[pix >> 4]; @@ -200,33 +200,33 @@ } -SCREEN_UPDATE( blaster ) +SCREEN_UPDATE_RGB32( blaster ) { - williams_state *state = screen->machine().driver_data(); + williams_state *state = screen.machine().driver_data(); rgb_t pens[16]; int x, y; /* precompute the palette */ for (x = 0; x < 16; x++) - pens[x] = state->m_palette_lookup[screen->machine().generic.paletteram.u8[x]]; + pens[x] = state->m_palette_lookup[screen.machine().generic.paletteram.u8[x]]; /* if we're blitting from the top, start with a 0 for color 0 */ - if (cliprect->min_y == screen->visible_area().min_y || !(state->m_blaster_video_control & 1)) + if (cliprect.min_y == screen.visible_area().min_y || !(state->m_blaster_video_control & 1)) state->m_blaster_color0 = state->m_palette_lookup[state->m_blaster_palette_0[0] ^ 0xff]; /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { int erase_behind = state->m_blaster_video_control & state->m_blaster_scanline_control[y] & 2; UINT8 *source = &state->m_videoram[y]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); /* latch a new color0 pen? */ if (state->m_blaster_video_control & state->m_blaster_scanline_control[y] & 1) state->m_blaster_color0 = state->m_palette_lookup[state->m_blaster_palette_0[y] ^ 0xff]; /* loop over columns */ - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { int pix = source[(x/2) * 256]; @@ -243,27 +243,27 @@ } -SCREEN_UPDATE( williams2 ) +SCREEN_UPDATE_RGB32( williams2 ) { - williams_state *state = screen->machine().driver_data(); + williams_state *state = screen.machine().driver_data(); rgb_t pens[16]; int x, y; /* draw the background */ - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); /* fetch the relevant pens */ for (x = 1; x < 16; x++) - pens[x] = palette_get_color(screen->machine(), state->m_williams2_fg_color * 16 + x); + pens[x] = palette_get_color(screen.machine(), state->m_williams2_fg_color * 16 + x); /* loop over rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { UINT8 *source = &state->m_videoram[y]; - UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dest = &bitmap.pix32(y); /* loop over columns */ - for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2) + for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2) { int pix = source[(x/2) * 256]; @@ -428,7 +428,7 @@ data &= 0x3f; break; } - tilemap_set_palette_offset(state->m_bg_tilemap, data * 16); + state->m_bg_tilemap->set_palette_offset(data * 16); } @@ -436,7 +436,7 @@ { williams_state *state = space->machine().driver_data(); state->m_williams2_tileram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } @@ -444,7 +444,7 @@ { williams_state *state = space->machine().driver_data(); state->m_tilemap_xscroll = (state->m_tilemap_xscroll & ~0x00f) | ((data & 0x80) >> 4) | (data & 0x07); - tilemap_set_scrollx(state->m_bg_tilemap, 0, (state->m_tilemap_xscroll & 7) + ((state->m_tilemap_xscroll >> 3) * 6)); + state->m_bg_tilemap->set_scrollx(0, (state->m_tilemap_xscroll & 7) + ((state->m_tilemap_xscroll >> 3) * 6)); } @@ -452,7 +452,7 @@ { williams_state *state = space->machine().driver_data(); state->m_tilemap_xscroll = (state->m_tilemap_xscroll & 0x00f) | (data << 4); - tilemap_set_scrollx(state->m_bg_tilemap, 0, (state->m_tilemap_xscroll & 7) + ((state->m_tilemap_xscroll >> 3) * 6)); + state->m_bg_tilemap->set_scrollx(0, (state->m_tilemap_xscroll & 7) + ((state->m_tilemap_xscroll >> 3) * 6)); } diff -Nru mame-0.144/src/mame/video/wiping.c mame-0.145/src/mame/video/wiping.c --- mame-0.144/src/mame/video/wiping.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wiping.c 2012-02-06 21:30:32.000000000 +0000 @@ -86,9 +86,9 @@ } -SCREEN_UPDATE( wiping ) +SCREEN_UPDATE_IND16( wiping ) { - wiping_state *state = screen->machine().driver_data(); + wiping_state *state = screen.machine().driver_data(); UINT8 *spriteram = state->m_spriteram; int offs; @@ -121,7 +121,7 @@ sy = 27 - sy; } - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs], state->m_colorram[offs] & 0x3f, state->m_flipscreen,state->m_flipscreen, @@ -149,12 +149,12 @@ flipy = !flipy; } - drawgfx_transmask(bitmap,cliprect,screen->machine().gfx[1], + drawgfx_transmask(bitmap,cliprect,screen.machine().gfx[1], (spriteram[offs] & 0x3f) + 64 * otherbank, color, flipx,flipy, sx,sy, - colortable_get_transpen_mask(screen->machine().colortable, screen->machine().gfx[1], color, 0x1f)); + colortable_get_transpen_mask(screen.machine().colortable, screen.machine().gfx[1], color, 0x1f)); } /* redraw high priority chars */ @@ -189,7 +189,7 @@ sy = 27 - sy; } - drawgfx_opaque(bitmap,cliprect,screen->machine().gfx[0], + drawgfx_opaque(bitmap,cliprect,screen.machine().gfx[0], state->m_videoram[offs], state->m_colorram[offs] & 0x3f, state->m_flipscreen,state->m_flipscreen, diff -Nru mame-0.144/src/mame/video/wiz.c mame-0.145/src/mame/video/wiz.c --- mame-0.144/src/mame/video/wiz.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wiz.c 2012-02-06 21:30:31.000000000 +0000 @@ -10,19 +10,6 @@ #include "includes/wiz.h" -static const rectangle spritevisiblearea = -{ - 2*8, 32*8-1, - 2*8, 30*8-1 -}; - -static const rectangle spritevisibleareaflipx = -{ - 0*8, 30*8-1, - 2*8, 30*8-1 -}; - - VIDEO_START( wiz ) { wiz_state *state = machine.driver_data(); @@ -110,7 +97,7 @@ state->m_flipy = data; } -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int bank, int colortype) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank, int colortype) { wiz_state *state = machine.driver_data(); UINT8 *videoram = state->m_videoram; @@ -151,7 +138,7 @@ } } -static void draw_foreground(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int colortype) +static void draw_foreground(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int colortype) { wiz_state *state = machine.driver_data(); int offs; @@ -190,8 +177,8 @@ } } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, - const rectangle *cliprect, UINT8* sprite_ram, +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, + const rectangle &cliprect, UINT8* sprite_ram, int bank) { wiz_state *state = machine.driver_data(); @@ -219,44 +206,45 @@ } -SCREEN_UPDATE( kungfut ) +SCREEN_UPDATE_IND16( kungfut ) { - wiz_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,state->m_bgpen); - draw_background(screen->machine(), bitmap, cliprect, 2 + state->m_char_bank[0] , 0); - draw_foreground(screen->machine(), bitmap, cliprect, 0); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2, 4); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram , 5); + wiz_state *state = screen.machine().driver_data(); + bitmap.fill(state->m_bgpen, cliprect); + draw_background(screen.machine(), bitmap, cliprect, 2 + state->m_char_bank[0] , 0); + draw_foreground(screen.machine(), bitmap, cliprect, 0); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram2, 4); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram , 5); return 0; } -SCREEN_UPDATE( wiz ) +SCREEN_UPDATE_IND16( wiz ) { - wiz_state *state = screen->machine().driver_data(); + wiz_state *state = screen.machine().driver_data(); int bank; - const rectangle* visible_area; - - bitmap_fill(bitmap,cliprect,state->m_bgpen); - draw_background(screen->machine(), bitmap, cliprect, 2 + ((state->m_char_bank[0] << 1) | state->m_char_bank[1]), 0); - draw_foreground(screen->machine(), bitmap, cliprect, 0); - visible_area = state->m_flipx ? &spritevisibleareaflipx : &spritevisiblearea; + bitmap.fill(state->m_bgpen, cliprect); + draw_background(screen.machine(), bitmap, cliprect, 2 + ((state->m_char_bank[0] << 1) | state->m_char_bank[1]), 0); + draw_foreground(screen.machine(), bitmap, cliprect, 0); + + const rectangle spritevisiblearea(2*8, 32*8-1, 2*8, 30*8-1); + const rectangle spritevisibleareaflipx(0*8, 30*8-1, 2*8, 30*8-1); + const rectangle &visible_area = state->m_flipx ? spritevisibleareaflipx : spritevisiblearea; bank = 7 + *state->m_sprite_bank; - draw_sprites(screen->machine(), bitmap, visible_area, state->m_spriteram2, 6); - draw_sprites(screen->machine(), bitmap, visible_area, state->m_spriteram , bank); + draw_sprites(screen.machine(), bitmap, visible_area, state->m_spriteram2, 6); + draw_sprites(screen.machine(), bitmap, visible_area, state->m_spriteram , bank); return 0; } -SCREEN_UPDATE( stinger ) +SCREEN_UPDATE_IND16( stinger ) { - wiz_state *state = screen->machine().driver_data(); - bitmap_fill(bitmap,cliprect,state->m_bgpen); - draw_background(screen->machine(), bitmap, cliprect, 2 + state->m_char_bank[0], 1); - draw_foreground(screen->machine(), bitmap, cliprect, 1); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram2, 4); - draw_sprites(screen->machine(), bitmap, cliprect, state->m_spriteram , 5); + wiz_state *state = screen.machine().driver_data(); + bitmap.fill(state->m_bgpen, cliprect); + draw_background(screen.machine(), bitmap, cliprect, 2 + state->m_char_bank[0], 1); + draw_foreground(screen.machine(), bitmap, cliprect, 1); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram2, 4); + draw_sprites(screen.machine(), bitmap, cliprect, state->m_spriteram , 5); return 0; } diff -Nru mame-0.144/src/mame/video/wolfpack.c mame-0.145/src/mame/video/wolfpack.c --- mame-0.144/src/mame/video/wolfpack.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wolfpack.c 2012-02-06 21:30:31.000000000 +0000 @@ -116,7 +116,7 @@ state->m_LFSR = auto_alloc_array(machine, UINT8, 0x8000); - state->m_helper = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_helper); for (i = 0; i < 0x8000; i++) { @@ -131,7 +131,7 @@ } -static void draw_ship(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_ship(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { wolfpack_state *state = machine.driver_data(); static const UINT32 scaler[] = @@ -167,7 +167,7 @@ } -static void draw_torpedo(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_torpedo(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { wolfpack_state *state = machine.driver_data(); int count = 0; @@ -196,15 +196,15 @@ for (x = 2 * x1; x < 2 * x2; x++) if (state->m_LFSR[(state->m_current_index + 0x300 * y + x) % 0x8000]) - *BITMAP_ADDR16(bitmap, y, x) = 1; + bitmap.pix16(y, x) = 1; } } -static void draw_pt(running_machine &machine, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_pt(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { wolfpack_state *state = machine.driver_data(); - rectangle rect = *cliprect; + rectangle rect = cliprect; if (!(state->m_pt_pic & 0x20)) rect.min_x = 256; @@ -212,7 +212,7 @@ if (!(state->m_pt_pic & 0x10)) rect.max_x = 255; - drawgfx_transpen(bitmap, &rect, + drawgfx_transpen(bitmap, rect, machine.gfx[2], state->m_pt_pic, 0, @@ -220,7 +220,7 @@ 2 * state->m_pt_horz, state->m_pt_pos_select ? 0x70 : 0xA0, 0); - drawgfx_transpen(bitmap, &rect, + drawgfx_transpen(bitmap, rect, machine.gfx[2], state->m_pt_pic, 0, @@ -230,9 +230,9 @@ } -static void draw_water(colortable_t *colortable, bitmap_t* bitmap, const rectangle* cliprect) +static void draw_water(colortable_t *colortable, bitmap_ind16 &bitmap, const rectangle &cliprect) { - rectangle rect = *cliprect; + rectangle rect = cliprect; int x; int y; @@ -242,7 +242,7 @@ for (y = rect.min_y; y <= rect.max_y; y++) { - UINT16* p = BITMAP_ADDR16(bitmap, y, 0); + UINT16* p = &bitmap.pix16(y); for (x = rect.min_x; x <= rect.max_x; x++) p[x] = colortable_entry_get_value(colortable, p[x]) | 0x08; @@ -250,9 +250,9 @@ } -SCREEN_UPDATE( wolfpack ) +SCREEN_UPDATE_IND16( wolfpack ) { - wolfpack_state *state = screen->machine().driver_data(); + wolfpack_state *state = screen.machine().driver_data(); int i; int j; @@ -262,12 +262,12 @@ if (state->m_ship_size & 0x40) color += 0x3a; if (state->m_ship_size & 0x80) color += 0x48; - colortable_palette_set_color(screen->machine().colortable, 3, MAKE_RGB(color,color,color)); - colortable_palette_set_color(screen->machine().colortable, 7, MAKE_RGB(color < 0xb8 ? color + 0x48 : 0xff, + colortable_palette_set_color(screen.machine().colortable, 3, MAKE_RGB(color,color,color)); + colortable_palette_set_color(screen.machine().colortable, 7, MAKE_RGB(color < 0xb8 ? color + 0x48 : 0xff, color < 0xb8 ? color + 0x48 : 0xff, color < 0xb8 ? color + 0x48 : 0xff)); - bitmap_fill(bitmap, cliprect, state->m_video_invert); + bitmap.fill(state->m_video_invert, cliprect); for (i = 0; i < 8; i++) for (j = 0; j < 32; j++) @@ -275,7 +275,7 @@ int code = state->m_alpha_num_ram[32 * i + j]; drawgfx_opaque(bitmap, cliprect, - screen->machine().gfx[0], + screen.machine().gfx[0], code, state->m_video_invert, 0, 0, @@ -283,47 +283,45 @@ 192 + 8 * i); } - draw_pt(screen->machine(), bitmap, cliprect); - draw_ship(screen->machine(), bitmap, cliprect); - draw_torpedo(screen->machine(), bitmap, cliprect); - draw_water(screen->machine().colortable, bitmap, cliprect); + draw_pt(screen.machine(), bitmap, cliprect); + draw_ship(screen.machine(), bitmap, cliprect); + draw_torpedo(screen.machine(), bitmap, cliprect); + draw_water(screen.machine().colortable, bitmap, cliprect); return 0; } -SCREEN_EOF( wolfpack ) +SCREEN_VBLANK( wolfpack ) { - wolfpack_state *state = machine.driver_data(); - rectangle rect; - - int x; - int y; - - rect.min_x = 0; - rect.min_y = 0; - rect.max_x = state->m_helper->width - 1; - rect.max_y = state->m_helper->height - 1; + // rising edge + if (vblank_on) + { + wolfpack_state *state = screen.machine().driver_data(); - bitmap_fill(state->m_helper, &rect, 0); + int x; + int y; - draw_ship(machine, state->m_helper, &rect); + state->m_helper.fill(0); - for (y = 128; y < 224 - state->m_torpedo_v; y++) - { - int x1 = 248 - state->m_torpedo_h - 1; - int x2 = 248 - state->m_torpedo_h + 1; + draw_ship(screen.machine(), state->m_helper, state->m_helper.cliprect()); - for (x = 2 * x1; x < 2 * x2; x++) + for (y = 128; y < 224 - state->m_torpedo_v; y++) { - if (x < 0 || x >= state->m_helper->width) - continue; - if (y < 0 || y >= state->m_helper->height) - continue; + int x1 = 248 - state->m_torpedo_h - 1; + int x2 = 248 - state->m_torpedo_h + 1; - if (*BITMAP_ADDR16(state->m_helper, y, x)) - state->m_collision = 1; + for (x = 2 * x1; x < 2 * x2; x++) + { + if (x < 0 || x >= state->m_helper.width()) + continue; + if (y < 0 || y >= state->m_helper.height()) + continue; + + if (state->m_helper.pix16(y, x)) + state->m_collision = 1; + } } - } - state->m_current_index += 0x300 * 262; + state->m_current_index += 0x300 * 262; + } } diff -Nru mame-0.144/src/mame/video/wrally.c mame-0.145/src/mame/video/wrally.c --- mame-0.144/src/mame/video/wrally.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wrally.c 2012-02-06 21:30:32.000000000 +0000 @@ -41,7 +41,7 @@ int data2 = state->m_videoram[(tile_index << 1) + 1]; int code = data & 0x3fff; - tileinfo->category = (data2 >> 5) & 0x01; + tileinfo.category = (data2 >> 5) & 0x01; SET_TILE_INFO(0, code, data2 & 0x1f, TILE_FLIPYX((data2 >> 6) & 0x03)); } @@ -53,7 +53,7 @@ int data2 = state->m_videoram[(0x2000/2) + (tile_index << 1) + 1]; int code = data & 0x3fff; - tileinfo->category = (data2 >> 5) & 0x01; + tileinfo.category = (data2 >> 5) & 0x01; SET_TILE_INFO(0, code, data2 & 0x1f, TILE_FLIPYX((data2 >> 6) & 0x03)); } @@ -70,8 +70,8 @@ state->m_pant[0] = tilemap_create(machine, get_tile_info_wrally_screen0,tilemap_scan_rows,16,16,64,32); state->m_pant[1] = tilemap_create(machine, get_tile_info_wrally_screen1,tilemap_scan_rows,16,16,64,32); - tilemap_set_transmask(state->m_pant[0],0,0xff01,0x00ff); /* this layer is split in two (pens 1..7, pens 8-15) */ - tilemap_set_transparent_pen(state->m_pant[1],0); + state->m_pant[0]->set_transmask(0,0xff01,0x00ff); /* this layer is split in two (pens 1..7, pens 8-15) */ + state->m_pant[1]->set_transparent_pen(0); } @@ -104,7 +104,7 @@ in the range 0x8-0xf are used. */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int priority) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) { wrally_state *state = machine.driver_data(); int i, px, py; @@ -140,11 +140,11 @@ for (py = 0; py < gfx->height; py++){ /* get a pointer to the current line in the screen bitmap */ int ypos = ((sy + py) & 0x1ff); - UINT16 *srcy = BITMAP_ADDR16(bitmap, ypos, 0); + UINT16 *srcy = &bitmap.pix16(ypos); int gfx_py = yflip ? (gfx->height - 1 - py) : py; - if ((ypos < cliprect->min_y) || (ypos > cliprect->max_y)) continue; + if ((ypos < cliprect.min_y) || (ypos > cliprect.max_y)) continue; for (px = 0; px < gfx->width; px++){ /* get current pixel */ @@ -160,7 +160,7 @@ /* pens 8..15 are used to select a palette */ if ((gfx_pen < 8) || (gfx_pen >= 16)) continue; - if ((xpos < cliprect->min_x) || (xpos > cliprect->max_x)) continue; + if ((xpos < cliprect.min_x) || (xpos > cliprect.max_x)) continue; /* modify the color of the tile */ *pixel = src_color + (gfx_pen-8)*1024; @@ -176,35 +176,35 @@ ***************************************************************************/ -SCREEN_UPDATE( wrally ) +SCREEN_UPDATE_IND16( wrally ) { - wrally_state *state = screen->machine().driver_data(); + wrally_state *state = screen.machine().driver_data(); /* set scroll registers */ - if (!flip_screen_get(screen->machine())) { - tilemap_set_scrolly(state->m_pant[0], 0, state->m_vregs[0]); - tilemap_set_scrollx(state->m_pant[0], 0, state->m_vregs[1]+4); - tilemap_set_scrolly(state->m_pant[1], 0, state->m_vregs[2]); - tilemap_set_scrollx(state->m_pant[1], 0, state->m_vregs[3]); + if (!flip_screen_get(screen.machine())) { + state->m_pant[0]->set_scrolly(0, state->m_vregs[0]); + state->m_pant[0]->set_scrollx(0, state->m_vregs[1]+4); + state->m_pant[1]->set_scrolly(0, state->m_vregs[2]); + state->m_pant[1]->set_scrollx(0, state->m_vregs[3]); } else { - tilemap_set_scrolly(state->m_pant[0], 0, 248 - state->m_vregs[0]); - tilemap_set_scrollx(state->m_pant[0], 0, 1024 - state->m_vregs[1] - 4); - tilemap_set_scrolly(state->m_pant[1], 0, 248 - state->m_vregs[2]); - tilemap_set_scrollx(state->m_pant[1], 0, 1024 - state->m_vregs[3]); + state->m_pant[0]->set_scrolly(0, 248 - state->m_vregs[0]); + state->m_pant[0]->set_scrollx(0, 1024 - state->m_vregs[1] - 4); + state->m_pant[1]->set_scrolly(0, 248 - state->m_vregs[2]); + state->m_pant[1]->set_scrollx(0, 1024 - state->m_vregs[3]); } /* draw tilemaps + sprites */ - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_CATEGORY(0) | TILEMAP_DRAW_LAYER0,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_CATEGORY(0) | TILEMAP_DRAW_LAYER1,0); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0) | TILEMAP_DRAW_LAYER0,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(0) | TILEMAP_DRAW_LAYER1,0); - tilemap_draw(bitmap,cliprect,state->m_pant[1],TILEMAP_DRAW_CATEGORY(1),0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_CATEGORY(1) | TILEMAP_DRAW_LAYER0,0); + state->m_pant[1]->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1),0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1) | TILEMAP_DRAW_LAYER0,0); - draw_sprites(screen->machine(),bitmap,cliprect,0); + draw_sprites(screen.machine(),bitmap,cliprect,0); - tilemap_draw(bitmap,cliprect,state->m_pant[0],TILEMAP_DRAW_CATEGORY(1) | TILEMAP_DRAW_LAYER1,0); + state->m_pant[0]->draw(bitmap, cliprect, TILEMAP_DRAW_CATEGORY(1) | TILEMAP_DRAW_LAYER1,0); - draw_sprites(screen->machine(),bitmap,cliprect,1); + draw_sprites(screen.machine(),bitmap,cliprect,1); return 0; } diff -Nru mame-0.144/src/mame/video/wwfsstar.c mame-0.145/src/mame/video/wwfsstar.c --- mame-0.144/src/mame/video/wwfsstar.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wwfsstar.c 2012-02-06 21:30:31.000000000 +0000 @@ -20,7 +20,7 @@ wwfsstar_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_fg0_videoram[offset]); - tilemap_mark_tile_dirty(state->m_fg0_tilemap,offset/2); + state->m_fg0_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( wwfsstar_bg0_videoram_w ) @@ -28,7 +28,7 @@ wwfsstar_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg0_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg0_tilemap,offset/2); + state->m_bg0_tilemap->mark_tile_dirty(offset/2); } /******************************************************************************* @@ -111,7 +111,7 @@ sprite colour marking could probably be improved.. *******************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { /*- SPR RAM Format -** @@ -214,22 +214,22 @@ wwfsstar_state *state = machine.driver_data(); state->m_fg0_tilemap = tilemap_create(machine, get_fg0_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_fg0_tilemap,0); + state->m_fg0_tilemap->set_transparent_pen(0); state->m_bg0_tilemap = tilemap_create(machine, get_bg0_tile_info,bg0_scan, 16, 16,32,32); - tilemap_set_transparent_pen(state->m_fg0_tilemap,0); + state->m_fg0_tilemap->set_transparent_pen(0); } -SCREEN_UPDATE( wwfsstar ) +SCREEN_UPDATE_IND16( wwfsstar ) { - wwfsstar_state *state = screen->machine().driver_data(); + wwfsstar_state *state = screen.machine().driver_data(); - tilemap_set_scrolly( state->m_bg0_tilemap, 0, state->m_scrolly ); - tilemap_set_scrollx( state->m_bg0_tilemap, 0, state->m_scrollx ); + state->m_bg0_tilemap->set_scrolly(0, state->m_scrolly ); + state->m_bg0_tilemap->set_scrollx(0, state->m_scrollx ); - tilemap_draw(bitmap,cliprect,state->m_bg0_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect ); - tilemap_draw(bitmap,cliprect,state->m_fg0_tilemap,0,0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect ); + state->m_fg0_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/wwfwfest.c mame-0.145/src/mame/video/wwfwfest.c --- mame-0.144/src/mame/video/wwfwfest.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/wwfwfest.c 2012-02-06 21:30:32.000000000 +0000 @@ -28,21 +28,21 @@ state->m_fg0_videoram[offset]=data&0xff; } - tilemap_mark_tile_dirty(state->m_fg0_tilemap,offset/2); + state->m_fg0_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( wwfwfest_bg0_videoram_w ) { wwfwfest_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg0_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg0_tilemap,offset/2); + state->m_bg0_tilemap->mark_tile_dirty(offset/2); } WRITE16_HANDLER( wwfwfest_bg1_videoram_w ) { wwfwfest_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_bg1_videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg1_tilemap,offset); + state->m_bg1_tilemap->mark_tile_dirty(offset); } /******************************************************************************* @@ -144,7 +144,7 @@ sprite drawing could probably be improved a bit *******************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { wwfwfest_state *state = machine.driver_data(); /*- SPR RAM Format -** @@ -238,9 +238,9 @@ state->m_bg1_tilemap = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_rows, 16, 16,32,32); state->m_bg0_tilemap = tilemap_create(machine, get_bg0_tile_info,tilemap_scan_rows, 16, 16,32,32); - tilemap_set_transparent_pen(state->m_fg0_tilemap,0); - tilemap_set_transparent_pen(state->m_bg1_tilemap,0); - tilemap_set_transparent_pen(state->m_bg0_tilemap,0); + state->m_fg0_tilemap->set_transparent_pen(0); + state->m_bg1_tilemap->set_transparent_pen(0); + state->m_bg0_tilemap->set_transparent_pen(0); state->m_sprite_xoff = state->m_bg0_dx = state->m_bg1_dx[0] = state->m_bg1_dx[1] = 0; } @@ -255,42 +255,42 @@ state->m_bg1_dx[1] = -2; } -SCREEN_UPDATE( wwfwfest ) +SCREEN_UPDATE_IND16( wwfwfest ) { - wwfwfest_state *state = screen->machine().driver_data(); + wwfwfest_state *state = screen.machine().driver_data(); if (state->m_pri == 0x0078) { - tilemap_set_scrolly( state->m_bg0_tilemap, 0, state->m_bg0_scrolly ); - tilemap_set_scrollx( state->m_bg0_tilemap, 0, state->m_bg0_scrollx + state->m_bg0_dx); - tilemap_set_scrolly( state->m_bg1_tilemap, 0, state->m_bg1_scrolly ); - tilemap_set_scrollx( state->m_bg1_tilemap, 0, state->m_bg1_scrollx + state->m_bg1_dx[0]); + state->m_bg0_tilemap->set_scrolly(0, state->m_bg0_scrolly ); + state->m_bg0_tilemap->set_scrollx(0, state->m_bg0_scrollx + state->m_bg0_dx); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg1_scrolly ); + state->m_bg1_tilemap->set_scrollx(0, state->m_bg1_scrollx + state->m_bg1_dx[0]); } else { - tilemap_set_scrolly( state->m_bg1_tilemap, 0, state->m_bg0_scrolly ); - tilemap_set_scrollx( state->m_bg1_tilemap, 0, state->m_bg0_scrollx + state->m_bg1_dx[1]); - tilemap_set_scrolly( state->m_bg0_tilemap, 0, state->m_bg1_scrolly ); - tilemap_set_scrollx( state->m_bg0_tilemap, 0, state->m_bg1_scrollx + state->m_bg0_dx); + state->m_bg1_tilemap->set_scrolly(0, state->m_bg0_scrolly ); + state->m_bg1_tilemap->set_scrollx(0, state->m_bg0_scrollx + state->m_bg1_dx[1]); + state->m_bg0_tilemap->set_scrolly(0, state->m_bg1_scrolly ); + state->m_bg0_tilemap->set_scrollx(0, state->m_bg1_scrollx + state->m_bg0_dx); } /* todo : which bits of pri are significant to the order */ if (state->m_pri == 0x007b) { - tilemap_draw(bitmap,cliprect,state->m_bg0_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bg1_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg0_tilemap,0,0); + state->m_bg0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fg0_tilemap->draw(bitmap, cliprect, 0,0); } if (state->m_pri == 0x007c) { - tilemap_draw(bitmap,cliprect,state->m_bg0_tilemap,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bg1_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_fg0_tilemap,0,0); + state->m_bg0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bg1_tilemap->draw(bitmap, cliprect, 0,0); + state->m_fg0_tilemap->draw(bitmap, cliprect, 0,0); } if (state->m_pri == 0x0078) { - tilemap_draw(bitmap,cliprect,state->m_bg1_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bg0_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg0_tilemap,0,0); + state->m_bg1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bg0_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fg0_tilemap->draw(bitmap, cliprect, 0,0); } return 0; } diff -Nru mame-0.144/src/mame/video/xain.c mame-0.145/src/mame/video/xain.c --- mame-0.144/src/mame/video/xain.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xain.c 2012-02-06 21:30:32.000000000 +0000 @@ -93,9 +93,9 @@ state->m_bgram1_tilemap = tilemap_create(machine, get_bgram1_tile_info,back_scan, 16,16,32,32); state->m_char_tilemap = tilemap_create(machine, get_char_tile_info,tilemap_scan_rows, 8, 8,32,32); - tilemap_set_transparent_pen(state->m_bgram0_tilemap,0); - tilemap_set_transparent_pen(state->m_bgram1_tilemap,0); - tilemap_set_transparent_pen(state->m_char_tilemap,0); + state->m_bgram0_tilemap->set_transparent_pen(0); + state->m_bgram1_tilemap->set_transparent_pen(0); + state->m_char_tilemap->set_transparent_pen(0); } @@ -110,21 +110,21 @@ { xain_state *state = space->machine().driver_data(); state->m_bgram0[offset] = data; - tilemap_mark_tile_dirty(state->m_bgram0_tilemap,offset & 0x3ff); + state->m_bgram0_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( xain_bgram1_w ) { xain_state *state = space->machine().driver_data(); state->m_bgram1[offset] = data; - tilemap_mark_tile_dirty(state->m_bgram1_tilemap,offset & 0x3ff); + state->m_bgram1_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( xain_charram_w ) { xain_state *state = space->machine().driver_data(); state->m_charram[offset] = data; - tilemap_mark_tile_dirty(state->m_char_tilemap,offset & 0x3ff); + state->m_char_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( xain_scrollxP0_w ) @@ -132,7 +132,7 @@ xain_state *state = space->machine().driver_data(); state->m_scrollxP0[offset] = data; - tilemap_set_scrollx(state->m_bgram0_tilemap, 0, state->m_scrollxP0[0]|(state->m_scrollxP0[1]<<8)); + state->m_bgram0_tilemap->set_scrollx(0, state->m_scrollxP0[0]|(state->m_scrollxP0[1]<<8)); } WRITE8_HANDLER( xain_scrollyP0_w ) @@ -140,7 +140,7 @@ xain_state *state = space->machine().driver_data(); state->m_scrollyP0[offset] = data; - tilemap_set_scrolly(state->m_bgram0_tilemap, 0, state->m_scrollyP0[0]|(state->m_scrollyP0[1]<<8)); + state->m_bgram0_tilemap->set_scrolly(0, state->m_scrollyP0[0]|(state->m_scrollyP0[1]<<8)); } WRITE8_HANDLER( xain_scrollxP1_w ) @@ -148,7 +148,7 @@ xain_state *state = space->machine().driver_data(); state->m_scrollxP1[offset] = data; - tilemap_set_scrollx(state->m_bgram1_tilemap, 0, state->m_scrollxP1[0]|(state->m_scrollxP1[1]<<8)); + state->m_bgram1_tilemap->set_scrollx(0, state->m_scrollxP1[0]|(state->m_scrollxP1[1]<<8)); } WRITE8_HANDLER( xain_scrollyP1_w ) @@ -156,7 +156,7 @@ xain_state *state = space->machine().driver_data(); state->m_scrollyP1[offset] = data; - tilemap_set_scrolly(state->m_bgram1_tilemap, 0, state->m_scrollyP1[0]|(state->m_scrollyP1[1]<<8)); + state->m_bgram1_tilemap->set_scrolly(0, state->m_scrollyP1[0]|(state->m_scrollyP1[1]<<8)); } @@ -172,7 +172,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { xain_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -223,58 +223,58 @@ } } -SCREEN_UPDATE( xain ) +SCREEN_UPDATE_IND16( xain ) { - xain_state *state = screen->machine().driver_data(); + xain_state *state = screen.machine().driver_data(); switch (state->m_pri&0x7) { case 0: - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); + state->m_bgram0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bgram1_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); break; case 1: - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); + state->m_bgram1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bgram0_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); break; case 2: - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,0,0); + state->m_char_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bgram0_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram1_tilemap->draw(bitmap, cliprect, 0,0); break; case 3: - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,0,0); + state->m_char_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_bgram1_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram0_tilemap->draw(bitmap, cliprect, 0,0); break; case 4: - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,0,0); + state->m_bgram0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram1_tilemap->draw(bitmap, cliprect, 0,0); break; case 5: - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,TILEMAP_DRAW_OPAQUE,0); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,0,0); + state->m_bgram1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram0_tilemap->draw(bitmap, cliprect, 0,0); break; case 6: - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); + state->m_bgram0_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram1_tilemap->draw(bitmap, cliprect, 0,0); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); break; case 7: - tilemap_draw(bitmap,cliprect,state->m_bgram1_tilemap,TILEMAP_DRAW_OPAQUE,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_bgram0_tilemap,0,0); - tilemap_draw(bitmap,cliprect,state->m_char_tilemap,0,0); + state->m_bgram1_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_bgram0_tilemap->draw(bitmap, cliprect, 0,0); + state->m_char_tilemap->draw(bitmap, cliprect, 0,0); break; } return 0; diff -Nru mame-0.144/src/mame/video/xevious.c mame-0.145/src/mame/video/xevious.c --- mame-0.144/src/mame/video/xevious.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xevious.c 2012-02-06 21:30:32.000000000 +0000 @@ -222,11 +222,11 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8,8,64,32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,64,32); - tilemap_set_scrolldx(state->m_bg_tilemap,-20,288+27); - tilemap_set_scrolldy(state->m_bg_tilemap,-16,-16); - tilemap_set_scrolldx(state->m_fg_tilemap,-32,288+32); - tilemap_set_scrolldy(state->m_fg_tilemap,-18,-10); - tilemap_set_transparent_pen(state->m_fg_tilemap,0); + state->m_bg_tilemap->set_scrolldx(-20,288+27); + state->m_bg_tilemap->set_scrolldy(-16,-16); + state->m_fg_tilemap->set_scrolldx(-32,288+32); + state->m_fg_tilemap->set_scrolldy(-18,-10); + state->m_fg_tilemap->set_transparent_pen(0); state->m_xevious_bs[0] = 0; state->m_xevious_bs[1] = 0; @@ -246,7 +246,7 @@ xevious_state *state = space->machine().driver_data(); state->m_xevious_fg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( xevious_fg_colorram_w ) @@ -254,7 +254,7 @@ xevious_state *state = space->machine().driver_data(); state->m_xevious_fg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap,offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( xevious_bg_videoram_w ) @@ -262,7 +262,7 @@ xevious_state *state = space->machine().driver_data(); state->m_xevious_bg_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( xevious_bg_colorram_w ) @@ -270,7 +270,7 @@ xevious_state *state = space->machine().driver_data(); state->m_xevious_bg_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } WRITE8_HANDLER( xevious_vh_latch_w ) @@ -285,16 +285,16 @@ switch (reg) { case 0: - tilemap_set_scrollx(state->m_bg_tilemap,0,scroll); + state->m_bg_tilemap->set_scrollx(0,scroll); break; case 1: - tilemap_set_scrollx(state->m_fg_tilemap,0,scroll); + state->m_fg_tilemap->set_scrollx(0,scroll); break; case 2: - tilemap_set_scrolly(state->m_bg_tilemap,0,scroll); + state->m_bg_tilemap->set_scrolly(0,scroll); break; case 3: - tilemap_set_scrolly(state->m_fg_tilemap,0,scroll); + state->m_fg_tilemap->set_scrolly(0,scroll); break; case 7: flip_screen_set(space->machine(), scroll & 1); @@ -414,7 +414,7 @@ ***************************************************************************/ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect) { xevious_state *state = machine.driver_data(); @@ -452,7 +452,8 @@ { flipx = !flipx; flipy = !flipy; - sy += 48; + sy += 40; + sx += 96; } transmask = colortable_get_transpen_mask(machine.colortable, machine.gfx[bank], color, 0x80); @@ -497,12 +498,12 @@ } -SCREEN_UPDATE( xevious ) +SCREEN_UPDATE_IND16( xevious ) { - xevious_state *state = screen->machine().driver_data(); + xevious_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); - draw_sprites(screen->machine(), bitmap,cliprect); - tilemap_draw(bitmap,cliprect,state->m_fg_tilemap,0,0); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); + draw_sprites(screen.machine(), bitmap,cliprect); + state->m_fg_tilemap->draw(bitmap, cliprect, 0,0); return 0; } diff -Nru mame-0.144/src/mame/video/xexex.c mame-0.145/src/mame/video/xexex.c --- mame-0.144/src/mame/video/xexex.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xexex.c 2012-02-06 21:30:33.000000000 +0000 @@ -46,10 +46,10 @@ k056832_set_layer_offs(state->m_k056832, 3, 6, 16); } -SCREEN_UPDATE( xexex ) +SCREEN_UPDATE_RGB32( xexex ) { static const int K053251_CI[4] = { K053251_CI1, K053251_CI2, K053251_CI3, K053251_CI4 }; - xexex_state *state = screen->machine().driver_data(); + xexex_state *state = screen.machine().driver_data(); int layer[4]; int bg_colorbase, new_colorbase, plane, alpha; @@ -81,7 +81,7 @@ k054338_update_all_shadows(state->m_k054338, 0); k054338_fill_backcolor(state->m_k054338, bitmap, 0); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); for (plane = 0; plane < 4; plane++) { diff -Nru mame-0.144/src/mame/video/xmen.c mame-0.145/src/mame/video/xmen.c --- mame-0.144/src/mame/video/xmen.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/mame/video/xmen.c 2012-02-06 21:30:32.000000000 +0000 @@ -57,8 +57,8 @@ k053247_get_ram(state->m_k053246, &state->m_k053247_ram); - state->m_screen_left = auto_bitmap_alloc(machine, 64 * 8, 32 * 8, BITMAP_FORMAT_INDEXED16); - state->m_screen_right = auto_bitmap_alloc(machine, 64 * 8, 32 * 8, BITMAP_FORMAT_INDEXED16); + state->m_screen_left = auto_bitmap_ind16_alloc(machine, 64 * 8, 32 * 8); + state->m_screen_right = auto_bitmap_ind16_alloc(machine, 64 * 8, 32 * 8); state->save_item(NAME(*state->m_screen_left)); state->save_item(NAME(*state->m_screen_right)); @@ -71,9 +71,9 @@ ***************************************************************************/ -SCREEN_UPDATE( xmen ) +SCREEN_UPDATE_IND16( xmen ) { - xmen_state *state = screen->machine().driver_data(); + xmen_state *state = screen.machine().driver_data(); int layer[3], bg_colorbase; bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI4); @@ -93,9 +93,9 @@ konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); /* note the '+1' in the background color!!! */ - bitmap_fill(bitmap, cliprect, 16 * bg_colorbase + 1); + bitmap.fill(16 * bg_colorbase + 1, cliprect); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[0], 0, 1); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[1], 0, 2); k052109_tilemap_draw(state->m_k052109, bitmap, cliprect, layer[2], 0, 4); @@ -107,119 +107,124 @@ } -SCREEN_UPDATE( xmen6p ) +SCREEN_UPDATE_IND16( xmen6p_left ) { - xmen_state *state = screen->machine().driver_data(); + xmen_state *state = screen.machine().driver_data(); int x, y; - if (screen == state->m_lscreen) - for(y = 0; y < 32 * 8; y++) - { - UINT16* line_dest = BITMAP_ADDR16(bitmap, y, 0); - UINT16* line_src = BITMAP_ADDR16(state->m_screen_left, y, 0); - - for (x = 12 * 8; x < 52 * 8; x++) - line_dest[x] = line_src[x]; - } - else if (screen == state->m_rscreen) - for(y = 0; y < 32 * 8; y++) - { - UINT16* line_dest = BITMAP_ADDR16(bitmap, y, 0); - UINT16* line_src = BITMAP_ADDR16(state->m_screen_right, y, 0); + for(y = 0; y < 32 * 8; y++) + { + UINT16* line_dest = &bitmap.pix16(y); + UINT16* line_src = &state->m_screen_left->pix16(y); - for (x = 12 * 8; x < 52 * 8; x++) - line_dest[x] = line_src[x]; - } + for (x = 12 * 8; x < 52 * 8; x++) + line_dest[x] = line_src[x]; + } return 0; } -/* my lefts and rights are mixed up in several places.. */ -SCREEN_EOF( xmen6p ) +SCREEN_UPDATE_IND16( xmen6p_right ) { - xmen_state *state = machine.driver_data(); - int layer[3], bg_colorbase; - bitmap_t * renderbitmap; - rectangle cliprect; - int offset; - -// const rectangle *visarea = machine.primary_screen->visible_area(); -// cliprect.min_x = visarea->min_x; -// cliprect.max_x = visarea->max_x; -// cliprect.min_y = visarea->min_y; -// cliprect.max_y = visarea->max_y; - - cliprect.min_x = 0; - cliprect.max_x = 64 * 8 - 1; - cliprect.min_y = 2 * 8; - cliprect.max_y = 30 * 8 - 1; - + xmen_state *state = screen.machine().driver_data(); + int x, y; - if (machine.primary_screen->frame_number() & 0x01) + for(y = 0; y < 32 * 8; y++) { + UINT16* line_dest = &bitmap.pix16(y); + UINT16* line_src = &state->m_screen_right->pix16(y); - /* copy the desired spritelist to the chip */ - memcpy(state->m_k053247_ram, state->m_xmen6p_spriteramright, 0x1000); - - /* we write the entire content of the tileram to the chip to ensure - everything gets marked as dirty and the desired tilemap is rendered - this is not very efficient! - */ - for (offset = 0; offset < (0xc000 / 2); offset++) - { -// K052109_lsb_w - k052109_w(state->m_k052109, offset, state->m_xmen6p_tilemapright[offset] & 0x00ff); - } + for (x = 12 * 8; x < 52 * 8; x++) + line_dest[x] = line_src[x]; + } + return 0; +} - renderbitmap = state->m_screen_right; - } - else +/* my lefts and rights are mixed up in several places.. */ +SCREEN_VBLANK( xmen6p ) +{ + // rising edge + if (vblank_on) { - /* copy the desired spritelist to the chip */ - memcpy(state->m_k053247_ram, state->m_xmen6p_spriteramleft, 0x1000); + xmen_state *state = screen.machine().driver_data(); + int layer[3], bg_colorbase; + bitmap_ind16 * renderbitmap; + rectangle cliprect; + int offset; + + // const rectangle *visarea = screen.machine().primary_screen->visible_area(); + // cliprect = *visarea; - /* we write the entire content of the tileram to the chip to ensure - everything gets marked as dirty and the desired tilemap is rendered + cliprect.set(0, 64 * 8 - 1, 2 * 8, 30 * 8 - 1); - this is not very efficient! - */ - for (offset = 0; offset < (0xc000 / 2); offset++) + + if (screen.machine().primary_screen->frame_number() & 0x01) { -// K052109_lsb_w - k052109_w(state->m_k052109, offset, state->m_xmen6p_tilemapleft[offset] & 0x00ff); - } + /* copy the desired spritelist to the chip */ + memcpy(state->m_k053247_ram, state->m_xmen6p_spriteramright, 0x1000); - renderbitmap = state->m_screen_left; - } + /* we write the entire content of the tileram to the chip to ensure + everything gets marked as dirty and the desired tilemap is rendered + this is not very efficient! + */ + for (offset = 0; offset < (0xc000 / 2); offset++) + { + // K052109_lsb_w + k052109_w(state->m_k052109, offset, state->m_xmen6p_tilemapright[offset] & 0x00ff); + } - bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI4); - state->m_sprite_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI1); - state->m_layer_colorbase[0] = k053251_get_palette_index(state->m_k053251, K053251_CI3); - state->m_layer_colorbase[1] = k053251_get_palette_index(state->m_k053251, K053251_CI0); - state->m_layer_colorbase[2] = k053251_get_palette_index(state->m_k053251, K053251_CI2); + renderbitmap = state->m_screen_right; + } + else + { + /* copy the desired spritelist to the chip */ + memcpy(state->m_k053247_ram, state->m_xmen6p_spriteramleft, 0x1000); - k052109_tilemap_update(state->m_k052109); + /* we write the entire content of the tileram to the chip to ensure + everything gets marked as dirty and the desired tilemap is rendered - layer[0] = 0; - state->m_layerpri[0] = k053251_get_priority(state->m_k053251, K053251_CI3); - layer[1] = 1; - state->m_layerpri[1] = k053251_get_priority(state->m_k053251, K053251_CI0); - layer[2] = 2; - state->m_layerpri[2] = k053251_get_priority(state->m_k053251, K053251_CI2); + this is not very efficient! + */ + for (offset = 0; offset < (0xc000 / 2); offset++) + { + // K052109_lsb_w + k052109_w(state->m_k052109, offset, state->m_xmen6p_tilemapleft[offset] & 0x00ff); + } - konami_sortlayers3(layer, state->m_layerpri); - bitmap_fill(machine.priority_bitmap, &cliprect, 0); - /* note the '+1' in the background color!!! */ - bitmap_fill(renderbitmap, &cliprect, 16 * bg_colorbase + 1); - k052109_tilemap_draw(state->m_k052109, renderbitmap, &cliprect, layer[0], 0, 1); - k052109_tilemap_draw(state->m_k052109, renderbitmap, &cliprect, layer[1], 0, 2); - k052109_tilemap_draw(state->m_k052109, renderbitmap, &cliprect, layer[2], 0, 4); + renderbitmap = state->m_screen_left; + } -/* this isn't supported anymore and it is unsure if still needed; keeping here for reference - pdrawgfx_shadow_lowpri = 1; fix shadows of boulders in front of feet */ - k053247_sprites_draw(state->m_k053246, renderbitmap, &cliprect); + + bg_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI4); + state->m_sprite_colorbase = k053251_get_palette_index(state->m_k053251, K053251_CI1); + state->m_layer_colorbase[0] = k053251_get_palette_index(state->m_k053251, K053251_CI3); + state->m_layer_colorbase[1] = k053251_get_palette_index(state->m_k053251, K053251_CI0); + state->m_layer_colorbase[2] = k053251_get_palette_index(state->m_k053251, K053251_CI2); + + k052109_tilemap_update(state->m_k052109); + + layer[0] = 0; + state->m_layerpri[0] = k053251_get_priority(state->m_k053251, K053251_CI3); + layer[1] = 1; + state->m_layerpri[1] = k053251_get_priority(state->m_k053251, K053251_CI0); + layer[2] = 2; + state->m_layerpri[2] = k053251_get_priority(state->m_k053251, K053251_CI2); + + konami_sortlayers3(layer, state->m_layerpri); + + screen.machine().priority_bitmap.fill(0, cliprect); + /* note the '+1' in the background color!!! */ + renderbitmap->fill(16 * bg_colorbase + 1, cliprect); + k052109_tilemap_draw(state->m_k052109, *renderbitmap, cliprect, layer[0], 0, 1); + k052109_tilemap_draw(state->m_k052109, *renderbitmap, cliprect, layer[1], 0, 2); + k052109_tilemap_draw(state->m_k052109, *renderbitmap, cliprect, layer[2], 0, 4); + + /* this isn't supported anymore and it is unsure if still needed; keeping here for reference + pdrawgfx_shadow_lowpri = 1; fix shadows of boulders in front of feet */ + k053247_sprites_draw(state->m_k053246, *renderbitmap, cliprect); + } } diff -Nru mame-0.144/src/mame/video/xorworld.c mame-0.145/src/mame/video/xorworld.c --- mame-0.144/src/mame/video/xorworld.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xorworld.c 2012-02-06 21:30:32.000000000 +0000 @@ -53,7 +53,7 @@ xorworld_state *state = space->machine().driver_data(); UINT16 *videoram = state->m_videoram; COMBINE_DATA(&videoram[offset]); - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } /* @@ -96,7 +96,7 @@ 1 | xxxx---- -------- | sprite color */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { xorworld_state *state = machine.driver_data(); UINT16 *spriteram16 = state->m_spriteram; @@ -113,10 +113,10 @@ } } -SCREEN_UPDATE( xorworld ) +SCREEN_UPDATE_IND16( xorworld ) { - xorworld_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + xorworld_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/xxmissio.c mame-0.145/src/mame/video/xxmissio.c --- mame-0.144/src/mame/video/xxmissio.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xxmissio.c 2012-02-06 21:30:33.000000000 +0000 @@ -77,15 +77,15 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 8, 32, 32); state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 8, 32, 32); - tilemap_set_scroll_cols(state->m_bg_tilemap, 1); - tilemap_set_scroll_rows(state->m_bg_tilemap, 1); - tilemap_set_scrolldx(state->m_bg_tilemap, 2, 12); + state->m_bg_tilemap->set_scroll_cols(1); + state->m_bg_tilemap->set_scroll_rows(1); + state->m_bg_tilemap->set_scrolldx(2, 12); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); + state->m_fg_tilemap->set_transparent_pen(0); } -static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx) +static void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const gfx_element *gfx) { xxmissio_state *state = gfx->machine().driver_data(); int offs; @@ -136,18 +136,18 @@ } -SCREEN_UPDATE( xxmissio ) +SCREEN_UPDATE_IND16( xxmissio ) { - xxmissio_state *state = screen->machine().driver_data(); - tilemap_mark_all_tiles_dirty_all(screen->machine()); - tilemap_set_flip_all(screen->machine(), state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); - - tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_xscroll * 2); - tilemap_set_scrolly(state->m_bg_tilemap, 0, state->m_yscroll); - - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(bitmap, cliprect, screen->machine().gfx[1]); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + xxmissio_state *state = screen.machine().driver_data(); + screen.machine().tilemap().mark_all_dirty(); + screen.machine().tilemap().set_flip_all(state->m_flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); + + state->m_bg_tilemap->set_scrollx(0, state->m_xscroll * 2); + state->m_bg_tilemap->set_scrolly(0, state->m_yscroll); + + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect, screen.machine().gfx[1]); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/xybots.c mame-0.145/src/mame/video/xybots.c --- mame-0.144/src/mame/video/xybots.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xybots.c 2012-02-06 21:30:32.000000000 +0000 @@ -93,7 +93,7 @@ /* initialize the alphanumerics */ state->m_alpha_tilemap = tilemap_create(machine, get_alpha_tile_info, tilemap_scan_rows, 8,8, 64,32); - tilemap_set_transparent_pen(state->m_alpha_tilemap, 0); + state->m_alpha_tilemap->set_transparent_pen(0); } @@ -104,23 +104,23 @@ * *************************************/ -SCREEN_UPDATE( xybots ) +SCREEN_UPDATE_IND16( xybots ) { - xybots_state *state = screen->machine().driver_data(); + xybots_state *state = screen.machine().driver_data(); atarimo_rect_list rectlist; - bitmap_t *mobitmap; + bitmap_ind16 *mobitmap; int x, y, r; /* draw the playfield */ - tilemap_draw(bitmap, cliprect, state->m_playfield_tilemap, 0, 0); + state->m_playfield_tilemap->draw(bitmap, cliprect, 0, 0); /* draw and merge the MO */ mobitmap = atarimo_render(0, cliprect, &rectlist); for (r = 0; r < rectlist.numrects; r++, rectlist.rect++) for (y = rectlist.rect->min_y; y <= rectlist.rect->max_y; y++) { - UINT16 *mo = (UINT16 *)mobitmap->base + mobitmap->rowpixels * y; - UINT16 *pf = (UINT16 *)bitmap->base + bitmap->rowpixels * y; + UINT16 *mo = &mobitmap->pix16(y); + UINT16 *pf = &bitmap.pix16(y); for (x = rectlist.rect->min_x; x <= rectlist.rect->max_x; x++) if (mo[x]) { @@ -166,6 +166,6 @@ } /* add the alpha on top */ - tilemap_draw(bitmap, cliprect, state->m_alpha_tilemap, 0, 0); + state->m_alpha_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/xyonix.c mame-0.145/src/mame/video/xyonix.c --- mame-0.144/src/mame/video/xyonix.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/xyonix.c 2012-02-06 21:30:32.000000000 +0000 @@ -46,7 +46,7 @@ xyonix_state *state = space->machine().driver_data(); state->m_vidram[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap,(offset-1)&0x0fff); + state->m_tilemap->mark_tile_dirty((offset-1)&0x0fff); } VIDEO_START(xyonix) @@ -56,10 +56,10 @@ state->m_tilemap = tilemap_create(machine, get_xyonix_tile_info, tilemap_scan_rows, 4, 8, 80, 32); } -SCREEN_UPDATE(xyonix) +SCREEN_UPDATE_IND16(xyonix) { - xyonix_state *state = screen->machine().driver_data(); + xyonix_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_tilemap, 0, 0); + state->m_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/ygv608.c mame-0.145/src/mame/video/ygv608.c --- mame-0.144/src/mame/video/ygv608.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/mame/video/ygv608.c 2012-02-06 21:30:32.000000000 +0000 @@ -55,7 +55,7 @@ static tilemap_t *tilemap_B_cache_16[3]; static tilemap_t *tilemap_A = NULL; static tilemap_t *tilemap_B = NULL; -static bitmap_t *work_bitmap = NULL; +static bitmap_ind16 *work_bitmap = NULL; static void HandleYGV608Reset( running_machine &machine ); static void HandleRomTransfers( running_machine &machine ); @@ -547,13 +547,13 @@ machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ygv608_exit), &machine)); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { #ifdef _ENABLE_SPRITES // sprites are always clipped to 512x512 // - regardless of the visible display dimensions - rectangle spriteClip = { 0, 512, 0, 512 }; + rectangle spriteClip(0, 512, 0, 512); PSPRITE_ATTR sa; int flipx = 0, flipy = 0; @@ -564,7 +564,7 @@ return; /* draw sprites */ - sect_rect(&spriteClip, cliprect); + spriteClip &= cliprect; sa = &ygv608.sprite_attribute_table.s[YGV608_MAX_SPRITES-1]; for( i=0; i 512-8 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_8X8_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_8X8_4BIT], code+namcond1_gfxbank*0x10000, color, flipx,flipy, sx-512,sy,0x00); if( sy > 512-8 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_8X8_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_8X8_4BIT], code+namcond1_gfxbank*0x10000, color, flipx,flipy, @@ -630,20 +630,20 @@ logerror( "SZ_8X8: sprite=%d\n", code ); code = 0; } - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_16X16_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_16X16_4BIT], code+namcond1_gfxbank*0x4000, color, flipx,flipy, sx,sy,0x00); // redraw with wrap-around if( sx > 512-16 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_16X16_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_16X16_4BIT], code+namcond1_gfxbank*0x4000, color, flipx,flipy, sx-512,sy,0x00); if( sy > 512-16 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_16X16_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_16X16_4BIT], code+namcond1_gfxbank*0x4000, color, flipx,flipy, @@ -660,20 +660,20 @@ logerror( "SZ_32X32: sprite=%d\n", code ); code = 0; } - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_32X32_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_32X32_4BIT], code+namcond1_gfxbank*0x1000, color, flipx,flipy, sx,sy,0x00); // redraw with wrap-around if( sx > 512-32 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_32X32_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_32X32_4BIT], code+namcond1_gfxbank*0x1000, color, flipx,flipy, sx-512,sy,0x00); if( sy > 512-32 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_32X32_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_32X32_4BIT], code+namcond1_gfxbank*0x1000, color, flipx,flipy, @@ -690,20 +690,20 @@ logerror( "SZ_64X64: sprite=%d\n", code ); code = 0; } - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_64X64_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_64X64_4BIT], code+namcond1_gfxbank*0x400, color, flipx,flipy, sx,sy,0x00); // redraw with wrap-around if( sx > 512-64 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_64X64_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_64X64_4BIT], code+namcond1_gfxbank*0x400, color, flipx,flipy, sx-512,sy,0x00); if( sy > 512-64 ) - drawgfx_transpen( bitmap, &spriteClip,machine.gfx[GFX_64X64_4BIT], + drawgfx_transpen( bitmap, spriteClip,machine.gfx[GFX_64X64_4BIT], code+namcond1_gfxbank*0x400, color, flipx,flipy, @@ -731,7 +731,7 @@ static const char *const psize[] = { "8x8", "16x16", "32x32", "64x64" }; #endif -SCREEN_UPDATE( ygv608 ) +SCREEN_UPDATE_IND16( ygv608 ) { #ifdef _SHOW_VIDEO_DEBUG char buffer[64]; @@ -744,20 +744,16 @@ double r, alpha, sin_theta, cos_theta; #endif rectangle finalclip; - const rectangle &visarea = screen->visible_area(); + const rectangle &visarea = screen.visible_area(); // clip to the current bitmap - finalclip.min_x = 0; - finalclip.max_x = screen->width() - 1; - finalclip.min_y = 0; - finalclip.max_y = screen->height() - 1; - sect_rect(&finalclip, cliprect); - cliprect = &finalclip; + finalclip.set(0, screen.width() - 1, 0, screen.height() - 1); + finalclip &= cliprect; // punt if not initialized if (ygv608.page_x == 0 || ygv608.page_y == 0) { - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, finalclip); return 0; } @@ -766,12 +762,12 @@ #ifdef _ENABLE_SCREEN_RESIZE // hdw should be scaled by 16, not 8 // - is it something to do with double dot-clocks??? - screen->set_visible_area(0, ((int)(ygv608.regs.s.hdw)<<3/*4*/)-1, + screen.set_visible_area(0, ((int)(ygv608.regs.s.hdw)<<3/*4*/)-1, 0, ((int)(ygv608.regs.s.vdw)<<3)-1 ); #endif - auto_free( screen->machine(), work_bitmap ); - work_bitmap = screen->alloc_compatible_bitmap(); + auto_free( screen.machine(), work_bitmap ); + work_bitmap = auto_bitmap_ind16_alloc(screen.machine(), screen.width(), screen.height()); // reset resize flag ygv608.screen_resize = 0; @@ -793,23 +789,23 @@ tilemap_A = tilemap_A_cache_8[index]; else tilemap_A = tilemap_A_cache_16[index]; - tilemap_mark_all_tiles_dirty(tilemap_A); + tilemap_A->mark_all_dirty(); - tilemap_set_transparent_pen( tilemap_A, 0 ); + tilemap_A->set_transparent_pen(0 ); // for NCV1 it's sufficient to scroll only columns - tilemap_set_scroll_cols( tilemap_A, ygv608.page_x ); + tilemap_A->set_scroll_cols(ygv608.page_x ); if ((ygv608.regs.s.r9 & r9_pts) == PTS_8X8 ) tilemap_B = tilemap_B_cache_8[index]; else tilemap_B = tilemap_B_cache_16[index]; - tilemap_mark_all_tiles_dirty(tilemap_B); + tilemap_B->mark_all_dirty(); // for NCV1 it's sufficient to scroll only columns - tilemap_set_scroll_cols( tilemap_B, ygv608.page_x ); + tilemap_B->set_scroll_cols(ygv608.page_x ); // now clear the screen in case we change to 1-plane mode - bitmap_fill( work_bitmap, cliprect , 0); + work_bitmap->fill(0, finalclip ); // reset resize flag ygv608.tilemap_resize = 0; @@ -819,11 +815,11 @@ for( col=0; colset_scrolly(col, ( (int)ygv608.scroll_data_table[1][(col>>ygv608.col_shift)<<1] + ( (int)ygv608.scroll_data_table[1][((col>>ygv608.col_shift)<<1)+1] << 8 ) ) ); - tilemap_set_scrolly( tilemap_A, col, + tilemap_A->set_scrolly(col, ( (int)ygv608.scroll_data_table[0][(col>>ygv608.col_shift)<<1] + ( (int)ygv608.scroll_data_table[0][((col>>ygv608.col_shift)<<1)+1] << 8 ) ) ); } @@ -832,24 +828,24 @@ #ifdef _ENABLE_SCROLLX - tilemap_set_scrollx( tilemap_B, 0, + tilemap_B->set_scrollx(0, ( (int)ygv608.scroll_data_table[1][0x80] + ( (int)ygv608.scroll_data_table[1][0x81] << 8 ) ) ); - tilemap_set_scrollx( tilemap_A, 0, + tilemap_A->set_scrollx(0, ( (int)ygv608.scroll_data_table[0][0x80] + ( (int)ygv608.scroll_data_table[0][0x81] << 8 ) ) ); #endif - tilemap_set_enable( tilemap_A, ygv608.regs.s.r7 & r7_dspe); + tilemap_A->enable(ygv608.regs.s.r7 & r7_dspe); if((ygv608.regs.s.r7 & r7_md) & MD_1PLANE ) - tilemap_set_enable( tilemap_B, 0 ); + tilemap_B->enable(0 ); else - tilemap_set_enable( tilemap_B, ygv608.regs.s.r7 & r7_dspe); + tilemap_B->enable(ygv608.regs.s.r7 & r7_dspe); - tilemap_mark_all_tiles_dirty( tilemap_A ); - tilemap_mark_all_tiles_dirty( tilemap_B ); + tilemap_A ->mark_all_dirty(); + tilemap_B ->mark_all_dirty(); /* @@ -862,12 +858,12 @@ if ((ygv608.regs.s.r7 & r7_md) & MD_1PLANE) { // If the background tilemap is disabled, we need to clear the bitmap to black - bitmap_fill (work_bitmap,cliprect,0); -// bitmap_fill (work_bitmap,visarea,1); + work_bitmap->fill(0, finalclip); +// work_bitmap->fill(1, *visarea); } else #endif - tilemap_draw( work_bitmap,cliprect, tilemap_B, 0, 0 ); + tilemap_B->draw(*work_bitmap, finalclip, 0, 0 ); #ifdef _ENABLE_ROTATE_ZOOM @@ -883,7 +879,7 @@ cos_theta = (double)ygv608.dx / (double)0x10000; if( ygv608.regs.s.zron ) - copyrozbitmap( bitmap, cliprect, work_bitmap, + copyrozbitmap( bitmap, finalclip, work_bitmap, ( visarea.min_x << 16 ) + ygv608.ax + 0x10000 * r * ( -sin( alpha ) * cos_theta + cos( alpha ) * sin_theta ), @@ -893,33 +889,33 @@ ygv608.dx, ygv608.dxy, ygv608.dyx, ygv608.dy, 0); else #endif - copybitmap( bitmap, work_bitmap, 0, 0, 0, 0, cliprect); + copybitmap( bitmap, *work_bitmap, 0, 0, 0, 0, finalclip); // for some reason we can't use an opaque tilemap_A // so use a transparent but clear the work bitmap first // - look at why this is the case?!? - bitmap_fill( work_bitmap,&visarea ,0); + work_bitmap->fill(0, visarea ); if ((ygv608.regs.s.r11 & r11_prm) == PRM_ASBDEX || (ygv608.regs.s.r11 & r11_prm) == PRM_ASEBDX ) - draw_sprites(screen->machine(), bitmap,cliprect ); + draw_sprites(screen.machine(), bitmap,finalclip ); - tilemap_draw( work_bitmap,cliprect, tilemap_A, 0, 0 ); + tilemap_A->draw(*work_bitmap, finalclip, 0, 0 ); #ifdef _ENABLE_ROTATE_ZOOM if( ygv608.regs.s.zron ) - copyrozbitmap_trans( bitmap, cliprect, work_bitmap, + copyrozbitmap_trans( bitmap, finalclip, work_bitmap, ygv608.ax, // + ( visarea.min_x << 16 ), ygv608.ay, // + ( visarea.min_y << 16 ), ygv608.dx, ygv608.dxy, ygv608.dyx, ygv608.dy, 0, 0 ); else #endif - copybitmap_trans( bitmap, work_bitmap, 0, 0, 0, 0, cliprect, 0 ); + copybitmap_trans( bitmap, *work_bitmap, 0, 0, 0, 0, finalclip, 0 ); if ((ygv608.regs.s.r11 & r11_prm) == PRM_SABDEX || (ygv608.regs.s.r11 & r11_prm) == PRM_SEABDX) - draw_sprites(screen->machine(), bitmap,cliprect ); + draw_sprites(screen.machine(), bitmap,finalclip ); #ifdef _SHOW_VIDEO_DEBUG diff -Nru mame-0.144/src/mame/video/ygv608.h mame-0.145/src/mame/video/ygv608.h --- mame-0.144/src/mame/video/ygv608.h 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/ygv608.h 2012-02-06 21:30:32.000000000 +0000 @@ -333,7 +333,7 @@ INTERRUPT_GEN( ygv608_timed_interrupt ); VIDEO_START( ygv608 ); -SCREEN_UPDATE( ygv608 ); +SCREEN_UPDATE_IND16( ygv608 ); READ16_HANDLER( ygv608_r ); WRITE16_HANDLER( ygv608_w ); diff -Nru mame-0.144/src/mame/video/yiear.c mame-0.145/src/mame/video/yiear.c --- mame-0.144/src/mame/video/yiear.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/yiear.c 2012-02-06 21:30:31.000000000 +0000 @@ -63,7 +63,7 @@ { yiear_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2); + state->m_bg_tilemap->mark_tile_dirty(offset / 2); } WRITE8_HANDLER( yiear_control_w ) @@ -73,14 +73,14 @@ if (flip_screen_get(space->machine()) != (data & 0x01)) { flip_screen_set(space->machine(), data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + space->machine().tilemap().mark_all_dirty(); } /* bit 1 is NMI enable */ state->m_yiear_nmi_enable = data & 0x02; /* bit 2 is IRQ enable */ - interrupt_enable_w(space, 0, data & 0x04); + state->m_yiear_irq_enable = data & 0x04; /* bits 3 and 4 are coin counters */ coin_counter_w(space->machine(), 0, data & 0x08); @@ -105,7 +105,7 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { yiear_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -141,11 +141,11 @@ } } -SCREEN_UPDATE( yiear ) +SCREEN_UPDATE_IND16( yiear ) { - yiear_state *state = screen->machine().driver_data(); + yiear_state *state = screen.machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap, cliprect); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/yunsun16.c mame-0.145/src/mame/video/yunsun16.c --- mame-0.144/src/mame/video/yunsun16.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/yunsun16.c 2012-02-06 21:30:32.000000000 +0000 @@ -76,7 +76,7 @@ yunsun16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_0[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_0, offset / 2); + state->m_tilemap_0->mark_tile_dirty(offset / 2); } WRITE16_HANDLER( yunsun16_vram_1_w ) @@ -84,7 +84,7 @@ yunsun16_state *state = space->machine().driver_data(); COMBINE_DATA(&state->m_vram_1[offset]); - tilemap_mark_tile_dirty(state->m_tilemap_1, offset / 2); + state->m_tilemap_1->mark_tile_dirty(offset / 2); } @@ -105,14 +105,14 @@ state->m_tilemap_1 = tilemap_create(machine, get_tile_info_1,yunsun16_tilemap_scan_pages, 16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y); - tilemap_set_scrolldx(state->m_tilemap_0, -0x34, 0); - tilemap_set_scrolldx(state->m_tilemap_1, -0x38, 0); + state->m_tilemap_0->set_scrolldx(-0x34, 0); + state->m_tilemap_1->set_scrolldx(-0x38, 0); - tilemap_set_scrolldy(state->m_tilemap_0, -0x10, 0); - tilemap_set_scrolldy(state->m_tilemap_1, -0x10, 0); + state->m_tilemap_0->set_scrolldy(-0x10, 0); + state->m_tilemap_1->set_scrolldy(-0x10, 0); - tilemap_set_transparent_pen(state->m_tilemap_0, 0xff); - tilemap_set_transparent_pen(state->m_tilemap_1, 0xff); + state->m_tilemap_0->set_transparent_pen(0xff); + state->m_tilemap_1->set_transparent_pen(0xff); } @@ -136,7 +136,7 @@ ***************************************************************************/ -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +static void draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) { yunsun16_state *state = machine.driver_data(); int offs; @@ -200,35 +200,35 @@ ***************************************************************************/ -SCREEN_UPDATE( yunsun16 ) +SCREEN_UPDATE_IND16( yunsun16 ) { - yunsun16_state *state = screen->machine().driver_data(); + yunsun16_state *state = screen.machine().driver_data(); - tilemap_set_scrollx(state->m_tilemap_0, 0, state->m_scrollram_0[0]); - tilemap_set_scrolly(state->m_tilemap_0, 0, state->m_scrollram_0[1]); + state->m_tilemap_0->set_scrollx(0, state->m_scrollram_0[0]); + state->m_tilemap_0->set_scrolly(0, state->m_scrollram_0[1]); - tilemap_set_scrollx(state->m_tilemap_1, 0, state->m_scrollram_1[0]); - tilemap_set_scrolly(state->m_tilemap_1, 0, state->m_scrollram_1[1]); + state->m_tilemap_1->set_scrollx(0, state->m_scrollram_1[0]); + state->m_tilemap_1->set_scrolly(0, state->m_scrollram_1[1]); //popmessage("%04X", *state->m_priorityram); - bitmap_fill(screen->machine().priority_bitmap, cliprect, 0); + screen.machine().priority_bitmap.fill(0, cliprect); if ((*state->m_priorityram & 0x0c) == 4) { /* The color of the this layer's transparent pen goes below everything */ - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 2); + state->m_tilemap_0->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_tilemap_0->draw(bitmap, cliprect, 0, 1); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 2); } else if ((*state->m_priorityram & 0x0c) == 8) { /* The color of the this layer's transparent pen goes below everything */ - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, TILEMAP_DRAW_OPAQUE, 0); - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 1); - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 2); + state->m_tilemap_1->draw(bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 1); + state->m_tilemap_0->draw(bitmap, cliprect, 0, 2); } - draw_sprites(screen->machine(), bitmap, cliprect); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/yunsung8.c mame-0.145/src/mame/video/yunsung8.c --- mame-0.144/src/mame/video/yunsung8.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/yunsung8.c 2012-02-06 21:30:32.000000000 +0000 @@ -98,12 +98,12 @@ if (bank) { state->m_videoram_0[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_0, tile); + state->m_tilemap_0->mark_tile_dirty(tile); } else { state->m_videoram_1[offset] = data; - tilemap_mark_tile_dirty(state->m_tilemap_1, tile); + state->m_tilemap_1->mark_tile_dirty(tile); } } } @@ -111,7 +111,7 @@ WRITE8_HANDLER( yunsung8_flipscreen_w ) { - tilemap_set_flip_all(space->machine(), (data & 1) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + space->machine().tilemap().set_flip_all((data & 1) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } @@ -181,7 +181,7 @@ state->m_tilemap_0 = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 8, 8, DIM_NX_0, DIM_NY_0 ); state->m_tilemap_1 = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 8, 8, DIM_NX_1, DIM_NY_1 ); - tilemap_set_transparent_pen(state->m_tilemap_1, 0); + state->m_tilemap_1->set_transparent_pen(0); } @@ -194,28 +194,28 @@ ***************************************************************************/ -SCREEN_UPDATE( yunsung8 ) +SCREEN_UPDATE_IND16( yunsung8 ) { - yunsung8_state *state = screen->machine().driver_data(); + yunsung8_state *state = screen.machine().driver_data(); int layers_ctrl = (~state->m_layers_ctrl) >> 4; #ifdef MAME_DEBUG -if (screen->machine().input().code_pressed(KEYCODE_Z)) +if (screen.machine().input().code_pressed(KEYCODE_Z)) { int msk = 0; - if (screen->machine().input().code_pressed(KEYCODE_Q)) msk |= 1; - if (screen->machine().input().code_pressed(KEYCODE_W)) msk |= 2; + if (screen.machine().input().code_pressed(KEYCODE_Q)) msk |= 1; + if (screen.machine().input().code_pressed(KEYCODE_W)) msk |= 2; if (msk != 0) layers_ctrl &= msk; } #endif if (layers_ctrl & 1) - tilemap_draw(bitmap, cliprect, state->m_tilemap_0, 0, 0); + state->m_tilemap_0->draw(bitmap, cliprect, 0, 0); else - bitmap_fill(bitmap, cliprect, 0); + bitmap.fill(0, cliprect); if (layers_ctrl & 2) - tilemap_draw(bitmap, cliprect, state->m_tilemap_1, 0, 0); + state->m_tilemap_1->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/zac2650.c mame-0.145/src/mame/video/zac2650.c --- mame-0.144/src/mame/video/zac2650.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/mame/video/zac2650.c 2012-02-06 21:30:32.000000000 +0000 @@ -20,7 +20,7 @@ zac2650_state *state = space->machine().driver_data(); UINT8 *videoram = state->m_videoram; videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + state->m_bg_tilemap->mark_tile_dirty(offset); } READ8_HANDLER( zac_s2636_r ) @@ -67,7 +67,7 @@ /* Draw first sprite */ - drawgfx_opaque(state->m_spritebitmap,0, machine.gfx[expand], + drawgfx_opaque(state->m_spritebitmap,state->m_spritebitmap.cliprect(), machine.gfx[expand], first * 2, 0, 0,0, @@ -79,21 +79,14 @@ { for (y = fy; y < fy + machine.gfx[expand]->height; y++) { - if ((x < visarea.min_x) || - (x > visarea.max_x) || - (y < visarea.min_y) || - (y > visarea.max_y)) - { - continue; - } - - Checksum += *BITMAP_ADDR16(state->m_spritebitmap, y, x); + if (visarea.contains(x, y)) + Checksum += state->m_spritebitmap.pix16(y, x); } } /* Blackout second sprite */ - drawgfx_transpen(state->m_spritebitmap,0, machine.gfx[1], + drawgfx_transpen(state->m_spritebitmap,state->m_spritebitmap.cliprect(), machine.gfx[1], second * 2, 1, 0,0, @@ -105,21 +98,14 @@ { for (y = fy; y < fy + machine.gfx[expand]->height; y++) { - if ((x < visarea.min_x) || - (x > visarea.max_x) || - (y < visarea.min_y) || - (y > visarea.max_y)) - { - continue; - } - - Checksum -= *BITMAP_ADDR16(state->m_spritebitmap, y, x); + if (visarea.contains(x, y)) + Checksum -= state->m_spritebitmap.pix16(y, x); } } /* Zero bitmap */ - drawgfx_opaque(state->m_spritebitmap,0, machine.gfx[expand], + drawgfx_opaque(state->m_spritebitmap,state->m_spritebitmap.cliprect(), machine.gfx[expand], first * 2, 1, 0,0, @@ -144,14 +130,14 @@ state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 24, 24, 32, 32); - state->m_spritebitmap = machine.primary_screen->alloc_compatible_bitmap(); - machine.generic.tmpbitmap = machine.primary_screen->alloc_compatible_bitmap(); + machine.primary_screen->register_screen_bitmap(state->m_bitmap); + machine.primary_screen->register_screen_bitmap(state->m_spritebitmap); gfx_element_set_source(machine.gfx[1], state->m_s2636_0_ram); gfx_element_set_source(machine.gfx[2], state->m_s2636_0_ram); } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect) { zac2650_state *state = machine.driver_data(); int offs; @@ -171,7 +157,7 @@ state->m_CollisionBackground = 0; /* Read from 0x1e80 bit 7 */ // for collision detection checking - copybitmap(machine.generic.tmpbitmap,bitmap,0,0,0,0,&visarea); + copybitmap(state->m_bitmap,bitmap,0,0,0,0,visarea); for(offs=0;offs<0x50;offs+=0x10) { @@ -184,7 +170,7 @@ int x,y; /* Sprite->Background collision detection */ - drawgfx_transpen(bitmap,0, machine.gfx[expand], + drawgfx_transpen(bitmap,cliprect, machine.gfx[expand], spriteno, 1, 0,0, @@ -194,23 +180,16 @@ { for (y = by; y < by + machine.gfx[expand]->height; y++) { - if ((x < visarea.min_x) || - (x > visarea.max_x) || - (y < visarea.min_y) || - (y > visarea.max_y)) - { - continue; - } - - if (*BITMAP_ADDR16(bitmap, y, x) != *BITMAP_ADDR16(machine.generic.tmpbitmap, y, x)) - { - state->m_CollisionBackground = 0x80; - break; - } + if (visarea.contains(x, y)) + if (bitmap.pix16(y, x) != state->m_bitmap.pix16(y, x)) + { + state->m_CollisionBackground = 0x80; + break; + } } } - drawgfx_transpen(bitmap,0, machine.gfx[expand], + drawgfx_transpen(bitmap,cliprect, machine.gfx[expand], spriteno, 0, 0,0, @@ -228,10 +207,10 @@ // if(SpriteCollision(machine, 2,4)) state->m_CollisionSprite |= 0x01; /* Not Used */ } -SCREEN_UPDATE( tinvader ) +SCREEN_UPDATE_IND16( tinvader ) { - zac2650_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - draw_sprites(screen->machine(), bitmap); + zac2650_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_sprites(screen.machine(), bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/mame/video/zaccaria.c mame-0.145/src/mame/video/zaccaria.c --- mame-0.144/src/mame/video/zaccaria.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/zaccaria.c 2012-02-06 21:30:31.000000000 +0000 @@ -136,7 +136,7 @@ zaccaria_state *state = machine.driver_data(); state->m_bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); - tilemap_set_scroll_cols(state->m_bg_tilemap,32); + state->m_bg_tilemap->set_scroll_cols(32); } @@ -151,7 +151,7 @@ { zaccaria_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap,offset & 0x3ff); + state->m_bg_tilemap->mark_tile_dirty(offset & 0x3ff); } WRITE8_HANDLER( zaccaria_attributes_w ) @@ -164,11 +164,11 @@ int i; for (i = offset / 2;i < 0x400;i += 32) - tilemap_mark_tile_dirty(state->m_bg_tilemap,i); + state->m_bg_tilemap->mark_tile_dirty(i); } } else - tilemap_set_scrolly(state->m_bg_tilemap,offset / 2,data); + state->m_bg_tilemap->set_scrolly(offset / 2,data); state->m_attributesram[offset] = data; } @@ -206,7 +206,7 @@ offsets 1 and 2 are swapped if accessed from spriteram2 */ -static void draw_sprites(running_machine &machine, bitmap_t *bitmap,const rectangle *cliprect,UINT8 *spriteram,int color,int section) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap,const rectangle &cliprect,UINT8 *spriteram,int color,int section) { int offs,o1 = 1,o2 = 2; @@ -243,16 +243,16 @@ } } -SCREEN_UPDATE( zaccaria ) +SCREEN_UPDATE_IND16( zaccaria ) { - zaccaria_state *state = screen->machine().driver_data(); - tilemap_draw(bitmap,cliprect,state->m_bg_tilemap,0,0); + zaccaria_state *state = screen.machine().driver_data(); + state->m_bg_tilemap->draw(bitmap, cliprect, 0,0); // 3 layers of sprites, each with their own palette and priorities // Not perfect yet, does spriteram(1) layer have a priority bit somewhere? - draw_sprites(screen->machine(),bitmap,cliprect,state->m_spriteram2,2,1); - draw_sprites(screen->machine(),bitmap,cliprect,state->m_spriteram,1,0); - draw_sprites(screen->machine(),bitmap,cliprect,state->m_spriteram2+0x20,0,1); + draw_sprites(screen.machine(),bitmap,cliprect,state->m_spriteram2,2,1); + draw_sprites(screen.machine(),bitmap,cliprect,state->m_spriteram,1,0); + draw_sprites(screen.machine(),bitmap,cliprect,state->m_spriteram2+0x20,0,1); return 0; } diff -Nru mame-0.144/src/mame/video/zaxxon.c mame-0.145/src/mame/video/zaxxon.c --- mame-0.144/src/mame/video/zaxxon.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/zaxxon.c 2012-02-06 21:30:32.000000000 +0000 @@ -135,9 +135,9 @@ state->m_fg_tilemap = tilemap_create(machine, fg_tile_info, tilemap_scan_rows, 8,8, 32,32); /* configure the foreground tilemap */ - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scrolldx(state->m_fg_tilemap, 0, machine.primary_screen->width() - 256); - tilemap_set_scrolldy(state->m_fg_tilemap, 0, machine.primary_screen->height() - 256); + state->m_fg_tilemap->set_transparent_pen(0); + state->m_fg_tilemap->set_scrolldx(0, machine.primary_screen->width() - 256); + state->m_fg_tilemap->set_scrolldy(0, machine.primary_screen->height() - 256); /* register for save states */ state->save_item(NAME(state->m_bg_enable)); @@ -189,7 +189,7 @@ /* low bit controls flip; background and sprite flip are handled at render time */ flip_screen_set_no_update(space->machine(), ~data & 1); - tilemap_set_flip(state->m_fg_tilemap, flip_screen_get(space->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); + state->m_fg_tilemap->set_flip(flip_screen_get(space->machine()) ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0); } @@ -199,7 +199,7 @@ /* low bit selects high color palette index */ state->m_fg_color = (data & 1) * 0x80; - tilemap_set_palette_offset(state->m_fg_tilemap, state->m_fg_color + (state->m_congo_color_bank << 8)); + state->m_fg_tilemap->set_palette_offset(state->m_fg_color + (state->m_congo_color_bank << 8)); } @@ -239,7 +239,7 @@ /* low bit controls the topmost character bit */ state->m_congo_fg_bank = data & 1; - tilemap_mark_all_tiles_dirty(state->m_fg_tilemap); + state->m_fg_tilemap->mark_all_dirty(); } @@ -249,7 +249,7 @@ /* low bit controls the topmost bit into the color PROM */ state->m_congo_color_bank = data & 1; - tilemap_set_palette_offset(state->m_fg_tilemap, state->m_fg_color + (state->m_congo_color_bank << 8)); + state->m_fg_tilemap->set_palette_offset(state->m_fg_color + (state->m_congo_color_bank << 8)); } @@ -265,7 +265,7 @@ zaxxon_state *state = space->machine().driver_data(); state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -274,7 +274,7 @@ zaxxon_state *state = space->machine().driver_data(); state->m_colorram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + state->m_fg_tilemap->mark_tile_dirty(offset); } @@ -322,17 +322,17 @@ * *************************************/ -static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, int skew) +static void draw_background(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int skew) { zaxxon_state *state = machine.driver_data(); /* only draw if enabled */ if (state->m_bg_enable) { - bitmap_t *pixmap = tilemap_get_pixmap(state->m_bg_tilemap); + bitmap_ind16 &pixmap = state->m_bg_tilemap->pixmap(); int colorbase = state->m_bg_color + (state->m_congo_color_bank << 8); - int xmask = pixmap->width - 1; - int ymask = pixmap->height - 1; + int xmask = pixmap.width() - 1; + int ymask = pixmap.height() - 1; int flipmask = flip_screen_get(machine) ? 0xff : 0x00; int flipoffs = flip_screen_get(machine) ? 0x38 : 0x40; int x, y; @@ -345,9 +345,9 @@ flipoffs += 7; /* loop over visible rows */ - for (y = cliprect->min_y; y <= cliprect->max_y; y++) + for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *dst = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *dst = &bitmap.pix16(y); int srcx, srcy, vf; UINT16 *src; @@ -357,10 +357,10 @@ /* base of the source row comes from VF plus the scroll value */ /* this is done by the 3 4-bit adders at U56, U74, U75 */ srcy = vf + ((state->m_bg_position << 1) ^ 0xfff) + 1; - src = (UINT16 *)pixmap->base + (srcy & ymask) * pixmap->rowpixels; + src = &pixmap.pix16(srcy & ymask); - /* loop over visible colums */ - for (x = cliprect->min_x; x <= cliprect->max_x; x++) + /* loop over visible columns */ + for (x = cliprect.min_x; x <= cliprect.max_x; x++) { /* start with HF = flipped H signals */ srcx = x ^ flipmask; @@ -384,7 +384,7 @@ /* if not enabled, fill the background with black */ else - bitmap_fill(bitmap, cliprect, get_black_pen(machine)); + bitmap.fill(get_black_pen(machine), cliprect); } @@ -440,7 +440,7 @@ } -static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16 flipxmask, UINT16 flipymask) +static void draw_sprites(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, UINT16 flipxmask, UINT16 flipymask) { zaxxon_state *state = machine.driver_data(); UINT8 *spriteram = state->m_spriteram; @@ -475,45 +475,45 @@ * *************************************/ -SCREEN_UPDATE( zaxxon ) +SCREEN_UPDATE_IND16( zaxxon ) { - zaxxon_state *state = screen->machine().driver_data(); + zaxxon_state *state = screen.machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect, TRUE); - draw_sprites(screen->machine(), bitmap, cliprect, 0x140, 0x180); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_background(screen.machine(), bitmap, cliprect, TRUE); + draw_sprites(screen.machine(), bitmap, cliprect, 0x140, 0x180); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( futspy ) +SCREEN_UPDATE_IND16( futspy ) { - zaxxon_state *state = screen->machine().driver_data(); + zaxxon_state *state = screen.machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect, TRUE); - draw_sprites(screen->machine(), bitmap, cliprect, 0x180, 0x180); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_background(screen.machine(), bitmap, cliprect, TRUE); + draw_sprites(screen.machine(), bitmap, cliprect, 0x180, 0x180); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( razmataz ) +SCREEN_UPDATE_IND16( razmataz ) { - zaxxon_state *state = screen->machine().driver_data(); + zaxxon_state *state = screen.machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect, FALSE); - draw_sprites(screen->machine(), bitmap, cliprect, 0x140, 0x180); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_background(screen.machine(), bitmap, cliprect, FALSE); + draw_sprites(screen.machine(), bitmap, cliprect, 0x140, 0x180); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } -SCREEN_UPDATE( congo ) +SCREEN_UPDATE_IND16( congo ) { - zaxxon_state *state = screen->machine().driver_data(); + zaxxon_state *state = screen.machine().driver_data(); - draw_background(screen->machine(), bitmap, cliprect, TRUE); - draw_sprites(screen->machine(), bitmap, cliprect, 0x280, 0x180); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); + draw_background(screen.machine(), bitmap, cliprect, TRUE); + draw_sprites(screen.machine(), bitmap, cliprect, 0x280, 0x180); + state->m_fg_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/zerozone.c mame-0.145/src/mame/video/zerozone.c --- mame-0.144/src/mame/video/zerozone.c 2011-08-04 02:16:26.000000000 +0000 +++ mame-0.145/src/mame/video/zerozone.c 2012-02-06 21:30:32.000000000 +0000 @@ -7,49 +7,41 @@ #include "emu.h" #include "includes/zerozone.h" -WRITE16_HANDLER( zerozone_tilemap_w ) +WRITE16_MEMBER( zerozone_state::tilemap_w ) { - zerozone_state *state = space->machine().driver_data(); - - COMBINE_DATA(&state->m_videoram[offset]); - tilemap_mark_tile_dirty(state->m_zz_tilemap,offset); + COMBINE_DATA(&m_vram[offset]); + m_zz_tilemap->mark_tile_dirty(offset); } -WRITE16_HANDLER(zerozone_tilebank_w) +WRITE16_MEMBER( zerozone_state::tilebank_w ) { - zerozone_state *state = space->machine().driver_data(); - // popmessage ("Data %04x",data); - state->m_tilebank = data & 0x07; - tilemap_mark_all_tiles_dirty(state->m_zz_tilemap); + m_tilebank = data & 0x07; + m_zz_tilemap->mark_all_dirty(); } static TILE_GET_INFO( get_zerozone_tile_info ) { zerozone_state *state = machine.driver_data(); - int tileno = state->m_videoram[tile_index] & 0x07ff; - int colour = state->m_videoram[tile_index] & 0xf000; + int tileno = state->m_vram[tile_index] & 0x07ff; + int colour = state->m_vram[tile_index] & 0xf000; - if (state->m_videoram[tile_index] & 0x0800) + if (state->m_vram[tile_index] & 0x0800) tileno += state->m_tilebank * 0x800; SET_TILE_INFO(0, tileno, colour >> 12, 0); } -VIDEO_START( zerozone ) +void zerozone_state::video_start() { - zerozone_state *state = machine.driver_data(); - // i'm not 100% sure it should be opaque, pink title screen looks strange in las vegas girls // but if its transparent other things look incorrect - state->m_zz_tilemap = tilemap_create(machine, get_zerozone_tile_info, tilemap_scan_cols, 8, 8, 64, 32); + m_zz_tilemap = tilemap_create(machine(), get_zerozone_tile_info, tilemap_scan_cols, 8, 8, 64, 32); } -SCREEN_UPDATE( zerozone ) +UINT32 zerozone_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - zerozone_state *state = screen->machine().driver_data(); - - tilemap_draw(bitmap, cliprect, state->m_zz_tilemap, 0, 0); + m_zz_tilemap->draw(bitmap, cliprect, 0, 0); return 0; } diff -Nru mame-0.144/src/mame/video/zodiack.c mame-0.145/src/mame/video/zodiack.c --- mame-0.144/src/mame/video/zodiack.c 2011-08-04 02:16:25.000000000 +0000 +++ mame-0.145/src/mame/video/zodiack.c 2012-02-06 21:30:33.000000000 +0000 @@ -9,46 +9,40 @@ #include "emu.h" #include "includes/zodiack.h" -WRITE8_HANDLER( zodiack_videoram_w ) +WRITE8_MEMBER( zodiack_state::videoram_w ) { - zodiack_state *state = space->machine().driver_data(); - - state->m_videoram[offset] = data; - tilemap_mark_tile_dirty(state->m_fg_tilemap, offset); + m_videoram[offset] = data; + m_fg_tilemap->mark_tile_dirty(offset); } -WRITE8_HANDLER( zodiack_videoram2_w ) +WRITE8_MEMBER( zodiack_state::videoram2_w ) { - zodiack_state *state = space->machine().driver_data(); - - state->m_videoram_2[offset] = data; - tilemap_mark_tile_dirty(state->m_bg_tilemap, offset); + m_videoram_2[offset] = data; + m_bg_tilemap->mark_tile_dirty(offset); } -WRITE8_HANDLER( zodiack_attributes_w ) +WRITE8_MEMBER( zodiack_state::attributes_w ) { - zodiack_state *state = space->machine().driver_data(); - - if ((offset & 1) && state->m_attributeram[offset] != data) + if ((offset & 1) && m_attributeram[offset] != data) { int i; - for (i = offset / 2; i < state->m_videoram_size; i += 32) + for (i = offset / 2; i < m_videoram_size; i += 32) { - tilemap_mark_tile_dirty(state->m_bg_tilemap, i); - tilemap_mark_tile_dirty(state->m_fg_tilemap, i); + m_bg_tilemap->mark_tile_dirty(i); + m_fg_tilemap->mark_tile_dirty(i); } } - state->m_attributeram[offset] = data; + m_attributeram[offset] = data; } -WRITE8_HANDLER( zodiack_flipscreen_w ) +WRITE8_MEMBER( zodiack_state::flipscreen_w ) { - if (flip_screen_get(space->machine()) != (~data & 0x01)) + if (flip_screen_get(machine()) != (~data & 0x01)) { - flip_screen_set(space->machine(), ~data & 0x01); - tilemap_mark_all_tiles_dirty_all(space->machine()); + flip_screen_set(machine(), ~data & 0x01); + machine().tilemap().mark_all_dirty(); } } @@ -124,88 +118,77 @@ SET_TILE_INFO(3, code, color, 0); } -VIDEO_START( zodiack ) +void zodiack_state::video_start() { - zodiack_state *state = machine.driver_data(); - - state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + m_bg_tilemap = tilemap_create(machine(), get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + m_fg_tilemap = tilemap_create(machine(), get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); - tilemap_set_transparent_pen(state->m_fg_tilemap, 0); - tilemap_set_scroll_cols(state->m_fg_tilemap, 32); + m_fg_tilemap->set_transparent_pen(0); + m_fg_tilemap->set_scroll_cols(32); /* FIXME: flip_screen_x should not be written. */ - flip_screen_set_no_update(machine, 0); + flip_screen_set_no_update(machine(), 0); } -static void draw_bullets( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +void zodiack_state::draw_bullets( bitmap_ind16 &bitmap, const rectangle &cliprect ) { - zodiack_state *state = machine.driver_data(); - int offs; - - for (offs = 0; offs < state->m_bulletsram_size; offs += 4) + for (int offs = 0; offs < m_bulletsram_size; offs += 4) { int x, y; - x = state->m_bulletsram[offs + 3] + 7; - y = 255 - state->m_bulletsram[offs + 1]; + x = m_bulletsram[offs + 3] + 7; + y = 255 - m_bulletsram[offs + 1]; - if (flip_screen_get(machine) && state->m_percuss_hardware) + if (flip_screen_get(machine()) && m_percuss_hardware) { y = 255 - y; } drawgfx_transpen( bitmap, - cliprect,machine.gfx[2], + cliprect, machine().gfx[2], 0, /* this is just a dot, generated by the hardware */ 0, - 0,0, - x,y,0); + 0, 0, + x, y, 0); } } -static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect ) +void zodiack_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { - zodiack_state *state = machine.driver_data(); - int offs; - - for (offs = state->m_spriteram_size - 4; offs >= 0; offs -= 4) + for (int offs = m_spriteram_size - 4; offs >= 0; offs -= 4) { int flipx, flipy, sx, sy, spritecode; - sx = 240 - state->m_spriteram[offs + 3]; - sy = 240 - state->m_spriteram[offs]; - flipx = !(state->m_spriteram[offs + 1] & 0x40); - flipy = state->m_spriteram[offs + 1] & 0x80; - spritecode = state->m_spriteram[offs + 1] & 0x3f; + sx = 240 - m_spriteram[offs + 3]; + sy = 240 - m_spriteram[offs]; + flipx = !(m_spriteram[offs + 1] & 0x40); + flipy = m_spriteram[offs + 1] & 0x80; + spritecode = m_spriteram[offs + 1] & 0x3f; - if (flip_screen_get(machine) && state->m_percuss_hardware) + if (flip_screen_get(machine()) && m_percuss_hardware) { sy = 240 - sy; flipy = !flipy; } - drawgfx_transpen(bitmap,cliprect,machine.gfx[1], + drawgfx_transpen(bitmap,cliprect,machine().gfx[1], spritecode, - state->m_spriteram[offs + 2] & 0x07, + m_spriteram[offs + 2] & 0x07, flipx, flipy, sx, sy, 0); } } -SCREEN_UPDATE( zodiack ) +UINT32 zodiack_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { - zodiack_state *state = screen->machine().driver_data(); - int i; - - for (i = 0; i < 32; i++) - tilemap_set_scrolly(state->m_fg_tilemap, i, state->m_attributeram[i * 2]); + for (int i = 0; i < 32; i++) + m_fg_tilemap->set_scrolly(i, m_attributeram[i * 2]); - tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0); - tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0); - draw_bullets(screen->machine(), bitmap, cliprect); - draw_sprites(screen->machine(), bitmap, cliprect); + m_bg_tilemap->draw(bitmap, cliprect, 0, 0); + m_fg_tilemap->draw(bitmap, cliprect, 0, 0); + draw_bullets(bitmap, cliprect); + draw_sprites(bitmap, cliprect); return 0; } diff -Nru mame-0.144/src/osd/osdepend.c mame-0.145/src/osd/osdepend.c --- mame-0.144/src/osd/osdepend.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/osdepend.c 2012-02-06 21:30:30.000000000 +0000 @@ -227,9 +227,9 @@ // pixel of a black & white font //------------------------------------------------- -bitmap_t *osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs) +bool osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) { - return NULL; + return false; } //------------------------------------------------- diff -Nru mame-0.144/src/osd/osdepend.h mame-0.145/src/osd/osdepend.h --- mame-0.144/src/osd/osdepend.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/osdepend.h 2012-02-06 21:30:30.000000000 +0000 @@ -89,7 +89,7 @@ // font overridables virtual osd_font font_open(const char *name, int &height); virtual void font_close(osd_font font); - virtual bitmap_t *font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs); + virtual bool font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs); // video overridables virtual void *get_slider_list(); diff -Nru mame-0.144/src/osd/osdnet.c mame-0.145/src/osd/osdnet.c --- mame-0.144/src/osd/osdnet.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/osdnet.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,26 +1,29 @@ #include "emu.h" #include "osdnet.h" -typedef struct netdev_entry -{ - int id; - char name[256]; - create_netdev func; - struct netdev_entry *m_next; -} netdev_entry_t; - static class simple_list netdev_list; -void add_netdev(const char *name, create_netdev func) +void add_netdev(const char *name, const char *description, create_netdev func) { - netdev_entry_t *entry = new netdev_entry_t; + netdev_entry_t *entry = global_alloc_clear(netdev_entry_t); entry->id = netdev_list.count(); strncpy(entry->name, name, 255); entry->name[255] = '\0'; + strncpy(entry->description, description, 255); + entry->description[255] = '\0'; entry->func = func; netdev_list.append(*entry); } +void clear_netdev() +{ + netdev_list.reset(); +} + +const netdev_entry_t *netdev_first() { + return netdev_list.first(); +} + class netdev *open_netdev(int id, class device_network_interface *ifdev, int rate) { netdev_entry_t *entry = netdev_list.first(); @@ -92,3 +95,7 @@ return "\0\0\0\0\0\0"; } +int netdev_count() +{ + return netdev_list.count(); +} diff -Nru mame-0.144/src/osd/osdnet.h mame-0.145/src/osd/osdnet.h --- mame-0.144/src/osd/osdnet.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/osdnet.h 2012-02-06 21:30:30.000000000 +0000 @@ -3,6 +3,20 @@ #ifndef __OSDNET_H__ #define __OSDNET_H__ +class netdev; + +#define CREATE_NETDEV(name) class netdev *name(const char *ifname, class device_network_interface *ifdev, int rate) +typedef class netdev *(*create_netdev)(const char *ifname, class device_network_interface *ifdev, int rate); + +typedef struct netdev_entry +{ + int id; + char name[256]; + char description[256]; + create_netdev func; + struct netdev_entry *m_next; +} netdev_entry_t; + class netdev { public: @@ -25,9 +39,9 @@ class device_network_interface *m_dev; }; -#define CREATE_NETDEV(name) class netdev *name(const char *ifname, class device_network_interface *ifdev, int rate) -typedef class netdev *(*create_netdev)(const char *ifname, class device_network_interface *ifdev, int rate); - class netdev *open_netdev(int id, class device_network_interface *ifdev, int rate); -void add_netdev(const char *name, create_netdev func); +void add_netdev(const char *name, const char *description, create_netdev func); +void clear_netdev(); +const netdev_entry_t *netdev_first(); +int netdev_count(); #endif diff -Nru mame-0.144/src/osd/sdl/draw13.c mame-0.145/src/osd/sdl/draw13.c --- mame-0.144/src/osd/sdl/draw13.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/draw13.c 2012-02-06 21:30:30.000000000 +0000 @@ -923,9 +923,6 @@ case TEXFORMAT_PALETTE16: texture->format = SDL_TEXFORMAT_PALETTE16; break; - case TEXFORMAT_RGB15: - texture->format = texsource->palette ? SDL_TEXFORMAT_RGB15_PALETTED : SDL_TEXFORMAT_RGB15; - break; case TEXFORMAT_PALETTEA16: texture->format = SDL_TEXFORMAT_PALETTE16A; break; diff -Nru mame-0.144/src/osd/sdl/drawogl.c mame-0.145/src/osd/sdl/drawogl.c --- mame-0.144/src/osd/sdl/drawogl.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/drawogl.c 2012-02-06 21:30:30.000000000 +0000 @@ -247,7 +247,7 @@ GLhandleARB glsl_program[2*GLSL_SHADER_MAX]; // GLSL programs, or 0 int glsl_program_num; // number of GLSL programs int glsl_program_mb2sc; // GLSL program idx, which transforms - // the mame-bitmap -> screen-bitmap (size/rotation/..) + // the mame-bitmap. screen-bitmap (size/rotation/..) // All progs <= glsl_program_mb2sc using the mame bitmap // as input, otherwise the screen bitmap. // All progs >= glsl_program_mb2sc using the screen bitmap @@ -1206,7 +1206,8 @@ // figure out if we're vector scrnum = is_vector = 0; - for (screen = window->machine().config().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(window->machine().root_device()); + for (screen = iter.first(); screen != NULL; screen = iter.next()) { if (scrnum == window->index) { @@ -2018,8 +2019,8 @@ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); pfn_glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, text_name, 0); @@ -2304,8 +2305,8 @@ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); assert ( texture->lut_texture ); } @@ -2369,8 +2370,8 @@ } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } } else { UINT32 * dummy = NULL; @@ -2400,8 +2401,8 @@ } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } } @@ -2439,7 +2440,7 @@ // // src/emu/validity.c:validate_display() states, // an emulated driver can only produce - // BITMAP_FORMAT_INDEXED16, BITMAP_FORMAT_RGB15 and BITMAP_FORMAT_RGB32 + // BITMAP_FORMAT_IND16 and BITMAP_FORMAT_RGB32 // where only the first original paletted. // // other paletted formats, i.e.: @@ -2463,12 +2464,6 @@ case TEXFORMAT_PALETTE16: texture->format = SDL_TEXFORMAT_PALETTE16; break; - case TEXFORMAT_RGB15: - if (texsource->palette != NULL) - texture->format = SDL_TEXFORMAT_RGB15_PALETTED; - else - texture->format = SDL_TEXFORMAT_RGB15; - break; case TEXFORMAT_PALETTEA16: texture->format = SDL_TEXFORMAT_PALETTE16A; break; @@ -2534,8 +2529,8 @@ if( texture->texTarget==GL_TEXTURE_RECTANGLE_ARB ) { // texture rectangles can't wrap - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } else { // set wrapping mode appropriately if (texture->flags & PRIMFLAG_TEXWRAP_MASK) @@ -2545,8 +2540,8 @@ } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } } } @@ -2956,7 +2951,8 @@ scrnum = 0; container = (render_container *)NULL; - for (screen_device *screen = window->machine().first_screen(); screen != NULL; screen = screen->next_screen()) + screen_device_iterator iter(window->machine().root_device()); + for (screen_device *screen = iter.first(); screen != NULL; screen = iter.next()) { if (scrnum == window->start_viewscreen) { diff -Nru mame-0.144/src/osd/sdl/gl_shader_tool.c mame-0.145/src/osd/sdl/gl_shader_tool.c --- mame-0.144/src/osd/sdl/gl_shader_tool.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/gl_shader_tool.c 2012-02-06 21:30:30.000000000 +0000 @@ -134,13 +134,13 @@ int gl_shader_check_error(GLhandleARB obj, GLenum obj_query, GLSLCheckMode m, const char *file, const int line) { - GLsizei length; - GLcharARB buffer[255]; - GLenum glerr; - GLint param; - int res=0; + GLsizei length; + GLcharARB buffer[255]; + GLenum glerr; + GLint param; + int res=0; - glerr = gl_check_error(m, file, line); + glerr = gl_check_error(m, file, line); if(!obj) return glerr; @@ -164,57 +164,57 @@ if( param!=GL_PROGRAM_OBJECT_ARB && param!=GL_SHADER_OBJECT_ARB ) { if ( CHECK_VERBOSE <= m ) - mame_printf_warning("%s:%d: GL Error: object type 0x%X generation failed\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Error: object type 0x%X generation failed\n", file, line, (unsigned int)(FPTR)obj); res=-1; } else if ( CHECK_ALWAYS_VERBOSE <= m ) { if(param==GL_PROGRAM_OBJECT_ARB) - mame_printf_warning("%s:%d: GL Error: object type 0x%X is PROGRAM, successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Error: object type 0x%X is PROGRAM, successful\n", file, line, (unsigned int)(FPTR)obj); else - mame_printf_warning("%s:%d: GL Info: object type 0x%X is SHADER, successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object type 0x%X is SHADER, successful\n", file, line, (unsigned int)(FPTR)obj); } break; case GL_OBJECT_DELETE_STATUS_ARB: if(param!=1) { if ( CHECK_ALWAYS_VERBOSE <= m ) - mame_printf_warning("%s:%d: GL Info: object 0x%X not yet marked for deletion\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object 0x%X not yet marked for deletion\n", file, line, (unsigned int)(FPTR)obj); } else if ( CHECK_ALWAYS_VERBOSE <= m ) { - mame_printf_warning("%s:%d: GL Info: object 0x%X deletion successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object 0x%X deletion successful\n", file, line, (unsigned int)(FPTR)obj); } break; case GL_OBJECT_COMPILE_STATUS_ARB: if(param!=1) { if ( CHECK_VERBOSE <= m ) - mame_printf_warning("%s:%d: GL Error: object 0x%X compilation failed\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Error: object 0x%X compilation failed\n", file, line, (unsigned int)(FPTR)obj); res=-1; } else if ( CHECK_ALWAYS_VERBOSE <= m ) { - mame_printf_warning("%s:%d: GL Info: object 0x%X compiled successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object 0x%X compiled successful\n", file, line, (unsigned int)(FPTR)obj); } break; case GL_OBJECT_LINK_STATUS_ARB: if(param!=1) { if ( CHECK_VERBOSE <= m ) - mame_printf_warning("%s:%d: GL Error: object 0x%X linking failed\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Error: object 0x%X linking failed\n", file, line, (unsigned int)(FPTR)obj); res=-1; } else if ( CHECK_ALWAYS_VERBOSE <= m ) { - mame_printf_warning("%s:%d: GL Info: object 0x%X linked successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object 0x%X linked successful\n", file, line, (unsigned int)(FPTR)obj); } break; case GL_OBJECT_VALIDATE_STATUS_ARB: if(param!=1) { if ( CHECK_VERBOSE <= m ) - mame_printf_warning("%s:%d: GL Error: object 0x%X validation failed\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Error: object 0x%X validation failed\n", file, line, (unsigned int)(FPTR)obj); res=-1; } else if ( CHECK_ALWAYS_VERBOSE <= m ) { - mame_printf_warning("%s:%d: GL Info: object 0x%X validation successful\n", file, line, (unsigned int)obj); + mame_printf_warning("%s:%d: GL Info: object 0x%X validation successful\n", file, line, (unsigned int)(FPTR)obj); } break; } diff -Nru mame-0.144/src/osd/sdl/netdev.c mame-0.145/src/osd/sdl/netdev.c --- mame-0.144/src/osd/sdl/netdev.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,7 +1,23 @@ #include "emu.h" #include "netdev_tap.h" +#include "netdev_pcap.h" void sdlnetdev_init(running_machine &machine) { + #ifdef SDLMAME_NET_TAPTUN init_tap(); + #endif + #ifdef SDLMAME_NET_PCAP + init_pcap(); + #endif +} + +void sdlnetdev_deinit(running_machine &machine) +{ + #ifdef SDLMAME_NET_TAPTUN + deinit_tap(); + #endif + #ifdef SDLMAME_NET_PCAP + deinit_pcap(); + #endif } diff -Nru mame-0.144/src/osd/sdl/netdev.h mame-0.145/src/osd/sdl/netdev.h --- mame-0.144/src/osd/sdl/netdev.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev.h 2012-02-06 21:30:30.000000000 +0000 @@ -1,6 +1,7 @@ -#ifndef __NETDEV_H -#define __NETDEV_H +#ifndef __NETDEV_H__ +#define __NETDEV_H__ void sdlnetdev_init(running_machine &machine); +void sdlnetdev_deinit(running_machine &machine); #endif diff -Nru mame-0.144/src/osd/sdl/netdev_pcap.c mame-0.145/src/osd/sdl/netdev_pcap.c --- mame-0.144/src/osd/sdl/netdev_pcap.c 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev_pcap.c 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,102 @@ +#ifdef SDLMAME_WIN32 +#include "../windows/netdev_pcap.c" +#else + +#include +#include "emu.h" +#include "osdnet.h" + +class netdev_pcap : public netdev +{ +public: + netdev_pcap(const char *name, class device_network_interface *ifdev, int rate); + ~netdev_pcap(); + + int send(UINT8 *buf, int len); + void set_mac(const char *mac); +protected: + int recv_dev(UINT8 **buf); +private: + pcap_t *m_p; +}; + +netdev_pcap::netdev_pcap(const char *name, class device_network_interface *ifdev, int rate) + : netdev(ifdev, rate) +{ + char errbuf[PCAP_ERRBUF_SIZE]; + m_p = pcap_open_live(name, 65535, 1, 1, errbuf); + if(!m_p) + { + mame_printf_verbose("Unable to open %s: %s\n", name, errbuf); + return; + } + if(pcap_set_datalink(m_p, DLT_EN10MB) == -1) + { + mame_printf_verbose("Unable to set %s to ethernet", name); + pcap_close(m_p); + m_p = NULL; + return; + } + set_mac(get_mac()); +} + +void netdev_pcap::set_mac(const char *mac) +{ + char filter[256]; + struct bpf_program fp; + if(!m_p) return; + sprintf(filter, "ether dst %.2X:%.2X:%.2X:%.2X:%.2X:%.2X or ether multicast or ether broadcast", (unsigned char)mac[0], (unsigned char)mac[1], (unsigned char)mac[2],(unsigned char)mac[3], (unsigned char)mac[4], (unsigned char)mac[5]); + pcap_compile(m_p, &fp, filter, 1, 0); + pcap_setfilter(m_p, &fp); +} + +int netdev_pcap::send(UINT8 *buf, int len) +{ + if(!m_p) return 0; + return (!pcap_sendpacket(m_p, buf, len))?len:0; +} + +int netdev_pcap::recv_dev(UINT8 **buf) +{ + struct pcap_pkthdr *header; + if(!m_p) return 0; + return (pcap_next_ex(m_p, &header, (const u_char **)buf) == 1)?header->len:0; +} + +netdev_pcap::~netdev_pcap() +{ + if(m_p) pcap_close(m_p); +} + +static CREATE_NETDEV(create_pcap) +{ + class netdev_pcap *dev = global_alloc(netdev_pcap(ifname, ifdev, rate)); + return dynamic_cast(dev); +} + +void init_pcap() +{ + pcap_if_t *devs; + char errbuf[PCAP_ERRBUF_SIZE]; + if(pcap_findalldevs(&devs, errbuf) == -1) + { + mame_printf_verbose("Unable to get network devices: %s\n", errbuf); + return; + } + + if (devs) + { + while(devs->next) + { + add_netdev(devs->name, devs->description, create_pcap); + devs = devs->next; + } + } +} + +void deinit_pcap() +{ + clear_netdev(); +} + +#endif // SDLMAME_WIN32 diff -Nru mame-0.144/src/osd/sdl/netdev_pcap.h mame-0.145/src/osd/sdl/netdev_pcap.h --- mame-0.144/src/osd/sdl/netdev_pcap.h 1970-01-01 00:00:00.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev_pcap.h 2012-02-06 21:30:30.000000000 +0000 @@ -0,0 +1,7 @@ +#ifndef __NETDEV_PCAP_H__ +#define __NETDEV_PCAP_H__ + +void init_pcap(); +void deinit_pcap(); + +#endif diff -Nru mame-0.144/src/osd/sdl/netdev_tap.c mame-0.145/src/osd/sdl/netdev_tap.c --- mame-0.144/src/osd/sdl/netdev_tap.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev_tap.c 2012-02-06 21:30:30.000000000 +0000 @@ -38,7 +38,7 @@ m_fd = -1; if((m_fd = open("/dev/net/tun", O_RDWR)) == -1) { - logerror("tap: open failed %d\n", errno); + mame_printf_verbose("tap: open failed %d\n", errno); return; } @@ -46,11 +46,12 @@ ifr.ifr_flags = IFF_TAP | IFF_NO_PI; sprintf(ifr.ifr_name, "tap-mess-%d-0", getuid()); if(ioctl(m_fd, TUNSETIFF, (void *)&ifr) == -1) { - logerror("tap: ioctl failed %d\n", errno); + mame_printf_verbose("tap: ioctl failed %d\n", errno); close(m_fd); m_fd = -1; return; } + mame_printf_verbose("netdev_tap: network up!\n"); strncpy(m_ifname, ifr.ifr_name, 10); fcntl(m_fd, F_SETFL, O_NONBLOCK); @@ -87,11 +88,16 @@ static CREATE_NETDEV(create_tap) { - class netdev_tap *dev = new netdev_tap(ifname, ifdev, rate); + class netdev_tap *dev = global_alloc(netdev_tap(ifname, ifdev, rate)); return dynamic_cast(dev); } void init_tap() { - add_netdev("tap", create_tap); + add_netdev("tap", "TAP/TUN Device", create_tap); +} + +void deinit_tap() +{ + clear_netdev(); } diff -Nru mame-0.144/src/osd/sdl/netdev_tap.h mame-0.145/src/osd/sdl/netdev_tap.h --- mame-0.144/src/osd/sdl/netdev_tap.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/netdev_tap.h 2012-02-06 21:30:30.000000000 +0000 @@ -1,6 +1,6 @@ -#ifndef __NETDEV_H -#define __NETDEV_H +#ifndef __NETDEV_TAP_H__ +#define __NETDEV_TAP_H__ void init_tap(); - +void deinit_tap(); #endif diff -Nru mame-0.144/src/osd/sdl/osdsdl.h mame-0.145/src/osd/sdl/osdsdl.h --- mame-0.144/src/osd/sdl/osdsdl.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/osdsdl.h 2012-02-06 21:30:30.000000000 +0000 @@ -257,7 +257,7 @@ // font overridables virtual osd_font font_open(const char *name, int &height); virtual void font_close(osd_font font); - virtual bitmap_t *font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs); + virtual bool font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs); private: static void osd_exit(running_machine &machine); diff -Nru mame-0.144/src/osd/sdl/sdlmain.c mame-0.145/src/osd/sdl/sdlmain.c --- mame-0.144/src/osd/sdl/sdlmain.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/sdlmain.c 2012-02-06 21:30:30.000000000 +0000 @@ -2,7 +2,7 @@ // // sdlmain.c - main file for SDLMAME. // -// Copyright (c) 1996-2011, Nicola Salmoria and the MAME Team. +// Copyright (c) 1996-2012, Nicola Salmoria and the MAME Team. // Visit http://mamedev.org for licensing and usage restrictions. // // SDLMAME by Olivier Galibert and R. Belmont @@ -24,9 +24,10 @@ #endif // standard includes -#ifdef MESS +#if !defined(SDLMAME_WIN32) && !defined(SDLMAME_OS2) #include #endif + #ifdef SDLMAME_OS2 #define INCL_DOS #include @@ -64,11 +65,7 @@ #if defined(SDLMAME_WIN32) || defined(SDLMAME_MACOSX) || defined(SDLMAME_OS2) #define INI_PATH ".;ini" #else -#ifdef MESS - #define INI_PATH "$HOME/.mess;.;ini" -#else - #define INI_PATH "$HOME/.mame;.;ini" -#endif // MESS + #define INI_PATH "$HOME/.APP_NAME;.;ini" #endif // MACOSX #endif // INI_PATH @@ -196,13 +193,11 @@ { NULL, NULL, OPTION_HEADER, "SDL KEYBOARD MAPPING" }, { SDLOPTION_KEYMAP, "0", OPTION_BOOLEAN, "enable keymap" }, { SDLOPTION_KEYMAP_FILE, "keymap.dat", OPTION_STRING, "keymap filename" }, -#ifdef MESS #ifdef SDLMAME_MACOSX - { SDLOPTION_UIMODEKEY, "DELETE", OPTION_STRING, "Key to toggle MESS keyboard mode" }, + { SDLOPTION_UIMODEKEY, "DELETE", OPTION_STRING, "Key to toggle keyboard mode" }, #else - { SDLOPTION_UIMODEKEY, "SCRLOCK", OPTION_STRING, "Key to toggle MESS keyboard mode" }, + { SDLOPTION_UIMODEKEY, "SCRLOCK", OPTION_STRING, "Key to toggle keyboard mode" }, #endif // SDLMAME_MACOSX -#endif // MESS // joystick mapping { NULL, NULL, OPTION_HEADER, "SDL JOYSTICK MAPPING" }, @@ -275,7 +270,10 @@ sdl_options::sdl_options() { + astring ini_path(INI_PATH); add_entries(s_option_entries); + ini_path.replace(0, "APP_NAME", emulator_info::get_appname_lower()); + set_default_value(SDLOPTION_INIPATH, ini_path.cstr()); } @@ -413,6 +411,9 @@ void sdl_osd_interface::osd_exit(running_machine &machine) { + #ifdef SDLMAME_NETWORK + sdlnetdev_deinit(machine); + #endif if (!SDLMAME_INIT_IN_WORKER_THREAD) SDL_Quit(); @@ -705,7 +706,7 @@ /* handle bdf fonts in the core */ if (name.len() > 4) - if (name.toupper().substr(name.len()-4,4) == ".BDF" ) + if (name.makeupper().substr(name.len()-4,4) == ".BDF" ) return NULL; font_name = CFStringCreateWithCString( NULL, _name, kCFStringEncodingUTF8 ); @@ -768,11 +769,10 @@ // pixel of a black & white font //------------------------------------------------- -bitmap_t *sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs) +bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) { UniChar uni_char; CGGlyph glyph; - bitmap_t *bitmap = (bitmap_t *)NULL; CTFontRef ct_font = (CTFontRef)font; const CFIndex count = 1; CGRect bounding_rect, success_rect; @@ -813,9 +813,9 @@ color_space = CGColorSpaceCreateDeviceRGB(); bits_per_component = 8; - bitmap = auto_alloc(machine(), bitmap_t(bitmap_width, bitmap_height, BITMAP_FORMAT_ARGB32)); + bitmap.allocate(bitmap_width, bitmap_height); - context_ref = CGBitmapContextCreate( bitmap->base, bitmap_width, bitmap_height, bits_per_component, bitmap->rowpixels*4, color_space, bitmap_info ); + context_ref = CGBitmapContextCreate( bitmap.raw_pixptr(0), bitmap_width, bitmap_height, bits_per_component, bitmap.rowpixels()*4, color_space, bitmap_info ); if( context_ref != NULL ) { @@ -833,7 +833,7 @@ CGColorSpaceRelease( color_space ); } - return bitmap; + return bitmap.valid(); } #else // UNIX but not OSX @@ -851,6 +851,22 @@ return TTF_OpenFont(name.cstr(), POINT_SIZE); } +static bool BDF_Check_Magic(astring name) +{ + emu_file file(OPEN_FLAG_READ); + if (file.open(name) == FILERR_NONE) + { + unsigned char buffer[9]; + unsigned char magic[9] = { 'S', 'T', 'A', 'R', 'T', 'F', 'O', 'N', 'T' }; + file.read(buffer, 9); + file.close(); + if (!memcmp(buffer, magic, 9)) + return true; + } + + return false; +} + static TTF_Font *search_font_config(astring name, bool bold, bool italic, bool underline, bool &bakedstyles) { TTF_Font *font = (TTF_Font *)NULL; @@ -1009,7 +1025,10 @@ if (!font) { - printf("WARNING: Couldn't find/open TrueType font %s, using MAME default\n", name.cstr()); + if (!BDF_Check_Magic(name)) + { + printf("WARNING: font %s, is not TrueType or BDF, using MAME default\n", name.cstr()); + } return NULL; } @@ -1056,10 +1075,9 @@ // pixel of a black & white font //------------------------------------------------- -bitmap_t *sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs) +bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) { TTF_Font *ttffont; - bitmap_t *bitmap = (bitmap_t *)NULL; SDL_Surface *drawsurf; SDL_Color fcol = { 0xff, 0xff, 0xff }; UINT16 ustr[16]; @@ -1074,12 +1092,12 @@ if (drawsurf) { // allocate a MAME destination bitmap - bitmap = auto_alloc(machine(), bitmap_t(drawsurf->w, drawsurf->h, BITMAP_FORMAT_ARGB32)); + bitmap.allocate(drawsurf->w, drawsurf->h); // copy the rendered character image into it - for (int y = 0; y < bitmap->height; y++) + for (int y = 0; y < bitmap.height(); y++) { - UINT32 *dstrow = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dstrow = &bitmap.pix32(y); UINT8 *srcrow = (UINT8 *)drawsurf->pixels; srcrow += (y * drawsurf->pitch); @@ -1097,7 +1115,7 @@ SDL_FreeSurface(drawsurf); } - return bitmap; + return bitmap.valid(); } #endif // not OSX #else // not UNIX @@ -1128,8 +1146,8 @@ // pixel of a black & white font //------------------------------------------------- -bitmap_t *sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs) +bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) { - return (bitmap_t *)NULL; + return false; } #endif diff -Nru mame-0.144/src/osd/sdl/sdl.mak mame-0.145/src/osd/sdl/sdl.mak --- mame-0.144/src/osd/sdl/sdl.mak 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/sdl/sdl.mak 2012-02-06 21:30:30.000000000 +0000 @@ -134,7 +134,7 @@ ifeq ($(TARGETOS),linux) BASE_TARGETOS = unix SYNC_IMPLEMENTATION = tc -SDL_NETWORK = on +SDL_NETWORK = taptun endif ifeq ($(TARGETOS),freebsd) @@ -175,6 +175,7 @@ SYNC_IMPLEMENTATION = ntc SDLMAIN = $(SDLOBJ)/SDLMain_tmpl.o SDLUTILMAIN = $(SDLOBJ)/SDLMain_tmpl.o +SDL_NETWORK = pcap MAINLDFLAGS = -Xlinker -all_load NO_X11 = 1 ifdef BIGENDIAN @@ -209,6 +210,7 @@ SDLMAIN = $(SDLOBJ)/main.o # needed for unidasm LDFLAGS += -Wl,--allow-multiple-definition +SDL_NETWORK = pcap # do we have GTK ? ifndef GTK_INSTALL_ROOT @@ -396,6 +398,11 @@ # Static linking LDFLAGS += -static-libgcc +TEST_GCC = $(shell gcc --version) +ifeq ($(findstring 4.4,$(TEST_GCC)),) + #if we use new tools + LDFLAGS += -static-libstdc++ +endif LIBS += -lSDL.dll LIBS += -luser32 -lgdi32 -lddraw -ldsound -ldxguid -lwinmm -ladvapi32 -lcomctl32 -lshlwapi @@ -502,12 +509,23 @@ #------------------------------------------------- ifdef USE_NETWORK -ifeq ($(SDL_NETWORK),on) +ifeq ($(SDL_NETWORK),taptun) OSDOBJS += \ $(SDLOBJ)/netdev.o \ $(SDLOBJ)/netdev_tap.o -DEFS += -DSDLMAME_NETWORK +DEFS += -DSDLMAME_NETWORK -DSDLMAME_NET_TAPTUN +endif + +ifeq ($(SDL_NETWORK),pcap) +OSDOBJS += \ + $(SDLOBJ)/netdev.o \ + $(SDLOBJ)/netdev_pcap.o + +DEFS += -DSDLMAME_NETWORK -DSDLMAME_NET_PCAP +ifneq ($(TARGETOS),win32) +LIBS += -lpcap +endif endif endif diff -Nru mame-0.144/src/osd/sdl/sdlsocket.c mame-0.145/src/osd/sdl/sdlsocket.c --- mame-0.144/src/osd/sdl/sdlsocket.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/sdlsocket.c 2012-02-06 21:30:30.000000000 +0000 @@ -23,6 +23,7 @@ #endif #include +#define NO_MEM_TRACKING #include "emu.h" #include "sdlfile.h" diff -Nru mame-0.144/src/osd/sdl/sdlsync_os2.c mame-0.145/src/osd/sdl/sdlsync_os2.c --- mame-0.144/src/osd/sdl/sdlsync_os2.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/sdlsync_os2.c 2012-02-06 21:30:30.000000000 +0000 @@ -391,7 +391,9 @@ { ULONG ulCount; - DosResetEventSem(event->hev, &ulCount); + if(rc == 0) + DosResetEventSem(event->hev, &ulCount); + DosReleaseMutexSem(event->hmtx); } diff -Nru mame-0.144/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh mame-0.145/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh --- mame-0.144/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh 2012-02-06 21:30:30.000000000 +0000 @@ -25,7 +25,7 @@ color_map_coord.y = floor(color_map_coord.x/colortable_sz.x); color_map_coord.x = mod(color_map_coord.x,colortable_sz.x); - return texture2D(colortable_texture, color_map_coord/(colortable_pow2_sz-1.0)); + return texture2D(colortable_texture, (color_map_coord+vec2(0.5)) / colortable_pow2_sz); } void main() diff -Nru mame-0.144/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh.c mame-0.145/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh.c --- mame-0.144/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/shader/glsl_bilinear_idx16_lut.fsh.c 2012-02-06 21:30:30.000000000 +0000 @@ -26,7 +26,7 @@ " color_map_coord.y = floor(color_map_coord.x/colortable_sz.x);\n" " color_map_coord.x = mod(color_map_coord.x,colortable_sz.x);\n" "\n" -" return texture2D(colortable_texture, color_map_coord/(colortable_pow2_sz-1.0));\n" +" return texture2D(colortable_texture, (color_map_coord+vec2(0.5)) / colortable_pow2_sz);\n" "}\n" "\n" "void main()\n" diff -Nru mame-0.144/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh mame-0.145/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh --- mame-0.144/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh 2012-02-06 21:30:30.000000000 +0000 @@ -24,7 +24,7 @@ color_map_coord.y = floor(color_map_coord.x/colortable_sz.x); color_map_coord.x = mod(color_map_coord.x,colortable_sz.x); - gl_FragColor = texture2D(colortable_texture, color_map_coord / (colortable_pow2_sz-1.0)); + gl_FragColor = texture2D(colortable_texture, (color_map_coord+vec2(0.5)) / colortable_pow2_sz); } diff -Nru mame-0.144/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh.c mame-0.145/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh.c --- mame-0.144/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/shader/glsl_plain_idx16_lut.fsh.c 2012-02-06 21:30:30.000000000 +0000 @@ -25,7 +25,7 @@ " color_map_coord.y = floor(color_map_coord.x/colortable_sz.x);\n" " color_map_coord.x = mod(color_map_coord.x,colortable_sz.x);\n" "\n" -" gl_FragColor = texture2D(colortable_texture, color_map_coord / (colortable_pow2_sz-1.0));\n" +" gl_FragColor = texture2D(colortable_texture, (color_map_coord+vec2(0.5)) / colortable_pow2_sz);\n" "}\n" "\n" "\n" diff -Nru mame-0.144/src/osd/sdl/video.c mame-0.145/src/osd/sdl/video.c --- mame-0.144/src/osd/sdl/video.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/video.c 2012-02-06 21:30:30.000000000 +0000 @@ -397,6 +397,7 @@ info.cbSize = sizeof(info); result = GetMonitorInfo(handle, (LPMONITORINFO)&info); assert(result); + (void)result; // to silence gcc 4.6 // allocate a new monitor info monitor = global_alloc_clear(sdl_monitor_info); diff -Nru mame-0.144/src/osd/sdl/window.c mame-0.145/src/osd/sdl/window.c --- mame-0.144/src/osd/sdl/window.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/sdl/window.c 2012-02-06 21:30:30.000000000 +0000 @@ -703,9 +703,9 @@ // make the window title if (video_config.numscreens == 1) - sprintf(window->title, APPNAME ": %s [%s]", machine.system().description, machine.system().name); + sprintf(window->title, "%s: %s [%s]", emulator_info::get_appname(), machine.system().description, machine.system().name); else - sprintf(window->title, APPNAME ": %s [%s] - Screen %d", machine.system().description, machine.system().name, index); + sprintf(window->title, "%s: %s [%s] - Screen %d", emulator_info::get_appname(), machine.system().description, machine.system().name, index); wp->window = window; diff -Nru mame-0.144/src/osd/windows/d3dhlsl.c mame-0.145/src/osd/windows/d3dhlsl.c --- mame-0.144/src/osd/windows/d3dhlsl.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/d3dhlsl.c 2012-02-06 21:30:30.000000000 +0000 @@ -1,6 +1,6 @@ //============================================================ // -// drawd3d.c - Win32 Direct3D HLSL implementation +// d3dhlsl.c - Win32 Direct3D HLSL implementation // //============================================================ // @@ -196,7 +196,6 @@ prescale_force_x = 0; prescale_force_y = 0; preset = -1; - shadow_bitmap = NULL; shadow_texture = NULL; registered_targets = 0; cyclic_target_idx = 0; @@ -213,6 +212,7 @@ hlsl_info::~hlsl_info() { + global_free(options); } @@ -283,13 +283,9 @@ D3DLOCKED_RECT rect; // if we don't have a bitmap, or if it's not the right size, allocate a new one - if (avi_snap == NULL || (int)snap_width != avi_snap->width || (int)snap_height != avi_snap->height) + if (!avi_snap.valid() || (int)snap_width != avi_snap.width() || (int)snap_height != avi_snap.height()) { - if (avi_snap != NULL) - { - auto_free(window->machine(), avi_snap); - } - avi_snap = auto_alloc(window->machine(), bitmap_t((int)snap_width, (int)snap_height, BITMAP_FORMAT_RGB32)); + avi_snap.allocate((int)snap_width, (int)snap_height); } // copy the texture @@ -311,16 +307,11 @@ // loop over Y for (int srcy = 0; srcy < (int)snap_height; srcy++) { - BYTE *src = (BYTE *)rect.pBits + srcy * rect.Pitch; - BYTE *dst = (BYTE *)avi_snap->base + srcy * avi_snap->rowpixels * 4; + DWORD *src = (DWORD *)((BYTE *)rect.pBits + srcy * rect.Pitch); + UINT32 *dst = &avi_snap.pix32(srcy); for(int x = 0; x < snap_width; x++) - { - *dst++ = *src++; - *dst++ = *src++; - *dst++ = *src++; *dst++ = *src++; - } } // unlock @@ -346,13 +337,9 @@ render_snap = false; // if we don't have a bitmap, or if it's not the right size, allocate a new one - if (avi_snap == NULL || snap_width != (avi_snap->width / 2) || snap_height != (avi_snap->height / 2)) + if (!avi_snap.valid() || snap_width != (avi_snap.width() / 2) || snap_height != (avi_snap.height() / 2)) { - if (avi_snap != NULL) - { - auto_free(window->machine(), avi_snap); - } - avi_snap = auto_alloc(window->machine(), bitmap_t(snap_width / 2, snap_height / 2, BITMAP_FORMAT_RGB32)); + avi_snap.allocate(snap_width / 2, snap_height / 2); } // copy the texture @@ -380,16 +367,11 @@ { int toty = (srcy + cy * (snap_height / 2)); int totx = cx * (snap_width / 2); - BYTE *src = (BYTE *)rect.pBits + toty * rect.Pitch + totx * 4; - BYTE *dst = (BYTE *)avi_snap->base + srcy * avi_snap->rowpixels * 4; + DWORD *src = (DWORD *)((BYTE *)rect.pBits + toty * rect.Pitch + totx * 4); + UINT32 *dst = &avi_snap.pix32(srcy); for(int x = 0; x < snap_width / 2; x++) - { - *dst++ = *src++; - *dst++ = *src++; *dst++ = *src++; - *dst++ = *src++; - } } int idx = cy * 2 + cx; @@ -400,7 +382,7 @@ return; // add two text entries describing the image - astring text1(APPNAME, " ", build_version); + astring text1(emulator_info::get_appname(), " ", build_version); astring text2(window->machine().system().manufacturer, " ", window->machine().system().description); png_info pnginfo = { 0 }; png_add_text(&pnginfo, "Software", text1); @@ -471,7 +453,7 @@ { // handle an AVI recording // write the next frame - avi_error avierr = avi_append_video_frame_rgb32(avi_output_file, avi_snap); + avi_error avierr = avi_append_video_frame(avi_output_file, avi_snap); if (avierr != AVIERR_NONE) { end_avi_recording(); @@ -921,18 +903,18 @@ // experimental: load a PNG to use for vector rendering; it is treated // as a brightness map emu_file file(window->machine().options().art_path(), OPEN_FLAG_READ); - shadow_bitmap = render_load_png(file, NULL, options->shadow_mask_texture, NULL, NULL); // experimental: if we have a shadow bitmap, create a texture for it - if (shadow_bitmap != NULL) + render_load_png(shadow_bitmap, file, NULL, options->shadow_mask_texture); + if (shadow_bitmap.valid()) { render_texinfo texture; // fake in the basic data so it looks like it came from render.c - texture.base = shadow_bitmap->base; - texture.rowpixels = shadow_bitmap->rowpixels; - texture.width = shadow_bitmap->width; - texture.height = shadow_bitmap->height; + texture.base = shadow_bitmap.raw_pixptr(0); + texture.rowpixels = shadow_bitmap.rowpixels(); + texture.width = shadow_bitmap.width(); + texture.height = shadow_bitmap.height(); texture.palette = NULL; texture.seqid = 0; @@ -1734,34 +1716,37 @@ if(target_in_use[index] != NULL) { d3d_texture_info *tex = target_in_use[index]; - - if(d3d->texlist == tex) + bool found_in_active_list = false; + d3d_texture_info *test_tex = d3d->texlist; + while (test_tex != NULL) { - d3d->texlist = tex->next; - if(d3d->texlist != NULL) + if(test_tex == tex) { - d3d->texlist->prev = NULL; + found_in_active_list = true; + break; } + test_tex = test_tex->next; } - else + + // only clean up a texture if it won't be cleaned up by drawd3d + if(!found_in_active_list) { - if(tex->next != NULL) + if (tex->d3dfinaltex != NULL) { - tex->next->prev = tex->prev; + (*d3dintf->texture.release)(tex->d3dfinaltex); + tex->d3dfinaltex = NULL; } - if(tex->prev != NULL) + if (tex->d3dtex != NULL && tex->d3dtex != tex->d3dfinaltex) { - tex->prev->next = tex->next; + (*d3dintf->texture.release)(tex->d3dtex); + tex->d3dtex = NULL; } + if (tex->d3dsurface != NULL) + { + (*d3dintf->surface.release)(tex->d3dsurface); + } + global_free(tex); } - - if (tex->d3dfinaltex != NULL) - (*d3dintf->texture.release)(tex->d3dfinaltex); - if (tex->d3dtex != NULL && tex->d3dtex != tex->d3dfinaltex) - (*d3dintf->texture.release)(tex->d3dtex); - if (tex->d3dsurface != NULL) - (*d3dintf->surface.release)(tex->d3dsurface); - global_free(tex); } if (prescaletexture0[index] != NULL) @@ -1943,14 +1928,8 @@ //============================================================ void hlsl_info::enumerate_screens() { - screen_device *screen = window->machine().first_screen(); - num_screens = 0; - while(screen != NULL) - { - num_screens++; - screen = screen->next_screen(); - //printf("Encountered %d screens\n", num_screens); - } + screen_device_iterator iter(window->machine().root_device()); + num_screens = iter.count(); } //============================================================ @@ -2267,17 +2246,7 @@ registered_targets = 0; - if (shadow_texture != NULL) - { - global_free(shadow_texture); - shadow_texture = NULL; - } - - if (shadow_bitmap != NULL) - { - global_free(shadow_bitmap); - shadow_bitmap = NULL; - } + shadow_bitmap.reset(); } @@ -2817,8 +2786,8 @@ snapdevname.cpysubstr(snapstr, pos + 3, end - pos - 3); // verify that there is such a device for this system - device_image_interface *image = NULL; - for (bool gotone = d3d->window->machine().devicelist().first(image); gotone; gotone = image->next(image)) + image_interface_iterator iter(d3d->window->machine().root_device()); + for (device_image_interface *image = iter.first(); image != NULL; iter.next()) { // get the device name astring tempdevname(image->brief_instance_name()); diff -Nru mame-0.144/src/osd/windows/d3dhlsl.h mame-0.145/src/osd/windows/d3dhlsl.h --- mame-0.144/src/osd/windows/d3dhlsl.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/d3dhlsl.h 2012-02-06 21:30:30.000000000 +0000 @@ -158,13 +158,13 @@ int prescale_size_x; // prescale size x int prescale_size_y; // prescale size y int preset; // preset, if relevant - bitmap_t * shadow_bitmap; // shadow mask bitmap for post-processing shader + bitmap_argb32 shadow_bitmap; // shadow mask bitmap for post-processing shader d3d_texture_info * shadow_texture; // shadow mask texture for post-processing shader int registered_targets; // number of registered HLSL targets (i.e., screens) int cyclic_target_idx; // cyclic index of next HLSL target slot hlsl_options * options; // current uniform state avi_file * avi_output_file; // AVI file - bitmap_t * avi_snap; // AVI snapshot + bitmap_rgb32 avi_snap; // AVI snapshot int avi_frame; // AVI frame attotime avi_frame_period; // AVI frame period attotime avi_next_frame_time; // AVI next frame time diff -Nru mame-0.144/src/osd/windows/debugwin.c mame-0.145/src/osd/windows/debugwin.c --- mame-0.144/src/osd/windows/debugwin.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/debugwin.c 2012-02-06 21:30:30.000000000 +0000 @@ -2399,7 +2399,6 @@ static void image_update_menu(debugwin_info *info) { - device_image_interface *img = NULL; UINT32 cnt = 0; HMENU devicesmenu; @@ -2407,7 +2406,8 @@ // create the image menu devicesmenu = CreatePopupMenu(); - for (bool gotone = info->machine().devicelist().first(img); gotone; gotone = img->next(img)) + image_interface_iterator iter(info->machine().root_device()); + for (device_image_interface *img = iter.first(); img != NULL; img = iter.next()) { astring temp; UINT flags_for_exists; @@ -2465,7 +2465,6 @@ RECT bounds, work_bounds; HMENU optionsmenu; UINT32 conchars; - device_image_interface *img = NULL; // create the window info = debugwin_window_create(machine, "Debug", NULL); @@ -2492,9 +2491,12 @@ AppendMenu(GetMenu(info->wnd), MF_ENABLED | MF_POPUP, (UINT_PTR)optionsmenu, TEXT("Options")); // Add image menu only if image devices exist - if (info->machine().devicelist().first(img)) { - info->update_menu = image_update_menu; - image_update_menu(info); + { + image_interface_iterator iter(machine.root_device()); + if (iter.first() != NULL) { + info->update_menu = image_update_menu; + image_update_menu(info); + } } // set the handlers @@ -2888,13 +2890,8 @@ } if (LOWORD(wparam) >= ID_DEVICE_OPTIONS) { UINT32 devid = (LOWORD(wparam) - ID_DEVICE_OPTIONS) / DEVOPTION_MAX; - device_image_interface *img = NULL; - UINT32 cnt = 0; - for (bool gotone = info->machine().devicelist().first(img); gotone; gotone = img->next(img)) - { - if (cnt==devid) break; - cnt++; - } + image_interface_iterator iter(info->machine().root_device()); + device_image_interface *img = iter.byindex(devid); if (img!=NULL) { switch ((LOWORD(wparam) - ID_DEVICE_OPTIONS) % DEVOPTION_MAX) { diff -Nru mame-0.144/src/osd/windows/drawd3d.c mame-0.145/src/osd/windows/drawd3d.c --- mame-0.144/src/osd/windows/drawd3d.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/drawd3d.c 2012-02-06 21:30:30.000000000 +0000 @@ -447,15 +447,15 @@ // experimental: load a PNG to use for vector rendering; it is treated // as a brightness map emu_file file(window->machine().options().art_path(), OPEN_FLAG_READ); - d3d->vector_bitmap = render_load_png(file, NULL, "vector.png", NULL, NULL); - if (d3d->vector_bitmap != NULL) + render_load_png(d3d->vector_bitmap, file, NULL, "vector.png"); + if (d3d->vector_bitmap.valid()) { - bitmap_fill(d3d->vector_bitmap, NULL, MAKE_ARGB(0xff,0xff,0xff,0xff)); - d3d->vector_bitmap = render_load_png(file, NULL, "vector.png", d3d->vector_bitmap, NULL); + d3d->vector_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff)); + render_load_png(d3d->vector_bitmap, file, NULL, "vector.png", true); } - d3d->default_bitmap = auto_bitmap_alloc(window->machine(), 8, 8, BITMAP_FORMAT_RGB32); - bitmap_fill(d3d->default_bitmap, NULL, MAKE_ARGB(0xff,0xff,0xff,0xff)); + d3d->default_bitmap.allocate(8, 8); + d3d->default_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff)); // configure the adapter for the mode we want if (config_adapter_mode(window)) @@ -510,10 +510,6 @@ // delete the device device_delete(d3d); - // experimental: free the vector PNG - global_free(d3d->vector_bitmap); - d3d->vector_bitmap = NULL; - // free the memory in the window global_free(d3d); window->drawdata = NULL; @@ -780,15 +776,15 @@ } } - if (d3d->default_bitmap != NULL) + if (d3d->default_bitmap.valid()) { render_texinfo texture; // fake in the basic data so it looks like it came from render.c - texture.base = d3d->default_bitmap->base; - texture.rowpixels = d3d->default_bitmap->rowpixels; - texture.width = d3d->default_bitmap->width; - texture.height = d3d->default_bitmap->height; + texture.base = d3d->default_bitmap.raw_pixptr(0); + texture.rowpixels = d3d->default_bitmap.rowpixels(); + texture.width = d3d->default_bitmap.width(); + texture.height = d3d->default_bitmap.height(); texture.palette = NULL; texture.seqid = 0; @@ -865,15 +861,15 @@ result = (*d3dintf->device.present)(d3d->device, NULL, NULL, NULL, NULL, 0); // experimental: if we have a vector bitmap, create a texture for it - if (d3d->vector_bitmap != NULL) + if (d3d->vector_bitmap.valid()) { render_texinfo texture; // fake in the basic data so it looks like it came from render.c - texture.base = d3d->vector_bitmap->base; - texture.rowpixels = d3d->vector_bitmap->rowpixels; - texture.width = d3d->vector_bitmap->width; - texture.height = d3d->vector_bitmap->height; + texture.base = &d3d->vector_bitmap.pix32(0); + texture.rowpixels = d3d->vector_bitmap.rowpixels(); + texture.width = d3d->vector_bitmap.width(); + texture.height = d3d->vector_bitmap.height(); texture.palette = NULL; texture.seqid = 0; @@ -898,7 +894,7 @@ // delete the HLSL interface global_free(d3d->hlsl); - // free resources + // free our base resources device_delete_resources(d3d); // free the device itself @@ -921,11 +917,21 @@ d3d_texture_info *tex = d3d->texlist; d3d->texlist = tex->next; if (tex->d3dfinaltex != NULL) + { + if (tex->d3dtex == tex->d3dfinaltex) tex->d3dtex = NULL; (*d3dintf->texture.release)(tex->d3dfinaltex); - if (tex->d3dtex != NULL && tex->d3dtex != tex->d3dfinaltex) + tex->d3dfinaltex = NULL; + } + if (tex->d3dtex != NULL) + { (*d3dintf->texture.release)(tex->d3dtex); + tex->d3dtex = NULL; + } if (tex->d3dsurface != NULL) + { (*d3dintf->surface.release)(tex->d3dsurface); + tex->d3dsurface = NULL; + } global_free(tex); } @@ -2001,62 +2007,6 @@ //============================================================ -// copyline_rgb15 -//============================================================ - -INLINE void copyline_rgb15(UINT32 *dst, const UINT16 *src, int width, const rgb_t *palette, int xborderpix) -{ - int x; - - assert(xborderpix == 0 || xborderpix == 1); - - // palette (really RGB map) case - if (palette != NULL) - { - if (xborderpix) - { - UINT16 pix = *src; - *dst++ = 0xff000000 | palette[0x40 + ((pix >> 10) & 0x1f)] | palette[0x20 + ((pix >> 5) & 0x1f)] | palette[0x00 + ((pix >> 0) & 0x1f)]; - } - for (x = 0; x < width; x++) - { - UINT16 pix = *src++; - *dst++ = 0xff000000 | palette[0x40 + ((pix >> 10) & 0x1f)] | palette[0x20 + ((pix >> 5) & 0x1f)] | palette[0x00 + ((pix >> 0) & 0x1f)]; - } - if (xborderpix) - { - UINT16 pix = *--src; - *dst++ = 0xff000000 | palette[0x40 + ((pix >> 10) & 0x1f)] | palette[0x20 + ((pix >> 5) & 0x1f)] | palette[0x00 + ((pix >> 0) & 0x1f)]; - } - } - - // direct case - else - { - if (xborderpix) - { - UINT16 pix = *src; - UINT32 color = ((pix & 0x7c00) << 9) | ((pix & 0x03e0) << 6) | ((pix & 0x001f) << 3); - *dst++ = 0xff000000 | color | ((color >> 5) & 0x070707); - } - for (x = 0; x < width; x++) - { - UINT16 pix = *src++; - UINT32 color = ((pix & 0x7c00) << 9) | ((pix & 0x03e0) << 6) | ((pix & 0x001f) << 3); - *dst++ = 0xff000000 | color | ((color >> 5) & 0x070707); - } - if (xborderpix) - { - UINT16 pix = *--src; - UINT32 color = ((pix & 0x7c00) << 9) | ((pix & 0x03e0) << 6) | ((pix & 0x001f) << 3); - *dst++ = 0xff000000 | color | ((color >> 5) & 0x070707); - } - } -} - - - -//============================================================ // copyline_rgb32 //============================================================ @@ -2393,10 +2343,6 @@ copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); break; - case TEXFORMAT_RGB15: - copyline_rgb15((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); - break; - case TEXFORMAT_RGB32: copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix); break; diff -Nru mame-0.144/src/osd/windows/drawd3d.h mame-0.145/src/osd/windows/drawd3d.h --- mame-0.144/src/osd/windows/drawd3d.h 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/windows/drawd3d.h 2012-02-06 21:30:30.000000000 +0000 @@ -106,10 +106,10 @@ int last_wrap; // previous wrap state DWORD last_modmode; // previous texture modulation - bitmap_t * vector_bitmap; // experimental: bitmap for vectors + bitmap_argb32 vector_bitmap; // experimental: bitmap for vectors d3d_texture_info * vector_texture; // experimental: texture for vectors - bitmap_t * default_bitmap; // experimental: default bitmap + bitmap_rgb32 default_bitmap; // experimental: default bitmap d3d_texture_info * default_texture; // experimental: default texture void * hlsl_buf; // HLSL vertex data diff -Nru mame-0.144/src/osd/windows/netdev.c mame-0.145/src/osd/windows/netdev.c --- mame-0.144/src/osd/windows/netdev.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/netdev.c 2012-02-06 21:30:30.000000000 +0000 @@ -5,3 +5,8 @@ { init_pcap(); } + +void winnetdev_deinit(running_machine &machine) +{ + deinit_pcap(); +} diff -Nru mame-0.144/src/osd/windows/netdev.h mame-0.145/src/osd/windows/netdev.h --- mame-0.144/src/osd/windows/netdev.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/netdev.h 2012-02-06 21:30:30.000000000 +0000 @@ -2,5 +2,6 @@ #define __NETDEV_H void winnetdev_init(running_machine &machine); +void winnetdev_deinit(running_machine &machine); #endif diff -Nru mame-0.144/src/osd/windows/netdev_pcap.c mame-0.145/src/osd/windows/netdev_pcap.c --- mame-0.144/src/osd/windows/netdev_pcap.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/netdev_pcap.c 2012-02-06 21:30:30.000000000 +0000 @@ -78,15 +78,17 @@ static CREATE_NETDEV(create_pcap) { - class netdev_pcap *dev = new netdev_pcap(ifname, ifdev, rate); + class netdev_pcap *dev = global_alloc(netdev_pcap(ifname, ifdev, rate)); return dynamic_cast(dev); } +static HMODULE handle = NULL; + void init_pcap() { pcap_if_t *devs; char errbuf[PCAP_ERRBUF_SIZE]; - HMODULE handle; + handle = NULL; try { @@ -120,9 +122,17 @@ mame_printf_verbose("Unable to get network devices: %s\n", errbuf); return; } - while(devs->next) + + while(devs) { - add_netdev(devs->name, create_pcap); + add_netdev(devs->name, devs->description, create_pcap); devs = devs->next; } } + +void deinit_pcap() +{ + clear_netdev(); + FreeLibrary(handle); +} + diff -Nru mame-0.144/src/osd/windows/netdev_pcap.h mame-0.145/src/osd/windows/netdev_pcap.h --- mame-0.144/src/osd/windows/netdev_pcap.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/netdev_pcap.h 2012-02-06 21:30:30.000000000 +0000 @@ -2,5 +2,6 @@ #define __NETDEV_H void init_pcap(); +void deinit_pcap(); #endif diff -Nru mame-0.144/src/osd/windows/output.c mame-0.145/src/osd/windows/output.c --- mame-0.144/src/osd/windows/output.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/output.c 2012-02-06 21:30:30.000000000 +0000 @@ -127,7 +127,7 @@ // create our window class result = create_window_class(); assert(result == 0); - result++; // to silence gcc 4.6 + (void)result; // to silence gcc 4.6 // create a window output_hwnd = CreateWindowEx( diff -Nru mame-0.144/src/osd/windows/video.c mame-0.145/src/osd/windows/video.c --- mame-0.144/src/osd/windows/video.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/video.c 2012-02-06 21:30:30.000000000 +0000 @@ -164,7 +164,7 @@ monitor->info.cbSize = sizeof(monitor->info); result = GetMonitorInfo(monitor->handle, (LPMONITORINFO)&monitor->info); assert(result); - result++; // to silence gcc 4.6 + (void)result; // to silence gcc 4.6 } @@ -273,7 +273,7 @@ info.cbSize = sizeof(info); result = GetMonitorInfo(handle, (LPMONITORINFO)&info); assert(result); - result++; // to silence gcc 4.6 + (void)result; // to silence gcc 4.6 // allocate a new monitor info monitor = global_alloc_clear(win_monitor_info); diff -Nru mame-0.144/src/osd/windows/window.c mame-0.145/src/osd/windows/window.c --- mame-0.144/src/osd/windows/window.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/window.c 2012-02-06 21:30:30.000000000 +0000 @@ -690,9 +690,9 @@ // make the window title if (video_config.numscreens == 1) - sprintf(window->title, APPNAME ": %s [%s]", machine.system().description, machine.system().name); + sprintf(window->title, "%s: %s [%s]", emulator_info::get_appname(), machine.system().description, machine.system().name); else - sprintf(window->title, APPNAME ": %s [%s] - Screen %d", machine.system().description, machine.system().name, index); + sprintf(window->title, "%s: %s [%s] - Screen %d", emulator_info::get_appname(), machine.system().description, machine.system().name, index); // set the initial maximized state window->startmaximized = options.maximize(); diff -Nru mame-0.144/src/osd/windows/windows.mak mame-0.145/src/osd/windows/windows.mak --- mame-0.144/src/osd/windows/windows.mak 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/windows.mak 2012-02-06 21:30:30.000000000 +0000 @@ -246,6 +246,11 @@ # ensure we statically link the gcc runtime lib LDFLAGS += -static-libgcc +TEST_GCC = $(shell gcc --version) +ifeq ($(findstring 4.4,$(TEST_GCC)),) + #if we use new tools + LDFLAGS += -static-libstdc++ +endif # add the windows libraries LIBS += -luser32 -lgdi32 -ldsound -ldxguid -lwinmm -ladvapi32 -lcomctl32 -lshlwapi -ldinput8 -lwsock32 diff -Nru mame-0.144/src/osd/windows/winmain.c mame-0.145/src/osd/windows/winmain.c --- mame-0.144/src/osd/windows/winmain.c 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/winmain.c 2012-02-06 21:30:30.000000000 +0000 @@ -283,7 +283,7 @@ static int is_double_click_start(int argc); static DWORD WINAPI watchdog_thread_entry(LPVOID lpParameter); static LONG WINAPI exception_filter(struct _EXCEPTION_POINTERS *info); -static void winui_output_error(void *param, const char *format, va_list argptr); +static void winui_output_error(delegate_late_bind *__dummy, const char *format, va_list argptr); @@ -467,7 +467,7 @@ if (win_is_gui_application() || is_double_click_start(argc)) { // if we are a GUI app, output errors to message boxes - mame_set_output_channel(OUTPUT_CHANNEL_ERROR, winui_output_error, NULL, NULL, NULL); + mame_set_output_channel(OUTPUT_CHANNEL_ERROR, output_delegate(FUNC(winui_output_error), (delegate_late_bind *)0)); // make sure any console window that opened on our behalf is nuked FreeConsole(); @@ -539,7 +539,7 @@ // winui_output_error //============================================================ -static void winui_output_error(void *param, const char *format, va_list argptr) +static void winui_output_error(delegate_late_bind *param, const char *format, va_list argptr) { char buffer[1024]; @@ -548,7 +548,7 @@ winwindow_toggle_full_screen(); vsnprintf(buffer, ARRAY_LENGTH(buffer), format, argptr); - win_message_box_utf8(win_window_list ? win_window_list->hwnd : NULL, buffer, APPNAME, MB_OK); + win_message_box_utf8(win_window_list ? win_window_list->hwnd : NULL, buffer, emulator_info::get_appname(), MB_OK); } @@ -709,6 +709,10 @@ // cleanup sockets win_cleanup_sockets(); + #ifdef USE_NETWORK + winnetdev_deinit(machine); + #endif + // take down the watchdog thread if it exists if (watchdog_thread != NULL) { @@ -828,7 +832,7 @@ // pixel of a black & white font //------------------------------------------------- -bitmap_t *windows_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs) +bool windows_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs) { // create a dummy DC to work with HDC dummyDC = CreateCompatibleDC(NULL); @@ -934,17 +938,16 @@ } // allocate a new bitmap - bitmap_t *bitmap = NULL; if (actbounds.max_x >= actbounds.min_x && actbounds.max_y >= actbounds.min_y) { - bitmap = auto_alloc(machine(), bitmap_t(actbounds.max_x + 1 - actbounds.min_x, actbounds.max_y + 1 - actbounds.min_y, BITMAP_FORMAT_ARGB32)); + bitmap.allocate(actbounds.max_x + 1 - actbounds.min_x, actbounds.max_y + 1 - actbounds.min_y); // copy the bits into it - for (int y = 0; y < bitmap->height; y++) + for (int y = 0; y < bitmap.height(); y++) { - UINT32 *dstrow = BITMAP_ADDR32(bitmap, y, 0); + UINT32 *dstrow = &bitmap.pix32(y); UINT8 *srcrow = &bits[(y + actbounds.min_y) * rowbytes]; - for (int x = 0; x < bitmap->width; x++) + for (int x = 0; x < bitmap.width(); x++) { int effx = x + actbounds.min_x; dstrow[x] = ((srcrow[effx / 8] << (effx % 8)) & 0x80) ? MAKE_ARGB(0xff,0xff,0xff,0xff) : MAKE_ARGB(0x00,0xff,0xff,0xff); @@ -961,7 +964,7 @@ DeleteObject(dib); SelectObject(dummyDC, oldfont); DeleteDC(dummyDC); - return bitmap; + return bitmap.valid(); } @@ -1028,6 +1031,7 @@ if (wait_result == WAIT_TIMEOUT) { fprintf(stderr, "Terminating due to watchdog timeout\n"); + fflush(stderr); TerminateProcess(GetCurrentProcess(), -1); } } diff -Nru mame-0.144/src/osd/windows/winmain.h mame-0.145/src/osd/windows/winmain.h --- mame-0.144/src/osd/windows/winmain.h 2012-01-13 15:35:04.000000000 +0000 +++ mame-0.145/src/osd/windows/winmain.h 2012-02-06 21:30:30.000000000 +0000 @@ -321,7 +321,7 @@ // font overridables virtual osd_font font_open(const char *name, int &height); virtual void font_close(osd_font font); - virtual bitmap_t *font_get_bitmap(osd_font font, unicode_char chnum, INT32 &width, INT32 &xoffs, INT32 &yoffs); + virtual bool font_get_bitmap(osd_font font, unicode_char chnum, bitmap_argb32 &bitmap, INT32 &width, INT32 &xoffs, INT32 &yoffs); private: static void osd_exit(running_machine &machine); diff -Nru mame-0.144/src/osd/windows/winutil.c mame-0.145/src/osd/windows/winutil.c --- mame-0.144/src/osd/windows/winutil.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/osd/windows/winutil.c 2012-02-06 21:30:30.000000000 +0000 @@ -67,6 +67,7 @@ break; case ERROR_FILE_NOT_FOUND: + case ERROR_FILENAME_EXCED_RANGE: case ERROR_PATH_NOT_FOUND: filerr = FILERR_NOT_FOUND; break; diff -Nru mame-0.144/src/tools/chdman.c mame-0.145/src/tools/chdman.c --- mame-0.144/src/tools/chdman.c 2012-01-13 15:35:05.000000000 +0000 +++ mame-0.145/src/tools/chdman.c 2012-02-06 21:30:44.000000000 +0000 @@ -49,6 +49,7 @@ #include #include #include +#include /*************************************************************************** @@ -716,6 +717,7 @@ toc.tracks[i].extraframes = hunks * CD_FRAMES_PER_HUNK - toc.tracks[i].frames; } + /* count up the total number of frames */ origtotalsectors = totalsectors = 0; for (i = 0; i < toc.numtrks; i++) @@ -726,7 +728,8 @@ printf("\nCD-ROM %s has %d tracks and %d total frames\n", inputfile, toc.numtrks, origtotalsectors); /* create the new CHD file */ - err = chd_create(outputfile, (UINT64)totalsectors * (UINT64)sectorsize, hunksize, CHDCOMPRESSION_ZLIB_PLUS, NULL); + if (param) err = chd_create(outputfile, (UINT64)totalsectors * (UINT64)sectorsize, hunksize, CHDCOMPRESSION_ZLIB_PLUS_WITH_FLAC, NULL); + else err = chd_create(outputfile, (UINT64)totalsectors * (UINT64)sectorsize, hunksize, CHDCOMPRESSION_ZLIB_PLUS, NULL); if (err != CHDERR_NONE) { fprintf(stderr, "Error creating CHD file: %s\n", chd_error_string(err)); @@ -815,8 +818,14 @@ frames++; } + int is_half_hunk = 0; + if ((curhunk == trackhunks-1) && (toc.tracks[i].extraframes>3)) + is_half_hunk = 1; + + /* compress the current hunk */ - err = chd_compress_hunk(chd, cache, &ratio); + + err = chd_compress_hunk(chd, cache, &ratio, is_half_hunk); if (err != CHDERR_NONE) { fprintf(stderr, "Error during compression: %s\n", chd_error_string(err)); @@ -853,7 +862,7 @@ read_avi_frame - read an AVI frame -------------------------------------------------*/ -static avi_error read_avi_frame(avi_file *avi, UINT32 framenum, UINT32 first_sample, bitmap_t *fullbitmap, int interlaced, av_codec_compress_config *avconfig) +static avi_error read_avi_frame(avi_file *avi, UINT32 framenum, UINT32 first_sample, bitmap_yuy16 &fullbitmap, int interlaced, av_codec_compress_config *avconfig) { const avi_movie_info *info = avi_get_movie_info(avi); int interlace_factor = interlaced ? 2 : 1; @@ -872,19 +881,16 @@ /* read the video data when we hit a new frame */ if (framenum % interlace_factor == 0) { - avierr = avi_read_video_frame_yuy16(avi, framenum / interlace_factor, fullbitmap); + avierr = avi_read_video_frame(avi, framenum / interlace_factor, fullbitmap); if (avierr != AVIERR_NONE) goto cleanup; } /* build the fake bitmap */ - bitmap_clone_existing(avconfig->video, fullbitmap); - if (interlaced) - { - avconfig->video->base = BITMAP_ADDR16(avconfig->video, framenum % interlace_factor, 0); - avconfig->video->rowpixels *= 2; - avconfig->video->height /= 2; - } + if (!interlaced) + avconfig->video.wrap(fullbitmap, fullbitmap.cliprect()); + else + avconfig->video.wrap(&fullbitmap.pix16(framenum % interlace_factor), fullbitmap.width(), fullbitmap.height() / 2, fullbitmap.rowpixels() * 2); cleanup: return avierr; @@ -895,7 +901,7 @@ fake_avi_frame - fake an AVI frame -------------------------------------------------*/ -static avi_error fake_avi_frame(avi_file *avi, UINT32 framenum, UINT32 first_sample, bitmap_t *fullbitmap, int interlaced, av_codec_compress_config *avconfig) +static avi_error fake_avi_frame(avi_file *avi, UINT32 framenum, UINT32 first_sample, bitmap_yuy16 &fullbitmap, int interlaced, av_codec_compress_config *avconfig) { static int framecounter = 0; int leftsamp = (framenum % 200 < 10) ? 10000 : 0; @@ -948,30 +954,27 @@ } /* build the fake bitmap */ - bitmap_clone_existing(avconfig->video, fullbitmap); - if (interlaced) - { - avconfig->video->base = BITMAP_ADDR16(avconfig->video, framenum % interlace_factor, 0); - avconfig->video->rowpixels *= 2; - avconfig->video->height /= 2; - } + if (!interlaced) + avconfig->video.wrap(fullbitmap, fullbitmap.cliprect()); + else + avconfig->video.wrap(&fullbitmap.pix16(framenum % interlace_factor), fullbitmap.width(), fullbitmap.height() / 2, fullbitmap.rowpixels() * 2); /* loop over the data and copy it to the cache */ - for (y = 0; y < avconfig->video->height; y++) + for (y = 0; y < avconfig->video.height(); y++) { - UINT16 *dest = BITMAP_ADDR16(avconfig->video, y, 0); + UINT16 *dest = &avconfig->video.pix16(y); /* white flag? */ if (y == 11 && whiteflag) { for (x = 0; x < AVI_FAKE_WIDTH; x++) - *dest++ = (x > 10 && x < avconfig->video->width - 10) ? 0xff80 : 0x0080; + *dest++ = (x > 10 && x < avconfig->video.width() - 10) ? 0xff80 : 0x0080; } /* line 17/18 */ else if ((y == 17 || y == 18) && line1718 != 0) { - for (x = 0; x < avconfig->video->width; x++) + for (x = 0; x < avconfig->video.width(); x++) { UINT16 pixel = 0x0080; if (x >= 20) @@ -991,14 +994,14 @@ /* anything else in VBI-land */ else if (y < 22) { - for (x = 0; x < avconfig->video->width; x++) + for (x = 0; x < avconfig->video.width(); x++) *dest++ = 0x0080; } /* everything else */ else { - for (x = 0; x < avconfig->video->width; x++) + for (x = 0; x < avconfig->video.width(); x++) *dest++ = framenum; } } @@ -1016,15 +1019,13 @@ { UINT32 fps_times_1million, width, height, interlaced, channels, rate, totalframes; UINT32 max_samples_per_frame, bytes_per_frame, firstframe, numframes; - av_codec_compress_config avconfig = { 0 }; + av_codec_compress_config avconfig; const char *inputfile, *outputfile; - bitmap_t *fullbitmap = NULL; const avi_movie_info *info; UINT8 *ldframedata = NULL; const chd_header *header; chd_file *chd = NULL; avi_file *avi = NULL; - bitmap_t fakebitmap; double ratio = 1.0; char metadata[256]; avi_error avierr; @@ -1122,119 +1123,115 @@ bytes_per_frame = 12 + channels * max_samples_per_frame * 2 + width * height * 2; /* allocate a video buffer */ - fullbitmap = bitmap_alloc(width, height * (interlaced ? 2 : 1), BITMAP_FORMAT_YUY16); - if (fullbitmap == NULL) { - fprintf(stderr, "Out of memory allocating temporary bitmap\n"); - err = CHDERR_OUT_OF_MEMORY; - goto cleanup; - } - avconfig.video = &fakebitmap; + bitmap_yuy16 fullbitmap(width, height * (interlaced ? 2 : 1)); + avconfig.video.wrap(fullbitmap, fullbitmap.cliprect()); - /* allocate audio buffers */ - avconfig.channels = channels; - for (chnum = 0; chnum < channels; chnum++) - { - avconfig.audio[chnum] = (INT16 *)malloc(max_samples_per_frame * 2); - if (avconfig.audio[chnum] == NULL) + /* allocate audio buffers */ + avconfig.channels = channels; + for (chnum = 0; chnum < channels; chnum++) { - fprintf(stderr, "Out of memory allocating temporary audio buffer\n"); - err = CHDERR_OUT_OF_MEMORY; + avconfig.audio[chnum] = (INT16 *)malloc(max_samples_per_frame * 2); + if (avconfig.audio[chnum] == NULL) + { + fprintf(stderr, "Out of memory allocating temporary audio buffer\n"); + err = CHDERR_OUT_OF_MEMORY; + goto cleanup; + } + } + + /* create the new CHD */ + err = chd_create(outputfile, (UINT64)numframes * (UINT64)bytes_per_frame, bytes_per_frame, CHDCOMPRESSION_AV, NULL); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error creating CHD file: %s\n", chd_error_string(err)); goto cleanup; } - } - /* create the new CHD */ - err = chd_create(outputfile, (UINT64)numframes * (UINT64)bytes_per_frame, bytes_per_frame, CHDCOMPRESSION_AV, NULL); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error creating CHD file: %s\n", chd_error_string(err)); - goto cleanup; - } + /* open the new CHD */ + err = chd_open(outputfile, CHD_OPEN_READWRITE, NULL, &chd); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error opening new CHD file: %s\n", chd_error_string(err)); + goto cleanup; + } + header = chd_get_header(chd); - /* open the new CHD */ - err = chd_open(outputfile, CHD_OPEN_READWRITE, NULL, &chd); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error opening new CHD file: %s\n", chd_error_string(err)); - goto cleanup; - } - header = chd_get_header(chd); + /* write the metadata */ + sprintf(metadata, AV_METADATA_FORMAT, fps_times_1million / 1000000, fps_times_1million % 1000000, width, height, interlaced, channels, rate); + err = chd_set_metadata(chd, AV_METADATA_TAG, 0, metadata, strlen(metadata) + 1, CHD_MDFLAGS_CHECKSUM); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error adding AV metadata: %s\n", chd_error_string(err)); + goto cleanup; + } - /* write the metadata */ - sprintf(metadata, AV_METADATA_FORMAT, fps_times_1million / 1000000, fps_times_1million % 1000000, width, height, interlaced, channels, rate); - err = chd_set_metadata(chd, AV_METADATA_TAG, 0, metadata, strlen(metadata) + 1, CHD_MDFLAGS_CHECKSUM); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error adding AV metadata: %s\n", chd_error_string(err)); - goto cleanup; - } + /* begin compressing */ + err = chd_compress_begin(chd); + if (err != CHDERR_NONE) + goto cleanup; - /* begin compressing */ - err = chd_compress_begin(chd); - if (err != CHDERR_NONE) - goto cleanup; + /* loop over source hunks until we run out */ + for (framenum = 0; framenum < numframes; framenum++) + { + int effframe = firstframe + framenum; + UINT32 first_sample; - /* loop over source hunks until we run out */ - for (framenum = 0; framenum < numframes; framenum++) - { - int effframe = firstframe + framenum; - UINT32 first_sample; + /* progress */ + progress(framenum == 0, "Compressing hunk %d/%d... (ratio=%d%%) \r", framenum, header->totalhunks, (int)(100.0 * ratio)); - /* progress */ - progress(framenum == 0, "Compressing hunk %d/%d... (ratio=%d%%) \r", framenum, header->totalhunks, (int)(100.0 * ratio)); + /* compute the number of samples in this frame */ + first_sample = ((UINT64)rate * (UINT64)effframe * (UINT64)1000000 + fps_times_1million - 1) / (UINT64)fps_times_1million; + avconfig.samples = ((UINT64)rate * (UINT64)(effframe + 1) * (UINT64)1000000 + fps_times_1million - 1) / (UINT64)fps_times_1million - first_sample; + + /* read the frame into its proper format in the cache */ + if (IS_FAKE_AVI_FILE(avi)) + avierr = fake_avi_frame(avi, effframe, first_sample, fullbitmap, interlaced, &avconfig); + else + avierr = read_avi_frame(avi, effframe, first_sample, fullbitmap, interlaced, &avconfig); + if (avierr != AVIERR_NONE) + { + fprintf(stderr, "Error reading frame %d from AVI file: %s\n", effframe, avi_error_string(avierr)); + err = CHDERR_COMPRESSION_ERROR; + } - /* compute the number of samples in this frame */ - first_sample = ((UINT64)rate * (UINT64)effframe * (UINT64)1000000 + fps_times_1million - 1) / (UINT64)fps_times_1million; - avconfig.samples = ((UINT64)rate * (UINT64)(effframe + 1) * (UINT64)1000000 + fps_times_1million - 1) / (UINT64)fps_times_1million - first_sample; - - /* read the frame into its proper format in the cache */ - if (IS_FAKE_AVI_FILE(avi)) - avierr = fake_avi_frame(avi, effframe, first_sample, fullbitmap, interlaced, &avconfig); - else - avierr = read_avi_frame(avi, effframe, first_sample, fullbitmap, interlaced, &avconfig); - if (avierr != AVIERR_NONE) - { - fprintf(stderr, "Error reading frame %d from AVI file: %s\n", effframe, avi_error_string(avierr)); - err = CHDERR_COMPRESSION_ERROR; + /* update metadata for this frame */ + if (ldframedata != NULL) + { + /* parse the data and pack it */ + vbi_metadata vbi; + vbi_parse_all(&avconfig.video.pix16(0), avconfig.video.rowpixels(), avconfig.video.width(), 8, &vbi); + vbi_metadata_pack(&ldframedata[framenum * VBI_PACKED_BYTES], framenum, &vbi); + } + + /* configure the compressor for this frame */ + chd_codec_config(chd, AV_CODEC_COMPRESS_CONFIG, &avconfig); + + /* append the data */ + err = chd_compress_hunk(chd, NULL, &ratio); + if (err != CHDERR_NONE) + goto cleanup; } - /* update metadata for this frame */ + /* write the final metadata */ if (ldframedata != NULL) { - /* parse the data and pack it */ - vbi_metadata vbi; - vbi_parse_all((const UINT16 *)avconfig.video->base, avconfig.video->rowpixels, avconfig.video->width, 8, &vbi); - vbi_metadata_pack(&ldframedata[framenum * VBI_PACKED_BYTES], framenum, &vbi); + err = chd_set_metadata(chd, AV_LD_METADATA_TAG, 0, ldframedata, numframes * VBI_PACKED_BYTES, CHD_MDFLAGS_CHECKSUM); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error adding AVLD metadata: %s\n", chd_error_string(err)); + goto cleanup; + } } - /* configure the compressor for this frame */ - chd_codec_config(chd, AV_CODEC_COMPRESS_CONFIG, &avconfig); - - /* append the data */ - err = chd_compress_hunk(chd, NULL, &ratio); - if (err != CHDERR_NONE) - goto cleanup; - } - - /* write the final metadata */ - if (ldframedata != NULL) - { - err = chd_set_metadata(chd, AV_LD_METADATA_TAG, 0, ldframedata, numframes * VBI_PACKED_BYTES, CHD_MDFLAGS_CHECKSUM); + /* finish compression */ + err = chd_compress_finish(chd, TRUE); if (err != CHDERR_NONE) - { - fprintf(stderr, "Error adding AVLD metadata: %s\n", chd_error_string(err)); goto cleanup; - } + else + progress(TRUE, "Compression complete ... final ratio = %d%% \n", (int)(100.0 * ratio)); } - /* finish compression */ - err = chd_compress_finish(chd, TRUE); - if (err != CHDERR_NONE) - goto cleanup; - else - progress(TRUE, "Compression complete ... final ratio = %d%% \n", (int)(100.0 * ratio)); - cleanup: /* close everything down */ if (avi != NULL && !IS_FAKE_AVI_FILE(avi)) @@ -1244,8 +1241,6 @@ for (chnum = 0; chnum < ARRAY_LENGTH(avconfig.audio); chnum++) if (avconfig.audio[chnum] != NULL) free(avconfig.audio[chnum]); - if (fullbitmap != NULL) - bitmap_free(fullbitmap); if (ldframedata != NULL) free(ldframedata); if (err != CHDERR_NONE) @@ -1661,7 +1656,7 @@ f %= 75; m = s / 60; s %= 60; - fprintf(outfile, " POSTGAP %02d:%02d:%02d\n", m, s, f); + fprintf(outfile, " POSTGAP %02d:%02d:%02d\n", m, s, f); } } else @@ -1810,16 +1805,14 @@ static int do_extractav(int argc, char *argv[], int param) { int fps, fpsfrac, width, height, interlaced, channels, rate, totalframes; - av_codec_decompress_config avconfig = { 0 }; + av_codec_decompress_config avconfig; const char *inputfile, *outputfile; UINT32 firstframe, numframes; - bitmap_t *fullbitmap = NULL; UINT32 framenum, numsamples; UINT32 fps_times_1million; const chd_header *header; chd_file *chd = NULL; avi_file *avi = NULL; - bitmap_t fakebitmap; avi_movie_info info; char metadata[256]; avi_error avierr; @@ -1878,111 +1871,104 @@ numframes = MIN(totalframes - firstframe, numframes); /* allocate a video buffer */ - fullbitmap = bitmap_alloc(width, height, BITMAP_FORMAT_YUY16); - if (fullbitmap == NULL) - { - fprintf(stderr, "Out of memory allocating temporary bitmap\n"); - err = CHDERR_OUT_OF_MEMORY; - goto cleanup; - } - avconfig.video = &fakebitmap; - - /* allocate audio buffers */ - avconfig.maxsamples = ((UINT64)rate * 1000000 + fps_times_1million - 1) / fps_times_1million; - avconfig.actsamples = &numsamples; - for (chnum = 0; chnum < channels; chnum++) - { - avconfig.audio[chnum] = (INT16 *)malloc(avconfig.maxsamples * 2); - if (avconfig.audio[chnum] == NULL) - { - fprintf(stderr, "Out of memory allocating temporary audio buffer\n"); - err = CHDERR_OUT_OF_MEMORY; - goto cleanup; - } - } - - /* print some of it */ - printf("Use frames: %d-%d\n", firstframe, firstframe + numframes - 1); - printf("Frame rate: %d.%06d\n", fps_times_1million / 1000000, fps_times_1million % 1000000); - printf("Frame size: %d x %d %s\n", width, height, interlaced ? "interlaced" : "non-interlaced"); - printf("Audio: %d channels at %d Hz\n", channels, rate); - printf("Total frames: %d (%02d:%02d:%02d)\n", totalframes, - (UINT32)((UINT64)totalframes * 1000000 / fps_times_1million / 60 / 60), - (UINT32)(((UINT64)totalframes * 1000000 / fps_times_1million / 60) % 60), - (UINT32)(((UINT64)totalframes * 1000000 / fps_times_1million) % 60)); - - /* build up the movie info */ - info.video_format = FORMAT_YUY2; - info.video_timescale = fps_times_1million; - info.video_sampletime = 1000000; - info.video_width = width; - info.video_height = height; - info.video_depth = 16; - info.audio_format = 0; - info.audio_timescale = rate; - info.audio_sampletime = 1; - info.audio_channels = channels; - info.audio_samplebits = 16; - info.audio_samplerate = rate; - - /* create the output file */ - avierr = avi_create(outputfile, &info, &avi); - if (avierr != AVIERR_NONE) - { - fprintf(stderr, "Error opening output file '%s': %s\n", outputfile, avi_error_string(avierr)); - err = CHDERR_CANT_CREATE_FILE; - goto cleanup; - } - - /* loop over hunks, reading and writing */ - for (framenum = 0; framenum < numframes; framenum++) { - /* progress */ - progress(framenum == 0, "Extracting hunk %d/%d... \r", framenum, numframes); + bitmap_yuy16 fullbitmap(width, height); + avconfig.video.wrap(fullbitmap, fullbitmap.cliprect()); - /* set up the fake bitmap for this frame */ - bitmap_clone_existing(avconfig.video, fullbitmap); - if (interlaced) + /* allocate audio buffers */ + avconfig.maxsamples = ((UINT64)rate * 1000000 + fps_times_1million - 1) / fps_times_1million; + avconfig.actsamples = &numsamples; + for (chnum = 0; chnum < channels; chnum++) { - avconfig.video->base = BITMAP_ADDR16(avconfig.video, framenum % 2, 0); - avconfig.video->rowpixels *= 2; - avconfig.video->height /= 2; + avconfig.audio[chnum] = (INT16 *)malloc(avconfig.maxsamples * 2); + if (avconfig.audio[chnum] == NULL) + { + fprintf(stderr, "Out of memory allocating temporary audio buffer\n"); + err = CHDERR_OUT_OF_MEMORY; + goto cleanup; + } } - /* configure the decompressor for this frame */ - chd_codec_config(chd, AV_CODEC_DECOMPRESS_CONFIG, &avconfig); + /* print some of it */ + printf("Use frames: %d-%d\n", firstframe, firstframe + numframes - 1); + printf("Frame rate: %d.%06d\n", fps_times_1million / 1000000, fps_times_1million % 1000000); + printf("Frame size: %d x %d %s\n", width, height, interlaced ? "interlaced" : "non-interlaced"); + printf("Audio: %d channels at %d Hz\n", channels, rate); + printf("Total frames: %d (%02d:%02d:%02d)\n", totalframes, + (UINT32)((UINT64)totalframes * 1000000 / fps_times_1million / 60 / 60), + (UINT32)(((UINT64)totalframes * 1000000 / fps_times_1million / 60) % 60), + (UINT32)(((UINT64)totalframes * 1000000 / fps_times_1million) % 60)); + + /* build up the movie info */ + info.video_format = FORMAT_YUY2; + info.video_timescale = fps_times_1million; + info.video_sampletime = 1000000; + info.video_width = width; + info.video_height = height; + info.video_depth = 16; + info.audio_format = 0; + info.audio_timescale = rate; + info.audio_sampletime = 1; + info.audio_channels = channels; + info.audio_samplebits = 16; + info.audio_samplerate = rate; - /* read the hunk into the buffers */ - err = chd_read(chd, firstframe + framenum, NULL); - if (err != CHDERR_NONE) + /* create the output file */ + avierr = avi_create(outputfile, &info, &avi); + if (avierr != AVIERR_NONE) { - fprintf(stderr, "Error reading hunk %d from CHD file: %s\n", firstframe + framenum, chd_error_string(err)); + fprintf(stderr, "Error opening output file '%s': %s\n", outputfile, avi_error_string(avierr)); + err = CHDERR_CANT_CREATE_FILE; goto cleanup; } - /* write audio */ - for (chnum = 0; chnum < channels; chnum++) + /* loop over hunks, reading and writing */ + for (framenum = 0; framenum < numframes; framenum++) { - avierr = avi_append_sound_samples(avi, chnum, avconfig.audio[chnum], numsamples, 0); - if (avierr != AVIERR_NONE) + /* progress */ + progress(framenum == 0, "Extracting hunk %d/%d... \r", framenum, numframes); + + /* set up the fake bitmap for this frame */ + if (!interlaced) + avconfig.video.wrap(fullbitmap, fullbitmap.cliprect()); + else + avconfig.video.wrap(&fullbitmap.pix16(framenum % 2), fullbitmap.width(), fullbitmap.height() / 2, fullbitmap.rowpixels() * 2); + + /* configure the decompressor for this frame */ + chd_codec_config(chd, AV_CODEC_DECOMPRESS_CONFIG, &avconfig); + + /* read the hunk into the buffers */ + err = chd_read(chd, firstframe + framenum, NULL); + if (err != CHDERR_NONE) { - fprintf(stderr, "Error writing samples for hunk %d to AVI file: %s\n", firstframe + framenum, avi_error_string(avierr)); + fprintf(stderr, "Error reading hunk %d from CHD file: %s\n", firstframe + framenum, chd_error_string(err)); goto cleanup; } - } - /* write video */ - if (!interlaced || (firstframe + framenum) % 2 == 1) - { - avierr = avi_append_video_frame_yuy16(avi, fullbitmap); - if (avierr != AVIERR_NONE) + /* write audio */ + for (chnum = 0; chnum < channels; chnum++) { - fprintf(stderr, "Error writing video for hunk %d to AVI file: %s\n", firstframe + framenum, avi_error_string(avierr)); - goto cleanup; + avierr = avi_append_sound_samples(avi, chnum, avconfig.audio[chnum], numsamples, 0); + if (avierr != AVIERR_NONE) + { + fprintf(stderr, "Error writing samples for hunk %d to AVI file: %s\n", firstframe + framenum, avi_error_string(avierr)); + goto cleanup; + } + } + + /* write video */ + if (!interlaced || (firstframe + framenum) % 2 == 1) + { + avierr = avi_append_video_frame(avi, fullbitmap); + if (avierr != AVIERR_NONE) + { + fprintf(stderr, "Error writing video for hunk %d to AVI file: %s\n", firstframe + framenum, avi_error_string(avierr)); + goto cleanup; + } } } + progress(TRUE, "Extraction complete! \n"); } - progress(TRUE, "Extraction complete! \n"); cleanup: /* clean up our mess */ @@ -1991,8 +1977,6 @@ for (chnum = 0; chnum < ARRAY_LENGTH(avconfig.audio); chnum++) if (avconfig.audio[chnum] != NULL) free(avconfig.audio[chnum]); - if (fullbitmap != NULL) - bitmap_free(fullbitmap); if (chd != NULL) chd_close(chd); if (err != CHDERR_NONE) @@ -2169,13 +2153,12 @@ static int do_fixavdata(int argc, char *argv[], int param) { int fps, fpsfrac, width, height, interlaced, channels, rate; - av_codec_decompress_config avconfig = { 0 }; - bitmap_t *fullbitmap = NULL; + av_codec_decompress_config avconfig; const char *inputfile; UINT8 *vbidata = NULL; int writeable = FALSE; chd_file *chd = NULL; - bitmap_t fakebitmap; + bitmap_yuy16 fakebitmap; char metadata[256]; chd_header header; UINT32 actlength; @@ -2228,159 +2211,153 @@ } /* allocate a video buffer */ - fullbitmap = bitmap_alloc(width, height, BITMAP_FORMAT_YUY16); - if (fullbitmap == NULL) - { - fprintf(stderr, "Out of memory allocating temporary bitmap\n"); - err = CHDERR_OUT_OF_MEMORY; - goto cleanup; - } - avconfig.video = &fakebitmap; - - /* allocate memory for VBI data */ - vbidata = (UINT8 *)malloc(header.totalhunks * VBI_PACKED_BYTES); - if (vbidata == NULL) - { - fprintf(stderr, "Out of memory allocating VBI data\n"); - err = CHDERR_OUT_OF_MEMORY; - goto cleanup; - } - - /* read the metadata */ - err = chd_get_metadata(chd, AV_LD_METADATA_TAG, 0, vbidata, header.totalhunks * VBI_PACKED_BYTES, &actlength, NULL, NULL); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error getting VBI metadata: %s\n", chd_error_string(err)); - memset(vbidata, 0, header.totalhunks * VBI_PACKED_BYTES); - fixes++; - } - if (actlength != header.totalhunks * VBI_PACKED_BYTES) { - fprintf(stderr, "VBI metadata incorrect size\n"); - memset(vbidata, 0, header.totalhunks * VBI_PACKED_BYTES); - fixes++; - } - - /* loop over hunks, reading */ - for (framenum = 0; framenum < header.totalhunks; framenum++) - { - vbi_metadata origvbi; - vbi_metadata vbi; - UINT32 vbiframe; - - /* progress */ - progress(framenum == 0, "Processing hunk %d/%d... \r", framenum, header.totalhunks); - - /* set up the fake bitmap for this frame */ - bitmap_clone_existing(avconfig.video, fullbitmap); + bitmap_yuy16 fullbitmap(width, height); + avconfig.video.wrap(fullbitmap, fullbitmap.cliprect()); - /* configure the decompressor for this frame */ - chd_codec_config(chd, AV_CODEC_DECOMPRESS_CONFIG, &avconfig); + /* allocate memory for VBI data */ + vbidata = (UINT8 *)malloc(header.totalhunks * VBI_PACKED_BYTES); + if (vbidata == NULL) + { + fprintf(stderr, "Out of memory allocating VBI data\n"); + err = CHDERR_OUT_OF_MEMORY; + goto cleanup; + } - /* read the hunk into the buffers */ - err = chd_read(chd, framenum, NULL); + /* read the metadata */ + err = chd_get_metadata(chd, AV_LD_METADATA_TAG, 0, vbidata, header.totalhunks * VBI_PACKED_BYTES, &actlength, NULL, NULL); if (err != CHDERR_NONE) { - fprintf(stderr, "Error reading hunk %d from CHD file: %s\n", framenum, chd_error_string(err)); - goto cleanup; + fprintf(stderr, "Error getting VBI metadata: %s\n", chd_error_string(err)); + memset(vbidata, 0, header.totalhunks * VBI_PACKED_BYTES); + fixes++; + } + if (actlength != header.totalhunks * VBI_PACKED_BYTES) + { + fprintf(stderr, "VBI metadata incorrect size\n"); + memset(vbidata, 0, header.totalhunks * VBI_PACKED_BYTES); + fixes++; } - /* unpack the current data for this frame */ - vbi_metadata_unpack(&origvbi, &vbiframe, &vbidata[framenum * VBI_PACKED_BYTES]); + /* loop over hunks, reading */ + for (framenum = 0; framenum < header.totalhunks; framenum++) + { + vbi_metadata origvbi; + vbi_metadata vbi; + UINT32 vbiframe; - /* parse the video data */ - vbi_parse_all((const UINT16 *)avconfig.video->base, avconfig.video->rowpixels, avconfig.video->width, 8, &vbi); + /* progress */ + progress(framenum == 0, "Processing hunk %d/%d... \r", framenum, header.totalhunks); - /* verify the data */ - if (vbiframe != 0 || origvbi.white != 0 || origvbi.line16 != 0 || origvbi.line17 != 0 || origvbi.line18 != 0 || origvbi.line1718 != 0) - { - int errors = 0; + /* set up the fake bitmap for this frame */ + avconfig.video.wrap(fullbitmap, fullbitmap.cliprect()); - if (vbiframe != framenum) - { - fprintf(stderr, "%d:Frame mismatch in VBI data (%d, should be %d)\n", framenum, vbiframe, framenum); - errors++; - } - if (vbi.white != origvbi.white) - { - fprintf(stderr, "%d:White flag mismatch in VBI data (%d, should be %d)\n", framenum, origvbi.white, vbi.white); - errors++; - } - if (vbi.line16 != origvbi.line16) - { - fprintf(stderr, "%d:Line 16 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line16, vbi.line16); - errors++; - } - if (vbi.line17 != origvbi.line17) - { - fprintf(stderr, "%d:Line 17 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line17, vbi.line17); - errors++; - } - if (vbi.line18 != origvbi.line18) + /* configure the decompressor for this frame */ + chd_codec_config(chd, AV_CODEC_DECOMPRESS_CONFIG, &avconfig); + + /* read the hunk into the buffers */ + err = chd_read(chd, framenum, NULL); + if (err != CHDERR_NONE) { - fprintf(stderr, "%d:Line 18 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line18, vbi.line18); - errors++; + fprintf(stderr, "Error reading hunk %d from CHD file: %s\n", framenum, chd_error_string(err)); + goto cleanup; } - if (vbi.line1718 != origvbi.line1718) + + /* unpack the current data for this frame */ + vbi_metadata_unpack(&origvbi, &vbiframe, &vbidata[framenum * VBI_PACKED_BYTES]); + + /* parse the video data */ + vbi_parse_all(&avconfig.video.pix16(0), avconfig.video.rowpixels(), avconfig.video.width(), 8, &vbi); + + /* verify the data */ + if (vbiframe != 0 || origvbi.white != 0 || origvbi.line16 != 0 || origvbi.line17 != 0 || origvbi.line18 != 0 || origvbi.line1718 != 0) { - fprintf(stderr, "%d:Line 17/18 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line1718, vbi.line1718); - errors++; + int errors = 0; + + if (vbiframe != framenum) + { + fprintf(stderr, "%d:Frame mismatch in VBI data (%d, should be %d)\n", framenum, vbiframe, framenum); + errors++; + } + if (vbi.white != origvbi.white) + { + fprintf(stderr, "%d:White flag mismatch in VBI data (%d, should be %d)\n", framenum, origvbi.white, vbi.white); + errors++; + } + if (vbi.line16 != origvbi.line16) + { + fprintf(stderr, "%d:Line 16 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line16, vbi.line16); + errors++; + } + if (vbi.line17 != origvbi.line17) + { + fprintf(stderr, "%d:Line 17 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line17, vbi.line17); + errors++; + } + if (vbi.line18 != origvbi.line18) + { + fprintf(stderr, "%d:Line 18 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line18, vbi.line18); + errors++; + } + if (vbi.line1718 != origvbi.line1718) + { + fprintf(stderr, "%d:Line 17/18 mismatch in VBI data (%06X, should be %06X)\n", framenum, origvbi.line1718, vbi.line1718); + errors++; + } + fixes += errors; + fixframes += (errors != 0); } - fixes += errors; - fixframes += (errors != 0); + + /* pack the new data */ + vbi_metadata_pack(&vbidata[framenum * VBI_PACKED_BYTES], framenum, &vbi); } + progress(TRUE, "Processing complete! \n"); - /* pack the new data */ - vbi_metadata_pack(&vbidata[framenum * VBI_PACKED_BYTES], framenum, &vbi); - } - progress(TRUE, "Processing complete! \n"); + /* print final results */ + if (fixes == 0) + printf("\nNo fixes required\n"); + else + printf("\nFound %d errors on %d frames\n", fixes, fixframes); - /* print final results */ - if (fixes == 0) - printf("\nNo fixes required\n"); - else - printf("\nFound %d errors on %d frames\n", fixes, fixframes); + /* close the drive */ + chd_close(chd); + chd = NULL; - /* close the drive */ - chd_close(chd); - chd = NULL; + /* apply fixes */ + if (fixes > 0) + { + /* mark the CHD writeable */ + header.flags |= CHDFLAGS_IS_WRITEABLE; + err = chd_set_header(inputfile, &header); + if (err != CHDERR_NONE) + fprintf(stderr, "Error writing new header: %s\n", chd_error_string(err)); + header.flags &= ~CHDFLAGS_IS_WRITEABLE; + writeable = TRUE; - /* apply fixes */ - if (fixes > 0) - { - /* mark the CHD writeable */ - header.flags |= CHDFLAGS_IS_WRITEABLE; - err = chd_set_header(inputfile, &header); - if (err != CHDERR_NONE) - fprintf(stderr, "Error writing new header: %s\n", chd_error_string(err)); - header.flags &= ~CHDFLAGS_IS_WRITEABLE; - writeable = TRUE; + /* open the file */ + err = chd_open(inputfile, CHD_OPEN_READWRITE, NULL, &chd); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error opening CHD file '%s': %s\n", inputfile, chd_error_string(err)); + goto cleanup; + } - /* open the file */ - err = chd_open(inputfile, CHD_OPEN_READWRITE, NULL, &chd); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error opening CHD file '%s': %s\n", inputfile, chd_error_string(err)); - goto cleanup; - } + /* write new metadata */ + err = chd_set_metadata(chd, AV_LD_METADATA_TAG, 0, vbidata, header.totalhunks * VBI_PACKED_BYTES, CHD_MDFLAGS_CHECKSUM); + if (err != CHDERR_NONE) + { + fprintf(stderr, "Error adding AVLD metadata: %s\n", chd_error_string(err)); + goto cleanup; + } + else + printf("Updated metadata written successfully\n"); - /* write new metadata */ - err = chd_set_metadata(chd, AV_LD_METADATA_TAG, 0, vbidata, header.totalhunks * VBI_PACKED_BYTES, CHD_MDFLAGS_CHECKSUM); - if (err != CHDERR_NONE) - { - fprintf(stderr, "Error adding AVLD metadata: %s\n", chd_error_string(err)); - goto cleanup; + /* allow cleanup code to close the file and revert the header */ } - else - printf("Updated metadata written successfully\n"); - - /* allow cleanup code to close the file and revert the header */ } cleanup: /* clean up our mess */ - if (fullbitmap != NULL) - bitmap_free(fullbitmap); if (vbidata != NULL) free(vbidata); if (chd != NULL) @@ -3433,6 +3410,7 @@ { "-createuncomphd", do_createhd_uncomp, 0 }, { "-createraw", do_createraw, 0 }, { "-createcd", do_createcd, 0 }, +// { "-createcdflac", do_createcd, 1 }, { "-createblankhd", do_createblankhd, 0 }, { "-createav", do_createav, 0 }, { "-copydata", do_copydata, 0 }, diff -Nru mame-0.144/src/tools/ldresample.c mame-0.145/src/tools/ldresample.c --- mame-0.144/src/tools/ldresample.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/tools/ldresample.c 2012-02-06 21:30:44.000000000 +0000 @@ -41,6 +41,7 @@ #include #include #include +#include #include "bitmap.h" #include "chd.h" #include "vbiparse.h" @@ -81,7 +82,7 @@ int samplerate; int channels; int interlaced; - bitmap_t * bitmap; + bitmap_yuy16 *bitmap; INT16 * lsound; INT16 * rsound; UINT32 samples; @@ -150,7 +151,7 @@ static int chd_allocate_buffers(movie_info *info) { /* allocate a bitmap */ - info->bitmap = bitmap_alloc(info->width, info->height, BITMAP_FORMAT_YUY16); + info->bitmap = new(std::nothrow) bitmap_yuy16(info->width, info->height); if (info->bitmap == NULL) { fprintf(stderr, "Out of memory creating %dx%d bitmap\n", info->width, info->height); @@ -176,8 +177,7 @@ static void chd_free_buffers(movie_info *info) { - if (info->bitmap != NULL) - free(info->bitmap); + delete info->bitmap; if (info->lsound != NULL) free(info->lsound); if (info->rsound != NULL) @@ -293,11 +293,11 @@ static int read_chd(chd_file *file, UINT32 field, movie_info *info, UINT32 soundoffs) { - av_codec_decompress_config avconfig = { 0 }; + av_codec_decompress_config avconfig; chd_error chderr; /* configure the codec */ - avconfig.video = info->bitmap; + avconfig.video.wrap(*info->bitmap, info->bitmap->cliprect()); avconfig.maxsamples = 48000; avconfig.actsamples = &info->samples; avconfig.audio[0] = info->lsound + soundoffs; @@ -321,11 +321,11 @@ static int write_chd(chd_file *file, UINT32 field, movie_info *info) { - av_codec_compress_config avconfig = { 0 }; + av_codec_compress_config avconfig; chd_error chderr; /* configure the codec */ - avconfig.video = info->bitmap; + avconfig.video.wrap(*info->bitmap, info->bitmap->cliprect()); avconfig.channels = 2; avconfig.samples = info->samples; avconfig.audio[0] = info->lsound; diff -Nru mame-0.144/src/tools/ldverify.c mame-0.145/src/tools/ldverify.c --- mame-0.144/src/tools/ldverify.c 2011-08-04 02:16:29.000000000 +0000 +++ mame-0.145/src/tools/ldverify.c 2012-02-06 21:30:44.000000000 +0000 @@ -40,6 +40,7 @@ #include #include #include +#include #include "aviio.h" #include "bitmap.h" #include "chd.h" @@ -158,7 +159,7 @@ read_avi - read a frame from an AVI file -------------------------------------------------*/ -static int read_avi(void *file, int frame, bitmap_t *bitmap, INT16 *lsound, INT16 *rsound, int *samples) +static int read_avi(void *file, int frame, bitmap_yuy16 &bitmap, INT16 *lsound, INT16 *rsound, int *samples) { const avi_movie_info *aviinfo = avi_get_movie_info((avi_file *)file); UINT32 firstsample = ((UINT64)aviinfo->audio_samplerate * (UINT64)frame * (UINT64)aviinfo->video_sampletime + aviinfo->video_timescale - 1) / (UINT64)aviinfo->video_timescale; @@ -166,7 +167,7 @@ avi_error avierr; /* read the frame */ - avierr = avi_read_video_frame_yuy16((avi_file *)file, frame, bitmap); + avierr = avi_read_video_frame((avi_file *)file, frame, bitmap); if (avierr != AVIERR_NONE) return FALSE; @@ -257,11 +258,11 @@ read_chd - read a frame from a CHD file -------------------------------------------------*/ -static int read_chd(void *file, int frame, bitmap_t *bitmap, INT16 *lsound, INT16 *rsound, int *samples) +static int read_chd(void *file, int frame, bitmap_yuy16 &bitmap, INT16 *lsound, INT16 *rsound, int *samples) { - av_codec_decompress_config avconfig = { 0 }; + av_codec_decompress_config avconfig; int interlace_factor = chdinterlaced ? 2 : 1; - bitmap_t fakebitmap; + bitmap_yuy16 fakebitmap; UINT32 numsamples; chd_error chderr; int fieldnum; @@ -271,13 +272,9 @@ for (fieldnum = 0; fieldnum < interlace_factor; fieldnum++) { /* make a fake bitmap for this field */ - bitmap_clone_existing(&fakebitmap, bitmap); - fakebitmap.base = BITMAP_ADDR16(&fakebitmap, fieldnum, 0); - fakebitmap.rowpixels *= interlace_factor; - fakebitmap.height /= interlace_factor; + avconfig.video.wrap(&bitmap.pix16(fieldnum), bitmap.width(), bitmap.height() / interlace_factor, bitmap.rowpixels() * interlace_factor); /* configure the codec */ - avconfig.video = &fakebitmap; avconfig.maxsamples = 48000; avconfig.actsamples = &numsamples; avconfig.audio[0] = &lsound[*samples]; @@ -345,7 +342,7 @@ verify_video - verify video frame -------------------------------------------------*/ -static void verify_video(video_info *video, int frame, bitmap_t *bitmap) +static void verify_video(video_info *video, int frame, bitmap_yuy16 &bitmap) { const int fields_per_frame = 2; int fieldnum; @@ -366,7 +363,7 @@ fprintf(stderr, "%6d.%d...\r", frame, fieldnum); /* parse the VBI data */ - vbi_parse_all(BITMAP_ADDR16(bitmap, fieldnum, 0), bitmap->rowpixels * 2, bitmap->width, 8, &metadata); + vbi_parse_all(&bitmap.pix16(fieldnum), bitmap.rowpixels() * 2, bitmap.width(), 8, &metadata); /* if we have data in both 17 and 18, it should match */ if (metadata.line17 != 0 && metadata.line18 != 0 && metadata.line17 != metadata.line18) @@ -522,15 +519,15 @@ /* now examine the active video signal */ pixels = 0; - for (y = 22*2 + fieldnum; y < bitmap->height; y += 2) + for (y = 22*2 + fieldnum; y < bitmap.height(); y += 2) { for (x = 16; x < 720 - 16; x++) { - yhisto[*BITMAP_ADDR16(bitmap, y, x) >> 8]++; + yhisto[bitmap.pix16(y, x) >> 8]++; if (x % 2 == 0) - cbhisto[*BITMAP_ADDR16(bitmap, y, x) & 0xff]++; + cbhisto[bitmap.pix16(y, x) & 0xff]++; else - crhisto[*BITMAP_ADDR16(bitmap, y, x) & 0xff]++; + crhisto[bitmap.pix16(y, x) & 0xff]++; } pixels += 720 - 16 - 16; } @@ -616,9 +613,9 @@ verify_video_final - final verification -------------------------------------------------*/ -static void verify_video_final(video_info *video, int frame, bitmap_t *bitmap) +static void verify_video_final(video_info *video, int frame, bitmap_yuy16 &bitmap) { - int fields_per_frame = (bitmap->height >= 288) ? 2 : 1; + int fields_per_frame = (bitmap.height() >= 288) ? 2 : 1; int field = frame * fields_per_frame; /* did we ever see any white flags? */ @@ -744,108 +741,108 @@ int main(int argc, char *argv[]) { - movie_info info = { 0 }; - INT16 *lsound, *rsound; - const char *srcfile; - bitmap_t *bitmap; - int srcfilelen; - int samples = 0; - void *file; - int isavi; - int frame; - audio_info audio; - video_info video; - - /* init globals */ - init_audio(&audio); - init_video(&video); - - /* verify arguments */ - if (argc < 2) - return usage(); - srcfile = argv[1]; - - /* check extension of file */ - srcfilelen = strlen(srcfile); - if (srcfilelen < 4) - return usage(); - if (tolower((UINT8)srcfile[srcfilelen-3]) == 'a' && tolower((UINT8)srcfile[srcfilelen-2]) == 'v' && tolower((UINT8)srcfile[srcfilelen-1]) == 'i') - isavi = TRUE; - else if (tolower((UINT8)srcfile[srcfilelen-3]) == 'c' && tolower((UINT8)srcfile[srcfilelen-2]) == 'h' && tolower((UINT8)srcfile[srcfilelen-1]) == 'd') - isavi = FALSE; - else - return usage(); - - /* open the file */ - printf("Processing file: %s\n", srcfile); - file = isavi ? open_avi(srcfile, &info) : open_chd(srcfile, &info); - if (file == NULL) + try { - fprintf(stderr, "Unable to open file '%s'\n", srcfile); - return 1; - } + movie_info info = { 0 }; + INT16 *lsound, *rsound; + const char *srcfile; + bitmap_yuy16 bitmap; + int srcfilelen; + int samples = 0; + void *file; + int isavi; + int frame; + audio_info audio; + video_info video; + + /* init globals */ + init_audio(&audio); + init_video(&video); + + /* verify arguments */ + if (argc < 2) + return usage(); + srcfile = argv[1]; + + /* check extension of file */ + srcfilelen = strlen(srcfile); + if (srcfilelen < 4) + return usage(); + if (tolower((UINT8)srcfile[srcfilelen-3]) == 'a' && tolower((UINT8)srcfile[srcfilelen-2]) == 'v' && tolower((UINT8)srcfile[srcfilelen-1]) == 'i') + isavi = TRUE; + else if (tolower((UINT8)srcfile[srcfilelen-3]) == 'c' && tolower((UINT8)srcfile[srcfilelen-2]) == 'h' && tolower((UINT8)srcfile[srcfilelen-1]) == 'd') + isavi = FALSE; + else + return usage(); + + /* open the file */ + printf("Processing file: %s\n", srcfile); + file = isavi ? open_avi(srcfile, &info) : open_chd(srcfile, &info); + if (file == NULL) + { + fprintf(stderr, "Unable to open file '%s'\n", srcfile); + return 1; + } + + /* comment on the video dimensions */ + printf("Video dimensions: %dx%d\n", info.width, info.height); + if (info.width != 720) + printf("WARNING: Unexpected video width (should be 720)\n"); + if (info.height != 524) + printf("WARNING: Unexpected video height (should be 262 or 524)\n"); + + /* comment on the video frame rate */ + printf("Video frame rate: %.2fHz\n", info.framerate); + if ((int)(info.framerate * 100.0 + 0.5) != 2997) + printf("WARNING: Unexpected frame rate (should be 29.97Hz)\n"); + + /* comment on the sample rate */ + printf("Sample rate: %dHz\n", info.samplerate); + if (info.samplerate != 48000) + printf("WARNING: Unexpected sampele rate (should be 48000Hz)\n"); + + /* allocate a bitmap */ + bitmap.allocate(info.width, info.height); + + /* allocate sound buffers */ + lsound = (INT16 *)malloc(info.samplerate * sizeof(*lsound)); + rsound = (INT16 *)malloc(info.samplerate * sizeof(*rsound)); + if (lsound == NULL || rsound == NULL) + { + isavi ? close_avi(file) : close_chd(file); + if (rsound != NULL) + free(rsound); + if (lsound != NULL) + free(lsound); + fprintf(stderr, "Out of memory allocating sound buffers of %d bytes\n", (INT32)(info.samplerate * sizeof(*rsound))); + return 1; + } + + /* loop over frames */ + frame = 0; + while (isavi ? read_avi(file, frame, bitmap, lsound, rsound, &samples) : read_chd(file, frame, bitmap, lsound, rsound, &samples)) + { + verify_video(&video, frame, bitmap); + verify_audio(&audio, lsound, rsound, samples); + frame++; + } - /* comment on the video dimensions */ - printf("Video dimensions: %dx%d\n", info.width, info.height); - if (info.width != 720) - printf("WARNING: Unexpected video width (should be 720)\n"); - if (info.height != 524) - printf("WARNING: Unexpected video height (should be 262 or 524)\n"); - - /* comment on the video frame rate */ - printf("Video frame rate: %.2fHz\n", info.framerate); - if ((int)(info.framerate * 100.0 + 0.5) != 2997) - printf("WARNING: Unexpected frame rate (should be 29.97Hz)\n"); - - /* comment on the sample rate */ - printf("Sample rate: %dHz\n", info.samplerate); - if (info.samplerate != 48000) - printf("WARNING: Unexpected sampele rate (should be 48000Hz)\n"); - - /* allocate a bitmap */ - bitmap = bitmap_alloc(info.width, info.height, BITMAP_FORMAT_YUY16); - if (bitmap == NULL) - { + /* close the files */ isavi ? close_avi(file) : close_chd(file); - fprintf(stderr, "Out of memory creating %dx%d bitmap\n", info.width, info.height); - return 1; - } - /* allocate sound buffers */ - lsound = (INT16 *)malloc(info.samplerate * sizeof(*lsound)); - rsound = (INT16 *)malloc(info.samplerate * sizeof(*rsound)); - if (lsound == NULL || rsound == NULL) - { - isavi ? close_avi(file) : close_chd(file); - bitmap_free(bitmap); - if (rsound != NULL) - free(rsound); - if (lsound != NULL) - free(lsound); - fprintf(stderr, "Out of memory allocating sound buffers of %d bytes\n", (INT32)(info.samplerate * sizeof(*rsound))); - return 1; - } + /* final output */ + verify_video_final(&video, frame, bitmap); + verify_audio_final(&audio); - /* loop over frames */ - frame = 0; - while (isavi ? read_avi(file, frame, bitmap, lsound, rsound, &samples) : read_chd(file, frame, bitmap, lsound, rsound, &samples)) + /* free memory */ + free(lsound); + free(rsound); + } + catch (std::bad_alloc &) { - verify_video(&video, frame, bitmap); - verify_audio(&audio, lsound, rsound, samples); - frame++; + fprintf(stderr, "Out of memory allocating memory\n"); + return 1; } - /* close the files */ - isavi ? close_avi(file) : close_chd(file); - - /* final output */ - verify_video_final(&video, frame, bitmap); - verify_audio_final(&audio); - - /* free memory */ - bitmap_free(bitmap); - free(lsound); - free(rsound); - return 0; } diff -Nru mame-0.144/src/tools/regrep.c mame-0.145/src/tools/regrep.c --- mame-0.144/src/tools/regrep.c 2012-01-13 15:35:05.000000000 +0000 +++ mame-0.145/src/tools/regrep.c 2012-02-06 21:30:44.000000000 +0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include "osdcore.h" #include "png.h" @@ -179,15 +180,15 @@ static summary_file *sort_file_list(void); /* HTML helpers */ -static core_file *create_file_and_output_header(const astring *filename, const astring *templatefile, const astring *title); -static void output_footer_and_close_file(core_file *file, const astring *templatefile, const astring *title); +static core_file *create_file_and_output_header(astring &filename, astring &templatefile, astring &title); +static void output_footer_and_close_file(core_file *file, astring &templatefile, astring &title); /* report generators */ -static void output_report(const astring *dirname, const astring *tempheader, const astring *tempfooter, summary_file *filelist); +static void output_report(astring &dirname, astring &tempheader, astring &tempfooter, summary_file *filelist); static int compare_screenshots(summary_file *curfile); -static int generate_png_diff(const summary_file *curfile, const astring *destdir, const char *destname); -static void create_linked_file(const astring *dirname, const summary_file *curfile, const summary_file *prevfile, const summary_file *nextfile, const char *pngfile, const astring *tempheader, const astring *tempfooter); -static void append_driver_list_table(const char *header, const astring *dirname, core_file *indexfile, const summary_file *listhead, const astring *tempheader, const astring *tempfooter); +static int generate_png_diff(const summary_file *curfile, astring &destdir, const char *destname); +static void create_linked_file(astring &dirname, const summary_file *curfile, const summary_file *prevfile, const summary_file *nextfile, const char *pngfile, astring &tempheader, astring &tempfooter); +static void append_driver_list_table(const char *header, astring &dirname, core_file *indexfile, const summary_file *listhead, astring &tempheader, astring &tempfooter); @@ -249,7 +250,6 @@ int main(int argc, char *argv[]) { - astring *dirname = NULL, *tempfilename = NULL, *tempheader = NULL, *tempfooter = NULL; UINT32 bufsize; void *buffer; int listnum; @@ -261,31 +261,33 @@ fprintf(stderr, "Usage:\nregrep